diff options
author | Ian Wisbon <ian.wisbon@timesys.com> | 2011-02-14 16:41:03 -0500 |
---|---|---|
committer | Ian Wisbon <ian.wisbon@timesys.com> | 2011-02-14 16:44:16 -0500 |
commit | f3e8554f6e7441c1159994f93cf7bad631a122c1 (patch) | |
tree | 80f5d89cca49330e137688c72fb10c9f42dc5663 | |
parent | 14a4057959f8ee0a2249eb2abd64fd6b1f571d98 (diff) |
Digi Release Code from del-5.6/main
963 files changed, 62057 insertions, 14361 deletions
diff --git a/Documentation/connector/cn_test.c b/Documentation/connector/cn_test.c index 6a5be5d5c8e4..473c589c4509 100644 --- a/Documentation/connector/cn_test.c +++ b/Documentation/connector/cn_test.c @@ -32,10 +32,8 @@ static char cn_test_name[] = "cn_test"; static struct sock *nls; static struct timer_list cn_test_timer; -void cn_test_callback(void *data) +static void cn_test_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp) { - struct cn_msg *msg = (struct cn_msg *)data; - printk("%s: %lu: idx=%x, val=%x, seq=%u, ack=%u, len=%d: %s.\n", __func__, jiffies, msg->id.idx, msg->id.val, msg->seq, msg->ack, msg->len, (char *)msg->data); diff --git a/Documentation/connector/connector.txt b/Documentation/connector/connector.txt index ad6e0ba7b38c..3e6dcc7a0980 100644 --- a/Documentation/connector/connector.txt +++ b/Documentation/connector/connector.txt @@ -23,7 +23,7 @@ handling... Connector allows any kernelspace agents to use netlink based networking for inter-process communication in a significantly easier way: -int cn_add_callback(struct cb_id *id, char *name, void (*callback) (void *)); +int cn_add_callback(struct cb_id *id, char *name, void (*callback) (struct cn_msg *, struct netlink_skb_parms *)); void cn_netlink_send(struct cn_msg *msg, u32 __group, int gfp_mask); struct cb_id @@ -53,15 +53,15 @@ struct cn_msg Connector interfaces. /*****************************************/ -int cn_add_callback(struct cb_id *id, char *name, void (*callback) (void *)); +int cn_add_callback(struct cb_id *id, char *name, void (*callback) (struct cn_msg *, struct netlink_skb_parms *)); Registers new callback with connector core. struct cb_id *id - unique connector's user identifier. It must be registered in connector.h for legal in-kernel users. char *name - connector's callback symbolic name. -void (*callback) (void *) - connector's callback. - Argument must be dereferenced to struct cn_msg *. +void (*callback) (struct cn..) - connector's callback. + cn_msg and the sender's credentials void cn_del_callback(struct cb_id *id); diff --git a/Documentation/dontdiff b/Documentation/dontdiff index 88519daab6e9..e1efc400bed6 100644 --- a/Documentation/dontdiff +++ b/Documentation/dontdiff @@ -152,7 +152,6 @@ piggy.gz piggyback pnmtologo ppc_defs.h* -promcon_tbl.c pss_boot.h qconf raid6altivec*.c diff --git a/Documentation/filesystems/ext4.txt b/Documentation/filesystems/ext4.txt index 7be02ac5fa36..32c3da454afa 100644 --- a/Documentation/filesystems/ext4.txt +++ b/Documentation/filesystems/ext4.txt @@ -153,8 +153,8 @@ journal_dev=devnum When the external journal device's major/minor numbers identified through its new major/minor numbers encoded in devnum. -noload Don't load the journal on mounting. Note that - if the filesystem was not unmounted cleanly, +norecovery Don't load the journal on mounting. Note that +noload if the filesystem was not unmounted cleanly, skipping the journal replay will lead to the filesystem containing inconsistencies that can lead to any number of problems. @@ -338,6 +338,12 @@ noauto_da_alloc replacing existing files via patterns such as system crashes before the delayed allocation blocks are forced to disk. +discard Controls whether ext4 should issue discard/TRIM +nodiscard(*) commands to the underlying block device when + blocks are freed. This is useful for SSD devices + and sparse/thinly-provisioned LUNs, but it is off + by default until sufficient testing has been done. + Data Mode ========= There are 3 different data modes: diff --git a/Documentation/filesystems/tmpfs.txt b/Documentation/filesystems/tmpfs.txt index 3015da0c6b2a..fe09a2cb1858 100644 --- a/Documentation/filesystems/tmpfs.txt +++ b/Documentation/filesystems/tmpfs.txt @@ -82,11 +82,13 @@ tmpfs has a mount option to set the NUMA memory allocation policy for all files in that instance (if CONFIG_NUMA is enabled) - which can be adjusted on the fly via 'mount -o remount ...' -mpol=default prefers to allocate memory from the local node +mpol=default use the process allocation policy + (see set_mempolicy(2)) mpol=prefer:Node prefers to allocate memory from the given Node mpol=bind:NodeList allocates memory only from nodes in NodeList mpol=interleave prefers to allocate from each node in turn mpol=interleave:NodeList allocates from each node of NodeList in turn +mpol=local prefers to allocate memory from the local node NodeList format is a comma-separated list of decimal numbers and ranges, a range being two hyphen-separated decimal numbers, the smallest and @@ -134,3 +136,5 @@ Author: Christoph Rohland <cr@sap.com>, 1.12.01 Updated: Hugh Dickins, 4 June 2007 +Updated: + KOSAKI Motohiro, 16 Mar 2010 diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 7936b801fe6a..3d5a9581ab5c 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt @@ -2561,6 +2561,8 @@ and is between 256 and 4096 characters. It is defined in the file to a common usb-storage quirk flag as follows: a = SANE_SENSE (collect more than 18 bytes of sense data); + b = BAD_SENSE (don't collect more than 18 + bytes of sense data); c = FIX_CAPACITY (decrease the reported device capacity by one sector); h = CAPACITY_HEURISTICS (decrease the diff --git a/Documentation/networking/timestamping/timestamping.c b/Documentation/networking/timestamping/timestamping.c index 43d143104210..a7936fe8444a 100644 --- a/Documentation/networking/timestamping/timestamping.c +++ b/Documentation/networking/timestamping/timestamping.c @@ -381,7 +381,7 @@ int main(int argc, char **argv) memset(&hwtstamp, 0, sizeof(hwtstamp)); strncpy(hwtstamp.ifr_name, interface, sizeof(hwtstamp.ifr_name)); hwtstamp.ifr_data = (void *)&hwconfig; - memset(&hwconfig, 0, sizeof(&hwconfig)); + memset(&hwconfig, 0, sizeof(hwconfig)); hwconfig.tx_type = (so_timestamping_flags & SOF_TIMESTAMPING_TX_HARDWARE) ? HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF; diff --git a/Documentation/video4linux/gspca.txt b/Documentation/video4linux/gspca.txt index 573f95b58807..03d58d223ae1 100644 --- a/Documentation/video4linux/gspca.txt +++ b/Documentation/video4linux/gspca.txt @@ -37,6 +37,7 @@ ov519 041e:405f Creative Live! VISTA VF0330 ov519 041e:4060 Creative Live! VISTA VF0350 ov519 041e:4061 Creative Live! VISTA VF0400 ov519 041e:4064 Creative Live! VISTA VF0420 +ov519 041e:4067 Creative Live! Cam Video IM (VF0350) ov519 041e:4068 Creative Live! VISTA VF0470 spca561 0458:7004 Genius VideoCAM Express V2 sunplus 0458:7006 Genius Dsc 1.3 Smart @@ -284,6 +285,7 @@ sonixj 0c45:613a Microdia Sonix PC Camera sonixj 0c45:613b Surfer SN-206 sonixj 0c45:613c Sonix Pccam168 sonixj 0c45:6143 Sonix Pccam168 +sonixj 0c45:6148 Digitus DA-70811/ZSMC USB PC Camera ZS211/Microdia sn9c20x 0c45:6240 PC Camera (SN9C201 + MT9M001) sn9c20x 0c45:6242 PC Camera (SN9C201 + MT9M111) sn9c20x 0c45:6248 PC Camera (SN9C201 + OV9655) diff --git a/MAINTAINERS b/MAINTAINERS index 8dca9d89c6c1..94138c41e1c2 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -897,6 +897,12 @@ W: http://wireless.kernel.org/en/users/Drivers/ar9170 S: Maintained F: drivers/net/wireless/ath/ar9170/ +ATK0110 HWMON DRIVER +M: Luca Tettamanti <kronos.it@gmail.com> +L: lm-sensors@lm-sensors.org +S: Maintained +F: drivers/hwmon/asus_atk0110.c + ATI_REMOTE2 DRIVER M: Ville Syrjala <syrjala@sci.fi> S: Maintained @@ -1986,7 +1992,7 @@ S: Maintained F: fs/* FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER -M: Riku Voipio <riku.vipio@iki.fi> +M: Riku Voipio <riku.voipio@iki.fi> L: lm-sensors@lm-sensors.org S: Maintained F: drivers/hwmon/f75375s.c @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 31 -EXTRAVERSION = +EXTRAVERSION = .14 NAME = Man-Eating Seals of Antiquity # *DOCUMENTATION* @@ -975,11 +975,6 @@ prepare0: archprepare FORCE # All the preparing.. prepare: prepare0 -# Leave this as default for preprocessing vmlinux.lds.S, which is now -# done in arch/$(ARCH)/kernel/Makefile - -export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH) - # The asm symlink changes when $(ARCH) changes. # Detect this and ask user to run make mrproper # If asm is a stale symlink (point to dir that does not exist) remove it diff --git a/arch/alpha/kernel/core_marvel.c b/arch/alpha/kernel/core_marvel.c index e302daecbe56..8e059e58b0ac 100644 --- a/arch/alpha/kernel/core_marvel.c +++ b/arch/alpha/kernel/core_marvel.c @@ -1016,7 +1016,7 @@ marvel_agp_bind_memory(alpha_agp_info *agp, off_t pg_start, struct agp_memory *m { struct marvel_agp_aperture *aper = agp->aperture.sysdata; return iommu_bind(aper->arena, aper->pg_start + pg_start, - mem->page_count, mem->memory); + mem->page_count, mem->pages); } static int diff --git a/arch/alpha/kernel/core_titan.c b/arch/alpha/kernel/core_titan.c index 319fcb74611e..76686497b1e2 100644 --- a/arch/alpha/kernel/core_titan.c +++ b/arch/alpha/kernel/core_titan.c @@ -680,7 +680,7 @@ titan_agp_bind_memory(alpha_agp_info *agp, off_t pg_start, struct agp_memory *me { struct titan_agp_aperture *aper = agp->aperture.sysdata; return iommu_bind(aper->arena, aper->pg_start + pg_start, - mem->page_count, mem->memory); + mem->page_count, mem->pages); } static int diff --git a/arch/alpha/kernel/pci_impl.h b/arch/alpha/kernel/pci_impl.h index 00edd04b585e..85457b2d4516 100644 --- a/arch/alpha/kernel/pci_impl.h +++ b/arch/alpha/kernel/pci_impl.h @@ -198,7 +198,7 @@ extern unsigned long size_for_memory(unsigned long max); extern int iommu_reserve(struct pci_iommu_arena *, long, long); extern int iommu_release(struct pci_iommu_arena *, long, long); -extern int iommu_bind(struct pci_iommu_arena *, long, long, unsigned long *); +extern int iommu_bind(struct pci_iommu_arena *, long, long, struct page **); extern int iommu_unbind(struct pci_iommu_arena *, long, long); diff --git a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c index bfb880af959d..eadd63bec4c0 100644 --- a/arch/alpha/kernel/pci_iommu.c +++ b/arch/alpha/kernel/pci_iommu.c @@ -880,7 +880,7 @@ iommu_release(struct pci_iommu_arena *arena, long pg_start, long pg_count) int iommu_bind(struct pci_iommu_arena *arena, long pg_start, long pg_count, - unsigned long *physaddrs) + struct page **pages) { unsigned long flags; unsigned long *ptes; @@ -900,7 +900,7 @@ iommu_bind(struct pci_iommu_arena *arena, long pg_start, long pg_count, } for(i = 0, j = pg_start; i < pg_count; i++, j++) - ptes[j] = mk_iommu_pte(physaddrs[i]); + ptes[j] = mk_iommu_pte(page_to_phys(pages[i])); spin_unlock_irqrestore(&arena->lock, flags); diff --git a/arch/alpha/kernel/vmlinux.lds.S b/arch/alpha/kernel/vmlinux.lds.S index b9d6568e5f7f..1e0c7121c57d 100644 --- a/arch/alpha/kernel/vmlinux.lds.S +++ b/arch/alpha/kernel/vmlinux.lds.S @@ -1,4 +1,5 @@ #include <asm-generic/vmlinux.lds.h> +#include <asm/thread_info.h> #include <asm/page.h> OUTPUT_FORMAT("elf64-alpha") diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 7f161d76e5d2..3f1b470beacf 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -1502,8 +1502,6 @@ source "drivers/accessibility/Kconfig" source "drivers/leds/Kconfig" -source "drivers/switch/Kconfig" - source "drivers/rtc/Kconfig" source "drivers/dma/Kconfig" diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 3ca5dd71b3ae..3fe66f3935ed 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -14,7 +14,7 @@ LDFLAGS_vmlinux :=-p --no-undefined -X ifeq ($(CONFIG_CPU_ENDIAN_BE8),y) LDFLAGS_vmlinux += --be8 endif -CPPFLAGS_vmlinux.lds = -DTEXT_OFFSET=$(TEXT_OFFSET) + OBJCOPYFLAGS :=-O binary -R .note -R .note.gnu.build-id -R .comment -S GZFLAGS :=-9 #KBUILD_CFLAGS +=-pipe diff --git a/arch/arm/configs/imx23evk_updater_defconfig b/arch/arm/configs/imx23evk_updater_defconfig index f6a430b5bf5f..739e7bd912ec 100644 --- a/arch/arm/configs/imx23evk_updater_defconfig +++ b/arch/arm/configs/imx23evk_updater_defconfig @@ -558,7 +558,6 @@ CONFIG_HW_RANDOM=y # CONFIG_I2C is not set # CONFIG_I2C_SLAVE is not set # CONFIG_SPI is not set -CONFIG_FSL_OTP=y CONFIG_ARCH_REQUIRE_GPIOLIB=y CONFIG_GPIOLIB=y # CONFIG_GPIO_SYSFS is not set diff --git a/arch/arm/configs/imx28evk_defconfig b/arch/arm/configs/imx28evk_defconfig index 9d3b1c98d198..40c35b60a811 100644 --- a/arch/arm/configs/imx28evk_defconfig +++ b/arch/arm/configs/imx28evk_defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux kernel version: 2.6.31 -# Tue Aug 3 11:34:57 2010 +# Tue Jun 8 11:22:27 2010 # CONFIG_ARM=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y @@ -851,7 +851,6 @@ CONFIG_MXS_VIIM=y # CONFIG_SERIAL_MXS_DUART=y CONFIG_SERIAL_MXS_AUART=y -# CONFIG_SERIAL_MXS_AUART_CONSOLE is not set CONFIG_SERIAL_MXS_DUART_CONSOLE=y CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y @@ -1256,18 +1255,16 @@ CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_EHCI=y CONFIG_USB=y # CONFIG_USB_DEBUG is not set -# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # # CONFIG_USB_DEVICEFS is not set # CONFIG_USB_DEVICE_CLASS is not set -# CONFIG_USB_DYNAMIC_MINORS is not set -CONFIG_USB_SUSPEND=y -CONFIG_USB_OTG=y -# CONFIG_USB_OTG_WHITELIST is not set -# CONFIG_USB_OTG_BLACKLIST_HUB is not set +CONFIG_USB_DYNAMIC_MINORS=y +# CONFIG_USB_SUSPEND is not set +# CONFIG_USB_OTG is not set # CONFIG_USB_MON is not set # CONFIG_USB_WUSB is not set # CONFIG_USB_WUSB_CBAF is not set @@ -1276,15 +1273,11 @@ CONFIG_USB_OTG=y # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set -CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_HCD=m CONFIG_USB_EHCI_ARC=y CONFIG_USB_EHCI_ARC_H1=y -CONFIG_USB_EHCI_ARC_OTG=y +# CONFIG_USB_EHCI_ARC_OTG is not set # CONFIG_USB_STATIC_IRAM is not set -# CONFIG_USB_EHCI_FSL_MC13783 is not set -# CONFIG_USB_EHCI_FSL_1301 is not set -# CONFIG_USB_EHCI_FSL_1504 is not set -CONFIG_USB_EHCI_FSL_UTMI=y CONFIG_USB_EHCI_ROOT_HUB_TT=y # CONFIG_USB_EHCI_TT_NEWSCHED is not set # CONFIG_USB_OXU210HP_HCD is not set @@ -1361,7 +1354,7 @@ CONFIG_USB_STORAGE=y # CONFIG_USB_TEST is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_VST is not set -CONFIG_USB_GADGET=y +CONFIG_USB_GADGET=m # CONFIG_USB_GADGET_DEBUG_FILES is not set # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=2 @@ -1383,7 +1376,7 @@ CONFIG_USB_GADGET_SELECTED=y # CONFIG_USB_GADGET_NET2280 is not set # CONFIG_USB_GADGET_GOKU is not set CONFIG_USB_GADGET_ARC=y -CONFIG_USB_ARC=y +CONFIG_USB_ARC=m CONFIG_WORKAROUND_ARCUSB_REG_RW=y # CONFIG_USB_GADGET_LANGWELL is not set # CONFIG_USB_GADGET_DUMMY_HCD is not set @@ -1407,7 +1400,7 @@ CONFIG_USB_G_SERIAL=m CONFIG_USB_OTG_UTILS=y # CONFIG_USB_GPIO_VBUS is not set # CONFIG_NOP_USB_XCEIV is not set -CONFIG_MXC_OTG=y +# CONFIG_MXC_OTG is not set CONFIG_MMC=y # CONFIG_MMC_DEBUG is not set CONFIG_MMC_UNSAFE_RESUME=y @@ -1506,7 +1499,6 @@ CONFIG_DMADEVICES=y # # DMA Devices # -# CONFIG_MXC_PXP is not set # CONFIG_AUXDISPLAY is not set CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set @@ -1517,7 +1509,6 @@ CONFIG_REGULATOR=y # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_LP3971 is not set CONFIG_REGULATOR_MXS=y -# CONFIG_REGULATOR_MAX17135 is not set # CONFIG_UIO is not set # CONFIG_STAGING is not set diff --git a/arch/arm/configs/imx28evk_updater_defconfig b/arch/arm/configs/imx28evk_updater_defconfig index fe9a908e7e62..21223ed3f678 100644 --- a/arch/arm/configs/imx28evk_updater_defconfig +++ b/arch/arm/configs/imx28evk_updater_defconfig @@ -531,7 +531,6 @@ CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_I2C is not set # CONFIG_I2C_SLAVE is not set # CONFIG_SPI is not set -CONFIG_FSL_OTP=y CONFIG_ARCH_REQUIRE_GPIOLIB=y CONFIG_GPIOLIB=y # CONFIG_GPIO_SYSFS is not set diff --git a/arch/arm/configs/imx5_defconfig b/arch/arm/configs/imx5_defconfig index 47cf51acaa53..8336690d1bf4 100644 --- a/arch/arm/configs/imx5_defconfig +++ b/arch/arm/configs/imx5_defconfig @@ -204,8 +204,6 @@ CONFIG_MACH_MX51_3DS=y CONFIG_MACH_MX51_BABBAGE=y CONFIG_MACH_MX53_EVK=y CONFIG_MACH_MX50_ARM2=y -CONFIG_MACH_MX50_RDP=y -CONFIG_ARCH_MXC_IOMUX_V3=y # # MX5x Options: @@ -489,7 +487,7 @@ CONFIG_CONNECTOR=y CONFIG_PROC_EVENTS=y CONFIG_MTD=y # CONFIG_MTD_DEBUG is not set -CONFIG_MTD_CONCAT=y +# CONFIG_MTD_CONCAT is not set CONFIG_MTD_PARTITIONS=y # CONFIG_MTD_TESTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set @@ -827,7 +825,6 @@ CONFIG_DEVKMEM=y # CONFIG_SERIAL_NONSTANDARD is not set CONFIG_FM_SI4702=m CONFIG_MXC_IIM=y -CONFIG_MXS_VIIM=y CONFIG_IMX_SIM=m # @@ -1310,7 +1307,6 @@ CONFIG_FB_MXC_EPSON_VGA_SYNC_PANEL=y CONFIG_FB_MXC_TVOUT_TVE=y CONFIG_FB_MXC_LDB=y # CONFIG_FB_MXC_CLAA_WVGA_SYNC_PANEL is not set -CONFIG_FB_MXC_SII9022=y CONFIG_FB_MXC_CH7026=y # CONFIG_FB_MXC_TVOUT_CH7024 is not set # CONFIG_FB_MXC_ASYNC_PANEL is not set @@ -2065,8 +2061,8 @@ CONFIG_CRYPTO=y # CONFIG_CRYPTO_NULL is not set # CONFIG_CRYPTO_CRYPTD is not set # CONFIG_CRYPTO_AUTHENC is not set -CONFIG_CRYPTO_TEST=m -CONFIG_CRYPTO_CRYPTODEV=y +# CONFIG_CRYPTO_TEST is not set +# CONFIG_CRYPTO_CRYPTODEV is not set # # Authenticated Encryption with Associated Data @@ -2078,10 +2074,10 @@ CONFIG_CRYPTO_CRYPTODEV=y # # Block modes # -CONFIG_CRYPTO_CBC=y +# CONFIG_CRYPTO_CBC is not set # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set -CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_ECB is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set @@ -2112,7 +2108,7 @@ CONFIG_CRYPTO_ECB=y # # Ciphers # -CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_BLOWFISH is not set diff --git a/arch/arm/configs/imx5_updater_defconfig b/arch/arm/configs/imx5_updater_defconfig index f594185b5e0a..801eca586a13 100644 --- a/arch/arm/configs/imx5_updater_defconfig +++ b/arch/arm/configs/imx5_updater_defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux kernel version: 2.6.31 -# Tue Jul 27 15:14:58 2010 +# Wed Jun 23 17:31:28 2010 # CONFIG_ARM=y CONFIG_HAVE_PWM=y @@ -192,13 +192,11 @@ CONFIG_FORCE_MAX_ZONEORDER=13 CONFIG_ARCH_MXC_HAS_NFC_V3=y CONFIG_ARCH_MX51=y CONFIG_ARCH_MX53=y -CONFIG_ARCH_MX50=y CONFIG_MX5_OPTIONS=y CONFIG_MX5_MULTI_ARCH=y CONFIG_MACH_MX51_3DS=y CONFIG_MACH_MX51_BABBAGE=y CONFIG_MACH_MX53_EVK=y -CONFIG_MACH_MX50_ARM2=y # # MX5x Options: @@ -208,8 +206,7 @@ CONFIG_MXC_TZIC=y CONFIG_ISP1504_MXC=y # CONFIG_MXC_IRQ_PRIOR is not set CONFIG_MXC_PWM=y -CONFIG_ARCH_MXC_IOMUX_V3=y -CONFIG_MXC_DVFS_PER=y +# CONFIG_MXC_DVFS_PER is not set # # Processor Type @@ -303,16 +300,16 @@ CONFIG_CPU_FREQ_TABLE=y # CONFIG_CPU_FREQ_DEBUG is not set CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_STAT_DETAILS is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set -CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y -CONFIG_CPU_FREQ_GOV_POWERSAVE=y -CONFIG_CPU_FREQ_GOV_USERSPACE=y +# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_GOV_USERSPACE is not set # CONFIG_CPU_FREQ_GOV_ONDEMAND is not set -CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set CONFIG_CPU_FREQ_IMX=y # CONFIG_CPU_IDLE is not set @@ -525,7 +522,14 @@ CONFIG_SCSI_LOWLEVEL=y # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_DH is not set # CONFIG_SCSI_OSD_INITIATOR is not set -# CONFIG_ATA is not set +CONFIG_ATA=y +# CONFIG_ATA_NONSTANDARD is not set +# CONFIG_SATA_PMP is not set +# CONFIG_SATA_AHCI_PLATFORM is not set +CONFIG_ATA_SFF=y +# CONFIG_SATA_MV is not set +# CONFIG_PATA_PLATFORM is not set +CONFIG_PATA_FSL=y # CONFIG_MD is not set # @@ -636,7 +640,6 @@ CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y -CONFIG_FSL_OTP=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_R3964 is not set # CONFIG_RAW_DRIVER is not set @@ -830,7 +833,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y # # Watchdog Device Drivers # -CONFIG_SOFT_WATCHDOG=y +# CONFIG_SOFT_WATCHDOG is not set CONFIG_MXC_WATCHDOG=y # @@ -867,12 +870,196 @@ CONFIG_MEDIA_SUPPORT=y # # Multimedia core support # -# CONFIG_VIDEO_DEV is not set -# CONFIG_VIDEO_MEDIA is not set +CONFIG_VIDEO_DEV=y +CONFIG_VIDEO_V4L2_COMMON=y +CONFIG_VIDEO_ALLOW_V4L1=y +CONFIG_VIDEO_V4L1_COMPAT=y +CONFIG_VIDEO_MEDIA=y # # Multimedia drivers # +CONFIG_MEDIA_TUNER=y +CONFIG_MEDIA_TUNER_CUSTOMISE=y +# CONFIG_MEDIA_TUNER_SIMPLE is not set +# CONFIG_MEDIA_TUNER_TDA8290 is not set +# CONFIG_MEDIA_TUNER_TDA827X is not set +# CONFIG_MEDIA_TUNER_TDA18271 is not set +# CONFIG_MEDIA_TUNER_TDA9887 is not set +# CONFIG_MEDIA_TUNER_TEA5761 is not set +# CONFIG_MEDIA_TUNER_TEA5767 is not set +# CONFIG_MEDIA_TUNER_MT20XX is not set +# CONFIG_MEDIA_TUNER_MT2060 is not set +# CONFIG_MEDIA_TUNER_MT2266 is not set +# CONFIG_MEDIA_TUNER_MT2131 is not set +# CONFIG_MEDIA_TUNER_QT1010 is not set +# CONFIG_MEDIA_TUNER_XC2028 is not set +# CONFIG_MEDIA_TUNER_XC5000 is not set +# CONFIG_MEDIA_TUNER_MXL5005S is not set +# CONFIG_MEDIA_TUNER_MXL5007T is not set +# CONFIG_MEDIA_TUNER_MC44S803 is not set +CONFIG_VIDEO_V4L2=y +CONFIG_VIDEO_V4L1=y +CONFIG_VIDEO_CAPTURE_DRIVERS=y +# CONFIG_VIDEO_ADV_DEBUG is not set +# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set +# CONFIG_VIDEO_HELPER_CHIPS_AUTO is not set + +# +# Encoders/decoders and other helper chips +# + +# +# Audio decoders +# +# CONFIG_VIDEO_TVAUDIO is not set +# CONFIG_VIDEO_TDA7432 is not set +# CONFIG_VIDEO_TDA9840 is not set +# CONFIG_VIDEO_TDA9875 is not set +# CONFIG_VIDEO_TEA6415C is not set +# CONFIG_VIDEO_TEA6420 is not set +# CONFIG_VIDEO_MSP3400 is not set +# CONFIG_VIDEO_CS5345 is not set +# CONFIG_VIDEO_CS53L32A is not set +# CONFIG_VIDEO_M52790 is not set +# CONFIG_VIDEO_TLV320AIC23B is not set +# CONFIG_VIDEO_WM8775 is not set +# CONFIG_VIDEO_WM8739 is not set +# CONFIG_VIDEO_VP27SMPX is not set + +# +# RDS decoders +# +# CONFIG_VIDEO_SAA6588 is not set + +# +# Video decoders +# +# CONFIG_VIDEO_BT819 is not set +# CONFIG_VIDEO_BT856 is not set +# CONFIG_VIDEO_BT866 is not set +# CONFIG_VIDEO_KS0127 is not set +# CONFIG_VIDEO_OV7670 is not set +# CONFIG_VIDEO_MT9V011 is not set +# CONFIG_VIDEO_TCM825X is not set +# CONFIG_VIDEO_SAA7110 is not set +# CONFIG_VIDEO_SAA711X is not set +# CONFIG_VIDEO_SAA717X is not set +# CONFIG_VIDEO_SAA7191 is not set +# CONFIG_VIDEO_TVP514X is not set +# CONFIG_VIDEO_TVP5150 is not set +# CONFIG_VIDEO_VPX3220 is not set + +# +# Video and audio decoders +# +# CONFIG_VIDEO_CX25840 is not set + +# +# MPEG video encoders +# +# CONFIG_VIDEO_CX2341X is not set + +# +# Video encoders +# +# CONFIG_VIDEO_SAA7127 is not set +# CONFIG_VIDEO_SAA7185 is not set +# CONFIG_VIDEO_ADV7170 is not set +# CONFIG_VIDEO_ADV7175 is not set +# CONFIG_VIDEO_THS7303 is not set +# CONFIG_VIDEO_ADV7343 is not set + +# +# Video improvement chips +# +# CONFIG_VIDEO_UPD64031A is not set +# CONFIG_VIDEO_UPD64083 is not set +# CONFIG_VIDEO_VIVI is not set +CONFIG_VIDEO_MXC_CAMERA=y + +# +# MXC Camera/V4L2 PRP Features support +# +CONFIG_VIDEO_MXC_IPU_CAMERA=y +# CONFIG_VIDEO_MXC_CSI_CAMERA is not set +# CONFIG_MXC_CAMERA_MC521DA is not set +# CONFIG_MXC_EMMA_CAMERA_MICRON111 is not set +# CONFIG_MXC_CAMERA_OV2640_EMMA is not set +# CONFIG_MXC_CAMERA_MICRON111 is not set +# CONFIG_MXC_CAMERA_OV2640 is not set +CONFIG_MXC_CAMERA_OV3640=y +# CONFIG_MXC_TVIN_ADV7180 is not set +CONFIG_MXC_IPU_PRP_VF_SDC=y +CONFIG_MXC_IPU_PRP_ENC=y +CONFIG_MXC_IPU_CSI_ENC=y +CONFIG_VIDEO_MXC_OUTPUT=y +CONFIG_VIDEO_MXC_IPU_OUTPUT=y +# CONFIG_VIDEO_MXC_IPUV1_WVGA_OUTPUT is not set +# CONFIG_VIDEO_MXC_OPL is not set +# CONFIG_VIDEO_CPIA is not set +# CONFIG_VIDEO_CPIA2 is not set +# CONFIG_VIDEO_SAA5246A is not set +# CONFIG_VIDEO_SAA5249 is not set +# CONFIG_SOC_CAMERA is not set +CONFIG_V4L_USB_DRIVERS=y +CONFIG_USB_VIDEO_CLASS=y +CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y +CONFIG_USB_GSPCA=y +# CONFIG_USB_M5602 is not set +# CONFIG_USB_STV06XX is not set +# CONFIG_USB_GSPCA_CONEX is not set +# CONFIG_USB_GSPCA_ETOMS is not set +# CONFIG_USB_GSPCA_FINEPIX is not set +# CONFIG_USB_GSPCA_MARS is not set +# CONFIG_USB_GSPCA_MR97310A is not set +# CONFIG_USB_GSPCA_OV519 is not set +# CONFIG_USB_GSPCA_OV534 is not set +# CONFIG_USB_GSPCA_PAC207 is not set +# CONFIG_USB_GSPCA_PAC7311 is not set +# CONFIG_USB_GSPCA_SN9C20X is not set +# CONFIG_USB_GSPCA_SONIXB is not set +# CONFIG_USB_GSPCA_SONIXJ is not set +# CONFIG_USB_GSPCA_SPCA500 is not set +# CONFIG_USB_GSPCA_SPCA501 is not set +# CONFIG_USB_GSPCA_SPCA505 is not set +# CONFIG_USB_GSPCA_SPCA506 is not set +# CONFIG_USB_GSPCA_SPCA508 is not set +# CONFIG_USB_GSPCA_SPCA561 is not set +# CONFIG_USB_GSPCA_SQ905 is not set +# CONFIG_USB_GSPCA_SQ905C is not set +# CONFIG_USB_GSPCA_STK014 is not set +# CONFIG_USB_GSPCA_SUNPLUS is not set +# CONFIG_USB_GSPCA_T613 is not set +# CONFIG_USB_GSPCA_TV8532 is not set +# CONFIG_USB_GSPCA_VC032X is not set +# CONFIG_USB_GSPCA_ZC3XX is not set +# CONFIG_VIDEO_PVRUSB2 is not set +# CONFIG_VIDEO_HDPVR is not set +# CONFIG_VIDEO_EM28XX is not set +# CONFIG_VIDEO_CX231XX is not set +# CONFIG_VIDEO_USBVISION is not set +# CONFIG_USB_VICAM is not set +# CONFIG_USB_IBMCAM is not set +# CONFIG_USB_KONICAWC is not set +# CONFIG_USB_QUICKCAM_MESSENGER is not set +# CONFIG_USB_ET61X251 is not set +# CONFIG_VIDEO_OVCAMCHIP is not set +# CONFIG_USB_OV511 is not set +# CONFIG_USB_SE401 is not set +# CONFIG_USB_SN9C102 is not set +# CONFIG_USB_STV680 is not set +# CONFIG_USB_ZC0301 is not set +# CONFIG_USB_PWC is not set +CONFIG_USB_PWC_INPUT_EVDEV=y +# CONFIG_USB_ZR364XX is not set +# CONFIG_USB_STKWEBCAM is not set +# CONFIG_USB_S2255 is not set +CONFIG_RADIO_ADAPTERS=y +# CONFIG_USB_DSBR is not set +# CONFIG_USB_SI470X is not set +# CONFIG_USB_MR800 is not set +# CONFIG_RADIO_TEA5764 is not set # CONFIG_DAB is not set # @@ -904,15 +1091,13 @@ CONFIG_FB_MODE_HELPERS=y # CONFIG_FB_MXC=y CONFIG_FB_MXC_SYNC_PANEL=y -# CONFIG_FB_MXC_EPSON_VGA_SYNC_PANEL is not set -# CONFIG_FB_MXC_TVOUT_TVE is not set -# CONFIG_FB_MXC_LDB is not set +CONFIG_FB_MXC_EPSON_VGA_SYNC_PANEL=y +CONFIG_FB_MXC_TVOUT_TVE=y +CONFIG_FB_MXC_LDB=y # CONFIG_FB_MXC_CLAA_WVGA_SYNC_PANEL is not set -# CONFIG_FB_MXC_CH7026 is not set +CONFIG_FB_MXC_CH7026=y # CONFIG_FB_MXC_TVOUT_CH7024 is not set # CONFIG_FB_MXC_ASYNC_PANEL is not set -# CONFIG_FB_MXC_EINK_PANEL is not set -# CONFIG_FB_MXC_ELCDIF_FB is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set @@ -954,7 +1139,52 @@ CONFIG_LOGO=y # CONFIG_LOGO_LINUX_MONO is not set # CONFIG_LOGO_LINUX_VGA16 is not set CONFIG_LOGO_LINUX_CLUT224=y -# CONFIG_SOUND is not set +CONFIG_SOUND=y +CONFIG_SOUND_OSS_CORE=y +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +CONFIG_SND_JACK=y +# CONFIG_SND_SEQUENCER is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=y +CONFIG_SND_PCM_OSS=y +CONFIG_SND_PCM_OSS_PLUGINS=y +# CONFIG_SND_HRTIMER is not set +# CONFIG_SND_DYNAMIC_MINORS is not set +CONFIG_SND_SUPPORT_OLD_API=y +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set +# CONFIG_SND_RAWMIDI_SEQ is not set +# CONFIG_SND_OPL3_LIB_SEQ is not set +# CONFIG_SND_OPL4_LIB_SEQ is not set +# CONFIG_SND_SBAWE_SEQ is not set +# CONFIG_SND_EMU10K1_SEQ is not set +CONFIG_SND_DRIVERS=y +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set +CONFIG_SND_ARM=y +CONFIG_SND_MXC_SPDIF=y +CONFIG_SND_SPI=y +CONFIG_SND_USB=y +# CONFIG_SND_USB_AUDIO is not set +# CONFIG_SND_USB_CAIAQ is not set +CONFIG_SND_SOC=y +CONFIG_SND_MXC_SOC=y +CONFIG_SND_MXC_SOC_SSI=y +CONFIG_SND_MXC_SOC_IRAM=y +CONFIG_SND_SOC_IMX_3STACK_SGTL5000=y +# CONFIG_SND_SOC_IMX_3STACK_AK4647 is not set +# CONFIG_SND_SOC_IMX_3STACK_WM8580 is not set +# CONFIG_SND_SOC_IMX_3STACK_AK5702 is not set +# CONFIG_SND_SOC_IMX_3STACK_BLUETOOTH is not set +CONFIG_SND_SOC_I2C_AND_SPI=y +# CONFIG_SND_SOC_ALL_CODECS is not set +CONFIG_SND_SOC_SGTL5000=y +# CONFIG_SOUND_PRIME is not set CONFIG_HID_SUPPORT=y CONFIG_HID=y # CONFIG_HID_DEBUG is not set @@ -1255,20 +1485,7 @@ CONFIG_RTC_INTF_DEV_UIE_EMUL=y # CONFIG_RTC_DRV_MXC_V2 is not set # CONFIG_RTC_DRV_IMXDI is not set CONFIG_RTC_MC13892=y -CONFIG_DMADEVICES=y - -# -# DMA Devices -# -CONFIG_MXC_PXP=y -CONFIG_MXC_PXP_CLIENT_DEVICE=y -CONFIG_DMA_ENGINE=y - -# -# DMA Clients -# -# CONFIG_ASYNC_TX_DMA is not set -# CONFIG_DMATEST is not set +# CONFIG_DMADEVICES is not set # CONFIG_AUXDISPLAY is not set CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set @@ -1279,7 +1496,6 @@ CONFIG_REGULATOR=y # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_LP3971 is not set CONFIG_REGULATOR_MC13892=y -CONFIG_REGULATOR_MAX17135=y CONFIG_UIO=y # CONFIG_UIO_PDRV is not set CONFIG_UIO_PDRV_GENIRQ=y @@ -1351,8 +1567,9 @@ CONFIG_MXC_MC13892_POWER=y # # MXC VPU(Video Processing Unit) support # -# CONFIG_MXC_VPU is not set -# CONFIG_MXC_VPU_IRAM is not set +CONFIG_MXC_VPU=y +CONFIG_MXC_VPU_IRAM=y +# CONFIG_MXC_VPU_DEBUG is not set # # MXC Asynchronous Sample Rate Converter support @@ -1379,11 +1596,6 @@ CONFIG_MXC_MLB=y # CONFIG_IMX_ADC is not set # -# MXC GPU support -# -# CONFIG_MXC_AMD_GPU is not set - -# # File systems # CONFIG_EXT2_FS=y @@ -1553,8 +1765,8 @@ CONFIG_NLS_UTF8=y # Kernel hacking # # CONFIG_PRINTK_TIME is not set -# CONFIG_ENABLE_WARN_DEPRECATED is not set -# CONFIG_ENABLE_MUST_CHECK is not set +CONFIG_ENABLE_WARN_DEPRECATED=y +CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 # CONFIG_MAGIC_SYSRQ is not set # CONFIG_UNUSED_SYMBOLS is not set @@ -1565,16 +1777,15 @@ CONFIG_FRAME_WARN=1024 # CONFIG_SLUB_STATS is not set # CONFIG_DEBUG_BUGVERBOSE is not set # CONFIG_DEBUG_MEMORY_INIT is not set -CONFIG_FRAME_POINTER=y # CONFIG_RCU_CPU_STALL_DETECTOR is not set # CONFIG_LATENCYTOP is not set -# CONFIG_SYSCTL_SYSCALL_CHECK is not set +CONFIG_SYSCTL_SYSCALL_CHECK=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_SAMPLES is not set CONFIG_HAVE_ARCH_KGDB=y -# CONFIG_ARM_UNWIND is not set +CONFIG_ARM_UNWIND=y # CONFIG_DEBUG_USER is not set # diff --git a/arch/arm/include/asm/kmap_types.h b/arch/arm/include/asm/kmap_types.h index d16ec97ec9a9..c019949a5189 100644 --- a/arch/arm/include/asm/kmap_types.h +++ b/arch/arm/include/asm/kmap_types.h @@ -22,4 +22,10 @@ enum km_type { KM_TYPE_NR }; +#ifdef CONFIG_DEBUG_HIGHMEM +#define KM_NMI (-1) +#define KM_NMI_PTE (-1) +#define KM_IRQ_PTE (-1) +#endif + #endif diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index ff89d0b3abc5..60be28ddc813 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile @@ -2,7 +2,8 @@ # Makefile for the linux kernel. # -AFLAGS_head.o := -DTEXT_OFFSET=$(TEXT_OFFSET) +CPPFLAGS_vmlinux.lds := -DTEXT_OFFSET=$(TEXT_OFFSET) +AFLAGS_head.o := -DTEXT_OFFSET=$(TEXT_OFFSET) ifdef CONFIG_DYNAMIC_FTRACE CFLAGS_REMOVE_ftrace.o = -pg diff --git a/arch/arm/mach-mx23/device.c b/arch/arm/mach-mx23/device.c index cda2285ec3bc..814c4ef59266 100644 --- a/arch/arm/mach-mx23/device.c +++ b/arch/arm/mach-mx23/device.c @@ -931,49 +931,6 @@ static void mx23_init_persistent() } #endif -#if defined(CONFIG_FSL_OTP) -/* Building up eight registers's names of a bank */ -#define BANK(a, b, c, d, e, f, g, h) \ - {\ - ("HW_OCOTP_"#a), ("HW_OCOTP_"#b), ("HW_OCOTP_"#c), ("HW_OCOTP_"#d), \ - ("HW_OCOTP_"#e), ("HW_OCOTP_"#f), ("HW_OCOTP_"#g), ("HW_OCOTP_"#h) \ - } - -#define BANKS (4) -#define BANK_ITEMS (8) -static const char *bank_reg_desc[BANKS][BANK_ITEMS] = { - BANK(CUST0, CUST1, CUST2, CUST3, CRYPTO0, CRYPTO1, CRYPTO2, CRYPTO3), - BANK(HWCAP0, HWCAP1, HWCAP2, HWCAP3, HWCAP4, HWCAP5, SWCAP, CUSTCAP), - BANK(LOCK, OPS0, OPS1, OPS2, OPS3, UN0, UN1, UN2), - BANK(ROM0, ROM1, ROM2, ROM3, ROM4, ROM5, ROM6, ROM7), -}; - -static struct fsl_otp_data otp_data = { - .fuse_name = (char **)bank_reg_desc, - .regulator_name = "vddio", - .fuse_num = BANKS * BANK_ITEMS, -}; -#undef BANK -#undef BANKS -#undef BANK_ITEMS - -static void mx23_init_otp(void) -{ - struct platform_device *pdev; - pdev = mxs_get_device("ocotp", 0); - if (pdev == NULL || IS_ERR(pdev)) - return; - pdev->dev.platform_data = &otp_data; - pdev->resource = NULL; - pdev->num_resources = 0; - mxs_add_device(pdev, 3); -} -#else -static void mx23_init_otp(void) -{ -} -#endif - int __init mx23_device_init(void) { mx23_init_dma(); @@ -994,7 +951,6 @@ int __init mx23_device_init(void) mx23_init_pxp(); mx23_init_battery(); mx23_init_persistent(); - mx23_init_otp(); return 0; } diff --git a/arch/arm/mach-mx23/mx23evk_pins.c b/arch/arm/mach-mx23/mx23evk_pins.c index cdf86cfbea63..c12235d75e8c 100644 --- a/arch/arm/mach-mx23/mx23evk_pins.c +++ b/arch/arm/mach-mx23/mx23evk_pins.c @@ -61,28 +61,6 @@ static struct pin_desc mx23evk_fixed_pins[] = { }, #endif -#ifdef CONFIG_MXS_AUART2_DEVICE_ENABLE - { - .name = "AUART2.RX", - .id = PINID_GPMI_D14, - .fun = PIN_FUN2, - }, - { - .name = "AUART2.TX", - .id = PINID_GPMI_D15, - .fun = PIN_FUN2, - }, - { - .name = "AUART2.CTS", - .id = PINID_ROTARYB, - .fun = PIN_FUN2, - }, - { - .name = "AUART2.RTS", - .id = PINID_ROTARYA, - .fun = PIN_FUN2, - }, -#endif #if defined(CONFIG_I2C_MXS) || \ defined(CONFIG_I2C_MXS_MODULE) { diff --git a/arch/arm/mach-mx23/usb_dr.c b/arch/arm/mach-mx23/usb_dr.c index 4c702ffcd07c..ed4bde71391c 100644 --- a/arch/arm/mach-mx23/usb_dr.c +++ b/arch/arm/mach-mx23/usb_dr.c @@ -64,7 +64,7 @@ static struct fsl_usb2_platform_data __maybe_unused dr_utmi_config = { }; /* - * OTG resources + * resources */ static struct resource otg_resources[] = { [0] = { @@ -84,28 +84,6 @@ static struct resource otg_resources[] = { }, }; -/* - * UDC resources (same as OTG resource) - */ -static struct resource udc_resources[] = { - [0] = { - .start = (u32)USBCTRL_PHYS_ADDR, - .end = (u32)(USBCTRL_PHYS_ADDR + 0x1ff), - .flags = IORESOURCE_MEM, - }, - - [1] = { - .start = IRQ_USB_CTRL, - .flags = IORESOURCE_IRQ, - }, - - [2] = { - .start = IRQ_USB_WAKEUP, - .flags = IORESOURCE_IRQ, - }, -}; - - static u64 dr_udc_dmamask = ~(u32) 0; static void dr_udc_release(struct device *dev) { @@ -123,8 +101,8 @@ static struct platform_device dr_udc_device = { .dma_mask = &dr_udc_dmamask, .coherent_dma_mask = 0xffffffff, }, - .resource = udc_resources, - .num_resources = ARRAY_SIZE(udc_resources), + .resource = otg_resources, + .num_resources = ARRAY_SIZE(otg_resources), }; static u64 dr_otg_dmamask = ~(u32) 0; @@ -189,5 +167,5 @@ void fsl_phy_set_power(struct fsl_xcvr_ops *this, #ifdef CONFIG_MXS_VBUS_CURRENT_DRAW fs_initcall(usb_dr_init); #else - subsys_initcall(usb_dr_init); + module_init(usb_dr_init); #endif diff --git a/arch/arm/mach-mx25/mx25_3stack.c b/arch/arm/mach-mx25/mx25_3stack.c index c73bcbf6371e..cc651bf713ec 100644 --- a/arch/arm/mach-mx25/mx25_3stack.c +++ b/arch/arm/mach-mx25/mx25_3stack.c @@ -318,7 +318,7 @@ static struct spi_board_info mxc_spi_board_info[] __initdata = { .max_speed_hz = 18000000, .bus_num = 1, .chip_select = 0, - .mode = SPI_MODE_0, + .mode = SPI_MODE_2, }, { .modalias = "wm8580_spi", diff --git a/arch/arm/mach-mx25/usb_dr.c b/arch/arm/mach-mx25/usb_dr.c index b3d024cb06f8..b185d5cdeff5 100644 --- a/arch/arm/mach-mx25/usb_dr.c +++ b/arch/arm/mach-mx25/usb_dr.c @@ -1,5 +1,5 @@ /* - * Copyright 2005-2010 Freescale Semiconductor, Inc. All Rights Reserved. + * Copyright 2005-2009 Freescale Semiconductor, Inc. All Rights Reserved. */ /* @@ -39,7 +39,7 @@ static struct fsl_usb2_platform_data __maybe_unused dr_utmi_config = { }; /* - * OTG resources + * resources */ static struct resource otg_resources[] = { [0] = { @@ -53,22 +53,6 @@ static struct resource otg_resources[] = { }, }; -/* - * UDC resources (same as OTG resource) - */ -static struct resource udc_resources[] = { - [0] = { - .start = (u32)(USB_OTGREGS_BASE), - .end = (u32)(USB_OTGREGS_BASE + 0x1ff), - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = MXC_INT_USB_OTG, - .flags = IORESOURCE_IRQ, - }, -}; - - static u64 dr_udc_dmamask = ~(u32) 0; static void dr_udc_release(struct device *dev) { @@ -91,8 +75,8 @@ static struct platform_device __maybe_unused dr_udc_device = { .dma_mask = &dr_udc_dmamask, .coherent_dma_mask = 0xffffffff, }, - .resource = udc_resources, - .num_resources = ARRAY_SIZE(udc_resources), + .resource = otg_resources, + .num_resources = ARRAY_SIZE(otg_resources), }; static struct platform_device __maybe_unused dr_otg_device = { diff --git a/arch/arm/mach-mx28/bus_freq.c b/arch/arm/mach-mx28/bus_freq.c index ef01a41fc095..1ea76cbdb4e3 100644 --- a/arch/arm/mach-mx28/bus_freq.c +++ b/arch/arm/mach-mx28/bus_freq.c @@ -49,14 +49,16 @@ #define BF(value, field) (((value) << BP_##field) & BM_##field) struct profile profiles[] = { - { 454736, 151570, 205710, 0, 1550000, + { 454736, 151580, 196360, 0, 1550000, 1450000, 355000, 3300000, 1750000, 24000, 0 }, - { 360000, 120000, 130910, 0, 1350000, - 1250000, 200000, 3300000, 1750000, 24000, 0 }, - { 261818, 130910, 130910, 0, 1350000, - 1250000, 173000, 3300000, 1750000, 24000, 0 }, - { 64000, 64000, 130910, 3, 1350000, - 1250000, 150000, 3300000, 1750000, 24000, 0 }, + { 392727, 130910, 160000, 0, 1475000, + 1375000, 225000, 3300000, 1750000, 24000, 0 }, + { 360000, 120000, 130910, 0, 1375000, + 1275000, 200000, 3300000, 1750000, 24000, 0 }, + { 261818, 130910, 130910, 0, 1275000, + 1175000, 173000, 3300000, 1750000, 24000, 0 }, + { 64000, 64000, 130910, 3, 1050000, + 975000, 150000, 3300000, 1750000, 24000, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }; diff --git a/arch/arm/mach-mx28/device.c b/arch/arm/mach-mx28/device.c index 35e8f14a5568..7305b35bc74b 100644 --- a/arch/arm/mach-mx28/device.c +++ b/arch/arm/mach-mx28/device.c @@ -27,7 +27,6 @@ #include <linux/platform_device.h> #include <linux/mmc/host.h> #include <linux/phy.h> -#include <linux/etherdevice.h> #include <linux/fec.h> #include <linux/gpmi-nfc.h> @@ -36,7 +35,6 @@ #include <mach/hardware.h> #include <mach/regs-timrot.h> #include <mach/regs-lradc.h> -#include <mach/regs-ocotp.h> #include <mach/device.h> #include <mach/dma.h> #include <mach/lradc.h> @@ -556,10 +554,9 @@ static struct mxs_mmc_platform_data mmc0_data = { .get_wp = mxs_mmc_get_wp_ssp0, .cmd_pullup = mxs_mmc_cmd_pullup_ssp0, .setclock = mxs_mmc_setclock_ssp0, - .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA - | MMC_CAP_DATA_DDR, + .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, .min_clk = 400000, - .max_clk = 48000000, + .max_clk = 52000000, .read_uA = 50000, .write_uA = 70000, .clock_mmc = "ssp.0", @@ -595,10 +592,9 @@ static struct mxs_mmc_platform_data mmc1_data = { .get_wp = mxs_mmc_get_wp_ssp1, .cmd_pullup = mxs_mmc_cmd_pullup_ssp1, .setclock = mxs_mmc_setclock_ssp1, - .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA - | MMC_CAP_DATA_DDR, + .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, .min_clk = 400000, - .max_clk = 48000000, + .max_clk = 52000000, .read_uA = 50000, .write_uA = 70000, .clock_mmc = "ssp.1", @@ -761,16 +757,7 @@ static void __init mx28_init_fec(void) { struct platform_device *pdev; struct mxs_dev_lookup *lookup; - struct fec_platform_data *pfec; int i; - u32 val; - - __raw_writel(BM_OCOTP_CTRL_RD_BANK_OPEN, - IO_ADDRESS(OCOTP_PHYS_ADDR) + HW_OCOTP_CTRL_SET); - - while (BM_OCOTP_CTRL_BUSY & - __raw_readl(IO_ADDRESS(OCOTP_PHYS_ADDR) + HW_OCOTP_CTRL)) - udelay(10); lookup = mxs_get_devices("mxs-fec"); if (lookup == NULL || IS_ERR(lookup)) @@ -778,8 +765,6 @@ static void __init mx28_init_fec(void) for (i = 0; i < lookup->size; i++) { pdev = lookup->pdev + i; - val = __raw_readl(IO_ADDRESS(OCOTP_PHYS_ADDR) + - HW_OCOTP_CUSTn(pdev->id)); switch (pdev->id) { case 0: pdev->resource = fec0_resource; @@ -794,15 +779,6 @@ static void __init mx28_init_fec(void) default: return; } - - pfec = (struct fec_platform_data *)pdev->dev.platform_data; - pfec->mac[0] = 0x00; - pfec->mac[1] = 0x04; - pfec->mac[2] = (val >> 24) & 0xFF; - pfec->mac[3] = (val >> 16) & 0xFF; - pfec->mac[4] = (val >> 8) & 0xFF; - pfec->mac[5] = (val >> 0) & 0xFF; - mxs_add_device(pdev, 2); } } @@ -848,36 +824,13 @@ static struct switch_platform_data l2switch_data = { static void __init mx28_init_l2switch(void) { struct platform_device *pdev; - struct switch_platform_data *pswitch; - struct fec_platform_data *pfec; - u32 val; - - __raw_writel(BM_OCOTP_CTRL_RD_BANK_OPEN, - IO_ADDRESS(OCOTP_PHYS_ADDR) + HW_OCOTP_CTRL_SET); - - while (BM_OCOTP_CTRL_BUSY & - __raw_readl(IO_ADDRESS(OCOTP_PHYS_ADDR) + HW_OCOTP_CTRL)) - udelay(10); - pdev = mxs_get_device("mxs-l2switch", 0); if (pdev == NULL || IS_ERR(pdev)) return; - val = __raw_readl(IO_ADDRESS(OCOTP_PHYS_ADDR) + - HW_OCOTP_CUSTn(pdev->id)); pdev->resource = l2switch_resources; pdev->num_resources = ARRAY_SIZE(l2switch_resources); pdev->dev.platform_data = &l2switch_data; - - pswitch = (struct switch_platform_data *)pdev->dev.platform_data; - pfec = pswitch->fec_enet; - pfec->mac[0] = 0x00; - pfec->mac[1] = 0x04; - pfec->mac[2] = (val >> 24) & 0xFF; - pfec->mac[3] = (val >> 16) & 0xFF; - pfec->mac[4] = (val >> 8) & 0xFF; - pfec->mac[5] = (val >> 0) & 0xFF; - mxs_add_device(pdev, 2); } #else @@ -1459,50 +1412,6 @@ static void mx28_init_persistent() } #endif -#if defined(CONFIG_FSL_OTP) -/* Building up eight registers's names of a bank */ -#define BANK(a, b, c, d, e, f, g, h) \ - {\ - ("HW_OCOTP_"#a), ("HW_OCOTP_"#b), ("HW_OCOTP_"#c), ("HW_OCOTP_"#d), \ - ("HW_OCOTP_"#e), ("HW_OCOTP_"#f), ("HW_OCOTP_"#g), ("HW_OCOTP_"#h) \ - } - -#define BANKS (5) -#define BANK_ITEMS (8) -static const char *bank_reg_desc[BANKS][BANK_ITEMS] = { - BANK(CUST0, CUST1, CUST2, CUST3, CRYPTO0, CRYPTO1, CRYPTO2, CRYPTO3), - BANK(HWCAP0, HWCAP1, HWCAP2, HWCAP3, HWCAP4, HWCAP5, SWCAP, CUSTCAP), - BANK(LOCK, OPS0, OPS1, OPS2, OPS3, UN0, UN1, UN2), - BANK(ROM0, ROM1, ROM2, ROM3, ROM4, ROM5, ROM6, ROM7), - BANK(SRK0, SRK1, SRK2, SRK3, SRK4, SRK5, SRK6, SRK7), -}; - -static struct fsl_otp_data otp_data = { - .fuse_name = (char **)bank_reg_desc, - .regulator_name = "vddio", - .fuse_num = BANKS * BANK_ITEMS, -}; -#undef BANK -#undef BANKS -#undef BANK_ITEMS - -static void __init mx28_init_otp(void) -{ - struct platform_device *pdev; - pdev = mxs_get_device("ocotp", 0); - if (pdev == NULL || IS_ERR(pdev)) - return; - pdev->dev.platform_data = &otp_data; - pdev->resource = NULL; - pdev->num_resources = 0; - mxs_add_device(pdev, 3); -} -#else -static void mx28_init_otp(void) -{ -} -#endif - int __init mx28_device_init(void) { mx28_init_dma(); @@ -1527,7 +1436,6 @@ int __init mx28_device_init(void) mx28_init_dcp(); mx28_init_battery(); mx28_init_persistent(); - mx28_init_otp(); return 0; } diff --git a/arch/arm/mach-mx28/emi_settings.c b/arch/arm/mach-mx28/emi_settings.c index 56df6ad0c0d4..7dd62b9dd65a 100644 --- a/arch/arm/mach-mx28/emi_settings.c +++ b/arch/arm/mach-mx28/emi_settings.c @@ -27,6 +27,7 @@ #include <linux/platform_device.h> #include <linux/mmc/host.h> #include <linux/phy.h> +#include <linux/fec.h> #include <asm/mach/map.h> diff --git a/arch/arm/mach-mx28/mx28evk.c b/arch/arm/mach-mx28/mx28evk.c index 37beb27f7065..768b21a5ffe5 100644 --- a/arch/arm/mach-mx28/mx28evk.c +++ b/arch/arm/mach-mx28/mx28evk.c @@ -39,7 +39,7 @@ static struct i2c_board_info __initdata mxs_i2c_device[] = { { I2C_BOARD_INFO("sgtl5000-i2c", 0x14), .flags = I2C_M_TEN } }; -static void __init i2c_device_init(void) +static void i2c_device_init(void) { i2c_register_board_info(0, mxs_i2c_device, ARRAY_SIZE(mxs_i2c_device)); } diff --git a/arch/arm/mach-mx28/mx28evk.h b/arch/arm/mach-mx28/mx28evk.h index d973c0f7ef19..58910271343d 100644 --- a/arch/arm/mach-mx28/mx28evk.h +++ b/arch/arm/mach-mx28/mx28evk.h @@ -21,8 +21,5 @@ extern void __init mx28evk_pins_init(void); extern int mx28evk_enet_gpio_init(void); -void mx28evk_enet_io_lowerpower_enter(void); -void mx28evk_enet_io_lowerpower_exit(void); - #endif /* __ASM_ARM_MACH_MX28EVK_H */ diff --git a/arch/arm/mach-mx28/mx28evk_pins.c b/arch/arm/mach-mx28/mx28evk_pins.c index 7d5b64328324..a7c81b3cf023 100644 --- a/arch/arm/mach-mx28/mx28evk_pins.c +++ b/arch/arm/mach-mx28/mx28evk_pins.c @@ -531,106 +531,16 @@ static struct pin_desc mx28evk_fixed_pins[] = { .name = "SSP0_SCK", .id = PINID_SSP0_SCK, .fun = PIN_FUN1, - .strength = PAD_12MA, + .strength = PAD_8MA, .voltage = PAD_3_3V, .pullup = 0, - .drive = 2, - .pull = 0, - }, -#endif -#if defined(CONFIG_LEDS_MXS) || defined(CONFIG_LEDS_MXS_MODULE) - { - .name = "LEDS_PWM0", - .id = PINID_AUART1_RX, - .fun = PIN_FUN3, - .strength = PAD_8MA, - .voltage = PAD_3_3V, - .pullup = 1, - .drive = 1, - .pull = 1, - }, - { - .name = "LEDS_PWM1", - .id = PINID_AUART1_TX, - .fun = PIN_FUN3, - .strength = PAD_8MA, - .voltage = PAD_3_3V, - .pullup = 1, - .drive = 1, - .pull = 1, - }, -#endif -#if defined(CONFIG_SND_MXS_SOC_DAI) || defined(CONFIG_SND_MXS_SOC_DAI_MODULE) - /* Configurations of SAIF0 port pins */ - { - .name = "SAIF0_MCLK", - .id = PINID_SAIF0_MCLK, - .fun = PIN_FUN1, - .strength = PAD_12MA, - .voltage = PAD_3_3V, - .pullup = 1, - .drive = 1, - .pull = 1, - }, - { - .name = "SAIF0_LRCLK", - .id = PINID_SAIF0_LRCLK, - .fun = PIN_FUN1, - .strength = PAD_12MA, - .voltage = PAD_3_3V, - .pullup = 1, .drive = 1, - .pull = 1, - }, - { - .name = "SAIF0_BITCLK", - .id = PINID_SAIF0_BITCLK, - .fun = PIN_FUN1, - .strength = PAD_12MA, - .voltage = PAD_3_3V, - .pullup = 1, - .drive = 1, - .pull = 1, - }, - { - .name = "SAIF0_SDATA0", - .id = PINID_SAIF0_SDATA0, - .fun = PIN_FUN1, - .strength = PAD_12MA, - .voltage = PAD_3_3V, - .pullup = 1, - .drive = 1, - .pull = 1, - }, - { - .name = "SAIF1_SDATA0", - .id = PINID_SAIF1_SDATA0, - .fun = PIN_FUN1, - .strength = PAD_12MA, - .voltage = PAD_3_3V, - .pullup = 1, - .drive = 1, - .pull = 1, + .pull = 0, }, #endif -#if defined(CONFIG_SND_SOC_MXS_SPDIF) || \ - defined(CONFIG_SND_SOC_MXS_SPDIF_MODULE) - { - .name = "SPDIF", - .id = PINID_SPDIF, - .fun = PIN_FUN1, - .strength = PAD_12MA, - .voltage = PAD_3_3V, - .pullup = 1, - .drive = 1, - .pull = 1, - }, -#endif -}; #if defined(CONFIG_FEC) || defined(CONFIG_FEC_MODULE)\ || defined(CONFIG_FEC_L2SWITCH) -static struct pin_desc mx28evk_eth_pins[] = { { .name = "ENET0_MDC", .id = PINID_ENET0_MDC, @@ -781,8 +691,97 @@ static struct pin_desc mx28evk_eth_pins[] = { .voltage = PAD_3_3V, .drive = 1, }, -}; #endif +#if defined(CONFIG_LEDS_MXS) || defined(CONFIG_LEDS_MXS_MODULE) + { + .name = "LEDS_PWM0", + .id = PINID_AUART1_RX, + .fun = PIN_FUN3, + .strength = PAD_8MA, + .voltage = PAD_3_3V, + .pullup = 1, + .drive = 1, + .pull = 1, + }, + { + .name = "LEDS_PWM1", + .id = PINID_AUART1_TX, + .fun = PIN_FUN3, + .strength = PAD_8MA, + .voltage = PAD_3_3V, + .pullup = 1, + .drive = 1, + .pull = 1, + }, +#endif +#if defined(CONFIG_SND_MXS_SOC_DAI) || defined(CONFIG_SND_MXS_SOC_DAI_MODULE) + /* Configurations of SAIF0 port pins */ + { + .name = "SAIF0_MCLK", + .id = PINID_SAIF0_MCLK, + .fun = PIN_FUN1, + .strength = PAD_12MA, + .voltage = PAD_3_3V, + .pullup = 1, + .drive = 1, + .pull = 1, + }, + { + .name = "SAIF0_LRCLK", + .id = PINID_SAIF0_LRCLK, + .fun = PIN_FUN1, + .strength = PAD_12MA, + .voltage = PAD_3_3V, + .pullup = 1, + .drive = 1, + .pull = 1, + }, + { + .name = "SAIF0_BITCLK", + .id = PINID_SAIF0_BITCLK, + .fun = PIN_FUN1, + .strength = PAD_12MA, + .voltage = PAD_3_3V, + .pullup = 1, + .drive = 1, + .pull = 1, + }, + { + .name = "SAIF0_SDATA0", + .id = PINID_SAIF0_SDATA0, + .fun = PIN_FUN1, + .strength = PAD_12MA, + .voltage = PAD_3_3V, + .pullup = 1, + .drive = 1, + .pull = 1, + }, + { + .name = "SAIF1_SDATA0", + .id = PINID_SAIF1_SDATA0, + .fun = PIN_FUN1, + .strength = PAD_12MA, + .voltage = PAD_3_3V, + .pullup = 1, + .drive = 1, + .pull = 1, + }, +#endif +#if defined(CONFIG_SND_SOC_MXS_SPDIF) || \ + defined(CONFIG_SND_SOC_MXS_SPDIF_MODULE) + { + .name = "SPDIF", + .id = PINID_SPDIF, + .fun = PIN_FUN1, + .strength = PAD_12MA, + .voltage = PAD_3_3V, + .pullup = 1, + .drive = 1, + .pull = 1, + }, +#endif +}; + static int __initdata enable_ssp1 = { 0 }; static int __init ssp1_setup(char *__unused) @@ -898,10 +897,10 @@ static struct pin_desc mx28evk_ssp1_pins[] = { .name = "SSP1_SCK", .id = PINID_GPMI_WRN, .fun = PIN_FUN2, - .strength = PAD_12MA, + .strength = PAD_8MA, .voltage = PAD_3_3V, .pullup = 0, - .drive = 2, + .drive = 1, .pull = 0, }, }; @@ -1088,49 +1087,11 @@ int mx28evk_enet_gpio_init(void) return 0; } - -void mx28evk_enet_io_lowerpower_enter(void) -{ - int i; - gpio_direction_output(MXS_PIN_TO_GPIO(PINID_SSP1_DATA3), 1); - gpio_direction_output(MXS_PIN_TO_GPIO(PINID_ENET0_RX_CLK), 0); - gpio_request(MXS_PIN_TO_GPIO(PINID_ENET0_TX_CLK), "ETH_INT"); - gpio_direction_output(MXS_PIN_TO_GPIO(PINID_ENET0_TX_CLK), 0); - - for (i = 0; i < ARRAY_SIZE(mx28evk_eth_pins); i++) { - mxs_release_pin(mx28evk_eth_pins[i].id, - mx28evk_eth_pins[i].name); - gpio_request(MXS_PIN_TO_GPIO(mx28evk_eth_pins[i].id), - mx28evk_eth_pins[i].name); - gpio_direction_output( - MXS_PIN_TO_GPIO(mx28evk_eth_pins[i].id), 0); - } - -} - -void mx28evk_enet_io_lowerpower_exit(void) -{ - int i; - gpio_direction_output(MXS_PIN_TO_GPIO(PINID_SSP1_DATA3), 0); - gpio_direction_output(MXS_PIN_TO_GPIO(PINID_ENET0_RX_CLK), 1); - gpio_free(MXS_PIN_TO_GPIO(PINID_ENET0_TX_CLK)); - for (i = 0; i < ARRAY_SIZE(mx28evk_eth_pins); i++) { - gpio_free(MXS_PIN_TO_GPIO(mx28evk_eth_pins[i].id)); - mxs_request_pin(mx28evk_eth_pins[i].id, - mx28evk_eth_pins[i].fun, - mx28evk_eth_pins[i].name); - } -} - #else int mx28evk_enet_gpio_init(void) { return 0; } -void mx28evk_enet_io_lowerpower_enter(void) -{} -void mx28evk_enet_io_lowerpower_exit(void) -{} #endif void __init mx28evk_init_pin_group(struct pin_desc *pins, unsigned count) @@ -1174,9 +1135,5 @@ void __init mx28evk_pins_init(void) mx28evk_init_pin_group(mx28evk_gpmi_pins, ARRAY_SIZE(mx28evk_gpmi_pins)); } -#if defined(CONFIG_FEC) || defined(CONFIG_FEC_MODULE)\ - || defined(CONFIG_FEC_L2SWITCH) - mx28evk_init_pin_group(mx28evk_eth_pins, - ARRAY_SIZE(mx28evk_eth_pins)); -#endif + } diff --git a/arch/arm/mach-mx28/pm.c b/arch/arm/mach-mx28/pm.c index 4ac13bc3248c..c26a495f59e2 100644 --- a/arch/arm/mach-mx28/pm.c +++ b/arch/arm/mach-mx28/pm.c @@ -36,13 +36,12 @@ #include <mach/dma.h> #include <mach/regs-rtc.h> #include "regs-clkctrl.h" +#include "regs-pinctrl.h" #include <mach/regs-power.h> #include <mach/regs-pwm.h> #include <mach/regs-rtc.h> #include <mach/../../regs-icoll.h> #include "regs-dram.h" -#include "mx28_pins.h" -#include "mx28evk.h" #include "sleep.h" @@ -80,8 +79,7 @@ static inline void do_standby(void) u32 reg_clkctrl_clkseq, reg_clkctrl_xtal; unsigned long iram_phy_addr; void *iram_virtual_addr; - int wakeupirq; - mx28evk_enet_io_lowerpower_enter(); + /* * 1) switch clock domains from PLL to 24MHz * 2) lower voltage (TODO) @@ -112,8 +110,7 @@ static inline void do_standby(void) cpu_parent = clk_get_parent(cpu_clk); hbus_rate = clk_get_rate(hbus_clk); clk_set_parent(cpu_clk, osc_clk); - } else - pr_err("fail to get cpu clk\n"); + } local_fiq_disable(); @@ -125,18 +122,15 @@ static inline void do_standby(void) reg_clkctrl_xtal = __raw_readl(REGS_CLKCTRL_BASE + HW_CLKCTRL_XTAL); - /* do suspend */ mx28_cpu_standby_ptr = iram_virtual_addr; mx28_cpu_standby_ptr(); - wakeupirq = __raw_readl(IO_ADDRESS(ICOLL_PHYS_ADDR) + HW_ICOLL_STAT); - - pr_info("wakeup irq = %d\n", wakeupirq); __raw_writel(reg_clkctrl_clkseq, REGS_CLKCTRL_BASE + HW_CLKCTRL_CLKSEQ); __raw_writel(reg_clkctrl_xtal, REGS_CLKCTRL_BASE + HW_CLKCTRL_XTAL); + saved_sleep_state = 0; /* waking from standby */ __raw_writel(BM_POWER_CTRL_PSWITCH_IRQ, REGS_POWER_BASE + HW_POWER_CTRL_CLR); @@ -155,7 +149,6 @@ static inline void do_standby(void) clk_put(cpu_clk); iram_free(iram_phy_addr, MAX_POWEROFF_CODE_SIZE); - mx28evk_enet_io_lowerpower_exit(); } static noinline void do_mem(void) @@ -262,52 +255,38 @@ static struct mx28_pswitch_state pswitch_state = { .dev_running = 0, }; -#define PSWITCH_POWER_DOWN_DELAY 30 -static struct delayed_work pswitch_work; -static void pswitch_check_work(struct work_struct *work) +static irqreturn_t pswitch_interrupt(int irq, void *dev) { int pin_value, i; - for (i = 0; i < PSWITCH_POWER_DOWN_DELAY; i++) { + + /* check if irq by pswitch */ + if (!(__raw_readl(REGS_POWER_BASE + HW_POWER_CTRL) & + BM_POWER_CTRL_PSWITCH_IRQ)) + return IRQ_HANDLED; + for (i = 0; i < 3000; i++) { pin_value = __raw_readl(REGS_POWER_BASE + HW_POWER_STS) & BF_POWER_STS_PSWITCH(0x1); if (pin_value == 0) break; - msleep(100); + mdelay(1); } - if (i < PSWITCH_POWER_DOWN_DELAY) { + if (i < 3000) { pr_info("pswitch goto suspend\n"); complete(&suspend_request); } else { pr_info("release pswitch to power down\n"); - for (i = 0; i < 500; i++) { + for (i = 0; i < 5000; i++) { pin_value = __raw_readl(REGS_POWER_BASE + HW_POWER_STS) & BF_POWER_STS_PSWITCH(0x1); if (pin_value == 0) break; - msleep(10); + mdelay(1); } pr_info("pswitch power down\n"); mx28_pm_power_off(); } __raw_writel(BM_POWER_CTRL_PSWITCH_IRQ, REGS_POWER_BASE + HW_POWER_CTRL_CLR); - __raw_writel(BM_POWER_CTRL_ENIRQ_PSWITCH, - REGS_POWER_BASE + HW_POWER_CTRL_SET); - __raw_writel(BM_POWER_CTRL_PSWITCH_IRQ, - REGS_POWER_BASE + HW_POWER_CTRL_CLR); -} - - -static irqreturn_t pswitch_interrupt(int irq, void *dev) -{ - - /* check if irq by pswitch */ - if (!(__raw_readl(REGS_POWER_BASE + HW_POWER_CTRL) & - BM_POWER_CTRL_PSWITCH_IRQ)) - return IRQ_HANDLED; - __raw_writel(BM_POWER_CTRL_ENIRQ_PSWITCH, - REGS_POWER_BASE + HW_POWER_CTRL_CLR); - schedule_delayed_work(&pswitch_work, 1); return IRQ_HANDLED; } @@ -320,7 +299,6 @@ static struct irqaction pswitch_irq = { static void init_pswitch(void) { - INIT_DELAYED_WORK(&pswitch_work, pswitch_check_work); kthread_run(suspend_thread_fn, NULL, "pswitch"); __raw_writel(BM_POWER_CTRL_PSWITCH_IRQ, REGS_POWER_BASE + HW_POWER_CTRL_CLR); diff --git a/arch/arm/mach-mx28/sleep.S b/arch/arm/mach-mx28/sleep.S index 54e86bd4f717..438f588f85d3 100644 --- a/arch/arm/mach-mx28/sleep.S +++ b/arch/arm/mach-mx28/sleep.S @@ -25,7 +25,6 @@ #include <mach/hardware.h> #include <mach/regs-power.h> #include <mach/regs-rtc.h> -#include "regs-pinctrl.h" #include "regs-clkctrl.h" #include "regs-dram.h" #include "sleep.h" @@ -40,104 +39,11 @@ #define HW_DRAM_CTL17_ADDR \ (MX28_SOC_IO_ADDRESS(DRAM_PHYS_ADDR) + HW_DRAM_CTL17) -#define HW_DRAM_CTL22_ADDR \ - (MX28_SOC_IO_ADDRESS(DRAM_PHYS_ADDR) + HW_DRAM_CTL22) - #define HW_RTC_PERSISTENT0_ADDR \ (MX28_SOC_IO_ADDRESS(RTC_PHYS_ADDR) + HW_RTC_PERSISTENT0) -#define HW_CLKCTRL_EMI_ADDR \ - (MX28_SOC_IO_ADDRESS(CLKCTRL_PHYS_ADDR) + HW_CLKCTRL_EMI) -#define HW_CLKCTRL_PLL0CTRL0_ADDR \ - (MX28_SOC_IO_ADDRESS(CLKCTRL_PHYS_ADDR) + HW_CLKCTRL_PLL0CTRL0) -#define HW_POWER_VDDIOCTRL_ADDR \ - (MX28_SOC_IO_ADDRESS(POWER_PHYS_ADDR) + HW_POWER_VDDIOCTRL) -#define HW_POWER_VDDDCTRL_ADDR \ - (MX28_SOC_IO_ADDRESS(POWER_PHYS_ADDR) + HW_POWER_VDDDCTRL) -#define HW_POWER_VDDACTRL_ADDR \ - (MX28_SOC_IO_ADDRESS(POWER_PHYS_ADDR) + HW_POWER_VDDACTRL) -#define HW_PINCTRL_EMI_DS_CTRL_ADDR \ - (MX28_SOC_IO_ADDRESS(PINCTRL_PHYS_ADDR) + HW_PINCTRL_EMI_DS_CTRL) - -#define HW_POWER_LOOPCTRL_ADDR \ - (MX28_SOC_IO_ADDRESS(POWER_PHYS_ADDR) + HW_POWER_LOOPCTRL) - -#define HW_POWER_MINPWR_ADDR \ - (MX28_SOC_IO_ADDRESS(POWER_PHYS_ADDR) + HW_POWER_MINPWR) #define PHYS_RAM_START 0x40000000 -#define LOWER_VDDIO 6 -#define LOWER_VDDA 9 -#define LOWER_VDDD 0x16 - -#define VDDIOCTRL_BACKUP 0 -#define VDDACTRL_BACKUP 1 -#define VDDDCTRL_BACKUP 2 -#define POWER_LOOPCTRL_BACKUP 3 -#define POWER_MINPWR_BACKUP 4 - -.macro PM_BITS_SET, addr, val - mov r0, #(\addr & 0x000000FF) - orr r0, r0, #(\addr & 0x0000FF00) - orr r0, r0, #(\addr & 0x00FF0000) - orr r0, r0, #(\addr & 0xFF000000) - ldr r1, [r0] - orr r1, r1, #(\val) - str r1, [r0] -.endm - -.macro PM_BITS_CLR, addr, val - mov r0, #(\addr & 0x000000FF) - orr r0, r0, #(\addr & 0x0000FF00) - orr r0, r0, #(\addr & 0x00FF0000) - orr r0, r0, #(\addr & 0xFF000000) - ldr r1, [r0] - bic r1, r1, #(\val) - str r1, [r0] -.endm - -.macro PM_BACKUP_REG, addr, num - mov r0, #(\addr & 0x000000FF) - orr r0, r0, #(\addr & 0x0000FF00) - orr r0, r0, #(\addr & 0x00FF0000) - orr r0, r0, #(\addr & 0xFF000000) - ldr r1, [r0] - str r1, __mx28_temp_stack + \num * 4 -.endm - -.macro PM_WRITE_REG_MASK, addr, bitmask, val - mov r0, #(\addr & 0x000000FF) - orr r0, r0, #(\addr & 0x0000FF00) - orr r0, r0, #(\addr & 0x00FF0000) - orr r0, r0, #(\addr & 0xFF000000) - ldr r1, [r0] - bic r1, r1, #(\bitmask) - orr r1, r1, #(\val) - str r1, [r0] -.endm - -.macro PM_SET_AND_BACKUP_REG, addr, bitmask, val, num - mov r0, #(\addr & 0x000000FF) - orr r0, r0, #(\addr & 0x0000FF00) - orr r0, r0, #(\addr & 0x00FF0000) - orr r0, r0, #(\addr & 0xFF000000) - ldr r1, [r0] - str r1, __mx28_temp_stack + \num * 4 - bic r1, r1, #(\bitmask) - orr r1, r1, #(\val) - str r1, [r0] -.endm - -.macro PM_SET_RESTORE_REG, addr, num - mov r0, #(\addr & 0x000000FF) - orr r0, r0, #(\addr & 0x0000FF00) - orr r0, r0, #(\addr & 0x00FF0000) - orr r0, r0, #(\addr & 0xFF000000) - ldr r1, __mx28_temp_stack + \num * 4 - str r1, [r0] -.endm - - .global cpu_arm926_switch_mm .text @@ -153,6 +59,7 @@ ENTRY(mx28_cpu_standby) ldr r1, __mx28_flush_cache_addr mov lr, pc mov pc, r1 + @ put DRAM into self refresh mov r0, #(HW_DRAM_CTL17_ADDR & 0x000000FF) orr r0, r0, #(HW_DRAM_CTL17_ADDR & 0x0000FF00) @@ -162,67 +69,6 @@ ENTRY(mx28_cpu_standby) orr r1, r1, #(BM_DRAM_CTL17_SREFRESH) str r1, [r0] @ wait for it to actually happen - mov r0, #24 << 5 -11: sub r0, r0, #1 - cmp r0, #0 - bne 11b - - @ gate clk - mov r0, #(HW_CLKCTRL_EMI_ADDR & 0x000000FF) - orr r0, r0, #(HW_CLKCTRL_EMI_ADDR & 0x0000FF00) - orr r0, r0, #(HW_CLKCTRL_EMI_ADDR & 0x00FF0000) - orr r0, r0, #(HW_CLKCTRL_EMI_ADDR & 0xFF000000) - ldr r1, [r0] - orr r1, r1, #(BM_CLKCTRL_EMI_CLKGATE) - str r1, [r0] - -// PM_SET_AND_BACKUP_REG HW_PINCTRL_EMI_DS_CTRL_ADDR,\ -// BM_PINCTRL_EMI_DS_CTRL_DDR_MODE,\ -// BF_PINCTRL_EMI_DS_CTRL_DDR_MODE(0x1), 4 - - // vddio - PM_SET_AND_BACKUP_REG HW_POWER_VDDIOCTRL_ADDR,\ - BM_POWER_VDDIOCTRL_TRG, LOWER_VDDIO, VDDIOCTRL_BACKUP - mov r0, #24 << 10 -1: sub r0, r0, #1 - cmp r0, #0 - bne 1b - - PM_SET_AND_BACKUP_REG HW_POWER_VDDACTRL_ADDR,\ - BM_POWER_VDDACTRL_TRG, LOWER_VDDA, VDDACTRL_BACKUP - mov r0, #24 << 10 -2: sub r0, r0, #1 - cmp r0, #0 - bne 2b - - PM_SET_AND_BACKUP_REG HW_POWER_VDDDCTRL_ADDR,\ - BM_POWER_VDDDCTRL_TRG, LOWER_VDDD, VDDDCTRL_BACKUP - mov r0, #24 << 10 -3: sub r0, r0, #1 - cmp r0, #0 - bne 3b - - PM_BACKUP_REG HW_POWER_LOOPCTRL_ADDR, POWER_LOOPCTRL_BACKUP - PM_BACKUP_REG HW_POWER_MINPWR_ADDR, POWER_MINPWR_BACKUP - -// PM_BITS_CLR HW_POWER_LOOPCTRL_ADDR, BM_POWER_LOOPCTRL_EN_RCSCALE -// PM_WRITE_REG_MASK HW_POWER_LOOPCTRL_ADDR, BM_POWER_LOOPCTRL_DC_R,\ -// (2<<BP_POWER_LOOPCTRL_DC_R) - - // half fets - PM_BITS_SET HW_POWER_MINPWR_ADDR, BM_POWER_MINPWR_HALF_FETS - - PM_BITS_CLR HW_POWER_LOOPCTRL_ADDR, BM_POWER_LOOPCTRL_CM_HYST_THRESH - PM_BITS_CLR HW_POWER_LOOPCTRL_ADDR, BM_POWER_LOOPCTRL_EN_CM_HYST - PM_BITS_CLR HW_POWER_LOOPCTRL_ADDR, BM_POWER_LOOPCTRL_EN_DF_HYST - - // enable PFM - PM_BITS_SET HW_POWER_LOOPCTRL_ADDR, BM_POWER_LOOPCTRL_HYST_SIGN - PM_BITS_SET HW_POWER_MINPWR_ADDR, BM_POWER_MINPWR_EN_DC_PFM - - - //Gated PLL0 - PM_BITS_CLR HW_CLKCTRL_PLL0CTRL0_ADDR, BM_CLKCTRL_PLL0CTRL0_POWER @ do enter standby mov r0, #(HW_CLKCTRL_CPU_ADDR & 0x000000FF) @@ -243,39 +89,6 @@ ENTRY(mx28_cpu_standby) nop nop - PM_BITS_SET HW_CLKCTRL_PLL0CTRL0_ADDR, BM_CLKCTRL_PLL0CTRL0_POWER - - PM_SET_RESTORE_REG HW_POWER_MINPWR_ADDR, POWER_MINPWR_BACKUP - - PM_SET_RESTORE_REG HW_POWER_LOOPCTRL_ADDR, POWER_LOOPCTRL_BACKUP - - // vddio - PM_SET_RESTORE_REG HW_POWER_VDDIOCTRL_ADDR, VDDIOCTRL_BACKUP - mov r0, #24 << 10 -10: sub r0, r0, #1 - cmp r0, #0 - bne 10b - PM_SET_RESTORE_REG HW_POWER_VDDACTRL_ADDR, VDDACTRL_BACKUP - mov r0, #24 << 10 -20: sub r0, r0, #1 - cmp r0, #0 - bne 20b - PM_SET_RESTORE_REG HW_POWER_VDDDCTRL_ADDR, VDDDCTRL_BACKUP - mov r0, #24 << 10 -30: sub r0, r0, #1 - cmp r0, #0 - bne 30b - - @ ungate clk - mov r0, #(HW_CLKCTRL_EMI_ADDR & 0x000000FF) - orr r0, r0, #(HW_CLKCTRL_EMI_ADDR & 0x0000FF00) - orr r0, r0, #(HW_CLKCTRL_EMI_ADDR & 0x00FF0000) - orr r0, r0, #(HW_CLKCTRL_EMI_ADDR & 0xFF000000) - ldr r1, [r0] - bic r1, r1, #(BM_CLKCTRL_EMI_CLKGATE) - str r1, [r0] - -// PM_SET_RESTORE_REG HW_PINCTRL_EMI_DS_CTRL_ADDR, 4 @ restore normal DRAM mode mov r0, #(HW_DRAM_CTL17_ADDR & 0x000000FF) orr r0, r0, #(HW_DRAM_CTL17_ADDR & 0x0000FF00) @@ -285,10 +98,6 @@ ENTRY(mx28_cpu_standby) bic r1, r1, #BM_DRAM_CTL17_SREFRESH str r1, [r0] @ wait for it to actually happen - mov r0, #24 << 5 -12: sub r0, r0, #1 - cmp r0, #0 - bne 12b nop nop @@ -299,7 +108,7 @@ ENTRY(mx28_cpu_standby) .space 0x100 __mx28_temp_stack: - .space 128 + .word 0 #ifdef CONFIG_STMP378X_RAM_FREQ_SCALING #include "emi.inc" diff --git a/arch/arm/mach-mx28/usb_dr.c b/arch/arm/mach-mx28/usb_dr.c index 50a2f8b381af..13344ef0e26f 100644 --- a/arch/arm/mach-mx28/usb_dr.c +++ b/arch/arm/mach-mx28/usb_dr.c @@ -63,7 +63,7 @@ static struct fsl_usb2_platform_data __maybe_unused dr_utmi_config = { }; /* - * OTG resources + * resources */ static struct resource otg_resources[] = { [0] = { @@ -78,22 +78,6 @@ static struct resource otg_resources[] = { }, }; -/* - * UDC resources (same as OTG resource) - */ -static struct resource udc_resources[] = { - [0] = { - .start = (u32)USBCTRL0_PHYS_ADDR, - .end = (u32)(USBCTRL0_PHYS_ADDR + 0x1ff), - .flags = IORESOURCE_MEM, - }, - - [1] = { - .start = IRQ_USB0, - .flags = IORESOURCE_IRQ, - }, -}; - static u64 dr_udc_dmamask = ~(u32) 0; static void dr_udc_release(struct device *dev) { @@ -127,8 +111,8 @@ static struct platform_device __maybe_unused dr_otg_device = { .dma_mask = &dr_otg_dmamask, .coherent_dma_mask = 0xffffffff, }, - .resource = udc_resources, - .num_resources = ARRAY_SIZE(udc_resources), + .resource = otg_resources, + .num_resources = ARRAY_SIZE(otg_resources), }; @@ -172,5 +156,5 @@ void fsl_phy_set_power(struct fsl_xcvr_ops *this, #ifdef CONFIG_MXS_VBUS_CURRENT_DRAW fs_initcall(usb_dr_init); #else - subsys_initcall(usb_dr_init); + module_init(usb_dr_init); #endif diff --git a/arch/arm/mach-mx3/devices.c b/arch/arm/mach-mx3/devices.c index c7d9560f0850..2861ecf81235 100644 --- a/arch/arm/mach-mx3/devices.c +++ b/arch/arm/mach-mx3/devices.c @@ -891,22 +891,6 @@ static inline void mxc_init_iim(void) } #endif -static struct platform_device mxc_v4l2_device = { - .name = "mxc_v4l2_capture", - .id = 0, -}; - -static struct platform_device mxc_v4l2out_device = { - .name = "mxc_v4l2_output", - .id = 0, -}; - -static inline void mxc_init_v4l2() -{ - platform_device_register(&mxc_v4l2_device); - platform_device_register(&mxc_v4l2out_device); -} - int __init mxc_init_devices(void) { mxc_init_wdt(); @@ -926,7 +910,6 @@ int __init mxc_init_devices(void) mxc_init_vpu(); mxc_init_rnga(); mxc_init_iim(); - mxc_init_v4l2(); return 0; } diff --git a/arch/arm/mach-mx3/usb_dr.c b/arch/arm/mach-mx3/usb_dr.c index d84fea7f1a80..7331463173e9 100644 --- a/arch/arm/mach-mx3/usb_dr.c +++ b/arch/arm/mach-mx3/usb_dr.c @@ -1,5 +1,5 @@ /* - * Copyright 2005-2010 Freescale Semiconductor, Inc. All Rights Reserved. + * Copyright 2005-2009 Freescale Semiconductor, Inc. All Rights Reserved. */ /* @@ -59,7 +59,7 @@ static struct fsl_usb2_platform_data __maybe_unused dr_1504_config = { /* - * OTG resources + * resources */ static struct resource otg_resources[] = { [0] = { @@ -73,20 +73,6 @@ static struct resource otg_resources[] = { }, }; -/* - * UDC resources (same as OTG resource) - */ -static struct resource udc_resources[] = { - [0] = { - .start = (u32)(USB_OTGREGS_BASE), - .end = (u32)(USB_OTGREGS_BASE + 0x1ff), - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = MXC_INT_USB3, - .flags = IORESOURCE_IRQ, - }, -}; static u64 dr_udc_dmamask = ~(u32) 0; static void dr_udc_release(struct device *dev) @@ -110,8 +96,8 @@ static struct platform_device __maybe_unused dr_udc_device = { .dma_mask = &dr_udc_dmamask, .coherent_dma_mask = 0xffffffff, }, - .resource = udc_resources, - .num_resources = ARRAY_SIZE(udc_resources), + .resource = otg_resources, + .num_resources = ARRAY_SIZE(otg_resources), }; static struct platform_device __maybe_unused dr_otg_device = { diff --git a/arch/arm/mach-mx35/devices.c b/arch/arm/mach-mx35/devices.c index 02c971659bd4..9d030e1ecfeb 100644 --- a/arch/arm/mach-mx35/devices.c +++ b/arch/arm/mach-mx35/devices.c @@ -902,22 +902,6 @@ static inline void mxc_init_ssi(void) } #endif /* CONFIG_SND_MXC_SOC_SSI */ -static struct platform_device mxc_v4l2_device = { - .name = "mxc_v4l2_capture", - .id = 0, -}; - -static struct platform_device mxc_v4l2out_device = { - .name = "mxc_v4l2_output", - .id = 0, -}; - -static inline void mxc_init_v4l2() -{ - platform_device_register(&mxc_v4l2_device); - platform_device_register(&mxc_v4l2out_device); -} - int __init mxc_init_devices(void) { mxc_init_wdt(); @@ -937,7 +921,6 @@ int __init mxc_init_devices(void) mxc_init_gpu(); mxc_init_ssi(); mxc_init_esai(); - mxc_init_v4l2(); return 0; } diff --git a/arch/arm/mach-mx35/mx35_3stack.c b/arch/arm/mach-mx35/mx35_3stack.c index 868cf12ca2e6..35d639b5a534 100644 --- a/arch/arm/mach-mx35/mx35_3stack.c +++ b/arch/arm/mach-mx35/mx35_3stack.c @@ -605,13 +605,6 @@ static struct mxc_mmc_platform_data mmc1_data = { #endif .min_clk = 150000, .max_clk = 52000000, - /* Do not disable the eSDHC clk on MX35 3DS board, - * since SYSTEM can't boot up after the reset key - * is pressed when the SD/MMC boot mode is used. - * The root cause is that the ROM code don't ensure - * the SD/MMC clk is running when boot system. - * */ - .clk_always_on = 1, .card_inserted_state = 0, .status = sdhc_get_card_det_status, .wp_status = sdhc_write_protect, @@ -658,7 +651,6 @@ static struct mxc_mmc_platform_data mmc2_data = { .caps = MMC_CAP_4_BIT_DATA, .min_clk = 150000, .max_clk = 50000000, - .clk_always_on = 1, .card_inserted_state = 0, .status = sdhc_get_card_det_status, .wp_status = sdhc_write_protect, diff --git a/arch/arm/mach-mx35/usb_dr.c b/arch/arm/mach-mx35/usb_dr.c index 4ebb27c5342b..18f76b90907a 100644 --- a/arch/arm/mach-mx35/usb_dr.c +++ b/arch/arm/mach-mx35/usb_dr.c @@ -1,5 +1,5 @@ /* - * Copyright 2005-2010 Freescale Semiconductor, Inc. All Rights Reserved. + * Copyright 2005-2009 Freescale Semiconductor, Inc. All Rights Reserved. */ /* @@ -37,7 +37,7 @@ static struct fsl_usb2_platform_data __maybe_unused dr_utmi_config = { /* - * OTG resources + * resources */ static struct resource otg_resources[] = { [0] = { @@ -51,20 +51,6 @@ static struct resource otg_resources[] = { }, }; -/* - * UDC resources (same as OTG resource) - */ -static struct resource udc_resources[] = { - [0] = { - .start = (u32)(USB_OTGREGS_BASE), - .end = (u32)(USB_OTGREGS_BASE + 0x1ff), - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = MXC_INT_USBOTG, - .flags = IORESOURCE_IRQ, - }, -}; static u64 dr_udc_dmamask = ~(u32) 0; static void dr_udc_release(struct device *dev) @@ -88,8 +74,8 @@ static struct platform_device __maybe_unused dr_udc_device = { .dma_mask = &dr_udc_dmamask, .coherent_dma_mask = 0xffffffff, }, - .resource = udc_resources, - .num_resources = ARRAY_SIZE(udc_resources), + .resource = otg_resources, + .num_resources = ARRAY_SIZE(otg_resources), }; static struct platform_device __maybe_unused dr_otg_device = { diff --git a/arch/arm/mach-mx37/cpu.c b/arch/arm/mach-mx37/cpu.c index 3832473f781e..3729ac11ca80 100644 --- a/arch/arm/mach-mx37/cpu.c +++ b/arch/arm/mach-mx37/cpu.c @@ -25,7 +25,6 @@ #include <asm/hardware/cache-l2x0.h> void __iomem *gpc_base; -void __iomem *ccm_base; /*! * CPU initialization. It is called by fixup_mxc_board() @@ -74,7 +73,6 @@ static int __init post_cpu_init(void) iram_init(IRAM_BASE_ADDR, iram_size); gpc_base = ioremap(GPC_BASE_ADDR, SZ_4K); - ccm_base = ioremap(CCM_BASE_ADDR, SZ_4K); /* Set ALP bits to 000. Set ALP_EN bit in Arm Memory Controller reg. */ reg = __raw_readl(MXC_ARM1176_BASE + 0x1C); diff --git a/arch/arm/mach-mx37/crm_regs.h b/arch/arm/mach-mx37/crm_regs.h index bfb9bff13d46..607e7cfd5bdf 100644 --- a/arch/arm/mach-mx37/crm_regs.h +++ b/arch/arm/mach-mx37/crm_regs.h @@ -502,11 +502,6 @@ #define MXC_CCM_CCGR5_CG1_OFFSET 2 #define MXC_CCM_CCGR5_CG0_OFFSET 0 -/* CCM Register Offsets. */ -#define MXC_CCM_CDCR_OFFSET 0x6C -#define MXC_CCM_CACRR_OFFSET 0x10 -#define MXC_CCM_CDHIPR_OFFSET 0x68 - #define MXC_ARM1176_BASE IO_ADDRESS(ARM1176_BASE_ADDR) #define MXC_GPC_BASE IO_ADDRESS(GPC_BASE_ADDR) #define MXC_DPTC_LP_BASE IO_ADDRESS(GPC_BASE_ADDR + 0x80) @@ -535,11 +530,6 @@ #define MXC_GPC_PGR (MXC_GPC_BASE + 0x4) #define MXC_GPC_VCR (MXC_GPC_BASE + 0x8) -/*GPC OFFSETS */ -#define MXC_GPC_CNTR_OFFSET 0x0 -#define MXC_GPC_PGR_OFFSET 0x4 -#define MXC_GPC_VCR_OFFSET 0x8 - /* DVFS CORE */ #define MXC_DVFSTHRS (MXC_DVFS_CORE_BASE + 0x00) #define MXC_DVFSCOUN (MXC_DVFS_CORE_BASE + 0x04) diff --git a/arch/arm/mach-mx37/devices.c b/arch/arm/mach-mx37/devices.c index ce1f33112396..fd4011b36c31 100644 --- a/arch/arm/mach-mx37/devices.c +++ b/arch/arm/mach-mx37/devices.c @@ -661,11 +661,11 @@ struct mxc_dvfs_platform_data dvfs_core_data = { .reg_id = "SW1", .clk1_id = "cpu_clk", .clk2_id = "gpc_dvfs_clk", - .gpc_cntr_offset = MXC_GPC_CNTR_OFFSET, - .gpc_vcr_offset = MXC_GPC_VCR_OFFSET, - .ccm_cdcr_offset = MXC_CCM_CDCR_OFFSET, - .ccm_cacrr_offset = MXC_CCM_CACRR_OFFSET, - .ccm_cdhipr_offset = MXC_CCM_CDHIPR_OFFSET, + .gpc_cntr_reg_addr = MXC_GPC_CNTR, + .gpc_vcr_reg_addr = MXC_GPC_VCR, + .ccm_cdcr_reg_addr = MXC_CCM_CDCR, + .ccm_cacrr_reg_addr = MXC_CCM_CACRR, + .ccm_cdhipr_reg_addr = MXC_CCM_CDHIPR, .prediv_mask = 0x3800, .prediv_offset = 11, .prediv_val = 1, @@ -1168,22 +1168,6 @@ static inline void mxc_init_ssi(void) } #endif /* CONFIG_SND_MXC_SOC_SSI */ -static struct platform_device mxc_v4l2_device = { - .name = "mxc_v4l2_capture", - .id = 0, -}; - -static struct platform_device mxc_v4l2out_device = { - .name = "mxc_v4l2_output", - .id = 0, -}; - -static inline void mxc_init_v4l2() -{ - platform_device_register(&mxc_v4l2_device); - platform_device_register(&mxc_v4l2out_device); -} - int __init mxc_init_devices(void) { mxc_init_wdt(); @@ -1205,7 +1189,6 @@ int __init mxc_init_devices(void) mxc_init_rngc(); mxc_init_iim(); mxc_init_ssi(); - mxc_init_v4l2(); return 0; } diff --git a/arch/arm/mach-mx37/usb_dr.c b/arch/arm/mach-mx37/usb_dr.c index eb7fc463526c..c8cbed1cc2d4 100644 --- a/arch/arm/mach-mx37/usb_dr.c +++ b/arch/arm/mach-mx37/usb_dr.c @@ -1,5 +1,5 @@ /* - * Copyright 2005-2010 Freescale Semiconductor, Inc. All Rights Reserved. + * Copyright 2005-2009 Freescale Semiconductor, Inc. All Rights Reserved. */ /* @@ -43,7 +43,7 @@ static struct fsl_usb2_platform_data __maybe_unused dr_utmi_config = { /* - * OTG resources + * resources */ static struct resource otg_resources[] = { [0] = { @@ -57,20 +57,7 @@ static struct resource otg_resources[] = { }, }; -/* - * UDC resources (same as OTG resource) - */ -static struct resource udc_resources[] = { - [0] = { - .start = (u32)(OTG_BASE_ADDR), - .end = (u32)(OTG_BASE_ADDR + 0x620), - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = MXC_INT_USB_OTG, - .flags = IORESOURCE_IRQ, - }, -}; + static u64 dr_udc_dmamask = ~(u32) 0; static void dr_udc_release(struct device *dev) { @@ -88,8 +75,8 @@ static struct platform_device dr_udc_device = { .dma_mask = &dr_udc_dmamask, .coherent_dma_mask = 0xffffffff, }, - .resource = udc_resources, - .num_resources = ARRAY_SIZE(udc_resources), + .resource = otg_resources, + .num_resources = ARRAY_SIZE(otg_resources), }; static u64 dr_otg_dmamask = ~(u32) 0; diff --git a/arch/arm/mach-mx5/Kconfig b/arch/arm/mach-mx5/Kconfig index 7152e3c0f34f..c45880ff8521 100644 --- a/arch/arm/mach-mx5/Kconfig +++ b/arch/arm/mach-mx5/Kconfig @@ -2,14 +2,12 @@ if ARCH_MX5 config ARCH_MX51 bool "MX51" - select ARCH_MXC_IOMUX_V3 config ARCH_MX53 bool "MX53" config ARCH_MX50 bool - select ARCH_HAS_RNGC config FORCE_MAX_ZONEORDER int "MAX_ORDER" @@ -63,14 +61,6 @@ config MODULE_CCXMX51 config LATE_CPU_CLK_ENABLE bool -config MACH_MX50_RDP - bool "Support MX50 Reference Design Platform" - select ARCH_MX50 - help - Include support for MX50 RDP platform. This includes specific - configurations for the board and its peripherals. - - config MACH_CCWMX51JS bool "Support for the ConnectCore Wi-i.MX51 module, on the JSK base board" select MODULE_CCXMX51 diff --git a/arch/arm/mach-mx5/Makefile b/arch/arm/mach-mx5/Makefile index 90baa14638fe..34d8ae473789 100644 --- a/arch/arm/mach-mx5/Makefile +++ b/arch/arm/mach-mx5/Makefile @@ -5,20 +5,16 @@ # Object file lists. obj-y := system.o iomux.o cpu.o mm.o devices.o serial.o dma.o lpmodes.o pm.o \ -sdram_autogating.o bus_freq.o usb_dr.o usb_h1.o usb_h2.o dummy_gpio.o early_setup.o +sdram_autogating.o bus_freq.o usb_dr.o usb_h1.o usb_h2.o dummy_gpio.o wfi.o suspend.o early_setup.o --obj-$(CONFIG_ARCH_MX51) += clock.o --obj-$(CONFIG_ARCH_MX53) += clock.o --obj-$(CONFIG_ARCH_MX50) += clock_mx50.o -obj-$(CONFIG_ARCH_MX51) += clock.o suspend.o -obj-$(CONFIG_ARCH_MX53) += clock.o suspend.o -obj-$(CONFIG_ARCH_MX50) += clock_mx50.o dmaengine.o dma-apbh.o mx50_suspend.o mx50_ddr_freq.o mx50_wfi.o +obj-$(CONFIG_ARCH_MX51) += clock.o +obj-$(CONFIG_ARCH_MX53) += clock.o +obj-$(CONFIG_ARCH_MX50) += clock_mx50.o obj-$(CONFIG_MACH_MX51_3DS) += mx51_3stack.o mx51_3stack_gpio.o mx51_3stack_pmic_mc13892.o -obj-$(CONFIG_MACH_MX51_BABBAGE) += mx51_babbage.o mx51_babbage_pmic_mc13892.o -obj-$(CONFIG_MACH_MX53_EVK) += mx53_evk.o mx53_evk_pmic_mc13892.o -obj-$(CONFIG_MACH_MX50_ARM2) += mx50_arm2.o mx50_arm2_pmic_mc13892.o +obj-$(CONFIG_MACH_MX51_BABBAGE) += mx51_babbage.o mx51_babbage_gpio.o mx51_babbage_pmic_mc13892.o +obj-$(CONFIG_MACH_MX53_EVK) += mx53_evk.o mx53_evk_gpio.o mx53_evk_pmic_mc13892.o +obj-$(CONFIG_MACH_MX50_ARM2) += mx50_arm2.o mx50_arm2_gpio.o mx50_arm2_pmic_mc13892.o obj-$(CONFIG_MACH_CCWMX51JS) += devices_ccwmx51.o mx51_ccwmx51js.o mx51_ccwmx51js_gpio.o obj-$(CONFIG_MACH_CCMX51JS) += devices_ccwmx51.o mx51_ccwmx51js.o mx51_ccwmx51js_gpio.o obj-$(CONFIG_MXC_PMIC_MC13892) += mx51_ccwmx51js_pmic_mc13892.o -obj-$(CONFIG_MACH_MX50_RDP) += mx50_rdp.o mx50_rdp_pmic_mc13892.o diff --git a/arch/arm/mach-mx5/bus_freq.c b/arch/arm/mach-mx5/bus_freq.c index ec2addfd977b..4fcaf95e3019 100644 --- a/arch/arm/mach-mx5/bus_freq.c +++ b/arch/arm/mach-mx5/bus_freq.c @@ -27,19 +27,12 @@ #include <linux/delay.h> #include <linux/platform_device.h> #include <linux/regulator/consumer.h> -#include <linux/iram_alloc.h> -#include <linux/mutex.h> #include <mach/hardware.h> #include <mach/clock.h> #include <mach/mxc_dvfs.h> #include <mach/sdram_autogating.h> -#include <asm/mach/map.h> -#include <asm/cacheflush.h> -#include <asm/tlb.h> #include "crm_regs.h" -#define LP_LOW_VOLTAGE 1050000 -#define LP_NORMAL_VOLTAGE 1250000 #define LP_APM_CLK 24000000 #define NAND_LP_APM_CLK 12000000 #define AXI_A_NORMAL_CLK 166250000 @@ -48,9 +41,6 @@ #define AHB_CLK_NORMAL_DIV AXI_B_CLK_NORMAL_DIV #define EMI_SLOW_CLK_NORMAL_DIV AXI_B_CLK_NORMAL_DIV #define NFC_CLK_NORMAL_DIV 4 -#define SPIN_DELAY 1000000 /* in nanoseconds */ - -DEFINE_SPINLOCK(ddr_freq_lock); static unsigned long lp_normal_rate; static unsigned long lp_med_rate; @@ -59,24 +49,25 @@ static unsigned long ddr_low_rate; static struct clk *ddr_clk; static struct clk *pll1_sw_clk; -static struct clk *pll1; static struct clk *pll2; static struct clk *pll3; -static struct clk *pll4; static struct clk *main_bus_clk; static struct clk *axi_a_clk; static struct clk *axi_b_clk; static struct clk *cpu_clk; static struct clk *ddr_hf_clk; +static struct clk *nfc_clk; static struct clk *ahb_clk; +static struct clk *vpu_clk; +static struct clk *vpu_core_clk; +static struct clk *emi_slow_clk; static struct clk *ddr_clk; +static struct clk *ipu_clk; static struct clk *periph_apm_clk; static struct clk *lp_apm; static struct clk *osc; static struct clk *gpc_dvfs_clk; static struct clk *emi_garb_clk; -static void __iomem *pll1_base; -static void __iomem *pll4_base; struct regulator *lp_regulator; int low_bus_freq_mode; @@ -88,7 +79,6 @@ char *lp_reg_id = "SW2"; static struct cpu_wp *cpu_wp_tbl; static struct device *busfreq_dev; static int busfreq_suspended; -static int cpu_podf; /* True if bus_frequency is scaled not using DVFS-PER */ int bus_freq_scaling_is_active; @@ -96,20 +86,8 @@ int cpu_wp_nr; int lp_high_freq; int lp_med_freq; -void enter_lpapm_mode_mx50(void); -void enter_lpapm_mode_mx51(void); -void exit_lpapm_mode_mx50(void); -void exit_lpapm_mode_mx51(void); -void *ddr_freq_change_iram_base; -void (*change_ddr_freq)(void *ccm_addr, void *databahn_addr, u32 freq) = NULL; - -extern void mx50_ddr_freq_change(u32 ccm_base, - u32 databahn_addr, u32 freq); extern int dvfs_core_is_active; extern struct cpu_wp *(*get_cpu_wp)(int *wp); -extern void propagate_rate(struct clk *tclk); -extern void __iomem *ccm_base; -extern void __iomem *databahn_base; struct dvfs_wp dvfs_core_setpoint[] = { {33, 8, 33, 10, 10, 0x08}, @@ -120,198 +98,75 @@ struct dvfs_wp dvfs_core_setpoint[] = { int set_low_bus_freq(void) { u32 reg; - struct timespec nstimeofday; - struct timespec curtime; if (busfreq_suspended) return 0; if (bus_freq_scaling_initialized) { /* can not enter low bus freq, when cpu is in highest freq */ - if (clk_get_rate(cpu_clk) != - cpu_wp_tbl[cpu_wp_nr - 1].cpu_rate) { + if (clk_get_rate(cpu_clk) != cpu_wp_tbl[cpu_wp_nr - 1].cpu_rate) + return 0; + + /* currently not support on mx53 */ + if (cpu_is_mx53()) return 0; - } stop_dvfs_per(); stop_sdram_autogating(); + /*Change the DDR freq to 133Mhz. */ + clk_set_rate(ddr_hf_clk, + clk_round_rate(ddr_hf_clk, ddr_low_rate)); + /* Set PLL3 to 133Mhz if no-one is using it. */ - if ((clk_get_usecount(pll3) == 0) && !cpu_is_mx53()) { + if (clk_get_usecount(pll3) == 0) { u32 pll3_rate = clk_get_rate(pll3); clk_enable(pll3); clk_set_rate(pll3, clk_round_rate(pll3, 133000000)); - if (cpu_is_mx50()) - enter_lpapm_mode_mx50(); - else - enter_lpapm_mode_mx51(); - - /* Set PLL3 back to original rate. */ - clk_set_rate(pll3, clk_round_rate(pll3, pll3_rate)); - clk_disable(pll3); - - } else if (cpu_is_mx53()) { - /*Change the DDR freq to 133Mhz. */ - clk_set_rate(ddr_hf_clk, - clk_round_rate(ddr_hf_clk, ddr_low_rate)); - - /* move cpu clk to pll2, 400 / 3 = 133Mhz for cpu */ - clk_set_parent(pll1_sw_clk, pll2); - - cpu_podf = __raw_readl(MXC_CCM_CACRR); - reg = __raw_readl(MXC_CCM_CDHIPR); - if ((reg & MXC_CCM_CDHIPR_ARM_PODF_BUSY) == 0) - __raw_writel(0x2, MXC_CCM_CACRR); - else - printk(KERN_DEBUG "ARM_PODF still in busy!!!!\n"); - - /* ahb = 400/8, axi_b = 400/8, axi_a = 133*/ + /* Set the parent of Periph_apm_clk to be PLL3 */ + clk_set_parent(periph_apm_clk, pll3); + clk_set_parent(main_bus_clk, periph_apm_clk); + + /* Set the AHB dividers to be 1. */ + /* Set the dividers to be 1, so the clock rates + * are at 133MHz. + */ reg = __raw_readl(MXC_CCM_CBCDR); reg &= ~(MXC_CCM_CBCDR_AXI_A_PODF_MASK - | MXC_CCM_CBCDR_AXI_B_PODF_MASK - | MXC_CCM_CBCDR_AHB_PODF_MASK); - reg |= (2 << MXC_CCM_CBCDR_AXI_A_PODF_OFFSET - | 7 << MXC_CCM_CBCDR_AXI_B_PODF_OFFSET - | 7 << MXC_CCM_CBCDR_AHB_PODF_OFFSET); + | MXC_CCM_CBCDR_AXI_B_PODF_MASK + | MXC_CCM_CBCDR_AHB_PODF_MASK + | MXC_CCM_CBCDR_EMI_PODF_MASK + | MXC_CCM_CBCDR_NFC_PODF_OFFSET); + reg |= (0 << MXC_CCM_CBCDR_AXI_A_PODF_OFFSET + | 0 << MXC_CCM_CBCDR_AXI_B_PODF_OFFSET + | 0 << MXC_CCM_CBCDR_AHB_PODF_OFFSET + | 0 << MXC_CCM_CBCDR_EMI_PODF_OFFSET + | 3 << MXC_CCM_CBCDR_NFC_PODF_OFFSET); __raw_writel(reg, MXC_CCM_CBCDR); - getnstimeofday(&nstimeofday); - while (__raw_readl(MXC_CCM_CDHIPR) & - (MXC_CCM_CDHIPR_AXI_A_PODF_BUSY | - MXC_CCM_CDHIPR_AXI_B_PODF_BUSY | - MXC_CCM_CDHIPR_AHB_PODF_BUSY)) { - getnstimeofday(&curtime); - if (curtime.tv_nsec - nstimeofday.tv_nsec - > SPIN_DELAY) - panic("low bus freq set rate error\n"); - } + clk_enable(emi_garb_clk); + while (__raw_readl(MXC_CCM_CDHIPR) & 0x1F) + udelay(10); + clk_disable(emi_garb_clk); - /* keep this infront of propagating */ - low_bus_freq_mode = 1; - high_bus_freq_mode = 0; + /* Set the source of Periph_APM_Clock to be lp-apm. */ + clk_set_parent(periph_apm_clk, lp_apm); - propagate_rate(main_bus_clk); - propagate_rate(pll1_sw_clk); + /* Set PLL3 back to original rate. */ + clk_set_rate(pll3, clk_round_rate(pll3, pll3_rate)); + clk_disable(pll3); - if (clk_get_usecount(pll1) == 0) { - reg = __raw_readl(pll1_base + MXC_PLL_DP_CTL); - reg &= ~MXC_PLL_DP_CTL_UPEN; - __raw_writel(reg, pll1_base + MXC_PLL_DP_CTL); - } - if (clk_get_usecount(pll4) == 0) { - reg = __raw_readl(pll4_base + MXC_PLL_DP_CTL); - reg &= ~MXC_PLL_DP_CTL_UPEN; - __raw_writel(reg, pll4_base + MXC_PLL_DP_CTL); - } + low_bus_freq_mode = 1; + high_bus_freq_mode = 0; } } return 0; } -void enter_lpapm_mode_mx50() -{ - u32 reg; - unsigned long flags; - - spin_lock_irqsave(&ddr_freq_lock, flags); - - /* Set the parent of main_bus_clk to be PLL3 */ - clk_set_parent(main_bus_clk, pll3); - - /* Set the AHB dividers to be 1. */ - /* Set the dividers to be 1, so the clock rates - * are at 133MHz. - */ - reg = __raw_readl(MXC_CCM_CBCDR); - reg &= ~(MXC_CCM_CBCDR_AXI_A_PODF_MASK - | MXC_CCM_CBCDR_AXI_B_PODF_MASK - | MXC_CCM_CBCDR_AHB_PODF_MASK - | MX50_CCM_CBCDR_WEIM_PODF_MASK); - reg |= (0 << MXC_CCM_CBCDR_AXI_A_PODF_OFFSET - | 0 << MXC_CCM_CBCDR_AXI_B_PODF_OFFSET - | 0 << MXC_CCM_CBCDR_AHB_PODF_OFFSET - | 0 << MX50_CCM_CBCDR_WEIM_PODF_OFFSET); - __raw_writel(reg, MXC_CCM_CBCDR); - while (__raw_readl(MXC_CCM_CDHIPR) & 0x0F) - udelay(10); - low_bus_freq_mode = 1; - high_bus_freq_mode = 0; - - /* Set the source of main_bus_clk to be lp-apm. */ - clk_set_parent(main_bus_clk, lp_apm); - - /* Set SYS_CLK to 24MHz. sourced from XTAL*/ - /* Turn on the XTAL_CLK_GATE. */ - reg = __raw_readl(MXC_CCM_CLK_SYS); - reg |= 3 << MXC_CCM_CLK_SYS_SYS_XTAL_CLKGATE_OFFSET; - __raw_writel(reg, MXC_CCM_CLK_SYS); - - /* Set the divider. */ - reg = __raw_readl(MXC_CCM_CLK_SYS); - reg &= ~MXC_CCM_CLK_SYS_DIV_XTAL_MASK; - reg |= 1 << MXC_CCM_CLK_SYS_DIV_XTAL_OFFSET; - __raw_writel(reg, MXC_CCM_CLK_SYS); - while (__raw_readl(MXC_CCM_CSR2) & 0x1) - udelay(10); - - /* Set the source to be XTAL. */ - reg = __raw_readl(MXC_CCM_CLKSEQ_BYPASS); - reg &= ~0x1; - __raw_writel(reg, MXC_CCM_CLKSEQ_BYPASS); - while (!(__raw_readl(MXC_CCM_CSR2) & 0x400)) - udelay(10); - - /* Turn OFF the PLL_CLK_GATE. */ - reg = __raw_readl(MXC_CCM_CLK_SYS); - reg &= ~MXC_CCM_CLK_SYS_SYS_PLL_CLKGATE_MASK; - __raw_writel(reg, MXC_CCM_CLK_SYS); - spin_unlock_irqrestore(&ddr_freq_lock, flags); - -} - -void enter_lpapm_mode_mx51() -{ - u32 reg; - - /*Change the DDR freq to 133Mhz. */ - clk_set_rate(ddr_hf_clk, - clk_round_rate(ddr_hf_clk, ddr_low_rate)); - - /* Set the parent of Periph_apm_clk to be PLL3 */ - clk_set_parent(periph_apm_clk, pll3); - clk_set_parent(main_bus_clk, periph_apm_clk); - - /* Set the dividers to be 1, so the clock rates - * are at 133MHz. - */ - reg = __raw_readl(MXC_CCM_CBCDR); - reg &= ~(MXC_CCM_CBCDR_AXI_A_PODF_MASK - | MXC_CCM_CBCDR_AXI_B_PODF_MASK - | MXC_CCM_CBCDR_AHB_PODF_MASK - | MXC_CCM_CBCDR_EMI_PODF_MASK - | MXC_CCM_CBCDR_NFC_PODF_OFFSET); - reg |= (0 << MXC_CCM_CBCDR_AXI_A_PODF_OFFSET - | 0 << MXC_CCM_CBCDR_AXI_B_PODF_OFFSET - | 0 << MXC_CCM_CBCDR_AHB_PODF_OFFSET - | 0 << MXC_CCM_CBCDR_EMI_PODF_OFFSET - | 3 << MXC_CCM_CBCDR_NFC_PODF_OFFSET); - __raw_writel(reg, MXC_CCM_CBCDR); - - clk_enable(emi_garb_clk); - while (__raw_readl(MXC_CCM_CDHIPR) & 0x1F) - udelay(10); - clk_disable(emi_garb_clk); - - /* Set the source of Periph_APM_Clock to be lp-apm. */ - clk_set_parent(periph_apm_clk, lp_apm); -} - int set_high_bus_freq(int high_bus_freq) { u32 reg; - struct timespec nstimeofday; - struct timespec curtime; if (bus_freq_scaling_initialized) { @@ -319,65 +174,48 @@ int set_high_bus_freq(int high_bus_freq) if (low_bus_freq_mode) { /* Relock PLL3 to 133MHz */ - if ((clk_get_usecount(pll3) == 0) && !cpu_is_mx53()) { + if (clk_get_usecount(pll3) == 0) { u32 pll3_rate = clk_get_rate(pll3); clk_enable(pll3); clk_set_rate(pll3, clk_round_rate(pll3, 133000000)); - if (cpu_is_mx50()) - exit_lpapm_mode_mx50(); - else - exit_lpapm_mode_mx51(); - - /* Relock PLL3 to its original rate */ - clk_set_rate(pll3, - clk_round_rate(pll3, pll3_rate)); - clk_disable(pll3); - } else if (cpu_is_mx53()) { - /* move cpu clk to pll1 */ - reg = __raw_readl(MXC_CCM_CDHIPR); - if ((reg & MXC_CCM_CDHIPR_ARM_PODF_BUSY) == 0) - __raw_writel(cpu_podf & 0x7, - MXC_CCM_CACRR); - else - printk(KERN_DEBUG - "ARM_PODF still in busy!!!!\n"); - - clk_set_parent(pll1_sw_clk, pll1); - - /* ahb = 400/3, axi_b = 400/3, axi_a = 400*/ + clk_set_parent(periph_apm_clk, pll3); + /* Set the dividers to the default dividers */ reg = __raw_readl(MXC_CCM_CBCDR); reg &= ~(MXC_CCM_CBCDR_AXI_A_PODF_MASK | MXC_CCM_CBCDR_AXI_B_PODF_MASK - | MXC_CCM_CBCDR_AHB_PODF_MASK); - reg |= (0 << MXC_CCM_CBCDR_AXI_A_PODF_OFFSET - | 2 << MXC_CCM_CBCDR_AXI_B_PODF_OFFSET - | 2 << MXC_CCM_CBCDR_AHB_PODF_OFFSET); + | MXC_CCM_CBCDR_AHB_PODF_MASK + | MXC_CCM_CBCDR_EMI_PODF_MASK + | MXC_CCM_CBCDR_NFC_PODF_OFFSET); + reg |= (3 << MXC_CCM_CBCDR_AXI_A_PODF_OFFSET + | 4 << MXC_CCM_CBCDR_AXI_B_PODF_OFFSET + | 4 << MXC_CCM_CBCDR_AHB_PODF_OFFSET + | 4 << MXC_CCM_CBCDR_EMI_PODF_OFFSET + | 3 << MXC_CCM_CBCDR_NFC_PODF_OFFSET); __raw_writel(reg, MXC_CCM_CBCDR); - getnstimeofday(&nstimeofday); - while (__raw_readl(MXC_CCM_CDHIPR) & - (MXC_CCM_CDHIPR_AXI_A_PODF_BUSY | - MXC_CCM_CDHIPR_AXI_B_PODF_BUSY | - MXC_CCM_CDHIPR_AHB_PODF_BUSY)) { - getnstimeofday(&curtime); - if (curtime.tv_nsec - - nstimeofday.tv_nsec - > SPIN_DELAY) - panic("bus freq error\n"); - } - - /* keep this infront of propagating */ - low_bus_freq_mode = 1; - high_bus_freq_mode = 0; + clk_enable(emi_garb_clk); + while (__raw_readl(MXC_CCM_CDHIPR) & 0x1F) + udelay(10); - propagate_rate(main_bus_clk); - propagate_rate(pll1_sw_clk); - /*Change the DDR freq to mormal_rate*/ - clk_set_rate(ddr_hf_clk, - clk_round_rate(ddr_hf_clk, ddr_normal_rate)); + low_bus_freq_mode = 0; + high_bus_freq_mode = 1; + clk_disable(emi_garb_clk); + + /*Set the main_bus_clk parent to be PLL2. */ + clk_set_parent(main_bus_clk, pll2); + + /* Relock PLL3 to its original rate */ + clk_set_rate(pll3, + clk_round_rate(pll3, pll3_rate)); + clk_disable(pll3); } + + /*Change the DDR freq to 200MHz*/ + clk_set_rate(ddr_hf_clk, + clk_round_rate(ddr_hf_clk, ddr_normal_rate)); + start_dvfs_per(); } if (bus_freq_scaling_is_active) { @@ -418,105 +256,11 @@ int set_high_bus_freq(int high_bus_freq) return 0; } -void exit_lpapm_mode_mx50() -{ - u32 reg; - unsigned long flags; - - spin_lock_irqsave(&ddr_freq_lock, flags); - - /* Set SYS_CLK to source from PLL1 */ - /* Set sys_clk back to 200MHz. */ - /* Set the divider to 4. */ - reg = __raw_readl(MXC_CCM_CLK_SYS); - reg &= ~MXC_CCM_CLK_SYS_DIV_PLL_MASK; - reg |= 0x4 << MXC_CCM_CLK_SYS_DIV_PLL_OFFSET; - __raw_writel(reg, MXC_CCM_CLK_SYS); - udelay(100); - - /* Turn ON the PLL CLK_GATE. */ - reg = __raw_readl(MXC_CCM_CLK_SYS); - reg |= 3 << MXC_CCM_CLK_SYS_SYS_PLL_CLKGATE_OFFSET; - __raw_writel(reg, MXC_CCM_CLK_SYS); - - /* Source the SYS_CLK from PLL */ - reg = __raw_readl(MXC_CCM_CLKSEQ_BYPASS); - reg |= 0x3; - __raw_writel(reg, MXC_CCM_CLKSEQ_BYPASS); - while (__raw_readl(MXC_CCM_CSR2) & 0x400) - udelay(10); - - /* Turn OFF the XTAL_CLK_GATE. */ - reg = __raw_readl(MXC_CCM_CLK_SYS); - reg &= ~MXC_CCM_CLK_SYS_SYS_XTAL_CLKGATE_MASK; - __raw_writel(reg, MXC_CCM_CLK_SYS); - - clk_set_parent(main_bus_clk, pll3); - - /* Set the dividers to the default dividers */ - reg = __raw_readl(MXC_CCM_CBCDR); - reg &= ~(MXC_CCM_CBCDR_AXI_A_PODF_MASK - | MXC_CCM_CBCDR_AXI_B_PODF_MASK - | MXC_CCM_CBCDR_AHB_PODF_MASK - | MX50_CCM_CBCDR_WEIM_PODF_MASK); - reg |= (0 << MXC_CCM_CBCDR_AXI_A_PODF_OFFSET - |1 << MXC_CCM_CBCDR_AXI_B_PODF_OFFSET - |2 << MXC_CCM_CBCDR_AHB_PODF_OFFSET - |0 << MX50_CCM_CBCDR_WEIM_PODF_OFFSET); - __raw_writel(reg, MXC_CCM_CBCDR); - - while (__raw_readl(MXC_CCM_CDHIPR) & 0xF) - udelay(10); - - low_bus_freq_mode = 0; - high_bus_freq_mode = 1; - - /*Set the main_bus_clk parent to be PLL2. */ - clk_set_parent(main_bus_clk, pll2); - spin_unlock_irqrestore(&ddr_freq_lock, flags); - - udelay(100); -} - -void exit_lpapm_mode_mx51() -{ - u32 reg; - - clk_set_parent(periph_apm_clk, pll3); - - /* Set the dividers to the default dividers */ - reg = __raw_readl(MXC_CCM_CBCDR); - reg &= ~(MXC_CCM_CBCDR_AXI_A_PODF_MASK - | MXC_CCM_CBCDR_AXI_B_PODF_MASK - | MXC_CCM_CBCDR_AHB_PODF_MASK - | MXC_CCM_CBCDR_EMI_PODF_MASK - | MXC_CCM_CBCDR_NFC_PODF_OFFSET); - reg |= (3 << MXC_CCM_CBCDR_AXI_A_PODF_OFFSET - | 4 << MXC_CCM_CBCDR_AXI_B_PODF_OFFSET - | 4 << MXC_CCM_CBCDR_AHB_PODF_OFFSET - | 4 << MXC_CCM_CBCDR_EMI_PODF_OFFSET - | 3 << MXC_CCM_CBCDR_NFC_PODF_OFFSET); - __raw_writel(reg, MXC_CCM_CBCDR); - - clk_enable(emi_garb_clk); - while (__raw_readl(MXC_CCM_CDHIPR) & 0x1F) - udelay(10); - - low_bus_freq_mode = 0; - high_bus_freq_mode = 1; - clk_disable(emi_garb_clk); - - /*Set the main_bus_clk parent to be PLL2. */ - clk_set_parent(main_bus_clk, pll2); - - /*Change the DDR freq to 200MHz*/ - clk_set_rate(ddr_hf_clk, - clk_round_rate(ddr_hf_clk, ddr_normal_rate)); -} - int low_freq_bus_used(void) { - if ((lp_high_freq == 0) + if ((clk_get_usecount(ipu_clk) == 0) + && (clk_get_usecount(vpu_clk) == 0) + && (lp_high_freq == 0) && (lp_med_freq == 0)) return 1; else @@ -542,7 +286,8 @@ static ssize_t bus_freq_scaling_enable_store(struct device *dev, { u32 reg; - if (strncmp(buf, "1", 1) == 0) { + + if (strstr(buf, "1") != NULL) { if (dvfs_per_active()) { printk(KERN_INFO "bus frequency scaling cannot be\ enabled when DVFS-PER is active\n"); @@ -557,12 +302,12 @@ static ssize_t bus_freq_scaling_enable_store(struct device *dev, bus_freq_scaling_is_active = 1; set_high_bus_freq(0); - } else if (strncmp(buf, "0", 1) == 0) { + } + else if (strstr(buf, "0") != NULL) { if (bus_freq_scaling_is_active) set_high_bus_freq(1); bus_freq_scaling_is_active = 0; } - return size; } @@ -595,11 +340,6 @@ static int __devinit busfreq_probe(struct platform_device *pdev) { int err = 0; unsigned long pll2_rate, pll1_rate; - unsigned long iram_paddr; - - pll1_base = ioremap(MX53_BASE_ADDR(PLL1_BASE_ADDR), SZ_4K); - if (cpu_is_mx53()) - pll4_base = ioremap(MX53_BASE_ADDR(PLL4_BASE_ADDR), SZ_4K); busfreq_dev = &pdev->dev; @@ -616,32 +356,41 @@ static int __devinit busfreq_probe(struct platform_device *pdev) return PTR_ERR(pll1_sw_clk); } - pll1 = clk_get(NULL, "pll1_main_clk"); - if (IS_ERR(pll1)) { - printk(KERN_DEBUG "%s: failed to get pll1\n", __func__); - return PTR_ERR(pll1); - } - pll2 = clk_get(NULL, "pll2"); if (IS_ERR(pll2)) { printk(KERN_DEBUG "%s: failed to get pll2\n", __func__); return PTR_ERR(pll2); } + pll1_rate = clk_get_rate(pll1_sw_clk); + pll2_rate = clk_get_rate(pll2); + + if (pll2_rate == 665000000) { + /* for mx51 */ + lp_normal_rate = pll2_rate / 5; + lp_med_rate = pll2_rate / 8; + ddr_normal_rate = pll1_rate / 4; /* 200M */ + ddr_low_rate = pll1_rate / 6; /* 133M */ + } else if (pll2_rate == 600000000) { + /* for mx53 evk rev.A */ + lp_normal_rate = pll2_rate / 5; + lp_med_rate = pll2_rate / 8; + ddr_normal_rate = pll2_rate / 2; + ddr_low_rate = pll2_rate / 2; + } else if (pll2_rate == 400000000) { + /* for mx53 evk rev.B */ + lp_normal_rate = pll2_rate / 3; + lp_med_rate = pll2_rate / 5; + ddr_normal_rate = pll2_rate / 1; + ddr_low_rate = pll2_rate / 3; + } + pll3 = clk_get(NULL, "pll3"); if (IS_ERR(pll3)) { printk(KERN_DEBUG "%s: failed to get pll3\n", __func__); return PTR_ERR(pll3); } - if (cpu_is_mx53()) { - pll4 = clk_get(NULL, "pll4"); - if (IS_ERR(pll4)) { - printk(KERN_DEBUG "%s: failed to get pll4\n", __func__); - return PTR_ERR(pll4); - } - } - axi_a_clk = clk_get(NULL, "axi_a_clk"); if (IS_ERR(axi_a_clk)) { printk(KERN_DEBUG "%s: failed to get axi_a_clk\n", @@ -656,14 +405,10 @@ static int __devinit busfreq_probe(struct platform_device *pdev) return PTR_ERR(axi_b_clk); } - ddr_clk = clk_get(NULL, "ddr_clk"); - if (IS_ERR(ddr_clk)) { - printk(KERN_DEBUG "%s: failed to get ddr_clk\n", - __func__); - return PTR_ERR(ddr_clk); - } - - ddr_hf_clk = clk_get_parent(ddr_clk); + if (cpu_is_mx51()) + ddr_hf_clk = clk_get(NULL, "ddr_hf_clk"); + else + ddr_hf_clk = clk_get(NULL, "axi_a_clk"); if (IS_ERR(ddr_hf_clk)) { printk(KERN_DEBUG "%s: failed to get ddr_hf_clk\n", @@ -671,6 +416,20 @@ static int __devinit busfreq_probe(struct platform_device *pdev) return PTR_ERR(ddr_hf_clk); } + emi_slow_clk = clk_get(NULL, "emi_slow_clk"); + if (IS_ERR(emi_slow_clk)) { + printk(KERN_DEBUG "%s: failed to get emi_slow_clk\n", + __func__); + return PTR_ERR(emi_slow_clk); + } + + nfc_clk = clk_get(NULL, "nfc_clk"); + if (IS_ERR(nfc_clk)) { + printk(KERN_DEBUG "%s: failed to get nfc_clk\n", + __func__); + return PTR_ERR(nfc_clk); + } + ahb_clk = clk_get(NULL, "ahb_clk"); if (IS_ERR(ahb_clk)) { printk(KERN_DEBUG "%s: failed to get ahb_clk\n", @@ -678,6 +437,20 @@ static int __devinit busfreq_probe(struct platform_device *pdev) return PTR_ERR(ahb_clk); } + vpu_core_clk = clk_get(NULL, "vpu_core_clk"); + if (IS_ERR(vpu_core_clk)) { + printk(KERN_DEBUG "%s: failed to get vpu_core_clk\n", + __func__); + return PTR_ERR(vpu_core_clk); + } + + ddr_clk = clk_get(NULL, "ddr_clk"); + if (IS_ERR(ddr_clk)) { + printk(KERN_DEBUG "%s: failed to get ddr_clk\n", + __func__); + return PTR_ERR(ddr_clk); + } + cpu_clk = clk_get(NULL, "cpu_clk"); if (IS_ERR(cpu_clk)) { printk(KERN_DEBUG "%s: failed to get cpu_clk\n", @@ -685,25 +458,35 @@ static int __devinit busfreq_probe(struct platform_device *pdev) return PTR_ERR(cpu_clk); } + ipu_clk = clk_get(NULL, "ipu_clk"); + if (IS_ERR(ipu_clk)) { + printk(KERN_DEBUG "%s: failed to get ipu_clk\n", + __func__); + return PTR_ERR(ipu_clk); + } + if (cpu_is_mx51()) emi_garb_clk = clk_get(NULL, "emi_garb_clk"); - else if (cpu_is_mx53()) - emi_garb_clk = clk_get(NULL, "emi_intr_clk.1"); else - emi_garb_clk = clk_get(NULL, "ocram_clk"); + emi_garb_clk = clk_get(NULL, "emi_intr_clk.1"); if (IS_ERR(emi_garb_clk)) { printk(KERN_DEBUG "%s: failed to get emi_garb_clk\n", __func__); return PTR_ERR(emi_garb_clk); } - if (cpu_is_mx51() || cpu_is_mx53()) { - periph_apm_clk = clk_get(NULL, "periph_apm_clk"); - if (IS_ERR(periph_apm_clk)) { - printk(KERN_DEBUG "%s: failed to get periph_apm_clk\n", - __func__); - return PTR_ERR(periph_apm_clk); - } + vpu_clk = clk_get(NULL, "vpu_clk"); + if (IS_ERR(vpu_clk)) { + printk(KERN_DEBUG "%s: failed to get vpu_clk\n", + __func__); + return PTR_ERR(vpu_clk); + } + + periph_apm_clk = clk_get(NULL, "periph_apm_clk"); + if (IS_ERR(periph_apm_clk)) { + printk(KERN_DEBUG "%s: failed to get periph_apm_clk\n", + __func__); + return PTR_ERR(periph_apm_clk); } lp_apm = clk_get(NULL, "lp_apm"); @@ -732,49 +515,6 @@ static int __devinit busfreq_probe(struct platform_device *pdev) return err; } - pll1_rate = clk_get_rate(pll1_sw_clk); - pll2_rate = clk_get_rate(pll2); - - if (pll2_rate == 665000000) { - /* for mx51 */ - lp_normal_rate = pll2_rate / 5; - lp_med_rate = pll2_rate / 8; - ddr_normal_rate = pll1_rate / 4; /* 200M */ - ddr_low_rate = pll1_rate / 6; /* 133M */ - } else if (pll2_rate == 600000000) { - /* for mx53 evk rev.A */ - lp_normal_rate = pll2_rate / 5; - lp_med_rate = pll2_rate / 8; - ddr_normal_rate = pll2_rate / 2; - ddr_low_rate = pll2_rate / 2; - } else if (pll2_rate == 400000000) { - /* for mx53 evk rev.B */ - lp_normal_rate = pll2_rate / 3; - lp_med_rate = pll2_rate / 5; - if (cpu_is_mx53()) { - ddr_normal_rate = pll2_rate / 1; - ddr_low_rate = pll2_rate / 3; - } else if (cpu_is_mx50()) { - ddr_normal_rate = clk_get_rate(ddr_clk); - ddr_low_rate = LP_APM_CLK; - } - } - if (cpu_is_mx50()) { - iram_alloc(SZ_8K, &iram_paddr); - /* Need to remap the area here since we want the memory region - to be executable. */ - ddr_freq_change_iram_base = __arm_ioremap(iram_paddr, - SZ_8K, MT_HIGH_VECTORS); - memcpy(ddr_freq_change_iram_base, mx50_ddr_freq_change, SZ_8K); - change_ddr_freq = (void *)ddr_freq_change_iram_base; - - lp_regulator = regulator_get(NULL, "SW2"); - if (IS_ERR(lp_regulator)) { - printk(KERN_DEBUG - "%s: failed to get lp regulator\n", __func__); - return PTR_ERR(lp_regulator); - } - } cpu_wp_tbl = get_cpu_wp(&cpu_wp_nr); low_bus_freq_mode = 0; high_bus_freq_mode = 1; diff --git a/arch/arm/mach-mx5/clock.c b/arch/arm/mach-mx5/clock.c index 5ec89a6570cd..09ea14084278 100644 --- a/arch/arm/mach-mx5/clock.c +++ b/arch/arm/mach-mx5/clock.c @@ -405,12 +405,7 @@ static int _clk_pll_enable(struct clk *clk) struct timespec curtime; pllbase = _get_pll_base(clk); - reg = __raw_readl(pllbase + MXC_PLL_DP_CTL); - - if (reg & MXC_PLL_DP_CTL_UPEN) - return 0; - - reg |= MXC_PLL_DP_CTL_UPEN; + reg = __raw_readl(pllbase + MXC_PLL_DP_CTL) | MXC_PLL_DP_CTL_UPEN; __raw_writel(reg, pllbase + MXC_PLL_DP_CTL); /* Wait for lock */ @@ -4742,15 +4737,15 @@ int __init mx53_clocks_init(unsigned long ckil, unsigned long osc, unsigned long 1 << MXC_CCM_CCGR5_CG6_OFFSET | 3 << MXC_CCM_CCGR5_CG7_OFFSET | 1 << MXC_CCM_CCGR5_CG8_OFFSET | - 1 << MXC_CCM_CCGR5_CG9_OFFSET | + 3 << MXC_CCM_CCGR5_CG9_OFFSET | 1 << MXC_CCM_CCGR5_CG10_OFFSET | 3 << MXC_CCM_CCGR5_CG11_OFFSET, MXC_CCM_CCGR5); - __raw_writel(1 << MXC_CCM_CCGR6_CG0_OFFSET | + __raw_writel(3 << MXC_CCM_CCGR6_CG0_OFFSET | 3 << MXC_CCM_CCGR6_CG1_OFFSET | - 1 << MXC_CCM_CCGR6_CG4_OFFSET | - 1 << MXC_CCM_CCGR6_CG8_OFFSET | - 1 << MXC_CCM_CCGR6_CG9_OFFSET | + 3 << MXC_CCM_CCGR6_CG4_OFFSET | + 3 << MXC_CCM_CCGR6_CG8_OFFSET | + 3 << MXC_CCM_CCGR6_CG9_OFFSET | 3 << MXC_CCM_CCGR6_CG12_OFFSET | 3 << MXC_CCM_CCGR6_CG13_OFFSET , MXC_CCM_CCGR6); diff --git a/arch/arm/mach-mx5/clock_mx50.c b/arch/arm/mach-mx5/clock_mx50.c index a2a3c82fba77..6bd7fd3b96aa 100644 --- a/arch/arm/mach-mx5/clock_mx50.c +++ b/arch/arm/mach-mx5/clock_mx50.c @@ -39,18 +39,9 @@ static struct clk pll1_main_clk; static struct clk pll1_sw_clk; static struct clk pll2_sw_clk; static struct clk pll3_sw_clk; -static struct clk apbh_dma_clk; -static struct clk apll_clk; -static struct clk pfd0_clk; -static struct clk pfd1_clk; -static struct clk pfd2_clk; -static struct clk pfd3_clk; -static struct clk pfd4_clk; -static struct clk pfd5_clk; -static struct clk pfd6_clk; -static struct clk pfd7_clk; +static struct clk pll4_sw_clk; static struct clk lp_apm_clk; -static struct clk weim_clk[]; +static struct clk weim_clk; static struct clk ddr_clk; static struct clk axi_a_clk; static struct clk axi_b_clk; @@ -61,30 +52,13 @@ static struct cpu_wp *cpu_wp_tbl; static void __iomem *pll1_base; static void __iomem *pll2_base; static void __iomem *pll3_base; -static void __iomem *apll_base; +static void __iomem *pll4_base; extern int cpu_wp_nr; extern int lp_high_freq; extern int lp_med_freq; -void __iomem *databahn; -#define DDR_SYNC_MODE 0x30000 #define SPIN_DELAY 1000000 /* in nanoseconds */ -#define WAIT(exp, timeout) \ -({ \ - struct timespec nstimeofday; \ - struct timespec curtime; \ - int result = 1; \ - getnstimeofday(&nstimeofday); \ - while (!(exp)) { \ - getnstimeofday(&curtime); \ - if ((curtime.tv_nsec - nstimeofday.tv_nsec) > (timeout)) { \ - result = 0; \ - break; \ - } \ - } \ - result; \ -}) extern int mxc_jtag_enabled; extern int uart_at_24; @@ -249,6 +223,8 @@ static inline void __iomem *_get_pll_base(struct clk *pll) return pll2_base; else if (pll == &pll3_sw_clk) return pll3_base; + else if (pll == &pll4_sw_clk) + return pll4_base; else BUG(); @@ -270,229 +246,48 @@ static struct clk osc_clk = { .flags = RATE_PROPAGATES, }; -static int apll_enable(struct clk *clk) -{ - __raw_writel(1, apll_base + MXC_ANADIG_MISC_SET); - return 0; -} - -static void apll_disable(struct clk *clk) -{ - __raw_writel(1, apll_base + MXC_ANADIG_MISC_CLR); -} - static struct clk apll_clk = { .name = "apll", - .rate = 480000000, - .enable = apll_enable, - .disable = apll_disable, .flags = RATE_PROPAGATES, }; -static void pfd_recalc(struct clk *clk) -{ - u32 frac; - u64 rate; - if (apbh_dma_clk.usecount == 0) - apbh_dma_clk.enable(&apbh_dma_clk); - frac = __raw_readl(apll_base + - (int)clk->enable_reg) >> clk->enable_shift; - frac &= MXC_ANADIG_PFD_FRAC_MASK; - rate = (u64)clk->parent->rate * 18; - do_div(rate, frac); - clk->rate = rate; - if (apbh_dma_clk.usecount == 0) - apbh_dma_clk.disable(&apbh_dma_clk); -} - -static unsigned long pfd_round_rate(struct clk *clk, unsigned long rate) -{ - u32 frac; - u64 tmp; - tmp = (u64)clk->parent->rate * 18; - do_div(tmp, rate); - frac = tmp; - frac = frac < 18 ? 18 : frac; - frac = frac > 35 ? 35 : frac; - do_div(tmp, frac); - return tmp; -} - -static int pfd_set_rate(struct clk *clk, unsigned long rate) -{ - u32 frac; - u64 tmp; - - if (apbh_dma_clk.usecount == 0) - apbh_dma_clk.enable(&apbh_dma_clk); - tmp = (u64)clk->parent->rate * 18; - do_div(tmp, rate); - frac = tmp; - frac = frac < 18 ? 18 : frac; - frac = frac > 35 ? 35 : frac; - /* clear clk frac bits */ - __raw_writel(MXC_ANADIG_PFD_FRAC_MASK << clk->enable_shift, - apll_base + (int)clk->enable_reg + 8); - /* set clk frac bits */ - __raw_writel(frac << clk->enable_shift, - apll_base + (int)clk->enable_reg + 4); - - tmp = (u64)clk->parent->rate * 18; - do_div(tmp, frac); - clk->rate = tmp; - if (apbh_dma_clk.usecount == 0) - apbh_dma_clk.disable(&apbh_dma_clk); - return 0; -} - -static int pfd_enable(struct clk *clk) -{ - int index; - - if (apbh_dma_clk.usecount == 0) - apbh_dma_clk.enable(&apbh_dma_clk); - index = _get_mux8(clk, &pfd0_clk, &pfd1_clk, &pfd2_clk, &pfd3_clk, - &pfd4_clk, &pfd5_clk, &pfd6_clk, &pfd7_clk); - __raw_writel(1 << (index + MXC_ANADIG_PFD_DIS_OFFSET), - apll_base + MXC_ANADIG_PLLCTRL_CLR); - /* clear clk gate bit */ - __raw_writel((1 << (clk->enable_shift + 7)), - apll_base + (int)clk->enable_reg + 8); - - /* check lock bit */ - if (!WAIT(__raw_readl(apll_base + MXC_ANADIG_PLLCTRL) - & MXC_ANADIG_APLL_LOCK, 50000)) { - __raw_writel(MXC_ANADIG_APLL_FORCE_LOCK, - apll_base + MXC_ANADIG_PLLCTRL_CLR); - __raw_writel(MXC_ANADIG_APLL_FORCE_LOCK, - apll_base + MXC_ANADIG_PLLCTRL_SET); - if (!WAIT(__raw_readl(apll_base + MXC_ANADIG_PLLCTRL) - & MXC_ANADIG_APLL_LOCK, SPIN_DELAY)) - panic("pfd_enable failed!\n"); - } - if (apbh_dma_clk.usecount == 0) - apbh_dma_clk.disable(&apbh_dma_clk); - return 0; -} - -static void pfd_disable(struct clk *clk) -{ - int index; - - if (apbh_dma_clk.usecount == 0) - apbh_dma_clk.enable(&apbh_dma_clk); - index = _get_mux8(clk, &pfd0_clk, &pfd1_clk, &pfd2_clk, &pfd3_clk, - &pfd4_clk, &pfd5_clk, &pfd6_clk, &pfd7_clk); - /* set clk gate bit */ - __raw_writel((1 << (clk->enable_shift + 7)), - apll_base + (int)clk->enable_reg + 4); - __raw_writel(1 << (index + MXC_ANADIG_PFD_DIS_OFFSET), - apll_base + MXC_ANADIG_PLLCTRL_SET); - if (apbh_dma_clk.usecount == 0) - apbh_dma_clk.disable(&apbh_dma_clk); -} - static struct clk pfd0_clk = { .name = "pfd0", - .parent = &apll_clk, - .enable_reg = (void *)MXC_ANADIG_FRAC0, - .enable_shift = MXC_ANADIG_PFD0_FRAC_OFFSET, - .recalc = pfd_recalc, - .set_rate = pfd_set_rate, - .round_rate = pfd_round_rate, - .enable = pfd_enable, - .disable = pfd_disable, .flags = RATE_PROPAGATES, }; static struct clk pfd1_clk = { .name = "pfd1", - .parent = &apll_clk, - .enable_reg = (void *)MXC_ANADIG_FRAC0, - .enable_shift = MXC_ANADIG_PFD1_FRAC_OFFSET, - .recalc = pfd_recalc, - .set_rate = pfd_set_rate, - .round_rate = pfd_round_rate, - .enable = pfd_enable, - .disable = pfd_disable, .flags = RATE_PROPAGATES, }; static struct clk pfd2_clk = { .name = "pfd2", - .parent = &apll_clk, - .enable_reg = (void *)MXC_ANADIG_FRAC0, - .enable_shift = MXC_ANADIG_PFD2_FRAC_OFFSET, - .recalc = pfd_recalc, - .set_rate = pfd_set_rate, - .round_rate = pfd_round_rate, - .enable = pfd_enable, - .disable = pfd_disable, .flags = RATE_PROPAGATES, }; static struct clk pfd3_clk = { .name = "pfd3", - .parent = &apll_clk, - .enable_reg = (void *)MXC_ANADIG_FRAC0, - .enable_shift = MXC_ANADIG_PFD3_FRAC_OFFSET, - .recalc = pfd_recalc, - .set_rate = pfd_set_rate, - .round_rate = pfd_round_rate, - .enable = pfd_enable, - .disable = pfd_disable, .flags = RATE_PROPAGATES, }; static struct clk pfd4_clk = { .name = "pfd4", - .parent = &apll_clk, - .enable_reg = (void *)MXC_ANADIG_FRAC1, - .enable_shift = MXC_ANADIG_PFD4_FRAC_OFFSET, - .recalc = pfd_recalc, - .set_rate = pfd_set_rate, - .round_rate = pfd_round_rate, - .enable = pfd_enable, - .disable = pfd_disable, .flags = RATE_PROPAGATES, }; static struct clk pfd5_clk = { .name = "pfd5", - .parent = &apll_clk, - .enable_reg = (void *)MXC_ANADIG_FRAC1, - .enable_shift = MXC_ANADIG_PFD5_FRAC_OFFSET, - .recalc = pfd_recalc, - .set_rate = pfd_set_rate, - .round_rate = pfd_round_rate, - .enable = pfd_enable, - .disable = pfd_disable, .flags = RATE_PROPAGATES, }; static struct clk pfd6_clk = { .name = "pfd6", - .parent = &apll_clk, - .enable_reg = (void *)MXC_ANADIG_FRAC1, - .enable_shift = MXC_ANADIG_PFD6_FRAC_OFFSET, - .recalc = pfd_recalc, - .set_rate = pfd_set_rate, - .round_rate = pfd_round_rate, - .enable = pfd_enable, - .disable = pfd_disable, .flags = RATE_PROPAGATES, }; static struct clk pfd7_clk = { .name = "pfd7", - .parent = &apll_clk, - .enable_reg = (void *)MXC_ANADIG_FRAC1, - .enable_shift = MXC_ANADIG_PFD7_FRAC_OFFSET, - .recalc = pfd_recalc, - .set_rate = pfd_set_rate, - .round_rate = pfd_round_rate, - .enable = pfd_enable, - .disable = pfd_disable, .flags = RATE_PROPAGATES, }; @@ -552,6 +347,8 @@ static int _clk_pll_set_rate(struct clk *clk, unsigned long rate) { u32 reg, reg1; void __iomem *pllbase; + struct timespec nstimeofday; + struct timespec curtime; long mfi, pdf, mfn, mfd = 999999; s64 temp64; @@ -599,9 +396,13 @@ static int _clk_pll_set_rate(struct clk *clk, unsigned long rate) __raw_writel(reg1, pllbase + MXC_PLL_DP_CTL); } /* Wait for lock */ - if (!WAIT(__raw_readl(pllbase + MXC_PLL_DP_CTL) - & MXC_PLL_DP_CTL_LRF, SPIN_DELAY)) - panic("pll_set_rate: pll relock failed\n"); + getnstimeofday(&nstimeofday); + while (!(__raw_readl(pllbase + MXC_PLL_DP_CTL) + & MXC_PLL_DP_CTL_LRF)) { + getnstimeofday(&curtime); + if (curtime.tv_nsec - nstimeofday.tv_nsec > SPIN_DELAY) + panic("pll_set_rate: pll relock failed\n"); + } } clk->rate = rate; return 0; @@ -611,20 +412,20 @@ static int _clk_pll_enable(struct clk *clk) { u32 reg; void __iomem *pllbase; + struct timespec nstimeofday; + struct timespec curtime; pllbase = _get_pll_base(clk); - reg = __raw_readl(pllbase + MXC_PLL_DP_CTL); - - if (reg & MXC_PLL_DP_CTL_UPEN) - return 0; - - reg |= MXC_PLL_DP_CTL_UPEN; + reg = __raw_readl(pllbase + MXC_PLL_DP_CTL) | MXC_PLL_DP_CTL_UPEN; __raw_writel(reg, pllbase + MXC_PLL_DP_CTL); /* Wait for lock */ - if (!WAIT(__raw_readl(pllbase + MXC_PLL_DP_CTL) & MXC_PLL_DP_CTL_LRF, - SPIN_DELAY)) - panic("pll relock failed\n"); + getnstimeofday(&nstimeofday); + while (!(__raw_readl(pllbase + MXC_PLL_DP_CTL) & MXC_PLL_DP_CTL_LRF)) { + getnstimeofday(&curtime); + if (curtime.tv_nsec - nstimeofday.tv_nsec > SPIN_DELAY) + panic("pll relock failed\n"); + } return 0; } @@ -750,6 +551,17 @@ static struct clk pll3_sw_clk = { .flags = RATE_PROPAGATES, }; +/* same as pll4_main_clk. These two clocks should always be the same */ +static struct clk pll4_sw_clk = { + .name = "pll4", + .parent = &osc_clk, + .set_rate = _clk_pll_set_rate, + .recalc = _clk_pll_recalc, + .enable = _clk_pll_enable, + .disable = _clk_pll_disable, + .flags = RATE_PROPAGATES, +}; + static int _clk_lp_apm_set_parent(struct clk *clk, struct clk *parent) { u32 reg; @@ -841,7 +653,7 @@ static int _clk_main_bus_set_parent(struct clk *clk, struct clk *parent) mux = _get_mux(parent, &pll1_sw_clk, &pll2_sw_clk, &pll3_sw_clk, &lp_apm_clk); reg = __raw_readl(MXC_CCM_CBCDR) & ~MX50_CCM_CBCDR_PERIPH_CLK_SEL_MASK; - reg |= (mux << MX50_CCM_CBCDR_PERIPH_CLK_SEL_OFFSET); + reg |= mux; __raw_writel(reg, MXC_CCM_CBCDR); return 0; @@ -868,6 +680,8 @@ static void _clk_axi_a_recalc(struct clk *clk) static int _clk_axi_a_set_rate(struct clk *clk, unsigned long rate) { u32 reg, div; + struct timespec nstimeofday; + struct timespec curtime; div = clk->parent->rate / rate; if (div == 0) @@ -880,9 +694,12 @@ static int _clk_axi_a_set_rate(struct clk *clk, unsigned long rate) reg |= (div - 1) << MXC_CCM_CBCDR_AXI_A_PODF_OFFSET; __raw_writel(reg, MXC_CCM_CBCDR); - if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR) - & MXC_CCM_CDHIPR_AXI_A_PODF_BUSY), SPIN_DELAY)) - panic("pll _clk_axi_a_set_rate failed\n"); + getnstimeofday(&nstimeofday); + while (__raw_readl(MXC_CCM_CDHIPR) & MXC_CCM_CDHIPR_AXI_A_PODF_BUSY) { + getnstimeofday(&curtime); + if (curtime.tv_nsec - nstimeofday.tv_nsec > SPIN_DELAY) + panic("pll _clk_axi_a_set_rate failed\n"); + } clk->rate = rate; return 0; @@ -924,6 +741,8 @@ static void _clk_axi_b_recalc(struct clk *clk) static int _clk_axi_b_set_rate(struct clk *clk, unsigned long rate) { u32 reg, div; + struct timespec nstimeofday; + struct timespec curtime; div = clk->parent->rate / rate; if (div == 0) @@ -936,9 +755,12 @@ static int _clk_axi_b_set_rate(struct clk *clk, unsigned long rate) reg |= (div - 1) << MXC_CCM_CBCDR_AXI_B_PODF_OFFSET; __raw_writel(reg, MXC_CCM_CBCDR); - if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR) - & MXC_CCM_CDHIPR_AXI_B_PODF_BUSY), SPIN_DELAY)) - panic("_clk_axi_b_set_rate failed\n"); + getnstimeofday(&nstimeofday); + while (__raw_readl(MXC_CCM_CDHIPR) & MXC_CCM_CDHIPR_AXI_B_PODF_BUSY) { + getnstimeofday(&curtime); + if (curtime.tv_nsec - nstimeofday.tv_nsec > SPIN_DELAY) + panic("_clk_axi_b_set_rate failed\n"); + } clk->rate = rate; @@ -982,6 +804,8 @@ static void _clk_ahb_recalc(struct clk *clk) static int _clk_ahb_set_rate(struct clk *clk, unsigned long rate) { u32 reg, div; + struct timespec nstimeofday; + struct timespec curtime; div = clk->parent->rate / rate; if (div == 0) @@ -994,9 +818,12 @@ static int _clk_ahb_set_rate(struct clk *clk, unsigned long rate) reg |= (div - 1) << MXC_CCM_CBCDR_AHB_PODF_OFFSET; __raw_writel(reg, MXC_CCM_CBCDR); - if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR) & MXC_CCM_CDHIPR_AHB_PODF_BUSY), - SPIN_DELAY)) + getnstimeofday(&nstimeofday); + while (__raw_readl(MXC_CCM_CDHIPR) & MXC_CCM_CDHIPR_AHB_PODF_BUSY) { + getnstimeofday(&curtime); + if (curtime.tv_nsec - nstimeofday.tv_nsec > SPIN_DELAY) panic("_clk_ahb_set_rate failed\n"); + } clk->rate = rate; return 0; @@ -1062,6 +889,85 @@ static struct clk ahb_max_clk = { .disable = _clk_max_disable, }; +static int _clk_weim_set_parent(struct clk *clk, struct clk *parent) +{ + u32 reg; + + reg = __raw_readl(MXC_CCM_CBCDR); + if (parent == &ahb_clk) + reg |= MX50_CCM_CBCDR_WEIM_CLK_SEL; + else if (parent == &main_bus_clk) + reg &= ~MX50_CCM_CBCDR_WEIM_CLK_SEL; + else + BUG(); + __raw_writel(reg, MXC_CCM_CBCDR); + + return 0; +} + +static void _clk_weim_recalc(struct clk *clk) +{ + u32 reg, div; + + reg = __raw_readl(MXC_CCM_CBCDR); + div = ((reg & MXC_CCM_CBCDR_EMI_PODF_MASK) >> + MXC_CCM_CBCDR_EMI_PODF_OFFSET) + 1; + clk->rate = clk->parent->rate / div; +} + +static int _clk_weim_set_rate(struct clk *clk, unsigned long rate) +{ + u32 reg, div; + struct timespec nstimeofday; + struct timespec curtime; + + div = clk->parent->rate / rate; + if (div == 0) + div++; + if (((clk->parent->rate / div) != rate) || (div > 8)) + return -EINVAL; + reg = __raw_readl(MXC_CCM_CBCDR); + reg &= ~MXC_CCM_CBCDR_EMI_PODF_MASK; + reg |= (div - 1) << MXC_CCM_CBCDR_EMI_PODF_OFFSET; + __raw_writel(reg, MXC_CCM_CBCDR); + getnstimeofday(&nstimeofday); + while (__raw_readl(MXC_CCM_CDHIPR) & MXC_CCM_CDHIPR_EMI_PODF_BUSY) { + getnstimeofday(&curtime); + if ((curtime.tv_nsec - nstimeofday.tv_nsec) > SPIN_DELAY) + panic("_clk_emi_slow_set_rate failed\n"); + } + clk->rate = rate; + + return 0; +} + +static unsigned long _clk_weim_round_rate(struct clk *clk, + unsigned long rate) +{ + u32 div; + + div = clk->parent->rate / rate; + if (div > 8) + div = 8; + else if (div == 0) + div++; + return clk->parent->rate / div; +} + + +static struct clk weim_clk = { + .name = "weim_clk", + .parent = &main_bus_clk, + .set_parent = _clk_weim_set_parent, + .recalc = _clk_weim_recalc, + .set_rate = _clk_weim_set_rate, + .round_rate = _clk_weim_round_rate, + .enable = _clk_enable, + .enable_reg = MXC_CCM_CCGR5, + .enable_shift = MXC_CCM_CCGR5_CG8_OFFSET, + .disable = _clk_disable_inwait, + .flags = RATE_PROPAGATES, +}; static struct clk ahbmux1_clk = { .name = "ahbmux1_clk", @@ -1156,138 +1062,6 @@ static struct clk ipmux2_clk = { .disable = _clk_disable, }; -static int _clk_sys_clk_enable(struct clk *clk) -{ - u32 reg; - - reg = __raw_readl(MXC_CCM_CLK_SYS); - reg &= ~(MXC_CCM_CLK_SYS_SYS_XTAL_CLKGATE_MASK | - MXC_CCM_CLK_SYS_SYS_PLL_CLKGATE_MASK); - if (__raw_readl(MXC_CCM_CLKSEQ_BYPASS) & 0x1) - reg |= MXC_CCM_CLK_SYS_SYS_PLL_CLKGATE_MASK; - else - reg |= MXC_CCM_CLK_SYS_SYS_XTAL_CLKGATE_MASK; - __raw_writel(reg, MXC_CCM_CLK_SYS); - return 0; -} - -static void _clk_sys_clk_disable(struct clk *clk) -{ - u32 reg, reg1; - - reg1 = (__raw_readl(databahn + DATABAHN_CTL_REG55)) - & DDR_SYNC_MODE; - reg = __raw_readl(MXC_CCM_CLK_SYS); - reg &= ~(MXC_CCM_CLK_SYS_SYS_XTAL_CLKGATE_MASK | - MXC_CCM_CLK_SYS_SYS_PLL_CLKGATE_MASK); - if (__raw_readl(MXC_CCM_CLKSEQ_BYPASS) & 0x1) - reg |= 1 << MXC_CCM_CLK_SYS_SYS_PLL_CLKGATE_OFFSET; - else { - /* If DDR is sourced from SYS_CLK (in Sync mode), we cannot - * gate its clock when ARM is in wait if the DDR is not in - * self refresh. - */ - if (reg1 == DDR_SYNC_MODE) - reg |= 3 << MXC_CCM_CLK_SYS_SYS_XTAL_CLKGATE_OFFSET; - else - reg |= 1 << MXC_CCM_CLK_SYS_SYS_XTAL_CLKGATE_OFFSET; - } - __raw_writel(reg, MXC_CCM_CLK_SYS); -} - -static struct clk sys_clk = { - .name = "sys_clk", - .enable = _clk_sys_clk_enable, - .disable = _clk_sys_clk_disable, -}; - - -static int _clk_weim_set_parent(struct clk *clk, struct clk *parent) -{ - u32 reg; - - reg = __raw_readl(MXC_CCM_CBCDR); - if (parent == &ahb_clk) - reg |= MX50_CCM_CBCDR_WEIM_CLK_SEL; - else if (parent == &main_bus_clk) - reg &= ~MX50_CCM_CBCDR_WEIM_CLK_SEL; - else - BUG(); - __raw_writel(reg, MXC_CCM_CBCDR); - - return 0; -} - -static void _clk_weim_recalc(struct clk *clk) -{ - u32 reg, div; - - reg = __raw_readl(MXC_CCM_CBCDR); - div = ((reg & MXC_CCM_CBCDR_EMI_PODF_MASK) >> - MXC_CCM_CBCDR_EMI_PODF_OFFSET) + 1; - clk->rate = clk->parent->rate / div; -} - -static int _clk_weim_set_rate(struct clk *clk, unsigned long rate) -{ - u32 reg, div; - - div = clk->parent->rate / rate; - if (div == 0) - div++; - if (((clk->parent->rate / div) != rate) || (div > 8)) - return -EINVAL; - reg = __raw_readl(MXC_CCM_CBCDR); - reg &= ~MXC_CCM_CBCDR_EMI_PODF_MASK; - reg |= (div - 1) << MXC_CCM_CBCDR_EMI_PODF_OFFSET; - __raw_writel(reg, MXC_CCM_CBCDR); - if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR) & MXC_CCM_CDHIPR_EMI_PODF_BUSY), - SPIN_DELAY)) - panic("_clk_emi_slow_set_rate failed\n"); - clk->rate = rate; - - return 0; -} - -static unsigned long _clk_weim_round_rate(struct clk *clk, - unsigned long rate) -{ - u32 div; - - div = clk->parent->rate / rate; - if (div > 8) - div = 8; - else if (div == 0) - div++; - return clk->parent->rate / div; -} - -static struct clk weim_clk[] = { - { - .name = "weim_clk", - .parent = &main_bus_clk, - .set_parent = _clk_weim_set_parent, - .recalc = _clk_weim_recalc, - .set_rate = _clk_weim_set_rate, - .round_rate = _clk_weim_round_rate, - .enable = _clk_enable, - .enable_reg = MXC_CCM_CCGR5, - .enable_shift = MXC_CCM_CCGR5_CG8_OFFSET, - .disable = _clk_disable_inwait, - .flags = RATE_PROPAGATES, - .secondary = &weim_clk[1], - }, - { - .name = "weim_ipg_clk", - .parent = &ipg_clk, - .secondary = &sys_clk, - .enable = _clk_enable, - .enable_reg = MXC_CCM_CCGR5, - .enable_shift = MXC_CCM_CCGR5_CG9_OFFSET, - .disable = _clk_disable_inwait, - } -}; - static int _clk_ocram_enable(struct clk *clk) { return 0; @@ -1299,13 +1073,13 @@ static void _clk_ocram_disable(struct clk *clk) static struct clk ocram_clk = { .name = "ocram_clk", - .parent = &sys_clk, .enable_reg = MXC_CCM_CCGR6, .enable_shift = MXC_CCM_CCGR6_CG1_OFFSET, .enable = _clk_ocram_enable, .disable = _clk_ocram_disable, }; + static struct clk aips_tz1_clk = { .name = "aips_tz1_clk", .parent = &ahb_clk, @@ -1372,7 +1146,6 @@ static struct clk sdma_clk[] = { { .name = "sdma_ipg_clk", .parent = &ipg_clk, - .secondary = &ddr_clk, }, }; @@ -1559,16 +1332,17 @@ static struct clk gpt_clk[] = { .parent = &ipg_perclk, .id = 0, .enable_reg = MXC_CCM_CCGR2, - .enable_shift = MXC_CCM_CCGR2_CG10_OFFSET, + .enable_shift = MXC_CCM_CCGR2_CG9_OFFSET, .enable = _clk_enable, .disable = _clk_disable, + .secondary = &gpt_clk[1], }, { .name = "gpt_ipg_clk", .id = 0, .parent = &ipg_clk, .enable_reg = MXC_CCM_CCGR2, - .enable_shift = MXC_CCM_CCGR2_CG9_OFFSET, + .enable_shift = MXC_CCM_CCGR2_CG10_OFFSET, .enable = _clk_enable, .disable = _clk_disable, }, @@ -2042,12 +1816,10 @@ static struct clk tmax2_clk = { static struct clk usb_ahb_clk = { .name = "usb_ahb_clk", .parent = &ipg_clk, - .secondary = &ddr_clk, .enable = _clk_enable, .enable_reg = MXC_CCM_CCGR2, .enable_shift = MXC_CCM_CCGR2_CG13_OFFSET, .disable = _clk_disable, - .flags = AHB_MED_SET_POINT | CPU_FREQ_TRIG_UPDATE, }; static struct clk usb_phy_clk[] = { @@ -2074,7 +1846,6 @@ static struct clk usb_phy_clk[] = { static struct clk esdhc_dep_clks = { .name = "sd_dep_clk", .parent = &spba_clk, - .secondary = &ddr_clk, }; static void _clk_esdhc1_recalc(struct clk *clk) @@ -2097,8 +1868,8 @@ static int _clk_esdhc1_set_parent(struct clk *clk, struct clk *parent) reg = __raw_readl(MXC_CCM_CSCMR1); mux = _get_mux(parent, &pll1_sw_clk, &pll2_sw_clk, &pll3_sw_clk, &lp_apm_clk); - reg = reg & ~MX50_CCM_CSCMR1_ESDHC1_CLK_SEL_MASK; - reg |= mux << MX50_CCM_CSCMR1_ESDHC1_CLK_SEL_OFFSET; + reg = reg & ~MXC_CCM_CSCMR1_ESDHC1_MSHC2_CLK_SEL_MASK; + reg |= mux << MXC_CCM_CSCMR1_ESDHC1_MSHC2_CLK_SEL_OFFSET; __raw_writel(reg, MXC_CCM_CSCMR1); return 0; @@ -2143,7 +1914,6 @@ static struct clk esdhc1_clk[] = { .enable_shift = MXC_CCM_CCGR3_CG1_OFFSET, .disable = _clk_disable, .secondary = &esdhc1_clk[1], - .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE, }, { .name = "esdhc_ipg_clk", @@ -2170,9 +1940,9 @@ static int _clk_esdhc2_set_parent(struct clk *clk, struct clk *parent) reg = __raw_readl(MXC_CCM_CSCMR1); if (parent == &esdhc1_clk[0]) - reg &= ~MX50_CCM_CSCMR1_ESDHC2_CLK_SEL; + reg &= ~MXC_CCM_CSCMR1_ESDHC2_CLK_SEL; else if (parent == &esdhc3_clk[0]) - reg |= MX50_CCM_CSCMR1_ESDHC2_CLK_SEL; + reg |= MXC_CCM_CSCMR1_ESDHC2_CLK_SEL; else BUG(); __raw_writel(reg, MXC_CCM_CSCMR1); @@ -2190,7 +1960,6 @@ static struct clk esdhc2_clk[] = { .enable_shift = MXC_CCM_CCGR3_CG3_OFFSET, .disable = _clk_disable, .secondary = &esdhc2_clk[1], - .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE, }, { .name = "esdhc_ipg_clk", @@ -2218,8 +1987,8 @@ static int _clk_esdhc3_set_parent(struct clk *clk, struct clk *parent) mux = _get_mux8(parent, &pll1_sw_clk, &pll2_sw_clk, &pll3_sw_clk, &lp_apm_clk, &pfd0_clk, &pfd1_clk, &pfd4_clk, &osc_clk); - reg = reg & ~MX50_CCM_CSCMR1_ESDHC3_CLK_SEL_MASK; - reg |= mux << MX50_CCM_CSCMR1_ESDHC3_CLK_SEL_OFFSET; + reg = reg & ~MXC_CCM_CSCMR1_ESDHC3_MSHC2_CLK_SEL_MASK; + reg |= mux << MXC_CCM_CSCMR1_ESDHC3_MSHC2_CLK_SEL_OFFSET; __raw_writel(reg, MXC_CCM_CSCMR1); return 0; @@ -2277,7 +2046,6 @@ static struct clk esdhc3_clk[] = { .enable_shift = MXC_CCM_CCGR3_CG5_OFFSET, .disable = _clk_disable, .secondary = &esdhc3_clk[1], - .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE, }, { .name = "esdhc_ipg_clk", @@ -2303,9 +2071,9 @@ static int _clk_esdhc4_set_parent(struct clk *clk, struct clk *parent) reg = __raw_readl(MXC_CCM_CSCMR1); if (parent == &esdhc1_clk[0]) - reg &= ~MX50_CCM_CSCMR1_ESDHC4_CLK_SEL; + reg &= ~MXC_CCM_CSCMR1_ESDHC4_CLK_SEL; else if (parent == &esdhc3_clk[0]) - reg |= MX50_CCM_CSCMR1_ESDHC4_CLK_SEL; + reg |= MXC_CCM_CSCMR1_ESDHC4_CLK_SEL; else BUG(); __raw_writel(reg, MXC_CCM_CSCMR1); @@ -2324,7 +2092,6 @@ static struct clk esdhc4_clk[] = { .enable_shift = MXC_CCM_CCGR3_CG7_OFFSET, .disable = _clk_disable, .secondary = &esdhc4_clk[1], - .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE, }, { .name = "esdhc_ipg_clk", @@ -2355,7 +2122,6 @@ static int _clk_ddr_set_parent(struct clk *clk, struct clk *parent) reg &= ~MXC_CCM_CLK_DDR_DDR_PFD_SEL; else return -EINVAL; - __raw_writel(reg, MXC_CCM_CLK_DDR); return 0; } @@ -2372,37 +2138,12 @@ static void _clk_ddr_recalc(struct clk *clk) clk->rate = 0; } -static int _clk_ddr_enable(struct clk *clk) -{ - u32 reg; - - _clk_enable(clk); - reg = (__raw_readl(databahn + DATABAHN_CTL_REG55)) & - DDR_SYNC_MODE; - if (reg != DDR_SYNC_MODE) { - reg = __raw_readl(MXC_CCM_CLK_DDR); - reg |= MXC_CCM_CLK_DDR_DDR_CLKGATE_MASK; - __raw_writel(reg, MXC_CCM_CLK_DDR); - } - return 0; -} - -static void _clk_ddr_disable(struct clk *clk) -{ - _clk_disable_inwait(clk); -} - - static struct clk ddr_clk = { .name = "ddr_clk", .parent = &pll1_sw_clk, - .secondary = &sys_clk, .set_parent = _clk_ddr_set_parent, .recalc = _clk_ddr_recalc, - .enable = _clk_ddr_enable, - .enable_reg = MXC_CCM_CCGR6, - .enable_shift = MXC_CCM_CCGR6_CG15_OFFSET, - .disable = _clk_ddr_disable, + .flags = RATE_PROPAGATES, }; static void _clk_pgc_recalc(struct clk *clk) @@ -2423,6 +2164,7 @@ static struct clk pgc_clk = { }; /*usb OTG clock */ + static struct clk usb_clk = { .name = "usb_clk", .rate = 60000000, @@ -2438,16 +2180,6 @@ static struct clk rtc_clk = { .disable = _clk_disable, }; -struct clk rng_clk = { - .name = "rng_clk", - .id = 0, - .parent = &ipg_clk, - .enable = _clk_enable, - .enable_reg = MXC_CCM_CCGR7, - .enable_shift = MXC_CCM_CCGR7_CG1_OFFSET, - .disable = _clk_disable, -}; - static struct clk owire_clk = { /* 1w driver come from upstream and use owire as clock name*/ .name = "owire", @@ -2458,6 +2190,7 @@ static struct clk owire_clk = { .disable = _clk_disable, }; + static struct clk fec_clk[] = { { .name = "fec_clk", @@ -2471,106 +2204,21 @@ static struct clk fec_clk[] = { }, { .name = "fec_sec1_clk", - .parent = &aips_tz2_clk, - .secondary = &ddr_clk, - }, -}; - -static int gpmi_clk_enable(struct clk *clk) -{ - u32 reg; - - reg = __raw_readl(MXC_CCM_GPMI); - reg |= MXC_CCM_GPMI_CLKGATE_MASK; - __raw_writel(reg, MXC_CCM_GPMI); - _clk_enable(clk); - return 0; -} - -static void gpmi_clk_disable(struct clk *clk) -{ - u32 reg; - - reg = __raw_readl(MXC_CCM_GPMI); - reg &= ~MXC_CCM_GPMI_CLKGATE_MASK; - __raw_writel(reg, MXC_CCM_GPMI); - _clk_disable(clk); -} - -static int bch_clk_enable(struct clk *clk) -{ - u32 reg; - - reg = __raw_readl(MXC_CCM_BCH); - reg |= MXC_CCM_BCH_CLKGATE_MASK; - __raw_writel(reg, MXC_CCM_BCH); - _clk_enable(clk); - return 0; -} - -static void bch_clk_disable(struct clk *clk) -{ - u32 reg; - - reg = __raw_readl(MXC_CCM_BCH); - reg &= ~MXC_CCM_BCH_CLKGATE_MASK; - __raw_writel(reg, MXC_CCM_BCH); - _clk_disable(clk); -} - -static struct clk gpmi_nfc_clk[] = { - { - .name = "gpmi-nfc", - .parent = &osc_clk, - .secondary = &gpmi_nfc_clk[1], - .enable = gpmi_clk_enable, - .enable_reg = MXC_CCM_CCGR7, - .enable_shift = MXC_CCM_CCGR7_CG9_OFFSET, - .disable = gpmi_clk_disable, - }, - { - .name = "gpmi-apb", - .parent = &ahb_clk, - .secondary = &gpmi_nfc_clk[2], - .enable = _clk_enable, - .enable_reg = MXC_CCM_CCGR7, - .enable_shift = MXC_CCM_CCGR7_CG8_OFFSET, - .disable = _clk_disable, - }, - { - .name = "bch", - .parent = &osc_clk, - .secondary = &gpmi_nfc_clk[3], - .enable = bch_clk_enable, - .enable_reg = MXC_CCM_CCGR7, - .enable_shift = MXC_CCM_CCGR7_CG0_OFFSET, - .disable = bch_clk_disable, + .parent = &tmax2_clk, + .secondary = &fec_clk[2], }, { - .name = "bch-apb", - .parent = &ahb_clk, - .enable = _clk_enable, - .enable_reg = MXC_CCM_CCGR7, - .enable_shift = MXC_CCM_CCGR7_CG12_OFFSET, - .disable = _clk_disable, + .name = "fec_sec2_clk", + .parent = &aips_tz2_clk, }, }; -static struct clk ocotp_clk = { - .name = "ocotp_ctrl_apb", - .parent = &ahb_clk, - .enable = _clk_enable, - .enable_reg = MXC_CCM_CCGR7, - .enable_shift = MXC_CCM_CCGR7_CG13_OFFSET, - .disable = _clk_disable, -}; - static int _clk_gpu2d_set_parent(struct clk *clk, struct clk *parent) { u32 reg, mux; reg = __raw_readl(MXC_CCM_CBCMR); - mux = _get_mux(parent, &axi_a_clk, &axi_b_clk, &weim_clk[0], &ahb_clk); + mux = _get_mux(parent, &axi_a_clk, &axi_b_clk, &weim_clk, &ahb_clk); reg = (reg & ~MXC_CCM_CBCMR_GPU2D_CLK_SEL_MASK) | (mux << MXC_CCM_CBCMR_GPU2D_CLK_SEL_OFFSET); __raw_writel(reg, MXC_CCM_CBCMR); @@ -2581,7 +2229,6 @@ static int _clk_gpu2d_set_parent(struct clk *clk, struct clk *parent) static struct clk gpu2d_clk = { .name = "gpu2d_clk", .parent = &axi_a_clk, - .secondary = &ddr_clk, .set_parent = _clk_gpu2d_set_parent, .enable = _clk_enable, .enable_reg = MXC_CCM_CCGR6, @@ -2592,25 +2239,13 @@ static struct clk gpu2d_clk = { static struct clk apbh_dma_clk = { .name = "apbh_dma_clk", - .parent = &ahb_clk, - .secondary = &ddr_clk, + .parent = &pll1_sw_clk, .enable = _clk_enable, - .disable = _clk_disable_inwait, + .disable = _clk_disable, .enable_reg = MXC_CCM_CCGR7, .enable_shift = MXC_CCM_CCGR7_CG10_OFFSET, }; -struct clk dcp_clk = { - .name = "dcp_clk", - .id = 0, - .parent = &ahb_clk, - .secondary = &apbh_dma_clk, - .enable = _clk_enable, - .enable_reg = MXC_CCM_CCGR7, - .enable_shift = MXC_CCM_CCGR7_CG11_OFFSET, - .disable = _clk_disable, -}; - static int _clk_display_axi_set_parent(struct clk *clk, struct clk *parent) { u32 reg, mux; @@ -2657,15 +2292,17 @@ static int _clk_display_axi_set_rate(struct clk *clk, unsigned long rate) reg |= new_div << MXC_CCM_DISPLAY_AXI_DIV_OFFSET; __raw_writel(reg, MXC_CCM_DISPLAY_AXI); +#if 0 while (__raw_readl(MXC_CCM_CSR2) & MXC_CCM_CSR2_DISPLAY_AXI_BUSY) ; +#endif + return 0; } static struct clk display_axi_clk = { .name = "display_axi", .parent = &osc_clk, - .secondary = &apbh_dma_clk, .set_parent = _clk_display_axi_set_parent, .recalc = _clk_display_axi_recalc, .set_rate = _clk_display_axi_set_rate, @@ -2674,18 +2311,17 @@ static struct clk display_axi_clk = { .disable = _clk_disable, .enable_reg = MXC_CCM_DISPLAY_AXI, .enable_shift = MXC_CCM_DISPLAY_AXI_CLKGATE_OFFSET, - .flags = RATE_PROPAGATES, }; /* TODO: check Auto-Slow Mode */ static struct clk pxp_axi_clk = { .name = "pxp_axi", .parent = &display_axi_clk, + .secondary = &apbh_dma_clk, .enable = _clk_enable, .disable = _clk_disable, .enable_reg = MXC_CCM_CCGR6, .enable_shift = MXC_CCM_CCGR6_CG9_OFFSET, - .flags = AHB_MED_SET_POINT | CPU_FREQ_TRIG_UPDATE, }; static struct clk elcdif_axi_clk = { @@ -2695,7 +2331,6 @@ static struct clk elcdif_axi_clk = { .disable = _clk_disable, .enable_reg = MXC_CCM_CCGR6, .enable_shift = MXC_CCM_CCGR6_CG10_OFFSET, - .flags = AHB_MED_SET_POINT | CPU_FREQ_TRIG_UPDATE, }; static int _clk_elcdif_pix_set_parent(struct clk *clk, struct clk *parent) @@ -2750,40 +2385,17 @@ static int _clk_elcdif_pix_set_rate(struct clk *clk, unsigned long rate) return 0; } -static int _clk_elcdif_pix_enable(struct clk *clk) -{ - u32 reg; - - _clk_enable(clk); - reg = __raw_readl(MXC_CCM_ELCDIFPIX); - reg |= 0x3 << MXC_CCM_ELCDIFPIX_CLKGATE_OFFSET; - __raw_writel(reg, MXC_CCM_ELCDIFPIX); - return 0; -} - -static void _clk_elcdif_pix_disable(struct clk *clk) -{ - u32 reg; - - reg = __raw_readl(MXC_CCM_ELCDIFPIX); - reg &= ~MXC_CCM_ELCDIFPIX_CLKGATE_MASK; - __raw_writel(reg, MXC_CCM_ELCDIFPIX); - _clk_disable(clk); -} - static struct clk elcdif_pix_clk = { .name = "elcdif_pix", .parent = &osc_clk, - .secondary = &ddr_clk, - .enable = _clk_elcdif_pix_enable, - .disable = _clk_elcdif_pix_disable, + .enable = _clk_enable, + .disable = _clk_disable, .enable_reg = MXC_CCM_CCGR6, .enable_shift = MXC_CCM_CCGR6_CG6_OFFSET, .set_parent = _clk_elcdif_pix_set_parent, .recalc = _clk_elcdif_pix_recalc, .round_rate = _clk_elcdif_pix_round_rate, .set_rate = _clk_elcdif_pix_set_rate, - .flags = AHB_MED_SET_POINT | CPU_FREQ_TRIG_UPDATE, }; static int _clk_epdc_axi_set_parent(struct clk *clk, struct clk *parent) @@ -2857,7 +2469,10 @@ static int _clk_epdc_axi_enable(struct clk *clk) { u32 reg; - _clk_enable(clk); + reg = __raw_readl(MXC_CCM_CCGR6); + reg |= MXC_CCM_CCGR6_CG8_MASK; + __raw_writel(reg, MXC_CCM_CCGR6); + reg = __raw_readl(MXC_CCM_EPDC_AXI); reg |= MXC_CCM_EPDC_AXI_CLKGATE_MASK; __raw_writel(reg, MXC_CCM_EPDC_AXI); @@ -2869,26 +2484,25 @@ static void _clk_epdc_axi_disable(struct clk *clk) { u32 reg; + reg = __raw_readl(MXC_CCM_CCGR6); + reg &= ~MXC_CCM_CCGR6_CG8_MASK; + __raw_writel(reg, MXC_CCM_CCGR6); + reg = __raw_readl(MXC_CCM_EPDC_AXI); reg &= ~MXC_CCM_EPDC_AXI_CLKGATE_MASK; __raw_writel(reg, MXC_CCM_EPDC_AXI); - _clk_disable(clk); } /* TODO: check Auto-Slow Mode */ static struct clk epdc_axi_clk = { .name = "epdc_axi", - .parent = &osc_clk, - .secondary = &apbh_dma_clk, - .enable_reg = MXC_CCM_CCGR6, - .enable_shift = MXC_CCM_CCGR6_CG8_OFFSET, + .parent = &apbh_dma_clk, .set_parent = _clk_epdc_axi_set_parent, .recalc = _clk_epdc_axi_recalc, .set_rate = _clk_epdc_axi_set_rate, .round_rate = _clk_epdc_axi_round_rate, .enable = _clk_epdc_axi_enable, .disable = _clk_epdc_axi_disable, - .flags = AHB_MED_SET_POINT | CPU_FREQ_TRIG_UPDATE, }; @@ -2951,7 +2565,10 @@ static int _clk_epdc_pix_enable(struct clk *clk) { u32 reg; - _clk_enable(clk); + reg = __raw_readl(MXC_CCM_CCGR6); + reg |= MXC_CCM_CCGR6_CG5_MASK; + __raw_writel(reg, MXC_CCM_CCGR6); + reg = __raw_readl(MXC_CCM_EPDCPIX); reg |= MXC_CCM_EPDC_PIX_CLKGATE_MASK; __raw_writel(reg, MXC_CCM_EPDCPIX); @@ -2963,26 +2580,25 @@ static void _clk_epdc_pix_disable(struct clk *clk) { u32 reg; + reg = __raw_readl(MXC_CCM_CCGR6); + reg &= ~MXC_CCM_CCGR6_CG5_MASK; + __raw_writel(reg, MXC_CCM_CCGR6); + reg = __raw_readl(MXC_CCM_EPDCPIX); reg &= ~MXC_CCM_EPDC_PIX_CLKGATE_MASK; __raw_writel(reg, MXC_CCM_EPDCPIX); - _clk_disable(clk); } /* TODO: check Auto-Slow Mode */ static struct clk epdc_pix_clk = { .name = "epdc_pix", .parent = &osc_clk, - .secondary = &apbh_dma_clk, - .enable_reg = MXC_CCM_CCGR6, - .enable_shift = MXC_CCM_CCGR6_CG5_OFFSET, .set_parent = _clk_epdc_pix_set_parent, .recalc = _clk_epdc_pix_recalc, .set_rate = _clk_epdc_pix_set_rate, .round_rate = _clk_epdc_pix_round_rate, .enable = _clk_epdc_pix_enable, .disable = _clk_epdc_pix_disable, - .flags = AHB_MED_SET_POINT | CPU_FREQ_TRIG_UPDATE, }; static void cko1_recalc(struct clk *clk) @@ -3078,7 +2694,7 @@ static int cko1_set_parent(struct clk *clk, struct clk *parent) } else if (parent == &pfd6_clk) { sel = 7; fast = 0; - } else if (parent == &weim_clk[0]) { + } else if (parent == &weim_clk) { sel = 10; fast = 0; } else if (parent == &ahb_clk) { @@ -3106,7 +2722,6 @@ static int cko1_set_parent(struct clk *clk, struct clk *parent) __raw_writel(reg, MXC_CCM_CCOSR); return 0; } - static struct clk cko1_clk = { .name = "cko1_clk", .parent = &pll1_sw_clk, @@ -3127,15 +2742,6 @@ static struct clk *mxc_clks[] = { &pll1_sw_clk, &pll2_sw_clk, &pll3_sw_clk, - &apll_clk, - &pfd0_clk, - &pfd1_clk, - &pfd2_clk, - &pfd3_clk, - &pfd4_clk, - &pfd5_clk, - &pfd6_clk, - &pfd7_clk, &ipmux1_clk, &ipmux2_clk, &gpc_dvfs_clk, @@ -3200,16 +2806,14 @@ static struct clk *mxc_clks[] = { &esdhc4_clk[0], &esdhc4_clk[1], &esdhc_dep_clks, - &weim_clk[0], - &weim_clk[1], + &weim_clk, &ddr_clk, &pgc_clk, &rtc_clk, - &rng_clk, - &dcp_clk, &owire_clk, &fec_clk[0], &fec_clk[1], + &fec_clk[2], &gpu2d_clk, &cko1_clk, &display_axi_clk, @@ -3218,11 +2822,6 @@ static struct clk *mxc_clks[] = { &epdc_axi_clk, &epdc_pix_clk, &elcdif_pix_clk, - &gpmi_nfc_clk[0], - &gpmi_nfc_clk[1], - &gpmi_nfc_clk[2], - &gpmi_nfc_clk[3], - &ocotp_clk, }; static void clk_tree_init(void) @@ -3252,10 +2851,10 @@ static void clk_tree_init(void) pll3_sw_clk.parent = &osc_clk; /* set weim_clk parent */ - weim_clk[0].parent = &main_bus_clk; + weim_clk.parent = &main_bus_clk; reg = __raw_readl(MXC_CCM_CBCDR); if ((reg & MX50_CCM_CBCDR_WEIM_CLK_SEL) != 0) - weim_clk[0].parent = &ahb_clk; + weim_clk.parent = &ahb_clk; /* set ipg_perclk parent */ ipg_perclk.parent = &lp_apm_clk; @@ -3278,12 +2877,11 @@ int __init mx50_clocks_init(unsigned long ckil, unsigned long osc, unsigned long pll1_base = ioremap(MX53_BASE_ADDR(PLL1_BASE_ADDR), SZ_4K); pll2_base = ioremap(MX53_BASE_ADDR(PLL2_BASE_ADDR), SZ_4K); pll3_base = ioremap(MX53_BASE_ADDR(PLL3_BASE_ADDR), SZ_4K); - apll_base = ioremap(ANATOP_BASE_ADDR, SZ_4K); /* Turn off all possible clocks */ if (mxc_jtag_enabled) { __raw_writel(1 << MXC_CCM_CCGR0_CG0_OFFSET | - 3 << MXC_CCM_CCGR0_CG2_OFFSET | + 1 << MXC_CCM_CCGR0_CG2_OFFSET | 3 << MXC_CCM_CCGR0_CG3_OFFSET | 3 << MXC_CCM_CCGR0_CG4_OFFSET | 3 << MXC_CCM_CCGR0_CG8_OFFSET | @@ -3304,14 +2902,17 @@ int __init mx50_clocks_init(unsigned long ckil, unsigned long osc, unsigned long __raw_writel(0, MXC_CCM_CCGR3); __raw_writel(0, MXC_CCM_CCGR4); - __raw_writel(3 << MXC_CCM_CCGR5_CG6_OFFSET | + __raw_writel(1 << MXC_CCM_CCGR5_CG6_OFFSET | 1 << MXC_CCM_CCGR5_CG8_OFFSET | 3 << MXC_CCM_CCGR5_CG9_OFFSET, MXC_CCM_CCGR5); __raw_writel(3 << MXC_CCM_CCGR6_CG0_OFFSET | 3 << MXC_CCM_CCGR6_CG1_OFFSET | - 2 << MXC_CCM_CCGR6_CG14_OFFSET | - 3 << MXC_CCM_CCGR6_CG15_OFFSET, MXC_CCM_CCGR6); + 3 << MXC_CCM_CCGR6_CG4_OFFSET | + 3 << MXC_CCM_CCGR6_CG8_OFFSET | + 3 << MXC_CCM_CCGR6_CG9_OFFSET | + 3 << MXC_CCM_CCGR6_CG12_OFFSET | + 3 << MXC_CCM_CCGR6_CG13_OFFSET , MXC_CCM_CCGR6); __raw_writel(0, MXC_CCM_CCGR7); @@ -3334,8 +2935,6 @@ int __init mx50_clocks_init(unsigned long ckil, unsigned long osc, unsigned long clk_register(&i2c_clk[2]); clk_register(&usb_phy_clk[1]); clk_register(&ocram_clk); - clk_register(&apbh_dma_clk); - clk_register(&sys_clk); /* set DDR clock parent */ reg = __raw_readl(MXC_CCM_CLK_DDR) & @@ -3350,6 +2949,22 @@ int __init mx50_clocks_init(unsigned long ckil, unsigned long osc, unsigned long clk_set_parent(&esdhc2_clk[0], &esdhc1_clk[0]); clk_set_parent(&esdhc3_clk[0], &pll2_sw_clk); + clk_register(&apbh_dma_clk); + + clk_set_parent(&epdc_axi_clk, &pll1_sw_clk); + /* Set EPDC AXI to 200MHz */ + /* + clk_set_rate(&epdc_axi_clk, 200000000); + */ + __raw_writel(0xC0000008, MXC_CCM_EPDC_AXI); + clk_set_parent(&epdc_pix_clk, &pll1_sw_clk); + + reg = __raw_readl(MXC_CCM_ELCDIFPIX); + reg &= ~MXC_CCM_ELCDIFPIX_CLKGATE_MASK; + reg = 0x3 << MXC_CCM_ELCDIFPIX_CLKGATE_OFFSET; + __raw_writel(reg, MXC_CCM_ELCDIFPIX); + clk_set_parent(&elcdif_pix_clk, &pll1_sw_clk); + /* This will propagate to all children and init all the clock rates */ propagate_rate(&osc_clk); propagate_rate(&ckih_clk); @@ -3357,15 +2972,12 @@ int __init mx50_clocks_init(unsigned long ckil, unsigned long osc, unsigned long propagate_rate(&pll1_sw_clk); propagate_rate(&pll2_sw_clk); propagate_rate(&pll3_sw_clk); - propagate_rate(&apll_clk); clk_enable(&cpu_clk); clk_enable(&main_bus_clk); - clk_enable(&ocotp_clk); - - databahn = ioremap(MX50_DATABAHN_BASE_ADDR, SZ_16K); + clk_enable(&apbh_dma_clk); /* Initialise the parents to be axi_b, parents are set to * axi_a when the clocks are enabled. @@ -3377,35 +2989,9 @@ int __init mx50_clocks_init(unsigned long ckil, unsigned long osc, unsigned long clk_set_parent(&cspi_main_clk, &lp_apm_clk); clk_set_rate(&cspi_main_clk, 12000000); - /* - * Set DISPLAY_AXI to 200Mhz - * For Display AXI, source clocks must be - * enabled before dividers can be changed - */ - clk_enable(&display_axi_clk); - clk_enable(&elcdif_axi_clk); - clk_enable(&pxp_axi_clk); - clk_set_parent(&display_axi_clk, &pfd2_clk); + /* set DISPLAY_AXI to 200Mhz */ + clk_set_parent(&display_axi_clk, &pll1_sw_clk); clk_set_rate(&display_axi_clk, 200000000); - clk_disable(&display_axi_clk); - clk_disable(&pxp_axi_clk); - clk_disable(&elcdif_axi_clk); - - clk_enable(&elcdif_pix_clk); - clk_set_parent(&elcdif_pix_clk, &pll1_sw_clk); - clk_disable(&elcdif_pix_clk); - - /* - * Enable and set EPDC AXI to 200MHz - * For EPDC AXI, source clocks must be - * enabled before dividers can be changed - */ - clk_enable(&epdc_axi_clk); - clk_set_parent(&epdc_axi_clk, &pfd3_clk); - clk_set_rate(&epdc_axi_clk, 200000000); - clk_disable(&epdc_axi_clk); - - clk_set_parent(&epdc_pix_clk, &pfd5_clk); /* Move SSI clocks to SSI_LP_APM clock */ clk_set_parent(&ssi_lp_apm_clk, &lp_apm_clk); @@ -3425,17 +3011,17 @@ int __init mx50_clocks_init(unsigned long ckil, unsigned long osc, unsigned long reg |= 1 << MXC_CCM_CS2CDR_SSI2_CLK_PRED_OFFSET; __raw_writel(reg, MXC_CCM_CS2CDR); - /* Change the SSI_EXT1_CLK to be sourced from SSI1_CLK_ROOT */ - clk_set_parent(&ssi_ext1_clk, &ssi1_clk[0]); + /* Change the SSI_EXT1_CLK to be sourced from PLL2 for camera */ + clk_disable(&ssi_ext1_clk); + clk_set_parent(&ssi_ext1_clk, &pll2_sw_clk); + clk_set_rate(&ssi_ext1_clk, 24000000); + clk_enable(&ssi_ext1_clk); clk_set_parent(&ssi_ext2_clk, &ssi2_clk[0]); /* move usb_phy_clk to 24MHz */ clk_set_parent(&usb_phy_clk[0], &osc_clk); clk_set_parent(&usb_phy_clk[1], &osc_clk); - /* move gpmi-nfc to 24MHz */ - clk_set_parent(&gpmi_nfc_clk[0], &osc_clk); - /* set SDHC root clock as 200MHZ*/ clk_set_rate(&esdhc1_clk[0], 200000000); clk_set_rate(&esdhc3_clk[0], 200000000); @@ -3510,12 +3096,8 @@ int __init mx50_clocks_init(unsigned long ckil, unsigned long osc, unsigned long clk_set_parent(&uart_main_clk, &lp_apm_clk); clk_set_parent(&gpu2d_clk, &axi_b_clk); - clk_set_parent(&weim_clk[0], &ahb_clk); - clk_set_rate(&weim_clk[0], clk_round_rate(&weim_clk[0], 130000000)); - - /* Do the following just to disable the PLL since its not used */ - clk_enable(&pll3_sw_clk); - clk_disable(&pll3_sw_clk); + clk_set_parent(&weim_clk, &ahb_clk); + clk_set_rate(&weim_clk, clk_round_rate(&weim_clk, 130000000)); base = ioremap(MX53_BASE_ADDR(GPT1_BASE_ADDR), SZ_4K); mxc_timer_init(&gpt_clk[0], base, MXC_INT_GPT); diff --git a/arch/arm/mach-mx5/cpu.c b/arch/arm/mach-mx5/cpu.c index 44440569f041..5abba44d25ad 100644 --- a/arch/arm/mach-mx5/cpu.c +++ b/arch/arm/mach-mx5/cpu.c @@ -19,7 +19,6 @@ * @ingroup MSL_MX51 */ -#include <linux/proc_fs.h> #include <linux/types.h> #include <linux/err.h> #include <linux/kernel.h> @@ -29,7 +28,6 @@ #include <linux/clk.h> #include <mach/common.h> #include <mach/hardware.h> -#include <asm/mach/map.h> #define CORTEXA8_PLAT_AMC 0x18 #define SRPG_NEON_PUPSCR 0x284 @@ -43,12 +41,6 @@ void __iomem *arm_plat_base; void __iomem *gpc_base; -void __iomem *ccm_base; -void __iomem *databahn_base; -void *wait_in_iram_base; -void (*wait_in_iram)(void *ccm_addr, void *databahn_addr); - -extern void mx50_wait(u32 ccm_base, u32 databahn_addr); struct cpu_wp *(*get_cpu_wp)(int *wp); void (*set_num_cpu_wp)(int num); @@ -138,8 +130,6 @@ static int __init post_cpu_init(void) } gpc_base = ioremap(MX53_BASE_ADDR(GPC_BASE_ADDR), SZ_4K); - ccm_base = ioremap(MX53_BASE_ADDR(CCM_BASE_ADDR), SZ_4K); - clk_enable(gpcclk); /* Setup the number of clock cycles to wait for SRPG @@ -192,42 +182,6 @@ static int __init post_cpu_init(void) iounmap(base); } - databahn_base = ioremap(MX50_DATABAHN_BASE_ADDR, SZ_16K); - - if (cpu_is_mx50()) { - struct clk *ddr_clk = clk_get(NULL, "ddr_clk"); - unsigned long iram_paddr; - - iram_alloc(SZ_4K, &iram_paddr); - /* Need to remap the area here since we want the memory region - to be executable. */ - wait_in_iram_base = __arm_ioremap(iram_paddr, - SZ_4K, MT_HIGH_VECTORS); - memcpy(wait_in_iram_base, mx50_wait, SZ_4K); - wait_in_iram = (void *)wait_in_iram_base; - - clk_enable(ddr_clk); - - /* Set the DDR to enter automatic self-refresh. */ - /* Set the DDR to automatically enter lower power mode 4. */ - reg = __raw_readl(databahn_base + DATABAHN_CTL_REG22); - reg &= ~LOWPOWER_AUTOENABLE_MASK; - reg |= 1 << 1; - __raw_writel(reg, databahn_base + DATABAHN_CTL_REG22); - - /* set the counter for entering mode 4. */ - reg = __raw_readl(databahn_base + DATABAHN_CTL_REG21); - reg &= ~LOWPOWER_EXTERNAL_CNT_MASK; - reg = 128 << LOWPOWER_EXTERNAL_CNT_OFFSET; - __raw_writel(reg, databahn_base + DATABAHN_CTL_REG21); - - /* Enable low power mode 4 */ - reg = __raw_readl(databahn_base + DATABAHN_CTL_REG20); - reg &= ~LOWPOWER_CONTROL_MASK; - reg |= 1 << 1; - __raw_writel(reg, databahn_base + DATABAHN_CTL_REG20); - clk_disable(ddr_clk); - } return 0; } diff --git a/arch/arm/mach-mx5/crm_regs.h b/arch/arm/mach-mx5/crm_regs.h index b2660a34c0e9..a1444786b72e 100644 --- a/arch/arm/mach-mx5/crm_regs.h +++ b/arch/arm/mach-mx5/crm_regs.h @@ -70,56 +70,6 @@ #define MXC_PLL_DP_DESTAT_TOG_SEL (1 << 31) #define MXC_PLL_DP_DESTAT_MFN 0x07FFFFFF -/* Register addresses of apll and pfd*/ -#define MXC_ANADIG_FRAC0 0x10 -#define MXC_ANADIG_FRAC0_SET 0x14 -#define MXC_ANADIG_FRAC0_CLR 0x18 -#define MXC_ANADIG_FRAC1 0x20 -#define MXC_ANADIG_FRAC1_SET 0x24 -#define MXC_ANADIG_FRAC1_CLR 0x28 -#define MXC_ANADIG_MISC 0x60 -#define MXC_ANADIG_MISC_SET 0x64 -#define MXC_ANADIG_MISC_CLR 0x68 -#define MXC_ANADIG_PLLCTRL 0x70 -#define MXC_ANADIG_PLLCTRL_SET 0x74 -#define MXC_ANADIG_PLLCTRL_CLR 0x78 - -/* apll and pfd Register Bit definitions */ - -#define MXC_ANADIG_PFD3_CLKGATE (1 << 31) -#define MXC_ANADIG_PFD3_STABLE (1 << 30) -#define MXC_ANADIG_PFD3_FRAC_OFFSET 24 -#define MXC_ANADIG_PFD_FRAC_MASK 0x3F -#define MXC_ANADIG_PFD2_CLKGATE (1 << 23) -#define MXC_ANADIG_PFD2_STABLE (1 << 22) -#define MXC_ANADIG_PFD2_FRAC_OFFSET 16 -#define MXC_ANADIG_PFD1_CLKGATE (1 << 15) -#define MXC_ANADIG_PFD1_STABLE (1 << 14) -#define MXC_ANADIG_PFD1_FRAC_OFFSET 8 -#define MXC_ANADIG_PFD0_CLKGATE (1 << 7) -#define MXC_ANADIG_PFD0_STABLE (1 << 6) -#define MXC_ANADIG_PFD0_FRAC_OFFSET 0 - -#define MXC_ANADIG_PFD7_CLKGATE (1 << 31) -#define MXC_ANADIG_PFD7_STABLE (1 << 30) -#define MXC_ANADIG_PFD7_FRAC_OFFSET 24 -#define MXC_ANADIG_PFD6_CLKGATE (1 << 23) -#define MXC_ANADIG_PFD6_STABLE (1 << 22) -#define MXC_ANADIG_PFD6_FRAC_OFFSET 16 -#define MXC_ANADIG_PFD5_CLKGATE (1 << 15) -#define MXC_ANADIG_PFD5_STABLE (1 << 14) -#define MXC_ANADIG_PFD5_FRAC_OFFSET 8 -#define MXC_ANADIG_PFD4_CLKGATE (1 << 7) -#define MXC_ANADIG_PFD4_STABLE (1 << 6) -#define MXC_ANADIG_PFD4_FRAC_OFFSET 0 - -#define MXC_ANADIG_APLL_LOCK (1 << 31) -#define MXC_ANADIG_APLL_FORCE_LOCK (1 << 30) -#define MXC_ANADIG_PFD_DIS_OFFSET 16 -#define MXC_ANADIG_PFD_DIS_MASK 0xff -#define MXC_ANADIG_APLL_LOCK_CNT_OFFSET 0 -#define MXC_ANADIG_APLL_LOCK_CNT_MASK 0xffff - /* Register addresses of CCM*/ #define MXC_CCM_CCR (MXC_CCM_BASE + 0x00) #define MXC_CCM_CCDR (MXC_CCM_BASE + 0x04) @@ -168,11 +118,6 @@ #define MXC_CCM_BCH (MXC_CCM_BASE + 0xB0) #define MXC_CCM_MSHC_XMSCKI (MXC_CCM_BASE + 0xB4) -/* CCM Register Offsets. */ -#define MXC_CCM_CDCR_OFFSET 0x4C -#define MXC_CCM_CACRR_OFFSET 0x10 -#define MXC_CCM_CDHIPR_OFFSET 0x48 - /* Define the bits in register CCR */ #define MXC_CCM_CCR_COSC_EN (1 << 12) #define MXC_CCM_CCR_FPM_MULT_MASK (1 << 11) @@ -234,9 +179,7 @@ #define MXC_CCM_CBCDR_DDR_HF_SEL_OFFSET (30) #define MXC_CCM_CBCDR_DDR_HF_SEL (0x1 << 30) #define MXC_CCM_CBCDR_DDR_PODF_OFFSET (27) -#define MXC_CCM_CBCDR_DDR_PODF_MASK (0x7 << 27) -#define MX50_CCM_CBCDR_WEIM_PODF_OFFSET (22) -#define MX50_CCM_CBCDR_WEIM_PODF_MASK (0x7 << 22) +#define MXC_CCM_CBCDR_DDR_PODF_MASK (0x7 << 27) #define MXC_CCM_CBCDR_EMI_PODF_OFFSET (22) #define MXC_CCM_CBCDR_EMI_PODF_MASK (0x7 << 22) #define MXC_CCM_CBCDR_AXI_B_PODF_OFFSET (19) @@ -298,8 +241,6 @@ #define MX50_CCM_CSCMR1_ESDHC1_CLK_SEL_MASK (0x3 << 21) #define MX50_CCM_CSCMR1_ESDHC2_CLK_SEL (0x1 << 20) #define MX50_CCM_CSCMR1_ESDHC4_CLK_SEL (0x1 << 19) -#define MX50_CCM_CSCMR1_ESDHC3_CLK_SEL_OFFSET (16) -#define MX50_CCM_CSCMR1_ESDHC3_CLK_SEL_MASK (0x7 << 16) #define MXC_CCM_CSCMR1_ESDHC3_MSHC2_CLK_SEL_OFFSET (16) #define MXC_CCM_CSCMR1_ESDHC3_MSHC2_CLK_SEL_MASK (0x3 << 16) #define MXC_CCM_CSCMR1_SSI1_CLK_SEL_OFFSET (14) @@ -832,17 +773,6 @@ #define MXC_CCM_CLKSEQ_BYPASS_BYPASS_DISPLAY_AXI_CLK_SEL_MASK (0x3 << 2) -/* Define the bits in registers CLK_SYS */ -#define MXC_CCM_CLK_SYS_SYS_XTAL_CLKGATE_OFFSET (30) -#define MXC_CCM_CLK_SYS_SYS_XTAL_CLKGATE_MASK (0x3 << 30) -#define MXC_CCM_CLK_SYS_SYS_PLL_CLKGATE_OFFSET (28) -#define MXC_CCM_CLK_SYS_SYS_PLL_CLKGATE_MASK (0x3 << 28) -#define MXC_CCM_CLK_SYS_DIV_XTAL_OFFSET (6) -#define MXC_CCM_CLK_SYS_DIV_XTAL_MASK (0xF << 6) -#define MXC_CCM_CLK_SYS_DIV_PLL_OFFSET (0) -#define MXC_CCM_CLK_SYS_DIV_PLL_MASK (0x3F) - - /* Define the bits in registers CLK_DDR */ #define MXC_CCM_CLK_DDR_DDR_CLKGATE_OFFSET (30) #define MXC_CCM_CLK_DDR_DDR_CLKGATE_MASK (0x3 << 30) @@ -878,19 +808,6 @@ #define MXC_CCM_ELCDIFPIX_CLK_PODF_OFFSET (0) #define MXC_CCM_ELCDIFPIX_CLK_PODF_MASK (0xFFF) - -/* Define the bits in register GPMI */ -#define MXC_CCM_GPMI_CLKGATE_OFFSET (30) -#define MXC_CCM_GPMI_CLKGATE_MASK (0x3 << 30) -#define MXC_CCM_GPMI_CLK_DIV_OFFSET (0) -#define MXC_CCM_GPMI_CLK_DIV_MASK (0x3F) - -/* Define the bits in register BCH */ -#define MXC_CCM_BCH_CLKGATE_OFFSET (30) -#define MXC_CCM_BCH_CLKGATE_MASK (0x3 << 30) -#define MXC_CCM_BCH_CLK_DIV_OFFSET (0) -#define MXC_CCM_BCH_CLK_DIV_MASK (0x3F) - #define MXC_GPC_BASE (IO_ADDRESS(GPC_BASE_ADDR)) #define MXC_DPTC_LP_BASE (MXC_GPC_BASE + 0x80) #define MXC_DPTC_GP_BASE (MXC_GPC_BASE + 0x100) @@ -949,12 +866,11 @@ extern void __iomem *arm_plat_base; #define MXC_DVFSPER_PMCR1 (MXC_DVFS_PER_BASE + 0x1C) /* GPC */ -#define MXC_GPC_CNTR (MXC_GPC_BASE + 0x0) -#define MXC_GPC_PGR (MXC_GPC_BASE + 0x4) -#define MXC_GPC_VCR (MXC_GPC_BASE + 0x8) -#define MXC_GPC_CNTR_OFFSET 0x0 -#define MXC_GPC_PGR_OFFSET 0x4 -#define MXC_GPC_VCR_OFFSET 0x8 +#define MXC_GPC_CNTR (MXC_GPC_BASE + 0x0) +#define MXC_GPC_PGR (MXC_GPC_BASE + 0x4) +#define MXC_GPC_VCR (MXC_GPC_BASE + 0x8) +#define MXC_GPC_ALL_PU (MXC_GPC_BASE + 0xC) +#define MXC_GPC_NEON (MXC_GPC_BASE + 0x10) /* PGC */ #define MXC_PGC_IPU_PGCR (MXC_PGC_IPU_BASE + 0x0) diff --git a/arch/arm/mach-mx5/devices.c b/arch/arm/mach-mx5/devices.c index 09188c771c9d..fe842ea8e23d 100644 --- a/arch/arm/mach-mx5/devices.c +++ b/arch/arm/mach-mx5/devices.c @@ -23,14 +23,12 @@ #include <linux/uio_driver.h> #include <linux/mxc_scc2_driver.h> #include <linux/iram_alloc.h> -#include <linux/gpmi-nfc.h> #include <mach/common.h> #include <mach/hardware.h> #include <mach/gpio.h> #include <mach/sdma.h> #include "mx51_pins.h" #include "devices.h" -#include "dma-apbh.h" /* Flag used to indicate when IRAM has been initialized */ int iram_ready; @@ -98,11 +96,6 @@ struct platform_device mxc_keypad_device = { .resource = mxc_kpp_resources, }; -struct platform_device mxc_powerkey_device = { - .name = "mxcpwrkey", - .id = 0, -}; - static struct resource rtc_resources[] = { { .start = SRTC_BASE_ADDR, @@ -149,55 +142,6 @@ struct platform_device mxc_nandv2_mtd_device = { .num_resources = ARRAY_SIZE(mxc_nand_resources), }; -static struct resource gpmi_nfc_resources[] = { - { - .name = GPMI_NFC_GPMI_REGS_ADDR_RES_NAME, - .flags = IORESOURCE_MEM, - .start = GPMI_BASE_ADDR, - .end = GPMI_BASE_ADDR + SZ_8K - 1, - }, - { - .name = GPMI_NFC_GPMI_INTERRUPT_RES_NAME, - .flags = IORESOURCE_IRQ, - .start = MXC_INT_RAWNAND_GPMI, - .end = MXC_INT_RAWNAND_GPMI, - }, - { - .name = GPMI_NFC_BCH_REGS_ADDR_RES_NAME, - .flags = IORESOURCE_MEM, - .start = BCH_BASE_ADDR, - .end = BCH_BASE_ADDR + SZ_8K - 1, - }, - { - .name = GPMI_NFC_BCH_INTERRUPT_RES_NAME, - .flags = IORESOURCE_IRQ, - .start = MXC_INT_RAWNAND_BCH, - .end = MXC_INT_RAWNAND_BCH, - }, - { - .name = GPMI_NFC_DMA_CHANNELS_RES_NAME, - .flags = IORESOURCE_DMA, - .start = MXS_DMA_CHANNEL_AHB_APBH_GPMI0, - .end = MXS_DMA_CHANNEL_AHB_APBH_GPMI7, - }, - { - .name = GPMI_NFC_DMA_INTERRUPT_RES_NAME, - .flags = IORESOURCE_IRQ, - .start = MXC_INT_APBHDMA_CHAN0, - .end = MXC_INT_APBHDMA_CHAN7, - }, -}; - -struct platform_device gpmi_nfc_device = { - .name = GPMI_NFC_DRIVER_NAME, - .id = 0, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - }, - .resource = gpmi_nfc_resources, - .num_resources = ARRAY_SIZE(gpmi_nfc_resources), -}; - static struct resource imx_nfc_resources[] = { { .flags = IORESOURCE_MEM, @@ -498,53 +442,6 @@ struct platform_device mxcscc_device = { .resource = scc_resources, }; -static struct resource dcp_resources[] = { - - { - .flags = IORESOURCE_MEM, - .start = DCP_BASE_ADDR, - .end = DCP_BASE_ADDR + 0x2000 - 1, - }, { - .flags = IORESOURCE_IRQ, - .start = MXC_INT_DCP_CHAN0, - .end = MXC_INT_DCP_CHAN0, - }, { - .flags = IORESOURCE_IRQ, - .start = MXC_INT_DCP_CHAN1_3, - .end = MXC_INT_DCP_CHAN1_3, - }, -}; - -struct platform_device dcp_device = { - .name = "dcp", - .id = 0, - .num_resources = ARRAY_SIZE(dcp_resources), - .resource = dcp_resources, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - - -static struct resource rngb_resources[] = { - { - .start = RNGB_BASE_ADDR, - .end = RNGB_BASE_ADDR + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = MXC_INT_RNGB_BLOCK, - .flags = IORESOURCE_IRQ, - }, -}; - -/* the RNGC driver applies for MX50's RNGB hw */ -struct platform_device mxc_rngb_device = { - .name = "fsl_rngc", - .id = 0, - .num_resources = ARRAY_SIZE(rngb_resources), - .resource = rngb_resources, -}; static struct resource mxc_fec_resources[] = { { @@ -1063,20 +960,6 @@ struct platform_device pata_fsl_device = { }, }; -/* On-Chip OTP device and resource */ -static struct resource otp_resource = { - .start = OCOTP_CTRL_BASE_ADDR, - .end = OCOTP_CTRL_BASE_ADDR + SZ_8K - 1, - .flags = IORESOURCE_MEM, -}; - -struct platform_device fsl_otp_device = { - .name = "ocotp", - .id = -1, - .resource = &otp_resource, - .num_resources = 1, -}; - static struct resource ahci_fsl_resources[] = { { .start = MX53_SATA_BASE_ADDR, @@ -1102,19 +985,7 @@ struct platform_device ahci_fsl_device = { static u64 usb_dma_mask = DMA_BIT_MASK(32); -static struct resource usbotg_host_resources[] = { - { - .start = OTG_BASE_ADDR, - .end = OTG_BASE_ADDR + 0x1ff, - .flags = IORESOURCE_MEM, - }, - { - .start = MXC_INT_USB_OTG, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource usbotg_udc_resources[] = { +static struct resource usbotg_resources[] = { { .start = OTG_BASE_ADDR, .end = OTG_BASE_ADDR + 0x1ff, @@ -1145,8 +1016,8 @@ struct platform_device mxc_usbdr_udc_device = { .dma_mask = &usb_dma_mask, .coherent_dma_mask = DMA_BIT_MASK(32), }, - .resource = usbotg_udc_resources, - .num_resources = ARRAY_SIZE(usbotg_udc_resources), + .resource = usbotg_resources, + .num_resources = ARRAY_SIZE(usbotg_resources), }; struct platform_device mxc_usbdr_otg_device = { @@ -1163,8 +1034,8 @@ struct platform_device mxc_usbdr_otg_device = { struct platform_device mxc_usbdr_host_device = { .name = "fsl-ehci", .id = 0, - .num_resources = ARRAY_SIZE(usbotg_host_resources), - .resource = usbotg_host_resources, + .num_resources = ARRAY_SIZE(usbotg_resources), + .resource = usbotg_resources, .dev = { .dma_mask = &usb_dma_mask, .coherent_dma_mask = DMA_BIT_MASK(32), @@ -1405,74 +1276,6 @@ struct platform_device mxc_pxp_client_device = { .id = -1, }; -static u64 pxp_dma_mask = DMA_BIT_MASK(32); -struct platform_device mxc_pxp_v4l2 = { - .name = "pxp-v4l2", - .id = -1, - .dev = { - .dma_mask = &pxp_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -struct platform_device mxc_v4l2_device = { - .name = "mxc_v4l2_capture", - .id = 0, -}; - -struct platform_device mxc_v4l2out_device = { - .name = "mxc_v4l2_output", - .id = 0, -}; - -struct resource viim_resources[] = { - [0] = { - .start = (GPT1_BASE_ADDR - 0x20000000), - .end = (GPT1_BASE_ADDR - 0x20000000) + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = OCOTP_CTRL_BASE_ADDR, - .end = OCOTP_CTRL_BASE_ADDR + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; -struct platform_device mxs_viim = { - .name = "mxs_viim", - .id = -1, - .num_resources = ARRAY_SIZE(viim_resources), - .resource = viim_resources, -}; - -static struct resource dma_apbh_resources[] = { - { - .start = APBHDMA_BASE_ADDR, - .end = APBHDMA_BASE_ADDR + 0x2000 - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device mxs_dma_apbh_device = { - .name = "mxs-dma-apbh", - .num_resources = ARRAY_SIZE(dma_apbh_resources), - .resource = dma_apbh_resources, -}; - -struct platform_device mxc_android_pmem_device = { - .name = "android_pmem", - .id = 0, -}; - -struct platform_device mxc_android_pmem_gpu_device = { - .name = "android_pmem", - .id = 1, -}; - -struct platform_device android_usb_device = { - .name = "android_usb", - .id = -1, -}; - void __init mx5_init_irq(void) { unsigned long tzic_addr; @@ -1731,8 +1534,6 @@ int __init mxc_init_devices(void) scc_resources[0].end -= MX53_OFFSET; scc_resources[1].start = MX53_SCC_RAM_BASE_ADDR; scc_resources[1].end = MX53_SCC_RAM_BASE_ADDR + SZ_16K - 1; - rngb_resources[0].start -= MX53_OFFSET; - rngb_resources[0].end -= MX53_OFFSET; mxcspi1_resources[0].start -= MX53_OFFSET; mxcspi1_resources[0].end -= MX53_OFFSET; mxcspi2_resources[0].start -= MX53_OFFSET; @@ -1773,10 +1574,8 @@ int __init mxc_init_devices(void) mxcsdhc2_resources[0].end -= MX53_OFFSET; mxcsdhc3_resources[0].start -= MX53_OFFSET; mxcsdhc3_resources[0].end -= MX53_OFFSET; - usbotg_host_resources[0].start -= MX53_OFFSET; - usbotg_host_resources[0].end -= MX53_OFFSET; - usbotg_udc_resources[0].start -= MX53_OFFSET; - usbotg_udc_resources[0].end -= MX53_OFFSET; + usbotg_resources[0].start -= MX53_OFFSET; + usbotg_resources[0].end -= MX53_OFFSET; usbotg_xcvr_resources[0].start -= MX53_OFFSET; usbotg_xcvr_resources[0].end -= MX53_OFFSET; usbh1_resources[0].start -= MX53_OFFSET; @@ -1785,20 +1584,10 @@ int __init mxc_init_devices(void) usbh2_resources[0].end -= MX53_OFFSET; mxc_gpu_resources[2].start = MX53_GPU2D_BASE_ADDR; mxc_gpu_resources[2].end = MX53_GPU2D_BASE_ADDR + SZ_4K - 1; + mxc_gpu_resources[4].start = MX53_GPU_GMEM_BASE_ADDR; + mxc_gpu_resources[4].end = MX53_GPU_GMEM_BASE_ADDR + SZ_256K - 1; mxc_gpu2d_resources[0].start = MX53_GPU2D_BASE_ADDR; mxc_gpu2d_resources[0].end = MX53_GPU2D_BASE_ADDR + SZ_4K - 1; - if (cpu_is_mx53()) { - mxc_gpu_resources[4].start = MX53_GPU_GMEM_BASE_ADDR; - mxc_gpu_resources[4].end = MX53_GPU_GMEM_BASE_ADDR - + SZ_256K - 1; - } else { - mxc_gpu_resources[1].start = 0; - mxc_gpu_resources[1].end = 0; - mxc_gpu_resources[3].start = 0; - mxc_gpu_resources[3].end = 0; - mxc_gpu_resources[4].start = 0; - mxc_gpu_resources[4].end = 0; - } ipu_resources[0].start = MX53_IPU_CTRL_BASE_ADDR; ipu_resources[0].end = MX53_IPU_CTRL_BASE_ADDR + SZ_128M - 1; mlb_resources[0].start -= MX53_OFFSET; diff --git a/arch/arm/mach-mx5/devices.h b/arch/arm/mach-mx5/devices.h index da6c6ac96428..8aaa128c561d 100644 --- a/arch/arm/mach-mx5/devices.h +++ b/arch/arm/mach-mx5/devices.h @@ -57,7 +57,6 @@ extern struct platform_device mxcsdhc2_device; extern struct platform_device mxcsdhc3_device; extern struct platform_device ahci_fsl_device; extern struct platform_device pata_fsl_device; -extern struct platform_device fsl_otp_device; extern struct platform_device gpu_device; extern struct platform_device mxc_fec_device; extern struct platform_device mxc_usbdr_udc_device; @@ -72,18 +71,5 @@ extern void __init ccwmx51_init_devices ( void ); extern struct platform_device mxc_nandv2_mtd_device; extern struct platform_device mxc_pxp_device; extern struct platform_device mxc_pxp_client_device; -extern struct platform_device mxc_pxp_v4l2; extern struct platform_device epdc_device; extern struct platform_device elcdif_device; -extern struct platform_device mxc_v4l2_device; -extern struct platform_device mxc_v4l2out_device; -extern struct platform_device mxs_viim; -extern struct platform_device mxs_dma_apbh_device; -extern struct platform_device gpmi_nfc_device; -extern struct platform_device mxc_rngb_device; -extern struct platform_device dcp_device; -extern struct platform_device mxc_android_pmem_device; -extern struct platform_device mxc_android_pmem_gpu_device; -extern struct platform_device android_usb_device; -extern struct platform_device mxc_powerkey_device; -extern struct platform_device ccwmx51js_keys_gpio; diff --git a/arch/arm/mach-mx5/devices_ccwmx51.c b/arch/arm/mach-mx5/devices_ccwmx51.c index 27eb3dc32064..bd96da04bc62 100644 --- a/arch/arm/mach-mx5/devices_ccwmx51.c +++ b/arch/arm/mach-mx5/devices_ccwmx51.c @@ -55,8 +55,6 @@ #include "mx51_pins.h" #include "displays/displays.h" #include <linux/smc911x.h> -#include <linux/fec.h> -#include <linux/gpio_keys.h> #if defined(CONFIG_MTD) || defined(CONFIG_MTD_MODULE) #include <linux/mtd/mtd.h> @@ -523,11 +521,11 @@ struct mxc_dvfs_platform_data dvfs_core_data = { .reg_id = "SW1", .clk1_id = "cpu_clk", .clk2_id = "gpc_dvfs_clk", - .gpc_cntr_offset = MXC_GPC_CNTR_OFFSET, - .gpc_vcr_offset = MXC_GPC_VCR_OFFSET, - .ccm_cdcr_offset = MXC_CCM_CDCR_OFFSET, - .ccm_cacrr_offset = MXC_CCM_CACRR_OFFSET, - .ccm_cdhipr_offset = MXC_CCM_CDHIPR_OFFSET, + .gpc_cntr_reg_addr = MXC_GPC_CNTR, + .gpc_vcr_reg_addr = MXC_GPC_VCR, + .ccm_cdcr_reg_addr = MXC_CCM_CDCR, + .ccm_cacrr_reg_addr = MXC_CCM_CACRR, + .ccm_cdhipr_reg_addr = MXC_CCM_CDHIPR, .prediv_mask = 0x1F800, .prediv_offset = 11, .prediv_val = 3, @@ -561,11 +559,6 @@ struct mxc_dvfsper_data dvfs_per_data = { .lp_low = 1200000, }; -struct fec_platform_data fec_data = { - .phy = PHY_INTERFACE_MODE_MII, - .phy_mask = ~1UL, -}; - struct platform_pwm_backlight_data mxc_pwm_backlight_data = { .pwm_id = 0, .max_brightness = 255, @@ -593,49 +586,6 @@ struct mxc_fb_platform_data mx51_fb_data[2] = { } }; -#if defined(CONFIG_KEYBOARD_GPIO) - -#define GPIO_BUTTON(gpio_num, ev_type, ev_code, act_low, descr) \ -{ \ - .gpio = gpio_num, \ - .type = ev_type, \ - .code = ev_code, \ - .active_low = act_low, \ - .desc = "btn " descr, \ -} - -#define GPIO_BUTTON_LOW(gpio_num, event_code, description) \ - GPIO_BUTTON(gpio_num, EV_KEY, event_code, 1, description) - -// user key 1 -#if defined(CONFIG_JSCCWMX51_V2) -#define USER_KEY2_GPIO_NR 70 -#else -#define USER_KEY2_GPIO_NR 8 -#endif -// user key 2 -#define USER_KEY1_GPIO_NR 1 - -static struct gpio_keys_button ccwmx51js_gpio_keys[] = { - GPIO_BUTTON_LOW(USER_KEY1_GPIO_NR, KEY_MENU, "menu"), - GPIO_BUTTON_LOW(USER_KEY2_GPIO_NR, KEY_HOME, "home"), -}; - - -struct gpio_keys_platform_data ccwmx51js_gpio_key_info = { - .buttons = ccwmx51js_gpio_keys, - .nbuttons = ARRAY_SIZE(ccwmx51js_gpio_keys), -}; - -struct platform_device ccwmx51js_keys_gpio = { - .name = "gpio-keys", - .id = -1, - .dev = { - .platform_data = &ccwmx51js_gpio_key_info, - }, -}; -#endif // KEYBOARD_GPIO - #if defined(CONFIG_FB_MXC_SYNC_PANEL) || defined(CONFIG_FB_MXC_SYNC_PANEL_MODULE) struct ccwmx51_lcd_pdata plcd_platform_data[2]; diff --git a/arch/arm/mach-mx5/devices_ccwmx51.h b/arch/arm/mach-mx5/devices_ccwmx51.h index 6e53be44a5f5..672bee19a123 100644 --- a/arch/arm/mach-mx5/devices_ccwmx51.h +++ b/arch/arm/mach-mx5/devices_ccwmx51.h @@ -28,7 +28,6 @@ extern struct mxc_w1_config mxc_w1_data; extern struct mxc_spdif_platform_data mxc_spdif_data; extern struct tve_platform_data tve_data; extern struct mxc_dvfs_platform_data dvfs_core_data; -extern struct fec_platform_data fec_data; extern struct mxc_dvfsper_data dvfs_per_data; extern struct platform_pwm_backlight_data mxc_pwm_backlight_data; extern struct mxc_audio_platform_data wm8753_data; @@ -48,9 +47,5 @@ extern void ccwmx51_set_mod_sn(u32 sn); extern void ccwmx51_register_sdio(int interface); extern void ccwmx51_init_devices(void); extern int ccwmx51_create_sysfs_entries(void); -extern struct gpio_keys_platform_data ccwmx51js_gpio_key_info; -extern void ccwmx51_init_devices(void); -extern int ccwmx51_create_sysfs_entries(void); - #endif /* DEVICES_CCWMX51_H_ */ diff --git a/arch/arm/mach-mx5/displays/hdmi_ad9389.h b/arch/arm/mach-mx5/displays/hdmi_ad9389.h index 2a29cd783b48..b800fca3e9ff 100644 --- a/arch/arm/mach-mx5/displays/hdmi_ad9389.h +++ b/arch/arm/mach-mx5/displays/hdmi_ad9389.h @@ -24,6 +24,7 @@ static struct fb_videomode ad9389_1280x720x24 = { .lower_margin = 3, .hsync_len = 32, .vsync_len = 6, + .sync = FB_SYNC_CLK_LAT_FALL, }; static struct fb_videomode ad9389_1360x768x24 = { @@ -38,6 +39,7 @@ static struct fb_videomode ad9389_1360x768x24 = { .lower_margin = 18, .hsync_len = 76, .vsync_len = 6, + .sync = FB_SYNC_CLK_LAT_FALL, }; @@ -53,6 +55,7 @@ static struct fb_videomode ad9389_1366x768x24 = { .lower_margin = 18, .hsync_len = 76, .vsync_len = 6, + .sync = FB_SYNC_CLK_LAT_FALL, }; static struct fb_videomode ad9389_1920x1080x24 = { @@ -67,6 +70,7 @@ static struct fb_videomode ad9389_1920x1080x24 = { .lower_margin = 4, .hsync_len = 44, .vsync_len = 5, + .sync = 0, }; static struct fb_videomode ad9389_1024x768x24 = { diff --git a/arch/arm/mach-mx5/mm.c b/arch/arm/mach-mx5/mm.c index 21d654298b54..575c49830989 100644 --- a/arch/arm/mach-mx5/mm.c +++ b/arch/arm/mach-mx5/mm.c @@ -16,7 +16,6 @@ #include <mach/hardware.h> #include <asm/pgtable.h> #include <asm/mach/map.h> -#include <mach/iomux-v3.h> /*! * @file mach-mx51/mm.c @@ -61,7 +60,6 @@ void __init mx5_map_io(void) { int i; - mxc_iomux_v3_init(IO_ADDRESS(IOMUXC_BASE_ADDR)); /* Fixup the mappings for MX53 */ if (cpu_is_mx53() || cpu_is_mx50()) { for (i = 0; i < ARRAY_SIZE(mx5_io_desc); i++) diff --git a/arch/arm/mach-mx5/mx50_arm2.c b/arch/arm/mach-mx5/mx50_arm2.c index 13de0971ace4..3a4e8dc3e923 100644 --- a/arch/arm/mach-mx5/mx50_arm2.c +++ b/arch/arm/mach-mx5/mx50_arm2.c @@ -44,9 +44,6 @@ #include <linux/videodev2.h> #include <linux/mxcfb.h> #include <linux/fec.h> -#include <linux/gpmi-nfc.h> -#include <linux/android_pmem.h> -#include <linux/usb/android.h> #include <asm/irq.h> #include <asm/setup.h> #include <asm/mach-types.h> @@ -59,248 +56,29 @@ #include <mach/gpio.h> #include <mach/mmc.h> #include <mach/mxc_dvfs.h> -#include <mach/iomux-mx50.h> - +#include "iomux.h" +#include "mx50_pins.h" #include "devices.h" -#include "crm_regs.h" #include "usb.h" -#include "dma-apbh.h" - -#define SD1_WP (3*32 + 19) /*GPIO_4_19 */ -#define SD1_CD (0*32 + 27) /*GPIO_1_27 */ -#define SD2_WP (4*32 + 16) /*GPIO_5_16 */ -#define SD2_CD (4*32 + 17) /*GPIO_5_17 */ -#define SD3_WP (4*32 + 28) /*GPIO_5_28 */ -#define SD3_CD (3*32 + 4) /*GPIO_4_4 */ -#define HP_DETECT (3*32 + 15) /*GPIO_4_15 */ -#define PWR_INT (3*32 + 18) /*GPIO_4_18 */ - -#define EPDC_D0 (2*32 + 1) /*GPIO_3_0 */ -#define EPDC_D1 (2*32 + 2) /*GPIO_3_1 */ -#define EPDC_D2 (2*32 + 3) /*GPIO_3_2 */ -#define EPDC_D3 (2*32 + 4) /*GPIO_3_3 */ -#define EPDC_D4 (2*32 + 5) /*GPIO_3_4 */ -#define EPDC_D5 (2*32 + 6) /*GPIO_3_5 */ -#define EPDC_D6 (2*32 + 7) /*GPIO_3_6 */ -#define EPDC_D7 (2*32 + 8) /*GPIO_3_7 */ -#define EPDC_GDCLK (2*32 + 16) /*GPIO_3_16 */ -#define EPDC_GDSP (2*32 + 17) /*GPIO_3_17 */ -#define EPDC_GDOE (2*32 + 18) /*GPIO_3_18 */ -#define EPDC_GDRL (2*32 + 19) /*GPIO_3_19 */ -#define EPDC_SDCLK (2*32 + 20) /*GPIO_3_20 */ -#define EPDC_SDOE (2*32 + 23) /*GPIO_3_23 */ -#define EPDC_SDLE (2*32 + 24) /*GPIO_3_24 */ -#define EPDC_SDSHR (2*32 + 26) /*GPIO_3_26 */ -#define EPDC_BDR0 (3*32 + 23) /*GPIO_4_23 */ -#define EPDC_SDCE0 (3*32 + 25) /*GPIO_4_25 */ -#define EPDC_SDCE1 (3*32 + 26) /*GPIO_4_26 */ -#define EPDC_SDCE2 (3*32 + 27) /*GPIO_4_27 */ - -#define EPDC_PMIC_WAKE (5*32 + 16) /*GPIO_6_16 */ -#define EPDC_PMIC_INT (5*32 + 17) /*GPIO_6_17 */ -#define EPDC_VCOM (3*32 + 21) /*GPIO_4_21 */ -#define EPDC_PWRSTAT (2*32 + 28) /*GPIO_3_28 */ -#define EPDC_ELCDIF_BACKLIGHT (1*32 + 18) /*GPIO_2_18 */ -#define CSPI_CS1 (3*32 + 13) /*GPIO_4_13 */ -#define CSPI_CS2 (3*32 + 11) /*GPIO_4_11*/ +extern void __init mx50_arm2_io_init(void); extern int __init mx50_arm2_init_mc13892(void); extern struct cpu_wp *(*get_cpu_wp)(int *wp); extern void (*set_num_cpu_wp)(int num); -static int num_cpu_wp = 2; - -static struct pad_desc mx50_armadillo2[] = { - /* SD1 */ - MX50_PAD_ECSPI2_SS0__GPIO_4_19, - MX50_PAD_EIM_CRE__GPIO_1_27, - MX50_PAD_SD1_CMD__SD1_CMD, - - MX50_PAD_SD1_CLK__SD1_CLK, - MX50_PAD_SD1_D0__SD1_D0, - MX50_PAD_SD1_D1__SD1_D1, - MX50_PAD_SD1_D2__SD1_D2, - MX50_PAD_SD1_D3__SD1_D3, - - /* SD2 */ - MX50_PAD_SD2_CD__GPIO_5_17, - MX50_PAD_SD2_WP__GPIO_5_16, - MX50_PAD_SD2_CMD__SD2_CMD, - MX50_PAD_SD2_CLK__SD2_CLK, - MX50_PAD_SD2_D0__SD2_D0, - MX50_PAD_SD2_D1__SD2_D1, - MX50_PAD_SD2_D2__SD2_D2, - MX50_PAD_SD2_D3__SD2_D3, - MX50_PAD_SD2_D4__SD2_D4, - MX50_PAD_SD2_D5__SD2_D5, - MX50_PAD_SD2_D6__SD2_D6, - MX50_PAD_SD2_D7__SD2_D7, - - /* SD3 */ - MX50_PAD_SD3_WP__GPIO_5_28, - MX50_PAD_KEY_COL2__GPIO_4_4, - MX50_PAD_SD3_CMD__SD3_CMD, - MX50_PAD_SD3_CLK__SD3_CLK, - MX50_PAD_SD3_D0__SD3_D0, - MX50_PAD_SD3_D1__SD3_D1, - MX50_PAD_SD3_D2__SD3_D2, - MX50_PAD_SD3_D3__SD3_D3, - MX50_PAD_SD3_D4__SD3_D4, - MX50_PAD_SD3_D5__SD3_D5, - MX50_PAD_SD3_D6__SD3_D6, - MX50_PAD_SD3_D7__SD3_D7, - - MX50_PAD_SSI_RXD__SSI_RXD, - MX50_PAD_SSI_TXD__SSI_TXD, - MX50_PAD_SSI_TXC__SSI_TXC, - MX50_PAD_SSI_TXFS__SSI_TXFS, - - /* LINE1_DETECT (headphone detect) */ - MX50_PAD_ECSPI1_SS0__GPIO_4_15, - - /* PWR_INT */ - MX50_PAD_ECSPI2_MISO__GPIO_4_18, - - /* UART pad setting */ - MX50_PAD_UART1_TXD__UART1_TXD, - MX50_PAD_UART1_RXD__UART1_RXD, - MX50_PAD_UART1_CTS__UART1_CTS, - MX50_PAD_UART1_RTS__UART1_RTS, - MX50_PAD_UART2_TXD__UART2_TXD, - MX50_PAD_UART2_RXD__UART2_RXD, - MX50_PAD_UART2_CTS__UART2_CTS, - MX50_PAD_UART2_RTS__UART2_RTS, - - MX50_PAD_I2C1_SCL__I2C1_SCL, - MX50_PAD_I2C1_SDA__I2C1_SDA, - MX50_PAD_I2C2_SCL__I2C2_SCL, - MX50_PAD_I2C2_SDA__I2C2_SDA, - MX50_PAD_I2C3_SCL__I2C3_SCL, - MX50_PAD_I2C3_SDA__I2C3_SDA, - - /* EPDC pins */ - MX50_PAD_EPDC_D0__EPDC_D0, - MX50_PAD_EPDC_D1__EPDC_D1, - MX50_PAD_EPDC_D2__EPDC_D2, - MX50_PAD_EPDC_D3__EPDC_D3, - MX50_PAD_EPDC_D4__EPDC_D4, - MX50_PAD_EPDC_D5__EPDC_D5, - MX50_PAD_EPDC_D6__EPDC_D6, - MX50_PAD_EPDC_D7__EPDC_D7, - MX50_PAD_EPDC_GDCLK__EPDC_GDCLK, - MX50_PAD_EPDC_GDSP__EPDC_GDSP, - MX50_PAD_EPDC_GDOE__EPDC_GDOE , - MX50_PAD_EPDC_GDRL__EPDC_GDRL, - MX50_PAD_EPDC_SDCLK__EPDC_SDCLK, - MX50_PAD_EPDC_SDOE__EPDC_SDOE, - MX50_PAD_EPDC_SDLE__EPDC_SDLE, - MX50_PAD_EPDC_SDSHR__EPDC_SDSHR, - MX50_PAD_EPDC_BDR0__EPDC_BDR0, - MX50_PAD_EPDC_SDCE0__EPDC_SDCE0, - MX50_PAD_EPDC_SDCE1__EPDC_SDCE1, - MX50_PAD_EPDC_SDCE2__EPDC_SDCE2, - - MX50_PAD_EPDC_PWRSTAT__GPIO_3_28, - MX50_PAD_EPDC_VCOM0__GPIO_4_21, - - MX50_PAD_DISP_D8__DISP_D8, - MX50_PAD_DISP_D9__DISP_D9, - MX50_PAD_DISP_D10__DISP_D10, - MX50_PAD_DISP_D11__DISP_D11, - MX50_PAD_DISP_D12__DISP_D12, - MX50_PAD_DISP_D13__DISP_D13, - MX50_PAD_DISP_D14__DISP_D14, - MX50_PAD_DISP_D15__DISP_D15, - MX50_PAD_DISP_RS__ELCDIF_VSYNC, - - /* ELCDIF contrast */ - MX50_PAD_DISP_BUSY__GPIO_2_18, - - MX50_PAD_DISP_CS__ELCDIF_HSYNC, - MX50_PAD_DISP_RD__ELCDIF_EN, - MX50_PAD_DISP_WR__ELCDIF_PIXCLK, - - /* EPD PMIC WAKEUP */ - MX50_PAD_UART4_TXD__GPIO_6_16, - - /* EPD PMIC intr */ - MX50_PAD_UART4_RXD__GPIO_6_17, - - MX50_PAD_EPITO__USBH1_PWR, - /* Need to comment below line if - * one needs to debug owire. - */ - MX50_PAD_OWIRE__USBH1_OC, - MX50_PAD_PWM2__USBOTG_PWR, - MX50_PAD_PWM1__USBOTG_OC, - - MX50_PAD_SSI_RXC__FEC_MDIO, - MX50_PAD_SSI_RXC__FEC_MDIO, - MX50_PAD_DISP_D0__FEC_TXCLK, - MX50_PAD_DISP_D1__FEC_RX_ER, - MX50_PAD_DISP_D2__FEC_RX_DV, - MX50_PAD_DISP_D3__FEC_RXD1, - MX50_PAD_DISP_D4__FEC_RXD0, - MX50_PAD_DISP_D5__FEC_TX_EN, - MX50_PAD_DISP_D6__FEC_TXD1, - MX50_PAD_DISP_D7__FEC_TXD0, - MX50_PAD_SSI_RXFS__FEC_MDC, - - MX50_PAD_CSPI_SS0__CSPI_SS0, - MX50_PAD_ECSPI1_MOSI__CSPI_SS1, - MX50_PAD_CSPI_MOSI__CSPI_MOSI, - MX50_PAD_CSPI_MISO__CSPI_MISO, -}; - -static struct pad_desc mx50_gpmi_nand[] = { - MX50_PIN_EIM_DA8__NANDF_CLE, - MX50_PIN_EIM_DA9__NANDF_ALE, - MX50_PIN_EIM_DA10__NANDF_CE0, - MX50_PIN_EIM_DA11__NANDF_CE1, - MX50_PIN_EIM_DA12__NANDF_CE2, - MX50_PIN_EIM_DA13__NANDF_CE3, - MX50_PIN_EIM_DA14__NANDF_READY, - MX50_PIN_EIM_DA15__NANDF_DQS, - MX50_PIN_SD3_D4__NANDF_D0, - MX50_PIN_SD3_D5__NANDF_D1, - MX50_PIN_SD3_D6__NANDF_D2, - MX50_PIN_SD3_D7__NANDF_D3, - MX50_PIN_SD3_D0__NANDF_D4, - MX50_PIN_SD3_D1__NANDF_D5, - MX50_PIN_SD3_D2__NANDF_D6, - MX50_PIN_SD3_D3__NANDF_D7, - MX50_PIN_SD3_CLK__NANDF_RDN, - MX50_PIN_SD3_CMD__NANDF_WRN, - MX50_PIN_SD3_WP__NANDF_RESETN, -}; - -static struct mxc_dvfs_platform_data dvfs_core_data = { - .reg_id = "SW1", - .clk1_id = "cpu_clk", - .clk2_id = "gpc_dvfs_clk", - .gpc_cntr_offset = MXC_GPC_CNTR_OFFSET, - .gpc_vcr_offset = MXC_GPC_VCR_OFFSET, - .ccm_cdcr_offset = MXC_CCM_CDCR_OFFSET, - .ccm_cacrr_offset = MXC_CCM_CACRR_OFFSET, - .ccm_cdhipr_offset = MXC_CCM_CDHIPR_OFFSET, - .prediv_mask = 0x1F800, - .prediv_offset = 11, - .prediv_val = 3, - .div3ck_mask = 0xE0000000, - .div3ck_offset = 29, - .div3ck_val = 2, - .emac_val = 0x08, - .upthr_val = 25, - .dnthr_val = 9, - .pncthr_val = 33, - .upcnt_val = 10, - .dncnt_val = 10, - .delay_time = 30, - .num_wp = 2, -}; +static int num_cpu_wp = 3; /* working point(wp): 0 - 800MHz; 1 - 166.25MHz; */ static struct cpu_wp cpu_wp_auto[] = { { + .pll_rate = 1000000000, + .cpu_rate = 1000000000, + .pdf = 0, + .mfi = 10, + .mfd = 11, + .mfn = 5, + .cpu_podf = 0, + .cpu_voltage = 1175000,}, + { .pll_rate = 800000000, .cpu_rate = 800000000, .pdf = 0, @@ -308,10 +86,10 @@ static struct cpu_wp cpu_wp_auto[] = { .mfd = 2, .mfn = 1, .cpu_podf = 0, - .cpu_voltage = 1050000,}, + .cpu_voltage = 1100000,}, { .pll_rate = 800000000, - .cpu_rate = 160000000, + .cpu_rate = 166250000, .pdf = 4, .mfi = 8, .mfd = 2, @@ -338,83 +116,12 @@ static struct mxc_w1_config mxc_w1_data = { static struct fec_platform_data fec_data = { .phy = PHY_INTERFACE_MODE_RMII, - .phy_mask = ~1UL, }; -/* workaround for cspi chipselect pin may not keep correct level when idle */ -static void mx50_arm2_gpio_spi_chipselect_active(int cspi_mode, int status, - int chipselect) -{ - switch (cspi_mode) { - case 1: - break; - case 2: - break; - case 3: - switch (chipselect) { - case 0x1: - { - struct pad_desc cspi_ss0 = MX50_PAD_CSPI_SS0__CSPI_SS0; - struct pad_desc cspi_cs1 = MX50_PAD_ECSPI1_MOSI__GPIO_4_13; - - /* pull up/down deassert it */ - mxc_iomux_v3_setup_pad(&cspi_ss0); - mxc_iomux_v3_setup_pad(&cspi_cs1); - - gpio_request(CSPI_CS1, "cspi-cs1"); - gpio_direction_input(CSPI_CS1); - } - break; - case 0x2: - { - struct pad_desc cspi_ss1 = MX50_PAD_ECSPI1_MOSI__CSPI_SS1; - struct pad_desc cspi_ss0 = MX50_PAD_CSPI_SS0__GPIO_4_11; - - /*disable other ss */ - mxc_iomux_v3_setup_pad(&cspi_ss1); - mxc_iomux_v3_setup_pad(&cspi_ss0); - - /* pull up/down deassert it */ - gpio_request(CSPI_CS2, "cspi-cs2"); - gpio_direction_input(CSPI_CS2); - } - break; - default: - break; - } - break; - - default: - break; - } -} - -static void mx50_arm2_gpio_spi_chipselect_inactive(int cspi_mode, int status, - int chipselect) -{ - switch (cspi_mode) { - case 1: - break; - case 2: - break; - case 3: - switch (chipselect) { - case 0x1: - gpio_free(CSPI_CS1); - break; - case 0x2: - gpio_free(CSPI_CS2); - break; - default: - break; - } - break; - default: - break; - } - -} - +extern void mx50_arm2_gpio_spi_chipselect_active(int cspi_mode, int status, + int chipselect); +extern void mx50_arm2_gpio_spi_chipselect_inactive(int cspi_mode, int status, + int chipselect); static struct mxc_spi_master mxcspi1_data = { .maxchipselect = 4, .spi_version = 23, @@ -437,8 +144,6 @@ static struct mxc_srtc_platform_data srtc_data = { .srtc_sec_mode_addr = OCOTP_CTRL_BASE_ADDR + 0x80, }; -static int z160_version = 1; - #define mV_to_uV(mV) (mV * 1000) #define uV_to_mV(uV) (uV / 1000) #define V_to_uV(V) (mV_to_uV(V * 1000)) @@ -495,246 +200,7 @@ static struct regulator_init_data max17135_init_data[] __initdata = { }, }; -static void epdc_get_pins(void) -{ - /* Claim GPIOs for EPDC pins - used during power up/down */ - gpio_request(EPDC_D0, "epdc_d0"); - gpio_request(EPDC_D1, "epdc_d1"); - gpio_request(EPDC_D2, "epdc_d2"); - gpio_request(EPDC_D3, "epdc_d3"); - gpio_request(EPDC_D4, "epdc_d4"); - gpio_request(EPDC_D5, "epdc_d5"); - gpio_request(EPDC_D6, "epdc_d6"); - gpio_request(EPDC_D7, "epdc_d7"); - gpio_request(EPDC_GDCLK, "epdc_gdclk"); - gpio_request(EPDC_GDSP, "epdc_gdsp"); - gpio_request(EPDC_GDOE, "epdc_gdoe"); - gpio_request(EPDC_GDRL, "epdc_gdrl"); - gpio_request(EPDC_SDCLK, "epdc_sdclk"); - gpio_request(EPDC_SDOE, "epdc_sdoe"); - gpio_request(EPDC_SDLE, "epdc_sdle"); - gpio_request(EPDC_SDSHR, "epdc_sdshr"); - gpio_request(EPDC_BDR0, "epdc_bdr0"); - gpio_request(EPDC_SDCE0, "epdc_sdce0"); - gpio_request(EPDC_SDCE1, "epdc_sdce1"); - gpio_request(EPDC_SDCE2, "epdc_sdce2"); -} - -static void epdc_put_pins(void) -{ - gpio_free(EPDC_D0); - gpio_free(EPDC_D1); - gpio_free(EPDC_D2); - gpio_free(EPDC_D3); - gpio_free(EPDC_D4); - gpio_free(EPDC_D5); - gpio_free(EPDC_D6); - gpio_free(EPDC_D7); - gpio_free(EPDC_GDCLK); - gpio_free(EPDC_GDSP); - gpio_free(EPDC_GDOE); - gpio_free(EPDC_GDRL); - gpio_free(EPDC_SDCLK); - gpio_free(EPDC_SDOE); - gpio_free(EPDC_SDLE); - gpio_free(EPDC_SDSHR); - gpio_free(EPDC_BDR0); - gpio_free(EPDC_SDCE0); - gpio_free(EPDC_SDCE1); - gpio_free(EPDC_SDCE2); -} - -static void epdc_enable_pins(void) -{ - struct pad_desc epdc_d0 = MX50_PAD_EPDC_D0__EPDC_D0; - struct pad_desc epdc_d1 = MX50_PAD_EPDC_D1__EPDC_D1; - struct pad_desc epdc_d2 = MX50_PAD_EPDC_D2__EPDC_D2; - struct pad_desc epdc_d3 = MX50_PAD_EPDC_D3__EPDC_D3; - struct pad_desc epdc_d4 = MX50_PAD_EPDC_D4__EPDC_D4; - struct pad_desc epdc_d5 = MX50_PAD_EPDC_D5__EPDC_D5; - struct pad_desc epdc_d6 = MX50_PAD_EPDC_D6__EPDC_D6; - struct pad_desc epdc_d7 = MX50_PAD_EPDC_D7__EPDC_D7; - struct pad_desc epdc_gdclk = MX50_PAD_EPDC_GDCLK__EPDC_GDCLK; - struct pad_desc epdc_gdsp = MX50_PAD_EPDC_GDSP__EPDC_GDSP; - struct pad_desc epdc_gdoe = MX50_PAD_EPDC_GDOE__EPDC_GDOE; - struct pad_desc epdc_gdrl = MX50_PAD_EPDC_GDRL__EPDC_GDRL; - struct pad_desc epdc_sdclk = MX50_PAD_EPDC_SDCLK__EPDC_SDCLK; - struct pad_desc epdc_sdoe = MX50_PAD_EPDC_SDOE__EPDC_SDOE; - struct pad_desc epdc_sdle = MX50_PAD_EPDC_SDLE__EPDC_SDLE; - struct pad_desc epdc_sdshr = MX50_PAD_EPDC_SDSHR__EPDC_SDSHR; - struct pad_desc epdc_bdr0 = MX50_PAD_EPDC_BDR0__EPDC_BDR0; - struct pad_desc epdc_sdce0 = MX50_PAD_EPDC_SDCE0__EPDC_SDCE0; - struct pad_desc epdc_sdce1 = MX50_PAD_EPDC_SDCE1__EPDC_SDCE1; - struct pad_desc epdc_sdce2 = MX50_PAD_EPDC_SDCE2__EPDC_SDCE2; - - /* Configure MUX settings to enable EPDC use */ - mxc_iomux_v3_setup_pad(&epdc_d0); - mxc_iomux_v3_setup_pad(&epdc_d1); - mxc_iomux_v3_setup_pad(&epdc_d2); - mxc_iomux_v3_setup_pad(&epdc_d3); - mxc_iomux_v3_setup_pad(&epdc_d4); - mxc_iomux_v3_setup_pad(&epdc_d5); - mxc_iomux_v3_setup_pad(&epdc_d6); - mxc_iomux_v3_setup_pad(&epdc_d7); - mxc_iomux_v3_setup_pad(&epdc_gdclk); - mxc_iomux_v3_setup_pad(&epdc_gdsp); - mxc_iomux_v3_setup_pad(&epdc_gdoe); - mxc_iomux_v3_setup_pad(&epdc_gdrl); - mxc_iomux_v3_setup_pad(&epdc_sdclk); - mxc_iomux_v3_setup_pad(&epdc_sdoe); - mxc_iomux_v3_setup_pad(&epdc_sdle); - mxc_iomux_v3_setup_pad(&epdc_sdshr); - mxc_iomux_v3_setup_pad(&epdc_bdr0); - mxc_iomux_v3_setup_pad(&epdc_sdce0); - mxc_iomux_v3_setup_pad(&epdc_sdce1); - mxc_iomux_v3_setup_pad(&epdc_sdce2); - - gpio_direction_input(EPDC_D0); - gpio_direction_input(EPDC_D1); - gpio_direction_input(EPDC_D2); - gpio_direction_input(EPDC_D3); - gpio_direction_input(EPDC_D4); - gpio_direction_input(EPDC_D5); - gpio_direction_input(EPDC_D6); - gpio_direction_input(EPDC_D7); - gpio_direction_input(EPDC_GDCLK); - gpio_direction_input(EPDC_GDSP); - gpio_direction_input(EPDC_GDOE); - gpio_direction_input(EPDC_GDRL); - gpio_direction_input(EPDC_SDCLK); - gpio_direction_input(EPDC_SDOE); - gpio_direction_input(EPDC_SDLE); - gpio_direction_input(EPDC_SDSHR); - gpio_direction_input(EPDC_BDR0); - gpio_direction_input(EPDC_SDCE0); - gpio_direction_input(EPDC_SDCE1); - gpio_direction_input(EPDC_SDCE2); -} - -static void epdc_disable_pins(void) -{ - struct pad_desc epdc_d0 = MX50_PAD_EPDC_D0__GPIO_3_0; - struct pad_desc epdc_d1 = MX50_PAD_EPDC_D1__GPIO_3_1; - struct pad_desc epdc_d2 = MX50_PAD_EPDC_D2__GPIO_3_2; - struct pad_desc epdc_d3 = MX50_PAD_EPDC_D3__GPIO_3_3; - struct pad_desc epdc_d4 = MX50_PAD_EPDC_D4__GPIO_3_4; - struct pad_desc epdc_d5 = MX50_PAD_EPDC_D5__GPIO_3_5; - struct pad_desc epdc_d6 = MX50_PAD_EPDC_D6__GPIO_3_6; - struct pad_desc epdc_d7 = MX50_PAD_EPDC_D7__GPIO_3_7; - struct pad_desc epdc_gdclk = MX50_PAD_EPDC_GDCLK__GPIO_3_16; - struct pad_desc epdc_gdsp = MX50_PAD_EPDC_GDSP__GPIO_3_17; - struct pad_desc epdc_gdoe = MX50_PAD_EPDC_GDOE__GPIO_3_18; - struct pad_desc epdc_gdrl = MX50_PAD_EPDC_GDRL__GPIO_3_19; - struct pad_desc epdc_sdclk = MX50_PAD_EPDC_SDCLK__GPIO_3_20; - struct pad_desc epdc_sdoe = MX50_PAD_EPDC_SDOE__GPIO_3_23; - struct pad_desc epdc_sdle = MX50_PAD_EPDC_SDLE__GPIO_3_24; - struct pad_desc epdc_sdshr = MX50_PAD_EPDC_SDSHR__GPIO_3_26; - struct pad_desc epdc_bdr0 = MX50_PAD_EPDC_BDR0__GPIO_4_23; - struct pad_desc epdc_sdce0 = MX50_PAD_EPDC_SDCE0__GPIO_4_25; - struct pad_desc epdc_sdce1 = MX50_PAD_EPDC_SDCE1__GPIO_4_26; - struct pad_desc epdc_sdce2 = MX50_PAD_EPDC_SDCE2__GPIO_4_27; - - /* Configure MUX settings for EPDC pins to - * GPIO and drive to 0. */ - mxc_iomux_v3_setup_pad(&epdc_d0); - mxc_iomux_v3_setup_pad(&epdc_d1); - mxc_iomux_v3_setup_pad(&epdc_d2); - mxc_iomux_v3_setup_pad(&epdc_d3); - mxc_iomux_v3_setup_pad(&epdc_d4); - mxc_iomux_v3_setup_pad(&epdc_d5); - mxc_iomux_v3_setup_pad(&epdc_d6); - mxc_iomux_v3_setup_pad(&epdc_d7); - mxc_iomux_v3_setup_pad(&epdc_gdclk); - mxc_iomux_v3_setup_pad(&epdc_gdsp); - mxc_iomux_v3_setup_pad(&epdc_gdoe); - mxc_iomux_v3_setup_pad(&epdc_gdrl); - mxc_iomux_v3_setup_pad(&epdc_sdclk); - mxc_iomux_v3_setup_pad(&epdc_sdoe); - mxc_iomux_v3_setup_pad(&epdc_sdle); - mxc_iomux_v3_setup_pad(&epdc_sdshr); - mxc_iomux_v3_setup_pad(&epdc_bdr0); - mxc_iomux_v3_setup_pad(&epdc_sdce0); - mxc_iomux_v3_setup_pad(&epdc_sdce1); - mxc_iomux_v3_setup_pad(&epdc_sdce2); - - gpio_direction_output(EPDC_D0, 0); - gpio_direction_output(EPDC_D1, 0); - gpio_direction_output(EPDC_D2, 0); - gpio_direction_output(EPDC_D3, 0); - gpio_direction_output(EPDC_D4, 0); - gpio_direction_output(EPDC_D5, 0); - gpio_direction_output(EPDC_D6, 0); - gpio_direction_output(EPDC_D7, 0); - gpio_direction_output(EPDC_GDCLK, 0); - gpio_direction_output(EPDC_GDSP, 0); - gpio_direction_output(EPDC_GDOE, 0); - gpio_direction_output(EPDC_GDRL, 0); - gpio_direction_output(EPDC_SDCLK, 0); - gpio_direction_output(EPDC_SDOE, 0); - gpio_direction_output(EPDC_SDLE, 0); - gpio_direction_output(EPDC_SDSHR, 0); - gpio_direction_output(EPDC_BDR0, 0); - gpio_direction_output(EPDC_SDCE0, 0); - gpio_direction_output(EPDC_SDCE1, 0); - gpio_direction_output(EPDC_SDCE2, 0); -} - -static struct fb_videomode e60_mode = { - .name = "E60", - .refresh = 50, - .xres = 800, - .yres = 600, - .pixclock = 20000000, - .left_margin = 10, - .right_margin = 217, - .upper_margin = 4, - .lower_margin = 10, - .hsync_len = 20, - .vsync_len = 4, - .sync = 0, - .vmode = FB_VMODE_NONINTERLACED, - .flag = 0, -}; - -static struct fb_videomode e97_mode = { - .name = "E97", - .refresh = 50, - .xres = 1200, - .yres = 825, - .pixclock = 32000000, - .left_margin = 8, - .right_margin = 125, - .upper_margin = 4, - .lower_margin = 17, - .hsync_len = 20, - .vsync_len = 4, - .sync = 0, - .vmode = FB_VMODE_NONINTERLACED, - .flag = 0, -}; - -static struct mxc_epdc_fb_mode panel_modes[] = { - { - &e60_mode, - 4, 10, 20, 10, 20, 480, 20, 0, 1, 1, - }, - { - &e97_mode, - 8, 10, 20, 10, 20, 580, 20, 0, 1, 3, - }, -}; - -static struct mxc_epdc_fb_platform_data epdc_data = { - .epdc_mode = panel_modes, - .num_modes = ARRAY_SIZE(panel_modes), - .get_pins = epdc_get_pins, - .put_pins = epdc_put_pins, - .enable_pins = epdc_enable_pins, - .disable_pins = epdc_disable_pins, -}; - - -static struct max17135_platform_data max17135_pdata __initdata = { +static struct max17135_platform_data max17135_pdata = { .vneg_pwrup = 1, .gvee_pwrup = 1, .vpos_pwrup = 2, @@ -743,43 +209,13 @@ static struct max17135_platform_data max17135_pdata __initdata = { .vpos_pwrdn = 2, .gvee_pwrdn = 1, .vneg_pwrdn = 1, - .gpio_pmic_pwrgood = EPDC_PWRSTAT, - .gpio_pmic_vcom_ctrl = EPDC_VCOM, - .gpio_pmic_wakeup = EPDC_PMIC_WAKE, - .gpio_pmic_intr = EPDC_PMIC_INT, + .gpio_pmic_pwrgood = IOMUX_TO_GPIO(MX50_PIN_EPDC_PWRSTAT), + .gpio_pmic_vcom_ctrl = IOMUX_TO_GPIO(MX50_PIN_EPDC_VCOM0), + .gpio_pmic_wakeup = IOMUX_TO_GPIO(MX50_PIN_UART4_TXD), + .gpio_pmic_intr = IOMUX_TO_GPIO(MX50_PIN_UART4_RXD), .regulator_init = max17135_init_data, }; -static int __initdata max17135_pass_num = { 1 }; -static int __initdata max17135_vcom = { -1250000 }; -/* - * Parse user specified options (`max17135:') - * example: - * max17135:pass=2,vcom=-1250000 - */ -static int __init max17135_setup(char *options) -{ - char *opt; - while ((opt = strsep(&options, ",")) != NULL) { - if (!*opt) - continue; - if (!strncmp(opt, "pass=", 5)) - max17135_pass_num = - simple_strtoul(opt + 5, NULL, 0); - if (!strncmp(opt, "vcom=", 5)) { - int offs = 5; - if (opt[5] == '-') - offs = 6; - max17135_vcom = - simple_strtoul(opt + offs, NULL, 0); - max17135_vcom = -max17135_vcom; - } - } - return 1; -} - -__setup("max17135:", max17135_setup); - static struct i2c_board_info mxc_i2c1_board_info[] __initdata = { { .type = "sgtl5000-i2c", @@ -836,24 +272,24 @@ static int sdhc_write_protect(struct device *dev) unsigned short rc = 0; if (to_platform_device(dev)->id == 0) - rc = gpio_get_value(SD1_WP); + rc = gpio_get_value(IOMUX_TO_GPIO(MX50_PIN_ECSPI2_SS0)); else if (to_platform_device(dev)->id == 1) - rc = gpio_get_value(SD2_WP); + rc = gpio_get_value(IOMUX_TO_GPIO(MX50_PIN_SD2_WP)); else if (to_platform_device(dev)->id == 2) - rc = gpio_get_value(SD3_WP); + rc = gpio_get_value(IOMUX_TO_GPIO(MX50_PIN_SD3_WP)); return rc; } static unsigned int sdhc_get_card_det_status(struct device *dev) { - int ret = 0; + int ret; if (to_platform_device(dev)->id == 0) - ret = gpio_get_value(SD1_CD); + ret = gpio_get_value(IOMUX_TO_GPIO(MX50_PIN_EIM_CRE)); else if (to_platform_device(dev)->id == 1) - ret = gpio_get_value(SD2_CD); + ret = gpio_get_value(IOMUX_TO_GPIO(MX50_PIN_SD2_CD)); else if (to_platform_device(dev)->id == 2) - ret = gpio_get_value(SD3_CD); + ret = gpio_get_value(IOMUX_TO_GPIO(MX50_PIN_KEY_COL2)); return ret; } @@ -886,16 +322,13 @@ static struct mxc_mmc_platform_data mmc2_data = { static struct mxc_mmc_platform_data mmc3_data = { .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29 | MMC_VDD_29_30 | MMC_VDD_31_32, - .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA | MMC_CAP_DATA_DDR, + .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, .min_clk = 400000, - .max_clk = 40000000, - .dll_override_en = 1, - .dll_delay_cells = 0xc, + .max_clk = 50000000, .card_inserted_state = 0, .status = sdhc_get_card_det_status, .wp_status = sdhc_write_protect, .clock_mmc = "esdhc_clk", - .clk_always_on = 1, }; static int mxc_sgtl5000_amp_enable(int enable) @@ -906,14 +339,14 @@ static int mxc_sgtl5000_amp_enable(int enable) static int headphone_det_status(void) { - return (gpio_get_value(HP_DETECT) != 0); + return (gpio_get_value(IOMUX_TO_GPIO(MX50_PIN_ECSPI1_SS0)) != 0); } static struct mxc_audio_platform_data sgtl5000_data = { .ssi_num = 1, .src_port = 2, .ext_port = 3, - .hp_irq = IOMUX_TO_IRQ_V3(HP_DETECT), + .hp_irq = IOMUX_TO_IRQ(MX50_PIN_ECSPI1_SS0), .hp_status = headphone_det_status, .amp_enable = mxc_sgtl5000_amp_enable, .sysclk = 12288000, @@ -923,21 +356,64 @@ static struct platform_device mxc_sgtl5000_device = { .name = "imx-3stack-sgtl5000", }; -static struct pad_desc armadillo2_wvga_pads[] = { - MX50_PAD_DISP_D0__DISP_D0, - MX50_PAD_DISP_D1__DISP_D1, - MX50_PAD_DISP_D2__DISP_D2, - MX50_PAD_DISP_D3__DISP_D3, - MX50_PAD_DISP_D4__DISP_D4, - MX50_PAD_DISP_D5__DISP_D5, - MX50_PAD_DISP_D6__DISP_D6, - MX50_PAD_DISP_D7__DISP_D7, -}; - static void wvga_reset(void) { - mxc_iomux_v3_setup_multiple_pads(armadillo2_wvga_pads, \ - ARRAY_SIZE(armadillo2_wvga_pads)); + /* ELCDIF D0 */ + mxc_free_iomux(MX50_PIN_DISP_D0, IOMUX_CONFIG_ALT2); + mxc_request_iomux(MX50_PIN_DISP_D0, IOMUX_CONFIG_ALT0); + mxc_iomux_set_pad(MX50_PIN_DISP_D0, PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | + PAD_CTL_DRV_HIGH); + /* ELCDIF D1 */ + mxc_free_iomux(MX50_PIN_DISP_D1, IOMUX_CONFIG_ALT2); + mxc_request_iomux(MX50_PIN_DISP_D1, IOMUX_CONFIG_ALT0); + mxc_iomux_set_pad(MX50_PIN_DISP_D1, PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | + PAD_CTL_DRV_HIGH); + /* ELCDIF D2 */ + mxc_free_iomux(MX50_PIN_DISP_D2, IOMUX_CONFIG_ALT2); + mxc_request_iomux(MX50_PIN_DISP_D2, IOMUX_CONFIG_ALT0); + mxc_iomux_set_pad(MX50_PIN_DISP_D2, PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | + PAD_CTL_DRV_HIGH); + /* ELCDIF D3 */ + mxc_free_iomux(MX50_PIN_DISP_D3, IOMUX_CONFIG_ALT2); + mxc_request_iomux(MX50_PIN_DISP_D3, IOMUX_CONFIG_ALT0); + mxc_iomux_set_pad(MX50_PIN_DISP_D3, PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | + PAD_CTL_DRV_HIGH); + /* ELCDIF D4 */ + mxc_free_iomux(MX50_PIN_DISP_D4, IOMUX_CONFIG_ALT2); + mxc_request_iomux(MX50_PIN_DISP_D4, IOMUX_CONFIG_ALT0); + mxc_iomux_set_pad(MX50_PIN_DISP_D4, PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | + PAD_CTL_DRV_HIGH); + /* ELCDIF D5 */ + mxc_free_iomux(MX50_PIN_DISP_D5, IOMUX_CONFIG_ALT2); + mxc_request_iomux(MX50_PIN_DISP_D5, IOMUX_CONFIG_ALT0); + mxc_iomux_set_pad(MX50_PIN_DISP_D5, PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | + PAD_CTL_DRV_HIGH); + /* ELCDIF D6 */ + mxc_free_iomux(MX50_PIN_DISP_D6, IOMUX_CONFIG_ALT2); + mxc_request_iomux(MX50_PIN_DISP_D6, IOMUX_CONFIG_ALT0); + mxc_iomux_set_pad(MX50_PIN_DISP_D6, PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | + PAD_CTL_DRV_HIGH); + /* ELCDIF D7 */ + mxc_free_iomux(MX50_PIN_DISP_D7, IOMUX_CONFIG_ALT2); + mxc_request_iomux(MX50_PIN_DISP_D7, IOMUX_CONFIG_ALT0); + mxc_iomux_set_pad(MX50_PIN_DISP_D7, PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | + PAD_CTL_DRV_HIGH); return; } @@ -970,107 +446,6 @@ static struct mxc_fb_platform_data fb_data[] = { }, }; -static int __initdata enable_w1 = { 0 }; -static int __init w1_setup(char *__unused) -{ - enable_w1 = 1; - return cpu_is_mx50(); -} - -__setup("w1", w1_setup); - -int enable_gpmi_nand = { 0 }; -static int __init gpmi_nand_setup(char *__unused) -{ - enable_gpmi_nand = 1; - return 1; -} - -__setup("gpmi:nand", gpmi_nand_setup); - -static struct mxs_dma_plat_data dma_apbh_data = { - .chan_base = MXS_DMA_CHANNEL_AHB_APBH, - .chan_num = MXS_MAX_DMA_CHANNELS, -}; - -static int gpmi_nfc_platform_init(unsigned int max_chip_count) -{ - return !enable_gpmi_nand; -} - -static void gpmi_nfc_platform_exit(unsigned int max_chip_count) -{ -} - -static const char *gpmi_nfc_partition_source_types[] = { "cmdlinepart", 0 }; - -static struct gpmi_nfc_platform_data gpmi_nfc_platform_data = { - .nfc_version = 2, - .boot_rom_version = 1, - .clock_name = "gpmi-nfc", - .platform_init = gpmi_nfc_platform_init, - .platform_exit = gpmi_nfc_platform_exit, - .min_prop_delay_in_ns = 5, - .max_prop_delay_in_ns = 9, - .max_chip_count = 2, - .boot_area_size_in_bytes = 20 * SZ_1M, - .partition_source_types = gpmi_nfc_partition_source_types, - .partitions = 0, - .partition_count = 0, -}; - -static struct android_pmem_platform_data android_pmem_pdata = { - .name = "pmem_adsp", - .start = 0, - .size = SZ_4M, - .no_allocator = 0, - .cached = PMEM_NONCACHE_NORMAL, -}; - -static struct android_pmem_platform_data android_pmem_gpu_pdata = { - .name = "pmem_gpu", - .start = 0, - .size = SZ_32M, - .no_allocator = 0, - .cached = PMEM_CACHE_ENABLE, -}; - -static struct android_usb_platform_data android_usb_pdata = { - .vendor_id = 0x0bb4, - .product_id = 0x0c01, - .adb_product_id = 0x0c02, - .version = 0x0100, - .product_name = "Android Phone", - .manufacturer_name = "Freescale", - .nluns = 3, -}; - -/* OTP data */ -/* Building up eight registers's names of a bank */ -#define BANK(a, b, c, d, e, f, g, h) \ - {\ - ("HW_OCOTP_"#a), ("HW_OCOTP_"#b), ("HW_OCOTP_"#c), ("HW_OCOTP_"#d), \ - ("HW_OCOTP_"#e), ("HW_OCOTP_"#f), ("HW_OCOTP_"#g), ("HW_OCOTP_"#h) \ - } - -#define BANKS (5) -#define BANK_ITEMS (8) -static const char *bank_reg_desc[BANKS][BANK_ITEMS] = { - BANK(LOCK, CFG0, CFG1, CFG2, CFG3, CFG4, CFG5, CFG6), - BANK(MEM0, MEM1, MEM2, MEM3, MEM4, MEM5, GP0, GP1), - BANK(SCC0, SCC1, SCC2, SCC3, SCC4, SCC5, SCC6, SCC7), - BANK(SRK0, SRK1, SRK2, SRK3, SRK4, SRK5, SRK6, SRK7), - BANK(SJC0, SJC1, MAC0, MAC1, HWCAP0, HWCAP1, HWCAP2, SWCAP), -}; - -static struct fsl_otp_data otp_data = { - .fuse_name = (char **)bank_reg_desc, - .fuse_num = BANKS * BANK_ITEMS, -}; -#undef BANK -#undef BANKS -#undef BANK_ITEMS - /*! * Board specific fixup function. It is called by \b setup_arch() in * setup.c file very early on during kernel starts. It allows the user to @@ -1085,89 +460,10 @@ static struct fsl_otp_data otp_data = { static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags, char **cmdline, struct meminfo *mi) { - struct tag *t; - int size; - mxc_set_cpu_type(MXC_CPU_MX50); get_cpu_wp = mx50_arm2_get_cpu_wp; set_num_cpu_wp = mx50_arm2_set_num_cpu_wp; - - for_each_tag(t, tags) { - if (t->hdr.tag != ATAG_MEM) - continue; - size = t->u.mem.size; - - android_pmem_pdata.start = - PHYS_OFFSET + size - android_pmem_pdata.size; - android_pmem_gpu_pdata.start = - android_pmem_pdata.start - android_pmem_gpu_pdata.size; -#if 0 - gpu_device.resource[5].start = - android_pmem_gpu_pdata.start - SZ_16M; - gpu_device.resource[5].end = - gpu_device.resource[5].start + SZ_16M - 1; -#endif - size -= android_pmem_pdata.size; - size -= android_pmem_gpu_pdata.size; - //size -= SZ_16M; - t->u.mem.size = size; - } -} - -static void __init mx50_arm2_io_init(void) -{ - mxc_iomux_v3_setup_multiple_pads(mx50_armadillo2, \ - ARRAY_SIZE(mx50_armadillo2)); - - gpio_request(SD1_WP, "sdhc1-wp"); - gpio_direction_input(SD1_WP); - - gpio_request(SD1_CD, "sdhc1-cd"); - gpio_direction_input(SD1_CD); - - gpio_request(SD2_WP, "sdhc2-wp"); - gpio_direction_input(SD2_WP); - - gpio_request(SD2_CD, "sdhc2-cd"); - gpio_direction_input(SD2_CD); - - gpio_request(SD3_WP, "sdhc3-wp"); - gpio_direction_input(SD3_WP); - - gpio_request(SD3_CD, "sdhc3-cd"); - gpio_direction_input(SD3_CD); - - gpio_request(HP_DETECT, "hp-det"); - gpio_direction_input(HP_DETECT); - - gpio_request(PWR_INT, "pwr-int"); - gpio_direction_input(PWR_INT); - - gpio_request(EPDC_PMIC_WAKE, "epdc-pmic-wake"); - gpio_direction_output(EPDC_PMIC_WAKE, 0); - - gpio_request(EPDC_VCOM, "epdc-vcom"); - gpio_direction_output(EPDC_VCOM, 0); - - gpio_request(EPDC_PMIC_INT, "epdc-pmic-int"); - gpio_direction_input(EPDC_PMIC_INT); - - gpio_request(EPDC_PWRSTAT, "epdc-pwrstat"); - gpio_direction_input(EPDC_PWRSTAT); - - /* ELCDIF backlight */ - gpio_request(EPDC_ELCDIF_BACKLIGHT, "elcdif-backlight"); - gpio_direction_output(EPDC_ELCDIF_BACKLIGHT, 1); - - if (enable_w1) { - struct pad_desc one_wire = MX50_PAD_OWIRE__OWIRE; - mxc_iomux_v3_setup_pad(&one_wire); - } - - if (enable_gpmi_nand) - mxc_iomux_v3_setup_multiple_pads(mx50_gpmi_nand, \ - ARRAY_SIZE(mx50_gpmi_nand)); } /*! @@ -1176,19 +472,18 @@ static void __init mx50_arm2_io_init(void) static void __init mxc_board_init(void) { /* SD card detect irqs */ - mxcsdhc1_device.resource[2].start = IOMUX_TO_IRQ_V3(SD1_CD); - mxcsdhc1_device.resource[2].end = IOMUX_TO_IRQ_V3(SD1_CD); - mxcsdhc2_device.resource[2].start = IOMUX_TO_IRQ_V3(SD2_CD); - mxcsdhc2_device.resource[2].end = IOMUX_TO_IRQ_V3(SD2_CD); - mxcsdhc3_device.resource[2].start = IOMUX_TO_IRQ_V3(SD3_CD); - mxcsdhc3_device.resource[2].end = IOMUX_TO_IRQ_V3(SD3_CD); + mxcsdhc1_device.resource[2].start = IOMUX_TO_IRQ(MX50_PIN_EIM_CRE); + mxcsdhc1_device.resource[2].end = IOMUX_TO_IRQ(MX50_PIN_EIM_CRE); + mxcsdhc2_device.resource[2].start = IOMUX_TO_IRQ(MX50_PIN_SD2_CD); + mxcsdhc2_device.resource[2].end = IOMUX_TO_IRQ(MX50_PIN_SD2_CD); + mxcsdhc3_device.resource[2].start = IOMUX_TO_IRQ(MX50_PIN_KEY_COL2); + mxcsdhc3_device.resource[2].end = IOMUX_TO_IRQ(MX50_PIN_KEY_COL2); mxc_cpu_common_init(); mxc_register_gpios(); mx50_arm2_io_init(); mxc_register_device(&mxc_dma_device, NULL); - //mxc_register_device(&mxs_dma_apbh_device, &dma_apbh_data); mxc_register_device(&mxc_wdt_device, NULL); mxc_register_device(&mxcspi1_device, &mxcspi1_data); mxc_register_device(&mxcspi3_device, &mxcspi3_data); @@ -1198,15 +493,13 @@ static void __init mxc_board_init(void) mxc_register_device(&mxc_rtc_device, &srtc_data); mxc_register_device(&mxc_w1_master_device, &mxc_w1_data); - mxc_register_device(&gpu_device, &z160_version); + mxc_register_device(&gpu_device, NULL); mxc_register_device(&mxc_pxp_device, NULL); mxc_register_device(&mxc_pxp_client_device, NULL); - mxc_register_device(&mxc_pxp_v4l2, NULL); - mxc_register_device(&mxc_dvfs_core_device, &dvfs_core_data); - mxc_register_device(&busfreq_device, NULL); - /* mxc_register_device(&mx53_lpmode_device, NULL); + mxc_register_device(&busfreq_device, NULL); + mxc_register_device(&mxc_dvfs_core_device, &dvfs_core_data); mxc_register_device(&mxc_dvfs_per_device, &dvfs_per_data); */ @@ -1222,32 +515,20 @@ static void __init mxc_board_init(void) ARRAY_SIZE(mxc_dataflash_device)); i2c_register_board_info(1, mxc_i2c1_board_info, ARRAY_SIZE(mxc_i2c1_board_info)); - max17135_pdata.pass_num = max17135_pass_num; - max17135_pdata.vcom_uV = max17135_vcom; i2c_register_board_info(2, mxc_i2c2_board_info, ARRAY_SIZE(mxc_i2c2_board_info)); - mxc_register_device(&epdc_device, &epdc_data); + mxc_register_device(&epdc_device, NULL); mxc_register_device(&lcd_wvga_device, &lcd_wvga_data); mxc_register_device(&elcdif_device, &fb_data[0]); - mxc_register_device(&mxs_viim, NULL); - - mxc_register_device(&mxc_android_pmem_device, &android_pmem_pdata); - mxc_register_device(&mxc_android_pmem_gpu_device, &android_pmem_gpu_pdata); - mxc_register_device(&android_usb_device, &android_usb_pdata); mx50_arm2_init_mc13892(); /* pm_power_off = mxc_power_off; */ mxc_register_device(&mxc_sgtl5000_device, &sgtl5000_data); - mxc_register_device(&gpmi_nfc_device, &gpmi_nfc_platform_data); mx5_usb_dr_init(); mx5_usbh1_init(); - - mxc_register_device(&mxc_rngb_device, NULL); - mxc_register_device(&dcp_device, NULL); - mxc_register_device(&fsl_otp_device, &otp_data); } static void __init mx50_arm2_timer_init(void) diff --git a/arch/arm/mach-mx5/mx50_arm2_gpio.c b/arch/arm/mach-mx5/mx50_arm2_gpio.c new file mode 100644 index 000000000000..8b37784ef9b5 --- /dev/null +++ b/arch/arm/mach-mx5/mx50_arm2_gpio.c @@ -0,0 +1,658 @@ +/* + * Copyright (C) 2010 Freescale Semiconductor, 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; either version 2 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will 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 to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include <linux/errno.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/delay.h> +#include <linux/io.h> +#include <mach/hardware.h> +#include <mach/gpio.h> + +#include "iomux.h" +#include "mx50_pins.h" + +/*! + * @file mach-mx5/mx50_arm2_gpio.c + * + * @brief This file contains all the GPIO setup functions for the board. + * + * @ingroup GPIO + */ + +static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = { + { /* SD1 WP */ + MX50_PIN_ECSPI2_SS0, IOMUX_CONFIG_GPIO, + }, + { /* SD1 CD */ + MX50_PIN_EIM_CRE, IOMUX_CONFIG_GPIO, + }, + { /* SD1 CMD */ + MX50_PIN_SD1_CMD, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, + (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + }, + { /* SD1 CLK */ + MX50_PIN_SD1_CLK, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, + (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + }, + { /* SD1 D0 */ + MX50_PIN_SD1_D0, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + }, + { /* SD1 D1 */ + MX50_PIN_SD1_D1, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + }, + { /* SD1 D2 */ + MX50_PIN_SD1_D2, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + }, + { /* SD1 D3 */ + MX50_PIN_SD1_D3, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + }, + { /* SD2 CD */ + MX50_PIN_SD2_CD, IOMUX_CONFIG_GPIO, + (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + }, + { /* SD2 WP */ + MX50_PIN_SD2_WP, IOMUX_CONFIG_GPIO, + }, + { /* SD2 CMD */ + MX50_PIN_SD2_CMD, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, + (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + }, + { /* SD2 CLK */ + MX50_PIN_SD2_CLK, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, + (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + }, + { /* SD2 D0 */ + MX50_PIN_SD2_D0, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + }, + { /* SD2 D1 */ + MX50_PIN_SD2_D1, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + }, + { /* SD2 D2 */ + MX50_PIN_SD2_D2, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + }, + { /* SD2 D3 */ + MX50_PIN_SD2_D3, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + }, + { /* SD2 D4 */ + MX50_PIN_SD2_D4, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + }, + { /* SD2 D5 */ + MX50_PIN_SD2_D5, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + }, + { /* SD2 D6 */ + MX50_PIN_SD2_D6, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + }, + { /* SD2 D7 */ + MX50_PIN_SD2_D7, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + }, + { /* SD3 CD */ + MX50_PIN_KEY_COL2, IOMUX_CONFIG_GPIO, + (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + }, + { /* SD3 WP */ + MX50_PIN_SD3_WP, IOMUX_CONFIG_GPIO, + }, + { /* SD3 CMD */ + MX50_PIN_SD3_CMD, IOMUX_CONFIG_ALT0, + (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | + PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH), + }, + { /* SD3 CLK */ + MX50_PIN_SD3_CLK, IOMUX_CONFIG_ALT0, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_47K_PU | + PAD_CTL_DRV_HIGH), + }, + { /* SD3 D0 */ + MX50_PIN_SD3_D0, IOMUX_CONFIG_ALT0, + (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | + PAD_CTL_47K_PU | PAD_CTL_DRV_HIGH), + }, + { /* SD3 D1 */ + MX50_PIN_SD3_D1, IOMUX_CONFIG_ALT0, + (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | + PAD_CTL_47K_PU | PAD_CTL_DRV_HIGH), + }, + { /* SD3 D2 */ + MX50_PIN_SD3_D2, IOMUX_CONFIG_ALT0, + (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | + PAD_CTL_47K_PU | PAD_CTL_DRV_HIGH), + }, + { /* SD3 D3 */ + MX50_PIN_SD3_D3, IOMUX_CONFIG_ALT0, + (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | + PAD_CTL_47K_PU | PAD_CTL_DRV_HIGH), + }, + { /* SD3 D4 */ + MX50_PIN_SD3_D4, IOMUX_CONFIG_ALT0, + (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | + PAD_CTL_47K_PU | PAD_CTL_DRV_HIGH), + }, + { /* SD3 D5 */ + MX50_PIN_SD3_D5, IOMUX_CONFIG_ALT0, + (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | + PAD_CTL_47K_PU | PAD_CTL_DRV_HIGH), + }, + { /* SD3 D6 */ + MX50_PIN_SD3_D6, IOMUX_CONFIG_ALT0, + (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | + PAD_CTL_47K_PU | PAD_CTL_DRV_HIGH), + }, + { /* SD3 D7 */ + MX50_PIN_SD3_D7, IOMUX_CONFIG_ALT0, + (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | + PAD_CTL_47K_PU | PAD_CTL_DRV_HIGH), + }, + + { + MX50_PIN_SSI_TXD, IOMUX_CONFIG_ALT0, + }, + { + MX50_PIN_SSI_RXD, IOMUX_CONFIG_ALT0, + }, + { + MX50_PIN_SSI_TXC, IOMUX_CONFIG_ALT0, + }, + { + MX50_PIN_SSI_TXFS, IOMUX_CONFIG_ALT0, + }, + /* LINE1_DETECT (headphone detect) */ + { + MX50_PIN_ECSPI1_SS0, IOMUX_CONFIG_GPIO, PAD_CTL_100K_PU, + }, + { + MX50_PIN_ECSPI2_MISO, IOMUX_CONFIG_GPIO, PAD_CTL_100K_PU, + }, + /* UART pad setting */ + { + MX50_PIN_UART1_TXD, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER | + PAD_CTL_PKE_ENABLE | PAD_CTL_ODE_OPENDRAIN_NONE), + }, + { + MX50_PIN_UART1_RXD, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER | + PAD_CTL_PKE_ENABLE | PAD_CTL_ODE_OPENDRAIN_NONE), + MUX_IN_UART1_IPP_UART_RXD_MUX_SELECT_INPUT, + INPUT_CTL_PATH1, + }, + { + MX50_PIN_UART1_CTS, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER | + PAD_CTL_PKE_ENABLE | PAD_CTL_ODE_OPENDRAIN_NONE), + }, + { + MX50_PIN_UART1_RTS, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER | + PAD_CTL_PKE_ENABLE | PAD_CTL_ODE_OPENDRAIN_NONE), + MUX_IN_UART1_IPP_UART_RTS_B_SELECT_INPUT, + INPUT_CTL_PATH1, + }, + { + MX50_PIN_UART2_TXD, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER | + PAD_CTL_PKE_ENABLE | PAD_CTL_ODE_OPENDRAIN_NONE), + }, + { + MX50_PIN_UART2_RXD, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER | + PAD_CTL_PKE_ENABLE | PAD_CTL_ODE_OPENDRAIN_NONE), + MUX_IN_UART2_IPP_UART_RXD_MUX_SELECT_INPUT, + INPUT_CTL_PATH1, + }, + { + MX50_PIN_UART2_CTS, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER | + PAD_CTL_PKE_ENABLE | PAD_CTL_ODE_OPENDRAIN_NONE), + }, + { + MX50_PIN_UART2_RTS, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER | + PAD_CTL_PKE_ENABLE | PAD_CTL_ODE_OPENDRAIN_NONE), + MUX_IN_UART2_IPP_UART_RTS_B_SELECT_INPUT, + INPUT_CTL_PATH1, + }, + { /* I2C1 SDA */ + MX50_PIN_I2C1_SDA, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, + (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE | + PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU | + PAD_CTL_HYS_ENABLE), + }, + { /* I2C1 SCL */ + MX50_PIN_I2C1_SCL, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, + (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE | + PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU | + PAD_CTL_HYS_ENABLE), + }, + { /* I2C2 SDA */ + MX50_PIN_I2C2_SDA, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, + (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE | + PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU | + PAD_CTL_HYS_ENABLE), + }, + { /* I2C2 SCL */ + MX50_PIN_I2C2_SCL, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, + (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE | + PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU | + PAD_CTL_HYS_ENABLE), + }, + { /* I2C3 SDA */ + MX50_PIN_I2C3_SDA, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, + (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE | + PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU | + PAD_CTL_HYS_ENABLE), + }, + { /* I2C3 SCL */ + MX50_PIN_I2C3_SCL, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, + (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE | + PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU | + PAD_CTL_HYS_ENABLE), + }, + /* EPDC pins */ + { /* EPDC D0 */ + MX50_PIN_EPDC_D0, IOMUX_CONFIG_ALT0, + }, + { /* EPDC D1 */ + MX50_PIN_EPDC_D1, IOMUX_CONFIG_ALT0, + }, + { /* EPDC D2 */ + MX50_PIN_EPDC_D2, IOMUX_CONFIG_ALT0, + }, + { /* EPDC D3 */ + MX50_PIN_EPDC_D3, IOMUX_CONFIG_ALT0, + }, + { /* EPDC D4 */ + MX50_PIN_EPDC_D4, IOMUX_CONFIG_ALT0, + }, + { /* EPDC D5 */ + MX50_PIN_EPDC_D5, IOMUX_CONFIG_ALT0, + }, + { /* EPDC D6 */ + MX50_PIN_EPDC_D6, IOMUX_CONFIG_ALT0, + }, + { /* EPDC D7 */ + MX50_PIN_EPDC_D7, IOMUX_CONFIG_ALT0, + }, + { /* EPDC GDCLK */ + MX50_PIN_EPDC_GDCLK, IOMUX_CONFIG_ALT0, + }, + { /* EPDC GDSP */ + MX50_PIN_EPDC_GDSP, IOMUX_CONFIG_ALT0, + }, + { /* EPDC GDOE */ + MX50_PIN_EPDC_GDOE, IOMUX_CONFIG_ALT0, + }, + { /* EPDC GDRL */ + MX50_PIN_EPDC_GDRL, IOMUX_CONFIG_ALT0, + }, + { /* EPDC SDCLK */ + MX50_PIN_EPDC_SDCLK, IOMUX_CONFIG_ALT0, + }, + { /* EPDC SDOE */ + MX50_PIN_EPDC_SDOE, IOMUX_CONFIG_ALT0, + }, + { /* EPDC SDLE */ + MX50_PIN_EPDC_SDLE, IOMUX_CONFIG_ALT0, + }, + { /* EPDC SDSHR */ + MX50_PIN_EPDC_SDSHR, IOMUX_CONFIG_ALT0, + }, + { /* EPDC BDR0 */ + MX50_PIN_EPDC_BDR0, IOMUX_CONFIG_ALT0, + }, + { /* EPDC SDCE0 */ + MX50_PIN_EPDC_SDCE0, IOMUX_CONFIG_ALT0, + }, + { /* EPDC SDCE1 */ + MX50_PIN_EPDC_SDCE1, IOMUX_CONFIG_ALT0, + }, + { /* EPDC SDCE2 */ + MX50_PIN_EPDC_SDCE2, IOMUX_CONFIG_ALT0, + }, + /* EPD PMIC pins */ + { /* EPDC PWRSTAT - GPIO3[28] for PWR_GOOD status */ + MX50_PIN_EPDC_PWRSTAT, IOMUX_CONFIG_ALT1, + }, + { /* EPDC VCOM0 - GPIO4[21] for VCOM control */ + MX50_PIN_EPDC_VCOM0, IOMUX_CONFIG_ALT1, + }, + { /* ELCDIF D8 */ + MX50_PIN_DISP_D8, IOMUX_CONFIG_ALT0, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH), + }, + { /* ELCDIF D9 */ + MX50_PIN_DISP_D9, IOMUX_CONFIG_ALT0, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH), + }, + { /* ELCDIF D10 */ + MX50_PIN_DISP_D10, IOMUX_CONFIG_ALT0, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH), + }, + { /* ELCDIF D11 */ + MX50_PIN_DISP_D11, IOMUX_CONFIG_ALT0, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH), + }, + { /* ELCDIF D12 */ + MX50_PIN_DISP_D12, IOMUX_CONFIG_ALT0, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH), + }, + { /* ELCDIF D13 */ + MX50_PIN_DISP_D13, IOMUX_CONFIG_ALT0, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH), + }, + { /* ELCDIF D14 */ + MX50_PIN_DISP_D14, IOMUX_CONFIG_ALT0, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH), + }, + { /* ELCDIF D15 */ + MX50_PIN_DISP_D15, IOMUX_CONFIG_ALT0, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH), + }, + { /* ELCDIF VSYNC */ + MX50_PIN_DISP_RS, IOMUX_CONFIG_ALT2, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH), + }, + { /* ELCDIF contrast */ + MX50_PIN_DISP_BUSY, IOMUX_CONFIG_ALT1, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH), + }, + { /* ELCDIF HSYNC */ + MX50_PIN_DISP_CS, IOMUX_CONFIG_ALT2, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH), + }, + { /* ELCDIF DRDY */ + MX50_PIN_DISP_RD, IOMUX_CONFIG_ALT2, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH), + }, + { /* ELCDIF PIXCLK */ + MX50_PIN_DISP_WR, IOMUX_CONFIG_ALT2, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER | + PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH), + }, + { /* UART4 TXD - GPIO6[16] for EPD PMIC WAKEUP */ + MX50_PIN_UART4_TXD, IOMUX_CONFIG_ALT1, + }, + { /* UART4 RXD - GPIO6[17] for EPD PMIC intr */ + MX50_PIN_UART4_RXD, IOMUX_CONFIG_ALT1, + }, + /* USB_H1_PWR */ + { + MX50_PIN_EPITO, IOMUX_CONFIG_ALT2, + PAD_CTL_PKE_ENABLE | PAD_CTL_DRV_HIGH, + }, + /* FIXME: USB_H1_OC, need to comment below line if + * one needs to debug owire. + */ + { + MX50_PIN_OWIRE, IOMUX_CONFIG_ALT2, + PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH | PAD_CTL_47K_PU, + }, + /* USB_OTG_PWR */ + { + MX50_PIN_PWM2, IOMUX_CONFIG_ALT2, + PAD_CTL_PKE_ENABLE | PAD_CTL_DRV_HIGH, + }, + /* + * Set USB_OTG_OC, the pad value is the default value + * according to IC suggestion. + */ + { + MX50_PIN_PWM1, IOMUX_CONFIG_ALT2, + PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH | PAD_CTL_47K_PU, + MUX_IN_USBOH1_IPP_IND_OTG_OC_SELECT_INPUT, INPUT_CTL_PATH1, + }, + { /* FEC_MDIO */ + MX50_PIN_SSI_RXC, IOMUX_CONFIG_ALT6, + (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | + PAD_CTL_22K_PU | PAD_CTL_ODE_OPENDRAIN_ENABLE | PAD_CTL_DRV_HIGH), + MUX_IN_FEC_FEC_MDI_SELECT_INPUT, + INPUT_CTL_PATH1, + }, + { /* FEC_TX_CLK */ + MX50_PIN_DISP_D0, IOMUX_CONFIG_ALT2, + (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE), + }, + { /* FEC_RX_ER */ + MX50_PIN_DISP_D1, IOMUX_CONFIG_ALT2, + (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE), + MUX_IN_FEC_FEC_RX_ER_SELECT_INPUT, + INPUT_CTL_PATH0, + }, + { /* FEC_CRS_DV */ + MX50_PIN_DISP_D2, IOMUX_CONFIG_ALT2, + (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE), + MUX_IN_FEC_FEC_RX_DV_SELECT_INPUT, + INPUT_CTL_PATH0, + }, + { /* FEC_RXD1 */ + MX50_PIN_DISP_D3, IOMUX_CONFIG_ALT2, + (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE), + MUX_IN_FEC_FEC_RDATA_1_SELECT_INPUT, + INPUT_CTL_PATH0, + }, + { /* FEC_RXD0 */ + MX50_PIN_DISP_D4, IOMUX_CONFIG_ALT2, + (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE), + MUX_IN_FEC_FEC_RDATA_0_SELECT_INPUT, + INPUT_CTL_PATH0, + }, + { /* FEC_TX_EN */ + MX50_PIN_DISP_D5, IOMUX_CONFIG_ALT2, + PAD_CTL_DRV_HIGH, + }, + { /* FEC_TXD1 */ + MX50_PIN_DISP_D6, IOMUX_CONFIG_ALT2, + PAD_CTL_DRV_HIGH, + }, + { /* FEC_TXD0 */ + MX50_PIN_DISP_D7, IOMUX_CONFIG_ALT2, + PAD_CTL_DRV_HIGH, + }, + { /* FEC_MDC */ + MX50_PIN_SSI_RXFS, IOMUX_CONFIG_ALT6, + PAD_CTL_DRV_HIGH, + }, + { /* CSPI SS0 */ + MX50_PIN_CSPI_SS0, IOMUX_CONFIG_ALT0, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH), + }, + { /* CSPI SS1 */ + MX50_PIN_ECSPI1_MOSI, IOMUX_CONFIG_ALT2, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | + PAD_CTL_22K_PU | PAD_CTL_DRV_HIGH), + }, + { + MX50_PIN_CSPI_MOSI, IOMUX_CONFIG_ALT0, + }, + { + MX50_PIN_CSPI_MISO, IOMUX_CONFIG_ALT0, + }, + { + MX50_PIN_CSPI_SCLK, IOMUX_CONFIG_ALT0, + }, +}; + +static int __initdata enable_w1 = { 0 }; +static int __init w1_setup(char *__unused) +{ + enable_w1 = 1; + return cpu_is_mx50(); +} + +__setup("w1", w1_setup); + +void __init mx50_arm2_io_init(void) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(mxc_iomux_pins); i++) { + mxc_request_iomux(mxc_iomux_pins[i].pin, + mxc_iomux_pins[i].mux_mode); + if (mxc_iomux_pins[i].pad_cfg) + mxc_iomux_set_pad(mxc_iomux_pins[i].pin, + mxc_iomux_pins[i].pad_cfg); + if (mxc_iomux_pins[i].in_select) + mxc_iomux_set_input(mxc_iomux_pins[i].in_select, + mxc_iomux_pins[i].in_mode); + } + + /* SD1 WP */ + gpio_request(IOMUX_TO_GPIO(MX50_PIN_ECSPI2_SS0), "ecspi2_ss0"); + gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_ECSPI2_SS0)); + + /* SD1 CD */ + gpio_request(IOMUX_TO_GPIO(MX50_PIN_EIM_CRE), "eim_cre"); + gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_EIM_CRE)); + + /* SD2 WP */ + gpio_request(IOMUX_TO_GPIO(MX50_PIN_SD2_WP), "sd2_wp"); + gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_SD2_WP)); + + /* SD2 CD */ + gpio_request(IOMUX_TO_GPIO(MX50_PIN_SD2_CD), "sd2_cd"); + gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_SD2_CD)); + + /* SD3 WP */ + gpio_request(IOMUX_TO_GPIO(MX50_PIN_SD3_WP), "sd3_wp"); + gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_SD2_WP)); + + /* SD3 CD */ + gpio_request(IOMUX_TO_GPIO(MX50_PIN_KEY_COL2), "key_col2"); + gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_KEY_COL2)); + + /* LINE1_DETECT (headphone detect) */ + gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_ECSPI1_SS0)); + + gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_ECSPI2_MISO)); + + /* EPDC PMIC */ + gpio_request(IOMUX_TO_GPIO(MX50_PIN_UART4_TXD), "uart4_txd"); + gpio_direction_output(IOMUX_TO_GPIO(MX50_PIN_UART4_TXD), 0); + + gpio_request(IOMUX_TO_GPIO(MX50_PIN_EPDC_VCOM0), "epdc_vcom"); + gpio_direction_output(IOMUX_TO_GPIO(MX50_PIN_EPDC_VCOM0), 0); + + gpio_request(IOMUX_TO_GPIO(MX50_PIN_UART4_RXD), "uart4_rxd"); + gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_UART4_RXD)); + + gpio_request(IOMUX_TO_GPIO(MX50_PIN_EPDC_PWRSTAT), "epdc_pwrstat"); + gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_EPDC_PWRSTAT)); + + /* ELCDIF backlight */ + gpio_request(IOMUX_TO_GPIO(MX50_PIN_DISP_BUSY), "gp2_18"); + gpio_direction_output(IOMUX_TO_GPIO(MX50_PIN_DISP_BUSY), 1); + + if (enable_w1) { + /* OneWire */ + mxc_request_iomux(MX50_PIN_OWIRE, IOMUX_CONFIG_ALT0); + mxc_iomux_set_pad(MX50_PIN_OWIRE, PAD_CTL_HYS_ENABLE | + PAD_CTL_PKE_ENABLE | + PAD_CTL_ODE_OPENDRAIN_ENABLE | + PAD_CTL_DRV_HIGH | + PAD_CTL_SRE_FAST | + PAD_CTL_100K_PU | + PAD_CTL_PUE_PULL); + } +} + +/* workaround for cspi chipselect pin may not keep correct level when idle */ +void mx50_arm2_gpio_spi_chipselect_active(int cspi_mode, int status, + int chipselect) +{ + switch (cspi_mode) { + case 1: + break; + case 2: + break; + case 3: + switch (chipselect) { + case 0x1: + /* enable ss0 */ + mxc_request_iomux(MX50_PIN_CSPI_SS0, IOMUX_CONFIG_ALT0); + /*disable other ss */ + mxc_request_iomux(MX50_PIN_ECSPI1_MOSI, IOMUX_CONFIG_GPIO); + /* pull up/down deassert it */ + gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_ECSPI1_MOSI)); + break; + case 0x2: + /* enable ss1 */ + mxc_request_iomux(MX50_PIN_ECSPI1_MOSI, IOMUX_CONFIG_ALT2); + /*disable other ss */ + mxc_request_iomux(MX50_PIN_CSPI_SS0, IOMUX_CONFIG_GPIO); + /* pull up/down deassert it */ + gpio_direction_input(IOMUX_TO_GPIO(MX50_PIN_CSPI_SS0)); + break; + default: + break; + } + break; + + default: + break; + } +} + +void mx50_arm2_gpio_spi_chipselect_inactive(int cspi_mode, int status, + int chipselect) +{ + switch (cspi_mode) { + case 1: + break; + case 2: + break; + case 3: + switch (chipselect) { + case 0x1: + mxc_free_iomux(MX50_PIN_ECSPI1_MOSI, IOMUX_CONFIG_GPIO); + break; + case 0x2: + mxc_free_iomux(MX50_PIN_CSPI_SS0, IOMUX_CONFIG_GPIO); + break; + default: + break; + } + break; + default: + break; + } + +} diff --git a/arch/arm/mach-mx5/mx50_arm2_pmic_mc13892.c b/arch/arm/mach-mx5/mx50_arm2_pmic_mc13892.c index 05b8462ade40..d852fb0e016b 100644 --- a/arch/arm/mach-mx5/mx50_arm2_pmic_mc13892.c +++ b/arch/arm/mach-mx5/mx50_arm2_pmic_mc13892.c @@ -27,8 +27,8 @@ #include <linux/regulator/machine.h> #include <linux/mfd/mc13892/core.h> #include <mach/irqs.h> - -#include <mach/iomux-mx50.h> +#include "iomux.h" +#include "mx50_pins.h" /* * Convenience conversion. @@ -74,7 +74,11 @@ #define AUDIO_STBY_MASK (1 << 16) #define SD_STBY_MASK (1 << 19) -#define REG_MODE_0_ALL_MASK (DIG_STBY_MASK | GEN1_STBY_MASK) +/* 0x92412 */ +#define REG_MODE_0_ALL_MASK (GEN1_STBY_MASK |\ + DIG_STBY_MASK | GEN2_STBY_MASK |\ + PLL_STBY_MASK) +/* 0x92082 */ #define REG_MODE_1_ALL_MASK (CAM_STBY_MASK | VIDEO_STBY_MASK |\ AUDIO_STBY_MASK | SD_STBY_MASK) @@ -149,17 +153,11 @@ static struct regulator_init_data sw2_init = { static struct regulator_init_data sw3_init = { .constraints = { .name = "SW3", - .min_uV = mV_to_uV(900), + .min_uV = mV_to_uV(1100), .max_uV = mV_to_uV(1850), .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE, .always_on = 1, .boot_on = 1, - .initial_state = PM_SUSPEND_MEM, - .state_mem = { - .uV = 950000, - .mode = REGULATOR_MODE_NORMAL, - .enabled = 1, - }, } }; @@ -330,6 +328,8 @@ static int mc13892_regulator_init(struct mc13892 *mc13892) { unsigned int value, register_mask; printk("Initializing regulators for mx50 arm2.\n"); + sw2_init.constraints.state_mem.uV = 1200000; + sw1_init.constraints.state_mem.uV = 1000000; /* enable standby controll for all regulators */ pmic_read_reg(REG_MODE_0, &value, 0xffffff); @@ -360,6 +360,7 @@ static int mc13892_regulator_init(struct mc13892 *mc13892) (SWMODE_AUTO << SW4MODE_LSB); pmic_write_reg(REG_SW_5, value, 0xffffff); } + /* Enable coin cell charger */ value = BITFVAL(COINCHEN, 1) | BITFVAL(VCOIN, VCOIN_3_0V); register_mask = BITFMASK(COINCHEN) | BITFMASK(VCOIN); @@ -404,7 +405,7 @@ static struct mc13892_platform_data mc13892_plat = { static struct spi_board_info __initdata mc13892_spi_device = { .modalias = "pmic_spi", - .irq = IOMUX_TO_IRQ_V3(114), + .irq = IOMUX_TO_IRQ(MX50_PIN_ECSPI2_MISO), .max_speed_hz = 6000000, /* max spi SCK clock speed in HZ */ .bus_num = 3, .chip_select = 0, diff --git a/arch/arm/mach-mx5/mx50_pins.h b/arch/arm/mach-mx5/mx50_pins.h new file mode 100644 index 000000000000..75d654442429 --- /dev/null +++ b/arch/arm/mach-mx5/mx50_pins.h @@ -0,0 +1,340 @@ +/* + * Copyright (C) 2010 Freescale Semiconductor, 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; either version 2 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will 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 to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef __ASM_ARCH_MXC_MX50_PINS_H__ +#define __ASM_ARCH_MXC_MX50_PINS_H__ +#include "iomux.h" + +/*! + * @file mach-mx5/mx50_pins.h + * + * @brief MX50 I/O Pin List + * + * @ingroup GPIO_MX50 + */ + +#ifndef __ASSEMBLY__ + +#define PAD_I_START_MX50 0x2CC + +#define _MXC_BUILD_PIN_MX50(gp, gi, ga, mi, pi) \ + (((gp) << MUX_IO_P) | ((gi) << MUX_IO_I) | \ + ((mi) << MUX_I) | \ + ((pi - PAD_I_START_MX50) << PAD_I) | \ + ((ga) << GPIO_I)) + +#define _MXC_BUILD_GPIO_PIN_MX50(gp, gi, ga, mi, pi) \ + _MXC_BUILD_PIN_MX50(gp, gi, ga, mi, pi) + +#define _MXC_BUILD_NON_GPIO_PIN_MX50(mi, pi) \ + _MXC_BUILD_PIN_MX50(NON_GPIO_PORT, 0, 0, mi, pi) +/*! + * This enumeration is constructed based on the Section + * "sw_pad_ctl & sw_mux_ctl details" of the MX50 IC Spec. Each enumerated + * value is constructed based on the rules described above. + */ +enum iomux_pins { + MX50_PIN_KEY_COL0 = _MXC_BUILD_GPIO_PIN_MX50(3, 0, 1, 0x20, 0x2CC), + MX50_PIN_KEY_ROW0 = _MXC_BUILD_GPIO_PIN_MX50(3, 1, 1, 0x24, 0x2D0), + MX50_PIN_KEY_COL1 = _MXC_BUILD_GPIO_PIN_MX50(3, 2, 1, 0x28, 0x2D4), + MX50_PIN_KEY_ROW1 = _MXC_BUILD_GPIO_PIN_MX50(3, 3, 1, 0x2C, 0x2D8), + MX50_PIN_KEY_COL2 = _MXC_BUILD_GPIO_PIN_MX50(3, 4, 1, 0x30, 0x2DC), + MX50_PIN_KEY_ROW2 = _MXC_BUILD_GPIO_PIN_MX50(3, 5, 1, 0x34, 0x2E0), + MX50_PIN_KEY_COL3 = _MXC_BUILD_GPIO_PIN_MX50(3, 6, 1, 0x38, 0x2E4), + MX50_PIN_KEY_ROW3 = _MXC_BUILD_GPIO_PIN_MX50(3, 7, 1, 0x3C, 0x2E8), + MX50_PIN_I2C1_SCL = _MXC_BUILD_GPIO_PIN_MX50(5, 18, 1, 0x40, 0x2EC), + MX50_PIN_I2C1_SDA = _MXC_BUILD_GPIO_PIN_MX50(5, 19, 1, 0x44, 0x2F0), + MX50_PIN_I2C2_SCL = _MXC_BUILD_GPIO_PIN_MX50(5, 20, 1, 0x48, 0x2F4), + MX50_PIN_I2C2_SDA = _MXC_BUILD_GPIO_PIN_MX50(5, 21, 1, 0x4C, 0x2F8), + MX50_PIN_I2C3_SCL = _MXC_BUILD_GPIO_PIN_MX50(5, 22, 1, 0x50, 0x2FC), + MX50_PIN_I2C3_SDA = _MXC_BUILD_GPIO_PIN_MX50(5, 23, 1, 0x54, 0x300), + MX50_PIN_PWM1 = _MXC_BUILD_GPIO_PIN_MX50(5, 24, 1, 0x58, 0x304), + MX50_PIN_PWM2 = _MXC_BUILD_GPIO_PIN_MX50(5, 25, 1, 0x5C, 0x308), + MX50_PIN_OWIRE = _MXC_BUILD_GPIO_PIN_MX50(5, 26, 1, 0x60, 0x30C), + MX50_PIN_EPITO = _MXC_BUILD_GPIO_PIN_MX50(5, 27, 1, 0x64, 0x310), + MX50_PIN_WDOG = _MXC_BUILD_GPIO_PIN_MX50(5, 28, 1, 0x68, 0x314), + MX50_PIN_SSI_TXFS = _MXC_BUILD_GPIO_PIN_MX50(5, 0, 1, 0x6C, 0x318), + MX50_PIN_SSI_TXC = _MXC_BUILD_GPIO_PIN_MX50(5, 1, 1, 0x70, 0x31C), + MX50_PIN_SSI_TXD = _MXC_BUILD_GPIO_PIN_MX50(5, 2, 1, 0x74, 0x320), + MX50_PIN_SSI_RXD = _MXC_BUILD_GPIO_PIN_MX50(5, 3, 1, 0x78, 0x324), + MX50_PIN_SSI_RXFS = _MXC_BUILD_GPIO_PIN_MX50(5, 4, 1, 0x7C, 0x328), + MX50_PIN_SSI_RXC = _MXC_BUILD_GPIO_PIN_MX50(5, 5, 1, 0x80, 0x32C), + MX50_PIN_UART1_TXD = _MXC_BUILD_GPIO_PIN_MX50(5, 6, 1, 0x84, 0x330), + MX50_PIN_UART1_RXD = _MXC_BUILD_GPIO_PIN_MX50(5, 7, 1, 0x88, 0x334), + MX50_PIN_UART1_CTS = _MXC_BUILD_GPIO_PIN_MX50(5, 8, 1, 0x8C, 0x338), + MX50_PIN_UART1_RTS = _MXC_BUILD_GPIO_PIN_MX50(5, 9, 1, 0x90, 0x33C), + MX50_PIN_UART2_TXD = _MXC_BUILD_GPIO_PIN_MX50(5, 10, 1, 0x94, 0x340), + MX50_PIN_UART2_RXD = _MXC_BUILD_GPIO_PIN_MX50(5, 11, 1, 0x98, 0x344), + MX50_PIN_UART2_CTS = _MXC_BUILD_GPIO_PIN_MX50(5, 12, 1, 0x9C, 0x348), + MX50_PIN_UART2_RTS = _MXC_BUILD_GPIO_PIN_MX50(5, 13, 1, 0xA0, 0x34C), + MX50_PIN_UART3_TXD = _MXC_BUILD_GPIO_PIN_MX50(5, 14, 1, 0xA4, 0x350), + MX50_PIN_UART3_RXD = _MXC_BUILD_GPIO_PIN_MX50(5, 15, 1, 0xA8, 0x354), + MX50_PIN_UART4_TXD = _MXC_BUILD_GPIO_PIN_MX50(5, 16, 1, 0xAC, 0x358), + MX50_PIN_UART4_RXD = _MXC_BUILD_GPIO_PIN_MX50(5, 17, 1, 0xB0, 0x35C), + MX50_PIN_CSPI_SCLK = _MXC_BUILD_GPIO_PIN_MX50(3, 8, 1, 0xB4, 0x360), + MX50_PIN_CSPI_MOSI = _MXC_BUILD_GPIO_PIN_MX50(3, 9, 1, 0xB8, 0x364), + MX50_PIN_CSPI_MISO = _MXC_BUILD_GPIO_PIN_MX50(3, 10, 1, 0xBC, 0x368), + MX50_PIN_CSPI_SS0 = _MXC_BUILD_GPIO_PIN_MX50(3, 11, 1, 0xC0, 0x36C), + MX50_PIN_ECSPI1_SCLK = _MXC_BUILD_GPIO_PIN_MX50(3, 12, 1, 0xC4, 0x370), + MX50_PIN_ECSPI1_MOSI = _MXC_BUILD_GPIO_PIN_MX50(3, 13, 1, 0xC8, 0x374), + MX50_PIN_ECSPI1_MISO = _MXC_BUILD_GPIO_PIN_MX50(3, 14, 1, 0xCC, 0x378), + MX50_PIN_ECSPI1_SS0 = _MXC_BUILD_GPIO_PIN_MX50(3, 15, 1, 0xD0, 0x37C), + MX50_PIN_ECSPI2_SCLK = _MXC_BUILD_GPIO_PIN_MX50(3, 16, 1, 0xD4, 0x380), + MX50_PIN_ECSPI2_MOSI = _MXC_BUILD_GPIO_PIN_MX50(3, 17, 1, 0xD8, 0x384), + MX50_PIN_ECSPI2_MISO = _MXC_BUILD_GPIO_PIN_MX50(3, 18, 1, 0xDC, 0x388), + MX50_PIN_ECSPI2_SS0 = _MXC_BUILD_GPIO_PIN_MX50(3, 19, 1, 0xE0, 0x38C), + MX50_PIN_SD1_CLK = _MXC_BUILD_GPIO_PIN_MX50(4, 0, 1, 0xE4, 0x390), + MX50_PIN_SD1_CMD = _MXC_BUILD_GPIO_PIN_MX50(4, 1, 1, 0xE8, 0x394), + MX50_PIN_SD1_D0 = _MXC_BUILD_GPIO_PIN_MX50(4, 2, 1, 0xEC, 0x398), + MX50_PIN_SD1_D1 = _MXC_BUILD_GPIO_PIN_MX50(4, 3, 1, 0xF0, 0x39C), + MX50_PIN_SD1_D2 = _MXC_BUILD_GPIO_PIN_MX50(4, 4, 1, 0xF4, 0x3A0), + MX50_PIN_SD1_D3 = _MXC_BUILD_GPIO_PIN_MX50(4, 5, 1, 0xF8, 0x3A4), + MX50_PIN_SD2_CLK = _MXC_BUILD_GPIO_PIN_MX50(4, 6, 1, 0xFC, 0x3A8), + MX50_PIN_SD2_CMD = _MXC_BUILD_GPIO_PIN_MX50(4, 7, 1, 0x100, 0x3AC), + MX50_PIN_SD2_D0 = _MXC_BUILD_GPIO_PIN_MX50(4, 8, 1, 0x104, 0x3B0), + MX50_PIN_SD2_D1 = _MXC_BUILD_GPIO_PIN_MX50(4, 9, 1, 0x108, 0x3B4), + MX50_PIN_SD2_D2 = _MXC_BUILD_GPIO_PIN_MX50(4, 10, 1, 0x10C, 0x3B8), + MX50_PIN_SD2_D3 = _MXC_BUILD_GPIO_PIN_MX50(4, 11, 1, 0x110, 0x3BC), + MX50_PIN_SD2_D4 = _MXC_BUILD_GPIO_PIN_MX50(4, 12, 1, 0x114, 0x3C0), + MX50_PIN_SD2_D5 = _MXC_BUILD_GPIO_PIN_MX50(4, 13, 1, 0x118, 0x3C4), + MX50_PIN_SD2_D6 = _MXC_BUILD_GPIO_PIN_MX50(4, 14, 1, 0x11C, 0x3C8), + MX50_PIN_SD2_D7 = _MXC_BUILD_GPIO_PIN_MX50(4, 15, 1, 0x120, 0x3CC), + MX50_PIN_SD2_WP = _MXC_BUILD_GPIO_PIN_MX50(4, 16, 1, 0x124, 0x3D0), + MX50_PIN_SD2_CD = _MXC_BUILD_GPIO_PIN_MX50(4, 17, 1, 0x128, 0x3D4), + + MX50_PIN_PMIC_ON_REQ = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3D8), + MX50_PIN_PMIC_STBY_REQ = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3DC), + MX50_PIN_PMIC_PORT_B = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3E0), + MX50_PIN_PMIC_BOOT_MODE1 = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3E4), + MX50_PIN_PMIC_RESET_IN_B = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3E8), + MX50_PIN_PMIC_BOOT_MODE0 = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3EC), + MX50_PIN_PMIC_TEST_MODE = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3F0), + MX50_PIN_PMIC_JTAG_TMS = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3F4), + MX50_PIN_PMIC_JTAG_MOD = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3F8), + MX50_PIN_PMIC_JTAG_TRSTB = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x3FC), + MX50_PIN_PMIC_JTAG_TDI = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x400), + MX50_PIN_PMIC_JTAG_TCK = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x404), + MX50_PIN_PMIC_JTAG_TDO = _MXC_BUILD_NON_GPIO_PIN_MX50(NON_MUX_I, 0x408), + + MX50_PIN_DISP_D0 = _MXC_BUILD_GPIO_PIN_MX50(1, 0, 1, 0x12C, 0x40C), + MX50_PIN_DISP_D1 = _MXC_BUILD_GPIO_PIN_MX50(1, 1, 1, 0x130, 0x410), + MX50_PIN_DISP_D2 = _MXC_BUILD_GPIO_PIN_MX50(1, 2, 1, 0x134, 0x414), + MX50_PIN_DISP_D3 = _MXC_BUILD_GPIO_PIN_MX50(1, 3, 1, 0x138, 0x418), + MX50_PIN_DISP_D4 = _MXC_BUILD_GPIO_PIN_MX50(1, 4, 1, 0x13C, 0x41C), + MX50_PIN_DISP_D5 = _MXC_BUILD_GPIO_PIN_MX50(1, 5, 1, 0x140, 0x420), + MX50_PIN_DISP_D6 = _MXC_BUILD_GPIO_PIN_MX50(1, 6, 1, 0x144, 0x424), + MX50_PIN_DISP_D7 = _MXC_BUILD_GPIO_PIN_MX50(1, 7, 1, 0x148, 0x428), + MX50_PIN_DISP_WR = _MXC_BUILD_GPIO_PIN_MX50(1, 16, 1, 0x14C, 0x42C), + MX50_PIN_DISP_RD = _MXC_BUILD_GPIO_PIN_MX50(1, 19, 1, 0x150, 0x430), + MX50_PIN_DISP_RS = _MXC_BUILD_GPIO_PIN_MX50(1, 17, 1, 0x154, 0x434), + MX50_PIN_DISP_CS = _MXC_BUILD_GPIO_PIN_MX50(1, 21, 1, 0x158, 0x438), + MX50_PIN_DISP_BUSY = _MXC_BUILD_GPIO_PIN_MX50(1, 18, 1, 0x15C, 0x43C), + MX50_PIN_DISP_RESET = _MXC_BUILD_GPIO_PIN_MX50(1, 20, 1, 0x160, 0x440), + MX50_PIN_SD3_CMD = _MXC_BUILD_GPIO_PIN_MX50(4, 18, 1, 0x164, 0x444), + MX50_PIN_SD3_CLK = _MXC_BUILD_GPIO_PIN_MX50(4, 19, 1, 0x168, 0x448), + MX50_PIN_SD3_D0 = _MXC_BUILD_GPIO_PIN_MX50(4, 20, 1, 0x16C, 0x44C), + MX50_PIN_SD3_D1 = _MXC_BUILD_GPIO_PIN_MX50(4, 21, 1, 0x170, 0x450), + MX50_PIN_SD3_D2 = _MXC_BUILD_GPIO_PIN_MX50(4, 22, 1, 0x174, 0x454), + MX50_PIN_SD3_D3 = _MXC_BUILD_GPIO_PIN_MX50(4, 23, 1, 0x178, 0x458), + MX50_PIN_SD3_D4 = _MXC_BUILD_GPIO_PIN_MX50(4, 24, 1, 0x17C, 0x45C), + MX50_PIN_SD3_D5 = _MXC_BUILD_GPIO_PIN_MX50(4, 25, 1, 0x180, 0x460), + MX50_PIN_SD3_D6 = _MXC_BUILD_GPIO_PIN_MX50(4, 26, 1, 0x184, 0x464), + MX50_PIN_SD3_D7 = _MXC_BUILD_GPIO_PIN_MX50(4, 27, 1, 0x188, 0x468), + MX50_PIN_SD3_WP = _MXC_BUILD_GPIO_PIN_MX50(4, 28, 1, 0x18C, 0x46C), + MX50_PIN_DISP_D8 = _MXC_BUILD_GPIO_PIN_MX50(1, 8, 1, 0x190, 0x470), + MX50_PIN_DISP_D9 = _MXC_BUILD_GPIO_PIN_MX50(1, 9, 1, 0x194, 0x474), + MX50_PIN_DISP_D10 = _MXC_BUILD_GPIO_PIN_MX50(1, 10, 1, 0x198, 0x478), + MX50_PIN_DISP_D11 = _MXC_BUILD_GPIO_PIN_MX50(1, 11, 1, 0x19C, 0x47C), + MX50_PIN_DISP_D12 = _MXC_BUILD_GPIO_PIN_MX50(1, 12, 1, 0x1A0, 0x480), + MX50_PIN_DISP_D13 = _MXC_BUILD_GPIO_PIN_MX50(1, 13, 1, 0x1A4, 0x484), + MX50_PIN_DISP_D14 = _MXC_BUILD_GPIO_PIN_MX50(1, 14, 1, 0x1A8, 0x488), + MX50_PIN_DISP_D15 = _MXC_BUILD_GPIO_PIN_MX50(1, 15, 1, 0x1AC, 0x48C), + + MX50_PIN_EPDC_D0 = _MXC_BUILD_GPIO_PIN_MX50(2, 0, 1, 0x1B0, 0x54C), + MX50_PIN_EPDC_D1 = _MXC_BUILD_GPIO_PIN_MX50(2, 1, 1, 0x1B4, 0x550), + MX50_PIN_EPDC_D2 = _MXC_BUILD_GPIO_PIN_MX50(2, 2, 1, 0x1B8, 0x554), + MX50_PIN_EPDC_D3 = _MXC_BUILD_GPIO_PIN_MX50(2, 3, 1, 0x1BC, 0x558), + MX50_PIN_EPDC_D4 = _MXC_BUILD_GPIO_PIN_MX50(2, 4, 1, 0x1C0, 0x55C), + MX50_PIN_EPDC_D5 = _MXC_BUILD_GPIO_PIN_MX50(2, 5, 1, 0x1C4, 0x560), + MX50_PIN_EPDC_D6 = _MXC_BUILD_GPIO_PIN_MX50(2, 6, 1, 0x1C8, 0x564), + MX50_PIN_EPDC_D7 = _MXC_BUILD_GPIO_PIN_MX50(2, 7, 1, 0x1CC, 0x568), + MX50_PIN_EPDC_D8 = _MXC_BUILD_GPIO_PIN_MX50(2, 8, 1, 0x1D0, 0x56C), + MX50_PIN_EPDC_D9 = _MXC_BUILD_GPIO_PIN_MX50(2, 9, 1, 0x1D4, 0x570), + MX50_PIN_EPDC_D10 = _MXC_BUILD_GPIO_PIN_MX50(2, 10, 1, 0x1D8, 0x574), + MX50_PIN_EPDC_D11 = _MXC_BUILD_GPIO_PIN_MX50(2, 11, 1, 0x1DC, 0x578), + MX50_PIN_EPDC_D12 = _MXC_BUILD_GPIO_PIN_MX50(2, 12, 1, 0x1E0, 0x57C), + MX50_PIN_EPDC_D13 = _MXC_BUILD_GPIO_PIN_MX50(2, 13, 1, 0x1E4, 0x580), + MX50_PIN_EPDC_D14 = _MXC_BUILD_GPIO_PIN_MX50(2, 14, 1, 0x1E8, 0x584), + MX50_PIN_EPDC_D15 = _MXC_BUILD_GPIO_PIN_MX50(2, 15, 1, 0x1EC, 0x588), + MX50_PIN_EPDC_GDCLK = _MXC_BUILD_GPIO_PIN_MX50(2, 16, 1, 0x1F0, 0x58C), + MX50_PIN_EPDC_GDSP = _MXC_BUILD_GPIO_PIN_MX50(2, 17, 1, 0x1F4, 0x590), + MX50_PIN_EPDC_GDOE = _MXC_BUILD_GPIO_PIN_MX50(2, 18, 1, 0x1F8, 0x594), + MX50_PIN_EPDC_GDRL = _MXC_BUILD_GPIO_PIN_MX50(2, 19, 1, 0x1FC, 0x598), + MX50_PIN_EPDC_SDCLK = _MXC_BUILD_GPIO_PIN_MX50(2, 20, 1, 0x200, 0x59C), + MX50_PIN_EPDC_SDOEZ = _MXC_BUILD_GPIO_PIN_MX50(2, 21, 1, 0x204, 0x5A0), + MX50_PIN_EPDC_SDOED = _MXC_BUILD_GPIO_PIN_MX50(2, 22, 1, 0x208, 0x5A4), + MX50_PIN_EPDC_SDOE = _MXC_BUILD_GPIO_PIN_MX50(2, 23, 1, 0x20C, 0x5A8), + MX50_PIN_EPDC_SDLE = _MXC_BUILD_GPIO_PIN_MX50(2, 24, 1, 0x210, 0x5AC), + MX50_PIN_EPDC_SDCLKN = _MXC_BUILD_GPIO_PIN_MX50(2, 25, 1, 0x214, 0x5B0), + MX50_PIN_EPDC_SDSHR = _MXC_BUILD_GPIO_PIN_MX50(2, 26, 1, 0x218, 0x5B4), + MX50_PIN_EPDC_PWRCOM = _MXC_BUILD_GPIO_PIN_MX50(2, 27, 1, 0x21C, 0x5B8), + MX50_PIN_EPDC_PWRSTAT = _MXC_BUILD_GPIO_PIN_MX50(2, 28, 1, 0x220, 0x5BC), + MX50_PIN_EPDC_PWRCTRL0 = _MXC_BUILD_GPIO_PIN_MX50(2, 29, 1, 0x224, 0x5C0), + MX50_PIN_EPDC_PWRCTRL1 = _MXC_BUILD_GPIO_PIN_MX50(2, 30, 1, 0x228, 0x5C4), + MX50_PIN_EPDC_PWRCTRL2 = _MXC_BUILD_GPIO_PIN_MX50(2, 31, 1, 0x22C, 0x5C8), + MX50_PIN_EPDC_PWRCTRL3 = _MXC_BUILD_GPIO_PIN_MX50(3, 20, 1, 0x230, 0x5CC), + MX50_PIN_EPDC_VCOM0 = _MXC_BUILD_GPIO_PIN_MX50(3, 21, 1, 0x234, 0x5D0), + MX50_PIN_EPDC_VCOM1 = _MXC_BUILD_GPIO_PIN_MX50(3, 22, 1, 0x238, 0x5D4), + MX50_PIN_EPDC_BDR0 = _MXC_BUILD_GPIO_PIN_MX50(3, 23, 1, 0x23C, 0x5D8), + MX50_PIN_EPDC_BDR1 = _MXC_BUILD_GPIO_PIN_MX50(3, 24, 1, 0x240, 0x5DC), + MX50_PIN_EPDC_SDCE0 = _MXC_BUILD_GPIO_PIN_MX50(3, 25, 1, 0x244, 0x5E0), + MX50_PIN_EPDC_SDCE1 = _MXC_BUILD_GPIO_PIN_MX50(3, 26, 1, 0x248, 0x5E4), + MX50_PIN_EPDC_SDCE2 = _MXC_BUILD_GPIO_PIN_MX50(3, 27, 1, 0x24C, 0x5E8), + MX50_PIN_EPDC_SDCE3 = _MXC_BUILD_GPIO_PIN_MX50(3, 28, 1, 0x250, 0x5EC), + MX50_PIN_EPDC_SDCE4 = _MXC_BUILD_GPIO_PIN_MX50(3, 29, 1, 0x254, 0x5F0), + MX50_PIN_EPDC_SDCE5 = _MXC_BUILD_GPIO_PIN_MX50(3, 30, 1, 0x258, 0x5F4), + MX50_PIN_EIM_DA0 = _MXC_BUILD_GPIO_PIN_MX50(0, 0, 1, 0x25C, 0x5F8), + MX50_PIN_EIM_DA1 = _MXC_BUILD_GPIO_PIN_MX50(0, 1, 1, 0x260, 0x5FC), + MX50_PIN_EIM_DA2 = _MXC_BUILD_GPIO_PIN_MX50(0, 2, 1, 0x264, 0x600), + MX50_PIN_EIM_DA3 = _MXC_BUILD_GPIO_PIN_MX50(0, 3, 1, 0x268, 0x604), + MX50_PIN_EIM_DA4 = _MXC_BUILD_GPIO_PIN_MX50(0, 4, 1, 0x26C, 0x608), + MX50_PIN_EIM_DA5 = _MXC_BUILD_GPIO_PIN_MX50(0, 5, 1, 0x270, 0x60C), + MX50_PIN_EIM_DA6 = _MXC_BUILD_GPIO_PIN_MX50(0, 6, 1, 0x274, 0x610), + MX50_PIN_EIM_DA7 = _MXC_BUILD_GPIO_PIN_MX50(0, 7, 1, 0x278, 0x614), + MX50_PIN_EIM_DA8 = _MXC_BUILD_GPIO_PIN_MX50(0, 8, 1, 0x27C, 0x618), + MX50_PIN_EIM_DA9 = _MXC_BUILD_GPIO_PIN_MX50(0, 9, 1, 0x280, 0x61C), + MX50_PIN_EIM_DA10 = _MXC_BUILD_GPIO_PIN_MX50(0, 10, 1, 0x284, 0x620), + MX50_PIN_EIM_DA11 = _MXC_BUILD_GPIO_PIN_MX50(0, 11, 1, 0x288, 0x624), + MX50_PIN_EIM_DA12 = _MXC_BUILD_GPIO_PIN_MX50(0, 12, 1, 0x28C, 0x628), + MX50_PIN_EIM_DA13 = _MXC_BUILD_GPIO_PIN_MX50(0, 13, 1, 0x290, 0x62C), + MX50_PIN_EIM_DA14 = _MXC_BUILD_GPIO_PIN_MX50(0, 14, 1, 0x294, 0x630), + MX50_PIN_EIM_DA15 = _MXC_BUILD_GPIO_PIN_MX50(0, 15, 1, 0x298, 0x634), + MX50_PIN_EIM_CS2 = _MXC_BUILD_GPIO_PIN_MX50(0, 16, 1, 0x29C, 0x638), + MX50_PIN_EIM_CS1 = _MXC_BUILD_GPIO_PIN_MX50(0, 17, 1, 0x2A0, 0x63C), + MX50_PIN_EIM_CS0 = _MXC_BUILD_GPIO_PIN_MX50(0, 18, 1, 0x2A4, 0x640), + MX50_PIN_EIM_EB0 = _MXC_BUILD_GPIO_PIN_MX50(0, 19, 1, 0x2A8, 0x644), + MX50_PIN_EIM_EB1 = _MXC_BUILD_GPIO_PIN_MX50(0, 20, 1, 0x2AC, 0x648), + MX50_PIN_EIM_WAIT = _MXC_BUILD_GPIO_PIN_MX50(0, 21, 1, 0x2B0, 0x64C), + MX50_PIN_EIM_BCLK = _MXC_BUILD_GPIO_PIN_MX50(0, 22, 1, 0x2B4, 0x650), + MX50_PIN_EIM_RDY = _MXC_BUILD_GPIO_PIN_MX50(0, 23, 1, 0x2B8, 0x654), + MX50_PIN_EIM_OE = _MXC_BUILD_GPIO_PIN_MX50(0, 24, 1, 0x2BC, 0x658), + MX50_PIN_EIM_RW = _MXC_BUILD_GPIO_PIN_MX50(0, 25, 1, 0x2C0, 0x65C), + MX50_PIN_EIM_LBA = _MXC_BUILD_GPIO_PIN_MX50(0, 26, 1, 0x2C4, 0x660), + MX50_PIN_EIM_CRE = _MXC_BUILD_GPIO_PIN_MX50(0, 27, 1, 0x2C8, 0x664), + +}; + +/*! + * various IOMUX input select register index + */ +enum iomux_input_select_mx50 { + MUX_IN_AUDMUX_P4_INPUT_DA_AMX_SELECT_I = 0, + MUX_IN_AUDMUX_P4_INPUT_DB_AMX_SELECT_I, + MUX_IN_AUDMUX_P4_INPUT_RXCLK_AMX_SELECT_INPUT, + MUX_IN_AUDMUX_P4_INPUT_RXFS_AMX_SELECT_INPUT, + MUX_IN_AUDMUX_P4_INPUT_TXCLK_AMX_SELECT_INPUT, + MUX_IN_AUDMUX_P4_INPUT_TXFS_AMX_SELECT_INPUT, + MUX_IN_CCM_PLL1_BYPASS_CLK_SELECT_INPUT, + MUX_IN_CCM_PLL2_BYPASS_CLK_SELECT_INPUT, + MUX_IN_CCM_PLL3_BYPASS_CLK_SELECT_INPUT, + MUX_IN_CSPI_IPP_IND_DATAREADY_B_SELECT_INPUT, + MUX_IN_CSPI_IPP_IND_SS1_B_SELECT_INPUT, + MUX_IN_CSPI_IPP_IND_SS2_B_SELECT_INPUT, + MUX_IN_CSPI_IPP_IND_SS3_B_SELECT_INPUT, + MUX_IN_ELCDIF_LCDIF_BUSY_SELECT_INPUT, + MUX_IN_ELCDIF_LCDIF_RXDATA_0_SELECT_INPUT, + MUX_IN_ELCDIF_LCDIF_RXDATA_1_SELECT_INPUT, + MUX_IN_ELCDIF_LCDIF_RXDATA_2_SELECT_INPUT, + MUX_IN_ELCDIF_LCDIF_RXDATA_3_SELECT_INPUT, + MUX_IN_ELCDIF_LCDIF_RXDATA_4_SELECT_INPUT, + MUX_IN_ELCDIF_LCDIF_RXDATA_5_SELECT_INPUT, + MUX_IN_ELCDIF_LCDIF_RXDATA_6_SELECT_INPUT, + MUX_IN_ELCDIF_LCDIF_RXDATA_7_SELECT_INPUT, + MUX_IN_ELCDIF_LCDIF_RXDATA_8_SELECT_INPUT, + MUX_IN_ELCDIF_LCDIF_RXDATA_9_SELECT_INPUT, + MUX_IN_ELCDIF_LCDIF_RXDATA_10_SELECT_INPUT, + MUX_IN_ELCDIF_LCDIF_RXDATA_11_SELECT_INPUT, + MUX_IN_ELCDIF_LCDIF_RXDATA_12_SELECT_INPUT, + MUX_IN_ELCDIF_LCDIF_RXDATA_13_SELECT_INPUT, + MUX_IN_ELCDIF_LCDIF_RXDATA_14_SELECT_INPUT, + MUX_IN_ELCDIF_LCDIF_RXDATA_15_SELECT_INPUT, + MUX_IN_ELCDIF_VSYNC_I_SELECT_INPUT, + MUX_IN_ESDHC2_IPP_CARD_DET_SELECT_INPUT, + MUX_IN_ESDHC2_IPP_WP_ON_SELECT_INPUT, + MUX_IN_ESDHC4_IPP_CARD_CLK_IN_SELECT_INPUT, + MUX_IN_ESDHC4_IPP_CMD_IN_SELECT_INPUT, + MUX_IN_ESDHC4_IPP_DAT0_IN_SELECT_INPUT, + MUX_IN_ESDHC4_IPP_DAT1_IN_SELECT_INPUT, + MUX_IN_ESDHC4_IPP_DAT2_IN_SELECT_INPUT, + MUX_IN_ESDHC4_IPP_DAT3_IN_SELECT_INPUT, + MUX_IN_ESDHC4_IPP_DAT4_IN_SELECT_INPUT, + MUX_IN_ESDHC4_IPP_DAT5_IN_SELECT_INPUT, + MUX_IN_ESDHC4_IPP_DAT6_IN_SELECT_INPUT, + MUX_IN_ESDHC4_IPP_DAT7_IN_SELECT_INPUT, + MUX_IN_FEC_FEC_COL_SELECT_INPUT, + MUX_IN_FEC_FEC_MDI_SELECT_INPUT, + MUX_IN_FEC_FEC_RDATA_0_SELECT_INPUT, + MUX_IN_FEC_FEC_RDATA_1_SELECT_INPUT, + MUX_IN_FEC_FEC_RX_CLK_SELECT_INPUT, + MUX_IN_FEC_FEC_RX_DV_SELECT_INPUT, + MUX_IN_FEC_FEC_RX_ER_SELECT_INPUT, + MUX_IN_FEC_FEC_TX_CLK_SELECT_INPUT, + MUX_IN_KPP_IPP_IND_COL_4_SELECT_INPUT, + MUX_IN_KPP_IPP_IND_COL_5_SELECT_INPUT, + MUX_IN_KPP_IPP_IND_COL_6_SELECT_INPUT, + MUX_IN_KPP_IPP_IND_COL_7_SELECT_INPUT, + MUX_IN_KPP_IPP_IND_ROW_4_SELECT_INPUT, + MUX_IN_KPP_IPP_IND_ROW_5_SELECT_INPUT, + MUX_IN_KPP_IPP_IND_ROW_6_SELECT_INPUT, + MUX_IN_KPP_IPP_IND_ROW_7_SELECT_INPUT, + MUX_IN_RAWNAND_U_GPMI_INPUT_GPMI_DQS_IN_SELECT_INPUT, + MUX_IN_RAWNAND_U_GPMI_INPUT_GPMI_RDY0_IN_SELECT_INPUT, + MUX_IN_SDMA_EVENTS_14_SELECT_INPUT, + MUX_IN_SDMA_EVENTS_15_SELECT_INPUT, + MUX_IN_UART1_IPP_UART_RTS_B_SELECT_INPUT, + MUX_IN_UART1_IPP_UART_RXD_MUX_SELECT_INPUT, + MUX_IN_UART2_IPP_UART_RTS_B_SELECT_INPUT, + MUX_IN_UART2_IPP_UART_RXD_MUX_SELECT_INPUT, + MUX_IN_UART3_IPP_UART_RTS_B_SELECT_INPUT, + MUX_IN_UART3_IPP_UART_RXD_MUX_SELECT_INPUT, + MUX_IN_UART4_IPP_UART_RTS_B_SELECT_INPUT, + MUX_IN_UART4_IPP_UART_RXD_MUX_SELECT_INPUT, + MUX_IN_UART5_IPP_UART_RTS_B_SELECT_INPUT, + MUX_IN_UART5_IPP_UART_RXD_MUX_SELECT_INPUT, + MUX_IN_USBOH1_IPP_IND_OTG_OC_SELECT_INPUT, + MUX_IN_WEIMV2_IPP_IND_READ_DATA_0_SELECT_INPUT, + MUX_IN_WEIMV2_IPP_IND_READ_DATA_1_SELECT_INPUT, + MUX_IN_WEIMV2_IPP_IND_READ_DATA_2_SELECT_INPUT, + MUX_IN_WEIMV2_IPP_IND_READ_DATA_3_SELECT_INPUT, + MUX_IN_WEIMV2_IPP_IND_READ_DATA_4_SELECT_INPUT, + MUX_IN_WEIMV2_IPP_IND_READ_DATA_5_SELECT_INPUT, + MUX_IN_WEIMV2_IPP_IND_READ_DATA_6_SELECT_INPUT, + MUX_IN_WEIMV2_IPP_IND_READ_DATA_7_SELECT_INPUT, + MUX_IN_WEIMV2_IPP_IND_READ_DATA_8_SELECT_INPUT, + MUX_IN_WEIMV2_IPP_IND_READ_DATA_9_SELECT_INPUT, + MUX_IN_WEIMV2_IPP_IND_READ_DATA_10_SELECT_INPUT, + MUX_IN_WEIMV2_IPP_IND_READ_DATA_11_SELECT_INPUT, + MUX_IN_WEIMV2_IPP_IND_READ_DATA_12_SELECT_INPUT, + MUX_IN_WEIMV2_IPP_IND_READ_DATA_13_SELECT_INPUT, + MUX_IN_WEIMV2_IPP_IND_READ_DATA_14_SELECT_INPUT, + MUX_IN_WEIMV2_IPP_IND_READ_DATA_15_SELECT_INPUT, + + MUX_INPUT_NUM_MUX, +}; + +#endif /* __ASSEMBLY__ */ +#endif /* __ASM_ARCH_MXC_MX50_PINS_H__ */ diff --git a/arch/arm/mach-mx5/mx51_3stack.c b/arch/arm/mach-mx5/mx51_3stack.c index cc5a205d594d..4fade5a37ac2 100644 --- a/arch/arm/mach-mx5/mx51_3stack.c +++ b/arch/arm/mach-mx5/mx51_3stack.c @@ -184,77 +184,15 @@ static struct mxc_vpu_platform_data mxc_vpu_data = { .reset = mx5_vpu_reset, }; -/* workaround for ecspi chipselect pin may not keep correct level when idle */ -static void mx51_3ds_gpio_spi_chipselect_active(int cspi_mode, int status, - int chipselect) -{ - u32 gpio; - - switch (cspi_mode) { - case 1: - switch (chipselect) { - case 0x1: - mxc_request_iomux(MX51_PIN_CSPI1_SS0, - IOMUX_CONFIG_ALT0); - mxc_iomux_set_pad(MX51_PIN_CSPI1_SS0, - PAD_CTL_HYS_ENABLE | - PAD_CTL_PKE_ENABLE | - PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST); - break; - case 0x2: - gpio = IOMUX_TO_GPIO(MX51_PIN_CSPI1_SS0); - mxc_request_iomux(MX51_PIN_CSPI1_SS0, - IOMUX_CONFIG_GPIO); - gpio_request(gpio, "cspi1_ss0"); - gpio_direction_output(gpio, 0); - gpio_set_value(gpio, 1 & (~status)); - break; - default: - break; - } - break; - case 2: - break; - case 3: - break; - default: - break; - } -} - -static void mx51_3ds_gpio_spi_chipselect_inactive(int cspi_mode, int status, - int chipselect) -{ - switch (cspi_mode) { - case 1: - switch (chipselect) { - case 0x1: - mxc_free_iomux(MX51_PIN_CSPI1_SS0, IOMUX_CONFIG_ALT0); - mxc_request_iomux(MX51_PIN_CSPI1_SS0, - IOMUX_CONFIG_GPIO); - mxc_free_iomux(MX51_PIN_CSPI1_SS0, IOMUX_CONFIG_GPIO); - break; - case 0x2: - mxc_free_iomux(MX51_PIN_CSPI1_SS0, IOMUX_CONFIG_GPIO); - break; - default: - break; - } - break; - case 2: - break; - case 3: - break; - default: - break; - } -} - +extern void mx51_babbage_gpio_spi_chipselect_active(int cspi_mode, int status, + int chipselect); +extern void mx51_babbage_gpio_spi_chipselect_inactive(int cspi_mode, int status, + int chipselect); static struct mxc_spi_master mxcspi1_data = { .maxchipselect = 4, .spi_version = 23, - .chipselect_active = mx51_3ds_gpio_spi_chipselect_active, - .chipselect_inactive = mx51_3ds_gpio_spi_chipselect_inactive, + .chipselect_active = mx51_babbage_gpio_spi_chipselect_active, + .chipselect_inactive = mx51_babbage_gpio_spi_chipselect_inactive, }; static struct mxc_i2c_platform_data mxci2c_data = { @@ -278,11 +216,11 @@ static struct mxc_dvfs_platform_data dvfs_core_data = { .reg_id = "SW1", .clk1_id = "cpu_clk", .clk2_id = "gpc_dvfs_clk", - .gpc_cntr_offset = MXC_GPC_CNTR_OFFSET, - .gpc_vcr_offset = MXC_GPC_VCR_OFFSET, - .ccm_cdcr_offset = MXC_CCM_CDCR_OFFSET, - .ccm_cacrr_offset = MXC_CCM_CACRR_OFFSET, - .ccm_cdhipr_offset = MXC_CCM_CDHIPR_OFFSET, + .gpc_cntr_reg_addr = MXC_GPC_CNTR, + .gpc_vcr_reg_addr = MXC_GPC_VCR, + .ccm_cdcr_reg_addr = MXC_CCM_CDCR, + .ccm_cacrr_reg_addr = MXC_CCM_CACRR, + .ccm_cdhipr_reg_addr = MXC_CCM_CDHIPR, .prediv_mask = 0x1F800, .prediv_offset = 11, .prediv_val = 3, @@ -950,8 +888,6 @@ static void __init mxc_board_init(void) mxc_ipu_data.di_clk[0] = clk_get(NULL, "ipu_di0_clk"); mxc_ipu_data.di_clk[1] = clk_get(NULL, "ipu_di1_clk"); - mxc_ipu_data.csi_clk[0] = clk_get(NULL, "csi_mclk1"); - mxc_ipu_data.csi_clk[1] = clk_get(NULL, "csi_mclk2"); mxc_spdif_data.spdif_core_clk = clk_get(NULL, "spdif_xtal_clk"); clk_put(mxc_spdif_data.spdif_core_clk); @@ -1020,8 +956,6 @@ static void __init mxc_board_init(void) mxc_register_device(&mxc_sgtl5000_device, &sgtl5000_data); mxc_register_device(&mxc_bt_device, &mxc_bt_data); mxc_register_device(&mxc_gps_device, &gps_data); - mxc_register_device(&mxc_v4l2_device, NULL); - mxc_register_device(&mxc_v4l2out_device, NULL); mx5_usb_dr_init(); mx5_usbh1_init(); diff --git a/arch/arm/mach-mx5/mx51_babbage.c b/arch/arm/mach-mx5/mx51_babbage.c index 1acc44937e65..6658a99e1d2e 100644 --- a/arch/arm/mach-mx5/mx51_babbage.c +++ b/arch/arm/mach-mx5/mx51_babbage.c @@ -31,7 +31,6 @@ #include <linux/ipu.h> #include <linux/mxcfb.h> #include <linux/pwm_backlight.h> -#include <linux/fec.h> #include <mach/common.h> #include <mach/hardware.h> #include <asm/setup.h> @@ -44,16 +43,12 @@ #include <mach/mmc.h> #include <mach/mxc_dvfs.h> #include <mach/mxc_edid.h> -#include <mach/iomux-mx51.h> -#include <mach/gpio.h> #include "devices.h" +#include "iomux.h" +#include "mx51_pins.h" #include "crm_regs.h" #include "usb.h" -#include <mach/mxc_edid.h> -#include <linux/android_pmem.h> -#include <linux/usb/android.h> -#include <linux/switch.h> /*! * @file mach-mx51/mx51_babbage.c @@ -62,181 +57,12 @@ * * @ingroup MSL_MX51 */ - -#define BABBAGE_SD1_CD (0*32 + 0) /* GPIO_1_0 */ -#define BABBAGE_SD1_WP (0*32 + 1) /* GPIO_1_1 */ -#define BABBAGE_SD2_CD_2_0 (0*32 + 4) /* GPIO_1_4 */ -#define BABBAGE_SD2_WP (0*32 + 5) /* GPIO_1_5 */ -#define BABBAGE_SD2_CD_2_5 (0*32 + 6) /* GPIO_1_6 */ -#define BABBAGE_USBH1_HUB_RST (0*32 + 7) /* GPIO_1_7 */ -#define BABBAGE_PMIC_INT (0*32 + 8) /* GPIO_1_8 */ - -#define BABBAGE_USB_CLK_EN_B (1*32 + 1) /* GPIO_2_1 */ -#define BABBAGE_OSC_EN_B (1*32 + 2) /* GPIO_2_2 */ -#define BABBAGE_PHY_RESET (1*32 + 5) /* GPIO_2_5 */ -#define BABBAGE_CAM_RESET (1*32 + 7) /* GPIO_2_7 */ -#define BABBAGE_FM_PWR (1*32 + 12) /* GPIO_2_12 */ -#define BABBAGE_VGA_RESET (1*32 + 13) /* GPIO_2_13 */ -#define BABBAGE_FEC_PHY_RESET (1*32 + 14) /* GPIO_2_14 */ -#define BABBAGE_FM_RESET (1*32 + 15) /* GPIO_2_15 */ -#define BABBAGE_AUDAMP_STBY (1*32 + 17) /* GPIO_2_17 */ -#define BABBAGE_POWER_KEY (1*32 + 21) /* GPIO_2_21 */ - -#define BABBAGE_26M_OSC_EN (2*32 + 1) /* GPIO_3_1 */ -#define BABBAGE_LVDS_POWER_DOWN (2*32 + 3) /* GPIO_3_3 */ -#define BABBAGE_DISP_BRIGHTNESS_CTL (2*32 + 4) /* GPIO_3_4 */ -#define BABBAGE_DVI_RESET (2*32 + 5) /* GPIO_3_5 */ -#define BABBAGE_DVI_POWER (2*32 + 6) /* GPIO_3_6 */ -#define BABBAGE_HEADPHONE_DET (2*32 + 26) /* GPIO_3_26 */ -#define BABBAGE_DVI_DET (2*32 + 28) /* GPIO_3_28 */ - -#define BABBAGE_LCD_3V3_ON (3*32 + 9) /* GPIO_4_9 */ -#define BABBAGE_LCD_5V_ON (3*32 + 10) /* GPIO_4_10 */ -#define BABBAGE_CAM_LOW_POWER (3*32 + 10) /* GPIO_4_12 */ -#define BABBAGE_DVI_I2C_EN (3*32 + 14) /* GPIO_4_14 */ -#define BABBAGE_CSP1_SS0_GPIO (3*32 + 24) /* GPIO_4_24 */ -#define BABBAGE_AUDIO_CLK_EN (3*32 + 26) /* GPIO_4_26 */ - extern int __init mx51_babbage_init_mc13892(void); +extern void __init mx51_babbage_io_init(void); extern struct cpu_wp *(*get_cpu_wp)(int *wp); extern void (*set_num_cpu_wp)(int num); static int num_cpu_wp = 3; -static struct pad_desc mx51babbage_pads[] = { - /* UART1 */ - MX51_PAD_UART1_RXD__UART1_RXD, - MX51_PAD_UART1_TXD__UART1_TXD, - MX51_PAD_UART1_RTS__UART1_RTS, - MX51_PAD_UART1_CTS__UART1_CTS, - - /* USB HOST1 */ - MX51_PAD_USBH1_STP__USBH1_STP, - MX51_PAD_USBH1_CLK__USBH1_CLK, - MX51_PAD_USBH1_DIR__USBH1_DIR, - MX51_PAD_USBH1_NXT__USBH1_NXT, - MX51_PAD_USBH1_DATA0__USBH1_DATA0, - MX51_PAD_USBH1_DATA1__USBH1_DATA1, - MX51_PAD_USBH1_DATA2__USBH1_DATA2, - MX51_PAD_USBH1_DATA3__USBH1_DATA3, - MX51_PAD_USBH1_DATA4__USBH1_DATA4, - MX51_PAD_USBH1_DATA5__USBH1_DATA5, - MX51_PAD_USBH1_DATA6__USBH1_DATA6, - MX51_PAD_USBH1_DATA7__USBH1_DATA7, - - MX51_PAD_GPIO_1_0__GPIO_1_0, - MX51_PAD_GPIO_1_1__GPIO_1_1, - MX51_PAD_GPIO_1_4__GPIO_1_4, - MX51_PAD_GPIO_1_5__GPIO_1_5, - MX51_PAD_GPIO_1_6__GPIO_1_6, - MX51_PAD_GPIO_1_7__GPIO_1_7, - MX51_PAD_GPIO_1_8__GPIO_1_8, - MX51_PAD_UART3_RXD__GPIO_1_22, - - MX51_PAD_EIM_D17__GPIO_2_1, - MX51_PAD_EIM_D18__GPIO_2_2, - MX51_PAD_EIM_D21__GPIO_2_5, - MX51_PAD_EIM_D23__GPIO_2_7, - MX51_PAD_EIM_A16__GPIO_2_10, - MX51_PAD_EIM_A17__GPIO_2_11, - MX51_PAD_EIM_A18__GPIO_2_12, - MX51_PAD_EIM_A19__GPIO_2_13, - MX51_PAD_EIM_A20__GPIO_2_14, - MX51_PAD_EIM_A21__GPIO_2_15, - MX51_PAD_EIM_A22__GPIO_2_16, - MX51_PAD_EIM_A23__GPIO_2_17, - MX51_PAD_EIM_A27__GPIO_2_21, - MX51_PAD_EIM_DTACK__GPIO_2_31, - - MX51_PAD_EIM_LBA__GPIO_3_1, - MX51_PAD_DI1_D0_CS__GPIO_3_3, - MX51_PAD_DISPB2_SER_DIN__GPIO_3_5, - MX51_PAD_DISPB2_SER_DIO__GPIO_3_6, - MX51_PAD_NANDF_CS0__GPIO_3_16, - MX51_PAD_NANDF_CS1__GPIO_3_17, - MX51_PAD_NANDF_D14__GPIO_3_26, - MX51_PAD_NANDF_D12__GPIO_3_28, - - MX51_PAD_CSI2_D12__GPIO_4_9, - MX51_PAD_CSI2_D13__GPIO_4_10, - MX51_PAD_CSI2_D19__GPIO_4_12, - MX51_PAD_CSI2_HSYNC__GPIO_4_14, - MX51_PAD_CSPI1_RDY__GPIO_4_26, - - MX51_PAD_EIM_EB2__FEC_MDIO, - MX51_PAD_EIM_EB3__FEC_RDAT1, - MX51_PAD_EIM_CS2__FEC_RDAT2, - MX51_PAD_EIM_CS3__FEC_RDAT3, - MX51_PAD_EIM_CS4__FEC_RX_ER, - MX51_PAD_EIM_CS5__FEC_CRS, - MX51_PAD_NANDF_RB2__FEC_COL, - MX51_PAD_NANDF_RB3__FEC_RXCLK, - MX51_PAD_NANDF_RB6__FEC_RDAT0, - MX51_PAD_NANDF_RB7__FEC_TDAT0, - MX51_PAD_NANDF_CS2__FEC_TX_ER, - MX51_PAD_NANDF_CS3__FEC_MDC, - MX51_PAD_NANDF_CS4__FEC_TDAT1, - MX51_PAD_NANDF_CS5__FEC_TDAT2, - MX51_PAD_NANDF_CS6__FEC_TDAT3, - MX51_PAD_NANDF_CS7__FEC_TX_EN, - MX51_PAD_NANDF_RDY_INT__FEC_TX_CLK, - - MX51_PAD_GPIO_NAND__PATA_INTRQ, - - MX51_PAD_DI_GP4__DI2_PIN15, -#ifdef CONFIG_FB_MXC_CLAA_WVGA_SYNC_PANEL - MX51_PAD_DISP1_DAT22__DISP2_DAT16, - MX51_PAD_DISP1_DAT23__DISP2_DAT17, - - MX51_PAD_DI1_D1_CS__GPIO_3_4, -#endif - MX51_PAD_I2C1_CLK__HSI2C_CLK, - MX51_PAD_I2C1_DAT__HSI2C_DAT, - MX51_PAD_EIM_D16__I2C1_SDA, - MX51_PAD_EIM_D19__I2C1_SCL, - - MX51_PAD_GPIO_1_2__PWM_PWMO, - - MX51_PAD_KEY_COL5__I2C2_SDA, - MX51_PAD_KEY_COL4__I2C2_SCL, - - MX51_PAD_SD1_CMD__SD1_CMD, - MX51_PAD_SD1_CLK__SD1_CLK, - MX51_PAD_SD1_DATA0__SD1_DATA0, - MX51_PAD_SD1_DATA1__SD1_DATA1, - MX51_PAD_SD1_DATA2__SD1_DATA2, - MX51_PAD_SD1_DATA3__SD1_DATA3, - - MX51_PAD_SD2_CMD__SD2_CMD, - MX51_PAD_SD2_CLK__SD2_CLK, - MX51_PAD_SD2_DATA0__SD2_DATA0, - MX51_PAD_SD2_DATA1__SD2_DATA1, - MX51_PAD_SD2_DATA2__SD2_DATA2, - MX51_PAD_SD2_DATA3__SD2_DATA3, - - MX51_PAD_AUD3_BB_TXD__AUD3_BB_TXD, - MX51_PAD_AUD3_BB_RXD__AUD3_BB_RXD, - MX51_PAD_AUD3_BB_CK__AUD3_BB_CK, - MX51_PAD_AUD3_BB_FS__AUD3_BB_FS, - - MX51_PAD_CSPI1_SS1__CSPI1_SS1, - - MX51_PAD_DI_GP3__CSI1_DATA_EN, - MX51_PAD_CSI1_D10__CSI1_D10, - MX51_PAD_CSI1_D11__CSI1_D11, - MX51_PAD_CSI1_D12__CSI1_D12, - MX51_PAD_CSI1_D13__CSI1_D13, - MX51_PAD_CSI1_D14__CSI1_D14, - MX51_PAD_CSI1_D15__CSI1_D15, - MX51_PAD_CSI1_D16__CSI1_D16, - MX51_PAD_CSI1_D17__CSI1_D17, - MX51_PAD_CSI1_D18__CSI1_D18, - MX51_PAD_CSI1_D19__CSI1_D19, - MX51_PAD_CSI1_VSYNC__CSI1_VSYNC, - MX51_PAD_CSI1_HSYNC__CSI1_HSYNC, - - MX51_PAD_OWIRE_LINE__SPDIF_OUT1, -}; - /* working point(wp): 0 - 800MHz; 1 - 166.25MHz; */ static struct cpu_wp cpu_wp_auto[] = { { @@ -298,7 +124,7 @@ static struct fb_videomode video_modes[] = { FB_VMODE_NONINTERLACED, 0,}, { - /*MITSUBISHI LVDS panel */ + /* MITSUBISHI LVDS panel */ "XGA", 60, 1024, 768, 15385, 220, 40, 21, 7, @@ -364,73 +190,10 @@ static struct mxc_vpu_platform_data mxc_vpu_data = { .reset = mx5_vpu_reset, }; -static struct fec_platform_data fec_data = { - .phy = PHY_INTERFACE_MODE_MII, - .phy_mask = ~1UL, -}; - -/* workaround for ecspi chipselect pin may not keep correct level when idle */ -static void mx51_babbage_gpio_spi_chipselect_active(int cspi_mode, int status, - int chipselect) -{ - switch (cspi_mode) { - case 1: - switch (chipselect) { - case 0x1: - { - struct pad_desc cspi1_ss0 = MX51_PAD_CSPI1_SS0__CSPI1_SS0; - - mxc_iomux_v3_setup_pad(&cspi1_ss0); - break; - } - case 0x2: - { - struct pad_desc cspi1_ss0_gpio = MX51_PAD_CSPI1_SS0__GPIO_4_24; - - mxc_iomux_v3_setup_pad(&cspi1_ss0_gpio); - gpio_request(BABBAGE_CSP1_SS0_GPIO, "cspi1-gpio"); - gpio_direction_output(BABBAGE_CSP1_SS0_GPIO, 0); - gpio_set_value(BABBAGE_CSP1_SS0_GPIO, 1 & (~status)); - break; - } - default: - break; - } - break; - case 2: - break; - case 3: - break; - default: - break; - } -} - -static void mx51_babbage_gpio_spi_chipselect_inactive(int cspi_mode, int status, - int chipselect) -{ - switch (cspi_mode) { - case 1: - switch (chipselect) { - case 0x1: - break; - case 0x2: - gpio_free(BABBAGE_CSP1_SS0_GPIO); - break; - - default: - break; - } - break; - case 2: - break; - case 3: - break; - default: - break; - } -} - +extern void mx51_babbage_gpio_spi_chipselect_active(int cspi_mode, int status, + int chipselect); +extern void mx51_babbage_gpio_spi_chipselect_inactive(int cspi_mode, int status, + int chipselect); static struct mxc_spi_master mxcspi1_data = { .maxchipselect = 4, .spi_version = 23, @@ -458,11 +221,11 @@ static struct mxc_dvfs_platform_data dvfs_core_data = { .reg_id = "SW1", .clk1_id = "cpu_clk", .clk2_id = "gpc_dvfs_clk", - .gpc_cntr_offset = MXC_GPC_CNTR_OFFSET, - .gpc_vcr_offset = MXC_GPC_VCR_OFFSET, - .ccm_cdcr_offset = MXC_CCM_CDCR_OFFSET, - .ccm_cacrr_offset = MXC_CCM_CACRR_OFFSET, - .ccm_cdhipr_offset = MXC_CCM_CDHIPR_OFFSET, + .gpc_cntr_reg_addr = MXC_GPC_CNTR, + .gpc_vcr_reg_addr = MXC_GPC_VCR, + .ccm_cdcr_reg_addr = MXC_CCM_CDCR, + .ccm_cacrr_reg_addr = MXC_CCM_CACRR, + .ccm_cdhipr_reg_addr = MXC_CCM_CDHIPR, .prediv_mask = 0x1F800, .prediv_offset = 11, .prediv_val = 3, @@ -533,24 +296,26 @@ static int __init mxc_init_fb(void) return 0; /* DI0-LVDS */ - gpio_set_value(BABBAGE_LVDS_POWER_DOWN, 0); + gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DI1_D0_CS), 0); msleep(1); - gpio_set_value(BABBAGE_LVDS_POWER_DOWN, 1); - gpio_set_value(BABBAGE_LCD_3V3_ON, 1); - gpio_set_value(BABBAGE_LCD_5V_ON, 1); + gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DI1_D0_CS), 1); + gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_CSI2_D12), 1); + gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_CSI2_D13), 1); /* DVI Detect */ - gpio_request(BABBAGE_DVI_DET, "dvi-detect"); - gpio_direction_input(BABBAGE_DVI_DET); + gpio_request(IOMUX_TO_GPIO(MX51_PIN_NANDF_D12), "nandf_d12"); + gpio_direction_input(IOMUX_TO_GPIO(MX51_PIN_NANDF_D12)); /* DVI Reset - Assert for i2c disabled mode */ - gpio_request(BABBAGE_DVI_RESET, "dvi-reset"); - gpio_direction_output(BABBAGE_DVI_RESET, 0); + gpio_request(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), "dispb2_ser_din"); + gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), 0); + gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), 0); /* DVI Power-down */ - gpio_request(BABBAGE_DVI_POWER, "dvi-power"); - gpio_direction_output(BABBAGE_DVI_POWER, 1); + gpio_request(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIO), "dispb2_ser_di0"); + gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIO), 1); + gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIO), 0); /* WVGA Reset */ - gpio_set_value(BABBAGE_DISP_BRIGHTNESS_CTL, 1); + gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DI1_D1_CS), 1); if (primary_di) { printk(KERN_INFO "DI1 is primary\n"); @@ -672,15 +437,15 @@ static int handle_edid(int *pixclk) static void dvi_reset(void) { - gpio_direction_output(BABBAGE_DVI_RESET, 0); - gpio_set_value(BABBAGE_DVI_RESET, 0); + gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), 0); + gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), 0); msleep(50); /* do reset */ - gpio_set_value(BABBAGE_DVI_RESET, 1); + gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), 1); msleep(20); /* tRES >= 50us */ - gpio_set_value(BABBAGE_DVI_RESET, 0); + gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), 0); } static struct mxc_lcd_platform_data dvi_data = { @@ -691,13 +456,14 @@ static struct mxc_lcd_platform_data dvi_data = { static void vga_reset(void) { - - gpio_set_value(BABBAGE_VGA_RESET, 0); + gpio_request(IOMUX_TO_GPIO(MX51_PIN_EIM_A19), "eim_a19"); + gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_EIM_A19), 0); + gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_A19), 0); msleep(50); /* do reset */ - gpio_set_value(BABBAGE_VGA_RESET, 1); + gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_A19), 1); msleep(10); /* tRES >= 50us */ - gpio_set_value(BABBAGE_VGA_RESET, 0); + gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_A19), 0); } static struct mxc_lcd_platform_data vga_data = { @@ -710,23 +476,22 @@ static struct mxc_lcd_platform_data vga_data = { static void si4702_reset(void) { return; - - gpio_set_value(BABBAGE_FM_RESET, 0); + gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_A21), 0); msleep(100); - gpio_set_value(BABBAGE_FM_RESET, 1); + gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_A21), 1); msleep(100); } static void si4702_clock_ctl(int flag) { - gpio_set_value(BABBAGE_FM_PWR, flag); + gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_A18), flag); msleep(100); } static void si4702_gpio_get(void) { - gpio_request(BABBAGE_FM_PWR, "fm-power"); - gpio_direction_output(BABBAGE_FM_PWR, 0); + gpio_request(IOMUX_TO_GPIO(MX51_PIN_EIM_A18), "eim_a18"); + gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_EIM_A18), 0); } static void si4702_gpio_put(void) @@ -852,9 +617,9 @@ static int sdhc_write_protect(struct device *dev) unsigned short rc = 0; if (to_platform_device(dev)->id == 0) - rc = gpio_get_value(BABBAGE_SD1_WP); + rc = gpio_get_value(IOMUX_TO_GPIO(MX51_PIN_GPIO1_1)); else - rc = gpio_get_value(BABBAGE_SD2_WP); + rc = gpio_get_value(IOMUX_TO_GPIO(MX51_PIN_GPIO1_5)); return rc; } @@ -864,15 +629,15 @@ static unsigned int sdhc_get_card_det_status(struct device *dev) int ret; if (to_platform_device(dev)->id == 0) { - ret = gpio_get_value(BABBAGE_SD1_CD); + ret = gpio_get_value(IOMUX_TO_GPIO(MX51_PIN_GPIO1_0)); return ret; } else { /* config the det pin for SDHC2 */ if (board_is_rev(BOARD_REV_2)) /* BB2.5 */ - ret = gpio_get_value(BABBAGE_SD2_CD_2_5); + ret = gpio_get_value(IOMUX_TO_GPIO(MX51_PIN_GPIO1_6)); else /* BB2.0 */ - ret = gpio_get_value(BABBAGE_SD2_CD_2_0); + ret = gpio_get_value(IOMUX_TO_GPIO(MX51_PIN_GPIO1_4)); return ret; } } @@ -900,25 +665,27 @@ static struct mxc_mmc_platform_data mmc2_data = { .status = sdhc_get_card_det_status, .wp_status = sdhc_write_protect, .clock_mmc = "esdhc_clk", - .clk_always_on = 1, }; static int mxc_sgtl5000_amp_enable(int enable) { - gpio_set_value(BABBAGE_AUDAMP_STBY, enable ? 1 : 0); + gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_A23), enable ? 1 : 0); return 0; } static int headphone_det_status(void) { - return (gpio_get_value(BABBAGE_HEADPHONE_DET) == 0); + if (cpu_is_mx51_rev(CHIP_REV_1_1) == 2) + return (gpio_get_value(IOMUX_TO_GPIO(MX51_PIN_NANDF_D14)) == 0); + + return gpio_get_value(IOMUX_TO_GPIO(MX51_PIN_NANDF_CS0)); } static struct mxc_audio_platform_data sgtl5000_data = { .ssi_num = 1, .src_port = 2, .ext_port = 3, - .hp_irq = IOMUX_TO_IRQ_V3(BABBAGE_HEADPHONE_DET), + .hp_irq = IOMUX_TO_IRQ(MX51_PIN_NANDF_D14), .hp_status = headphone_det_status, .amp_enable = mxc_sgtl5000_amp_enable, .sysclk = 12288000, @@ -928,41 +695,6 @@ static struct platform_device mxc_sgtl5000_device = { .name = "imx-3stack-sgtl5000", }; -static int __initdata enable_w1 = { 0 }; -static int __init w1_setup(char *__unused) -{ - enable_w1 = 1; - return cpu_is_mx51(); -} - -__setup("w1", w1_setup); - -static struct android_pmem_platform_data android_pmem_pdata = { - .name = "pmem_adsp", - .start = 0, - .size = SZ_32M, - .no_allocator = 0, - .cached = PMEM_NONCACHE_NORMAL, -}; - -static struct android_pmem_platform_data android_pmem_gpu_pdata = { - .name = "pmem_gpu", - .start = 0, - .size = SZ_32M, - .no_allocator = 0, - .cached = PMEM_CACHE_ENABLE, -}; - -static struct android_usb_platform_data android_usb_pdata = { - .vendor_id = 0x0bb4, - .product_id = 0x0c01, - .adb_product_id = 0x0c02, - .version = 0x0100, - .product_name = "Android Phone", - .manufacturer_name = "Freescale", - .nluns = 3, -}; - /*! * Board specific fixup function. It is called by \b setup_arch() in * setup.c file very early on during kernel starts. It allows the user to @@ -984,32 +716,12 @@ static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags, int left_mem = 0; int gpu_mem = SZ_64M; int fb_mem = SZ_32M; - int size; mxc_set_cpu_type(MXC_CPU_MX51); get_cpu_wp = mx51_babbage_get_cpu_wp; set_num_cpu_wp = mx51_babbage_set_num_cpu_wp; - for_each_tag(t, tags) { - if (t->hdr.tag != ATAG_MEM) - continue; - size = t->u.mem.size; - - android_pmem_pdata.start = - PHYS_OFFSET + size - android_pmem_pdata.size; - android_pmem_gpu_pdata.start = - android_pmem_pdata.start - android_pmem_gpu_pdata.size; - gpu_device.resource[5].start = - android_pmem_gpu_pdata.start - SZ_16M; - gpu_device.resource[5].end = - gpu_device.resource[5].start + SZ_16M - 1; - size -= android_pmem_pdata.size; - size -= android_pmem_gpu_pdata.size; - size -= SZ_16M; - t->u.mem.size = size; - } -#if 0 for_each_tag(mem_tag, tags) { if (mem_tag->hdr.tag == ATAG_MEM) { total_mem = mem_tag->u.mem.size; @@ -1066,83 +778,8 @@ static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags, } #endif } -#endif -} - -static struct switch_dev dvi_sdev; -static int state; -static struct delayed_work dvi_det_work; -static void dvi_update_detect_status(void) -{ - int level; - - level = gpio_get_value(BABBAGE_DVI_DET); - if (level == 1) { - pr_info(KERN_INFO "DVI device plug-in\n"); - state = 1; - } else { - pr_info(KERN_INFO "DVI device plug-out\n"); - state = 0; - } - switch_set_state(&dvi_sdev, state); -} - -static void dvi_work_func(struct work_struct *work) -{ - dvi_update_detect_status(); -} - -static irqreturn_t dvi_det_int(int irq, void *dev_id) -{ - schedule_delayed_work(&dvi_det_work, msecs_to_jiffies(10)); - return 0; } -static ssize_t print_switch_name(struct switch_dev *sdev, char *buf) -{ - return sprintf(buf, "dvi_det\n"); -} - -static ssize_t print_switch_state(struct switch_dev *sdev, char *buf) -{ - return sprintf(buf, "%s\n", (state ? "online" : "offline")); -} - -static int __init mxc_init_dvi_det(void) -{ - int irq, level, ret; - - if (!machine_is_mx51_babbage()) - return 0; - - dvi_sdev.name = "dvi_det"; - dvi_sdev.print_name = print_switch_name; - dvi_sdev.print_state = print_switch_state; - switch_dev_register(&dvi_sdev); - - level = gpio_get_value(BABBAGE_DVI_DET); - if (level == 1) { - pr_info(KERN_INFO "DVI device plug-in\n"); - state = 1; - } else { - pr_info(KERN_INFO "DVI device plug-out\n"); - state = 0; - } - - INIT_DELAYED_WORK(&dvi_det_work, dvi_work_func); - - irq = IOMUX_TO_IRQ_V3(BABBAGE_DVI_DET); - set_irq_type(irq, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING); - ret = request_irq(irq, dvi_det_int, 0, "dvi_det", 0); - if (ret) { - pr_info("register DVI detect interrupt failed\n"); - return -1; - } - return 0; -} -late_initcall(mxc_init_dvi_det); - - #define PWGT1SPIEN (1<<15) #define PWGT2SPIEN (1<<16) #define USEROFFSPI (1<<3) @@ -1174,7 +811,7 @@ static int __init mxc_init_power_key(void) { /* Set power key as wakeup resource */ int irq, ret; - irq = IOMUX_TO_IRQ_V3(BABBAGE_POWER_KEY); + irq = IOMUX_TO_IRQ(MX51_PIN_EIM_A27); set_irq_type(irq, IRQF_TRIGGER_RISING); ret = request_irq(irq, power_key_int, 0, "power_key", 0); if (ret) @@ -1185,113 +822,6 @@ static int __init mxc_init_power_key(void) } late_initcall(mxc_init_power_key); -static void __init mx51_babbage_io_init(void) -{ - mxc_iomux_v3_setup_multiple_pads(mx51babbage_pads, - ARRAY_SIZE(mx51babbage_pads)); - - gpio_request(BABBAGE_PMIC_INT, "pmic-int"); - gpio_request(BABBAGE_SD1_CD, "sdhc1-detect"); - gpio_request(BABBAGE_SD1_WP, "sdhc1-wp"); - - gpio_direction_input(BABBAGE_PMIC_INT); - gpio_direction_input(BABBAGE_SD1_CD); - gpio_direction_input(BABBAGE_SD1_WP); - - if (board_is_rev(BOARD_REV_2)) { - /* SD2 CD for BB2.5 */ - gpio_request(BABBAGE_SD2_CD_2_5, "sdhc2-detect"); - gpio_direction_input(BABBAGE_SD2_CD_2_5); - } else { - /* SD2 CD for BB2.0 */ - gpio_request(BABBAGE_SD2_CD_2_0, "sdhc2-detect"); - gpio_direction_input(BABBAGE_SD2_CD_2_0); - } - gpio_request(BABBAGE_SD2_WP, "sdhc2-wp"); - gpio_direction_input(BABBAGE_SD2_WP); - - /* reset usbh1 hub */ - gpio_request(BABBAGE_USBH1_HUB_RST, "hub-rst"); - gpio_direction_output(BABBAGE_USBH1_HUB_RST, 0); - gpio_set_value(BABBAGE_USBH1_HUB_RST, 0); - msleep(1); - gpio_set_value(BABBAGE_USBH1_HUB_RST, 1); - - /* reset FEC PHY */ - gpio_request(BABBAGE_FEC_PHY_RESET, "fec-phy-reset"); - gpio_direction_output(BABBAGE_FEC_PHY_RESET, 0); - msleep(10); - gpio_set_value(BABBAGE_FEC_PHY_RESET, 1); - - /* reset FM */ - gpio_request(BABBAGE_FM_RESET, "fm-reset"); - gpio_direction_output(BABBAGE_FM_RESET, 0); - msleep(10); - gpio_set_value(BABBAGE_FM_RESET, 1); - - /* Drive 26M_OSC_EN line high */ - gpio_request(BABBAGE_26M_OSC_EN, "26m-osc-en"); - gpio_direction_output(BABBAGE_26M_OSC_EN, 1); - - /* Drive USB_CLK_EN_B line low */ - gpio_request(BABBAGE_USB_CLK_EN_B, "usb-clk_en_b"); - gpio_direction_output(BABBAGE_USB_CLK_EN_B, 0); - - /* De-assert USB PHY RESETB */ - gpio_request(BABBAGE_PHY_RESET, "usb-phy-reset"); - gpio_direction_output(BABBAGE_PHY_RESET, 1); - - /* hphone_det_b */ - gpio_request(BABBAGE_HEADPHONE_DET, "hphone-det"); - gpio_direction_input(BABBAGE_HEADPHONE_DET); - - /* audio_clk_en_b */ - gpio_request(BABBAGE_AUDIO_CLK_EN, "audio-clk-en"); - gpio_direction_output(BABBAGE_AUDIO_CLK_EN, 0); - - /* power key */ - gpio_request(BABBAGE_POWER_KEY, "power-key"); - gpio_direction_input(BABBAGE_POWER_KEY); - - if (cpu_is_mx51_rev(CHIP_REV_3_0) > 0) { - /* DVI_I2C_ENB = 0 tristates the DVI I2C level shifter */ - gpio_request(BABBAGE_DVI_I2C_EN, "dvi-i2c-en"); - gpio_direction_output(BABBAGE_DVI_I2C_EN, 0); - } - - /* Deassert VGA reset to free i2c bus */ - gpio_request(BABBAGE_VGA_RESET, "vga-reset"); - gpio_direction_output(BABBAGE_VGA_RESET, 1); - - /* LCD related gpio */ - gpio_request(BABBAGE_DISP_BRIGHTNESS_CTL, "disp-brightness-ctl"); - gpio_request(BABBAGE_LVDS_POWER_DOWN, "lvds-power-down"); - gpio_request(BABBAGE_LCD_3V3_ON, "lcd-3v3-on"); - gpio_request(BABBAGE_LCD_5V_ON, "lcd-5v-on"); - gpio_direction_output(BABBAGE_DISP_BRIGHTNESS_CTL, 0); - gpio_direction_output(BABBAGE_LVDS_POWER_DOWN, 0); - gpio_direction_output(BABBAGE_LCD_3V3_ON, 0); - gpio_direction_output(BABBAGE_LCD_5V_ON, 0); - - /* Camera reset */ - gpio_request(BABBAGE_CAM_RESET, "cam-reset"); - gpio_direction_output(BABBAGE_CAM_RESET, 1); - - /* Camera low power */ - gpio_request(BABBAGE_CAM_LOW_POWER, "cam-low-power"); - gpio_direction_output(BABBAGE_CAM_LOW_POWER, 0); - - /* OSC_EN */ - gpio_request(BABBAGE_OSC_EN_B, "osc-en"); - gpio_direction_output(BABBAGE_OSC_EN_B, 1); - - if (enable_w1) { - /* OneWire */ - struct pad_desc onewire = MX51_PAD_OWIRE_LINE__OWIRE_LINE; - mxc_iomux_v3_setup_pad(&onewire); - } -} - /*! * Board specific initialization. */ @@ -1299,16 +829,14 @@ static void __init mxc_board_init(void) { mxc_ipu_data.di_clk[0] = clk_get(NULL, "ipu_di0_clk"); mxc_ipu_data.di_clk[1] = clk_get(NULL, "ipu_di1_clk"); - mxc_ipu_data.csi_clk[0] = clk_get(NULL, "csi_mclk1"); - mxc_ipu_data.csi_clk[1] = clk_get(NULL, "csi_mclk2"); mxc_spdif_data.spdif_core_clk = clk_get(NULL, "spdif_xtal_clk"); clk_put(mxc_spdif_data.spdif_core_clk); /* SD card detect irqs */ - mxcsdhc2_device.resource[2].start = IOMUX_TO_IRQ_V3(BABBAGE_SD2_CD_2_5); - mxcsdhc2_device.resource[2].end = IOMUX_TO_IRQ_V3(BABBAGE_SD2_CD_2_5); - mxcsdhc1_device.resource[2].start = IOMUX_TO_IRQ_V3(BABBAGE_SD1_CD); - mxcsdhc1_device.resource[2].end = IOMUX_TO_IRQ_V3(BABBAGE_SD1_CD); + mxcsdhc2_device.resource[2].start = IOMUX_TO_IRQ(MX51_PIN_GPIO1_6); + mxcsdhc2_device.resource[2].end = IOMUX_TO_IRQ(MX51_PIN_GPIO1_6); + mxcsdhc1_device.resource[2].start = IOMUX_TO_IRQ(MX51_PIN_GPIO1_0); + mxcsdhc1_device.resource[2].end = IOMUX_TO_IRQ(MX51_PIN_GPIO1_0); mxc_cpu_common_init(); mxc_register_gpios(); @@ -1341,12 +869,7 @@ static void __init mxc_board_init(void) mxc_register_device(&mxc_ssi1_device, NULL); mxc_register_device(&mxc_ssi2_device, NULL); mxc_register_device(&mxc_alsa_spdif_device, &mxc_spdif_data); - mxc_register_device(&mxc_fec_device, &fec_data); - mxc_register_device(&mxc_v4l2_device, NULL); - mxc_register_device(&mxc_v4l2out_device, NULL); - mxc_register_device(&mxc_android_pmem_device, &android_pmem_pdata); - mxc_register_device(&mxc_android_pmem_gpu_device, &android_pmem_gpu_pdata); - mxc_register_device(&android_usb_device, &android_usb_pdata); + mxc_register_device(&mxc_fec_device, NULL); mx51_babbage_init_mc13892(); @@ -1377,8 +900,8 @@ static void __init mxc_board_init(void) if (cpu_is_mx51_rev(CHIP_REV_1_1) == 2) { sgtl5000_data.sysclk = 26000000; } - gpio_request(BABBAGE_AUDAMP_STBY, "audioamp-stdby"); - gpio_direction_output(BABBAGE_AUDAMP_STBY, 0); + gpio_request(IOMUX_TO_GPIO(MX51_PIN_EIM_A23), "eim_a23"); + gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_EIM_A23), 0); mxc_register_device(&mxc_sgtl5000_device, &sgtl5000_data); mx5_usb_dr_init(); diff --git a/arch/arm/mach-mx5/mx51_babbage_gpio.c b/arch/arm/mach-mx5/mx51_babbage_gpio.c index 4b3e2ee73faf..5d484b78832b 100644 --- a/arch/arm/mach-mx5/mx51_babbage_gpio.c +++ b/arch/arm/mach-mx5/mx51_babbage_gpio.c @@ -270,59 +270,83 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = { }, { MX51_PIN_SD1_CMD, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, - (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX51_PIN_SD1_CLK, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, - (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_ENABLE + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX51_PIN_SD1_DATA0, IOMUX_CONFIG_ALT0, - (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX51_PIN_SD1_DATA1, IOMUX_CONFIG_ALT0, - (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX51_PIN_SD1_DATA2, IOMUX_CONFIG_ALT0, - (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX51_PIN_SD1_DATA3, IOMUX_CONFIG_ALT0, - (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX51_PIN_GPIO1_0, IOMUX_CONFIG_GPIO | IOMUX_CONFIG_SION, (PAD_CTL_HYS_ENABLE | PAD_CTL_100K_PU), }, { - MX51_PIN_GPIO1_1, IOMUX_CONFIG_GPIO | IOMUX_CONFIG_SION, + MX51_PIN_GPIO1_1, IOMUX_CONFIG_GPIO, (PAD_CTL_HYS_ENABLE | PAD_CTL_100K_PU), }, { MX51_PIN_SD2_CMD, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, - (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX51_PIN_SD2_CLK, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, - (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_ENABLE + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { - MX51_PIN_SD2_DATA0, IOMUX_CONFIG_ALT0, - (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST), + MX51_PIN_SD2_DATA0, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { - MX51_PIN_SD2_DATA1, IOMUX_CONFIG_ALT0, - (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST), + MX51_PIN_SD2_DATA1, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { - MX51_PIN_SD2_DATA2, IOMUX_CONFIG_ALT0, - (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST), + MX51_PIN_SD2_DATA2, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { - MX51_PIN_SD2_DATA3, IOMUX_CONFIG_ALT0, - (PAD_CTL_DRV_MAX | PAD_CTL_22K_PU | PAD_CTL_SRE_FAST), + MX51_PIN_SD2_DATA3, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX51_PIN_GPIO1_4, IOMUX_CONFIG_GPIO | IOMUX_CONFIG_SION, @@ -461,7 +485,7 @@ static int __initdata enable_w1 = { 0 }; static int __init w1_setup(char *__unused) { enable_w1 = 1; - return 1; + return cpu_is_mx51(); } __setup("w1", w1_setup); diff --git a/arch/arm/mach-mx5/mx51_babbage_pmic_mc13892.c b/arch/arm/mach-mx5/mx51_babbage_pmic_mc13892.c index 1626c95d54d2..c97d2191b94b 100644 --- a/arch/arm/mach-mx5/mx51_babbage_pmic_mc13892.c +++ b/arch/arm/mach-mx5/mx51_babbage_pmic_mc13892.c @@ -23,8 +23,8 @@ #include <linux/regulator/machine.h> #include <linux/mfd/mc13892/core.h> #include <mach/irqs.h> -#include <mach/hardware.h> -#include <mach/iomux-mx51.h> +#include "iomux.h" +#include "mx51_pins.h" /* * Convenience conversion. @@ -406,7 +406,7 @@ static struct mc13892_platform_data mc13892_plat = { static struct spi_board_info __initdata mc13892_spi_device = { .modalias = "pmic_spi", - .irq = IOMUX_TO_IRQ_V3(8), + .irq = IOMUX_TO_IRQ(MX51_PIN_GPIO1_8), .max_speed_hz = 6000000, /* max spi SCK clock speed in HZ */ .bus_num = 1, .chip_select = 0, diff --git a/arch/arm/mach-mx5/mx51_ccwmx51js.c b/arch/arm/mach-mx5/mx51_ccwmx51js.c index bbacfc981d73..0ac060056f35 100644 --- a/arch/arm/mach-mx5/mx51_ccwmx51js.c +++ b/arch/arm/mach-mx5/mx51_ccwmx51js.c @@ -51,8 +51,6 @@ #include "mx51_pins.h" #include "devices_ccwmx51.h" #include "usb.h" -#include "linux/android_pmem.h" -#include "linux/usb/android.h" extern struct cpu_wp *(*get_cpu_wp)(int *wp); extern void (*set_num_cpu_wp)(int num); @@ -145,36 +143,6 @@ void mx51_set_num_cpu_wp(int num) return; } -#if defined CONFIG_ANDROID_PMEM -static struct android_pmem_platform_data android_pmem_pdata = { - .name = "pmem_adsp", - .start = 0, - .size = SZ_32M, - .no_allocator = 0, - .cached = PMEM_NONCACHE_NORMAL, -}; - -static struct android_pmem_platform_data android_pmem_gpu_pdata = { - .name = "pmem_gpu", - .start = 0, - .size = SZ_32M, - .no_allocator = 0, - .cached = PMEM_CACHE_ENABLE, -}; -#endif - -#ifdef CONFIG_USB_ANDROID -static struct android_usb_platform_data android_usb_pdata = { - .vendor_id = 0x0bb4, - .product_id = 0x0c01, - .adb_product_id = 0x0c02, - .version = 0x0100, - .product_name = "Android Phone", - .manufacturer_name = "Freescale", - .nluns = 3, -}; -#endif - /*! * Board specific fixup function. It is called by \b setup_arch() in * setup.c file very early on during kernel starts. It allows the user to @@ -189,48 +157,19 @@ static struct android_usb_platform_data android_usb_pdata = { static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags, char **cmdline, struct meminfo *mi) { - struct tag *t; -#ifdef CONFIG_ANDROID - int size; -#else char *str; + struct tag *t; struct tag *mem_tag = 0; int total_mem = SZ_512M; int left_mem = 0; int gpu_mem = SZ_64M; int fb_mem = FB_MEM_SIZE; -#endif mxc_set_cpu_type(MXC_CPU_MX51); get_cpu_wp = mx51_get_cpu_wp; set_num_cpu_wp = mx51_set_num_cpu_wp; -#ifdef CONFIG_ANDROID - // TODO: Dual head support for Android. - // See commit 358e938e78b3380357f8f0c6dd54fa9fe4cc84c5 - // This commit removes Digi's dual display customizations - - for_each_tag(t, tags) { - if (t->hdr.tag != ATAG_MEM) - continue; - size = t->u.mem.size; - - android_pmem_pdata.start = - PHYS_OFFSET + size - android_pmem_pdata.size; - android_pmem_gpu_pdata.start = - android_pmem_pdata.start - android_pmem_gpu_pdata.size; - gpu_device.resource[5].start = - android_pmem_gpu_pdata.start - SZ_16M; - gpu_device.resource[5].end = - gpu_device.resource[5].start + SZ_16M - 1; - size -= android_pmem_pdata.size; - size -= android_pmem_gpu_pdata.size; - size -= SZ_16M; - t->u.mem.size = size; - } - -#else for_each_tag(mem_tag, tags) { if (mem_tag->hdr.tag == ATAG_MEM) { total_mem = mem_tag->u.mem.size; @@ -268,7 +207,6 @@ static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags, fb_mem = 0; } mem_tag->u.mem.size = left_mem; - #if defined(CONFIG_CCWMX51_DISP1) && defined(CONFIG_CCWMX51_DISP2) fb_mem = fb_mem / 2; /* Divide the mem for between the displays */ #endif @@ -298,9 +236,6 @@ static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags, } #endif } -#endif - - } #define PWGT1SPIEN (1<<15) @@ -376,13 +311,6 @@ static void __init mxc_board_init(void) #endif mxc_register_device(&mxc_pwm1_device, NULL); mxc_register_device(&mxc_pwm_backlight_device, &mxc_pwm_backlight_data); -#ifdef CONFIG_ANDROID_PMEM - mxc_register_device(&mxc_android_pmem_device, &android_pmem_pdata); - mxc_register_device(&mxc_android_pmem_gpu_device, &android_pmem_gpu_pdata); -#endif -#ifdef CONFIG_USB_ANDROID - mxc_register_device(&android_usb_device, &android_usb_pdata); -#endif #ifdef CONFIG_ESDHCI_MXC_SELECT1 ccwmx51_register_sdio(0); /* SDHC1 */ @@ -393,7 +321,7 @@ static void __init mxc_board_init(void) #endif /* CONFIG_ESDHCI_MXC_SELECT3 && !CONFIG_PATA_FSL && !CONFIG_PATA_FSL_MODULE */ #if defined(CONFIG_FEC) || defined(CONFIG_FEC_MODULE) - mxc_register_device(&mxc_fec_device, &fec_data); + mxc_register_device(&mxc_fec_device, NULL); #endif #if defined(CONFIG_MTD_NAND_MXC) \ || defined(CONFIG_MTD_NAND_MXC_MODULE) \ @@ -435,9 +363,6 @@ static void __init mxc_board_init(void) #ifdef CONFIG_CCWMX51_SECOND_TOUCH ccwmx51_init_2nd_touch(); #endif -#if defined(CONFIG_KEYBOARD_GPIO) - mxc_register_device(&ccwmx51js_keys_gpio, &ccwmx51js_gpio_key_info); -#endif pm_power_off = mxc_power_off; } diff --git a/arch/arm/mach-mx5/mx53_evk.c b/arch/arm/mach-mx5/mx53_evk.c index 702d7d8912d0..443857c76a84 100644 --- a/arch/arm/mach-mx5/mx53_evk.c +++ b/arch/arm/mach-mx5/mx53_evk.c @@ -57,47 +57,11 @@ #include <mach/gpio.h> #include <mach/mmc.h> #include <mach/mxc_dvfs.h> -#include <mach/iomux-mx53.h> - +#include "iomux.h" +#include "mx53_pins.h" #include "crm_regs.h" #include "devices.h" #include "usb.h" -#include <linux/android_pmem.h> -#include <linux/usb/android.h> - -#define ARM2_SD1_CD (0*32 + 1) /* GPIO_1_1 */ - -#define MX53_HP_DETECT (1*32 + 5) /* GPIO_2_5 */ - -#define EVK_SD3_CD (2*32 + 11) /* GPIO_3_11 */ -#define EVK_SD3_WP (2*32 + 12) /* GPIO_3_12 */ -#define EVK_SD1_CD (2*32 + 13) /* GPIO_3_13 */ -#define EVK_SD1_WP (2*32 + 14) /* GPIO_3_14 */ -#define ARM2_OTG_VBUS (2*32 + 22) /* GPIO_3_22 */ -#define MX53_DVI_PD (2*32 + 24) /* GPIO_3_24 */ -#define EVK_TS_INT (2*32 + 26) /* GPIO_3_26 */ -#define MX53_DVI_I2C (2*32 + 28) /* GPIO_3_28 */ -#define MX53_DVI_DETECT (2*32 + 31) /* GPIO_3_31 */ - -#define MX53_CAM_RESET (3*32 + 0) /* GPIO_4_0 */ -#define MX53_ESAI_RESET (3*32 + 2) /* GPIO_4_2 */ -#define MX53_CAN2_EN2 (3*32 + 4) /* GPIO_4_4 */ -#define MX53_12V_EN (3*32 + 5) /* GPIO_4_5 */ -#define ARM2_LCD_CONTRAST (3*32 + 20) /* GPIO_4_20 */ - -#define MX53_DVI_RESET (4*32 + 0) /* GPIO_5_0 */ -#define EVK_USB_HUB_RESET (4*32 + 20) /* GPIO_5_20 */ -#define MX53_TVIN_PWR (4*32 + 23) /* GPIO_5_23 */ -#define MX53_CAN2_EN1 (4*32 + 24) /* GPIO_5_24 */ -#define MX53_TVIN_RESET (4*32 + 25) /* GPIO_5_25 */ - -#define EVK_OTG_VBUS (5*32 + 6) /* GPIO_6_6 */ - -#define EVK_FEC_PHY_RESET (6*32 + 6) /* GPIO_7_6 */ -#define EVK_USBH1_VBUS (6*32 + 8) /* GPIO_7_8 */ -#define MX53_PMIC_INT (6*32 + 11) /* GPIO_7_11 */ -#define MX53_CAN1_EN1 (6*32 + 12) /* GPIO_7_12 */ -#define MX53_CAN1_EN2 (6*32 + 13) /* GPIO_7_13 */ /*! * @file mach-mx53/mx53_evk.c @@ -107,297 +71,11 @@ * @ingroup MSL_MX53 */ extern int __init mx53_evk_init_mc13892(void); +extern void __init mx53_evk_io_init(void); extern struct cpu_wp *(*get_cpu_wp)(int *wp); extern void (*set_num_cpu_wp)(int num); static int num_cpu_wp = 3; -static struct pad_desc mx53common_pads[] = { - MX53_PAD_EIM_WAIT__GPIO_5_0, - - MX53_PAD_EIM_OE__DI1_PIN7, - MX53_PAD_EIM_RW__DI1_PIN8, - - MX53_PAD_EIM_A25__DI0_D1_CS, - - MX53_PAD_EIM_D16__CSPI1_SCLK, - MX53_PAD_EIM_D17__CSPI1_MISO, - MX53_PAD_EIM_D18__CSPI1_MOSI, - - MX53_PAD_EIM_D20__SER_DISP0_CS, - - MX53_PAD_EIM_D23__DI0_D0_CS, - - MX53_PAD_EIM_D24__GPIO_3_24, - MX53_PAD_EIM_D26__GPIO_3_26, - - MX53_PAD_EIM_D29__DISPB0_SER_RS, - - MX53_PAD_EIM_D30__DI0_PIN11, - MX53_PAD_EIM_D31__DI0_PIN12, - - MX53_PAD_ATA_DA_1__GPIO_7_7, - MX53_PAD_ATA_DATA4__GPIO_2_4, - MX53_PAD_ATA_DATA5__GPIO_2_5, - MX53_PAD_ATA_DATA6__GPIO_2_6, - - MX53_PAD_SD2_CLK__SD2_CLK, - MX53_PAD_SD2_CMD__SD2_CMD, - MX53_PAD_SD2_DATA0__SD2_DAT0, - MX53_PAD_SD2_DATA1__SD2_DAT1, - MX53_PAD_SD2_DATA2__SD2_DAT2, - MX53_PAD_SD2_DATA3__SD2_DAT3, - MX53_PAD_ATA_DATA12__SD2_DAT4, - MX53_PAD_ATA_DATA13__SD2_DAT5, - MX53_PAD_ATA_DATA14__SD2_DAT6, - MX53_PAD_ATA_DATA15__SD2_DAT7, - - MX53_PAD_CSI0_D10__UART1_TXD, - MX53_PAD_CSI0_D11__UART1_RXD, - - MX53_PAD_ATA_BUFFER_EN__UART2_RXD, - MX53_PAD_ATA_DMARQ__UART2_TXD, - MX53_PAD_ATA_DIOR__UART2_RTS, - MX53_PAD_ATA_INTRQ__UART2_CTS, - - MX53_PAD_ATA_CS_0__UART3_TXD, - MX53_PAD_ATA_CS_1__UART3_RXD, - - MX53_PAD_KEY_COL0__AUD5_TXC, - MX53_PAD_KEY_ROW0__AUD5_TXD, - MX53_PAD_KEY_COL1__AUD5_TXFS, - MX53_PAD_KEY_ROW1__AUD5_RXD, - - MX53_PAD_CSI0_D7__GPIO_5_25, - - MX53_PAD_GPIO_2__MLBDAT, - MX53_PAD_GPIO_3__MLBCLK, - - MX53_PAD_GPIO_6__MLBSIG, - - MX53_PAD_GPIO_4__GPIO_1_4, - MX53_PAD_GPIO_7__GPIO_1_7, - MX53_PAD_GPIO_8__GPIO_1_8, - - MX53_PAD_GPIO_10__GPIO_4_0, - - MX53_PAD_KEY_COL2__TXCAN1, - MX53_PAD_KEY_ROW2__RXCAN1, - - /* CAN1 -- EN */ - MX53_PAD_GPIO_18__GPIO_7_13, - /* CAN1 -- STBY */ - MX53_PAD_GPIO_17__GPIO_7_12, - /* CAN1 -- NERR */ - MX53_PAD_GPIO_5__GPIO_1_5, - - MX53_PAD_KEY_COL4__TXCAN2, - MX53_PAD_KEY_ROW4__RXCAN2, - - /* CAN2 -- EN */ - MX53_PAD_CSI0_D6__GPIO_5_24, - /* CAN2 -- STBY */ - MX53_PAD_GPIO_14__GPIO_4_4, - /* CAN2 -- NERR */ - MX53_PAD_CSI0_D4__GPIO_5_22, - - MX53_PAD_GPIO_11__GPIO_4_1, - MX53_PAD_GPIO_12__GPIO_4_2, - MX53_PAD_GPIO_13__GPIO_4_3, - MX53_PAD_GPIO_16__GPIO_7_11, - MX53_PAD_GPIO_19__GPIO_4_5, - - /* DI0 display clock */ - MX53_PAD_DI0_DISP_CLK__DI0_DISP_CLK, - - /* DI0 data enable */ - MX53_PAD_DI0_PIN15__DI0_PIN15, - /* DI0 HSYNC */ - MX53_PAD_DI0_PIN2__DI0_PIN2, - /* DI0 VSYNC */ - MX53_PAD_DI0_PIN3__DI0_PIN3, - - MX53_PAD_DISP0_DAT0__DISP0_DAT0, - MX53_PAD_DISP0_DAT1__DISP0_DAT1, - MX53_PAD_DISP0_DAT2__DISP0_DAT2, - MX53_PAD_DISP0_DAT3__DISP0_DAT3, - MX53_PAD_DISP0_DAT4__DISP0_DAT4, - MX53_PAD_DISP0_DAT5__DISP0_DAT5, - MX53_PAD_DISP0_DAT6__DISP0_DAT6, - MX53_PAD_DISP0_DAT7__DISP0_DAT7, - MX53_PAD_DISP0_DAT8__DISP0_DAT8, - MX53_PAD_DISP0_DAT9__DISP0_DAT9, - MX53_PAD_DISP0_DAT10__DISP0_DAT10, - MX53_PAD_DISP0_DAT11__DISP0_DAT11, - MX53_PAD_DISP0_DAT12__DISP0_DAT12, - MX53_PAD_DISP0_DAT13__DISP0_DAT13, - MX53_PAD_DISP0_DAT14__DISP0_DAT14, - MX53_PAD_DISP0_DAT15__DISP0_DAT15, - MX53_PAD_DISP0_DAT16__DISP0_DAT16, - MX53_PAD_DISP0_DAT17__DISP0_DAT17, - MX53_PAD_DISP0_DAT18__DISP0_DAT18, - MX53_PAD_DISP0_DAT19__DISP0_DAT19, - MX53_PAD_DISP0_DAT20__DISP0_DAT20, - MX53_PAD_DISP0_DAT21__DISP0_DAT21, - MX53_PAD_DISP0_DAT22__DISP0_DAT22, - MX53_PAD_DISP0_DAT23__DISP0_DAT23, - - MX53_PAD_LVDS0_TX3_P__LVDS0_TX3, - MX53_PAD_LVDS0_CLK_P__LVDS0_CLK, - MX53_PAD_LVDS0_TX2_P__LVDS0_TX2, - MX53_PAD_LVDS0_TX1_P__LVDS0_TX1, - MX53_PAD_LVDS0_TX0_P__LVDS0_TX0, - - MX53_PAD_LVDS1_TX3_P__LVDS1_TX3, - MX53_PAD_LVDS1_CLK_P__LVDS1_CLK, - MX53_PAD_LVDS1_TX2_P__LVDS1_TX2, - MX53_PAD_LVDS1_TX1_P__LVDS1_TX1, - MX53_PAD_LVDS1_TX0_P__LVDS1_TX0, - - /* audio and CSI clock out */ - MX53_PAD_GPIO_0__SSI_EXT1_CLK, - - MX53_PAD_CSI0_D12__CSI0_D12, - MX53_PAD_CSI0_D13__CSI0_D13, - MX53_PAD_CSI0_D14__CSI0_D14, - MX53_PAD_CSI0_D15__CSI0_D15, - MX53_PAD_CSI0_D16__CSI0_D16, - MX53_PAD_CSI0_D17__CSI0_D17, - MX53_PAD_CSI0_D18__CSI0_D18, - MX53_PAD_CSI0_D19__CSI0_D19, - - MX53_PAD_CSI0_VSYNC__CSI0_VSYNC, - MX53_PAD_CSI0_MCLK__CSI0_HSYNC, - MX53_PAD_CSI0_PIXCLK__CSI0_PIXCLK, - /* Camera low power */ - MX53_PAD_CSI0_D5__GPIO_5_23, - - /* esdhc1 */ - MX53_PAD_SD1_CMD__SD1_CMD, - MX53_PAD_SD1_CLK__SD1_CLK, - MX53_PAD_SD1_DATA0__SD1_DATA0, - MX53_PAD_SD1_DATA1__SD1_DATA1, - MX53_PAD_SD1_DATA2__SD1_DATA2, - MX53_PAD_SD1_DATA3__SD1_DATA3, - - /* esdhc3 */ - MX53_PAD_ATA_DATA8__SD3_DAT0, - MX53_PAD_ATA_DATA9__SD3_DAT1, - MX53_PAD_ATA_DATA10__SD3_DAT2, - MX53_PAD_ATA_DATA11__SD3_DAT3, - MX53_PAD_ATA_DATA0__SD3_DAT4, - MX53_PAD_ATA_DATA1__SD3_DAT5, - MX53_PAD_ATA_DATA2__SD3_DAT6, - MX53_PAD_ATA_DATA3__SD3_DAT7, - MX53_PAD_ATA_RESET_B__SD3_CMD, - MX53_PAD_ATA_IORDY__SD3_CLK, - - /* FEC pins */ - MX53_PAD_FEC_MDIO__FEC_MDIO, - MX53_PAD_FEC_REF_CLK__FEC_REF_CLK, - MX53_PAD_FEC_RX_ER__FEC_RX_ER, - MX53_PAD_FEC_CRS_DV__FEC_CRS_DV, - MX53_PAD_FEC_RXD1__FEC_RXD1, - MX53_PAD_FEC_RXD0__FEC_RXD0, - MX53_PAD_FEC_TX_EN__FEC_TX_EN, - MX53_PAD_FEC_TXD1__FEC_TXD1, - MX53_PAD_FEC_TXD0__FEC_TXD0, - MX53_PAD_FEC_MDC__FEC_MDC, - - MX53_PAD_CSI0_D8__I2C1_SDA, - MX53_PAD_CSI0_D9__I2C1_SCL, - - MX53_PAD_KEY_COL3__I2C2_SCL, - MX53_PAD_KEY_ROW3__I2C2_SDA, -}; - -static struct pad_desc mx53evk_pads[] = { - /* USB OTG USB_OC */ - MX53_PAD_EIM_A24__GPIO_5_4, - - /* USB OTG USB_PWR */ - MX53_PAD_EIM_A23__GPIO_6_6, - - /* DISPB0_SER_CLK */ - MX53_PAD_EIM_D21__DISPB0_SER_CLK, - - /* DI0_PIN1 */ - MX53_PAD_EIM_D22__DISPB0_SER_DIN, - - /* DVI I2C ENABLE */ - MX53_PAD_EIM_D28__GPIO_3_28, - - /* DVI DET */ - MX53_PAD_EIM_D31__GPIO_3_31, - - /* SDHC1 SD_CD */ - MX53_PAD_EIM_DA13__GPIO_3_13, - - /* SDHC1 SD_WP */ - MX53_PAD_EIM_DA14__GPIO_3_14, - - /* SDHC3 SD_CD */ - MX53_PAD_EIM_DA11__GPIO_3_11, - - /* SDHC3 SD_WP */ - MX53_PAD_EIM_DA12__GPIO_3_12, - - /* PWM backlight */ - MX53_PAD_GPIO_1__PWMO, - - /* USB HOST USB_PWR */ - MX53_PAD_ATA_DA_2__GPIO_7_8, - - /* USB HOST USB_RST */ - MX53_PAD_CSI0_DATA_EN__GPIO_5_20, - - /* USB HOST CARD_ON */ - MX53_PAD_EIM_DA15__GPIO_3_15, - - /* USB HOST CARD_RST */ - MX53_PAD_ATA_DATA7__GPIO_2_7, - - /* USB HOST WAN_WAKE */ - MX53_PAD_EIM_D25__GPIO_3_25, - - /* FEC_RST */ - MX53_PAD_ATA_DA_0__GPIO_7_6, -}; - -static struct pad_desc mx53arm2_pads[] = { - /* USB OTG USB_OC */ - MX53_PAD_EIM_D21__GPIO_3_21, - - /* USB OTG USB_PWR */ - MX53_PAD_EIM_D22__GPIO_3_22, - - /* SDHC1 SD_CD */ - MX53_PAD_GPIO_1__GPIO_1_1, - - /* gpio backlight */ - MX53_PAD_DI0_PIN4__GPIO_4_20, -}; - -static struct pad_desc mx53_nand_pads[] = { - MX53_PAD_NANDF_CLE__NANDF_CLE, - MX53_PAD_NANDF_ALE__NANDF_ALE, - MX53_PAD_NANDF_WP_B__NANDF_WP_B, - MX53_PAD_NANDF_WE_B__NANDF_WE_B, - MX53_PAD_NANDF_RE_B__NANDF_RE_B, - MX53_PAD_NANDF_RB0__NANDF_RB0, - MX53_PAD_NANDF_CS0__NANDF_CS0, - MX53_PAD_NANDF_CS1__NANDF_CS1 , - MX53_PAD_NANDF_CS2__NANDF_CS2, - MX53_PAD_NANDF_CS3__NANDF_CS3 , - MX53_PAD_EIM_DA0__EIM_DA0, - MX53_PAD_EIM_DA1__EIM_DA1, - MX53_PAD_EIM_DA2__EIM_DA2, - MX53_PAD_EIM_DA3__EIM_DA3, - MX53_PAD_EIM_DA4__EIM_DA4, - MX53_PAD_EIM_DA5__EIM_DA5, - MX53_PAD_EIM_DA6__EIM_DA6, - MX53_PAD_EIM_DA7__EIM_DA7, -}; - /* working point(wp): 0 - 800MHz; 1 - 166.25MHz; */ static struct cpu_wp cpu_wp_auto[] = { { @@ -511,40 +189,10 @@ static struct platform_pwm_backlight_data mxc_pwm_backlight_data = { .pwm_id = 1, .max_brightness = 255, .dft_brightness = 128, - .pwm_period_ns = 50000, + .pwm_period_ns = 78770, }; -static void flexcan_xcvr_enable(int id, int en) -{ - static int pwdn; - if (id < 0 || id > 1) - return; - - if (en) { - if (!(pwdn++)) - gpio_set_value(MX53_12V_EN, 1); - - if (id == 0) { - gpio_set_value(MX53_CAN1_EN1, 1); - gpio_set_value(MX53_CAN1_EN2, 1); - } else { - gpio_set_value(MX53_CAN2_EN1, 1); - gpio_set_value(MX53_CAN2_EN2, 1); - } - - } else { - if (!(--pwdn)) - gpio_set_value(MX53_12V_EN, 0); - - if (id == 0) { - gpio_set_value(MX53_CAN1_EN1, 0); - gpio_set_value(MX53_CAN1_EN2, 0); - } else { - gpio_set_value(MX53_CAN2_EN1, 0); - gpio_set_value(MX53_CAN2_EN2, 0); - } - } -} +extern void flexcan_xcvr_enable(int id, int en); static struct flexcan_platform_data flexcan0_data = { .core_reg = NULL, @@ -594,72 +242,12 @@ static struct mxc_vpu_platform_data mxc_vpu_data = { static struct fec_platform_data fec_data = { .phy = PHY_INTERFACE_MODE_RMII, - .phy_mask = ~1UL, }; -/* workaround for ecspi chipselect pin may not keep correct level when idle */ -static void mx53_evk_gpio_spi_chipselect_active(int cspi_mode, int status, - int chipselect) -{ - switch (cspi_mode) { - case 1: - switch (chipselect) { - case 0x1: - { - struct pad_desc eim_d19_gpio = MX53_PAD_EIM_D19__GPIO_3_19; - struct pad_desc cspi_ss0 = MX53_PAD_EIM_EB2__CSPI_SS0; - - /* de-select SS1 of instance: ecspi1. */ - mxc_iomux_v3_setup_pad(&eim_d19_gpio); - mxc_iomux_v3_setup_pad(&cspi_ss0); - } - break; - case 0x2: - { - struct pad_desc eim_eb2_gpio = MX53_PAD_EIM_EB2__GPIO_2_30; - struct pad_desc cspi_ss1 = MX53_PAD_EIM_D19__CSPI_SS1; - - /* de-select SS0 of instance: ecspi1. */ - mxc_iomux_v3_setup_pad(&eim_eb2_gpio); - mxc_iomux_v3_setup_pad(&cspi_ss1); - } - break; - default: - break; - } - break; - case 2: - break; - case 3: - break; - default: - break; - } -} - -static void mx53_evk_gpio_spi_chipselect_inactive(int cspi_mode, int status, - int chipselect) -{ - switch (cspi_mode) { - case 1: - switch (chipselect) { - case 0x1: - break; - case 0x2: - break; - default: - break; - } - break; - case 2: - break; - case 3: - break; - default: - break; - } -} - +extern void mx53_evk_gpio_spi_chipselect_active(int cspi_mode, int status, + int chipselect); +extern void mx53_evk_gpio_spi_chipselect_inactive(int cspi_mode, int status, + int chipselect); static struct mxc_spi_master mxcspi1_data = { .maxchipselect = 4, .spi_version = 23, @@ -679,11 +267,11 @@ static struct mxc_dvfs_platform_data dvfs_core_data = { .reg_id = "SW1", .clk1_id = "cpu_clk", .clk2_id = "gpc_dvfs_clk", - .gpc_cntr_offset = MXC_GPC_CNTR_OFFSET, - .gpc_vcr_offset = MXC_GPC_VCR_OFFSET, - .ccm_cdcr_offset = MXC_CCM_CDCR_OFFSET, - .ccm_cacrr_offset = MXC_CCM_CACRR_OFFSET, - .ccm_cdhipr_offset = MXC_CCM_CDHIPR_OFFSET, + .gpc_cntr_reg_addr = MXC_GPC_CNTR, + .gpc_vcr_reg_addr = MXC_GPC_VCR, + .ccm_cdcr_reg_addr = MXC_CCM_CDCR, + .ccm_cacrr_reg_addr = MXC_CCM_CACRR, + .ccm_cdhipr_reg_addr = MXC_CCM_CDHIPR, .prediv_mask = 0x1F800, .prediv_offset = 11, .prediv_val = 3, @@ -709,98 +297,18 @@ static struct ldb_platform_data ldb_data = { .ext_ref = 1, }; -static struct pad_desc mx53esai_pads[] = { - MX53_PAD_FEC_MDIO__ESAI_SCKR, - MX53_PAD_FEC_REF_CLK__ESAI_FSR, - MX53_PAD_FEC_RX_ER__ESAI_HCKR, - MX53_PAD_FEC_CRS_DV__ESAI_SCKT, - MX53_PAD_FEC_RXD1__ESAI_FST, - MX53_PAD_FEC_RXD0__ESAI_HCKT, - MX53_PAD_FEC_TX_EN__ESAI_TX3_RX2, - MX53_PAD_FEC_TXD1__ESAI_TX2_RX3, - MX53_PAD_FEC_TXD0__ESAI_TX4_RX1, - MX53_PAD_FEC_MDC__ESAI_TX5_RX0, - MX53_PAD_NANDF_CS2__ESAI_TX0, - MX53_PAD_NANDF_CS3__ESAI_TX1, -}; - -void gpio_activate_esai_ports(void) -{ - mxc_iomux_v3_setup_multiple_pads(mx53esai_pads, - ARRAY_SIZE(mx53esai_pads)); -} - static struct mxc_esai_platform_data esai_data = { .activate_esai_ports = gpio_activate_esai_ports, }; -void gpio_cs42888_pdwn(int pdwn) -{ - if (pdwn) - gpio_set_value(MX53_ESAI_RESET, 0); - else - gpio_set_value(MX53_ESAI_RESET, 1); -} -EXPORT_SYMBOL(gpio_cs42888_pdwn); - -static void gpio_usbotg_vbus_active(void) -{ - if (board_is_mx53_arm2()) { - /* MX53 ARM2 CPU board */ - /* Enable OTG VBus with GPIO low */ - gpio_set_value(ARM2_OTG_VBUS, 0); - } else if (board_is_mx53_evk_a()) { - /* MX53 EVK board ver A*/ - /* Enable OTG VBus with GPIO low */ - gpio_set_value(EVK_OTG_VBUS, 0); - } else if (board_is_mx53_evk_b()) { - /* MX53 EVK board ver B*/ - /* Enable OTG VBus with GPIO high */ - gpio_set_value(EVK_OTG_VBUS, 1); - } -} - -static void gpio_usbotg_vbus_inactive(void) -{ - if (board_is_mx53_arm2()) { - /* MX53 ARM2 CPU board */ - /* Disable OTG VBus with GPIO high */ - gpio_set_value(ARM2_OTG_VBUS, 1); - } else if (board_is_mx53_evk_a()) { - /* MX53 EVK board ver A*/ - /* Disable OTG VBus with GPIO high */ - gpio_set_value(EVK_OTG_VBUS, 1); - } else if (board_is_mx53_evk_b()) { - /* MX53 EVK board ver B*/ - /* Disable OTG VBus with GPIO low */ - gpio_set_value(EVK_OTG_VBUS, 0); - } -} - -static void mx53_gpio_usbotg_driver_vbus(bool on) -{ - if (on) - gpio_usbotg_vbus_active(); - else - gpio_usbotg_vbus_inactive(); -} - -static void mx53_gpio_host1_driver_vbus(bool on) -{ - if (on) - gpio_set_value(EVK_USBH1_VBUS, 1); - else - gpio_set_value(EVK_USBH1_VBUS, 0); -} - static void adv7180_pwdn(int pwdn) { - gpio_request(MX53_TVIN_PWR, "tvin-pwr"); - gpio_direction_output(MX53_TVIN_PWR, 0); + gpio_request(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), "gpio5_23"); + gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), 0); if (pwdn) - gpio_set_value(MX53_TVIN_PWR, 0); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), 0); else - gpio_set_value(MX53_TVIN_PWR, 1); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), 1); } static struct mxc_tvin_platform_data adv7180_data = { @@ -871,14 +379,13 @@ device_initcall(mxc_init_fb); static void camera_pwdn(int pwdn) { - gpio_request(MX53_TVIN_PWR, "tvin-pwr"); - gpio_direction_output(MX53_TVIN_PWR, 0); - gpio_set_value(MX53_TVIN_PWR, pwdn); + gpio_request(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), "gpio5_23"); + gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), 0); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), pwdn); } static struct mxc_camera_platform_data camera_data = { .analog_regulator = "VSD", - .gpo_regulator = "VVIDEO", .mclk = 24000000, .csi = 0, .pwdn = camera_pwdn, @@ -901,18 +408,6 @@ static struct i2c_board_info mxc_i2c0_board_info[] __initdata = { }, }; -static void sii9022_hdmi_reset(void) -{ - gpio_set_value(MX53_DVI_RESET, 0); - msleep(10); - gpio_set_value(MX53_DVI_RESET, 1); - msleep(10); -} - -static struct mxc_lcd_platform_data sii9022_hdmi_data = { - .reset = sii9022_hdmi_reset, -}; - /* TO DO add platform data */ static struct i2c_board_info mxc_i2c1_board_info[] __initdata = { { @@ -922,7 +417,7 @@ static struct i2c_board_info mxc_i2c1_board_info[] __initdata = { { .type = "tsc2007", .addr = 0x48, - .irq = IOMUX_TO_IRQ_V3(EVK_TS_INT), + .irq = IOMUX_TO_IRQ(MX53_PIN_EIM_A25), }, { .type = "backlight-i2c", @@ -936,11 +431,6 @@ static struct i2c_board_info mxc_i2c1_board_info[] __initdata = { .type = "eeprom", .addr = 0x50, }, - { - .type = "sii9022", - .addr = 0x39, - .platform_data = &sii9022_hdmi_data, - }, }; static struct mtd_partition mxc_dataflash_partitions[] = { @@ -978,9 +468,9 @@ static int sdhc_write_protect(struct device *dev) if (!board_is_mx53_arm2()) { if (to_platform_device(dev)->id == 0) - rc = gpio_get_value(EVK_SD1_WP); + rc = gpio_get_value(IOMUX_TO_GPIO(MX53_PIN_EIM_DA14)); else - rc = gpio_get_value(EVK_SD3_WP); + rc = gpio_get_value(IOMUX_TO_GPIO(MX53_PIN_EIM_DA12)); } return rc; @@ -991,14 +481,14 @@ static unsigned int sdhc_get_card_det_status(struct device *dev) int ret; if (board_is_mx53_arm2()) { if (to_platform_device(dev)->id == 0) - ret = gpio_get_value(ARM2_SD1_CD); + ret = gpio_get_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_1)); else ret = 1; } else { if (to_platform_device(dev)->id == 0) { - ret = gpio_get_value(EVK_SD1_CD); + ret = gpio_get_value(IOMUX_TO_GPIO(MX53_PIN_EIM_DA13)); } else{ /* config the det pin for SDHC3 */ - ret = gpio_get_value(EVK_SD3_CD); + ret = gpio_get_value(IOMUX_TO_GPIO(MX53_PIN_EIM_DA11)); } } @@ -1029,7 +519,6 @@ static struct mxc_mmc_platform_data mmc3_data = { .status = sdhc_get_card_det_status, .wp_status = sdhc_write_protect, .clock_mmc = "esdhc_clk", - .clk_always_on = 1, }; /* return value 1 failure, 0 success */ @@ -1195,7 +684,7 @@ return 0; static int headphone_det_status(void) { - return (gpio_get_value(MX53_HP_DETECT) == 0); + return (gpio_get_value(IOMUX_TO_GPIO(MX53_PIN_ATA_DATA5)) == 0); } static int mxc_sgtl5000_init(void); @@ -1204,7 +693,7 @@ static struct mxc_audio_platform_data sgtl5000_data = { .ssi_num = 1, .src_port = 2, .ext_port = 5, - .hp_irq = IOMUX_TO_IRQ(MX53_HP_DETECT), + .hp_irq = IOMUX_TO_IRQ(MX53_PIN_ATA_DATA5), .hp_status = headphone_det_status, .amp_enable = mxc_sgtl5000_amp_enable, .init = mxc_sgtl5000_init, @@ -1251,19 +740,23 @@ static struct mxc_mlb_platform_data mlb_data = { #ifdef CONFIG_MTD_PARTITIONS static struct mtd_partition nand_flash_partitions[] = { { - .name = "BOOT", + .name = "bootloader", .offset = 0, - .size = 7 * 1024 * 1024}, + .size = 3 * 1024 * 1024}, { - .name = "MISC", + .name = "nand.kernel", .offset = MTDPART_OFS_APPEND, - .size = 1 * 1024 * 1024}, + .size = 5 * 1024 * 1024}, { - .name = "RECOVERY", + .name = "nand.rootfs", .offset = MTDPART_OFS_APPEND, - .size = 20 * 1024 * 1024}, + .size = 256 * 1024 * 1024}, { - .name = "ROOT", + .name = "nand.userfs1", + .offset = MTDPART_OFS_APPEND, + .size = 256 * 1024 * 1024}, + { + .name = "nand.userfs2", .offset = MTDPART_OFS_APPEND, .size = MTDPART_SIZ_FULL}, }; @@ -1324,6 +817,7 @@ static struct platform_device mxc_alsa_surround_device = { }; static int __initdata mxc_apc_on = { 0 }; /* OFF: 0 (default), ON: 1 */ + static int __init apc_setup(char *__unused) { mxc_apc_on = 1; @@ -1332,48 +826,6 @@ static int __init apc_setup(char *__unused) } __setup("apc", apc_setup); -static int __initdata enable_w1 = { 0 }; -static int __init w1_setup(char *__unused) -{ - enable_w1 = 1; - return cpu_is_mx53(); -} -__setup("w1", w1_setup); - - -static int __initdata enable_spdif = { 0 }; -static int __init spdif_setup(char *__unused) -{ - enable_spdif = 1; - return 1; -} -__setup("spdif", spdif_setup); - -static struct android_pmem_platform_data android_pmem_pdata = { - .name = "pmem_adsp", - .start = 0, - .size = SZ_64M, - .no_allocator = 0, - .cached = PMEM_NONCACHE_NORMAL, -}; - -static struct android_pmem_platform_data android_pmem_gpu_pdata = { - .name = "pmem_gpu", - .start = 0, - .size = SZ_32M, - .no_allocator = 0, - .cached = PMEM_CACHE_ENABLE, -}; - -static struct android_usb_platform_data android_usb_pdata = { - .vendor_id = 0x0bb4, - .product_id = 0x0c01, - .adb_product_id = 0x0c02, - .version = 0x0100, - .product_name = "Android Phone", - .manufacturer_name = "Freescale", - .nluns = 3, -}; /*! * Board specific fixup function. It is called by \b setup_arch() in @@ -1396,38 +848,17 @@ static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags, int gpu_mem = SZ_128M; int fb_mem = SZ_32M; char *str; - int size; mxc_set_cpu_type(MXC_CPU_MX53); get_cpu_wp = mx53_evk_get_cpu_wp; set_num_cpu_wp = mx53_evk_set_num_cpu_wp; - for_each_tag(t, tags) { - if (t->hdr.tag != ATAG_MEM) - continue; - size = t->u.mem.size; - - android_pmem_pdata.start = - PHYS_OFFSET + size - android_pmem_pdata.size; - android_pmem_gpu_pdata.start = - android_pmem_pdata.start - android_pmem_gpu_pdata.size; - gpu_device.resource[5].start = - android_pmem_gpu_pdata.start - SZ_16M; - gpu_device.resource[5].end = - gpu_device.resource[5].start + SZ_16M - 1; - size -= android_pmem_pdata.size; - size -= android_pmem_gpu_pdata.size; - size -= SZ_16M; - t->u.mem.size = size; - } -#if 0 for_each_tag(mem_tag, tags) { if (mem_tag->hdr.tag == ATAG_MEM) { total_mem = mem_tag->u.mem.size; left_mem = total_mem - gpu_mem - fb_mem; break; - } } @@ -1479,142 +910,9 @@ static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags, } #endif } -#endif -} - -static void __init mx53_evk_io_init(void) -{ - mxc_iomux_v3_setup_multiple_pads(mx53common_pads, - ARRAY_SIZE(mx53common_pads)); - - if (board_is_mx53_arm2()) { - /* MX53 ARM2 CPU board */ - pr_info("MX53 ARM2 board \n"); - mxc_iomux_v3_setup_multiple_pads(mx53arm2_pads, - ARRAY_SIZE(mx53arm2_pads)); - - /* Config GPIO for OTG VBus */ - gpio_request(ARM2_OTG_VBUS, "otg-vbus"); - gpio_direction_output(ARM2_OTG_VBUS, 1); - - gpio_request(ARM2_SD1_CD, "sdhc1-cd"); - gpio_direction_input(ARM2_SD1_CD); /* SD1 CD */ - - gpio_request(ARM2_LCD_CONTRAST, "lcd-contrast"); - gpio_direction_output(ARM2_LCD_CONTRAST, 1); - } else { - /* MX53 EVK board */ - pr_info("MX53 EVK board \n"); - mxc_iomux_v3_setup_multiple_pads(mx53evk_pads, - ARRAY_SIZE(mx53evk_pads)); - - /* Host1 Vbus with GPIO high */ - gpio_request(EVK_USBH1_VBUS, "usbh1-vbus"); - gpio_direction_output(EVK_USBH1_VBUS, 1); - /* shutdown the Host1 Vbus when system bring up, - * Vbus will be opened in Host1 driver's probe function */ - gpio_set_value(EVK_USBH1_VBUS, 0); - - /* USB HUB RESET - De-assert USB HUB RESET_N */ - gpio_request(EVK_USB_HUB_RESET, "usb-hub-reset"); - gpio_direction_output(EVK_USB_HUB_RESET, 0); - msleep(1); - gpio_set_value(EVK_USB_HUB_RESET, 1); - - /* Config GPIO for OTG VBus */ - gpio_request(EVK_OTG_VBUS, "otg-vbus"); - gpio_direction_output(EVK_OTG_VBUS, 0); - if (board_is_mx53_evk_a()) /*rev A,"1" disable, "0" enable vbus*/ - gpio_set_value(EVK_OTG_VBUS, 1); - else if (board_is_mx53_evk_b()) /* rev B,"0" disable,"1" enable Vbus*/ - gpio_set_value(EVK_OTG_VBUS, 0); - - gpio_request(EVK_SD1_CD, "sdhc1-cd"); - gpio_direction_input(EVK_SD1_CD); /* SD1 CD */ - gpio_request(EVK_SD1_WP, "sdhc1-wp"); - gpio_direction_input(EVK_SD1_WP); /* SD1 WP */ - - /* SD3 CD */ - gpio_request(EVK_SD3_CD, "sdhc3-cd"); - gpio_direction_input(EVK_SD3_CD); - - /* SD3 WP */ - gpio_request(EVK_SD3_WP, "sdhc3-wp"); - gpio_direction_input(EVK_SD3_WP); - - /* reset FEC PHY */ - gpio_request(EVK_FEC_PHY_RESET, "fec-phy-reset"); - gpio_direction_output(EVK_FEC_PHY_RESET, 0); - msleep(1); - gpio_set_value(EVK_FEC_PHY_RESET, 1); - - gpio_request(MX53_ESAI_RESET, "fesai-reset"); - gpio_direction_output(MX53_ESAI_RESET, 0); - } - - /* DVI Detect */ - gpio_request(MX53_DVI_DETECT, "dvi-detect"); - gpio_direction_input(MX53_DVI_DETECT); - /* DVI Reset - Assert for i2c disabled mode */ - gpio_request(MX53_DVI_RESET, "dvi-reset"); - gpio_set_value(MX53_DVI_RESET, 0); - - /* DVI Power-down */ - gpio_request(MX53_DVI_PD, "dvi-pd"); - gpio_direction_output(MX53_DVI_PD, 1); - - /* DVI I2C enable */ - gpio_request(MX53_DVI_I2C, "dvi-i2c"); - gpio_direction_output(MX53_DVI_I2C, 0); - - mxc_iomux_v3_setup_multiple_pads(mx53_nand_pads, - ARRAY_SIZE(mx53_nand_pads)); - - gpio_request(MX53_PMIC_INT, "pmic-int"); - gpio_direction_input(MX53_PMIC_INT); /*PMIC_INT*/ - - /* headphone_det_b */ - gpio_request(MX53_HP_DETECT, "hp-detect"); - gpio_direction_input(MX53_HP_DETECT); - - /* power key */ - - /* LCD related gpio */ - - /* Camera reset */ - gpio_request(MX53_CAM_RESET, "cam-reset"); - gpio_direction_output(MX53_CAM_RESET, 1); - - /* TVIN reset */ - gpio_request(MX53_TVIN_RESET, "tvin-reset"); - gpio_direction_output(MX53_TVIN_RESET, 0); - msleep(5); - gpio_set_value(MX53_TVIN_RESET, 1); - - /* CAN1 enable GPIO*/ - gpio_request(MX53_CAN1_EN1, "can1-en1"); - gpio_direction_output(MX53_CAN1_EN1, 0); - - gpio_request(MX53_CAN1_EN2, "can1-en2"); - gpio_direction_output(MX53_CAN1_EN2, 0); - - /* CAN2 enable GPIO*/ - gpio_request(MX53_CAN2_EN1, "can2-en1"); - gpio_direction_output(MX53_CAN2_EN1, 0); - - gpio_request(MX53_CAN2_EN2, "can2-en2"); - gpio_direction_output(MX53_CAN2_EN2, 0); - - if (enable_spdif) { - struct pad_desc spdif_pin = MX53_PAD_GPIO_19__SPDIF_TX1; - mxc_iomux_v3_setup_pad(&spdif_pin); - } else { - /* GPIO for 12V */ - gpio_request(MX53_12V_EN, "12v-en"); - gpio_direction_output(MX53_12V_EN, 0); - } } - +extern void mx53_gpio_usbotg_driver_vbus(bool on); +extern void mx53_gpio_host1_driver_vbus(bool on); /*! * Board specific initialization. */ @@ -1627,17 +925,17 @@ static void __init mxc_board_init(void) /* SD card detect irqs */ if (board_is_mx53_arm2()) { - mxcsdhc1_device.resource[2].start = IOMUX_TO_IRQ_V3(ARM2_SD1_CD); - mxcsdhc1_device.resource[2].end = IOMUX_TO_IRQ_V3(ARM2_SD1_CD); + mxcsdhc1_device.resource[2].start = IOMUX_TO_IRQ(MX53_PIN_GPIO_1); + mxcsdhc1_device.resource[2].end = IOMUX_TO_IRQ(MX53_PIN_GPIO_1); mmc3_data.card_inserted_state = 1; mmc3_data.status = NULL; mmc3_data.wp_status = NULL; mmc1_data.wp_status = NULL; } else { - mxcsdhc3_device.resource[2].start = IOMUX_TO_IRQ_V3(EVK_SD3_CD); - mxcsdhc3_device.resource[2].end = IOMUX_TO_IRQ_V3(EVK_SD3_CD); - mxcsdhc1_device.resource[2].start = IOMUX_TO_IRQ_V3(EVK_SD1_CD); - mxcsdhc1_device.resource[2].end = IOMUX_TO_IRQ_V3(EVK_SD1_CD); + mxcsdhc3_device.resource[2].start = IOMUX_TO_IRQ(MX53_PIN_EIM_DA11); + mxcsdhc3_device.resource[2].end = IOMUX_TO_IRQ(MX53_PIN_EIM_DA11); + mxcsdhc1_device.resource[2].start = IOMUX_TO_IRQ(MX53_PIN_EIM_DA13); + mxcsdhc1_device.resource[2].end = IOMUX_TO_IRQ(MX53_PIN_EIM_DA13); } mxc_cpu_common_init(); @@ -1695,10 +993,7 @@ static void __init mxc_board_init(void) ARRAY_SIZE(mxc_i2c0_board_info)); i2c_register_board_info(1, mxc_i2c1_board_info, ARRAY_SIZE(mxc_i2c1_board_info)); - mxc_register_device(&mxc_android_pmem_device, &android_pmem_pdata); - mxc_register_device(&mxc_android_pmem_gpu_device, &android_pmem_gpu_pdata); - mxc_register_device(&android_usb_device, &android_usb_pdata); - mxc_register_device(&mxc_powerkey_device, NULL); + mx53_evk_init_mc13892(); /* pm_power_off = mxc_power_off; @@ -1715,8 +1010,6 @@ static void __init mxc_board_init(void) mxc_register_device(&mxc_alsa_surround_device, &mxc_surround_audio_data); } - mxc_register_device(&mxc_v4l2_device, NULL); - mxc_register_device(&mxc_v4l2out_device, NULL); } static void __init mx53_evk_timer_init(void) diff --git a/arch/arm/mach-mx5/mx53_evk_gpio.c b/arch/arm/mach-mx5/mx53_evk_gpio.c index 450280e2d96a..caeee73ea414 100644 --- a/arch/arm/mach-mx5/mx53_evk_gpio.c +++ b/arch/arm/mach-mx5/mx53_evk_gpio.c @@ -50,15 +50,21 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = { }, { MX53_PIN_EIM_D16, IOMUX_CONFIG_ALT4, + PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH, + MUX_IN_ECSPI1_IPP_CSPI_CLK_IN_SELECT_INPUT, + INPUT_CTL_PATH3, }, { MX53_PIN_EIM_D17, IOMUX_CONFIG_ALT4, + PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH, + MUX_IN_ECSPI1_IPP_IND_MISO_SELECT_INPUT, + INPUT_CTL_PATH3, }, { - MX53_PIN_EIM_D18, IOMUX_CONFIG_ALT2, - }, - { - MX53_PIN_EIM_D19, IOMUX_CONFIG_ALT2, + MX53_PIN_EIM_D18, IOMUX_CONFIG_ALT4, + PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH, + MUX_IN_ECSPI1_IPP_IND_MOSI_SELECT_INPUT, + INPUT_CTL_PATH3, }, { MX53_PIN_EIM_D20, IOMUX_CONFIG_ALT3, @@ -73,9 +79,6 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = { MX53_PIN_EIM_D26, IOMUX_CONFIG_GPIO, }, { - MX53_PIN_EIM_D28, IOMUX_CONFIG_ALT3, - }, - { MX53_PIN_EIM_D29, IOMUX_CONFIG_ALT3, }, { @@ -85,12 +88,6 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = { MX53_PIN_EIM_D31, IOMUX_CONFIG_ALT4, }, { - MX53_PIN_NANDF_CS2, IOMUX_CONFIG_ALT3, - }, - { - MX53_PIN_NANDF_CS3, IOMUX_CONFIG_ALT3, - }, - { MX53_PIN_ATA_BUFFER_EN, IOMUX_CONFIG_ALT3, (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST), @@ -166,31 +163,7 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = { MX53_PIN_KEY_ROW1, IOMUX_CONFIG_ALT2, }, { - MX53_PIN_KEY_COL2, IOMUX_CONFIG_ALT2, - }, - { - MX53_PIN_KEY_ROW2, IOMUX_CONFIG_ALT2, - }, - { - MX53_PIN_KEY_COL3, IOMUX_CONFIG_ALT4, - }, - { - MX53_PIN_KEY_COL4, IOMUX_CONFIG_ALT2, - }, - { - MX53_PIN_KEY_ROW4, IOMUX_CONFIG_ALT2, - }, - { - MX53_PIN_CSI0_D4, IOMUX_CONFIG_ALT5, - }, - { - MX53_PIN_CSI0_D6, IOMUX_CONFIG_ALT5, - }, - { - MX53_PIN_CSI0_D7, IOMUX_CONFIG_ALT5, - }, - { - MX53_PIN_CSI0_D9, IOMUX_CONFIG_ALT5, + MX53_PIN_CSI0_D7, IOMUX_CONFIG_ALT1, }, { /* UART1 Tx */ MX53_PIN_CSI0_D10, IOMUX_CONFIG_ALT2, @@ -205,19 +178,31 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = { INPUT_CTL_PATH1, }, { - MX53_PIN_GPIO_2, IOMUX_CONFIG_GPIO, + MX53_PIN_GPIO_2, IOMUX_CONFIG_ALT7, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | + PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | + PAD_CTL_360K_PD), + MUX_IN_MLB_MLBDAT_IN_SELECT_INPUT, + INPUT_CTL_PATH2, }, { - MX53_PIN_GPIO_3, IOMUX_CONFIG_GPIO, + MX53_PIN_GPIO_3, IOMUX_CONFIG_ALT7, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | + PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | + PAD_CTL_360K_PD), + MUX_IN_MLB_MLBCLK_IN_SELECT_INPUT, + INPUT_CTL_PATH2, }, { MX53_PIN_GPIO_4, IOMUX_CONFIG_GPIO, }, { - MX53_PIN_GPIO_5, IOMUX_CONFIG_GPIO, - }, - { - MX53_PIN_GPIO_6, IOMUX_CONFIG_GPIO, + MX53_PIN_GPIO_6, IOMUX_CONFIG_ALT7, + (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | + PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | + PAD_CTL_360K_PD), + MUX_IN_MLB_MLBSIG_IN_SELECT_INPUT, + INPUT_CTL_PATH2, }, { MX53_PIN_GPIO_7, IOMUX_CONFIG_GPIO, @@ -228,29 +213,79 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = { { MX53_PIN_GPIO_10, IOMUX_CONFIG_GPIO, }, - { - MX53_PIN_GPIO_11, IOMUX_CONFIG_GPIO, + { /* CAN1-TX */ + MX53_PIN_KEY_COL2, IOMUX_CONFIG_ALT2, + (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_PULL | PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_NONE), }, - { - MX53_PIN_GPIO_12, IOMUX_CONFIG_GPIO, + { /* CAN1-RX */ + MX53_PIN_KEY_ROW2, IOMUX_CONFIG_ALT2, + (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_PULL | PAD_CTL_360K_PD | PAD_CTL_ODE_OPENDRAIN_NONE), + MUX_IN_CAN1_IPP_IND_CANRX_SELECT_INPUT, + INPUT_CTL_PATH0, + }, + { /* CAN1 -- EN */ + MX53_PIN_GPIO_18, IOMUX_CONFIG_ALT1, + (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_PULL | PAD_CTL_360K_PD | PAD_CTL_ODE_OPENDRAIN_NONE), + }, + { /* CAN1 -- STBY */ + MX53_PIN_GPIO_17, IOMUX_CONFIG_ALT1, + (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_PULL | PAD_CTL_360K_PD | PAD_CTL_ODE_OPENDRAIN_NONE), + }, + { /* CAN1 -- NERR */ + MX53_PIN_GPIO_5, IOMUX_CONFIG_ALT1, + (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_PULL | PAD_CTL_360K_PD | PAD_CTL_ODE_OPENDRAIN_NONE), + MUX_IN_CAN2_IPP_IND_CANRX_SELECT_INPUT, + INPUT_CTL_PATH1, }, - { - MX53_PIN_GPIO_13, IOMUX_CONFIG_GPIO, + { /* CAN2-TX */ + MX53_PIN_KEY_COL4, IOMUX_CONFIG_ALT2, + (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_PULL | PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_NONE), }, - { - MX53_PIN_GPIO_14, IOMUX_CONFIG_GPIO, + { /* CAN2-RX */ + MX53_PIN_KEY_ROW4, IOMUX_CONFIG_ALT2, + (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_PULL | PAD_CTL_360K_PD | PAD_CTL_ODE_OPENDRAIN_NONE), + MUX_IN_CAN2_IPP_IND_CANRX_SELECT_INPUT, + INPUT_CTL_PATH0, + }, + { /* CAN2 -- EN */ + MX53_PIN_CSI0_D6, IOMUX_CONFIG_ALT1, + (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_PULL | PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_NONE), + }, + { /* CAN2 -- STBY */ + MX53_PIN_GPIO_14, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_PULL | PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_NONE), + }, + { /* CAN2 -- NERR */ + MX53_PIN_CSI0_D4, IOMUX_CONFIG_ALT1, + (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_PULL | PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_NONE), }, { - MX53_PIN_GPIO_16, IOMUX_CONFIG_ALT1, + MX53_PIN_GPIO_11, IOMUX_CONFIG_GPIO, + }, + { /* ESAI reset */ + MX53_PIN_GPIO_12, IOMUX_CONFIG_ALT0, + (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_PULL | PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_ENABLE | + PAD_CTL_SRE_FAST), }, { - MX53_PIN_GPIO_17, IOMUX_CONFIG_GPIO, + MX53_PIN_GPIO_13, IOMUX_CONFIG_GPIO, }, { - MX53_PIN_GPIO_18, IOMUX_CONFIG_GPIO, + MX53_PIN_GPIO_16, IOMUX_CONFIG_ALT1, }, { - MX53_PIN_GPIO_19, IOMUX_CONFIG_ALT3, + MX53_PIN_GPIO_19, IOMUX_CONFIG_ALT1, }, { /* DI0 display clock */ MX53_PIN_DI0_DISP_CLK, IOMUX_CONFIG_ALT0, @@ -392,6 +427,36 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = { (PAD_CTL_HYS_NONE | PAD_CTL_PKE_NONE | PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_HIGH | PAD_CTL_SRE_SLOW), }, + { + MX53_PIN_LVDS0_TX3_P, IOMUX_CONFIG_ALT1, + }, + { + MX53_PIN_LVDS0_CLK_P, IOMUX_CONFIG_ALT1, + }, + { + MX53_PIN_LVDS0_TX2_P, IOMUX_CONFIG_ALT1, + }, + { + MX53_PIN_LVDS0_TX1_P, IOMUX_CONFIG_ALT1, + }, + { + MX53_PIN_LVDS0_TX0_P, IOMUX_CONFIG_ALT1, + }, + { + MX53_PIN_LVDS1_TX3_P, IOMUX_CONFIG_ALT1, + }, + { + MX53_PIN_LVDS1_CLK_P, IOMUX_CONFIG_ALT1, + }, + { + MX53_PIN_LVDS1_TX2_P, IOMUX_CONFIG_ALT1, + }, + { + MX53_PIN_LVDS1_TX1_P, IOMUX_CONFIG_ALT1, + }, + { + MX53_PIN_LVDS1_TX0_P, IOMUX_CONFIG_ALT1, + }, { /* audio and CSI clock out */ MX53_PIN_GPIO_0, IOMUX_CONFIG_ALT3, }, @@ -450,68 +515,100 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = { /* esdhc1 */ { MX53_PIN_SD1_CMD, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, - (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX53_PIN_SD1_CLK, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION, - (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_ENABLE + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX53_PIN_SD1_DATA0, IOMUX_CONFIG_ALT0, - (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX53_PIN_SD1_DATA1, IOMUX_CONFIG_ALT0, - (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX53_PIN_SD1_DATA2, IOMUX_CONFIG_ALT0, - (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX53_PIN_SD1_DATA3, IOMUX_CONFIG_ALT0, - (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, /* esdhc3 */ { MX53_PIN_ATA_DATA0, IOMUX_CONFIG_ALT4, - (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX53_PIN_ATA_DATA1, IOMUX_CONFIG_ALT4, - (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX53_PIN_ATA_DATA2, IOMUX_CONFIG_ALT4, - (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX53_PIN_ATA_DATA3, IOMUX_CONFIG_ALT4, - (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX53_PIN_ATA_DATA8, IOMUX_CONFIG_ALT4, - (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX53_PIN_ATA_DATA9, IOMUX_CONFIG_ALT4, - (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX53_PIN_ATA_DATA10, IOMUX_CONFIG_ALT4, - (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX53_PIN_ATA_DATA11, IOMUX_CONFIG_ALT4, - (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX53_PIN_ATA_IORDY, IOMUX_CONFIG_ALT2, - (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_ENABLE + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { MX53_PIN_ATA_RESET_B, IOMUX_CONFIG_ALT2, - (PAD_CTL_DRV_HIGH | PAD_CTL_75k_PU | PAD_CTL_SRE_FAST), + (PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH + | PAD_CTL_22K_PU | PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE + | PAD_CTL_SRE_FAST), }, { /* FEC pins */ MX53_PIN_FEC_MDIO, IOMUX_CONFIG_ALT0, @@ -556,6 +653,38 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = { MX53_PIN_FEC_MDC, IOMUX_CONFIG_ALT0, PAD_CTL_DRV_HIGH, }, + { /* I2C1 SDA */ + MX53_PIN_CSI0_D8, IOMUX_CONFIG_ALT5 | IOMUX_CONFIG_SION, + (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE | + PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU | + PAD_CTL_HYS_ENABLE), + MUX_IN_I2C1_IPP_SDA_IN_SELECT_INPUT, + INPUT_CTL_PATH0, + }, + { /* I2C1 SCL */ + MX53_PIN_CSI0_D9, IOMUX_CONFIG_ALT5 | IOMUX_CONFIG_SION, + (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE | + PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU | + PAD_CTL_HYS_ENABLE), + MUX_IN_I2C1_IPP_SCL_IN_SELECT_INPUT, + INPUT_CTL_PATH0, + }, + { /* I2C2 SDA */ + MX53_PIN_KEY_ROW3, IOMUX_CONFIG_ALT4 | IOMUX_CONFIG_SION, + (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE | + PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU | + PAD_CTL_HYS_ENABLE), + MUX_IN_I2C2_IPP_SDA_IN_SELECT_INPUT, + INPUT_CTL_PATH0, + }, + { /* I2C1 SCL */ + MX53_PIN_KEY_COL3, IOMUX_CONFIG_ALT4 | IOMUX_CONFIG_SION, + (PAD_CTL_SRE_FAST | PAD_CTL_ODE_OPENDRAIN_ENABLE | + PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU | + PAD_CTL_HYS_ENABLE), + MUX_IN_I2C2_IPP_SCL_IN_SELECT_INPUT, + INPUT_CTL_PATH0, + }, }; static struct mxc_iomux_pin_cfg __initdata mx53_evk_iomux_pins[] = { @@ -631,11 +760,87 @@ static int __initdata enable_w1 = { 0 }; static int __init w1_setup(char *__unused) { enable_w1 = 1; - return 1; + return cpu_is_mx53(); } __setup("w1", w1_setup); +static struct mxc_iomux_pin_cfg __initdata nand_iomux_pins[] = { + { + MX53_PIN_NANDF_CS0, IOMUX_CONFIG_ALT0, PAD_CTL_DRV_HIGH, + }, + { + MX53_PIN_NANDF_CS1, IOMUX_CONFIG_ALT0, PAD_CTL_DRV_HIGH, + }, + { + MX53_PIN_NANDF_CS2, IOMUX_CONFIG_ALT0, PAD_CTL_DRV_HIGH, + }, + { + MX53_PIN_NANDF_CS3, IOMUX_CONFIG_ALT0, PAD_CTL_DRV_HIGH, + }, + { + MX53_PIN_NANDF_RB0, IOMUX_CONFIG_ALT0, + PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_100K_PU, + }, + { + MX53_PIN_NANDF_CLE, IOMUX_CONFIG_ALT0, PAD_CTL_DRV_HIGH, + }, + { + MX53_PIN_NANDF_ALE, IOMUX_CONFIG_ALT0, PAD_CTL_DRV_HIGH, + }, + { + MX53_PIN_NANDF_WP_B, IOMUX_CONFIG_ALT0, + PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_100K_PU, + }, + { + MX53_PIN_NANDF_RE_B, IOMUX_CONFIG_ALT0, PAD_CTL_DRV_HIGH, + }, + { + MX53_PIN_NANDF_WE_B, IOMUX_CONFIG_ALT0, PAD_CTL_DRV_HIGH, + }, + { + MX53_PIN_EIM_DA0, IOMUX_CONFIG_ALT0, + PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH, + }, + { + MX53_PIN_EIM_DA1, IOMUX_CONFIG_ALT0, + PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH, + }, + { + MX53_PIN_EIM_DA2, IOMUX_CONFIG_ALT0, + PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH, + }, + { + MX53_PIN_EIM_DA3, IOMUX_CONFIG_ALT0, + PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH, + }, + { + MX53_PIN_EIM_DA4, IOMUX_CONFIG_ALT0, + PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH, + }, + { + MX53_PIN_EIM_DA5, IOMUX_CONFIG_ALT0, + PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH, + }, + { + MX53_PIN_EIM_DA6, IOMUX_CONFIG_ALT0, + PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH, + }, + { + MX53_PIN_EIM_DA7, IOMUX_CONFIG_ALT0, + PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH, + }, +}; + +static int __initdata enable_spdif = { 0 }; +static int __init spdif_setup(char *__unused) +{ + enable_spdif = 1; + return 1; +} + +__setup("spdif", spdif_setup); + void __init mx53_evk_io_init(void) { int i; @@ -665,12 +870,12 @@ void __init mx53_evk_io_init(void) mx53_arm2_iomux_pins[i].in_mode); } - /* Enable OTG VBus with GPIO low */ + /* Config GPIO for OTG VBus */ mxc_iomux_set_pad(MX53_PIN_EIM_D22, PAD_CTL_DRV_HIGH | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST); gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_D22), "gpio3_22"); gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_EIM_D22), 0); - gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_D22), 0); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_D22), 1); gpio_request(IOMUX_TO_GPIO(MX53_PIN_GPIO_1), "gpio1_1"); gpio_direction_input(IOMUX_TO_GPIO(MX53_PIN_GPIO_1)); /* SD1 CD */ @@ -696,6 +901,9 @@ void __init mx53_evk_io_init(void) PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST); gpio_request(IOMUX_TO_GPIO(MX53_PIN_ATA_DA_2), "gpio7_8"); gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_ATA_DA_2), 1); + /* shutdown the Host1 Vbus when system bring up, + * Vbus will be opened in Host1 driver's probe function */ + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_ATA_DA_2), 0); /* USB HUB RESET - De-assert USB HUB RESET_N */ mxc_iomux_set_pad(MX53_PIN_CSI0_DATA_EN, PAD_CTL_DRV_HIGH | @@ -708,12 +916,16 @@ void __init mx53_evk_io_init(void) msleep(1); gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_DATA_EN), 1); - /* Enable OTG VBus with GPIO low */ + /* Config GPIO for OTG VBus */ mxc_iomux_set_pad(MX53_PIN_EIM_A23, PAD_CTL_DRV_HIGH | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST); gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_A23), "gpio6_6"); gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_EIM_A23), 0); - gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_A23), 0); + + if (board_is_mx53_evk_a()) /*rev A,"1" disable, "0" enable vbus*/ + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_A23), 1); + else if (board_is_mx53_evk_b()) /* rev B,"0" disable,"1" enable Vbus*/ + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_A23), 0); gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_DA13), "gpio3_13"); gpio_direction_input(IOMUX_TO_GPIO(MX53_PIN_EIM_DA13)); /* SD1 CD */ @@ -735,70 +947,42 @@ void __init mx53_evk_io_init(void) msleep(1); gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_ATA_DA_0), 1); - /* DVI Detect */ - gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_D31), "gpio3_31"); - gpio_direction_input(IOMUX_TO_GPIO(MX53_PIN_EIM_D31)); - /* DVI Reset - Assert for i2c disabled mode */ - gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_WAIT), "gpio5_0"); - gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_WAIT), 0); - gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_EIM_WAIT), 0); - /* DVI Power-down */ - gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_D24), "gpio3_24"); - gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_EIM_D24), 0); - gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_D24), 1); - /* DVI I2C enable */ - gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_D28), "gpio3_28"); - gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_EIM_D28), 0); - gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_D28), 0); + /* CS42888 reset GPIO */ + gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_GPIO_12), 0); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_12), 0); + } + /* DVI Detect */ + gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_D31), "gpio3_31"); + gpio_direction_input(IOMUX_TO_GPIO(MX53_PIN_EIM_D31)); + /* DVI Reset - Assert for i2c disabled mode */ + gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_WAIT), "gpio5_0"); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_WAIT), 0); + gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_EIM_WAIT), 0); + /* DVI Power-down */ + gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_D24), "gpio3_24"); + gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_EIM_D24), 0); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_D24), 1); + /* DVI I2C enable */ + gpio_request(IOMUX_TO_GPIO(MX53_PIN_EIM_D28), "gpio3_28"); + gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_EIM_D28), 0); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_D28), 0); + + for (i = 0; i < ARRAY_SIZE(nand_iomux_pins); i++) { + mxc_request_iomux(nand_iomux_pins[i].pin, + nand_iomux_pins[i].mux_mode); + if (nand_iomux_pins[i].pad_cfg) + mxc_iomux_set_pad(nand_iomux_pins[i].pin, + nand_iomux_pins[i].pad_cfg); + if (nand_iomux_pins[i].in_select) + mxc_iomux_set_input(nand_iomux_pins[i].in_select, + nand_iomux_pins[i].in_mode); + } gpio_request(IOMUX_TO_GPIO(MX53_PIN_GPIO_16), "gpio7_11"); gpio_direction_input(IOMUX_TO_GPIO(MX53_PIN_GPIO_16)); /*PMIC_INT*/ - - /* i2c1 SDA */ - mxc_request_iomux(MX53_PIN_CSI0_D8, - IOMUX_CONFIG_ALT5 | IOMUX_CONFIG_SION); - mxc_iomux_set_input(MUX_IN_I2C1_IPP_SDA_IN_SELECT_INPUT, - INPUT_CTL_PATH0); - mxc_iomux_set_pad(MX53_PIN_CSI0_D8, PAD_CTL_SRE_FAST | - PAD_CTL_ODE_OPENDRAIN_ENABLE | - PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU | - PAD_CTL_HYS_ENABLE); - - /* i2c1 SCL */ - mxc_request_iomux(MX53_PIN_CSI0_D9, - IOMUX_CONFIG_ALT5 | IOMUX_CONFIG_SION); - mxc_iomux_set_input(MUX_IN_I2C1_IPP_SCL_IN_SELECT_INPUT, - INPUT_CTL_PATH0); - mxc_iomux_set_pad(MX53_PIN_CSI0_D9, PAD_CTL_SRE_FAST | - PAD_CTL_ODE_OPENDRAIN_ENABLE | - PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU | - PAD_CTL_HYS_ENABLE); - - /* i2c2 SDA */ - mxc_request_iomux(MX53_PIN_KEY_ROW3, - IOMUX_CONFIG_ALT4 | IOMUX_CONFIG_SION); - mxc_iomux_set_input(MUX_IN_I2C2_IPP_SDA_IN_SELECT_INPUT, - INPUT_CTL_PATH0); - mxc_iomux_set_pad(MX53_PIN_KEY_ROW3, - PAD_CTL_SRE_FAST | - PAD_CTL_ODE_OPENDRAIN_ENABLE | - PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU | - PAD_CTL_HYS_ENABLE); - - /* i2c2 SCL */ - mxc_request_iomux(MX53_PIN_KEY_COL3, - IOMUX_CONFIG_ALT4 | IOMUX_CONFIG_SION); - mxc_iomux_set_input(MUX_IN_I2C2_IPP_SCL_IN_SELECT_INPUT, - INPUT_CTL_PATH0); - mxc_iomux_set_pad(MX53_PIN_KEY_COL3, - PAD_CTL_SRE_FAST | - PAD_CTL_ODE_OPENDRAIN_ENABLE | - PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU | - PAD_CTL_HYS_ENABLE); - /* headphone_det_b */ mxc_request_iomux(MX53_PIN_ATA_DATA5, IOMUX_CONFIG_GPIO); mxc_iomux_set_pad(MX53_PIN_ATA_DATA5, PAD_CTL_100K_PU); @@ -814,36 +998,82 @@ void __init mx53_evk_io_init(void) gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_GPIO_10), 0); gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_10), 1); - /* Camera low power */ - gpio_request(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), "gpio5_23"); - gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), 0); - gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_D5), 0); + /* TVIN reset */ + gpio_request(IOMUX_TO_GPIO(MX53_PIN_CSI0_D7), "gpio5_25"); + gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_CSI0_D7), 0); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_D7), 0); + msleep(5); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_D7), 1); + + /* CAN1 enable GPIO*/ + gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_GPIO_18), 0); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_18), 0); + gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_GPIO_17), 0); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_17), 0); + + /* CAN2 enable GPIO*/ + gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_CSI0_D6), 0); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_D6), 0); + gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_GPIO_14), 0); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_14), 0); + + if (enable_spdif) { + mxc_free_iomux(MX53_PIN_GPIO_19, IOMUX_CONFIG_ALT1); + mxc_request_iomux(MX53_PIN_GPIO_19, IOMUX_CONFIG_ALT3); + mxc_iomux_set_pad(MX53_PIN_GPIO_19, + PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | + PAD_CTL_PUE_PULL | PAD_CTL_100K_PU | + PAD_CTL_PKE_ENABLE); + } else { + /* GPIO for CAN 12V */ + gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_GPIO_19), 0); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_19), 0); + } } /* workaround for ecspi chipselect pin may not keep correct level when idle */ void mx53_evk_gpio_spi_chipselect_active(int cspi_mode, int status, int chipselect) { - u32 gpio; - switch (cspi_mode) { case 1: switch (chipselect) { case 0x1: - mxc_request_iomux(MX53_PIN_EIM_D19, - IOMUX_CONFIG_ALT4); + /* de-select SS1 of instance: ecspi1. */ + mxc_request_iomux(MX53_PIN_EIM_D19, IOMUX_CONFIG_ALT1); mxc_iomux_set_pad(MX53_PIN_EIM_D19, PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | - PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST); + PAD_CTL_PUE_PULL | + PAD_CTL_100K_PU | + PAD_CTL_DRV_HIGH); + + /* mux mode: ALT4 mux port: SS0 of instance: ecspi1. */ + mxc_request_iomux(MX53_PIN_EIM_EB2, IOMUX_CONFIG_ALT4); + mxc_iomux_set_pad(MX53_PIN_EIM_EB2, + PAD_CTL_HYS_ENABLE | + PAD_CTL_DRV_HIGH); + mxc_iomux_set_input( + MUX_IN_ECSPI1_IPP_IND_SS_B_1_SELECT_INPUT, + INPUT_CTL_PATH3); break; case 0x2: - gpio = IOMUX_TO_GPIO(MX53_PIN_EIM_D19); - mxc_request_iomux(MX53_PIN_EIM_D19, - IOMUX_CONFIG_GPIO); - gpio_request(gpio, "cspi1_ss1"); - gpio_direction_output(gpio, 0); - gpio_set_value(gpio, 1 & (~status)); + /* de-select SS0 of instance: ecspi1. */ + mxc_request_iomux(MX53_PIN_EIM_EB2, IOMUX_CONFIG_ALT1); + mxc_iomux_set_pad(MX53_PIN_EIM_EB2, + PAD_CTL_HYS_ENABLE | + PAD_CTL_PKE_ENABLE | + PAD_CTL_PUE_PULL | + PAD_CTL_100K_PU | + PAD_CTL_DRV_HIGH); + mxc_request_iomux(MX53_PIN_EIM_D19, IOMUX_CONFIG_ALT4); + mxc_iomux_set_pad(MX53_PIN_EIM_D19, + PAD_CTL_HYS_ENABLE | + PAD_CTL_DRV_HIGH); + mxc_iomux_set_input( + MUX_IN_ECSPI1_IPP_IND_SS_B_1_SELECT_INPUT, + INPUT_CTL_PATH3); + break; default: break; @@ -870,9 +1100,14 @@ void mx53_evk_gpio_spi_chipselect_inactive(int cspi_mode, int status, mxc_request_iomux(MX53_PIN_EIM_D19, IOMUX_CONFIG_GPIO); mxc_free_iomux(MX53_PIN_EIM_D19, IOMUX_CONFIG_GPIO); + mxc_free_iomux(MX53_PIN_EIM_EB2, IOMUX_CONFIG_ALT4); break; case 0x2: - mxc_free_iomux(MX53_PIN_EIM_D19, IOMUX_CONFIG_GPIO); + mxc_free_iomux(MX53_PIN_EIM_EB2, IOMUX_CONFIG_ALT4); + mxc_request_iomux(MX53_PIN_EIM_EB2, + IOMUX_CONFIG_GPIO); + mxc_free_iomux(MX53_PIN_EIM_EB2, IOMUX_CONFIG_GPIO); + mxc_free_iomux(MX53_PIN_EIM_D19, IOMUX_CONFIG_ALT4); break; default: break; @@ -888,8 +1123,201 @@ void mx53_evk_gpio_spi_chipselect_inactive(int cspi_mode, int status, } EXPORT_SYMBOL(mx53_evk_gpio_spi_chipselect_inactive); +void flexcan_xcvr_enable(int id, int en) +{ + static int pwdn; + if (id < 0 || id > 1) + return; + + if (en) { + if (!(pwdn++)) + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_19), 1); + + if (id == 0) { + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_18), 1); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_17), 1); + } else { + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_D6), 1); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_14), 1); + } + + } else { + if (!(--pwdn)) + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_19), 0); + + if (id == 0) { + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_18), 0); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_17), 0); + } else { + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_CSI0_D6), 0); + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_14), 0); + } + } +} +EXPORT_SYMBOL(flexcan_xcvr_enable); + void gpio_lcd_active(void) { /* TO DO */ } EXPORT_SYMBOL(gpio_lcd_active); + +void gpio_activate_esai_ports(void) +{ + unsigned int pad_val; + + /* ESAI1-HCKR */ + mxc_request_iomux(MX53_PIN_FEC_RX_ER, IOMUX_CONFIG_ALT2); + /* ESAI1-SCKR */ + mxc_request_iomux(MX53_PIN_FEC_MDIO, IOMUX_CONFIG_ALT2); + /* ESAI1-FSR */ + mxc_request_iomux(MX53_PIN_FEC_REF_CLK, IOMUX_CONFIG_ALT2); + /* ESAI1-HCKT */ + mxc_request_iomux(MX53_PIN_FEC_RXD0, IOMUX_CONFIG_ALT2); + /* ESAI1-SCKT */ + mxc_request_iomux(MX53_PIN_FEC_CRS_DV, IOMUX_CONFIG_ALT2); + /* ESAI1-FST */ + mxc_request_iomux(MX53_PIN_FEC_RXD1, IOMUX_CONFIG_ALT2); + /* ESAI1-TX5-RX0 */ + mxc_request_iomux(MX53_PIN_FEC_MDC, IOMUX_CONFIG_ALT2); + /* ESAI1-TX4-RX1 */ + mxc_request_iomux(MX53_PIN_FEC_TXD0, IOMUX_CONFIG_ALT2); + /* ESAI1-TX3-RX2 */ + mxc_request_iomux(MX53_PIN_FEC_TX_EN, IOMUX_CONFIG_ALT2); + /* ESAI1-TX2-RX3 */ + mxc_request_iomux(MX53_PIN_FEC_TXD1, IOMUX_CONFIG_ALT2); + /* ESAI1-TX1 */ + mxc_request_iomux(MX53_PIN_NANDF_CS3, IOMUX_CONFIG_ALT3); + /* ESAI1-TX0 */ + mxc_request_iomux(MX53_PIN_NANDF_CS2, IOMUX_CONFIG_ALT3); + + pad_val = PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE | + PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | + PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_NONE; + + /* ESAI1-HCKR */ + mxc_iomux_set_pad(MX53_PIN_FEC_RX_ER, pad_val); + /* ESAI1-SCKR */ + mxc_iomux_set_pad(MX53_PIN_FEC_MDIO, pad_val); + /* ESAI1-FSR */ + mxc_iomux_set_pad(MX53_PIN_FEC_REF_CLK, pad_val); + /* ESAI1-HCKT */ + mxc_iomux_set_pad(MX53_PIN_FEC_RXD0, pad_val); + /* ESAI1-SCKT */ + mxc_iomux_set_pad(MX53_PIN_FEC_CRS_DV, pad_val); + /* ESAI1-FST */ + mxc_iomux_set_pad(MX53_PIN_FEC_RXD1, pad_val); + /* ESAI1-TX5-RX0 */ + mxc_iomux_set_pad(MX53_PIN_FEC_MDC, pad_val); + /* ESAI1-TX4-RX1 */ + mxc_iomux_set_pad(MX53_PIN_FEC_TXD0, pad_val); + /* ESAI1-TX3-RX2 */ + mxc_iomux_set_pad(MX53_PIN_FEC_TX_EN, pad_val); + /* ESAI1-TX2-RX3 */ + mxc_iomux_set_pad(MX53_PIN_FEC_TXD1, pad_val); + /* ESAI1-TX1 */ + mxc_iomux_set_pad(MX53_PIN_NANDF_CS3, pad_val); + /* ESAI1-TX0 */ + mxc_iomux_set_pad(MX53_PIN_NANDF_CS2, pad_val); + + /* ESAI1-HCKR */ + mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_HCKR_SELECT_INPUT, + INPUT_CTL_PATH0); + /* ESAI1-SCKR */ + mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_SCKR_SELECT_INPUT, + INPUT_CTL_PATH0); + /* ESAI1-FSR */ + mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_FSR_SELECT_INPUT, + INPUT_CTL_PATH0); + /* ESAI1-HCKT */ + mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_HCKT_SELECT_INPUT, + INPUT_CTL_PATH0); + /* ESAI1-SCKT */ + mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_SCKT_SELECT_INPUT, + INPUT_CTL_PATH0); + /* ESAI1-FST */ + mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_FST_SELECT_INPUT, + INPUT_CTL_PATH0); + /* ESAI1-TX5-RX0 */ + mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_SDO5_SDI0_SELECT_INPUT, + INPUT_CTL_PATH0); + /* ESAI1-TX4-RX1 */ + mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_SDO4_SDI1_SELECT_INPUT, + INPUT_CTL_PATH0); + /* ESAI1-TX3-RX2 */ + mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_SDO3_SDI2_SELECT_INPUT, + INPUT_CTL_PATH0); + /* ESAI1-TX2-RX3 */ + mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_SDO2_SDI3_SELECT_INPUT, + INPUT_CTL_PATH0); + /* ESAI1-TX1 */ + mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_SDO1_SELECT_INPUT, + INPUT_CTL_PATH0); + /* ESAI1-TX0 */ + mxc_iomux_set_input(MUX_IN_ESAI1_IPP_IND_SDO0_SELECT_INPUT, + INPUT_CTL_PATH0); + +} +EXPORT_SYMBOL(gpio_activate_esai_ports); + +void gpio_cs42888_pdwn(int pdwn) +{ + if (pdwn) + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_12), 0); + else + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_12), 1); +} +EXPORT_SYMBOL(gpio_cs42888_pdwn); + +static void gpio_usbotg_vbus_active(void) +{ + if (board_is_mx53_arm2()) { + /* MX53 ARM2 CPU board */ + /* Enable OTG VBus with GPIO low */ + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_D22), 0); + } else if (board_is_mx53_evk_a()) { + /* MX53 EVK board ver A*/ + /* Enable OTG VBus with GPIO low */ + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_A23), 0); + } else if (board_is_mx53_evk_b()) { + /* MX53 EVK board ver B*/ + /* Enable OTG VBus with GPIO high */ + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_A23), 1); + } +} + +static void gpio_usbotg_vbus_inactive(void) +{ + if (board_is_mx53_arm2()) { + /* MX53 ARM2 CPU board */ + /* Disable OTG VBus with GPIO high */ + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_D22), 1); + } else if (board_is_mx53_evk_a()) { + /* MX53 EVK board ver A*/ + /* Disable OTG VBus with GPIO high */ + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_A23), 1); + } else if (board_is_mx53_evk_b()) { + /* MX53 EVK board ver B*/ + /* Disable OTG VBus with GPIO low */ + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_EIM_A23), 0); + } +} + + +void mx53_gpio_usbotg_driver_vbus(bool on) +{ + if (on) + gpio_usbotg_vbus_active(); + else + gpio_usbotg_vbus_inactive(); +} +EXPORT_SYMBOL(mx53_gpio_usbotg_driver_vbus); + +void mx53_gpio_host1_driver_vbus(bool on) +{ + if (on) + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_ATA_DA_2), 1); + else + gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_ATA_DA_2), 0); +} +EXPORT_SYMBOL(mx53_gpio_host1_driver_vbus); diff --git a/arch/arm/mach-mx5/mx53_evk_pmic_mc13892.c b/arch/arm/mach-mx5/mx53_evk_pmic_mc13892.c index be5f850fcf97..f8ec651cd459 100644 --- a/arch/arm/mach-mx5/mx53_evk_pmic_mc13892.c +++ b/arch/arm/mach-mx5/mx53_evk_pmic_mc13892.c @@ -23,8 +23,8 @@ #include <linux/regulator/machine.h> #include <linux/mfd/mc13892/core.h> #include <mach/irqs.h> - -#include <mach/iomux-mx53.h> +#include "iomux.h" +#include "mx53_pins.h" /* * Convenience conversion. @@ -183,8 +183,6 @@ static struct regulator_init_data vvideo_init = { .min_uV = mV_to_uV(2500), .max_uV = mV_to_uV(2775), .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE, - .always_on = 1, - .boot_on = 1, } }; @@ -268,7 +266,7 @@ static struct regulator_init_data gpo4_init = { .name = "GPO4", } }; -#if 0 + /*! * the event handler for power on event */ @@ -276,20 +274,20 @@ static void power_on_evt_handler(void) { pr_info("pwr on event1 is received \n"); } -#endif + static int mc13892_regulator_init(struct mc13892 *mc13892) { unsigned int value; -// pmic_event_callback_t power_key_event; + pmic_event_callback_t power_key_event; int register_mask; pr_info("Initializing regulators for MX53 EVK \n"); -#if 0 + /* subscribe PWRON1 event to enable ON_OFF key */ power_key_event.param = NULL; power_key_event.func = (void *)power_on_evt_handler; pmic_event_subscribe(EVENT_PWRONI, power_key_event); -#endif + /* Bit 4 DRM: keep VSRTC and CLK32KMCU on for all states */ #if defined(CONFIG_RTC_DRV_MXC_V2) || defined(CONFIG_RTC_DRV_MXC_V2_MODULE) value = BITFVAL(DRM, 1); @@ -339,7 +337,7 @@ static struct mc13892_platform_data mc13892_plat = { static struct i2c_board_info __initdata mc13892_i2c_device = { I2C_BOARD_INFO("mc13892", 0x08), - .irq = IOMUX_TO_IRQ_V3(203), + .irq = IOMUX_TO_IRQ(MX53_PIN_GPIO_16), .platform_data = &mc13892_plat, }; diff --git a/arch/arm/mach-mx5/pm.c b/arch/arm/mach-mx5/pm.c index b2bf2f8355fd..2839bffeda62 100644 --- a/arch/arm/mach-mx5/pm.c +++ b/arch/arm/mach-mx5/pm.c @@ -29,10 +29,6 @@ #define MXC_SRPG_EMPGC0_SRPGCR (IO_ADDRESS(GPC_BASE_ADDR) + 0x2C0) #define MXC_SRPG_EMPGC1_SRPGCR (IO_ADDRESS(GPC_BASE_ADDR) + 0x2D0) -#define DATABAHN_CTL_REG0 0 -#define DATABAHN_CTL_REG19 0x4c -#define DATABAHN_CTL_REG79 0x13c -#define DATABAHN_PHY_REG25 0x264 static struct cpu_wp *cpu_wp_tbl; static struct clk *cpu_clk; @@ -47,17 +43,16 @@ extern int set_cpu_freq(int wp); static struct device *pm_dev; struct clk *gpc_dvfs_clk; extern void cpu_do_suspend_workaround(u32 sdclk_iomux_addr); -extern void mx50_suspend(u32 databahn_addr); +extern void cpu_cortexa8_do_idle(void *); extern struct cpu_wp *(*get_cpu_wp)(int *wp); -extern void __iomem *databahn_base; extern int iram_ready; void *suspend_iram_base; void (*suspend_in_iram)(void *sdclk_iomux_addr) = NULL; -void __iomem *suspend_param1; -static int mx5_suspend_enter(suspend_state_t state) +static int mx51_suspend_enter(suspend_state_t state) { + void __iomem *sdclk_iomux_addr = IO_ADDRESS(IOMUXC_BASE_ADDR + 0x4b8); u32 * wake_src; /* Check that we have a wake up source. We don't want to suspend if not.*/ @@ -89,15 +84,12 @@ static int mx5_suspend_enter(suspend_state_t state) local_flush_tlb_all(); flush_cache_all(); - if (cpu_is_mx51() || cpu_is_mx53()) { - /* Run the suspend code from iRAM. */ - suspend_in_iram(suspend_param1); + /* Run the suspend code from iRAM. */ + suspend_in_iram(sdclk_iomux_addr); - /*clear the EMPGC0/1 bits */ - __raw_writel(0, MXC_SRPG_EMPGC0_SRPGCR); - __raw_writel(0, MXC_SRPG_EMPGC1_SRPGCR); - } else - suspend_in_iram(databahn_base); + /*clear the EMPGC0/1 bits */ + __raw_writel(0, MXC_SRPG_EMPGC0_SRPGCR); + __raw_writel(0, MXC_SRPG_EMPGC1_SRPGCR); } else { cpu_do_idle(); } @@ -109,7 +101,7 @@ static int mx5_suspend_enter(suspend_state_t state) /* * Called after processes are frozen, but before we shut down devices. */ -static int mx5_suspend_prepare(void) +static int mx51_suspend_prepare(void) { #if defined(CONFIG_CPU_FREQ) struct cpufreq_freqs freqs; @@ -132,7 +124,7 @@ static int mx5_suspend_prepare(void) /* * Called before devices are re-setup. */ -static void mx5_suspend_finish(void) +static void mx51_suspend_finish(void) { #if defined(CONFIG_CPU_FREQ) struct cpufreq_freqs freqs; @@ -155,35 +147,35 @@ static void mx5_suspend_finish(void) /* * Called after devices are re-setup, but before processes are thawed. */ -static void mx5_suspend_end(void) +static void mx51_suspend_end(void) { } -static int mx5_pm_valid(suspend_state_t state) +static int mx51_pm_valid(suspend_state_t state) { return (state > PM_SUSPEND_ON && state <= PM_SUSPEND_MAX); } -struct platform_suspend_ops mx5_suspend_ops = { - .valid = mx5_pm_valid, - .prepare = mx5_suspend_prepare, - .enter = mx5_suspend_enter, - .finish = mx5_suspend_finish, - .end = mx5_suspend_end, +struct platform_suspend_ops mx51_suspend_ops = { + .valid = mx51_pm_valid, + .prepare = mx51_suspend_prepare, + .enter = mx51_suspend_enter, + .finish = mx51_suspend_finish, + .end = mx51_suspend_end, }; -static int __devinit mx5_pm_probe(struct platform_device *pdev) +static int __devinit mx51_pm_probe(struct platform_device *pdev) { pm_dev = &pdev->dev; return 0; } -static struct platform_driver mx5_pm_driver = { +static struct platform_driver mx51_pm_driver = { .driver = { - .name = "mx5_pm", + .name = "mx51_pm", }, - .probe = mx5_pm_probe, + .probe = mx51_pm_probe, }; static int __init pm_init(void) @@ -191,32 +183,19 @@ static int __init pm_init(void) int cpu_wp_nr; unsigned long iram_paddr; - pr_info("Static Power Management for Freescale i.MX5\n"); - if (platform_driver_register(&mx5_pm_driver) != 0) { - printk(KERN_ERR "mx5_pm_driver register failed\n"); + pr_info("Static Power Management for Freescale i.MX51\n"); + if (platform_driver_register(&mx51_pm_driver) != 0) { + printk(KERN_ERR "mx51_pm_driver register failed\n"); return -ENODEV; } - suspend_set_ops(&mx5_suspend_ops); + suspend_set_ops(&mx51_suspend_ops); /* Move suspend routine into iRAM */ iram_alloc(SZ_4K, &iram_paddr); /* Need to remap the area here since we want the memory region to be executable. */ suspend_iram_base = __arm_ioremap(iram_paddr, SZ_4K, MT_HIGH_VECTORS); - - if (cpu_is_mx51() || cpu_is_mx53()) { - suspend_param1 = IO_ADDRESS(IOMUXC_BASE_ADDR + 0x4b8); - memcpy(suspend_iram_base, cpu_do_suspend_workaround, - SZ_4K); - } else if (cpu_is_mx50()) { - /* - * Need to run the suspend code from IRAM as the DDR needs - * to be put into self refresh mode manually. - */ - memcpy(suspend_iram_base, mx50_suspend, SZ_4K); - - suspend_param1 = databahn_base; - } + memcpy(suspend_iram_base, cpu_do_suspend_workaround, SZ_4K); suspend_in_iram = (void *)suspend_iram_base; cpu_wp_tbl = get_cpu_wp(&cpu_wp_nr); @@ -235,7 +214,7 @@ static int __init pm_init(void) static void __exit pm_cleanup(void) { /* Unregister the device structure */ - platform_driver_unregister(&mx5_pm_driver); + platform_driver_unregister(&mx51_pm_driver); } module_init(pm_init); diff --git a/arch/arm/mach-mx5/system.c b/arch/arm/mach-mx5/system.c index 199c30e26947..da27fc4605a3 100644 --- a/arch/arm/mach-mx5/system.c +++ b/arch/arm/mach-mx5/system.c @@ -16,7 +16,6 @@ #include <linux/platform_device.h> #include <asm/io.h> #include <mach/hardware.h> -#include <mach/clock.h> #include <asm/proc-fns.h> #include <asm/system.h> #include "crm_regs.h" @@ -34,14 +33,11 @@ extern int mxc_jtag_enabled; extern int iram_ready; -extern void __iomem *ccm_base; -extern void __iomem *databahn_base; -extern void (*wait_in_iram)(void *ccm_addr, void *databahn_addr); -extern void *wait_in_iram_base; -extern void mx50_wait(u32 ccm_base, u32 databahn_addr); - static struct clk *gpc_dvfs_clk; +extern void cpu_cortexa8_do_idle(void *addr); + + /* set cpu low power mode before WFI instruction */ void mxc_cpu_lp_set(enum mxc_cpu_pwr_mode mode) { @@ -70,7 +66,6 @@ void mxc_cpu_lp_set(enum mxc_cpu_pwr_mode mode) if (mode == WAIT_UNCLOCKED_POWER_OFF) { ccm_clpcr |= (0x1 << MXC_CCM_CLPCR_LPM_OFFSET); ccm_clpcr &= ~MXC_CCM_CLPCR_VSTBY; - ccm_clpcr &= ~MXC_CCM_CLPCR_SBYOS; stop_mode = 0; } else { ccm_clpcr |= (0x2 << MXC_CCM_CLPCR_LPM_OFFSET); @@ -101,8 +96,7 @@ void mxc_cpu_lp_set(enum mxc_cpu_pwr_mode mode) __raw_writel(ccm_clpcr, MXC_CCM_CLPCR); if (cpu_is_mx51()) __raw_writel(arm_srpgcr, MXC_SRPG_ARM_SRPGCR); - if (!cpu_is_mx50()) - __raw_writel(arm_srpgcr, MXC_SRPG_NEON_SRPGCR); + __raw_writel(arm_srpgcr, MXC_SRPG_NEON_SRPGCR); if (stop_mode) { __raw_writel(empgc0, MXC_SRPG_EMPGC0_SRPGCR); __raw_writel(empgc1, MXC_SRPG_EMPGC1_SRPGCR); @@ -156,21 +150,14 @@ static int arch_idle_mode = WAIT_UNCLOCKED_POWER_OFF; */ void arch_idle(void) { -/* if (likely(!mxc_jtag_enabled)) */{ - struct clk *ddr_clk = clk_get(NULL, "ddr_clk"); + if (likely(!mxc_jtag_enabled)) { if (gpc_dvfs_clk == NULL) gpc_dvfs_clk = clk_get(NULL, "gpc_dvfs_clk"); /* gpc clock is needed for SRPG */ clk_enable(gpc_dvfs_clk); mxc_cpu_lp_set(arch_idle_mode); - if (cpu_is_mx50() && (clk_get_usecount(ddr_clk) == 0)) { - memcpy(wait_in_iram_base, mx50_wait, SZ_4K); - wait_in_iram = (void *)wait_in_iram_base; - wait_in_iram(ccm_base, databahn_base); - } else - cpu_do_idle(); + cpu_do_idle(); clk_disable(gpc_dvfs_clk); - clk_put(ddr_clk); } } @@ -190,93 +177,3 @@ void arch_reset(char mode) /* Assert SRS signal */ mxc_wd_reset(); } - - -static int __mxs_reset_block(void __iomem *hwreg, int just_enable) -{ - u32 c; - int timeout; - - /* the process of software reset of IP block is done - in several steps: - - - clear SFTRST and wait for block is enabled; - - clear clock gating (CLKGATE bit); - - set the SFTRST again and wait for block is in reset; - - clear SFTRST and wait for reset completion. - */ - c = __raw_readl(hwreg); - c &= ~(1 << 31); /* clear SFTRST */ - __raw_writel(c, hwreg); - for (timeout = 1000000; timeout > 0; timeout--) - /* still in SFTRST state ? */ - if ((__raw_readl(hwreg) & (1 << 31)) == 0) - break; - if (timeout <= 0) { - printk(KERN_ERR "%s(%p): timeout when enabling\n", - __func__, hwreg); - return -ETIME; - } - - c = __raw_readl(hwreg); - c &= ~(1 << 30); /* clear CLKGATE */ - __raw_writel(c, hwreg); - - if (!just_enable) { - c = __raw_readl(hwreg); - c |= (1 << 31); /* now again set SFTRST */ - __raw_writel(c, hwreg); - for (timeout = 1000000; timeout > 0; timeout--) - /* poll until CLKGATE set */ - if (__raw_readl(hwreg) & (1 << 30)) - break; - if (timeout <= 0) { - printk(KERN_ERR "%s(%p): timeout when resetting\n", - __func__, hwreg); - return -ETIME; - } - - c = __raw_readl(hwreg); - c &= ~(1 << 31); /* clear SFTRST */ - __raw_writel(c, hwreg); - for (timeout = 1000000; timeout > 0; timeout--) - /* still in SFTRST state ? */ - if ((__raw_readl(hwreg) & (1 << 31)) == 0) - break; - if (timeout <= 0) { - printk(KERN_ERR "%s(%p): timeout when enabling " - "after reset\n", __func__, hwreg); - return -ETIME; - } - - c = __raw_readl(hwreg); - c &= ~(1 << 30); /* clear CLKGATE */ - __raw_writel(c, hwreg); - } - for (timeout = 1000000; timeout > 0; timeout--) - /* still in SFTRST state ? */ - if ((__raw_readl(hwreg) & (1 << 30)) == 0) - break; - - if (timeout <= 0) { - printk(KERN_ERR "%s(%p): timeout when unclockgating\n", - __func__, hwreg); - return -ETIME; - } - - return 0; -} - -int mxs_reset_block(void __iomem *hwreg, int just_enable) -{ - int try = 10; - int r; - - while (try--) { - r = __mxs_reset_block(hwreg, just_enable); - if (!r) - break; - pr_debug("%s: try %d failed\n", __func__, 10 - try); - } - return r; -} diff --git a/arch/arm/mach-mx5/usb_dr.c b/arch/arm/mach-mx5/usb_dr.c index 4f36379b8d64..0878fd6e0d38 100644 --- a/arch/arm/mach-mx5/usb_dr.c +++ b/arch/arm/mach-mx5/usb_dr.c @@ -18,12 +18,12 @@ #include <linux/fsl_devices.h> #include <mach/arc_otg.h> #include <mach/hardware.h> -#include <asm/delay.h> #include "usb.h" #if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_EHCI_ARC_OTG) || defined(CONFIG_USB_GADGET_ARC) static int usbotg_init_ext(struct platform_device *pdev); static void usbotg_uninit_ext(struct fsl_usb2_platform_data *pdata); +static void _wake_up_enable(struct fsl_usb2_platform_data *pdata, bool enable); static void usbotg_clock_gate(bool on); /* @@ -40,6 +40,7 @@ static struct fsl_usb2_platform_data dr_utmi_config = { .gpio_usb_active = gpio_usbotg_hs_active, .gpio_usb_inactive = gpio_usbotg_hs_inactive, .usb_clock_for_pm = usbotg_clock_gate, + .wake_up_enable = _wake_up_enable, .transceiver = "utmi", }; @@ -47,13 +48,6 @@ static struct fsl_usb2_platform_data dr_utmi_config = { static int usbotg_init_ext(struct platform_device *pdev) { struct clk *usb_clk; - if (cpu_is_mx50()) { - usb_clk = clk_get(&pdev->dev, "usb_phy1_clk"); - clk_enable(usb_clk); - clk_put(usb_clk); - - return usbotg_init(pdev); - } usb_clk = clk_get(NULL, "usboh3_clk"); clk_enable(usb_clk); @@ -75,15 +69,6 @@ static void usbotg_uninit_ext(struct fsl_usb2_platform_data *pdata) { struct clk *usb_clk; - if (cpu_is_mx50()) { - usb_clk = clk_get(&pdata->pdev->dev, "usb_phy1_clk"); - clk_disable(usb_clk); - clk_put(usb_clk); - - usbotg_uninit(pdata); - return; - } - usb_clk = clk_get(NULL, "usboh3_clk"); clk_disable(usb_clk); clk_put(usb_clk); @@ -95,149 +80,33 @@ static void usbotg_uninit_ext(struct fsl_usb2_platform_data *pdata) usbotg_uninit(pdata); } -#define ENABLED_BY_HOST (0x1 << 0) -#define ENABLED_BY_DEVICE (0x1 << 1) -#if defined(CONFIG_USB_EHCI_ARC_OTG) && defined(CONFIG_USB_GADGET_ARC) -/* Below two macros are used at otg mode to indicate usb mode*/ -static u32 wakeup_irq_enable_src = 0; -static void __wakeup_irq_enable(bool on, int source) +static void _wake_up_enable(struct fsl_usb2_platform_data *pdata, bool enable) { - /* otg host and device share the OWIE bit, only when host and device - * all enable the wakeup irq, we can enable the OWIE bit - */ - if (on) { - wakeup_irq_enable_src |= source; - if (wakeup_irq_enable_src == (ENABLED_BY_HOST | ENABLED_BY_DEVICE)) { + if (get_usb_mode(pdata) == FSL_USB_DR_DEVICE) { + if (enable) { USBCTRL |= UCTRL_OWIE; + USBCTRL_HOST2 |= UCTRL_H2OVBWK_EN; USB_PHY_CTR_FUNC |= USB_UTMI_PHYCTRL_CONF2; - printk("OTG wakeup irq is enabled\n"); + } else { + USBCTRL &= ~UCTRL_OWIE; + USBCTRL_HOST2 &= ~UCTRL_H2OVBWK_EN; + USB_PHY_CTR_FUNC &= ~USB_UTMI_PHYCTRL_CONF2; } - }else { - printk("OTG wakeup irq disable\n"); - USB_PHY_CTR_FUNC &= ~USB_UTMI_PHYCTRL_CONF2; - USBCTRL &= ~UCTRL_OWIE; - wakeup_irq_enable_src &= ~source; - /* The interrupt must be disabled for at least 3 clock - * cycles of the standby clock(32k Hz) , that is 0.094 ms*/ - udelay(100); - } -} -#else -static void __wakeup_irq_enable(bool on, int source) -{ - if (on) { - USBCTRL |= UCTRL_OWIE; - USB_PHY_CTR_FUNC |= USB_UTMI_PHYCTRL_CONF2; - }else { - USBCTRL &= ~UCTRL_OWIE; - USB_PHY_CTR_FUNC &= ~USB_UTMI_PHYCTRL_CONF2; - /* The interrupt must be disabled for at least 3 clock - * cycles of the standby clock(32k Hz) , that is 0.094 ms*/ - udelay(100); - } -} -#endif - -#ifdef CONFIG_USB_EHCI_ARC_OTG -static void _host_wakeup_enable(struct fsl_usb2_platform_data *pdata, bool enable) -{ - __wakeup_irq_enable(enable, ENABLED_BY_HOST); - /* host only care the ID change wakeup event */ - if (enable) { - USBCTRL_HOST2 |= UCTRL_H2OIDWK_EN; - }else { - USBCTRL_HOST2 &= ~UCTRL_H2OIDWK_EN; - /* The interrupt must be disabled for at least 2 clock - * cycles of the standby clock(32k Hz) , that is 0.0625 ms*/ - udelay(100); - } -} -#endif - -#ifdef CONFIG_USB_GADGET_ARC -static void _device_wakeup_enable(struct fsl_usb2_platform_data *pdata, bool enable) -{ - __wakeup_irq_enable(enable, ENABLED_BY_DEVICE); - /* if udc is not used by any gadget, we can not enable the vbus wakeup */ - if (!pdata->port_enables) - { - USBCTRL_HOST2 &= ~UCTRL_H2OVBWK_EN; - return; - } - if (enable) { - USBCTRL_HOST2 |= UCTRL_H2OVBWK_EN; - }else { - USBCTRL_HOST2 &= ~UCTRL_H2OVBWK_EN; - } -} -#endif - -#if defined(CONFIG_USB_EHCI_ARC_OTG) && defined(CONFIG_USB_GADGET_ARC) -static u32 low_power_enable_src = 0; -static void __phy_lowpower_suspend(bool enable, int source) -{ - if (enable) { - low_power_enable_src |= source; - if (low_power_enable_src == (ENABLED_BY_HOST | ENABLED_BY_DEVICE)) { - UOG_PORTSC1 |= PORTSC_PHCD; - printk("OTG phy lowpower enable\n"); + } else { + if (enable) { + USBCTRL |= UCTRL_OWIE; + USBCTRL_HOST2 |= (1 << 5); + } else { + USBCTRL &= ~UCTRL_OWIE; + USBCTRL_HOST2 &= ~(1 << 5); } - }else { - printk("OTG phy lowpower disable\n"); - UOG_PORTSC1 &= ~PORTSC_PHCD; - low_power_enable_src &= ~source; - } -} -#else -static void __phy_lowpower_suspend(bool enable, int source) -{ - if (enable) { - UOG_PORTSC1 |= PORTSC_PHCD; - }else { - UOG_PORTSC1 &= ~PORTSC_PHCD; } } -#endif - -#ifdef CONFIG_USB_EHCI_ARC_OTG -static void _host_phy_lowpower_suspend(bool enable) -{ - __phy_lowpower_suspend(enable, ENABLED_BY_HOST); -} -#endif - -#ifdef CONFIG_USB_GADGET_ARC -static void _device_phy_lowpower_suspend(bool enable) -{ - __phy_lowpower_suspend(enable, ENABLED_BY_DEVICE); -} -#endif static void usbotg_clock_gate(bool on) { struct clk *usb_clk; - if (cpu_is_mx50()) { - if (on) { - usb_clk = clk_get(NULL, "usb_ahb_clk"); - clk_enable(usb_clk); - clk_put(usb_clk); - - usb_clk = clk_get(NULL, "usb_phy1_clk"); - clk_enable(usb_clk); - clk_put(usb_clk); - } else { - usb_clk = clk_get(NULL, "usb_phy1_clk"); - clk_disable(usb_clk); - clk_put(usb_clk); - - usb_clk = clk_get(NULL, "usb_ahb_clk"); - clk_disable(usb_clk); - clk_put(usb_clk); - } - return; - } - if (on) { usb_clk = clk_get(NULL, "usb_ahb_clk"); clk_enable(usb_clk); @@ -287,15 +156,11 @@ void __init mx5_usb_dr_init(void) #endif #ifdef CONFIG_USB_EHCI_ARC_OTG dr_utmi_config.operating_mode = DR_HOST_MODE; - dr_utmi_config.wake_up_enable = _host_wakeup_enable; - dr_utmi_config.phy_lowpower_suspend = _host_phy_lowpower_suspend; platform_device_add_data(&mxc_usbdr_host_device, &dr_utmi_config, sizeof(dr_utmi_config)); platform_device_register(&mxc_usbdr_host_device); #endif #ifdef CONFIG_USB_GADGET_ARC dr_utmi_config.operating_mode = DR_UDC_MODE; - dr_utmi_config.wake_up_enable = _device_wakeup_enable; - dr_utmi_config.phy_lowpower_suspend = _device_phy_lowpower_suspend; platform_device_add_data(&mxc_usbdr_udc_device, &dr_utmi_config, sizeof(dr_utmi_config)); platform_device_register(&mxc_usbdr_udc_device); #endif diff --git a/arch/arm/mach-mx5/usb_h1.c b/arch/arm/mach-mx5/usb_h1.c index 3c53ed8901ae..52a2bcafd765 100644 --- a/arch/arm/mach-mx5/usb_h1.c +++ b/arch/arm/mach-mx5/usb_h1.c @@ -17,15 +17,13 @@ #include <linux/clk.h> #include <linux/platform_device.h> #include <linux/fsl_devices.h> -#include <asm/delay.h> #include <mach/arc_otg.h> #include <asm/mach-types.h> #include <asm/mach/arch.h> #include "usb.h" #include "iomux.h" #include "mx51_pins.h" -//#undef pr_debug -//#define pr_debug printk + /* * USB Host1 HS port */ @@ -71,49 +69,13 @@ static void _wake_up_enable(struct fsl_usb2_platform_data *pdata, bool enable) { if (enable) USBCTRL |= UCTRL_H1WIE; - else { + else USBCTRL &= ~UCTRL_H1WIE; - /* The interrupt must be disabled for at least 3 - * cycles of the standby clock(32k Hz) , that is 0.094 ms*/ - udelay(100); - } -} - -static void _phy_lowpower_suspend(bool enable) -{ - if (enable) { - UH1_PORTSC1 |= PORTSC_PHCD; - }else { - UH1_PORTSC1 &= ~PORTSC_PHCD; - } } static void usbotg_clock_gate(bool on) { struct clk *usb_clk; - if (cpu_is_mx50()) { - if (on) { - usb_clk = clk_get(NULL, "usb_ahb_clk"); - clk_enable(usb_clk); - clk_put(usb_clk); - - } else { - usb_clk = clk_get(NULL, "usb_ahb_clk"); - clk_disable(usb_clk); - clk_put(usb_clk); - } - return; - } - if (cpu_is_mx53()) { - usb_clk = clk_get(NULL, "usb_phy2_clk"); - if (on) { - clk_enable(usb_clk); - } else { - clk_disable(usb_clk); - } - clk_put(usb_clk); - } - if (on) { usb_clk = clk_get(NULL, "usb_ahb_clk"); clk_enable(usb_clk); @@ -153,7 +115,7 @@ static int fsl_usb_host_init_ext(struct platform_device *pdev) clk_disable(usb_clk); clk_put(usb_clk); } else if (cpu_is_mx50()) { - usb_clk = clk_get(NULL, "usb_phy2_clk"); + usb_clk = clk_get(&pdev->dev, "usb_phy2_clk"); clk_enable(usb_clk); clk_put(usb_clk); } @@ -191,7 +153,7 @@ static void fsl_usb_host_uninit_ext(struct fsl_usb2_platform_data *pdata) clk_disable(usb_clk); clk_put(usb_clk); } else if (cpu_is_mx50()) { - usb_clk = clk_get(NULL, "usb_phy2_clk"); + usb_clk = clk_get(&pdata->pdev->dev, "usb_phy2_clk"); clk_disable(usb_clk); clk_put(usb_clk); } @@ -208,7 +170,6 @@ static struct fsl_usb2_platform_data usbh1_config = { .power_budget = 500, /* 500 mA max power */ .wake_up_enable = _wake_up_enable, .usb_clock_for_pm = usbotg_clock_gate, - .phy_lowpower_suspend = _phy_lowpower_suspend, .transceiver = "utmi", }; diff --git a/arch/arm/mach-pxa/cpufreq-pxa2xx.c b/arch/arm/mach-pxa/cpufreq-pxa2xx.c index 3a8ee2272add..983cc8c20081 100644 --- a/arch/arm/mach-pxa/cpufreq-pxa2xx.c +++ b/arch/arm/mach-pxa/cpufreq-pxa2xx.c @@ -155,7 +155,7 @@ MODULE_PARM_DESC(pxa255_turbo_table, "Selects the frequency table (0 = run table static pxa_freqs_t pxa27x_freqs[] = { {104000, 104000, PXA27x_CCCR(1, 8, 2), 0, CCLKCFG2(1, 0, 1), 900000, 1705000 }, - {156000, 104000, PXA27x_CCCR(1, 8, 6), 0, CCLKCFG2(1, 1, 1), 1000000, 1705000 }, + {156000, 104000, PXA27x_CCCR(1, 8, 3), 0, CCLKCFG2(1, 0, 1), 1000000, 1705000 }, {208000, 208000, PXA27x_CCCR(0, 16, 2), 1, CCLKCFG2(0, 0, 1), 1180000, 1705000 }, {312000, 208000, PXA27x_CCCR(1, 16, 3), 1, CCLKCFG2(1, 0, 1), 1250000, 1705000 }, {416000, 208000, PXA27x_CCCR(1, 16, 4), 1, CCLKCFG2(1, 0, 1), 1350000, 1705000 }, diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c index 9cd09465a0e8..110e1f174f25 100644 --- a/arch/arm/mach-pxa/em-x270.c +++ b/arch/arm/mach-pxa/em-x270.c @@ -497,16 +497,15 @@ static int em_x270_usb_hub_init(void) goto err_free_vbus_gpio; /* USB Hub power-on and reset */ - gpio_direction_output(usb_hub_reset, 0); + gpio_direction_output(usb_hub_reset, 1); + gpio_direction_output(GPIO9_USB_VBUS_EN, 0); regulator_enable(em_x270_usb_ldo); - gpio_set_value(usb_hub_reset, 1); gpio_set_value(usb_hub_reset, 0); + gpio_set_value(usb_hub_reset, 1); regulator_disable(em_x270_usb_ldo); regulator_enable(em_x270_usb_ldo); - gpio_set_value(usb_hub_reset, 1); - - /* enable VBUS */ - gpio_direction_output(GPIO9_USB_VBUS_EN, 1); + gpio_set_value(usb_hub_reset, 0); + gpio_set_value(GPIO9_USB_VBUS_EN, 1); return 0; diff --git a/arch/arm/mach-pxa/sharpsl_pm.c b/arch/arm/mach-pxa/sharpsl_pm.c index 2546c066cd6e..629e05d1196e 100644 --- a/arch/arm/mach-pxa/sharpsl_pm.c +++ b/arch/arm/mach-pxa/sharpsl_pm.c @@ -678,8 +678,8 @@ static int corgi_enter_suspend(unsigned long alarm_time, unsigned int alarm_enab dev_dbg(sharpsl_pm.dev, "User triggered wakeup in offline charger.\n"); } - if ((!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_LOCK)) || (sharpsl_fatal_check() < 0) ) - { + if ((!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_LOCK)) || + (!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_FATAL))) { dev_err(sharpsl_pm.dev, "Fatal condition. Suspend.\n"); corgi_goto_sleep(alarm_time, alarm_enable, state); return 1; diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c index a34954d9df7d..73cae57fa707 100644 --- a/arch/arm/mm/highmem.c +++ b/arch/arm/mm/highmem.c @@ -40,11 +40,16 @@ void *kmap_atomic(struct page *page, enum km_type type) { unsigned int idx; unsigned long vaddr; + void *kmap; pagefault_disable(); if (!PageHighMem(page)) return page_address(page); + kmap = kmap_high_get(page); + if (kmap) + return kmap; + idx = type + KM_TYPE_NR * smp_processor_id(); vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); #ifdef CONFIG_DEBUG_HIGHMEM @@ -80,6 +85,9 @@ void kunmap_atomic(void *kvaddr, enum km_type type) #else (void) idx; /* to kill a warning */ #endif + } else if (vaddr >= PKMAP_ADDR(0) && vaddr < PKMAP_ADDR(LAST_PKMAP)) { + /* this address was obtained through kmap_high_get() */ + kunmap_high(pte_page(pkmap_page_table[PKMAP_NR(vaddr)])); } pagefault_enable(); } diff --git a/arch/arm/plat-mxc/clock.c b/arch/arm/plat-mxc/clock.c index d2b51a1357c1..911908164efb 100644 --- a/arch/arm/plat-mxc/clock.c +++ b/arch/arm/plat-mxc/clock.c @@ -4,7 +4,7 @@ * Copyright (C) 2004 - 2005 Nokia corporation * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com> * Modified for omap shared clock framework by Tony Lindgren <tony@atomide.com> - * Copyright 2007-2010 Freescale Semiconductor, Inc. + * Copyright 2007-2010 Freescale Semiconductor, Inc. All Rights Reserved. * Copyright 2008 Juergen Beisert, kernel@pengutronix.de * * This program is free software; you can redistribute it and/or @@ -173,8 +173,14 @@ int clk_enable(struct clk *clk) if (clk == NULL || IS_ERR(clk)) return -EINVAL; + spin_lock_irqsave(&clockfw_lock, flags); + + ret = __clk_enable(clk); + + spin_unlock_irqrestore(&clockfw_lock, flags); + if ((clk->flags & CPU_FREQ_TRIG_UPDATE) - && (clk_get_usecount(clk) == 0)) { + && (clk_get_usecount(clk) == 1)) { #if (defined(CONFIG_ARCH_MX5) || defined(CONFIG_ARCH_MX37)) if (low_freq_bus_used() && !low_bus_freq_mode) set_low_bus_freq(); @@ -194,13 +200,6 @@ int clk_enable(struct clk *clk) #endif } - - spin_lock_irqsave(&clockfw_lock, flags); - - ret = __clk_enable(clk); - - spin_unlock_irqrestore(&clockfw_lock, flags); - return ret; } EXPORT_SYMBOL(clk_enable); @@ -229,12 +228,12 @@ void clk_disable(struct clk *clk) set_low_bus_freq(); else { if (!high_bus_freq_mode) { - /* Currently at low or medium set point, + /* Currently at ow or medium set point, * need to set to high setpoint */ set_high_bus_freq(0); } else if (high_bus_freq_mode || low_bus_freq_mode) { - /* Currently at low or high set point, + /* Currently at ow or high set point, * need to set to medium setpoint */ set_high_bus_freq(0); diff --git a/arch/arm/plat-mxc/dvfs_core.c b/arch/arm/plat-mxc/dvfs_core.c index 143bc07834ed..adb2b1803fc4 100644 --- a/arch/arm/plat-mxc/dvfs_core.c +++ b/arch/arm/plat-mxc/dvfs_core.c @@ -188,14 +188,14 @@ static int set_cpu_freq(int wp) } spin_lock_irqsave(&mxc_dvfs_core_lock, flags); /* PLL_RELOCK, set ARM_FREQ_SHIFT_DIVIDER */ - reg = __raw_readl(ccm_base + dvfs_data->ccm_cdcr_offset); + reg = __raw_readl(dvfs_data->ccm_cdcr_reg_addr); reg &= 0xFFFFFFFB; - __raw_writel(reg, ccm_base + dvfs_data->ccm_cdcr_offset); + __raw_writel(reg, dvfs_data->ccm_cdcr_reg_addr); setup_pll(); /* START the GPC main control FSM */ /* set VINC */ - reg = __raw_readl(gpc_base + dvfs_data->gpc_vcr_offset); + reg = __raw_readl(dvfs_data->gpc_vcr_reg_addr); reg &= ~(MXC_GPCVCR_VINC_MASK | MXC_GPCVCR_VCNTU_MASK | MXC_GPCVCR_VCNT_MASK); @@ -204,18 +204,17 @@ static int set_cpu_freq(int wp) reg |= (1 << MXC_GPCVCR_VCNTU_OFFSET) | (1 << MXC_GPCVCR_VCNT_OFFSET); - __raw_writel(reg, gpc_base + dvfs_data->gpc_vcr_offset); + __raw_writel(reg, dvfs_data->gpc_vcr_reg_addr); - reg = __raw_readl(gpc_base + dvfs_data->gpc_cntr_offset); + reg = __raw_readl(dvfs_data->gpc_cntr_reg_addr); reg &= ~(MXC_GPCCNTR_ADU_MASK | MXC_GPCCNTR_FUPD_MASK); reg |= MXC_GPCCNTR_FUPD; reg |= MXC_GPCCNTR_ADU; - __raw_writel(reg, gpc_base + dvfs_data->gpc_cntr_offset); + __raw_writel(reg, dvfs_data->gpc_cntr_reg_addr); reg |= MXC_GPCCNTR_STRT; - __raw_writel(reg, gpc_base + dvfs_data->gpc_cntr_offset); - while (__raw_readl(gpc_base + dvfs_data->gpc_cntr_offset) - & 0x4000) + __raw_writel(reg, dvfs_data->gpc_cntr_reg_addr); + while (__raw_readl(dvfs_data->gpc_cntr_reg_addr) & 0x4000) udelay(10); spin_unlock_irqrestore(&mxc_dvfs_core_lock, flags); @@ -236,13 +235,13 @@ static int set_cpu_freq(int wp) /* Change arm_podf only */ /* set ARM_FREQ_SHIFT_DIVIDER */ - reg = __raw_readl(ccm_base + dvfs_data->ccm_cdcr_offset); + reg = __raw_readl(dvfs_data->ccm_cdcr_reg_addr); reg &= 0xFFFFFFFB; reg |= 1 << 2; - __raw_writel(reg, ccm_base + dvfs_data->ccm_cdcr_offset); + __raw_writel(reg, dvfs_data->ccm_cdcr_reg_addr); /* Get ARM_PODF */ - reg = __raw_readl(ccm_base + dvfs_data->ccm_cacrr_offset); + reg = __raw_readl(dvfs_data->ccm_cacrr_reg_addr); arm_podf = reg & 0x07; if (podf == arm_podf) { printk(KERN_DEBUG @@ -270,38 +269,37 @@ static int set_cpu_freq(int wp) reg &= 0xFFFFFFF8; reg |= arm_podf; - reg1 = __raw_readl(ccm_base + dvfs_data->ccm_cdhipr_offset); + reg1 = __raw_readl(dvfs_data->ccm_cdhipr_reg_addr); if ((reg1 & 0x00010000) == 0) - __raw_writel(reg, - ccm_base + dvfs_data->ccm_cacrr_offset); + __raw_writel(reg, dvfs_data->ccm_cacrr_reg_addr); else { printk(KERN_DEBUG "ARM_PODF still in busy!!!!\n"); return 0; } /* START the GPC main control FSM */ - reg = __raw_readl(gpc_base + dvfs_data->gpc_cntr_offset); + reg = __raw_readl(dvfs_data->gpc_cntr_reg_addr); reg |= MXC_GPCCNTR_FUPD; /* ADU=1, select ARM domain */ reg |= MXC_GPCCNTR_ADU; - __raw_writel(reg, gpc_base + dvfs_data->gpc_cntr_offset); + __raw_writel(reg, dvfs_data->gpc_cntr_reg_addr); /* set VINC */ - reg = __raw_readl(gpc_base + dvfs_data->gpc_vcr_offset); + reg = __raw_readl(dvfs_data->gpc_vcr_reg_addr); reg &= ~(MXC_GPCVCR_VINC_MASK | MXC_GPCVCR_VCNTU_MASK | MXC_GPCVCR_VCNT_MASK); reg |= (1 << MXC_GPCVCR_VCNTU_OFFSET) | (100 << MXC_GPCVCR_VCNT_OFFSET) | (vinc << MXC_GPCVCR_VINC_OFFSET); - __raw_writel(reg, gpc_base + dvfs_data->gpc_vcr_offset); + __raw_writel(reg, dvfs_data->gpc_vcr_reg_addr); - reg = __raw_readl(gpc_base + dvfs_data->gpc_cntr_offset); + reg = __raw_readl(dvfs_data->gpc_cntr_reg_addr); reg &= (~(MXC_GPCCNTR_ADU | MXC_GPCCNTR_FUPD)); reg |= MXC_GPCCNTR_ADU | MXC_GPCCNTR_FUPD | MXC_GPCCNTR_STRT; - __raw_writel(reg, gpc_base + dvfs_data->gpc_cntr_offset); + __raw_writel(reg, dvfs_data->gpc_cntr_reg_addr); /* Wait for arm podf Enable */ - while ((__raw_readl(gpc_base + dvfs_data->gpc_cntr_offset) & + while ((__raw_readl(dvfs_data->gpc_cntr_reg_addr) & MXC_GPCCNTR_STRT) == MXC_GPCCNTR_STRT) { printk(KERN_DEBUG "Waiting arm_podf enabled!\n"); udelay(10); @@ -320,9 +318,9 @@ static int set_cpu_freq(int wp) propagate_rate(pll1_sw_clk); /* Clear the ARM_FREQ_SHIFT_DIVIDER */ - reg = __raw_readl(ccm_base + dvfs_data->ccm_cdcr_offset); + reg = __raw_readl(dvfs_data->ccm_cdcr_reg_addr); reg &= 0xFFFFFFFB; - __raw_writel(reg, ccm_base + dvfs_data->ccm_cdcr_offset); + __raw_writel(reg, dvfs_data->ccm_cdcr_reg_addr); } #if defined(CONFIG_CPU_FREQ_IMX) cpufreq_trig_needed = 1; @@ -347,14 +345,14 @@ static int start_dvfs(void) dvfs_load_config(0); /* config reg GPC_CNTR */ - reg = __raw_readl(gpc_base + dvfs_data->gpc_cntr_offset); + reg = __raw_readl(dvfs_data->gpc_cntr_reg_addr); reg &= ~MXC_GPCCNTR_GPCIRQM; /* GPCIRQ=1, select ARM IRQ */ reg |= MXC_GPCCNTR_GPCIRQ_ARM; /* ADU=1, select ARM domain */ reg |= MXC_GPCCNTR_ADU; - __raw_writel(reg, gpc_base + dvfs_data->gpc_cntr_offset); + __raw_writel(reg, dvfs_data->gpc_cntr_reg_addr); /* Set PREDIV bits */ reg = __raw_readl(dvfs_data->membase + MXC_DVFSCORE_CNTR); @@ -419,8 +417,8 @@ static irqreturn_t dvfs_irq(int irq, void *dev_id) u32 reg; /* Check if DVFS0 (ARM) id requesting for freqency/voltage update */ - if ((__raw_readl(gpc_base + dvfs_data->gpc_cntr_offset) - & MXC_GPCCNTR_DVFS0CR) == 0) + if ((__raw_readl(dvfs_data->gpc_cntr_reg_addr) & MXC_GPCCNTR_DVFS0CR) == + 0) return IRQ_NONE; /* Mask DVFS irq */ @@ -430,9 +428,9 @@ static irqreturn_t dvfs_irq(int irq, void *dev_id) __raw_writel(reg, dvfs_data->membase + MXC_DVFSCORE_CNTR); /* Mask GPC1 irq */ - reg = __raw_readl(gpc_base + dvfs_data->gpc_cntr_offset); + reg = __raw_readl(dvfs_data->gpc_cntr_reg_addr); reg |= MXC_GPCCNTR_GPCIRQM | 0x1000000; - __raw_writel(reg, gpc_base + dvfs_data->gpc_cntr_offset); + __raw_writel(reg, dvfs_data->gpc_cntr_reg_addr); schedule_delayed_work(&dvfs_core_handler, 0); return IRQ_HANDLED; @@ -537,9 +535,9 @@ END: /* Set MAXF, MINF */ reg |= MXC_DVFSCNTR_LBFL; __raw_writel(reg, dvfs_data->membase + MXC_DVFSCORE_CNTR); /*Unmask GPC1 IRQ */ - reg = __raw_readl(gpc_base + dvfs_data->gpc_cntr_offset); + reg = __raw_readl(dvfs_data->gpc_cntr_reg_addr); reg &= ~MXC_GPCCNTR_GPCIRQM; - __raw_writel(reg, gpc_base + dvfs_data->gpc_cntr_offset); + __raw_writel(reg, dvfs_data->gpc_cntr_reg_addr); #if defined(CONFIG_CPU_FREQ_IMX) if (cpufreq_trig_needed == 1) { @@ -804,6 +802,7 @@ static int __devinit mxc_dvfs_core_probe(struct platform_device *pdev) goto err1; } dvfs_data->membase = ioremap(res->start, res->end - res->start + 1); + /* * Request the DVFS interrupt */ @@ -950,7 +949,6 @@ static void __exit dvfs_cleanup(void) /* Unregister the device structure */ platform_driver_unregister(&mxc_dvfs_core_driver); - iounmap(ccm_base); iounmap(dvfs_data->membase); clk_put(cpu_clk); clk_put(dvfs_clk); diff --git a/arch/arm/plat-mxc/include/mach/iomux-v3.h b/arch/arm/plat-mxc/include/mach/iomux-v3.h index 6beaf8cd69b5..7cd84547658f 100644 --- a/arch/arm/plat-mxc/include/mach/iomux-v3.h +++ b/arch/arm/plat-mxc/include/mach/iomux-v3.h @@ -68,31 +68,33 @@ struct pad_desc { /* * Use to set PAD control */ +#define PAD_CTL_DRIVE_VOLTAGE_3_3_V 0 +#define PAD_CTL_DRIVE_VOLTAGE_1_8_V 1 -#define PAD_CTL_DVS (1 << 13) -#define PAD_CTL_HYS (1 << 8) +#define PAD_CTL_NO_HYSTERESIS 0 +#define PAD_CTL_HYSTERESIS 1 -#define PAD_CTL_PKE (1 << 7) -#define PAD_CTL_PUE (1 << 6) -#define PAD_CTL_PUS_100K_DOWN (0 << 4) -#define PAD_CTL_PUS_360K_DOWN (0 << 4) -#define PAD_CTL_PUS_47K_UP (1 << 4) -#define PAD_CTL_PUS_75K_UP (1 << 4) -#define PAD_CTL_PUS_100K_UP (2 << 4) -#define PAD_CTL_PUS_22K_UP (3 << 4) +#define PAD_CTL_PULL_DISABLED 0x0 +#define PAD_CTL_PULL_KEEPER 0xa +#define PAD_CTL_PULL_DOWN_100K 0xc +#define PAD_CTL_PULL_UP_47K 0xd +#define PAD_CTL_PULL_UP_100K 0xe +#define PAD_CTL_PULL_UP_22K 0xf -#define PAD_CTL_ODE (1 << 3) +#define PAD_CTL_OUTPUT_CMOS 0 +#define PAD_CTL_OUTPUT_OPEN_DRAIN 1 -#define PAD_CTL_DSE_LOW (0 << 1) -#define PAD_CTL_DSE_MED (1 << 1) -#define PAD_CTL_DSE_HIGH (2 << 1) -#define PAD_CTL_DSE_MAX (3 << 1) +#define PAD_CTL_DRIVE_STRENGTH_NORM 0 +#define PAD_CTL_DRIVE_STRENGTH_HIGH 1 +#define PAD_CTL_DRIVE_STRENGTH_MAX 2 -#define PAD_CTL_SRE_FAST (1 << 0) -#define PAD_CTL_SRE_SLOW (0 << 0) +#define PAD_CTL_SLEW_RATE_SLOW 0 +#define PAD_CTL_SLEW_RATE_FAST 1 /* - * setups a single pad in the iomuxer + * setups a single pad: + * - reserves the pad so that it is not claimed by another driver + * - setups the iomux according to the configuration */ int mxc_iomux_v3_setup_pad(struct pad_desc *pad); @@ -103,9 +105,17 @@ int mxc_iomux_v3_setup_pad(struct pad_desc *pad); int mxc_iomux_v3_setup_multiple_pads(struct pad_desc *pad_list, unsigned count); /* - * Initialise the iomux controller + * releases a single pad: + * - make it available for a future use by another driver + * - DOES NOT reconfigure the IOMUX in its reset state */ -void mxc_iomux_v3_init(void __iomem *iomux_v3_base); +void mxc_iomux_v3_release_pad(struct pad_desc *pad); + +/* + * releases multiple pads + * convenvient way to call the above function with tables + */ +void mxc_iomux_v3_release_multiple_pads(struct pad_desc *pad_list, int count); #endif /* __MACH_IOMUX_V3_H__*/ diff --git a/arch/arm/plat-mxc/include/mach/mmc.h b/arch/arm/plat-mxc/include/mach/mmc.h index 7be75bd5756e..d563c157bad7 100644 --- a/arch/arm/plat-mxc/include/mach/mmc.h +++ b/arch/arm/plat-mxc/include/mach/mmc.h @@ -40,9 +40,6 @@ struct mxc_mmc_platform_data { unsigned int min_clk; unsigned int max_clk; unsigned int clk_flg; /* 1 clock enable, 0 not */ - unsigned int clk_always_on; /* Needed by SDIO cards and etc */ - unsigned int dll_override_en; /* Enable dll override delay line */ - unsigned int dll_delay_cells; /* The number of delay cells (0-0x3f) */ unsigned int reserved:16; unsigned int card_fixed:1; unsigned int card_inserted_state:1; diff --git a/arch/arm/plat-mxc/include/mach/mx5x.h b/arch/arm/plat-mxc/include/mach/mx5x.h index 0e25133736d2..fd3bbefdd292 100644 --- a/arch/arm/plat-mxc/include/mach/mx5x.h +++ b/arch/arm/plat-mxc/include/mach/mx5x.h @@ -134,31 +134,6 @@ */ #define MX53_SATA_BASE_ADDR 0x10000000 -/* - * Databahn MX50 - */ -#define MX50_DATABAHN_BASE_ADDR 0x14000000 -#define DATABAHN_CTL_REG19 0x4c -#define DATABAHN_CTL_REG20 0x50 -#define DATABAHN_CTL_REG21 0x54 -#define DATABAHN_CTL_REG22 0x58 -#define DATABAHN_CTL_REG23 0x5c -#define DATABAHN_CTL_REG42 0xa8 -#define DATABAHN_CTL_REG43 0xac -#define DATABAHN_CTL_REG55 0xdc -#define DATABAHN_CTL_REG63 0xFC -#define LOWPOWER_CONTROL_MASK 0x1F -#define LOWPOWER_AUTOENABLE_MASK 0x1F -#define LOWPOWER_EXTERNAL_CNT_MASK (0xFFFF << 16) -#define LOWPOWER_EXTERNAL_CNT_OFFSET 16 -#define LOWPOWER_INTERNAL_CNT_MASK (0xFFFF << 8) -#define LOWPOWER_INTERNAL_CNT_OFFSET 8 -#define LOWPOWER_REFRESH_ENABLE_MASK (3 << 16) -#define LOWPOWER_REFRESH_ENABLE_OFFSET 16 -#define LOWPOWER_REFRESH_HOLD_MASK 0xFFFF -#define LOWPOWER_REFRESH_HOLD_OFFSET 0 - - #define DEBUG_BASE_ADDR 0x40000000 /*MX53 + 0x2000000 */ #define DEBUG_SIZE SZ_1M @@ -171,7 +146,7 @@ #define CTI3_BASE_ADDR (DEBUG_BASE_ADDR + 0x00007000) #define CORTEX_DBG_BASE_ADDR (DEBUG_BASE_ADDR + 0x00008000) -#define APBHDMA_BASE_ADDR (DEBUG_BASE_ADDR + 0x01000000) +#define ABPHDMA_BASE_ADDR (DEBUG_BASE_ADDR + 0x01000000) #define OCOTP_CTRL_BASE_ADDR (DEBUG_BASE_ADDR + 0x01002000) #define DIGCTL_BASE_ADDR (DEBUG_BASE_ADDR + 0x01004000) #define GPMI_BASE_ADDR (DEBUG_BASE_ADDR + 0x01006000) @@ -262,7 +237,6 @@ #define MX53_ATA_BASE_ADDR (AIPS1_BASE_ADDR + 0x000E8000) #define I2C3_BASE_ADDR (AIPS1_BASE_ADDR + 0x000EC000) #define UART4_BASE_ADDR (AIPS1_BASE_ADDR + 0x000F0000) -#define RNGB_BASE_ADDR (AIPS1_BASE_ADDR + 0x000F8000) /* MX50 */ #define DVFSCORE_BASE_ADDR (GPC_BASE_ADDR + 0x180) #define DVFSPER_BASE_ADDR (GPC_BASE_ADDR + 0x1C4) diff --git a/arch/arm/plat-mxc/include/mach/mxc.h b/arch/arm/plat-mxc/include/mach/mxc.h index 808adf67552d..fc466b1c76c3 100644 --- a/arch/arm/plat-mxc/include/mach/mxc.h +++ b/arch/arm/plat-mxc/include/mach/mxc.h @@ -235,7 +235,6 @@ struct mxc_ipu_config { int rev; void (*reset) (void); struct clk *di_clk[2]; - struct clk *csi_clk[2]; }; struct mxc_ir_platform_data { @@ -326,29 +325,6 @@ struct ccwmx51_lcd_pdata { void (*bl_enable) (int, int); }; -struct mxc_epdc_fb_mode { - struct fb_videomode *vmode; - int vscan_holdoff; - int sdoed_width; - int sdoed_delay; - int sdoez_width; - int sdoez_delay; - int gdclk_hp_offs; - int gdsp_offs; - int gdoe_offs; - int gdclk_offs; - int num_ce; -}; - -struct mxc_epdc_fb_platform_data { - struct mxc_epdc_fb_mode *epdc_mode; - int num_modes; - void (*get_pins) (void); - void (*put_pins) (void); - void (*enable_pins) (void); - void (*disable_pins) (void); -}; - struct mxc_tsc_platform_data { char *vdd_reg; int penup_threshold; @@ -634,18 +610,6 @@ struct mxc_sim_platform_data { unsigned int detect; /* 1 have detect pin, 0 not */ }; -struct fsl_otp_data { - char **fuse_name; - char *regulator_name; - unsigned int fuse_num; -}; - -struct mxs_dma_plat_data { - unsigned int burst8:1; - unsigned int burst:1; - unsigned int chan_base; - unsigned int chan_num; -}; #endif /* __ASSEMBLY__ */ #define MUX_IO_P 29 diff --git a/arch/arm/plat-mxc/include/mach/mxc_dvfs.h b/arch/arm/plat-mxc/include/mach/mxc_dvfs.h index 05c6ea4bda77..43bcd2f7043a 100644 --- a/arch/arm/plat-mxc/include/mach/mxc_dvfs.h +++ b/arch/arm/plat-mxc/include/mach/mxc_dvfs.h @@ -35,7 +35,6 @@ #include <linux/device.h> extern void __iomem *gpc_base; -extern void __iomem *ccm_base; #define MXC_GPCCNTR_GPCIRQ2M (1 << 25) #define MXC_GPCCNTR_GPCIRQ2 (1 << 24) @@ -144,16 +143,16 @@ struct mxc_dvfs_platform_data { void __iomem *membase; /* The interrupt number used by the DVFS core */ int irq; - /* GPC control reg offset */ - int gpc_cntr_offset; - /* GPC voltage counter reg offset */ - int gpc_vcr_offset; - /* CCM DVFS control reg offset */ - int ccm_cdcr_offset; - /* CCM ARM clock root reg offset */ - int ccm_cacrr_offset; - /* CCM divider handshake in-progress reg offset */ - int ccm_cdhipr_offset; + /* GPC control reg address */ + void __iomem *gpc_cntr_reg_addr; + /* GPC voltage counter reg address */ + void __iomem *gpc_vcr_reg_addr; + /* CCM DVFS control reg address */ + void __iomem *ccm_cdcr_reg_addr; + /* CCM ARM clock root reg address */ + void __iomem *ccm_cacrr_reg_addr; + /* CCM divider handshake in-progree reg address */ + void __iomem *ccm_cdhipr_reg_addr; /* PREDIV mask */ u32 prediv_mask; /* PREDIV offset */ diff --git a/arch/arm/plat-mxc/include/mach/system.h b/arch/arm/plat-mxc/include/mach/system.h index 604abbc77da0..126bc8713159 100644 --- a/arch/arm/plat-mxc/include/mach/system.h +++ b/arch/arm/plat-mxc/include/mach/system.h @@ -1,7 +1,7 @@ /* * Copyright (C) 1999 ARM Limited * Copyright (C) 2000 Deep Blue Solutions Ltd - * Copyright 2004-2010 Freescale Semiconductor, Inc. + * Copyright 2004-2008 Freescale Semiconductor, 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 @@ -24,6 +24,5 @@ extern void arch_idle(void); void arch_reset(char mode, const char *cmd); -int mxs_reset_block(void __iomem *hwreg, int just_enable); #endif /* __ASM_ARCH_MXC_SYSTEM_H__ */ diff --git a/arch/arm/plat-mxc/iomux-v3.c b/arch/arm/plat-mxc/iomux-v3.c index b318c6a222d5..77a078f9513f 100644 --- a/arch/arm/plat-mxc/iomux-v3.c +++ b/arch/arm/plat-mxc/iomux-v3.c @@ -29,22 +29,30 @@ #include <asm/mach/map.h> #include <mach/iomux-v3.h> -static void __iomem *base; +#define IOMUX_BASE IO_ADDRESS(IOMUXC_BASE_ADDR) + +static unsigned long iomux_v3_pad_alloc_map[0x200 / BITS_PER_LONG]; /* - * setups a single pad in the iomuxer + * setups a single pin: + * - reserves the pin so that it is not claimed by another driver + * - setups the iomux according to the configuration */ int mxc_iomux_v3_setup_pad(struct pad_desc *pad) { + unsigned int pad_ofs = pad->pad_ctrl_ofs; + + if (test_and_set_bit(pad_ofs >> 2, iomux_v3_pad_alloc_map)) + return -EBUSY; if (pad->mux_ctrl_ofs) - __raw_writel(pad->mux_mode, base + pad->mux_ctrl_ofs); + __raw_writel(pad->mux_mode, IOMUX_BASE + pad->mux_ctrl_ofs); if (pad->select_input_ofs) __raw_writel(pad->select_input, - base + pad->select_input_ofs); + IOMUX_BASE + pad->select_input_ofs); - if (!(pad->pad_ctrl & NO_PAD_CTRL) && pad->pad_ctrl_ofs) - __raw_writel(pad->pad_ctrl, base + pad->pad_ctrl_ofs); + if (!(pad->pad_ctrl & NO_PAD_CTRL)) + __raw_writel(pad->pad_ctrl, IOMUX_BASE + pad->pad_ctrl_ofs); return 0; } EXPORT_SYMBOL(mxc_iomux_v3_setup_pad); @@ -58,14 +66,33 @@ int mxc_iomux_v3_setup_multiple_pads(struct pad_desc *pad_list, unsigned count) for (i = 0; i < count; i++) { ret = mxc_iomux_v3_setup_pad(p); if (ret) - return ret; + goto setup_error; p++; } return 0; + +setup_error: + mxc_iomux_v3_release_multiple_pads(pad_list, i); + return ret; } EXPORT_SYMBOL(mxc_iomux_v3_setup_multiple_pads); -void mxc_iomux_v3_init(void __iomem *iomux_v3_base) +void mxc_iomux_v3_release_pad(struct pad_desc *pad) +{ + unsigned int pad_ofs = pad->pad_ctrl_ofs; + + clear_bit(pad_ofs >> 2, iomux_v3_pad_alloc_map); +} +EXPORT_SYMBOL(mxc_iomux_v3_release_pad); + +void mxc_iomux_v3_release_multiple_pads(struct pad_desc *pad_list, int count) { - base = iomux_v3_base; + struct pad_desc *p = pad_list; + int i; + + for (i = 0; i < count; i++) { + mxc_iomux_v3_release_pad(p); + p++; + } } +EXPORT_SYMBOL(mxc_iomux_v3_release_multiple_pads); diff --git a/arch/arm/plat-mxc/usb_common.c b/arch/arm/plat-mxc/usb_common.c index 71583e465046..af4cf8dc7d98 100644 --- a/arch/arm/plat-mxc/usb_common.c +++ b/arch/arm/plat-mxc/usb_common.c @@ -432,7 +432,14 @@ static int usb_register_remote_wakeup(struct platform_device *pdev) int irq; pr_debug("%s: pdev=0x%p \n", __func__, pdev); - if (!(pdata->wake_up_enable)) + if (!cpu_is_mx51() && !cpu_is_mx25()) + return -ECANCELED; + + /* The Host2 USB controller On mx25 platform + * is no path available from internal USB FS + * PHY to FS PHY wake up interrupt, So to + * remove the function of USB Remote Wakeup on Host2 */ + if (cpu_is_mx25() && (!strcmp("Host 2", pdata->name))) return -ECANCELED; res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); @@ -800,9 +807,9 @@ int usbotg_init(struct platform_device *pdev) pdata->xcvr_type = xops->xcvr_type; pdata->pdev = pdev; - if (fsl_check_usbclk() != 0) - return -EINVAL; if (!otg_used) { + if (fsl_check_usbclk() != 0) + return -EINVAL; if (cpu_is_mx50()) /* Turn on AHB CLK for OTG*/ USB_CLKONOFF_CTRL &= ~OTG_AHBCLK_OFF; @@ -881,8 +888,8 @@ int usb_host_wakeup_irq(struct device *wkup_dev) wakeup_req = USBCTRL & UCTRL_H1WIR; } else if (!strcmp("DR", pdata->name)) { wakeup_req = USBCTRL & UCTRL_OWIR; - /* If not ID wakeup, let udc handle it */ - if (wakeup_req && (UOG_OTGSC & OTGSC_STS_USB_ID)) + /* If DR is in device mode, let udc handle it */ + if (wakeup_req && ((UOG_USBMODE & 0x3) == 0x2)) wakeup_req = 0; } diff --git a/arch/arm/plat-mxs/device.c b/arch/arm/plat-mxs/device.c index e3783d3fe87d..027408950382 100644 --- a/arch/arm/plat-mxs/device.c +++ b/arch/arm/plat-mxs/device.c @@ -485,16 +485,6 @@ static struct platform_device mxs_persistent = { }; #endif -#ifdef CONFIG_FSL_OTP -static struct platform_device otp_device = { - .name = "ocotp", - .id = 0, - .dev = { - .release = mxs_nop_release, - }, -}; -#endif - static inline void mxs_init_busfreq(void) { (void)platform_device_register(&busfreq_device); @@ -576,14 +566,6 @@ static struct mxs_dev_lookup dev_lookup[] = { }, #endif -#if defined(CONFIG_FSL_OTP) - { - .name = "ocotp", - .size = 1, - .pdev = &otp_device, - }, -#endif - #if defined(CONFIG_FB_MXS) || defined(CONFIG_FB_MXS_MODULE) { .name = "mxs-fb", diff --git a/arch/arm/plat-mxs/dma-apbx.c b/arch/arm/plat-mxs/dma-apbx.c index 6d77a6933d98..c27414f8c18d 100644 --- a/arch/arm/plat-mxs/dma-apbx.c +++ b/arch/arm/plat-mxs/dma-apbx.c @@ -99,9 +99,6 @@ static void mxs_dma_apbx_info(struct mxs_dma_device *pdev, reg = __raw_readl(pdev->base + HW_APBX_CTRL2); info->status = reg >> chan; info->buf_addr = __raw_readl(pdev->base + HW_APBX_CHn_BAR(chan)); - reg = __raw_readl(pdev->base + HW_APBX_CHn_CMD(chan)); - info->xfer_count = (reg & BM_APBX_CHn_CMD_XFER_COUNT) >> \ - BP_APBX_CHn_CMD_XFER_COUNT; } static int diff --git a/arch/arm/plat-mxs/dmaengine.c b/arch/arm/plat-mxs/dmaengine.c index 0c2485b18506..52330d3ea9e3 100644 --- a/arch/arm/plat-mxs/dmaengine.c +++ b/arch/arm/plat-mxs/dmaengine.c @@ -127,16 +127,14 @@ int mxs_dma_enable(int channel) if (!(pchan->flags & MXS_DMA_FLAGS_ALLOCATED)) return -EINVAL; - /* - * neednot mutex lock, this function will be called in irq context. - * The mutex may cause process schedule. - */ pdma = pchan->dma; + mutex_lock(&mxs_dma_mutex); spin_lock_irqsave(&pchan->lock, flags); if (pchan->pending_num && pdma->enable) ret = pdma->enable(pchan, channel - pdma->chan_base); pchan->flags |= MXS_DMA_FLAGS_BUSY; spin_unlock_irqrestore(&pchan->lock, flags); + mutex_unlock(&mxs_dma_mutex); return ret; } EXPORT_SYMBOL(mxs_dma_enable); @@ -153,11 +151,8 @@ void mxs_dma_disable(int channel) return; if (!(pchan->flags & MXS_DMA_FLAGS_BUSY)) return; - /* - * neednot mutex lock, this function will be called in irq context. - * The mutex may cause process schedule. - */ pdma = pchan->dma; + mutex_lock(&mxs_dma_mutex); spin_lock_irqsave(&pchan->lock, flags); if (pdma->disable) pdma->disable(pchan, channel - pdma->chan_base); @@ -166,6 +161,7 @@ void mxs_dma_disable(int channel) pchan->pending_num = 0; list_splice_init(&pchan->active, &pchan->done); spin_unlock_irqrestore(&pchan->lock, flags); + mutex_unlock(&mxs_dma_mutex); } EXPORT_SYMBOL(mxs_dma_disable); diff --git a/arch/arm/plat-mxs/include/mach/device.h b/arch/arm/plat-mxs/include/mach/device.h index 199ec1e62963..9598ccdaa718 100644 --- a/arch/arm/plat-mxs/include/mach/device.h +++ b/arch/arm/plat-mxs/include/mach/device.h @@ -54,12 +54,6 @@ struct mxs_dma_plat_data { unsigned int chan_num; }; -struct fsl_otp_data { - char **fuse_name; - char *regulator_name; - unsigned int fuse_num; -}; - struct mxs_i2c_plat_data { unsigned int pioqueue_mode:1; }; diff --git a/arch/arm/plat-mxs/include/mach/dmaengine.h b/arch/arm/plat-mxs/include/mach/dmaengine.h index cdf6b1e32a43..eecd260ac5b4 100644 --- a/arch/arm/plat-mxs/include/mach/dmaengine.h +++ b/arch/arm/plat-mxs/include/mach/dmaengine.h @@ -106,7 +106,6 @@ struct mxs_dma_info { #define MXS_DMA_INFO_ERR 0x00000001 #define MXS_DMA_INFO_ERR_STAT 0x00010000 unsigned int buf_addr; - unsigned int xfer_count; }; /** diff --git a/arch/arm/plat-mxs/include/mach/timex.h b/arch/arm/plat-mxs/include/mach/timex.h index d622dda141f2..9db3d688223a 100644 --- a/arch/arm/plat-mxs/include/mach/timex.h +++ b/arch/arm/plat-mxs/include/mach/timex.h @@ -20,4 +20,4 @@ /* * System time clock is sourced from the 32k clock */ -#define CLOCK_TICK_RATE 32000 +#define CLOCK_TICK_RATE 32768 diff --git a/arch/arm/plat-mxs/timer-nomatch.c b/arch/arm/plat-mxs/timer-nomatch.c index db8906192f16..66c488c99b42 100644 --- a/arch/arm/plat-mxs/timer-nomatch.c +++ b/arch/arm/plat-mxs/timer-nomatch.c @@ -21,7 +21,6 @@ #include <linux/clocksource.h> #include <linux/clockchips.h> #include <linux/io.h> -#include <linux/clk.h> #include <linux/irq.h> #include <linux/interrupt.h> @@ -120,9 +119,9 @@ void mxs_nomatch_timer_init(struct mxs_sys_timer *timer) online_timer = timer; - cksrc_mxs_nomatch.mult = clocksource_hz2mult(clk_get_rate(timer->clk), + cksrc_mxs_nomatch.mult = clocksource_hz2mult(CLOCK_TICK_RATE, cksrc_mxs_nomatch.shift); - ckevt_timrot.mult = div_sc(clk_get_rate(timer->clk), NSEC_PER_SEC, + ckevt_timrot.mult = div_sc(CLOCK_TICK_RATE, NSEC_PER_SEC, ckevt_timrot.shift); ckevt_timrot.min_delta_ns = clockevent_delta2ns(2, &ckevt_timrot); ckevt_timrot.max_delta_ns = clockevent_delta2ns(0xFFF, &ckevt_timrot); @@ -146,7 +145,7 @@ void mxs_nomatch_timer_init(struct mxs_sys_timer *timer) BM_TIMROT_TIMCTRLn_IRQ_EN, online_timer->base + HW_TIMROT_TIMCTRLn(1)); - __raw_writel(clk_get_rate(timer->clk) / HZ - 1, + __raw_writel(CLOCK_TICK_RATE / HZ - 1, online_timer->base + HW_TIMROT_TIMCOUNTn(0)); __raw_writel(0xFFFF, online_timer->base + HW_TIMROT_TIMCOUNTn(1)); @@ -182,7 +181,7 @@ void mxs_nomatch_resume_timer(void) BM_TIMROT_TIMCTRLn_UPDATE | BM_TIMROT_TIMCTRLn_IRQ_EN, online_timer->base + HW_TIMROT_TIMCTRLn(1)); - __raw_writel(clk_get_rate(online_timer->clk) / HZ - 1, + __raw_writel(CLOCK_TICK_RATE / HZ - 1, online_timer->base + HW_TIMROT_TIMCOUNTn(0)); __raw_writel(0xFFFF, online_timer->base + HW_TIMROT_TIMCOUNTn(1)); } diff --git a/arch/arm/plat-mxs/usb_common.c b/arch/arm/plat-mxs/usb_common.c index 23134489472e..5d8d0b6d9285 100644 --- a/arch/arm/plat-mxs/usb_common.c +++ b/arch/arm/plat-mxs/usb_common.c @@ -264,16 +264,13 @@ int usbotg_init(struct platform_device *pdev) pdata->xcvr_type = xops->xcvr_type; pdata->pdev = pdev; + otg_used = 0; if (!otg_used) { pr_debug("%s: grab pins\n", __func__); if (xops->init) xops->init(xops); usb_phy_enable(pdata); } - /* Enable internal Phy clock */ - tmp = __raw_readl(pdata->regs + UOG_PORTSC1); - tmp &= ~PORTSC_PHCD; - __raw_writel(tmp, pdata->regs + UOG_PORTSC1); if (pdata->operating_mode == FSL_USB2_DR_HOST) { /* enable FS/LS device */ @@ -291,22 +288,11 @@ EXPORT_SYMBOL(usbotg_init); void usbotg_uninit(struct fsl_usb2_platform_data *pdata) { - int tmp; - struct clk *usb_clk; pr_debug("%s\n", __func__); if (pdata->xcvr_ops && pdata->xcvr_ops->uninit) pdata->xcvr_ops->uninit(pdata->xcvr_ops); - /* Disable internal Phy clock */ - tmp = __raw_readl(pdata->regs + UOG_PORTSC1); - tmp |= PORTSC_PHCD; - __raw_writel(tmp, pdata->regs + UOG_PORTSC1); - - usb_clk = clk_get(NULL, "usb_clk0"); - clk_disable(usb_clk); - clk_put(usb_clk); - pdata->regs = NULL; otg_used--; } @@ -345,16 +331,11 @@ EXPORT_SYMBOL(fsl_usb_host_init); void fsl_usb_host_uninit(struct fsl_usb2_platform_data *pdata) { - struct clk *usb_clk; pr_debug("%s\n", __func__); if (pdata->xcvr_ops && pdata->xcvr_ops->uninit) pdata->xcvr_ops->uninit(pdata->xcvr_ops); - usb_clk = clk_get(NULL, "usb_clk1"); - clk_disable(usb_clk); - clk_put(usb_clk); - pdata->regs = NULL; } EXPORT_SYMBOL(fsl_usb_host_uninit); diff --git a/arch/arm/plat-mxs/utmixc.c b/arch/arm/plat-mxs/utmixc.c index 8e842840e87a..8ad6bd4f3654 100644 --- a/arch/arm/plat-mxs/utmixc.c +++ b/arch/arm/plat-mxs/utmixc.c @@ -80,7 +80,7 @@ static void __exit utmixc_exit(void) #ifdef CONFIG_MXS_VBUS_CURRENT_DRAW fs_initcall(utmixc_init); #else - subsys_initcall(utmixc_init); + module_init(utmixc_init); #endif module_exit(utmixc_exit); diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types index 817425c8e732..0fa7f761dd1d 100644 --- a/arch/arm/tools/mach-types +++ b/arch/arm/tools/mach-types @@ -2594,7 +2594,6 @@ spacecom1 MACH_SPACECOM1 SPACECOM1 2604 pingu920 MACH_PINGU920 PINGU920 2605 bravoc MACH_BRAVOC BRAVOC 2606 cybo2440 MACH_CYBO2440 CYBO2440 2607 -mx50_arm2 MACH_MX50_ARM2 MX50_ARM2 2955 -mx50_rdp MACH_MX50_RDP MX50_RDP 2988 +mx50_arm2 MACH_MX50_ARM2 MX50_ARM2 2955 diff --git a/arch/cris/Makefile b/arch/cris/Makefile index 71e17d3eeddb..29c2ceb38a76 100644 --- a/arch/cris/Makefile +++ b/arch/cris/Makefile @@ -42,8 +42,6 @@ LD = $(CROSS_COMPILE)ld -mcrislinux OBJCOPYFLAGS := -O binary -R .note -R .comment -S -CPPFLAGS_vmlinux.lds = -DDRAM_VIRTUAL_BASE=0x$(CONFIG_ETRAX_DRAM_VIRTUAL_BASE) - KBUILD_AFLAGS += -mlinux -march=$(arch-y) $(inc) KBUILD_CFLAGS += -mlinux -march=$(arch-y) -pipe $(inc) KBUILD_CPPFLAGS += $(inc) diff --git a/arch/cris/kernel/Makefile b/arch/cris/kernel/Makefile index ee7bcd4d20b2..b45640b3e600 100644 --- a/arch/cris/kernel/Makefile +++ b/arch/cris/kernel/Makefile @@ -3,6 +3,7 @@ # Makefile for the linux kernel. # +CPPFLAGS_vmlinux.lds := -DDRAM_VIRTUAL_BASE=0x$(CONFIG_ETRAX_DRAM_VIRTUAL_BASE) extra-y := vmlinux.lds obj-y := process.o traps.o irq.o ptrace.o setup.o time.o sys_cris.o diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index fb87c08c6b57..2de41c051147 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig @@ -555,7 +555,7 @@ config HPAPCI config MVME147_SCC bool "SCC support for MVME147 serial ports" - depends on MVME147 + depends on MVME147 && BROKEN help This is the driver for the serial ports on the Motorola MVME147 boards. Everyone using one of these boards should say Y here. @@ -570,14 +570,14 @@ config SERIAL167 config MVME162_SCC bool "SCC support for MVME162 serial ports" - depends on MVME16x + depends on MVME16x && BROKEN help This is the driver for the serial ports on the Motorola MVME162 and 172 boards. Everyone using one of these boards should say Y here. config BVME6000_SCC bool "SCC support for BVME6000 serial ports" - depends on BVME6000 + depends on BVME6000 && BROKEN help This is the driver for the serial ports on the BVME4000 and BVME6000 boards from BVM Ltd. Everyone using one of these boards should say diff --git a/arch/mips/Makefile b/arch/mips/Makefile index 861da514a468..7d651d582007 100644 --- a/arch/mips/Makefile +++ b/arch/mips/Makefile @@ -615,16 +615,6 @@ endif cflags-y += -I$(srctree)/arch/mips/include/asm/mach-generic drivers-$(CONFIG_PCI) += arch/mips/pci/ -ifdef CONFIG_32BIT -ifdef CONFIG_CPU_LITTLE_ENDIAN -JIFFIES = jiffies_64 -else -JIFFIES = jiffies_64 + 4 -endif -else -JIFFIES = jiffies_64 -endif - # # Automatically detect the build format. By default we choose # the elf format according to the load address. @@ -648,8 +638,9 @@ ifdef CONFIG_64BIT endif KBUILD_AFLAGS += $(cflags-y) -KBUILD_CFLAGS += $(cflags-y) \ - -D"VMLINUX_LOAD_ADDRESS=$(load-y)" +KBUILD_CFLAGS += $(cflags-y) +KBUILD_CPPFLAGS += -D"VMLINUX_LOAD_ADDRESS=$(load-y)" +KBUILD_CPPFLAGS += -D"DATAOFFSET=$(if $(dataoffset-y),$(dataoffset-y),0)" LDFLAGS += -m $(ld-emul) @@ -664,18 +655,6 @@ endif OBJCOPYFLAGS += --remove-section=.reginfo -# -# Choosing incompatible machines durings configuration will result in -# error messages during linking. Select a default linkscript if -# none has been choosen above. -# - -CPPFLAGS_vmlinux.lds := \ - $(KBUILD_CFLAGS) \ - -D"LOADADDR=$(load-y)" \ - -D"JIFFIES=$(JIFFIES)" \ - -D"DATAOFFSET=$(if $(dataoffset-y),$(dataoffset-y),0)" - head-y := arch/mips/kernel/head.o arch/mips/kernel/init_task.o libs-y += arch/mips/lib/ diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile index e96122159928..eecd2a9f155c 100644 --- a/arch/mips/kernel/Makefile +++ b/arch/mips/kernel/Makefile @@ -2,6 +2,8 @@ # Makefile for the Linux/MIPS kernel. # +CPPFLAGS_vmlinux.lds := $(KBUILD_CFLAGS) + extra-y := head.o init_task.o vmlinux.lds obj-y += cpu-probe.o branch.o entry.o genex.o irq.o process.o \ diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index 58738c8d754f..b245f4663fa1 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S @@ -9,7 +9,16 @@ PHDRS { text PT_LOAD FLAGS(7); /* RWX */ note PT_NOTE FLAGS(4); /* R__ */ } -jiffies = JIFFIES; + +#ifdef CONFIG_32BIT + #ifdef CONFIG_CPU_LITTLE_ENDIAN + jiffies = jiffies_64; + #else + jiffies = jiffies_64 + 4; + #endif +#else + jiffies = jiffies_64; +#endif SECTIONS { @@ -28,7 +37,7 @@ SECTIONS /* . = 0xa800000000300000; */ . = 0xffffffff80300000; #endif - . = LOADADDR; + . = VMLINUX_LOAD_ADDRESS; /* read-only */ _text = .; /* Text and read-only data */ .text : { diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index bc35f4e2b81c..39d44f7ff390 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile @@ -158,8 +158,6 @@ drivers-$(CONFIG_OPROFILE) += arch/powerpc/oprofile/ # Default to zImage, override when needed all: zImage -CPPFLAGS_vmlinux.lds := -Upowerpc - BOOT_TARGETS = zImage zImage.initrd uImage zImage% dtbImage% treeImage.% cuImage.% simpleImage.% PHONY += $(BOOT_TARGETS) diff --git a/arch/powerpc/include/asm/elf.h b/arch/powerpc/include/asm/elf.h index 014a624f4c8e..56985023a47d 100644 --- a/arch/powerpc/include/asm/elf.h +++ b/arch/powerpc/include/asm/elf.h @@ -236,14 +236,10 @@ typedef elf_vrregset_t elf_fpxregset_t; #ifdef __powerpc64__ # define SET_PERSONALITY(ex) \ do { \ - unsigned long new_flags = 0; \ if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \ - new_flags = _TIF_32BIT; \ - if ((current_thread_info()->flags & _TIF_32BIT) \ - != new_flags) \ - set_thread_flag(TIF_ABI_PENDING); \ + set_thread_flag(TIF_32BIT); \ else \ - clear_thread_flag(TIF_ABI_PENDING); \ + clear_thread_flag(TIF_32BIT); \ if (personality(current->personality) != PER_LINUX32) \ set_personality(PER_LINUX | \ (current->personality & (~PER_MASK))); \ diff --git a/arch/powerpc/include/asm/kmap_types.h b/arch/powerpc/include/asm/kmap_types.h index b6bac6f61c16..916369575c97 100644 --- a/arch/powerpc/include/asm/kmap_types.h +++ b/arch/powerpc/include/asm/kmap_types.h @@ -29,5 +29,16 @@ enum km_type { KM_TYPE_NR }; +/* + * This is a temporary build fix that (so they say on lkml....) should no longer + * be required after 2.6.33, because of changes planned to the kmap code. + * Let's try to remove this cruft then. + */ +#ifdef CONFIG_DEBUG_HIGHMEM +#define KM_NMI (-1) +#define KM_NMI_PTE (-1) +#define KM_IRQ_PTE (-1) +#endif + #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_KMAP_TYPES_H */ diff --git a/arch/powerpc/include/asm/mmu-hash64.h b/arch/powerpc/include/asm/mmu-hash64.h index 98c104a09961..edab67ee8e53 100644 --- a/arch/powerpc/include/asm/mmu-hash64.h +++ b/arch/powerpc/include/asm/mmu-hash64.h @@ -41,6 +41,7 @@ extern char initial_stab[]; #define SLB_NUM_BOLTED 3 #define SLB_CACHE_ENTRIES 8 +#define SLB_MIN_SIZE 32 /* Bits in the SLB ESID word */ #define SLB_ESID_V ASM_CONST(0x0000000008000000) /* valid */ @@ -296,6 +297,7 @@ extern void slb_flush_and_rebolt(void); extern void stab_initialize(unsigned long stab); extern void slb_vmalloc_update(void); +extern void slb_set_size(u16 size); #endif /* __ASSEMBLY__ */ /* diff --git a/arch/powerpc/include/asm/pmc.h b/arch/powerpc/include/asm/pmc.h index d6a616a1b3ea..ccc68b50d05d 100644 --- a/arch/powerpc/include/asm/pmc.h +++ b/arch/powerpc/include/asm/pmc.h @@ -27,10 +27,22 @@ extern perf_irq_t perf_irq; int reserve_pmc_hardware(perf_irq_t new_perf_irq); void release_pmc_hardware(void); +void ppc_enable_pmcs(void); #ifdef CONFIG_PPC64 -void power4_enable_pmcs(void); -void pasemi_enable_pmcs(void); +#include <asm/lppaca.h> + +static inline void ppc_set_pmu_inuse(int inuse) +{ + get_lppaca()->pmcregs_in_use = inuse; +} + +extern void power4_enable_pmcs(void); + +#else /* CONFIG_PPC64 */ + +static inline void ppc_set_pmu_inuse(int inuse) { } + #endif #endif /* __KERNEL__ */ diff --git a/arch/powerpc/include/asm/pte-common.h b/arch/powerpc/include/asm/pte-common.h index a7e210b6b48c..0cd2e3433e1c 100644 --- a/arch/powerpc/include/asm/pte-common.h +++ b/arch/powerpc/include/asm/pte-common.h @@ -176,7 +176,7 @@ extern unsigned long bad_call_to_PMD_PAGE_SIZE(void); #define HAVE_PAGE_AGP /* Advertise support for _PAGE_SPECIAL */ -#ifdef _PAGE_SPECIAL +#if _PAGE_SPECIAL != 0 #define __HAVE_ARCH_PTE_SPECIAL #endif diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h index c8b329255678..aa9d383a1c09 100644 --- a/arch/powerpc/include/asm/thread_info.h +++ b/arch/powerpc/include/asm/thread_info.h @@ -111,7 +111,6 @@ static inline struct thread_info *current_thread_info(void) #define TIF_NOTIFY_RESUME 13 /* callback before returning to user */ #define TIF_FREEZE 14 /* Freezing for suspend */ #define TIF_RUNLATCH 15 /* Is the runlatch enabled? */ -#define TIF_ABI_PENDING 16 /* 32/64 bit switch needed */ /* as above, but as bit values */ #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) @@ -129,7 +128,6 @@ static inline struct thread_info *current_thread_info(void) #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) #define _TIF_FREEZE (1<<TIF_FREEZE) #define _TIF_RUNLATCH (1<<TIF_RUNLATCH) -#define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING) #define _TIF_SYSCALL_T_OR_A (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP) #define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \ diff --git a/arch/powerpc/kernel/lparcfg.c b/arch/powerpc/kernel/lparcfg.c index 2419cc706ff1..ed0ac4e4b8d8 100644 --- a/arch/powerpc/kernel/lparcfg.c +++ b/arch/powerpc/kernel/lparcfg.c @@ -35,6 +35,7 @@ #include <asm/prom.h> #include <asm/vdso_datapage.h> #include <asm/vio.h> +#include <asm/mmu.h> #define MODULE_VERS "1.8" #define MODULE_NAME "lparcfg" @@ -537,6 +538,8 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v) seq_printf(m, "shared_processor_mode=%d\n", lppaca[0].shared_proc); + seq_printf(m, "slb_size=%d\n", mmu_slb_size); + return 0; } diff --git a/arch/powerpc/kernel/perf_counter.c b/arch/powerpc/kernel/perf_counter.c index 70e1f57f7dd8..7ceefaf3a7f5 100644 --- a/arch/powerpc/kernel/perf_counter.c +++ b/arch/powerpc/kernel/perf_counter.c @@ -32,6 +32,9 @@ struct cpu_hw_counters { unsigned long mmcr[3]; struct perf_counter *limited_counter[MAX_LIMITED_HWCOUNTERS]; u8 limited_hwidx[MAX_LIMITED_HWCOUNTERS]; + u64 alternatives[MAX_HWCOUNTERS][MAX_EVENT_ALTERNATIVES]; + unsigned long amasks[MAX_HWCOUNTERS][MAX_EVENT_ALTERNATIVES]; + unsigned long avalues[MAX_HWCOUNTERS][MAX_EVENT_ALTERNATIVES]; }; DEFINE_PER_CPU(struct cpu_hw_counters, cpu_hw_counters); @@ -62,7 +65,6 @@ static inline unsigned long perf_ip_adjust(struct pt_regs *regs) { return 0; } -static inline void perf_set_pmu_inuse(int inuse) { } static inline void perf_get_data_addr(struct pt_regs *regs, u64 *addrp) { } static inline u32 perf_get_misc_flags(struct pt_regs *regs) { @@ -93,11 +95,6 @@ static inline unsigned long perf_ip_adjust(struct pt_regs *regs) return 0; } -static inline void perf_set_pmu_inuse(int inuse) -{ - get_lppaca()->pmcregs_in_use = inuse; -} - /* * The user wants a data address recorded. * If we're not doing instruction sampling, give them the SDAR @@ -245,13 +242,11 @@ static void write_pmc(int idx, unsigned long val) * and see if any combination of alternative codes is feasible. * The feasible set is returned in event[]. */ -static int power_check_constraints(u64 event[], unsigned int cflags[], +static int power_check_constraints(struct cpu_hw_counters *cpuhw, + u64 event[], unsigned int cflags[], int n_ev) { unsigned long mask, value, nv; - u64 alternatives[MAX_HWCOUNTERS][MAX_EVENT_ALTERNATIVES]; - unsigned long amasks[MAX_HWCOUNTERS][MAX_EVENT_ALTERNATIVES]; - unsigned long avalues[MAX_HWCOUNTERS][MAX_EVENT_ALTERNATIVES]; unsigned long smasks[MAX_HWCOUNTERS], svalues[MAX_HWCOUNTERS]; int n_alt[MAX_HWCOUNTERS], choice[MAX_HWCOUNTERS]; int i, j; @@ -266,21 +261,23 @@ static int power_check_constraints(u64 event[], unsigned int cflags[], if ((cflags[i] & PPMU_LIMITED_PMC_REQD) && !ppmu->limited_pmc_event(event[i])) { ppmu->get_alternatives(event[i], cflags[i], - alternatives[i]); - event[i] = alternatives[i][0]; + cpuhw->alternatives[i]); + event[i] = cpuhw->alternatives[i][0]; } - if (ppmu->get_constraint(event[i], &amasks[i][0], - &avalues[i][0])) + if (ppmu->get_constraint(event[i], &cpuhw->amasks[i][0], + &cpuhw->avalues[i][0])) return -1; } value = mask = 0; for (i = 0; i < n_ev; ++i) { - nv = (value | avalues[i][0]) + (value & avalues[i][0] & addf); + nv = (value | cpuhw->avalues[i][0]) + + (value & cpuhw->avalues[i][0] & addf); if ((((nv + tadd) ^ value) & mask) != 0 || - (((nv + tadd) ^ avalues[i][0]) & amasks[i][0]) != 0) + (((nv + tadd) ^ cpuhw->avalues[i][0]) & + cpuhw->amasks[i][0]) != 0) break; value = nv; - mask |= amasks[i][0]; + mask |= cpuhw->amasks[i][0]; } if (i == n_ev) return 0; /* all OK */ @@ -291,10 +288,11 @@ static int power_check_constraints(u64 event[], unsigned int cflags[], for (i = 0; i < n_ev; ++i) { choice[i] = 0; n_alt[i] = ppmu->get_alternatives(event[i], cflags[i], - alternatives[i]); + cpuhw->alternatives[i]); for (j = 1; j < n_alt[i]; ++j) - ppmu->get_constraint(alternatives[i][j], - &amasks[i][j], &avalues[i][j]); + ppmu->get_constraint(cpuhw->alternatives[i][j], + &cpuhw->amasks[i][j], + &cpuhw->avalues[i][j]); } /* enumerate all possibilities and see if any will work */ @@ -313,11 +311,11 @@ static int power_check_constraints(u64 event[], unsigned int cflags[], * where k > j, will satisfy the constraints. */ while (++j < n_alt[i]) { - nv = (value | avalues[i][j]) + - (value & avalues[i][j] & addf); + nv = (value | cpuhw->avalues[i][j]) + + (value & cpuhw->avalues[i][j] & addf); if ((((nv + tadd) ^ value) & mask) == 0 && - (((nv + tadd) ^ avalues[i][j]) - & amasks[i][j]) == 0) + (((nv + tadd) ^ cpuhw->avalues[i][j]) + & cpuhw->amasks[i][j]) == 0) break; } if (j >= n_alt[i]) { @@ -339,7 +337,7 @@ static int power_check_constraints(u64 event[], unsigned int cflags[], svalues[i] = value; smasks[i] = mask; value = nv; - mask |= amasks[i][j]; + mask |= cpuhw->amasks[i][j]; ++i; j = -1; } @@ -347,7 +345,7 @@ static int power_check_constraints(u64 event[], unsigned int cflags[], /* OK, we have a feasible combination, tell the caller the solution */ for (i = 0; i < n_ev; ++i) - event[i] = alternatives[i][choice[i]]; + event[i] = cpuhw->alternatives[i][choice[i]]; return 0; } @@ -531,8 +529,7 @@ void hw_perf_disable(void) * Check if we ever enabled the PMU on this cpu. */ if (!cpuhw->pmcs_enabled) { - if (ppc_md.enable_pmcs) - ppc_md.enable_pmcs(); + ppc_enable_pmcs(); cpuhw->pmcs_enabled = 1; } @@ -594,7 +591,7 @@ void hw_perf_enable(void) mtspr(SPRN_MMCRA, cpuhw->mmcr[2] & ~MMCRA_SAMPLE_ENABLE); mtspr(SPRN_MMCR1, cpuhw->mmcr[1]); if (cpuhw->n_counters == 0) - perf_set_pmu_inuse(0); + ppc_set_pmu_inuse(0); goto out_enable; } @@ -627,7 +624,7 @@ void hw_perf_enable(void) * bit set and set the hardware counters to their initial values. * Then unfreeze the counters. */ - perf_set_pmu_inuse(1); + ppc_set_pmu_inuse(1); mtspr(SPRN_MMCRA, cpuhw->mmcr[2] & ~MMCRA_SAMPLE_ENABLE); mtspr(SPRN_MMCR1, cpuhw->mmcr[1]); mtspr(SPRN_MMCR0, (cpuhw->mmcr[0] & ~(MMCR0_PMC1CE | MMCR0_PMCjCE)) @@ -752,7 +749,7 @@ int hw_perf_group_sched_in(struct perf_counter *group_leader, return -EAGAIN; if (check_excludes(cpuhw->counter, cpuhw->flags, n0, n)) return -EAGAIN; - i = power_check_constraints(cpuhw->events, cpuhw->flags, n + n0); + i = power_check_constraints(cpuhw, cpuhw->events, cpuhw->flags, n + n0); if (i < 0) return -EAGAIN; cpuhw->n_counters = n0 + n; @@ -807,7 +804,7 @@ static int power_pmu_enable(struct perf_counter *counter) cpuhw->flags[n0] = counter->hw.counter_base; if (check_excludes(cpuhw->counter, cpuhw->flags, n0, 1)) goto out; - if (power_check_constraints(cpuhw->events, cpuhw->flags, n0 + 1)) + if (power_check_constraints(cpuhw, cpuhw->events, cpuhw->flags, n0 + 1)) goto out; counter->hw.config = cpuhw->events[n0]; @@ -1012,6 +1009,7 @@ const struct pmu *hw_perf_counter_init(struct perf_counter *counter) unsigned int cflags[MAX_HWCOUNTERS]; int n; int err; + struct cpu_hw_counters *cpuhw; if (!ppmu) return ERR_PTR(-ENXIO); @@ -1090,7 +1088,11 @@ const struct pmu *hw_perf_counter_init(struct perf_counter *counter) cflags[n] = flags; if (check_excludes(ctrs, cflags, n, 1)) return ERR_PTR(-EINVAL); - if (power_check_constraints(events, cflags, n + 1)) + + cpuhw = &get_cpu_var(cpu_hw_counters); + err = power_check_constraints(cpuhw, events, cflags, n + 1); + put_cpu_var(cpu_hw_counters); + if (err) return ERR_PTR(-EINVAL); counter->hw.config = events[n]; diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 892a9f2e6d76..1ea56fdccef4 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c @@ -554,18 +554,6 @@ void exit_thread(void) void flush_thread(void) { -#ifdef CONFIG_PPC64 - struct thread_info *t = current_thread_info(); - - if (test_ti_thread_flag(t, TIF_ABI_PENDING)) { - clear_ti_thread_flag(t, TIF_ABI_PENDING); - if (test_ti_thread_flag(t, TIF_32BIT)) - clear_ti_thread_flag(t, TIF_32BIT); - else - set_ti_thread_flag(t, TIF_32BIT); - } -#endif - discard_lazy_cpu_state(); if (current->thread.dabr) { diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c index c434823b8c83..bf90361bb70f 100644 --- a/arch/powerpc/kernel/rtas.c +++ b/arch/powerpc/kernel/rtas.c @@ -39,6 +39,7 @@ #include <asm/smp.h> #include <asm/atomic.h> #include <asm/time.h> +#include <asm/mmu.h> struct rtas_t rtas = { .lock = __RAW_SPIN_LOCK_UNLOCKED @@ -713,6 +714,7 @@ static void rtas_percpu_suspend_me(void *info) { long rc = H_SUCCESS; unsigned long msr_save; + u16 slb_size = mmu_slb_size; int cpu; struct rtas_suspend_me_data *data = (struct rtas_suspend_me_data *)info; @@ -735,13 +737,16 @@ static void rtas_percpu_suspend_me(void *info) /* All other cpus are in H_JOIN, this cpu does * the suspend. */ + slb_set_size(SLB_MIN_SIZE); printk(KERN_DEBUG "calling ibm,suspend-me on cpu %i\n", smp_processor_id()); data->error = rtas_call(data->token, 0, 1, NULL); - if (data->error) + if (data->error) { printk(KERN_DEBUG "ibm,suspend-me returned %d\n", data->error); + slb_set_size(slb_size); + } } else { printk(KERN_ERR "H_JOIN on cpu %i failed with rc = %ld\n", smp_processor_id(), rc); diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c index f41aec85aa49..956ab33fd73f 100644 --- a/arch/powerpc/kernel/sysfs.c +++ b/arch/powerpc/kernel/sysfs.c @@ -17,6 +17,7 @@ #include <asm/prom.h> #include <asm/machdep.h> #include <asm/smp.h> +#include <asm/pmc.h> #include "cacheinfo.h" @@ -123,6 +124,8 @@ static DEFINE_PER_CPU(char, pmcs_enabled); void ppc_enable_pmcs(void) { + ppc_set_pmu_inuse(1); + /* Only need to enable them once */ if (__get_cpu_var(pmcs_enabled)) return; diff --git a/arch/powerpc/kernel/vector.S b/arch/powerpc/kernel/vector.S index ea4d64644d02..419f492cb586 100644 --- a/arch/powerpc/kernel/vector.S +++ b/arch/powerpc/kernel/vector.S @@ -58,7 +58,7 @@ _GLOBAL(load_up_altivec) * all 1's */ mfspr r4,SPRN_VRSAVE - cmpdi 0,r4,0 + cmpwi 0,r4,0 bne+ 1f li r4,-1 mtspr SPRN_VRSAVE,r4 diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c index 627767d6169b..d8e672567f7e 100644 --- a/arch/powerpc/mm/pgtable.c +++ b/arch/powerpc/mm/pgtable.c @@ -30,6 +30,8 @@ #include <asm/tlbflush.h> #include <asm/tlb.h> +#include "mmu_decl.h" + static DEFINE_PER_CPU(struct pte_freelist_batch *, pte_freelist_cur); static unsigned long pte_freelist_forced_free; @@ -119,7 +121,7 @@ void pte_free_finish(void) /* * Handle i/d cache flushing, called from set_pte_at() or ptep_set_access_flags() */ -static pte_t do_dcache_icache_coherency(pte_t pte) +static pte_t do_dcache_icache_coherency(pte_t pte, unsigned long addr) { unsigned long pfn = pte_pfn(pte); struct page *page; @@ -128,6 +130,17 @@ static pte_t do_dcache_icache_coherency(pte_t pte) return pte; page = pfn_to_page(pfn); +#ifdef CONFIG_8xx + /* On 8xx, cache control instructions (particularly + * "dcbst" from flush_dcache_icache) fault as write + * operation if there is an unpopulated TLB entry + * for the address in question. To workaround that, + * we invalidate the TLB here, thus avoiding dcbst + * misbehaviour. + */ + _tlbil_va(addr, 0 /* 8xx doesn't care about PID */); +#endif + if (!PageReserved(page) && !test_bit(PG_arch_1, &page->flags)) { pr_devel("do_dcache_icache_coherency... flushing\n"); flush_dcache_icache_page(page); @@ -198,7 +211,7 @@ void set_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte */ pte = __pte(pte_val(pte) & ~_PAGE_HPTEFLAGS); if (pte_need_exec_flush(pte, 1)) - pte = do_dcache_icache_coherency(pte); + pte = do_dcache_icache_coherency(pte, addr); /* Perform the setting of the PTE */ __set_pte_at(mm, addr, ptep, pte, 0); @@ -216,7 +229,7 @@ int ptep_set_access_flags(struct vm_area_struct *vma, unsigned long address, { int changed; if (!dirty && pte_need_exec_flush(entry, 0)) - entry = do_dcache_icache_coherency(entry); + entry = do_dcache_icache_coherency(entry, address); changed = !pte_same(*(ptep), entry); if (changed) { if (!(vma->vm_flags & VM_HUGETLB)) diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c index 5b7038f248b6..deb619323f84 100644 --- a/arch/powerpc/mm/slb.c +++ b/arch/powerpc/mm/slb.c @@ -240,14 +240,22 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm) static inline void patch_slb_encoding(unsigned int *insn_addr, unsigned int immed) { - /* Assume the instruction had a "0" immediate value, just - * "or" in the new value - */ - *insn_addr |= immed; + *insn_addr = (*insn_addr & 0xffff0000) | immed; flush_icache_range((unsigned long)insn_addr, 4+ (unsigned long)insn_addr); } +void slb_set_size(u16 size) +{ + extern unsigned int *slb_compare_rr_to_size; + + if (mmu_slb_size == size) + return; + + mmu_slb_size = size; + patch_slb_encoding(slb_compare_rr_to_size, mmu_slb_size); +} + void slb_initialize(void) { unsigned long linear_llp, vmalloc_llp, io_llp; diff --git a/arch/powerpc/platforms/powermac/cpufreq_32.c b/arch/powerpc/platforms/powermac/cpufreq_32.c index 65c585b8b00d..08d94e4cedd3 100644 --- a/arch/powerpc/platforms/powermac/cpufreq_32.c +++ b/arch/powerpc/platforms/powermac/cpufreq_32.c @@ -44,14 +44,6 @@ */ #undef DEBUG_FREQ -/* - * There is a problem with the core cpufreq code on SMP kernels, - * it won't recalculate the Bogomips properly - */ -#ifdef CONFIG_SMP -#warning "WARNING, CPUFREQ not recommended on SMP kernels" -#endif - extern void low_choose_7447a_dfs(int dfs); extern void low_choose_750fx_pll(int pll); extern void low_sleep_handler(void); diff --git a/arch/powerpc/platforms/powermac/low_i2c.c b/arch/powerpc/platforms/powermac/low_i2c.c index 21226b74c9b2..414ca9849f23 100644 --- a/arch/powerpc/platforms/powermac/low_i2c.c +++ b/arch/powerpc/platforms/powermac/low_i2c.c @@ -540,8 +540,11 @@ static struct pmac_i2c_host_kw *__init kw_i2c_host_init(struct device_node *np) /* Make sure IRQ is disabled */ kw_write_reg(reg_ier, 0); - /* Request chip interrupt */ - if (request_irq(host->irq, kw_i2c_irq, 0, "keywest i2c", host)) + /* Request chip interrupt. We set IRQF_TIMER because we don't + * want that interrupt disabled between the 2 passes of driver + * suspend or we'll have issues running the pfuncs + */ + if (request_irq(host->irq, kw_i2c_irq, IRQF_TIMER, "keywest i2c", host)) host->irq = NO_IRQ; printk(KERN_INFO "KeyWest i2c @0x%08x irq %d %s\n", diff --git a/arch/powerpc/platforms/powermac/pci.c b/arch/powerpc/platforms/powermac/pci.c index 04cdd32624d4..e81403b245b5 100644 --- a/arch/powerpc/platforms/powermac/pci.c +++ b/arch/powerpc/platforms/powermac/pci.c @@ -1286,3 +1286,64 @@ static void fixup_k2_sata(struct pci_dev* dev) } DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SERVERWORKS, 0x0240, fixup_k2_sata); +/* + * On U4 (aka CPC945) the PCIe root complex "P2P" bridge resource ranges aren't + * configured by the firmware. The bridge itself seems to ignore them but it + * causes problems with Linux which then re-assigns devices below the bridge, + * thus changing addresses of those devices from what was in the device-tree, + * which sucks when those are video cards using offb + * + * We could just mark it transparent but I prefer fixing up the resources to + * properly show what's going on here, as I have some doubts about having them + * badly configured potentially being an issue for DMA. + * + * We leave PIO alone, it seems to be fine + * + * Oh and there's another funny bug. The OF properties advertize the region + * 0xf1000000..0xf1ffffff as being forwarded as memory space. But that's + * actually not true, this region is the memory mapped config space. So we + * also need to filter it out or we'll map things in the wrong place. + */ +static void fixup_u4_pcie(struct pci_dev* dev) +{ + struct pci_controller *host = pci_bus_to_host(dev->bus); + struct resource *region = NULL; + u32 reg; + int i; + + /* Only do that on PowerMac */ + if (!machine_is(powermac)) + return; + + /* Find the largest MMIO region */ + for (i = 0; i < 3; i++) { + struct resource *r = &host->mem_resources[i]; + if (!(r->flags & IORESOURCE_MEM)) + continue; + /* Skip the 0xf0xxxxxx..f2xxxxxx regions, we know they + * are reserved by HW for other things + */ + if (r->start >= 0xf0000000 && r->start < 0xf3000000) + continue; + if (!region || (r->end - r->start) > + (region->end - region->start)) + region = r; + } + /* Nothing found, bail */ + if (region == 0) + return; + + /* Print things out */ + printk(KERN_INFO "PCI: Fixup U4 PCIe bridge range: %pR\n", region); + + /* Fixup bridge config space. We know it's a Mac, resource aren't + * offset so let's just blast them as-is. We also know that they + * fit in 32 bits + */ + reg = ((region->start >> 16) & 0xfff0) | (region->end & 0xfff00000); + pci_write_config_dword(dev, PCI_MEMORY_BASE, reg); + pci_write_config_dword(dev, PCI_PREF_BASE_UPPER32, 0); + pci_write_config_dword(dev, PCI_PREF_LIMIT_UPPER32, 0); + pci_write_config_dword(dev, PCI_PREF_MEMORY_BASE, 0); +} +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_U4_PCIE, fixup_u4_pcie); diff --git a/arch/powerpc/platforms/powermac/smp.c b/arch/powerpc/platforms/powermac/smp.c index 6d4da7b46b41..937a38e73178 100644 --- a/arch/powerpc/platforms/powermac/smp.c +++ b/arch/powerpc/platforms/powermac/smp.c @@ -408,7 +408,7 @@ static void __init smp_psurge_setup_cpu(int cpu_nr) /* reset the entry point so if we get another intr we won't * try to startup again */ out_be32(psurge_start, 0x100); - if (setup_irq(30, &psurge_irqaction)) + if (setup_irq(irq_create_mapping(NULL, 30), &psurge_irqaction)) printk(KERN_ERR "Couldn't get primary IPI interrupt"); } diff --git a/arch/powerpc/platforms/pseries/msi.c b/arch/powerpc/platforms/pseries/msi.c index bf2e1ac41308..1164c3430f2c 100644 --- a/arch/powerpc/platforms/pseries/msi.c +++ b/arch/powerpc/platforms/pseries/msi.c @@ -432,8 +432,6 @@ static int rtas_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type) /* Read config space back so we can restore after reset */ read_msi_msg(virq, &msg); entry->msg = msg; - - unmask_msi_irq(virq); } return 0; diff --git a/arch/powerpc/platforms/pseries/reconfig.c b/arch/powerpc/platforms/pseries/reconfig.c index b6f1b137d427..2e2bbe120b90 100644 --- a/arch/powerpc/platforms/pseries/reconfig.c +++ b/arch/powerpc/platforms/pseries/reconfig.c @@ -20,6 +20,7 @@ #include <asm/machdep.h> #include <asm/uaccess.h> #include <asm/pSeries_reconfig.h> +#include <asm/mmu.h> @@ -439,9 +440,15 @@ static int do_update_property(char *buf, size_t bufsize) if (!newprop) return -ENOMEM; + if (!strcmp(name, "slb-size") || !strcmp(name, "ibm,slb-size")) + slb_set_size(*(int *)value); + oldprop = of_find_property(np, name,NULL); - if (!oldprop) + if (!oldprop) { + if (strlen(name)) + return prom_add_property(np, newprop); return -ENODEV; + } rc = prom_update_property(np, newprop, oldprop); if (rc) diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index 8d75ea21296f..ca5f2e10972c 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c @@ -223,10 +223,6 @@ static void pseries_lpar_enable_pmcs(void) set = 1UL << 63; reset = 0; plpar_hcall_norets(H_PERFMON, set, reset); - - /* instruct hypervisor to maintain PMCs */ - if (firmware_has_feature(FW_FEATURE_SPLPAR)) - get_lppaca()->pmcregs_in_use = 1; } static void __init pseries_discover_pic(void) diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c index 419f8a637ffe..b9bf0eedccf2 100644 --- a/arch/powerpc/platforms/pseries/xics.c +++ b/arch/powerpc/platforms/pseries/xics.c @@ -18,6 +18,7 @@ #include <linux/init.h> #include <linux/radix-tree.h> #include <linux/cpu.h> +#include <linux/msi.h> #include <linux/of.h> #include <asm/firmware.h> @@ -219,6 +220,14 @@ static void xics_unmask_irq(unsigned int virq) static unsigned int xics_startup(unsigned int virq) { + /* + * The generic MSI code returns with the interrupt disabled on the + * card, using the MSI mask bits. Firmware doesn't appear to unmask + * at that level, so we do it here by hand. + */ + if (irq_to_desc(virq)->msi_desc) + unmask_msi_irq(virq); + /* unmask it */ xics_unmask_irq(virq); return 0; diff --git a/arch/s390/include/asm/kvm.h b/arch/s390/include/asm/kvm.h index 0b2f829f6d50..1e313567d1ee 100644 --- a/arch/s390/include/asm/kvm.h +++ b/arch/s390/include/asm/kvm.h @@ -1,6 +1,5 @@ #ifndef __LINUX_KVM_S390_H #define __LINUX_KVM_S390_H - /* * asm-s390/kvm.h - KVM s390 specific structures and definitions * @@ -24,6 +23,8 @@ struct kvm_ioapic_state { /* no IOAPIC for s390 */ }; +#define __KVM_S390 + /* for KVM_GET_REGS and KVM_SET_REGS */ struct kvm_regs { /* general purpose regs for s390 */ diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 90d9d1ba258b..475fc2986a46 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -115,10 +115,16 @@ long kvm_arch_dev_ioctl(struct file *filp, int kvm_dev_ioctl_check_extension(long ext) { + int r; + switch (ext) { + case KVM_CAP_S390_PSW: + r = 1; + break; default: - return 0; + r = 0; } + return r; } /* Section: vm related */ @@ -422,8 +428,10 @@ static int kvm_arch_vcpu_ioctl_set_initial_psw(struct kvm_vcpu *vcpu, psw_t psw) vcpu_load(vcpu); if (atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_RUNNING) rc = -EBUSY; - else - vcpu->arch.sie_block->gpsw = psw; + else { + vcpu->run->psw_mask = psw.mask; + vcpu->run->psw_addr = psw.addr; + } vcpu_put(vcpu); return rc; } @@ -505,9 +513,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) switch (kvm_run->exit_reason) { case KVM_EXIT_S390_SIEIC: - vcpu->arch.sie_block->gpsw.mask = kvm_run->s390_sieic.mask; - vcpu->arch.sie_block->gpsw.addr = kvm_run->s390_sieic.addr; - break; case KVM_EXIT_UNKNOWN: case KVM_EXIT_S390_RESET: break; @@ -515,6 +520,9 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) BUG(); } + vcpu->arch.sie_block->gpsw.mask = kvm_run->psw_mask; + vcpu->arch.sie_block->gpsw.addr = kvm_run->psw_addr; + might_fault(); do { @@ -529,8 +537,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) /* intercept cannot be handled in-kernel, prepare kvm-run */ kvm_run->exit_reason = KVM_EXIT_S390_SIEIC; kvm_run->s390_sieic.icptcode = vcpu->arch.sie_block->icptcode; - kvm_run->s390_sieic.mask = vcpu->arch.sie_block->gpsw.mask; - kvm_run->s390_sieic.addr = vcpu->arch.sie_block->gpsw.addr; kvm_run->s390_sieic.ipa = vcpu->arch.sie_block->ipa; kvm_run->s390_sieic.ipb = vcpu->arch.sie_block->ipb; rc = 0; @@ -542,6 +548,9 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) rc = 0; } + kvm_run->psw_mask = vcpu->arch.sie_block->gpsw.mask; + kvm_run->psw_addr = vcpu->arch.sie_block->gpsw.addr; + if (vcpu->sigset_active) sigprocmask(SIG_SETMASK, &sigsaved, NULL); diff --git a/arch/sh/kernel/process_64.c b/arch/sh/kernel/process_64.c index 24de74214940..54a5abf123f3 100644 --- a/arch/sh/kernel/process_64.c +++ b/arch/sh/kernel/process_64.c @@ -367,7 +367,7 @@ void exit_thread(void) void flush_thread(void) { - /* Called by fs/exec.c (flush_old_exec) to remove traces of a + /* Called by fs/exec.c (setup_new_exec) to remove traces of a * previously running executable. */ #ifdef CONFIG_SH_FPU if (last_task_used_math == current) { diff --git a/arch/sparc/Makefile b/arch/sparc/Makefile index 2003ded054c2..ef9a6b02235f 100644 --- a/arch/sparc/Makefile +++ b/arch/sparc/Makefile @@ -27,11 +27,11 @@ AS := $(AS) -32 LDFLAGS := -m elf32_sparc CHECKFLAGS += -D__sparc__ export BITS := 32 +UTS_MACHINE := sparc #KBUILD_CFLAGS += -g -pipe -fcall-used-g5 -fcall-used-g7 KBUILD_CFLAGS += -m32 -pipe -mno-fpu -fcall-used-g5 -fcall-used-g7 KBUILD_AFLAGS += -m32 -CPPFLAGS_vmlinux.lds += -m32 #LDFLAGS_vmlinux = -N -Ttext 0xf0004000 # Since 2.5.40, the first stage is left not btfix-ed. @@ -49,11 +49,9 @@ else CHECKFLAGS += -D__sparc__ -D__sparc_v9__ -D__arch64__ -m64 -# Undefine sparc when processing vmlinux.lds - it is used -# And teach CPP we are doing 64 bit builds (for this case) -CPPFLAGS_vmlinux.lds += -m64 -Usparc LDFLAGS := -m elf64_sparc export BITS := 64 +UTS_MACHINE := sparc64 KBUILD_CFLAGS += -m64 -pipe -mno-fpu -mcpu=ultrasparc -mcmodel=medlow \ -ffixed-g4 -ffixed-g5 -fcall-used-g7 -Wno-sign-compare \ diff --git a/arch/sparc/include/asm/elf_64.h b/arch/sparc/include/asm/elf_64.h index d42e393078c4..996808587914 100644 --- a/arch/sparc/include/asm/elf_64.h +++ b/arch/sparc/include/asm/elf_64.h @@ -196,17 +196,10 @@ static inline unsigned int sparc64_elf_hwcap(void) #define ELF_PLATFORM (NULL) #define SET_PERSONALITY(ex) \ -do { unsigned long new_flags = current_thread_info()->flags; \ - new_flags &= _TIF_32BIT; \ - if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \ - new_flags |= _TIF_32BIT; \ +do { if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \ + set_thread_flag(TIF_32BIT); \ else \ - new_flags &= ~_TIF_32BIT; \ - if ((current_thread_info()->flags & _TIF_32BIT) \ - != new_flags) \ - set_thread_flag(TIF_ABI_PENDING); \ - else \ - clear_thread_flag(TIF_ABI_PENDING); \ + clear_thread_flag(TIF_32BIT); \ /* flush_thread will update pgd cache */ \ if (personality(current->personality) != PER_LINUX32) \ set_personality(PER_LINUX | \ diff --git a/arch/sparc/include/asm/thread_info_64.h b/arch/sparc/include/asm/thread_info_64.h index 1b45a7bbe407..f78ad9a1b497 100644 --- a/arch/sparc/include/asm/thread_info_64.h +++ b/arch/sparc/include/asm/thread_info_64.h @@ -227,12 +227,11 @@ register struct thread_info *current_thread_info_reg asm("g6"); /* flag bit 8 is available */ #define TIF_SECCOMP 9 /* secure computing */ #define TIF_SYSCALL_AUDIT 10 /* syscall auditing active */ -/* flag bit 11 is available */ /* NOTE: Thread flags >= 12 should be ones we have no interest * in using in assembly, else we can't use the mask as * an immediate value in instructions such as andcc. */ -#define TIF_ABI_PENDING 12 +/* flag bit 12 is available */ #define TIF_MEMDIE 13 #define TIF_POLLING_NRFLAG 14 #define TIF_FREEZE 15 /* is freezing for suspend */ @@ -246,7 +245,6 @@ register struct thread_info *current_thread_info_reg asm("g6"); #define _TIF_32BIT (1<<TIF_32BIT) #define _TIF_SECCOMP (1<<TIF_SECCOMP) #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) -#define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING) #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) #define _TIF_FREEZE (1<<TIF_FREEZE) diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile index 475ce4696acd..cbf5d0b541dd 100644 --- a/arch/sparc/kernel/Makefile +++ b/arch/sparc/kernel/Makefile @@ -7,7 +7,11 @@ ccflags-y := -Werror extra-y := head_$(BITS).o extra-y += init_task.o -extra-y += vmlinux.lds + +# Undefine sparc when processing vmlinux.lds - it is used +# And teach CPP we are doing $(BITS) builds (for this case) +CPPFLAGS_vmlinux.lds := -Usparc -m$(BITS) +extra-y += vmlinux.lds obj-$(CONFIG_SPARC32) += entry.o wof.o wuf.o obj-$(CONFIG_SPARC32) += etrap_32.o diff --git a/arch/sparc/kernel/ldc.c b/arch/sparc/kernel/ldc.c index adf5f273868a..e0ba898e30cf 100644 --- a/arch/sparc/kernel/ldc.c +++ b/arch/sparc/kernel/ldc.c @@ -1242,13 +1242,13 @@ int ldc_bind(struct ldc_channel *lp, const char *name) snprintf(lp->tx_irq_name, LDC_IRQ_NAME_MAX, "%s TX", name); err = request_irq(lp->cfg.rx_irq, ldc_rx, - IRQF_SAMPLE_RANDOM | IRQF_SHARED, + IRQF_SAMPLE_RANDOM | IRQF_DISABLED, lp->rx_irq_name, lp); if (err) return err; err = request_irq(lp->cfg.tx_irq, ldc_tx, - IRQF_SAMPLE_RANDOM | IRQF_SHARED, + IRQF_SAMPLE_RANDOM | IRQF_DISABLED, lp->tx_irq_name, lp); if (err) { free_irq(lp->cfg.rx_irq, lp); diff --git a/arch/sparc/kernel/of_device_64.c b/arch/sparc/kernel/of_device_64.c index 881947e59e95..0a6f2d1798d1 100644 --- a/arch/sparc/kernel/of_device_64.c +++ b/arch/sparc/kernel/of_device_64.c @@ -104,9 +104,19 @@ static int of_bus_pci_map(u32 *addr, const u32 *range, int i; /* Check address type match */ - if ((addr[0] ^ range[0]) & 0x03000000) - return -EINVAL; + if (!((addr[0] ^ range[0]) & 0x03000000)) + goto type_match; + + /* Special exception, we can map a 64-bit address into + * a 32-bit range. + */ + if ((addr[0] & 0x03000000) == 0x03000000 && + (range[0] & 0x03000000) == 0x02000000) + goto type_match; + + return -EINVAL; +type_match: if (of_out_of_range(addr + 1, range + 1, range + na + pna, na - 1, ns)) return -EINVAL; diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c index 4041f94e7724..3714fdb5b16b 100644 --- a/arch/sparc/kernel/process_64.c +++ b/arch/sparc/kernel/process_64.c @@ -365,14 +365,6 @@ void flush_thread(void) struct thread_info *t = current_thread_info(); struct mm_struct *mm; - if (test_ti_thread_flag(t, TIF_ABI_PENDING)) { - clear_ti_thread_flag(t, TIF_ABI_PENDING); - if (test_ti_thread_flag(t, TIF_32BIT)) - clear_ti_thread_flag(t, TIF_32BIT); - else - set_ti_thread_flag(t, TIF_32BIT); - } - mm = t->task->mm; if (mm) tsb_context_switch(mm); diff --git a/arch/sparc/kernel/prom_common.c b/arch/sparc/kernel/prom_common.c index 0fb5789d43c8..7b4adbc63b4c 100644 --- a/arch/sparc/kernel/prom_common.c +++ b/arch/sparc/kernel/prom_common.c @@ -76,6 +76,7 @@ int of_set_property(struct device_node *dp, const char *name, void *val, int len err = -ENODEV; + mutex_lock(&of_set_property_mutex); write_lock(&devtree_lock); prevp = &dp->properties; while (*prevp) { @@ -85,9 +86,7 @@ int of_set_property(struct device_node *dp, const char *name, void *val, int len void *old_val = prop->value; int ret; - mutex_lock(&of_set_property_mutex); ret = prom_setprop(dp->node, name, val, len); - mutex_unlock(&of_set_property_mutex); err = -EINVAL; if (ret >= 0) { @@ -106,6 +105,7 @@ int of_set_property(struct device_node *dp, const char *name, void *val, int len prevp = &(*prevp)->next; } write_unlock(&devtree_lock); + mutex_unlock(&of_set_property_mutex); /* XXX Upate procfs if necessary... */ diff --git a/arch/sparc/kernel/setup_32.c b/arch/sparc/kernel/setup_32.c index 998cadb4e7f2..0ace49b6396b 100644 --- a/arch/sparc/kernel/setup_32.c +++ b/arch/sparc/kernel/setup_32.c @@ -263,8 +263,6 @@ void __init setup_arch(char **cmdline_p) #ifdef CONFIG_DUMMY_CONSOLE conswitchp = &dummy_con; -#elif defined(CONFIG_PROM_CONSOLE) - conswitchp = &prom_con; #endif boot_flags_init(*cmdline_p); diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c index f2bcfd2967d7..21180339cb09 100644 --- a/arch/sparc/kernel/setup_64.c +++ b/arch/sparc/kernel/setup_64.c @@ -295,8 +295,6 @@ void __init setup_arch(char **cmdline_p) #ifdef CONFIG_DUMMY_CONSOLE conswitchp = &dummy_con; -#elif defined(CONFIG_PROM_CONSOLE) - conswitchp = &prom_con; #endif idprom_init(); diff --git a/arch/sparc/kernel/visemul.c b/arch/sparc/kernel/visemul.c index b956fd71c131..d231cbd5c526 100644 --- a/arch/sparc/kernel/visemul.c +++ b/arch/sparc/kernel/visemul.c @@ -617,7 +617,7 @@ static void pmul(struct pt_regs *regs, unsigned int insn, unsigned int opf) rs2 = fps_regval(f, RS2(insn)); rd_val = 0; - src2 = (rs2 >> (opf == FMUL8x16AU_OPF) ? 16 : 0); + src2 = rs2 >> (opf == FMUL8x16AU_OPF ? 16 : 0); for (byte = 0; byte < 4; byte++) { u16 src1 = (rs1 >> (byte * 8)) & 0x00ff; u32 prod = src1 * src2; diff --git a/arch/sparc/lib/mcount.S b/arch/sparc/lib/mcount.S index 7ce9c65f3592..24b8b12deed2 100644 --- a/arch/sparc/lib/mcount.S +++ b/arch/sparc/lib/mcount.S @@ -64,8 +64,9 @@ mcount: 2: sethi %hi(softirq_stack), %g3 or %g3, %lo(softirq_stack), %g3 ldx [%g3 + %g1], %g7 + sub %g7, STACK_BIAS, %g7 cmp %sp, %g7 - bleu,pt %xcc, 2f + bleu,pt %xcc, 3f sethi %hi(THREAD_SIZE), %g3 add %g7, %g3, %g7 cmp %sp, %g7 @@ -75,7 +76,7 @@ mcount: * again, we are already trying to output the stack overflow * message. */ - sethi %hi(ovstack), %g7 ! cant move to panic stack fast enough +3: sethi %hi(ovstack), %g7 ! cant move to panic stack fast enough or %g7, %lo(ovstack), %g7 add %g7, OVSTACKSIZE, %g3 sub %g3, STACK_BIAS + 192, %g3 diff --git a/arch/sparc/mm/init_64.h b/arch/sparc/mm/init_64.h index c2f772dbd556..77d1b313e344 100644 --- a/arch/sparc/mm/init_64.h +++ b/arch/sparc/mm/init_64.h @@ -45,7 +45,7 @@ extern void free_initmem(void); #define VMEMMAP_ALIGN(x) (((x)+VMEMMAP_CHUNK-1UL)&VMEMMAP_CHUNK_MASK) #define VMEMMAP_SIZE ((((1UL << MAX_PHYSADDR_BITS) >> PAGE_SHIFT) * \ - sizeof(struct page *)) >> VMEMMAP_CHUNK_SHIFT) + sizeof(struct page)) >> VMEMMAP_CHUNK_SHIFT) extern unsigned long vmemmap_table[VMEMMAP_SIZE]; #endif diff --git a/arch/um/Makefile b/arch/um/Makefile index 0728def32234..fc633dbacf84 100644 --- a/arch/um/Makefile +++ b/arch/um/Makefile @@ -96,11 +96,10 @@ CFLAGS_NO_HARDENING := $(call cc-option, -fno-PIC,) $(call cc-option, -fno-pic,) $(call cc-option, -fno-stack-protector,) \ $(call cc-option, -fno-stack-protector-all,) -CONFIG_KERNEL_STACK_ORDER ?= 2 -STACK_SIZE := $(shell echo $$[ 4096 * (1 << $(CONFIG_KERNEL_STACK_ORDER)) ] ) - -CPPFLAGS_vmlinux.lds = -U$(SUBARCH) -DSTART=$(START) -DELF_ARCH=$(ELF_ARCH) \ - -DELF_FORMAT="$(ELF_FORMAT)" -DKERNEL_STACK_SIZE=$(STACK_SIZE) +# Options used by linker script +export LDS_START := $(START) +export LDS_ELF_ARCH := $(ELF_ARCH) +export LDS_ELF_FORMAT := $(ELF_FORMAT) # The wrappers will select whether using "malloc" or the kernel allocator. LINK_WRAPS = -Wl,--wrap,malloc -Wl,--wrap,free -Wl,--wrap,calloc diff --git a/arch/um/kernel/Makefile b/arch/um/kernel/Makefile index 388ec0a3ea9b..1119233597a1 100644 --- a/arch/um/kernel/Makefile +++ b/arch/um/kernel/Makefile @@ -3,6 +3,9 @@ # Licensed under the GPL # +CPPFLAGS_vmlinux.lds := -U$(SUBARCH) -DSTART=$(LDS_START) \ + -DELF_ARCH=$(LDS_ELF_ARCH) \ + -DELF_FORMAT=$(LDS_ELF_FORMAT) extra-y := vmlinux.lds clean-files := diff --git a/arch/um/kernel/vmlinux.lds.S b/arch/um/kernel/vmlinux.lds.S index f8aeb448aab6..16e49bfa2b42 100644 --- a/arch/um/kernel/vmlinux.lds.S +++ b/arch/um/kernel/vmlinux.lds.S @@ -1,3 +1,6 @@ + +KERNEL_STACK_SIZE = 4096 * (1 << CONFIG_KERNEL_STACK_ORDER); + #ifdef CONFIG_LD_SCRIPT_STATIC #include "uml.lds.S" #else diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c index 2a4d073d2cf1..14531abdd0ce 100644 --- a/arch/x86/ia32/ia32_aout.c +++ b/arch/x86/ia32/ia32_aout.c @@ -308,14 +308,15 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs) if (retval) return retval; - regs->cs = __USER32_CS; - regs->r8 = regs->r9 = regs->r10 = regs->r11 = regs->r12 = - regs->r13 = regs->r14 = regs->r15 = 0; - /* OK, This is the point of no return */ set_personality(PER_LINUX); set_thread_flag(TIF_IA32); - clear_thread_flag(TIF_ABI_PENDING); + + setup_new_exec(bprm); + + regs->cs = __USER32_CS; + regs->r8 = regs->r9 = regs->r10 = regs->r11 = regs->r12 = + regs->r13 = regs->r14 = regs->r15 = 0; current->mm->end_code = ex.a_text + (current->mm->start_code = N_TXTADDR(ex)); @@ -326,7 +327,6 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs) current->mm->free_area_cache = TASK_UNMAPPED_BASE; current->mm->cached_hole_size = 0; - current->mm->mmap = NULL; install_exec_creds(bprm); current->flags &= ~PF_FORKNOEXEC; diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S index e590261ba059..b09502da8d3f 100644 --- a/arch/x86/ia32/ia32entry.S +++ b/arch/x86/ia32/ia32entry.S @@ -21,8 +21,8 @@ #define __AUDIT_ARCH_LE 0x40000000 #ifndef CONFIG_AUDITSYSCALL -#define sysexit_audit int_ret_from_sys_call -#define sysretl_audit int_ret_from_sys_call +#define sysexit_audit ia32_ret_from_sys_call +#define sysretl_audit ia32_ret_from_sys_call #endif #define IA32_NR_syscalls ((ia32_syscall_end - ia32_sys_call_table)/8) @@ -39,12 +39,12 @@ .endm /* clobbers %eax */ - .macro CLEAR_RREGS _r9=rax + .macro CLEAR_RREGS offset=0, _r9=rax xorl %eax,%eax - movq %rax,R11(%rsp) - movq %rax,R10(%rsp) - movq %\_r9,R9(%rsp) - movq %rax,R8(%rsp) + movq %rax,\offset+R11(%rsp) + movq %rax,\offset+R10(%rsp) + movq %\_r9,\offset+R9(%rsp) + movq %rax,\offset+R8(%rsp) .endm /* @@ -172,6 +172,10 @@ sysexit_from_sys_call: movl RIP-R11(%rsp),%edx /* User %eip */ CFI_REGISTER rip,rdx RESTORE_ARGS 1,24,1,1,1,1 + xorq %r8,%r8 + xorq %r9,%r9 + xorq %r10,%r10 + xorq %r11,%r11 popfq CFI_ADJUST_CFA_OFFSET -8 /*CFI_RESTORE rflags*/ @@ -200,9 +204,9 @@ sysexit_from_sys_call: movl RDI-ARGOFFSET(%rsp),%r8d /* reload 5th syscall arg */ .endm - .macro auditsys_exit exit,ebpsave=RBP + .macro auditsys_exit exit testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags(%r10) - jnz int_ret_from_sys_call + jnz ia32_ret_from_sys_call TRACE_IRQS_ON sti movl %eax,%esi /* second arg, syscall return value */ @@ -213,13 +217,13 @@ sysexit_from_sys_call: call audit_syscall_exit GET_THREAD_INFO(%r10) movl RAX-ARGOFFSET(%rsp),%eax /* reload syscall return value */ - movl \ebpsave-ARGOFFSET(%rsp),%ebp /* reload user register value */ movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi cli TRACE_IRQS_OFF testl %edi,TI_flags(%r10) - jnz int_with_check - jmp \exit + jz \exit + CLEAR_RREGS -ARGOFFSET + jmp int_with_check .endm sysenter_auditsys: @@ -329,6 +333,9 @@ sysretl_from_sys_call: CFI_REGISTER rip,rcx movl EFLAGS-ARGOFFSET(%rsp),%r11d /*CFI_REGISTER rflags,r11*/ + xorq %r10,%r10 + xorq %r9,%r9 + xorq %r8,%r8 TRACE_IRQS_ON movl RSP-ARGOFFSET(%rsp),%esp CFI_RESTORE rsp @@ -343,7 +350,7 @@ cstar_auditsys: jmp cstar_dispatch sysretl_audit: - auditsys_exit sysretl_from_sys_call, RCX /* user %ebp in RCX slot */ + auditsys_exit sysretl_from_sys_call #endif cstar_tracesys: @@ -353,7 +360,7 @@ cstar_tracesys: #endif xchgl %r9d,%ebp SAVE_REST - CLEAR_RREGS r9 + CLEAR_RREGS 0, r9 movq $-ENOSYS,RAX(%rsp) /* ptrace can change this for a bad syscall */ movq %rsp,%rdi /* &pt_regs -> arg1 */ call syscall_trace_enter @@ -425,6 +432,8 @@ ia32_do_call: call *ia32_sys_call_table(,%rax,8) # xxx: rip relative ia32_sysret: movq %rax,RAX-ARGOFFSET(%rsp) +ia32_ret_from_sys_call: + CLEAR_RREGS -ARGOFFSET jmp int_ret_from_sys_call ia32_tracesys: @@ -442,8 +451,8 @@ END(ia32_syscall) ia32_badsys: movq $0,ORIG_RAX-ARGOFFSET(%rsp) - movq $-ENOSYS,RAX-ARGOFFSET(%rsp) - jmp int_ret_from_sys_call + movq $-ENOSYS,%rax + jmp ia32_sysret quiet_ni_syscall: movq $-ENOSYS,%rax diff --git a/arch/x86/include/asm/amd_iommu.h b/arch/x86/include/asm/amd_iommu.h index bdf96f119f06..9dbd4030f0cd 100644 --- a/arch/x86/include/asm/amd_iommu.h +++ b/arch/x86/include/asm/amd_iommu.h @@ -30,6 +30,7 @@ extern irqreturn_t amd_iommu_int_handler(int irq, void *data); extern void amd_iommu_flush_all_domains(void); extern void amd_iommu_flush_all_devices(void); extern void amd_iommu_shutdown(void); +extern void amd_iommu_apply_erratum_63(u16 devid); #else static inline int amd_iommu_init(void) { return -ENODEV; } static inline void amd_iommu_detect(void) { } diff --git a/arch/x86/include/asm/checksum_32.h b/arch/x86/include/asm/checksum_32.h index 7c5ef8b14d92..46fc474fd819 100644 --- a/arch/x86/include/asm/checksum_32.h +++ b/arch/x86/include/asm/checksum_32.h @@ -161,7 +161,8 @@ static inline __sum16 csum_ipv6_magic(const struct in6_addr *saddr, "adcl $0, %0 ;\n" : "=&r" (sum) : "r" (saddr), "r" (daddr), - "r" (htonl(len)), "r" (htonl(proto)), "0" (sum)); + "r" (htonl(len)), "r" (htonl(proto)), "0" (sum) + : "memory"); return csum_fold(sum); } diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h index 83c1bc8d2e8a..8ac9d9ae129e 100644 --- a/arch/x86/include/asm/elf.h +++ b/arch/x86/include/asm/elf.h @@ -197,14 +197,8 @@ do { \ set_fs(USER_DS); \ } while (0) -#define COMPAT_SET_PERSONALITY(ex) \ -do { \ - if (test_thread_flag(TIF_IA32)) \ - clear_thread_flag(TIF_ABI_PENDING); \ - else \ - set_thread_flag(TIF_ABI_PENDING); \ - current->personality |= force_personality32; \ -} while (0) +void set_personality_ia32(void); +#define COMPAT_SET_PERSONALITY(ex) set_personality_ia32() #define COMPAT_ELF_PLATFORM ("i686") @@ -299,6 +293,8 @@ do { \ #ifdef CONFIG_X86_32 +#define STACK_RND_MASK (0x7ff) + #define VDSO_HIGH_BASE (__fix_to_virt(FIX_VDSO)) #define ARCH_DLINFO ARCH_DLINFO_IA32(vdso_enabled) diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h index 7b2d71df39a6..ebd010795555 100644 --- a/arch/x86/include/asm/fixmap.h +++ b/arch/x86/include/asm/fixmap.h @@ -82,6 +82,9 @@ enum fixed_addresses { #endif FIX_DBGP_BASE, FIX_EARLYCON_MEM_BASE, +#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT + FIX_OHCI1394_BASE, +#endif #ifdef CONFIG_X86_LOCAL_APIC FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */ #endif @@ -126,9 +129,6 @@ enum fixed_addresses { FIX_BTMAP_END = __end_of_permanent_fixed_addresses + 256 - (__end_of_permanent_fixed_addresses & 255), FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_SLOTS - 1, -#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT - FIX_OHCI1394_BASE, -#endif #ifdef CONFIG_X86_32 FIX_WP_TEST, #endif diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index 330ee807f89e..e9e97a371ed4 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h @@ -159,6 +159,7 @@ extern int io_apic_get_redir_entries(int ioapic); struct io_apic_irq_attr; extern int io_apic_set_pci_routing(struct device *dev, int irq, struct io_apic_irq_attr *irq_attr); +void setup_IO_APIC_irq_extra(u32 gsi); extern int (*ioapic_renumber_irq)(int ioapic, int irq); extern void ioapic_init_mappings(void); extern void ioapic_insert_resources(void); diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index eabdc1cfab5c..68d16d2650a2 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -618,6 +618,7 @@ void kvm_queue_exception(struct kvm_vcpu *vcpu, unsigned nr); void kvm_queue_exception_e(struct kvm_vcpu *vcpu, unsigned nr, u32 error_code); void kvm_inject_page_fault(struct kvm_vcpu *vcpu, unsigned long cr2, u32 error_code); +bool kvm_require_cpl(struct kvm_vcpu *vcpu, int required_cpl); int kvm_pic_set_irq(void *opaque, int irq, int level); diff --git a/arch/x86/include/asm/kvm_x86_emulate.h b/arch/x86/include/asm/kvm_x86_emulate.h index b7ed2c423116..7c18e1230f54 100644 --- a/arch/x86/include/asm/kvm_x86_emulate.h +++ b/arch/x86/include/asm/kvm_x86_emulate.h @@ -129,7 +129,7 @@ struct decode_cache { u8 seg_override; unsigned int d; unsigned long regs[NR_VCPU_REGS]; - unsigned long eip; + unsigned long eip, eip_orig; /* modrm */ u8 modrm; u8 modrm_mod; diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h index 5cdd8d100ec9..1d16c972e2a0 100644 --- a/arch/x86/include/asm/mce.h +++ b/arch/x86/include/asm/mce.h @@ -214,5 +214,11 @@ void mce_log_therm_throt_event(__u64 status); static inline void mce_log_therm_throt_event(__u64 status) {} #endif +#ifdef CONFIG_X86_THERMAL_VECTOR +extern void mcheck_intel_therm_init(void); +#else +static inline void mcheck_intel_therm_init(void) { } +#endif + #endif /* __KERNEL__ */ #endif /* _ASM_X86_MCE_H */ diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h index 4fb37c8a0832..43b8adba7d41 100644 --- a/arch/x86/include/asm/paravirt.h +++ b/arch/x86/include/asm/paravirt.h @@ -528,10 +528,11 @@ int paravirt_disable_iospace(void); #define EXTRA_CLOBBERS #define VEXTRA_CLOBBERS #else /* CONFIG_X86_64 */ +/* [re]ax isn't an arg, but the return val */ #define PVOP_VCALL_ARGS \ unsigned long __edi = __edi, __esi = __esi, \ - __edx = __edx, __ecx = __ecx -#define PVOP_CALL_ARGS PVOP_VCALL_ARGS, __eax + __edx = __edx, __ecx = __ecx, __eax = __eax +#define PVOP_CALL_ARGS PVOP_VCALL_ARGS #define PVOP_CALL_ARG1(x) "D" ((unsigned long)(x)) #define PVOP_CALL_ARG2(x) "S" ((unsigned long)(x)) @@ -543,6 +544,7 @@ int paravirt_disable_iospace(void); "=c" (__ecx) #define PVOP_CALL_CLOBBERS PVOP_VCALL_CLOBBERS, "=a" (__eax) +/* void functions are still allowed [re]ax for scratch */ #define PVOP_VCALLEE_CLOBBERS "=a" (__eax) #define PVOP_CALLEE_CLOBBERS PVOP_VCALLEE_CLOBBERS @@ -617,8 +619,8 @@ int paravirt_disable_iospace(void); VEXTRA_CLOBBERS, \ pre, post, ##__VA_ARGS__) -#define __PVOP_VCALLEESAVE(rettype, op, pre, post, ...) \ - ____PVOP_CALL(rettype, op.func, CLBR_RET_REG, \ +#define __PVOP_VCALLEESAVE(op, pre, post, ...) \ + ____PVOP_VCALL(op.func, CLBR_RET_REG, \ PVOP_VCALLEE_CLOBBERS, , \ pre, post, ##__VA_ARGS__) @@ -1565,42 +1567,22 @@ extern struct paravirt_patch_site __parainstructions[], static inline unsigned long __raw_local_save_flags(void) { - unsigned long f; - - asm volatile(paravirt_alt(PARAVIRT_CALL) - : "=a"(f) - : paravirt_type(pv_irq_ops.save_fl), - paravirt_clobber(CLBR_EAX) - : "memory", "cc"); - return f; + return PVOP_CALLEE0(unsigned long, pv_irq_ops.save_fl); } static inline void raw_local_irq_restore(unsigned long f) { - asm volatile(paravirt_alt(PARAVIRT_CALL) - : "=a"(f) - : PV_FLAGS_ARG(f), - paravirt_type(pv_irq_ops.restore_fl), - paravirt_clobber(CLBR_EAX) - : "memory", "cc"); + PVOP_VCALLEE1(pv_irq_ops.restore_fl, f); } static inline void raw_local_irq_disable(void) { - asm volatile(paravirt_alt(PARAVIRT_CALL) - : - : paravirt_type(pv_irq_ops.irq_disable), - paravirt_clobber(CLBR_EAX) - : "memory", "eax", "cc"); + PVOP_VCALLEE0(pv_irq_ops.irq_disable); } static inline void raw_local_irq_enable(void) { - asm volatile(paravirt_alt(PARAVIRT_CALL) - : - : paravirt_type(pv_irq_ops.irq_enable), - paravirt_clobber(CLBR_EAX) - : "memory", "eax", "cc"); + PVOP_VCALLEE0(pv_irq_ops.irq_enable); } static inline unsigned long __raw_local_irq_save(void) diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index c7768269b1cf..70c6a939031b 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h @@ -179,7 +179,7 @@ static inline void native_cpuid(unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx) { /* ecx is often an input as well as an output. */ - asm("cpuid" + asm volatile("cpuid" : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), @@ -403,7 +403,17 @@ extern unsigned long kernel_eflags; extern asmlinkage void ignore_sysret(void); #else /* X86_64 */ #ifdef CONFIG_CC_STACKPROTECTOR -DECLARE_PER_CPU(unsigned long, stack_canary); +/* + * Make sure stack canary segment base is cached-aligned: + * "For Intel Atom processors, avoid non zero segment base address + * that is not aligned to cache line boundary at all cost." + * (Optim Ref Manual Assembly/Compiler Coding Rule 15.) + */ +struct stack_canary { + char __pad[20]; /* canary at %gs:20 */ + unsigned long canary; +}; +DECLARE_PER_CPU(struct stack_canary, stack_canary) ____cacheline_aligned; #endif #endif /* X86_64 */ diff --git a/arch/x86/include/asm/stackprotector.h b/arch/x86/include/asm/stackprotector.h index c2d742c6e15f..decad975e024 100644 --- a/arch/x86/include/asm/stackprotector.h +++ b/arch/x86/include/asm/stackprotector.h @@ -78,14 +78,14 @@ static __always_inline void boot_init_stack_canary(void) #ifdef CONFIG_X86_64 percpu_write(irq_stack_union.stack_canary, canary); #else - percpu_write(stack_canary, canary); + percpu_write(stack_canary.canary, canary); #endif } static inline void setup_stack_canary_segment(int cpu) { #ifdef CONFIG_X86_32 - unsigned long canary = (unsigned long)&per_cpu(stack_canary, cpu) - 20; + unsigned long canary = (unsigned long)&per_cpu(stack_canary, cpu); struct desc_struct *gdt_table = get_cpu_gdt_table(cpu); struct desc_struct desc; diff --git a/arch/x86/include/asm/system.h b/arch/x86/include/asm/system.h index 643c59b4bc6e..5bd119be1142 100644 --- a/arch/x86/include/asm/system.h +++ b/arch/x86/include/asm/system.h @@ -31,7 +31,7 @@ void __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p, "movl %P[task_canary](%[next]), %%ebx\n\t" \ "movl %%ebx, "__percpu_arg([stack_canary])"\n\t" #define __switch_canary_oparam \ - , [stack_canary] "=m" (per_cpu_var(stack_canary)) + , [stack_canary] "=m" (per_cpu_var(stack_canary.canary)) #define __switch_canary_iparam \ , [task_canary] "i" (offsetof(struct task_struct, stack_canary)) #else /* CC_STACKPROTECTOR */ diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h index fad7d40b75f8..e4bcf0c00268 100644 --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h @@ -86,7 +86,6 @@ struct thread_info { #define TIF_NOTSC 16 /* TSC is not accessible in userland */ #define TIF_IA32 17 /* 32bit process */ #define TIF_FORK 18 /* ret_from_fork */ -#define TIF_ABI_PENDING 19 #define TIF_MEMDIE 20 #define TIF_DEBUG 21 /* uses debug registers */ #define TIF_IO_BITMAP 22 /* uses I/O bitmap */ @@ -110,7 +109,6 @@ struct thread_info { #define _TIF_NOTSC (1 << TIF_NOTSC) #define _TIF_IA32 (1 << TIF_IA32) #define _TIF_FORK (1 << TIF_FORK) -#define _TIF_ABI_PENDING (1 << TIF_ABI_PENDING) #define _TIF_DEBUG (1 << TIF_DEBUG) #define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP) #define _TIF_FREEZE (1 << TIF_FREEZE) diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h index 77a68505419a..ca1fe396ec0d 100644 --- a/arch/x86/include/asm/uv/uv_hub.h +++ b/arch/x86/include/asm/uv/uv_hub.h @@ -18,6 +18,8 @@ #include <asm/types.h> #include <asm/percpu.h> #include <asm/uv/uv_mmrs.h> +#include <asm/irq_vectors.h> +#include <asm/io_apic.h> /* @@ -420,9 +422,14 @@ static inline void uv_set_cpu_scir_bits(int cpu, unsigned char value) static inline void uv_hub_send_ipi(int pnode, int apicid, int vector) { unsigned long val; + unsigned long dmode = dest_Fixed; + + if (vector == NMI_VECTOR) + dmode = dest_NMI; val = (1UL << UVH_IPI_INT_SEND_SHFT) | - ((apicid & 0x3f) << UVH_IPI_INT_APIC_ID_SHFT) | + ((apicid) << UVH_IPI_INT_APIC_ID_SHFT) | + (dmode << UVH_IPI_INT_DELIVERY_MODE_SHFT) | (vector << UVH_IPI_INT_VECTOR_SHFT); uv_write_global_mmr64(pnode, UVH_IPI_INT, val); } diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 6b8ca3a0285d..36411c325b8c 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c @@ -446,6 +446,12 @@ void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger) int acpi_gsi_to_irq(u32 gsi, unsigned int *irq) { *irq = gsi; + +#ifdef CONFIG_X86_IO_APIC + if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC) + setup_IO_APIC_irq_extra(gsi); +#endif + return 0; } @@ -473,7 +479,8 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity) plat_gsi = mp_register_gsi(dev, gsi, trigger, polarity); } #endif - acpi_gsi_to_irq(plat_gsi, &irq); + irq = plat_gsi; + return irq; } diff --git a/arch/x86/kernel/acpi/cstate.c b/arch/x86/kernel/acpi/cstate.c index 8c44c232efcb..2e837f5080fe 100644 --- a/arch/x86/kernel/acpi/cstate.c +++ b/arch/x86/kernel/acpi/cstate.c @@ -48,7 +48,7 @@ void acpi_processor_power_init_bm_check(struct acpi_processor_flags *flags, * P4, Core and beyond CPUs */ if (c->x86_vendor == X86_VENDOR_INTEL && - (c->x86 > 0x6 || (c->x86 == 6 && c->x86_model >= 14))) + (c->x86 > 0xf || (c->x86 == 6 && c->x86_model >= 0x0f))) flags->bm_control = 0; } EXPORT_SYMBOL(acpi_processor_power_init_bm_check); diff --git a/arch/x86/kernel/acpi/processor.c b/arch/x86/kernel/acpi/processor.c index d296f4a195c9..d85d1b2432ba 100644 --- a/arch/x86/kernel/acpi/processor.c +++ b/arch/x86/kernel/acpi/processor.c @@ -79,7 +79,8 @@ void arch_acpi_processor_init_pdc(struct acpi_processor *pr) struct cpuinfo_x86 *c = &cpu_data(pr->id); pr->pdc = NULL; - if (c->x86_vendor == X86_VENDOR_INTEL) + if (c->x86_vendor == X86_VENDOR_INTEL || + c->x86_vendor == X86_VENDOR_CENTAUR) init_intel_pdc(pr, c); return; diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index 6c99f5037801..d7be38c297b0 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c @@ -485,8 +485,6 @@ void amd_iommu_flush_all_devices(void) int i; for (i = 0; i <= amd_iommu_last_bdf; ++i) { - if (amd_iommu_pd_table[i] == NULL) - continue; iommu = amd_iommu_rlookup_table[i]; if (!iommu) @@ -1114,6 +1112,8 @@ static void __detach_device(struct protection_domain *domain, u16 devid) amd_iommu_dev_table[devid].data[1] = 0; amd_iommu_dev_table[devid].data[2] = 0; + amd_iommu_apply_erratum_63(devid); + /* decrease reference counter */ domain->dev_cnt -= 1; @@ -1873,10 +1873,10 @@ static void prealloc_protection_domains(void) struct pci_dev *dev = NULL; struct dma_ops_domain *dma_dom; struct amd_iommu *iommu; - u16 devid; + u16 devid, __devid; while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { - devid = calc_devid(dev->bus->number, dev->devfn); + __devid = devid = calc_devid(dev->bus->number, dev->devfn); if (devid > amd_iommu_last_bdf) continue; devid = amd_iommu_alias_table[devid]; @@ -1891,6 +1891,10 @@ static void prealloc_protection_domains(void) init_unity_mappings_for_device(dma_dom, devid); dma_dom->target_dev = devid; + attach_device(iommu, &dma_dom->domain, devid); + if (__devid != devid) + attach_device(iommu, &dma_dom->domain, __devid); + list_add_tail(&dma_dom->list, &iommu_pd_list); } } diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index c1b17e97252e..ecd90502899c 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c @@ -240,7 +240,7 @@ static void iommu_feature_enable(struct amd_iommu *iommu, u8 bit) writel(ctrl, iommu->mmio_base + MMIO_CONTROL_OFFSET); } -static void __init iommu_feature_disable(struct amd_iommu *iommu, u8 bit) +static void iommu_feature_disable(struct amd_iommu *iommu, u8 bit) { u32 ctrl; @@ -509,6 +509,26 @@ static void set_dev_entry_bit(u16 devid, u8 bit) amd_iommu_dev_table[devid].data[i] |= (1 << _bit); } +static int get_dev_entry_bit(u16 devid, u8 bit) +{ + int i = (bit >> 5) & 0x07; + int _bit = bit & 0x1f; + + return (amd_iommu_dev_table[devid].data[i] & (1 << _bit)) >> _bit; +} + + +void amd_iommu_apply_erratum_63(u16 devid) +{ + int sysmgt; + + sysmgt = get_dev_entry_bit(devid, DEV_ENTRY_SYSMGT1) | + (get_dev_entry_bit(devid, DEV_ENTRY_SYSMGT2) << 1); + + if (sysmgt == 0x01) + set_dev_entry_bit(devid, DEV_ENTRY_IW); +} + /* Writes the specific IOMMU for a device into the rlookup table */ static void __init set_iommu_for_device(struct amd_iommu *iommu, u16 devid) { @@ -537,6 +557,8 @@ static void __init set_dev_entry_from_acpi(struct amd_iommu *iommu, if (flags & ACPI_DEVFLAG_LINT1) set_dev_entry_bit(devid, DEV_ENTRY_LINT1_PASS); + amd_iommu_apply_erratum_63(devid); + set_iommu_for_device(iommu, devid); } @@ -893,7 +915,7 @@ static int __init init_iommu_all(struct acpi_table_header *table) * ****************************************************************************/ -static int __init iommu_setup_msi(struct amd_iommu *iommu) +static int iommu_setup_msi(struct amd_iommu *iommu) { int r; diff --git a/arch/x86/kernel/apic/apic_flat_64.c b/arch/x86/kernel/apic/apic_flat_64.c index d0c99abc26c3..873f81f0bbd8 100644 --- a/arch/x86/kernel/apic/apic_flat_64.c +++ b/arch/x86/kernel/apic/apic_flat_64.c @@ -240,6 +240,11 @@ static int physflat_acpi_madt_oem_check(char *oem_id, char *oem_table_id) printk(KERN_DEBUG "system APIC only can use physical flat"); return 1; } + + if (!strncmp(oem_id, "IBM", 3) && !strncmp(oem_table_id, "EXA", 3)) { + printk(KERN_DEBUG "IBM Summit detected, will use apic physical"); + return 1; + } #endif return 0; diff --git a/arch/x86/kernel/apic/es7000_32.c b/arch/x86/kernel/apic/es7000_32.c index 8952a5890281..89174f847b49 100644 --- a/arch/x86/kernel/apic/es7000_32.c +++ b/arch/x86/kernel/apic/es7000_32.c @@ -167,7 +167,7 @@ static int es7000_apic_is_cluster(void) { /* MPENTIUMIII */ if (boot_cpu_data.x86 == 6 && - (boot_cpu_data.x86_model >= 7 || boot_cpu_data.x86_model <= 11)) + (boot_cpu_data.x86_model >= 7 && boot_cpu_data.x86_model <= 11)) return 1; return 0; diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index d2ed6c5ddc80..938b69d54a25 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -1558,6 +1558,56 @@ static void __init setup_IO_APIC_irqs(void) } /* + * for the gsit that is not in first ioapic + * but could not use acpi_register_gsi() + * like some special sci in IBM x3330 + */ +void setup_IO_APIC_irq_extra(u32 gsi) +{ + int apic_id = 0, pin, idx, irq; + int node = cpu_to_node(boot_cpu_id); + struct irq_desc *desc; + struct irq_cfg *cfg; + + /* + * Convert 'gsi' to 'ioapic.pin'. + */ + apic_id = mp_find_ioapic(gsi); + if (apic_id < 0) + return; + + pin = mp_find_ioapic_pin(apic_id, gsi); + idx = find_irq_entry(apic_id, pin, mp_INT); + if (idx == -1) + return; + + irq = pin_2_irq(idx, apic_id, pin); +#ifdef CONFIG_SPARSE_IRQ + desc = irq_to_desc(irq); + if (desc) + return; +#endif + desc = irq_to_desc_alloc_node(irq, node); + if (!desc) { + printk(KERN_INFO "can not get irq_desc for %d\n", irq); + return; + } + + cfg = desc->chip_data; + add_pin_to_irq_node(cfg, node, apic_id, pin); + + if (test_bit(pin, mp_ioapic_routing[apic_id].pin_programmed)) { + pr_debug("Pin %d-%d already programmed\n", + mp_ioapics[apic_id].apicid, pin); + return; + } + set_bit(pin, mp_ioapic_routing[apic_id].pin_programmed); + + setup_IO_APIC_irq(apic_id, pin, irq, desc, + irq_trigger(idx), irq_polarity(idx)); +} + +/* * Set up the timer pin, possibly with the 8259A-master behind. */ static void __init setup_timer_IRQ0_pin(unsigned int apic_id, unsigned int pin, diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index 601159374e87..055e3947bf28 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c @@ -352,14 +352,14 @@ static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size) for (i = 0; i < ARRAY_SIZE(redir_addrs); i++) { alias.v = uv_read_local_mmr(redir_addrs[i].alias); - if (alias.s.base == 0) { + if (alias.s.enable && alias.s.base == 0) { *size = (1UL << alias.s.m_alias); redirect.v = uv_read_local_mmr(redir_addrs[i].redirect); *base = (unsigned long)redirect.s.dest_base << DEST_SHIFT; return; } } - BUG(); + *base = *size = 0; } enum map_type {map_wb, map_uc}; @@ -609,12 +609,12 @@ void __init uv_system_init(void) uv_cpu_hub_info(cpu)->lowmem_remap_base = lowmem_redir_base; uv_cpu_hub_info(cpu)->lowmem_remap_top = lowmem_redir_size; uv_cpu_hub_info(cpu)->m_val = m_val; - uv_cpu_hub_info(cpu)->n_val = m_val; + uv_cpu_hub_info(cpu)->n_val = n_val; uv_cpu_hub_info(cpu)->numa_blade_id = blade; uv_cpu_hub_info(cpu)->blade_processor_id = lcpu; uv_cpu_hub_info(cpu)->pnode = pnode; uv_cpu_hub_info(cpu)->pnode_mask = pnode_mask; - uv_cpu_hub_info(cpu)->gpa_mask = (1 << (m_val + n_val)) - 1; + uv_cpu_hub_info(cpu)->gpa_mask = (1UL << (m_val + n_val)) - 1; uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper; uv_cpu_hub_info(cpu)->gnode_extra = gnode_extra; uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base; diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 5ce60a88027b..e338b5cfe0b0 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -1043,7 +1043,7 @@ DEFINE_PER_CPU(struct orig_ist, orig_ist); #else /* CONFIG_X86_64 */ #ifdef CONFIG_CC_STACKPROTECTOR -DEFINE_PER_CPU(unsigned long, stack_canary); +DEFINE_PER_CPU(struct stack_canary, stack_canary) ____cacheline_aligned; #endif /* Make sure %fs and %gs are initialized properly in idle threads */ diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c index 2a50ef891000..8cbfb42cbef2 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c @@ -605,9 +605,10 @@ static int check_pst_table(struct powernow_k8_data *data, struct pst_s *pst, return 0; } -static void invalidate_entry(struct powernow_k8_data *data, unsigned int entry) +static void invalidate_entry(struct cpufreq_frequency_table *powernow_table, + unsigned int entry) { - data->powernow_table[entry].frequency = CPUFREQ_ENTRY_INVALID; + powernow_table[entry].frequency = CPUFREQ_ENTRY_INVALID; } static void print_basics(struct powernow_k8_data *data) @@ -914,13 +915,13 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data, "bad value %d.\n", i, index); printk(KERN_ERR PFX "Please report to BIOS " "manufacturer\n"); - invalidate_entry(data, i); + invalidate_entry(powernow_table, i); continue; } rdmsr(MSR_PSTATE_DEF_BASE + index, lo, hi); if (!(hi & HW_PSTATE_VALID_MASK)) { dprintk("invalid pstate %d, ignoring\n", index); - invalidate_entry(data, i); + invalidate_entry(powernow_table, i); continue; } @@ -970,7 +971,7 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, /* verify frequency is OK */ if ((freq > (MAX_FREQ * 1000)) || (freq < (MIN_FREQ * 1000))) { dprintk("invalid freq %u kHz, ignoring\n", freq); - invalidate_entry(data, i); + invalidate_entry(powernow_table, i); continue; } @@ -978,7 +979,7 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, * BIOSs are using "off" to indicate invalid */ if (vid == VID_OFF) { dprintk("invalid vid %u, ignoring\n", vid); - invalidate_entry(data, i); + invalidate_entry(powernow_table, i); continue; } @@ -997,7 +998,7 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, dprintk("double low frequency table entry, " "ignoring it.\n"); - invalidate_entry(data, i); + invalidate_entry(powernow_table, i); continue; } else cntlofreq = i; @@ -1009,7 +1010,7 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, (unsigned int) (data->acpi_data.states[i].core_frequency * 1000)); - invalidate_entry(data, i); + invalidate_entry(powernow_table, i); continue; } } @@ -1371,6 +1372,7 @@ static int __devexit powernowk8_cpu_exit(struct cpufreq_policy *pol) kfree(data->powernow_table); kfree(data); + per_cpu(powernow_data, pol->cpu) = NULL; return 0; } @@ -1390,7 +1392,7 @@ static unsigned int powernowk8_get(unsigned int cpu) int err; if (!data) - return -EINVAL; + return 0; smp_call_function_single(cpu, query_values_on_cpu, &err, true); if (err) diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c b/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c index 6911e91fb4f6..3ae5a7a3a500 100644 --- a/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c @@ -232,28 +232,23 @@ static unsigned int speedstep_detect_chipset(void) return 0; } -struct get_freq_data { - unsigned int speed; - unsigned int processor; -}; - -static void get_freq_data(void *_data) +static void get_freq_data(void *_speed) { - struct get_freq_data *data = _data; + unsigned int *speed = _speed; - data->speed = speedstep_get_frequency(data->processor); + *speed = speedstep_get_frequency(speedstep_processor); } static unsigned int speedstep_get(unsigned int cpu) { - struct get_freq_data data = { .processor = cpu }; + unsigned int speed; /* You're supposed to ensure CPU is online. */ - if (smp_call_function_single(cpu, get_freq_data, &data, 1) != 0) + if (smp_call_function_single(cpu, get_freq_data, &speed, 1) != 0) BUG(); - dprintk("detected %u kHz as current frequency\n", data.speed); - return data.speed; + dprintk("detected %u kHz as current frequency\n", speed); + return speed; } /** diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c index 789efe217e1a..781130fd31fc 100644 --- a/arch/x86/kernel/cpu/intel_cacheinfo.c +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c @@ -93,7 +93,7 @@ static const struct _cache_table __cpuinitconst cache_table[] = { 0xd1, LVL_3, 1024 }, /* 4-way set assoc, 64 byte line size */ { 0xd2, LVL_3, 2048 }, /* 4-way set assoc, 64 byte line size */ { 0xd6, LVL_3, 1024 }, /* 8-way set assoc, 64 byte line size */ - { 0xd7, LVL_3, 2038 }, /* 8-way set assoc, 64 byte line size */ + { 0xd7, LVL_3, 2048 }, /* 8-way set assoc, 64 byte line size */ { 0xd8, LVL_3, 4096 }, /* 12-way set assoc, 64 byte line size */ { 0xdc, LVL_3, 2048 }, /* 12-way set assoc, 64 byte line size */ { 0xdd, LVL_3, 4096 }, /* 12-way set assoc, 64 byte line size */ @@ -101,6 +101,9 @@ static const struct _cache_table __cpuinitconst cache_table[] = { 0xe2, LVL_3, 2048 }, /* 16-way set assoc, 64 byte line size */ { 0xe3, LVL_3, 4096 }, /* 16-way set assoc, 64 byte line size */ { 0xe4, LVL_3, 8192 }, /* 16-way set assoc, 64 byte line size */ + { 0xea, LVL_3, 12288 }, /* 24-way set assoc, 64 byte line size */ + { 0xeb, LVL_3, 18432 }, /* 24-way set assoc, 64 byte line size */ + { 0xec, LVL_3, 24576 }, /* 24-way set assoc, 64 byte line size */ { 0x00, 0, 0} }; diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index 01213048f62f..4192c500317e 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c @@ -1327,13 +1327,14 @@ static void mce_init_timer(void) struct timer_list *t = &__get_cpu_var(mce_timer); int *n = &__get_cpu_var(next_interval); + setup_timer(t, mcheck_timer, smp_processor_id()); + if (mce_ignore_ce) return; *n = check_interval * HZ; if (!*n) return; - setup_timer(t, mcheck_timer, smp_processor_id()); t->expires = round_jiffies(jiffies + *n); add_timer_on(t, smp_processor_id()); } diff --git a/arch/x86/kernel/cpu/mcheck/therm_throt.c b/arch/x86/kernel/cpu/mcheck/therm_throt.c index 5957a93e5173..a14a45194076 100644 --- a/arch/x86/kernel/cpu/mcheck/therm_throt.c +++ b/arch/x86/kernel/cpu/mcheck/therm_throt.c @@ -34,20 +34,33 @@ /* How long to wait between reporting thermal events */ #define CHECK_INTERVAL (300 * HZ) -static DEFINE_PER_CPU(__u64, next_check) = INITIAL_JIFFIES; -static DEFINE_PER_CPU(unsigned long, thermal_throttle_count); -static DEFINE_PER_CPU(bool, thermal_throttle_active); +/* + * Current thermal throttling state: + */ +struct thermal_state { + bool is_throttled; + + u64 next_check; + unsigned long throttle_count; + unsigned long last_throttle_count; +}; + +static DEFINE_PER_CPU(struct thermal_state, thermal_state); -static atomic_t therm_throt_en = ATOMIC_INIT(0); +static atomic_t therm_throt_en = ATOMIC_INIT(0); + +static u32 lvtthmr_init __read_mostly; #ifdef CONFIG_SYSFS #define define_therm_throt_sysdev_one_ro(_name) \ static SYSDEV_ATTR(_name, 0444, therm_throt_sysdev_show_##_name, NULL) #define define_therm_throt_sysdev_show_func(name) \ -static ssize_t therm_throt_sysdev_show_##name(struct sys_device *dev, \ - struct sysdev_attribute *attr, \ - char *buf) \ + \ +static ssize_t therm_throt_sysdev_show_##name( \ + struct sys_device *dev, \ + struct sysdev_attribute *attr, \ + char *buf) \ { \ unsigned int cpu = dev->id; \ ssize_t ret; \ @@ -55,7 +68,7 @@ static ssize_t therm_throt_sysdev_show_##name(struct sys_device *dev, \ preempt_disable(); /* CPU hotplug */ \ if (cpu_online(cpu)) \ ret = sprintf(buf, "%lu\n", \ - per_cpu(thermal_throttle_##name, cpu)); \ + per_cpu(thermal_state, cpu).name); \ else \ ret = 0; \ preempt_enable(); \ @@ -63,11 +76,11 @@ static ssize_t therm_throt_sysdev_show_##name(struct sys_device *dev, \ return ret; \ } -define_therm_throt_sysdev_show_func(count); -define_therm_throt_sysdev_one_ro(count); +define_therm_throt_sysdev_show_func(throttle_count); +define_therm_throt_sysdev_one_ro(throttle_count); static struct attribute *thermal_throttle_attrs[] = { - &attr_count.attr, + &attr_throttle_count.attr, NULL }; @@ -93,33 +106,39 @@ static struct attribute_group thermal_throttle_attr_group = { * 1 : Event should be logged further, and a message has been * printed to the syslog. */ -static int therm_throt_process(int curr) +static int therm_throt_process(bool is_throttled) { - unsigned int cpu = smp_processor_id(); - __u64 tmp_jiffs = get_jiffies_64(); - bool was_throttled = __get_cpu_var(thermal_throttle_active); - bool is_throttled = __get_cpu_var(thermal_throttle_active) = curr; + struct thermal_state *state; + unsigned int this_cpu; + bool was_throttled; + u64 now; + + this_cpu = smp_processor_id(); + now = get_jiffies_64(); + state = &per_cpu(thermal_state, this_cpu); + + was_throttled = state->is_throttled; + state->is_throttled = is_throttled; if (is_throttled) - __get_cpu_var(thermal_throttle_count)++; + state->throttle_count++; - if (!(was_throttled ^ is_throttled) && - time_before64(tmp_jiffs, __get_cpu_var(next_check))) + if (time_before64(now, state->next_check) && + state->throttle_count != state->last_throttle_count) return 0; - __get_cpu_var(next_check) = tmp_jiffs + CHECK_INTERVAL; + state->next_check = now + CHECK_INTERVAL; + state->last_throttle_count = state->throttle_count; /* if we just entered the thermal event */ if (is_throttled) { - printk(KERN_CRIT "CPU%d: Temperature above threshold, " - "cpu clock throttled (total events = %lu)\n", - cpu, __get_cpu_var(thermal_throttle_count)); + printk(KERN_CRIT "CPU%d: Temperature above threshold, cpu clock throttled (total events = %lu)\n", this_cpu, state->throttle_count); add_taint(TAINT_MACHINE_CHECK); return 1; } if (was_throttled) { - printk(KERN_INFO "CPU%d: Temperature/speed normal\n", cpu); + printk(KERN_INFO "CPU%d: Temperature/speed normal\n", this_cpu); return 1; } @@ -213,7 +232,7 @@ static void intel_thermal_interrupt(void) __u64 msr_val; rdmsrl(MSR_IA32_THERM_STATUS, msr_val); - if (therm_throt_process(msr_val & THERM_STATUS_PROCHOT)) + if (therm_throt_process((msr_val & THERM_STATUS_PROCHOT) != 0)) mce_log_therm_throt_event(msr_val); } @@ -237,6 +256,18 @@ asmlinkage void smp_thermal_interrupt(struct pt_regs *regs) ack_APIC_irq(); } +void __init mcheck_intel_therm_init(void) +{ + /* + * This function is only called on boot CPU. Save the init thermal + * LVT value on BSP and use that value to restore APs' thermal LVT + * entry BIOS programmed later + */ + if (cpu_has(&boot_cpu_data, X86_FEATURE_ACPI) && + cpu_has(&boot_cpu_data, X86_FEATURE_ACC)) + lvtthmr_init = apic_read(APIC_LVTTHMR); +} + void intel_init_thermal(struct cpuinfo_x86 *c) { unsigned int cpu = smp_processor_id(); @@ -253,7 +284,20 @@ void intel_init_thermal(struct cpuinfo_x86 *c) * since it might be delivered via SMI already: */ rdmsr(MSR_IA32_MISC_ENABLE, l, h); - h = apic_read(APIC_LVTTHMR); + + /* + * The initial value of thermal LVT entries on all APs always reads + * 0x10000 because APs are woken up by BSP issuing INIT-SIPI-SIPI + * sequence to them and LVT registers are reset to 0s except for + * the mask bits which are set to 1s when APs receive INIT IPI. + * Always restore the value that BIOS has programmed on AP based on + * BSP's info we saved since BIOS is always setting the same value + * for all threads/cores + */ + apic_write(APIC_LVTTHMR, lvtthmr_init); + + h = lvtthmr_init; + if ((l & MSR_IA32_MISC_ENABLE_TM1) && (h & APIC_DM_SMI)) { printk(KERN_DEBUG "CPU%d: Thermal monitoring handled by SMI\n", cpu); diff --git a/arch/x86/kernel/cpu/perfctr-watchdog.c b/arch/x86/kernel/cpu/perfctr-watchdog.c index e60ed740d2b3..d23746ec8796 100644 --- a/arch/x86/kernel/cpu/perfctr-watchdog.c +++ b/arch/x86/kernel/cpu/perfctr-watchdog.c @@ -711,7 +711,7 @@ static void probe_nmi_watchdog(void) switch (boot_cpu_data.x86_vendor) { case X86_VENDOR_AMD: if (boot_cpu_data.x86 != 6 && boot_cpu_data.x86 != 15 && - boot_cpu_data.x86 != 16) + boot_cpu_data.x86 != 16 && boot_cpu_data.x86 != 17) return; wd_ops = &k7_wd_ops; break; diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index 5cb5725b2bae..0bc204d1166b 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c @@ -1378,8 +1378,8 @@ static unsigned long ram_alignment(resource_size_t pos) if (mb < 16) return 1024*1024; - /* To 32MB for anything above that */ - return 32*1024*1024; + /* To 64MB for anything above that */ + return 64*1024*1024; } #define MAX_RESOURCE_SIZE ((resource_size_t)-1) diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S index cc827ac9e8d3..7ffec6b3b331 100644 --- a/arch/x86/kernel/head_32.S +++ b/arch/x86/kernel/head_32.S @@ -439,7 +439,6 @@ is386: movl $2,%ecx # set MP jne 1f movl $per_cpu__gdt_page,%eax movl $per_cpu__stack_canary,%ecx - subl $20, %ecx movw %cx, 8 * GDT_ENTRY_STACK_CANARY + 2(%eax) shrl $16, %ecx movb %cl, 8 * GDT_ENTRY_STACK_CANARY + 4(%eax) diff --git a/arch/x86/kernel/i8253.c b/arch/x86/kernel/i8253.c index 5cf36c053ac4..da890f03d078 100644 --- a/arch/x86/kernel/i8253.c +++ b/arch/x86/kernel/i8253.c @@ -21,8 +21,10 @@ EXPORT_SYMBOL(i8253_lock); #ifdef CONFIG_X86_32 static void pit_disable_clocksource(void); +static void pit_enable_clocksource(void); #else static inline void pit_disable_clocksource(void) { } +static inline void pit_enable_clocksource(void) { } #endif /* @@ -67,7 +69,7 @@ static void init_pit_timer(enum clock_event_mode mode, break; case CLOCK_EVT_MODE_RESUME: - /* Nothing to do here */ + pit_enable_clocksource(); break; } spin_unlock(&i8253_lock); @@ -200,19 +202,27 @@ static struct clocksource pit_cs = { .shift = 20, }; +int pit_cs_registered; static void pit_disable_clocksource(void) { - /* - * Use mult to check whether it is registered or not - */ - if (pit_cs.mult) { + if (pit_cs_registered) { clocksource_unregister(&pit_cs); - pit_cs.mult = 0; + pit_cs_registered = 0; + } +} + +static void pit_enable_clocksource(void) +{ + if (!pit_cs_registered && !clocksource_register(&pit_cs)) { + pit_cs_registered = 1; } } + + static int __init init_pit_clocksource(void) { + int ret; /* * Several reasons not to register PIT as a clocksource: * @@ -226,7 +236,10 @@ static int __init init_pit_clocksource(void) pit_cs.mult = clocksource_hz2mult(CLOCK_TICK_RATE, pit_cs.shift); - return clocksource_register(&pit_cs); + ret = clocksource_register(&pit_cs); + if (!ret) + pit_cs_registered = 1; + return ret; } arch_initcall(init_pit_clocksource); diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index c664d515f613..63b0ec8d3d4a 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -34,7 +34,6 @@ struct kvm_para_state { u8 mmu_queue[MMU_QUEUE_SIZE]; int mmu_queue_len; - enum paravirt_lazy_mode mode; }; static DEFINE_PER_CPU(struct kvm_para_state, para_state); @@ -77,7 +76,7 @@ static void kvm_deferred_mmu_op(void *buffer, int len) { struct kvm_para_state *state = kvm_para_state(); - if (state->mode != PARAVIRT_LAZY_MMU) { + if (paravirt_get_lazy_mode() != PARAVIRT_LAZY_MMU) { kvm_mmu_op(buffer, len); return; } @@ -185,10 +184,7 @@ static void kvm_release_pt(unsigned long pfn) static void kvm_enter_lazy_mmu(void) { - struct kvm_para_state *state = kvm_para_state(); - paravirt_enter_lazy_mmu(); - state->mode = paravirt_get_lazy_mode(); } static void kvm_leave_lazy_mmu(void) @@ -197,7 +193,6 @@ static void kvm_leave_lazy_mmu(void) mmu_queue_flush(state); paravirt_leave_lazy_mmu(); - state->mode = paravirt_get_lazy_mode(); } static void __init paravirt_ops_setup(void) diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 223af43f1526..e5efcdcca31b 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -50,8 +50,8 @@ static unsigned long kvm_get_wallclock(void) struct timespec ts; int low, high; - low = (int)__pa(&wall_clock); - high = ((u64)__pa(&wall_clock) >> 32); + low = (int)__pa_symbol(&wall_clock); + high = ((u64)__pa_symbol(&wall_clock) >> 32); native_write_msr(MSR_KVM_WALL_CLOCK, low, high); vcpu_time = &get_cpu_var(hv_clock); diff --git a/arch/x86/kernel/microcode_core.c b/arch/x86/kernel/microcode_core.c index 9371448290ac..0511035f3b84 100644 --- a/arch/x86/kernel/microcode_core.c +++ b/arch/x86/kernel/microcode_core.c @@ -210,8 +210,8 @@ static ssize_t microcode_write(struct file *file, const char __user *buf, { ssize_t ret = -EINVAL; - if ((len >> PAGE_SHIFT) > num_physpages) { - pr_err("microcode: too much data (max %ld pages)\n", num_physpages); + if ((len >> PAGE_SHIFT) > totalram_pages) { + pr_err("microcode: too much data (max %ld pages)\n", totalram_pages); return ret; } diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c index 971a3bec47a8..e6ec8a2df1c3 100644 --- a/arch/x86/kernel/pci-calgary_64.c +++ b/arch/x86/kernel/pci-calgary_64.c @@ -318,13 +318,15 @@ static inline struct iommu_table *find_iommu_table(struct device *dev) pdev = to_pci_dev(dev); + /* search up the device tree for an iommu */ pbus = pdev->bus; - - /* is the device behind a bridge? Look for the root bus */ - while (pbus->parent) + do { + tbl = pci_iommu(pbus); + if (tbl && tbl->it_busno == pbus->number) + break; + tbl = NULL; pbus = pbus->parent; - - tbl = pci_iommu(pbus); + } while (pbus); BUG_ON(tbl && (tbl->it_busno != pbus->number)); diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index 1a041bcf506b..953667c7487f 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c @@ -203,7 +203,7 @@ static __init int iommu_setup(char *p) if (!strncmp(p, "allowdac", 8)) forbid_dac = 0; if (!strncmp(p, "nodac", 5)) - forbid_dac = -1; + forbid_dac = 1; if (!strncmp(p, "usedac", 6)) { forbid_dac = -1; return 1; diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c index d2e56b8f48e7..6f711b3a84d7 100644 --- a/arch/x86/kernel/pci-gart_64.c +++ b/arch/x86/kernel/pci-gart_64.c @@ -856,7 +856,7 @@ void __init gart_parse_options(char *p) #endif if (isdigit(*p) && get_option(&p, &arg)) iommu_size = arg; - if (!strncmp(p, "fullflush", 8)) + if (!strncmp(p, "fullflush", 9)) iommu_fullflush = 1; if (!strncmp(p, "nofullflush", 11)) iommu_fullflush = 0; diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 071166a4ba83..a35fcbd9fe38 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -94,18 +94,6 @@ void flush_thread(void) { struct task_struct *tsk = current; -#ifdef CONFIG_X86_64 - if (test_tsk_thread_flag(tsk, TIF_ABI_PENDING)) { - clear_tsk_thread_flag(tsk, TIF_ABI_PENDING); - if (test_tsk_thread_flag(tsk, TIF_IA32)) { - clear_tsk_thread_flag(tsk, TIF_IA32); - } else { - set_tsk_thread_flag(tsk, TIF_IA32); - current_thread_info()->status |= TS_COMPAT; - } - } -#endif - clear_tsk_thread_flag(tsk, TIF_DEBUG); tsk->thread.debugreg0 = 0; diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index ebefb5407b9d..80c2372ec3cb 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c @@ -534,6 +534,17 @@ sys_clone(unsigned long clone_flags, unsigned long newsp, return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid); } +void set_personality_ia32(void) +{ + /* inherit personality from parent */ + + /* Make sure to be in 32bit mode */ + set_thread_flag(TIF_IA32); + + /* Prepare the first "return" to user space */ + current_thread_info()->status |= TS_COMPAT; +} + unsigned long get_wchan(struct task_struct *p) { unsigned long stack; diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index 09ecbde91c13..96e2a86ac86a 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c @@ -417,14 +417,14 @@ static int genregs_get(struct task_struct *target, { if (kbuf) { unsigned long *k = kbuf; - while (count > 0) { + while (count >= sizeof(*k)) { *k++ = getreg(target, pos); count -= sizeof(*k); pos += sizeof(*k); } } else { unsigned long __user *u = ubuf; - while (count > 0) { + while (count >= sizeof(*u)) { if (__put_user(getreg(target, pos), u++)) return -EFAULT; count -= sizeof(*u); @@ -443,14 +443,14 @@ static int genregs_set(struct task_struct *target, int ret = 0; if (kbuf) { const unsigned long *k = kbuf; - while (count > 0 && !ret) { + while (count >= sizeof(*k) && !ret) { ret = putreg(target, pos, *k++); count -= sizeof(*k); pos += sizeof(*k); } } else { const unsigned long __user *u = ubuf; - while (count > 0 && !ret) { + while (count >= sizeof(*u) && !ret) { unsigned long word; ret = __get_user(word, u++); if (ret) @@ -1223,14 +1223,14 @@ static int genregs32_get(struct task_struct *target, { if (kbuf) { compat_ulong_t *k = kbuf; - while (count > 0) { + while (count >= sizeof(*k)) { getreg32(target, pos, k++); count -= sizeof(*k); pos += sizeof(*k); } } else { compat_ulong_t __user *u = ubuf; - while (count > 0) { + while (count >= sizeof(*u)) { compat_ulong_t word; getreg32(target, pos, &word); if (__put_user(word, u++)) @@ -1251,14 +1251,14 @@ static int genregs32_set(struct task_struct *target, int ret = 0; if (kbuf) { const compat_ulong_t *k = kbuf; - while (count > 0 && !ret) { + while (count >= sizeof(*k) && !ret) { ret = putreg32(target, pos, *k++); count -= sizeof(*k); pos += sizeof(*k); } } else { const compat_ulong_t __user *u = ubuf; - while (count > 0 && !ret) { + while (count >= sizeof(*u) && !ret) { compat_ulong_t word; ret = __get_user(word, u++); if (ret) diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index a06e8d101844..df1e1cb8fe4d 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c @@ -257,6 +257,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "SBC-FITPC2"), }, }, + { /* Handle problems with rebooting on ASUS P4S800 */ + .callback = set_bios_reboot, + .ident = "ASUS P4S800", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "P4S800"), + }, + }, { } }; diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 63f32d220ef2..860ed56aa4c4 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -107,6 +107,7 @@ #ifdef CONFIG_X86_64 #include <asm/numa_64.h> #endif +#include <asm/mce.h> #ifndef ARCH_SETUP #define ARCH_SETUP @@ -1030,6 +1031,8 @@ void __init setup_arch(char **cmdline_p) conswitchp = &dummy_con; #endif #endif + + mcheck_intel_therm_init(); } #ifdef CONFIG_X86_32 diff --git a/arch/x86/kernel/tlb_uv.c b/arch/x86/kernel/tlb_uv.c index 77b9689f8edb..9848980dbbc0 100644 --- a/arch/x86/kernel/tlb_uv.c +++ b/arch/x86/kernel/tlb_uv.c @@ -843,8 +843,8 @@ static int __init uv_bau_init(void) GFP_KERNEL, cpu_to_node(cur_cpu)); uv_bau_retry_limit = 1; - uv_nshift = uv_hub_info->n_val; - uv_mmask = (1UL << uv_hub_info->n_val) - 1; + uv_nshift = uv_hub_info->m_val; + uv_mmask = (1UL << uv_hub_info->m_val) - 1; nblades = uv_num_possible_blades(); uv_bau_table_bases = (struct bau_control **) diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c index 21f68e00524f..5c8bffff6bd7 100644 --- a/arch/x86/kvm/i8254.c +++ b/arch/x86/kvm/i8254.c @@ -116,7 +116,7 @@ static s64 __kpit_elapsed(struct kvm *kvm) * itself with the initial count and continues counting * from there. */ - remaining = hrtimer_expires_remaining(&ps->pit_timer.timer); + remaining = hrtimer_get_remaining(&ps->pit_timer.timer); elapsed = ps->pit_timer.period - ktime_to_ns(remaining); elapsed = mod_64(elapsed, ps->pit_timer.period); diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index ae99d83f81a3..9a65123b798e 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -464,7 +464,7 @@ static u32 apic_get_tmcct(struct kvm_lapic *apic) if (apic_get_reg(apic, APIC_TMICT) == 0) return 0; - remaining = hrtimer_expires_remaining(&apic->lapic_timer.timer); + remaining = hrtimer_get_remaining(&apic->lapic_timer.timer); if (ktime_to_ns(remaining) < 0) remaining = ktime_set(0, 0); @@ -567,12 +567,21 @@ static void start_apic_timer(struct kvm_lapic *apic) { ktime_t now = apic->lapic_timer.timer.base->get_time(); - apic->lapic_timer.period = apic_get_reg(apic, APIC_TMICT) * + apic->lapic_timer.period = (u64)apic_get_reg(apic, APIC_TMICT) * APIC_BUS_CYCLE_NS * apic->divide_count; atomic_set(&apic->lapic_timer.pending, 0); if (!apic->lapic_timer.period) return; + /* + * Do not allow the guest to program periodic timers with small + * interval, since the hrtimers are not throttled by the host + * scheduler. + */ + if (apic_lvtt_period(apic)) { + if (apic->lapic_timer.period < NSEC_PER_MSEC/2) + apic->lapic_timer.period = NSEC_PER_MSEC/2; + } hrtimer_start(&apic->lapic_timer.timer, ktime_add_ns(now, apic->lapic_timer.period), diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 0ef5bb2b4043..47122930a8bb 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -2633,7 +2633,8 @@ EXPORT_SYMBOL_GPL(kvm_mmu_unprotect_page_virt); void __kvm_mmu_free_some_pages(struct kvm_vcpu *vcpu) { - while (vcpu->kvm->arch.n_free_mmu_pages < KVM_REFILL_PAGES) { + while (vcpu->kvm->arch.n_free_mmu_pages < KVM_REFILL_PAGES && + !list_empty(&vcpu->kvm->arch.active_mmu_pages)) { struct kvm_mmu_page *sp; sp = container_of(vcpu->kvm->arch.active_mmu_pages.prev, @@ -2712,12 +2713,6 @@ static int alloc_mmu_pages(struct kvm_vcpu *vcpu) ASSERT(vcpu); - if (vcpu->kvm->arch.n_requested_mmu_pages) - vcpu->kvm->arch.n_free_mmu_pages = - vcpu->kvm->arch.n_requested_mmu_pages; - else - vcpu->kvm->arch.n_free_mmu_pages = - vcpu->kvm->arch.n_alloc_mmu_pages; /* * When emulating 32-bit mode, cr3 is only 32 bits even on x86_64. * Therefore we need to allocate shadow page tables in the first diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index b1f658ad2f06..4ac68999c7b0 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -709,6 +709,8 @@ static void svm_vcpu_load(struct kvm_vcpu *vcpu, int cpu) rdtscll(tsc_this); delta = vcpu->arch.host_tsc - tsc_this; svm->vmcb->control.tsc_offset += delta; + if (is_nested(svm)) + svm->hsave->control.tsc_offset += delta; vcpu->cpu = cpu; kvm_migrate_timers(vcpu); svm->asid_generation = 0; @@ -1954,10 +1956,14 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 *data) switch (ecx) { case MSR_IA32_TIME_STAMP_COUNTER: { - u64 tsc; + u64 tsc_offset; - rdtscll(tsc); - *data = svm->vmcb->control.tsc_offset + tsc; + if (is_nested(svm)) + tsc_offset = svm->hsave->control.tsc_offset; + else + tsc_offset = svm->vmcb->control.tsc_offset; + + *data = tsc_offset + native_read_tsc(); break; } case MSR_K6_STAR: @@ -2044,10 +2050,17 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 data) switch (ecx) { case MSR_IA32_TIME_STAMP_COUNTER: { - u64 tsc; + u64 tsc_offset = data - native_read_tsc(); + u64 g_tsc_offset = 0; + + if (is_nested(svm)) { + g_tsc_offset = svm->vmcb->control.tsc_offset - + svm->hsave->control.tsc_offset; + svm->hsave->control.tsc_offset = tsc_offset; + } + + svm->vmcb->control.tsc_offset = tsc_offset + g_tsc_offset; - rdtscll(tsc); - svm->vmcb->control.tsc_offset = data - tsc; break; } case MSR_K6_STAR: diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 29f912927a58..ff72e4d85696 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -661,7 +661,7 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu) if (vcpu->cpu != cpu) { vcpu_clear(vmx); kvm_migrate_timers(vcpu); - vpid_sync_vcpu_all(vmx); + set_bit(KVM_REQ_TLB_FLUSH, &vcpu->requests); local_irq_disable(); list_add(&vmx->local_vcpus_link, &per_cpu(vcpus_on_cpu, cpu)); @@ -1217,12 +1217,9 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf) if (_cpu_based_2nd_exec_control & SECONDARY_EXEC_ENABLE_EPT) { /* CR3 accesses and invlpg don't need to cause VM Exits when EPT enabled */ - min &= ~(CPU_BASED_CR3_LOAD_EXITING | - CPU_BASED_CR3_STORE_EXITING | - CPU_BASED_INVLPG_EXITING); - if (adjust_vmx_controls(min, opt, MSR_IA32_VMX_PROCBASED_CTLS, - &_cpu_based_exec_control) < 0) - return -EIO; + _cpu_based_exec_control &= ~(CPU_BASED_CR3_LOAD_EXITING | + CPU_BASED_CR3_STORE_EXITING | + CPU_BASED_INVLPG_EXITING); rdmsr(MSR_IA32_VMX_EPT_VPID_CAP, vmx_capability.ept, vmx_capability.vpid); } @@ -1572,7 +1569,6 @@ static void ept_update_paging_mode_cr0(unsigned long *hw_cr0, vcpu->arch.cr0 = cr0; vmx_set_cr4(vcpu, vcpu->arch.cr4); *hw_cr0 |= X86_CR0_PE | X86_CR0_PG; - *hw_cr0 &= ~X86_CR0_WP; } else if (!is_paging(vcpu)) { /* From nonpaging to paging */ vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, @@ -1581,9 +1577,10 @@ static void ept_update_paging_mode_cr0(unsigned long *hw_cr0, CPU_BASED_CR3_STORE_EXITING)); vcpu->arch.cr0 = cr0; vmx_set_cr4(vcpu, vcpu->arch.cr4); - if (!(vcpu->arch.cr0 & X86_CR0_WP)) - *hw_cr0 &= ~X86_CR0_WP; } + + if (!(cr0 & X86_CR0_WP)) + *hw_cr0 &= ~X86_CR0_WP; } static void ept_update_paging_mode_cr4(unsigned long *hw_cr4, @@ -2841,6 +2838,8 @@ static int handle_dr(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) unsigned long val; int dr, reg; + if (!kvm_require_cpl(vcpu, 0)) + return 1; dr = vmcs_readl(GUEST_DR7); if (dr & DR7_GD) { /* diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 3d4529011828..26e454ccd0a8 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -215,6 +215,19 @@ static void __queue_exception(struct kvm_vcpu *vcpu) } /* + * Checks if cpl <= required_cpl; if true, return true. Otherwise queue + * a #GP and return false. + */ +bool kvm_require_cpl(struct kvm_vcpu *vcpu, int required_cpl) +{ + if (kvm_x86_ops->get_cpl(vcpu) <= required_cpl) + return true; + kvm_queue_exception_e(vcpu, GP_VECTOR, 0); + return false; +} +EXPORT_SYMBOL_GPL(kvm_require_cpl); + +/* * Load the pae pdptrs. Return true is they are all valid. */ int load_pdptrs(struct kvm_vcpu *vcpu, unsigned long cr3) @@ -936,6 +949,7 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata) case MSR_P6_EVNTSEL0: case MSR_P6_EVNTSEL1: case MSR_K7_EVNTSEL0: + case MSR_K8_INT_PENDING_MSG: data = 0; break; case MSR_MTRRcap: @@ -1416,6 +1430,8 @@ static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid, if (cpuid->nent < 1) goto out; + if (cpuid->nent > KVM_MAX_CPUID_ENTRIES) + cpuid->nent = KVM_MAX_CPUID_ENTRIES; r = -ENOMEM; cpuid_entries = vmalloc(sizeof(struct kvm_cpuid_entry2) * cpuid->nent); if (!cpuid_entries) @@ -1435,6 +1451,10 @@ static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid, for (func = 0x80000001; func <= limit && nent < cpuid->nent; ++func) do_cpuid_ent(&cpuid_entries[nent], func, 0, &nent, cpuid->nent); + r = -E2BIG; + if (nent >= cpuid->nent) + goto out_free; + r = -EFAULT; if (copy_to_user(entries, cpuid_entries, nent * sizeof(struct kvm_cpuid_entry2))) @@ -2898,6 +2918,11 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) a3 &= 0xFFFFFFFF; } + if (kvm_x86_ops->get_cpl(vcpu) != 0) { + ret = -KVM_EPERM; + goto out; + } + switch (nr) { case KVM_HC_VAPIC_POLL_IRQ: ret = 0; @@ -2909,6 +2934,7 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) ret = -KVM_ENOSYS; break; } +out: kvm_register_write(vcpu, VCPU_REGS_RAX, ret); ++vcpu->stat.hypercalls; return r; @@ -3179,6 +3205,9 @@ static void update_cr8_intercept(struct kvm_vcpu *vcpu) if (!kvm_x86_ops->update_cr8_intercept) return; + if (!vcpu->arch.apic) + return; + if (!vcpu->arch.apic->vapic_addr) max_irr = kvm_lapic_find_highest_irr(vcpu); else @@ -3733,7 +3762,7 @@ static int save_guest_segment_descriptor(struct kvm_vcpu *vcpu, u16 selector, return kvm_write_guest(vcpu->kvm, gpa, seg_desc, 8); } -static u32 get_tss_base_addr(struct kvm_vcpu *vcpu, +static gpa_t get_tss_base_addr(struct kvm_vcpu *vcpu, struct desc_struct *seg_desc) { u32 base_addr; @@ -4099,13 +4128,7 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, vcpu->arch.cr2 = sregs->cr2; mmu_reset_needed |= vcpu->arch.cr3 != sregs->cr3; - - down_read(&vcpu->kvm->slots_lock); - if (gfn_to_memslot(vcpu->kvm, sregs->cr3 >> PAGE_SHIFT)) - vcpu->arch.cr3 = sregs->cr3; - else - set_bit(KVM_REQ_TRIPLE_FAULT, &vcpu->requests); - up_read(&vcpu->kvm->slots_lock); + vcpu->arch.cr3 = sregs->cr3; kvm_set_cr8(vcpu, sregs->cr8); diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c index 616de4628d60..4b12352d0399 100644 --- a/arch/x86/kvm/x86_emulate.c +++ b/arch/x86/kvm/x86_emulate.c @@ -60,6 +60,7 @@ #define SrcImmByte (6<<4) /* 8-bit sign-extended immediate operand. */ #define SrcOne (7<<4) /* Implied '1' */ #define SrcImmUByte (8<<4) /* 8-bit unsigned immediate operand. */ +#define SrcImmU (9<<4) /* Immediate operand, unsigned */ #define SrcMask (0xf<<4) /* Generic ModRM decode. */ #define ModRM (1<<8) @@ -195,7 +196,7 @@ static u32 opcode_table[256] = { ByteOp | SrcImmUByte, SrcImmUByte, /* 0xE8 - 0xEF */ SrcImm | Stack, SrcImm | ImplicitOps, - SrcImm | Src2Imm16, SrcImmByte | ImplicitOps, + SrcImmU | Src2Imm16, SrcImmByte | ImplicitOps, SrcNone | ByteOp | ImplicitOps, SrcNone | ImplicitOps, SrcNone | ByteOp | ImplicitOps, SrcNone | ImplicitOps, /* 0xF0 - 0xF7 */ @@ -605,6 +606,9 @@ static int do_insn_fetch(struct x86_emulate_ctxt *ctxt, { int rc = 0; + /* x86 instructions are limited to 15 bytes. */ + if (eip + size - ctxt->decode.eip_orig > 15) + return X86EMUL_UNHANDLEABLE; eip += ctxt->cs_base; while (size--) { rc = do_fetch_insn_byte(ctxt, ops, eip++, dest++); @@ -863,7 +867,7 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) /* Shadow copy of register state. Committed on successful emulation. */ memset(c, 0, sizeof(struct decode_cache)); - c->eip = kvm_rip_read(ctxt->vcpu); + c->eip = c->eip_orig = kvm_rip_read(ctxt->vcpu); ctxt->cs_base = seg_base(ctxt, VCPU_SREG_CS); memcpy(c->regs, ctxt->vcpu->arch.regs, sizeof c->regs); @@ -1027,6 +1031,7 @@ done_prefixes: c->src.type = OP_MEM; break; case SrcImm: + case SrcImmU: c->src.type = OP_IMM; c->src.ptr = (unsigned long *)c->eip; c->src.bytes = (c->d & ByteOp) ? 1 : c->op_bytes; @@ -1044,6 +1049,19 @@ done_prefixes: c->src.val = insn_fetch(s32, 4, c->eip); break; } + if ((c->d & SrcMask) == SrcImmU) { + switch (c->src.bytes) { + case 1: + c->src.val &= 0xff; + break; + case 2: + c->src.val &= 0xffff; + break; + case 4: + c->src.val &= 0xffffffff; + break; + } + } break; case SrcImmByte: case SrcImmUByte: diff --git a/arch/x86/mm/Makefile b/arch/x86/mm/Makefile index eefdeee8a871..0088329b564b 100644 --- a/arch/x86/mm/Makefile +++ b/arch/x86/mm/Makefile @@ -1,6 +1,11 @@ obj-y := init.o init_$(BITS).o fault.o ioremap.o extable.o pageattr.o mmap.o \ pat.o pgtable.o gup.o +# Make sure __phys_addr has no stackprotector +nostackp := $(call cc-option, -fno-stack-protector) +CFLAGS_ioremap.o := $(nostackp) +CFLAGS_init.o := $(nostackp) + obj-$(CONFIG_SMP) += tlb.o obj-$(CONFIG_X86_32) += pgtable_32.o iomap_32.o diff --git a/arch/x86/mm/mmap.c b/arch/x86/mm/mmap.c index 165829600566..c8191defc38a 100644 --- a/arch/x86/mm/mmap.c +++ b/arch/x86/mm/mmap.c @@ -29,13 +29,26 @@ #include <linux/random.h> #include <linux/limits.h> #include <linux/sched.h> +#include <asm/elf.h> + +static unsigned int stack_maxrandom_size(void) +{ + unsigned int max = 0; + if ((current->flags & PF_RANDOMIZE) && + !(current->personality & ADDR_NO_RANDOMIZE)) { + max = ((-1U) & STACK_RND_MASK) << PAGE_SHIFT; + } + + return max; +} + /* * Top of mmap area (just below the process stack). * - * Leave an at least ~128 MB hole. + * Leave an at least ~128 MB hole with possible stack randomization. */ -#define MIN_GAP (128*1024*1024) +#define MIN_GAP (128*1024*1024UL + stack_maxrandom_size()) #define MAX_GAP (TASK_SIZE/6*5) /* diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 7e600c1962db..fbb46d62ee5d 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c @@ -143,6 +143,7 @@ void clflush_cache_range(void *vaddr, unsigned int size) mb(); } +EXPORT_SYMBOL_GPL(clflush_cache_range); static void __cpa_flush_all(void *arg) { @@ -822,6 +823,7 @@ static int change_page_attr_set_clr(unsigned long *addr, int numpages, { struct cpa_data cpa; int ret, cache, checkalias; + unsigned long baddr = 0; /* * Check, if we are requested to change a not supported @@ -853,6 +855,11 @@ static int change_page_attr_set_clr(unsigned long *addr, int numpages, */ WARN_ON_ONCE(1); } + /* + * Save address for cache flush. *addr is modified in the call + * to __change_page_attr_set_clr() below. + */ + baddr = *addr; } /* Must avoid aliasing mappings in the highmem code */ @@ -900,7 +907,7 @@ static int change_page_attr_set_clr(unsigned long *addr, int numpages, cpa_flush_array(addr, numpages, cache, cpa.flags, pages); } else - cpa_flush_range(*addr, numpages, cache); + cpa_flush_range(baddr, numpages, cache); } else cpa_flush_all(cache); diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c index 52e62e57fedd..5da8792b48a4 100644 --- a/arch/x86/pci/i386.c +++ b/arch/x86/pci/i386.c @@ -282,6 +282,15 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, return -EINVAL; prot = pgprot_val(vma->vm_page_prot); + + /* + * Return error if pat is not enabled and write_combine is requested. + * Caller can followup with UC MINUS request and add a WC mtrr if there + * is a free mtrr slot. + */ + if (!pat_enabled && write_combine) + return -EINVAL; + if (pat_enabled && write_combine) prot |= _PAGE_CACHE_WC; else if (pat_enabled || boot_cpu_data.x86 > 3) diff --git a/arch/x86/xen/Makefile b/arch/x86/xen/Makefile index 7410640db173..3bb4fc21f4f2 100644 --- a/arch/x86/xen/Makefile +++ b/arch/x86/xen/Makefile @@ -8,6 +8,7 @@ endif # Make sure early boot has no stackprotector nostackp := $(call cc-option, -fno-stack-protector) CFLAGS_enlighten.o := $(nostackp) +CFLAGS_mmu.o := $(nostackp) obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \ time.o xen-asm.o xen-asm_$(BITS).o \ @@ -16,3 +17,4 @@ obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \ obj-$(CONFIG_SMP) += smp.o obj-$(CONFIG_PARAVIRT_SPINLOCKS)+= spinlock.o obj-$(CONFIG_XEN_DEBUG_FS) += debugfs.o + diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index eb33aaa8415d..a11a115d82d3 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c @@ -51,6 +51,7 @@ #include <asm/pgtable.h> #include <asm/tlbflush.h> #include <asm/reboot.h> +#include <asm/stackprotector.h> #include "xen-ops.h" #include "mmu.h" @@ -177,6 +178,7 @@ static __read_mostly unsigned int cpuid_leaf1_ecx_mask = ~0; static void xen_cpuid(unsigned int *ax, unsigned int *bx, unsigned int *cx, unsigned int *dx) { + unsigned maskebx = ~0; unsigned maskecx = ~0; unsigned maskedx = ~0; @@ -184,9 +186,16 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, * Mask out inconvenient features, to try and disable as many * unsupported kernel subsystems as possible. */ - if (*ax == 1) { + switch (*ax) { + case 1: maskecx = cpuid_leaf1_ecx_mask; maskedx = cpuid_leaf1_edx_mask; + break; + + case 0xb: + /* Suppress extended topology stuff */ + maskebx = 0; + break; } asm(XEN_EMULATE_PREFIX "cpuid" @@ -196,6 +205,7 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, "=d" (*dx) : "0" (*ax), "2" (*cx)); + *bx &= maskebx; *cx &= maskecx; *dx &= maskedx; } @@ -330,18 +340,28 @@ static void xen_load_gdt(const struct desc_ptr *dtr) unsigned long frames[pages]; int f; - /* A GDT can be up to 64k in size, which corresponds to 8192 - 8-byte entries, or 16 4k pages.. */ + /* + * A GDT can be up to 64k in size, which corresponds to 8192 + * 8-byte entries, or 16 4k pages.. + */ BUG_ON(size > 65536); BUG_ON(va & ~PAGE_MASK); for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) { int level; - pte_t *ptep = lookup_address(va, &level); + pte_t *ptep; unsigned long pfn, mfn; void *virt; + /* + * The GDT is per-cpu and is in the percpu data area. + * That can be virtually mapped, so we need to do a + * page-walk to get the underlying MFN for the + * hypercall. The page can also be in the kernel's + * linear range, so we need to RO that mapping too. + */ + ptep = lookup_address(va, &level); BUG_ON(ptep == NULL); pfn = pte_pfn(*ptep); @@ -358,6 +378,44 @@ static void xen_load_gdt(const struct desc_ptr *dtr) BUG(); } +/* + * load_gdt for early boot, when the gdt is only mapped once + */ +static __init void xen_load_gdt_boot(const struct desc_ptr *dtr) +{ + unsigned long va = dtr->address; + unsigned int size = dtr->size + 1; + unsigned pages = (size + PAGE_SIZE - 1) / PAGE_SIZE; + unsigned long frames[pages]; + int f; + + /* + * A GDT can be up to 64k in size, which corresponds to 8192 + * 8-byte entries, or 16 4k pages.. + */ + + BUG_ON(size > 65536); + BUG_ON(va & ~PAGE_MASK); + + for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) { + pte_t pte; + unsigned long pfn, mfn; + + pfn = virt_to_pfn(va); + mfn = pfn_to_mfn(pfn); + + pte = pfn_pte(pfn, PAGE_KERNEL_RO); + + if (HYPERVISOR_update_va_mapping((unsigned long)va, pte, 0)) + BUG(); + + frames[f] = mfn; + } + + if (HYPERVISOR_set_gdt(frames, size / sizeof(struct desc_struct))) + BUG(); +} + static void load_TLS_descriptor(struct thread_struct *t, unsigned int cpu, unsigned int i) { @@ -581,6 +639,29 @@ static void xen_write_gdt_entry(struct desc_struct *dt, int entry, preempt_enable(); } +/* + * Version of write_gdt_entry for use at early boot-time needed to + * update an entry as simply as possible. + */ +static __init void xen_write_gdt_entry_boot(struct desc_struct *dt, int entry, + const void *desc, int type) +{ + switch (type) { + case DESC_LDT: + case DESC_TSS: + /* ignore */ + break; + + default: { + xmaddr_t maddr = virt_to_machine(&dt[entry]); + + if (HYPERVISOR_update_descriptor(maddr.maddr, *(u64 *)desc)) + dt[entry] = *(struct desc_struct *)desc; + } + + } +} + static void xen_load_sp0(struct tss_struct *tss, struct thread_struct *thread) { @@ -965,6 +1046,23 @@ static const struct machine_ops __initdata xen_machine_ops = { .emergency_restart = xen_emergency_restart, }; +/* + * Set up the GDT and segment registers for -fstack-protector. Until + * we do this, we have to be careful not to call any stack-protected + * function, which is most of the kernel. + */ +static void __init xen_setup_stackprotector(void) +{ + pv_cpu_ops.write_gdt_entry = xen_write_gdt_entry_boot; + pv_cpu_ops.load_gdt = xen_load_gdt_boot; + + setup_stack_canary_segment(0); + switch_to_new_gdt(0); + + pv_cpu_ops.write_gdt_entry = xen_write_gdt_entry; + pv_cpu_ops.load_gdt = xen_load_gdt; +} + /* First C function to be called on Xen boot */ asmlinkage void __init xen_start_kernel(void) { @@ -983,14 +1081,34 @@ asmlinkage void __init xen_start_kernel(void) pv_apic_ops = xen_apic_ops; pv_mmu_ops = xen_mmu_ops; -#ifdef CONFIG_X86_64 /* - * Setup percpu state. We only need to do this for 64-bit - * because 32-bit already has %fs set properly. + * Set up some pagetable state before starting to set any ptes. */ - load_percpu_segment(0); + + /* Prevent unwanted bits from being set in PTEs. */ + __supported_pte_mask &= ~_PAGE_GLOBAL; + if (!xen_initial_domain()) + __supported_pte_mask &= ~(_PAGE_PWT | _PAGE_PCD); + + __supported_pte_mask |= _PAGE_IOMAP; + +#ifdef CONFIG_X86_64 + /* Work out if we support NX */ + check_efer(); #endif + xen_setup_features(); + + /* Get mfn list */ + if (!xen_feature(XENFEAT_auto_translated_physmap)) + xen_build_dynamic_phys_to_machine(); + + /* + * Set up kernel GDT and segment registers, mainly so that + * -fstack-protector code can be executed. + */ + xen_setup_stackprotector(); + xen_init_irq_ops(); xen_init_cpuid_mask(); @@ -1001,8 +1119,6 @@ asmlinkage void __init xen_start_kernel(void) set_xen_basic_apic_ops(); #endif - xen_setup_features(); - if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) { pv_mmu_ops.ptep_modify_prot_start = xen_ptep_modify_prot_start; pv_mmu_ops.ptep_modify_prot_commit = xen_ptep_modify_prot_commit; @@ -1019,22 +1135,8 @@ asmlinkage void __init xen_start_kernel(void) xen_smp_init(); - /* Get mfn list */ - if (!xen_feature(XENFEAT_auto_translated_physmap)) - xen_build_dynamic_phys_to_machine(); - pgd = (pgd_t *)xen_start_info->pt_base; - /* Prevent unwanted bits from being set in PTEs. */ - __supported_pte_mask &= ~_PAGE_GLOBAL; - if (!xen_initial_domain()) - __supported_pte_mask &= ~(_PAGE_PWT | _PAGE_PCD); - -#ifdef CONFIG_X86_64 - /* Work out if we support NX */ - check_efer(); -#endif - /* Don't do the full vcpu_info placement stuff until we have a possible map and a non-dummy shared_info. */ per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0]; diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 429834ec1687..fe03eeed7b48 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c @@ -236,6 +236,7 @@ cpu_initialize_context(unsigned int cpu, struct task_struct *idle) ctxt->user_regs.ss = __KERNEL_DS; #ifdef CONFIG_X86_32 ctxt->user_regs.fs = __KERNEL_PERCPU; + ctxt->user_regs.gs = __KERNEL_STACK_CANARY; #else ctxt->gs_base_kernel = per_cpu_offset(cpu); #endif diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c index 5601506f2dd9..36a5141108df 100644 --- a/arch/x86/xen/spinlock.c +++ b/arch/x86/xen/spinlock.c @@ -187,7 +187,6 @@ static noinline int xen_spin_lock_slow(struct raw_spinlock *lock, bool irq_enabl struct xen_spinlock *prev; int irq = __get_cpu_var(lock_kicker_irq); int ret; - unsigned long flags; u64 start; /* If kicker interrupts not initialized yet, just spin */ @@ -199,16 +198,12 @@ static noinline int xen_spin_lock_slow(struct raw_spinlock *lock, bool irq_enabl /* announce we're spinning */ prev = spinning_lock(xl); - flags = __raw_local_save_flags(); - if (irq_enable) { - ADD_STATS(taken_slow_irqenable, 1); - raw_local_irq_enable(); - } - ADD_STATS(taken_slow, 1); ADD_STATS(taken_slow_nested, prev != NULL); do { + unsigned long flags; + /* clear pending */ xen_clear_irq_pending(irq); @@ -228,6 +223,12 @@ static noinline int xen_spin_lock_slow(struct raw_spinlock *lock, bool irq_enabl goto out; } + flags = __raw_local_save_flags(); + if (irq_enable) { + ADD_STATS(taken_slow_irqenable, 1); + raw_local_irq_enable(); + } + /* * Block until irq becomes pending. If we're * interrupted at this point (after the trylock but @@ -238,13 +239,15 @@ static noinline int xen_spin_lock_slow(struct raw_spinlock *lock, bool irq_enabl * pending. */ xen_poll_irq(irq); + + raw_local_irq_restore(flags); + ADD_STATS(taken_slow_spurious, !xen_test_irq_pending(irq)); } while (!xen_test_irq_pending(irq)); /* check for spurious wakeups */ kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); out: - raw_local_irq_restore(flags); unspinning_lock(xl, prev); spin_time_accum_blocked(start); @@ -323,8 +326,13 @@ static void xen_spin_unlock(struct raw_spinlock *lock) smp_wmb(); /* make sure no writes get moved after unlock */ xl->lock = 0; /* release lock */ - /* make sure unlock happens before kick */ - barrier(); + /* + * Make sure unlock happens before checking for waiting + * spinners. We need a strong barrier to enforce the + * write-read ordering to different memory locations, as the + * CPU makes no implied guarantees about their ordering. + */ + mb(); if (unlikely(xl->spinners)) xen_spin_unlock_slow(xl); diff --git a/arch/xtensa/kernel/Makefile b/arch/xtensa/kernel/Makefile index fe3186de6a33..6f56d95f2c1e 100644 --- a/arch/xtensa/kernel/Makefile +++ b/arch/xtensa/kernel/Makefile @@ -27,7 +27,8 @@ sed-y = -e 's/(\(\.[a-z]*it\|\.ref\|\)\.text)/(\1.literal \1.text)/g' \ -e 's/(\(\.text\.[a-z]*\))/(\1.literal \1)/g' quiet_cmd__cpp_lds_S = LDS $@ - cmd__cpp_lds_S = $(CPP) $(cpp_flags) -D__ASSEMBLY__ $< | sed $(sed-y) >$@ + cmd__cpp_lds_S = $(CPP) $(cpp_flags) -P -C -Uxtensa -D__ASSEMBLY__ $< \ + | sed $(sed-y) >$@ $(obj)/vmlinux.lds: $(src)/vmlinux.lds.S FORCE $(call if_changed_dep,_cpp_lds_S) diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index d3aa2aadb3e0..b78c9c3e2670 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c @@ -40,7 +40,12 @@ queue_requests_store(struct request_queue *q, const char *page, size_t count) { struct request_list *rl = &q->rq; unsigned long nr; - int ret = queue_var_store(&nr, page, count); + int ret; + + if (!q->request_fn) + return -EINVAL; + + ret = queue_var_store(&nr, page, count); if (nr < BLKDEV_MIN_RQ) nr = BLKDEV_MIN_RQ; diff --git a/block/genhd.c b/block/genhd.c index c0c7f38c7012..f4c64c2b303a 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -992,22 +992,6 @@ static void disk_release(struct device *dev) free_part_stats(&disk->part0); kfree(disk); } - -static int disk_uevent(struct device *dev, struct kobj_uevent_env *env) -{ - struct gendisk *disk = dev_to_disk(dev); - struct disk_part_iter piter; - struct hd_struct *part; - int cnt = 0; - - disk_part_iter_init(&piter, disk, 0); - while((part = disk_part_iter_next(&piter))) - cnt++; - disk_part_iter_exit(&piter); - add_uevent_var(env, "NPARTS=%u", cnt); - return 0; -} - struct class block_class = { .name = "block", }; @@ -1026,7 +1010,6 @@ static struct device_type disk_type = { .groups = disk_attr_groups, .release = disk_release, .nodename = block_nodename, - .uevent = disk_uevent, }; #ifdef CONFIG_PROC_FS diff --git a/drivers/Kconfig b/drivers/Kconfig index 5dacbbd42483..48bbdbe43e69 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -90,8 +90,6 @@ source "drivers/memstick/Kconfig" source "drivers/leds/Kconfig" -source "drivers/switch/Kconfig" - source "drivers/accessibility/Kconfig" source "drivers/infiniband/Kconfig" diff --git a/drivers/Makefile b/drivers/Makefile index c19a0c18e5ed..4a9a1c55b598 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -95,7 +95,6 @@ obj-$(CONFIG_ARCH_MXC) += mxc/ obj-$(CONFIG_MMC) += mmc/ obj-$(CONFIG_MEMSTICK) += memstick/ obj-$(CONFIG_NEW_LEDS) += leds/ -obj-$(CONFIG_SWITCH) += switch/ obj-$(CONFIG_INFINIBAND) += infiniband/ obj-$(CONFIG_SGI_SN) += sn/ obj-y += firmware/ diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index 5691f165a952..8dff236f7ed3 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c @@ -1182,7 +1182,13 @@ int acpi_check_resource_conflict(struct resource *res) res_list_elem->name, (long long) res_list_elem->start, (long long) res_list_elem->end); - printk(KERN_INFO "ACPI: Device needs an ACPI driver\n"); + if (acpi_enforce_resources == ENFORCE_RESOURCES_LAX) + printk(KERN_NOTICE "ACPI: This conflict may" + " cause random problems and system" + " instability\n"); + printk(KERN_INFO "ACPI: If an ACPI driver is available" + " for this device, you should use it instead of" + " the native driver\n"); } if (acpi_enforce_resources == ENFORCE_RESOURCES_STRICT) return -EBUSY; diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c index 55b5b90c2a44..97fad2979920 100644 --- a/drivers/acpi/pci_root.c +++ b/drivers/acpi/pci_root.c @@ -400,6 +400,17 @@ struct pci_dev *acpi_get_pci_dev(acpi_handle handle) pbus = pdev->subordinate; pci_dev_put(pdev); + + /* + * This function may be called for a non-PCI device that has a + * PCI parent (eg. a disk under a PCI SATA controller). In that + * case pdev->subordinate will be NULL for the parent. + */ + if (!pbus) { + dev_dbg(&pdev->dev, "Not a PCI-to-PCI bridge\n"); + pdev = NULL; + break; + } } out: list_for_each_entry_safe(node, tmp, &device_list, node) diff --git a/drivers/acpi/pci_slot.c b/drivers/acpi/pci_slot.c index 12158e0d009b..da9d6d25cf6d 100644 --- a/drivers/acpi/pci_slot.c +++ b/drivers/acpi/pci_slot.c @@ -57,7 +57,7 @@ ACPI_MODULE_NAME("pci_slot"); MY_NAME , ## arg); \ } while (0) -#define SLOT_NAME_SIZE 20 /* Inspired by #define in acpiphp.h */ +#define SLOT_NAME_SIZE 21 /* Inspired by #define in acpiphp.h */ struct acpi_pci_slot { acpi_handle root_handle; /* handle of the root bridge */ @@ -149,7 +149,7 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) return AE_OK; } - snprintf(name, sizeof(name), "%u", (u32)sun); + snprintf(name, sizeof(name), "%llu", sun); pci_slot = pci_create_slot(pci_bus, device, name, NULL); if (IS_ERR(pci_slot)) { err("pci_create_slot returned %ld\n", PTR_ERR(pci_slot)); diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 66393d5c4c7c..f6d84694f17f 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c @@ -876,12 +876,14 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev, return(acpi_idle_enter_c1(dev, state)); local_irq_disable(); - current_thread_info()->status &= ~TS_POLLING; - /* - * TS_POLLING-cleared state must be visible before we test - * NEED_RESCHED: - */ - smp_mb(); + if (cx->entry_method != ACPI_CSTATE_FFH) { + current_thread_info()->status &= ~TS_POLLING; + /* + * TS_POLLING-cleared state must be visible before we test + * NEED_RESCHED: + */ + smp_mb(); + } if (unlikely(need_resched())) { current_thread_info()->status |= TS_POLLING; @@ -961,12 +963,14 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, } local_irq_disable(); - current_thread_info()->status &= ~TS_POLLING; - /* - * TS_POLLING-cleared state must be visible before we test - * NEED_RESCHED: - */ - smp_mb(); + if (cx->entry_method != ACPI_CSTATE_FFH) { + current_thread_info()->status &= ~TS_POLLING; + /* + * TS_POLLING-cleared state must be visible before we test + * NEED_RESCHED: + */ + smp_mb(); + } if (unlikely(need_resched())) { current_thread_info()->status |= TS_POLLING; diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 781435d7e369..5dd702c9c1fa 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c @@ -1264,16 +1264,6 @@ acpi_add_single_object(struct acpi_device **child, acpi_device_set_id(device, parent, handle, type); /* - * The ACPI device is attached to acpi handle before getting - * the power/wakeup/peformance flags. Otherwise OS can't get - * the corresponding ACPI device by the acpi handle in the course - * of getting the power/wakeup/performance flags. - */ - result = acpi_device_set_context(device, type); - if (result) - goto end; - - /* * Power Management * ---------------- */ @@ -1303,6 +1293,8 @@ acpi_add_single_object(struct acpi_device **child, goto end; } + if ((result = acpi_device_set_context(device, type))) + goto end; result = acpi_device_register(device, parent); diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index 42159a28f433..1caac3b1a558 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c @@ -405,6 +405,46 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { }, }, { + .callback = init_set_sci_en_on_resume, + .ident = "Hewlett-Packard HP Pavilion dv3 Notebook PC", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv3 Notebook PC"), + }, + }, + { + .callback = init_set_sci_en_on_resume, + .ident = "Hewlett-Packard Pavilion dv4", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4"), + }, + }, + { + .callback = init_set_sci_en_on_resume, + .ident = "Hewlett-Packard Pavilion dv7", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv7"), + }, + }, + { + .callback = init_set_sci_en_on_resume, + .ident = "Hewlett-Packard Compaq Presario C700 Notebook PC", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "Compaq Presario C700 Notebook PC"), + }, + }, + { + .callback = init_set_sci_en_on_resume, + .ident = "Hewlett-Packard Compaq Presario CQ40 Notebook PC", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "Compaq Presario CQ40 Notebook PC"), + }, + }, + { .callback = init_old_suspend_ordering, .ident = "Panasonic CF51-2L", .matches = { diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index edc9b0ec9f39..38f4d0fc46a8 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -122,7 +122,8 @@ static const struct ata_port_info ahci_port_info[] = { [board_ahci_sb600] = { AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL | - AHCI_HFLAG_NO_MSI | AHCI_HFLAG_SECT255), + AHCI_HFLAG_32BIT_ONLY | AHCI_HFLAG_NO_MSI | + AHCI_HFLAG_SECT255), .flags = AHCI_FLAG_COMMON, .pio_mask = ATA_PIO4, .udma_mask = ATA_UDMA6, @@ -692,51 +693,6 @@ static void ahci_p5wdh_workaround(struct ata_host *host) } } -/* - * SB600 ahci controller on ASUS M2A-VM can't do 64bit DMA with older - * BIOS. The oldest version known to be broken is 0901 and working is - * 1501 which was released on 2007-10-26. Force 32bit DMA on anything - * older than 1501. Please read bko#9412 for more info. - */ -static bool ahci_asus_m2a_vm_32bit_only(struct pci_dev *pdev) -{ - static const struct dmi_system_id sysids[] = { - { - .ident = "ASUS M2A-VM", - .matches = { - DMI_MATCH(DMI_BOARD_VENDOR, - "ASUSTeK Computer INC."), - DMI_MATCH(DMI_BOARD_NAME, "M2A-VM"), - }, - }, - { } - }; - const char *cutoff_mmdd = "10/26"; - const char *date; - int year; - - if (pdev->bus->number != 0 || pdev->devfn != PCI_DEVFN(0x12, 0) || - !dmi_check_system(sysids)) - return false; - - /* - * Argh.... both version and date are free form strings. - * Let's hope they're using the same date format across - * different versions. - */ - date = dmi_get_system_info(DMI_BIOS_DATE); - year = dmi_get_year(DMI_BIOS_DATE); - if (date && strlen(date) >= 10 && date[2] == '/' && date[5] == '/' && - (year > 2007 || - (year == 2007 && strncmp(date, cutoff_mmdd, 5) >= 0))) - return false; - - dev_printk(KERN_WARNING, &pdev->dev, "ASUS M2A-VM: BIOS too old, " - "forcing 32bit DMA, update BIOS\n"); - - return true; -} - static bool ahci_broken_system_poweroff(struct pci_dev *pdev) { static const struct dmi_system_id broken_systems[] = { @@ -996,12 +952,8 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) if (board_id == board_ahci_sb700 && pdev->revision >= 0x40) hpriv->flags &= ~AHCI_HFLAG_IGN_SERR_INTERNAL; - /* apply ASUS M2A_VM quirk */ - if (ahci_asus_m2a_vm_32bit_only(pdev)) - hpriv->flags |= AHCI_HFLAG_32BIT_ONLY; - - if (!(hpriv->flags & AHCI_HFLAG_NO_MSI)) - pci_enable_msi(pdev); + if ((hpriv->flags & AHCI_HFLAG_NO_MSI) || pci_enable_msi(pdev)) + pci_intx(pdev, 1); hpriv->mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR]; diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 98af50f16e0c..299d32721a56 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -709,7 +709,13 @@ u64 ata_tf_read_block(struct ata_taskfile *tf, struct ata_device *dev) head = tf->device & 0xf; sect = tf->lbal; - block = (cyl * dev->heads + head) * dev->sectors + sect; + if (!sect) { + ata_dev_printk(dev, KERN_WARNING, "device reported " + "invalid CHS sector 0\n"); + sect = 1; /* oh well */ + } + + block = (cyl * dev->heads + head) * dev->sectors + sect - 1; } return block; @@ -5024,12 +5030,14 @@ void ata_qc_complete(struct ata_queued_cmd *qc) qc->flags |= ATA_QCFLAG_FAILED; if (unlikely(qc->flags & ATA_QCFLAG_FAILED)) { - if (!ata_tag_internal(qc->tag)) { - /* always fill result TF for failed qc */ - fill_result_tf(qc); + /* always fill result TF for failed qc */ + fill_result_tf(qc); + + if (!ata_tag_internal(qc->tag)) ata_qc_schedule_eh(qc); - return; - } + else + __ata_qc_complete(qc); + return; } /* read result TF if requested */ diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 79711b64054b..1652b9190607 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c @@ -2541,14 +2541,14 @@ int ata_eh_reset(struct ata_link *link, int classify, dev->pio_mode = XFER_PIO_0; dev->flags &= ~ATA_DFLAG_SLEEPING; - if (!ata_phys_link_offline(ata_dev_phys_link(dev))) { - /* apply class override */ - if (lflags & ATA_LFLAG_ASSUME_ATA) - classes[dev->devno] = ATA_DEV_ATA; - else if (lflags & ATA_LFLAG_ASSUME_SEMB) - classes[dev->devno] = ATA_DEV_SEMB_UNSUP; - } else - classes[dev->devno] = ATA_DEV_NONE; + if (ata_phys_link_offline(ata_dev_phys_link(dev))) + continue; + + /* apply class override */ + if (lflags & ATA_LFLAG_ASSUME_ATA) + classes[dev->devno] = ATA_DEV_ATA; + else if (lflags & ATA_LFLAG_ASSUME_SEMB) + classes[dev->devno] = ATA_DEV_SEMB_UNSUP; } /* record current link speed */ @@ -2581,34 +2581,48 @@ int ata_eh_reset(struct ata_link *link, int classify, slave->eh_info.serror = 0; spin_unlock_irqrestore(link->ap->lock, flags); - /* Make sure onlineness and classification result correspond. + /* + * Make sure onlineness and classification result correspond. * Hotplug could have happened during reset and some * controllers fail to wait while a drive is spinning up after * being hotplugged causing misdetection. By cross checking - * link onlineness and classification result, those conditions - * can be reliably detected and retried. + * link on/offlineness and classification result, those + * conditions can be reliably detected and retried. */ nr_unknown = 0; ata_for_each_dev(dev, link, ALL) { - /* convert all ATA_DEV_UNKNOWN to ATA_DEV_NONE */ - if (classes[dev->devno] == ATA_DEV_UNKNOWN) { - classes[dev->devno] = ATA_DEV_NONE; - if (ata_phys_link_online(ata_dev_phys_link(dev))) + if (ata_phys_link_online(ata_dev_phys_link(dev))) { + if (classes[dev->devno] == ATA_DEV_UNKNOWN) { + ata_dev_printk(dev, KERN_DEBUG, "link online " + "but device misclassifed\n"); + classes[dev->devno] = ATA_DEV_NONE; nr_unknown++; + } + } else if (ata_phys_link_offline(ata_dev_phys_link(dev))) { + if (ata_class_enabled(classes[dev->devno])) + ata_dev_printk(dev, KERN_DEBUG, "link offline, " + "clearing class %d to NONE\n", + classes[dev->devno]); + classes[dev->devno] = ATA_DEV_NONE; + } else if (classes[dev->devno] == ATA_DEV_UNKNOWN) { + ata_dev_printk(dev, KERN_DEBUG, "link status unknown, " + "clearing UNKNOWN to NONE\n"); + classes[dev->devno] = ATA_DEV_NONE; } } if (classify && nr_unknown) { if (try < max_tries) { ata_link_printk(link, KERN_WARNING, "link online but " - "device misclassified, retrying\n"); + "%d devices misclassified, retrying\n", + nr_unknown); failed_link = link; rc = -EAGAIN; goto fail; } ata_link_printk(link, KERN_WARNING, - "link online but device misclassified, " - "device detection might fail\n"); + "link online but %d devices misclassified, " + "device detection might fail\n", nr_unknown); } /* reset successful, schedule revalidation */ @@ -2835,12 +2849,14 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link, * device detection messages backwards. */ ata_for_each_dev(dev, link, ALL) { - if (!(new_mask & (1 << dev->devno)) || - dev->class == ATA_DEV_PMP) + if (!(new_mask & (1 << dev->devno))) continue; dev->class = ehc->classes[dev->devno]; + if (dev->class == ATA_DEV_PMP) + continue; + ehc->i.flags |= ATA_EHI_PRINTINFO; rc = ata_dev_configure(dev); ehc->i.flags &= ~ATA_EHI_PRINTINFO; diff --git a/drivers/ata/pata_amd.c b/drivers/ata/pata_amd.c index 33a74f11171c..567f3f72774e 100644 --- a/drivers/ata/pata_amd.c +++ b/drivers/ata/pata_amd.c @@ -307,6 +307,9 @@ static unsigned long nv_mode_filter(struct ata_device *dev, limit |= ATA_MASK_PIO; if (!(limit & (ATA_MASK_MWDMA | ATA_MASK_UDMA))) limit |= ATA_MASK_MWDMA | ATA_MASK_UDMA; + /* PIO4, MWDMA2, UDMA2 should always be supported regardless of + cable detection result */ + limit |= ata_pack_xfermask(ATA_PIO4, ATA_MWDMA2, ATA_UDMA2); ata_port_printk(ap, KERN_DEBUG, "nv_mode_filter: 0x%lx&0x%lx->0x%lx, " "BIOS=0x%lx (0x%x) ACPI=0x%lx%s\n", diff --git a/drivers/ata/pata_cmd64x.c b/drivers/ata/pata_cmd64x.c index f98dffedf4bc..f0bad9be0f65 100644 --- a/drivers/ata/pata_cmd64x.c +++ b/drivers/ata/pata_cmd64x.c @@ -219,7 +219,7 @@ static void cmd64x_set_dmamode(struct ata_port *ap, struct ata_device *adev) regU |= udma_data[adev->dma_mode - XFER_UDMA_0] << shift; /* Merge the control bits */ regU |= 1 << adev->devno; /* UDMA on */ - if (adev->dma_mode > 2) /* 15nS timing */ + if (adev->dma_mode > XFER_UDMA_2) /* 15nS timing */ regU |= 4 << adev->devno; } else { regU &= ~ (1 << adev->devno); /* UDMA off */ diff --git a/drivers/ata/pata_hpt37x.c b/drivers/ata/pata_hpt37x.c index 122c786449a9..ca5f8d7f638c 100644 --- a/drivers/ata/pata_hpt37x.c +++ b/drivers/ata/pata_hpt37x.c @@ -24,7 +24,7 @@ #include <linux/libata.h> #define DRV_NAME "pata_hpt37x" -#define DRV_VERSION "0.6.12" +#define DRV_VERSION "0.6.14" struct hpt_clock { u8 xfer_speed; @@ -404,9 +404,8 @@ static void hpt370_set_piomode(struct ata_port *ap, struct ata_device *adev) pci_read_config_dword(pdev, addr1, ®); mode = hpt37x_find_mode(ap, adev->pio_mode); - mode &= ~0x8000000; /* No FIFO in PIO */ - mode &= ~0x30070000; /* Leave config bits alone */ - reg &= 0x30070000; /* Strip timing bits */ + mode &= 0xCFC3FFFF; /* Leave DMA bits alone */ + reg &= ~0xCFC3FFFF; /* Strip timing bits */ pci_write_config_dword(pdev, addr1, reg | mode); } @@ -423,8 +422,7 @@ static void hpt370_set_dmamode(struct ata_port *ap, struct ata_device *adev) { struct pci_dev *pdev = to_pci_dev(ap->host->dev); u32 addr1, addr2; - u32 reg; - u32 mode; + u32 reg, mode, mask; u8 fast; addr1 = 0x40 + 4 * (adev->devno + 2 * ap->port_no); @@ -436,11 +434,12 @@ static void hpt370_set_dmamode(struct ata_port *ap, struct ata_device *adev) fast |= 0x01; pci_write_config_byte(pdev, addr2, fast); + mask = adev->dma_mode < XFER_UDMA_0 ? 0x31C001FF : 0x303C0000; + pci_read_config_dword(pdev, addr1, ®); mode = hpt37x_find_mode(ap, adev->dma_mode); - mode |= 0x8000000; /* FIFO in MWDMA or UDMA */ - mode &= ~0xC0000000; /* Leave config bits alone */ - reg &= 0xC0000000; /* Strip timing bits */ + mode &= mask; + reg &= ~mask; pci_write_config_dword(pdev, addr1, reg | mode); } @@ -508,9 +507,8 @@ static void hpt372_set_piomode(struct ata_port *ap, struct ata_device *adev) mode = hpt37x_find_mode(ap, adev->pio_mode); printk("Find mode for %d reports %X\n", adev->pio_mode, mode); - mode &= ~0x80000000; /* No FIFO in PIO */ - mode &= ~0x30070000; /* Leave config bits alone */ - reg &= 0x30070000; /* Strip timing bits */ + mode &= 0xCFC3FFFF; /* Leave DMA bits alone */ + reg &= ~0xCFC3FFFF; /* Strip timing bits */ pci_write_config_dword(pdev, addr1, reg | mode); } @@ -527,8 +525,7 @@ static void hpt372_set_dmamode(struct ata_port *ap, struct ata_device *adev) { struct pci_dev *pdev = to_pci_dev(ap->host->dev); u32 addr1, addr2; - u32 reg; - u32 mode; + u32 reg, mode, mask; u8 fast; addr1 = 0x40 + 4 * (adev->devno + 2 * ap->port_no); @@ -539,12 +536,13 @@ static void hpt372_set_dmamode(struct ata_port *ap, struct ata_device *adev) fast &= ~0x07; pci_write_config_byte(pdev, addr2, fast); + mask = adev->dma_mode < XFER_UDMA_0 ? 0x31C001FF : 0x303C0000; + pci_read_config_dword(pdev, addr1, ®); mode = hpt37x_find_mode(ap, adev->dma_mode); printk("Find mode for DMA %d reports %X\n", adev->dma_mode, mode); - mode &= ~0xC0000000; /* Leave config bits alone */ - mode |= 0x80000000; /* FIFO in MWDMA or UDMA */ - reg &= 0xC0000000; /* Strip timing bits */ + mode &= mask; + reg &= ~mask; pci_write_config_dword(pdev, addr1, reg | mode); } diff --git a/drivers/ata/pata_hpt3x2n.c b/drivers/ata/pata_hpt3x2n.c index 3d59fe0a408d..d16e87e29189 100644 --- a/drivers/ata/pata_hpt3x2n.c +++ b/drivers/ata/pata_hpt3x2n.c @@ -8,7 +8,7 @@ * Copyright (C) 1999-2003 Andre Hedrick <andre@linux-ide.org> * Portions Copyright (C) 2001 Sun Microsystems, Inc. * Portions Copyright (C) 2003 Red Hat Inc - * Portions Copyright (C) 2005-2007 MontaVista Software, Inc. + * Portions Copyright (C) 2005-2009 MontaVista Software, Inc. * * * TODO @@ -25,7 +25,7 @@ #include <linux/libata.h> #define DRV_NAME "pata_hpt3x2n" -#define DRV_VERSION "0.3.4" +#define DRV_VERSION "0.3.8" enum { HPT_PCI_FAST = (1 << 31), @@ -185,9 +185,8 @@ static void hpt3x2n_set_piomode(struct ata_port *ap, struct ata_device *adev) pci_read_config_dword(pdev, addr1, ®); mode = hpt3x2n_find_mode(ap, adev->pio_mode); - mode &= ~0x8000000; /* No FIFO in PIO */ - mode &= ~0x30070000; /* Leave config bits alone */ - reg &= 0x30070000; /* Strip timing bits */ + mode &= 0xCFC3FFFF; /* Leave DMA bits alone */ + reg &= ~0xCFC3FFFF; /* Strip timing bits */ pci_write_config_dword(pdev, addr1, reg | mode); } @@ -204,8 +203,7 @@ static void hpt3x2n_set_dmamode(struct ata_port *ap, struct ata_device *adev) { struct pci_dev *pdev = to_pci_dev(ap->host->dev); u32 addr1, addr2; - u32 reg; - u32 mode; + u32 reg, mode, mask; u8 fast; addr1 = 0x40 + 4 * (adev->devno + 2 * ap->port_no); @@ -216,11 +214,12 @@ static void hpt3x2n_set_dmamode(struct ata_port *ap, struct ata_device *adev) fast &= ~0x07; pci_write_config_byte(pdev, addr2, fast); + mask = adev->dma_mode < XFER_UDMA_0 ? 0x31C001FF : 0x303C0000; + pci_read_config_dword(pdev, addr1, ®); mode = hpt3x2n_find_mode(ap, adev->dma_mode); - mode |= 0x8000000; /* FIFO in MWDMA or UDMA */ - mode &= ~0xC0000000; /* Leave config bits alone */ - reg &= 0xC0000000; /* Strip timing bits */ + mode &= mask; + reg &= ~mask; pci_write_config_dword(pdev, addr1, reg | mode); } @@ -263,7 +262,7 @@ static void hpt3x2n_bmdma_stop(struct ata_queued_cmd *qc) static void hpt3x2n_set_clock(struct ata_port *ap, int source) { - void __iomem *bmdma = ap->ioaddr.bmdma_addr; + void __iomem *bmdma = ap->ioaddr.bmdma_addr - ap->port_no * 8; /* Tristate the bus */ iowrite8(0x80, bmdma+0x73); @@ -273,9 +272,9 @@ static void hpt3x2n_set_clock(struct ata_port *ap, int source) iowrite8(source, bmdma+0x7B); iowrite8(0xC0, bmdma+0x79); - /* Reset state machines */ - iowrite8(0x37, bmdma+0x70); - iowrite8(0x37, bmdma+0x74); + /* Reset state machines, avoid enabling the disabled channels */ + iowrite8(ioread8(bmdma+0x70) | 0x32, bmdma+0x70); + iowrite8(ioread8(bmdma+0x74) | 0x32, bmdma+0x74); /* Complete reset */ iowrite8(0x00, bmdma+0x79); @@ -285,21 +284,10 @@ static void hpt3x2n_set_clock(struct ata_port *ap, int source) iowrite8(0x00, bmdma+0x77); } -/* Check if our partner interface is busy */ - -static int hpt3x2n_pair_idle(struct ata_port *ap) -{ - struct ata_host *host = ap->host; - struct ata_port *pair = host->ports[ap->port_no ^ 1]; - - if (pair->hsm_task_state == HSM_ST_IDLE) - return 1; - return 0; -} - static int hpt3x2n_use_dpll(struct ata_port *ap, int writing) { long flags = (long)ap->host->private_data; + /* See if we should use the DPLL */ if (writing) return USE_DPLL; /* Needed for write */ @@ -308,20 +296,35 @@ static int hpt3x2n_use_dpll(struct ata_port *ap, int writing) return 0; } +static int hpt3x2n_qc_defer(struct ata_queued_cmd *qc) +{ + struct ata_port *ap = qc->ap; + struct ata_port *alt = ap->host->ports[ap->port_no ^ 1]; + int rc, flags = (long)ap->host->private_data; + int dpll = hpt3x2n_use_dpll(ap, qc->tf.flags & ATA_TFLAG_WRITE); + + /* First apply the usual rules */ + rc = ata_std_qc_defer(qc); + if (rc != 0) + return rc; + + if ((flags & USE_DPLL) != dpll && alt->qc_active) + return ATA_DEFER_PORT; + return 0; +} + static unsigned int hpt3x2n_qc_issue(struct ata_queued_cmd *qc) { - struct ata_taskfile *tf = &qc->tf; struct ata_port *ap = qc->ap; int flags = (long)ap->host->private_data; + int dpll = hpt3x2n_use_dpll(ap, qc->tf.flags & ATA_TFLAG_WRITE); - if (hpt3x2n_pair_idle(ap)) { - int dpll = hpt3x2n_use_dpll(ap, (tf->flags & ATA_TFLAG_WRITE)); - if ((flags & USE_DPLL) != dpll) { - if (dpll == 1) - hpt3x2n_set_clock(ap, 0x21); - else - hpt3x2n_set_clock(ap, 0x23); - } + if ((flags & USE_DPLL) != dpll) { + flags &= ~USE_DPLL; + flags |= dpll; + ap->host->private_data = (void *)(long)flags; + + hpt3x2n_set_clock(ap, dpll ? 0x21 : 0x23); } return ata_sff_qc_issue(qc); } @@ -338,6 +341,8 @@ static struct ata_port_operations hpt3x2n_port_ops = { .inherits = &ata_bmdma_port_ops, .bmdma_stop = hpt3x2n_bmdma_stop, + + .qc_defer = hpt3x2n_qc_defer, .qc_issue = hpt3x2n_qc_issue, .cable_detect = hpt3x2n_cable_detect, @@ -455,7 +460,7 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id) unsigned int f_low, f_high; int adjust; unsigned long iobase = pci_resource_start(dev, 4); - void *hpriv = NULL; + void *hpriv = (void *)USE_DPLL; int rc; rc = pcim_enable_device(dev); @@ -543,7 +548,7 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id) /* Set our private data up. We only need a few flags so we use it directly */ if (pci_mhz > 60) { - hpriv = (void *)PCI66; + hpriv = (void *)(PCI66 | USE_DPLL); /* * On HPT371N, if ATA clock is 66 MHz we must set bit 2 in * the MISC. register to stretch the UltraDMA Tss timing. diff --git a/drivers/ata/pata_sc1200.c b/drivers/ata/pata_sc1200.c index f49814d6fd2e..3bbed8322ecf 100644 --- a/drivers/ata/pata_sc1200.c +++ b/drivers/ata/pata_sc1200.c @@ -235,8 +235,7 @@ static int sc1200_init_one(struct pci_dev *dev, const struct pci_device_id *id) .udma_mask = ATA_UDMA2, .port_ops = &sc1200_port_ops }; - /* Can't enable port 2 yet, see top comments */ - const struct ata_port_info *ppi[] = { &info, }; + const struct ata_port_info *ppi[] = { &info, NULL }; return ata_pci_sff_init_one(dev, ppi, &sc1200_sht, NULL); } diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c index 45657cacec43..88984b803d6d 100644 --- a/drivers/ata/pata_via.c +++ b/drivers/ata/pata_via.c @@ -111,7 +111,7 @@ static const struct via_isa_bridge { { "vt8251", PCI_DEVICE_ID_VIA_8251, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, { "cx700", PCI_DEVICE_ID_VIA_CX700, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_SATA_PATA }, { "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES }, - { "vt6415", PCI_DEVICE_ID_VIA_6415, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES }, + { "vt6415", PCI_DEVICE_ID_VIA_6415, 0x00, 0xff, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES }, { "vt8237a", PCI_DEVICE_ID_VIA_8237A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, { "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, { "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c index 86a40582999c..1eb4e020eb5c 100644 --- a/drivers/ata/sata_nv.c +++ b/drivers/ata/sata_nv.c @@ -1594,9 +1594,21 @@ static int nv_hardreset(struct ata_link *link, unsigned int *class, !ata_dev_enabled(link->device)) sata_link_hardreset(link, sata_deb_timing_hotplug, deadline, NULL, NULL); - else if (!(ehc->i.flags & ATA_EHI_QUIET)) - ata_link_printk(link, KERN_INFO, - "nv: skipping hardreset on occupied port\n"); + else { + const unsigned long *timing = sata_ehc_deb_timing(ehc); + int rc; + + if (!(ehc->i.flags & ATA_EHI_QUIET)) + ata_link_printk(link, KERN_INFO, "nv: skipping " + "hardreset on occupied port\n"); + + /* make sure the link is online */ + rc = sata_link_resume(link, timing, deadline); + /* whine about phy resume failure but proceed */ + if (rc && rc != -EOPNOTSUPP) + ata_link_printk(link, KERN_WARNING, "failed to resume " + "link (errno=%d)\n", rc); + } /* device signature acquisition is unreliable */ return -EAGAIN; diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c index bdd43c7f432e..02efd9a83d26 100644 --- a/drivers/ata/sata_via.c +++ b/drivers/ata/sata_via.c @@ -93,7 +93,6 @@ static const struct pci_device_id svia_pci_tbl[] = { { PCI_VDEVICE(VIA, 0x7372), vt6420 }, { PCI_VDEVICE(VIA, 0x5287), vt8251 }, /* 2 sata chnls (Master/Slave) */ { PCI_VDEVICE(VIA, 0x9000), vt8251 }, - { PCI_VDEVICE(VIA, 0x9040), vt8251 }, { } /* terminate list */ }; diff --git a/drivers/base/base.h b/drivers/base/base.h index b528145a078f..1e52c125f437 100644 --- a/drivers/base/base.h +++ b/drivers/base/base.h @@ -104,7 +104,7 @@ extern int system_bus_init(void); extern int cpu_dev_init(void); extern int bus_add_device(struct device *dev); -extern void bus_attach_device(struct device *dev); +extern void bus_probe_device(struct device *dev); extern void bus_remove_device(struct device *dev); extern int bus_add_driver(struct device_driver *drv); diff --git a/drivers/base/bus.c b/drivers/base/bus.c index 4b04a15146d7..973bf2ad4e0d 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c @@ -459,8 +459,9 @@ static inline void remove_deprecated_bus_links(struct device *dev) { } * bus_add_device - add device to bus * @dev: device being added * + * - Add device's bus attributes. + * - Create links to device's bus. * - Add the device to its bus's list of devices. - * - Create link to device's bus. */ int bus_add_device(struct device *dev) { @@ -483,6 +484,7 @@ int bus_add_device(struct device *dev) error = make_deprecated_bus_links(dev); if (error) goto out_deprecated; + klist_add_tail(&dev->p->knode_bus, &bus->p->klist_devices); } return 0; @@ -498,24 +500,19 @@ out_put: } /** - * bus_attach_device - add device to bus - * @dev: device tried to attach to a driver + * bus_probe_device - probe drivers for a new device + * @dev: device to probe * - * - Add device to bus's list of devices. - * - Try to attach to driver. + * - Automatically probe for a driver if the bus allows it. */ -void bus_attach_device(struct device *dev) +void bus_probe_device(struct device *dev) { struct bus_type *bus = dev->bus; - int ret = 0; + int ret; - if (bus) { - if (bus->p->drivers_autoprobe) - ret = device_attach(dev); + if (bus && bus->p->drivers_autoprobe) { + ret = device_attach(dev); WARN_ON(ret < 0); - if (ret >= 0) - klist_add_tail(&dev->p->knode_bus, - &bus->p->klist_devices); } } diff --git a/drivers/base/class.c b/drivers/base/class.c index eb85e4312301..4317d4ca540a 100644 --- a/drivers/base/class.c +++ b/drivers/base/class.c @@ -59,6 +59,8 @@ static void class_release(struct kobject *kobj) else pr_debug("class '%s' does not have a release() function, " "be careful\n", class->name); + + kfree(cp); } static struct sysfs_ops class_sysfs_ops = { diff --git a/drivers/base/core.c b/drivers/base/core.c index 7ecb1938e590..c34774d0b9d3 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -945,7 +945,7 @@ int device_add(struct device *dev) BUS_NOTIFY_ADD_DEVICE, dev); kobject_uevent(&dev->kobj, KOBJ_ADD); - bus_attach_device(dev); + bus_probe_device(dev); if (parent) klist_add_tail(&dev->p->knode_parent, &parent->p->klist_children); diff --git a/drivers/base/driver.c b/drivers/base/driver.c index 8ae0f63602e0..2b7f5bc8c021 100644 --- a/drivers/base/driver.c +++ b/drivers/base/driver.c @@ -236,7 +236,7 @@ int driver_register(struct device_driver *drv) put_driver(other); printk(KERN_ERR "Error: Driver '%s' is already registered, " "aborting...\n", drv->name); - return -EEXIST; + return -EBUSY; } ret = bus_add_driver(drv); diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index a52cc7fe45ea..c18bbbf04e47 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c @@ -323,6 +323,9 @@ static int cciss_seq_show(struct seq_file *seq, void *v) if (*pos > h->highest_lun) return 0; + if (drv == NULL) /* it's possible for h->drv[] to have holes. */ + return 0; + if (drv->heads == 0) return 0; diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index 49f086977c37..00ebf36b0059 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig @@ -323,7 +323,7 @@ config SPECIALIX config SX tristate "Specialix SX (and SI) card support" - depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA) + depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA) && BROKEN help This is a driver for the SX and SI multiport serial cards. Please read the file <file:Documentation/serial/sx.txt> for details. @@ -334,7 +334,7 @@ config SX config RIO tristate "Specialix RIO system support" - depends on SERIAL_NONSTANDARD + depends on SERIAL_NONSTANDARD && BROKEN help This is a driver for the Specialix RIO, a smart serial card which drives an outboard box that can support up to 128 ports. Product @@ -395,7 +395,7 @@ config NOZOMI config A2232 tristate "Commodore A2232 serial support (EXPERIMENTAL)" - depends on EXPERIMENTAL && ZORRO && BROKEN_ON_SMP + depends on EXPERIMENTAL && ZORRO && BROKEN ---help--- This option supports the 2232 7-port serial card shipped with the Amiga 2000 and other Zorro-bus machines, dating from 1989. At @@ -444,7 +444,7 @@ config MXC_IIM config MXS_VIIM tristate "MXS Virtual IIM device driver" - depends on (ARCH_STMP3XXX || ARCH_MXS || ARCH_MX5) + depends on (ARCH_STMP3XXX || ARCH_MXS) help Support for access to MXS Virtual IIM device, most people should say N here. @@ -564,22 +564,6 @@ config BFIN_OTP_WRITE_ENABLE If unsure, say N. -config FSL_OTP - tristate "Freescale On-Chip OTP Memory Support" - depends on (ARCH_MX23 || ARCH_MX28 || ARCH_MX50) - default n - help - If you say Y here, you will get support for a character device - interface into the One Time Programmable memory pages that are - stored on the iMX23/28/50 processor. This will not get you access - to the secure memory pages however. You will need to write your - own secure code and reader for that. - - To compile this driver as a module, choose M here: the module - will be called fsl_otp. - - If unsure, it is safe to say Y. - config PRINTER tristate "Parallel printer support" depends on PARPORT diff --git a/drivers/char/Makefile b/drivers/char/Makefile index 898ce27e335d..c711f02de8f7 100644 --- a/drivers/char/Makefile +++ b/drivers/char/Makefile @@ -69,7 +69,6 @@ obj-$(CONFIG_IBM_BSR) += bsr.o obj-$(CONFIG_SGI_MBCS) += mbcs.o obj-$(CONFIG_BRIQ_PANEL) += briq_panel.o obj-$(CONFIG_BFIN_OTP) += bfin-otp.o -obj-$(CONFIG_FSL_OTP) += fsl_otp.o obj-$(CONFIG_PRINTER) += lp.o diff --git a/drivers/char/agp/backend.c b/drivers/char/agp/backend.c index cfa5a649dfe7..19ce9d6c69f1 100644 --- a/drivers/char/agp/backend.c +++ b/drivers/char/agp/backend.c @@ -114,9 +114,9 @@ static int agp_find_max(void) long memory, index, result; #if PAGE_SHIFT < 20 - memory = num_physpages >> (20 - PAGE_SHIFT); + memory = totalram_pages >> (20 - PAGE_SHIFT); #else - memory = num_physpages << (PAGE_SHIFT - 20); + memory = totalram_pages << (PAGE_SHIFT - 20); #endif index = 1; diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c index c58557790585..62711ddeb53a 100644 --- a/drivers/char/agp/intel-agp.c +++ b/drivers/char/agp/intel-agp.c @@ -36,6 +36,8 @@ #define PCI_DEVICE_ID_INTEL_Q35_IG 0x29B2 #define PCI_DEVICE_ID_INTEL_Q33_HB 0x29D0 #define PCI_DEVICE_ID_INTEL_Q33_IG 0x29D2 +#define PCI_DEVICE_ID_INTEL_B43_HB 0x2E40 +#define PCI_DEVICE_ID_INTEL_B43_IG 0x2E42 #define PCI_DEVICE_ID_INTEL_GM45_HB 0x2A40 #define PCI_DEVICE_ID_INTEL_GM45_IG 0x2A42 #define PCI_DEVICE_ID_INTEL_IGD_E_HB 0x2E00 @@ -50,6 +52,7 @@ #define PCI_DEVICE_ID_INTEL_IGDNG_D_IG 0x0042 #define PCI_DEVICE_ID_INTEL_IGDNG_M_HB 0x0044 #define PCI_DEVICE_ID_INTEL_IGDNG_MA_HB 0x0062 +#define PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB 0x006a #define PCI_DEVICE_ID_INTEL_IGDNG_M_IG 0x0046 /* cover 915 and 945 variants */ @@ -81,9 +84,11 @@ agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G45_HB || \ agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_GM45_HB || \ agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G41_HB || \ + agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_B43_HB || \ agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_D_HB || \ agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_M_HB || \ - agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MA_HB) + agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MA_HB || \ + agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB) extern int agp_memory_reserved; @@ -679,23 +684,39 @@ static void intel_i830_setup_flush(void) if (!intel_private.i8xx_page) return; - /* make page uncached */ - map_page_into_agp(intel_private.i8xx_page); - intel_private.i8xx_flush_page = kmap(intel_private.i8xx_page); if (!intel_private.i8xx_flush_page) intel_i830_fini_flush(); } +static void +do_wbinvd(void *null) +{ + wbinvd(); +} + +/* The chipset_flush interface needs to get data that has already been + * flushed out of the CPU all the way out to main memory, because the GPU + * doesn't snoop those buffers. + * + * The 8xx series doesn't have the same lovely interface for flushing the + * chipset write buffers that the later chips do. According to the 865 + * specs, it's 64 octwords, or 1KB. So, to get those previous things in + * that buffer out, we just fill 1KB and clflush it out, on the assumption + * that it'll push whatever was in there out. It appears to work. + */ static void intel_i830_chipset_flush(struct agp_bridge_data *bridge) { unsigned int *pg = intel_private.i8xx_flush_page; - int i; - for (i = 0; i < 256; i += 2) - *(pg + i) = i; + memset(pg, 0, 1024); - wmb(); + if (cpu_has_clflush) { + clflush_cache_range(pg, 1024); + } else { + if (on_each_cpu(do_wbinvd, NULL, 1) != 0) + printk(KERN_ERR "Timed out waiting for cache flush.\n"); + } } /* The intel i830 automatically initializes the agp aperture during POST. @@ -1216,9 +1237,11 @@ static void intel_i965_get_gtt_range(int *gtt_offset, int *gtt_size) case PCI_DEVICE_ID_INTEL_Q45_HB: case PCI_DEVICE_ID_INTEL_G45_HB: case PCI_DEVICE_ID_INTEL_G41_HB: + case PCI_DEVICE_ID_INTEL_B43_HB: case PCI_DEVICE_ID_INTEL_IGDNG_D_HB: case PCI_DEVICE_ID_INTEL_IGDNG_M_HB: case PCI_DEVICE_ID_INTEL_IGDNG_MA_HB: + case PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB: *gtt_offset = *gtt_size = MB(2); break; default: @@ -2192,6 +2215,8 @@ static const struct intel_driver_description { "Q45/Q43", NULL, &intel_i965_driver }, { PCI_DEVICE_ID_INTEL_G45_HB, PCI_DEVICE_ID_INTEL_G45_IG, 0, "G45/G43", NULL, &intel_i965_driver }, + { PCI_DEVICE_ID_INTEL_B43_HB, PCI_DEVICE_ID_INTEL_B43_IG, 0, + "B43", NULL, &intel_i965_driver }, { PCI_DEVICE_ID_INTEL_G41_HB, PCI_DEVICE_ID_INTEL_G41_IG, 0, "G41", NULL, &intel_i965_driver }, { PCI_DEVICE_ID_INTEL_IGDNG_D_HB, PCI_DEVICE_ID_INTEL_IGDNG_D_IG, 0, @@ -2200,6 +2225,8 @@ static const struct intel_driver_description { "IGDNG/M", NULL, &intel_i965_driver }, { PCI_DEVICE_ID_INTEL_IGDNG_MA_HB, PCI_DEVICE_ID_INTEL_IGDNG_M_IG, 0, "IGDNG/MA", NULL, &intel_i965_driver }, + { PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB, PCI_DEVICE_ID_INTEL_IGDNG_M_IG, 0, + "IGDNG/MC2", NULL, &intel_i965_driver }, { 0, 0, 0, NULL, NULL, NULL } }; @@ -2313,15 +2340,6 @@ static int agp_intel_resume(struct pci_dev *pdev) struct agp_bridge_data *bridge = pci_get_drvdata(pdev); int ret_val; - pci_restore_state(pdev); - - /* We should restore our graphics device's config space, - * as host bridge (00:00) resumes before graphics device (02:00), - * then our access to its pci space can work right. - */ - if (intel_private.pcidev) - pci_restore_state(intel_private.pcidev); - if (bridge->driver == &intel_generic_driver) intel_configure(); else if (bridge->driver == &intel_850_driver) @@ -2401,9 +2419,11 @@ static struct pci_device_id agp_intel_pci_table[] = { ID(PCI_DEVICE_ID_INTEL_Q45_HB), ID(PCI_DEVICE_ID_INTEL_G45_HB), ID(PCI_DEVICE_ID_INTEL_G41_HB), + ID(PCI_DEVICE_ID_INTEL_B43_HB), ID(PCI_DEVICE_ID_INTEL_IGDNG_D_HB), ID(PCI_DEVICE_ID_INTEL_IGDNG_M_HB), ID(PCI_DEVICE_ID_INTEL_IGDNG_MA_HB), + ID(PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB), { } }; diff --git a/drivers/char/hvc_xen.c b/drivers/char/hvc_xen.c index eba999f8598d..ae453cc25a66 100644 --- a/drivers/char/hvc_xen.c +++ b/drivers/char/hvc_xen.c @@ -55,7 +55,7 @@ static inline void notify_daemon(void) notify_remote_via_evtchn(xen_start_info->console.domU.evtchn); } -static int write_console(uint32_t vtermno, const char *data, int len) +static int __write_console(const char *data, int len) { struct xencons_interface *intf = xencons_interface(); XENCONS_RING_IDX cons, prod; @@ -76,6 +76,29 @@ static int write_console(uint32_t vtermno, const char *data, int len) return sent; } +static int write_console(uint32_t vtermno, const char *data, int len) +{ + int ret = len; + + /* + * Make sure the whole buffer is emitted, polling if + * necessary. We don't ever want to rely on the hvc daemon + * because the most interesting console output is when the + * kernel is crippled. + */ + while (len) { + int sent = __write_console(data, len); + + data += sent; + len -= sent; + + if (unlikely(len)) + HYPERVISOR_sched_op(SCHEDOP_yield, NULL); + } + + return ret; +} + static int read_console(uint32_t vtermno, char *buf, int len) { struct xencons_interface *intf = xencons_interface(); diff --git a/drivers/char/hw_random/fsl-rngc.c b/drivers/char/hw_random/fsl-rngc.c index 9e788f97c4d8..9bf78e846fa0 100644 --- a/drivers/char/hw_random/fsl-rngc.c +++ b/drivers/char/hw_random/fsl-rngc.c @@ -1,7 +1,7 @@ /* * RNG driver for Freescale RNGC * - * Copyright (C) 2008-2010 Freescale Semiconductor, Inc. + * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved. */ /* @@ -42,6 +42,7 @@ #include <linux/interrupt.h> #include <linux/hw_random.h> #include <linux/io.h> +#include <asm/hardware.h> #define RNGC_VERSION_MAJOR3 3 @@ -291,7 +292,7 @@ static int __init fsl_rngc_probe(struct platform_device *pdev) if (rng_dev) return -EBUSY; - clk = clk_get(&pdev->dev, "rng_clk"); + clk = clk_get(NULL, "rng_clk"); if (IS_ERR(clk)) { dev_err(&pdev->dev, "Can not get rng_clk\n"); @@ -333,17 +334,9 @@ static int __init fsl_rngc_probe(struct platform_device *pdev) static int __exit fsl_rngc_remove(struct platform_device *pdev) { - struct clk *clk; struct resource *mem = dev_get_drvdata(&pdev->dev); void __iomem *rngc_base = (void __iomem *)fsl_rngc.priv; - clk = clk_get(&pdev->dev, "rng_clk"); - - if (IS_ERR(clk)) - dev_err(&pdev->dev, "Can not get rng_clk\n"); - else - clk_disable(clk); - hwrng_unregister(&fsl_rngc); release_resource(mem); @@ -353,47 +346,12 @@ static int __exit fsl_rngc_remove(struct platform_device *pdev) return 0; } -static int fsl_rngc_suspend(struct platform_device *pdev, - pm_message_t state) -{ -#ifdef CONFIG_PM - struct clk *clk = clk_get(&pdev->dev, "rng_clk"); - - if (IS_ERR(clk)) { - dev_err(&pdev->dev, "Can not get rng_clk\n"); - return PTR_ERR(clk); - } - - clk_disable(clk); -#endif - - return 0; -} - -static int fsl_rngc_resume(struct platform_device *pdev) -{ -#ifdef CONFIG_PM - struct clk *clk = clk_get(&pdev->dev, "rng_clk"); - - if (IS_ERR(clk)) { - dev_err(&pdev->dev, "Can not get rng_clk\n"); - return PTR_ERR(clk); - } - - clk_enable(clk); -#endif - - return 0; -} - static struct platform_driver fsl_rngc_driver = { .driver = { .name = "fsl_rngc", .owner = THIS_MODULE, }, .remove = __exit_p(fsl_rngc_remove), - .suspend = fsl_rngc_suspend, - .resume = fsl_rngc_resume, }; static int __init mod_init(void) diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c index 737be953cc58..950837cf9e9c 100644 --- a/drivers/char/keyboard.c +++ b/drivers/char/keyboard.c @@ -1249,7 +1249,7 @@ static void kbd_keycode(unsigned int keycode, int down, int hw_raw) if (keycode >= NR_KEYS) if (keycode >= KEY_BRL_DOT1 && keycode <= KEY_BRL_DOT8) - keysym = K(KT_BRL, keycode - KEY_BRL_DOT1 + 1); + keysym = U(K(KT_BRL, keycode - KEY_BRL_DOT1 + 1)); else return; else diff --git a/drivers/char/nozomi.c b/drivers/char/nozomi.c index ec58d8c387ff..2171e9dac1ab 100644 --- a/drivers/char/nozomi.c +++ b/drivers/char/nozomi.c @@ -1628,10 +1628,10 @@ static void ntty_close(struct tty_struct *tty, struct file *file) dc->open_ttys--; port->count--; - tty_port_tty_set(port, NULL); if (port->count == 0) { DBG1("close: %d", nport->token_dl); + tty_port_tty_set(port, NULL); spin_lock_irqsave(&dc->spin_mutex, flags); dc->last_ier &= ~(nport->token_dl); writew(dc->last_ier, dc->reg_ier); diff --git a/drivers/char/pty.c b/drivers/char/pty.c index b33d6688e910..53761cefa915 100644 --- a/drivers/char/pty.c +++ b/drivers/char/pty.c @@ -120,8 +120,10 @@ static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c) /* Stuff the data into the input queue of the other end */ c = tty_insert_flip_string(to, buf, c); /* And shovel */ - tty_flip_buffer_push(to); - tty_wakeup(tty); + if (c) { + tty_flip_buffer_push(to); + tty_wakeup(tty); + } } return c; } diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c index b0603b2e5684..47c2d2763456 100644 --- a/drivers/char/tpm/tpm.c +++ b/drivers/char/tpm/tpm.c @@ -696,8 +696,7 @@ int __tpm_pcr_read(struct tpm_chip *chip, int pcr_idx, u8 *res_buf) cmd.header.in = pcrread_header; cmd.params.pcrread_in.pcr_idx = cpu_to_be32(pcr_idx); - BUILD_BUG_ON(cmd.header.in.length > READ_PCR_RESULT_SIZE); - rc = transmit_cmd(chip, &cmd, cmd.header.in.length, + rc = transmit_cmd(chip, &cmd, READ_PCR_RESULT_SIZE, "attempting to read a pcr value"); if (rc == 0) @@ -742,7 +741,7 @@ EXPORT_SYMBOL_GPL(tpm_pcr_read); * the module usage count. */ #define TPM_ORD_PCR_EXTEND cpu_to_be32(20) -#define EXTEND_PCR_SIZE 34 +#define EXTEND_PCR_RESULT_SIZE 34 static struct tpm_input_header pcrextend_header = { .tag = TPM_TAG_RQU_COMMAND, .length = cpu_to_be32(34), @@ -760,10 +759,9 @@ int tpm_pcr_extend(u32 chip_num, int pcr_idx, const u8 *hash) return -ENODEV; cmd.header.in = pcrextend_header; - BUILD_BUG_ON(be32_to_cpu(cmd.header.in.length) > EXTEND_PCR_SIZE); cmd.params.pcrextend_in.pcr_idx = cpu_to_be32(pcr_idx); memcpy(cmd.params.pcrextend_in.hash, hash, TPM_DIGEST_SIZE); - rc = transmit_cmd(chip, &cmd, cmd.header.in.length, + rc = transmit_cmd(chip, &cmd, EXTEND_PCR_RESULT_SIZE, "attempting extend a PCR value"); module_put(chip->dev->driver->owner); diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c index aec1931608aa..0b73e4ec1add 100644 --- a/drivers/char/tpm/tpm_tis.c +++ b/drivers/char/tpm/tpm_tis.c @@ -450,6 +450,12 @@ static int tpm_tis_init(struct device *dev, resource_size_t start, goto out_err; } + /* Default timeouts */ + chip->vendor.timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT); + chip->vendor.timeout_b = msecs_to_jiffies(TIS_LONG_TIMEOUT); + chip->vendor.timeout_c = msecs_to_jiffies(TIS_SHORT_TIMEOUT); + chip->vendor.timeout_d = msecs_to_jiffies(TIS_SHORT_TIMEOUT); + if (request_locality(chip, 0) != 0) { rc = -ENODEV; goto out_err; @@ -457,12 +463,6 @@ static int tpm_tis_init(struct device *dev, resource_size_t start, vendor = ioread32(chip->vendor.iobase + TPM_DID_VID(0)); - /* Default timeouts */ - chip->vendor.timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT); - chip->vendor.timeout_b = msecs_to_jiffies(TIS_LONG_TIMEOUT); - chip->vendor.timeout_c = msecs_to_jiffies(TIS_SHORT_TIMEOUT); - chip->vendor.timeout_d = msecs_to_jiffies(TIS_SHORT_TIMEOUT); - dev_info(dev, "1.2 TPM (device-id 0x%X, rev-id %d)\n", vendor >> 16, ioread8(chip->vendor.iobase + TPM_RID(0))); diff --git a/drivers/char/tty_buffer.c b/drivers/char/tty_buffer.c index 3108991c5c8b..0296612cc7df 100644 --- a/drivers/char/tty_buffer.c +++ b/drivers/char/tty_buffer.c @@ -402,28 +402,26 @@ static void flush_to_ldisc(struct work_struct *work) container_of(work, struct tty_struct, buf.work.work); unsigned long flags; struct tty_ldisc *disc; - struct tty_buffer *tbuf, *head; - char *char_buf; - unsigned char *flag_buf; disc = tty_ldisc_ref(tty); if (disc == NULL) /* !TTY_LDISC */ return; spin_lock_irqsave(&tty->buf.lock, flags); - /* So we know a flush is running */ - set_bit(TTY_FLUSHING, &tty->flags); - head = tty->buf.head; - if (head != NULL) { - tty->buf.head = NULL; - for (;;) { - int count = head->commit - head->read; + + if (!test_and_set_bit(TTY_FLUSHING, &tty->flags)) { + struct tty_buffer *head; + while ((head = tty->buf.head) != NULL) { + int count; + char *char_buf; + unsigned char *flag_buf; + + count = head->commit - head->read; if (!count) { if (head->next == NULL) break; - tbuf = head; - head = head->next; - tty_buffer_free(tty, tbuf); + tty->buf.head = head->next; + tty_buffer_free(tty, head); continue; } /* Ldisc or user is trying to flush the buffers @@ -445,9 +443,9 @@ static void flush_to_ldisc(struct work_struct *work) flag_buf, count); spin_lock_irqsave(&tty->buf.lock, flags); } - /* Restore the queue head */ - tty->buf.head = head; + clear_bit(TTY_FLUSHING, &tty->flags); } + /* We may have a deferred request to flush the input buffer, if so pull the chain under the lock and empty the queue */ if (test_bit(TTY_FLUSHPENDING, &tty->flags)) { @@ -455,7 +453,6 @@ static void flush_to_ldisc(struct work_struct *work) clear_bit(TTY_FLUSHPENDING, &tty->flags); wake_up(&tty->read_wait); } - clear_bit(TTY_FLUSHING, &tty->flags); spin_unlock_irqrestore(&tty->buf.lock, flags); tty_ldisc_deref(disc); diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index a3afa0c387cd..9531cf8b3482 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c @@ -1184,6 +1184,7 @@ int tty_init_termios(struct tty_struct *tty) tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios); return 0; } +EXPORT_SYMBOL_GPL(tty_init_termios); /** * tty_driver_install_tty() - install a tty entry in the driver @@ -1911,8 +1912,10 @@ static int tty_fasync(int fd, struct file *filp, int on) pid = task_pid(current); type = PIDTYPE_PID; } + get_pid(pid); spin_unlock_irqrestore(&tty->ctrl_lock, flags); retval = __f_setown(filp, pid, type, 0); + put_pid(pid); if (retval) goto out; } else { diff --git a/drivers/char/tty_ldisc.c b/drivers/char/tty_ldisc.c index e48af9f79219..414372a442d9 100644 --- a/drivers/char/tty_ldisc.c +++ b/drivers/char/tty_ldisc.c @@ -516,7 +516,7 @@ static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old) static int tty_ldisc_halt(struct tty_struct *tty) { clear_bit(TTY_LDISC, &tty->flags); - return cancel_delayed_work(&tty->buf.work); + return cancel_delayed_work_sync(&tty->buf.work); } /** @@ -754,12 +754,9 @@ void tty_ldisc_hangup(struct tty_struct *tty) * N_TTY. */ if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) { - /* Make sure the old ldisc is quiescent */ - tty_ldisc_halt(tty); - flush_scheduled_work(); - /* Avoid racing set_ldisc or tty_ldisc_release */ mutex_lock(&tty->ldisc_mutex); + tty_ldisc_halt(tty); if (tty->ldisc) { /* Not yet closed */ /* Switch back to N_TTY */ tty_ldisc_reinit(tty); diff --git a/drivers/char/tty_port.c b/drivers/char/tty_port.c index 9769b1149f76..c0ff7eeafbb2 100644 --- a/drivers/char/tty_port.c +++ b/drivers/char/tty_port.c @@ -96,6 +96,14 @@ void tty_port_tty_set(struct tty_port *port, struct tty_struct *tty) } EXPORT_SYMBOL(tty_port_tty_set); +static void tty_port_shutdown(struct tty_port *port) +{ + if (port->ops->shutdown && + test_and_clear_bit(ASYNCB_INITIALIZED, &port->flags)) + port->ops->shutdown(port); + +} + /** * tty_port_hangup - hangup helper * @port: tty port @@ -116,6 +124,7 @@ void tty_port_hangup(struct tty_port *port) port->tty = NULL; spin_unlock_irqrestore(&port->lock, flags); wake_up_interruptible(&port->open_wait); + tty_port_shutdown(port); } EXPORT_SYMBOL(tty_port_hangup); @@ -208,8 +217,14 @@ int tty_port_block_til_ready(struct tty_port *port, /* if non-blocking mode is set we can pass directly to open unless the port has just hung up or is in another error state */ - if ((filp->f_flags & O_NONBLOCK) || - (tty->flags & (1 << TTY_IO_ERROR))) { + if (tty->flags & (1 << TTY_IO_ERROR)) { + port->flags |= ASYNC_NORMAL_ACTIVE; + return 0; + } + if (filp->f_flags & O_NONBLOCK) { + /* Indicate we are open */ + if (tty->termios->c_cflag & CBAUD) + tty_port_raise_dtr_rts(port); port->flags |= ASYNC_NORMAL_ACTIVE; return 0; } @@ -296,15 +311,17 @@ int tty_port_close_start(struct tty_port *port, struct tty_struct *tty, struct f if (port->count) { spin_unlock_irqrestore(&port->lock, flags); + if (port->ops->drop) + port->ops->drop(port); return 0; } - port->flags |= ASYNC_CLOSING; + set_bit(ASYNCB_CLOSING, &port->flags); tty->closing = 1; spin_unlock_irqrestore(&port->lock, flags); /* Don't block on a stalled port, just pull the chain */ if (tty->flow_stopped) tty_driver_flush_buffer(tty); - if (port->flags & ASYNC_INITIALIZED && + if (test_bit(ASYNCB_INITIALIZED, &port->flags) && port->closing_wait != ASYNC_CLOSING_WAIT_NONE) tty_wait_until_sent(tty, port->closing_wait); if (port->drain_delay) { @@ -318,6 +335,9 @@ int tty_port_close_start(struct tty_port *port, struct tty_struct *tty, struct f timeout = 2 * HZ; schedule_timeout_interruptible(timeout); } + /* Don't call port->drop for the last reference. Callers will want + to drop the last active reference in ->shutdown() or the tty + shutdown path */ return 1; } EXPORT_SYMBOL(tty_port_close_start); @@ -348,3 +368,14 @@ void tty_port_close_end(struct tty_port *port, struct tty_struct *tty) spin_unlock_irqrestore(&port->lock, flags); } EXPORT_SYMBOL(tty_port_close_end); + +void tty_port_close(struct tty_port *port, struct tty_struct *tty, + struct file *filp) +{ + if (tty_port_close_start(port, tty, filp) == 0) + return; + tty_port_shutdown(port); + tty_port_close_end(port, tty); + tty_port_tty_set(port, NULL); +} +EXPORT_SYMBOL(tty_port_close); diff --git a/drivers/char/vt.c b/drivers/char/vt.c index 404f4c1ee431..6aa88f50b039 100644 --- a/drivers/char/vt.c +++ b/drivers/char/vt.c @@ -2948,9 +2948,6 @@ int __init vty_init(const struct file_operations *console_fops) panic("Couldn't register console driver\n"); kbd_init(); console_map_init(); -#ifdef CONFIG_PROM_CONSOLE - prom_con_init(); -#endif #ifdef CONFIG_MDA_CONSOLE mda_console_init(); #endif diff --git a/drivers/connector/cn_proc.c b/drivers/connector/cn_proc.c index c5afc98e2675..9ca20d04dd5a 100644 --- a/drivers/connector/cn_proc.c +++ b/drivers/connector/cn_proc.c @@ -202,9 +202,8 @@ static void cn_proc_ack(int err, int rcvd_seq, int rcvd_ack) * cn_proc_mcast_ctl * @data: message sent from userspace via the connector */ -static void cn_proc_mcast_ctl(void *data) +static void cn_proc_mcast_ctl(struct cn_msg *msg, struct netlink_skb_parms *nsp) { - struct cn_msg *msg = data; enum proc_cn_mcast_op *mc_op = NULL; int err = 0; diff --git a/drivers/connector/cn_queue.c b/drivers/connector/cn_queue.c index 408c2af25d50..210338ea222f 100644 --- a/drivers/connector/cn_queue.c +++ b/drivers/connector/cn_queue.c @@ -78,16 +78,20 @@ void cn_queue_wrapper(struct work_struct *work) struct cn_callback_entry *cbq = container_of(work, struct cn_callback_entry, work); struct cn_callback_data *d = &cbq->data; + struct cn_msg *msg = NLMSG_DATA(nlmsg_hdr(d->skb)); + struct netlink_skb_parms *nsp = &NETLINK_CB(d->skb); - d->callback(d->callback_priv); + d->callback(msg, nsp); - d->destruct_data(d->ddata); - d->ddata = NULL; + kfree_skb(d->skb); + d->skb = NULL; kfree(d->free); } -static struct cn_callback_entry *cn_queue_alloc_callback_entry(char *name, struct cb_id *id, void (*callback)(void *)) +static struct cn_callback_entry * +cn_queue_alloc_callback_entry(char *name, struct cb_id *id, + void (*callback)(struct cn_msg *, struct netlink_skb_parms *)) { struct cn_callback_entry *cbq; @@ -120,7 +124,8 @@ int cn_cb_equal(struct cb_id *i1, struct cb_id *i2) return ((i1->idx == i2->idx) && (i1->val == i2->val)); } -int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id, void (*callback)(void *)) +int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id, + void (*callback)(struct cn_msg *, struct netlink_skb_parms *)) { struct cn_callback_entry *cbq, *__cbq; int found = 0; diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index 08b2500f21ec..537c29ac4487 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c @@ -36,17 +36,6 @@ MODULE_LICENSE("GPL"); MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>"); MODULE_DESCRIPTION("Generic userspace <-> kernelspace connector."); -static u32 cn_idx = CN_IDX_CONNECTOR; -static u32 cn_val = CN_VAL_CONNECTOR; - -module_param(cn_idx, uint, 0); -module_param(cn_val, uint, 0); -MODULE_PARM_DESC(cn_idx, "Connector's main device idx."); -MODULE_PARM_DESC(cn_val, "Connector's main device val."); - -static DEFINE_MUTEX(notify_lock); -static LIST_HEAD(notify_list); - static struct cn_dev cdev; static int cn_already_initialized; @@ -129,21 +118,19 @@ EXPORT_SYMBOL_GPL(cn_netlink_send); /* * Callback helper - queues work and setup destructor for given data. */ -static int cn_call_callback(struct cn_msg *msg, void (*destruct_data)(void *), void *data) +static int cn_call_callback(struct sk_buff *skb) { struct cn_callback_entry *__cbq, *__new_cbq; struct cn_dev *dev = &cdev; + struct cn_msg *msg = NLMSG_DATA(nlmsg_hdr(skb)); int err = -ENODEV; spin_lock_bh(&dev->cbdev->queue_lock); list_for_each_entry(__cbq, &dev->cbdev->queue_list, callback_entry) { if (cn_cb_equal(&__cbq->id.id, &msg->id)) { if (likely(!work_pending(&__cbq->work) && - __cbq->data.ddata == NULL)) { - __cbq->data.callback_priv = msg; - - __cbq->data.ddata = data; - __cbq->data.destruct_data = destruct_data; + __cbq->data.skb == NULL)) { + __cbq->data.skb = skb; if (queue_cn_work(__cbq, &__cbq->work)) err = 0; @@ -156,10 +143,8 @@ static int cn_call_callback(struct cn_msg *msg, void (*destruct_data)(void *), v __new_cbq = kzalloc(sizeof(struct cn_callback_entry), GFP_ATOMIC); if (__new_cbq) { d = &__new_cbq->data; - d->callback_priv = msg; + d->skb = skb; d->callback = __cbq->data.callback; - d->ddata = data; - d->destruct_data = destruct_data; d->free = __new_cbq; __new_cbq->pdev = __cbq->pdev; @@ -191,7 +176,6 @@ static int cn_call_callback(struct cn_msg *msg, void (*destruct_data)(void *), v */ static void cn_rx_skb(struct sk_buff *__skb) { - struct cn_msg *msg; struct nlmsghdr *nlh; int err; struct sk_buff *skb; @@ -208,68 +192,20 @@ static void cn_rx_skb(struct sk_buff *__skb) return; } - msg = NLMSG_DATA(nlh); - err = cn_call_callback(msg, (void (*)(void *))kfree_skb, skb); + err = cn_call_callback(skb); if (err < 0) kfree_skb(skb); } } /* - * Notification routing. - * - * Gets id and checks if there are notification request for it's idx - * and val. If there are such requests notify the listeners with the - * given notify event. - * - */ -static void cn_notify(struct cb_id *id, u32 notify_event) -{ - struct cn_ctl_entry *ent; - - mutex_lock(¬ify_lock); - list_for_each_entry(ent, ¬ify_list, notify_entry) { - int i; - struct cn_notify_req *req; - struct cn_ctl_msg *ctl = ent->msg; - int idx_found, val_found; - - idx_found = val_found = 0; - - req = (struct cn_notify_req *)ctl->data; - for (i = 0; i < ctl->idx_notify_num; ++i, ++req) { - if (id->idx >= req->first && - id->idx < req->first + req->range) { - idx_found = 1; - break; - } - } - - for (i = 0; i < ctl->val_notify_num; ++i, ++req) { - if (id->val >= req->first && - id->val < req->first + req->range) { - val_found = 1; - break; - } - } - - if (idx_found && val_found) { - struct cn_msg m = { .ack = notify_event, }; - - memcpy(&m.id, id, sizeof(m.id)); - cn_netlink_send(&m, ctl->group, GFP_KERNEL); - } - } - mutex_unlock(¬ify_lock); -} - -/* * Callback add routing - adds callback with given ID and name. * If there is registered callback with the same ID it will not be added. * * May sleep. */ -int cn_add_callback(struct cb_id *id, char *name, void (*callback)(void *)) +int cn_add_callback(struct cb_id *id, char *name, + void (*callback)(struct cn_msg *, struct netlink_skb_parms *)) { int err; struct cn_dev *dev = &cdev; @@ -281,8 +217,6 @@ int cn_add_callback(struct cb_id *id, char *name, void (*callback)(void *)) if (err) return err; - cn_notify(id, 0); - return 0; } EXPORT_SYMBOL_GPL(cn_add_callback); @@ -300,112 +234,9 @@ void cn_del_callback(struct cb_id *id) struct cn_dev *dev = &cdev; cn_queue_del_callback(dev->cbdev, id); - cn_notify(id, 1); } EXPORT_SYMBOL_GPL(cn_del_callback); -/* - * Checks two connector's control messages to be the same. - * Returns 1 if they are the same or if the first one is corrupted. - */ -static int cn_ctl_msg_equals(struct cn_ctl_msg *m1, struct cn_ctl_msg *m2) -{ - int i; - struct cn_notify_req *req1, *req2; - - if (m1->idx_notify_num != m2->idx_notify_num) - return 0; - - if (m1->val_notify_num != m2->val_notify_num) - return 0; - - if (m1->len != m2->len) - return 0; - - if ((m1->idx_notify_num + m1->val_notify_num) * sizeof(*req1) != - m1->len) - return 1; - - req1 = (struct cn_notify_req *)m1->data; - req2 = (struct cn_notify_req *)m2->data; - - for (i = 0; i < m1->idx_notify_num; ++i) { - if (req1->first != req2->first || req1->range != req2->range) - return 0; - req1++; - req2++; - } - - for (i = 0; i < m1->val_notify_num; ++i) { - if (req1->first != req2->first || req1->range != req2->range) - return 0; - req1++; - req2++; - } - - return 1; -} - -/* - * Main connector device's callback. - * - * Used for notification of a request's processing. - */ -static void cn_callback(void *data) -{ - struct cn_msg *msg = data; - struct cn_ctl_msg *ctl; - struct cn_ctl_entry *ent; - u32 size; - - if (msg->len < sizeof(*ctl)) - return; - - ctl = (struct cn_ctl_msg *)msg->data; - - size = (sizeof(*ctl) + ((ctl->idx_notify_num + - ctl->val_notify_num) * - sizeof(struct cn_notify_req))); - - if (msg->len != size) - return; - - if (ctl->len + sizeof(*ctl) != msg->len) - return; - - /* - * Remove notification. - */ - if (ctl->group == 0) { - struct cn_ctl_entry *n; - - mutex_lock(¬ify_lock); - list_for_each_entry_safe(ent, n, ¬ify_list, notify_entry) { - if (cn_ctl_msg_equals(ent->msg, ctl)) { - list_del(&ent->notify_entry); - kfree(ent); - } - } - mutex_unlock(¬ify_lock); - - return; - } - - size += sizeof(*ent); - - ent = kzalloc(size, GFP_KERNEL); - if (!ent) - return; - - ent->msg = (struct cn_ctl_msg *)(ent + 1); - - memcpy(ent->msg, ctl, size - sizeof(*ent)); - - mutex_lock(¬ify_lock); - list_add(&ent->notify_entry, ¬ify_list); - mutex_unlock(¬ify_lock); -} - static int cn_proc_show(struct seq_file *m, void *v) { struct cn_queue_dev *dev = cdev.cbdev; @@ -443,11 +274,8 @@ static const struct file_operations cn_file_ops = { static int __devinit cn_init(void) { struct cn_dev *dev = &cdev; - int err; dev->input = cn_rx_skb; - dev->id.idx = cn_idx; - dev->id.val = cn_val; dev->nls = netlink_kernel_create(&init_net, NETLINK_CONNECTOR, CN_NETLINK_USERS + 0xf, @@ -463,14 +291,6 @@ static int __devinit cn_init(void) cn_already_initialized = 1; - err = cn_add_callback(&dev->id, "connector", &cn_callback); - if (err) { - cn_already_initialized = 0; - cn_queue_free_dev(dev->cbdev); - netlink_kernel_release(dev->nls); - return -EINVAL; - } - proc_net_fops_create(&init_net, "connector", S_IRUGO, &cn_file_ops); return 0; @@ -484,7 +304,6 @@ static void __devexit cn_fini(void) proc_net_remove(&init_net, "connector"); - cn_del_callback(&dev->id); cn_queue_free_dev(dev->cbdev); netlink_kernel_release(dev->nls); } diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index 8504a2108557..910c49d2641c 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c @@ -75,8 +75,11 @@ static void cpuidle_idle_call(void) #endif /* ask the governor for the next state */ next_state = cpuidle_curr_governor->select(dev); - if (need_resched()) + if (need_resched()) { + local_irq_enable(); return; + } + target_state = &dev->states[next_state]; /* enter the state and update stats */ diff --git a/drivers/crypto/Kconfig b/drivers/crypto/Kconfig index 5057cb958230..9c2919a431a8 100644 --- a/drivers/crypto/Kconfig +++ b/drivers/crypto/Kconfig @@ -211,7 +211,7 @@ config CRYPTO_DEV_PPC4XX config CRYPTO_DEV_DCP tristate "Support for the DCP engine" - depends on ARCH_MX28 || ARCH_MX23 || ARCH_MX50 + depends on ARCH_MX28 || ARCH_MX23 select CRYPTO_ALGAPI select CRYPTO_BLKCIPHER help diff --git a/drivers/crypto/dcp.c b/drivers/crypto/dcp.c index eb7a83d276b7..8b54b127d6d0 100644 --- a/drivers/crypto/dcp.c +++ b/drivers/crypto/dcp.c @@ -36,7 +36,7 @@ #include <linux/interrupt.h> #include <linux/delay.h> #include <linux/uaccess.h> -#include <linux/clk.h> + #include <linux/io.h> #include <linux/delay.h> @@ -60,8 +60,6 @@ struct dcp { int dcp_vmi_irq; int dcp_irq; u32 dcp_regs_base; - ulong clock_state; - bool chan_in_use[DCP_NUM_CHANNELS]; /* Following buffers used in hashing to meet 64-byte len alignment */ char *buf1; @@ -97,10 +95,6 @@ struct dcp { #define DCP_FILL 0x5000 #define DCP_MODE_MASK 0xf000 -/* clock defines */ -#define CLOCK_ON 1 -#define CLOCK_OFF 0 - struct dcp_op { unsigned int flags; @@ -183,45 +177,6 @@ struct dcp_hash_op { /* only one */ static struct dcp *global_sdcp; -static void dcp_clock(struct dcp *sdcp, ulong state, bool force) -{ - u32 chan; - struct clk *clk = clk_get(sdcp->dev, "dcp_clk"); - - /* unless force is true (used during suspend/resume), if any - * channel is running, then clk is already on, and must stay on */ - if (!force) - for (chan = 0; chan < DCP_NUM_CHANNELS; chan++) - if (sdcp->chan_in_use[chan]) - goto exit; - - if (state == CLOCK_OFF) { - /* gate at clock source */ - if (!IS_ERR(clk)) - clk_disable(clk); - /* gate at DCP */ - else - __raw_writel(BM_DCP_CTRL_CLKGATE, - sdcp->dcp_regs_base + HW_DCP_CTRL_SET); - - sdcp->clock_state = CLOCK_OFF; - - } else { - /* ungate at clock source */ - if (!IS_ERR(clk)) - clk_enable(clk); - /* ungate at DCP */ - else - __raw_writel(BM_DCP_CTRL_CLKGATE, - sdcp->dcp_regs_base + HW_DCP_CTRL_CLR); - - sdcp->clock_state = CLOCK_ON; - } - -exit: - return; -} - static void dcp_perform_op(struct dcp_op *op) { struct dcp *sdcp = global_sdcp; @@ -307,8 +262,6 @@ static void dcp_perform_op(struct dcp_op *op) /* submit the work */ mutex_lock(mutex); - dcp_clock(sdcp, CLOCK_ON, false); - sdcp->chan_in_use[chan] = true; __raw_writel(-1, sdcp->dcp_regs_base + HW_DCP_CHnSTAT_CLR(chan)); @@ -337,9 +290,8 @@ static void dcp_perform_op(struct dcp_op *op) __raw_readl(sdcp->dcp_regs_base + HW_DCP_CHnSTAT(chan)) & 0xff); out: - sdcp->chan_in_use[chan] = false; - dcp_clock(sdcp, CLOCK_OFF, false); mutex_unlock(mutex); + dma_unmap_single(sdcp->dev, pkt_phys, sizeof(*pkt), DMA_TO_DEVICE); } @@ -1109,8 +1061,6 @@ static int dcp_sha_init(struct shash_desc *desc) struct mutex *mutex = &sdcp->op_mutex[HASH_CHAN]; mutex_lock(mutex); - dcp_clock(sdcp, CLOCK_ON, false); - sdcp->chan_in_use[HASH_CHAN] = true; op->length = 0; @@ -1240,8 +1190,6 @@ static int dcp_sha_final(struct shash_desc *desc, u8 *out) for (i = 0; i < digest_len; i++) *out++ = *--digest; - sdcp->chan_in_use[HASH_CHAN] = false; - dcp_clock(sdcp, CLOCK_OFF, false); mutex_unlock(mutex); return ret; @@ -1340,8 +1288,6 @@ static int dcp_bootstream_ioctl(struct inode *inode, struct file *file, mutex = &sdcp->op_mutex[chan]; mutex_lock(mutex); - dcp_clock(sdcp, CLOCK_ON, false); - sdcp->chan_in_use[chan] = true; __raw_writel(-1, sdcp->dcp_regs_base + HW_DCP_CHnSTAT_CLR(ROM_DCP_CHAN)); @@ -1402,8 +1348,6 @@ static int dcp_bootstream_ioctl(struct inode *inode, struct file *file, retVal = 0; exit: - sdcp->chan_in_use[chan] = false; - dcp_clock(sdcp, CLOCK_OFF, false); mutex_unlock(mutex); return retVal; } @@ -1446,7 +1390,6 @@ static int dcp_probe(struct platform_device *pdev) for (i = 0; i < DCP_NUM_CHANNELS; i++) { mutex_init(&sdcp->op_mutex[i]); init_completion(&sdcp->op_wait[i]); - sdcp->chan_in_use[i] = false; } platform_set_drvdata(pdev, sdcp); @@ -1457,8 +1400,7 @@ static int dcp_probe(struct platform_device *pdev) ret = -ENXIO; goto err_kfree; } - sdcp->dcp_regs_base = (u32) ioremap(r->start, r->end - r->start + 1); - dcp_clock(sdcp, CLOCK_ON, true); + sdcp->dcp_regs_base = (u32) IO_ADDRESS(r->start); /* Soft reset and remove the clock gate */ __raw_writel(BM_DCP_CTRL_SFTRST, sdcp->dcp_regs_base + HW_DCP_CTRL_SET); @@ -1494,14 +1436,14 @@ static int dcp_probe(struct platform_device *pdev) if (!r) { dev_err(&pdev->dev, "can't get IRQ resource (0)\n"); ret = -EIO; - goto err_gate_clk; + goto err_kfree; } sdcp->dcp_vmi_irq = r->start; ret = request_irq(sdcp->dcp_vmi_irq, dcp_vmi_irq, 0, "dcp", sdcp); if (ret != 0) { dev_err(&pdev->dev, "can't request_irq (0)\n"); - goto err_gate_clk; + goto err_kfree; } r = platform_get_resource(pdev, IORESOURCE_IRQ, 1); @@ -1522,7 +1464,7 @@ static int dcp_probe(struct platform_device *pdev) ret = crypto_register_alg(&dcp_aes_alg); if (ret != 0) { dev_err(&pdev->dev, "Failed to register aes crypto\n"); - goto err_free_irq1; + goto err_kfree; } ret = crypto_register_alg(&dcp_aes_ecb_alg); @@ -1633,7 +1575,6 @@ static int dcp_probe(struct platform_device *pdev) goto err_dereg; } - dcp_clock(sdcp, CLOCK_OFF, false); dev_notice(&pdev->dev, "DCP crypto enabled.!\n"); return 0; @@ -1647,12 +1588,8 @@ err_unregister_aes_ecb: crypto_unregister_alg(&dcp_aes_ecb_alg); err_unregister_aes: crypto_unregister_alg(&dcp_aes_alg); -err_free_irq1: - free_irq(sdcp->dcp_irq, sdcp); err_free_irq0: free_irq(sdcp->dcp_vmi_irq, sdcp); -err_gate_clk: - dcp_clock(sdcp, CLOCK_OFF, false); err_kfree: kfree(sdcp); err: @@ -1667,8 +1604,6 @@ static int dcp_remove(struct platform_device *pdev) sdcp = platform_get_drvdata(pdev); platform_set_drvdata(pdev, NULL); - dcp_clock(sdcp, CLOCK_ON, false); - free_irq(sdcp->dcp_irq, sdcp); free_irq(sdcp->dcp_vmi_irq, sdcp); @@ -1707,41 +1642,28 @@ static int dcp_remove(struct platform_device *pdev) crypto_unregister_alg(&dcp_aes_cbc_alg); crypto_unregister_alg(&dcp_aes_ecb_alg); crypto_unregister_alg(&dcp_aes_alg); - - dcp_clock(sdcp, CLOCK_OFF, true); - iounmap((void *) sdcp->dcp_regs_base); kfree(sdcp); global_sdcp = NULL; return 0; } + +#ifdef CONFIG_PM static int dcp_suspend(struct platform_device *pdev, pm_message_t state) { -#ifdef CONFIG_PM - struct dcp *sdcp = platform_get_drvdata(pdev); - - if (sdcp->clock_state == CLOCK_ON) { - dcp_clock(sdcp, CLOCK_OFF, true); - /* indicate that clock needs to be turned on upon resume */ - sdcp->clock_state = CLOCK_ON; - } -#endif return 0; } static int dcp_resume(struct platform_device *pdev) { -#ifdef CONFIG_PM - struct dcp *sdcp = platform_get_drvdata(pdev); - - /* if clock was on prior to suspend, turn it back on */ - if (sdcp->clock_state == CLOCK_ON) - dcp_clock(sdcp, CLOCK_ON, true); -#endif return 0; } +#else +#define dcp_suspend NULL +#define dcp_resume NULL +#endif static struct platform_driver dcp_driver = { .probe = dcp_probe, diff --git a/drivers/crypto/padlock-aes.c b/drivers/crypto/padlock-aes.c index a9952b1236b0..84c51e177269 100644 --- a/drivers/crypto/padlock-aes.c +++ b/drivers/crypto/padlock-aes.c @@ -236,7 +236,7 @@ static inline void ecb_crypt(const u8 *in, u8 *out, u32 *key, /* Padlock in ECB mode fetches at least ecb_fetch_bytes of data. * We could avoid some copying here but it's probably not worth it. */ - if (unlikely(((unsigned long)in & PAGE_SIZE) + ecb_fetch_bytes > PAGE_SIZE)) { + if (unlikely(((unsigned long)in & ~PAGE_MASK) + ecb_fetch_bytes > PAGE_SIZE)) { ecb_crypt_copy(in, out, key, cword, count); return; } @@ -248,7 +248,7 @@ static inline u8 *cbc_crypt(const u8 *in, u8 *out, u32 *key, u8 *iv, struct cword *cword, int count) { /* Padlock in CBC mode fetches at least cbc_fetch_bytes of data. */ - if (unlikely(((unsigned long)in & PAGE_SIZE) + cbc_fetch_bytes > PAGE_SIZE)) + if (unlikely(((unsigned long)in & ~PAGE_MASK) + cbc_fetch_bytes > PAGE_SIZE)) return cbc_crypt_copy(in, out, key, iv, cword, count); return rep_xcrypt_cbc(in, out, key, iv, cword, count); diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c index 9a1e5fb412ed..73957fb9db5f 100644 --- a/drivers/dma/at_hdmac.c +++ b/drivers/dma/at_hdmac.c @@ -813,7 +813,7 @@ atc_is_tx_complete(struct dma_chan *chan, dev_vdbg(chan2dev(chan), "is_tx_complete: %d (d%d, u%d)\n", cookie, done ? *done : 0, used ? *used : 0); - spin_lock_bh(atchan->lock); + spin_lock_bh(&atchan->lock); last_complete = atchan->completed_cookie; last_used = chan->cookie; @@ -828,7 +828,7 @@ atc_is_tx_complete(struct dma_chan *chan, ret = dma_async_is_complete(cookie, last_complete, last_used); } - spin_unlock_bh(atchan->lock); + spin_unlock_bh(&atchan->lock); if (done) *done = last_complete; diff --git a/drivers/dma/pxp/pxp_device.c b/drivers/dma/pxp/pxp_device.c index 74176d3da9d3..afd08ac6587c 100644 --- a/drivers/dma/pxp/pxp_device.c +++ b/drivers/dma/pxp/pxp_device.c @@ -132,6 +132,8 @@ static int pxp_ioc_config_chan(unsigned long arg) init_waitqueue_head(&(irq_info[chan_id].waitq)); + /* Fixme */ + mdelay(100); /* find the channel */ spin_lock(&pxp_chan_lock); list_for_each_entry(info, &list, list) { @@ -484,7 +486,7 @@ static int __devexit pxp_device_remove(struct platform_device *pdev) return 0; } -static struct platform_driver pxp_client_driver = { +static struct platform_driver pxp_device = { .probe = pxp_device_probe, .remove = __exit_p(pxp_device_remove), .driver = { @@ -495,12 +497,12 @@ static struct platform_driver pxp_client_driver = { static int __init pxp_device_init(void) { - return platform_driver_register(&pxp_client_driver); + return platform_driver_register(&pxp_device); } static void __exit pxp_device_exit(void) { - platform_driver_unregister(&pxp_client_driver); + platform_driver_unregister(&pxp_device); } module_init(pxp_device_init); diff --git a/drivers/dma/pxp/pxp_dma.c b/drivers/dma/pxp/pxp_dma.c index b8648049de89..e418f6c9715e 100644 --- a/drivers/dma/pxp/pxp_dma.c +++ b/drivers/dma/pxp/pxp_dma.c @@ -31,7 +31,6 @@ #include <linux/vmalloc.h> #include <linux/dmaengine.h> #include <linux/pxp_dma.h> -#include <linux/timer.h> #include <linux/clk.h> #include "regs-pxp.h" @@ -51,23 +50,16 @@ struct pxps { int irq; /* PXP IRQ to the CPU */ spinlock_t lock; - struct mutex mutex_clk; - int clk_stat; -#define CLK_STAT_OFF 0 -#define CLK_STAT_ON 1 + struct mutex mutex; struct device *dev; struct pxp_dma pxp_dma; struct pxp_channel channel[NR_PXP_VIRT_CHANNEL]; struct work_struct work; struct workqueue_struct *workqueue; - wait_queue_head_t done; /* describes most recent processing configuration */ struct pxp_config_data pxp_conf_state; - - /* to turn clock off when pxp is inactive */ - struct timer_list clk_timer; }; #define to_pxp_dma(d) container_of(d, struct pxp_dma, dma) @@ -78,9 +70,6 @@ struct pxps { #define PXP_DEF_BUFS 2 #define PXP_MIN_PIX 8 -#define PXP_WAITCON ((__raw_readl(pxp->base + HW_PXP_STAT) & \ - BM_PXP_STAT_IRQ) != BM_PXP_STAT_IRQ) - static uint32_t pxp_s0_formats[] = { PXP_PIX_FMT_RGB24, PXP_PIX_FMT_RGB565, @@ -94,76 +83,72 @@ static uint32_t pxp_s0_formats[] = { */ static void dump_pxp_reg(struct pxps *pxp) { - dev_dbg(pxp->dev, "PXP_CTRL 0x%x", + dev_err(pxp->dev, "PXP_CTRL 0x%x", __raw_readl(pxp->base + HW_PXP_CTRL)); - dev_dbg(pxp->dev, "PXP_STAT 0x%x", + dev_err(pxp->dev, "PXP_STAT 0x%x", __raw_readl(pxp->base + HW_PXP_STAT)); - dev_dbg(pxp->dev, "PXP_OUTBUF 0x%x", + dev_err(pxp->dev, "PXP_OUTBUF 0x%x", __raw_readl(pxp->base + HW_PXP_OUTBUF)); - dev_dbg(pxp->dev, "PXP_OUTBUF2 0x%x", + dev_err(pxp->dev, "PXP_OUTBUF2 0x%x", __raw_readl(pxp->base + HW_PXP_OUTBUF2)); - dev_dbg(pxp->dev, "PXP_OUTSIZE 0x%x", + dev_err(pxp->dev, "PXP_OUTSIZE 0x%x", __raw_readl(pxp->base + HW_PXP_OUTSIZE)); - dev_dbg(pxp->dev, "PXP_S0BUF 0x%x", + dev_err(pxp->dev, "PXP_S0BUF 0x%x", __raw_readl(pxp->base + HW_PXP_S0BUF)); - dev_dbg(pxp->dev, "PXP_S0UBUF 0x%x", + dev_err(pxp->dev, "PXP_S0UBUF 0x%x", __raw_readl(pxp->base + HW_PXP_S0UBUF)); - dev_dbg(pxp->dev, "PXP_S0VBUF 0x%x", + dev_err(pxp->dev, "PXP_S0VBUF 0x%x", __raw_readl(pxp->base + HW_PXP_S0VBUF)); - dev_dbg(pxp->dev, "PXP_S0PARAM 0x%x", + dev_err(pxp->dev, "PXP_S0PARAM 0x%x", __raw_readl(pxp->base + HW_PXP_S0PARAM)); - dev_dbg(pxp->dev, "PXP_S0BACKGROUND 0x%x", + dev_err(pxp->dev, "PXP_S0BACKGROUND 0x%x", __raw_readl(pxp->base + HW_PXP_S0BACKGROUND)); - dev_dbg(pxp->dev, "PXP_S0CROP 0x%x", + dev_err(pxp->dev, "PXP_S0CROP 0x%x", __raw_readl(pxp->base + HW_PXP_S0CROP)); - dev_dbg(pxp->dev, "PXP_S0SCALE 0x%x", + dev_err(pxp->dev, "PXP_S0SCALE 0x%x", __raw_readl(pxp->base + HW_PXP_S0SCALE)); - dev_dbg(pxp->dev, "PXP_OLn 0x%x", + dev_err(pxp->dev, "PXP_OLn 0x%x", __raw_readl(pxp->base + HW_PXP_OLn(0))); - dev_dbg(pxp->dev, "PXP_OLnSIZE 0x%x", + dev_err(pxp->dev, "PXP_OLnSIZE 0x%x", __raw_readl(pxp->base + HW_PXP_OLnSIZE(0))); - dev_dbg(pxp->dev, "PXP_OLnPARAM 0x%x", + dev_err(pxp->dev, "PXP_OLnPARAM 0x%x", __raw_readl(pxp->base + HW_PXP_OLnPARAM(0))); - dev_dbg(pxp->dev, "PXP_CSCCOEF0 0x%x", + dev_err(pxp->dev, "PXP_CSCCOEF0 0x%x", __raw_readl(pxp->base + HW_PXP_CSCCOEF0)); - dev_dbg(pxp->dev, "PXP_CSCCOEF1 0x%x", - __raw_readl(pxp->base + HW_PXP_CSCCOEF1)); - dev_dbg(pxp->dev, "PXP_CSCCOEF2 0x%x", - __raw_readl(pxp->base + HW_PXP_CSCCOEF2)); - dev_dbg(pxp->dev, "PXP_CSC2CTRL 0x%x", + dev_err(pxp->dev, "PXP_CSC2CTRL 0x%x", __raw_readl(pxp->base + HW_PXP_CSC2CTRL)); - dev_dbg(pxp->dev, "PXP_CSC2COEF0 0x%x", + dev_err(pxp->dev, "PXP_CSC2COEF0 0x%x", __raw_readl(pxp->base + HW_PXP_CSC2COEF0)); - dev_dbg(pxp->dev, "PXP_CSC2COEF1 0x%x", + dev_err(pxp->dev, "PXP_CSC2COEF1 0x%x", __raw_readl(pxp->base + HW_PXP_CSC2COEF1)); - dev_dbg(pxp->dev, "PXP_CSC2COEF2 0x%x", + dev_err(pxp->dev, "PXP_CSC2COEF2 0x%x", __raw_readl(pxp->base + HW_PXP_CSC2COEF2)); - dev_dbg(pxp->dev, "PXP_CSC2COEF3 0x%x", + dev_err(pxp->dev, "PXP_CSC2COEF3 0x%x", __raw_readl(pxp->base + HW_PXP_CSC2COEF3)); - dev_dbg(pxp->dev, "PXP_CSC2COEF4 0x%x", + dev_err(pxp->dev, "PXP_CSC2COEF4 0x%x", __raw_readl(pxp->base + HW_PXP_CSC2COEF4)); - dev_dbg(pxp->dev, "PXP_CSC2COEF5 0x%x", + dev_err(pxp->dev, "PXP_CSC2COEF5 0x%x", __raw_readl(pxp->base + HW_PXP_CSC2COEF5)); - dev_dbg(pxp->dev, "PXP_LUT_CTRL 0x%x", + dev_err(pxp->dev, "PXP_LUT_CTRL 0x%x", __raw_readl(pxp->base + HW_PXP_LUT_CTRL)); - dev_dbg(pxp->dev, "PXP_LUT 0x%x", __raw_readl(pxp->base + HW_PXP_LUT)); - dev_dbg(pxp->dev, "PXP_HIST_CTRL 0x%x", + dev_err(pxp->dev, "PXP_LUT 0x%x", __raw_readl(pxp->base + HW_PXP_LUT)); + dev_err(pxp->dev, "PXP_HIST_CTRL 0x%x", __raw_readl(pxp->base + HW_PXP_HIST_CTRL)); - dev_dbg(pxp->dev, "PXP_HIST2_PARAM 0x%x", + dev_err(pxp->dev, "PXP_HIST2_PARAM 0x%x", __raw_readl(pxp->base + HW_PXP_HIST2_PARAM)); - dev_dbg(pxp->dev, "PXP_HIST4_PARAM 0x%x", + dev_err(pxp->dev, "PXP_HIST4_PARAM 0x%x", __raw_readl(pxp->base + HW_PXP_HIST4_PARAM)); - dev_dbg(pxp->dev, "PXP_HIST8_PARAM0 0x%x", + dev_err(pxp->dev, "PXP_HIST8_PARAM0 0x%x", __raw_readl(pxp->base + HW_PXP_HIST8_PARAM0)); - dev_dbg(pxp->dev, "PXP_HIST8_PARAM1 0x%x", + dev_err(pxp->dev, "PXP_HIST8_PARAM1 0x%x", __raw_readl(pxp->base + HW_PXP_HIST8_PARAM1)); - dev_dbg(pxp->dev, "PXP_HIST16_PARAM0 0x%x", + dev_err(pxp->dev, "PXP_HIST16_PARAM0 0x%x", __raw_readl(pxp->base + HW_PXP_HIST16_PARAM0)); - dev_dbg(pxp->dev, "PXP_HIST16_PARAM1 0x%x", + dev_err(pxp->dev, "PXP_HIST16_PARAM1 0x%x", __raw_readl(pxp->base + HW_PXP_HIST16_PARAM1)); - dev_dbg(pxp->dev, "PXP_HIST16_PARAM2 0x%x", + dev_err(pxp->dev, "PXP_HIST16_PARAM2 0x%x", __raw_readl(pxp->base + HW_PXP_HIST16_PARAM2)); - dev_dbg(pxp->dev, "PXP_HIST16_PARAM3 0x%x", + dev_err(pxp->dev, "PXP_HIST16_PARAM3 0x%x", __raw_readl(pxp->base + HW_PXP_HIST16_PARAM3)); } @@ -268,7 +253,6 @@ static int pxp_start(struct pxps *pxp) static void pxp_set_outbuf(struct pxps *pxp) { struct pxp_config_data *pxp_conf = &pxp->pxp_conf_state; - struct pxp_proc_data *proc_data = &pxp_conf->proc_data; struct pxp_layer_param *out_params = &pxp_conf->out_param; __raw_writel(out_params->paddr, pxp->base + HW_PXP_OUTBUF); @@ -340,7 +324,7 @@ static void pxp_set_olparam(int layer_no, struct pxps *pxp) else olparam |= BF_PXP_OLnPARAM_FORMAT(BV_PXP_OLnPARAM_FORMAT__RGB565); - if (olparams_data->global_alpha_enable) + if (olparams_data->global_alpha) olparam |= BF_PXP_OLnPARAM_ALPHA_CNTL (BV_PXP_OLnPARAM_ALPHA_CNTL__Override); @@ -493,9 +477,9 @@ static void pxp_set_csc(struct pxps *pxp) */ /* CSC1 - YUV->RGB */ - __raw_writel(0x84ab01f0, pxp->base + HW_PXP_CSCCOEF0); - __raw_writel(0x01230204, pxp->base + HW_PXP_CSCCOEF1); - __raw_writel(0x0730079c, pxp->base + HW_PXP_CSCCOEF2); + __raw_writel(0x04030000, pxp->base + HW_PXP_CSCCOEF0); + __raw_writel(0x01230208, pxp->base + HW_PXP_CSCCOEF1); + __raw_writel(0x076b079c, pxp->base + HW_PXP_CSCCOEF2); /* CSC2 - Bypass */ __raw_writel(0x1, pxp->base + HW_PXP_CSC2CTRL); @@ -596,43 +580,6 @@ static int pxp_config(struct pxps *pxp, struct pxp_channel *pxp_chan) return 0; } -static void pxp_clk_enable(struct pxps *pxp) -{ - mutex_lock(&pxp->mutex_clk); - - if (pxp->clk_stat == CLK_STAT_ON) { - mutex_unlock(&pxp->mutex_clk); - return; - } - - clk_enable(pxp->clk); - pxp->clk_stat = CLK_STAT_ON; - - mutex_unlock(&pxp->mutex_clk); -} - -static void pxp_clk_disable(struct pxps *pxp) -{ - mutex_lock(&pxp->mutex_clk); - - if (pxp->clk_stat == CLK_STAT_OFF) { - mutex_unlock(&pxp->mutex_clk); - return; - } - - clk_disable(pxp->clk); - pxp->clk_stat = CLK_STAT_OFF; - - mutex_unlock(&pxp->mutex_clk); -} - -static void pxp_clkoff_timer(unsigned long arg) -{ - struct pxps *pxp = (struct pxps *)arg; - - pxp_clk_disable(pxp); -} - static struct pxp_tx_desc *pxpdma_first_active(struct pxp_channel *pxp_chan) { return list_entry(pxp_chan->active_list.next, struct pxp_tx_desc, list); @@ -689,9 +636,13 @@ static void pxpdma_dostart_work(struct work_struct *w) struct pxps *pxp = container_of(w, struct pxps, work); struct pxp_channel *pxp_chan = NULL; unsigned long flags, flags1; + int val; - while (__raw_readl(pxp->base + HW_PXP_CTRL) & BM_PXP_CTRL_ENABLE) - ; + val = __raw_readl(pxp->base + HW_PXP_CTRL); + if (val & BM_PXP_CTRL_ENABLE) { + pr_warning("pxp is active, quit.\n"); + return; + } spin_lock_irqsave(&pxp->lock, flags); if (list_empty(&head)) { @@ -813,7 +764,7 @@ static int pxp_init_channel(struct pxp_dma *pxp_dma, spin_lock_irqsave(&pxp->lock, flags); /* max desc nr: S0+OL+OUT = 1+8+1 */ - n_desc = 16; + n_desc = 10; spin_unlock_irqrestore(&pxp->lock, flags); @@ -844,38 +795,25 @@ static int pxp_uninit_channel(struct pxp_dma *pxp_dma, static irqreturn_t pxp_irq(int irq, void *dev_id) { - struct pxps *pxp = dev_id; - struct pxp_channel *pxp_chan; + struct pxp_channel *pxp_chan = dev_id; + struct pxp_dma *pxp_dma = to_pxp_dma(pxp_chan->dma_chan.device); + struct pxps *pxp = to_pxp(pxp_dma); struct pxp_tx_desc *desc; dma_async_tx_callback callback; void *callback_param; - unsigned long flags, flags1; + unsigned long flags; u32 hist_status; - dump_pxp_reg(pxp); - hist_status = __raw_readl(pxp->base + HW_PXP_HIST_CTRL) & BM_PXP_HIST_CTRL_STATUS; __raw_writel(BM_PXP_STAT_IRQ, pxp->base + HW_PXP_STAT_CLR); - mod_timer(&pxp->clk_timer, jiffies + msecs_to_jiffies(4000)); - spin_lock_irqsave(&pxp->lock, flags); - if (list_empty(&head)) { - spin_unlock_irqrestore(&pxp->lock, flags); - return IRQ_NONE; - } - - spin_lock_irqsave(&pxp_chan->lock, flags1); - pxp_chan = list_entry(head.next, struct pxp_channel, list); - list_del_init(&pxp_chan->list); - if (list_empty(&pxp_chan->active_list)) { pr_debug("PXP_IRQ pxp_chan->active_list empty. chan_id %d\n", pxp_chan->dma_chan.chan_id); - spin_unlock_irqrestore(&pxp_chan->lock, flags1); spin_unlock_irqrestore(&pxp->lock, flags); return IRQ_NONE; } @@ -901,11 +839,10 @@ static irqreturn_t pxp_irq(int irq, void *dev_id) list_del(&pxp_chan->list); - wake_up(&pxp->done); - - spin_unlock_irqrestore(&pxp_chan->lock, flags1); spin_unlock_irqrestore(&pxp->lock, flags); + queue_work(pxp->workqueue, &pxp->work); + return IRQ_HANDLED; } @@ -1021,27 +958,17 @@ static void pxp_issue_pending(struct dma_chan *chan) spin_lock_irqsave(&pxp->lock, flags0); spin_lock_irqsave(&pxp_chan->lock, flags); + if (!list_empty(&pxp_chan->active_list)) + queue_work(pxp->workqueue, &pxp->work); if (!list_empty(&pxp_chan->queue)) { pxpdma_dequeue(pxp_chan, &pxp_chan->active_list); pxp_chan->status = PXP_CHANNEL_READY; list_add_tail(&pxp_chan->list, &head); - } else { - spin_unlock_irqrestore(&pxp_chan->lock, flags); - spin_unlock_irqrestore(&pxp->lock, flags0); - return; + queue_work(pxp->workqueue, &pxp->work); } spin_unlock_irqrestore(&pxp_chan->lock, flags); spin_unlock_irqrestore(&pxp->lock, flags0); - - pxp_clk_enable(pxp); - if (!wait_event_interruptible_timeout(pxp->done, PXP_WAITCON, 2 * HZ) || - signal_pending(current)) { - pxp_clk_disable(pxp); - return; - } - - queue_work(pxp->workqueue, &pxp->work); } static void __pxp_terminate_all(struct dma_chan *chan) @@ -1089,6 +1016,11 @@ static int pxp_alloc_chan_resources(struct dma_chan *chan) if (ret < 0) goto err_chan; + ret = request_irq(pxp_chan->eof_irq, pxp_irq, IRQF_SHARED, + "pxp-irq", pxp_chan); + if (ret < 0) + goto err_irq; + pxp_chan->status = PXP_CHANNEL_INITIALIZED; dev_dbg(&chan->dev->device, "Found channel 0x%x, irq %d\n", @@ -1096,6 +1028,8 @@ static int pxp_alloc_chan_resources(struct dma_chan *chan) return ret; +err_irq: + pxp_uninit_channel(pxp_dma, pxp_chan); err_chan: return ret; } @@ -1113,6 +1047,8 @@ static void pxp_free_chan_resources(struct dma_chan *chan) pxp_uninit_channel(pxp_dma, pxp_chan); + free_irq(pxp_chan->eof_irq, pxp_chan); + mutex_unlock(&pxp_chan->chan_mutex); } @@ -1315,7 +1251,7 @@ static int pxp_probe(struct platform_device *pdev) pxp->irq = irq; spin_lock_init(&pxp->lock); - mutex_init(&pxp->mutex_clk); + mutex_init(&pxp->mutex); if (!request_mem_region(res->start, resource_size(res), "pxp-mem")) { err = -EBUSY; @@ -1333,26 +1269,19 @@ static int pxp_probe(struct platform_device *pdev) dev_err(&pdev->dev, "failed to initialize hardware\n"); goto release; } - clk_disable(pxp->clk); - err = request_irq(pxp->irq, pxp_irq, 0, "pxp-irq", pxp); - if (err) - goto release; /* Initialize DMA engine */ err = pxp_dma_init(pxp); if (err < 0) goto err_dma_init; - init_waitqueue_head(&pxp->done); INIT_WORK(&pxp->work, pxpdma_dostart_work); pxp->workqueue = create_singlethread_workqueue("pxp_dma"); - init_timer(&pxp->clk_timer); - pxp->clk_timer.function = pxp_clkoff_timer; - pxp->clk_timer.data = (unsigned long)pxp; exit: return err; err_dma_init: free_irq(pxp->irq, pxp); + clk_disable(pxp->clk); release: release_mem_region(res->start, resource_size(res)); freepxp: @@ -1366,8 +1295,8 @@ static int __devexit pxp_remove(struct platform_device *pdev) struct pxps *pxp = platform_get_drvdata(pdev); cancel_work_sync(&pxp->work); + kfree(pxp); - del_timer_sync(&pxp->clk_timer); free_irq(pxp->irq, pxp); clk_disable(pxp->clk); clk_put(pxp->clk); @@ -1383,12 +1312,11 @@ static int pxp_suspend(struct platform_device *pdev, pm_message_t state) { struct pxps *pxp = platform_get_drvdata(pdev); - pxp_clk_enable(pxp); while (__raw_readl(pxp->base + HW_PXP_CTRL) & BM_PXP_CTRL_ENABLE) ; __raw_writel(BM_PXP_CTRL_SFTRST, pxp->base + HW_PXP_CTRL); - pxp_clk_disable(pxp); + clk_disable(pxp->clk); return 0; } @@ -1397,10 +1325,9 @@ static int pxp_resume(struct platform_device *pdev) { struct pxps *pxp = platform_get_drvdata(pdev); - pxp_clk_enable(pxp); + clk_enable(pxp->clk); /* Pull PxP out of reset */ __raw_writel(0, pxp->base + HW_PXP_CTRL); - pxp_clk_disable(pxp); return 0; } diff --git a/drivers/edac/i5000_edac.c b/drivers/edac/i5000_edac.c index d335086f4a26..0bd85eb99e6e 100644 --- a/drivers/edac/i5000_edac.c +++ b/drivers/edac/i5000_edac.c @@ -577,7 +577,13 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci, debugf0("\tUncorrected bits= 0x%x\n", ue_errors); branch = EXTRACT_FBDCHAN_INDX(info->ferr_nf_fbd); - channel = branch; + + /* + * According with i5000 datasheet, bit 28 has no significance + * for errors M4Err-M12Err and M17Err-M21Err, on FERR_NF_FBD + */ + channel = branch & 2; + bank = NREC_BANK(info->nrecmema); rank = NREC_RANK(info->nrecmema); rdwr = NREC_RDWR(info->nrecmema); diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c index 76b321bb73f9..e5827da92296 100644 --- a/drivers/firewire/ohci.c +++ b/drivers/firewire/ohci.c @@ -2180,6 +2180,13 @@ static int ohci_queue_iso_receive_dualbuffer(struct fw_iso_context *base, page = payload >> PAGE_SHIFT; offset = payload & ~PAGE_MASK; rest = p->payload_length; + /* + * The controllers I've tested have not worked correctly when + * second_req_count is zero. Rather than do something we know won't + * work, return an error + */ + if (rest == 0) + return -EINVAL; /* FIXME: make packet-per-buffer/dual-buffer a context option */ while (rest > 0) { @@ -2233,7 +2240,7 @@ static int ohci_queue_iso_receive_packet_per_buffer(struct fw_iso_context *base, unsigned long payload) { struct iso_context *ctx = container_of(base, struct iso_context, base); - struct descriptor *d = NULL, *pd = NULL; + struct descriptor *d, *pd; struct fw_iso_packet *p = packet; dma_addr_t d_bus, page_bus; u32 z, header_z, rest; @@ -2271,8 +2278,9 @@ static int ohci_queue_iso_receive_packet_per_buffer(struct fw_iso_context *base, d->data_address = cpu_to_le32(d_bus + (z * sizeof(*d))); rest = payload_per_buffer; + pd = d; for (j = 1; j < z; j++) { - pd = d + j; + pd++; pd->control = cpu_to_le16(DESCRIPTOR_STATUS | DESCRIPTOR_INPUT_MORE); diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig index 39b393d38bb3..012cf1f7b8db 100644 --- a/drivers/gpu/drm/Kconfig +++ b/drivers/gpu/drm/Kconfig @@ -82,6 +82,7 @@ config DRM_I830 config DRM_I915 tristate "i915 driver" depends on AGP_INTEL + select SHMEM select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 7f2728bbc16c..55fb98d179ef 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -333,6 +333,12 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev, mode->vsync_end = mode->vsync_start + vsync_pulse_width; mode->vtotal = mode->vdisplay + vblank; + /* Some EDIDs have bogus h/vtotal values */ + if (mode->hsync_end > mode->htotal) + mode->htotal = mode->hsync_end + 1; + if (mode->vsync_end > mode->vtotal) + mode->vtotal = mode->vsync_end + 1; + drm_mode_set_name(mode); if (pt->misc & DRM_EDID_PT_INTERLACED) diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index f85aaf21e783..f298434e87c7 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c @@ -402,15 +402,21 @@ int drm_vblank_get(struct drm_device *dev, int crtc) spin_lock_irqsave(&dev->vbl_lock, irqflags); /* Going from 0->1 means we have to enable interrupts again */ - if (atomic_add_return(1, &dev->vblank_refcount[crtc]) == 1 && - !dev->vblank_enabled[crtc]) { - ret = dev->driver->enable_vblank(dev, crtc); - DRM_DEBUG("enabling vblank on crtc %d, ret: %d\n", crtc, ret); - if (ret) + if (atomic_add_return(1, &dev->vblank_refcount[crtc]) == 1) { + if (!dev->vblank_enabled[crtc]) { + ret = dev->driver->enable_vblank(dev, crtc); + DRM_DEBUG("enabling vblank on crtc %d, ret: %d\n", crtc, ret); + if (ret) + atomic_dec(&dev->vblank_refcount[crtc]); + else { + dev->vblank_enabled[crtc] = 1; + drm_update_vblank_count(dev, crtc); + } + } + } else { + if (!dev->vblank_enabled[crtc]) { atomic_dec(&dev->vblank_refcount[crtc]); - else { - dev->vblank_enabled[crtc] = 1; - drm_update_vblank_count(dev, crtc); + ret = -EINVAL; } } spin_unlock_irqrestore(&dev->vbl_lock, irqflags); @@ -437,6 +443,18 @@ void drm_vblank_put(struct drm_device *dev, int crtc) } EXPORT_SYMBOL(drm_vblank_put); +void drm_vblank_off(struct drm_device *dev, int crtc) +{ + unsigned long irqflags; + + spin_lock_irqsave(&dev->vbl_lock, irqflags); + DRM_WAKEUP(&dev->vbl_queue[crtc]); + dev->vblank_enabled[crtc] = 0; + dev->last_vblank[crtc] = dev->driver->get_vblank_counter(dev, crtc); + spin_unlock_irqrestore(&dev->vbl_lock, irqflags); +} +EXPORT_SYMBOL(drm_vblank_off); + /** * drm_vblank_pre_modeset - account for vblanks across mode sets * @dev: DRM device diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index fc4b68aa2d05..c078d995aa91 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -94,8 +94,6 @@ static int i915_resume(struct drm_device *dev) struct drm_i915_private *dev_priv = dev->dev_private; int ret = 0; - pci_set_power_state(dev->pdev, PCI_D0); - pci_restore_state(dev->pdev); if (pci_enable_device(dev->pdev)) return -1; pci_set_master(dev->pdev); diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 5b4f87e55621..d3f365d8b6ef 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -264,6 +264,7 @@ typedef struct drm_i915_private { u32 saveDSPASURF; u32 saveDSPATILEOFF; u32 savePFIT_PGM_RATIOS; + u32 saveBLC_HIST_CTL; u32 saveBLC_PWM_CTL; u32 saveBLC_PWM_CTL2; u32 saveFPB0; @@ -837,6 +838,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller); #define IS_I85X(dev) ((dev)->pci_device == 0x3582) #define IS_I855(dev) ((dev)->pci_device == 0x3582) #define IS_I865G(dev) ((dev)->pci_device == 0x2572) +#define IS_I8XX(dev) (IS_I830(dev) || IS_845G(dev) || IS_I85X(dev) || IS_I865G(dev)) #define IS_I915G(dev) ((dev)->pci_device == 0x2582 || (dev)->pci_device == 0x258a) #define IS_I915GM(dev) ((dev)->pci_device == 0x2592) @@ -854,6 +856,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller); (dev)->pci_device == 0x2E12 || \ (dev)->pci_device == 0x2E22 || \ (dev)->pci_device == 0x2E32 || \ + (dev)->pci_device == 0x2E42 || \ (dev)->pci_device == 0x0042 || \ (dev)->pci_device == 0x0046) @@ -866,6 +869,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller); (dev)->pci_device == 0x2E12 || \ (dev)->pci_device == 0x2E22 || \ (dev)->pci_device == 0x2E32 || \ + (dev)->pci_device == 0x2E42 || \ IS_GM45(dev)) #define IS_IGDG(dev) ((dev)->pci_device == 0xa001) @@ -896,9 +900,12 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller); */ #define HAS_128_BYTE_Y_TILING(dev) (IS_I9XX(dev) && !(IS_I915G(dev) || \ IS_I915GM(dev))) +#define SUPPORTS_DIGITAL_OUTPUTS(dev) (IS_I9XX(dev) && !IS_IGD(dev)) #define SUPPORTS_INTEGRATED_HDMI(dev) (IS_G4X(dev) || IS_IGDNG(dev)) #define SUPPORTS_INTEGRATED_DP(dev) (IS_G4X(dev) || IS_IGDNG(dev)) #define SUPPORTS_EDP(dev) (IS_IGDNG_M(dev)) +#define SUPPORTS_TV(dev) (IS_I9XX(dev) && IS_MOBILE(dev) && \ + !IS_IGDNG(dev) && !IS_IGD(dev)) #define I915_HAS_HOTPLUG(dev) (IS_I945G(dev) || IS_I945GM(dev) || IS_I965G(dev)) /* dsparb controlled by hw only */ #define DSPARB_HWCONTROL(dev) (IS_G4X(dev) || IS_IGDNG(dev)) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 80e5ba490dc2..2b7aeeed3990 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1151,27 +1151,21 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) mutex_lock(&dev->struct_mutex); if (!obj_priv->gtt_space) { ret = i915_gem_object_bind_to_gtt(obj, obj_priv->gtt_alignment); - if (ret) { - mutex_unlock(&dev->struct_mutex); - return VM_FAULT_SIGBUS; - } - - ret = i915_gem_object_set_to_gtt_domain(obj, write); - if (ret) { - mutex_unlock(&dev->struct_mutex); - return VM_FAULT_SIGBUS; - } + if (ret) + goto unlock; list_add_tail(&obj_priv->list, &dev_priv->mm.inactive_list); + + ret = i915_gem_object_set_to_gtt_domain(obj, write); + if (ret) + goto unlock; } /* Need a new fence register? */ if (obj_priv->tiling_mode != I915_TILING_NONE) { ret = i915_gem_object_get_fence_reg(obj); - if (ret) { - mutex_unlock(&dev->struct_mutex); - return VM_FAULT_SIGBUS; - } + if (ret) + goto unlock; } pfn = ((dev->agp->base + obj_priv->gtt_offset) >> PAGE_SHIFT) + @@ -1179,18 +1173,18 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) /* Finally, remap it using the new GTT offset */ ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn); - +unlock: mutex_unlock(&dev->struct_mutex); switch (ret) { + case 0: + case -ERESTARTSYS: + return VM_FAULT_NOPAGE; case -ENOMEM: case -EAGAIN: return VM_FAULT_OOM; - case -EFAULT: - case -EINVAL: - return VM_FAULT_SIGBUS; default: - return VM_FAULT_NOPAGE; + return VM_FAULT_SIGBUS; } } @@ -2506,16 +2500,6 @@ i915_gem_clflush_object(struct drm_gem_object *obj) if (obj_priv->pages == NULL) return; - /* XXX: The 865 in particular appears to be weird in how it handles - * cache flushing. We haven't figured it out, but the - * clflush+agp_chipset_flush doesn't appear to successfully get the - * data visible to the PGU, while wbinvd + agp_chipset_flush does. - */ - if (IS_I865G(obj->dev)) { - wbinvd(); - return; - } - drm_clflush_pages(obj_priv->pages, obj->size / PAGE_SIZE); } @@ -3007,6 +2991,16 @@ i915_gem_object_pin_and_relocate(struct drm_gem_object *obj, return -EINVAL; } + if (reloc->delta >= target_obj->size) { + DRM_ERROR("Relocation beyond target object bounds: " + "obj %p target %d delta %d size %d.\n", + obj, reloc->target_handle, + (int) reloc->delta, (int) target_obj->size); + drm_gem_object_unreference(target_obj); + i915_gem_object_unpin(obj); + return -EINVAL; + } + if (reloc->write_domain & I915_GEM_DOMAIN_CPU || reloc->read_domains & I915_GEM_DOMAIN_CPU) { DRM_ERROR("reloc with read/write CPU domains: " @@ -3837,7 +3831,8 @@ void i915_gem_free_object(struct drm_gem_object *obj) i915_gem_object_unbind(obj); - i915_gem_free_mmap_offset(obj); + if (obj_priv->mmap_offset) + i915_gem_free_mmap_offset(obj); kfree(obj_priv->page_cpu_valid); kfree(obj_priv->bit_17); diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c index a2d527b22ec4..e774a4a1a503 100644 --- a/drivers/gpu/drm/i915/i915_gem_tiling.c +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c @@ -234,7 +234,13 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev) uint32_t swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN; bool need_disable; - if (!IS_I9XX(dev)) { + if (IS_IGDNG(dev)) { + /* On IGDNG whatever DRAM config, GPU always do + * same swizzling setup. + */ + swizzle_x = I915_BIT_6_SWIZZLE_9_10; + swizzle_y = I915_BIT_6_SWIZZLE_9; + } else if (!IS_I9XX(dev)) { /* As far as we know, the 865 doesn't have these bit 6 * swizzling issues. */ @@ -317,13 +323,6 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev) } } - /* FIXME: check with memory config on IGDNG */ - if (IS_IGDNG(dev)) { - DRM_ERROR("disable tiling on IGDNG...\n"); - swizzle_x = I915_BIT_6_SWIZZLE_UNKNOWN; - swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN; - } - dev_priv->mm.bit_6_swizzle_x = swizzle_x; dev_priv->mm.bit_6_swizzle_y = swizzle_y; } diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 7ebc84c2881e..9431a727a985 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c @@ -253,10 +253,15 @@ irqreturn_t igdng_irq_handler(struct drm_device *dev) { drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; int ret = IRQ_NONE; - u32 de_iir, gt_iir; + u32 de_iir, gt_iir, de_ier; u32 new_de_iir, new_gt_iir; struct drm_i915_master_private *master_priv; + /* disable master interrupt before clearing iir */ + de_ier = I915_READ(DEIER); + I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL); + (void)I915_READ(DEIER); + de_iir = I915_READ(DEIIR); gt_iir = I915_READ(GTIIR); @@ -287,6 +292,9 @@ irqreturn_t igdng_irq_handler(struct drm_device *dev) gt_iir = new_gt_iir; } + I915_WRITE(DEIER, de_ier); + (void)I915_READ(DEIER); + return ret; } diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 2955083aa471..9917749afb32 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h @@ -915,6 +915,8 @@ #define BACKLIGHT_DUTY_CYCLE_SHIFT (0) #define BACKLIGHT_DUTY_CYCLE_MASK (0xffff) +#define BLC_HIST_CTL 0x61260 + /* TV port control */ #define TV_CTL 0x68000 /** Enables the TV encoder */ @@ -1616,6 +1618,11 @@ #define PIPE_START_VBLANK_INTERRUPT_STATUS (1UL<<2) /* 965 or later */ #define PIPE_VBLANK_INTERRUPT_STATUS (1UL<<1) #define PIPE_OVERLAY_UPDATED_STATUS (1UL<<0) +#define PIPE_BPC_MASK (7 << 5) /* Ironlake */ +#define PIPE_8BPC (0 << 5) +#define PIPE_10BPC (1 << 5) +#define PIPE_6BPC (2 << 5) +#define PIPE_12BPC (3 << 5) #define DSPARB 0x70030 #define DSPARB_CSTART_MASK (0x7f << 7) @@ -1733,6 +1740,7 @@ #define DISPPLANE_NO_LINE_DOUBLE 0 #define DISPPLANE_STEREO_POLARITY_FIRST 0 #define DISPPLANE_STEREO_POLARITY_SECOND (1<<18) +#define DISPPLANE_TRICKLE_FEED_DISABLE (1<<14) /* IGDNG */ #define DISPPLANE_TILED (1<<10) #define DSPAADDR 0x70184 #define DSPASTRIDE 0x70188 @@ -1865,8 +1873,15 @@ #define PFA_CTL_1 0x68080 #define PFB_CTL_1 0x68880 #define PF_ENABLE (1<<31) +#define PF_FILTER_MASK (3<<23) +#define PF_FILTER_PROGRAMMED (0<<23) +#define PF_FILTER_MED_3x3 (1<<23) +#define PF_FILTER_EDGE_ENHANCE (2<<23) +#define PF_FILTER_EDGE_SOFTEN (3<<23) #define PFA_WIN_SZ 0x68074 #define PFB_WIN_SZ 0x68874 +#define PFA_WIN_POS 0x68070 +#define PFB_WIN_POS 0x68870 /* legacy palette */ #define LGC_PALETTE_A 0x4a000 @@ -1913,6 +1928,9 @@ #define GTIIR 0x44018 #define GTIER 0x4401c +#define DISP_ARB_CTL 0x45000 +#define DISP_TILE_SURFACE_SWIZZLING (1<<13) + /* PCH */ /* south display engine interrupt */ @@ -1979,11 +1997,11 @@ #define DREF_CPU_SOURCE_OUTPUT_MASK (3<<13) #define DREF_SSC_SOURCE_DISABLE (0<<11) #define DREF_SSC_SOURCE_ENABLE (2<<11) -#define DREF_SSC_SOURCE_MASK (2<<11) +#define DREF_SSC_SOURCE_MASK (3<<11) #define DREF_NONSPREAD_SOURCE_DISABLE (0<<9) #define DREF_NONSPREAD_CK505_ENABLE (1<<9) #define DREF_NONSPREAD_SOURCE_ENABLE (2<<9) -#define DREF_NONSPREAD_SOURCE_MASK (2<<9) +#define DREF_NONSPREAD_SOURCE_MASK (3<<9) #define DREF_SUPERSPREAD_SOURCE_DISABLE (0<<7) #define DREF_SUPERSPREAD_SOURCE_ENABLE (2<<7) #define DREF_SSC4_DOWNSPREAD (0<<6) diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index 1d04e1904ac6..2e4aca658b8b 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c @@ -416,6 +416,7 @@ int i915_save_state(struct drm_device *dev) dev_priv->savePP_CONTROL = I915_READ(PP_CONTROL); dev_priv->savePFIT_PGM_RATIOS = I915_READ(PFIT_PGM_RATIOS); dev_priv->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL); + dev_priv->saveBLC_HIST_CTL = I915_READ(BLC_HIST_CTL); if (IS_I965G(dev)) dev_priv->saveBLC_PWM_CTL2 = I915_READ(BLC_PWM_CTL2); if (IS_MOBILE(dev) && !IS_I830(dev)) @@ -560,6 +561,7 @@ int i915_restore_state(struct drm_device *dev) I915_WRITE(PFIT_PGM_RATIOS, dev_priv->savePFIT_PGM_RATIOS); I915_WRITE(BLC_PWM_CTL, dev_priv->saveBLC_PWM_CTL); + I915_WRITE(BLC_HIST_CTL, dev_priv->saveBLC_HIST_CTL); I915_WRITE(PP_ON_DELAYS, dev_priv->savePP_ON_DELAYS); I915_WRITE(PP_OFF_DELAYS, dev_priv->savePP_OFF_DELAYS); I915_WRITE(PP_DIVISOR, dev_priv->savePP_DIVISOR); diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index f806fcc54e09..698a0edf0ea9 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c @@ -217,6 +217,9 @@ parse_general_features(struct drm_i915_private *dev_priv, if (IS_I85X(dev_priv->dev)) dev_priv->lvds_ssc_freq = general->ssc_freq ? 66 : 48; + else if (IS_IGDNG(dev_priv->dev)) + dev_priv->lvds_ssc_freq = + general->ssc_freq ? 100 : 120; else dev_priv->lvds_ssc_freq = general->ssc_freq ? 100 : 96; diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index 590f81c8f594..046027fa9731 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c @@ -151,13 +151,10 @@ static bool intel_igdng_crt_detect_hotplug(struct drm_connector *connector) { struct drm_device *dev = connector->dev; struct drm_i915_private *dev_priv = dev->dev_private; - u32 adpa, temp; + u32 adpa; bool ret; - temp = adpa = I915_READ(PCH_ADPA); - - adpa &= ~ADPA_DAC_ENABLE; - I915_WRITE(PCH_ADPA, adpa); + adpa = I915_READ(PCH_ADPA); adpa &= ~ADPA_CRT_HOTPLUG_MASK; @@ -184,8 +181,6 @@ static bool intel_igdng_crt_detect_hotplug(struct drm_connector *connector) else ret = false; - /* restore origin register */ - I915_WRITE(PCH_ADPA, temp); return ret; } @@ -239,8 +234,8 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector) } while (time_after(timeout, jiffies)); } - if ((I915_READ(PORT_HOTPLUG_STAT) & CRT_HOTPLUG_MONITOR_MASK) == - CRT_HOTPLUG_MONITOR_COLOR) + if ((I915_READ(PORT_HOTPLUG_STAT) & CRT_HOTPLUG_MONITOR_MASK) != + CRT_HOTPLUG_MONITOR_NONE) return true; return false; diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 748ed50c55ca..3ac3b7c49869 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -818,7 +818,7 @@ intel_igdng_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, refclk, best_clock); if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { - if ((I915_READ(LVDS) & LVDS_CLKB_POWER_MASK) == + if ((I915_READ(PCH_LVDS) & LVDS_CLKB_POWER_MASK) == LVDS_CLKB_POWER_UP) clock.p2 = limit->p2.p2_fast; else @@ -1008,6 +1008,10 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y, dspcntr &= ~DISPPLANE_TILED; } + if (IS_IGDNG(dev)) + /* must disable */ + dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE; + I915_WRITE(dspcntr_reg, dspcntr); Start = obj_priv->gtt_offset; @@ -1154,6 +1158,7 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) int transconf_reg = (pipe == 0) ? TRANSACONF : TRANSBCONF; int pf_ctl_reg = (pipe == 0) ? PFA_CTL_1 : PFB_CTL_1; int pf_win_size = (pipe == 0) ? PFA_WIN_SZ : PFB_WIN_SZ; + int pf_win_pos = (pipe == 0) ? PFA_WIN_POS : PFB_WIN_POS; int cpu_htot_reg = (pipe == 0) ? HTOTAL_A : HTOTAL_B; int cpu_hblank_reg = (pipe == 0) ? HBLANK_A : HBLANK_B; int cpu_hsync_reg = (pipe == 0) ? HSYNC_A : HSYNC_B; @@ -1177,6 +1182,15 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) case DRM_MODE_DPMS_STANDBY: case DRM_MODE_DPMS_SUSPEND: DRM_DEBUG("crtc %d dpms on\n", pipe); + + if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { + temp = I915_READ(PCH_LVDS); + if ((temp & LVDS_PORT_EN) == 0) { + I915_WRITE(PCH_LVDS, temp | LVDS_PORT_EN); + POSTING_READ(PCH_LVDS); + } + } + if (HAS_eDP) { /* enable eDP PLL */ igdng_enable_pll_edp(crtc); @@ -1205,6 +1219,19 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) } } + /* Enable panel fitting for LVDS */ + if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { + temp = I915_READ(pf_ctl_reg); + I915_WRITE(pf_ctl_reg, temp | PF_ENABLE | PF_FILTER_MED_3x3); + + /* currently full aspect */ + I915_WRITE(pf_win_pos, 0); + + I915_WRITE(pf_win_size, + (dev_priv->panel_fixed_mode->hdisplay << 16) | + (dev_priv->panel_fixed_mode->vdisplay)); + } + /* Enable CPU pipe */ temp = I915_READ(pipeconf_reg); if ((temp & PIPEACONF_ENABLE) == 0) { @@ -1348,8 +1375,6 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) case DRM_MODE_DPMS_OFF: DRM_DEBUG("crtc %d dpms off\n", pipe); - i915_disable_vga(dev); - /* Disable display plane */ temp = I915_READ(dspcntr_reg); if ((temp & DISPLAY_PLANE_ENABLE) != 0) { @@ -1359,6 +1384,8 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) I915_READ(dspbase_reg); } + i915_disable_vga(dev); + /* disable cpu pipe, disable after all planes disabled */ temp = I915_READ(pipeconf_reg); if ((temp & PIPEACONF_ENABLE) != 0) { @@ -1379,9 +1406,15 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) } else DRM_DEBUG("crtc %d is disabled\n", pipe); - if (HAS_eDP) { - igdng_disable_pll_edp(crtc); + udelay(100); + + /* Disable PF */ + temp = I915_READ(pf_ctl_reg); + if ((temp & PF_ENABLE) != 0) { + I915_WRITE(pf_ctl_reg, temp & ~PF_ENABLE); + I915_READ(pf_ctl_reg); } + I915_WRITE(pf_win_size, 0); /* disable CPU FDI tx and PCH FDI rx */ temp = I915_READ(fdi_tx_reg); @@ -1407,6 +1440,13 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) udelay(100); + if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { + temp = I915_READ(PCH_LVDS); + I915_WRITE(PCH_LVDS, temp & ~LVDS_PORT_EN); + I915_READ(PCH_LVDS); + udelay(100); + } + /* disable PCH transcoder */ temp = I915_READ(transconf_reg); if ((temp & TRANS_ENABLE) != 0) { @@ -1426,6 +1466,8 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) } } + udelay(100); + /* disable PCH DPLL */ temp = I915_READ(pch_dpll_reg); if ((temp & DPLL_VCO_ENABLE) != 0) { @@ -1433,14 +1475,20 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) I915_READ(pch_dpll_reg); } - temp = I915_READ(fdi_rx_reg); - if ((temp & FDI_RX_PLL_ENABLE) != 0) { - temp &= ~FDI_SEL_PCDCLK; - temp &= ~FDI_RX_PLL_ENABLE; - I915_WRITE(fdi_rx_reg, temp); - I915_READ(fdi_rx_reg); + if (HAS_eDP) { + igdng_disable_pll_edp(crtc); } + temp = I915_READ(fdi_rx_reg); + temp &= ~FDI_SEL_PCDCLK; + I915_WRITE(fdi_rx_reg, temp); + I915_READ(fdi_rx_reg); + + temp = I915_READ(fdi_rx_reg); + temp &= ~FDI_RX_PLL_ENABLE; + I915_WRITE(fdi_rx_reg, temp); + I915_READ(fdi_rx_reg); + /* Disable CPU FDI TX PLL */ temp = I915_READ(fdi_tx_reg); if ((temp & FDI_TX_PLL_ENABLE) != 0) { @@ -1449,16 +1497,8 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) udelay(100); } - /* Disable PF */ - temp = I915_READ(pf_ctl_reg); - if ((temp & PF_ENABLE) != 0) { - I915_WRITE(pf_ctl_reg, temp & ~PF_ENABLE); - I915_READ(pf_ctl_reg); - } - I915_WRITE(pf_win_size, 0); - /* Wait for the clocks to turn off. */ - udelay(150); + udelay(100); break; } } @@ -1522,6 +1562,7 @@ static void i9xx_crtc_dpms(struct drm_crtc *crtc, int mode) intel_update_watermarks(dev); /* Give the overlay scaler a chance to disable if it's on this pipe */ //intel_crtc_dpms_video(crtc, FALSE); TODO + drm_vblank_off(dev, pipe); /* Disable the VGA plane that we never use */ i915_disable_vga(dev); @@ -1746,7 +1787,7 @@ fdi_reduce_ratio(u32 *num, u32 *den) #define LINK_N 0x80000 static void -igdng_compute_m_n(int bytes_per_pixel, int nlanes, +igdng_compute_m_n(int bits_per_pixel, int nlanes, int pixel_clock, int link_clock, struct fdi_m_n *m_n) { @@ -1756,7 +1797,8 @@ igdng_compute_m_n(int bytes_per_pixel, int nlanes, temp = (u64) DATA_N * pixel_clock; temp = div_u64(temp, link_clock); - m_n->gmch_m = div_u64(temp * bytes_per_pixel, nlanes); + m_n->gmch_m = div_u64(temp * bits_per_pixel, nlanes); + m_n->gmch_m >>= 3; /* convert to bytes_per_pixel */ m_n->gmch_n = DATA_N; fdi_reduce_ratio(&m_n->gmch_m, &m_n->gmch_n); @@ -1858,7 +1900,14 @@ static unsigned long intel_calculate_wm(unsigned long clock_in_khz, { long entries_required, wm_size; - entries_required = (clock_in_khz * pixel_size * latency_ns) / 1000000; + /* + * Note: we need to make sure we don't overflow for various clock & + * latency values. + * clocks go from a few thousand to several hundred thousand. + * latency is usually a few thousand + */ + entries_required = ((clock_in_khz / 1000) * pixel_size * latency_ns) / + 1000; entries_required /= wm->cacheline_size; DRM_DEBUG("FIFO entries required for mode: %d\n", entries_required); @@ -2371,7 +2420,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, /* FDI link */ if (IS_IGDNG(dev)) { - int lane, link_bw; + int lane, link_bw, bpp; /* eDP doesn't require FDI link, so just set DP M/N according to current link config */ if (is_edp) { @@ -2390,10 +2439,72 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, lane = 4; link_bw = 270000; } - igdng_compute_m_n(3, lane, target_clock, + + /* determine panel color depth */ + temp = I915_READ(pipeconf_reg); + + switch (temp & PIPE_BPC_MASK) { + case PIPE_8BPC: + bpp = 24; + break; + case PIPE_10BPC: + bpp = 30; + break; + case PIPE_6BPC: + bpp = 18; + break; + case PIPE_12BPC: + bpp = 36; + break; + default: + DRM_ERROR("unknown pipe bpc value\n"); + bpp = 24; + } + + igdng_compute_m_n(bpp, lane, target_clock, link_bw, &m_n); } + /* Ironlake: try to setup display ref clock before DPLL + * enabling. This is only under driver's control after + * PCH B stepping, previous chipset stepping should be + * ignoring this setting. + */ + if (IS_IGDNG(dev)) { + temp = I915_READ(PCH_DREF_CONTROL); + /* Always enable nonspread source */ + temp &= ~DREF_NONSPREAD_SOURCE_MASK; + temp |= DREF_NONSPREAD_SOURCE_ENABLE; + I915_WRITE(PCH_DREF_CONTROL, temp); + POSTING_READ(PCH_DREF_CONTROL); + + temp &= ~DREF_SSC_SOURCE_MASK; + temp |= DREF_SSC_SOURCE_ENABLE; + I915_WRITE(PCH_DREF_CONTROL, temp); + POSTING_READ(PCH_DREF_CONTROL); + + udelay(200); + + if (is_edp) { + if (dev_priv->lvds_use_ssc) { + temp |= DREF_SSC1_ENABLE; + I915_WRITE(PCH_DREF_CONTROL, temp); + POSTING_READ(PCH_DREF_CONTROL); + + udelay(200); + + temp &= ~DREF_CPU_SOURCE_OUTPUT_MASK; + temp |= DREF_CPU_SOURCE_OUTPUT_DOWNSPREAD; + I915_WRITE(PCH_DREF_CONTROL, temp); + POSTING_READ(PCH_DREF_CONTROL); + } else { + temp |= DREF_CPU_SOURCE_OUTPUT_NONSPREAD; + I915_WRITE(PCH_DREF_CONTROL, temp); + POSTING_READ(PCH_DREF_CONTROL); + } + } + } + if (IS_IGD(dev)) fp = (1 << clock.n) << 16 | clock.m1 << 8 | clock.m2; else @@ -2616,6 +2727,12 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, intel_wait_for_vblank(dev); + if (IS_IGDNG(dev)) { + /* enable address swizzle for tiling buffer */ + temp = I915_READ(DISP_ARB_CTL); + I915_WRITE(DISP_ARB_CTL, temp | DISP_TILE_SURFACE_SWIZZLING); + } + I915_WRITE(dspcntr_reg, dspcntr); /* Flush the plane changes */ @@ -3231,7 +3348,7 @@ static void intel_setup_outputs(struct drm_device *dev) if (I915_READ(PCH_DP_D) & DP_DETECTED) intel_dp_init(dev, PCH_DP_D); - } else if (IS_I9XX(dev)) { + } else if (SUPPORTS_DIGITAL_OUTPUTS(dev)) { bool found = false; if (I915_READ(SDVOB) & SDVO_DETECTED) { @@ -3258,10 +3375,10 @@ static void intel_setup_outputs(struct drm_device *dev) if (SUPPORTS_INTEGRATED_DP(dev) && (I915_READ(DP_D) & DP_DETECTED)) intel_dp_init(dev, DP_D); - } else + } else if (IS_I8XX(dev)) intel_dvo_init(dev); - if (IS_I9XX(dev) && IS_MOBILE(dev) && !IS_IGDNG(dev)) + if (SUPPORTS_TV(dev)) intel_tv_init(dev); list_for_each_entry(connector, &dev->mode_config.connector_list, head) { diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c index 1d30802e773e..75a9b83fd7d3 100644 --- a/drivers/gpu/drm/i915/intel_fb.c +++ b/drivers/gpu/drm/i915/intel_fb.c @@ -114,7 +114,7 @@ static int intelfb_check_var(struct fb_var_screeninfo *var, struct drm_framebuffer *fb = &intel_fb->base; int depth; - if (var->pixclock == -1 || !var->pixclock) + if (var->pixclock != 0) return -EINVAL; /* Need to resize the fb object !!! */ @@ -205,7 +205,7 @@ static int intelfb_set_par(struct fb_info *info) DRM_DEBUG("%d %d\n", var->xres, var->pixclock); - if (var->pixclock != -1) { + if (var->pixclock != 0) { DRM_ERROR("PIXEL CLOCK SET\n"); return -EINVAL; @@ -692,7 +692,7 @@ static int intelfb_multi_fb_probe_crtc(struct drm_device *dev, struct drm_crtc * par->crtc_count = 1; if (new_fb) { - info->var.pixclock = -1; + info->var.pixclock = 0; if (register_framebuffer(info) < 0) return -EINVAL; } else @@ -846,7 +846,7 @@ static int intelfb_single_fb_probe(struct drm_device *dev) par->crtc_count = crtc_count; if (new_fb) { - info->var.pixclock = -1; + info->var.pixclock = 0; if (register_framebuffer(info) < 0) return -EINVAL; } else diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 8df02ef89261..b7d091ba8c5c 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c @@ -305,6 +305,10 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder, goto out; } + /* full screen scale for now */ + if (IS_IGDNG(dev)) + goto out; + /* 965+ wants fuzzy fitting */ if (IS_I965G(dev)) pfit_control |= (intel_crtc->pipe << PFIT_PIPE_SHIFT) | @@ -332,8 +336,10 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder, * to register description and PRM. * Change the value here to see the borders for debugging */ - I915_WRITE(BCLRPAT_A, 0); - I915_WRITE(BCLRPAT_B, 0); + if (!IS_IGDNG(dev)) { + I915_WRITE(BCLRPAT_A, 0); + I915_WRITE(BCLRPAT_B, 0); + } switch (lvds_priv->fitting_mode) { case DRM_MODE_SCALE_NO_SCALE: @@ -582,7 +588,6 @@ static void intel_lvds_mode_set(struct drm_encoder *encoder, * settings. */ - /* No panel fitting yet, fixme */ if (IS_IGDNG(dev)) return; diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index d3b74ba62b4a..66dc1a54cbf6 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c @@ -114,6 +114,9 @@ struct intel_sdvo_priv { /* DDC bus used by this SDVO output */ uint8_t ddc_bus; + /* Mac mini hack -- use the same DDC as the analog connector */ + struct i2c_adapter *analog_ddc_bus; + int save_sdvo_mult; u16 save_active_outputs; struct intel_sdvo_dtd save_input_dtd_1, save_input_dtd_2; @@ -1478,6 +1481,36 @@ intel_sdvo_multifunc_encoder(struct intel_output *intel_output) return (caps > 1); } +static struct drm_connector * +intel_find_analog_connector(struct drm_device *dev) +{ + struct drm_connector *connector; + struct intel_output *intel_output; + + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + intel_output = to_intel_output(connector); + if (intel_output->type == INTEL_OUTPUT_ANALOG) + return connector; + } + return NULL; +} + +static int +intel_analog_is_connected(struct drm_device *dev) +{ + struct drm_connector *analog_connector; + analog_connector = intel_find_analog_connector(dev); + + if (!analog_connector) + return false; + + if (analog_connector->funcs->detect(analog_connector) == + connector_status_disconnected) + return false; + + return true; +} + enum drm_connector_status intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response) { @@ -1488,6 +1521,15 @@ intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response) edid = drm_get_edid(&intel_output->base, intel_output->ddc_bus); + + /* when there is no edid and no monitor is connected with VGA + * port, try to use the CRT ddc to read the EDID for DVI-connector + */ + if (edid == NULL && + sdvo_priv->analog_ddc_bus && + !intel_analog_is_connected(intel_output->base.dev)) + edid = drm_get_edid(&intel_output->base, + sdvo_priv->analog_ddc_bus); if (edid != NULL) { /* Don't report the output as connected if it's a DVI-I * connector with a non-digital EDID coming out. @@ -1540,31 +1582,32 @@ static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connect static void intel_sdvo_get_ddc_modes(struct drm_connector *connector) { struct intel_output *intel_output = to_intel_output(connector); + struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; + int num_modes; /* set the bus switch and get the modes */ - intel_ddc_get_modes(intel_output); + num_modes = intel_ddc_get_modes(intel_output); -#if 0 - struct drm_device *dev = encoder->dev; - struct drm_i915_private *dev_priv = dev->dev_private; - /* Mac mini hack. On this device, I get DDC through the analog, which - * load-detects as disconnected. I fail to DDC through the SDVO DDC, - * but it does load-detect as connected. So, just steal the DDC bits - * from analog when we fail at finding it the right way. + /* + * Mac mini hack. On this device, the DVI-I connector shares one DDC + * link between analog and digital outputs. So, if the regular SDVO + * DDC fails, check to see if the analog output is disconnected, in + * which case we'll look there for the digital DDC data. */ - crt = xf86_config->output[0]; - intel_output = crt->driver_private; - if (intel_output->type == I830_OUTPUT_ANALOG && - crt->funcs->detect(crt) == XF86OutputStatusDisconnected) { - I830I2CInit(pScrn, &intel_output->pDDCBus, GPIOA, "CRTDDC_A"); - edid_mon = xf86OutputGetEDID(crt, intel_output->pDDCBus); - xf86DestroyI2CBusRec(intel_output->pDDCBus, true, true); - } - if (edid_mon) { - xf86OutputSetEDID(output, edid_mon); - modes = xf86OutputGetEDIDModes(output); + if (num_modes == 0 && + sdvo_priv->analog_ddc_bus && + !intel_analog_is_connected(intel_output->base.dev)) { + struct i2c_adapter *digital_ddc_bus; + + /* Switch to the analog ddc bus and try that + */ + digital_ddc_bus = intel_output->ddc_bus; + intel_output->ddc_bus = sdvo_priv->analog_ddc_bus; + + (void) intel_ddc_get_modes(intel_output); + + intel_output->ddc_bus = digital_ddc_bus; } -#endif } /** @@ -1748,6 +1791,8 @@ static void intel_sdvo_destroy(struct drm_connector *connector) intel_i2c_destroy(intel_output->i2c_bus); if (intel_output->ddc_bus) intel_i2c_destroy(intel_output->ddc_bus); + if (sdvo_priv->analog_ddc_bus) + intel_i2c_destroy(sdvo_priv->analog_ddc_bus); if (sdvo_priv->sdvo_lvds_fixed_mode != NULL) drm_mode_destroy(connector->dev, @@ -2074,10 +2119,15 @@ bool intel_sdvo_init(struct drm_device *dev, int output_device) } /* setup the DDC bus. */ - if (output_device == SDVOB) + if (output_device == SDVOB) { intel_output->ddc_bus = intel_i2c_create(dev, GPIOE, "SDVOB DDC BUS"); - else + sdvo_priv->analog_ddc_bus = intel_i2c_create(dev, GPIOA, + "SDVOB/VGA DDC BUS"); + } else { intel_output->ddc_bus = intel_i2c_create(dev, GPIOE, "SDVOC DDC BUS"); + sdvo_priv->analog_ddc_bus = intel_i2c_create(dev, GPIOA, + "SDVOC/VGA DDC BUS"); + } if (intel_output->ddc_bus == NULL) goto err_i2c; @@ -2143,6 +2193,8 @@ bool intel_sdvo_init(struct drm_device *dev, int output_device) return true; err_i2c: + if (sdvo_priv->analog_ddc_bus != NULL) + intel_i2c_destroy(sdvo_priv->analog_ddc_bus); if (intel_output->ddc_bus != NULL) intel_i2c_destroy(intel_output->ddc_bus); if (intel_output->i2c_bus != NULL) diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c index 5b1c9e9fdba0..05f6fe40f2e3 100644 --- a/drivers/gpu/drm/i915/intel_tv.c +++ b/drivers/gpu/drm/i915/intel_tv.c @@ -1212,20 +1212,17 @@ intel_tv_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, tv_ctl |= TV_TRILEVEL_SYNC; if (tv_mode->pal_burst) tv_ctl |= TV_PAL_BURST; + scctl1 = 0; - /* dda1 implies valid video levels */ - if (tv_mode->dda1_inc) { + if (tv_mode->dda1_inc) scctl1 |= TV_SC_DDA1_EN; - } - if (tv_mode->dda2_inc) scctl1 |= TV_SC_DDA2_EN; - if (tv_mode->dda3_inc) scctl1 |= TV_SC_DDA3_EN; - scctl1 |= tv_mode->sc_reset; - scctl1 |= video_levels->burst << TV_BURST_LEVEL_SHIFT; + if (video_levels) + scctl1 |= video_levels->burst << TV_BURST_LEVEL_SHIFT; scctl1 |= tv_mode->dda1_inc << TV_SCDDA1_INC_SHIFT; scctl2 = tv_mode->dda2_size << TV_SCDDA2_SIZE_SHIFT | diff --git a/drivers/gpu/drm/r128/r128_cce.c b/drivers/gpu/drm/r128/r128_cce.c index c75fd3564040..ebf9f63e5d49 100644 --- a/drivers/gpu/drm/r128/r128_cce.c +++ b/drivers/gpu/drm/r128/r128_cce.c @@ -353,6 +353,11 @@ static int r128_do_init_cce(struct drm_device * dev, drm_r128_init_t * init) DRM_DEBUG("\n"); + if (dev->dev_private) { + DRM_DEBUG("called when already initialized\n"); + return -EINVAL; + } + dev_priv = kzalloc(sizeof(drm_r128_private_t), GFP_KERNEL); if (dev_priv == NULL) return -ENOMEM; @@ -649,6 +654,8 @@ int r128_cce_start(struct drm_device *dev, void *data, struct drm_file *file_pri LOCK_TEST_WITH_RETURN(dev, file_priv); + DEV_INIT_TEST_WITH_RETURN(dev_priv); + if (dev_priv->cce_running || dev_priv->cce_mode == R128_PM4_NONPM4) { DRM_DEBUG("while CCE running\n"); return 0; @@ -671,6 +678,8 @@ int r128_cce_stop(struct drm_device *dev, void *data, struct drm_file *file_priv LOCK_TEST_WITH_RETURN(dev, file_priv); + DEV_INIT_TEST_WITH_RETURN(dev_priv); + /* Flush any pending CCE commands. This ensures any outstanding * commands are exectuted by the engine before we turn it off. */ @@ -708,10 +717,7 @@ int r128_cce_reset(struct drm_device *dev, void *data, struct drm_file *file_pri LOCK_TEST_WITH_RETURN(dev, file_priv); - if (!dev_priv) { - DRM_DEBUG("called before init done\n"); - return -EINVAL; - } + DEV_INIT_TEST_WITH_RETURN(dev_priv); r128_do_cce_reset(dev_priv); @@ -728,6 +734,8 @@ int r128_cce_idle(struct drm_device *dev, void *data, struct drm_file *file_priv LOCK_TEST_WITH_RETURN(dev, file_priv); + DEV_INIT_TEST_WITH_RETURN(dev_priv); + if (dev_priv->cce_running) { r128_do_cce_flush(dev_priv); } @@ -741,6 +749,8 @@ int r128_engine_reset(struct drm_device *dev, void *data, struct drm_file *file_ LOCK_TEST_WITH_RETURN(dev, file_priv); + DEV_INIT_TEST_WITH_RETURN(dev->dev_private); + return r128_do_engine_reset(dev); } diff --git a/drivers/gpu/drm/r128/r128_drv.h b/drivers/gpu/drm/r128/r128_drv.h index 797a26c42dab..3c60829d82e9 100644 --- a/drivers/gpu/drm/r128/r128_drv.h +++ b/drivers/gpu/drm/r128/r128_drv.h @@ -422,6 +422,14 @@ static __inline__ void r128_update_ring_snapshot(drm_r128_private_t * dev_priv) * Misc helper macros */ +#define DEV_INIT_TEST_WITH_RETURN(_dev_priv) \ +do { \ + if (!_dev_priv) { \ + DRM_ERROR("called with no initialization\n"); \ + return -EINVAL; \ + } \ +} while (0) + #define RING_SPACE_TEST_WITH_RETURN( dev_priv ) \ do { \ drm_r128_ring_buffer_t *ring = &dev_priv->ring; int i; \ diff --git a/drivers/gpu/drm/r128/r128_state.c b/drivers/gpu/drm/r128/r128_state.c index 026a48c95c8f..af2665cf4718 100644 --- a/drivers/gpu/drm/r128/r128_state.c +++ b/drivers/gpu/drm/r128/r128_state.c @@ -1244,14 +1244,18 @@ static void r128_cce_dispatch_stipple(struct drm_device * dev, u32 * stipple) static int r128_cce_clear(struct drm_device *dev, void *data, struct drm_file *file_priv) { drm_r128_private_t *dev_priv = dev->dev_private; - drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv; + drm_r128_sarea_t *sarea_priv; drm_r128_clear_t *clear = data; DRM_DEBUG("\n"); LOCK_TEST_WITH_RETURN(dev, file_priv); + DEV_INIT_TEST_WITH_RETURN(dev_priv); + RING_SPACE_TEST_WITH_RETURN(dev_priv); + sarea_priv = dev_priv->sarea_priv; + if (sarea_priv->nbox > R128_NR_SAREA_CLIPRECTS) sarea_priv->nbox = R128_NR_SAREA_CLIPRECTS; @@ -1312,6 +1316,8 @@ static int r128_cce_flip(struct drm_device *dev, void *data, struct drm_file *fi LOCK_TEST_WITH_RETURN(dev, file_priv); + DEV_INIT_TEST_WITH_RETURN(dev_priv); + RING_SPACE_TEST_WITH_RETURN(dev_priv); if (!dev_priv->page_flipping) @@ -1331,6 +1337,8 @@ static int r128_cce_swap(struct drm_device *dev, void *data, struct drm_file *fi LOCK_TEST_WITH_RETURN(dev, file_priv); + DEV_INIT_TEST_WITH_RETURN(dev_priv); + RING_SPACE_TEST_WITH_RETURN(dev_priv); if (sarea_priv->nbox > R128_NR_SAREA_CLIPRECTS) @@ -1354,10 +1362,7 @@ static int r128_cce_vertex(struct drm_device *dev, void *data, struct drm_file * LOCK_TEST_WITH_RETURN(dev, file_priv); - if (!dev_priv) { - DRM_ERROR("called with no initialization\n"); - return -EINVAL; - } + DEV_INIT_TEST_WITH_RETURN(dev_priv); DRM_DEBUG("pid=%d index=%d count=%d discard=%d\n", DRM_CURRENTPID, vertex->idx, vertex->count, vertex->discard); @@ -1410,10 +1415,7 @@ static int r128_cce_indices(struct drm_device *dev, void *data, struct drm_file LOCK_TEST_WITH_RETURN(dev, file_priv); - if (!dev_priv) { - DRM_ERROR("called with no initialization\n"); - return -EINVAL; - } + DEV_INIT_TEST_WITH_RETURN(dev_priv); DRM_DEBUG("pid=%d buf=%d s=%d e=%d d=%d\n", DRM_CURRENTPID, elts->idx, elts->start, elts->end, elts->discard); @@ -1476,6 +1478,8 @@ static int r128_cce_blit(struct drm_device *dev, void *data, struct drm_file *fi LOCK_TEST_WITH_RETURN(dev, file_priv); + DEV_INIT_TEST_WITH_RETURN(dev_priv); + DRM_DEBUG("pid=%d index=%d\n", DRM_CURRENTPID, blit->idx); if (blit->idx < 0 || blit->idx >= dma->buf_count) { @@ -1501,6 +1505,8 @@ static int r128_cce_depth(struct drm_device *dev, void *data, struct drm_file *f LOCK_TEST_WITH_RETURN(dev, file_priv); + DEV_INIT_TEST_WITH_RETURN(dev_priv); + RING_SPACE_TEST_WITH_RETURN(dev_priv); ret = -EINVAL; @@ -1531,6 +1537,8 @@ static int r128_cce_stipple(struct drm_device *dev, void *data, struct drm_file LOCK_TEST_WITH_RETURN(dev, file_priv); + DEV_INIT_TEST_WITH_RETURN(dev_priv); + if (DRM_COPY_FROM_USER(&mask, stipple->mask, 32 * sizeof(u32))) return -EFAULT; @@ -1555,10 +1563,7 @@ static int r128_cce_indirect(struct drm_device *dev, void *data, struct drm_file LOCK_TEST_WITH_RETURN(dev, file_priv); - if (!dev_priv) { - DRM_ERROR("called with no initialization\n"); - return -EINVAL; - } + DEV_INIT_TEST_WITH_RETURN(dev_priv); DRM_DEBUG("idx=%d s=%d e=%d d=%d\n", indirect->idx, indirect->start, indirect->end, @@ -1620,10 +1625,7 @@ static int r128_getparam(struct drm_device *dev, void *data, struct drm_file *fi drm_r128_getparam_t *param = data; int value; - if (!dev_priv) { - DRM_ERROR("called with no initialization\n"); - return -EINVAL; - } + DEV_INIT_TEST_WITH_RETURN(dev_priv); DRM_DEBUG("pid=%d\n", DRM_CURRENTPID); diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index fcfe5c02d744..7bae834df0ca 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c @@ -134,6 +134,14 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev, } } + /* HIS X1300 is DVI+VGA, not DVI+DVI */ + if ((dev->pdev->device == 0x7146) && + (dev->pdev->subsystem_vendor == 0x17af) && + (dev->pdev->subsystem_device == 0x2058)) { + if (supported_device == ATOM_DEVICE_DFP1_SUPPORT) + return false; + } + /* Funky macbooks */ if ((dev->pdev->device == 0x71C5) && (dev->pdev->subsystem_vendor == 0x106b) && diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c index ec383edf5f38..f1d6d3d4519f 100644 --- a/drivers/gpu/drm/radeon/radeon_fb.c +++ b/drivers/gpu/drm/radeon/radeon_fb.c @@ -120,7 +120,7 @@ static int radeonfb_check_var(struct fb_var_screeninfo *var, struct drm_framebuffer *fb = &rfb->base; int depth; - if (var->pixclock == -1 || !var->pixclock) { + if (var->pixclock != 0) { return -EINVAL; } /* Need to resize the fb object !!! */ @@ -234,7 +234,7 @@ static int radeonfb_set_par(struct fb_info *info) int ret; int i; - if (var->pixclock != -1) { + if (var->pixclock != 0) { DRM_ERROR("PIXEL CLCOK SET\n"); return -EINVAL; } @@ -828,7 +828,7 @@ static int radeonfb_single_fb_probe(struct radeon_device *rdev) rfbdev->crtc_count = crtc_count; if (new_fb) { - info->var.pixclock = -1; + info->var.pixclock = 0; if (register_framebuffer(info) < 0) return -EINVAL; } else { diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c index 0da72f18fd3a..ff9c18d07925 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c @@ -291,8 +291,7 @@ void radeon_crtc_dpms(struct drm_crtc *crtc, int mode) uint32_t mask; if (radeon_crtc->crtc_id) - mask = (RADEON_CRTC2_EN | - RADEON_CRTC2_DISP_DIS | + mask = (RADEON_CRTC2_DISP_DIS | RADEON_CRTC2_VSYNC_DIS | RADEON_CRTC2_HSYNC_DIS | RADEON_CRTC2_DISP_REQ_EN_B); @@ -304,7 +303,7 @@ void radeon_crtc_dpms(struct drm_crtc *crtc, int mode) switch (mode) { case DRM_MODE_DPMS_ON: if (radeon_crtc->crtc_id) - WREG32_P(RADEON_CRTC2_GEN_CNTL, RADEON_CRTC2_EN, ~mask); + WREG32_P(RADEON_CRTC2_GEN_CNTL, RADEON_CRTC2_EN, ~(RADEON_CRTC2_EN | mask)); else { WREG32_P(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_EN, ~(RADEON_CRTC_EN | RADEON_CRTC_DISP_REQ_EN_B)); @@ -318,7 +317,7 @@ void radeon_crtc_dpms(struct drm_crtc *crtc, int mode) case DRM_MODE_DPMS_OFF: drm_vblank_pre_modeset(dev, radeon_crtc->crtc_id); if (radeon_crtc->crtc_id) - WREG32_P(RADEON_CRTC2_GEN_CNTL, mask, ~mask); + WREG32_P(RADEON_CRTC2_GEN_CNTL, mask, ~(RADEON_CRTC2_EN | mask)); else { WREG32_P(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_DISP_REQ_EN_B, ~(RADEON_CRTC_EN | RADEON_CRTC_DISP_REQ_EN_B)); diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c index 303ccce05bb3..637867e94c9c 100644 --- a/drivers/hid/hid-apple.c +++ b/drivers/hid/hid-apple.c @@ -431,6 +431,13 @@ static const struct hid_device_id apple_devices[] = { .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS), .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI), + .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO), + .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | + APPLE_ISO_KEYBOARD }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS), + .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY), .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY), diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 5eb10c2ce665..c0537218d9c1 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c @@ -1259,6 +1259,9 @@ static const struct hid_device_id hid_blacklist[] = { { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) }, { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) }, { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) }, { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, @@ -1319,7 +1322,6 @@ static const struct hid_device_id hid_blacklist[] = { { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) }, { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) }, - { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, 0x030c) }, { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) }, { } }; diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 630101037921..bee718f8714e 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -88,6 +88,9 @@ #define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236 #define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237 #define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238 +#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI 0x0239 +#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO 0x023a +#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b #define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241 diff --git a/drivers/hwmon/adt7462.c b/drivers/hwmon/adt7462.c index 1852f27bac51..14f910d3dd9b 100644 --- a/drivers/hwmon/adt7462.c +++ b/drivers/hwmon/adt7462.c @@ -97,7 +97,7 @@ I2C_CLIENT_INSMOD_1(adt7462); #define ADT7462_PIN24_SHIFT 6 #define ADT7462_PIN26_VOLT_INPUT 0x08 #define ADT7462_PIN25_VOLT_INPUT 0x20 -#define ADT7462_PIN28_SHIFT 6 /* cfg3 */ +#define ADT7462_PIN28_SHIFT 4 /* cfg3 */ #define ADT7462_PIN28_VOLT 0x5 #define ADT7462_REG_ALARM1 0xB8 @@ -182,7 +182,7 @@ I2C_CLIENT_INSMOD_1(adt7462); * * Some, but not all, of these voltages have low/high limits. */ -#define ADT7462_VOLT_COUNT 12 +#define ADT7462_VOLT_COUNT 13 #define ADT7462_VENDOR 0x41 #define ADT7462_DEVICE 0x62 diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c index d39877a7da63..20579fad4a24 100644 --- a/drivers/hwmon/adt7475.c +++ b/drivers/hwmon/adt7475.c @@ -350,8 +350,7 @@ static ssize_t show_temp(struct device *dev, struct device_attribute *attr, case FAULT: /* Note - only for remote1 and remote2 */ - out = data->alarms & (sattr->index ? 0x8000 : 0x4000); - out = out ? 0 : 1; + out = !!(data->alarms & (sattr->index ? 0x8000 : 0x4000)); break; default: @@ -1152,7 +1151,7 @@ static struct adt7475_data *adt7475_update_device(struct device *dev) } /* Limits and settings, should never change update every 60 seconds */ - if (time_after(jiffies, data->limits_updated + HZ * 2) || + if (time_after(jiffies, data->limits_updated + HZ * 60) || !data->valid) { data->config5 = adt7475_read(REG_CONFIG5); diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c index 93c17223b527..2b8f439794b9 100644 --- a/drivers/hwmon/coretemp.c +++ b/drivers/hwmon/coretemp.c @@ -191,7 +191,7 @@ static int __devinit adjust_tjmax(struct cpuinfo_x86 *c, u32 id, struct device * if (err) { dev_warn(dev, "Unable to access MSR 0xEE, for Tjmax, left" - " at default"); + " at default\n"); } else if (eax & 0x40000000) { tjmax = 85000; } diff --git a/drivers/hwmon/fschmd.c b/drivers/hwmon/fschmd.c index ea955edde87e..3e51d54b60f4 100644 --- a/drivers/hwmon/fschmd.c +++ b/drivers/hwmon/fschmd.c @@ -767,6 +767,7 @@ leave: static int watchdog_open(struct inode *inode, struct file *filp) { struct fschmd_data *pos, *data = NULL; + int watchdog_is_open; /* We get called from drivers/char/misc.c with misc_mtx hold, and we call misc_register() from fschmd_probe() with watchdog_data_mutex @@ -781,10 +782,12 @@ static int watchdog_open(struct inode *inode, struct file *filp) } } /* Note we can never not have found data, so we don't check for this */ - kref_get(&data->kref); + watchdog_is_open = test_and_set_bit(0, &data->watchdog_is_open); + if (!watchdog_is_open) + kref_get(&data->kref); mutex_unlock(&watchdog_data_mutex); - if (test_and_set_bit(0, &data->watchdog_is_open)) + if (watchdog_is_open) return -EBUSY; /* Start the watchdog */ @@ -819,7 +822,7 @@ static int watchdog_release(struct inode *inode, struct file *filp) static ssize_t watchdog_write(struct file *filp, const char __user *buf, size_t count, loff_t *offset) { - size_t ret; + int ret; struct fschmd_data *data = filp->private_data; if (count) { diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c index 9157247fed8e..231a6a5d6d70 100644 --- a/drivers/hwmon/it87.c +++ b/drivers/hwmon/it87.c @@ -1028,12 +1028,11 @@ static int __init it87_find(unsigned short *address, chip_type, *address, sio_data->revision); /* Read GPIO config and VID value from LDN 7 (GPIO) */ - if (chip_type != IT8705F_DEVID) { + if (sio_data->type != it87) { int reg; superio_select(GPIO); - if ((chip_type == it8718) || - (chip_type == it8720)) + if (sio_data->type == it8718 || sio_data->type == it8720) sio_data->vid_value = superio_inb(IT87_SIO_VID_REG); reg = superio_inb(IT87_SIO_PINX2_REG); diff --git a/drivers/hwmon/lm78.c b/drivers/hwmon/lm78.c index a1787fdf5b9f..2348622b533c 100644 --- a/drivers/hwmon/lm78.c +++ b/drivers/hwmon/lm78.c @@ -870,17 +870,16 @@ static struct lm78_data *lm78_update_device(struct device *dev) static int __init lm78_isa_found(unsigned short address) { int val, save, found = 0; - - /* We have to request the region in two parts because some - boards declare base+4 to base+7 as a PNP device */ - if (!request_region(address, 4, "lm78")) { - pr_debug("lm78: Failed to request low part of region\n"); - return 0; - } - if (!request_region(address + 4, 4, "lm78")) { - pr_debug("lm78: Failed to request high part of region\n"); - release_region(address, 4); - return 0; + int port; + + /* Some boards declare base+0 to base+7 as a PNP device, some base+4 + * to base+7 and some base+5 to base+6. So we better request each port + * individually for the probing phase. */ + for (port = address; port < address + LM78_EXTENT; port++) { + if (!request_region(port, 1, "lm78")) { + pr_debug("lm78: Failed to request port 0x%x\n", port); + goto release; + } } #define REALLY_SLOW_IO @@ -944,8 +943,8 @@ static int __init lm78_isa_found(unsigned short address) val & 0x80 ? "LM79" : "LM78", (int)address); release: - release_region(address + 4, 4); - release_region(address, 4); + for (port--; port >= address; port--) + release_region(port, 1); return found; } diff --git a/drivers/hwmon/sht15.c b/drivers/hwmon/sht15.c index 6290a259456e..e828d17e9318 100644 --- a/drivers/hwmon/sht15.c +++ b/drivers/hwmon/sht15.c @@ -304,7 +304,7 @@ static inline int sht15_calc_temp(struct sht15_data *data) int d1 = 0; int i; - for (i = 1; i < ARRAY_SIZE(temppoints) - 1; i++) + for (i = 1; i < ARRAY_SIZE(temppoints); i++) /* Find pointer to interpolate */ if (data->supply_uV > temppoints[i - 1].vdd) { d1 = (data->supply_uV/1000 - temppoints[i - 1].vdd) @@ -331,12 +331,12 @@ static inline int sht15_calc_humid(struct sht15_data *data) const int c1 = -4; const int c2 = 40500; /* x 10 ^ -6 */ - const int c3 = 2800; /* x10 ^ -9 */ + const int c3 = -2800; /* x10 ^ -9 */ RHlinear = c1*1000 + c2 * data->val_humid/1000 + (data->val_humid * data->val_humid * c3)/1000000; - return (temp - 25000) * (10000 + 800 * data->val_humid) + return (temp - 25000) * (10000 + 80 * data->val_humid) / 1000000 + RHlinear; } diff --git a/drivers/hwmon/w83781d.c b/drivers/hwmon/w83781d.c index 0bdab959b736..3c237004b1ca 100644 --- a/drivers/hwmon/w83781d.c +++ b/drivers/hwmon/w83781d.c @@ -1818,17 +1818,17 @@ static int __init w83781d_isa_found(unsigned short address) { int val, save, found = 0; - - /* We have to request the region in two parts because some - boards declare base+4 to base+7 as a PNP device */ - if (!request_region(address, 4, "w83781d")) { - pr_debug("w83781d: Failed to request low part of region\n"); - return 0; - } - if (!request_region(address + 4, 4, "w83781d")) { - pr_debug("w83781d: Failed to request high part of region\n"); - release_region(address, 4); - return 0; + int port; + + /* Some boards declare base+0 to base+7 as a PNP device, some base+4 + * to base+7 and some base+5 to base+6. So we better request each port + * individually for the probing phase. */ + for (port = address; port < address + W83781D_EXTENT; port++) { + if (!request_region(port, 1, "w83781d")) { + pr_debug("w83781d: Failed to request port 0x%x\n", + port); + goto release; + } } #define REALLY_SLOW_IO @@ -1902,8 +1902,8 @@ w83781d_isa_found(unsigned short address) val == 0x30 ? "W83782D" : "W83781D", (int)address); release: - release_region(address + 4, 4); - release_region(address, 4); + for (port--; port >= address; port--) + release_region(port, 1); return found; } diff --git a/drivers/i2c/busses/i2c-amd756.c b/drivers/i2c/busses/i2c-amd756.c index f7d6fe9c49ba..8f0b90ef8c76 100644 --- a/drivers/i2c/busses/i2c-amd756.c +++ b/drivers/i2c/busses/i2c-amd756.c @@ -364,7 +364,7 @@ static int __devinit amd756_probe(struct pci_dev *pdev, error = acpi_check_region(amd756_ioport, SMB_IOSIZE, amd756_driver.name); if (error) - return error; + return -ENODEV; if (!request_region(amd756_ioport, SMB_IOSIZE, amd756_driver.name)) { dev_err(&pdev->dev, "SMB region 0x%x already in use!\n", diff --git a/drivers/i2c/busses/i2c-amd8111.c b/drivers/i2c/busses/i2c-amd8111.c index a7c59908c457..5b4ad86ca166 100644 --- a/drivers/i2c/busses/i2c-amd8111.c +++ b/drivers/i2c/busses/i2c-amd8111.c @@ -376,8 +376,10 @@ static int __devinit amd8111_probe(struct pci_dev *dev, smbus->size = pci_resource_len(dev, 0); error = acpi_check_resource_conflict(&dev->resource[0]); - if (error) + if (error) { + error = -ENODEV; goto out_kfree; + } if (!request_region(smbus->base, smbus->size, amd8111_driver.name)) { error = -EBUSY; diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c index 9d2c5adf5d4f..55edcfe5b851 100644 --- a/drivers/i2c/busses/i2c-i801.c +++ b/drivers/i2c/busses/i2c-i801.c @@ -732,8 +732,10 @@ static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id } err = acpi_check_resource_conflict(&dev->resource[SMBBAR]); - if (err) + if (err) { + err = -ENODEV; goto exit; + } err = pci_request_region(dev, SMBBAR, i801_driver.name); if (err) { diff --git a/drivers/i2c/busses/i2c-isch.c b/drivers/i2c/busses/i2c-isch.c index 9f6b8e0f8632..dba6eb053e2f 100644 --- a/drivers/i2c/busses/i2c-isch.c +++ b/drivers/i2c/busses/i2c-isch.c @@ -281,7 +281,7 @@ static int __devinit sch_probe(struct pci_dev *dev, return -ENODEV; } if (acpi_check_region(sch_smba, SMBIOSIZE, sch_driver.name)) - return -EBUSY; + return -ENODEV; if (!request_region(sch_smba, SMBIOSIZE, sch_driver.name)) { dev_err(&dev->dev, "SMBus region 0x%x already in use!\n", sch_smba); diff --git a/drivers/i2c/busses/i2c-mxs.c b/drivers/i2c/busses/i2c-mxs.c index 8bb795e7d7b2..e3235ff8e551 100644 --- a/drivers/i2c/busses/i2c-mxs.c +++ b/drivers/i2c/busses/i2c-mxs.c @@ -68,19 +68,10 @@ static u8 *i2c_buf_virt; static void hw_i2c_dmachan_reset(struct mxs_i2c_dev *dev) { - mxs_dma_disable(dev->dma_chan); mxs_dma_reset(dev->dma_chan); mxs_dma_ack_irq(dev->dma_chan); } -static mxs_i2c_reset(struct mxs_i2c_dev *mxs_i2c) -{ - hw_i2c_dmachan_reset(mxs_i2c); - mxs_dma_enable_irq(mxs_i2c->dma_chan, 1); - mxs_reset_block((void __iomem *)mxs_i2c->regbase, 0); - __raw_writel(0x0000FF00, mxs_i2c->regbase + HW_I2C_CTRL1_SET); -} - static int hw_i2c_dma_init(struct platform_device *pdev) { struct mxs_i2c_dev *mxs_i2c = platform_get_drvdata(pdev); @@ -168,7 +159,7 @@ static void hw_i2c_dma_setup_read(u8 addr, void *buff, int len, int flags) desc[0]->cmd.cmd.bits.pio_words = 1; desc[0]->cmd.cmd.bits.wait4end = 1; desc[0]->cmd.cmd.bits.dec_sem = 1; - desc[0]->cmd.cmd.bits.irq = 0; + desc[0]->cmd.cmd.bits.irq = 1; desc[0]->cmd.cmd.bits.chain = 1; desc[0]->cmd.cmd.bits.command = DMA_READ; desc[0]->cmd.address = i2c_buf_phys; @@ -328,7 +319,6 @@ static int mxs_i2c_xfer_msg(struct i2c_adapter *adap, msecs_to_jiffies(1000) ); if (err <= 0) { - mxs_i2c_reset(dev); dev_dbg(dev->dev, "controller is timed out\n"); return -ETIMEDOUT; } @@ -375,19 +365,9 @@ static irqreturn_t mxs_i2c_dma_isr(int this_irq, void *dev_id) mxs_dma_ack_irq(mxs_i2c->dma_chan); mxs_dma_cooked(mxs_i2c->dma_chan, &list); - complete(&mxs_i2c->cmd_complete); - return IRQ_HANDLED; } -static void mxs_i2c_task(struct work_struct *work) -{ - struct mxs_i2c_dev *mxs_i2c = container_of(work, - struct mxs_i2c_dev, work); - mxs_i2c_reset(mxs_i2c); - complete(&mxs_i2c->cmd_complete); -} - #define I2C_IRQ_MASK 0x000000FF static irqreturn_t mxs_i2c_isr(int this_irq, void *dev_id) { @@ -402,8 +382,20 @@ static irqreturn_t mxs_i2c_isr(int this_irq, void *dev_id) if (stat & BM_I2C_CTRL1_NO_SLAVE_ACK_IRQ) { mxs_i2c->cmd_err = -EREMOTEIO; - /* it takes long time to reset i2c */ - schedule_work(&mxs_i2c->work); + + /* + * Stop DMA + * Clear NAK + */ + __raw_writel(BM_I2C_CTRL1_CLR_GOT_A_NAK, + mxs_i2c->regbase + HW_I2C_CTRL1_SET); + hw_i2c_dmachan_reset(mxs_i2c); + mxs_reset_block((void __iomem *)mxs_i2c->regbase, 1); + /* Will catch all error (IRQ mask) */ + __raw_writel(0x0000FF00, mxs_i2c->regbase + HW_I2C_CTRL1_SET); + + complete(&mxs_i2c->cmd_complete); + goto done; } @@ -415,10 +407,7 @@ static irqreturn_t mxs_i2c_isr(int this_irq, void *dev_id) complete(&mxs_i2c->cmd_complete); goto done; } - - if ((stat & done_mask) == done_mask && - (mxs_i2c->flags & MXS_I2C_PIOQUEUE_MODE)) - + if ((stat & done_mask) == done_mask) complete(&mxs_i2c->cmd_complete); done: @@ -535,8 +524,6 @@ static int mxs_i2c_probe(struct platform_device *pdev) } - INIT_WORK(&mxs_i2c->work, mxs_i2c_task); - return 0; no_i2c_adapter: diff --git a/drivers/i2c/busses/i2c-mxs.h b/drivers/i2c/busses/i2c-mxs.h index 1a35385b793b..4ddca007624a 100644 --- a/drivers/i2c/busses/i2c-mxs.h +++ b/drivers/i2c/busses/i2c-mxs.h @@ -37,6 +37,5 @@ struct mxs_i2c_dev { struct i2c_adapter adapter; spinlock_t lock; wait_queue_head_t queue; - struct work_struct work; }; #endif diff --git a/drivers/i2c/busses/i2c-pca-isa.c b/drivers/i2c/busses/i2c-pca-isa.c index 0ed68e2ccd22..f7346a9bd95f 100644 --- a/drivers/i2c/busses/i2c-pca-isa.c +++ b/drivers/i2c/busses/i2c-pca-isa.c @@ -75,7 +75,7 @@ static int pca_isa_waitforcompletion(void *pd) unsigned long timeout; if (irq > -1) { - ret = wait_event_interruptible_timeout(pca_wait, + ret = wait_event_timeout(pca_wait, pca_isa_readbyte(pd, I2C_PCA_CON) & I2C_PCA_CON_SI, pca_isa_ops.timeout); } else { @@ -96,7 +96,7 @@ static void pca_isa_resetchip(void *pd) } static irqreturn_t pca_handler(int this_irq, void *dev_id) { - wake_up_interruptible(&pca_wait); + wake_up(&pca_wait); return IRQ_HANDLED; } diff --git a/drivers/i2c/busses/i2c-pca-platform.c b/drivers/i2c/busses/i2c-pca-platform.c index c4df9d411cd5..5b2213df5ed0 100644 --- a/drivers/i2c/busses/i2c-pca-platform.c +++ b/drivers/i2c/busses/i2c-pca-platform.c @@ -84,7 +84,7 @@ static int i2c_pca_pf_waitforcompletion(void *pd) unsigned long timeout; if (i2c->irq) { - ret = wait_event_interruptible_timeout(i2c->wait, + ret = wait_event_timeout(i2c->wait, i2c->algo_data.read_byte(i2c, I2C_PCA_CON) & I2C_PCA_CON_SI, i2c->adap.timeout); } else { @@ -122,7 +122,7 @@ static irqreturn_t i2c_pca_pf_handler(int this_irq, void *dev_id) if ((i2c->algo_data.read_byte(i2c, I2C_PCA_CON) & I2C_PCA_CON_SI) == 0) return IRQ_NONE; - wake_up_interruptible(&i2c->wait); + wake_up(&i2c->wait); return IRQ_HANDLED; } diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c index 0249a7d762b9..808e49e6ad4e 100644 --- a/drivers/i2c/busses/i2c-piix4.c +++ b/drivers/i2c/busses/i2c-piix4.c @@ -168,7 +168,7 @@ static int __devinit piix4_setup(struct pci_dev *PIIX4_dev, } if (acpi_check_region(piix4_smba, SMBIOSIZE, piix4_driver.name)) - return -EBUSY; + return -ENODEV; if (!request_region(piix4_smba, SMBIOSIZE, piix4_driver.name)) { dev_err(&PIIX4_dev->dev, "SMBus region 0x%x already in use!\n", @@ -259,7 +259,7 @@ static int __devinit piix4_setup_sb800(struct pci_dev *PIIX4_dev, piix4_smba = ((smba_en_hi << 8) | smba_en_lo) & 0xffe0; if (acpi_check_region(piix4_smba, SMBIOSIZE, piix4_driver.name)) - return -EBUSY; + return -ENODEV; if (!request_region(piix4_smba, SMBIOSIZE, piix4_driver.name)) { dev_err(&PIIX4_dev->dev, "SMBus region 0x%x already in use!\n", diff --git a/drivers/i2c/busses/i2c-sis96x.c b/drivers/i2c/busses/i2c-sis96x.c index 8295885b2fdb..1649963b00dc 100644 --- a/drivers/i2c/busses/i2c-sis96x.c +++ b/drivers/i2c/busses/i2c-sis96x.c @@ -280,7 +280,7 @@ static int __devinit sis96x_probe(struct pci_dev *dev, retval = acpi_check_resource_conflict(&dev->resource[SIS96x_BAR]); if (retval) - return retval; + return -ENODEV; /* Everything is happy, let's grab the memory and set things up. */ if (!request_region(sis96x_smbus_base, SMB_IOSIZE, diff --git a/drivers/i2c/busses/i2c-tiny-usb.c b/drivers/i2c/busses/i2c-tiny-usb.c index b1c050ff311d..e29b6d5ba8ef 100644 --- a/drivers/i2c/busses/i2c-tiny-usb.c +++ b/drivers/i2c/busses/i2c-tiny-usb.c @@ -13,6 +13,7 @@ #include <linux/kernel.h> #include <linux/errno.h> #include <linux/module.h> +#include <linux/types.h> /* include interfaces to usb layer */ #include <linux/usb.h> @@ -31,8 +32,8 @@ #define CMD_I2C_IO_END (1<<1) /* i2c bit delay, default is 10us -> 100kHz */ -static int delay = 10; -module_param(delay, int, 0); +static unsigned short delay = 10; +module_param(delay, ushort, 0); MODULE_PARM_DESC(delay, "bit delay in microseconds, " "e.g. 10 for 100kHz (default is 100kHz)"); @@ -109,7 +110,7 @@ static int usb_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int num) static u32 usb_func(struct i2c_adapter *adapter) { - u32 func; + __le32 func; /* get functionality from adapter */ if (usb_read(adapter, CMD_GET_FUNC, 0, 0, &func, sizeof(func)) != @@ -118,7 +119,7 @@ static u32 usb_func(struct i2c_adapter *adapter) return 0; } - return func; + return le32_to_cpu(func); } /* This is the actual algorithm we define */ @@ -216,8 +217,7 @@ static int i2c_tiny_usb_probe(struct usb_interface *interface, "i2c-tiny-usb at bus %03d device %03d", dev->usb_dev->bus->busnum, dev->usb_dev->devnum); - if (usb_write(&dev->adapter, CMD_SET_DELAY, - cpu_to_le16(delay), 0, NULL, 0) != 0) { + if (usb_write(&dev->adapter, CMD_SET_DELAY, delay, 0, NULL, 0) != 0) { dev_err(&dev->adapter.dev, "failure setting delay to %dus\n", delay); retval = -EIO; diff --git a/drivers/i2c/busses/i2c-viapro.c b/drivers/i2c/busses/i2c-viapro.c index 54d810a4d00f..e4b1543015af 100644 --- a/drivers/i2c/busses/i2c-viapro.c +++ b/drivers/i2c/busses/i2c-viapro.c @@ -365,7 +365,7 @@ static int __devinit vt596_probe(struct pci_dev *pdev, found: error = acpi_check_region(vt596_smba, 8, vt596_driver.name); if (error) - return error; + return -ENODEV; if (!request_region(vt596_smba, 8, vt596_driver.name)) { dev_err(&pdev->dev, "SMBus region 0x%x already in use!\n", diff --git a/drivers/i2c/chips/tsl2550.c b/drivers/i2c/chips/tsl2550.c index b96f3025e588..ec0a7cab6c8b 100644 --- a/drivers/i2c/chips/tsl2550.c +++ b/drivers/i2c/chips/tsl2550.c @@ -277,6 +277,7 @@ static DEVICE_ATTR(operating_mode, S_IWUSR | S_IRUGO, static ssize_t __tsl2550_show_lux(struct i2c_client *client, char *buf) { + struct tsl2550_data *data = i2c_get_clientdata(client); u8 ch0, ch1; int ret; @@ -296,6 +297,8 @@ static ssize_t __tsl2550_show_lux(struct i2c_client *client, char *buf) ret = tsl2550_calculate_lux(ch0, ch1); if (ret < 0) return ret; + if (data->operating_mode == 1) + ret *= 5; return sprintf(buf, "%d\n", ret); } diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 0e45c296d3d2..b67c32c3fa13 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c @@ -718,6 +718,7 @@ int i2c_del_adapter(struct i2c_adapter *adap) { int res = 0; struct i2c_adapter *found; + struct i2c_client *client, *next; /* First make sure that this adapter was ever added */ mutex_lock(&core_lock); @@ -737,10 +738,23 @@ int i2c_del_adapter(struct i2c_adapter *adap) if (res) return res; + /* Remove devices instantiated from sysfs */ + list_for_each_entry_safe(client, next, &userspace_devices, detected) { + if (client->adapter == adap) { + dev_dbg(&adap->dev, "Removing %s at 0x%x\n", + client->name, client->addr); + list_del(&client->detected); + i2c_unregister_device(client); + } + } + /* Detach any active clients. This can't fail, thus we do not checking the returned value. */ res = device_for_each_child(&adap->dev, NULL, __unregister_client); + /* device name is gone after device_unregister */ + dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name); + /* clean up the sysfs representation */ init_completion(&adap->dev_released); device_unregister(&adap->dev); @@ -753,8 +767,6 @@ int i2c_del_adapter(struct i2c_adapter *adap) idr_remove(&i2c_adapter_idr, adap->nr); mutex_unlock(&core_lock); - dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name); - /* Clear the device structure in case this adapter is ever going to be added again */ memset(&adap->dev, 0, sizeof(adap->dev)); diff --git a/drivers/ide/cmd64x.c b/drivers/ide/cmd64x.c index 680e5975217f..ca0c46f6580a 100644 --- a/drivers/ide/cmd64x.c +++ b/drivers/ide/cmd64x.c @@ -379,7 +379,8 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { .enablebits = {{0x00,0x00,0x00}, {0x51,0x08,0x08}}, .port_ops = &cmd64x_port_ops, .host_flags = IDE_HFLAG_CLEAR_SIMPLEX | - IDE_HFLAG_ABUSE_PREFETCH, + IDE_HFLAG_ABUSE_PREFETCH | + IDE_HFLAG_SERIALIZE, .pio_mask = ATA_PIO5, .mwdma_mask = ATA_MWDMA2, .udma_mask = 0x00, /* no udma */ @@ -389,7 +390,8 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { .init_chipset = init_chipset_cmd64x, .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, .port_ops = &cmd648_port_ops, - .host_flags = IDE_HFLAG_ABUSE_PREFETCH, + .host_flags = IDE_HFLAG_ABUSE_PREFETCH | + IDE_HFLAG_SERIALIZE, .pio_mask = ATA_PIO5, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA2, diff --git a/drivers/ide/ide-ioctls.c b/drivers/ide/ide-ioctls.c index e246d3d3fbcc..b05ee089841a 100644 --- a/drivers/ide/ide-ioctls.c +++ b/drivers/ide/ide-ioctls.c @@ -162,7 +162,7 @@ static int ide_cmd_ioctl(ide_drive_t *drive, unsigned long arg) if (tf->command == ATA_CMD_SET_FEATURES && tf->feature == SETFEATURES_XFER && tf->nsect >= XFER_SW_DMA_0) { - xfer_rate = ide_find_dma_mode(drive, XFER_UDMA_6); + xfer_rate = ide_find_dma_mode(drive, tf->nsect); if (xfer_rate != tf->nsect) { err = -EINVAL; goto abort; diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 1bb106f6221a..ad33db2eacf1 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c @@ -1035,15 +1035,6 @@ static void ide_port_init_devices(ide_hwif_t *hwif) if (port_ops && port_ops->init_dev) port_ops->init_dev(drive); } - - ide_port_for_each_dev(i, drive, hwif) { - /* - * default to PIO Mode 0 before we figure out - * the most suited mode for the attached device - */ - if (port_ops && port_ops->set_pio_mode) - port_ops->set_pio_mode(drive, 0); - } } static void ide_init_port(ide_hwif_t *hwif, unsigned int port, diff --git a/drivers/ide/sis5513.c b/drivers/ide/sis5513.c index afca22beaadf..3b88eba04c9c 100644 --- a/drivers/ide/sis5513.c +++ b/drivers/ide/sis5513.c @@ -2,7 +2,7 @@ * Copyright (C) 1999-2000 Andre Hedrick <andre@linux-ide.org> * Copyright (C) 2002 Lionel Bouton <Lionel.Bouton@inet6.fr>, Maintainer * Copyright (C) 2003 Vojtech Pavlik <vojtech@suse.cz> - * Copyright (C) 2007 Bartlomiej Zolnierkiewicz + * Copyright (C) 2007-2009 Bartlomiej Zolnierkiewicz * * May be copied or modified under the terms of the GNU General Public License * @@ -281,11 +281,13 @@ static void config_drive_art_rwp(ide_drive_t *drive) pci_read_config_byte(dev, 0x4b, ®4bh); + rw_prefetch = reg4bh & ~(0x11 << drive->dn); + if (drive->media == ide_disk) - rw_prefetch = 0x11 << drive->dn; + rw_prefetch |= 0x11 << drive->dn; - if ((reg4bh & (0x11 << drive->dn)) != rw_prefetch) - pci_write_config_byte(dev, 0x4b, reg4bh|rw_prefetch); + if (reg4bh != rw_prefetch) + pci_write_config_byte(dev, 0x4b, rw_prefetch); } static void sis_set_pio_mode(ide_drive_t *drive, const u8 pio) diff --git a/drivers/ide/slc90e66.c b/drivers/ide/slc90e66.c index 9aec78d3bcff..1ccfb40e7215 100644 --- a/drivers/ide/slc90e66.c +++ b/drivers/ide/slc90e66.c @@ -91,8 +91,7 @@ static void slc90e66_set_dma_mode(ide_drive_t *drive, const u8 speed) if (!(reg48 & u_flag)) pci_write_config_word(dev, 0x48, reg48|u_flag); - /* FIXME: (reg4a & a_speed) ? */ - if ((reg4a & u_speed) != u_speed) { + if ((reg4a & a_speed) != u_speed) { pci_write_config_word(dev, 0x4a, reg4a & ~a_speed); pci_read_config_word(dev, 0x4a, ®4a); pci_write_config_word(dev, 0x4a, reg4a|u_speed); diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index 5598ecb48c5b..1148140d08a1 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c @@ -19,9 +19,6 @@ #include <linux/input.h> #include <linux/major.h> #include <linux/device.h> -#ifdef CONFIG_WAKELOCK -#include <linux/wakelock.h> -#endif #include "input-compat.h" struct evdev { @@ -45,10 +42,6 @@ struct evdev_client { struct fasync_struct *fasync; struct evdev *evdev; struct list_head node; -#ifdef CONFIG_WAKELOCK - struct wake_lock wake_lock; - char name[28]; -#endif }; static struct evdev *evdev_table[EVDEV_MINORS]; @@ -61,9 +54,6 @@ static void evdev_pass_event(struct evdev_client *client, * Interrupts are disabled, just acquire the lock */ spin_lock(&client->buffer_lock); -#ifdef CONFIG_WAKELOCK - wake_lock_timeout(&client->wake_lock, 5 * HZ); -#endif client->buffer[client->head++] = *event; client->head &= EVDEV_BUFFER_SIZE - 1; spin_unlock(&client->buffer_lock); @@ -80,15 +70,8 @@ static void evdev_event(struct input_handle *handle, struct evdev *evdev = handle->private; struct evdev_client *client; struct input_event event; -#ifdef CONFIG_WAKELOCK - struct timespec ts; - ktime_get_ts(&ts); - event.time.tv_sec = ts.tv_sec; - event.time.tv_usec = ts.tv_nsec / NSEC_PER_USEC; -#else do_gettimeofday(&event.time); -#endif event.type = type; event.code = code; event.value = value; @@ -249,9 +232,6 @@ static int evdev_release(struct inode *inode, struct file *file) mutex_unlock(&evdev->mutex); evdev_detach_client(evdev, client); -#ifdef CONFIG_WAKELOCK - wake_lock_destroy(&client->wake_lock); -#endif kfree(client); evdev_close_device(evdev); @@ -288,11 +268,6 @@ static int evdev_open(struct inode *inode, struct file *file) } spin_lock_init(&client->buffer_lock); -#ifdef CONFIG_WAKELOCK - snprintf(client->name, sizeof(client->name), "%s-%d", dev_name(&evdev->dev), - task_tgid_vnr(current)); - wake_lock_init(&client->wake_lock, WAKE_LOCK_SUSPEND, client->name); -#endif client->evdev = evdev; evdev_attach_client(evdev, client); @@ -356,10 +331,6 @@ static int evdev_fetch_next_event(struct evdev_client *client, if (have_event) { *event = client->buffer[client->tail++]; client->tail &= EVDEV_BUFFER_SIZE - 1; -#ifdef CONFIG_WAKELOCK - if (client->head == client->tail) - wake_unlock(&client->wake_lock); -#endif } spin_unlock_irq(&client->buffer_lock); diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile index 88e2a24d9cff..fea01a591076 100644 --- a/drivers/input/keyboard/Makefile +++ b/drivers/input/keyboard/Makefile @@ -31,7 +31,7 @@ obj-$(CONFIG_KEYBOARD_STOWAWAY) += stowaway.o obj-$(CONFIG_KEYBOARD_SUNKBD) += sunkbd.o obj-$(CONFIG_KEYBOARD_TOSA) += tosakbd.o obj-$(CONFIG_KEYBOARD_XTKBD) += xtkbd.o -obj-$(CONFIG_KEYBOARD_MXC) += mxc_keyb.o mxc_pwrkey.o +obj-$(CONFIG_KEYBOARD_MXC) += mxc_keyb.o obj-$(CONFIG_KEYBOARD_MPR084) += mpr084.o obj-$(CONFIG_KEYBOARD_STMP3XXX) += stmp3xxx-kbd.o obj-$(CONFIG_KEYBOARD_MXS) += mxs-kbd.o diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index 6c6a09b1c0fe..abc314f93ff3 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c @@ -1608,6 +1608,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { .driver_data = atkbd_samsung_forced_release_keys, }, { + .ident = "Samsung R59P/R60P/R61P", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), + DMI_MATCH(DMI_PRODUCT_NAME, "R59P/R60P/R61P"), + }, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_samsung_forced_release_keys, + }, + { .ident = "Fujitsu Amilo PA 1510", .matches = { DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), diff --git a/drivers/input/keyboard/mxc_keyb.c b/drivers/input/keyboard/mxc_keyb.c index bd5ecd8c20f1..033713cbdfdf 100644 --- a/drivers/input/keyboard/mxc_keyb.c +++ b/drivers/input/keyboard/mxc_keyb.c @@ -1077,7 +1077,7 @@ static int mxc_kpp_probe(struct platform_device *pdev) retval = request_irq(irq, mxc_kpp_interrupt, 0, MOD_NAME, MOD_NAME); if (retval) { pr_debug("KPP: request_irq(%d) returned error %d\n", - irq, retval); + MXC_INT_KPP, retval); goto err3; } diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index 5547e2429fbe..b172bef75910 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c @@ -5,6 +5,7 @@ * Copyright (c) 2003-2005 Peter Osterlund <petero2@telia.com> * Copyright (c) 2004 Dmitry Torokhov <dtor@mail.ru> * Copyright (c) 2005 Vojtech Pavlik <vojtech@suse.cz> + * Copyright (c) 2009 Sebastian Kapfer <sebastian_kapfer@gmx.net> * * ALPS detection, tap switching and status querying info is taken from * tpconfig utility (by C. Scott Ananian and Bruce Kall). @@ -35,6 +36,8 @@ #define ALPS_OLDPROTO 0x10 #define ALPS_PASS 0x20 #define ALPS_FW_BK_2 0x40 +#define ALPS_PS2_INTERLEAVED 0x80 /* 3-byte PS/2 packet interleaved with + 6-byte ALPS packet */ static const struct alps_model_info alps_model_data[] = { { { 0x32, 0x02, 0x14 }, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, /* Toshiba Salellite Pro M10 */ @@ -55,7 +58,9 @@ static const struct alps_model_info alps_model_data[] = { { { 0x20, 0x02, 0x0e }, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, /* XXX */ { { 0x22, 0x02, 0x0a }, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, { { 0x22, 0x02, 0x14 }, 0xff, 0xff, ALPS_PASS | ALPS_DUALPOINT }, /* Dell Latitude D600 */ - { { 0x62, 0x02, 0x14 }, 0xcf, 0xcf, ALPS_PASS | ALPS_DUALPOINT }, /* Dell Latitude E6500 */ + /* Dell Latitude E5500, E6400, E6500, Precision M4400 */ + { { 0x62, 0x02, 0x14 }, 0xcf, 0xcf, + ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED }, { { 0x73, 0x02, 0x50 }, 0xcf, 0xcf, ALPS_FW_BK_1 }, /* Dell Vostro 1400 */ }; @@ -66,20 +71,88 @@ static const struct alps_model_info alps_model_data[] = { */ /* - * ALPS abolute Mode - new format + * PS/2 packet format + * + * byte 0: 0 0 YSGN XSGN 1 M R L + * byte 1: X7 X6 X5 X4 X3 X2 X1 X0 + * byte 2: Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 + * + * Note that the device never signals overflow condition. + * + * ALPS absolute Mode - new format * * byte 0: 1 ? ? ? 1 ? ? ? * byte 1: 0 x6 x5 x4 x3 x2 x1 x0 - * byte 2: 0 x10 x9 x8 x7 ? fin ges + * byte 2: 0 x10 x9 x8 x7 ? fin ges * byte 3: 0 y9 y8 y7 1 M R L * byte 4: 0 y6 y5 y4 y3 y2 y1 y0 * byte 5: 0 z6 z5 z4 z3 z2 z1 z0 * + * Dualpoint device -- interleaved packet format + * + * byte 0: 1 1 0 0 1 1 1 1 + * byte 1: 0 x6 x5 x4 x3 x2 x1 x0 + * byte 2: 0 x10 x9 x8 x7 0 fin ges + * byte 3: 0 0 YSGN XSGN 1 1 1 1 + * byte 4: X7 X6 X5 X4 X3 X2 X1 X0 + * byte 5: Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 + * byte 6: 0 y9 y8 y7 1 m r l + * byte 7: 0 y6 y5 y4 y3 y2 y1 y0 + * byte 8: 0 z6 z5 z4 z3 z2 z1 z0 + * + * CAPITALS = stick, miniscules = touchpad + * * ?'s can have different meanings on different models, * such as wheel rotation, extra buttons, stick buttons * on a dualpoint, etc. */ +static bool alps_is_valid_first_byte(const struct alps_model_info *model, + unsigned char data) +{ + return (data & model->mask0) == model->byte0; +} + +static void alps_report_buttons(struct psmouse *psmouse, + struct input_dev *dev1, struct input_dev *dev2, + int left, int right, int middle) +{ + struct alps_data *priv = psmouse->private; + const struct alps_model_info *model = priv->i; + + if (model->flags & ALPS_PS2_INTERLEAVED) { + struct input_dev *dev; + + /* + * If shared button has already been reported on the + * other device (dev2) then this event should be also + * sent through that device. + */ + dev = test_bit(BTN_LEFT, dev2->key) ? dev2 : dev1; + input_report_key(dev, BTN_LEFT, left); + + dev = test_bit(BTN_RIGHT, dev2->key) ? dev2 : dev1; + input_report_key(dev, BTN_RIGHT, right); + + dev = test_bit(BTN_MIDDLE, dev2->key) ? dev2 : dev1; + input_report_key(dev, BTN_MIDDLE, middle); + + /* + * Sync the _other_ device now, we'll do the first + * device later once we report the rest of the events. + */ + input_sync(dev2); + } else { + /* + * For devices with non-interleaved packets we know what + * device buttons belong to so we can simply report them. + */ + input_report_key(dev1, BTN_LEFT, left); + input_report_key(dev1, BTN_RIGHT, right); + input_report_key(dev1, BTN_MIDDLE, middle); + } +} + static void alps_process_packet(struct psmouse *psmouse) { struct alps_data *priv = psmouse->private; @@ -89,18 +162,6 @@ static void alps_process_packet(struct psmouse *psmouse) int x, y, z, ges, fin, left, right, middle; int back = 0, forward = 0; - if ((packet[0] & 0xc8) == 0x08) { /* 3-byte PS/2 packet */ - input_report_key(dev2, BTN_LEFT, packet[0] & 1); - input_report_key(dev2, BTN_RIGHT, packet[0] & 2); - input_report_key(dev2, BTN_MIDDLE, packet[0] & 4); - input_report_rel(dev2, REL_X, - packet[1] ? packet[1] - ((packet[0] << 4) & 0x100) : 0); - input_report_rel(dev2, REL_Y, - packet[2] ? ((packet[0] << 3) & 0x100) - packet[2] : 0); - input_sync(dev2); - return; - } - if (priv->i->flags & ALPS_OLDPROTO) { left = packet[2] & 0x10; right = packet[2] & 0x08; @@ -136,18 +197,13 @@ static void alps_process_packet(struct psmouse *psmouse) input_report_rel(dev2, REL_X, (x > 383 ? (x - 768) : x)); input_report_rel(dev2, REL_Y, -(y > 255 ? (y - 512) : y)); - input_report_key(dev2, BTN_LEFT, left); - input_report_key(dev2, BTN_RIGHT, right); - input_report_key(dev2, BTN_MIDDLE, middle); + alps_report_buttons(psmouse, dev2, dev, left, right, middle); - input_sync(dev); input_sync(dev2); return; } - input_report_key(dev, BTN_LEFT, left); - input_report_key(dev, BTN_RIGHT, right); - input_report_key(dev, BTN_MIDDLE, middle); + alps_report_buttons(psmouse, dev, dev2, left, right, middle); /* Convert hardware tap to a reasonable Z value */ if (ges && !fin) z = 40; @@ -188,25 +244,168 @@ static void alps_process_packet(struct psmouse *psmouse) input_sync(dev); } +static void alps_report_bare_ps2_packet(struct psmouse *psmouse, + unsigned char packet[], + bool report_buttons) +{ + struct alps_data *priv = psmouse->private; + struct input_dev *dev2 = priv->dev2; + + if (report_buttons) + alps_report_buttons(psmouse, dev2, psmouse->dev, + packet[0] & 1, packet[0] & 2, packet[0] & 4); + + input_report_rel(dev2, REL_X, + packet[1] ? packet[1] - ((packet[0] << 4) & 0x100) : 0); + input_report_rel(dev2, REL_Y, + packet[2] ? ((packet[0] << 3) & 0x100) - packet[2] : 0); + + input_sync(dev2); +} + +static psmouse_ret_t alps_handle_interleaved_ps2(struct psmouse *psmouse) +{ + struct alps_data *priv = psmouse->private; + + if (psmouse->pktcnt < 6) + return PSMOUSE_GOOD_DATA; + + if (psmouse->pktcnt == 6) { + /* + * Start a timer to flush the packet if it ends up last + * 6-byte packet in the stream. Timer needs to fire + * psmouse core times out itself. 20 ms should be enough + * to decide if we are getting more data or not. + */ + mod_timer(&priv->timer, jiffies + msecs_to_jiffies(20)); + return PSMOUSE_GOOD_DATA; + } + + del_timer(&priv->timer); + + if (psmouse->packet[6] & 0x80) { + + /* + * Highest bit is set - that means we either had + * complete ALPS packet and this is start of the + * next packet or we got garbage. + */ + + if (((psmouse->packet[3] | + psmouse->packet[4] | + psmouse->packet[5]) & 0x80) || + (!alps_is_valid_first_byte(priv->i, psmouse->packet[6]))) { + dbg("refusing packet %x %x %x %x " + "(suspected interleaved ps/2)\n", + psmouse->packet[3], psmouse->packet[4], + psmouse->packet[5], psmouse->packet[6]); + return PSMOUSE_BAD_DATA; + } + + alps_process_packet(psmouse); + + /* Continue with the next packet */ + psmouse->packet[0] = psmouse->packet[6]; + psmouse->pktcnt = 1; + + } else { + + /* + * High bit is 0 - that means that we indeed got a PS/2 + * packet in the middle of ALPS packet. + * + * There is also possibility that we got 6-byte ALPS + * packet followed by 3-byte packet from trackpoint. We + * can not distinguish between these 2 scenarios but + * becase the latter is unlikely to happen in course of + * normal operation (user would need to press all + * buttons on the pad and start moving trackpoint + * without touching the pad surface) we assume former. + * Even if we are wrong the wost thing that would happen + * the cursor would jump but we should not get protocol + * desynchronization. + */ + + alps_report_bare_ps2_packet(psmouse, &psmouse->packet[3], + false); + + /* + * Continue with the standard ALPS protocol handling, + * but make sure we won't process it as an interleaved + * packet again, which may happen if all buttons are + * pressed. To avoid this let's reset the 4th bit which + * is normally 1. + */ + psmouse->packet[3] = psmouse->packet[6] & 0xf7; + psmouse->pktcnt = 4; + } + + return PSMOUSE_GOOD_DATA; +} + +static void alps_flush_packet(unsigned long data) +{ + struct psmouse *psmouse = (struct psmouse *)data; + + serio_pause_rx(psmouse->ps2dev.serio); + + if (psmouse->pktcnt == 6) { + + /* + * We did not any more data in reasonable amount of time. + * Validate the last 3 bytes and process as a standard + * ALPS packet. + */ + if ((psmouse->packet[3] | + psmouse->packet[4] | + psmouse->packet[5]) & 0x80) { + dbg("refusing packet %x %x %x " + "(suspected interleaved ps/2)\n", + psmouse->packet[3], psmouse->packet[4], + psmouse->packet[5]); + } else { + alps_process_packet(psmouse); + } + psmouse->pktcnt = 0; + } + + serio_continue_rx(psmouse->ps2dev.serio); +} + static psmouse_ret_t alps_process_byte(struct psmouse *psmouse) { struct alps_data *priv = psmouse->private; + const struct alps_model_info *model = priv->i; if ((psmouse->packet[0] & 0xc8) == 0x08) { /* PS/2 packet */ if (psmouse->pktcnt == 3) { - alps_process_packet(psmouse); + alps_report_bare_ps2_packet(psmouse, psmouse->packet, + true); return PSMOUSE_FULL_PACKET; } return PSMOUSE_GOOD_DATA; } - if ((psmouse->packet[0] & priv->i->mask0) != priv->i->byte0) + /* Check for PS/2 packet stuffed in the middle of ALPS packet. */ + + if ((model->flags & ALPS_PS2_INTERLEAVED) && + psmouse->pktcnt >= 4 && (psmouse->packet[3] & 0x0f) == 0x0f) { + return alps_handle_interleaved_ps2(psmouse); + } + + if (!alps_is_valid_first_byte(model, psmouse->packet[0])) { + dbg("refusing packet[0] = %x (mask0 = %x, byte0 = %x)\n", + psmouse->packet[0], model->mask0, model->byte0); return PSMOUSE_BAD_DATA; + } /* Bytes 2 - 6 should have 0 in the highest bit */ if (psmouse->pktcnt >= 2 && psmouse->pktcnt <= 6 && - (psmouse->packet[psmouse->pktcnt - 1] & 0x80)) + (psmouse->packet[psmouse->pktcnt - 1] & 0x80)) { + dbg("refusing packet[%i] = %x\n", + psmouse->pktcnt - 1, psmouse->packet[psmouse->pktcnt - 1]); return PSMOUSE_BAD_DATA; + } if (psmouse->pktcnt == 6) { alps_process_packet(psmouse); @@ -441,6 +640,7 @@ static void alps_disconnect(struct psmouse *psmouse) struct alps_data *priv = psmouse->private; psmouse_reset(psmouse); + del_timer_sync(&priv->timer); input_unregister_device(priv->dev2); kfree(priv); } @@ -457,6 +657,8 @@ int alps_init(struct psmouse *psmouse) goto init_fail; priv->dev2 = dev2; + setup_timer(&priv->timer, alps_flush_packet, (unsigned long)psmouse); + psmouse->private = priv; if (alps_hw_init(psmouse, &version)) diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h index 4bbddc99962b..4b6024163d3c 100644 --- a/drivers/input/mouse/alps.h +++ b/drivers/input/mouse/alps.h @@ -23,6 +23,7 @@ struct alps_data { char phys[32]; /* Phys */ const struct alps_model_info *i;/* Info */ int prev_fin; /* Finger bit from previous packet */ + struct timer_list timer; }; #ifdef CONFIG_MOUSE_PS2_ALPS diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index 19984bf06cad..c65e24510494 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c @@ -652,6 +652,16 @@ static const struct dmi_system_id toshiba_dmi_table[] = { DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE M300"), }, + + }, + { + .ident = "Toshiba Portege M300", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Portable PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "Version 1.0"), + }, + }, { } }; diff --git a/drivers/input/touchscreen/mxc_ts.c b/drivers/input/touchscreen/mxc_ts.c index 6cce76f1494f..6146b27f01da 100644 --- a/drivers/input/touchscreen/mxc_ts.c +++ b/drivers/input/touchscreen/mxc_ts.c @@ -43,9 +43,6 @@ #include <linux/pmic_external.h> #include <linux/pmic_adc.h> #include <linux/kthread.h> -#ifdef CONFIG_EARLYSUSPEND -#include <linux/earlysuspend.h> -#endif #define MXC_TS_NAME "mxc_ts" @@ -63,30 +60,6 @@ static struct task_struct *tstask; static int calibration[7]; module_param_array(calibration, int, NULL, S_IRUGO | S_IWUSR); -#ifdef CONFIG_EARLYSUSPEND - -static wait_queue_head_t ts_wait; -static int ts_suspend; - -static void stop_ts_early_suspend(struct early_suspend *h) -{ - ts_suspend = 1; -} - -static void start_ts_late_resume(struct early_suspend *h) -{ - ts_suspend = 0; - wake_up_interruptible(&ts_wait); -} - -static struct early_suspend stop_ts_early_suspend_desc = { - .level = EARLY_SUSPEND_LEVEL_STOP_DRAWING, - .suspend = stop_ts_early_suspend, - .resume = start_ts_late_resume, -}; - -#endif - static int ts_thread(void *arg) { t_touch_screen ts_sample; @@ -96,9 +69,6 @@ static int ts_thread(void *arg) int x, y; static int last_x = -1, last_y = -1, last_press = -1; -#ifdef CONFIG_EARLYSUSPEND - wait_event_interruptible(ts_wait, !ts_suspend); -#endif memset(&ts_sample, 0, sizeof(t_touch_screen)); /* After 2 consecutive samples with the pen up, enable irq waiting */ @@ -112,7 +82,7 @@ static int ts_thread(void *arg) } if (ts_sample.x_position == 0 && ts_sample.y_position == 0 && - ts_sample.contact_resistance == 0) { + ts_sample.contact_resistance == 0) { x = last_x; y = last_y; } else if (calibration[6] == 0) { @@ -120,14 +90,14 @@ static int ts_thread(void *arg) y = ts_sample.y_position; } else { x = calibration[0] * (int)ts_sample.x_position + - calibration[1] * (int)ts_sample.y_position + - calibration[2]; + calibration[1] * (int)ts_sample.y_position + + calibration[2]; x /= calibration[6]; if (x < 0) x = 0; y = calibration[3] * (int)ts_sample.x_position + - calibration[4] * (int)ts_sample.y_position + - calibration[5]; + calibration[4] * (int)ts_sample.y_position + + calibration[5]; y /= calibration[6]; if (y < 0) y = 0; @@ -156,7 +126,7 @@ static int ts_thread(void *arg) /* report the BTN_TOUCH */ if (ts_sample.contact_resistance != last_press) input_event(mxc_inputdev, EV_KEY, - BTN_TOUCH, ts_sample.contact_resistance); + BTN_TOUCH, ts_sample.contact_resistance); input_sync(mxc_inputdev); last_press = ts_sample.contact_resistance; @@ -177,7 +147,8 @@ static int __init mxc_ts_init(void) mxc_inputdev = input_allocate_device(); if (!mxc_inputdev) { - printk(KERN_ERR "mxc_ts_init: not enough memory\n"); + printk(KERN_ERR + "mxc_ts_init: not enough memory\n"); return -ENOMEM; } @@ -194,14 +165,11 @@ static int __init mxc_ts_init(void) tstask = kthread_run(ts_thread, NULL, "mxc_ts"); if (IS_ERR(tstask)) { - printk(KERN_ERR "mxc_ts_init: failed to create kthread"); + printk(KERN_ERR + "mxc_ts_init: failed to create kthread"); tstask = NULL; return -1; } -#ifdef CONFIG_EARLYSUSPEND - init_waitqueue_head(&ts_wait); - register_early_suspend(&stop_ts_early_suspend_desc); -#endif printk("mxc input touchscreen loaded\n"); return 0; } @@ -217,9 +185,6 @@ static void __exit mxc_ts_exit(void) input_free_device(mxc_inputdev); mxc_inputdev = NULL; } -#ifdef CONFIG_EARLYSUSPEND - unregister_early_suspend(&stop_ts_early_suspend_desc); -#endif } late_initcall(mxc_ts_init); diff --git a/drivers/isdn/gigaset/interface.c b/drivers/isdn/gigaset/interface.c index 8ff7e35c7069..f33ac27de643 100644 --- a/drivers/isdn/gigaset/interface.c +++ b/drivers/isdn/gigaset/interface.c @@ -408,33 +408,28 @@ static int if_write_room(struct tty_struct *tty) return retval; } -/* FIXME: This function does not have error returns */ - static int if_chars_in_buffer(struct tty_struct *tty) { struct cardstate *cs; - int retval = -ENODEV; + int retval = 0; cs = (struct cardstate *) tty->driver_data; if (!cs) { pr_err("%s: no cardstate\n", __func__); - return -ENODEV; + return 0; } gig_dbg(DEBUG_IF, "%u: %s()", cs->minor_index, __func__); - if (mutex_lock_interruptible(&cs->mutex)) - return -ERESTARTSYS; // FIXME -EINTR? + mutex_lock(&cs->mutex); - if (!cs->connected) { + if (!cs->connected) gig_dbg(DEBUG_IF, "not connected"); - retval = -ENODEV; - } else if (!cs->open_count) + else if (!cs->open_count) dev_warn(cs->dev, "%s: device not opened\n", __func__); - else if (cs->mstate != MS_LOCKED) { + else if (cs->mstate != MS_LOCKED) dev_warn(cs->dev, "can't write to unlocked device\n"); - retval = -EBUSY; - } else + else retval = cs->ops->chars_in_buffer(cs); mutex_unlock(&cs->mutex); diff --git a/drivers/isdn/hisax/hfc_usb.c b/drivers/isdn/hisax/hfc_usb.c index 9de54202c90c..a420b64472e3 100644 --- a/drivers/isdn/hisax/hfc_usb.c +++ b/drivers/isdn/hisax/hfc_usb.c @@ -817,8 +817,8 @@ collect_rx_frame(usb_fifo * fifo, __u8 * data, int len, int finish) } /* we have a complete hdlc packet */ if (finish) { - if ((!fifo->skbuff->data[fifo->skbuff->len - 1]) - && (fifo->skbuff->len > 3)) { + if (fifo->skbuff->len > 3 && + !fifo->skbuff->data[fifo->skbuff->len - 1]) { if (fifon == HFCUSB_D_RX) { DBG(HFCUSB_DBG_DCHANNEL, diff --git a/drivers/isdn/i4l/isdn_ppp.c b/drivers/isdn/i4l/isdn_ppp.c index aa30b5cb3513..9a9dc3be1c49 100644 --- a/drivers/isdn/i4l/isdn_ppp.c +++ b/drivers/isdn/i4l/isdn_ppp.c @@ -1535,10 +1535,8 @@ static int isdn_ppp_mp_bundle_array_init(void) int sz = ISDN_MAX_CHANNELS*sizeof(ippp_bundle); if( (isdn_ppp_bundle_arr = kzalloc(sz, GFP_KERNEL)) == NULL ) return -ENOMEM; - for (i = 0; i < ISDN_MAX_CHANNELS; i++) { + for( i = 0; i < ISDN_MAX_CHANNELS; i++ ) spin_lock_init(&isdn_ppp_bundle_arr[i].lock); - skb_queue_head_init(&isdn_ppp_bundle_arr[i].frags); - } return 0; } @@ -1571,7 +1569,7 @@ static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to ) if ((lp->netdev->pb = isdn_ppp_mp_bundle_alloc()) == NULL) return -ENOMEM; lp->next = lp->last = lp; /* nobody else in a queue */ - skb_queue_head_init(&lp->netdev->pb->frags); + lp->netdev->pb->frags = NULL; lp->netdev->pb->frames = 0; lp->netdev->pb->seq = UINT_MAX; } @@ -1583,29 +1581,28 @@ static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to ) static u32 isdn_ppp_mp_get_seq( int short_seq, struct sk_buff * skb, u32 last_seq ); -static void isdn_ppp_mp_discard(ippp_bundle *mp, struct sk_buff *from, - struct sk_buff *to); -static void isdn_ppp_mp_reassembly(isdn_net_dev *net_dev, isdn_net_local *lp, - struct sk_buff *from, struct sk_buff *to, - u32 lastseq); -static void isdn_ppp_mp_free_skb(ippp_bundle *mp, struct sk_buff *skb); +static struct sk_buff * isdn_ppp_mp_discard( ippp_bundle * mp, + struct sk_buff * from, struct sk_buff * to ); +static void isdn_ppp_mp_reassembly( isdn_net_dev * net_dev, isdn_net_local * lp, + struct sk_buff * from, struct sk_buff * to ); +static void isdn_ppp_mp_free_skb( ippp_bundle * mp, struct sk_buff * skb ); static void isdn_ppp_mp_print_recv_pkt( int slot, struct sk_buff * skb ); static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, - struct sk_buff *skb) + struct sk_buff *skb) { - struct sk_buff *newfrag, *frag, *start, *nextf; - u32 newseq, minseq, thisseq; - isdn_mppp_stats *stats; struct ippp_struct *is; + isdn_net_local * lpq; + ippp_bundle * mp; + isdn_mppp_stats * stats; + struct sk_buff * newfrag, * frag, * start, *nextf; + u32 newseq, minseq, thisseq; unsigned long flags; - isdn_net_local *lpq; - ippp_bundle *mp; int slot; spin_lock_irqsave(&net_dev->pb->lock, flags); - mp = net_dev->pb; - stats = &mp->stats; + mp = net_dev->pb; + stats = &mp->stats; slot = lp->ppp_slot; if (slot < 0 || slot >= ISDN_MAX_CHANNELS) { printk(KERN_ERR "%s: lp->ppp_slot(%d)\n", @@ -1616,19 +1613,20 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, return; } is = ippp_table[slot]; - if (++mp->frames > stats->max_queue_len) + if( ++mp->frames > stats->max_queue_len ) stats->max_queue_len = mp->frames; if (is->debug & 0x8) isdn_ppp_mp_print_recv_pkt(lp->ppp_slot, skb); newseq = isdn_ppp_mp_get_seq(is->mpppcfg & SC_IN_SHORT_SEQ, - skb, is->last_link_seqno); + skb, is->last_link_seqno); + /* if this packet seq # is less than last already processed one, * toss it right away, but check for sequence start case first */ - if (mp->seq > MP_LONGSEQ_MAX && (newseq & MP_LONGSEQ_MAXBIT)) { + if( mp->seq > MP_LONGSEQ_MAX && (newseq & MP_LONGSEQ_MAXBIT) ) { mp->seq = newseq; /* the first packet: required for * rfc1990 non-compliant clients -- * prevents constant packet toss */ @@ -1659,31 +1657,22 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, * packets */ newfrag = skb; - /* Insert new fragment into the proper sequence slot. */ - skb_queue_walk(&mp->frags, frag) { - if (MP_SEQ(frag) == newseq) { - isdn_ppp_mp_free_skb(mp, newfrag); - newfrag = NULL; - break; - } - if (MP_LT(newseq, MP_SEQ(frag))) { - __skb_queue_before(&mp->frags, frag, newfrag); - newfrag = NULL; - break; - } - } - if (newfrag) - __skb_queue_tail(&mp->frags, newfrag); + /* if this new fragment is before the first one, then enqueue it now. */ + if ((frag = mp->frags) == NULL || MP_LT(newseq, MP_SEQ(frag))) { + newfrag->next = frag; + mp->frags = frag = newfrag; + newfrag = NULL; + } - frag = skb_peek(&mp->frags); - start = ((MP_FLAGS(frag) & MP_BEGIN_FRAG) && - (MP_SEQ(frag) == mp->seq)) ? frag : NULL; - if (!start) - goto check_overflow; + start = MP_FLAGS(frag) & MP_BEGIN_FRAG && + MP_SEQ(frag) == mp->seq ? frag : NULL; - /* main fragment traversing loop + /* + * main fragment traversing loop * * try to accomplish several tasks: + * - insert new fragment into the proper sequence slot (once that's done + * newfrag will be set to NULL) * - reassemble any complete fragment sequence (non-null 'start' * indicates there is a continguous sequence present) * - discard any incomplete sequences that are below minseq -- due @@ -1692,46 +1681,71 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, * come to complete such sequence and it should be discarded * * loop completes when we accomplished the following tasks: + * - new fragment is inserted in the proper sequence ('newfrag' is + * set to NULL) * - we hit a gap in the sequence, so no reassembly/processing is * possible ('start' would be set to NULL) * * algorithm for this code is derived from code in the book * 'PPP Design And Debugging' by James Carlson (Addison-Wesley) */ - skb_queue_walk_safe(&mp->frags, frag, nextf) { - thisseq = MP_SEQ(frag); - - /* check for misplaced start */ - if (start != frag && (MP_FLAGS(frag) & MP_BEGIN_FRAG)) { - printk(KERN_WARNING"isdn_mppp(seq %d): new " - "BEGIN flag with no prior END", thisseq); - stats->seqerrs++; - stats->frame_drops++; - isdn_ppp_mp_discard(mp, start, frag); - start = frag; - } else if (MP_LE(thisseq, minseq)) { - if (MP_FLAGS(frag) & MP_BEGIN_FRAG) + while (start != NULL || newfrag != NULL) { + + thisseq = MP_SEQ(frag); + nextf = frag->next; + + /* drop any duplicate fragments */ + if (newfrag != NULL && thisseq == newseq) { + isdn_ppp_mp_free_skb(mp, newfrag); + newfrag = NULL; + } + + /* insert new fragment before next element if possible. */ + if (newfrag != NULL && (nextf == NULL || + MP_LT(newseq, MP_SEQ(nextf)))) { + newfrag->next = nextf; + frag->next = nextf = newfrag; + newfrag = NULL; + } + + if (start != NULL) { + /* check for misplaced start */ + if (start != frag && (MP_FLAGS(frag) & MP_BEGIN_FRAG)) { + printk(KERN_WARNING"isdn_mppp(seq %d): new " + "BEGIN flag with no prior END", thisseq); + stats->seqerrs++; + stats->frame_drops++; + start = isdn_ppp_mp_discard(mp, start,frag); + nextf = frag->next; + } + } else if (MP_LE(thisseq, minseq)) { + if (MP_FLAGS(frag) & MP_BEGIN_FRAG) start = frag; - else { + else { if (MP_FLAGS(frag) & MP_END_FRAG) - stats->frame_drops++; - __skb_unlink(skb, &mp->frags); + stats->frame_drops++; + if( mp->frags == frag ) + mp->frags = nextf; isdn_ppp_mp_free_skb(mp, frag); + frag = nextf; continue; - } + } } - /* if we have end fragment, then we have full reassembly - * sequence -- reassemble and process packet now + /* if start is non-null and we have end fragment, then + * we have full reassembly sequence -- reassemble + * and process packet now */ - if (MP_FLAGS(frag) & MP_END_FRAG) { - minseq = mp->seq = (thisseq+1) & MP_LONGSEQ_MASK; - /* Reassemble the packet then dispatch it */ - isdn_ppp_mp_reassembly(net_dev, lp, start, frag, thisseq); + if (start != NULL && (MP_FLAGS(frag) & MP_END_FRAG)) { + minseq = mp->seq = (thisseq+1) & MP_LONGSEQ_MASK; + /* Reassemble the packet then dispatch it */ + isdn_ppp_mp_reassembly(net_dev, lp, start, nextf); - start = NULL; - frag = NULL; - } + start = NULL; + frag = NULL; + + mp->frags = nextf; + } /* check if need to update start pointer: if we just * reassembled the packet and sequence is contiguous @@ -1742,25 +1756,26 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, * below low watermark and set start to the next frag or * clear start ptr. */ - if (nextf != (struct sk_buff *)&mp->frags && + if (nextf != NULL && ((thisseq+1) & MP_LONGSEQ_MASK) == MP_SEQ(nextf)) { - /* if we just reassembled and the next one is here, - * then start another reassembly. - */ - if (frag == NULL) { + /* if we just reassembled and the next one is here, + * then start another reassembly. */ + + if (frag == NULL) { if (MP_FLAGS(nextf) & MP_BEGIN_FRAG) - start = nextf; - else { - printk(KERN_WARNING"isdn_mppp(seq %d):" - " END flag with no following " - "BEGIN", thisseq); + start = nextf; + else + { + printk(KERN_WARNING"isdn_mppp(seq %d):" + " END flag with no following " + "BEGIN", thisseq); stats->seqerrs++; } } - } else { - if (nextf != (struct sk_buff *)&mp->frags && - frag != NULL && - MP_LT(thisseq, minseq)) { + + } else { + if ( nextf != NULL && frag != NULL && + MP_LT(thisseq, minseq)) { /* we've got a break in the sequence * and we not at the end yet * and we did not just reassembled @@ -1769,39 +1784,41 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, * discard all the frames below low watermark * and start over */ stats->frame_drops++; - isdn_ppp_mp_discard(mp, start, nextf); + mp->frags = isdn_ppp_mp_discard(mp,start,nextf); } /* break in the sequence, no reassembly */ - start = NULL; - } - if (!start) - break; - } + start = NULL; + } + + frag = nextf; + } /* while -- main loop */ + + if (mp->frags == NULL) + mp->frags = frag; -check_overflow: /* rather straighforward way to deal with (not very) possible - * queue overflow - */ + * queue overflow */ if (mp->frames > MP_MAX_QUEUE_LEN) { stats->overflows++; - skb_queue_walk_safe(&mp->frags, frag, nextf) { - if (mp->frames <= MP_MAX_QUEUE_LEN) - break; - __skb_unlink(frag, &mp->frags); - isdn_ppp_mp_free_skb(mp, frag); + while (mp->frames > MP_MAX_QUEUE_LEN) { + frag = mp->frags->next; + isdn_ppp_mp_free_skb(mp, mp->frags); + mp->frags = frag; } } spin_unlock_irqrestore(&mp->lock, flags); } -static void isdn_ppp_mp_cleanup(isdn_net_local *lp) +static void isdn_ppp_mp_cleanup( isdn_net_local * lp ) { - struct sk_buff *skb, *tmp; - - skb_queue_walk_safe(&lp->netdev->pb->frags, skb, tmp) { - __skb_unlink(skb, &lp->netdev->pb->frags); - isdn_ppp_mp_free_skb(lp->netdev->pb, skb); - } + struct sk_buff * frag = lp->netdev->pb->frags; + struct sk_buff * nextfrag; + while( frag ) { + nextfrag = frag->next; + isdn_ppp_mp_free_skb(lp->netdev->pb, frag); + frag = nextfrag; + } + lp->netdev->pb->frags = NULL; } static u32 isdn_ppp_mp_get_seq( int short_seq, @@ -1838,115 +1855,72 @@ static u32 isdn_ppp_mp_get_seq( int short_seq, return seq; } -static void isdn_ppp_mp_discard(ippp_bundle *mp, struct sk_buff *from, - struct sk_buff *to) +struct sk_buff * isdn_ppp_mp_discard( ippp_bundle * mp, + struct sk_buff * from, struct sk_buff * to ) { - if (from) { - struct sk_buff *skb, *tmp; - int freeing = 0; - - skb_queue_walk_safe(&mp->frags, skb, tmp) { - if (skb == to) - break; - if (skb == from) - freeing = 1; - if (!freeing) - continue; - __skb_unlink(skb, &mp->frags); - isdn_ppp_mp_free_skb(mp, skb); + if( from ) + while (from != to) { + struct sk_buff * next = from->next; + isdn_ppp_mp_free_skb(mp, from); + from = next; } - } + return from; } -static unsigned int calc_tot_len(struct sk_buff_head *queue, - struct sk_buff *from, struct sk_buff *to) +void isdn_ppp_mp_reassembly( isdn_net_dev * net_dev, isdn_net_local * lp, + struct sk_buff * from, struct sk_buff * to ) { - unsigned int tot_len = 0; - struct sk_buff *skb; - int found_start = 0; - - skb_queue_walk(queue, skb) { - if (skb == from) - found_start = 1; - if (!found_start) - continue; - tot_len += skb->len - MP_HEADER_LEN; - if (skb == to) - break; - } - return tot_len; -} - -/* Reassemble packet using fragments in the reassembly queue from - * 'from' until 'to', inclusive. - */ -static void isdn_ppp_mp_reassembly(isdn_net_dev *net_dev, isdn_net_local *lp, - struct sk_buff *from, struct sk_buff *to, - u32 lastseq) -{ - ippp_bundle *mp = net_dev->pb; - unsigned int tot_len; - struct sk_buff *skb; + ippp_bundle * mp = net_dev->pb; int proto; + struct sk_buff * skb; + unsigned int tot_len; if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) { printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n", __func__, lp->ppp_slot); return; } - - tot_len = calc_tot_len(&mp->frags, from, to); - - if (MP_FLAGS(from) == (MP_BEGIN_FRAG | MP_END_FRAG)) { - if (ippp_table[lp->ppp_slot]->debug & 0x40) + if( MP_FLAGS(from) == (MP_BEGIN_FRAG | MP_END_FRAG) ) { + if( ippp_table[lp->ppp_slot]->debug & 0x40 ) printk(KERN_DEBUG "isdn_mppp: reassembly: frame %d, " - "len %d\n", MP_SEQ(from), from->len); + "len %d\n", MP_SEQ(from), from->len ); skb = from; skb_pull(skb, MP_HEADER_LEN); - __skb_unlink(skb, &mp->frags); mp->frames--; } else { - struct sk_buff *walk, *tmp; - int found_start = 0; + struct sk_buff * frag; + int n; - if (ippp_table[lp->ppp_slot]->debug & 0x40) - printk(KERN_DEBUG"isdn_mppp: reassembling frames %d " - "to %d, len %d\n", MP_SEQ(from), lastseq, - tot_len); + for(tot_len=n=0, frag=from; frag != to; frag=frag->next, n++) + tot_len += frag->len - MP_HEADER_LEN; - skb = dev_alloc_skb(tot_len); - if (!skb) + if( ippp_table[lp->ppp_slot]->debug & 0x40 ) + printk(KERN_DEBUG"isdn_mppp: reassembling frames %d " + "to %d, len %d\n", MP_SEQ(from), + (MP_SEQ(from)+n-1) & MP_LONGSEQ_MASK, tot_len ); + if( (skb = dev_alloc_skb(tot_len)) == NULL ) { printk(KERN_ERR "isdn_mppp: cannot allocate sk buff " - "of size %d\n", tot_len); - - found_start = 0; - skb_queue_walk_safe(&mp->frags, walk, tmp) { - if (walk == from) - found_start = 1; - if (!found_start) - continue; + "of size %d\n", tot_len); + isdn_ppp_mp_discard(mp, from, to); + return; + } - if (skb) { - unsigned int len = walk->len - MP_HEADER_LEN; - skb_copy_from_linear_data_offset(walk, MP_HEADER_LEN, - skb_put(skb, len), - len); - } - __skb_unlink(walk, &mp->frags); - isdn_ppp_mp_free_skb(mp, walk); + while( from != to ) { + unsigned int len = from->len - MP_HEADER_LEN; - if (walk == to) - break; + skb_copy_from_linear_data_offset(from, MP_HEADER_LEN, + skb_put(skb,len), + len); + frag = from->next; + isdn_ppp_mp_free_skb(mp, from); + from = frag; } } - if (!skb) - return; - proto = isdn_ppp_strip_proto(skb); isdn_ppp_push_higher(net_dev, lp, skb, proto); } -static void isdn_ppp_mp_free_skb(ippp_bundle *mp, struct sk_buff *skb) +static void isdn_ppp_mp_free_skb(ippp_bundle * mp, struct sk_buff * skb) { dev_kfree_skb(skb); mp->frames--; diff --git a/drivers/leds/leds-mxs-pwm.c b/drivers/leds/leds-mxs-pwm.c index a546900a44d0..c76821770446 100644 --- a/drivers/leds/leds-mxs-pwm.c +++ b/drivers/leds/leds-mxs-pwm.c @@ -165,35 +165,10 @@ static int __devexit mxs_pwm_led_remove(struct platform_device *pdev) return 0; } -#ifdef CONFIG_PM -static int mxs_led_suspend(struct platform_device *dev, pm_message_t state) -{ - int i; - - for (i = 0; i < leds.led_num; i++) - led_classdev_suspend(&leds.leds[i].dev); - return 0; -} - -static int mxs_led_resume(struct platform_device *dev) -{ - int i; - - for (i = 0; i < leds.led_num; i++) - led_classdev_resume(&leds.leds[i].dev); - return 0; -} -#else -#define mxs_led_suspend NULL -#define mxs_led_resume NULL -#endif - static struct platform_driver mxs_pwm_led_driver = { .probe = mxs_pwm_led_probe, .remove = __devexit_p(mxs_pwm_led_remove), - .suspend = mxs_led_suspend, - .resume = mxs_led_resume, .driver = { .name = "mxs-leds", }, diff --git a/drivers/macintosh/therm_adt746x.c b/drivers/macintosh/therm_adt746x.c index fde377c60cca..386a7972111d 100644 --- a/drivers/macintosh/therm_adt746x.c +++ b/drivers/macintosh/therm_adt746x.c @@ -79,6 +79,7 @@ struct thermostat { u8 limits[3]; int last_speed[2]; int last_var[2]; + int pwm_inv[2]; }; static enum {ADT7460, ADT7467} therm_type; @@ -124,6 +125,8 @@ read_reg(struct thermostat* th, int reg) return data; } +static struct i2c_driver thermostat_driver; + static int attach_thermostat(struct i2c_adapter *adapter) { @@ -148,7 +151,7 @@ attach_thermostat(struct i2c_adapter *adapter) * Let i2c-core delete that device on driver removal. * This is safe because i2c-core holds the core_lock mutex for us. */ - list_add_tail(&client->detected, &client->driver->clients); + list_add_tail(&client->detected, &thermostat_driver.clients); return 0; } @@ -227,19 +230,23 @@ static void write_fan_speed(struct thermostat *th, int speed, int fan) if (speed >= 0) { manual = read_reg(th, MANUAL_MODE[fan]); + manual &= ~INVERT_MASK; write_reg(th, MANUAL_MODE[fan], - (manual|MANUAL_MASK) & (~INVERT_MASK)); + manual | MANUAL_MASK | th->pwm_inv[fan]); write_reg(th, FAN_SPD_SET[fan], speed); } else { /* back to automatic */ if(therm_type == ADT7460) { manual = read_reg(th, MANUAL_MODE[fan]) & (~MANUAL_MASK); - + manual &= ~INVERT_MASK; + manual |= th->pwm_inv[fan]; write_reg(th, MANUAL_MODE[fan], manual|REM_CONTROL[fan]); } else { manual = read_reg(th, MANUAL_MODE[fan]); + manual &= ~INVERT_MASK; + manual |= th->pwm_inv[fan]; write_reg(th, MANUAL_MODE[fan], manual&(~AUTO_MASK)); } } @@ -416,6 +423,10 @@ static int probe_thermostat(struct i2c_client *client, thermostat = th; + /* record invert bit status because fw can corrupt it after suspend */ + th->pwm_inv[0] = read_reg(th, MANUAL_MODE[0]) & INVERT_MASK; + th->pwm_inv[1] = read_reg(th, MANUAL_MODE[1]) & INVERT_MASK; + /* be sure to really write fan speed the first time */ th->last_speed[0] = -2; th->last_speed[1] = -2; diff --git a/drivers/macintosh/therm_pm72.c b/drivers/macintosh/therm_pm72.c index a028598af2d3..ea32c7e5a9af 100644 --- a/drivers/macintosh/therm_pm72.c +++ b/drivers/macintosh/therm_pm72.c @@ -286,6 +286,8 @@ struct fcu_fan_table fcu_fans[] = { }, }; +static struct i2c_driver therm_pm72_driver; + /* * Utility function to create an i2c_client structure and * attach it to one of u3 adapters @@ -318,7 +320,7 @@ static struct i2c_client *attach_i2c_chip(int id, const char *name) * Let i2c-core delete that device on driver removal. * This is safe because i2c-core holds the core_lock mutex for us. */ - list_add_tail(&clt->detected, &clt->driver->clients); + list_add_tail(&clt->detected, &therm_pm72_driver.clients); return clt; } diff --git a/drivers/macintosh/via-pmu.c b/drivers/macintosh/via-pmu.c index b40fb9b6c862..6f308a4757ee 100644 --- a/drivers/macintosh/via-pmu.c +++ b/drivers/macintosh/via-pmu.c @@ -405,7 +405,11 @@ static int __init via_pmu_start(void) printk(KERN_ERR "via-pmu: can't map interrupt\n"); return -ENODEV; } - if (request_irq(irq, via_pmu_interrupt, 0, "VIA-PMU", (void *)0)) { + /* We set IRQF_TIMER because we don't want the interrupt to be disabled + * between the 2 passes of driver suspend, we control our own disabling + * for that one + */ + if (request_irq(irq, via_pmu_interrupt, IRQF_TIMER, "VIA-PMU", (void *)0)) { printk(KERN_ERR "via-pmu: can't request irq %d\n", irq); return -ENODEV; } @@ -419,7 +423,7 @@ static int __init via_pmu_start(void) gpio_irq = irq_of_parse_and_map(gpio_node, 0); if (gpio_irq != NO_IRQ) { - if (request_irq(gpio_irq, gpio1_interrupt, 0, + if (request_irq(gpio_irq, gpio1_interrupt, IRQF_TIMER, "GPIO1 ADB", (void *)0)) printk(KERN_ERR "pmu: can't get irq %d" " (GPIO1)\n", gpio_irq); @@ -925,8 +929,7 @@ proc_write_options(struct file *file, const char __user *buffer, #ifdef CONFIG_ADB /* Send an ADB command */ -static int -pmu_send_request(struct adb_request *req, int sync) +static int pmu_send_request(struct adb_request *req, int sync) { int i, ret; @@ -1005,16 +1008,11 @@ pmu_send_request(struct adb_request *req, int sync) } /* Enable/disable autopolling */ -static int -pmu_adb_autopoll(int devs) +static int __pmu_adb_autopoll(int devs) { struct adb_request req; - if ((vias == NULL) || (!pmu_fully_inited) || !pmu_has_adb) - return -ENXIO; - if (devs) { - adb_dev_map = devs; pmu_request(&req, NULL, 5, PMU_ADB_CMD, 0, 0x86, adb_dev_map >> 8, adb_dev_map); pmu_adb_flags = 2; @@ -1027,9 +1025,17 @@ pmu_adb_autopoll(int devs) return 0; } +static int pmu_adb_autopoll(int devs) +{ + if ((vias == NULL) || (!pmu_fully_inited) || !pmu_has_adb) + return -ENXIO; + + adb_dev_map = devs; + return __pmu_adb_autopoll(devs); +} + /* Reset the ADB bus */ -static int -pmu_adb_reset_bus(void) +static int pmu_adb_reset_bus(void) { struct adb_request req; int save_autopoll = adb_dev_map; @@ -1038,13 +1044,13 @@ pmu_adb_reset_bus(void) return -ENXIO; /* anyone got a better idea?? */ - pmu_adb_autopoll(0); + __pmu_adb_autopoll(0); - req.nbytes = 5; + req.nbytes = 4; req.done = NULL; req.data[0] = PMU_ADB_CMD; - req.data[1] = 0; - req.data[2] = ADB_BUSRESET; + req.data[1] = ADB_BUSRESET; + req.data[2] = 0; req.data[3] = 0; req.data[4] = 0; req.reply_len = 0; @@ -1056,7 +1062,7 @@ pmu_adb_reset_bus(void) pmu_wait_complete(&req); if (save_autopoll != 0) - pmu_adb_autopoll(save_autopoll); + __pmu_adb_autopoll(save_autopoll); return 0; } diff --git a/drivers/macintosh/windfarm_lm75_sensor.c b/drivers/macintosh/windfarm_lm75_sensor.c index 529886c7a826..ed6426a10773 100644 --- a/drivers/macintosh/windfarm_lm75_sensor.c +++ b/drivers/macintosh/windfarm_lm75_sensor.c @@ -115,6 +115,8 @@ static int wf_lm75_probe(struct i2c_client *client, return rc; } +static struct i2c_driver wf_lm75_driver; + static struct i2c_client *wf_lm75_create(struct i2c_adapter *adapter, u8 addr, int ds1775, const char *loc) @@ -157,7 +159,7 @@ static struct i2c_client *wf_lm75_create(struct i2c_adapter *adapter, * Let i2c-core delete that device on driver removal. * This is safe because i2c-core holds the core_lock mutex for us. */ - list_add_tail(&client->detected, &client->driver->clients); + list_add_tail(&client->detected, &wf_lm75_driver.clients); return client; fail: return NULL; diff --git a/drivers/macintosh/windfarm_max6690_sensor.c b/drivers/macintosh/windfarm_max6690_sensor.c index e2a55ecda2b2..a67b349319e9 100644 --- a/drivers/macintosh/windfarm_max6690_sensor.c +++ b/drivers/macintosh/windfarm_max6690_sensor.c @@ -88,6 +88,8 @@ static int wf_max6690_probe(struct i2c_client *client, return rc; } +static struct i2c_driver wf_max6690_driver; + static struct i2c_client *wf_max6690_create(struct i2c_adapter *adapter, u8 addr, const char *loc) { @@ -119,7 +121,7 @@ static struct i2c_client *wf_max6690_create(struct i2c_adapter *adapter, * Let i2c-core delete that device on driver removal. * This is safe because i2c-core holds the core_lock mutex for us. */ - list_add_tail(&client->detected, &client->driver->clients); + list_add_tail(&client->detected, &wf_max6690_driver.clients); return client; fail: diff --git a/drivers/macintosh/windfarm_smu_sat.c b/drivers/macintosh/windfarm_smu_sat.c index 5da729e58f99..e20330a28959 100644 --- a/drivers/macintosh/windfarm_smu_sat.c +++ b/drivers/macintosh/windfarm_smu_sat.c @@ -194,6 +194,8 @@ static struct wf_sensor_ops wf_sat_ops = { .owner = THIS_MODULE, }; +static struct i2c_driver wf_sat_driver; + static void wf_sat_create(struct i2c_adapter *adapter, struct device_node *dev) { struct i2c_board_info info; @@ -222,7 +224,7 @@ static void wf_sat_create(struct i2c_adapter *adapter, struct device_node *dev) * Let i2c-core delete that device on driver removal. * This is safe because i2c-core holds the core_lock mutex for us. */ - list_add_tail(&client->detected, &client->driver->clients); + list_add_tail(&client->detected, &wf_sat_driver.clients); } static int wf_sat_probe(struct i2c_client *client, diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 3319c2fec28e..0aee97a30b80 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c @@ -1077,23 +1077,31 @@ static bitmap_counter_t *bitmap_get_counter(struct bitmap *bitmap, * out to disk */ -void bitmap_daemon_work(struct bitmap *bitmap) +void bitmap_daemon_work(mddev_t *mddev) { + struct bitmap *bitmap; unsigned long j; unsigned long flags; struct page *page = NULL, *lastpage = NULL; int blocks; void *paddr; - if (bitmap == NULL) + /* Use a mutex to guard daemon_work against + * bitmap_destroy. + */ + mutex_lock(&mddev->bitmap_mutex); + bitmap = mddev->bitmap; + if (bitmap == NULL) { + mutex_unlock(&mddev->bitmap_mutex); return; + } if (time_before(jiffies, bitmap->daemon_lastrun + bitmap->daemon_sleep*HZ)) goto done; bitmap->daemon_lastrun = jiffies; if (bitmap->allclean) { bitmap->mddev->thread->timeout = MAX_SCHEDULE_TIMEOUT; - return; + goto done; } bitmap->allclean = 1; @@ -1202,6 +1210,7 @@ void bitmap_daemon_work(struct bitmap *bitmap) done: if (bitmap->allclean == 0) bitmap->mddev->thread->timeout = bitmap->daemon_sleep * HZ; + mutex_unlock(&mddev->bitmap_mutex); } static bitmap_counter_t *bitmap_get_counter(struct bitmap *bitmap, @@ -1538,9 +1547,9 @@ void bitmap_flush(mddev_t *mddev) */ sleep = bitmap->daemon_sleep; bitmap->daemon_sleep = 0; - bitmap_daemon_work(bitmap); - bitmap_daemon_work(bitmap); - bitmap_daemon_work(bitmap); + bitmap_daemon_work(mddev); + bitmap_daemon_work(mddev); + bitmap_daemon_work(mddev); bitmap->daemon_sleep = sleep; bitmap_update_sb(bitmap); } @@ -1571,6 +1580,7 @@ static void bitmap_free(struct bitmap *bitmap) kfree(bp); kfree(bitmap); } + void bitmap_destroy(mddev_t *mddev) { struct bitmap *bitmap = mddev->bitmap; @@ -1578,7 +1588,9 @@ void bitmap_destroy(mddev_t *mddev) if (!bitmap) /* there was no bitmap */ return; + mutex_lock(&mddev->bitmap_mutex); mddev->bitmap = NULL; /* disconnect from the md device */ + mutex_unlock(&mddev->bitmap_mutex); if (mddev->thread) mddev->thread->timeout = MAX_SCHEDULE_TIMEOUT; diff --git a/drivers/md/bitmap.h b/drivers/md/bitmap.h index e98900671ca9..7e38d13ddcac 100644 --- a/drivers/md/bitmap.h +++ b/drivers/md/bitmap.h @@ -282,7 +282,7 @@ void bitmap_close_sync(struct bitmap *bitmap); void bitmap_cond_end_sync(struct bitmap *bitmap, sector_t sector); void bitmap_unplug(struct bitmap *bitmap); -void bitmap_daemon_work(struct bitmap *bitmap); +void bitmap_daemon_work(mddev_t *mddev); #endif #endif diff --git a/drivers/md/dm-exception-store.c b/drivers/md/dm-exception-store.c index 556acff3952f..932d1b123143 100644 --- a/drivers/md/dm-exception-store.c +++ b/drivers/md/dm-exception-store.c @@ -155,7 +155,8 @@ static int set_chunk_size(struct dm_exception_store *store, char *value; chunk_size_ulong = simple_strtoul(chunk_size_arg, &value, 10); - if (*chunk_size_arg == '\0' || *value != '\0') { + if (*chunk_size_arg == '\0' || *value != '\0' || + chunk_size_ulong > UINT_MAX) { *error = "Invalid chunk size"; return -EINVAL; } @@ -171,34 +172,35 @@ static int set_chunk_size(struct dm_exception_store *store, */ chunk_size_ulong = round_up(chunk_size_ulong, PAGE_SIZE >> 9); - return dm_exception_store_set_chunk_size(store, chunk_size_ulong, + return dm_exception_store_set_chunk_size(store, + (unsigned) chunk_size_ulong, error); } int dm_exception_store_set_chunk_size(struct dm_exception_store *store, - unsigned long chunk_size_ulong, + unsigned chunk_size, char **error) { /* Check chunk_size is a power of 2 */ - if (!is_power_of_2(chunk_size_ulong)) { + if (!is_power_of_2(chunk_size)) { *error = "Chunk size is not a power of 2"; return -EINVAL; } /* Validate the chunk size against the device block size */ - if (chunk_size_ulong % (bdev_logical_block_size(store->cow->bdev) >> 9)) { + if (chunk_size % (bdev_logical_block_size(store->cow->bdev) >> 9)) { *error = "Chunk size is not a multiple of device blocksize"; return -EINVAL; } - if (chunk_size_ulong > INT_MAX >> SECTOR_SHIFT) { + if (chunk_size > INT_MAX >> SECTOR_SHIFT) { *error = "Chunk size is too high"; return -EINVAL; } - store->chunk_size = chunk_size_ulong; - store->chunk_mask = chunk_size_ulong - 1; - store->chunk_shift = ffs(chunk_size_ulong) - 1; + store->chunk_size = chunk_size; + store->chunk_mask = chunk_size - 1; + store->chunk_shift = ffs(chunk_size) - 1; return 0; } @@ -251,7 +253,7 @@ int dm_exception_store_create(struct dm_target *ti, int argc, char **argv, r = set_chunk_size(tmp_store, argv[2], &ti->error); if (r) - goto bad_cow; + goto bad_ctr; r = type->ctr(tmp_store, 0, NULL); if (r) { diff --git a/drivers/md/dm-exception-store.h b/drivers/md/dm-exception-store.h index 812c71872ba0..8a223a48802c 100644 --- a/drivers/md/dm-exception-store.h +++ b/drivers/md/dm-exception-store.h @@ -101,9 +101,9 @@ struct dm_exception_store { struct dm_dev *cow; /* Size of data blocks saved - must be a power of 2 */ - chunk_t chunk_size; - chunk_t chunk_mask; - chunk_t chunk_shift; + unsigned chunk_size; + unsigned chunk_mask; + unsigned chunk_shift; void *context; }; @@ -169,7 +169,7 @@ int dm_exception_store_type_register(struct dm_exception_store_type *type); int dm_exception_store_type_unregister(struct dm_exception_store_type *type); int dm_exception_store_set_chunk_size(struct dm_exception_store *store, - unsigned long chunk_size_ulong, + unsigned chunk_size, char **error); int dm_exception_store_create(struct dm_target *ti, int argc, char **argv, diff --git a/drivers/md/dm-log-userspace-base.c b/drivers/md/dm-log-userspace-base.c index 6e186b1a062d..7ac2c1450d10 100644 --- a/drivers/md/dm-log-userspace-base.c +++ b/drivers/md/dm-log-userspace-base.c @@ -156,7 +156,7 @@ static int userspace_ctr(struct dm_dirty_log *log, struct dm_target *ti, } /* The ptr value is sufficient for local unique id */ - lc->luid = (uint64_t)lc; + lc->luid = (unsigned long)lc; lc->ti = ti; @@ -582,7 +582,7 @@ static int userspace_status(struct dm_dirty_log *log, status_type_t status_type, break; case STATUSTYPE_TABLE: sz = 0; - table_args = strstr(lc->usr_argv_str, " "); + table_args = strchr(lc->usr_argv_str, ' '); BUG_ON(!table_args); /* There will always be a ' ' */ table_args++; diff --git a/drivers/md/dm-log-userspace-transfer.c b/drivers/md/dm-log-userspace-transfer.c index ba0edad2d048..54abf9e303b7 100644 --- a/drivers/md/dm-log-userspace-transfer.c +++ b/drivers/md/dm-log-userspace-transfer.c @@ -129,11 +129,13 @@ static int fill_pkg(struct cn_msg *msg, struct dm_ulog_request *tfr) * This is the connector callback that delivers data * that was sent from userspace. */ -static void cn_ulog_callback(void *data) +static void cn_ulog_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp) { - struct cn_msg *msg = (struct cn_msg *)data; struct dm_ulog_request *tfr = (struct dm_ulog_request *)(msg + 1); + if (!cap_raised(nsp->eff_cap, CAP_SYS_ADMIN)) + return; + spin_lock(&receiving_list_lock); if (msg->len == 0) fill_pkg(msg, NULL); diff --git a/drivers/md/dm-snap-persistent.c b/drivers/md/dm-snap-persistent.c index d5b2e08750d5..0c746420c008 100644 --- a/drivers/md/dm-snap-persistent.c +++ b/drivers/md/dm-snap-persistent.c @@ -284,12 +284,13 @@ static int read_header(struct pstore *ps, int *new_snapshot) { int r; struct disk_header *dh; - chunk_t chunk_size; + unsigned chunk_size; int chunk_size_supplied = 1; char *chunk_err; /* - * Use default chunk size (or hardsect_size, if larger) if none supplied + * Use default chunk size (or logical_block_size, if larger) + * if none supplied */ if (!ps->store->chunk_size) { ps->store->chunk_size = max(DM_CHUNK_SIZE_DEFAULT_SECTORS, @@ -334,10 +335,9 @@ static int read_header(struct pstore *ps, int *new_snapshot) return 0; if (chunk_size_supplied) - DMWARN("chunk size %llu in device metadata overrides " - "table chunk size of %llu.", - (unsigned long long)chunk_size, - (unsigned long long)ps->store->chunk_size); + DMWARN("chunk size %u in device metadata overrides " + "table chunk size of %u.", + chunk_size, ps->store->chunk_size); /* We had a bogus chunk_size. Fix stuff up. */ free_area(ps); @@ -345,8 +345,8 @@ static int read_header(struct pstore *ps, int *new_snapshot) r = dm_exception_store_set_chunk_size(ps->store, chunk_size, &chunk_err); if (r) { - DMERR("invalid on-disk chunk size %llu: %s.", - (unsigned long long)chunk_size, chunk_err); + DMERR("invalid on-disk chunk size %u: %s.", + chunk_size, chunk_err); return r; } diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c index 57f1bf7f3b7a..3a3ba46e6d4b 100644 --- a/drivers/md/dm-snap.c +++ b/drivers/md/dm-snap.c @@ -296,6 +296,7 @@ static void __insert_origin(struct origin *o) */ static int register_snapshot(struct dm_snapshot *snap) { + struct dm_snapshot *l; struct origin *o, *new_o; struct block_device *bdev = snap->origin->bdev; @@ -319,7 +320,11 @@ static int register_snapshot(struct dm_snapshot *snap) __insert_origin(o); } - list_add_tail(&snap->list, &o->snapshots); + /* Sort the list according to chunk size, largest-first smallest-last */ + list_for_each_entry(l, &o->snapshots, list) + if (l->store->chunk_size < snap->store->chunk_size) + break; + list_add_tail(&snap->list, &l->list); up_write(&_origins_lock); return 0; @@ -668,6 +673,11 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv) bio_list_init(&s->queued_bios); INIT_WORK(&s->queued_bios_work, flush_queued_bios); + if (!s->store->chunk_size) { + ti->error = "Chunk size not set"; + goto bad_load_and_register; + } + /* Add snapshot to the list of snapshots for this origin */ /* Exceptions aren't triggered till snapshot_resume() is called */ if (register_snapshot(s)) { @@ -951,7 +961,7 @@ static void start_copy(struct dm_snap_pending_exception *pe) src.bdev = bdev; src.sector = chunk_to_sector(s->store, pe->e.old_chunk); - src.count = min(s->store->chunk_size, dev_size - src.sector); + src.count = min((sector_t)s->store->chunk_size, dev_size - src.sector); dest.bdev = s->store->cow->bdev; dest.sector = chunk_to_sector(s->store, pe->e.new_chunk); @@ -1142,6 +1152,8 @@ static int snapshot_status(struct dm_target *ti, status_type_t type, unsigned sz = 0; struct dm_snapshot *snap = ti->private; + down_write(&snap->lock); + switch (type) { case STATUSTYPE_INFO: if (!snap->valid) @@ -1173,6 +1185,8 @@ static int snapshot_status(struct dm_target *ti, status_type_t type, break; } + up_write(&snap->lock); + return 0; } @@ -1388,7 +1402,7 @@ static void origin_resume(struct dm_target *ti) struct dm_dev *dev = ti->private; struct dm_snapshot *snap; struct origin *o; - chunk_t chunk_size = 0; + unsigned chunk_size = 0; down_read(&_origins_lock); o = __lookup_origin(dev->bdev); @@ -1465,7 +1479,7 @@ static int __init dm_snapshot_init(void) r = dm_register_target(&snapshot_target); if (r) { DMERR("snapshot target register failed %d", r); - return r; + goto bad_register_snapshot_target; } r = dm_register_target(&origin_target); @@ -1522,6 +1536,9 @@ bad2: dm_unregister_target(&origin_target); bad1: dm_unregister_target(&snapshot_target); + +bad_register_snapshot_target: + dm_exception_store_exit(); return r; } diff --git a/drivers/md/dm.c b/drivers/md/dm.c index b4845b14740d..ae087b0c49f9 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -47,6 +47,7 @@ struct dm_io { atomic_t io_count; struct bio *bio; unsigned long start_time; + spinlock_t endio_lock; }; /* @@ -576,8 +577,12 @@ static void dec_pending(struct dm_io *io, int error) struct mapped_device *md = io->md; /* Push-back supersedes any I/O errors */ - if (error && !(io->error > 0 && __noflush_suspending(md))) - io->error = error; + if (unlikely(error)) { + spin_lock_irqsave(&io->endio_lock, flags); + if (!(io->error > 0 && __noflush_suspending(md))) + io->error = error; + spin_unlock_irqrestore(&io->endio_lock, flags); + } if (atomic_dec_and_test(&io->io_count)) { if (io->error == DM_ENDIO_REQUEUE) { @@ -1224,6 +1229,7 @@ static void __split_and_process_bio(struct mapped_device *md, struct bio *bio) atomic_set(&ci.io->io_count, 1); ci.io->bio = bio; ci.io->md = md; + spin_lock_init(&ci.io->endio_lock); ci.sector = bio->bi_sector; ci.sector_count = bio_sectors(bio); if (unlikely(bio_empty_barrier(bio))) @@ -1819,6 +1825,7 @@ static struct mapped_device *alloc_dev(int minor) bad_bdev: destroy_workqueue(md->wq); bad_thread: + del_gendisk(md->disk); put_disk(md->disk); bad_disk: blk_cleanup_queue(md->queue); diff --git a/drivers/md/md.c b/drivers/md/md.c index 9dd872000cec..2938e9ca711e 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -276,7 +276,9 @@ static void mddev_put(mddev_t *mddev) if (!atomic_dec_and_lock(&mddev->active, &all_mddevs_lock)) return; if (!mddev->raid_disks && list_empty(&mddev->disks) && - !mddev->hold_active) { + mddev->ctime == 0 && !mddev->hold_active) { + /* Array is not configured at all, and not held active, + * so destroy it */ list_del(&mddev->all_mddevs); if (mddev->gendisk) { /* we did a probe so need to clean up. @@ -361,6 +363,7 @@ static mddev_t * mddev_find(dev_t unit) mutex_init(&new->open_mutex); mutex_init(&new->reconfig_mutex); + mutex_init(&new->bitmap_mutex); INIT_LIST_HEAD(&new->disks); INIT_LIST_HEAD(&new->all_mddevs); init_timer(&new->safemode_timer); @@ -5039,6 +5042,10 @@ static int set_array_info(mddev_t * mddev, mdu_array_info_t *info) mddev->minor_version = info->minor_version; mddev->patch_version = info->patch_version; mddev->persistent = !info->not_persistent; + /* ensure mddev_put doesn't delete this now that there + * is some minimal configuration. + */ + mddev->ctime = get_seconds(); return 0; } mddev->major_version = MD_MAJOR_VERSION; @@ -6495,8 +6502,9 @@ void md_do_sync(mddev_t *mddev) skip: mddev->curr_resync = 0; mddev->curr_resync_completed = 0; - mddev->resync_min = 0; - mddev->resync_max = MaxSector; + if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) + /* We completed so max setting can be forgotten. */ + mddev->resync_max = MaxSector; sysfs_notify(&mddev->kobj, NULL, "sync_completed"); wake_up(&resync_wait); set_bit(MD_RECOVERY_DONE, &mddev->recovery); @@ -6594,7 +6602,7 @@ void md_check_recovery(mddev_t *mddev) if (mddev->bitmap) - bitmap_daemon_work(mddev->bitmap); + bitmap_daemon_work(mddev); if (mddev->ro) return; diff --git a/drivers/md/md.h b/drivers/md/md.h index f8fc188bc762..d7aad830018e 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -289,6 +289,7 @@ struct mddev_s * hot-adding a bitmap. It should * eventually be settable by sysfs. */ + struct mutex bitmap_mutex; struct list_head all_mddevs; }; diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 8726fd7ebce5..d3e492e8781c 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -1643,11 +1643,12 @@ static void raid1d(mddev_t *mddev) r1_bio->sector, r1_bio->sectors); unfreeze_array(conf); - } + } else + md_error(mddev, + conf->mirrors[r1_bio->read_disk].rdev); bio = r1_bio->bios[r1_bio->read_disk]; - if ((disk=read_balance(conf, r1_bio)) == -1 || - disk == r1_bio->read_disk) { + if ((disk=read_balance(conf, r1_bio)) == -1) { printk(KERN_ALERT "raid1: %s: unrecoverable I/O" " read error for block %llu\n", bdevname(bio->bi_bdev,b), @@ -1676,6 +1677,7 @@ static void raid1d(mddev_t *mddev) generic_make_request(bio); } } + cond_resched(); } if (unplug) unplug_slaves(mddev); diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 3d9020cf6f6e..6a5a5fb18b30 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -1630,6 +1630,7 @@ static void raid10d(mddev_t *mddev) generic_make_request(bio); } } + cond_resched(); } if (unplug) unplug_slaves(mddev); diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index b8a2c5dc67ba..c339c8fdcbd5 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -3790,6 +3790,8 @@ static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped sector_nr = conf->reshape_progress; sector_div(sector_nr, new_data_disks); if (sector_nr) { + mddev->curr_resync_completed = sector_nr; + sysfs_notify(&mddev->kobj, NULL, "sync_completed"); *skipped = 1; return sector_nr; } diff --git a/drivers/media/common/tuners/mxl5007t.c b/drivers/media/common/tuners/mxl5007t.c index 2d02698d4f4f..7eb1bf75cd07 100644 --- a/drivers/media/common/tuners/mxl5007t.c +++ b/drivers/media/common/tuners/mxl5007t.c @@ -196,7 +196,7 @@ static void copy_reg_bits(struct reg_pair_t *reg_pair1, i = j = 0; while (reg_pair1[i].reg || reg_pair1[i].val) { - while (reg_pair2[j].reg || reg_pair2[j].reg) { + while (reg_pair2[j].reg || reg_pair2[j].val) { if (reg_pair1[i].reg != reg_pair2[j].reg) { j++; continue; diff --git a/drivers/media/common/tuners/tda18271-fe.c b/drivers/media/common/tuners/tda18271-fe.c index b10935630154..f446f9a18ef1 100644 --- a/drivers/media/common/tuners/tda18271-fe.c +++ b/drivers/media/common/tuners/tda18271-fe.c @@ -595,13 +595,13 @@ static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq) case RF2: map[i].rf_a1 = (prog_cal[RF2] - prog_tab[RF2] - prog_cal[RF1] + prog_tab[RF1]) / - ((rf_freq[RF2] - rf_freq[RF1]) / 1000); + (s32)((rf_freq[RF2] - rf_freq[RF1]) / 1000); map[i].rf2 = rf_freq[RF2] / 1000; break; case RF3: map[i].rf_a2 = (prog_cal[RF3] - prog_tab[RF3] - prog_cal[RF2] + prog_tab[RF2]) / - ((rf_freq[RF3] - rf_freq[RF2]) / 1000); + (s32)((rf_freq[RF3] - rf_freq[RF2]) / 1000); map[i].rf_b2 = prog_cal[RF2] - prog_tab[RF2]; map[i].rf3 = rf_freq[RF3] / 1000; break; @@ -963,12 +963,12 @@ static int tda18271_set_analog_params(struct dvb_frontend *fe, struct tda18271_std_map_item *map; char *mode; int ret; - u32 freq = params->frequency * 62500; + u32 freq = params->frequency * 125 * + ((params->mode == V4L2_TUNER_RADIO) ? 1 : 1000) / 2; priv->mode = TDA18271_ANALOG; if (params->mode == V4L2_TUNER_RADIO) { - freq = freq / 1000; map = &std_map->fm_radio; mode = "fm"; } else if (params->std & V4L2_STD_MN) { diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c index 26690dfb3260..4d0c8d56047c 100644 --- a/drivers/media/dvb/dvb-usb/af9015.c +++ b/drivers/media/dvb/dvb-usb/af9015.c @@ -1266,6 +1266,7 @@ static struct usb_device_id af9015_usb_table[] = { {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_CONCEPTRONIC_CTVDIGRCU)}, {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_MC810)}, {USB_DEVICE(USB_VID_KYE, USB_PID_GENIUS_TVGO_DVB_T03)}, +/* 25 */{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U_2)}, {0}, }; MODULE_DEVICE_TABLE(usb, af9015_usb_table); @@ -1346,7 +1347,8 @@ static struct dvb_usb_device_properties af9015_properties[] = { { .name = "KWorld PlusTV Dual DVB-T Stick " \ "(DVB-T 399U)", - .cold_ids = {&af9015_usb_table[4], NULL}, + .cold_ids = {&af9015_usb_table[4], + &af9015_usb_table[25], NULL}, .warm_ids = {NULL}, }, { diff --git a/drivers/media/dvb/dvb-usb/cxusb.c b/drivers/media/dvb/dvb-usb/cxusb.c index 406d7fba369d..f32b332ba76d 100644 --- a/drivers/media/dvb/dvb-usb/cxusb.c +++ b/drivers/media/dvb/dvb-usb/cxusb.c @@ -663,6 +663,14 @@ static struct zl10353_config cxusb_zl10353_xc3028_config = { .parallel_ts = 1, }; +static struct zl10353_config cxusb_zl10353_xc3028_config_no_i2c_gate = { + .demod_address = 0x0f, + .if2 = 45600, + .no_tuner = 1, + .parallel_ts = 1, + .disable_i2c_gate_ctrl = 1, +}; + static struct mt352_config cxusb_mt352_xc3028_config = { .demod_address = 0x0f, .if2 = 4560, @@ -894,7 +902,7 @@ static int cxusb_dualdig4_frontend_attach(struct dvb_usb_adapter *adap) cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1); if ((adap->fe = dvb_attach(zl10353_attach, - &cxusb_zl10353_xc3028_config, + &cxusb_zl10353_xc3028_config_no_i2c_gate, &adap->dev->i2c_adap)) == NULL) return -EIO; diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h index 9593b7289994..5ace1312c34c 100644 --- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h +++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h @@ -103,6 +103,7 @@ #define USB_PID_GRANDTEC_DVBT_USB_WARM 0x0fa1 #define USB_PID_INTEL_CE9500 0x9500 #define USB_PID_KWORLD_399U 0xe399 +#define USB_PID_KWORLD_399U_2 0xe400 #define USB_PID_KWORLD_395U 0xe396 #define USB_PID_KWORLD_395U_2 0xe39b #define USB_PID_KWORLD_395U_3 0xe395 diff --git a/drivers/media/dvb/frontends/dib7000p.c b/drivers/media/dvb/frontends/dib7000p.c index 8217e5b38f47..ac10fff61f3c 100644 --- a/drivers/media/dvb/frontends/dib7000p.c +++ b/drivers/media/dvb/frontends/dib7000p.c @@ -1344,6 +1344,11 @@ struct dvb_frontend * dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, if (dib7000p_identify(st) != 0) goto error; + /* FIXME: make sure the dev.parent field is initialized, or else + request_firmware() will hit an OOPS (this should be moved somewhere + more common) */ + st->i2c_master.gated_tuner_i2c_adap.dev.parent = i2c_adap->dev.parent; + dibx000_init_i2c_master(&st->i2c_master, DIB7000P, st->i2c_adap, st->i2c_addr); dib7000p_demod_reset(st); diff --git a/drivers/media/dvb/siano/smsusb.c b/drivers/media/dvb/siano/smsusb.c index cb8a358b7310..8f88a586b0dd 100644 --- a/drivers/media/dvb/siano/smsusb.c +++ b/drivers/media/dvb/siano/smsusb.c @@ -529,6 +529,12 @@ struct usb_device_id smsusb_id_table[] = { .driver_info = SMS1XXX_BOARD_SIANO_NICE }, { USB_DEVICE(0x187f, 0x0301), .driver_info = SMS1XXX_BOARD_SIANO_VENICE }, + { USB_DEVICE(0x2040, 0xb900), + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, + { USB_DEVICE(0x2040, 0xb910), + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, + { USB_DEVICE(0x2040, 0xc000), + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, { } /* Terminating entry */ }; diff --git a/drivers/media/radio/radio-gemtek-pci.c b/drivers/media/radio/radio-gemtek-pci.c index c3f579de6e71..c6cf11661868 100644 --- a/drivers/media/radio/radio-gemtek-pci.c +++ b/drivers/media/radio/radio-gemtek-pci.c @@ -181,12 +181,10 @@ static void gemtek_pci_mute(struct gemtek_pci *card) static void gemtek_pci_unmute(struct gemtek_pci *card) { - mutex_lock(&card->lock); if (card->mute) { gemtek_pci_setfrequency(card, card->current_frequency); card->mute = false; } - mutex_unlock(&card->lock); } static int gemtek_pci_getsignal(struct gemtek_pci *card) diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig index e7185d1cf281..c64c8d201262 100644 --- a/drivers/media/video/Kconfig +++ b/drivers/media/video/Kconfig @@ -592,17 +592,6 @@ config VIDEO_MXS_PXP To compile this driver as a module, choose M here: the module will be called pxp. -config VIDEO_MXC_PXP_V4L2 - tristate "MXC PxP V4L2 driver" - depends on VIDEO_DEV && VIDEO_V4L2 && ARCH_MX5 - select VIDEOBUF_DMA_CONTIG - ---help--- - This is a video4linux driver for the Freescale PxP - (Pixel Pipeline). This module supports output overlay of - the MXC framebuffer on a video stream. - - To compile this driver as a module, choose M here. - config VIDEO_MXC_OPL tristate depends on VIDEO_DEV && ARCH_MXC diff --git a/drivers/media/video/Makefile b/drivers/media/video/Makefile index a4de2a151253..49cb18802024 100644 --- a/drivers/media/video/Makefile +++ b/drivers/media/video/Makefile @@ -94,7 +94,6 @@ obj-$(CONFIG_VIDEO_MXC_CSI_CAMERA) += mxc/capture/ obj-$(CONFIG_VIDEO_MXC_IPU_OUTPUT) += mxc/output/ obj-$(CONFIG_VIDEO_MXC_IPUV1_WVGA_OUTPUT) += mxc/output/ obj-$(CONFIG_VIDEO_MXC_EMMA_OUTPUT) += mxc/output/ -obj-$(CONFIG_VIDEO_MXC_PXP_V4L2) += mxc/output/ obj-$(CONFIG_VIDEO_MXC_OPL) += mxc/opl/ obj-$(CONFIG_VIDEO_PXP) += pxp.o obj-$(CONFIG_VIDEO_MXS_PXP) += mxs_pxp.o diff --git a/drivers/media/video/bt8xx/bttv-driver.c b/drivers/media/video/bt8xx/bttv-driver.c index 8cc6dd28d6a7..b8e276c88353 100644 --- a/drivers/media/video/bt8xx/bttv-driver.c +++ b/drivers/media/video/bt8xx/bttv-driver.c @@ -1299,7 +1299,7 @@ set_tvnorm(struct bttv *btv, unsigned int norm) tvnorm = &bttv_tvnorms[norm]; - if (!memcmp(&bttv_tvnorms[btv->tvnorm].cropcap, &tvnorm->cropcap, + if (memcmp(&bttv_tvnorms[btv->tvnorm].cropcap, &tvnorm->cropcap, sizeof (tvnorm->cropcap))) { bttv_crop_reset(&btv->crop[0], norm); btv->crop[1] = btv->crop[0]; /* current = default */ @@ -3798,11 +3798,34 @@ bttv_irq_next_video(struct bttv *btv, struct bttv_buffer_set *set) if (!V4L2_FIELD_HAS_BOTH(item->vb.field) && (item->vb.queue.next != &btv->capture)) { item = list_entry(item->vb.queue.next, struct bttv_buffer, vb.queue); + /* Mike Isely <isely@pobox.com> - Only check + * and set up the bottom field in the logic + * below. Don't ever do the top field. This + * of course means that if we set up the + * bottom field in the above code that we'll + * actually skip a field. But that's OK. + * Having processed only a single buffer this + * time, then the next time around the first + * available buffer should be for a top field. + * That will then cause us here to set up a + * top then a bottom field in the normal way. + * The alternative to this understanding is + * that we set up the second available buffer + * as a top field, but that's out of order + * since this driver always processes the top + * field first - the effect will be the two + * buffers being returned in the wrong order, + * with the second buffer also being delayed + * by one field time (owing to the fifo nature + * of videobuf). Worse still, we'll be stuck + * doing fields out of order now every time + * until something else causes a field to be + * dropped. By effectively forcing a field to + * drop this way then we always get back into + * sync within a single frame time. (Out of + * order fields can screw up deinterlacing + * algorithms.) */ if (!V4L2_FIELD_HAS_BOTH(item->vb.field)) { - if (NULL == set->top && - V4L2_FIELD_TOP == item->vb.field) { - set->top = item; - } if (NULL == set->bottom && V4L2_FIELD_BOTTOM == item->vb.field) { set->bottom = item; diff --git a/drivers/media/video/em28xx/em28xx-audio.c b/drivers/media/video/em28xx/em28xx-audio.c index 7bd8a70f0a0b..ac947aecb9c3 100644 --- a/drivers/media/video/em28xx/em28xx-audio.c +++ b/drivers/media/video/em28xx/em28xx-audio.c @@ -383,6 +383,11 @@ static int snd_em28xx_hw_capture_free(struct snd_pcm_substream *substream) static int snd_em28xx_prepare(struct snd_pcm_substream *substream) { + struct em28xx *dev = snd_pcm_substream_chip(substream); + + dev->adev.hwptr_done_capture = 0; + dev->adev.capture_transfer_done = 0; + return 0; } diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c index 1c2e544eda73..ffe9306f5bb9 100644 --- a/drivers/media/video/em28xx/em28xx-cards.c +++ b/drivers/media/video/em28xx/em28xx-cards.c @@ -2170,8 +2170,6 @@ static int em28xx_hint_board(struct em28xx *dev) /* ----------------------------------------------------------------------- */ void em28xx_register_i2c_ir(struct em28xx *dev) { - struct i2c_board_info info; - struct IR_i2c_init_data init_data; const unsigned short addr_list[] = { 0x30, 0x47, I2C_CLIENT_END }; @@ -2179,9 +2177,9 @@ void em28xx_register_i2c_ir(struct em28xx *dev) if (disable_ir) return; - memset(&info, 0, sizeof(struct i2c_board_info)); - memset(&init_data, 0, sizeof(struct IR_i2c_init_data)); - strlcpy(info.type, "ir_video", I2C_NAME_SIZE); + memset(&dev->info, 0, sizeof(&dev->info)); + memset(&dev->init_data, 0, sizeof(dev->init_data)); + strlcpy(dev->info.type, "ir_video", I2C_NAME_SIZE); /* detect & configure */ switch (dev->model) { @@ -2191,19 +2189,19 @@ void em28xx_register_i2c_ir(struct em28xx *dev) break; case (EM2800_BOARD_TERRATEC_CINERGY_200): case (EM2820_BOARD_TERRATEC_CINERGY_250): - init_data.ir_codes = ir_codes_em_terratec; - init_data.get_key = em28xx_get_key_terratec; - init_data.name = "i2c IR (EM28XX Terratec)"; + dev->init_data.ir_codes = ir_codes_em_terratec; + dev->init_data.get_key = em28xx_get_key_terratec; + dev->init_data.name = "i2c IR (EM28XX Terratec)"; break; case (EM2820_BOARD_PINNACLE_USB_2): - init_data.ir_codes = ir_codes_pinnacle_grey; - init_data.get_key = em28xx_get_key_pinnacle_usb_grey; - init_data.name = "i2c IR (EM28XX Pinnacle PCTV)"; + dev->init_data.ir_codes = ir_codes_pinnacle_grey; + dev->init_data.get_key = em28xx_get_key_pinnacle_usb_grey; + dev->init_data.name = "i2c IR (EM28XX Pinnacle PCTV)"; break; case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2): - init_data.ir_codes = ir_codes_hauppauge_new; - init_data.get_key = em28xx_get_key_em_haup; - init_data.name = "i2c IR (EM2840 Hauppauge)"; + dev->init_data.ir_codes = ir_codes_hauppauge_new; + dev->init_data.get_key = em28xx_get_key_em_haup; + dev->init_data.name = "i2c IR (EM2840 Hauppauge)"; break; case (EM2820_BOARD_MSI_VOX_USB_2): break; @@ -2215,9 +2213,9 @@ void em28xx_register_i2c_ir(struct em28xx *dev) break; } - if (init_data.name) - info.platform_data = &init_data; - i2c_new_probed_device(&dev->i2c_adap, &info, addr_list); + if (dev->init_data.name) + dev->info.platform_data = &dev->init_data; + i2c_new_probed_device(&dev->i2c_adap, &dev->info, addr_list); } void em28xx_card_setup(struct em28xx *dev) diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c index d603575431b4..ec1d212f7e3a 100644 --- a/drivers/media/video/em28xx/em28xx-dvb.c +++ b/drivers/media/video/em28xx/em28xx-dvb.c @@ -591,6 +591,7 @@ static int dvb_fini(struct em28xx *dev) if (dev->dvb) { unregister_dvb(dev->dvb); + kfree(dev->dvb); dev->dvb = NULL; } diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h index a2add61f7d59..cb2a70a59a0f 100644 --- a/drivers/media/video/em28xx/em28xx.h +++ b/drivers/media/video/em28xx/em28xx.h @@ -595,6 +595,10 @@ struct em28xx { struct delayed_work sbutton_query_work; struct em28xx_dvb *dvb; + + /* I2C keyboard data */ + struct i2c_board_info info; + struct IR_i2c_init_data init_data; }; struct em28xx_ops { diff --git a/drivers/media/video/gspca/m5602/m5602_s5k4aa.c b/drivers/media/video/gspca/m5602/m5602_s5k4aa.c index 0163903d1c0f..3b159e4e69b1 100644 --- a/drivers/media/video/gspca/m5602/m5602_s5k4aa.c +++ b/drivers/media/video/gspca/m5602/m5602_s5k4aa.c @@ -35,12 +35,25 @@ static const struct dmi_system_id s5k4aa_vflip_dmi_table[] = { { + .ident = "BRUNEINIT", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "BRUNENIT"), + DMI_MATCH(DMI_PRODUCT_NAME, "BRUNENIT"), + DMI_MATCH(DMI_BOARD_VERSION, "00030D0000000001") + } + }, { .ident = "Fujitsu-Siemens Amilo Xa 2528", .matches = { DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xa 2528") } }, { + .ident = "Fujitsu-Siemens Amilo Xi 2528", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), + DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 2528") + } + }, { .ident = "Fujitsu-Siemens Amilo Xi 2550", .matches = { DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), @@ -51,6 +64,13 @@ static .matches = { DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star International"), DMI_MATCH(DMI_PRODUCT_NAME, "GX700"), + DMI_MATCH(DMI_BIOS_DATE, "12/02/2008") + } + }, { + .ident = "MSI GX700", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star International"), + DMI_MATCH(DMI_PRODUCT_NAME, "GX700"), DMI_MATCH(DMI_BIOS_DATE, "07/26/2007") } }, { diff --git a/drivers/media/video/gspca/ov519.c b/drivers/media/video/gspca/ov519.c index 2f6e135d94bc..557886522211 100644 --- a/drivers/media/video/gspca/ov519.c +++ b/drivers/media/video/gspca/ov519.c @@ -3364,6 +3364,7 @@ static const __devinitdata struct usb_device_id device_table[] = { {USB_DEVICE(0x041e, 0x4061), .driver_info = BRIDGE_OV519 }, {USB_DEVICE(0x041e, 0x4064), .driver_info = BRIDGE_OV519 | BRIDGE_INVERT_LED }, + {USB_DEVICE(0x041e, 0x4067), .driver_info = BRIDGE_OV519 }, {USB_DEVICE(0x041e, 0x4068), .driver_info = BRIDGE_OV519 | BRIDGE_INVERT_LED }, {USB_DEVICE(0x045e, 0x028c), .driver_info = BRIDGE_OV519 }, diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c index d6332ab80669..33f4d0a1f6fd 100644 --- a/drivers/media/video/gspca/sonixj.c +++ b/drivers/media/video/gspca/sonixj.c @@ -727,7 +727,7 @@ static const u8 ov7660_sensor_init[][8] = { {0xa1, 0x21, 0x12, 0x05, 0x00, 0x00, 0x00, 0x10}, /* Outformat = rawRGB */ {0xa1, 0x21, 0x13, 0xb8, 0x00, 0x00, 0x00, 0x10}, /* init COM8 */ - {0xd1, 0x21, 0x00, 0x01, 0x74, 0x74, 0x00, 0x10}, + {0xd1, 0x21, 0x00, 0x01, 0x74, 0x92, 0x00, 0x10}, /* GAIN BLUE RED VREF */ {0xd1, 0x21, 0x04, 0x00, 0x7d, 0x62, 0x00, 0x10}, /* COM 1 BAVE GEAVE AECHH */ @@ -783,7 +783,7 @@ static const u8 ov7660_sensor_init[][8] = { {0xc1, 0x21, 0x88, 0xaf, 0xc7, 0xdf, 0x00, 0x10}, /* gamma curve */ {0xc1, 0x21, 0x8b, 0x99, 0x99, 0xcf, 0x00, 0x10}, /* reserved */ {0xb1, 0x21, 0x92, 0x00, 0x00, 0x00, 0x00, 0x10}, /* DM_LNL/H */ - {0xb1, 0x21, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x10}, + {0xa1, 0x21, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x10}, /****** (some exchanges in the win trace) ******/ {0xa1, 0x21, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x10}, /* MVFP */ /* bits[3..0]reserved */ @@ -1145,17 +1145,12 @@ static int configure_gpio(struct gspca_dev *gspca_dev, reg_w1(gspca_dev, 0x01, 0x42); break; case SENSOR_OV7660: - reg_w1(gspca_dev, 0x01, 0x61); - reg_w1(gspca_dev, 0x17, 0x20); - reg_w1(gspca_dev, 0x01, 0x60); - reg_w1(gspca_dev, 0x01, 0x40); - break; case SENSOR_SP80708: reg_w1(gspca_dev, 0x01, 0x63); reg_w1(gspca_dev, 0x17, 0x20); reg_w1(gspca_dev, 0x01, 0x62); reg_w1(gspca_dev, 0x01, 0x42); - mdelay(100); + msleep(100); reg_w1(gspca_dev, 0x02, 0x62); break; /* case SENSOR_HV7131R: */ @@ -1624,6 +1619,8 @@ static void setvflip(struct sd *sd) static void setinfrared(struct sd *sd) { + if (sd->gspca_dev.ctrl_dis & (1 << INFRARED_IDX)) + return; /*fixme: different sequence for StarCam Clip and StarCam 370i */ /* Clip */ i2c_w1(&sd->gspca_dev, 0x02, /* gpio */ @@ -1637,16 +1634,19 @@ static void setfreq(struct gspca_dev *gspca_dev) if (gspca_dev->ctrl_dis & (1 << FREQ_IDX)) return; if (sd->sensor == SENSOR_OV7660) { + u8 com8; + + com8 = 0xdf; /* auto gain/wb/expo */ switch (sd->freq) { case 0: /* Banding filter disabled */ - i2c_w1(gspca_dev, 0x13, 0xdf); + i2c_w1(gspca_dev, 0x13, com8 | 0x20); break; case 1: /* 50 hz */ - i2c_w1(gspca_dev, 0x13, 0xff); + i2c_w1(gspca_dev, 0x13, com8); i2c_w1(gspca_dev, 0x3b, 0x0a); break; case 2: /* 60 hz */ - i2c_w1(gspca_dev, 0x13, 0xff); + i2c_w1(gspca_dev, 0x13, com8); i2c_w1(gspca_dev, 0x3b, 0x02); break; } @@ -1796,12 +1796,6 @@ static int sd_start(struct gspca_dev *gspca_dev) reg_w1(gspca_dev, 0x99, 0x60); break; case SENSOR_OV7660: - reg_w1(gspca_dev, 0x9a, 0x05); - if (sd->bridge == BRIDGE_SN9C105) - reg_w1(gspca_dev, 0x99, 0xff); - else - reg_w1(gspca_dev, 0x99, 0x5b); - break; case SENSOR_SP80708: reg_w1(gspca_dev, 0x9a, 0x05); reg_w1(gspca_dev, 0x99, 0x59); @@ -2325,18 +2319,19 @@ static const __devinitdata struct usb_device_id device_table[] = { {USB_DEVICE(0x0c45, 0x607c), BSI(SN9C102P, HV7131R, 0x11)}, /* {USB_DEVICE(0x0c45, 0x607e), BSI(SN9C102P, OV7630, 0x??)}, */ {USB_DEVICE(0x0c45, 0x60c0), BSI(SN9C105, MI0360, 0x5d)}, -/* {USB_DEVICE(0x0c45, 0x60c8), BSI(SN9C105, OM6801, 0x??)}, */ +/* {USB_DEVICE(0x0c45, 0x60c8), BSI(SN9C105, OM6802, 0x??)}, */ /* {USB_DEVICE(0x0c45, 0x60cc), BSI(SN9C105, HV7131GP, 0x??)}, */ {USB_DEVICE(0x0c45, 0x60ec), BSI(SN9C105, MO4000, 0x21)}, /* {USB_DEVICE(0x0c45, 0x60ef), BSI(SN9C105, ICM105C, 0x??)}, */ /* {USB_DEVICE(0x0c45, 0x60fa), BSI(SN9C105, OV7648, 0x??)}, */ {USB_DEVICE(0x0c45, 0x60fb), BSI(SN9C105, OV7660, 0x21)}, - {USB_DEVICE(0x0c45, 0x60fc), BSI(SN9C105, HV7131R, 0x11)}, #if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE + {USB_DEVICE(0x0c45, 0x60fc), BSI(SN9C105, HV7131R, 0x11)}, {USB_DEVICE(0x0c45, 0x60fe), BSI(SN9C105, OV7630, 0x21)}, #endif {USB_DEVICE(0x0c45, 0x6100), BSI(SN9C120, MI0360, 0x5d)}, /*sn9c128*/ -/* {USB_DEVICE(0x0c45, 0x6108), BSI(SN9C120, OM6801, 0x??)}, */ +/* {USB_DEVICE(0x0c45, 0x6102), BSI(SN9C120, PO2030N, ??)}, */ +/* {USB_DEVICE(0x0c45, 0x6108), BSI(SN9C120, OM6802, 0x21)}, */ {USB_DEVICE(0x0c45, 0x610a), BSI(SN9C120, OV7648, 0x21)}, /*sn9c128*/ {USB_DEVICE(0x0c45, 0x610b), BSI(SN9C120, OV7660, 0x21)}, /*sn9c128*/ {USB_DEVICE(0x0c45, 0x610c), BSI(SN9C120, HV7131R, 0x11)}, /*sn9c128*/ @@ -2352,6 +2347,7 @@ static const __devinitdata struct usb_device_id device_table[] = { #if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE {USB_DEVICE(0x0c45, 0x6130), BSI(SN9C120, MI0360, 0x5d)}, #endif +/* {USB_DEVICE(0x0c45, 0x6132), BSI(SN9C120, OV7670, 0x21)}, */ {USB_DEVICE(0x0c45, 0x6138), BSI(SN9C120, MO4000, 0x21)}, {USB_DEVICE(0x0c45, 0x613a), BSI(SN9C120, OV7648, 0x21)}, #if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE @@ -2359,7 +2355,9 @@ static const __devinitdata struct usb_device_id device_table[] = { #endif {USB_DEVICE(0x0c45, 0x613c), BSI(SN9C120, HV7131R, 0x11)}, {USB_DEVICE(0x0c45, 0x613e), BSI(SN9C120, OV7630, 0x21)}, - {USB_DEVICE(0x0c45, 0x6143), BSI(SN9C120, SP80708, 0x18)}, +/* {USB_DEVICE(0x0c45, 0x6142), BSI(SN9C120, PO2030N, ??)}, *sn9c120b*/ + {USB_DEVICE(0x0c45, 0x6143), BSI(SN9C120, SP80708, 0x18)}, /*sn9c120b*/ + {USB_DEVICE(0x0c45, 0x6148), BSI(SN9C120, OM6802, 0x21)}, /*sn9c120b*/ {} }; MODULE_DEVICE_TABLE(usb, device_table); diff --git a/drivers/media/video/mxc/capture/mxc_v4l2_capture.c b/drivers/media/video/mxc/capture/mxc_v4l2_capture.c index be9a988aff2f..0ab131d605a4 100644 --- a/drivers/media/video/mxc/capture/mxc_v4l2_capture.c +++ b/drivers/media/video/mxc/capture/mxc_v4l2_capture.c @@ -2244,7 +2244,7 @@ static int mxc_mmap(struct file *file, struct vm_area_struct *vma) return -EINTR; size = vma->vm_end - vma->vm_start; - vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); + vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, size, vma->vm_page_prot)) { diff --git a/drivers/media/video/mxc/capture/ov3640.c b/drivers/media/video/mxc/capture/ov3640.c index 899945b7d071..0169e0553ada 100644 --- a/drivers/media/video/mxc/capture/ov3640.c +++ b/drivers/media/video/mxc/capture/ov3640.c @@ -26,7 +26,7 @@ #define OV3640_VOLTAGE_ANALOG 2800000 #define OV3640_VOLTAGE_DIGITAL_CORE 1500000 #define OV3640_VOLTAGE_DIGITAL_IO 1800000 -#define OV3640_VOLTAGE_DIGITAL_GPO 2800000 + /* Check these values! */ #define MIN_FPS 15 @@ -1317,15 +1317,12 @@ static int ov3640_probe(struct i2c_client *client, gpo_regulator = regulator_get(&client->dev, plat_data->gpo_regulator); if (!IS_ERR(gpo_regulator)) { - regulator_set_voltage(gpo_regulator, - OV3640_VOLTAGE_DIGITAL_GPO, - OV3640_VOLTAGE_DIGITAL_GPO); if (regulator_enable(gpo_regulator) != 0) { - pr_err("%s:gpo enable error\n", __func__); + pr_err("%s:gpo3 enable error\n", __func__); goto err4; } else { dev_dbg(&client->dev, - "%s:gpo enable ok\n", __func__); + "%s:gpo3 enable ok\n", __func__); } } else gpo_regulator = NULL; diff --git a/drivers/media/video/mxc/output/Makefile b/drivers/media/video/mxc/output/Makefile index 500442544902..1713fa3bf3ab 100644 --- a/drivers/media/video/mxc/output/Makefile +++ b/drivers/media/video/mxc/output/Makefile @@ -6,9 +6,6 @@ endif ifeq ($(CONFIG_VIDEO_MXC_IPU_OUTPUT),y) obj-$(CONFIG_VIDEO_MXC_OUTPUT) += mxc_v4l2_output.o endif -ifeq ($(CONFIG_VIDEO_MXC_PXP_V4L2),y) - obj-$(CONFIG_VIDEO_MXC_PXP_V4L2) += mxc_pxp_v4l2.o -endif ifeq ($(CONFIG_VIDEO_MXC_IPUV1_WVGA_OUTPUT),y) obj-$(CONFIG_VIDEO_MXC_OUTPUT) += mx31_v4l2_wvga_output.o endif diff --git a/drivers/media/video/mxc/output/mxc_v4l2_output.c b/drivers/media/video/mxc/output/mxc_v4l2_output.c index b7bbfed73019..0567298dcb7e 100644 --- a/drivers/media/video/mxc/output/mxc_v4l2_output.c +++ b/drivers/media/video/mxc/output/mxc_v4l2_output.c @@ -245,7 +245,6 @@ static int select_display_buffer(vout_data *vout, int next_buf) { int ret = 0; - vout->disp_buf_num = next_buf; if (ipu_get_cur_buffer_idx(vout->display_ch, IPU_INPUT_BUFFER) != next_buf) ret = ipu_select_buffer(vout->display_ch, IPU_INPUT_BUFFER, @@ -290,9 +289,10 @@ static int finish_previous_frame(vout_data *vout) mm_segment_t old_fs; int ret = 0; - /* make sure buf[vout->disp_buf_num] in showing */ + /* make sure buf[next_done_ipu_buf] showed */ while (ipu_check_buffer_busy(vout->display_ch, - IPU_INPUT_BUFFER, vout->disp_buf_num)) { + IPU_INPUT_BUFFER, vout->next_done_ipu_buf)) { + /* wait for display frame finish */ if (fbi->fbops->fb_ioctl) { old_fs = get_fs(); set_fs(KERNEL_DS); @@ -303,7 +303,7 @@ static int finish_previous_frame(vout_data *vout) if (ret < 0) { /* ic_bypass need clear display buffer ready for next update*/ ipu_clear_buffer_ready(vout->display_ch, IPU_INPUT_BUFFER, - vout->disp_buf_num); + vout->next_done_ipu_buf); } } } @@ -318,9 +318,9 @@ static int show_current_frame(vout_data *vout) mm_segment_t old_fs; int ret = 0; - /* make sure buf[vout->disp_buf_num] begin to show */ + /* make sure buf[next_rdy_ipu_buf] begin to show */ if (ipu_get_cur_buffer_idx(vout->display_ch, IPU_INPUT_BUFFER) - != vout->disp_buf_num) { + != vout->next_rdy_ipu_buf) { /* wait for display frame finish */ if (fbi->fbops->fb_ioctl) { old_fs = get_fs(); @@ -334,10 +334,10 @@ static int show_current_frame(vout_data *vout) return ret; } -static void icbypass_work_func(struct work_struct *work) +static void timer_work_func(struct work_struct *work) { vout_data *vout = - container_of(work, vout_data, icbypass_work); + container_of(work, vout_data, timer_work); int index, ret; int last_buf; unsigned long lock_flags = 0; @@ -346,30 +346,34 @@ static void icbypass_work_func(struct work_struct *work) spin_lock_irqsave(&g_lock, lock_flags); - index = dequeue_buf(&vout->ready_q); - if (index == -1) { /* no buffers ready, should never occur */ - dev_err(&vout->video_dev->dev, - "mxc_v4l2out: timer - no queued buffers ready\n"); - goto exit; - } - g_buf_dq_cnt++; - vout->frame_count++; + if (g_buf_output_cnt == 0) { + ipu_select_buffer(vout->display_ch, IPU_INPUT_BUFFER, 1); + } else { + index = dequeue_buf(&vout->ready_q); + if (index == -1) { /* no buffers ready, should never occur */ + dev_err(&vout->video_dev->dev, + "mxc_v4l2out: timer - no queued buffers ready\n"); + goto exit; + } + g_buf_dq_cnt++; + vout->frame_count++; - vout->ipu_buf[vout->next_rdy_ipu_buf] = index; - ret = ipu_update_channel_buffer(vout->display_ch, IPU_INPUT_BUFFER, - vout->next_rdy_ipu_buf, - vout->v4l2_bufs[index].m.offset); - ret += select_display_buffer(vout, vout->next_rdy_ipu_buf); - if (ret < 0) { - dev_err(&vout->video_dev->dev, - "unable to update buffer %d address rc=%d\n", - vout->next_rdy_ipu_buf, ret); - goto exit; + vout->ipu_buf[vout->next_rdy_ipu_buf] = index; + ret = ipu_update_channel_buffer(vout->display_ch, IPU_INPUT_BUFFER, + vout->next_rdy_ipu_buf, + vout->v4l2_bufs[index].m.offset); + ret += select_display_buffer(vout, vout->next_rdy_ipu_buf); + if (ret < 0) { + dev_err(&vout->video_dev->dev, + "unable to update buffer %d address rc=%d\n", + vout->next_rdy_ipu_buf, ret); + goto exit; + } + spin_unlock_irqrestore(&g_lock, lock_flags); + show_current_frame(vout); + spin_lock_irqsave(&g_lock, lock_flags); + vout->next_rdy_ipu_buf = !vout->next_rdy_ipu_buf; } - spin_unlock_irqrestore(&g_lock, lock_flags); - show_current_frame(vout); - spin_lock_irqsave(&g_lock, lock_flags); - vout->next_rdy_ipu_buf = !vout->next_rdy_ipu_buf; last_buf = vout->ipu_buf[vout->next_done_ipu_buf]; if (last_buf != -1) { @@ -399,24 +403,6 @@ exit: spin_unlock_irqrestore(&g_lock, lock_flags); } -static int get_cur_fb_blank(vout_data *vout) -{ - struct fb_info *fbi = - registered_fb[vout->output_fb_num[vout->cur_disp_output]]; - mm_segment_t old_fs; - int ret = 0; - - if (fbi->fbops->fb_ioctl) { - old_fs = get_fs(); - set_fs(KERNEL_DS); - ret = fbi->fbops->fb_ioctl(fbi, MXCFB_GET_FB_BLANK, - (unsigned int)(&vout->fb_blank)); - set_fs(old_fs); - } - - return ret; -} - static void mxc_v4l2out_timer_handler(unsigned long arg) { int index, ret; @@ -450,22 +436,12 @@ static void mxc_v4l2out_timer_handler(unsigned long arg) /* Handle ic bypass mode in work queue */ if (vout->ic_bypass) { - if (queue_work(vout->v4l_wq, &vout->icbypass_work) == 0) { - dev_err(&vout->video_dev->dev, - "ic bypass work was in queue already!\n "); + if (queue_work(vout->v4l_wq, &vout->timer_work) == 0) { + dev_err(&vout->video_dev->dev, "work was in queue already!\n "); vout->state = STATE_STREAM_PAUSED; } goto exit0; - } else if (!vout->fb_blank && - (ipu_get_cur_buffer_idx(vout->display_ch, IPU_INPUT_BUFFER) - == vout->next_disp_ipu_buf)) { - dev_dbg(&vout->video_dev->dev, "IPU disp busy\n"); - get_cur_fb_blank(vout); - index = peek_next_buf(&vout->ready_q); - setup_next_buf_timer(vout, index); - goto exit0; } - vout->fb_blank = 0; /* Dequeue buffer and pass to IPU */ index = dequeue_buf(&vout->ready_q); @@ -547,13 +523,10 @@ static void mxc_v4l2out_timer_handler(unsigned long arg) goto exit0; } - /* Split mode use buf 0 only, no need swith buf */ + /* Non IC split action */ if (!vout->pp_split) vout->next_rdy_ipu_buf = !vout->next_rdy_ipu_buf; - /* Always assume display in double buffers */ - vout->next_disp_ipu_buf = !vout->next_disp_ipu_buf; - /* Setup timer for next buffer */ index = peek_next_buf(&vout->ready_q); if (index != -1) @@ -655,6 +628,13 @@ static irqreturn_t mxc_v4l2out_work_irq_handler(int irq, void *dev_id) if (ret < 0) dev_err(&vout->video_dev->dev, "unable to set IPU buffer ready\n"); + vout->next_rdy_ipu_buf = !vout->next_rdy_ipu_buf; + + } else {/* last stripe is done, run display refresh */ + select_display_buffer(vout, disp_buf_num); + vout->ipu_buf[vout->next_done_ipu_buf] = -1; + vout->next_done_ipu_buf = !vout->next_done_ipu_buf; + vout->next_rdy_ipu_buf = !vout->next_rdy_ipu_buf; } /* offset for next buffer's EBA */ @@ -696,8 +676,11 @@ static irqreturn_t mxc_v4l2out_work_irq_handler(int irq, void *dev_id) /* next stripe_buffer index 0..7 */ vout->pp_split_buf_num = (vout->pp_split_buf_num + vout->pp_split) & 0x7; + + } else { - disp_buf_num = vout->next_done_ipu_buf; + /* show to display */ + select_display_buffer(vout, vout->next_done_ipu_buf); ret += ipu_select_buffer(vout->display_input_ch, IPU_OUTPUT_BUFFER, vout->next_done_ipu_buf); } @@ -705,7 +688,6 @@ static irqreturn_t mxc_v4l2out_work_irq_handler(int irq, void *dev_id) /* release buffer. For split mode: if second stripe is done */ release_buffer = vout->pp_split ? (!(vout->pp_split_buf_num & 0x3)) : 1; if (release_buffer) { - select_display_buffer(vout, disp_buf_num); g_buf_output_cnt++; vout->v4l2_bufs[last_buf].flags = V4L2_BUF_FLAG_DONE; queue_buf(&vout->done_q, last_buf); @@ -715,9 +697,7 @@ static irqreturn_t mxc_v4l2out_work_irq_handler(int irq, void *dev_id) vout->ipu_buf_p[vout->next_done_ipu_buf] = -1; vout->ipu_buf_n[vout->next_done_ipu_buf] = -1; } - /* split mode use buf 0 only, no need switch buf */ - if (!vout->pp_split) - vout->next_done_ipu_buf = !vout->next_done_ipu_buf; + vout->next_done_ipu_buf = !vout->next_done_ipu_buf; } } /* end of last_buf != -1 */ @@ -950,9 +930,6 @@ static int init_PP(ipu_channel_params_t *params, vout_data *vout, u32 eba_offset; u16 x_pos; u16 y_pos; - dma_addr_t phy_addr0; - dma_addr_t phy_addr1; - eba_offset = 0; x_pos = 0; y_pos = 0; @@ -1042,12 +1019,6 @@ static int init_PP(ipu_channel_params_t *params, vout_data *vout, return -EINVAL; } - /* always enable double buffer */ - phy_addr0 = vout->v4l2_bufs[vout->ipu_buf[0]].m.offset; - if (vout->ipu_buf[1] == -1) - phy_addr1 = phy_addr0; - else - phy_addr1 = vout->v4l2_bufs[vout->ipu_buf[1]].m.offset; if (ipu_init_channel_buffer(vout->post_proc_ch, IPU_INPUT_BUFFER, params->mem_pp_mem.in_pixel_fmt, @@ -1057,8 +1028,8 @@ static int init_PP(ipu_channel_params_t *params, vout_data *vout, bytes_per_pixel(params->mem_pp_mem. in_pixel_fmt), IPU_ROTATE_NONE, - phy_addr0, - phy_addr1, + vout->v4l2_bufs[vout->ipu_buf[0]].m.offset, + vout->v4l2_bufs[vout->ipu_buf[1]].m.offset, vout->offset.u_offset, vout->offset.v_offset) != 0) { dev_err(dev, "Error initializing PP input buffer\n"); @@ -1223,10 +1194,8 @@ static int mxc_v4l2out_streamon(vout_data * vout) g_irq_cnt = g_buf_output_cnt = g_buf_q_cnt = g_buf_dq_cnt = 0; out_width = vout->crop_current.width; out_height = vout->crop_current.height; - vout->disp_buf_num = 0; vout->next_done_ipu_buf = 0; - vout->next_rdy_ipu_buf = vout->next_disp_ipu_buf = 1; - vout->fb_blank = 0; + vout->next_rdy_ipu_buf = 1; vout->pp_split = 0; ipu_ic_out_max_height_size = 1024; #ifdef CONFIG_MXC_IPU_V1 @@ -1241,12 +1210,12 @@ static int mxc_v4l2out_streamon(vout_data * vout) (out_height > ipu_ic_out_max_height_size)) vout->pp_split = 4; if (!INTERLACED_CONTENT(vout)) { + vout->next_done_ipu_buf = vout->next_rdy_ipu_buf = 0; vout->ipu_buf[0] = dequeue_buf(&vout->ready_q); /* split IC by two stripes, the by pass is impossible*/ if ((out_width != vout->v2f.fmt.pix.width || out_height != vout->v2f.fmt.pix.height) && vout->pp_split) { - vout->next_done_ipu_buf = vout->next_rdy_ipu_buf = 0; vout->ipu_buf[1] = vout->ipu_buf[0]; vout->frame_count = 1; if ((out_width > ipu_ic_out_max_width_size) && @@ -1257,8 +1226,8 @@ static int mxc_v4l2out_streamon(vout_data * vout) else vout->pp_split = 3; /*2 vertical stripes*/ } else { - vout->ipu_buf[1] = -1; - vout->frame_count = 1; + vout->ipu_buf[1] = dequeue_buf(&vout->ready_q); + vout->frame_count = 2; } } else if (!LOAD_3FIELDS(vout)) { vout->ipu_buf[0] = dequeue_buf(&vout->ready_q); @@ -1492,8 +1461,13 @@ static int mxc_v4l2out_streamon(vout_data * vout) ipu_enable_channel(MEM_VDI_PRP_VF_MEM_P); ipu_enable_channel(MEM_VDI_PRP_VF_MEM_N); ipu_select_multi_vdi_buffer(0); - } else + } else if (INTERLACED_CONTENT(vout)) { + ipu_select_buffer(vout->post_proc_ch, IPU_INPUT_BUFFER, 0); + } else { ipu_select_buffer(vout->post_proc_ch, IPU_INPUT_BUFFER, 0); + if (!vout->pp_split) + ipu_select_buffer(vout->post_proc_ch, IPU_INPUT_BUFFER, 1); + } ipu_select_buffer(vout->post_proc_ch, IPU_OUTPUT_BUFFER, 0); ipu_select_buffer(vout->post_proc_ch, IPU_OUTPUT_BUFFER, 1); #ifdef CONFIG_MXC_IPU_V1 @@ -1503,6 +1477,9 @@ static int mxc_v4l2out_streamon(vout_data * vout) ipu_update_channel_buffer(vout->display_ch, IPU_INPUT_BUFFER, 0, vout->v4l2_bufs[vout->ipu_buf[0]].m.offset); + ipu_update_channel_buffer(vout->display_ch, + IPU_INPUT_BUFFER, + 1, vout->v4l2_bufs[vout->ipu_buf[1]].m.offset); if (vout->offset.u_offset || vout->offset.v_offset) /* only update u/v offset */ ipu_update_channel_offset(vout->display_ch, @@ -1516,7 +1493,7 @@ static int mxc_v4l2out_streamon(vout_data * vout) 0, 0); ipu_select_buffer(vout->display_ch, IPU_INPUT_BUFFER, 0); - queue_work(vout->v4l_wq, &vout->icbypass_work); + queue_work(vout->v4l_wq, &vout->timer_work); } vout->start_jiffies = jiffies; @@ -1554,7 +1531,7 @@ static int mxc_v4l2out_streamoff(vout_data * vout) ipu_free_irq(vout->work_irq, vout); if (vout->ic_bypass) - cancel_work_sync(&vout->icbypass_work); + cancel_work_sync(&vout->timer_work); spin_lock_irqsave(&g_lock, lockflag); @@ -1915,7 +1892,7 @@ static int mxc_v4l2out_open(struct file *file) goto oops; } - INIT_WORK(&vout->icbypass_work, icbypass_work_func); + INIT_WORK(&vout->timer_work, timer_work_func); } file->private_data = dev; diff --git a/drivers/media/video/mxc/output/mxc_v4l2_output.h b/drivers/media/video/mxc/output/mxc_v4l2_output.h index c26194f5ff90..096dc3b17a06 100644 --- a/drivers/media/video/mxc/output/mxc_v4l2_output.h +++ b/drivers/media/video/mxc/output/mxc_v4l2_output.h @@ -79,9 +79,7 @@ typedef struct _vout_data { struct timer_list output_timer; struct workqueue_struct *v4l_wq; - struct work_struct icbypass_work; - int disp_buf_num; - int fb_blank; + struct work_struct timer_work; unsigned long start_jiffies; u32 frame_count; @@ -90,7 +88,6 @@ typedef struct _vout_data { s8 next_rdy_ipu_buf; s8 next_done_ipu_buf; - s8 next_disp_ipu_buf; s8 ipu_buf[2]; s8 ipu_buf_p[2]; s8 ipu_buf_n[2]; diff --git a/drivers/media/video/ov511.c b/drivers/media/video/ov511.c index 0bc2cf573c76..2bed9e22968b 100644 --- a/drivers/media/video/ov511.c +++ b/drivers/media/video/ov511.c @@ -5878,7 +5878,7 @@ ov51x_probe(struct usb_interface *intf, const struct usb_device_id *id) goto error; } - mutex_lock(&ov->lock); + mutex_unlock(&ov->lock); return 0; diff --git a/drivers/media/video/pwc/pwc-ctrl.c b/drivers/media/video/pwc/pwc-ctrl.c index 50b415e07eda..f7f7e04cf485 100644 --- a/drivers/media/video/pwc/pwc-ctrl.c +++ b/drivers/media/video/pwc/pwc-ctrl.c @@ -753,7 +753,7 @@ int pwc_set_shutter_speed(struct pwc_device *pdev, int mode, int value) buf[0] = 0xff; /* fixed */ ret = send_control_msg(pdev, - SET_LUM_CTL, SHUTTER_MODE_FORMATTER, &buf, sizeof(buf)); + SET_LUM_CTL, SHUTTER_MODE_FORMATTER, &buf, 1); if (!mode && ret >= 0) { if (value < 0) diff --git a/drivers/media/video/s2255drv.c b/drivers/media/video/s2255drv.c index 9e3262c0ba37..2c0bb06cab3b 100644 --- a/drivers/media/video/s2255drv.c +++ b/drivers/media/video/s2255drv.c @@ -598,11 +598,6 @@ static int s2255_got_frame(struct s2255_dev *dev, int chn, int jpgsize) buf = list_entry(dma_q->active.next, struct s2255_buffer, vb.queue); - if (!waitqueue_active(&buf->vb.done)) { - /* no one active */ - rc = -1; - goto unlock; - } list_del(&buf->vb.queue); do_gettimeofday(&buf->vb.ts); dprintk(100, "[%p/%d] wakeup\n", buf, buf->vb.i); diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c index 6eebe3ef97d3..52a79b3f8a4a 100644 --- a/drivers/media/video/saa7134/saa7134-cards.c +++ b/drivers/media/video/saa7134/saa7134-cards.c @@ -3373,6 +3373,7 @@ struct saa7134_board saa7134_boards[] = { .tuner_config = 3, .mpeg = SAA7134_MPEG_DVB, .ts_type = SAA7134_MPEG_TS_SERIAL, + .ts_force_val = 1, .gpiomask = 0x0800100, /* GPIO 21 is an INPUT */ .inputs = {{ .name = name_tv, diff --git a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c index 6e219c2db841..69e48ceee27f 100644 --- a/drivers/media/video/saa7134/saa7134-input.c +++ b/drivers/media/video/saa7134/saa7134-input.c @@ -684,8 +684,6 @@ void saa7134_input_fini(struct saa7134_dev *dev) void saa7134_probe_i2c_ir(struct saa7134_dev *dev) { - struct i2c_board_info info; - struct IR_i2c_init_data init_data; const unsigned short addr_list[] = { 0x7a, 0x47, 0x71, 0x2d, I2C_CLIENT_END @@ -705,32 +703,32 @@ void saa7134_probe_i2c_ir(struct saa7134_dev *dev) return; } - memset(&info, 0, sizeof(struct i2c_board_info)); - memset(&init_data, 0, sizeof(struct IR_i2c_init_data)); - strlcpy(info.type, "ir_video", I2C_NAME_SIZE); + memset(&dev->info, 0, sizeof(dev->info)); + memset(&dev->init_data, 0, sizeof(dev->init_data)); + strlcpy(dev->info.type, "ir_video", I2C_NAME_SIZE); switch (dev->board) { case SAA7134_BOARD_PINNACLE_PCTV_110i: case SAA7134_BOARD_PINNACLE_PCTV_310i: - init_data.name = "Pinnacle PCTV"; + dev->init_data.name = "Pinnacle PCTV"; if (pinnacle_remote == 0) { - init_data.get_key = get_key_pinnacle_color; - init_data.ir_codes = ir_codes_pinnacle_color; + dev->init_data.get_key = get_key_pinnacle_color; + dev->init_data.ir_codes = ir_codes_pinnacle_color; } else { - init_data.get_key = get_key_pinnacle_grey; - init_data.ir_codes = ir_codes_pinnacle_grey; + dev->init_data.get_key = get_key_pinnacle_grey; + dev->init_data.ir_codes = ir_codes_pinnacle_grey; } break; case SAA7134_BOARD_UPMOST_PURPLE_TV: - init_data.name = "Purple TV"; - init_data.get_key = get_key_purpletv; - init_data.ir_codes = ir_codes_purpletv; + dev->init_data.name = "Purple TV"; + dev->init_data.get_key = get_key_purpletv; + dev->init_data.ir_codes = ir_codes_purpletv; break; case SAA7134_BOARD_MSI_TVATANYWHERE_PLUS: - init_data.name = "MSI TV@nywhere Plus"; - init_data.get_key = get_key_msi_tvanywhere_plus; - init_data.ir_codes = ir_codes_msi_tvanywhere_plus; - info.addr = 0x30; + dev->init_data.name = "MSI TV@nywhere Plus"; + dev->init_data.get_key = get_key_msi_tvanywhere_plus; + dev->init_data.ir_codes = ir_codes_msi_tvanywhere_plus; + dev->info.addr = 0x30; /* MSI TV@nywhere Plus controller doesn't seem to respond to probes unless we read something from an existing device. Weird... @@ -741,9 +739,9 @@ void saa7134_probe_i2c_ir(struct saa7134_dev *dev) (1 == rc) ? "yes" : "no"); break; case SAA7134_BOARD_HAUPPAUGE_HVR1110: - init_data.name = "HVR 1110"; - init_data.get_key = get_key_hvr1110; - init_data.ir_codes = ir_codes_hauppauge_new; + dev->init_data.name = "HVR 1110"; + dev->init_data.get_key = get_key_hvr1110; + dev->init_data.ir_codes = ir_codes_hauppauge_new; break; case SAA7134_BOARD_BEHOLD_607FM_MK3: case SAA7134_BOARD_BEHOLD_607FM_MK5: @@ -757,26 +755,26 @@ void saa7134_probe_i2c_ir(struct saa7134_dev *dev) case SAA7134_BOARD_BEHOLD_M63: case SAA7134_BOARD_BEHOLD_M6_EXTRA: case SAA7134_BOARD_BEHOLD_H6: - init_data.name = "BeholdTV"; - init_data.get_key = get_key_beholdm6xx; - init_data.ir_codes = ir_codes_behold; + dev->init_data.name = "BeholdTV"; + dev->init_data.get_key = get_key_beholdm6xx; + dev->init_data.ir_codes = ir_codes_behold; break; case SAA7134_BOARD_AVERMEDIA_CARDBUS_501: case SAA7134_BOARD_AVERMEDIA_CARDBUS_506: - info.addr = 0x40; + dev->info.addr = 0x40; break; } - if (init_data.name) - info.platform_data = &init_data; + if (dev->init_data.name) + dev->info.platform_data = &dev->init_data; /* No need to probe if address is known */ - if (info.addr) { - i2c_new_device(&dev->i2c_adap, &info); + if (dev->info.addr) { + i2c_new_device(&dev->i2c_adap, &dev->info); return; } /* Address not known, fallback to probing */ - i2c_new_probed_device(&dev->i2c_adap, &info, addr_list); + i2c_new_probed_device(&dev->i2c_adap, &dev->info, addr_list); } static int saa7134_rc5_irq(struct saa7134_dev *dev) diff --git a/drivers/media/video/saa7134/saa7134-ts.c b/drivers/media/video/saa7134/saa7134-ts.c index 3fa652279ac0..03488ba4c99c 100644 --- a/drivers/media/video/saa7134/saa7134-ts.c +++ b/drivers/media/video/saa7134/saa7134-ts.c @@ -262,11 +262,13 @@ int saa7134_ts_start(struct saa7134_dev *dev) switch (saa7134_boards[dev->board].ts_type) { case SAA7134_MPEG_TS_PARALLEL: saa_writeb(SAA7134_TS_SERIAL0, 0x40); - saa_writeb(SAA7134_TS_PARALLEL, 0xec); + saa_writeb(SAA7134_TS_PARALLEL, 0xec | + (saa7134_boards[dev->board].ts_force_val << 4)); break; case SAA7134_MPEG_TS_SERIAL: saa_writeb(SAA7134_TS_SERIAL0, 0xd8); - saa_writeb(SAA7134_TS_PARALLEL, 0x6c); + saa_writeb(SAA7134_TS_PARALLEL, 0x6c | + (saa7134_boards[dev->board].ts_force_val << 4)); saa_writeb(SAA7134_TS_PARALLEL_SERIAL, 0xbc); saa_writeb(SAA7134_TS_SERIAL1, 0x02); break; diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h index fb564f14887c..f50734f39466 100644 --- a/drivers/media/video/saa7134/saa7134.h +++ b/drivers/media/video/saa7134/saa7134.h @@ -355,6 +355,7 @@ struct saa7134_board { enum saa7134_mpeg_type mpeg; enum saa7134_mpeg_ts_type ts_type; unsigned int vid_port_opts; + unsigned int ts_force_val:1; }; #define card_has_radio(dev) (NULL != saa7134_boards[dev->board].radio.name) @@ -584,6 +585,10 @@ struct saa7134_dev { int nosignal; unsigned int insuspend; + /* I2C keyboard data */ + struct i2c_board_info info; + struct IR_i2c_init_data init_data; + /* SAA7134_MPEG_* */ struct saa7134_ts ts; struct saa7134_dmaqueue ts_q; diff --git a/drivers/media/video/sn9c102/sn9c102_devtable.h b/drivers/media/video/sn9c102/sn9c102_devtable.h index 38a716020d7f..36ee43a9ee95 100644 --- a/drivers/media/video/sn9c102/sn9c102_devtable.h +++ b/drivers/media/video/sn9c102/sn9c102_devtable.h @@ -123,8 +123,8 @@ static const struct usb_device_id sn9c102_id_table[] = { { SN9C102_USB_DEVICE(0x0c45, 0x613b, BRIDGE_SN9C120), }, #if !defined CONFIG_USB_GSPCA && !defined CONFIG_USB_GSPCA_MODULE { SN9C102_USB_DEVICE(0x0c45, 0x613c, BRIDGE_SN9C120), }, -#endif { SN9C102_USB_DEVICE(0x0c45, 0x613e, BRIDGE_SN9C120), }, +#endif { } }; diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c index 04b47832fa0a..5a8a8d1cc9c0 100644 --- a/drivers/media/video/uvc/uvc_driver.c +++ b/drivers/media/video/uvc/uvc_driver.c @@ -46,6 +46,7 @@ unsigned int uvc_no_drop_param; static unsigned int uvc_quirks_param; unsigned int uvc_trace_param; +unsigned int uvc_timeout_param = UVC_CTRL_STREAMING_TIMEOUT; /* ------------------------------------------------------------------------ * Video formats @@ -2034,6 +2035,8 @@ module_param_named(quirks, uvc_quirks_param, uint, S_IRUGO|S_IWUSR); MODULE_PARM_DESC(quirks, "Forced device quirks"); module_param_named(trace, uvc_trace_param, uint, S_IRUGO|S_IWUSR); MODULE_PARM_DESC(trace, "Trace level bitmask"); +module_param_named(timeout, uvc_timeout_param, uint, S_IRUGO|S_IWUSR); +MODULE_PARM_DESC(timeout, "Streaming control requests timeout"); MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/drivers/media/video/uvc/uvc_video.c b/drivers/media/video/uvc/uvc_video.c index be99c8797dcc..f2480c35c265 100644 --- a/drivers/media/video/uvc/uvc_video.c +++ b/drivers/media/video/uvc/uvc_video.c @@ -130,7 +130,7 @@ static int uvc_get_video_ctrl(struct uvc_video_device *video, ret = __uvc_query_ctrl(video->dev, query, 0, video->streaming->intfnum, probe ? VS_PROBE_CONTROL : VS_COMMIT_CONTROL, data, size, - UVC_CTRL_STREAMING_TIMEOUT); + uvc_timeout_param); if ((query == GET_MIN || query == GET_MAX) && ret == 2) { /* Some cameras, mostly based on Bison Electronics chipsets, @@ -235,7 +235,7 @@ static int uvc_set_video_ctrl(struct uvc_video_device *video, ret = __uvc_query_ctrl(video->dev, SET_CUR, 0, video->streaming->intfnum, probe ? VS_PROBE_CONTROL : VS_COMMIT_CONTROL, data, size, - UVC_CTRL_STREAMING_TIMEOUT); + uvc_timeout_param); if (ret != size) { uvc_printk(KERN_ERR, "Failed to set UVC %s control : " "%d (exp. %u).\n", probe ? "probe" : "commit", @@ -707,10 +707,6 @@ static void uvc_video_complete(struct urb *urb) if ((ret = usb_submit_urb(urb, GFP_ATOMIC)) < 0) { uvc_printk(KERN_ERR, "Failed to resubmit video URB (%d).\n", ret); - if (ret == -ENODEV) { - uvc_queue_cancel(queue, 1); - return; - } } } diff --git a/drivers/media/video/uvc/uvcvideo.h b/drivers/media/video/uvc/uvcvideo.h index 3c78d3c1e4c0..3265fbf3fc96 100644 --- a/drivers/media/video/uvc/uvcvideo.h +++ b/drivers/media/video/uvc/uvcvideo.h @@ -304,7 +304,7 @@ struct uvc_xu_control { #define UVC_MAX_STATUS_SIZE 16 #define UVC_CTRL_CONTROL_TIMEOUT 300 -#define UVC_CTRL_STREAMING_TIMEOUT 1000 +#define UVC_CTRL_STREAMING_TIMEOUT 3000 /* Devices quirks */ #define UVC_QUIRK_STATUS_INTERVAL 0x00000001 @@ -695,6 +695,7 @@ struct uvc_driver { extern unsigned int uvc_no_drop_param; extern unsigned int uvc_trace_param; +extern unsigned int uvc_timeout_param; #define uvc_trace(flag, msg...) \ do { \ diff --git a/drivers/media/video/v4l1-compat.c b/drivers/media/video/v4l1-compat.c index 02f2a6d18b45..ec766937aff6 100644 --- a/drivers/media/video/v4l1-compat.c +++ b/drivers/media/video/v4l1-compat.c @@ -565,10 +565,9 @@ static noinline long v4l1_compat_get_input_info( break; } chan->norm = 0; - err = drv(file, VIDIOC_G_STD, &sid); - if (err < 0) - dprintk("VIDIOCGCHAN / VIDIOC_G_STD: %ld\n", err); - if (err == 0) { + /* Note: G_STD might not be present for radio receivers, + * so we should ignore any errors. */ + if (drv(file, VIDIOC_G_STD, &sid) == 0) { if (sid & V4L2_STD_PAL) chan->norm = VIDEO_MODE_PAL; if (sid & V4L2_STD_NTSC) @@ -777,10 +776,9 @@ static noinline long v4l1_compat_get_tuner( tun->flags |= VIDEO_TUNER_SECAM; } - err = drv(file, VIDIOC_G_STD, &sid); - if (err < 0) - dprintk("VIDIOCGTUNER / VIDIOC_G_STD: %ld\n", err); - if (err == 0) { + /* Note: G_STD might not be present for radio receivers, + * so we should ignore any errors. */ + if (drv(file, VIDIOC_G_STD, &sid) == 0) { if (sid & V4L2_STD_PAL) tun->mode = VIDEO_MODE_PAL; if (sid & V4L2_STD_NTSC) diff --git a/drivers/media/video/videobuf-dma-contig.c b/drivers/media/video/videobuf-dma-contig.c index dc4f32bbd83d..2ac8c2421ad2 100644 --- a/drivers/media/video/videobuf-dma-contig.c +++ b/drivers/media/video/videobuf-dma-contig.c @@ -319,7 +319,7 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q, mem->size = PAGE_ALIGN(q->bufs[first]->bsize); mem->vaddr = dma_alloc_coherent(q->dev, mem->size, - &mem->dma_handle, GFP_DMA); + &mem->dma_handle, GFP_KERNEL); if (!mem->vaddr) { dev_err(q->dev, "dma_alloc_coherent size %ld failed\n", mem->size); diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index 5d0ba4f5924c..9ad7bb4e721f 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c @@ -1015,9 +1015,9 @@ mpt_add_sge_64bit(void *pAddr, u32 flagslength, dma_addr_t dma_addr) { SGESimple64_t *pSge = (SGESimple64_t *) pAddr; pSge->Address.Low = cpu_to_le32 - (lower_32_bits((unsigned long)(dma_addr))); + (lower_32_bits(dma_addr)); pSge->Address.High = cpu_to_le32 - (upper_32_bits((unsigned long)dma_addr)); + (upper_32_bits(dma_addr)); pSge->FlagsLength = cpu_to_le32 ((flagslength | MPT_SGE_FLAGS_64_BIT_ADDRESSING)); } @@ -1038,8 +1038,8 @@ mpt_add_sge_64bit_1078(void *pAddr, u32 flagslength, dma_addr_t dma_addr) u32 tmp; pSge->Address.Low = cpu_to_le32 - (lower_32_bits((unsigned long)(dma_addr))); - tmp = (u32)(upper_32_bits((unsigned long)dma_addr)); + (lower_32_bits(dma_addr)); + tmp = (u32)(upper_32_bits(dma_addr)); /* * 1078 errata workaround for the 36GB limitation @@ -1101,7 +1101,7 @@ mpt_add_chain_64bit(void *pAddr, u8 next, u16 length, dma_addr_t dma_addr) pChain->NextChainOffset = next; pChain->Address.Low = cpu_to_le32(tmp); - tmp = (u32)(upper_32_bits((unsigned long)dma_addr)); + tmp = (u32)(upper_32_bits(dma_addr)); pChain->Address.High = cpu_to_le32(tmp); } diff --git a/drivers/mfd/ab3100-core.c b/drivers/mfd/ab3100-core.c index 13e7d7bfe85f..dd8b6b3ff1ea 100644 --- a/drivers/mfd/ab3100-core.c +++ b/drivers/mfd/ab3100-core.c @@ -643,7 +643,7 @@ struct ab3100_init_setting { u8 setting; }; -static const struct ab3100_init_setting __initdata +static const struct ab3100_init_setting __initconst ab3100_init_settings[] = { { .abreg = AB3100_MCA, diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 72c10192d802..281b61b3b5f3 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -13,10 +13,6 @@ menuconfig MISC_DEVICES if MISC_DEVICES -config ANDROID_PMEM - bool "Android pmem allocator" - default y - config ATMEL_PWM tristate "Atmel AT32/AT91 PWM support" depends on AVR32 || ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || ARCH_AT91CAP9 @@ -242,14 +238,6 @@ config MXS_PERSISTENT depends on ARCH_MXS default y -config UID_STAT - bool "UID based statistics tracking exported to /proc/uid_stat" - default n - -config FSL_CACHE - tristate "Freescale Cache manipulate driver" - default n - source "drivers/misc/c2port/Kconfig" source "drivers/misc/eeprom/Kconfig" source "drivers/misc/cb710/Kconfig" diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index c435ec82d664..03dd5ee05ce2 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -21,8 +21,5 @@ obj-$(CONFIG_HP_ILO) += hpilo.o obj-$(CONFIG_ISL29003) += isl29003.o obj-$(CONFIG_C2PORT) += c2port/ obj-$(CONFIG_MXS_PERSISTENT) += mxs-persistent.o -obj-$(CONFIG_ANDROID_PMEM) += pmem.o -obj-$(CONFIG_UID_STAT) += uid_stat.o -obj-$(CONFIG_FSL_CACHE) += fsl_cache.o obj-y += eeprom/ obj-y += cb710/ diff --git a/drivers/misc/enclosure.c b/drivers/misc/enclosure.c index 348443bdb23b..8393376b1080 100644 --- a/drivers/misc/enclosure.c +++ b/drivers/misc/enclosure.c @@ -362,6 +362,7 @@ static const char *const enclosure_status [] = { [ENCLOSURE_STATUS_NOT_INSTALLED] = "not installed", [ENCLOSURE_STATUS_UNKNOWN] = "unknown", [ENCLOSURE_STATUS_UNAVAILABLE] = "unavailable", + [ENCLOSURE_STATUS_MAX] = NULL, }; static const char *const enclosure_type [] = { diff --git a/drivers/misc/sgi-gru/gruprocfs.c b/drivers/misc/sgi-gru/gruprocfs.c index 9cbf95bedce6..de530d9942d2 100644 --- a/drivers/misc/sgi-gru/gruprocfs.c +++ b/drivers/misc/sgi-gru/gruprocfs.c @@ -161,14 +161,15 @@ static int options_show(struct seq_file *s, void *p) static ssize_t options_write(struct file *file, const char __user *userbuf, size_t count, loff_t *data) { - unsigned long val; - char buf[80]; + char buf[20]; - if (strncpy_from_user(buf, userbuf, sizeof(buf) - 1) < 0) + if (count >= sizeof(buf)) + return -EINVAL; + if (copy_from_user(buf, userbuf, count)) return -EFAULT; - buf[count - 1] = '\0'; - if (!strict_strtoul(buf, 10, &val)) - gru_options = val; + buf[count] = '\0'; + if (strict_strtoul(buf, 0, &gru_options)) + return -EINVAL; return count; } diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 2338c761c74f..abcd4392a8e9 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -179,11 +179,11 @@ static int mmc_read_ext_csd(struct mmc_card *card) err = mmc_send_ext_csd(card, ext_csd); if (err) { - /* - * We all hosts that cannot perform the command - * to fail more gracefully - */ - if (err != -EINVAL) + /* If the host or the card can't do the switch, + * fail more gracefully. */ + if ((err != -EINVAL) + && (err != -ENOSYS) + && (err != -EFAULT)) goto out; /* @@ -225,10 +225,6 @@ static int mmc_read_ext_csd(struct mmc_card *card) mmc_card_set_blockaddr(card); } - card->ext_csd.boot_info = ext_csd[EXT_CSD_BOOT_INFO]; - card->ext_csd.boot_size_mult = ext_csd[EXT_CSD_BOOT_SIZE_MULT]; - card->ext_csd.boot_config = ext_csd[EXT_CSD_BOOT_CONFIG]; - card->ext_csd.boot_bus_width = ext_csd[EXT_CSD_BOOT_BUS_WIDTH]; card->ext_csd.card_type = ext_csd[EXT_CSD_CARD_TYPE]; switch (ext_csd[EXT_CSD_CARD_TYPE]) { @@ -267,281 +263,6 @@ out: return err; } -/* configure the boot partitions */ -static ssize_t -setup_boot_partitions(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - int err, busy = 0; - u32 part, new_part; - u8 *ext_csd, boot_config; - struct mmc_command cmd; - struct mmc_card *card = container_of(dev, struct mmc_card, dev); - - BUG_ON(!card); - - sscanf(buf, "%d\n", &part); - - if (card->csd.mmca_vsn < CSD_SPEC_VER_4) { - printk(KERN_ERR "%s: invalid mmc version" - " mmc version is below version 4!)\n", - mmc_hostname(card->host)); - return -EINVAL; - } - - /* it's a normal SD/MMC but user request to configure boot partition */ - if (card->ext_csd.boot_size_mult <= 0) { - printk(KERN_ERR "%s: this is a normal SD/MMC card" - " but you request to access boot partition!\n", - mmc_hostname(card->host)); - return -EINVAL; - } - - ext_csd = kmalloc(512, GFP_KERNEL); - if (!ext_csd) { - printk(KERN_ERR "%s: could not allocate a buffer to " - "receive the ext_csd.\n", mmc_hostname(card->host)); - return -ENOMEM; - } - - mmc_claim_host(card->host); - err = mmc_send_ext_csd(card, ext_csd); - if (err) { - printk(KERN_ERR "%s: unable to read EXT_CSD.\n", - mmc_hostname(card->host)); - goto err_rtn; - } - - /* enable the boot partition in boot mode */ - /* boot enable be - - * 0x00 - disable boot enable. - * 0x08 - boot partition 1 is enabled for boot. - * 0x10 - boot partition 2 is enabled for boot. - * 0x38 - User area is enabled for boot. - */ - switch (part & EXT_CSD_BOOT_PARTITION_ENABLE_MASK) { - case 0: - boot_config = (ext_csd[EXT_CSD_BOOT_CONFIG] - & ~EXT_CSD_BOOT_PARTITION_ENABLE_MASK - & ~EXT_CSD_BOOT_ACK_ENABLE); - break; - case EXT_CSD_BOOT_PARTITION_PART1: - boot_config = ((ext_csd[EXT_CSD_BOOT_CONFIG] - & ~EXT_CSD_BOOT_PARTITION_ENABLE_MASK) - | EXT_CSD_BOOT_PARTITION_PART1 - | EXT_CSD_BOOT_ACK_ENABLE); - break; - case EXT_CSD_BOOT_PARTITION_PART2: - boot_config = ((ext_csd[EXT_CSD_BOOT_CONFIG] - & ~EXT_CSD_BOOT_PARTITION_ENABLE_MASK) - | EXT_CSD_BOOT_PARTITION_PART2 - | EXT_CSD_BOOT_ACK_ENABLE); - break; - case EXT_CSD_BOOT_PARTITION_ENABLE_MASK: - boot_config = ((ext_csd[EXT_CSD_BOOT_CONFIG] - | EXT_CSD_BOOT_PARTITION_ENABLE_MASK) - & ~EXT_CSD_BOOT_ACK_ENABLE); - break; - default: - printk(KERN_ERR "%s: wrong boot config parameter" - " 00 (disable boot), 08 (enable boot1)," - "16 (enable boot2), 56 (User area)\n", - mmc_hostname(card->host)); - err = -EINVAL; - goto err_rtn; - } - - /* switch the partitions that used to be accessed in OS layer */ - /* partition must be - - * 0 - user area - * 1 - boot partition 1 - * 2 - boot partition 2 - */ - if ((part & EXT_CSD_BOOT_PARTITION_ACCESS_MASK) > 2) { - printk(KERN_ERR "%s: wrong partition id" - " 0 (user area), 1 (boot1), 2 (boot2)\n", - mmc_hostname(card->host)); - err = -EINVAL; - goto err_rtn; - } - - /* Send SWITCH command to change partition for access */ - boot_config &= ~EXT_CSD_BOOT_PARTITION_ACCESS_MASK; - boot_config |= (part & EXT_CSD_BOOT_PARTITION_ACCESS_MASK); - err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, - EXT_CSD_BOOT_CONFIG, boot_config); - if (err) { - printk(KERN_ERR "%s: fail to send SWITCH command" - " to card to swich partition for access!\n", - mmc_hostname(card->host)); - goto err_rtn; - } - - /* waiting for the card to finish the busy state */ - do { - memset(&cmd, 0, sizeof(struct mmc_command)); - - cmd.opcode = MMC_SEND_STATUS; - cmd.arg = card->rca << 16; - cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; - - err = mmc_wait_for_cmd(card->host, &cmd, 0); - if (err || busy > 100) { - printk(KERN_ERR "%s: failed to wait for" - "the busy state to end.\n", - mmc_hostname(card->host)); - break; - } - - if (!busy && !(cmd.resp[0] & R1_READY_FOR_DATA)) { - printk(KERN_INFO "%s: card is in busy state" - "pls wait for busy state to end.\n", - mmc_hostname(card->host)); - } - busy++; - } while (!(cmd.resp[0] & R1_READY_FOR_DATA)); - - /* Now check whether it works */ - err = mmc_send_ext_csd(card, ext_csd); - if (err) { - printk(KERN_ERR "%s: %d unable to re-read EXT_CSD.\n", - mmc_hostname(card->host), err); - goto err_rtn; - } - - new_part = ext_csd[EXT_CSD_BOOT_CONFIG] & - EXT_CSD_BOOT_PARTITION_ACCESS_MASK; - if ((part & EXT_CSD_BOOT_PARTITION_ACCESS_MASK) != new_part) { - printk(KERN_ERR "%s: after SWITCH, current part id %d is not" - " same as requested partition %d!\n", - mmc_hostname(card->host), new_part, part); - goto err_rtn; - } - card->ext_csd.boot_config = ext_csd[EXT_CSD_BOOT_CONFIG]; - -err_rtn: - mmc_release_host(card->host); - kfree(ext_csd); - if (err) - return err; - else - return count; -} - -/* configure the boot bus */ -static ssize_t -setup_boot_bus(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - int err, busy = 0; - u32 boot_bus, new_bus; - u8 *ext_csd; - struct mmc_command cmd; - struct mmc_card *card = container_of(dev, struct mmc_card, dev); - - BUG_ON(!card); - - sscanf(buf, "%d\n", &boot_bus); - - if (card->csd.mmca_vsn < CSD_SPEC_VER_4) { - printk(KERN_ERR "%s: invalid mmc version" - " mmc version is below version 4!)\n", - mmc_hostname(card->host)); - return -EINVAL; - } - - /* it's a normal SD/MMC but user request to configure boot bus */ - if (card->ext_csd.boot_size_mult <= 0) { - printk(KERN_ERR "%s: this is a normal SD/MMC card" - " but you request to configure boot bus !\n", - mmc_hostname(card->host)); - return -EINVAL; - } - - ext_csd = kmalloc(512, GFP_KERNEL); - if (!ext_csd) { - printk(KERN_ERR "%s: could not allocate a buffer to " - "receive the ext_csd.\n", mmc_hostname(card->host)); - return -ENOMEM; - } - - mmc_claim_host(card->host); - err = mmc_send_ext_csd(card, ext_csd); - if (err) { - printk(KERN_ERR "%s: unable to read EXT_CSD.\n", - mmc_hostname(card->host)); - goto err_rtn; - } - - /* Configure the boot bus width when boot partition is enabled */ - if (((boot_bus & EXT_CSD_BOOT_BUS_WIDTH_MODE_MASK) >> 3) > 2 - || (boot_bus & EXT_CSD_BOOT_BUS_WIDTH_WIDTH_MASK) > 2 - || (boot_bus & ~EXT_CSD_BOOT_BUS_WIDTH_MASK) > 0) { - printk(KERN_ERR "%s: Invalid inputs!\n", - mmc_hostname(card->host)); - err = -EINVAL; - goto err_rtn; - } - - err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, - EXT_CSD_BOOT_BUS_WIDTH, boot_bus); - if (err) { - printk(KERN_ERR "%s: fail to send SWITCH command to " - "card to swich partition for access!\n", - mmc_hostname(card->host)); - goto err_rtn; - } - - /* waiting for the card to finish the busy state */ - do { - memset(&cmd, 0, sizeof(struct mmc_command)); - - cmd.opcode = MMC_SEND_STATUS; - cmd.arg = card->rca << 16; - cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; - - err = mmc_wait_for_cmd(card->host, &cmd, 0); - if (err || busy > 100) { - printk(KERN_ERR "%s: failed to wait for" - "the busy state to end.\n", - mmc_hostname(card->host)); - break; - } - - if (!busy && !(cmd.resp[0] & R1_READY_FOR_DATA)) { - printk(KERN_INFO "%s: card is in busy state" - "pls wait for busy state to end.\n", - mmc_hostname(card->host)); - } - busy++; - } while (!(cmd.resp[0] & R1_READY_FOR_DATA)); - - /* Now check whether it works */ - err = mmc_send_ext_csd(card, ext_csd); - if (err) { - printk(KERN_ERR "%s: %d unable to re-read EXT_CSD.\n", - mmc_hostname(card->host), err); - goto err_rtn; - } - - new_bus = ext_csd[EXT_CSD_BOOT_BUS_WIDTH]; - if (boot_bus != new_bus) { - printk(KERN_ERR "%s: after SWITCH, current boot bus mode %d" - " is not same as requested bus mode %d!\n", - mmc_hostname(card->host), new_bus, boot_bus); - goto err_rtn; - } - card->ext_csd.boot_bus_width = ext_csd[EXT_CSD_BOOT_BUS_WIDTH]; - -err_rtn: - mmc_release_host(card->host); - kfree(ext_csd); - if (err) - return err; - else - return count; -} - MMC_DEV_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1], card->raw_cid[2], card->raw_cid[3]); MMC_DEV_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1], @@ -553,12 +274,6 @@ MMC_DEV_ATTR(manfid, "0x%06x\n", card->cid.manfid); MMC_DEV_ATTR(name, "%s\n", card->cid.prod_name); MMC_DEV_ATTR(oemid, "0x%04x\n", card->cid.oemid); MMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial); -MMC_DEV_ATTR(boot_info, "boot_info:0x%02x; boot_size:%04dKB;" - " boot_partition:0x%02x; boot_bus:0x%02x\n", - card->ext_csd.boot_info, card->ext_csd.boot_size_mult * 128, - card->ext_csd.boot_config, card->ext_csd.boot_bus_width); -DEVICE_ATTR(boot_config, S_IWUGO, NULL, setup_boot_partitions); -DEVICE_ATTR(boot_bus_config, S_IWUGO, NULL, setup_boot_bus); static struct attribute *mmc_std_attrs[] = { &dev_attr_cid.attr, @@ -570,9 +285,6 @@ static struct attribute *mmc_std_attrs[] = { &dev_attr_name.attr, &dev_attr_oemid.attr, &dev_attr_serial.attr, - &dev_attr_boot_info.attr, - &dev_attr_boot_config.attr, - &dev_attr_boot_bus_config.attr, NULL, }; diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index 4a73e34f9200..c2a8cafd8276 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c @@ -210,11 +210,11 @@ static int mmc_read_switch(struct mmc_card *card) err = mmc_sd_switch(card, 0, 0, 1, status); if (err) { - /* - * We all hosts that cannot perform the command - * to fail more gracefully - */ - if (err != -EINVAL) + /* If the host or the card can't do the switch, + * fail more gracefully. */ + if ((err != -EINVAL) + && (err != -ENOSYS) + && (err != -EFAULT)) goto out; printk(KERN_WARNING "%s: problem reading switch " diff --git a/drivers/mmc/host/mx_sdhci.c b/drivers/mmc/host/mx_sdhci.c index 732135308eb6..0557d4d337c1 100644 --- a/drivers/mmc/host/mx_sdhci.c +++ b/drivers/mmc/host/mx_sdhci.c @@ -814,7 +814,6 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock) host->plat_data->clk_flg = 1; } } - if (clock == host->clock && !(ios.bus_width & MMC_BUS_WIDTH_DDR)) return; @@ -854,20 +853,85 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock) DBG("prescaler = 0x%x, divider = 0x%x\n", prescaler, div); clk |= (prescaler << 8) | (div << 4); - if (host->plat_data->clk_always_on - | (host->mmc->card && mmc_card_sdio(host->mmc->card))) - clk |= SDHCI_CLOCK_PER_EN | SDHCI_CLOCK_HLK_EN - | SDHCI_CLOCK_IPG_EN; - else - clk &= ~(SDHCI_CLOCK_PER_EN | SDHCI_CLOCK_HLK_EN - | SDHCI_CLOCK_IPG_EN); + /* Configure the DLL when DDR mode is enabled */ + if (ios.bus_width & MMC_BUS_WIDTH_DDR) { + /* Make sure that the PER, HLK, IPG are all enabled */ + writel(readl(host->ioaddr + SDHCI_CLOCK_CONTROL) + | SDHCI_CLOCK_IPG_EN + | SDHCI_CLOCK_HLK_EN + | SDHCI_CLOCK_PER_EN, + host->ioaddr + SDHCI_CLOCK_CONTROL); - /* Configure the clock delay line */ - if ((host->plat_data->vendor_ver >= ESDHC_VENDOR_V3) - && host->plat_data->dll_override_en) - writel((host->plat_data->dll_delay_cells << 10) - | DLL_CTRL_SLV_OVERRIDE, - host->ioaddr + SDHCI_DLL_CONTROL); + /* Enable the DLL and delay chain */ + writel(readl(host->ioaddr + SDHCI_DLL_CONTROL) + | DLL_CTRL_ENABLE, + host->ioaddr + SDHCI_DLL_CONTROL); + + timeout = 1000000; + while (timeout > 0) { + timeout--; + if (readl(host->ioaddr + SDHCI_DLL_STATUS) + & DLL_STS_REF_LOCK) + break; + else if (timeout == 0) + printk(KERN_ERR "DLL REF LOCK Timeout!\n"); + }; + DBG("dll stat: 0x%x\n", readl(host->ioaddr + SDHCI_DLL_STATUS)); + + writel(readl(host->ioaddr + SDHCI_DLL_CONTROL) + | DLL_CTRL_SLV_UP_INT | DLL_CTRL_REF_UP_INT + | DLL_CTRL_SLV_DLY_TAR, + host->ioaddr + SDHCI_DLL_CONTROL); + + timeout = 1000000; + while (timeout > 0) { + timeout--; + if (readl(host->ioaddr + SDHCI_DLL_STATUS) + & DLL_STS_SLV_LOCK) + break; + else if (timeout == 0) + printk(KERN_ERR "DLL SLV LOCK Timeout!\n"); + }; + + writel(readl(host->ioaddr + SDHCI_DLL_CONTROL) + | DLL_CTRL_SLV_FORCE_UPD, + host->ioaddr + SDHCI_DLL_CONTROL); + + writel(readl(host->ioaddr + SDHCI_DLL_CONTROL) + & (~DLL_CTRL_SLV_FORCE_UPD), + host->ioaddr + SDHCI_DLL_CONTROL); + + timeout = 1000000; + while (timeout > 0) { + timeout--; + if (readl(host->ioaddr + SDHCI_DLL_STATUS) + & DLL_STS_REF_LOCK) + break; + else if (timeout == 0) + printk(KERN_ERR "DLL REF LOCK Timeout!\n"); + }; + timeout = 1000000; + while (timeout > 0) { + timeout--; + if (readl(host->ioaddr + SDHCI_DLL_STATUS) + & DLL_STS_SLV_LOCK) + break; + else if (timeout == 0) + printk(KERN_ERR "DLL SLV LOCK Timeout!\n"); + }; + DBG("dll stat: 0x%x\n", readl(host->ioaddr + SDHCI_DLL_STATUS)); + + /* Let the PER, HLK, IPG to be auto-gate */ + writel(readl(host->ioaddr + SDHCI_CLOCK_CONTROL) + & ~(SDHCI_CLOCK_IPG_EN | SDHCI_CLOCK_HLK_EN + | SDHCI_CLOCK_PER_EN), + host->ioaddr + SDHCI_CLOCK_CONTROL); + + } else if (readl(host->ioaddr + SDHCI_DLL_STATUS) & DLL_STS_SLV_LOCK) { + /* reset DLL CTRL */ + writel(readl(host->ioaddr + SDHCI_DLL_CONTROL) | DLL_CTRL_RESET, + host->ioaddr + SDHCI_DLL_CONTROL); + } /* Configure the clock control register */ clk |= @@ -1093,7 +1157,7 @@ static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable) { struct sdhci_host *host; unsigned long flags; - u32 ier, prot, present; + u32 ier, prot, clk, present; host = mmc_priv(mmc); @@ -1106,12 +1170,19 @@ static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable) if (--(host->sdio_enable)) goto exit_unlock; } - - ier = readl(host->ioaddr + SDHCI_INT_ENABLE); + /* Enable the clock */ + if (!host->plat_data->clk_flg) { + clk_enable(host->clk); + host->plat_data->clk_flg = 1; + } + ier = readl(host->ioaddr + SDHCI_SIGNAL_ENABLE); prot = readl(host->ioaddr + SDHCI_HOST_CONTROL); + clk = readl(host->ioaddr + SDHCI_CLOCK_CONTROL); if (enable) { ier |= SDHCI_INT_CARD_INT; + prot |= SDHCI_CTRL_D3CD; + clk |= SDHCI_CLOCK_PER_EN | SDHCI_CLOCK_IPG_EN; present = readl(host->ioaddr + SDHCI_PRESENT_STATE); if ((present & SDHCI_CARD_INT_MASK) != SDHCI_CARD_INT_ID) writel(SDHCI_INT_CARD_INT, @@ -1119,24 +1190,12 @@ static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable) } else { ier &= ~SDHCI_INT_CARD_INT; prot &= ~SDHCI_CTRL_D3CD; + clk &= ~(SDHCI_CLOCK_PER_EN | SDHCI_CLOCK_IPG_EN); } writel(prot, host->ioaddr + SDHCI_HOST_CONTROL); - writel(ier, host->ioaddr + SDHCI_INT_ENABLE); writel(ier, host->ioaddr + SDHCI_SIGNAL_ENABLE); - - /* - * Using D3CD to manually driver the HW to re-sample the SDIO interrupt - * on bus one more time to guarantee the SDIO interrupt signal sent - * from card during the interrupt signal disabled period will not - * be lost. - */ - prot |= SDHCI_CTRL_CDSS; - writel(prot, host->ioaddr + SDHCI_HOST_CONTROL); - prot &= ~SDHCI_CTRL_D3CD; - writel(prot, host->ioaddr + SDHCI_HOST_CONTROL); - prot |= SDHCI_CTRL_D3CD; - writel(prot, host->ioaddr + SDHCI_HOST_CONTROL); + writel(clk, host->ioaddr + SDHCI_CLOCK_CONTROL); mmiowb(); exit_unlock: @@ -1262,7 +1321,7 @@ static void sdhci_tasklet_finish(unsigned long param) * The root cause is that the ROM code don't ensure * the SD/MMC clk is running when boot system. * */ - if (req_done && host->plat_data->clk_flg && + if (!machine_is_mx35_3ds() && req_done && host->plat_data->clk_flg && !(host->mmc && host->mmc->card && mmc_card_sdio(host->mmc->card))) { clk_disable(host->clk); host->plat_data->clk_flg = 0; @@ -1840,10 +1899,8 @@ static int __devinit sdhci_probe_slot(struct platform_device /* Get the SDHC clock from clock system APIs */ host->clk = clk_get(&pdev->dev, mmc_plat->clock_mmc); - if (NULL == host->clk) { + if (NULL == host->clk) printk(KERN_ERR "MXC MMC can't get clock.\n"); - goto out1; - } DBG("SDHC:%d clock:%lu\n", pdev->id, clk_get_rate(host->clk)); host->res = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -2057,6 +2114,9 @@ static int __devinit sdhci_probe_slot(struct platform_device } mxc_dma_callback_set(host->dma, sdhci_dma_irq, (void *)host); } +#ifdef CONFIG_MMC_DEBUG + sdhci_dumpregs(host); +#endif mmiowb(); diff --git a/drivers/mmc/host/mx_sdhci.h b/drivers/mmc/host/mx_sdhci.h index 83d02975ecd1..fa36dff0fd9a 100644 --- a/drivers/mmc/host/mx_sdhci.h +++ b/drivers/mmc/host/mx_sdhci.h @@ -69,7 +69,6 @@ #define SDHCI_CTRL_4BITBUS 0x00000002 #define SDHCI_CTRL_8BITBUS 0x00000004 #define SDHCI_CTRL_HISPD 0x00000004 -#define SDHCI_CTRL_CDSS 0x80 #define SDHCI_CTRL_DMA_MASK 0x18 #define SDHCI_CTRL_SDMA 0x00 #define SDHCI_CTRL_ADMA1 0x08 @@ -194,7 +193,6 @@ #define DLL_CTRL_ENABLE 0x00000001 #define DLL_CTRL_RESET 0x00000002 #define DLL_CTRL_SLV_FORCE_UPD 0x00000004 -#define DLL_CTRL_SLV_OVERRIDE 0x00000200 #define DLL_CTRL_SLV_DLY_TAR 0x00000000 #define DLL_CTRL_SLV_UP_INT 0x00200000 #define DLL_CTRL_REF_UP_INT 0x20000000 @@ -221,7 +219,6 @@ enum { #define SDHCI_SPEC_100 0 #define SDHCI_SPEC_200 1 #define ESDHC_VENDOR_V22 0x12 -#define ESDHC_VENDOR_V3 0x13 struct sdhci_chip; diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c index b7210b7d7af3..b849e873613b 100644 --- a/drivers/mmc/host/mxs-mmc.c +++ b/drivers/mmc/host/mxs-mmc.c @@ -49,7 +49,7 @@ #define MXS_MMC_DETECT_TIMEOUT (HZ/2) /* Max value supported for XFER_COUNT */ -#define SSP_BUFFER_SIZE (65535) +#define SSP_BUFFER_SIZE (65536) #ifndef BF #define BF(value, field) (((value) << BP_##field) & BM_##field) @@ -93,9 +93,6 @@ #define BF_SSP_BLOCK_SIZE_BLOCK_SIZE(v) \ (((v) << 16) & BM_SSP_BLOCK_SIZE_BLOCK_SIZE) #endif -#ifndef BM_SSP_CMD0_DBL_DATA_RATE_EN -#define BM_SSP_CMD0_DBL_DATA_RATE_EN 0x02000000 -#endif struct mxs_mmc_host { struct device *dev; @@ -162,7 +159,6 @@ static inline int mxs_mmc_is_plugged(struct mxs_mmc_host *host) return !(status & BM_SSP_STATUS_CARD_DETECT); } -static void mxs_mmc_reset(struct mxs_mmc_host *host); /* Card detection polling function */ static void mxs_mmc_detect_poll(unsigned long arg) { @@ -171,8 +167,6 @@ static void mxs_mmc_detect_poll(unsigned long arg) card_status = mxs_mmc_is_plugged(host); if (card_status != host->present) { - /* Reset MMC block */ - mxs_mmc_reset(host); host->present = card_status; mmc_detect_change(host->mmc, 0); } @@ -558,9 +552,6 @@ static void mxs_mmc_adtc(struct mxs_mmc_host *host) dev_dbg(host->dev, "%s blksz is 0x%x.\n", __func__, log2_block_size); if (ssp_ver_major > 3) { - /* Configure the CMD0 */ - ssp_cmd0 = BF(cmd->opcode, SSP_CMD0_CMD); - /* Configure the BLOCK SIZE and BLOCK COUNT */ if ((1<<log2_block_size) != cmd->data->blksz) { BUG_ON(cmd->data->blocks > 1); @@ -569,13 +560,9 @@ static void mxs_mmc_adtc(struct mxs_mmc_host *host) val = BF(log2_block_size, SSP_BLOCK_SIZE_BLOCK_SIZE) | BF(cmd->data->blocks - 1, SSP_BLOCK_SIZE_BLOCK_COUNT); __raw_writel(val, host->ssp_base + HW_SSP_BLOCK_SIZE); - if (host->mmc->ios.bus_width & MMC_BUS_WIDTH_DDR) - /* Enable the DDR mode */ - ssp_cmd0 |= BM_SSP_CMD0_DBL_DATA_RATE_EN; - else - ssp_cmd0 &= ~BM_SSP_CMD0_DBL_DATA_RATE_EN; - } + /* Configure the CMD0 */ + ssp_cmd0 = BF(cmd->opcode, SSP_CMD0_CMD); } else { if ((1<<log2_block_size) != cmd->data->blksz) { BUG_ON(cmd->data->blocks > 1); @@ -818,9 +805,9 @@ static void mxs_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) dev_warn(host->dev, "Platform does not support CMD pin pullup control\n"); - if ((ios->bus_width & ~MMC_BUS_WIDTH_DDR) == MMC_BUS_WIDTH_8) + if (ios->bus_width == MMC_BUS_WIDTH_8) host->bus_width = 2; - else if ((ios->bus_width & ~MMC_BUS_WIDTH_DDR) == MMC_BUS_WIDTH_4) + else if (ios->bus_width == MMC_BUS_WIDTH_4) host->bus_width = 1; else host->bus_width = 0; @@ -892,6 +879,7 @@ static void mxs_mmc_reset(struct mxs_mmc_host *host) /* Configure SSP Control Register 1 */ ssp_ctrl1 = BM_SSP_CTRL1_DMA_ENABLE | + BM_SSP_CTRL1_POLARITY | BM_SSP_CTRL1_RECV_TIMEOUT_IRQ_EN | BM_SSP_CTRL1_DATA_CRC_IRQ_EN | BM_SSP_CTRL1_DATA_TIMEOUT_IRQ_EN | diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c index e55ac792d68c..c8c0a7e4f0af 100644 --- a/drivers/mmc/host/pxamci.c +++ b/drivers/mmc/host/pxamci.c @@ -694,14 +694,14 @@ static int pxamci_remove(struct platform_device *pdev) if (mmc) { struct pxamci_host *host = mmc_priv(mmc); + mmc_remove_host(mmc); + if (host->vcc) regulator_put(host->vcc); if (host->pdata && host->pdata->exit) host->pdata->exit(&pdev->dev, mmc); - mmc_remove_host(mmc); - pxamci_stop_clock(host); writel(TXFIFO_WR_REQ|RXFIFO_RD_REQ|CLK_IS_OFF|STOP_CMD| END_CMD_RES|PRG_DONE|DATA_TRAN_DONE, diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c index 61ea833e0908..94bb61e19047 100644 --- a/drivers/mtd/chips/cfi_cmdset_0002.c +++ b/drivers/mtd/chips/cfi_cmdset_0002.c @@ -282,16 +282,6 @@ static void fixup_s29gl032n_sectors(struct mtd_info *mtd, void *param) } } -static void fixup_M29W128G_write_buffer(struct mtd_info *mtd, void *param) -{ - struct map_info *map = mtd->priv; - struct cfi_private *cfi = map->fldrv_priv; - if (cfi->cfiq->BufWriteTimeoutTyp) { - pr_warning("Don't use write buffer on ST flash M29W128G\n"); - cfi->cfiq->BufWriteTimeoutTyp = 0; - } -} - static struct cfi_fixup cfi_fixup_table[] = { { CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL }, #ifdef AMD_BOOTLOC_BUG @@ -308,7 +298,6 @@ static struct cfi_fixup cfi_fixup_table[] = { { CFI_MFR_AMD, 0x1301, fixup_s29gl064n_sectors, NULL, }, { CFI_MFR_AMD, 0x1a00, fixup_s29gl032n_sectors, NULL, }, { CFI_MFR_AMD, 0x1a01, fixup_s29gl032n_sectors, NULL, }, - { CFI_MFR_ST, 0x227E, fixup_M29W128G_write_buffer, NULL, }, #if !FORCE_WORD_WRITE { CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, }, #endif diff --git a/drivers/mtd/chips/cfi_util.c b/drivers/mtd/chips/cfi_util.c index 34d40e25d312..c5a84fda5410 100644 --- a/drivers/mtd/chips/cfi_util.c +++ b/drivers/mtd/chips/cfi_util.c @@ -81,6 +81,10 @@ void __xipram cfi_qry_mode_off(uint32_t base, struct map_info *map, { cfi_send_gen_cmd(0xF0, 0, base, map, cfi, cfi->device_type, NULL); cfi_send_gen_cmd(0xFF, 0, base, map, cfi, cfi->device_type, NULL); + /* M29W128G flashes require an additional reset command + when exit qry mode */ + if ((cfi->mfr == CFI_MFR_ST) && (cfi->id == 0x227E || cfi->id == 0x7E)) + cfi_send_gen_cmd(0xF0, 0, base, map, cfi, cfi->device_type, NULL); } EXPORT_SYMBOL_GPL(cfi_qry_mode_off); diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig index 1a85f6d5543b..3fe91622b400 100644 --- a/drivers/mtd/nand/Kconfig +++ b/drivers/mtd/nand/Kconfig @@ -436,7 +436,7 @@ config MXC_NAND_LOW_LEVEL_ERASE config MTD_NAND_GPMI_NFC tristate "GPMI NAND Flash Controller driver" - depends on MTD_NAND && (ARCH_MX23 || ARCH_MX28 || ARCH_MX50) + depends on MTD_NAND && (ARCH_MX23 || ARCH_MX28) help Enables NAND Flash support. diff --git a/drivers/mtd/nand/gpmi-nfc/Makefile b/drivers/mtd/nand/gpmi-nfc/Makefile index 9df1b6454e90..e3d5660735b6 100644 --- a/drivers/mtd/nand/gpmi-nfc/Makefile +++ b/drivers/mtd/nand/gpmi-nfc/Makefile @@ -4,7 +4,6 @@ gpmi-nfc-objs += gpmi-nfc-event-reporting.o gpmi-nfc-objs += gpmi-nfc-hal-common.o gpmi-nfc-objs += gpmi-nfc-hal-v0.o gpmi-nfc-objs += gpmi-nfc-hal-v1.o -gpmi-nfc-objs += gpmi-nfc-hal-v2.o gpmi-nfc-objs += gpmi-nfc-rom-common.o gpmi-nfc-objs += gpmi-nfc-rom-v0.o gpmi-nfc-objs += gpmi-nfc-rom-v1.o diff --git a/drivers/mtd/nand/gpmi-nfc/gpmi-nfc-main.c b/drivers/mtd/nand/gpmi-nfc/gpmi-nfc-main.c index 54df1f084509..0143f1c358ff 100644 --- a/drivers/mtd/nand/gpmi-nfc/gpmi-nfc-main.c +++ b/drivers/mtd/nand/gpmi-nfc/gpmi-nfc-main.c @@ -42,12 +42,8 @@ static struct gpmi_nfc_timing safe_timing = { */ static struct nfc_hal *(nfc_hals[]) = { - /* i.mx23 */ &gpmi_nfc_hal_v0, - /* i.mx28 */ &gpmi_nfc_hal_v1, - /* i.mx50 */ - &gpmi_nfc_hal_v2, }; /* @@ -1255,54 +1251,40 @@ static void release_register_block(struct gpmi_nfc_data *this, * @resource_name: The name of the resource. * @interrupt_handler: A pointer to the function that will handle interrupts * from this interrupt number. - * @lno: A pointer to a variable that will receive the acquired - * interrupt number(low part). - * @hno: A pointer to a variable that will receive the acquired - * interrupt number(high part). + * @interrupt_number: A pointer to a variable that will receive the acquired + * interrupt number. */ static int acquire_interrupt( struct gpmi_nfc_data *this, const char *resource_name, - irq_handler_t interrupt_handler, int *lno, int *hno) + irq_handler_t interrupt_handler, int *interrupt_number) { struct platform_device *pdev = this->pdev; struct device *dev = this->dev; int error = 0; - struct resource *r; int i; /* Attempt to get information about the given resource. */ - r = platform_get_resource_byname(pdev, IORESOURCE_IRQ, resource_name); + i = platform_get_irq_byname(pdev, resource_name); - if (!r) { + if (i < 0) { dev_err(dev, "Can't get resource information for '%s'\n", resource_name); return -ENXIO; } /* Attempt to own the interrupt. */ - for (i = r->start; i <= r->end; i++) { - error = request_irq(i, interrupt_handler, 0, - resource_name, this); - - if (error) { - dev_err(dev, "Can't own %s\n", resource_name); - /* Free all the irq's we've already acquired. */ + error = request_irq(i, interrupt_handler, 0, resource_name, this); - while ((i - r->start) >= 0) { - free_irq(i, this); - i--; - } - - return -EIO; - } + if (error) { + dev_err(dev, "Can't own %s\n", resource_name); + return -EIO; } /* If control arrives here, everything went fine. */ - *lno = r->start; - *hno = r->end; + *interrupt_number = i; return 0; @@ -1314,12 +1296,9 @@ static int acquire_interrupt( * @this: Per-device data. * @interrupt_number: The interrupt number. */ -static void release_interrupt(struct gpmi_nfc_data *this, - int low_interrupt_number, int high_interrupt_number) +static void release_interrupt(struct gpmi_nfc_data *this, int interrupt_number) { - int i; - for (i = low_interrupt_number; i <= high_interrupt_number; i++) - free_irq(i, this); + free_irq(interrupt_number, this); } /** @@ -1488,9 +1467,7 @@ static int acquire_resources(struct gpmi_nfc_data *this) error = acquire_interrupt(this, GPMI_NFC_BCH_INTERRUPT_RES_NAME, - gpmi_nfc_bch_isr, - &(resources->bch_low_interrupt), - &(resources->bch_high_interrupt)); + gpmi_nfc_bch_isr, &(resources->bch_interrupt)); if (error) goto exit_bch_interrupt; @@ -1508,9 +1485,7 @@ static int acquire_resources(struct gpmi_nfc_data *this) error = acquire_interrupt(this, GPMI_NFC_DMA_INTERRUPT_RES_NAME, - gpmi_nfc_dma_isr, - &(resources->dma_low_interrupt), - &(resources->dma_high_interrupt)); + gpmi_nfc_dma_isr, &(resources->dma_interrupt)); if (error) goto exit_dma_interrupt; @@ -1529,14 +1504,12 @@ static int acquire_resources(struct gpmi_nfc_data *this) /* Control arrives here if something went wrong. */ exit_clock: - release_interrupt(this, - resources->dma_low_interrupt, resources->dma_high_interrupt); + release_interrupt(this, resources->dma_interrupt); exit_dma_interrupt: release_dma_channels(this, resources->dma_low_channel, resources->dma_high_channel); exit_dma_channels: - release_interrupt(this, - resources->bch_low_interrupt, resources->bch_high_interrupt); + release_interrupt(this, resources->bch_interrupt); exit_bch_interrupt: release_register_block(this, resources->bch_regs); exit_bch_regs: @@ -1559,12 +1532,10 @@ static void release_resources(struct gpmi_nfc_data *this) release_clock(this, resources->clock); release_register_block(this, resources->gpmi_regs); release_register_block(this, resources->bch_regs); - release_interrupt(this, - resources->bch_low_interrupt, resources->bch_low_interrupt); + release_interrupt(this, resources->bch_interrupt); release_dma_channels(this, resources->dma_low_channel, resources->dma_high_channel); - release_interrupt(this, - resources->dma_low_interrupt, resources->dma_high_interrupt); + release_interrupt(this, resources->dma_interrupt); } /** diff --git a/drivers/mtd/nand/gpmi-nfc/gpmi-nfc-mil.c b/drivers/mtd/nand/gpmi-nfc/gpmi-nfc-mil.c index 50ba771853a4..34505b8e6546 100644 --- a/drivers/mtd/nand/gpmi-nfc/gpmi-nfc-mil.c +++ b/drivers/mtd/nand/gpmi-nfc/gpmi-nfc-mil.c @@ -172,8 +172,8 @@ static int mil_incoming_buffer_dma_begin(struct gpmi_nfc_data *this, * If we can, we want to use the caller's buffer directly for DMA. Check * if the system will let us map them. */ - if (map_io_buffers && virt_addr_valid(destination) && - !((int)destination & 0x3) && 0) + + if (map_io_buffers && virt_addr_valid(destination)) destination_phys = dma_map_single(dev, (void *) destination, length, DMA_FROM_DEVICE); @@ -385,7 +385,6 @@ static void mil_select_chip(struct mtd_info *mtd, int chip) gpmi_nfc_add_event("< mil_select_chip", -1); } else if ((mil->current_chip >= 0) && (chip < 0)) { gpmi_nfc_add_event("> mil_select_chip", 1); - gpmi_nfc_add_event("> not disable clk", 1); clk_disable(clock); nfc->end(this); gpmi_nfc_stop_event_trace("< mil_select_chip"); @@ -422,6 +421,7 @@ static void mil_read_buf(struct mtd_info *mtd, uint8_t *buf, int len) gpmi_nfc_add_event("> mil_read_buf", 1); /* Set up DMA. */ + error = mil_incoming_buffer_dma_begin(this, buf, len, mil->payload_virt, mil->payload_phys, nfc_geo->payload_size_in_bytes, @@ -1413,12 +1413,6 @@ static int mil_set_geometry(struct gpmi_nfc_data *this) struct nfc_geometry *nfc_geo = &this->nfc_geometry; struct mil *mil = &this->mil; - - /* Free the memory for read ID case */ - if (mil->page_buffer_virt && virt_addr_valid(mil->page_buffer_virt)) - dma_free_coherent(dev, nfc_geo->payload_size_in_bytes, - mil->page_buffer_virt, mil->page_buffer_phys); - /* Set up the various layers of geometry, in this specific order. */ if (mil_set_physical_geometry(this)) @@ -2505,27 +2499,8 @@ int gpmi_nfc_mil_init(struct gpmi_nfc_data *this) dma_alloc_coherent(dev, MIL_COMMAND_BUFFER_SIZE, &mil->cmd_phys, GFP_DMA); - if (!mil->cmd_virt) { - error = -ENOMEM; + if (!mil->cmd_virt) goto exit_cmd_allocation; - } - - - /* Allocate buf read ID case */ - this->nfc_geometry.payload_size_in_bytes = 1024; - mil->page_buffer_virt = - dma_alloc_coherent(dev, - this->nfc_geometry.payload_size_in_bytes, - &mil->page_buffer_phys, GFP_DMA); - - if (!mil->page_buffer_virt) { - error = -ENOMEM; - goto exit_buf_allocation; - } - - /* Slice up the page buffer. */ - mil->payload_virt = mil->page_buffer_virt; - mil->payload_phys = mil->page_buffer_phys; /* * Ask the NAND Flash system to scan for chips. @@ -2574,14 +2549,8 @@ int gpmi_nfc_mil_init(struct gpmi_nfc_data *this) exit_partitions: nand_release(&mil->mtd); exit_nand_scan: - dma_free_coherent(dev, - this->nfc_geometry.payload_size_in_bytes, - mil->page_buffer_virt, mil->page_buffer_phys); - mil->page_buffer_virt = 0; - mil->page_buffer_phys = ~0; -exit_buf_allocation: dma_free_coherent(dev, MIL_COMMAND_BUFFER_SIZE, - mil->cmd_virt, mil->cmd_phys); + mil->cmd_virt, mil->cmd_phys); mil->cmd_virt = 0; mil->cmd_phys = ~0; exit_cmd_allocation: diff --git a/drivers/mtd/nand/gpmi-nfc/gpmi-nfc.h b/drivers/mtd/nand/gpmi-nfc/gpmi-nfc.h index 9b0074532917..6f14b73dd93d 100644 --- a/drivers/mtd/nand/gpmi-nfc/gpmi-nfc.h +++ b/drivers/mtd/nand/gpmi-nfc/gpmi-nfc.h @@ -44,6 +44,7 @@ #include <mach/system.h> #include <mach/dmaengine.h> +#include <mach/device.h> #include <mach/clock.h> /* Driver header files. */ @@ -85,12 +86,10 @@ struct resources { void *gpmi_regs; void *bch_regs; - unsigned int bch_low_interrupt; - unsigned int bch_high_interrupt; + unsigned int bch_interrupt; unsigned int dma_low_channel; unsigned int dma_high_channel; - unsigned int dma_low_interrupt; - unsigned int dma_high_interrupt; + unsigned int dma_interrupt; struct clk *clock; }; @@ -626,7 +625,6 @@ extern int gpmi_nfc_compute_hardware_timing(struct gpmi_nfc_data *this, extern struct nfc_hal gpmi_nfc_hal_v0; extern struct nfc_hal gpmi_nfc_hal_v1; -extern struct nfc_hal gpmi_nfc_hal_v2; /* Boot ROM Helper Common Services */ diff --git a/drivers/mtd/nand/mxc_nd2.c b/drivers/mtd/nand/mxc_nd2.c index 80533ac42e9c..5ace73501cbb 100644 --- a/drivers/mtd/nand/mxc_nd2.c +++ b/drivers/mtd/nand/mxc_nd2.c @@ -32,7 +32,6 @@ /* Global address Variables */ static void __iomem *nfc_axi_base, *nfc_ip_base; -static int nfc_irq; struct mxc_mtd_s { struct mtd_info mtd; @@ -40,7 +39,6 @@ struct mxc_mtd_s { struct mtd_partition *parts; struct device *dev; int disable_bi_swap; /* disable bi swap */ - int clk_active; }; static struct mxc_mtd_s *mxc_nand_data; @@ -842,30 +840,6 @@ static int mxc_nand_verify_buf(struct mtd_info *mtd, const u_char * buf, } /*! - * This function will enable NFC clock - * - */ -static inline void mxc_nand_clk_enable(void) -{ - if (!mxc_nand_data->clk_active) { - clk_enable(nfc_clk); - mxc_nand_data->clk_active = 1; - } -} - -/*! - * This function will disable NFC clock - * - */ -static inline void mxc_nand_clk_disable(void) -{ - if (mxc_nand_data->clk_active) { - clk_disable(nfc_clk); - mxc_nand_data->clk_active = 0; - } -} - -/*! * This function is used by upper layer for select and deselect of the NAND * chip * @@ -878,14 +852,13 @@ static void mxc_nand_select_chip(struct mtd_info *mtd, int chip) switch (chip) { case -1: /* Disable the NFC clock */ - mxc_nand_clk_disable(); - + clk_disable(nfc_clk); break; - case 0 ... NFC_GET_MAXCHIP_SP(): + case 0 ... 7: /* Enable the NFC clock */ - mxc_nand_clk_enable(); - NFC_SET_NFC_ACTIVE_CS(chip); + clk_enable(nfc_clk); + NFC_SET_NFC_ACTIVE_CS(chip); break; default: @@ -1257,10 +1230,9 @@ static int mxc_get_resources(struct platform_device *pdev) error = -ENXIO; goto out_2; } - nfc_irq = r->start; init_waitqueue_head(&irq_waitq); - error = request_irq(nfc_irq, mxc_nfc_irq, 0, "mxc_nd", NULL); + error = request_irq(r->start, mxc_nfc_irq, 0, "mxc_nd", NULL); if (error) goto out_3; @@ -1526,7 +1498,6 @@ static int __init mxcnd_probe(struct platform_device *pdev) nfc_clk = clk_get(&pdev->dev, "nfc_clk"); clk_enable(nfc_clk); - mxc_nand_data->clk_active = 1; if (hardware_ecc) { this->ecc.read_page = mxc_nand_read_page; @@ -1622,13 +1593,13 @@ static int __exit mxcnd_remove(struct platform_device *pdev) manage_sysfs_files(false); mxc_free_buf(); - mxc_nand_clk_disable(); + clk_disable(nfc_clk); clk_put(nfc_clk); platform_set_drvdata(pdev, NULL); if (mxc_nand_data) { nand_release(mtd); - free_irq(nfc_irq, NULL); + free_irq(MXC_INT_NANDFC, NULL); kfree(mxc_nand_data); } @@ -1653,7 +1624,7 @@ static int mxcnd_suspend(struct platform_device *pdev, pm_message_t state) DEBUG(MTD_DEBUG_LEVEL0, "MXC_ND2 : NAND suspend\n"); /* Disable the NFC clock */ - mxc_nand_clk_disable(); + clk_disable(nfc_clk); return 0; } @@ -1672,7 +1643,7 @@ static int mxcnd_resume(struct platform_device *pdev) DEBUG(MTD_DEBUG_LEVEL0, "MXC_ND2 : NAND resume\n"); /* Enable the NFC clock */ - mxc_nand_clk_enable(); + clk_enable(nfc_clk); return 0; } diff --git a/drivers/mtd/nand/ndfc.c b/drivers/mtd/nand/ndfc.c index 89bf85af642c..40b5658bdbe6 100644 --- a/drivers/mtd/nand/ndfc.c +++ b/drivers/mtd/nand/ndfc.c @@ -102,8 +102,8 @@ static int ndfc_calculate_ecc(struct mtd_info *mtd, wmb(); ecc = in_be32(ndfc->ndfcbase + NDFC_ECC); /* The NDFC uses Smart Media (SMC) bytes order */ - ecc_code[0] = p[2]; - ecc_code[1] = p[1]; + ecc_code[0] = p[1]; + ecc_code[1] = p[2]; ecc_code[2] = p[3]; return 0; diff --git a/drivers/mtd/ofpart.c b/drivers/mtd/ofpart.c index 3e164f0c9295..62d6a78c4eee 100644 --- a/drivers/mtd/ofpart.c +++ b/drivers/mtd/ofpart.c @@ -46,21 +46,12 @@ int __devinit of_mtd_parse_partitions(struct device *dev, const u32 *reg; int len; - /* check if this is a partition node */ - partname = of_get_property(pp, "name", &len); - if (strcmp(partname, "partition") != 0) { + reg = of_get_property(pp, "reg", &len); + if (!reg) { nr_parts--; continue; } - reg = of_get_property(pp, "reg", &len); - if (!reg || (len != 2 * sizeof(u32))) { - of_node_put(pp); - dev_err(dev, "Invalid 'reg' on %s\n", node->full_name); - kfree(*pparts); - *pparts = NULL; - return -EINVAL; - } (*pparts)[i].offset = reg[0]; (*pparts)[i].size = reg[1]; @@ -75,6 +66,14 @@ int __devinit of_mtd_parse_partitions(struct device *dev, i++; } + if (!i) { + of_node_put(pp); + dev_err(dev, "No valid partition found on %s\n", node->full_name); + kfree(*pparts); + *pparts = NULL; + return -EINVAL; + } + return nr_parts; } EXPORT_SYMBOL(of_mtd_parse_partitions); diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c index f237ddbb2713..111ea41c4ecd 100644 --- a/drivers/mtd/ubi/cdev.c +++ b/drivers/mtd/ubi/cdev.c @@ -853,7 +853,6 @@ static long ubi_cdev_ioctl(struct file *file, unsigned int cmd, break; } - req.name[req.name_len] = '\0'; err = verify_mkvol_req(ubi, &req); if (err) break; diff --git a/drivers/mxc/amd-gpu/Kconfig b/drivers/mxc/amd-gpu/Kconfig index 629d8cbbc989..f4f442787deb 100644 --- a/drivers/mxc/amd-gpu/Kconfig +++ b/drivers/mxc/amd-gpu/Kconfig @@ -6,7 +6,7 @@ menu "MXC GPU support" config MXC_AMD_GPU tristate "MXC GPU support" - depends on ARCH_MX35 || ARCH_MX51 || ARCH_MX53 || ARCH_MX50 + depends on ARCH_MX35 || ARCH_MX51 || ARCH_MX53 ---help--- Say Y to get the GPU driver support. diff --git a/drivers/mxc/amd-gpu/Makefile b/drivers/mxc/amd-gpu/Makefile index 84cf02e5b3a3..a661de4d6a76 100644 --- a/drivers/mxc/amd-gpu/Makefile +++ b/drivers/mxc/amd-gpu/Makefile @@ -25,7 +25,25 @@ gpu-objs += common/gsl_cmdstream.o \ common/gsl_yamato.o \ platform/hal/linux/gsl_linux_map.o \ platform/hal/linux/gsl_kmod.o \ - platform/hal/linux/gsl_hal.o \ platform/hal/linux/gsl_kmod_cleanup.o \ platform/hal/linux/misc.o \ os/kernel/src/linux/kos_lib.o +ifeq ($(CONFIG_ARCH_MX5),y) +EXTRA_CFLAGS += -DMX51=1 \ + -I$(obj)/platform/hal/MX51 \ + -I$(obj)/platform/hal/MX51/linux \ + -I$(obj)/platform/hal/MX51/memcfg + +gpu-objs += platform/hal/MX51/linux/gsl_hal.o \ + platform/hal/MX51/memcfg/gsl_memcfg.o +endif + +ifeq ($(CONFIG_ARCH_MX35),y) +EXTRA_CFLAGS += -DMX35=1 \ + -I$(obj)/platform/hal/MX35 \ + -I$(obj)/platform/hal/MX35/linux \ + -I$(obj)/platform/hal/MX35/memcfg + +gpu-objs += platform/hal/MX35/linux/gsl_hal.o \ + platform/hal/MX35/memcfg/gsl_memcfg.o +endif diff --git a/drivers/mxc/amd-gpu/common/gsl_device.c b/drivers/mxc/amd-gpu/common/gsl_device.c index 537b277918c4..bcb557e69d6d 100644 --- a/drivers/mxc/amd-gpu/common/gsl_device.c +++ b/drivers/mxc/amd-gpu/common/gsl_device.c @@ -15,7 +15,7 @@ * 02110-1301, USA. * */ - + #include "gsl.h" #include "gsl_hal.h" #ifdef _LINUX @@ -55,19 +55,10 @@ kgsl_device_init(gsl_device_t *device, gsl_deviceid_t device_id) { int status = GSL_SUCCESS; gsl_devconfig_t config; - gsl_hal_t *hal = (gsl_hal_t *)gsl_driver.hal; kgsl_log_write( KGSL_LOG_GROUP_DEVICE | KGSL_LOG_LEVEL_TRACE, "--> int kgsl_device_init(gsl_device_t *device=0x%08x, gsl_deviceid_t device_id=%D )\n", device, device_id ); - if ((GSL_DEVICE_YAMATO == device_id) && !(hal->has_z430)) { - return GSL_FAILURE_NOTSUPPORTED; - } - - if ((GSL_DEVICE_G12 == device_id) && !(hal->has_z160)) { - return GSL_FAILURE_NOTSUPPORTED; - } - if (device->flags & GSL_FLAGS_INITIALIZED) { kgsl_log_write( KGSL_LOG_GROUP_DEVICE | KGSL_LOG_LEVEL_TRACE, "<-- kgsl_device_init. Return value %B\n", GSL_SUCCESS ); @@ -135,7 +126,7 @@ kgsl_device_init(gsl_device_t *device, gsl_deviceid_t device_id) return (status); } -#ifndef _LINUX +#ifndef _LINUX // Create timestamp event device->timestamp_event = kos_event_create(0); if( !device->timestamp_event ) @@ -146,7 +137,7 @@ kgsl_device_init(gsl_device_t *device, gsl_deviceid_t device_id) #else // Create timestamp wait queue init_waitqueue_head(&device->timestamp_waitq); -#endif +#endif // // Read the chip ID after the device has been initialized. @@ -170,10 +161,6 @@ kgsl_device_close(gsl_device_t *device) kgsl_log_write( KGSL_LOG_GROUP_DEVICE | KGSL_LOG_LEVEL_TRACE, "--> int kgsl_device_close(gsl_device_t *device=0x%08x )\n", device ); - if (!(device->flags & GSL_FLAGS_INITIALIZED)) { - return status; - } - /* make sure the device is stopped before close kgsl_device_close is only called for last running caller process */ @@ -187,8 +174,12 @@ kgsl_device_close(gsl_device_t *device) status = kgsl_cmdstream_close(device); if( status != GSL_SUCCESS ) return status; - if (device->ftbl.device_close) { - status = device->ftbl.device_close(device); + if (device->flags & GSL_FLAGS_INITIALIZED) + { + if (device->ftbl.device_close) + { + status = device->ftbl.device_close(device); + } } // DumpX allocates memstore from MMU aperture @@ -198,7 +189,7 @@ kgsl_device_close(gsl_device_t *device) kgsl_sharedmem_free0(&device->memstore, GSL_CALLER_PROCESSID_GET()); } -#ifndef _LINUX +#ifndef _LINUX // destroy timestamp event if(device->timestamp_event) { @@ -208,10 +199,10 @@ kgsl_device_close(gsl_device_t *device) } #else wake_up_interruptible_all(&(device->timestamp_waitq)); -#endif +#endif kgsl_log_write( KGSL_LOG_GROUP_DEVICE | KGSL_LOG_LEVEL_TRACE, "<-- kgsl_device_close. Return value %B\n", status ); - + return (status); } @@ -434,27 +425,16 @@ kgsl_device_start(gsl_deviceid_t device_id, gsl_flags_t flags) { int status = GSL_FAILURE_NOTINITIALIZED; gsl_device_t *device; - gsl_hal_t *hal = (gsl_hal_t *)gsl_driver.hal; kgsl_log_write( KGSL_LOG_GROUP_DEVICE | KGSL_LOG_LEVEL_TRACE, "--> int kgsl_device_start(gsl_deviceid_t device_id=%D, gsl_flags_t flags=%d)\n", device_id, flags ); GSL_API_MUTEX_LOCK(); - if ((GSL_DEVICE_G12 == device_id) && !(hal->has_z160)) { - GSL_API_MUTEX_UNLOCK(); - return GSL_FAILURE_NOTSUPPORTED; - } - - if ((GSL_DEVICE_YAMATO == device_id) && !(hal->has_z430)) { - GSL_API_MUTEX_UNLOCK(); - return GSL_FAILURE_NOTSUPPORTED; - } - device = &gsl_driver.device[device_id-1]; // device_id is 1 based - + kgsl_device_active(device); - + if (!(device->flags & GSL_FLAGS_INITIALIZED)) { GSL_API_MUTEX_UNLOCK(); @@ -549,7 +529,7 @@ kgsl_device_idle(gsl_deviceid_t device_id, unsigned int timeout) device = &gsl_driver.device[device_id-1]; // device_id is 1 based kgsl_device_active(device); - + if (device->ftbl.device_idle) { status = device->ftbl.device_idle(device, timeout); diff --git a/drivers/mxc/amd-gpu/common/gsl_driver.c b/drivers/mxc/amd-gpu/common/gsl_driver.c index b8c5170a1425..fd4bcc0df96a 100644 --- a/drivers/mxc/amd-gpu/common/gsl_driver.c +++ b/drivers/mxc/amd-gpu/common/gsl_driver.c @@ -198,12 +198,13 @@ kgsl_driver_entry(gsl_flags_t flags) if (status == GSL_SUCCESS) { // init devices - status = GSL_FAILURE; for (i = 0; i < GSL_DEVICE_MAX; i++) { - if (kgsl_device_init(&gsl_driver.device[i], (gsl_deviceid_t)(i + 1)) == GSL_SUCCESS) { - status = GSL_SUCCESS; - } + status = kgsl_device_init(&gsl_driver.device[i], (gsl_deviceid_t)(i + 1)); + if (status != GSL_SUCCESS) + { + break; + } } } diff --git a/drivers/mxc/amd-gpu/common/gsl_g12.c b/drivers/mxc/amd-gpu/common/gsl_g12.c index 14cfdb61b6a1..513f6728a842 100644 --- a/drivers/mxc/amd-gpu/common/gsl_g12.c +++ b/drivers/mxc/amd-gpu/common/gsl_g12.c @@ -91,8 +91,6 @@ typedef struct static gsl_z1xx_t g_z1xx = {0}; -extern int z160_version; - //---------------------------------------------------------------------------- @@ -465,10 +463,6 @@ kgsl_g12_getproperty(gsl_device_t *device, gsl_property_type_t type, void *value #ifndef GSL_NO_MMU devinfo->mmu_enabled = kgsl_mmu_isenabled(&device->mmu); #endif - if (z160_version == 1) - devinfo->high_precision = 1; - else - devinfo->high_precision = 0; status = GSL_SUCCESS; } diff --git a/drivers/mxc/amd-gpu/common/gsl_yamato.c b/drivers/mxc/amd-gpu/common/gsl_yamato.c index e52d4274c6a6..d74c9efe2f36 100644 --- a/drivers/mxc/amd-gpu/common/gsl_yamato.c +++ b/drivers/mxc/amd-gpu/common/gsl_yamato.c @@ -541,7 +541,6 @@ kgsl_yamato_getproperty(gsl_device_t *device, gsl_property_type_t type, void *va devinfo->gmem_hostbaseaddr = device->gmemspace.mmio_virt_base; devinfo->gmem_gpubaseaddr = device->gmemspace.gpu_base; devinfo->gmem_sizebytes = device->gmemspace.sizebytes; - devinfo->high_precision = 0; status = GSL_SUCCESS; } diff --git a/drivers/mxc/amd-gpu/include/api/gsl_types.h b/drivers/mxc/amd-gpu/include/api/gsl_types.h index 310c1a9f5d00..99f389deee84 100644 --- a/drivers/mxc/amd-gpu/include/api/gsl_types.h +++ b/drivers/mxc/amd-gpu/include/api/gsl_types.h @@ -267,7 +267,6 @@ typedef struct _gsl_devinfo_t { unsigned int gmem_gpubaseaddr; void * gmem_hostbaseaddr; // if gmem_hostbaseaddr is NULL, we would know its not mapped into mmio space unsigned int gmem_sizebytes; - unsigned int high_precision; /* mx50 z160 has higher gradient/texture precision */ } gsl_devinfo_t; diff --git a/drivers/mxc/amd-gpu/include/gsl_driver.h b/drivers/mxc/amd-gpu/include/gsl_driver.h index 42dff457dc49..1e1d43da431d 100644 --- a/drivers/mxc/amd-gpu/include/gsl_driver.h +++ b/drivers/mxc/amd-gpu/include/gsl_driver.h @@ -72,7 +72,6 @@ typedef struct _gsl_driver_t { gsl_flags_t dmi_mode; // single, double, or triple buffering int dmi_frame; // set to -1 when DMI is enabled int dmi_max_frame; // indicates the maximum frame # that we will support - int enable_mmu; } gsl_driver_t; diff --git a/drivers/mxc/amd-gpu/include/gsl_hal.h b/drivers/mxc/amd-gpu/include/gsl_hal.h index fcf9f0891f16..8a8a10cfb862 100644 --- a/drivers/mxc/amd-gpu/include/gsl_hal.h +++ b/drivers/mxc/amd-gpu/include/gsl_hal.h @@ -122,15 +122,6 @@ typedef struct _gsl_shmemconfig_t gsl_apertureconfig_t apertures[GSL_SHMEM_MAX_APERTURES]; } gsl_shmemconfig_t; -typedef struct _gsl_hal_t { - gsl_memregion_t z160_regspace; - gsl_memregion_t z430_regspace; - gsl_memregion_t memchunk; - gsl_memregion_t memspace[GSL_SHMEM_MAX_APERTURES]; - unsigned int has_z160; - unsigned int has_z430; -} gsl_hal_t; - ////////////////////////////////////////////////////////////////////////////// // HAL API @@ -141,6 +132,7 @@ KGSLHAL_API int kgsl_hal_getshmemconfig(gsl_shmemconfig_t *config); KGSLHAL_API int kgsl_hal_getdevconfig(gsl_deviceid_t device_id, gsl_devconfig_t *config); KGSLHAL_API int kgsl_hal_setpowerstate(gsl_deviceid_t device_id, int state, unsigned int value); KGSLHAL_API gsl_chipid_t kgsl_hal_getchipid(gsl_deviceid_t device_id); +KGSLHAL_API int kgsl_hal_getplatformtype(char *platform); KGSLHAL_API int kgsl_hal_allocphysical(unsigned int virtaddr, unsigned int numpages, unsigned int scattergatterlist[]); KGSLHAL_API int kgsl_hal_freephysical(unsigned int virtaddr, unsigned int numpages, unsigned int scattergatterlist[]); diff --git a/drivers/mxc/amd-gpu/platform/hal/MX35/gsl_buildconfig.h b/drivers/mxc/amd-gpu/platform/hal/MX35/gsl_buildconfig.h new file mode 100644 index 000000000000..9cfe9fe5b3b8 --- /dev/null +++ b/drivers/mxc/amd-gpu/platform/hal/MX35/gsl_buildconfig.h @@ -0,0 +1,62 @@ +/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Advanced Micro Devices nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef __GSL__BUILDCONFIG_H +#define __GSL__BUILDCONFIG_H + +#define GSL_BLD_G12 + +#define GSL_LOCKING_COURSEGRAIN +#define GSL_MMU_TRANSLATION_ENABLED +//#define GSL_MMU_PAGETABLE_PERPROCESS + +#if defined(_WIN32_WCE) && (_WIN32_WCE >= 600) +#define GSL_DEVICE_SHADOW_MEMSTORE_TO_USER +#endif + +//#define GSL_LOG + +#define GSL_STATS_MEM +#define GSL_STATS_RINGBUFFER +#define GSL_STATS_MMU + +#define GSL_RB_USE_MEM_RPTR +#define GSL_RB_USE_MEM_TIMESTAMP +//#define GSL_RB_USE_WPTR_POLLING + + +#define GSL_CALLER_PROCESS_MAX 10 +#define GSL_SHMEM_MAX_APERTURES 3 + +#ifdef _WIN32 +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE +#endif +#endif // _WIN32 + +#endif // __GSL__BUILDCONFIG_H diff --git a/drivers/mxc/amd-gpu/platform/hal/MX35/gsl_config.h b/drivers/mxc/amd-gpu/platform/hal/MX35/gsl_config.h new file mode 100644 index 000000000000..58a38c608de9 --- /dev/null +++ b/drivers/mxc/amd-gpu/platform/hal/MX35/gsl_config.h @@ -0,0 +1,195 @@ +/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Advanced Micro Devices nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef __GSL__CONFIG_H +#define __GSL__CONFIG_H + + +// --------------------- +// G12 MH arbiter config +// --------------------- +static const REG_MH_ARBITER_CONFIG gsl_cfg_g12_mharb = +{ + 0x10, // SAME_PAGE_LIMIT + 0, // SAME_PAGE_GRANULARITY + 1, // L1_ARB_ENABLE + 1, // L1_ARB_HOLD_ENABLE + 0, // L2_ARB_CONTROL + 1, // PAGE_SIZE + 1, // TC_REORDER_ENABLE + 1, // TC_ARB_HOLD_ENABLE + 0, // IN_FLIGHT_LIMIT_ENABLE + 0x8, // IN_FLIGHT_LIMIT + 1, // CP_CLNT_ENABLE + 1, // VGT_CLNT_ENABLE + 1, // TC_CLNT_ENABLE + 1, // RB_CLNT_ENABLE + 1, // PA_CLNT_ENABLE +}; + +// ----------------------------- +// interrupt block register data +// ----------------------------- +static const gsl_intrblock_reg_t gsl_cfg_intrblock_reg[GSL_INTR_BLOCK_COUNT] = +{ + { // Yamato MH + 0, + 0, + 0, + 0, + 0, + 0 + }, + { // Yamato CP + 0, + 0, + 0, + 0, + 0, + 0 + }, + { // Yamato RBBM + 0, + 0, + 0, + 0, + 0, + 0 + }, + { // Yamato SQ + 0, + 0, + 0, + 0, + 0, + 0 + }, + { // G12 + GSL_INTR_BLOCK_G12, + GSL_INTR_G12_MH, +#ifndef _Z180 + GSL_INTR_G12_FBC, +#else + GSL_INTR_G12_FIFO, +#endif //_Z180 + (ADDR_VGC_IRQSTATUS >> 2), + (ADDR_VGC_IRQSTATUS >> 2), + (ADDR_VGC_IRQENABLE >> 2) + }, + { // G12 MH + GSL_INTR_BLOCK_G12_MH, + GSL_INTR_G12_MH_AXI_READ_ERROR, + GSL_INTR_G12_MH_MMU_PAGE_FAULT, + ADDR_MH_INTERRUPT_STATUS, // G12 MH offsets are considered to be dword based, therefore no down shift + ADDR_MH_INTERRUPT_CLEAR, + ADDR_MH_INTERRUPT_MASK + }, +}; + +// ----------------------- +// interrupt mask bit data +// ----------------------- +static const int gsl_cfg_intr_mask[GSL_INTR_COUNT] = +{ + 0, + 0, + 0, + + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + + 0, + 0, + 0, + + 0, + 0, + + (1 << VGC_IRQENABLE_MH_FSHIFT), + (1 << VGC_IRQENABLE_G2D_FSHIFT), + (1 << VGC_IRQENABLE_FIFO_FSHIFT), +#ifndef _Z180 + (1 << VGC_IRQENABLE_FBC_FSHIFT), +#endif + 0, + 0, + 0, +}; + +// ----------------- +// mmu register data +// ----------------- +static const gsl_mmu_reg_t gsl_cfg_mmu_reg[GSL_DEVICE_MAX] = +{ + { // Yamato + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + }, + { // G12 - MH offsets are considered to be dword based, therefore no down shift + ADDR_MH_MMU_CONFIG, + ADDR_MH_MMU_MPU_BASE, + ADDR_MH_MMU_MPU_END, + ADDR_MH_MMU_VA_RANGE, + ADDR_MH_MMU_PT_BASE, + ADDR_MH_MMU_PAGE_FAULT, + ADDR_MH_MMU_TRAN_ERROR, + ADDR_MH_MMU_INVALIDATE, + } +}; + +// ----------------- +// mh interrupt data +// ----------------- +static const gsl_mh_intr_t gsl_cfg_mh_intr[GSL_DEVICE_MAX] = +{ + { // Yamato + 0, + 0, + 0, + }, + { // G12 + GSL_INTR_G12_MH_AXI_READ_ERROR, + GSL_INTR_G12_MH_AXI_WRITE_ERROR, + GSL_INTR_G12_MH_MMU_PAGE_FAULT, + } +}; + +#endif // __GSL__CONFIG_H diff --git a/drivers/mxc/amd-gpu/platform/hal/MX35/gsl_halconfig.h b/drivers/mxc/amd-gpu/platform/hal/MX35/gsl_halconfig.h new file mode 100644 index 000000000000..011041236013 --- /dev/null +++ b/drivers/mxc/amd-gpu/platform/hal/MX35/gsl_halconfig.h @@ -0,0 +1,63 @@ +/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Advanced Micro Devices nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef __GSL_HALCONFIG_H +#define __GSL_HALCONFIG_H + + + +#define GSL_HAL_PLATFORM "i.MX35G" + + +#define GSL_HAL_GPUBASE_GMEM 0x00100000 // 1MB +#define GSL_HAL_GPUBASE_GMEM_PHYS 0x20000000 // 1MB + +#define GSL_HAL_GPUBASE_REG_YDX 0x30000000 +#define GSL_HAL_GPUBASE_REG_G12 0x20000000 + +#define GSL_HAL_SIZE_REG_YDX 0x00020000 // 128KB +#define GSL_HAL_SIZE_REG_G12 0x00001000 // 4KB +#define GSL_HAL_SIZE_GMEM 0x00040000 // 256KB - 0 to 384KB in 128KB increments + +#if defined(_LINUX) && defined(GSL_MMU_TRANSLATION_ENABLED) +#define GSL_HAL_SHMEM_SIZE_EMEM1 0x02400000 // 36MB +#define GSL_HAL_SHMEM_SIZE_EMEM2 0x00400000 // 4MB +#define GSL_HAL_SHMEM_SIZE_PHYS 0x00400000 // 4MB +#elif defined(_LINUX) //MX35 Linux can able to allocate only 4MB +#define GSL_HAL_SHMEM_SIZE_EMEM1 0x00400000 // 4MB +#define GSL_HAL_SHMEM_SIZE_EMEM2 0x00200000 // 2MB +#define GSL_HAL_SHMEM_SIZE_PHYS 0x00200000 // 2MB +#else //Not possible to allocate 24 MB on WinCE +#define GSL_HAL_SHMEM_SIZE_EMEM1 0x00D00000 // 13MB +#define GSL_HAL_SHMEM_SIZE_EMEM2 0x00200000 // 2MB +#define GSL_HAL_SHMEM_SIZE_PHYS 0x00100000 // 1MB +#endif + +#define MX35_G12_INTERRUPT 16 + +#endif // __GSL_HALCONFIG_H diff --git a/drivers/mxc/amd-gpu/platform/hal/MX35/linux/gsl_hal.c b/drivers/mxc/amd-gpu/platform/hal/MX35/linux/gsl_hal.c new file mode 100644 index 000000000000..294cd9eb5af9 --- /dev/null +++ b/drivers/mxc/amd-gpu/platform/hal/MX35/linux/gsl_hal.c @@ -0,0 +1,524 @@ +/* Copyright (c) 2008-2010, Advanced Micro Devices. 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 version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will 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 to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ + +#include "gsl_hal.h" +#include "gsl_halconfig.h" +#include "gsl_linux_map.h" + +#include <linux/clk.h> +#include <linux/kernel.h> +#include <linux/pci.h> +#include <linux/vmalloc.h> + +#include <asm/atomic.h> +#include <asm/uaccess.h> +#include <asm/tlbflush.h> +#include <asm/cacheflush.h> + +////////////////////////////////////////////////////////////////////////////// +// constants +////////////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////////////// +// defines +////////////////////////////////////////////////////////////////////////////// + +#define GSL_HAL_MEM1 0 +#define GSL_HAL_MEM2 1 +#define GSL_HAL_MEM3 2 + +//#define GSL_HAL_DEBUG +////////////////////////////////////////////////////////////////////////////// +// types +////////////////////////////////////////////////////////////////////////////// + +typedef struct _gsl_hal_t { + gsl_memregion_t z160_regspace; +#if 0 + gsl_memregion_t z430_regspace; +#endif + gsl_memregion_t memchunk; + gsl_memregion_t memspace[GSL_SHMEM_MAX_APERTURES]; +} gsl_hal_t; + +////////////////////////////////////////////////////////////////////////////// +// functions +////////////////////////////////////////////////////////////////////////////// + +KGSLHAL_API int +kgsl_hal_allocphysical(unsigned int virtaddr, unsigned int numpages, unsigned int scattergatterlist[]) +{ + // + // allocate physically contiguous memory + // + + int i; + void *va; + + va = (void*)gsl_linux_map_alloc(virtaddr, numpages*PAGE_SIZE); + + if (!va) + return (GSL_FAILURE_OUTOFMEM); + + for(i = 0; i < numpages; i++) + { + scattergatterlist[i] = page_to_phys(vmalloc_to_page(va)); + va += PAGE_SIZE; + } + + return (GSL_SUCCESS); +} + +// --------------------------------------------------------------------------- + +KGSLHAL_API int +kgsl_hal_freephysical(unsigned int virtaddr, unsigned int numpages, unsigned int scattergatterlist[]) +{ + // + // free physical memory + // + + gsl_linux_map_free(virtaddr); + + return(GSL_SUCCESS); +} + +//---------------------------------------------------------------------------- + +KGSLHAL_API int +kgsl_hal_init(void) +{ + gsl_hal_t *hal; + unsigned long totalsize, mem1size; + unsigned int va, pa; + + if (gsl_driver.hal) + { + return (GSL_FAILURE_ALREADYINITIALIZED); + } + + gsl_driver.hal = (void *)kos_malloc(sizeof(gsl_hal_t)); + + if (!gsl_driver.hal) + { + return (GSL_FAILURE_OUTOFMEM); + } + + kos_memset(gsl_driver.hal, 0, sizeof(gsl_hal_t)); + + + // overlay structure on hal memory + hal = (gsl_hal_t *) gsl_driver.hal; + +#if 0 + // setup register space + hal->z430_regspace.mmio_phys_base = GSL_HAL_GPUBASE_REG_YDX; + hal->z430_regspace.sizebytes = GSL_HAL_SIZE_REG_YDX; + hal->z430_regspace.mmio_virt_base = (unsigned char*)ioremap(hal->z430_regspace.mmio_phys_base, hal->z430_regspace.sizebytes); + + if (hal->z430_regspace.mmio_virt_base == NULL) + { + return (GSL_FAILURE_SYSTEMERROR); + } + +#ifdef GSL_HAL_DEBUG + printk(KERN_INFO "%s: hal->z430_regspace.mmio_phys_base = 0x%p\n", __func__, (void*)hal->z430_regspace.mmio_phys_base); + printk(KERN_INFO "%s: hal->z430_regspace.mmio_virt_base = 0x%p\n", __func__, (void*)hal->z430_regspace.mmio_virt_base); + printk(KERN_INFO "%s: hal->z430_regspace.sizebytes = 0x%08x\n", __func__, hal->z430_regspace.sizebytes); +#endif +#endif + + hal->z160_regspace.mmio_phys_base = GSL_HAL_GPUBASE_REG_G12; + hal->z160_regspace.sizebytes = GSL_HAL_SIZE_REG_G12; + hal->z160_regspace.mmio_virt_base = (unsigned char*)ioremap(hal->z160_regspace.mmio_phys_base, hal->z160_regspace.sizebytes); + + if (hal->z160_regspace.mmio_virt_base == NULL) + { + return (GSL_FAILURE_SYSTEMERROR); + } + +#ifdef GSL_HAL_DEBUG + printk(KERN_INFO "%s: hal->z160_regspace.mmio_phys_base = 0x%p\n", __func__, (void*)hal->z160_regspace.mmio_phys_base); + printk(KERN_INFO "%s: hal->z160_regspace.mmio_virt_base = 0x%p\n", __func__, (void*)hal->z160_regspace.mmio_virt_base); + printk(KERN_INFO "%s: hal->z160_regspace.sizebytes = 0x%08x\n", __func__, hal->z160_regspace.sizebytes); +#endif + +#ifdef GSL_MMU_TRANSLATION_ENABLED + totalsize = GSL_HAL_SHMEM_SIZE_EMEM2 + GSL_HAL_SHMEM_SIZE_PHYS; + mem1size = GSL_HAL_SHMEM_SIZE_EMEM1; +#else + totalsize = GSL_HAL_SHMEM_SIZE_EMEM1 + GSL_HAL_SHMEM_SIZE_EMEM2 + GSL_HAL_SHMEM_SIZE_PHYS; + mem1size = GSL_HAL_SHMEM_SIZE_EMEM1; +#endif + + // allocate a single chunk of physical memory + va = (unsigned int)dma_alloc_coherent(0, totalsize, (dma_addr_t *)&pa, GFP_DMA | GFP_KERNEL); + + if (va) + { + kos_memset((void *)va, 0, totalsize); + + hal->memchunk.mmio_virt_base = (void *)va; + hal->memchunk.mmio_phys_base = pa; + hal->memchunk.sizebytes = totalsize; + +#ifdef GSL_HAL_DEBUG + printk(KERN_INFO "%s: hal->memchunk.mmio_phys_base = 0x%p\n", __func__, (void*)hal->memchunk.mmio_phys_base); + printk(KERN_INFO "%s: hal->memchunk.mmio_virt_base = 0x%p\n", __func__, (void*)hal->memchunk.mmio_virt_base); + printk(KERN_INFO "%s: hal->memchunk.sizebytes = 0x%08x\n", __func__, hal->memchunk.sizebytes); +#endif + + hal->memspace[GSL_HAL_MEM2].mmio_virt_base = (void *) va; + hal->memspace[GSL_HAL_MEM2].gpu_base = pa; + hal->memspace[GSL_HAL_MEM2].sizebytes = GSL_HAL_SHMEM_SIZE_EMEM2; + va += GSL_HAL_SHMEM_SIZE_EMEM2; + pa += GSL_HAL_SHMEM_SIZE_EMEM2; + +#ifdef GSL_HAL_DEBUG + printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM2].gpu_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM2].gpu_base); + printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM2].mmio_virt_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM2].mmio_virt_base); + printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM2].sizebytes = 0x%08x\n", __func__, hal->memspace[GSL_HAL_MEM2].sizebytes); +#endif + + hal->memspace[GSL_HAL_MEM3].mmio_virt_base = (void *) va; + hal->memspace[GSL_HAL_MEM3].gpu_base = pa; + hal->memspace[GSL_HAL_MEM3].sizebytes = GSL_HAL_SHMEM_SIZE_PHYS; + va += GSL_HAL_SHMEM_SIZE_PHYS; + pa += GSL_HAL_SHMEM_SIZE_PHYS; + +#ifdef GSL_HAL_DEBUG + printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM3].gpu_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM3].gpu_base); + printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM3].mmio_virt_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM3].mmio_virt_base); + printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM3].sizebytes = 0x%08x\n", __func__, hal->memspace[GSL_HAL_MEM3].sizebytes); +#endif + +#ifdef GSL_MMU_TRANSLATION_ENABLED + gsl_linux_map_init(); + hal->memspace[GSL_HAL_MEM1].mmio_virt_base = (void *)GSL_LINUX_MAP_RANGE_START; + hal->memspace[GSL_HAL_MEM1].gpu_base = GSL_LINUX_MAP_RANGE_START; + hal->memspace[GSL_HAL_MEM1].sizebytes = mem1size; +#else + hal->memspace[GSL_HAL_MEM1].mmio_virt_base = (void *) va; + hal->memspace[GSL_HAL_MEM1].gpu_base = pa; + hal->memspace[GSL_HAL_MEM1].sizebytes = mem1size; +#endif + +#ifdef GSL_HAL_DEBUG + printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM1].gpu_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM1].gpu_base); + printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM1].mmio_virt_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM1].mmio_virt_base); + printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM1].sizebytes = 0x%08x\n", __func__, hal->memspace[GSL_HAL_MEM1].sizebytes); +#endif + } + else + { + kgsl_hal_close(); + return (GSL_FAILURE_SYSTEMERROR); + } + + return GSL_SUCCESS; +} + +//---------------------------------------------------------------------------- + +KGSLHAL_API int +kgsl_hal_close(void) +{ + gsl_hal_t *hal; + + if (gsl_driver.hal) + { + // overlay structure on hal memory + hal = (gsl_hal_t *) gsl_driver.hal; + + // unmap registers +#if 0 + if (hal->z430_regspace.mmio_virt_base) + { + iounmap(hal->z430_regspace.mmio_virt_base); + } +#endif + if (hal->z160_regspace.mmio_virt_base) + { + iounmap(hal->z160_regspace.mmio_virt_base); + } + + // free physical block + if (hal->memchunk.mmio_virt_base) + { + dma_free_coherent(0, hal->memchunk.sizebytes, hal->memchunk.mmio_virt_base, hal->memchunk.mmio_phys_base); + } + +#ifdef GSL_MMU_TRANSLATION_ENABLED + gsl_linux_map_destroy(); +#endif + + // release hal struct + kos_memset(hal, 0, sizeof(gsl_hal_t)); + kos_free(gsl_driver.hal); + gsl_driver.hal = NULL; + } + + return (GSL_SUCCESS); +} + +//---------------------------------------------------------------------------- + +KGSLHAL_API int +kgsl_hal_getshmemconfig(gsl_shmemconfig_t *config) +{ + int status = GSL_FAILURE_DEVICEERROR; + gsl_hal_t *hal = (gsl_hal_t *) gsl_driver.hal; + + kos_memset(config, 0, sizeof(gsl_shmemconfig_t)); + + if (hal) + { + config->numapertures = GSL_SHMEM_MAX_APERTURES; + +#ifdef GSL_MMU_TRANSLATION_ENABLED + config->apertures[0].id = GSL_APERTURE_MMU; +#else + config->apertures[0].id = GSL_APERTURE_EMEM; +#endif + config->apertures[0].channel = GSL_CHANNEL_1; + config->apertures[0].hostbase = (unsigned int)hal->memspace[GSL_HAL_MEM1].mmio_virt_base; + config->apertures[0].gpubase = hal->memspace[GSL_HAL_MEM1].gpu_base; + config->apertures[0].sizebytes = hal->memspace[GSL_HAL_MEM1].sizebytes; + + config->apertures[1].id = GSL_APERTURE_EMEM; + config->apertures[1].channel = GSL_CHANNEL_2; + config->apertures[1].hostbase = (unsigned int)hal->memspace[GSL_HAL_MEM2].mmio_virt_base; + config->apertures[1].gpubase = hal->memspace[GSL_HAL_MEM2].gpu_base; + config->apertures[1].sizebytes = hal->memspace[GSL_HAL_MEM2].sizebytes; + + config->apertures[2].id = GSL_APERTURE_PHYS; + config->apertures[2].channel = GSL_CHANNEL_1; + config->apertures[2].hostbase = (unsigned int)hal->memspace[GSL_HAL_MEM3].mmio_virt_base; + config->apertures[2].gpubase = hal->memspace[GSL_HAL_MEM3].gpu_base; + config->apertures[2].sizebytes = hal->memspace[GSL_HAL_MEM3].sizebytes; + + status = GSL_SUCCESS; + } + + return (status); +} + +//---------------------------------------------------------------------------- + +KGSLHAL_API int +kgsl_hal_getdevconfig(gsl_deviceid_t device_id, gsl_devconfig_t *config) +{ + int status = GSL_FAILURE_DEVICEERROR; + gsl_hal_t *hal = (gsl_hal_t *) gsl_driver.hal; + + kos_memset(config, 0, sizeof(gsl_devconfig_t)); + + if (hal) + { + switch (device_id) + { + case GSL_DEVICE_YAMATO: + { +#if 0 + mh_mmu_config_u mmu_config = {0}; + + config->gmemspace.gpu_base = 0; + config->gmemspace.mmio_virt_base = 0; + config->gmemspace.mmio_phys_base = 0; + config->gmemspace.sizebytes = GSL_HAL_SIZE_GMEM; + + config->regspace.gpu_base = 0; + config->regspace.mmio_virt_base = (unsigned char *)hal->z430_regspace.mmio_virt_base; + config->regspace.mmio_phys_base = (unsigned int) hal->z430_regspace.mmio_phys_base; + config->regspace.sizebytes = GSL_HAL_SIZE_REG_YDX; + + mmu_config.f.mmu_enable = 1; +#ifdef GSL_MMU_TRANSLATION_ENABLED + mmu_config.f.split_mode_enable = 0; + mmu_config.f.rb_w_clnt_behavior = 1; + mmu_config.f.cp_w_clnt_behavior = 1; + mmu_config.f.cp_r0_clnt_behavior = 1; + mmu_config.f.cp_r1_clnt_behavior = 1; + mmu_config.f.cp_r2_clnt_behavior = 1; + mmu_config.f.cp_r3_clnt_behavior = 1; + mmu_config.f.cp_r4_clnt_behavior = 1; + mmu_config.f.vgt_r0_clnt_behavior = 1; + mmu_config.f.vgt_r1_clnt_behavior = 1; + mmu_config.f.tc_r_clnt_behavior = 1; + mmu_config.f.pa_w_clnt_behavior = 1; +#endif // GSL_MMU_TRANSLATION_ENABLED + + config->mmu_config = mmu_config.val; +#ifdef GSL_MMU_TRANSLATION_ENABLED + config->va_base = hal->memspace[GSL_HAL_MEM1].gpu_base; + config->va_range = hal->memspace[GSL_HAL_MEM1].sizebytes; +#else + config->va_base = 0x00000000; + config->va_range = 0x00000000; +#endif // GSL_MMU_TRANSLATION_ENABLED + + // turn off memory protection unit by setting acceptable physical address range to include all pages + config->mpu_base = 0x00000000; // hal->memchunk.mmio_virt_base; + config->mpu_range = 0xFFFFF000; // hal->memchunk.sizebytes; + + status = GSL_SUCCESS; +#endif + break; + } + + case GSL_DEVICE_G12: + { +#ifndef GSL_MMU_TRANSLATION_ENABLED + unsigned int mmu_config = {0}; +#endif + config->regspace.gpu_base = 0; + config->regspace.mmio_virt_base = (unsigned char *)hal->z160_regspace.mmio_virt_base; + config->regspace.mmio_phys_base = (unsigned int) hal->z160_regspace.mmio_phys_base; + config->regspace.sizebytes = GSL_HAL_SIZE_REG_G12; + + + +#ifdef GSL_MMU_TRANSLATION_ENABLED + config->mmu_config = 0x00555551; + config->va_base = hal->memspace[GSL_HAL_MEM1].gpu_base; + config->va_range = hal->memspace[GSL_HAL_MEM1].sizebytes; +#else + config->mmu_config = mmu_config; + config->va_base = 0x00000000; + config->va_range = 0x00000000; +#endif // GSL_MMU_TRANSLATION_ENABLED + + config->mpu_base = 0x00000000; //(unsigned int) hal->memchunk.mmio_virt_base; + config->mpu_range = 0xFFFFF000; //hal->memchunk.sizebytes; + + status = GSL_SUCCESS; + break; + } + + default: + + break; + } + } + + return (status); +} + +//---------------------------------------------------------------------------- +// +// kgsl_hal_getchipid +// +// The proper platform method, build from RBBM_PERIPHIDx and RBBM_PATCH_RELEASE +// +KGSLHAL_API gsl_chipid_t +kgsl_hal_getchipid(gsl_deviceid_t device_id) +{ + return (0); +} + +//---------------------------------------------------------------------------- + +KGSLHAL_API int +kgsl_hal_getplatformtype(char *platform) +{ + if (gsl_driver.hal) + { + kos_strcpy(platform, GSL_HAL_PLATFORM); + return (GSL_SUCCESS); + } + else + { + return (GSL_FAILURE_NOTINITIALIZED); + } +} + +//--------------------------------------------------------------------------- + +KGSLHAL_API int +kgsl_hal_setpowerstate(gsl_deviceid_t device_id, int state, unsigned int value) +{ + gsl_device_t *device = &gsl_driver.device[device_id-1]; // device_id is 1 based + struct clk *gpu_clk = 0; + + // unreferenced formal parameters + (void) value; + + switch (device_id) + { + case GSL_DEVICE_G12: + gpu_clk = clk_get(0, "gpu2d_clk"); + break; + default: + return (GSL_FAILURE_DEVICEERROR); + } + + if (!gpu_clk) + return (GSL_FAILURE_DEVICEERROR); + + switch (state) + { + case GSL_PWRFLAGS_CLK_ON: + break; + case GSL_PWRFLAGS_POWER_ON: + clk_enable(gpu_clk); + kgsl_device_autogate_init(&gsl_driver.device[device_id-1]); + break; + case GSL_PWRFLAGS_CLK_OFF: + break; + case GSL_PWRFLAGS_POWER_OFF: + if (device->ftbl.device_idle(device, GSL_TIMEOUT_DEFAULT) != GSL_SUCCESS) + { + return (GSL_FAILURE_DEVICEERROR); + } + kgsl_device_autogate_exit(&gsl_driver.device[device_id-1]); + clk_disable(gpu_clk); + break; + default: + break; + } + + return (GSL_SUCCESS); +} + +KGSLHAL_API int kgsl_clock(gsl_deviceid_t dev, int enable) +{ + struct clk *gpu_clk = 0; + + switch (dev) + { + case GSL_DEVICE_G12: + gpu_clk = clk_get(0, "gpu2d_clk"); + break; + default: + printk(KERN_ERR "GPU device %d is invalid!\n", dev); + return (GSL_FAILURE_DEVICEERROR); + } + + if (IS_ERR(gpu_clk)) { + printk(KERN_ERR "%s: GPU clock get failed!\n", __func__); + return (GSL_FAILURE_DEVICEERROR); + } + + if (enable) + clk_enable(gpu_clk); + else + clk_disable(gpu_clk); + + return (GSL_SUCCESS); +} diff --git a/drivers/mxc/amd-gpu/platform/hal/MX35/memcfg/gsl_memcfg.c b/drivers/mxc/amd-gpu/platform/hal/MX35/memcfg/gsl_memcfg.c new file mode 100644 index 000000000000..f3ca6191d7c2 --- /dev/null +++ b/drivers/mxc/amd-gpu/platform/hal/MX35/memcfg/gsl_memcfg.c @@ -0,0 +1,31 @@ +/* Copyright (c) 2008-2010, Advanced Micro Devices. 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 version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will 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 to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ + +#include "kos_libapi.h" + +// +// Return the maximum amount of memory that can be allocated to the Z160. This number +// will be constrained to 2MB as a minimum and the original hardcoded value for the caller +// as a maximum. If the return value is outside of this range, then the original value in +// the caller will be used. For this reason, returning 0 is used to signify to use the +// original value as the default. +// +KOS_DLLEXPORT unsigned long kgsl_get_z160_memory_amount(void) +{ + return(0); +} diff --git a/drivers/mxc/amd-gpu/platform/hal/MX35/memcfg/gsl_memcfg.h b/drivers/mxc/amd-gpu/platform/hal/MX35/memcfg/gsl_memcfg.h new file mode 100644 index 000000000000..164a17c925c4 --- /dev/null +++ b/drivers/mxc/amd-gpu/platform/hal/MX35/memcfg/gsl_memcfg.h @@ -0,0 +1,41 @@ +/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Advanced Micro Devices nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef GSL_MEMCFG_H +#define GSL_MEMCFG_H + +// +// Return the maximum amount of memory that can be allocated to the Z430. This number +// will be constrained to 2MB as a minimum and the original hardcoded value for the caller +// as a maximum. If the return value is outside of this range, then the original value in +// the caller will be used. For this reason, returning 0 is used to signify to use the +// original value as the default. +// +KOS_DLLEXPORT unsigned long kgsl_get_z160_memory_amount(void); + +#endif diff --git a/drivers/mxc/amd-gpu/platform/hal/MX51/gsl_buildconfig.h b/drivers/mxc/amd-gpu/platform/hal/MX51/gsl_buildconfig.h new file mode 100644 index 000000000000..82824f511d5e --- /dev/null +++ b/drivers/mxc/amd-gpu/platform/hal/MX51/gsl_buildconfig.h @@ -0,0 +1,62 @@ +/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Advanced Micro Devices nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef __GSL__BUILDCONFIG_H +#define __GSL__BUILDCONFIG_H + +#define GSL_BLD_YAMATO +#define GSL_BLD_G12 + +#define GSL_LOCKING_COURSEGRAIN + +#define GSL_STATS_MEM +#define GSL_STATS_RINGBUFFER +#define GSL_STATS_MMU + +#define GSL_RB_USE_MEM_RPTR +#define GSL_RB_USE_MEM_TIMESTAMP +#define GSL_RB_TIMESTAMP_INTERUPT +//#define GSL_RB_USE_WPTR_POLLING + +#if defined(_WIN32_WCE) && (_WIN32_WCE >= 600) +#define GSL_DEVICE_SHADOW_MEMSTORE_TO_USER +#endif + +//#define GSL_MMU_TRANSLATION_ENABLED +//#define GSL_MMU_PAGETABLE_PERPROCESS + +#define GSL_CALLER_PROCESS_MAX 10 +#define GSL_SHMEM_MAX_APERTURES 3 + +#ifdef _WIN32 +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE +#endif +#endif // _WIN32 + +#endif // __GSL__BUILDCONFIG_H diff --git a/drivers/mxc/amd-gpu/platform/hal/MX51/gsl_config.h b/drivers/mxc/amd-gpu/platform/hal/MX51/gsl_config.h new file mode 100644 index 000000000000..6fad1d01277f --- /dev/null +++ b/drivers/mxc/amd-gpu/platform/hal/MX51/gsl_config.h @@ -0,0 +1,222 @@ +/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Advanced Micro Devices nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef __GSL__CONFIG_H +#define __GSL__CONFIG_H + +// ------------------------ +// Yamato ringbuffer config +// ------------------------ +static const unsigned int gsl_cfg_rb_sizelog2quadwords = GSL_RB_SIZE_32K; +static const unsigned int gsl_cfg_rb_blksizequadwords = GSL_RB_SIZE_16; + +// ------------------------ +// Yamato MH arbiter config +// ------------------------ +static const mh_arbiter_config_t gsl_cfg_yamato_mharb = +{ + 0x10, // same_page_limit + 0, // same_page_granularity + 1, // l1_arb_enable + 1, // l1_arb_hold_enable + 0, // l2_arb_control + 1, // page_size + 1, // tc_reorder_enable + 1, // tc_arb_hold_enable + 1, // in_flight_limit_enable + 0x8, // in_flight_limit + 1, // cp_clnt_enable + 1, // vgt_clnt_enable + 1, // tc_clnt_enable + 1, // rb_clnt_enable + 1, // pa_clnt_enable +}; + +// --------------------- +// G12 MH arbiter config +// --------------------- +static const REG_MH_ARBITER_CONFIG gsl_cfg_g12_mharb = +{ + 0x10, // SAME_PAGE_LIMIT + 0, // SAME_PAGE_GRANULARITY + 1, // L1_ARB_ENABLE + 1, // L1_ARB_HOLD_ENABLE + 0, // L2_ARB_CONTROL + 1, // PAGE_SIZE + 1, // TC_REORDER_ENABLE + 1, // TC_ARB_HOLD_ENABLE + 0, // IN_FLIGHT_LIMIT_ENABLE + 0x8, // IN_FLIGHT_LIMIT + 1, // CP_CLNT_ENABLE + 1, // VGT_CLNT_ENABLE + 1, // TC_CLNT_ENABLE + 1, // RB_CLNT_ENABLE + 1, // PA_CLNT_ENABLE +}; + +// ----------------------------- +// interrupt block register data +// ----------------------------- +static const gsl_intrblock_reg_t gsl_cfg_intrblock_reg[GSL_INTR_BLOCK_COUNT] = +{ + { // Yamato MH + GSL_INTR_BLOCK_YDX_MH, + GSL_INTR_YDX_MH_AXI_READ_ERROR, + GSL_INTR_YDX_MH_MMU_PAGE_FAULT, + mmMH_INTERRUPT_STATUS, + mmMH_INTERRUPT_CLEAR, + mmMH_INTERRUPT_MASK + }, + { // Yamato CP + GSL_INTR_BLOCK_YDX_CP, + GSL_INTR_YDX_CP_SW_INT, + GSL_INTR_YDX_CP_RING_BUFFER, + mmCP_INT_STATUS, + mmCP_INT_ACK, + mmCP_INT_CNTL + }, + { // Yamato RBBM + GSL_INTR_BLOCK_YDX_RBBM, + GSL_INTR_YDX_RBBM_READ_ERROR, + GSL_INTR_YDX_RBBM_GUI_IDLE, + mmRBBM_INT_STATUS, + mmRBBM_INT_ACK, + mmRBBM_INT_CNTL + }, + { // Yamato SQ + GSL_INTR_BLOCK_YDX_SQ, + GSL_INTR_YDX_SQ_PS_WATCHDOG, + GSL_INTR_YDX_SQ_VS_WATCHDOG, + mmSQ_INT_STATUS, + mmSQ_INT_ACK, + mmSQ_INT_CNTL + }, + { // G12 + GSL_INTR_BLOCK_G12, + GSL_INTR_G12_MH, +#ifndef _Z180 + GSL_INTR_G12_FBC, +#else + GSL_INTR_G12_FIFO, +#endif //_Z180 + (ADDR_VGC_IRQSTATUS >> 2), + (ADDR_VGC_IRQSTATUS >> 2), + (ADDR_VGC_IRQENABLE >> 2) + }, + { // G12 MH + GSL_INTR_BLOCK_G12_MH, + GSL_INTR_G12_MH_AXI_READ_ERROR, + GSL_INTR_G12_MH_MMU_PAGE_FAULT, + ADDR_MH_INTERRUPT_STATUS, // G12 MH offsets are considered to be dword based, therefore no down shift + ADDR_MH_INTERRUPT_CLEAR, + ADDR_MH_INTERRUPT_MASK + }, +}; + +// ----------------------- +// interrupt mask bit data +// ----------------------- +static const int gsl_cfg_intr_mask[GSL_INTR_COUNT] = +{ + MH_INTERRUPT_MASK__AXI_READ_ERROR, + MH_INTERRUPT_MASK__AXI_WRITE_ERROR, + MH_INTERRUPT_MASK__MMU_PAGE_FAULT, + + CP_INT_CNTL__SW_INT_MASK, + CP_INT_CNTL__T0_PACKET_IN_IB_MASK, + CP_INT_CNTL__OPCODE_ERROR_MASK, + CP_INT_CNTL__PROTECTED_MODE_ERROR_MASK, + CP_INT_CNTL__RESERVED_BIT_ERROR_MASK, + CP_INT_CNTL__IB_ERROR_MASK, + CP_INT_CNTL__IB2_INT_MASK, + CP_INT_CNTL__IB1_INT_MASK, + CP_INT_CNTL__RB_INT_MASK, + + RBBM_INT_CNTL__RDERR_INT_MASK, + RBBM_INT_CNTL__DISPLAY_UPDATE_INT_MASK, + RBBM_INT_CNTL__GUI_IDLE_INT_MASK, + + SQ_INT_CNTL__PS_WATCHDOG_MASK, + SQ_INT_CNTL__VS_WATCHDOG_MASK, + + (1 << VGC_IRQENABLE_MH_FSHIFT), + (1 << VGC_IRQENABLE_G2D_FSHIFT), + (1 << VGC_IRQENABLE_FIFO_FSHIFT), +#ifndef _Z180 + (1 << VGC_IRQENABLE_FBC_FSHIFT), +#endif + (1 << MH_INTERRUPT_MASK_AXI_READ_ERROR_FSHIFT), + (1 << MH_INTERRUPT_MASK_AXI_WRITE_ERROR_FSHIFT), + (1 << MH_INTERRUPT_MASK_MMU_PAGE_FAULT_FSHIFT), +}; + +// ----------------- +// mmu register data +// ----------------- +static const gsl_mmu_reg_t gsl_cfg_mmu_reg[GSL_DEVICE_MAX] = +{ + { // Yamato + mmMH_MMU_CONFIG, + mmMH_MMU_MPU_BASE, + mmMH_MMU_MPU_END, + mmMH_MMU_VA_RANGE, + mmMH_MMU_PT_BASE, + mmMH_MMU_PAGE_FAULT, + mmMH_MMU_TRAN_ERROR, + mmMH_MMU_INVALIDATE, + }, + { // G12 - MH offsets are considered to be dword based, therefore no down shift + ADDR_MH_MMU_CONFIG, + ADDR_MH_MMU_MPU_BASE, + ADDR_MH_MMU_MPU_END, + ADDR_MH_MMU_VA_RANGE, + ADDR_MH_MMU_PT_BASE, + ADDR_MH_MMU_PAGE_FAULT, + ADDR_MH_MMU_TRAN_ERROR, + ADDR_MH_MMU_INVALIDATE, + } +}; + +// ----------------- +// mh interrupt data +// ----------------- +static const gsl_mh_intr_t gsl_cfg_mh_intr[GSL_DEVICE_MAX] = +{ + { // Yamato + GSL_INTR_YDX_MH_AXI_READ_ERROR, + GSL_INTR_YDX_MH_AXI_WRITE_ERROR, + GSL_INTR_YDX_MH_MMU_PAGE_FAULT, + }, + { // G12 + GSL_INTR_G12_MH_AXI_READ_ERROR, + GSL_INTR_G12_MH_AXI_WRITE_ERROR, + GSL_INTR_G12_MH_MMU_PAGE_FAULT, + } +}; + +#endif // __GSL__CONFIG_H diff --git a/drivers/mxc/amd-gpu/platform/hal/MX51/gsl_halconfig.h b/drivers/mxc/amd-gpu/platform/hal/MX51/gsl_halconfig.h new file mode 100644 index 000000000000..589c56fa9bfa --- /dev/null +++ b/drivers/mxc/amd-gpu/platform/hal/MX51/gsl_halconfig.h @@ -0,0 +1,58 @@ +/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Advanced Micro Devices nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef __GSL_HALCONFIG_H +#define __GSL_HALCONFIG_H + + +#define GSL_HAL_PLATFORM "i.MX51" + +#define GSL_HAL_GPUBASE_GMEM 0x00100000 // 1MB +#define GSL_HAL_GPUBASE_GMEM_PHYS 0x20000000 // 1MB + +#define GSL_HAL_GPUBASE_REG_YDX 0x30000000 +#define GSL_HAL_GPUBASE_REG_G12 0xD0000000 + +#define GSL_HAL_SIZE_REG_YDX 0x00020000 // 128KB +#define GSL_HAL_SIZE_REG_G12 0x00001000 // 4KB +#define GSL_HAL_SIZE_GMEM 0x00020000 // 128KB - 0 to 384KB in 128KB increments + +#if defined(GSL_MMU_TRANSLATION_ENABLED) +#define GSL_HAL_SHMEM_SIZE_EMEM1 0x02400000 // 36MB +#define GSL_HAL_SHMEM_SIZE_EMEM2 0x00400000 // 4MB +#define GSL_HAL_SHMEM_SIZE_PHYS 0x00400000 // 4MB +#else +#define GSL_HAL_SHMEM_SIZE_EMEM1 0x00D00000 // 13MB +#define GSL_HAL_SHMEM_SIZE_EMEM2 0x00200000 // 2MB +#define GSL_HAL_SHMEM_SIZE_PHYS 0x00100000 // 1MB +#endif + +#define MX51_G12_INTERRUPT 84 // Interrupt line taken from Reference Manual +#define MX51_YDX_INTERRUPT 12 // Interrupt line taken from Reference Manual + +#endif // __GSL_HALCONFIG_H diff --git a/drivers/mxc/amd-gpu/platform/hal/MX51/linux/gsl_hal.c b/drivers/mxc/amd-gpu/platform/hal/MX51/linux/gsl_hal.c new file mode 100644 index 000000000000..965416b59ec1 --- /dev/null +++ b/drivers/mxc/amd-gpu/platform/hal/MX51/linux/gsl_hal.c @@ -0,0 +1,598 @@ +/* Copyright (c) 2008-2010, Advanced Micro Devices. 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 version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will 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 to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ + +#include "gsl_hal.h" +#include "gsl_halconfig.h" +#include "gsl_memcfg.h" +#include "gsl_linux_map.h" + +#include <linux/clk.h> +#include <linux/kernel.h> +#include <linux/pci.h> +#include <linux/vmalloc.h> + +#include <asm/atomic.h> +#include <asm/uaccess.h> +#include <asm/tlbflush.h> +#include <asm/cacheflush.h> + +////////////////////////////////////////////////////////////////////////////// +// constants +////////////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////////////// +// defines +////////////////////////////////////////////////////////////////////////////// + +#define GSL_HAL_MEM1 0 +#define GSL_HAL_MEM2 1 +#define GSL_HAL_MEM3 2 + +//#define GSL_HAL_DEBUG + +////////////////////////////////////////////////////////////////////////////// +// types +////////////////////////////////////////////////////////////////////////////// + +typedef struct _gsl_hal_t { + gsl_memregion_t z160_regspace; + gsl_memregion_t z430_regspace; + gsl_memregion_t memchunk; + gsl_memregion_t memspace[GSL_SHMEM_MAX_APERTURES]; +} gsl_hal_t; + +extern phys_addr_t gpu_2d_regbase; +extern int gpu_2d_regsize; +extern phys_addr_t gpu_3d_regbase; +extern int gpu_3d_regsize; +extern int gmem_size; +extern phys_addr_t gpu_reserved_mem; +extern int gpu_reserved_mem_size; + +////////////////////////////////////////////////////////////////////////////// +// functions +////////////////////////////////////////////////////////////////////////////// + +KGSLHAL_API int +kgsl_hal_allocphysical(unsigned int virtaddr, unsigned int numpages, unsigned int scattergatterlist[]) +{ + // + // allocate physically contiguous memory + // + + int i; + void *va; + + va = gsl_linux_map_alloc(virtaddr, numpages*PAGE_SIZE); + + if (!va) + return (GSL_FAILURE_OUTOFMEM); + + for(i = 0; i < numpages; i++) + { + scattergatterlist[i] = page_to_phys(vmalloc_to_page(va)); + va += PAGE_SIZE; + } + + return (GSL_SUCCESS); +} + +// --------------------------------------------------------------------------- + +KGSLHAL_API int +kgsl_hal_freephysical(unsigned int virtaddr, unsigned int numpages, unsigned int scattergatterlist[]) +{ + // + // free physical memory + // + + gsl_linux_map_free(virtaddr); + + return(GSL_SUCCESS); +} + +//---------------------------------------------------------------------------- + +KGSLHAL_API int +kgsl_hal_init(void) +{ + gsl_hal_t *hal; + unsigned long totalsize, mem1size; + unsigned int va, pa; + + if (gsl_driver.hal) + { + return (GSL_FAILURE_ALREADYINITIALIZED); + } + + gsl_driver.hal = (void *)kos_malloc(sizeof(gsl_hal_t)); + + if (!gsl_driver.hal) + { + return (GSL_FAILURE_OUTOFMEM); + } + + kos_memset(gsl_driver.hal, 0, sizeof(gsl_hal_t)); + + + // overlay structure on hal memory + hal = (gsl_hal_t *) gsl_driver.hal; + + // setup register space + if(gpu_3d_regbase && gpu_3d_regsize){ + hal->z430_regspace.mmio_phys_base = gpu_3d_regbase; + hal->z430_regspace.sizebytes = gpu_3d_regsize; + }else{ + hal->z430_regspace.mmio_phys_base = GSL_HAL_GPUBASE_REG_YDX; + hal->z430_regspace.sizebytes = GSL_HAL_SIZE_REG_YDX; + } + hal->z430_regspace.mmio_virt_base = (unsigned char*)ioremap(hal->z430_regspace.mmio_phys_base, hal->z430_regspace.sizebytes); + + if (hal->z430_regspace.mmio_virt_base == NULL) + { + return (GSL_FAILURE_SYSTEMERROR); + } + +#ifdef GSL_HAL_DEBUG + printk(KERN_INFO "%s: hal->z430_regspace.mmio_phys_base = 0x%p\n", __func__, (void*)hal->z430_regspace.mmio_phys_base); + printk(KERN_INFO "%s: hal->z430_regspace.mmio_virt_base = 0x%p\n", __func__, (void*)hal->z430_regspace.mmio_virt_base); + printk(KERN_INFO "%s: hal->z430_regspace.sizebytes = 0x%08x\n", __func__, hal->z430_regspace.sizebytes); +#endif + + if(gpu_2d_regbase && gpu_2d_regsize){ + hal->z160_regspace.mmio_phys_base = gpu_2d_regbase; + hal->z160_regspace.sizebytes = gpu_2d_regsize; + }else{ + hal->z160_regspace.mmio_phys_base = GSL_HAL_GPUBASE_REG_G12; + hal->z160_regspace.sizebytes = GSL_HAL_SIZE_REG_G12; + } + hal->z160_regspace.mmio_virt_base = (unsigned char*)ioremap(hal->z160_regspace.mmio_phys_base, hal->z160_regspace.sizebytes); + + if (hal->z160_regspace.mmio_virt_base == NULL) + { + return (GSL_FAILURE_SYSTEMERROR); + } + +#ifdef GSL_HAL_DEBUG + printk(KERN_INFO "%s: hal->z160_regspace.mmio_phys_base = 0x%p\n", __func__, (void*)hal->z160_regspace.mmio_phys_base); + printk(KERN_INFO "%s: hal->z160_regspace.mmio_virt_base = 0x%p\n", __func__, (void*)hal->z160_regspace.mmio_virt_base); + printk(KERN_INFO "%s: hal->z160_regspace.sizebytes = 0x%08x\n", __func__, hal->z160_regspace.sizebytes); +#endif + +#ifdef GSL_MMU_TRANSLATION_ENABLED + totalsize = GSL_HAL_SHMEM_SIZE_EMEM2 + GSL_HAL_SHMEM_SIZE_PHYS; + mem1size = GSL_HAL_SHMEM_SIZE_EMEM1; + if (gpu_reserved_mem && gpu_reserved_mem_size >= totalsize) + { + pa = gpu_reserved_mem; + va = (unsigned int)ioremap(gpu_reserved_mem, totalsize); + } + else + { + va = (unsigned int)dma_alloc_coherent(0, totalsize, (dma_addr_t *)&pa, GFP_DMA | GFP_KERNEL); + } +#else + if(gpu_reserved_mem && gpu_reserved_mem_size >= SZ_8M){ + totalsize = gpu_reserved_mem_size; + pa = gpu_reserved_mem; + va = (unsigned int)ioremap(gpu_reserved_mem, gpu_reserved_mem_size); + }else{ + gpu_reserved_mem = 0; + totalsize = GSL_HAL_SHMEM_SIZE_EMEM1 + GSL_HAL_SHMEM_SIZE_EMEM2 + GSL_HAL_SHMEM_SIZE_PHYS; + va = (unsigned int)dma_alloc_coherent(0, totalsize, (dma_addr_t *)&pa, GFP_DMA | GFP_KERNEL); + } + mem1size = totalsize - (GSL_HAL_SHMEM_SIZE_EMEM2 + GSL_HAL_SHMEM_SIZE_PHYS); +#endif + + if (va) + { + kos_memset((void *)va, 0, totalsize); + + hal->memchunk.mmio_virt_base = (void *)va; + hal->memchunk.mmio_phys_base = pa; + hal->memchunk.sizebytes = totalsize; + +#ifdef GSL_HAL_DEBUG + printk(KERN_INFO "%s: hal->memchunk.mmio_phys_base = 0x%p\n", __func__, (void*)hal->memchunk.mmio_phys_base); + printk(KERN_INFO "%s: hal->memchunk.mmio_virt_base = 0x%p\n", __func__, (void*)hal->memchunk.mmio_virt_base); + printk(KERN_INFO "%s: hal->memchunk.sizebytes = 0x%08x\n", __func__, hal->memchunk.sizebytes); +#endif + + hal->memspace[GSL_HAL_MEM2].mmio_virt_base = (void *) va; + hal->memspace[GSL_HAL_MEM2].gpu_base = pa; + hal->memspace[GSL_HAL_MEM2].sizebytes = GSL_HAL_SHMEM_SIZE_EMEM2; + va += GSL_HAL_SHMEM_SIZE_EMEM2; + pa += GSL_HAL_SHMEM_SIZE_EMEM2; + +#ifdef GSL_HAL_DEBUG + printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM2].gpu_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM2].gpu_base); + printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM2].mmio_virt_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM2].mmio_virt_base); + printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM2].sizebytes = 0x%08x\n", __func__, hal->memspace[GSL_HAL_MEM2].sizebytes); +#endif + + hal->memspace[GSL_HAL_MEM3].mmio_virt_base = (void *) va; + hal->memspace[GSL_HAL_MEM3].gpu_base = pa; + hal->memspace[GSL_HAL_MEM3].sizebytes = GSL_HAL_SHMEM_SIZE_PHYS; + va += GSL_HAL_SHMEM_SIZE_PHYS; + pa += GSL_HAL_SHMEM_SIZE_PHYS; + +#ifdef GSL_HAL_DEBUG + printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM3].gpu_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM3].gpu_base); + printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM3].mmio_virt_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM3].mmio_virt_base); + printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM3].sizebytes = 0x%08x\n", __func__, hal->memspace[GSL_HAL_MEM3].sizebytes); +#endif + +#ifdef GSL_MMU_TRANSLATION_ENABLED + gsl_linux_map_init(); + hal->memspace[GSL_HAL_MEM1].mmio_virt_base = (void *)GSL_LINUX_MAP_RANGE_START; + hal->memspace[GSL_HAL_MEM1].gpu_base = GSL_LINUX_MAP_RANGE_START; + hal->memspace[GSL_HAL_MEM1].sizebytes = mem1size; +#else + hal->memspace[GSL_HAL_MEM1].mmio_virt_base = (void *) va; + hal->memspace[GSL_HAL_MEM1].gpu_base = pa; + hal->memspace[GSL_HAL_MEM1].sizebytes = mem1size; +#endif + +#ifdef GSL_HAL_DEBUG + printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM1].gpu_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM1].gpu_base); + printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM1].mmio_virt_base = 0x%p\n", __func__, (void*)hal->memspace[GSL_HAL_MEM1].mmio_virt_base); + printk(KERN_INFO "%s: hal->memspace[GSL_HAL_MEM1].sizebytes = 0x%08x\n", __func__, hal->memspace[GSL_HAL_MEM1].sizebytes); +#endif + } + else + { + kgsl_hal_close(); + return (GSL_FAILURE_SYSTEMERROR); + } + + return GSL_SUCCESS; +} + +//---------------------------------------------------------------------------- + +KGSLHAL_API int +kgsl_hal_close(void) +{ + gsl_hal_t *hal; + + if (gsl_driver.hal) + { + // overlay structure on hal memory + hal = (gsl_hal_t *) gsl_driver.hal; + + // unmap registers + if (hal->z430_regspace.mmio_virt_base) + { + iounmap(hal->z430_regspace.mmio_virt_base); + } + if (hal->z160_regspace.mmio_virt_base) + { + iounmap(hal->z160_regspace.mmio_virt_base); + } + + // free physical block + if (hal->memchunk.mmio_virt_base && gpu_reserved_mem) + { + iounmap(hal->memchunk.mmio_virt_base); + } + else + { + dma_free_coherent(0, hal->memchunk.sizebytes, hal->memchunk.mmio_virt_base, hal->memchunk.mmio_phys_base); + } + +#ifdef GSL_MMU_TRANSLATION_ENABLED + gsl_linux_map_destroy(); +#endif + + // release hal struct + kos_memset(hal, 0, sizeof(gsl_hal_t)); + kos_free(gsl_driver.hal); + gsl_driver.hal = NULL; + } + + return (GSL_SUCCESS); +} + +//---------------------------------------------------------------------------- + +KGSLHAL_API int +kgsl_hal_getshmemconfig(gsl_shmemconfig_t *config) +{ + int status = GSL_FAILURE_DEVICEERROR; + gsl_hal_t *hal = (gsl_hal_t *) gsl_driver.hal; + + kos_memset(config, 0, sizeof(gsl_shmemconfig_t)); + + if (hal) + { + config->numapertures = GSL_SHMEM_MAX_APERTURES; + +#ifdef GSL_MMU_TRANSLATION_ENABLED + config->apertures[0].id = GSL_APERTURE_MMU; +#else + config->apertures[0].id = GSL_APERTURE_EMEM; +#endif + config->apertures[0].channel = GSL_CHANNEL_1; + config->apertures[0].hostbase = (unsigned int)hal->memspace[GSL_HAL_MEM1].mmio_virt_base; + config->apertures[0].gpubase = hal->memspace[GSL_HAL_MEM1].gpu_base; + config->apertures[0].sizebytes = hal->memspace[GSL_HAL_MEM1].sizebytes; + + config->apertures[1].id = GSL_APERTURE_EMEM; + config->apertures[1].channel = GSL_CHANNEL_2; + config->apertures[1].hostbase = (unsigned int)hal->memspace[GSL_HAL_MEM2].mmio_virt_base; + config->apertures[1].gpubase = hal->memspace[GSL_HAL_MEM2].gpu_base; + config->apertures[1].sizebytes = hal->memspace[GSL_HAL_MEM2].sizebytes; + + config->apertures[2].id = GSL_APERTURE_PHYS; + config->apertures[2].channel = GSL_CHANNEL_1; + config->apertures[2].hostbase = (unsigned int)hal->memspace[GSL_HAL_MEM3].mmio_virt_base; + config->apertures[2].gpubase = hal->memspace[GSL_HAL_MEM3].gpu_base; + config->apertures[2].sizebytes = hal->memspace[GSL_HAL_MEM3].sizebytes; + + status = GSL_SUCCESS; + } + + return (status); +} + +//---------------------------------------------------------------------------- + +KGSLHAL_API int +kgsl_hal_getdevconfig(gsl_deviceid_t device_id, gsl_devconfig_t *config) +{ + int status = GSL_FAILURE_DEVICEERROR; + gsl_hal_t *hal = (gsl_hal_t *) gsl_driver.hal; + + kos_memset(config, 0, sizeof(gsl_devconfig_t)); + + if (hal) + { + switch (device_id) + { + case GSL_DEVICE_YAMATO: + { + mh_mmu_config_u mmu_config = {0}; + + config->gmemspace.gpu_base = 0; + config->gmemspace.mmio_virt_base = 0; + config->gmemspace.mmio_phys_base = 0; + if(gmem_size){ + config->gmemspace.sizebytes = gmem_size; + }else{ + config->gmemspace.sizebytes = GSL_HAL_SIZE_GMEM; + } + + config->regspace.gpu_base = 0; + config->regspace.mmio_virt_base = (unsigned char *)hal->z430_regspace.mmio_virt_base; + config->regspace.mmio_phys_base = (unsigned int) hal->z430_regspace.mmio_phys_base; + config->regspace.sizebytes = GSL_HAL_SIZE_REG_YDX; + + mmu_config.f.mmu_enable = 1; +#ifdef GSL_MMU_TRANSLATION_ENABLED + mmu_config.f.split_mode_enable = 0; + mmu_config.f.rb_w_clnt_behavior = 1; + mmu_config.f.cp_w_clnt_behavior = 1; + mmu_config.f.cp_r0_clnt_behavior = 1; + mmu_config.f.cp_r1_clnt_behavior = 1; + mmu_config.f.cp_r2_clnt_behavior = 1; + mmu_config.f.cp_r3_clnt_behavior = 1; + mmu_config.f.cp_r4_clnt_behavior = 1; + mmu_config.f.vgt_r0_clnt_behavior = 1; + mmu_config.f.vgt_r1_clnt_behavior = 1; + mmu_config.f.tc_r_clnt_behavior = 1; + mmu_config.f.pa_w_clnt_behavior = 1; +#endif // GSL_MMU_TRANSLATION_ENABLED + + config->mmu_config = mmu_config.val; +#ifdef GSL_MMU_TRANSLATION_ENABLED + config->va_base = hal->memspace[GSL_HAL_MEM1].gpu_base; + config->va_range = hal->memspace[GSL_HAL_MEM1].sizebytes; +#else + config->va_base = 0x00000000; + config->va_range = 0x00000000; +#endif // GSL_MMU_TRANSLATION_ENABLED + + // turn off memory protection unit by setting acceptable physical address range to include all pages + config->mpu_base = 0x00000000; // hal->memchunk.mmio_virt_base; + config->mpu_range = 0xFFFFF000; // hal->memchunk.sizebytes; + + status = GSL_SUCCESS; + break; + } + + case GSL_DEVICE_G12: + { + mh_mmu_config_u mmu_config = {0}; + + config->regspace.gpu_base = 0; + config->regspace.mmio_virt_base = (unsigned char *)hal->z160_regspace.mmio_virt_base; + config->regspace.mmio_phys_base = (unsigned int) hal->z160_regspace.mmio_phys_base; + config->regspace.sizebytes = GSL_HAL_SIZE_REG_G12; + + mmu_config.f.mmu_enable = 1; + +#ifdef GSL_MMU_TRANSLATION_ENABLED + config->mmu_config = 0x00555551; + config->va_base = hal->memspace[GSL_HAL_MEM1].gpu_base; + config->va_range = hal->memspace[GSL_HAL_MEM1].sizebytes; +#else + config->mmu_config = mmu_config.val; + config->va_base = 0x00000000; + config->va_range = 0x00000000; +#endif // GSL_MMU_TRANSLATION_ENABLED + + config->mpu_base = 0x00000000; //(unsigned int) hal->memchunk.mmio_virt_base; + config->mpu_range = 0xFFFFF000; //hal->memchunk.sizebytes; + + status = GSL_SUCCESS; + break; + } + + default: + + break; + } + } + + return (status); +} + +//---------------------------------------------------------------------------- +// +// kgsl_hal_getchipid +// +// The proper platform method, build from RBBM_PERIPHIDx and RBBM_PATCH_RELEASE +// +KGSLHAL_API gsl_chipid_t +kgsl_hal_getchipid(gsl_deviceid_t device_id) +{ + gsl_device_t *device = &gsl_driver.device[device_id-1]; + gsl_chipid_t chipid; + unsigned int coreid, majorid, minorid, patchid, revid; + + // YDX + device->ftbl.device_regread(device, mmRBBM_PERIPHID1, &coreid); + coreid &= 0xF; + + // 2. + device->ftbl.device_regread(device, mmRBBM_PERIPHID2, &majorid); + majorid = (majorid >> 4) & 0xF; + + device->ftbl.device_regread(device, mmRBBM_PATCH_RELEASE, &revid); + + // 2. + minorid = ((revid >> 0) & 0xFF); // this is a 16bit field, but extremely unlikely it would ever get this high + + // 1 + patchid = ((revid >> 16) & 0xFF); + + chipid = ((coreid << 24) | (majorid << 16) | (minorid << 8) | (patchid << 0)); + + return (chipid); +} + +//---------------------------------------------------------------------------- + +KGSLHAL_API int +kgsl_hal_getplatformtype(char *platform) +{ + if (gsl_driver.hal) + { + kos_strcpy(platform, GSL_HAL_PLATFORM); + return (GSL_SUCCESS); + } + else + { + return (GSL_FAILURE_NOTINITIALIZED); + } +} + +//--------------------------------------------------------------------------- + +KGSLHAL_API int +kgsl_hal_setpowerstate(gsl_deviceid_t device_id, int state, unsigned int value) +{ + gsl_device_t *device = &gsl_driver.device[device_id-1]; + struct clk *gpu_clk = 0; + struct clk *garb_clk = clk_get(0, "garb_clk"); + struct clk *emi_garb_clk = clk_get(0, "emi_garb_clk"); + + // unreferenced formal parameters + (void) value; + + switch (device_id) + { + case GSL_DEVICE_G12: + gpu_clk = clk_get(0, "gpu2d_clk"); + break; + case GSL_DEVICE_YAMATO: + gpu_clk = clk_get(0, "gpu3d_clk"); + break; + default: + return (GSL_FAILURE_DEVICEERROR); + } + + if (!gpu_clk) + return (GSL_FAILURE_DEVICEERROR); + + switch (state) + { + case GSL_PWRFLAGS_CLK_ON: + break; + case GSL_PWRFLAGS_POWER_ON: + clk_enable(gpu_clk); + clk_enable(garb_clk); + clk_enable(emi_garb_clk); + kgsl_device_autogate_init(&gsl_driver.device[device_id-1]); + break; + case GSL_PWRFLAGS_CLK_OFF: + break; + case GSL_PWRFLAGS_POWER_OFF: + if (device->ftbl.device_idle(device, GSL_TIMEOUT_DEFAULT) != GSL_SUCCESS) + { + return (GSL_FAILURE_DEVICEERROR); + } + kgsl_device_autogate_exit(&gsl_driver.device[device_id-1]); + clk_disable(gpu_clk); + clk_disable(garb_clk); + clk_disable(emi_garb_clk); + break; + default: + break; + } + + return (GSL_SUCCESS); +} + +KGSLHAL_API int kgsl_clock(gsl_deviceid_t dev, int enable) +{ + struct clk *gpu_clk; + struct clk *garb_clk = clk_get(0, "garb_clk"); + struct clk *emi_garb_clk = clk_get(0, "emi_garb_clk"); + + switch (dev) + { + case GSL_DEVICE_G12: + gpu_clk = clk_get(0, "gpu2d_clk"); + break; + case GSL_DEVICE_YAMATO: + gpu_clk = clk_get(0, "gpu3d_clk"); + break; + default: + printk(KERN_ERR "GPU device %d is invalid!\n", dev); + return (GSL_FAILURE_DEVICEERROR); + } + + if (IS_ERR(gpu_clk)) { + printk(KERN_ERR "%s: GPU clock get failed!\n", __func__); + return (GSL_FAILURE_DEVICEERROR); + } + + if (enable) { + clk_enable(gpu_clk); + clk_enable(garb_clk); + clk_enable(emi_garb_clk); + } else { + clk_disable(gpu_clk); + clk_disable(garb_clk); + clk_disable(emi_garb_clk); + } + + return (GSL_SUCCESS); +} diff --git a/drivers/mxc/amd-gpu/platform/hal/MX51/memcfg/gsl_memcfg.c b/drivers/mxc/amd-gpu/platform/hal/MX51/memcfg/gsl_memcfg.c new file mode 100644 index 000000000000..93fab327a830 --- /dev/null +++ b/drivers/mxc/amd-gpu/platform/hal/MX51/memcfg/gsl_memcfg.c @@ -0,0 +1,31 @@ +/* Copyright (c) 2008-2010, Advanced Micro Devices. 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 version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will 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 to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ + +#include "kos_libapi.h" + +// +// Return the maximum amount of memory that can be allocated to the Z430. This number +// will be constrained to 2MB as a minimum and the original hardcoded value for the caller +// as a maximum. If the return value is outside of this range, then the original value in +// the caller will be used. For this reason, returning 0 is used to signify to use the +// original value as the default. +// +KOS_DLLEXPORT unsigned long kgsl_get_z430_memory_amount(void) +{ + return(0); +} diff --git a/drivers/mxc/amd-gpu/platform/hal/MX51/memcfg/gsl_memcfg.h b/drivers/mxc/amd-gpu/platform/hal/MX51/memcfg/gsl_memcfg.h new file mode 100644 index 000000000000..e68387f1609a --- /dev/null +++ b/drivers/mxc/amd-gpu/platform/hal/MX51/memcfg/gsl_memcfg.h @@ -0,0 +1,40 @@ +/* Copyright (c) 2008-2010, Advanced Micro Devices. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Advanced Micro Devices nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef GSL_MEMCFG_H +#define GSL_MEMCFG_H + +// +// Return the maximum amount of memory that can be allocated to the Z430. This number +// will be constrained to 2MB as a minimum and the original hardcoded value for the caller +// as a maximum. If the return value is outside of this range, then the original value in +// the caller will be used. For this reason, returning 0 is used to signify to use the +// original value as the default. +// +KOS_DLLEXPORT unsigned long kgsl_get_z430_memory_amount(void); +#endif diff --git a/drivers/mxc/amd-gpu/platform/hal/linux/gsl_hwaccess.h b/drivers/mxc/amd-gpu/platform/hal/linux/gsl_hwaccess.h index 305b2ee9066d..65eadb1e79cf 100644 --- a/drivers/mxc/amd-gpu/platform/hal/linux/gsl_hwaccess.h +++ b/drivers/mxc/amd-gpu/platform/hal/linux/gsl_hwaccess.h @@ -40,9 +40,14 @@ OSINLINE void kgsl_hwaccess_memread(void *dst, unsigned int gpubase, unsigned int gpuoffset, unsigned int sizebytes, unsigned int touserspace) { - if (gsl_driver.enable_mmu && (gpubase >= GSL_LINUX_MAP_RANGE_START) && (gpubase < GSL_LINUX_MAP_RANGE_END)) { +#ifdef GSL_MMU_TRANSLATION_ENABLED + if(gpubase >= GSL_LINUX_MAP_RANGE_START && gpubase < GSL_LINUX_MAP_RANGE_END) + { gsl_linux_map_read(dst, gpubase+gpuoffset, sizebytes, touserspace); - } else { + } + else +#endif + { mb(); dsb(); if (touserspace) @@ -66,9 +71,14 @@ kgsl_hwaccess_memread(void *dst, unsigned int gpubase, unsigned int gpuoffset, u OSINLINE void kgsl_hwaccess_memwrite(unsigned int gpubase, unsigned int gpuoffset, void *src, unsigned int sizebytes, unsigned int fromuserspace) { - if (gsl_driver.enable_mmu && (gpubase >= GSL_LINUX_MAP_RANGE_START) && (gpubase < GSL_LINUX_MAP_RANGE_END)) { +#ifdef GSL_MMU_TRANSLATION_ENABLED + if(gpubase >= GSL_LINUX_MAP_RANGE_START && gpubase < GSL_LINUX_MAP_RANGE_END) + { gsl_linux_map_write(src, gpubase+gpuoffset, sizebytes, fromuserspace); - } else { + } + else +#endif + { mb(); dsb(); if (fromuserspace) @@ -92,9 +102,12 @@ kgsl_hwaccess_memwrite(unsigned int gpubase, unsigned int gpuoffset, void *src, OSINLINE void kgsl_hwaccess_memset(unsigned int gpubase, unsigned int gpuoffset, unsigned int value, unsigned int sizebytes) { - if (gsl_driver.enable_mmu && (gpubase >= GSL_LINUX_MAP_RANGE_START) && (gpubase < GSL_LINUX_MAP_RANGE_END)) { - gsl_linux_map_set(gpuoffset+gpubase, value, sizebytes); - } else { +#ifdef GSL_MMU_TRANSLATION_ENABLED + if(gpubase >= GSL_LINUX_MAP_RANGE_START && gpubase < GSL_LINUX_MAP_RANGE_END) + gsl_linux_map_set(gpuoffset+gpubase, value, sizebytes); + else +#endif + { mb(); dsb(); kos_memset((void *)(gpubase + gpuoffset), value, sizebytes); diff --git a/drivers/mxc/amd-gpu/platform/hal/linux/gsl_kmod.c b/drivers/mxc/amd-gpu/platform/hal/linux/gsl_kmod.c index bef8684ad131..30f783e1cf12 100644 --- a/drivers/mxc/amd-gpu/platform/hal/linux/gsl_kmod.c +++ b/drivers/mxc/amd-gpu/platform/hal/linux/gsl_kmod.c @@ -39,7 +39,7 @@ #include <linux/platform_device.h> #include <linux/vmalloc.h> -int gpu_2d_irq, gpu_3d_irq; +static int gpu_2d_irq, gpu_3d_irq; phys_addr_t gpu_2d_regbase; int gpu_2d_regsize; @@ -48,7 +48,6 @@ int gpu_3d_regsize; int gmem_size; phys_addr_t gpu_reserved_mem; int gpu_reserved_mem_size; -int z160_version; static ssize_t gsl_kmod_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr); static ssize_t gsl_kmod_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr); @@ -58,7 +57,9 @@ static int gsl_kmod_fault(struct vm_area_struct *vma, struct vm_fault *vmf); static int gsl_kmod_open(struct inode *inode, struct file *fd); static int gsl_kmod_release(struct inode *inode, struct file *fd); static irqreturn_t z160_irq_handler(int irq, void *dev_id); +#if defined(MX51) static irqreturn_t z430_irq_handler(int irq, void *dev_id); +#endif static int gsl_kmod_major; static struct class *gsl_kmod_class; @@ -633,24 +634,34 @@ static int gsl_kmod_mmap(struct file *fd, struct vm_area_struct *vma) unsigned long pfn = vma->vm_pgoff; unsigned long size = vma->vm_end - vma->vm_start; unsigned long prot = pgprot_writecombine(vma->vm_page_prot); - unsigned long addr = vma->vm_pgoff << PAGE_SHIFT; - void *va = NULL; - - if (gsl_driver.enable_mmu && (addr < GSL_LINUX_MAP_RANGE_END) && (addr >= GSL_LINUX_MAP_RANGE_START)) { - va = gsl_linux_map_find(addr); - while (size > 0) { - if (remap_pfn_range(vma, start, vmalloc_to_pfn(va), PAGE_SIZE, prot)) { - return -EAGAIN; - } - start += PAGE_SIZE; - va += PAGE_SIZE; - size -= PAGE_SIZE; +#ifdef GSL_MMU_TRANSLATION_ENABLED + unsigned long addr = vma->vm_pgoff << PAGE_SHIFT; + void *va; +#endif + +#ifdef GSL_MMU_TRANSLATION_ENABLED + if (addr < GSL_LINUX_MAP_RANGE_END && addr >= GSL_LINUX_MAP_RANGE_START) + { + va = gsl_linux_map_find(addr); + while (size > 0) + { + if (remap_pfn_range(vma, start, vmalloc_to_pfn(va), PAGE_SIZE, prot)) + { + return -EAGAIN; + } + start += PAGE_SIZE; + va += PAGE_SIZE; + size -= PAGE_SIZE; + } } - } else { - if (remap_pfn_range(vma, start, pfn, size, prot)) { - status = -EAGAIN; + else +#endif + { + if (remap_pfn_range(vma, start, pfn, size, prot)) + { + status = -EAGAIN; + } } - } vma->vm_ops = &gsl_kmod_vmops; @@ -742,11 +753,13 @@ static irqreturn_t z160_irq_handler(int irq, void *dev_id) return IRQ_HANDLED; } +#if defined(MX51) static irqreturn_t z430_irq_handler(int irq, void *dev_id) { kgsl_intr_isr(); return IRQ_HANDLED; } +#endif static int gpu_probe(struct platform_device *pdev) { @@ -754,11 +767,6 @@ static int gpu_probe(struct platform_device *pdev) struct resource *res; struct device *dev; - if (pdev->dev.platform_data) - z160_version = *((int *)(pdev->dev.platform_data)); - else - z160_version = 0; - for(i = 0; i < 2; i++){ res = platform_get_resource(pdev, IORESOURCE_IRQ, i); if (!res) { @@ -803,26 +811,24 @@ static int gpu_probe(struct platform_device *pdev) } } - if (gpu_3d_irq > 0) + if (kgsl_driver_init() != GSL_SUCCESS) { - if (request_irq(gpu_3d_irq, z430_irq_handler, 0, "ydx", NULL) < 0) { - printk(KERN_ERR "%s: request_irq error\n", __func__); - gpu_3d_irq = 0; - goto request_irq_error; - } + printk(KERN_ERR "%s: kgsl_driver_init error\n", __func__); + goto kgsl_driver_init_error; } - if (gpu_2d_irq > 0) +#if defined(MX51) + if (request_irq(gpu_3d_irq, z430_irq_handler, 0, "ydx", NULL) < 0) { - if (request_irq(gpu_2d_irq, z160_irq_handler, 0, "g12", NULL) < 0) { - printk(KERN_ERR "2D Acceleration Enabled, OpenVG Disabled!\n"); - gpu_2d_irq = 0; - } + printk(KERN_ERR "%s: request_irq error\n", __func__); + goto request_irq_error; } +#endif - if (kgsl_driver_init() != GSL_SUCCESS) { - printk(KERN_ERR "%s: kgsl_driver_init error\n", __func__); - goto kgsl_driver_init_error; + if (request_irq(gpu_2d_irq, z160_irq_handler, 0, "g12", NULL) < 0) + { + printk(KERN_ERR "2D Acceleration Enabled, OpenVG Disabled!\n"); + gpu_2d_irq = 0; } gsl_kmod_major = register_chrdev(0, "gsl_kmod", &gsl_kmod_fops); @@ -862,15 +868,9 @@ class_create_error: register_chrdev_error: unregister_chrdev(gsl_kmod_major, "gsl_kmod"); +request_irq_error: kgsl_driver_init_error: kgsl_driver_close(); - if (gpu_2d_irq > 0) { - free_irq(gpu_2d_irq, NULL); - } - if (gpu_3d_irq > 0) { - free_irq(gpu_3d_irq, NULL); - } -request_irq_error: return 0; // TODO: return proper error code } @@ -879,7 +879,7 @@ static int gpu_remove(struct platform_device *pdev) device_destroy(gsl_kmod_class, MKDEV(gsl_kmod_major, 0)); class_destroy(gsl_kmod_class); unregister_chrdev(gsl_kmod_major, "gsl_kmod"); - +#if defined(MX51) if (gpu_3d_irq) { free_irq(gpu_3d_irq, NULL); @@ -889,7 +889,12 @@ static int gpu_remove(struct platform_device *pdev) { free_irq(gpu_2d_irq, NULL); } - +#elif defined(MX35) + if (gpu_2d_irq) + { + free_irq(gpu_2d_irq, NULL); + } +#endif kgsl_driver_close(); return 0; } @@ -960,5 +965,9 @@ static void __exit gsl_kmod_exit(void) module_init(gsl_kmod_init); module_exit(gsl_kmod_exit); MODULE_AUTHOR("Advanced Micro Devices"); -MODULE_DESCRIPTION("AMD graphics core driver for i.MX"); +#if defined(MX51) +MODULE_DESCRIPTION("AMD 2D/3D graphics core driver for i.MX51"); +#elif defined(MX35) +MODULE_DESCRIPTION("AMD 2D graphics core driver for i.MX35"); +#endif MODULE_LICENSE("GPL v2"); diff --git a/drivers/mxc/amd-gpu/platform/hal/linux/gsl_linux_map.h b/drivers/mxc/amd-gpu/platform/hal/linux/gsl_linux_map.h index ebbe94a75e10..0469d2b912be 100644 --- a/drivers/mxc/amd-gpu/platform/hal/linux/gsl_linux_map.h +++ b/drivers/mxc/amd-gpu/platform/hal/linux/gsl_linux_map.h @@ -32,7 +32,7 @@ #include "gsl_halconfig.h" #define GSL_LINUX_MAP_RANGE_START (1024*1024) -#define GSL_LINUX_MAP_RANGE_END (GSL_LINUX_MAP_RANGE_START+GSL_HAL_SHMEM_SIZE_EMEM1_MMU) +#define GSL_LINUX_MAP_RANGE_END (GSL_LINUX_MAP_RANGE_START+GSL_HAL_SHMEM_SIZE_EMEM1) int gsl_linux_map_init(void); void *gsl_linux_map_alloc(unsigned int gpu_addr, unsigned int size); diff --git a/drivers/mxc/ipu3/ipu_capture.c b/drivers/mxc/ipu3/ipu_capture.c index b9967135eac1..e801705f8fe9 100644 --- a/drivers/mxc/ipu3/ipu_capture.c +++ b/drivers/mxc/ipu3/ipu_capture.c @@ -26,7 +26,6 @@ #include <linux/delay.h> #include <linux/ipu.h> #include <linux/clk.h> -#include <mach/mxc_dvfs.h> #include "ipu_prv.h" #include "ipu_regs.h" @@ -94,12 +93,6 @@ ipu_csi_init_interface(uint16_t width, uint16_t height, uint32_t pixel_fmt, cfg_param.force_eof << CSI_SENS_CONF_FORCE_EOF_SHIFT | cfg_param.data_en_pol << CSI_SENS_CONF_DATA_EN_POL_SHIFT; - if (g_ipu_clk_enabled == false) { - stop_dvfs_per(); - g_ipu_clk_enabled = true; - clk_enable(g_ipu_clk); - } - spin_lock_irqsave(&ipu_lock, lock_flags); __raw_writel(data, CSI_SENS_CONF(csi)); @@ -185,13 +178,36 @@ int _ipu_csi_mclk_set(uint32_t pixel_clk, uint32_t csi) */ int ipu_csi_enable_mclk(int csi, bool flag, bool wait) { + struct clk *clk; if (flag) { - clk_enable(g_csi_clk[csi]); + if (cpu_is_mx53()) { + if (csi == 0) { + clk = clk_get(NULL, "ssi_ext1_clk"); + clk_enable(clk); + clk_put(clk); + } else { + pr_err("invalid csi num %d\n", csi); + return -EINVAL; + } + } else + // CCWMX51 - Both CSIs from master clock 0 + clk_enable(g_csi_clk[0]); if (wait == true) msleep(10); } else { - clk_disable(g_csi_clk[csi]); + if (cpu_is_mx53()) { + if (csi == 0) { + clk = clk_get(NULL, "ssi_ext1_clk"); + clk_disable(clk); + clk_put(clk); + } else { + pr_err("invalid csi num %d\n", csi); + return -EINVAL; + } + } else + // CCWMX51 - Both CSIs from master clock 0 + clk_disable(g_csi_clk[0]); } return 0; @@ -210,12 +226,6 @@ void ipu_csi_get_window_size(uint32_t *width, uint32_t *height, uint32_t csi) uint32_t reg; unsigned long lock_flags; - if (g_ipu_clk_enabled == false) { - stop_dvfs_per(); - g_ipu_clk_enabled = true; - clk_enable(g_ipu_clk); - } - spin_lock_irqsave(&ipu_lock, lock_flags); reg = __raw_readl(CSI_ACT_FRM_SIZE(csi)); @@ -237,12 +247,6 @@ void ipu_csi_set_window_size(uint32_t width, uint32_t height, uint32_t csi) { unsigned long lock_flags; - if (g_ipu_clk_enabled == false) { - stop_dvfs_per(); - g_ipu_clk_enabled = true; - clk_enable(g_ipu_clk); - } - spin_lock_irqsave(&ipu_lock, lock_flags); __raw_writel((width - 1) | (height - 1) << 16, CSI_ACT_FRM_SIZE(csi)); @@ -263,12 +267,6 @@ void ipu_csi_set_window_pos(uint32_t left, uint32_t top, uint32_t csi) uint32_t temp; unsigned long lock_flags; - if (g_ipu_clk_enabled == false) { - stop_dvfs_per(); - g_ipu_clk_enabled = true; - clk_enable(g_ipu_clk); - } - spin_lock_irqsave(&ipu_lock, lock_flags); temp = __raw_readl(CSI_OUT_FRM_CTRL(csi)); @@ -291,12 +289,6 @@ void _ipu_csi_horizontal_downsize_enable(uint32_t csi) uint32_t temp; unsigned long lock_flags; - if (g_ipu_clk_enabled == false) { - stop_dvfs_per(); - g_ipu_clk_enabled = true; - clk_enable(g_ipu_clk); - } - spin_lock_irqsave(&ipu_lock, lock_flags); temp = __raw_readl(CSI_OUT_FRM_CTRL(csi)); @@ -317,12 +309,6 @@ void _ipu_csi_horizontal_downsize_disable(uint32_t csi) uint32_t temp; unsigned long lock_flags; - if (g_ipu_clk_enabled == false) { - stop_dvfs_per(); - g_ipu_clk_enabled = true; - clk_enable(g_ipu_clk); - } - spin_lock_irqsave(&ipu_lock, lock_flags); temp = __raw_readl(CSI_OUT_FRM_CTRL(csi)); @@ -343,12 +329,6 @@ void _ipu_csi_vertical_downsize_enable(uint32_t csi) uint32_t temp; unsigned long lock_flags; - if (g_ipu_clk_enabled == false) { - stop_dvfs_per(); - g_ipu_clk_enabled = true; - clk_enable(g_ipu_clk); - } - spin_lock_irqsave(&ipu_lock, lock_flags); temp = __raw_readl(CSI_OUT_FRM_CTRL(csi)); @@ -369,12 +349,6 @@ void _ipu_csi_vertical_downsize_disable(uint32_t csi) uint32_t temp; unsigned long lock_flags; - if (g_ipu_clk_enabled == false) { - stop_dvfs_per(); - g_ipu_clk_enabled = true; - clk_enable(g_ipu_clk); - } - spin_lock_irqsave(&ipu_lock, lock_flags); temp = __raw_readl(CSI_OUT_FRM_CTRL(csi)); @@ -401,12 +375,6 @@ void ipu_csi_set_test_generator(bool active, uint32_t r_value, uint32_t temp; unsigned long lock_flags; - if (g_ipu_clk_enabled == false) { - stop_dvfs_per(); - g_ipu_clk_enabled = true; - clk_enable(g_ipu_clk); - } - spin_lock_irqsave(&ipu_lock, lock_flags); temp = __raw_readl(CSI_TST_CTRL(csi)); @@ -442,12 +410,6 @@ void _ipu_csi_ccir_err_detection_enable(uint32_t csi) { uint32_t temp; - if (g_ipu_clk_enabled == false) { - stop_dvfs_per(); - g_ipu_clk_enabled = true; - clk_enable(g_ipu_clk); - } - temp = __raw_readl(CSI_CCIR_CODE_1(csi)); temp |= CSI_CCIR_ERR_DET_EN; __raw_writel(temp, CSI_CCIR_CODE_1(csi)); @@ -464,12 +426,6 @@ void _ipu_csi_ccir_err_detection_disable(uint32_t csi) { uint32_t temp; - if (g_ipu_clk_enabled == false) { - stop_dvfs_per(); - g_ipu_clk_enabled = true; - clk_enable(g_ipu_clk); - } - temp = __raw_readl(CSI_CCIR_CODE_1(csi)); temp &= ~CSI_CCIR_ERR_DET_EN; __raw_writel(temp, CSI_CCIR_CODE_1(csi)); @@ -495,12 +451,6 @@ int _ipu_csi_set_mipi_di(uint32_t num, uint32_t di_val, uint32_t csi) goto err; } - if (g_ipu_clk_enabled == false) { - stop_dvfs_per(); - g_ipu_clk_enabled = true; - clk_enable(g_ipu_clk); - } - spin_lock_irqsave(&ipu_lock, lock_flags); temp = __raw_readl(CSI_MIPI_DI(csi)); @@ -558,12 +508,6 @@ int _ipu_csi_set_skip_isp(uint32_t skip, uint32_t max_ratio, uint32_t csi) goto err; } - if (g_ipu_clk_enabled == false) { - stop_dvfs_per(); - g_ipu_clk_enabled = true; - clk_enable(g_ipu_clk); - } - spin_lock_irqsave(&ipu_lock, lock_flags); temp = __raw_readl(CSI_SKIP(csi)); @@ -601,12 +545,6 @@ int _ipu_csi_set_skip_smfc(uint32_t skip, uint32_t max_ratio, goto err; } - if (g_ipu_clk_enabled == false) { - stop_dvfs_per(); - g_ipu_clk_enabled = true; - clk_enable(g_ipu_clk); - } - spin_lock_irqsave(&ipu_lock, lock_flags); temp = __raw_readl(CSI_SKIP(csi)); @@ -674,12 +612,6 @@ void _ipu_smfc_set_wmc(ipu_channel_t channel, bool set, uint32_t level) uint32_t temp; unsigned long lock_flags; - if (g_ipu_clk_enabled == false) { - stop_dvfs_per(); - g_ipu_clk_enabled = true; - clk_enable(g_ipu_clk); - } - spin_lock_irqsave(&ipu_lock, lock_flags); temp = __raw_readl(SMFC_WMC); diff --git a/drivers/mxc/ipu3/ipu_common.c b/drivers/mxc/ipu3/ipu_common.c index b1b8a8b39ae1..eae3b549d765 100644 --- a/drivers/mxc/ipu3/ipu_common.c +++ b/drivers/mxc/ipu3/ipu_common.c @@ -354,8 +354,8 @@ static int ipu_probe(struct platform_device *pdev) g_di_clk[0] = plat_data->di_clk[0]; g_di_clk[1] = plat_data->di_clk[1]; - g_csi_clk[0] = plat_data->csi_clk[0]; - g_csi_clk[1] = plat_data->csi_clk[1]; + g_csi_clk[0] = clk_get(&pdev->dev, "csi_mclk1"); + g_csi_clk[1] = clk_get(&pdev->dev, "csi_mclk2"); __raw_writel(0x807FFFFF, IPU_MEM_RST); while (__raw_readl(IPU_MEM_RST) & 0x80000000) ; @@ -1883,29 +1883,29 @@ int32_t ipu_disable_channel(ipu_channel_t channel, bool wait_for_stop) if ((channel == MEM_BG_SYNC) || (channel == MEM_FG_SYNC) || (channel == MEM_DC_SYNC)) { - if (channel == MEM_FG_SYNC) - ipu_disp_set_window_pos(channel, 0, 0); + int timeout = 50; + int irq; _ipu_dp_dc_disable(channel, false); /* - * wait for BG channel EOF then disable FG-IDMAC, - * it avoid FG NFB4EOF error. + * wait for display channel EOF then disable IDMAC, + * it avoid NFB4EOF error. */ - if (channel == MEM_FG_SYNC) { - int timeout = 50; - - __raw_writel(IPUIRQ_2_MASK(IPU_IRQ_BG_SYNC_EOF), - IPUIRQ_2_STATREG(IPU_IRQ_BG_SYNC_EOF)); - while ((__raw_readl(IPUIRQ_2_STATREG(IPU_IRQ_BG_SYNC_EOF)) & - IPUIRQ_2_MASK(IPU_IRQ_BG_SYNC_EOF)) == 0) { - msleep(10); - timeout -= 10; - if (timeout <= 0) { - dev_err(g_ipu_dev, "warning: wait for bg sync eof timeout\n"); - break; - } - } + if (channel == MEM_BG_SYNC) + irq = IPU_IRQ_BG_SYNC_EOF; + if (channel == MEM_FG_SYNC) + irq = IPU_IRQ_FG_SYNC_EOF; + else + irq = IPU_IRQ_DC_SYNC_EOF; + __raw_writel(IPUIRQ_2_MASK(irq), + IPUIRQ_2_STATREG(irq)); + while ((__raw_readl(IPUIRQ_2_STATREG(irq)) & + IPUIRQ_2_MASK(irq)) == 0) { + msleep(10); + timeout -= 10; + if (timeout <= 0) + break; } } else if (wait_for_stop) { while (idma_is_set(IDMAC_CHA_BUSY, in_dma) || diff --git a/drivers/mxc/ipu3/ipu_disp.c b/drivers/mxc/ipu3/ipu_disp.c index 14dde404990b..7ce04d8bca9e 100644 --- a/drivers/mxc/ipu3/ipu_disp.c +++ b/drivers/mxc/ipu3/ipu_disp.c @@ -318,34 +318,22 @@ static void _ipu_dc_map_clear(int map) } static void _ipu_dc_write_tmpl(int word, u32 opcode, u32 operand, int map, - int wave, int glue, int sync, int stop) + int wave, int glue, int sync) { u32 reg; - - if (opcode == WRG) { - reg = sync; - reg |= (glue << 4); - reg |= (++wave << 11); - reg |= ((operand & 0x1FFFF) << 15); - __raw_writel(reg, ipu_dc_tmpl_reg + word * 2); - - reg = (operand >> 17); - reg |= opcode << 7; - reg |= (stop << 9); - __raw_writel(reg, ipu_dc_tmpl_reg + word * 2 + 1); - } else { - reg = sync; - reg |= (glue << 4); - reg |= (++wave << 11); - reg |= (++map << 15); - reg |= (operand << 20) & 0xFFF00000; - __raw_writel(reg, ipu_dc_tmpl_reg + word * 2); - - reg = (operand >> 12); - reg |= opcode << 4; - reg |= (stop << 9); - __raw_writel(reg, ipu_dc_tmpl_reg + word * 2 + 1); - } + int stop = 1; + + reg = sync; + reg |= (glue << 4); + reg |= (++wave << 11); + reg |= (++map << 15); + reg |= (operand << 20) & 0xFFF00000; + __raw_writel(reg, ipu_dc_tmpl_reg + word * 2); + + reg = (operand >> 12); + reg |= opcode << 4; + reg |= (stop << 9); + __raw_writel(reg, ipu_dc_tmpl_reg + word * 2 + 1); } static void _ipu_dc_link_event(int chan, int event, int addr, int priority) @@ -735,26 +723,6 @@ static bool dc_swap; static irqreturn_t dc_irq_handler(int irq, void *dev_id) { struct completion *comp = dev_id; - uint32_t reg; - uint32_t dc_chan; - - if (irq == IPU_IRQ_DC_FC_1) - dc_chan = 1; - else - dc_chan = 5; - - if (!dc_swap) { - reg = __raw_readl(DC_WR_CH_CONF(dc_chan)); - reg &= ~DC_WR_CH_CONF_PROG_TYPE_MASK; - __raw_writel(reg, DC_WR_CH_CONF(dc_chan)); - - reg = __raw_readl(IPU_DISP_GEN); - if (g_dc_di_assignment[dc_chan]) - reg &= ~DI1_COUNTER_RELEASE; - else - reg &= ~DI0_COUNTER_RELEASE; - __raw_writel(reg, IPU_DISP_GEN); - } complete(comp); return IRQ_HANDLED; @@ -838,6 +806,19 @@ void _ipu_dp_dc_disable(ipu_channel_t channel, bool swap) __raw_writel(reg, DC_WR_CH_CONF(dc_chan)); spin_unlock_irqrestore(&ipu_lock, lock_flags); } else { + spin_lock_irqsave(&ipu_lock, lock_flags); + reg = __raw_readl(DC_WR_CH_CONF(dc_chan)); + reg &= ~DC_WR_CH_CONF_PROG_TYPE_MASK; + __raw_writel(reg, DC_WR_CH_CONF(dc_chan)); + + reg = __raw_readl(IPU_DISP_GEN); + if (g_dc_di_assignment[dc_chan]) + reg &= ~DI1_COUNTER_RELEASE; + else + reg &= ~DI0_COUNTER_RELEASE; + __raw_writel(reg, IPU_DISP_GEN); + + spin_unlock_irqrestore(&ipu_lock, lock_flags); /* Clock is already off because it must be done quickly, but we need to fix the ref count */ clk_disable(g_pixel_clk[g_dc_di_assignment[dc_chan]]); @@ -1062,13 +1043,9 @@ int32_t ipu_init_sync_panel(int disp, uint32_t pixel_clk, dev_dbg(g_ipu_dev, "pixel clk = %d\n", pixel_clk); if (sig.ext_clk) { - /* - * Set the PLL to be an even multiple of the pixel clock. - * Not round div for tvout and ldb. - * Did not consider both DI come from the same ext clk, if - * meet such case, ext clk rate should be set specially. - */ - if (clk_get_usecount(g_pixel_clk[disp]) == 0) { + /* Set the PLL to be an even multiple of the pixel clock. not round div for tvout*/ + if ((clk_get_usecount(g_pixel_clk[0]) == 0) && + (clk_get_usecount(g_pixel_clk[1]) == 0)) { di_parent = clk_get_parent(g_di_clk[disp]); if (strcmp(di_parent->name, "tve_clk") != 0 && strcmp(di_parent->name, "ldb_di0_clk") != 0 && @@ -1117,7 +1094,7 @@ int32_t ipu_init_sync_panel(int disp, uint32_t pixel_clk, di_gen = __raw_readl(DI_GENERAL(disp)); if (sig.interlaced) { - if (g_ipu_hw_rev >= 2) { + if (cpu_is_mx51_rev(CHIP_REV_2_0)) { /* Setup internal HSYNC waveform */ _ipu_di_sync_config( disp, /* display */ @@ -1357,7 +1334,7 @@ int32_t ipu_init_sync_panel(int disp, uint32_t pixel_clk, } /* Init template microcode */ - _ipu_dc_write_tmpl(0, WROD(0), 0, map, SYNC_WAVE, 0, 8, 1); + _ipu_dc_write_tmpl(0, WROD(0), 0, map, SYNC_WAVE, 0, 8); if (sig.Hsync_pol) di_gen |= DI_GEN_POLARITY_3; @@ -1424,27 +1401,27 @@ int32_t ipu_init_sync_panel(int disp, uint32_t pixel_clk, (pixel_fmt == IPU_PIX_FMT_UYVY) || (pixel_fmt == IPU_PIX_FMT_YVYU) || (pixel_fmt == IPU_PIX_FMT_VYUY)) { - _ipu_dc_write_tmpl(8, WROD(0), 0, (map - 1), SYNC_WAVE, 0, 5, 1); - _ipu_dc_write_tmpl(9, WROD(0), 0, map, SYNC_WAVE, 0, 5, 1); + _ipu_dc_write_tmpl(8, WROD(0), 0, (map - 1), SYNC_WAVE, 0, 5); + _ipu_dc_write_tmpl(9, WROD(0), 0, map, SYNC_WAVE, 0, 5); /* configure user events according to DISP NUM */ __raw_writel((width - 1), DC_UGDE_3(disp)); } - _ipu_dc_write_tmpl(2, WROD(0), 0, map, SYNC_WAVE, 8, 5, 1); - _ipu_dc_write_tmpl(3, WRG, 0, map, SYNC_WAVE, 4, 5, 1); - _ipu_dc_write_tmpl(4, WROD(0), 0, map, SYNC_WAVE, 0, 5, 1); + _ipu_dc_write_tmpl(2, WROD(0), 0, map, SYNC_WAVE, 8, 5); + _ipu_dc_write_tmpl(3, WROD(0), 0, map, SYNC_WAVE, 4, 5); + _ipu_dc_write_tmpl(4, WROD(0), 0, map, SYNC_WAVE, 0, 5); } else { if ((pixel_fmt == IPU_PIX_FMT_YUYV) || (pixel_fmt == IPU_PIX_FMT_UYVY) || (pixel_fmt == IPU_PIX_FMT_YVYU) || (pixel_fmt == IPU_PIX_FMT_VYUY)) { - _ipu_dc_write_tmpl(10, WROD(0), 0, (map - 1), SYNC_WAVE, 0, 5, 1); - _ipu_dc_write_tmpl(11, WROD(0), 0, map, SYNC_WAVE, 0, 5, 1); + _ipu_dc_write_tmpl(10, WROD(0), 0, (map - 1), SYNC_WAVE, 0, 5); + _ipu_dc_write_tmpl(11, WROD(0), 0, map, SYNC_WAVE, 0, 5); /* configure user events according to DISP NUM */ __raw_writel(width - 1, DC_UGDE_3(disp)); } - _ipu_dc_write_tmpl(5, WROD(0), 0, map, SYNC_WAVE, 8, 5, 1); - _ipu_dc_write_tmpl(6, WRG, 0, map, SYNC_WAVE, 4, 5, 1); - _ipu_dc_write_tmpl(7, WROD(0), 0, map, SYNC_WAVE, 0, 5, 1); + _ipu_dc_write_tmpl(5, WROD(0), 0, map, SYNC_WAVE, 8, 5); + _ipu_dc_write_tmpl(6, WROD(0), 0, map, SYNC_WAVE, 4, 5); + _ipu_dc_write_tmpl(7, WROD(0), 0, map, SYNC_WAVE, 0, 5); } if (sig.Hsync_pol) @@ -1531,7 +1508,7 @@ int ipu_init_async_panel(int disp, int type, uint32_t cycle_time, _ipu_di_data_pin_config(disp, ASYNC_SER_WAVE, DI_PIN_SER_RS, 2, 0, 0); - _ipu_dc_write_tmpl(0x64, WROD(0), 0, map, ASYNC_SER_WAVE, 0, 0, 1); + _ipu_dc_write_tmpl(0x64, WROD(0), 0, map, ASYNC_SER_WAVE, 0, 0); /* Configure DC for serial panel */ __raw_writel(0x14, DC_DISP_CONF1(DC_DISP_ID_SERIAL)); @@ -1808,39 +1785,6 @@ int32_t ipu_disp_set_window_pos(ipu_channel_t channel, int16_t x_pos, } EXPORT_SYMBOL(ipu_disp_set_window_pos); -int32_t ipu_disp_get_window_pos(ipu_channel_t channel, int16_t *x_pos, - int16_t *y_pos) -{ - u32 reg; - unsigned long lock_flags; - uint32_t flow = 0; - - if (channel == MEM_FG_SYNC) - flow = DP_SYNC; - else if (channel == MEM_FG_ASYNC0) - flow = DP_ASYNC0; - else if (channel == MEM_FG_ASYNC1) - flow = DP_ASYNC1; - else - return -EINVAL; - - if (!g_ipu_clk_enabled) - clk_enable(g_ipu_clk); - spin_lock_irqsave(&ipu_lock, lock_flags); - - reg = __raw_readl(DP_FG_POS(flow)); - - *x_pos = (reg >> 16) & 0x7FF; - *y_pos = reg & 0x7FF; - - spin_unlock_irqrestore(&ipu_lock, lock_flags); - if (!g_ipu_clk_enabled) - clk_disable(g_ipu_clk); - - return 0; -} -EXPORT_SYMBOL(ipu_disp_get_window_pos); - void ipu_disp_direct_write(ipu_channel_t channel, u32 value, u32 offset) { if (channel == DIRECT_ASYNC0) diff --git a/drivers/mxc/ipu3/ipu_regs.h b/drivers/mxc/ipu3/ipu_regs.h index 4a78e14df560..19fde8846aa7 100644 --- a/drivers/mxc/ipu3/ipu_regs.h +++ b/drivers/mxc/ipu3/ipu_regs.h @@ -664,6 +664,5 @@ enum di_sync_wave { /* DC template opcodes */ #define WROD(lf) (0x18 | (lf << 1)) -#define WRG (0x01) #endif diff --git a/drivers/mxc/vpu/mxc_vpu.c b/drivers/mxc/vpu/mxc_vpu.c index 9fc25edc33fa..f62e3d46a67c 100644 --- a/drivers/mxc/vpu/mxc_vpu.c +++ b/drivers/mxc/vpu/mxc_vpu.c @@ -73,7 +73,6 @@ static struct vpu_mem_desc user_data_mem = { 0 }; static struct vpu_mem_desc share_mem = { 0 }; static void __iomem *vpu_base; -static int vpu_irq; static u32 phy_vpu_base_addr; static struct mxc_vpu_platform_data *vpu_plat; @@ -540,7 +539,7 @@ static int vpu_map_mem(struct file *fp, struct vm_area_struct *vm) request_size); vm->vm_flags |= VM_IO | VM_RESERVED; - vm->vm_page_prot = pgprot_writecombine(vm->vm_page_prot); + vm->vm_page_prot = pgprot_noncached(vm->vm_page_prot); return remap_pfn_range(vm, vm->vm_start, vm->vm_pgoff, request_size, vm->vm_page_prot) ? -EAGAIN : 0; @@ -636,9 +635,8 @@ static int vpu_dev_probe(struct platform_device *pdev) err = -ENXIO; goto err_out_class; } - vpu_irq = res->start; - err = request_irq(vpu_irq, vpu_irq_handler, 0, "VPU_CODEC_IRQ", + err = request_irq(res->start, vpu_irq_handler, 0, "VPU_CODEC_IRQ", (void *)(&vpu_data)); if (err) goto err_out_class; @@ -662,7 +660,6 @@ static int vpu_dev_probe(struct platform_device *pdev) static int vpu_dev_remove(struct platform_device *pdev) { - free_irq(vpu_irq, &vpu_data); iounmap(vpu_base); iram_free(iram.start, VPU_IRAM_SIZE); @@ -693,9 +690,7 @@ static int vpu_suspend(struct platform_device *pdev, pm_message_t state) for (i = 0; i < vpu_clk_usercount; i++) clk_disable(vpu_clk); - if (!cpu_is_mx37()) - return 0; - else { + if (!cpu_is_mx53()) { clk_enable(vpu_clk); if (bitwork_mem.cpu_addr != 0) { SAVE_WORK_REGS; @@ -711,7 +706,8 @@ static int vpu_suspend(struct platform_device *pdev, pm_message_t state) clk_disable(vpu_clk); } - mxc_pg_enable(pdev); + if (cpu_is_mx37() || cpu_is_mx51()) + mxc_pg_enable(pdev); return 0; @@ -725,10 +721,11 @@ static int vpu_resume(struct platform_device *pdev) { int i; - if (cpu_is_mx37()) + if (cpu_is_mx37() || cpu_is_mx51()) mxc_pg_disable(pdev); - else - goto recover_clk; + + if (cpu_is_mx53()) + goto recover_clk; clk_enable(vpu_clk); if (bitwork_mem.cpu_addr != 0) { @@ -799,7 +796,6 @@ recover_clk: /* Recover vpu clock */ for (i = 0; i < vpu_clk_usercount; i++) clk_enable(vpu_clk); - printk("vpu_resume end\n"); return 0; } @@ -832,6 +828,7 @@ static int __init vpu_init(void) static void __exit vpu_exit(void) { + free_irq(MXC_INT_VPU, (void *)(&vpu_data)); if (vpu_major > 0) { device_destroy(vpu_class, MKDEV(vpu_major, 0)); class_destroy(vpu_class); diff --git a/drivers/net/acenic.c b/drivers/net/acenic.c index 08419ee10290..12bfc447a896 100644 --- a/drivers/net/acenic.c +++ b/drivers/net/acenic.c @@ -1209,7 +1209,8 @@ static int __devinit ace_init(struct net_device *dev) memset(ap->info, 0, sizeof(struct ace_info)); memset(ap->skb, 0, sizeof(struct ace_skb)); - if (ace_load_firmware(dev)) + ecode = ace_load_firmware(dev); + if (ecode) goto init_error; ap->fw_running = 0; diff --git a/drivers/net/appletalk/ipddp.c b/drivers/net/appletalk/ipddp.c index 78cea5e80b1d..bf9ab65d27a4 100644 --- a/drivers/net/appletalk/ipddp.c +++ b/drivers/net/appletalk/ipddp.c @@ -176,8 +176,7 @@ static int ipddp_xmit(struct sk_buff *skb, struct net_device *dev) dev->stats.tx_packets++; dev->stats.tx_bytes += skb->len; - if(aarp_send_ddp(rt->dev, skb, &rt->at, NULL) < 0) - dev_kfree_skb(skb); + aarp_send_ddp(rt->dev, skb, &rt->at, NULL); spin_unlock(&ipddp_route_lock); diff --git a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c index d3c734f4d679..2f6ae784a36f 100644 --- a/drivers/net/au1000_eth.c +++ b/drivers/net/au1000_eth.c @@ -1089,7 +1089,14 @@ static struct net_device * au1000_probe(int port_num) return NULL; } - if ((err = register_netdev(dev)) != 0) { + dev->base_addr = base; + dev->irq = irq; + dev->netdev_ops = &au1000_netdev_ops; + SET_ETHTOOL_OPS(dev, &au1000_ethtool_ops); + dev->watchdog_timeo = ETH_TX_TIMEOUT; + + err = register_netdev(dev); + if (err != 0) { printk(KERN_ERR "%s: Cannot register net device, error %d\n", DRV_NAME, err); free_netdev(dev); @@ -1207,12 +1214,6 @@ static struct net_device * au1000_probe(int port_num) aup->tx_db_inuse[i] = pDB; } - dev->base_addr = base; - dev->irq = irq; - dev->netdev_ops = &au1000_netdev_ops; - SET_ETHTOOL_OPS(dev, &au1000_ethtool_ops); - dev->watchdog_timeo = ETH_TX_TIMEOUT; - /* * The boot code uses the ethernet controller, so reset it to start * fresh. au1000_init() expects that the device is in reset state. diff --git a/drivers/net/b44.c b/drivers/net/b44.c index bafca672ea7d..351a258dccd6 100644 --- a/drivers/net/b44.c +++ b/drivers/net/b44.c @@ -913,9 +913,6 @@ static irqreturn_t b44_interrupt(int irq, void *dev_id) bp->istat = istat; __b44_disable_ints(bp); __napi_schedule(&bp->napi); - } else { - printk(KERN_ERR PFX "%s: Error, poll already scheduled\n", - dev->name); } irq_ack: @@ -1505,8 +1502,7 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset) for (k = 0; k< ethaddr_bytes; k++) { ppattern[offset + magicsync + (j * ETH_ALEN) + k] = macaddr[k]; - len++; - set_bit(len, (unsigned long *) pmask); + set_bit(len++, (unsigned long *) pmask); } } return len - 1; diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index aa1be1feceed..bcd8df92dec7 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -691,7 +691,7 @@ static int bond_check_dev_link(struct bonding *bond, struct net_device *slave_dev, int reporting) { const struct net_device_ops *slave_ops = slave_dev->netdev_ops; - static int (*ioctl)(struct net_device *, struct ifreq *, int); + int (*ioctl)(struct net_device *, struct ifreq *, int); struct ifreq ifr; struct mii_ioctl_data *mii; @@ -3707,10 +3707,10 @@ static int bond_xmit_hash_policy_l23(struct sk_buff *skb, if (skb->protocol == htons(ETH_P_IP)) { return ((ntohl(iph->saddr ^ iph->daddr) & 0xffff) ^ - (data->h_dest[5] ^ bond_dev->dev_addr[5])) % count; + (data->h_dest[5] ^ data->h_source[5])) % count; } - return (data->h_dest[5] ^ bond_dev->dev_addr[5]) % count; + return (data->h_dest[5] ^ data->h_source[5]) % count; } /* @@ -3737,7 +3737,7 @@ static int bond_xmit_hash_policy_l34(struct sk_buff *skb, } - return (data->h_dest[5] ^ bond_dev->dev_addr[5]) % count; + return (data->h_dest[5] ^ data->h_source[5]) % count; } /* @@ -3748,7 +3748,7 @@ static int bond_xmit_hash_policy_l2(struct sk_buff *skb, { struct ethhdr *data = (struct ethhdr *)skb->data; - return (data->h_dest[5] ^ bond_dev->dev_addr[5]) % count; + return (data->h_dest[5] ^ data->h_source[5]) % count; } /*-------------------------- Device entry points ----------------------------*/ diff --git a/drivers/net/can/flexcan/mbm.c b/drivers/net/can/flexcan/mbm.c index c846d97daadb..42266e719ce3 100644 --- a/drivers/net/can/flexcan/mbm.c +++ b/drivers/net/can/flexcan/mbm.c @@ -294,7 +294,7 @@ int flexcan_mbm_xmit(struct flexcan_device *flexcan, struct can_frame *frame) hwmb[i].mb_id = (frame->can_id & CAN_SFF_MASK) << 18; } - hwmb[i].mb_cs &= ~MB_CS_LENGTH_MASK; + hwmb[i].mb_cs &= MB_CS_LENGTH_MASK; hwmb[i].mb_cs |= frame->can_dlc << MB_CS_LENGTH_OFFSET; flexcan_memcpy(hwmb[i].mb_data, frame->data, frame->can_dlc); hwmb[i].mb_cs &= ~MB_CS_CODE_MASK; diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c index a10c1d7b3b0a..460bb886fbdf 100644 --- a/drivers/net/can/vcan.c +++ b/drivers/net/can/vcan.c @@ -80,7 +80,7 @@ static void vcan_rx(struct sk_buff *skb, struct net_device *dev) skb->dev = dev; skb->ip_summed = CHECKSUM_UNNECESSARY; - netif_rx(skb); + netif_rx_ni(skb); } static int vcan_tx(struct sk_buff *skb, struct net_device *dev) diff --git a/drivers/net/e100.c b/drivers/net/e100.c index 3a6735dc9f6a..c786e6a96eae 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c @@ -156,6 +156,7 @@ #include <linux/init.h> #include <linux/pci.h> #include <linux/dma-mapping.h> +#include <linux/dmapool.h> #include <linux/netdevice.h> #include <linux/etherdevice.h> #include <linux/mii.h> @@ -601,6 +602,7 @@ struct nic { struct mem *mem; dma_addr_t dma_addr; + struct pci_pool *cbs_pool; dma_addr_t cbs_dma_addr; u8 adaptive_ifs; u8 tx_threshold; @@ -1779,9 +1781,7 @@ static void e100_clean_cbs(struct nic *nic) nic->cb_to_clean = nic->cb_to_clean->next; nic->cbs_avail++; } - pci_free_consistent(nic->pdev, - sizeof(struct cb) * nic->params.cbs.count, - nic->cbs, nic->cbs_dma_addr); + pci_pool_free(nic->cbs_pool, nic->cbs, nic->cbs_dma_addr); nic->cbs = NULL; nic->cbs_avail = 0; } @@ -1799,10 +1799,11 @@ static int e100_alloc_cbs(struct nic *nic) nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean = NULL; nic->cbs_avail = 0; - nic->cbs = pci_alloc_consistent(nic->pdev, - sizeof(struct cb) * count, &nic->cbs_dma_addr); + nic->cbs = pci_pool_alloc(nic->cbs_pool, GFP_KERNEL, + &nic->cbs_dma_addr); if (!nic->cbs) return -ENOMEM; + memset(nic->cbs, 0, count * sizeof(struct cb)); for (cb = nic->cbs, i = 0; i < count; cb++, i++) { cb->next = (i + 1 < count) ? cb + 1 : nic->cbs; @@ -1811,7 +1812,6 @@ static int e100_alloc_cbs(struct nic *nic) cb->dma_addr = nic->cbs_dma_addr + i * sizeof(struct cb); cb->link = cpu_to_le32(nic->cbs_dma_addr + ((i+1) % count) * sizeof(struct cb)); - cb->skb = NULL; } nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean = nic->cbs; @@ -2827,7 +2827,11 @@ static int __devinit e100_probe(struct pci_dev *pdev, DPRINTK(PROBE, ERR, "Cannot register net device, aborting.\n"); goto err_out_free; } - + nic->cbs_pool = pci_pool_create(netdev->name, + nic->pdev, + nic->params.cbs.count * sizeof(struct cb), + sizeof(u32), + 0); DPRINTK(PROBE, INFO, "addr 0x%llx, irq %d, MAC addr %pM\n", (unsigned long long)pci_resource_start(pdev, use_io ? 1 : 0), pdev->irq, netdev->dev_addr); @@ -2857,6 +2861,7 @@ static void __devexit e100_remove(struct pci_dev *pdev) unregister_netdev(netdev); e100_free(nic); pci_iounmap(pdev, nic->csr); + pci_pool_destroy(nic->cbs_pool); free_netdev(netdev); pci_release_regions(pdev); pci_disable_device(pdev); diff --git a/drivers/net/e1000e/82571.c b/drivers/net/e1000e/82571.c index b53b40ba88a8..d1e0563a67df 100644 --- a/drivers/net/e1000e/82571.c +++ b/drivers/net/e1000e/82571.c @@ -1803,7 +1803,7 @@ struct e1000_info e1000_82574_info = { | FLAG_HAS_AMT | FLAG_HAS_CTRLEXT_ON_LOAD, .pba = 20, - .max_hw_frame_size = ETH_FRAME_LEN + ETH_FCS_LEN, + .max_hw_frame_size = DEFAULT_JUMBO, .get_variants = e1000_get_variants_82571, .mac_ops = &e82571_mac_ops, .phy_ops = &e82_phy_ops_bm, @@ -1820,7 +1820,7 @@ struct e1000_info e1000_82583_info = { | FLAG_HAS_AMT | FLAG_HAS_CTRLEXT_ON_LOAD, .pba = 20, - .max_hw_frame_size = DEFAULT_JUMBO, + .max_hw_frame_size = ETH_FRAME_LEN + ETH_FCS_LEN, .get_variants = e1000_get_variants_82571, .mac_ops = &e82571_mac_ops, .phy_ops = &e82_phy_ops_bm, diff --git a/drivers/net/fec.c b/drivers/net/fec.c index 206be36f0d19..d8817aad351f 100644 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c @@ -296,17 +296,6 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) bufaddr = fep->tx_bounce[index]; } - if (fep->ptimer_present) { - if (fec_ptp_do_txstamp(skb)) - estatus = BD_ENET_TX_TS; - else - estatus = 0; -#ifdef CONFIG_FEC_1588 - bdp->cbd_esc = (estatus | BD_ENET_TX_INT); - bdp->cbd_bdu = 0; -#endif - } - #ifdef CONFIG_ARCH_MXS swap_buffer(bufaddr, skb->len); #endif @@ -329,6 +318,16 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) | BD_ENET_TX_LAST | BD_ENET_TX_TC); bdp->cbd_sc = status; + if (fep->ptimer_present) { + if (fec_ptp_do_txstamp(skb)) + estatus = BD_ENET_TX_TS; + else + estatus = 0; +#ifdef CONFIG_FEC_1588 + bdp->cbd_esc = (estatus | BD_ENET_TX_INT); + bdp->cbd_bdu = 0; +#endif + } dev->trans_start = jiffies; /* Trigger transmission start */ @@ -808,7 +807,7 @@ static struct mii_bus *fec_enet_mii_init(struct platform_device *pdev) { struct net_device *dev = platform_get_drvdata(pdev); struct fec_enet_private *fep = netdev_priv(dev); - struct fec_platform_data *pdata; + struct fec_enet_platform_data *pdata; int err = -ENXIO, i; fep->mii_timeout = 0; @@ -837,7 +836,6 @@ static struct mii_bus *fec_enet_mii_init(struct platform_device *pdev) fep->mii_bus->priv = fep; fep->mii_bus->parent = &pdev->dev; pdata = pdev->dev.platform_data; - fep->mii_bus->phy_mask = pdata->phy_mask; fep->mii_bus->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL); if (!fep->mii_bus->irq) { @@ -1412,15 +1410,6 @@ fec_stop(struct net_device *dev) writel(1, fep->hwp + FEC_ECNTRL); udelay(10); -#ifdef CONFIG_ARCH_MXS - /* Check MII or RMII */ - if (fep->phy_interface == PHY_INTERFACE_MODE_RMII) - writel(readl(fep->hwp + FEC_R_CNTRL) | 0x100, - fep->hwp + FEC_R_CNTRL); - else - writel(readl(fep->hwp + FEC_R_CNTRL) & ~0x100, - fep->hwp + FEC_R_CNTRL); -#endif /* Clear outstanding MII command interrupts. */ writel(FEC_ENET_MII, fep->hwp + FEC_IEVENT); @@ -1496,18 +1485,6 @@ fec_probe(struct platform_device *pdev) fep->phy_interface = pdata->phy; if (pdata->init && pdata->init()) goto failed_platform_init; - - /* - * The priority for getting MAC address is: - * (1) kernel command line fec_mac = xx:xx:xx... - * (2) platform data mac field got from fuse etc - * (3) bootloader set the FEC mac register - */ - - if (!is_valid_ether_addr(fec_mac_default) && - pdata->mac && is_valid_ether_addr(pdata->mac)) - memcpy(fec_mac_default, pdata->mac, - sizeof(fec_mac_default)); } else fep->phy_interface = PHY_INTERFACE_MODE_MII; diff --git a/drivers/net/fec_1588.c b/drivers/net/fec_1588.c index c4bf278c7f19..37b1b01778fd 100644 --- a/drivers/net/fec_1588.c +++ b/drivers/net/fec_1588.c @@ -178,19 +178,12 @@ void fec_ptp_stop(struct fec_ptp_private *priv) static void fec_get_curr_cnt(struct fec_ptp_private *priv, struct ptp_rtc_time *curr_time) { - u32 tempval; - - writel(FEC_T_CTRL_CAPTURE, priv->hwp + FEC_ATIME_CTRL); writel(FEC_T_CTRL_CAPTURE, priv->hwp + FEC_ATIME_CTRL); curr_time->rtc_time.nsec = readl(priv->hwp + FEC_ATIME); curr_time->rtc_time.sec = priv->prtc; - writel(FEC_T_CTRL_CAPTURE, priv->hwp + FEC_ATIME_CTRL); - tempval = readl(priv->hwp + FEC_ATIME); - if (tempval < curr_time->rtc_time.nsec) { - curr_time->rtc_time.nsec = tempval; - curr_time->rtc_time.sec = priv->prtc; - } + if (readl(priv->hwp + FEC_ATIME) < curr_time->rtc_time.nsec) + curr_time->rtc_time.sec++; } /* Set the 1588 timer counter registers */ @@ -221,7 +214,7 @@ int fec_ptp_do_txstamp(struct sk_buff *skb) return 0; udph = udp_hdr(skb); - if (udph != NULL && ntohs(udph->source) == 319) + if (udph != NULL && udph->source == 319) return 1; } @@ -254,13 +247,13 @@ void fec_ptp_store_rxstamp(struct fec_ptp_private *priv, return; udph = (struct udphdr *)(skb->data + FEC_PTP_UDP_OFFS); - if (ntohs(udph->source) != 319) + if (udph->source != 319) return; seq_id = *((u16 *)(skb->data + FEC_PTP_SEQ_ID_OFFS)); control = *((u8 *)(skb->data + FEC_PTP_CTRL_OFFS)); - tmp_rx_time.key = ntohs(seq_id); + tmp_rx_time.key = seq_id; tmp_rx_time.ts_time.sec = fpp->prtc; tmp_rx_time.ts_time.nsec = bdp->ts; @@ -377,75 +370,6 @@ static uint8_t fec_get_rx_time(struct fec_ptp_private *priv, } } -static void fec_handle_ptpdrift(struct ptp_set_comp *comp, - struct ptp_time_correct *ptc) -{ - u32 ndrift; - u32 i; - u32 tmp, tmp_ns, tmp_prid; - u32 min_ns, min_prid, miss_ns; - - ndrift = comp->drift; - if (ndrift == 0) { - ptc->corr_inc = 0; - ptc->corr_period = 0; - return; - } - - if (ndrift >= FEC_ATIME_40MHZ) { - ptc->corr_inc = (u32)(ndrift / FEC_ATIME_40MHZ); - ptc->corr_period = 1; - return; - } - - min_ns = 1; - tmp = FEC_ATIME_40MHZ % ndrift; - tmp_prid = (u32)(FEC_ATIME_40MHZ / ndrift); - min_prid = tmp_prid; - miss_ns = tmp / tmp_prid; - for (i = 2; i <= FEC_T_INC_40MHZ; i++) { - tmp = (FEC_ATIME_40MHZ * i) % ndrift; - tmp_prid = (FEC_ATIME_40MHZ * i) / ndrift; - tmp_ns = tmp / tmp_prid; - if (tmp_ns <= 10) { - min_ns = i; - min_prid = tmp_prid; - break; - } - if (tmp_ns < miss_ns) { - min_ns = i; - min_prid = tmp_prid; - miss_ns = tmp_ns; - } - } - - ptc->corr_inc = min_ns; - ptc->corr_period = min_prid; -} - -static void fec_set_drift(struct fec_ptp_private *priv, - struct ptp_set_comp *comp) -{ - struct ptp_time_correct tc; - struct fec_ptp_private *fpp = priv; - u32 tmp, corr_ns; - - fec_handle_ptpdrift(comp, &tc); - if (tc.corr_inc == 0) - return; - - if (comp->o_ops == TRUE) - corr_ns = FEC_T_INC_40MHZ + tc.corr_inc; - else - corr_ns = FEC_T_INC_40MHZ - tc.corr_inc; - - tmp = readl(fpp->hwp + FEC_ATIME_INC) & FEC_T_INC_MASK; - tmp |= corr_ns << FEC_T_INC_CORR_OFFSET; - writel(tmp, fpp->hwp + FEC_ATIME_INC); - - writel(tc.corr_period, fpp->hwp + FEC_ATIME_CORR); -} - static int ptp_open(struct inode *inode, struct file *file) { return 0; @@ -466,7 +390,6 @@ static int ptp_ioctl( struct ptp_rtc_time curr_time; struct ptp_time rx_time, tx_time; struct ptp_ts_data *p_ts; - struct ptp_set_comp *p_comp; struct fec_ptp_private *priv; unsigned int minor = MINOR(inode->i_rdev); int retval = 0; @@ -509,11 +432,10 @@ static int ptp_ioctl( priv->rx_time_pdel_resp.tail = 0; break; case PTP_SET_COMPENSATION: - p_comp = (struct ptp_set_comp *)arg; - fec_set_drift(priv, p_comp); + /* TBD */ break; case PTP_GET_ORIG_COMP: - ((struct ptp_get_comp *)arg)->dw_origcomp = FEC_PTP_ORIG_COMP; + /* TBD */ break; default: return -EINVAL; diff --git a/drivers/net/fec_1588.h b/drivers/net/fec_1588.h index 800ff310668f..a503527eadbb 100644 --- a/drivers/net/fec_1588.h +++ b/drivers/net/fec_1588.h @@ -24,9 +24,6 @@ #include <linux/circ_buf.h> -#define FALSE 0 -#define TRUE 1 - /* FEC 1588 register bits */ #define FEC_T_CTRL_CAPTURE 0x00000800 #define FEC_T_CTRL_RESTART 0x00000200 @@ -35,11 +32,8 @@ #define FEC_T_INC_MASK 0x0000007f #define FEC_T_INC_OFFSET 0 -#define FEC_T_INC_CORR_MASK 0x00007f00 -#define FEC_T_INC_CORR_OFFSET 8 #define FEC_T_INC_40MHZ 25 -#define FEC_ATIME_40MHZ 40000000 #define FEC_T_PERIOD_ONE_SEC 0x3B9ACA00 @@ -58,7 +52,7 @@ #define PTP_MSG_ALL_OTHER 0x5 #define PTP_GET_TX_TIMESTAMP 0x1 -#define PTP_GET_RX_TIMESTAMP 0x9 +#define PTP_GET_RX_TIMESTAMP 0x2 #define PTP_SET_RTC_TIME 0x3 #define PTP_SET_COMPENSATION 0x4 #define PTP_GET_CURRENT_TIME 0x5 @@ -70,15 +64,13 @@ #define PTP_GET_RX_TIMESTAMP_PDELAY_RESP 0xD #define FEC_PTP_DOMAIN_DLFT 0xe0000181 -#define FEC_PTP_IP_OFFS 0x0 -#define FEC_PTP_UDP_OFFS 0x14 -#define FEC_PTP_MSG_TYPE_OFFS 0x1C -#define FEC_PTP_SEQ_ID_OFFS 0x3A -#define FEC_PTP_CTRL_OFFS 0x3C +#define FEC_PTP_IP_OFFS 0xE +#define FEC_PTP_UDP_OFFS 0x22 +#define FEC_PTP_MSG_TYPE_OFFS 0x2A +#define FEC_PTP_SEQ_ID_OFFS 0x48 +#define FEC_PTP_CTRL_OFFS 0x4A #define FEC_PACKET_TYPE_UDP 0x11 -#define FEC_PTP_ORIG_COMP 0x15555555 - /* PTP standard time representation structure */ struct ptp_time{ u64 sec; /* seconds */ @@ -110,31 +102,6 @@ struct ptp_rtc_time { struct ptp_time rtc_time; }; -/* interface for PTP driver command SET_COMPENSATION */ -struct ptp_set_comp { - u32 drift; - bool o_ops; -}; - -/* interface for PTP driver command GET_ORIG_COMP */ -struct ptp_get_comp { - /* the initial compensation value */ - u32 dw_origcomp; - /* the minimum compensation value */ - u32 dw_mincomp; - /*the max compensation value*/ - u32 dw_maxcomp; - /*the min drift applying min compensation value in ppm*/ - u32 dw_mindrift; - /*the max drift applying max compensation value in ppm*/ - u32 dw_maxdrift; -}; - -struct ptp_time_correct { - u32 corr_period; - u32 corr_inc; -}; - /* PTP message version */ #define PTP_1588_MSG_VER_1 1 #define PTP_1588_MSG_VER_2 2 diff --git a/drivers/net/fec_switch.c b/drivers/net/fec_switch.c index 0485349dcd76..f2c78e439278 100644 --- a/drivers/net/fec_switch.c +++ b/drivers/net/fec_switch.c @@ -131,13 +131,9 @@ static void *swap_buffer(void *bufaddr, int len) /*last read entry from learning interface*/ struct eswPortInfo g_info; -#ifdef USE_DEFAULT_SWITCH_PORT0_MAC static unsigned char switch_mac_default[] = { 0x00, 0x08, 0x02, 0x6B, 0xA3, 0x1A, }; -#else -static unsigned char switch_mac_default[ETH_ALEN]; -#endif static void switch_request_intrs(struct net_device *dev, irqreturn_t switch_net_irq_handler(int irq, void *private), @@ -3704,19 +3700,6 @@ static int __init switch_enet_init(struct net_device *dev, fep->phy_interface = plat->fec_enet->phy; if (plat->fec_enet->init && plat->fec_enet->init()) return -EIO; - - /* - * The priority for getting MAC address is: - * (1) kernel command line fec_mac = xx:xx:xx... - * (2) platform data mac field got from fuse etc - * (3) bootloader set the FEC mac register - */ - - if (!is_valid_ether_addr(switch_mac_default) && - plat->fec_enet->mac && - is_valid_ether_addr(plat->fec_enet->mac)) - memcpy(switch_mac_default, plat->fec_enet->mac, - sizeof(switch_mac_default)); } else fep->phy_interface = PHY_INTERFACE_MODE_MII; diff --git a/drivers/net/iseries_veth.c b/drivers/net/iseries_veth.c index e44215cb1882..9048718aff1b 100644 --- a/drivers/net/iseries_veth.c +++ b/drivers/net/iseries_veth.c @@ -495,7 +495,7 @@ static void veth_take_cap_ack(struct veth_lpar_connection *cnx, cnx->remote_lp); } else { memcpy(&cnx->cap_ack_event, event, - sizeof(&cnx->cap_ack_event)); + sizeof(cnx->cap_ack_event)); cnx->state |= VETH_STATE_GOTCAPACK; veth_kick_statemachine(cnx); } diff --git a/drivers/net/mlx4/eq.c b/drivers/net/mlx4/eq.c index b9ceddde46c0..4ff665c0f144 100644 --- a/drivers/net/mlx4/eq.c +++ b/drivers/net/mlx4/eq.c @@ -526,48 +526,6 @@ static void mlx4_unmap_clr_int(struct mlx4_dev *dev) iounmap(priv->clr_base); } -int mlx4_map_eq_icm(struct mlx4_dev *dev, u64 icm_virt) -{ - struct mlx4_priv *priv = mlx4_priv(dev); - int ret; - - /* - * We assume that mapping one page is enough for the whole EQ - * context table. This is fine with all current HCAs, because - * we only use 32 EQs and each EQ uses 64 bytes of context - * memory, or 1 KB total. - */ - priv->eq_table.icm_virt = icm_virt; - priv->eq_table.icm_page = alloc_page(GFP_HIGHUSER); - if (!priv->eq_table.icm_page) - return -ENOMEM; - priv->eq_table.icm_dma = pci_map_page(dev->pdev, priv->eq_table.icm_page, 0, - PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); - if (pci_dma_mapping_error(dev->pdev, priv->eq_table.icm_dma)) { - __free_page(priv->eq_table.icm_page); - return -ENOMEM; - } - - ret = mlx4_MAP_ICM_page(dev, priv->eq_table.icm_dma, icm_virt); - if (ret) { - pci_unmap_page(dev->pdev, priv->eq_table.icm_dma, PAGE_SIZE, - PCI_DMA_BIDIRECTIONAL); - __free_page(priv->eq_table.icm_page); - } - - return ret; -} - -void mlx4_unmap_eq_icm(struct mlx4_dev *dev) -{ - struct mlx4_priv *priv = mlx4_priv(dev); - - mlx4_UNMAP_ICM(dev, priv->eq_table.icm_virt, 1); - pci_unmap_page(dev->pdev, priv->eq_table.icm_dma, PAGE_SIZE, - PCI_DMA_BIDIRECTIONAL); - __free_page(priv->eq_table.icm_page); -} - int mlx4_alloc_eq_table(struct mlx4_dev *dev) { struct mlx4_priv *priv = mlx4_priv(dev); diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c index dac621b1e9fc..8e8b79fed508 100644 --- a/drivers/net/mlx4/main.c +++ b/drivers/net/mlx4/main.c @@ -525,7 +525,10 @@ static int mlx4_init_icm(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap, goto err_unmap_aux; } - err = mlx4_map_eq_icm(dev, init_hca->eqc_base); + err = mlx4_init_icm_table(dev, &priv->eq_table.table, + init_hca->eqc_base, dev_cap->eqc_entry_sz, + dev->caps.num_eqs, dev->caps.num_eqs, + 0, 0); if (err) { mlx4_err(dev, "Failed to map EQ context memory, aborting.\n"); goto err_unmap_cmpt; @@ -668,7 +671,7 @@ err_unmap_mtt: mlx4_cleanup_icm_table(dev, &priv->mr_table.mtt_table); err_unmap_eq: - mlx4_unmap_eq_icm(dev); + mlx4_cleanup_icm_table(dev, &priv->eq_table.table); err_unmap_cmpt: mlx4_cleanup_icm_table(dev, &priv->eq_table.cmpt_table); @@ -698,11 +701,11 @@ static void mlx4_free_icms(struct mlx4_dev *dev) mlx4_cleanup_icm_table(dev, &priv->qp_table.qp_table); mlx4_cleanup_icm_table(dev, &priv->mr_table.dmpt_table); mlx4_cleanup_icm_table(dev, &priv->mr_table.mtt_table); + mlx4_cleanup_icm_table(dev, &priv->eq_table.table); mlx4_cleanup_icm_table(dev, &priv->eq_table.cmpt_table); mlx4_cleanup_icm_table(dev, &priv->cq_table.cmpt_table); mlx4_cleanup_icm_table(dev, &priv->srq_table.cmpt_table); mlx4_cleanup_icm_table(dev, &priv->qp_table.cmpt_table); - mlx4_unmap_eq_icm(dev); mlx4_UNMAP_ICM_AUX(dev); mlx4_free_icm(dev, priv->fw.aux_icm, 0); diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h index 5bd79c2b184f..bc72d6e4919b 100644 --- a/drivers/net/mlx4/mlx4.h +++ b/drivers/net/mlx4/mlx4.h @@ -205,9 +205,7 @@ struct mlx4_eq_table { void __iomem **uar_map; u32 clr_mask; struct mlx4_eq *eq; - u64 icm_virt; - struct page *icm_page; - dma_addr_t icm_dma; + struct mlx4_icm_table table; struct mlx4_icm_table cmpt_table; int have_irq; u8 inta_pin; @@ -373,9 +371,6 @@ u64 mlx4_make_profile(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap, struct mlx4_init_hca_param *init_hca); -int mlx4_map_eq_icm(struct mlx4_dev *dev, u64 icm_virt); -void mlx4_unmap_eq_icm(struct mlx4_dev *dev); - int mlx4_cmd_init(struct mlx4_dev *dev); void mlx4_cmd_cleanup(struct mlx4_dev *dev); void mlx4_cmd_event(struct mlx4_dev *dev, u16 token, u8 status, u64 out_param); diff --git a/drivers/net/sfc/rx.c b/drivers/net/sfc/rx.c index 01f9432c31ef..98bff5ada09a 100644 --- a/drivers/net/sfc/rx.c +++ b/drivers/net/sfc/rx.c @@ -444,7 +444,8 @@ static void efx_rx_packet__check_len(struct efx_rx_queue *rx_queue, * the appropriate LRO method */ static void efx_rx_packet_lro(struct efx_channel *channel, - struct efx_rx_buffer *rx_buf) + struct efx_rx_buffer *rx_buf, + bool checksummed) { struct napi_struct *napi = &channel->napi_str; @@ -466,7 +467,8 @@ static void efx_rx_packet_lro(struct efx_channel *channel, skb->len = rx_buf->len; skb->data_len = rx_buf->len; skb->truesize += rx_buf->len; - skb->ip_summed = CHECKSUM_UNNECESSARY; + skb->ip_summed = + checksummed ? CHECKSUM_UNNECESSARY : CHECKSUM_NONE; napi_gro_frags(napi); @@ -475,6 +477,7 @@ out: rx_buf->page = NULL; } else { EFX_BUG_ON_PARANOID(!rx_buf->skb); + EFX_BUG_ON_PARANOID(!checksummed); napi_gro_receive(napi, rx_buf->skb); rx_buf->skb = NULL; @@ -570,7 +573,7 @@ void __efx_rx_packet(struct efx_channel *channel, } if (likely(checksummed || rx_buf->page)) { - efx_rx_packet_lro(channel, rx_buf); + efx_rx_packet_lro(channel, rx_buf, checksummed); goto done; } diff --git a/drivers/net/sfc/tx.c b/drivers/net/sfc/tx.c index 14a14788566c..d36a2894f005 100644 --- a/drivers/net/sfc/tx.c +++ b/drivers/net/sfc/tx.c @@ -823,8 +823,6 @@ static void efx_enqueue_unwind(struct efx_tx_queue *tx_queue) tx_queue->efx->type->txd_ring_mask]; efx_tsoh_free(tx_queue, buffer); EFX_BUG_ON_PARANOID(buffer->skb); - buffer->len = 0; - buffer->continuation = true; if (buffer->unmap_len) { unmap_addr = (buffer->dma_addr + buffer->len - buffer->unmap_len); @@ -838,6 +836,8 @@ static void efx_enqueue_unwind(struct efx_tx_queue *tx_queue) PCI_DMA_TODEVICE); buffer->unmap_len = 0; } + buffer->len = 0; + buffer->continuation = true; } } diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 0a551d8f5d95..329f447f5bf7 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c @@ -1455,7 +1455,6 @@ static int sky2_up(struct net_device *dev) if (ramsize > 0) { u32 rxspace; - hw->flags |= SKY2_HW_RAM_BUFFER; pr_debug(PFX "%s: ram buffer %dK\n", dev->name, ramsize); if (ramsize < 16) rxspace = ramsize / 2; @@ -2942,6 +2941,9 @@ static int __devinit sky2_init(struct sky2_hw *hw) ++hw->ports; } + if (sky2_read8(hw, B2_E_0)) + hw->flags |= SKY2_HW_RAM_BUFFER; + return 0; } @@ -4526,6 +4528,8 @@ static int __devinit sky2_probe(struct pci_dev *pdev, goto err_out_free_netdev; } + netif_carrier_off(dev); + netif_napi_add(dev, &hw->napi, sky2_poll, NAPI_WEIGHT); err = request_irq(pdev->irq, sky2_intr, diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c index 7567f510eff5..d8ed1b63da78 100644 --- a/drivers/net/smc91x.c +++ b/drivers/net/smc91x.c @@ -2283,7 +2283,7 @@ static int __devinit smc_drv_probe(struct platform_device *pdev) ndev->irq = ires->start; - if (ires->flags & IRQF_TRIGGER_MASK) + if (irq_flags == -1 || ires->flags & IRQF_TRIGGER_MASK) irq_flags = ires->flags & IRQF_TRIGGER_MASK; ret = smc_request_attrib(pdev, ndev); diff --git a/drivers/net/smsc9420.c b/drivers/net/smsc9420.c index 60abdb1081ad..97ababd189c6 100644 --- a/drivers/net/smsc9420.c +++ b/drivers/net/smsc9420.c @@ -252,6 +252,9 @@ static int smsc9420_ethtool_get_settings(struct net_device *dev, { struct smsc9420_pdata *pd = netdev_priv(dev); + if (!pd->phy_dev) + return -ENODEV; + cmd->maxtxpkt = 1; cmd->maxrxpkt = 1; return phy_ethtool_gset(pd->phy_dev, cmd); @@ -262,6 +265,9 @@ static int smsc9420_ethtool_set_settings(struct net_device *dev, { struct smsc9420_pdata *pd = netdev_priv(dev); + if (!pd->phy_dev) + return -ENODEV; + return phy_ethtool_sset(pd->phy_dev, cmd); } @@ -290,6 +296,10 @@ static void smsc9420_ethtool_set_msglevel(struct net_device *netdev, u32 data) static int smsc9420_ethtool_nway_reset(struct net_device *netdev) { struct smsc9420_pdata *pd = netdev_priv(netdev); + + if (!pd->phy_dev) + return -ENODEV; + return phy_start_aneg(pd->phy_dev); } @@ -312,6 +322,10 @@ smsc9420_ethtool_getregs(struct net_device *dev, struct ethtool_regs *regs, for (i = 0; i < 0x100; i += (sizeof(u32))) data[j++] = smsc9420_reg_read(pd, i); + // cannot read phy registers if the net device is down + if (!phy_dev) + return; + for (i = 0; i <= 31; i++) data[j++] = smsc9420_mii_read(phy_dev->bus, phy_dev->addr, i); } diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 42b6c6319bc2..156f59b25191 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -943,8 +943,6 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) char *name; unsigned long flags = 0; - err = -EINVAL; - if (!capable(CAP_NET_ADMIN)) return -EPERM; @@ -958,7 +956,7 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) flags |= TUN_TAP_DEV; name = "tap%d"; } else - goto failed; + return -EINVAL; if (*ifr->ifr_name) name = ifr->ifr_name; diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index f8c6d7ea7264..9e1fc2968cf1 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c @@ -1362,7 +1362,7 @@ static void hso_serial_close(struct tty_struct *tty, struct file *filp) /* reset the rts and dtr */ /* do the actual close */ serial->open_count--; - kref_put(&serial->parent->ref, hso_serial_ref_free); + if (serial->open_count <= 0) { serial->open_count = 0; spin_lock_irq(&serial->serial_lock); @@ -1382,6 +1382,8 @@ static void hso_serial_close(struct tty_struct *tty, struct file *filp) usb_autopm_put_interface(serial->parent->interface); mutex_unlock(&serial->parent->mutex); + + kref_put(&serial->parent->ref, hso_serial_ref_free); } /* close the requested serial port */ diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c index 1f9ec29fce50..65a43c8e76b5 100644 --- a/drivers/net/usb/kaweth.c +++ b/drivers/net/usb/kaweth.c @@ -263,6 +263,7 @@ static int kaweth_control(struct kaweth_device *kaweth, int timeout) { struct usb_ctrlrequest *dr; + int retval; dbg("kaweth_control()"); @@ -278,18 +279,21 @@ static int kaweth_control(struct kaweth_device *kaweth, return -ENOMEM; } - dr->bRequestType= requesttype; + dr->bRequestType = requesttype; dr->bRequest = request; dr->wValue = cpu_to_le16(value); dr->wIndex = cpu_to_le16(index); dr->wLength = cpu_to_le16(size); - return kaweth_internal_control_msg(kaweth->dev, - pipe, - dr, - data, - size, - timeout); + retval = kaweth_internal_control_msg(kaweth->dev, + pipe, + dr, + data, + size, + timeout); + + kfree(dr); + return retval; } /**************************************************************** diff --git a/drivers/net/usb/rtl8150.c b/drivers/net/usb/rtl8150.c index fcc6fa0905d1..18686839cd12 100644 --- a/drivers/net/usb/rtl8150.c +++ b/drivers/net/usb/rtl8150.c @@ -324,7 +324,7 @@ static int rtl8150_set_mac_address(struct net_device *netdev, void *p) dbg("%02X:", netdev->dev_addr[i]); dbg("%02X\n", netdev->dev_addr[i]); /* Set the IDR registers. */ - set_registers(dev, IDR, sizeof(netdev->dev_addr), netdev->dev_addr); + set_registers(dev, IDR, netdev->addr_len, netdev->dev_addr); #ifdef EEPROM_WRITE { u8 cr; diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index fe045896406b..df49d0daaa16 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c @@ -1232,7 +1232,7 @@ static const struct driver_info smsc95xx_info = { .rx_fixup = smsc95xx_rx_fixup, .tx_fixup = smsc95xx_tx_fixup, .status = smsc95xx_status, - .flags = FLAG_ETHER, + .flags = FLAG_ETHER | FLAG_SEND_ZLP, }; static const struct usb_device_id products[] = { diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index edfd9e10ceba..d49df7352017 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -988,7 +988,7 @@ int usbnet_start_xmit (struct sk_buff *skb, struct net_device *net) * NOTE: strictly conforming cdc-ether devices should expect * the ZLP here, but ignore the one-byte packet. */ - if ((length % dev->maxpacket) == 0) { + if (!(info->flags & FLAG_SEND_ZLP) && (length % dev->maxpacket) == 0) { urb->transfer_buffer_length++; if (skb_tailroom(skb)) { skb->data[skb->len] = 0; diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c index 8ce5e4cee168..374f74702156 100644 --- a/drivers/net/wireless/airo.c +++ b/drivers/net/wireless/airo.c @@ -5249,11 +5249,7 @@ static int set_wep_key(struct airo_info *ai, u16 index, const char *key, WepKeyRid wkr; int rc; - if (keylen == 0) { - airo_print_err(ai->dev->name, "%s: key length to set was zero", - __func__); - return -1; - } + WARN_ON(keylen == 0); memset(&wkr, 0, sizeof(wkr)); wkr.len = cpu_to_le16(sizeof(wkr)); @@ -6399,11 +6395,7 @@ static int airo_set_encode(struct net_device *dev, if (dwrq->length > MIN_KEY_SIZE) key.len = MAX_KEY_SIZE; else - if (dwrq->length > 0) - key.len = MIN_KEY_SIZE; - else - /* Disable the key */ - key.len = 0; + key.len = MIN_KEY_SIZE; /* Check if the key is not marked as invalid */ if(!(dwrq->flags & IW_ENCODE_NOKEY)) { /* Cleanup */ @@ -6584,12 +6576,22 @@ static int airo_set_encodeext(struct net_device *dev, default: return -EINVAL; } - /* Send the key to the card */ - rc = set_wep_key(local, idx, key.key, key.len, perm, 1); - if (rc < 0) { - airo_print_err(local->dev->name, "failed to set WEP key" - " at index %d: %d.", idx, rc); - return rc; + if (key.len == 0) { + rc = set_wep_tx_idx(local, idx, perm, 1); + if (rc < 0) { + airo_print_err(local->dev->name, + "failed to set WEP transmit index to %d: %d.", + idx, rc); + return rc; + } + } else { + rc = set_wep_key(local, idx, key.key, key.len, perm, 1); + if (rc < 0) { + airo_print_err(local->dev->name, + "failed to set WEP key at index %d: %d.", + idx, rc); + return rc; + } } } diff --git a/drivers/net/wireless/ath/ar9170/usb.c b/drivers/net/wireless/ath/ar9170/usb.c index 007eb85fc67e..1084ca69835f 100644 --- a/drivers/net/wireless/ath/ar9170/usb.c +++ b/drivers/net/wireless/ath/ar9170/usb.c @@ -64,6 +64,8 @@ static struct usb_device_id ar9170_usb_ids[] = { { USB_DEVICE(0x0cf3, 0x9170) }, /* Atheros TG121N */ { USB_DEVICE(0x0cf3, 0x1001) }, + /* TP-Link TL-WN821N v2 */ + { USB_DEVICE(0x0cf3, 0x1002) }, /* Cace Airpcap NX */ { USB_DEVICE(0xcace, 0x0300) }, /* D-Link DWA 160A */ diff --git a/drivers/net/wireless/ath/ath5k/ath5k.h b/drivers/net/wireless/ath/ath5k/ath5k.h index 6358233bac99..778baf7de231 100644 --- a/drivers/net/wireless/ath/ath5k/ath5k.h +++ b/drivers/net/wireless/ath/ath5k/ath5k.h @@ -1164,6 +1164,7 @@ extern void ath5k_unregister_leds(struct ath5k_softc *sc); /* Reset Functions */ extern int ath5k_hw_nic_wakeup(struct ath5k_hw *ah, int flags, bool initial); +extern int ath5k_hw_on_hold(struct ath5k_hw *ah); extern int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode, struct ieee80211_channel *channel, bool change_channel); /* Power management functions */ extern int ath5k_hw_set_power(struct ath5k_hw *ah, enum ath5k_power_mode mode, bool set_chip, u16 sleep_duration); diff --git a/drivers/net/wireless/ath/ath5k/attach.c b/drivers/net/wireless/ath/ath5k/attach.c index c41ef58393e7..605b8f67dbe0 100644 --- a/drivers/net/wireless/ath/ath5k/attach.c +++ b/drivers/net/wireless/ath/ath5k/attach.c @@ -145,7 +145,7 @@ struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version) goto err_free; /* Bring device out of sleep and reset it's units */ - ret = ath5k_hw_nic_wakeup(ah, CHANNEL_B, true); + ret = ath5k_hw_nic_wakeup(ah, 0, true); if (ret) goto err_free; diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c index 029c1bc7468f..753f50e8d84f 100644 --- a/drivers/net/wireless/ath/ath5k/base.c +++ b/drivers/net/wireless/ath/ath5k/base.c @@ -666,7 +666,6 @@ ath5k_pci_suspend(struct pci_dev *pdev, pm_message_t state) ath5k_led_off(sc); - free_irq(pdev->irq, sc); pci_save_state(pdev); pci_disable_device(pdev); pci_set_power_state(pdev, PCI_D3hot); @@ -694,18 +693,8 @@ ath5k_pci_resume(struct pci_dev *pdev) */ pci_write_config_byte(pdev, 0x41, 0); - err = request_irq(pdev->irq, ath5k_intr, IRQF_SHARED, "ath", sc); - if (err) { - ATH5K_ERR(sc, "request_irq failed\n"); - goto err_no_irq; - } - ath5k_led_enable(sc); return 0; - -err_no_irq: - pci_disable_device(pdev); - return err; } #endif /* CONFIG_PM */ @@ -2445,27 +2434,29 @@ ath5k_stop_hw(struct ath5k_softc *sc) ret = ath5k_stop_locked(sc); if (ret == 0 && !test_bit(ATH_STAT_INVALID, sc->status)) { /* - * Set the chip in full sleep mode. Note that we are - * careful to do this only when bringing the interface - * completely to a stop. When the chip is in this state - * it must be carefully woken up or references to - * registers in the PCI clock domain may freeze the bus - * (and system). This varies by chip and is mostly an - * issue with newer parts that go to sleep more quickly. - */ - if (sc->ah->ah_mac_srev >= 0x78) { - /* - * XXX - * don't put newer MAC revisions > 7.8 to sleep because - * of the above mentioned problems - */ - ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "mac version > 7.8, " - "not putting device to sleep\n"); - } else { - ATH5K_DBG(sc, ATH5K_DEBUG_RESET, - "putting device to full sleep\n"); - ath5k_hw_set_power(sc->ah, AR5K_PM_FULL_SLEEP, true, 0); - } + * Don't set the card in full sleep mode! + * + * a) When the device is in this state it must be carefully + * woken up or references to registers in the PCI clock + * domain may freeze the bus (and system). This varies + * by chip and is mostly an issue with newer parts + * (madwifi sources mentioned srev >= 0x78) that go to + * sleep more quickly. + * + * b) On older chips full sleep results a weird behaviour + * during wakeup. I tested various cards with srev < 0x78 + * and they don't wake up after module reload, a second + * module reload is needed to bring the card up again. + * + * Until we figure out what's going on don't enable + * full chip reset on any chip (this is what Legacy HAL + * and Sam's HAL do anyway). Instead Perform a full reset + * on the device (same as initial state after attach) and + * leave it idle (keep MAC/BB on warm reset) */ + ret = ath5k_hw_on_hold(sc->ah); + + ATH5K_DBG(sc, ATH5K_DEBUG_RESET, + "putting device to sleep\n"); } ath5k_txbuf_free(sc, sc->bbuf); @@ -2676,7 +2667,7 @@ ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan) sc->curchan = chan; sc->curband = &sc->sbands[chan->band]; } - ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, true); + ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, chan != NULL); if (ret) { ATH5K_ERR(sc, "can't reset hardware (%d)\n", ret); goto err; diff --git a/drivers/net/wireless/ath/ath5k/eeprom.c b/drivers/net/wireless/ath/ath5k/eeprom.c index c56b494d417a..5eded5a0d452 100644 --- a/drivers/net/wireless/ath/ath5k/eeprom.c +++ b/drivers/net/wireless/ath/ath5k/eeprom.c @@ -97,6 +97,7 @@ ath5k_eeprom_init_header(struct ath5k_hw *ah) struct ath5k_eeprom_info *ee = &ah->ah_capabilities.cap_eeprom; int ret; u16 val; + u32 cksum, offset, eep_max = AR5K_EEPROM_INFO_MAX; /* * Read values from EEPROM and store them in the capability structure @@ -111,20 +112,44 @@ ath5k_eeprom_init_header(struct ath5k_hw *ah) if (ah->ah_ee_version < AR5K_EEPROM_VERSION_3_0) return 0; -#ifdef notyet /* * Validate the checksum of the EEPROM date. There are some * devices with invalid EEPROMs. */ - for (cksum = 0, offset = 0; offset < AR5K_EEPROM_INFO_MAX; offset++) { + AR5K_EEPROM_READ(AR5K_EEPROM_SIZE_UPPER, val); + if (val) { + eep_max = (val & AR5K_EEPROM_SIZE_UPPER_MASK) << + AR5K_EEPROM_SIZE_ENDLOC_SHIFT; + AR5K_EEPROM_READ(AR5K_EEPROM_SIZE_LOWER, val); + eep_max = (eep_max | val) - AR5K_EEPROM_INFO_BASE; + + /* + * Fail safe check to prevent stupid loops due + * to busted EEPROMs. XXX: This value is likely too + * big still, waiting on a better value. + */ + if (eep_max > (3 * AR5K_EEPROM_INFO_MAX)) { + ATH5K_ERR(ah->ah_sc, "Invalid max custom EEPROM size: " + "%d (0x%04x) max expected: %d (0x%04x)\n", + eep_max, eep_max, + 3 * AR5K_EEPROM_INFO_MAX, + 3 * AR5K_EEPROM_INFO_MAX); + return -EIO; + } + } + + for (cksum = 0, offset = 0; offset < eep_max; offset++) { AR5K_EEPROM_READ(AR5K_EEPROM_INFO(offset), val); cksum ^= val; } if (cksum != AR5K_EEPROM_INFO_CKSUM) { - ATH5K_ERR(ah->ah_sc, "Invalid EEPROM checksum 0x%04x\n", cksum); + ATH5K_ERR(ah->ah_sc, "Invalid EEPROM " + "checksum: 0x%04x eep_max: 0x%04x (%s)\n", + cksum, eep_max, + eep_max == AR5K_EEPROM_INFO_MAX ? + "default size" : "custom size"); return -EIO; } -#endif AR5K_EEPROM_READ_HDR(AR5K_EEPROM_ANT_GAIN(ah->ah_ee_version), ee_ant_gain); diff --git a/drivers/net/wireless/ath/ath5k/eeprom.h b/drivers/net/wireless/ath/ath5k/eeprom.h index 64be73a5edae..020bc4c75ef0 100644 --- a/drivers/net/wireless/ath/ath5k/eeprom.h +++ b/drivers/net/wireless/ath/ath5k/eeprom.h @@ -34,6 +34,14 @@ #define AR5K_EEPROM_RFKILL_POLARITY_S 1 #define AR5K_EEPROM_REG_DOMAIN 0x00bf /* EEPROM regdom */ + +/* FLASH(EEPROM) Defines for AR531X chips */ +#define AR5K_EEPROM_SIZE_LOWER 0x1b /* size info -- lower */ +#define AR5K_EEPROM_SIZE_UPPER 0x1c /* size info -- upper */ +#define AR5K_EEPROM_SIZE_UPPER_MASK 0xfff0 +#define AR5K_EEPROM_SIZE_UPPER_SHIFT 4 +#define AR5K_EEPROM_SIZE_ENDLOC_SHIFT 12 + #define AR5K_EEPROM_CHECKSUM 0x00c0 /* EEPROM checksum */ #define AR5K_EEPROM_INFO_BASE 0x00c0 /* EEPROM header */ #define AR5K_EEPROM_INFO_MAX (0x400 - AR5K_EEPROM_INFO_BASE) diff --git a/drivers/net/wireless/ath/ath5k/phy.c b/drivers/net/wireless/ath/ath5k/phy.c index a876ca8d69ef..5c0e31b197a0 100644 --- a/drivers/net/wireless/ath/ath5k/phy.c +++ b/drivers/net/wireless/ath/ath5k/phy.c @@ -740,13 +740,22 @@ int ath5k_hw_rfregs_init(struct ath5k_hw *ah, struct ieee80211_channel *channel, AR5K_RF_XPD_GAIN, true); } else { - /* TODO: Set high and low gain bits */ - ath5k_hw_rfb_op(ah, rf_regs, - ee->ee_x_gain[ee_mode], + u8 *pdg_curve_to_idx = ee->ee_pdc_to_idx[ee_mode]; + if (ee->ee_pd_gains[ee_mode] > 1) { + ath5k_hw_rfb_op(ah, rf_regs, + pdg_curve_to_idx[0], AR5K_RF_PD_GAIN_LO, true); - ath5k_hw_rfb_op(ah, rf_regs, - ee->ee_x_gain[ee_mode], + ath5k_hw_rfb_op(ah, rf_regs, + pdg_curve_to_idx[1], AR5K_RF_PD_GAIN_HI, true); + } else { + ath5k_hw_rfb_op(ah, rf_regs, + pdg_curve_to_idx[0], + AR5K_RF_PD_GAIN_LO, true); + ath5k_hw_rfb_op(ah, rf_regs, + pdg_curve_to_idx[0], + AR5K_RF_PD_GAIN_HI, true); + } /* Lower synth voltage on Rev 2 */ ath5k_hw_rfb_op(ah, rf_regs, 2, @@ -1897,8 +1906,9 @@ ath5k_get_linear_pcdac_min(const u8 *stepL, const u8 *stepR, s16 min_pwrL, min_pwrR; s16 pwr_i; - if (WARN_ON(stepL[0] == stepL[1] || stepR[0] == stepR[1])) - return 0; + /* Some vendors write the same pcdac value twice !!! */ + if (stepL[0] == stepL[1] || stepR[0] == stepR[1]) + return max(pwrL[0], pwrR[0]); if (pwrL[0] == pwrL[1]) min_pwrL = pwrL[0]; @@ -2921,8 +2931,6 @@ ath5k_hw_txpower(struct ath5k_hw *ah, struct ieee80211_channel *channel, ATH5K_ERR(ah->ah_sc, "invalid tx power: %u\n", txpower); return -EINVAL; } - if (txpower == 0) - txpower = AR5K_TUNE_DEFAULT_TXPOWER; /* Reset TX power values */ memset(&ah->ah_txpower, 0, sizeof(ah->ah_txpower)); diff --git a/drivers/net/wireless/ath/ath5k/reset.c b/drivers/net/wireless/ath/ath5k/reset.c index bd0a97a38d34..4980621b0239 100644 --- a/drivers/net/wireless/ath/ath5k/reset.c +++ b/drivers/net/wireless/ath/ath5k/reset.c @@ -258,29 +258,35 @@ int ath5k_hw_set_power(struct ath5k_hw *ah, enum ath5k_power_mode mode, if (!set_chip) goto commit; - /* Preserve sleep duration */ data = ath5k_hw_reg_read(ah, AR5K_SLEEP_CTL); + + /* If card is down we 'll get 0xffff... so we + * need to clean this up before we write the register + */ if (data & 0xffc00000) data = 0; else - data = data & 0xfffcffff; + /* Preserve sleep duration etc */ + data = data & ~AR5K_SLEEP_CTL_SLE; - ath5k_hw_reg_write(ah, data, AR5K_SLEEP_CTL); + ath5k_hw_reg_write(ah, data | AR5K_SLEEP_CTL_SLE_WAKE, + AR5K_SLEEP_CTL); udelay(15); - for (i = 50; i > 0; i--) { + for (i = 200; i > 0; i--) { /* Check if the chip did wake up */ if ((ath5k_hw_reg_read(ah, AR5K_PCICFG) & AR5K_PCICFG_SPWR_DN) == 0) break; /* Wait a bit and retry */ - udelay(200); - ath5k_hw_reg_write(ah, data, AR5K_SLEEP_CTL); + udelay(50); + ath5k_hw_reg_write(ah, data | AR5K_SLEEP_CTL_SLE_WAKE, + AR5K_SLEEP_CTL); } /* Fail if the chip didn't wake up */ - if (i <= 0) + if (i == 0) return -EIO; break; @@ -297,6 +303,64 @@ commit: } /* + * Put device on hold + * + * Put MAC and Baseband on warm reset and + * keep that state (don't clean sleep control + * register). After this MAC and Baseband are + * disabled and a full reset is needed to come + * back. This way we save as much power as possible + * without puting the card on full sleep. + */ +int ath5k_hw_on_hold(struct ath5k_hw *ah) +{ + struct pci_dev *pdev = ah->ah_sc->pdev; + u32 bus_flags; + int ret; + + /* Make sure device is awake */ + ret = ath5k_hw_set_power(ah, AR5K_PM_AWAKE, true, 0); + if (ret) { + ATH5K_ERR(ah->ah_sc, "failed to wakeup the MAC Chip\n"); + return ret; + } + + /* + * Put chipset on warm reset... + * + * Note: puting PCI core on warm reset on PCI-E cards + * results card to hang and always return 0xffff... so + * we ingore that flag for PCI-E cards. On PCI cards + * this flag gets cleared after 64 PCI clocks. + */ + bus_flags = (pdev->is_pcie) ? 0 : AR5K_RESET_CTL_PCI; + + if (ah->ah_version == AR5K_AR5210) { + ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU | + AR5K_RESET_CTL_MAC | AR5K_RESET_CTL_DMA | + AR5K_RESET_CTL_PHY | AR5K_RESET_CTL_PCI); + mdelay(2); + } else { + ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU | + AR5K_RESET_CTL_BASEBAND | bus_flags); + } + + if (ret) { + ATH5K_ERR(ah->ah_sc, "failed to put device on warm reset\n"); + return -EIO; + } + + /* ...wakeup again!*/ + ret = ath5k_hw_set_power(ah, AR5K_PM_AWAKE, true, 0); + if (ret) { + ATH5K_ERR(ah->ah_sc, "failed to put device on hold\n"); + return ret; + } + + return ret; +} + +/* * Bring up MAC + PHY Chips and program PLL * TODO: Half/Quarter rate support */ @@ -319,6 +383,50 @@ int ath5k_hw_nic_wakeup(struct ath5k_hw *ah, int flags, bool initial) return ret; } + /* + * Put chipset on warm reset... + * + * Note: puting PCI core on warm reset on PCI-E cards + * results card to hang and always return 0xffff... so + * we ingore that flag for PCI-E cards. On PCI cards + * this flag gets cleared after 64 PCI clocks. + */ + bus_flags = (pdev->is_pcie) ? 0 : AR5K_RESET_CTL_PCI; + + if (ah->ah_version == AR5K_AR5210) { + ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU | + AR5K_RESET_CTL_MAC | AR5K_RESET_CTL_DMA | + AR5K_RESET_CTL_PHY | AR5K_RESET_CTL_PCI); + mdelay(2); + } else { + ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU | + AR5K_RESET_CTL_BASEBAND | bus_flags); + } + + if (ret) { + ATH5K_ERR(ah->ah_sc, "failed to reset the MAC Chip\n"); + return -EIO; + } + + /* ...wakeup again!...*/ + ret = ath5k_hw_set_power(ah, AR5K_PM_AWAKE, true, 0); + if (ret) { + ATH5K_ERR(ah->ah_sc, "failed to resume the MAC Chip\n"); + return ret; + } + + /* ...clear reset control register and pull device out of + * warm reset */ + if (ath5k_hw_nic_reset(ah, 0)) { + ATH5K_ERR(ah->ah_sc, "failed to warm reset the MAC Chip\n"); + return -EIO; + } + + /* On initialization skip PLL programming since we don't have + * a channel / mode set yet */ + if (initial) + return 0; + if (ah->ah_version != AR5K_AR5210) { /* * Get channel mode flags @@ -384,39 +492,6 @@ int ath5k_hw_nic_wakeup(struct ath5k_hw *ah, int flags, bool initial) AR5K_PHY_TURBO); } - /* reseting PCI on PCI-E cards results card to hang - * and always return 0xffff... so we ingore that flag - * for PCI-E cards */ - bus_flags = (pdev->is_pcie) ? 0 : AR5K_RESET_CTL_PCI; - - /* Reset chipset */ - if (ah->ah_version == AR5K_AR5210) { - ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU | - AR5K_RESET_CTL_MAC | AR5K_RESET_CTL_DMA | - AR5K_RESET_CTL_PHY | AR5K_RESET_CTL_PCI); - mdelay(2); - } else { - ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU | - AR5K_RESET_CTL_BASEBAND | bus_flags); - } - if (ret) { - ATH5K_ERR(ah->ah_sc, "failed to reset the MAC Chip\n"); - return -EIO; - } - - /* ...wakeup again!*/ - ret = ath5k_hw_set_power(ah, AR5K_PM_AWAKE, true, 0); - if (ret) { - ATH5K_ERR(ah->ah_sc, "failed to resume the MAC Chip\n"); - return ret; - } - - /* ...final warm reset */ - if (ath5k_hw_nic_reset(ah, 0)) { - ATH5K_ERR(ah->ah_sc, "failed to warm reset the MAC Chip\n"); - return -EIO; - } - if (ah->ah_version != AR5K_AR5210) { /* ...update PLL if needed */ diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h index 40448067e4cc..7797166a0cdb 100644 --- a/drivers/net/wireless/b43/b43.h +++ b/drivers/net/wireless/b43/b43.h @@ -117,6 +117,7 @@ #define B43_MMIO_TSF_2 0x636 /* core rev < 3 only */ #define B43_MMIO_TSF_3 0x638 /* core rev < 3 only */ #define B43_MMIO_RNG 0x65A +#define B43_MMIO_IFSSLOT 0x684 /* Interframe slot time */ #define B43_MMIO_IFSCTL 0x688 /* Interframe space control */ #define B43_MMIO_IFSCTL_USE_EDCF 0x0004 #define B43_MMIO_POWERUP_DELAY 0x6A8 diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c index 7964cc32b258..32e9513bbc0b 100644 --- a/drivers/net/wireless/b43/dma.c +++ b/drivers/net/wireless/b43/dma.c @@ -1158,8 +1158,9 @@ struct b43_dmaring *parse_cookie(struct b43_wldev *dev, u16 cookie, int *slot) } static int dma_tx_fragment(struct b43_dmaring *ring, - struct sk_buff *skb) + struct sk_buff **in_skb) { + struct sk_buff *skb = *in_skb; const struct b43_dma_ops *ops = ring->ops; struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); u8 *header; @@ -1225,8 +1226,14 @@ static int dma_tx_fragment(struct b43_dmaring *ring, } memcpy(skb_put(bounce_skb, skb->len), skb->data, skb->len); + memcpy(bounce_skb->cb, skb->cb, sizeof(skb->cb)); + bounce_skb->dev = skb->dev; + skb_set_queue_mapping(bounce_skb, skb_get_queue_mapping(skb)); + info = IEEE80211_SKB_CB(bounce_skb); + dev_kfree_skb_any(skb); skb = bounce_skb; + *in_skb = bounce_skb; meta->skb = skb; meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1); if (b43_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) { @@ -1334,13 +1341,22 @@ int b43_dma_tx(struct b43_wldev *dev, struct sk_buff *skb) spin_lock_irqsave(&ring->lock, flags); B43_WARN_ON(!ring->tx); - /* Check if the queue was stopped in mac80211, - * but we got called nevertheless. - * That would be a mac80211 bug. */ - B43_WARN_ON(ring->stopped); - if (unlikely(free_slots(ring) < TX_SLOTS_PER_FRAME)) { - b43warn(dev->wl, "DMA queue overflow\n"); + if (unlikely(ring->stopped)) { + /* We get here only because of a bug in mac80211. + * Because of a race, one packet may be queued after + * the queue is stopped, thus we got called when we shouldn't. + * For now, just refuse the transmit. */ + if (b43_debug(dev, B43_DBG_DMAVERBOSE)) + b43err(dev->wl, "Packet after queue stopped\n"); + err = -ENOSPC; + goto out_unlock; + } + + if (unlikely(WARN_ON(free_slots(ring) < TX_SLOTS_PER_FRAME))) { + /* If we get here, we have a real error with the queue + * full, but queues not stopped. */ + b43err(dev->wl, "DMA queue overflow\n"); err = -ENOSPC; goto out_unlock; } @@ -1350,7 +1366,11 @@ int b43_dma_tx(struct b43_wldev *dev, struct sk_buff *skb) * static, so we don't need to store it per frame. */ ring->queue_prio = skb_get_queue_mapping(skb); - err = dma_tx_fragment(ring, skb); + /* dma_tx_fragment might reallocate the skb, so invalidate pointers pointing + * into the skb data or cb now. */ + hdr = NULL; + info = NULL; + err = dma_tx_fragment(ring, &skb); if (unlikely(err == -ENOKEY)) { /* Drop this packet, as we don't have the encryption key * anymore and must not transmit it unencrypted. */ diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index e71c8d9cd706..82fb9d48fa55 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c @@ -664,10 +664,17 @@ static void b43_upload_card_macaddress(struct b43_wldev *dev) static void b43_set_slot_time(struct b43_wldev *dev, u16 slot_time) { /* slot_time is in usec. */ - if (dev->phy.type != B43_PHYTYPE_G) + /* This test used to exit for all but a G PHY. */ + if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) return; - b43_write16(dev, 0x684, 510 + slot_time); - b43_shm_write16(dev, B43_SHM_SHARED, 0x0010, slot_time); + b43_write16(dev, B43_MMIO_IFSSLOT, 510 + slot_time); + /* Shared memory location 0x0010 is the slot time and should be + * set to slot_time; however, this register is initially 0 and changing + * the value adversely affects the transmit rate for BCM4311 + * devices. Until this behavior is unterstood, delete this step + * + * b43_shm_write16(dev, B43_SHM_SHARED, 0x0010, slot_time); + */ } static void b43_short_slot_timing_enable(struct b43_wldev *dev) diff --git a/drivers/net/wireless/b43/rfkill.c b/drivers/net/wireless/b43/rfkill.c index 31e55999893f..dcde92d682ce 100644 --- a/drivers/net/wireless/b43/rfkill.c +++ b/drivers/net/wireless/b43/rfkill.c @@ -33,7 +33,8 @@ bool b43_is_hw_radio_enabled(struct b43_wldev *dev) & B43_MMIO_RADIO_HWENABLED_HI_MASK)) return 1; } else { - if (b43_read16(dev, B43_MMIO_RADIO_HWENABLED_LO) + if (b43_status(dev) >= B43_STAT_STARTED && + b43_read16(dev, B43_MMIO_RADIO_HWENABLED_LO) & B43_MMIO_RADIO_HWENABLED_LO_MASK) return 1; } diff --git a/drivers/net/wireless/b43legacy/rfkill.c b/drivers/net/wireless/b43legacy/rfkill.c index 8783022db11e..d579df72b783 100644 --- a/drivers/net/wireless/b43legacy/rfkill.c +++ b/drivers/net/wireless/b43legacy/rfkill.c @@ -34,6 +34,13 @@ bool b43legacy_is_hw_radio_enabled(struct b43legacy_wldev *dev) & B43legacy_MMIO_RADIO_HWENABLED_HI_MASK)) return 1; } else { + /* To prevent CPU fault on PPC, do not read a register + * unless the interface is started; however, on resume + * for hibernation, this routine is entered early. When + * that happens, unconditionally return TRUE. + */ + if (b43legacy_status(dev) < B43legacy_STAT_STARTED) + return 1; if (b43legacy_read16(dev, B43legacy_MMIO_RADIO_HWENABLED_LO) & B43legacy_MMIO_RADIO_HWENABLED_LO_MASK) return 1; diff --git a/drivers/net/wireless/hostap/hostap_main.c b/drivers/net/wireless/hostap/hostap_main.c index 6fe122f18c0d..eb57d1ea361f 100644 --- a/drivers/net/wireless/hostap/hostap_main.c +++ b/drivers/net/wireless/hostap/hostap_main.c @@ -875,15 +875,16 @@ void hostap_setup_dev(struct net_device *dev, local_info_t *local, switch(type) { case HOSTAP_INTERFACE_AP: + dev->tx_queue_len = 0; /* use main radio device queue */ dev->netdev_ops = &hostap_mgmt_netdev_ops; dev->type = ARPHRD_IEEE80211; dev->header_ops = &hostap_80211_ops; break; case HOSTAP_INTERFACE_MASTER: - dev->tx_queue_len = 0; /* use main radio device queue */ dev->netdev_ops = &hostap_master_ops; break; default: + dev->tx_queue_len = 0; /* use main radio device queue */ dev->netdev_ops = &hostap_netdev_ops; } diff --git a/drivers/net/wireless/ipw2x00/ipw2100.c b/drivers/net/wireless/ipw2x00/ipw2100.c index 742432388ca3..d04350b14790 100644 --- a/drivers/net/wireless/ipw2x00/ipw2100.c +++ b/drivers/net/wireless/ipw2x00/ipw2100.c @@ -6487,6 +6487,16 @@ static int ipw2100_resume(struct pci_dev *pci_dev) } #endif +static void ipw2100_shutdown(struct pci_dev *pci_dev) +{ + struct ipw2100_priv *priv = pci_get_drvdata(pci_dev); + + /* Take down the device; powers it off, etc. */ + ipw2100_down(priv); + + pci_disable_device(pci_dev); +} + #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x } static struct pci_device_id ipw2100_pci_id_table[] __devinitdata = { @@ -6550,6 +6560,7 @@ static struct pci_driver ipw2100_pci_driver = { .suspend = ipw2100_suspend, .resume = ipw2100_resume, #endif + .shutdown = ipw2100_shutdown, }; /** diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c index 7da52f1cc1d6..44baa60c9fd3 100644 --- a/drivers/net/wireless/iwlwifi/iwl-1000.c +++ b/drivers/net/wireless/iwlwifi/iwl-1000.c @@ -46,7 +46,7 @@ #include "iwl-5000-hw.h" /* Highest firmware API version supported */ -#define IWL1000_UCODE_API_MAX 2 +#define IWL1000_UCODE_API_MAX 3 /* Lowest firmware API version supported */ #define IWL1000_UCODE_API_MIN 1 @@ -62,12 +62,15 @@ struct iwl_cfg iwl1000_bgn_cfg = { .ucode_api_min = IWL1000_UCODE_API_MIN, .sku = IWL_SKU_G|IWL_SKU_N, .ops = &iwl5000_ops, - .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, + .eeprom_size = OTP_LOW_IMAGE_SIZE, .eeprom_ver = EEPROM_5000_EEPROM_VERSION, .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, .mod_params = &iwl50_mod_params, .valid_tx_ant = ANT_A, .valid_rx_ant = ANT_AB, .need_pll_cfg = true, + .max_ll_items = OTP_MAX_LL_ITEMS_1000, + .shadow_ram_support = false, + .use_rts_for_ht = true, /* use rts/cts protection */ }; diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index 46288e724889..b73ab6c278f3 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c @@ -2784,11 +2784,50 @@ static int iwl3945_load_bsm(struct iwl_priv *priv) return 0; } +#define IWL3945_UCODE_GET(item) \ +static u32 iwl3945_ucode_get_##item(const struct iwl_ucode_header *ucode,\ + u32 api_ver) \ +{ \ + return le32_to_cpu(ucode->u.v1.item); \ +} + +static u32 iwl3945_ucode_get_header_size(u32 api_ver) +{ + return UCODE_HEADER_SIZE(1); +} +static u32 iwl3945_ucode_get_build(const struct iwl_ucode_header *ucode, + u32 api_ver) +{ + return 0; +} +static u8 *iwl3945_ucode_get_data(const struct iwl_ucode_header *ucode, + u32 api_ver) +{ + return (u8 *) ucode->u.v1.data; +} + +IWL3945_UCODE_GET(inst_size); +IWL3945_UCODE_GET(data_size); +IWL3945_UCODE_GET(init_size); +IWL3945_UCODE_GET(init_data_size); +IWL3945_UCODE_GET(boot_size); + static struct iwl_hcmd_ops iwl3945_hcmd = { .rxon_assoc = iwl3945_send_rxon_assoc, .commit_rxon = iwl3945_commit_rxon, }; +static struct iwl_ucode_ops iwl3945_ucode = { + .get_header_size = iwl3945_ucode_get_header_size, + .get_build = iwl3945_ucode_get_build, + .get_inst_size = iwl3945_ucode_get_inst_size, + .get_data_size = iwl3945_ucode_get_data_size, + .get_init_size = iwl3945_ucode_get_init_size, + .get_init_data_size = iwl3945_ucode_get_init_data_size, + .get_boot_size = iwl3945_ucode_get_boot_size, + .get_data = iwl3945_ucode_get_data, +}; + static struct iwl_lib_ops iwl3945_lib = { .txq_attach_buf_to_tfd = iwl3945_hw_txq_attach_buf_to_tfd, .txq_free_tfd = iwl3945_hw_txq_free_tfd, @@ -2829,6 +2868,7 @@ static struct iwl_hcmd_utils_ops iwl3945_hcmd_utils = { }; static struct iwl_ops iwl3945_ops = { + .ucode = &iwl3945_ucode, .lib = &iwl3945_lib, .hcmd = &iwl3945_hcmd, .utils = &iwl3945_hcmd_utils, diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c index 8f3d4bc6a03f..157ee1506b3c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c @@ -2221,12 +2221,50 @@ static void iwl4965_cancel_deferred_work(struct iwl_priv *priv) cancel_work_sync(&priv->txpower_work); } +#define IWL4965_UCODE_GET(item) \ +static u32 iwl4965_ucode_get_##item(const struct iwl_ucode_header *ucode,\ + u32 api_ver) \ +{ \ + return le32_to_cpu(ucode->u.v1.item); \ +} + +static u32 iwl4965_ucode_get_header_size(u32 api_ver) +{ + return UCODE_HEADER_SIZE(1); +} +static u32 iwl4965_ucode_get_build(const struct iwl_ucode_header *ucode, + u32 api_ver) +{ + return 0; +} +static u8 *iwl4965_ucode_get_data(const struct iwl_ucode_header *ucode, + u32 api_ver) +{ + return (u8 *) ucode->u.v1.data; +} + +IWL4965_UCODE_GET(inst_size); +IWL4965_UCODE_GET(data_size); +IWL4965_UCODE_GET(init_size); +IWL4965_UCODE_GET(init_data_size); +IWL4965_UCODE_GET(boot_size); + static struct iwl_hcmd_ops iwl4965_hcmd = { .rxon_assoc = iwl4965_send_rxon_assoc, .commit_rxon = iwl_commit_rxon, .set_rxon_chain = iwl_set_rxon_chain, }; +static struct iwl_ucode_ops iwl4965_ucode = { + .get_header_size = iwl4965_ucode_get_header_size, + .get_build = iwl4965_ucode_get_build, + .get_inst_size = iwl4965_ucode_get_inst_size, + .get_data_size = iwl4965_ucode_get_data_size, + .get_init_size = iwl4965_ucode_get_init_size, + .get_init_data_size = iwl4965_ucode_get_init_data_size, + .get_boot_size = iwl4965_ucode_get_boot_size, + .get_data = iwl4965_ucode_get_data, +}; static struct iwl_hcmd_utils_ops iwl4965_hcmd_utils = { .get_hcmd_size = iwl4965_get_hcmd_size, .build_addsta_hcmd = iwl4965_build_addsta_hcmd, @@ -2287,6 +2325,7 @@ static struct iwl_lib_ops iwl4965_lib = { }; static struct iwl_ops iwl4965_ops = { + .ucode = &iwl4965_ucode, .lib = &iwl4965_lib, .hcmd = &iwl4965_hcmd, .utils = &iwl4965_hcmd_utils, diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index b3c648ce8c7b..a9ea3b5d49d5 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c @@ -239,6 +239,13 @@ static void iwl5000_nic_config(struct iwl_priv *priv) APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS, ~APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS); + if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_1000) { + /* Setting digital SVR for 1000 card to 1.32V */ + iwl_set_bits_mask_prph(priv, APMG_DIGITAL_SVR_REG, + APMG_SVR_DIGITAL_VOLTAGE_1_32, + ~APMG_SVR_VOLTAGE_CONFIG_BIT_MSK); + } + spin_unlock_irqrestore(&priv->lock, flags); } @@ -1426,6 +1433,44 @@ int iwl5000_calc_rssi(struct iwl_priv *priv, return max_rssi - agc - IWL49_RSSI_OFFSET; } +#define IWL5000_UCODE_GET(item) \ +static u32 iwl5000_ucode_get_##item(const struct iwl_ucode_header *ucode,\ + u32 api_ver) \ +{ \ + if (api_ver <= 2) \ + return le32_to_cpu(ucode->u.v1.item); \ + return le32_to_cpu(ucode->u.v2.item); \ +} + +static u32 iwl5000_ucode_get_header_size(u32 api_ver) +{ + if (api_ver <= 2) + return UCODE_HEADER_SIZE(1); + return UCODE_HEADER_SIZE(2); +} + +static u32 iwl5000_ucode_get_build(const struct iwl_ucode_header *ucode, + u32 api_ver) +{ + if (api_ver <= 2) + return 0; + return le32_to_cpu(ucode->u.v2.build); +} + +static u8 *iwl5000_ucode_get_data(const struct iwl_ucode_header *ucode, + u32 api_ver) +{ + if (api_ver <= 2) + return (u8 *) ucode->u.v1.data; + return (u8 *) ucode->u.v2.data; +} + +IWL5000_UCODE_GET(inst_size); +IWL5000_UCODE_GET(data_size); +IWL5000_UCODE_GET(init_size); +IWL5000_UCODE_GET(init_data_size); +IWL5000_UCODE_GET(boot_size); + struct iwl_hcmd_ops iwl5000_hcmd = { .rxon_assoc = iwl5000_send_rxon_assoc, .commit_rxon = iwl_commit_rxon, @@ -1441,6 +1486,17 @@ struct iwl_hcmd_utils_ops iwl5000_hcmd_utils = { .calc_rssi = iwl5000_calc_rssi, }; +struct iwl_ucode_ops iwl5000_ucode = { + .get_header_size = iwl5000_ucode_get_header_size, + .get_build = iwl5000_ucode_get_build, + .get_inst_size = iwl5000_ucode_get_inst_size, + .get_data_size = iwl5000_ucode_get_data_size, + .get_init_size = iwl5000_ucode_get_init_size, + .get_init_data_size = iwl5000_ucode_get_init_data_size, + .get_boot_size = iwl5000_ucode_get_boot_size, + .get_data = iwl5000_ucode_get_data, +}; + struct iwl_lib_ops iwl5000_lib = { .set_hw_params = iwl5000_hw_set_hw_params, .txq_update_byte_cnt_tbl = iwl5000_txq_update_byte_cnt_tbl, @@ -1542,12 +1598,14 @@ static struct iwl_lib_ops iwl5150_lib = { }; struct iwl_ops iwl5000_ops = { + .ucode = &iwl5000_ucode, .lib = &iwl5000_lib, .hcmd = &iwl5000_hcmd, .utils = &iwl5000_hcmd_utils, }; static struct iwl_ops iwl5150_ops = { + .ucode = &iwl5000_ucode, .lib = &iwl5150_lib, .hcmd = &iwl5000_hcmd, .utils = &iwl5000_hcmd_utils, diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c index bd438d8acf55..ee7b48ed3e8b 100644 --- a/drivers/net/wireless/iwlwifi/iwl-6000.c +++ b/drivers/net/wireless/iwlwifi/iwl-6000.c @@ -46,8 +46,8 @@ #include "iwl-5000-hw.h" /* Highest firmware API version supported */ -#define IWL6000_UCODE_API_MAX 2 -#define IWL6050_UCODE_API_MAX 2 +#define IWL6000_UCODE_API_MAX 3 +#define IWL6050_UCODE_API_MAX 3 /* Lowest firmware API version supported */ #define IWL6000_UCODE_API_MIN 1 @@ -69,6 +69,7 @@ static struct iwl_hcmd_utils_ops iwl6000_hcmd_utils = { }; static struct iwl_ops iwl6000_ops = { + .ucode = &iwl5000_ucode, .lib = &iwl5000_lib, .hcmd = &iwl5000_hcmd, .utils = &iwl6000_hcmd_utils, @@ -81,13 +82,15 @@ struct iwl_cfg iwl6000_2ag_cfg = { .ucode_api_min = IWL6000_UCODE_API_MIN, .sku = IWL_SKU_A|IWL_SKU_G, .ops = &iwl6000_ops, - .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, + .eeprom_size = OTP_LOW_IMAGE_SIZE, .eeprom_ver = EEPROM_5000_EEPROM_VERSION, .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, .mod_params = &iwl50_mod_params, .valid_tx_ant = ANT_BC, .valid_rx_ant = ANT_BC, .need_pll_cfg = false, + .max_ll_items = OTP_MAX_LL_ITEMS_6x00, + .shadow_ram_support = true, }; struct iwl_cfg iwl6000_2agn_cfg = { @@ -97,13 +100,16 @@ struct iwl_cfg iwl6000_2agn_cfg = { .ucode_api_min = IWL6000_UCODE_API_MIN, .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, .ops = &iwl6000_ops, - .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, + .eeprom_size = OTP_LOW_IMAGE_SIZE, .eeprom_ver = EEPROM_5000_EEPROM_VERSION, .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, .mod_params = &iwl50_mod_params, .valid_tx_ant = ANT_AB, .valid_rx_ant = ANT_AB, .need_pll_cfg = false, + .max_ll_items = OTP_MAX_LL_ITEMS_6x00, + .shadow_ram_support = true, + .use_rts_for_ht = true, /* use rts/cts protection */ }; struct iwl_cfg iwl6050_2agn_cfg = { @@ -113,13 +119,16 @@ struct iwl_cfg iwl6050_2agn_cfg = { .ucode_api_min = IWL6050_UCODE_API_MIN, .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, .ops = &iwl6000_ops, - .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, + .eeprom_size = OTP_LOW_IMAGE_SIZE, .eeprom_ver = EEPROM_5000_EEPROM_VERSION, .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, .mod_params = &iwl50_mod_params, .valid_tx_ant = ANT_AB, .valid_rx_ant = ANT_AB, .need_pll_cfg = false, + .max_ll_items = OTP_MAX_LL_ITEMS_6x00, + .shadow_ram_support = true, + .use_rts_for_ht = true, /* use rts/cts protection */ }; struct iwl_cfg iwl6000_3agn_cfg = { @@ -129,13 +138,16 @@ struct iwl_cfg iwl6000_3agn_cfg = { .ucode_api_min = IWL6000_UCODE_API_MIN, .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, .ops = &iwl6000_ops, - .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, + .eeprom_size = OTP_LOW_IMAGE_SIZE, .eeprom_ver = EEPROM_5000_EEPROM_VERSION, .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, .mod_params = &iwl50_mod_params, .valid_tx_ant = ANT_ABC, .valid_rx_ant = ANT_ABC, .need_pll_cfg = false, + .max_ll_items = OTP_MAX_LL_ITEMS_6x00, + .shadow_ram_support = true, + .use_rts_for_ht = true, /* use rts/cts protection */ }; struct iwl_cfg iwl6050_3agn_cfg = { @@ -145,13 +157,16 @@ struct iwl_cfg iwl6050_3agn_cfg = { .ucode_api_min = IWL6050_UCODE_API_MIN, .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, .ops = &iwl6000_ops, - .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, + .eeprom_size = OTP_LOW_IMAGE_SIZE, .eeprom_ver = EEPROM_5000_EEPROM_VERSION, .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, .mod_params = &iwl50_mod_params, .valid_tx_ant = ANT_ABC, .valid_rx_ant = ANT_ABC, .need_pll_cfg = false, + .max_ll_items = OTP_MAX_LL_ITEMS_6x00, + .shadow_ram_support = true, + .use_rts_for_ht = true, /* use rts/cts protection */ }; MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX)); diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c index ff20e5048a55..f5c108be541c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c @@ -415,6 +415,15 @@ static void rs_tl_turn_on_agg(struct iwl_priv *priv, u8 tid, else if (tid == IWL_AGG_ALL_TID) for (tid = 0; tid < TID_MAX_LOAD_COUNT; tid++) rs_tl_turn_on_agg_for_tid(priv, lq_data, tid, sta); + if (priv->cfg->use_rts_for_ht) { + /* + * switch to RTS/CTS if it is the prefer protection method + * for HT traffic + */ + IWL_DEBUG_HT(priv, "use RTS/CTS protection for HT\n"); + priv->staging_rxon.flags &= ~RXON_FLG_SELF_CTS_EN; + iwlcore_commit_rxon(priv); + } } static inline int get_num_of_ant_from_rate(u32 rate_n_flags) diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 355f50ea7fef..fc33b29c58ae 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c @@ -115,9 +115,6 @@ int iwl_commit_rxon(struct iwl_priv *priv) /* always get timestamp with Rx frame */ priv->staging_rxon.flags |= RXON_FLG_TSF2HOST_MSK; - /* allow CTS-to-self if possible. this is relevant only for - * 5000, but will not damage 4965 */ - priv->staging_rxon.flags |= RXON_FLG_SELF_CTS_EN; ret = iwl_check_rxon_cmd(priv); if (ret) { @@ -217,6 +214,13 @@ int iwl_commit_rxon(struct iwl_priv *priv) "Could not send WEP static key.\n"); } + /* + * allow CTS-to-self if possible for new association. + * this is relevant only for 5000 series and up, + * but will not damage 4965 + */ + priv->staging_rxon.flags |= RXON_FLG_SELF_CTS_EN; + /* Apply the new configuration * RXON assoc doesn't clear the station table in uCode, */ @@ -1348,7 +1352,7 @@ static void iwl_nic_start(struct iwl_priv *priv) */ static int iwl_read_ucode(struct iwl_priv *priv) { - struct iwl_ucode *ucode; + struct iwl_ucode_header *ucode; int ret = -EINVAL, index; const struct firmware *ucode_raw; const char *name_pre = priv->cfg->fw_name_pre; @@ -1357,7 +1361,8 @@ static int iwl_read_ucode(struct iwl_priv *priv) char buf[25]; u8 *src; size_t len; - u32 api_ver, inst_size, data_size, init_size, init_data_size, boot_size; + u32 api_ver, build; + u32 inst_size, data_size, init_size, init_data_size, boot_size; /* Ask kernel firmware_class module to get the boot firmware off disk. * request_firmware() is synchronous, file is in memory on return. */ @@ -1387,23 +1392,26 @@ static int iwl_read_ucode(struct iwl_priv *priv) if (ret < 0) goto error; - /* Make sure that we got at least our header! */ - if (ucode_raw->size < sizeof(*ucode)) { + /* Make sure that we got at least the v1 header! */ + if (ucode_raw->size < priv->cfg->ops->ucode->get_header_size(1)) { IWL_ERR(priv, "File size way too small!\n"); ret = -EINVAL; goto err_release; } /* Data from ucode file: header followed by uCode images */ - ucode = (void *)ucode_raw->data; + ucode = (struct iwl_ucode_header *)ucode_raw->data; priv->ucode_ver = le32_to_cpu(ucode->ver); api_ver = IWL_UCODE_API(priv->ucode_ver); - inst_size = le32_to_cpu(ucode->inst_size); - data_size = le32_to_cpu(ucode->data_size); - init_size = le32_to_cpu(ucode->init_size); - init_data_size = le32_to_cpu(ucode->init_data_size); - boot_size = le32_to_cpu(ucode->boot_size); + build = priv->cfg->ops->ucode->get_build(ucode, api_ver); + inst_size = priv->cfg->ops->ucode->get_inst_size(ucode, api_ver); + data_size = priv->cfg->ops->ucode->get_data_size(ucode, api_ver); + init_size = priv->cfg->ops->ucode->get_init_size(ucode, api_ver); + init_data_size = + priv->cfg->ops->ucode->get_init_data_size(ucode, api_ver); + boot_size = priv->cfg->ops->ucode->get_boot_size(ucode, api_ver); + src = priv->cfg->ops->ucode->get_data(ucode, api_ver); /* api_ver should match the api version forming part of the * firmware filename ... but we don't check for that and only rely @@ -1429,6 +1437,9 @@ static int iwl_read_ucode(struct iwl_priv *priv) IWL_UCODE_API(priv->ucode_ver), IWL_UCODE_SERIAL(priv->ucode_ver)); + if (build) + IWL_DEBUG_INFO(priv, "Build %u\n", build); + IWL_DEBUG_INFO(priv, "f/w package hdr ucode version raw = 0x%x\n", priv->ucode_ver); IWL_DEBUG_INFO(priv, "f/w package hdr runtime inst size = %u\n", @@ -1443,12 +1454,14 @@ static int iwl_read_ucode(struct iwl_priv *priv) boot_size); /* Verify size of file vs. image size info in file's header */ - if (ucode_raw->size < sizeof(*ucode) + + if (ucode_raw->size != + priv->cfg->ops->ucode->get_header_size(api_ver) + inst_size + data_size + init_size + init_data_size + boot_size) { - IWL_DEBUG_INFO(priv, "uCode file size %d too small\n", - (int)ucode_raw->size); + IWL_DEBUG_INFO(priv, + "uCode file size %d does not match expected size\n", + (int)ucode_raw->size); ret = -EINVAL; goto err_release; } @@ -1528,42 +1541,42 @@ static int iwl_read_ucode(struct iwl_priv *priv) /* Copy images into buffers for card's bus-master reads ... */ /* Runtime instructions (first block of data in file) */ - src = &ucode->data[0]; - len = priv->ucode_code.len; + len = inst_size; IWL_DEBUG_INFO(priv, "Copying (but not loading) uCode instr len %Zd\n", len); memcpy(priv->ucode_code.v_addr, src, len); + src += len; + IWL_DEBUG_INFO(priv, "uCode instr buf vaddr = 0x%p, paddr = 0x%08x\n", priv->ucode_code.v_addr, (u32)priv->ucode_code.p_addr); /* Runtime data (2nd block) * NOTE: Copy into backup buffer will be done in iwl_up() */ - src = &ucode->data[inst_size]; - len = priv->ucode_data.len; + len = data_size; IWL_DEBUG_INFO(priv, "Copying (but not loading) uCode data len %Zd\n", len); memcpy(priv->ucode_data.v_addr, src, len); memcpy(priv->ucode_data_backup.v_addr, src, len); + src += len; /* Initialization instructions (3rd block) */ if (init_size) { - src = &ucode->data[inst_size + data_size]; - len = priv->ucode_init.len; + len = init_size; IWL_DEBUG_INFO(priv, "Copying (but not loading) init instr len %Zd\n", len); memcpy(priv->ucode_init.v_addr, src, len); + src += len; } /* Initialization data (4th block) */ if (init_data_size) { - src = &ucode->data[inst_size + data_size + init_size]; - len = priv->ucode_init_data.len; + len = init_data_size; IWL_DEBUG_INFO(priv, "Copying (but not loading) init data len %Zd\n", len); memcpy(priv->ucode_init_data.v_addr, src, len); + src += len; } /* Bootstrap instructions (5th block) */ - src = &ucode->data[inst_size + data_size + init_size + init_data_size]; - len = priv->ucode_boot.len; + len = boot_size; IWL_DEBUG_INFO(priv, "Copying (but not loading) boot instr len %Zd\n", len); memcpy(priv->ucode_boot.v_addr, src, len); @@ -2206,7 +2219,7 @@ static void iwl_mac_stop(struct ieee80211_hw *hw) priv->is_open = 0; - if (iwl_is_ready_rf(priv)) { + if (iwl_is_ready_rf(priv) || test_bit(STATUS_SCAN_HW, &priv->status)) { /* stop mac, cancel any scan request and clear * RXON_FILTER_ASSOC_MSK BIT */ diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h index dabf663e36e5..4e616eccebfb 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.h +++ b/drivers/net/wireless/iwlwifi/iwl-core.h @@ -116,6 +116,17 @@ struct iwl_temp_ops { void (*set_ct_kill)(struct iwl_priv *priv); }; +struct iwl_ucode_ops { + u32 (*get_header_size)(u32); + u32 (*get_build)(const struct iwl_ucode_header *, u32); + u32 (*get_inst_size)(const struct iwl_ucode_header *, u32); + u32 (*get_data_size)(const struct iwl_ucode_header *, u32); + u32 (*get_init_size)(const struct iwl_ucode_header *, u32); + u32 (*get_init_data_size)(const struct iwl_ucode_header *, u32); + u32 (*get_boot_size)(const struct iwl_ucode_header *, u32); + u8 * (*get_data)(const struct iwl_ucode_header *, u32); +}; + struct iwl_lib_ops { /* set hw dependent parameters */ int (*set_hw_params)(struct iwl_priv *priv); @@ -171,6 +182,7 @@ struct iwl_lib_ops { }; struct iwl_ops { + const struct iwl_ucode_ops *ucode; const struct iwl_lib_ops *lib; const struct iwl_hcmd_ops *hcmd; const struct iwl_hcmd_utils_ops *utils; @@ -195,6 +207,9 @@ struct iwl_mod_params { * filename is constructed as fw_name_pre<api>.ucode. * @ucode_api_max: Highest version of uCode API supported by driver. * @ucode_api_min: Lowest version of uCode API supported by driver. + * @max_ll_items: max number of OTP blocks + * @shadow_ram_support: shadow support for OTP memory + * @use_rts_for_ht: use rts/cts protection for HT traffic * * We enable the driver to be backward compatible wrt API version. The * driver specifies which APIs it supports (with @ucode_api_max being the @@ -231,6 +246,9 @@ struct iwl_cfg { u8 valid_rx_ant; bool need_pll_cfg; bool use_isr_legacy; + const u16 max_ll_items; + const bool shadow_ram_support; + bool use_rts_for_ht; }; /*************************** diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index 650e20af20fa..e8c86079334a 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h @@ -66,6 +66,7 @@ extern struct iwl_cfg iwl1000_bgn_cfg; /* shared structures from iwl-5000.c */ extern struct iwl_mod_params iwl50_mod_params; extern struct iwl_ops iwl5000_ops; +extern struct iwl_ucode_ops iwl5000_ucode; extern struct iwl_lib_ops iwl5000_lib; extern struct iwl_hcmd_ops iwl5000_hcmd; extern struct iwl_hcmd_utils_ops iwl5000_hcmd_utils; @@ -525,15 +526,29 @@ struct fw_desc { }; /* uCode file layout */ -struct iwl_ucode { - __le32 ver; /* major/minor/API/serial */ - __le32 inst_size; /* bytes of runtime instructions */ - __le32 data_size; /* bytes of runtime data */ - __le32 init_size; /* bytes of initialization instructions */ - __le32 init_data_size; /* bytes of initialization data */ - __le32 boot_size; /* bytes of bootstrap instructions */ - u8 data[0]; /* data in same order as "size" elements */ +struct iwl_ucode_header { + __le32 ver; /* major/minor/API/serial */ + union { + struct { + __le32 inst_size; /* bytes of runtime code */ + __le32 data_size; /* bytes of runtime data */ + __le32 init_size; /* bytes of init code */ + __le32 init_data_size; /* bytes of init data */ + __le32 boot_size; /* bytes of bootstrap code */ + u8 data[0]; /* in same order as sizes */ + } v1; + struct { + __le32 build; /* build number */ + __le32 inst_size; /* bytes of runtime code */ + __le32 data_size; /* bytes of runtime data */ + __le32 init_size; /* bytes of init code */ + __le32 init_data_size; /* bytes of init data */ + __le32 boot_size; /* bytes of bootstrap code */ + u8 data[0]; /* in same order as sizes */ + } v2; + } u; }; +#define UCODE_HEADER_SIZE(ver) ((ver) == 1 ? 24 : 28) struct iwl4965_ibss_seq { u8 mac[ETH_ALEN]; @@ -820,6 +835,18 @@ enum iwl_nvm_type { NVM_DEVICE_TYPE_OTP, }; +/* + * Two types of OTP memory access modes + * IWL_OTP_ACCESS_ABSOLUTE - absolute address mode, + * based on physical memory addressing + * IWL_OTP_ACCESS_RELATIVE - relative address mode, + * based on logical memory addressing + */ +enum iwl_access_mode { + IWL_OTP_ACCESS_ABSOLUTE, + IWL_OTP_ACCESS_RELATIVE, +}; + /* interrupt statistics */ struct isr_statistics { u32 hw; diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.c b/drivers/net/wireless/iwlwifi/iwl-eeprom.c index 7d7554a2f341..eabe48a7ebfe 100644 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.c +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.c @@ -152,6 +152,19 @@ int iwlcore_eeprom_verify_signature(struct iwl_priv *priv) } EXPORT_SYMBOL(iwlcore_eeprom_verify_signature); +static void iwl_set_otp_access(struct iwl_priv *priv, enum iwl_access_mode mode) +{ + u32 otpgp; + + otpgp = iwl_read32(priv, CSR_OTP_GP_REG); + if (mode == IWL_OTP_ACCESS_ABSOLUTE) + iwl_clear_bit(priv, CSR_OTP_GP_REG, + CSR_OTP_GP_REG_OTP_ACCESS_MODE); + else + iwl_set_bit(priv, CSR_OTP_GP_REG, + CSR_OTP_GP_REG_OTP_ACCESS_MODE); +} + static int iwlcore_get_nvm_type(struct iwl_priv *priv) { u32 otpgp; @@ -249,6 +262,123 @@ static int iwl_init_otp_access(struct iwl_priv *priv) return ret; } +static int iwl_read_otp_word(struct iwl_priv *priv, u16 addr, u16 *eeprom_data) +{ + int ret = 0; + u32 r; + u32 otpgp; + + _iwl_write32(priv, CSR_EEPROM_REG, + CSR_EEPROM_REG_MSK_ADDR & (addr << 1)); + ret = iwl_poll_direct_bit(priv, CSR_EEPROM_REG, + CSR_EEPROM_REG_READ_VALID_MSK, + IWL_EEPROM_ACCESS_TIMEOUT); + if (ret < 0) { + IWL_ERR(priv, "Time out reading OTP[%d]\n", addr); + return ret; + } + r = _iwl_read_direct32(priv, CSR_EEPROM_REG); + /* check for ECC errors: */ + otpgp = iwl_read32(priv, CSR_OTP_GP_REG); + if (otpgp & CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK) { + /* stop in this case */ + /* set the uncorrectable OTP ECC bit for acknowledgement */ + iwl_set_bit(priv, CSR_OTP_GP_REG, + CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK); + IWL_ERR(priv, "Uncorrectable OTP ECC error, abort OTP read\n"); + return -EINVAL; + } + if (otpgp & CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK) { + /* continue in this case */ + /* set the correctable OTP ECC bit for acknowledgement */ + iwl_set_bit(priv, CSR_OTP_GP_REG, + CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK); + IWL_ERR(priv, "Correctable OTP ECC error, continue read\n"); + } + *eeprom_data = le16_to_cpu((__force __le16)(r >> 16)); + return 0; +} + +/* + * iwl_is_otp_empty: check for empty OTP + */ +static bool iwl_is_otp_empty(struct iwl_priv *priv) +{ + u16 next_link_addr = 0, link_value; + bool is_empty = false; + + /* locate the beginning of OTP link list */ + if (!iwl_read_otp_word(priv, next_link_addr, &link_value)) { + if (!link_value) { + IWL_ERR(priv, "OTP is empty\n"); + is_empty = true; + } + } else { + IWL_ERR(priv, "Unable to read first block of OTP list.\n"); + is_empty = true; + } + + return is_empty; +} + + +/* + * iwl_find_otp_image: find EEPROM image in OTP + * finding the OTP block that contains the EEPROM image. + * the last valid block on the link list (the block _before_ the last block) + * is the block we should read and used to configure the device. + * If all the available OTP blocks are full, the last block will be the block + * we should read and used to configure the device. + * only perform this operation if shadow RAM is disabled + */ +static int iwl_find_otp_image(struct iwl_priv *priv, + u16 *validblockaddr) +{ + u16 next_link_addr = 0, link_value = 0, valid_addr; + int usedblocks = 0; + + /* set addressing mode to absolute to traverse the link list */ + iwl_set_otp_access(priv, IWL_OTP_ACCESS_ABSOLUTE); + + /* checking for empty OTP or error */ + if (iwl_is_otp_empty(priv)) + return -EINVAL; + + /* + * start traverse link list + * until reach the max number of OTP blocks + * different devices have different number of OTP blocks + */ + do { + /* save current valid block address + * check for more block on the link list + */ + valid_addr = next_link_addr; + next_link_addr = link_value * sizeof(u16); + IWL_DEBUG_INFO(priv, "OTP blocks %d addr 0x%x\n", + usedblocks, next_link_addr); + if (iwl_read_otp_word(priv, next_link_addr, &link_value)) + return -EINVAL; + if (!link_value) { + /* + * reach the end of link list, return success and + * set address point to the starting address + * of the image + */ + *validblockaddr = valid_addr; + /* skip first 2 bytes (link list pointer) */ + *validblockaddr += 2; + return 0; + } + /* more in the link list, continue */ + usedblocks++; + } while (usedblocks <= priv->cfg->max_ll_items); + + /* OTP has no valid blocks */ + IWL_DEBUG_INFO(priv, "OTP has no valid blocks\n"); + return -EINVAL; +} + /** * iwl_eeprom_init - read EEPROM contents * @@ -263,14 +393,13 @@ int iwl_eeprom_init(struct iwl_priv *priv) int sz; int ret; u16 addr; - u32 otpgp; + u16 validblockaddr = 0; + u16 cache_addr = 0; priv->nvm_device_type = iwlcore_get_nvm_type(priv); /* allocate eeprom */ - if (priv->nvm_device_type == NVM_DEVICE_TYPE_OTP) - priv->cfg->eeprom_size = - OTP_BLOCK_SIZE * OTP_LOWER_BLOCKS_TOTAL; + IWL_DEBUG_INFO(priv, "NVM size = %d\n", priv->cfg->eeprom_size); sz = priv->cfg->eeprom_size; priv->eeprom = kzalloc(sz, GFP_KERNEL); if (!priv->eeprom) { @@ -298,46 +427,31 @@ int iwl_eeprom_init(struct iwl_priv *priv) if (ret) { IWL_ERR(priv, "Failed to initialize OTP access.\n"); ret = -ENOENT; - goto err; + goto done; } _iwl_write32(priv, CSR_EEPROM_GP, iwl_read32(priv, CSR_EEPROM_GP) & ~CSR_EEPROM_GP_IF_OWNER_MSK); - /* clear */ - _iwl_write32(priv, CSR_OTP_GP_REG, - iwl_read32(priv, CSR_OTP_GP_REG) | + + iwl_set_bit(priv, CSR_OTP_GP_REG, CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK | CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK); - - for (addr = 0; addr < sz; addr += sizeof(u16)) { - u32 r; - - _iwl_write32(priv, CSR_EEPROM_REG, - CSR_EEPROM_REG_MSK_ADDR & (addr << 1)); - - ret = iwl_poll_direct_bit(priv, CSR_EEPROM_REG, - CSR_EEPROM_REG_READ_VALID_MSK, - IWL_EEPROM_ACCESS_TIMEOUT); - if (ret < 0) { - IWL_ERR(priv, "Time out reading OTP[%d]\n", addr); + /* traversing the linked list if no shadow ram supported */ + if (!priv->cfg->shadow_ram_support) { + if (iwl_find_otp_image(priv, &validblockaddr)) { + ret = -ENOENT; goto done; } - r = _iwl_read_direct32(priv, CSR_EEPROM_REG); - /* check for ECC errors: */ - otpgp = iwl_read32(priv, CSR_OTP_GP_REG); - if (otpgp & CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK) { - /* stop in this case */ - IWL_ERR(priv, "Uncorrectable OTP ECC error, Abort OTP read\n"); + } + for (addr = validblockaddr; addr < validblockaddr + sz; + addr += sizeof(u16)) { + u16 eeprom_data; + + ret = iwl_read_otp_word(priv, addr, &eeprom_data); + if (ret) goto done; - } - if (otpgp & CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK) { - /* continue in this case */ - _iwl_write32(priv, CSR_OTP_GP_REG, - iwl_read32(priv, CSR_OTP_GP_REG) | - CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK); - IWL_ERR(priv, "Correctable OTP ECC error, continue read\n"); - } - e[addr / 2] = le16_to_cpu((__force __le16)(r >> 16)); + e[cache_addr / 2] = eeprom_data; + cache_addr += sizeof(u16); } } else { /* eeprom is an array of 16bit values */ diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.h b/drivers/net/wireless/iwlwifi/iwl-eeprom.h index 195b4ef12c27..78998854dd99 100644 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.h +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.h @@ -180,8 +180,14 @@ struct iwl_eeprom_channel { #define EEPROM_5050_EEPROM_VERSION (0x21E) /* OTP */ -#define OTP_LOWER_BLOCKS_TOTAL (3) -#define OTP_BLOCK_SIZE (0x400) +/* lower blocks contain EEPROM image and calibration data */ +#define OTP_LOW_IMAGE_SIZE (2 * 512 * sizeof(u16)) /* 2 KB */ +/* high blocks contain PAPD data */ +#define OTP_HIGH_IMAGE_SIZE_6x00 (6 * 512 * sizeof(u16)) /* 6 KB */ +#define OTP_HIGH_IMAGE_SIZE_1000 (0x200 * sizeof(u16)) /* 1024 bytes */ +#define OTP_MAX_LL_ITEMS_1000 (3) /* OTP blocks for 1000 */ +#define OTP_MAX_LL_ITEMS_6x00 (4) /* OTP blocks for 6x00 */ +#define OTP_MAX_LL_ITEMS_6x50 (7) /* OTP blocks for 6x50 */ /* 2.4 GHz */ extern const u8 iwl_eeprom_band_1[14]; diff --git a/drivers/net/wireless/iwlwifi/iwl-prph.h b/drivers/net/wireless/iwlwifi/iwl-prph.h index 3b9cac3fd216..d393e8f02102 100644 --- a/drivers/net/wireless/iwlwifi/iwl-prph.h +++ b/drivers/net/wireless/iwlwifi/iwl-prph.h @@ -80,6 +80,8 @@ #define APMG_RFKILL_REG (APMG_BASE + 0x0014) #define APMG_RTC_INT_STT_REG (APMG_BASE + 0x001c) #define APMG_RTC_INT_MSK_REG (APMG_BASE + 0x0020) +#define APMG_DIGITAL_SVR_REG (APMG_BASE + 0x0058) +#define APMG_ANALOG_SVR_REG (APMG_BASE + 0x006C) #define APMG_CLK_VAL_DMA_CLK_RQT (0x00000200) #define APMG_CLK_VAL_BSM_CLK_RQT (0x00000800) @@ -91,7 +93,8 @@ #define APMG_PS_CTRL_VAL_PWR_SRC_VMAIN (0x00000000) #define APMG_PS_CTRL_VAL_PWR_SRC_MAX (0x01000000) /* 3945 only */ #define APMG_PS_CTRL_VAL_PWR_SRC_VAUX (0x02000000) - +#define APMG_SVR_VOLTAGE_CONFIG_BIT_MSK (0x000001E0) /* bit 8:5 */ +#define APMG_SVR_DIGITAL_VOLTAGE_1_32 (0x00000060) #define APMG_PCIDEV_STT_VAL_L1_ACT_DIS (0x00000800) diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c index 2b8d40b37a1c..a13f678fe44c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rx.c +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c @@ -239,33 +239,51 @@ void iwl_rx_allocate(struct iwl_priv *priv, gfp_t priority) struct iwl_rx_queue *rxq = &priv->rxq; struct list_head *element; struct iwl_rx_mem_buffer *rxb; + struct sk_buff *skb; unsigned long flags; while (1) { spin_lock_irqsave(&rxq->lock, flags); - if (list_empty(&rxq->rx_used)) { spin_unlock_irqrestore(&rxq->lock, flags); return; } - element = rxq->rx_used.next; - rxb = list_entry(element, struct iwl_rx_mem_buffer, list); - list_del(element); - spin_unlock_irqrestore(&rxq->lock, flags); + if (rxq->free_count > RX_LOW_WATERMARK) + priority |= __GFP_NOWARN; /* Alloc a new receive buffer */ - rxb->skb = alloc_skb(priv->hw_params.rx_buf_size + 256, + skb = alloc_skb(priv->hw_params.rx_buf_size + 256, priority); - if (!rxb->skb) { - IWL_CRIT(priv, "Can not allocate SKB buffers\n"); + if (!skb) { + if (net_ratelimit()) + IWL_DEBUG_INFO(priv, "Failed to allocate SKB buffer.\n"); + if ((rxq->free_count <= RX_LOW_WATERMARK) && + net_ratelimit()) + IWL_CRIT(priv, "Failed to allocate SKB buffer with %s. Only %u free buffers remaining.\n", + priority == GFP_ATOMIC ? "GFP_ATOMIC" : "GFP_KERNEL", + rxq->free_count); /* We don't reschedule replenish work here -- we will * call the restock method and if it still needs * more buffers it will schedule replenish */ break; } + spin_lock_irqsave(&rxq->lock, flags); + + if (list_empty(&rxq->rx_used)) { + spin_unlock_irqrestore(&rxq->lock, flags); + dev_kfree_skb_any(skb); + return; + } + element = rxq->rx_used.next; + rxb = list_entry(element, struct iwl_rx_mem_buffer, list); + list_del(element); + + spin_unlock_irqrestore(&rxq->lock, flags); + + rxb->skb = skb; /* Get physical address of RB/SKB */ rxb->real_dma_addr = pci_map_single( priv->pci_dev, diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index e26875dbe859..474fd4982471 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c @@ -799,7 +799,8 @@ void iwl_bg_abort_scan(struct work_struct *work) { struct iwl_priv *priv = container_of(work, struct iwl_priv, abort_scan); - if (!iwl_is_ready(priv)) + if (!test_bit(STATUS_READY, &priv->status) || + !test_bit(STATUS_GEO_CONFIGURED, &priv->status)) return; mutex_lock(&priv->mutex); diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c index 2e89040e63be..c17b8f93ad15 100644 --- a/drivers/net/wireless/iwlwifi/iwl-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c @@ -1233,8 +1233,16 @@ int iwl_tx_agg_stop(struct iwl_priv *priv , const u8 *ra, u16 tid) return -ENXIO; } + if (priv->stations[sta_id].tid[tid].agg.state == + IWL_EMPTYING_HW_QUEUE_ADDBA) { + IWL_DEBUG_HT(priv, "AGG stop before setup done\n"); + ieee80211_stop_tx_ba_cb_irqsafe(priv->hw, ra, tid); + priv->stations[sta_id].tid[tid].agg.state = IWL_AGG_OFF; + return 0; + } + if (priv->stations[sta_id].tid[tid].agg.state != IWL_AGG_ON) - IWL_WARN(priv, "Stopping AGG while state not IWL_AGG_ON\n"); + IWL_WARN(priv, "Stopping AGG while state not ON or starting\n"); tid_data = &priv->stations[sta_id].tid[tid]; ssn = (tid_data->seq_number & IEEE80211_SCTL_SEQ) >> 4; diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 523843369ca2..4fac58260001 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c @@ -1196,6 +1196,7 @@ static void iwl3945_rx_allocate(struct iwl_priv *priv, gfp_t priority) struct iwl_rx_queue *rxq = &priv->rxq; struct list_head *element; struct iwl_rx_mem_buffer *rxb; + struct sk_buff *skb; unsigned long flags; while (1) { @@ -1205,25 +1206,39 @@ static void iwl3945_rx_allocate(struct iwl_priv *priv, gfp_t priority) spin_unlock_irqrestore(&rxq->lock, flags); return; } - - element = rxq->rx_used.next; - rxb = list_entry(element, struct iwl_rx_mem_buffer, list); - list_del(element); spin_unlock_irqrestore(&rxq->lock, flags); + if (rxq->free_count > RX_LOW_WATERMARK) + priority |= __GFP_NOWARN; /* Alloc a new receive buffer */ - rxb->skb = - alloc_skb(priv->hw_params.rx_buf_size, - priority); - if (!rxb->skb) { + skb = alloc_skb(priv->hw_params.rx_buf_size, priority); + if (!skb) { if (net_ratelimit()) - IWL_CRIT(priv, ": Can not allocate SKB buffers\n"); + IWL_DEBUG_INFO(priv, "Failed to allocate SKB buffer.\n"); + if ((rxq->free_count <= RX_LOW_WATERMARK) && + net_ratelimit()) + IWL_CRIT(priv, "Failed to allocate SKB buffer with %s. Only %u free buffers remaining.\n", + priority == GFP_ATOMIC ? "GFP_ATOMIC" : "GFP_KERNEL", + rxq->free_count); /* We don't reschedule replenish work here -- we will * call the restock method and if it still needs * more buffers it will schedule replenish */ break; } + spin_lock_irqsave(&rxq->lock, flags); + if (list_empty(&rxq->rx_used)) { + spin_unlock_irqrestore(&rxq->lock, flags); + dev_kfree_skb_any(skb); + return; + } + element = rxq->rx_used.next; + rxb = list_entry(element, struct iwl_rx_mem_buffer, list); + list_del(element); + spin_unlock_irqrestore(&rxq->lock, flags); + + rxb->skb = skb; + /* If radiotap head is required, reserve some headroom here. * The physical head count is a variable rx_stats->phy_count. * We reserve 4 bytes here. Plus these extra bytes, the @@ -2111,7 +2126,7 @@ static void iwl3945_nic_start(struct iwl_priv *priv) */ static int iwl3945_read_ucode(struct iwl_priv *priv) { - struct iwl_ucode *ucode; + const struct iwl_ucode_header *ucode; int ret = -EINVAL, index; const struct firmware *ucode_raw; /* firmware file name contains uCode/driver compatibility version */ @@ -2152,22 +2167,24 @@ static int iwl3945_read_ucode(struct iwl_priv *priv) goto error; /* Make sure that we got at least our header! */ - if (ucode_raw->size < sizeof(*ucode)) { + if (ucode_raw->size < priv->cfg->ops->ucode->get_header_size(1)) { IWL_ERR(priv, "File size way too small!\n"); ret = -EINVAL; goto err_release; } /* Data from ucode file: header followed by uCode images */ - ucode = (void *)ucode_raw->data; + ucode = (struct iwl_ucode_header *)ucode_raw->data; priv->ucode_ver = le32_to_cpu(ucode->ver); api_ver = IWL_UCODE_API(priv->ucode_ver); - inst_size = le32_to_cpu(ucode->inst_size); - data_size = le32_to_cpu(ucode->data_size); - init_size = le32_to_cpu(ucode->init_size); - init_data_size = le32_to_cpu(ucode->init_data_size); - boot_size = le32_to_cpu(ucode->boot_size); + inst_size = priv->cfg->ops->ucode->get_inst_size(ucode, api_ver); + data_size = priv->cfg->ops->ucode->get_data_size(ucode, api_ver); + init_size = priv->cfg->ops->ucode->get_init_size(ucode, api_ver); + init_data_size = + priv->cfg->ops->ucode->get_init_data_size(ucode, api_ver); + boot_size = priv->cfg->ops->ucode->get_boot_size(ucode, api_ver); + src = priv->cfg->ops->ucode->get_data(ucode, api_ver); /* api_ver should match the api version forming part of the * firmware filename ... but we don't check for that and only rely @@ -2208,12 +2225,13 @@ static int iwl3945_read_ucode(struct iwl_priv *priv) /* Verify size of file vs. image size info in file's header */ - if (ucode_raw->size < sizeof(*ucode) + + if (ucode_raw->size != priv->cfg->ops->ucode->get_header_size(api_ver) + inst_size + data_size + init_size + init_data_size + boot_size) { - IWL_DEBUG_INFO(priv, "uCode file size %zd too small\n", - ucode_raw->size); + IWL_DEBUG_INFO(priv, + "uCode file size %zd does not match expected size\n", + ucode_raw->size); ret = -EINVAL; goto err_release; } @@ -2296,44 +2314,44 @@ static int iwl3945_read_ucode(struct iwl_priv *priv) /* Copy images into buffers for card's bus-master reads ... */ /* Runtime instructions (first block of data in file) */ - src = &ucode->data[0]; - len = priv->ucode_code.len; + len = inst_size; IWL_DEBUG_INFO(priv, "Copying (but not loading) uCode instr len %zd\n", len); memcpy(priv->ucode_code.v_addr, src, len); + src += len; + IWL_DEBUG_INFO(priv, "uCode instr buf vaddr = 0x%p, paddr = 0x%08x\n", priv->ucode_code.v_addr, (u32)priv->ucode_code.p_addr); /* Runtime data (2nd block) * NOTE: Copy into backup buffer will be done in iwl3945_up() */ - src = &ucode->data[inst_size]; - len = priv->ucode_data.len; + len = data_size; IWL_DEBUG_INFO(priv, "Copying (but not loading) uCode data len %zd\n", len); memcpy(priv->ucode_data.v_addr, src, len); memcpy(priv->ucode_data_backup.v_addr, src, len); + src += len; /* Initialization instructions (3rd block) */ if (init_size) { - src = &ucode->data[inst_size + data_size]; - len = priv->ucode_init.len; + len = init_size; IWL_DEBUG_INFO(priv, "Copying (but not loading) init instr len %zd\n", len); memcpy(priv->ucode_init.v_addr, src, len); + src += len; } /* Initialization data (4th block) */ if (init_data_size) { - src = &ucode->data[inst_size + data_size + init_size]; - len = priv->ucode_init_data.len; + len = init_data_size; IWL_DEBUG_INFO(priv, "Copying (but not loading) init data len %zd\n", len); memcpy(priv->ucode_init_data.v_addr, src, len); + src += len; } /* Bootstrap instructions (5th block) */ - src = &ucode->data[inst_size + data_size + init_size + init_data_size]; - len = priv->ucode_boot.len; + len = boot_size; IWL_DEBUG_INFO(priv, "Copying (but not loading) boot instr len %zd\n", len); memcpy(priv->ucode_boot.v_addr, src, len); diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c index 1844c5adf6e9..3a9a8c13b8a9 100644 --- a/drivers/net/wireless/libertas/if_usb.c +++ b/drivers/net/wireless/libertas/if_usb.c @@ -507,7 +507,7 @@ static int __if_usb_submit_rx_urb(struct if_usb_card *cardp, /* Fill the receive configuration URB and initialise the Rx call back */ usb_fill_bulk_urb(cardp->rx_urb, cardp->udev, usb_rcvbulkpipe(cardp->udev, cardp->ep_in), - (void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET), + skb->data + IPFIELD_ALIGN_OFFSET, MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, cardp); diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c index 8bc1907458b1..f9c366c6ce4c 100644 --- a/drivers/net/wireless/libertas/wext.c +++ b/drivers/net/wireless/libertas/wext.c @@ -1951,10 +1951,8 @@ static int lbs_get_essid(struct net_device *dev, struct iw_request_info *info, if (priv->connect_status == LBS_CONNECTED) { memcpy(extra, priv->curbssparams.ssid, priv->curbssparams.ssid_len); - extra[priv->curbssparams.ssid_len] = '\0'; } else { memset(extra, 0, 32); - extra[priv->curbssparams.ssid_len] = '\0'; } /* * If none, we may want to get the one that was set diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c index 0e877a104a89..b17ec7f24b82 100644 --- a/drivers/net/wireless/p54/p54usb.c +++ b/drivers/net/wireless/p54/p54usb.c @@ -66,6 +66,7 @@ static struct usb_device_id p54u_table[] __devinitdata = { {USB_DEVICE(0x0bf8, 0x1009)}, /* FUJITSU E-5400 USB D1700*/ {USB_DEVICE(0x0cde, 0x0006)}, /* Medion MD40900 */ {USB_DEVICE(0x0cde, 0x0008)}, /* Sagem XG703A */ + {USB_DEVICE(0x0cde, 0x0015)}, /* Zcomax XG-705A */ {USB_DEVICE(0x0d8e, 0x3762)}, /* DLink DWL-G120 Cohiba */ {USB_DEVICE(0x124a, 0x4025)}, /* IOGear GWU513 (GW3887IK chip) */ {USB_DEVICE(0x1260, 0xee22)}, /* SMC 2862W-G version 2 */ @@ -426,12 +427,16 @@ static const char p54u_romboot_3887[] = "~~~~"; static int p54u_firmware_reset_3887(struct ieee80211_hw *dev) { struct p54u_priv *priv = dev->priv; - u8 buf[4]; + u8 *buf; int ret; - memcpy(&buf, p54u_romboot_3887, sizeof(buf)); + buf = kmalloc(4, GFP_KERNEL); + if (!buf) + return -ENOMEM; + memcpy(buf, p54u_romboot_3887, 4); ret = p54u_bulk_msg(priv, P54U_PIPE_DATA, - buf, sizeof(buf)); + buf, 4); + kfree(buf); if (ret) dev_err(&priv->udev->dev, "(p54usb) unable to jump to " "boot ROM (%d)!\n", ret); diff --git a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c index 698b11b1cadb..8c67a488f83b 100644 --- a/drivers/net/wireless/ray_cs.c +++ b/drivers/net/wireless/ray_cs.c @@ -2878,7 +2878,7 @@ static int write_essid(struct file *file, const char __user *buffer, unsigned long count, void *data) { static char proc_essid[33]; - int len = count; + unsigned int len = count; if (len > 32) len = 32; diff --git a/drivers/net/wireless/rtl818x/rtl8187_leds.c b/drivers/net/wireless/rtl818x/rtl8187_leds.c index cf9f899fe0e6..75648dd17595 100644 --- a/drivers/net/wireless/rtl818x/rtl8187_leds.c +++ b/drivers/net/wireless/rtl818x/rtl8187_leds.c @@ -210,10 +210,10 @@ void rtl8187_leds_exit(struct ieee80211_hw *dev) /* turn the LED off before exiting */ queue_delayed_work(dev->workqueue, &priv->led_off, 0); - cancel_delayed_work_sync(&priv->led_off); - cancel_delayed_work_sync(&priv->led_on); rtl8187_unregister_led(&priv->led_rx); rtl8187_unregister_led(&priv->led_tx); + cancel_delayed_work_sync(&priv->led_off); + cancel_delayed_work_sync(&priv->led_on); } #endif /* def CONFIG_RTL8187_LED */ diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c index a45b0c0d574e..a6b4a5a53d40 100644 --- a/drivers/parisc/ccio-dma.c +++ b/drivers/parisc/ccio-dma.c @@ -1266,7 +1266,7 @@ ccio_ioc_init(struct ioc *ioc) ** Hot-Plug/Removal of PCI cards. (aka PCI OLARD). */ - iova_space_size = (u32) (num_physpages / count_parisc_driver(&ccio_driver)); + iova_space_size = (u32) (totalram_pages / count_parisc_driver(&ccio_driver)); /* limit IOVA space size to 1MB-1GB */ @@ -1305,7 +1305,7 @@ ccio_ioc_init(struct ioc *ioc) DBG_INIT("%s() hpa 0x%p mem %luMB IOV %dMB (%d bits)\n", __func__, ioc->ioc_regs, - (unsigned long) num_physpages >> (20 - PAGE_SHIFT), + (unsigned long) totalram_pages >> (20 - PAGE_SHIFT), iova_space_size>>20, iov_order + PAGE_SHIFT); diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c index 123d8fe3427d..57a6d19eba4c 100644 --- a/drivers/parisc/sba_iommu.c +++ b/drivers/parisc/sba_iommu.c @@ -1390,7 +1390,7 @@ sba_ioc_init(struct parisc_device *sba, struct ioc *ioc, int ioc_num) ** for DMA hints - ergo only 30 bits max. */ - iova_space_size = (u32) (num_physpages/global_ioc_cnt); + iova_space_size = (u32) (totalram_pages/global_ioc_cnt); /* limit IOVA space size to 1MB-1GB */ if (iova_space_size < (1 << (20 - PAGE_SHIFT))) { @@ -1415,7 +1415,7 @@ sba_ioc_init(struct parisc_device *sba, struct ioc *ioc, int ioc_num) DBG_INIT("%s() hpa 0x%lx mem %ldMB IOV %dMB (%d bits)\n", __func__, ioc->ioc_hpa, - (unsigned long) num_physpages >> (20 - PAGE_SHIFT), + (unsigned long) totalram_pages >> (20 - PAGE_SHIFT), iova_space_size>>20, iov_order + PAGE_SHIFT); diff --git a/drivers/pci/dmar.c b/drivers/pci/dmar.c index 7b287cb38b7a..380b60e677e0 100644 --- a/drivers/pci/dmar.c +++ b/drivers/pci/dmar.c @@ -632,20 +632,31 @@ int alloc_iommu(struct dmar_drhd_unit *drhd) iommu->cap = dmar_readq(iommu->reg + DMAR_CAP_REG); iommu->ecap = dmar_readq(iommu->reg + DMAR_ECAP_REG); + if (iommu->cap == (uint64_t)-1 && iommu->ecap == (uint64_t)-1) { + /* Promote an attitude of violence to a BIOS engineer today */ + WARN(1, "Your BIOS is broken; DMAR reported at address %llx returns all ones!\n" + "BIOS vendor: %s; Ver: %s; Product Version: %s\n", + drhd->reg_base_addr, + dmi_get_system_info(DMI_BIOS_VENDOR), + dmi_get_system_info(DMI_BIOS_VERSION), + dmi_get_system_info(DMI_PRODUCT_VERSION)); + goto err_unmap; + } + #ifdef CONFIG_DMAR agaw = iommu_calculate_agaw(iommu); if (agaw < 0) { printk(KERN_ERR "Cannot get a valid agaw for iommu (seq_id = %d)\n", iommu->seq_id); - goto error; + goto err_unmap; } msagaw = iommu_calculate_max_sagaw(iommu); if (msagaw < 0) { printk(KERN_ERR "Cannot get a valid max agaw for iommu (seq_id = %d)\n", iommu->seq_id); - goto error; + goto err_unmap; } #endif iommu->agaw = agaw; @@ -665,7 +676,7 @@ int alloc_iommu(struct dmar_drhd_unit *drhd) } ver = readl(iommu->reg + DMAR_VER_REG); - pr_debug("IOMMU %llx: ver %d:%d cap %llx ecap %llx\n", + pr_info("IOMMU %llx: ver %d:%d cap %llx ecap %llx\n", (unsigned long long)drhd->reg_base_addr, DMAR_VER_MAJOR(ver), DMAR_VER_MINOR(ver), (unsigned long long)iommu->cap, @@ -675,7 +686,10 @@ int alloc_iommu(struct dmar_drhd_unit *drhd) drhd->iommu = iommu; return 0; -error: + + err_unmap: + iounmap(iommu->reg); + error: kfree(iommu); return -1; } diff --git a/drivers/pci/pcie/aer/aerdrv.c b/drivers/pci/pcie/aer/aerdrv.c index 4770f13b3ca1..e2504be1fa8d 100644 --- a/drivers/pci/pcie/aer/aerdrv.c +++ b/drivers/pci/pcie/aer/aerdrv.c @@ -52,7 +52,7 @@ static struct pci_error_handlers aer_error_handlers = { static struct pcie_port_service_driver aerdriver = { .name = "aer", - .port_type = PCIE_ANY_PORT, + .port_type = PCIE_RC_PORT, .service = PCIE_PORT_SERVICE_AER, .probe = aer_probe, diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 06b965623962..10731373d00e 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -1201,6 +1201,7 @@ static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev) switch(dev->subsystem_device) { case 0x00b8: /* Compaq Evo D510 CMT */ case 0x00b9: /* Compaq Evo D510 SFF */ + case 0x00ba: /* Compaq Evo D510 USDT */ /* Motherboard doesn't have Host bridge * subvendor/subdevice IDs and on-board VGA * controller is disabled if an AGP card is @@ -2382,8 +2383,10 @@ static void __devinit nv_msi_ht_cap_quirk_leaf(struct pci_dev *dev) } DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, nv_msi_ht_cap_quirk_leaf); +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, nv_msi_ht_cap_quirk_leaf); DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, PCI_ANY_ID, nv_msi_ht_cap_quirk_all); +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_AL, PCI_ANY_ID, nv_msi_ht_cap_quirk_all); static void __devinit quirk_msi_intx_disable_bug(struct pci_dev *dev) { @@ -2492,6 +2495,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x10e6, quirk_i82576_sriov); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x10e7, quirk_i82576_sriov); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x10e8, quirk_i82576_sriov); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x150a, quirk_i82576_sriov); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x150d, quirk_i82576_sriov); #endif /* CONFIG_PCI_IOV */ diff --git a/drivers/pcmcia/at91_cf.c b/drivers/pcmcia/at91_cf.c index 9e1140f085fd..e1dccedc5960 100644 --- a/drivers/pcmcia/at91_cf.c +++ b/drivers/pcmcia/at91_cf.c @@ -363,7 +363,7 @@ static int at91_cf_suspend(struct platform_device *pdev, pm_message_t mesg) struct at91_cf_socket *cf = platform_get_drvdata(pdev); struct at91_cf_data *board = cf->board; - pcmcia_socket_dev_suspend(&pdev->dev, mesg); + pcmcia_socket_dev_suspend(&pdev->dev); if (device_may_wakeup(&pdev->dev)) { enable_irq_wake(board->det_pin); if (board->irq_pin) diff --git a/drivers/pcmcia/au1000_generic.c b/drivers/pcmcia/au1000_generic.c index 90013341cd5f..02088704ac2c 100644 --- a/drivers/pcmcia/au1000_generic.c +++ b/drivers/pcmcia/au1000_generic.c @@ -515,7 +515,7 @@ static int au1x00_drv_pcmcia_probe(struct platform_device *dev) static int au1x00_drv_pcmcia_suspend(struct platform_device *dev, pm_message_t state) { - return pcmcia_socket_dev_suspend(&dev->dev, state); + return pcmcia_socket_dev_suspend(&dev->dev); } static int au1x00_drv_pcmcia_resume(struct platform_device *dev) diff --git a/drivers/pcmcia/bfin_cf_pcmcia.c b/drivers/pcmcia/bfin_cf_pcmcia.c index b59d4115d20f..300b368605c9 100644 --- a/drivers/pcmcia/bfin_cf_pcmcia.c +++ b/drivers/pcmcia/bfin_cf_pcmcia.c @@ -302,7 +302,7 @@ static int __devexit bfin_cf_remove(struct platform_device *pdev) static int bfin_cf_suspend(struct platform_device *pdev, pm_message_t mesg) { - return pcmcia_socket_dev_suspend(&pdev->dev, mesg); + return pcmcia_socket_dev_suspend(&pdev->dev); } static int bfin_cf_resume(struct platform_device *pdev) diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index 0660ad182589..698d75cda084 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c @@ -98,10 +98,13 @@ EXPORT_SYMBOL(pcmcia_socket_list_rwsem); * These functions check for the appropriate struct pcmcia_soket arrays, * and pass them to the low-level functions pcmcia_{suspend,resume}_socket */ +static int socket_early_resume(struct pcmcia_socket *skt); +static int socket_late_resume(struct pcmcia_socket *skt); static int socket_resume(struct pcmcia_socket *skt); static int socket_suspend(struct pcmcia_socket *skt); -int pcmcia_socket_dev_suspend(struct device *dev, pm_message_t state) +static void pcmcia_socket_dev_run(struct device *dev, + int (*cb)(struct pcmcia_socket *)) { struct pcmcia_socket *socket; @@ -110,29 +113,34 @@ int pcmcia_socket_dev_suspend(struct device *dev, pm_message_t state) if (socket->dev.parent != dev) continue; mutex_lock(&socket->skt_mutex); - socket_suspend(socket); + cb(socket); mutex_unlock(&socket->skt_mutex); } up_read(&pcmcia_socket_list_rwsem); +} +int pcmcia_socket_dev_suspend(struct device *dev) +{ + pcmcia_socket_dev_run(dev, socket_suspend); return 0; } EXPORT_SYMBOL(pcmcia_socket_dev_suspend); -int pcmcia_socket_dev_resume(struct device *dev) +void pcmcia_socket_dev_early_resume(struct device *dev) { - struct pcmcia_socket *socket; + pcmcia_socket_dev_run(dev, socket_early_resume); +} +EXPORT_SYMBOL(pcmcia_socket_dev_early_resume); - down_read(&pcmcia_socket_list_rwsem); - list_for_each_entry(socket, &pcmcia_socket_list, socket_list) { - if (socket->dev.parent != dev) - continue; - mutex_lock(&socket->skt_mutex); - socket_resume(socket); - mutex_unlock(&socket->skt_mutex); - } - up_read(&pcmcia_socket_list_rwsem); +void pcmcia_socket_dev_late_resume(struct device *dev) +{ + pcmcia_socket_dev_run(dev, socket_late_resume); +} +EXPORT_SYMBOL(pcmcia_socket_dev_late_resume); +int pcmcia_socket_dev_resume(struct device *dev) +{ + pcmcia_socket_dev_run(dev, socket_resume); return 0; } EXPORT_SYMBOL(pcmcia_socket_dev_resume); @@ -546,29 +554,24 @@ static int socket_suspend(struct pcmcia_socket *skt) return 0; } -/* - * Resume a socket. If a card is present, verify its CIS against - * our cached copy. If they are different, the card has been - * replaced, and we need to tell the drivers. - */ -static int socket_resume(struct pcmcia_socket *skt) +static int socket_early_resume(struct pcmcia_socket *skt) { - int ret; - - if (!(skt->state & SOCKET_SUSPEND)) - return -EBUSY; - skt->socket = dead_socket; skt->ops->init(skt); skt->ops->set_socket(skt, &skt->socket); + if (skt->state & SOCKET_PRESENT) + skt->resume_status = socket_setup(skt, resume_delay); + return 0; +} +static int socket_late_resume(struct pcmcia_socket *skt) +{ if (!(skt->state & SOCKET_PRESENT)) { skt->state &= ~SOCKET_SUSPEND; return socket_insert(skt); } - ret = socket_setup(skt, resume_delay); - if (ret == 0) { + if (skt->resume_status == 0) { /* * FIXME: need a better check here for cardbus cards. */ @@ -596,6 +599,20 @@ static int socket_resume(struct pcmcia_socket *skt) return 0; } +/* + * Resume a socket. If a card is present, verify its CIS against + * our cached copy. If they are different, the card has been + * replaced, and we need to tell the drivers. + */ +static int socket_resume(struct pcmcia_socket *skt) +{ + if (!(skt->state & SOCKET_SUSPEND)) + return -EBUSY; + + socket_early_resume(skt); + return socket_late_resume(skt); +} + static void socket_remove(struct pcmcia_socket *skt) { dev_printk(KERN_NOTICE, &skt->dev, diff --git a/drivers/pcmcia/i82092.c b/drivers/pcmcia/i82092.c index 46561face128..a04f21c8170f 100644 --- a/drivers/pcmcia/i82092.c +++ b/drivers/pcmcia/i82092.c @@ -42,7 +42,7 @@ MODULE_DEVICE_TABLE(pci, i82092aa_pci_ids); #ifdef CONFIG_PM static int i82092aa_socket_suspend (struct pci_dev *dev, pm_message_t state) { - return pcmcia_socket_dev_suspend(&dev->dev, state); + return pcmcia_socket_dev_suspend(&dev->dev); } static int i82092aa_socket_resume (struct pci_dev *dev) diff --git a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c index 40d4953e4b12..b906abe26ad0 100644 --- a/drivers/pcmcia/i82365.c +++ b/drivers/pcmcia/i82365.c @@ -1241,7 +1241,7 @@ static int pcic_init(struct pcmcia_socket *s) static int i82365_drv_pcmcia_suspend(struct platform_device *dev, pm_message_t state) { - return pcmcia_socket_dev_suspend(&dev->dev, state); + return pcmcia_socket_dev_suspend(&dev->dev); } static int i82365_drv_pcmcia_resume(struct platform_device *dev) diff --git a/drivers/pcmcia/m32r_cfc.c b/drivers/pcmcia/m32r_cfc.c index 62b4ecc97c46..d1d89c4491ad 100644 --- a/drivers/pcmcia/m32r_cfc.c +++ b/drivers/pcmcia/m32r_cfc.c @@ -699,7 +699,7 @@ static struct pccard_operations pcc_operations = { static int cfc_drv_pcmcia_suspend(struct platform_device *dev, pm_message_t state) { - return pcmcia_socket_dev_suspend(&dev->dev, state); + return pcmcia_socket_dev_suspend(&dev->dev); } static int cfc_drv_pcmcia_resume(struct platform_device *dev) diff --git a/drivers/pcmcia/m32r_pcc.c b/drivers/pcmcia/m32r_pcc.c index 12034b41d196..a0655839c8d3 100644 --- a/drivers/pcmcia/m32r_pcc.c +++ b/drivers/pcmcia/m32r_pcc.c @@ -675,7 +675,7 @@ static struct pccard_operations pcc_operations = { static int pcc_drv_pcmcia_suspend(struct platform_device *dev, pm_message_t state) { - return pcmcia_socket_dev_suspend(&dev->dev, state); + return pcmcia_socket_dev_suspend(&dev->dev); } static int pcc_drv_pcmcia_resume(struct platform_device *dev) diff --git a/drivers/pcmcia/m8xx_pcmcia.c b/drivers/pcmcia/m8xx_pcmcia.c index d1ad0966392d..c69f2c4fe520 100644 --- a/drivers/pcmcia/m8xx_pcmcia.c +++ b/drivers/pcmcia/m8xx_pcmcia.c @@ -1296,7 +1296,7 @@ static int m8xx_remove(struct of_device *ofdev) #ifdef CONFIG_PM static int m8xx_suspend(struct platform_device *pdev, pm_message_t state) { - return pcmcia_socket_dev_suspend(&pdev->dev, state); + return pcmcia_socket_dev_suspend(&pdev->dev); } static int m8xx_resume(struct platform_device *pdev) diff --git a/drivers/pcmcia/omap_cf.c b/drivers/pcmcia/omap_cf.c index f3736398900e..68570bc3ac86 100644 --- a/drivers/pcmcia/omap_cf.c +++ b/drivers/pcmcia/omap_cf.c @@ -334,7 +334,7 @@ static int __exit omap_cf_remove(struct platform_device *pdev) static int omap_cf_suspend(struct platform_device *pdev, pm_message_t mesg) { - return pcmcia_socket_dev_suspend(&pdev->dev, mesg); + return pcmcia_socket_dev_suspend(&pdev->dev); } static int omap_cf_resume(struct platform_device *pdev) diff --git a/drivers/pcmcia/pd6729.c b/drivers/pcmcia/pd6729.c index 8bed1dab9039..1c39d3438f20 100644 --- a/drivers/pcmcia/pd6729.c +++ b/drivers/pcmcia/pd6729.c @@ -758,7 +758,7 @@ static void __devexit pd6729_pci_remove(struct pci_dev *dev) #ifdef CONFIG_PM static int pd6729_socket_suspend(struct pci_dev *dev, pm_message_t state) { - return pcmcia_socket_dev_suspend(&dev->dev, state); + return pcmcia_socket_dev_suspend(&dev->dev); } static int pd6729_socket_resume(struct pci_dev *dev) diff --git a/drivers/pcmcia/pxa2xx_base.c b/drivers/pcmcia/pxa2xx_base.c index c49a7269f6d1..86ad87604241 100644 --- a/drivers/pcmcia/pxa2xx_base.c +++ b/drivers/pcmcia/pxa2xx_base.c @@ -302,7 +302,7 @@ static int pxa2xx_drv_pcmcia_remove(struct platform_device *dev) static int pxa2xx_drv_pcmcia_suspend(struct platform_device *dev, pm_message_t state) { - return pcmcia_socket_dev_suspend(&dev->dev, state); + return pcmcia_socket_dev_suspend(&dev->dev); } static int pxa2xx_drv_pcmcia_resume(struct platform_device *dev) diff --git a/drivers/pcmcia/sa1100_generic.c b/drivers/pcmcia/sa1100_generic.c index d8da5ac844e9..2d0e99751530 100644 --- a/drivers/pcmcia/sa1100_generic.c +++ b/drivers/pcmcia/sa1100_generic.c @@ -89,7 +89,7 @@ static int sa11x0_drv_pcmcia_remove(struct platform_device *dev) static int sa11x0_drv_pcmcia_suspend(struct platform_device *dev, pm_message_t state) { - return pcmcia_socket_dev_suspend(&dev->dev, state); + return pcmcia_socket_dev_suspend(&dev->dev); } static int sa11x0_drv_pcmcia_resume(struct platform_device *dev) diff --git a/drivers/pcmcia/sa1111_generic.c b/drivers/pcmcia/sa1111_generic.c index 401052a21ce8..4be4e172ffa1 100644 --- a/drivers/pcmcia/sa1111_generic.c +++ b/drivers/pcmcia/sa1111_generic.c @@ -159,7 +159,7 @@ static int __devexit pcmcia_remove(struct sa1111_dev *dev) static int pcmcia_suspend(struct sa1111_dev *dev, pm_message_t state) { - return pcmcia_socket_dev_suspend(&dev->dev, state); + return pcmcia_socket_dev_suspend(&dev->dev); } static int pcmcia_resume(struct sa1111_dev *dev) diff --git a/drivers/pcmcia/tcic.c b/drivers/pcmcia/tcic.c index 8eb04230fec7..582413fcb62f 100644 --- a/drivers/pcmcia/tcic.c +++ b/drivers/pcmcia/tcic.c @@ -366,7 +366,7 @@ static int __init get_tcic_id(void) static int tcic_drv_pcmcia_suspend(struct platform_device *dev, pm_message_t state) { - return pcmcia_socket_dev_suspend(&dev->dev, state); + return pcmcia_socket_dev_suspend(&dev->dev); } static int tcic_drv_pcmcia_resume(struct platform_device *dev) diff --git a/drivers/pcmcia/vrc4171_card.c b/drivers/pcmcia/vrc4171_card.c index d4ad50d737b0..c9fcbdc164ea 100644 --- a/drivers/pcmcia/vrc4171_card.c +++ b/drivers/pcmcia/vrc4171_card.c @@ -707,7 +707,7 @@ __setup("vrc4171_card=", vrc4171_card_setup); static int vrc4171_card_suspend(struct platform_device *dev, pm_message_t state) { - return pcmcia_socket_dev_suspend(&dev->dev, state); + return pcmcia_socket_dev_suspend(&dev->dev); } static int vrc4171_card_resume(struct platform_device *dev) diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c index 3ecd7c99d8eb..bcebffb54b25 100644 --- a/drivers/pcmcia/yenta_socket.c +++ b/drivers/pcmcia/yenta_socket.c @@ -1225,60 +1225,81 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i } #ifdef CONFIG_PM -static int yenta_dev_suspend (struct pci_dev *dev, pm_message_t state) +static int yenta_dev_suspend_noirq(struct device *dev) { - struct yenta_socket *socket = pci_get_drvdata(dev); + struct pci_dev *pdev = to_pci_dev(dev); + struct yenta_socket *socket = pci_get_drvdata(pdev); int ret; - ret = pcmcia_socket_dev_suspend(&dev->dev, state); + ret = pcmcia_socket_dev_suspend(dev); - if (socket) { - if (socket->type && socket->type->save_state) - socket->type->save_state(socket); + if (!socket) + return ret; - /* FIXME: pci_save_state needs to have a better interface */ - pci_save_state(dev); - pci_read_config_dword(dev, 16*4, &socket->saved_state[0]); - pci_read_config_dword(dev, 17*4, &socket->saved_state[1]); - pci_disable_device(dev); + if (socket->type && socket->type->save_state) + socket->type->save_state(socket); - /* - * Some laptops (IBM T22) do not like us putting the Cardbus - * bridge into D3. At a guess, some other laptop will - * probably require this, so leave it commented out for now. - */ - /* pci_set_power_state(dev, 3); */ - } + pci_save_state(pdev); + pci_read_config_dword(pdev, 16*4, &socket->saved_state[0]); + pci_read_config_dword(pdev, 17*4, &socket->saved_state[1]); + pci_disable_device(pdev); + + /* + * Some laptops (IBM T22) do not like us putting the Cardbus + * bridge into D3. At a guess, some other laptop will + * probably require this, so leave it commented out for now. + */ + /* pci_set_power_state(dev, 3); */ return ret; } - -static int yenta_dev_resume (struct pci_dev *dev) +static int yenta_dev_resume_noirq(struct device *dev) { - struct yenta_socket *socket = pci_get_drvdata(dev); + struct pci_dev *pdev = to_pci_dev(dev); + struct yenta_socket *socket = pci_get_drvdata(pdev); + int ret; - if (socket) { - int rc; + if (!socket) + return 0; - pci_set_power_state(dev, 0); - /* FIXME: pci_restore_state needs to have a better interface */ - pci_restore_state(dev); - pci_write_config_dword(dev, 16*4, socket->saved_state[0]); - pci_write_config_dword(dev, 17*4, socket->saved_state[1]); + pci_write_config_dword(pdev, 16*4, socket->saved_state[0]); + pci_write_config_dword(pdev, 17*4, socket->saved_state[1]); - rc = pci_enable_device(dev); - if (rc) - return rc; + ret = pci_enable_device(pdev); + if (ret) + return ret; - pci_set_master(dev); + pci_set_master(pdev); - if (socket->type && socket->type->restore_state) - socket->type->restore_state(socket); - } + if (socket->type && socket->type->restore_state) + socket->type->restore_state(socket); + + pcmcia_socket_dev_early_resume(dev); + return 0; +} - return pcmcia_socket_dev_resume(&dev->dev); +static int yenta_dev_resume(struct device *dev) +{ + pcmcia_socket_dev_late_resume(dev); + return 0; } + +static struct dev_pm_ops yenta_pm_ops = { + .suspend_noirq = yenta_dev_suspend_noirq, + .resume_noirq = yenta_dev_resume_noirq, + .resume = yenta_dev_resume, + .freeze_noirq = yenta_dev_suspend_noirq, + .thaw_noirq = yenta_dev_resume_noirq, + .thaw = yenta_dev_resume, + .poweroff_noirq = yenta_dev_suspend_noirq, + .restore_noirq = yenta_dev_resume_noirq, + .restore = yenta_dev_resume, +}; + +#define YENTA_PM_OPS (¥ta_pm_ops) +#else +#define YENTA_PM_OPS NULL #endif #define CB_ID(vend,dev,type) \ @@ -1376,10 +1397,7 @@ static struct pci_driver yenta_cardbus_driver = { .id_table = yenta_table, .probe = yenta_probe, .remove = __devexit_p(yenta_close), -#ifdef CONFIG_PM - .suspend = yenta_dev_suspend, - .resume = yenta_dev_resume, -#endif + .driver.pm = YENTA_PM_OPS, }; diff --git a/drivers/platform/x86/acerhdf.c b/drivers/platform/x86/acerhdf.c index bdfee177eefb..034ca6d9081d 100644 --- a/drivers/platform/x86/acerhdf.c +++ b/drivers/platform/x86/acerhdf.c @@ -52,7 +52,7 @@ */ #undef START_IN_KERNEL_MODE -#define DRV_VER "0.5.13" +#define DRV_VER "0.5.16" /* * According to the Atom N270 datasheet, @@ -61,7 +61,7 @@ * measured by the on-die thermal monitor are within 0 <= Tj <= 90. So, * assume 89°C is critical temperature. */ -#define ACERHDF_TEMP_CRIT 89 +#define ACERHDF_TEMP_CRIT 89000 #define ACERHDF_FAN_OFF 0 #define ACERHDF_FAN_AUTO 1 @@ -69,7 +69,7 @@ * No matter what value the user puts into the fanon variable, turn on the fan * at 80 degree Celsius to prevent hardware damage */ -#define ACERHDF_MAX_FANON 80 +#define ACERHDF_MAX_FANON 80000 /* * Maximum interval between two temperature checks is 15 seconds, as the die @@ -85,11 +85,12 @@ static int kernelmode; #endif static unsigned int interval = 10; -static unsigned int fanon = 63; -static unsigned int fanoff = 58; +static unsigned int fanon = 63000; +static unsigned int fanoff = 58000; static unsigned int verbose; static unsigned int fanstate = ACERHDF_FAN_AUTO; static char force_bios[16]; +static char force_product[16]; static unsigned int prev_interval; struct thermal_zone_device *thz_dev; struct thermal_cooling_device *cl_dev; @@ -107,34 +108,62 @@ module_param(verbose, uint, 0600); MODULE_PARM_DESC(verbose, "Enable verbose dmesg output"); module_param_string(force_bios, force_bios, 16, 0); MODULE_PARM_DESC(force_bios, "Force BIOS version and omit BIOS check"); +module_param_string(force_product, force_product, 16, 0); +MODULE_PARM_DESC(force_product, "Force BIOS product and omit BIOS check"); + +/* + * cmd_off: to switch the fan completely off / to check if the fan is off + * cmd_auto: to set the BIOS in control of the fan. The BIOS regulates then + * the fan speed depending on the temperature + */ +struct fancmd { + u8 cmd_off; + u8 cmd_auto; +}; /* BIOS settings */ struct bios_settings_t { const char *vendor; + const char *product; const char *version; unsigned char fanreg; unsigned char tempreg; - unsigned char fancmd[2]; /* fan off and auto commands */ + struct fancmd cmd; }; /* Register addresses and values for different BIOS versions */ static const struct bios_settings_t bios_tbl[] = { - {"Acer", "v0.3109", 0x55, 0x58, {0x1f, 0x00} }, - {"Acer", "v0.3114", 0x55, 0x58, {0x1f, 0x00} }, - {"Acer", "v0.3301", 0x55, 0x58, {0xaf, 0x00} }, - {"Acer", "v0.3304", 0x55, 0x58, {0xaf, 0x00} }, - {"Acer", "v0.3305", 0x55, 0x58, {0xaf, 0x00} }, - {"Acer", "v0.3308", 0x55, 0x58, {0x21, 0x00} }, - {"Acer", "v0.3309", 0x55, 0x58, {0x21, 0x00} }, - {"Acer", "v0.3310", 0x55, 0x58, {0x21, 0x00} }, - {"Gateway", "v0.3103", 0x55, 0x58, {0x21, 0x00} }, - {"Packard Bell", "v0.3105", 0x55, 0x58, {0x21, 0x00} }, - {"", "", 0, 0, {0, 0} } + /* AOA110 */ + {"Acer", "AOA110", "v0.3109", 0x55, 0x58, {0x1f, 0x00} }, + {"Acer", "AOA110", "v0.3114", 0x55, 0x58, {0x1f, 0x00} }, + {"Acer", "AOA110", "v0.3301", 0x55, 0x58, {0xaf, 0x00} }, + {"Acer", "AOA110", "v0.3304", 0x55, 0x58, {0xaf, 0x00} }, + {"Acer", "AOA110", "v0.3305", 0x55, 0x58, {0xaf, 0x00} }, + {"Acer", "AOA110", "v0.3307", 0x55, 0x58, {0xaf, 0x00} }, + {"Acer", "AOA110", "v0.3308", 0x55, 0x58, {0x21, 0x00} }, + {"Acer", "AOA110", "v0.3309", 0x55, 0x58, {0x21, 0x00} }, + {"Acer", "AOA110", "v0.3310", 0x55, 0x58, {0x21, 0x00} }, + /* AOA150 */ + {"Acer", "AOA150", "v0.3114", 0x55, 0x58, {0x20, 0x00} }, + {"Acer", "AOA150", "v0.3301", 0x55, 0x58, {0x20, 0x00} }, + {"Acer", "AOA150", "v0.3304", 0x55, 0x58, {0x20, 0x00} }, + {"Acer", "AOA150", "v0.3305", 0x55, 0x58, {0x20, 0x00} }, + {"Acer", "AOA150", "v0.3307", 0x55, 0x58, {0x20, 0x00} }, + {"Acer", "AOA150", "v0.3308", 0x55, 0x58, {0x20, 0x00} }, + {"Acer", "AOA150", "v0.3309", 0x55, 0x58, {0x20, 0x00} }, + {"Acer", "AOA150", "v0.3310", 0x55, 0x58, {0x20, 0x00} }, + /* special BIOS / other */ + {"Gateway", "AOA110", "v0.3103", 0x55, 0x58, {0x21, 0x00} }, + {"Gateway", "AOA150", "v0.3103", 0x55, 0x58, {0x20, 0x00} }, + {"Packard Bell", "DOA150", "v0.3104", 0x55, 0x58, {0x21, 0x00} }, + {"Packard Bell", "AOA110", "v0.3105", 0x55, 0x58, {0x21, 0x00} }, + {"Packard Bell", "AOA150", "v0.3105", 0x55, 0x58, {0x20, 0x00} }, + /* pewpew-terminator */ + {"", "", "", 0, 0, {0, 0} } }; static const struct bios_settings_t *bios_cfg __read_mostly; - static int acerhdf_get_temp(int *temp) { u8 read_temp; @@ -142,7 +171,7 @@ static int acerhdf_get_temp(int *temp) if (ec_read(bios_cfg->tempreg, &read_temp)) return -EINVAL; - *temp = read_temp; + *temp = read_temp * 1000; return 0; } @@ -150,13 +179,14 @@ static int acerhdf_get_temp(int *temp) static int acerhdf_get_fanstate(int *state) { u8 fan; - bool tmp; if (ec_read(bios_cfg->fanreg, &fan)) return -EINVAL; - tmp = (fan == bios_cfg->fancmd[ACERHDF_FAN_OFF]); - *state = tmp ? ACERHDF_FAN_OFF : ACERHDF_FAN_AUTO; + if (fan != bios_cfg->cmd.cmd_off) + *state = ACERHDF_FAN_AUTO; + else + *state = ACERHDF_FAN_OFF; return 0; } @@ -175,7 +205,8 @@ static void acerhdf_change_fanstate(int state) state = ACERHDF_FAN_AUTO; } - cmd = bios_cfg->fancmd[state]; + cmd = (state == ACERHDF_FAN_OFF) ? bios_cfg->cmd.cmd_off + : bios_cfg->cmd.cmd_auto; fanstate = state; ec_write(bios_cfg->fanreg, cmd); @@ -437,7 +468,7 @@ static int acerhdf_remove(struct platform_device *device) return 0; } -struct platform_driver acerhdf_drv = { +static struct platform_driver acerhdf_driver = { .driver = { .name = "acerhdf", .owner = THIS_MODULE, @@ -454,32 +485,40 @@ static int acerhdf_check_hardware(void) { char const *vendor, *version, *product; int i; + unsigned long prod_len = 0; /* get BIOS data */ vendor = dmi_get_system_info(DMI_SYS_VENDOR); version = dmi_get_system_info(DMI_BIOS_VERSION); product = dmi_get_system_info(DMI_PRODUCT_NAME); + pr_info("Acer Aspire One Fan driver, v.%s\n", DRV_VER); - if (!force_bios[0]) { - if (strncmp(product, "AO", 2)) { - pr_err("no Aspire One hardware found\n"); - return -EINVAL; - } - } else { - pr_info("forcing BIOS version: %s\n", version); + if (force_bios[0]) { version = force_bios; + pr_info("forcing BIOS version: %s\n", version); kernelmode = 0; } + if (force_product[0]) { + product = force_product; + pr_info("forcing BIOS product: %s\n", product); + kernelmode = 0; + } + + prod_len = strlen(product); + if (verbose) pr_info("BIOS info: %s %s, product: %s\n", vendor, version, product); /* search BIOS version and vendor in BIOS settings table */ for (i = 0; bios_tbl[i].version[0]; i++) { - if (!strcmp(bios_tbl[i].vendor, vendor) && + if (strlen(bios_tbl[i].product) >= prod_len && + !strncmp(bios_tbl[i].product, product, + strlen(bios_tbl[i].product)) && + !strcmp(bios_tbl[i].vendor, vendor) && !strcmp(bios_tbl[i].version, version)) { bios_cfg = &bios_tbl[i]; break; @@ -487,8 +526,8 @@ static int acerhdf_check_hardware(void) } if (!bios_cfg) { - pr_err("unknown (unsupported) BIOS version %s/%s, " - "please report, aborting!\n", vendor, version); + pr_err("unknown (unsupported) BIOS version %s/%s/%s, " + "please report, aborting!\n", vendor, product, version); return -EINVAL; } @@ -509,7 +548,7 @@ static int acerhdf_register_platform(void) { int err = 0; - err = platform_driver_register(&acerhdf_drv); + err = platform_driver_register(&acerhdf_driver); if (err) return err; @@ -525,7 +564,7 @@ static void acerhdf_unregister_platform(void) return; platform_device_del(acerhdf_dev); - platform_driver_unregister(&acerhdf_drv); + platform_driver_unregister(&acerhdf_driver); } static int acerhdf_register_thermal(void) @@ -594,9 +633,10 @@ static void __exit acerhdf_exit(void) MODULE_LICENSE("GPL"); MODULE_AUTHOR("Peter Feuerer"); MODULE_DESCRIPTION("Aspire One temperature and fan driver"); -MODULE_ALIAS("dmi:*:*Acer*:*:"); -MODULE_ALIAS("dmi:*:*Gateway*:*:"); -MODULE_ALIAS("dmi:*:*Packard Bell*:*:"); +MODULE_ALIAS("dmi:*:*Acer*:pnAOA*:"); +MODULE_ALIAS("dmi:*:*Gateway*:pnAOA*:"); +MODULE_ALIAS("dmi:*:*Packard Bell*:pnAOA*:"); +MODULE_ALIAS("dmi:*:*Packard Bell*:pnDOA*:"); module_init(acerhdf_init); module_exit(acerhdf_exit); diff --git a/drivers/platform/x86/asus-laptop.c b/drivers/platform/x86/asus-laptop.c index db657bbeec90..fae1951cb753 100644 --- a/drivers/platform/x86/asus-laptop.c +++ b/drivers/platform/x86/asus-laptop.c @@ -1172,8 +1172,8 @@ static int asus_hotk_add(struct acpi_device *device) hotk->ledd_status = 0xFFF; /* Set initial values of light sensor and level */ - hotk->light_switch = 1; /* Default to light sensor disabled */ - hotk->light_level = 0; /* level 5 for sensor sensitivity */ + hotk->light_switch = 0; /* Default to light sensor disabled */ + hotk->light_level = 5; /* level 5 for sensor sensitivity */ if (ls_switch_handle) set_light_sens_switch(hotk->light_switch); diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c index dafaa4a92df5..a234a9db15d9 100644 --- a/drivers/platform/x86/sony-laptop.c +++ b/drivers/platform/x86/sony-laptop.c @@ -1081,6 +1081,8 @@ static int sony_nc_setup_rfkill(struct acpi_device *device, struct rfkill *rfk; enum rfkill_type type; const char *name; + int result; + bool hwblock; switch (nc_type) { case SONY_WIFI: @@ -1108,6 +1110,10 @@ static int sony_nc_setup_rfkill(struct acpi_device *device, if (!rfk) return -ENOMEM; + sony_call_snc_handle(0x124, 0x200, &result); + hwblock = !(result & 0x1); + rfkill_set_hw_state(rfk, hwblock); + err = rfkill_register(rfk); if (err) { rfkill_destroy(rfk); diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index e85600852502..05e5d56f9c82 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c @@ -3406,15 +3406,6 @@ enum { #define TPACPI_RFK_BLUETOOTH_SW_NAME "tpacpi_bluetooth_sw" -static void bluetooth_suspend(pm_message_t state) -{ - /* Try to make sure radio will resume powered off */ - if (!acpi_evalf(NULL, NULL, "\\BLTH", "vd", - TP_ACPI_BLTH_PWR_OFF_ON_RESUME)) - vdbg_printk(TPACPI_DBG_RFKILL, - "bluetooth power down on resume request failed\n"); -} - static int bluetooth_get_status(void) { int status; @@ -3448,10 +3439,9 @@ static int bluetooth_set_status(enum tpacpi_rfkill_state state) #endif /* We make sure to keep TP_ACPI_BLUETOOTH_RESUMECTRL off */ + status = TP_ACPI_BLUETOOTH_RESUMECTRL; if (state == TPACPI_RFK_RADIO_ON) - status = TP_ACPI_BLUETOOTH_RADIOSSW; - else - status = 0; + status |= TP_ACPI_BLUETOOTH_RADIOSSW; if (!acpi_evalf(hkey_handle, NULL, "SBDC", "vd", status)) return -EIO; @@ -3590,7 +3580,6 @@ static struct ibm_struct bluetooth_driver_data = { .read = bluetooth_read, .write = bluetooth_write, .exit = bluetooth_exit, - .suspend = bluetooth_suspend, .shutdown = bluetooth_shutdown, }; @@ -3608,15 +3597,6 @@ enum { #define TPACPI_RFK_WWAN_SW_NAME "tpacpi_wwan_sw" -static void wan_suspend(pm_message_t state) -{ - /* Try to make sure radio will resume powered off */ - if (!acpi_evalf(NULL, NULL, "\\WGSV", "qvd", - TP_ACPI_WGSV_PWR_OFF_ON_RESUME)) - vdbg_printk(TPACPI_DBG_RFKILL, - "WWAN power down on resume request failed\n"); -} - static int wan_get_status(void) { int status; @@ -3649,11 +3629,10 @@ static int wan_set_status(enum tpacpi_rfkill_state state) } #endif - /* We make sure to keep TP_ACPI_WANCARD_RESUMECTRL off */ + /* We make sure to set TP_ACPI_WANCARD_RESUMECTRL */ + status = TP_ACPI_WANCARD_RESUMECTRL; if (state == TPACPI_RFK_RADIO_ON) - status = TP_ACPI_WANCARD_RADIOSSW; - else - status = 0; + status |= TP_ACPI_WANCARD_RADIOSSW; if (!acpi_evalf(hkey_handle, NULL, "SWAN", "vd", status)) return -EIO; @@ -3791,7 +3770,6 @@ static struct ibm_struct wan_driver_data = { .read = wan_read, .write = wan_write, .exit = wan_exit, - .suspend = wan_suspend, .shutdown = wan_shutdown, }; @@ -5655,16 +5633,16 @@ static const struct tpacpi_quirk brightness_quirk_table[] __initconst = { /* Models with ATI GPUs known to require ECNVRAM mode */ TPACPI_Q_IBM('1', 'Y', TPACPI_BRGHT_Q_EC), /* T43/p ATI */ - /* Models with ATI GPUs (waiting confirmation) */ - TPACPI_Q_IBM('1', 'R', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC), + /* Models with ATI GPUs that can use ECNVRAM */ + TPACPI_Q_IBM('1', 'R', TPACPI_BRGHT_Q_EC), TPACPI_Q_IBM('1', 'Q', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC), TPACPI_Q_IBM('7', '6', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC), TPACPI_Q_IBM('7', '8', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC), - /* Models with Intel Extreme Graphics 2 (waiting confirmation) */ - TPACPI_Q_IBM('1', 'V', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_NOEC), - TPACPI_Q_IBM('1', 'W', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_NOEC), - TPACPI_Q_IBM('1', 'U', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_NOEC), + /* Models with Intel Extreme Graphics 2 */ + TPACPI_Q_IBM('1', 'U', TPACPI_BRGHT_Q_NOEC), + TPACPI_Q_IBM('1', 'V', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC), + TPACPI_Q_IBM('1', 'W', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC), /* Models with Intel GMA900 */ TPACPI_Q_IBM('7', '0', TPACPI_BRGHT_Q_NOEC), /* T43, R52 */ @@ -5863,7 +5841,7 @@ static int brightness_write(char *buf) * Doing it this way makes the syscall restartable in case of EINTR */ rc = brightness_set(level); - return (rc == -EINTR)? ERESTARTSYS : rc; + return (rc == -EINTR)? -ERESTARTSYS : rc; } static struct ibm_struct brightness_driver_data = { diff --git a/drivers/pps/kapi.c b/drivers/pps/kapi.c index 35a0b192d768..2d414e23d390 100644 --- a/drivers/pps/kapi.c +++ b/drivers/pps/kapi.c @@ -271,6 +271,7 @@ void pps_event(int source, struct pps_ktime *ts, int event, void *data) { struct pps_device *pps; unsigned long flags; + int captured = 0; if ((event & (PPS_CAPTUREASSERT | PPS_CAPTURECLEAR)) == 0) { printk(KERN_ERR "pps: unknown event (%x) for source %d\n", @@ -293,7 +294,8 @@ void pps_event(int source, struct pps_ktime *ts, int event, void *data) /* Check the event */ pps->current_mode = pps->params.mode; - if (event & PPS_CAPTUREASSERT) { + if ((event & PPS_CAPTUREASSERT) & + (pps->params.mode & PPS_CAPTUREASSERT)) { /* We have to add an offset? */ if (pps->params.mode & PPS_OFFSETASSERT) pps_add_offset(ts, &pps->params.assert_off_tu); @@ -303,8 +305,11 @@ void pps_event(int source, struct pps_ktime *ts, int event, void *data) pps->assert_sequence++; pr_debug("capture assert seq #%u for source %d\n", pps->assert_sequence, source); + + captured = ~0; } - if (event & PPS_CAPTURECLEAR) { + if ((event & PPS_CAPTURECLEAR) & + (pps->params.mode & PPS_CAPTURECLEAR)) { /* We have to add an offset? */ if (pps->params.mode & PPS_OFFSETCLEAR) pps_add_offset(ts, &pps->params.clear_off_tu); @@ -314,12 +319,17 @@ void pps_event(int source, struct pps_ktime *ts, int event, void *data) pps->clear_sequence++; pr_debug("capture clear seq #%u for source %d\n", pps->clear_sequence, source); + + captured = ~0; } - pps->go = ~0; - wake_up_interruptible(&pps->queue); + /* Wake up iif captured somthing */ + if (captured) { + pps->go = ~0; + wake_up_interruptible(&pps->queue); - kill_fasync(&pps->async_queue, SIGIO, POLL_IN); + kill_fasync(&pps->async_queue, SIGIO, POLL_IN); + } spin_unlock_irqrestore(&pps->lock, flags); diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c index fea17e7805e9..ca5183bdad85 100644 --- a/drivers/pps/pps.c +++ b/drivers/pps/pps.c @@ -71,9 +71,14 @@ static long pps_cdev_ioctl(struct file *file, case PPS_GETPARAMS: pr_debug("PPS_GETPARAMS: source %d\n", pps->id); - /* Return current parameters */ - err = copy_to_user(uarg, &pps->params, - sizeof(struct pps_kparams)); + spin_lock_irq(&pps->lock); + + /* Get the current parameters */ + params = pps->params; + + spin_unlock_irq(&pps->lock); + + err = copy_to_user(uarg, ¶ms, sizeof(struct pps_kparams)); if (err) return -EFAULT; diff --git a/drivers/ps3/ps3stor_lib.c b/drivers/ps3/ps3stor_lib.c index 18066d555397..af0afa1db4a8 100644 --- a/drivers/ps3/ps3stor_lib.c +++ b/drivers/ps3/ps3stor_lib.c @@ -23,6 +23,65 @@ #include <asm/lv1call.h> #include <asm/ps3stor.h> +/* + * A workaround for flash memory I/O errors when the internal hard disk + * has not been formatted for OtherOS use. Delay disk close until flash + * memory is closed. + */ + +static struct ps3_flash_workaround { + int flash_open; + int disk_open; + struct ps3_system_bus_device *disk_sbd; +} ps3_flash_workaround; + +static int ps3stor_open_hv_device(struct ps3_system_bus_device *sbd) +{ + int error = ps3_open_hv_device(sbd); + + if (error) + return error; + + if (sbd->match_id == PS3_MATCH_ID_STOR_FLASH) + ps3_flash_workaround.flash_open = 1; + + if (sbd->match_id == PS3_MATCH_ID_STOR_DISK) + ps3_flash_workaround.disk_open = 1; + + return 0; +} + +static int ps3stor_close_hv_device(struct ps3_system_bus_device *sbd) +{ + int error; + + if (sbd->match_id == PS3_MATCH_ID_STOR_DISK + && ps3_flash_workaround.disk_open + && ps3_flash_workaround.flash_open) { + ps3_flash_workaround.disk_sbd = sbd; + return 0; + } + + error = ps3_close_hv_device(sbd); + + if (error) + return error; + + if (sbd->match_id == PS3_MATCH_ID_STOR_DISK) + ps3_flash_workaround.disk_open = 0; + + if (sbd->match_id == PS3_MATCH_ID_STOR_FLASH) { + ps3_flash_workaround.flash_open = 0; + + if (ps3_flash_workaround.disk_sbd) { + ps3_close_hv_device(ps3_flash_workaround.disk_sbd); + ps3_flash_workaround.disk_open = 0; + ps3_flash_workaround.disk_sbd = NULL; + } + } + + return 0; +} static int ps3stor_probe_access(struct ps3_storage_device *dev) { @@ -90,7 +149,7 @@ int ps3stor_setup(struct ps3_storage_device *dev, irq_handler_t handler) int error, res, alignment; enum ps3_dma_page_size page_size; - error = ps3_open_hv_device(&dev->sbd); + error = ps3stor_open_hv_device(&dev->sbd); if (error) { dev_err(&dev->sbd.core, "%s:%u: ps3_open_hv_device failed %d\n", __func__, @@ -166,7 +225,7 @@ fail_free_irq: fail_sb_event_receive_port_destroy: ps3_sb_event_receive_port_destroy(&dev->sbd, dev->irq); fail_close_device: - ps3_close_hv_device(&dev->sbd); + ps3stor_close_hv_device(&dev->sbd); fail: return error; } @@ -193,7 +252,7 @@ void ps3stor_teardown(struct ps3_storage_device *dev) "%s:%u: destroy event receive port failed %d\n", __func__, __LINE__, error); - error = ps3_close_hv_device(&dev->sbd); + error = ps3stor_close_hv_device(&dev->sbd); if (error) dev_err(&dev->sbd.core, "%s:%u: ps3_close_hv_device failed %d\n", __func__, diff --git a/drivers/regulator/max17135-regulator.c b/drivers/regulator/max17135-regulator.c index a667c2f7cf59..3fdec795fbeb 100644 --- a/drivers/regulator/max17135-regulator.c +++ b/drivers/regulator/max17135-regulator.c @@ -30,6 +30,12 @@ #include <linux/gpio.h> /* + * Define this as 1 when using a Rev 1 MAX17135 part. These parts have + * some limitations, including an inability to turn on the PMIC via I2C. + */ +#define MAX17135_REV 1 + +/* * PMIC Register Addresses */ enum { @@ -170,8 +176,27 @@ enum { #define MAX17135_GVEE_MIN_VAL 0 #define MAX17135_GVEE_MAX_VAL 1 +#if (MAX17135_REV == 1) +#define MAX17135_VCOM_MIN_uV -4325000 +#define MAX17135_VCOM_MAX_uV -500000 +#define MAX17135_VCOM_STEP_uV 15000 #define MAX17135_VCOM_MIN_VAL 0 #define MAX17135_VCOM_MAX_VAL 255 +/* Required due to discrepancy between + * observed VCOM programming and + * what is suggested in the spec. + */ +#define MAX17135_VCOM_FUDGE_FACTOR 330000 +#else +#define MAX17135_VCOM_MIN_uV -3050000 +#define MAX17135_VCOM_MAX_uV -500000 +#define MAX17135_VCOM_STEP_uV 10000 +#define MAX17135_VCOM_MIN_VAL 0 +#define MAX17135_VCOM_MAX_VAL 255 +#define MAX17135_VCOM_FUDGE_FACTOR 330000 +#endif + +#define MAX17135_VCOM_VOLTAGE_DEFAULT -1250000 #define MAX17135_VNEG_MIN_uV 5000000 #define MAX17135_VNEG_MAX_uV 20000000 @@ -185,25 +210,6 @@ enum { #define MAX17135_VPOS_MIN_VAL 0 #define MAX17135_VPOS_MAX_VAL 1 -struct max17135_vcom_programming_data { - int vcom_min_uV; - int vcom_max_uV; - int vcom_step_uV; -}; - -struct max17135_vcom_programming_data vcom_data[2] = { - { - -4325000, - -500000, - 15000, - }, - { - -3050000, - -500000, - 10000, - }, -}; - struct max17135 { /* chip revision */ int rev; @@ -222,9 +228,6 @@ struct max17135 { int gpio_pmic_wakeup; int gpio_pmic_intr; - int pass_num; - int vcom_uV; - bool vcom_setup; int max_wait; @@ -290,17 +293,15 @@ static int max17135_hvinp_disable(struct regulator_dev *reg) } /* Convert uV to the VCOM register bitfield setting */ -static inline int vcom_uV_to_rs(int uV, int pass_num) +static inline int vcom_uV_to_rs(int uV) { - return (vcom_data[pass_num].vcom_max_uV - uV) - / vcom_data[pass_num].vcom_step_uV; + return (MAX17135_VCOM_MAX_uV - uV) / MAX17135_VCOM_STEP_uV; } /* Convert the VCOM register bitfield setting to uV */ -static inline int vcom_rs_to_uV(int rs, int pass_num) +static inline int vcom_rs_to_uV(int rs) { - return vcom_data[pass_num].vcom_max_uV - - (vcom_data[pass_num].vcom_step_uV * rs); + return MAX17135_VCOM_MAX_uV - (MAX17135_VCOM_STEP_uV * rs); } static int max17135_vcom_set_voltage(struct regulator_dev *reg, @@ -311,8 +312,7 @@ static int max17135_vcom_set_voltage(struct regulator_dev *reg, unsigned int reg_val; int vcom_read; - if ((uV < vcom_data[max17135->pass_num-1].vcom_min_uV) - || (uV > vcom_data[max17135->pass_num-1].vcom_max_uV)) + if ((uV < MAX17135_VCOM_MIN_uV) || (uV > MAX17135_VCOM_MAX_uV)) return -EINVAL; reg_val = i2c_smbus_read_byte_data(client, REG_MAX17135_DVR); @@ -322,11 +322,11 @@ static int max17135_vcom_set_voltage(struct regulator_dev *reg, * Programming VCOM excessively degrades ability to keep * DVR register value persistent. */ - vcom_read = vcom_rs_to_uV(reg_val, max17135->pass_num-1); - if (vcom_read != max17135->vcom_uV) { + vcom_read = vcom_rs_to_uV(reg_val) - MAX17135_VCOM_FUDGE_FACTOR; + if (vcom_read != MAX17135_VCOM_VOLTAGE_DEFAULT) { reg_val &= ~BITFMASK(DVR); - reg_val |= BITFVAL(DVR, vcom_uV_to_rs(uV, - max17135->pass_num-1)); + reg_val |= BITFVAL(DVR, + vcom_uV_to_rs(uV + MAX17135_VCOM_FUDGE_FACTOR)); i2c_smbus_write_byte_data(client, REG_MAX17135_DVR, reg_val); reg_val = BITFVAL(CTRL_DVR, true); /* shift to correct bit */ @@ -342,7 +342,7 @@ static int max17135_vcom_get_voltage(struct regulator_dev *reg) unsigned int reg_val; reg_val = i2c_smbus_read_byte_data(client, REG_MAX17135_DVR); - return vcom_rs_to_uV(BITFEXT(reg_val, DVR), max17135->pass_num-1); + return vcom_rs_to_uV(BITFEXT(reg_val, DVR)); } static int max17135_vcom_enable(struct regulator_dev *reg) @@ -357,41 +357,38 @@ static int max17135_vcom_enable(struct regulator_dev *reg) if (!max17135->vcom_setup && gpio_get_value(max17135->gpio_pmic_pwrgood)) { max17135_vcom_set_voltage(reg, - max17135->vcom_uV, - max17135->vcom_uV); + MAX17135_VCOM_VOLTAGE_DEFAULT, + MAX17135_VCOM_VOLTAGE_DEFAULT); max17135->vcom_setup = true; } /* enable VCOM regulator output */ - if (max17135->pass_num == 1) - gpio_set_value(max17135->gpio_pmic_vcom_ctrl, 1); - else { - struct i2c_client *client = max17135->i2c_client; - unsigned int reg_val; - - reg_val = i2c_smbus_read_byte_data(client, REG_MAX17135_ENABLE); - reg_val &= ~BITFMASK(VCOM_ENABLE); - reg_val |= BITFVAL(VCOM_ENABLE, 1); /* shift to correct bit */ - i2c_smbus_write_byte_data(client, REG_MAX17135_ENABLE, reg_val); - } +#if (MAX17135_REV == 1) + gpio_set_value(max17135->gpio_pmic_vcom_ctrl, 1); +#else + struct i2c_client *client = max17135->i2c_client; + reg_val = i2c_smbus_read_byte_data(client, REG_MAX17135_ENABLE); + reg_val &= ~BITFMASK(VCOM_ENABLE); + reg_val |= BITFVAL(VCOM_ENABLE, 1); /* shift to correct bit */ + i2c_smbus_write_byte_data(client, REG_MAX17135_ENABLE, reg_val); +#endif return 0; } static int max17135_vcom_disable(struct regulator_dev *reg) { struct max17135 *max17135 = rdev_get_drvdata(reg); - if (max17135->pass_num == 1) - gpio_set_value(max17135->gpio_pmic_vcom_ctrl, 0); - else { - struct i2c_client *client = max17135->i2c_client; - unsigned int reg_val; - - reg_val = i2c_smbus_read_byte_data(client, REG_MAX17135_ENABLE); - reg_val &= ~BITFMASK(VCOM_ENABLE); - i2c_smbus_write_byte_data(client, REG_MAX17135_ENABLE, reg_val); - } +#if (MAX17135_REV == 1) + gpio_set_value(max17135->gpio_pmic_vcom_ctrl, 0); +#else + struct i2c_client *client = max17135->i2c_client; + unsigned int reg_val; + reg_val = i2c_smbus_read_byte_data(client, REG_MAX17135_ENABLE); + reg_val &= ~BITFMASK(VCOM_ENABLE); + i2c_smbus_write_byte_data(client, REG_MAX17135_ENABLE, reg_val); +#endif return 0; } @@ -411,21 +408,17 @@ static int max17135_wait_power_good(struct max17135 *max17135) static int max17135_display_enable(struct regulator_dev *reg) { struct max17135 *max17135 = rdev_get_drvdata(reg); +#if (MAX17135_REV == 1) + gpio_set_value(max17135->gpio_pmic_wakeup, 1); +#else + struct i2c_client *client = max17135->i2c_client; + unsigned int reg_val; - /* The Pass 1 parts cannot turn on the PMIC via I2C. */ - if (max17135->pass_num == 1) - gpio_set_value(max17135->gpio_pmic_wakeup, 1); - else { - struct i2c_client *client = max17135->i2c_client; - unsigned int reg_val; - - reg_val = i2c_smbus_read_byte_data(client, - REG_MAX17135_ENABLE); - reg_val &= ~BITFMASK(ENABLE); - reg_val |= BITFVAL(ENABLE, 1); - i2c_smbus_write_byte_data(client, REG_MAX17135_ENABLE, - reg_val); - } + reg_val = i2c_smbus_read_byte_data(client, REG_MAX17135_ENABLE); + reg_val &= ~BITFMASK(ENABLE); + reg_val |= BITFVAL(ENABLE, 1); + i2c_smbus_write_byte_data(client, REG_MAX17135_ENABLE, reg_val); +#endif return max17135_wait_power_good(max17135); } @@ -433,20 +426,17 @@ static int max17135_display_enable(struct regulator_dev *reg) static int max17135_display_disable(struct regulator_dev *reg) { struct max17135 *max17135 = rdev_get_drvdata(reg); +#if (MAX17135_REV == 1) + gpio_set_value(max17135->gpio_pmic_wakeup, 0); +#else + struct i2c_client *client = max17135->i2c_client; + unsigned int reg_val; - if (max17135->pass_num == 1) - gpio_set_value(max17135->gpio_pmic_wakeup, 0); - else { - struct i2c_client *client = max17135->i2c_client; - unsigned int reg_val; - - reg_val = i2c_smbus_read_byte_data(client, - REG_MAX17135_ENABLE); - reg_val &= ~BITFMASK(ENABLE); - i2c_smbus_write_byte_data(client, REG_MAX17135_ENABLE, - reg_val); - } - + reg_val = i2c_smbus_read_byte_data(client, REG_MAX17135_ENABLE); + reg_val &= ~BITFMASK(ENABLE); + i2c_smbus_write_byte_data(client, REG_MAX17135_ENABLE, reg_val); + msleep(PMIC_DISABLE__V3P3_DESERT/1000); +#endif return 0; } @@ -668,9 +658,6 @@ static int max17135_i2c_probe(struct i2c_client *client, max17135->gpio_pmic_wakeup = pdata->gpio_pmic_wakeup; max17135->gpio_pmic_intr = pdata->gpio_pmic_intr; - max17135->pass_num = pdata->pass_num; - max17135->vcom_uV = pdata->vcom_uV; - max17135->vcom_setup = false; ret = platform_driver_register(&max17135_regulator_driver); diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index bd320c1ab70c..09492700cddf 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -109,16 +109,6 @@ config RTC_INTF_DEV_UIE_EMUL clock several times per second, please enable this option only if you know that you really need it. -config RTC_INTF_ALARM - bool "Android alarm driver" - depends on RTC_CLASS - default y - help - Provides non-wakeup and rtc backed wakeup alarms based on rtc or - elapsed realtime, and a non-wakeup alarm on the monotonic clock. - Also provides an ioctl to set the wall time which must be used - for elapsed realtime to work. - config RTC_DRV_TEST tristate "Test driver/device" help diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index c8df86258348..91da97eca589 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile @@ -11,7 +11,6 @@ obj-$(CONFIG_RTC_HCTOSYS) += hctosys.o obj-$(CONFIG_RTC_CLASS) += rtc-core.o rtc-core-y := class.o interface.o -rtc-core-$(CONFIG_RTC_INTF_ALARM) += alarm.o rtc-core-$(CONFIG_RTC_INTF_DEV) += rtc-dev.o rtc-core-$(CONFIG_RTC_INTF_PROC) += rtc-proc.o rtc-core-$(CONFIG_RTC_INTF_SYSFS) += rtc-sysfs.o diff --git a/drivers/rtc/rtc-fm3130.c b/drivers/rtc/rtc-fm3130.c index 3a7be11cc6b9..812c66755083 100644 --- a/drivers/rtc/rtc-fm3130.c +++ b/drivers/rtc/rtc-fm3130.c @@ -376,20 +376,22 @@ static int __devinit fm3130_probe(struct i2c_client *client, } /* Disabling calibration mode */ - if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_CAL) + if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_CAL) { i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL, fm3130->regs[FM3130_RTC_CONTROL] & ~(FM3130_RTC_CONTROL_BIT_CAL)); dev_warn(&client->dev, "Disabling calibration mode!\n"); + } /* Disabling read and write modes */ if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_WRITE || - fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_READ) + fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_READ) { i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL, fm3130->regs[FM3130_RTC_CONTROL] & ~(FM3130_RTC_CONTROL_BIT_READ | FM3130_RTC_CONTROL_BIT_WRITE)); dev_warn(&client->dev, "Disabling READ or WRITE mode!\n"); + } /* oscillator off? turn it on, so clock can tick. */ if (fm3130->regs[FM3130_CAL_CONTROL] & FM3130_CAL_CONTROL_BIT_nOSCEN) diff --git a/drivers/rtc/rtc-mxs.c b/drivers/rtc/rtc-mxs.c index bb4c33b1a0ba..0e2b0e1e14f6 100644 --- a/drivers/rtc/rtc-mxs.c +++ b/drivers/rtc/rtc-mxs.c @@ -254,8 +254,6 @@ static int mxs_rtc_probe(struct platform_device *pdev) platform_set_drvdata(pdev, rtc_data); - device_init_wakeup(&pdev->dev, 1); - return 0; } diff --git a/drivers/rtc/rtc-v3020.c b/drivers/rtc/rtc-v3020.c index ad164056feb6..423cd5a30b10 100644 --- a/drivers/rtc/rtc-v3020.c +++ b/drivers/rtc/rtc-v3020.c @@ -96,7 +96,7 @@ static void v3020_mmio_write_bit(struct v3020 *chip, unsigned char bit) static unsigned char v3020_mmio_read_bit(struct v3020 *chip) { - return readl(chip->ioaddress) & (1 << chip->leftshift); + return !!(readl(chip->ioaddress) & (1 << chip->leftshift)); } static struct v3020_chip_ops v3020_mmio_ops = { diff --git a/drivers/s390/block/dasd_diag.c b/drivers/s390/block/dasd_diag.c index 644086ba2ede..b76dee9f2861 100644 --- a/drivers/s390/block/dasd_diag.c +++ b/drivers/s390/block/dasd_diag.c @@ -145,6 +145,15 @@ dasd_diag_erp(struct dasd_device *device) mdsk_term_io(device); rc = mdsk_init_io(device, device->block->bp_block, 0, NULL); + if (rc == 4) { + if (!(device->features & DASD_FEATURE_READONLY)) { + dev_warn(&device->cdev->dev, + "The access mode of a DIAG device changed" + " to read-only"); + device->features |= DASD_FEATURE_READONLY; + } + rc = 0; + } if (rc) dev_warn(&device->cdev->dev, "DIAG ERP failed with " "rc=%d\n", rc); @@ -433,16 +442,20 @@ dasd_diag_check_device(struct dasd_device *device) for (sb = 512; sb < bsize; sb = sb << 1) block->s2b_shift++; rc = mdsk_init_io(device, block->bp_block, 0, NULL); - if (rc) { + if (rc && (rc != 4)) { dev_warn(&device->cdev->dev, "DIAG initialization " "failed with rc=%d\n", rc); rc = -EIO; } else { + if (rc == 4) + device->features |= DASD_FEATURE_READONLY; dev_info(&device->cdev->dev, - "New DASD with %ld byte/block, total size %ld KB\n", + "New DASD with %ld byte/block, total size %ld KB%s\n", (unsigned long) block->bp_block, (unsigned long) (block->blocks << - block->s2b_shift) >> 1); + block->s2b_shift) >> 1, + (rc == 4) ? ", read-only device" : ""); + rc = 0; } out_label: free_page((long) label); diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c index b6af63ca980b..496764349c41 100644 --- a/drivers/scsi/dpt_i2o.c +++ b/drivers/scsi/dpt_i2o.c @@ -1918,6 +1918,10 @@ static int adpt_i2o_passthru(adpt_hba* pHba, u32 __user *arg) } size = size>>16; size *= 4; + if (size > MAX_MESSAGE_SIZE) { + rcode = -EINVAL; + goto cleanup; + } /* Copy in the user's I2O command */ if (copy_from_user (msg, user_msg, size)) { rcode = -EFAULT; diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index 185e6bc4dd40..9e8fce0f0c1b 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c @@ -2900,7 +2900,7 @@ static int gdth_read_event(gdth_ha_str *ha, int handle, gdth_evt_str *estr) eindex = handle; estr->event_source = 0; - if (eindex >= MAX_EVENTS) { + if (eindex < 0 || eindex >= MAX_EVENTS) { spin_unlock_irqrestore(&ha->smp_lock, flags); return eindex; } diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index 5fd2da494d08..28a753d796f3 100644 --- a/drivers/scsi/hosts.c +++ b/drivers/scsi/hosts.c @@ -180,14 +180,20 @@ void scsi_remove_host(struct Scsi_Host *shost) EXPORT_SYMBOL(scsi_remove_host); /** - * scsi_add_host - add a scsi host + * scsi_add_host_with_dma - add a scsi host with dma device * @shost: scsi host pointer to add * @dev: a struct device of type scsi class + * @dma_dev: dma device for the host + * + * Note: You rarely need to worry about this unless you're in a + * virtualised host environments, so use the simpler scsi_add_host() + * function instead. * * Return value: * 0 on success / != 0 for error **/ -int scsi_add_host(struct Scsi_Host *shost, struct device *dev) +int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev, + struct device *dma_dev) { struct scsi_host_template *sht = shost->hostt; int error = -EINVAL; @@ -207,6 +213,7 @@ int scsi_add_host(struct Scsi_Host *shost, struct device *dev) if (!shost->shost_gendev.parent) shost->shost_gendev.parent = dev ? dev : &platform_bus; + shost->dma_dev = dma_dev; error = device_add(&shost->shost_gendev); if (error) @@ -262,7 +269,7 @@ int scsi_add_host(struct Scsi_Host *shost, struct device *dev) fail: return error; } -EXPORT_SYMBOL(scsi_add_host); +EXPORT_SYMBOL(scsi_add_host_with_dma); static void scsi_host_dev_release(struct device *dev) { diff --git a/drivers/scsi/libsrp.c b/drivers/scsi/libsrp.c index 2742ae8a3d09..9ad38e81e343 100644 --- a/drivers/scsi/libsrp.c +++ b/drivers/scsi/libsrp.c @@ -124,6 +124,7 @@ static void srp_ring_free(struct device *dev, struct srp_buf **ring, size_t max, dma_free_coherent(dev, size, ring[i]->buf, ring[i]->dma); kfree(ring[i]); } + kfree(ring); } int srp_target_alloc(struct srp_target *target, struct device *dev, diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index fc67cc65c63b..cf13ff2e9f01 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -2384,7 +2384,7 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev) vport->els_tmofunc.function = lpfc_els_timeout; vport->els_tmofunc.data = (unsigned long)vport; - error = scsi_add_host(shost, dev); + error = scsi_add_host_with_dma(shost, dev, &phba->pcidev->dev); if (error) goto out_put_shost; diff --git a/drivers/scsi/megaraid/megaraid_sas.c b/drivers/scsi/megaraid/megaraid_sas.c index 7dc3d1894b1a..4352e30cd1f6 100644 --- a/drivers/scsi/megaraid/megaraid_sas.c +++ b/drivers/scsi/megaraid/megaraid_sas.c @@ -3032,7 +3032,7 @@ megasas_mgmt_fw_ioctl(struct megasas_instance *instance, int error = 0, i; void *sense = NULL; dma_addr_t sense_handle; - u32 *sense_ptr; + unsigned long *sense_ptr; memset(kbuff_arr, 0, sizeof(kbuff_arr)); @@ -3109,7 +3109,7 @@ megasas_mgmt_fw_ioctl(struct megasas_instance *instance, } sense_ptr = - (u32 *) ((unsigned long)cmd->frame + ioc->sense_off); + (unsigned long *) ((unsigned long)cmd->frame + ioc->sense_off); *sense_ptr = sense_handle; } @@ -3140,8 +3140,8 @@ megasas_mgmt_fw_ioctl(struct megasas_instance *instance, * sense_ptr points to the location that has the user * sense buffer address */ - sense_ptr = (u32 *) ((unsigned long)ioc->frame.raw + - ioc->sense_off); + sense_ptr = (unsigned long *) ((unsigned long)ioc->frame.raw + + ioc->sense_off); if (copy_to_user((void __user *)((unsigned long)(*sense_ptr)), sense, ioc->sense_len)) { @@ -3451,7 +3451,7 @@ out: return retval; } -static DRIVER_ATTR(poll_mode_io, S_IRUGO|S_IWUGO, +static DRIVER_ATTR(poll_mode_io, S_IRUGO|S_IWUSR, megasas_sysfs_show_poll_mode_io, megasas_sysfs_set_poll_mode_io); diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c index 35a13867495e..2e4bc3d2b435 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.c +++ b/drivers/scsi/mpt2sas/mpt2sas_base.c @@ -94,7 +94,7 @@ _base_fault_reset_work(struct work_struct *work) int rc; spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); - if (ioc->ioc_reset_in_progress) + if (ioc->shost_recovery) goto rearm_timer; spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); @@ -1542,6 +1542,8 @@ _base_display_ioc_capabilities(struct MPT2SAS_ADAPTER *ioc) (ioc->bios_pg3.BiosVersion & 0x0000FF00) >> 8, ioc->bios_pg3.BiosVersion & 0x000000FF); + _base_display_dell_branding(ioc); + printk(MPT2SAS_INFO_FMT "Protocol=(", ioc->name); if (ioc->facts.ProtocolFlags & MPI2_IOCFACTS_PROTOCOL_SCSI_INITIATOR) { @@ -1554,8 +1556,6 @@ _base_display_ioc_capabilities(struct MPT2SAS_ADAPTER *ioc) i++; } - _base_display_dell_branding(ioc); - i = 0; printk("), "); printk("Capabilities=("); @@ -1627,6 +1627,9 @@ _base_static_config_pages(struct MPT2SAS_ADAPTER *ioc) u32 iounit_pg1_flags; mpt2sas_config_get_manufacturing_pg0(ioc, &mpi_reply, &ioc->manu_pg0); + if (ioc->ir_firmware) + mpt2sas_config_get_manufacturing_pg10(ioc, &mpi_reply, + &ioc->manu_pg10); mpt2sas_config_get_bios_pg2(ioc, &mpi_reply, &ioc->bios_pg2); mpt2sas_config_get_bios_pg3(ioc, &mpi_reply, &ioc->bios_pg3); mpt2sas_config_get_ioc_pg8(ioc, &mpi_reply, &ioc->ioc_pg8); @@ -3501,20 +3504,13 @@ mpt2sas_base_hard_reset_handler(struct MPT2SAS_ADAPTER *ioc, int sleep_flag, __func__)); spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); - if (ioc->ioc_reset_in_progress) { + if (ioc->shost_recovery) { spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); printk(MPT2SAS_ERR_FMT "%s: busy\n", ioc->name, __func__); return -EBUSY; } - ioc->ioc_reset_in_progress = 1; ioc->shost_recovery = 1; - if (ioc->shost->shost_state == SHOST_RUNNING) { - /* set back to SHOST_RUNNING in mpt2sas_scsih.c */ - scsi_host_set_state(ioc->shost, SHOST_RECOVERY); - printk(MPT2SAS_INFO_FMT "putting controller into " - "SHOST_RECOVERY\n", ioc->name); - } spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); _base_reset_handler(ioc, MPT2_IOC_PRE_RESET); @@ -3534,7 +3530,10 @@ mpt2sas_base_hard_reset_handler(struct MPT2SAS_ADAPTER *ioc, int sleep_flag, ioc->name, __func__, ((r == 0) ? "SUCCESS" : "FAILED"))); spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); - ioc->ioc_reset_in_progress = 0; + ioc->shost_recovery = 0; spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); + + if (!r) + _base_reset_handler(ioc, MPT2_IOC_RUNNING); return r; } diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.h b/drivers/scsi/mpt2sas/mpt2sas_base.h index acdcff150a35..22f84d3a3f2e 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.h +++ b/drivers/scsi/mpt2sas/mpt2sas_base.h @@ -119,6 +119,7 @@ #define MPT2_IOC_PRE_RESET 1 /* prior to host reset */ #define MPT2_IOC_AFTER_RESET 2 /* just after host reset */ #define MPT2_IOC_DONE_RESET 3 /* links re-initialized */ +#define MPT2_IOC_RUNNING 4 /* shost running */ /* * logging format @@ -196,6 +197,38 @@ struct MPT2SAS_TARGET { * @block: device is in SDEV_BLOCK state * @tlr_snoop_check: flag used in determining whether to disable TLR */ + +/* OEM Identifiers */ +#define MFG10_OEM_ID_INVALID (0x00000000) +#define MFG10_OEM_ID_DELL (0x00000001) +#define MFG10_OEM_ID_FSC (0x00000002) +#define MFG10_OEM_ID_SUN (0x00000003) +#define MFG10_OEM_ID_IBM (0x00000004) + +/* GENERIC Flags 0*/ +#define MFG10_GF0_OCE_DISABLED (0x00000001) +#define MFG10_GF0_R1E_DRIVE_COUNT (0x00000002) +#define MFG10_GF0_R10_DISPLAY (0x00000004) +#define MFG10_GF0_SSD_DATA_SCRUB_DISABLE (0x00000008) +#define MFG10_GF0_SINGLE_DRIVE_R0 (0x00000010) + +/* OEM Specific Flags will come from OEM specific header files */ +typedef struct _MPI2_CONFIG_PAGE_MAN_10 { + MPI2_CONFIG_PAGE_HEADER Header; /* 00h */ + U8 OEMIdentifier; /* 04h */ + U8 Reserved1; /* 05h */ + U16 Reserved2; /* 08h */ + U32 Reserved3; /* 0Ch */ + U32 GenericFlags0; /* 10h */ + U32 GenericFlags1; /* 14h */ + U32 Reserved4; /* 18h */ + U32 OEMSpecificFlags0; /* 1Ch */ + U32 OEMSpecificFlags1; /* 20h */ + U32 Reserved5[18]; /* 24h-60h*/ +} MPI2_CONFIG_PAGE_MAN_10, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_10, + Mpi2ManufacturingPage10_t, MPI2_POINTER pMpi2ManufacturingPage10_t; + struct MPT2SAS_DEVICE { struct MPT2SAS_TARGET *sas_target; unsigned int lun; @@ -431,7 +464,7 @@ typedef void (*MPT_ADD_SGE)(void *paddr, u32 flags_length, dma_addr_t dma_addr); * @fw_event_list: list of fw events * @aen_event_read_flag: event log was read * @broadcast_aen_busy: broadcast aen waiting to be serviced - * @ioc_reset_in_progress: host reset in progress + * @shost_recovery: host reset in progress * @ioc_reset_in_progress_lock: * @ioc_link_reset_in_progress: phy/hard reset in progress * @ignore_loginfos: ignore loginfos during task managment @@ -460,6 +493,7 @@ typedef void (*MPT_ADD_SGE)(void *paddr, u32 flags_length, dma_addr_t dma_addr); * @facts: static facts data * @pfacts: static port facts data * @manu_pg0: static manufacturing page 0 + * @manu_pg10: static manufacturing page 10 * @bios_pg2: static bios page 2 * @bios_pg3: static bios page 3 * @ioc_pg8: static ioc page 8 @@ -544,7 +578,6 @@ struct MPT2SAS_ADAPTER { /* misc flags */ int aen_event_read_flag; u8 broadcast_aen_busy; - u8 ioc_reset_in_progress; u8 shost_recovery; spinlock_t ioc_reset_in_progress_lock; u8 ioc_link_reset_in_progress; @@ -663,6 +696,7 @@ struct MPT2SAS_ADAPTER { dma_addr_t diag_buffer_dma[MPI2_DIAG_BUF_TYPE_COUNT]; u8 diag_buffer_status[MPI2_DIAG_BUF_TYPE_COUNT]; u32 unique_id[MPI2_DIAG_BUF_TYPE_COUNT]; + Mpi2ManufacturingPage10_t manu_pg10; u32 product_specific[MPI2_DIAG_BUF_TYPE_COUNT][23]; u32 diagnostic_flags[MPI2_DIAG_BUF_TYPE_COUNT]; }; @@ -734,6 +768,8 @@ void mpt2sas_config_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID, u32 re int mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys); int mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage0_t *config_page); +int mpt2sas_config_get_manufacturing_pg10(struct MPT2SAS_ADAPTER *ioc, + Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage10_t *config_page); int mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t *mpi_reply, Mpi2BiosPage2_t *config_page); int mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t @@ -776,7 +812,6 @@ int mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle, u16 *volume_handle); int mpt2sas_config_get_volume_wwid(struct MPT2SAS_ADAPTER *ioc, u16 volume_handle, u64 *wwid); - /* ctl shared API */ extern struct device_attribute *mpt2sas_host_attrs[]; extern struct device_attribute *mpt2sas_dev_attrs[]; @@ -802,5 +837,7 @@ void mpt2sas_transport_update_phy_link_change(struct MPT2SAS_ADAPTER *ioc, u16 h u16 attached_handle, u8 phy_number, u8 link_rate); extern struct sas_function_template mpt2sas_transport_functions; extern struct scsi_transport_template *mpt2sas_transport_template; +extern int scsi_internal_device_block(struct scsi_device *sdev); +extern int scsi_internal_device_unblock(struct scsi_device *sdev); #endif /* MPT2SAS_BASE_H_INCLUDED */ diff --git a/drivers/scsi/mpt2sas/mpt2sas_config.c b/drivers/scsi/mpt2sas/mpt2sas_config.c index 6ddee161beb3..b9f4d0f97e50 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_config.c +++ b/drivers/scsi/mpt2sas/mpt2sas_config.c @@ -426,6 +426,67 @@ mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc, } /** + * mpt2sas_config_get_manufacturing_pg10 - obtain manufacturing page 10 + * @ioc: per adapter object + * @mpi_reply: reply mf payload returned from firmware + * @config_page: contents of the config page + * Context: sleep. + * + * Returns 0 for success, non-zero for failure. + */ +int +mpt2sas_config_get_manufacturing_pg10(struct MPT2SAS_ADAPTER *ioc, + Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage10_t *config_page) +{ + Mpi2ConfigRequest_t mpi_request; + int r; + struct config_request mem; + + memset(config_page, 0, sizeof(Mpi2ManufacturingPage10_t)); + memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); + mpi_request.Function = MPI2_FUNCTION_CONFIG; + mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; + mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_MANUFACTURING; + mpi_request.Header.PageNumber = 10; + mpi_request.Header.PageVersion = MPI2_MANUFACTURING0_PAGEVERSION; + mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); + r = _config_request(ioc, &mpi_request, mpi_reply, + MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT); + if (r) + goto out; + + mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; + mpi_request.Header.PageVersion = mpi_reply->Header.PageVersion; + mpi_request.Header.PageNumber = mpi_reply->Header.PageNumber; + mpi_request.Header.PageType = mpi_reply->Header.PageType; + mpi_request.Header.PageLength = mpi_reply->Header.PageLength; + mem.config_page_sz = le16_to_cpu(mpi_reply->Header.PageLength) * 4; + if (mem.config_page_sz > ioc->config_page_sz) { + r = _config_alloc_config_dma_memory(ioc, &mem); + if (r) + goto out; + } else { + mem.config_page_dma = ioc->config_page_dma; + mem.config_page = ioc->config_page; + } + ioc->base_add_sg_single(&mpi_request.PageBufferSGE, + MPT2_CONFIG_COMMON_SGLFLAGS | mem.config_page_sz, + mem.config_page_dma); + r = _config_request(ioc, &mpi_request, mpi_reply, + MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT); + if (!r) + memcpy(config_page, mem.config_page, + min_t(u16, mem.config_page_sz, + sizeof(Mpi2ManufacturingPage10_t))); + + if (mem.config_page_sz > ioc->config_page_sz) + _config_free_config_dma_memory(ioc, &mem); + + out: + return r; +} + +/** * mpt2sas_config_get_bios_pg2 - obtain bios page 2 * @ioc: per adapter object * @mpi_reply: reply mf payload returned from firmware diff --git a/drivers/scsi/mpt2sas/mpt2sas_ctl.c b/drivers/scsi/mpt2sas/mpt2sas_ctl.c index 14e473d1fa7b..c2a51018910f 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_ctl.c +++ b/drivers/scsi/mpt2sas/mpt2sas_ctl.c @@ -1963,7 +1963,6 @@ _ctl_ioctl_main(struct file *file, unsigned int cmd, void __user *arg) { enum block_state state; long ret = -EINVAL; - unsigned long flags; state = (file->f_flags & O_NONBLOCK) ? NON_BLOCKING : BLOCKING; @@ -1989,13 +1988,8 @@ _ctl_ioctl_main(struct file *file, unsigned int cmd, void __user *arg) !ioc) return -ENODEV; - spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); - if (ioc->shost_recovery) { - spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, - flags); + if (ioc->shost_recovery) return -EAGAIN; - } - spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); if (_IOC_SIZE(cmd) == sizeof(struct mpt2_ioctl_command)) { uarg = arg; @@ -2098,7 +2092,6 @@ _ctl_compat_mpt_command(struct file *file, unsigned cmd, unsigned long arg) struct mpt2_ioctl_command karg; struct MPT2SAS_ADAPTER *ioc; enum block_state state; - unsigned long flags; if (_IOC_SIZE(cmd) != sizeof(struct mpt2_ioctl_command32)) return -EINVAL; @@ -2113,13 +2106,8 @@ _ctl_compat_mpt_command(struct file *file, unsigned cmd, unsigned long arg) if (_ctl_verify_adapter(karg32.hdr.ioc_number, &ioc) == -1 || !ioc) return -ENODEV; - spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); - if (ioc->shost_recovery) { - spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, - flags); + if (ioc->shost_recovery) return -EAGAIN; - } - spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); memset(&karg, 0, sizeof(struct mpt2_ioctl_command)); karg.hdr.ioc_number = karg32.hdr.ioc_number; diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c index 2e9a4445596f..bb65cce0491d 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c @@ -103,7 +103,6 @@ struct sense_info { }; -#define MPT2SAS_RESCAN_AFTER_HOST_RESET (0xFFFF) /** * struct fw_event_work - firmware event struct * @list: link list framework @@ -1502,7 +1501,13 @@ _scsih_slave_configure(struct scsi_device *sdev) break; case MPI2_RAID_VOL_TYPE_RAID1E: qdepth = MPT2SAS_RAID_QUEUE_DEPTH; - r_level = "RAID1E"; + if (ioc->manu_pg10.OEMIdentifier && + (ioc->manu_pg10.GenericFlags0 & + MFG10_GF0_R10_DISPLAY) && + !(raid_device->num_pds % 2)) + r_level = "RAID10"; + else + r_level = "RAID1E"; break; case MPI2_RAID_VOL_TYPE_RAID1: qdepth = MPT2SAS_RAID_QUEUE_DEPTH; @@ -1786,17 +1791,18 @@ mpt2sas_scsih_issue_tm(struct MPT2SAS_ADAPTER *ioc, u16 handle, uint lun, u32 ioc_state; unsigned long timeleft; u8 VF_ID = 0; - unsigned long flags; - spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); - if (ioc->tm_cmds.status != MPT2_CMD_NOT_USED || - ioc->shost_recovery) { - spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); + if (ioc->tm_cmds.status != MPT2_CMD_NOT_USED) { + printk(MPT2SAS_INFO_FMT "%s: tm_cmd busy!!!\n", + __func__, ioc->name); + return; + } + + if (ioc->shost_recovery) { printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n", __func__, ioc->name); return; } - spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); ioc_state = mpt2sas_base_get_iocstate(ioc, 0); if (ioc_state & MPI2_DOORBELL_USED) { @@ -2222,7 +2228,7 @@ _scsih_ublock_io_device(struct MPT2SAS_ADAPTER *ioc, u16 handle) MPT2SAS_INFO_FMT "SDEV_RUNNING: " "handle(0x%04x)\n", ioc->name, handle)); sas_device_priv_data->block = 0; - scsi_device_set_state(sdev, SDEV_RUNNING); + scsi_internal_device_unblock(sdev); } } } @@ -2251,7 +2257,7 @@ _scsih_block_io_device(struct MPT2SAS_ADAPTER *ioc, u16 handle) MPT2SAS_INFO_FMT "SDEV_BLOCK: " "handle(0x%04x)\n", ioc->name, handle)); sas_device_priv_data->block = 1; - scsi_device_set_state(sdev, SDEV_BLOCK); + scsi_internal_device_block(sdev); } } } @@ -2327,6 +2333,7 @@ _scsih_block_io_to_children_attached_directly(struct MPT2SAS_ADAPTER *ioc, u16 handle; u16 reason_code; u8 phy_number; + u8 link_rate; for (i = 0; i < event_data->NumEntries; i++) { handle = le16_to_cpu(event_data->PHY[i].AttachedDevHandle); @@ -2337,6 +2344,11 @@ _scsih_block_io_to_children_attached_directly(struct MPT2SAS_ADAPTER *ioc, MPI2_EVENT_SAS_TOPO_RC_MASK; if (reason_code == MPI2_EVENT_SAS_TOPO_RC_DELAY_NOT_RESPONDING) _scsih_block_io_device(ioc, handle); + if (reason_code == MPI2_EVENT_SAS_TOPO_RC_PHY_CHANGED) { + link_rate = event_data->PHY[i].LinkRate >> 4; + if (link_rate >= MPI2_SAS_NEG_LINK_RATE_1_5) + _scsih_ublock_io_device(ioc, handle); + } } } @@ -2405,27 +2417,6 @@ _scsih_check_topo_delete_events(struct MPT2SAS_ADAPTER *ioc, } /** - * _scsih_queue_rescan - queue a topology rescan from user context - * @ioc: per adapter object - * - * Return nothing. - */ -static void -_scsih_queue_rescan(struct MPT2SAS_ADAPTER *ioc) -{ - struct fw_event_work *fw_event; - - if (ioc->wait_for_port_enable_to_complete) - return; - fw_event = kzalloc(sizeof(struct fw_event_work), GFP_ATOMIC); - if (!fw_event) - return; - fw_event->event = MPT2SAS_RESCAN_AFTER_HOST_RESET; - fw_event->ioc = ioc; - _scsih_fw_event_add(ioc, fw_event); -} - -/** * _scsih_flush_running_cmds - completing outstanding commands. * @ioc: per adapter object * @@ -2456,46 +2447,6 @@ _scsih_flush_running_cmds(struct MPT2SAS_ADAPTER *ioc) } /** - * mpt2sas_scsih_reset_handler - reset callback handler (for scsih) - * @ioc: per adapter object - * @reset_phase: phase - * - * The handler for doing any required cleanup or initialization. - * - * The reset phase can be MPT2_IOC_PRE_RESET, MPT2_IOC_AFTER_RESET, - * MPT2_IOC_DONE_RESET - * - * Return nothing. - */ -void -mpt2sas_scsih_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase) -{ - switch (reset_phase) { - case MPT2_IOC_PRE_RESET: - dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " - "MPT2_IOC_PRE_RESET\n", ioc->name, __func__)); - _scsih_fw_event_off(ioc); - break; - case MPT2_IOC_AFTER_RESET: - dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " - "MPT2_IOC_AFTER_RESET\n", ioc->name, __func__)); - if (ioc->tm_cmds.status & MPT2_CMD_PENDING) { - ioc->tm_cmds.status |= MPT2_CMD_RESET; - mpt2sas_base_free_smid(ioc, ioc->tm_cmds.smid); - complete(&ioc->tm_cmds.done); - } - _scsih_fw_event_on(ioc); - _scsih_flush_running_cmds(ioc); - break; - case MPT2_IOC_DONE_RESET: - dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " - "MPT2_IOC_DONE_RESET\n", ioc->name, __func__)); - _scsih_queue_rescan(ioc); - break; - } -} - -/** * _scsih_setup_eedp - setup MPI request for EEDP transfer * @scmd: pointer to scsi command object * @mpi_request: pointer to the SCSI_IO reqest message frame @@ -2615,7 +2566,6 @@ _scsih_qcmd(struct scsi_cmnd *scmd, void (*done)(struct scsi_cmnd *)) Mpi2SCSIIORequest_t *mpi_request; u32 mpi_control; u16 smid; - unsigned long flags; scmd->scsi_done = done; sas_device_priv_data = scmd->device->hostdata; @@ -2634,13 +2584,10 @@ _scsih_qcmd(struct scsi_cmnd *scmd, void (*done)(struct scsi_cmnd *)) } /* see if we are busy with task managment stuff */ - spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); - if (sas_target_priv_data->tm_busy || - ioc->shost_recovery || ioc->ioc_link_reset_in_progress) { - spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); + if (sas_target_priv_data->tm_busy) + return SCSI_MLQUEUE_DEVICE_BUSY; + else if (ioc->shost_recovery || ioc->ioc_link_reset_in_progress) return SCSI_MLQUEUE_HOST_BUSY; - } - spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); if (scmd->sc_data_direction == DMA_FROM_DEVICE) mpi_control = MPI2_SCSIIO_CONTROL_READ; @@ -3436,6 +3383,9 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle) if (!handle) return -1; + if (ioc->shost_recovery) + return -1; + if ((mpt2sas_config_get_expander_pg0(ioc, &mpi_reply, &expander_pg0, MPI2_SAS_EXPAND_PGAD_FORM_HNDL, handle))) { printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", @@ -3572,6 +3522,9 @@ _scsih_expander_remove(struct MPT2SAS_ADAPTER *ioc, u16 handle) struct _sas_node *sas_expander; unsigned long flags; + if (ioc->shost_recovery) + return; + spin_lock_irqsave(&ioc->sas_node_lock, flags); sas_expander = mpt2sas_scsih_expander_find_by_handle(ioc, handle); spin_unlock_irqrestore(&ioc->sas_node_lock, flags); @@ -3743,6 +3696,8 @@ _scsih_remove_device(struct MPT2SAS_ADAPTER *ioc, u16 handle) mutex_unlock(&ioc->tm_cmds.mutex); dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "issue target reset " "done: handle(0x%04x)\n", ioc->name, device_handle)); + if (ioc->shost_recovery) + goto out; } /* SAS_IO_UNIT_CNTR - send REMOVE_DEVICE */ @@ -3765,6 +3720,9 @@ _scsih_remove_device(struct MPT2SAS_ADAPTER *ioc, u16 handle) le32_to_cpu(mpi_reply.IOCLogInfo))); out: + + _scsih_ublock_io_device(ioc, handle); + mpt2sas_transport_port_remove(ioc, sas_device->sas_address, sas_device->parent_handle); @@ -3908,6 +3866,8 @@ _scsih_sas_topology_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, "expander event\n", ioc->name)); return; } + if (ioc->shost_recovery) + return; if (event_data->PHY[i].PhyStatus & MPI2_EVENT_SAS_TOPO_PHYSTATUS_VACANT) continue; @@ -3942,10 +3902,6 @@ _scsih_sas_topology_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, link_rate_); } } - if (reason_code == MPI2_EVENT_SAS_TOPO_RC_PHY_CHANGED) { - if (link_rate_ >= MPI2_SAS_NEG_LINK_RATE_1_5) - _scsih_ublock_io_device(ioc, handle); - } if (reason_code == MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED) { if (link_rate_ < MPI2_SAS_NEG_LINK_RATE_1_5) break; @@ -5156,22 +5112,9 @@ static void _scsih_remove_unresponding_devices(struct MPT2SAS_ADAPTER *ioc) { struct _sas_device *sas_device, *sas_device_next; - struct _sas_node *sas_expander, *sas_expander_next; + struct _sas_node *sas_expander; struct _raid_device *raid_device, *raid_device_next; - unsigned long flags; - - _scsih_search_responding_sas_devices(ioc); - _scsih_search_responding_raid_devices(ioc); - _scsih_search_responding_expanders(ioc); - spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); - ioc->shost_recovery = 0; - if (ioc->shost->shost_state == SHOST_RECOVERY) { - printk(MPT2SAS_INFO_FMT "putting controller into " - "SHOST_RUNNING\n", ioc->name); - scsi_host_set_state(ioc->shost, SHOST_RUNNING); - } - spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); list_for_each_entry_safe(sas_device, sas_device_next, &ioc->sas_device_list, list) { @@ -5207,16 +5150,63 @@ _scsih_remove_unresponding_devices(struct MPT2SAS_ADAPTER *ioc) _scsih_raid_device_remove(ioc, raid_device); } - list_for_each_entry_safe(sas_expander, sas_expander_next, - &ioc->sas_expander_list, list) { + retry_expander_search: + sas_expander = NULL; + list_for_each_entry(sas_expander, &ioc->sas_expander_list, list) { if (sas_expander->responding) { sas_expander->responding = 0; continue; } - printk("\tremoving expander: handle(0x%04x), " - " sas_addr(0x%016llx)\n", sas_expander->handle, - (unsigned long long)sas_expander->sas_address); _scsih_expander_remove(ioc, sas_expander->handle); + goto retry_expander_search; + } +} + +/** + * mpt2sas_scsih_reset_handler - reset callback handler (for scsih) + * @ioc: per adapter object + * @reset_phase: phase + * + * The handler for doing any required cleanup or initialization. + * + * The reset phase can be MPT2_IOC_PRE_RESET, MPT2_IOC_AFTER_RESET, + * MPT2_IOC_DONE_RESET + * + * Return nothing. + */ +void +mpt2sas_scsih_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase) +{ + switch (reset_phase) { + case MPT2_IOC_PRE_RESET: + dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " + "MPT2_IOC_PRE_RESET\n", ioc->name, __func__)); + _scsih_fw_event_off(ioc); + break; + case MPT2_IOC_AFTER_RESET: + dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " + "MPT2_IOC_AFTER_RESET\n", ioc->name, __func__)); + if (ioc->tm_cmds.status & MPT2_CMD_PENDING) { + ioc->tm_cmds.status |= MPT2_CMD_RESET; + mpt2sas_base_free_smid(ioc, ioc->tm_cmds.smid); + complete(&ioc->tm_cmds.done); + } + _scsih_fw_event_on(ioc); + _scsih_flush_running_cmds(ioc); + break; + case MPT2_IOC_DONE_RESET: + dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " + "MPT2_IOC_DONE_RESET\n", ioc->name, __func__)); + _scsih_sas_host_refresh(ioc, 0); + _scsih_search_responding_sas_devices(ioc); + _scsih_search_responding_raid_devices(ioc); + _scsih_search_responding_expanders(ioc); + break; + case MPT2_IOC_RUNNING: + dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " + "MPT2_IOC_RUNNING\n", ioc->name, __func__)); + _scsih_remove_unresponding_devices(ioc); + break; } } @@ -5236,14 +5226,6 @@ _firmware_event_work(struct work_struct *work) unsigned long flags; struct MPT2SAS_ADAPTER *ioc = fw_event->ioc; - /* This is invoked by calling _scsih_queue_rescan(). */ - if (fw_event->event == MPT2SAS_RESCAN_AFTER_HOST_RESET) { - _scsih_fw_event_free(ioc, fw_event); - _scsih_sas_host_refresh(ioc, 1); - _scsih_remove_unresponding_devices(ioc); - return; - } - /* the queue is being flushed so ignore this event */ spin_lock_irqsave(&ioc->fw_event_lock, flags); if (ioc->fw_events_off || ioc->remove_host) { @@ -5253,13 +5235,10 @@ _firmware_event_work(struct work_struct *work) } spin_unlock_irqrestore(&ioc->fw_event_lock, flags); - spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); if (ioc->shost_recovery) { - spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); _scsih_fw_event_requeue(ioc, fw_event, 1000); return; } - spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); switch (fw_event->event) { case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST: @@ -5461,6 +5440,8 @@ _scsih_expander_node_remove(struct MPT2SAS_ADAPTER *ioc, if (!sas_device) continue; _scsih_remove_device(ioc, sas_device->handle); + if (ioc->shost_recovery) + return; goto retry_device_search; } } @@ -5482,6 +5463,8 @@ _scsih_expander_node_remove(struct MPT2SAS_ADAPTER *ioc, if (!expander_sibling) continue; _scsih_expander_remove(ioc, expander_sibling->handle); + if (ioc->shost_recovery) + return; goto retry_expander_search; } } @@ -5513,6 +5496,8 @@ _scsih_remove(struct pci_dev *pdev) struct _sas_port *mpt2sas_port; struct _sas_device *sas_device; struct _sas_node *expander_sibling; + struct _raid_device *raid_device, *next; + struct MPT2SAS_TARGET *sas_target_priv_data; struct workqueue_struct *wq; unsigned long flags; @@ -5526,6 +5511,21 @@ _scsih_remove(struct pci_dev *pdev) if (wq) destroy_workqueue(wq); + /* release all the volumes */ + list_for_each_entry_safe(raid_device, next, &ioc->raid_device_list, + list) { + if (raid_device->starget) { + sas_target_priv_data = + raid_device->starget->hostdata; + sas_target_priv_data->deleted = 1; + scsi_remove_target(&raid_device->starget->dev); + } + printk(MPT2SAS_INFO_FMT "removing handle(0x%04x), wwid" + "(0x%016llx)\n", ioc->name, raid_device->handle, + (unsigned long long) raid_device->wwid); + _scsih_raid_device_remove(ioc, raid_device); + } + /* free ports attached to the sas_host */ retry_again: list_for_each_entry(mpt2sas_port, diff --git a/drivers/scsi/mpt2sas/mpt2sas_transport.c b/drivers/scsi/mpt2sas/mpt2sas_transport.c index 686695b155c7..a53086d0381a 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_transport.c +++ b/drivers/scsi/mpt2sas/mpt2sas_transport.c @@ -140,11 +140,18 @@ _transport_set_identify(struct MPT2SAS_ADAPTER *ioc, u16 handle, u32 device_info; u32 ioc_status; + if (ioc->shost_recovery) { + printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n", + __func__, ioc->name); + return -EFAULT; + } + if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) { printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", + ioc->name, __FILE__, __LINE__, __func__); - return -1; + return -ENXIO; } ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & @@ -153,7 +160,7 @@ _transport_set_identify(struct MPT2SAS_ADAPTER *ioc, u16 handle, printk(MPT2SAS_ERR_FMT "handle(0x%04x), ioc_status(0x%04x)" "\nfailure at %s:%d/%s()!\n", ioc->name, handle, ioc_status, __FILE__, __LINE__, __func__); - return -1; + return -EIO; } memset(identify, 0, sizeof(identify)); @@ -288,21 +295,17 @@ _transport_expander_report_manufacture(struct MPT2SAS_ADAPTER *ioc, void *psge; u32 sgl_flags; u8 issue_reset = 0; - unsigned long flags; void *data_out = NULL; dma_addr_t data_out_dma; u32 sz; u64 *sas_address_le; u16 wait_state_count; - spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); - if (ioc->ioc_reset_in_progress) { - spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); + if (ioc->shost_recovery) { printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n", __func__, ioc->name); return -EFAULT; } - spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); mutex_lock(&ioc->transport_cmds.mutex); @@ -806,6 +809,12 @@ mpt2sas_transport_update_phy_link_change(struct MPT2SAS_ADAPTER *ioc, struct _sas_node *sas_node; struct _sas_phy *mpt2sas_phy; + if (ioc->shost_recovery) { + printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n", + __func__, ioc->name); + return; + } + spin_lock_irqsave(&ioc->sas_node_lock, flags); sas_node = _transport_sas_node_find_by_handle(ioc, handle); spin_unlock_irqrestore(&ioc->sas_node_lock, flags); @@ -1025,7 +1034,6 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, void *psge; u32 sgl_flags; u8 issue_reset = 0; - unsigned long flags; dma_addr_t dma_addr_in = 0; dma_addr_t dma_addr_out = 0; u16 wait_state_count; @@ -1045,14 +1053,11 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, return -EINVAL; } - spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); - if (ioc->ioc_reset_in_progress) { - spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); + if (ioc->shost_recovery) { printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n", __func__, ioc->name); return -EFAULT; } - spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); rc = mutex_lock_interruptible(&ioc->transport_cmds.mutex); if (rc) diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 0f8796201504..67e016d29f96 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c @@ -1654,7 +1654,8 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable) fc_vport_set_state(fc_vport, FC_VPORT_LINKDOWN); } - if (scsi_add_host(vha->host, &fc_vport->dev)) { + if (scsi_add_host_with_dma(vha->host, &fc_vport->dev, + &ha->pdev->dev)) { DEBUG15(printk("scsi(%ld): scsi_add_host failure for VP[%d].\n", vha->host_no, vha->vp_idx)); goto vport_create_failed_2; diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index 2de5f3ad640b..69397bb964a4 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c @@ -241,10 +241,7 @@ scsi_host_alloc_command(struct Scsi_Host *shost, gfp_t gfp_mask) */ struct scsi_cmnd *__scsi_get_command(struct Scsi_Host *shost, gfp_t gfp_mask) { - struct scsi_cmnd *cmd; - unsigned char *buf; - - cmd = scsi_host_alloc_command(shost, gfp_mask); + struct scsi_cmnd *cmd = scsi_host_alloc_command(shost, gfp_mask); if (unlikely(!cmd)) { unsigned long flags; @@ -258,9 +255,15 @@ struct scsi_cmnd *__scsi_get_command(struct Scsi_Host *shost, gfp_t gfp_mask) spin_unlock_irqrestore(&shost->free_list_lock, flags); if (cmd) { + void *buf, *prot; + buf = cmd->sense_buffer; + prot = cmd->prot_sdb; + memset(cmd, 0, sizeof(*cmd)); + cmd->sense_buffer = buf; + cmd->prot_sdb = prot; } } diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index a1689353d7fd..c253e9c051b2 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c @@ -721,6 +721,9 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd, case NEEDS_RETRY: case FAILED: break; + case ADD_TO_MLQUEUE: + rtn = NEEDS_RETRY; + break; default: rtn = FAILED; break; diff --git a/drivers/scsi/scsi_lib_dma.c b/drivers/scsi/scsi_lib_dma.c index ac6855cd2657..dcd128583b89 100644 --- a/drivers/scsi/scsi_lib_dma.c +++ b/drivers/scsi/scsi_lib_dma.c @@ -23,7 +23,7 @@ int scsi_dma_map(struct scsi_cmnd *cmd) int nseg = 0; if (scsi_sg_count(cmd)) { - struct device *dev = cmd->device->host->shost_gendev.parent; + struct device *dev = cmd->device->host->dma_dev; nseg = dma_map_sg(dev, scsi_sglist(cmd), scsi_sg_count(cmd), cmd->sc_data_direction); @@ -41,7 +41,7 @@ EXPORT_SYMBOL(scsi_dma_map); void scsi_dma_unmap(struct scsi_cmnd *cmd) { if (scsi_sg_count(cmd)) { - struct device *dev = cmd->device->host->shost_gendev.parent; + struct device *dev = cmd->device->host->dma_dev; dma_unmap_sg(dev, scsi_sglist(cmd), scsi_sg_count(cmd), cmd->sc_data_direction); diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index 292c02f810d0..7c3264ed146d 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c @@ -648,11 +648,22 @@ static __init int fc_transport_init(void) return error; error = transport_class_register(&fc_vport_class); if (error) - return error; + goto unreg_host_class; error = transport_class_register(&fc_rport_class); if (error) - return error; - return transport_class_register(&fc_transport_class); + goto unreg_vport_class; + error = transport_class_register(&fc_transport_class); + if (error) + goto unreg_rport_class; + return 0; + +unreg_rport_class: + transport_class_unregister(&fc_rport_class); +unreg_vport_class: + transport_class_unregister(&fc_vport_class); +unreg_host_class: + transport_class_unregister(&fc_host_class); + return error; } static void __exit fc_transport_exit(void) diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index b7b9fec67a98..a89c421dab51 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -2021,6 +2021,7 @@ static void sd_probe_async(void *data, async_cookie_t cookie) sd_printk(KERN_NOTICE, sdkp, "Attached SCSI %sdisk\n", sdp->removable ? "removable " : ""); + put_device(&sdkp->dev); } /** @@ -2106,6 +2107,7 @@ static int sd_probe(struct device *dev) get_device(&sdp->sdev_gendev); + get_device(&sdkp->dev); /* prevent release before async_schedule */ async_schedule(sd_probe_async, sdkp); return 0; diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 9230402c45af..dc0e3d4eacc2 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -1708,11 +1708,6 @@ static int sg_finish_rem_req(Sg_request * srp) Sg_scatter_hold *req_schp = &srp->data; SCSI_LOG_TIMEOUT(4, printk("sg_finish_rem_req: res_used=%d\n", (int) srp->res_used)); - if (srp->res_used) - sg_unlink_reserve(sfp, srp); - else - sg_remove_scat(req_schp); - if (srp->rq) { if (srp->bio) ret = blk_rq_unmap_user(srp->bio); @@ -1720,6 +1715,11 @@ static int sg_finish_rem_req(Sg_request * srp) blk_put_request(srp->rq); } + if (srp->res_used) + sg_unlink_reserve(sfp, srp); + else + sg_remove_scat(req_schp); + sg_remove_request(sfp, srp); return ret; @@ -1811,7 +1811,7 @@ retry: return 0; out: for (i = 0; i < k; i++) - __free_pages(schp->pages[k], order); + __free_pages(schp->pages[i], order); if (--order >= 0) goto retry; diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index d5da26f34cee..ecbf0dac375a 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c @@ -81,6 +81,9 @@ static int serial_index(struct uart_port *port) #define PASS_LIMIT 256 +#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) + + /* * We default to IRQ0 for the "no irq" hack. Some * machine types want others as well - they're free @@ -1342,14 +1345,12 @@ static void serial8250_start_tx(struct uart_port *port) serial_out(up, UART_IER, up->ier); if (up->bugs & UART_BUG_TXEN) { - unsigned char lsr, iir; + unsigned char lsr; lsr = serial_in(up, UART_LSR); up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; - iir = serial_in(up, UART_IIR) & 0x0f; if ((up->port.type == PORT_RM9000) ? - (lsr & UART_LSR_THRE && - (iir == UART_IIR_NO_INT || iir == UART_IIR_THRI)) : - (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT)) + (lsr & UART_LSR_THRE) : + (lsr & UART_LSR_TEMT)) transmit_chars(up); } } @@ -1802,7 +1803,7 @@ static unsigned int serial8250_tx_empty(struct uart_port *port) up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; spin_unlock_irqrestore(&up->port.lock, flags); - return lsr & UART_LSR_TEMT ? TIOCSER_TEMT : 0; + return (lsr & BOTH_EMPTY) == BOTH_EMPTY ? TIOCSER_TEMT : 0; } static unsigned int serial8250_get_mctrl(struct uart_port *port) @@ -1860,8 +1861,6 @@ static void serial8250_break_ctl(struct uart_port *port, int break_state) spin_unlock_irqrestore(&up->port.lock, flags); } -#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) - /* * Wait for transmitter & holding register to empty */ diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c index e7108e75653d..7b5ff096c2db 100644 --- a/drivers/serial/8250_pci.c +++ b/drivers/serial/8250_pci.c @@ -1561,6 +1561,7 @@ enum pci_board_num_t { pbn_exar_XR17C152, pbn_exar_XR17C154, pbn_exar_XR17C158, + pbn_exar_ibm_saturn, pbn_pasemi_1682M, pbn_ni8430_2, pbn_ni8430_4, @@ -2146,6 +2147,13 @@ static struct pciserial_board pci_boards[] __devinitdata = { .base_baud = 921600, .uart_offset = 0x200, }, + [pbn_exar_ibm_saturn] = { + .flags = FL_BASE0, + .num_ports = 1, + .base_baud = 921600, + .uart_offset = 0x200, + }, + /* * PA Semi PWRficient PA6T-1682M on-chip UART */ @@ -2649,6 +2657,9 @@ static struct pci_device_id serial_pci_tbl[] = { PCI_SUBVENDOR_ID_CONNECT_TECH, PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_485, 0, 0, pbn_b0_8_1843200_200 }, + { PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17C152, + PCI_VENDOR_ID_IBM, PCI_SUBDEVICE_ID_IBM_SATURN_SERIAL_ONE_PORT, + 0, 0, pbn_exar_ibm_saturn }, { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_U530, PCI_ANY_ID, PCI_ANY_ID, 0, 0, diff --git a/drivers/serial/8250_pnp.c b/drivers/serial/8250_pnp.c index d71dfe398940..9fb71903c107 100644 --- a/drivers/serial/8250_pnp.c +++ b/drivers/serial/8250_pnp.c @@ -328,15 +328,7 @@ static const struct pnp_device_id pnp_dev_table[] = { /* U.S. Robotics 56K Voice INT PnP*/ { "USR9190", 0 }, /* Wacom tablets */ - { "WACF004", 0 }, - { "WACF005", 0 }, - { "WACF006", 0 }, - { "WACF007", 0 }, - { "WACF008", 0 }, - { "WACF009", 0 }, - { "WACF00A", 0 }, - { "WACF00B", 0 }, - { "WACF00C", 0 }, + { "WACFXXX", 0 }, /* Compaq touchscreen */ { "FPI2002", 0 }, /* Fujitsu Stylistic touchscreens */ diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index b41db4d22436..869337a7fd68 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig @@ -373,24 +373,6 @@ config SERIAL_MXS_AUART help Driver for Freescale i.MXS internal application serial port -config SERIAL_MXS_AUART_CONSOLE - bool "Support for console on i.MXS application serial port" - depends on SERIAL_MXS_AUART=y - select SERIAL_CORE_CONSOLE - ---help--- - Say Y here if you wish to use the i.MXS app serial port as the - system console (the system console is the device which receives all - kernel messages and warnings and which allows logins in single user - mode). - - Even if you say Y here, the currently visible framebuffer console - (/dev/tty0) will still be used as the system console by default, but - you can alter that using a kernel command line option such as - "console=ttySP1". (Try "man bootparam" or see the documentation of - your boot loader (lilo or loadlin) about how to pass options to the - kernel at boot time.) - - config SERIAL_MXS_DUART_CONSOLE bool "Support for console on i.MXS debug serial port" depends on SERIAL_MXS_DUART=y diff --git a/drivers/serial/bfin_5xx.c b/drivers/serial/bfin_5xx.c index b4a7650af696..4fff4e524034 100644 --- a/drivers/serial/bfin_5xx.c +++ b/drivers/serial/bfin_5xx.c @@ -42,6 +42,10 @@ # undef CONFIG_EARLY_PRINTK #endif +#ifdef CONFIG_SERIAL_BFIN_MODULE +# undef CONFIG_EARLY_PRINTK +#endif + /* UART name and device definitions */ #define BFIN_SERIAL_NAME "ttyBF" #define BFIN_SERIAL_MAJOR 204 diff --git a/drivers/serial/mxs-auart.c b/drivers/serial/mxs-auart.c index 63d7d9128efc..0791af105f72 100644 --- a/drivers/serial/mxs-auart.c +++ b/drivers/serial/mxs-auart.c @@ -19,7 +19,6 @@ #include <linux/device.h> #include <linux/errno.h> #include <linux/init.h> -#include <linux/console.h> #include <linux/interrupt.h> #include <linux/module.h> #include <linux/slab.h> @@ -48,8 +47,6 @@ #define MXS_AUART_MAJOR 242 #define MXS_AUART_RX_THRESHOLD 16 -static struct uart_driver auart_driver; - struct mxs_auart_port { struct uart_port port; @@ -788,160 +785,7 @@ static struct uart_ops mxs_auart_ops = { .config_port = mxs_auart_config_port, .verify_port = mxs_auart_verify_port, }; -#ifdef CONFIG_SERIAL_MXS_AUART_CONSOLE -static struct mxs_auart_port auart_port[CONFIG_MXS_AUART_PORTS] = {}; - -static void -auart_console_write(struct console *co, const char *s, unsigned int count) -{ - struct uart_port *port; - unsigned int status, old_cr; - int i; - - if (co->index > CONFIG_MXS_AUART_PORTS || co->index < 0) - return; - port = &auart_port[co->index].port; - - /* First save the CR then disable the interrupts */ - old_cr = __raw_readl(port->membase + HW_UARTAPP_CTRL2); - __raw_writel(BM_UARTAPP_CTRL2_UARTEN | BM_UARTAPP_CTRL2_TXE, - port->membase + HW_UARTAPP_CTRL2_SET); - - /* Now, do each character */ - for (i = 0; i < count; i++) { - do { - status = __raw_readl(port->membase + HW_UARTAPP_STAT); - } while (status & BM_UARTAPP_STAT_TXFF); - - __raw_writel(s[i], port->membase + HW_UARTAPP_DATA); - if (s[i] == '\n') { - do { - status = __raw_readl(port->membase + - HW_UARTAPP_STAT); - } while (status & BM_UARTAPP_STAT_TXFF); - __raw_writel('\r', port->membase + HW_UARTAPP_DATA); - } - } - - /* - * Finally, wait for transmitter to become empty - * and restore the TCR - */ - do { - status = __raw_readl(port->membase + HW_UARTAPP_STAT); - } while (status & BM_UARTAPP_STAT_BUSY); - __raw_writel(old_cr, port->membase + HW_UARTAPP_CTRL2); -} - -static void __init -auart_console_get_options(struct uart_port *port, int *baud, - int *parity, int *bits) -{ - if (__raw_readl(port->membase + HW_UARTAPP_CTRL2) - & BM_UARTAPP_CTRL2_UARTEN) { - unsigned int lcr_h, quot; - lcr_h = __raw_readl(port->membase + HW_UARTAPP_LINECTRL); - - *parity = 'n'; - if (lcr_h & BM_UARTAPP_LINECTRL_PEN) { - if (lcr_h & BM_UARTAPP_LINECTRL_EPS) - *parity = 'e'; - else - *parity = 'o'; - } - - if ((lcr_h & BM_UARTAPP_LINECTRL_WLEN) - == BF_UARTAPP_LINECTRL_WLEN(2)) - *bits = 7; - else - *bits = 8; - - quot = (((__raw_readl(port->membase + HW_UARTAPP_LINECTRL) - & BM_UARTAPP_LINECTRL_BAUD_DIVINT)) - >> (BP_UARTAPP_LINECTRL_BAUD_DIVINT - 6)) - | (((__raw_readl(port->membase + HW_UARTAPP_LINECTRL) - & BM_UARTAPP_LINECTRL_BAUD_DIVFRAC)) - >> BP_UARTAPP_LINECTRL_BAUD_DIVFRAC); - if (quot == 0) - quot = 1; - *baud = (port->uartclk << 2) / quot; - } -} - -static int __init auart_console_setup(struct console *co, char *options) -{ - struct mxs_auart_port *port; - int baud = 115200; - int bits = 8; - int parity = 'n'; - int flow = 'n'; - /* - * Check whether an invalid uart number has been specified, and - * if so, search for the first available port that does have - * console support. - */ - if (co->index > CONFIG_MXS_AUART_PORTS || co->index < 0) - return -EINVAL; - - port = &auart_port[co->index].port; - - if (port->port.membase == 0) { - if (cpu_is_mx23()) { - if (co->index == 1) { - port->port.membase = IO_ADDRESS(0x8006C000); - port->port.mapbase = 0x8006C000; - } else { - port->port.membase = IO_ADDRESS(0x8006E000); - port->port.mapbase = 0x8006E000; - } - } - - port->port.fifosize = 16; - port->port.ops = &mxs_auart_ops; - port->port.flags = ASYNC_BOOT_AUTOCONF; - port->port.line = 0; - } - mxs_auart_reset(port); - - __raw_writel(BM_UARTAPP_CTRL2_UARTEN, - port->port.membase + HW_UARTAPP_CTRL2_SET); - - if (port->clk == NULL || IS_ERR(port->clk)) { - port->clk = clk_get(NULL, "uart"); - if (port->clk == NULL || IS_ERR(port->clk)) - return -ENODEV; - port->port.uartclk = clk_get_rate(port->clk); - } - - if (options) - uart_parse_options(options, &baud, &parity, &bits, &flow); - else - auart_console_get_options(port, &baud, &parity, &bits); - return uart_set_options(port, co, baud, parity, bits, flow); -} - -static struct console auart_console = { - .name = "ttySP", - .write = auart_console_write, - .device = uart_console_device, - .setup = auart_console_setup, - .flags = CON_PRINTBUFFER, - .index = -1, - .data = &auart_driver, -}; - -#ifdef CONFIG_MXS_EARLY_CONSOLE -static int __init auart_console_init(void) -{ - register_console(&auart_console); - return 0; -} - -console_initcall(auart_console_init); -#endif - -#endif static struct uart_driver auart_driver = { .owner = THIS_MODULE, .driver_name = "auart", @@ -949,9 +793,6 @@ static struct uart_driver auart_driver = { .major = MXS_AUART_MAJOR, .minor = 0, .nr = CONFIG_MXS_AUART_PORTS, -#ifdef CONFIG_SERIAL_MXS_AUART_CONSOLE - .cons = &auart_console, -#endif }; static int __devinit mxs_auart_probe(struct platform_device *pdev) @@ -1032,10 +873,6 @@ static int __devinit mxs_auart_probe(struct platform_device *pdev) device_init_wakeup(&pdev->dev, 1); -#ifdef CONFIG_SERIAL_MXS_AUART_CONSOLE - memcpy(&auart_port[pdev->id], s, sizeof(struct mxs_auart_port)); -#endif - ret = uart_add_one_port(&auart_driver, &s->port); if (ret) goto out_free_clk; diff --git a/drivers/serial/of_serial.c b/drivers/serial/of_serial.c index 02406ba6da1c..cdf172eda2e3 100644 --- a/drivers/serial/of_serial.c +++ b/drivers/serial/of_serial.c @@ -161,6 +161,7 @@ static int of_platform_serial_remove(struct of_device *ofdev) static struct of_device_id __devinitdata of_platform_serial_table[] = { { .type = "serial", .compatible = "ns8250", .data = (void *)PORT_8250, }, { .type = "serial", .compatible = "ns16450", .data = (void *)PORT_16450, }, + { .type = "serial", .compatible = "ns16550a", .data = (void *)PORT_16550A, }, { .type = "serial", .compatible = "ns16550", .data = (void *)PORT_16550, }, { .type = "serial", .compatible = "ns16750", .data = (void *)PORT_16750, }, { .type = "serial", .compatible = "ns16850", .data = (void *)PORT_16850, }, diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index 79c9c5f5cdba..6ecb51baf56e 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c @@ -884,6 +884,7 @@ static struct pcmcia_device_id serial_ids[] = { PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */ PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */ PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "MT5634ZLX.cis"), + PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "COMpad2.cis"), PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "COMpad4.cis"), PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "COMpad2.cis"), PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "RS-COM-2P.cis"), diff --git a/drivers/serial/suncore.c b/drivers/serial/suncore.c index a2d4a19550ab..ed7d958b0a01 100644 --- a/drivers/serial/suncore.c +++ b/drivers/serial/suncore.c @@ -53,20 +53,21 @@ void sunserial_unregister_minors(struct uart_driver *drv, int count) EXPORT_SYMBOL(sunserial_unregister_minors); int sunserial_console_match(struct console *con, struct device_node *dp, - struct uart_driver *drv, int line) + struct uart_driver *drv, int line, bool ignore_line) { - int off; - if (!con || of_console_device != dp) return 0; - off = 0; - if (of_console_options && - *of_console_options == 'b') - off = 1; + if (!ignore_line) { + int off = 0; - if ((line & 1) != off) - return 0; + if (of_console_options && + *of_console_options == 'b') + off = 1; + + if ((line & 1) != off) + return 0; + } con->index = line; drv->cons = con; @@ -76,23 +77,24 @@ int sunserial_console_match(struct console *con, struct device_node *dp, } EXPORT_SYMBOL(sunserial_console_match); -void -sunserial_console_termios(struct console *con) +void sunserial_console_termios(struct console *con, struct device_node *uart_dp) { - struct device_node *dp; - const char *od, *mode, *s; + const char *mode, *s; char mode_prop[] = "ttyX-mode"; int baud, bits, stop, cflag; char parity; - dp = of_find_node_by_path("/options"); - od = of_get_property(dp, "output-device", NULL); - if (!strcmp(od, "rsc")) { - mode = of_get_property(of_console_device, + if (!strcmp(uart_dp->name, "rsc") || + !strcmp(uart_dp->name, "rsc-console") || + !strcmp(uart_dp->name, "rsc-control")) { + mode = of_get_property(uart_dp, "ssp-console-modes", NULL); if (!mode) mode = "115200,8,n,1,-"; + } else if (!strcmp(uart_dp->name, "lom-console")) { + mode = "9600,8,n,1,-"; } else { + struct device_node *dp; char c; c = 'a'; @@ -101,6 +103,7 @@ sunserial_console_termios(struct console *con) mode_prop[3] = c; + dp = of_find_node_by_path("/options"); mode = of_get_property(dp, mode_prop, NULL); if (!mode) mode = "9600,8,n,1,-"; diff --git a/drivers/serial/suncore.h b/drivers/serial/suncore.h index 042668aa602e..db2057936c31 100644 --- a/drivers/serial/suncore.h +++ b/drivers/serial/suncore.h @@ -26,7 +26,8 @@ extern int sunserial_register_minors(struct uart_driver *, int); extern void sunserial_unregister_minors(struct uart_driver *, int); extern int sunserial_console_match(struct console *, struct device_node *, - struct uart_driver *, int); -extern void sunserial_console_termios(struct console *); + struct uart_driver *, int, bool); +extern void sunserial_console_termios(struct console *, + struct device_node *); #endif /* !(_SERIAL_SUN_H) */ diff --git a/drivers/serial/sunhv.c b/drivers/serial/sunhv.c index 1df5325faab2..3b6953aa5d03 100644 --- a/drivers/serial/sunhv.c +++ b/drivers/serial/sunhv.c @@ -566,7 +566,7 @@ static int __devinit hv_probe(struct of_device *op, const struct of_device_id *m goto out_free_con_read_page; sunserial_console_match(&sunhv_console, op->node, - &sunhv_reg, port->line); + &sunhv_reg, port->line, false); err = uart_add_one_port(&sunhv_reg, port); if (err) diff --git a/drivers/serial/sunsab.c b/drivers/serial/sunsab.c index 0355efe115d9..9cbf597e0ab8 100644 --- a/drivers/serial/sunsab.c +++ b/drivers/serial/sunsab.c @@ -883,7 +883,7 @@ static int sunsab_console_setup(struct console *con, char *options) printk("Console: ttyS%d (SAB82532)\n", (sunsab_reg.minor - 64) + con->index); - sunserial_console_termios(con); + sunserial_console_termios(con, to_of_device(up->port.dev)->node); switch (con->cflag & CBAUD) { case B150: baud = 150; break; @@ -1027,10 +1027,12 @@ static int __devinit sab_probe(struct of_device *op, const struct of_device_id * goto out1; sunserial_console_match(SUNSAB_CONSOLE(), op->node, - &sunsab_reg, up[0].port.line); + &sunsab_reg, up[0].port.line, + false); sunserial_console_match(SUNSAB_CONSOLE(), op->node, - &sunsab_reg, up[1].port.line); + &sunsab_reg, up[1].port.line, + false); err = uart_add_one_port(&sunsab_reg, &up[0].port); if (err) @@ -1116,7 +1118,6 @@ static int __init sunsab_init(void) if (!sunsab_ports) return -ENOMEM; - sunsab_reg.cons = SUNSAB_CONSOLE(); err = sunserial_register_minors(&sunsab_reg, num_channels); if (err) { kfree(sunsab_ports); diff --git a/drivers/serial/sunsu.c b/drivers/serial/sunsu.c index 47c6837850b1..ab91166b1b16 100644 --- a/drivers/serial/sunsu.c +++ b/drivers/serial/sunsu.c @@ -1329,11 +1329,9 @@ static void sunsu_console_write(struct console *co, const char *s, */ static int __init sunsu_console_setup(struct console *co, char *options) { + static struct ktermios dummy; + struct ktermios termios; struct uart_port *port; - int baud = 9600; - int bits = 8; - int parity = 'n'; - int flow = 'n'; printk("Console: ttyS%d (SU)\n", (sunsu_reg.minor - 64) + co->index); @@ -1352,10 +1350,15 @@ static int __init sunsu_console_setup(struct console *co, char *options) */ spin_lock_init(&port->lock); - if (options) - uart_parse_options(options, &baud, &parity, &bits, &flow); + /* Get firmware console settings. */ + sunserial_console_termios(co, to_of_device(port->dev)->node); - return uart_set_options(port, co, baud, parity, bits, flow); + memset(&termios, 0, sizeof(struct ktermios)); + termios.c_cflag = co->cflag; + port->mctrl |= TIOCM_DTR; + port->ops->set_termios(port, &termios, &dummy); + + return 0; } static struct console sunsu_console = { @@ -1409,6 +1412,7 @@ static int __devinit su_probe(struct of_device *op, const struct of_device_id *m struct uart_sunsu_port *up; struct resource *rp; enum su_type type; + bool ignore_line; int err; type = su_get_type(dp); @@ -1467,8 +1471,14 @@ static int __devinit su_probe(struct of_device *op, const struct of_device_id *m up->port.ops = &sunsu_pops; + ignore_line = false; + if (!strcmp(dp->name, "rsc-console") || + !strcmp(dp->name, "lom-console")) + ignore_line = true; + sunserial_console_match(SUNSU_CONSOLE(), dp, - &sunsu_reg, up->port.line); + &sunsu_reg, up->port.line, + ignore_line); err = uart_add_one_port(&sunsu_reg, &up->port); if (err) goto out_unmap; @@ -1517,6 +1527,10 @@ static const struct of_device_id su_match[] = { .name = "serial", .compatible = "su", }, + { + .type = "serial", + .compatible = "su", + }, {}, }; MODULE_DEVICE_TABLE(of, su_match); @@ -1548,6 +1562,12 @@ static int __init sunsu_init(void) num_uart++; } } + for_each_node_by_type(dp, "serial") { + if (of_device_is_compatible(dp, "su")) { + if (su_get_type(dp) == SU_PORT_PORT) + num_uart++; + } + } if (num_uart) { err = sunserial_register_minors(&sunsu_reg, num_uart); diff --git a/drivers/serial/sunzilog.c b/drivers/serial/sunzilog.c index e09d3cebb4fb..0a2a3335f30f 100644 --- a/drivers/serial/sunzilog.c +++ b/drivers/serial/sunzilog.c @@ -1180,7 +1180,7 @@ static int __init sunzilog_console_setup(struct console *con, char *options) (sunzilog_reg.minor - 64) + con->index, con->index); /* Get firmware console settings. */ - sunserial_console_termios(con); + sunserial_console_termios(con, to_of_device(up->port.dev)->node); /* Firmware console speed is limited to 150-->38400 baud so * this hackish cflag thing is OK. @@ -1416,7 +1416,8 @@ static int __devinit zs_probe(struct of_device *op, const struct of_device_id *m if (!keyboard_mouse) { if (sunserial_console_match(SUNZILOG_CONSOLE(), op->node, - &sunzilog_reg, up[0].port.line)) + &sunzilog_reg, up[0].port.line, + false)) up->flags |= SUNZILOG_FLAG_IS_CONS; err = uart_add_one_port(&sunzilog_reg, &up[0].port); if (err) { @@ -1425,7 +1426,8 @@ static int __devinit zs_probe(struct of_device *op, const struct of_device_id *m return err; } if (sunserial_console_match(SUNZILOG_CONSOLE(), op->node, - &sunzilog_reg, up[1].port.line)) + &sunzilog_reg, up[1].port.line, + false)) up->flags |= SUNZILOG_FLAG_IS_CONS; err = uart_add_one_port(&sunzilog_reg, &up[1].port); if (err) { diff --git a/drivers/ssb/sprom.c b/drivers/ssb/sprom.c index 8943015a3eef..eb708431cb96 100644 --- a/drivers/ssb/sprom.c +++ b/drivers/ssb/sprom.c @@ -13,6 +13,8 @@ #include "ssb_private.h" +#include <linux/ctype.h> + static const struct ssb_sprom *fallback_sprom; @@ -33,17 +35,27 @@ static int sprom2hex(const u16 *sprom, char *buf, size_t buf_len, static int hex2sprom(u16 *sprom, const char *dump, size_t len, size_t sprom_size_words) { - char tmp[5] = { 0 }; - int cnt = 0; + char c, tmp[5] = { 0 }; + int err, cnt = 0; unsigned long parsed; - if (len < sprom_size_words * 2) + /* Strip whitespace at the end. */ + while (len) { + c = dump[len - 1]; + if (!isspace(c) && c != '\0') + break; + len--; + } + /* Length must match exactly. */ + if (len != sprom_size_words * 4) return -EINVAL; while (cnt < sprom_size_words) { memcpy(tmp, dump, 4); dump += 4; - parsed = simple_strtoul(tmp, NULL, 16); + err = strict_strtoul(tmp, 16, &parsed); + if (err) + return err; sprom[cnt++] = swab16((u16)parsed); } diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c index da7c984b5641..17d89a8124ad 100644 --- a/drivers/staging/android/binder.c +++ b/drivers/staging/android/binder.c @@ -43,7 +43,6 @@ static struct proc_dir_entry *binder_proc_dir_entry_proc; static struct hlist_head binder_dead_nodes; static HLIST_HEAD(binder_deferred_list); static DEFINE_MUTEX(binder_deferred_lock); -static struct workqueue_struct *binder_deferred_workqueue; static int binder_read_proc_proc(char *page, char **start, off_t off, int count, int *eof, void *data); @@ -2987,7 +2986,6 @@ static void binder_deferred_release(struct binder_proc *proc) int i; for (i = 0; i < proc->buffer_size / PAGE_SIZE; i++) { if (proc->pages[i]) { - void *page_addr = proc->buffer + i * PAGE_SIZE; if (binder_debug_mask & BINDER_DEBUG_BUFFER_ALLOC) printk(KERN_INFO @@ -2995,8 +2993,6 @@ static void binder_deferred_release(struct binder_proc *proc) "page %d at %p not freed\n", proc->pid, i, proc->buffer + i * PAGE_SIZE); - unmap_kernel_range((unsigned long)page_addr, - PAGE_SIZE); __free_page(proc->pages[i]); page_count++; } @@ -3066,7 +3062,7 @@ static void binder_defer_work(struct binder_proc *proc, int defer) if (hlist_unhashed(&proc->deferred_work_node)) { hlist_add_head(&proc->deferred_work_node, &binder_deferred_list); - queue_work(binder_deferred_workqueue, &binder_deferred_work); + schedule_work(&binder_deferred_work); } mutex_unlock(&binder_deferred_lock); } @@ -3694,10 +3690,6 @@ static int __init binder_init(void) { int ret; - binder_deferred_workqueue = create_singlethread_workqueue("binder"); - if (!binder_deferred_workqueue) - return -ENOMEM; - binder_proc_dir_entry_root = proc_mkdir("binder", NULL); if (binder_proc_dir_entry_root) binder_proc_dir_entry_proc = proc_mkdir("proc", diff --git a/drivers/staging/android/logger.c b/drivers/staging/android/logger.c index 7f64f8fb26b0..6c10b456c6cc 100644 --- a/drivers/staging/android/logger.c +++ b/drivers/staging/android/logger.c @@ -556,7 +556,6 @@ static struct logger_log VAR = { \ DEFINE_LOGGER_DEVICE(log_main, LOGGER_LOG_MAIN, 64*1024) DEFINE_LOGGER_DEVICE(log_events, LOGGER_LOG_EVENTS, 256*1024) DEFINE_LOGGER_DEVICE(log_radio, LOGGER_LOG_RADIO, 64*1024) -DEFINE_LOGGER_DEVICE(log_system, LOGGER_LOG_SYSTEM, 64*1024) static struct logger_log *get_log_from_minor(int minor) { @@ -566,8 +565,6 @@ static struct logger_log *get_log_from_minor(int minor) return &log_events; if (log_radio.misc.minor == minor) return &log_radio; - if (log_system.misc.minor == minor) - return &log_system; return NULL; } @@ -604,10 +601,6 @@ static int __init logger_init(void) if (unlikely(ret)) goto out; - ret = init_log(&log_system); - if (unlikely(ret)) - goto out; - out: return ret; } diff --git a/drivers/staging/android/logger.h b/drivers/staging/android/logger.h index 2cb06e9d8f98..a562434d7419 100644 --- a/drivers/staging/android/logger.h +++ b/drivers/staging/android/logger.h @@ -32,7 +32,6 @@ struct logger_entry { #define LOGGER_LOG_RADIO "log_radio" /* radio-related messages */ #define LOGGER_LOG_EVENTS "log_events" /* system/hardware events */ -#define LOGGER_LOG_SYSTEM "log_system" /* system/framework messages */ #define LOGGER_LOG_MAIN "log_main" /* everything else */ #define LOGGER_ENTRY_MAX_LEN (4*1024) diff --git a/drivers/staging/android/lowmemorykiller.c b/drivers/staging/android/lowmemorykiller.c index 572dc062759a..ae41f79d995d 100644 --- a/drivers/staging/android/lowmemorykiller.c +++ b/drivers/staging/android/lowmemorykiller.c @@ -20,7 +20,6 @@ #include <linux/sched.h> #include <linux/nodemask.h> #include <linux/vmstat.h> -#include <linux/notifier.h> static int lowmem_shrink(int nr_to_scan, gfp_t gfp_mask); @@ -44,8 +43,6 @@ static size_t lowmem_minfree[6] = { }; static int lowmem_minfree_size = 4; -static struct task_struct *lowmem_deathpending; - #define lowmem_print(level, x...) \ do { \ if (lowmem_debug_level >= (level)) \ @@ -59,24 +56,6 @@ module_param_array_named(minfree, lowmem_minfree, uint, &lowmem_minfree_size, S_IRUGO | S_IWUSR); module_param_named(debug_level, lowmem_debug_level, uint, S_IRUGO | S_IWUSR); -static int -task_notify_func(struct notifier_block *self, unsigned long val, void *data); - -static struct notifier_block task_nb = { - .notifier_call = task_notify_func, -}; - -static int -task_notify_func(struct notifier_block *self, unsigned long val, void *data) -{ - struct task_struct *task = data; - if (task == lowmem_deathpending) { - lowmem_deathpending = NULL; - task_free_unregister(&task_nb); - } - return NOTIFY_OK; -} - static int lowmem_shrink(int nr_to_scan, gfp_t gfp_mask) { struct task_struct *p; @@ -92,15 +71,6 @@ static int lowmem_shrink(int nr_to_scan, gfp_t gfp_mask) int other_file = global_page_state(NR_FILE_PAGES); int node; - /* - * If we already have a death outstanding, then - * bail out right away; indicating to vmscan - * that we have nothing further to offer on - * this pass. - */ - if (lowmem_deathpending) - return 0; - for_each_node_state(node, N_HIGH_MEMORY) { struct zone *z = &NODE_DATA(node)->node_zones[ZONE_DMA]; @@ -169,19 +139,9 @@ static int lowmem_shrink(int nr_to_scan, gfp_t gfp_mask) p->pid, p->comm, oom_adj, tasksize); } if (selected) { - if (fatal_signal_pending(selected)) { - pr_warning("process %d is suffering a slow death\n", - selected->pid); - read_unlock(&tasklist_lock); - return rem; - } lowmem_print(1, "send sigkill to %d (%s), adj %d, size %d\n", selected->pid, selected->comm, selected_oom_adj, selected_tasksize); - - lowmem_deathpending = selected; - task_free_register(&task_nb); - force_sig(SIGKILL, selected); rem -= selected_tasksize; } diff --git a/drivers/staging/dst/dcore.c b/drivers/staging/dst/dcore.c index fad25b753042..5546898dbdb4 100644 --- a/drivers/staging/dst/dcore.c +++ b/drivers/staging/dst/dcore.c @@ -846,15 +846,19 @@ static dst_command_func dst_commands[] = { /* * Configuration parser. */ -static void cn_dst_callback(void *data) +static void cn_dst_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp) { struct dst_ctl *ctl; - struct cn_msg *msg = data; int err; struct dst_ctl_ack ack; struct dst_node *n = NULL, *tmp; unsigned int hash; + if (!cap_raised(nsp->eff_cap, CAP_SYS_ADMIN)) { + err = -EPERM; + goto out; + } + if (msg->len < sizeof(struct dst_ctl)) { err = -EBADMSG; goto out; diff --git a/drivers/staging/pohmelfs/config.c b/drivers/staging/pohmelfs/config.c index a6eaa42fb669..d8ec47a6ee06 100644 --- a/drivers/staging/pohmelfs/config.c +++ b/drivers/staging/pohmelfs/config.c @@ -446,11 +446,13 @@ out_unlock: return err; } -static void pohmelfs_cn_callback(void *data) +static void pohmelfs_cn_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp) { - struct cn_msg *msg = data; int err; + if (!cap_raised(nsp->eff_cap, CAP_SYS_ADMIN)) + return; + switch (msg->flags) { case POHMELFS_FLAGS_ADD: case POHMELFS_FLAGS_DEL: diff --git a/drivers/staging/rt2860/common/cmm_data_2860.c b/drivers/staging/rt2860/common/cmm_data_2860.c index fb1735533b74..857ff450b6c9 100644 --- a/drivers/staging/rt2860/common/cmm_data_2860.c +++ b/drivers/staging/rt2860/common/cmm_data_2860.c @@ -363,6 +363,8 @@ int RtmpPCIMgmtKickOut( ULONG SwIdx = pAd->MgmtRing.TxCpuIdx; pTxD = (PTXD_STRUC) pAd->MgmtRing.Cell[SwIdx].AllocVa; + if (!pTxD) + return 0; pAd->MgmtRing.Cell[SwIdx].pNdisPacket = pPacket; pAd->MgmtRing.Cell[SwIdx].pNextNdisPacket = NULL; diff --git a/drivers/uio/uio_pdrv_genirq.c b/drivers/uio/uio_pdrv_genirq.c index 31fcd3270b26..3f06818cf9fa 100644 --- a/drivers/uio/uio_pdrv_genirq.c +++ b/drivers/uio/uio_pdrv_genirq.c @@ -157,12 +157,6 @@ static int uio_pdrv_genirq_remove(struct platform_device *pdev) struct uio_pdrv_genirq_platdata *priv = platform_get_drvdata(pdev); uio_unregister_device(priv->uioinfo); - - priv->uioinfo->irq_flags = 0; - priv->uioinfo->handler = NULL; - priv->uioinfo->irqcontrol = NULL; - priv->uioinfo->priv = NULL; - kfree(priv); return 0; } diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index b8134ad5f05f..b72fa49eb257 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -609,9 +609,9 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp) acm->throttle = 0; - tasklet_schedule(&acm->urb_task); set_bit(ASYNCB_INITIALIZED, &acm->port.flags); rv = tty_port_block_til_ready(&acm->port, tty, filp); + tasklet_schedule(&acm->urb_task); done: mutex_unlock(&acm->mutex); err_out: @@ -860,10 +860,7 @@ static void acm_tty_set_termios(struct tty_struct *tty, if (!ACM_READY(acm)) return; - /* FIXME: Needs to support the tty_baud interface */ - /* FIXME: Broken on sparc */ - newline.dwDTERate = cpu_to_le32p(acm_tty_speed + - (termios->c_cflag & CBAUD & ~CBAUDEX) + (termios->c_cflag & CBAUDEX ? 15 : 0)); + newline.dwDTERate = cpu_to_le32(tty_get_baud_rate(tty)); newline.bCharFormat = termios->c_cflag & CSTOPB ? 2 : 0; newline.bParityType = termios->c_cflag & PARENB ? (termios->c_cflag & PARODD ? 1 : 2) + diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index ba589d4ca8bc..a9c33994459b 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c @@ -313,8 +313,13 @@ static ssize_t wdm_write r = usb_autopm_get_interface(desc->intf); if (r < 0) goto outnp; - r = wait_event_interruptible(desc->wait, !test_bit(WDM_IN_USE, - &desc->flags)); + + if (!file->f_flags && O_NONBLOCK) + r = wait_event_interruptible(desc->wait, !test_bit(WDM_IN_USE, + &desc->flags)); + else + if (test_bit(WDM_IN_USE, &desc->flags)) + r = -EAGAIN; if (r < 0) goto out; @@ -377,7 +382,7 @@ outnl: static ssize_t wdm_read (struct file *file, char __user *buffer, size_t count, loff_t *ppos) { - int rv, cntr; + int rv, cntr = 0; int i = 0; struct wdm_device *desc = file->private_data; @@ -389,10 +394,23 @@ static ssize_t wdm_read if (desc->length == 0) { desc->read = 0; retry: + if (test_bit(WDM_DISCONNECTING, &desc->flags)) { + rv = -ENODEV; + goto err; + } i++; - rv = wait_event_interruptible(desc->wait, - test_bit(WDM_READ, &desc->flags)); + if (file->f_flags & O_NONBLOCK) { + if (!test_bit(WDM_READ, &desc->flags)) { + rv = cntr ? cntr : -EAGAIN; + goto err; + } + rv = 0; + } else { + rv = wait_event_interruptible(desc->wait, + test_bit(WDM_READ, &desc->flags)); + } + /* may have happened while we slept */ if (test_bit(WDM_DISCONNECTING, &desc->flags)) { rv = -ENODEV; goto err; @@ -448,7 +466,7 @@ retry: err: mutex_unlock(&desc->rlock); - if (rv < 0) + if (rv < 0 && rv != -EAGAIN) dev_err(&desc->intf->dev, "wdm_read: exit error\n"); return rv; } diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c index b09a527f7341..aa145f7b4e25 100644 --- a/drivers/usb/class/usbtmc.c +++ b/drivers/usb/class/usbtmc.c @@ -367,13 +367,13 @@ static ssize_t usbtmc_read(struct file *filp, char __user *buf, { struct usbtmc_device_data *data; struct device *dev; - unsigned long int n_characters; + u32 n_characters; u8 *buffer; int actual; - int done; - int remaining; + size_t done; + size_t remaining; int retval; - int this_part; + size_t this_part; /* Get pointer to private data structure */ data = filp->private_data; @@ -455,6 +455,18 @@ static ssize_t usbtmc_read(struct file *filp, char __user *buf, (buffer[6] << 16) + (buffer[7] << 24); + /* Ensure the instrument doesn't lie about it */ + if(n_characters > actual - 12) { + dev_err(dev, "Device lies about message size: %zu > %zu\n", n_characters, actual - 12); + n_characters = actual - 12; + } + + /* Ensure the instrument doesn't send more back than requested */ + if(n_characters > this_part) { + dev_err(dev, "Device returns more than requested: %zu > %zu\n", done + n_characters, done + this_part); + n_characters = this_part; + } + /* Copy buffer to user space */ if (copy_to_user(buf + done, &buffer[12], n_characters)) { /* There must have been an addressing problem */ @@ -465,6 +477,8 @@ static ssize_t usbtmc_read(struct file *filp, char __user *buf, done += n_characters; if (n_characters < USBTMC_SIZE_IOBUFFER) remaining = 0; + else + remaining -= n_characters; } /* Update file position value */ @@ -531,10 +545,16 @@ static ssize_t usbtmc_write(struct file *filp, const char __user *buf, n_bytes = roundup(12 + this_part, 4); memset(buffer + 12 + this_part, 0, n_bytes - (12 + this_part)); - retval = usb_bulk_msg(data->usb_dev, - usb_sndbulkpipe(data->usb_dev, - data->bulk_out), - buffer, n_bytes, &actual, USBTMC_TIMEOUT); + do { + retval = usb_bulk_msg(data->usb_dev, + usb_sndbulkpipe(data->usb_dev, + data->bulk_out), + buffer, n_bytes, + &actual, USBTMC_TIMEOUT); + if (retval != 0) + break; + n_bytes -= actual; + } while (n_bytes); data->bTag_last_write = data->bTag; data->bTag++; diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c index a16c538d0132..0d3af6a6ee49 100644 --- a/drivers/usb/core/config.c +++ b/drivers/usb/core/config.c @@ -105,7 +105,7 @@ static int usb_parse_ss_endpoint_companion(struct device *ddev, int cfgno, ep->ss_ep_comp->extralen = i; buffer += i; size -= i; - retval = buffer - buffer_start + i; + retval = buffer - buffer_start; if (num_skipped > 0) dev_dbg(ddev, "skipped %d descriptor%s after %s\n", num_skipped, plural(num_skipped), diff --git a/drivers/usb/core/devices.c b/drivers/usb/core/devices.c index 96f11715cd26..355dffcc23b0 100644 --- a/drivers/usb/core/devices.c +++ b/drivers/usb/core/devices.c @@ -494,7 +494,7 @@ static ssize_t usb_device_dump(char __user **buffer, size_t *nbytes, return 0; /* allocate 2^1 pages = 8K (on i386); * should be more than enough for one device */ - pages_start = (char *)__get_free_pages(GFP_KERNEL, 1); + pages_start = (char *)__get_free_pages(GFP_NOIO, 1); if (!pages_start) return -ENOMEM; diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index 4247eccf858c..5ae4099fb4c1 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -1139,6 +1139,13 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, free_async(as); return -ENOMEM; } + /* Isochronous input data may end up being discontiguous + * if some of the packets are short. Clear the buffer so + * that the gaps don't leak kernel data to userspace. + */ + if (is_in && uurb->type == USBDEVFS_URB_TYPE_ISO) + memset(as->urb->transfer_buffer, 0, + uurb->buffer_length); } as->urb->dev = ps->dev; as->urb->pipe = (uurb->type << 30) | @@ -1240,10 +1247,14 @@ static int processcompl(struct async *as, void __user * __user *arg) void __user *addr = as->userurb; unsigned int i; - if (as->userbuffer) - if (copy_to_user(as->userbuffer, urb->transfer_buffer, - urb->transfer_buffer_length)) + if (as->userbuffer && urb->actual_length) { + if (urb->number_of_packets > 0) /* Isochronous */ + i = urb->transfer_buffer_length; + else /* Non-Isoc */ + i = urb->actual_length; + if (copy_to_user(as->userbuffer, urb->transfer_buffer, i)) goto err_out; + } if (put_user(as->status, &userurb->status)) goto err_out; if (put_user(urb->actual_length, &userurb->actual_length)) @@ -1262,14 +1273,11 @@ static int processcompl(struct async *as, void __user * __user *arg) } } - free_async(as); - if (put_user(addr, (void __user * __user *)arg)) return -EFAULT; return 0; err_out: - free_async(as); return -EFAULT; } @@ -1299,8 +1307,11 @@ static struct async *reap_as(struct dev_state *ps) static int proc_reapurb(struct dev_state *ps, void __user *arg) { struct async *as = reap_as(ps); - if (as) - return processcompl(as, (void __user * __user *)arg); + if (as) { + int retval = processcompl(as, (void __user * __user *)arg); + free_async(as); + return retval; + } if (signal_pending(current)) return -EINTR; return -EIO; @@ -1308,11 +1319,16 @@ static int proc_reapurb(struct dev_state *ps, void __user *arg) static int proc_reapurbnonblock(struct dev_state *ps, void __user *arg) { + int retval; struct async *as; - if (!(as = async_getcompleted(ps))) - return -EAGAIN; - return processcompl(as, (void __user * __user *)arg); + as = async_getcompleted(ps); + retval = -EAGAIN; + if (as) { + retval = processcompl(as, (void __user * __user *)arg); + free_async(as); + } + return retval; } #ifdef CONFIG_COMPAT @@ -1363,9 +1379,9 @@ static int processcompl_compat(struct async *as, void __user * __user *arg) void __user *addr = as->userurb; unsigned int i; - if (as->userbuffer) + if (as->userbuffer && urb->actual_length) if (copy_to_user(as->userbuffer, urb->transfer_buffer, - urb->transfer_buffer_length)) + urb->actual_length)) return -EFAULT; if (put_user(as->status, &userurb->status)) return -EFAULT; @@ -1385,7 +1401,6 @@ static int processcompl_compat(struct async *as, void __user * __user *arg) } } - free_async(as); if (put_user(ptr_to_compat(addr), (u32 __user *)arg)) return -EFAULT; return 0; @@ -1394,8 +1409,11 @@ static int processcompl_compat(struct async *as, void __user * __user *arg) static int proc_reapurb_compat(struct dev_state *ps, void __user *arg) { struct async *as = reap_as(ps); - if (as) - return processcompl_compat(as, (void __user * __user *)arg); + if (as) { + int retval = processcompl_compat(as, (void __user * __user *)arg); + free_async(as); + return retval; + } if (signal_pending(current)) return -EINTR; return -EIO; @@ -1403,11 +1421,16 @@ static int proc_reapurb_compat(struct dev_state *ps, void __user *arg) static int proc_reapurbnonblock_compat(struct dev_state *ps, void __user *arg) { + int retval; struct async *as; - if (!(as = async_getcompleted(ps))) - return -EAGAIN; - return processcompl_compat(as, (void __user * __user *)arg); + retval = -EAGAIN; + as = async_getcompleted(ps); + if (as) { + retval = processcompl_compat(as, (void __user * __user *)arg); + free_async(as); + } + return retval; } #endif diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index 07f503aa9078..c209dbe4f6c6 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c @@ -1754,9 +1754,6 @@ int usb_resume(struct device *dev, pm_message_t msg) udev = to_usb_device(dev); -/* At otg mode, if it is a device wakeup interrupt, the host should do nothing */ - if (udev->bus->is_b_host) - return 0; /* If udev->skip_sys_resume is set then udev was already suspended * when the system sleep started, so we don't want to resume it * during this system wakeup. diff --git a/drivers/usb/core/generic.c b/drivers/usb/core/generic.c index 539a2c0dde00..66e8a424c9f4 100644 --- a/drivers/usb/core/generic.c +++ b/drivers/usb/core/generic.c @@ -196,6 +196,7 @@ extern void usb_host_set_wakeup(struct device *wkup_dev, bool para); static int generic_suspend(struct usb_device *udev, pm_message_t msg) { int rc; + u32 temp; /* Normal USB devices suspend through their upstream port. * Root hubs don't have upstream ports to suspend, @@ -203,7 +204,25 @@ static int generic_suspend(struct usb_device *udev, pm_message_t msg) * interfaces manually by doing a bus (or "global") suspend. */ if (!udev->parent) { + struct usb_hcd *hcd = + container_of(udev->bus, struct usb_hcd, self); + struct fsl_usb2_platform_data *pdata; + pdata = hcd->self.controller->platform_data; + rc = hcd_bus_suspend(udev, msg); + + if (device_may_wakeup(hcd->self.controller)) { + clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); + /* enable remote wake up irq */ + usb_host_set_wakeup(hcd->self.controller, true); + + /* Put PHY into low power mode */ + temp = readl(hcd->regs + 0x184); + writel(temp | (1 << 23), (hcd->regs + 0x184)); + + if (pdata->usb_clock_for_pm) + pdata->usb_clock_for_pm(false); + } /* Non-root devices don't need to do anything for FREEZE or PRETHAW */ } else if (msg.event == PM_EVENT_FREEZE || msg.event == PM_EVENT_PRETHAW) @@ -217,6 +236,7 @@ static int generic_suspend(struct usb_device *udev, pm_message_t msg) static int generic_resume(struct usb_device *udev, pm_message_t msg) { int rc; + u32 temp; /* Normal USB devices resume/reset through their upstream port. * Root hubs don't have upstream ports to resume or reset, @@ -224,6 +244,13 @@ static int generic_resume(struct usb_device *udev, pm_message_t msg) * interfaces manually by doing a bus (or "global") resume. */ if (!udev->parent) { + struct usb_hcd *hcd = + container_of(udev->bus, struct usb_hcd, self); + + if (device_may_wakeup(hcd->self.controller)) { + temp = readl(hcd->regs + 0x184); + writel(temp & (~(1 << 23)), (hcd->regs + 0x184)); + } rc = hcd_bus_resume(udev, msg); } else rc = usb_port_resume(udev, msg); diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 2f47bdc7c93a..d27ad104731c 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -1739,7 +1739,6 @@ int hcd_bus_suspend(struct usb_device *rhdev, pm_message_t msg) int status; int old_state = hcd->state; - printk("%s\n", __func__); dev_dbg(&rhdev->dev, "bus %s%s\n", (msg.event & PM_EVENT_AUTO ? "auto-" : ""), "suspend"); if (!hcd->driver->bus_suspend) { @@ -1877,6 +1876,7 @@ EXPORT_SYMBOL_GPL(usb_bus_start_enum); irqreturn_t usb_hcd_irq (int irq, void *__hcd) { struct usb_hcd *hcd = __hcd; + struct fsl_usb2_platform_data *pdata; unsigned long flags; irqreturn_t rc; @@ -1885,14 +1885,25 @@ irqreturn_t usb_hcd_irq (int irq, void *__hcd) * assume it's never used. */ local_irq_save(flags); - /* At otg mode, the host does need to handle device interrupt */ - if (hcd->self.is_b_host){ - local_irq_restore(flags); - return IRQ_NONE; - } - else if (unlikely(hcd->state == HC_STATE_HALT || - !test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))) { + + if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) { + /* Need open clock for register access */ + pdata = hcd->self.controller->platform_data; + if (pdata->usb_clock_for_pm) + pdata->usb_clock_for_pm(true); + + /* if receive a remote wakeup interrrupt after suspend */ + if (usb_host_wakeup_irq(hcd->self.controller)) { + /* disable remote wake up irq */ + usb_host_set_wakeup(hcd->self.controller, false); + + set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); + hcd->driver->irq(hcd); + rc = IRQ_HANDLED; + } else rc = IRQ_NONE; + } else if (unlikely(hcd->state == HC_STATE_HALT)) { + rc = IRQ_NONE; } else if (hcd->driver->irq(hcd) == IRQ_NONE) { rc = IRQ_NONE; } else { diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index cc8f911afbc4..3bcd08fbfb71 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -457,7 +457,7 @@ resubmit: static inline int hub_clear_tt_buffer (struct usb_device *hdev, u16 devinfo, u16 tt) { - return usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), + return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), HUB_CLEAR_TT_BUFFER, USB_RT_PORT, devinfo, tt, NULL, 0, 1000); } @@ -1177,6 +1177,12 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) "Unsupported bus topology: hub nested too deep\n"); return -E2BIG; } +#ifdef CONFIG_PM + /* Defaultly disable autosuspend for hub and reley on sys + * to enable it. + */ + hdev->autosuspend_disabled = 1; +#endif #ifdef CONFIG_USB_OTG_BLACKLIST_HUB if (hdev->parent) { @@ -2298,6 +2304,7 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) struct usb_hub *hub = usb_get_intfdata (intf); struct usb_device *hdev = hub->hdev; unsigned port1; + /* fail if children aren't already suspended */ for (port1 = 1; port1 <= hdev->maxchild; port1++) { struct usb_device *udev; @@ -2321,15 +2328,8 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) static int hub_resume(struct usb_interface *intf) { struct usb_hub *hub = usb_get_intfdata(intf); - struct usb_hcd *hcd = bus_to_hcd(hub->hdev->bus); dev_dbg(&intf->dev, "%s\n", __func__); - /* At otg mode, if the hcd which the hub is attached to is not accessible, - * It should do nothing. - */ - if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) - return 0; - hub_activate(hub, HUB_RESUME); return 0; } @@ -3286,6 +3286,9 @@ static void hub_events(void) USB_PORT_FEAT_C_SUSPEND); udev = hdev->children[i-1]; if (udev) { + /* TRSMRCY = 10 msec */ + msleep(10); + usb_lock_device(udev); ret = remote_wakeup(hdev-> children[i-1]); diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 9720e699f472..8c929daa71f2 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c @@ -923,11 +923,11 @@ char *usb_cache_string(struct usb_device *udev, int index) if (index <= 0) return NULL; - buf = kmalloc(MAX_USB_STRING_SIZE, GFP_KERNEL); + buf = kmalloc(MAX_USB_STRING_SIZE, GFP_NOIO); if (buf) { len = usb_string(udev, index, buf, MAX_USB_STRING_SIZE); if (len > 0) { - smallbuf = kmalloc(++len, GFP_KERNEL); + smallbuf = kmalloc(++len, GFP_NOIO); if (!smallbuf) return buf; memcpy(smallbuf, buf, len); @@ -1694,7 +1694,7 @@ int usb_set_configuration(struct usb_device *dev, int configuration) if (cp) { nintf = cp->desc.bNumInterfaces; new_interfaces = kmalloc(nintf * sizeof(*new_interfaces), - GFP_KERNEL); + GFP_NOIO); if (!new_interfaces) { dev_err(&dev->dev, "Out of memory\n"); return -ENOMEM; @@ -1703,7 +1703,7 @@ int usb_set_configuration(struct usb_device *dev, int configuration) for (; n < nintf; ++n) { new_interfaces[n] = kzalloc( sizeof(struct usb_interface), - GFP_KERNEL); + GFP_NOIO); if (!new_interfaces[n]) { dev_err(&dev->dev, "Out of memory\n"); ret = -ENOMEM; diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c index b5c72e458943..7bc1469c8f0e 100644 --- a/drivers/usb/core/sysfs.c +++ b/drivers/usb/core/sysfs.c @@ -111,6 +111,12 @@ show_speed(struct device *dev, struct device_attribute *attr, char *buf) case USB_SPEED_HIGH: speed = "480"; break; + case USB_SPEED_VARIABLE: + speed = "480"; + break; + case USB_SPEED_SUPER: + speed = "5000"; + break; default: speed = "unknown"; } diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index a26f73880c32..b661dbd93208 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -132,7 +132,7 @@ EXPORT_SYMBOL_GPL(usb_altnum_to_altsetting); struct find_interface_arg { int minor; - struct usb_interface *interface; + struct device_driver *drv; }; static int __find_interface(struct device *dev, void *data) @@ -143,12 +143,10 @@ static int __find_interface(struct device *dev, void *data) if (!is_usb_interface(dev)) return 0; + if (dev->driver != arg->drv) + return 0; intf = to_usb_interface(dev); - if (intf->minor != -1 && intf->minor == arg->minor) { - arg->interface = intf; - return 1; - } - return 0; + return intf->minor == arg->minor; } /** @@ -156,21 +154,24 @@ static int __find_interface(struct device *dev, void *data) * @drv: the driver whose current configuration is considered * @minor: the minor number of the desired device * - * This walks the driver device list and returns a pointer to the interface - * with the matching minor. Note, this only works for devices that share the - * USB major number. + * This walks the bus device list and returns a pointer to the interface + * with the matching minor and driver. Note, this only works for devices + * that share the USB major number. */ struct usb_interface *usb_find_interface(struct usb_driver *drv, int minor) { struct find_interface_arg argb; - int retval; + struct device *dev; argb.minor = minor; - argb.interface = NULL; - /* eat the error, it will be in argb.interface */ - retval = driver_for_each_device(&drv->drvwrap.driver, NULL, &argb, - __find_interface); - return argb.interface; + argb.drv = &drv->drvwrap.driver; + + dev = bus_find_device(&usb_bus_type, NULL, &argb, __find_interface); + + /* Drop reference count from bus_find_device */ + put_device(dev); + + return dev ? to_usb_interface(dev) : NULL; } EXPORT_SYMBOL_GPL(usb_find_interface); diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index c29ebda61b2f..a19d73730470 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig @@ -791,15 +791,6 @@ config USB_G_PRINTER For more information, see Documentation/usb/gadget_printer.txt which includes sample code for accessing the device file. -config USB_ANDROID - tristate "Android Gadget" - depends on SWITCH - help - The Android gadget provides mass storage and adb transport. - - Say "y" to link the driver statically, or "m" to build a - dynamically linked module called "g_android". - config USB_CDC_COMPOSITE tristate "CDC Composite Device (Ethernet and ACM)" depends on NET diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile index 545c0e256e28..477114e43372 100644 --- a/drivers/usb/gadget/Makefile +++ b/drivers/usb/gadget/Makefile @@ -41,7 +41,6 @@ gadgetfs-objs := inode.o g_file_storage-objs := file_storage.o g_printer-objs := printer.o g_cdc-objs := cdc2.o -g_android-objs := android.o f_adb.o f_mass_storage.o obj-$(CONFIG_USB_ZERO) += g_zero.o obj-$(CONFIG_USB_AUDIO) += g_audio.o @@ -52,5 +51,4 @@ obj-$(CONFIG_USB_G_SERIAL) += g_serial.o obj-$(CONFIG_USB_G_PRINTER) += g_printer.o obj-$(CONFIG_USB_MIDI_GADGET) += g_midi.o obj-$(CONFIG_USB_CDC_COMPOSITE) += g_cdc.o -obj-$(CONFIG_USB_ANDROID) += g_android.o diff --git a/drivers/usb/gadget/amd5536udc.c b/drivers/usb/gadget/amd5536udc.c index 77352ccc245e..fb0976643a2f 100644 --- a/drivers/usb/gadget/amd5536udc.c +++ b/drivers/usb/gadget/amd5536udc.c @@ -1213,7 +1213,12 @@ udc_queue(struct usb_ep *usbep, struct usb_request *usbreq, gfp_t gfp) tmp &= AMD_UNMASK_BIT(ep->num); writel(tmp, &dev->regs->ep_irqmsk); } - } + } else if (ep->in) { + /* enable ep irq */ + tmp = readl(&dev->regs->ep_irqmsk); + tmp &= AMD_UNMASK_BIT(ep->num); + writel(tmp, &dev->regs->ep_irqmsk); + } } else if (ep->dma) { @@ -2005,18 +2010,17 @@ __acquires(dev->lock) { int tmp; - /* empty queues and init hardware */ - udc_basic_init(dev); - for (tmp = 0; tmp < UDC_EP_NUM; tmp++) { - empty_req_queue(&dev->ep[tmp]); - } - if (dev->gadget.speed != USB_SPEED_UNKNOWN) { spin_unlock(&dev->lock); driver->disconnect(&dev->gadget); spin_lock(&dev->lock); } - /* init */ + + /* empty queues and init hardware */ + udc_basic_init(dev); + for (tmp = 0; tmp < UDC_EP_NUM; tmp++) + empty_req_queue(&dev->ep[tmp]); + udc_setup_endpoints(dev); } @@ -2478,6 +2482,13 @@ static irqreturn_t udc_data_in_isr(struct udc *dev, int ep_ix) } } + } else if (!use_dma && ep->in) { + /* disable interrupt */ + tmp = readl( + &dev->regs->ep_irqmsk); + tmp |= AMD_BIT(ep->num); + writel(tmp, + &dev->regs->ep_irqmsk); } } /* clear status bits */ @@ -3285,6 +3296,17 @@ static int udc_pci_probe( goto finished; } + spin_lock_init(&dev->lock); + /* udc csr registers base */ + dev->csr = dev->virt_addr + UDC_CSR_ADDR; + /* dev registers base */ + dev->regs = dev->virt_addr + UDC_DEVCFG_ADDR; + /* ep registers base */ + dev->ep_regs = dev->virt_addr + UDC_EPREGS_ADDR; + /* fifo's base */ + dev->rxfifo = (u32 __iomem *)(dev->virt_addr + UDC_RXFIFO_ADDR); + dev->txfifo = (u32 __iomem *)(dev->virt_addr + UDC_TXFIFO_ADDR); + if (request_irq(pdev->irq, udc_irq, IRQF_SHARED, name, dev) != 0) { dev_dbg(&dev->pdev->dev, "request_irq(%d) fail\n", pdev->irq); kfree(dev); @@ -3337,7 +3359,6 @@ static int udc_probe(struct udc *dev) udc_pollstall_timer.data = 0; /* device struct setup */ - spin_lock_init(&dev->lock); dev->gadget.ops = &udc_ops; dev_set_name(&dev->gadget.dev, "gadget"); @@ -3346,16 +3367,6 @@ static int udc_probe(struct udc *dev) dev->gadget.name = name; dev->gadget.is_dualspeed = 1; - /* udc csr registers base */ - dev->csr = dev->virt_addr + UDC_CSR_ADDR; - /* dev registers base */ - dev->regs = dev->virt_addr + UDC_DEVCFG_ADDR; - /* ep registers base */ - dev->ep_regs = dev->virt_addr + UDC_EPREGS_ADDR; - /* fifo's base */ - dev->rxfifo = (u32 __iomem *)(dev->virt_addr + UDC_RXFIFO_ADDR); - dev->txfifo = (u32 __iomem *)(dev->virt_addr + UDC_TXFIFO_ADDR); - /* init registers, interrupts, ... */ startup_registers(dev); diff --git a/drivers/usb/gadget/arcotg_udc.c b/drivers/usb/gadget/arcotg_udc.c index 8e94549f891e..abba4d2ae8d4 100644 --- a/drivers/usb/gadget/arcotg_udc.c +++ b/drivers/usb/gadget/arcotg_udc.c @@ -106,6 +106,19 @@ extern struct resource *otg_get_resources(void); extern void fsl_platform_set_test_mode(struct fsl_usb2_platform_data *pdata, enum usb_test_mode mode); +static inline void +dr_wake_up_enable(struct fsl_udc *udc, bool enable) +{ + struct fsl_usb2_platform_data *pdata; + pdata = udc->pdata; + + if (enable && (!device_may_wakeup(udc_controller->gadget.dev.parent))) + return; + + if (pdata->wake_up_enable) + pdata->wake_up_enable(pdata, enable); +} + #ifdef CONFIG_WORKAROUND_ARCUSB_REG_RW static void safe_writel(u32 val32, void *addr) { @@ -270,12 +283,9 @@ static void done(struct fsl_ep *ep, struct fsl_req *req, int status) static void nuke(struct fsl_ep *ep, int status) { ep->stopped = 1; - /* - * At udc stop mode, the clock is already off - * So flush fifo, should be done at clock on mode. - */ - if (!ep->udc->stopped) - fsl_ep_fifo_flush(&ep->ep); + + /* Flush fifo */ + fsl_ep_fifo_flush(&ep->ep); /* Whether this eq has request linked */ while (!list_empty(&ep->queue)) { @@ -290,83 +300,31 @@ static void nuke(struct fsl_ep *ep, int status) /*------------------------------------------------------------------ Internal Hardware related function ------------------------------------------------------------------*/ -static inline void -dr_wake_up_enable(struct fsl_udc *udc, bool enable) -{ - struct fsl_usb2_platform_data *pdata; - pdata = udc->pdata; - if (pdata && pdata->wake_up_enable) - pdata->wake_up_enable(pdata, enable); -} -static bool clk_stoped = false; -static inline void dr_clk_gate(bool on) +static void dr_phy_low_power_mode(struct fsl_udc *udc, bool enable) { - struct fsl_usb2_platform_data *pdata = udc_controller->pdata; + u32 temp; - if (!pdata || !pdata->usb_clock_for_pm) + if (!device_may_wakeup(udc_controller->gadget.dev.parent)) return; - if (on && clk_stoped) { - pdata->usb_clock_for_pm(true); - clk_stoped = false; - } - if (!on && !clk_stoped) { - pdata->usb_clock_for_pm(false); - clk_stoped = true; - } - if (on) - reset_phy(); -} -static void dr_phy_low_power_mode(struct fsl_udc *udc, bool enable) -{ - struct fsl_usb2_platform_data *pdata = udc->pdata; - u32 portsc; + if (enable) { + temp = fsl_readl(&dr_regs->portsc1); + temp |= PORTSCX_PHY_LOW_POWER_SPD; + fsl_writel(temp, &dr_regs->portsc1); - if (pdata && pdata->phy_lowpower_suspend) { - pdata->phy_lowpower_suspend(enable); + if (udc_controller->pdata->usb_clock_for_pm) + udc_controller->pdata->usb_clock_for_pm(false); } else { - if (enable){ - portsc = fsl_readl(&dr_regs->portsc1); - portsc |= PORTSCX_PHY_LOW_POWER_SPD; - fsl_writel(portsc, &dr_regs->portsc1); - } else { - portsc = fsl_readl(&dr_regs->portsc1); - portsc &= ~PORTSCX_PHY_LOW_POWER_SPD; - fsl_writel(portsc, &dr_regs->portsc1); - } - } -} - - -/* workaroud for some boards, maybe there is a large capacitor between the ground and the Vbus - * that will cause the vbus dropping very slowly when device is detached, - * may cost 2-3 seconds to below 0.8V */ -static void udc_wait_b_session_low(void) -{ - u32 temp; - u32 wait = 5000; /* max wait time is 5000 ms */ - /* if we are in host mode, don't need to care the B session */ - if ((fsl_readl(&dr_regs->otgsc) & OTGSC_STS_USB_ID) == 0) - return; - /* if the udc is dettached , there will be a suspend irq */ - if (udc_controller->usb_state != USB_STATE_SUSPENDED) - return; - temp = fsl_readl(&dr_regs->otgsc); - temp &= ~(OTGSC_B_SESSION_VALID_IRQ_EN ); - fsl_writel(temp, &dr_regs->otgsc); + if (udc_controller->pdata->usb_clock_for_pm) + udc_controller->pdata->usb_clock_for_pm(true); - do { - if (!(fsl_readl(&dr_regs->otgsc) & OTGSC_B_SESSION_VALID)) - break; - mdelay(1); - wait -= 1; - } while(wait); - if (!wait) - printk("ERROR!!!!!: the vbus can not be lower then 0.8V for 5 seconds, Pls Check your HW design\n"); - temp = fsl_readl(&dr_regs->otgsc); - temp |= (OTGSC_B_SESSION_VALID_IRQ_EN ); - fsl_writel(temp, &dr_regs->otgsc); + /* Due to mx35/mx25's phy's bug */ + reset_phy(); + temp = fsl_readl(&dr_regs->portsc1); + temp &= ~PORTSCX_PHY_LOW_POWER_SPD; + fsl_writel(temp, &dr_regs->portsc1); + } } static int dr_controller_setup(struct fsl_udc *udc) @@ -490,20 +448,23 @@ static void dr_controller_run(struct fsl_udc *udc) fsl_writel(temp, &dr_regs->usbintr); - /* enable BSV irq */ - temp = fsl_readl(&dr_regs->otgsc); - temp |= OTGSC_B_SESSION_VALID_IRQ_EN; - fsl_writel(temp, &dr_regs->otgsc); + if (device_may_wakeup(udc_controller->gadget.dev.parent)) { + /* enable BSV irq */ + temp = fsl_readl(&dr_regs->otgsc); + temp |= OTGSC_B_SESSION_VALID_IRQ_EN; + fsl_writel(temp, &dr_regs->otgsc); + } /* If vbus not on and used low power mode */ - if (!(temp & OTGSC_B_SESSION_VALID)) { - /* Set stopped before low power mode */ - udc->stopped = 1; + if (!(fsl_readl(&dr_regs->otgsc) & OTGSC_B_SESSION_VALID) + && device_may_wakeup(udc_controller->gadget.dev.parent)) { /* enable wake up */ dr_wake_up_enable(udc, true); - /* enter lower power mode */ + /* Set stopped before low power mode */ + udc->stopped = 1; + /* close PHY clock */ dr_phy_low_power_mode(udc, true); - printk(KERN_INFO "%s: udc enter low power mode \n", __func__); + printk(KERN_INFO "udc enter low power mode \n"); } else { #ifdef CONFIG_ARCH_MX37 /* @@ -515,11 +476,11 @@ static void dr_controller_run(struct fsl_udc *udc) #endif /* Clear stopped bit */ udc->stopped = 0; - - /* The usb line has already been connected to pc */ + /* Set controller to Run */ temp = fsl_readl(&dr_regs->usbcmd); temp |= USB_CMD_RUN_STOP; fsl_writel(temp, &dr_regs->usbcmd); + printk(KERN_INFO "udc run \n"); } return; @@ -2015,36 +1976,15 @@ static void suspend_irq(struct fsl_udc *udc) udc->driver->suspend(&udc->gadget); } -/* Process Wake up interrupt - * Be careful that some boards will use ID pin to control the VBUS on/off - * in these case, after the device enter the lowpower mode(clk off, - * phy lowpower mode, wakeup enable), then an udisk is attaced to the otg port, - * there will be an Vbus wakeup event and then an ID change wakeup, But the Vbus - * event is not expected, so there is an workaround that will detect the ID, if ID=0 - * we just need the ID event so we can not disable the wakeup - * - * false: host wakeup event - * true: device wakeup event -*/ -static bool wake_up_irq(struct fsl_udc *udc) -{ - /* Because the IC design needs to remove the glitch on ID so the otgsc bit 8 will - * be delayed max 2 ms to show the real ID pin value - */ - mdelay(3); - - /* if the ID=0, let arc host process the wakeup */ - if (fsl_readl(&dr_regs->otgsc) & OTGSC_STS_USB_ID) { - dr_wake_up_enable(udc_controller, false); - dr_phy_low_power_mode(udc, false); - printk("device wake up event\n"); - return true; - }else {/* wakeup is vbus wake event, but not for device so we need to clear b session */ - int irq_src = fsl_readl(&dr_regs->otgsc) & (~OTGSC_ID_CHANGE_IRQ_STS); - fsl_writel(irq_src, &dr_regs->otgsc); - printk("The host wakeup event, should be handled by host\n"); - return false; - } +/* Process Wake up interrupt */ +static void wake_up_irq(struct fsl_udc *udc) +{ + pr_debug("%s\n", __func__); + + /* disable wake up irq */ + dr_wake_up_enable(udc_controller, false); + + udc->stopped = 0; } static void bus_resume(struct fsl_udc *udc) @@ -2113,48 +2053,43 @@ static void reset_irq(struct fsl_udc *udc) bool try_wake_up_udc(struct fsl_udc *udc) { u32 irq_src; - bool b_device; /* when udc is stopped, only handle wake up irq */ if (udc->stopped) { + if (!device_may_wakeup(&(udc->pdata->pdev->dev))) + return false; + + dr_phy_low_power_mode(udc_controller, false); + /* check to see if wake up irq */ irq_src = fsl_readl(&dr_regs->usbctrl); if (irq_src & USB_CTRL_OTG_WUIR) { - if (wake_up_irq(udc) == false){ - return false; /* host wakeup event */ - } + wake_up_irq(udc); + } else { + dr_phy_low_power_mode(udc_controller, true); } } + if (!device_may_wakeup(udc_controller->gadget.dev.parent)) + return true; + /* check if Vbus change irq */ irq_src = fsl_readl(&dr_regs->otgsc); if (irq_src & OTGSC_B_SESSION_VALID_IRQ_STS) { u32 tmp; - /* Because the IC design needs to remove the glitch on ID so the otgsc bit 8 will - * be delayed max 2 ms to show the real ID pin value, as it needs to use ID to judge - * host or device - */ - mdelay(3); - b_device = (irq_src & OTGSC_STS_USB_ID)? true:false; fsl_writel(irq_src, &dr_regs->otgsc); - if (!b_device) - return false; tmp = fsl_readl(&dr_regs->usbcmd); /* check BSV bit to see if fall or rise */ if (irq_src & OTGSC_B_SESSION_VALID) { - if (udc->suspended) /*let the system pm resume the udc */ - return true; udc->stopped = 0; fsl_writel(tmp | USB_CMD_RUN_STOP, &dr_regs->usbcmd); - printk(KERN_INFO "%s: udc out low power mode\n", __func__); + printk(KERN_INFO "udc out low power mode\n"); } else { - printk(KERN_INFO "%s: udc enter low power mode \n", __func__); - if (udc->driver) - udc->driver->disconnect(&udc->gadget); + printk(KERN_INFO "udc enter low power mode \n"); fsl_writel(tmp & ~USB_CMD_RUN_STOP, &dr_regs->usbcmd); - udc->stopped = 1; /* enable wake up */ dr_wake_up_enable(udc, true); + udc->stopped = 1; /* close USB PHY clock */ dr_phy_low_power_mode(udc, true); return false; @@ -2163,6 +2098,7 @@ bool try_wake_up_udc(struct fsl_udc *udc) return true; } + /* * USB device controller interrupt handler */ @@ -2173,29 +2109,15 @@ static irqreturn_t fsl_udc_irq(int irq, void *_udc) irqreturn_t status = IRQ_NONE; unsigned long flags; - spin_lock_irqsave(&udc->lock, flags); - if (udc->stopped) - dr_clk_gate(true); - - if (try_wake_up_udc(udc) == false) { - goto irq_end; - } -#ifdef CONFIG_USB_OTG - /* if no gadget register in this driver, we need do noting */ - if (udc->transceiver->gadget == NULL) - goto irq_end; - - /* only handle device interrupt event */ - if (!(fsl_readl(&dr_regs->otgsc) & OTGSC_STS_USB_ID)) { - goto irq_end; - } -#endif + if (try_wake_up_udc(udc) == false) + return IRQ_NONE; + spin_lock_irqsave(&udc->lock, flags); irq_src = fsl_readl(&dr_regs->usbsts) & fsl_readl(&dr_regs->usbintr); /* Clear notification bits */ fsl_writel(irq_src, &dr_regs->usbsts); - VDBG("0x%x\n", irq_src); + /* VDBG("irq_src [0x%8x]", irq_src); */ /* Need to resume? */ if (udc->usb_state == USB_STATE_SUSPENDED) @@ -2240,24 +2162,12 @@ static irqreturn_t fsl_udc_irq(int irq, void *_udc) /* Sleep Enable (Suspend) */ if (irq_src & USB_STS_SUSPEND) { - VDBG("suspend int"); suspend_irq(udc); status = IRQ_HANDLED; } if (irq_src & (USB_STS_ERR | USB_STS_SYS_ERR)) { - printk(KERN_ERR "Error IRQ %x ", irq_src); - if (irq_src & USB_STS_SYS_ERR) { - printk(KERN_ERR "This error can't be recoveried, \ - please reboot your board\n"); - printk(KERN_ERR "If this error happens frequently, \ - please check your dma buffer\n"); - } - } - -irq_end: - if (udc->stopped){ - dr_clk_gate(false); + VDBG("Error IRQ %x ", irq_src); } spin_unlock_irqrestore(&udc->lock, flags); @@ -2272,6 +2182,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) { int retval = -ENODEV; unsigned long flags = 0; + u32 portsc; if (!udc_controller) return -ENODEV; @@ -2289,18 +2200,17 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) spin_lock_irqsave(&udc_controller->lock, flags); driver->driver.bus = 0; - udc_controller->pdata->port_enables = 1; /* hook up the driver */ udc_controller->driver = driver; udc_controller->gadget.dev.driver = &driver->driver; spin_unlock_irqrestore(&udc_controller->lock, flags); - dr_clk_gate(true); - /* It doesn't need to switch usb from low power mode to normal mode - * at otg mode - */ - if (!udc_controller->transceiver){ - dr_phy_low_power_mode(udc_controller, false); - } + + if (udc_controller->pdata->usb_clock_for_pm) + udc_controller->pdata->usb_clock_for_pm(true); + + portsc = fsl_readl(&dr_regs->portsc1); + portsc &= ~PORTSCX_PHY_LOW_POWER_SPD; + fsl_writel(portsc, &dr_regs->portsc1); /* bind udc driver to gadget driver */ retval = driver->bind(&udc_controller->gadget); @@ -2313,30 +2223,30 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) if (udc_controller->transceiver) { /* Suspend the controller until OTG enable it */ - udc_controller->suspended = 1;/* let the otg resume it */ + udc_controller->stopped = 1; printk(KERN_INFO "Suspend udc for OTG auto detect\n"); dr_wake_up_enable(udc_controller, true); + dr_phy_low_power_mode(udc_controller, true); /* export udc suspend/resume call to OTG */ udc_controller->gadget.dev.driver->suspend = (dev_sus)fsl_udc_suspend; udc_controller->gadget.dev.driver->resume = (dev_res)fsl_udc_resume; /* connect to bus through transceiver */ - retval = otg_set_peripheral(udc_controller->transceiver, - &udc_controller->gadget); - if (retval < 0) { - ERR("can't bind to transceiver\n"); - driver->unbind(&udc_controller->gadget); - udc_controller->gadget.dev.driver = 0; - udc_controller->driver = 0; - return retval; + if (udc_controller->transceiver) { + retval = otg_set_peripheral(udc_controller->transceiver, + &udc_controller->gadget); + if (retval < 0) { + ERR("can't bind to transceiver\n"); + driver->unbind(&udc_controller->gadget); + udc_controller->gadget.dev.driver = 0; + udc_controller->driver = 0; + return retval; + } } - //dr_clk_gate(false); } else { /* Enable DR IRQ reg and Set usbcmd reg Run bit */ dr_controller_run(udc_controller); - if (udc_controller->stopped) - dr_clk_gate(false); udc_controller->usb_state = USB_STATE_ATTACHED; udc_controller->ep0_dir = 0; } @@ -2344,10 +2254,8 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) udc_controller->gadget.name, driver->driver.name); out: - if (retval){ + if (retval) printk(KERN_DEBUG "retval %d \n", retval); - udc_controller->pdata->port_enables = 0; - } return retval; } EXPORT_SYMBOL(usb_gadget_register_driver); @@ -2357,6 +2265,7 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) { struct fsl_ep *loop_ep; unsigned long flags; + u32 portsc; if (!udc_controller) return -ENODEV; @@ -2364,16 +2273,15 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) if (!driver || driver != udc_controller->driver || !driver->unbind) return -EINVAL; - if(udc_controller->stopped) - dr_clk_gate(true); - if (udc_controller->transceiver) (void)otg_set_peripheral(udc_controller->transceiver, 0); + /* open phy clock for following operation */ + dr_phy_low_power_mode(udc_controller, false); + /* stop DR, disable intr */ dr_controller_stop(udc_controller); - udc_controller->pdata->port_enables = 0; /* in fact, no needed */ udc_controller->usb_state = USB_STATE_ATTACHED; udc_controller->ep0_dir = 0; @@ -2395,11 +2303,14 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) udc_controller->gadget.dev.driver = 0; udc_controller->driver = 0; - if (udc_controller->gadget.is_otg) { - dr_wake_up_enable(udc_controller, true); - } + dr_wake_up_enable(udc_controller, false); - dr_phy_low_power_mode(udc_controller, true); + portsc = fsl_readl(&dr_regs->portsc1); + portsc |= PORTSCX_PHY_LOW_POWER_SPD; + fsl_writel(portsc, &dr_regs->portsc1); + + if (udc_controller->pdata->usb_clock_for_pm) + udc_controller->pdata->usb_clock_for_pm(false); printk(KERN_INFO "unregistered gadget driver '%s'\r\n", driver->driver.name); @@ -2814,7 +2725,6 @@ static int __init fsl_udc_probe(struct platform_device *pdev) ret = -ENODEV; goto err1a; } - udc_controller->gadget.is_otg = 1; #endif if ((pdev->dev.parent) && @@ -2915,6 +2825,12 @@ static int __init fsl_udc_probe(struct platform_device *pdev) if (ret < 0) goto err3; + if (udc_controller->transceiver) { + udc_controller->gadget.is_otg = 1; + /* now didn't support lpm in OTG mode*/ + device_set_wakeup_capable(&pdev->dev, 0); + } + /* setup QH and epctrl for ep0 */ ep0_setup(udc_controller); @@ -2957,29 +2873,24 @@ static int __init fsl_udc_probe(struct platform_device *pdev) #ifdef POSTPONE_FREE_LAST_DTD last_free_td = NULL; #endif - #ifndef CONFIG_USB_OTG /* disable all INTR */ fsl_writel(0, &dr_regs->usbintr); + dr_wake_up_enable(udc_controller, false); -#else - dr_wake_up_enable(udc_controller, true); -#endif + udc_controller->stopped = 1; -/* - * As mx25/mx35 does not implement clk_gate, should not let phy to low - * power mode due to IC bug - */ #if !(defined CONFIG_ARCH_MX35 || defined CONFIG_ARCH_MX25) { - dr_phy_low_power_mode(udc_controller, true); + u32 portsc; + portsc = fsl_readl(&dr_regs->portsc1); + portsc |= PORTSCX_PHY_LOW_POWER_SPD; + fsl_writel(portsc, &dr_regs->portsc1); } #endif - udc_controller->stopped = 1; - - /* let the gadget register function open the clk */ - dr_clk_gate(false); - + if (udc_controller->pdata->usb_clock_for_pm) + udc_controller->pdata->usb_clock_for_pm(false); +#endif create_proc_file(); return 0; @@ -3006,6 +2917,9 @@ err1a: */ static int __exit fsl_udc_remove(struct platform_device *pdev) { +#ifndef CONFIG_USB_OTG + struct resource *res; +#endif struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; DECLARE_COMPLETION(done); @@ -3014,8 +2928,7 @@ static int __exit fsl_udc_remove(struct platform_device *pdev) return -ENODEV; udc_controller->done = &done; /* open USB PHY clock */ - if (udc_controller->stopped) - dr_clk_gate(true); + dr_phy_low_power_mode(udc_controller, false); /* DR has been stopped in usb_gadget_unregister_driver() */ remove_proc_file(); @@ -3038,11 +2951,8 @@ static int __exit fsl_udc_remove(struct platform_device *pdev) iounmap((u8 __iomem *)dr_regs); #ifndef CONFIG_USB_OTG -{ - struct resource *res; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); release_mem_region(res->start, resource_size(res)); -} #endif device_unregister(&udc_controller->gadget.dev); @@ -3056,8 +2966,6 @@ static int __exit fsl_udc_remove(struct platform_device *pdev) if (pdata->platform_uninit) pdata->platform_uninit(pdata); - if (udc_controller->stopped) - dr_clk_gate(false); return 0; } @@ -3065,19 +2973,10 @@ static int udc_suspend(struct fsl_udc *udc) { u32 mode, usbcmd; - /* - * When it is the PM suspend routine and the device has no - * abilities to wakeup system, it should not set wakeup enable. - * Otherwise, the system will wakeup even the user only wants to - * charge using usb - */ - if (udc_controller->gadget.dev.parent->power.status - == DPM_SUSPENDING) { - if (!device_may_wakeup(udc_controller->gadget.dev.parent)) - dr_wake_up_enable(udc, false); - else - dr_wake_up_enable(udc, true); - } + /* open clock for register access */ + if (udc_controller->pdata->usb_clock_for_pm) + udc_controller->pdata->usb_clock_for_pm(true); + mode = fsl_readl(&dr_regs->usbmode) & USB_MODE_CTRL_MODE_MASK; usbcmd = fsl_readl(&dr_regs->usbcmd); @@ -3088,8 +2987,9 @@ static int udc_suspend(struct fsl_udc *udc) * PM suspend. Remember this fact, so that we will leave the * controller stopped at PM resume time. */ - if (udc->suspended) { + if (udc->stopped) { pr_debug("gadget already stopped, leaving early\n"); + udc->already_stopped = 1; goto out; } @@ -3098,30 +2998,22 @@ static int udc_suspend(struct fsl_udc *udc) goto out; } - /* For some buggy hardware designs, see comment of this function for detail */ - udc_wait_b_session_low(); - udc->stopped = 1; - - /* stop the controller */ - usbcmd = fsl_readl(&dr_regs->usbcmd) & ~USB_CMD_RUN_STOP; - fsl_writel(usbcmd, &dr_regs->usbcmd); - /* if the suspend is not for switch to host in otg mode */ if ((!(udc->gadget.is_otg)) || (fsl_readl(&dr_regs->otgsc) & OTGSC_STS_USB_ID)) { - if (device_may_wakeup(udc_controller->gadget.dev.parent)) { - dr_wake_up_enable(udc, true); - } + dr_wake_up_enable(udc, true); + dr_phy_low_power_mode(udc, true); } - dr_phy_low_power_mode(udc, true); + /* stop the controller */ + usbcmd = fsl_readl(&dr_regs->usbcmd) & ~USB_CMD_RUN_STOP; + fsl_writel(usbcmd, &dr_regs->usbcmd); + printk(KERN_INFO "USB Gadget suspended\n"); out: - udc->suspended++; - if (udc->suspended > 2) - printk("ERROR: suspended times > 2\n"); - + if (udc_controller->pdata->usb_clock_for_pm) + udc_controller->pdata->usb_clock_for_pm(false); return 0; } @@ -3131,24 +3023,13 @@ out: -----------------------------------------------------------------*/ static int fsl_udc_suspend(struct platform_device *pdev, pm_message_t state) { - int ret; -#ifdef CONFIG_USB_OTG - if (udc_controller->transceiver->gadget == NULL) - return 0; -#endif - if (udc_controller->stopped) - dr_clk_gate(true); if (((!(udc_controller->gadget.is_otg)) || (fsl_readl(&dr_regs->otgsc) & OTGSC_STS_USB_ID)) && (udc_controller->usb_state > USB_STATE_POWERED) && - (udc_controller->usb_state < USB_STATE_SUSPENDED)) { - return -EBUSY;/* keep the clk on */ - } - else - ret = udc_suspend(udc_controller); - dr_clk_gate(false); + (udc_controller->usb_state < USB_STATE_SUSPENDED)) + return -EBUSY; - return ret; + return udc_suspend(udc_controller); } /*----------------------------------------------------------------- @@ -3157,54 +3038,30 @@ static int fsl_udc_suspend(struct platform_device *pdev, pm_message_t state) *-----------------------------------------------------------------*/ static int fsl_udc_resume(struct platform_device *pdev) { - pr_debug("%s(): stopped %d suspended %d\n", __func__, - udc_controller->stopped, udc_controller->suspended); - printk("udc resume\n"); -#ifdef CONFIG_USB_OTG - if (udc_controller->transceiver->gadget == NULL) - return 0; -#endif - if (udc_controller->stopped) - dr_clk_gate(true); + pr_debug("%s(): stopped %d already_stopped %d\n", __func__, + udc_controller->stopped, udc_controller->already_stopped); + /* * If the controller was stopped at suspend time, then * don't resume it now. */ - /* - * If it is PM resume routine, the udc is at low power mode, - * and the udc has no abilities to wakeup system, it should - * set the abilities to wakeup itself. Otherwise, the usb - * subsystem will not leave from low power mode. - */ - if (!device_may_wakeup(udc_controller->gadget.dev.parent) && - udc_controller->gadget.dev.parent->power.status - == DPM_RESUMING){ - dr_wake_up_enable(udc_controller, true); - } - - if (--udc_controller->suspended) { - printk("gadget was already stopped, leaving early\n"); - goto out; + if (udc_controller->already_stopped) { + udc_controller->already_stopped = 0; + pr_debug("gadget was already stopped, leaving early\n"); + return 0; } + /* Enable DR irq reg and set controller Run */ if (udc_controller->stopped) { - /* if in host mode, we need to do nothing */ - if ((fsl_readl(&dr_regs->otgsc) & OTGSC_STS_USB_ID) == 0) { - goto out; - } dr_wake_up_enable(udc_controller, false); dr_phy_low_power_mode(udc_controller, false); - mdelay(10); + mdelay(1); + dr_controller_setup(udc_controller); dr_controller_run(udc_controller); } udc_controller->usb_state = USB_STATE_ATTACHED; udc_controller->ep0_dir = 0; -out: - /* if udc is resume by otg id change and no device - * connecting to the otg, otg will enter low power mode*/ - if (udc_controller->stopped) - dr_clk_gate(false); printk(KERN_INFO "USB Gadget resumed\n"); return 0; diff --git a/drivers/usb/gadget/arcotg_udc.h b/drivers/usb/gadget/arcotg_udc.h index 8d344acb8fef..4574954bf4f4 100644 --- a/drivers/usb/gadget/arcotg_udc.h +++ b/drivers/usb/gadget/arcotg_udc.h @@ -266,7 +266,6 @@ struct usb_sys_interface { #define PORTSCX_SPEED_BIT_POS (26) /* OTGSC Register Bit Masks */ -#define OTGSC_ID_CHANGE_IRQ_STS (1 << 16) #define OTGSC_B_SESSION_VALID_IRQ_EN (1 << 27) #define OTGSC_B_SESSION_VALID_IRQ_STS (1 << 19) #define OTGSC_B_SESSION_VALID (1 << 11) @@ -594,15 +593,9 @@ struct fsl_udc { struct otg_transceiver *transceiver; unsigned softconnect:1; unsigned vbus_active:1; - unsigned remote_wakeup:1; - /* we must distinguish the stopped and suspended state, - * stopped means the udc enter lowpower mode, suspended - * means the udc is suspended by system pm or by otg - * switching to host mode.if the udc in suspended state - * it also in the stopped state, while if the udc in - * stopped state,it may not be in the suspended state*/ unsigned stopped:1; - int suspended; + unsigned remote_wakeup:1; + unsigned already_stopped:1; struct ep_queue_head *ep_qh; /* Endpoints Queue-Head */ struct fsl_req *status_req; /* ep0 status request */ diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 2e79b8c389a4..59e85234fa0a 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -236,7 +236,6 @@ static int config_buf(struct usb_configuration *config, int len = USB_BUFSIZ - USB_DT_CONFIG_SIZE; struct usb_function *f; int status; - int interfaceCount = 0; /* write the config descriptor */ c = buf; @@ -267,16 +266,8 @@ static int config_buf(struct usb_configuration *config, descriptors = f->hs_descriptors; else descriptors = f->descriptors; - if (f->hidden || !descriptors || descriptors[0] == NULL) { - for (; f != config->interface[interfaceCount];) { - interfaceCount++; - c->bNumInterfaces--; - } + if (!descriptors) continue; - } - for (; f != config->interface[interfaceCount];) - interfaceCount++; - status = usb_descriptor_fillbuf(next, len, (const struct usb_descriptor_header **) descriptors); if (status < 0) @@ -765,11 +756,11 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) case USB_REQ_GET_CONFIGURATION: if (ctrl->bRequestType != USB_DIR_IN) goto unknown; - if (cdev->config) { + if (cdev->config) *(u8 *)req->buf = cdev->config->bConfigurationValue; - value = min(w_length, (u16) 1); - } else + else *(u8 *)req->buf = 0; + value = min(w_length, (u16) 1); break; /* function drivers must handle get/set altsetting; if there's @@ -819,9 +810,6 @@ unknown: */ if ((ctrl->bRequestType & USB_RECIP_MASK) == USB_RECIP_INTERFACE) { - if (cdev->config == NULL) - return value; - f = cdev->config->interface[intf]; if (f && f->setup) value = f->setup(f, ctrl); @@ -836,25 +824,6 @@ unknown: value = c->setup(c, ctrl); } - /* If the vendor request is not processed (value < 0), - * call all device registered configure setup callbacks - * to process it. - * This is used to handle the following cases: - * - vendor request is for the device and arrives before - * setconfiguration. - * - Some devices are required to handle vendor request before - * setconfiguration such as MTP, USBNET. - */ - - if (value < 0) { - struct usb_configuration *cfg; - - list_for_each_entry(cfg, &cdev->configs, list) { - if (cfg && cfg->setup) - value = cfg->setup(cfg, ctrl); - } - } - goto done; } diff --git a/drivers/usb/gadget/f_acm.c b/drivers/usb/gadget/f_acm.c index 7dd1a8bbe382..7953948bfe4a 100644 --- a/drivers/usb/gadget/f_acm.c +++ b/drivers/usb/gadget/f_acm.c @@ -761,12 +761,3 @@ int __init acm_bind_config(struct usb_configuration *c, u8 port_num) kfree(acm); return status; } - -int __init acm_function_add(struct usb_composite_dev *cdev, - struct usb_configuration *c) -{ - int ret = acm_bind_config(c, 0); - if (ret == 0) - gserial_setup(c->cdev->gadget, 1); - return ret; -} diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c index 8b0a13202573..66105ce49672 100644 --- a/drivers/usb/gadget/file_storage.c +++ b/drivers/usb/gadget/file_storage.c @@ -728,7 +728,6 @@ struct fsg_dev { #include "fsl_updater.h" #endif -static int do_set_interface(struct fsg_dev *fsg, int altsetting); typedef void (*fsg_routine_t)(struct fsg_dev *); static int exception_in_progress(struct fsg_dev *fsg) @@ -1109,14 +1108,6 @@ static void fsg_disconnect(struct usb_gadget *gadget) struct fsg_dev *fsg = get_gadget_data(gadget); DBG(fsg, "disconnect or port reset\n"); - /* - * The disconnect exception will call do_set_config, and therefore will - * visit controller registers. However it is a delayed event, and will be - * handled at another process, so the controller maybe have already close the - * usb clock.*/ - if (fsg->new_config) - do_set_interface(fsg, -1);/* disable the interface */ - raise_exception(fsg, FSG_STATE_DISCONNECT); } diff --git a/drivers/usb/host/ehci-arc.c b/drivers/usb/host/ehci-arc.c index 5cfcf169e7c7..21133fb8e47a 100644 --- a/drivers/usb/host/ehci-arc.c +++ b/drivers/usb/host/ehci-arc.c @@ -23,28 +23,9 @@ #include <linux/fsl_devices.h> #include <linux/usb/otg.h> -#include "../core/usb.h" #include "ehci-fsl.h" #include <mach/fsl_usb.h> -extern int usb_host_wakeup_irq(struct device *wkup_dev); -extern void usb_host_set_wakeup(struct device *wkup_dev, bool para); -static void fsl_usb_lowpower_mode(struct fsl_usb2_platform_data *pdata, bool enable) -{ - if (enable){ - if (pdata->phy_lowpower_suspend) - pdata->phy_lowpower_suspend(true); - } else { - if (pdata->phy_lowpower_suspend) - pdata->phy_lowpower_suspend(false); - } -} - -static void fsl_usb_clk_gate(struct fsl_usb2_platform_data *pdata, bool enable) -{ - if (pdata->usb_clock_for_pm) - pdata->usb_clock_for_pm(enable); -} #undef EHCI_PROC_PTC #ifdef EHCI_PROC_PTC /* /proc PORTSC:PTC support */ /* @@ -109,39 +90,8 @@ static int ehci_testmode_init(struct ehci_hcd *ehci) #endif /* /proc PORTSC:PTC support */ -/* - * This irq is used to open the hw access and let usb_hcd_irq process the usb event - * ehci_fsl_pre_irq will be called before usb_hcd_irq - */ -static irqreturn_t ehci_fsl_pre_irq(int irq, void *dev) -{ - struct platform_device *pdev = (struct platform_device *)dev; - struct usb_hcd *hcd = platform_get_drvdata(pdev); - struct ehci_hcd *ehci = hcd_to_ehci(hcd); - struct fsl_usb2_platform_data *pdata; - - pdata = hcd->self.controller->platform_data; - - /* if it is an otg module and in b device mode, we need to do noting here */ - if (ehci->transceiver && !ehci->transceiver->default_a) - return IRQ_NONE; - - if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) { - /* Need to open clk for accessing the register */ - fsl_usb_clk_gate(hcd->self.controller->platform_data, true); - /* if receive a remote wakeup interrrupt after suspend */ - if (usb_host_wakeup_irq(hcd->self.controller)) { - printk("host wakeup event happens\n"); - /* disable remote wake up irq */ - usb_host_set_wakeup(hcd->self.controller, false); - fsl_usb_lowpower_mode(pdata, false); - set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); - }else { - fsl_usb_clk_gate(hcd->self.controller->platform_data, false); - } - } - return IRQ_NONE; -} +/* configure so an HC device and id are always provided */ +/* always called with process context; sleeping is OK */ /** * usb_hcd_fsl_probe - initialize FSL-based HCDs @@ -232,18 +182,9 @@ int usb_hcd_fsl_probe(const struct hc_driver *driver, fsl_platform_set_host_mode(hcd); hcd->power_budget = pdata->power_budget; - /* - * The ehci_fsl_pre_irq must be registered before usb_hcd_irq, in that case - * it can be called before usb_hcd_irq when irq occurs - */ - retval = request_irq(irq, ehci_fsl_pre_irq, IRQF_SHARED, - "fsl ehci pre interrupt", (void *)pdev); - if (retval != 0) - goto err4; - retval = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED); if (retval != 0) - goto err5; + goto err4; fsl_platform_set_vbus_power(pdata, 1); @@ -258,7 +199,7 @@ int usb_hcd_fsl_probe(const struct hc_driver *driver, if (!ehci->transceiver) { printk(KERN_ERR "can't find transceiver\n"); retval = -ENODEV; - goto err5; + goto err4; } retval = otg_set_host(ehci->transceiver, &ehci_to_hcd(ehci)->self); @@ -275,8 +216,7 @@ int usb_hcd_fsl_probe(const struct hc_driver *driver, fsl_platform_set_ahb_burst(hcd); ehci_testmode_init(hcd_to_ehci(hcd)); return retval; -err5: - free_irq(irq, (void *)pdev); + err4: iounmap(hcd->regs); err3: @@ -291,6 +231,9 @@ err1: return retval; } +/* may be called without controller electrically present */ +/* may be called with controller, bus, and devices active */ + /** * usb_hcd_fsl_remove - shutdown processing for FSL-based HCDs * @dev: USB Host Controller being removed @@ -381,59 +324,6 @@ static int ehci_fsl_reinit(struct ehci_hcd *ehci) return 0; } -static int ehci_fsl_bus_suspend(struct usb_hcd *hcd) -{ - int ret = 0; - struct fsl_usb2_platform_data *pdata; - pdata = hcd->self.controller->platform_data; - pr_debug("%s, %s\n", __func__, pdata->name); - - /* the host is already at low power mode */ - if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) { - return 0; - } - - pr_debug("%s, it is the host mode, %s\n", __func__, pdata->name); - - ehci_bus_suspend(hcd); - - if (pdata->platform_suspend) - pdata->platform_suspend(pdata); - - usb_host_set_wakeup(hcd->self.controller, true); - fsl_usb_lowpower_mode(pdata, true); - fsl_usb_clk_gate(hcd->self.controller->platform_data, false); - clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); - - return ret; -} - -static int ehci_fsl_bus_resume(struct usb_hcd *hcd) -{ - int ret = 0; - struct fsl_usb2_platform_data *pdata; - - pdata = hcd->self.controller->platform_data; - pr_debug("%s, %s\n", __func__, pdata->name); - - /* if it is a remote wakeup, it will open clock and clear PHCD automatically */ - if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) { - set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); - fsl_usb_clk_gate(hcd->self.controller->platform_data, true); - usb_host_set_wakeup(hcd->self.controller, false); - fsl_usb_lowpower_mode(pdata, false); - } - - if (pdata->platform_resume) - pdata->platform_resume(pdata); - ret = ehci_bus_resume(hcd); - if (ret) - return ret; - - return ret; -} - - /* called during probe() after chip reset completes */ static int ehci_fsl_setup(struct usb_hcd *hcd) { @@ -506,8 +396,8 @@ static const struct hc_driver ehci_fsl_hc_driver = { */ .hub_status_data = ehci_hub_status_data, .hub_control = ehci_hub_control, - .bus_suspend = ehci_fsl_bus_suspend, - .bus_resume = ehci_fsl_bus_resume, + .bus_suspend = ehci_bus_suspend, + .bus_resume = ehci_bus_resume, .start_port_reset = ehci_start_port_reset, .relinquish_port = ehci_relinquish_port, .port_handed_over = ehci_port_handed_over, @@ -548,36 +438,13 @@ static int ehci_fsl_drv_suspend(struct platform_device *pdev, { struct usb_hcd *hcd = platform_get_drvdata(pdev); struct ehci_hcd *ehci = hcd_to_ehci(hcd); - struct usb_device *roothub = hcd->self.root_hub; - u32 port_status; + u32 tmp, port_status; struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; - /* Only handles OTG mode switch event, system suspend event will be done in bus suspend */ - if (pdev->dev.power.status == DPM_SUSPENDING){ - pr_debug("%s, system pm event \n", __func__); - if (!device_may_wakeup(&(pdev->dev))){ - /* Need open clock for register access */ - if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) - fsl_usb_clk_gate(hcd->self.controller->platform_data, true); - usb_host_set_wakeup(hcd->self.controller, false); - fsl_usb_clk_gate(hcd->self.controller->platform_data, false); - } - return 0; - } - /* only the otg host can go here */ - /* wait for all usb device on the hcd dettached */ - while(roothub->children[0] != NULL) - msleep(1); - if ((pdata->operating_mode != FSL_USB2_MPH_HOST) && (!(hcd->state & HC_STATE_SUSPENDED))) - { - usb_lock_device(roothub); - usb_external_suspend_device(roothub, PMSG_USER_SUSPEND); - usb_unlock_device(roothub); - } - - if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) { - fsl_usb_clk_gate(hcd->self.controller->platform_data, true); - set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); + if (device_may_wakeup(&(pdev->dev))) { + /* Need open clock for register access */ + if (pdata->usb_clock_for_pm) + pdata->usb_clock_for_pm(true); } #ifdef DEBUG @@ -590,9 +457,27 @@ static int ehci_fsl_drv_suspend(struct platform_device *pdev, pdata->suspended, pdata->already_suspended, mode, tmp); #endif + /* + * If the controller is already suspended, then this must be a + * PM suspend. Remember this fact, so that we will leave the + * controller suspended at PM resume time. + */ + if (pdata->suspended) { + pr_debug("%s: already suspended, leaving early\n", __func__); + pdata->already_suspended = 1; + goto err1; + } + + pr_debug("%s: suspending...\n", __func__); + printk(KERN_INFO "USB Host suspended\n"); port_status = ehci_readl(ehci, &ehci->regs->port_status[0]); + pdev->dev.power.power_state = PMSG_SUSPEND; + + /* ignore non-host interrupts */ + clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); + /* save EHCI registers */ pdata->pm_command = ehci_readl(ehci, &ehci->regs->command); pdata->pm_command &= ~CMD_RUN; @@ -611,11 +496,25 @@ static int ehci_fsl_drv_suspend(struct platform_device *pdev, /* clear PHCD bit */ pdata->pm_portsc &= ~PORT_PHCD; - if (test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) { - //fsl_usb_lowpower_mode(pdata ,true); - //usb_host_set_wakeup(hcd->self.controller, true); - fsl_usb_clk_gate(hcd->self.controller->platform_data, false); - clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); + + pdata->suspended = 1; + + if (!device_may_wakeup(&(pdev->dev))) { + /* clear PP to cut power to the port */ + tmp = ehci_readl(ehci, &ehci->regs->port_status[0]); + tmp &= ~PORT_POWER; + ehci_writel(ehci, tmp, &ehci->regs->port_status[0]); + goto err1; + } + + tmp = ehci_readl(ehci, &ehci->regs->port_status[0]); + + if (pdata->platform_suspend) + pdata->platform_suspend(pdata); +err1: + if (device_may_wakeup(&(pdev->dev))) { + if (pdata->usb_clock_for_pm) + pdata->usb_clock_for_pm(false); } return 0; } @@ -624,35 +523,47 @@ static int ehci_fsl_drv_resume(struct platform_device *pdev) { struct usb_hcd *hcd = platform_get_drvdata(pdev); struct ehci_hcd *ehci = hcd_to_ehci(hcd); - struct usb_device *roothub = hcd->self.root_hub; u32 tmp; struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; - /* Only handles OTG mode switch event */ - if (pdev->dev.power.status == DPM_RESUMING){ - pr_debug("%s, system pm event \n", __func__); - if (hcd->self.is_b_host) { - if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) { - fsl_usb_clk_gate(hcd->self.controller->platform_data, true); - } - usb_host_set_wakeup(hcd->self.controller, true); - - if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) { - fsl_usb_clk_gate(hcd->self.controller->platform_data, false); - } - } + + pr_debug("%s('%s'): suspend=%d already_suspended=%d\n", __func__, + pdata->name, pdata->suspended, pdata->already_suspended); + + /* + * If the controller was already suspended at suspend time, + * then don't resume it now. + */ + if (pdata->already_suspended) { + pr_debug("already suspended, leaving early\n"); + pdata->already_suspended = 0; return 0; } - if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) { - set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); - fsl_usb_clk_gate(hcd->self.controller->platform_data, true); - //usb_host_set_wakeup(hcd->self.controller, false); - //fsl_usb_lowpower_mode(pdata, false); + + if (!pdata->suspended) { + pr_debug("not suspended, leaving early\n"); + return 0; } - printk("USB Host resume ... %s\n", pdata->name); + /* If hcd is resumed by non-usb wakeup events, + * then usb clocks are still not open when come here */ + if (device_may_wakeup(&(pdev->dev))) { + /* Need open clock for register access */ + if (pdata->usb_clock_for_pm) + pdata->usb_clock_for_pm(true); + } + + tmp = ehci_readl(ehci, &ehci->regs->port_status[0]); + + pdata->suspended = 0; + + pr_debug("%s resuming...\n", __func__); + /* set host mode */ fsl_platform_set_host_mode(hcd); + if (pdata->platform_resume) + pdata->platform_resume(pdata); + /* restore EHCI registers */ ehci_writel(ehci, pdata->pm_portsc, &ehci->regs->port_status[0]); ehci_writel(ehci, pdata->pm_command, &ehci->regs->command); @@ -664,21 +575,32 @@ static int ehci_fsl_drv_resume(struct platform_device *pdev) ehci_writel(ehci, pdata->pm_configured_flag, &ehci->regs->configured_flag); + /* set bit should be done by wakeup irq routine if may wakeup */ + if (!device_may_wakeup(&(pdev->dev))) + set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); + else + while (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) + msleep(1); + + pdev->dev.power.power_state = PMSG_ON; tmp = ehci_readl(ehci, &ehci->regs->command); tmp |= CMD_RUN; ehci_writel(ehci, tmp, &ehci->regs->command); - if ((hcd->state & HC_STATE_SUSPENDED)){ - usb_lock_device(roothub); - usb_external_resume_device(roothub, PMSG_USER_RESUME); - usb_unlock_device(roothub); + usb_hcd_resume_root_hub(hcd); + + printk(KERN_INFO "USB Host resumed\n"); + + if (device_may_wakeup(&(pdev->dev))) { + if (pdata->usb_clock_for_pm) + pdata->usb_clock_for_pm(false); } - printk(KERN_INFO "USB Host resume ok\n"); return 0; } -#endif +#endif /* CONFIG_USB_OTG */ + MODULE_ALIAS("platform:fsl-ehci"); static struct platform_driver ehci_fsl_driver = { diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 1a9266e7e798..f0d6627fb981 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -28,6 +28,7 @@ #include <linux/errno.h> #include <linux/init.h> #include <linux/timer.h> +#include <linux/ktime.h> #include <linux/list.h> #include <linux/interrupt.h> #include <linux/reboot.h> @@ -660,6 +661,7 @@ static int ehci_run (struct usb_hcd *hcd) ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */ msleep(5); up_write(&ehci_cf_port_reset_rwsem); + ehci->last_periodic_enable = ktime_get_real(); temp = HC_VERSION(ehci_readl(ehci, &ehci->caps->hc_capbase)); ehci_info (ehci, @@ -767,9 +769,10 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) /* start 20 msec resume signaling from this port, * and make khubd collect PORT_STAT_C_SUSPEND to - * stop that signaling. + * stop that signaling. Use 5 ms extra for safety, + * like usb_port_resume() does. */ - ehci->reset_done [i] = jiffies + msecs_to_jiffies (20); + ehci->reset_done[i] = jiffies + msecs_to_jiffies(25); ehci_dbg (ehci, "port %d remote wakeup\n", i + 1); mod_timer(&hcd->rh_timer, ehci->reset_done[i]); } diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 44ff32306362..2eac68f54ccd 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c @@ -112,7 +112,6 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) int port; int mask; - printk("%s\n", __func__); ehci_dbg(ehci, "suspend root hub\n"); if (time_before (jiffies, ehci->next_statechange)) @@ -120,9 +119,26 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) del_timer_sync(&ehci->watchdog); del_timer_sync(&ehci->iaa_watchdog); - port = HCS_N_PORTS (ehci->hcs_params); spin_lock_irq (&ehci->lock); + /* Once the controller is stopped, port resumes that are already + * in progress won't complete. Hence if remote wakeup is enabled + * for the root hub and any ports are in the middle of a resume or + * remote wakeup, we must fail the suspend. + */ + if (hcd->self.root_hub->do_remote_wakeup) { + port = HCS_N_PORTS(ehci->hcs_params); + while (port--) { + if (ehci->reset_done[port] != 0) { + spin_unlock_irq(&ehci->lock); + ehci_dbg(ehci, "suspend failed because " + "port %d is resuming\n", + port + 1); + return -EBUSY; + } + } + } + /* stop schedules, clean any completed work */ if (HC_IS_RUNNING(hcd->state)) { ehci_quiesce (ehci); @@ -138,6 +154,7 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) */ ehci->bus_suspended = 0; ehci->owned_ports = 0; + port = HCS_N_PORTS(ehci->hcs_params); while (port--) { u32 __iomem *reg = &ehci->regs->port_status [port]; u32 t1 = ehci_readl(ehci, reg) & ~PORT_RWC_BITS; diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index c2f1b7df918c..c757a706843c 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c @@ -72,6 +72,12 @@ static int ehci_pci_setup(struct usb_hcd *hcd) int retval; switch (pdev->vendor) { + case PCI_VENDOR_ID_INTEL: + if (pdev->device == 0x27cc) { + ehci->broken_periodic = 1; + ehci_info(ehci, "using broken periodic workaround\n"); + } + break; case PCI_VENDOR_ID_TOSHIBA_2: /* celleb's companion chip */ if (pdev->device == 0x01b5) { diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 7673554fa64d..1ae9faf1f8c2 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c @@ -475,8 +475,20 @@ halt: * we must clear the TT buffer (11.17.5). */ if (unlikely(last_status != -EINPROGRESS && - last_status != -EREMOTEIO)) - ehci_clear_tt_buffer(ehci, qh, urb, token); + last_status != -EREMOTEIO)) { + /* The TT's in some hubs malfunction when they + * receive this request following a STALL (they + * stop sending isochronous packets). Since a + * STALL can't leave the TT buffer in a busy + * state (if you believe Figures 11-48 - 11-51 + * in the USB 2.0 spec), we won't clear the TT + * buffer in this case. Strictly speaking this + * is a violation of the spec. + */ + if (last_status != -EPIPE) + ehci_clear_tt_buffer(ehci, qh, urb, + token); + } } /* if we're removing something not at the queue head, @@ -790,9 +802,10 @@ qh_make ( * But interval 1 scheduling is simpler, and * includes high bandwidth. */ - dbg ("intr period %d uframes, NYET!", - urb->interval); - goto done; + urb->interval = 1; + } else if (qh->period > ehci->periodic_size) { + qh->period = ehci->periodic_size; + urb->interval = qh->period << 3; } } else { int think_time; @@ -815,6 +828,10 @@ qh_make ( usb_calc_bus_time (urb->dev->speed, is_input, 0, max_packet (maxp))); qh->period = urb->interval; + if (qh->period > ehci->periodic_size) { + qh->period = ehci->periodic_size; + urb->interval = qh->period; + } } } diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index edd61ee90323..c340f1f4b881 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c @@ -456,6 +456,8 @@ static int enable_periodic (struct ehci_hcd *ehci) /* make sure ehci_work scans these */ ehci->next_uframe = ehci_readl(ehci, &ehci->regs->frame_index) % (ehci->periodic_size << 3); + if (unlikely(ehci->broken_periodic)) + ehci->last_periodic_enable = ktime_get_real(); return 0; } @@ -467,6 +469,16 @@ static int disable_periodic (struct ehci_hcd *ehci) if (--ehci->periodic_sched) return 0; + if (unlikely(ehci->broken_periodic)) { + /* delay experimentally determined */ + ktime_t safe = ktime_add_us(ehci->last_periodic_enable, 1000); + ktime_t now = ktime_get_real(); + s64 delay = ktime_us_delta(safe, now); + + if (unlikely(delay > 0)) + udelay(delay); + } + /* did setting PSE not take effect yet? * takes effect only at frame boundaries... */ diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index 4b81f5e77c8b..7a412652cb5d 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h @@ -118,6 +118,7 @@ struct ehci_hcd { /* one per controller */ unsigned stamp; unsigned random_frame; unsigned long next_statechange; + ktime_t last_periodic_enable; u32 command; /* SILICON QUIRKS */ @@ -126,6 +127,7 @@ struct ehci_hcd { /* one per controller */ unsigned big_endian_mmio:1; unsigned big_endian_desc:1; unsigned has_amcc_usb23:1; + unsigned broken_periodic:1; /* required for usb32 quirk */ #define OHCI_CTRL_HCFS (3 << 6) diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 58151687d351..1ed2a16a61de 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c @@ -88,6 +88,7 @@ static int ohci_restart (struct ohci_hcd *ohci); #ifdef CONFIG_PCI static void quirk_amd_pll(int state); static void amd_iso_dev_put(void); +static void sb800_prefetch(struct ohci_hcd *ohci, int on); #else static inline void quirk_amd_pll(int state) { @@ -97,6 +98,10 @@ static inline void amd_iso_dev_put(void) { return; } +static inline void sb800_prefetch(struct ohci_hcd *ohci, int on) +{ + return; +} #endif diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c index d2ba04dd785e..b8a1148f248e 100644 --- a/drivers/usb/host/ohci-pci.c +++ b/drivers/usb/host/ohci-pci.c @@ -177,6 +177,13 @@ static int ohci_quirk_amd700(struct usb_hcd *hcd) return 0; pci_read_config_byte(amd_smbus_dev, PCI_REVISION_ID, &rev); + + /* SB800 needs pre-fetch fix */ + if ((rev >= 0x40) && (rev <= 0x4f)) { + ohci->flags |= OHCI_QUIRK_AMD_PREFETCH; + ohci_dbg(ohci, "enabled AMD prefetch quirk\n"); + } + if ((rev > 0x3b) || (rev < 0x30)) { pci_dev_put(amd_smbus_dev); amd_smbus_dev = NULL; @@ -262,6 +269,19 @@ static void amd_iso_dev_put(void) } +static void sb800_prefetch(struct ohci_hcd *ohci, int on) +{ + struct pci_dev *pdev; + u16 misc; + + pdev = to_pci_dev(ohci_to_hcd(ohci)->self.controller); + pci_read_config_word(pdev, 0x50, &misc); + if (on == 0) + pci_write_config_word(pdev, 0x50, misc & 0xfcff); + else + pci_write_config_word(pdev, 0x50, misc | 0x0300); +} + /* List of quirks for OHCI */ static const struct pci_device_id ohci_pci_quirks[] = { { diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c index c2d80f80448b..2c7409b09e8b 100644 --- a/drivers/usb/host/ohci-q.c +++ b/drivers/usb/host/ohci-q.c @@ -49,9 +49,12 @@ __acquires(ohci->lock) switch (usb_pipetype (urb->pipe)) { case PIPE_ISOCHRONOUS: ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs--; - if (ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs == 0 - && quirk_amdiso(ohci)) - quirk_amd_pll(1); + if (ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs == 0) { + if (quirk_amdiso(ohci)) + quirk_amd_pll(1); + if (quirk_amdprefetch(ohci)) + sb800_prefetch(ohci, 0); + } break; case PIPE_INTERRUPT: ohci_to_hcd(ohci)->self.bandwidth_int_reqs--; @@ -680,9 +683,12 @@ static void td_submit_urb ( data + urb->iso_frame_desc [cnt].offset, urb->iso_frame_desc [cnt].length, urb, cnt); } - if (ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs == 0 - && quirk_amdiso(ohci)) - quirk_amd_pll(0); + if (ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs == 0) { + if (quirk_amdiso(ohci)) + quirk_amd_pll(0); + if (quirk_amdprefetch(ohci)) + sb800_prefetch(ohci, 1); + } periodic = ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs++ == 0 && ohci_to_hcd(ohci)->self.bandwidth_int_reqs == 0; break; diff --git a/drivers/usb/host/ohci.h b/drivers/usb/host/ohci.h index 222011f6172c..5bf15fed0d9f 100644 --- a/drivers/usb/host/ohci.h +++ b/drivers/usb/host/ohci.h @@ -402,6 +402,7 @@ struct ohci_hcd { #define OHCI_QUIRK_FRAME_NO 0x80 /* no big endian frame_no shift */ #define OHCI_QUIRK_HUB_POWER 0x100 /* distrust firmware power/oc setup */ #define OHCI_QUIRK_AMD_ISO 0x200 /* ISO transfers*/ +#define OHCI_QUIRK_AMD_PREFETCH 0x400 /* pre-fetch for ISO transfer */ // there are also chip quirks/bugs in init logic struct work_struct nec_work; /* Worker for NEC quirk */ @@ -433,6 +434,10 @@ static inline int quirk_amdiso(struct ohci_hcd *ohci) { return ohci->flags & OHCI_QUIRK_AMD_ISO; } +static inline int quirk_amdprefetch(struct ohci_hcd *ohci) +{ + return ohci->flags & OHCI_QUIRK_AMD_PREFETCH; +} #else static inline int quirk_nec(struct ohci_hcd *ohci) { @@ -446,6 +451,10 @@ static inline int quirk_amdiso(struct ohci_hcd *ohci) { return 0; } +static inline int quirk_amdprefetch(struct ohci_hcd *ohci) +{ + return 0; +} #endif /* convert between an hcd pointer and the corresponding ohci_hcd */ diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c index a949259f18b9..5b22a4d1c9e4 100644 --- a/drivers/usb/host/sl811-hcd.c +++ b/drivers/usb/host/sl811-hcd.c @@ -719,8 +719,12 @@ retry: /* port status seems weird until after reset, so * force the reset and make khubd clean up later. */ - sl811->port1 |= (1 << USB_PORT_FEAT_C_CONNECTION) - | (1 << USB_PORT_FEAT_CONNECTION); + if (sl811->stat_insrmv & 1) + sl811->port1 |= 1 << USB_PORT_FEAT_CONNECTION; + else + sl811->port1 &= ~(1 << USB_PORT_FEAT_CONNECTION); + + sl811->port1 |= 1 << USB_PORT_FEAT_C_CONNECTION; } else if (irqstat & SL11H_INTMASK_RD) { if (sl811->port1 & (1 << USB_PORT_FEAT_SUSPEND)) { diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c index 274751b4409c..eb37d86bafef 100644 --- a/drivers/usb/host/uhci-hcd.c +++ b/drivers/usb/host/uhci-hcd.c @@ -749,7 +749,20 @@ static int uhci_rh_suspend(struct usb_hcd *hcd) spin_lock_irq(&uhci->lock); if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) rc = -ESHUTDOWN; - else if (!uhci->dead) + else if (uhci->dead) + ; /* Dead controllers tell no tales */ + + /* Once the controller is stopped, port resumes that are already + * in progress won't complete. Hence if remote wakeup is enabled + * for the root hub and any ports are in the middle of a resume or + * remote wakeup, we must fail the suspend. + */ + else if (hcd->self.root_hub->do_remote_wakeup && + uhci->resuming_ports) { + dev_dbg(uhci_dev(uhci), "suspend failed because a port " + "is resuming\n"); + rc = -EBUSY; + } else suspend_rh(uhci, UHCI_RH_SUSPENDED); spin_unlock_irq(&uhci->lock); return rc; diff --git a/drivers/usb/host/uhci-hub.c b/drivers/usb/host/uhci-hub.c index 885b585360b9..8270055848ca 100644 --- a/drivers/usb/host/uhci-hub.c +++ b/drivers/usb/host/uhci-hub.c @@ -167,7 +167,7 @@ static void uhci_check_ports(struct uhci_hcd *uhci) /* Port received a wakeup request */ set_bit(port, &uhci->resuming_ports); uhci->ports_timeout = jiffies + - msecs_to_jiffies(20); + msecs_to_jiffies(25); /* Make sure we see the port again * after the resuming period is over. */ diff --git a/drivers/usb/host/xhci-dbg.c b/drivers/usb/host/xhci-dbg.c index 705e34324156..33128d52f212 100644 --- a/drivers/usb/host/xhci-dbg.c +++ b/drivers/usb/host/xhci-dbg.c @@ -413,7 +413,8 @@ void xhci_dbg_slot_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx) int i; struct xhci_slot_ctx *slot_ctx = xhci_get_slot_ctx(xhci, ctx); - dma_addr_t dma = ctx->dma + ((unsigned long)slot_ctx - (unsigned long)ctx); + dma_addr_t dma = ctx->dma + + ((unsigned long)slot_ctx - (unsigned long)ctx->bytes); int csz = HCC_64BYTE_CONTEXT(xhci->hcc_params); xhci_dbg(xhci, "Slot Context:\n"); @@ -459,7 +460,7 @@ void xhci_dbg_ep_ctx(struct xhci_hcd *xhci, for (i = 0; i < last_ep_ctx; ++i) { struct xhci_ep_ctx *ep_ctx = xhci_get_ep_ctx(xhci, ctx, i); dma_addr_t dma = ctx->dma + - ((unsigned long)ep_ctx - (unsigned long)ctx); + ((unsigned long)ep_ctx - (unsigned long)ctx->bytes); xhci_dbg(xhci, "Endpoint %02d Context:\n", i); xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - ep_info\n", diff --git a/drivers/usb/host/xhci-hcd.c b/drivers/usb/host/xhci-hcd.c index 816c39caca1c..e478a63488fb 100644 --- a/drivers/usb/host/xhci-hcd.c +++ b/drivers/usb/host/xhci-hcd.c @@ -22,12 +22,18 @@ #include <linux/irq.h> #include <linux/module.h> +#include <linux/moduleparam.h> #include "xhci.h" #define DRIVER_AUTHOR "Sarah Sharp" #define DRIVER_DESC "'eXtensible' Host Controller (xHC) Driver" +/* Some 0.95 hardware can't handle the chain bit on a Link TRB being cleared */ +static int link_quirk; +module_param(link_quirk, int, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(link_quirk, "Don't clear the chain bit on a link TRB"); + /* TODO: copied from ehci-hcd.c - can this be refactored? */ /* * handshake - spin reading hc until handshake completes or fails @@ -214,6 +220,12 @@ int xhci_init(struct usb_hcd *hcd) xhci_dbg(xhci, "xhci_init\n"); spin_lock_init(&xhci->lock); + if (link_quirk) { + xhci_dbg(xhci, "QUIRK: Not clearing Link TRB chain bits.\n"); + xhci->quirks |= XHCI_LINK_TRB_QUIRK; + } else { + xhci_dbg(xhci, "xHCI doesn't need link TRB QUIRK\n"); + } retval = xhci_mem_init(xhci, GFP_KERNEL); xhci_dbg(xhci, "Finished xhci_init\n"); @@ -555,13 +567,22 @@ unsigned int xhci_get_endpoint_flag(struct usb_endpoint_descriptor *desc) return 1 << (xhci_get_endpoint_index(desc) + 1); } +/* Find the flag for this endpoint (for use in the control context). Use the + * endpoint index to create a bitmask. The slot context is bit 0, endpoint 0 is + * bit 1, etc. + */ +unsigned int xhci_get_endpoint_flag_from_index(unsigned int ep_index) +{ + return 1 << (ep_index + 1); +} + /* Compute the last valid endpoint context index. Basically, this is the * endpoint index plus one. For slot contexts with more than valid endpoint, * we find the most significant bit set in the added contexts flags. * e.g. ep 1 IN (with epnum 0x81) => added_ctxs = 0b1000 * fls(0b1000) = 4, but the endpoint context index is 3, so subtract one. */ -static inline unsigned int xhci_last_valid_endpoint(u32 added_ctxs) +unsigned int xhci_last_valid_endpoint(u32 added_ctxs) { return fls(added_ctxs) - 1; } @@ -589,6 +610,70 @@ int xhci_check_args(struct usb_hcd *hcd, struct usb_device *udev, return 1; } +static int xhci_configure_endpoint(struct xhci_hcd *xhci, + struct usb_device *udev, struct xhci_virt_device *virt_dev, + bool ctx_change); + +/* + * Full speed devices may have a max packet size greater than 8 bytes, but the + * USB core doesn't know that until it reads the first 8 bytes of the + * descriptor. If the usb_device's max packet size changes after that point, + * we need to issue an evaluate context command and wait on it. + */ +static int xhci_check_maxpacket(struct xhci_hcd *xhci, unsigned int slot_id, + unsigned int ep_index, struct urb *urb) +{ + struct xhci_container_ctx *in_ctx; + struct xhci_container_ctx *out_ctx; + struct xhci_input_control_ctx *ctrl_ctx; + struct xhci_ep_ctx *ep_ctx; + int max_packet_size; + int hw_max_packet_size; + int ret = 0; + + out_ctx = xhci->devs[slot_id]->out_ctx; + ep_ctx = xhci_get_ep_ctx(xhci, out_ctx, ep_index); + hw_max_packet_size = MAX_PACKET_DECODED(ep_ctx->ep_info2); + max_packet_size = urb->dev->ep0.desc.wMaxPacketSize; + if (hw_max_packet_size != max_packet_size) { + xhci_dbg(xhci, "Max Packet Size for ep 0 changed.\n"); + xhci_dbg(xhci, "Max packet size in usb_device = %d\n", + max_packet_size); + xhci_dbg(xhci, "Max packet size in xHCI HW = %d\n", + hw_max_packet_size); + xhci_dbg(xhci, "Issuing evaluate context command.\n"); + + /* Set up the modified control endpoint 0 */ + xhci_endpoint_copy(xhci, xhci->devs[slot_id], ep_index); + in_ctx = xhci->devs[slot_id]->in_ctx; + ep_ctx = xhci_get_ep_ctx(xhci, in_ctx, ep_index); + ep_ctx->ep_info2 &= ~MAX_PACKET_MASK; + ep_ctx->ep_info2 |= MAX_PACKET(max_packet_size); + + /* Set up the input context flags for the command */ + /* FIXME: This won't work if a non-default control endpoint + * changes max packet sizes. + */ + ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx); + ctrl_ctx->add_flags = EP0_FLAG; + ctrl_ctx->drop_flags = 0; + + xhci_dbg(xhci, "Slot %d input context\n", slot_id); + xhci_dbg_ctx(xhci, in_ctx, ep_index); + xhci_dbg(xhci, "Slot %d output context\n", slot_id); + xhci_dbg_ctx(xhci, out_ctx, ep_index); + + ret = xhci_configure_endpoint(xhci, urb->dev, + xhci->devs[slot_id], true); + + /* Clean up the input context for later use by bandwidth + * functions. + */ + ctrl_ctx->add_flags = SLOT_FLAG; + } + return ret; +} + /* * non-error returns are a promise to giveback() the urb later * we drop ownership so next owner (or urb unlink) can get it @@ -600,13 +685,13 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags) int ret = 0; unsigned int slot_id, ep_index; + if (!urb || xhci_check_args(hcd, urb->dev, urb->ep, true, __func__) <= 0) return -EINVAL; slot_id = urb->dev->slot_id; ep_index = xhci_get_endpoint_index(&urb->ep->desc); - spin_lock_irqsave(&xhci->lock, flags); if (!xhci->devs || !xhci->devs[slot_id]) { if (!in_interrupt()) dev_warn(&urb->dev->dev, "WARN: urb submitted for dev with no Slot ID\n"); @@ -619,19 +704,38 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags) ret = -ESHUTDOWN; goto exit; } - if (usb_endpoint_xfer_control(&urb->ep->desc)) + if (usb_endpoint_xfer_control(&urb->ep->desc)) { + /* Check to see if the max packet size for the default control + * endpoint changed during FS device enumeration + */ + if (urb->dev->speed == USB_SPEED_FULL) { + ret = xhci_check_maxpacket(xhci, slot_id, + ep_index, urb); + if (ret < 0) + return ret; + } + /* We have a spinlock and interrupts disabled, so we must pass * atomic context to this function, which may allocate memory. */ + spin_lock_irqsave(&xhci->lock, flags); ret = xhci_queue_ctrl_tx(xhci, GFP_ATOMIC, urb, slot_id, ep_index); - else if (usb_endpoint_xfer_bulk(&urb->ep->desc)) + spin_unlock_irqrestore(&xhci->lock, flags); + } else if (usb_endpoint_xfer_bulk(&urb->ep->desc)) { + spin_lock_irqsave(&xhci->lock, flags); ret = xhci_queue_bulk_tx(xhci, GFP_ATOMIC, urb, slot_id, ep_index); - else + spin_unlock_irqrestore(&xhci->lock, flags); + } else if (usb_endpoint_xfer_int(&urb->ep->desc)) { + spin_lock_irqsave(&xhci->lock, flags); + ret = xhci_queue_intr_tx(xhci, GFP_ATOMIC, urb, + slot_id, ep_index); + spin_unlock_irqrestore(&xhci->lock, flags); + } else { ret = -EINVAL; + } exit: - spin_unlock_irqrestore(&xhci->lock, flags); return ret; } @@ -930,6 +1034,122 @@ static void xhci_zero_in_ctx(struct xhci_hcd *xhci, struct xhci_virt_device *vir } } +static int xhci_configure_endpoint_result(struct xhci_hcd *xhci, + struct usb_device *udev, struct xhci_virt_device *virt_dev) +{ + int ret; + + switch (virt_dev->cmd_status) { + case COMP_ENOMEM: + dev_warn(&udev->dev, "Not enough host controller resources " + "for new device state.\n"); + ret = -ENOMEM; + /* FIXME: can we allocate more resources for the HC? */ + break; + case COMP_BW_ERR: + dev_warn(&udev->dev, "Not enough bandwidth " + "for new device state.\n"); + ret = -ENOSPC; + /* FIXME: can we go back to the old state? */ + break; + case COMP_TRB_ERR: + /* the HCD set up something wrong */ + dev_warn(&udev->dev, "ERROR: Endpoint drop flag = 0, " + "add flag = 1, " + "and endpoint is not disabled.\n"); + ret = -EINVAL; + break; + case COMP_SUCCESS: + dev_dbg(&udev->dev, "Successful Endpoint Configure command\n"); + ret = 0; + break; + default: + xhci_err(xhci, "ERROR: unexpected command completion " + "code 0x%x.\n", virt_dev->cmd_status); + ret = -EINVAL; + break; + } + return ret; +} + +static int xhci_evaluate_context_result(struct xhci_hcd *xhci, + struct usb_device *udev, struct xhci_virt_device *virt_dev) +{ + int ret; + + switch (virt_dev->cmd_status) { + case COMP_EINVAL: + dev_warn(&udev->dev, "WARN: xHCI driver setup invalid evaluate " + "context command.\n"); + ret = -EINVAL; + break; + case COMP_EBADSLT: + dev_warn(&udev->dev, "WARN: slot not enabled for" + "evaluate context command.\n"); + case COMP_CTX_STATE: + dev_warn(&udev->dev, "WARN: invalid context state for " + "evaluate context command.\n"); + xhci_dbg_ctx(xhci, virt_dev->out_ctx, 1); + ret = -EINVAL; + break; + case COMP_SUCCESS: + dev_dbg(&udev->dev, "Successful evaluate context command\n"); + ret = 0; + break; + default: + xhci_err(xhci, "ERROR: unexpected command completion " + "code 0x%x.\n", virt_dev->cmd_status); + ret = -EINVAL; + break; + } + return ret; +} + +/* Issue a configure endpoint command or evaluate context command + * and wait for it to finish. + */ +static int xhci_configure_endpoint(struct xhci_hcd *xhci, + struct usb_device *udev, struct xhci_virt_device *virt_dev, + bool ctx_change) +{ + int ret; + int timeleft; + unsigned long flags; + + spin_lock_irqsave(&xhci->lock, flags); + if (!ctx_change) + ret = xhci_queue_configure_endpoint(xhci, virt_dev->in_ctx->dma, + udev->slot_id); + else + ret = xhci_queue_evaluate_context(xhci, virt_dev->in_ctx->dma, + udev->slot_id); + if (ret < 0) { + spin_unlock_irqrestore(&xhci->lock, flags); + xhci_dbg(xhci, "FIXME allocate a new ring segment\n"); + return -ENOMEM; + } + xhci_ring_cmd_db(xhci); + spin_unlock_irqrestore(&xhci->lock, flags); + + /* Wait for the configure endpoint command to complete */ + timeleft = wait_for_completion_interruptible_timeout( + &virt_dev->cmd_completion, + USB_CTRL_SET_TIMEOUT); + if (timeleft <= 0) { + xhci_warn(xhci, "%s while waiting for %s command\n", + timeleft == 0 ? "Timeout" : "Signal", + ctx_change == 0 ? + "configure endpoint" : + "evaluate context"); + /* FIXME cancel the configure endpoint command */ + return -ETIME; + } + + if (!ctx_change) + return xhci_configure_endpoint_result(xhci, udev, virt_dev); + return xhci_evaluate_context_result(xhci, udev, virt_dev); +} + /* Called after one or more calls to xhci_add_endpoint() or * xhci_drop_endpoint(). If this call fails, the USB core is expected * to call xhci_reset_bandwidth(). @@ -944,8 +1164,6 @@ int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) { int i; int ret = 0; - int timeleft; - unsigned long flags; struct xhci_hcd *xhci; struct xhci_virt_device *virt_dev; struct xhci_input_control_ctx *ctrl_ctx; @@ -975,56 +1193,7 @@ int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) xhci_dbg_ctx(xhci, virt_dev->in_ctx, LAST_CTX_TO_EP_NUM(slot_ctx->dev_info)); - spin_lock_irqsave(&xhci->lock, flags); - ret = xhci_queue_configure_endpoint(xhci, virt_dev->in_ctx->dma, - udev->slot_id); - if (ret < 0) { - spin_unlock_irqrestore(&xhci->lock, flags); - xhci_dbg(xhci, "FIXME allocate a new ring segment\n"); - return -ENOMEM; - } - xhci_ring_cmd_db(xhci); - spin_unlock_irqrestore(&xhci->lock, flags); - - /* Wait for the configure endpoint command to complete */ - timeleft = wait_for_completion_interruptible_timeout( - &virt_dev->cmd_completion, - USB_CTRL_SET_TIMEOUT); - if (timeleft <= 0) { - xhci_warn(xhci, "%s while waiting for configure endpoint command\n", - timeleft == 0 ? "Timeout" : "Signal"); - /* FIXME cancel the configure endpoint command */ - return -ETIME; - } - - switch (virt_dev->cmd_status) { - case COMP_ENOMEM: - dev_warn(&udev->dev, "Not enough host controller resources " - "for new device state.\n"); - ret = -ENOMEM; - /* FIXME: can we allocate more resources for the HC? */ - break; - case COMP_BW_ERR: - dev_warn(&udev->dev, "Not enough bandwidth " - "for new device state.\n"); - ret = -ENOSPC; - /* FIXME: can we go back to the old state? */ - break; - case COMP_TRB_ERR: - /* the HCD set up something wrong */ - dev_warn(&udev->dev, "ERROR: Endpoint drop flag = 0, add flag = 1, " - "and endpoint is not disabled.\n"); - ret = -EINVAL; - break; - case COMP_SUCCESS: - dev_dbg(&udev->dev, "Successful Endpoint Configure command\n"); - break; - default: - xhci_err(xhci, "ERROR: unexpected command completion " - "code 0x%x.\n", virt_dev->cmd_status); - ret = -EINVAL; - break; - } + ret = xhci_configure_endpoint(xhci, udev, virt_dev, false); if (ret) { /* Callee should call reset_bandwidth() */ return ret; @@ -1075,6 +1244,75 @@ void xhci_reset_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) xhci_zero_in_ctx(xhci, virt_dev); } +void xhci_setup_input_ctx_for_quirk(struct xhci_hcd *xhci, + unsigned int slot_id, unsigned int ep_index, + struct xhci_dequeue_state *deq_state) +{ + struct xhci_container_ctx *in_ctx; + struct xhci_input_control_ctx *ctrl_ctx; + struct xhci_ep_ctx *ep_ctx; + u32 added_ctxs; + dma_addr_t addr; + + xhci_endpoint_copy(xhci, xhci->devs[slot_id], ep_index); + in_ctx = xhci->devs[slot_id]->in_ctx; + ep_ctx = xhci_get_ep_ctx(xhci, in_ctx, ep_index); + addr = xhci_trb_virt_to_dma(deq_state->new_deq_seg, + deq_state->new_deq_ptr); + if (addr == 0) { + xhci_warn(xhci, "WARN Cannot submit config ep after " + "reset ep command\n"); + xhci_warn(xhci, "WARN deq seg = %p, deq ptr = %p\n", + deq_state->new_deq_seg, + deq_state->new_deq_ptr); + return; + } + ep_ctx->deq = addr | deq_state->new_cycle_state; + + xhci_slot_copy(xhci, xhci->devs[slot_id]); + + ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx); + added_ctxs = xhci_get_endpoint_flag_from_index(ep_index); + ctrl_ctx->add_flags = added_ctxs | SLOT_FLAG; + ctrl_ctx->drop_flags = added_ctxs; + + xhci_dbg(xhci, "Slot ID %d Input Context:\n", slot_id); + xhci_dbg_ctx(xhci, in_ctx, ep_index); +} + +void xhci_cleanup_stalled_ring(struct xhci_hcd *xhci, + struct usb_device *udev, + unsigned int ep_index, struct xhci_ring *ep_ring) +{ + struct xhci_dequeue_state deq_state; + + xhci_dbg(xhci, "Cleaning up stalled endpoint ring\n"); + /* We need to move the HW's dequeue pointer past this TD, + * or it will attempt to resend it on the next doorbell ring. + */ + xhci_find_new_dequeue_state(xhci, udev->slot_id, + ep_index, ep_ring->stopped_td, + &deq_state); + + /* HW with the reset endpoint quirk will use the saved dequeue state to + * issue a configure endpoint command later. + */ + if (!(xhci->quirks & XHCI_RESET_EP_QUIRK)) { + xhci_dbg(xhci, "Queueing new dequeue state\n"); + xhci_queue_new_dequeue_state(xhci, ep_ring, + udev->slot_id, + ep_index, &deq_state); + } else { + /* Better hope no one uses the input context between now and the + * reset endpoint completion! + */ + xhci_dbg(xhci, "Setting up input context for " + "configure endpoint command\n"); + xhci_setup_input_ctx_for_quirk(xhci, udev->slot_id, + ep_index, &deq_state); + } +} + /* Deal with stalled endpoints. The core should have sent the control message * to clear the halt condition. However, we need to make the xHCI hardware * reset its sequence number, since a device will expect a sequence number of @@ -1089,7 +1327,6 @@ void xhci_endpoint_reset(struct usb_hcd *hcd, unsigned int ep_index; unsigned long flags; int ret; - struct xhci_dequeue_state deq_state; struct xhci_ring *ep_ring; xhci = hcd_to_xhci(hcd); @@ -1106,6 +1343,10 @@ void xhci_endpoint_reset(struct usb_hcd *hcd, ep->desc.bEndpointAddress); return; } + if (usb_endpoint_xfer_control(&ep->desc)) { + xhci_dbg(xhci, "Control endpoint stall already handled.\n"); + return; + } xhci_dbg(xhci, "Queueing reset endpoint command\n"); spin_lock_irqsave(&xhci->lock, flags); @@ -1116,16 +1357,7 @@ void xhci_endpoint_reset(struct usb_hcd *hcd, * command. Better hope that last command worked! */ if (!ret) { - xhci_dbg(xhci, "Cleaning up stalled endpoint ring\n"); - /* We need to move the HW's dequeue pointer past this TD, - * or it will attempt to resend it on the next doorbell ring. - */ - xhci_find_new_dequeue_state(xhci, udev->slot_id, - ep_index, ep_ring->stopped_td, &deq_state); - xhci_dbg(xhci, "Queueing new dequeue state\n"); - xhci_queue_new_dequeue_state(xhci, ep_ring, - udev->slot_id, - ep_index, &deq_state); + xhci_cleanup_stalled_ring(xhci, udev, ep_index, ep_ring); kfree(ep_ring->stopped_td); xhci_ring_cmd_db(xhci); } diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index e6b9a1c6002d..21146486fdb2 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -94,6 +94,9 @@ static void xhci_link_segments(struct xhci_hcd *xhci, struct xhci_segment *prev, val = prev->trbs[TRBS_PER_SEGMENT-1].link.control; val &= ~TRB_TYPE_BITMASK; val |= TRB_TYPE(TRB_LINK); + /* Always set the chain bit with 0.95 hardware */ + if (xhci_link_trb_quirk(xhci)) + val |= TRB_CHAIN; prev->trbs[TRBS_PER_SEGMENT-1].link.control = val; } xhci_dbg(xhci, "Linking segment 0x%llx to segment 0x%llx (DMA)\n", @@ -398,15 +401,28 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud /* Step 5 */ ep0_ctx->ep_info2 = EP_TYPE(CTRL_EP); /* - * See section 4.3 bullet 6: - * The default Max Packet size for ep0 is "8 bytes for a USB2 - * LS/FS/HS device or 512 bytes for a USB3 SS device" * XXX: Not sure about wireless USB devices. */ - if (udev->speed == USB_SPEED_SUPER) + switch (udev->speed) { + case USB_SPEED_SUPER: ep0_ctx->ep_info2 |= MAX_PACKET(512); - else + break; + case USB_SPEED_HIGH: + /* USB core guesses at a 64-byte max packet first for FS devices */ + case USB_SPEED_FULL: + ep0_ctx->ep_info2 |= MAX_PACKET(64); + break; + case USB_SPEED_LOW: ep0_ctx->ep_info2 |= MAX_PACKET(8); + break; + case USB_SPEED_VARIABLE: + xhci_dbg(xhci, "FIXME xHCI doesn't support wireless speeds\n"); + return -EINVAL; + break; + default: + /* New speed? */ + BUG(); + } /* EP 0 can handle "burst" sizes of 1, so Max Burst Size field is 0 */ ep0_ctx->ep_info2 |= MAX_BURST(0); ep0_ctx->ep_info2 |= ERROR_COUNT(3); @@ -598,6 +614,44 @@ void xhci_endpoint_zero(struct xhci_hcd *xhci, */ } +/* Copy output xhci_ep_ctx to the input xhci_ep_ctx copy. + * Useful when you want to change one particular aspect of the endpoint and then + * issue a configure endpoint command. + */ +void xhci_endpoint_copy(struct xhci_hcd *xhci, + struct xhci_virt_device *vdev, unsigned int ep_index) +{ + struct xhci_ep_ctx *out_ep_ctx; + struct xhci_ep_ctx *in_ep_ctx; + + out_ep_ctx = xhci_get_ep_ctx(xhci, vdev->out_ctx, ep_index); + in_ep_ctx = xhci_get_ep_ctx(xhci, vdev->in_ctx, ep_index); + + in_ep_ctx->ep_info = out_ep_ctx->ep_info; + in_ep_ctx->ep_info2 = out_ep_ctx->ep_info2; + in_ep_ctx->deq = out_ep_ctx->deq; + in_ep_ctx->tx_info = out_ep_ctx->tx_info; +} + +/* Copy output xhci_slot_ctx to the input xhci_slot_ctx. + * Useful when you want to change one particular aspect of the endpoint and then + * issue a configure endpoint command. Only the context entries field matters, + * but we'll copy the whole thing anyway. + */ +void xhci_slot_copy(struct xhci_hcd *xhci, struct xhci_virt_device *vdev) +{ + struct xhci_slot_ctx *in_slot_ctx; + struct xhci_slot_ctx *out_slot_ctx; + + in_slot_ctx = xhci_get_slot_ctx(xhci, vdev->in_ctx); + out_slot_ctx = xhci_get_slot_ctx(xhci, vdev->out_ctx); + + in_slot_ctx->dev_info = out_slot_ctx->dev_info; + in_slot_ctx->dev_info2 = out_slot_ctx->dev_info2; + in_slot_ctx->tt_info = out_slot_ctx->tt_info; + in_slot_ctx->dev_state = out_slot_ctx->dev_state; +} + /* Set up the scratchpad buffer array and scratchpad buffers, if needed. */ static int scratchpad_alloc(struct xhci_hcd *xhci, gfp_t flags) { @@ -702,9 +756,11 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) int i; /* Free the Event Ring Segment Table and the actual Event Ring */ - xhci_writel(xhci, 0, &xhci->ir_set->erst_size); - xhci_write_64(xhci, 0, &xhci->ir_set->erst_base); - xhci_write_64(xhci, 0, &xhci->ir_set->erst_dequeue); + if (xhci->ir_set) { + xhci_writel(xhci, 0, &xhci->ir_set->erst_size); + xhci_write_64(xhci, 0, &xhci->ir_set->erst_base); + xhci_write_64(xhci, 0, &xhci->ir_set->erst_dequeue); + } size = sizeof(struct xhci_erst_entry)*(xhci->erst.num_entries); if (xhci->erst.entries) pci_free_consistent(pdev, size, @@ -741,9 +797,9 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) xhci->dcbaa, xhci->dcbaa->dma); xhci->dcbaa = NULL; + scratchpad_free(xhci); xhci->page_size = 0; xhci->page_shift = 0; - scratchpad_free(xhci); } int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 592fe7e623f7..8fb308d43bc1 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c @@ -24,6 +24,10 @@ #include "xhci.h" +/* Device for a quirk */ +#define PCI_VENDOR_ID_FRESCO_LOGIC 0x1b73 +#define PCI_DEVICE_ID_FRESCO_LOGIC_PDK 0x1000 + static const char hcd_name[] = "xhci_hcd"; /* called after powerup, by probe or system-pm "wakeup" */ @@ -62,6 +66,15 @@ static int xhci_pci_setup(struct usb_hcd *hcd) xhci->hcc_params = xhci_readl(xhci, &xhci->cap_regs->hcc_params); xhci_print_registers(xhci); + /* Look for vendor-specific quirks */ + if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC && + pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK && + pdev->revision == 0x0) { + xhci->quirks |= XHCI_RESET_EP_QUIRK; + xhci_dbg(xhci, "QUIRK: Fresco Logic xHC needs configure" + " endpoint cmd after reset endpoint\n"); + } + /* Make sure the HC is halted. */ retval = xhci_halt(xhci); if (retval) diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index aa88a067148b..9874d9a60080 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -172,8 +172,9 @@ static void inc_deq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer * have their chain bit cleared (so that each Link TRB is a separate TD). * * Section 6.4.4.1 of the 0.95 spec says link TRBs cannot have the chain bit - * set, but other sections talk about dealing with the chain bit set. - * Assume section 6.4.4.1 is wrong, and the chain bit can be set in a Link TRB. + * set, but other sections talk about dealing with the chain bit set. This was + * fixed in the 0.96 specification errata, but we have to assume that all 0.95 + * xHCI hardware can't handle the chain bit being cleared on a link TRB. */ static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer) { @@ -191,8 +192,14 @@ static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer while (last_trb(xhci, ring, ring->enq_seg, next)) { if (!consumer) { if (ring != xhci->event_ring) { - next->link.control &= ~TRB_CHAIN; - next->link.control |= chain; + /* If we're not dealing with 0.95 hardware, + * carry over the chain bit of the previous TRB + * (which may mean the chain bit is cleared). + */ + if (!xhci_link_trb_quirk(xhci)) { + next->link.control &= ~TRB_CHAIN; + next->link.control |= chain; + } /* Give this link TRB to the hardware */ wmb(); if (next->link.control & TRB_CYCLE) @@ -462,7 +469,6 @@ void xhci_queue_new_dequeue_state(struct xhci_hcd *xhci, * ring running. */ ep_ring->state |= SET_DEQ_PENDING; - xhci_ring_cmd_db(xhci); } /* @@ -531,6 +537,7 @@ static void handle_stopped_endpoint(struct xhci_hcd *xhci, if (deq_state.new_deq_ptr && deq_state.new_deq_seg) { xhci_queue_new_dequeue_state(xhci, ep_ring, slot_id, ep_index, &deq_state); + xhci_ring_cmd_db(xhci); } else { /* Otherwise just ring the doorbell to restart the ring */ ring_ep_doorbell(xhci, slot_id, ep_index); @@ -644,18 +651,31 @@ static void handle_reset_ep_completion(struct xhci_hcd *xhci, { int slot_id; unsigned int ep_index; + struct xhci_ring *ep_ring; slot_id = TRB_TO_SLOT_ID(trb->generic.field[3]); ep_index = TRB_TO_EP_INDEX(trb->generic.field[3]); + ep_ring = xhci->devs[slot_id]->ep_rings[ep_index]; /* This command will only fail if the endpoint wasn't halted, * but we don't care. */ xhci_dbg(xhci, "Ignoring reset ep completion code of %u\n", (unsigned int) GET_COMP_CODE(event->status)); - /* Clear our internal halted state and restart the ring */ - xhci->devs[slot_id]->ep_rings[ep_index]->state &= ~EP_HALTED; - ring_ep_doorbell(xhci, slot_id, ep_index); + /* HW with the reset endpoint quirk needs to have a configure endpoint + * command complete before the endpoint can be used. Queue that here + * because the HW can't handle two commands being queued in a row. + */ + if (xhci->quirks & XHCI_RESET_EP_QUIRK) { + xhci_dbg(xhci, "Queueing configure endpoint command\n"); + xhci_queue_configure_endpoint(xhci, + xhci->devs[slot_id]->in_ctx->dma, slot_id); + xhci_ring_cmd_db(xhci); + } else { + /* Clear our internal halted state and restart the ring */ + ep_ring->state &= ~EP_HALTED; + ring_ep_doorbell(xhci, slot_id, ep_index); + } } static void handle_cmd_completion(struct xhci_hcd *xhci, @@ -664,6 +684,10 @@ static void handle_cmd_completion(struct xhci_hcd *xhci, int slot_id = TRB_TO_SLOT_ID(event->flags); u64 cmd_dma; dma_addr_t cmd_dequeue_dma; + struct xhci_input_control_ctx *ctrl_ctx; + unsigned int ep_index; + struct xhci_ring *ep_ring; + unsigned int ep_state; cmd_dma = event->cmd_trb; cmd_dequeue_dma = xhci_trb_virt_to_dma(xhci->cmd_ring->deq_seg, @@ -691,6 +715,41 @@ static void handle_cmd_completion(struct xhci_hcd *xhci, xhci_free_virt_device(xhci, slot_id); break; case TRB_TYPE(TRB_CONFIG_EP): + /* + * Configure endpoint commands can come from the USB core + * configuration or alt setting changes, or because the HW + * needed an extra configure endpoint command after a reset + * endpoint command. In the latter case, the xHCI driver is + * not waiting on the configure endpoint command. + */ + ctrl_ctx = xhci_get_input_control_ctx(xhci, + xhci->devs[slot_id]->in_ctx); + /* Input ctx add_flags are the endpoint index plus one */ + ep_index = xhci_last_valid_endpoint(ctrl_ctx->add_flags) - 1; + ep_ring = xhci->devs[slot_id]->ep_rings[ep_index]; + if (!ep_ring) { + /* This must have been an initial configure endpoint */ + xhci->devs[slot_id]->cmd_status = + GET_COMP_CODE(event->status); + complete(&xhci->devs[slot_id]->cmd_completion); + break; + } + ep_state = ep_ring->state; + xhci_dbg(xhci, "Completed config ep cmd - last ep index = %d, " + "state = %d\n", ep_index, ep_state); + if (xhci->quirks & XHCI_RESET_EP_QUIRK && + ep_state & EP_HALTED) { + /* Clear our internal halted state and restart ring */ + xhci->devs[slot_id]->ep_rings[ep_index]->state &= + ~EP_HALTED; + ring_ep_doorbell(xhci, slot_id, ep_index); + } else { + xhci->devs[slot_id]->cmd_status = + GET_COMP_CODE(event->status); + complete(&xhci->devs[slot_id]->cmd_completion); + } + break; + case TRB_TYPE(TRB_EVAL_CONTEXT): xhci->devs[slot_id]->cmd_status = GET_COMP_CODE(event->status); complete(&xhci->devs[slot_id]->cmd_completion); break; @@ -763,9 +822,11 @@ static struct xhci_segment *trb_in_td( cur_seg = start_seg; do { + if (start_dma == 0) + return 0; /* We may get an event for a Link TRB in the middle of a TD */ end_seg_dma = xhci_trb_virt_to_dma(cur_seg, - &start_seg->trbs[TRBS_PER_SEGMENT - 1]); + &cur_seg->trbs[TRBS_PER_SEGMENT - 1]); /* If the end TRB isn't in this segment, this is set to 0 */ end_trb_dma = xhci_trb_virt_to_dma(cur_seg, end_trb); @@ -792,8 +853,9 @@ static struct xhci_segment *trb_in_td( } cur_seg = cur_seg->next; start_dma = xhci_trb_virt_to_dma(cur_seg, &cur_seg->trbs[0]); - } while (1); + } while (cur_seg != start_seg); + return 0; } /* @@ -806,6 +868,7 @@ static int handle_tx_event(struct xhci_hcd *xhci, { struct xhci_virt_device *xdev; struct xhci_ring *ep_ring; + unsigned int slot_id; int ep_index; struct xhci_td *td = 0; dma_addr_t event_dma; @@ -814,9 +877,11 @@ static int handle_tx_event(struct xhci_hcd *xhci, struct urb *urb = 0; int status = -EINPROGRESS; struct xhci_ep_ctx *ep_ctx; + u32 trb_comp_code; xhci_dbg(xhci, "In %s\n", __func__); - xdev = xhci->devs[TRB_TO_SLOT_ID(event->flags)]; + slot_id = TRB_TO_SLOT_ID(event->flags); + xdev = xhci->devs[slot_id]; if (!xdev) { xhci_err(xhci, "ERROR Transfer event pointed to bad slot\n"); return -ENODEV; @@ -870,7 +935,8 @@ static int handle_tx_event(struct xhci_hcd *xhci, (unsigned int) event->flags); /* Look for common error cases */ - switch (GET_COMP_CODE(event->transfer_len)) { + trb_comp_code = GET_COMP_CODE(event->transfer_len); + switch (trb_comp_code) { /* Skip codes that require special handling depending on * transfer type */ @@ -913,7 +979,7 @@ static int handle_tx_event(struct xhci_hcd *xhci, /* Was this a control transfer? */ if (usb_endpoint_xfer_control(&td->urb->ep->desc)) { xhci_debug_trb(xhci, xhci->event_ring->dequeue); - switch (GET_COMP_CODE(event->transfer_len)) { + switch (trb_comp_code) { case COMP_SUCCESS: if (event_trb == ep_ring->dequeue) { xhci_warn(xhci, "WARN: Success on ctrl setup TRB without IOC set??\n"); @@ -928,8 +994,39 @@ static int handle_tx_event(struct xhci_hcd *xhci, break; case COMP_SHORT_TX: xhci_warn(xhci, "WARN: short transfer on control ep\n"); - status = -EREMOTEIO; + if (td->urb->transfer_flags & URB_SHORT_NOT_OK) + status = -EREMOTEIO; + else + status = 0; break; + case COMP_BABBLE: + /* The 0.96 spec says a babbling control endpoint + * is not halted. The 0.96 spec says it is. Some HW + * claims to be 0.95 compliant, but it halts the control + * endpoint anyway. Check if a babble halted the + * endpoint. + */ + if (ep_ctx->ep_info != EP_STATE_HALTED) + break; + /* else fall through */ + case COMP_STALL: + /* Did we transfer part of the data (middle) phase? */ + if (event_trb != ep_ring->dequeue && + event_trb != td->last_trb) + td->urb->actual_length = + td->urb->transfer_buffer_length + - TRB_LEN(event->transfer_len); + else + td->urb->actual_length = 0; + + ep_ring->stopped_td = td; + ep_ring->stopped_trb = event_trb; + xhci_queue_reset_ep(xhci, slot_id, ep_index); + xhci_cleanup_stalled_ring(xhci, + td->urb->dev, + ep_index, ep_ring); + xhci_ring_cmd_db(xhci); + goto td_cleanup; default: /* Others already handled above */ break; @@ -943,7 +1040,10 @@ static int handle_tx_event(struct xhci_hcd *xhci, if (event_trb == td->last_trb) { if (td->urb->actual_length != 0) { /* Don't overwrite a previously set error code */ - if (status == -EINPROGRESS || status == 0) + if ((status == -EINPROGRESS || + status == 0) && + (td->urb->transfer_flags + & URB_SHORT_NOT_OK)) /* Did we already see a short data stage? */ status = -EREMOTEIO; } else { @@ -952,7 +1052,7 @@ static int handle_tx_event(struct xhci_hcd *xhci, } } else { /* Maybe the event was for the data stage? */ - if (GET_COMP_CODE(event->transfer_len) != COMP_STOP_INVAL) { + if (trb_comp_code != COMP_STOP_INVAL) { /* We didn't stop on a link TRB in the middle */ td->urb->actual_length = td->urb->transfer_buffer_length - @@ -964,7 +1064,7 @@ static int handle_tx_event(struct xhci_hcd *xhci, } } } else { - switch (GET_COMP_CODE(event->transfer_len)) { + switch (trb_comp_code) { case COMP_SUCCESS: /* Double check that the HW transferred everything. */ if (event_trb != td->last_trb) { @@ -975,7 +1075,12 @@ static int handle_tx_event(struct xhci_hcd *xhci, else status = 0; } else { - xhci_dbg(xhci, "Successful bulk transfer!\n"); + if (usb_endpoint_xfer_bulk(&td->urb->ep->desc)) + xhci_dbg(xhci, "Successful bulk " + "transfer!\n"); + else + xhci_dbg(xhci, "Successful interrupt " + "transfer!\n"); status = 0; } break; @@ -1001,11 +1106,17 @@ static int handle_tx_event(struct xhci_hcd *xhci, td->urb->actual_length = td->urb->transfer_buffer_length - TRB_LEN(event->transfer_len); - if (td->urb->actual_length < 0) { + if (td->urb->transfer_buffer_length < + td->urb->actual_length) { xhci_warn(xhci, "HC gave bad length " "of %d bytes left\n", TRB_LEN(event->transfer_len)); td->urb->actual_length = 0; + if (td->urb->transfer_flags & + URB_SHORT_NOT_OK) + status = -EREMOTEIO; + else + status = 0; } /* Don't overwrite a previously set error code */ if (status == -EINPROGRESS) { @@ -1041,14 +1152,14 @@ static int handle_tx_event(struct xhci_hcd *xhci, /* If the ring didn't stop on a Link or No-op TRB, add * in the actual bytes transferred from the Normal TRB */ - if (GET_COMP_CODE(event->transfer_len) != COMP_STOP_INVAL) + if (trb_comp_code != COMP_STOP_INVAL) td->urb->actual_length += TRB_LEN(cur_trb->generic.field[2]) - TRB_LEN(event->transfer_len); } } - if (GET_COMP_CODE(event->transfer_len) == COMP_STOP_INVAL || - GET_COMP_CODE(event->transfer_len) == COMP_STOP) { + if (trb_comp_code == COMP_STOP_INVAL || + trb_comp_code == COMP_STOP) { /* The Endpoint Stop Command completion will take care of any * stopped TDs. A stopped TD may be restarted, so don't update * the ring dequeue pointer or take this TD off any lists yet. @@ -1056,7 +1167,8 @@ static int handle_tx_event(struct xhci_hcd *xhci, ep_ring->stopped_td = td; ep_ring->stopped_trb = event_trb; } else { - if (GET_COMP_CODE(event->transfer_len) == COMP_STALL) { + if (trb_comp_code == COMP_STALL || + trb_comp_code == COMP_BABBLE) { /* The transfer is completed from the driver's * perspective, but we need to issue a set dequeue * command for this stalled endpoint to move the dequeue @@ -1072,16 +1184,41 @@ static int handle_tx_event(struct xhci_hcd *xhci, inc_deq(xhci, ep_ring, false); } +td_cleanup: /* Clean up the endpoint's TD list */ urb = td->urb; + /* Do one last check of the actual transfer length. + * If the host controller said we transferred more data than + * the buffer length, urb->actual_length will be a very big + * number (since it's unsigned). Play it safe and say we didn't + * transfer anything. + */ + if (urb->actual_length > urb->transfer_buffer_length) { + xhci_warn(xhci, "URB transfer length is wrong, " + "xHC issue? req. len = %u, " + "act. len = %u\n", + urb->transfer_buffer_length, + urb->actual_length); + urb->actual_length = 0; + if (td->urb->transfer_flags & URB_SHORT_NOT_OK) + status = -EREMOTEIO; + else + status = 0; + } list_del(&td->td_list); /* Was this TD slated to be cancelled but completed anyway? */ if (!list_empty(&td->cancelled_td_list)) { list_del(&td->cancelled_td_list); ep_ring->cancels_pending--; } - /* Leave the TD around for the reset endpoint function to use */ - if (GET_COMP_CODE(event->transfer_len) != COMP_STALL) { + /* Leave the TD around for the reset endpoint function to use + * (but only if it's not a control endpoint, since we already + * queued the Set TR dequeue pointer command for stalled + * control endpoints). + */ + if (usb_endpoint_xfer_control(&urb->ep->desc) || + (trb_comp_code != COMP_STALL && + trb_comp_code != COMP_BABBLE)) { kfree(td); } urb->hcpriv = NULL; @@ -1094,7 +1231,7 @@ cleanup: if (urb) { usb_hcd_unlink_urb_from_ep(xhci_to_hcd(xhci), urb); xhci_dbg(xhci, "Giveback URB %p, len = %d, status = %d\n", - urb, td->urb->actual_length, status); + urb, urb->actual_length, status); spin_unlock(&xhci->lock); usb_hcd_giveback_urb(xhci_to_hcd(xhci), urb, status); spin_lock(&xhci->lock); @@ -1335,6 +1472,47 @@ static void giveback_first_trb(struct xhci_hcd *xhci, int slot_id, ring_ep_doorbell(xhci, slot_id, ep_index); } +/* + * xHCI uses normal TRBs for both bulk and interrupt. When the interrupt + * endpoint is to be serviced, the xHC will consume (at most) one TD. A TD + * (comprised of sg list entries) can take several service intervals to + * transmit. + */ +int xhci_queue_intr_tx(struct xhci_hcd *xhci, gfp_t mem_flags, + struct urb *urb, int slot_id, unsigned int ep_index) +{ + struct xhci_ep_ctx *ep_ctx = xhci_get_ep_ctx(xhci, + xhci->devs[slot_id]->out_ctx, ep_index); + int xhci_interval; + int ep_interval; + + xhci_interval = EP_INTERVAL_TO_UFRAMES(ep_ctx->ep_info); + ep_interval = urb->interval; + /* Convert to microframes */ + if (urb->dev->speed == USB_SPEED_LOW || + urb->dev->speed == USB_SPEED_FULL) + ep_interval *= 8; + /* FIXME change this to a warning and a suggestion to use the new API + * to set the polling interval (once the API is added). + */ + if (xhci_interval != ep_interval) { + if (!printk_ratelimit()) + dev_dbg(&urb->dev->dev, "Driver uses different interval" + " (%d microframe%s) than xHCI " + "(%d microframe%s)\n", + ep_interval, + ep_interval == 1 ? "" : "s", + xhci_interval, + xhci_interval == 1 ? "" : "s"); + urb->interval = xhci_interval; + /* Convert back to frames for LS/FS devices */ + if (urb->dev->speed == USB_SPEED_LOW || + urb->dev->speed == USB_SPEED_FULL) + urb->interval /= 8; + } + return xhci_queue_bulk_tx(xhci, GFP_ATOMIC, urb, slot_id, ep_index); +} + static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, struct urb *urb, int slot_id, unsigned int ep_index) { @@ -1733,6 +1911,15 @@ int xhci_queue_configure_endpoint(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr, TRB_TYPE(TRB_CONFIG_EP) | SLOT_ID_FOR_TRB(slot_id)); } +/* Queue an evaluate context command TRB */ +int xhci_queue_evaluate_context(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr, + u32 slot_id) +{ + return queue_command(xhci, lower_32_bits(in_ctx_ptr), + upper_32_bits(in_ctx_ptr), 0, + TRB_TYPE(TRB_EVAL_CONTEXT) | SLOT_ID_FOR_TRB(slot_id)); +} + int xhci_queue_stop_endpoint(struct xhci_hcd *xhci, int slot_id, unsigned int ep_index) { diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index d31d32206ba3..808584153579 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -581,6 +581,7 @@ struct xhci_ep_ctx { /* bit 15 is Linear Stream Array */ /* Interval - period between requests to an endpoint - 125u increments. */ #define EP_INTERVAL(p) ((p & 0xff) << 16) +#define EP_INTERVAL_TO_UFRAMES(p) (1 << (((p) >> 16) & 0xff)) /* ep_info2 bitmasks */ /* @@ -589,6 +590,7 @@ struct xhci_ep_ctx { */ #define FORCE_EVENT (0x1) #define ERROR_COUNT(p) (((p) & 0x3) << 1) +#define CTX_TO_EP_TYPE(p) (((p) >> 3) & 0x7) #define EP_TYPE(p) ((p) << 3) #define ISOC_OUT_EP 1 #define BULK_OUT_EP 2 @@ -601,6 +603,8 @@ struct xhci_ep_ctx { /* bit 7 is Host Initiate Disable - for disabling stream selection */ #define MAX_BURST(p) (((p)&0xff) << 8) #define MAX_PACKET(p) (((p)&0xffff) << 16) +#define MAX_PACKET_MASK (0xffff << 16) +#define MAX_PACKET_DECODED(p) (((p) >> 16) & 0xffff) /** @@ -926,6 +930,12 @@ struct xhci_td { union xhci_trb *last_trb; }; +struct xhci_dequeue_state { + struct xhci_segment *new_deq_seg; + union xhci_trb *new_deq_ptr; + int new_cycle_state; +}; + struct xhci_ring { struct xhci_segment *first_seg; union xhci_trb *enqueue; @@ -952,12 +962,6 @@ struct xhci_ring { u32 cycle_state; }; -struct xhci_dequeue_state { - struct xhci_segment *new_deq_seg; - union xhci_trb *new_deq_ptr; - int new_cycle_state; -}; - struct xhci_erst_entry { /* 64-bit event ring segment address */ u64 seg_addr; @@ -1058,6 +1062,9 @@ struct xhci_hcd { int noops_submitted; int noops_handled; int error_bitmask; + unsigned int quirks; +#define XHCI_LINK_TRB_QUIRK (1 << 0) +#define XHCI_RESET_EP_QUIRK (1 << 1) }; /* For testing purposes */ @@ -1136,6 +1143,13 @@ static inline void xhci_write_64(struct xhci_hcd *xhci, writel(val_hi, ptr + 1); } +static inline int xhci_link_trb_quirk(struct xhci_hcd *xhci) +{ + u32 temp = xhci_readl(xhci, &xhci->cap_regs->hc_capbase); + return ((HC_VERSION(temp) == 0x95) && + (xhci->quirks & XHCI_LINK_TRB_QUIRK)); +} + /* xHCI debugging */ void xhci_print_ir_set(struct xhci_hcd *xhci, struct xhci_intr_reg *ir_set, int set_num); void xhci_print_registers(struct xhci_hcd *xhci); @@ -1158,7 +1172,12 @@ int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id, struct usb_device int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *udev); unsigned int xhci_get_endpoint_index(struct usb_endpoint_descriptor *desc); unsigned int xhci_get_endpoint_flag(struct usb_endpoint_descriptor *desc); +unsigned int xhci_get_endpoint_flag_from_index(unsigned int ep_index); +unsigned int xhci_last_valid_endpoint(u32 added_ctxs); void xhci_endpoint_zero(struct xhci_hcd *xhci, struct xhci_virt_device *virt_dev, struct usb_host_endpoint *ep); +void xhci_endpoint_copy(struct xhci_hcd *xhci, + struct xhci_virt_device *vdev, unsigned int ep_index); +void xhci_slot_copy(struct xhci_hcd *xhci, struct xhci_virt_device *vdev); int xhci_endpoint_init(struct xhci_hcd *xhci, struct xhci_virt_device *virt_dev, struct usb_device *udev, struct usb_host_endpoint *ep, gfp_t mem_flags); @@ -1205,8 +1224,12 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, struct urb *urb, int slot_id, unsigned int ep_index); int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, struct urb *urb, int slot_id, unsigned int ep_index); +int xhci_queue_intr_tx(struct xhci_hcd *xhci, gfp_t mem_flags, struct urb *urb, + int slot_id, unsigned int ep_index); int xhci_queue_configure_endpoint(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr, u32 slot_id); +int xhci_queue_evaluate_context(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr, + u32 slot_id); int xhci_queue_reset_ep(struct xhci_hcd *xhci, int slot_id, unsigned int ep_index); void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, @@ -1215,6 +1238,12 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, void xhci_queue_new_dequeue_state(struct xhci_hcd *xhci, struct xhci_ring *ep_ring, unsigned int slot_id, unsigned int ep_index, struct xhci_dequeue_state *deq_state); +void xhci_cleanup_stalled_ring(struct xhci_hcd *xhci, + struct usb_device *udev, + unsigned int ep_index, struct xhci_ring *ep_ring); +void xhci_queue_config_ep_quirk(struct xhci_hcd *xhci, + unsigned int slot_id, unsigned int ep_index, + struct xhci_dequeue_state *deq_state); /* xHCI roothub code */ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, u16 wIndex, diff --git a/drivers/usb/misc/appledisplay.c b/drivers/usb/misc/appledisplay.c index 1d8e39a557d9..62ff5e729110 100644 --- a/drivers/usb/misc/appledisplay.c +++ b/drivers/usb/misc/appledisplay.c @@ -72,8 +72,8 @@ struct appledisplay { struct usb_device *udev; /* usb device */ struct urb *urb; /* usb request block */ struct backlight_device *bd; /* backlight device */ - char *urbdata; /* interrupt URB data buffer */ - char *msgdata; /* control message data buffer */ + u8 *urbdata; /* interrupt URB data buffer */ + u8 *msgdata; /* control message data buffer */ struct delayed_work work; int button_pressed; diff --git a/drivers/usb/misc/emi62.c b/drivers/usb/misc/emi62.c index 602ee05ba9ff..59860b328534 100644 --- a/drivers/usb/misc/emi62.c +++ b/drivers/usb/misc/emi62.c @@ -167,7 +167,7 @@ static int emi62_load_firmware (struct usb_device *dev) err("%s - error loading firmware: error = %d", __func__, err); goto wraperr; } - } while (i > 0); + } while (rec); /* Assert reset (stop the CPU in the EMI) */ err = emi62_set_reset(dev,1); diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c index 0f7a30b7d2d1..fb1dd27be76d 100644 --- a/drivers/usb/mon/mon_bin.c +++ b/drivers/usb/mon/mon_bin.c @@ -350,12 +350,12 @@ static unsigned int mon_buff_area_alloc_contiguous(struct mon_reader_bin *rp, /* * Return a few (kilo-)bytes to the head of the buffer. - * This is used if a DMA fetch fails. + * This is used if a data fetch fails. */ static void mon_buff_area_shrink(struct mon_reader_bin *rp, unsigned int size) { - size = (size + PKT_ALIGN-1) & ~(PKT_ALIGN-1); + /* size &= ~(PKT_ALIGN-1); -- we're called with aligned size */ rp->b_cnt -= size; if (rp->b_in < size) rp->b_in += rp->b_size; @@ -442,6 +442,7 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb, unsigned int urb_length; unsigned int offset; unsigned int length; + unsigned int delta; unsigned int ndesc, lendesc; unsigned char dir; struct mon_bin_hdr *ep; @@ -546,8 +547,10 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb, if (length != 0) { ep->flag_data = mon_bin_get_data(rp, offset, urb, length); if (ep->flag_data != 0) { /* Yes, it's 0x00, not '0' */ - ep->len_cap = 0; - mon_buff_area_shrink(rp, length); + delta = (ep->len_cap + PKT_ALIGN-1) & ~(PKT_ALIGN-1); + ep->len_cap -= length; + delta -= (ep->len_cap + PKT_ALIGN-1) & ~(PKT_ALIGN-1); + mon_buff_area_shrink(rp, delta); } } else { ep->flag_data = data_tag; diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index 8b3c4e2ed7b8..74073f9a43f0 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c @@ -4,6 +4,7 @@ * Copyright 2005 Mentor Graphics Corporation * Copyright (C) 2005-2006 by Texas Instruments * Copyright (C) 2006-2007 Nokia Corporation + * Copyright (C) 2009 MontaVista Software, Inc. <source@mvista.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -436,14 +437,6 @@ void musb_g_tx(struct musb *musb, u8 epnum) csr |= MUSB_TXCSR_P_WZC_BITS; csr &= ~MUSB_TXCSR_P_SENTSTALL; musb_writew(epio, MUSB_TXCSR, csr); - if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) { - dma->status = MUSB_DMA_STATUS_CORE_ABORT; - musb->dma_controller->channel_abort(dma); - } - - if (request) - musb_g_giveback(musb_ep, request, -EPIPE); - break; } @@ -582,15 +575,25 @@ void musb_g_tx(struct musb *musb, u8 epnum) */ static void rxstate(struct musb *musb, struct musb_request *req) { - u16 csr = 0; const u8 epnum = req->epnum; struct usb_request *request = &req->request; struct musb_ep *musb_ep = &musb->endpoints[epnum].ep_out; void __iomem *epio = musb->endpoints[epnum].regs; unsigned fifo_count = 0; u16 len = musb_ep->packet_sz; + u16 csr = musb_readw(epio, MUSB_RXCSR); - csr = musb_readw(epio, MUSB_RXCSR); + /* We shouldn't get here while DMA is active, but we do... */ + if (dma_channel_status(musb_ep->dma) == MUSB_DMA_STATUS_BUSY) { + DBG(4, "DMA pending...\n"); + return; + } + + if (csr & MUSB_RXCSR_P_SENDSTALL) { + DBG(5, "%s stalling, RXCSR %04x\n", + musb_ep->end_point.name, csr); + return; + } if (is_cppi_enabled() && musb_ep->dma) { struct dma_controller *c = musb->dma_controller; @@ -761,19 +764,10 @@ void musb_g_rx(struct musb *musb, u8 epnum) csr, dma ? " (dma)" : "", request); if (csr & MUSB_RXCSR_P_SENTSTALL) { - if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) { - dma->status = MUSB_DMA_STATUS_CORE_ABORT; - (void) musb->dma_controller->channel_abort(dma); - request->actual += musb_ep->dma->actual_len; - } - csr |= MUSB_RXCSR_P_WZC_BITS; csr &= ~MUSB_RXCSR_P_SENTSTALL; musb_writew(epio, MUSB_RXCSR, csr); - - if (request) - musb_g_giveback(musb_ep, request, -EPIPE); - goto done; + return; } if (csr & MUSB_RXCSR_P_OVERRUN) { @@ -795,7 +789,7 @@ void musb_g_rx(struct musb *musb, u8 epnum) DBG((csr & MUSB_RXCSR_DMAENAB) ? 4 : 1, "%s busy, csr %04x\n", musb_ep->end_point.name, csr); - goto done; + return; } if (dma && (csr & MUSB_RXCSR_DMAENAB)) { @@ -826,22 +820,15 @@ void musb_g_rx(struct musb *musb, u8 epnum) if ((request->actual < request->length) && (musb_ep->dma->actual_len == musb_ep->packet_sz)) - goto done; + return; #endif musb_g_giveback(musb_ep, request, 0); request = next_request(musb_ep); if (!request) - goto done; - - /* don't start more i/o till the stall clears */ - musb_ep_select(mbase, epnum); - csr = musb_readw(epio, MUSB_RXCSR); - if (csr & MUSB_RXCSR_P_SENDSTALL) - goto done; + return; } - /* analyze request if the ep is hot */ if (request) rxstate(musb, to_musb_request(request)); @@ -849,8 +836,6 @@ void musb_g_rx(struct musb *musb, u8 epnum) DBG(3, "packet waiting for %s%s request\n", musb_ep->desc ? "" : "inactive ", musb_ep->end_point.name); - -done: return; } @@ -1244,7 +1229,7 @@ int musb_gadget_set_halt(struct usb_ep *ep, int value) void __iomem *mbase; unsigned long flags; u16 csr; - struct musb_request *request = NULL; + struct musb_request *request; int status = 0; if (!ep) @@ -1260,24 +1245,29 @@ int musb_gadget_set_halt(struct usb_ep *ep, int value) musb_ep_select(mbase, epnum); - /* cannot portably stall with non-empty FIFO */ request = to_musb_request(next_request(musb_ep)); - if (value && musb_ep->is_in) { - csr = musb_readw(epio, MUSB_TXCSR); - if (csr & MUSB_TXCSR_FIFONOTEMPTY) { - DBG(3, "%s fifo busy, cannot halt\n", ep->name); - spin_unlock_irqrestore(&musb->lock, flags); - return -EAGAIN; + if (value) { + if (request) { + DBG(3, "request in progress, cannot halt %s\n", + ep->name); + status = -EAGAIN; + goto done; + } + /* Cannot portably stall with non-empty FIFO */ + if (musb_ep->is_in) { + csr = musb_readw(epio, MUSB_TXCSR); + if (csr & MUSB_TXCSR_FIFONOTEMPTY) { + DBG(3, "FIFO busy, cannot halt %s\n", ep->name); + status = -EAGAIN; + goto done; + } } - } /* set/clear the stall and toggle bits */ DBG(2, "%s: %s stall\n", ep->name, value ? "set" : "clear"); if (musb_ep->is_in) { csr = musb_readw(epio, MUSB_TXCSR); - if (csr & MUSB_TXCSR_FIFONOTEMPTY) - csr |= MUSB_TXCSR_FLUSHFIFO; csr |= MUSB_TXCSR_P_WZC_BITS | MUSB_TXCSR_CLRDATATOG; if (value) @@ -1300,14 +1290,13 @@ int musb_gadget_set_halt(struct usb_ep *ep, int value) musb_writew(epio, MUSB_RXCSR, csr); } -done: - /* maybe start the first request in the queue */ if (!musb_ep->busy && !value && request) { DBG(3, "restarting the request\n"); musb_ep_restart(musb, request); } +done: spin_unlock_irqrestore(&musb->lock, flags); return status; } diff --git a/drivers/usb/musb/musb_gadget_ep0.c b/drivers/usb/musb/musb_gadget_ep0.c index 7a6778675ad3..677cc2ee9fd3 100644 --- a/drivers/usb/musb/musb_gadget_ep0.c +++ b/drivers/usb/musb/musb_gadget_ep0.c @@ -199,7 +199,6 @@ service_in_request(struct musb *musb, const struct usb_ctrlrequest *ctrlrequest) static void musb_g_ep0_giveback(struct musb *musb, struct usb_request *req) { musb_g_giveback(&musb->endpoints[0].ep_in, req, 0); - musb->ep0_state = MUSB_EP0_STAGE_SETUP; } /* @@ -647,7 +646,7 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb) musb->ep0_state = MUSB_EP0_STAGE_STATUSIN; break; default: - ERR("SetupEnd came in a wrong ep0stage %s", + ERR("SetupEnd came in a wrong ep0stage %s\n", decode_ep0stage(musb->ep0_state)); } csr = musb_readw(regs, MUSB_CSR0); @@ -770,12 +769,18 @@ setup: handled = service_zero_data_request( musb, &setup); + /* + * We're expecting no data in any case, so + * always set the DATAEND bit -- doing this + * here helps avoid SetupEnd interrupt coming + * in the idle stage when we're stalling... + */ + musb->ackpend |= MUSB_CSR0_P_DATAEND; + /* status stage might be immediate */ - if (handled > 0) { - musb->ackpend |= MUSB_CSR0_P_DATAEND; + if (handled > 0) musb->ep0_state = MUSB_EP0_STAGE_STATUSIN; - } break; /* sequence #1 (IN to host), includes GET_STATUS diff --git a/drivers/usb/otg/fsl_otg.c b/drivers/usb/otg/fsl_otg.c index 81a2985632b6..6941e0565c03 100644 --- a/drivers/usb/otg/fsl_otg.c +++ b/drivers/usb/otg/fsl_otg.c @@ -34,7 +34,6 @@ #include <linux/init.h> #include <linux/reboot.h> #include <linux/timer.h> -#include <linux/jiffies.h> #include <linux/list.h> #include <linux/usb.h> #include <linux/device.h> @@ -62,8 +61,6 @@ #define DRIVER_DESC "Freescale USB OTG Driver" #define DRIVER_INFO DRIVER_VERSION " " DRIVER_DESC -#define TIMER_FREQ 1000 /* 100 ms*/ -#define IDLE_TIME 5000 /* 1000 ms */ MODULE_DESCRIPTION("Freescale USB OTG Transceiver Driver"); @@ -93,13 +90,6 @@ static struct fsl_otg_config fsl_otg_initdata = { .otg_port = 1, }; -/* the timer is used to monitor the otg loading, if idle for some times - * we will close the otg clk - */ -static unsigned long last_busy; -static bool clk_stopped; -static struct timer_list monitor_timer; - int write_ulpi(u8 addr, u8 data) { u32 temp; @@ -149,6 +139,15 @@ void fsl_otg_dischrg_vbus(int on) /* A-device driver vbus, controlled through PP bit in PORTSC */ void fsl_otg_drv_vbus(struct fsl_usb2_platform_data *pdata, int on) { +/* if (on) + usb_dr_regs->portsc = + cpu_to_le32((le32_to_cpu(usb_dr_regs->portsc) & + ~PORTSC_W1C_BITS) | PORTSC_PORT_POWER); + else + usb_dr_regs->portsc = + cpu_to_le32(le32_to_cpu(usb_dr_regs->portsc) & + ~PORTSC_W1C_BITS & ~PORTSC_PORT_POWER); +*/ if (pdata->xcvr_ops && pdata->xcvr_ops->set_vbus_power) pdata->xcvr_ops->set_vbus_power(pdata->xcvr_ops, pdata, on); } @@ -399,61 +398,6 @@ int fsl_otg_tick_timer(void) return expired; } -static void fsl_otg_clk_gate(bool on) -{ - struct device *dev = fsl_otg_dev->otg.dev; - struct fsl_usb2_platform_data *pdata; - - if (dev) { - pdata = dev->platform_data; - if (pdata && pdata->usb_clock_for_pm) - pdata->usb_clock_for_pm(on); - } -} - -static void fsl_otg_clk_ctl(void) -{ - if (clk_stopped){ - fsl_otg_clk_gate(true); - clk_stopped = false; - } - last_busy = jiffies; -} - -static void fsl_otg_loading_monitor(unsigned long data) -{ - unsigned long now = jiffies; - if (!clk_stopped){ - if (time_after(now, last_busy + msecs_to_jiffies(IDLE_TIME))){ - printk("otg is idle for some times,so we close the clock %x\n", le32_to_cpu(usb_dr_regs->otgsc)); - clk_stopped = true; - fsl_otg_clk_gate(false); - printk("close otg clk ok\n"); - } - } - mod_timer(&monitor_timer, jiffies + msecs_to_jiffies(TIMER_FREQ)); -} - -/** - * Enable vbus interrupt - * The otg cares USB_ID interrupt - * The device cares B Sesstion Valid - */ -static void b_session_irq_enable(bool enable) -{ - int osc = le32_to_cpu(usb_dr_regs->otgsc); - /* The other interrupts' status should not be cleared */ - osc &= ~(OTGSC_INTSTS_USB_ID | OTGSC_INTSTS_A_VBUS_VALID - | OTGSC_INTSTS_A_SESSION_VALID | OTGSC_INTSTS_B_SESSION_VALID); - osc |= OTGSC_INTSTS_B_SESSION_VALID; - - if (enable) - osc |= OTGSC_INTR_B_SESSION_VALID_EN; - else - osc &= ~OTGSC_INTR_B_SESSION_VALID_EN; - usb_dr_regs->otgsc = cpu_to_le32(osc); -} - /* Reset controller, not reset the bus */ void otg_reset_controller(void) { @@ -540,6 +484,7 @@ int fsl_otg_start_gadget(struct otg_fsm *fsm, int on) struct device *dev; struct platform_driver *gadget_pdrv; struct platform_device *gadget_pdev; + if (!xceiv->gadget || !xceiv->gadget->dev.parent) return -ENODEV; @@ -575,6 +520,7 @@ static int fsl_otg_set_host(struct otg_transceiver *otg_p, struct usb_bus *host) if (host) { VDBG("host off......\n"); + otg_p->host->otg_port = fsl_otg_initdata.otg_port; otg_p->host->is_b_host = otg_dev->fsm.id; /* must leave time for khubd to finish its thing @@ -691,29 +637,11 @@ static void fsl_otg_event(struct work_struct *work) { struct fsl_otg *og = container_of(work, struct fsl_otg, otg_event.work); struct otg_fsm *fsm = &og->fsm; - struct otg_transceiver *otg = &og->otg; - - otg->default_a = (fsm->id == 0); - /* clear conn information */ - if (fsm->id) - fsm->b_conn = 0; - else - fsm->a_conn = 0; - - if (otg->host) - otg->host->is_b_host = fsm->id; - if (otg->gadget) - otg->gadget->is_a_peripheral = !fsm->id; if (fsm->id) { /* switch to gadget */ - b_session_irq_enable(true); fsl_otg_start_host(fsm, 0); otg_drv_vbus(fsm, 0); fsl_otg_start_gadget(fsm, 1); - }else { /* switch to host */ - fsl_otg_start_gadget(fsm, 0); - otg_drv_vbus(fsm, 1); - fsl_otg_start_host(fsm, 1); } } @@ -753,13 +681,13 @@ irqreturn_t fsl_otg_isr_gpio(int irq, void *dev_id) struct otg_fsm *fsm; struct fsl_usb2_platform_data *pdata = (struct fsl_usb2_platform_data *)dev_id; - struct fsl_otg *f_otg; + struct fsl_otg *p_otg; struct otg_transceiver *otg_trans = otg_get_transceiver(); int value; - f_otg = container_of(otg_trans, struct fsl_otg, otg); - fsm = &f_otg->fsm; - fsl_otg_clk_ctl(); + p_otg = container_of(otg_trans, struct fsl_otg, otg); + fsm = &p_otg->fsm; + if (pdata->id_gpio == 0) return IRQ_NONE; @@ -771,25 +699,35 @@ irqreturn_t fsl_otg_isr_gpio(int irq, void *dev_id) set_irq_type(gpio_to_irq(pdata->id_gpio), IRQ_TYPE_LEVEL_HIGH); - if (value == f_otg->fsm.id) + if (value == p_otg->fsm.id) return IRQ_HANDLED; - f_otg->fsm.id = value; + p_otg->fsm.id = value; - cancel_delayed_work(&f_otg->otg_event); - schedule_delayed_work(&f_otg->otg_event, msecs_to_jiffies(10)); - /* if host mode, we should clear B_SESSION_VLD event and disable - * B_SESSION_VLD irq - */ - if (!f_otg->fsm.id) { - b_session_irq_enable(false); - }else { - //b_session_irq_enable(true); - } + otg_trans->default_a = (fsm->id == 0); + /* clear conn information */ + if (fsm->id) + fsm->b_conn = 0; + else + fsm->a_conn = 0; + if (otg_trans->host) + otg_trans->host->is_b_host = fsm->id; + if (otg_trans->gadget) + otg_trans->gadget->is_a_peripheral = !fsm->id; + + VDBG("ID int (ID is %d)\n", fsm->id); + if (fsm->id) { /* switch to gadget */ + schedule_delayed_work(&p_otg->otg_event, 100); + + } else { /* switch to host */ + cancel_delayed_work(&p_otg->otg_event); + fsl_otg_start_gadget(fsm, 0); + otg_drv_vbus(fsm, 1); + fsl_otg_start_host(fsm, 1); + } return IRQ_HANDLED; } - /* Interrupt handler. OTG/host/peripheral share the same int line. * OTG driver clears OTGSC interrupts and leaves USB interrupts * intact. It needs to have knowledge of some USB interrupts @@ -797,65 +735,71 @@ irqreturn_t fsl_otg_isr_gpio(int irq, void *dev_id) */ irqreturn_t fsl_otg_isr(int irq, void *dev_id) { - struct fsl_otg *fotg = (struct fsl_otg *)dev_id; - struct otg_transceiver *otg = &fotg->otg; + struct otg_fsm *fsm = &((struct fsl_otg *)dev_id)->fsm; + struct otg_transceiver *otg = &((struct fsl_otg *)dev_id)->otg; u32 otg_int_src, otg_sc; - irqreturn_t ret = IRQ_NONE; - fsl_otg_clk_ctl(); otg_sc = le32_to_cpu(usb_dr_regs->otgsc); otg_int_src = otg_sc & OTGSC_INTSTS_MASK & (otg_sc >> 8); - /* Only clear otg interrupts, expect B_SESSION_VALID, - * Leave it to be handled by arcotg_udc */ - usb_dr_regs->otgsc = ((usb_dr_regs->otgsc | cpu_to_le32(otg_sc & OTGSC_INTSTS_MASK))& - (~OTGSC_INTSTS_B_SESSION_VALID)); + /* Only clear otg interrupts */ + usb_dr_regs->otgsc |= cpu_to_le32(otg_sc & OTGSC_INTSTS_MASK); /*FIXME: ID change not generate when init to 0 */ - fotg->fsm.id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0; - otg->default_a = (fotg->fsm.id == 0); + fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0; + otg->default_a = (fsm->id == 0); /* process OTG interrupts */ if (otg_int_src) { if (otg_int_src & OTGSC_INTSTS_USB_ID) { - fotg->fsm.id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0; - - printk("ID int (ID is %d)\n", fotg->fsm.id); - - cancel_delayed_work(&fotg->otg_event); - schedule_delayed_work(&fotg->otg_event, msecs_to_jiffies(10)); - /* if host mode, we should clear B_SESSION_VLD event and disable - * B_SESSION_VLD irq - */ - if (!fotg->fsm.id) { - b_session_irq_enable(false); - }else { - //b_session_irq_enable(true); + fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0; + otg->default_a = (fsm->id == 0); + /* clear conn information */ + if (fsm->id) + fsm->b_conn = 0; + else + fsm->a_conn = 0; + + if (otg->host) + otg->host->is_b_host = fsm->id; + if (otg->gadget) + otg->gadget->is_a_peripheral = !fsm->id; + VDBG("ID int (ID is %d)\n", fsm->id); + + if (fsm->id) { /* switch to gadget */ + schedule_delayed_work(&((struct fsl_otg *) + dev_id)->otg_event, + 100); + } else { /* switch to host */ + cancel_delayed_work(& + ((struct fsl_otg *)dev_id)-> + otg_event); + fsl_otg_start_gadget(fsm, 0); + otg_drv_vbus(fsm, 1); + fsl_otg_start_host(fsm, 1); } - ret = IRQ_HANDLED; + + return IRQ_HANDLED; } } - return ret; + return IRQ_NONE; } static void fsl_otg_fsm_drv_vbus(int on) { struct otg_fsm *fsm = &(fsl_otg_dev->fsm); struct otg_transceiver *xceiv = fsm->transceiver; + struct device *dev = NULL; - struct device *dev; - /* - * The host is assigned at otg_set_host - */ - if (!xceiv->host) + if (!xceiv->host) { return; - /* - * The dev is assigned at usb_create_hcd which is called earlier - * than otg_set_host at host driver's probe - */ + } + dev = xceiv->host->controller; + fsl_otg_drv_vbus(dev->platform_data, on); + } static struct otg_fsm_ops fsl_otg_ops = { @@ -913,7 +857,6 @@ static int fsl_otg_conf(struct platform_device *pdev) fsl_otg_tc->otg.set_power = fsl_otg_set_power; fsl_otg_tc->otg.start_hnp = fsl_otg_start_hnp; fsl_otg_tc->otg.start_srp = fsl_otg_start_srp; - fsl_otg_tc->otg.dev = &pdev->dev; fsl_otg_dev = fsl_otg_tc; @@ -980,8 +923,6 @@ int usb_otg_start(struct platform_device *pdev) if (pdata->platform_init && pdata->platform_init(pdev) != 0) return -EINVAL; - clk_stopped = false; /* platform_init will open the otg clk */ - /* stop the controller */ temp = readl(&p_otg->dr_mem_map->usbcmd); temp &= ~USB_CMD_RUN_STOP; @@ -1308,10 +1249,6 @@ static int __init fsl_otg_probe(struct platform_device *pdev) return -EIO; } - last_busy = jiffies; - setup_timer(&monitor_timer, fsl_otg_loading_monitor, (unsigned long)pdev); - mod_timer(&monitor_timer, jiffies + msecs_to_jiffies(TIMER_FREQ)); - create_proc_file(); return status; } diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index aec61880f36c..1a50beb32029 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c @@ -35,11 +35,6 @@ static struct usb_device_id id_table [] = { }; MODULE_DEVICE_TABLE(usb, id_table); -struct ark3116_private { - spinlock_t lock; - u8 termios_initialized; -}; - static inline void ARK3116_SND(struct usb_serial *serial, int seq, __u8 request, __u8 requesttype, __u16 value, __u16 index) @@ -82,22 +77,11 @@ static inline void ARK3116_RCV_QUIET(struct usb_serial *serial, static int ark3116_attach(struct usb_serial *serial) { char *buf; - struct ark3116_private *priv; - int i; - - for (i = 0; i < serial->num_ports; ++i) { - priv = kzalloc(sizeof(struct ark3116_private), GFP_KERNEL); - if (!priv) - goto cleanup; - spin_lock_init(&priv->lock); - - usb_set_serial_port_data(serial->port[i], priv); - } buf = kmalloc(1, GFP_KERNEL); if (!buf) { dbg("error kmalloc -> out of mem?"); - goto cleanup; + return -ENOMEM; } /* 3 */ @@ -149,13 +133,16 @@ static int ark3116_attach(struct usb_serial *serial) kfree(buf); return 0; +} -cleanup: - for (--i; i >= 0; --i) { - kfree(usb_get_serial_port_data(serial->port[i])); - usb_set_serial_port_data(serial->port[i], NULL); - } - return -ENOMEM; +static void ark3116_init_termios(struct tty_struct *tty) +{ + struct ktermios *termios = tty->termios; + *termios = tty_std_termios; + termios->c_cflag = B9600 | CS8 + | CREAD | HUPCL | CLOCAL; + termios->c_ispeed = 9600; + termios->c_ospeed = 9600; } static void ark3116_set_termios(struct tty_struct *tty, @@ -163,10 +150,8 @@ static void ark3116_set_termios(struct tty_struct *tty, struct ktermios *old_termios) { struct usb_serial *serial = port->serial; - struct ark3116_private *priv = usb_get_serial_port_data(port); struct ktermios *termios = tty->termios; unsigned int cflag = termios->c_cflag; - unsigned long flags; int baud; int ark3116_baud; char *buf; @@ -176,16 +161,6 @@ static void ark3116_set_termios(struct tty_struct *tty, dbg("%s - port %d", __func__, port->number); - spin_lock_irqsave(&priv->lock, flags); - if (!priv->termios_initialized) { - *termios = tty_std_termios; - termios->c_cflag = B9600 | CS8 - | CREAD | HUPCL | CLOCAL; - termios->c_ispeed = 9600; - termios->c_ospeed = 9600; - priv->termios_initialized = 1; - } - spin_unlock_irqrestore(&priv->lock, flags); cflag = termios->c_cflag; termios->c_cflag &= ~(CMSPAR|CRTSCTS); @@ -455,6 +430,7 @@ static struct usb_serial_driver ark3116_device = { .num_ports = 1, .attach = ark3116_attach, .set_termios = ark3116_set_termios, + .init_termios = ark3116_init_termios, .ioctl = ark3116_ioctl, .tiocmget = ark3116_tiocmget, .open = ark3116_open, diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c index 0e4f2e41ace5..3e49b2ed0266 100644 --- a/drivers/usb/serial/console.c +++ b/drivers/usb/serial/console.c @@ -16,6 +16,7 @@ #include <linux/slab.h> #include <linux/tty.h> #include <linux/console.h> +#include <linux/serial.h> #include <linux/usb.h> #include <linux/usb/serial.h> @@ -63,7 +64,7 @@ static int usb_console_setup(struct console *co, char *options) char *s; struct usb_serial *serial; struct usb_serial_port *port; - int retval = 0; + int retval; struct tty_struct *tty = NULL; struct ktermios *termios = NULL, dummy; @@ -116,13 +117,17 @@ static int usb_console_setup(struct console *co, char *options) return -ENODEV; } - port = serial->port[0]; + retval = usb_autopm_get_interface(serial->interface); + if (retval) + goto error_get_interface; + + port = serial->port[co->index - serial->minor]; tty_port_tty_set(&port->port, NULL); info->port = port; ++port->port.count; - if (port->port.count == 1) { + if (!test_bit(ASYNCB_INITIALIZED, &port->port.flags)) { if (serial->type->set_termios) { /* * allocate a fake tty so the driver can initialize @@ -168,6 +173,7 @@ static int usb_console_setup(struct console *co, char *options) kfree(termios); kfree(tty); } + set_bit(ASYNCB_INITIALIZED, &port->port.flags); } /* Now that any required fake tty operations are completed restore * the tty port count */ @@ -175,18 +181,22 @@ static int usb_console_setup(struct console *co, char *options) /* The console is special in terms of closing the device so * indicate this port is now acting as a system console. */ port->console = 1; - retval = 0; -out: + mutex_unlock(&serial->disc_mutex); return retval; -free_termios: + + free_termios: kfree(termios); tty_port_tty_set(&port->port, NULL); -free_tty: + free_tty: kfree(tty); -reset_open_count: + reset_open_count: port->port.count = 0; - goto out; + usb_autopm_put_interface(serial->interface); + error_get_interface: + usb_serial_put(serial); + mutex_unlock(&serial->disc_mutex); + return retval; } static void usb_console_write(struct console *co, diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index 985cbcf48bda..2367325e80b0 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c @@ -51,6 +51,8 @@ static int cp210x_tiocmset_port(struct usb_serial_port *port, struct file *, static void cp210x_break_ctl(struct tty_struct *, int); static int cp210x_startup(struct usb_serial *); static void cp210x_disconnect(struct usb_serial *); +static void cp210x_dtr_rts(struct usb_serial_port *p, int on); +static int cp210x_carrier_raised(struct usb_serial_port *p); static int debug; @@ -114,6 +116,7 @@ static struct usb_device_id id_table [] = { { USB_DEVICE(0x166A, 0x0303) }, /* Clipsal 5500PCU C-Bus USB interface */ { USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */ { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ + { USB_DEVICE(0x413C, 0x9500) }, /* DW700 GPS USB interface */ { } /* Terminating Entry */ }; @@ -143,6 +146,8 @@ static struct usb_serial_driver cp210x_device = { .tiocmset = cp210x_tiocmset, .attach = cp210x_startup, .disconnect = cp210x_disconnect, + .dtr_rts = cp210x_dtr_rts, + .carrier_raised = cp210x_carrier_raised }; /* Config request types */ @@ -399,12 +404,6 @@ static int cp210x_open(struct tty_struct *tty, struct usb_serial_port *port, /* Configure the termios structure */ cp210x_get_termios(tty, port); - - /* Set the DTR and RTS pins low */ - cp210x_tiocmset_port(tty ? (struct usb_serial_port *) tty->driver_data - : port, - NULL, TIOCM_DTR | TIOCM_RTS, 0); - return 0; } @@ -753,6 +752,14 @@ static int cp210x_tiocmset_port(struct usb_serial_port *port, struct file *file, return cp210x_set_config(port, CP210X_SET_MHS, &control, 2); } +static void cp210x_dtr_rts(struct usb_serial_port *p, int on) +{ + if (on) + cp210x_tiocmset_port(p, NULL, TIOCM_DTR|TIOCM_RTS, 0); + else + cp210x_tiocmset_port(p, NULL, 0, TIOCM_DTR|TIOCM_RTS); +} + static int cp210x_tiocmget (struct tty_struct *tty, struct file *file) { struct usb_serial_port *port = tty->driver_data; @@ -775,6 +782,15 @@ static int cp210x_tiocmget (struct tty_struct *tty, struct file *file) return result; } +static int cp210x_carrier_raised(struct usb_serial_port *p) +{ + unsigned int control; + cp210x_get_config(p, CP210X_GET_MDMSTS, &control, 1); + if (control & CONTROL_DCD) + return 1; + return 0; +} + static void cp210x_break_ctl (struct tty_struct *tty, int break_state) { struct usb_serial_port *port = tty->driver_data; diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index 59adfe123110..27b5a271fe4a 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c @@ -659,15 +659,7 @@ static int cypress_open(struct tty_struct *tty, spin_unlock_irqrestore(&priv->lock, flags); /* Set termios */ - result = cypress_write(tty, port, NULL, 0); - - if (result) { - dev_err(&port->dev, - "%s - failed setting the control lines - error %d\n", - __func__, result); - return result; - } else - dbg("%s - success setting the control lines", __func__); + cypress_send(port); if (tty) cypress_set_termios(tty, port, &priv->tmp_termios); @@ -1005,6 +997,8 @@ static void cypress_set_termios(struct tty_struct *tty, dbg("%s - port %d", __func__, port->number); spin_lock_irqsave(&priv->lock, flags); + /* We can't clean this one up as we don't know the device type + early enough */ if (!priv->termios_initialized) { if (priv->chiptype == CT_EARTHMATE) { *(tty->termios) = tty_std_termios; diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c index f4808091c47c..9bd82b487005 100644 --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c @@ -899,16 +899,16 @@ static void digi_rx_unthrottle(struct tty_struct *tty) spin_lock_irqsave(&priv->dp_port_lock, flags); - /* turn throttle off */ - priv->dp_throttled = 0; - priv->dp_throttle_restart = 0; - /* restart read chain */ if (priv->dp_throttle_restart) { port->read_urb->dev = port->serial->dev; ret = usb_submit_urb(port->read_urb, GFP_ATOMIC); } + /* turn throttle off */ + priv->dp_throttled = 0; + priv->dp_throttle_restart = 0; + spin_unlock_irqrestore(&priv->dp_port_lock, flags); if (ret) diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c index 80cb3471adbe..3433f9db4418 100644 --- a/drivers/usb/serial/empeg.c +++ b/drivers/usb/serial/empeg.c @@ -90,8 +90,7 @@ static int empeg_chars_in_buffer(struct tty_struct *tty); static void empeg_throttle(struct tty_struct *tty); static void empeg_unthrottle(struct tty_struct *tty); static int empeg_startup(struct usb_serial *serial); -static void empeg_set_termios(struct tty_struct *tty, - struct usb_serial_port *port, struct ktermios *old_termios); +static void empeg_init_termios(struct tty_struct *tty); static void empeg_write_bulk_callback(struct urb *urb); static void empeg_read_bulk_callback(struct urb *urb); @@ -123,7 +122,7 @@ static struct usb_serial_driver empeg_device = { .throttle = empeg_throttle, .unthrottle = empeg_unthrottle, .attach = empeg_startup, - .set_termios = empeg_set_termios, + .init_termios = empeg_init_termios, .write = empeg_write, .write_room = empeg_write_room, .chars_in_buffer = empeg_chars_in_buffer, @@ -150,9 +149,6 @@ static int empeg_open(struct tty_struct *tty, struct usb_serial_port *port, dbg("%s - port %d", __func__, port->number); - /* Force default termio settings */ - empeg_set_termios(tty, port, NULL) ; - bytes_in = 0; bytes_out = 0; @@ -425,11 +421,9 @@ static int empeg_startup(struct usb_serial *serial) } -static void empeg_set_termios(struct tty_struct *tty, - struct usb_serial_port *port, struct ktermios *old_termios) +static void empeg_init_termios(struct tty_struct *tty) { struct ktermios *termios = tty->termios; - dbg("%s - port %d", __func__, port->number); /* * The empeg-car player wants these particular tty settings. diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 8fec5d4455c9..84102014ed5b 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c @@ -76,13 +76,7 @@ struct ftdi_private { unsigned long last_dtr_rts; /* saved modem control outputs */ wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */ char prev_status, diff_status; /* Used for TIOCMIWAIT */ - __u8 rx_flags; /* receive state flags (throttling) */ - spinlock_t rx_lock; /* spinlock for receive state */ - struct delayed_work rx_work; struct usb_serial_port *port; - int rx_processed; - unsigned long rx_bytes; - __u16 interface; /* FT2232C, FT2232H or FT4232H port interface (0 for FT232/245) */ @@ -176,6 +170,9 @@ static struct usb_device_id id_table_combined [] = { { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_SNIFFER_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) }, { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) }, @@ -694,6 +691,8 @@ static struct usb_device_id id_table_combined [] = { { USB_DEVICE(DE_VID, WHT_PID) }, { USB_DEVICE(ADI_VID, ADI_GNICE_PID), .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, + { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID), + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) }, { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID), .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, @@ -702,6 +701,8 @@ static struct usb_device_id id_table_combined [] = { { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) }, { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID), .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, + { USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) }, + { USB_DEVICE(FTDI_VID, HAMEG_HO870_PID) }, { }, /* Optional parameter entry */ { } /* Terminating entry */ }; @@ -730,10 +731,6 @@ static const char *ftdi_chip_name[] = { /* Constants for read urb and write urb */ #define BUFSZ 512 -/* rx_flags */ -#define THROTTLED 0x01 -#define ACTUALLY_THROTTLED 0x02 - /* Used for TIOCMIWAIT */ #define FTDI_STATUS_B0_MASK (FTDI_RS0_CTS | FTDI_RS0_DSR | FTDI_RS0_RI | FTDI_RS0_RLSD) #define FTDI_STATUS_B1_MASK (FTDI_RS_BI) @@ -757,7 +754,7 @@ static int ftdi_write_room(struct tty_struct *tty); static int ftdi_chars_in_buffer(struct tty_struct *tty); static void ftdi_write_bulk_callback(struct urb *urb); static void ftdi_read_bulk_callback(struct urb *urb); -static void ftdi_process_read(struct work_struct *work); +static void ftdi_process_read(struct usb_serial_port *port); static void ftdi_set_termios(struct tty_struct *tty, struct usb_serial_port *port, struct ktermios *old); static int ftdi_tiocmget(struct tty_struct *tty, struct file *file); @@ -1228,7 +1225,6 @@ static int set_serial_info(struct tty_struct *tty, (new_serial.flags & ASYNC_FLAGS)); priv->custom_divisor = new_serial.custom_divisor; - tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0; write_latency_timer(port); check_and_exit: @@ -1521,7 +1517,6 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port) } kref_init(&priv->kref); - spin_lock_init(&priv->rx_lock); spin_lock_init(&priv->tx_lock); init_waitqueue_head(&priv->delta_msr_wait); /* This will push the characters through immediately rather @@ -1543,7 +1538,6 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port) port->read_urb->transfer_buffer_length = BUFSZ; } - INIT_DELAYED_WORK(&priv->rx_work, ftdi_process_read); priv->port = port; /* Free port's existing write urb and transfer buffer. */ @@ -1680,6 +1674,26 @@ static int ftdi_sio_port_remove(struct usb_serial_port *port) return 0; } +static int ftdi_submit_read_urb(struct usb_serial_port *port, gfp_t mem_flags) +{ + struct urb *urb = port->read_urb; + struct usb_serial *serial = port->serial; + int result; + + usb_fill_bulk_urb(urb, serial->dev, + usb_rcvbulkpipe(serial->dev, + port->bulk_in_endpointAddress), + urb->transfer_buffer, + urb->transfer_buffer_length, + ftdi_read_bulk_callback, port); + result = usb_submit_urb(urb, mem_flags); + if (result) + dev_err(&port->dev, + "%s - failed submitting read urb, error %d\n", + __func__, result); + return result; +} + static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port, struct file *filp) { /* ftdi_open */ @@ -1695,12 +1709,6 @@ static int ftdi_open(struct tty_struct *tty, spin_lock_irqsave(&priv->tx_lock, flags); priv->tx_bytes = 0; spin_unlock_irqrestore(&priv->tx_lock, flags); - spin_lock_irqsave(&priv->rx_lock, flags); - priv->rx_bytes = 0; - spin_unlock_irqrestore(&priv->rx_lock, flags); - - if (tty) - tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0; write_latency_timer(port); @@ -1720,23 +1728,14 @@ static int ftdi_open(struct tty_struct *tty, ftdi_set_termios(tty, port, tty->termios); /* Not throttled */ - spin_lock_irqsave(&priv->rx_lock, flags); - priv->rx_flags &= ~(THROTTLED | ACTUALLY_THROTTLED); - spin_unlock_irqrestore(&priv->rx_lock, flags); + spin_lock_irqsave(&port->lock, flags); + port->throttled = 0; + port->throttle_req = 0; + spin_unlock_irqrestore(&port->lock, flags); /* Start reading from the device */ - priv->rx_processed = 0; - usb_fill_bulk_urb(port->read_urb, dev, - usb_rcvbulkpipe(dev, port->bulk_in_endpointAddress), - port->read_urb->transfer_buffer, - port->read_urb->transfer_buffer_length, - ftdi_read_bulk_callback, port); - result = usb_submit_urb(port->read_urb, GFP_KERNEL); - if (result) - dev_err(&port->dev, - "%s - failed submitting read urb, error %d\n", - __func__, result); - else + result = ftdi_submit_read_urb(port, GFP_KERNEL); + if (!result) kref_get(&priv->kref); return result; @@ -1782,10 +1781,6 @@ static void ftdi_close(struct usb_serial_port *port) dbg("%s", __func__); - - /* cancel any scheduled reading */ - cancel_delayed_work_sync(&priv->rx_work); - /* shutdown our bulk read */ usb_kill_urb(port->read_urb); kref_put(&priv->kref, ftdi_sio_priv_release); @@ -1944,7 +1939,7 @@ static void ftdi_write_bulk_callback(struct urb *urb) return; } /* account for transferred data */ - countback = urb->actual_length; + countback = urb->transfer_buffer_length; data_offset = priv->write_offset; if (data_offset > 0) { /* Subtract the control bytes */ @@ -1957,7 +1952,6 @@ static void ftdi_write_bulk_callback(struct urb *urb) if (status) { dbg("nonzero write bulk status received: %d", status); - return; } usb_serial_port_softint(port); @@ -2008,271 +2002,121 @@ static int ftdi_chars_in_buffer(struct tty_struct *tty) return buffered; } -static void ftdi_read_bulk_callback(struct urb *urb) +static int ftdi_process_packet(struct tty_struct *tty, + struct usb_serial_port *port, struct ftdi_private *priv, + char *packet, int len) { - struct usb_serial_port *port = urb->context; - struct tty_struct *tty; - struct ftdi_private *priv; - unsigned long countread; - unsigned long flags; - int status = urb->status; - - if (urb->number_of_packets > 0) { - dev_err(&port->dev, "%s transfer_buffer_length %d " - "actual_length %d number of packets %d\n", __func__, - urb->transfer_buffer_length, - urb->actual_length, urb->number_of_packets); - dev_err(&port->dev, "%s transfer_flags %x\n", __func__, - urb->transfer_flags); - } + int i; + char status; + char flag; + char *ch; dbg("%s - port %d", __func__, port->number); - if (port->port.count <= 0) - return; - - tty = tty_port_tty_get(&port->port); - if (!tty) { - dbg("%s - bad tty pointer - exiting", __func__); - return; + if (len < 2) { + dbg("malformed packet"); + return 0; } - priv = usb_get_serial_port_data(port); - if (!priv) { - dbg("%s - bad port private data pointer - exiting", __func__); - goto out; + /* Compare new line status to the old one, signal if different/ + N.B. packet may be processed more than once, but differences + are only processed once. */ + status = packet[0] & FTDI_STATUS_B0_MASK; + if (status != priv->prev_status) { + priv->diff_status |= status ^ priv->prev_status; + wake_up_interruptible(&priv->delta_msr_wait); + priv->prev_status = status; } - if (urb != port->read_urb) - dev_err(&port->dev, "%s - Not my urb!\n", __func__); - - if (status) { - /* This will happen at close every time so it is a dbg not an - err */ - dbg("(this is ok on close) nonzero read bulk status received: %d", status); - goto out; + /* + * Although the device uses a bitmask and hence can have multiple + * errors on a packet - the order here sets the priority the error is + * returned to the tty layer. + */ + flag = TTY_NORMAL; + if (packet[1] & FTDI_RS_OE) { + flag = TTY_OVERRUN; + dbg("OVERRRUN error"); + } + if (packet[1] & FTDI_RS_BI) { + flag = TTY_BREAK; + dbg("BREAK received"); + usb_serial_handle_break(port); + } + if (packet[1] & FTDI_RS_PE) { + flag = TTY_PARITY; + dbg("PARITY error"); + } + if (packet[1] & FTDI_RS_FE) { + flag = TTY_FRAME; + dbg("FRAMING error"); } - /* count data bytes, but not status bytes */ - countread = urb->actual_length; - countread -= 2 * DIV_ROUND_UP(countread, priv->max_packet_size); - spin_lock_irqsave(&priv->rx_lock, flags); - priv->rx_bytes += countread; - spin_unlock_irqrestore(&priv->rx_lock, flags); - - ftdi_process_read(&priv->rx_work.work); -out: - tty_kref_put(tty); -} /* ftdi_read_bulk_callback */ - + len -= 2; + if (!len) + return 0; /* status only */ + ch = packet + 2; + + if (!(port->console && port->sysrq) && flag == TTY_NORMAL) + tty_insert_flip_string(tty, ch, len); + else { + for (i = 0; i < len; i++, ch++) { + if (!usb_serial_handle_sysrq_char(tty, port, *ch)) + tty_insert_flip_char(tty, *ch, flag); + } + } + return len; +} -static void ftdi_process_read(struct work_struct *work) -{ /* ftdi_process_read */ - struct ftdi_private *priv = - container_of(work, struct ftdi_private, rx_work.work); - struct usb_serial_port *port = priv->port; - struct urb *urb; +static void ftdi_process_read(struct usb_serial_port *port) +{ + struct urb *urb = port->read_urb; struct tty_struct *tty; - char error_flag; - unsigned char *data; - + struct ftdi_private *priv = usb_get_serial_port_data(port); + char *data = (char *)urb->transfer_buffer; int i; - int result; - int need_flip; - int packet_offset; - unsigned long flags; - - dbg("%s - port %d", __func__, port->number); - - if (port->port.count <= 0) - return; + int len; + int count = 0; tty = tty_port_tty_get(&port->port); - if (!tty) { - dbg("%s - bad tty pointer - exiting", __func__); + if (!tty) return; - } - priv = usb_get_serial_port_data(port); - if (!priv) { - dbg("%s - bad port private data pointer - exiting", __func__); - goto out; - } - - urb = port->read_urb; - if (!urb) { - dbg("%s - bad read_urb pointer - exiting", __func__); - goto out; + for (i = 0; i < urb->actual_length; i += priv->max_packet_size) { + len = min_t(int, urb->actual_length - i, priv->max_packet_size); + count += ftdi_process_packet(tty, port, priv, &data[i], len); } - data = urb->transfer_buffer; - - if (priv->rx_processed) { - dbg("%s - already processed: %d bytes, %d remain", __func__, - priv->rx_processed, - urb->actual_length - priv->rx_processed); - } else { - /* The first two bytes of every read packet are status */ - if (urb->actual_length > 2) - usb_serial_debug_data(debug, &port->dev, __func__, - urb->actual_length, data); - else - dbg("Status only: %03oo %03oo", data[0], data[1]); - } - - - /* TO DO -- check for hung up line and handle appropriately: */ - /* send hangup */ - /* See acm.c - you do a tty_hangup - eg tty_hangup(tty) */ - /* if CD is dropped and the line is not CLOCAL then we should hangup */ - - need_flip = 0; - for (packet_offset = priv->rx_processed; - packet_offset < urb->actual_length; packet_offset += priv->max_packet_size) { - int length; - - /* Compare new line status to the old one, signal if different/ - N.B. packet may be processed more than once, but differences - are only processed once. */ - char new_status = data[packet_offset + 0] & - FTDI_STATUS_B0_MASK; - if (new_status != priv->prev_status) { - priv->diff_status |= - new_status ^ priv->prev_status; - wake_up_interruptible(&priv->delta_msr_wait); - priv->prev_status = new_status; - } - - length = min_t(u32, priv->max_packet_size, urb->actual_length-packet_offset)-2; - if (length < 0) { - dev_err(&port->dev, "%s - bad packet length: %d\n", - __func__, length+2); - length = 0; - } - - if (priv->rx_flags & THROTTLED) { - dbg("%s - throttled", __func__); - break; - } - if (tty_buffer_request_room(tty, length) < length) { - /* break out & wait for throttling/unthrottling to - happen */ - dbg("%s - receive room low", __func__); - break; - } - - /* Handle errors and break */ - error_flag = TTY_NORMAL; - /* Although the device uses a bitmask and hence can have - multiple errors on a packet - the order here sets the - priority the error is returned to the tty layer */ - - if (data[packet_offset+1] & FTDI_RS_OE) { - error_flag = TTY_OVERRUN; - dbg("OVERRRUN error"); - } - if (data[packet_offset+1] & FTDI_RS_BI) { - error_flag = TTY_BREAK; - dbg("BREAK received"); - usb_serial_handle_break(port); - } - if (data[packet_offset+1] & FTDI_RS_PE) { - error_flag = TTY_PARITY; - dbg("PARITY error"); - } - if (data[packet_offset+1] & FTDI_RS_FE) { - error_flag = TTY_FRAME; - dbg("FRAMING error"); - } - if (length > 0) { - for (i = 2; i < length+2; i++) { - /* Note that the error flag is duplicated for - every character received since we don't know - which character it applied to */ - if (!usb_serial_handle_sysrq_char(tty, port, - data[packet_offset + i])) - tty_insert_flip_char(tty, - data[packet_offset + i], - error_flag); - } - need_flip = 1; - } - -#ifdef NOT_CORRECT_BUT_KEEPING_IT_FOR_NOW - /* if a parity error is detected you get status packets forever - until a character is sent without a parity error. - This doesn't work well since the application receives a - never ending stream of bad data - even though new data - hasn't been sent. Therefore I (bill) have taken this out. - However - this might make sense for framing errors and so on - so I am leaving the code in for now. - */ - else { - if (error_flag != TTY_NORMAL) { - dbg("error_flag is not normal"); - /* In this case it is just status - if that is - an error send a bad character */ - if (tty->flip.count >= TTY_FLIPBUF_SIZE) - tty_flip_buffer_push(tty); - tty_insert_flip_char(tty, 0xff, error_flag); - need_flip = 1; - } - } -#endif - } /* "for(packet_offset=0..." */ - - /* Low latency */ - if (need_flip) + if (count) tty_flip_buffer_push(tty); + tty_kref_put(tty); +} - if (packet_offset < urb->actual_length) { - /* not completely processed - record progress */ - priv->rx_processed = packet_offset; - dbg("%s - incomplete, %d bytes processed, %d remain", - __func__, packet_offset, - urb->actual_length - packet_offset); - /* check if we were throttled while processing */ - spin_lock_irqsave(&priv->rx_lock, flags); - if (priv->rx_flags & THROTTLED) { - priv->rx_flags |= ACTUALLY_THROTTLED; - spin_unlock_irqrestore(&priv->rx_lock, flags); - dbg("%s - deferring remainder until unthrottled", - __func__); - goto out; - } - spin_unlock_irqrestore(&priv->rx_lock, flags); - /* if the port is closed stop trying to read */ - if (port->port.count > 0) - /* delay processing of remainder */ - schedule_delayed_work(&priv->rx_work, 1); - else - dbg("%s - port is closed", __func__); - goto out; - } - - /* urb is completely processed */ - priv->rx_processed = 0; +static void ftdi_read_bulk_callback(struct urb *urb) +{ + struct usb_serial_port *port = urb->context; + unsigned long flags; - /* if the port is closed stop trying to read */ - if (port->port.count > 0) { - /* Continue trying to always read */ - usb_fill_bulk_urb(port->read_urb, port->serial->dev, - usb_rcvbulkpipe(port->serial->dev, - port->bulk_in_endpointAddress), - port->read_urb->transfer_buffer, - port->read_urb->transfer_buffer_length, - ftdi_read_bulk_callback, port); + dbg("%s - port %d", __func__, port->number); - result = usb_submit_urb(port->read_urb, GFP_ATOMIC); - if (result) - dev_err(&port->dev, - "%s - failed resubmitting read urb, error %d\n", - __func__, result); + if (urb->status) { + dbg("%s - nonzero read bulk status received: %d", + __func__, urb->status); + return; } -out: - tty_kref_put(tty); -} /* ftdi_process_read */ + usb_serial_debug_data(debug, &port->dev, __func__, + urb->actual_length, urb->transfer_buffer); + ftdi_process_read(port); + + spin_lock_irqsave(&port->lock, flags); + port->throttled = port->throttle_req; + if (!port->throttled) { + spin_unlock_irqrestore(&port->lock, flags); + ftdi_submit_read_urb(port, GFP_ATOMIC); + } else + spin_unlock_irqrestore(&port->lock, flags); +} static void ftdi_break_ctl(struct tty_struct *tty, int break_state) { @@ -2604,33 +2448,31 @@ static int ftdi_ioctl(struct tty_struct *tty, struct file *file, static void ftdi_throttle(struct tty_struct *tty) { struct usb_serial_port *port = tty->driver_data; - struct ftdi_private *priv = usb_get_serial_port_data(port); unsigned long flags; dbg("%s - port %d", __func__, port->number); - spin_lock_irqsave(&priv->rx_lock, flags); - priv->rx_flags |= THROTTLED; - spin_unlock_irqrestore(&priv->rx_lock, flags); + spin_lock_irqsave(&port->lock, flags); + port->throttle_req = 1; + spin_unlock_irqrestore(&port->lock, flags); } - -static void ftdi_unthrottle(struct tty_struct *tty) +void ftdi_unthrottle(struct tty_struct *tty) { struct usb_serial_port *port = tty->driver_data; - struct ftdi_private *priv = usb_get_serial_port_data(port); - int actually_throttled; + int was_throttled; unsigned long flags; dbg("%s - port %d", __func__, port->number); - spin_lock_irqsave(&priv->rx_lock, flags); - actually_throttled = priv->rx_flags & ACTUALLY_THROTTLED; - priv->rx_flags &= ~(THROTTLED | ACTUALLY_THROTTLED); - spin_unlock_irqrestore(&priv->rx_lock, flags); + spin_lock_irqsave(&port->lock, flags); + was_throttled = port->throttled; + port->throttled = port->throttle_req = 0; + spin_unlock_irqrestore(&port->lock, flags); - if (actually_throttled) - schedule_delayed_work(&priv->rx_work, 0); + /* Resubmit urb if throttled and open. */ + if (was_throttled && test_bit(ASYNCB_INITIALIZED, &port->port.flags)) + ftdi_submit_read_urb(port, GFP_KERNEL); } static int __init ftdi_init(void) diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index 8c92b88166ae..6f31e0d71898 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h @@ -81,6 +81,9 @@ /* OpenDCC (www.opendcc.de) product id */ #define FTDI_OPENDCC_PID 0xBFD8 +#define FTDI_OPENDCC_SNIFFER_PID 0xBFD9 +#define FTDI_OPENDCC_THROTTLE_PID 0xBFDA +#define FTDI_OPENDCC_GATEWAY_PID 0xBFDB /* Sprog II (Andrew Crosland's SprogII DCC interface) */ #define FTDI_SPROG_II 0xF0C8 @@ -930,6 +933,7 @@ */ #define ADI_VID 0x0456 #define ADI_GNICE_PID 0xF000 +#define ADI_GNICEPLUS_PID 0xF001 /* * JETI SPECTROMETER SPECBOS 1201 @@ -968,6 +972,12 @@ #define MARVELL_OPENRD_PID 0x9e90 /* + * Hameg HO820 and HO870 interface (using VID 0x0403) + */ +#define HAMEG_HO820_PID 0xed74 +#define HAMEG_HO870_PID 0xed71 + +/* * BmRequestType: 1100 0000b * bRequest: FTDI_E2_READ * wValue: 0 diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index ce57f6a32bdf..6463fee644b9 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c @@ -480,6 +480,8 @@ void usb_serial_generic_write_bulk_callback(struct urb *urb) dbg("%s - port %d", __func__, port->number); if (port->serial->type->max_in_flight_urbs) { + kfree(urb->transfer_buffer); + spin_lock_irqsave(&port->lock, flags); --port->urbs_in_flight; port->tx_bytes_flight -= urb->transfer_buffer_length; @@ -530,7 +532,7 @@ void usb_serial_generic_unthrottle(struct tty_struct *tty) if (was_throttled) { /* Resume reading from device */ - usb_serial_generic_resubmit_read_urb(port, GFP_KERNEL); + flush_and_resubmit_read_urb(port); } } diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c index 2545d45ce16f..c4d02064e5f1 100644 --- a/drivers/usb/serial/ipaq.c +++ b/drivers/usb/serial/ipaq.c @@ -971,6 +971,15 @@ static int ipaq_calc_num_ports(struct usb_serial *serial) static int ipaq_startup(struct usb_serial *serial) { dbg("%s", __func__); + + /* Some of the devices in ipaq_id_table[] are composite, and we + * shouldn't bind to all the interfaces. This test will rule out + * some obviously invalid possibilities. + */ + if (serial->num_bulk_in < serial->num_ports || + serial->num_bulk_out < serial->num_ports) + return -ENODEV; + if (serial->dev->actconfig->desc.bConfigurationValue != 1) { /* * FIXME: HP iPaq rx3715, possibly others, have 1 config that diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c index 96873a7a32b0..af6df6c788b9 100644 --- a/drivers/usb/serial/iuu_phoenix.c +++ b/drivers/usb/serial/iuu_phoenix.c @@ -71,7 +71,6 @@ struct iuu_private { spinlock_t lock; /* store irq state */ wait_queue_head_t delta_msr_wait; u8 line_status; - u8 termios_initialized; int tiostatus; /* store IUART SIGNAL for tiocmget call */ u8 reset; /* if 1 reset is needed */ int poll; /* number of poll */ @@ -1018,6 +1017,18 @@ static void iuu_close(struct usb_serial_port *port) } } +static void iuu_init_termios(struct tty_struct *tty) +{ + *(tty->termios) = tty_std_termios; + tty->termios->c_cflag = CLOCAL | CREAD | CS8 | B9600 + | TIOCM_CTS | CSTOPB | PARENB; + tty->termios->c_ispeed = 9600; + tty->termios->c_ospeed = 9600; + tty->termios->c_lflag = 0; + tty->termios->c_oflag = 0; + tty->termios->c_iflag = 0; +} + static int iuu_open(struct tty_struct *tty, struct usb_serial_port *port, struct file *filp) { @@ -1025,7 +1036,6 @@ static int iuu_open(struct tty_struct *tty, u8 *buf; int result; u32 actual; - unsigned long flags; struct iuu_private *priv = usb_get_serial_port_data(port); dbg("%s - port %d", __func__, port->number); @@ -1064,21 +1074,7 @@ static int iuu_open(struct tty_struct *tty, port->bulk_in_buffer, 512, NULL, NULL); - /* set the termios structure */ - spin_lock_irqsave(&priv->lock, flags); - if (tty && !priv->termios_initialized) { - *(tty->termios) = tty_std_termios; - tty->termios->c_cflag = CLOCAL | CREAD | CS8 | B9600 - | TIOCM_CTS | CSTOPB | PARENB; - tty->termios->c_ispeed = 9600; - tty->termios->c_ospeed = 9600; - tty->termios->c_lflag = 0; - tty->termios->c_oflag = 0; - tty->termios->c_iflag = 0; - priv->termios_initialized = 1; - priv->poll = 0; - } - spin_unlock_irqrestore(&priv->lock, flags); + priv->poll = 0; /* initialize writebuf */ #define FISH(a, b, c, d) do { \ @@ -1201,6 +1197,7 @@ static struct usb_serial_driver iuu_device = { .tiocmget = iuu_tiocmget, .tiocmset = iuu_tiocmset, .set_termios = iuu_set_termios, + .init_termios = iuu_init_termios, .attach = iuu_startup, .release = iuu_release, }; diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c index 6db0e561f680..46d47d1463c9 100644 --- a/drivers/usb/serial/kobil_sct.c +++ b/drivers/usb/serial/kobil_sct.c @@ -85,7 +85,7 @@ static void kobil_read_int_callback(struct urb *urb); static void kobil_write_callback(struct urb *purb); static void kobil_set_termios(struct tty_struct *tty, struct usb_serial_port *port, struct ktermios *old); - +static void kobil_init_termios(struct tty_struct *tty); static struct usb_device_id id_table [] = { { USB_DEVICE(KOBIL_VENDOR_ID, KOBIL_ADAPTER_B_PRODUCT_ID) }, @@ -120,6 +120,7 @@ static struct usb_serial_driver kobil_device = { .release = kobil_release, .ioctl = kobil_ioctl, .set_termios = kobil_set_termios, + .init_termios = kobil_init_termios, .tiocmget = kobil_tiocmget, .tiocmset = kobil_tiocmset, .open = kobil_open, @@ -210,6 +211,15 @@ static void kobil_release(struct usb_serial *serial) kfree(usb_get_serial_port_data(serial->port[i])); } +static void kobil_init_termios(struct tty_struct *tty) +{ + /* Default to echo off and other sane device settings */ + tty->termios->c_lflag = 0; + tty->termios->c_lflag &= ~(ISIG | ICANON | ECHO | IEXTEN | XCASE); + tty->termios->c_iflag = IGNBRK | IGNPAR | IXOFF; + /* do NOT translate CR to CR-NL (0x0A -> 0x0A 0x0D) */ + tty->termios->c_oflag &= ~ONLCR; +} static int kobil_open(struct tty_struct *tty, struct usb_serial_port *port, struct file *filp) @@ -226,16 +236,6 @@ static int kobil_open(struct tty_struct *tty, /* someone sets the dev to 0 if the close method has been called */ port->interrupt_in_urb->dev = port->serial->dev; - if (tty) { - - /* Default to echo off and other sane device settings */ - tty->termios->c_lflag = 0; - tty->termios->c_lflag &= ~(ISIG | ICANON | ECHO | IEXTEN | - XCASE); - tty->termios->c_iflag = IGNBRK | IGNPAR | IXOFF; - /* do NOT translate CR to CR-NL (0x0A -> 0x0A 0x0D) */ - tty->termios->c_oflag &= ~ONLCR; - } /* allocate memory for transfer buffer */ transfer_buffer = kzalloc(transfer_buffer_length, GFP_KERNEL); if (!transfer_buffer) diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index c784ddbe7b61..c7b42ca00d56 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -166,6 +166,7 @@ static int option_resume(struct usb_serial *serial); #define HUAWEI_PRODUCT_E143D 0x143D #define HUAWEI_PRODUCT_E143E 0x143E #define HUAWEI_PRODUCT_E143F 0x143F +#define HUAWEI_PRODUCT_E14AC 0x14AC #define QUANTA_VENDOR_ID 0x0408 #define QUANTA_PRODUCT_Q101 0xEA02 @@ -292,6 +293,7 @@ static int option_resume(struct usb_serial *serial); #define TELIT_VENDOR_ID 0x1bc7 #define TELIT_PRODUCT_UC864E 0x1003 +#define TELIT_PRODUCT_UC864G 0x1004 /* ZTE PRODUCTS */ #define ZTE_VENDOR_ID 0x19d2 @@ -300,12 +302,14 @@ static int option_resume(struct usb_serial *serial); #define ZTE_PRODUCT_MF626 0x0031 #define ZTE_PRODUCT_CDMA_TECH 0xfffe #define ZTE_PRODUCT_AC8710 0xfff1 +#define ZTE_PRODUCT_AC2726 0xfff5 #define BENQ_VENDOR_ID 0x04a5 #define BENQ_PRODUCT_H10 0x4068 #define DLINK_VENDOR_ID 0x1186 #define DLINK_PRODUCT_DWM_652 0x3e04 +#define DLINK_PRODUCT_DWM_652_U5 0xce16 #define QISDA_VENDOR_ID 0x1da5 #define QISDA_PRODUCT_H21_4512 0x4512 @@ -313,10 +317,14 @@ static int option_resume(struct usb_serial *serial); #define QISDA_PRODUCT_H20_4515 0x4515 #define QISDA_PRODUCT_H20_4519 0x4519 +/* TLAYTECH PRODUCTS */ +#define TLAYTECH_VENDOR_ID 0x20B9 +#define TLAYTECH_PRODUCT_TEU800 0x1682 /* TOSHIBA PRODUCTS */ #define TOSHIBA_VENDOR_ID 0x0930 #define TOSHIBA_PRODUCT_HSDPA_MINICARD 0x1302 +#define TOSHIBA_PRODUCT_G450 0x0d45 #define ALINK_VENDOR_ID 0x1e0e #define ALINK_PRODUCT_3GU 0x9200 @@ -325,6 +333,13 @@ static int option_resume(struct usb_serial *serial); #define ALCATEL_VENDOR_ID 0x1bbb #define ALCATEL_PRODUCT_X060S 0x0000 +/* Airplus products */ +#define AIRPLUS_VENDOR_ID 0x1011 +#define AIRPLUS_PRODUCT_MCD650 0x3198 + +/* Haier products */ +#define HAIER_VENDOR_ID 0x201e +#define HAIER_PRODUCT_CE100 0x2009 static struct usb_device_id option_ids[] = { { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, @@ -423,6 +438,7 @@ static struct usb_device_id option_ids[] = { { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143D, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143E, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143F, 0xff, 0xff, 0xff) }, + { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E14AC) }, { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_9508) }, { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, /* Novatel Merlin V640/XV620 */ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, /* Novatel Merlin V620/S620 */ @@ -503,6 +519,7 @@ static struct usb_device_id option_ids[] = { { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */ { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0003, 0xff, 0xff, 0xff) }, @@ -564,24 +581,67 @@ static struct usb_device_id option_ids[] = { { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0086, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0104, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0106, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0108, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0113, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0117, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0118, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0121, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0122, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0123, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0124, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0125, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0126, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0128, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0142, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0143, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0144, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0145, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0146, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0147, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0148, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0149, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0150, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0151, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0152, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0153, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0154, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0155, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0156, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0157, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0158, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0159, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0160, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0161, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0162, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0014, 0xff, 0xff, 0xff) }, /* ZTE CDMA products */ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0027, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0059, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0060, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0070, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0141, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) }, { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) }, + { USB_DEVICE(ALINK_VENDOR_ID, DLINK_PRODUCT_DWM_652_U5) }, /* Yes, ALINK_VENDOR_ID */ { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H21_4512) }, { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H21_4523) }, { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H20_4515) }, { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H20_4519) }, + { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_G450) }, { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_HSDPA_MINICARD ) }, /* Toshiba 3G HSDPA == Novatel Expedite EU870D MiniCard */ { USB_DEVICE(ALINK_VENDOR_ID, 0x9000) }, + { USB_DEVICE(ALINK_VENDOR_ID, 0xce16) }, { USB_DEVICE_AND_INTERFACE_INFO(ALINK_VENDOR_ID, ALINK_PRODUCT_3GU, 0xff, 0xff, 0xff) }, { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S) }, + { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, + { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, + { USB_DEVICE(HAIER_VENDOR_ID, HAIER_PRODUCT_CE100) }, { } /* Terminating entry */ }; MODULE_DEVICE_TABLE(usb, option_ids); diff --git a/drivers/usb/serial/oti6858.c b/drivers/usb/serial/oti6858.c index 3cece27325e7..ef34cffabdf8 100644 --- a/drivers/usb/serial/oti6858.c +++ b/drivers/usb/serial/oti6858.c @@ -146,6 +146,7 @@ static int oti6858_open(struct tty_struct *tty, static void oti6858_close(struct usb_serial_port *port); static void oti6858_set_termios(struct tty_struct *tty, struct usb_serial_port *port, struct ktermios *old); +static void oti6858_init_termios(struct tty_struct *tty); static int oti6858_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg); static void oti6858_read_int_callback(struct urb *urb); @@ -186,6 +187,7 @@ static struct usb_serial_driver oti6858_device = { .write = oti6858_write, .ioctl = oti6858_ioctl, .set_termios = oti6858_set_termios, + .init_termios = oti6858_init_termios, .tiocmget = oti6858_tiocmget, .tiocmset = oti6858_tiocmset, .read_bulk_callback = oti6858_read_bulk_callback, @@ -206,7 +208,6 @@ struct oti6858_private { struct { u8 read_urb_in_use; u8 write_urb_in_use; - u8 termios_initialized; } flags; struct delayed_work delayed_write_work; @@ -447,6 +448,14 @@ static int oti6858_chars_in_buffer(struct tty_struct *tty) return chars; } +static void oti6858_init_termios(struct tty_struct *tty) +{ + *(tty->termios) = tty_std_termios; + tty->termios->c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL; + tty->termios->c_ispeed = 38400; + tty->termios->c_ospeed = 38400; +} + static void oti6858_set_termios(struct tty_struct *tty, struct usb_serial_port *port, struct ktermios *old_termios) { @@ -464,16 +473,6 @@ static void oti6858_set_termios(struct tty_struct *tty, return; } - spin_lock_irqsave(&priv->lock, flags); - if (!priv->flags.termios_initialized) { - *(tty->termios) = tty_std_termios; - tty->termios->c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL; - tty->termios->c_ispeed = 38400; - tty->termios->c_ospeed = 38400; - priv->flags.termios_initialized = 1; - } - spin_unlock_irqrestore(&priv->lock, flags); - cflag = tty->termios->c_cflag; spin_lock_irqsave(&priv->lock, flags); diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index 3e86815b2705..600097de714f 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c @@ -96,6 +96,7 @@ static struct usb_device_id id_table [] = { { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) }, { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) }, { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) }, + { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) }, { } /* Terminating entry */ }; @@ -994,13 +995,15 @@ static void pl2303_push_data(struct tty_struct *tty, /* overrun is special, not associated with a char */ if (line_status & UART_OVERRUN_ERROR) tty_insert_flip_char(tty, 0, TTY_OVERRUN); - if (port->console && port->sysrq) { + + if (tty_flag == TTY_NORMAL && !(port->console && port->sysrq)) + tty_insert_flip_string(tty, data, urb->actual_length); + else { int i; for (i = 0; i < urb->actual_length; ++i) if (!usb_serial_handle_sysrq_char(tty, port, data[i])) tty_insert_flip_char(tty, data[i], tty_flag); - } else - tty_insert_flip_string(tty, data, urb->actual_length); + } tty_flip_buffer_push(tty); } diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h index ee9505e1dd92..d640dc951568 100644 --- a/drivers/usb/serial/pl2303.h +++ b/drivers/usb/serial/pl2303.h @@ -130,3 +130,7 @@ /* Sony, USB data cable for CMD-Jxx mobile phones */ #define SONY_VENDOR_ID 0x054c #define SONY_QN3USB_PRODUCT_ID 0x0437 + +/* Sanwa KB-USB2 multimeter cable (ID: 11ad:0001) */ +#define SANWA_VENDOR_ID 0x11ad +#define SANWA_PRODUCT_ID 0x0001 diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c index f48d05e0acc1..c5fbaa5dde05 100644 --- a/drivers/usb/serial/sierra.c +++ b/drivers/usb/serial/sierra.c @@ -287,6 +287,8 @@ static int sierra_send_setup(struct usb_serial_port *port) struct sierra_port_private *portdata; __u16 interface = 0; int val = 0; + int do_send = 0; + int retval; dev_dbg(&port->dev, "%s\n", __func__); @@ -305,10 +307,7 @@ static int sierra_send_setup(struct usb_serial_port *port) */ if (port->interrupt_in_urb) { /* send control message */ - return usb_control_msg(serial->dev, - usb_rcvctrlpipe(serial->dev, 0), - 0x22, 0x21, val, interface, - NULL, 0, USB_CTRL_SET_TIMEOUT); + do_send = 1; } } @@ -320,12 +319,18 @@ static int sierra_send_setup(struct usb_serial_port *port) interface = 1; else if (port->bulk_out_endpointAddress == 5) interface = 2; - return usb_control_msg(serial->dev, - usb_rcvctrlpipe(serial->dev, 0), - 0x22, 0x21, val, interface, - NULL, 0, USB_CTRL_SET_TIMEOUT); + + do_send = 1; } - return 0; + if (!do_send) + return 0; + + usb_autopm_get_interface(serial->interface); + retval = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), + 0x22, 0x21, val, interface, NULL, 0, USB_CTRL_SET_TIMEOUT); + usb_autopm_put_interface(serial->interface); + + return retval; } static void sierra_set_termios(struct tty_struct *tty, diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c index 3c249d8e8b8e..993a6d5a1b7a 100644 --- a/drivers/usb/serial/spcp8x5.c +++ b/drivers/usb/serial/spcp8x5.c @@ -299,7 +299,6 @@ struct spcp8x5_private { wait_queue_head_t delta_msr_wait; u8 line_control; u8 line_status; - u8 termios_initialized; }; /* desc : when device plug in,this function would be called. @@ -498,6 +497,15 @@ static void spcp8x5_close(struct usb_serial_port *port) dev_dbg(&port->dev, "usb_unlink_urb(read_urb) = %d\n", result); } +static void spcp8x5_init_termios(struct tty_struct *tty) +{ + /* for the 1st time call this function */ + *(tty->termios) = tty_std_termios; + tty->termios->c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL; + tty->termios->c_ispeed = 115200; + tty->termios->c_ospeed = 115200; +} + /* set the serial param for transfer. we should check if we really need to * transfer. if we set flow control we should do this too. */ static void spcp8x5_set_termios(struct tty_struct *tty, @@ -514,16 +522,6 @@ static void spcp8x5_set_termios(struct tty_struct *tty, int i; u8 control; - /* for the 1st time call this function */ - spin_lock_irqsave(&priv->lock, flags); - if (!priv->termios_initialized) { - *(tty->termios) = tty_std_termios; - tty->termios->c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL; - tty->termios->c_ispeed = 115200; - tty->termios->c_ospeed = 115200; - priv->termios_initialized = 1; - } - spin_unlock_irqrestore(&priv->lock, flags); /* check that they really want us to change something */ if (!tty_termios_hw_change(tty->termios, old_termios)) @@ -1011,6 +1009,7 @@ static struct usb_serial_driver spcp8x5_device = { .carrier_raised = spcp8x5_carrier_raised, .write = spcp8x5_write, .set_termios = spcp8x5_set_termios, + .init_termios = spcp8x5_init_termios, .ioctl = spcp8x5_ioctl, .tiocmget = spcp8x5_tiocmget, .tiocmset = spcp8x5_tiocmset, diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 99188c92068b..3292e0391e28 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c @@ -43,8 +43,6 @@ #define DRIVER_AUTHOR "Greg Kroah-Hartman, greg@kroah.com, http://www.kroah.com/linux/" #define DRIVER_DESC "USB Serial Driver core" -static void port_free(struct usb_serial_port *port); - /* Driver structure we register with the USB core */ static struct usb_driver usb_serial_driver = { .name = "usbserial", @@ -68,6 +66,11 @@ static struct usb_serial *serial_table[SERIAL_TTY_MINORS]; static DEFINE_MUTEX(table_lock); static LIST_HEAD(usb_serial_driver_list); +/* + * Look up the serial structure. If it is found and it hasn't been + * disconnected, return with its disc_mutex held and its refcount + * incremented. Otherwise return NULL. + */ struct usb_serial *usb_serial_get_by_index(unsigned index) { struct usb_serial *serial; @@ -75,8 +78,15 @@ struct usb_serial *usb_serial_get_by_index(unsigned index) mutex_lock(&table_lock); serial = serial_table[index]; - if (serial) - kref_get(&serial->kref); + if (serial) { + mutex_lock(&serial->disc_mutex); + if (serial->disconnected) { + mutex_unlock(&serial->disc_mutex); + serial = NULL; + } else { + kref_get(&serial->kref); + } + } mutex_unlock(&table_lock); return serial; } @@ -125,8 +135,10 @@ static void return_serial(struct usb_serial *serial) dbg("%s", __func__); + mutex_lock(&table_lock); for (i = 0; i < serial->num_ports; ++i) serial_table[serial->minor + i] = NULL; + mutex_unlock(&table_lock); } static void destroy_serial(struct kref *kref) @@ -143,163 +155,160 @@ static void destroy_serial(struct kref *kref) if (serial->minor != SERIAL_TTY_NO_MINOR) return_serial(serial); - serial->type->release(serial); + if (serial->attached) + serial->type->release(serial); - for (i = 0; i < serial->num_ports; ++i) { + /* Now that nothing is using the ports, they can be freed */ + for (i = 0; i < serial->num_port_pointers; ++i) { port = serial->port[i]; - if (port) + if (port) { + port->serial = NULL; put_device(&port->dev); - } - - /* If this is a "fake" port, we have to clean it up here, as it will - * not get cleaned up in port_release() as it was never registered with - * the driver core */ - if (serial->num_ports < serial->num_port_pointers) { - for (i = serial->num_ports; - i < serial->num_port_pointers; ++i) { - port = serial->port[i]; - if (port) - port_free(port); } } usb_put_dev(serial->dev); - - /* free up any memory that we allocated */ kfree(serial); } void usb_serial_put(struct usb_serial *serial) { - mutex_lock(&table_lock); kref_put(&serial->kref, destroy_serial); - mutex_unlock(&table_lock); } /***************************************************************************** * Driver tty interface functions *****************************************************************************/ -static int serial_open (struct tty_struct *tty, struct file *filp) + +/** + * serial_install - install tty + * @driver: the driver (USB in our case) + * @tty: the tty being created + * + * Create the termios objects for this tty. We use the default + * USB serial settings but permit them to be overridden by + * serial->type->init_termios. + * + * This is the first place a new tty gets used. Hence this is where we + * acquire references to the usb_serial structure and the driver module, + * where we store a pointer to the port, and where we do an autoresume. + * All these actions are reversed in serial_release(). + */ +static int serial_install(struct tty_driver *driver, struct tty_struct *tty) { + int idx = tty->index; struct usb_serial *serial; struct usb_serial_port *port; - unsigned int portNumber; - int retval = 0; - int first = 0; + int retval = -ENODEV; dbg("%s", __func__); - /* get the serial object associated with this tty pointer */ - serial = usb_serial_get_by_index(tty->index); - if (!serial) { - tty->driver_data = NULL; - return -ENODEV; - } + serial = usb_serial_get_by_index(idx); + if (!serial) + return retval; - mutex_lock(&serial->disc_mutex); - portNumber = tty->index - serial->minor; - port = serial->port[portNumber]; - if (!port || serial->disconnected) - retval = -ENODEV; - else - get_device(&port->dev); - /* - * Note: Our locking order requirement does not allow port->mutex - * to be acquired while serial->disc_mutex is held. - */ - mutex_unlock(&serial->disc_mutex); + port = serial->port[idx - serial->minor]; + if (!port) + goto error_no_port; + if (!try_module_get(serial->type->driver.owner)) + goto error_module_get; + + /* perform the standard setup */ + retval = tty_init_termios(tty); if (retval) - goto bailout_serial_put; + goto error_init_termios; - if (mutex_lock_interruptible(&port->mutex)) { - retval = -ERESTARTSYS; - goto bailout_port_put; - } + retval = usb_autopm_get_interface(serial->interface); + if (retval) + goto error_get_interface; + + mutex_unlock(&serial->disc_mutex); - ++port->port.count; + /* allow the driver to update the settings */ + if (serial->type->init_termios) + serial->type->init_termios(tty); - /* set up our port structure making the tty driver - * remember our port object, and us it */ tty->driver_data = port; - tty_port_tty_set(&port->port, tty); - /* If the console is attached, the device is already open */ - if (port->port.count == 1 && !port->console) { - first = 1; - /* lock this module before we call it - * this may fail, which means we must bail out, - * safe because we are called with BKL held */ - if (!try_module_get(serial->type->driver.owner)) { - retval = -ENODEV; - goto bailout_mutex_unlock; - } + /* Final install (we use the default method) */ + tty_driver_kref_get(driver); + tty->count++; + driver->ttys[idx] = tty; + return retval; + error_get_interface: + error_init_termios: + module_put(serial->type->driver.owner); + error_module_get: + error_no_port: + usb_serial_put(serial); + mutex_unlock(&serial->disc_mutex); + return retval; +} + +static int serial_open(struct tty_struct *tty, struct file *filp) +{ + struct usb_serial_port *port = tty->driver_data; + struct usb_serial *serial = port->serial; + int retval; + + dbg("%s - port %d", __func__, port->number); + + spin_lock_irq(&port->port.lock); + if (!tty_hung_up_p(filp)) + ++port->port.count; + spin_unlock_irq(&port->port.lock); + tty_port_tty_set(&port->port, tty); + + /* Do the device-specific open only if the hardware isn't + * already initialized. + */ + if (!test_bit(ASYNCB_INITIALIZED, &port->port.flags)) { + if (mutex_lock_interruptible(&port->mutex)) + return -ERESTARTSYS; mutex_lock(&serial->disc_mutex); if (serial->disconnected) retval = -ENODEV; else - retval = usb_autopm_get_interface(serial->interface); - if (retval) - goto bailout_module_put; - - /* only call the device specific open if this - * is the first time the port is opened */ - retval = serial->type->open(tty, port, filp); - if (retval) - goto bailout_interface_put; + retval = port->serial->type->open(tty, port, filp); mutex_unlock(&serial->disc_mutex); + mutex_unlock(&port->mutex); + if (retval) + return retval; set_bit(ASYNCB_INITIALIZED, &port->port.flags); } - mutex_unlock(&port->mutex); + /* Now do the correct tty layer semantics */ retval = tty_port_block_til_ready(&port->port, tty, filp); - if (retval == 0) { - if (!first) - usb_serial_put(serial); - return 0; - } - mutex_lock(&port->mutex); - if (first == 0) - goto bailout_mutex_unlock; - /* Undo the initial port actions */ - mutex_lock(&serial->disc_mutex); -bailout_interface_put: - usb_autopm_put_interface(serial->interface); -bailout_module_put: - mutex_unlock(&serial->disc_mutex); - module_put(serial->type->driver.owner); -bailout_mutex_unlock: - port->port.count = 0; - tty->driver_data = NULL; - tty_port_tty_set(&port->port, NULL); - mutex_unlock(&port->mutex); -bailout_port_put: - put_device(&port->dev); -bailout_serial_put: - usb_serial_put(serial); return retval; } /** - * serial_do_down - shut down hardware - * @port: port to shut down - * - * Shut down a USB port unless it is the console. We never shut down the - * console hardware as it will always be in use. + * serial_down - shut down hardware + * @port: port to shut down * - * Don't free any resources at this point + * Shut down a USB serial port unless it is the console. We never + * shut down the console hardware as it will always be in use. */ -static void serial_do_down(struct usb_serial_port *port) +static void serial_down(struct usb_serial_port *port) { struct usb_serial_driver *drv = port->serial->type; struct usb_serial *serial; struct module *owner; - /* The console is magical, do not hang up the console hardware - or there will be tears */ + /* + * The console is magical. Do not hang up the console hardware + * or there will be tears. + */ if (port->console) return; + /* Don't call the close method if the hardware hasn't been + * initialized. + */ + if (!test_and_clear_bit(ASYNCB_INITIALIZED, &port->port.flags)) + return; + mutex_lock(&port->mutex); serial = port->serial; owner = serial->type->driver.owner; @@ -310,79 +319,69 @@ static void serial_do_down(struct usb_serial_port *port) mutex_unlock(&port->mutex); } -/** - * serial_do_free - free resources post close/hangup - * @port: port to free up - * - * Do the resource freeing and refcount dropping for the port. We must - * be careful about ordering and we must avoid freeing up the console. - */ - -static void serial_do_free(struct usb_serial_port *port) +static void serial_hangup(struct tty_struct *tty) { - struct usb_serial *serial; - struct module *owner; + struct usb_serial_port *port = tty->driver_data; - /* The console is magical, do not hang up the console hardware - or there will be tears */ - if (port->console) - return; + dbg("%s - port %d", __func__, port->number); - serial = port->serial; - owner = serial->type->driver.owner; - put_device(&port->dev); - /* Mustn't dereference port any more */ - mutex_lock(&serial->disc_mutex); - if (!serial->disconnected) - usb_autopm_put_interface(serial->interface); - mutex_unlock(&serial->disc_mutex); - usb_serial_put(serial); - /* Mustn't dereference serial any more */ - module_put(owner); + serial_down(port); + tty_port_hangup(&port->port); } static void serial_close(struct tty_struct *tty, struct file *filp) { struct usb_serial_port *port = tty->driver_data; - if (!port) - return; - dbg("%s - port %d", __func__, port->number); - /* FIXME: - This leaves a very narrow race. Really we should do the - serial_do_free() on tty->shutdown(), but tty->shutdown can - be called from IRQ context and serial_do_free can sleep. - - The right fix is probably to make the tty free (which is rare) - and thus tty->shutdown() occur via a work queue and simplify all - the drivers that use it. - */ - if (tty_hung_up_p(filp)) { - /* serial_hangup already called serial_down at this point. - Another user may have already reopened the port but - serial_do_free is refcounted */ - serial_do_free(port); + if (tty_hung_up_p(filp)) return; - } - if (tty_port_close_start(&port->port, tty, filp) == 0) return; - - serial_do_down(port); + serial_down(port); tty_port_close_end(&port->port, tty); tty_port_tty_set(&port->port, NULL); - serial_do_free(port); } -static void serial_hangup(struct tty_struct *tty) +/** + * serial_release - free resources post close/hangup + * @port: port to free up + * + * Do the resource freeing and refcount dropping for the port. + * Avoid freeing the console. + * + * Called when the last tty kref is dropped. + */ +static void serial_release(struct tty_struct *tty) { struct usb_serial_port *port = tty->driver_data; - serial_do_down(port); - tty_port_hangup(&port->port); - /* We must not free port yet - the USB serial layer depends on it's - continued existence */ + struct usb_serial *serial; + struct module *owner; + + /* The console is magical. Do not hang up the console hardware + * or there will be tears. + */ + if (port->console) + return; + + dbg("%s - port %d", __func__, port->number); + + /* Standard shutdown processing */ + tty_shutdown(tty); + + tty->driver_data = NULL; + + serial = port->serial; + owner = serial->type->driver.owner; + + mutex_lock(&serial->disc_mutex); + if (!serial->disconnected) + usb_autopm_put_interface(serial->interface); + mutex_unlock(&serial->disc_mutex); + + usb_serial_put(serial); + module_put(owner); } static int serial_write(struct tty_struct *tty, const unsigned char *buf, @@ -527,6 +526,7 @@ static int serial_proc_show(struct seq_file *m, void *v) seq_putc(m, '\n'); usb_serial_put(serial); + mutex_unlock(&serial->disc_mutex); } return 0; } @@ -596,14 +596,6 @@ static void usb_serial_port_work(struct work_struct *work) tty_kref_put(tty); } -static void port_release(struct device *dev) -{ - struct usb_serial_port *port = to_usb_serial_port(dev); - - dbg ("%s - %s", __func__, dev_name(dev)); - port_free(port); -} - static void kill_traffic(struct usb_serial_port *port) { usb_kill_urb(port->read_urb); @@ -623,8 +615,12 @@ static void kill_traffic(struct usb_serial_port *port) usb_kill_urb(port->interrupt_out_urb); } -static void port_free(struct usb_serial_port *port) +static void port_release(struct device *dev) { + struct usb_serial_port *port = to_usb_serial_port(dev); + + dbg ("%s - %s", __func__, dev_name(dev)); + /* * Stop all the traffic before cancelling the work, so that * nobody will restart it by calling usb_serial_port_softint. @@ -935,6 +931,11 @@ int usb_serial_probe(struct usb_interface *interface, mutex_init(&port->mutex); INIT_WORK(&port->work, usb_serial_port_work); serial->port[i] = port; + port->dev.parent = &interface->dev; + port->dev.driver = NULL; + port->dev.bus = &usb_serial_bus_type; + port->dev.release = &port_release; + device_initialize(&port->dev); } /* set up the endpoint information */ @@ -1060,12 +1061,15 @@ int usb_serial_probe(struct usb_interface *interface, module_put(type->driver.owner); if (retval < 0) goto probe_error; + serial->attached = 1; if (retval > 0) { /* quietly accept this device, but don't bind to a serial port as it's about to disappear */ serial->num_ports = 0; goto exit; } + } else { + serial->attached = 1; } if (get_free_serial(serial, num_ports, &minor) == NULL) { @@ -1077,15 +1081,10 @@ int usb_serial_probe(struct usb_interface *interface, /* register all of the individual ports with the driver core */ for (i = 0; i < num_ports; ++i) { port = serial->port[i]; - port->dev.parent = &interface->dev; - port->dev.driver = NULL; - port->dev.bus = &usb_serial_bus_type; - port->dev.release = &port_release; - dev_set_name(&port->dev, "ttyUSB%d", port->number); dbg ("%s - registering %s", __func__, dev_name(&port->dev)); port->dev_state = PORT_REGISTERING; - retval = device_register(&port->dev); + retval = device_add(&port->dev); if (retval) { dev_err(&port->dev, "Error registering port device, " "continuing\n"); @@ -1103,39 +1102,7 @@ exit: return 0; probe_error: - for (i = 0; i < num_bulk_in; ++i) { - port = serial->port[i]; - if (!port) - continue; - usb_free_urb(port->read_urb); - kfree(port->bulk_in_buffer); - } - for (i = 0; i < num_bulk_out; ++i) { - port = serial->port[i]; - if (!port) - continue; - usb_free_urb(port->write_urb); - kfree(port->bulk_out_buffer); - } - for (i = 0; i < num_interrupt_in; ++i) { - port = serial->port[i]; - if (!port) - continue; - usb_free_urb(port->interrupt_in_urb); - kfree(port->interrupt_in_buffer); - } - for (i = 0; i < num_interrupt_out; ++i) { - port = serial->port[i]; - if (!port) - continue; - usb_free_urb(port->interrupt_out_urb); - kfree(port->interrupt_out_buffer); - } - - /* free up any memory that we allocated */ - for (i = 0; i < serial->num_port_pointers; ++i) - kfree(serial->port[i]); - kfree(serial); + usb_serial_put(serial); return -EIO; } EXPORT_SYMBOL_GPL(usb_serial_probe); @@ -1161,10 +1128,7 @@ void usb_serial_disconnect(struct usb_interface *interface) if (port) { struct tty_struct *tty = tty_port_tty_get(&port->port); if (tty) { - /* The hangup will occur asynchronously but - the object refcounts will sort out all the - cleanup */ - tty_hangup(tty); + tty_vhangup(tty); tty_kref_put(tty); } kill_traffic(port); @@ -1189,8 +1153,7 @@ void usb_serial_disconnect(struct usb_interface *interface) } serial->type->disconnect(serial); - /* let the last holder of this object - * cause it to be cleaned up */ + /* let the last holder of this object cause it to be cleaned up */ usb_serial_put(serial); dev_info(dev, "device disconnected\n"); } @@ -1246,6 +1209,8 @@ static const struct tty_operations serial_ops = { .chars_in_buffer = serial_chars_in_buffer, .tiocmget = serial_tiocmget, .tiocmset = serial_tiocmset, + .shutdown = serial_release, + .install = serial_install, .proc_fops = &serial_proc_fops, }; diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c index 8d126dd7a02e..f7232b1bce51 100644 --- a/drivers/usb/serial/whiteheat.c +++ b/drivers/usb/serial/whiteheat.c @@ -259,7 +259,7 @@ static int firm_send_command(struct usb_serial_port *port, __u8 command, __u8 *data, __u8 datasize); static int firm_open(struct usb_serial_port *port); static int firm_close(struct usb_serial_port *port); -static int firm_setup_port(struct tty_struct *tty); +static void firm_setup_port(struct tty_struct *tty); static int firm_set_rts(struct usb_serial_port *port, __u8 onoff); static int firm_set_dtr(struct usb_serial_port *port, __u8 onoff); static int firm_set_break(struct usb_serial_port *port, __u8 onoff); @@ -1211,7 +1211,7 @@ static int firm_close(struct usb_serial_port *port) } -static int firm_setup_port(struct tty_struct *tty) +static void firm_setup_port(struct tty_struct *tty) { struct usb_serial_port *port = tty->driver_data; struct whiteheat_port_settings port_settings; @@ -1286,7 +1286,7 @@ static int firm_setup_port(struct tty_struct *tty) port_settings.lloop = 0; /* now send the message to the device */ - return firm_send_command(port, WHITEHEAT_SETUP_PORT, + firm_send_command(port, WHITEHEAT_SETUP_PORT, (__u8 *)&port_settings, sizeof(port_settings)); } diff --git a/drivers/usb/storage/initializers.c b/drivers/usb/storage/initializers.c index ec17c96371af..105d900150c1 100644 --- a/drivers/usb/storage/initializers.c +++ b/drivers/usb/storage/initializers.c @@ -102,5 +102,5 @@ int usb_stor_huawei_e220_init(struct us_data *us) USB_TYPE_STANDARD | USB_RECIP_DEVICE, 0x01, 0x0, NULL, 0x0, 1000); US_DEBUGP("Huawei mode set result is %d\n", result); - return (result ? 0 : -ENODEV); + return 0; } diff --git a/drivers/usb/storage/onetouch.c b/drivers/usb/storage/onetouch.c index 380233bd6a39..80e65f29921c 100644 --- a/drivers/usb/storage/onetouch.c +++ b/drivers/usb/storage/onetouch.c @@ -163,7 +163,7 @@ static void usb_onetouch_pm_hook(struct us_data *us, int action) usb_kill_urb(onetouch->irq); break; case US_RESUME: - if (usb_submit_urb(onetouch->irq, GFP_KERNEL) != 0) + if (usb_submit_urb(onetouch->irq, GFP_NOIO) != 0) dev_err(&onetouch->irq->dev->dev, "usb_submit_urb failed\n"); break; diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c index e20dc525d177..cc313d16d727 100644 --- a/drivers/usb/storage/transport.c +++ b/drivers/usb/storage/transport.c @@ -666,10 +666,11 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) * to wait for at least one CHECK_CONDITION to determine * SANE_SENSE support */ - if ((srb->cmnd[0] == ATA_16 || srb->cmnd[0] == ATA_12) && + if (unlikely((srb->cmnd[0] == ATA_16 || srb->cmnd[0] == ATA_12) && result == USB_STOR_TRANSPORT_GOOD && !(us->fflags & US_FL_SANE_SENSE) && - !(srb->cmnd[2] & 0x20)) { + !(us->fflags & US_FL_BAD_SENSE) && + !(srb->cmnd[2] & 0x20))) { US_DEBUGP("-- SAT supported, increasing auto-sense\n"); us->fflags |= US_FL_SANE_SENSE; } @@ -696,7 +697,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) /* device supports and needs bigger sense buffer */ if (us->fflags & US_FL_SANE_SENSE) sense_size = ~0; - +Retry_Sense: US_DEBUGP("Issuing auto-REQUEST_SENSE\n"); scsi_eh_prep_cmnd(srb, &ses, NULL, 0, sense_size); @@ -718,8 +719,30 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) { US_DEBUGP("-- auto-sense aborted\n"); srb->result = DID_ABORT << 16; + + /* If SANE_SENSE caused this problem, disable it */ + if (sense_size != US_SENSE_SIZE) { + us->fflags &= ~US_FL_SANE_SENSE; + us->fflags |= US_FL_BAD_SENSE; + } goto Handle_Errors; } + + /* Some devices claim to support larger sense but fail when + * trying to request it. When a transport failure happens + * using US_FS_SANE_SENSE, we always retry with a standard + * (small) sense request. This fixes some USB GSM modems + */ + if (temp_result == USB_STOR_TRANSPORT_FAILED && + sense_size != US_SENSE_SIZE) { + US_DEBUGP("-- auto-sense failure, retry small sense\n"); + sense_size = US_SENSE_SIZE; + us->fflags &= ~US_FL_SANE_SENSE; + us->fflags |= US_FL_BAD_SENSE; + goto Retry_Sense; + } + + /* Other failures */ if (temp_result != USB_STOR_TRANSPORT_GOOD) { US_DEBUGP("-- auto-sense failure\n"); @@ -739,6 +762,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) */ if (srb->sense_buffer[7] > (US_SENSE_SIZE - 8) && !(us->fflags & US_FL_SANE_SENSE) && + !(us->fflags & US_FL_BAD_SENSE) && (srb->sense_buffer[0] & 0x7C) == 0x70) { US_DEBUGP("-- SANE_SENSE support enabled\n"); us->fflags |= US_FL_SANE_SENSE; @@ -768,17 +792,32 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) /* set the result so the higher layers expect this data */ srb->result = SAM_STAT_CHECK_CONDITION; - /* If things are really okay, then let's show that. Zero - * out the sense buffer so the higher layers won't realize - * we did an unsolicited auto-sense. */ - if (result == USB_STOR_TRANSPORT_GOOD && - /* Filemark 0, ignore EOM, ILI 0, no sense */ + /* We often get empty sense data. This could indicate that + * everything worked or that there was an unspecified + * problem. We have to decide which. + */ + if ( /* Filemark 0, ignore EOM, ILI 0, no sense */ (srb->sense_buffer[2] & 0xaf) == 0 && /* No ASC or ASCQ */ srb->sense_buffer[12] == 0 && srb->sense_buffer[13] == 0) { - srb->result = SAM_STAT_GOOD; - srb->sense_buffer[0] = 0x0; + + /* If things are really okay, then let's show that. + * Zero out the sense buffer so the higher layers + * won't realize we did an unsolicited auto-sense. + */ + if (result == USB_STOR_TRANSPORT_GOOD) { + srb->result = SAM_STAT_GOOD; + srb->sense_buffer[0] = 0x0; + + /* If there was a problem, report an unspecified + * hardware error to prevent the higher layers from + * entering an infinite retry loop. + */ + } else { + srb->result = DID_ERROR << 16; + srb->sense_buffer[2] = HARDWARE_ERROR; + } } } diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 7477d411959f..5ef11f435330 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h @@ -838,6 +838,13 @@ UNUSUAL_DEV( 0x066f, 0x8000, 0x0001, 0x0001, US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_CAPACITY ), +/* Reported by Daniel Kukula <daniel.kuku@gmail.com> */ +UNUSUAL_DEV( 0x067b, 0x1063, 0x0100, 0x0100, + "Prolific Technology, Inc.", + "Prolific Storage Gadget", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_BAD_SENSE ), + /* Reported by Rogerio Brito <rbrito@ime.usp.br> */ UNUSUAL_DEV( 0x067b, 0x2317, 0x0001, 0x001, "Prolific Technology, Inc.", @@ -1820,13 +1827,6 @@ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_GO_SLOW ), -/* Reported by Rohan Hart <rohan.hart17@gmail.com> */ -UNUSUAL_DEV( 0x2770, 0x915d, 0x0010, 0x0010, - "INTOVA", - "Pixtreme", - US_SC_DEVICE, US_PR_DEVICE, NULL, - US_FL_FIX_CAPACITY ), - /* Reported by Frederic Marchal <frederic.marchal@wowcompany.com> * Mio Moov 330 */ diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index 11dd37de45c7..f3ba49f62408 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c @@ -228,6 +228,7 @@ void fill_inquiry_response(struct us_data *us, unsigned char *data, if (data_len<36) // You lose. return; + memset(data+8, ' ', 28); if(data[0]&0x20) { /* USB device currently not connected. Return peripheral qualifier 001b ("...however, the physical device is not currently connected @@ -237,15 +238,15 @@ void fill_inquiry_response(struct us_data *us, unsigned char *data, device, it may return zeros or ASCII spaces (20h) in those fields until the data is available from the device."). */ - memset(data+8,0,28); } else { u16 bcdDevice = le16_to_cpu(us->pusb_dev->descriptor.bcdDevice); - memcpy(data+8, us->unusual_dev->vendorName, - strlen(us->unusual_dev->vendorName) > 8 ? 8 : - strlen(us->unusual_dev->vendorName)); - memcpy(data+16, us->unusual_dev->productName, - strlen(us->unusual_dev->productName) > 16 ? 16 : - strlen(us->unusual_dev->productName)); + int n; + + n = strlen(us->unusual_dev->vendorName); + memcpy(data+8, us->unusual_dev->vendorName, min(8, n)); + n = strlen(us->unusual_dev->productName); + memcpy(data+16, us->unusual_dev->productName, min(16, n)); + data[32] = 0x30 + ((bcdDevice>>12) & 0x0F); data[33] = 0x30 + ((bcdDevice>>8) & 0x0F); data[34] = 0x30 + ((bcdDevice>>4) & 0x0F); @@ -432,7 +433,8 @@ static void adjust_quirks(struct us_data *us) u16 vid = le16_to_cpu(us->pusb_dev->descriptor.idVendor); u16 pid = le16_to_cpu(us->pusb_dev->descriptor.idProduct); unsigned f = 0; - unsigned int mask = (US_FL_SANE_SENSE | US_FL_FIX_CAPACITY | + unsigned int mask = (US_FL_SANE_SENSE | US_FL_BAD_SENSE | + US_FL_FIX_CAPACITY | US_FL_CAPACITY_HEURISTICS | US_FL_IGNORE_DEVICE | US_FL_NOT_LOCKABLE | US_FL_MAX_SECTORS_64 | US_FL_CAPACITY_OK | US_FL_IGNORE_RESIDUE | @@ -462,6 +464,9 @@ static void adjust_quirks(struct us_data *us) case 'a': f |= US_FL_SANE_SENSE; break; + case 'b': + f |= US_FL_BAD_SENSE; + break; case 'c': f |= US_FL_FIX_CAPACITY; break; diff --git a/drivers/video/backlight/lcd.c b/drivers/video/backlight/lcd.c index b6449470106c..a482dd7b0311 100644 --- a/drivers/video/backlight/lcd.c +++ b/drivers/video/backlight/lcd.c @@ -56,7 +56,7 @@ static int fb_notifier_callback(struct notifier_block *self, static int lcd_register_fb(struct lcd_device *ld) { - memset(&ld->fb_notif, 0, sizeof(&ld->fb_notif)); + memset(&ld->fb_notif, 0, sizeof(ld->fb_notif)); ld->fb_notif.notifier_call = fb_notifier_callback; return fb_register_client(&ld->fb_notif); } diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index 2f50a80b413e..979b5a18588c 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -67,16 +67,9 @@ config SGI_NEWPORT_CONSOLE # bool 'IODC console' CONFIG_IODC_CONSOLE -config PROM_CONSOLE - bool "PROM console" - depends on SPARC - help - Say Y to build a console driver for Sun machines that uses the - terminal emulation built into their console PROMS. - config DUMMY_CONSOLE bool - depends on PROM_CONSOLE!=y || VGA_CONSOLE!=y || SGI_NEWPORT_CONSOLE!=y + depends on VGA_CONSOLE!=y || SGI_NEWPORT_CONSOLE!=y default y config DUMMY_CONSOLE_COLUMNS diff --git a/drivers/video/console/Makefile b/drivers/video/console/Makefile index ac46cc3f6a2a..a862e9173ebe 100644 --- a/drivers/video/console/Makefile +++ b/drivers/video/console/Makefile @@ -22,7 +22,6 @@ font-objs += $(font-objs-y) obj-$(CONFIG_DUMMY_CONSOLE) += dummycon.o obj-$(CONFIG_SGI_NEWPORT_CONSOLE) += newport_con.o font.o -obj-$(CONFIG_PROM_CONSOLE) += promcon.o promcon_tbl.o obj-$(CONFIG_STI_CONSOLE) += sticon.o sticore.o font.o obj-$(CONFIG_VGA_CONSOLE) += vgacon.o obj-$(CONFIG_MDA_CONSOLE) += mdacon.o @@ -40,14 +39,3 @@ obj-$(CONFIG_FB_STI) += sticore.o font.o ifeq ($(CONFIG_USB_SISUSBVGA_CON),y) obj-$(CONFIG_USB_SISUSBVGA) += font.o endif - -# Targets that kbuild needs to know about -targets := promcon_tbl.c - -quiet_cmd_conmakehash = CNMKHSH $@ - cmd_conmakehash = scripts/conmakehash $< | \ - sed -e '/\#include <[^>]*>/p' -e 's/types/init/' \ - -e 's/dfont\(_uni.*\]\)/promfont\1 /' > $@ - -$(obj)/promcon_tbl.c: $(src)/prom.uni - $(call cmd,conmakehash) diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index 3a44695b9c09..29ff5ea3cc3c 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c @@ -114,6 +114,7 @@ static int last_fb_vc = MAX_NR_CONSOLES - 1; static int fbcon_is_default = 1; static int fbcon_has_exited; static int primary_device = -1; +static int fbcon_has_console_bind; #ifdef CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY static int map_override; @@ -544,6 +545,8 @@ static int fbcon_takeover(int show_logo) con2fb_map[i] = -1; } info_idx = -1; + } else { + fbcon_has_console_bind = 1; } return err; @@ -2923,6 +2926,10 @@ static int fbcon_unbind(void) ret = unbind_con_driver(&fb_con, first_fb_vc, last_fb_vc, fbcon_is_default); + + if (!ret) + fbcon_has_console_bind = 0; + return ret; } #else @@ -2936,6 +2943,9 @@ static int fbcon_fb_unbind(int idx) { int i, new_idx = -1, ret = 0; + if (!fbcon_has_console_bind) + return 0; + for (i = first_fb_vc; i <= last_fb_vc; i++) { if (con2fb_map[i] != idx && con2fb_map[i] != -1) { diff --git a/drivers/video/matrox/g450_pll.c b/drivers/video/matrox/g450_pll.c index d42346e7fdda..3dcb6d218f7c 100644 --- a/drivers/video/matrox/g450_pll.c +++ b/drivers/video/matrox/g450_pll.c @@ -341,7 +341,8 @@ static int __g450_setclk(WPMINFO unsigned int fout, unsigned int pll, M1064_XDVICLKCTRL_C1DVICLKEN | M1064_XDVICLKCTRL_DVILOOPCTL | M1064_XDVICLKCTRL_P1LOOPBWDTCTL; - matroxfb_DAC_out(PMINFO M1064_XDVICLKCTRL,tmp); + /* Setting this breaks PC systems so don't do it */ + /* matroxfb_DAC_out(PMINFO M1064_XDVICLKCTRL,tmp); */ matroxfb_DAC_out(PMINFO M1064_XPWRCTRL, xpwrctrl); diff --git a/drivers/video/modedb.c b/drivers/video/modedb.c index 9c4739c8b19c..34e4e7995169 100644 --- a/drivers/video/modedb.c +++ b/drivers/video/modedb.c @@ -35,11 +35,6 @@ EXPORT_SYMBOL_GPL(fb_mode_option); */ static const struct fb_videomode modedb[] = { - { - /* 800x480 @ 60 Hz, 31.5 kHz hsync */ - "LQ070Y3DG3B", 60, 800, 480, 44000, 0, 50, 25, 10, 128, 10, - FB_SYNC_EXT,FB_VMODE_NONINTERLACED - }, { /* 640x400 @ 70 Hz, 31.5 kHz hsync */ NULL, 70, 640, 400, 39721, 40, 24, 39, 9, 96, 2, diff --git a/drivers/video/mxc/Kconfig b/drivers/video/mxc/Kconfig index 42f990ac3499..e86e6d86b978 100644 --- a/drivers/video/mxc/Kconfig +++ b/drivers/video/mxc/Kconfig @@ -38,10 +38,6 @@ config FB_MXC_CLAA_WVGA_SYNC_PANEL depends on FB_MXC_SYNC_PANEL tristate "CLAA WVGA Panel" -config FB_MXC_SII9022 - depends on FB_MXC_SYNC_PANEL - tristate "Si Image SII9022 DVI/HDMI Interface Chip" - config FB_MXC_CH7026 depends on FB_MXC_SYNC_PANEL tristate "Chrontel CH7026 VGA Interface Chip" diff --git a/drivers/video/mxc/Makefile b/drivers/video/mxc/Makefile index d823ab29f030..b47b3f77cd80 100644 --- a/drivers/video/mxc/Makefile +++ b/drivers/video/mxc/Makefile @@ -21,4 +21,3 @@ obj-$(CONFIG_FB_MXC_TVOUT_TVE) += tve.o obj-$(CONFIG_FB_MXC_CH7026) += mxcfb_ch7026.o #obj-$(CONFIG_FB_MODE_HELPERS) += mxc_edid.o obj-$(CONFIG_VIDEO_AD9389) += ad9389.o -obj-$(CONFIG_FB_MXC_SII9022) += mxcfb_sii9022.o diff --git a/drivers/video/mxc/mxc_elcdif_fb.c b/drivers/video/mxc/mxc_elcdif_fb.c index e163edb7bfb9..44587d28c7f9 100644 --- a/drivers/video/mxc/mxc_elcdif_fb.c +++ b/drivers/video/mxc/mxc_elcdif_fb.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Freescale Semiconductor, Inc. + * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved. */ /* @@ -64,8 +64,7 @@ #define ELCDIF_PIX_FMT_ABGR32 fourcc('A', 'B', 'G', 'R') struct mxc_elcdif_fb_data { - int cur_blank; - int next_blank; + int is_blank; int output_pix_fmt; int elcdif_mode; ssize_t mem_size; @@ -518,7 +517,7 @@ static inline void mxc_init_elcdif(void) return; } -int mxc_elcdif_frame_addr_setup(dma_addr_t phys) +static inline int mxc_elcdif_dma_init(dma_addr_t phys) { int ret = 0; @@ -807,7 +806,7 @@ static int mxc_elcdif_fb_set_par(struct fb_info *fbi) return -ENOMEM; } - if (data->next_blank != FB_BLANK_UNBLANK) + if (data->is_blank) return 0; /* init next panel */ @@ -846,7 +845,7 @@ static int mxc_elcdif_fb_set_par(struct fb_info *fbi) data->output_pix_fmt, sig_cfg, 1); - mxc_elcdif_frame_addr_setup(fbi->fix.smem_start); + mxc_elcdif_dma_init(fbi->fix.smem_start); mxc_elcdif_run(); mxc_elcdif_blank_panel(FB_BLANK_UNBLANK); @@ -951,7 +950,7 @@ static int mxc_elcdif_fb_wait_for_vsync(u32 channel, struct fb_info *info) (struct mxc_elcdif_fb_data *)info->par; int ret = 0; - if (data->cur_blank != FB_BLANK_UNBLANK) { + if (data->is_blank) { dev_err(info->device, "can't wait for VSYNC when fb " "is blank\n"); return -EINVAL; @@ -991,15 +990,6 @@ static int mxc_elcdif_fb_ioctl(struct fb_info *info, unsigned int cmd, if (!get_user(channel, (__u32 __user *) arg)) ret = mxc_elcdif_fb_wait_for_vsync(channel, info); break; - case MXCFB_GET_FB_BLANK: - { - struct mxc_elcdif_fb_data *data = - (struct mxc_elcdif_fb_data *)info->par; - - if (put_user(data->cur_blank, (__u32 __user *)arg)) - return -EFAULT; - break; - } default: break; } @@ -1012,28 +1002,22 @@ static int mxc_elcdif_fb_blank(int blank, struct fb_info *info) (struct mxc_elcdif_fb_data *)info->par; int ret = 0; - if (data->cur_blank == blank) + if (data->is_blank == (blank != FB_BLANK_UNBLANK)) return ret; - data->next_blank = blank; - - if (!g_elcdif_pix_clk_enable) { - clk_enable(g_elcdif_pix_clk); - g_elcdif_pix_clk_enable = true; + if (blank == FB_BLANK_UNBLANK) { + if (!g_elcdif_pix_clk_enable) { + clk_enable(g_elcdif_pix_clk); + g_elcdif_pix_clk_enable = true; + } } ret = mxc_elcdif_blank_panel(blank); if (ret == 0) - data->cur_blank = blank; + data->is_blank = (blank != FB_BLANK_UNBLANK); else return ret; - if (blank == FB_BLANK_UNBLANK) { - ret = mxc_elcdif_fb_set_par(info); - if (ret) - return ret; - } - - if (data->cur_blank != FB_BLANK_UNBLANK) { + if (data->is_blank) { if (g_elcdif_axi_clk_enable) { clk_disable(g_elcdif_axi_clk); g_elcdif_axi_clk_enable = false; @@ -1064,7 +1048,7 @@ static int mxc_elcdif_fb_pan_display(struct fb_var_screeninfo *var, int ret = 0; unsigned long base; - if (data->cur_blank != FB_BLANK_UNBLANK) { + if (data->is_blank) { dev_err(info->device, "can't do pan display when fb " "is blank\n"); return -EINVAL; @@ -1187,7 +1171,7 @@ static int mxc_elcdif_fb_probe(struct platform_device *pdev) } data = (struct mxc_elcdif_fb_data *)fbi->par; - data->cur_blank = data->next_blank = FB_BLANK_UNBLANK; + data->is_blank = false; fbi->var.activate = FB_ACTIVATE_NOW; fbi->fbops = &mxc_elcdif_fb_ops; @@ -1350,9 +1334,9 @@ static int mxc_elcdif_fb_suspend(struct platform_device *pdev, acquire_console_sem(); fb_set_suspend(fbi, 1); - saved_blank = data->cur_blank; + saved_blank = data->is_blank; mxc_elcdif_fb_blank(FB_BLANK_POWERDOWN, fbi); - data->next_blank = saved_blank; + data->is_blank = saved_blank; if (!g_elcdif_pix_clk_enable) { clk_enable(g_elcdif_pix_clk); g_elcdif_pix_clk_enable = true; @@ -1363,11 +1347,7 @@ static int mxc_elcdif_fb_suspend(struct platform_device *pdev, clk_disable(g_elcdif_pix_clk); g_elcdif_pix_clk_enable = false; } - if (g_elcdif_axi_clk_enable) { - clk_disable(g_elcdif_axi_clk); - g_elcdif_axi_clk_enable = false; - } - release_console_sem(); + return 0; } @@ -1377,7 +1357,20 @@ static int mxc_elcdif_fb_resume(struct platform_device *pdev) struct mxc_elcdif_fb_data *data = (struct mxc_elcdif_fb_data *)fbi->par; acquire_console_sem(); - mxc_elcdif_fb_blank(data->next_blank, fbi); + if (!g_elcdif_pix_clk_enable) { + clk_enable(g_elcdif_pix_clk); + g_elcdif_pix_clk_enable = true; + } + mxc_init_elcdif(); + mxc_elcdif_init_panel(); + mxc_elcdif_dma_init(fbi->fix.smem_start); + mxc_elcdif_run(); + if (g_elcdif_pix_clk_enable) { + clk_disable(g_elcdif_pix_clk); + g_elcdif_pix_clk_enable = false; + } + if (!data->is_blank) + mxc_elcdif_fb_blank(FB_BLANK_UNBLANK, fbi); fb_set_suspend(fbi, 0); release_console_sem(); diff --git a/drivers/video/mxc/mxc_epdc_fb.c b/drivers/video/mxc/mxc_epdc_fb.c index e9aa9fc72f9c..27f9faa64e53 100644 --- a/drivers/video/mxc/mxc_epdc_fb.c +++ b/drivers/video/mxc/mxc_epdc_fb.c @@ -21,6 +21,8 @@ * Copyright 2008 Embedded Alley Solutions, Inc All Rights Reserved. */ +/*#define NO_POWERDOWN*/ + #include <linux/module.h> #include <linux/kernel.h> #include <linux/device.h> @@ -55,7 +57,6 @@ /*#define DEFAULT_PANEL_HW_INIT*/ #define NUM_SCREENS 2 -#define NUM_SCREENS_X 16 #define EPDC_NUM_LUTS 16 #define EPDC_MAX_NUM_UPDATES 20 #define INVALID_LUT -1 @@ -71,7 +72,20 @@ #define POWER_STATE_ON 1 static unsigned long default_bpp = 16; -static unsigned long g_num_screens = NUM_SCREENS; + +struct mxc_epdc_platform_fb_entry { + char name[16]; + u16 x_res; + u16 y_res; + u16 bpp; + u32 cycle_time_ns; + struct list_head link; +}; + +struct mxc_epdc_platform_fb_data { + struct list_head list; + struct mxc_epdc_platform_fb_entry *cur; +}; struct update_marker_data { u32 update_marker; @@ -99,15 +113,13 @@ struct update_data_list { struct mxc_epdc_fb_data { struct fb_info info; u32 pseudo_palette[16]; - char *fb_panel_str; struct list_head list; - struct mxc_epdc_fb_mode *cur_mode; - struct mxc_epdc_fb_platform_data *pdata; + struct mxc_epdc_platform_fb_entry *cur; int blank; + ssize_t mem_size; ssize_t map_size; dma_addr_t phys_start; u32 fb_offset; - int default_bpp; int native_width; int native_height; int epdc_irq; @@ -143,10 +155,9 @@ struct mxc_epdc_fb_data { struct update_marker_data update_marker_array[EPDC_MAX_NUM_UPDATES]; u32 lut_update_type[EPDC_NUM_LUTS]; struct completion updates_done; - struct delayed_work epdc_done_work; + struct work_struct epdc_done_work; struct mutex power_mutex; bool powering_down; - int pwrdown_delay; /* FB elements related to PxP DMA */ struct completion pxp_tx_cmpl; @@ -191,12 +202,35 @@ struct mxcfb_waveform_data_file { void __iomem *epdc_base; +#define NUM_PANELS 1 + +static struct fb_videomode panel_modes[NUM_PANELS] = { + { + /* 800x600 @ 60 Hz , pixel clk @ 20MHz */ + "E-INK SVGA", 60, 800, 600, 50000, 8, 142, 4, 10, 20, 4, + 0, + FB_VMODE_NONINTERLACED, + 0,}, +}; + +/* + * This is a temporary placeholder + * Ultimately, this declaration will be off in a panel-specific file, + * and will include implementations for all of the panel functions + */ +static struct mxc_epdc_platform_fb_entry ed060sc4_fb_entry = { + .name = "ed060sc4", + .x_res = 800, + .y_res = 600, + .bpp = 16, + .cycle_time_ns = 200, +}; + /* forward declaration */ static int mxc_epdc_fb_blank(int blank, struct fb_info *info); static int mxc_epdc_fb_init_hw(struct fb_info *info); static int pxp_process_update(struct mxc_epdc_fb_data *fb_data, - struct mxcfb_rect *update_region, - int x_start_offs); + struct mxcfb_rect *update_region); static int pxp_complete_update(struct mxc_epdc_fb_data *fb_data, u32 *hist_stat); static void draw_mode0(struct mxc_epdc_fb_data *fb_data); @@ -392,6 +426,47 @@ static inline void dump_all_updates(struct mxc_epdc_fb_data *fb_data) {} #endif +void check_waveform(u32 *wv_buf_orig, u32 *wv_buf_cur, u32 wv_buf_size) +{ + int i; + bool is_mismatch = false; + for (i = 0; i < wv_buf_size; i++) { + if (wv_buf_orig[i] != wv_buf_cur[i]) { + is_mismatch = true; + printk + ("Waveform mismatch - wv_buf_orig[%d] = 0x%x, wv_buf_cur[%d] = 0x%x\n", + i, wv_buf_orig[i], i, wv_buf_cur[i]); + } + } + + if (!is_mismatch) + printk("No mismatches!\n"); +} + +static struct fb_var_screeninfo mxc_epdc_fb_default __devinitdata = { + .activate = FB_ACTIVATE_TEST, + .height = -1, + .width = -1, + .pixclock = 20000, + .left_margin = 8, + .right_margin = 142, + .upper_margin = 4, + .lower_margin = 10, + .hsync_len = 20, + .vsync_len = 4, + .vmode = FB_VMODE_NONINTERLACED, +}; + +static struct fb_fix_screeninfo mxc_epdc_fb_fix __devinitdata = { + .id = "mxc_epdc_fb", + .type = FB_TYPE_PACKED_PIXELS, + .visual = FB_VISUAL_TRUECOLOR, + .xpanstep = 0, + .ypanstep = 0, + .ywrapstep = 0, + .accel = FB_ACCEL_NONE, + .line_length = 800 * 2, +}; /******************************************************** * Start Low-Level EPDC Functions @@ -579,10 +654,9 @@ static void epdc_set_vertical_timing(u32 vert_start, u32 vert_end, void epdc_init_settings(struct mxc_epdc_fb_data *fb_data) { - struct mxc_epdc_fb_mode *epdc_mode = fb_data->cur_mode; + struct mxc_epdc_platform_fb_entry *pentry = fb_data->cur; struct fb_var_screeninfo *screeninfo = &fb_data->info.var; u32 reg_val; - int num_ce; /* Reset */ __raw_writel(EPDC_CTRL_SFTRST, EPDC_CTRL_SET); @@ -624,7 +698,7 @@ void epdc_init_settings(struct mxc_epdc_fb_data *fb_data) epdc_set_temp(8); /* EPDC_RES */ - epdc_set_screen_res(epdc_mode->vmode->xres, epdc_mode->vmode->yres); + epdc_set_screen_res(pentry->x_res, pentry->y_res); /* * EPDC_TCE_CTRL @@ -639,7 +713,7 @@ void epdc_init_settings(struct mxc_epdc_fb_data *fb_data) * PIXELS_PER_SDCLK = 4 */ reg_val = - ((epdc_mode->vscan_holdoff << EPDC_TCE_CTRL_VSCAN_HOLDOFF_OFFSET) & + ((4 << EPDC_TCE_CTRL_VSCAN_HOLDOFF_OFFSET) & EPDC_TCE_CTRL_VSCAN_HOLDOFF_MASK) | EPDC_TCE_CTRL_PIXELS_PER_SDCLK_4; __raw_writel(reg_val, EPDC_TCE_CTRL); @@ -657,13 +731,13 @@ void epdc_init_settings(struct mxc_epdc_fb_data *fb_data) /* EPDC_TCE_OE */ reg_val = - ((epdc_mode->sdoed_width << EPDC_TCE_OE_SDOED_WIDTH_OFFSET) & + ((10 << EPDC_TCE_OE_SDOED_WIDTH_OFFSET) & EPDC_TCE_OE_SDOED_WIDTH_MASK) - | ((epdc_mode->sdoed_delay << EPDC_TCE_OE_SDOED_DLY_OFFSET) & + | ((20 << EPDC_TCE_OE_SDOED_DLY_OFFSET) & EPDC_TCE_OE_SDOED_DLY_MASK) - | ((epdc_mode->sdoez_width << EPDC_TCE_OE_SDOEZ_WIDTH_OFFSET) & + | ((10 << EPDC_TCE_OE_SDOEZ_WIDTH_OFFSET) & EPDC_TCE_OE_SDOEZ_WIDTH_MASK) - | ((epdc_mode->sdoez_delay << EPDC_TCE_OE_SDOEZ_DLY_OFFSET) & + | ((20 << EPDC_TCE_OE_SDOEZ_DLY_OFFSET) & EPDC_TCE_OE_SDOEZ_DLY_MASK); __raw_writel(reg_val, EPDC_TCE_OE); @@ -672,17 +746,17 @@ void epdc_init_settings(struct mxc_epdc_fb_data *fb_data) /* EPDC_TCE_TIMING2 */ reg_val = - ((epdc_mode->gdclk_hp_offs << EPDC_TCE_TIMING2_GDCLK_HP_OFFSET) & + ((480 << EPDC_TCE_TIMING2_GDCLK_HP_OFFSET) & EPDC_TCE_TIMING2_GDCLK_HP_MASK) - | ((epdc_mode->gdsp_offs << EPDC_TCE_TIMING2_GDSP_OFFSET_OFFSET) & + | ((20 << EPDC_TCE_TIMING2_GDSP_OFFSET_OFFSET) & EPDC_TCE_TIMING2_GDSP_OFFSET_MASK); __raw_writel(reg_val, EPDC_TCE_TIMING2); /* EPDC_TCE_TIMING3 */ reg_val = - ((epdc_mode->gdoe_offs << EPDC_TCE_TIMING3_GDOE_OFFSET_OFFSET) & + ((0 << EPDC_TCE_TIMING3_GDOE_OFFSET_OFFSET) & EPDC_TCE_TIMING3_GDOE_OFFSET_MASK) - | ((epdc_mode->gdclk_offs << EPDC_TCE_TIMING3_GDCLK_OFFSET_OFFSET) & + | ((1 << EPDC_TCE_TIMING3_GDCLK_OFFSET_OFFSET) & EPDC_TCE_TIMING3_GDCLK_OFFSET_MASK); __raw_writel(reg_val, EPDC_TCE_TIMING3); @@ -695,14 +769,10 @@ void epdc_init_settings(struct mxc_epdc_fb_data *fb_data) * SDDO_INVERT = DISABLED * PIXELS_PER_CE = display horizontal resolution */ - num_ce = epdc_mode->num_ce; - if (num_ce == 0) - num_ce = 1; reg_val = EPDC_TCE_SDCFG_SDCLK_HOLD | EPDC_TCE_SDCFG_SDSHR - | ((num_ce << EPDC_TCE_SDCFG_NUM_CE_OFFSET) & - EPDC_TCE_SDCFG_NUM_CE_MASK) + | ((1 << EPDC_TCE_SDCFG_NUM_CE_OFFSET) & EPDC_TCE_SDCFG_NUM_CE_MASK) | EPDC_TCE_SDCFG_SDDO_REFORMAT_FLIP_PIXELS - | ((epdc_mode->vmode->xres/num_ce << EPDC_TCE_SDCFG_PIXELS_PER_CE_OFFSET) & + | ((pentry->x_res << EPDC_TCE_SDCFG_PIXELS_PER_CE_OFFSET) & EPDC_TCE_SDCFG_PIXELS_PER_CE_MASK); __raw_writel(reg_val, EPDC_TCE_SDCFG); @@ -760,10 +830,6 @@ static void epdc_powerup(struct mxc_epdc_fb_data *fb_data) dev_dbg(fb_data->dev, "EPDC Powerup\n"); - /* Enable pins used by EPDC */ - if (fb_data->pdata->enable_pins) - fb_data->pdata->enable_pins(); - /* Enable clocks to EPDC */ clk_enable(fb_data->epdc_clk_axi); clk_enable(fb_data->epdc_clk_pix); @@ -803,10 +869,6 @@ static void epdc_powerdown(struct mxc_epdc_fb_data *fb_data) clk_disable(fb_data->epdc_clk_pix); clk_disable(fb_data->epdc_clk_axi); - /* Disable pins used by EPDC (to prevent leakage current) */ - if (fb_data->pdata->disable_pins) - fb_data->pdata->disable_pins(); - fb_data->power_state = POWER_STATE_OFF; fb_data->powering_down = false; @@ -1013,7 +1075,7 @@ static int mxc_epdc_fb_set_par(struct fb_info *info) break; } } - pxp_conf->s0_param.width = screeninfo->xres_virtual; + pxp_conf->s0_param.width = screeninfo->xres; pxp_conf->s0_param.height = screeninfo->yres; pxp_conf->s0_param.color_key = -1; pxp_conf->s0_param.color_key_enable = false; @@ -1032,24 +1094,19 @@ static int mxc_epdc_fb_set_par(struct fb_info *info) * an initialization request. */ if (!fb_data->hw_ready) { - for (i = 0; i < fb_data->pdata->num_modes; i++) { - struct fb_videomode *vmode = - fb_data->pdata->epdc_mode[i].vmode; - /* Check resolution for a match - with supported panel types */ - if ((screeninfo->xres != vmode->xres) || - (screeninfo->yres != vmode->yres)) + for (i = 0; i < NUM_PANELS; i++) { + /* Check resolution for a match with supported panel types */ + if ((screeninfo->xres != panel_modes[i].xres) || + (screeninfo->yres != panel_modes[i].yres)) continue; - fb_data->cur_mode = &fb_data->pdata->epdc_mode[i]; - /* Found a match - Grab timing params */ - screeninfo->left_margin = vmode->left_margin; - screeninfo->right_margin = vmode->right_margin; - screeninfo->upper_margin = vmode->upper_margin; - screeninfo->lower_margin = vmode->lower_margin; - screeninfo->hsync_len = vmode->hsync_len; - screeninfo->vsync_len = vmode->vsync_len; + screeninfo->left_margin = panel_modes[i].left_margin; + screeninfo->right_margin = panel_modes[i].right_margin; + screeninfo->upper_margin = panel_modes[i].upper_margin; + screeninfo->lower_margin = panel_modes[i].lower_margin; + screeninfo->hsync_len = panel_modes[i].hsync_len; + screeninfo->vsync_len = panel_modes[i].vsync_len; /* Initialize EPDC settings and init panel */ ret = @@ -1183,13 +1240,15 @@ static int mxc_epdc_fb_check_var(struct fb_var_screeninfo *var, switch (var->rotate) { case FB_ROTATE_UR: case FB_ROTATE_UD: - var->xres = fb_data->native_width; + var->xres = var->xres_virtual = fb_data->native_width; var->yres = fb_data->native_height; + var->yres_virtual = var->yres * 2; break; case FB_ROTATE_CW: case FB_ROTATE_CCW: - var->xres = fb_data->native_height; + var->xres = var->xres_virtual = fb_data->native_height; var->yres = fb_data->native_width; + var->yres_virtual = var->yres * 2; break; default: /* Invalid rotation value */ @@ -1198,9 +1257,6 @@ static int mxc_epdc_fb_check_var(struct fb_var_screeninfo *var, return -EINVAL; } - var->xres_virtual = ALIGN(var->xres, 32); - var->yres_virtual = ALIGN(var->yres, 128) * g_num_screens; - var->height = -1; var->width = -1; @@ -1282,7 +1338,7 @@ static int mxc_epdc_fb_send_update(struct mxcfb_update_data *upd_data, u32 offset_from_8, bytes_per_pixel; u32 post_rotation_xcoord, post_rotation_ycoord, width_pxp_blocks; u32 pxp_input_offs, pxp_output_offs, pxp_output_shift; - int x_start_offs = 0; + int adj_left, adj_top; u32 hist_stat = 0; int temp_index; bool wait_for_power = false; @@ -1384,7 +1440,7 @@ static int mxc_epdc_fb_send_update(struct mxcfb_update_data *upd_data, src_width = upd_data->alt_buffer_data.width; src_upd_region = &upd_data->alt_buffer_data.alt_update_region; } else { - src_width = fb_data->info.var.xres_virtual; + src_width = fb_data->info.var.xres; src_upd_region = screen_upd_region; } @@ -1411,21 +1467,11 @@ static int mxc_epdc_fb_send_update(struct mxcfb_update_data *upd_data, pxp_upd_region.left = 0; } - /* - * We want PxP processing region to start at the first pixel - * that we have to process in each row, but PxP alignment - * restricts the input mem address to be 32-bit aligned - * - * We work around this by using x_start_offs to offset - * to offset from our starting pixel location to the - * first pixel that is in the relevant update region - * for each row. - */ - x_start_offs = pxp_upd_region.left & 0x7; - /* Update region to meet 8x8 pixel requirement */ - pxp_upd_region.width = ALIGN(src_upd_region->width, 8); - pxp_upd_region.height = ALIGN(src_upd_region->height, 8); + adj_left = pxp_upd_region.left & 0x7; + adj_top = pxp_upd_region.top & 0x7; + pxp_upd_region.width = ALIGN(src_upd_region->width + adj_left, 8); + pxp_upd_region.height = ALIGN(src_upd_region->height + adj_top, 8); pxp_upd_region.top &= ~0x7; pxp_upd_region.left &= ~0x7; @@ -1484,8 +1530,7 @@ static int mxc_epdc_fb_send_update(struct mxcfb_update_data *upd_data, mutex_lock(&fb_data->pxp_mutex); /* This is a blocking call, so upon return PxP tx should be done */ - ret = pxp_process_update(fb_data, &pxp_upd_region, - x_start_offs); + ret = pxp_process_update(fb_data, &pxp_upd_region); if (ret) { dev_err(fb_data->dev, "Unable to submit PxP update task.\n"); mutex_unlock(&fb_data->pxp_mutex); @@ -1644,97 +1689,52 @@ static int mxc_epdc_fb_wait_update_complete(u32 update_marker, return 0; } -static int mxc_epdc_fb_set_pwrdown_delay(u32 pwrdown_delay, - struct fb_info *info) -{ - struct mxc_epdc_fb_data *fb_data = (struct mxc_epdc_fb_data *)info; - - fb_data->pwrdown_delay = pwrdown_delay; - - return 0; -} - static int mxc_epdc_fb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) { void __user *argp = (void __user *)arg; + struct mxc_epdc_fb_data *fb_data = (struct mxc_epdc_fb_data *)info; + struct mxcfb_waveform_modes modes; + int temperature; + u32 auto_mode = 0; + struct mxcfb_update_data upd_data; + u32 update_marker = 0; int ret = -EINVAL; switch (cmd) { case MXCFB_SET_WAVEFORM_MODES: - { - struct mxcfb_waveform_modes modes; - struct mxc_epdc_fb_data *fb_data = - (struct mxc_epdc_fb_data *)info; - if (!copy_from_user(&modes, argp, sizeof(modes))) { - memcpy(&fb_data->wv_modes, &modes, - sizeof(modes)); - ret = 0; - } - break; + if (!copy_from_user(&modes, argp, sizeof(modes))) { + memcpy(&fb_data->wv_modes, &modes, sizeof(modes)); + ret = 0; } + break; case MXCFB_SET_TEMPERATURE: - { - int temperature; - if (!get_user(temperature, (int32_t __user *) arg)) - ret = - mxc_epdc_fb_set_temperature(temperature, - info); - break; - } + if (!get_user(temperature, (int32_t __user *) arg)) + ret = + mxc_epdc_fb_set_temperature(temperature, + info); + break; case MXCFB_SET_AUTO_UPDATE_MODE: - { - u32 auto_mode = 0; - if (!get_user(auto_mode, (__u32 __user *) arg)) - ret = - mxc_epdc_fb_set_auto_update(auto_mode, - info); - break; - } + if (!get_user(auto_mode, (__u32 __user *) arg)) + ret = + mxc_epdc_fb_set_auto_update(auto_mode, info); + break; case MXCFB_SEND_UPDATE: - { - struct mxcfb_update_data upd_data; - if (!copy_from_user(&upd_data, argp, - sizeof(upd_data))) { - ret = mxc_epdc_fb_send_update(&upd_data, info); - if (ret == 0 && copy_to_user(argp, &upd_data, - sizeof(upd_data))) - ret = -EFAULT; - } else { + if (!copy_from_user(&upd_data, argp, sizeof(upd_data))) { + ret = mxc_epdc_fb_send_update(&upd_data, info); + if (ret == 0 && copy_to_user(argp, &upd_data, sizeof(upd_data))) ret = -EFAULT; - } - - break; - } - case MXCFB_WAIT_FOR_UPDATE_COMPLETE: - { - u32 update_marker = 0; - if (!get_user(update_marker, (__u32 __user *) arg)) - ret = - mxc_epdc_fb_wait_update_complete(update_marker, - info); - break; - } - - case MXCFB_SET_PWRDOWN_DELAY: - { - int delay = 0; - if (!get_user(delay, (__u32 __user *) arg)) - ret = - mxc_epdc_fb_set_pwrdown_delay(delay, info); - break; + } else { + ret = -EFAULT; } - case MXCFB_GET_PWRDOWN_DELAY: - { - struct mxc_epdc_fb_data *fb_data = - (struct mxc_epdc_fb_data *)info; - if (put_user(fb_data->pwrdown_delay, - (int __user *)argp)) - ret = -EFAULT; - ret = 0; - break; - } + break; + case MXCFB_WAIT_FOR_UPDATE_COMPLETE: + if (!get_user(update_marker, (__u32 __user *) arg)) + ret = + mxc_epdc_fb_wait_update_complete(update_marker, + info); + break; default: break; } @@ -1833,6 +1833,10 @@ static int mxc_epdc_fb_blank(int blank, struct fb_info *info) case FB_BLANK_NORMAL: mxc_epdc_fb_disable(fb_data); break; + case FB_BLANK_UNBLANK: + epdc_powerup(fb_data); + mxc_epdc_fb_set_par(info); + break; } return 0; } @@ -1841,6 +1845,8 @@ static int mxc_epdc_fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) { struct mxc_epdc_fb_data *fb_data = (struct mxc_epdc_fb_data *)info; + struct mxcfb_update_data update; + int ret = 0; u_int y_bottom; dev_dbg(info->device, "%s: var->xoffset %d, info->var.xoffset %d\n", @@ -1867,6 +1873,25 @@ static int mxc_epdc_fb_pan_display(struct fb_var_screeninfo *var, fb_data->fb_offset = (var->yoffset * var->xres_virtual + var->xoffset) * (var->bits_per_pixel) / 8; + /* Update to new view of FB */ + update.update_region.left = 0; + update.update_region.width = fb_data->info.var.xres; + update.update_region.top = 0; + update.update_region.height = fb_data->info.var.yres; + update.waveform_mode = WAVEFORM_MODE_AUTO; + update.update_mode = UPDATE_MODE_FULL; + update.update_marker = PAN_UPDATE_MARKER; + update.temp = TEMP_USE_AMBIENT; + update.use_alt_buffer = false; + + mxc_epdc_fb_send_update(&update, &fb_data->info); + + /* Block on initial update */ + ret = mxc_epdc_fb_wait_update_complete(update.update_marker, info); + if (ret < 0) + dev_err(fb_data->dev, + "Wait for update complete failed. Error = 0x%x", ret); + info->var.xoffset = var->xoffset; info->var.yoffset = var->yoffset; @@ -1875,7 +1900,7 @@ static int mxc_epdc_fb_pan_display(struct fb_var_screeninfo *var, else info->var.vmode &= ~FB_VMODE_YWRAP; - return 0; + return ret; } static struct fb_ops mxc_epdc_fb_ops = { @@ -1893,15 +1918,14 @@ static struct fb_ops mxc_epdc_fb_ops = { }; static struct fb_deferred_io mxc_epdc_fb_defio = { - .delay = HZ, + .delay = HZ / 2, .deferred_io = mxc_epdc_fb_deferred_io, }; static void epdc_done_work_func(struct work_struct *work) { struct mxc_epdc_fb_data *fb_data = - container_of(work, struct mxc_epdc_fb_data, - epdc_done_work.work); + container_of(work, struct mxc_epdc_fb_data, epdc_done_work); epdc_powerdown(fb_data); } @@ -2015,17 +2039,16 @@ static irqreturn_t mxc_epdc_irq_handler(int irq, void *dev_id) (fb_data->cur_update == NULL) && !epdc_any_luts_active()) { - if (fb_data->pwrdown_delay != FB_POWERDOWN_DISABLE) { - /* - * Set variable to prevent overlapping - * enable/disable requests - */ - fb_data->powering_down = true; - - /* Schedule task to disable EPDC HW until next update */ - schedule_delayed_work(&fb_data->epdc_done_work, - msecs_to_jiffies(fb_data->pwrdown_delay)); - } +#ifndef NO_POWERDOWN + /* + * Set variable to prevent overlapping + * enable/disable requests + */ + fb_data->powering_down = true; + + /* Schedule task to disable EPDC HW until next update */ + schedule_work(&fb_data->epdc_done_work); +#endif if (fb_data->waiting_for_idle) complete(&fb_data->updates_done); @@ -2241,25 +2264,15 @@ static void draw_mode0(struct mxc_epdc_fb_data *fb_data) static int mxc_epdc_fb_init_hw(struct fb_info *info) { struct mxc_epdc_fb_data *fb_data = (struct mxc_epdc_fb_data *)info; + u32 wv_buf_size; const struct firmware *fw; - char *fw_str = "imx/epdc"; struct mxcfb_update_data update; struct mxcfb_waveform_data_file *wv_file; int wv_data_offs; int ret; int i; - /* - * Create fw search string based on ID string in selected videomode. - * Format is "imx/epdc_[panel string].fw" - */ - if (fb_data->cur_mode) { - strcat(fw_str, "_"); - strcat(fw_str, fb_data->cur_mode->vmode->name); - strcat(fw_str, ".fw"); - } - - ret = request_firmware(&fw, fw_str, fb_data->dev); + ret = request_firmware(&fw, "imx/epdc.fw", fb_data->dev); if (ret) { printk(KERN_ERR "Failed to load image imx/epdc.ihex err %d\n", ret); @@ -2280,20 +2293,20 @@ static int mxc_epdc_fb_init_hw(struct fb_info *info) /* Get offset and size for waveform data */ wv_data_offs = sizeof(wv_file->wdh) + fb_data->trt_entries + 1; - fb_data->waveform_buffer_size = fw->size - wv_data_offs; + wv_buf_size = fw->size - wv_data_offs; /* Allocate memory for waveform data */ - fb_data->waveform_buffer_virt = dma_alloc_coherent(fb_data->dev, - fb_data->waveform_buffer_size, - &fb_data->waveform_buffer_phys, - GFP_DMA); + fb_data->waveform_buffer_virt = dma_alloc_coherent(fb_data->dev, wv_buf_size, + &fb_data->waveform_buffer_phys, + GFP_DMA); if (fb_data->waveform_buffer_virt == NULL) { dev_err(fb_data->dev, "Can't allocate mem for waveform!\n"); ret = -ENOMEM; } - memcpy(fb_data->waveform_buffer_virt, (u8 *)(fw->data) + wv_data_offs, - fb_data->waveform_buffer_size); + memcpy(fb_data->waveform_buffer_virt, (u8 *)(fw->data) + wv_data_offs, wv_buf_size); + check_waveform((u32 *)(fw->data + wv_data_offs), + fb_data->waveform_buffer_virt, wv_buf_size / 4); release_firmware(fw); @@ -2302,7 +2315,7 @@ static int mxc_epdc_fb_init_hw(struct fb_info *info) /* Enable pix clk for EPDC */ clk_enable(fb_data->epdc_clk_pix); - clk_set_rate(fb_data->epdc_clk_pix, fb_data->cur_mode->vmode->pixclock); + clk_set_rate(fb_data->epdc_clk_pix, 17700000); epdc_init_sequence(fb_data); @@ -2373,23 +2386,14 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev) struct mxc_epdc_fb_data *fb_data; struct resource *res; struct fb_info *info; - char *options, *opt; - char *panel_str = NULL; - char name[] = "mxcepdcfb"; - struct fb_videomode *vmode; - int xres_virt, yres_virt, buf_size; - struct fb_var_screeninfo *var_info; - struct fb_fix_screeninfo *fix_info; + struct mxc_epdc_platform_fb_data *pdata; + struct mxc_epdc_platform_fb_entry *pentry; struct pxp_config_data *pxp_conf; struct pxp_proc_data *proc_data; struct scatterlist *sg; struct update_data_list *upd_list; struct update_data_list *plist, *temp_list; int i; - unsigned long x_mem_size = 0; -#ifdef CONFIG_FRAMEBUFFER_CONSOLE - struct mxcfb_update_data update; -#endif fb_data = (struct mxc_epdc_fb_data *)framebuffer_alloc( sizeof(struct mxc_epdc_fb_data), &pdev->dev); @@ -2398,54 +2402,10 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev) goto out; } - /* Get platform data and check validity */ - fb_data->pdata = pdev->dev.platform_data; - if ((fb_data->pdata == NULL) || (fb_data->pdata->num_modes < 1) - || (fb_data->pdata->epdc_mode == NULL) - || (fb_data->pdata->epdc_mode->vmode == NULL)) { - ret = -EINVAL; - goto out_fbdata; - } - - if (fb_get_options(name, &options)) { - ret = -ENODEV; - goto out_fbdata; - } - - if (options) - while ((opt = strsep(&options, ",")) != NULL) { - if (!*opt) - continue; - - if (!strncmp(opt, "bpp=", 4)) - fb_data->default_bpp = - simple_strtoul(opt + 4, NULL, 0); - else if (!strncmp(opt, "x_mem=", 6)) - x_mem_size = - simple_strtoul(opt + 6, NULL, 0); - else - panel_str = opt; - } - fb_data->dev = &pdev->dev; - - if (!fb_data->default_bpp) - fb_data->default_bpp = 16; - - /* Set default (first defined mode) before searching for a match */ - fb_data->cur_mode = &fb_data->pdata->epdc_mode[0]; - - if (panel_str) - for (i = 0; i < fb_data->pdata->num_modes; i++) - if (!strcmp(fb_data->pdata->epdc_mode[i].vmode->name, - panel_str)) { - fb_data->cur_mode = - &fb_data->pdata->epdc_mode[i]; - break; - } - - vmode = fb_data->cur_mode->vmode; - + /* We want to use hard-coded structure defined in this file */ + pentry = &ed060sc4_fb_entry; + fb_data->cur = pentry; platform_set_drvdata(pdev, fb_data); info = &fb_data->info; @@ -2454,24 +2414,12 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev) if (ret) goto out_fbdata; - dev_dbg(&pdev->dev, "resolution %dx%d, bpp %d\n", - fb_data->cur_mode->vmode->xres, - fb_data->cur_mode->vmode->yres, fb_data->default_bpp); - - /* - * GPU alignment restrictions dictate framebuffer parameters: - * - 32-byte alignment for buffer width - * - 128-byte alignment for buffer height - * => 4K buffer alignment for buffer start - */ - xres_virt = ALIGN(vmode->xres, 32); - yres_virt = ALIGN(vmode->yres, 128); - buf_size = xres_virt * yres_virt * fb_data->default_bpp/8; + dev_dbg(&pdev->dev, "resolution %dx%d, bpp %d\n", pentry->x_res, + pentry->y_res, pentry->bpp); - if (x_mem_size > 0) - g_num_screens = NUM_SCREENS_X; + fb_data->mem_size = pentry->x_res * pentry->y_res * pentry->bpp/8; - fb_data->map_size = PAGE_ALIGN(buf_size) * g_num_screens; + fb_data->map_size = PAGE_ALIGN(fb_data->mem_size) * NUM_SCREENS; dev_dbg(&pdev->dev, "memory to allocate: %d\n", fb_data->map_size); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -2499,69 +2447,49 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev) dev_dbg(&pdev->dev, "allocated at %p:0x%x\n", info->screen_base, fb_data->phys_start); - var_info = &info->var; - - var_info->activate = FB_ACTIVATE_TEST; - var_info->bits_per_pixel = fb_data->default_bpp; - var_info->xres = vmode->xres; - var_info->yres = vmode->yres; - var_info->xres_virtual = xres_virt; - /* Additional screens allow for panning and buffer flipping */ - var_info->yres_virtual = yres_virt * g_num_screens; - - var_info->pixclock = vmode->pixclock; - var_info->left_margin = vmode->left_margin; - var_info->right_margin = vmode->right_margin; - var_info->upper_margin = vmode->upper_margin; - var_info->lower_margin = vmode->lower_margin; - var_info->hsync_len = vmode->hsync_len; - var_info->vsync_len = vmode->vsync_len; - var_info->vmode = FB_VMODE_NONINTERLACED; - - switch (fb_data->default_bpp) { + mxc_epdc_fb_default.bits_per_pixel = pentry->bpp; + mxc_epdc_fb_default.xres = pentry->x_res; + mxc_epdc_fb_default.yres = pentry->y_res; + mxc_epdc_fb_default.xres_virtual = pentry->x_res; + mxc_epdc_fb_default.yres_virtual = pentry->y_res * 2; /* FB doubled in virtual space */ + + mxc_epdc_fb_fix.smem_start = fb_data->phys_start; + mxc_epdc_fb_fix.smem_len = mxc_epdc_fb_default.yres_virtual + * pentry->x_res * 2 * pentry->bpp / 8; + mxc_epdc_fb_fix.ypanstep = 0; + + switch (pentry->bpp) { case 32: case 24: - var_info->red.offset = 16; - var_info->red.length = 8; - var_info->green.offset = 8; - var_info->green.length = 8; - var_info->blue.offset = 0; - var_info->blue.length = 8; + mxc_epdc_fb_default.red.offset = 16; + mxc_epdc_fb_default.red.length = 8; + mxc_epdc_fb_default.green.offset = 8; + mxc_epdc_fb_default.green.length = 8; + mxc_epdc_fb_default.blue.offset = 0; + mxc_epdc_fb_default.blue.length = 8; break; case 16: - var_info->red.offset = 11; - var_info->red.length = 5; - var_info->green.offset = 5; - var_info->green.length = 6; - var_info->blue.offset = 0; - var_info->blue.length = 5; + mxc_epdc_fb_default.red.offset = 11; + mxc_epdc_fb_default.red.length = 5; + mxc_epdc_fb_default.green.offset = 5; + mxc_epdc_fb_default.green.length = 6; + mxc_epdc_fb_default.blue.offset = 0; + mxc_epdc_fb_default.blue.length = 5; break; default: - dev_err(&pdev->dev, "unsupported bitwidth %d\n", - fb_data->default_bpp); + dev_err(&pdev->dev, "unsupported bitwidth %d\n", pentry->bpp); ret = -EINVAL; goto out_dma_fb; } - fix_info = &info->fix; - - strcpy(fix_info->id, "mxc_epdc_fb"); - fix_info->type = FB_TYPE_PACKED_PIXELS; - fix_info->visual = FB_VISUAL_TRUECOLOR; - fix_info->xpanstep = 0; - fix_info->ypanstep = 0; - fix_info->ywrapstep = 0; - fix_info->accel = FB_ACCEL_NONE; - fix_info->smem_start = fb_data->phys_start; - fix_info->smem_len = fb_data->map_size; - fix_info->ypanstep = 0; - - fb_data->native_width = vmode->xres; - fb_data->native_height = vmode->yres; + fb_data->native_width = pentry->x_res; + fb_data->native_height = pentry->y_res; info->fbops = &mxc_epdc_fb_ops; + info->var = mxc_epdc_fb_default; + info->fix = mxc_epdc_fb_fix; info->var.activate = FB_ACTIVATE_NOW; info->pseudo_palette = fb_data->pseudo_palette; info->screen_size = info->fix.smem_len; @@ -2633,7 +2561,7 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev) upd_list->size, upd_list->phys_addr); } - fb_data->working_buffer_size = vmode->yres * vmode->xres * 2; + fb_data->working_buffer_size = pentry->y_res * pentry->x_res * 2; /* Allocate memory for EPDC working buffer */ fb_data->working_buffer_virt = dma_alloc_coherent(&pdev->dev, fb_data->working_buffer_size, @@ -2644,13 +2572,11 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev) goto out_upd_buffers; } - /* Initialize EPDC pins */ - if (fb_data->pdata->get_pins) - fb_data->pdata->get_pins(); - fb_data->epdc_clk_axi = clk_get(fb_data->dev, "epdc_axi"); fb_data->epdc_clk_pix = clk_get(fb_data->dev, "epdc_pix"); + clk_set_rate(fb_data->epdc_clk_axi, 200000000); + fb_data->in_init = false; fb_data->hw_ready = false; @@ -2691,11 +2617,10 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev) if (ret) { dev_err(&pdev->dev, "request_irq (%d) failed with error %d\n", fb_data->epdc_irq, ret); - ret = -ENODEV; goto out_dma_work_buf; } - INIT_DELAYED_WORK(&fb_data->epdc_done_work, epdc_done_work_func); + INIT_WORK(&fb_data->epdc_done_work, epdc_done_work_func); info->fbdefio = &mxc_epdc_fb_defio; #ifdef CONFIG_FB_MXC_EINK_AUTO_UPDATE_MODE @@ -2706,17 +2631,15 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev) fb_data->display_regulator = regulator_get(NULL, "DISPLAY"); if (IS_ERR(fb_data->display_regulator)) { dev_err(&pdev->dev, "Unable to get display PMIC regulator." - "err = 0x%x\n", (int)fb_data->display_regulator); - ret = -ENODEV; - goto out_irq; + "err = 0x%x\n", fb_data->display_regulator); + goto out_dma_work_buf; } fb_data->vcom_regulator = regulator_get(NULL, "VCOM"); if (IS_ERR(fb_data->vcom_regulator)) { regulator_put(fb_data->display_regulator); dev_err(&pdev->dev, "Unable to get VCOM regulator." - "err = 0x%x\n", (int)fb_data->vcom_regulator); - ret = -ENODEV; - goto out_irq; + "err = 0x%x\n", fb_data->vcom_regulator); + goto out_dma_work_buf; } if (device_create_file(info->dev, &fb_attrs[0])) @@ -2763,7 +2686,7 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev) * Parameters should match FB format/width/height */ pxp_conf->s0_param.pixel_fmt = PXP_PIX_FMT_RGB565; - pxp_conf->s0_param.width = fb_data->info.var.xres_virtual; + pxp_conf->s0_param.width = fb_data->info.var.xres; pxp_conf->s0_param.height = fb_data->info.var.yres; pxp_conf->s0_param.color_key = -1; pxp_conf->s0_param.color_key_enable = false; @@ -2772,7 +2695,7 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev) * Initialize OL0 channel parameters * No overlay will be used for PxP operation */ - for (i = 0; i < 8; i++) { + for (i = 0; i < 8; i++) { pxp_conf->ol_param[i].combine_enable = false; pxp_conf->ol_param[i].width = 0; pxp_conf->ol_param[i].height = 0; @@ -2816,54 +2739,33 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev) fb_data->blank = FB_BLANK_UNBLANK; fb_data->power_state = POWER_STATE_OFF; fb_data->powering_down = false; - fb_data->pwrdown_delay = 0; /* Register FB */ ret = register_framebuffer(info); if (ret) { dev_err(&pdev->dev, "register_framebuffer failed with error %d\n", ret); - goto out_dmaengine; + goto out_irq; } #ifdef DEFAULT_PANEL_HW_INIT ret = mxc_epdc_fb_init_hw((struct fb_info *)fb_data); if (ret) { - dev_err(&pdev->dev, "Failed to initialize HW!\n"); + dev_err(&pdev->dev, "Failed to read firmware!\n"); + goto out_dmaengine; } #endif -#ifdef CONFIG_FRAMEBUFFER_CONSOLE - /* If FB console included, update display to show logo */ - update.update_region.left = 0; - update.update_region.width = info->var.xres; - update.update_region.top = 0; - update.update_region.height = info->var.yres; - update.update_mode = UPDATE_MODE_PARTIAL; - update.waveform_mode = WAVEFORM_MODE_AUTO; - update.update_marker = INIT_UPDATE_MARKER; - update.temp = TEMP_USE_AMBIENT; - update.use_alt_buffer = false; - - mxc_epdc_fb_send_update(&update, info); - - ret = mxc_epdc_fb_wait_update_complete(update.update_marker, info); - if (ret < 0) - dev_err(fb_data->dev, - "Wait for update complete failed. Error = 0x%x", ret); -#endif - goto out; out_dmaengine: dmaengine_put(); + unregister_framebuffer(&fb_data->info); out_irq: free_irq(fb_data->epdc_irq, fb_data); out_dma_work_buf: - dma_free_writecombine(&pdev->dev, fb_data->working_buffer_size, + dma_free_writecombine(&pdev->dev, pentry->y_res * pentry->x_res / 2, fb_data->working_buffer_virt, fb_data->working_buffer_phys); - if (fb_data->pdata->put_pins) - fb_data->pdata->put_pins(); out_upd_buffers: list_for_each_entry_safe(plist, temp_list, &fb_data->upd_buf_free_list->list, list) { list_del(&plist->list); @@ -2898,29 +2800,19 @@ static int mxc_epdc_fb_remove(struct platform_device *pdev) unregister_framebuffer(&fb_data->info); free_irq(fb_data->epdc_irq, fb_data); - dma_free_writecombine(&pdev->dev, fb_data->working_buffer_size, - fb_data->working_buffer_virt, - fb_data->working_buffer_phys); - if (fb_data->waveform_buffer_virt != NULL) - dma_free_writecombine(&pdev->dev, fb_data->waveform_buffer_size, - fb_data->waveform_buffer_virt, - fb_data->waveform_buffer_phys); + dma_free_writecombine(&pdev->dev, fb_data->working_buffer_size, fb_data->working_buffer_virt, + fb_data->working_buffer_phys); + dma_free_writecombine(&pdev->dev, fb_data->waveform_buffer_size, fb_data->waveform_buffer_virt, + fb_data->waveform_buffer_phys); list_for_each_entry_safe(plist, temp_list, &fb_data->upd_buf_free_list->list, list) { list_del(&plist->list); dma_free_writecombine(&pdev->dev, plist->size, plist->virt_addr, plist->phys_addr); kfree(plist); } -#ifdef CONFIG_FB_MXC_EINK_AUTO_UPDATE_MODE - fb_deferred_io_cleanup(&fb_data->info); -#endif - dma_free_writecombine(&pdev->dev, fb_data->map_size, fb_data->info.screen_base, fb_data->phys_start); - if (fb_data->pdata->put_pins) - fb_data->pdata->put_pins(); - /* Release PxP-related resources */ if (fb_data->pxp_chan != NULL) dma_release_channel(&fb_data->pxp_chan->dma_chan); @@ -3011,6 +2903,8 @@ static int pxp_chan_init(struct mxc_epdc_fb_data *fb_data) fb_data->pxp_chan = to_pxp_channel(chan); + dev_dbg(fb_data->dev, "dma_chan = 0x%x\n", fb_data->pxp_chan->dma_chan); + fb_data->pxp_chan->client = fb_data; init_completion(&fb_data->pxp_tx_cmpl); @@ -3024,8 +2918,7 @@ static int pxp_chan_init(struct mxc_epdc_fb_data *fb_data) * Note: This is a blocking call, so upon return the PxP tx should be complete. */ static int pxp_process_update(struct mxc_epdc_fb_data *fb_data, - struct mxcfb_rect *update_region, - int x_start_offs) + struct mxcfb_rect *update_region) { dma_cookie_t cookie; struct scatterlist *sg = fb_data->sg; @@ -3035,7 +2928,6 @@ static int pxp_process_update(struct mxc_epdc_fb_data *fb_data, struct pxp_config_data *pxp_conf = &fb_data->pxp_conf; struct pxp_proc_data *proc_data = &fb_data->pxp_conf.proc_data; int i, ret; - int length; dev_dbg(fb_data->dev, "Starting PxP Send Buffer\n"); @@ -3086,7 +2978,7 @@ static int pxp_process_update(struct mxc_epdc_fb_data *fb_data, * probe() and should not need to be changed. */ proc_data->srect.top = update_region->top; - proc_data->srect.left = update_region->left + x_start_offs; + proc_data->srect.left = update_region->left; proc_data->srect.width = update_region->width; proc_data->srect.height = update_region->height; @@ -3108,7 +3000,7 @@ static int pxp_process_update(struct mxc_epdc_fb_data *fb_data, pxp_conf->out_param.height = update_region->height; desc = to_tx_desc(txd); - length = desc->len; + int length = desc->len; for (i = 0; i < length; i++) { if (i == 0) {/* S0 */ memcpy(&desc->proc_data, proc_data, sizeof(struct pxp_proc_data)); diff --git a/drivers/video/mxc/mxc_ipuv3_fb.c b/drivers/video/mxc/mxc_ipuv3_fb.c index cc48e62637ca..be907a956365 100644 --- a/drivers/video/mxc/mxc_ipuv3_fb.c +++ b/drivers/video/mxc/mxc_ipuv3_fb.c @@ -43,7 +43,6 @@ #include <linux/io.h> #include <linux/ipu.h> #include <linux/mxcfb.h> -#include <linux/earlysuspend.h> #include <asm/mach-types.h> #include <asm/uaccess.h> #include <mach/hardware.h> @@ -101,10 +100,9 @@ enum { BOTH_OFF }; -#define FB_DEVICE_NUM 3 static bool g_dp_in_use; LIST_HEAD(fb_alloc_list); -static struct fb_info *mxcfb_info[FB_DEVICE_NUM]; +static struct fb_info *mxcfb_info[3]; static uint32_t bpp_to_pixfmt(struct fb_info *fbi) { @@ -172,11 +170,12 @@ static int _setup_disp_channel1(struct fb_info *fbi) for (i = 0; i < num_registered_fb; i++) { mxc_fbi_tmp = (struct mxcfb_info *) - (registered_fb[i]->par); + (registered_fb[i]->par); if (mxc_fbi_tmp->ipu_ch == MEM_BG_SYNC) { - fbi->var.vmode = registered_fb[i]->var.vmode; + fbi->var.vmode = + registered_fb[i]->var.vmode; mxc_fbi->ipu_di_pix_fmt = - mxc_fbi_tmp->ipu_di_pix_fmt; + mxc_fbi_tmp->ipu_di_pix_fmt; break; } } @@ -233,7 +232,7 @@ static int _setup_disp_channel2(struct fb_info *fbi) } mxc_fbi->cur_ipu_buf = 1; - sema_init(&mxc_fbi->flip_sem, 0); + sema_init(&mxc_fbi->flip_sem, 1); if (mxc_fbi->alpha_chan_en) { mxc_fbi->cur_ipu_alpha_buf = 1; sema_init(&mxc_fbi->alpha_flip_sem, 1); @@ -247,7 +246,8 @@ static int _setup_disp_channel2(struct fb_info *fbi) IPU_ROTATE_NONE, fbi->fix.smem_start + (fbi->fix.line_length * fbi->var.yres), - fbi->fix.smem_start, 0, 0); + fbi->fix.smem_start, + 0, 0); if (retval) { dev_err(fbi->device, "ipu_init_channel_buffer error %d\n", retval); @@ -317,36 +317,30 @@ static int mxcfb_set_par(struct fb_info *fbi) mxc_fbi->alpha_phy_addr1); mxc_fbi->alpha_virt_addr0 = - dma_alloc_coherent(fbi->device, - alpha_mem_len, - &mxc_fbi->alpha_phy_addr0, - GFP_DMA | GFP_KERNEL); + dma_alloc_coherent(fbi->device, + alpha_mem_len, + &mxc_fbi->alpha_phy_addr0, + GFP_DMA | GFP_KERNEL); mxc_fbi->alpha_virt_addr1 = - dma_alloc_coherent(fbi->device, - alpha_mem_len, - &mxc_fbi->alpha_phy_addr1, - GFP_DMA | GFP_KERNEL); + dma_alloc_coherent(fbi->device, + alpha_mem_len, + &mxc_fbi->alpha_phy_addr1, + GFP_DMA | GFP_KERNEL); if (mxc_fbi->alpha_virt_addr0 == NULL || mxc_fbi->alpha_virt_addr1 == NULL) { dev_err(fbi->device, "mxcfb: dma alloc for" " alpha buffer failed.\n"); if (mxc_fbi->alpha_virt_addr0) dma_free_coherent(fbi->device, - mxc_fbi-> - alpha_mem_len, - mxc_fbi-> - alpha_virt_addr0, - mxc_fbi-> - alpha_phy_addr0); + mxc_fbi->alpha_mem_len, + mxc_fbi->alpha_virt_addr0, + mxc_fbi->alpha_phy_addr0); if (mxc_fbi->alpha_virt_addr1) dma_free_coherent(fbi->device, - mxc_fbi-> - alpha_mem_len, - mxc_fbi-> - alpha_virt_addr1, - mxc_fbi-> - alpha_phy_addr1); + mxc_fbi->alpha_mem_len, + mxc_fbi->alpha_virt_addr1, + mxc_fbi->alpha_phy_addr1); return -ENOMEM; } mxc_fbi->alpha_mem_len = alpha_mem_len; @@ -374,7 +368,7 @@ static int mxcfb_set_par(struct fb_info *fbi) else out_pixel_fmt = IPU_PIX_FMT_RGB666; } - if (fbi->var.vmode & FB_VMODE_ODD_FLD_FIRST) /* PAL */ + if (fbi->var.vmode & FB_VMODE_ODD_FLD_FIRST) /* PAL */ sig_cfg.odd_field_first = true; if ((fbi->var.sync & FB_SYNC_EXT) || mxc_fbi->ipu_ext_clk) sig_cfg.ext_clk = true; @@ -482,7 +476,8 @@ static int swap_channels(struct fb_info *fbi) ch_to = MEM_BG_SYNC; for (i = 0; i < num_registered_fb; i++) { - mxc_fbi_to = (struct mxcfb_info *)mxcfb_info[i]->par; + mxc_fbi_to = + (struct mxcfb_info *)mxcfb_info[i]->par; if (mxc_fbi_to->ipu_ch == ch_to) { fbi_to = mxcfb_info[i]; break; @@ -547,14 +542,14 @@ static int swap_channels(struct fb_info *fbi) } if (ipu_request_irq(mxc_fbi_from->ipu_ch_irq, mxcfb_irq_handler, 0, - MXCFB_NAME, fbi) != 0) { + MXCFB_NAME, fbi) != 0) { dev_err(fbi->device, "Error registering irq %d\n", mxc_fbi_from->ipu_ch_irq); return -EBUSY; } ipu_disable_irq(mxc_fbi_from->ipu_ch_irq); if (ipu_request_irq(mxc_fbi_to->ipu_ch_irq, mxcfb_irq_handler, 0, - MXCFB_NAME, fbi_to) != 0) { + MXCFB_NAME, fbi_to) != 0) { dev_err(fbi_to->device, "Error registering irq %d\n", mxc_fbi_to->ipu_ch_irq); return -EBUSY; @@ -577,35 +572,6 @@ static int mxcfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) u32 vtotal; u32 htotal; - /* fg should not bigger than bg */ - if (mxc_fbi->ipu_ch == MEM_FG_SYNC) { - struct fb_info *fbi_tmp; - struct mxcfb_info *mxc_fbi_tmp; - int i, bg_xres, bg_yres; - int16_t pos_x, pos_y; - - bg_xres = var->xres; - bg_yres = var->yres; - - for (i = 0; i < num_registered_fb; i++) { - fbi_tmp = registered_fb[i]; - mxc_fbi_tmp = (struct mxcfb_info *) - (fbi_tmp->par); - if (mxc_fbi_tmp->ipu_ch == MEM_BG_SYNC) { - bg_xres = fbi_tmp->var.xres; - bg_yres = fbi_tmp->var.yres; - break; - } - } - - ipu_disp_get_window_pos(mxc_fbi->ipu_ch, &pos_x, &pos_y); - - if ((var->xres + pos_x) > bg_xres) - var->xres = bg_xres - pos_x; - if ((var->yres + pos_y) > bg_yres) - var->yres = bg_yres - pos_y; - } - if (var->xres_virtual < var->xres) var->xres_virtual = var->xres; if (var->yres_virtual < var->yres) @@ -782,7 +748,7 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) } if (ipu_disp_set_global_alpha(mxc_fbi->ipu_ch, - (bool) ga.enable, + (bool)ga.enable, ga.alpha)) { retval = -EINVAL; break; @@ -809,7 +775,7 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) } if (ipu_disp_set_global_alpha(mxc_fbi->ipu_ch, - !(bool) la.enable, 0)) { + !(bool)la.enable, 0)) { retval = -EINVAL; break; } @@ -824,11 +790,8 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) for (i = 0; i < num_registered_fb; i++) { char *idstr = registered_fb[i]->fix.id; - if (strcmp(idstr, video_plane_idstr) == - 0) { - ((struct mxcfb_info - *)(registered_fb[i]->par))-> - alpha_chan_en = false; + if (strcmp(idstr, video_plane_idstr) == 0) { + ((struct mxcfb_info *)(registered_fb[i]->par))->alpha_chan_en = false; break; } } @@ -856,8 +819,8 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) uint32_t ipu_alp_ch_irq; if (!(((mxc_fbi->ipu_ch == MEM_FG_SYNC) || - (mxc_fbi->ipu_ch == MEM_BG_SYNC)) && - (mxc_fbi->alpha_chan_en))) { + (mxc_fbi->ipu_ch == MEM_BG_SYNC)) && + (mxc_fbi->alpha_chan_en))) { dev_err(fbi->device, "Should use background or overlay " "framebuffer to set the alpha buffer " @@ -884,10 +847,11 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) down(&mxc_fbi->alpha_flip_sem); mxc_fbi->cur_ipu_alpha_buf = - !mxc_fbi->cur_ipu_alpha_buf; + !mxc_fbi->cur_ipu_alpha_buf; if (ipu_update_channel_buffer(mxc_fbi->ipu_ch, IPU_ALPHA_IN_BUFFER, - mxc_fbi->cur_ipu_alpha_buf, + mxc_fbi-> + cur_ipu_alpha_buf, base) == 0) { ipu_select_buffer(mxc_fbi->ipu_ch, IPU_ALPHA_IN_BUFFER, @@ -925,9 +889,9 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) break; } retval = ipu_disp_set_gamma_correction(mxc_fbi->ipu_ch, - gamma.enable, - gamma.constk, - gamma.slopek); + gamma.enable, + gamma.constk, + gamma.slopek); break; } case MXCFB_WAIT_FOR_VSYNC: @@ -937,8 +901,7 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) int i; for (i = 0; i < num_registered_fb; i++) { bg_mxcfbi = - ((struct mxcfb_info - *)(registered_fb[i]->par)); + ((struct mxcfb_info *)(registered_fb[i]->par)); if (bg_mxcfbi->ipu_ch == MEM_BG_SYNC) break; @@ -958,10 +921,8 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) ipu_clear_irq(mxc_fbi->ipu_ch_irq); mxc_fbi->wait4vsync = 1; ipu_enable_irq(mxc_fbi->ipu_ch_irq); - retval = - wait_for_completion_interruptible_timeout(&mxc_fbi-> - vsync_complete, - 1 * HZ); + retval = wait_for_completion_interruptible_timeout( + &mxc_fbi->vsync_complete, 1 * HZ); if (retval == 0) { dev_err(fbi->device, "MXCFB_WAIT_FOR_VSYNC: timeout %d\n", @@ -971,7 +932,6 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) } else if (retval > 0) { retval = 0; } - break; } case FBIO_ALLOC: @@ -1052,8 +1012,7 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) for (i = 0; i < num_registered_fb; i++) { bg_mxcfbi = - ((struct mxcfb_info *)(registered_fb[i]-> - par)); + ((struct mxcfb_info *)(registered_fb[i]->par)); if (bg_mxcfbi->ipu_ch == MEM_BG_SYNC) { bg_fbi = registered_fb[i]; @@ -1072,15 +1031,13 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) if (bg_fbi->var.xres < fbi->var.xres) pos.x = 0; else - pos.x = - bg_fbi->var.xres - fbi->var.xres; + pos.x = bg_fbi->var.xres - fbi->var.xres; } if (fbi->var.yres + pos.y > bg_fbi->var.yres) { if (bg_fbi->var.yres < fbi->var.yres) pos.y = 0; else - pos.y = - bg_fbi->var.yres - fbi->var.yres; + pos.y = bg_fbi->var.yres - fbi->var.yres; } retval = ipu_disp_set_window_pos(mxc_fbi->ipu_ch, @@ -1095,7 +1052,7 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) case MXCFB_GET_FB_IPU_CHAN: { struct mxcfb_info *mxc_fbi = - (struct mxcfb_info *)fbi->par; + (struct mxcfb_info *)fbi->par; if (put_user(mxc_fbi->ipu_ch, argp)) return -EFAULT; @@ -1104,7 +1061,7 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) case MXCFB_GET_DIFMT: { struct mxcfb_info *mxc_fbi = - (struct mxcfb_info *)fbi->par; + (struct mxcfb_info *)fbi->par; if (put_user(mxc_fbi->ipu_di_pix_fmt, argp)) return -EFAULT; @@ -1113,18 +1070,9 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) case MXCFB_GET_FB_IPU_DI: { struct mxcfb_info *mxc_fbi = - (struct mxcfb_info *)fbi->par; - - if (put_user(mxc_fbi->ipu_di, argp)) - return -EFAULT; - break; - } - case MXCFB_GET_FB_BLANK: - { - struct mxcfb_info *mxc_fbi = (struct mxcfb_info *)fbi->par; - if (put_user(mxc_fbi->cur_blank, argp)) + if (put_user(mxc_fbi->ipu_di, argp)) return -EFAULT; break; } @@ -1177,7 +1125,7 @@ static int mxcfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) { struct mxcfb_info *mxc_fbi = (struct mxcfb_info *)info->par, - *mxc_graphic_fbi = NULL; + *mxc_graphic_fbi = NULL; u_int y_bottom; unsigned long base, active_alpha_phy_addr = 0; bool loc_alpha_en = false; @@ -1198,7 +1146,7 @@ mxcfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) int j; for (j = 0; j < num_registered_fb; j++) { bg_mxcfbi = - ((struct mxcfb_info *)(registered_fb[j]->par)); + ((struct mxcfb_info *)(registered_fb[j]->par)); if (bg_mxcfbi->ipu_ch == MEM_BG_SYNC) break; @@ -1228,13 +1176,13 @@ mxcfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) if ((strcmp(idstr, "DISP3 BG") == 0 || strcmp(idstr, "DISP3 FG") == 0) && ((struct mxcfb_info *) - (registered_fb[i]->par))->alpha_chan_en) { + (registered_fb[i]->par))->alpha_chan_en) { loc_alpha_en = true; mxc_graphic_fbi = (struct mxcfb_info *) - (registered_fb[i]->par); + (registered_fb[i]->par); active_alpha_phy_addr = mxc_fbi->cur_ipu_buf ? - mxc_graphic_fbi->alpha_phy_addr1 : - mxc_graphic_fbi->alpha_phy_addr0; + mxc_graphic_fbi->alpha_phy_addr1 : + mxc_graphic_fbi->alpha_phy_addr0; dev_dbg(info->device, "Updating SDC graphic " "buf %d address=0x%08lX\n", mxc_fbi->cur_ipu_buf, @@ -1244,7 +1192,7 @@ mxcfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) } } - init_completion(&mxc_fbi->vsync_complete); + down(&mxc_fbi->flip_sem); mxc_fbi->cur_ipu_buf = !mxc_fbi->cur_ipu_buf; @@ -1278,7 +1226,6 @@ mxcfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) return -EBUSY; } - down(&mxc_fbi->flip_sem); dev_dbg(info->device, "Update complete\n"); info->var.xoffset = var->xoffset; @@ -1312,9 +1259,9 @@ static int mxcfb_mmap(struct fb_info *fbi, struct vm_area_struct *vma) len = fbi->fix.smem_len - offset; vma->vm_pgoff = (fbi->fix.smem_start + offset) >> PAGE_SHIFT; } else if ((vma->vm_pgoff == - (mxc_fbi->alpha_phy_addr0 >> PAGE_SHIFT)) || + (mxc_fbi->alpha_phy_addr0 >> PAGE_SHIFT)) || (vma->vm_pgoff == - (mxc_fbi->alpha_phy_addr1 >> PAGE_SHIFT))) { + (mxc_fbi->alpha_phy_addr1 >> PAGE_SHIFT))) { len = mxc_fbi->alpha_mem_len; } else { list_for_each_entry(mem, &fb_alloc_list, list) { @@ -1375,8 +1322,23 @@ static irqreturn_t mxcfb_irq_handler(int irq, void *dev_id) ipu_disable_irq(irq); mxc_fbi->wait4vsync = 0; } else { - up(&mxc_fbi->flip_sem); - ipu_disable_irq(irq); + if (!ipu_check_buffer_busy(mxc_fbi->ipu_ch, + IPU_INPUT_BUFFER, mxc_fbi->cur_ipu_buf) + || (mxc_fbi->waitcnt > 2)) { + /* + * This interrupt come after pan display select + * cur_ipu_buf buffer, this buffer should become + * idle after show. If it keep busy, clear it manually. + */ + if (mxc_fbi->waitcnt > 2) + ipu_clear_buffer_ready(mxc_fbi->ipu_ch, + IPU_INPUT_BUFFER, + mxc_fbi->cur_ipu_buf); + up(&mxc_fbi->flip_sem); + ipu_disable_irq(irq); + mxc_fbi->waitcnt = 0; + } else + mxc_fbi->waitcnt++; } return IRQ_HANDLED; } @@ -1394,10 +1356,14 @@ static irqreturn_t mxcfb_alpha_irq_handler(int irq, void *dev_id) /* * Suspends the framebuffer and blanks the screen. Power management support */ -static void mxcfb_suspend_one(struct fb_info *fbi) +static int mxcfb_suspend(struct platform_device *pdev, pm_message_t state) { + struct fb_info *fbi = platform_get_drvdata(pdev); struct mxcfb_info *mxc_fbi = (struct mxcfb_info *)fbi->par; int saved_blank; +#ifdef CONFIG_FB_MXC_LOW_PWR_DISPLAY + void *fbmem; +#endif acquire_console_sem(); fb_set_suspend(fbi, 1); @@ -1405,44 +1371,26 @@ static void mxcfb_suspend_one(struct fb_info *fbi) mxcfb_blank(FB_BLANK_POWERDOWN, fbi); mxc_fbi->next_blank = saved_blank; release_console_sem(); + + return 0; } /* * Resumes the framebuffer and unblanks the screen. Power management support */ -static void mxcfb_resume_one(struct fb_info *fbi) +static int mxcfb_resume(struct platform_device *pdev) { + struct fb_info *fbi = platform_get_drvdata(pdev); struct mxcfb_info *mxc_fbi = (struct mxcfb_info *)fbi->par; acquire_console_sem(); mxcfb_blank(mxc_fbi->next_blank, fbi); fb_set_suspend(fbi, 0); release_console_sem(); -} - -#ifndef CONFIG_HAS_EARLYSUSPEND - -static int mxcfb_suspend(struct platform_device *pdev, pm_message_t state) -{ - struct fb_info *fbi = platform_get_drvdata(pdev); - - if (fbi && (strcmp(fbi->fix.id, "DISP3 FG") == 0)) - mxcfb_suspend_one(fbi); return 0; } -static int mxcfb_resume(struct platform_device *pdev) -{ - struct fb_info *fbi = platform_get_drvdata(pdev); - - if (fbi && (strcmp(fbi->fix.id, "DISP3 FG") == 0)) - mxcfb_resume_one(fbi); - - return 0; -} -#endif - /* * Main framebuffer functions */ @@ -1461,12 +1409,12 @@ static int mxcfb_map_video_memory(struct fb_info *fbi) { if (fbi->fix.smem_len < fbi->var.yres_virtual * fbi->fix.line_length) fbi->fix.smem_len = fbi->var.yres_virtual * - fbi->fix.line_length; + fbi->fix.line_length; fbi->screen_base = dma_alloc_writecombine(fbi->device, - fbi->fix.smem_len, - (dma_addr_t *) & fbi->fix. - smem_start, GFP_DMA); + fbi->fix.smem_len, + (dma_addr_t *)&fbi->fix.smem_start, + GFP_DMA); if (fbi->screen_base == 0) { dev_err(fbi->device, "Unable to allocate framebuffer memory\n"); fbi->fix.smem_len = 0; @@ -1572,13 +1520,15 @@ static ssize_t swap_disp_chan(struct device *dev, int i; for (i = 0; i < num_registered_fb; i++) { - fg_mxcfbi = (struct mxcfb_info *)mxcfb_info[i]->par; + fg_mxcfbi = + (struct mxcfb_info *)mxcfb_info[i]->par; if (fg_mxcfbi->ipu_ch == MEM_FG_SYNC) break; else fg_mxcfbi = NULL; } - if (!fg_mxcfbi || fg_mxcfbi->cur_blank == FB_BLANK_UNBLANK) { + if (!fg_mxcfbi || + fg_mxcfbi->cur_blank == FB_BLANK_UNBLANK) { dev_err(dev, "Can not switch while fb2(fb-fg) is on.\n"); release_console_sem(); @@ -1592,7 +1542,6 @@ static ssize_t swap_disp_chan(struct device *dev, release_console_sem(); return count; } - DEVICE_ATTR(fsl_disp_property, 644, show_disp_chan, swap_disp_chan); /*! @@ -1652,7 +1601,7 @@ static int mxcfb_probe(struct platform_device *pdev) mxcfb_alpha_irq_handler, 0, MXCFB_NAME, fbi) != 0) { dev_err(&pdev->dev, "Error registering BG " - "alpha irq handler.\n"); + "alpha irq handler.\n"); ret = -EBUSY; goto err1; } @@ -1665,7 +1614,7 @@ static int mxcfb_probe(struct platform_device *pdev) mxcfb_alpha_irq_handler, 0, MXCFB_NAME, fbi) != 0) { dev_err(&pdev->dev, "Error registering BG " - "alpha irq handler.\n"); + "alpha irq handler.\n"); ret = -EBUSY; goto err1; } @@ -1683,7 +1632,7 @@ static int mxcfb_probe(struct platform_device *pdev) mxcfb_alpha_irq_handler, 0, MXCFB_NAME, fbi) != 0) { dev_err(&pdev->dev, "Error registering FG alpha irq " - "handler.\n"); + "handler.\n"); ret = -EBUSY; goto err1; } @@ -1703,8 +1652,7 @@ static int mxcfb_probe(struct platform_device *pdev) if (res && res->end) { fbi->fix.smem_len = res->end - res->start + 1; fbi->fix.smem_start = res->start; - fbi->screen_base = - ioremap(fbi->fix.smem_start, fbi->fix.smem_len); + fbi->screen_base = ioremap(fbi->fix.smem_start, fbi->fix.smem_len); } /* Need dummy values until real panel is configured */ @@ -1729,21 +1677,15 @@ static int mxcfb_probe(struct platform_device *pdev) mxcfbi->fb_mode_str = plat_data->mode_str; if (mxcfbi->fb_mode_str) { - #ifdef CONFIG_MODULE_CCXMX51 if ((mstr = strstr(mxcfbi->fb_mode_str, "VGA@")) != NULL) mxcfbi->fb_mode_str = mstr + 4; #endif - - ret = - fb_find_mode(&fbi->var, fbi, mxcfbi->fb_mode_str, NULL, 0, - NULL, mxcfbi->default_bpp); - if ((!ret || (ret > 2)) && plat_data && plat_data->mode - && plat_data->num_modes) - fb_find_mode(&fbi->var, fbi, mxcfbi->fb_mode_str, - plat_data->mode, plat_data->num_modes, - NULL, mxcfbi->default_bpp); - + ret = fb_find_mode(&fbi->var, fbi, mxcfbi->fb_mode_str, NULL, 0, NULL, + mxcfbi->default_bpp); + if ((!ret || (ret > 2)) && plat_data && plat_data->mode && plat_data->num_modes) + fb_find_mode(&fbi->var, fbi, mxcfbi->fb_mode_str, plat_data->mode, + plat_data->num_modes, NULL, mxcfbi->default_bpp); #ifdef CONFIG_MODULE_CCXMX51 /* This improves the VGA modes on the CCWi-i.MX51 */ if (mstr != NULL) { @@ -1758,8 +1700,7 @@ static int mxcfb_probe(struct platform_device *pdev) pm_set_vt_switch(vt_switch); /* Default Y virtual size is 2x panel size */ - fbi->var.yres_virtual = ((fbi->var.yres + 127) & ~127) * 2; - fbi->var.xres_virtual = (fbi->var.xres + 31) & ~31; + fbi->var.yres_virtual = fbi->var.yres * 3; mxcfb_set_fix(fbi); @@ -1780,12 +1721,12 @@ static int mxcfb_probe(struct platform_device *pdev) return 0; - err2: +err2: ipu_free_irq(mxcfbi->ipu_ch_irq, fbi); - err1: +err1: fb_dealloc_cmap(&fbi->cmap); framebuffer_release(fbi); - err0: +err0: return ret; } @@ -1818,10 +1759,8 @@ static struct platform_driver mxcfb_driver = { }, .probe = mxcfb_probe, .remove = mxcfb_remove, -#ifndef CONFIG_HAS_EARLYSUSPEND .suspend = mxcfb_suspend, .resume = mxcfb_resume, -#endif }; /* @@ -1886,7 +1825,8 @@ static int mxcfb_option_setup(struct fb_info *info, char *options) continue; } if (!strncmp(opt, "bpp=", 4)) - mxcfbi->default_bpp = simple_strtoul(opt + 4, NULL, 0); + mxcfbi->default_bpp = + simple_strtoul(opt + 4, NULL, 0); else mxcfbi->fb_mode_str = opt; } @@ -1894,32 +1834,6 @@ static int mxcfb_option_setup(struct fb_info *info, char *options) return 0; } -#ifdef CONFIG_HAS_EARLYSUSPEND -static void mxcfb_early_suspend(struct early_suspend *h) -{ - int i; - for (i = FB_DEVICE_NUM - 1; i >= 0; i--) { - if (mxcfb_info[i]) - mxcfb_suspend_one(mxcfb_info[i]); - } -} - -static void mxcfb_later_resume(struct early_suspend *h) -{ - int i; - for (i = 0; i < FB_DEVICE_NUM; i++) { - if (mxcfb_info[i]) - mxcfb_resume_one(mxcfb_info[i]); - } -} - -struct early_suspend fbdrv_earlysuspend = { - .level = EARLY_SUSPEND_LEVEL_DISABLE_FB, - .suspend = mxcfb_early_suspend, - .resume = mxcfb_later_resume, -}; -#endif - /*! * Main entry function for the framebuffer. The function registers the power * management callback functions with the kernel and also registers the MXCFB @@ -1929,17 +1843,11 @@ struct early_suspend fbdrv_earlysuspend = { */ int __init mxcfb_init(void) { - int ret; - - ret = platform_driver_register(&mxcfb_driver); - if (!ret) - register_early_suspend(&fbdrv_earlysuspend); - return ret; + return platform_driver_register(&mxcfb_driver); } void mxcfb_exit(void) { - unregister_early_suspend(&fbdrv_earlysuspend); platform_driver_unregister(&mxcfb_driver); } diff --git a/drivers/video/mxc/tve.c b/drivers/video/mxc/tve.c index 793b470cdce4..b1982f868e8c 100644 --- a/drivers/video/mxc/tve.c +++ b/drivers/video/mxc/tve.c @@ -513,9 +513,12 @@ static irqreturn_t tve_detect_handler(int irq, void *data) /* Re-construct clk for tve display */ static inline void tve_recfg_fb(struct fb_info *fbi) { + struct fb_var_screeninfo var; + + memset(&var, 0, sizeof(var)); + fb_videomode_to_var(&var, fbi->mode); fbi->flags &= ~FBINFO_MISC_USEREVENT; - fbi->var.activate |= FB_ACTIVATE_FORCE; - fb_set_var(fbi, &fbi->var); + fb_set_var(fbi, &var); } int tve_fb_event(struct notifier_block *nb, unsigned long val, void *v) diff --git a/drivers/video/s3c-fb.c b/drivers/video/s3c-fb.c index 5a72083dc67c..adf9632c6b1f 100644 --- a/drivers/video/s3c-fb.c +++ b/drivers/video/s3c-fb.c @@ -1036,7 +1036,7 @@ static int s3c_fb_resume(struct platform_device *pdev) static struct platform_driver s3c_fb_driver = { .probe = s3c_fb_probe, - .remove = s3c_fb_remove, + .remove = __devexit_p(s3c_fb_remove), .suspend = s3c_fb_suspend, .resume = s3c_fb_resume, .driver = { diff --git a/drivers/video/sis/vstruct.h b/drivers/video/sis/vstruct.h index 705c85360526..bef4aae388d0 100644 --- a/drivers/video/sis/vstruct.h +++ b/drivers/video/sis/vstruct.h @@ -342,7 +342,7 @@ struct SiS_Private unsigned short SiS_RY4COE; unsigned short SiS_LCDHDES; unsigned short SiS_LCDVDES; - unsigned short SiS_DDC_Port; + SISIOADDRESS SiS_DDC_Port; unsigned short SiS_DDC_Index; unsigned short SiS_DDC_Data; unsigned short SiS_DDC_NData; diff --git a/drivers/video/uvesafb.c b/drivers/video/uvesafb.c index ca5b4643a401..e35232a18571 100644 --- a/drivers/video/uvesafb.c +++ b/drivers/video/uvesafb.c @@ -67,12 +67,14 @@ static DEFINE_MUTEX(uvfb_lock); * find the kernel part of the task struct, copy the registers and * the buffer contents and then complete the task. */ -static void uvesafb_cn_callback(void *data) +static void uvesafb_cn_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp) { - struct cn_msg *msg = data; struct uvesafb_task *utask; struct uvesafb_ktask *task; + if (!cap_raised(nsp->eff_cap, CAP_SYS_ADMIN)) + return; + if (msg->seq >= UVESAFB_TASKS_MAX) return; diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index a882f2606515..0ffff9ed4eb0 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c @@ -281,6 +281,9 @@ static void *vring_get_buf(struct virtqueue *_vq, unsigned int *len) return NULL; } + /* Only get used array entries after they have been exposed by host. */ + rmb(); + i = vq->vring.used->ring[vq->last_used_idx%vq->vring.num].id; *len = vq->vring.used->ring[vq->last_used_idx%vq->vring.num].len; diff --git a/drivers/w1/w1_netlink.c b/drivers/w1/w1_netlink.c index fdf72851c574..45c126fea31d 100644 --- a/drivers/w1/w1_netlink.c +++ b/drivers/w1/w1_netlink.c @@ -306,9 +306,8 @@ static int w1_netlink_send_error(struct cn_msg *rcmsg, struct w1_netlink_msg *rm return error; } -static void w1_cn_callback(void *data) +static void w1_cn_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp) { - struct cn_msg *msg = data; struct w1_netlink_msg *m = (struct w1_netlink_msg *)(msg + 1); struct w1_netlink_cmd *cmd; struct w1_slave *sl; diff --git a/drivers/watchdog/riowd.c b/drivers/watchdog/riowd.c index 1e8f02f440e6..d3c824dc2358 100644 --- a/drivers/watchdog/riowd.c +++ b/drivers/watchdog/riowd.c @@ -206,7 +206,7 @@ static int __devinit riowd_probe(struct of_device *op, dev_set_drvdata(&op->dev, p); riowd_device = p; - err = 0; + return 0; out_iounmap: of_iounmap(&op->resource[0], p->regs, 2); diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile index ec2a39b1e26f..7c284342f30f 100644 --- a/drivers/xen/Makefile +++ b/drivers/xen/Makefile @@ -1,6 +1,9 @@ obj-y += grant-table.o features.o events.o manage.o obj-y += xenbus/ +nostackp := $(call cc-option, -fno-stack-protector) +CFLAGS_features.o := $(nostackp) + obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug.o obj-$(CONFIG_XEN_XENCOMM) += xencomm.o obj-$(CONFIG_XEN_BALLOON) += balloon.o diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index f5bbd9e83416..1b7123eb5d7b 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c @@ -96,11 +96,7 @@ static struct balloon_stats balloon_stats; /* We increase/decrease in batches which fit in a page */ static unsigned long frame_list[PAGE_SIZE / sizeof(unsigned long)]; -/* VM /proc information for memory */ -extern unsigned long totalram_pages; - #ifdef CONFIG_HIGHMEM -extern unsigned long totalhigh_pages; #define inc_totalhigh_pages() (totalhigh_pages++) #define dec_totalhigh_pages() (totalhigh_pages--) #else diff --git a/firmware/Makefile b/firmware/Makefile index 19d80a6cc763..6cf11103de41 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -110,8 +110,7 @@ fw-shipped-$(CONFIG_USB_SERIAL_XIRCOM) += keyspan_pda/xircom_pgs.fw fw-shipped-$(CONFIG_USB_VICAM) += vicam/firmware.fw fw-shipped-$(CONFIG_VIDEO_CPIA2) += cpia2/stv0672_vp4.bin fw-shipped-$(CONFIG_YAM) += yam/1200.bin yam/9600.bin -fw-shipped-$(CONFIG_FB_MXC_EINK_PANEL) += imx/epdc_E60.fw \ - imx/epdc_E97.fw +fw-shipped-$(CONFIG_FB_MXC_EINK_PANEL) += imx/epdc.fw fw-shipped-all := $(fw-shipped-y) $(fw-shipped-m) $(fw-shipped-) diff --git a/firmware/imx/epdc.fw.ihex b/firmware/imx/epdc.fw.ihex new file mode 100644 index 000000000000..eca54786f1c4 --- /dev/null +++ b/firmware/imx/epdc.fw.ihex @@ -0,0 +1,45914 @@ +:10000000C7FFA986DE9C0000E30100000003250075 +:100010000127020E3C03000000000000400000C366 +:100020004700000100030D00FFFC0000000000532A +:10003000000306090C0F1215181B1E21262B302059 +:10004000000000000000000017050000000000E0B4 +:1000500011060000000000C03509000000000090FB +:10006000000000000000009895000000000000A0C3 +:1000700016010000000000A885010000000000B08B +:10008000F2010000000000B85D020000000000C0A6 +:10009000C0020000000000C81B030000000000D0E8 +:1000A00074030000000000D8C9030000000000E055 +:1000B0001E040000000000E863040000000000F0DF +:1000C0009E040000000000F8D70400000000009526 +:1000D0000000000000000001010101010101010117 +:1000E0000101010101010101010101010101010100 +:1000F00001010101010101010101010101010101F0 +:1001000001010101010101010101010101010101DF +:1001100001010101010101010101010101010101CF +:1001200001010101010101010101010101010101BF +:1001300001010101010101010101010101010101AF +:10014000010101010101010101010101010101019F +:10015000010101010101010101010101010101018F +:10016000010101010101010101010101010101017F +:10017000010101010101010101010101010101016F +:10018000010101010101010101010101010101015F +:10019000010101010101010101010101010101014F +:1001A000010101010101010101010101010101013F +:1001B000010101010101010101010101010101012F +:1001C000010101010101010101010101010101011F +:1001D000010101010101010101010101010101010F +:1001E00001010101010101010101010101010101FF +:1001F00001010101010101010101010101010101EF +:1002000001010101010101010101010101010101DE +:1002100001010101010101010101010101010101CE +:1002200001010101010101010101010101010101BE +:1002300001010101010101010101010101010101AE +:10024000010101010101010101010101010101019E +:10025000010101010101010101010101010101018E +:10026000010101010101010101010101010101017E +:10027000010101010101010101010101010101016E +:10028000010101010101010101010101010101015E +:10029000010101010101010101010101010101014E +:1002A000010101010101010101010101010101013E +:1002B000010101010101010101010101010101012E +:1002C000010101010101010101010101010101011E +:1002D000010101010101010101010101010101010E +:1002E00001010101010101010101010101010101FE +:1002F00001010101010101010101010101010101EE +:1003000001010101010101010101010101010101DD +:1003100001010101010101010101010101010101CD +:1003200001010101010101010101010101010101BD +:1003300001010101010101010101010101010101AD +:10034000010101010101010101010101010101019D +:10035000010101010101010101010101010101018D +:10036000010101010101010101010101010101017D +:10037000010101010101010101010101010101016D +:10038000010101010101010101010101010101015D +:10039000010101010101010101010101010101014D +:1003A000010101010101010101010101010101013D +:1003B000010101010101010101010101010101012D +:1003C000010101010101010101010101010101011D +:1003D000010101010101010101010101010101010D +:1003E00001010101010101010101010101010101FD +:1003F00001010101010101010101010101010101ED +:1004000001010101010101010101010101010101DC +:1004100001010101010101010101010101010101CC +:1004200001010101010101010101010101010101BC +:1004300001010101010101010101010101010101AC +:10044000010101010101010101010101010101019C +:10045000010101010101010101010101010101018C +:10046000010101010101010101010101010101017C +:10047000010101010101010101010101010101016C +:10048000010101010101010101010101010101015C +:10049000010101010101010101010101010101014C +:1004A000010101010101010101010101010101013C +:1004B000010101010101010101010101010101012C +:1004C000010101010101010101010101010101011C +:1004D000010101010101010101010101010101010C +:1004E00001010101010101010101010101010101FC +:1004F00001010101010101010101010101010101EC +:1005000001010101010101010101010101010101DB +:1005100001010101010101010101010101010101CB +:1005200001010101010101010101010101010101BB +:1005300001010101010101010101010101010101AB +:10054000010101010101010101010101010101019B +:10055000010101010101010101010101010101018B +:10056000010101010101010101010101010101017B +:10057000010101010101010101010101010101016B +:10058000010101010101010101010101010101015B +:10059000010101010101010101010101010101014B +:1005A000010101010101010101010101010101013B +:1005B000010101010101010101010101010101012B +:1005C000010101010101010101010101010101011B +:1005D000010101010101010101010101010101010B +:1005E00001010101010101010101010101010101FB +:1005F00001010101010101010101010101010101EB +:1006000001010101010101010101010101010101DA +:1006100001010101010101010101010101010101CA +:1006200001010101010101010101010101010101BA +:1006300001010101010101010101010101010101AA +:10064000010101010101010101010101010101019A +:10065000010101010101010101010101010101018A +:10066000010101010101010101010101010101017A +:10067000010101010101010101010101010101016A +:10068000010101010101010101010101010101015A +:10069000010101010101010101010101010101014A +:1006A000010101010101010101010101010101013A +:1006B000010101010101010101010101010101012A +:1006C000010101010101010101010101010101011A +:1006D000010101010101010101010101010101010A +:1006E00001010101010101010101010101010101FA +:1006F00001010101010101010101010101010101EA +:1007000001010101010101010101010101010101D9 +:1007100001010101010101010101010101010101C9 +:1007200001010101010101010101010101010101B9 +:1007300001010101010101010101010101010101A9 +:100740000101010101010101010101010101010199 +:100750000101010101010101010101010101010189 +:100760000101010101010101010101010101010179 +:100770000101010101010101010101010101010169 +:100780000101010101010101010101010101010159 +:100790000101010101010101010101010101010149 +:1007A0000101010101010101010101010101010139 +:1007B0000101010101010101010101010101010129 +:1007C0000101010101010101010101010101010119 +:1007D0000101010101010101010101010101010109 +:1007E00001010101010101010101010101010101F9 +:1007F00001010101010101010101010101010101E9 +:1008000001010101010101010101010101010101D8 +:1008100001010101010101010101010101010101C8 +:1008200001010101010101010101010101010101B8 +:1008300001010101010101010101010101010101A8 +:100840000101010101010101010101010101010198 +:100850000101010101010101010101010101010188 +:100860000101010101010101010101010101010178 +:100870000101010101010101010101010101010168 +:100880000101010101010101010101010101010158 +:100890000101010101010101010101010101010148 +:1008A0000101010101010101010101010101010138 +:1008B0000101010101010101010101010101010128 +:1008C0000101010101010101010101010101010118 +:1008D0000101010101010101010101010101010108 +:1008E00001010101010101010101010101010101F8 +:1008F00001010101010101010101010101010101E8 +:1009000001010101010101010101010101010101D7 +:1009100001010101010101010101010101010101C7 +:1009200001010101010101010101010101010101B7 +:1009300001010101010101010101010101010101A7 +:100940000101010101010101010101010101010197 +:100950000101010101010101010101010101010187 +:100960000101010101010101010101010101010177 +:100970000101010101010101010101010101010167 +:100980000101010101010101010101010101010157 +:100990000101010101010101010101010101010147 +:1009A0000101010101010101010101010101010137 +:1009B0000101010101010101010101010101010127 +:1009C0000101010101010101010101010101010117 +:1009D0000101010101010101010101010101010107 +:1009E00001010101010101010101010101010101F7 +:1009F00001010101010101010101010101010101E7 +:100A000001010101010101010101010101010101D6 +:100A100001010101010101010101010101010101C6 +:100A200001010101010101010101010101010101B6 +:100A300001010101010101010101010101010101A6 +:100A40000101010101010101010101010101010196 +:100A50000101010101010101010101010101010186 +:100A60000101010101010101010101010101010176 +:100A70000101010101010101010101010101010166 +:100A80000101010101010101010101010101010156 +:100A90000101010101010101010101010101010146 +:100AA0000101010101010101010101010101010136 +:100AB0000101010101010101010101010101010126 +:100AC0000101010101010101010101010101010116 +:100AD0000101010101010101010101010101010106 +:100AE00001010101010101010101010101010101F6 +:100AF00001010101010101010101010101010101E6 +:100B000001010101010101010101010101010101D5 +:100B100001010101010101010101010101010101C5 +:100B200001010101010101010101010101010101B5 +:100B300001010101010101010101010101010101A5 +:100B40000101010101010101010101010101010195 +:100B50000101010101010101010101010101010185 +:100B60000101010101010101010101010101010175 +:100B70000101010101010101010101010101010165 +:100B80000101010101010101010101010101010155 +:100B90000101010101010101010101010101010145 +:100BA0000101010101010101010101010101010135 +:100BB0000101010101010101010101010101010125 +:100BC0000101010101010101010101010101010115 +:100BD0000101010101010101010101010101010105 +:100BE00001010101010101010101010101010101F5 +:100BF00001010101010101010101010101010101E5 +:100C000001010101010101010101010101010101D4 +:100C100001010101010101010101010101010101C4 +:100C200001010101010101010101010101010101B4 +:100C300001010101010101010101010101010101A4 +:100C40000101010101010101010101010101010194 +:100C50000101010101010101010101010101010184 +:100C60000101010101010101010101010101010174 +:100C70000101010101010101010101010101010164 +:100C80000101010101010101010101010101010154 +:100C90000101010101010101010101010101010144 +:100CA0000101010101010101010101010101010134 +:100CB0000101010101010101010101010101010124 +:100CC0000101010101010101010101010101010114 +:100CD0000101010101010101010101010101010104 +:100CE00001010101010101010101010101010101F4 +:100CF00001010101010101010101010101010101E4 +:100D000001010101010101010101010101010101D3 +:100D100001010101010101010101010101010101C3 +:100D200001010101010101010101010101010101B3 +:100D300001010101010101010101010101010101A3 +:100D40000101010101010101010101010101010193 +:100D50000101010101010101010101010101010183 +:100D60000101010101010101010101010101010173 +:100D70000101010101010101010101010101010163 +:100D80000101010101010101010101010101010153 +:100D90000101010101010101010101010101010143 +:100DA0000101010101010101010101010101010133 +:100DB0000101010101010101010101010101010123 +:100DC0000101010101010101010101010101010113 +:100DD0000101010101010101010101010101010103 +:100DE00001010101010101010101010101010101F3 +:100DF00001010101010101010101010101010101E3 +:100E000001010101010101010101010101010101D2 +:100E100001010101010101010101010101010101C2 +:100E200001010101010101010101010101010101B2 +:100E300001010101010101010101010101010101A2 +:100E40000101010101010101010101010101010192 +:100E50000101010101010101010101010101010182 +:100E60000101010101010101010101010101010172 +:100E70000101010101010101010101010101010162 +:100E80000101010101010101010101010101010152 +:100E90000101010101010101010101010101010142 +:100EA0000101010101010101010101010101010132 +:100EB0000101010101010101010101010101010122 +:100EC0000101010101010101010101010101010112 +:100ED0000101010101010101010101010101010102 +:100EE00001010101010101010101010101010101F2 +:100EF00001010101010101010101010101010101E2 +:100F000001010101010101010101010101010101D1 +:100F100001010101010101010101010101010101C1 +:100F200001010101010101010101010101010101B1 +:100F300001010101010101010101010101010101A1 +:100F40000101010101010101010101010101010191 +:100F50000101010101010101010101010101010181 +:100F60000101010101010101010101010101010171 +:100F70000101010101010101010101010101010161 +:100F80000101010101010101010101010101010151 +:100F90000101010101010101010101010101010141 +:100FA0000101010101010101010101010101010131 +:100FB0000101010101010101010101010101010121 +:100FC0000101010101010101010101010101010111 +:100FD0000101010101010101010101010101010101 +:100FE00001010101010101010101010101010101F1 +:100FF00001010101010101010101010101010101E1 +:1010000001010101010101010101010101010101D0 +:1010100001010101010101010101010101010101C0 +:1010200001010101010101010101010101010101B0 +:1010300001010101010101010101010101010101A0 +:101040000101010101010101010101010101010190 +:101050000101010101010101010101010101010180 +:101060000101010101010101010101010101010170 +:101070000101010101010101010101010101010160 +:101080000101010101010101010101010101010150 +:101090000101010101010101010101010101010140 +:1010A0000101010101010101010101010101010130 +:1010B0000101010101010101010101010101010120 +:1010C0000101010101010101010101010101010110 +:1010D0000101010101010101010101010101010100 +:1010E00001010101010101010101010101010101F0 +:1010F00001010101010101010101010101010101E0 +:1011000001010101010101010101010101010101CF +:1011100001010101010101010101010101010101BF +:1011200001010101010101010101010101010101AF +:10113000010101010101010101010101010101019F +:10114000010101010101010101010101010101018F +:10115000010101010101010101010101010101017F +:10116000010101010101010101010101010101016F +:10117000010101010101010101010101010101015F +:10118000010101010101010101010101010101014F +:10119000010101010101010101010101010101013F +:1011A000010101010101010101010101010101012F +:1011B000010101010101010101010101010101011F +:1011C000010101010101010101010101010101010F +:1011D00001010101010101010101010101010101FF +:1011E00001010101010101010101010101010101EF +:1011F00001010101010101010101010101010101DF +:1012000001010101010101010101010101010101CE +:1012100001010101010101010101010101010101BE +:1012200001010101010101010101010101010101AE +:10123000010101010101010101010101010101019E +:10124000010101010101010101010101010101018E +:10125000010101010101010101010101010101017E +:10126000010101010101010101010101010101016E +:10127000010101010101010101010101010101015E +:10128000010101010101010101010101010101014E +:10129000010101010101010101010101010101013E +:1012A000010101010101010101010101010101012E +:1012B000010101010101010101010101010101011E +:1012C000010101010101010101010101010101010E +:1012D00001010101010101010101010101010101FE +:1012E00001010101010101010101010101010101EE +:1012F00001010101010101010101010101010101DE +:1013000001010101010101010101010101010101CD +:1013100001010101010101010101010101010101BD +:1013200001010101010101010101010101010101AD +:10133000010101010101010101010101010101019D +:10134000010101010101010101010101010101018D +:10135000010101010101010101010101010101017D +:10136000010101010101010101010101010101016D +:10137000010101010101010101010101010101015D +:10138000010101010101010101010101010101014D +:10139000010101010101010101010101010101013D +:1013A000010101010101010101010101010101012D +:1013B000010101010101010101010101010101011D +:1013C000010101010101010101010101010101010D +:1013D00001010101010101010101010101010101FD +:1013E00001010101010101010101010101010101ED +:1013F00001010101010101010101010101010101DD +:1014000001010101010101010101010101010101CC +:1014100001010101010101010101010101010101BC +:1014200001010101010101010101010101010101AC +:10143000010101010101010101010101010101019C +:10144000010101010101010101010101010101018C +:10145000010101010101010101010101010101017C +:10146000010101010101010101010101010101016C +:10147000010101010101010101010101010101015C +:10148000010101010101010101010101010101014C +:10149000010101010101010101010101010101013C +:1014A000010101010101010101010101010101012C +:1014B000010101010101010101010101010101011C +:1014C000010101010101010101010101010101010C +:1014D00001010101010101010101010101010101FC +:1014E00001010101010101010101010101010101EC +:1014F00001010101010101010101010101010101DC +:1015000001010101010101010101010101010101CB +:1015100001010101010101010101010101010101BB +:1015200001010101010101010101010101010101AB +:10153000010101010101010101010101010101019B +:10154000010101010101010101010101010101018B +:10155000010101010101010101010101010101017B +:10156000010101010101010101010101010101016B +:10157000010101010101010101010101010101015B +:10158000010101010101010101010101010101014B +:10159000010101010101010101010101010101013B +:1015A000010101010101010101010101010101012B +:1015B000010101010101010101010101010101011B +:1015C000010101010101010101010101010101010B +:1015D00001010101010101010101010101010101FB +:1015E00001010101010101010101010101010101EB +:1015F00001010101010101010101010101010101DB +:1016000001010101010101010101010101010101CA +:1016100001010101010101010101010101010101BA +:1016200001010101010101010101010101010101AA +:10163000010101010101010101010101010101019A +:10164000010101010101010101010101010101018A +:10165000010101010101010101010101010101017A +:10166000010101010101010101010101010101016A +:10167000010101010101010101010101010101015A +:10168000010101010101010101010101010101014A +:10169000010101010101010101010101010101013A +:1016A000010101010101010101010101010101012A +:1016B000010101010101010101010101010101011A +:1016C000010101010101010101010101010101010A +:1016D00001010101010101010101010101010101FA +:1016E00001010101010101010101010101010101EA +:1016F00001010101010101010101010101010101DA +:1017000001010101010101010101010101010101C9 +:1017100001010101010101010101010101010101B9 +:1017200001010101010101010101010101010101A9 +:101730000101010101010101010101010101010199 +:101740000101010101010101010101010101010189 +:101750000101010101010101010101010101010179 +:101760000101010101010101010101010101010169 +:101770000101010101010101010101010101010159 +:101780000101010101010101010101010101010149 +:101790000101010101010101010101010101010139 +:1017A0000101010101010101010101010101010129 +:1017B0000101010101010101010101010101010119 +:1017C0000101010101010101010101010101010109 +:1017D00001010101010101010101010101010101F9 +:1017E00001010101010101010101010101010101E9 +:1017F00001010101010101010101010101010101D9 +:1018000001010101010101010101010101010101C8 +:1018100001010101010101010101010101010101B8 +:1018200001010101010101010101010101010101A8 +:101830000101010101010101010101010101010198 +:101840000101010101010101010101010101010188 +:101850000101010101010101010101010101010178 +:101860000101010101010101010101010101010168 +:101870000101010101010101010101010101010158 +:101880000101010101010101010101010101010148 +:101890000101010101010101010101010101010138 +:1018A0000101010101010101010101010101010128 +:1018B0000101010101010101010101010101010118 +:1018C0000101010101010101010101010101010108 +:1018D00001010101010101010101010101010101F8 +:1018E00001010101010101010101010101010101E8 +:1018F00001010101010101010101010101010101D8 +:1019000001010101010101010101010101010101C7 +:1019100001010101010101010101010101010101B7 +:1019200001010101010101010101010101010101A7 +:101930000101010101010101010101010101010197 +:101940000101010101010101010101010101010187 +:101950000101010101010101010101010101010177 +:101960000101010101010101010101010101010167 +:101970000101010101010101010101010101010157 +:101980000101010101010101010101010101010147 +:101990000101010101010101010101010101010137 +:1019A0000101010101010101010101010101010127 +:1019B0000101010101010101010101010101010117 +:1019C0000101010101010101010101010101010107 +:1019D00001010101010101010101010101010101F7 +:1019E00001010101010101010101010101010101E7 +:1019F00001010101010101010101010101010101D7 +:101A000001010101010101010101010101010101C6 +:101A100001010101010101010101010101010101B6 +:101A200001010101010101010101010101010101A6 +:101A30000101010101010101010101010101010196 +:101A40000101010101010101010101010101010186 +:101A50000101010101010101010101010101010176 +:101A60000101010101010101010101010101010166 +:101A70000101010101010101010101010101010156 +:101A80000101010101010101010101010101010146 +:101A90000101010101010101010101010101010136 +:101AA0000101010101010101010101010101010126 +:101AB0000101010101010101010101010101010116 +:101AC0000101010101010101010101010101010106 +:101AD00001010101010101010101010101010101F6 +:101AE00001010101010101010101010101010101E6 +:101AF00001010101010101010101010101010101D6 +:101B000001010101010101010101010101010101C5 +:101B100001010101010101010101010101010101B5 +:101B200001010101010101010101010101010101A5 +:101B30000101010101010101010101010101010195 +:101B40000101010101010101010101010101010185 +:101B50000101010101010101010101010101010175 +:101B60000101010101010101010101010101010165 +:101B70000101010101010101010101010101010155 +:101B80000101010101010101010101010101010145 +:101B90000101010101010101010101010101010135 +:101BA0000101010101010101010101010101010125 +:101BB0000101010101010101010101010101010115 +:101BC0000101010101010101010101010101010105 +:101BD00001010101010101010101010101010101F5 +:101BE00001010101010101010101010101010101E5 +:101BF00001010101010101010101010101010101D5 +:101C000001010101010101010101010101010101C4 +:101C100001010101010101010101010101010101B4 +:101C200001010101010101010101010101010101A4 +:101C30000101010101010101010101010101010194 +:101C40000101010101010101010101010101010184 +:101C50000101010101010101010101010101010174 +:101C60000101010101010101010101010101010164 +:101C70000101010101010101010101010101010154 +:101C80000101010101010101010101010101010144 +:101C90000101010101010101010101010101010134 +:101CA0000101010101010101010101010101010124 +:101CB0000101010101010101010101010101010114 +:101CC0000101010101010101010101010101010104 +:101CD00001010101010101010101010101010101F4 +:101CE00001010101010101010101010101010101E4 +:101CF00001010101010101010101010101010101D4 +:101D000001010101010101010101010101010101C3 +:101D100001010101010101010101010101010101B3 +:101D200001010101010101010101010101010101A3 +:101D30000101010101010101010101010101010193 +:101D40000101010101010101010101010101010183 +:101D50000101010101010101010101010101010173 +:101D60000101010101010101010101010101010163 +:101D70000101010101010101010101010101010153 +:101D80000101010101010101010101010101010143 +:101D90000101010101010101010101010101010133 +:101DA0000101010101010101010101010101010123 +:101DB0000101010101010101010101010101010113 +:101DC0000101010101010101010101010101010103 +:101DD00001010101010101000000000000000000FC +:101DE00000000000000000000000000000000000F3 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000000000000000000000A2 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E60000000000000000000000000000000000072 +:101E70000000000000000000000000000000000062 +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000000000000000000032 +:101EB0000000000000000000000000000000000022 +:101EC0000000000000000000000000000000000012 +:101ED0000000000000000000000000000000000002 +:101EE00000000000000000000000000000000000F2 +:101EF00000000000000000000000000000000000E2 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000000000A1 +:101F40000000000000000000000000000000000091 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F80000000000000000000000000000000000051 +:101F90000000000000000000000000000000000041 +:101FA0000000000000000000000000000000000031 +:101FB0000000000000000000000000000000000021 +:101FC0000000000000000000000000000000000011 +:101FD0000000000000000000000000000000000001 +:101FE00000000000000000000000000000000000F1 +:101FF00000000000000000000000000000000000E1 +:1020000000000000000000000000000000000000D0 +:1020100000000000000000000000000000000000C0 +:1020200000000000000000000000000000000000B0 +:1020300000000000000000000000000000000000A0 +:102040000000000000000000000000000000000090 +:102050000000000000000000000000000000000080 +:102060000000000000000000000000000000000070 +:102070000000000000000000000000000000000060 +:102080000000000000000000000000000000000050 +:102090000000000000000000000000000000000040 +:1020A0000000000000000000000000000000000030 +:1020B0000000000000000000000000000000000020 +:1020C0000000000000000000000000000000000010 +:1020D0000000000000000000000000000000000000 +:1020E00000000000000000000000000000000000F0 +:1020F00000000000000000000000000000000000E0 +:1021000000000000000000000000000000000000CF +:1021100000000000000000000000000000000000BF +:1021200000000000000000000000000000000000AF +:10213000000000000000000000000000000000009F +:10214000000000000000000000000000000000008F +:10215000000000000000000000000000000000007F +:10216000000000000000000000000000000000006F +:10217000000000000000000000000000000000005F +:10218000000000000000000000000000000000004F +:10219000000000000000000000000000000000003F +:1021A000000000000000000000000000000000002F +:1021B000000000000000000000000000000000001F +:1021C000000000000000000000000000000000000F +:1021D00000000000000000000000000000000000FF +:1021E00000000000000000000000000000000000EF +:1021F00000000000000000000000000000000000DF +:1022000000000000000000000000000000000000CE +:1022100000000000000000000000000000000000BE +:1022200000000000000000000000000000000000AE +:10223000000000000000000000000000000000009E +:10224000000000000000000000000000000000008E +:10225000000000000000000000000000000000007E +:10226000000000000000000000000000000000006E +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000000000004E +:10229000000000000000000000000000000000003E +:1022A000000000000000000000000000000000002E +:1022B000000000000000000000000000000000001E +:1022C000000000000000000000000000000000000E +:1022D00000000000000000000000000000000000FE +:1022E00000000000000000000000000000000000EE +:1022F00000000000000000000000000000000000DE +:1023000000000000000000000000000000000000CD +:1023100000000000000000000000000000000000BD +:1023200000000000000000000000000000000000AD +:10233000000000000000000000000000000000009D +:10234000000000000000000000000000000000008D +:10235000000000000000000000000000000000007D +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000000000005D +:10238000000000000000000000000000000000004D +:10239000000000000000000000000000000000003D +:1023A000000000000000000000000000000000002D +:1023B000000000000000000000000000000000001D +:1023C000000000000000000000000000000000000D +:1023D00000000000000000020202020202020202EB +:1023E00002020202020202020202020202020202CD +:1023F00002020202020202020202020202020202BD +:1024000002020202020202020202020202020202AC +:10241000020202020202020202020202020202029C +:10242000020202020202020202020202020202028C +:10243000020202020202020202020202020202027C +:10244000020202020202020202020202020202026C +:10245000020202020202020202020202020202025C +:10246000020202020202020202020202020202024C +:10247000020202020202020202020202020202023C +:10248000020202020202020202020202020202022C +:10249000020202020202020202020202020202021C +:1024A000020202020202020202020202020202020C +:1024B00002020202020202020202020202020202FC +:1024C00002020202020202020202020202020202EC +:1024D00002020202020202020202020202020202DC +:1024E00002020202020202020202020202020202CC +:1024F00002020202020202020202020202020202BC +:1025000002020202020202020202020202020202AB +:10251000020202020202020202020202020202029B +:10252000020202020202020202020202020202028B +:10253000020202020202020202020202020202027B +:10254000020202020202020202020202020202026B +:10255000020202020202020202020202020202025B +:10256000020202020202020202020202020202024B +:10257000020202020202020202020202020202023B +:10258000020202020202020202020202020202022B +:10259000020202020202020202020202020202021B +:1025A000020202020202020202020202020202020B +:1025B00002020202020202020202020202020202FB +:1025C00002020202020202020202020202020202EB +:1025D00002020202020202020202020202020202DB +:1025E00002020202020202020202020202020202CB +:1025F00002020202020202020202020202020202BB +:1026000002020202020202020202020202020202AA +:10261000020202020202020202020202020202029A +:10262000020202020202020202020202020202028A +:10263000020202020202020202020202020202027A +:10264000020202020202020202020202020202026A +:10265000020202020202020202020202020202025A +:10266000020202020202020202020202020202024A +:10267000020202020202020202020202020202023A +:10268000020202020202020202020202020202022A +:10269000020202020202020202020202020202021A +:1026A000020202020202020202020202020202020A +:1026B00002020202020202020202020202020202FA +:1026C00002020202020202020202020202020202EA +:1026D00002020202020202020202020202020202DA +:1026E00002020202020202020202020202020202CA +:1026F00002020202020202020202020202020202BA +:1027000002020202020202020202020202020202A9 +:102710000202020202020202020202020202020299 +:102720000202020202020202020202020202020289 +:102730000202020202020202020202020202020279 +:102740000202020202020202020202020202020269 +:102750000202020202020202020202020202020259 +:102760000202020202020202020202020202020249 +:102770000202020202020202020202020202020239 +:102780000202020202020202020202020202020229 +:102790000202020202020202020202020202020219 +:1027A0000202020202020202020202020202020209 +:1027B00002020202020202020202020202020202F9 +:1027C00002020202020202020202020202020202E9 +:1027D00002020202020202020202020202020202D9 +:1027E00002020202020202020202020202020202C9 +:1027F00002020202020202020202020202020202B9 +:1028000002020202020202020202020202020202A8 +:102810000202020202020202020202020202020298 +:102820000202020202020202020202020202020288 +:102830000202020202020202020202020202020278 +:102840000202020202020202020202020202020268 +:102850000202020202020202020202020202020258 +:102860000202020202020202020202020202020248 +:102870000202020202020202020202020202020238 +:102880000202020202020202020202020202020228 +:102890000202020202020202020202020202020218 +:1028A0000202020202020202020202020202020208 +:1028B00002020202020202020202020202020202F8 +:1028C00002020202020202020202020202020202E8 +:1028D00002020202020202020202020202020202D8 +:1028E00002020202020202020202020202020202C8 +:1028F00002020202020202020202020202020202B8 +:1029000002020202020202020202020202020202A7 +:102910000202020202020202020202020202020297 +:102920000202020202020202020202020202020287 +:102930000202020202020202020202020202020277 +:102940000202020202020202020202020202020267 +:102950000202020202020202020202020202020257 +:102960000202020202020202020202020202020247 +:102970000202020202020202020202020202020237 +:102980000202020202020202020202020202020227 +:102990000202020202020202020202020202020217 +:1029A0000202020202020202020202020202020207 +:1029B00002020202020202020202020202020202F7 +:1029C00002020202020202020202020202020202E7 +:1029D00002020202020202020202020202020202D7 +:1029E00002020202020202020202020202020202C7 +:1029F00002020202020202020202020202020202B7 +:102A000002020202020202020202020202020202A6 +:102A10000202020202020202020202020202020296 +:102A20000202020202020202020202020202020286 +:102A30000202020202020202020202020202020276 +:102A40000202020202020202020202020202020266 +:102A50000202020202020202020202020202020256 +:102A60000202020202020202020202020202020246 +:102A70000202020202020202020202020202020236 +:102A80000202020202020202020202020202020226 +:102A90000202020202020202020202020202020216 +:102AA0000202020202020202020202020202020206 +:102AB00002020202020202020202020202020202F6 +:102AC00002020202020202020202020202020202E6 +:102AD00002020202020202020202020202020202D6 +:102AE00002020202020202020202020202020202C6 +:102AF00002020202020202020202020202020202B6 +:102B000002020202020202020202020202020202A5 +:102B10000202020202020202020202020202020295 +:102B20000202020202020202020202020202020285 +:102B30000202020202020202020202020202020275 +:102B40000202020202020202020202020202020265 +:102B50000202020202020202020202020202020255 +:102B60000202020202020202020202020202020245 +:102B70000202020202020202020202020202020235 +:102B80000202020202020202020202020202020225 +:102B90000202020202020202020202020202020215 +:102BA0000202020202020202020202020202020205 +:102BB00002020202020202020202020202020202F5 +:102BC00002020202020202020202020202020202E5 +:102BD00002020202020202020202020202020202D5 +:102BE00002020202020202020202020202020202C5 +:102BF00002020202020202020202020202020202B5 +:102C000002020202020202020202020202020202A4 +:102C10000202020202020202020202020202020294 +:102C20000202020202020202020202020202020284 +:102C30000202020202020202020202020202020274 +:102C40000202020202020202020202020202020264 +:102C50000202020202020202020202020202020254 +:102C60000202020202020202020202020202020244 +:102C70000202020202020202020202020202020234 +:102C80000202020202020202020202020202020224 +:102C90000202020202020202020202020202020214 +:102CA0000202020202020202020202020202020204 +:102CB00002020202020202020202020202020202F4 +:102CC00002020202020202020202020202020202E4 +:102CD00002020202020202020202020202020202D4 +:102CE00002020202020202020202020202020202C4 +:102CF00002020202020202020202020202020202B4 +:102D000002020202020202020202020202020202A3 +:102D10000202020202020202020202020202020293 +:102D20000202020202020202020202020202020283 +:102D30000202020202020202020202020202020273 +:102D40000202020202020202020202020202020263 +:102D50000202020202020202020202020202020253 +:102D60000202020202020202020202020202020243 +:102D70000202020202020202020202020202020233 +:102D80000202020202020202020202020202020223 +:102D90000202020202020202020202020202020213 +:102DA0000202020202020202020202020202020203 +:102DB00002020202020202020202020202020202F3 +:102DC00002020202020202020202020202020202E3 +:102DD00002020202020202020202020202020202D3 +:102DE00002020202020202020202020202020202C3 +:102DF00002020202020202020202020202020202B3 +:102E000002020202020202020202020202020202A2 +:102E10000202020202020202020202020202020292 +:102E20000202020202020202020202020202020282 +:102E30000202020202020202020202020202020272 +:102E40000202020202020202020202020202020262 +:102E50000202020202020202020202020202020252 +:102E60000202020202020202020202020202020242 +:102E70000202020202020202020202020202020232 +:102E80000202020202020202020202020202020222 +:102E90000202020202020202020202020202020212 +:102EA0000202020202020202020202020202020202 +:102EB00002020202020202020202020202020202F2 +:102EC00002020202020202020202020202020202E2 +:102ED00002020202020202020202020202020202D2 +:102EE00002020202020202020202020202020202C2 +:102EF00002020202020202020202020202020202B2 +:102F000002020202020202020202020202020202A1 +:102F10000202020202020202020202020202020291 +:102F20000202020202020202020202020202020281 +:102F30000202020202020202020202020202020271 +:102F40000202020202020202020202020202020261 +:102F50000202020202020202020202020202020251 +:102F60000202020202020202020202020202020241 +:102F70000202020202020202020202020202020231 +:102F80000202020202020202020202020202020221 +:102F90000202020202020202020202020202020211 +:102FA0000202020202020202020202020202020201 +:102FB00002020202020202020202020202020202F1 +:102FC00002020202020202020202020202020202E1 +:102FD00002020202020202020202020202020202D1 +:102FE00002020202020202020202020202020202C1 +:102FF00002020202020202020202020202020202B1 +:1030000002020202020202020202020202020202A0 +:103010000202020202020202020202020202020290 +:103020000202020202020202020202020202020280 +:103030000202020202020202020202020202020270 +:103040000202020202020202020202020202020260 +:103050000202020202020202020202020202020250 +:103060000202020202020202020202020202020240 +:103070000202020202020202020202020202020230 +:103080000202020202020202020202020202020220 +:103090000202020202020202020202020202020210 +:1030A0000202020202020202020202020202020200 +:1030B00002020202020202020202020202020202F0 +:1030C00002020202020202020202020202020202E0 +:1030D00002020202020202020202020202020202D0 +:1030E00002020202020202020202020202020202C0 +:1030F00002020202020202020202020202020202B0 +:10310000020202020202020202020202020202029F +:10311000020202020202020202020202020202028F +:10312000020202020202020202020202020202027F +:10313000020202020202020202020202020202026F +:10314000020202020202020202020202020202025F +:10315000020202020202020202020202020202024F +:10316000020202020202020202020202020202023F +:10317000020202020202020202020202020202022F +:10318000020202020202020202020202020202021F +:10319000020202020202020202020202020202020F +:1031A00002020202020202020202020202020202FF +:1031B00002020202020202020202020202020202EF +:1031C00002020202020202020202020202020202DF +:1031D00002020202020202020202020202020202CF +:1031E00002020202020202020202020202020202BF +:1031F00002020202020202020202020202020202AF +:10320000020202020202020202020202020202029E +:10321000020202020202020202020202020202028E +:10322000020202020202020202020202020202027E +:10323000020202020202020202020202020202026E +:10324000020202020202020202020202020202025E +:10325000020202020202020202020202020202024E +:10326000020202020202020202020202020202023E +:10327000020202020202020202020202020202022E +:10328000020202020202020202020202020202021E +:10329000020202020202020202020202020202020E +:1032A00002020202020202020202020202020202FE +:1032B00002020202020202020202020202020202EE +:1032C00002020202020202020202020202020202DE +:1032D00002020202020202020202020202020202CE +:1032E00002020202020202020202020202020202BE +:1032F00002020202020202020202020202020202AE +:10330000020202020202020202020202020202029D +:10331000020202020202020202020202020202028D +:10332000020202020202020202020202020202027D +:10333000020202020202020202020202020202026D +:10334000020202020202020202020202020202025D +:10335000020202020202020202020202020202024D +:10336000020202020202020202020202020202023D +:10337000020202020202020202020202020202022D +:10338000020202020202020202020202020202021D +:10339000020202020202020202020202020202020D +:1033A00002020202020202020202020202020202FD +:1033B00002020202020202020202020202020202ED +:1033C00002020202020202020202020202020202DD +:1033D00002020202020202020202020202020202CD +:1033E00002020202020202020202020202020202BD +:1033F00002020202020202020202020202020202AD +:10340000020202020202020202020202020202029C +:10341000020202020202020202020202020202028C +:10342000020202020202020202020202020202027C +:10343000020202020202020202020202020202026C +:10344000020202020202020202020202020202025C +:10345000020202020202020202020202020202024C +:10346000020202020202020202020202020202023C +:10347000020202020202020202020202020202022C +:10348000020202020202020202020202020202021C +:10349000020202020202020202020202020202020C +:1034A00002020202020202020202020202020202FC +:1034B00002020202020202020202020202020202EC +:1034C00002020202020202020202020202020202DC +:1034D00002020202020202020202020202020202CC +:1034E00002020202020202020202020202020202BC +:1034F00002020202020202020202020202020202AC +:10350000020202020202020202020202020202029B +:10351000020202020202020202020202020202028B +:10352000020202020202020202020202020202027B +:10353000020202020202020202020202020202026B +:10354000020202020202020202020202020202025B +:10355000020202020202020202020202020202024B +:10356000020202020202020202020202020202023B +:10357000020202020202020202020202020202022B +:10358000020202020202020202020202020202021B +:10359000020202020202020202020202020202020B +:1035A00002020202020202020202020202020202FB +:1035B00002020202020202020202020202020202EB +:1035C00002020202020202020202020202020202DB +:1035D00002020202020202020202020202020202CB +:1035E00002020202020202020202020202020202BB +:1035F00002020202020202020202020202020202AB +:10360000020202020202020202020202020202029A +:10361000020202020202020202020202020202028A +:10362000020202020202020202020202020202027A +:10363000020202020202020202020202020202026A +:10364000020202020202020202020202020202025A +:10365000020202020202020202020202020202024A +:10366000020202020202020202020202020202023A +:10367000020202020202020202020202020202022A +:10368000020202020202020202020202020202021A +:10369000020202020202020202020202020202020A +:1036A00002020202020202020202020202020202FA +:1036B00002020202020202020202020202020202EA +:1036C00002020202020202020202020202020202DA +:1036D00002020202020202020202020202020202CA +:1036E00002020202020202020202020202020202BA +:1036F00002020202020202020202020202020202AA +:103700000202020202020202020202020202020299 +:103710000202020202020202020202020202020289 +:103720000202020202020202020202020202020279 +:103730000202020202020202020202020202020269 +:103740000202020202020202020202020202020259 +:103750000202020202020202020202020202020249 +:103760000202020202020202020202020202020239 +:103770000202020202020202020202020202020229 +:103780000202020202020202020202020202020219 +:103790000202020202020202020202020202020209 +:1037A00002020202020202020202020202020202F9 +:1037B00002020202020202020202020202020202E9 +:1037C00002020202020202020202020202020202D9 +:1037D00002020202020202020202020202020202C9 +:1037E00002020202020202020202020202020202B9 +:1037F00002020202020202020202020202020202A9 +:103800000202020202020202020202020202020298 +:103810000202020202020202020202020202020288 +:103820000202020202020202020202020202020278 +:103830000202020202020202020202020202020268 +:103840000202020202020202020202020202020258 +:103850000202020202020202020202020202020248 +:103860000202020202020202020202020202020238 +:103870000202020202020202020202020202020228 +:103880000202020202020202020202020202020218 +:103890000202020202020202020202020202020208 +:1038A00002020202020202020202020202020202F8 +:1038B00002020202020202020202020202020202E8 +:1038C00002020202020202020202020202020202D8 +:1038D00002020202020202020202020202020202C8 +:1038E00002020202020202020202020202020202B8 +:1038F00002020202020202020202020202020202A8 +:103900000202020202020202020202020202020297 +:103910000202020202020202020202020202020287 +:103920000202020202020202020202020202020277 +:103930000202020202020202020202020202020267 +:103940000202020202020202020202020202020257 +:103950000202020202020202020202020202020247 +:103960000202020202020202020202020202020237 +:103970000202020202020202020202020202020227 +:103980000202020202020202020202020202020217 +:103990000202020202020202020202020202020207 +:1039A00002020202020202020202020202020202F7 +:1039B00002020202020202020202020202020202E7 +:1039C00002020202020202020202020202020202D7 +:1039D00002020202020202020202020202020202C7 +:1039E00002020202020202020202020202020202B7 +:1039F00002020202020202020202020202020202A7 +:103A00000202020202020202020202020202020296 +:103A10000202020202020202020202020202020286 +:103A20000202020202020202020202020202020276 +:103A30000202020202020202020202020202020266 +:103A40000202020202020202020202020202020256 +:103A50000202020202020202020202020202020246 +:103A60000202020202020202020202020202020236 +:103A70000202020202020202020202020202020226 +:103A80000202020202020202020202020202020216 +:103A90000202020202020202020202020202020206 +:103AA00002020202020202020202020202020202F6 +:103AB00002020202020202020202020202020202E6 +:103AC00002020202020202020202020202020202D6 +:103AD00002020202020202020202020202020202C6 +:103AE00002020202020202020202020202020202B6 +:103AF00002020202020202020202020202020202A6 +:103B00000202020202020202020202020202020295 +:103B10000202020202020202020202020202020285 +:103B20000202020202020202020202020202020275 +:103B30000202020202020202020202020202020265 +:103B40000202020202020202020202020202020255 +:103B50000202020202020202020202020202020245 +:103B60000202020202020202020202020202020235 +:103B70000202020202020202020202020202020225 +:103B80000202020202020202020202020202020215 +:103B90000202020202020202020202020202020205 +:103BA00002020202020202020202020202020202F5 +:103BB00002020202020202020202020202020202E5 +:103BC00002020202020202020202020202020202D5 +:103BD00002020202020202020202020202020202C5 +:103BE00002020202020202020202020202020202B5 +:103BF00002020202020202020202020202020202A5 +:103C00000202020202020202020202020202020294 +:103C10000202020202020202020202020202020284 +:103C20000202020202020202020202020202020274 +:103C30000202020202020202020202020202020264 +:103C40000202020202020202020202020202020254 +:103C50000202020202020202020202020202020244 +:103C60000202020202020202020202020202020234 +:103C70000202020202020202020202020202020224 +:103C80000202020202020202020202020202020214 +:103C90000202020202020202020202020202020204 +:103CA00002020202020202020202020202020202F4 +:103CB00002020202020202020202020202020202E4 +:103CC00002020202020202020202020202020202D4 +:103CD00002020202020202020202020202020202C4 +:103CE00002020202020202020202020202020202B4 +:103CF00002020202020202020202020202020202A4 +:103D00000202020202020202020202020202020293 +:103D10000202020202020202020202020202020283 +:103D20000202020202020202020202020202020273 +:103D30000202020202020202020202020202020263 +:103D40000202020202020202020202020202020253 +:103D50000202020202020202020202020202020243 +:103D60000202020202020202020202020202020233 +:103D70000202020202020202020202020202020223 +:103D80000202020202020202020202020202020213 +:103D90000202020202020202020202020202020203 +:103DA00002020202020202020202020202020202F3 +:103DB00002020202020202020202020202020202E3 +:103DC00002020202020202020202020202020202D3 +:103DD00002020202020202020202020202020202C3 +:103DE00002020202020202020202020202020202B3 +:103DF00002020202020202020202020202020202A3 +:103E00000202020202020202020202020202020292 +:103E10000202020202020202020202020202020282 +:103E20000202020202020202020202020202020272 +:103E30000202020202020202020202020202020262 +:103E40000202020202020202020202020202020252 +:103E50000202020202020202020202020202020242 +:103E60000202020202020202020202020202020232 +:103E70000202020202020202020202020202020222 +:103E80000202020202020202020202020202020212 +:103E90000202020202020202020202020202020202 +:103EA00002020202020202020202020202020202F2 +:103EB00002020202020202020202020202020202E2 +:103EC00002020202020202020202020202020202D2 +:103ED00002020202020202020202020202020202C2 +:103EE00002020202020202020202020202020202B2 +:103EF00002020202020202020202020202020202A2 +:103F00000202020202020202020202020202020291 +:103F10000202020202020202020202020202020281 +:103F20000202020202020202020202020202020271 +:103F30000202020202020202020202020202020261 +:103F40000202020202020202020202020202020251 +:103F50000202020202020202020202020202020241 +:103F60000202020202020202020202020202020231 +:103F70000202020202020202020202020202020221 +:103F80000202020202020202020202020202020211 +:103F90000202020202020202020202020202020201 +:103FA00002020202020202020202020202020202F1 +:103FB00002020202020202020202020202020202E1 +:103FC00002020202020202020202020202020202D1 +:103FD00002020202020202020202020202020202C1 +:103FE00002020202020202020202020202020202B1 +:103FF00002020202020202020202020202020202A1 +:104000000202020202020202020202020202020290 +:104010000202020202020202020202020202020280 +:104020000202020202020202020202020202020270 +:104030000202020202020202020202020202020260 +:104040000202020202020202020202020202020250 +:104050000202020202020202020202020202020240 +:104060000202020202020202020202020202020230 +:104070000202020202020202020202020202020220 +:104080000202020202020202020202020202020210 +:104090000202020202020202020202020202020200 +:1040A00002020202020202020202020202020202F0 +:1040B00002020202020202020202020202020202E0 +:1040C00002020202020202020202020202020202D0 +:1040D00002020202020202000000000000000000D2 +:1040E00000000000000000000000000000000000D0 +:1040F00000000000000000000000000000000000C0 +:1041000000000000000000000000000000000000AF +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:10414000000000000000000000000000000000006F +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F +:10417000000000000000000000000000000000003F +:10418000000000000000000000000000000000002F +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000000000AE +:10421000000000000000000000000000000000009E +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000007E +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000000000005E +:10426000000000000000000000000000000000004E +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000000002E +:10429000000000000000000000000000000000001E +:1042A000000000000000000000000000000000000E +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D00000000000000000000000000000000000DE +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000000000000BE +:1043000000000000000000000000000000000000AD +:10431000000000000000000000000000000000009D +:10432000000000000000000000000000000000008D +:10433000000000000000000000000000000000007D +:10434000000000000000000000000000000000006D +:10435000000000000000000000000000000000005D +:10436000000000000000000000000000000000004D +:10437000000000000000000000000000000000003D +:10438000000000000000000000000000000000002D +:10439000000000000000000000000000000000001D +:1043A000000000000000000000000000000000000D +:1043B00000000000000000000000000000000000FD +:1043C00000000000000000000000000000000000ED +:1043D00000000000000000000000000000000000DD +:1043E00000000000000000000000000000000000CD +:1043F00000000000000000000000000000000000BD +:1044000000000000000000000000000000000000AC +:10441000000000000000000000000000000000009C +:10442000000000000000000000000000000000008C +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C +:10445000000000000000000000000000000000005C +:10446000000000000000000000000000000000004C +:10447000000000000000000000000000000000003C +:10448000000000000000000000000000000000002C +:10449000000000000000000000000000000000001C +:1044A000000000000000000000000000000000000C +:1044B00000000000000000000000000000000000FC +:1044C00000000000000000000000000000000000EC +:1044D00000000000000000000000000000000000DC +:1044E00000000000000000000000000000000000CC +:1044F00000000000000000000000000000000000BC +:1045000000000000000000000000000000000000AB +:10451000000000000000000000000000000000009B +:10452000000000000000000000000000000000008B +:10453000000000000000000000000000000000007B +:10454000000000000000000000000000000000006B +:10455000000000000000000000000000000000005B +:10456000000000000000000000000000000000004B +:10457000000000000000000000000000000000003B +:10458000000000000000000000000000000000002B +:10459000000000000000000000000000000000001B +:1045A000000000000000000000000000000000000B +:1045B00000000000000000000000000000000000FB +:1045C00000000000000000000000000000000000EB +:1045D00000000000000000000000000000000000DB +:1045E00000000000000000000000000000000000CB +:1045F00000000000000000000000000000000000BB +:1046000000000000000000000000000000000000AA +:10461000000000000000000000000000000000009A +:10462000000000000000000000000000000000008A +:10463000000000000000000000000000000000007A +:10464000000000000000000000000000000000006A +:10465000000000000000000000000000000000005A +:10466000000000000000000000000000000000004A +:10467000000000000000000000000000000000003A +:10468000000000000000000000000000000000002A +:10469000000000000000000000000000000000001A +:1046A000000000000000000000000000000000000A +:1046B00000000000000000000000000000000000FA +:1046C00000000000000000000000000000000000EA +:1046D00000000000000000000000000000000000DA +:1046E00000000000000000000000000000000000CA +:1046F00000000000000000000000000000000000BA +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000000000000099 +:104720000000000000000000000000000000000089 +:104730000000000000000000000000000000000079 +:104740000000000000000000000000000000000069 +:104750000000000000000000000000000000000059 +:104760000000000000000000000000000000000049 +:104770000000000000000000000000000000000039 +:104780000000000000000000000000000000000029 +:104790000000000000000000000000000000000019 +:1047A0000000000000000000000000000000000009 +:1047B00000000000000000000000000000000000F9 +:1047C00000000000000000000000000000000000E9 +:1047D00000000000000000000000000000000000D9 +:1047E00000000000000000000000000000000000C9 +:1047F00000000000000000000000000000000000B9 +:1048000000000000000000000000000000000000A8 +:104810000000000000000000000000000000000098 +:104820000000000000000000000000000000000088 +:104830000000000000000000000000000000000078 +:104840000000000000000000000000000000000068 +:104850000000000000000000000000000000000058 +:104860000000000000000000000000000000000048 +:104870000000000000000000000000000000000038 +:104880000000000000000000000000000000000028 +:104890000000000000000000000000000000000018 +:1048A0000000000000000000000000000000000008 +:1048B00000000000000000000000000000000000F8 +:1048C00000000000000000000000000000000000E8 +:1048D00000000000000000000000000000000000D8 +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000000000000000000B8 +:1049000000000000000000000000000000000000A7 +:104910000000000000000000000000000000000097 +:104920000000000000000000000000000000000087 +:104930000000000000000000000000000000000077 +:104940000000000000000000000000000000000067 +:104950000000000000000000000000000000000057 +:104960000000000000000000000000000000000047 +:104970000000000000000000000000000000000037 +:104980000000000000000000000000000000000027 +:104990000000000000000000000000000000000017 +:1049A0000000000000000000000000000000000007 +:1049B00000000000000000000000000000000000F7 +:1049C00000000000000000000000000000000000E7 +:1049D00000000000000000000000000000000000D7 +:1049E00000000000000000000000000000000000C7 +:1049F00000000000000000000000000000000000B7 +:104A000000000000000000000000000000000000A6 +:104A10000000000000000000000000000000000096 +:104A20000000000000000000000000000000000086 +:104A30000000000000000000000000000000000076 +:104A40000000000000000000000000000000000066 +:104A50000000000000000000000000000000000056 +:104A60000000000000000000000000000000000046 +:104A70000000000000000000000000000000000036 +:104A80000000000000000000000000000000000026 +:104A90000000000000000000000000000000000016 +:104AA0000000000000000000000000000000000006 +:104AB00000000000000000000000000000000000F6 +:104AC00000000000000000000000000000000000E6 +:104AD00000000000000000000000000000000000D6 +:104AE00000000000000000000000000000000000C6 +:104AF00000000000000000000000000000000000B6 +:104B000000000000000000000000000000000000A5 +:104B10000000000000000000000000000000000095 +:104B20000000000000000000000000000000000085 +:104B30000000000000000000000000000000000075 +:104B40000000000000000000000000000000000065 +:104B50000000000000000000000000000000000055 +:104B60000000000000000000000000000000000045 +:104B70000000000000000000000000000000000035 +:104B80000000000000000000000000000000000025 +:104B90000000000000000000000000000000000015 +:104BA0000000000000000000000000000000000005 +:104BB00000000000000000000000000000000000F5 +:104BC00000000000000000000000000000000000E5 +:104BD00000000000000000000000000000000000D5 +:104BE00000000000000000000000000000000000C5 +:104BF00000000000000000000000000000000000B5 +:104C000000000000000000000000000000000000A4 +:104C10000000000000000000000000000000000094 +:104C20000000000000000000000000000000000084 +:104C30000000000000000000000000000000000074 +:104C40000000000000000000000000000000000064 +:104C50000000000000000000000000000000000054 +:104C60000000000000000000000000000000000044 +:104C70000000000000000000000000000000000034 +:104C80000000000000000000000000000000000024 +:104C90000000000000000000000000000000000014 +:104CA0000000000000000000000000000000000004 +:104CB00000000000000000000000000000000000F4 +:104CC00000000000000000000000000000000000E4 +:104CD00000000000000000010101010101010101CB +:104CE00001010101010101010101010101010101B4 +:104CF00001010101010101010101010101010101A4 +:104D00000101010101010101010101010101010193 +:104D10000101010101010101010101010101010183 +:104D20000101010101010101010101010101010173 +:104D30000101010101010101010101010101010163 +:104D40000101010101010101010101010101010153 +:104D50000101010101010101010101010101010143 +:104D60000101010101010101010101010101010133 +:104D70000101010101010101010101010101010123 +:104D80000101010101010101010101010101010113 +:104D90000101010101010101010101010101010103 +:104DA00001010101010101010101010101010101F3 +:104DB00001010101010101010101010101010101E3 +:104DC00001010101010101010101010101010101D3 +:104DD00001010101010101010101010101010101C3 +:104DE00001010101010101010101010101010101B3 +:104DF00001010101010101010101010101010101A3 +:104E00000101010101010101010101010101010192 +:104E10000101010101010101010101010101010182 +:104E20000101010101010101010101010101010172 +:104E30000101010101010101010101010101010162 +:104E40000101010101010101010101010101010152 +:104E50000101010101010101010101010101010142 +:104E60000101010101010101010101010101010132 +:104E70000101010101010101010101010101010122 +:104E80000101010101010101010101010101010112 +:104E90000101010101010101010101010101010102 +:104EA00001010101010101010101010101010101F2 +:104EB00001010101010101010101010101010101E2 +:104EC00001010101010101010101010101010101D2 +:104ED00001010101010101010101010101010101C2 +:104EE00001010101010101010101010101010101B2 +:104EF00001010101010101010101010101010101A2 +:104F00000101010101010101010101010101010191 +:104F10000101010101010101010101010101010181 +:104F20000101010101010101010101010101010171 +:104F30000101010101010101010101010101010161 +:104F40000101010101010101010101010101010151 +:104F50000101010101010101010101010101010141 +:104F60000101010101010101010101010101010131 +:104F70000101010101010101010101010101010121 +:104F80000101010101010101010101010101010111 +:104F90000101010101010101010101010101010101 +:104FA00001010101010101010101010101010101F1 +:104FB00001010101010101010101010101010101E1 +:104FC00001010101010101010101010101010101D1 +:104FD00001010101010101010101010101010101C1 +:104FE00001010101010101010101010101010101B1 +:104FF00001010101010101010101010101010101A1 +:105000000101010101010101010101010101010190 +:105010000101010101010101010101010101010180 +:105020000101010101010101010101010101010170 +:105030000101010101010101010101010101010160 +:105040000101010101010101010101010101010150 +:105050000101010101010101010101010101010140 +:105060000101010101010101010101010101010130 +:105070000101010101010101010101010101010120 +:105080000101010101010101010101010101010110 +:105090000101010101010101010101010101010100 +:1050A00001010101010101010101010101010101F0 +:1050B00001010101010101010101010101010101E0 +:1050C00001010101010101010101010101010101D0 +:1050D00001010101010101010101010101010101C0 +:1050E00001010101010101010101010101010101B0 +:1050F00001010101010101010101010101010101A0 +:10510000010101010101010101010101010101018F +:10511000010101010101010101010101010101017F +:10512000010101010101010101010101010101016F +:10513000010101010101010101010101010101015F +:10514000010101010101010101010101010101014F +:10515000010101010101010101010101010101013F +:10516000010101010101010101010101010101012F +:10517000010101010101010101010101010101011F +:10518000010101010101010101010101010101010F +:1051900001010101010101010101010101010101FF +:1051A00001010101010101010101010101010101EF +:1051B00001010101010101010101010101010101DF +:1051C00001010101010101010101010101010101CF +:1051D00001010101010101010101010101010101BF +:1051E00001010101010101010101010101010101AF +:1051F000010101010101010101010101010101019F +:10520000010101010101010101010101010101018E +:10521000010101010101010101010101010101017E +:10522000010101010101010101010101010101016E +:10523000010101010101010101010101010101015E +:10524000010101010101010101010101010101014E +:10525000010101010101010101010101010101013E +:10526000010101010101010101010101010101012E +:10527000010101010101010101010101010101011E +:10528000010101010101010101010101010101010E +:1052900001010101010101010101010101010101FE +:1052A00001010101010101010101010101010101EE +:1052B00001010101010101010101010101010101DE +:1052C00001010101010101010101010101010101CE +:1052D00001010101010101010101010101010101BE +:1052E00001010101010101010101010101010101AE +:1052F000010101010101010101010101010101019E +:10530000010101010101010101010101010101018D +:10531000010101010101010101010101010101017D +:10532000010101010101010101010101010101016D +:10533000010101010101010101010101010101015D +:10534000010101010101010101010101010101014D +:10535000010101010101010101010101010101013D +:10536000010101010101010101010101010101012D +:10537000010101010101010101010101010101011D +:10538000010101010101010101010101010101010D +:1053900001010101010101010101010101010101FD +:1053A00001010101010101010101010101010101ED +:1053B00001010101010101010101010101010101DD +:1053C00001010101010101010101010101010101CD +:1053D00001010101010101010101010101010101BD +:1053E00001010101010101010101010101010101AD +:1053F000010101010101010101010101010101019D +:10540000010101010101010101010101010101018C +:10541000010101010101010101010101010101017C +:10542000010101010101010101010101010101016C +:10543000010101010101010101010101010101015C +:10544000010101010101010101010101010101014C +:10545000010101010101010101010101010101013C +:10546000010101010101010101010101010101012C +:10547000010101010101010101010101010101011C +:10548000010101010101010101010101010101010C +:1054900001010101010101010101010101010101FC +:1054A00001010101010101010101010101010101EC +:1054B00001010101010101010101010101010101DC +:1054C00001010101010101010101010101010101CC +:1054D00001010101010101010101010101010101BC +:1054E00001010101010101010101010101010101AC +:1054F000010101010101010101010101010101019C +:10550000010101010101010101010101010101018B +:10551000010101010101010101010101010101017B +:10552000010101010101010101010101010101016B +:10553000010101010101010101010101010101015B +:10554000010101010101010101010101010101014B +:10555000010101010101010101010101010101013B +:10556000010101010101010101010101010101012B +:10557000010101010101010101010101010101011B +:10558000010101010101010101010101010101010B +:1055900001010101010101010101010101010101FB +:1055A00001010101010101010101010101010101EB +:1055B00001010101010101010101010101010101DB +:1055C00001010101010101010101010101010101CB +:1055D00001010101010101010101010101010101BB +:1055E00001010101010101010101010101010101AB +:1055F000010101010101010101010101010101019B +:10560000010101010101010101010101010101018A +:10561000010101010101010101010101010101017A +:10562000010101010101010101010101010101016A +:10563000010101010101010101010101010101015A +:10564000010101010101010101010101010101014A +:10565000010101010101010101010101010101013A +:10566000010101010101010101010101010101012A +:10567000010101010101010101010101010101011A +:10568000010101010101010101010101010101010A +:1056900001010101010101010101010101010101FA +:1056A00001010101010101010101010101010101EA +:1056B00001010101010101010101010101010101DA +:1056C00001010101010101010101010101010101CA +:1056D00001010101010101010101010101010101BA +:1056E00001010101010101010101010101010101AA +:1056F000010101010101010101010101010101019A +:105700000101010101010101010101010101010189 +:105710000101010101010101010101010101010179 +:105720000101010101010101010101010101010169 +:105730000101010101010101010101010101010159 +:105740000101010101010101010101010101010149 +:105750000101010101010101010101010101010139 +:105760000101010101010101010101010101010129 +:105770000101010101010101010101010101010119 +:105780000101010101010101010101010101010109 +:1057900001010101010101010101010101010101F9 +:1057A00001010101010101010101010101010101E9 +:1057B00001010101010101010101010101010101D9 +:1057C00001010101010101010101010101010101C9 +:1057D00001010101010101010101010101010101B9 +:1057E00001010101010101010101010101010101A9 +:1057F0000101010101010101010101010101010199 +:105800000101010101010101010101010101010188 +:105810000101010101010101010101010101010178 +:105820000101010101010101010101010101010168 +:105830000101010101010101010101010101010158 +:105840000101010101010101010101010101010148 +:105850000101010101010101010101010101010138 +:105860000101010101010101010101010101010128 +:105870000101010101010101010101010101010118 +:105880000101010101010101010101010101010108 +:1058900001010101010101010101010101010101F8 +:1058A00001010101010101010101010101010101E8 +:1058B00001010101010101010101010101010101D8 +:1058C00001010101010101010101010101010101C8 +:1058D00001010101010101010101010101010101B8 +:1058E00001010101010101010101010101010101A8 +:1058F0000101010101010101010101010101010198 +:105900000101010101010101010101010101010187 +:105910000101010101010101010101010101010177 +:105920000101010101010101010101010101010167 +:105930000101010101010101010101010101010157 +:105940000101010101010101010101010101010147 +:105950000101010101010101010101010101010137 +:105960000101010101010101010101010101010127 +:105970000101010101010101010101010101010117 +:105980000101010101010101010101010101010107 +:1059900001010101010101010101010101010101F7 +:1059A00001010101010101010101010101010101E7 +:1059B00001010101010101010101010101010101D7 +:1059C00001010101010101010101010101010101C7 +:1059D00001010101010101010101010101010101B7 +:1059E00001010101010101010101010101010101A7 +:1059F0000101010101010101010101010101010197 +:105A00000101010101010101010101010101010186 +:105A10000101010101010101010101010101010176 +:105A20000101010101010101010101010101010166 +:105A30000101010101010101010101010101010156 +:105A40000101010101010101010101010101010146 +:105A50000101010101010101010101010101010136 +:105A60000101010101010101010101010101010126 +:105A70000101010101010101010101010101010116 +:105A80000101010101010101010101010101010106 +:105A900001010101010101010101010101010101F6 +:105AA00001010101010101010101010101010101E6 +:105AB00001010101010101010101010101010101D6 +:105AC00001010101010101010101010101010101C6 +:105AD00001010101010101010101010101010101B6 +:105AE00001010101010101010101010101010101A6 +:105AF0000101010101010101010101010101010196 +:105B00000101010101010101010101010101010185 +:105B10000101010101010101010101010101010175 +:105B20000101010101010101010101010101010165 +:105B30000101010101010101010101010101010155 +:105B40000101010101010101010101010101010145 +:105B50000101010101010101010101010101010135 +:105B60000101010101010101010101010101010125 +:105B70000101010101010101010101010101010115 +:105B80000101010101010101010101010101010105 +:105B900001010101010101010101010101010101F5 +:105BA00001010101010101010101010101010101E5 +:105BB00001010101010101010101010101010101D5 +:105BC00001010101010101010101010101010101C5 +:105BD00001010101010101010101010101010101B5 +:105BE00001010101010101010101010101010101A5 +:105BF0000101010101010101010101010101010195 +:105C00000101010101010101010101010101010184 +:105C10000101010101010101010101010101010174 +:105C20000101010101010101010101010101010164 +:105C30000101010101010101010101010101010154 +:105C40000101010101010101010101010101010144 +:105C50000101010101010101010101010101010134 +:105C60000101010101010101010101010101010124 +:105C70000101010101010101010101010101010114 +:105C80000101010101010101010101010101010104 +:105C900001010101010101010101010101010101F4 +:105CA00001010101010101010101010101010101E4 +:105CB00001010101010101010101010101010101D4 +:105CC00001010101010101010101010101010101C4 +:105CD00001010101010101010101010101010101B4 +:105CE00001010101010101010101010101010101A4 +:105CF0000101010101010101010101010101010194 +:105D00000101010101010101010101010101010183 +:105D10000101010101010101010101010101010173 +:105D20000101010101010101010101010101010163 +:105D30000101010101010101010101010101010153 +:105D40000101010101010101010101010101010143 +:105D50000101010101010101010101010101010133 +:105D60000101010101010101010101010101010123 +:105D70000101010101010101010101010101010113 +:105D80000101010101010101010101010101010103 +:105D900001010101010101010101010101010101F3 +:105DA00001010101010101010101010101010101E3 +:105DB00001010101010101010101010101010101D3 +:105DC00001010101010101010101010101010101C3 +:105DD00001010101010101010101010101010101B3 +:105DE00001010101010101010101010101010101A3 +:105DF0000101010101010101010101010101010193 +:105E00000101010101010101010101010101010182 +:105E10000101010101010101010101010101010172 +:105E20000101010101010101010101010101010162 +:105E30000101010101010101010101010101010152 +:105E40000101010101010101010101010101010142 +:105E50000101010101010101010101010101010132 +:105E60000101010101010101010101010101010122 +:105E70000101010101010101010101010101010112 +:105E80000101010101010101010101010101010102 +:105E900001010101010101010101010101010101F2 +:105EA00001010101010101010101010101010101E2 +:105EB00001010101010101010101010101010101D2 +:105EC00001010101010101010101010101010101C2 +:105ED00001010101010101010101010101010101B2 +:105EE00001010101010101010101010101010101A2 +:105EF0000101010101010101010101010101010192 +:105F00000101010101010101010101010101010181 +:105F10000101010101010101010101010101010171 +:105F20000101010101010101010101010101010161 +:105F30000101010101010101010101010101010151 +:105F40000101010101010101010101010101010141 +:105F50000101010101010101010101010101010131 +:105F60000101010101010101010101010101010121 +:105F70000101010101010101010101010101010111 +:105F80000101010101010101010101010101010101 +:105F900001010101010101010101010101010101F1 +:105FA00001010101010101010101010101010101E1 +:105FB00001010101010101010101010101010101D1 +:105FC00001010101010101010101010101010101C1 +:105FD00001010101010101010101010101010101B1 +:105FE00001010101010101010101010101010101A1 +:105FF0000101010101010101010101010101010191 +:106000000101010101010101010101010101010180 +:106010000101010101010101010101010101010170 +:106020000101010101010101010101010101010160 +:106030000101010101010101010101010101010150 +:106040000101010101010101010101010101010140 +:106050000101010101010101010101010101010130 +:106060000101010101010101010101010101010120 +:106070000101010101010101010101010101010110 +:106080000101010101010101010101010101010100 +:1060900001010101010101010101010101010101F0 +:1060A00001010101010101010101010101010101E0 +:1060B00001010101010101010101010101010101D0 +:1060C00001010101010101010101010101010101C0 +:1060D00001010101010101010101010101010101B0 +:1060E00001010101010101010101010101010101A0 +:1060F0000101010101010101010101010101010190 +:10610000010101010101010101010101010101017F +:10611000010101010101010101010101010101016F +:10612000010101010101010101010101010101015F +:10613000010101010101010101010101010101014F +:10614000010101010101010101010101010101013F +:10615000010101010101010101010101010101012F +:10616000010101010101010101010101010101011F +:10617000010101010101010101010101010101010F +:1061800001010101010101010101010101010101FF +:1061900001010101010101010101010101010101EF +:1061A00001010101010101010101010101010101DF +:1061B00001010101010101010101010101010101CF +:1061C00001010101010101010101010101010101BF +:1061D00001010101010101010101010101010101AF +:1061E000010101010101010101010101010101019F +:1061F000010101010101010101010101010101018F +:10620000010101010101010101010101010101017E +:10621000010101010101010101010101010101016E +:10622000010101010101010101010101010101015E +:10623000010101010101010101010101010101014E +:10624000010101010101010101010101010101013E +:10625000010101010101010101010101010101012E +:10626000010101010101010101010101010101011E +:10627000010101010101010101010101010101010E +:1062800001010101010101010101010101010101FE +:1062900001010101010101010101010101010101EE +:1062A00001010101010101010101010101010101DE +:1062B00001010101010101010101010101010101CE +:1062C00001010101010101010101010101010101BE +:1062D00001010101010101010101010101010101AE +:1062E000010101010101010101010101010101019E +:1062F000010101010101010101010101010101018E +:10630000010101010101010101010101010101017D +:10631000010101010101010101010101010101016D +:10632000010101010101010101010101010101015D +:10633000010101010101010101010101010101014D +:10634000010101010101010101010101010101013D +:10635000010101010101010101010101010101012D +:10636000010101010101010101010101010101011D +:10637000010101010101010101010101010101010D +:1063800001010101010101010101010101010101FD +:1063900001010101010101010101010101010101ED +:1063A00001010101010101010101010101010101DD +:1063B00001010101010101010101010101010101CD +:1063C00001010101010101010101010101010101BD +:1063D00001010101010101010101010101010101AD +:1063E000010101010101010101010101010101019D +:1063F000010101010101010101010101010101018D +:10640000010101010101010101010101010101017C +:10641000010101010101010101010101010101016C +:10642000010101010101010101010101010101015C +:10643000010101010101010101010101010101014C +:10644000010101010101010101010101010101013C +:10645000010101010101010101010101010101012C +:10646000010101010101010101010101010101011C +:10647000010101010101010101010101010101010C +:1064800001010101010101010101010101010101FC +:1064900001010101010101010101010101010101EC +:1064A00001010101010101010101010101010101DC +:1064B00001010101010101010101010101010101CC +:1064C00001010101010101010101010101010101BC +:1064D00001010101010101010101010101010101AC +:1064E000010101010101010101010101010101019C +:1064F000010101010101010101010101010101018C +:10650000010101010101010101010101010101017B +:10651000010101010101010101010101010101016B +:10652000010101010101010101010101010101015B +:10653000010101010101010101010101010101014B +:10654000010101010101010101010101010101013B +:10655000010101010101010101010101010101012B +:10656000010101010101010101010101010101011B +:10657000010101010101010101010101010101010B +:1065800001010101010101010101010101010101FB +:1065900001010101010101010101010101010101EB +:1065A00001010101010101010101010101010101DB +:1065B00001010101010101010101010101010101CB +:1065C00001010101010101010101010101010101BB +:1065D00001010101010101010101010101010101AB +:1065E000010101010101010101010101010101019B +:1065F000010101010101010101010101010101018B +:10660000010101010101010101010101010101017A +:10661000010101010101010101010101010101016A +:10662000010101010101010101010101010101015A +:10663000010101010101010101010101010101014A +:10664000010101010101010101010101010101013A +:10665000010101010101010101010101010101012A +:10666000010101010101010101010101010101011A +:10667000010101010101010101010101010101010A +:1066800001010101010101010101010101010101FA +:1066900001010101010101010101010101010101EA +:1066A00001010101010101010101010101010101DA +:1066B00001010101010101010101010101010101CA +:1066C00001010101010101010101010101010101BA +:1066D00001010101010101010101010101010101AA +:1066E000010101010101010101010101010101019A +:1066F000010101010101010101010101010101018A +:106700000101010101010101010101010101010179 +:106710000101010101010101010101010101010169 +:106720000101010101010101010101010101010159 +:106730000101010101010101010101010101010149 +:106740000101010101010101010101010101010139 +:106750000101010101010101010101010101010129 +:106760000101010101010101010101010101010119 +:106770000101010101010101010101010101010109 +:1067800001010101010101010101010101010101F9 +:1067900001010101010101010101010101010101E9 +:1067A00001010101010101010101010101010101D9 +:1067B00001010101010101010101010101010101C9 +:1067C00001010101010101010101010101010101B9 +:1067D00001010101010101010101010101010101A9 +:1067E0000101010101010101010101010101010199 +:1067F0000101010101010101010101010101010189 +:106800000101010101010101010101010101010178 +:106810000101010101010101010101010101010168 +:106820000101010101010101010101010101010158 +:106830000101010101010101010101010101010148 +:106840000101010101010101010101010101010138 +:106850000101010101010101010101010101010128 +:106860000101010101010101010101010101010118 +:106870000101010101010101010101010101010108 +:1068800001010101010101010101010101010101F8 +:1068900001010101010101010101010101010101E8 +:1068A00001010101010101010101010101010101D8 +:1068B00001010101010101010101010101010101C8 +:1068C00001010101010101010101010101010101B8 +:1068D00001010101010101010101010101010101A8 +:1068E0000101010101010101010101010101010198 +:1068F0000101010101010101010101010101010188 +:106900000101010101010101010101010101010177 +:106910000101010101010101010101010101010167 +:106920000101010101010101010101010101010157 +:106930000101010101010101010101010101010147 +:106940000101010101010101010101010101010137 +:106950000101010101010101010101010101010127 +:106960000101010101010101010101010101010117 +:106970000101010101010101010101010101010107 +:1069800001010101010101010101010101010101F7 +:1069900001010101010101010101010101010101E7 +:1069A00001010101010101010101010101010101D7 +:1069B00001010101010101010101010101010101C7 +:1069C00001010101010101010101010101010101B7 +:1069D00001010101010101000000000000000000B0 +:1069E00000000000000000000000000000000000A7 +:1069F0000000000000000000000000000000000097 +:106A00000000000000000000000000000000000086 +:106A10000000000000000000000000000000000076 +:106A20000000000000000000000000000000000066 +:106A30000000000000000000000000000000000056 +:106A40000000000000000000000000000000000046 +:106A50000000000000000000000000000000000036 +:106A60000000000000000000000000000000000026 +:106A70000000000000000000000000000000000016 +:106A80000000000000000000000000000000000006 +:106A900000000000000000000000000000000000F6 +:106AA00000000000000000000000000000000000E6 +:106AB00000000000000000000000000000000000D6 +:106AC00000000000000000000000000000000000C6 +:106AD00000000000000000000000000000000000B6 +:106AE00000000000000000000000000000000000A6 +:106AF0000000000000000000000000000000000096 +:106B00000000000000000000000000000000000085 +:106B10000000000000000000000000000000000075 +:106B20000000000000000000000000000000000065 +:106B30000000000000000000000000000000000055 +:106B40000000000000000000000000000000000045 +:106B50000000000000000000000000000000000035 +:106B60000000000000000000000000000000000025 +:106B70000000000000000000000000000000000015 +:106B80000000000000000000000000000000000005 +:106B900000000000000000000000000000000000F5 +:106BA00000000000000000000000000000000000E5 +:106BB00000000000000000000000000000000000D5 +:106BC00000000000000000000000000000000000C5 +:106BD00000000000000000000000000000000000B5 +:106BE00000000000000000000000000000000000A5 +:106BF0000000000000000000000000000000000095 +:106C00000000000000000000000000000000000084 +:106C10000000000000000000000000000000000074 +:106C20000000000000000000000000000000000064 +:106C30000000000000000000000000000000000054 +:106C40000000000000000000000000000000000044 +:106C50000000000000000000000000000000000034 +:106C60000000000000000000000000000000000024 +:106C70000000000000000000000000000000000014 +:106C80000000000000000000000000000000000004 +:106C900000000000000000000000000000000000F4 +:106CA00000000000000000000000000000000000E4 +:106CB00000000000000000000000000000000000D4 +:106CC00000000000000000000000000000000000C4 +:106CD00000000000000000000000000000000000B4 +:106CE00000000000000000000000000000000000A4 +:106CF0000000000000000000000000000000000094 +:106D00000000000000000000000000000000000083 +:106D10000000000000000000000000000000000073 +:106D20000000000000000000000000000000000063 +:106D30000000000000000000000000000000000053 +:106D40000000000000000000000000000000000043 +:106D50000000000000000000000000000000000033 +:106D60000000000000000000000000000000000023 +:106D70000000000000000000000000000000000013 +:106D80000000000000000000000000000000000003 +:106D900000000000000000000000000000000000F3 +:106DA00000000000000000000000000000000000E3 +:106DB00000000000000000000000000000000000D3 +:106DC00000000000000000000000000000000000C3 +:106DD00000000000000000000000000000000000B3 +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000000000000000000000093 +:106E00000000000000000000000000000000000082 +:106E10000000000000000000000000000000000072 +:106E20000000000000000000000000000000000062 +:106E30000000000000000000000000000000000052 +:106E40000000000000000000000000000000000042 +:106E50000000000000000000000000000000000032 +:106E60000000000000000000000000000000000022 +:106E70000000000000000000000000000000000012 +:106E80000000000000000000000000000000000002 +:106E900000000000000000000000000000000000F2 +:106EA00000000000000000000000000000000000E2 +:106EB00000000000000000000000000000000000D2 +:106EC00000000000000000000000000000000000C2 +:106ED00000000000000000000000000000000000B2 +:106EE00000000000000000000000000000000000A2 +:106EF0000000000000000000000000000000000092 +:106F00000000000000000000000000000000000081 +:106F10000000000000000000000000000000000071 +:106F20000000000000000000000000000000000061 +:106F30000000000000000000000000000000000051 +:106F40000000000000000000000000000000000041 +:106F50000000000000000000000000000000000031 +:106F60000000000000000000000000000000000021 +:106F70000000000000000000000000000000000011 +:106F80000000000000000000000000000000000001 +:106F900000000000000000000000000000000000F1 +:106FA00000000000000000000000000000000000E1 +:106FB00000000000000000000000000000000000D1 +:106FC00000000000000000000000000000000000C1 +:106FD000000000000000000202020202020202029F +:106FE0000202020202020202020202020202020281 +:106FF0000202020202020202020202020202020271 +:107000000202020202020202020202020202020260 +:107010000202020202020202020202020202020250 +:107020000202020202020202020202020202020240 +:107030000202020202020202020202020202020230 +:107040000202020202020202020202020202020220 +:107050000202020202020202020202020202020210 +:107060000202020202020202020202020202020200 +:1070700002020202020202020202020202020202F0 +:1070800002020202020202020202020202020202E0 +:1070900002020202020202020202020202020202D0 +:1070A00002020202020202020202020202020202C0 +:1070B00002020202020202020202020202020202B0 +:1070C00002020202020202020202020202020202A0 +:1070D0000202020202020202020202020202020290 +:1070E0000202020202020202020202020202020280 +:1070F0000202020202020202020202020202020270 +:10710000020202020202020202020202020202025F +:10711000020202020202020202020202020202024F +:10712000020202020202020202020202020202023F +:10713000020202020202020202020202020202022F +:10714000020202020202020202020202020202021F +:10715000020202020202020202020202020202020F +:1071600002020202020202020202020202020202FF +:1071700002020202020202020202020202020202EF +:1071800002020202020202020202020202020202DF +:1071900002020202020202020202020202020202CF +:1071A00002020202020202020202020202020202BF +:1071B00002020202020202020202020202020202AF +:1071C000020202020202020202020202020202029F +:1071D000020202020202020202020202020202028F +:1071E000020202020202020202020202020202027F +:1071F000020202020202020202020202020202026F +:10720000020202020202020202020202020202025E +:10721000020202020202020202020202020202024E +:10722000020202020202020202020202020202023E +:10723000020202020202020202020202020202022E +:10724000020202020202020202020202020202021E +:10725000020202020202020202020202020202020E +:1072600002020202020202020202020202020202FE +:1072700002020202020202020202020202020202EE +:1072800002020202020202020202020202020202DE +:1072900002020202020202020202020202020202CE +:1072A00002020202020202020202020202020202BE +:1072B00002020202020202020202020202020202AE +:1072C000020202020202020202020202020202029E +:1072D000020202020202020202020202020202028E +:1072E000020202020202020202020202020202027E +:1072F000020202020202020202020202020202026E +:10730000020202020202020202020202020202025D +:10731000020202020202020202020202020202024D +:10732000020202020202020202020202020202023D +:10733000020202020202020202020202020202022D +:10734000020202020202020202020202020202021D +:10735000020202020202020202020202020202020D +:1073600002020202020202020202020202020202FD +:1073700002020202020202020202020202020202ED +:1073800002020202020202020202020202020202DD +:1073900002020202020202020202020202020202CD +:1073A00002020202020202020202020202020202BD +:1073B00002020202020202020202020202020202AD +:1073C000020202020202020202020202020202029D +:1073D000020202020202020202020202020202028D +:1073E000020202020202020202020202020202027D +:1073F000020202020202020202020202020202026D +:10740000020202020202020202020202020202025C +:10741000020202020202020202020202020202024C +:10742000020202020202020202020202020202023C +:10743000020202020202020202020202020202022C +:10744000020202020202020202020202020202021C +:10745000020202020202020202020202020202020C +:1074600002020202020202020202020202020202FC +:1074700002020202020202020202020202020202EC +:1074800002020202020202020202020202020202DC +:1074900002020202020202020202020202020202CC +:1074A00002020202020202020202020202020202BC +:1074B00002020202020202020202020202020202AC +:1074C000020202020202020202020202020202029C +:1074D000020202020202020202020202020202028C +:1074E000020202020202020202020202020202027C +:1074F000020202020202020202020202020202026C +:10750000020202020202020202020202020202025B +:10751000020202020202020202020202020202024B +:10752000020202020202020202020202020202023B +:10753000020202020202020202020202020202022B +:10754000020202020202020202020202020202021B +:10755000020202020202020202020202020202020B +:1075600002020202020202020202020202020202FB +:1075700002020202020202020202020202020202EB +:1075800002020202020202020202020202020202DB +:1075900002020202020202020202020202020202CB +:1075A00002020202020202020202020202020202BB +:1075B00002020202020202020202020202020202AB +:1075C000020202020202020202020202020202029B +:1075D000020202020202020202020202020202028B +:1075E000020202020202020202020202020202027B +:1075F000020202020202020202020202020202026B +:10760000020202020202020202020202020202025A +:10761000020202020202020202020202020202024A +:10762000020202020202020202020202020202023A +:10763000020202020202020202020202020202022A +:10764000020202020202020202020202020202021A +:10765000020202020202020202020202020202020A +:1076600002020202020202020202020202020202FA +:1076700002020202020202020202020202020202EA +:1076800002020202020202020202020202020202DA +:1076900002020202020202020202020202020202CA +:1076A00002020202020202020202020202020202BA +:1076B00002020202020202020202020202020202AA +:1076C000020202020202020202020202020202029A +:1076D000020202020202020202020202020202028A +:1076E000020202020202020202020202020202027A +:1076F000020202020202020202020202020202026A +:107700000202020202020202020202020202020259 +:107710000202020202020202020202020202020249 +:107720000202020202020202020202020202020239 +:107730000202020202020202020202020202020229 +:107740000202020202020202020202020202020219 +:107750000202020202020202020202020202020209 +:1077600002020202020202020202020202020202F9 +:1077700002020202020202020202020202020202E9 +:1077800002020202020202020202020202020202D9 +:1077900002020202020202020202020202020202C9 +:1077A00002020202020202020202020202020202B9 +:1077B00002020202020202020202020202020202A9 +:1077C0000202020202020202020202020202020299 +:1077D0000202020202020202020202020202020289 +:1077E0000202020202020202020202020202020279 +:1077F0000202020202020202020202020202020269 +:107800000202020202020202020202020202020258 +:107810000202020202020202020202020202020248 +:107820000202020202020202020202020202020238 +:107830000202020202020202020202020202020228 +:107840000202020202020202020202020202020218 +:107850000202020202020202020202020202020208 +:1078600002020202020202020202020202020202F8 +:1078700002020202020202020202020202020202E8 +:1078800002020202020202020202020202020202D8 +:1078900002020202020202020202020202020202C8 +:1078A00002020202020202020202020202020202B8 +:1078B00002020202020202020202020202020202A8 +:1078C0000202020202020202020202020202020298 +:1078D0000202020202020202020202020202020288 +:1078E0000202020202020202020202020202020278 +:1078F0000202020202020202020202020202020268 +:107900000202020202020202020202020202020257 +:107910000202020202020202020202020202020247 +:107920000202020202020202020202020202020237 +:107930000202020202020202020202020202020227 +:107940000202020202020202020202020202020217 +:107950000202020202020202020202020202020207 +:1079600002020202020202020202020202020202F7 +:1079700002020202020202020202020202020202E7 +:1079800002020202020202020202020202020202D7 +:1079900002020202020202020202020202020202C7 +:1079A00002020202020202020202020202020202B7 +:1079B00002020202020202020202020202020202A7 +:1079C0000202020202020202020202020202020297 +:1079D0000202020202020202020202020202020287 +:1079E0000202020202020202020202020202020277 +:1079F0000202020202020202020202020202020267 +:107A00000202020202020202020202020202020256 +:107A10000202020202020202020202020202020246 +:107A20000202020202020202020202020202020236 +:107A30000202020202020202020202020202020226 +:107A40000202020202020202020202020202020216 +:107A50000202020202020202020202020202020206 +:107A600002020202020202020202020202020202F6 +:107A700002020202020202020202020202020202E6 +:107A800002020202020202020202020202020202D6 +:107A900002020202020202020202020202020202C6 +:107AA00002020202020202020202020202020202B6 +:107AB00002020202020202020202020202020202A6 +:107AC0000202020202020202020202020202020296 +:107AD0000202020202020202020202020202020286 +:107AE0000202020202020202020202020202020276 +:107AF0000202020202020202020202020202020266 +:107B00000202020202020202020202020202020255 +:107B10000202020202020202020202020202020245 +:107B20000202020202020202020202020202020235 +:107B30000202020202020202020202020202020225 +:107B40000202020202020202020202020202020215 +:107B50000202020202020202020202020202020205 +:107B600002020202020202020202020202020202F5 +:107B700002020202020202020202020202020202E5 +:107B800002020202020202020202020202020202D5 +:107B900002020202020202020202020202020202C5 +:107BA00002020202020202020202020202020202B5 +:107BB00002020202020202020202020202020202A5 +:107BC0000202020202020202020202020202020295 +:107BD0000202020202020202020202020202020285 +:107BE0000202020202020202020202020202020275 +:107BF0000202020202020202020202020202020265 +:107C00000202020202020202020202020202020254 +:107C10000202020202020202020202020202020244 +:107C20000202020202020202020202020202020234 +:107C30000202020202020202020202020202020224 +:107C40000202020202020202020202020202020214 +:107C50000202020202020202020202020202020204 +:107C600002020202020202020202020202020202F4 +:107C700002020202020202020202020202020202E4 +:107C800002020202020202020202020202020202D4 +:107C900002020202020202020202020202020202C4 +:107CA00002020202020202020202020202020202B4 +:107CB00002020202020202020202020202020202A4 +:107CC0000202020202020202020202020202020294 +:107CD0000202020202020202020202020202020284 +:107CE0000202020202020202020202020202020274 +:107CF0000202020202020202020202020202020264 +:107D00000202020202020202020202020202020253 +:107D10000202020202020202020202020202020243 +:107D20000202020202020202020202020202020233 +:107D30000202020202020202020202020202020223 +:107D40000202020202020202020202020202020213 +:107D50000202020202020202020202020202020203 +:107D600002020202020202020202020202020202F3 +:107D700002020202020202020202020202020202E3 +:107D800002020202020202020202020202020202D3 +:107D900002020202020202020202020202020202C3 +:107DA00002020202020202020202020202020202B3 +:107DB00002020202020202020202020202020202A3 +:107DC0000202020202020202020202020202020293 +:107DD0000202020202020202020202020202020283 +:107DE0000202020202020202020202020202020273 +:107DF0000202020202020202020202020202020263 +:107E00000202020202020202020202020202020252 +:107E10000202020202020202020202020202020242 +:107E20000202020202020202020202020202020232 +:107E30000202020202020202020202020202020222 +:107E40000202020202020202020202020202020212 +:107E50000202020202020202020202020202020202 +:107E600002020202020202020202020202020202F2 +:107E700002020202020202020202020202020202E2 +:107E800002020202020202020202020202020202D2 +:107E900002020202020202020202020202020202C2 +:107EA00002020202020202020202020202020202B2 +:107EB00002020202020202020202020202020202A2 +:107EC0000202020202020202020202020202020292 +:107ED0000202020202020202020202020202020282 +:107EE0000202020202020202020202020202020272 +:107EF0000202020202020202020202020202020262 +:107F00000202020202020202020202020202020251 +:107F10000202020202020202020202020202020241 +:107F20000202020202020202020202020202020231 +:107F30000202020202020202020202020202020221 +:107F40000202020202020202020202020202020211 +:107F50000202020202020202020202020202020201 +:107F600002020202020202020202020202020202F1 +:107F700002020202020202020202020202020202E1 +:107F800002020202020202020202020202020202D1 +:107F900002020202020202020202020202020202C1 +:107FA00002020202020202020202020202020202B1 +:107FB00002020202020202020202020202020202A1 +:107FC0000202020202020202020202020202020291 +:107FD0000202020202020202020202020202020281 +:107FE0000202020202020202020202020202020271 +:107FF0000202020202020202020202020202020261 +:108000000202020202020202020202020202020250 +:108010000202020202020202020202020202020240 +:108020000202020202020202020202020202020230 +:108030000202020202020202020202020202020220 +:108040000202020202020202020202020202020210 +:108050000202020202020202020202020202020200 +:1080600002020202020202020202020202020202F0 +:1080700002020202020202020202020202020202E0 +:1080800002020202020202020202020202020202D0 +:1080900002020202020202020202020202020202C0 +:1080A00002020202020202020202020202020202B0 +:1080B00002020202020202020202020202020202A0 +:1080C0000202020202020202020202020202020290 +:1080D0000202020202020202020202020202020280 +:1080E0000202020202020202020202020202020270 +:1080F0000202020202020202020202020202020260 +:10810000020202020202020202020202020202024F +:10811000020202020202020202020202020202023F +:10812000020202020202020202020202020202022F +:10813000020202020202020202020202020202021F +:10814000020202020202020202020202020202020F +:1081500002020202020202020202020202020202FF +:1081600002020202020202020202020202020202EF +:1081700002020202020202020202020202020202DF +:1081800002020202020202020202020202020202CF +:1081900002020202020202020202020202020202BF +:1081A00002020202020202020202020202020202AF +:1081B000020202020202020202020202020202029F +:1081C000020202020202020202020202020202028F +:1081D000020202020202020202020202020202027F +:1081E000020202020202020202020202020202026F +:1081F000020202020202020202020202020202025F +:10820000020202020202020202020202020202024E +:10821000020202020202020202020202020202023E +:10822000020202020202020202020202020202022E +:10823000020202020202020202020202020202021E +:10824000020202020202020202020202020202020E +:1082500002020202020202020202020202020202FE +:1082600002020202020202020202020202020202EE +:1082700002020202020202020202020202020202DE +:1082800002020202020202020202020202020202CE +:1082900002020202020202020202020202020202BE +:1082A00002020202020202020202020202020202AE +:1082B000020202020202020202020202020202029E +:1082C000020202020202020202020202020202028E +:1082D000020202020202020202020202020202027E +:1082E000020202020202020202020202020202026E +:1082F000020202020202020202020202020202025E +:10830000020202020202020202020202020202024D +:10831000020202020202020202020202020202023D +:10832000020202020202020202020202020202022D +:10833000020202020202020202020202020202021D +:10834000020202020202020202020202020202020D +:1083500002020202020202020202020202020202FD +:1083600002020202020202020202020202020202ED +:1083700002020202020202020202020202020202DD +:1083800002020202020202020202020202020202CD +:1083900002020202020202020202020202020202BD +:1083A00002020202020202020202020202020202AD +:1083B000020202020202020202020202020202029D +:1083C000020202020202020202020202020202028D +:1083D000020202020202020202020202020202027D +:1083E000020202020202020202020202020202026D +:1083F000020202020202020202020202020202025D +:10840000020202020202020202020202020202024C +:10841000020202020202020202020202020202023C +:10842000020202020202020202020202020202022C +:10843000020202020202020202020202020202021C +:10844000020202020202020202020202020202020C +:1084500002020202020202020202020202020202FC +:1084600002020202020202020202020202020202EC +:1084700002020202020202020202020202020202DC +:1084800002020202020202020202020202020202CC +:1084900002020202020202020202020202020202BC +:1084A00002020202020202020202020202020202AC +:1084B000020202020202020202020202020202029C +:1084C000020202020202020202020202020202028C +:1084D000020202020202020202020202020202027C +:1084E000020202020202020202020202020202026C +:1084F000020202020202020202020202020202025C +:10850000020202020202020202020202020202024B +:10851000020202020202020202020202020202023B +:10852000020202020202020202020202020202022B +:10853000020202020202020202020202020202021B +:10854000020202020202020202020202020202020B +:1085500002020202020202020202020202020202FB +:1085600002020202020202020202020202020202EB +:1085700002020202020202020202020202020202DB +:1085800002020202020202020202020202020202CB +:1085900002020202020202020202020202020202BB +:1085A00002020202020202020202020202020202AB +:1085B000020202020202020202020202020202029B +:1085C000020202020202020202020202020202028B +:1085D000020202020202020202020202020202027B +:1085E000020202020202020202020202020202026B +:1085F000020202020202020202020202020202025B +:10860000020202020202020202020202020202024A +:10861000020202020202020202020202020202023A +:10862000020202020202020202020202020202022A +:10863000020202020202020202020202020202021A +:10864000020202020202020202020202020202020A +:1086500002020202020202020202020202020202FA +:1086600002020202020202020202020202020202EA +:1086700002020202020202020202020202020202DA +:1086800002020202020202020202020202020202CA +:1086900002020202020202020202020202020202BA +:1086A00002020202020202020202020202020202AA +:1086B000020202020202020202020202020202029A +:1086C000020202020202020202020202020202028A +:1086D000020202020202020202020202020202027A +:1086E000020202020202020202020202020202026A +:1086F000020202020202020202020202020202025A +:108700000202020202020202020202020202020249 +:108710000202020202020202020202020202020239 +:108720000202020202020202020202020202020229 +:108730000202020202020202020202020202020219 +:108740000202020202020202020202020202020209 +:1087500002020202020202020202020202020202F9 +:1087600002020202020202020202020202020202E9 +:1087700002020202020202020202020202020202D9 +:1087800002020202020202020202020202020202C9 +:1087900002020202020202020202020202020202B9 +:1087A00002020202020202020202020202020202A9 +:1087B0000202020202020202020202020202020299 +:1087C0000202020202020202020202020202020289 +:1087D0000202020202020202020202020202020279 +:1087E0000202020202020202020202020202020269 +:1087F0000202020202020202020202020202020259 +:108800000202020202020202020202020202020248 +:108810000202020202020202020202020202020238 +:108820000202020202020202020202020202020228 +:108830000202020202020202020202020202020218 +:108840000202020202020202020202020202020208 +:1088500002020202020202020202020202020202F8 +:1088600002020202020202020202020202020202E8 +:1088700002020202020202020202020202020202D8 +:1088800002020202020202020202020202020202C8 +:1088900002020202020202020202020202020202B8 +:1088A00002020202020202020202020202020202A8 +:1088B0000202020202020202020202020202020298 +:1088C0000202020202020202020202020202020288 +:1088D0000202020202020202020202020202020278 +:1088E0000202020202020202020202020202020268 +:1088F0000202020202020202020202020202020258 +:108900000202020202020202020202020202020247 +:108910000202020202020202020202020202020237 +:108920000202020202020202020202020202020227 +:108930000202020202020202020202020202020217 +:108940000202020202020202020202020202020207 +:1089500002020202020202020202020202020202F7 +:1089600002020202020202020202020202020202E7 +:1089700002020202020202020202020202020202D7 +:1089800002020202020202020202020202020202C7 +:1089900002020202020202020202020202020202B7 +:1089A00002020202020202020202020202020202A7 +:1089B0000202020202020202020202020202020297 +:1089C0000202020202020202020202020202020287 +:1089D0000202020202020202020202020202020277 +:1089E0000202020202020202020202020202020267 +:1089F0000202020202020202020202020202020257 +:108A00000202020202020202020202020202020246 +:108A10000202020202020202020202020202020236 +:108A20000202020202020202020202020202020226 +:108A30000202020202020202020202020202020216 +:108A40000202020202020202020202020202020206 +:108A500002020202020202020202020202020202F6 +:108A600002020202020202020202020202020202E6 +:108A700002020202020202020202020202020202D6 +:108A800002020202020202020202020202020202C6 +:108A900002020202020202020202020202020202B6 +:108AA00002020202020202020202020202020202A6 +:108AB0000202020202020202020202020202020296 +:108AC0000202020202020202020202020202020286 +:108AD0000202020202020202020202020202020276 +:108AE0000202020202020202020202020202020266 +:108AF0000202020202020202020202020202020256 +:108B00000202020202020202020202020202020245 +:108B10000202020202020202020202020202020235 +:108B20000202020202020202020202020202020225 +:108B30000202020202020202020202020202020215 +:108B40000202020202020202020202020202020205 +:108B500002020202020202020202020202020202F5 +:108B600002020202020202020202020202020202E5 +:108B700002020202020202020202020202020202D5 +:108B800002020202020202020202020202020202C5 +:108B900002020202020202020202020202020202B5 +:108BA00002020202020202020202020202020202A5 +:108BB0000202020202020202020202020202020295 +:108BC0000202020202020202020202020202020285 +:108BD0000202020202020202020202020202020275 +:108BE0000202020202020202020202020202020265 +:108BF0000202020202020202020202020202020255 +:108C00000202020202020202020202020202020244 +:108C10000202020202020202020202020202020234 +:108C20000202020202020202020202020202020224 +:108C30000202020202020202020202020202020214 +:108C40000202020202020202020202020202020204 +:108C500002020202020202020202020202020202F4 +:108C600002020202020202020202020202020202E4 +:108C700002020202020202020202020202020202D4 +:108C800002020202020202020202020202020202C4 +:108C900002020202020202020202020202020202B4 +:108CA00002020202020202020202020202020202A4 +:108CB0000202020202020202020202020202020294 +:108CC0000202020202020202020202020202020284 +:108CD0000202020202020200000000000000000086 +:108CE0000000000000000000000000000000000084 +:108CF0000000000000000000000000000000000074 +:108D00000000000000000000000000000000000063 +:108D10000000000000000000000000000000000053 +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 +:108D40000000000000000000000000000000000023 +:108D50000000000000000000000000000000000013 +:108D60000000000000000000000000000000000003 +:108D700000000000000000000000000000000000F3 +:108D800000000000000000000000000000000000E3 +:108D900000000000000000000000000000000000D3 +:108DA00000000000000000000000000000000000C3 +:108DB00000000000000000000000000000000000B3 +:108DC00000000000000000000000000000000000A3 +:108DD0000000000000000000000000000000000093 +:108DE0000000000000000000000000000000000083 +:108DF0000000000000000000000000000000000073 +:108E00000000000000000000000000000000000062 +:108E10000000000000000000000000000000000052 +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 +:108E50000000000000000000000000000000000012 +:108E60000000000000000000000000000000000002 +:108E700000000000000000000000000000000000F2 +:108E800000000000000000000000000000000000E2 +:108E900000000000000000000000000000000000D2 +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC00000000000000000000000000000000000A2 +:108ED0000000000000000000000000000000000092 +:108EE0000000000000000000000000000000000082 +:108EF0000000000000000000000000000000000072 +:108F00000000000000000000000000000000000061 +:108F10000000000000000000000000000000000051 +:108F20000000000000000000000000000000000041 +:108F30000000000000000000000000000000000031 +:108F40000000000000000000000000000000000021 +:108F50000000000000000000000000000000000011 +:108F60000000000000000000000000000000000001 +:108F700000000000000000000000000000000000F1 +:108F800000000000000000000000000000000000E1 +:108F900000000000000000000000000000000000D1 +:108FA00000000000000000000000000000000000C1 +:108FB00000000000000000000000000000000000B1 +:108FC00000000000000000000000000000000000A1 +:108FD0000000000000000000000000000000000091 +:108FE0000000000000000000000000000000000081 +:108FF0000000000000000000000000000000000071 +:109000000000000000000000000000000000000060 +:109010000000000000000000000000000000000050 +:109020000000000000000000000000000000000040 +:109030000000000000000000000000000000000030 +:109040000000000000000000000000000000000020 +:109050000000000000000000000000000000000010 +:109060000000000000000000000000000000000000 +:1090700000000000000000000000000000000000F0 +:1090800000000000000000000000000000000000E0 +:1090900000000000000000000000000000000000D0 +:1090A00000000000000000000000000000000000C0 +:1090B00000000000000000000000000000000000B0 +:1090C00000000000000000000000000000000000A0 +:1090D0000000000000000000000000000000000090 +:1090E0000000000000000000000000000000000080 +:1090F0000000000000000000000000000000000070 +:10910000000000000000000000000000000000005F +:10911000000000000000000000000000000000004F +:10912000000000000000000000000000000000003F +:10913000000000000000000000000000000000002F +:10914000000000000000000000000000000000001F +:10915000000000000000000000000000000000000F +:1091600000000000000000000000000000000000FF +:1091700000000000000000000000000000000000EF +:1091800000000000000000000000000000000000DF +:1091900000000000000000000000000000000000CF +:1091A00000000000000000000000000000000000BF +:1091B00000000000000000000000000000000000AF +:1091C000000000000000000000000000000000009F +:1091D000000000000000000000000000000000008F +:1091E000000000000000000000000000000000007F +:1091F000000000000000000000000000000000006F +:10920000000000000000000000000000000000005E +:10921000000000000000000000000000000000004E +:10922000000000000000000000000000000000003E +:10923000000000000000000000000000000000002E +:10924000000000000000000000000000000000001E +:10925000000000000000000000000000000000000E +:1092600000000000000000000000000000000000FE +:1092700000000000000000000000000000000000EE +:1092800000000000000000000000000000000000DE +:1092900000000000000000000000000000000000CE +:1092A00000000000000000000000000000000000BE +:1092B00000000000000000000000000000000000AE +:1092C000000000000000000000000000000000009E +:1092D000000000000000000000000000000000008E +:1092E000000000000000000000000000000000007E +:1092F000000000000000000000000000000000006E +:10930000000000000000000000000000000000005D +:10931000000000000000000000000000000000004D +:10932000000000000000000000000000000000003D +:10933000000000000000000000000000000000002D +:10934000000000000000000000000000000000001D +:10935000000000000000000000000000000000000D +:1093600000000000000000000000000000000000FD +:1093700000000000000000000000000000000000ED +:1093800000000000000000000000000000000000DD +:1093900000000000000000000000000000000000CD +:1093A00000000000000000000000000000000000BD +:1093B00000000000000000000000000000000000AD +:1093C000000000000000000000000000000000009D +:1093D000000000000000000000000000000000008D +:1093E000000000000000000000000000000000007D +:1093F000000000000000000000000000000000006D +:10940000000000000000000000000000000000005C +:10941000000000000000000000000000000000004C +:10942000000000000000000000000000000000003C +:10943000000000000000000000000000000000002C +:10944000000000000000000000000000000000001C +:10945000000000000000000000000000000000000C +:1094600000000000000000000000000000000000FC +:1094700000000000000000000000000000000000EC +:1094800000000000000000000000000000000000DC +:1094900000000000000000000000000000000000CC +:1094A00000000000000000000000000000000000BC +:1094B00000000000000000000000000000000000AC +:1094C000000000000000000000000000000000009C +:1094D000000000000000000000000000000000008C +:1094E000000000000000000000000000000000007C +:1094F000000000000000000000000000000000006C +:10950000000000000000000000000000000000005B +:10951000000000000000000000000000000000004B +:10952000000000000000000000000000000000003B +:10953000000000000000000000000000000000002B +:10954000000000000000000000000000000000001B +:10955000000000000000000000000000000000000B +:1095600000000000000000000000000000000000FB +:1095700000000000000000000000000000000000EB +:1095800000000000000000000000000000000000DB +:1095900000000000000000000000000000000000CB +:1095A00000000000000000000000000000000000BB +:1095B00000000000000000000000000000000000AB +:1095C000000000000000000000000000000000009B +:1095D0000000000000000081000000000000000109 +:1095E000010101010101010101010101010101016B +:1095F000010101010101010101010101010101015B +:10960000010101010101010101010101010101014A +:10961000010101010101010101010101010101013A +:10962000010101010101010101010101010101012A +:10963000010101010101010101010101010101011A +:10964000010101010101010101010101010101010A +:1096500001010101010101010101010101010101FA +:1096600001010101010101010101010101010101EA +:1096700001010101010101010101010101010101DA +:1096800001010101010101010101010101010101CA +:1096900001010101010101010101010101010101BA +:1096A00001010101010101010101010101010101AA +:1096B000010101010101010101010101010101019A +:1096C000010101010101010101010101010101018A +:1096D000010101010101010101010101010101017A +:1096E000010101010101010101010101010101016A +:1096F000010101010101010101010101010101015A +:109700000101010101010101010101010101010149 +:109710000101010101010101010101010101010139 +:109720000101010101010101010101010101010129 +:109730000101010101010101010101010101010119 +:109740000101010101010101010101010101010109 +:1097500001010101010101010101010101010101F9 +:1097600001010101010101010101010101010101E9 +:1097700001010101010101010101010101010101D9 +:1097800001010101010101010101010101010101C9 +:1097900001010101010101010101010101010101B9 +:1097A00001010101010101010101010101010101A9 +:1097B0000101010101010101010101010101010199 +:1097C0000101010101010101010101010101010189 +:1097D0000101010101010101010101010101010179 +:1097E0000101010101010101010101010101010169 +:1097F0000101010101010101010101010101010159 +:109800000101010101010101010101010101010148 +:109810000101010101010101010101010101010138 +:109820000101010101010101010101010101010128 +:109830000101010101010101010101010101010118 +:109840000101010101010101010101010101010108 +:1098500001010101010101010101010101010101F8 +:1098600001010101010101010101010101010101E8 +:1098700001010101010101010101010101010101D8 +:1098800001010101010101010101010101010101C8 +:1098900001010101010101010101010101010101B8 +:1098A00001010101010101010101010101010101A8 +:1098B0000101010101010101010101010101010198 +:1098C0000101010101010101010101010101010188 +:1098D0000101010101010101010101010101010178 +:1098E0000101010101010101010101010101010168 +:1098F0000101010101010101010101010101010158 +:109900000101010101010101010101010101010147 +:109910000101010101010101010101010101010137 +:109920000101010101010101010101010101010127 +:109930000101010101010101010101010101010117 +:109940000101010101010101010101010101010107 +:1099500001010101010101010101010101010101F7 +:1099600001010101010101010101010101010101E7 +:1099700001010101010101010101010101010101D7 +:1099800001010101010101010101010101010101C7 +:1099900001010101010101010101010101010101B7 +:1099A00001010101010101010101010101010101A7 +:1099B0000101010101010101010101010101010197 +:1099C0000101010101010101010101010101010187 +:1099D0000101010101010101010101010101010177 +:1099E0000101010101010101010101010101010167 +:1099F0000101010101010101010101010101010157 +:109A00000101010101010101010101010101010146 +:109A10000101010101010101010101010101010136 +:109A20000101010101010101010101010101010126 +:109A30000101010101010101010101010101010116 +:109A40000101010101010101010101010101010106 +:109A500001010101010101010101010101010101F6 +:109A600001010101010101010101010101010101E6 +:109A700001010101010101010101010101010101D6 +:109A800001010101010101010101010101010101C6 +:109A900001010101010101010101010101010101B6 +:109AA00001010101010101010101010101010101A6 +:109AB0000101010101010101010101010101010196 +:109AC0000101010101010101010101010101010186 +:109AD0000101010101010101010101010101010176 +:109AE0000101010101010101010101010101010166 +:109AF0000101010101010101010101010101010156 +:109B00000101010101010101010101010101010145 +:109B10000101010101010101010101010101010135 +:109B20000101010101010101010101010101010125 +:109B30000101010101010101010101010101010115 +:109B40000101010101010101010101010101010105 +:109B500001010101010101010101010101010101F5 +:109B600001010101010101010101010101010101E5 +:109B700001010101010101010101010101010101D5 +:109B800001010101010101010101010101010101C5 +:109B900001010101010101010101010101010101B5 +:109BA00001010101010101010101010101010101A5 +:109BB0000101010101010101010101010101010195 +:109BC0000101010101010101010101010101010185 +:109BD0000101010101010101010101010101010175 +:109BE0000101010101010101010101010101010165 +:109BF0000101010101010101010101010101010155 +:109C00000101010101010101010101010101010144 +:109C10000101010101010101010101010101010134 +:109C20000101010101010101010101010101010124 +:109C30000101010101010101010101010101010114 +:109C40000101010101010101010101010101010104 +:109C500001010101010101010101010101010101F4 +:109C600001010101010101010101010101010101E4 +:109C700001010101010101010101010101010101D4 +:109C800001010101010101010101010101010101C4 +:109C900001010101010101010101010101010101B4 +:109CA00001010101010101010101010101010101A4 +:109CB0000101010101010101010101010101010194 +:109CC0000101010101010101010101010101010184 +:109CD0000101010101010101010101010101010174 +:109CE0000101010101010101010101010101010164 +:109CF0000101010101010101010101010101010154 +:109D00000101010101010101010101010101010143 +:109D10000101010101010101010101010101010133 +:109D20000101010101010101010101010101010123 +:109D30000101010101010101010101010101010113 +:109D40000101010101010101010101010101010103 +:109D500001010101010101010101010101010101F3 +:109D600001010101010101010101010101010101E3 +:109D700001010101010101010101010101010101D3 +:109D800001010101010101010101010101010101C3 +:109D900001010101010101010101010101010101B3 +:109DA00001010101010101010101010101010101A3 +:109DB0000101010101010101010101010101010193 +:109DC0000101010101010101010101010101010183 +:109DD0000101010101010101010101010101010173 +:109DE0000101010101010101010101010101010163 +:109DF0000101010101010101010101010101010153 +:109E00000101010101010101010101010101010142 +:109E10000101010101010101010101010101010132 +:109E20000101010101010101010101010101010122 +:109E30000101010101010101010101010101010112 +:109E40000101010101010101010101010101010102 +:109E500001010101010101010101010101010101F2 +:109E600001010101010101010101010101010101E2 +:109E700001010101010101010101010101010101D2 +:109E800001010101010101010101010101010101C2 +:109E900001010101010101010101010101010101B2 +:109EA00001010101010101010101010101010101A2 +:109EB0000101010101010101010101010101010192 +:109EC0000101010101010101010101010101010182 +:109ED0000101010101010101010101010101010172 +:109EE0000101010101010101010101010101010162 +:109EF0000101010101010101010101010101010152 +:109F00000101010101010101010101010101010141 +:109F10000101010101010101010101010101010131 +:109F20000101010101010101010101010101010121 +:109F30000101010101010101010101010101010111 +:109F40000101010101010101010101010101010101 +:109F500001010101010101010101010101010101F1 +:109F600001010101010101010101010101010101E1 +:109F700001010101010101010101010101010101D1 +:109F800001010101010101010101010101010101C1 +:109F900001010101010101010101010101010101B1 +:109FA00001010101010101010101010101010101A1 +:109FB0000101010101010101010101010101010191 +:109FC0000101010101010101010101010101010181 +:109FD0000101010101010101010101010101010171 +:109FE0000101010101010101010101010101010161 +:109FF0000101010101010101010101010101010151 +:10A000000101010101010101010101010101010140 +:10A010000101010101010101010101010101010130 +:10A020000101010101010101010101010101010120 +:10A030000101010101010101010101010101010110 +:10A040000101010101010101010101010101010100 +:10A0500001010101010101010101010101010101F0 +:10A0600001010101010101010101010101010101E0 +:10A0700001010101010101010101010101010101D0 +:10A0800001010101010101010101010101010101C0 +:10A0900001010101010101010101010101010101B0 +:10A0A00001010101010101010101010101010101A0 +:10A0B0000101010101010101010101010101010190 +:10A0C0000101010101010101010101010101010180 +:10A0D0000101010101010101010101010101010170 +:10A0E0000101010101010101010101010101010160 +:10A0F0000101010101010101010101010101010150 +:10A10000010101010101010101010101010101013F +:10A11000010101010101010101010101010101012F +:10A12000010101010101010101010101010101011F +:10A13000010101010101010101010101010101010F +:10A1400001010101010101010101010101010101FF +:10A1500001010101010101010101010101010101EF +:10A1600001010101010101010101010101010101DF +:10A1700001010101010101010101010101010101CF +:10A1800001010101010101010101010101010101BF +:10A1900001010101010101010101010101010101AF +:10A1A000010101010101010101010101010101019F +:10A1B000010101010101010101010101010101018F +:10A1C000010101010101010101010101010101017F +:10A1D000010101010101010101010101010101016F +:10A1E000010101010101010101010101010101015F +:10A1F000010101010101010101010101010101014F +:10A20000010101010101010101010101010101013E +:10A21000010101010101010101010101010101012E +:10A22000010101010101010101010101010101011E +:10A23000010101010101010101010101010101010E +:10A2400001010101010101010101010101010101FE +:10A2500001010101010101010101010101010101EE +:10A2600001010101010101010101010101010101DE +:10A2700001010101010101010101010101010101CE +:10A2800001010101010101010101010101010101BE +:10A2900001010101010101010101010101010101AE +:10A2A000010101010101010101010101010101019E +:10A2B000010101010101010101010101010101018E +:10A2C000010101010101010101010101010101017E +:10A2D000010101010101010101010101010101016E +:10A2E000010101010101010101010101010101015E +:10A2F000010101010101010101010101010101014E +:10A30000010101010101010101010101010101013D +:10A31000010101010101010101010101010101012D +:10A32000010101010101010101010101010101011D +:10A33000010101010101010101010101010101010D +:10A3400001010101010101010101010101010101FD +:10A3500001010101010101010101010101010101ED +:10A3600001010101010101010101010101010101DD +:10A3700001010101010101010101010101010101CD +:10A3800001010101010101010101010101010101BD +:10A3900001010101010101010101010101010101AD +:10A3A000010101010101010101010101010101019D +:10A3B000010101010101010101010101010101018D +:10A3C000010101010101010101010101010101017D +:10A3D000010101010101010101010101010101016D +:10A3E000010101010101010101010101010101015D +:10A3F000010101010101010101010101010101014D +:10A40000010101010101010101010101010101013C +:10A41000010101010101010101010101010101012C +:10A42000010101010101010101010101010101011C +:10A43000010101010101010101010101010101010C +:10A4400001010101010101010101010101010101FC +:10A4500001010101010101010101010101010101EC +:10A4600001010101010101010101010101010101DC +:10A4700001010101010101010101010101010101CC +:10A4800001010101010101010101010101010101BC +:10A4900001010101010101010101010101010101AC +:10A4A000010101010101010101010101010101019C +:10A4B000010101010101010101010101010101018C +:10A4C000010101010101010101010101010101017C +:10A4D000010101010101010101010101010101016C +:10A4E000010101010101010101010101010101015C +:10A4F000010101010101010101010101010101014C +:10A50000010101010101010101010101010101013B +:10A51000010101010101010101010101010101012B +:10A52000010101010101010101010101010101011B +:10A53000010101010101010101010101010101010B +:10A5400001010101010101010101010101010101FB +:10A5500001010101010101010101010101010101EB +:10A5600001010101010101010101010101010101DB +:10A5700001010101010101010101010101010101CB +:10A5800001010101010101010101010101010101BB +:10A5900001010101010101010101010101010101AB +:10A5A000010101010101010101010101010101019B +:10A5B000010101010101010101010101010101018B +:10A5C000010101010101010101010101010101017B +:10A5D000010101010101010101010101010101016B +:10A5E000010101010101010101010101010101015B +:10A5F000010101010101010101010101010101014B +:10A60000010101010101010101010101010101013A +:10A61000010101010101010101010101010101012A +:10A62000010101010101010101010101010101011A +:10A63000010101010101010101010101010101010A +:10A6400001010101010101010101010101010101FA +:10A6500001010101010101010101010101010101EA +:10A6600001010101010101010101010101010101DA +:10A6700001010101010101010101010101010101CA +:10A6800001010101010101010101010101010101BA +:10A6900001010101010101010101010101010101AA +:10A6A000010101010101010101010101010101019A +:10A6B000010101010101010101010101010101018A +:10A6C000010101010101010101010101010101017A +:10A6D000010101010101010101010101010101016A +:10A6E000010101010101010101010101010101015A +:10A6F000010101010101010101010101010101014A +:10A700000101010101010101010101010101010139 +:10A710000101010101010101010101010101010129 +:10A720000101010101010101010101010101010119 +:10A730000101010101010101010101010101010109 +:10A7400001010101010101010101010101010101F9 +:10A7500001010101010101010101010101010101E9 +:10A7600001010101010101010101010101010101D9 +:10A7700001010101010101010101010101010101C9 +:10A7800001010101010101010101010101010101B9 +:10A7900001010101010101010101010101010101A9 +:10A7A0000101010101010101010101010101010199 +:10A7B0000101010101010101010101010101010189 +:10A7C0000101010101010101010101010101010179 +:10A7D0000101010101010101010101010101010169 +:10A7E0000101010101010101010101010101010159 +:10A7F0000101010101010101010101010101010149 +:10A800000101010101010101010101010101010138 +:10A810000101010101010101010101010101010128 +:10A820000101010101010101010101010101010118 +:10A830000101010101010101010101010101010108 +:10A8400001010101010101010101010101010101F8 +:10A8500001010101010101010101010101010101E8 +:10A8600001010101010101010101010101010101D8 +:10A8700001010101010101010101010101010101C8 +:10A8800001010101010101010101010101010101B8 +:10A8900001010101010101010101010101010101A8 +:10A8A0000101010101010101010101010101010198 +:10A8B0000101010101010101010101010101010188 +:10A8C0000101010101010101010101010101010178 +:10A8D0000101010101010101010101010101010168 +:10A8E0000101010101010101010101010101010158 +:10A8F0000101010101010101010101010101010148 +:10A900000101010101010101010101010101010137 +:10A910000101010101010101010101010101010127 +:10A920000101010101010101010101010101010117 +:10A930000101010101010101010101010101010107 +:10A9400001010101010101010101010101010101F7 +:10A9500001010101010101010101010101010101E7 +:10A9600001010101010101010101010101010101D7 +:10A9700001010101010101010101010101010101C7 +:10A9800001010101010101010101010101010101B7 +:10A9900001010101010101010101010101010101A7 +:10A9A0000101010101010101010101010101010197 +:10A9B0000101010101010101010101010101010187 +:10A9C0000101010101010101010101010101010177 +:10A9D0000101010101010101010101010101010167 +:10A9E0000101010101010101010101010101010157 +:10A9F0000101010101010101010101010101010147 +:10AA00000101010101010101010101010101010136 +:10AA10000101010101010101010101010101010126 +:10AA20000101010101010101010101010101010116 +:10AA30000101010101010101010101010101010106 +:10AA400001010101010101010101010101010101F6 +:10AA500001010101010101010101010101010101E6 +:10AA600001010101010101010101010101010101D6 +:10AA700001010101010101010101010101010101C6 +:10AA800001010101010101010101010101010101B6 +:10AA900001010101010101010101010101010101A6 +:10AAA0000101010101010101010101010101010196 +:10AAB0000101010101010101010101010101010186 +:10AAC0000101010101010101010101010101010176 +:10AAD0000101010101010101010101010101010166 +:10AAE0000101010101010101010101010101010156 +:10AAF0000101010101010101010101010101010146 +:10AB00000101010101010101010101010101010135 +:10AB10000101010101010101010101010101010125 +:10AB20000101010101010101010101010101010115 +:10AB30000101010101010101010101010101010105 +:10AB400001010101010101010101010101010101F5 +:10AB500001010101010101010101010101010101E5 +:10AB600001010101010101010101010101010101D5 +:10AB700001010101010101010101010101010101C5 +:10AB800001010101010101010101010101010101B5 +:10AB900001010101010101010101010101010101A5 +:10ABA0000101010101010101010101010101010195 +:10ABB0000101010101010101010101010101010185 +:10ABC0000101010101010101010101010101010175 +:10ABD0000101010101010101010101010101010165 +:10ABE0000101010101010101010101010101010155 +:10ABF0000101010101010101010101010101010145 +:10AC00000101010101010101010101010101010134 +:10AC10000101010101010101010101010101010124 +:10AC20000101010101010101010101010101010114 +:10AC30000101010101010101010101010101010104 +:10AC400001010101010101010101010101010101F4 +:10AC500001010101010101010101010101010101E4 +:10AC600001010101010101010101010101010101D4 +:10AC700001010101010101010101010101010101C4 +:10AC800001010101010101010101010101010101B4 +:10AC900001010101010101010101010101010101A4 +:10ACA0000101010101010101010101010101010194 +:10ACB0000101010101010101010101010101010184 +:10ACC0000101010101010101010101010101010174 +:10ACD0000101010101010101010101010101010164 +:10ACE0000101010101010101010101010101010154 +:10ACF0000101010101010101010101010101010144 +:10AD00000101010101010101010101010101010133 +:10AD10000101010101010101010101010101010123 +:10AD20000101010101010101010101010101010113 +:10AD30000101010101010101010101010101010103 +:10AD400001010101010101010101010101010101F3 +:10AD500001010101010101010101010101010101E3 +:10AD600001010101010101010101010101010101D3 +:10AD700001010101010101010101010101010101C3 +:10AD800001010101010101010101010101010101B3 +:10AD900001010101010101010101010101010101A3 +:10ADA0000101010101010101010101010101010193 +:10ADB0000101010101010101010101010101010183 +:10ADC0000101010101010101010101010101010173 +:10ADD0000101010101010101010101010101010163 +:10ADE0000101010101010101010101010101010153 +:10ADF0000101010101010101010101010101010143 +:10AE00000101010101010101010101010101010132 +:10AE10000101010101010101010101010101010122 +:10AE20000101010101010101010101010101010112 +:10AE30000101010101010101010101010101010102 +:10AE400001010101010101010101010101010101F2 +:10AE500001010101010101010101010101010101E2 +:10AE600001010101010101010101010101010101D2 +:10AE700001010101010101010101010101010101C2 +:10AE800001010101010101010101010101010101B2 +:10AE900001010101010101010101010101010101A2 +:10AEA0000101010101010101010101010101010192 +:10AEB0000101010101010101010101010101010182 +:10AEC0000101010101010101010101010101010172 +:10AED0000101010101010101010101010101010063 +:10AEE0000000000000000000000000000000000062 +:10AEF0000000000000000000000000000000000052 +:10AF00000000000000000000000000000000000041 +:10AF10000000000000000000000000000000000031 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000000000000011 +:10AF40000000000000000000000000000000000001 +:10AF500000000000000000000000000000000000F1 +:10AF600000000000000000000000000000000000E1 +:10AF700000000000000000000000000000000000D1 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000000A1 +:10AFB0000000000000000000000000000000000091 +:10AFC0000000000000000000000000000000000081 +:10AFD0000000000000000000000000000000000071 +:10AFE0000000000000000000000000000000000061 +:10AFF0000000000000000000000000000000000051 +:10B000000000000000000000000000000000000040 +:10B010000000000000000000000000000000000030 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000000000000F0 +:10B0600000000000000000000000000000000000E0 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000000000000000000000000000000000090 +:10B0C0000000000000000000000000000000000080 +:10B0D0000000000000000000000000000000000070 +:10B0E0000000000000000000000000000000000060 +:10B0F0000000000000000000000000000000000050 +:10B10000000000000000000000000000000000003F +:10B11000000000000000000000000000000000002F +:10B12000000000000000000000000000000000001F +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000000FF +:10B1500000000000000000000000000000000000EF +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000000009F +:10B1B000000000000000000000000000000000008F +:10B1C000000000000000000000000000000000007F +:10B1D000000000000000000000000000000000006F +:10B1E000000000000000000000000000000000005F +:10B1F000000000000000000000000000000000004F +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B22000000000000000000000000000000000001E +:10B23000000000000000000000000000000000000E +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B000000000000000000000000000000000008E +:10B2C000000000000000000000000000000000007E +:10B2D000000000000000000000000000000000006E +:10B2E000000000000000000000000000000000005E +:10B2F000000000000000000000000000000000004E +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000000000000007D +:10B3D000000000000000000000000000000000006D +:10B3E000000000000000000000000000000000005D +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000000000000000000000000000000000FC +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B4700000000000000000000000000000000000CC +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000000000000000000007C +:10B4D000000000000000000000000000000000026A +:10B4E000020202020202020202020202020202023C +:10B4F000020202020202020202020202020202022C +:10B50000020202020202020202020202020202021B +:10B51000020202020202020202020202020202020B +:10B5200002020202020202020202020202020202FB +:10B5300002020202020202020202020202020202EB +:10B5400002020202020202020202020202020202DB +:10B5500002020202020202020202020202020202CB +:10B5600002020202020202020202020202020202BB +:10B5700002020202020202020202020202020202AB +:10B58000020202020202020202020202020202029B +:10B59000020202020202020202020202020202028B +:10B5A000020202020202020202020202020202027B +:10B5B000020202020202020202020202020202026B +:10B5C000020202020202020202020202020202025B +:10B5D000020202020202020202020202020202024B +:10B5E000020202020202020202020202020202023B +:10B5F000020202020202020202020202020202022B +:10B60000020202020202020202020202020202021A +:10B61000020202020202020202020202020202020A +:10B6200002020202020202020202020202020202FA +:10B6300002020202020202020202020202020202EA +:10B6400002020202020202020202020202020202DA +:10B6500002020202020202020202020202020202CA +:10B6600002020202020202020202020202020202BA +:10B6700002020202020202020202020202020202AA +:10B68000020202020202020202020202020202029A +:10B69000020202020202020202020202020202028A +:10B6A000020202020202020202020202020202027A +:10B6B000020202020202020202020202020202026A +:10B6C000020202020202020202020202020202025A +:10B6D000020202020202020202020202020202024A +:10B6E000020202020202020202020202020202023A +:10B6F000020202020202020202020202020202022A +:10B700000202020202020202020202020202020219 +:10B710000202020202020202020202020202020209 +:10B7200002020202020202020202020202020202F9 +:10B7300002020202020202020202020202020202E9 +:10B7400002020202020202020202020202020202D9 +:10B7500002020202020202020202020202020202C9 +:10B7600002020202020202020202020202020202B9 +:10B7700002020202020202020202020202020202A9 +:10B780000202020202020202020202020202020299 +:10B790000202020202020202020202020202020289 +:10B7A0000202020202020202020202020202020279 +:10B7B0000202020202020202020202020202020269 +:10B7C0000202020202020202020202020202020259 +:10B7D0000202020202020202020202020202020249 +:10B7E0000202020202020202020202020202020239 +:10B7F0000202020202020202020202020202020229 +:10B800000202020202020202020202020202020218 +:10B810000202020202020202020202020202020208 +:10B8200002020202020202020202020202020202F8 +:10B8300002020202020202020202020202020202E8 +:10B8400002020202020202020202020202020202D8 +:10B8500002020202020202020202020202020202C8 +:10B8600002020202020202020202020202020202B8 +:10B8700002020202020202020202020202020202A8 +:10B880000202020202020202020202020202020298 +:10B890000202020202020202020202020202020288 +:10B8A0000202020202020202020202020202020278 +:10B8B0000202020202020202020202020202020268 +:10B8C0000202020202020202020202020202020258 +:10B8D0000202020202020202020202020202020248 +:10B8E0000202020202020202020202020202020238 +:10B8F0000202020202020202020202020202020228 +:10B900000202020202020202020202020202020217 +:10B910000202020202020202020202020202020207 +:10B9200002020202020202020202020202020202F7 +:10B9300002020202020202020202020202020202E7 +:10B9400002020202020202020202020202020202D7 +:10B9500002020202020202020202020202020202C7 +:10B9600002020202020202020202020202020202B7 +:10B9700002020202020202020202020202020202A7 +:10B980000202020202020202020202020202020297 +:10B990000202020202020202020202020202020287 +:10B9A0000202020202020202020202020202020277 +:10B9B0000202020202020202020202020202020267 +:10B9C0000202020202020202020202020202020257 +:10B9D0000202020202020202020202020202020247 +:10B9E0000202020202020202020202020202020237 +:10B9F0000202020202020202020202020202020227 +:10BA00000202020202020202020202020202020216 +:10BA10000202020202020202020202020202020206 +:10BA200002020202020202020202020202020202F6 +:10BA300002020202020202020202020202020202E6 +:10BA400002020202020202020202020202020202D6 +:10BA500002020202020202020202020202020202C6 +:10BA600002020202020202020202020202020202B6 +:10BA700002020202020202020202020202020202A6 +:10BA80000202020202020202020202020202020296 +:10BA90000202020202020202020202020202020286 +:10BAA0000202020202020202020202020202020276 +:10BAB0000202020202020202020202020202020266 +:10BAC0000202020202020202020202020202020256 +:10BAD0000202020202020202020202020202020246 +:10BAE0000202020202020202020202020202020236 +:10BAF0000202020202020202020202020202020226 +:10BB00000202020202020202020202020202020215 +:10BB10000202020202020202020202020202020205 +:10BB200002020202020202020202020202020202F5 +:10BB300002020202020202020202020202020202E5 +:10BB400002020202020202020202020202020202D5 +:10BB500002020202020202020202020202020202C5 +:10BB600002020202020202020202020202020202B5 +:10BB700002020202020202020202020202020202A5 +:10BB80000202020202020202020202020202020295 +:10BB90000202020202020202020202020202020285 +:10BBA0000202020202020202020202020202020275 +:10BBB0000202020202020202020202020202020265 +:10BBC0000202020202020202020202020202020255 +:10BBD0000202020202020202020202020202020245 +:10BBE0000202020202020202020202020202020235 +:10BBF0000202020202020202020202020202020225 +:10BC00000202020202020202020202020202020214 +:10BC10000202020202020202020202020202020204 +:10BC200002020202020202020202020202020202F4 +:10BC300002020202020202020202020202020202E4 +:10BC400002020202020202020202020202020202D4 +:10BC500002020202020202020202020202020202C4 +:10BC600002020202020202020202020202020202B4 +:10BC700002020202020202020202020202020202A4 +:10BC80000202020202020202020202020202020294 +:10BC90000202020202020202020202020202020284 +:10BCA0000202020202020202020202020202020274 +:10BCB0000202020202020202020202020202020264 +:10BCC0000202020202020202020202020202020254 +:10BCD0000202020202020202020202020202020244 +:10BCE0000202020202020202020202020202020234 +:10BCF0000202020202020202020202020202020224 +:10BD00000202020202020202020202020202020213 +:10BD10000202020202020202020202020202020203 +:10BD200002020202020202020202020202020202F3 +:10BD300002020202020202020202020202020202E3 +:10BD400002020202020202020202020202020202D3 +:10BD500002020202020202020202020202020202C3 +:10BD600002020202020202020202020202020202B3 +:10BD700002020202020202020202020202020202A3 +:10BD80000202020202020202020202020202020293 +:10BD90000202020202020202020202020202020283 +:10BDA0000202020202020202020202020202020273 +:10BDB0000202020202020202020202020202020263 +:10BDC0000202020202020202020202020202020253 +:10BDD0000202020202020202020202020202020243 +:10BDE0000202020202020202020202020202020233 +:10BDF0000202020202020202020202020202020223 +:10BE00000202020202020202020202020202020212 +:10BE10000202020202020202020202020202020202 +:10BE200002020202020202020202020202020202F2 +:10BE300002020202020202020202020202020202E2 +:10BE400002020202020202020202020202020202D2 +:10BE500002020202020202020202020202020202C2 +:10BE600002020202020202020202020202020202B2 +:10BE700002020202020202020202020202020202A2 +:10BE80000202020202020202020202020202020292 +:10BE90000202020202020202020202020202020282 +:10BEA0000202020202020202020202020202020272 +:10BEB0000202020202020202020202020202020262 +:10BEC0000202020202020202020202020202020252 +:10BED0000202020202020202020202020202020242 +:10BEE0000202020202020202020202020202020232 +:10BEF0000202020202020202020202020202020222 +:10BF00000202020202020202020202020202020211 +:10BF10000202020202020202020202020202020201 +:10BF200002020202020202020202020202020202F1 +:10BF300002020202020202020202020202020202E1 +:10BF400002020202020202020202020202020202D1 +:10BF500002020202020202020202020202020202C1 +:10BF600002020202020202020202020202020202B1 +:10BF700002020202020202020202020202020202A1 +:10BF80000202020202020202020202020202020291 +:10BF90000202020202020202020202020202020281 +:10BFA0000202020202020202020202020202020271 +:10BFB0000202020202020202020202020202020261 +:10BFC0000202020202020202020202020202020251 +:10BFD0000202020202020202020202020202020241 +:10BFE0000202020202020202020202020202020231 +:10BFF0000202020202020202020202020202020221 +:10C000000202020202020202020202020202020210 +:10C010000202020202020202020202020202020200 +:10C0200002020202020202020202020202020202F0 +:10C0300002020202020202020202020202020202E0 +:10C0400002020202020202020202020202020202D0 +:10C0500002020202020202020202020202020202C0 +:10C0600002020202020202020202020202020202B0 +:10C0700002020202020202020202020202020202A0 +:10C080000202020202020202020202020202020290 +:10C090000202020202020202020202020202020280 +:10C0A0000202020202020202020202020202020270 +:10C0B0000202020202020202020202020202020260 +:10C0C0000202020202020202020202020202020250 +:10C0D0000202020202020202020202020202020240 +:10C0E0000202020202020202020202020202020230 +:10C0F0000202020202020202020202020202020220 +:10C10000020202020202020202020202020202020F +:10C1100002020202020202020202020202020202FF +:10C1200002020202020202020202020202020202EF +:10C1300002020202020202020202020202020202DF +:10C1400002020202020202020202020202020202CF +:10C1500002020202020202020202020202020202BF +:10C1600002020202020202020202020202020202AF +:10C17000020202020202020202020202020202029F +:10C18000020202020202020202020202020202028F +:10C19000020202020202020202020202020202027F +:10C1A000020202020202020202020202020202026F +:10C1B000020202020202020202020202020202025F +:10C1C000020202020202020202020202020202024F +:10C1D000020202020202020202020202020202023F +:10C1E000020202020202020202020202020202022F +:10C1F000020202020202020202020202020202021F +:10C20000020202020202020202020202020202020E +:10C2100002020202020202020202020202020202FE +:10C2200002020202020202020202020202020202EE +:10C2300002020202020202020202020202020202DE +:10C2400002020202020202020202020202020202CE +:10C2500002020202020202020202020202020202BE +:10C2600002020202020202020202020202020202AE +:10C27000020202020202020202020202020202029E +:10C28000020202020202020202020202020202028E +:10C29000020202020202020202020202020202027E +:10C2A000020202020202020202020202020202026E +:10C2B000020202020202020202020202020202025E +:10C2C000020202020202020202020202020202024E +:10C2D000020202020202020202020202020202023E +:10C2E000020202020202020202020202020202022E +:10C2F000020202020202020202020202020202021E +:10C30000020202020202020202020202020202020D +:10C3100002020202020202020202020202020202FD +:10C3200002020202020202020202020202020202ED +:10C3300002020202020202020202020202020202DD +:10C3400002020202020202020202020202020202CD +:10C3500002020202020202020202020202020202BD +:10C3600002020202020202020202020202020202AD +:10C37000020202020202020202020202020202029D +:10C38000020202020202020202020202020202028D +:10C39000020202020202020202020202020202027D +:10C3A000020202020202020202020202020202026D +:10C3B000020202020202020202020202020202025D +:10C3C000020202020202020202020202020202024D +:10C3D000020202020202020202020202020202023D +:10C3E000020202020202020202020202020202022D +:10C3F000020202020202020202020202020202021D +:10C40000020202020202020202020202020202020C +:10C4100002020202020202020202020202020202FC +:10C4200002020202020202020202020202020202EC +:10C4300002020202020202020202020202020202DC +:10C4400002020202020202020202020202020202CC +:10C4500002020202020202020202020202020202BC +:10C4600002020202020202020202020202020202AC +:10C47000020202020202020202020202020202029C +:10C48000020202020202020202020202020202028C +:10C49000020202020202020202020202020202027C +:10C4A000020202020202020202020202020202026C +:10C4B000020202020202020202020202020202025C +:10C4C000020202020202020202020202020202024C +:10C4D000020202020202020202020202020202023C +:10C4E000020202020202020202020202020202022C +:10C4F000020202020202020202020202020202021C +:10C50000020202020202020202020202020202020B +:10C5100002020202020202020202020202020202FB +:10C5200002020202020202020202020202020202EB +:10C5300002020202020202020202020202020202DB +:10C5400002020202020202020202020202020202CB +:10C5500002020202020202020202020202020202BB +:10C5600002020202020202020202020202020202AB +:10C57000020202020202020202020202020202029B +:10C58000020202020202020202020202020202028B +:10C59000020202020202020202020202020202027B +:10C5A000020202020202020202020202020202026B +:10C5B000020202020202020202020202020202025B +:10C5C000020202020202020202020202020202024B +:10C5D000020202020202020202020202020202023B +:10C5E000020202020202020202020202020202022B +:10C5F000020202020202020202020202020202021B +:10C60000020202020202020202020202020202020A +:10C6100002020202020202020202020202020202FA +:10C6200002020202020202020202020202020202EA +:10C6300002020202020202020202020202020202DA +:10C6400002020202020202020202020202020202CA +:10C6500002020202020202020202020202020202BA +:10C6600002020202020202020202020202020202AA +:10C67000020202020202020202020202020202029A +:10C68000020202020202020202020202020202028A +:10C69000020202020202020202020202020202027A +:10C6A000020202020202020202020202020202026A +:10C6B000020202020202020202020202020202025A +:10C6C000020202020202020202020202020202024A +:10C6D000020202020202020202020202020202023A +:10C6E000020202020202020202020202020202022A +:10C6F000020202020202020202020202020202021A +:10C700000202020202020202020202020202020209 +:10C7100002020202020202020202020202020202F9 +:10C7200002020202020202020202020202020202E9 +:10C7300002020202020202020202020202020202D9 +:10C7400002020202020202020202020202020202C9 +:10C7500002020202020202020202020202020202B9 +:10C7600002020202020202020202020202020202A9 +:10C770000202020202020202020202020202020299 +:10C780000202020202020202020202020202020289 +:10C790000202020202020202020202020202020279 +:10C7A0000202020202020202020202020202020269 +:10C7B0000202020202020202020202020202020259 +:10C7C0000202020202020202020202020202020249 +:10C7D0000202020202020202020202020202020239 +:10C7E0000202020202020202020202020202020229 +:10C7F0000202020202020202020202020202020219 +:10C800000202020202020202020202020202020208 +:10C8100002020202020202020202020202020202F8 +:10C8200002020202020202020202020202020202E8 +:10C8300002020202020202020202020202020202D8 +:10C8400002020202020202020202020202020202C8 +:10C8500002020202020202020202020202020202B8 +:10C8600002020202020202020202020202020202A8 +:10C870000202020202020202020202020202020298 +:10C880000202020202020202020202020202020288 +:10C890000202020202020202020202020202020278 +:10C8A0000202020202020202020202020202020268 +:10C8B0000202020202020202020202020202020258 +:10C8C0000202020202020202020202020202020248 +:10C8D0000202020202020202020202020202020238 +:10C8E0000202020202020202020202020202020228 +:10C8F0000202020202020202020202020202020218 +:10C900000202020202020202020202020202020207 +:10C9100002020202020202020202020202020202F7 +:10C9200002020202020202020202020202020202E7 +:10C9300002020202020202020202020202020202D7 +:10C9400002020202020202020202020202020202C7 +:10C9500002020202020202020202020202020202B7 +:10C9600002020202020202020202020202020202A7 +:10C970000202020202020202020202020202020297 +:10C980000202020202020202020202020202020287 +:10C990000202020202020202020202020202020277 +:10C9A0000202020202020202020202020202020267 +:10C9B0000202020202020202020202020202020257 +:10C9C0000202020202020202020202020202020247 +:10C9D0000202020202020202020202020202020237 +:10C9E0000202020202020202020202020202020227 +:10C9F0000202020202020202020202020202020217 +:10CA00000202020202020202020202020202020206 +:10CA100002020202020202020202020202020202F6 +:10CA200002020202020202020202020202020202E6 +:10CA300002020202020202020202020202020202D6 +:10CA400002020202020202020202020202020202C6 +:10CA500002020202020202020202020202020202B6 +:10CA600002020202020202020202020202020202A6 +:10CA70000202020202020202020202020202020296 +:10CA80000202020202020202020202020202020286 +:10CA90000202020202020202020202020202020276 +:10CAA0000202020202020202020202020202020266 +:10CAB0000202020202020202020202020202020256 +:10CAC0000202020202020202020202020202020246 +:10CAD0000202020202020202020202020202020236 +:10CAE0000202020202020202020202020202020226 +:10CAF0000202020202020202020202020202020216 +:10CB00000202020202020202020202020202020205 +:10CB100002020202020202020202020202020202F5 +:10CB200002020202020202020202020202020202E5 +:10CB300002020202020202020202020202020202D5 +:10CB400002020202020202020202020202020202C5 +:10CB500002020202020202020202020202020202B5 +:10CB600002020202020202020202020202020202A5 +:10CB70000202020202020202020202020202020295 +:10CB80000202020202020202020202020202020285 +:10CB90000202020202020202020202020202020275 +:10CBA0000202020202020202020202020202020265 +:10CBB0000202020202020202020202020202020255 +:10CBC0000202020202020202020202020202020245 +:10CBD0000202020202020202020202020202020235 +:10CBE0000202020202020202020202020202020225 +:10CBF0000202020202020202020202020202020215 +:10CC00000202020202020202020202020202020204 +:10CC100002020202020202020202020202020202F4 +:10CC200002020202020202020202020202020202E4 +:10CC300002020202020202020202020202020202D4 +:10CC400002020202020202020202020202020202C4 +:10CC500002020202020202020202020202020202B4 +:10CC600002020202020202020202020202020202A4 +:10CC70000202020202020202020202020202020294 +:10CC80000202020202020202020202020202020284 +:10CC90000202020202020202020202020202020274 +:10CCA0000202020202020202020202020202020264 +:10CCB0000202020202020202020202020202020254 +:10CCC0000202020202020202020202020202020244 +:10CCD0000202020202020202020202020202020234 +:10CCE0000202020202020202020202020202020224 +:10CCF0000202020202020202020202020202020214 +:10CD00000202020202020202020202020202020203 +:10CD100002020202020202020202020202020202F3 +:10CD200002020202020202020202020202020202E3 +:10CD300002020202020202020202020202020202D3 +:10CD400002020202020202020202020202020202C3 +:10CD500002020202020202020202020202020202B3 +:10CD600002020202020202020202020202020202A3 +:10CD70000202020202020202020202020202020293 +:10CD80000202020202020202020202020202020283 +:10CD90000202020202020202020202020202020273 +:10CDA0000202020202020202020202020202020263 +:10CDB0000202020202020202020202020202020253 +:10CDC0000202020202020202020202020202020243 +:10CDD0000202020202020202020202020202020035 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE10000000000000000000000000000000000012 +:10CE20000000000000000000000000000000000002 +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000000000000000000000000D2 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000092 +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0000000000000000000000000000000000052 +:10CEE0000000000000000000000000000000000042 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000000000000000011 +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000000000F1 +:10CF400000000000000000000000000000000000E1 +:10CF500000000000000000000000000000000000D1 +:10CF600000000000000000000000000000000000C1 +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000000000000000000071 +:10CFC0000000000000000000000000000000000061 +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000000000000000000000E0 +:10D0500000000000000000000000000000000000D0 +:10D0600000000000000000000000000000000000C0 +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000000000000000000080 +:10D0B0000000000000000000000000000000000070 +:10D0C0000000000000000000000000000000000060 +:10D0D0000000000000000000000000000000000050 +:10D0E0000000000000000000000000000000000040 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D1200000000000000000000000000000000000FF +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000000000000000BF +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000004F +:10D1E000000000000000000000000000000000003F +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE +:10D2700000000000000000000000000000000000AE +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C000000000000000000000000000000000005E +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD +:10D3700000000000000000000000000000000000AD +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000000000000000C9 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000148 +:10D7E0000101010101010101010101010101010129 +:10D7F0000101010101010101010101010101010119 +:10D800000101010101010101010101010101010108 +:10D8100001010101010101010101010101010101F8 +:10D8200001010101010101010101010101010101E8 +:10D8300001010101010101010101010101010101D8 +:10D8400001010101010101010101010101010101C8 +:10D8500001010101010101010101010101010101B8 +:10D8600001010101010101010101010101010101A8 +:10D870000101010101010101010101010101010198 +:10D880000101010101010101010101010101010188 +:10D890000101010101010101010101010101010178 +:10D8A0000101010101010101010101010101010168 +:10D8B0000101010101010101010101010101010158 +:10D8C0000101010101010101010101010101010148 +:10D8D0000101010101010101010101010101010138 +:10D8E0000101010101010101010101010101010128 +:10D8F0000101010101010101010101010101010118 +:10D900000101010101010101010101010101010107 +:10D9100001010101010101010101010101010101F7 +:10D9200001010101010101010101010101010101E7 +:10D9300001010101010101010101010101010101D7 +:10D9400001010101010101010101010101010101C7 +:10D9500001010101010101010101010101010101B7 +:10D9600001010101010101010101010101010101A7 +:10D970000101010101010101010101010101010197 +:10D980000101010101010101010101010101010187 +:10D990000101010101010101010101010101010177 +:10D9A0000101010101010101010101010101010167 +:10D9B0000101010101010101010101010101010157 +:10D9C0000101010101010101010101010101010147 +:10D9D0000101010101010101010101010101010137 +:10D9E0000101010101010101010101010101010127 +:10D9F0000101010101010101010101010101010117 +:10DA00000101010101010101010101010101010106 +:10DA100001010101010101010101010101010101F6 +:10DA200001010101010101010101010101010101E6 +:10DA300001010101010101010101010101010101D6 +:10DA400001010101010101010101010101010101C6 +:10DA500001010101010101010101010101010101B6 +:10DA600001010101010101010101010101010101A6 +:10DA70000101010101010101010101010101010196 +:10DA80000101010101010101010101010101010186 +:10DA90000101010101010101010101010101010176 +:10DAA0000101010101010101010101010101010166 +:10DAB0000101010101010101010101010101010156 +:10DAC0000101010101010101010101010101010146 +:10DAD0000101010101010101010101010101010136 +:10DAE0000101010101010101010101010101010126 +:10DAF0000101010101010101010101010101010116 +:10DB00000101010101010101010101010101010105 +:10DB100001010101010101010101010101010101F5 +:10DB200001010101010101010101010101010101E5 +:10DB300001010101010101010101010101010101D5 +:10DB400001010101010101010101010101010101C5 +:10DB500001010101010101010101010101010101B5 +:10DB600001010101010101010101010101010101A5 +:10DB70000101010101010101010101010101010195 +:10DB80000101010101010101010101010101010185 +:10DB90000101010101010101010101010101010175 +:10DBA0000101010101010101010101010101010165 +:10DBB0000101010101010101010101010101010155 +:10DBC0000101010101010101010101010101010145 +:10DBD0000101010101010101010101010101010135 +:10DBE0000101010101010101010101010101010125 +:10DBF0000101010101010101010101010101010115 +:10DC00000101010101010101010101010101010104 +:10DC100001010101010101010101010101010101F4 +:10DC200001010101010101010101010101010101E4 +:10DC300001010101010101010101010101010101D4 +:10DC400001010101010101010101010101010101C4 +:10DC500001010101010101010101010101010101B4 +:10DC600001010101010101010101010101010101A4 +:10DC70000101010101010101010101010101010194 +:10DC80000101010101010101010101010101010184 +:10DC90000101010101010101010101010101010174 +:10DCA0000101010101010101010101010101010164 +:10DCB0000101010101010101010101010101010154 +:10DCC0000101010101010101010101010101010144 +:10DCD0000101010101010101010101010101010134 +:10DCE0000101010101010101010101010101010124 +:10DCF0000101010101010101010101010101010114 +:10DD00000101010101010101010101010101010103 +:10DD100001010101010101010101010101010101F3 +:10DD200001010101010101010101010101010101E3 +:10DD300001010101010101010101010101010101D3 +:10DD400001010101010101010101010101010101C3 +:10DD500001010101010101010101010101010101B3 +:10DD600001010101010101010101010101010101A3 +:10DD70000101010101010101010101010101010193 +:10DD80000101010101010101010101010101010183 +:10DD90000101010101010101010101010101010173 +:10DDA0000101010101010101010101010101010163 +:10DDB0000101010101010101010101010101010153 +:10DDC0000101010101010101010101010101010143 +:10DDD0000101010101010101010101010101010133 +:10DDE0000101010101010101010101010101010123 +:10DDF0000101010101010101010101010101010113 +:10DE00000101010101010101010101010101010102 +:10DE100001010101010101010101010101010101F2 +:10DE200001010101010101010101010101010101E2 +:10DE300001010101010101010101010101010101D2 +:10DE400001010101010101010101010101010101C2 +:10DE500001010101010101010101010101010101B2 +:10DE600001010101010101010101010101010101A2 +:10DE70000101010101010101010101010101010192 +:10DE80000101010101010101010101010101010182 +:10DE90000101010101010101010101010101010172 +:10DEA0000101010101010101010101010101010162 +:10DEB0000101010101010101010101010101010152 +:10DEC0000101010101010101010101010101010142 +:10DED0000101010101010101010101010101010132 +:10DEE0000101010101010101010101010101010122 +:10DEF0000101010101010101010101010101010112 +:10DF00000101010101010101010101010101010101 +:10DF100001010101010101010101010101010101F1 +:10DF200001010101010101010101010101010101E1 +:10DF300001010101010101010101010101010101D1 +:10DF400001010101010101010101010101010101C1 +:10DF500001010101010101010101010101010101B1 +:10DF600001010101010101010101010101010101A1 +:10DF70000101010101010101010101010101010191 +:10DF80000101010101010101010101010101010181 +:10DF90000101010101010101010101010101010171 +:10DFA0000101010101010101010101010101010161 +:10DFB0000101010101010101010101010101010151 +:10DFC0000101010101010101010101010101010141 +:10DFD0000101010101010101010101010101010131 +:10DFE0000101010101010101010101010101010121 +:10DFF0000101010101010101010101010101010111 +:10E000000101010101010101010101010101010100 +:10E0100001010101010101010101010101010101F0 +:10E0200001010101010101010101010101010101E0 +:10E0300001010101010101010101010101010101D0 +:10E0400001010101010101010101010101010101C0 +:10E0500001010101010101010101010101010101B0 +:10E0600001010101010101010101010101010101A0 +:10E070000101010101010101010101010101010190 +:10E080000101010101010101010101010101010180 +:10E090000101010101010101010101010101010170 +:10E0A0000101010101010101010101010101010160 +:10E0B0000101010101010101010101010101010150 +:10E0C0000101010101010101010101010101010140 +:10E0D0000101010101010101010101010101010130 +:10E0E0000101010101010101010101010101010120 +:10E0F0000101010101010101010101010101010110 +:10E1000001010101010101010101010101010101FF +:10E1100001010101010101010101010101010101EF +:10E1200001010101010101010101010101010101DF +:10E1300001010101010101010101010101010101CF +:10E1400001010101010101010101010101010101BF +:10E1500001010101010101010101010101010101AF +:10E16000010101010101010101010101010101019F +:10E17000010101010101010101010101010101018F +:10E18000010101010101010101010101010101017F +:10E19000010101010101010101010101010101016F +:10E1A000010101010101010101010101010101015F +:10E1B000010101010101010101010101010101014F +:10E1C000010101010101010101010101010101013F +:10E1D000010101010101010101010101010101012F +:10E1E000010101010101010101010101010101011F +:10E1F000010101010101010101010101010101010F +:10E2000001010101010101010101010101010101FE +:10E2100001010101010101010101010101010101EE +:10E2200001010101010101010101010101010101DE +:10E2300001010101010101010101010101010101CE +:10E2400001010101010101010101010101010101BE +:10E2500001010101010101010101010101010101AE +:10E26000010101010101010101010101010101019E +:10E27000010101010101010101010101010101018E +:10E28000010101010101010101010101010101017E +:10E29000010101010101010101010101010101016E +:10E2A000010101010101010101010101010101015E +:10E2B000010101010101010101010101010101014E +:10E2C000010101010101010101010101010101013E +:10E2D000010101010101010101010101010101012E +:10E2E000010101010101010101010101010101011E +:10E2F000010101010101010101010101010101010E +:10E3000001010101010101010101010101010101FD +:10E3100001010101010101010101010101010101ED +:10E3200001010101010101010101010101010101DD +:10E3300001010101010101010101010101010101CD +:10E3400001010101010101010101010101010101BD +:10E3500001010101010101010101010101010101AD +:10E36000010101010101010101010101010101019D +:10E37000010101010101010101010101010101018D +:10E38000010101010101010101010101010101017D +:10E39000010101010101010101010101010101016D +:10E3A000010101010101010101010101010101015D +:10E3B000010101010101010101010101010101014D +:10E3C000010101010101010101010101010101013D +:10E3D000010101010101010101010101010101012D +:10E3E000010101010101010101010101010101011D +:10E3F000010101010101010101010101010101010D +:10E4000001010101010101010101010101010101FC +:10E4100001010101010101010101010101010101EC +:10E4200001010101010101010101010101010101DC +:10E4300001010101010101010101010101010101CC +:10E4400001010101010101010101010101010101BC +:10E4500001010101010101010101010101010101AC +:10E46000010101010101010101010101010101019C +:10E47000010101010101010101010101010101018C +:10E48000010101010101010101010101010101017C +:10E49000010101010101010101010101010101016C +:10E4A000010101010101010101010101010101015C +:10E4B000010101010101010101010101010101014C +:10E4C000010101010101010101010101010101013C +:10E4D000010101010101010101010101010101012C +:10E4E000010101010101010101010101010101011C +:10E4F000010101010101010101010101010101010C +:10E5000001010101010101010101010101010101FB +:10E5100001010101010101010101010101010101EB +:10E5200001010101010101010101010101010101DB +:10E5300001010101010101010101010101010101CB +:10E5400001010101010101010101010101010101BB +:10E5500001010101010101010101010101010101AB +:10E56000010101010101010101010101010101019B +:10E57000010101010101010101010101010101018B +:10E58000010101010101010101010101010101017B +:10E59000010101010101010101010101010101016B +:10E5A000010101010101010101010101010101015B +:10E5B000010101010101010101010101010101014B +:10E5C000010101010101010101010101010101013B +:10E5D000010101010101010101010101010101012B +:10E5E000010101010101010101010101010101011B +:10E5F000010101010101010101010101010101010B +:10E6000001010101010101010101010101010101FA +:10E6100001010101010101010101010101010101EA +:10E6200001010101010101010101010101010101DA +:10E6300001010101010101010101010101010101CA +:10E6400001010101010101010101010101010101BA +:10E6500001010101010101010101010101010101AA +:10E66000010101010101010101010101010101019A +:10E67000010101010101010101010101010101018A +:10E68000010101010101010101010101010101017A +:10E69000010101010101010101010101010101016A +:10E6A000010101010101010101010101010101015A +:10E6B000010101010101010101010101010101014A +:10E6C000010101010101010101010101010101013A +:10E6D000010101010101010101010101010101012A +:10E6E000010101010101010101010101010101011A +:10E6F000010101010101010101010101010101010A +:10E7000001010101010101010101010101010101F9 +:10E7100001010101010101010101010101010101E9 +:10E7200001010101010101010101010101010101D9 +:10E7300001010101010101010101010101010101C9 +:10E7400001010101010101010101010101010101B9 +:10E7500001010101010101010101010101010101A9 +:10E760000101010101010101010101010101010199 +:10E770000101010101010101010101010101010189 +:10E780000101010101010101010101010101010179 +:10E790000101010101010101010101010101010169 +:10E7A0000101010101010101010101010101010159 +:10E7B0000101010101010101010101010101010149 +:10E7C0000101010101010101010101010101010139 +:10E7D0000101010101010101010101010101010129 +:10E7E0000101010101010101010101010101010119 +:10E7F0000101010101010101010101010101010109 +:10E8000001010101010101010101010101010101F8 +:10E8100001010101010101010101010101010101E8 +:10E8200001010101010101010101010101010101D8 +:10E8300001010101010101010101010101010101C8 +:10E8400001010101010101010101010101010101B8 +:10E8500001010101010101010101010101010101A8 +:10E860000101010101010101010101010101010198 +:10E870000101010101010101010101010101010188 +:10E880000101010101010101010101010101010178 +:10E890000101010101010101010101010101010168 +:10E8A0000101010101010101010101010101010158 +:10E8B0000101010101010101010101010101010148 +:10E8C0000101010101010101010101010101010138 +:10E8D0000101010101010101010101010101010128 +:10E8E0000101010101010101010101010101010118 +:10E8F0000101010101010101010101010101010108 +:10E9000001010101010101010101010101010101F7 +:10E9100001010101010101010101010101010101E7 +:10E9200001010101010101010101010101010101D7 +:10E9300001010101010101010101010101010101C7 +:10E9400001010101010101010101010101010101B7 +:10E9500001010101010101010101010101010101A7 +:10E960000101010101010101010101010101010197 +:10E970000101010101010101010101010101010187 +:10E980000101010101010101010101010101010177 +:10E990000101010101010101010101010101010167 +:10E9A0000101010101010101010101010101010157 +:10E9B0000101010101010101010101010101010147 +:10E9C0000101010101010101010101010101010137 +:10E9D0000101010101010101010101010101010127 +:10E9E0000101010101010101010101010101010117 +:10E9F0000101010101010101010101010101010107 +:10EA000001010101010101010101010101010101F6 +:10EA100001010101010101010101010101010101E6 +:10EA200001010101010101010101010101010101D6 +:10EA300001010101010101010101010101010101C6 +:10EA400001010101010101010101010101010101B6 +:10EA500001010101010101010101010101010101A6 +:10EA60000101010101010101010101010101010196 +:10EA70000101010101010101010101010101010186 +:10EA80000101010101010101010101010101010176 +:10EA90000101010101010101010101010101010166 +:10EAA0000101010101010101010101010101010156 +:10EAB0000101010101010101010101010101010146 +:10EAC0000101010101010101010101010101010136 +:10EAD0000101010101010101010101010101010126 +:10EAE0000101010101010101010101010101010116 +:10EAF0000101010101010101010101010101010106 +:10EB000001010101010101010101010101010101F5 +:10EB100001010101010101010101010101010101E5 +:10EB200001010101010101010101010101010101D5 +:10EB300001010101010101010101010101010101C5 +:10EB400001010101010101010101010101010101B5 +:10EB500001010101010101010101010101010101A5 +:10EB60000101010101010101010101010101010195 +:10EB70000101010101010101010101010101010185 +:10EB80000101010101010101010101010101010175 +:10EB90000101010101010101010101010101010165 +:10EBA0000101010101010101010101010101010155 +:10EBB0000101010101010101010101010101010145 +:10EBC0000101010101010101010101010101010135 +:10EBD0000101010101010101010101010101010125 +:10EBE0000101010101010101010101010101010115 +:10EBF0000101010101010101010101010101010105 +:10EC000001010101010101010101010101010101F4 +:10EC100001010101010101010101010101010101E4 +:10EC200001010101010101010101010101010101D4 +:10EC300001010101010101010101010101010101C4 +:10EC400001010101010101010101010101010101B4 +:10EC500001010101010101010101010101010101A4 +:10EC60000101010101010101010101010101010194 +:10EC70000101010101010101010101010101010184 +:10EC80000101010101010101010101010101010174 +:10EC90000101010101010101010101010101010164 +:10ECA0000101010101010101010101010101010154 +:10ECB0000101010101010101010101010101010144 +:10ECC0000101010101010101010101010101010134 +:10ECD0000101010101010101010101010101010124 +:10ECE0000101010101010101010101010101010114 +:10ECF0000101010101010101010101010101010104 +:10ED000001010101010101010101010101010101F3 +:10ED100001010101010101010101010101010101E3 +:10ED200001010101010101010101010101010101D3 +:10ED300001010101010101010101010101010101C3 +:10ED400001010101010101010101010101010101B3 +:10ED500001010101010101010101010101010101A3 +:10ED60000101010101010101010101010101010193 +:10ED70000101010101010101010101010101010183 +:10ED80000101010101010101010101010101010173 +:10ED90000101010101010101010101010101010163 +:10EDA0000101010101010101010101010101010153 +:10EDB0000101010101010101010101010101010143 +:10EDC0000101010101010101010101010101010133 +:10EDD0000101010101010101010101010101010123 +:10EDE0000101010101010101010101010101010113 +:10EDF0000101010101010101010101010101010103 +:10EE000001010101010101010101010101010101F2 +:10EE100001010101010101010101010101010101E2 +:10EE200001010101010101010101010101010101D2 +:10EE300001010101010101010101010101010101C2 +:10EE400001010101010101010101010101010101B2 +:10EE500001010101010101010101010101010101A2 +:10EE60000101010101010101010101010101010192 +:10EE70000101010101010101010101010101010182 +:10EE80000101010101010101010101010101010172 +:10EE90000101010101010101010101010101010162 +:10EEA0000101010101010101010101010101010152 +:10EEB0000101010101010101010101010101010142 +:10EEC0000101010101010101010101010101010132 +:10EED0000101010101010101010101010101010122 +:10EEE0000101010101010101010101010101010112 +:10EEF0000101010101010101010101010101010102 +:10EF000001010101010101010101010101010101F1 +:10EF100001010101010101010101010101010101E1 +:10EF200001010101010101010101010101010101D1 +:10EF300001010101010101010101010101010101C1 +:10EF400001010101010101010101010101010101B1 +:10EF500001010101010101010101010101010101A1 +:10EF60000101010101010101010101010101010191 +:10EF70000101010101010101010101010101010181 +:10EF80000101010101010101010101010101010171 +:10EF90000101010101010101010101010101010161 +:10EFA0000101010101010101010101010101010151 +:10EFB0000101010101010101010101010101010141 +:10EFC0000101010101010101010101010101010131 +:10EFD0000101010101010101010101010101010121 +:10EFE0000101010101010101010101010101010111 +:10EFF0000101010101010101010101010101010101 +:10F0000001010101010101010101010101010101F0 +:10F0100001010101010101010101010101010101E0 +:10F0200001010101010101010101010101010101D0 +:10F0300001010101010101010101010101010101C0 +:10F0400001010101010101010101010101010101B0 +:10F0500001010101010101010101010101010101A0 +:10F060000101010101010101010101010101010190 +:10F070000101010101010101010101010101010180 +:10F080000101010101010101010101010101010170 +:10F090000101010101010101010101010101010160 +:10F0A0000101010101010101010101010101010150 +:10F0B0000101010101010101010101010101010140 +:10F0C0000101010101010101010101010101010130 +:10F0D0000101010101010101010101010101010021 +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F1100000000000000000000000000000000000EF +:10F1200000000000000000000000000000000000DF +:10F1300000000000000000000000000000000000CF +:10F1400000000000000000000000000000000000BF +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000000000009F +:10F17000000000000000000000000000000000008F +:10F18000000000000000000000000000000000007F +:10F19000000000000000000000000000000000006F +:10F1A000000000000000000000000000000000005F +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F +:10F1D000000000000000000000000000000000002F +:10F1E000000000000000000000000000000000001F +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE +:10F2100000000000000000000000000000000000EE +:10F2200000000000000000000000000000000000DE +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000000000000000BE +:10F2500000000000000000000000000000000000AE +:10F26000000000000000000000000000000000009E +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000000000000007E +:10F29000000000000000000000000000000000006E +:10F2A000000000000000000000000000000000005E +:10F2B000000000000000000000000000000000004E +:10F2C000000000000000000000000000000000003E +:10F2D000000000000000000000000000000000002E +:10F2E000000000000000000000000000000000001E +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000000000FD +:10F3100000000000000000000000000000000000ED +:10F3200000000000000000000000000000000000DD +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F36000000000000000000000000000000000009D +:10F37000000000000000000000000000000000008D +:10F38000000000000000000000000000000000007D +:10F39000000000000000000000000000000000006D +:10F3A000000000000000000000000000000000005D +:10F3B000000000000000000000000000000000004D +:10F3C000000000000000000000000000000000003D +:10F3D000000000000000000000000000000000002D +:10F3E000000000000000000000000000000000001D +:10F3F000000000000000000000000000000000000D +:10F4000000000000000000000000000000000000FC +:10F4100000000000000000000000000000000000EC +:10F4200000000000000000000000000000000000DC +:10F4300000000000000000000000000000000000CC +:10F4400000000000000000000000000000000000BC +:10F4500000000000000000000000000000000000AC +:10F46000000000000000000000000000000000009C +:10F47000000000000000000000000000000000008C +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B000000000000000000000000000000000004C +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B000000000000000000000000000000000004B +:10F5C000000000000000000000000000000000003B +:10F5D000000000000000000000000000000000002B +:10F5E000000000000000000000000000000000001B +:10F5F000000000000000000000000000000000000B +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F6400000000000000000000000000000000000BA +:10F6500000000000000000000000000000000000AA +:10F66000000000000000000000000000000000009A +:10F67000000000000000000000000000000000008A +:10F68000000000000000000000000000000000007A +:10F69000000000000000000000000000000000006A +:10F6A000000000000000000000000000000000005A +:10F6B000000000000000000000000000000000004A +:10F6C000000000000000000000000000000000003A +:10F6D0000000000000000000000000000000000228 +:10F6E00002020202020202020202020202020202FA +:10F6F00002020202020202020202020202020202EA +:10F7000002020202020202020202020202020202D9 +:10F7100002020202020202020202020202020202C9 +:10F7200002020202020202020202020202020202B9 +:10F7300002020202020202020202020202020202A9 +:10F740000202020202020202020202020202020299 +:10F750000202020202020202020202020202020289 +:10F760000202020202020202020202020202020279 +:10F770000202020202020202020202020202020269 +:10F780000202020202020202020202020202020259 +:10F790000202020202020202020202020202020249 +:10F7A0000202020202020202020202020202020239 +:10F7B0000202020202020202020202020202020229 +:10F7C0000202020202020202020202020202020219 +:10F7D0000202020202020202020202020202020209 +:10F7E00002020202020202020202020202020202F9 +:10F7F00002020202020202020202020202020202E9 +:10F8000002020202020202020202020202020202D8 +:10F8100002020202020202020202020202020202C8 +:10F8200002020202020202020202020202020202B8 +:10F8300002020202020202020202020202020202A8 +:10F840000202020202020202020202020202020298 +:10F850000202020202020202020202020202020288 +:10F860000202020202020202020202020202020278 +:10F870000202020202020202020202020202020268 +:10F880000202020202020202020202020202020258 +:10F890000202020202020202020202020202020248 +:10F8A0000202020202020202020202020202020238 +:10F8B0000202020202020202020202020202020228 +:10F8C0000202020202020202020202020202020218 +:10F8D0000202020202020202020202020202020208 +:10F8E00002020202020202020202020202020202F8 +:10F8F00002020202020202020202020202020202E8 +:10F9000002020202020202020202020202020202D7 +:10F9100002020202020202020202020202020202C7 +:10F9200002020202020202020202020202020202B7 +:10F9300002020202020202020202020202020202A7 +:10F940000202020202020202020202020202020297 +:10F950000202020202020202020202020202020287 +:10F960000202020202020202020202020202020277 +:10F970000202020202020202020202020202020267 +:10F980000202020202020202020202020202020257 +:10F990000202020202020202020202020202020247 +:10F9A0000202020202020202020202020202020237 +:10F9B0000202020202020202020202020202020227 +:10F9C0000202020202020202020202020202020217 +:10F9D0000202020202020202020202020202020207 +:10F9E00002020202020202020202020202020202F7 +:10F9F00002020202020202020202020202020202E7 +:10FA000002020202020202020202020202020202D6 +:10FA100002020202020202020202020202020202C6 +:10FA200002020202020202020202020202020202B6 +:10FA300002020202020202020202020202020202A6 +:10FA40000202020202020202020202020202020296 +:10FA50000202020202020202020202020202020286 +:10FA60000202020202020202020202020202020276 +:10FA70000202020202020202020202020202020266 +:10FA80000202020202020202020202020202020256 +:10FA90000202020202020202020202020202020246 +:10FAA0000202020202020202020202020202020236 +:10FAB0000202020202020202020202020202020226 +:10FAC0000202020202020202020202020202020216 +:10FAD0000202020202020202020202020202020206 +:10FAE00002020202020202020202020202020202F6 +:10FAF00002020202020202020202020202020202E6 +:10FB000002020202020202020202020202020202D5 +:10FB100002020202020202020202020202020202C5 +:10FB200002020202020202020202020202020202B5 +:10FB300002020202020202020202020202020202A5 +:10FB40000202020202020202020202020202020295 +:10FB50000202020202020202020202020202020285 +:10FB60000202020202020202020202020202020275 +:10FB70000202020202020202020202020202020265 +:10FB80000202020202020202020202020202020255 +:10FB90000202020202020202020202020202020245 +:10FBA0000202020202020202020202020202020235 +:10FBB0000202020202020202020202020202020225 +:10FBC0000202020202020202020202020202020215 +:10FBD0000202020202020202020202020202020205 +:10FBE00002020202020202020202020202020202F5 +:10FBF00002020202020202020202020202020202E5 +:10FC000002020202020202020202020202020202D4 +:10FC100002020202020202020202020202020202C4 +:10FC200002020202020202020202020202020202B4 +:10FC300002020202020202020202020202020202A4 +:10FC40000202020202020202020202020202020294 +:10FC50000202020202020202020202020202020284 +:10FC60000202020202020202020202020202020274 +:10FC70000202020202020202020202020202020264 +:10FC80000202020202020202020202020202020254 +:10FC90000202020202020202020202020202020244 +:10FCA0000202020202020202020202020202020234 +:10FCB0000202020202020202020202020202020224 +:10FCC0000202020202020202020202020202020214 +:10FCD0000202020202020202020202020202020204 +:10FCE00002020202020202020202020202020202F4 +:10FCF00002020202020202020202020202020202E4 +:10FD000002020202020202020202020202020202D3 +:10FD100002020202020202020202020202020202C3 +:10FD200002020202020202020202020202020202B3 +:10FD300002020202020202020202020202020202A3 +:10FD40000202020202020202020202020202020293 +:10FD50000202020202020202020202020202020283 +:10FD60000202020202020202020202020202020273 +:10FD70000202020202020202020202020202020263 +:10FD80000202020202020202020202020202020253 +:10FD90000202020202020202020202020202020243 +:10FDA0000202020202020202020202020202020233 +:10FDB0000202020202020202020202020202020223 +:10FDC0000202020202020202020202020202020213 +:10FDD0000202020202020202020202020202020203 +:10FDE00002020202020202020202020202020202F3 +:10FDF00002020202020202020202020202020202E3 +:10FE000002020202020202020202020202020202D2 +:10FE100002020202020202020202020202020202C2 +:10FE200002020202020202020202020202020202B2 +:10FE300002020202020202020202020202020202A2 +:10FE40000202020202020202020202020202020292 +:10FE50000202020202020202020202020202020282 +:10FE60000202020202020202020202020202020272 +:10FE70000202020202020202020202020202020262 +:10FE80000202020202020202020202020202020252 +:10FE90000202020202020202020202020202020242 +:10FEA0000202020202020202020202020202020232 +:10FEB0000202020202020202020202020202020222 +:10FEC0000202020202020202020202020202020212 +:10FED0000202020202020202020202020202020202 +:10FEE00002020202020202020202020202020202F2 +:10FEF00002020202020202020202020202020202E2 +:10FF000002020202020202020202020202020202D1 +:10FF100002020202020202020202020202020202C1 +:10FF200002020202020202020202020202020202B1 +:10FF300002020202020202020202020202020202A1 +:10FF40000202020202020202020202020202020291 +:10FF50000202020202020202020202020202020281 +:10FF60000202020202020202020202020202020271 +:10FF70000202020202020202020202020202020261 +:10FF80000202020202020202020202020202020251 +:10FF90000202020202020202020202020202020241 +:10FFA0000202020202020202020202020202020231 +:10FFB0000202020202020202020202020202020221 +:10FFC0000202020202020202020202020202020211 +:10FFD0000202020202020202020202020202020201 +:10FFE00002020202020202020202020202020202F1 +:10FFF00002020202020202020202020202020202E1 +:020000021000EC +:1000000002020202020202020202020202020202D0 +:1000100002020202020202020202020202020202C0 +:1000200002020202020202020202020202020202B0 +:1000300002020202020202020202020202020202A0 +:100040000202020202020202020202020202020290 +:100050000202020202020202020202020202020280 +:100060000202020202020202020202020202020270 +:100070000202020202020202020202020202020260 +:100080000202020202020202020202020202020250 +:100090000202020202020202020202020202020240 +:1000A0000202020202020202020202020202020230 +:1000B0000202020202020202020202020202020220 +:1000C0000202020202020202020202020202020210 +:1000D0000202020202020202020202020202020200 +:1000E00002020202020202020202020202020202F0 +:1000F00002020202020202020202020202020202E0 +:1001000002020202020202020202020202020202CF +:1001100002020202020202020202020202020202BF +:1001200002020202020202020202020202020202AF +:10013000020202020202020202020202020202029F +:10014000020202020202020202020202020202028F +:10015000020202020202020202020202020202027F +:10016000020202020202020202020202020202026F +:10017000020202020202020202020202020202025F +:10018000020202020202020202020202020202024F +:10019000020202020202020202020202020202023F +:1001A000020202020202020202020202020202022F +:1001B000020202020202020202020202020202021F +:1001C000020202020202020202020202020202020F +:1001D00002020202020202020202020202020202FF +:1001E00002020202020202020202020202020202EF +:1001F00002020202020202020202020202020202DF +:1002000002020202020202020202020202020202CE +:1002100002020202020202020202020202020202BE +:1002200002020202020202020202020202020202AE +:10023000020202020202020202020202020202029E +:10024000020202020202020202020202020202028E +:10025000020202020202020202020202020202027E +:10026000020202020202020202020202020202026E +:10027000020202020202020202020202020202025E +:10028000020202020202020202020202020202024E +:10029000020202020202020202020202020202023E +:1002A000020202020202020202020202020202022E +:1002B000020202020202020202020202020202021E +:1002C000020202020202020202020202020202020E +:1002D00002020202020202020202020202020202FE +:1002E00002020202020202020202020202020202EE +:1002F00002020202020202020202020202020202DE +:1003000002020202020202020202020202020202CD +:1003100002020202020202020202020202020202BD +:1003200002020202020202020202020202020202AD +:10033000020202020202020202020202020202029D +:10034000020202020202020202020202020202028D +:10035000020202020202020202020202020202027D +:10036000020202020202020202020202020202026D +:10037000020202020202020202020202020202025D +:10038000020202020202020202020202020202024D +:10039000020202020202020202020202020202023D +:1003A000020202020202020202020202020202022D +:1003B000020202020202020202020202020202021D +:1003C000020202020202020202020202020202020D +:1003D00002020202020202020202020202020202FD +:1003E00002020202020202020202020202020202ED +:1003F00002020202020202020202020202020202DD +:1004000002020202020202020202020202020202CC +:1004100002020202020202020202020202020202BC +:1004200002020202020202020202020202020202AC +:10043000020202020202020202020202020202029C +:10044000020202020202020202020202020202028C +:10045000020202020202020202020202020202027C +:10046000020202020202020202020202020202026C +:10047000020202020202020202020202020202025C +:10048000020202020202020202020202020202024C +:10049000020202020202020202020202020202023C +:1004A000020202020202020202020202020202022C +:1004B000020202020202020202020202020202021C +:1004C000020202020202020202020202020202020C +:1004D00002020202020202020202020202020202FC +:1004E00002020202020202020202020202020202EC +:1004F00002020202020202020202020202020202DC +:1005000002020202020202020202020202020202CB +:1005100002020202020202020202020202020202BB +:1005200002020202020202020202020202020202AB +:10053000020202020202020202020202020202029B +:10054000020202020202020202020202020202028B +:10055000020202020202020202020202020202027B +:10056000020202020202020202020202020202026B +:10057000020202020202020202020202020202025B +:10058000020202020202020202020202020202024B +:10059000020202020202020202020202020202023B +:1005A000020202020202020202020202020202022B +:1005B000020202020202020202020202020202021B +:1005C000020202020202020202020202020202020B +:1005D00002020202020202020202020202020202FB +:1005E00002020202020202020202020202020202EB +:1005F00002020202020202020202020202020202DB +:1006000002020202020202020202020202020202CA +:1006100002020202020202020202020202020202BA +:1006200002020202020202020202020202020202AA +:10063000020202020202020202020202020202029A +:10064000020202020202020202020202020202028A +:10065000020202020202020202020202020202027A +:10066000020202020202020202020202020202026A +:10067000020202020202020202020202020202025A +:10068000020202020202020202020202020202024A +:10069000020202020202020202020202020202023A +:1006A000020202020202020202020202020202022A +:1006B000020202020202020202020202020202021A +:1006C000020202020202020202020202020202020A +:1006D00002020202020202020202020202020202FA +:1006E00002020202020202020202020202020202EA +:1006F00002020202020202020202020202020202DA +:1007000002020202020202020202020202020202C9 +:1007100002020202020202020202020202020202B9 +:1007200002020202020202020202020202020202A9 +:100730000202020202020202020202020202020299 +:100740000202020202020202020202020202020289 +:100750000202020202020202020202020202020279 +:100760000202020202020202020202020202020269 +:100770000202020202020202020202020202020259 +:100780000202020202020202020202020202020249 +:100790000202020202020202020202020202020239 +:1007A0000202020202020202020202020202020229 +:1007B0000202020202020202020202020202020219 +:1007C0000202020202020202020202020202020209 +:1007D00002020202020202020202020202020202F9 +:1007E00002020202020202020202020202020202E9 +:1007F00002020202020202020202020202020202D9 +:1008000002020202020202020202020202020202C8 +:1008100002020202020202020202020202020202B8 +:1008200002020202020202020202020202020202A8 +:100830000202020202020202020202020202020298 +:100840000202020202020202020202020202020288 +:100850000202020202020202020202020202020278 +:100860000202020202020202020202020202020268 +:100870000202020202020202020202020202020258 +:100880000202020202020202020202020202020248 +:100890000202020202020202020202020202020238 +:1008A0000202020202020202020202020202020228 +:1008B0000202020202020202020202020202020218 +:1008C0000202020202020202020202020202020208 +:1008D00002020202020202020202020202020202F8 +:1008E00002020202020202020202020202020202E8 +:1008F00002020202020202020202020202020202D8 +:1009000002020202020202020202020202020202C7 +:1009100002020202020202020202020202020202B7 +:1009200002020202020202020202020202020202A7 +:100930000202020202020202020202020202020297 +:100940000202020202020202020202020202020287 +:100950000202020202020202020202020202020277 +:100960000202020202020202020202020202020267 +:100970000202020202020202020202020202020257 +:100980000202020202020202020202020202020247 +:100990000202020202020202020202020202020237 +:1009A0000202020202020202020202020202020227 +:1009B0000202020202020202020202020202020217 +:1009C0000202020202020202020202020202020207 +:1009D00002020202020202020202020202020202F7 +:1009E00002020202020202020202020202020202E7 +:1009F00002020202020202020202020202020202D7 +:100A000002020202020202020202020202020202C6 +:100A100002020202020202020202020202020202B6 +:100A200002020202020202020202020202020202A6 +:100A30000202020202020202020202020202020296 +:100A40000202020202020202020202020202020286 +:100A50000202020202020202020202020202020276 +:100A60000202020202020202020202020202020266 +:100A70000202020202020202020202020202020256 +:100A80000202020202020202020202020202020246 +:100A90000202020202020202020202020202020236 +:100AA0000202020202020202020202020202020226 +:100AB0000202020202020202020202020202020216 +:100AC0000202020202020202020202020202020206 +:100AD00002020202020202020202020202020202F6 +:100AE00002020202020202020202020202020202E6 +:100AF00002020202020202020202020202020202D6 +:100B000002020202020202020202020202020202C5 +:100B100002020202020202020202020202020202B5 +:100B200002020202020202020202020202020202A5 +:100B30000202020202020202020202020202020295 +:100B40000202020202020202020202020202020285 +:100B50000202020202020202020202020202020275 +:100B60000202020202020202020202020202020265 +:100B70000202020202020202020202020202020255 +:100B80000202020202020202020202020202020245 +:100B90000202020202020202020202020202020235 +:100BA0000202020202020202020202020202020225 +:100BB0000202020202020202020202020202020215 +:100BC0000202020202020202020202020202020205 +:100BD00002020202020202020202020202020202F5 +:100BE00002020202020202020202020202020202E5 +:100BF00002020202020202020202020202020202D5 +:100C000002020202020202020202020202020202C4 +:100C100002020202020202020202020202020202B4 +:100C200002020202020202020202020202020202A4 +:100C30000202020202020202020202020202020294 +:100C40000202020202020202020202020202020284 +:100C50000202020202020202020202020202020274 +:100C60000202020202020202020202020202020264 +:100C70000202020202020202020202020202020254 +:100C80000202020202020202020202020202020244 +:100C90000202020202020202020202020202020234 +:100CA0000202020202020202020202020202020224 +:100CB0000202020202020202020202020202020214 +:100CC0000202020202020202020202020202020204 +:100CD00002020202020202020202020202020202F4 +:100CE00002020202020202020202020202020202E4 +:100CF00002020202020202020202020202020202D4 +:100D000002020202020202020202020202020202C3 +:100D100002020202020202020202020202020202B3 +:100D200002020202020202020202020202020202A3 +:100D30000202020202020202020202020202020293 +:100D40000202020202020202020202020202020283 +:100D50000202020202020202020202020202020273 +:100D60000202020202020202020202020202020263 +:100D70000202020202020202020202020202020253 +:100D80000202020202020202020202020202020243 +:100D90000202020202020202020202020202020233 +:100DA0000202020202020202020202020202020223 +:100DB0000202020202020202020202020202020213 +:100DC0000202020202020202020202020202020203 +:100DD00002020202020202020202020202020202F3 +:100DE00002020202020202020202020202020202E3 +:100DF00002020202020202020202020202020202D3 +:100E000002020202020202020202020202020202C2 +:100E100002020202020202020202020202020202B2 +:100E200002020202020202020202020202020202A2 +:100E30000202020202020202020202020202020292 +:100E40000202020202020202020202020202020282 +:100E50000202020202020202020202020202020272 +:100E60000202020202020202020202020202020262 +:100E70000202020202020202020202020202020252 +:100E80000202020202020202020202020202020242 +:100E90000202020202020202020202020202020232 +:100EA0000202020202020202020202020202020222 +:100EB0000202020202020202020202020202020212 +:100EC0000202020202020202020202020202020202 +:100ED00002020202020202020202020202020202F2 +:100EE00002020202020202020202020202020202E2 +:100EF00002020202020202020202020202020202D2 +:100F000002020202020202020202020202020202C1 +:100F100002020202020202020202020202020202B1 +:100F200002020202020202020202020202020202A1 +:100F30000202020202020202020202020202020291 +:100F40000202020202020202020202020202020281 +:100F50000202020202020202020202020202020271 +:100F60000202020202020202020202020202020261 +:100F70000202020202020202020202020202020251 +:100F80000202020202020202020202020202020241 +:100F90000202020202020202020202020202020231 +:100FA0000202020202020202020202020202020221 +:100FB0000202020202020202020202020202020211 +:100FC0000202020202020202020202020202020201 +:100FD00002020202020202020202020202020200F3 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000000F1 +:1010000000000000000000000000000000000000E0 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 +:1010300000000000000000000000000000000000B0 +:1010400000000000000000000000000000000000A0 +:101050000000000000000000000000000000000090 +:101060000000000000000000000000000000000080 +:101070000000000000000000000000000000000070 +:101080000000000000000000000000000000000060 +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D0000000000000000000000000000000000010 +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000000000000000000000DF +:1011100000000000000000000000000000000000CF +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000000000009F +:10115000000000000000000000000000000000008F +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F +:10118000000000000000000000000000000000005F +:10119000000000000000000000000000000000004F +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000000000000000000FF +:1011F00000000000000000000000000000000000EF +:1012000000000000000000000000000000000000DE +:1012100000000000000000000000000000000000CE +:1012200000000000000000000000000000000000BE +:1012300000000000000000000000000000000000AE +:10124000000000000000000000000000000000009E +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000000000007E +:10127000000000000000000000000000000000006E +:10128000000000000000000000000000000000005E +:10129000000000000000000000000000000000004E +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000000000000000FE +:1012F00000000000000000000000000000000000EE +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD +:1013200000000000000000000000000000000000BD +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000000000000000000000000000007D +:10137000000000000000000000000000000000006D +:10138000000000000000000000000000000000005D +:10139000000000000000000000000000000000004D +:1013A000000000000000000000000000000000003D +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D000000000000000000000000000000000000D +:1013E00000000000000000000000000000000000FD +:1013F00000000000000000000000000000000000ED +:1014000000000000000000000000000000000000DC +:1014100000000000000000000000000000000000CC +:1014200000000000000000000000000000000000BC +:1014300000000000000000000000000000000000AC +:10144000000000000000000000000000000000009C +:10145000000000000000000000000000000000008C +:10146000000000000000000000000000000000007C +:10147000000000000000000000000000000000006C +:10148000000000000000000000000000000000005C +:10149000000000000000000000000000000000004C +:1014A000000000000000000000000000000000003C +:1014B000000000000000000000000000000000002C +:1014C000000000000000000000000000000000001C +:1014D000000000000000000000000000000000000C +:1014E00000000000000000000000000000000000FC +:1014F00000000000000000000000000000000000EC +:1015000000000000000000000000000000000000DB +:1015100000000000000000000000000000000000CB +:1015200000000000000000000000000000000000BB +:1015300000000000000000000000000000000000AB +:10154000000000000000000000000000000000009B +:10155000000000000000000000000000000000008B +:10156000000000000000000000000000000000007B +:10157000000000000000000000000000000000006B +:10158000000000000000000000000000000000005B +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B000000000000000000000000000000000002B +:1015C000000000000000000000000000000000001B +:1015D000000000000000000000000000000000000B +:1015E00000000000000000000000000000000000FB +:1015F00000000000000000000000000000000000EB +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:1016300000000000000000000000000000000000AA +:10164000000000000000000000000000000000009A +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:10167000000000000000000000000000000000006A +:10168000000000000000000000000000000000005A +:10169000000000000000000000000000000000004A +:1016A000000000000000000000000000000000003A +:1016B000000000000000000000000000000000002A +:1016C000000000000000000000000000000000001A +:1016D0000000000000000000000000000000006F9B +:1016E00000000000000000010101010101010101F1 +:1016F00001010101010101010101010101010101DA +:1017000001010101010101010101010101010101C9 +:1017100001010101010101010101010101010101B9 +:1017200001010101010101010101010101010101A9 +:101730000101010101010101010101010101010199 +:101740000101010101010101010101010101010189 +:101750000101010101010101010101010101010179 +:101760000101010101010101010101010101010169 +:101770000101010101010101010101010101010159 +:101780000101010101010101010101010101010149 +:101790000101010101010101010101010101010139 +:1017A0000101010101010101010101010101010129 +:1017B0000101010101010101010101010101010119 +:1017C0000101010101010101010101010101010109 +:1017D00001010101010101010101010101010101F9 +:1017E00001010101010101010101010101010101E9 +:1017F00001010101010101010101010101010101D9 +:1018000001010101010101010101010101010101C8 +:1018100001010101010101010101010101010101B8 +:1018200001010101010101010101010101010101A8 +:101830000101010101010101010101010101010198 +:101840000101010101010101010101010101010188 +:101850000101010101010101010101010101010178 +:101860000101010101010101010101010101010168 +:101870000101010101010101010101010101010158 +:101880000101010101010101010101010101010148 +:101890000101010101010101010101010101010138 +:1018A0000101010101010101010101010101010128 +:1018B0000101010101010101010101010101010118 +:1018C0000101010101010101010101010101010108 +:1018D00001010101010101010101010101010101F8 +:1018E00001010101010101010101010101010101E8 +:1018F00001010101010101010101010101010101D8 +:1019000001010101010101010101010101010101C7 +:1019100001010101010101010101010101010101B7 +:1019200001010101010101010101010101010101A7 +:101930000101010101010101010101010101010197 +:101940000101010101010101010101010101010187 +:101950000101010101010101010101010101010177 +:101960000101010101010101010101010101010167 +:101970000101010101010101010101010101010157 +:101980000101010101010101010101010101010147 +:101990000101010101010101010101010101010137 +:1019A0000101010101010101010101010101010127 +:1019B0000101010101010101010101010101010117 +:1019C0000101010101010101010101010101010107 +:1019D00001010101010101010101010101010101F7 +:1019E00001010101010101010101010101010101E7 +:1019F00001010101010101010101010101010101D7 +:101A000001010101010101010101010101010101C6 +:101A100001010101010101010101010101010101B6 +:101A200001010101010101010101010101010101A6 +:101A30000101010101010101010101010101010196 +:101A40000101010101010101010101010101010186 +:101A50000101010101010101010101010101010176 +:101A60000101010101010101010101010101010166 +:101A70000101010101010101010101010101010156 +:101A80000101010101010101010101010101010146 +:101A90000101010101010101010101010101010136 +:101AA0000101010101010101010101010101010126 +:101AB0000101010101010101010101010101010116 +:101AC0000101010101010101010101010101010106 +:101AD00001010101010101010101010101010101F6 +:101AE00001010101010101010101010101010101E6 +:101AF00001010101010101010101010101010101D6 +:101B000001010101010101010101010101010101C5 +:101B100001010101010101010101010101010101B5 +:101B200001010101010101010101010101010101A5 +:101B30000101010101010101010101010101010195 +:101B40000101010101010101010101010101010185 +:101B50000101010101010101010101010101010175 +:101B60000101010101010101010101010101010165 +:101B70000101010101010101010101010101010155 +:101B80000101010101010101010101010101010145 +:101B90000101010101010101010101010101010135 +:101BA0000101010101010101010101010101010125 +:101BB0000101010101010101010101010101010115 +:101BC0000101010101010101010101010101010105 +:101BD00001010101010101010101010101010101F5 +:101BE00001010101010101010101010101010101E5 +:101BF00001010101010101010101010101010101D5 +:101C000001010101010101010101010101010101C4 +:101C100001010101010101010101010101010101B4 +:101C200001010101010101010101010101010101A4 +:101C30000101010101010101010101010101010194 +:101C40000101010101010101010101010101010184 +:101C50000101010101010101010101010101010174 +:101C60000101010101010101010101010101010164 +:101C70000101010101010101010101010101010154 +:101C80000101010101010101010101010101010144 +:101C90000101010101010101010101010101010134 +:101CA0000101010101010101010101010101010124 +:101CB0000101010101010101010101010101010114 +:101CC0000101010101010101010101010101010104 +:101CD00001010101010101010101010101010101F4 +:101CE00001010101010101010101010101010101E4 +:101CF00001010101010101010101010101010101D4 +:101D000001010101010101010101010101010101C3 +:101D100001010101010101010101010101010101B3 +:101D200001010101010101010101010101010101A3 +:101D30000101010101010101010101010101010193 +:101D40000101010101010101010101010101010183 +:101D50000101010101010101010101010101010173 +:101D60000101010101010101010101010101010163 +:101D70000101010101010101010101010101010153 +:101D80000101010101010101010101010101010143 +:101D90000101010101010101010101010101010133 +:101DA0000101010101010101010101010101010123 +:101DB0000101010101010101010101010101010113 +:101DC0000101010101010101010101010101010103 +:101DD00001010101010101010101010101010101F3 +:101DE00001010101010101010101010101010101E3 +:101DF00001010101010101010101010101010101D3 +:101E000001010101010101010101010101010101C2 +:101E100001010101010101010101010101010101B2 +:101E200001010101010101010101010101010101A2 +:101E30000101010101010101010101010101010192 +:101E40000101010101010101010101010101010182 +:101E50000101010101010101010101010101010172 +:101E60000101010101010101010101010101010162 +:101E70000101010101010101010101010101010152 +:101E80000101010101010101010101010101010142 +:101E90000101010101010101010101010101010132 +:101EA0000101010101010101010101010101010122 +:101EB0000101010101010101010101010101010112 +:101EC0000101010101010101010101010101010102 +:101ED00001010101010101010101010101010101F2 +:101EE00001010101010101010101010101010101E2 +:101EF00001010101010101010101010101010101D2 +:101F000001010101010101010101010101010101C1 +:101F100001010101010101010101010101010101B1 +:101F200001010101010101010101010101010101A1 +:101F30000101010101010101010101010101010191 +:101F40000101010101010101010101010101010181 +:101F50000101010101010101010101010101010171 +:101F60000101010101010101010101010101010161 +:101F70000101010101010101010101010101010151 +:101F80000101010101010101010101010101010141 +:101F90000101010101010101010101010101010131 +:101FA0000101010101010101010101010101010121 +:101FB0000101010101010101010101010101010111 +:101FC0000101010101010101010101010101010101 +:101FD00001010101010101010101010101010101F1 +:101FE00001010101010101010101010101010101E1 +:101FF00001010101010101010101010101010101D1 +:1020000001010101010101010101010101010101C0 +:1020100001010101010101010101010101010101B0 +:1020200001010101010101010101010101010101A0 +:102030000101010101010101010101010101010190 +:102040000101010101010101010101010101010180 +:102050000101010101010101010101010101010170 +:102060000101010101010101010101010101010160 +:102070000101010101010101010101010101010150 +:102080000101010101010101010101010101010140 +:102090000101010101010101010101010101010130 +:1020A0000101010101010101010101010101010120 +:1020B0000101010101010101010101010101010110 +:1020C0000101010101010101010101010101010100 +:1020D00001010101010101010101010101010101F0 +:1020E00001010101010101010101010101010101E0 +:1020F00001010101010101010101010101010101D0 +:1021000001010101010101010101010101010101BF +:1021100001010101010101010101010101010101AF +:10212000010101010101010101010101010101019F +:10213000010101010101010101010101010101018F +:10214000010101010101010101010101010101017F +:10215000010101010101010101010101010101016F +:10216000010101010101010101010101010101015F +:10217000010101010101010101010101010101014F +:10218000010101010101010101010101010101013F +:10219000010101010101010101010101010101012F +:1021A000010101010101010101010101010101011F +:1021B000010101010101010101010101010101010F +:1021C00001010101010101010101010101010101FF +:1021D00001010101010101010101010101010101EF +:1021E00001010101010101010101010101010101DF +:1021F00001010101010101010101010101010101CF +:1022000001010101010101010101010101010101BE +:1022100001010101010101010101010101010101AE +:10222000010101010101010101010101010101019E +:10223000010101010101010101010101010101018E +:10224000010101010101010101010101010101017E +:10225000010101010101010101010101010101016E +:10226000010101010101010101010101010101015E +:10227000010101010101010101010101010101014E +:10228000010101010101010101010101010101013E +:10229000010101010101010101010101010101012E +:1022A000010101010101010101010101010101011E +:1022B000010101010101010101010101010101010E +:1022C00001010101010101010101010101010101FE +:1022D00001010101010101010101010101010101EE +:1022E00001010101010101010101010101010101DE +:1022F00001010101010101010101010101010101CE +:1023000001010101010101010101010101010101BD +:1023100001010101010101010101010101010101AD +:10232000010101010101010101010101010101019D +:10233000010101010101010101010101010101018D +:10234000010101010101010101010101010101017D +:10235000010101010101010101010101010101016D +:10236000010101010101010101010101010101015D +:10237000010101010101010101010101010101014D +:10238000010101010101010101010101010101013D +:10239000010101010101010101010101010101012D +:1023A000010101010101010101010101010101011D +:1023B000010101010101010101010101010101010D +:1023C00001010101010101010101010101010101FD +:1023D00001010101010101010101010101010101ED +:1023E00001010101010101010101010101010101DD +:1023F00001010101010101010101010101010101CD +:1024000001010101010101010101010101010101BC +:1024100001010101010101010101010101010101AC +:10242000010101010101010101010101010101019C +:10243000010101010101010101010101010101018C +:10244000010101010101010101010101010101017C +:10245000010101010101010101010101010101016C +:10246000010101010101010101010101010101015C +:10247000010101010101010101010101010101014C +:10248000010101010101010101010101010101013C +:10249000010101010101010101010101010101012C +:1024A000010101010101010101010101010101011C +:1024B000010101010101010101010101010101010C +:1024C00001010101010101010101010101010101FC +:1024D00001010101010101010101010101010101EC +:1024E00001010101010101010101010101010101DC +:1024F00001010101010101010101010101010101CC +:1025000001010101010101010101010101010101BB +:1025100001010101010101010101010101010101AB +:10252000010101010101010101010101010101019B +:10253000010101010101010101010101010101018B +:10254000010101010101010101010101010101017B +:10255000010101010101010101010101010101016B +:10256000010101010101010101010101010101015B +:10257000010101010101010101010101010101014B +:10258000010101010101010101010101010101013B +:10259000010101010101010101010101010101012B +:1025A000010101010101010101010101010101011B +:1025B000010101010101010101010101010101010B +:1025C00001010101010101010101010101010101FB +:1025D00001010101010101010101010101010101EB +:1025E00001010101010101010101010101010101DB +:1025F00001010101010101010101010101010101CB +:1026000001010101010101010101010101010101BA +:1026100001010101010101010101010101010101AA +:10262000010101010101010101010101010101019A +:10263000010101010101010101010101010101018A +:10264000010101010101010101010101010101017A +:10265000010101010101010101010101010101016A +:10266000010101010101010101010101010101015A +:10267000010101010101010101010101010101014A +:10268000010101010101010101010101010101013A +:10269000010101010101010101010101010101012A +:1026A000010101010101010101010101010101011A +:1026B000010101010101010101010101010101010A +:1026C00001010101010101010101010101010101FA +:1026D00001010101010101010101010101010101EA +:1026E00001010101010101010101010101010101DA +:1026F00001010101010101010101010101010101CA +:1027000001010101010101010101010101010101B9 +:1027100001010101010101010101010101010101A9 +:102720000101010101010101010101010101010199 +:102730000101010101010101010101010101010189 +:102740000101010101010101010101010101010179 +:102750000101010101010101010101010101010169 +:102760000101010101010101010101010101010159 +:102770000101010101010101010101010101010149 +:102780000101010101010101010101010101010139 +:102790000101010101010101010101010101010129 +:1027A0000101010101010101010101010101010119 +:1027B0000101010101010101010101010101010109 +:1027C00001010101010101010101010101010101F9 +:1027D00001010101010101010101010101010101E9 +:1027E00001010101010101010101010101010101D9 +:1027F00001010101010101010101010101010101C9 +:1028000001010101010101010101010101010101B8 +:1028100001010101010101010101010101010101A8 +:102820000101010101010101010101010101010198 +:102830000101010101010101010101010101010188 +:102840000101010101010101010101010101010178 +:102850000101010101010101010101010101010168 +:102860000101010101010101010101010101010158 +:102870000101010101010101010101010101010148 +:102880000101010101010101010101010101010138 +:102890000101010101010101010101010101010128 +:1028A0000101010101010101010101010101010118 +:1028B0000101010101010101010101010101010108 +:1028C00001010101010101010101010101010101F8 +:1028D00001010101010101010101010101010101E8 +:1028E00001010101010101010101010101010101D8 +:1028F00001010101010101010101010101010101C8 +:1029000001010101010101010101010101010101B7 +:1029100001010101010101010101010101010101A7 +:102920000101010101010101010101010101010197 +:102930000101010101010101010101010101010187 +:102940000101010101010101010101010101010177 +:102950000101010101010101010101010101010167 +:102960000101010101010101010101010101010157 +:102970000101010101010101010101010101010147 +:102980000101010101010101010101010101010137 +:102990000101010101010101010101010101010127 +:1029A0000101010101010101010101010101010117 +:1029B0000101010101010101010101010101010107 +:1029C00001010101010101010101010101010101F7 +:1029D00001010101010101010101010101010101E7 +:1029E00001010101010101010101010101010101D7 +:1029F00001010101010101010101010101010101C7 +:102A000001010101010101010101010101010101B6 +:102A100001010101010101010101010101010101A6 +:102A20000101010101010101010101010101010196 +:102A30000101010101010101010101010101010186 +:102A40000101010101010101010101010101010176 +:102A50000101010101010101010101010101010166 +:102A60000101010101010101010101010101010156 +:102A70000101010101010101010101010101010146 +:102A80000101010101010101010101010101010136 +:102A90000101010101010101010101010101010126 +:102AA0000101010101010101010101010101010116 +:102AB0000101010101010101010101010101010106 +:102AC00001010101010101010101010101010101F6 +:102AD00001010101010101010101010101010101E6 +:102AE00001010101010101010101010101010101D6 +:102AF00001010101010101010101010101010101C6 +:102B000001010101010101010101010101010101B5 +:102B100001010101010101010101010101010101A5 +:102B20000101010101010101010101010101010195 +:102B30000101010101010101010101010101010185 +:102B40000101010101010101010101010101010175 +:102B50000101010101010101010101010101010165 +:102B60000101010101010101010101010101010155 +:102B70000101010101010101010101010101010145 +:102B80000101010101010101010101010101010135 +:102B90000101010101010101010101010101010125 +:102BA0000101010101010101010101010101010115 +:102BB0000101010101010101010101010101010105 +:102BC00001010101010101010101010101010101F5 +:102BD00001010101010101010101010101010101E5 +:102BE00001010101010101010101010101010101D5 +:102BF00001010101010101010101010101010101C5 +:102C000001010101010101010101010101010101B4 +:102C100001010101010101010101010101010101A4 +:102C20000101010101010101010101010101010194 +:102C30000101010101010101010101010101010184 +:102C40000101010101010101010101010101010174 +:102C50000101010101010101010101010101010164 +:102C60000101010101010101010101010101010154 +:102C70000101010101010101010101010101010144 +:102C80000101010101010101010101010101010134 +:102C90000101010101010101010101010101010124 +:102CA0000101010101010101010101010101010114 +:102CB0000101010101010101010101010101010104 +:102CC00001010101010101010101010101010101F4 +:102CD00001010101010101010101010101010101E4 +:102CE00001010101010101000000000000000000DD +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D200000000000000000000000000000000000A3 +:102D30000000000000000000000000000000000093 +:102D40000000000000000000000000000000000083 +:102D50000000000000000000000000000000000073 +:102D60000000000000000000000000000000000063 +:102D70000000000000000000000000000000000053 +:102D80000000000000000000000000000000000043 +:102D90000000000000000000000000000000000033 +:102DA0000000000000000000000000000000000023 +:102DB0000000000000000000000000000000000013 +:102DC0000000000000000000000000000000000003 +:102DD00000000000000000000000000000000000F3 +:102DE00000000000000000000000000000000000E3 +:102DF00000000000000000000000000000000000D3 +:102E000000000000000000000000000000000000C2 +:102E100000000000000000000000000000000000B2 +:102E200000000000000000000000000000000000A2 +:102E30000000000000000000000000000000000092 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000000000000000000000000052 +:102E80000000000000000000000000000000000042 +:102E90000000000000000000000000000000000032 +:102EA0000000000000000000000000000000000022 +:102EB0000000000000000000000000000000000012 +:102EC0000000000000000000000000000000000002 +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000000000E2 +:102EF00000000000000000000000000000000000D2 +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000000000000000000091 +:102F40000000000000000000000000000000000081 +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F70000000000000000000000000000000000051 +:102F80000000000000000000000000000000000041 +:102F90000000000000000000000000000000000031 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000000000000000001 +:102FD00000000000000000000000000000000000F1 +:102FE00000000000000000000000000000000000E1 +:102FF00000000000000000000000000000000000D1 +:1030000000000000000000000000000000000000C0 +:1030100000000000000000000000000000000000B0 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000000000000000000090 +:103040000000000000000000000000000000000080 +:103050000000000000000000000000000000000070 +:103060000000000000000000000000000000000060 +:103070000000000000000000000000000000000050 +:103080000000000000000000000000000000000040 +:103090000000000000000000000000000000000030 +:1030A0000000000000000000000000000000000020 +:1030B0000000000000000000000000000000000010 +:1030C0000000000000000000000000000000000000 +:1030D00000000000000000000000000000000000F0 +:1030E00000000000000000020202020202020202CE +:1030F00002020202020202020202020202020202B0 +:10310000020202020202020202020202020202029F +:10311000020202020202020202020202020202028F +:10312000020202020202020202020202020202027F +:10313000020202020202020202020202020202026F +:10314000020202020202020202020202020202025F +:10315000020202020202020202020202020202024F +:10316000020202020202020202020202020202023F +:10317000020202020202020202020202020202022F +:10318000020202020202020202020202020202021F +:10319000020202020202020202020202020202020F +:1031A00002020202020202020202020202020202FF +:1031B00002020202020202020202020202020202EF +:1031C00002020202020202020202020202020202DF +:1031D00002020202020202020202020202020202CF +:1031E00002020202020202020202020202020202BF +:1031F00002020202020202020202020202020202AF +:10320000020202020202020202020202020202029E +:10321000020202020202020202020202020202028E +:10322000020202020202020202020202020202027E +:10323000020202020202020202020202020202026E +:10324000020202020202020202020202020202025E +:10325000020202020202020202020202020202024E +:10326000020202020202020202020202020202023E +:10327000020202020202020202020202020202022E +:10328000020202020202020202020202020202021E +:10329000020202020202020202020202020202020E +:1032A00002020202020202020202020202020202FE +:1032B00002020202020202020202020202020202EE +:1032C00002020202020202020202020202020202DE +:1032D00002020202020202020202020202020202CE +:1032E00002020202020202020202020202020202BE +:1032F00002020202020202020202020202020202AE +:10330000020202020202020202020202020202029D +:10331000020202020202020202020202020202028D +:10332000020202020202020202020202020202027D +:10333000020202020202020202020202020202026D +:10334000020202020202020202020202020202025D +:10335000020202020202020202020202020202024D +:10336000020202020202020202020202020202023D +:10337000020202020202020202020202020202022D +:10338000020202020202020202020202020202021D +:10339000020202020202020202020202020202020D +:1033A00002020202020202020202020202020202FD +:1033B00002020202020202020202020202020202ED +:1033C00002020202020202020202020202020202DD +:1033D00002020202020202020202020202020202CD +:1033E00002020202020202020202020202020202BD +:1033F00002020202020202020202020202020202AD +:10340000020202020202020202020202020202029C +:10341000020202020202020202020202020202028C +:10342000020202020202020202020202020202027C +:10343000020202020202020202020202020202026C +:10344000020202020202020202020202020202025C +:10345000020202020202020202020202020202024C +:10346000020202020202020202020202020202023C +:10347000020202020202020202020202020202022C +:10348000020202020202020202020202020202021C +:10349000020202020202020202020202020202020C +:1034A00002020202020202020202020202020202FC +:1034B00002020202020202020202020202020202EC +:1034C00002020202020202020202020202020202DC +:1034D00002020202020202020202020202020202CC +:1034E00002020202020202020202020202020202BC +:1034F00002020202020202020202020202020202AC +:10350000020202020202020202020202020202029B +:10351000020202020202020202020202020202028B +:10352000020202020202020202020202020202027B +:10353000020202020202020202020202020202026B +:10354000020202020202020202020202020202025B +:10355000020202020202020202020202020202024B +:10356000020202020202020202020202020202023B +:10357000020202020202020202020202020202022B +:10358000020202020202020202020202020202021B +:10359000020202020202020202020202020202020B +:1035A00002020202020202020202020202020202FB +:1035B00002020202020202020202020202020202EB +:1035C00002020202020202020202020202020202DB +:1035D00002020202020202020202020202020202CB +:1035E00002020202020202020202020202020202BB +:1035F00002020202020202020202020202020202AB +:10360000020202020202020202020202020202029A +:10361000020202020202020202020202020202028A +:10362000020202020202020202020202020202027A +:10363000020202020202020202020202020202026A +:10364000020202020202020202020202020202025A +:10365000020202020202020202020202020202024A +:10366000020202020202020202020202020202023A +:10367000020202020202020202020202020202022A +:10368000020202020202020202020202020202021A +:10369000020202020202020202020202020202020A +:1036A00002020202020202020202020202020202FA +:1036B00002020202020202020202020202020202EA +:1036C00002020202020202020202020202020202DA +:1036D00002020202020202020202020202020202CA +:1036E00002020202020202020202020202020202BA +:1036F00002020202020202020202020202020202AA +:103700000202020202020202020202020202020299 +:103710000202020202020202020202020202020289 +:103720000202020202020202020202020202020279 +:103730000202020202020202020202020202020269 +:103740000202020202020202020202020202020259 +:103750000202020202020202020202020202020249 +:103760000202020202020202020202020202020239 +:103770000202020202020202020202020202020229 +:103780000202020202020202020202020202020219 +:103790000202020202020202020202020202020209 +:1037A00002020202020202020202020202020202F9 +:1037B00002020202020202020202020202020202E9 +:1037C00002020202020202020202020202020202D9 +:1037D00002020202020202020202020202020202C9 +:1037E00002020202020202020202020202020202B9 +:1037F00002020202020202020202020202020202A9 +:103800000202020202020202020202020202020298 +:103810000202020202020202020202020202020288 +:103820000202020202020202020202020202020278 +:103830000202020202020202020202020202020268 +:103840000202020202020202020202020202020258 +:103850000202020202020202020202020202020248 +:103860000202020202020202020202020202020238 +:103870000202020202020202020202020202020228 +:103880000202020202020202020202020202020218 +:103890000202020202020202020202020202020208 +:1038A00002020202020202020202020202020202F8 +:1038B00002020202020202020202020202020202E8 +:1038C00002020202020202020202020202020202D8 +:1038D00002020202020202020202020202020202C8 +:1038E00002020202020202020202020202020202B8 +:1038F00002020202020202020202020202020202A8 +:103900000202020202020202020202020202020297 +:103910000202020202020202020202020202020287 +:103920000202020202020202020202020202020277 +:103930000202020202020202020202020202020267 +:103940000202020202020202020202020202020257 +:103950000202020202020202020202020202020247 +:103960000202020202020202020202020202020237 +:103970000202020202020202020202020202020227 +:103980000202020202020202020202020202020217 +:103990000202020202020202020202020202020207 +:1039A00002020202020202020202020202020202F7 +:1039B00002020202020202020202020202020202E7 +:1039C00002020202020202020202020202020202D7 +:1039D00002020202020202020202020202020202C7 +:1039E00002020202020202020202020202020202B7 +:1039F00002020202020202020202020202020202A7 +:103A00000202020202020202020202020202020296 +:103A10000202020202020202020202020202020286 +:103A20000202020202020202020202020202020276 +:103A30000202020202020202020202020202020266 +:103A40000202020202020202020202020202020256 +:103A50000202020202020202020202020202020246 +:103A60000202020202020202020202020202020236 +:103A70000202020202020202020202020202020226 +:103A80000202020202020202020202020202020216 +:103A90000202020202020202020202020202020206 +:103AA00002020202020202020202020202020202F6 +:103AB00002020202020202020202020202020202E6 +:103AC00002020202020202020202020202020202D6 +:103AD00002020202020202020202020202020202C6 +:103AE00002020202020202020202020202020202B6 +:103AF00002020202020202020202020202020202A6 +:103B00000202020202020202020202020202020295 +:103B10000202020202020202020202020202020285 +:103B20000202020202020202020202020202020275 +:103B30000202020202020202020202020202020265 +:103B40000202020202020202020202020202020255 +:103B50000202020202020202020202020202020245 +:103B60000202020202020202020202020202020235 +:103B70000202020202020202020202020202020225 +:103B80000202020202020202020202020202020215 +:103B90000202020202020202020202020202020205 +:103BA00002020202020202020202020202020202F5 +:103BB00002020202020202020202020202020202E5 +:103BC00002020202020202020202020202020202D5 +:103BD00002020202020202020202020202020202C5 +:103BE00002020202020202020202020202020202B5 +:103BF00002020202020202020202020202020202A5 +:103C00000202020202020202020202020202020294 +:103C10000202020202020202020202020202020284 +:103C20000202020202020202020202020202020274 +:103C30000202020202020202020202020202020264 +:103C40000202020202020202020202020202020254 +:103C50000202020202020202020202020202020244 +:103C60000202020202020202020202020202020234 +:103C70000202020202020202020202020202020224 +:103C80000202020202020202020202020202020214 +:103C90000202020202020202020202020202020204 +:103CA00002020202020202020202020202020202F4 +:103CB00002020202020202020202020202020202E4 +:103CC00002020202020202020202020202020202D4 +:103CD00002020202020202020202020202020202C4 +:103CE00002020202020202020202020202020202B4 +:103CF00002020202020202020202020202020202A4 +:103D00000202020202020202020202020202020293 +:103D10000202020202020202020202020202020283 +:103D20000202020202020202020202020202020273 +:103D30000202020202020202020202020202020263 +:103D40000202020202020202020202020202020253 +:103D50000202020202020202020202020202020243 +:103D60000202020202020202020202020202020233 +:103D70000202020202020202020202020202020223 +:103D80000202020202020202020202020202020213 +:103D90000202020202020202020202020202020203 +:103DA00002020202020202020202020202020202F3 +:103DB00002020202020202020202020202020202E3 +:103DC00002020202020202020202020202020202D3 +:103DD00002020202020202020202020202020202C3 +:103DE00002020202020202020202020202020202B3 +:103DF00002020202020202020202020202020202A3 +:103E00000202020202020202020202020202020292 +:103E10000202020202020202020202020202020282 +:103E20000202020202020202020202020202020272 +:103E30000202020202020202020202020202020262 +:103E40000202020202020202020202020202020252 +:103E50000202020202020202020202020202020242 +:103E60000202020202020202020202020202020232 +:103E70000202020202020202020202020202020222 +:103E80000202020202020202020202020202020212 +:103E90000202020202020202020202020202020202 +:103EA00002020202020202020202020202020202F2 +:103EB00002020202020202020202020202020202E2 +:103EC00002020202020202020202020202020202D2 +:103ED00002020202020202020202020202020202C2 +:103EE00002020202020202020202020202020202B2 +:103EF00002020202020202020202020202020202A2 +:103F00000202020202020202020202020202020291 +:103F10000202020202020202020202020202020281 +:103F20000202020202020202020202020202020271 +:103F30000202020202020202020202020202020261 +:103F40000202020202020202020202020202020251 +:103F50000202020202020202020202020202020241 +:103F60000202020202020202020202020202020231 +:103F70000202020202020202020202020202020221 +:103F80000202020202020202020202020202020211 +:103F90000202020202020202020202020202020201 +:103FA00002020202020202020202020202020202F1 +:103FB00002020202020202020202020202020202E1 +:103FC00002020202020202020202020202020202D1 +:103FD00002020202020202020202020202020202C1 +:103FE00002020202020202020202020202020202B1 +:103FF00002020202020202020202020202020202A1 +:104000000202020202020202020202020202020290 +:104010000202020202020202020202020202020280 +:104020000202020202020202020202020202020270 +:104030000202020202020202020202020202020260 +:104040000202020202020202020202020202020250 +:104050000202020202020202020202020202020240 +:104060000202020202020202020202020202020230 +:104070000202020202020202020202020202020220 +:104080000202020202020202020202020202020210 +:104090000202020202020202020202020202020200 +:1040A00002020202020202020202020202020202F0 +:1040B00002020202020202020202020202020202E0 +:1040C00002020202020202020202020202020202D0 +:1040D00002020202020202020202020202020202C0 +:1040E00002020202020202020202020202020202B0 +:1040F00002020202020202020202020202020202A0 +:10410000020202020202020202020202020202028F +:10411000020202020202020202020202020202027F +:10412000020202020202020202020202020202026F +:10413000020202020202020202020202020202025F +:10414000020202020202020202020202020202024F +:10415000020202020202020202020202020202023F +:10416000020202020202020202020202020202022F +:10417000020202020202020202020202020202021F +:10418000020202020202020202020202020202020F +:1041900002020202020202020202020202020202FF +:1041A00002020202020202020202020202020202EF +:1041B00002020202020202020202020202020202DF +:1041C00002020202020202020202020202020202CF +:1041D00002020202020202020202020202020202BF +:1041E00002020202020202020202020202020202AF +:1041F000020202020202020202020202020202029F +:10420000020202020202020202020202020202028E +:10421000020202020202020202020202020202027E +:10422000020202020202020202020202020202026E +:10423000020202020202020202020202020202025E +:10424000020202020202020202020202020202024E +:10425000020202020202020202020202020202023E +:10426000020202020202020202020202020202022E +:10427000020202020202020202020202020202021E +:10428000020202020202020202020202020202020E +:1042900002020202020202020202020202020202FE +:1042A00002020202020202020202020202020202EE +:1042B00002020202020202020202020202020202DE +:1042C00002020202020202020202020202020202CE +:1042D00002020202020202020202020202020202BE +:1042E00002020202020202020202020202020202AE +:1042F000020202020202020202020202020202029E +:10430000020202020202020202020202020202028D +:10431000020202020202020202020202020202027D +:10432000020202020202020202020202020202026D +:10433000020202020202020202020202020202025D +:10434000020202020202020202020202020202024D +:10435000020202020202020202020202020202023D +:10436000020202020202020202020202020202022D +:10437000020202020202020202020202020202021D +:10438000020202020202020202020202020202020D +:1043900002020202020202020202020202020202FD +:1043A00002020202020202020202020202020202ED +:1043B00002020202020202020202020202020202DD +:1043C00002020202020202020202020202020202CD +:1043D00002020202020202020202020202020202BD +:1043E00002020202020202020202020202020202AD +:1043F000020202020202020202020202020202029D +:10440000020202020202020202020202020202028C +:10441000020202020202020202020202020202027C +:10442000020202020202020202020202020202026C +:10443000020202020202020202020202020202025C +:10444000020202020202020202020202020202024C +:10445000020202020202020202020202020202023C +:10446000020202020202020202020202020202022C +:10447000020202020202020202020202020202021C +:10448000020202020202020202020202020202020C +:1044900002020202020202020202020202020202FC +:1044A00002020202020202020202020202020202EC +:1044B00002020202020202020202020202020202DC +:1044C00002020202020202020202020202020202CC +:1044D00002020202020202020202020202020202BC +:1044E00002020202020202020202020202020202AC +:1044F000020202020202020202020202020202029C +:10450000020202020202020202020202020202028B +:10451000020202020202020202020202020202027B +:10452000020202020202020202020202020202026B +:10453000020202020202020202020202020202025B +:10454000020202020202020202020202020202024B +:10455000020202020202020202020202020202023B +:10456000020202020202020202020202020202022B +:10457000020202020202020202020202020202021B +:10458000020202020202020202020202020202020B +:1045900002020202020202020202020202020202FB +:1045A00002020202020202020202020202020202EB +:1045B00002020202020202020202020202020202DB +:1045C00002020202020202020202020202020202CB +:1045D00002020202020202020202020202020202BB +:1045E00002020202020202020202020202020202AB +:1045F000020202020202020202020202020202029B +:10460000020202020202020202020202020202028A +:10461000020202020202020202020202020202027A +:10462000020202020202020202020202020202026A +:10463000020202020202020202020202020202025A +:10464000020202020202020202020202020202024A +:10465000020202020202020202020202020202023A +:10466000020202020202020202020202020202022A +:10467000020202020202020202020202020202021A +:10468000020202020202020202020202020202020A +:1046900002020202020202020202020202020202FA +:1046A00002020202020202020202020202020202EA +:1046B00002020202020202020202020202020202DA +:1046C00002020202020202020202020202020202CA +:1046D00002020202020202020202020202020202BA +:1046E00002020202020202000000000000000000BC +:1046F00000000000000000000000000000000000BA +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000000000000099 +:104720000000000000000000000000000000000089 +:104730000000000000000000000000000000000079 +:104740000000000000000000000000000000000069 +:104750000000000000000000000000000000000059 +:104760000000000000000000000000000000000049 +:104770000000000000000000000000000000000039 +:104780000000000000000000000000000000000029 +:104790000000000000000000000000000000000019 +:1047A0000000000000000000000000000000000009 +:1047B00000000000000000000000000000000000F9 +:1047C00000000000000000000000000000000000E9 +:1047D00000000000000000000000000000000000D9 +:1047E00000000000000000000000000000000000C9 +:1047F00000000000000000000000000000000000B9 +:1048000000000000000000000000000000000000A8 +:104810000000000000000000000000000000000098 +:104820000000000000000000000000000000000088 +:104830000000000000000000000000000000000078 +:104840000000000000000000000000000000000068 +:104850000000000000000000000000000000000058 +:104860000000000000000000000000000000000048 +:104870000000000000000000000000000000000038 +:104880000000000000000000000000000000000028 +:104890000000000000000000000000000000000018 +:1048A0000000000000000000000000000000000008 +:1048B00000000000000000000000000000000000F8 +:1048C00000000000000000000000000000000000E8 +:1048D00000000000000000000000000000000000D8 +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000000000000000000B8 +:1049000000000000000000000000000000000000A7 +:104910000000000000000000000000000000000097 +:104920000000000000000000000000000000000087 +:104930000000000000000000000000000000000077 +:104940000000000000000000000000000000000067 +:104950000000000000000000000000000000000057 +:104960000000000000000000000000000000000047 +:104970000000000000000000000000000000000037 +:104980000000000000000000000000000000000027 +:104990000000000000000000000000000000000017 +:1049A0000000000000000000000000000000000007 +:1049B00000000000000000000000000000000000F7 +:1049C00000000000000000000000000000000000E7 +:1049D00000000000000000000000000000000000D7 +:1049E00000000000000000000000000000000000C7 +:1049F00000000000000000000000000000000000B7 +:104A000000000000000000000000000000000000A6 +:104A10000000000000000000000000000000000096 +:104A20000000000000000000000000000000000086 +:104A30000000000000000000000000000000000076 +:104A40000000000000000000000000000000000066 +:104A50000000000000000000000000000000000056 +:104A60000000000000000000000000000000000046 +:104A70000000000000000000000000000000000036 +:104A80000000000000000000000000000000000026 +:104A90000000000000000000000000000000000016 +:104AA0000000000000000000000000000000000006 +:104AB00000000000000000000000000000000000F6 +:104AC00000000000000000000000000000000000E6 +:104AD00000000000000000000000000000000000D6 +:104AE00000000000000000000000000000000000C6 +:104AF00000000000000000000000000000000000B6 +:104B000000000000000000000000000000000000A5 +:104B10000000000000000000000000000000000095 +:104B20000000000000000000000000000000000085 +:104B30000000000000000000000000000000000075 +:104B40000000000000000000000000000000000065 +:104B50000000000000000000000000000000000055 +:104B60000000000000000000000000000000000045 +:104B70000000000000000000000000000000000035 +:104B80000000000000000000000000000000000025 +:104B90000000000000000000000000000000000015 +:104BA0000000000000000000000000000000000005 +:104BB00000000000000000000000000000000000F5 +:104BC00000000000000000000000000000000000E5 +:104BD00000000000000000000000000000000000D5 +:104BE00000000000000000000000000000000000C5 +:104BF00000000000000000000000000000000000B5 +:104C000000000000000000000000000000000000A4 +:104C10000000000000000000000000000000000094 +:104C20000000000000000000000000000000000084 +:104C30000000000000000000000000000000000074 +:104C40000000000000000000000000000000000064 +:104C50000000000000000000000000000000000054 +:104C60000000000000000000000000000000000044 +:104C70000000000000000000000000000000000034 +:104C80000000000000000000000000000000000024 +:104C90000000000000000000000000000000000014 +:104CA0000000000000000000000000000000000004 +:104CB00000000000000000000000000000000000F4 +:104CC00000000000000000000000000000000000E4 +:104CD00000000000000000000000000000000000D4 +:104CE00000000000000000000000000000000000C4 +:104CF00000000000000000000000000000000000B4 +:104D000000000000000000000000000000000000A3 +:104D10000000000000000000000000000000000093 +:104D20000000000000000000000000000000000083 +:104D30000000000000000000000000000000000073 +:104D40000000000000000000000000000000000063 +:104D50000000000000000000000000000000000053 +:104D60000000000000000000000000000000000043 +:104D70000000000000000000000000000000000033 +:104D80000000000000000000000000000000000023 +:104D90000000000000000000000000000000000013 +:104DA0000000000000000000000000000000000003 +:104DB00000000000000000000000000000000000F3 +:104DC00000000000000000000000000000000000E3 +:104DD00000000000000000000000000000000000D3 +:104DE00000000000000000000000000000000000C3 +:104DF00000000000000000000000000000000000B3 +:104E000000000000000000000000000000000000A2 +:104E10000000000000000000000000000000000092 +:104E20000000000000000000000000000000000082 +:104E30000000000000000000000000000000000072 +:104E40000000000000000000000000000000000062 +:104E50000000000000000000000000000000000052 +:104E60000000000000000000000000000000000042 +:104E70000000000000000000000000000000000032 +:104E80000000000000000000000000000000000022 +:104E90000000000000000000000000000000000012 +:104EA0000000000000000000000000000000000002 +:104EB00000000000000000000000000000000000F2 +:104EC00000000000000000000000000000000000E2 +:104ED00000000000000000000000000000000000D2 +:104EE00000000000000000000000000000000000C2 +:104EF00000000000000000000000000000000000B2 +:104F000000000000000000000000000000000000A1 +:104F10000000000000000000000000000000000091 +:104F20000000000000000000000000000000000081 +:104F30000000000000000000000000000000000071 +:104F40000000000000000000000000000000000061 +:104F50000000000000000000000000000000000051 +:104F60000000000000000000000000000000000041 +:104F70000000000000000000000000000000000031 +:104F80000000000000000000000000000000000021 +:104F90000000000000000000000000000000000011 +:104FA0000000000000000000000000000000000001 +:104FB00000000000000000000000000000000000F1 +:104FC00000000000000000000000000000000000E1 +:104FD00000000000000000000000000000000000D1 +:104FE00000000000000000010101010101010101B8 +:104FF00001010101010101010101010101010101A1 +:105000000101010101010101010101010101010190 +:105010000101010101010101010101010101010180 +:105020000101010101010101010101010101010170 +:105030000101010101010101010101010101010160 +:105040000101010101010101010101010101010150 +:105050000101010101010101010101010101010140 +:105060000101010101010101010101010101010130 +:105070000101010101010101010101010101010120 +:105080000101010101010101010101010101010110 +:105090000101010101010101010101010101010100 +:1050A00001010101010101010101010101010101F0 +:1050B00001010101010101010101010101010101E0 +:1050C00001010101010101010101010101010101D0 +:1050D00001010101010101010101010101010101C0 +:1050E00001010101010101010101010101010101B0 +:1050F00001010101010101010101010101010101A0 +:10510000010101010101010101010101010101018F +:10511000010101010101010101010101010101017F +:10512000010101010101010101010101010101016F +:10513000010101010101010101010101010101015F +:10514000010101010101010101010101010101014F +:10515000010101010101010101010101010101013F +:10516000010101010101010101010101010101012F +:10517000010101010101010101010101010101011F +:10518000010101010101010101010101010101010F +:1051900001010101010101010101010101010101FF +:1051A00001010101010101010101010101010101EF +:1051B00001010101010101010101010101010101DF +:1051C00001010101010101010101010101010101CF +:1051D00001010101010101010101010101010101BF +:1051E00001010101010101010101010101010101AF +:1051F000010101010101010101010101010101019F +:10520000010101010101010101010101010101018E +:10521000010101010101010101010101010101017E +:10522000010101010101010101010101010101016E +:10523000010101010101010101010101010101015E +:10524000010101010101010101010101010101014E +:10525000010101010101010101010101010101013E +:10526000010101010101010101010101010101012E +:10527000010101010101010101010101010101011E +:10528000010101010101010101010101010101010E +:1052900001010101010101010101010101010101FE +:1052A00001010101010101010101010101010101EE +:1052B00001010101010101010101010101010101DE +:1052C00001010101010101010101010101010101CE +:1052D00001010101010101010101010101010101BE +:1052E00001010101010101010101010101010101AE +:1052F000010101010101010101010101010101019E +:10530000010101010101010101010101010101018D +:10531000010101010101010101010101010101017D +:10532000010101010101010101010101010101016D +:10533000010101010101010101010101010101015D +:10534000010101010101010101010101010101014D +:10535000010101010101010101010101010101013D +:10536000010101010101010101010101010101012D +:10537000010101010101010101010101010101011D +:10538000010101010101010101010101010101010D +:1053900001010101010101010101010101010101FD +:1053A00001010101010101010101010101010101ED +:1053B00001010101010101010101010101010101DD +:1053C00001010101010101010101010101010101CD +:1053D00001010101010101010101010101010101BD +:1053E00001010101010101010101010101010101AD +:1053F000010101010101010101010101010101019D +:10540000010101010101010101010101010101018C +:10541000010101010101010101010101010101017C +:10542000010101010101010101010101010101016C +:10543000010101010101010101010101010101015C +:10544000010101010101010101010101010101014C +:10545000010101010101010101010101010101013C +:10546000010101010101010101010101010101012C +:10547000010101010101010101010101010101011C +:10548000010101010101010101010101010101010C +:1054900001010101010101010101010101010101FC +:1054A00001010101010101010101010101010101EC +:1054B00001010101010101010101010101010101DC +:1054C00001010101010101010101010101010101CC +:1054D00001010101010101010101010101010101BC +:1054E00001010101010101010101010101010101AC +:1054F000010101010101010101010101010101019C +:10550000010101010101010101010101010101018B +:10551000010101010101010101010101010101017B +:10552000010101010101010101010101010101016B +:10553000010101010101010101010101010101015B +:10554000010101010101010101010101010101014B +:10555000010101010101010101010101010101013B +:10556000010101010101010101010101010101012B +:10557000010101010101010101010101010101011B +:10558000010101010101010101010101010101010B +:1055900001010101010101010101010101010101FB +:1055A00001010101010101010101010101010101EB +:1055B00001010101010101010101010101010101DB +:1055C00001010101010101010101010101010101CB +:1055D00001010101010101010101010101010101BB +:1055E00001010101010101010101010101010101AB +:1055F000010101010101010101010101010101019B +:10560000010101010101010101010101010101018A +:10561000010101010101010101010101010101017A +:10562000010101010101010101010101010101016A +:10563000010101010101010101010101010101015A +:10564000010101010101010101010101010101014A +:10565000010101010101010101010101010101013A +:10566000010101010101010101010101010101012A +:10567000010101010101010101010101010101011A +:10568000010101010101010101010101010101010A +:1056900001010101010101010101010101010101FA +:1056A00001010101010101010101010101010101EA +:1056B00001010101010101010101010101010101DA +:1056C00001010101010101010101010101010101CA +:1056D00001010101010101010101010101010101BA +:1056E00001010101010101010101010101010101AA +:1056F000010101010101010101010101010101019A +:105700000101010101010101010101010101010189 +:105710000101010101010101010101010101010179 +:105720000101010101010101010101010101010169 +:105730000101010101010101010101010101010159 +:105740000101010101010101010101010101010149 +:105750000101010101010101010101010101010139 +:105760000101010101010101010101010101010129 +:105770000101010101010101010101010101010119 +:105780000101010101010101010101010101010109 +:1057900001010101010101010101010101010101F9 +:1057A00001010101010101010101010101010101E9 +:1057B00001010101010101010101010101010101D9 +:1057C00001010101010101010101010101010101C9 +:1057D00001010101010101010101010101010101B9 +:1057E00001010101010101010101010101010101A9 +:1057F0000101010101010101010101010101010199 +:105800000101010101010101010101010101010188 +:105810000101010101010101010101010101010178 +:105820000101010101010101010101010101010168 +:105830000101010101010101010101010101010158 +:105840000101010101010101010101010101010148 +:105850000101010101010101010101010101010138 +:105860000101010101010101010101010101010128 +:105870000101010101010101010101010101010118 +:105880000101010101010101010101010101010108 +:1058900001010101010101010101010101010101F8 +:1058A00001010101010101010101010101010101E8 +:1058B00001010101010101010101010101010101D8 +:1058C00001010101010101010101010101010101C8 +:1058D00001010101010101010101010101010101B8 +:1058E00001010101010101010101010101010101A8 +:1058F0000101010101010101010101010101010198 +:105900000101010101010101010101010101010187 +:105910000101010101010101010101010101010177 +:105920000101010101010101010101010101010167 +:105930000101010101010101010101010101010157 +:105940000101010101010101010101010101010147 +:105950000101010101010101010101010101010137 +:105960000101010101010101010101010101010127 +:105970000101010101010101010101010101010117 +:105980000101010101010101010101010101010107 +:1059900001010101010101010101010101010101F7 +:1059A00001010101010101010101010101010101E7 +:1059B00001010101010101010101010101010101D7 +:1059C00001010101010101010101010101010101C7 +:1059D00001010101010101010101010101010101B7 +:1059E00001010101010101010101010101010101A7 +:1059F0000101010101010101010101010101010197 +:105A00000101010101010101010101010101010186 +:105A10000101010101010101010101010101010176 +:105A20000101010101010101010101010101010166 +:105A30000101010101010101010101010101010156 +:105A40000101010101010101010101010101010146 +:105A50000101010101010101010101010101010136 +:105A60000101010101010101010101010101010126 +:105A70000101010101010101010101010101010116 +:105A80000101010101010101010101010101010106 +:105A900001010101010101010101010101010101F6 +:105AA00001010101010101010101010101010101E6 +:105AB00001010101010101010101010101010101D6 +:105AC00001010101010101010101010101010101C6 +:105AD00001010101010101010101010101010101B6 +:105AE00001010101010101010101010101010101A6 +:105AF0000101010101010101010101010101010196 +:105B00000101010101010101010101010101010185 +:105B10000101010101010101010101010101010175 +:105B20000101010101010101010101010101010165 +:105B30000101010101010101010101010101010155 +:105B40000101010101010101010101010101010145 +:105B50000101010101010101010101010101010135 +:105B60000101010101010101010101010101010125 +:105B70000101010101010101010101010101010115 +:105B80000101010101010101010101010101010105 +:105B900001010101010101010101010101010101F5 +:105BA00001010101010101010101010101010101E5 +:105BB00001010101010101010101010101010101D5 +:105BC00001010101010101010101010101010101C5 +:105BD00001010101010101010101010101010101B5 +:105BE00001010101010101010101010101010101A5 +:105BF0000101010101010101010101010101010195 +:105C00000101010101010101010101010101010184 +:105C10000101010101010101010101010101010174 +:105C20000101010101010101010101010101010164 +:105C30000101010101010101010101010101010154 +:105C40000101010101010101010101010101010144 +:105C50000101010101010101010101010101010134 +:105C60000101010101010101010101010101010124 +:105C70000101010101010101010101010101010114 +:105C80000101010101010101010101010101010104 +:105C900001010101010101010101010101010101F4 +:105CA00001010101010101010101010101010101E4 +:105CB00001010101010101010101010101010101D4 +:105CC00001010101010101010101010101010101C4 +:105CD00001010101010101010101010101010101B4 +:105CE00001010101010101010101010101010101A4 +:105CF0000101010101010101010101010101010194 +:105D00000101010101010101010101010101010183 +:105D10000101010101010101010101010101010173 +:105D20000101010101010101010101010101010163 +:105D30000101010101010101010101010101010153 +:105D40000101010101010101010101010101010143 +:105D50000101010101010101010101010101010133 +:105D60000101010101010101010101010101010123 +:105D70000101010101010101010101010101010113 +:105D80000101010101010101010101010101010103 +:105D900001010101010101010101010101010101F3 +:105DA00001010101010101010101010101010101E3 +:105DB00001010101010101010101010101010101D3 +:105DC00001010101010101010101010101010101C3 +:105DD00001010101010101010101010101010101B3 +:105DE00001010101010101010101010101010101A3 +:105DF0000101010101010101010101010101010193 +:105E00000101010101010101010101010101010182 +:105E10000101010101010101010101010101010172 +:105E20000101010101010101010101010101010162 +:105E30000101010101010101010101010101010152 +:105E40000101010101010101010101010101010142 +:105E50000101010101010101010101010101010132 +:105E60000101010101010101010101010101010122 +:105E70000101010101010101010101010101010112 +:105E80000101010101010101010101010101010102 +:105E900001010101010101010101010101010101F2 +:105EA00001010101010101010101010101010101E2 +:105EB00001010101010101010101010101010101D2 +:105EC00001010101010101010101010101010101C2 +:105ED00001010101010101010101010101010101B2 +:105EE00001010101010101010101010101010101A2 +:105EF0000101010101010101010101010101010192 +:105F00000101010101010101010101010101010181 +:105F10000101010101010101010101010101010171 +:105F20000101010101010101010101010101010161 +:105F30000101010101010101010101010101010151 +:105F40000101010101010101010101010101010141 +:105F50000101010101010101010101010101010131 +:105F60000101010101010101010101010101010121 +:105F70000101010101010101010101010101010111 +:105F80000101010101010101010101010101010101 +:105F900001010101010101010101010101010101F1 +:105FA00001010101010101010101010101010101E1 +:105FB00001010101010101010101010101010101D1 +:105FC00001010101010101010101010101010101C1 +:105FD00001010101010101010101010101010101B1 +:105FE00001010101010101010101010101010101A1 +:105FF0000101010101010101010101010101010191 +:106000000101010101010101010101010101010180 +:106010000101010101010101010101010101010170 +:106020000101010101010101010101010101010160 +:106030000101010101010101010101010101010150 +:106040000101010101010101010101010101010140 +:106050000101010101010101010101010101010130 +:106060000101010101010101010101010101010120 +:106070000101010101010101010101010101010110 +:106080000101010101010101010101010101010100 +:1060900001010101010101010101010101010101F0 +:1060A00001010101010101010101010101010101E0 +:1060B00001010101010101010101010101010101D0 +:1060C00001010101010101010101010101010101C0 +:1060D00001010101010101010101010101010101B0 +:1060E00001010101010101010101010101010101A0 +:1060F0000101010101010101010101010101010190 +:10610000010101010101010101010101010101017F +:10611000010101010101010101010101010101016F +:10612000010101010101010101010101010101015F +:10613000010101010101010101010101010101014F +:10614000010101010101010101010101010101013F +:10615000010101010101010101010101010101012F +:10616000010101010101010101010101010101011F +:10617000010101010101010101010101010101010F +:1061800001010101010101010101010101010101FF +:1061900001010101010101010101010101010101EF +:1061A00001010101010101010101010101010101DF +:1061B00001010101010101010101010101010101CF +:1061C00001010101010101010101010101010101BF +:1061D00001010101010101010101010101010101AF +:1061E000010101010101010101010101010101019F +:1061F000010101010101010101010101010101018F +:10620000010101010101010101010101010101017E +:10621000010101010101010101010101010101016E +:10622000010101010101010101010101010101015E +:10623000010101010101010101010101010101014E +:10624000010101010101010101010101010101013E +:10625000010101010101010101010101010101012E +:10626000010101010101010101010101010101011E +:10627000010101010101010101010101010101010E +:1062800001010101010101010101010101010101FE +:1062900001010101010101010101010101010101EE +:1062A00001010101010101010101010101010101DE +:1062B00001010101010101010101010101010101CE +:1062C00001010101010101010101010101010101BE +:1062D00001010101010101010101010101010101AE +:1062E000010101010101010101010101010101019E +:1062F000010101010101010101010101010101018E +:10630000010101010101010101010101010101017D +:10631000010101010101010101010101010101016D +:10632000010101010101010101010101010101015D +:10633000010101010101010101010101010101014D +:10634000010101010101010101010101010101013D +:10635000010101010101010101010101010101012D +:10636000010101010101010101010101010101011D +:10637000010101010101010101010101010101010D +:1063800001010101010101010101010101010101FD +:1063900001010101010101010101010101010101ED +:1063A00001010101010101010101010101010101DD +:1063B00001010101010101010101010101010101CD +:1063C00001010101010101010101010101010101BD +:1063D00001010101010101010101010101010101AD +:1063E000010101010101010101010101010101019D +:1063F000010101010101010101010101010101018D +:10640000010101010101010101010101010101017C +:10641000010101010101010101010101010101016C +:10642000010101010101010101010101010101015C +:10643000010101010101010101010101010101014C +:10644000010101010101010101010101010101013C +:10645000010101010101010101010101010101012C +:10646000010101010101010101010101010101011C +:10647000010101010101010101010101010101010C +:1064800001010101010101010101010101010101FC +:1064900001010101010101010101010101010101EC +:1064A00001010101010101010101010101010101DC +:1064B00001010101010101010101010101010101CC +:1064C00001010101010101010101010101010101BC +:1064D00001010101010101010101010101010101AC +:1064E000010101010101010101010101010101019C +:1064F000010101010101010101010101010101018C +:10650000010101010101010101010101010101017B +:10651000010101010101010101010101010101016B +:10652000010101010101010101010101010101015B +:10653000010101010101010101010101010101014B +:10654000010101010101010101010101010101013B +:10655000010101010101010101010101010101012B +:10656000010101010101010101010101010101011B +:10657000010101010101010101010101010101010B +:1065800001010101010101010101010101010101FB +:1065900001010101010101010101010101010101EB +:1065A00001010101010101010101010101010101DB +:1065B00001010101010101010101010101010101CB +:1065C00001010101010101010101010101010101BB +:1065D00001010101010101010101010101010101AB +:1065E00001010101010101000000000000000000A4 +:1065F000000000000000000000000000000000009B +:10660000000000000000000000000000000000008A +:10661000000000000000000000000000000000007A +:10662000000000000000000000000000000000006A +:10663000000000000000000000000000000000005A +:10664000000000000000000000000000000000004A +:10665000000000000000000000000000000000003A +:10666000000000000000000000000000000000002A +:10667000000000000000000000000000000000001A +:10668000000000000000000000000000000000000A +:1066900000000000000000000000000000000000FA +:1066A00000000000000000000000000000000000EA +:1066B00000000000000000000000000000000000DA +:1066C00000000000000000000000000000000000CA +:1066D00000000000000000000000000000000000BA +:1066E00000000000000000000000000000000000AA +:1066F000000000000000000000000000000000009A +:106700000000000000000000000000000000000089 +:106710000000000000000000000000000000000079 +:106720000000000000000000000000000000000069 +:106730000000000000000000000000000000000059 +:106740000000000000000000000000000000000049 +:106750000000000000000000000000000000000039 +:106760000000000000000000000000000000000029 +:106770000000000000000000000000000000000019 +:106780000000000000000000000000000000000009 +:1067900000000000000000000000000000000000F9 +:1067A00000000000000000000000000000000000E9 +:1067B00000000000000000000000000000000000D9 +:1067C00000000000000000000000000000000000C9 +:1067D00000000000000000000000000000000000B9 +:1067E00000000000000000000000000000000000A9 +:1067F0000000000000000000000000000000000099 +:106800000000000000000000000000000000000088 +:106810000000000000000000000000000000000078 +:106820000000000000000000000000000000000068 +:106830000000000000000000000000000000000058 +:106840000000000000000000000000000000000048 +:106850000000000000000000000000000000000038 +:106860000000000000000000000000000000000028 +:106870000000000000000000000000000000000018 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000000000F8 +:1068A00000000000000000000000000000000000E8 +:1068B00000000000000000000000000000000000D8 +:1068C00000000000000000000000000000000000C8 +:1068D00000000000000000000000000000000000B8 +:1068E00000000000000000000000000000000000A8 +:1068F0000000000000000000000000000000000098 +:106900000000000000000000000000000000000087 +:106910000000000000000000000000000000000077 +:106920000000000000000000000000000000000067 +:106930000000000000000000000000000000000057 +:106940000000000000000000000000000000000047 +:106950000000000000000000000000000000000037 +:106960000000000000000000000000000000000027 +:106970000000000000000000000000000000000017 +:106980000000000000000000000000000000000007 +:1069900000000000000000000000000000000000F7 +:1069A00000000000000000000000000000000000E7 +:1069B00000000000000000000000000000000000D7 +:1069C00000000000000000000000000000000000C7 +:1069D00000000000000000000000000000000000B7 +:1069E0000000000000000002020202020202020295 +:1069F0000202020202020202020202020202020277 +:106A00000202020202020202020202020202020266 +:106A10000202020202020202020202020202020256 +:106A20000202020202020202020202020202020246 +:106A30000202020202020202020202020202020236 +:106A40000202020202020202020202020202020226 +:106A50000202020202020202020202020202020216 +:106A60000202020202020202020202020202020206 +:106A700002020202020202020202020202020202F6 +:106A800002020202020202020202020202020202E6 +:106A900002020202020202020202020202020202D6 +:106AA00002020202020202020202020202020202C6 +:106AB00002020202020202020202020202020202B6 +:106AC00002020202020202020202020202020202A6 +:106AD0000202020202020202020202020202020296 +:106AE0000202020202020202020202020202020286 +:106AF0000202020202020202020202020202020276 +:106B00000202020202020202020202020202020265 +:106B10000202020202020202020202020202020255 +:106B20000202020202020202020202020202020245 +:106B30000202020202020202020202020202020235 +:106B40000202020202020202020202020202020225 +:106B50000202020202020202020202020202020215 +:106B60000202020202020202020202020202020205 +:106B700002020202020202020202020202020202F5 +:106B800002020202020202020202020202020202E5 +:106B900002020202020202020202020202020202D5 +:106BA00002020202020202020202020202020202C5 +:106BB00002020202020202020202020202020202B5 +:106BC00002020202020202020202020202020202A5 +:106BD0000202020202020202020202020202020295 +:106BE0000202020202020202020202020202020285 +:106BF0000202020202020202020202020202020275 +:106C00000202020202020202020202020202020264 +:106C10000202020202020202020202020202020254 +:106C20000202020202020202020202020202020244 +:106C30000202020202020202020202020202020234 +:106C40000202020202020202020202020202020224 +:106C50000202020202020202020202020202020214 +:106C60000202020202020202020202020202020204 +:106C700002020202020202020202020202020202F4 +:106C800002020202020202020202020202020202E4 +:106C900002020202020202020202020202020202D4 +:106CA00002020202020202020202020202020202C4 +:106CB00002020202020202020202020202020202B4 +:106CC00002020202020202020202020202020202A4 +:106CD0000202020202020202020202020202020294 +:106CE0000202020202020202020202020202020284 +:106CF0000202020202020202020202020202020274 +:106D00000202020202020202020202020202020263 +:106D10000202020202020202020202020202020253 +:106D20000202020202020202020202020202020243 +:106D30000202020202020202020202020202020233 +:106D40000202020202020202020202020202020223 +:106D50000202020202020202020202020202020213 +:106D60000202020202020202020202020202020203 +:106D700002020202020202020202020202020202F3 +:106D800002020202020202020202020202020202E3 +:106D900002020202020202020202020202020202D3 +:106DA00002020202020202020202020202020202C3 +:106DB00002020202020202020202020202020202B3 +:106DC00002020202020202020202020202020202A3 +:106DD0000202020202020202020202020202020293 +:106DE0000202020202020202020202020202020283 +:106DF0000202020202020202020202020202020273 +:106E00000202020202020202020202020202020262 +:106E10000202020202020202020202020202020252 +:106E20000202020202020202020202020202020242 +:106E30000202020202020202020202020202020232 +:106E40000202020202020202020202020202020222 +:106E50000202020202020202020202020202020212 +:106E60000202020202020202020202020202020202 +:106E700002020202020202020202020202020202F2 +:106E800002020202020202020202020202020202E2 +:106E900002020202020202020202020202020202D2 +:106EA00002020202020202020202020202020202C2 +:106EB00002020202020202020202020202020202B2 +:106EC00002020202020202020202020202020202A2 +:106ED0000202020202020202020202020202020292 +:106EE0000202020202020202020202020202020282 +:106EF0000202020202020202020202020202020272 +:106F00000202020202020202020202020202020261 +:106F10000202020202020202020202020202020251 +:106F20000202020202020202020202020202020241 +:106F30000202020202020202020202020202020231 +:106F40000202020202020202020202020202020221 +:106F50000202020202020202020202020202020211 +:106F60000202020202020202020202020202020201 +:106F700002020202020202020202020202020202F1 +:106F800002020202020202020202020202020202E1 +:106F900002020202020202020202020202020202D1 +:106FA00002020202020202020202020202020202C1 +:106FB00002020202020202020202020202020202B1 +:106FC00002020202020202020202020202020202A1 +:106FD0000202020202020202020202020202020291 +:106FE0000202020202020202020202020202020281 +:106FF0000202020202020202020202020202020271 +:107000000202020202020202020202020202020260 +:107010000202020202020202020202020202020250 +:107020000202020202020202020202020202020240 +:107030000202020202020202020202020202020230 +:107040000202020202020202020202020202020220 +:107050000202020202020202020202020202020210 +:107060000202020202020202020202020202020200 +:1070700002020202020202020202020202020202F0 +:1070800002020202020202020202020202020202E0 +:1070900002020202020202020202020202020202D0 +:1070A00002020202020202020202020202020202C0 +:1070B00002020202020202020202020202020202B0 +:1070C00002020202020202020202020202020202A0 +:1070D0000202020202020202020202020202020290 +:1070E0000202020202020202020202020202020280 +:1070F0000202020202020202020202020202020270 +:10710000020202020202020202020202020202025F +:10711000020202020202020202020202020202024F +:10712000020202020202020202020202020202023F +:10713000020202020202020202020202020202022F +:10714000020202020202020202020202020202021F +:10715000020202020202020202020202020202020F +:1071600002020202020202020202020202020202FF +:1071700002020202020202020202020202020202EF +:1071800002020202020202020202020202020202DF +:1071900002020202020202020202020202020202CF +:1071A00002020202020202020202020202020202BF +:1071B00002020202020202020202020202020202AF +:1071C000020202020202020202020202020202029F +:1071D000020202020202020202020202020202028F +:1071E000020202020202020202020202020202027F +:1071F000020202020202020202020202020202026F +:10720000020202020202020202020202020202025E +:10721000020202020202020202020202020202024E +:10722000020202020202020202020202020202023E +:10723000020202020202020202020202020202022E +:10724000020202020202020202020202020202021E +:10725000020202020202020202020202020202020E +:1072600002020202020202020202020202020202FE +:1072700002020202020202020202020202020202EE +:1072800002020202020202020202020202020202DE +:1072900002020202020202020202020202020202CE +:1072A00002020202020202020202020202020202BE +:1072B00002020202020202020202020202020202AE +:1072C000020202020202020202020202020202029E +:1072D000020202020202020202020202020202028E +:1072E000020202020202020202020202020202027E +:1072F000020202020202020202020202020202026E +:10730000020202020202020202020202020202025D +:10731000020202020202020202020202020202024D +:10732000020202020202020202020202020202023D +:10733000020202020202020202020202020202022D +:10734000020202020202020202020202020202021D +:10735000020202020202020202020202020202020D +:1073600002020202020202020202020202020202FD +:1073700002020202020202020202020202020202ED +:1073800002020202020202020202020202020202DD +:1073900002020202020202020202020202020202CD +:1073A00002020202020202020202020202020202BD +:1073B00002020202020202020202020202020202AD +:1073C000020202020202020202020202020202029D +:1073D000020202020202020202020202020202028D +:1073E000020202020202020202020202020202027D +:1073F000020202020202020202020202020202026D +:10740000020202020202020202020202020202025C +:10741000020202020202020202020202020202024C +:10742000020202020202020202020202020202023C +:10743000020202020202020202020202020202022C +:10744000020202020202020202020202020202021C +:10745000020202020202020202020202020202020C +:1074600002020202020202020202020202020202FC +:1074700002020202020202020202020202020202EC +:1074800002020202020202020202020202020202DC +:1074900002020202020202020202020202020202CC +:1074A00002020202020202020202020202020202BC +:1074B00002020202020202020202020202020202AC +:1074C000020202020202020202020202020202029C +:1074D000020202020202020202020202020202028C +:1074E000020202020202020202020202020202027C +:1074F000020202020202020202020202020202026C +:10750000020202020202020202020202020202025B +:10751000020202020202020202020202020202024B +:10752000020202020202020202020202020202023B +:10753000020202020202020202020202020202022B +:10754000020202020202020202020202020202021B +:10755000020202020202020202020202020202020B +:1075600002020202020202020202020202020202FB +:1075700002020202020202020202020202020202EB +:1075800002020202020202020202020202020202DB +:1075900002020202020202020202020202020202CB +:1075A00002020202020202020202020202020202BB +:1075B00002020202020202020202020202020202AB +:1075C000020202020202020202020202020202029B +:1075D000020202020202020202020202020202028B +:1075E000020202020202020202020202020202027B +:1075F000020202020202020202020202020202026B +:10760000020202020202020202020202020202025A +:10761000020202020202020202020202020202024A +:10762000020202020202020202020202020202023A +:10763000020202020202020202020202020202022A +:10764000020202020202020202020202020202021A +:10765000020202020202020202020202020202020A +:1076600002020202020202020202020202020202FA +:1076700002020202020202020202020202020202EA +:1076800002020202020202020202020202020202DA +:1076900002020202020202020202020202020202CA +:1076A00002020202020202020202020202020202BA +:1076B00002020202020202020202020202020202AA +:1076C000020202020202020202020202020202029A +:1076D000020202020202020202020202020202028A +:1076E000020202020202020202020202020202027A +:1076F000020202020202020202020202020202026A +:107700000202020202020202020202020202020259 +:107710000202020202020202020202020202020249 +:107720000202020202020202020202020202020239 +:107730000202020202020202020202020202020229 +:107740000202020202020202020202020202020219 +:107750000202020202020202020202020202020209 +:1077600002020202020202020202020202020202F9 +:1077700002020202020202020202020202020202E9 +:1077800002020202020202020202020202020202D9 +:1077900002020202020202020202020202020202C9 +:1077A00002020202020202020202020202020202B9 +:1077B00002020202020202020202020202020202A9 +:1077C0000202020202020202020202020202020299 +:1077D0000202020202020202020202020202020289 +:1077E0000202020202020202020202020202020279 +:1077F0000202020202020202020202020202020269 +:107800000202020202020202020202020202020258 +:107810000202020202020202020202020202020248 +:107820000202020202020202020202020202020238 +:107830000202020202020202020202020202020228 +:107840000202020202020202020202020202020218 +:107850000202020202020202020202020202020208 +:1078600002020202020202020202020202020202F8 +:1078700002020202020202020202020202020202E8 +:1078800002020202020202020202020202020202D8 +:1078900002020202020202020202020202020202C8 +:1078A00002020202020202020202020202020202B8 +:1078B00002020202020202020202020202020202A8 +:1078C0000202020202020202020202020202020298 +:1078D0000202020202020202020202020202020288 +:1078E0000202020202020202020202020202020278 +:1078F0000202020202020202020202020202020268 +:107900000202020202020202020202020202020257 +:107910000202020202020202020202020202020247 +:107920000202020202020202020202020202020237 +:107930000202020202020202020202020202020227 +:107940000202020202020202020202020202020217 +:107950000202020202020202020202020202020207 +:1079600002020202020202020202020202020202F7 +:1079700002020202020202020202020202020202E7 +:1079800002020202020202020202020202020202D7 +:1079900002020202020202020202020202020202C7 +:1079A00002020202020202020202020202020202B7 +:1079B00002020202020202020202020202020202A7 +:1079C0000202020202020202020202020202020297 +:1079D0000202020202020202020202020202020287 +:1079E0000202020202020202020202020202020277 +:1079F0000202020202020202020202020202020267 +:107A00000202020202020202020202020202020256 +:107A10000202020202020202020202020202020246 +:107A20000202020202020202020202020202020236 +:107A30000202020202020202020202020202020226 +:107A40000202020202020202020202020202020216 +:107A50000202020202020202020202020202020206 +:107A600002020202020202020202020202020202F6 +:107A700002020202020202020202020202020202E6 +:107A800002020202020202020202020202020202D6 +:107A900002020202020202020202020202020202C6 +:107AA00002020202020202020202020202020202B6 +:107AB00002020202020202020202020202020202A6 +:107AC0000202020202020202020202020202020296 +:107AD0000202020202020202020202020202020286 +:107AE0000202020202020202020202020202020276 +:107AF0000202020202020202020202020202020266 +:107B00000202020202020202020202020202020255 +:107B10000202020202020202020202020202020245 +:107B20000202020202020202020202020202020235 +:107B30000202020202020202020202020202020225 +:107B40000202020202020202020202020202020215 +:107B50000202020202020202020202020202020205 +:107B600002020202020202020202020202020202F5 +:107B700002020202020202020202020202020202E5 +:107B800002020202020202020202020202020202D5 +:107B900002020202020202020202020202020202C5 +:107BA00002020202020202020202020202020202B5 +:107BB00002020202020202020202020202020202A5 +:107BC0000202020202020202020202020202020295 +:107BD0000202020202020202020202020202020285 +:107BE0000202020202020202020202020202020275 +:107BF0000202020202020202020202020202020265 +:107C00000202020202020202020202020202020254 +:107C10000202020202020202020202020202020244 +:107C20000202020202020202020202020202020234 +:107C30000202020202020202020202020202020224 +:107C40000202020202020202020202020202020214 +:107C50000202020202020202020202020202020204 +:107C600002020202020202020202020202020202F4 +:107C700002020202020202020202020202020202E4 +:107C800002020202020202020202020202020202D4 +:107C900002020202020202020202020202020202C4 +:107CA00002020202020202020202020202020202B4 +:107CB00002020202020202020202020202020202A4 +:107CC0000202020202020202020202020202020294 +:107CD0000202020202020202020202020202020284 +:107CE0000202020202020202020202020202020274 +:107CF0000202020202020202020202020202020264 +:107D00000202020202020202020202020202020253 +:107D10000202020202020202020202020202020243 +:107D20000202020202020202020202020202020233 +:107D30000202020202020202020202020202020223 +:107D40000202020202020202020202020202020213 +:107D50000202020202020202020202020202020203 +:107D600002020202020202020202020202020202F3 +:107D700002020202020202020202020202020202E3 +:107D800002020202020202020202020202020202D3 +:107D900002020202020202020202020202020202C3 +:107DA00002020202020202020202020202020202B3 +:107DB00002020202020202020202020202020202A3 +:107DC0000202020202020202020202020202020293 +:107DD0000202020202020202020202020202020283 +:107DE0000202020202020202020202020202020273 +:107DF0000202020202020202020202020202020263 +:107E00000202020202020202020202020202020252 +:107E10000202020202020202020202020202020242 +:107E20000202020202020202020202020202020232 +:107E30000202020202020202020202020202020222 +:107E40000202020202020202020202020202020212 +:107E50000202020202020202020202020202020202 +:107E600002020202020202020202020202020202F2 +:107E700002020202020202020202020202020202E2 +:107E800002020202020202020202020202020202D2 +:107E900002020202020202020202020202020202C2 +:107EA00002020202020202020202020202020202B2 +:107EB00002020202020202020202020202020202A2 +:107EC0000202020202020202020202020202020292 +:107ED0000202020202020202020202020202020282 +:107EE0000202020202020202020202020202020272 +:107EF0000202020202020202020202020202020262 +:107F00000202020202020202020202020202020251 +:107F10000202020202020202020202020202020241 +:107F20000202020202020202020202020202020231 +:107F30000202020202020202020202020202020221 +:107F40000202020202020202020202020202020211 +:107F50000202020202020202020202020202020201 +:107F600002020202020202020202020202020202F1 +:107F700002020202020202020202020202020202E1 +:107F800002020202020202020202020202020202D1 +:107F900002020202020202020202020202020202C1 +:107FA00002020202020202020202020202020202B1 +:107FB00002020202020202020202020202020202A1 +:107FC0000202020202020202020202020202020291 +:107FD0000202020202020202020202020202020281 +:107FE0000202020202020200000000000000000083 +:107FF0000000000000000000000000000000000081 +:108000000000000000000000000000000000000070 +:108010000000000000000000000000000000000060 +:108020000000000000000000000000000000000050 +:108030000000000000000000000000000000000040 +:108040000000000000000000000000000000000030 +:108050000000000000000000000000000000000020 +:108060000000000000000000000000000000000010 +:108070000000000000000000000000000000000000 +:1080800000000000000000000000000000000000F0 +:1080900000000000000000000000000000000000E0 +:1080A00000000000000000000000000000000000D0 +:1080B00000000000000000000000000000000000C0 +:1080C00000000000000000000000000000000000B0 +:1080D00000000000000000000000000000000000A0 +:1080E0000000000000000000000000000000000090 +:1080F0000000000000000000000000000000000080 +:10810000000000000000000000000000000000006F +:10811000000000000000000000000000000000005F +:10812000000000000000000000000000000000004F +:10813000000000000000000000000000000000003F +:10814000000000000000000000000000000000002F +:10815000000000000000000000000000000000001F +:10816000000000000000000000000000000000000F +:1081700000000000000000000000000000000000FF +:1081800000000000000000000000000000000000EF +:1081900000000000000000000000000000000000DF +:1081A00000000000000000000000000000000000CF +:1081B00000000000000000000000000000000000BF +:1081C00000000000000000000000000000000000AF +:1081D000000000000000000000000000000000009F +:1081E000000000000000000000000000000000008F +:1081F000000000000000000000000000000000007F +:10820000000000000000000000000000000000006E +:10821000000000000000000000000000000000005E +:10822000000000000000000000000000000000004E +:10823000000000000000000000000000000000003E +:10824000000000000000000000000000000000002E +:10825000000000000000000000000000000000001E +:10826000000000000000000000000000000000000E +:1082700000000000000000000000000000000000FE +:1082800000000000000000000000000000000000EE +:1082900000000000000000000000000000000000DE +:1082A00000000000000000000000000000000000CE +:1082B00000000000000000000000000000000000BE +:1082C00000000000000000000000000000000000AE +:1082D000000000000000000000000000000000009E +:1082E000000000000000000000000000000000008E +:1082F000000000000000000000000000000000007E +:10830000000000000000000000000000000000006D +:10831000000000000000000000000000000000005D +:10832000000000000000000000000000000000004D +:10833000000000000000000000000000000000003D +:10834000000000000000000000000000000000002D +:10835000000000000000000000000000000000001D +:10836000000000000000000000000000000000000D +:1083700000000000000000000000000000000000FD +:1083800000000000000000000000000000000000ED +:1083900000000000000000000000000000000000DD +:1083A00000000000000000000000000000000000CD +:1083B00000000000000000000000000000000000BD +:1083C00000000000000000000000000000000000AD +:1083D000000000000000000000000000000000009D +:1083E000000000000000000000000000000000008D +:1083F000000000000000000000000000000000007D +:10840000000000000000000000000000000000006C +:10841000000000000000000000000000000000005C +:10842000000000000000000000000000000000004C +:10843000000000000000000000000000000000003C +:10844000000000000000000000000000000000002C +:10845000000000000000000000000000000000001C +:10846000000000000000000000000000000000000C +:1084700000000000000000000000000000000000FC +:1084800000000000000000000000000000000000EC +:1084900000000000000000000000000000000000DC +:1084A00000000000000000000000000000000000CC +:1084B00000000000000000000000000000000000BC +:1084C00000000000000000000000000000000000AC +:1084D000000000000000000000000000000000009C +:1084E000000000000000000000000000000000008C +:1084F000000000000000000000000000000000007C +:10850000000000000000000000000000000000006B +:10851000000000000000000000000000000000005B +:10852000000000000000000000000000000000004B +:10853000000000000000000000000000000000003B +:10854000000000000000000000000000000000002B +:10855000000000000000000000000000000000001B +:10856000000000000000000000000000000000000B +:1085700000000000000000000000000000000000FB +:1085800000000000000000000000000000000000EB +:1085900000000000000000000000000000000000DB +:1085A00000000000000000000000000000000000CB +:1085B00000000000000000000000000000000000BB +:1085C00000000000000000000000000000000000AB +:1085D000000000000000000000000000000000009B +:1085E000000000000000006D00000000000000011D +:1085F000010101010101010101010101010101016B +:10860000010101010101010101010101010101015A +:10861000010101010101010101010101010101014A +:10862000010101010101010101010101010101013A +:10863000010101010101010101010101010101012A +:10864000010101010101010101010101010101011A +:10865000010101010101010101010101010101010A +:1086600001010101010101010101010101010101FA +:1086700001010101010101010101010101010101EA +:1086800001010101010101010101010101010101DA +:1086900001010101010101010101010101010101CA +:1086A00001010101010101010101010101010101BA +:1086B00001010101010101010101010101010101AA +:1086C000010101010101010101010101010101019A +:1086D000010101010101010101010101010101018A +:1086E000010101010101010101010101010101017A +:1086F000010101010101010101010101010101016A +:108700000101010101010101010101010101010159 +:108710000101010101010101010101010101010149 +:108720000101010101010101010101010101010139 +:108730000101010101010101010101010101010129 +:108740000101010101010101010101010101010119 +:108750000101010101010101010101010101010109 +:1087600001010101010101010101010101010101F9 +:1087700001010101010101010101010101010101E9 +:1087800001010101010101010101010101010101D9 +:1087900001010101010101010101010101010101C9 +:1087A00001010101010101010101010101010101B9 +:1087B00001010101010101010101010101010101A9 +:1087C0000101010101010101010101010101010199 +:1087D0000101010101010101010101010101010189 +:1087E0000101010101010101010101010101010179 +:1087F0000101010101010101010101010101010169 +:108800000101010101010101010101010101010158 +:108810000101010101010101010101010101010148 +:108820000101010101010101010101010101010138 +:108830000101010101010101010101010101010128 +:108840000101010101010101010101010101010118 +:108850000101010101010101010101010101010108 +:1088600001010101010101010101010101010101F8 +:1088700001010101010101010101010101010101E8 +:1088800001010101010101010101010101010101D8 +:1088900001010101010101010101010101010101C8 +:1088A00001010101010101010101010101010101B8 +:1088B00001010101010101010101010101010101A8 +:1088C0000101010101010101010101010101010198 +:1088D0000101010101010101010101010101010188 +:1088E0000101010101010101010101010101010178 +:1088F0000101010101010101010101010101010168 +:108900000101010101010101010101010101010157 +:108910000101010101010101010101010101010147 +:108920000101010101010101010101010101010137 +:108930000101010101010101010101010101010127 +:108940000101010101010101010101010101010117 +:108950000101010101010101010101010101010107 +:1089600001010101010101010101010101010101F7 +:1089700001010101010101010101010101010101E7 +:1089800001010101010101010101010101010101D7 +:1089900001010101010101010101010101010101C7 +:1089A00001010101010101010101010101010101B7 +:1089B00001010101010101010101010101010101A7 +:1089C0000101010101010101010101010101010197 +:1089D0000101010101010101010101010101010187 +:1089E0000101010101010101010101010101010177 +:1089F0000101010101010101010101010101010167 +:108A00000101010101010101010101010101010156 +:108A10000101010101010101010101010101010146 +:108A20000101010101010101010101010101010136 +:108A30000101010101010101010101010101010126 +:108A40000101010101010101010101010101010116 +:108A50000101010101010101010101010101010106 +:108A600001010101010101010101010101010101F6 +:108A700001010101010101010101010101010101E6 +:108A800001010101010101010101010101010101D6 +:108A900001010101010101010101010101010101C6 +:108AA00001010101010101010101010101010101B6 +:108AB00001010101010101010101010101010101A6 +:108AC0000101010101010101010101010101010196 +:108AD0000101010101010101010101010101010186 +:108AE0000101010101010101010101010101010176 +:108AF0000101010101010101010101010101010166 +:108B00000101010101010101010101010101010155 +:108B10000101010101010101010101010101010145 +:108B20000101010101010101010101010101010135 +:108B30000101010101010101010101010101010125 +:108B40000101010101010101010101010101010115 +:108B50000101010101010101010101010101010105 +:108B600001010101010101010101010101010101F5 +:108B700001010101010101010101010101010101E5 +:108B800001010101010101010101010101010101D5 +:108B900001010101010101010101010101010101C5 +:108BA00001010101010101010101010101010101B5 +:108BB00001010101010101010101010101010101A5 +:108BC0000101010101010101010101010101010195 +:108BD0000101010101010101010101010101010185 +:108BE0000101010101010101010101010101010175 +:108BF0000101010101010101010101010101010165 +:108C00000101010101010101010101010101010154 +:108C10000101010101010101010101010101010144 +:108C20000101010101010101010101010101010134 +:108C30000101010101010101010101010101010124 +:108C40000101010101010101010101010101010114 +:108C50000101010101010101010101010101010104 +:108C600001010101010101010101010101010101F4 +:108C700001010101010101010101010101010101E4 +:108C800001010101010101010101010101010101D4 +:108C900001010101010101010101010101010101C4 +:108CA00001010101010101010101010101010101B4 +:108CB00001010101010101010101010101010101A4 +:108CC0000101010101010101010101010101010194 +:108CD0000101010101010101010101010101010184 +:108CE0000101010101010101010101010101010174 +:108CF0000101010101010101010101010101010164 +:108D00000101010101010101010101010101010153 +:108D10000101010101010101010101010101010143 +:108D20000101010101010101010101010101010133 +:108D30000101010101010101010101010101010123 +:108D40000101010101010101010101010101010113 +:108D50000101010101010101010101010101010103 +:108D600001010101010101010101010101010101F3 +:108D700001010101010101010101010101010101E3 +:108D800001010101010101010101010101010101D3 +:108D900001010101010101010101010101010101C3 +:108DA00001010101010101010101010101010101B3 +:108DB00001010101010101010101010101010101A3 +:108DC0000101010101010101010101010101010193 +:108DD0000101010101010101010101010101010183 +:108DE0000101010101010101010101010101010173 +:108DF0000101010101010101010101010101010163 +:108E00000101010101010101010101010101010152 +:108E10000101010101010101010101010101010142 +:108E20000101010101010101010101010101010132 +:108E30000101010101010101010101010101010122 +:108E40000101010101010101010101010101010112 +:108E50000101010101010101010101010101010102 +:108E600001010101010101010101010101010101F2 +:108E700001010101010101010101010101010101E2 +:108E800001010101010101010101010101010101D2 +:108E900001010101010101010101010101010101C2 +:108EA00001010101010101010101010101010101B2 +:108EB00001010101010101010101010101010101A2 +:108EC0000101010101010101010101010101010192 +:108ED0000101010101010101010101010101010182 +:108EE0000101010101010101010101010101010172 +:108EF0000101010101010101010101010101010162 +:108F00000101010101010101010101010101010151 +:108F10000101010101010101010101010101010141 +:108F20000101010101010101010101010101010131 +:108F30000101010101010101010101010101010121 +:108F40000101010101010101010101010101010111 +:108F50000101010101010101010101010101010101 +:108F600001010101010101010101010101010101F1 +:108F700001010101010101010101010101010101E1 +:108F800001010101010101010101010101010101D1 +:108F900001010101010101010101010101010101C1 +:108FA00001010101010101010101010101010101B1 +:108FB00001010101010101010101010101010101A1 +:108FC0000101010101010101010101010101010191 +:108FD0000101010101010101010101010101010181 +:108FE0000101010101010101010101010101010171 +:108FF0000101010101010101010101010101010161 +:109000000101010101010101010101010101010150 +:109010000101010101010101010101010101010140 +:109020000101010101010101010101010101010130 +:109030000101010101010101010101010101010120 +:109040000101010101010101010101010101010110 +:109050000101010101010101010101010101010100 +:1090600001010101010101010101010101010101F0 +:1090700001010101010101010101010101010101E0 +:1090800001010101010101010101010101010101D0 +:1090900001010101010101010101010101010101C0 +:1090A00001010101010101010101010101010101B0 +:1090B00001010101010101010101010101010101A0 +:1090C0000101010101010101010101010101010190 +:1090D0000101010101010101010101010101010180 +:1090E0000101010101010101010101010101010170 +:1090F0000101010101010101010101010101010160 +:10910000010101010101010101010101010101014F +:10911000010101010101010101010101010101013F +:10912000010101010101010101010101010101012F +:10913000010101010101010101010101010101011F +:10914000010101010101010101010101010101010F +:1091500001010101010101010101010101010101FF +:1091600001010101010101010101010101010101EF +:1091700001010101010101010101010101010101DF +:1091800001010101010101010101010101010101CF +:1091900001010101010101010101010101010101BF +:1091A00001010101010101010101010101010101AF +:1091B000010101010101010101010101010101019F +:1091C000010101010101010101010101010101018F +:1091D000010101010101010101010101010101017F +:1091E000010101010101010101010101010101016F +:1091F000010101010101010101010101010101015F +:10920000010101010101010101010101010101014E +:10921000010101010101010101010101010101013E +:10922000010101010101010101010101010101012E +:10923000010101010101010101010101010101011E +:10924000010101010101010101010101010101010E +:1092500001010101010101010101010101010101FE +:1092600001010101010101010101010101010101EE +:1092700001010101010101010101010101010101DE +:1092800001010101010101010101010101010101CE +:1092900001010101010101010101010101010101BE +:1092A00001010101010101010101010101010101AE +:1092B000010101010101010101010101010101019E +:1092C000010101010101010101010101010101018E +:1092D000010101010101010101010101010101017E +:1092E000010101010101010101010101010101016E +:1092F000010101010101010101010101010101015E +:10930000010101010101010101010101010101014D +:10931000010101010101010101010101010101013D +:10932000010101010101010101010101010101012D +:10933000010101010101010101010101010101011D +:10934000010101010101010101010101010101010D +:1093500001010101010101010101010101010101FD +:1093600001010101010101010101010101010101ED +:1093700001010101010101010101010101010101DD +:1093800001010101010101010101010101010101CD +:1093900001010101010101010101010101010101BD +:1093A00001010101010101010101010101010101AD +:1093B000010101010101010101010101010101019D +:1093C000010101010101010101010101010101018D +:1093D000010101010101010101010101010101017D +:1093E000010101010101010101010101010101016D +:1093F000010101010101010101010101010101015D +:10940000010101010101010101010101010101014C +:10941000010101010101010101010101010101013C +:10942000010101010101010101010101010101012C +:10943000010101010101010101010101010101011C +:10944000010101010101010101010101010101010C +:1094500001010101010101010101010101010101FC +:1094600001010101010101010101010101010101EC +:1094700001010101010101010101010101010101DC +:1094800001010101010101010101010101010101CC +:1094900001010101010101010101010101010101BC +:1094A00001010101010101010101010101010101AC +:1094B000010101010101010101010101010101019C +:1094C000010101010101010101010101010101018C +:1094D000010101010101010101010101010101017C +:1094E000010101010101010101010101010101016C +:1094F000010101010101010101010101010101015C +:10950000010101010101010101010101010101014B +:10951000010101010101010101010101010101013B +:10952000010101010101010101010101010101012B +:10953000010101010101010101010101010101011B +:10954000010101010101010101010101010101010B +:1095500001010101010101010101010101010101FB +:1095600001010101010101010101010101010101EB +:1095700001010101010101010101010101010101DB +:1095800001010101010101010101010101010101CB +:1095900001010101010101010101010101010101BB +:1095A00001010101010101010101010101010101AB +:1095B000010101010101010101010101010101019B +:1095C000010101010101010101010101010101018B +:1095D000010101010101010101010101010101017B +:1095E000010101010101010101010101010101016B +:1095F000010101010101010101010101010101015B +:10960000010101010101010101010101010101014A +:10961000010101010101010101010101010101013A +:10962000010101010101010101010101010101012A +:10963000010101010101010101010101010101011A +:10964000010101010101010101010101010101010A +:1096500001010101010101010101010101010101FA +:1096600001010101010101010101010101010101EA +:1096700001010101010101010101010101010101DA +:1096800001010101010101010101010101010101CA +:1096900001010101010101010101010101010101BA +:1096A00001010101010101010101010101010101AA +:1096B000010101010101010101010101010101019A +:1096C000010101010101010101010101010101018A +:1096D000010101010101010101010101010101017A +:1096E000010101010101010101010101010101016A +:1096F000010101010101010101010101010101015A +:109700000101010101010101010101010101010149 +:109710000101010101010101010101010101010139 +:109720000101010101010101010101010101010129 +:109730000101010101010101010101010101010119 +:109740000101010101010101010101010101010109 +:1097500001010101010101010101010101010101F9 +:1097600001010101010101010101010101010101E9 +:1097700001010101010101010101010101010101D9 +:1097800001010101010101010101010101010101C9 +:1097900001010101010101010101010101010101B9 +:1097A00001010101010101010101010101010101A9 +:1097B0000101010101010101010101010101010199 +:1097C0000101010101010101010101010101010189 +:1097D0000101010101010101010101010101010179 +:1097E0000101010101010101010101010101010169 +:1097F0000101010101010101010101010101010159 +:109800000101010101010101010101010101010148 +:109810000101010101010101010101010101010138 +:109820000101010101010101010101010101010128 +:109830000101010101010101010101010101010118 +:109840000101010101010101010101010101010108 +:1098500001010101010101010101010101010101F8 +:1098600001010101010101010101010101010101E8 +:1098700001010101010101010101010101010101D8 +:1098800001010101010101010101010101010101C8 +:1098900001010101010101010101010101010101B8 +:1098A00001010101010101010101010101010101A8 +:1098B0000101010101010101010101010101010198 +:1098C0000101010101010101010101010101010188 +:1098D0000101010101010101010101010101010178 +:1098E0000101010101010101010101010101010168 +:1098F0000101010101010101010101010101010158 +:109900000101010101010101010101010101010147 +:109910000101010101010101010101010101010137 +:109920000101010101010101010101010101010127 +:109930000101010101010101010101010101010117 +:109940000101010101010101010101010101010107 +:1099500001010101010101010101010101010101F7 +:1099600001010101010101010101010101010101E7 +:1099700001010101010101010101010101010101D7 +:1099800001010101010101010101010101010101C7 +:1099900001010101010101010101010101010101B7 +:1099A00001010101010101010101010101010101A7 +:1099B0000101010101010101010101010101010197 +:1099C0000101010101010101010101010101010187 +:1099D0000101010101010101010101010101010177 +:1099E0000101010101010101010101010101010167 +:1099F0000101010101010101010101010101010157 +:109A00000101010101010101010101010101010146 +:109A10000101010101010101010101010101010136 +:109A20000101010101010101010101010101010126 +:109A30000101010101010101010101010101010116 +:109A40000101010101010101010101010101010106 +:109A500001010101010101010101010101010101F6 +:109A600001010101010101010101010101010101E6 +:109A700001010101010101010101010101010101D6 +:109A800001010101010101010101010101010101C6 +:109A900001010101010101010101010101010101B6 +:109AA00001010101010101010101010101010101A6 +:109AB0000101010101010101010101010101010196 +:109AC0000101010101010101010101010101010186 +:109AD0000101010101010101010101010101010176 +:109AE0000101010101010101010101010101010166 +:109AF0000101010101010101010101010101010156 +:109B00000101010101010101010101010101010145 +:109B10000101010101010101010101010101010135 +:109B20000101010101010101010101010101010125 +:109B30000101010101010101010101010101010115 +:109B40000101010101010101010101010101010105 +:109B500001010101010101010101010101010101F5 +:109B600001010101010101010101010101010101E5 +:109B700001010101010101010101010101010101D5 +:109B800001010101010101010101010101010101C5 +:109B900001010101010101010101010101010101B5 +:109BA00001010101010101010101010101010101A5 +:109BB0000101010101010101010101010101010195 +:109BC0000101010101010101010101010101010185 +:109BD0000101010101010101010101010101010175 +:109BE0000101010101010101010101010101010066 +:109BF0000000000000000000000000000000000065 +:109C00000000000000000000000000000000000054 +:109C10000000000000000000000000000000000044 +:109C20000000000000000000000000000000000034 +:109C30000000000000000000000000000000000024 +:109C40000000000000000000000000000000000014 +:109C50000000000000000000000000000000000004 +:109C600000000000000000000000000000000000F4 +:109C700000000000000000000000000000000000E4 +:109C800000000000000000000000000000000000D4 +:109C900000000000000000000000000000000000C4 +:109CA00000000000000000000000000000000000B4 +:109CB00000000000000000000000000000000000A4 +:109CC0000000000000000000000000000000000094 +:109CD0000000000000000000000000000000000084 +:109CE0000000000000000000000000000000000074 +:109CF0000000000000000000000000000000000064 +:109D00000000000000000000000000000000000053 +:109D10000000000000000000000000000000000043 +:109D20000000000000000000000000000000000033 +:109D30000000000000000000000000000000000023 +:109D40000000000000000000000000000000000013 +:109D50000000000000000000000000000000000003 +:109D600000000000000000000000000000000000F3 +:109D700000000000000000000000000000000000E3 +:109D800000000000000000000000000000000000D3 +:109D900000000000000000000000000000000000C3 +:109DA00000000000000000000000000000000000B3 +:109DB00000000000000000000000000000000000A3 +:109DC0000000000000000000000000000000000093 +:109DD0000000000000000000000000000000000083 +:109DE0000000000000000000000000000000000073 +:109DF0000000000000000000000000000000000063 +:109E00000000000000000000000000000000000052 +:109E10000000000000000000000000000000000042 +:109E20000000000000000000000000000000000032 +:109E30000000000000000000000000000000000022 +:109E40000000000000000000000000000000000012 +:109E50000000000000000000000000000000000002 +:109E600000000000000000000000000000000000F2 +:109E700000000000000000000000000000000000E2 +:109E800000000000000000000000000000000000D2 +:109E900000000000000000000000000000000000C2 +:109EA00000000000000000000000000000000000B2 +:109EB00000000000000000000000000000000000A2 +:109EC0000000000000000000000000000000000092 +:109ED0000000000000000000000000000000000082 +:109EE0000000000000000000000000000000000072 +:109EF0000000000000000000000000000000000062 +:109F00000000000000000000000000000000000051 +:109F10000000000000000000000000000000000041 +:109F20000000000000000000000000000000000031 +:109F30000000000000000000000000000000000021 +:109F40000000000000000000000000000000000011 +:109F50000000000000000000000000000000000001 +:109F600000000000000000000000000000000000F1 +:109F700000000000000000000000000000000000E1 +:109F800000000000000000000000000000000000D1 +:109F900000000000000000000000000000000000C1 +:109FA00000000000000000000000000000000000B1 +:109FB00000000000000000000000000000000000A1 +:109FC0000000000000000000000000000000000091 +:109FD0000000000000000000000000000000000081 +:109FE000000000000000000000000000000000026F +:109FF0000202020202020202020202020202020241 +:10A000000202020202020202020202020202020230 +:10A010000202020202020202020202020202020220 +:10A020000202020202020202020202020202020210 +:10A030000202020202020202020202020202020200 +:10A0400002020202020202020202020202020202F0 +:10A0500002020202020202020202020202020202E0 +:10A0600002020202020202020202020202020202D0 +:10A0700002020202020202020202020202020202C0 +:10A0800002020202020202020202020202020202B0 +:10A0900002020202020202020202020202020202A0 +:10A0A0000202020202020202020202020202020290 +:10A0B0000202020202020202020202020202020280 +:10A0C0000202020202020202020202020202020270 +:10A0D0000202020202020202020202020202020260 +:10A0E0000202020202020202020202020202020250 +:10A0F0000202020202020202020202020202020240 +:10A10000020202020202020202020202020202022F +:10A11000020202020202020202020202020202021F +:10A12000020202020202020202020202020202020F +:10A1300002020202020202020202020202020202FF +:10A1400002020202020202020202020202020202EF +:10A1500002020202020202020202020202020202DF +:10A1600002020202020202020202020202020202CF +:10A1700002020202020202020202020202020202BF +:10A1800002020202020202020202020202020202AF +:10A19000020202020202020202020202020202029F +:10A1A000020202020202020202020202020202028F +:10A1B000020202020202020202020202020202027F +:10A1C000020202020202020202020202020202026F +:10A1D000020202020202020202020202020202025F +:10A1E000020202020202020202020202020202024F +:10A1F000020202020202020202020202020202023F +:10A20000020202020202020202020202020202022E +:10A21000020202020202020202020202020202021E +:10A22000020202020202020202020202020202020E +:10A2300002020202020202020202020202020202FE +:10A2400002020202020202020202020202020202EE +:10A2500002020202020202020202020202020202DE +:10A2600002020202020202020202020202020202CE +:10A2700002020202020202020202020202020202BE +:10A2800002020202020202020202020202020202AE +:10A29000020202020202020202020202020202029E +:10A2A000020202020202020202020202020202028E +:10A2B000020202020202020202020202020202027E +:10A2C000020202020202020202020202020202026E +:10A2D000020202020202020202020202020202025E +:10A2E000020202020202020202020202020202024E +:10A2F000020202020202020202020202020202023E +:10A30000020202020202020202020202020202022D +:10A31000020202020202020202020202020202021D +:10A32000020202020202020202020202020202020D +:10A3300002020202020202020202020202020202FD +:10A3400002020202020202020202020202020202ED +:10A3500002020202020202020202020202020202DD +:10A3600002020202020202020202020202020202CD +:10A3700002020202020202020202020202020202BD +:10A3800002020202020202020202020202020202AD +:10A39000020202020202020202020202020202029D +:10A3A000020202020202020202020202020202028D +:10A3B000020202020202020202020202020202027D +:10A3C000020202020202020202020202020202026D +:10A3D000020202020202020202020202020202025D +:10A3E000020202020202020202020202020202024D +:10A3F000020202020202020202020202020202023D +:10A40000020202020202020202020202020202022C +:10A41000020202020202020202020202020202021C +:10A42000020202020202020202020202020202020C +:10A4300002020202020202020202020202020202FC +:10A4400002020202020202020202020202020202EC +:10A4500002020202020202020202020202020202DC +:10A4600002020202020202020202020202020202CC +:10A4700002020202020202020202020202020202BC +:10A4800002020202020202020202020202020202AC +:10A49000020202020202020202020202020202029C +:10A4A000020202020202020202020202020202028C +:10A4B000020202020202020202020202020202027C +:10A4C000020202020202020202020202020202026C +:10A4D000020202020202020202020202020202025C +:10A4E000020202020202020202020202020202024C +:10A4F000020202020202020202020202020202023C +:10A50000020202020202020202020202020202022B +:10A51000020202020202020202020202020202021B +:10A52000020202020202020202020202020202020B +:10A5300002020202020202020202020202020202FB +:10A5400002020202020202020202020202020202EB +:10A5500002020202020202020202020202020202DB +:10A5600002020202020202020202020202020202CB +:10A5700002020202020202020202020202020202BB +:10A5800002020202020202020202020202020202AB +:10A59000020202020202020202020202020202029B +:10A5A000020202020202020202020202020202028B +:10A5B000020202020202020202020202020202027B +:10A5C000020202020202020202020202020202026B +:10A5D000020202020202020202020202020202025B +:10A5E000020202020202020202020202020202024B +:10A5F000020202020202020202020202020202023B +:10A60000020202020202020202020202020202022A +:10A61000020202020202020202020202020202021A +:10A62000020202020202020202020202020202020A +:10A6300002020202020202020202020202020202FA +:10A6400002020202020202020202020202020202EA +:10A6500002020202020202020202020202020202DA +:10A6600002020202020202020202020202020202CA +:10A6700002020202020202020202020202020202BA +:10A6800002020202020202020202020202020202AA +:10A69000020202020202020202020202020202029A +:10A6A000020202020202020202020202020202028A +:10A6B000020202020202020202020202020202027A +:10A6C000020202020202020202020202020202026A +:10A6D000020202020202020202020202020202025A +:10A6E000020202020202020202020202020202024A +:10A6F000020202020202020202020202020202023A +:10A700000202020202020202020202020202020229 +:10A710000202020202020202020202020202020219 +:10A720000202020202020202020202020202020209 +:10A7300002020202020202020202020202020202F9 +:10A7400002020202020202020202020202020202E9 +:10A7500002020202020202020202020202020202D9 +:10A7600002020202020202020202020202020202C9 +:10A7700002020202020202020202020202020202B9 +:10A7800002020202020202020202020202020202A9 +:10A790000202020202020202020202020202020299 +:10A7A0000202020202020202020202020202020289 +:10A7B0000202020202020202020202020202020279 +:10A7C0000202020202020202020202020202020269 +:10A7D0000202020202020202020202020202020259 +:10A7E0000202020202020202020202020202020249 +:10A7F0000202020202020202020202020202020239 +:10A800000202020202020202020202020202020228 +:10A810000202020202020202020202020202020218 +:10A820000202020202020202020202020202020208 +:10A8300002020202020202020202020202020202F8 +:10A8400002020202020202020202020202020202E8 +:10A8500002020202020202020202020202020202D8 +:10A8600002020202020202020202020202020202C8 +:10A8700002020202020202020202020202020202B8 +:10A8800002020202020202020202020202020202A8 +:10A890000202020202020202020202020202020298 +:10A8A0000202020202020202020202020202020288 +:10A8B0000202020202020202020202020202020278 +:10A8C0000202020202020202020202020202020268 +:10A8D0000202020202020202020202020202020258 +:10A8E0000202020202020202020202020202020248 +:10A8F0000202020202020202020202020202020238 +:10A900000202020202020202020202020202020227 +:10A910000202020202020202020202020202020217 +:10A920000202020202020202020202020202020207 +:10A9300002020202020202020202020202020202F7 +:10A9400002020202020202020202020202020202E7 +:10A9500002020202020202020202020202020202D7 +:10A9600002020202020202020202020202020202C7 +:10A9700002020202020202020202020202020202B7 +:10A9800002020202020202020202020202020202A7 +:10A990000202020202020202020202020202020297 +:10A9A0000202020202020202020202020202020287 +:10A9B0000202020202020202020202020202020277 +:10A9C0000202020202020202020202020202020267 +:10A9D0000202020202020202020202020202020257 +:10A9E0000202020202020202020202020202020247 +:10A9F0000202020202020202020202020202020237 +:10AA00000202020202020202020202020202020226 +:10AA10000202020202020202020202020202020216 +:10AA20000202020202020202020202020202020206 +:10AA300002020202020202020202020202020202F6 +:10AA400002020202020202020202020202020202E6 +:10AA500002020202020202020202020202020202D6 +:10AA600002020202020202020202020202020202C6 +:10AA700002020202020202020202020202020202B6 +:10AA800002020202020202020202020202020202A6 +:10AA90000202020202020202020202020202020296 +:10AAA0000202020202020202020202020202020286 +:10AAB0000202020202020202020202020202020276 +:10AAC0000202020202020202020202020202020266 +:10AAD0000202020202020202020202020202020256 +:10AAE0000202020202020202020202020202020246 +:10AAF0000202020202020202020202020202020236 +:10AB00000202020202020202020202020202020225 +:10AB10000202020202020202020202020202020215 +:10AB20000202020202020202020202020202020205 +:10AB300002020202020202020202020202020202F5 +:10AB400002020202020202020202020202020202E5 +:10AB500002020202020202020202020202020202D5 +:10AB600002020202020202020202020202020202C5 +:10AB700002020202020202020202020202020202B5 +:10AB800002020202020202020202020202020202A5 +:10AB90000202020202020202020202020202020295 +:10ABA0000202020202020202020202020202020285 +:10ABB0000202020202020202020202020202020275 +:10ABC0000202020202020202020202020202020265 +:10ABD0000202020202020202020202020202020255 +:10ABE0000202020202020202020202020202020245 +:10ABF0000202020202020202020202020202020235 +:10AC00000202020202020202020202020202020224 +:10AC10000202020202020202020202020202020214 +:10AC20000202020202020202020202020202020204 +:10AC300002020202020202020202020202020202F4 +:10AC400002020202020202020202020202020202E4 +:10AC500002020202020202020202020202020202D4 +:10AC600002020202020202020202020202020202C4 +:10AC700002020202020202020202020202020202B4 +:10AC800002020202020202020202020202020202A4 +:10AC90000202020202020202020202020202020294 +:10ACA0000202020202020202020202020202020284 +:10ACB0000202020202020202020202020202020274 +:10ACC0000202020202020202020202020202020264 +:10ACD0000202020202020202020202020202020254 +:10ACE0000202020202020202020202020202020244 +:10ACF0000202020202020202020202020202020234 +:10AD00000202020202020202020202020202020223 +:10AD10000202020202020202020202020202020213 +:10AD20000202020202020202020202020202020203 +:10AD300002020202020202020202020202020202F3 +:10AD400002020202020202020202020202020202E3 +:10AD500002020202020202020202020202020202D3 +:10AD600002020202020202020202020202020202C3 +:10AD700002020202020202020202020202020202B3 +:10AD800002020202020202020202020202020202A3 +:10AD90000202020202020202020202020202020293 +:10ADA0000202020202020202020202020202020283 +:10ADB0000202020202020202020202020202020273 +:10ADC0000202020202020202020202020202020263 +:10ADD0000202020202020202020202020202020253 +:10ADE0000202020202020202020202020202020243 +:10ADF0000202020202020202020202020202020233 +:10AE00000202020202020202020202020202020222 +:10AE10000202020202020202020202020202020212 +:10AE20000202020202020202020202020202020202 +:10AE300002020202020202020202020202020202F2 +:10AE400002020202020202020202020202020202E2 +:10AE500002020202020202020202020202020202D2 +:10AE600002020202020202020202020202020202C2 +:10AE700002020202020202020202020202020202B2 +:10AE800002020202020202020202020202020202A2 +:10AE90000202020202020202020202020202020292 +:10AEA0000202020202020202020202020202020282 +:10AEB0000202020202020202020202020202020272 +:10AEC0000202020202020202020202020202020262 +:10AED0000202020202020202020202020202020252 +:10AEE0000202020202020202020202020202020242 +:10AEF0000202020202020202020202020202020232 +:10AF00000202020202020202020202020202020221 +:10AF10000202020202020202020202020202020211 +:10AF20000202020202020202020202020202020201 +:10AF300002020202020202020202020202020202F1 +:10AF400002020202020202020202020202020202E1 +:10AF500002020202020202020202020202020202D1 +:10AF600002020202020202020202020202020202C1 +:10AF700002020202020202020202020202020202B1 +:10AF800002020202020202020202020202020202A1 +:10AF90000202020202020202020202020202020291 +:10AFA0000202020202020202020202020202020281 +:10AFB0000202020202020202020202020202020271 +:10AFC0000202020202020202020202020202020261 +:10AFD0000202020202020202020202020202020251 +:10AFE0000202020202020202020202020202020241 +:10AFF0000202020202020202020202020202020231 +:10B000000202020202020202020202020202020220 +:10B010000202020202020202020202020202020210 +:10B020000202020202020202020202020202020200 +:10B0300002020202020202020202020202020202F0 +:10B0400002020202020202020202020202020202E0 +:10B0500002020202020202020202020202020202D0 +:10B0600002020202020202020202020202020202C0 +:10B0700002020202020202020202020202020202B0 +:10B0800002020202020202020202020202020202A0 +:10B090000202020202020202020202020202020290 +:10B0A0000202020202020202020202020202020280 +:10B0B0000202020202020202020202020202020270 +:10B0C0000202020202020202020202020202020260 +:10B0D0000202020202020202020202020202020250 +:10B0E0000202020202020202020202020202020240 +:10B0F0000202020202020202020202020202020230 +:10B10000020202020202020202020202020202021F +:10B11000020202020202020202020202020202020F +:10B1200002020202020202020202020202020202FF +:10B1300002020202020202020202020202020202EF +:10B1400002020202020202020202020202020202DF +:10B1500002020202020202020202020202020202CF +:10B1600002020202020202020202020202020202BF +:10B1700002020202020202020202020202020202AF +:10B18000020202020202020202020202020202029F +:10B19000020202020202020202020202020202028F +:10B1A000020202020202020202020202020202027F +:10B1B000020202020202020202020202020202026F +:10B1C000020202020202020202020202020202025F +:10B1D000020202020202020202020202020202024F +:10B1E000020202020202020202020202020202023F +:10B1F000020202020202020202020202020202022F +:10B20000020202020202020202020202020202021E +:10B21000020202020202020202020202020202020E +:10B2200002020202020202020202020202020202FE +:10B2300002020202020202020202020202020202EE +:10B2400002020202020202020202020202020202DE +:10B2500002020202020202020202020202020202CE +:10B2600002020202020202020202020202020202BE +:10B2700002020202020202020202020202020202AE +:10B28000020202020202020202020202020202029E +:10B29000020202020202020202020202020202028E +:10B2A000020202020202020202020202020202027E +:10B2B000020202020202020202020202020202026E +:10B2C000020202020202020202020202020202025E +:10B2D000020202020202020202020202020202024E +:10B2E000020202020202020202020202020202023E +:10B2F000020202020202020202020202020202022E +:10B30000020202020202020202020202020202021D +:10B31000020202020202020202020202020202020D +:10B3200002020202020202020202020202020202FD +:10B3300002020202020202020202020202020202ED +:10B3400002020202020202020202020202020202DD +:10B3500002020202020202020202020202020202CD +:10B3600002020202020202020202020202020202BD +:10B3700002020202020202020202020202020202AD +:10B38000020202020202020202020202020202029D +:10B39000020202020202020202020202020202028D +:10B3A000020202020202020202020202020202027D +:10B3B000020202020202020202020202020202026D +:10B3C000020202020202020202020202020202025D +:10B3D000020202020202020202020202020202024D +:10B3E000020202020202020202020202020202023D +:10B3F000020202020202020202020202020202022D +:10B40000020202020202020202020202020202021C +:10B41000020202020202020202020202020202020C +:10B4200002020202020202020202020202020202FC +:10B4300002020202020202020202020202020202EC +:10B4400002020202020202020202020202020202DC +:10B4500002020202020202020202020202020202CC +:10B4600002020202020202020202020202020202BC +:10B4700002020202020202020202020202020202AC +:10B48000020202020202020202020202020202029C +:10B49000020202020202020202020202020202028C +:10B4A000020202020202020202020202020202027C +:10B4B000020202020202020202020202020202026C +:10B4C000020202020202020202020202020202025C +:10B4D000020202020202020202020202020202024C +:10B4E000020202020202020202020202020202023C +:10B4F000020202020202020202020202020202022C +:10B50000020202020202020202020202020202021B +:10B51000020202020202020202020202020202020B +:10B5200002020202020202020202020202020202FB +:10B5300002020202020202020202020202020202EB +:10B5400002020202020202020202020202020202DB +:10B5500002020202020202020202020202020202CB +:10B5600002020202020202020202020202020202BB +:10B5700002020202020202020202020202020202AB +:10B58000020202020202020202020202020202029B +:10B59000020202020202020202020202020202028B +:10B5A000020202020202020202020202020202027B +:10B5B000020202020202020202020202020202026B +:10B5C000020202020202020202020202020202025B +:10B5D000020202020202020202020202020202024B +:10B5E000020202020202020202020202020202003D +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000000000000000FA +:10B6500000000000000000000000000000000000EA +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B7400000000000000000000000000000000000F9 +:10B7500000000000000000000000000000000000E9 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 +:10B7A0000000000000000000000000000000000099 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000000000000000079 +:10B7D0000000000000000000000000000000000069 +:10B7E0000000000000000000000000000000000059 +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820000000000000000000000000000000000018 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000000E8 +:10B8600000000000000000000000000000000000D8 +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000000000000000000068 +:10B8E0000000000000000000000000000000000058 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000000000000000000000037 +:10B910000000000000000000000000000000000027 +:10B920000000000000000000000000000000000017 +:10B930000000000000000000000000000000000007 +:10B9400000000000000000000000000000000000F7 +:10B9500000000000000000000000000000000000E7 +:10B9600000000000000000000000000000000000D7 +:10B9700000000000000000000000000000000000C7 +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000000000000067 +:10B9E0000000000000000000000000000000000057 +:10B9F0000000000000000000000000000000000047 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000000000000E6 +:10BA600000000000000000000000000000000000D6 +:10BA700000000000000000000000000000000000C6 +:10BA800000000000000000000000000000000000B6 +:10BA900000000000000000000000000000000000A6 +:10BAA0000000000000000000000000000000000096 +:10BAB0000000000000000000000000000000000086 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000000000000000056 +:10BAF0000000000000000000000000000000000046 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000064 +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000000000000000D3 +:10BD700000000000000000000000000000000000C3 +:10BD800000000000000000000000000000000000B3 +:10BD900000000000000000000000000000000000A3 +:10BDA0000000000000000000000000000000000093 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000000000000073 +:10BDD0000000000000000000000000000000000063 +:10BDE0000000000000000000000000000000000152 +:10BDF0000101010101010101010101010101010133 +:10BE00000101010101010101010101010101010122 +:10BE10000101010101010101010101010101010112 +:10BE20000101010101010101010101010101010102 +:10BE300001010101010101010101010101010101F2 +:10BE400001010101010101010101010101010101E2 +:10BE500001010101010101010101010101010101D2 +:10BE600001010101010101010101010101010101C2 +:10BE700001010101010101010101010101010101B2 +:10BE800001010101010101010101010101010101A2 +:10BE90000101010101010101010101010101010192 +:10BEA0000101010101010101010101010101010182 +:10BEB0000101010101010101010101010101010172 +:10BEC0000101010101010101010101010101010162 +:10BED0000101010101010101010101010101010152 +:10BEE0000101010101010101010101010101010142 +:10BEF0000101010101010101010101010101010132 +:10BF00000101010101010101010101010101010121 +:10BF10000101010101010101010101010101010111 +:10BF20000101010101010101010101010101010101 +:10BF300001010101010101010101010101010101F1 +:10BF400001010101010101010101010101010101E1 +:10BF500001010101010101010101010101010101D1 +:10BF600001010101010101010101010101010101C1 +:10BF700001010101010101010101010101010101B1 +:10BF800001010101010101010101010101010101A1 +:10BF90000101010101010101010101010101010191 +:10BFA0000101010101010101010101010101010181 +:10BFB0000101010101010101010101010101010171 +:10BFC0000101010101010101010101010101010161 +:10BFD0000101010101010101010101010101010151 +:10BFE0000101010101010101010101010101010141 +:10BFF0000101010101010101010101010101010131 +:10C000000101010101010101010101010101010120 +:10C010000101010101010101010101010101010110 +:10C020000101010101010101010101010101010100 +:10C0300001010101010101010101010101010101F0 +:10C0400001010101010101010101010101010101E0 +:10C0500001010101010101010101010101010101D0 +:10C0600001010101010101010101010101010101C0 +:10C0700001010101010101010101010101010101B0 +:10C0800001010101010101010101010101010101A0 +:10C090000101010101010101010101010101010190 +:10C0A0000101010101010101010101010101010180 +:10C0B0000101010101010101010101010101010170 +:10C0C0000101010101010101010101010101010160 +:10C0D0000101010101010101010101010101010150 +:10C0E0000101010101010101010101010101010140 +:10C0F0000101010101010101010101010101010130 +:10C10000010101010101010101010101010101011F +:10C11000010101010101010101010101010101010F +:10C1200001010101010101010101010101010101FF +:10C1300001010101010101010101010101010101EF +:10C1400001010101010101010101010101010101DF +:10C1500001010101010101010101010101010101CF +:10C1600001010101010101010101010101010101BF +:10C1700001010101010101010101010101010101AF +:10C18000010101010101010101010101010101019F +:10C19000010101010101010101010101010101018F +:10C1A000010101010101010101010101010101017F +:10C1B000010101010101010101010101010101016F +:10C1C000010101010101010101010101010101015F +:10C1D000010101010101010101010101010101014F +:10C1E000010101010101010101010101010101013F +:10C1F000010101010101010101010101010101012F +:10C20000010101010101010101010101010101011E +:10C21000010101010101010101010101010101010E +:10C2200001010101010101010101010101010101FE +:10C2300001010101010101010101010101010101EE +:10C2400001010101010101010101010101010101DE +:10C2500001010101010101010101010101010101CE +:10C2600001010101010101010101010101010101BE +:10C2700001010101010101010101010101010101AE +:10C28000010101010101010101010101010101019E +:10C29000010101010101010101010101010101018E +:10C2A000010101010101010101010101010101017E +:10C2B000010101010101010101010101010101016E +:10C2C000010101010101010101010101010101015E +:10C2D000010101010101010101010101010101014E +:10C2E000010101010101010101010101010101013E +:10C2F000010101010101010101010101010101012E +:10C30000010101010101010101010101010101011D +:10C31000010101010101010101010101010101010D +:10C3200001010101010101010101010101010101FD +:10C3300001010101010101010101010101010101ED +:10C3400001010101010101010101010101010101DD +:10C3500001010101010101010101010101010101CD +:10C3600001010101010101010101010101010101BD +:10C3700001010101010101010101010101010101AD +:10C38000010101010101010101010101010101019D +:10C39000010101010101010101010101010101018D +:10C3A000010101010101010101010101010101017D +:10C3B000010101010101010101010101010101016D +:10C3C000010101010101010101010101010101015D +:10C3D000010101010101010101010101010101014D +:10C3E000010101010101010101010101010101013D +:10C3F000010101010101010101010101010101012D +:10C40000010101010101010101010101010101011C +:10C41000010101010101010101010101010101010C +:10C4200001010101010101010101010101010101FC +:10C4300001010101010101010101010101010101EC +:10C4400001010101010101010101010101010101DC +:10C4500001010101010101010101010101010101CC +:10C4600001010101010101010101010101010101BC +:10C4700001010101010101010101010101010101AC +:10C48000010101010101010101010101010101019C +:10C49000010101010101010101010101010101018C +:10C4A000010101010101010101010101010101017C +:10C4B000010101010101010101010101010101016C +:10C4C000010101010101010101010101010101015C +:10C4D000010101010101010101010101010101014C +:10C4E000010101010101010101010101010101013C +:10C4F000010101010101010101010101010101012C +:10C50000010101010101010101010101010101011B +:10C51000010101010101010101010101010101010B +:10C5200001010101010101010101010101010101FB +:10C5300001010101010101010101010101010101EB +:10C5400001010101010101010101010101010101DB +:10C5500001010101010101010101010101010101CB +:10C5600001010101010101010101010101010101BB +:10C5700001010101010101010101010101010101AB +:10C58000010101010101010101010101010101019B +:10C59000010101010101010101010101010101018B +:10C5A000010101010101010101010101010101017B +:10C5B000010101010101010101010101010101016B +:10C5C000010101010101010101010101010101015B +:10C5D000010101010101010101010101010101014B +:10C5E000010101010101010101010101010101013B +:10C5F000010101010101010101010101010101012B +:10C60000010101010101010101010101010101011A +:10C61000010101010101010101010101010101010A +:10C6200001010101010101010101010101010101FA +:10C6300001010101010101010101010101010101EA +:10C6400001010101010101010101010101010101DA +:10C6500001010101010101010101010101010101CA +:10C6600001010101010101010101010101010101BA +:10C6700001010101010101010101010101010101AA +:10C68000010101010101010101010101010101019A +:10C69000010101010101010101010101010101018A +:10C6A000010101010101010101010101010101017A +:10C6B000010101010101010101010101010101016A +:10C6C000010101010101010101010101010101015A +:10C6D000010101010101010101010101010101014A +:10C6E000010101010101010101010101010101013A +:10C6F000010101010101010101010101010101012A +:10C700000101010101010101010101010101010119 +:10C710000101010101010101010101010101010109 +:10C7200001010101010101010101010101010101F9 +:10C7300001010101010101010101010101010101E9 +:10C7400001010101010101010101010101010101D9 +:10C7500001010101010101010101010101010101C9 +:10C7600001010101010101010101010101010101B9 +:10C7700001010101010101010101010101010101A9 +:10C780000101010101010101010101010101010199 +:10C790000101010101010101010101010101010189 +:10C7A0000101010101010101010101010101010179 +:10C7B0000101010101010101010101010101010169 +:10C7C0000101010101010101010101010101010159 +:10C7D0000101010101010101010101010101010149 +:10C7E0000101010101010101010101010101010139 +:10C7F0000101010101010101010101010101010129 +:10C800000101010101010101010101010101010118 +:10C810000101010101010101010101010101010108 +:10C8200001010101010101010101010101010101F8 +:10C8300001010101010101010101010101010101E8 +:10C8400001010101010101010101010101010101D8 +:10C8500001010101010101010101010101010101C8 +:10C8600001010101010101010101010101010101B8 +:10C8700001010101010101010101010101010101A8 +:10C880000101010101010101010101010101010198 +:10C890000101010101010101010101010101010188 +:10C8A0000101010101010101010101010101010178 +:10C8B0000101010101010101010101010101010168 +:10C8C0000101010101010101010101010101010158 +:10C8D0000101010101010101010101010101010148 +:10C8E0000101010101010101010101010101010138 +:10C8F0000101010101010101010101010101010128 +:10C900000101010101010101010101010101010117 +:10C910000101010101010101010101010101010107 +:10C9200001010101010101010101010101010101F7 +:10C9300001010101010101010101010101010101E7 +:10C9400001010101010101010101010101010101D7 +:10C9500001010101010101010101010101010101C7 +:10C9600001010101010101010101010101010101B7 +:10C9700001010101010101010101010101010101A7 +:10C980000101010101010101010101010101010197 +:10C990000101010101010101010101010101010187 +:10C9A0000101010101010101010101010101010177 +:10C9B0000101010101010101010101010101010167 +:10C9C0000101010101010101010101010101010157 +:10C9D0000101010101010101010101010101010147 +:10C9E0000101010101010101010101010101010137 +:10C9F0000101010101010101010101010101010127 +:10CA00000101010101010101010101010101010116 +:10CA10000101010101010101010101010101010106 +:10CA200001010101010101010101010101010101F6 +:10CA300001010101010101010101010101010101E6 +:10CA400001010101010101010101010101010101D6 +:10CA500001010101010101010101010101010101C6 +:10CA600001010101010101010101010101010101B6 +:10CA700001010101010101010101010101010101A6 +:10CA80000101010101010101010101010101010196 +:10CA90000101010101010101010101010101010186 +:10CAA0000101010101010101010101010101010176 +:10CAB0000101010101010101010101010101010166 +:10CAC0000101010101010101010101010101010156 +:10CAD0000101010101010101010101010101010146 +:10CAE0000101010101010101010101010101010136 +:10CAF0000101010101010101010101010101010126 +:10CB00000101010101010101010101010101010115 +:10CB10000101010101010101010101010101010105 +:10CB200001010101010101010101010101010101F5 +:10CB300001010101010101010101010101010101E5 +:10CB400001010101010101010101010101010101D5 +:10CB500001010101010101010101010101010101C5 +:10CB600001010101010101010101010101010101B5 +:10CB700001010101010101010101010101010101A5 +:10CB80000101010101010101010101010101010195 +:10CB90000101010101010101010101010101010185 +:10CBA0000101010101010101010101010101010175 +:10CBB0000101010101010101010101010101010165 +:10CBC0000101010101010101010101010101010155 +:10CBD0000101010101010101010101010101010145 +:10CBE0000101010101010101010101010101010135 +:10CBF0000101010101010101010101010101010125 +:10CC00000101010101010101010101010101010114 +:10CC10000101010101010101010101010101010104 +:10CC200001010101010101010101010101010101F4 +:10CC300001010101010101010101010101010101E4 +:10CC400001010101010101010101010101010101D4 +:10CC500001010101010101010101010101010101C4 +:10CC600001010101010101010101010101010101B4 +:10CC700001010101010101010101010101010101A4 +:10CC80000101010101010101010101010101010194 +:10CC90000101010101010101010101010101010184 +:10CCA0000101010101010101010101010101010174 +:10CCB0000101010101010101010101010101010164 +:10CCC0000101010101010101010101010101010154 +:10CCD0000101010101010101010101010101010144 +:10CCE0000101010101010101010101010101010134 +:10CCF0000101010101010101010101010101010124 +:10CD00000101010101010101010101010101010113 +:10CD10000101010101010101010101010101010103 +:10CD200001010101010101010101010101010101F3 +:10CD300001010101010101010101010101010101E3 +:10CD400001010101010101010101010101010101D3 +:10CD500001010101010101010101010101010101C3 +:10CD600001010101010101010101010101010101B3 +:10CD700001010101010101010101010101010101A3 +:10CD80000101010101010101010101010101010193 +:10CD90000101010101010101010101010101010183 +:10CDA0000101010101010101010101010101010173 +:10CDB0000101010101010101010101010101010163 +:10CDC0000101010101010101010101010101010153 +:10CDD0000101010101010101010101010101010143 +:10CDE0000101010101010101010101010101010133 +:10CDF0000101010101010101010101010101010123 +:10CE00000101010101010101010101010101010112 +:10CE10000101010101010101010101010101010102 +:10CE200001010101010101010101010101010101F2 +:10CE300001010101010101010101010101010101E2 +:10CE400001010101010101010101010101010101D2 +:10CE500001010101010101010101010101010101C2 +:10CE600001010101010101010101010101010101B2 +:10CE700001010101010101010101010101010101A2 +:10CE80000101010101010101010101010101010192 +:10CE90000101010101010101010101010101010182 +:10CEA0000101010101010101010101010101010172 +:10CEB0000101010101010101010101010101010162 +:10CEC0000101010101010101010101010101010152 +:10CED0000101010101010101010101010101010142 +:10CEE0000101010101010101010101010101010132 +:10CEF0000101010101010101010101010101010122 +:10CF00000101010101010101010101010101010111 +:10CF10000101010101010101010101010101010101 +:10CF200001010101010101010101010101010101F1 +:10CF300001010101010101010101010101010101E1 +:10CF400001010101010101010101010101010101D1 +:10CF500001010101010101010101010101010101C1 +:10CF600001010101010101010101010101010101B1 +:10CF700001010101010101010101010101010101A1 +:10CF80000101010101010101010101010101010191 +:10CF90000101010101010101010101010101010181 +:10CFA0000101010101010101010101010101010171 +:10CFB0000101010101010101010101010101010161 +:10CFC0000101010101010101010101010101010151 +:10CFD0000101010101010101010101010101010141 +:10CFE0000101010101010101010101010101010131 +:10CFF0000101010101010101010101010101010121 +:10D000000101010101010101010101010101010110 +:10D010000101010101010101010101010101010100 +:10D0200001010101010101010101010101010101F0 +:10D0300001010101010101010101010101010101E0 +:10D0400001010101010101010101010101010101D0 +:10D0500001010101010101010101010101010101C0 +:10D0600001010101010101010101010101010101B0 +:10D0700001010101010101010101010101010101A0 +:10D080000101010101010101010101010101010190 +:10D090000101010101010101010101010101010180 +:10D0A0000101010101010101010101010101010170 +:10D0B0000101010101010101010101010101010160 +:10D0C0000101010101010101010101010101010150 +:10D0D0000101010101010101010101010101010140 +:10D0E0000101010101010101010101010101010130 +:10D0F0000101010101010101010101010101010120 +:10D10000010101010101010101010101010101010F +:10D1100001010101010101010101010101010101FF +:10D1200001010101010101010101010101010101EF +:10D1300001010101010101010101010101010101DF +:10D1400001010101010101010101010101010101CF +:10D1500001010101010101010101010101010101BF +:10D1600001010101010101010101010101010101AF +:10D17000010101010101010101010101010101019F +:10D18000010101010101010101010101010101018F +:10D19000010101010101010101010101010101017F +:10D1A000010101010101010101010101010101016F +:10D1B000010101010101010101010101010101015F +:10D1C000010101010101010101010101010101014F +:10D1D000010101010101010101010101010101013F +:10D1E000010101010101010101010101010101012F +:10D1F000010101010101010101010101010101011F +:10D20000010101010101010101010101010101010E +:10D2100001010101010101010101010101010101FE +:10D2200001010101010101010101010101010101EE +:10D2300001010101010101010101010101010101DE +:10D2400001010101010101010101010101010101CE +:10D2500001010101010101010101010101010101BE +:10D2600001010101010101010101010101010101AE +:10D27000010101010101010101010101010101019E +:10D28000010101010101010101010101010101018E +:10D29000010101010101010101010101010101017E +:10D2A000010101010101010101010101010101016E +:10D2B000010101010101010101010101010101015E +:10D2C000010101010101010101010101010101014E +:10D2D000010101010101010101010101010101013E +:10D2E000010101010101010101010101010101012E +:10D2F000010101010101010101010101010101011E +:10D30000010101010101010101010101010101010D +:10D3100001010101010101010101010101010101FD +:10D3200001010101010101010101010101010101ED +:10D3300001010101010101010101010101010101DD +:10D3400001010101010101010101010101010101CD +:10D3500001010101010101010101010101010101BD +:10D3600001010101010101010101010101010101AD +:10D37000010101010101010101010101010101019D +:10D38000010101010101010101010101010101018D +:10D39000010101010101010101010101010101017D +:10D3A000010101010101010101010101010101016D +:10D3B000010101010101010101010101010101015D +:10D3C000010101010101010101010101010101014D +:10D3D000010101010101010101010101010101013D +:10D3E000010101010101010101010101010101002E +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000000000000000C9 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000049 +:10D7E0000000000000000000000000000000000237 +:10D7F0000202020202020202020202020202020209 +:10D8000002020202020202020202020202020202F8 +:10D8100002020202020202020202020202020202E8 +:10D8200002020202020202020202020202020202D8 +:10D8300002020202020202020202020202020202C8 +:10D8400002020202020202020202020202020202B8 +:10D8500002020202020202020202020202020202A8 +:10D860000202020202020202020202020202020298 +:10D870000202020202020202020202020202020288 +:10D880000202020202020202020202020202020278 +:10D890000202020202020202020202020202020268 +:10D8A0000202020202020202020202020202020258 +:10D8B0000202020202020202020202020202020248 +:10D8C0000202020202020202020202020202020238 +:10D8D0000202020202020202020202020202020228 +:10D8E0000202020202020202020202020202020218 +:10D8F0000202020202020202020202020202020208 +:10D9000002020202020202020202020202020202F7 +:10D9100002020202020202020202020202020202E7 +:10D9200002020202020202020202020202020202D7 +:10D9300002020202020202020202020202020202C7 +:10D9400002020202020202020202020202020202B7 +:10D9500002020202020202020202020202020202A7 +:10D960000202020202020202020202020202020297 +:10D970000202020202020202020202020202020287 +:10D980000202020202020202020202020202020277 +:10D990000202020202020202020202020202020267 +:10D9A0000202020202020202020202020202020257 +:10D9B0000202020202020202020202020202020247 +:10D9C0000202020202020202020202020202020237 +:10D9D0000202020202020202020202020202020227 +:10D9E0000202020202020202020202020202020217 +:10D9F0000202020202020202020202020202020207 +:10DA000002020202020202020202020202020202F6 +:10DA100002020202020202020202020202020202E6 +:10DA200002020202020202020202020202020202D6 +:10DA300002020202020202020202020202020202C6 +:10DA400002020202020202020202020202020202B6 +:10DA500002020202020202020202020202020202A6 +:10DA60000202020202020202020202020202020296 +:10DA70000202020202020202020202020202020286 +:10DA80000202020202020202020202020202020276 +:10DA90000202020202020202020202020202020266 +:10DAA0000202020202020202020202020202020256 +:10DAB0000202020202020202020202020202020246 +:10DAC0000202020202020202020202020202020236 +:10DAD0000202020202020202020202020202020226 +:10DAE0000202020202020202020202020202020216 +:10DAF0000202020202020202020202020202020206 +:10DB000002020202020202020202020202020202F5 +:10DB100002020202020202020202020202020202E5 +:10DB200002020202020202020202020202020202D5 +:10DB300002020202020202020202020202020202C5 +:10DB400002020202020202020202020202020202B5 +:10DB500002020202020202020202020202020202A5 +:10DB60000202020202020202020202020202020295 +:10DB70000202020202020202020202020202020285 +:10DB80000202020202020202020202020202020275 +:10DB90000202020202020202020202020202020265 +:10DBA0000202020202020202020202020202020255 +:10DBB0000202020202020202020202020202020245 +:10DBC0000202020202020202020202020202020235 +:10DBD0000202020202020202020202020202020225 +:10DBE0000202020202020202020202020202020215 +:10DBF0000202020202020202020202020202020205 +:10DC000002020202020202020202020202020202F4 +:10DC100002020202020202020202020202020202E4 +:10DC200002020202020202020202020202020202D4 +:10DC300002020202020202020202020202020202C4 +:10DC400002020202020202020202020202020202B4 +:10DC500002020202020202020202020202020202A4 +:10DC60000202020202020202020202020202020294 +:10DC70000202020202020202020202020202020284 +:10DC80000202020202020202020202020202020274 +:10DC90000202020202020202020202020202020264 +:10DCA0000202020202020202020202020202020254 +:10DCB0000202020202020202020202020202020244 +:10DCC0000202020202020202020202020202020234 +:10DCD0000202020202020202020202020202020224 +:10DCE0000202020202020202020202020202020214 +:10DCF0000202020202020202020202020202020204 +:10DD000002020202020202020202020202020202F3 +:10DD100002020202020202020202020202020202E3 +:10DD200002020202020202020202020202020202D3 +:10DD300002020202020202020202020202020202C3 +:10DD400002020202020202020202020202020202B3 +:10DD500002020202020202020202020202020202A3 +:10DD60000202020202020202020202020202020293 +:10DD70000202020202020202020202020202020283 +:10DD80000202020202020202020202020202020273 +:10DD90000202020202020202020202020202020263 +:10DDA0000202020202020202020202020202020253 +:10DDB0000202020202020202020202020202020243 +:10DDC0000202020202020202020202020202020233 +:10DDD0000202020202020202020202020202020223 +:10DDE0000202020202020202020202020202020213 +:10DDF0000202020202020202020202020202020203 +:10DE000002020202020202020202020202020202F2 +:10DE100002020202020202020202020202020202E2 +:10DE200002020202020202020202020202020202D2 +:10DE300002020202020202020202020202020202C2 +:10DE400002020202020202020202020202020202B2 +:10DE500002020202020202020202020202020202A2 +:10DE60000202020202020202020202020202020292 +:10DE70000202020202020202020202020202020282 +:10DE80000202020202020202020202020202020272 +:10DE90000202020202020202020202020202020262 +:10DEA0000202020202020202020202020202020252 +:10DEB0000202020202020202020202020202020242 +:10DEC0000202020202020202020202020202020232 +:10DED0000202020202020202020202020202020222 +:10DEE0000202020202020202020202020202020212 +:10DEF0000202020202020202020202020202020202 +:10DF000002020202020202020202020202020202F1 +:10DF100002020202020202020202020202020202E1 +:10DF200002020202020202020202020202020202D1 +:10DF300002020202020202020202020202020202C1 +:10DF400002020202020202020202020202020202B1 +:10DF500002020202020202020202020202020202A1 +:10DF60000202020202020202020202020202020291 +:10DF70000202020202020202020202020202020281 +:10DF80000202020202020202020202020202020271 +:10DF90000202020202020202020202020202020261 +:10DFA0000202020202020202020202020202020251 +:10DFB0000202020202020202020202020202020241 +:10DFC0000202020202020202020202020202020231 +:10DFD0000202020202020202020202020202020221 +:10DFE0000202020202020202020202020202020211 +:10DFF0000202020202020202020202020202020201 +:10E0000002020202020202020202020202020202F0 +:10E0100002020202020202020202020202020202E0 +:10E0200002020202020202020202020202020202D0 +:10E0300002020202020202020202020202020202C0 +:10E0400002020202020202020202020202020202B0 +:10E0500002020202020202020202020202020202A0 +:10E060000202020202020202020202020202020290 +:10E070000202020202020202020202020202020280 +:10E080000202020202020202020202020202020270 +:10E090000202020202020202020202020202020260 +:10E0A0000202020202020202020202020202020250 +:10E0B0000202020202020202020202020202020240 +:10E0C0000202020202020202020202020202020230 +:10E0D0000202020202020202020202020202020220 +:10E0E0000202020202020202020202020202020210 +:10E0F0000202020202020202020202020202020200 +:10E1000002020202020202020202020202020202EF +:10E1100002020202020202020202020202020202DF +:10E1200002020202020202020202020202020202CF +:10E1300002020202020202020202020202020202BF +:10E1400002020202020202020202020202020202AF +:10E15000020202020202020202020202020202029F +:10E16000020202020202020202020202020202028F +:10E17000020202020202020202020202020202027F +:10E18000020202020202020202020202020202026F +:10E19000020202020202020202020202020202025F +:10E1A000020202020202020202020202020202024F +:10E1B000020202020202020202020202020202023F +:10E1C000020202020202020202020202020202022F +:10E1D000020202020202020202020202020202021F +:10E1E000020202020202020202020202020202020F +:10E1F00002020202020202020202020202020202FF +:10E2000002020202020202020202020202020202EE +:10E2100002020202020202020202020202020202DE +:10E2200002020202020202020202020202020202CE +:10E2300002020202020202020202020202020202BE +:10E2400002020202020202020202020202020202AE +:10E25000020202020202020202020202020202029E +:10E26000020202020202020202020202020202028E +:10E27000020202020202020202020202020202027E +:10E28000020202020202020202020202020202026E +:10E29000020202020202020202020202020202025E +:10E2A000020202020202020202020202020202024E +:10E2B000020202020202020202020202020202023E +:10E2C000020202020202020202020202020202022E +:10E2D000020202020202020202020202020202021E +:10E2E000020202020202020202020202020202020E +:10E2F00002020202020202020202020202020202FE +:10E3000002020202020202020202020202020202ED +:10E3100002020202020202020202020202020202DD +:10E3200002020202020202020202020202020202CD +:10E3300002020202020202020202020202020202BD +:10E3400002020202020202020202020202020202AD +:10E35000020202020202020202020202020202029D +:10E36000020202020202020202020202020202028D +:10E37000020202020202020202020202020202027D +:10E38000020202020202020202020202020202026D +:10E39000020202020202020202020202020202025D +:10E3A000020202020202020202020202020202024D +:10E3B000020202020202020202020202020202023D +:10E3C000020202020202020202020202020202022D +:10E3D000020202020202020202020202020202021D +:10E3E000020202020202020202020202020202020D +:10E3F00002020202020202020202020202020202FD +:10E4000002020202020202020202020202020202EC +:10E4100002020202020202020202020202020202DC +:10E4200002020202020202020202020202020202CC +:10E4300002020202020202020202020202020202BC +:10E4400002020202020202020202020202020202AC +:10E45000020202020202020202020202020202029C +:10E46000020202020202020202020202020202028C +:10E47000020202020202020202020202020202027C +:10E48000020202020202020202020202020202026C +:10E49000020202020202020202020202020202025C +:10E4A000020202020202020202020202020202024C +:10E4B000020202020202020202020202020202023C +:10E4C000020202020202020202020202020202022C +:10E4D000020202020202020202020202020202021C +:10E4E000020202020202020202020202020202020C +:10E4F00002020202020202020202020202020202FC +:10E5000002020202020202020202020202020202EB +:10E5100002020202020202020202020202020202DB +:10E5200002020202020202020202020202020202CB +:10E5300002020202020202020202020202020202BB +:10E5400002020202020202020202020202020202AB +:10E55000020202020202020202020202020202029B +:10E56000020202020202020202020202020202028B +:10E57000020202020202020202020202020202027B +:10E58000020202020202020202020202020202026B +:10E59000020202020202020202020202020202025B +:10E5A000020202020202020202020202020202024B +:10E5B000020202020202020202020202020202023B +:10E5C000020202020202020202020202020202022B +:10E5D000020202020202020202020202020202021B +:10E5E000020202020202020202020202020202020B +:10E5F00002020202020202020202020202020202FB +:10E6000002020202020202020202020202020202EA +:10E6100002020202020202020202020202020202DA +:10E6200002020202020202020202020202020202CA +:10E6300002020202020202020202020202020202BA +:10E6400002020202020202020202020202020202AA +:10E65000020202020202020202020202020202029A +:10E66000020202020202020202020202020202028A +:10E67000020202020202020202020202020202027A +:10E68000020202020202020202020202020202026A +:10E69000020202020202020202020202020202025A +:10E6A000020202020202020202020202020202024A +:10E6B000020202020202020202020202020202023A +:10E6C000020202020202020202020202020202022A +:10E6D000020202020202020202020202020202021A +:10E6E000020202020202020202020202020202020A +:10E6F00002020202020202020202020202020202FA +:10E7000002020202020202020202020202020202E9 +:10E7100002020202020202020202020202020202D9 +:10E7200002020202020202020202020202020202C9 +:10E7300002020202020202020202020202020202B9 +:10E7400002020202020202020202020202020202A9 +:10E750000202020202020202020202020202020299 +:10E760000202020202020202020202020202020289 +:10E770000202020202020202020202020202020279 +:10E780000202020202020202020202020202020269 +:10E790000202020202020202020202020202020259 +:10E7A0000202020202020202020202020202020249 +:10E7B0000202020202020202020202020202020239 +:10E7C0000202020202020202020202020202020229 +:10E7D0000202020202020202020202020202020219 +:10E7E0000202020202020202020202020202020209 +:10E7F00002020202020202020202020202020202F9 +:10E8000002020202020202020202020202020202E8 +:10E8100002020202020202020202020202020202D8 +:10E8200002020202020202020202020202020202C8 +:10E8300002020202020202020202020202020202B8 +:10E8400002020202020202020202020202020202A8 +:10E850000202020202020202020202020202020298 +:10E860000202020202020202020202020202020288 +:10E870000202020202020202020202020202020278 +:10E880000202020202020202020202020202020268 +:10E890000202020202020202020202020202020258 +:10E8A0000202020202020202020202020202020248 +:10E8B0000202020202020202020202020202020238 +:10E8C0000202020202020202020202020202020228 +:10E8D0000202020202020202020202020202020218 +:10E8E0000202020202020202020202020202020208 +:10E8F00002020202020202020202020202020202F8 +:10E9000002020202020202020202020202020202E7 +:10E9100002020202020202020202020202020202D7 +:10E9200002020202020202020202020202020202C7 +:10E9300002020202020202020202020202020202B7 +:10E9400002020202020202020202020202020202A7 +:10E950000202020202020202020202020202020297 +:10E960000202020202020202020202020202020287 +:10E970000202020202020202020202020202020277 +:10E980000202020202020202020202020202020267 +:10E990000202020202020202020202020202020257 +:10E9A0000202020202020202020202020202020247 +:10E9B0000202020202020202020202020202020237 +:10E9C0000202020202020202020202020202020227 +:10E9D0000202020202020202020202020202020217 +:10E9E0000202020202020202020202020202020207 +:10E9F00002020202020202020202020202020202F7 +:10EA000002020202020202020202020202020202E6 +:10EA100002020202020202020202020202020202D6 +:10EA200002020202020202020202020202020202C6 +:10EA300002020202020202020202020202020202B6 +:10EA400002020202020202020202020202020202A6 +:10EA50000202020202020202020202020202020296 +:10EA60000202020202020202020202020202020286 +:10EA70000202020202020202020202020202020276 +:10EA80000202020202020202020202020202020266 +:10EA90000202020202020202020202020202020256 +:10EAA0000202020202020202020202020202020246 +:10EAB0000202020202020202020202020202020236 +:10EAC0000202020202020202020202020202020226 +:10EAD0000202020202020202020202020202020216 +:10EAE0000202020202020202020202020202020206 +:10EAF00002020202020202020202020202020202F6 +:10EB000002020202020202020202020202020202E5 +:10EB100002020202020202020202020202020202D5 +:10EB200002020202020202020202020202020202C5 +:10EB300002020202020202020202020202020202B5 +:10EB400002020202020202020202020202020202A5 +:10EB50000202020202020202020202020202020295 +:10EB60000202020202020202020202020202020285 +:10EB70000202020202020202020202020202020275 +:10EB80000202020202020202020202020202020265 +:10EB90000202020202020202020202020202020255 +:10EBA0000202020202020202020202020202020245 +:10EBB0000202020202020202020202020202020235 +:10EBC0000202020202020202020202020202020225 +:10EBD0000202020202020202020202020202020215 +:10EBE0000202020202020202020202020202020205 +:10EBF00002020202020202020202020202020202F5 +:10EC000002020202020202020202020202020202E4 +:10EC100002020202020202020202020202020202D4 +:10EC200002020202020202020202020202020202C4 +:10EC300002020202020202020202020202020202B4 +:10EC400002020202020202020202020202020202A4 +:10EC50000202020202020202020202020202020294 +:10EC60000202020202020202020202020202020284 +:10EC70000202020202020202020202020202020274 +:10EC80000202020202020202020202020202020264 +:10EC90000202020202020202020202020202020254 +:10ECA0000202020202020202020202020202020244 +:10ECB0000202020202020202020202020202020234 +:10ECC0000202020202020202020202020202020224 +:10ECD0000202020202020202020202020202020214 +:10ECE0000202020202020202020202020202020204 +:10ECF00002020202020202020202020202020202F4 +:10ED000002020202020202020202020202020202E3 +:10ED100002020202020202020202020202020202D3 +:10ED200002020202020202020202020202020202C3 +:10ED300002020202020202020202020202020202B3 +:10ED400002020202020202020202020202020202A3 +:10ED50000202020202020202020202020202020293 +:10ED60000202020202020202020202020202020283 +:10ED70000202020202020202020202020202020273 +:10ED80000202020202020202020202020202020263 +:10ED90000202020202020202020202020202020253 +:10EDA0000202020202020202020202020202020243 +:10EDB0000202020202020202020202020202020233 +:10EDC0000202020202020202020202020202020223 +:10EDD0000202020202020202020202020202020213 +:10EDE0000202020202020202020202020202020005 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000000000000000000000000000002 +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000092 +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000000000000000000000000000000000F0 +:10F0200000000000000000000000000000000000E0 +:10F0300000000000000000000000000000000000D0 +:10F0400000000000000000000000000000000000C0 +:10F0500000000000000000000000000000000000B0 +:10F0600000000000000000000000000000000000A0 +:10F070000000000000000000000000000000000090 +:10F080000000000000000000000000000000000080 +:10F090000000000000000000000000000000000070 +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D0000000000000000000000000000000000030 +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F1100000000000000000000000000000000000EF +:10F1200000000000000000000000000000000000DF +:10F1300000000000000000000000000000000000CF +:10F1400000000000000000000000000000000000BF +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000000000009F +:10F17000000000000000000000000000000000008F +:10F18000000000000000000000000000000000007F +:10F19000000000000000000000000000000000006F +:10F1A000000000000000000000000000000000005F +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F +:10F1D000000000000000000000000000000000002F +:10F1E000000000000000000000000000000000001F +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE +:10F2100000000000000000000000000000000000EE +:10F2200000000000000000000000000000000000DE +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000000000000000BE +:10F2500000000000000000000000000000000000AE +:10F26000000000000000000000000000000000009E +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000000000000007E +:10F29000000000000000000000000000000000006E +:10F2A000000000000000000000000000000000005E +:10F2B000000000000000000000000000000000004E +:10F2C000000000000000000000000000000000003E +:10F2D000000000000000000000000000000000002E +:10F2E0000000000000000000000000000000006BB3 +:10F2F0000000000000000001010101010101010105 +:10F3000001010101010101010101010101010101ED +:10F3100001010101010101010101010101010101DD +:10F3200001010101010101010101010101010101CD +:10F3300001010101010101010101010101010101BD +:10F3400001010101010101010101010101010101AD +:10F35000010101010101010101010101010101019D +:10F36000010101010101010101010101010101018D +:10F37000010101010101010101010101010101017D +:10F38000010101010101010101010101010101016D +:10F39000010101010101010101010101010101015D +:10F3A000010101010101010101010101010101014D +:10F3B000010101010101010101010101010101013D +:10F3C000010101010101010101010101010101012D +:10F3D000010101010101010101010101010101011D +:10F3E000010101010101010101010101010101010D +:10F3F00001010101010101010101010101010101FD +:10F4000001010101010101010101010101010101EC +:10F4100001010101010101010101010101010101DC +:10F4200001010101010101010101010101010101CC +:10F4300001010101010101010101010101010101BC +:10F4400001010101010101010101010101010101AC +:10F45000010101010101010101010101010101019C +:10F46000010101010101010101010101010101018C +:10F47000010101010101010101010101010101017C +:10F48000010101010101010101010101010101016C +:10F49000010101010101010101010101010101015C +:10F4A000010101010101010101010101010101014C +:10F4B000010101010101010101010101010101013C +:10F4C000010101010101010101010101010101012C +:10F4D000010101010101010101010101010101011C +:10F4E000010101010101010101010101010101010C +:10F4F00001010101010101010101010101010101FC +:10F5000001010101010101010101010101010101EB +:10F5100001010101010101010101010101010101DB +:10F5200001010101010101010101010101010101CB +:10F5300001010101010101010101010101010101BB +:10F5400001010101010101010101010101010101AB +:10F55000010101010101010101010101010101019B +:10F56000010101010101010101010101010101018B +:10F57000010101010101010101010101010101017B +:10F58000010101010101010101010101010101016B +:10F59000010101010101010101010101010101015B +:10F5A000010101010101010101010101010101014B +:10F5B000010101010101010101010101010101013B +:10F5C000010101010101010101010101010101012B +:10F5D000010101010101010101010101010101011B +:10F5E000010101010101010101010101010101010B +:10F5F00001010101010101010101010101010101FB +:10F6000001010101010101010101010101010101EA +:10F6100001010101010101010101010101010101DA +:10F6200001010101010101010101010101010101CA +:10F6300001010101010101010101010101010101BA +:10F6400001010101010101010101010101010101AA +:10F65000010101010101010101010101010101019A +:10F66000010101010101010101010101010101018A +:10F67000010101010101010101010101010101017A +:10F68000010101010101010101010101010101016A +:10F69000010101010101010101010101010101015A +:10F6A000010101010101010101010101010101014A +:10F6B000010101010101010101010101010101013A +:10F6C000010101010101010101010101010101012A +:10F6D000010101010101010101010101010101011A +:10F6E000010101010101010101010101010101010A +:10F6F00001010101010101010101010101010101FA +:10F7000001010101010101010101010101010101E9 +:10F7100001010101010101010101010101010101D9 +:10F7200001010101010101010101010101010101C9 +:10F7300001010101010101010101010101010101B9 +:10F7400001010101010101010101010101010101A9 +:10F750000101010101010101010101010101010199 +:10F760000101010101010101010101010101010189 +:10F770000101010101010101010101010101010179 +:10F780000101010101010101010101010101010169 +:10F790000101010101010101010101010101010159 +:10F7A0000101010101010101010101010101010149 +:10F7B0000101010101010101010101010101010139 +:10F7C0000101010101010101010101010101010129 +:10F7D0000101010101010101010101010101010119 +:10F7E0000101010101010101010101010101010109 +:10F7F00001010101010101010101010101010101F9 +:10F8000001010101010101010101010101010101E8 +:10F8100001010101010101010101010101010101D8 +:10F8200001010101010101010101010101010101C8 +:10F8300001010101010101010101010101010101B8 +:10F8400001010101010101010101010101010101A8 +:10F850000101010101010101010101010101010198 +:10F860000101010101010101010101010101010188 +:10F870000101010101010101010101010101010178 +:10F880000101010101010101010101010101010168 +:10F890000101010101010101010101010101010158 +:10F8A0000101010101010101010101010101010148 +:10F8B0000101010101010101010101010101010138 +:10F8C0000101010101010101010101010101010128 +:10F8D0000101010101010101010101010101010118 +:10F8E0000101010101010101010101010101010108 +:10F8F00001010101010101010101010101010101F8 +:10F9000001010101010101010101010101010101E7 +:10F9100001010101010101010101010101010101D7 +:10F9200001010101010101010101010101010101C7 +:10F9300001010101010101010101010101010101B7 +:10F9400001010101010101010101010101010101A7 +:10F950000101010101010101010101010101010197 +:10F960000101010101010101010101010101010187 +:10F970000101010101010101010101010101010177 +:10F980000101010101010101010101010101010167 +:10F990000101010101010101010101010101010157 +:10F9A0000101010101010101010101010101010147 +:10F9B0000101010101010101010101010101010137 +:10F9C0000101010101010101010101010101010127 +:10F9D0000101010101010101010101010101010117 +:10F9E0000101010101010101010101010101010107 +:10F9F00001010101010101010101010101010101F7 +:10FA000001010101010101010101010101010101E6 +:10FA100001010101010101010101010101010101D6 +:10FA200001010101010101010101010101010101C6 +:10FA300001010101010101010101010101010101B6 +:10FA400001010101010101010101010101010101A6 +:10FA50000101010101010101010101010101010196 +:10FA60000101010101010101010101010101010186 +:10FA70000101010101010101010101010101010176 +:10FA80000101010101010101010101010101010166 +:10FA90000101010101010101010101010101010156 +:10FAA0000101010101010101010101010101010146 +:10FAB0000101010101010101010101010101010136 +:10FAC0000101010101010101010101010101010126 +:10FAD0000101010101010101010101010101010116 +:10FAE0000101010101010101010101010101010106 +:10FAF00001010101010101010101010101010101F6 +:10FB000001010101010101010101010101010101E5 +:10FB100001010101010101010101010101010101D5 +:10FB200001010101010101010101010101010101C5 +:10FB300001010101010101010101010101010101B5 +:10FB400001010101010101010101010101010101A5 +:10FB50000101010101010101010101010101010195 +:10FB60000101010101010101010101010101010185 +:10FB70000101010101010101010101010101010175 +:10FB80000101010101010101010101010101010165 +:10FB90000101010101010101010101010101010155 +:10FBA0000101010101010101010101010101010145 +:10FBB0000101010101010101010101010101010135 +:10FBC0000101010101010101010101010101010125 +:10FBD0000101010101010101010101010101010115 +:10FBE0000101010101010101010101010101010105 +:10FBF00001010101010101010101010101010101F5 +:10FC000001010101010101010101010101010101E4 +:10FC100001010101010101010101010101010101D4 +:10FC200001010101010101010101010101010101C4 +:10FC300001010101010101010101010101010101B4 +:10FC400001010101010101010101010101010101A4 +:10FC50000101010101010101010101010101010194 +:10FC60000101010101010101010101010101010184 +:10FC70000101010101010101010101010101010174 +:10FC80000101010101010101010101010101010164 +:10FC90000101010101010101010101010101010154 +:10FCA0000101010101010101010101010101010144 +:10FCB0000101010101010101010101010101010134 +:10FCC0000101010101010101010101010101010124 +:10FCD0000101010101010101010101010101010114 +:10FCE0000101010101010101010101010101010104 +:10FCF00001010101010101010101010101010101F4 +:10FD000001010101010101010101010101010101E3 +:10FD100001010101010101010101010101010101D3 +:10FD200001010101010101010101010101010101C3 +:10FD300001010101010101010101010101010101B3 +:10FD400001010101010101010101010101010101A3 +:10FD50000101010101010101010101010101010193 +:10FD60000101010101010101010101010101010183 +:10FD70000101010101010101010101010101010173 +:10FD80000101010101010101010101010101010163 +:10FD90000101010101010101010101010101010153 +:10FDA0000101010101010101010101010101010143 +:10FDB0000101010101010101010101010101010133 +:10FDC0000101010101010101010101010101010123 +:10FDD0000101010101010101010101010101010113 +:10FDE0000101010101010101010101010101010103 +:10FDF00001010101010101010101010101010101F3 +:10FE000001010101010101010101010101010101E2 +:10FE100001010101010101010101010101010101D2 +:10FE200001010101010101010101010101010101C2 +:10FE300001010101010101010101010101010101B2 +:10FE400001010101010101010101010101010101A2 +:10FE50000101010101010101010101010101010192 +:10FE60000101010101010101010101010101010182 +:10FE70000101010101010101010101010101010172 +:10FE80000101010101010101010101010101010162 +:10FE90000101010101010101010101010101010152 +:10FEA0000101010101010101010101010101010142 +:10FEB0000101010101010101010101010101010132 +:10FEC0000101010101010101010101010101010122 +:10FED0000101010101010101010101010101010112 +:10FEE0000101010101010101010101010101010102 +:10FEF00001010101010101010101010101010101F2 +:10FF000001010101010101010101010101010101E1 +:10FF100001010101010101010101010101010101D1 +:10FF200001010101010101010101010101010101C1 +:10FF300001010101010101010101010101010101B1 +:10FF400001010101010101010101010101010101A1 +:10FF50000101010101010101010101010101010191 +:10FF60000101010101010101010101010101010181 +:10FF70000101010101010101010101010101010171 +:10FF80000101010101010101010101010101010161 +:10FF90000101010101010101010101010101010151 +:10FFA0000101010101010101010101010101010141 +:10FFB0000101010101010101010101010101010131 +:10FFC0000101010101010101010101010101010121 +:10FFD0000101010101010101010101010101010111 +:10FFE0000101010101010101010101010101010101 +:10FFF00001010101010101010101010101010101F1 +:020000022000DC +:1000000001010101010101010101010101010101E0 +:1000100001010101010101010101010101010101D0 +:1000200001010101010101010101010101010101C0 +:1000300001010101010101010101010101010101B0 +:1000400001010101010101010101010101010101A0 +:100050000101010101010101010101010101010190 +:100060000101010101010101010101010101010180 +:100070000101010101010101010101010101010170 +:100080000101010101010101010101010101010160 +:100090000101010101010101010101010101010150 +:1000A0000101010101010101010101010101010140 +:1000B0000101010101010101010101010101010130 +:1000C0000101010101010101010101010101010120 +:1000D0000101010101010101010101010101010110 +:1000E0000101010101010101010101010101010100 +:1000F00001010101010101010101010101010101F0 +:1001000001010101010101010101010101010101DF +:1001100001010101010101010101010101010101CF +:1001200001010101010101010101010101010101BF +:1001300001010101010101010101010101010101AF +:10014000010101010101010101010101010101019F +:10015000010101010101010101010101010101018F +:10016000010101010101010101010101010101017F +:10017000010101010101010101010101010101016F +:10018000010101010101010101010101010101015F +:10019000010101010101010101010101010101014F +:1001A000010101010101010101010101010101013F +:1001B000010101010101010101010101010101012F +:1001C000010101010101010101010101010101011F +:1001D000010101010101010101010101010101010F +:1001E00001010101010101010101010101010101FF +:1001F00001010101010101010101010101010101EF +:1002000001010101010101010101010101010101DE +:1002100001010101010101010101010101010101CE +:1002200001010101010101010101010101010101BE +:1002300001010101010101010101010101010101AE +:10024000010101010101010101010101010101019E +:10025000010101010101010101010101010101018E +:10026000010101010101010101010101010101017E +:10027000010101010101010101010101010101016E +:10028000010101010101010101010101010101015E +:10029000010101010101010101010101010101014E +:1002A000010101010101010101010101010101013E +:1002B000010101010101010101010101010101012E +:1002C000010101010101010101010101010101011E +:1002D000010101010101010101010101010101010E +:1002E00001010101010101010101010101010101FE +:1002F00001010101010101010101010101010101EE +:1003000001010101010101010101010101010101DD +:1003100001010101010101010101010101010101CD +:1003200001010101010101010101010101010101BD +:1003300001010101010101010101010101010101AD +:10034000010101010101010101010101010101019D +:10035000010101010101010101010101010101018D +:10036000010101010101010101010101010101017D +:10037000010101010101010101010101010101016D +:10038000010101010101010101010101010101015D +:10039000010101010101010101010101010101014D +:1003A000010101010101010101010101010101013D +:1003B000010101010101010101010101010101012D +:1003C000010101010101010101010101010101011D +:1003D000010101010101010101010101010101010D +:1003E00001010101010101010101010101010101FD +:1003F00001010101010101010101010101010101ED +:1004000001010101010101010101010101010101DC +:1004100001010101010101010101010101010101CC +:1004200001010101010101010101010101010101BC +:1004300001010101010101010101010101010101AC +:10044000010101010101010101010101010101019C +:10045000010101010101010101010101010101018C +:10046000010101010101010101010101010101017C +:10047000010101010101010101010101010101016C +:10048000010101010101010101010101010101015C +:10049000010101010101010101010101010101014C +:1004A000010101010101010101010101010101013C +:1004B000010101010101010101010101010101012C +:1004C000010101010101010101010101010101011C +:1004D000010101010101010101010101010101010C +:1004E00001010101010101010101010101010101FC +:1004F00001010101010101010101010101010101EC +:1005000001010101010101010101010101010101DB +:1005100001010101010101010101010101010101CB +:1005200001010101010101010101010101010101BB +:1005300001010101010101010101010101010101AB +:10054000010101010101010101010101010101019B +:10055000010101010101010101010101010101018B +:10056000010101010101010101010101010101017B +:10057000010101010101010101010101010101016B +:10058000010101010101010101010101010101015B +:10059000010101010101010101010101010101014B +:1005A000010101010101010101010101010101013B +:1005B000010101010101010101010101010101012B +:1005C000010101010101010101010101010101011B +:1005D000010101010101010101010101010101010B +:1005E00001010101010101010101010101010101FB +:1005F00001010101010101010101010101010101EB +:1006000001010101010101010101010101010101DA +:1006100001010101010101010101010101010101CA +:1006200001010101010101010101010101010101BA +:1006300001010101010101010101010101010101AA +:10064000010101010101010101010101010101019A +:10065000010101010101010101010101010101018A +:10066000010101010101010101010101010101017A +:10067000010101010101010101010101010101016A +:10068000010101010101010101010101010101015A +:10069000010101010101010101010101010101014A +:1006A000010101010101010101010101010101013A +:1006B000010101010101010101010101010101012A +:1006C000010101010101010101010101010101011A +:1006D000010101010101010101010101010101010A +:1006E00001010101010101010101010101010101FA +:1006F00001010101010101000000000000000000F3 +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000000B8 +:1008400000000000000000000000000000000000A8 +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:100890000000000000000000000000000000000058 +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000000000000000000028 +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:1009100000000000000000000000000000000000D7 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000000000000000000000B7 +:1009400000000000000000000000000000000000A7 +:100950000000000000000000000000000000000097 +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000000000000000000000C6 +:100A300000000000000000000000000000000000B6 +:100A400000000000000000000000000000000000A6 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA0000000000000000000000000000000000046 +:100AB0000000000000000000000000000000000036 +:100AC0000000000000000000000000000000000026 +:100AD0000000000000000000000000000000000016 +:100AE0000000000000000000000000000000000006 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000000000000000000000C5 +:100B300000000000000000000000000000000000B5 +:100B400000000000000000000000000000000000A5 +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA0000000000000000000000000000000000045 +:100BB0000000000000000000000000000000000035 +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000000015 +:100BE0000000000000000000000000000000000005 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000000000000000000000C4 +:100C300000000000000000000000000000000000B4 +:100C400000000000000000000000000000000000A4 +:100C50000000000000000000000000000000000094 +:100C60000000000000000000000000000000000084 +:100C70000000000000000000000000000000000074 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA0000000000000000000000000000000000044 +:100CB0000000000000000000000000000000000034 +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000000000000000000000014 +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000020202020202020202E2 +:100D000002020202020202020202020202020202C3 +:100D100002020202020202020202020202020202B3 +:100D200002020202020202020202020202020202A3 +:100D30000202020202020202020202020202020293 +:100D40000202020202020202020202020202020283 +:100D50000202020202020202020202020202020273 +:100D60000202020202020202020202020202020263 +:100D70000202020202020202020202020202020253 +:100D80000202020202020202020202020202020243 +:100D90000202020202020202020202020202020233 +:100DA0000202020202020202020202020202020223 +:100DB0000202020202020202020202020202020213 +:100DC0000202020202020202020202020202020203 +:100DD00002020202020202020202020202020202F3 +:100DE00002020202020202020202020202020202E3 +:100DF00002020202020202020202020202020202D3 +:100E000002020202020202020202020202020202C2 +:100E100002020202020202020202020202020202B2 +:100E200002020202020202020202020202020202A2 +:100E30000202020202020202020202020202020292 +:100E40000202020202020202020202020202020282 +:100E50000202020202020202020202020202020272 +:100E60000202020202020202020202020202020262 +:100E70000202020202020202020202020202020252 +:100E80000202020202020202020202020202020242 +:100E90000202020202020202020202020202020232 +:100EA0000202020202020202020202020202020222 +:100EB0000202020202020202020202020202020212 +:100EC0000202020202020202020202020202020202 +:100ED00002020202020202020202020202020202F2 +:100EE00002020202020202020202020202020202E2 +:100EF00002020202020202020202020202020202D2 +:100F000002020202020202020202020202020202C1 +:100F100002020202020202020202020202020202B1 +:100F200002020202020202020202020202020202A1 +:100F30000202020202020202020202020202020291 +:100F40000202020202020202020202020202020281 +:100F50000202020202020202020202020202020271 +:100F60000202020202020202020202020202020261 +:100F70000202020202020202020202020202020251 +:100F80000202020202020202020202020202020241 +:100F90000202020202020202020202020202020231 +:100FA0000202020202020202020202020202020221 +:100FB0000202020202020202020202020202020211 +:100FC0000202020202020202020202020202020201 +:100FD00002020202020202020202020202020202F1 +:100FE00002020202020202020202020202020202E1 +:100FF00002020202020202020202020202020202D1 +:1010000002020202020202020202020202020202C0 +:1010100002020202020202020202020202020202B0 +:1010200002020202020202020202020202020202A0 +:101030000202020202020202020202020202020290 +:101040000202020202020202020202020202020280 +:101050000202020202020202020202020202020270 +:101060000202020202020202020202020202020260 +:101070000202020202020202020202020202020250 +:101080000202020202020202020202020202020240 +:101090000202020202020202020202020202020230 +:1010A0000202020202020202020202020202020220 +:1010B0000202020202020202020202020202020210 +:1010C0000202020202020202020202020202020200 +:1010D00002020202020202020202020202020202F0 +:1010E00002020202020202020202020202020202E0 +:1010F00002020202020202020202020202020202D0 +:1011000002020202020202020202020202020202BF +:1011100002020202020202020202020202020202AF +:10112000020202020202020202020202020202029F +:10113000020202020202020202020202020202028F +:10114000020202020202020202020202020202027F +:10115000020202020202020202020202020202026F +:10116000020202020202020202020202020202025F +:10117000020202020202020202020202020202024F +:10118000020202020202020202020202020202023F +:10119000020202020202020202020202020202022F +:1011A000020202020202020202020202020202021F +:1011B000020202020202020202020202020202020F +:1011C00002020202020202020202020202020202FF +:1011D00002020202020202020202020202020202EF +:1011E00002020202020202020202020202020202DF +:1011F00002020202020202020202020202020202CF +:1012000002020202020202020202020202020202BE +:1012100002020202020202020202020202020202AE +:10122000020202020202020202020202020202029E +:10123000020202020202020202020202020202028E +:10124000020202020202020202020202020202027E +:10125000020202020202020202020202020202026E +:10126000020202020202020202020202020202025E +:10127000020202020202020202020202020202024E +:10128000020202020202020202020202020202023E +:10129000020202020202020202020202020202022E +:1012A000020202020202020202020202020202021E +:1012B000020202020202020202020202020202020E +:1012C00002020202020202020202020202020202FE +:1012D00002020202020202020202020202020202EE +:1012E00002020202020202020202020202020202DE +:1012F00002020202020202020202020202020202CE +:1013000002020202020202020202020202020202BD +:1013100002020202020202020202020202020202AD +:10132000020202020202020202020202020202029D +:10133000020202020202020202020202020202028D +:10134000020202020202020202020202020202027D +:10135000020202020202020202020202020202026D +:10136000020202020202020202020202020202025D +:10137000020202020202020202020202020202024D +:10138000020202020202020202020202020202023D +:10139000020202020202020202020202020202022D +:1013A000020202020202020202020202020202021D +:1013B000020202020202020202020202020202020D +:1013C00002020202020202020202020202020202FD +:1013D00002020202020202020202020202020202ED +:1013E00002020202020202020202020202020202DD +:1013F00002020202020202020202020202020202CD +:1014000002020202020202020202020202020202BC +:1014100002020202020202020202020202020202AC +:10142000020202020202020202020202020202029C +:10143000020202020202020202020202020202028C +:10144000020202020202020202020202020202027C +:10145000020202020202020202020202020202026C +:10146000020202020202020202020202020202025C +:10147000020202020202020202020202020202024C +:10148000020202020202020202020202020202023C +:10149000020202020202020202020202020202022C +:1014A000020202020202020202020202020202021C +:1014B000020202020202020202020202020202020C +:1014C00002020202020202020202020202020202FC +:1014D00002020202020202020202020202020202EC +:1014E00002020202020202020202020202020202DC +:1014F00002020202020202020202020202020202CC +:1015000002020202020202020202020202020202BB +:1015100002020202020202020202020202020202AB +:10152000020202020202020202020202020202029B +:10153000020202020202020202020202020202028B +:10154000020202020202020202020202020202027B +:10155000020202020202020202020202020202026B +:10156000020202020202020202020202020202025B +:10157000020202020202020202020202020202024B +:10158000020202020202020202020202020202023B +:10159000020202020202020202020202020202022B +:1015A000020202020202020202020202020202021B +:1015B000020202020202020202020202020202020B +:1015C00002020202020202020202020202020202FB +:1015D00002020202020202020202020202020202EB +:1015E00002020202020202020202020202020202DB +:1015F00002020202020202020202020202020202CB +:1016000002020202020202020202020202020202BA +:1016100002020202020202020202020202020202AA +:10162000020202020202020202020202020202029A +:10163000020202020202020202020202020202028A +:10164000020202020202020202020202020202027A +:10165000020202020202020202020202020202026A +:10166000020202020202020202020202020202025A +:10167000020202020202020202020202020202024A +:10168000020202020202020202020202020202023A +:10169000020202020202020202020202020202022A +:1016A000020202020202020202020202020202021A +:1016B000020202020202020202020202020202020A +:1016C00002020202020202020202020202020202FA +:1016D00002020202020202020202020202020202EA +:1016E00002020202020202020202020202020202DA +:1016F00002020202020202020202020202020202CA +:1017000002020202020202020202020202020202B9 +:1017100002020202020202020202020202020202A9 +:101720000202020202020202020202020202020299 +:101730000202020202020202020202020202020289 +:101740000202020202020202020202020202020279 +:101750000202020202020202020202020202020269 +:101760000202020202020202020202020202020259 +:101770000202020202020202020202020202020249 +:101780000202020202020202020202020202020239 +:101790000202020202020202020202020202020229 +:1017A0000202020202020202020202020202020219 +:1017B0000202020202020202020202020202020209 +:1017C00002020202020202020202020202020202F9 +:1017D00002020202020202020202020202020202E9 +:1017E00002020202020202020202020202020202D9 +:1017F00002020202020202020202020202020202C9 +:1018000002020202020202020202020202020202B8 +:1018100002020202020202020202020202020202A8 +:101820000202020202020202020202020202020298 +:101830000202020202020202020202020202020288 +:101840000202020202020202020202020202020278 +:101850000202020202020202020202020202020268 +:101860000202020202020202020202020202020258 +:101870000202020202020202020202020202020248 +:101880000202020202020202020202020202020238 +:101890000202020202020202020202020202020228 +:1018A0000202020202020202020202020202020218 +:1018B0000202020202020202020202020202020208 +:1018C00002020202020202020202020202020202F8 +:1018D00002020202020202020202020202020202E8 +:1018E00002020202020202020202020202020202D8 +:1018F00002020202020202020202020202020202C8 +:1019000002020202020202020202020202020202B7 +:1019100002020202020202020202020202020202A7 +:101920000202020202020202020202020202020297 +:101930000202020202020202020202020202020287 +:101940000202020202020202020202020202020277 +:101950000202020202020202020202020202020267 +:101960000202020202020202020202020202020257 +:101970000202020202020202020202020202020247 +:101980000202020202020202020202020202020237 +:101990000202020202020202020202020202020227 +:1019A0000202020202020202020202020202020217 +:1019B0000202020202020202020202020202020207 +:1019C00002020202020202020202020202020202F7 +:1019D00002020202020202020202020202020202E7 +:1019E00002020202020202020202020202020202D7 +:1019F00002020202020202020202020202020202C7 +:101A000002020202020202020202020202020202B6 +:101A100002020202020202020202020202020202A6 +:101A20000202020202020202020202020202020296 +:101A30000202020202020202020202020202020286 +:101A40000202020202020202020202020202020276 +:101A50000202020202020202020202020202020266 +:101A60000202020202020202020202020202020256 +:101A70000202020202020202020202020202020246 +:101A80000202020202020202020202020202020236 +:101A90000202020202020202020202020202020226 +:101AA0000202020202020202020202020202020216 +:101AB0000202020202020202020202020202020206 +:101AC00002020202020202020202020202020202F6 +:101AD00002020202020202020202020202020202E6 +:101AE00002020202020202020202020202020202D6 +:101AF00002020202020202020202020202020202C6 +:101B000002020202020202020202020202020202B5 +:101B100002020202020202020202020202020202A5 +:101B20000202020202020202020202020202020295 +:101B30000202020202020202020202020202020285 +:101B40000202020202020202020202020202020275 +:101B50000202020202020202020202020202020265 +:101B60000202020202020202020202020202020255 +:101B70000202020202020202020202020202020245 +:101B80000202020202020202020202020202020235 +:101B90000202020202020202020202020202020225 +:101BA0000202020202020202020202020202020215 +:101BB0000202020202020202020202020202020205 +:101BC00002020202020202020202020202020202F5 +:101BD00002020202020202020202020202020202E5 +:101BE00002020202020202020202020202020202D5 +:101BF00002020202020202020202020202020202C5 +:101C000002020202020202020202020202020202B4 +:101C100002020202020202020202020202020202A4 +:101C20000202020202020202020202020202020294 +:101C30000202020202020202020202020202020284 +:101C40000202020202020202020202020202020274 +:101C50000202020202020202020202020202020264 +:101C60000202020202020202020202020202020254 +:101C70000202020202020202020202020202020244 +:101C80000202020202020202020202020202020234 +:101C90000202020202020202020202020202020224 +:101CA0000202020202020202020202020202020214 +:101CB0000202020202020202020202020202020204 +:101CC00002020202020202020202020202020202F4 +:101CD00002020202020202020202020202020202E4 +:101CE00002020202020202020202020202020202D4 +:101CF00002020202020202020202020202020202C4 +:101D000002020202020202020202020202020202B3 +:101D100002020202020202020202020202020202A3 +:101D20000202020202020202020202020202020293 +:101D30000202020202020202020202020202020283 +:101D40000202020202020202020202020202020273 +:101D50000202020202020202020202020202020263 +:101D60000202020202020202020202020202020253 +:101D70000202020202020202020202020202020243 +:101D80000202020202020202020202020202020233 +:101D90000202020202020202020202020202020223 +:101DA0000202020202020202020202020202020213 +:101DB0000202020202020202020202020202020203 +:101DC00002020202020202020202020202020202F3 +:101DD00002020202020202020202020202020202E3 +:101DE00002020202020202020202020202020202D3 +:101DF00002020202020202020202020202020202C3 +:101E000002020202020202020202020202020202B2 +:101E100002020202020202020202020202020202A2 +:101E20000202020202020202020202020202020292 +:101E30000202020202020202020202020202020282 +:101E40000202020202020202020202020202020272 +:101E50000202020202020202020202020202020262 +:101E60000202020202020202020202020202020252 +:101E70000202020202020202020202020202020242 +:101E80000202020202020202020202020202020232 +:101E90000202020202020202020202020202020222 +:101EA0000202020202020202020202020202020212 +:101EB0000202020202020202020202020202020202 +:101EC00002020202020202020202020202020202F2 +:101ED00002020202020202020202020202020202E2 +:101EE00002020202020202020202020202020202D2 +:101EF00002020202020202020202020202020202C2 +:101F000002020202020202020202020202020202B1 +:101F100002020202020202020202020202020202A1 +:101F20000202020202020202020202020202020291 +:101F30000202020202020202020202020202020281 +:101F40000202020202020202020202020202020271 +:101F50000202020202020202020202020202020261 +:101F60000202020202020202020202020202020251 +:101F70000202020202020202020202020202020241 +:101F80000202020202020202020202020202020231 +:101F90000202020202020202020202020202020221 +:101FA0000202020202020202020202020202020211 +:101FB0000202020202020202020202020202020201 +:101FC00002020202020202020202020202020202F1 +:101FD00002020202020202020202020202020202E1 +:101FE00002020202020202020202020202020202D1 +:101FF00002020202020202020202020202020202C1 +:1020000002020202020202020202020202020202B0 +:1020100002020202020202020202020202020202A0 +:102020000202020202020202020202020202020290 +:102030000202020202020202020202020202020280 +:102040000202020202020202020202020202020270 +:102050000202020202020202020202020202020260 +:102060000202020202020202020202020202020250 +:102070000202020202020202020202020202020240 +:102080000202020202020202020202020202020230 +:102090000202020202020202020202020202020220 +:1020A0000202020202020202020202020202020210 +:1020B0000202020202020202020202020202020200 +:1020C00002020202020202020202020202020202F0 +:1020D00002020202020202020202020202020202E0 +:1020E00002020202020202020202020202020202D0 +:1020F00002020202020202000000000000000000D2 +:1021000000000000000000000000000000000000CF +:1021100000000000000000000000000000000000BF +:1021200000000000000000000000000000000000AF +:10213000000000000000000000000000000000009F +:10214000000000000000000000000000000000008F +:10215000000000000000000000000000000000007F +:10216000000000000000000000000000000000006F +:10217000000000000000000000000000000000005F +:10218000000000000000000000000000000000004F +:10219000000000000000000000000000000000003F +:1021A000000000000000000000000000000000002F +:1021B000000000000000000000000000000000001F +:1021C000000000000000000000000000000000000F +:1021D00000000000000000000000000000000000FF +:1021E00000000000000000000000000000000000EF +:1021F00000000000000000000000000000000000DF +:1022000000000000000000000000000000000000CE +:1022100000000000000000000000000000000000BE +:1022200000000000000000000000000000000000AE +:10223000000000000000000000000000000000009E +:10224000000000000000000000000000000000008E +:10225000000000000000000000000000000000007E +:10226000000000000000000000000000000000006E +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000000000004E +:10229000000000000000000000000000000000003E +:1022A000000000000000000000000000000000002E +:1022B000000000000000000000000000000000001E +:1022C000000000000000000000000000000000000E +:1022D00000000000000000000000000000000000FE +:1022E00000000000000000000000000000000000EE +:1022F00000000000000000000000000000000000DE +:1023000000000000000000000000000000000000CD +:1023100000000000000000000000000000000000BD +:1023200000000000000000000000000000000000AD +:10233000000000000000000000000000000000009D +:10234000000000000000000000000000000000008D +:10235000000000000000000000000000000000007D +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000000000005D +:10238000000000000000000000000000000000004D +:10239000000000000000000000000000000000003D +:1023A000000000000000000000000000000000002D +:1023B000000000000000000000000000000000001D +:1023C000000000000000000000000000000000000D +:1023D00000000000000000000000000000000000FD +:1023E00000000000000000000000000000000000ED +:1023F00000000000000000000000000000000000DD +:1024000000000000000000000000000000000000CC +:1024100000000000000000000000000000000000BC +:1024200000000000000000000000000000000000AC +:10243000000000000000000000000000000000009C +:10244000000000000000000000000000000000008C +:10245000000000000000000000000000000000007C +:10246000000000000000000000000000000000006C +:10247000000000000000000000000000000000005C +:10248000000000000000000000000000000000004C +:10249000000000000000000000000000000000003C +:1024A000000000000000000000000000000000002C +:1024B000000000000000000000000000000000001C +:1024C000000000000000000000000000000000000C +:1024D00000000000000000000000000000000000FC +:1024E00000000000000000000000000000000000EC +:1024F00000000000000000000000000000000000DC +:1025000000000000000000000000000000000000CB +:1025100000000000000000000000000000000000BB +:1025200000000000000000000000000000000000AB +:10253000000000000000000000000000000000009B +:10254000000000000000000000000000000000008B +:10255000000000000000000000000000000000007B +:10256000000000000000000000000000000000006B +:10257000000000000000000000000000000000005B +:10258000000000000000000000000000000000004B +:10259000000000000000000000000000000000003B +:1025A000000000000000000000000000000000002B +:1025B000000000000000000000000000000000001B +:1025C000000000000000000000000000000000000B +:1025D00000000000000000000000000000000000FB +:1025E00000000000000000000000000000000000EB +:1025F00000000000000000000000000000000000DB +:1026000000000000000000000000000000000000CA +:1026100000000000000000000000000000000000BA +:1026200000000000000000000000000000000000AA +:10263000000000000000000000000000000000009A +:10264000000000000000000000000000000000008A +:10265000000000000000000000000000000000007A +:10266000000000000000000000000000000000006A +:10267000000000000000000000000000000000005A +:10268000000000000000000000000000000000004A +:10269000000000000000000000000000000000003A +:1026A000000000000000000000000000000000002A +:1026B000000000000000000000000000000000001A +:1026C000000000000000000000000000000000000A +:1026D00000000000000000000000000000000000FA +:1026E00000000000000000000000000000000000EA +:1026F00000000000000000000000000000000000DA +:1027000000000000000000000000000000000000C9 +:1027100000000000000000000000000000000000B9 +:1027200000000000000000000000000000000000A9 +:102730000000000000000000000000000000000099 +:102740000000000000000000000000000000000089 +:102750000000000000000000000000000000000079 +:102760000000000000000000000000000000000069 +:102770000000000000000000000000000000000059 +:102780000000000000000000000000000000000049 +:102790000000000000000000000000000000000039 +:1027A0000000000000000000000000000000000029 +:1027B0000000000000000000000000000000000019 +:1027C0000000000000000000000000000000000009 +:1027D00000000000000000000000000000000000F9 +:1027E00000000000000000000000000000000000E9 +:1027F00000000000000000000000000000000000D9 +:1028000000000000000000000000000000000000C8 +:1028100000000000000000000000000000000000B8 +:1028200000000000000000000000000000000000A8 +:102830000000000000000000000000000000000098 +:102840000000000000000000000000000000000088 +:102850000000000000000000000000000000000078 +:102860000000000000000000000000000000000068 +:102870000000000000000000000000000000000058 +:102880000000000000000000000000000000000048 +:102890000000000000000000000000000000000038 +:1028A0000000000000000000000000000000000028 +:1028B0000000000000000000000000000000000018 +:1028C0000000000000000000000000000000000008 +:1028D00000000000000000000000000000000000F8 +:1028E00000000000000000000000000000000000E8 +:1028F00000000000000000000000000000000000D8 +:1029000000000000000000000000000000000000C7 +:1029100000000000000000000000000000000000B7 +:1029200000000000000000000000000000000000A7 +:102930000000000000000000000000000000000097 +:102940000000000000000000000000000000000087 +:102950000000000000000000000000000000000077 +:102960000000000000000000000000000000000067 +:102970000000000000000000000000000000000057 +:102980000000000000000000000000000000000047 +:102990000000000000000000000000000000000037 +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000000000000017 +:1029C0000000000000000000000000000000000007 +:1029D00000000000000000000000000000000000F7 +:1029E00000000000000000000000000000000000E7 +:1029F00000000000000000010101010101010101CE +:102A000001010101010101010101010101010101B6 +:102A100001010101010101010101010101010101A6 +:102A20000101010101010101010101010101010196 +:102A30000101010101010101010101010101010186 +:102A40000101010101010101010101010101010176 +:102A50000101010101010101010101010101010166 +:102A60000101010101010101010101010101010156 +:102A70000101010101010101010101010101010146 +:102A80000101010101010101010101010101010136 +:102A90000101010101010101010101010101010126 +:102AA0000101010101010101010101010101010116 +:102AB0000101010101010101010101010101010106 +:102AC00001010101010101010101010101010101F6 +:102AD00001010101010101010101010101010101E6 +:102AE00001010101010101010101010101010101D6 +:102AF00001010101010101010101010101010101C6 +:102B000001010101010101010101010101010101B5 +:102B100001010101010101010101010101010101A5 +:102B20000101010101010101010101010101010195 +:102B30000101010101010101010101010101010185 +:102B40000101010101010101010101010101010175 +:102B50000101010101010101010101010101010165 +:102B60000101010101010101010101010101010155 +:102B70000101010101010101010101010101010145 +:102B80000101010101010101010101010101010135 +:102B90000101010101010101010101010101010125 +:102BA0000101010101010101010101010101010115 +:102BB0000101010101010101010101010101010105 +:102BC00001010101010101010101010101010101F5 +:102BD00001010101010101010101010101010101E5 +:102BE00001010101010101010101010101010101D5 +:102BF00001010101010101010101010101010101C5 +:102C000001010101010101010101010101010101B4 +:102C100001010101010101010101010101010101A4 +:102C20000101010101010101010101010101010194 +:102C30000101010101010101010101010101010184 +:102C40000101010101010101010101010101010174 +:102C50000101010101010101010101010101010164 +:102C60000101010101010101010101010101010154 +:102C70000101010101010101010101010101010144 +:102C80000101010101010101010101010101010134 +:102C90000101010101010101010101010101010124 +:102CA0000101010101010101010101010101010114 +:102CB0000101010101010101010101010101010104 +:102CC00001010101010101010101010101010101F4 +:102CD00001010101010101010101010101010101E4 +:102CE00001010101010101010101010101010101D4 +:102CF00001010101010101010101010101010101C4 +:102D000001010101010101010101010101010101B3 +:102D100001010101010101010101010101010101A3 +:102D20000101010101010101010101010101010193 +:102D30000101010101010101010101010101010183 +:102D40000101010101010101010101010101010173 +:102D50000101010101010101010101010101010163 +:102D60000101010101010101010101010101010153 +:102D70000101010101010101010101010101010143 +:102D80000101010101010101010101010101010133 +:102D90000101010101010101010101010101010123 +:102DA0000101010101010101010101010101010113 +:102DB0000101010101010101010101010101010103 +:102DC00001010101010101010101010101010101F3 +:102DD00001010101010101010101010101010101E3 +:102DE00001010101010101010101010101010101D3 +:102DF00001010101010101010101010101010101C3 +:102E000001010101010101010101010101010101B2 +:102E100001010101010101010101010101010101A2 +:102E20000101010101010101010101010101010192 +:102E30000101010101010101010101010101010182 +:102E40000101010101010101010101010101010172 +:102E50000101010101010101010101010101010162 +:102E60000101010101010101010101010101010152 +:102E70000101010101010101010101010101010142 +:102E80000101010101010101010101010101010132 +:102E90000101010101010101010101010101010122 +:102EA0000101010101010101010101010101010112 +:102EB0000101010101010101010101010101010102 +:102EC00001010101010101010101010101010101F2 +:102ED00001010101010101010101010101010101E2 +:102EE00001010101010101010101010101010101D2 +:102EF00001010101010101010101010101010101C2 +:102F000001010101010101010101010101010101B1 +:102F100001010101010101010101010101010101A1 +:102F20000101010101010101010101010101010191 +:102F30000101010101010101010101010101010181 +:102F40000101010101010101010101010101010171 +:102F50000101010101010101010101010101010161 +:102F60000101010101010101010101010101010151 +:102F70000101010101010101010101010101010141 +:102F80000101010101010101010101010101010131 +:102F90000101010101010101010101010101010121 +:102FA0000101010101010101010101010101010111 +:102FB0000101010101010101010101010101010101 +:102FC00001010101010101010101010101010101F1 +:102FD00001010101010101010101010101010101E1 +:102FE00001010101010101010101010101010101D1 +:102FF00001010101010101010101010101010101C1 +:1030000001010101010101010101010101010101B0 +:1030100001010101010101010101010101010101A0 +:103020000101010101010101010101010101010190 +:103030000101010101010101010101010101010180 +:103040000101010101010101010101010101010170 +:103050000101010101010101010101010101010160 +:103060000101010101010101010101010101010150 +:103070000101010101010101010101010101010140 +:103080000101010101010101010101010101010130 +:103090000101010101010101010101010101010120 +:1030A0000101010101010101010101010101010110 +:1030B0000101010101010101010101010101010100 +:1030C00001010101010101010101010101010101F0 +:1030D00001010101010101010101010101010101E0 +:1030E00001010101010101010101010101010101D0 +:1030F00001010101010101010101010101010101C0 +:1031000001010101010101010101010101010101AF +:10311000010101010101010101010101010101019F +:10312000010101010101010101010101010101018F +:10313000010101010101010101010101010101017F +:10314000010101010101010101010101010101016F +:10315000010101010101010101010101010101015F +:10316000010101010101010101010101010101014F +:10317000010101010101010101010101010101013F +:10318000010101010101010101010101010101012F +:10319000010101010101010101010101010101011F +:1031A000010101010101010101010101010101010F +:1031B00001010101010101010101010101010101FF +:1031C00001010101010101010101010101010101EF +:1031D00001010101010101010101010101010101DF +:1031E00001010101010101010101010101010101CF +:1031F00001010101010101010101010101010101BF +:1032000001010101010101010101010101010101AE +:10321000010101010101010101010101010101019E +:10322000010101010101010101010101010101018E +:10323000010101010101010101010101010101017E +:10324000010101010101010101010101010101016E +:10325000010101010101010101010101010101015E +:10326000010101010101010101010101010101014E +:10327000010101010101010101010101010101013E +:10328000010101010101010101010101010101012E +:10329000010101010101010101010101010101011E +:1032A000010101010101010101010101010101010E +:1032B00001010101010101010101010101010101FE +:1032C00001010101010101010101010101010101EE +:1032D00001010101010101010101010101010101DE +:1032E00001010101010101010101010101010101CE +:1032F00001010101010101010101010101010101BE +:1033000001010101010101010101010101010101AD +:10331000010101010101010101010101010101019D +:10332000010101010101010101010101010101018D +:10333000010101010101010101010101010101017D +:10334000010101010101010101010101010101016D +:10335000010101010101010101010101010101015D +:10336000010101010101010101010101010101014D +:10337000010101010101010101010101010101013D +:10338000010101010101010101010101010101012D +:10339000010101010101010101010101010101011D +:1033A000010101010101010101010101010101010D +:1033B00001010101010101010101010101010101FD +:1033C00001010101010101010101010101010101ED +:1033D00001010101010101010101010101010101DD +:1033E00001010101010101010101010101010101CD +:1033F00001010101010101010101010101010101BD +:1034000001010101010101010101010101010101AC +:10341000010101010101010101010101010101019C +:10342000010101010101010101010101010101018C +:10343000010101010101010101010101010101017C +:10344000010101010101010101010101010101016C +:10345000010101010101010101010101010101015C +:10346000010101010101010101010101010101014C +:10347000010101010101010101010101010101013C +:10348000010101010101010101010101010101012C +:10349000010101010101010101010101010101011C +:1034A000010101010101010101010101010101010C +:1034B00001010101010101010101010101010101FC +:1034C00001010101010101010101010101010101EC +:1034D00001010101010101010101010101010101DC +:1034E00001010101010101010101010101010101CC +:1034F00001010101010101010101010101010101BC +:1035000001010101010101010101010101010101AB +:10351000010101010101010101010101010101019B +:10352000010101010101010101010101010101018B +:10353000010101010101010101010101010101017B +:10354000010101010101010101010101010101016B +:10355000010101010101010101010101010101015B +:10356000010101010101010101010101010101014B +:10357000010101010101010101010101010101013B +:10358000010101010101010101010101010101012B +:10359000010101010101010101010101010101011B +:1035A000010101010101010101010101010101010B +:1035B00001010101010101010101010101010101FB +:1035C00001010101010101010101010101010101EB +:1035D00001010101010101010101010101010101DB +:1035E00001010101010101010101010101010101CB +:1035F00001010101010101010101010101010101BB +:1036000001010101010101010101010101010101AA +:10361000010101010101010101010101010101019A +:10362000010101010101010101010101010101018A +:10363000010101010101010101010101010101017A +:10364000010101010101010101010101010101016A +:10365000010101010101010101010101010101015A +:10366000010101010101010101010101010101014A +:10367000010101010101010101010101010101013A +:10368000010101010101010101010101010101012A +:10369000010101010101010101010101010101011A +:1036A000010101010101010101010101010101010A +:1036B00001010101010101010101010101010101FA +:1036C00001010101010101010101010101010101EA +:1036D00001010101010101010101010101010101DA +:1036E00001010101010101010101010101010101CA +:1036F00001010101010101010101010101010101BA +:1037000001010101010101010101010101010101A9 +:103710000101010101010101010101010101010199 +:103720000101010101010101010101010101010189 +:103730000101010101010101010101010101010179 +:103740000101010101010101010101010101010169 +:103750000101010101010101010101010101010159 +:103760000101010101010101010101010101010149 +:103770000101010101010101010101010101010139 +:103780000101010101010101010101010101010129 +:103790000101010101010101010101010101010119 +:1037A0000101010101010101010101010101010109 +:1037B00001010101010101010101010101010101F9 +:1037C00001010101010101010101010101010101E9 +:1037D00001010101010101010101010101010101D9 +:1037E00001010101010101010101010101010101C9 +:1037F00001010101010101010101010101010101B9 +:1038000001010101010101010101010101010101A8 +:103810000101010101010101010101010101010198 +:103820000101010101010101010101010101010188 +:103830000101010101010101010101010101010178 +:103840000101010101010101010101010101010168 +:103850000101010101010101010101010101010158 +:103860000101010101010101010101010101010148 +:103870000101010101010101010101010101010138 +:103880000101010101010101010101010101010128 +:103890000101010101010101010101010101010118 +:1038A0000101010101010101010101010101010108 +:1038B00001010101010101010101010101010101F8 +:1038C00001010101010101010101010101010101E8 +:1038D00001010101010101010101010101010101D8 +:1038E00001010101010101010101010101010101C8 +:1038F00001010101010101010101010101010101B8 +:1039000001010101010101010101010101010101A7 +:103910000101010101010101010101010101010197 +:103920000101010101010101010101010101010187 +:103930000101010101010101010101010101010177 +:103940000101010101010101010101010101010167 +:103950000101010101010101010101010101010157 +:103960000101010101010101010101010101010147 +:103970000101010101010101010101010101010137 +:103980000101010101010101010101010101010127 +:103990000101010101010101010101010101010117 +:1039A0000101010101010101010101010101010107 +:1039B00001010101010101010101010101010101F7 +:1039C00001010101010101010101010101010101E7 +:1039D00001010101010101010101010101010101D7 +:1039E00001010101010101010101010101010101C7 +:1039F00001010101010101010101010101010101B7 +:103A000001010101010101010101010101010101A6 +:103A10000101010101010101010101010101010196 +:103A20000101010101010101010101010101010186 +:103A30000101010101010101010101010101010176 +:103A40000101010101010101010101010101010166 +:103A50000101010101010101010101010101010156 +:103A60000101010101010101010101010101010146 +:103A70000101010101010101010101010101010136 +:103A80000101010101010101010101010101010126 +:103A90000101010101010101010101010101010116 +:103AA0000101010101010101010101010101010106 +:103AB00001010101010101010101010101010101F6 +:103AC00001010101010101010101010101010101E6 +:103AD00001010101010101010101010101010101D6 +:103AE00001010101010101010101010101010101C6 +:103AF00001010101010101010101010101010101B6 +:103B000001010101010101010101010101010101A5 +:103B10000101010101010101010101010101010195 +:103B20000101010101010101010101010101010185 +:103B30000101010101010101010101010101010175 +:103B40000101010101010101010101010101010165 +:103B50000101010101010101010101010101010155 +:103B60000101010101010101010101010101010145 +:103B70000101010101010101010101010101010135 +:103B80000101010101010101010101010101010125 +:103B90000101010101010101010101010101010115 +:103BA0000101010101010101010101010101010105 +:103BB00001010101010101010101010101010101F5 +:103BC00001010101010101010101010101010101E5 +:103BD00001010101010101010101010101010101D5 +:103BE00001010101010101010101010101010101C5 +:103BF00001010101010101010101010101010101B5 +:103C000001010101010101010101010101010101A4 +:103C10000101010101010101010101010101010194 +:103C20000101010101010101010101010101010184 +:103C30000101010101010101010101010101010174 +:103C40000101010101010101010101010101010164 +:103C50000101010101010101010101010101010154 +:103C60000101010101010101010101010101010144 +:103C70000101010101010101010101010101010134 +:103C80000101010101010101010101010101010124 +:103C90000101010101010101010101010101010114 +:103CA0000101010101010101010101010101010104 +:103CB00001010101010101010101010101010101F4 +:103CC00001010101010101010101010101010101E4 +:103CD00001010101010101010101010101010101D4 +:103CE00001010101010101010101010101010101C4 +:103CF00001010101010101010101010101010101B4 +:103D000001010101010101010101010101010101A3 +:103D10000101010101010101010101010101010193 +:103D20000101010101010101010101010101010183 +:103D30000101010101010101010101010101010173 +:103D40000101010101010101010101010101010163 +:103D50000101010101010101010101010101010153 +:103D60000101010101010101010101010101010143 +:103D70000101010101010101010101010101010133 +:103D80000101010101010101010101010101010123 +:103D90000101010101010101010101010101010113 +:103DA0000101010101010101010101010101010103 +:103DB00001010101010101010101010101010101F3 +:103DC00001010101010101010101010101010101E3 +:103DD00001010101010101010101010101010101D3 +:103DE00001010101010101010101010101010101C3 +:103DF00001010101010101000000000000000000BC +:103E000000000000000000000000000000000000B2 +:103E100000000000000000000000000000000000A2 +:103E20000000000000000000000000000000000092 +:103E30000000000000000000000000000000000082 +:103E40000000000000000000000000000000000072 +:103E50000000000000000000000000000000000062 +:103E60000000000000000000000000000000000052 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000012 +:103EB0000000000000000000000000000000000002 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF00000000000000000000000000000000000C2 +:103F000000000000000000000000000000000000B1 +:103F100000000000000000000000000000000000A1 +:103F20000000000000000000000000000000000091 +:103F30000000000000000000000000000000000081 +:103F40000000000000000000000000000000000071 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000000000031 +:103F90000000000000000000000000000000000021 +:103FA0000000000000000000000000000000000011 +:103FB0000000000000000000000000000000000001 +:103FC00000000000000000000000000000000000F1 +:103FD00000000000000000000000000000000000E1 +:103FE00000000000000000000000000000000000D1 +:103FF00000000000000000000000000000000000C1 +:1040000000000000000000000000000000000000B0 +:1040100000000000000000000000000000000000A0 +:104020000000000000000000000000000000000090 +:104030000000000000000000000000000000000080 +:104040000000000000000000000000000000000070 +:104050000000000000000000000000000000000060 +:104060000000000000000000000000000000000050 +:104070000000000000000000000000000000000040 +:104080000000000000000000000000000000000030 +:104090000000000000000000000000000000000020 +:1040A0000000000000000000000000000000000010 +:1040B0000000000000000000000000000000000000 +:1040C00000000000000000000000000000000000F0 +:1040D00000000000000000000000000000000000E0 +:1040E00000000000000000000000000000000000D0 +:1040F00000000000000000000000000000000000C0 +:1041000000000000000000000000000000000000AF +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:10414000000000000000000000000000000000006F +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F +:10417000000000000000000000000000000000003F +:10418000000000000000000000000000000000002F +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000000000AE +:10421000000000000000000000000000000000009E +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000007E +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000000000005E +:10426000000000000000000000000000000000004E +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000000002E +:10429000000000000000000000000000000000001E +:1042A000000000000000000000000000000000000E +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D00000000000000000000000000000000000DE +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000000000000BE +:1043000000000000000000000000000000000000AD +:10431000000000000000000000000000000000009D +:10432000000000000000000000000000000000008D +:10433000000000000000000000000000000000007D +:10434000000000000000000000000000000000006D +:10435000000000000000000000000000000000005D +:10436000000000000000000000000000000000004D +:10437000000000000000000000000000000000003D +:10438000000000000000000000000000000000002D +:10439000000000000000000000000000000000001D +:1043A000000000000000000000000000000000000D +:1043B00000000000000000000000000000000000FD +:1043C00000000000000000000000000000000000ED +:1043D00000000000000000000000000000000000DD +:1043E00000000000000000000000000000000000CD +:1043F00000000000000000020202020202020202AB +:10440000020202020202020202020202020202028C +:10441000020202020202020202020202020202027C +:10442000020202020202020202020202020202026C +:10443000020202020202020202020202020202025C +:10444000020202020202020202020202020202024C +:10445000020202020202020202020202020202023C +:10446000020202020202020202020202020202022C +:10447000020202020202020202020202020202021C +:10448000020202020202020202020202020202020C +:1044900002020202020202020202020202020202FC +:1044A00002020202020202020202020202020202EC +:1044B00002020202020202020202020202020202DC +:1044C00002020202020202020202020202020202CC +:1044D00002020202020202020202020202020202BC +:1044E00002020202020202020202020202020202AC +:1044F000020202020202020202020202020202029C +:10450000020202020202020202020202020202028B +:10451000020202020202020202020202020202027B +:10452000020202020202020202020202020202026B +:10453000020202020202020202020202020202025B +:10454000020202020202020202020202020202024B +:10455000020202020202020202020202020202023B +:10456000020202020202020202020202020202022B +:10457000020202020202020202020202020202021B +:10458000020202020202020202020202020202020B +:1045900002020202020202020202020202020202FB +:1045A00002020202020202020202020202020202EB +:1045B00002020202020202020202020202020202DB +:1045C00002020202020202020202020202020202CB +:1045D00002020202020202020202020202020202BB +:1045E00002020202020202020202020202020202AB +:1045F000020202020202020202020202020202029B +:10460000020202020202020202020202020202028A +:10461000020202020202020202020202020202027A +:10462000020202020202020202020202020202026A +:10463000020202020202020202020202020202025A +:10464000020202020202020202020202020202024A +:10465000020202020202020202020202020202023A +:10466000020202020202020202020202020202022A +:10467000020202020202020202020202020202021A +:10468000020202020202020202020202020202020A +:1046900002020202020202020202020202020202FA +:1046A00002020202020202020202020202020202EA +:1046B00002020202020202020202020202020202DA +:1046C00002020202020202020202020202020202CA +:1046D00002020202020202020202020202020202BA +:1046E00002020202020202020202020202020202AA +:1046F000020202020202020202020202020202029A +:104700000202020202020202020202020202020289 +:104710000202020202020202020202020202020279 +:104720000202020202020202020202020202020269 +:104730000202020202020202020202020202020259 +:104740000202020202020202020202020202020249 +:104750000202020202020202020202020202020239 +:104760000202020202020202020202020202020229 +:104770000202020202020202020202020202020219 +:104780000202020202020202020202020202020209 +:1047900002020202020202020202020202020202F9 +:1047A00002020202020202020202020202020202E9 +:1047B00002020202020202020202020202020202D9 +:1047C00002020202020202020202020202020202C9 +:1047D00002020202020202020202020202020202B9 +:1047E00002020202020202020202020202020202A9 +:1047F0000202020202020202020202020202020299 +:104800000202020202020202020202020202020288 +:104810000202020202020202020202020202020278 +:104820000202020202020202020202020202020268 +:104830000202020202020202020202020202020258 +:104840000202020202020202020202020202020248 +:104850000202020202020202020202020202020238 +:104860000202020202020202020202020202020228 +:104870000202020202020202020202020202020218 +:104880000202020202020202020202020202020208 +:1048900002020202020202020202020202020202F8 +:1048A00002020202020202020202020202020202E8 +:1048B00002020202020202020202020202020202D8 +:1048C00002020202020202020202020202020202C8 +:1048D00002020202020202020202020202020202B8 +:1048E00002020202020202020202020202020202A8 +:1048F0000202020202020202020202020202020298 +:104900000202020202020202020202020202020287 +:104910000202020202020202020202020202020277 +:104920000202020202020202020202020202020267 +:104930000202020202020202020202020202020257 +:104940000202020202020202020202020202020247 +:104950000202020202020202020202020202020237 +:104960000202020202020202020202020202020227 +:104970000202020202020202020202020202020217 +:104980000202020202020202020202020202020207 +:1049900002020202020202020202020202020202F7 +:1049A00002020202020202020202020202020202E7 +:1049B00002020202020202020202020202020202D7 +:1049C00002020202020202020202020202020202C7 +:1049D00002020202020202020202020202020202B7 +:1049E00002020202020202020202020202020202A7 +:1049F0000202020202020202020202020202020297 +:104A00000202020202020202020202020202020286 +:104A10000202020202020202020202020202020276 +:104A20000202020202020202020202020202020266 +:104A30000202020202020202020202020202020256 +:104A40000202020202020202020202020202020246 +:104A50000202020202020202020202020202020236 +:104A60000202020202020202020202020202020226 +:104A70000202020202020202020202020202020216 +:104A80000202020202020202020202020202020206 +:104A900002020202020202020202020202020202F6 +:104AA00002020202020202020202020202020202E6 +:104AB00002020202020202020202020202020202D6 +:104AC00002020202020202020202020202020202C6 +:104AD00002020202020202020202020202020202B6 +:104AE00002020202020202020202020202020202A6 +:104AF0000202020202020202020202020202020296 +:104B00000202020202020202020202020202020285 +:104B10000202020202020202020202020202020275 +:104B20000202020202020202020202020202020265 +:104B30000202020202020202020202020202020255 +:104B40000202020202020202020202020202020245 +:104B50000202020202020202020202020202020235 +:104B60000202020202020202020202020202020225 +:104B70000202020202020202020202020202020215 +:104B80000202020202020202020202020202020205 +:104B900002020202020202020202020202020202F5 +:104BA00002020202020202020202020202020202E5 +:104BB00002020202020202020202020202020202D5 +:104BC00002020202020202020202020202020202C5 +:104BD00002020202020202020202020202020202B5 +:104BE00002020202020202020202020202020202A5 +:104BF0000202020202020202020202020202020295 +:104C00000202020202020202020202020202020284 +:104C10000202020202020202020202020202020274 +:104C20000202020202020202020202020202020264 +:104C30000202020202020202020202020202020254 +:104C40000202020202020202020202020202020244 +:104C50000202020202020202020202020202020234 +:104C60000202020202020202020202020202020224 +:104C70000202020202020202020202020202020214 +:104C80000202020202020202020202020202020204 +:104C900002020202020202020202020202020202F4 +:104CA00002020202020202020202020202020202E4 +:104CB00002020202020202020202020202020202D4 +:104CC00002020202020202020202020202020202C4 +:104CD00002020202020202020202020202020202B4 +:104CE00002020202020202020202020202020202A4 +:104CF0000202020202020202020202020202020294 +:104D00000202020202020202020202020202020283 +:104D10000202020202020202020202020202020273 +:104D20000202020202020202020202020202020263 +:104D30000202020202020202020202020202020253 +:104D40000202020202020202020202020202020243 +:104D50000202020202020202020202020202020233 +:104D60000202020202020202020202020202020223 +:104D70000202020202020202020202020202020213 +:104D80000202020202020202020202020202020203 +:104D900002020202020202020202020202020202F3 +:104DA00002020202020202020202020202020202E3 +:104DB00002020202020202020202020202020202D3 +:104DC00002020202020202020202020202020202C3 +:104DD00002020202020202020202020202020202B3 +:104DE00002020202020202020202020202020202A3 +:104DF0000202020202020202020202020202020293 +:104E00000202020202020202020202020202020282 +:104E10000202020202020202020202020202020272 +:104E20000202020202020202020202020202020262 +:104E30000202020202020202020202020202020252 +:104E40000202020202020202020202020202020242 +:104E50000202020202020202020202020202020232 +:104E60000202020202020202020202020202020222 +:104E70000202020202020202020202020202020212 +:104E80000202020202020202020202020202020202 +:104E900002020202020202020202020202020202F2 +:104EA00002020202020202020202020202020202E2 +:104EB00002020202020202020202020202020202D2 +:104EC00002020202020202020202020202020202C2 +:104ED00002020202020202020202020202020202B2 +:104EE00002020202020202020202020202020202A2 +:104EF0000202020202020202020202020202020292 +:104F00000202020202020202020202020202020281 +:104F10000202020202020202020202020202020271 +:104F20000202020202020202020202020202020261 +:104F30000202020202020202020202020202020251 +:104F40000202020202020202020202020202020241 +:104F50000202020202020202020202020202020231 +:104F60000202020202020202020202020202020221 +:104F70000202020202020202020202020202020211 +:104F80000202020202020202020202020202020201 +:104F900002020202020202020202020202020202F1 +:104FA00002020202020202020202020202020202E1 +:104FB00002020202020202020202020202020202D1 +:104FC00002020202020202020202020202020202C1 +:104FD00002020202020202020202020202020202B1 +:104FE00002020202020202020202020202020202A1 +:104FF0000202020202020202020202020202020291 +:105000000202020202020202020202020202020280 +:105010000202020202020202020202020202020270 +:105020000202020202020202020202020202020260 +:105030000202020202020202020202020202020250 +:105040000202020202020202020202020202020240 +:105050000202020202020202020202020202020230 +:105060000202020202020202020202020202020220 +:105070000202020202020202020202020202020210 +:105080000202020202020202020202020202020200 +:1050900002020202020202020202020202020202F0 +:1050A00002020202020202020202020202020202E0 +:1050B00002020202020202020202020202020202D0 +:1050C00002020202020202020202020202020202C0 +:1050D00002020202020202020202020202020202B0 +:1050E00002020202020202020202020202020202A0 +:1050F0000202020202020202020202020202020290 +:10510000020202020202020202020202020202027F +:10511000020202020202020202020202020202026F +:10512000020202020202020202020202020202025F +:10513000020202020202020202020202020202024F +:10514000020202020202020202020202020202023F +:10515000020202020202020202020202020202022F +:10516000020202020202020202020202020202021F +:10517000020202020202020202020202020202020F +:1051800002020202020202020202020202020202FF +:1051900002020202020202020202020202020202EF +:1051A00002020202020202020202020202020202DF +:1051B00002020202020202020202020202020202CF +:1051C00002020202020202020202020202020202BF +:1051D00002020202020202020202020202020202AF +:1051E000020202020202020202020202020202029F +:1051F000020202020202020202020202020202028F +:10520000020202020202020202020202020202027E +:10521000020202020202020202020202020202026E +:10522000020202020202020202020202020202025E +:10523000020202020202020202020202020202024E +:10524000020202020202020202020202020202023E +:10525000020202020202020202020202020202022E +:10526000020202020202020202020202020202021E +:10527000020202020202020202020202020202020E +:1052800002020202020202020202020202020202FE +:1052900002020202020202020202020202020202EE +:1052A00002020202020202020202020202020202DE +:1052B00002020202020202020202020202020202CE +:1052C00002020202020202020202020202020202BE +:1052D00002020202020202020202020202020202AE +:1052E000020202020202020202020202020202029E +:1052F000020202020202020202020202020202028E +:10530000020202020202020202020202020202027D +:10531000020202020202020202020202020202026D +:10532000020202020202020202020202020202025D +:10533000020202020202020202020202020202024D +:10534000020202020202020202020202020202023D +:10535000020202020202020202020202020202022D +:10536000020202020202020202020202020202021D +:10537000020202020202020202020202020202020D +:1053800002020202020202020202020202020202FD +:1053900002020202020202020202020202020202ED +:1053A00002020202020202020202020202020202DD +:1053B00002020202020202020202020202020202CD +:1053C00002020202020202020202020202020202BD +:1053D00002020202020202020202020202020202AD +:1053E000020202020202020202020202020202029D +:1053F000020202020202020202020202020202028D +:10540000020202020202020202020202020202027C +:10541000020202020202020202020202020202026C +:10542000020202020202020202020202020202025C +:10543000020202020202020202020202020202024C +:10544000020202020202020202020202020202023C +:10545000020202020202020202020202020202022C +:10546000020202020202020202020202020202021C +:10547000020202020202020202020202020202020C +:1054800002020202020202020202020202020202FC +:1054900002020202020202020202020202020202EC +:1054A00002020202020202020202020202020202DC +:1054B00002020202020202020202020202020202CC +:1054C00002020202020202020202020202020202BC +:1054D00002020202020202020202020202020202AC +:1054E000020202020202020202020202020202029C +:1054F000020202020202020202020202020202028C +:10550000020202020202020202020202020202027B +:10551000020202020202020202020202020202026B +:10552000020202020202020202020202020202025B +:10553000020202020202020202020202020202024B +:10554000020202020202020202020202020202023B +:10555000020202020202020202020202020202022B +:10556000020202020202020202020202020202021B +:10557000020202020202020202020202020202020B +:1055800002020202020202020202020202020202FB +:1055900002020202020202020202020202020202EB +:1055A00002020202020202020202020202020202DB +:1055B00002020202020202020202020202020202CB +:1055C00002020202020202020202020202020202BB +:1055D00002020202020202020202020202020202AB +:1055E000020202020202020202020202020202029B +:1055F000020202020202020202020202020202028B +:10560000020202020202020202020202020202027A +:10561000020202020202020202020202020202026A +:10562000020202020202020202020202020202025A +:10563000020202020202020202020202020202024A +:10564000020202020202020202020202020202023A +:10565000020202020202020202020202020202022A +:10566000020202020202020202020202020202021A +:10567000020202020202020202020202020202020A +:1056800002020202020202020202020202020202FA +:1056900002020202020202020202020202020202EA +:1056A00002020202020202020202020202020202DA +:1056B00002020202020202020202020202020202CA +:1056C00002020202020202020202020202020202BA +:1056D00002020202020202020202020202020202AA +:1056E000020202020202020202020202020202029A +:1056F000020202020202020202020202020202028A +:105700000202020202020202020202020202020279 +:105710000202020202020202020202020202020269 +:105720000202020202020202020202020202020259 +:105730000202020202020202020202020202020249 +:105740000202020202020202020202020202020239 +:105750000202020202020202020202020202020229 +:105760000202020202020202020202020202020219 +:105770000202020202020202020202020202020209 +:1057800002020202020202020202020202020202F9 +:1057900002020202020202020202020202020202E9 +:1057A00002020202020202020202020202020202D9 +:1057B00002020202020202020202020202020202C9 +:1057C00002020202020202020202020202020202B9 +:1057D00002020202020202020202020202020202A9 +:1057E0000202020202020202020202020202020299 +:1057F000020202020202020000000000000000009B +:105800000000000000000000000000000000000098 +:105810000000000000000000000000000000000088 +:105820000000000000000000000000000000000078 +:105830000000000000000000000000000000000068 +:105840000000000000000000000000000000000058 +:105850000000000000000000000000000000000048 +:105860000000000000000000000000000000000038 +:105870000000000000000000000000000000000028 +:105880000000000000000000000000000000000018 +:105890000000000000000000000000000000000008 +:1058A00000000000000000000000000000000000F8 +:1058B00000000000000000000000000000000000E8 +:1058C00000000000000000000000000000000000D8 +:1058D00000000000000000000000000000000000C8 +:1058E00000000000000000000000000000000000B8 +:1058F00000000000000000000000000000000000A8 +:105900000000000000000000000000000000000097 +:105910000000000000000000000000000000000087 +:105920000000000000000000000000000000000077 +:105930000000000000000000000000000000000067 +:105940000000000000000000000000000000000057 +:105950000000000000000000000000000000000047 +:105960000000000000000000000000000000000037 +:105970000000000000000000000000000000000027 +:105980000000000000000000000000000000000017 +:105990000000000000000000000000000000000007 +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000000000000000000000E7 +:1059C00000000000000000000000000000000000D7 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 +:105A00000000000000000000000000000000000096 +:105A10000000000000000000000000000000000086 +:105A20000000000000000000000000000000000076 +:105A30000000000000000000000000000000000066 +:105A40000000000000000000000000000000000056 +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000000000000016 +:105A90000000000000000000000000000000000006 +:105AA00000000000000000000000000000000000F6 +:105AB00000000000000000000000000000000000E6 +:105AC00000000000000000000000000000000000D6 +:105AD00000000000000000000000000000000000C6 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 +:105B00000000000000000000000000000000000095 +:105B10000000000000000000000000000000000085 +:105B20000000000000000000000000000000000075 +:105B30000000000000000000000000000000000065 +:105B40000000000000000000000000000000000055 +:105B50000000000000000000000000000000000045 +:105B60000000000000000000000000000000000035 +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B90000000000000000000000000000000000005 +:105BA00000000000000000000000000000000000F5 +:105BB00000000000000000000000000000000000E5 +:105BC00000000000000000000000000000000000D5 +:105BD00000000000000000000000000000000000C5 +:105BE00000000000000000000000000000000000B5 +:105BF00000000000000000000000000000000000A5 +:105C00000000000000000000000000000000000094 +:105C10000000000000000000000000000000000084 +:105C20000000000000000000000000000000000074 +:105C30000000000000000000000000000000000064 +:105C40000000000000000000000000000000000054 +:105C50000000000000000000000000000000000044 +:105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 +:105C80000000000000000000000000000000000014 +:105C90000000000000000000000000000000000004 +:105CA00000000000000000000000000000000000F4 +:105CB00000000000000000000000000000000000E4 +:105CC00000000000000000000000000000000000D4 +:105CD00000000000000000000000000000000000C4 +:105CE00000000000000000000000000000000000B4 +:105CF00000000000000000000000000000000000A4 +:105D00000000000000000000000000000000000093 +:105D10000000000000000000000000000000000083 +:105D20000000000000000000000000000000000073 +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000000000000000053 +:105D50000000000000000000000000000000000043 +:105D60000000000000000000000000000000000033 +:105D70000000000000000000000000000000000023 +:105D80000000000000000000000000000000000013 +:105D90000000000000000000000000000000000003 +:105DA00000000000000000000000000000000000F3 +:105DB00000000000000000000000000000000000E3 +:105DC00000000000000000000000000000000000D3 +:105DD00000000000000000000000000000000000C3 +:105DE00000000000000000000000000000000000B3 +:105DF000000000000000006300000000000000013F +:105E00000101010101010101010101010101010182 +:105E10000101010101010101010101010101010172 +:105E20000101010101010101010101010101010162 +:105E30000101010101010101010101010101010152 +:105E40000101010101010101010101010101010142 +:105E50000101010101010101010101010101010132 +:105E60000101010101010101010101010101010122 +:105E70000101010101010101010101010101010112 +:105E80000101010101010101010101010101010102 +:105E900001010101010101010101010101010101F2 +:105EA00001010101010101010101010101010101E2 +:105EB00001010101010101010101010101010101D2 +:105EC00001010101010101010101010101010101C2 +:105ED00001010101010101010101010101010101B2 +:105EE00001010101010101010101010101010101A2 +:105EF0000101010101010101010101010101010192 +:105F00000101010101010101010101010101010181 +:105F10000101010101010101010101010101010171 +:105F20000101010101010101010101010101010161 +:105F30000101010101010101010101010101010151 +:105F40000101010101010101010101010101010141 +:105F50000101010101010101010101010101010131 +:105F60000101010101010101010101010101010121 +:105F70000101010101010101010101010101010111 +:105F80000101010101010101010101010101010101 +:105F900001010101010101010101010101010101F1 +:105FA00001010101010101010101010101010101E1 +:105FB00001010101010101010101010101010101D1 +:105FC00001010101010101010101010101010101C1 +:105FD00001010101010101010101010101010101B1 +:105FE00001010101010101010101010101010101A1 +:105FF0000101010101010101010101010101010191 +:106000000101010101010101010101010101010180 +:106010000101010101010101010101010101010170 +:106020000101010101010101010101010101010160 +:106030000101010101010101010101010101010150 +:106040000101010101010101010101010101010140 +:106050000101010101010101010101010101010130 +:106060000101010101010101010101010101010120 +:106070000101010101010101010101010101010110 +:106080000101010101010101010101010101010100 +:1060900001010101010101010101010101010101F0 +:1060A00001010101010101010101010101010101E0 +:1060B00001010101010101010101010101010101D0 +:1060C00001010101010101010101010101010101C0 +:1060D00001010101010101010101010101010101B0 +:1060E00001010101010101010101010101010101A0 +:1060F0000101010101010101010101010101010190 +:10610000010101010101010101010101010101017F +:10611000010101010101010101010101010101016F +:10612000010101010101010101010101010101015F +:10613000010101010101010101010101010101014F +:10614000010101010101010101010101010101013F +:10615000010101010101010101010101010101012F +:10616000010101010101010101010101010101011F +:10617000010101010101010101010101010101010F +:1061800001010101010101010101010101010101FF +:1061900001010101010101010101010101010101EF +:1061A00001010101010101010101010101010101DF +:1061B00001010101010101010101010101010101CF +:1061C00001010101010101010101010101010101BF +:1061D00001010101010101010101010101010101AF +:1061E000010101010101010101010101010101019F +:1061F000010101010101010101010101010101018F +:10620000010101010101010101010101010101017E +:10621000010101010101010101010101010101016E +:10622000010101010101010101010101010101015E +:10623000010101010101010101010101010101014E +:10624000010101010101010101010101010101013E +:10625000010101010101010101010101010101012E +:10626000010101010101010101010101010101011E +:10627000010101010101010101010101010101010E +:1062800001010101010101010101010101010101FE +:1062900001010101010101010101010101010101EE +:1062A00001010101010101010101010101010101DE +:1062B00001010101010101010101010101010101CE +:1062C00001010101010101010101010101010101BE +:1062D00001010101010101010101010101010101AE +:1062E000010101010101010101010101010101019E +:1062F000010101010101010101010101010101018E +:10630000010101010101010101010101010101017D +:10631000010101010101010101010101010101016D +:10632000010101010101010101010101010101015D +:10633000010101010101010101010101010101014D +:10634000010101010101010101010101010101013D +:10635000010101010101010101010101010101012D +:10636000010101010101010101010101010101011D +:10637000010101010101010101010101010101010D +:1063800001010101010101010101010101010101FD +:1063900001010101010101010101010101010101ED +:1063A00001010101010101010101010101010101DD +:1063B00001010101010101010101010101010101CD +:1063C00001010101010101010101010101010101BD +:1063D00001010101010101010101010101010101AD +:1063E000010101010101010101010101010101019D +:1063F000010101010101010101010101010101018D +:10640000010101010101010101010101010101017C +:10641000010101010101010101010101010101016C +:10642000010101010101010101010101010101015C +:10643000010101010101010101010101010101014C +:10644000010101010101010101010101010101013C +:10645000010101010101010101010101010101012C +:10646000010101010101010101010101010101011C +:10647000010101010101010101010101010101010C +:1064800001010101010101010101010101010101FC +:1064900001010101010101010101010101010101EC +:1064A00001010101010101010101010101010101DC +:1064B00001010101010101010101010101010101CC +:1064C00001010101010101010101010101010101BC +:1064D00001010101010101010101010101010101AC +:1064E000010101010101010101010101010101019C +:1064F000010101010101010101010101010101018C +:10650000010101010101010101010101010101017B +:10651000010101010101010101010101010101016B +:10652000010101010101010101010101010101015B +:10653000010101010101010101010101010101014B +:10654000010101010101010101010101010101013B +:10655000010101010101010101010101010101012B +:10656000010101010101010101010101010101011B +:10657000010101010101010101010101010101010B +:1065800001010101010101010101010101010101FB +:1065900001010101010101010101010101010101EB +:1065A00001010101010101010101010101010101DB +:1065B00001010101010101010101010101010101CB +:1065C00001010101010101010101010101010101BB +:1065D00001010101010101010101010101010101AB +:1065E000010101010101010101010101010101019B +:1065F000010101010101010101010101010101018B +:10660000010101010101010101010101010101017A +:10661000010101010101010101010101010101016A +:10662000010101010101010101010101010101015A +:10663000010101010101010101010101010101014A +:10664000010101010101010101010101010101013A +:10665000010101010101010101010101010101012A +:10666000010101010101010101010101010101011A +:10667000010101010101010101010101010101010A +:1066800001010101010101010101010101010101FA +:1066900001010101010101010101010101010101EA +:1066A00001010101010101010101010101010101DA +:1066B00001010101010101010101010101010101CA +:1066C00001010101010101010101010101010101BA +:1066D00001010101010101010101010101010101AA +:1066E000010101010101010101010101010101019A +:1066F000010101010101010101010101010101018A +:106700000101010101010101010101010101010179 +:106710000101010101010101010101010101010169 +:106720000101010101010101010101010101010159 +:106730000101010101010101010101010101010149 +:106740000101010101010101010101010101010139 +:106750000101010101010101010101010101010129 +:106760000101010101010101010101010101010119 +:106770000101010101010101010101010101010109 +:1067800001010101010101010101010101010101F9 +:1067900001010101010101010101010101010101E9 +:1067A00001010101010101010101010101010101D9 +:1067B00001010101010101010101010101010101C9 +:1067C00001010101010101010101010101010101B9 +:1067D00001010101010101010101010101010101A9 +:1067E0000101010101010101010101010101010199 +:1067F0000101010101010101010101010101010189 +:106800000101010101010101010101010101010178 +:106810000101010101010101010101010101010168 +:106820000101010101010101010101010101010158 +:106830000101010101010101010101010101010148 +:106840000101010101010101010101010101010138 +:106850000101010101010101010101010101010128 +:106860000101010101010101010101010101010118 +:106870000101010101010101010101010101010108 +:1068800001010101010101010101010101010101F8 +:1068900001010101010101010101010101010101E8 +:1068A00001010101010101010101010101010101D8 +:1068B00001010101010101010101010101010101C8 +:1068C00001010101010101010101010101010101B8 +:1068D00001010101010101010101010101010101A8 +:1068E0000101010101010101010101010101010198 +:1068F0000101010101010101010101010101010188 +:106900000101010101010101010101010101010177 +:106910000101010101010101010101010101010167 +:106920000101010101010101010101010101010157 +:106930000101010101010101010101010101010147 +:106940000101010101010101010101010101010137 +:106950000101010101010101010101010101010127 +:106960000101010101010101010101010101010117 +:106970000101010101010101010101010101010107 +:1069800001010101010101010101010101010101F7 +:1069900001010101010101010101010101010101E7 +:1069A00001010101010101010101010101010101D7 +:1069B00001010101010101010101010101010101C7 +:1069C00001010101010101010101010101010101B7 +:1069D00001010101010101010101010101010101A7 +:1069E0000101010101010101010101010101010197 +:1069F0000101010101010101010101010101010187 +:106A00000101010101010101010101010101010176 +:106A10000101010101010101010101010101010166 +:106A20000101010101010101010101010101010156 +:106A30000101010101010101010101010101010146 +:106A40000101010101010101010101010101010136 +:106A50000101010101010101010101010101010126 +:106A60000101010101010101010101010101010116 +:106A70000101010101010101010101010101010106 +:106A800001010101010101010101010101010101F6 +:106A900001010101010101010101010101010101E6 +:106AA00001010101010101010101010101010101D6 +:106AB00001010101010101010101010101010101C6 +:106AC00001010101010101010101010101010101B6 +:106AD00001010101010101010101010101010101A6 +:106AE0000101010101010101010101010101010196 +:106AF0000101010101010101010101010101010186 +:106B00000101010101010101010101010101010175 +:106B10000101010101010101010101010101010165 +:106B20000101010101010101010101010101010155 +:106B30000101010101010101010101010101010145 +:106B40000101010101010101010101010101010135 +:106B50000101010101010101010101010101010125 +:106B60000101010101010101010101010101010115 +:106B70000101010101010101010101010101010105 +:106B800001010101010101010101010101010101F5 +:106B900001010101010101010101010101010101E5 +:106BA00001010101010101010101010101010101D5 +:106BB00001010101010101010101010101010101C5 +:106BC00001010101010101010101010101010101B5 +:106BD00001010101010101010101010101010101A5 +:106BE0000101010101010101010101010101010195 +:106BF0000101010101010101010101010101010185 +:106C00000101010101010101010101010101010174 +:106C10000101010101010101010101010101010164 +:106C20000101010101010101010101010101010154 +:106C30000101010101010101010101010101010144 +:106C40000101010101010101010101010101010134 +:106C50000101010101010101010101010101010124 +:106C60000101010101010101010101010101010114 +:106C70000101010101010101010101010101010104 +:106C800001010101010101010101010101010101F4 +:106C900001010101010101010101010101010101E4 +:106CA00001010101010101010101010101010101D4 +:106CB00001010101010101010101010101010101C4 +:106CC00001010101010101010101010101010101B4 +:106CD00001010101010101010101010101010101A4 +:106CE0000101010101010101010101010101010194 +:106CF0000101010101010101010101010101010184 +:106D00000101010101010101010101010101010173 +:106D10000101010101010101010101010101010163 +:106D20000101010101010101010101010101010153 +:106D30000101010101010101010101010101010143 +:106D40000101010101010101010101010101010133 +:106D50000101010101010101010101010101010123 +:106D60000101010101010101010101010101010113 +:106D70000101010101010101010101010101010103 +:106D800001010101010101010101010101010101F3 +:106D900001010101010101010101010101010101E3 +:106DA00001010101010101010101010101010101D3 +:106DB00001010101010101010101010101010101C3 +:106DC00001010101010101010101010101010101B3 +:106DD00001010101010101010101010101010101A3 +:106DE0000101010101010101010101010101010193 +:106DF0000101010101010101010101010101010183 +:106E00000101010101010101010101010101010172 +:106E10000101010101010101010101010101010162 +:106E20000101010101010101010101010101010152 +:106E30000101010101010101010101010101010142 +:106E40000101010101010101010101010101010132 +:106E50000101010101010101010101010101010122 +:106E60000101010101010101010101010101010112 +:106E70000101010101010101010101010101010102 +:106E800001010101010101010101010101010101F2 +:106E900001010101010101010101010101010101E2 +:106EA00001010101010101010101010101010101D2 +:106EB00001010101010101010101010101010101C2 +:106EC00001010101010101010101010101010101B2 +:106ED00001010101010101010101010101010101A2 +:106EE0000101010101010101010101010101010192 +:106EF0000101010101010101010101010101010182 +:106F00000101010101010101010101010101010171 +:106F10000101010101010101010101010101010161 +:106F20000101010101010101010101010101010151 +:106F30000101010101010101010101010101010141 +:106F40000101010101010101010101010101010131 +:106F50000101010101010101010101010101010121 +:106F60000101010101010101010101010101010111 +:106F70000101010101010101010101010101010101 +:106F800001010101010101010101010101010101F1 +:106F900001010101010101010101010101010101E1 +:106FA00001010101010101010101010101010101D1 +:106FB00001010101010101010101010101010101C1 +:106FC00001010101010101010101010101010101B1 +:106FD00001010101010101010101010101010101A1 +:106FE0000101010101010101010101010101010191 +:106FF0000101010101010101010101010101010082 +:107000000000000000000000000000000000000080 +:107010000000000000000000000000000000000070 +:107020000000000000000000000000000000000060 +:107030000000000000000000000000000000000050 +:107040000000000000000000000000000000000040 +:107050000000000000000000000000000000000030 +:107060000000000000000000000000000000000020 +:107070000000000000000000000000000000000010 +:107080000000000000000000000000000000000000 +:1070900000000000000000000000000000000000F0 +:1070A00000000000000000000000000000000000E0 +:1070B00000000000000000000000000000000000D0 +:1070C00000000000000000000000000000000000C0 +:1070D00000000000000000000000000000000000B0 +:1070E00000000000000000000000000000000000A0 +:1070F0000000000000000000000000000000000090 +:10710000000000000000000000000000000000007F +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000003F +:10715000000000000000000000000000000000002F +:10716000000000000000000000000000000000001F +:10717000000000000000000000000000000000000F +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000000EF +:1071A00000000000000000000000000000000000DF +:1071B00000000000000000000000000000000000CF +:1071C00000000000000000000000000000000000BF +:1071D00000000000000000000000000000000000AF +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000000000000000008F +:10720000000000000000000000000000000000007E +:10721000000000000000000000000000000000006E +:10722000000000000000000000000000000000005E +:10723000000000000000000000000000000000004E +:10724000000000000000000000000000000000003E +:10725000000000000000000000000000000000002E +:10726000000000000000000000000000000000001E +:10727000000000000000000000000000000000000E +:1072800000000000000000000000000000000000FE +:1072900000000000000000000000000000000000EE +:1072A00000000000000000000000000000000000DE +:1072B00000000000000000000000000000000000CE +:1072C00000000000000000000000000000000000BE +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:10730000000000000000000000000000000000007D +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:10733000000000000000000000000000000000004D +:10734000000000000000000000000000000000003D +:10735000000000000000000000000000000000002D +:10736000000000000000000000000000000000001D +:10737000000000000000000000000000000000000D +:1073800000000000000000000000000000000000FD +:1073900000000000000000000000000000000000ED +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000000000000000000CD +:1073C00000000000000000000000000000000000BD +:1073D00000000000000000000000000000000000AD +:1073E000000000000000000000000000000000009D +:1073F000000000000000000000000000000000008D +:10740000000000000000000000000000000000007C +:10741000000000000000000000000000000000006C +:10742000000000000000000000000000000000005C +:10743000000000000000000000000000000000004C +:10744000000000000000000000000000000000003C +:10745000000000000000000000000000000000002C +:10746000000000000000000000000000000000001C +:10747000000000000000000000000000000000000C +:1074800000000000000000000000000000000000FC +:1074900000000000000000000000000000000000EC +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000000000CC +:1074C00000000000000000000000000000000000BC +:1074D00000000000000000000000000000000000AC +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000008C +:10750000000000000000000000000000000000007B +:10751000000000000000000000000000000000006B +:10752000000000000000000000000000000000005B +:10753000000000000000000000000000000000004B +:10754000000000000000000000000000000000003B +:10755000000000000000000000000000000000002B +:10756000000000000000000000000000000000001B +:10757000000000000000000000000000000000000B +:1075800000000000000000000000000000000000FB +:1075900000000000000000000000000000000000EB +:1075A00000000000000000000000000000000000DB +:1075B00000000000000000000000000000000000CB +:1075C00000000000000000000000000000000000BB +:1075D00000000000000000000000000000000000AB +:1075E000000000000000000000000000000000009B +:1075F0000000000000000000000000000000000289 +:10760000020202020202020202020202020202025A +:10761000020202020202020202020202020202024A +:10762000020202020202020202020202020202023A +:10763000020202020202020202020202020202022A +:10764000020202020202020202020202020202021A +:10765000020202020202020202020202020202020A +:1076600002020202020202020202020202020202FA +:1076700002020202020202020202020202020202EA +:1076800002020202020202020202020202020202DA +:1076900002020202020202020202020202020202CA +:1076A00002020202020202020202020202020202BA +:1076B00002020202020202020202020202020202AA +:1076C000020202020202020202020202020202029A +:1076D000020202020202020202020202020202028A +:1076E000020202020202020202020202020202027A +:1076F000020202020202020202020202020202026A +:107700000202020202020202020202020202020259 +:107710000202020202020202020202020202020249 +:107720000202020202020202020202020202020239 +:107730000202020202020202020202020202020229 +:107740000202020202020202020202020202020219 +:107750000202020202020202020202020202020209 +:1077600002020202020202020202020202020202F9 +:1077700002020202020202020202020202020202E9 +:1077800002020202020202020202020202020202D9 +:1077900002020202020202020202020202020202C9 +:1077A00002020202020202020202020202020202B9 +:1077B00002020202020202020202020202020202A9 +:1077C0000202020202020202020202020202020299 +:1077D0000202020202020202020202020202020289 +:1077E0000202020202020202020202020202020279 +:1077F0000202020202020202020202020202020269 +:107800000202020202020202020202020202020258 +:107810000202020202020202020202020202020248 +:107820000202020202020202020202020202020238 +:107830000202020202020202020202020202020228 +:107840000202020202020202020202020202020218 +:107850000202020202020202020202020202020208 +:1078600002020202020202020202020202020202F8 +:1078700002020202020202020202020202020202E8 +:1078800002020202020202020202020202020202D8 +:1078900002020202020202020202020202020202C8 +:1078A00002020202020202020202020202020202B8 +:1078B00002020202020202020202020202020202A8 +:1078C0000202020202020202020202020202020298 +:1078D0000202020202020202020202020202020288 +:1078E0000202020202020202020202020202020278 +:1078F0000202020202020202020202020202020268 +:107900000202020202020202020202020202020257 +:107910000202020202020202020202020202020247 +:107920000202020202020202020202020202020237 +:107930000202020202020202020202020202020227 +:107940000202020202020202020202020202020217 +:107950000202020202020202020202020202020207 +:1079600002020202020202020202020202020202F7 +:1079700002020202020202020202020202020202E7 +:1079800002020202020202020202020202020202D7 +:1079900002020202020202020202020202020202C7 +:1079A00002020202020202020202020202020202B7 +:1079B00002020202020202020202020202020202A7 +:1079C0000202020202020202020202020202020297 +:1079D0000202020202020202020202020202020287 +:1079E0000202020202020202020202020202020277 +:1079F0000202020202020202020202020202020267 +:107A00000202020202020202020202020202020256 +:107A10000202020202020202020202020202020246 +:107A20000202020202020202020202020202020236 +:107A30000202020202020202020202020202020226 +:107A40000202020202020202020202020202020216 +:107A50000202020202020202020202020202020206 +:107A600002020202020202020202020202020202F6 +:107A700002020202020202020202020202020202E6 +:107A800002020202020202020202020202020202D6 +:107A900002020202020202020202020202020202C6 +:107AA00002020202020202020202020202020202B6 +:107AB00002020202020202020202020202020202A6 +:107AC0000202020202020202020202020202020296 +:107AD0000202020202020202020202020202020286 +:107AE0000202020202020202020202020202020276 +:107AF0000202020202020202020202020202020266 +:107B00000202020202020202020202020202020255 +:107B10000202020202020202020202020202020245 +:107B20000202020202020202020202020202020235 +:107B30000202020202020202020202020202020225 +:107B40000202020202020202020202020202020215 +:107B50000202020202020202020202020202020205 +:107B600002020202020202020202020202020202F5 +:107B700002020202020202020202020202020202E5 +:107B800002020202020202020202020202020202D5 +:107B900002020202020202020202020202020202C5 +:107BA00002020202020202020202020202020202B5 +:107BB00002020202020202020202020202020202A5 +:107BC0000202020202020202020202020202020295 +:107BD0000202020202020202020202020202020285 +:107BE0000202020202020202020202020202020275 +:107BF0000202020202020202020202020202020265 +:107C00000202020202020202020202020202020254 +:107C10000202020202020202020202020202020244 +:107C20000202020202020202020202020202020234 +:107C30000202020202020202020202020202020224 +:107C40000202020202020202020202020202020214 +:107C50000202020202020202020202020202020204 +:107C600002020202020202020202020202020202F4 +:107C700002020202020202020202020202020202E4 +:107C800002020202020202020202020202020202D4 +:107C900002020202020202020202020202020202C4 +:107CA00002020202020202020202020202020202B4 +:107CB00002020202020202020202020202020202A4 +:107CC0000202020202020202020202020202020294 +:107CD0000202020202020202020202020202020284 +:107CE0000202020202020202020202020202020274 +:107CF0000202020202020202020202020202020264 +:107D00000202020202020202020202020202020253 +:107D10000202020202020202020202020202020243 +:107D20000202020202020202020202020202020233 +:107D30000202020202020202020202020202020223 +:107D40000202020202020202020202020202020213 +:107D50000202020202020202020202020202020203 +:107D600002020202020202020202020202020202F3 +:107D700002020202020202020202020202020202E3 +:107D800002020202020202020202020202020202D3 +:107D900002020202020202020202020202020202C3 +:107DA00002020202020202020202020202020202B3 +:107DB00002020202020202020202020202020202A3 +:107DC0000202020202020202020202020202020293 +:107DD0000202020202020202020202020202020283 +:107DE0000202020202020202020202020202020273 +:107DF0000202020202020202020202020202020263 +:107E00000202020202020202020202020202020252 +:107E10000202020202020202020202020202020242 +:107E20000202020202020202020202020202020232 +:107E30000202020202020202020202020202020222 +:107E40000202020202020202020202020202020212 +:107E50000202020202020202020202020202020202 +:107E600002020202020202020202020202020202F2 +:107E700002020202020202020202020202020202E2 +:107E800002020202020202020202020202020202D2 +:107E900002020202020202020202020202020202C2 +:107EA00002020202020202020202020202020202B2 +:107EB00002020202020202020202020202020202A2 +:107EC0000202020202020202020202020202020292 +:107ED0000202020202020202020202020202020282 +:107EE0000202020202020202020202020202020272 +:107EF0000202020202020202020202020202020262 +:107F00000202020202020202020202020202020251 +:107F10000202020202020202020202020202020241 +:107F20000202020202020202020202020202020231 +:107F30000202020202020202020202020202020221 +:107F40000202020202020202020202020202020211 +:107F50000202020202020202020202020202020201 +:107F600002020202020202020202020202020202F1 +:107F700002020202020202020202020202020202E1 +:107F800002020202020202020202020202020202D1 +:107F900002020202020202020202020202020202C1 +:107FA00002020202020202020202020202020202B1 +:107FB00002020202020202020202020202020202A1 +:107FC0000202020202020202020202020202020291 +:107FD0000202020202020202020202020202020281 +:107FE0000202020202020202020202020202020271 +:107FF0000202020202020202020202020202020261 +:108000000202020202020202020202020202020250 +:108010000202020202020202020202020202020240 +:108020000202020202020202020202020202020230 +:108030000202020202020202020202020202020220 +:108040000202020202020202020202020202020210 +:108050000202020202020202020202020202020200 +:1080600002020202020202020202020202020202F0 +:1080700002020202020202020202020202020202E0 +:1080800002020202020202020202020202020202D0 +:1080900002020202020202020202020202020202C0 +:1080A00002020202020202020202020202020202B0 +:1080B00002020202020202020202020202020202A0 +:1080C0000202020202020202020202020202020290 +:1080D0000202020202020202020202020202020280 +:1080E0000202020202020202020202020202020270 +:1080F0000202020202020202020202020202020260 +:10810000020202020202020202020202020202024F +:10811000020202020202020202020202020202023F +:10812000020202020202020202020202020202022F +:10813000020202020202020202020202020202021F +:10814000020202020202020202020202020202020F +:1081500002020202020202020202020202020202FF +:1081600002020202020202020202020202020202EF +:1081700002020202020202020202020202020202DF +:1081800002020202020202020202020202020202CF +:1081900002020202020202020202020202020202BF +:1081A00002020202020202020202020202020202AF +:1081B000020202020202020202020202020202029F +:1081C000020202020202020202020202020202028F +:1081D000020202020202020202020202020202027F +:1081E000020202020202020202020202020202026F +:1081F000020202020202020202020202020202025F +:10820000020202020202020202020202020202024E +:10821000020202020202020202020202020202023E +:10822000020202020202020202020202020202022E +:10823000020202020202020202020202020202021E +:10824000020202020202020202020202020202020E +:1082500002020202020202020202020202020202FE +:1082600002020202020202020202020202020202EE +:1082700002020202020202020202020202020202DE +:1082800002020202020202020202020202020202CE +:1082900002020202020202020202020202020202BE +:1082A00002020202020202020202020202020202AE +:1082B000020202020202020202020202020202029E +:1082C000020202020202020202020202020202028E +:1082D000020202020202020202020202020202027E +:1082E000020202020202020202020202020202026E +:1082F000020202020202020202020202020202025E +:10830000020202020202020202020202020202024D +:10831000020202020202020202020202020202023D +:10832000020202020202020202020202020202022D +:10833000020202020202020202020202020202021D +:10834000020202020202020202020202020202020D +:1083500002020202020202020202020202020202FD +:1083600002020202020202020202020202020202ED +:1083700002020202020202020202020202020202DD +:1083800002020202020202020202020202020202CD +:1083900002020202020202020202020202020202BD +:1083A00002020202020202020202020202020202AD +:1083B000020202020202020202020202020202029D +:1083C000020202020202020202020202020202028D +:1083D000020202020202020202020202020202027D +:1083E000020202020202020202020202020202026D +:1083F000020202020202020202020202020202025D +:10840000020202020202020202020202020202024C +:10841000020202020202020202020202020202023C +:10842000020202020202020202020202020202022C +:10843000020202020202020202020202020202021C +:10844000020202020202020202020202020202020C +:1084500002020202020202020202020202020202FC +:1084600002020202020202020202020202020202EC +:1084700002020202020202020202020202020202DC +:1084800002020202020202020202020202020202CC +:1084900002020202020202020202020202020202BC +:1084A00002020202020202020202020202020202AC +:1084B000020202020202020202020202020202029C +:1084C000020202020202020202020202020202028C +:1084D000020202020202020202020202020202027C +:1084E000020202020202020202020202020202026C +:1084F000020202020202020202020202020202025C +:10850000020202020202020202020202020202024B +:10851000020202020202020202020202020202023B +:10852000020202020202020202020202020202022B +:10853000020202020202020202020202020202021B +:10854000020202020202020202020202020202020B +:1085500002020202020202020202020202020202FB +:1085600002020202020202020202020202020202EB +:1085700002020202020202020202020202020202DB +:1085800002020202020202020202020202020202CB +:1085900002020202020202020202020202020202BB +:1085A00002020202020202020202020202020202AB +:1085B000020202020202020202020202020202029B +:1085C000020202020202020202020202020202028B +:1085D000020202020202020202020202020202027B +:1085E000020202020202020202020202020202026B +:1085F000020202020202020202020202020202025B +:10860000020202020202020202020202020202024A +:10861000020202020202020202020202020202023A +:10862000020202020202020202020202020202022A +:10863000020202020202020202020202020202021A +:10864000020202020202020202020202020202020A +:1086500002020202020202020202020202020202FA +:1086600002020202020202020202020202020202EA +:1086700002020202020202020202020202020202DA +:1086800002020202020202020202020202020202CA +:1086900002020202020202020202020202020202BA +:1086A00002020202020202020202020202020202AA +:1086B000020202020202020202020202020202029A +:1086C000020202020202020202020202020202028A +:1086D000020202020202020202020202020202027A +:1086E000020202020202020202020202020202026A +:1086F000020202020202020202020202020202025A +:108700000202020202020202020202020202020249 +:108710000202020202020202020202020202020239 +:108720000202020202020202020202020202020229 +:108730000202020202020202020202020202020219 +:108740000202020202020202020202020202020209 +:1087500002020202020202020202020202020202F9 +:1087600002020202020202020202020202020202E9 +:1087700002020202020202020202020202020202D9 +:1087800002020202020202020202020202020202C9 +:1087900002020202020202020202020202020202B9 +:1087A00002020202020202020202020202020202A9 +:1087B0000202020202020202020202020202020299 +:1087C0000202020202020202020202020202020289 +:1087D0000202020202020202020202020202020279 +:1087E0000202020202020202020202020202020269 +:1087F000020202020202020202020202020202005B +:108800000000000000000000000000000000000068 +:108810000000000000000000000000000000000058 +:108820000000000000000000000000000000000048 +:108830000000000000000000000000000000000038 +:108840000000000000000000000000000000000028 +:108850000000000000000000000000000000000018 +:108860000000000000000000000000000000000008 +:1088700000000000000000000000000000000000F8 +:1088800000000000000000000000000000000000E8 +:1088900000000000000000000000000000000000D8 +:1088A00000000000000000000000000000000000C8 +:1088B00000000000000000000000000000000000B8 +:1088C00000000000000000000000000000000000A8 +:1088D0000000000000000000000000000000000098 +:1088E0000000000000000000000000000000000088 +:1088F0000000000000000000000000000000000078 +:108900000000000000000000000000000000000067 +:108910000000000000000000000000000000000057 +:108920000000000000000000000000000000000047 +:108930000000000000000000000000000000000037 +:108940000000000000000000000000000000000027 +:108950000000000000000000000000000000000017 +:108960000000000000000000000000000000000007 +:1089700000000000000000000000000000000000F7 +:1089800000000000000000000000000000000000E7 +:1089900000000000000000000000000000000000D7 +:1089A00000000000000000000000000000000000C7 +:1089B00000000000000000000000000000000000B7 +:1089C00000000000000000000000000000000000A7 +:1089D0000000000000000000000000000000000097 +:1089E0000000000000000000000000000000000087 +:1089F0000000000000000000000000000000000077 +:108A00000000000000000000000000000000000066 +:108A10000000000000000000000000000000000056 +:108A20000000000000000000000000000000000046 +:108A30000000000000000000000000000000000036 +:108A40000000000000000000000000000000000026 +:108A50000000000000000000000000000000000016 +:108A60000000000000000000000000000000000006 +:108A700000000000000000000000000000000000F6 +:108A800000000000000000000000000000000000E6 +:108A900000000000000000000000000000000000D6 +:108AA00000000000000000000000000000000000C6 +:108AB00000000000000000000000000000000000B6 +:108AC00000000000000000000000000000000000A6 +:108AD0000000000000000000000000000000000096 +:108AE0000000000000000000000000000000000086 +:108AF0000000000000000000000000000000000076 +:108B00000000000000000000000000000000000065 +:108B10000000000000000000000000000000000055 +:108B20000000000000000000000000000000000045 +:108B30000000000000000000000000000000000035 +:108B40000000000000000000000000000000000025 +:108B50000000000000000000000000000000000015 +:108B60000000000000000000000000000000000005 +:108B700000000000000000000000000000000000F5 +:108B800000000000000000000000000000000000E5 +:108B900000000000000000000000000000000000D5 +:108BA00000000000000000000000000000000000C5 +:108BB00000000000000000000000000000000000B5 +:108BC00000000000000000000000000000000000A5 +:108BD0000000000000000000000000000000000095 +:108BE0000000000000000000000000000000000085 +:108BF0000000000000000000000000000000000075 +:108C00000000000000000000000000000000000064 +:108C10000000000000000000000000000000000054 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 +:108C40000000000000000000000000000000000024 +:108C50000000000000000000000000000000000014 +:108C60000000000000000000000000000000000004 +:108C700000000000000000000000000000000000F4 +:108C800000000000000000000000000000000000E4 +:108C900000000000000000000000000000000000D4 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000000000000000000B4 +:108CC00000000000000000000000000000000000A4 +:108CD0000000000000000000000000000000000094 +:108CE0000000000000000000000000000000000084 +:108CF0000000000000000000000000000000000074 +:108D00000000000000000000000000000000000063 +:108D10000000000000000000000000000000000053 +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 +:108D40000000000000000000000000000000000023 +:108D50000000000000000000000000000000000013 +:108D60000000000000000000000000000000000003 +:108D700000000000000000000000000000000000F3 +:108D800000000000000000000000000000000000E3 +:108D900000000000000000000000000000000000D3 +:108DA00000000000000000000000000000000000C3 +:108DB00000000000000000000000000000000000B3 +:108DC00000000000000000000000000000000000A3 +:108DD0000000000000000000000000000000000093 +:108DE0000000000000000000000000000000000083 +:108DF0000000000000000000000000000000000073 +:108E00000000000000000000000000000000000062 +:108E10000000000000000000000000000000000052 +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 +:108E50000000000000000000000000000000000012 +:108E60000000000000000000000000000000000002 +:108E700000000000000000000000000000000000F2 +:108E800000000000000000000000000000000000E2 +:108E900000000000000000000000000000000000D2 +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC00000000000000000000000000000000000A2 +:108ED0000000000000000000000000000000000092 +:108EE0000000000000000000000000000000000082 +:108EF0000000000000000000000000000000000072 +:108F00000000000000000000000000000000000061 +:108F10000000000000000000000000000000000051 +:108F20000000000000000000000000000000000041 +:108F30000000000000000000000000000000000031 +:108F40000000000000000000000000000000000021 +:108F50000000000000000000000000000000000011 +:108F60000000000000000000000000000000000001 +:108F700000000000000000000000000000000000F1 +:108F800000000000000000000000000000000000E1 +:108F900000000000000000000000000000000000D1 +:108FA00000000000000000000000000000000000C1 +:108FB00000000000000000000000000000000000B1 +:108FC00000000000000000000000000000000000A1 +:108FD0000000000000000000000000000000000091 +:108FE0000000000000000000000000000000000081 +:108FF0000000000000000000000000000000000071 +:109000000000000000000000000000000000000060 +:109010000000000000000000000000000000000050 +:109020000000000000000000000000000000000040 +:109030000000000000000000000000000000000030 +:109040000000000000000000000000000000000020 +:109050000000000000000000000000000000000010 +:109060000000000000000000000000000000000000 +:1090700000000000000000000000000000000000F0 +:1090800000000000000000000000000000000000E0 +:1090900000000000000000000000000000000000D0 +:1090A00000000000000000000000000000000000C0 +:1090B00000000000000000000000000000000000B0 +:1090C00000000000000000000000000000000000A0 +:1090D0000000000000000000000000000000000090 +:1090E0000000000000000000000000000000000080 +:1090F000000000000000000000000000000000016F +:10910000010101010101010101010101010101014F +:10911000010101010101010101010101010101013F +:10912000010101010101010101010101010101012F +:10913000010101010101010101010101010101011F +:10914000010101010101010101010101010101010F +:1091500001010101010101010101010101010101FF +:1091600001010101010101010101010101010101EF +:1091700001010101010101010101010101010101DF +:1091800001010101010101010101010101010101CF +:1091900001010101010101010101010101010101BF +:1091A00001010101010101010101010101010101AF +:1091B000010101010101010101010101010101019F +:1091C000010101010101010101010101010101018F +:1091D000010101010101010101010101010101017F +:1091E000010101010101010101010101010101016F +:1091F000010101010101010101010101010101015F +:10920000010101010101010101010101010101014E +:10921000010101010101010101010101010101013E +:10922000010101010101010101010101010101012E +:10923000010101010101010101010101010101011E +:10924000010101010101010101010101010101010E +:1092500001010101010101010101010101010101FE +:1092600001010101010101010101010101010101EE +:1092700001010101010101010101010101010101DE +:1092800001010101010101010101010101010101CE +:1092900001010101010101010101010101010101BE +:1092A00001010101010101010101010101010101AE +:1092B000010101010101010101010101010101019E +:1092C000010101010101010101010101010101018E +:1092D000010101010101010101010101010101017E +:1092E000010101010101010101010101010101016E +:1092F000010101010101010101010101010101015E +:10930000010101010101010101010101010101014D +:10931000010101010101010101010101010101013D +:10932000010101010101010101010101010101012D +:10933000010101010101010101010101010101011D +:10934000010101010101010101010101010101010D +:1093500001010101010101010101010101010101FD +:1093600001010101010101010101010101010101ED +:1093700001010101010101010101010101010101DD +:1093800001010101010101010101010101010101CD +:1093900001010101010101010101010101010101BD +:1093A00001010101010101010101010101010101AD +:1093B000010101010101010101010101010101019D +:1093C000010101010101010101010101010101018D +:1093D000010101010101010101010101010101017D +:1093E000010101010101010101010101010101016D +:1093F000010101010101010101010101010101015D +:10940000010101010101010101010101010101014C +:10941000010101010101010101010101010101013C +:10942000010101010101010101010101010101012C +:10943000010101010101010101010101010101011C +:10944000010101010101010101010101010101010C +:1094500001010101010101010101010101010101FC +:1094600001010101010101010101010101010101EC +:1094700001010101010101010101010101010101DC +:1094800001010101010101010101010101010101CC +:1094900001010101010101010101010101010101BC +:1094A00001010101010101010101010101010101AC +:1094B000010101010101010101010101010101019C +:1094C000010101010101010101010101010101018C +:1094D000010101010101010101010101010101017C +:1094E000010101010101010101010101010101016C +:1094F000010101010101010101010101010101015C +:10950000010101010101010101010101010101014B +:10951000010101010101010101010101010101013B +:10952000010101010101010101010101010101012B +:10953000010101010101010101010101010101011B +:10954000010101010101010101010101010101010B +:1095500001010101010101010101010101010101FB +:1095600001010101010101010101010101010101EB +:1095700001010101010101010101010101010101DB +:1095800001010101010101010101010101010101CB +:1095900001010101010101010101010101010101BB +:1095A00001010101010101010101010101010101AB +:1095B000010101010101010101010101010101019B +:1095C000010101010101010101010101010101018B +:1095D000010101010101010101010101010101017B +:1095E000010101010101010101010101010101016B +:1095F000010101010101010101010101010101015B +:10960000010101010101010101010101010101014A +:10961000010101010101010101010101010101013A +:10962000010101010101010101010101010101012A +:10963000010101010101010101010101010101011A +:10964000010101010101010101010101010101010A +:1096500001010101010101010101010101010101FA +:1096600001010101010101010101010101010101EA +:1096700001010101010101010101010101010101DA +:1096800001010101010101010101010101010101CA +:1096900001010101010101010101010101010101BA +:1096A00001010101010101010101010101010101AA +:1096B000010101010101010101010101010101019A +:1096C000010101010101010101010101010101018A +:1096D000010101010101010101010101010101017A +:1096E000010101010101010101010101010101016A +:1096F000010101010101010101010101010101015A +:109700000101010101010101010101010101010149 +:109710000101010101010101010101010101010139 +:109720000101010101010101010101010101010129 +:109730000101010101010101010101010101010119 +:109740000101010101010101010101010101010109 +:1097500001010101010101010101010101010101F9 +:1097600001010101010101010101010101010101E9 +:1097700001010101010101010101010101010101D9 +:1097800001010101010101010101010101010101C9 +:1097900001010101010101010101010101010101B9 +:1097A00001010101010101010101010101010101A9 +:1097B0000101010101010101010101010101010199 +:1097C0000101010101010101010101010101010189 +:1097D0000101010101010101010101010101010179 +:1097E0000101010101010101010101010101010169 +:1097F0000101010101010101010101010101010159 +:109800000101010101010101010101010101010148 +:109810000101010101010101010101010101010138 +:109820000101010101010101010101010101010128 +:109830000101010101010101010101010101010118 +:109840000101010101010101010101010101010108 +:1098500001010101010101010101010101010101F8 +:1098600001010101010101010101010101010101E8 +:1098700001010101010101010101010101010101D8 +:1098800001010101010101010101010101010101C8 +:1098900001010101010101010101010101010101B8 +:1098A00001010101010101010101010101010101A8 +:1098B0000101010101010101010101010101010198 +:1098C0000101010101010101010101010101010188 +:1098D0000101010101010101010101010101010178 +:1098E0000101010101010101010101010101010168 +:1098F0000101010101010101010101010101010158 +:109900000101010101010101010101010101010147 +:109910000101010101010101010101010101010137 +:109920000101010101010101010101010101010127 +:109930000101010101010101010101010101010117 +:109940000101010101010101010101010101010107 +:1099500001010101010101010101010101010101F7 +:1099600001010101010101010101010101010101E7 +:1099700001010101010101010101010101010101D7 +:1099800001010101010101010101010101010101C7 +:1099900001010101010101010101010101010101B7 +:1099A00001010101010101010101010101010101A7 +:1099B0000101010101010101010101010101010197 +:1099C0000101010101010101010101010101010187 +:1099D0000101010101010101010101010101010177 +:1099E0000101010101010101010101010101010167 +:1099F0000101010101010101010101010101010157 +:109A00000101010101010101010101010101010146 +:109A10000101010101010101010101010101010136 +:109A20000101010101010101010101010101010126 +:109A30000101010101010101010101010101010116 +:109A40000101010101010101010101010101010106 +:109A500001010101010101010101010101010101F6 +:109A600001010101010101010101010101010101E6 +:109A700001010101010101010101010101010101D6 +:109A800001010101010101010101010101010101C6 +:109A900001010101010101010101010101010101B6 +:109AA00001010101010101010101010101010101A6 +:109AB0000101010101010101010101010101010196 +:109AC0000101010101010101010101010101010186 +:109AD0000101010101010101010101010101010176 +:109AE0000101010101010101010101010101010166 +:109AF0000101010101010101010101010101010156 +:109B00000101010101010101010101010101010145 +:109B10000101010101010101010101010101010135 +:109B20000101010101010101010101010101010125 +:109B30000101010101010101010101010101010115 +:109B40000101010101010101010101010101010105 +:109B500001010101010101010101010101010101F5 +:109B600001010101010101010101010101010101E5 +:109B700001010101010101010101010101010101D5 +:109B800001010101010101010101010101010101C5 +:109B900001010101010101010101010101010101B5 +:109BA00001010101010101010101010101010101A5 +:109BB0000101010101010101010101010101010195 +:109BC0000101010101010101010101010101010185 +:109BD0000101010101010101010101010101010175 +:109BE0000101010101010101010101010101010165 +:109BF0000101010101010101010101010101010155 +:109C00000101010101010101010101010101010144 +:109C10000101010101010101010101010101010134 +:109C20000101010101010101010101010101010124 +:109C30000101010101010101010101010101010114 +:109C40000101010101010101010101010101010104 +:109C500001010101010101010101010101010101F4 +:109C600001010101010101010101010101010101E4 +:109C700001010101010101010101010101010101D4 +:109C800001010101010101010101010101010101C4 +:109C900001010101010101010101010101010101B4 +:109CA00001010101010101010101010101010101A4 +:109CB0000101010101010101010101010101010194 +:109CC0000101010101010101010101010101010184 +:109CD0000101010101010101010101010101010174 +:109CE0000101010101010101010101010101010164 +:109CF0000101010101010101010101010101010154 +:109D00000101010101010101010101010101010143 +:109D10000101010101010101010101010101010133 +:109D20000101010101010101010101010101010123 +:109D30000101010101010101010101010101010113 +:109D40000101010101010101010101010101010103 +:109D500001010101010101010101010101010101F3 +:109D600001010101010101010101010101010101E3 +:109D700001010101010101010101010101010101D3 +:109D800001010101010101010101010101010101C3 +:109D900001010101010101010101010101010101B3 +:109DA00001010101010101010101010101010101A3 +:109DB0000101010101010101010101010101010193 +:109DC0000101010101010101010101010101010183 +:109DD0000101010101010101010101010101010173 +:109DE0000101010101010101010101010101010163 +:109DF0000101010101010101010101010101010153 +:109E00000101010101010101010101010101010142 +:109E10000101010101010101010101010101010132 +:109E20000101010101010101010101010101010122 +:109E30000101010101010101010101010101010112 +:109E40000101010101010101010101010101010102 +:109E500001010101010101010101010101010101F2 +:109E600001010101010101010101010101010101E2 +:109E700001010101010101010101010101010101D2 +:109E800001010101010101010101010101010101C2 +:109E900001010101010101010101010101010101B2 +:109EA00001010101010101010101010101010101A2 +:109EB0000101010101010101010101010101010192 +:109EC0000101010101010101010101010101010182 +:109ED0000101010101010101010101010101010172 +:109EE0000101010101010101010101010101010162 +:109EF0000101010101010101010101010101010152 +:109F00000101010101010101010101010101010141 +:109F10000101010101010101010101010101010131 +:109F20000101010101010101010101010101010121 +:109F30000101010101010101010101010101010111 +:109F40000101010101010101010101010101010101 +:109F500001010101010101010101010101010101F1 +:109F600001010101010101010101010101010101E1 +:109F700001010101010101010101010101010101D1 +:109F800001010101010101010101010101010101C1 +:109F900001010101010101010101010101010101B1 +:109FA00001010101010101010101010101010101A1 +:109FB0000101010101010101010101010101010191 +:109FC0000101010101010101010101010101010181 +:109FD0000101010101010101010101010101010171 +:109FE0000101010101010101010101010101010161 +:109FF0000101010101010101010101010101010151 +:10A000000101010101010101010101010101010140 +:10A010000101010101010101010101010101010130 +:10A020000101010101010101010101010101010120 +:10A030000101010101010101010101010101010110 +:10A040000101010101010101010101010101010100 +:10A0500001010101010101010101010101010101F0 +:10A0600001010101010101010101010101010101E0 +:10A0700001010101010101010101010101010101D0 +:10A0800001010101010101010101010101010101C0 +:10A0900001010101010101010101010101010101B0 +:10A0A00001010101010101010101010101010101A0 +:10A0B0000101010101010101010101010101010190 +:10A0C0000101010101010101010101010101010180 +:10A0D0000101010101010101010101010101010170 +:10A0E0000101010101010101010101010101010160 +:10A0F0000101010101010101010101010101010150 +:10A10000010101010101010101010101010101013F +:10A11000010101010101010101010101010101012F +:10A12000010101010101010101010101010101011F +:10A13000010101010101010101010101010101010F +:10A1400001010101010101010101010101010101FF +:10A1500001010101010101010101010101010101EF +:10A1600001010101010101010101010101010101DF +:10A1700001010101010101010101010101010101CF +:10A1800001010101010101010101010101010101BF +:10A1900001010101010101010101010101010101AF +:10A1A000010101010101010101010101010101019F +:10A1B000010101010101010101010101010101018F +:10A1C000010101010101010101010101010101017F +:10A1D000010101010101010101010101010101016F +:10A1E000010101010101010101010101010101015F +:10A1F000010101010101010101010101010101014F +:10A20000010101010101010101010101010101013E +:10A21000010101010101010101010101010101012E +:10A22000010101010101010101010101010101011E +:10A23000010101010101010101010101010101010E +:10A2400001010101010101010101010101010101FE +:10A2500001010101010101010101010101010101EE +:10A2600001010101010101010101010101010101DE +:10A2700001010101010101010101010101010101CE +:10A2800001010101010101010101010101010101BE +:10A2900001010101010101010101010101010101AE +:10A2A000010101010101010101010101010101019E +:10A2B000010101010101010101010101010101018E +:10A2C000010101010101010101010101010101017E +:10A2D000010101010101010101010101010101016E +:10A2E000010101010101010101010101010101015E +:10A2F000010101010101010101010101010101004F +:10A30000000000000000000000000000000000004D +:10A31000000000000000000000000000000000003D +:10A32000000000000000000000000000000000002D +:10A33000000000000000000000000000000000001D +:10A34000000000000000000000000000000000000D +:10A3500000000000000000000000000000000000FD +:10A3600000000000000000000000000000000000ED +:10A3700000000000000000000000000000000000DD +:10A3800000000000000000000000000000000000CD +:10A3900000000000000000000000000000000000BD +:10A3A00000000000000000000000000000000000AD +:10A3B000000000000000000000000000000000009D +:10A3C000000000000000000000000000000000008D +:10A3D000000000000000000000000000000000007D +:10A3E000000000000000000000000000000000006D +:10A3F000000000000000000000000000000000005D +:10A40000000000000000000000000000000000004C +:10A41000000000000000000000000000000000003C +:10A42000000000000000000000000000000000002C +:10A43000000000000000000000000000000000001C +:10A44000000000000000000000000000000000000C +:10A4500000000000000000000000000000000000FC +:10A4600000000000000000000000000000000000EC +:10A4700000000000000000000000000000000000DC +:10A4800000000000000000000000000000000000CC +:10A4900000000000000000000000000000000000BC +:10A4A00000000000000000000000000000000000AC +:10A4B000000000000000000000000000000000009C +:10A4C000000000000000000000000000000000008C +:10A4D000000000000000000000000000000000007C +:10A4E000000000000000000000000000000000006C +:10A4F000000000000000000000000000000000005C +:10A50000000000000000000000000000000000004B +:10A51000000000000000000000000000000000003B +:10A52000000000000000000000000000000000002B +:10A53000000000000000000000000000000000001B +:10A54000000000000000000000000000000000000B +:10A5500000000000000000000000000000000000FB +:10A5600000000000000000000000000000000000EB +:10A5700000000000000000000000000000000000DB +:10A5800000000000000000000000000000000000CB +:10A5900000000000000000000000000000000000BB +:10A5A00000000000000000000000000000000000AB +:10A5B000000000000000000000000000000000009B +:10A5C000000000000000000000000000000000008B +:10A5D000000000000000000000000000000000007B +:10A5E000000000000000000000000000000000006B +:10A5F000000000000000000000000000000000005B +:10A60000000000000000000000000000000000004A +:10A61000000000000000000000000000000000003A +:10A62000000000000000000000000000000000002A +:10A63000000000000000000000000000000000001A +:10A64000000000000000000000000000000000000A +:10A6500000000000000000000000000000000000FA +:10A6600000000000000000000000000000000000EA +:10A6700000000000000000000000000000000000DA +:10A6800000000000000000000000000000000000CA +:10A6900000000000000000000000000000000000BA +:10A6A00000000000000000000000000000000000AA +:10A6B000000000000000000000000000000000009A +:10A6C000000000000000000000000000000000008A +:10A6D000000000000000000000000000000000007A +:10A6E000000000000000000000000000000000006A +:10A6F000000000000000000000000000000000005A +:10A700000000000000000000000000000000000049 +:10A710000000000000000000000000000000000039 +:10A720000000000000000000000000000000000029 +:10A730000000000000000000000000000000000019 +:10A740000000000000000000000000000000000009 +:10A7500000000000000000000000000000000000F9 +:10A7600000000000000000000000000000000000E9 +:10A7700000000000000000000000000000000000D9 +:10A7800000000000000000000000000000000000C9 +:10A7900000000000000000000000000000000000B9 +:10A7A00000000000000000000000000000000000A9 +:10A7B0000000000000000000000000000000000099 +:10A7C0000000000000000000000000000000000089 +:10A7D0000000000000000000000000000000000079 +:10A7E0000000000000000000000000000000000069 +:10A7F0000000000000000000000000000000000059 +:10A800000000000000000000000000000000000048 +:10A810000000000000000000000000000000000038 +:10A820000000000000000000000000000000000028 +:10A830000000000000000000000000000000000018 +:10A840000000000000000000000000000000000008 +:10A8500000000000000000000000000000000000F8 +:10A8600000000000000000000000000000000000E8 +:10A8700000000000000000000000000000000000D8 +:10A8800000000000000000000000000000000000C8 +:10A8900000000000000000000000000000000000B8 +:10A8A00000000000000000000000000000000000A8 +:10A8B0000000000000000000000000000000000098 +:10A8C0000000000000000000000000000000000088 +:10A8D0000000000000000000000000000000000078 +:10A8E0000000000000000000000000000000000068 +:10A8F0000000000000000000000000000000000256 +:10A900000202020202020202020202020202020227 +:10A910000202020202020202020202020202020217 +:10A920000202020202020202020202020202020207 +:10A9300002020202020202020202020202020202F7 +:10A9400002020202020202020202020202020202E7 +:10A9500002020202020202020202020202020202D7 +:10A9600002020202020202020202020202020202C7 +:10A9700002020202020202020202020202020202B7 +:10A9800002020202020202020202020202020202A7 +:10A990000202020202020202020202020202020297 +:10A9A0000202020202020202020202020202020287 +:10A9B0000202020202020202020202020202020277 +:10A9C0000202020202020202020202020202020267 +:10A9D0000202020202020202020202020202020257 +:10A9E0000202020202020202020202020202020247 +:10A9F0000202020202020202020202020202020237 +:10AA00000202020202020202020202020202020226 +:10AA10000202020202020202020202020202020216 +:10AA20000202020202020202020202020202020206 +:10AA300002020202020202020202020202020202F6 +:10AA400002020202020202020202020202020202E6 +:10AA500002020202020202020202020202020202D6 +:10AA600002020202020202020202020202020202C6 +:10AA700002020202020202020202020202020202B6 +:10AA800002020202020202020202020202020202A6 +:10AA90000202020202020202020202020202020296 +:10AAA0000202020202020202020202020202020286 +:10AAB0000202020202020202020202020202020276 +:10AAC0000202020202020202020202020202020266 +:10AAD0000202020202020202020202020202020256 +:10AAE0000202020202020202020202020202020246 +:10AAF0000202020202020202020202020202020236 +:10AB00000202020202020202020202020202020225 +:10AB10000202020202020202020202020202020215 +:10AB20000202020202020202020202020202020205 +:10AB300002020202020202020202020202020202F5 +:10AB400002020202020202020202020202020202E5 +:10AB500002020202020202020202020202020202D5 +:10AB600002020202020202020202020202020202C5 +:10AB700002020202020202020202020202020202B5 +:10AB800002020202020202020202020202020202A5 +:10AB90000202020202020202020202020202020295 +:10ABA0000202020202020202020202020202020285 +:10ABB0000202020202020202020202020202020275 +:10ABC0000202020202020202020202020202020265 +:10ABD0000202020202020202020202020202020255 +:10ABE0000202020202020202020202020202020245 +:10ABF0000202020202020202020202020202020235 +:10AC00000202020202020202020202020202020224 +:10AC10000202020202020202020202020202020214 +:10AC20000202020202020202020202020202020204 +:10AC300002020202020202020202020202020202F4 +:10AC400002020202020202020202020202020202E4 +:10AC500002020202020202020202020202020202D4 +:10AC600002020202020202020202020202020202C4 +:10AC700002020202020202020202020202020202B4 +:10AC800002020202020202020202020202020202A4 +:10AC90000202020202020202020202020202020294 +:10ACA0000202020202020202020202020202020284 +:10ACB0000202020202020202020202020202020274 +:10ACC0000202020202020202020202020202020264 +:10ACD0000202020202020202020202020202020254 +:10ACE0000202020202020202020202020202020244 +:10ACF0000202020202020202020202020202020234 +:10AD00000202020202020202020202020202020223 +:10AD10000202020202020202020202020202020213 +:10AD20000202020202020202020202020202020203 +:10AD300002020202020202020202020202020202F3 +:10AD400002020202020202020202020202020202E3 +:10AD500002020202020202020202020202020202D3 +:10AD600002020202020202020202020202020202C3 +:10AD700002020202020202020202020202020202B3 +:10AD800002020202020202020202020202020202A3 +:10AD90000202020202020202020202020202020293 +:10ADA0000202020202020202020202020202020283 +:10ADB0000202020202020202020202020202020273 +:10ADC0000202020202020202020202020202020263 +:10ADD0000202020202020202020202020202020253 +:10ADE0000202020202020202020202020202020243 +:10ADF0000202020202020202020202020202020233 +:10AE00000202020202020202020202020202020222 +:10AE10000202020202020202020202020202020212 +:10AE20000202020202020202020202020202020202 +:10AE300002020202020202020202020202020202F2 +:10AE400002020202020202020202020202020202E2 +:10AE500002020202020202020202020202020202D2 +:10AE600002020202020202020202020202020202C2 +:10AE700002020202020202020202020202020202B2 +:10AE800002020202020202020202020202020202A2 +:10AE90000202020202020202020202020202020292 +:10AEA0000202020202020202020202020202020282 +:10AEB0000202020202020202020202020202020272 +:10AEC0000202020202020202020202020202020262 +:10AED0000202020202020202020202020202020252 +:10AEE0000202020202020202020202020202020242 +:10AEF0000202020202020202020202020202020232 +:10AF00000202020202020202020202020202020221 +:10AF10000202020202020202020202020202020211 +:10AF20000202020202020202020202020202020201 +:10AF300002020202020202020202020202020202F1 +:10AF400002020202020202020202020202020202E1 +:10AF500002020202020202020202020202020202D1 +:10AF600002020202020202020202020202020202C1 +:10AF700002020202020202020202020202020202B1 +:10AF800002020202020202020202020202020202A1 +:10AF90000202020202020202020202020202020291 +:10AFA0000202020202020202020202020202020281 +:10AFB0000202020202020202020202020202020271 +:10AFC0000202020202020202020202020202020261 +:10AFD0000202020202020202020202020202020251 +:10AFE0000202020202020202020202020202020241 +:10AFF0000202020202020202020202020202020231 +:10B000000202020202020202020202020202020220 +:10B010000202020202020202020202020202020210 +:10B020000202020202020202020202020202020200 +:10B0300002020202020202020202020202020202F0 +:10B0400002020202020202020202020202020202E0 +:10B0500002020202020202020202020202020202D0 +:10B0600002020202020202020202020202020202C0 +:10B0700002020202020202020202020202020202B0 +:10B0800002020202020202020202020202020202A0 +:10B090000202020202020202020202020202020290 +:10B0A0000202020202020202020202020202020280 +:10B0B0000202020202020202020202020202020270 +:10B0C0000202020202020202020202020202020260 +:10B0D0000202020202020202020202020202020250 +:10B0E0000202020202020202020202020202020240 +:10B0F0000202020202020202020202020202020230 +:10B10000020202020202020202020202020202021F +:10B11000020202020202020202020202020202020F +:10B1200002020202020202020202020202020202FF +:10B1300002020202020202020202020202020202EF +:10B1400002020202020202020202020202020202DF +:10B1500002020202020202020202020202020202CF +:10B1600002020202020202020202020202020202BF +:10B1700002020202020202020202020202020202AF +:10B18000020202020202020202020202020202029F +:10B19000020202020202020202020202020202028F +:10B1A000020202020202020202020202020202027F +:10B1B000020202020202020202020202020202026F +:10B1C000020202020202020202020202020202025F +:10B1D000020202020202020202020202020202024F +:10B1E000020202020202020202020202020202023F +:10B1F000020202020202020202020202020202022F +:10B20000020202020202020202020202020202021E +:10B21000020202020202020202020202020202020E +:10B2200002020202020202020202020202020202FE +:10B2300002020202020202020202020202020202EE +:10B2400002020202020202020202020202020202DE +:10B2500002020202020202020202020202020202CE +:10B2600002020202020202020202020202020202BE +:10B2700002020202020202020202020202020202AE +:10B28000020202020202020202020202020202029E +:10B29000020202020202020202020202020202028E +:10B2A000020202020202020202020202020202027E +:10B2B000020202020202020202020202020202026E +:10B2C000020202020202020202020202020202025E +:10B2D000020202020202020202020202020202024E +:10B2E000020202020202020202020202020202023E +:10B2F000020202020202020202020202020202022E +:10B30000020202020202020202020202020202021D +:10B31000020202020202020202020202020202020D +:10B3200002020202020202020202020202020202FD +:10B3300002020202020202020202020202020202ED +:10B3400002020202020202020202020202020202DD +:10B3500002020202020202020202020202020202CD +:10B3600002020202020202020202020202020202BD +:10B3700002020202020202020202020202020202AD +:10B38000020202020202020202020202020202029D +:10B39000020202020202020202020202020202028D +:10B3A000020202020202020202020202020202027D +:10B3B000020202020202020202020202020202026D +:10B3C000020202020202020202020202020202025D +:10B3D000020202020202020202020202020202024D +:10B3E000020202020202020202020202020202023D +:10B3F000020202020202020202020202020202022D +:10B40000020202020202020202020202020202021C +:10B41000020202020202020202020202020202020C +:10B4200002020202020202020202020202020202FC +:10B4300002020202020202020202020202020202EC +:10B4400002020202020202020202020202020202DC +:10B4500002020202020202020202020202020202CC +:10B4600002020202020202020202020202020202BC +:10B4700002020202020202020202020202020202AC +:10B48000020202020202020202020202020202029C +:10B49000020202020202020202020202020202028C +:10B4A000020202020202020202020202020202027C +:10B4B000020202020202020202020202020202026C +:10B4C000020202020202020202020202020202025C +:10B4D000020202020202020202020202020202024C +:10B4E000020202020202020202020202020202023C +:10B4F000020202020202020202020202020202022C +:10B50000020202020202020202020202020202021B +:10B51000020202020202020202020202020202020B +:10B5200002020202020202020202020202020202FB +:10B5300002020202020202020202020202020202EB +:10B5400002020202020202020202020202020202DB +:10B5500002020202020202020202020202020202CB +:10B5600002020202020202020202020202020202BB +:10B5700002020202020202020202020202020202AB +:10B58000020202020202020202020202020202029B +:10B59000020202020202020202020202020202028B +:10B5A000020202020202020202020202020202027B +:10B5B000020202020202020202020202020202026B +:10B5C000020202020202020202020202020202025B +:10B5D000020202020202020202020202020202024B +:10B5E000020202020202020202020202020202023B +:10B5F000020202020202020202020202020202022B +:10B60000020202020202020202020202020202021A +:10B61000020202020202020202020202020202020A +:10B6200002020202020202020202020202020202FA +:10B6300002020202020202020202020202020202EA +:10B6400002020202020202020202020202020202DA +:10B6500002020202020202020202020202020202CA +:10B6600002020202020202020202020202020202BA +:10B6700002020202020202020202020202020202AA +:10B68000020202020202020202020202020202029A +:10B69000020202020202020202020202020202028A +:10B6A000020202020202020202020202020202027A +:10B6B000020202020202020202020202020202026A +:10B6C000020202020202020202020202020202025A +:10B6D000020202020202020202020202020202024A +:10B6E000020202020202020202020202020202023A +:10B6F000020202020202020202020202020202022A +:10B700000202020202020202020202020202020219 +:10B710000202020202020202020202020202020209 +:10B7200002020202020202020202020202020202F9 +:10B7300002020202020202020202020202020202E9 +:10B7400002020202020202020202020202020202D9 +:10B7500002020202020202020202020202020202C9 +:10B7600002020202020202020202020202020202B9 +:10B7700002020202020202020202020202020202A9 +:10B780000202020202020202020202020202020299 +:10B790000202020202020202020202020202020289 +:10B7A0000202020202020202020202020202020279 +:10B7B0000202020202020202020202020202020269 +:10B7C0000202020202020202020202020202020259 +:10B7D0000202020202020202020202020202020249 +:10B7E0000202020202020202020202020202020239 +:10B7F0000202020202020202020202020202020229 +:10B800000202020202020202020202020202020218 +:10B810000202020202020202020202020202020208 +:10B8200002020202020202020202020202020202F8 +:10B8300002020202020202020202020202020202E8 +:10B8400002020202020202020202020202020202D8 +:10B8500002020202020202020202020202020202C8 +:10B8600002020202020202020202020202020202B8 +:10B8700002020202020202020202020202020202A8 +:10B880000202020202020202020202020202020298 +:10B890000202020202020202020202020202020288 +:10B8A0000202020202020202020202020202020278 +:10B8B0000202020202020202020202020202020268 +:10B8C0000202020202020202020202020202020258 +:10B8D0000202020202020202020202020202020248 +:10B8E0000202020202020202020202020202020238 +:10B8F0000202020202020202020202020202020228 +:10B900000202020202020202020202020202020217 +:10B910000202020202020202020202020202020207 +:10B9200002020202020202020202020202020202F7 +:10B9300002020202020202020202020202020202E7 +:10B9400002020202020202020202020202020202D7 +:10B9500002020202020202020202020202020202C7 +:10B9600002020202020202020202020202020202B7 +:10B9700002020202020202020202020202020202A7 +:10B980000202020202020202020202020202020297 +:10B990000202020202020202020202020202020287 +:10B9A0000202020202020202020202020202020277 +:10B9B0000202020202020202020202020202020267 +:10B9C0000202020202020202020202020202020257 +:10B9D0000202020202020202020202020202020247 +:10B9E0000202020202020202020202020202020237 +:10B9F0000202020202020202020202020202020227 +:10BA00000202020202020202020202020202020216 +:10BA10000202020202020202020202020202020206 +:10BA200002020202020202020202020202020202F6 +:10BA300002020202020202020202020202020202E6 +:10BA400002020202020202020202020202020202D6 +:10BA500002020202020202020202020202020202C6 +:10BA600002020202020202020202020202020202B6 +:10BA700002020202020202020202020202020202A6 +:10BA80000202020202020202020202020202020296 +:10BA90000202020202020202020202020202020286 +:10BAA0000202020202020202020202020202020276 +:10BAB0000202020202020202020202020202020266 +:10BAC0000202020202020202020202020202020256 +:10BAD0000202020202020202020202020202020246 +:10BAE0000202020202020202020202020202020236 +:10BAF0000202020202020202020202020202020028 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000064 +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000000000000000D3 +:10BD700000000000000000000000000000000000C3 +:10BD800000000000000000000000000000000000B3 +:10BD900000000000000000000000000000000000A3 +:10BDA0000000000000000000000000000000000093 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000000000000073 +:10BDD0000000000000000000000000000000000063 +:10BDE0000000000000000000000000000000000053 +:10BDF0000000000000000000000000000000000043 +:10BE00000000000000000000000000000000000032 +:10BE10000000000000000000000000000000000022 +:10BE20000000000000000000000000000000000012 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000000000000000000000000D2 +:10BE700000000000000000000000000000000000C2 +:10BE800000000000000000000000000000000000B2 +:10BE900000000000000000000000000000000000A2 +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000062 +:10BEE0000000000000000000000000000000000052 +:10BEF0000000000000000000000000000000000042 +:10BF00000000000000000000000000000000000031 +:10BF10000000000000000000000000000000000021 +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000000000000000000000C1 +:10BF800000000000000000000000000000000000B1 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000000000000061 +:10BFE0000000000000000000000000000000000051 +:10BFF0000000000000000000000000000000000041 +:10C000000000000000000000000000000000000030 +:10C010000000000000000000000000000000000020 +:10C020000000000000000000000000000000000010 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C0700000000000000000000000000000000000C0 +:10C0800000000000000000000000000000000000B0 +:10C0900000000000000000000000000000000000A0 +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E0000000000000000000000000000000000050 +:10C0F0000000000000000000000000000000005BE5 +:10C100000000000000000001010101010101010126 +:10C11000010101010101010101010101010101010F +:10C1200001010101010101010101010101010101FF +:10C1300001010101010101010101010101010101EF +:10C1400001010101010101010101010101010101DF +:10C1500001010101010101010101010101010101CF +:10C1600001010101010101010101010101010101BF +:10C1700001010101010101010101010101010101AF +:10C18000010101010101010101010101010101019F +:10C19000010101010101010101010101010101018F +:10C1A000010101010101010101010101010101017F +:10C1B000010101010101010101010101010101016F +:10C1C000010101010101010101010101010101015F +:10C1D000010101010101010101010101010101014F +:10C1E000010101010101010101010101010101013F +:10C1F000010101010101010101010101010101012F +:10C20000010101010101010101010101010101011E +:10C21000010101010101010101010101010101010E +:10C2200001010101010101010101010101010101FE +:10C2300001010101010101010101010101010101EE +:10C2400001010101010101010101010101010101DE +:10C2500001010101010101010101010101010101CE +:10C2600001010101010101010101010101010101BE +:10C2700001010101010101010101010101010101AE +:10C28000010101010101010101010101010101019E +:10C29000010101010101010101010101010101018E +:10C2A000010101010101010101010101010101017E +:10C2B000010101010101010101010101010101016E +:10C2C000010101010101010101010101010101015E +:10C2D000010101010101010101010101010101014E +:10C2E000010101010101010101010101010101013E +:10C2F000010101010101010101010101010101012E +:10C30000010101010101010101010101010101011D +:10C31000010101010101010101010101010101010D +:10C3200001010101010101010101010101010101FD +:10C3300001010101010101010101010101010101ED +:10C3400001010101010101010101010101010101DD +:10C3500001010101010101010101010101010101CD +:10C3600001010101010101010101010101010101BD +:10C3700001010101010101010101010101010101AD +:10C38000010101010101010101010101010101019D +:10C39000010101010101010101010101010101018D +:10C3A000010101010101010101010101010101017D +:10C3B000010101010101010101010101010101016D +:10C3C000010101010101010101010101010101015D +:10C3D000010101010101010101010101010101014D +:10C3E000010101010101010101010101010101013D +:10C3F000010101010101010101010101010101012D +:10C40000010101010101010101010101010101011C +:10C41000010101010101010101010101010101010C +:10C4200001010101010101010101010101010101FC +:10C4300001010101010101010101010101010101EC +:10C4400001010101010101010101010101010101DC +:10C4500001010101010101010101010101010101CC +:10C4600001010101010101010101010101010101BC +:10C4700001010101010101010101010101010101AC +:10C48000010101010101010101010101010101019C +:10C49000010101010101010101010101010101018C +:10C4A000010101010101010101010101010101017C +:10C4B000010101010101010101010101010101016C +:10C4C000010101010101010101010101010101015C +:10C4D000010101010101010101010101010101014C +:10C4E000010101010101010101010101010101013C +:10C4F000010101010101010101010101010101012C +:10C50000010101010101010101010101010101011B +:10C51000010101010101010101010101010101010B +:10C5200001010101010101010101010101010101FB +:10C5300001010101010101010101010101010101EB +:10C5400001010101010101010101010101010101DB +:10C5500001010101010101010101010101010101CB +:10C5600001010101010101010101010101010101BB +:10C5700001010101010101010101010101010101AB +:10C58000010101010101010101010101010101019B +:10C59000010101010101010101010101010101018B +:10C5A000010101010101010101010101010101017B +:10C5B000010101010101010101010101010101016B +:10C5C000010101010101010101010101010101015B +:10C5D000010101010101010101010101010101014B +:10C5E000010101010101010101010101010101013B +:10C5F000010101010101010101010101010101012B +:10C60000010101010101010101010101010101011A +:10C61000010101010101010101010101010101010A +:10C6200001010101010101010101010101010101FA +:10C6300001010101010101010101010101010101EA +:10C6400001010101010101010101010101010101DA +:10C6500001010101010101010101010101010101CA +:10C6600001010101010101010101010101010101BA +:10C6700001010101010101010101010101010101AA +:10C68000010101010101010101010101010101019A +:10C69000010101010101010101010101010101018A +:10C6A000010101010101010101010101010101017A +:10C6B000010101010101010101010101010101016A +:10C6C000010101010101010101010101010101015A +:10C6D000010101010101010101010101010101014A +:10C6E000010101010101010101010101010101013A +:10C6F000010101010101010101010101010101012A +:10C700000101010101010101010101010101010119 +:10C710000101010101010101010101010101010109 +:10C7200001010101010101010101010101010101F9 +:10C7300001010101010101010101010101010101E9 +:10C7400001010101010101010101010101010101D9 +:10C7500001010101010101010101010101010101C9 +:10C7600001010101010101010101010101010101B9 +:10C7700001010101010101010101010101010101A9 +:10C780000101010101010101010101010101010199 +:10C790000101010101010101010101010101010189 +:10C7A0000101010101010101010101010101010179 +:10C7B0000101010101010101010101010101010169 +:10C7C0000101010101010101010101010101010159 +:10C7D0000101010101010101010101010101010149 +:10C7E0000101010101010101010101010101010139 +:10C7F0000101010101010101010101010101010129 +:10C800000101010101010101010101010101010118 +:10C810000101010101010101010101010101010108 +:10C8200001010101010101010101010101010101F8 +:10C8300001010101010101010101010101010101E8 +:10C8400001010101010101010101010101010101D8 +:10C8500001010101010101010101010101010101C8 +:10C8600001010101010101010101010101010101B8 +:10C8700001010101010101010101010101010101A8 +:10C880000101010101010101010101010101010198 +:10C890000101010101010101010101010101010188 +:10C8A0000101010101010101010101010101010178 +:10C8B0000101010101010101010101010101010168 +:10C8C0000101010101010101010101010101010158 +:10C8D0000101010101010101010101010101010148 +:10C8E0000101010101010101010101010101010138 +:10C8F0000101010101010101010101010101010128 +:10C900000101010101010101010101010101010117 +:10C910000101010101010101010101010101010107 +:10C9200001010101010101010101010101010101F7 +:10C9300001010101010101010101010101010101E7 +:10C9400001010101010101010101010101010101D7 +:10C9500001010101010101010101010101010101C7 +:10C9600001010101010101010101010101010101B7 +:10C9700001010101010101010101010101010101A7 +:10C980000101010101010101010101010101010197 +:10C990000101010101010101010101010101010187 +:10C9A0000101010101010101010101010101010177 +:10C9B0000101010101010101010101010101010167 +:10C9C0000101010101010101010101010101010157 +:10C9D0000101010101010101010101010101010147 +:10C9E0000101010101010101010101010101010137 +:10C9F0000101010101010101010101010101010127 +:10CA00000101010101010101010101010101010116 +:10CA10000101010101010101010101010101010106 +:10CA200001010101010101010101010101010101F6 +:10CA300001010101010101010101010101010101E6 +:10CA400001010101010101010101010101010101D6 +:10CA500001010101010101010101010101010101C6 +:10CA600001010101010101010101010101010101B6 +:10CA700001010101010101010101010101010101A6 +:10CA80000101010101010101010101010101010196 +:10CA90000101010101010101010101010101010186 +:10CAA0000101010101010101010101010101010176 +:10CAB0000101010101010101010101010101010166 +:10CAC0000101010101010101010101010101010156 +:10CAD0000101010101010101010101010101010146 +:10CAE0000101010101010101010101010101010136 +:10CAF0000101010101010101010101010101010126 +:10CB00000101010101010101010101010101010115 +:10CB10000101010101010101010101010101010105 +:10CB200001010101010101010101010101010101F5 +:10CB300001010101010101010101010101010101E5 +:10CB400001010101010101010101010101010101D5 +:10CB500001010101010101010101010101010101C5 +:10CB600001010101010101010101010101010101B5 +:10CB700001010101010101010101010101010101A5 +:10CB80000101010101010101010101010101010195 +:10CB90000101010101010101010101010101010185 +:10CBA0000101010101010101010101010101010175 +:10CBB0000101010101010101010101010101010165 +:10CBC0000101010101010101010101010101010155 +:10CBD0000101010101010101010101010101010145 +:10CBE0000101010101010101010101010101010135 +:10CBF0000101010101010101010101010101010125 +:10CC00000101010101010101010101010101010114 +:10CC10000101010101010101010101010101010104 +:10CC200001010101010101010101010101010101F4 +:10CC300001010101010101010101010101010101E4 +:10CC400001010101010101010101010101010101D4 +:10CC500001010101010101010101010101010101C4 +:10CC600001010101010101010101010101010101B4 +:10CC700001010101010101010101010101010101A4 +:10CC80000101010101010101010101010101010194 +:10CC90000101010101010101010101010101010184 +:10CCA0000101010101010101010101010101010174 +:10CCB0000101010101010101010101010101010164 +:10CCC0000101010101010101010101010101010154 +:10CCD0000101010101010101010101010101010144 +:10CCE0000101010101010101010101010101010134 +:10CCF0000101010101010101010101010101010124 +:10CD00000101010101010101010101010101010113 +:10CD10000101010101010101010101010101010103 +:10CD200001010101010101010101010101010101F3 +:10CD300001010101010101010101010101010101E3 +:10CD400001010101010101010101010101010101D3 +:10CD500001010101010101010101010101010101C3 +:10CD600001010101010101010101010101010101B3 +:10CD700001010101010101010101010101010101A3 +:10CD80000101010101010101010101010101010193 +:10CD90000101010101010101010101010101010183 +:10CDA0000101010101010101010101010101010173 +:10CDB0000101010101010101010101010101010163 +:10CDC0000101010101010101010101010101010153 +:10CDD0000101010101010101010101010101010143 +:10CDE0000101010101010101010101010101010133 +:10CDF0000101010101010101010101010101010123 +:10CE00000101010101010101010101010101010112 +:10CE10000101010101010101010101010101010102 +:10CE200001010101010101010101010101010101F2 +:10CE300001010101010101010101010101010101E2 +:10CE400001010101010101010101010101010101D2 +:10CE500001010101010101010101010101010101C2 +:10CE600001010101010101010101010101010101B2 +:10CE700001010101010101010101010101010101A2 +:10CE80000101010101010101010101010101010192 +:10CE90000101010101010101010101010101010182 +:10CEA0000101010101010101010101010101010172 +:10CEB0000101010101010101010101010101010162 +:10CEC0000101010101010101010101010101010152 +:10CED0000101010101010101010101010101010142 +:10CEE0000101010101010101010101010101010132 +:10CEF0000101010101010101010101010101010122 +:10CF00000101010101010101010101010101010111 +:10CF10000101010101010101010101010101010101 +:10CF200001010101010101010101010101010101F1 +:10CF300001010101010101010101010101010101E1 +:10CF400001010101010101010101010101010101D1 +:10CF500001010101010101010101010101010101C1 +:10CF600001010101010101010101010101010101B1 +:10CF700001010101010101010101010101010101A1 +:10CF80000101010101010101010101010101010191 +:10CF90000101010101010101010101010101010181 +:10CFA0000101010101010101010101010101010171 +:10CFB0000101010101010101010101010101010161 +:10CFC0000101010101010101010101010101010151 +:10CFD0000101010101010101010101010101010141 +:10CFE0000101010101010101010101010101010131 +:10CFF0000101010101010101010101010101010121 +:10D000000101010101010100000000000000000019 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000000000000000000000E0 +:10D0500000000000000000000000000000000000D0 +:10D0600000000000000000000000000000000000C0 +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000000000000000000080 +:10D0B0000000000000000000000000000000000070 +:10D0C0000000000000000000000000000000000060 +:10D0D0000000000000000000000000000000000050 +:10D0E0000000000000000000000000000000000040 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D1200000000000000000000000000000000000FF +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000000000000000BF +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000004F +:10D1E000000000000000000000000000000000003F +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE +:10D2700000000000000000000000000000000000AE +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C000000000000000000000000000000000005E +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD +:10D3700000000000000000000000000000000000AD +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000002020202020202020207 +:10D7100002020202020202020202020202020202E9 +:10D7200002020202020202020202020202020202D9 +:10D7300002020202020202020202020202020202C9 +:10D7400002020202020202020202020202020202B9 +:10D7500002020202020202020202020202020202A9 +:10D760000202020202020202020202020202020299 +:10D770000202020202020202020202020202020289 +:10D780000202020202020202020202020202020279 +:10D790000202020202020202020202020202020269 +:10D7A0000202020202020202020202020202020259 +:10D7B0000202020202020202020202020202020249 +:10D7C0000202020202020202020202020202020239 +:10D7D0000202020202020202020202020202020229 +:10D7E0000202020202020202020202020202020219 +:10D7F0000202020202020202020202020202020209 +:10D8000002020202020202020202020202020202F8 +:10D8100002020202020202020202020202020202E8 +:10D8200002020202020202020202020202020202D8 +:10D8300002020202020202020202020202020202C8 +:10D8400002020202020202020202020202020202B8 +:10D8500002020202020202020202020202020202A8 +:10D860000202020202020202020202020202020298 +:10D870000202020202020202020202020202020288 +:10D880000202020202020202020202020202020278 +:10D890000202020202020202020202020202020268 +:10D8A0000202020202020202020202020202020258 +:10D8B0000202020202020202020202020202020248 +:10D8C0000202020202020202020202020202020238 +:10D8D0000202020202020202020202020202020228 +:10D8E0000202020202020202020202020202020218 +:10D8F0000202020202020202020202020202020208 +:10D9000002020202020202020202020202020202F7 +:10D9100002020202020202020202020202020202E7 +:10D9200002020202020202020202020202020202D7 +:10D9300002020202020202020202020202020202C7 +:10D9400002020202020202020202020202020202B7 +:10D9500002020202020202020202020202020202A7 +:10D960000202020202020202020202020202020297 +:10D970000202020202020202020202020202020287 +:10D980000202020202020202020202020202020277 +:10D990000202020202020202020202020202020267 +:10D9A0000202020202020202020202020202020257 +:10D9B0000202020202020202020202020202020247 +:10D9C0000202020202020202020202020202020237 +:10D9D0000202020202020202020202020202020227 +:10D9E0000202020202020202020202020202020217 +:10D9F0000202020202020202020202020202020207 +:10DA000002020202020202020202020202020202F6 +:10DA100002020202020202020202020202020202E6 +:10DA200002020202020202020202020202020202D6 +:10DA300002020202020202020202020202020202C6 +:10DA400002020202020202020202020202020202B6 +:10DA500002020202020202020202020202020202A6 +:10DA60000202020202020202020202020202020296 +:10DA70000202020202020202020202020202020286 +:10DA80000202020202020202020202020202020276 +:10DA90000202020202020202020202020202020266 +:10DAA0000202020202020202020202020202020256 +:10DAB0000202020202020202020202020202020246 +:10DAC0000202020202020202020202020202020236 +:10DAD0000202020202020202020202020202020226 +:10DAE0000202020202020202020202020202020216 +:10DAF0000202020202020202020202020202020206 +:10DB000002020202020202020202020202020202F5 +:10DB100002020202020202020202020202020202E5 +:10DB200002020202020202020202020202020202D5 +:10DB300002020202020202020202020202020202C5 +:10DB400002020202020202020202020202020202B5 +:10DB500002020202020202020202020202020202A5 +:10DB60000202020202020202020202020202020295 +:10DB70000202020202020202020202020202020285 +:10DB80000202020202020202020202020202020275 +:10DB90000202020202020202020202020202020265 +:10DBA0000202020202020202020202020202020255 +:10DBB0000202020202020202020202020202020245 +:10DBC0000202020202020202020202020202020235 +:10DBD0000202020202020202020202020202020225 +:10DBE0000202020202020202020202020202020215 +:10DBF0000202020202020202020202020202020205 +:10DC000002020202020202020202020202020202F4 +:10DC100002020202020202020202020202020202E4 +:10DC200002020202020202020202020202020202D4 +:10DC300002020202020202020202020202020202C4 +:10DC400002020202020202020202020202020202B4 +:10DC500002020202020202020202020202020202A4 +:10DC60000202020202020202020202020202020294 +:10DC70000202020202020202020202020202020284 +:10DC80000202020202020202020202020202020274 +:10DC90000202020202020202020202020202020264 +:10DCA0000202020202020202020202020202020254 +:10DCB0000202020202020202020202020202020244 +:10DCC0000202020202020202020202020202020234 +:10DCD0000202020202020202020202020202020224 +:10DCE0000202020202020202020202020202020214 +:10DCF0000202020202020202020202020202020204 +:10DD000002020202020202020202020202020202F3 +:10DD100002020202020202020202020202020202E3 +:10DD200002020202020202020202020202020202D3 +:10DD300002020202020202020202020202020202C3 +:10DD400002020202020202020202020202020202B3 +:10DD500002020202020202020202020202020202A3 +:10DD60000202020202020202020202020202020293 +:10DD70000202020202020202020202020202020283 +:10DD80000202020202020202020202020202020273 +:10DD90000202020202020202020202020202020263 +:10DDA0000202020202020202020202020202020253 +:10DDB0000202020202020202020202020202020243 +:10DDC0000202020202020202020202020202020233 +:10DDD0000202020202020202020202020202020223 +:10DDE0000202020202020202020202020202020213 +:10DDF0000202020202020202020202020202020203 +:10DE000002020202020202020202020202020202F2 +:10DE100002020202020202020202020202020202E2 +:10DE200002020202020202020202020202020202D2 +:10DE300002020202020202020202020202020202C2 +:10DE400002020202020202020202020202020202B2 +:10DE500002020202020202020202020202020202A2 +:10DE60000202020202020202020202020202020292 +:10DE70000202020202020202020202020202020282 +:10DE80000202020202020202020202020202020272 +:10DE90000202020202020202020202020202020262 +:10DEA0000202020202020202020202020202020252 +:10DEB0000202020202020202020202020202020242 +:10DEC0000202020202020202020202020202020232 +:10DED0000202020202020202020202020202020222 +:10DEE0000202020202020202020202020202020212 +:10DEF0000202020202020202020202020202020202 +:10DF000002020202020202020202020202020202F1 +:10DF100002020202020202020202020202020202E1 +:10DF200002020202020202020202020202020202D1 +:10DF300002020202020202020202020202020202C1 +:10DF400002020202020202020202020202020202B1 +:10DF500002020202020202020202020202020202A1 +:10DF60000202020202020202020202020202020291 +:10DF70000202020202020202020202020202020281 +:10DF80000202020202020202020202020202020271 +:10DF90000202020202020202020202020202020261 +:10DFA0000202020202020202020202020202020251 +:10DFB0000202020202020202020202020202020241 +:10DFC0000202020202020202020202020202020231 +:10DFD0000202020202020202020202020202020221 +:10DFE0000202020202020202020202020202020211 +:10DFF0000202020202020202020202020202020201 +:10E0000002020202020202020202020202020202F0 +:10E0100002020202020202020202020202020202E0 +:10E0200002020202020202020202020202020202D0 +:10E0300002020202020202020202020202020202C0 +:10E0400002020202020202020202020202020202B0 +:10E0500002020202020202020202020202020202A0 +:10E060000202020202020202020202020202020290 +:10E070000202020202020202020202020202020280 +:10E080000202020202020202020202020202020270 +:10E090000202020202020202020202020202020260 +:10E0A0000202020202020202020202020202020250 +:10E0B0000202020202020202020202020202020240 +:10E0C0000202020202020202020202020202020230 +:10E0D0000202020202020202020202020202020220 +:10E0E0000202020202020202020202020202020210 +:10E0F0000202020202020202020202020202020200 +:10E1000002020202020202020202020202020202EF +:10E1100002020202020202020202020202020202DF +:10E1200002020202020202020202020202020202CF +:10E1300002020202020202020202020202020202BF +:10E1400002020202020202020202020202020202AF +:10E15000020202020202020202020202020202029F +:10E16000020202020202020202020202020202028F +:10E17000020202020202020202020202020202027F +:10E18000020202020202020202020202020202026F +:10E19000020202020202020202020202020202025F +:10E1A000020202020202020202020202020202024F +:10E1B000020202020202020202020202020202023F +:10E1C000020202020202020202020202020202022F +:10E1D000020202020202020202020202020202021F +:10E1E000020202020202020202020202020202020F +:10E1F00002020202020202020202020202020202FF +:10E2000002020202020202020202020202020202EE +:10E2100002020202020202020202020202020202DE +:10E2200002020202020202020202020202020202CE +:10E2300002020202020202020202020202020202BE +:10E2400002020202020202020202020202020202AE +:10E25000020202020202020202020202020202029E +:10E26000020202020202020202020202020202028E +:10E27000020202020202020202020202020202027E +:10E28000020202020202020202020202020202026E +:10E29000020202020202020202020202020202025E +:10E2A000020202020202020202020202020202024E +:10E2B000020202020202020202020202020202023E +:10E2C000020202020202020202020202020202022E +:10E2D000020202020202020202020202020202021E +:10E2E000020202020202020202020202020202020E +:10E2F00002020202020202020202020202020202FE +:10E3000002020202020202020202020202020202ED +:10E3100002020202020202020202020202020202DD +:10E3200002020202020202020202020202020202CD +:10E3300002020202020202020202020202020202BD +:10E3400002020202020202020202020202020202AD +:10E35000020202020202020202020202020202029D +:10E36000020202020202020202020202020202028D +:10E37000020202020202020202020202020202027D +:10E38000020202020202020202020202020202026D +:10E39000020202020202020202020202020202025D +:10E3A000020202020202020202020202020202024D +:10E3B000020202020202020202020202020202023D +:10E3C000020202020202020202020202020202022D +:10E3D000020202020202020202020202020202021D +:10E3E000020202020202020202020202020202020D +:10E3F00002020202020202020202020202020202FD +:10E4000002020202020202020202020202020202EC +:10E4100002020202020202020202020202020202DC +:10E4200002020202020202020202020202020202CC +:10E4300002020202020202020202020202020202BC +:10E4400002020202020202020202020202020202AC +:10E45000020202020202020202020202020202029C +:10E46000020202020202020202020202020202028C +:10E47000020202020202020202020202020202027C +:10E48000020202020202020202020202020202026C +:10E49000020202020202020202020202020202025C +:10E4A000020202020202020202020202020202024C +:10E4B000020202020202020202020202020202023C +:10E4C000020202020202020202020202020202022C +:10E4D000020202020202020202020202020202021C +:10E4E000020202020202020202020202020202020C +:10E4F00002020202020202020202020202020202FC +:10E5000002020202020202020202020202020202EB +:10E5100002020202020202020202020202020202DB +:10E5200002020202020202020202020202020202CB +:10E5300002020202020202020202020202020202BB +:10E5400002020202020202020202020202020202AB +:10E55000020202020202020202020202020202029B +:10E56000020202020202020202020202020202028B +:10E57000020202020202020202020202020202027B +:10E58000020202020202020202020202020202026B +:10E59000020202020202020202020202020202025B +:10E5A000020202020202020202020202020202024B +:10E5B000020202020202020202020202020202023B +:10E5C000020202020202020202020202020202022B +:10E5D000020202020202020202020202020202021B +:10E5E000020202020202020202020202020202020B +:10E5F00002020202020202020202020202020202FB +:10E6000002020202020202000000000000000000FC +:10E6100000000000000000000000000000000000FA +:10E6200000000000000000000000000000000000EA +:10E6300000000000000000000000000000000000DA +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E6600000000000000000000000000000000000AA +:10E67000000000000000000000000000000000009A +:10E68000000000000000000000000000000000008A +:10E69000000000000000000000000000000000007A +:10E6A000000000000000000000000000000000006A +:10E6B000000000000000000000000000000000005A +:10E6C000000000000000000000000000000000004A +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A +:10E6F000000000000000000000000000000000001A +:10E700000000000000000000000000000000000009 +:10E7100000000000000000000000000000000000F9 +:10E7200000000000000000000000000000000000E9 +:10E7300000000000000000000000000000000000D9 +:10E7400000000000000000000000000000000000C9 +:10E7500000000000000000000000000000000000B9 +:10E7600000000000000000000000000000000000A9 +:10E770000000000000000000000000000000000099 +:10E780000000000000000000000000000000000089 +:10E790000000000000000000000000000000000079 +:10E7A0000000000000000000000000000000000069 +:10E7B0000000000000000000000000000000000059 +:10E7C0000000000000000000000000000000000049 +:10E7D0000000000000000000000000000000000039 +:10E7E0000000000000000000000000000000000029 +:10E7F0000000000000000000000000000000000019 +:10E800000000000000000000000000000000000008 +:10E8100000000000000000000000000000000000F8 +:10E8200000000000000000000000000000000000E8 +:10E8300000000000000000000000000000000000D8 +:10E8400000000000000000000000000000000000C8 +:10E8500000000000000000000000000000000000B8 +:10E8600000000000000000000000000000000000A8 +:10E870000000000000000000000000000000000098 +:10E880000000000000000000000000000000000088 +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000000000000000000000000000058 +:10E8C0000000000000000000000000000000000048 +:10E8D0000000000000000000000000000000000038 +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000000000000000000000000000018 +:10E900000000000000000000000000000000000007 +:10E9100000000000000000000000000000000000F7 +:10E9200000000000000000000000000000000000E7 +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000000A7 +:10E970000000000000000000000000000000000097 +:10E980000000000000000000000000000000000087 +:10E990000000000000000000000000000000000077 +:10E9A0000000000000000000000000000000000067 +:10E9B0000000000000000000000000000000000057 +:10E9C0000000000000000000000000000000000047 +:10E9D0000000000000000000000000000000000037 +:10E9E0000000000000000000000000000000000027 +:10E9F0000000000000000000000000000000000017 +:10EA00000000000000000000000000000000000006 +:10EA100000000000000000000000000000000000F6 +:10EA200000000000000000000000000000000000E6 +:10EA300000000000000000000000000000000000D6 +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000000000000000000096 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000000000000000000F5 +:10EB200000000000000000000000000000000000E5 +:10EB300000000000000000000000000000000000D5 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000000000095 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000000000000000000000F4 +:10EC200000000000000000000000000000000000E4 +:10EC300000000000000000000000000000000000D4 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000000A4 +:10EC70000000000000000000000000000000000094 +:10EC80000000000000000000000000000000000084 +:10EC90000000000000000000000000000000000074 +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000034 +:10ECE0000000000000000000000000000000000024 +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000000000000000000000000B3 +:10ED600000000000000000000000000000000000A3 +:10ED70000000000000000000000000000000000093 +:10ED80000000000000000000000000000000000083 +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000000000000000000000000000002 +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000092 +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F0000000000000000000010101010101010101F7 +:10F0100001010101010101010101010101010101E0 +:10F0200001010101010101010101010101010101D0 +:10F0300001010101010101010101010101010101C0 +:10F0400001010101010101010101010101010101B0 +:10F0500001010101010101010101010101010101A0 +:10F060000101010101010101010101010101010190 +:10F070000101010101010101010101010101010180 +:10F080000101010101010101010101010101010170 +:10F090000101010101010101010101010101010160 +:10F0A0000101010101010101010101010101010150 +:10F0B0000101010101010101010101010101010140 +:10F0C0000101010101010101010101010101010130 +:10F0D0000101010101010101010101010101010120 +:10F0E0000101010101010101010101010101010110 +:10F0F0000101010101010101010101010101010100 +:10F1000001010101010101010101010101010101EF +:10F1100001010101010101010101010101010101DF +:10F1200001010101010101010101010101010101CF +:10F1300001010101010101010101010101010101BF +:10F1400001010101010101010101010101010101AF +:10F15000010101010101010101010101010101019F +:10F16000010101010101010101010101010101018F +:10F17000010101010101010101010101010101017F +:10F18000010101010101010101010101010101016F +:10F19000010101010101010101010101010101015F +:10F1A000010101010101010101010101010101014F +:10F1B000010101010101010101010101010101013F +:10F1C000010101010101010101010101010101012F +:10F1D000010101010101010101010101010101011F +:10F1E000010101010101010101010101010101010F +:10F1F00001010101010101010101010101010101FF +:10F2000001010101010101010101010101010101EE +:10F2100001010101010101010101010101010101DE +:10F2200001010101010101010101010101010101CE +:10F2300001010101010101010101010101010101BE +:10F2400001010101010101010101010101010101AE +:10F25000010101010101010101010101010101019E +:10F26000010101010101010101010101010101018E +:10F27000010101010101010101010101010101017E +:10F28000010101010101010101010101010101016E +:10F29000010101010101010101010101010101015E +:10F2A000010101010101010101010101010101014E +:10F2B000010101010101010101010101010101013E +:10F2C000010101010101010101010101010101012E +:10F2D000010101010101010101010101010101011E +:10F2E000010101010101010101010101010101010E +:10F2F00001010101010101010101010101010101FE +:10F3000001010101010101010101010101010101ED +:10F3100001010101010101010101010101010101DD +:10F3200001010101010101010101010101010101CD +:10F3300001010101010101010101010101010101BD +:10F3400001010101010101010101010101010101AD +:10F35000010101010101010101010101010101019D +:10F36000010101010101010101010101010101018D +:10F37000010101010101010101010101010101017D +:10F38000010101010101010101010101010101016D +:10F39000010101010101010101010101010101015D +:10F3A000010101010101010101010101010101014D +:10F3B000010101010101010101010101010101013D +:10F3C000010101010101010101010101010101012D +:10F3D000010101010101010101010101010101011D +:10F3E000010101010101010101010101010101010D +:10F3F00001010101010101010101010101010101FD +:10F4000001010101010101010101010101010101EC +:10F4100001010101010101010101010101010101DC +:10F4200001010101010101010101010101010101CC +:10F4300001010101010101010101010101010101BC +:10F4400001010101010101010101010101010101AC +:10F45000010101010101010101010101010101019C +:10F46000010101010101010101010101010101018C +:10F47000010101010101010101010101010101017C +:10F48000010101010101010101010101010101016C +:10F49000010101010101010101010101010101015C +:10F4A000010101010101010101010101010101014C +:10F4B000010101010101010101010101010101013C +:10F4C000010101010101010101010101010101012C +:10F4D000010101010101010101010101010101011C +:10F4E000010101010101010101010101010101010C +:10F4F00001010101010101010101010101010101FC +:10F5000001010101010101010101010101010101EB +:10F5100001010101010101010101010101010101DB +:10F5200001010101010101010101010101010101CB +:10F5300001010101010101010101010101010101BB +:10F5400001010101010101010101010101010101AB +:10F55000010101010101010101010101010101019B +:10F56000010101010101010101010101010101018B +:10F57000010101010101010101010101010101017B +:10F58000010101010101010101010101010101016B +:10F59000010101010101010101010101010101015B +:10F5A000010101010101010101010101010101014B +:10F5B000010101010101010101010101010101013B +:10F5C000010101010101010101010101010101012B +:10F5D000010101010101010101010101010101011B +:10F5E000010101010101010101010101010101010B +:10F5F00001010101010101010101010101010101FB +:10F6000001010101010101010101010101010101EA +:10F6100001010101010101010101010101010101DA +:10F6200001010101010101010101010101010101CA +:10F6300001010101010101010101010101010101BA +:10F6400001010101010101010101010101010101AA +:10F65000010101010101010101010101010101019A +:10F66000010101010101010101010101010101018A +:10F67000010101010101010101010101010101017A +:10F68000010101010101010101010101010101016A +:10F69000010101010101010101010101010101015A +:10F6A000010101010101010101010101010101014A +:10F6B000010101010101010101010101010101013A +:10F6C000010101010101010101010101010101012A +:10F6D000010101010101010101010101010101011A +:10F6E000010101010101010101010101010101010A +:10F6F00001010101010101010101010101010101FA +:10F7000001010101010101010101010101010101E9 +:10F7100001010101010101010101010101010101D9 +:10F7200001010101010101010101010101010101C9 +:10F7300001010101010101010101010101010101B9 +:10F7400001010101010101010101010101010101A9 +:10F750000101010101010101010101010101010199 +:10F760000101010101010101010101010101010189 +:10F770000101010101010101010101010101010179 +:10F780000101010101010101010101010101010169 +:10F790000101010101010101010101010101010159 +:10F7A0000101010101010101010101010101010149 +:10F7B0000101010101010101010101010101010139 +:10F7C0000101010101010101010101010101010129 +:10F7D0000101010101010101010101010101010119 +:10F7E0000101010101010101010101010101010109 +:10F7F00001010101010101010101010101010101F9 +:10F8000001010101010101010101010101010101E8 +:10F8100001010101010101010101010101010101D8 +:10F8200001010101010101010101010101010101C8 +:10F8300001010101010101010101010101010101B8 +:10F8400001010101010101010101010101010101A8 +:10F850000101010101010101010101010101010198 +:10F860000101010101010101010101010101010188 +:10F870000101010101010101010101010101010178 +:10F880000101010101010101010101010101010168 +:10F890000101010101010101010101010101010158 +:10F8A0000101010101010101010101010101010148 +:10F8B0000101010101010101010101010101010138 +:10F8C0000101010101010101010101010101010128 +:10F8D0000101010101010101010101010101010118 +:10F8E0000101010101010101010101010101010108 +:10F8F00001010101010101010101010101010101F8 +:10F9000001010101010101010101010101010101E7 +:10F9100001010101010101010101010101010101D7 +:10F9200001010101010101010101010101010101C7 +:10F9300001010101010101010101010101010101B7 +:10F9400001010101010101010101010101010101A7 +:10F950000101010101010101010101010101010197 +:10F960000101010101010101010101010101010187 +:10F970000101010101010101010101010101010177 +:10F980000101010101010101010101010101010167 +:10F990000101010101010101010101010101010157 +:10F9A0000101010101010101010101010101010147 +:10F9B0000101010101010101010101010101010137 +:10F9C0000101010101010101010101010101010127 +:10F9D0000101010101010101010101010101010117 +:10F9E0000101010101010101010101010101010107 +:10F9F00001010101010101010101010101010101F7 +:10FA000001010101010101010101010101010101E6 +:10FA100001010101010101010101010101010101D6 +:10FA200001010101010101010101010101010101C6 +:10FA300001010101010101010101010101010101B6 +:10FA400001010101010101010101010101010101A6 +:10FA50000101010101010101010101010101010196 +:10FA60000101010101010101010101010101010186 +:10FA70000101010101010101010101010101010176 +:10FA80000101010101010101010101010101010166 +:10FA90000101010101010101010101010101010156 +:10FAA0000101010101010101010101010101010146 +:10FAB0000101010101010101010101010101010136 +:10FAC0000101010101010101010101010101010126 +:10FAD0000101010101010101010101010101010116 +:10FAE0000101010101010101010101010101010106 +:10FAF00001010101010101010101010101010101F6 +:10FB000001010101010101010101010101010101E5 +:10FB100001010101010101010101010101010101D5 +:10FB200001010101010101010101010101010101C5 +:10FB300001010101010101010101010101010101B5 +:10FB400001010101010101010101010101010101A5 +:10FB50000101010101010101010101010101010195 +:10FB60000101010101010101010101010101010185 +:10FB70000101010101010101010101010101010175 +:10FB80000101010101010101010101010101010165 +:10FB90000101010101010101010101010101010155 +:10FBA0000101010101010101010101010101010145 +:10FBB0000101010101010101010101010101010135 +:10FBC0000101010101010101010101010101010125 +:10FBD0000101010101010101010101010101010115 +:10FBE0000101010101010101010101010101010105 +:10FBF00001010101010101010101010101010101F5 +:10FC000001010101010101010101010101010101E4 +:10FC100001010101010101010101010101010101D4 +:10FC200001010101010101010101010101010101C4 +:10FC300001010101010101010101010101010101B4 +:10FC400001010101010101010101010101010101A4 +:10FC50000101010101010101010101010101010194 +:10FC60000101010101010101010101010101010184 +:10FC70000101010101010101010101010101010174 +:10FC80000101010101010101010101010101010164 +:10FC90000101010101010101010101010101010154 +:10FCA0000101010101010101010101010101010144 +:10FCB0000101010101010101010101010101010134 +:10FCC0000101010101010101010101010101010124 +:10FCD0000101010101010101010101010101010114 +:10FCE0000101010101010101010101010101010104 +:10FCF00001010101010101010101010101010101F4 +:10FD000001010101010101010101010101010101E3 +:10FD100001010101010101010101010101010101D3 +:10FD200001010101010101010101010101010101C3 +:10FD300001010101010101010101010101010101B3 +:10FD400001010101010101010101010101010101A3 +:10FD50000101010101010101010101010101010193 +:10FD60000101010101010101010101010101010183 +:10FD70000101010101010101010101010101010173 +:10FD80000101010101010101010101010101010163 +:10FD90000101010101010101010101010101010153 +:10FDA0000101010101010101010101010101010143 +:10FDB0000101010101010101010101010101010133 +:10FDC0000101010101010101010101010101010123 +:10FDD0000101010101010101010101010101010113 +:10FDE0000101010101010101010101010101010103 +:10FDF00001010101010101010101010101010101F3 +:10FE000001010101010101010101010101010101E2 +:10FE100001010101010101010101010101010101D2 +:10FE200001010101010101010101010101010101C2 +:10FE300001010101010101010101010101010101B2 +:10FE400001010101010101010101010101010101A2 +:10FE50000101010101010101010101010101010192 +:10FE60000101010101010101010101010101010182 +:10FE70000101010101010101010101010101010172 +:10FE80000101010101010101010101010101010162 +:10FE90000101010101010101010101010101010152 +:10FEA0000101010101010101010101010101010142 +:10FEB0000101010101010101010101010101010132 +:10FEC0000101010101010101010101010101010122 +:10FED0000101010101010101010101010101010112 +:10FEE0000101010101010101010101010101010102 +:10FEF00001010101010101010101010101010101F2 +:10FF000001010101010101000000000000000000EA +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000000000000000000000000D1 +:10FF300000000000000000000000000000000000C1 +:10FF400000000000000000000000000000000000B1 +:10FF500000000000000000000000000000000000A1 +:10FF60000000000000000000000000000000000091 +:10FF70000000000000000000000000000000000081 +:10FF80000000000000000000000000000000000071 +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 +:10FFB0000000000000000000000000000000000041 +:10FFC0000000000000000000000000000000000031 +:10FFD0000000000000000000000000000000000021 +:10FFE0000000000000000000000000000000000011 +:10FFF0000000000000000000000000000000000001 +:020000023000CC +:1000000000000000000000000000000000000000F0 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:1001000000000000000000000000000000000000EF +:1001100000000000000000000000000000000000DF +:1001200000000000000000000000000000000000CF +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:1002200000000000000000000000000000000000CE +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E000000000000000000000000000000000000D +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:1005300000000000000000000000000000000000BB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000000000000000003B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:1006000000000000000000020202020202020202D8 +:1006100002020202020202020202020202020202BA +:1006200002020202020202020202020202020202AA +:10063000020202020202020202020202020202029A +:10064000020202020202020202020202020202028A +:10065000020202020202020202020202020202027A +:10066000020202020202020202020202020202026A +:10067000020202020202020202020202020202025A +:10068000020202020202020202020202020202024A +:10069000020202020202020202020202020202023A +:1006A000020202020202020202020202020202022A +:1006B000020202020202020202020202020202021A +:1006C000020202020202020202020202020202020A +:1006D00002020202020202020202020202020202FA +:1006E00002020202020202020202020202020202EA +:1006F00002020202020202020202020202020202DA +:1007000002020202020202020202020202020202C9 +:1007100002020202020202020202020202020202B9 +:1007200002020202020202020202020202020202A9 +:100730000202020202020202020202020202020299 +:100740000202020202020202020202020202020289 +:100750000202020202020202020202020202020279 +:100760000202020202020202020202020202020269 +:100770000202020202020202020202020202020259 +:100780000202020202020202020202020202020249 +:100790000202020202020202020202020202020239 +:1007A0000202020202020202020202020202020229 +:1007B0000202020202020202020202020202020219 +:1007C0000202020202020202020202020202020209 +:1007D00002020202020202020202020202020202F9 +:1007E00002020202020202020202020202020202E9 +:1007F00002020202020202020202020202020202D9 +:1008000002020202020202020202020202020202C8 +:1008100002020202020202020202020202020202B8 +:1008200002020202020202020202020202020202A8 +:100830000202020202020202020202020202020298 +:100840000202020202020202020202020202020288 +:100850000202020202020202020202020202020278 +:100860000202020202020202020202020202020268 +:100870000202020202020202020202020202020258 +:100880000202020202020202020202020202020248 +:100890000202020202020202020202020202020238 +:1008A0000202020202020202020202020202020228 +:1008B0000202020202020202020202020202020218 +:1008C0000202020202020202020202020202020208 +:1008D00002020202020202020202020202020202F8 +:1008E00002020202020202020202020202020202E8 +:1008F00002020202020202020202020202020202D8 +:1009000002020202020202020202020202020202C7 +:1009100002020202020202020202020202020202B7 +:1009200002020202020202020202020202020202A7 +:100930000202020202020202020202020202020297 +:100940000202020202020202020202020202020287 +:100950000202020202020202020202020202020277 +:100960000202020202020202020202020202020267 +:100970000202020202020202020202020202020257 +:100980000202020202020202020202020202020247 +:100990000202020202020202020202020202020237 +:1009A0000202020202020202020202020202020227 +:1009B0000202020202020202020202020202020217 +:1009C0000202020202020202020202020202020207 +:1009D00002020202020202020202020202020202F7 +:1009E00002020202020202020202020202020202E7 +:1009F00002020202020202020202020202020202D7 +:100A000002020202020202020202020202020202C6 +:100A100002020202020202020202020202020202B6 +:100A200002020202020202020202020202020202A6 +:100A30000202020202020202020202020202020296 +:100A40000202020202020202020202020202020286 +:100A50000202020202020202020202020202020276 +:100A60000202020202020202020202020202020266 +:100A70000202020202020202020202020202020256 +:100A80000202020202020202020202020202020246 +:100A90000202020202020202020202020202020236 +:100AA0000202020202020202020202020202020226 +:100AB0000202020202020202020202020202020216 +:100AC0000202020202020202020202020202020206 +:100AD00002020202020202020202020202020202F6 +:100AE00002020202020202020202020202020202E6 +:100AF00002020202020202020202020202020202D6 +:100B000002020202020202020202020202020202C5 +:100B100002020202020202020202020202020202B5 +:100B200002020202020202020202020202020202A5 +:100B30000202020202020202020202020202020295 +:100B40000202020202020202020202020202020285 +:100B50000202020202020202020202020202020275 +:100B60000202020202020202020202020202020265 +:100B70000202020202020202020202020202020255 +:100B80000202020202020202020202020202020245 +:100B90000202020202020202020202020202020235 +:100BA0000202020202020202020202020202020225 +:100BB0000202020202020202020202020202020215 +:100BC0000202020202020202020202020202020205 +:100BD00002020202020202020202020202020202F5 +:100BE00002020202020202020202020202020202E5 +:100BF00002020202020202020202020202020202D5 +:100C000002020202020202020202020202020202C4 +:100C100002020202020202020202020202020202B4 +:100C200002020202020202020202020202020202A4 +:100C30000202020202020202020202020202020294 +:100C40000202020202020202020202020202020284 +:100C50000202020202020202020202020202020274 +:100C60000202020202020202020202020202020264 +:100C70000202020202020202020202020202020254 +:100C80000202020202020202020202020202020244 +:100C90000202020202020202020202020202020234 +:100CA0000202020202020202020202020202020224 +:100CB0000202020202020202020202020202020214 +:100CC0000202020202020202020202020202020204 +:100CD00002020202020202020202020202020202F4 +:100CE00002020202020202020202020202020202E4 +:100CF00002020202020202020202020202020202D4 +:100D000002020202020202020202020202020202C3 +:100D100002020202020202020202020202020202B3 +:100D200002020202020202020202020202020202A3 +:100D30000202020202020202020202020202020293 +:100D40000202020202020202020202020202020283 +:100D50000202020202020202020202020202020273 +:100D60000202020202020202020202020202020263 +:100D70000202020202020202020202020202020253 +:100D80000202020202020202020202020202020243 +:100D90000202020202020202020202020202020233 +:100DA0000202020202020202020202020202020223 +:100DB0000202020202020202020202020202020213 +:100DC0000202020202020202020202020202020203 +:100DD00002020202020202020202020202020202F3 +:100DE00002020202020202020202020202020202E3 +:100DF00002020202020202020202020202020202D3 +:100E000002020202020202020202020202020202C2 +:100E100002020202020202020202020202020202B2 +:100E200002020202020202020202020202020202A2 +:100E30000202020202020202020202020202020292 +:100E40000202020202020202020202020202020282 +:100E50000202020202020202020202020202020272 +:100E60000202020202020202020202020202020262 +:100E70000202020202020202020202020202020252 +:100E80000202020202020202020202020202020242 +:100E90000202020202020202020202020202020232 +:100EA0000202020202020202020202020202020222 +:100EB0000202020202020202020202020202020212 +:100EC0000202020202020202020202020202020202 +:100ED00002020202020202020202020202020202F2 +:100EE00002020202020202020202020202020202E2 +:100EF00002020202020202020202020202020202D2 +:100F000002020202020202020202020202020202C1 +:100F100002020202020202020202020202020202B1 +:100F200002020202020202020202020202020202A1 +:100F30000202020202020202020202020202020291 +:100F40000202020202020202020202020202020281 +:100F50000202020202020202020202020202020271 +:100F60000202020202020202020202020202020261 +:100F70000202020202020202020202020202020251 +:100F80000202020202020202020202020202020241 +:100F90000202020202020202020202020202020231 +:100FA0000202020202020202020202020202020221 +:100FB0000202020202020202020202020202020211 +:100FC0000202020202020202020202020202020201 +:100FD00002020202020202020202020202020202F1 +:100FE00002020202020202020202020202020202E1 +:100FF00002020202020202020202020202020202D1 +:1010000002020202020202020202020202020202C0 +:1010100002020202020202020202020202020202B0 +:1010200002020202020202020202020202020202A0 +:101030000202020202020202020202020202020290 +:101040000202020202020202020202020202020280 +:101050000202020202020202020202020202020270 +:101060000202020202020202020202020202020260 +:101070000202020202020202020202020202020250 +:101080000202020202020202020202020202020240 +:101090000202020202020202020202020202020230 +:1010A0000202020202020202020202020202020220 +:1010B0000202020202020202020202020202020210 +:1010C0000202020202020202020202020202020200 +:1010D00002020202020202020202020202020202F0 +:1010E00002020202020202020202020202020202E0 +:1010F00002020202020202020202020202020202D0 +:1011000002020202020202020202020202020202BF +:1011100002020202020202020202020202020202AF +:10112000020202020202020202020202020202029F +:10113000020202020202020202020202020202028F +:10114000020202020202020202020202020202027F +:10115000020202020202020202020202020202026F +:10116000020202020202020202020202020202025F +:10117000020202020202020202020202020202024F +:10118000020202020202020202020202020202023F +:10119000020202020202020202020202020202022F +:1011A000020202020202020202020202020202021F +:1011B000020202020202020202020202020202020F +:1011C00002020202020202020202020202020202FF +:1011D00002020202020202020202020202020202EF +:1011E00002020202020202020202020202020202DF +:1011F00002020202020202020202020202020202CF +:1012000002020202020202020202020202020202BE +:1012100002020202020202020202020202020202AE +:10122000020202020202020202020202020202029E +:10123000020202020202020202020202020202028E +:10124000020202020202020202020202020202027E +:10125000020202020202020202020202020202026E +:10126000020202020202020202020202020202025E +:10127000020202020202020202020202020202024E +:10128000020202020202020202020202020202023E +:10129000020202020202020202020202020202022E +:1012A000020202020202020202020202020202021E +:1012B000020202020202020202020202020202020E +:1012C00002020202020202020202020202020202FE +:1012D00002020202020202020202020202020202EE +:1012E00002020202020202020202020202020202DE +:1012F00002020202020202020202020202020202CE +:1013000002020202020202020202020202020202BD +:1013100002020202020202020202020202020202AD +:10132000020202020202020202020202020202029D +:10133000020202020202020202020202020202028D +:10134000020202020202020202020202020202027D +:10135000020202020202020202020202020202026D +:10136000020202020202020202020202020202025D +:10137000020202020202020202020202020202024D +:10138000020202020202020202020202020202023D +:10139000020202020202020202020202020202022D +:1013A000020202020202020202020202020202021D +:1013B000020202020202020202020202020202020D +:1013C00002020202020202020202020202020202FD +:1013D00002020202020202020202020202020202ED +:1013E00002020202020202020202020202020202DD +:1013F00002020202020202020202020202020202CD +:1014000002020202020202020202020202020202BC +:1014100002020202020202020202020202020202AC +:10142000020202020202020202020202020202029C +:10143000020202020202020202020202020202028C +:10144000020202020202020202020202020202027C +:10145000020202020202020202020202020202026C +:10146000020202020202020202020202020202025C +:10147000020202020202020202020202020202024C +:10148000020202020202020202020202020202023C +:10149000020202020202020202020202020202022C +:1014A000020202020202020202020202020202021C +:1014B000020202020202020202020202020202020C +:1014C00002020202020202020202020202020202FC +:1014D00002020202020202020202020202020202EC +:1014E00002020202020202020202020202020202DC +:1014F00002020202020202020202020202020202CC +:1015000002020202020202000000000000000000CD +:1015100000000000000000000000000000000000CB +:1015200000000000000000000000000000000000BB +:1015300000000000000000000000000000000000AB +:10154000000000000000000000000000000000009B +:10155000000000000000000000000000000000008B +:10156000000000000000000000000000000000007B +:10157000000000000000000000000000000000006B +:10158000000000000000000000000000000000005B +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B000000000000000000000000000000000002B +:1015C000000000000000000000000000000000001B +:1015D000000000000000000000000000000000000B +:1015E00000000000000000000000000000000000FB +:1015F00000000000000000000000000000000000EB +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:1016300000000000000000000000000000000000AA +:10164000000000000000000000000000000000009A +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:10167000000000000000000000000000000000006A +:10168000000000000000000000000000000000005A +:10169000000000000000000000000000000000004A +:1016A000000000000000000000000000000000003A +:1016B000000000000000000000000000000000002A +:1016C000000000000000000000000000000000001A +:1016D000000000000000000000000000000000000A +:1016E00000000000000000000000000000000000FA +:1016F00000000000000000000000000000000000EA +:1017000000000000000000000000000000000000D9 +:1017100000000000000000000000000000000000C9 +:1017200000000000000000000000000000000000B9 +:1017300000000000000000000000000000000000A9 +:101740000000000000000000000000000000000099 +:101750000000000000000000000000000000000089 +:101760000000000000000000000000000000000079 +:101770000000000000000000000000000000000069 +:101780000000000000000000000000000000000059 +:101790000000000000000000000000000000000049 +:1017A0000000000000000000000000000000000039 +:1017B0000000000000000000000000000000000029 +:1017C0000000000000000000000000000000000019 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000000000000000000000F9 +:1017F00000000000000000000000000000000000E9 +:1018000000000000000000000000000000000000D8 +:1018100000000000000000000000000000000000C8 +:1018200000000000000000000000000000000000B8 +:1018300000000000000000000000000000000000A8 +:101840000000000000000000000000000000000098 +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880000000000000000000000000000000000058 +:101890000000000000000000000000000000000048 +:1018A0000000000000000000000000000000000038 +:1018B0000000000000000000000000000000000028 +:1018C0000000000000000000000000000000000018 +:1018D0000000000000000000000000000000000008 +:1018E00000000000000000000000000000000000F8 +:1018F00000000000000000000000000000000000E8 +:1019000000000000000000000000000000000000D7 +:1019100000000000000000000000000000000000C7 +:1019200000000000000000000000000000000000B7 +:1019300000000000000000000000000000000000A7 +:101940000000000000000000000000000000000097 +:101950000000000000000000000000000000000087 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:101980000000000000000000000000000000000057 +:101990000000000000000000000000000000000047 +:1019A0000000000000000000000000000000000037 +:1019B0000000000000000000000000000000000027 +:1019C0000000000000000000000000000000000017 +:1019D0000000000000000000000000000000000007 +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000000000000000000000E7 +:101A000000000000000000000000000000000000D6 +:101A100000000000000000000000000000000000C6 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A40000000000000000000000000000000000096 +:101A50000000000000000000000000000000000086 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000000000000000000000000000056 +:101A90000000000000000000000000000000000046 +:101AA0000000000000000000000000000000000036 +:101AB0000000000000000000000000000000000026 +:101AC0000000000000000000000000000000000016 +:101AD0000000000000000000000000000000000006 +:101AE00000000000000000000000000000000000F6 +:101AF00000000000000000000000000000000000E6 +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000000000000000000C5 +:101B200000000000000000000000000000000000B5 +:101B300000000000000000000000000000000000A5 +:101B40000000000000000000000000000000000095 +:101B50000000000000000000000000000000000085 +:101B60000000000000000000000000000000000075 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 +:101BA0000000000000000000000000000000000035 +:101BB0000000000000000000000000000000000025 +:101BC0000000000000000000000000000000000015 +:101BD0000000000000000000000000000000000005 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000000000000000000E5 +:101C0000000000000000005900000000000000017A +:101C100001010101010101010101010101010101B4 +:101C200001010101010101010101010101010101A4 +:101C30000101010101010101010101010101010194 +:101C40000101010101010101010101010101010184 +:101C50000101010101010101010101010101010174 +:101C60000101010101010101010101010101010164 +:101C70000101010101010101010101010101010154 +:101C80000101010101010101010101010101010144 +:101C90000101010101010101010101010101010134 +:101CA0000101010101010101010101010101010124 +:101CB0000101010101010101010101010101010114 +:101CC0000101010101010101010101010101010104 +:101CD00001010101010101010101010101010101F4 +:101CE00001010101010101010101010101010101E4 +:101CF00001010101010101010101010101010101D4 +:101D000001010101010101010101010101010101C3 +:101D100001010101010101010101010101010101B3 +:101D200001010101010101010101010101010101A3 +:101D30000101010101010101010101010101010193 +:101D40000101010101010101010101010101010183 +:101D50000101010101010101010101010101010173 +:101D60000101010101010101010101010101010163 +:101D70000101010101010101010101010101010153 +:101D80000101010101010101010101010101010143 +:101D90000101010101010101010101010101010133 +:101DA0000101010101010101010101010101010123 +:101DB0000101010101010101010101010101010113 +:101DC0000101010101010101010101010101010103 +:101DD00001010101010101010101010101010101F3 +:101DE00001010101010101010101010101010101E3 +:101DF00001010101010101010101010101010101D3 +:101E000001010101010101010101010101010101C2 +:101E100001010101010101010101010101010101B2 +:101E200001010101010101010101010101010101A2 +:101E30000101010101010101010101010101010192 +:101E40000101010101010101010101010101010182 +:101E50000101010101010101010101010101010172 +:101E60000101010101010101010101010101010162 +:101E70000101010101010101010101010101010152 +:101E80000101010101010101010101010101010142 +:101E90000101010101010101010101010101010132 +:101EA0000101010101010101010101010101010122 +:101EB0000101010101010101010101010101010112 +:101EC0000101010101010101010101010101010102 +:101ED00001010101010101010101010101010101F2 +:101EE00001010101010101010101010101010101E2 +:101EF00001010101010101010101010101010101D2 +:101F000001010101010101010101010101010101C1 +:101F100001010101010101010101010101010101B1 +:101F200001010101010101010101010101010101A1 +:101F30000101010101010101010101010101010191 +:101F40000101010101010101010101010101010181 +:101F50000101010101010101010101010101010171 +:101F60000101010101010101010101010101010161 +:101F70000101010101010101010101010101010151 +:101F80000101010101010101010101010101010141 +:101F90000101010101010101010101010101010131 +:101FA0000101010101010101010101010101010121 +:101FB0000101010101010101010101010101010111 +:101FC0000101010101010101010101010101010101 +:101FD00001010101010101010101010101010101F1 +:101FE00001010101010101010101010101010101E1 +:101FF00001010101010101010101010101010101D1 +:1020000001010101010101010101010101010101C0 +:1020100001010101010101010101010101010101B0 +:1020200001010101010101010101010101010101A0 +:102030000101010101010101010101010101010190 +:102040000101010101010101010101010101010180 +:102050000101010101010101010101010101010170 +:102060000101010101010101010101010101010160 +:102070000101010101010101010101010101010150 +:102080000101010101010101010101010101010140 +:102090000101010101010101010101010101010130 +:1020A0000101010101010101010101010101010120 +:1020B0000101010101010101010101010101010110 +:1020C0000101010101010101010101010101010100 +:1020D00001010101010101010101010101010101F0 +:1020E00001010101010101010101010101010101E0 +:1020F00001010101010101010101010101010101D0 +:1021000001010101010101010101010101010101BF +:1021100001010101010101010101010101010101AF +:10212000010101010101010101010101010101019F +:10213000010101010101010101010101010101018F +:10214000010101010101010101010101010101017F +:10215000010101010101010101010101010101016F +:10216000010101010101010101010101010101015F +:10217000010101010101010101010101010101014F +:10218000010101010101010101010101010101013F +:10219000010101010101010101010101010101012F +:1021A000010101010101010101010101010101011F +:1021B000010101010101010101010101010101010F +:1021C00001010101010101010101010101010101FF +:1021D00001010101010101010101010101010101EF +:1021E00001010101010101010101010101010101DF +:1021F00001010101010101010101010101010101CF +:1022000001010101010101010101010101010101BE +:1022100001010101010101010101010101010101AE +:10222000010101010101010101010101010101019E +:10223000010101010101010101010101010101018E +:10224000010101010101010101010101010101017E +:10225000010101010101010101010101010101016E +:10226000010101010101010101010101010101015E +:10227000010101010101010101010101010101014E +:10228000010101010101010101010101010101013E +:10229000010101010101010101010101010101012E +:1022A000010101010101010101010101010101011E +:1022B000010101010101010101010101010101010E +:1022C00001010101010101010101010101010101FE +:1022D00001010101010101010101010101010101EE +:1022E00001010101010101010101010101010101DE +:1022F00001010101010101010101010101010101CE +:1023000001010101010101010101010101010101BD +:1023100001010101010101010101010101010101AD +:10232000010101010101010101010101010101019D +:10233000010101010101010101010101010101018D +:10234000010101010101010101010101010101017D +:10235000010101010101010101010101010101016D +:10236000010101010101010101010101010101015D +:10237000010101010101010101010101010101014D +:10238000010101010101010101010101010101013D +:10239000010101010101010101010101010101012D +:1023A000010101010101010101010101010101011D +:1023B000010101010101010101010101010101010D +:1023C00001010101010101010101010101010101FD +:1023D00001010101010101010101010101010101ED +:1023E00001010101010101010101010101010101DD +:1023F00001010101010101010101010101010101CD +:1024000001010101010101010101010101010101BC +:1024100001010101010101010101010101010101AC +:10242000010101010101010101010101010101019C +:10243000010101010101010101010101010101018C +:10244000010101010101010101010101010101017C +:10245000010101010101010101010101010101016C +:10246000010101010101010101010101010101015C +:10247000010101010101010101010101010101014C +:10248000010101010101010101010101010101013C +:10249000010101010101010101010101010101012C +:1024A000010101010101010101010101010101011C +:1024B000010101010101010101010101010101010C +:1024C00001010101010101010101010101010101FC +:1024D00001010101010101010101010101010101EC +:1024E00001010101010101010101010101010101DC +:1024F00001010101010101010101010101010101CC +:1025000001010101010101010101010101010101BB +:1025100001010101010101010101010101010101AB +:10252000010101010101010101010101010101019B +:10253000010101010101010101010101010101018B +:10254000010101010101010101010101010101017B +:10255000010101010101010101010101010101016B +:10256000010101010101010101010101010101015B +:10257000010101010101010101010101010101014B +:10258000010101010101010101010101010101013B +:10259000010101010101010101010101010101012B +:1025A000010101010101010101010101010101011B +:1025B000010101010101010101010101010101010B +:1025C00001010101010101010101010101010101FB +:1025D00001010101010101010101010101010101EB +:1025E00001010101010101010101010101010101DB +:1025F00001010101010101010101010101010101CB +:1026000001010101010101010101010101010101BA +:1026100001010101010101010101010101010101AA +:10262000010101010101010101010101010101019A +:10263000010101010101010101010101010101018A +:10264000010101010101010101010101010101017A +:10265000010101010101010101010101010101016A +:10266000010101010101010101010101010101015A +:10267000010101010101010101010101010101014A +:10268000010101010101010101010101010101013A +:10269000010101010101010101010101010101012A +:1026A000010101010101010101010101010101011A +:1026B000010101010101010101010101010101010A +:1026C00001010101010101010101010101010101FA +:1026D00001010101010101010101010101010101EA +:1026E00001010101010101010101010101010101DA +:1026F00001010101010101010101010101010101CA +:1027000001010101010101010101010101010101B9 +:1027100001010101010101010101010101010101A9 +:102720000101010101010101010101010101010199 +:102730000101010101010101010101010101010189 +:102740000101010101010101010101010101010179 +:102750000101010101010101010101010101010169 +:102760000101010101010101010101010101010159 +:102770000101010101010101010101010101010149 +:102780000101010101010101010101010101010139 +:102790000101010101010101010101010101010129 +:1027A0000101010101010101010101010101010119 +:1027B0000101010101010101010101010101010109 +:1027C00001010101010101010101010101010101F9 +:1027D00001010101010101010101010101010101E9 +:1027E00001010101010101010101010101010101D9 +:1027F00001010101010101010101010101010101C9 +:1028000001010101010101010101010101010101B8 +:1028100001010101010101010101010101010101A8 +:102820000101010101010101010101010101010198 +:102830000101010101010101010101010101010188 +:102840000101010101010101010101010101010178 +:102850000101010101010101010101010101010168 +:102860000101010101010101010101010101010158 +:102870000101010101010101010101010101010148 +:102880000101010101010101010101010101010138 +:102890000101010101010101010101010101010128 +:1028A0000101010101010101010101010101010118 +:1028B0000101010101010101010101010101010108 +:1028C00001010101010101010101010101010101F8 +:1028D00001010101010101010101010101010101E8 +:1028E00001010101010101010101010101010101D8 +:1028F00001010101010101010101010101010101C8 +:1029000001010101010101010101010101010101B7 +:1029100001010101010101010101010101010101A7 +:102920000101010101010101010101010101010197 +:102930000101010101010101010101010101010187 +:102940000101010101010101010101010101010177 +:102950000101010101010101010101010101010167 +:102960000101010101010101010101010101010157 +:102970000101010101010101010101010101010147 +:102980000101010101010101010101010101010137 +:102990000101010101010101010101010101010127 +:1029A0000101010101010101010101010101010117 +:1029B0000101010101010101010101010101010107 +:1029C00001010101010101010101010101010101F7 +:1029D00001010101010101010101010101010101E7 +:1029E00001010101010101010101010101010101D7 +:1029F00001010101010101010101010101010101C7 +:102A000001010101010101010101010101010101B6 +:102A100001010101010101010101010101010101A6 +:102A20000101010101010101010101010101010196 +:102A30000101010101010101010101010101010186 +:102A40000101010101010101010101010101010176 +:102A50000101010101010101010101010101010166 +:102A60000101010101010101010101010101010156 +:102A70000101010101010101010101010101010146 +:102A80000101010101010101010101010101010136 +:102A90000101010101010101010101010101010126 +:102AA0000101010101010101010101010101010116 +:102AB0000101010101010101010101010101010106 +:102AC00001010101010101010101010101010101F6 +:102AD00001010101010101010101010101010101E6 +:102AE00001010101010101010101010101010101D6 +:102AF00001010101010101010101010101010101C6 +:102B000001010101010101010101010101010100B6 +:102B100000000000000000000000000000000000B5 +:102B200000000000000000000000000000000000A5 +:102B30000000000000000000000000000000000095 +:102B40000000000000000000000000000000000085 +:102B50000000000000000000000000000000000075 +:102B60000000000000000000000000000000000065 +:102B70000000000000000000000000000000000055 +:102B80000000000000000000000000000000000045 +:102B90000000000000000000000000000000000035 +:102BA0000000000000000000000000000000000025 +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 +:102BD00000000000000000000000000000000000F5 +:102BE00000000000000000000000000000000000E5 +:102BF00000000000000000000000000000000000D5 +:102C000000000000000000000000000000000000C4 +:102C100000000000000000000000000000000000B4 +:102C200000000000000000000000000000000000A4 +:102C30000000000000000000000000000000000094 +:102C40000000000000000000000000000000000084 +:102C50000000000000000000000000000000000074 +:102C60000000000000000000000000000000000064 +:102C70000000000000000000000000000000000054 +:102C80000000000000000000000000000000000044 +:102C90000000000000000000000000000000000034 +:102CA0000000000000000000000000000000000024 +:102CB0000000000000000000000000000000000014 +:102CC0000000000000000000000000000000000004 +:102CD00000000000000000000000000000000000F4 +:102CE00000000000000000000000000000000000E4 +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D200000000000000000000000000000000000A3 +:102D30000000000000000000000000000000000093 +:102D40000000000000000000000000000000000083 +:102D50000000000000000000000000000000000073 +:102D60000000000000000000000000000000000063 +:102D70000000000000000000000000000000000053 +:102D80000000000000000000000000000000000043 +:102D90000000000000000000000000000000000033 +:102DA0000000000000000000000000000000000023 +:102DB0000000000000000000000000000000000013 +:102DC0000000000000000000000000000000000003 +:102DD00000000000000000000000000000000000F3 +:102DE00000000000000000000000000000000000E3 +:102DF00000000000000000000000000000000000D3 +:102E000000000000000000000000000000000000C2 +:102E100000000000000000000000000000000000B2 +:102E200000000000000000000000000000000000A2 +:102E30000000000000000000000000000000000092 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000000000000000000000000052 +:102E80000000000000000000000000000000000042 +:102E90000000000000000000000000000000000032 +:102EA0000000000000000000000000000000000022 +:102EB0000000000000000000000000000000000012 +:102EC0000000000000000000000000000000000002 +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000000000E2 +:102EF00000000000000000000000000000000000D2 +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000000000000000000091 +:102F40000000000000000000000000000000000081 +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F70000000000000000000000000000000000051 +:102F80000000000000000000000000000000000041 +:102F90000000000000000000000000000000000031 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000000000000000001 +:102FD00000000000000000000000000000000000F1 +:102FE00000000000000000000000000000000000E1 +:102FF00000000000000000000000000000000000D1 +:1030000000000000000000000000000000000000C0 +:1030100000000000000000000000000000000000B0 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000000000000000000090 +:103040000000000000000000000000000000000080 +:103050000000000000000000000000000000000070 +:103060000000000000000000000000000000000060 +:103070000000000000000000000000000000000050 +:103080000000000000000000000000000000000040 +:103090000000000000000000000000000000000030 +:1030A0000000000000000000000000000000000020 +:1030B0000000000000000000000000000000000010 +:1030C0000000000000000000000000000000000000 +:1030D00000000000000000000000000000000000F0 +:1030E00000000000000000000000000000000000E0 +:1030F00000000000000000000000000000000000D0 +:1031000000000000000000000000000000000000BF +:1031100000000000000000000000000000000000AF +:10312000000000000000000000000000000000009F +:10313000000000000000000000000000000000008F +:10314000000000000000000000000000000000007F +:10315000000000000000000000000000000000006F +:10316000000000000000000000000000000000005F +:10317000000000000000000000000000000000004F +:10318000000000000000000000000000000000003F +:10319000000000000000000000000000000000002F +:1031A000000000000000000000000000000000001F +:1031B000000000000000000000000000000000000F +:1031C00000000000000000000000000000000000FF +:1031D00000000000000000000000000000000000EF +:1031E00000000000000000000000000000000000DF +:1031F00000000000000000000000000000000000CF +:1032000000000000000000000000000000000002BC +:10321000020202020202020202020202020202028E +:10322000020202020202020202020202020202027E +:10323000020202020202020202020202020202026E +:10324000020202020202020202020202020202025E +:10325000020202020202020202020202020202024E +:10326000020202020202020202020202020202023E +:10327000020202020202020202020202020202022E +:10328000020202020202020202020202020202021E +:10329000020202020202020202020202020202020E +:1032A00002020202020202020202020202020202FE +:1032B00002020202020202020202020202020202EE +:1032C00002020202020202020202020202020202DE +:1032D00002020202020202020202020202020202CE +:1032E00002020202020202020202020202020202BE +:1032F00002020202020202020202020202020202AE +:10330000020202020202020202020202020202029D +:10331000020202020202020202020202020202028D +:10332000020202020202020202020202020202027D +:10333000020202020202020202020202020202026D +:10334000020202020202020202020202020202025D +:10335000020202020202020202020202020202024D +:10336000020202020202020202020202020202023D +:10337000020202020202020202020202020202022D +:10338000020202020202020202020202020202021D +:10339000020202020202020202020202020202020D +:1033A00002020202020202020202020202020202FD +:1033B00002020202020202020202020202020202ED +:1033C00002020202020202020202020202020202DD +:1033D00002020202020202020202020202020202CD +:1033E00002020202020202020202020202020202BD +:1033F00002020202020202020202020202020202AD +:10340000020202020202020202020202020202029C +:10341000020202020202020202020202020202028C +:10342000020202020202020202020202020202027C +:10343000020202020202020202020202020202026C +:10344000020202020202020202020202020202025C +:10345000020202020202020202020202020202024C +:10346000020202020202020202020202020202023C +:10347000020202020202020202020202020202022C +:10348000020202020202020202020202020202021C +:10349000020202020202020202020202020202020C +:1034A00002020202020202020202020202020202FC +:1034B00002020202020202020202020202020202EC +:1034C00002020202020202020202020202020202DC +:1034D00002020202020202020202020202020202CC +:1034E00002020202020202020202020202020202BC +:1034F00002020202020202020202020202020202AC +:10350000020202020202020202020202020202029B +:10351000020202020202020202020202020202028B +:10352000020202020202020202020202020202027B +:10353000020202020202020202020202020202026B +:10354000020202020202020202020202020202025B +:10355000020202020202020202020202020202024B +:10356000020202020202020202020202020202023B +:10357000020202020202020202020202020202022B +:10358000020202020202020202020202020202021B +:10359000020202020202020202020202020202020B +:1035A00002020202020202020202020202020202FB +:1035B00002020202020202020202020202020202EB +:1035C00002020202020202020202020202020202DB +:1035D00002020202020202020202020202020202CB +:1035E00002020202020202020202020202020202BB +:1035F00002020202020202020202020202020202AB +:10360000020202020202020202020202020202029A +:10361000020202020202020202020202020202028A +:10362000020202020202020202020202020202027A +:10363000020202020202020202020202020202026A +:10364000020202020202020202020202020202025A +:10365000020202020202020202020202020202024A +:10366000020202020202020202020202020202023A +:10367000020202020202020202020202020202022A +:10368000020202020202020202020202020202021A +:10369000020202020202020202020202020202020A +:1036A00002020202020202020202020202020202FA +:1036B00002020202020202020202020202020202EA +:1036C00002020202020202020202020202020202DA +:1036D00002020202020202020202020202020202CA +:1036E00002020202020202020202020202020202BA +:1036F00002020202020202020202020202020202AA +:103700000202020202020202020202020202020299 +:103710000202020202020202020202020202020289 +:103720000202020202020202020202020202020279 +:103730000202020202020202020202020202020269 +:103740000202020202020202020202020202020259 +:103750000202020202020202020202020202020249 +:103760000202020202020202020202020202020239 +:103770000202020202020202020202020202020229 +:103780000202020202020202020202020202020219 +:103790000202020202020202020202020202020209 +:1037A00002020202020202020202020202020202F9 +:1037B00002020202020202020202020202020202E9 +:1037C00002020202020202020202020202020202D9 +:1037D00002020202020202020202020202020202C9 +:1037E00002020202020202020202020202020202B9 +:1037F00002020202020202020202020202020202A9 +:103800000202020202020202020202020202020298 +:103810000202020202020202020202020202020288 +:103820000202020202020202020202020202020278 +:103830000202020202020202020202020202020268 +:103840000202020202020202020202020202020258 +:103850000202020202020202020202020202020248 +:103860000202020202020202020202020202020238 +:103870000202020202020202020202020202020228 +:103880000202020202020202020202020202020218 +:103890000202020202020202020202020202020208 +:1038A00002020202020202020202020202020202F8 +:1038B00002020202020202020202020202020202E8 +:1038C00002020202020202020202020202020202D8 +:1038D00002020202020202020202020202020202C8 +:1038E00002020202020202020202020202020202B8 +:1038F00002020202020202020202020202020202A8 +:103900000202020202020202020202020202020297 +:103910000202020202020202020202020202020287 +:103920000202020202020202020202020202020277 +:103930000202020202020202020202020202020267 +:103940000202020202020202020202020202020257 +:103950000202020202020202020202020202020247 +:103960000202020202020202020202020202020237 +:103970000202020202020202020202020202020227 +:103980000202020202020202020202020202020217 +:103990000202020202020202020202020202020207 +:1039A00002020202020202020202020202020202F7 +:1039B00002020202020202020202020202020202E7 +:1039C00002020202020202020202020202020202D7 +:1039D00002020202020202020202020202020202C7 +:1039E00002020202020202020202020202020202B7 +:1039F00002020202020202020202020202020202A7 +:103A00000202020202020202020202020202020296 +:103A10000202020202020202020202020202020286 +:103A20000202020202020202020202020202020276 +:103A30000202020202020202020202020202020266 +:103A40000202020202020202020202020202020256 +:103A50000202020202020202020202020202020246 +:103A60000202020202020202020202020202020236 +:103A70000202020202020202020202020202020226 +:103A80000202020202020202020202020202020216 +:103A90000202020202020202020202020202020206 +:103AA00002020202020202020202020202020202F6 +:103AB00002020202020202020202020202020202E6 +:103AC00002020202020202020202020202020202D6 +:103AD00002020202020202020202020202020202C6 +:103AE00002020202020202020202020202020202B6 +:103AF00002020202020202020202020202020202A6 +:103B00000202020202020202020202020202020295 +:103B10000202020202020202020202020202020285 +:103B20000202020202020202020202020202020275 +:103B30000202020202020202020202020202020265 +:103B40000202020202020202020202020202020255 +:103B50000202020202020202020202020202020245 +:103B60000202020202020202020202020202020235 +:103B70000202020202020202020202020202020225 +:103B80000202020202020202020202020202020215 +:103B90000202020202020202020202020202020205 +:103BA00002020202020202020202020202020202F5 +:103BB00002020202020202020202020202020202E5 +:103BC00002020202020202020202020202020202D5 +:103BD00002020202020202020202020202020202C5 +:103BE00002020202020202020202020202020202B5 +:103BF00002020202020202020202020202020202A5 +:103C00000202020202020202020202020202020294 +:103C10000202020202020202020202020202020284 +:103C20000202020202020202020202020202020274 +:103C30000202020202020202020202020202020264 +:103C40000202020202020202020202020202020254 +:103C50000202020202020202020202020202020244 +:103C60000202020202020202020202020202020234 +:103C70000202020202020202020202020202020224 +:103C80000202020202020202020202020202020214 +:103C90000202020202020202020202020202020204 +:103CA00002020202020202020202020202020202F4 +:103CB00002020202020202020202020202020202E4 +:103CC00002020202020202020202020202020202D4 +:103CD00002020202020202020202020202020202C4 +:103CE00002020202020202020202020202020202B4 +:103CF00002020202020202020202020202020202A4 +:103D00000202020202020202020202020202020293 +:103D10000202020202020202020202020202020283 +:103D20000202020202020202020202020202020273 +:103D30000202020202020202020202020202020263 +:103D40000202020202020202020202020202020253 +:103D50000202020202020202020202020202020243 +:103D60000202020202020202020202020202020233 +:103D70000202020202020202020202020202020223 +:103D80000202020202020202020202020202020213 +:103D90000202020202020202020202020202020203 +:103DA00002020202020202020202020202020202F3 +:103DB00002020202020202020202020202020202E3 +:103DC00002020202020202020202020202020202D3 +:103DD00002020202020202020202020202020202C3 +:103DE00002020202020202020202020202020202B3 +:103DF00002020202020202020202020202020202A3 +:103E00000202020202020202020202020202020292 +:103E10000202020202020202020202020202020282 +:103E20000202020202020202020202020202020272 +:103E30000202020202020202020202020202020262 +:103E40000202020202020202020202020202020252 +:103E50000202020202020202020202020202020242 +:103E60000202020202020202020202020202020232 +:103E70000202020202020202020202020202020222 +:103E80000202020202020202020202020202020212 +:103E90000202020202020202020202020202020202 +:103EA00002020202020202020202020202020202F2 +:103EB00002020202020202020202020202020202E2 +:103EC00002020202020202020202020202020202D2 +:103ED00002020202020202020202020202020202C2 +:103EE00002020202020202020202020202020202B2 +:103EF00002020202020202020202020202020202A2 +:103F00000202020202020202020202020202020291 +:103F10000202020202020202020202020202020281 +:103F20000202020202020202020202020202020271 +:103F30000202020202020202020202020202020261 +:103F40000202020202020202020202020202020251 +:103F50000202020202020202020202020202020241 +:103F60000202020202020202020202020202020231 +:103F70000202020202020202020202020202020221 +:103F80000202020202020202020202020202020211 +:103F90000202020202020202020202020202020201 +:103FA00002020202020202020202020202020202F1 +:103FB00002020202020202020202020202020202E1 +:103FC00002020202020202020202020202020202D1 +:103FD00002020202020202020202020202020202C1 +:103FE00002020202020202020202020202020202B1 +:103FF00002020202020202020202020202020202A1 +:104000000202020202020202020202020202020290 +:104010000202020202020202020202020202020280 +:104020000202020202020202020202020202020270 +:104030000202020202020202020202020202020260 +:104040000202020202020202020202020202020250 +:104050000202020202020202020202020202020240 +:104060000202020202020202020202020202020230 +:104070000202020202020202020202020202020220 +:104080000202020202020202020202020202020210 +:104090000202020202020202020202020202020200 +:1040A00002020202020202020202020202020202F0 +:1040B00002020202020202020202020202020202E0 +:1040C00002020202020202020202020202020202D0 +:1040D00002020202020202020202020202020202C0 +:1040E00002020202020202020202020202020202B0 +:1040F00002020202020202020202020202020202A0 +:104100000202020202020202020202020202020091 +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:10414000000000000000000000000000000000006F +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F +:10417000000000000000000000000000000000003F +:10418000000000000000000000000000000000002F +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000000000AE +:10421000000000000000000000000000000000009E +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000007E +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000000000005E +:10426000000000000000000000000000000000004E +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000000002E +:10429000000000000000000000000000000000001E +:1042A000000000000000000000000000000000000E +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D00000000000000000000000000000000000DE +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000000000000BE +:1043000000000000000000000000000000000000AD +:10431000000000000000000000000000000000009D +:10432000000000000000000000000000000000008D +:10433000000000000000000000000000000000007D +:10434000000000000000000000000000000000006D +:10435000000000000000000000000000000000005D +:10436000000000000000000000000000000000004D +:10437000000000000000000000000000000000003D +:10438000000000000000000000000000000000002D +:10439000000000000000000000000000000000001D +:1043A000000000000000000000000000000000000D +:1043B00000000000000000000000000000000000FD +:1043C00000000000000000000000000000000000ED +:1043D00000000000000000000000000000000000DD +:1043E00000000000000000000000000000000000CD +:1043F00000000000000000000000000000000000BD +:1044000000000000000000000000000000000000AC +:10441000000000000000000000000000000000009C +:10442000000000000000000000000000000000008C +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C +:10445000000000000000000000000000000000005C +:10446000000000000000000000000000000000004C +:10447000000000000000000000000000000000003C +:10448000000000000000000000000000000000002C +:10449000000000000000000000000000000000001C +:1044A000000000000000000000000000000000000C +:1044B00000000000000000000000000000000000FC +:1044C00000000000000000000000000000000000EC +:1044D00000000000000000000000000000000000DC +:1044E00000000000000000000000000000000000CC +:1044F00000000000000000000000000000000000BC +:1045000000000000000000000000000000000000AB +:10451000000000000000000000000000000000009B +:10452000000000000000000000000000000000008B +:10453000000000000000000000000000000000007B +:10454000000000000000000000000000000000006B +:10455000000000000000000000000000000000005B +:10456000000000000000000000000000000000004B +:10457000000000000000000000000000000000003B +:10458000000000000000000000000000000000002B +:10459000000000000000000000000000000000001B +:1045A000000000000000000000000000000000000B +:1045B00000000000000000000000000000000000FB +:1045C00000000000000000000000000000000000EB +:1045D00000000000000000000000000000000000DB +:1045E00000000000000000000000000000000000CB +:1045F00000000000000000000000000000000000BB +:1046000000000000000000000000000000000000AA +:10461000000000000000000000000000000000009A +:10462000000000000000000000000000000000008A +:10463000000000000000000000000000000000007A +:10464000000000000000000000000000000000006A +:10465000000000000000000000000000000000005A +:10466000000000000000000000000000000000004A +:10467000000000000000000000000000000000003A +:10468000000000000000000000000000000000002A +:10469000000000000000000000000000000000001A +:1046A000000000000000000000000000000000000A +:1046B00000000000000000000000000000000000FA +:1046C00000000000000000000000000000000000EA +:1046D00000000000000000000000000000000000DA +:1046E00000000000000000000000000000000000CA +:1046F00000000000000000000000000000000000BA +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000000000000099 +:104720000000000000000000000000000000000089 +:104730000000000000000000000000000000000079 +:104740000000000000000000000000000000000069 +:104750000000000000000000000000000000000059 +:104760000000000000000000000000000000000049 +:104770000000000000000000000000000000000039 +:104780000000000000000000000000000000000029 +:104790000000000000000000000000000000000019 +:1047A0000000000000000000000000000000000009 +:1047B00000000000000000000000000000000000F9 +:1047C00000000000000000000000000000000000E9 +:1047D00000000000000000000000000000000000D9 +:1047E00000000000000000000000000000000000C9 +:1047F00000000000000000000000000000000000B9 +:1048000000000000000000000000000000000000A8 +:104810000000000000000000000000000000000098 +:104820000000000000000000000000000000000088 +:104830000000000000000000000000000000000078 +:104840000000000000000000000000000000000068 +:104850000000000000000000000000000000000058 +:104860000000000000000000000000000000000048 +:104870000000000000000000000000000000000038 +:104880000000000000000000000000000000000028 +:104890000000000000000000000000000000000018 +:1048A0000000000000000000000000000000000008 +:1048B00000000000000000000000000000000000F8 +:1048C00000000000000000000000000000000000E8 +:1048D00000000000000000000000000000000000D8 +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000000000000000000B8 +:1049000000000000000000000000000000000000A7 +:104910000000000000000000000000000000000097 +:104920000000000000000000000000000000000087 +:104930000000000000000000000000000000000077 +:104940000000000000000000000000000000000067 +:104950000000000000000000000000000000000057 +:104960000000000000000000000000000000000047 +:104970000000000000000000000000000000000037 +:104980000000000000000000000000000000000027 +:104990000000000000000000000000000000000017 +:1049A0000000000000000000000000000000000007 +:1049B00000000000000000000000000000000000F7 +:1049C00000000000000000000000000000000000E7 +:1049D00000000000000000000000000000000000D7 +:1049E00000000000000000000000000000000000C7 +:1049F00000000000000000000000000000000000B7 +:104A000000000000000000000000000000000001A5 +:104A10000101010101010101010101010101010186 +:104A20000101010101010101010101010101010176 +:104A30000101010101010101010101010101010166 +:104A40000101010101010101010101010101010156 +:104A50000101010101010101010101010101010146 +:104A60000101010101010101010101010101010136 +:104A70000101010101010101010101010101010126 +:104A80000101010101010101010101010101010116 +:104A90000101010101010101010101010101010106 +:104AA00001010101010101010101010101010101F6 +:104AB00001010101010101010101010101010101E6 +:104AC00001010101010101010101010101010101D6 +:104AD00001010101010101010101010101010101C6 +:104AE00001010101010101010101010101010101B6 +:104AF00001010101010101010101010101010101A6 +:104B00000101010101010101010101010101010195 +:104B10000101010101010101010101010101010185 +:104B20000101010101010101010101010101010175 +:104B30000101010101010101010101010101010165 +:104B40000101010101010101010101010101010155 +:104B50000101010101010101010101010101010145 +:104B60000101010101010101010101010101010135 +:104B70000101010101010101010101010101010125 +:104B80000101010101010101010101010101010115 +:104B90000101010101010101010101010101010105 +:104BA00001010101010101010101010101010101F5 +:104BB00001010101010101010101010101010101E5 +:104BC00001010101010101010101010101010101D5 +:104BD00001010101010101010101010101010101C5 +:104BE00001010101010101010101010101010101B5 +:104BF00001010101010101010101010101010101A5 +:104C00000101010101010101010101010101010194 +:104C10000101010101010101010101010101010184 +:104C20000101010101010101010101010101010174 +:104C30000101010101010101010101010101010164 +:104C40000101010101010101010101010101010154 +:104C50000101010101010101010101010101010144 +:104C60000101010101010101010101010101010134 +:104C70000101010101010101010101010101010124 +:104C80000101010101010101010101010101010114 +:104C90000101010101010101010101010101010104 +:104CA00001010101010101010101010101010101F4 +:104CB00001010101010101010101010101010101E4 +:104CC00001010101010101010101010101010101D4 +:104CD00001010101010101010101010101010101C4 +:104CE00001010101010101010101010101010101B4 +:104CF00001010101010101010101010101010101A4 +:104D00000101010101010101010101010101010193 +:104D10000101010101010101010101010101010183 +:104D20000101010101010101010101010101010173 +:104D30000101010101010101010101010101010163 +:104D40000101010101010101010101010101010153 +:104D50000101010101010101010101010101010143 +:104D60000101010101010101010101010101010133 +:104D70000101010101010101010101010101010123 +:104D80000101010101010101010101010101010113 +:104D90000101010101010101010101010101010103 +:104DA00001010101010101010101010101010101F3 +:104DB00001010101010101010101010101010101E3 +:104DC00001010101010101010101010101010101D3 +:104DD00001010101010101010101010101010101C3 +:104DE00001010101010101010101010101010101B3 +:104DF00001010101010101010101010101010101A3 +:104E00000101010101010101010101010101010192 +:104E10000101010101010101010101010101010182 +:104E20000101010101010101010101010101010172 +:104E30000101010101010101010101010101010162 +:104E40000101010101010101010101010101010152 +:104E50000101010101010101010101010101010142 +:104E60000101010101010101010101010101010132 +:104E70000101010101010101010101010101010122 +:104E80000101010101010101010101010101010112 +:104E90000101010101010101010101010101010102 +:104EA00001010101010101010101010101010101F2 +:104EB00001010101010101010101010101010101E2 +:104EC00001010101010101010101010101010101D2 +:104ED00001010101010101010101010101010101C2 +:104EE00001010101010101010101010101010101B2 +:104EF00001010101010101010101010101010101A2 +:104F00000101010101010101010101010101010191 +:104F10000101010101010101010101010101010181 +:104F20000101010101010101010101010101010171 +:104F30000101010101010101010101010101010161 +:104F40000101010101010101010101010101010151 +:104F50000101010101010101010101010101010141 +:104F60000101010101010101010101010101010131 +:104F70000101010101010101010101010101010121 +:104F80000101010101010101010101010101010111 +:104F90000101010101010101010101010101010101 +:104FA00001010101010101010101010101010101F1 +:104FB00001010101010101010101010101010101E1 +:104FC00001010101010101010101010101010101D1 +:104FD00001010101010101010101010101010101C1 +:104FE00001010101010101010101010101010101B1 +:104FF00001010101010101010101010101010101A1 +:105000000101010101010101010101010101010190 +:105010000101010101010101010101010101010180 +:105020000101010101010101010101010101010170 +:105030000101010101010101010101010101010160 +:105040000101010101010101010101010101010150 +:105050000101010101010101010101010101010140 +:105060000101010101010101010101010101010130 +:105070000101010101010101010101010101010120 +:105080000101010101010101010101010101010110 +:105090000101010101010101010101010101010100 +:1050A00001010101010101010101010101010101F0 +:1050B00001010101010101010101010101010101E0 +:1050C00001010101010101010101010101010101D0 +:1050D00001010101010101010101010101010101C0 +:1050E00001010101010101010101010101010101B0 +:1050F00001010101010101010101010101010101A0 +:10510000010101010101010101010101010101018F +:10511000010101010101010101010101010101017F +:10512000010101010101010101010101010101016F +:10513000010101010101010101010101010101015F +:10514000010101010101010101010101010101014F +:10515000010101010101010101010101010101013F +:10516000010101010101010101010101010101012F +:10517000010101010101010101010101010101011F +:10518000010101010101010101010101010101010F +:1051900001010101010101010101010101010101FF +:1051A00001010101010101010101010101010101EF +:1051B00001010101010101010101010101010101DF +:1051C00001010101010101010101010101010101CF +:1051D00001010101010101010101010101010101BF +:1051E00001010101010101010101010101010101AF +:1051F000010101010101010101010101010101019F +:10520000010101010101010101010101010101018E +:10521000010101010101010101010101010101017E +:10522000010101010101010101010101010101016E +:10523000010101010101010101010101010101015E +:10524000010101010101010101010101010101014E +:10525000010101010101010101010101010101013E +:10526000010101010101010101010101010101012E +:10527000010101010101010101010101010101011E +:10528000010101010101010101010101010101010E +:1052900001010101010101010101010101010101FE +:1052A00001010101010101010101010101010101EE +:1052B00001010101010101010101010101010101DE +:1052C00001010101010101010101010101010101CE +:1052D00001010101010101010101010101010101BE +:1052E00001010101010101010101010101010101AE +:1052F000010101010101010101010101010101019E +:10530000010101010101010101010101010101018D +:10531000010101010101010101010101010101017D +:10532000010101010101010101010101010101016D +:10533000010101010101010101010101010101015D +:10534000010101010101010101010101010101014D +:10535000010101010101010101010101010101013D +:10536000010101010101010101010101010101012D +:10537000010101010101010101010101010101011D +:10538000010101010101010101010101010101010D +:1053900001010101010101010101010101010101FD +:1053A00001010101010101010101010101010101ED +:1053B00001010101010101010101010101010101DD +:1053C00001010101010101010101010101010101CD +:1053D00001010101010101010101010101010101BD +:1053E00001010101010101010101010101010101AD +:1053F000010101010101010101010101010101019D +:10540000010101010101010101010101010101018C +:10541000010101010101010101010101010101017C +:10542000010101010101010101010101010101016C +:10543000010101010101010101010101010101015C +:10544000010101010101010101010101010101014C +:10545000010101010101010101010101010101013C +:10546000010101010101010101010101010101012C +:10547000010101010101010101010101010101011C +:10548000010101010101010101010101010101010C +:1054900001010101010101010101010101010101FC +:1054A00001010101010101010101010101010101EC +:1054B00001010101010101010101010101010101DC +:1054C00001010101010101010101010101010101CC +:1054D00001010101010101010101010101010101BC +:1054E00001010101010101010101010101010101AC +:1054F000010101010101010101010101010101019C +:10550000010101010101010101010101010101018B +:10551000010101010101010101010101010101017B +:10552000010101010101010101010101010101016B +:10553000010101010101010101010101010101015B +:10554000010101010101010101010101010101014B +:10555000010101010101010101010101010101013B +:10556000010101010101010101010101010101012B +:10557000010101010101010101010101010101011B +:10558000010101010101010101010101010101010B +:1055900001010101010101010101010101010101FB +:1055A00001010101010101010101010101010101EB +:1055B00001010101010101010101010101010101DB +:1055C00001010101010101010101010101010101CB +:1055D00001010101010101010101010101010101BB +:1055E00001010101010101010101010101010101AB +:1055F000010101010101010101010101010101019B +:10560000010101010101010101010101010101018A +:10561000010101010101010101010101010101017A +:10562000010101010101010101010101010101016A +:10563000010101010101010101010101010101015A +:10564000010101010101010101010101010101014A +:10565000010101010101010101010101010101013A +:10566000010101010101010101010101010101012A +:10567000010101010101010101010101010101011A +:10568000010101010101010101010101010101010A +:1056900001010101010101010101010101010101FA +:1056A00001010101010101010101010101010101EA +:1056B00001010101010101010101010101010101DA +:1056C00001010101010101010101010101010101CA +:1056D00001010101010101010101010101010101BA +:1056E00001010101010101010101010101010101AA +:1056F000010101010101010101010101010101019A +:105700000101010101010101010101010101010189 +:105710000101010101010101010101010101010179 +:105720000101010101010101010101010101010169 +:105730000101010101010101010101010101010159 +:105740000101010101010101010101010101010149 +:105750000101010101010101010101010101010139 +:105760000101010101010101010101010101010129 +:105770000101010101010101010101010101010119 +:105780000101010101010101010101010101010109 +:1057900001010101010101010101010101010101F9 +:1057A00001010101010101010101010101010101E9 +:1057B00001010101010101010101010101010101D9 +:1057C00001010101010101010101010101010101C9 +:1057D00001010101010101010101010101010101B9 +:1057E00001010101010101010101010101010101A9 +:1057F0000101010101010101010101010101010199 +:105800000101010101010101010101010101010188 +:105810000101010101010101010101010101010178 +:105820000101010101010101010101010101010168 +:105830000101010101010101010101010101010158 +:105840000101010101010101010101010101010148 +:105850000101010101010101010101010101010138 +:105860000101010101010101010101010101010128 +:105870000101010101010101010101010101010118 +:105880000101010101010101010101010101010108 +:1058900001010101010101010101010101010101F8 +:1058A00001010101010101010101010101010101E8 +:1058B00001010101010101010101010101010101D8 +:1058C00001010101010101010101010101010101C8 +:1058D00001010101010101010101010101010101B8 +:1058E00001010101010101010101010101010101A8 +:1058F0000101010101010101010101010101010198 +:105900000101010101010101010101010101010088 +:105910000000000000000000000000000000000087 +:105920000000000000000000000000000000000077 +:105930000000000000000000000000000000000067 +:105940000000000000000000000000000000000057 +:105950000000000000000000000000000000000047 +:105960000000000000000000000000000000000037 +:105970000000000000000000000000000000000027 +:105980000000000000000000000000000000000017 +:105990000000000000000000000000000000000007 +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000000000000000000000E7 +:1059C00000000000000000000000000000000000D7 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 +:105A00000000000000000000000000000000000096 +:105A10000000000000000000000000000000000086 +:105A20000000000000000000000000000000000076 +:105A30000000000000000000000000000000000066 +:105A40000000000000000000000000000000000056 +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000000000000016 +:105A90000000000000000000000000000000000006 +:105AA00000000000000000000000000000000000F6 +:105AB00000000000000000000000000000000000E6 +:105AC00000000000000000000000000000000000D6 +:105AD00000000000000000000000000000000000C6 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 +:105B00000000000000000000000000000000000095 +:105B10000000000000000000000000000000000085 +:105B20000000000000000000000000000000000075 +:105B30000000000000000000000000000000000065 +:105B40000000000000000000000000000000000055 +:105B50000000000000000000000000000000000045 +:105B60000000000000000000000000000000000035 +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B90000000000000000000000000000000000005 +:105BA00000000000000000000000000000000000F5 +:105BB00000000000000000000000000000000000E5 +:105BC00000000000000000000000000000000000D5 +:105BD00000000000000000000000000000000000C5 +:105BE00000000000000000000000000000000000B5 +:105BF00000000000000000000000000000000000A5 +:105C00000000000000000000000000000000000094 +:105C10000000000000000000000000000000000084 +:105C20000000000000000000000000000000000074 +:105C30000000000000000000000000000000000064 +:105C40000000000000000000000000000000000054 +:105C50000000000000000000000000000000000044 +:105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 +:105C80000000000000000000000000000000000014 +:105C90000000000000000000000000000000000004 +:105CA00000000000000000000000000000000000F4 +:105CB00000000000000000000000000000000000E4 +:105CC00000000000000000000000000000000000D4 +:105CD00000000000000000000000000000000000C4 +:105CE00000000000000000000000000000000000B4 +:105CF00000000000000000000000000000000000A4 +:105D00000000000000000000000000000000000093 +:105D10000000000000000000000000000000000083 +:105D20000000000000000000000000000000000073 +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000000000000000053 +:105D50000000000000000000000000000000000043 +:105D60000000000000000000000000000000000033 +:105D70000000000000000000000000000000000023 +:105D80000000000000000000000000000000000013 +:105D90000000000000000000000000000000000003 +:105DA00000000000000000000000000000000000F3 +:105DB00000000000000000000000000000000000E3 +:105DC00000000000000000000000000000000000D3 +:105DD00000000000000000000000000000000000C3 +:105DE00000000000000000000000000000000000B3 +:105DF00000000000000000000000000000000000A3 +:105E00000000000000000000000000000000000092 +:105E10000000000000000000000000000000000082 +:105E20000000000000000000000000000000000072 +:105E30000000000000000000000000000000000062 +:105E40000000000000000000000000000000000052 +:105E50000000000000000000000000000000000042 +:105E60000000000000000000000000000000000032 +:105E70000000000000000000000000000000000022 +:105E80000000000000000000000000000000000012 +:105E90000000000000000000000000000000000002 +:105EA00000000000000000000000000000000000F2 +:105EB00000000000000000000000000000000000E2 +:105EC00000000000000000000000000000000000D2 +:105ED00000000000000000000000000000000000C2 +:105EE00000000000000000000000000000000000B2 +:105EF00000000000000000000000000000000000A2 +:105F00000000000000000000000000000000000091 +:105F10000000000000000000000000000000000081 +:105F20000000000000000000000000000000000071 +:105F30000000000000000000000000000000000061 +:105F40000000000000000000000000000000000051 +:105F50000000000000000000000000000000000041 +:105F60000000000000000000000000000000000031 +:105F70000000000000000000000000000000000021 +:105F80000000000000000000000000000000000011 +:105F90000000000000000000000000000000000001 +:105FA00000000000000000000000000000000000F1 +:105FB00000000000000000000000000000000000E1 +:105FC00000000000000000000000000000000000D1 +:105FD00000000000000000000000000000000000C1 +:105FE00000000000000000000000000000000000B1 +:105FF00000000000000000000000000000000000A1 +:10600000000000000000000000000000000000028E +:106010000202020202020202020202020202020260 +:106020000202020202020202020202020202020250 +:106030000202020202020202020202020202020240 +:106040000202020202020202020202020202020230 +:106050000202020202020202020202020202020220 +:106060000202020202020202020202020202020210 +:106070000202020202020202020202020202020200 +:1060800002020202020202020202020202020202F0 +:1060900002020202020202020202020202020202E0 +:1060A00002020202020202020202020202020202D0 +:1060B00002020202020202020202020202020202C0 +:1060C00002020202020202020202020202020202B0 +:1060D00002020202020202020202020202020202A0 +:1060E0000202020202020202020202020202020290 +:1060F0000202020202020202020202020202020280 +:10610000020202020202020202020202020202026F +:10611000020202020202020202020202020202025F +:10612000020202020202020202020202020202024F +:10613000020202020202020202020202020202023F +:10614000020202020202020202020202020202022F +:10615000020202020202020202020202020202021F +:10616000020202020202020202020202020202020F +:1061700002020202020202020202020202020202FF +:1061800002020202020202020202020202020202EF +:1061900002020202020202020202020202020202DF +:1061A00002020202020202020202020202020202CF +:1061B00002020202020202020202020202020202BF +:1061C00002020202020202020202020202020202AF +:1061D000020202020202020202020202020202029F +:1061E000020202020202020202020202020202028F +:1061F000020202020202020202020202020202027F +:10620000020202020202020202020202020202026E +:10621000020202020202020202020202020202025E +:10622000020202020202020202020202020202024E +:10623000020202020202020202020202020202023E +:10624000020202020202020202020202020202022E +:10625000020202020202020202020202020202021E +:10626000020202020202020202020202020202020E +:1062700002020202020202020202020202020202FE +:1062800002020202020202020202020202020202EE +:1062900002020202020202020202020202020202DE +:1062A00002020202020202020202020202020202CE +:1062B00002020202020202020202020202020202BE +:1062C00002020202020202020202020202020202AE +:1062D000020202020202020202020202020202029E +:1062E000020202020202020202020202020202028E +:1062F000020202020202020202020202020202027E +:10630000020202020202020202020202020202026D +:10631000020202020202020202020202020202025D +:10632000020202020202020202020202020202024D +:10633000020202020202020202020202020202023D +:10634000020202020202020202020202020202022D +:10635000020202020202020202020202020202021D +:10636000020202020202020202020202020202020D +:1063700002020202020202020202020202020202FD +:1063800002020202020202020202020202020202ED +:1063900002020202020202020202020202020202DD +:1063A00002020202020202020202020202020202CD +:1063B00002020202020202020202020202020202BD +:1063C00002020202020202020202020202020202AD +:1063D000020202020202020202020202020202029D +:1063E000020202020202020202020202020202028D +:1063F000020202020202020202020202020202027D +:10640000020202020202020202020202020202026C +:10641000020202020202020202020202020202025C +:10642000020202020202020202020202020202024C +:10643000020202020202020202020202020202023C +:10644000020202020202020202020202020202022C +:10645000020202020202020202020202020202021C +:10646000020202020202020202020202020202020C +:1064700002020202020202020202020202020202FC +:1064800002020202020202020202020202020202EC +:1064900002020202020202020202020202020202DC +:1064A00002020202020202020202020202020202CC +:1064B00002020202020202020202020202020202BC +:1064C00002020202020202020202020202020202AC +:1064D000020202020202020202020202020202029C +:1064E000020202020202020202020202020202028C +:1064F000020202020202020202020202020202027C +:10650000020202020202020202020202020202026B +:10651000020202020202020202020202020202025B +:10652000020202020202020202020202020202024B +:10653000020202020202020202020202020202023B +:10654000020202020202020202020202020202022B +:10655000020202020202020202020202020202021B +:10656000020202020202020202020202020202020B +:1065700002020202020202020202020202020202FB +:1065800002020202020202020202020202020202EB +:1065900002020202020202020202020202020202DB +:1065A00002020202020202020202020202020202CB +:1065B00002020202020202020202020202020202BB +:1065C00002020202020202020202020202020202AB +:1065D000020202020202020202020202020202029B +:1065E000020202020202020202020202020202028B +:1065F000020202020202020202020202020202027B +:10660000020202020202020202020202020202026A +:10661000020202020202020202020202020202025A +:10662000020202020202020202020202020202024A +:10663000020202020202020202020202020202023A +:10664000020202020202020202020202020202022A +:10665000020202020202020202020202020202021A +:10666000020202020202020202020202020202020A +:1066700002020202020202020202020202020202FA +:1066800002020202020202020202020202020202EA +:1066900002020202020202020202020202020202DA +:1066A00002020202020202020202020202020202CA +:1066B00002020202020202020202020202020202BA +:1066C00002020202020202020202020202020202AA +:1066D000020202020202020202020202020202029A +:1066E000020202020202020202020202020202028A +:1066F000020202020202020202020202020202027A +:106700000202020202020202020202020202020269 +:106710000202020202020202020202020202020259 +:106720000202020202020202020202020202020249 +:106730000202020202020202020202020202020239 +:106740000202020202020202020202020202020229 +:106750000202020202020202020202020202020219 +:106760000202020202020202020202020202020209 +:1067700002020202020202020202020202020202F9 +:1067800002020202020202020202020202020202E9 +:1067900002020202020202020202020202020202D9 +:1067A00002020202020202020202020202020202C9 +:1067B00002020202020202020202020202020202B9 +:1067C00002020202020202020202020202020202A9 +:1067D0000202020202020202020202020202020299 +:1067E0000202020202020202020202020202020289 +:1067F0000202020202020202020202020202020279 +:106800000202020202020202020202020202020268 +:106810000202020202020202020202020202020258 +:106820000202020202020202020202020202020248 +:106830000202020202020202020202020202020238 +:106840000202020202020202020202020202020228 +:106850000202020202020202020202020202020218 +:106860000202020202020202020202020202020208 +:1068700002020202020202020202020202020202F8 +:1068800002020202020202020202020202020202E8 +:1068900002020202020202020202020202020202D8 +:1068A00002020202020202020202020202020202C8 +:1068B00002020202020202020202020202020202B8 +:1068C00002020202020202020202020202020202A8 +:1068D0000202020202020202020202020202020298 +:1068E0000202020202020202020202020202020288 +:1068F0000202020202020202020202020202020278 +:106900000202020202020202020202020202020267 +:106910000202020202020202020202020202020257 +:106920000202020202020202020202020202020247 +:106930000202020202020202020202020202020237 +:106940000202020202020202020202020202020227 +:106950000202020202020202020202020202020217 +:106960000202020202020202020202020202020207 +:1069700002020202020202020202020202020202F7 +:1069800002020202020202020202020202020202E7 +:1069900002020202020202020202020202020202D7 +:1069A00002020202020202020202020202020202C7 +:1069B00002020202020202020202020202020202B7 +:1069C00002020202020202020202020202020202A7 +:1069D0000202020202020202020202020202020297 +:1069E0000202020202020202020202020202020287 +:1069F0000202020202020202020202020202020277 +:106A00000202020202020202020202020202020266 +:106A10000202020202020202020202020202020256 +:106A20000202020202020202020202020202020246 +:106A30000202020202020202020202020202020236 +:106A40000202020202020202020202020202020226 +:106A50000202020202020202020202020202020216 +:106A60000202020202020202020202020202020206 +:106A700002020202020202020202020202020202F6 +:106A800002020202020202020202020202020202E6 +:106A900002020202020202020202020202020202D6 +:106AA00002020202020202020202020202020202C6 +:106AB00002020202020202020202020202020202B6 +:106AC00002020202020202020202020202020202A6 +:106AD0000202020202020202020202020202020296 +:106AE0000202020202020202020202020202020286 +:106AF0000202020202020202020202020202020276 +:106B00000202020202020202020202020202020265 +:106B10000202020202020202020202020202020255 +:106B20000202020202020202020202020202020245 +:106B30000202020202020202020202020202020235 +:106B40000202020202020202020202020202020225 +:106B50000202020202020202020202020202020215 +:106B60000202020202020202020202020202020205 +:106B700002020202020202020202020202020202F5 +:106B800002020202020202020202020202020202E5 +:106B900002020202020202020202020202020202D5 +:106BA00002020202020202020202020202020202C5 +:106BB00002020202020202020202020202020202B5 +:106BC00002020202020202020202020202020202A5 +:106BD0000202020202020202020202020202020295 +:106BE0000202020202020202020202020202020285 +:106BF0000202020202020202020202020202020275 +:106C00000202020202020202020202020202020264 +:106C10000202020202020202020202020202020254 +:106C20000202020202020202020202020202020244 +:106C30000202020202020202020202020202020234 +:106C40000202020202020202020202020202020224 +:106C50000202020202020202020202020202020214 +:106C60000202020202020202020202020202020204 +:106C700002020202020202020202020202020202F4 +:106C800002020202020202020202020202020202E4 +:106C900002020202020202020202020202020202D4 +:106CA00002020202020202020202020202020202C4 +:106CB00002020202020202020202020202020202B4 +:106CC00002020202020202020202020202020202A4 +:106CD0000202020202020202020202020202020294 +:106CE0000202020202020202020202020202020284 +:106CF0000202020202020202020202020202020274 +:106D00000202020202020202020202020202020263 +:106D10000202020202020202020202020202020253 +:106D20000202020202020202020202020202020243 +:106D30000202020202020202020202020202020233 +:106D40000202020202020202020202020202020223 +:106D50000202020202020202020202020202020213 +:106D60000202020202020202020202020202020203 +:106D700002020202020202020202020202020202F3 +:106D800002020202020202020202020202020202E3 +:106D900002020202020202020202020202020202D3 +:106DA00002020202020202020202020202020202C3 +:106DB00002020202020202020202020202020202B3 +:106DC00002020202020202020202020202020202A3 +:106DD0000202020202020202020202020202020293 +:106DE0000202020202020202020202020202020283 +:106DF0000202020202020202020202020202020273 +:106E00000202020202020202020202020202020262 +:106E10000202020202020202020202020202020252 +:106E20000202020202020202020202020202020242 +:106E30000202020202020202020202020202020232 +:106E40000202020202020202020202020202020222 +:106E50000202020202020202020202020202020212 +:106E60000202020202020202020202020202020202 +:106E700002020202020202020202020202020202F2 +:106E800002020202020202020202020202020202E2 +:106E900002020202020202020202020202020202D2 +:106EA00002020202020202020202020202020202C2 +:106EB00002020202020202020202020202020202B2 +:106EC00002020202020202020202020202020202A2 +:106ED0000202020202020202020202020202020292 +:106EE0000202020202020202020202020202020282 +:106EF0000202020202020202020202020202020272 +:106F00000202020202020202020202020202020063 +:106F10000000000000000000000000000000000071 +:106F20000000000000000000000000000000000061 +:106F30000000000000000000000000000000000051 +:106F40000000000000000000000000000000000041 +:106F50000000000000000000000000000000000031 +:106F60000000000000000000000000000000000021 +:106F70000000000000000000000000000000000011 +:106F80000000000000000000000000000000000001 +:106F900000000000000000000000000000000000F1 +:106FA00000000000000000000000000000000000E1 +:106FB00000000000000000000000000000000000D1 +:106FC00000000000000000000000000000000000C1 +:106FD00000000000000000000000000000000000B1 +:106FE00000000000000000000000000000000000A1 +:106FF0000000000000000000000000000000000091 +:107000000000000000000000000000000000000080 +:107010000000000000000000000000000000000070 +:107020000000000000000000000000000000000060 +:107030000000000000000000000000000000000050 +:107040000000000000000000000000000000000040 +:107050000000000000000000000000000000000030 +:107060000000000000000000000000000000000020 +:107070000000000000000000000000000000000010 +:107080000000000000000000000000000000000000 +:1070900000000000000000000000000000000000F0 +:1070A00000000000000000000000000000000000E0 +:1070B00000000000000000000000000000000000D0 +:1070C00000000000000000000000000000000000C0 +:1070D00000000000000000000000000000000000B0 +:1070E00000000000000000000000000000000000A0 +:1070F0000000000000000000000000000000000090 +:10710000000000000000000000000000000000007F +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000003F +:10715000000000000000000000000000000000002F +:10716000000000000000000000000000000000001F +:10717000000000000000000000000000000000000F +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000000EF +:1071A00000000000000000000000000000000000DF +:1071B00000000000000000000000000000000000CF +:1071C00000000000000000000000000000000000BF +:1071D00000000000000000000000000000000000AF +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000000000000000008F +:10720000000000000000000000000000000000007E +:10721000000000000000000000000000000000006E +:10722000000000000000000000000000000000005E +:10723000000000000000000000000000000000004E +:10724000000000000000000000000000000000003E +:10725000000000000000000000000000000000002E +:10726000000000000000000000000000000000001E +:10727000000000000000000000000000000000000E +:1072800000000000000000000000000000000000FE +:1072900000000000000000000000000000000000EE +:1072A00000000000000000000000000000000000DE +:1072B00000000000000000000000000000000000CE +:1072C00000000000000000000000000000000000BE +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:10730000000000000000000000000000000000007D +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:10733000000000000000000000000000000000004D +:10734000000000000000000000000000000000003D +:10735000000000000000000000000000000000002D +:10736000000000000000000000000000000000001D +:10737000000000000000000000000000000000000D +:1073800000000000000000000000000000000000FD +:1073900000000000000000000000000000000000ED +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000000000000000000CD +:1073C00000000000000000000000000000000000BD +:1073D00000000000000000000000000000000000AD +:1073E000000000000000000000000000000000009D +:1073F000000000000000000000000000000000008D +:10740000000000000000000000000000000000007C +:10741000000000000000000000000000000000006C +:10742000000000000000000000000000000000005C +:10743000000000000000000000000000000000004C +:10744000000000000000000000000000000000003C +:10745000000000000000000000000000000000002C +:10746000000000000000000000000000000000001C +:10747000000000000000000000000000000000000C +:1074800000000000000000000000000000000000FC +:1074900000000000000000000000000000000000EC +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000000000CC +:1074C00000000000000000000000000000000000BC +:1074D00000000000000000000000000000000000AC +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000008C +:107500000000000000000000000000000000005526 +:107510000000000000000001010101010101010162 +:10752000010101010101010101010101010101014B +:10753000010101010101010101010101010101013B +:10754000010101010101010101010101010101012B +:10755000010101010101010101010101010101011B +:10756000010101010101010101010101010101010B +:1075700001010101010101010101010101010101FB +:1075800001010101010101010101010101010101EB +:1075900001010101010101010101010101010101DB +:1075A00001010101010101010101010101010101CB +:1075B00001010101010101010101010101010101BB +:1075C00001010101010101010101010101010101AB +:1075D000010101010101010101010101010101019B +:1075E000010101010101010101010101010101018B +:1075F000010101010101010101010101010101017B +:10760000010101010101010101010101010101016A +:10761000010101010101010101010101010101015A +:10762000010101010101010101010101010101014A +:10763000010101010101010101010101010101013A +:10764000010101010101010101010101010101012A +:10765000010101010101010101010101010101011A +:10766000010101010101010101010101010101010A +:1076700001010101010101010101010101010101FA +:1076800001010101010101010101010101010101EA +:1076900001010101010101010101010101010101DA +:1076A00001010101010101010101010101010101CA +:1076B00001010101010101010101010101010101BA +:1076C00001010101010101010101010101010101AA +:1076D000010101010101010101010101010101019A +:1076E000010101010101010101010101010101018A +:1076F000010101010101010101010101010101017A +:107700000101010101010101010101010101010169 +:107710000101010101010101010101010101010159 +:107720000101010101010101010101010101010149 +:107730000101010101010101010101010101010139 +:107740000101010101010101010101010101010129 +:107750000101010101010101010101010101010119 +:107760000101010101010101010101010101010109 +:1077700001010101010101010101010101010101F9 +:1077800001010101010101010101010101010101E9 +:1077900001010101010101010101010101010101D9 +:1077A00001010101010101010101010101010101C9 +:1077B00001010101010101010101010101010101B9 +:1077C00001010101010101010101010101010101A9 +:1077D0000101010101010101010101010101010199 +:1077E0000101010101010101010101010101010189 +:1077F0000101010101010101010101010101010179 +:107800000101010101010101010101010101010168 +:107810000101010101010101010101010101010158 +:107820000101010101010101010101010101010148 +:107830000101010101010101010101010101010138 +:107840000101010101010101010101010101010128 +:107850000101010101010101010101010101010118 +:107860000101010101010101010101010101010108 +:1078700001010101010101010101010101010101F8 +:1078800001010101010101010101010101010101E8 +:1078900001010101010101010101010101010101D8 +:1078A00001010101010101010101010101010101C8 +:1078B00001010101010101010101010101010101B8 +:1078C00001010101010101010101010101010101A8 +:1078D0000101010101010101010101010101010198 +:1078E0000101010101010101010101010101010188 +:1078F0000101010101010101010101010101010178 +:107900000101010101010101010101010101010167 +:107910000101010101010101010101010101010157 +:107920000101010101010101010101010101010147 +:107930000101010101010101010101010101010137 +:107940000101010101010101010101010101010127 +:107950000101010101010101010101010101010117 +:107960000101010101010101010101010101010107 +:1079700001010101010101010101010101010101F7 +:1079800001010101010101010101010101010101E7 +:1079900001010101010101010101010101010101D7 +:1079A00001010101010101010101010101010101C7 +:1079B00001010101010101010101010101010101B7 +:1079C00001010101010101010101010101010101A7 +:1079D0000101010101010101010101010101010197 +:1079E0000101010101010101010101010101010187 +:1079F0000101010101010101010101010101010177 +:107A00000101010101010101010101010101010166 +:107A10000101010101010101010101010101010156 +:107A20000101010101010101010101010101010146 +:107A30000101010101010101010101010101010136 +:107A40000101010101010101010101010101010126 +:107A50000101010101010101010101010101010116 +:107A60000101010101010101010101010101010106 +:107A700001010101010101010101010101010101F6 +:107A800001010101010101010101010101010101E6 +:107A900001010101010101010101010101010101D6 +:107AA00001010101010101010101010101010101C6 +:107AB00001010101010101010101010101010101B6 +:107AC00001010101010101010101010101010101A6 +:107AD0000101010101010101010101010101010196 +:107AE0000101010101010101010101010101010186 +:107AF0000101010101010101010101010101010176 +:107B00000101010101010101010101010101010165 +:107B10000101010101010101010101010101010155 +:107B20000101010101010101010101010101010145 +:107B30000101010101010101010101010101010135 +:107B40000101010101010101010101010101010125 +:107B50000101010101010101010101010101010115 +:107B60000101010101010101010101010101010105 +:107B700001010101010101010101010101010101F5 +:107B800001010101010101010101010101010101E5 +:107B900001010101010101010101010101010101D5 +:107BA00001010101010101010101010101010101C5 +:107BB00001010101010101010101010101010101B5 +:107BC00001010101010101010101010101010101A5 +:107BD0000101010101010101010101010101010195 +:107BE0000101010101010101010101010101010185 +:107BF0000101010101010101010101010101010175 +:107C00000101010101010101010101010101010164 +:107C10000101010101010101010101010101010154 +:107C20000101010101010101010101010101010144 +:107C30000101010101010101010101010101010134 +:107C40000101010101010101010101010101010124 +:107C50000101010101010101010101010101010114 +:107C60000101010101010101010101010101010104 +:107C700001010101010101010101010101010101F4 +:107C800001010101010101010101010101010101E4 +:107C900001010101010101010101010101010101D4 +:107CA00001010101010101010101010101010101C4 +:107CB00001010101010101010101010101010101B4 +:107CC00001010101010101010101010101010101A4 +:107CD0000101010101010101010101010101010194 +:107CE0000101010101010101010101010101010184 +:107CF0000101010101010101010101010101010174 +:107D00000101010101010101010101010101010163 +:107D10000101010101010101010101010101010153 +:107D20000101010101010101010101010101010143 +:107D30000101010101010101010101010101010133 +:107D40000101010101010101010101010101010123 +:107D50000101010101010101010101010101010113 +:107D60000101010101010101010101010101010103 +:107D700001010101010101010101010101010101F3 +:107D800001010101010101010101010101010101E3 +:107D900001010101010101010101010101010101D3 +:107DA00001010101010101010101010101010101C3 +:107DB00001010101010101010101010101010101B3 +:107DC00001010101010101010101010101010101A3 +:107DD0000101010101010101010101010101010193 +:107DE0000101010101010101010101010101010183 +:107DF0000101010101010101010101010101010173 +:107E00000101010101010101010101010101010162 +:107E10000101010101010101010101010101010152 +:107E20000101010101010101010101010101010142 +:107E30000101010101010101010101010101010132 +:107E40000101010101010101010101010101010122 +:107E50000101010101010101010101010101010112 +:107E60000101010101010101010101010101010102 +:107E700001010101010101010101010101010101F2 +:107E800001010101010101010101010101010101E2 +:107E900001010101010101010101010101010101D2 +:107EA00001010101010101010101010101010101C2 +:107EB00001010101010101010101010101010101B2 +:107EC00001010101010101010101010101010101A2 +:107ED0000101010101010101010101010101010192 +:107EE0000101010101010101010101010101010182 +:107EF0000101010101010101010101010101010172 +:107F00000101010101010101010101010101010161 +:107F10000101010101010101010101010101010151 +:107F20000101010101010101010101010101010141 +:107F30000101010101010101010101010101010131 +:107F40000101010101010101010101010101010121 +:107F50000101010101010101010101010101010111 +:107F60000101010101010101010101010101010101 +:107F700001010101010101010101010101010101F1 +:107F800001010101010101010101010101010101E1 +:107F900001010101010101010101010101010101D1 +:107FA00001010101010101010101010101010101C1 +:107FB00001010101010101010101010101010101B1 +:107FC00001010101010101010101010101010101A1 +:107FD0000101010101010101010101010101010191 +:107FE0000101010101010101010101010101010181 +:107FF0000101010101010101010101010101010171 +:108000000101010101010101010101010101010160 +:108010000101010101010101010101010101010150 +:108020000101010101010101010101010101010140 +:108030000101010101010101010101010101010130 +:108040000101010101010101010101010101010120 +:108050000101010101010101010101010101010110 +:108060000101010101010101010101010101010100 +:1080700001010101010101010101010101010101F0 +:1080800001010101010101010101010101010101E0 +:1080900001010101010101010101010101010101D0 +:1080A00001010101010101010101010101010101C0 +:1080B00001010101010101010101010101010101B0 +:1080C00001010101010101010101010101010101A0 +:1080D0000101010101010101010101010101010190 +:1080E0000101010101010101010101010101010180 +:1080F0000101010101010101010101010101010170 +:10810000010101010101010101010101010101015F +:10811000010101010101010101010101010101014F +:10812000010101010101010101010101010101013F +:10813000010101010101010101010101010101012F +:10814000010101010101010101010101010101011F +:10815000010101010101010101010101010101010F +:1081600001010101010101010101010101010101FF +:1081700001010101010101010101010101010101EF +:1081800001010101010101010101010101010101DF +:1081900001010101010101010101010101010101CF +:1081A00001010101010101010101010101010101BF +:1081B00001010101010101010101010101010101AF +:1081C000010101010101010101010101010101019F +:1081D000010101010101010101010101010101018F +:1081E000010101010101010101010101010101017F +:1081F000010101010101010101010101010101016F +:10820000010101010101010101010101010101015E +:10821000010101010101010101010101010101014E +:10822000010101010101010101010101010101013E +:10823000010101010101010101010101010101012E +:10824000010101010101010101010101010101011E +:10825000010101010101010101010101010101010E +:1082600001010101010101010101010101010101FE +:1082700001010101010101010101010101010101EE +:1082800001010101010101010101010101010101DE +:1082900001010101010101010101010101010101CE +:1082A00001010101010101010101010101010101BE +:1082B00001010101010101010101010101010101AE +:1082C000010101010101010101010101010101019E +:1082D000010101010101010101010101010101018E +:1082E000010101010101010101010101010101017E +:1082F000010101010101010101010101010101016E +:10830000010101010101010101010101010101015D +:10831000010101010101010101010101010101014D +:10832000010101010101010101010101010101013D +:10833000010101010101010101010101010101012D +:10834000010101010101010101010101010101011D +:10835000010101010101010101010101010101010D +:1083600001010101010101010101010101010101FD +:1083700001010101010101010101010101010101ED +:1083800001010101010101010101010101010101DD +:1083900001010101010101010101010101010101CD +:1083A00001010101010101010101010101010101BD +:1083B00001010101010101010101010101010101AD +:1083C000010101010101010101010101010101019D +:1083D000010101010101010101010101010101018D +:1083E000010101010101010101010101010101017D +:1083F000010101010101010101010101010101016D +:10840000010101010101010101010101010101015C +:108410000101010101010100000000000000000055 +:10842000000000000000000000000000000000004C +:10843000000000000000000000000000000000003C +:10844000000000000000000000000000000000002C +:10845000000000000000000000000000000000001C +:10846000000000000000000000000000000000000C +:1084700000000000000000000000000000000000FC +:1084800000000000000000000000000000000000EC +:1084900000000000000000000000000000000000DC +:1084A00000000000000000000000000000000000CC +:1084B00000000000000000000000000000000000BC +:1084C00000000000000000000000000000000000AC +:1084D000000000000000000000000000000000009C +:1084E000000000000000000000000000000000008C +:1084F000000000000000000000000000000000007C +:10850000000000000000000000000000000000006B +:10851000000000000000000000000000000000005B +:10852000000000000000000000000000000000004B +:10853000000000000000000000000000000000003B +:10854000000000000000000000000000000000002B +:10855000000000000000000000000000000000001B +:10856000000000000000000000000000000000000B +:1085700000000000000000000000000000000000FB +:1085800000000000000000000000000000000000EB +:1085900000000000000000000000000000000000DB +:1085A00000000000000000000000000000000000CB +:1085B00000000000000000000000000000000000BB +:1085C00000000000000000000000000000000000AB +:1085D000000000000000000000000000000000009B +:1085E000000000000000000000000000000000008B +:1085F000000000000000000000000000000000007B +:10860000000000000000000000000000000000006A +:10861000000000000000000000000000000000005A +:10862000000000000000000000000000000000004A +:10863000000000000000000000000000000000003A +:10864000000000000000000000000000000000002A +:10865000000000000000000000000000000000001A +:10866000000000000000000000000000000000000A +:1086700000000000000000000000000000000000FA +:1086800000000000000000000000000000000000EA +:1086900000000000000000000000000000000000DA +:1086A00000000000000000000000000000000000CA +:1086B00000000000000000000000000000000000BA +:1086C00000000000000000000000000000000000AA +:1086D000000000000000000000000000000000009A +:1086E000000000000000000000000000000000008A +:1086F000000000000000000000000000000000007A +:108700000000000000000000000000000000000069 +:108710000000000000000000000000000000000059 +:108720000000000000000000000000000000000049 +:108730000000000000000000000000000000000039 +:108740000000000000000000000000000000000029 +:108750000000000000000000000000000000000019 +:108760000000000000000000000000000000000009 +:1087700000000000000000000000000000000000F9 +:1087800000000000000000000000000000000000E9 +:1087900000000000000000000000000000000000D9 +:1087A00000000000000000000000000000000000C9 +:1087B00000000000000000000000000000000000B9 +:1087C00000000000000000000000000000000000A9 +:1087D0000000000000000000000000000000000099 +:1087E0000000000000000000000000000000000089 +:1087F0000000000000000000000000000000000079 +:108800000000000000000000000000000000000068 +:108810000000000000000000000000000000000058 +:108820000000000000000000000000000000000048 +:108830000000000000000000000000000000000038 +:108840000000000000000000000000000000000028 +:108850000000000000000000000000000000000018 +:108860000000000000000000000000000000000008 +:1088700000000000000000000000000000000000F8 +:1088800000000000000000000000000000000000E8 +:1088900000000000000000000000000000000000D8 +:1088A00000000000000000000000000000000000C8 +:1088B00000000000000000000000000000000000B8 +:1088C00000000000000000000000000000000000A8 +:1088D0000000000000000000000000000000000098 +:1088E0000000000000000000000000000000000088 +:1088F0000000000000000000000000000000000078 +:108900000000000000000000000000000000000067 +:108910000000000000000000000000000000000057 +:108920000000000000000000000000000000000047 +:108930000000000000000000000000000000000037 +:108940000000000000000000000000000000000027 +:108950000000000000000000000000000000000017 +:108960000000000000000000000000000000000007 +:1089700000000000000000000000000000000000F7 +:1089800000000000000000000000000000000000E7 +:1089900000000000000000000000000000000000D7 +:1089A00000000000000000000000000000000000C7 +:1089B00000000000000000000000000000000000B7 +:1089C00000000000000000000000000000000000A7 +:1089D0000000000000000000000000000000000097 +:1089E0000000000000000000000000000000000087 +:1089F0000000000000000000000000000000000077 +:108A00000000000000000000000000000000000066 +:108A10000000000000000000000000000000000056 +:108A20000000000000000000000000000000000046 +:108A30000000000000000000000000000000000036 +:108A40000000000000000000000000000000000026 +:108A50000000000000000000000000000000000016 +:108A60000000000000000000000000000000000006 +:108A700000000000000000000000000000000000F6 +:108A800000000000000000000000000000000000E6 +:108A900000000000000000000000000000000000D6 +:108AA00000000000000000000000000000000000C6 +:108AB00000000000000000000000000000000000B6 +:108AC00000000000000000000000000000000000A6 +:108AD0000000000000000000000000000000000096 +:108AE0000000000000000000000000000000000086 +:108AF0000000000000000000000000000000000076 +:108B00000000000000000000000000000000000065 +:108B10000000000000000002020202020202020243 +:108B20000202020202020202020202020202020225 +:108B30000202020202020202020202020202020215 +:108B40000202020202020202020202020202020205 +:108B500002020202020202020202020202020202F5 +:108B600002020202020202020202020202020202E5 +:108B700002020202020202020202020202020202D5 +:108B800002020202020202020202020202020202C5 +:108B900002020202020202020202020202020202B5 +:108BA00002020202020202020202020202020202A5 +:108BB0000202020202020202020202020202020295 +:108BC0000202020202020202020202020202020285 +:108BD0000202020202020202020202020202020275 +:108BE0000202020202020202020202020202020265 +:108BF0000202020202020202020202020202020255 +:108C00000202020202020202020202020202020244 +:108C10000202020202020202020202020202020234 +:108C20000202020202020202020202020202020224 +:108C30000202020202020202020202020202020214 +:108C40000202020202020202020202020202020204 +:108C500002020202020202020202020202020202F4 +:108C600002020202020202020202020202020202E4 +:108C700002020202020202020202020202020202D4 +:108C800002020202020202020202020202020202C4 +:108C900002020202020202020202020202020202B4 +:108CA00002020202020202020202020202020202A4 +:108CB0000202020202020202020202020202020294 +:108CC0000202020202020202020202020202020284 +:108CD0000202020202020202020202020202020274 +:108CE0000202020202020202020202020202020264 +:108CF0000202020202020202020202020202020254 +:108D00000202020202020202020202020202020243 +:108D10000202020202020202020202020202020233 +:108D20000202020202020202020202020202020223 +:108D30000202020202020202020202020202020213 +:108D40000202020202020202020202020202020203 +:108D500002020202020202020202020202020202F3 +:108D600002020202020202020202020202020202E3 +:108D700002020202020202020202020202020202D3 +:108D800002020202020202020202020202020202C3 +:108D900002020202020202020202020202020202B3 +:108DA00002020202020202020202020202020202A3 +:108DB0000202020202020202020202020202020293 +:108DC0000202020202020202020202020202020283 +:108DD0000202020202020202020202020202020273 +:108DE0000202020202020202020202020202020263 +:108DF0000202020202020202020202020202020253 +:108E00000202020202020202020202020202020242 +:108E10000202020202020202020202020202020232 +:108E20000202020202020202020202020202020222 +:108E30000202020202020202020202020202020212 +:108E40000202020202020202020202020202020202 +:108E500002020202020202020202020202020202F2 +:108E600002020202020202020202020202020202E2 +:108E700002020202020202020202020202020202D2 +:108E800002020202020202020202020202020202C2 +:108E900002020202020202020202020202020202B2 +:108EA00002020202020202020202020202020202A2 +:108EB0000202020202020202020202020202020292 +:108EC0000202020202020202020202020202020282 +:108ED0000202020202020202020202020202020272 +:108EE0000202020202020202020202020202020262 +:108EF0000202020202020202020202020202020252 +:108F00000202020202020202020202020202020241 +:108F10000202020202020202020202020202020231 +:108F20000202020202020202020202020202020221 +:108F30000202020202020202020202020202020211 +:108F40000202020202020202020202020202020201 +:108F500002020202020202020202020202020202F1 +:108F600002020202020202020202020202020202E1 +:108F700002020202020202020202020202020202D1 +:108F800002020202020202020202020202020202C1 +:108F900002020202020202020202020202020202B1 +:108FA00002020202020202020202020202020202A1 +:108FB0000202020202020202020202020202020291 +:108FC0000202020202020202020202020202020281 +:108FD0000202020202020202020202020202020271 +:108FE0000202020202020202020202020202020261 +:108FF0000202020202020202020202020202020251 +:109000000202020202020202020202020202020240 +:109010000202020202020202020202020202020230 +:109020000202020202020202020202020202020220 +:109030000202020202020202020202020202020210 +:109040000202020202020202020202020202020200 +:1090500002020202020202020202020202020202F0 +:1090600002020202020202020202020202020202E0 +:1090700002020202020202020202020202020202D0 +:1090800002020202020202020202020202020202C0 +:1090900002020202020202020202020202020202B0 +:1090A00002020202020202020202020202020202A0 +:1090B0000202020202020202020202020202020290 +:1090C0000202020202020202020202020202020280 +:1090D0000202020202020202020202020202020270 +:1090E0000202020202020202020202020202020260 +:1090F0000202020202020202020202020202020250 +:10910000020202020202020202020202020202023F +:10911000020202020202020202020202020202022F +:10912000020202020202020202020202020202021F +:10913000020202020202020202020202020202020F +:1091400002020202020202020202020202020202FF +:1091500002020202020202020202020202020202EF +:1091600002020202020202020202020202020202DF +:1091700002020202020202020202020202020202CF +:1091800002020202020202020202020202020202BF +:1091900002020202020202020202020202020202AF +:1091A000020202020202020202020202020202029F +:1091B000020202020202020202020202020202028F +:1091C000020202020202020202020202020202027F +:1091D000020202020202020202020202020202026F +:1091E000020202020202020202020202020202025F +:1091F000020202020202020202020202020202024F +:10920000020202020202020202020202020202023E +:10921000020202020202020202020202020202022E +:10922000020202020202020202020202020202021E +:10923000020202020202020202020202020202020E +:1092400002020202020202020202020202020202FE +:1092500002020202020202020202020202020202EE +:1092600002020202020202020202020202020202DE +:1092700002020202020202020202020202020202CE +:1092800002020202020202020202020202020202BE +:1092900002020202020202020202020202020202AE +:1092A000020202020202020202020202020202029E +:1092B000020202020202020202020202020202028E +:1092C000020202020202020202020202020202027E +:1092D000020202020202020202020202020202026E +:1092E000020202020202020202020202020202025E +:1092F000020202020202020202020202020202024E +:10930000020202020202020202020202020202023D +:10931000020202020202020202020202020202022D +:10932000020202020202020202020202020202021D +:10933000020202020202020202020202020202020D +:1093400002020202020202020202020202020202FD +:1093500002020202020202020202020202020202ED +:1093600002020202020202020202020202020202DD +:1093700002020202020202020202020202020202CD +:1093800002020202020202020202020202020202BD +:1093900002020202020202020202020202020202AD +:1093A000020202020202020202020202020202029D +:1093B000020202020202020202020202020202028D +:1093C000020202020202020202020202020202027D +:1093D000020202020202020202020202020202026D +:1093E000020202020202020202020202020202025D +:1093F000020202020202020202020202020202024D +:10940000020202020202020202020202020202023C +:10941000020202020202020202020202020202022C +:10942000020202020202020202020202020202021C +:10943000020202020202020202020202020202020C +:1094400002020202020202020202020202020202FC +:1094500002020202020202020202020202020202EC +:1094600002020202020202020202020202020202DC +:1094700002020202020202020202020202020202CC +:1094800002020202020202020202020202020202BC +:1094900002020202020202020202020202020202AC +:1094A000020202020202020202020202020202029C +:1094B000020202020202020202020202020202028C +:1094C000020202020202020202020202020202027C +:1094D000020202020202020202020202020202026C +:1094E000020202020202020202020202020202025C +:1094F000020202020202020202020202020202024C +:10950000020202020202020202020202020202023B +:10951000020202020202020202020202020202022B +:10952000020202020202020202020202020202021B +:10953000020202020202020202020202020202020B +:1095400002020202020202020202020202020202FB +:1095500002020202020202020202020202020202EB +:1095600002020202020202020202020202020202DB +:1095700002020202020202020202020202020202CB +:1095800002020202020202020202020202020202BB +:1095900002020202020202020202020202020202AB +:1095A000020202020202020202020202020202029B +:1095B000020202020202020202020202020202028B +:1095C000020202020202020202020202020202027B +:1095D000020202020202020202020202020202026B +:1095E000020202020202020202020202020202025B +:1095F000020202020202020202020202020202024B +:10960000020202020202020202020202020202023A +:10961000020202020202020202020202020202022A +:10962000020202020202020202020202020202021A +:10963000020202020202020202020202020202020A +:1096400002020202020202020202020202020202FA +:1096500002020202020202020202020202020202EA +:1096600002020202020202020202020202020202DA +:1096700002020202020202020202020202020202CA +:1096800002020202020202020202020202020202BA +:1096900002020202020202020202020202020202AA +:1096A000020202020202020202020202020202029A +:1096B000020202020202020202020202020202028A +:1096C000020202020202020202020202020202027A +:1096D000020202020202020202020202020202026A +:1096E000020202020202020202020202020202025A +:1096F000020202020202020202020202020202024A +:109700000202020202020202020202020202020239 +:109710000202020202020202020202020202020229 +:109720000202020202020202020202020202020219 +:109730000202020202020202020202020202020209 +:1097400002020202020202020202020202020202F9 +:1097500002020202020202020202020202020202E9 +:1097600002020202020202020202020202020202D9 +:1097700002020202020202020202020202020202C9 +:1097800002020202020202020202020202020202B9 +:1097900002020202020202020202020202020202A9 +:1097A0000202020202020202020202020202020299 +:1097B0000202020202020202020202020202020289 +:1097C0000202020202020202020202020202020279 +:1097D0000202020202020202020202020202020269 +:1097E0000202020202020202020202020202020259 +:1097F0000202020202020202020202020202020249 +:109800000202020202020202020202020202020238 +:109810000202020202020202020202020202020228 +:109820000202020202020202020202020202020218 +:109830000202020202020202020202020202020208 +:1098400002020202020202020202020202020202F8 +:1098500002020202020202020202020202020202E8 +:1098600002020202020202020202020202020202D8 +:1098700002020202020202020202020202020202C8 +:1098800002020202020202020202020202020202B8 +:1098900002020202020202020202020202020202A8 +:1098A0000202020202020202020202020202020298 +:1098B0000202020202020202020202020202020288 +:1098C0000202020202020202020202020202020278 +:1098D0000202020202020202020202020202020268 +:1098E0000202020202020202020202020202020258 +:1098F0000202020202020202020202020202020248 +:109900000202020202020202020202020202020237 +:109910000202020202020202020202020202020227 +:109920000202020202020202020202020202020217 +:109930000202020202020202020202020202020207 +:1099400002020202020202020202020202020202F7 +:1099500002020202020202020202020202020202E7 +:1099600002020202020202020202020202020202D7 +:1099700002020202020202020202020202020202C7 +:1099800002020202020202020202020202020202B7 +:1099900002020202020202020202020202020202A7 +:1099A0000202020202020202020202020202020297 +:1099B0000202020202020202020202020202020287 +:1099C0000202020202020202020202020202020277 +:1099D0000202020202020202020202020202020267 +:1099E0000202020202020202020202020202020257 +:1099F0000202020202020202020202020202020247 +:109A00000202020202020202020202020202020236 +:109A10000202020202020200000000000000000038 +:109A20000000000000000000000000000000000036 +:109A30000000000000000000000000000000000026 +:109A40000000000000000000000000000000000016 +:109A50000000000000000000000000000000000006 +:109A600000000000000000000000000000000000F6 +:109A700000000000000000000000000000000000E6 +:109A800000000000000000000000000000000000D6 +:109A900000000000000000000000000000000000C6 +:109AA00000000000000000000000000000000000B6 +:109AB00000000000000000000000000000000000A6 +:109AC0000000000000000000000000000000000096 +:109AD0000000000000000000000000000000000086 +:109AE0000000000000000000000000000000000076 +:109AF0000000000000000000000000000000000066 +:109B00000000000000000000000000000000000055 +:109B10000000000000000000000000000000000045 +:109B20000000000000000000000000000000000035 +:109B30000000000000000000000000000000000025 +:109B40000000000000000000000000000000000015 +:109B50000000000000000000000000000000000005 +:109B600000000000000000000000000000000000F5 +:109B700000000000000000000000000000000000E5 +:109B800000000000000000000000000000000000D5 +:109B900000000000000000000000000000000000C5 +:109BA00000000000000000000000000000000000B5 +:109BB00000000000000000000000000000000000A5 +:109BC0000000000000000000000000000000000095 +:109BD0000000000000000000000000000000000085 +:109BE0000000000000000000000000000000000075 +:109BF0000000000000000000000000000000000065 +:109C00000000000000000000000000000000000054 +:109C10000000000000000000000000000000000044 +:109C20000000000000000000000000000000000034 +:109C30000000000000000000000000000000000024 +:109C40000000000000000000000000000000000014 +:109C50000000000000000000000000000000000004 +:109C600000000000000000000000000000000000F4 +:109C700000000000000000000000000000000000E4 +:109C800000000000000000000000000000000000D4 +:109C900000000000000000000000000000000000C4 +:109CA00000000000000000000000000000000000B4 +:109CB00000000000000000000000000000000000A4 +:109CC0000000000000000000000000000000000094 +:109CD0000000000000000000000000000000000084 +:109CE0000000000000000000000000000000000074 +:109CF0000000000000000000000000000000000064 +:109D00000000000000000000000000000000000053 +:109D10000000000000000000000000000000000043 +:109D20000000000000000000000000000000000033 +:109D30000000000000000000000000000000000023 +:109D40000000000000000000000000000000000013 +:109D50000000000000000000000000000000000003 +:109D600000000000000000000000000000000000F3 +:109D700000000000000000000000000000000000E3 +:109D800000000000000000000000000000000000D3 +:109D900000000000000000000000000000000000C3 +:109DA00000000000000000000000000000000000B3 +:109DB00000000000000000000000000000000000A3 +:109DC0000000000000000000000000000000000093 +:109DD0000000000000000000000000000000000083 +:109DE0000000000000000000000000000000000073 +:109DF0000000000000000000000000000000000063 +:109E00000000000000000000000000000000000052 +:109E10000000000000000000000000000000000042 +:109E20000000000000000000000000000000000032 +:109E30000000000000000000000000000000000022 +:109E40000000000000000000000000000000000012 +:109E50000000000000000000000000000000000002 +:109E600000000000000000000000000000000000F2 +:109E700000000000000000000000000000000000E2 +:109E800000000000000000000000000000000000D2 +:109E900000000000000000000000000000000000C2 +:109EA00000000000000000000000000000000000B2 +:109EB00000000000000000000000000000000000A2 +:109EC0000000000000000000000000000000000092 +:109ED0000000000000000000000000000000000082 +:109EE0000000000000000000000000000000000072 +:109EF0000000000000000000000000000000000062 +:109F00000000000000000000000000000000000051 +:109F10000000000000000000000000000000000041 +:109F20000000000000000000000000000000000031 +:109F30000000000000000000000000000000000021 +:109F40000000000000000000000000000000000011 +:109F50000000000000000000000000000000000001 +:109F600000000000000000000000000000000000F1 +:109F700000000000000000000000000000000000E1 +:109F800000000000000000000000000000000000D1 +:109F900000000000000000000000000000000000C1 +:109FA00000000000000000000000000000000000B1 +:109FB00000000000000000000000000000000000A1 +:109FC0000000000000000000000000000000000091 +:109FD0000000000000000000000000000000000081 +:109FE0000000000000000000000000000000000071 +:109FF0000000000000000000000000000000000061 +:10A000000000000000000000000000000000000050 +:10A010000000000000000000000000000000000040 +:10A020000000000000000000000000000000000030 +:10A030000000000000000000000000000000000020 +:10A040000000000000000000000000000000000010 +:10A050000000000000000000000000000000000000 +:10A0600000000000000000000000000000000000F0 +:10A0700000000000000000000000000000000000E0 +:10A0800000000000000000000000000000000000D0 +:10A0900000000000000000000000000000000000C0 +:10A0A00000000000000000000000000000000000B0 +:10A0B00000000000000000000000000000000000A0 +:10A0C0000000000000000000000000000000000090 +:10A0D0000000000000000000000000000000000080 +:10A0E0000000000000000000000000000000000070 +:10A0F0000000000000000000000000000000000060 +:10A10000000000000000000000000000000000004F +:10A110000000000000000001010101010101010136 +:10A12000010101010101010101010101010101011F +:10A13000010101010101010101010101010101010F +:10A1400001010101010101010101010101010101FF +:10A1500001010101010101010101010101010101EF +:10A1600001010101010101010101010101010101DF +:10A1700001010101010101010101010101010101CF +:10A1800001010101010101010101010101010101BF +:10A1900001010101010101010101010101010101AF +:10A1A000010101010101010101010101010101019F +:10A1B000010101010101010101010101010101018F +:10A1C000010101010101010101010101010101017F +:10A1D000010101010101010101010101010101016F +:10A1E000010101010101010101010101010101015F +:10A1F000010101010101010101010101010101014F +:10A20000010101010101010101010101010101013E +:10A21000010101010101010101010101010101012E +:10A22000010101010101010101010101010101011E +:10A23000010101010101010101010101010101010E +:10A2400001010101010101010101010101010101FE +:10A2500001010101010101010101010101010101EE +:10A2600001010101010101010101010101010101DE +:10A2700001010101010101010101010101010101CE +:10A2800001010101010101010101010101010101BE +:10A2900001010101010101010101010101010101AE +:10A2A000010101010101010101010101010101019E +:10A2B000010101010101010101010101010101018E +:10A2C000010101010101010101010101010101017E +:10A2D000010101010101010101010101010101016E +:10A2E000010101010101010101010101010101015E +:10A2F000010101010101010101010101010101014E +:10A30000010101010101010101010101010101013D +:10A31000010101010101010101010101010101012D +:10A32000010101010101010101010101010101011D +:10A33000010101010101010101010101010101010D +:10A3400001010101010101010101010101010101FD +:10A3500001010101010101010101010101010101ED +:10A3600001010101010101010101010101010101DD +:10A3700001010101010101010101010101010101CD +:10A3800001010101010101010101010101010101BD +:10A3900001010101010101010101010101010101AD +:10A3A000010101010101010101010101010101019D +:10A3B000010101010101010101010101010101018D +:10A3C000010101010101010101010101010101017D +:10A3D000010101010101010101010101010101016D +:10A3E000010101010101010101010101010101015D +:10A3F000010101010101010101010101010101014D +:10A40000010101010101010101010101010101013C +:10A41000010101010101010101010101010101012C +:10A42000010101010101010101010101010101011C +:10A43000010101010101010101010101010101010C +:10A4400001010101010101010101010101010101FC +:10A4500001010101010101010101010101010101EC +:10A4600001010101010101010101010101010101DC +:10A4700001010101010101010101010101010101CC +:10A4800001010101010101010101010101010101BC +:10A4900001010101010101010101010101010101AC +:10A4A000010101010101010101010101010101019C +:10A4B000010101010101010101010101010101018C +:10A4C000010101010101010101010101010101017C +:10A4D000010101010101010101010101010101016C +:10A4E000010101010101010101010101010101015C +:10A4F000010101010101010101010101010101014C +:10A50000010101010101010101010101010101013B +:10A51000010101010101010101010101010101012B +:10A52000010101010101010101010101010101011B +:10A53000010101010101010101010101010101010B +:10A5400001010101010101010101010101010101FB +:10A5500001010101010101010101010101010101EB +:10A5600001010101010101010101010101010101DB +:10A5700001010101010101010101010101010101CB +:10A5800001010101010101010101010101010101BB +:10A5900001010101010101010101010101010101AB +:10A5A000010101010101010101010101010101019B +:10A5B000010101010101010101010101010101018B +:10A5C000010101010101010101010101010101017B +:10A5D000010101010101010101010101010101016B +:10A5E000010101010101010101010101010101015B +:10A5F000010101010101010101010101010101014B +:10A60000010101010101010101010101010101013A +:10A61000010101010101010101010101010101012A +:10A62000010101010101010101010101010101011A +:10A63000010101010101010101010101010101010A +:10A6400001010101010101010101010101010101FA +:10A6500001010101010101010101010101010101EA +:10A6600001010101010101010101010101010101DA +:10A6700001010101010101010101010101010101CA +:10A6800001010101010101010101010101010101BA +:10A6900001010101010101010101010101010101AA +:10A6A000010101010101010101010101010101019A +:10A6B000010101010101010101010101010101018A +:10A6C000010101010101010101010101010101017A +:10A6D000010101010101010101010101010101016A +:10A6E000010101010101010101010101010101015A +:10A6F000010101010101010101010101010101014A +:10A700000101010101010101010101010101010139 +:10A710000101010101010101010101010101010129 +:10A720000101010101010101010101010101010119 +:10A730000101010101010101010101010101010109 +:10A7400001010101010101010101010101010101F9 +:10A7500001010101010101010101010101010101E9 +:10A7600001010101010101010101010101010101D9 +:10A7700001010101010101010101010101010101C9 +:10A7800001010101010101010101010101010101B9 +:10A7900001010101010101010101010101010101A9 +:10A7A0000101010101010101010101010101010199 +:10A7B0000101010101010101010101010101010189 +:10A7C0000101010101010101010101010101010179 +:10A7D0000101010101010101010101010101010169 +:10A7E0000101010101010101010101010101010159 +:10A7F0000101010101010101010101010101010149 +:10A800000101010101010101010101010101010138 +:10A810000101010101010101010101010101010128 +:10A820000101010101010101010101010101010118 +:10A830000101010101010101010101010101010108 +:10A8400001010101010101010101010101010101F8 +:10A8500001010101010101010101010101010101E8 +:10A8600001010101010101010101010101010101D8 +:10A8700001010101010101010101010101010101C8 +:10A8800001010101010101010101010101010101B8 +:10A8900001010101010101010101010101010101A8 +:10A8A0000101010101010101010101010101010198 +:10A8B0000101010101010101010101010101010188 +:10A8C0000101010101010101010101010101010178 +:10A8D0000101010101010101010101010101010168 +:10A8E0000101010101010101010101010101010158 +:10A8F0000101010101010101010101010101010148 +:10A900000101010101010101010101010101010137 +:10A910000101010101010101010101010101010127 +:10A920000101010101010101010101010101010117 +:10A930000101010101010101010101010101010107 +:10A9400001010101010101010101010101010101F7 +:10A9500001010101010101010101010101010101E7 +:10A9600001010101010101010101010101010101D7 +:10A9700001010101010101010101010101010101C7 +:10A9800001010101010101010101010101010101B7 +:10A9900001010101010101010101010101010101A7 +:10A9A0000101010101010101010101010101010197 +:10A9B0000101010101010101010101010101010187 +:10A9C0000101010101010101010101010101010177 +:10A9D0000101010101010101010101010101010167 +:10A9E0000101010101010101010101010101010157 +:10A9F0000101010101010101010101010101010147 +:10AA00000101010101010101010101010101010136 +:10AA10000101010101010101010101010101010126 +:10AA20000101010101010101010101010101010116 +:10AA30000101010101010101010101010101010106 +:10AA400001010101010101010101010101010101F6 +:10AA500001010101010101010101010101010101E6 +:10AA600001010101010101010101010101010101D6 +:10AA700001010101010101010101010101010101C6 +:10AA800001010101010101010101010101010101B6 +:10AA900001010101010101010101010101010101A6 +:10AAA0000101010101010101010101010101010196 +:10AAB0000101010101010101010101010101010186 +:10AAC0000101010101010101010101010101010176 +:10AAD0000101010101010101010101010101010166 +:10AAE0000101010101010101010101010101010156 +:10AAF0000101010101010101010101010101010146 +:10AB00000101010101010101010101010101010135 +:10AB10000101010101010101010101010101010125 +:10AB20000101010101010101010101010101010115 +:10AB30000101010101010101010101010101010105 +:10AB400001010101010101010101010101010101F5 +:10AB500001010101010101010101010101010101E5 +:10AB600001010101010101010101010101010101D5 +:10AB700001010101010101010101010101010101C5 +:10AB800001010101010101010101010101010101B5 +:10AB900001010101010101010101010101010101A5 +:10ABA0000101010101010101010101010101010195 +:10ABB0000101010101010101010101010101010185 +:10ABC0000101010101010101010101010101010175 +:10ABD0000101010101010101010101010101010165 +:10ABE0000101010101010101010101010101010155 +:10ABF0000101010101010101010101010101010145 +:10AC00000101010101010101010101010101010134 +:10AC10000101010101010101010101010101010124 +:10AC20000101010101010101010101010101010114 +:10AC30000101010101010101010101010101010104 +:10AC400001010101010101010101010101010101F4 +:10AC500001010101010101010101010101010101E4 +:10AC600001010101010101010101010101010101D4 +:10AC700001010101010101010101010101010101C4 +:10AC800001010101010101010101010101010101B4 +:10AC900001010101010101010101010101010101A4 +:10ACA0000101010101010101010101010101010194 +:10ACB0000101010101010101010101010101010184 +:10ACC0000101010101010101010101010101010174 +:10ACD0000101010101010101010101010101010164 +:10ACE0000101010101010101010101010101010154 +:10ACF0000101010101010101010101010101010144 +:10AD00000101010101010101010101010101010133 +:10AD10000101010101010101010101010101010123 +:10AD20000101010101010101010101010101010113 +:10AD30000101010101010101010101010101010103 +:10AD400001010101010101010101010101010101F3 +:10AD500001010101010101010101010101010101E3 +:10AD600001010101010101010101010101010101D3 +:10AD700001010101010101010101010101010101C3 +:10AD800001010101010101010101010101010101B3 +:10AD900001010101010101010101010101010101A3 +:10ADA0000101010101010101010101010101010193 +:10ADB0000101010101010101010101010101010183 +:10ADC0000101010101010101010101010101010173 +:10ADD0000101010101010101010101010101010163 +:10ADE0000101010101010101010101010101010153 +:10ADF0000101010101010101010101010101010143 +:10AE00000101010101010101010101010101010132 +:10AE10000101010101010101010101010101010122 +:10AE20000101010101010101010101010101010112 +:10AE30000101010101010101010101010101010102 +:10AE400001010101010101010101010101010101F2 +:10AE500001010101010101010101010101010101E2 +:10AE600001010101010101010101010101010101D2 +:10AE700001010101010101010101010101010101C2 +:10AE800001010101010101010101010101010101B2 +:10AE900001010101010101010101010101010101A2 +:10AEA0000101010101010101010101010101010192 +:10AEB0000101010101010101010101010101010182 +:10AEC0000101010101010101010101010101010172 +:10AED0000101010101010101010101010101010162 +:10AEE0000101010101010101010101010101010152 +:10AEF0000101010101010101010101010101010142 +:10AF00000101010101010101010101010101010131 +:10AF10000101010101010101010101010101010121 +:10AF20000101010101010101010101010101010111 +:10AF30000101010101010101010101010101010101 +:10AF400001010101010101010101010101010101F1 +:10AF500001010101010101010101010101010101E1 +:10AF600001010101010101010101010101010101D1 +:10AF700001010101010101010101010101010101C1 +:10AF800001010101010101010101010101010101B1 +:10AF900001010101010101010101010101010101A1 +:10AFA0000101010101010101010101010101010191 +:10AFB0000101010101010101010101010101010181 +:10AFC0000101010101010101010101010101010171 +:10AFD0000101010101010101010101010101010161 +:10AFE0000101010101010101010101010101010151 +:10AFF0000101010101010101010101010101010141 +:10B000000101010101010101010101010101010130 +:10B010000101010101010100000000000000000029 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000000000000F0 +:10B0600000000000000000000000000000000000E0 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000000000000000000000000000000000090 +:10B0C0000000000000000000000000000000000080 +:10B0D0000000000000000000000000000000000070 +:10B0E0000000000000000000000000000000000060 +:10B0F0000000000000000000000000000000000050 +:10B10000000000000000000000000000000000003F +:10B11000000000000000000000000000000000002F +:10B12000000000000000000000000000000000001F +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000000FF +:10B1500000000000000000000000000000000000EF +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000000009F +:10B1B000000000000000000000000000000000008F +:10B1C000000000000000000000000000000000007F +:10B1D000000000000000000000000000000000006F +:10B1E000000000000000000000000000000000005F +:10B1F000000000000000000000000000000000004F +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B22000000000000000000000000000000000001E +:10B23000000000000000000000000000000000000E +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B000000000000000000000000000000000008E +:10B2C000000000000000000000000000000000007E +:10B2D000000000000000000000000000000000006E +:10B2E000000000000000000000000000000000005E +:10B2F000000000000000000000000000000000004E +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000000000000007D +:10B3D000000000000000000000000000000000006D +:10B3E000000000000000000000000000000000005D +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000000000000000000000000000000000FC +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B4700000000000000000000000000000000000CC +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000000000000000000007C +:10B4D000000000000000000000000000000000006C +:10B4E000000000000000000000000000000000005C +:10B4F000000000000000000000000000000000004C +:10B50000000000000000000000000000000000003B +:10B51000000000000000000000000000000000002B +:10B52000000000000000000000000000000000001B +:10B53000000000000000000000000000000000000B +:10B5400000000000000000000000000000000000FB +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B5700000000000000000000000000000000000CB +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C000000000000000000000000000000000007B +:10B5D000000000000000000000000000000000006B +:10B5E000000000000000000000000000000000005B +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000000000000000FA +:10B6500000000000000000000000000000000000EA +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000039 +:10B710000000000000000002020202020202020217 +:10B7200002020202020202020202020202020202F9 +:10B7300002020202020202020202020202020202E9 +:10B7400002020202020202020202020202020202D9 +:10B7500002020202020202020202020202020202C9 +:10B7600002020202020202020202020202020202B9 +:10B7700002020202020202020202020202020202A9 +:10B780000202020202020202020202020202020299 +:10B790000202020202020202020202020202020289 +:10B7A0000202020202020202020202020202020279 +:10B7B0000202020202020202020202020202020269 +:10B7C0000202020202020202020202020202020259 +:10B7D0000202020202020202020202020202020249 +:10B7E0000202020202020202020202020202020239 +:10B7F0000202020202020202020202020202020229 +:10B800000202020202020202020202020202020218 +:10B810000202020202020202020202020202020208 +:10B8200002020202020202020202020202020202F8 +:10B8300002020202020202020202020202020202E8 +:10B8400002020202020202020202020202020202D8 +:10B8500002020202020202020202020202020202C8 +:10B8600002020202020202020202020202020202B8 +:10B8700002020202020202020202020202020202A8 +:10B880000202020202020202020202020202020298 +:10B890000202020202020202020202020202020288 +:10B8A0000202020202020202020202020202020278 +:10B8B0000202020202020202020202020202020268 +:10B8C0000202020202020202020202020202020258 +:10B8D0000202020202020202020202020202020248 +:10B8E0000202020202020202020202020202020238 +:10B8F0000202020202020202020202020202020228 +:10B900000202020202020202020202020202020217 +:10B910000202020202020202020202020202020207 +:10B9200002020202020202020202020202020202F7 +:10B9300002020202020202020202020202020202E7 +:10B9400002020202020202020202020202020202D7 +:10B9500002020202020202020202020202020202C7 +:10B9600002020202020202020202020202020202B7 +:10B9700002020202020202020202020202020202A7 +:10B980000202020202020202020202020202020297 +:10B990000202020202020202020202020202020287 +:10B9A0000202020202020202020202020202020277 +:10B9B0000202020202020202020202020202020267 +:10B9C0000202020202020202020202020202020257 +:10B9D0000202020202020202020202020202020247 +:10B9E0000202020202020202020202020202020237 +:10B9F0000202020202020202020202020202020227 +:10BA00000202020202020202020202020202020216 +:10BA10000202020202020202020202020202020206 +:10BA200002020202020202020202020202020202F6 +:10BA300002020202020202020202020202020202E6 +:10BA400002020202020202020202020202020202D6 +:10BA500002020202020202020202020202020202C6 +:10BA600002020202020202020202020202020202B6 +:10BA700002020202020202020202020202020202A6 +:10BA80000202020202020202020202020202020296 +:10BA90000202020202020202020202020202020286 +:10BAA0000202020202020202020202020202020276 +:10BAB0000202020202020202020202020202020266 +:10BAC0000202020202020202020202020202020256 +:10BAD0000202020202020202020202020202020246 +:10BAE0000202020202020202020202020202020236 +:10BAF0000202020202020202020202020202020226 +:10BB00000202020202020202020202020202020215 +:10BB10000202020202020202020202020202020205 +:10BB200002020202020202020202020202020202F5 +:10BB300002020202020202020202020202020202E5 +:10BB400002020202020202020202020202020202D5 +:10BB500002020202020202020202020202020202C5 +:10BB600002020202020202020202020202020202B5 +:10BB700002020202020202020202020202020202A5 +:10BB80000202020202020202020202020202020295 +:10BB90000202020202020202020202020202020285 +:10BBA0000202020202020202020202020202020275 +:10BBB0000202020202020202020202020202020265 +:10BBC0000202020202020202020202020202020255 +:10BBD0000202020202020202020202020202020245 +:10BBE0000202020202020202020202020202020235 +:10BBF0000202020202020202020202020202020225 +:10BC00000202020202020202020202020202020214 +:10BC10000202020202020202020202020202020204 +:10BC200002020202020202020202020202020202F4 +:10BC300002020202020202020202020202020202E4 +:10BC400002020202020202020202020202020202D4 +:10BC500002020202020202020202020202020202C4 +:10BC600002020202020202020202020202020202B4 +:10BC700002020202020202020202020202020202A4 +:10BC80000202020202020202020202020202020294 +:10BC90000202020202020202020202020202020284 +:10BCA0000202020202020202020202020202020274 +:10BCB0000202020202020202020202020202020264 +:10BCC0000202020202020202020202020202020254 +:10BCD0000202020202020202020202020202020244 +:10BCE0000202020202020202020202020202020234 +:10BCF0000202020202020202020202020202020224 +:10BD00000202020202020202020202020202020213 +:10BD10000202020202020202020202020202020203 +:10BD200002020202020202020202020202020202F3 +:10BD300002020202020202020202020202020202E3 +:10BD400002020202020202020202020202020202D3 +:10BD500002020202020202020202020202020202C3 +:10BD600002020202020202020202020202020202B3 +:10BD700002020202020202020202020202020202A3 +:10BD80000202020202020202020202020202020293 +:10BD90000202020202020202020202020202020283 +:10BDA0000202020202020202020202020202020273 +:10BDB0000202020202020202020202020202020263 +:10BDC0000202020202020202020202020202020253 +:10BDD0000202020202020202020202020202020243 +:10BDE0000202020202020202020202020202020233 +:10BDF0000202020202020202020202020202020223 +:10BE00000202020202020202020202020202020212 +:10BE10000202020202020202020202020202020202 +:10BE200002020202020202020202020202020202F2 +:10BE300002020202020202020202020202020202E2 +:10BE400002020202020202020202020202020202D2 +:10BE500002020202020202020202020202020202C2 +:10BE600002020202020202020202020202020202B2 +:10BE700002020202020202020202020202020202A2 +:10BE80000202020202020202020202020202020292 +:10BE90000202020202020202020202020202020282 +:10BEA0000202020202020202020202020202020272 +:10BEB0000202020202020202020202020202020262 +:10BEC0000202020202020202020202020202020252 +:10BED0000202020202020202020202020202020242 +:10BEE0000202020202020202020202020202020232 +:10BEF0000202020202020202020202020202020222 +:10BF00000202020202020202020202020202020211 +:10BF10000202020202020202020202020202020201 +:10BF200002020202020202020202020202020202F1 +:10BF300002020202020202020202020202020202E1 +:10BF400002020202020202020202020202020202D1 +:10BF500002020202020202020202020202020202C1 +:10BF600002020202020202020202020202020202B1 +:10BF700002020202020202020202020202020202A1 +:10BF80000202020202020202020202020202020291 +:10BF90000202020202020202020202020202020281 +:10BFA0000202020202020202020202020202020271 +:10BFB0000202020202020202020202020202020261 +:10BFC0000202020202020202020202020202020251 +:10BFD0000202020202020202020202020202020241 +:10BFE0000202020202020202020202020202020231 +:10BFF0000202020202020202020202020202020221 +:10C000000202020202020202020202020202020210 +:10C010000202020202020202020202020202020200 +:10C0200002020202020202020202020202020202F0 +:10C0300002020202020202020202020202020202E0 +:10C0400002020202020202020202020202020202D0 +:10C0500002020202020202020202020202020202C0 +:10C0600002020202020202020202020202020202B0 +:10C0700002020202020202020202020202020202A0 +:10C080000202020202020202020202020202020290 +:10C090000202020202020202020202020202020280 +:10C0A0000202020202020202020202020202020270 +:10C0B0000202020202020202020202020202020260 +:10C0C0000202020202020202020202020202020250 +:10C0D0000202020202020202020202020202020240 +:10C0E0000202020202020202020202020202020230 +:10C0F0000202020202020202020202020202020220 +:10C10000020202020202020202020202020202020F +:10C1100002020202020202020202020202020202FF +:10C1200002020202020202020202020202020202EF +:10C1300002020202020202020202020202020202DF +:10C1400002020202020202020202020202020202CF +:10C1500002020202020202020202020202020202BF +:10C1600002020202020202020202020202020202AF +:10C17000020202020202020202020202020202029F +:10C18000020202020202020202020202020202028F +:10C19000020202020202020202020202020202027F +:10C1A000020202020202020202020202020202026F +:10C1B000020202020202020202020202020202025F +:10C1C000020202020202020202020202020202024F +:10C1D000020202020202020202020202020202023F +:10C1E000020202020202020202020202020202022F +:10C1F000020202020202020202020202020202021F +:10C20000020202020202020202020202020202020E +:10C2100002020202020202020202020202020202FE +:10C2200002020202020202020202020202020202EE +:10C2300002020202020202020202020202020202DE +:10C2400002020202020202020202020202020202CE +:10C2500002020202020202020202020202020202BE +:10C2600002020202020202020202020202020202AE +:10C27000020202020202020202020202020202029E +:10C28000020202020202020202020202020202028E +:10C29000020202020202020202020202020202027E +:10C2A000020202020202020202020202020202026E +:10C2B000020202020202020202020202020202025E +:10C2C000020202020202020202020202020202024E +:10C2D000020202020202020202020202020202023E +:10C2E000020202020202020202020202020202022E +:10C2F000020202020202020202020202020202021E +:10C30000020202020202020202020202020202020D +:10C3100002020202020202020202020202020202FD +:10C3200002020202020202020202020202020202ED +:10C3300002020202020202020202020202020202DD +:10C3400002020202020202020202020202020202CD +:10C3500002020202020202020202020202020202BD +:10C3600002020202020202020202020202020202AD +:10C37000020202020202020202020202020202029D +:10C38000020202020202020202020202020202028D +:10C39000020202020202020202020202020202027D +:10C3A000020202020202020202020202020202026D +:10C3B000020202020202020202020202020202025D +:10C3C000020202020202020202020202020202024D +:10C3D000020202020202020202020202020202023D +:10C3E000020202020202020202020202020202022D +:10C3F000020202020202020202020202020202021D +:10C40000020202020202020202020202020202020C +:10C4100002020202020202020202020202020202FC +:10C4200002020202020202020202020202020202EC +:10C4300002020202020202020202020202020202DC +:10C4400002020202020202020202020202020202CC +:10C4500002020202020202020202020202020202BC +:10C4600002020202020202020202020202020202AC +:10C47000020202020202020202020202020202029C +:10C48000020202020202020202020202020202028C +:10C49000020202020202020202020202020202027C +:10C4A000020202020202020202020202020202026C +:10C4B000020202020202020202020202020202025C +:10C4C000020202020202020202020202020202024C +:10C4D000020202020202020202020202020202023C +:10C4E000020202020202020202020202020202022C +:10C4F000020202020202020202020202020202021C +:10C50000020202020202020202020202020202020B +:10C5100002020202020202020202020202020202FB +:10C5200002020202020202020202020202020202EB +:10C5300002020202020202020202020202020202DB +:10C5400002020202020202020202020202020202CB +:10C5500002020202020202020202020202020202BB +:10C5600002020202020202020202020202020202AB +:10C57000020202020202020202020202020202029B +:10C58000020202020202020202020202020202028B +:10C59000020202020202020202020202020202027B +:10C5A000020202020202020202020202020202026B +:10C5B000020202020202020202020202020202025B +:10C5C000020202020202020202020202020202024B +:10C5D000020202020202020202020202020202023B +:10C5E000020202020202020202020202020202022B +:10C5F000020202020202020202020202020202021B +:10C60000020202020202020202020202020202020A +:10C61000020202020202020000000000000000000C +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000000CA +:10C6700000000000000000000000000000000000BA +:10C6800000000000000000000000000000000000AA +:10C69000000000000000000000000000000000009A +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D000000000000000000000000000000000005A +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C710000000000000000000000000000000000019 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000000000000000D9 +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F0000000000000000000000000000000000039 +:10C800000000000000000000000000000000000028 +:10C810000000000000000000000000000000000018 +:10C820000000000000000000000000000000000008 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000000000000000000000C8 +:10C8700000000000000000000000000000000000B8 +:10C8800000000000000000000000000000000000A8 +:10C890000000000000000000000000000000000098 +:10C8A0000000000000000000000000000000000088 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E0000000000000000000000000000000000048 +:10C8F0000000000000000000000000000000000038 +:10C900000000000000000000000000000000000027 +:10C910000000000000000000000000000000000017 +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000000000000000000000000C7 +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A0000000000000000000000000000000000087 +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E0000000000000000000000000000000000047 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA100000000000000000550000000000000001C0 +:10CA200001010101010101010101010101010101F6 +:10CA300001010101010101010101010101010101E6 +:10CA400001010101010101010101010101010101D6 +:10CA500001010101010101010101010101010101C6 +:10CA600001010101010101010101010101010101B6 +:10CA700001010101010101010101010101010101A6 +:10CA80000101010101010101010101010101010196 +:10CA90000101010101010101010101010101010186 +:10CAA0000101010101010101010101010101010176 +:10CAB0000101010101010101010101010101010166 +:10CAC0000101010101010101010101010101010156 +:10CAD0000101010101010101010101010101010146 +:10CAE0000101010101010101010101010101010136 +:10CAF0000101010101010101010101010101010126 +:10CB00000101010101010101010101010101010115 +:10CB10000101010101010101010101010101010105 +:10CB200001010101010101010101010101010101F5 +:10CB300001010101010101010101010101010101E5 +:10CB400001010101010101010101010101010101D5 +:10CB500001010101010101010101010101010101C5 +:10CB600001010101010101010101010101010101B5 +:10CB700001010101010101010101010101010101A5 +:10CB80000101010101010101010101010101010195 +:10CB90000101010101010101010101010101010185 +:10CBA0000101010101010101010101010101010175 +:10CBB0000101010101010101010101010101010165 +:10CBC0000101010101010101010101010101010155 +:10CBD0000101010101010101010101010101010145 +:10CBE0000101010101010101010101010101010135 +:10CBF0000101010101010101010101010101010125 +:10CC00000101010101010101010101010101010114 +:10CC10000101010101010101010101010101010104 +:10CC200001010101010101010101010101010101F4 +:10CC300001010101010101010101010101010101E4 +:10CC400001010101010101010101010101010101D4 +:10CC500001010101010101010101010101010101C4 +:10CC600001010101010101010101010101010101B4 +:10CC700001010101010101010101010101010101A4 +:10CC80000101010101010101010101010101010194 +:10CC90000101010101010101010101010101010184 +:10CCA0000101010101010101010101010101010174 +:10CCB0000101010101010101010101010101010164 +:10CCC0000101010101010101010101010101010154 +:10CCD0000101010101010101010101010101010144 +:10CCE0000101010101010101010101010101010134 +:10CCF0000101010101010101010101010101010124 +:10CD00000101010101010101010101010101010113 +:10CD10000101010101010101010101010101010103 +:10CD200001010101010101010101010101010101F3 +:10CD300001010101010101010101010101010101E3 +:10CD400001010101010101010101010101010101D3 +:10CD500001010101010101010101010101010101C3 +:10CD600001010101010101010101010101010101B3 +:10CD700001010101010101010101010101010101A3 +:10CD80000101010101010101010101010101010193 +:10CD90000101010101010101010101010101010183 +:10CDA0000101010101010101010101010101010173 +:10CDB0000101010101010101010101010101010163 +:10CDC0000101010101010101010101010101010153 +:10CDD0000101010101010101010101010101010143 +:10CDE0000101010101010101010101010101010133 +:10CDF0000101010101010101010101010101010123 +:10CE00000101010101010101010101010101010112 +:10CE10000101010101010101010101010101010102 +:10CE200001010101010101010101010101010101F2 +:10CE300001010101010101010101010101010101E2 +:10CE400001010101010101010101010101010101D2 +:10CE500001010101010101010101010101010101C2 +:10CE600001010101010101010101010101010101B2 +:10CE700001010101010101010101010101010101A2 +:10CE80000101010101010101010101010101010192 +:10CE90000101010101010101010101010101010182 +:10CEA0000101010101010101010101010101010172 +:10CEB0000101010101010101010101010101010162 +:10CEC0000101010101010101010101010101010152 +:10CED0000101010101010101010101010101010142 +:10CEE0000101010101010101010101010101010132 +:10CEF0000101010101010101010101010101010122 +:10CF00000101010101010101010101010101010111 +:10CF10000101010101010101010101010101010101 +:10CF200001010101010101010101010101010101F1 +:10CF300001010101010101010101010101010101E1 +:10CF400001010101010101010101010101010101D1 +:10CF500001010101010101010101010101010101C1 +:10CF600001010101010101010101010101010101B1 +:10CF700001010101010101010101010101010101A1 +:10CF80000101010101010101010101010101010191 +:10CF90000101010101010101010101010101010181 +:10CFA0000101010101010101010101010101010171 +:10CFB0000101010101010101010101010101010161 +:10CFC0000101010101010101010101010101010151 +:10CFD0000101010101010101010101010101010141 +:10CFE0000101010101010101010101010101010131 +:10CFF0000101010101010101010101010101010121 +:10D000000101010101010101010101010101010110 +:10D010000101010101010101010101010101010100 +:10D0200001010101010101010101010101010101F0 +:10D0300001010101010101010101010101010101E0 +:10D0400001010101010101010101010101010101D0 +:10D0500001010101010101010101010101010101C0 +:10D0600001010101010101010101010101010101B0 +:10D0700001010101010101010101010101010101A0 +:10D080000101010101010101010101010101010190 +:10D090000101010101010101010101010101010180 +:10D0A0000101010101010101010101010101010170 +:10D0B0000101010101010101010101010101010160 +:10D0C0000101010101010101010101010101010150 +:10D0D0000101010101010101010101010101010140 +:10D0E0000101010101010101010101010101010130 +:10D0F0000101010101010101010101010101010120 +:10D10000010101010101010101010101010101010F +:10D1100001010101010101010101010101010101FF +:10D1200001010101010101010101010101010101EF +:10D1300001010101010101010101010101010101DF +:10D1400001010101010101010101010101010101CF +:10D1500001010101010101010101010101010101BF +:10D1600001010101010101010101010101010101AF +:10D17000010101010101010101010101010101019F +:10D18000010101010101010101010101010101018F +:10D19000010101010101010101010101010101017F +:10D1A000010101010101010101010101010101016F +:10D1B000010101010101010101010101010101015F +:10D1C000010101010101010101010101010101014F +:10D1D000010101010101010101010101010101013F +:10D1E000010101010101010101010101010101012F +:10D1F000010101010101010101010101010101011F +:10D20000010101010101010101010101010101010E +:10D2100001010101010101010101010101010101FE +:10D2200001010101010101010101010101010101EE +:10D2300001010101010101010101010101010101DE +:10D2400001010101010101010101010101010101CE +:10D2500001010101010101010101010101010101BE +:10D2600001010101010101010101010101010101AE +:10D27000010101010101010101010101010101019E +:10D28000010101010101010101010101010101018E +:10D29000010101010101010101010101010101017E +:10D2A000010101010101010101010101010101016E +:10D2B000010101010101010101010101010101015E +:10D2C000010101010101010101010101010101014E +:10D2D000010101010101010101010101010101013E +:10D2E000010101010101010101010101010101012E +:10D2F000010101010101010101010101010101011E +:10D30000010101010101010101010101010101010D +:10D3100001010101010101010101010101010101FD +:10D3200001010101010101010101010101010101ED +:10D3300001010101010101010101010101010101DD +:10D3400001010101010101010101010101010101CD +:10D3500001010101010101010101010101010101BD +:10D3600001010101010101010101010101010101AD +:10D37000010101010101010101010101010101019D +:10D38000010101010101010101010101010101018D +:10D39000010101010101010101010101010101017D +:10D3A000010101010101010101010101010101016D +:10D3B000010101010101010101010101010101015D +:10D3C000010101010101010101010101010101014D +:10D3D000010101010101010101010101010101013D +:10D3E000010101010101010101010101010101012D +:10D3F000010101010101010101010101010101011D +:10D40000010101010101010101010101010101010C +:10D4100001010101010101010101010101010101FC +:10D4200001010101010101010101010101010101EC +:10D4300001010101010101010101010101010101DC +:10D4400001010101010101010101010101010101CC +:10D4500001010101010101010101010101010101BC +:10D4600001010101010101010101010101010101AC +:10D47000010101010101010101010101010101019C +:10D48000010101010101010101010101010101018C +:10D49000010101010101010101010101010101017C +:10D4A000010101010101010101010101010101016C +:10D4B000010101010101010101010101010101015C +:10D4C000010101010101010101010101010101014C +:10D4D000010101010101010101010101010101013C +:10D4E000010101010101010101010101010101012C +:10D4F000010101010101010101010101010101011C +:10D50000010101010101010101010101010101010B +:10D5100001010101010101010101010101010101FB +:10D5200001010101010101010101010101010101EB +:10D5300001010101010101010101010101010101DB +:10D5400001010101010101010101010101010101CB +:10D5500001010101010101010101010101010101BB +:10D5600001010101010101010101010101010101AB +:10D57000010101010101010101010101010101019B +:10D58000010101010101010101010101010101018B +:10D59000010101010101010101010101010101017B +:10D5A000010101010101010101010101010101016B +:10D5B000010101010101010101010101010101015B +:10D5C000010101010101010101010101010101014B +:10D5D000010101010101010101010101010101013B +:10D5E000010101010101010101010101010101012B +:10D5F000010101010101010101010101010101011B +:10D60000010101010101010101010101010101010A +:10D6100001010101010101010101010101010101FA +:10D6200001010101010101010101010101010101EA +:10D6300001010101010101010101010101010101DA +:10D6400001010101010101010101010101010101CA +:10D6500001010101010101010101010101010101BA +:10D6600001010101010101010101010101010101AA +:10D67000010101010101010101010101010101019A +:10D68000010101010101010101010101010101018A +:10D69000010101010101010101010101010101017A +:10D6A000010101010101010101010101010101016A +:10D6B000010101010101010101010101010101015A +:10D6C000010101010101010101010101010101014A +:10D6D000010101010101010101010101010101013A +:10D6E000010101010101010101010101010101012A +:10D6F000010101010101010101010101010101011A +:10D700000101010101010101010101010101010109 +:10D7100001010101010101010101010101010101F9 +:10D7200001010101010101010101010101010101E9 +:10D7300001010101010101010101010101010101D9 +:10D7400001010101010101010101010101010101C9 +:10D7500001010101010101010101010101010101B9 +:10D7600001010101010101010101010101010101A9 +:10D770000101010101010101010101010101010199 +:10D780000101010101010101010101010101010189 +:10D790000101010101010101010101010101010179 +:10D7A0000101010101010101010101010101010169 +:10D7B0000101010101010101010101010101010159 +:10D7C0000101010101010101010101010101010149 +:10D7D0000101010101010101010101010101010139 +:10D7E0000101010101010101010101010101010129 +:10D7F0000101010101010101010101010101010119 +:10D800000101010101010101010101010101010108 +:10D8100001010101010101010101010101010100F9 +:10D8200000000000000000000000000000000000F8 +:10D8300000000000000000000000000000000000E8 +:10D8400000000000000000000000000000000000D8 +:10D8500000000000000000000000000000000000C8 +:10D8600000000000000000000000000000000000B8 +:10D8700000000000000000000000000000000000A8 +:10D880000000000000000000000000000000000098 +:10D890000000000000000000000000000000000088 +:10D8A0000000000000000000000000000000000078 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000000000000000000000058 +:10D8D0000000000000000000000000000000000048 +:10D8E0000000000000000000000000000000000038 +:10D8F0000000000000000000000000000000000028 +:10D900000000000000000000000000000000000017 +:10D910000000000000000000000000000000000007 +:10D9200000000000000000000000000000000000F7 +:10D9300000000000000000000000000000000000E7 +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D9600000000000000000000000000000000000B7 +:10D9700000000000000000000000000000000000A7 +:10D980000000000000000000000000000000000097 +:10D990000000000000000000000000000000000087 +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000047 +:10D9E0000000000000000000000000000000000037 +:10D9F0000000000000000000000000000000000027 +:10DA00000000000000000000000000000000000016 +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000000000000000000000F6 +:10DA300000000000000000000000000000000000E6 +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000000C6 +:10DA600000000000000000000000000000000000B6 +:10DA700000000000000000000000000000000000A6 +:10DA80000000000000000000000000000000000096 +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000000000000000000000000076 +:10DAB0000000000000000000000000000000000066 +:10DAC0000000000000000000000000000000000056 +:10DAD0000000000000000000000000000000000046 +:10DAE0000000000000000000000000000000000036 +:10DAF0000000000000000000000000000000000026 +:10DB00000000000000000000000000000000000015 +:10DB10000000000000000000000000000000000005 +:10DB200000000000000000000000000000000000F5 +:10DB300000000000000000000000000000000000E5 +:10DB400000000000000000000000000000000000D5 +:10DB500000000000000000000000000000000000C5 +:10DB600000000000000000000000000000000000B5 +:10DB700000000000000000000000000000000000A5 +:10DB80000000000000000000000000000000000095 +:10DB90000000000000000000000000000000000085 +:10DBA0000000000000000000000000000000000075 +:10DBB0000000000000000000000000000000000065 +:10DBC0000000000000000000000000000000000055 +:10DBD0000000000000000000000000000000000045 +:10DBE0000000000000000000000000000000000035 +:10DBF0000000000000000000000000000000000025 +:10DC00000000000000000000000000000000000014 +:10DC10000000000000000000000000000000000004 +:10DC200000000000000000000000000000000000F4 +:10DC300000000000000000000000000000000000E4 +:10DC400000000000000000000000000000000000D4 +:10DC500000000000000000000000000000000000C4 +:10DC600000000000000000000000000000000000B4 +:10DC700000000000000000000000000000000000A4 +:10DC80000000000000000000000000000000000094 +:10DC90000000000000000000000000000000000084 +:10DCA0000000000000000000000000000000000074 +:10DCB0000000000000000000000000000000000064 +:10DCC0000000000000000000000000000000000054 +:10DCD0000000000000000000000000000000000044 +:10DCE0000000000000000000000000000000000034 +:10DCF0000000000000000000000000000000000024 +:10DD00000000000000000000000000000000000013 +:10DD10000000000000000000000000000000000003 +:10DD200000000000000000000000000000000000F3 +:10DD300000000000000000000000000000000000E3 +:10DD400000000000000000000000000000000000D3 +:10DD500000000000000000000000000000000000C3 +:10DD600000000000000000000000000000000000B3 +:10DD700000000000000000000000000000000000A3 +:10DD80000000000000000000000000000000000093 +:10DD90000000000000000000000000000000000083 +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 +:10DDC0000000000000000000000000000000000053 +:10DDD0000000000000000000000000000000000043 +:10DDE0000000000000000000000000000000000033 +:10DDF0000000000000000000000000000000000023 +:10DE00000000000000000000000000000000000012 +:10DE10000000000000000000000000000000000002 +:10DE200000000000000000000000000000000000F2 +:10DE300000000000000000000000000000000000E2 +:10DE400000000000000000000000000000000000D2 +:10DE500000000000000000000000000000000000C2 +:10DE600000000000000000000000000000000000B2 +:10DE700000000000000000000000000000000000A2 +:10DE80000000000000000000000000000000000092 +:10DE90000000000000000000000000000000000082 +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC0000000000000000000000000000000000052 +:10DED0000000000000000000000000000000000042 +:10DEE0000000000000000000000000000000000032 +:10DEF0000000000000000000000000000000000022 +:10DF00000000000000000000000000000000000011 +:10DF100000000000000000000000000000000002FF +:10DF200002020202020202020202020202020202D1 +:10DF300002020202020202020202020202020202C1 +:10DF400002020202020202020202020202020202B1 +:10DF500002020202020202020202020202020202A1 +:10DF60000202020202020202020202020202020291 +:10DF70000202020202020202020202020202020281 +:10DF80000202020202020202020202020202020271 +:10DF90000202020202020202020202020202020261 +:10DFA0000202020202020202020202020202020251 +:10DFB0000202020202020202020202020202020241 +:10DFC0000202020202020202020202020202020231 +:10DFD0000202020202020202020202020202020221 +:10DFE0000202020202020202020202020202020211 +:10DFF0000202020202020202020202020202020201 +:10E0000002020202020202020202020202020202F0 +:10E0100002020202020202020202020202020202E0 +:10E0200002020202020202020202020202020202D0 +:10E0300002020202020202020202020202020202C0 +:10E0400002020202020202020202020202020202B0 +:10E0500002020202020202020202020202020202A0 +:10E060000202020202020202020202020202020290 +:10E070000202020202020202020202020202020280 +:10E080000202020202020202020202020202020270 +:10E090000202020202020202020202020202020260 +:10E0A0000202020202020202020202020202020250 +:10E0B0000202020202020202020202020202020240 +:10E0C0000202020202020202020202020202020230 +:10E0D0000202020202020202020202020202020220 +:10E0E0000202020202020202020202020202020210 +:10E0F0000202020202020202020202020202020200 +:10E1000002020202020202020202020202020202EF +:10E1100002020202020202020202020202020202DF +:10E1200002020202020202020202020202020202CF +:10E1300002020202020202020202020202020202BF +:10E1400002020202020202020202020202020202AF +:10E15000020202020202020202020202020202029F +:10E16000020202020202020202020202020202028F +:10E17000020202020202020202020202020202027F +:10E18000020202020202020202020202020202026F +:10E19000020202020202020202020202020202025F +:10E1A000020202020202020202020202020202024F +:10E1B000020202020202020202020202020202023F +:10E1C000020202020202020202020202020202022F +:10E1D000020202020202020202020202020202021F +:10E1E000020202020202020202020202020202020F +:10E1F00002020202020202020202020202020202FF +:10E2000002020202020202020202020202020202EE +:10E2100002020202020202020202020202020202DE +:10E2200002020202020202020202020202020202CE +:10E2300002020202020202020202020202020202BE +:10E2400002020202020202020202020202020202AE +:10E25000020202020202020202020202020202029E +:10E26000020202020202020202020202020202028E +:10E27000020202020202020202020202020202027E +:10E28000020202020202020202020202020202026E +:10E29000020202020202020202020202020202025E +:10E2A000020202020202020202020202020202024E +:10E2B000020202020202020202020202020202023E +:10E2C000020202020202020202020202020202022E +:10E2D000020202020202020202020202020202021E +:10E2E000020202020202020202020202020202020E +:10E2F00002020202020202020202020202020202FE +:10E3000002020202020202020202020202020202ED +:10E3100002020202020202020202020202020202DD +:10E3200002020202020202020202020202020202CD +:10E3300002020202020202020202020202020202BD +:10E3400002020202020202020202020202020202AD +:10E35000020202020202020202020202020202029D +:10E36000020202020202020202020202020202028D +:10E37000020202020202020202020202020202027D +:10E38000020202020202020202020202020202026D +:10E39000020202020202020202020202020202025D +:10E3A000020202020202020202020202020202024D +:10E3B000020202020202020202020202020202023D +:10E3C000020202020202020202020202020202022D +:10E3D000020202020202020202020202020202021D +:10E3E000020202020202020202020202020202020D +:10E3F00002020202020202020202020202020202FD +:10E4000002020202020202020202020202020202EC +:10E4100002020202020202020202020202020202DC +:10E4200002020202020202020202020202020202CC +:10E4300002020202020202020202020202020202BC +:10E4400002020202020202020202020202020202AC +:10E45000020202020202020202020202020202029C +:10E46000020202020202020202020202020202028C +:10E47000020202020202020202020202020202027C +:10E48000020202020202020202020202020202026C +:10E49000020202020202020202020202020202025C +:10E4A000020202020202020202020202020202024C +:10E4B000020202020202020202020202020202023C +:10E4C000020202020202020202020202020202022C +:10E4D000020202020202020202020202020202021C +:10E4E000020202020202020202020202020202020C +:10E4F00002020202020202020202020202020202FC +:10E5000002020202020202020202020202020202EB +:10E5100002020202020202020202020202020202DB +:10E5200002020202020202020202020202020202CB +:10E5300002020202020202020202020202020202BB +:10E5400002020202020202020202020202020202AB +:10E55000020202020202020202020202020202029B +:10E56000020202020202020202020202020202028B +:10E57000020202020202020202020202020202027B +:10E58000020202020202020202020202020202026B +:10E59000020202020202020202020202020202025B +:10E5A000020202020202020202020202020202024B +:10E5B000020202020202020202020202020202023B +:10E5C000020202020202020202020202020202022B +:10E5D000020202020202020202020202020202021B +:10E5E000020202020202020202020202020202020B +:10E5F00002020202020202020202020202020202FB +:10E6000002020202020202020202020202020202EA +:10E6100002020202020202020202020202020202DA +:10E6200002020202020202020202020202020202CA +:10E6300002020202020202020202020202020202BA +:10E6400002020202020202020202020202020202AA +:10E65000020202020202020202020202020202029A +:10E66000020202020202020202020202020202028A +:10E67000020202020202020202020202020202027A +:10E68000020202020202020202020202020202026A +:10E69000020202020202020202020202020202025A +:10E6A000020202020202020202020202020202024A +:10E6B000020202020202020202020202020202023A +:10E6C000020202020202020202020202020202022A +:10E6D000020202020202020202020202020202021A +:10E6E000020202020202020202020202020202020A +:10E6F00002020202020202020202020202020202FA +:10E7000002020202020202020202020202020202E9 +:10E7100002020202020202020202020202020202D9 +:10E7200002020202020202020202020202020202C9 +:10E7300002020202020202020202020202020202B9 +:10E7400002020202020202020202020202020202A9 +:10E750000202020202020202020202020202020299 +:10E760000202020202020202020202020202020289 +:10E770000202020202020202020202020202020279 +:10E780000202020202020202020202020202020269 +:10E790000202020202020202020202020202020259 +:10E7A0000202020202020202020202020202020249 +:10E7B0000202020202020202020202020202020239 +:10E7C0000202020202020202020202020202020229 +:10E7D0000202020202020202020202020202020219 +:10E7E0000202020202020202020202020202020209 +:10E7F00002020202020202020202020202020202F9 +:10E8000002020202020202020202020202020202E8 +:10E8100002020202020202020202020202020202D8 +:10E8200002020202020202020202020202020202C8 +:10E8300002020202020202020202020202020202B8 +:10E8400002020202020202020202020202020202A8 +:10E850000202020202020202020202020202020298 +:10E860000202020202020202020202020202020288 +:10E870000202020202020202020202020202020278 +:10E880000202020202020202020202020202020268 +:10E890000202020202020202020202020202020258 +:10E8A0000202020202020202020202020202020248 +:10E8B0000202020202020202020202020202020238 +:10E8C0000202020202020202020202020202020228 +:10E8D0000202020202020202020202020202020218 +:10E8E0000202020202020202020202020202020208 +:10E8F00002020202020202020202020202020202F8 +:10E9000002020202020202020202020202020202E7 +:10E9100002020202020202020202020202020202D7 +:10E9200002020202020202020202020202020202C7 +:10E9300002020202020202020202020202020202B7 +:10E9400002020202020202020202020202020202A7 +:10E950000202020202020202020202020202020297 +:10E960000202020202020202020202020202020287 +:10E970000202020202020202020202020202020277 +:10E980000202020202020202020202020202020267 +:10E990000202020202020202020202020202020257 +:10E9A0000202020202020202020202020202020247 +:10E9B0000202020202020202020202020202020237 +:10E9C0000202020202020202020202020202020227 +:10E9D0000202020202020202020202020202020217 +:10E9E0000202020202020202020202020202020207 +:10E9F00002020202020202020202020202020202F7 +:10EA000002020202020202020202020202020202E6 +:10EA100002020202020202020202020202020202D6 +:10EA200002020202020202020202020202020202C6 +:10EA300002020202020202020202020202020202B6 +:10EA400002020202020202020202020202020202A6 +:10EA50000202020202020202020202020202020296 +:10EA60000202020202020202020202020202020286 +:10EA70000202020202020202020202020202020276 +:10EA80000202020202020202020202020202020266 +:10EA90000202020202020202020202020202020256 +:10EAA0000202020202020202020202020202020246 +:10EAB0000202020202020202020202020202020236 +:10EAC0000202020202020202020202020202020226 +:10EAD0000202020202020202020202020202020216 +:10EAE0000202020202020202020202020202020206 +:10EAF00002020202020202020202020202020202F6 +:10EB000002020202020202020202020202020202E5 +:10EB100002020202020202020202020202020202D5 +:10EB200002020202020202020202020202020202C5 +:10EB300002020202020202020202020202020202B5 +:10EB400002020202020202020202020202020202A5 +:10EB50000202020202020202020202020202020295 +:10EB60000202020202020202020202020202020285 +:10EB70000202020202020202020202020202020275 +:10EB80000202020202020202020202020202020265 +:10EB90000202020202020202020202020202020255 +:10EBA0000202020202020202020202020202020245 +:10EBB0000202020202020202020202020202020235 +:10EBC0000202020202020202020202020202020225 +:10EBD0000202020202020202020202020202020215 +:10EBE0000202020202020202020202020202020205 +:10EBF00002020202020202020202020202020202F5 +:10EC000002020202020202020202020202020202E4 +:10EC100002020202020202020202020202020202D4 +:10EC200002020202020202020202020202020202C4 +:10EC300002020202020202020202020202020202B4 +:10EC400002020202020202020202020202020202A4 +:10EC50000202020202020202020202020202020294 +:10EC60000202020202020202020202020202020284 +:10EC70000202020202020202020202020202020274 +:10EC80000202020202020202020202020202020264 +:10EC90000202020202020202020202020202020254 +:10ECA0000202020202020202020202020202020244 +:10ECB0000202020202020202020202020202020234 +:10ECC0000202020202020202020202020202020224 +:10ECD0000202020202020202020202020202020214 +:10ECE0000202020202020202020202020202020204 +:10ECF00002020202020202020202020202020202F4 +:10ED000002020202020202020202020202020202E3 +:10ED100002020202020202020202020202020200D5 +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000000000000000000000000B3 +:10ED600000000000000000000000000000000000A3 +:10ED70000000000000000000000000000000000093 +:10ED80000000000000000000000000000000000083 +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000000000000000000000000000002 +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000092 +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000000000000000000000000000000000F0 +:10F0200000000000000000000000000000000000E0 +:10F0300000000000000000000000000000000000D0 +:10F0400000000000000000000000000000000000C0 +:10F0500000000000000000000000000000000000B0 +:10F0600000000000000000000000000000000000A0 +:10F070000000000000000000000000000000000090 +:10F080000000000000000000000000000000000080 +:10F090000000000000000000000000000000000070 +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D0000000000000000000000000000000000030 +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F1100000000000000000000000000000000000EF +:10F1200000000000000000000000000000000000DF +:10F1300000000000000000000000000000000000CF +:10F1400000000000000000000000000000000000BF +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000000000009F +:10F17000000000000000000000000000000000008F +:10F18000000000000000000000000000000000007F +:10F19000000000000000000000000000000000006F +:10F1A000000000000000000000000000000000005F +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F +:10F1D000000000000000000000000000000000002F +:10F1E000000000000000000000000000000000001F +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE +:10F2100000000000000000000000000000000000EE +:10F2200000000000000000000000000000000000DE +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000000000000000BE +:10F2500000000000000000000000000000000000AE +:10F26000000000000000000000000000000000009E +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000000000000007E +:10F29000000000000000000000000000000000006E +:10F2A000000000000000000000000000000000005E +:10F2B000000000000000000000000000000000004E +:10F2C000000000000000000000000000000000003E +:10F2D000000000000000000000000000000000002E +:10F2E000000000000000000000000000000000001E +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000000000FD +:10F3100000000000000000000000000000000000ED +:10F3200000000000000000000000000000000000DD +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F36000000000000000000000000000000000009D +:10F37000000000000000000000000000000000008D +:10F38000000000000000000000000000000000007D +:10F39000000000000000000000000000000000006D +:10F3A000000000000000000000000000000000005D +:10F3B000000000000000000000000000000000004D +:10F3C000000000000000000000000000000000003D +:10F3D000000000000000000000000000000000002D +:10F3E000000000000000000000000000000000001D +:10F3F000000000000000000000000000000000000D +:10F4000000000000000000000000000000000000FC +:10F4100000000000000000000000000000000000EC +:10F4200000000000000000000000000000000000DC +:10F4300000000000000000000000000000000000CC +:10F4400000000000000000000000000000000000BC +:10F4500000000000000000000000000000000000AC +:10F46000000000000000000000000000000000009C +:10F47000000000000000000000000000000000008C +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B000000000000000000000000000000000004C +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B000000000000000000000000000000000004B +:10F5C000000000000000000000000000000000003B +:10F5D000000000000000000000000000000000002B +:10F5E000000000000000000000000000000000001B +:10F5F000000000000000000000000000000000000B +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000001E9 +:10F6200001010101010101010101010101010101CA +:10F6300001010101010101010101010101010101BA +:10F6400001010101010101010101010101010101AA +:10F65000010101010101010101010101010101019A +:10F66000010101010101010101010101010101018A +:10F67000010101010101010101010101010101017A +:10F68000010101010101010101010101010101016A +:10F69000010101010101010101010101010101015A +:10F6A000010101010101010101010101010101014A +:10F6B000010101010101010101010101010101013A +:10F6C000010101010101010101010101010101012A +:10F6D000010101010101010101010101010101011A +:10F6E000010101010101010101010101010101010A +:10F6F00001010101010101010101010101010101FA +:10F7000001010101010101010101010101010101E9 +:10F7100001010101010101010101010101010101D9 +:10F7200001010101010101010101010101010101C9 +:10F7300001010101010101010101010101010101B9 +:10F7400001010101010101010101010101010101A9 +:10F750000101010101010101010101010101010199 +:10F760000101010101010101010101010101010189 +:10F770000101010101010101010101010101010179 +:10F780000101010101010101010101010101010169 +:10F790000101010101010101010101010101010159 +:10F7A0000101010101010101010101010101010149 +:10F7B0000101010101010101010101010101010139 +:10F7C0000101010101010101010101010101010129 +:10F7D0000101010101010101010101010101010119 +:10F7E0000101010101010101010101010101010109 +:10F7F00001010101010101010101010101010101F9 +:10F8000001010101010101010101010101010101E8 +:10F8100001010101010101010101010101010101D8 +:10F8200001010101010101010101010101010101C8 +:10F8300001010101010101010101010101010101B8 +:10F8400001010101010101010101010101010101A8 +:10F850000101010101010101010101010101010198 +:10F860000101010101010101010101010101010188 +:10F870000101010101010101010101010101010178 +:10F880000101010101010101010101010101010168 +:10F890000101010101010101010101010101010158 +:10F8A0000101010101010101010101010101010148 +:10F8B0000101010101010101010101010101010138 +:10F8C0000101010101010101010101010101010128 +:10F8D0000101010101010101010101010101010118 +:10F8E0000101010101010101010101010101010108 +:10F8F00001010101010101010101010101010101F8 +:10F9000001010101010101010101010101010101E7 +:10F9100001010101010101010101010101010101D7 +:10F9200001010101010101010101010101010101C7 +:10F9300001010101010101010101010101010101B7 +:10F9400001010101010101010101010101010101A7 +:10F950000101010101010101010101010101010197 +:10F960000101010101010101010101010101010187 +:10F970000101010101010101010101010101010177 +:10F980000101010101010101010101010101010167 +:10F990000101010101010101010101010101010157 +:10F9A0000101010101010101010101010101010147 +:10F9B0000101010101010101010101010101010137 +:10F9C0000101010101010101010101010101010127 +:10F9D0000101010101010101010101010101010117 +:10F9E0000101010101010101010101010101010107 +:10F9F00001010101010101010101010101010101F7 +:10FA000001010101010101010101010101010101E6 +:10FA100001010101010101010101010101010101D6 +:10FA200001010101010101010101010101010101C6 +:10FA300001010101010101010101010101010101B6 +:10FA400001010101010101010101010101010101A6 +:10FA50000101010101010101010101010101010196 +:10FA60000101010101010101010101010101010186 +:10FA70000101010101010101010101010101010176 +:10FA80000101010101010101010101010101010166 +:10FA90000101010101010101010101010101010156 +:10FAA0000101010101010101010101010101010146 +:10FAB0000101010101010101010101010101010136 +:10FAC0000101010101010101010101010101010126 +:10FAD0000101010101010101010101010101010116 +:10FAE0000101010101010101010101010101010106 +:10FAF00001010101010101010101010101010101F6 +:10FB000001010101010101010101010101010101E5 +:10FB100001010101010101010101010101010101D5 +:10FB200001010101010101010101010101010101C5 +:10FB300001010101010101010101010101010101B5 +:10FB400001010101010101010101010101010101A5 +:10FB50000101010101010101010101010101010195 +:10FB60000101010101010101010101010101010185 +:10FB70000101010101010101010101010101010175 +:10FB80000101010101010101010101010101010165 +:10FB90000101010101010101010101010101010155 +:10FBA0000101010101010101010101010101010145 +:10FBB0000101010101010101010101010101010135 +:10FBC0000101010101010101010101010101010125 +:10FBD0000101010101010101010101010101010115 +:10FBE0000101010101010101010101010101010105 +:10FBF00001010101010101010101010101010101F5 +:10FC000001010101010101010101010101010101E4 +:10FC100001010101010101010101010101010101D4 +:10FC200001010101010101010101010101010101C4 +:10FC300001010101010101010101010101010101B4 +:10FC400001010101010101010101010101010101A4 +:10FC50000101010101010101010101010101010194 +:10FC60000101010101010101010101010101010184 +:10FC70000101010101010101010101010101010174 +:10FC80000101010101010101010101010101010164 +:10FC90000101010101010101010101010101010154 +:10FCA0000101010101010101010101010101010144 +:10FCB0000101010101010101010101010101010134 +:10FCC0000101010101010101010101010101010124 +:10FCD0000101010101010101010101010101010114 +:10FCE0000101010101010101010101010101010104 +:10FCF00001010101010101010101010101010101F4 +:10FD000001010101010101010101010101010101E3 +:10FD100001010101010101010101010101010101D3 +:10FD200001010101010101010101010101010101C3 +:10FD300001010101010101010101010101010101B3 +:10FD400001010101010101010101010101010101A3 +:10FD50000101010101010101010101010101010193 +:10FD60000101010101010101010101010101010183 +:10FD70000101010101010101010101010101010173 +:10FD80000101010101010101010101010101010163 +:10FD90000101010101010101010101010101010153 +:10FDA0000101010101010101010101010101010143 +:10FDB0000101010101010101010101010101010133 +:10FDC0000101010101010101010101010101010123 +:10FDD0000101010101010101010101010101010113 +:10FDE0000101010101010101010101010101010103 +:10FDF00001010101010101010101010101010101F3 +:10FE000001010101010101010101010101010101E2 +:10FE100001010101010101010101010101010101D2 +:10FE200001010101010101010101010101010101C2 +:10FE300001010101010101010101010101010101B2 +:10FE400001010101010101010101010101010101A2 +:10FE50000101010101010101010101010101010192 +:10FE60000101010101010101010101010101010182 +:10FE70000101010101010101010101010101010172 +:10FE80000101010101010101010101010101010162 +:10FE90000101010101010101010101010101010152 +:10FEA0000101010101010101010101010101010142 +:10FEB0000101010101010101010101010101010132 +:10FEC0000101010101010101010101010101010122 +:10FED0000101010101010101010101010101010112 +:10FEE0000101010101010101010101010101010102 +:10FEF00001010101010101010101010101010101F2 +:10FF000001010101010101010101010101010101E1 +:10FF100001010101010101010101010101010101D1 +:10FF200001010101010101010101010101010101C1 +:10FF300001010101010101010101010101010101B1 +:10FF400001010101010101010101010101010101A1 +:10FF50000101010101010101010101010101010191 +:10FF60000101010101010101010101010101010181 +:10FF70000101010101010101010101010101010171 +:10FF80000101010101010101010101010101010161 +:10FF90000101010101010101010101010101010151 +:10FFA0000101010101010101010101010101010141 +:10FFB0000101010101010101010101010101010131 +:10FFC0000101010101010101010101010101010121 +:10FFD0000101010101010101010101010101010111 +:10FFE0000101010101010101010101010101010101 +:10FFF00001010101010101010101010101010101F1 +:020000024000BC +:1000000001010101010101010101010101010101E0 +:1000100001010101010101010101010101010101D0 +:1000200001010101010101010101010101010101C0 +:1000300001010101010101010101010101010101B0 +:1000400001010101010101010101010101010101A0 +:100050000101010101010101010101010101010190 +:100060000101010101010101010101010101010180 +:100070000101010101010101010101010101010170 +:100080000101010101010101010101010101010160 +:100090000101010101010101010101010101010150 +:1000A0000101010101010101010101010101010140 +:1000B0000101010101010101010101010101010130 +:1000C0000101010101010101010101010101010120 +:1000D0000101010101010101010101010101010110 +:1000E0000101010101010101010101010101010100 +:1000F00001010101010101010101010101010101F0 +:1001000001010101010101010101010101010101DF +:1001100001010101010101010101010101010101CF +:1001200001010101010101010101010101010101BF +:1001300001010101010101010101010101010101AF +:10014000010101010101010101010101010101019F +:10015000010101010101010101010101010101018F +:10016000010101010101010101010101010101017F +:10017000010101010101010101010101010101016F +:10018000010101010101010101010101010101015F +:10019000010101010101010101010101010101014F +:1001A000010101010101010101010101010101013F +:1001B000010101010101010101010101010101012F +:1001C000010101010101010101010101010101011F +:1001D000010101010101010101010101010101010F +:1001E00001010101010101010101010101010101FF +:1001F00001010101010101010101010101010101EF +:1002000001010101010101010101010101010101DE +:1002100001010101010101010101010101010101CE +:1002200001010101010101010101010101010101BE +:1002300001010101010101010101010101010101AE +:10024000010101010101010101010101010101019E +:10025000010101010101010101010101010101018E +:10026000010101010101010101010101010101017E +:10027000010101010101010101010101010101016E +:10028000010101010101010101010101010101015E +:10029000010101010101010101010101010101014E +:1002A000010101010101010101010101010101013E +:1002B000010101010101010101010101010101012E +:1002C000010101010101010101010101010101011E +:1002D000010101010101010101010101010101010E +:1002E00001010101010101010101010101010101FE +:1002F00001010101010101010101010101010101EE +:1003000001010101010101010101010101010101DD +:1003100001010101010101010101010101010101CD +:1003200001010101010101010101010101010101BD +:1003300001010101010101010101010101010101AD +:10034000010101010101010101010101010101019D +:10035000010101010101010101010101010101018D +:10036000010101010101010101010101010101017D +:10037000010101010101010101010101010101016D +:10038000010101010101010101010101010101015D +:10039000010101010101010101010101010101014D +:1003A000010101010101010101010101010101013D +:1003B000010101010101010101010101010101012D +:1003C000010101010101010101010101010101011D +:1003D000010101010101010101010101010101010D +:1003E00001010101010101010101010101010101FD +:1003F00001010101010101010101010101010101ED +:1004000001010101010101010101010101010101DC +:1004100001010101010101010101010101010100CD +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:1005300000000000000000000000000000000000BB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000000000000000003B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000000EA +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000000000000000000000BA +:1006400000000000000000000000000000000000AA +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:10068000000000000000000000000000000000006A +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C000000000000000000000000000000000002A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000000000000FA +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000000B8 +:1008400000000000000000000000000000000000A8 +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:100890000000000000000000000000000000000058 +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000000000000000000028 +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:1009100000000000000000000000000000000000D7 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000000000000000000000B7 +:1009400000000000000000000000000000000000A7 +:100950000000000000000000000000000000000097 +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000000000000000000000C6 +:100A300000000000000000000000000000000000B6 +:100A400000000000000000000000000000000000A6 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA0000000000000000000000000000000000046 +:100AB0000000000000000000000000000000000036 +:100AC0000000000000000000000000000000000026 +:100AD0000000000000000000000000000000000016 +:100AE0000000000000000000000000000000000006 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000002D3 +:100B200002020202020202020202020202020202A5 +:100B30000202020202020202020202020202020295 +:100B40000202020202020202020202020202020285 +:100B50000202020202020202020202020202020275 +:100B60000202020202020202020202020202020265 +:100B70000202020202020202020202020202020255 +:100B80000202020202020202020202020202020245 +:100B90000202020202020202020202020202020235 +:100BA0000202020202020202020202020202020225 +:100BB0000202020202020202020202020202020215 +:100BC0000202020202020202020202020202020205 +:100BD00002020202020202020202020202020202F5 +:100BE00002020202020202020202020202020202E5 +:100BF00002020202020202020202020202020202D5 +:100C000002020202020202020202020202020202C4 +:100C100002020202020202020202020202020202B4 +:100C200002020202020202020202020202020202A4 +:100C30000202020202020202020202020202020294 +:100C40000202020202020202020202020202020284 +:100C50000202020202020202020202020202020274 +:100C60000202020202020202020202020202020264 +:100C70000202020202020202020202020202020254 +:100C80000202020202020202020202020202020244 +:100C90000202020202020202020202020202020234 +:100CA0000202020202020202020202020202020224 +:100CB0000202020202020202020202020202020214 +:100CC0000202020202020202020202020202020204 +:100CD00002020202020202020202020202020202F4 +:100CE00002020202020202020202020202020202E4 +:100CF00002020202020202020202020202020202D4 +:100D000002020202020202020202020202020202C3 +:100D100002020202020202020202020202020202B3 +:100D200002020202020202020202020202020202A3 +:100D30000202020202020202020202020202020293 +:100D40000202020202020202020202020202020283 +:100D50000202020202020202020202020202020273 +:100D60000202020202020202020202020202020263 +:100D70000202020202020202020202020202020253 +:100D80000202020202020202020202020202020243 +:100D90000202020202020202020202020202020233 +:100DA0000202020202020202020202020202020223 +:100DB0000202020202020202020202020202020213 +:100DC0000202020202020202020202020202020203 +:100DD00002020202020202020202020202020202F3 +:100DE00002020202020202020202020202020202E3 +:100DF00002020202020202020202020202020202D3 +:100E000002020202020202020202020202020202C2 +:100E100002020202020202020202020202020202B2 +:100E200002020202020202020202020202020202A2 +:100E30000202020202020202020202020202020292 +:100E40000202020202020202020202020202020282 +:100E50000202020202020202020202020202020272 +:100E60000202020202020202020202020202020262 +:100E70000202020202020202020202020202020252 +:100E80000202020202020202020202020202020242 +:100E90000202020202020202020202020202020232 +:100EA0000202020202020202020202020202020222 +:100EB0000202020202020202020202020202020212 +:100EC0000202020202020202020202020202020202 +:100ED00002020202020202020202020202020202F2 +:100EE00002020202020202020202020202020202E2 +:100EF00002020202020202020202020202020202D2 +:100F000002020202020202020202020202020202C1 +:100F100002020202020202020202020202020202B1 +:100F200002020202020202020202020202020202A1 +:100F30000202020202020202020202020202020291 +:100F40000202020202020202020202020202020281 +:100F50000202020202020202020202020202020271 +:100F60000202020202020202020202020202020261 +:100F70000202020202020202020202020202020251 +:100F80000202020202020202020202020202020241 +:100F90000202020202020202020202020202020231 +:100FA0000202020202020202020202020202020221 +:100FB0000202020202020202020202020202020211 +:100FC0000202020202020202020202020202020201 +:100FD00002020202020202020202020202020202F1 +:100FE00002020202020202020202020202020202E1 +:100FF00002020202020202020202020202020202D1 +:1010000002020202020202020202020202020202C0 +:1010100002020202020202020202020202020202B0 +:1010200002020202020202020202020202020202A0 +:101030000202020202020202020202020202020290 +:101040000202020202020202020202020202020280 +:101050000202020202020202020202020202020270 +:101060000202020202020202020202020202020260 +:101070000202020202020202020202020202020250 +:101080000202020202020202020202020202020240 +:101090000202020202020202020202020202020230 +:1010A0000202020202020202020202020202020220 +:1010B0000202020202020202020202020202020210 +:1010C0000202020202020202020202020202020200 +:1010D00002020202020202020202020202020202F0 +:1010E00002020202020202020202020202020202E0 +:1010F00002020202020202020202020202020202D0 +:1011000002020202020202020202020202020202BF +:1011100002020202020202020202020202020202AF +:10112000020202020202020202020202020202029F +:10113000020202020202020202020202020202028F +:10114000020202020202020202020202020202027F +:10115000020202020202020202020202020202026F +:10116000020202020202020202020202020202025F +:10117000020202020202020202020202020202024F +:10118000020202020202020202020202020202023F +:10119000020202020202020202020202020202022F +:1011A000020202020202020202020202020202021F +:1011B000020202020202020202020202020202020F +:1011C00002020202020202020202020202020202FF +:1011D00002020202020202020202020202020202EF +:1011E00002020202020202020202020202020202DF +:1011F00002020202020202020202020202020202CF +:1012000002020202020202020202020202020202BE +:1012100002020202020202020202020202020202AE +:10122000020202020202020202020202020202029E +:10123000020202020202020202020202020202028E +:10124000020202020202020202020202020202027E +:10125000020202020202020202020202020202026E +:10126000020202020202020202020202020202025E +:10127000020202020202020202020202020202024E +:10128000020202020202020202020202020202023E +:10129000020202020202020202020202020202022E +:1012A000020202020202020202020202020202021E +:1012B000020202020202020202020202020202020E +:1012C00002020202020202020202020202020202FE +:1012D00002020202020202020202020202020202EE +:1012E00002020202020202020202020202020202DE +:1012F00002020202020202020202020202020202CE +:1013000002020202020202020202020202020202BD +:1013100002020202020202020202020202020202AD +:10132000020202020202020202020202020202029D +:10133000020202020202020202020202020202028D +:10134000020202020202020202020202020202027D +:10135000020202020202020202020202020202026D +:10136000020202020202020202020202020202025D +:10137000020202020202020202020202020202024D +:10138000020202020202020202020202020202023D +:10139000020202020202020202020202020202022D +:1013A000020202020202020202020202020202021D +:1013B000020202020202020202020202020202020D +:1013C00002020202020202020202020202020202FD +:1013D00002020202020202020202020202020202ED +:1013E00002020202020202020202020202020202DD +:1013F00002020202020202020202020202020202CD +:1014000002020202020202020202020202020202BC +:1014100002020202020202020202020202020202AC +:10142000020202020202020202020202020202029C +:10143000020202020202020202020202020202028C +:10144000020202020202020202020202020202027C +:10145000020202020202020202020202020202026C +:10146000020202020202020202020202020202025C +:10147000020202020202020202020202020202024C +:10148000020202020202020202020202020202023C +:10149000020202020202020202020202020202022C +:1014A000020202020202020202020202020202021C +:1014B000020202020202020202020202020202020C +:1014C00002020202020202020202020202020202FC +:1014D00002020202020202020202020202020202EC +:1014E00002020202020202020202020202020202DC +:1014F00002020202020202020202020202020202CC +:1015000002020202020202020202020202020202BB +:1015100002020202020202020202020202020202AB +:10152000020202020202020202020202020202029B +:10153000020202020202020202020202020202028B +:10154000020202020202020202020202020202027B +:10155000020202020202020202020202020202026B +:10156000020202020202020202020202020202025B +:10157000020202020202020202020202020202024B +:10158000020202020202020202020202020202023B +:10159000020202020202020202020202020202022B +:1015A000020202020202020202020202020202021B +:1015B000020202020202020202020202020202020B +:1015C00002020202020202020202020202020202FB +:1015D00002020202020202020202020202020202EB +:1015E00002020202020202020202020202020202DB +:1015F00002020202020202020202020202020202CB +:1016000002020202020202020202020202020202BA +:1016100002020202020202020202020202020202AA +:10162000020202020202020202020202020202029A +:10163000020202020202020202020202020202028A +:10164000020202020202020202020202020202027A +:10165000020202020202020202020202020202026A +:10166000020202020202020202020202020202025A +:10167000020202020202020202020202020202024A +:10168000020202020202020202020202020202023A +:10169000020202020202020202020202020202022A +:1016A000020202020202020202020202020202021A +:1016B000020202020202020202020202020202020A +:1016C00002020202020202020202020202020202FA +:1016D00002020202020202020202020202020202EA +:1016E00002020202020202020202020202020202DA +:1016F00002020202020202020202020202020202CA +:1017000002020202020202020202020202020202B9 +:1017100002020202020202020202020202020202A9 +:101720000202020202020202020202020202020299 +:101730000202020202020202020202020202020289 +:101740000202020202020202020202020202020279 +:101750000202020202020202020202020202020269 +:101760000202020202020202020202020202020259 +:101770000202020202020202020202020202020249 +:101780000202020202020202020202020202020239 +:101790000202020202020202020202020202020229 +:1017A0000202020202020202020202020202020219 +:1017B0000202020202020202020202020202020209 +:1017C00002020202020202020202020202020202F9 +:1017D00002020202020202020202020202020202E9 +:1017E00002020202020202020202020202020202D9 +:1017F00002020202020202020202020202020202C9 +:1018000002020202020202020202020202020202B8 +:1018100002020202020202020202020202020202A8 +:101820000202020202020202020202020202020298 +:101830000202020202020202020202020202020288 +:101840000202020202020202020202020202020278 +:101850000202020202020202020202020202020268 +:101860000202020202020202020202020202020258 +:101870000202020202020202020202020202020248 +:101880000202020202020202020202020202020238 +:101890000202020202020202020202020202020228 +:1018A0000202020202020202020202020202020218 +:1018B0000202020202020202020202020202020208 +:1018C00002020202020202020202020202020202F8 +:1018D00002020202020202020202020202020202E8 +:1018E00002020202020202020202020202020202D8 +:1018F00002020202020202020202020202020202C8 +:1019000002020202020202020202020202020202B7 +:1019100002020202020202020202020202020200A9 +:1019200000000000000000000000000000000000B7 +:1019300000000000000000000000000000000000A7 +:101940000000000000000000000000000000000097 +:101950000000000000000000000000000000000087 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:101980000000000000000000000000000000000057 +:101990000000000000000000000000000000000047 +:1019A0000000000000000000000000000000000037 +:1019B0000000000000000000000000000000000027 +:1019C0000000000000000000000000000000000017 +:1019D0000000000000000000000000000000000007 +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000000000000000000000E7 +:101A000000000000000000000000000000000000D6 +:101A100000000000000000000000000000000000C6 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A40000000000000000000000000000000000096 +:101A50000000000000000000000000000000000086 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000000000000000000000000000056 +:101A90000000000000000000000000000000000046 +:101AA0000000000000000000000000000000000036 +:101AB0000000000000000000000000000000000026 +:101AC0000000000000000000000000000000000016 +:101AD0000000000000000000000000000000000006 +:101AE00000000000000000000000000000000000F6 +:101AF00000000000000000000000000000000000E6 +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000000000000000000C5 +:101B200000000000000000000000000000000000B5 +:101B300000000000000000000000000000000000A5 +:101B40000000000000000000000000000000000095 +:101B50000000000000000000000000000000000085 +:101B60000000000000000000000000000000000075 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 +:101BA0000000000000000000000000000000000035 +:101BB0000000000000000000000000000000000025 +:101BC0000000000000000000000000000000000015 +:101BD0000000000000000000000000000000000005 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000000000000000000E5 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000000000000000000000B4 +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000000000000000094 +:101C50000000000000000000000000000000000084 +:101C60000000000000000000000000000000000074 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA0000000000000000000000000000000000034 +:101CB0000000000000000000000000000000000024 +:101CC0000000000000000000000000000000000014 +:101CD0000000000000000000000000000000000004 +:101CE00000000000000000000000000000000000F4 +:101CF00000000000000000000000000000000000E4 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D200000000000000000000000000000000000B3 +:101D300000000000000000000000000000000000A3 +:101D40000000000000000000000000000000000093 +:101D50000000000000000000000000000000000083 +:101D60000000000000000000000000000000000073 +:101D70000000000000000000000000000000000063 +:101D80000000000000000000000000000000000053 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB0000000000000000000000000000000000023 +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000000000000000000003 +:101DE00000000000000000000000000000000000F3 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000000000000000000000A2 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E60000000000000000000000000000000000072 +:101E70000000000000000000000000000000000062 +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000000000000000000032 +:101EB0000000000000000000000000000000000022 +:101EC0000000000000000000000000000000000012 +:101ED0000000000000000000000000000000000002 +:101EE00000000000000000000000000000000000F2 +:101EF00000000000000000000000000000000000E2 +:101F000000000000000000000000000000000000D1 +:101F1000000000000000000000000000000000457C +:101F200000000000000000010101010101010101A8 +:101F30000101010101010101010101010101010191 +:101F40000101010101010101010101010101010181 +:101F50000101010101010101010101010101010171 +:101F60000101010101010101010101010101010161 +:101F70000101010101010101010101010101010151 +:101F80000101010101010101010101010101010141 +:101F90000101010101010101010101010101010131 +:101FA0000101010101010101010101010101010121 +:101FB0000101010101010101010101010101010111 +:101FC0000101010101010101010101010101010101 +:101FD00001010101010101010101010101010101F1 +:101FE00001010101010101010101010101010101E1 +:101FF00001010101010101010101010101010101D1 +:1020000001010101010101010101010101010101C0 +:1020100001010101010101010101010101010101B0 +:1020200001010101010101010101010101010101A0 +:102030000101010101010101010101010101010190 +:102040000101010101010101010101010101010180 +:102050000101010101010101010101010101010170 +:102060000101010101010101010101010101010160 +:102070000101010101010101010101010101010150 +:102080000101010101010101010101010101010140 +:102090000101010101010101010101010101010130 +:1020A0000101010101010101010101010101010120 +:1020B0000101010101010101010101010101010110 +:1020C0000101010101010101010101010101010100 +:1020D00001010101010101010101010101010101F0 +:1020E00001010101010101010101010101010101E0 +:1020F00001010101010101010101010101010101D0 +:1021000001010101010101010101010101010101BF +:1021100001010101010101010101010101010101AF +:10212000010101010101010101010101010101019F +:10213000010101010101010101010101010101018F +:10214000010101010101010101010101010101017F +:10215000010101010101010101010101010101016F +:10216000010101010101010101010101010101015F +:10217000010101010101010101010101010101014F +:10218000010101010101010101010101010101013F +:10219000010101010101010101010101010101012F +:1021A000010101010101010101010101010101011F +:1021B000010101010101010101010101010101010F +:1021C00001010101010101010101010101010101FF +:1021D00001010101010101010101010101010101EF +:1021E00001010101010101010101010101010101DF +:1021F00001010101010101010101010101010101CF +:1022000001010101010101010101010101010101BE +:1022100001010101010101010101010101010101AE +:10222000010101010101010101010101010101019E +:10223000010101010101010101010101010101018E +:10224000010101010101010101010101010101017E +:10225000010101010101010101010101010101016E +:10226000010101010101010101010101010101015E +:10227000010101010101010101010101010101014E +:10228000010101010101010101010101010101013E +:10229000010101010101010101010101010101012E +:1022A000010101010101010101010101010101011E +:1022B000010101010101010101010101010101010E +:1022C00001010101010101010101010101010101FE +:1022D00001010101010101010101010101010101EE +:1022E00001010101010101010101010101010101DE +:1022F00001010101010101010101010101010101CE +:1023000001010101010101010101010101010101BD +:1023100001010101010101010101010101010101AD +:10232000010101010101010101010101010101019D +:10233000010101010101010101010101010101018D +:10234000010101010101010101010101010101017D +:10235000010101010101010101010101010101016D +:10236000010101010101010101010101010101015D +:10237000010101010101010101010101010101014D +:10238000010101010101010101010101010101013D +:10239000010101010101010101010101010101012D +:1023A000010101010101010101010101010101011D +:1023B000010101010101010101010101010101010D +:1023C00001010101010101010101010101010101FD +:1023D00001010101010101010101010101010101ED +:1023E00001010101010101010101010101010101DD +:1023F00001010101010101010101010101010101CD +:1024000001010101010101010101010101010101BC +:1024100001010101010101010101010101010101AC +:10242000010101010101010101010101010101019C +:10243000010101010101010101010101010101018C +:10244000010101010101010101010101010101017C +:10245000010101010101010101010101010101016C +:10246000010101010101010101010101010101015C +:10247000010101010101010101010101010101014C +:10248000010101010101010101010101010101013C +:10249000010101010101010101010101010101012C +:1024A000010101010101010101010101010101011C +:1024B000010101010101010101010101010101010C +:1024C00001010101010101010101010101010101FC +:1024D00001010101010101010101010101010101EC +:1024E00001010101010101010101010101010101DC +:1024F00001010101010101010101010101010101CC +:1025000001010101010101010101010101010101BB +:1025100001010101010101010101010101010101AB +:10252000010101010101010101010101010101019B +:10253000010101010101010101010101010101018B +:10254000010101010101010101010101010101017B +:10255000010101010101010101010101010101016B +:10256000010101010101010101010101010101015B +:10257000010101010101010101010101010101014B +:10258000010101010101010101010101010101013B +:10259000010101010101010101010101010101012B +:1025A000010101010101010101010101010101011B +:1025B000010101010101010101010101010101010B +:1025C00001010101010101010101010101010101FB +:1025D00001010101010101010101010101010101EB +:1025E00001010101010101010101010101010101DB +:1025F00001010101010101010101010101010101CB +:1026000001010101010101010101010101010101BA +:1026100001010101010101010101010101010101AA +:10262000010101010101010101010101010101019A +:10263000010101010101010101010101010101018A +:10264000010101010101010101010101010101017A +:10265000010101010101010101010101010101016A +:10266000010101010101010101010101010101015A +:10267000010101010101010101010101010101014A +:10268000010101010101010101010101010101013A +:10269000010101010101010101010101010101012A +:1026A000010101010101010101010101010101011A +:1026B000010101010101010101010101010101010A +:1026C00001010101010101010101010101010101FA +:1026D00001010101010101010101010101010101EA +:1026E00001010101010101010101010101010101DA +:1026F00001010101010101010101010101010101CA +:1027000001010101010101010101010101010101B9 +:1027100001010101010101010101010101010101A9 +:102720000101010101010101010101010101010199 +:102730000101010101010101010101010101010189 +:102740000101010101010101010101010101010179 +:102750000101010101010101010101010101010169 +:102760000101010101010101010101010101010159 +:102770000101010101010101010101010101010149 +:102780000101010101010101010101010101010139 +:102790000101010101010101010101010101010129 +:1027A0000101010101010101010101010101010119 +:1027B0000101010101010101010101010101010109 +:1027C00001010101010101010101010101010101F9 +:1027D00001010101010101010101010101010101E9 +:1027E00001010101010101010101010101010101D9 +:1027F00001010101010101010101010101010101C9 +:1028000001010101010101010101010101010101B8 +:1028100001010101010101010101010101010101A8 +:102820000101010101010101010101010101010198 +:102830000101010101010101010101010101010188 +:102840000101010101010101010101010101010178 +:102850000101010101010101010101010101010168 +:102860000101010101010101010101010101010158 +:102870000101010101010101010101010101010148 +:102880000101010101010101010101010101010138 +:102890000101010101010101010101010101010128 +:1028A0000101010101010101010101010101010118 +:1028B0000101010101010101010101010101010108 +:1028C00001010101010101010101010101010101F8 +:1028D00001010101010101010101010101010101E8 +:1028E00001010101010101010101010101010101D8 +:1028F00001010101010101010101010101010101C8 +:1029000001010101010101010101010101010101B7 +:1029100001010101010101010101010101010101A7 +:1029200001010101010101000000000000000000A0 +:102930000000000000000000000000000000000097 +:102940000000000000000000000000000000000087 +:102950000000000000000000000000000000000077 +:102960000000000000000000000000000000000067 +:102970000000000000000000000000000000000057 +:102980000000000000000000000000000000000047 +:102990000000000000000000000000000000000037 +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000000000000017 +:1029C0000000000000000000000000000000000007 +:1029D00000000000000000000000000000000000F7 +:1029E00000000000000000000000000000000000E7 +:1029F00000000000000000000000000000000000D7 +:102A000000000000000000000000000000000000C6 +:102A100000000000000000000000000000000000B6 +:102A200000000000000000000000000000000000A6 +:102A30000000000000000000000000000000000096 +:102A40000000000000000000000000000000000086 +:102A50000000000000000000000000000000000076 +:102A60000000000000000000000000000000000066 +:102A70000000000000000000000000000000000056 +:102A80000000000000000000000000000000000046 +:102A90000000000000000000000000000000000036 +:102AA0000000000000000000000000000000000026 +:102AB0000000000000000000000000000000000016 +:102AC0000000000000000000000000000000000006 +:102AD00000000000000000000000000000000000F6 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000000000000D6 +:102B000000000000000000000000000000000000C5 +:102B100000000000000000000000000000000000B5 +:102B200000000000000000000000000000000000A5 +:102B30000000000000000000000000000000000095 +:102B40000000000000000000000000000000000085 +:102B50000000000000000000000000000000000075 +:102B60000000000000000000000000000000000065 +:102B70000000000000000000000000000000000055 +:102B80000000000000000000000000000000000045 +:102B90000000000000000000000000000000000035 +:102BA0000000000000000000000000000000000025 +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 +:102BD00000000000000000000000000000000000F5 +:102BE00000000000000000000000000000000000E5 +:102BF00000000000000000000000000000000000D5 +:102C000000000000000000000000000000000000C4 +:102C100000000000000000000000000000000000B4 +:102C200000000000000000000000000000000000A4 +:102C30000000000000000000000000000000000094 +:102C40000000000000000000000000000000000084 +:102C50000000000000000000000000000000000074 +:102C60000000000000000000000000000000000064 +:102C70000000000000000000000000000000000054 +:102C80000000000000000000000000000000000044 +:102C90000000000000000000000000000000000034 +:102CA0000000000000000000000000000000000024 +:102CB0000000000000000000000000000000000014 +:102CC0000000000000000000000000000000000004 +:102CD00000000000000000000000000000000000F4 +:102CE00000000000000000000000000000000000E4 +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D200000000000000000000000000000000000A3 +:102D30000000000000000000000000000000000093 +:102D40000000000000000000000000000000000083 +:102D50000000000000000000000000000000000073 +:102D60000000000000000000000000000000000063 +:102D70000000000000000000000000000000000053 +:102D80000000000000000000000000000000000043 +:102D90000000000000000000000000000000000033 +:102DA0000000000000000000000000000000000023 +:102DB0000000000000000000000000000000000013 +:102DC0000000000000000000000000000000000003 +:102DD00000000000000000000000000000000000F3 +:102DE00000000000000000000000000000000000E3 +:102DF00000000000000000000000000000000000D3 +:102E000000000000000000000000000000000000C2 +:102E100000000000000000000000000000000000B2 +:102E200000000000000000000000000000000000A2 +:102E30000000000000000000000000000000000092 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000000000000000000000000052 +:102E80000000000000000000000000000000000042 +:102E90000000000000000000000000000000000032 +:102EA0000000000000000000000000000000000022 +:102EB0000000000000000000000000000000000012 +:102EC0000000000000000000000000000000000002 +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000000000E2 +:102EF00000000000000000000000000000000000D2 +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000000000000000000091 +:102F40000000000000000000000000000000000081 +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F70000000000000000000000000000000000051 +:102F80000000000000000000000000000000000041 +:102F90000000000000000000000000000000000031 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000000000000000001 +:102FD00000000000000000000000000000000000F1 +:102FE00000000000000000000000000000000000E1 +:102FF00000000000000000000000000000000000D1 +:1030000000000000000000000000000000000000C0 +:1030100000000000000000000000000000000000B0 +:10302000000000000000000202020202020202028E +:103030000202020202020202020202020202020270 +:103040000202020202020202020202020202020260 +:103050000202020202020202020202020202020250 +:103060000202020202020202020202020202020240 +:103070000202020202020202020202020202020230 +:103080000202020202020202020202020202020220 +:103090000202020202020202020202020202020210 +:1030A0000202020202020202020202020202020200 +:1030B00002020202020202020202020202020202F0 +:1030C00002020202020202020202020202020202E0 +:1030D00002020202020202020202020202020202D0 +:1030E00002020202020202020202020202020202C0 +:1030F00002020202020202020202020202020202B0 +:10310000020202020202020202020202020202029F +:10311000020202020202020202020202020202028F +:10312000020202020202020202020202020202027F +:10313000020202020202020202020202020202026F +:10314000020202020202020202020202020202025F +:10315000020202020202020202020202020202024F +:10316000020202020202020202020202020202023F +:10317000020202020202020202020202020202022F +:10318000020202020202020202020202020202021F +:10319000020202020202020202020202020202020F +:1031A00002020202020202020202020202020202FF +:1031B00002020202020202020202020202020202EF +:1031C00002020202020202020202020202020202DF +:1031D00002020202020202020202020202020202CF +:1031E00002020202020202020202020202020202BF +:1031F00002020202020202020202020202020202AF +:10320000020202020202020202020202020202029E +:10321000020202020202020202020202020202028E +:10322000020202020202020202020202020202027E +:10323000020202020202020202020202020202026E +:10324000020202020202020202020202020202025E +:10325000020202020202020202020202020202024E +:10326000020202020202020202020202020202023E +:10327000020202020202020202020202020202022E +:10328000020202020202020202020202020202021E +:10329000020202020202020202020202020202020E +:1032A00002020202020202020202020202020202FE +:1032B00002020202020202020202020202020202EE +:1032C00002020202020202020202020202020202DE +:1032D00002020202020202020202020202020202CE +:1032E00002020202020202020202020202020202BE +:1032F00002020202020202020202020202020202AE +:10330000020202020202020202020202020202029D +:10331000020202020202020202020202020202028D +:10332000020202020202020202020202020202027D +:10333000020202020202020202020202020202026D +:10334000020202020202020202020202020202025D +:10335000020202020202020202020202020202024D +:10336000020202020202020202020202020202023D +:10337000020202020202020202020202020202022D +:10338000020202020202020202020202020202021D +:10339000020202020202020202020202020202020D +:1033A00002020202020202020202020202020202FD +:1033B00002020202020202020202020202020202ED +:1033C00002020202020202020202020202020202DD +:1033D00002020202020202020202020202020202CD +:1033E00002020202020202020202020202020202BD +:1033F00002020202020202020202020202020202AD +:10340000020202020202020202020202020202029C +:10341000020202020202020202020202020202028C +:10342000020202020202020202020202020202027C +:10343000020202020202020202020202020202026C +:10344000020202020202020202020202020202025C +:10345000020202020202020202020202020202024C +:10346000020202020202020202020202020202023C +:10347000020202020202020202020202020202022C +:10348000020202020202020202020202020202021C +:10349000020202020202020202020202020202020C +:1034A00002020202020202020202020202020202FC +:1034B00002020202020202020202020202020202EC +:1034C00002020202020202020202020202020202DC +:1034D00002020202020202020202020202020202CC +:1034E00002020202020202020202020202020202BC +:1034F00002020202020202020202020202020202AC +:10350000020202020202020202020202020202029B +:10351000020202020202020202020202020202028B +:10352000020202020202020202020202020202027B +:10353000020202020202020202020202020202026B +:10354000020202020202020202020202020202025B +:10355000020202020202020202020202020202024B +:10356000020202020202020202020202020202023B +:10357000020202020202020202020202020202022B +:10358000020202020202020202020202020202021B +:10359000020202020202020202020202020202020B +:1035A00002020202020202020202020202020202FB +:1035B00002020202020202020202020202020202EB +:1035C00002020202020202020202020202020202DB +:1035D00002020202020202020202020202020202CB +:1035E00002020202020202020202020202020202BB +:1035F00002020202020202020202020202020202AB +:10360000020202020202020202020202020202029A +:10361000020202020202020202020202020202028A +:10362000020202020202020202020202020202027A +:10363000020202020202020202020202020202026A +:10364000020202020202020202020202020202025A +:10365000020202020202020202020202020202024A +:10366000020202020202020202020202020202023A +:10367000020202020202020202020202020202022A +:10368000020202020202020202020202020202021A +:10369000020202020202020202020202020202020A +:1036A00002020202020202020202020202020202FA +:1036B00002020202020202020202020202020202EA +:1036C00002020202020202020202020202020202DA +:1036D00002020202020202020202020202020202CA +:1036E00002020202020202020202020202020202BA +:1036F00002020202020202020202020202020202AA +:103700000202020202020202020202020202020299 +:103710000202020202020202020202020202020289 +:103720000202020202020202020202020202020279 +:103730000202020202020202020202020202020269 +:103740000202020202020202020202020202020259 +:103750000202020202020202020202020202020249 +:103760000202020202020202020202020202020239 +:103770000202020202020202020202020202020229 +:103780000202020202020202020202020202020219 +:103790000202020202020202020202020202020209 +:1037A00002020202020202020202020202020202F9 +:1037B00002020202020202020202020202020202E9 +:1037C00002020202020202020202020202020202D9 +:1037D00002020202020202020202020202020202C9 +:1037E00002020202020202020202020202020202B9 +:1037F00002020202020202020202020202020202A9 +:103800000202020202020202020202020202020298 +:103810000202020202020202020202020202020288 +:103820000202020202020202020202020202020278 +:103830000202020202020202020202020202020268 +:103840000202020202020202020202020202020258 +:103850000202020202020202020202020202020248 +:103860000202020202020202020202020202020238 +:103870000202020202020202020202020202020228 +:103880000202020202020202020202020202020218 +:103890000202020202020202020202020202020208 +:1038A00002020202020202020202020202020202F8 +:1038B00002020202020202020202020202020202E8 +:1038C00002020202020202020202020202020202D8 +:1038D00002020202020202020202020202020202C8 +:1038E00002020202020202020202020202020202B8 +:1038F00002020202020202020202020202020202A8 +:103900000202020202020202020202020202020297 +:103910000202020202020202020202020202020287 +:103920000202020202020202020202020202020277 +:103930000202020202020202020202020202020267 +:103940000202020202020202020202020202020257 +:103950000202020202020202020202020202020247 +:103960000202020202020202020202020202020237 +:103970000202020202020202020202020202020227 +:103980000202020202020202020202020202020217 +:103990000202020202020202020202020202020207 +:1039A00002020202020202020202020202020202F7 +:1039B00002020202020202020202020202020202E7 +:1039C00002020202020202020202020202020202D7 +:1039D00002020202020202020202020202020202C7 +:1039E00002020202020202020202020202020202B7 +:1039F00002020202020202020202020202020202A7 +:103A00000202020202020202020202020202020296 +:103A10000202020202020202020202020202020286 +:103A20000202020202020200000000000000000088 +:103A30000000000000000000000000000000000086 +:103A40000000000000000000000000000000000076 +:103A50000000000000000000000000000000000066 +:103A60000000000000000000000000000000000056 +:103A70000000000000000000000000000000000046 +:103A80000000000000000000000000000000000036 +:103A90000000000000000000000000000000000026 +:103AA0000000000000000000000000000000000016 +:103AB0000000000000000000000000000000000006 +:103AC00000000000000000000000000000000000F6 +:103AD00000000000000000000000000000000000E6 +:103AE00000000000000000000000000000000000D6 +:103AF00000000000000000000000000000000000C6 +:103B000000000000000000000000000000000000B5 +:103B100000000000000000000000000000000000A5 +:103B20000000000000000000000000000000000095 +:103B30000000000000000000000000000000000085 +:103B40000000000000000000000000000000000075 +:103B50000000000000000000000000000000000065 +:103B60000000000000000000000000000000000055 +:103B70000000000000000000000000000000000045 +:103B80000000000000000000000000000000000035 +:103B90000000000000000000000000000000000025 +:103BA0000000000000000000000000000000000015 +:103BB0000000000000000000000000000000000005 +:103BC00000000000000000000000000000000000F5 +:103BD00000000000000000000000000000000000E5 +:103BE00000000000000000000000000000000000D5 +:103BF00000000000000000000000000000000000C5 +:103C000000000000000000000000000000000000B4 +:103C100000000000000000000000000000000000A4 +:103C20000000000000000000000000000000000094 +:103C30000000000000000000000000000000000084 +:103C40000000000000000000000000000000000074 +:103C50000000000000000000000000000000000064 +:103C60000000000000000000000000000000000054 +:103C70000000000000000000000000000000000044 +:103C80000000000000000000000000000000000034 +:103C90000000000000000000000000000000000024 +:103CA0000000000000000000000000000000000014 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 +:103CD00000000000000000000000000000000000E4 +:103CE00000000000000000000000000000000000D4 +:103CF00000000000000000000000000000000000C4 +:103D000000000000000000000000000000000000B3 +:103D100000000000000000000000000000000000A3 +:103D20000000000000000000000000000000000093 +:103D30000000000000000000000000000000000083 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D60000000000000000000000000000000000053 +:103D70000000000000000000000000000000000043 +:103D80000000000000000000000000000000000033 +:103D90000000000000000000000000000000000023 +:103DA0000000000000000000000000000000000013 +:103DB0000000000000000000000000000000000003 +:103DC00000000000000000000000000000000000F3 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000000000D3 +:103DF00000000000000000000000000000000000C3 +:103E000000000000000000000000000000000000B2 +:103E100000000000000000000000000000000000A2 +:103E20000000000000000000000000000000000092 +:103E30000000000000000000000000000000000082 +:103E40000000000000000000000000000000000072 +:103E50000000000000000000000000000000000062 +:103E60000000000000000000000000000000000052 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000012 +:103EB0000000000000000000000000000000000002 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF00000000000000000000000000000000000C2 +:103F000000000000000000000000000000000000B1 +:103F100000000000000000000000000000000000A1 +:103F20000000000000000000000000000000000091 +:103F30000000000000000000000000000000000081 +:103F40000000000000000000000000000000000071 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000000000031 +:103F90000000000000000000000000000000000021 +:103FA0000000000000000000000000000000000011 +:103FB0000000000000000000000000000000000001 +:103FC00000000000000000000000000000000000F1 +:103FD00000000000000000000000000000000000E1 +:103FE00000000000000000000000000000000000D1 +:103FF00000000000000000000000000000000000C1 +:1040000000000000000000000000000000000000B0 +:1040100000000000000000000000000000000000A0 +:104020000000000000000000000000000000000090 +:104030000000000000000000000000000000000080 +:104040000000000000000000000000000000000070 +:104050000000000000000000000000000000000060 +:104060000000000000000000000000000000000050 +:104070000000000000000000000000000000000040 +:104080000000000000000000000000000000000030 +:104090000000000000000000000000000000000020 +:1040A0000000000000000000000000000000000010 +:1040B0000000000000000000000000000000000000 +:1040C00000000000000000000000000000000000F0 +:1040D00000000000000000000000000000000000E0 +:1040E00000000000000000000000000000000000D0 +:1040F00000000000000000000000000000000000C0 +:1041000000000000000000000000000000000000AF +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:10414000000000000000000000000000000000006F +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F +:10417000000000000000000000000000000000003F +:10418000000000000000000000000000000000002F +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000000000AE +:10421000000000000000000000000000000000009E +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000007E +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000000000005E +:10426000000000000000000000000000000000004E +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000000002E +:10429000000000000000000000000000000000001E +:1042A000000000000000000000000000000000000E +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D00000000000000000000000000000000000DE +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000000000000BE +:1043000000000000000000000000000000000000AD +:10431000000000000000000000000000000000009D +:104320000000000000000001010101010101010184 +:10433000010101010101010101010101010101016D +:10434000010101010101010101010101010101015D +:10435000010101010101010101010101010101014D +:10436000010101010101010101010101010101013D +:10437000010101010101010101010101010101012D +:10438000010101010101010101010101010101011D +:10439000010101010101010101010101010101010D +:1043A00001010101010101010101010101010101FD +:1043B00001010101010101010101010101010101ED +:1043C00001010101010101010101010101010101DD +:1043D00001010101010101010101010101010101CD +:1043E00001010101010101010101010101010101BD +:1043F00001010101010101010101010101010101AD +:10440000010101010101010101010101010101019C +:10441000010101010101010101010101010101018C +:10442000010101010101010101010101010101017C +:10443000010101010101010101010101010101016C +:10444000010101010101010101010101010101015C +:10445000010101010101010101010101010101014C +:10446000010101010101010101010101010101013C +:10447000010101010101010101010101010101012C +:10448000010101010101010101010101010101011C +:10449000010101010101010101010101010101010C +:1044A00001010101010101010101010101010101FC +:1044B00001010101010101010101010101010101EC +:1044C00001010101010101010101010101010101DC +:1044D00001010101010101010101010101010101CC +:1044E00001010101010101010101010101010101BC +:1044F00001010101010101010101010101010101AC +:10450000010101010101010101010101010101019B +:10451000010101010101010101010101010101018B +:10452000010101010101010101010101010101017B +:10453000010101010101010101010101010101016B +:10454000010101010101010101010101010101015B +:10455000010101010101010101010101010101014B +:10456000010101010101010101010101010101013B +:10457000010101010101010101010101010101012B +:10458000010101010101010101010101010101011B +:10459000010101010101010101010101010101010B +:1045A00001010101010101010101010101010101FB +:1045B00001010101010101010101010101010101EB +:1045C00001010101010101010101010101010101DB +:1045D00001010101010101010101010101010101CB +:1045E00001010101010101010101010101010101BB +:1045F00001010101010101010101010101010101AB +:10460000010101010101010101010101010101019A +:10461000010101010101010101010101010101018A +:10462000010101010101010101010101010101017A +:10463000010101010101010101010101010101016A +:10464000010101010101010101010101010101015A +:10465000010101010101010101010101010101014A +:10466000010101010101010101010101010101013A +:10467000010101010101010101010101010101012A +:10468000010101010101010101010101010101011A +:10469000010101010101010101010101010101010A +:1046A00001010101010101010101010101010101FA +:1046B00001010101010101010101010101010101EA +:1046C00001010101010101010101010101010101DA +:1046D00001010101010101010101010101010101CA +:1046E00001010101010101010101010101010101BA +:1046F00001010101010101010101010101010101AA +:104700000101010101010101010101010101010199 +:104710000101010101010101010101010101010189 +:104720000101010101010101010101010101010179 +:104730000101010101010101010101010101010169 +:104740000101010101010101010101010101010159 +:104750000101010101010101010101010101010149 +:104760000101010101010101010101010101010139 +:104770000101010101010101010101010101010129 +:104780000101010101010101010101010101010119 +:104790000101010101010101010101010101010109 +:1047A00001010101010101010101010101010101F9 +:1047B00001010101010101010101010101010101E9 +:1047C00001010101010101010101010101010101D9 +:1047D00001010101010101010101010101010101C9 +:1047E00001010101010101010101010101010101B9 +:1047F00001010101010101010101010101010101A9 +:104800000101010101010101010101010101010198 +:104810000101010101010101010101010101010188 +:104820000101010101010101010101010101010178 +:104830000101010101010101010101010101010168 +:104840000101010101010101010101010101010158 +:104850000101010101010101010101010101010148 +:104860000101010101010101010101010101010138 +:104870000101010101010101010101010101010128 +:104880000101010101010101010101010101010118 +:104890000101010101010101010101010101010108 +:1048A00001010101010101010101010101010101F8 +:1048B00001010101010101010101010101010101E8 +:1048C00001010101010101010101010101010101D8 +:1048D00001010101010101010101010101010101C8 +:1048E00001010101010101010101010101010101B8 +:1048F00001010101010101010101010101010101A8 +:104900000101010101010101010101010101010197 +:104910000101010101010101010101010101010187 +:104920000101010101010101010101010101010177 +:104930000101010101010101010101010101010167 +:104940000101010101010101010101010101010157 +:104950000101010101010101010101010101010147 +:104960000101010101010101010101010101010137 +:104970000101010101010101010101010101010127 +:104980000101010101010101010101010101010117 +:104990000101010101010101010101010101010107 +:1049A00001010101010101010101010101010101F7 +:1049B00001010101010101010101010101010101E7 +:1049C00001010101010101010101010101010101D7 +:1049D00001010101010101010101010101010101C7 +:1049E00001010101010101010101010101010101B7 +:1049F00001010101010101010101010101010101A7 +:104A00000101010101010101010101010101010196 +:104A10000101010101010101010101010101010186 +:104A20000101010101010101010101010101010176 +:104A30000101010101010101010101010101010166 +:104A40000101010101010101010101010101010156 +:104A50000101010101010101010101010101010146 +:104A60000101010101010101010101010101010136 +:104A70000101010101010101010101010101010126 +:104A80000101010101010101010101010101010116 +:104A90000101010101010101010101010101010106 +:104AA00001010101010101010101010101010101F6 +:104AB00001010101010101010101010101010101E6 +:104AC00001010101010101010101010101010101D6 +:104AD00001010101010101010101010101010101C6 +:104AE00001010101010101010101010101010101B6 +:104AF00001010101010101010101010101010101A6 +:104B00000101010101010101010101010101010195 +:104B10000101010101010101010101010101010185 +:104B20000101010101010101010101010101010175 +:104B30000101010101010101010101010101010165 +:104B40000101010101010101010101010101010155 +:104B50000101010101010101010101010101010145 +:104B60000101010101010101010101010101010135 +:104B70000101010101010101010101010101010125 +:104B80000101010101010101010101010101010115 +:104B90000101010101010101010101010101010105 +:104BA00001010101010101010101010101010101F5 +:104BB00001010101010101010101010101010101E5 +:104BC00001010101010101010101010101010101D5 +:104BD00001010101010101010101010101010101C5 +:104BE00001010101010101010101010101010101B5 +:104BF00001010101010101010101010101010101A5 +:104C00000101010101010101010101010101010194 +:104C10000101010101010101010101010101010184 +:104C20000101010101010101010101010101010174 +:104C30000101010101010101010101010101010164 +:104C40000101010101010101010101010101010154 +:104C50000101010101010101010101010101010144 +:104C60000101010101010101010101010101010134 +:104C70000101010101010101010101010101010124 +:104C80000101010101010101010101010101010114 +:104C90000101010101010101010101010101010104 +:104CA00001010101010101010101010101010101F4 +:104CB00001010101010101010101010101010101E4 +:104CC00001010101010101010101010101010101D4 +:104CD00001010101010101010101010101010101C4 +:104CE00001010101010101010101010101010101B4 +:104CF00001010101010101010101010101010101A4 +:104D00000101010101010101010101010101010193 +:104D10000101010101010101010101010101010183 +:104D2000010101010101010000000000000000007C +:104D30000000000000000000000000000000000073 +:104D40000000000000000000000000000000000063 +:104D50000000000000000000000000000000000053 +:104D60000000000000000000000000000000000043 +:104D70000000000000000000000000000000000033 +:104D80000000000000000000000000000000000023 +:104D90000000000000000000000000000000000013 +:104DA0000000000000000000000000000000000003 +:104DB00000000000000000000000000000000000F3 +:104DC00000000000000000000000000000000000E3 +:104DD00000000000000000000000000000000000D3 +:104DE00000000000000000000000000000000000C3 +:104DF00000000000000000000000000000000000B3 +:104E000000000000000000000000000000000000A2 +:104E10000000000000000000000000000000000092 +:104E20000000000000000000000000000000000082 +:104E30000000000000000000000000000000000072 +:104E40000000000000000000000000000000000062 +:104E50000000000000000000000000000000000052 +:104E60000000000000000000000000000000000042 +:104E70000000000000000000000000000000000032 +:104E80000000000000000000000000000000000022 +:104E90000000000000000000000000000000000012 +:104EA0000000000000000000000000000000000002 +:104EB00000000000000000000000000000000000F2 +:104EC00000000000000000000000000000000000E2 +:104ED00000000000000000000000000000000000D2 +:104EE00000000000000000000000000000000000C2 +:104EF00000000000000000000000000000000000B2 +:104F000000000000000000000000000000000000A1 +:104F10000000000000000000000000000000000091 +:104F20000000000000000000000000000000000081 +:104F30000000000000000000000000000000000071 +:104F40000000000000000000000000000000000061 +:104F50000000000000000000000000000000000051 +:104F60000000000000000000000000000000000041 +:104F70000000000000000000000000000000000031 +:104F80000000000000000000000000000000000021 +:104F90000000000000000000000000000000000011 +:104FA0000000000000000000000000000000000001 +:104FB00000000000000000000000000000000000F1 +:104FC00000000000000000000000000000000000E1 +:104FD00000000000000000000000000000000000D1 +:104FE00000000000000000000000000000000000C1 +:104FF00000000000000000000000000000000000B1 +:1050000000000000000000000000000000000000A0 +:105010000000000000000000000000000000000090 +:105020000000000000000000000000000000000080 +:105030000000000000000000000000000000000070 +:105040000000000000000000000000000000000060 +:105050000000000000000000000000000000000050 +:105060000000000000000000000000000000000040 +:105070000000000000000000000000000000000030 +:105080000000000000000000000000000000000020 +:105090000000000000000000000000000000000010 +:1050A0000000000000000000000000000000000000 +:1050B00000000000000000000000000000000000F0 +:1050C00000000000000000000000000000000000E0 +:1050D00000000000000000000000000000000000D0 +:1050E00000000000000000000000000000000000C0 +:1050F00000000000000000000000000000000000B0 +:10510000000000000000000000000000000000009F +:10511000000000000000000000000000000000008F +:10512000000000000000000000000000000000007F +:10513000000000000000000000000000000000006F +:10514000000000000000000000000000000000005F +:10515000000000000000000000000000000000004F +:10516000000000000000000000000000000000003F +:10517000000000000000000000000000000000002F +:10518000000000000000000000000000000000001F +:10519000000000000000000000000000000000000F +:1051A00000000000000000000000000000000000FF +:1051B00000000000000000000000000000000000EF +:1051C00000000000000000000000000000000000DF +:1051D00000000000000000000000000000000000CF +:1051E00000000000000000000000000000000000BF +:1051F00000000000000000000000000000000000AF +:10520000000000000000000000000000000000009E +:10521000000000000000000000000000000000008E +:10522000000000000000000000000000000000007E +:10523000000000000000000000000000000000006E +:10524000000000000000000000000000000000005E +:10525000000000000000000000000000000000004E +:10526000000000000000000000000000000000003E +:10527000000000000000000000000000000000002E +:10528000000000000000000000000000000000001E +:10529000000000000000000000000000000000000E +:1052A00000000000000000000000000000000000FE +:1052B00000000000000000000000000000000000EE +:1052C00000000000000000000000000000000000DE +:1052D00000000000000000000000000000000000CE +:1052E00000000000000000000000000000000000BE +:1052F00000000000000000000000000000000000AE +:10530000000000000000000000000000000000009D +:10531000000000000000000000000000000000008D +:10532000000000000000000000000000000000007D +:10533000000000000000000000000000000000006D +:10534000000000000000000000000000000000005D +:10535000000000000000000000000000000000004D +:10536000000000000000000000000000000000003D +:10537000000000000000000000000000000000002D +:10538000000000000000000000000000000000001D +:10539000000000000000000000000000000000000D +:1053A00000000000000000000000000000000000FD +:1053B00000000000000000000000000000000000ED +:1053C00000000000000000000000000000000000DD +:1053D00000000000000000000000000000000000CD +:1053E00000000000000000000000000000000000BD +:1053F00000000000000000000000000000000000AD +:10540000000000000000000000000000000000009C +:10541000000000000000000000000000000000008C +:10542000000000000000000202020202020202026A +:10543000020202020202020202020202020202024C +:10544000020202020202020202020202020202023C +:10545000020202020202020202020202020202022C +:10546000020202020202020202020202020202021C +:10547000020202020202020202020202020202020C +:1054800002020202020202020202020202020202FC +:1054900002020202020202020202020202020202EC +:1054A00002020202020202020202020202020202DC +:1054B00002020202020202020202020202020202CC +:1054C00002020202020202020202020202020202BC +:1054D00002020202020202020202020202020202AC +:1054E000020202020202020202020202020202029C +:1054F000020202020202020202020202020202028C +:10550000020202020202020202020202020202027B +:10551000020202020202020202020202020202026B +:10552000020202020202020202020202020202025B +:10553000020202020202020202020202020202024B +:10554000020202020202020202020202020202023B +:10555000020202020202020202020202020202022B +:10556000020202020202020202020202020202021B +:10557000020202020202020202020202020202020B +:1055800002020202020202020202020202020202FB +:1055900002020202020202020202020202020202EB +:1055A00002020202020202020202020202020202DB +:1055B00002020202020202020202020202020202CB +:1055C00002020202020202020202020202020202BB +:1055D00002020202020202020202020202020202AB +:1055E000020202020202020202020202020202029B +:1055F000020202020202020202020202020202028B +:10560000020202020202020202020202020202027A +:10561000020202020202020202020202020202026A +:10562000020202020202020202020202020202025A +:10563000020202020202020202020202020202024A +:10564000020202020202020202020202020202023A +:10565000020202020202020202020202020202022A +:10566000020202020202020202020202020202021A +:10567000020202020202020202020202020202020A +:1056800002020202020202020202020202020202FA +:1056900002020202020202020202020202020202EA +:1056A00002020202020202020202020202020202DA +:1056B00002020202020202020202020202020202CA +:1056C00002020202020202020202020202020202BA +:1056D00002020202020202020202020202020202AA +:1056E000020202020202020202020202020202029A +:1056F000020202020202020202020202020202028A +:105700000202020202020202020202020202020279 +:105710000202020202020202020202020202020269 +:105720000202020202020202020202020202020259 +:105730000202020202020202020202020202020249 +:105740000202020202020202020202020202020239 +:105750000202020202020202020202020202020229 +:105760000202020202020202020202020202020219 +:105770000202020202020202020202020202020209 +:1057800002020202020202020202020202020202F9 +:1057900002020202020202020202020202020202E9 +:1057A00002020202020202020202020202020202D9 +:1057B00002020202020202020202020202020202C9 +:1057C00002020202020202020202020202020202B9 +:1057D00002020202020202020202020202020202A9 +:1057E0000202020202020202020202020202020299 +:1057F0000202020202020202020202020202020289 +:105800000202020202020202020202020202020278 +:105810000202020202020202020202020202020268 +:105820000202020202020202020202020202020258 +:105830000202020202020202020202020202020248 +:105840000202020202020202020202020202020238 +:105850000202020202020202020202020202020228 +:105860000202020202020202020202020202020218 +:105870000202020202020202020202020202020208 +:1058800002020202020202020202020202020202F8 +:1058900002020202020202020202020202020202E8 +:1058A00002020202020202020202020202020202D8 +:1058B00002020202020202020202020202020202C8 +:1058C00002020202020202020202020202020202B8 +:1058D00002020202020202020202020202020202A8 +:1058E0000202020202020202020202020202020298 +:1058F0000202020202020202020202020202020288 +:105900000202020202020202020202020202020277 +:105910000202020202020202020202020202020267 +:105920000202020202020202020202020202020257 +:105930000202020202020202020202020202020247 +:105940000202020202020202020202020202020237 +:105950000202020202020202020202020202020227 +:105960000202020202020202020202020202020217 +:105970000202020202020202020202020202020207 +:1059800002020202020202020202020202020202F7 +:1059900002020202020202020202020202020202E7 +:1059A00002020202020202020202020202020202D7 +:1059B00002020202020202020202020202020202C7 +:1059C00002020202020202020202020202020202B7 +:1059D00002020202020202020202020202020202A7 +:1059E0000202020202020202020202020202020297 +:1059F0000202020202020202020202020202020287 +:105A00000202020202020202020202020202020276 +:105A10000202020202020202020202020202020266 +:105A20000202020202020202020202020202020256 +:105A30000202020202020202020202020202020246 +:105A40000202020202020202020202020202020236 +:105A50000202020202020202020202020202020226 +:105A60000202020202020202020202020202020216 +:105A70000202020202020202020202020202020206 +:105A800002020202020202020202020202020202F6 +:105A900002020202020202020202020202020202E6 +:105AA00002020202020202020202020202020202D6 +:105AB00002020202020202020202020202020202C6 +:105AC00002020202020202020202020202020202B6 +:105AD00002020202020202020202020202020202A6 +:105AE0000202020202020202020202020202020296 +:105AF0000202020202020202020202020202020286 +:105B00000202020202020202020202020202020275 +:105B10000202020202020202020202020202020265 +:105B20000202020202020202020202020202020255 +:105B30000202020202020202020202020202020245 +:105B40000202020202020202020202020202020235 +:105B50000202020202020202020202020202020225 +:105B60000202020202020202020202020202020215 +:105B70000202020202020202020202020202020205 +:105B800002020202020202020202020202020202F5 +:105B900002020202020202020202020202020202E5 +:105BA00002020202020202020202020202020202D5 +:105BB00002020202020202020202020202020202C5 +:105BC00002020202020202020202020202020202B5 +:105BD00002020202020202020202020202020202A5 +:105BE0000202020202020202020202020202020295 +:105BF0000202020202020202020202020202020285 +:105C00000202020202020202020202020202020274 +:105C10000202020202020202020202020202020264 +:105C20000202020202020202020202020202020254 +:105C30000202020202020202020202020202020244 +:105C40000202020202020202020202020202020234 +:105C50000202020202020202020202020202020224 +:105C60000202020202020202020202020202020214 +:105C70000202020202020202020202020202020204 +:105C800002020202020202020202020202020202F4 +:105C900002020202020202020202020202020202E4 +:105CA00002020202020202020202020202020202D4 +:105CB00002020202020202020202020202020202C4 +:105CC00002020202020202020202020202020202B4 +:105CD00002020202020202020202020202020202A4 +:105CE0000202020202020202020202020202020294 +:105CF0000202020202020202020202020202020284 +:105D00000202020202020202020202020202020273 +:105D10000202020202020202020202020202020263 +:105D20000202020202020202020202020202020253 +:105D30000202020202020202020202020202020243 +:105D40000202020202020202020202020202020233 +:105D50000202020202020202020202020202020223 +:105D60000202020202020202020202020202020213 +:105D70000202020202020202020202020202020203 +:105D800002020202020202020202020202020202F3 +:105D900002020202020202020202020202020202E3 +:105DA00002020202020202020202020202020202D3 +:105DB00002020202020202020202020202020202C3 +:105DC00002020202020202020202020202020202B3 +:105DD00002020202020202020202020202020202A3 +:105DE0000202020202020202020202020202020293 +:105DF0000202020202020202020202020202020283 +:105E00000202020202020202020202020202020272 +:105E10000202020202020202020202020202020262 +:105E20000202020202020200000000000000000064 +:105E30000000000000000000000000000000000062 +:105E40000000000000000000000000000000000052 +:105E50000000000000000000000000000000000042 +:105E60000000000000000000000000000000000032 +:105E70000000000000000000000000000000000022 +:105E80000000000000000000000000000000000012 +:105E90000000000000000000000000000000000002 +:105EA00000000000000000000000000000000000F2 +:105EB00000000000000000000000000000000000E2 +:105EC00000000000000000000000000000000000D2 +:105ED00000000000000000000000000000000000C2 +:105EE00000000000000000000000000000000000B2 +:105EF00000000000000000000000000000000000A2 +:105F00000000000000000000000000000000000091 +:105F10000000000000000000000000000000000081 +:105F20000000000000000000000000000000000071 +:105F30000000000000000000000000000000000061 +:105F40000000000000000000000000000000000051 +:105F50000000000000000000000000000000000041 +:105F60000000000000000000000000000000000031 +:105F70000000000000000000000000000000000021 +:105F80000000000000000000000000000000000011 +:105F90000000000000000000000000000000000001 +:105FA00000000000000000000000000000000000F1 +:105FB00000000000000000000000000000000000E1 +:105FC00000000000000000000000000000000000D1 +:105FD00000000000000000000000000000000000C1 +:105FE00000000000000000000000000000000000B1 +:105FF00000000000000000000000000000000000A1 +:106000000000000000000000000000000000000090 +:106010000000000000000000000000000000000080 +:106020000000000000000000000000000000000070 +:106030000000000000000000000000000000000060 +:106040000000000000000000000000000000000050 +:106050000000000000000000000000000000000040 +:106060000000000000000000000000000000000030 +:106070000000000000000000000000000000000020 +:106080000000000000000000000000000000000010 +:106090000000000000000000000000000000000000 +:1060A00000000000000000000000000000000000F0 +:1060B00000000000000000000000000000000000E0 +:1060C00000000000000000000000000000000000D0 +:1060D00000000000000000000000000000000000C0 +:1060E00000000000000000000000000000000000B0 +:1060F00000000000000000000000000000000000A0 +:10610000000000000000000000000000000000008F +:10611000000000000000000000000000000000007F +:10612000000000000000000000000000000000006F +:10613000000000000000000000000000000000005F +:10614000000000000000000000000000000000004F +:10615000000000000000000000000000000000003F +:10616000000000000000000000000000000000002F +:10617000000000000000000000000000000000001F +:10618000000000000000000000000000000000000F +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF +:1061C00000000000000000000000000000000000CF +:1061D00000000000000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:10620000000000000000000000000000000000008E +:10621000000000000000000000000000000000007E +:10622000000000000000000000000000000000006E +:10623000000000000000000000000000000000005E +:10624000000000000000000000000000000000004E +:10625000000000000000000000000000000000003E +:10626000000000000000000000000000000000002E +:10627000000000000000000000000000000000001E +:10628000000000000000000000000000000000000E +:1062900000000000000000000000000000000000FE +:1062A00000000000000000000000000000000000EE +:1062B00000000000000000000000000000000000DE +:1062C00000000000000000000000000000000000CE +:1062D00000000000000000000000000000000000BE +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:10630000000000000000000000000000000000008D +:10631000000000000000000000000000000000007D +:10632000000000000000000000000000000000006D +:10633000000000000000000000000000000000005D +:10634000000000000000000000000000000000004D +:10635000000000000000000000000000000000003D +:10636000000000000000000000000000000000002D +:10637000000000000000000000000000000000001D +:10638000000000000000000000000000000000000D +:1063900000000000000000000000000000000000FD +:1063A00000000000000000000000000000000000ED +:1063B00000000000000000000000000000000000DD +:1063C00000000000000000000000000000000000CD +:1063D00000000000000000000000000000000000BD +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000000009D +:10640000000000000000000000000000000000008C +:10641000000000000000000000000000000000007C +:10642000000000000000003B000000000000000130 +:10643000010101010101010101010101010101014C +:10644000010101010101010101010101010101013C +:10645000010101010101010101010101010101012C +:10646000010101010101010101010101010101011C +:10647000010101010101010101010101010101010C +:1064800001010101010101010101010101010101FC +:1064900001010101010101010101010101010101EC +:1064A00001010101010101010101010101010101DC +:1064B00001010101010101010101010101010101CC +:1064C00001010101010101010101010101010101BC +:1064D00001010101010101010101010101010101AC +:1064E000010101010101010101010101010101019C +:1064F000010101010101010101010101010101018C +:10650000010101010101010101010101010101017B +:10651000010101010101010101010101010101016B +:10652000010101010101010101010101010101015B +:10653000010101010101010101010101010101014B +:10654000010101010101010101010101010101013B +:10655000010101010101010101010101010101012B +:10656000010101010101010101010101010101011B +:10657000010101010101010101010101010101010B +:1065800001010101010101010101010101010101FB +:1065900001010101010101010101010101010101EB +:1065A00001010101010101010101010101010101DB +:1065B00001010101010101010101010101010101CB +:1065C00001010101010101010101010101010101BB +:1065D00001010101010101010101010101010101AB +:1065E000010101010101010101010101010101019B +:1065F000010101010101010101010101010101018B +:10660000010101010101010101010101010101017A +:10661000010101010101010101010101010101016A +:10662000010101010101010101010101010101015A +:10663000010101010101010101010101010101014A +:10664000010101010101010101010101010101013A +:10665000010101010101010101010101010101012A +:10666000010101010101010101010101010101011A +:10667000010101010101010101010101010101010A +:1066800001010101010101010101010101010101FA +:1066900001010101010101010101010101010101EA +:1066A00001010101010101010101010101010101DA +:1066B00001010101010101010101010101010101CA +:1066C00001010101010101010101010101010101BA +:1066D00001010101010101010101010101010101AA +:1066E000010101010101010101010101010101019A +:1066F000010101010101010101010101010101018A +:106700000101010101010101010101010101010179 +:106710000101010101010101010101010101010169 +:106720000101010101010101010101010101010159 +:106730000101010101010101010101010101010149 +:106740000101010101010101010101010101010139 +:106750000101010101010101010101010101010129 +:106760000101010101010101010101010101010119 +:106770000101010101010101010101010101010109 +:1067800001010101010101010101010101010101F9 +:1067900001010101010101010101010101010101E9 +:1067A00001010101010101010101010101010101D9 +:1067B00001010101010101010101010101010101C9 +:1067C00001010101010101010101010101010101B9 +:1067D00001010101010101010101010101010101A9 +:1067E0000101010101010101010101010101010199 +:1067F0000101010101010101010101010101010189 +:106800000101010101010101010101010101010178 +:106810000101010101010101010101010101010168 +:106820000101010101010101010101010101010158 +:106830000101010101010101010101010101010148 +:106840000101010101010101010101010101010138 +:106850000101010101010101010101010101010128 +:106860000101010101010101010101010101010118 +:106870000101010101010101010101010101010108 +:1068800001010101010101010101010101010101F8 +:1068900001010101010101010101010101010101E8 +:1068A00001010101010101010101010101010101D8 +:1068B00001010101010101010101010101010101C8 +:1068C00001010101010101010101010101010101B8 +:1068D00001010101010101010101010101010101A8 +:1068E0000101010101010101010101010101010198 +:1068F0000101010101010101010101010101010188 +:106900000101010101010101010101010101010177 +:106910000101010101010101010101010101010167 +:106920000101010101010101010101010101010157 +:106930000101010101010101010101010101010147 +:106940000101010101010101010101010101010137 +:106950000101010101010101010101010101010127 +:106960000101010101010101010101010101010117 +:106970000101010101010101010101010101010107 +:1069800001010101010101010101010101010101F7 +:1069900001010101010101010101010101010101E7 +:1069A00001010101010101010101010101010101D7 +:1069B00001010101010101010101010101010101C7 +:1069C00001010101010101010101010101010101B7 +:1069D00001010101010101010101010101010101A7 +:1069E0000101010101010101010101010101010197 +:1069F0000101010101010101010101010101010187 +:106A00000101010101010101010101010101010176 +:106A10000101010101010101010101010101010166 +:106A20000101010101010101010101010101010156 +:106A30000101010101010101010101010101010146 +:106A40000101010101010101010101010101010136 +:106A50000101010101010101010101010101010126 +:106A60000101010101010101010101010101010116 +:106A70000101010101010101010101010101010106 +:106A800001010101010101010101010101010101F6 +:106A900001010101010101010101010101010101E6 +:106AA00001010101010101010101010101010101D6 +:106AB00001010101010101010101010101010101C6 +:106AC00001010101010101010101010101010101B6 +:106AD00001010101010101010101010101010101A6 +:106AE0000101010101010101010101010101010196 +:106AF0000101010101010101010101010101010186 +:106B00000101010101010101010101010101010175 +:106B10000101010101010101010101010101010165 +:106B20000101010101010101010101010101010155 +:106B30000101010101010101010101010101010145 +:106B40000101010101010101010101010101010135 +:106B50000101010101010101010101010101010125 +:106B60000101010101010101010101010101010115 +:106B70000101010101010101010101010101010105 +:106B800001010101010101010101010101010101F5 +:106B900001010101010101010101010101010101E5 +:106BA00001010101010101010101010101010101D5 +:106BB00001010101010101010101010101010101C5 +:106BC00001010101010101010101010101010101B5 +:106BD00001010101010101010101010101010101A5 +:106BE0000101010101010101010101010101010195 +:106BF0000101010101010101010101010101010185 +:106C00000101010101010101010101010101010174 +:106C10000101010101010101010101010101010164 +:106C20000101010101010101010101010101010055 +:106C30000000000000000000000000000000000054 +:106C40000000000000000000000000000000000044 +:106C50000000000000000000000000000000000034 +:106C60000000000000000000000000000000000024 +:106C70000000000000000000000000000000000014 +:106C80000000000000000000000000000000000004 +:106C900000000000000000000000000000000000F4 +:106CA00000000000000000000000000000000000E4 +:106CB00000000000000000000000000000000000D4 +:106CC00000000000000000000000000000000000C4 +:106CD00000000000000000000000000000000000B4 +:106CE00000000000000000000000000000000000A4 +:106CF0000000000000000000000000000000000094 +:106D00000000000000000000000000000000000083 +:106D10000000000000000000000000000000000073 +:106D20000000000000000000000000000000000063 +:106D30000000000000000000000000000000000053 +:106D40000000000000000000000000000000000043 +:106D50000000000000000000000000000000000033 +:106D60000000000000000000000000000000000023 +:106D70000000000000000000000000000000000013 +:106D80000000000000000000000000000000000003 +:106D900000000000000000000000000000000000F3 +:106DA00000000000000000000000000000000000E3 +:106DB00000000000000000000000000000000000D3 +:106DC00000000000000000000000000000000000C3 +:106DD00000000000000000000000000000000000B3 +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000000000000000000000093 +:106E00000000000000000000000000000000000082 +:106E10000000000000000000000000000000000072 +:106E20000000000000000000000000000000000062 +:106E30000000000000000000000000000000000052 +:106E40000000000000000000000000000000000042 +:106E50000000000000000000000000000000000032 +:106E60000000000000000000000000000000000022 +:106E70000000000000000000000000000000000012 +:106E80000000000000000000000000000000000002 +:106E900000000000000000000000000000000000F2 +:106EA00000000000000000000000000000000000E2 +:106EB00000000000000000000000000000000000D2 +:106EC00000000000000000000000000000000000C2 +:106ED00000000000000000000000000000000000B2 +:106EE00000000000000000000000000000000000A2 +:106EF0000000000000000000000000000000000092 +:106F00000000000000000000000000000000000081 +:106F10000000000000000000000000000000000071 +:106F20000000000000000000000000000000000061 +:106F30000000000000000000000000000000000051 +:106F40000000000000000000000000000000000041 +:106F50000000000000000000000000000000000031 +:106F60000000000000000000000000000000000021 +:106F70000000000000000000000000000000000011 +:106F80000000000000000000000000000000000001 +:106F900000000000000000000000000000000000F1 +:106FA00000000000000000000000000000000000E1 +:106FB00000000000000000000000000000000000D1 +:106FC00000000000000000000000000000000000C1 +:106FD00000000000000000000000000000000000B1 +:106FE00000000000000000000000000000000000A1 +:106FF0000000000000000000000000000000000091 +:107000000000000000000000000000000000000080 +:107010000000000000000000000000000000000070 +:107020000000000000000000000000000000000060 +:107030000000000000000000000000000000000050 +:107040000000000000000000000000000000000040 +:107050000000000000000000000000000000000030 +:107060000000000000000000000000000000000020 +:107070000000000000000000000000000000000010 +:107080000000000000000000000000000000000000 +:1070900000000000000000000000000000000000F0 +:1070A00000000000000000000000000000000000E0 +:1070B00000000000000000000000000000000000D0 +:1070C00000000000000000000000000000000000C0 +:1070D00000000000000000000000000000000000B0 +:1070E00000000000000000000000000000000000A0 +:1070F0000000000000000000000000000000000090 +:10710000000000000000000000000000000000007F +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000003F +:10715000000000000000000000000000000000002F +:10716000000000000000000000000000000000001F +:10717000000000000000000000000000000000000F +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000000EF +:1071A00000000000000000000000000000000000DF +:1071B00000000000000000000000000000000000CF +:1071C00000000000000000000000000000000000BF +:1071D00000000000000000000000000000000000AF +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000000000000000008F +:10720000000000000000000000000000000000007E +:10721000000000000000000000000000000000006E +:10722000000000000000000000000000000000025C +:10723000020202020202020202020202020202022E +:10724000020202020202020202020202020202021E +:10725000020202020202020202020202020202020E +:1072600002020202020202020202020202020202FE +:1072700002020202020202020202020202020202EE +:1072800002020202020202020202020202020202DE +:1072900002020202020202020202020202020202CE +:1072A00002020202020202020202020202020202BE +:1072B00002020202020202020202020202020202AE +:1072C000020202020202020202020202020202029E +:1072D000020202020202020202020202020202028E +:1072E000020202020202020202020202020202027E +:1072F000020202020202020202020202020202026E +:10730000020202020202020202020202020202025D +:10731000020202020202020202020202020202024D +:10732000020202020202020202020202020202023D +:10733000020202020202020202020202020202022D +:10734000020202020202020202020202020202021D +:10735000020202020202020202020202020202020D +:1073600002020202020202020202020202020202FD +:1073700002020202020202020202020202020202ED +:1073800002020202020202020202020202020202DD +:1073900002020202020202020202020202020202CD +:1073A00002020202020202020202020202020202BD +:1073B00002020202020202020202020202020202AD +:1073C000020202020202020202020202020202029D +:1073D000020202020202020202020202020202028D +:1073E000020202020202020202020202020202027D +:1073F000020202020202020202020202020202026D +:10740000020202020202020202020202020202025C +:10741000020202020202020202020202020202024C +:10742000020202020202020202020202020202023C +:10743000020202020202020202020202020202022C +:10744000020202020202020202020202020202021C +:10745000020202020202020202020202020202020C +:1074600002020202020202020202020202020202FC +:1074700002020202020202020202020202020202EC +:1074800002020202020202020202020202020202DC +:1074900002020202020202020202020202020202CC +:1074A00002020202020202020202020202020202BC +:1074B00002020202020202020202020202020202AC +:1074C000020202020202020202020202020202029C +:1074D000020202020202020202020202020202028C +:1074E000020202020202020202020202020202027C +:1074F000020202020202020202020202020202026C +:10750000020202020202020202020202020202025B +:10751000020202020202020202020202020202024B +:10752000020202020202020202020202020202023B +:10753000020202020202020202020202020202022B +:10754000020202020202020202020202020202021B +:10755000020202020202020202020202020202020B +:1075600002020202020202020202020202020202FB +:1075700002020202020202020202020202020202EB +:1075800002020202020202020202020202020202DB +:1075900002020202020202020202020202020202CB +:1075A00002020202020202020202020202020202BB +:1075B00002020202020202020202020202020202AB +:1075C000020202020202020202020202020202029B +:1075D000020202020202020202020202020202028B +:1075E000020202020202020202020202020202027B +:1075F000020202020202020202020202020202026B +:10760000020202020202020202020202020202025A +:10761000020202020202020202020202020202024A +:10762000020202020202020202020202020202023A +:10763000020202020202020202020202020202022A +:10764000020202020202020202020202020202021A +:10765000020202020202020202020202020202020A +:1076600002020202020202020202020202020202FA +:1076700002020202020202020202020202020202EA +:1076800002020202020202020202020202020202DA +:1076900002020202020202020202020202020202CA +:1076A00002020202020202020202020202020202BA +:1076B00002020202020202020202020202020202AA +:1076C000020202020202020202020202020202029A +:1076D000020202020202020202020202020202028A +:1076E000020202020202020202020202020202027A +:1076F000020202020202020202020202020202026A +:107700000202020202020202020202020202020259 +:107710000202020202020202020202020202020249 +:107720000202020202020202020202020202020239 +:107730000202020202020202020202020202020229 +:107740000202020202020202020202020202020219 +:107750000202020202020202020202020202020209 +:1077600002020202020202020202020202020202F9 +:1077700002020202020202020202020202020202E9 +:1077800002020202020202020202020202020202D9 +:1077900002020202020202020202020202020202C9 +:1077A00002020202020202020202020202020202B9 +:1077B00002020202020202020202020202020202A9 +:1077C0000202020202020202020202020202020299 +:1077D0000202020202020202020202020202020289 +:1077E0000202020202020202020202020202020279 +:1077F0000202020202020202020202020202020269 +:107800000202020202020202020202020202020258 +:107810000202020202020202020202020202020248 +:107820000202020202020202020202020202020238 +:107830000202020202020202020202020202020228 +:107840000202020202020202020202020202020218 +:107850000202020202020202020202020202020208 +:1078600002020202020202020202020202020202F8 +:1078700002020202020202020202020202020202E8 +:1078800002020202020202020202020202020202D8 +:1078900002020202020202020202020202020202C8 +:1078A00002020202020202020202020202020202B8 +:1078B00002020202020202020202020202020202A8 +:1078C0000202020202020202020202020202020298 +:1078D0000202020202020202020202020202020288 +:1078E0000202020202020202020202020202020278 +:1078F0000202020202020202020202020202020268 +:107900000202020202020202020202020202020257 +:107910000202020202020202020202020202020247 +:107920000202020202020202020202020202020237 +:107930000202020202020202020202020202020227 +:107940000202020202020202020202020202020217 +:107950000202020202020202020202020202020207 +:1079600002020202020202020202020202020202F7 +:1079700002020202020202020202020202020202E7 +:1079800002020202020202020202020202020202D7 +:1079900002020202020202020202020202020202C7 +:1079A00002020202020202020202020202020202B7 +:1079B00002020202020202020202020202020202A7 +:1079C0000202020202020202020202020202020297 +:1079D0000202020202020202020202020202020287 +:1079E0000202020202020202020202020202020277 +:1079F0000202020202020202020202020202020267 +:107A00000202020202020202020202020202020256 +:107A10000202020202020202020202020202020246 +:107A20000202020202020202020202020202020038 +:107A30000000000000000000000000000000000046 +:107A40000000000000000000000000000000000036 +:107A50000000000000000000000000000000000026 +:107A60000000000000000000000000000000000016 +:107A70000000000000000000000000000000000006 +:107A800000000000000000000000000000000000F6 +:107A900000000000000000000000000000000000E6 +:107AA00000000000000000000000000000000000D6 +:107AB00000000000000000000000000000000000C6 +:107AC00000000000000000000000000000000000B6 +:107AD00000000000000000000000000000000000A6 +:107AE0000000000000000000000000000000000096 +:107AF0000000000000000000000000000000000086 +:107B00000000000000000000000000000000000075 +:107B10000000000000000000000000000000000065 +:107B20000000000000000000000000000000000055 +:107B30000000000000000000000000000000000045 +:107B40000000000000000000000000000000000035 +:107B50000000000000000000000000000000000025 +:107B60000000000000000000000000000000000015 +:107B70000000000000000000000000000000000005 +:107B800000000000000000000000000000000000F5 +:107B900000000000000000000000000000000000E5 +:107BA00000000000000000000000000000000000D5 +:107BB00000000000000000000000000000000000C5 +:107BC00000000000000000000000000000000000B5 +:107BD00000000000000000000000000000000000A5 +:107BE0000000000000000000000000000000000095 +:107BF0000000000000000000000000000000000085 +:107C00000000000000000000000000000000000074 +:107C10000000000000000000000000000000000064 +:107C20000000000000000000000000000000000054 +:107C30000000000000000000000000000000000044 +:107C40000000000000000000000000000000000034 +:107C50000000000000000000000000000000000024 +:107C60000000000000000000000000000000000014 +:107C70000000000000000000000000000000000004 +:107C800000000000000000000000000000000000F4 +:107C900000000000000000000000000000000000E4 +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000000C4 +:107CC00000000000000000000000000000000000B4 +:107CD00000000000000000000000000000000000A4 +:107CE0000000000000000000000000000000000094 +:107CF0000000000000000000000000000000000084 +:107D00000000000000000000000000000000000073 +:107D10000000000000000000000000000000000063 +:107D20000000000000000000000000000000000053 +:107D30000000000000000000000000000000000043 +:107D40000000000000000000000000000000000033 +:107D50000000000000000000000000000000000023 +:107D60000000000000000000000000000000000013 +:107D70000000000000000000000000000000000003 +:107D800000000000000000000000000000000000F3 +:107D900000000000000000000000000000000000E3 +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000000000000000C3 +:107DC00000000000000000000000000000000000B3 +:107DD00000000000000000000000000000000000A3 +:107DE0000000000000000000000000000000000093 +:107DF0000000000000000000000000000000000083 +:107E00000000000000000000000000000000000072 +:107E10000000000000000000000000000000000062 +:107E20000000000000000000000000000000000052 +:107E30000000000000000000000000000000000042 +:107E40000000000000000000000000000000000032 +:107E50000000000000000000000000000000000022 +:107E60000000000000000000000000000000000012 +:107E70000000000000000000000000000000000002 +:107E800000000000000000000000000000000000F2 +:107E900000000000000000000000000000000000E2 +:107EA00000000000000000000000000000000000D2 +:107EB00000000000000000000000000000000000C2 +:107EC00000000000000000000000000000000000B2 +:107ED00000000000000000000000000000000000A2 +:107EE0000000000000000000000000000000000092 +:107EF0000000000000000000000000000000000082 +:107F00000000000000000000000000000000000071 +:107F10000000000000000000000000000000000061 +:107F20000000000000000000000000000000000051 +:107F30000000000000000000000000000000000041 +:107F40000000000000000000000000000000000031 +:107F50000000000000000000000000000000000021 +:107F60000000000000000000000000000000000011 +:107F70000000000000000000000000000000000001 +:107F800000000000000000000000000000000000F1 +:107F900000000000000000000000000000000000E1 +:107FA00000000000000000000000000000000000D1 +:107FB00000000000000000000000000000000000C1 +:107FC00000000000000000000000000000000000B1 +:107FD00000000000000000000000000000000000A1 +:107FE0000000000000000000000000000000000091 +:107FF0000000000000000000000000000000000081 +:108000000000000000000000000000000000000070 +:108010000000000000000000000000000000000060 +:108020000000000000000000000000000000000050 +:108030000000000000000000000000000000000040 +:108040000000000000000000000000000000000030 +:108050000000000000000000000000000000000020 +:108060000000000000000000000000000000000010 +:108070000000000000000000000000000000000000 +:1080800000000000000000000000000000000000F0 +:1080900000000000000000000000000000000000E0 +:1080A00000000000000000000000000000000000D0 +:1080B00000000000000000000000000000000000C0 +:1080C00000000000000000000000000000000000B0 +:1080D00000000000000000000000000000000000A0 +:1080E0000000000000000000000000000000000090 +:1080F0000000000000000000000000000000000080 +:10810000000000000000000000000000000000006F +:10811000000000000000000000000000000000005F +:10812000000000000000000000000000000000004F +:10813000000000000000000000000000000000003F +:10814000000000000000000000000000000000002F +:10815000000000000000000000000000000000001F +:10816000000000000000000000000000000000000F +:1081700000000000000000000000000000000000FF +:1081800000000000000000000000000000000000EF +:1081900000000000000000000000000000000000DF +:1081A00000000000000000000000000000000000CF +:1081B00000000000000000000000000000000000BF +:1081C00000000000000000000000000000000000AF +:1081D000000000000000000000000000000000009F +:1081E000000000000000000000000000000000008F +:1081F000000000000000000000000000000000007F +:10820000000000000000000000000000000000006E +:10821000000000000000000000000000000000005E +:10822000000000000000000000000000000000004E +:10823000000000000000000000000000000000003E +:10824000000000000000000000000000000000002E +:10825000000000000000000000000000000000001E +:10826000000000000000000000000000000000000E +:1082700000000000000000000000000000000000FE +:1082800000000000000000000000000000000000EE +:1082900000000000000000000000000000000000DE +:1082A00000000000000000000000000000000000CE +:1082B00000000000000000000000000000000000BE +:1082C00000000000000000000000000000000000AE +:1082D000000000000000000000000000000000009E +:1082E000000000000000000000000000000000008E +:1082F000000000000000000000000000000000007E +:10830000000000000000000000000000000000006D +:10831000000000000000000000000000000000005D +:10832000000000000000000000000000000000014C +:10833000010101010101010101010101010101012D +:10834000010101010101010101010101010101011D +:10835000010101010101010101010101010101010D +:1083600001010101010101010101010101010101FD +:1083700001010101010101010101010101010101ED +:1083800001010101010101010101010101010101DD +:1083900001010101010101010101010101010101CD +:1083A00001010101010101010101010101010101BD +:1083B00001010101010101010101010101010101AD +:1083C000010101010101010101010101010101019D +:1083D000010101010101010101010101010101018D +:1083E000010101010101010101010101010101017D +:1083F000010101010101010101010101010101016D +:10840000010101010101010101010101010101015C +:10841000010101010101010101010101010101014C +:10842000010101010101010101010101010101013C +:10843000010101010101010101010101010101012C +:10844000010101010101010101010101010101011C +:10845000010101010101010101010101010101010C +:1084600001010101010101010101010101010101FC +:1084700001010101010101010101010101010101EC +:1084800001010101010101010101010101010101DC +:1084900001010101010101010101010101010101CC +:1084A00001010101010101010101010101010101BC +:1084B00001010101010101010101010101010101AC +:1084C000010101010101010101010101010101019C +:1084D000010101010101010101010101010101018C +:1084E000010101010101010101010101010101017C +:1084F000010101010101010101010101010101016C +:10850000010101010101010101010101010101015B +:10851000010101010101010101010101010101014B +:10852000010101010101010101010101010101013B +:10853000010101010101010101010101010101012B +:10854000010101010101010101010101010101011B +:10855000010101010101010101010101010101010B +:1085600001010101010101010101010101010101FB +:1085700001010101010101010101010101010101EB +:1085800001010101010101010101010101010101DB +:1085900001010101010101010101010101010101CB +:1085A00001010101010101010101010101010101BB +:1085B00001010101010101010101010101010101AB +:1085C000010101010101010101010101010101019B +:1085D000010101010101010101010101010101018B +:1085E000010101010101010101010101010101017B +:1085F000010101010101010101010101010101016B +:10860000010101010101010101010101010101015A +:10861000010101010101010101010101010101014A +:10862000010101010101010101010101010101013A +:10863000010101010101010101010101010101012A +:10864000010101010101010101010101010101011A +:10865000010101010101010101010101010101010A +:1086600001010101010101010101010101010101FA +:1086700001010101010101010101010101010101EA +:1086800001010101010101010101010101010101DA +:1086900001010101010101010101010101010101CA +:1086A00001010101010101010101010101010101BA +:1086B00001010101010101010101010101010101AA +:1086C000010101010101010101010101010101019A +:1086D000010101010101010101010101010101018A +:1086E000010101010101010101010101010101017A +:1086F000010101010101010101010101010101016A +:108700000101010101010101010101010101010159 +:108710000101010101010101010101010101010149 +:108720000101010101010101010101010101010139 +:108730000101010101010101010101010101010129 +:108740000101010101010101010101010101010119 +:108750000101010101010101010101010101010109 +:1087600001010101010101010101010101010101F9 +:1087700001010101010101010101010101010101E9 +:1087800001010101010101010101010101010101D9 +:1087900001010101010101010101010101010101C9 +:1087A00001010101010101010101010101010101B9 +:1087B00001010101010101010101010101010101A9 +:1087C0000101010101010101010101010101010199 +:1087D0000101010101010101010101010101010189 +:1087E0000101010101010101010101010101010179 +:1087F0000101010101010101010101010101010169 +:108800000101010101010101010101010101010158 +:108810000101010101010101010101010101010148 +:108820000101010101010101010101010101010138 +:108830000101010101010101010101010101010128 +:108840000101010101010101010101010101010118 +:108850000101010101010101010101010101010108 +:1088600001010101010101010101010101010101F8 +:1088700001010101010101010101010101010101E8 +:1088800001010101010101010101010101010101D8 +:1088900001010101010101010101010101010101C8 +:1088A00001010101010101010101010101010101B8 +:1088B00001010101010101010101010101010101A8 +:1088C0000101010101010101010101010101010198 +:1088D0000101010101010101010101010101010188 +:1088E0000101010101010101010101010101010178 +:1088F0000101010101010101010101010101010168 +:108900000101010101010101010101010101010157 +:108910000101010101010101010101010101010147 +:108920000101010101010101010101010101010137 +:108930000101010101010101010101010101010127 +:108940000101010101010101010101010101010117 +:108950000101010101010101010101010101010107 +:1089600001010101010101010101010101010101F7 +:1089700001010101010101010101010101010101E7 +:1089800001010101010101010101010101010101D7 +:1089900001010101010101010101010101010101C7 +:1089A00001010101010101010101010101010101B7 +:1089B00001010101010101010101010101010101A7 +:1089C0000101010101010101010101010101010197 +:1089D0000101010101010101010101010101010187 +:1089E0000101010101010101010101010101010177 +:1089F0000101010101010101010101010101010167 +:108A00000101010101010101010101010101010156 +:108A10000101010101010101010101010101010146 +:108A20000101010101010101010101010101010136 +:108A30000101010101010101010101010101010126 +:108A40000101010101010101010101010101010116 +:108A50000101010101010101010101010101010106 +:108A600001010101010101010101010101010101F6 +:108A700001010101010101010101010101010101E6 +:108A800001010101010101010101010101010101D6 +:108A900001010101010101010101010101010101C6 +:108AA00001010101010101010101010101010101B6 +:108AB00001010101010101010101010101010101A6 +:108AC0000101010101010101010101010101010196 +:108AD0000101010101010101010101010101010186 +:108AE0000101010101010101010101010101010176 +:108AF0000101010101010101010101010101010166 +:108B00000101010101010101010101010101010155 +:108B10000101010101010101010101010101010145 +:108B20000101010101010101010101010101010036 +:108B30000000000000000000000000000000000035 +:108B40000000000000000000000000000000000025 +:108B50000000000000000000000000000000000015 +:108B60000000000000000000000000000000000005 +:108B700000000000000000000000000000000000F5 +:108B800000000000000000000000000000000000E5 +:108B900000000000000000000000000000000000D5 +:108BA00000000000000000000000000000000000C5 +:108BB00000000000000000000000000000000000B5 +:108BC00000000000000000000000000000000000A5 +:108BD0000000000000000000000000000000000095 +:108BE0000000000000000000000000000000000085 +:108BF0000000000000000000000000000000000075 +:108C00000000000000000000000000000000000064 +:108C10000000000000000000000000000000000054 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 +:108C40000000000000000000000000000000000024 +:108C50000000000000000000000000000000000014 +:108C60000000000000000000000000000000000004 +:108C700000000000000000000000000000000000F4 +:108C800000000000000000000000000000000000E4 +:108C900000000000000000000000000000000000D4 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000000000000000000B4 +:108CC00000000000000000000000000000000000A4 +:108CD0000000000000000000000000000000000094 +:108CE0000000000000000000000000000000000084 +:108CF0000000000000000000000000000000000074 +:108D00000000000000000000000000000000000063 +:108D10000000000000000000000000000000000053 +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 +:108D40000000000000000000000000000000000023 +:108D50000000000000000000000000000000000013 +:108D60000000000000000000000000000000000003 +:108D700000000000000000000000000000000000F3 +:108D800000000000000000000000000000000000E3 +:108D900000000000000000000000000000000000D3 +:108DA00000000000000000000000000000000000C3 +:108DB00000000000000000000000000000000000B3 +:108DC00000000000000000000000000000000000A3 +:108DD0000000000000000000000000000000000093 +:108DE0000000000000000000000000000000000083 +:108DF0000000000000000000000000000000000073 +:108E00000000000000000000000000000000000062 +:108E10000000000000000000000000000000000052 +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 +:108E50000000000000000000000000000000000012 +:108E60000000000000000000000000000000000002 +:108E700000000000000000000000000000000000F2 +:108E800000000000000000000000000000000000E2 +:108E900000000000000000000000000000000000D2 +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC00000000000000000000000000000000000A2 +:108ED0000000000000000000000000000000000092 +:108EE0000000000000000000000000000000000082 +:108EF0000000000000000000000000000000000072 +:108F00000000000000000000000000000000000061 +:108F10000000000000000000000000000000000051 +:108F20000000000000000000000000000000000041 +:108F30000000000000000000000000000000000031 +:108F40000000000000000000000000000000000021 +:108F50000000000000000000000000000000000011 +:108F60000000000000000000000000000000000001 +:108F700000000000000000000000000000000000F1 +:108F800000000000000000000000000000000000E1 +:108F900000000000000000000000000000000000D1 +:108FA00000000000000000000000000000000000C1 +:108FB00000000000000000000000000000000000B1 +:108FC00000000000000000000000000000000000A1 +:108FD0000000000000000000000000000000000091 +:108FE0000000000000000000000000000000000081 +:108FF0000000000000000000000000000000000071 +:109000000000000000000000000000000000000060 +:109010000000000000000000000000000000000050 +:109020000000000000000000000000000000000040 +:109030000000000000000000000000000000000030 +:109040000000000000000000000000000000000020 +:109050000000000000000000000000000000000010 +:109060000000000000000000000000000000000000 +:1090700000000000000000000000000000000000F0 +:1090800000000000000000000000000000000000E0 +:1090900000000000000000000000000000000000D0 +:1090A00000000000000000000000000000000000C0 +:1090B00000000000000000000000000000000000B0 +:1090C00000000000000000000000000000000000A0 +:1090D0000000000000000000000000000000000090 +:1090E0000000000000000000000000000000000080 +:1090F0000000000000000000000000000000000070 +:10910000000000000000000000000000000000005F +:10911000000000000000000000000000000000004F +:10912000000000000000000000000000000000023D +:10913000020202020202020202020202020202020F +:1091400002020202020202020202020202020202FF +:1091500002020202020202020202020202020202EF +:1091600002020202020202020202020202020202DF +:1091700002020202020202020202020202020202CF +:1091800002020202020202020202020202020202BF +:1091900002020202020202020202020202020202AF +:1091A000020202020202020202020202020202029F +:1091B000020202020202020202020202020202028F +:1091C000020202020202020202020202020202027F +:1091D000020202020202020202020202020202026F +:1091E000020202020202020202020202020202025F +:1091F000020202020202020202020202020202024F +:10920000020202020202020202020202020202023E +:10921000020202020202020202020202020202022E +:10922000020202020202020202020202020202021E +:10923000020202020202020202020202020202020E +:1092400002020202020202020202020202020202FE +:1092500002020202020202020202020202020202EE +:1092600002020202020202020202020202020202DE +:1092700002020202020202020202020202020202CE +:1092800002020202020202020202020202020202BE +:1092900002020202020202020202020202020202AE +:1092A000020202020202020202020202020202029E +:1092B000020202020202020202020202020202028E +:1092C000020202020202020202020202020202027E +:1092D000020202020202020202020202020202026E +:1092E000020202020202020202020202020202025E +:1092F000020202020202020202020202020202024E +:10930000020202020202020202020202020202023D +:10931000020202020202020202020202020202022D +:10932000020202020202020202020202020202021D +:10933000020202020202020202020202020202020D +:1093400002020202020202020202020202020202FD +:1093500002020202020202020202020202020202ED +:1093600002020202020202020202020202020202DD +:1093700002020202020202020202020202020202CD +:1093800002020202020202020202020202020202BD +:1093900002020202020202020202020202020202AD +:1093A000020202020202020202020202020202029D +:1093B000020202020202020202020202020202028D +:1093C000020202020202020202020202020202027D +:1093D000020202020202020202020202020202026D +:1093E000020202020202020202020202020202025D +:1093F000020202020202020202020202020202024D +:10940000020202020202020202020202020202023C +:10941000020202020202020202020202020202022C +:10942000020202020202020202020202020202021C +:10943000020202020202020202020202020202020C +:1094400002020202020202020202020202020202FC +:1094500002020202020202020202020202020202EC +:1094600002020202020202020202020202020202DC +:1094700002020202020202020202020202020202CC +:1094800002020202020202020202020202020202BC +:1094900002020202020202020202020202020202AC +:1094A000020202020202020202020202020202029C +:1094B000020202020202020202020202020202028C +:1094C000020202020202020202020202020202027C +:1094D000020202020202020202020202020202026C +:1094E000020202020202020202020202020202025C +:1094F000020202020202020202020202020202024C +:10950000020202020202020202020202020202023B +:10951000020202020202020202020202020202022B +:10952000020202020202020202020202020202021B +:10953000020202020202020202020202020202020B +:1095400002020202020202020202020202020202FB +:1095500002020202020202020202020202020202EB +:1095600002020202020202020202020202020202DB +:1095700002020202020202020202020202020202CB +:1095800002020202020202020202020202020202BB +:1095900002020202020202020202020202020202AB +:1095A000020202020202020202020202020202029B +:1095B000020202020202020202020202020202028B +:1095C000020202020202020202020202020202027B +:1095D000020202020202020202020202020202026B +:1095E000020202020202020202020202020202025B +:1095F000020202020202020202020202020202024B +:10960000020202020202020202020202020202023A +:10961000020202020202020202020202020202022A +:10962000020202020202020202020202020202021A +:10963000020202020202020202020202020202020A +:1096400002020202020202020202020202020202FA +:1096500002020202020202020202020202020202EA +:1096600002020202020202020202020202020202DA +:1096700002020202020202020202020202020202CA +:1096800002020202020202020202020202020202BA +:1096900002020202020202020202020202020202AA +:1096A000020202020202020202020202020202029A +:1096B000020202020202020202020202020202028A +:1096C000020202020202020202020202020202027A +:1096D000020202020202020202020202020202026A +:1096E000020202020202020202020202020202025A +:1096F000020202020202020202020202020202024A +:109700000202020202020202020202020202020239 +:109710000202020202020202020202020202020229 +:109720000202020202020202020202020202020219 +:109730000202020202020202020202020202020209 +:1097400002020202020202020202020202020202F9 +:1097500002020202020202020202020202020202E9 +:1097600002020202020202020202020202020202D9 +:1097700002020202020202020202020202020202C9 +:1097800002020202020202020202020202020202B9 +:1097900002020202020202020202020202020202A9 +:1097A0000202020202020202020202020202020299 +:1097B0000202020202020202020202020202020289 +:1097C0000202020202020202020202020202020279 +:1097D0000202020202020202020202020202020269 +:1097E0000202020202020202020202020202020259 +:1097F0000202020202020202020202020202020249 +:109800000202020202020202020202020202020238 +:109810000202020202020202020202020202020228 +:109820000202020202020202020202020202020218 +:109830000202020202020202020202020202020208 +:1098400002020202020202020202020202020202F8 +:1098500002020202020202020202020202020202E8 +:1098600002020202020202020202020202020202D8 +:1098700002020202020202020202020202020202C8 +:1098800002020202020202020202020202020202B8 +:1098900002020202020202020202020202020202A8 +:1098A0000202020202020202020202020202020298 +:1098B0000202020202020202020202020202020288 +:1098C0000202020202020202020202020202020278 +:1098D0000202020202020202020202020202020268 +:1098E0000202020202020202020202020202020258 +:1098F0000202020202020202020202020202020248 +:109900000202020202020202020202020202020237 +:109910000202020202020202020202020202020227 +:109920000202020202020202020202020202020019 +:109930000000000000000000000000000000000027 +:109940000000000000000000000000000000000017 +:109950000000000000000000000000000000000007 +:1099600000000000000000000000000000000000F7 +:1099700000000000000000000000000000000000E7 +:1099800000000000000000000000000000000000D7 +:1099900000000000000000000000000000000000C7 +:1099A00000000000000000000000000000000000B7 +:1099B00000000000000000000000000000000000A7 +:1099C0000000000000000000000000000000000097 +:1099D0000000000000000000000000000000000087 +:1099E0000000000000000000000000000000000077 +:1099F0000000000000000000000000000000000067 +:109A00000000000000000000000000000000000056 +:109A10000000000000000000000000000000000046 +:109A20000000000000000000000000000000000036 +:109A30000000000000000000000000000000000026 +:109A40000000000000000000000000000000000016 +:109A50000000000000000000000000000000000006 +:109A600000000000000000000000000000000000F6 +:109A700000000000000000000000000000000000E6 +:109A800000000000000000000000000000000000D6 +:109A900000000000000000000000000000000000C6 +:109AA00000000000000000000000000000000000B6 +:109AB00000000000000000000000000000000000A6 +:109AC0000000000000000000000000000000000096 +:109AD0000000000000000000000000000000000086 +:109AE0000000000000000000000000000000000076 +:109AF0000000000000000000000000000000000066 +:109B00000000000000000000000000000000000055 +:109B10000000000000000000000000000000000045 +:109B20000000000000000000000000000000000035 +:109B30000000000000000000000000000000000025 +:109B40000000000000000000000000000000000015 +:109B50000000000000000000000000000000000005 +:109B600000000000000000000000000000000000F5 +:109B700000000000000000000000000000000000E5 +:109B800000000000000000000000000000000000D5 +:109B900000000000000000000000000000000000C5 +:109BA00000000000000000000000000000000000B5 +:109BB00000000000000000000000000000000000A5 +:109BC0000000000000000000000000000000000095 +:109BD0000000000000000000000000000000000085 +:109BE0000000000000000000000000000000000075 +:109BF0000000000000000000000000000000000065 +:109C00000000000000000000000000000000000054 +:109C10000000000000000000000000000000000044 +:109C20000000000000000000000000000000000034 +:109C30000000000000000000000000000000000024 +:109C40000000000000000000000000000000000014 +:109C50000000000000000000000000000000000004 +:109C600000000000000000000000000000000000F4 +:109C700000000000000000000000000000000000E4 +:109C800000000000000000000000000000000000D4 +:109C900000000000000000000000000000000000C4 +:109CA00000000000000000000000000000000000B4 +:109CB00000000000000000000000000000000000A4 +:109CC0000000000000000000000000000000000094 +:109CD0000000000000000000000000000000000084 +:109CE0000000000000000000000000000000000074 +:109CF0000000000000000000000000000000000064 +:109D00000000000000000000000000000000000053 +:109D10000000000000000000000000000000000043 +:109D20000000000000000000000000000000000033 +:109D30000000000000000000000000000000000023 +:109D40000000000000000000000000000000000013 +:109D50000000000000000000000000000000000003 +:109D600000000000000000000000000000000000F3 +:109D700000000000000000000000000000000000E3 +:109D800000000000000000000000000000000000D3 +:109D900000000000000000000000000000000000C3 +:109DA00000000000000000000000000000000000B3 +:109DB00000000000000000000000000000000000A3 +:109DC0000000000000000000000000000000000093 +:109DD0000000000000000000000000000000000083 +:109DE0000000000000000000000000000000000073 +:109DF0000000000000000000000000000000000063 +:109E00000000000000000000000000000000000052 +:109E10000000000000000000000000000000000042 +:109E20000000000000000000000000000000000032 +:109E30000000000000000000000000000000000022 +:109E40000000000000000000000000000000000012 +:109E50000000000000000000000000000000000002 +:109E600000000000000000000000000000000000F2 +:109E700000000000000000000000000000000000E2 +:109E800000000000000000000000000000000000D2 +:109E900000000000000000000000000000000000C2 +:109EA00000000000000000000000000000000000B2 +:109EB00000000000000000000000000000000000A2 +:109EC0000000000000000000000000000000000092 +:109ED0000000000000000000000000000000000082 +:109EE0000000000000000000000000000000000072 +:109EF0000000000000000000000000000000000062 +:109F00000000000000000000000000000000000051 +:109F10000000000000000000000000000000000041 +:109F200000000000000000000000000000000039F8 +:109F30000000000000000001010101010101010118 +:109F40000101010101010101010101010101010101 +:109F500001010101010101010101010101010101F1 +:109F600001010101010101010101010101010101E1 +:109F700001010101010101010101010101010101D1 +:109F800001010101010101010101010101010101C1 +:109F900001010101010101010101010101010101B1 +:109FA00001010101010101010101010101010101A1 +:109FB0000101010101010101010101010101010191 +:109FC0000101010101010101010101010101010181 +:109FD0000101010101010101010101010101010171 +:109FE0000101010101010101010101010101010161 +:109FF0000101010101010101010101010101010151 +:10A000000101010101010101010101010101010140 +:10A010000101010101010101010101010101010130 +:10A020000101010101010101010101010101010120 +:10A030000101010101010101010101010101010110 +:10A040000101010101010101010101010101010100 +:10A0500001010101010101010101010101010101F0 +:10A0600001010101010101010101010101010101E0 +:10A0700001010101010101010101010101010101D0 +:10A0800001010101010101010101010101010101C0 +:10A0900001010101010101010101010101010101B0 +:10A0A00001010101010101010101010101010101A0 +:10A0B0000101010101010101010101010101010190 +:10A0C0000101010101010101010101010101010180 +:10A0D0000101010101010101010101010101010170 +:10A0E0000101010101010101010101010101010160 +:10A0F0000101010101010101010101010101010150 +:10A10000010101010101010101010101010101013F +:10A11000010101010101010101010101010101012F +:10A12000010101010101010101010101010101011F +:10A13000010101010101010101010101010101010F +:10A1400001010101010101010101010101010101FF +:10A1500001010101010101010101010101010101EF +:10A1600001010101010101010101010101010101DF +:10A1700001010101010101010101010101010101CF +:10A1800001010101010101010101010101010101BF +:10A1900001010101010101010101010101010101AF +:10A1A000010101010101010101010101010101019F +:10A1B000010101010101010101010101010101018F +:10A1C000010101010101010101010101010101017F +:10A1D000010101010101010101010101010101016F +:10A1E000010101010101010101010101010101015F +:10A1F000010101010101010101010101010101014F +:10A20000010101010101010101010101010101013E +:10A21000010101010101010101010101010101012E +:10A22000010101010101010101010101010101011E +:10A23000010101010101010101010101010101010E +:10A2400001010101010101010101010101010101FE +:10A2500001010101010101010101010101010101EE +:10A2600001010101010101010101010101010101DE +:10A2700001010101010101010101010101010101CE +:10A2800001010101010101010101010101010101BE +:10A2900001010101010101010101010101010101AE +:10A2A000010101010101010101010101010101019E +:10A2B000010101010101010101010101010101018E +:10A2C000010101010101010101010101010101017E +:10A2D000010101010101010101010101010101016E +:10A2E000010101010101010101010101010101015E +:10A2F000010101010101010101010101010101014E +:10A30000010101010101010101010101010101013D +:10A31000010101010101010101010101010101012D +:10A32000010101010101010101010101010101011D +:10A33000010101010101010101010101010101010D +:10A3400001010101010101010101010101010101FD +:10A3500001010101010101010101010101010101ED +:10A3600001010101010101010101010101010101DD +:10A3700001010101010101010101010101010101CD +:10A3800001010101010101010101010101010101BD +:10A3900001010101010101010101010101010101AD +:10A3A000010101010101010101010101010101019D +:10A3B000010101010101010101010101010101018D +:10A3C000010101010101010101010101010101017D +:10A3D000010101010101010101010101010101016D +:10A3E000010101010101010101010101010101015D +:10A3F000010101010101010101010101010101014D +:10A40000010101010101010101010101010101013C +:10A41000010101010101010101010101010101012C +:10A42000010101010101010101010101010101011C +:10A43000010101010101010101010101010101010C +:10A4400001010101010101010101010101010101FC +:10A4500001010101010101010101010101010101EC +:10A4600001010101010101010101010101010101DC +:10A4700001010101010101010101010101010101CC +:10A4800001010101010101010101010101010101BC +:10A4900001010101010101010101010101010101AC +:10A4A000010101010101010101010101010101019C +:10A4B000010101010101010101010101010101018C +:10A4C000010101010101010101010101010101017C +:10A4D000010101010101010101010101010101016C +:10A4E000010101010101010101010101010101015C +:10A4F000010101010101010101010101010101014C +:10A50000010101010101010101010101010101013B +:10A51000010101010101010101010101010101012B +:10A52000010101010101010101010101010101011B +:10A53000010101010101010101010101010101010B +:10A5400001010101010101010101010101010101FB +:10A5500001010101010101010101010101010101EB +:10A5600001010101010101010101010101010101DB +:10A5700001010101010101010101010101010101CB +:10A5800001010101010101010101010101010101BB +:10A5900001010101010101010101010101010101AB +:10A5A000010101010101010101010101010101019B +:10A5B000010101010101010101010101010101018B +:10A5C000010101010101010101010101010101017B +:10A5D000010101010101010101010101010101016B +:10A5E000010101010101010101010101010101015B +:10A5F000010101010101010101010101010101014B +:10A60000010101010101010101010101010101013A +:10A61000010101010101010101010101010101012A +:10A62000010101010101010101010101010101011A +:10A63000010101010101010101010101010101010A +:10A6400001010101010101010101010101010101FA +:10A6500001010101010101010101010101010101EA +:10A6600001010101010101010101010101010101DA +:10A6700001010101010101010101010101010101CA +:10A6800001010101010101010101010101010101BA +:10A6900001010101010101010101010101010101AA +:10A6A000010101010101010101010101010101019A +:10A6B000010101010101010101010101010101018A +:10A6C000010101010101010101010101010101017A +:10A6D000010101010101010101010101010101016A +:10A6E000010101010101010101010101010101015A +:10A6F000010101010101010101010101010101014A +:10A700000101010101010101010101010101010139 +:10A710000101010101010101010101010101010129 +:10A720000101010101010101010101010101010119 +:10A730000101010101010100000000000000000012 +:10A740000000000000000000000000000000000009 +:10A7500000000000000000000000000000000000F9 +:10A7600000000000000000000000000000000000E9 +:10A7700000000000000000000000000000000000D9 +:10A7800000000000000000000000000000000000C9 +:10A7900000000000000000000000000000000000B9 +:10A7A00000000000000000000000000000000000A9 +:10A7B0000000000000000000000000000000000099 +:10A7C0000000000000000000000000000000000089 +:10A7D0000000000000000000000000000000000079 +:10A7E0000000000000000000000000000000000069 +:10A7F0000000000000000000000000000000000059 +:10A800000000000000000000000000000000000048 +:10A810000000000000000000000000000000000038 +:10A820000000000000000000000000000000000028 +:10A830000000000000000000000000000000000018 +:10A840000000000000000000000000000000000008 +:10A8500000000000000000000000000000000000F8 +:10A8600000000000000000000000000000000000E8 +:10A8700000000000000000000000000000000000D8 +:10A8800000000000000000000000000000000000C8 +:10A8900000000000000000000000000000000000B8 +:10A8A00000000000000000000000000000000000A8 +:10A8B0000000000000000000000000000000000098 +:10A8C0000000000000000000000000000000000088 +:10A8D0000000000000000000000000000000000078 +:10A8E0000000000000000000000000000000000068 +:10A8F0000000000000000000000000000000000058 +:10A900000000000000000000000000000000000047 +:10A910000000000000000000000000000000000037 +:10A920000000000000000000000000000000000027 +:10A930000000000000000000000000000000000017 +:10A940000000000000000000000000000000000007 +:10A9500000000000000000000000000000000000F7 +:10A9600000000000000000000000000000000000E7 +:10A9700000000000000000000000000000000000D7 +:10A9800000000000000000000000000000000000C7 +:10A9900000000000000000000000000000000000B7 +:10A9A00000000000000000000000000000000000A7 +:10A9B0000000000000000000000000000000000097 +:10A9C0000000000000000000000000000000000087 +:10A9D0000000000000000000000000000000000077 +:10A9E0000000000000000000000000000000000067 +:10A9F0000000000000000000000000000000000057 +:10AA00000000000000000000000000000000000046 +:10AA10000000000000000000000000000000000036 +:10AA20000000000000000000000000000000000026 +:10AA30000000000000000000000000000000000016 +:10AA40000000000000000000000000000000000006 +:10AA500000000000000000000000000000000000F6 +:10AA600000000000000000000000000000000000E6 +:10AA700000000000000000000000000000000000D6 +:10AA800000000000000000000000000000000000C6 +:10AA900000000000000000000000000000000000B6 +:10AAA00000000000000000000000000000000000A6 +:10AAB0000000000000000000000000000000000096 +:10AAC0000000000000000000000000000000000086 +:10AAD0000000000000000000000000000000000076 +:10AAE0000000000000000000000000000000000066 +:10AAF0000000000000000000000000000000000056 +:10AB00000000000000000000000000000000000045 +:10AB10000000000000000000000000000000000035 +:10AB20000000000000000000000000000000000025 +:10AB30000000000000000000000000000000000015 +:10AB40000000000000000000000000000000000005 +:10AB500000000000000000000000000000000000F5 +:10AB600000000000000000000000000000000000E5 +:10AB700000000000000000000000000000000000D5 +:10AB800000000000000000000000000000000000C5 +:10AB900000000000000000000000000000000000B5 +:10ABA00000000000000000000000000000000000A5 +:10ABB0000000000000000000000000000000000095 +:10ABC0000000000000000000000000000000000085 +:10ABD0000000000000000000000000000000000075 +:10ABE0000000000000000000000000000000000065 +:10ABF0000000000000000000000000000000000055 +:10AC00000000000000000000000000000000000044 +:10AC10000000000000000000000000000000000034 +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000000000000000000000014 +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000000F4 +:10AC600000000000000000000000000000000000E4 +:10AC700000000000000000000000000000000000D4 +:10AC800000000000000000000000000000000000C4 +:10AC900000000000000000000000000000000000B4 +:10ACA00000000000000000000000000000000000A4 +:10ACB0000000000000000000000000000000000094 +:10ACC0000000000000000000000000000000000084 +:10ACD0000000000000000000000000000000000074 +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000000000000000054 +:10AD00000000000000000000000000000000000043 +:10AD10000000000000000000000000000000000033 +:10AD20000000000000000000000000000000000023 +:10AD30000000000000000002020202020202020201 +:10AD400002020202020202020202020202020202E3 +:10AD500002020202020202020202020202020202D3 +:10AD600002020202020202020202020202020202C3 +:10AD700002020202020202020202020202020202B3 +:10AD800002020202020202020202020202020202A3 +:10AD90000202020202020202020202020202020293 +:10ADA0000202020202020202020202020202020283 +:10ADB0000202020202020202020202020202020273 +:10ADC0000202020202020202020202020202020263 +:10ADD0000202020202020202020202020202020253 +:10ADE0000202020202020202020202020202020243 +:10ADF0000202020202020202020202020202020233 +:10AE00000202020202020202020202020202020222 +:10AE10000202020202020202020202020202020212 +:10AE20000202020202020202020202020202020202 +:10AE300002020202020202020202020202020202F2 +:10AE400002020202020202020202020202020202E2 +:10AE500002020202020202020202020202020202D2 +:10AE600002020202020202020202020202020202C2 +:10AE700002020202020202020202020202020202B2 +:10AE800002020202020202020202020202020202A2 +:10AE90000202020202020202020202020202020292 +:10AEA0000202020202020202020202020202020282 +:10AEB0000202020202020202020202020202020272 +:10AEC0000202020202020202020202020202020262 +:10AED0000202020202020202020202020202020252 +:10AEE0000202020202020202020202020202020242 +:10AEF0000202020202020202020202020202020232 +:10AF00000202020202020202020202020202020221 +:10AF10000202020202020202020202020202020211 +:10AF20000202020202020202020202020202020201 +:10AF300002020202020202020202020202020202F1 +:10AF400002020202020202020202020202020202E1 +:10AF500002020202020202020202020202020202D1 +:10AF600002020202020202020202020202020202C1 +:10AF700002020202020202020202020202020202B1 +:10AF800002020202020202020202020202020202A1 +:10AF90000202020202020202020202020202020291 +:10AFA0000202020202020202020202020202020281 +:10AFB0000202020202020202020202020202020271 +:10AFC0000202020202020202020202020202020261 +:10AFD0000202020202020202020202020202020251 +:10AFE0000202020202020202020202020202020241 +:10AFF0000202020202020202020202020202020231 +:10B000000202020202020202020202020202020220 +:10B010000202020202020202020202020202020210 +:10B020000202020202020202020202020202020200 +:10B0300002020202020202020202020202020202F0 +:10B0400002020202020202020202020202020202E0 +:10B0500002020202020202020202020202020202D0 +:10B0600002020202020202020202020202020202C0 +:10B0700002020202020202020202020202020202B0 +:10B0800002020202020202020202020202020202A0 +:10B090000202020202020202020202020202020290 +:10B0A0000202020202020202020202020202020280 +:10B0B0000202020202020202020202020202020270 +:10B0C0000202020202020202020202020202020260 +:10B0D0000202020202020202020202020202020250 +:10B0E0000202020202020202020202020202020240 +:10B0F0000202020202020202020202020202020230 +:10B10000020202020202020202020202020202021F +:10B11000020202020202020202020202020202020F +:10B1200002020202020202020202020202020202FF +:10B1300002020202020202020202020202020202EF +:10B1400002020202020202020202020202020202DF +:10B1500002020202020202020202020202020202CF +:10B1600002020202020202020202020202020202BF +:10B1700002020202020202020202020202020202AF +:10B18000020202020202020202020202020202029F +:10B19000020202020202020202020202020202028F +:10B1A000020202020202020202020202020202027F +:10B1B000020202020202020202020202020202026F +:10B1C000020202020202020202020202020202025F +:10B1D000020202020202020202020202020202024F +:10B1E000020202020202020202020202020202023F +:10B1F000020202020202020202020202020202022F +:10B20000020202020202020202020202020202021E +:10B21000020202020202020202020202020202020E +:10B2200002020202020202020202020202020202FE +:10B2300002020202020202020202020202020202EE +:10B2400002020202020202020202020202020202DE +:10B2500002020202020202020202020202020202CE +:10B2600002020202020202020202020202020202BE +:10B2700002020202020202020202020202020202AE +:10B28000020202020202020202020202020202029E +:10B29000020202020202020202020202020202028E +:10B2A000020202020202020202020202020202027E +:10B2B000020202020202020202020202020202026E +:10B2C000020202020202020202020202020202025E +:10B2D000020202020202020202020202020202024E +:10B2E000020202020202020202020202020202023E +:10B2F000020202020202020202020202020202022E +:10B30000020202020202020202020202020202021D +:10B31000020202020202020202020202020202020D +:10B3200002020202020202020202020202020202FD +:10B3300002020202020202020202020202020202ED +:10B3400002020202020202020202020202020202DD +:10B3500002020202020202020202020202020202CD +:10B3600002020202020202020202020202020202BD +:10B3700002020202020202020202020202020202AD +:10B38000020202020202020202020202020202029D +:10B39000020202020202020202020202020202028D +:10B3A000020202020202020202020202020202027D +:10B3B000020202020202020202020202020202026D +:10B3C000020202020202020202020202020202025D +:10B3D000020202020202020202020202020202024D +:10B3E000020202020202020202020202020202023D +:10B3F000020202020202020202020202020202022D +:10B40000020202020202020202020202020202021C +:10B41000020202020202020202020202020202020C +:10B4200002020202020202020202020202020202FC +:10B4300002020202020202020202020202020202EC +:10B4400002020202020202020202020202020202DC +:10B4500002020202020202020202020202020202CC +:10B4600002020202020202020202020202020202BC +:10B4700002020202020202020202020202020202AC +:10B48000020202020202020202020202020202029C +:10B49000020202020202020202020202020202028C +:10B4A000020202020202020202020202020202027C +:10B4B000020202020202020202020202020202026C +:10B4C000020202020202020202020202020202025C +:10B4D000020202020202020202020202020202024C +:10B4E000020202020202020202020202020202023C +:10B4F000020202020202020202020202020202022C +:10B50000020202020202020202020202020202021B +:10B51000020202020202020202020202020202020B +:10B5200002020202020202020202020202020202FB +:10B5300002020202020202000000000000000000FD +:10B5400000000000000000000000000000000000FB +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B5700000000000000000000000000000000000CB +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C000000000000000000000000000000000007B +:10B5D000000000000000000000000000000000006B +:10B5E000000000000000000000000000000000005B +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000000000000000FA +:10B6500000000000000000000000000000000000EA +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B7400000000000000000000000000000000000F9 +:10B7500000000000000000000000000000000000E9 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 +:10B7A0000000000000000000000000000000000099 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000000000000000079 +:10B7D0000000000000000000000000000000000069 +:10B7E0000000000000000000000000000000000059 +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820000000000000000000000000000000000018 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000000E8 +:10B8600000000000000000000000000000000000D8 +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000000000000000000068 +:10B8E0000000000000000000000000000000000058 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000000000000000000000037 +:10B910000000000000000000000000000000000027 +:10B920000000000000000000000000000000000017 +:10B930000000000000000000000000000000000007 +:10B9400000000000000000000000000000000000F7 +:10B9500000000000000000000000000000000000E7 +:10B9600000000000000000000000000000000000D7 +:10B9700000000000000000000000000000000000C7 +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000000000000067 +:10B9E0000000000000000000000000000000000057 +:10B9F0000000000000000000000000000000000047 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000000000000E6 +:10BA600000000000000000000000000000000000D6 +:10BA700000000000000000000000000000000000C6 +:10BA800000000000000000000000000000000000B6 +:10BA900000000000000000000000000000000000A6 +:10BAA0000000000000000000000000000000000096 +:10BAB0000000000000000000000000000000000086 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000000000000000056 +:10BAF0000000000000000000000000000000000046 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000064 +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD300000000000000000010101010101010101FA +:10BD400001010101010101010101010101010101E3 +:10BD500001010101010101010101010101010101D3 +:10BD600001010101010101010101010101010101C3 +:10BD700001010101010101010101010101010101B3 +:10BD800001010101010101010101010101010101A3 +:10BD90000101010101010101010101010101010193 +:10BDA0000101010101010101010101010101010183 +:10BDB0000101010101010101010101010101010173 +:10BDC0000101010101010101010101010101010163 +:10BDD0000101010101010101010101010101010153 +:10BDE0000101010101010101010101010101010143 +:10BDF0000101010101010101010101010101010133 +:10BE00000101010101010101010101010101010122 +:10BE10000101010101010101010101010101010112 +:10BE20000101010101010101010101010101010102 +:10BE300001010101010101010101010101010101F2 +:10BE400001010101010101010101010101010101E2 +:10BE500001010101010101010101010101010101D2 +:10BE600001010101010101010101010101010101C2 +:10BE700001010101010101010101010101010101B2 +:10BE800001010101010101010101010101010101A2 +:10BE90000101010101010101010101010101010192 +:10BEA0000101010101010101010101010101010182 +:10BEB0000101010101010101010101010101010172 +:10BEC0000101010101010101010101010101010162 +:10BED0000101010101010101010101010101010152 +:10BEE0000101010101010101010101010101010142 +:10BEF0000101010101010101010101010101010132 +:10BF00000101010101010101010101010101010121 +:10BF10000101010101010101010101010101010111 +:10BF20000101010101010101010101010101010101 +:10BF300001010101010101010101010101010101F1 +:10BF400001010101010101010101010101010101E1 +:10BF500001010101010101010101010101010101D1 +:10BF600001010101010101010101010101010101C1 +:10BF700001010101010101010101010101010101B1 +:10BF800001010101010101010101010101010101A1 +:10BF90000101010101010101010101010101010191 +:10BFA0000101010101010101010101010101010181 +:10BFB0000101010101010101010101010101010171 +:10BFC0000101010101010101010101010101010161 +:10BFD0000101010101010101010101010101010151 +:10BFE0000101010101010101010101010101010141 +:10BFF0000101010101010101010101010101010131 +:10C000000101010101010101010101010101010120 +:10C010000101010101010101010101010101010110 +:10C020000101010101010101010101010101010100 +:10C0300001010101010101010101010101010101F0 +:10C0400001010101010101010101010101010101E0 +:10C0500001010101010101010101010101010101D0 +:10C0600001010101010101010101010101010101C0 +:10C0700001010101010101010101010101010101B0 +:10C0800001010101010101010101010101010101A0 +:10C090000101010101010101010101010101010190 +:10C0A0000101010101010101010101010101010180 +:10C0B0000101010101010101010101010101010170 +:10C0C0000101010101010101010101010101010160 +:10C0D0000101010101010101010101010101010150 +:10C0E0000101010101010101010101010101010140 +:10C0F0000101010101010101010101010101010130 +:10C10000010101010101010101010101010101011F +:10C11000010101010101010101010101010101010F +:10C1200001010101010101010101010101010101FF +:10C1300001010101010101010101010101010101EF +:10C1400001010101010101010101010101010101DF +:10C1500001010101010101010101010101010101CF +:10C1600001010101010101010101010101010101BF +:10C1700001010101010101010101010101010101AF +:10C18000010101010101010101010101010101019F +:10C19000010101010101010101010101010101018F +:10C1A000010101010101010101010101010101017F +:10C1B000010101010101010101010101010101016F +:10C1C000010101010101010101010101010101015F +:10C1D000010101010101010101010101010101014F +:10C1E000010101010101010101010101010101013F +:10C1F000010101010101010101010101010101012F +:10C20000010101010101010101010101010101011E +:10C21000010101010101010101010101010101010E +:10C2200001010101010101010101010101010101FE +:10C2300001010101010101010101010101010101EE +:10C2400001010101010101010101010101010101DE +:10C2500001010101010101010101010101010101CE +:10C2600001010101010101010101010101010101BE +:10C2700001010101010101010101010101010101AE +:10C28000010101010101010101010101010101019E +:10C29000010101010101010101010101010101018E +:10C2A000010101010101010101010101010101017E +:10C2B000010101010101010101010101010101016E +:10C2C000010101010101010101010101010101015E +:10C2D000010101010101010101010101010101014E +:10C2E000010101010101010101010101010101013E +:10C2F000010101010101010101010101010101012E +:10C30000010101010101010101010101010101011D +:10C31000010101010101010101010101010101010D +:10C3200001010101010101010101010101010101FD +:10C3300001010101010101010101010101010101ED +:10C3400001010101010101010101010101010101DD +:10C3500001010101010101010101010101010101CD +:10C3600001010101010101010101010101010101BD +:10C3700001010101010101010101010101010101AD +:10C38000010101010101010101010101010101019D +:10C39000010101010101010101010101010101018D +:10C3A000010101010101010101010101010101017D +:10C3B000010101010101010101010101010101016D +:10C3C000010101010101010101010101010101015D +:10C3D000010101010101010101010101010101014D +:10C3E000010101010101010101010101010101013D +:10C3F000010101010101010101010101010101012D +:10C40000010101010101010101010101010101011C +:10C41000010101010101010101010101010101010C +:10C4200001010101010101010101010101010101FC +:10C4300001010101010101010101010101010101EC +:10C4400001010101010101010101010101010101DC +:10C4500001010101010101010101010101010101CC +:10C4600001010101010101010101010101010101BC +:10C4700001010101010101010101010101010101AC +:10C48000010101010101010101010101010101019C +:10C49000010101010101010101010101010101018C +:10C4A000010101010101010101010101010101017C +:10C4B000010101010101010101010101010101016C +:10C4C000010101010101010101010101010101015C +:10C4D000010101010101010101010101010101014C +:10C4E000010101010101010101010101010101013C +:10C4F000010101010101010101010101010101012C +:10C50000010101010101010101010101010101011B +:10C51000010101010101010101010101010101010B +:10C5200001010101010101010101010101010101FB +:10C5300001010101010101000000000000000000F4 +:10C5400000000000000000000000000000000000EB +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000000000000000009B +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000000006B +:10C5D000000000000000000000000000000000005B +:10C5E000000000000000000000000000000000004B +:10C5F000000000000000000000000000000000003B +:10C60000000000000000000000000000000000002A +:10C61000000000000000000000000000000000001A +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000000CA +:10C6700000000000000000000000000000000000BA +:10C6800000000000000000000000000000000000AA +:10C69000000000000000000000000000000000009A +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D000000000000000000000000000000000005A +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C710000000000000000000000000000000000019 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000000000000000D9 +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F0000000000000000000000000000000000039 +:10C800000000000000000000000000000000000028 +:10C810000000000000000000000000000000000018 +:10C820000000000000000000000000000000000008 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000000000000000000000C8 +:10C8700000000000000000000000000000000000B8 +:10C8800000000000000000000000000000000000A8 +:10C890000000000000000000000000000000000098 +:10C8A0000000000000000000000000000000000088 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E0000000000000000000000000000000000048 +:10C8F0000000000000000000000000000000000038 +:10C900000000000000000000000000000000000027 +:10C910000000000000000000000000000000000017 +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000000000000000000000000C7 +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A0000000000000000000000000000000000087 +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E0000000000000000000000000000000000047 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10000000000000000000000000000000000016 +:10CA20000000000000000000000000000000000006 +:10CA300000000000000000000000000000000000F6 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000000000000000000000000000C6 +:10CA700000000000000000000000000000000000B6 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB0000000000000000000000000000000000076 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000000000000000000000046 +:10CAF0000000000000000000000000000000000036 +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 +:10CB20000000000000000000000000000000000005 +:10CB300000000000000000020202020202020202E3 +:10CB400002020202020202020202020202020202C5 +:10CB500002020202020202020202020202020202B5 +:10CB600002020202020202020202020202020202A5 +:10CB70000202020202020202020202020202020295 +:10CB80000202020202020202020202020202020285 +:10CB90000202020202020202020202020202020275 +:10CBA0000202020202020202020202020202020265 +:10CBB0000202020202020202020202020202020255 +:10CBC0000202020202020202020202020202020245 +:10CBD0000202020202020202020202020202020235 +:10CBE0000202020202020202020202020202020225 +:10CBF0000202020202020202020202020202020215 +:10CC00000202020202020202020202020202020204 +:10CC100002020202020202020202020202020202F4 +:10CC200002020202020202020202020202020202E4 +:10CC300002020202020202020202020202020202D4 +:10CC400002020202020202020202020202020202C4 +:10CC500002020202020202020202020202020202B4 +:10CC600002020202020202020202020202020202A4 +:10CC70000202020202020202020202020202020294 +:10CC80000202020202020202020202020202020284 +:10CC90000202020202020202020202020202020274 +:10CCA0000202020202020202020202020202020264 +:10CCB0000202020202020202020202020202020254 +:10CCC0000202020202020202020202020202020244 +:10CCD0000202020202020202020202020202020234 +:10CCE0000202020202020202020202020202020224 +:10CCF0000202020202020202020202020202020214 +:10CD00000202020202020202020202020202020203 +:10CD100002020202020202020202020202020202F3 +:10CD200002020202020202020202020202020202E3 +:10CD300002020202020202020202020202020202D3 +:10CD400002020202020202020202020202020202C3 +:10CD500002020202020202020202020202020202B3 +:10CD600002020202020202020202020202020202A3 +:10CD70000202020202020202020202020202020293 +:10CD80000202020202020202020202020202020283 +:10CD90000202020202020202020202020202020273 +:10CDA0000202020202020202020202020202020263 +:10CDB0000202020202020202020202020202020253 +:10CDC0000202020202020202020202020202020243 +:10CDD0000202020202020202020202020202020233 +:10CDE0000202020202020202020202020202020223 +:10CDF0000202020202020202020202020202020213 +:10CE00000202020202020202020202020202020202 +:10CE100002020202020202020202020202020202F2 +:10CE200002020202020202020202020202020202E2 +:10CE300002020202020202020202020202020202D2 +:10CE400002020202020202020202020202020202C2 +:10CE500002020202020202020202020202020202B2 +:10CE600002020202020202020202020202020202A2 +:10CE70000202020202020202020202020202020292 +:10CE80000202020202020202020202020202020282 +:10CE90000202020202020202020202020202020272 +:10CEA0000202020202020202020202020202020262 +:10CEB0000202020202020202020202020202020252 +:10CEC0000202020202020202020202020202020242 +:10CED0000202020202020202020202020202020232 +:10CEE0000202020202020202020202020202020222 +:10CEF0000202020202020202020202020202020212 +:10CF00000202020202020202020202020202020201 +:10CF100002020202020202020202020202020202F1 +:10CF200002020202020202020202020202020202E1 +:10CF300002020202020202020202020202020202D1 +:10CF400002020202020202020202020202020202C1 +:10CF500002020202020202020202020202020202B1 +:10CF600002020202020202020202020202020202A1 +:10CF70000202020202020202020202020202020291 +:10CF80000202020202020202020202020202020281 +:10CF90000202020202020202020202020202020271 +:10CFA0000202020202020202020202020202020261 +:10CFB0000202020202020202020202020202020251 +:10CFC0000202020202020202020202020202020241 +:10CFD0000202020202020202020202020202020231 +:10CFE0000202020202020202020202020202020221 +:10CFF0000202020202020202020202020202020211 +:10D000000202020202020202020202020202020200 +:10D0100002020202020202020202020202020202F0 +:10D0200002020202020202020202020202020202E0 +:10D0300002020202020202020202020202020202D0 +:10D0400002020202020202020202020202020202C0 +:10D0500002020202020202020202020202020202B0 +:10D0600002020202020202020202020202020202A0 +:10D070000202020202020202020202020202020290 +:10D080000202020202020202020202020202020280 +:10D090000202020202020202020202020202020270 +:10D0A0000202020202020202020202020202020260 +:10D0B0000202020202020202020202020202020250 +:10D0C0000202020202020202020202020202020240 +:10D0D0000202020202020202020202020202020230 +:10D0E0000202020202020202020202020202020220 +:10D0F0000202020202020202020202020202020210 +:10D1000002020202020202020202020202020202FF +:10D1100002020202020202020202020202020202EF +:10D1200002020202020202020202020202020202DF +:10D1300002020202020202020202020202020202CF +:10D1400002020202020202020202020202020202BF +:10D1500002020202020202020202020202020202AF +:10D16000020202020202020202020202020202029F +:10D17000020202020202020202020202020202028F +:10D18000020202020202020202020202020202027F +:10D19000020202020202020202020202020202026F +:10D1A000020202020202020202020202020202025F +:10D1B000020202020202020202020202020202024F +:10D1C000020202020202020202020202020202023F +:10D1D000020202020202020202020202020202022F +:10D1E000020202020202020202020202020202021F +:10D1F000020202020202020202020202020202020F +:10D2000002020202020202020202020202020202FE +:10D2100002020202020202020202020202020202EE +:10D2200002020202020202020202020202020202DE +:10D2300002020202020202020202020202020202CE +:10D2400002020202020202020202020202020202BE +:10D2500002020202020202020202020202020202AE +:10D26000020202020202020202020202020202029E +:10D27000020202020202020202020202020202028E +:10D28000020202020202020202020202020202027E +:10D29000020202020202020202020202020202026E +:10D2A000020202020202020202020202020202025E +:10D2B000020202020202020202020202020202024E +:10D2C000020202020202020202020202020202023E +:10D2D000020202020202020202020202020202022E +:10D2E000020202020202020202020202020202021E +:10D2F000020202020202020202020202020202020E +:10D3000002020202020202020202020202020202FD +:10D3100002020202020202020202020202020202ED +:10D3200002020202020202020202020202020202DD +:10D3300002020202020202000000000000000000DF +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD +:10D3700000000000000000000000000000000000AD +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000000000000000C9 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000049 +:10D7E0000000000000000000000000000000000039 +:10D7F0000000000000000000000000000000000029 +:10D800000000000000000000000000000000000018 +:10D810000000000000000000000000000000000008 +:10D8200000000000000000000000000000000000F8 +:10D83000000000000000003F0000000000000001A8 +:10D8400001010101010101010101010101010101C8 +:10D8500001010101010101010101010101010101B8 +:10D8600001010101010101010101010101010101A8 +:10D870000101010101010101010101010101010198 +:10D880000101010101010101010101010101010188 +:10D890000101010101010101010101010101010178 +:10D8A0000101010101010101010101010101010168 +:10D8B0000101010101010101010101010101010158 +:10D8C0000101010101010101010101010101010148 +:10D8D0000101010101010101010101010101010138 +:10D8E0000101010101010101010101010101010128 +:10D8F0000101010101010101010101010101010118 +:10D900000101010101010101010101010101010107 +:10D9100001010101010101010101010101010101F7 +:10D9200001010101010101010101010101010101E7 +:10D9300001010101010101010101010101010101D7 +:10D9400001010101010101010101010101010101C7 +:10D9500001010101010101010101010101010101B7 +:10D9600001010101010101010101010101010101A7 +:10D970000101010101010101010101010101010197 +:10D980000101010101010101010101010101010187 +:10D990000101010101010101010101010101010177 +:10D9A0000101010101010101010101010101010167 +:10D9B0000101010101010101010101010101010157 +:10D9C0000101010101010101010101010101010147 +:10D9D0000101010101010101010101010101010137 +:10D9E0000101010101010101010101010101010127 +:10D9F0000101010101010101010101010101010117 +:10DA00000101010101010101010101010101010106 +:10DA100001010101010101010101010101010101F6 +:10DA200001010101010101010101010101010101E6 +:10DA300001010101010101010101010101010101D6 +:10DA400001010101010101010101010101010101C6 +:10DA500001010101010101010101010101010101B6 +:10DA600001010101010101010101010101010101A6 +:10DA70000101010101010101010101010101010196 +:10DA80000101010101010101010101010101010186 +:10DA90000101010101010101010101010101010176 +:10DAA0000101010101010101010101010101010166 +:10DAB0000101010101010101010101010101010156 +:10DAC0000101010101010101010101010101010146 +:10DAD0000101010101010101010101010101010136 +:10DAE0000101010101010101010101010101010126 +:10DAF0000101010101010101010101010101010116 +:10DB00000101010101010101010101010101010105 +:10DB100001010101010101010101010101010101F5 +:10DB200001010101010101010101010101010101E5 +:10DB300001010101010101010101010101010101D5 +:10DB400001010101010101010101010101010101C5 +:10DB500001010101010101010101010101010101B5 +:10DB600001010101010101010101010101010101A5 +:10DB70000101010101010101010101010101010195 +:10DB80000101010101010101010101010101010185 +:10DB90000101010101010101010101010101010175 +:10DBA0000101010101010101010101010101010165 +:10DBB0000101010101010101010101010101010155 +:10DBC0000101010101010101010101010101010145 +:10DBD0000101010101010101010101010101010135 +:10DBE0000101010101010101010101010101010125 +:10DBF0000101010101010101010101010101010115 +:10DC00000101010101010101010101010101010104 +:10DC100001010101010101010101010101010101F4 +:10DC200001010101010101010101010101010101E4 +:10DC300001010101010101010101010101010101D4 +:10DC400001010101010101010101010101010101C4 +:10DC500001010101010101010101010101010101B4 +:10DC600001010101010101010101010101010101A4 +:10DC70000101010101010101010101010101010194 +:10DC80000101010101010101010101010101010184 +:10DC90000101010101010101010101010101010174 +:10DCA0000101010101010101010101010101010164 +:10DCB0000101010101010101010101010101010154 +:10DCC0000101010101010101010101010101010144 +:10DCD0000101010101010101010101010101010134 +:10DCE0000101010101010101010101010101010124 +:10DCF0000101010101010101010101010101010114 +:10DD00000101010101010101010101010101010103 +:10DD100001010101010101010101010101010101F3 +:10DD200001010101010101010101010101010101E3 +:10DD300001010101010101010101010101010101D3 +:10DD400001010101010101010101010101010101C3 +:10DD500001010101010101010101010101010101B3 +:10DD600001010101010101010101010101010101A3 +:10DD70000101010101010101010101010101010193 +:10DD80000101010101010101010101010101010183 +:10DD90000101010101010101010101010101010173 +:10DDA0000101010101010101010101010101010163 +:10DDB0000101010101010101010101010101010153 +:10DDC0000101010101010101010101010101010143 +:10DDD0000101010101010101010101010101010133 +:10DDE0000101010101010101010101010101010123 +:10DDF0000101010101010101010101010101010113 +:10DE00000101010101010101010101010101010102 +:10DE100001010101010101010101010101010101F2 +:10DE200001010101010101010101010101010101E2 +:10DE300001010101010101010101010101010101D2 +:10DE400001010101010101010101010101010101C2 +:10DE500001010101010101010101010101010101B2 +:10DE600001010101010101010101010101010101A2 +:10DE70000101010101010101010101010101010192 +:10DE80000101010101010101010101010101010182 +:10DE90000101010101010101010101010101010172 +:10DEA0000101010101010101010101010101010162 +:10DEB0000101010101010101010101010101010152 +:10DEC0000101010101010101010101010101010142 +:10DED0000101010101010101010101010101010132 +:10DEE0000101010101010101010101010101010122 +:10DEF0000101010101010101010101010101010112 +:10DF00000101010101010101010101010101010101 +:10DF100001010101010101010101010101010101F1 +:10DF200001010101010101010101010101010101E1 +:10DF300001010101010101010101010101010101D1 +:10DF400001010101010101010101010101010101C1 +:10DF500001010101010101010101010101010101B1 +:10DF600001010101010101010101010101010101A1 +:10DF70000101010101010101010101010101010191 +:10DF80000101010101010101010101010101010181 +:10DF90000101010101010101010101010101010171 +:10DFA0000101010101010101010101010101010161 +:10DFB0000101010101010101010101010101010151 +:10DFC0000101010101010101010101010101010141 +:10DFD0000101010101010101010101010101010131 +:10DFE0000101010101010101010101010101010121 +:10DFF0000101010101010101010101010101010111 +:10E000000101010101010101010101010101010100 +:10E0100001010101010101010101010101010101F0 +:10E0200001010101010101010101010101010101E0 +:10E0300001010101010101010101010101010100D1 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000000000000000000000C0 +:10E0600000000000000000000000000000000000B0 +:10E0700000000000000000000000000000000000A0 +:10E080000000000000000000000000000000000090 +:10E090000000000000000000000000000000000080 +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D0000000000000000000000000000000000040 +:10E0E0000000000000000000000000000000000030 +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000000000F +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000000000000000009F +:10E18000000000000000000000000000000000008F +:10E19000000000000000000000000000000000007F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000000000000000000000003F +:10E1E000000000000000000000000000000000002F +:10E1F000000000000000000000000000000000001F +:10E20000000000000000000000000000000000000E +:10E2100000000000000000000000000000000000FE +:10E2200000000000000000000000000000000000EE +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E2600000000000000000000000000000000000AE +:10E27000000000000000000000000000000000009E +:10E28000000000000000000000000000000000008E +:10E29000000000000000000000000000000000007E +:10E2A000000000000000000000000000000000006E +:10E2B000000000000000000000000000000000005E +:10E2C000000000000000000000000000000000004E +:10E2D000000000000000000000000000000000003E +:10E2E000000000000000000000000000000000002E +:10E2F000000000000000000000000000000000001E +:10E30000000000000000000000000000000000000D +:10E3100000000000000000000000000000000000FD +:10E3200000000000000000000000000000000000ED +:10E3300000000000000000000000000000000000DD +:10E3400000000000000000000000000000000000CD +:10E3500000000000000000000000000000000000BD +:10E3600000000000000000000000000000000000AD +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D +:10E39000000000000000000000000000000000007D +:10E3A000000000000000000000000000000000006D +:10E3B000000000000000000000000000000000005D +:10E3C000000000000000000000000000000000004D +:10E3D000000000000000000000000000000000003D +:10E3E000000000000000000000000000000000002D +:10E3F000000000000000000000000000000000001D +:10E40000000000000000000000000000000000000C +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000000000009C +:10E48000000000000000000000000000000000008C +:10E49000000000000000000000000000000000007C +:10E4A000000000000000000000000000000000006C +:10E4B000000000000000000000000000000000005C +:10E4C000000000000000000000000000000000004C +:10E4D000000000000000000000000000000000003C +:10E4E000000000000000000000000000000000002C +:10E4F000000000000000000000000000000000001C +:10E50000000000000000000000000000000000000B +:10E5100000000000000000000000000000000000FB +:10E5200000000000000000000000000000000000EB +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000000CB +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000000000000AB +:10E57000000000000000000000000000000000009B +:10E58000000000000000000000000000000000008B +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E000000000000000000000000000000000002B +:10E5F000000000000000000000000000000000001B +:10E60000000000000000000000000000000000000A +:10E6100000000000000000000000000000000000FA +:10E6200000000000000000000000000000000000EA +:10E6300000000000000000000000000000000000DA +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E6600000000000000000000000000000000000AA +:10E67000000000000000000000000000000000009A +:10E68000000000000000000000000000000000008A +:10E69000000000000000000000000000000000007A +:10E6A000000000000000000000000000000000006A +:10E6B000000000000000000000000000000000005A +:10E6C000000000000000000000000000000000004A +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A +:10E6F000000000000000000000000000000000001A +:10E700000000000000000000000000000000000009 +:10E7100000000000000000000000000000000000F9 +:10E7200000000000000000000000000000000000E9 +:10E7300000000000000000000000000000000002D7 +:10E7400002020202020202020202020202020202A9 +:10E750000202020202020202020202020202020299 +:10E760000202020202020202020202020202020289 +:10E770000202020202020202020202020202020279 +:10E780000202020202020202020202020202020269 +:10E790000202020202020202020202020202020259 +:10E7A0000202020202020202020202020202020249 +:10E7B0000202020202020202020202020202020239 +:10E7C0000202020202020202020202020202020229 +:10E7D0000202020202020202020202020202020219 +:10E7E0000202020202020202020202020202020209 +:10E7F00002020202020202020202020202020202F9 +:10E8000002020202020202020202020202020202E8 +:10E8100002020202020202020202020202020202D8 +:10E8200002020202020202020202020202020202C8 +:10E8300002020202020202020202020202020202B8 +:10E8400002020202020202020202020202020202A8 +:10E850000202020202020202020202020202020298 +:10E860000202020202020202020202020202020288 +:10E870000202020202020202020202020202020278 +:10E880000202020202020202020202020202020268 +:10E890000202020202020202020202020202020258 +:10E8A0000202020202020202020202020202020248 +:10E8B0000202020202020202020202020202020238 +:10E8C0000202020202020202020202020202020228 +:10E8D0000202020202020202020202020202020218 +:10E8E0000202020202020202020202020202020208 +:10E8F00002020202020202020202020202020202F8 +:10E9000002020202020202020202020202020202E7 +:10E9100002020202020202020202020202020202D7 +:10E9200002020202020202020202020202020202C7 +:10E9300002020202020202020202020202020202B7 +:10E9400002020202020202020202020202020202A7 +:10E950000202020202020202020202020202020297 +:10E960000202020202020202020202020202020287 +:10E970000202020202020202020202020202020277 +:10E980000202020202020202020202020202020267 +:10E990000202020202020202020202020202020257 +:10E9A0000202020202020202020202020202020247 +:10E9B0000202020202020202020202020202020237 +:10E9C0000202020202020202020202020202020227 +:10E9D0000202020202020202020202020202020217 +:10E9E0000202020202020202020202020202020207 +:10E9F00002020202020202020202020202020202F7 +:10EA000002020202020202020202020202020202E6 +:10EA100002020202020202020202020202020202D6 +:10EA200002020202020202020202020202020202C6 +:10EA300002020202020202020202020202020202B6 +:10EA400002020202020202020202020202020202A6 +:10EA50000202020202020202020202020202020296 +:10EA60000202020202020202020202020202020286 +:10EA70000202020202020202020202020202020276 +:10EA80000202020202020202020202020202020266 +:10EA90000202020202020202020202020202020256 +:10EAA0000202020202020202020202020202020246 +:10EAB0000202020202020202020202020202020236 +:10EAC0000202020202020202020202020202020226 +:10EAD0000202020202020202020202020202020216 +:10EAE0000202020202020202020202020202020206 +:10EAF00002020202020202020202020202020202F6 +:10EB000002020202020202020202020202020202E5 +:10EB100002020202020202020202020202020202D5 +:10EB200002020202020202020202020202020202C5 +:10EB300002020202020202020202020202020202B5 +:10EB400002020202020202020202020202020202A5 +:10EB50000202020202020202020202020202020295 +:10EB60000202020202020202020202020202020285 +:10EB70000202020202020202020202020202020275 +:10EB80000202020202020202020202020202020265 +:10EB90000202020202020202020202020202020255 +:10EBA0000202020202020202020202020202020245 +:10EBB0000202020202020202020202020202020235 +:10EBC0000202020202020202020202020202020225 +:10EBD0000202020202020202020202020202020215 +:10EBE0000202020202020202020202020202020205 +:10EBF00002020202020202020202020202020202F5 +:10EC000002020202020202020202020202020202E4 +:10EC100002020202020202020202020202020202D4 +:10EC200002020202020202020202020202020202C4 +:10EC300002020202020202020202020202020202B4 +:10EC400002020202020202020202020202020202A4 +:10EC50000202020202020202020202020202020294 +:10EC60000202020202020202020202020202020284 +:10EC70000202020202020202020202020202020274 +:10EC80000202020202020202020202020202020264 +:10EC90000202020202020202020202020202020254 +:10ECA0000202020202020202020202020202020244 +:10ECB0000202020202020202020202020202020234 +:10ECC0000202020202020202020202020202020224 +:10ECD0000202020202020202020202020202020214 +:10ECE0000202020202020202020202020202020204 +:10ECF00002020202020202020202020202020202F4 +:10ED000002020202020202020202020202020202E3 +:10ED100002020202020202020202020202020202D3 +:10ED200002020202020202020202020202020202C3 +:10ED300002020202020202020202020202020202B3 +:10ED400002020202020202020202020202020202A3 +:10ED50000202020202020202020202020202020293 +:10ED60000202020202020202020202020202020283 +:10ED70000202020202020202020202020202020273 +:10ED80000202020202020202020202020202020263 +:10ED90000202020202020202020202020202020253 +:10EDA0000202020202020202020202020202020243 +:10EDB0000202020202020202020202020202020233 +:10EDC0000202020202020202020202020202020223 +:10EDD0000202020202020202020202020202020213 +:10EDE0000202020202020202020202020202020203 +:10EDF00002020202020202020202020202020202F3 +:10EE000002020202020202020202020202020202E2 +:10EE100002020202020202020202020202020202D2 +:10EE200002020202020202020202020202020202C2 +:10EE300002020202020202020202020202020202B2 +:10EE400002020202020202020202020202020202A2 +:10EE50000202020202020202020202020202020292 +:10EE60000202020202020202020202020202020282 +:10EE70000202020202020202020202020202020272 +:10EE80000202020202020202020202020202020262 +:10EE90000202020202020202020202020202020252 +:10EEA0000202020202020202020202020202020242 +:10EEB0000202020202020202020202020202020232 +:10EEC0000202020202020202020202020202020222 +:10EED0000202020202020202020202020202020212 +:10EEE0000202020202020202020202020202020202 +:10EEF00002020202020202020202020202020202F2 +:10EF000002020202020202020202020202020202E1 +:10EF100002020202020202020202020202020202D1 +:10EF200002020202020202020202020202020202C1 +:10EF300002020202020202020202020202020200B3 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000000000000000000000000000000000F0 +:10F0200000000000000000000000000000000000E0 +:10F0300000000000000000000000000000000000D0 +:10F0400000000000000000000000000000000000C0 +:10F0500000000000000000000000000000000000B0 +:10F0600000000000000000000000000000000000A0 +:10F070000000000000000000000000000000000090 +:10F080000000000000000000000000000000000080 +:10F090000000000000000000000000000000000070 +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D0000000000000000000000000000000000030 +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F1100000000000000000000000000000000000EF +:10F1200000000000000000000000000000000000DF +:10F1300000000000000000000000000000000000CF +:10F1400000000000000000000000000000000000BF +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000000000009F +:10F17000000000000000000000000000000000008F +:10F18000000000000000000000000000000000007F +:10F19000000000000000000000000000000000006F +:10F1A000000000000000000000000000000000005F +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F +:10F1D000000000000000000000000000000000002F +:10F1E000000000000000000000000000000000001F +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE +:10F2100000000000000000000000000000000000EE +:10F2200000000000000000000000000000000000DE +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000000000000000BE +:10F2500000000000000000000000000000000000AE +:10F26000000000000000000000000000000000009E +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000000000000007E +:10F29000000000000000000000000000000000006E +:10F2A000000000000000000000000000000000005E +:10F2B000000000000000000000000000000000004E +:10F2C000000000000000000000000000000000003E +:10F2D000000000000000000000000000000000002E +:10F2E000000000000000000000000000000000001E +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000000000FD +:10F3100000000000000000000000000000000000ED +:10F3200000000000000000000000000000000000DD +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F36000000000000000000000000000000000009D +:10F37000000000000000000000000000000000008D +:10F38000000000000000000000000000000000007D +:10F39000000000000000000000000000000000006D +:10F3A000000000000000000000000000000000005D +:10F3B000000000000000000000000000000000004D +:10F3C000000000000000000000000000000000003D +:10F3D000000000000000000000000000000000002D +:10F3E000000000000000000000000000000000001D +:10F3F000000000000000000000000000000000000D +:10F4000000000000000000000000000000000000FC +:10F4100000000000000000000000000000000000EC +:10F4200000000000000000000000000000000000DC +:10F4300000000000000000000000000000000000CC +:10F4400000000000000000000000000000000000BC +:10F4500000000000000000000000000000000000AC +:10F46000000000000000000000000000000000009C +:10F47000000000000000000000000000000000008C +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B000000000000000000000000000000000004C +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B000000000000000000000000000000000004B +:10F5C000000000000000000000000000000000003B +:10F5D000000000000000000000000000000000002B +:10F5E000000000000000000000000000000000001B +:10F5F000000000000000000000000000000000000B +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F6400000000000000000000000000000000000BA +:10F6500000000000000000000000000000000000AA +:10F66000000000000000000000000000000000009A +:10F67000000000000000000000000000000000008A +:10F68000000000000000000000000000000000007A +:10F69000000000000000000000000000000000006A +:10F6A000000000000000000000000000000000005A +:10F6B000000000000000000000000000000000004A +:10F6C000000000000000000000000000000000003A +:10F6D000000000000000000000000000000000002A +:10F6E000000000000000000000000000000000001A +:10F6F000000000000000000000000000000000000A +:10F7000000000000000000000000000000000000F9 +:10F7100000000000000000000000000000000000E9 +:10F7200000000000000000000000000000000000D9 +:10F7300000000000000000000000000000000000C9 +:10F7400000000000000000000000000000000000B9 +:10F7500000000000000000000000000000000000A9 +:10F760000000000000000000000000000000000099 +:10F770000000000000000000000000000000000089 +:10F780000000000000000000000000000000000079 +:10F790000000000000000000000000000000000069 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C0000000000000000000000000000000000039 +:10F7D0000000000000000000000000000000000029 +:10F7E0000000000000000000000000000000000019 +:10F7F0000000000000000000000000000000000009 +:10F8000000000000000000000000000000000000F8 +:10F8100000000000000000000000000000000000E8 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 +:10F8400000000000000000000000000000000000B8 +:10F8500000000000000000000000000000000000A8 +:10F860000000000000000000000000000000000098 +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000000000000000078 +:10F890000000000000000000000000000000000068 +:10F8A0000000000000000000000000000000000058 +:10F8B0000000000000000000000000000000000048 +:10F8C0000000000000000000000000000000000038 +:10F8D0000000000000000000000000000000000028 +:10F8E0000000000000000000000000000000000018 +:10F8F0000000000000000000000000000000000008 +:10F9000000000000000000000000000000000000F7 +:10F9100000000000000000000000000000000000E7 +:10F9200000000000000000000000000000000000D7 +:10F9300000000000000000000000000000000001C6 +:10F9400001010101010101010101010101010101A7 +:10F950000101010101010101010101010101010197 +:10F960000101010101010101010101010101010187 +:10F970000101010101010101010101010101010177 +:10F980000101010101010101010101010101010167 +:10F990000101010101010101010101010101010157 +:10F9A0000101010101010101010101010101010147 +:10F9B0000101010101010101010101010101010137 +:10F9C0000101010101010101010101010101010127 +:10F9D0000101010101010101010101010101010117 +:10F9E0000101010101010101010101010101010107 +:10F9F00001010101010101010101010101010101F7 +:10FA000001010101010101010101010101010101E6 +:10FA100001010101010101010101010101010101D6 +:10FA200001010101010101010101010101010101C6 +:10FA300001010101010101010101010101010101B6 +:10FA400001010101010101010101010101010101A6 +:10FA50000101010101010101010101010101010196 +:10FA60000101010101010101010101010101010186 +:10FA70000101010101010101010101010101010176 +:10FA80000101010101010101010101010101010166 +:10FA90000101010101010101010101010101010156 +:10FAA0000101010101010101010101010101010146 +:10FAB0000101010101010101010101010101010136 +:10FAC0000101010101010101010101010101010126 +:10FAD0000101010101010101010101010101010116 +:10FAE0000101010101010101010101010101010106 +:10FAF00001010101010101010101010101010101F6 +:10FB000001010101010101010101010101010101E5 +:10FB100001010101010101010101010101010101D5 +:10FB200001010101010101010101010101010101C5 +:10FB300001010101010101010101010101010101B5 +:10FB400001010101010101010101010101010101A5 +:10FB50000101010101010101010101010101010195 +:10FB60000101010101010101010101010101010185 +:10FB70000101010101010101010101010101010175 +:10FB80000101010101010101010101010101010165 +:10FB90000101010101010101010101010101010155 +:10FBA0000101010101010101010101010101010145 +:10FBB0000101010101010101010101010101010135 +:10FBC0000101010101010101010101010101010125 +:10FBD0000101010101010101010101010101010115 +:10FBE0000101010101010101010101010101010105 +:10FBF00001010101010101010101010101010101F5 +:10FC000001010101010101010101010101010101E4 +:10FC100001010101010101010101010101010101D4 +:10FC200001010101010101010101010101010101C4 +:10FC300001010101010101010101010101010101B4 +:10FC400001010101010101010101010101010101A4 +:10FC50000101010101010101010101010101010194 +:10FC60000101010101010101010101010101010184 +:10FC70000101010101010101010101010101010174 +:10FC80000101010101010101010101010101010164 +:10FC90000101010101010101010101010101010154 +:10FCA0000101010101010101010101010101010144 +:10FCB0000101010101010101010101010101010134 +:10FCC0000101010101010101010101010101010124 +:10FCD0000101010101010101010101010101010114 +:10FCE0000101010101010101010101010101010104 +:10FCF00001010101010101010101010101010101F4 +:10FD000001010101010101010101010101010101E3 +:10FD100001010101010101010101010101010101D3 +:10FD200001010101010101010101010101010101C3 +:10FD300001010101010101010101010101010101B3 +:10FD400001010101010101010101010101010101A3 +:10FD50000101010101010101010101010101010193 +:10FD60000101010101010101010101010101010183 +:10FD70000101010101010101010101010101010173 +:10FD80000101010101010101010101010101010163 +:10FD90000101010101010101010101010101010153 +:10FDA0000101010101010101010101010101010143 +:10FDB0000101010101010101010101010101010133 +:10FDC0000101010101010101010101010101010123 +:10FDD0000101010101010101010101010101010113 +:10FDE0000101010101010101010101010101010103 +:10FDF00001010101010101010101010101010101F3 +:10FE000001010101010101010101010101010101E2 +:10FE100001010101010101010101010101010101D2 +:10FE200001010101010101010101010101010101C2 +:10FE300001010101010101010101010101010101B2 +:10FE400001010101010101010101010101010101A2 +:10FE50000101010101010101010101010101010192 +:10FE60000101010101010101010101010101010182 +:10FE70000101010101010101010101010101010172 +:10FE80000101010101010101010101010101010162 +:10FE90000101010101010101010101010101010152 +:10FEA0000101010101010101010101010101010142 +:10FEB0000101010101010101010101010101010132 +:10FEC0000101010101010101010101010101010122 +:10FED0000101010101010101010101010101010112 +:10FEE0000101010101010101010101010101010102 +:10FEF00001010101010101010101010101010101F2 +:10FF000001010101010101010101010101010101E1 +:10FF100001010101010101010101010101010101D1 +:10FF200001010101010101010101010101010101C1 +:10FF300001010101010101010101010101010101B1 +:10FF400001010101010101010101010101010101A1 +:10FF50000101010101010101010101010101010191 +:10FF60000101010101010101010101010101010181 +:10FF70000101010101010101010101010101010171 +:10FF80000101010101010101010101010101010161 +:10FF90000101010101010101010101010101010151 +:10FFA0000101010101010101010101010101010141 +:10FFB0000101010101010101010101010101010131 +:10FFC0000101010101010101010101010101010121 +:10FFD0000101010101010101010101010101010111 +:10FFE0000101010101010101010101010101010101 +:10FFF00001010101010101010101010101010101F1 +:020000025000AC +:1000000001010101010101010101010101010101E0 +:1000100001010101010101010101010101010101D0 +:1000200001010101010101010101010101010101C0 +:1000300001010101010101010101010101010101B0 +:1000400001010101010101010101010101010101A0 +:100050000101010101010101010101010101010190 +:100060000101010101010101010101010101010180 +:100070000101010101010101010101010101010170 +:100080000101010101010101010101010101010160 +:100090000101010101010101010101010101010150 +:1000A0000101010101010101010101010101010140 +:1000B0000101010101010101010101010101010130 +:1000C0000101010101010101010101010101010120 +:1000D0000101010101010101010101010101010110 +:1000E0000101010101010101010101010101010100 +:1000F00001010101010101010101010101010101F0 +:1001000001010101010101010101010101010101DF +:1001100001010101010101010101010101010101CF +:1001200001010101010101010101010101010101BF +:1001300001010101010101010101010101010100B0 +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:1002200000000000000000000000000000000000CE +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E000000000000000000000000000000000000D +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:1005300000000000000000000000000000000000BB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000000000000000003B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000000EA +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000000000000000000000BA +:1006400000000000000000000000000000000000AA +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:10068000000000000000000000000000000000006A +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C000000000000000000000000000000000002A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000000000000FA +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000002B6 +:100840000202020202020202020202020202020288 +:100850000202020202020202020202020202020278 +:100860000202020202020202020202020202020268 +:100870000202020202020202020202020202020258 +:100880000202020202020202020202020202020248 +:100890000202020202020202020202020202020238 +:1008A0000202020202020202020202020202020228 +:1008B0000202020202020202020202020202020218 +:1008C0000202020202020202020202020202020208 +:1008D00002020202020202020202020202020202F8 +:1008E00002020202020202020202020202020202E8 +:1008F00002020202020202020202020202020202D8 +:1009000002020202020202020202020202020202C7 +:1009100002020202020202020202020202020202B7 +:1009200002020202020202020202020202020202A7 +:100930000202020202020202020202020202020297 +:100940000202020202020202020202020202020287 +:100950000202020202020202020202020202020277 +:100960000202020202020202020202020202020267 +:100970000202020202020202020202020202020257 +:100980000202020202020202020202020202020247 +:100990000202020202020202020202020202020237 +:1009A0000202020202020202020202020202020227 +:1009B0000202020202020202020202020202020217 +:1009C0000202020202020202020202020202020207 +:1009D00002020202020202020202020202020202F7 +:1009E00002020202020202020202020202020202E7 +:1009F00002020202020202020202020202020202D7 +:100A000002020202020202020202020202020202C6 +:100A100002020202020202020202020202020202B6 +:100A200002020202020202020202020202020202A6 +:100A30000202020202020202020202020202020296 +:100A40000202020202020202020202020202020286 +:100A50000202020202020202020202020202020276 +:100A60000202020202020202020202020202020266 +:100A70000202020202020202020202020202020256 +:100A80000202020202020202020202020202020246 +:100A90000202020202020202020202020202020236 +:100AA0000202020202020202020202020202020226 +:100AB0000202020202020202020202020202020216 +:100AC0000202020202020202020202020202020206 +:100AD00002020202020202020202020202020202F6 +:100AE00002020202020202020202020202020202E6 +:100AF00002020202020202020202020202020202D6 +:100B000002020202020202020202020202020202C5 +:100B100002020202020202020202020202020202B5 +:100B200002020202020202020202020202020202A5 +:100B30000202020202020202020202020202020295 +:100B40000202020202020202020202020202020285 +:100B50000202020202020202020202020202020275 +:100B60000202020202020202020202020202020265 +:100B70000202020202020202020202020202020255 +:100B80000202020202020202020202020202020245 +:100B90000202020202020202020202020202020235 +:100BA0000202020202020202020202020202020225 +:100BB0000202020202020202020202020202020215 +:100BC0000202020202020202020202020202020205 +:100BD00002020202020202020202020202020202F5 +:100BE00002020202020202020202020202020202E5 +:100BF00002020202020202020202020202020202D5 +:100C000002020202020202020202020202020202C4 +:100C100002020202020202020202020202020202B4 +:100C200002020202020202020202020202020202A4 +:100C30000202020202020202020202020202020294 +:100C40000202020202020202020202020202020284 +:100C50000202020202020202020202020202020274 +:100C60000202020202020202020202020202020264 +:100C70000202020202020202020202020202020254 +:100C80000202020202020202020202020202020244 +:100C90000202020202020202020202020202020234 +:100CA0000202020202020202020202020202020224 +:100CB0000202020202020202020202020202020214 +:100CC0000202020202020202020202020202020204 +:100CD00002020202020202020202020202020202F4 +:100CE00002020202020202020202020202020202E4 +:100CF00002020202020202020202020202020202D4 +:100D000002020202020202020202020202020202C3 +:100D100002020202020202020202020202020202B3 +:100D200002020202020202020202020202020202A3 +:100D30000202020202020202020202020202020293 +:100D40000202020202020202020202020202020283 +:100D50000202020202020202020202020202020273 +:100D60000202020202020202020202020202020263 +:100D70000202020202020202020202020202020253 +:100D80000202020202020202020202020202020243 +:100D90000202020202020202020202020202020233 +:100DA0000202020202020202020202020202020223 +:100DB0000202020202020202020202020202020213 +:100DC0000202020202020202020202020202020203 +:100DD00002020202020202020202020202020202F3 +:100DE00002020202020202020202020202020202E3 +:100DF00002020202020202020202020202020202D3 +:100E000002020202020202020202020202020202C2 +:100E100002020202020202020202020202020202B2 +:100E200002020202020202020202020202020202A2 +:100E30000202020202020202020202020202020292 +:100E40000202020202020202020202020202020282 +:100E50000202020202020202020202020202020272 +:100E60000202020202020202020202020202020262 +:100E70000202020202020202020202020202020252 +:100E80000202020202020202020202020202020242 +:100E90000202020202020202020202020202020232 +:100EA0000202020202020202020202020202020222 +:100EB0000202020202020202020202020202020212 +:100EC0000202020202020202020202020202020202 +:100ED00002020202020202020202020202020202F2 +:100EE00002020202020202020202020202020202E2 +:100EF00002020202020202020202020202020202D2 +:100F000002020202020202020202020202020202C1 +:100F100002020202020202020202020202020202B1 +:100F200002020202020202020202020202020202A1 +:100F30000202020202020202020202020202020291 +:100F40000202020202020202020202020202020281 +:100F50000202020202020202020202020202020271 +:100F60000202020202020202020202020202020261 +:100F70000202020202020202020202020202020251 +:100F80000202020202020202020202020202020241 +:100F90000202020202020202020202020202020231 +:100FA0000202020202020202020202020202020221 +:100FB0000202020202020202020202020202020211 +:100FC0000202020202020202020202020202020201 +:100FD00002020202020202020202020202020202F1 +:100FE00002020202020202020202020202020202E1 +:100FF00002020202020202020202020202020202D1 +:1010000002020202020202020202020202020202C0 +:1010100002020202020202020202020202020202B0 +:1010200002020202020202020202020202020202A0 +:101030000202020202020202020202020202020092 +:1010400000000000000000000000000000000000A0 +:101050000000000000000000000000000000000090 +:101060000000000000000000000000000000000080 +:101070000000000000000000000000000000000070 +:101080000000000000000000000000000000000060 +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D0000000000000000000000000000000000010 +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000000000000000000000DF +:1011100000000000000000000000000000000000CF +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000000000009F +:10115000000000000000000000000000000000008F +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F +:10118000000000000000000000000000000000005F +:10119000000000000000000000000000000000004F +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000000000000000000FF +:1011F00000000000000000000000000000000000EF +:1012000000000000000000000000000000000000DE +:1012100000000000000000000000000000000000CE +:1012200000000000000000000000000000000000BE +:1012300000000000000000000000000000000000AE +:10124000000000000000000000000000000000009E +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000000000007E +:10127000000000000000000000000000000000006E +:10128000000000000000000000000000000000005E +:10129000000000000000000000000000000000004E +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000000000000000FE +:1012F00000000000000000000000000000000000EE +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD +:1013200000000000000000000000000000000000BD +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000000000000000000000000000007D +:10137000000000000000000000000000000000006D +:10138000000000000000000000000000000000005D +:10139000000000000000000000000000000000004D +:1013A000000000000000000000000000000000003D +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D000000000000000000000000000000000000D +:1013E00000000000000000000000000000000000FD +:1013F00000000000000000000000000000000000ED +:1014000000000000000000000000000000000000DC +:1014100000000000000000000000000000000000CC +:1014200000000000000000000000000000000000BC +:1014300000000000000000000000000000000000AC +:10144000000000000000000000000000000000009C +:10145000000000000000000000000000000000008C +:10146000000000000000000000000000000000007C +:10147000000000000000000000000000000000006C +:10148000000000000000000000000000000000005C +:10149000000000000000000000000000000000004C +:1014A000000000000000000000000000000000003C +:1014B000000000000000000000000000000000002C +:1014C000000000000000000000000000000000001C +:1014D000000000000000000000000000000000000C +:1014E00000000000000000000000000000000000FC +:1014F00000000000000000000000000000000000EC +:1015000000000000000000000000000000000000DB +:1015100000000000000000000000000000000000CB +:1015200000000000000000000000000000000000BB +:1015300000000000000000000000000000000000AB +:10154000000000000000000000000000000000009B +:10155000000000000000000000000000000000008B +:10156000000000000000000000000000000000007B +:10157000000000000000000000000000000000006B +:10158000000000000000000000000000000000005B +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B000000000000000000000000000000000002B +:1015C000000000000000000000000000000000001B +:1015D000000000000000000000000000000000000B +:1015E00000000000000000000000000000000000FB +:1015F00000000000000000000000000000000000EB +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:1016300000000000000000000000000000000000AA +:10164000000000000000000000000000000000009A +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:10167000000000000000000000000000000000006A +:10168000000000000000000000000000000000005A +:10169000000000000000000000000000000000004A +:1016A000000000000000000000000000000000003A +:1016B000000000000000000000000000000000002A +:1016C000000000000000000000000000000000001A +:1016D000000000000000000000000000000000000A +:1016E00000000000000000000000000000000000FA +:1016F00000000000000000000000000000000000EA +:1017000000000000000000000000000000000000D9 +:1017100000000000000000000000000000000000C9 +:1017200000000000000000000000000000000000B9 +:101730000000000000000000000000000000007039 +:10174000170500000000007835050000000000804B +:101750004F050000000000886605000000000090B2 +:101760007D0500000000009892050000000000A028 +:10177000A5050000000000A8B6050000000000B0AC +:10178000C6050000000000B8D6050000000000C03B +:10179000E5050000000000C8F0050000000000D0D2 +:1017A000FF050000000000D8080600000000001E31 +:1017B0000000000000000000000000000000000029 +:1017C0000000000000000100000000000000000018 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000000000000000000000F9 +:1017F00000000000000000000000000000000000E9 +:1018000000000000000000000000000000000000D8 +:1018100000000000000000000000000000000000C8 +:1018200000000000000000000000000000000000B8 +:1018300000000000000000000000000000000000A8 +:101840000000000000000000000000000000000098 +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880000000000000000000000000000000000058 +:101890000000000000000000000000000000000048 +:1018A0000000000000000002020000000000000034 +:1018B0000000000000000000000000000000000028 +:1018C0000000000000000100000000000000000017 +:1018D0000000000000000000000000000000000008 +:1018E00000000000000000000000000000000000F8 +:1018F00000000000000000000000000000000000E8 +:1019000000000000000000000000000000000000D7 +:1019100000000000000000000000000000000000C7 +:1019200000000000000000000000000000000000B7 +:1019300000000000000000000000000000000000A7 +:101940000000000000000000000000000000000097 +:101950000000000000000000000000000000000087 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:101980000000000000000000000000000000000057 +:101990000000000000000000000000000000000047 +:1019A0000000000000000002020001000000000032 +:1019B0000000000000000000000000000000000027 +:1019C0000000000000010100000000000000000015 +:1019D0000000000000000000000000000000000007 +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000000000000000000000E7 +:101A000000000000000000000000000000000000D6 +:101A100000000000000000000000000000000000C6 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A40000000000000000000000000000000000096 +:101A50000000000000000000000000000000000086 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000000000000000000000000000056 +:101A90000000000000000000000000000000000046 +:101AA000000000000000000202020200010100012B +:101AB0000000000000000000000000000000000026 +:101AC0000000000000010100000000000000000014 +:101AD0000000000000000000000000000000000006 +:101AE00000000000000000000000000000000000F6 +:101AF00000000000000000000000000000000000E6 +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000000000000000000C5 +:101B200000000000000000000000000000000000B5 +:101B300000000000000000000000000000000000A5 +:101B40000000000000000000000000000000000095 +:101B50000000000000000000000000000000000085 +:101B60000000000000000000000000000000000075 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 +:101BA0000000000000000002020202010101000129 +:101BB0000000000000000000000000000000000025 +:101BC0000000000000010100000000000000000013 +:101BD0000000000000000000000000000000000005 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000000000000000000E5 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000000000000000000000B4 +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000000000000000094 +:101C50000000000000000000000000000000000084 +:101C60000000000000000000000000000000000074 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA0000000000000000002020202020101000127 +:101CB0000001000000000000000000000000000023 +:101CC0000000000000010100000000000000000012 +:101CD0000000000000000000000000000000000004 +:101CE00000000000000000000000000000000000F4 +:101CF00000000000000000000000000000000000E4 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D200000000000000000000000000000000000B3 +:101D300000000000000000000000000000000000A3 +:101D40000000000000000000000000000000000093 +:101D50000000000000000000000000000000000083 +:101D60000000000000000000000000000000000073 +:101D70000000000000000000000000000000000063 +:101D80000000000000000000000000000000000053 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000002020202020201010124 +:101DB0000101000000000000000000000000000021 +:101DC0000000000001010100000000000000000010 +:101DD0000000000000000000000000000000000003 +:101DE00000000000000000000000000000000000F3 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000000000000000000000A2 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E60000000000000000000000000000000000072 +:101E70000000000000000000000000000000000062 +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000002020202020202010122 +:101EB0000101000000000000000000000000000020 +:101EC000000000000101010000000000000000000F +:101ED0000000000000000000000000000000000002 +:101EE00000000000000000000000000000000000F2 +:101EF00000000000000000000000000000000000E2 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000000000A1 +:101F40000000000000000000000000000000000091 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F80000000000000000000000000000000000051 +:101F90000000000000000000000000000000000041 +:101FA0000000000000000002020202020202010121 +:101FB000010101000000000000000000000000001E +:101FC000000000010101010000000000000000000D +:101FD0000000000000000000000000000000000001 +:101FE00000000000000000000000000000000000F1 +:101FF00000000000000000000000000000000000E1 +:1020000000000000000000000000000000000000D0 +:1020100000000000000000000000000000000000C0 +:1020200000000000000000000000000000000000B0 +:1020300000000000000000000000000000000000A0 +:102040000000000000000000000000000000000090 +:102050000000000000000000000000000000000080 +:102060000000000000000000000000000000000070 +:102070000000000000000000000000000000000060 +:102080000000000000000000000000000000000050 +:102090000000000000000000000000000000000040 +:1020A000000000000000000202020202020202021E +:1020B000010101000000000000000000000000001D +:1020C000000000010101010000000000000000000C +:1020D0000000000000000000000000000000000000 +:1020E00000000000000000000000000000000000F0 +:1020F00000000000000000000000000000000000E0 +:1021000000000000000000000000000000000000CF +:1021100000000000000000000000000000000000BF +:1021200000000000000000000000000000000000AF +:10213000000000000000000000000000000000009F +:10214000000000000000000000000000000000008F +:10215000000000000000000000000000000000007F +:10216000000000000000000000000000000000006F +:10217000000000000000000000000000000000005F +:10218000000000000000000000000000000000004F +:10219000000000000000000000000000000000003F +:1021A000000000000000000202020202020202021D +:1021B000010101000000000000000000000000001C +:1021C000000001010101010000000000000000000A +:1021D00000000000000000000000000000000000FF +:1021E00000000000000000000000000000000000EF +:1021F00000000000000000000000000000000000DF +:1022000000000000000000000000000000000000CE +:1022100000000000000000000000000000000000BE +:1022200000000000000000000000000000000000AE +:10223000000000000000000000000000000000009E +:10224000000000000000000000000000000000008E +:10225000000000000000000000000000000000007E +:10226000000000000000000000000000000000006E +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000000000004E +:10229000000000000000000000000000000000003E +:1022A000000000000000000202020202020202021C +:1022B000020101000000000000000000000000001A +:1022C0000001010101010100000000000000000008 +:1022D00000000000000000000000000000000000FE +:1022E00000000000000000000000000000000000EE +:1022F00000000000000000000000000000000000DE +:1023000000000000000000000000000000000000CD +:1023100000000000000000000000000000000000BD +:1023200000000000000000000000000000000000AD +:10233000000000000000000000000000000000009D +:10234000000000000000000000000000000000008D +:10235000000000000000000000000000000000007D +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000000000005D +:10238000000000000000000000000000000000004D +:10239000000000000000000000000000000000003D +:1023A000000000000000000202020202020202021B +:1023B0000202010100000000000000000000000017 +:1023C0000001010101010100000000000000000007 +:1023D00000000000000000000000000000000000FD +:1023E00000000000000000000000000000000000ED +:1023F00000000000000000000000000000000000DD +:1024000000000000000000000000000000000000CC +:1024100000000000000000000000000000000000BC +:1024200000000000000000000000000000000000AC +:10243000000000000000000000000000000000009C +:10244000000000000000000000000000000000008C +:10245000000000000000000000000000000000007C +:10246000000000000000000000000000000000006C +:10247000000000000000000000000000000000005C +:10248000000000000000000000000000000000004C +:10249000000000000000000000000000000000003C +:1024A000000000000000000202020202020202021A +:1024B0000202010100000000000000000000000016 +:1024C0000001010101010100000000000000000006 +:1024D00000000000000000000000000000000000FC +:1024E00000000000000000000000000000000000EC +:1024F00000000000000000000000000000000000DC +:1025000000000000000000000000000000000000CB +:1025100000000000000000000000000000000000BB +:1025200000000000000000000000000000000000AB +:10253000000000000000000000000000000000009B +:10254000000000000000000000000000000000008B +:10255000000000000000000000000000000000007B +:10256000000000000000000000000000000000006B +:10257000000000000000000000000000000000005B +:10258000000000000000000000000000000000004B +:10259000000000000000000000000000000000003B +:1025A0000000000000000002020202020202020219 +:1025B0000202020101010000000000000000000012 +:1025C0000101010101010100000000000000000004 +:1025D00000000000000000000000000000000000FB +:1025E00000000000000000000000000000000000EB +:1025F00000000000000000000000000000000000DB +:1026000000000000000000000000000000000000CA +:1026100000000000000000000000000000000000BA +:1026200000000000000000000000000000000000AA +:10263000000000000000000000000000000000009A +:10264000000000000000000000000000000000008A +:10265000000000000000000000000000000000007A +:10266000000000000000000000000000000000006A +:10267000000000000000000000000000000000005A +:10268000000000000000000000000000000000004A +:10269000000000000000000000000000000000003A +:1026A0000000000000000002020202020202020218 +:1026B0000202020101010000000000000000000110 +:1026C0000101010101010100000000000000000003 +:1026D00000000000000000000000000000000000FA +:1026E00000000000000000000000000000000000EA +:1026F00000000000000000000000000000000000DA +:1027000000000000000000000000000000000000C9 +:1027100000000000000000000000000000000000B9 +:1027200000000000000000000000000000000000A9 +:102730000000000000000000000000000000000099 +:102740000000000000000000000000000000000089 +:102750000000000000000000000000000000000079 +:102760000000000000000000000000000000000069 +:102770000000000000000000000000000000000059 +:102780000000000000000000000000000000000049 +:102790000000000000000000000000000000000039 +:1027A0000000000000000002020202020202020217 +:1027B000020202010101000000000000000000010F +:1027C0000101010101010100000000000000000002 +:1027D00000000000000000000000000000000000F9 +:1027E00000000000000000000000000000000000E9 +:1027F00000000000000000000000000000000000D9 +:1028000000000000000000000000000000000000C8 +:1028100000000000000000000000000000000000B8 +:1028200000000000000000000000000000000000A8 +:102830000000000000000000000000000000000098 +:102840000000000000000000000000000000000088 +:102850000000000000000000000000000000000078 +:102860000000000000000000000000000000000068 +:102870000000000000000000000000000000000058 +:102880000000000000000000000000000000000048 +:102890000000000000000000000000000000000038 +:1028A0000000000000000002020202020202020216 +:1028B000020202020101000000000000000000010D +:1028C0000101010101010100000000000000000001 +:1028D00000000000000000000000000000000000F8 +:1028E00000000000000000000000000000000000E8 +:1028F00000000000000000000000000000000000D8 +:1029000000000000000000000000000000000000C7 +:1029100000000000000000000000000000000000B7 +:1029200000000000000000000000000000000000A7 +:102930000000000000000000000000000000000097 +:102940000000000000000000000000000000000087 +:102950000000000000000000000000000000000077 +:102960000000000000000000000000000000000067 +:102970000000000000000000000000000000000057 +:102980000000000000000000000000000000000047 +:102990000000000000000000000000000000000037 +:1029A0000000000000000002020202020202020215 +:1029B000020202020101000000000000000001010B +:1029C0000101010101010100000000000000000000 +:1029D00000000000000000000000000000000000F7 +:1029E00000000000000000000000000000000000E7 +:1029F00000000000000000000000000000000000D7 +:102A000000000000000000000000000000000000C6 +:102A100000000000000000000000000000000000B6 +:102A200000000000000000000000000000000000A6 +:102A30000000000000000000000000000000000096 +:102A40000000000000000000000000000000000086 +:102A50000000000000000000000000000000000076 +:102A60000000000000000000000000000000000066 +:102A70000000000000000000000000000000000056 +:102A80000000000000000000000000000000000046 +:102A90000000000000000000000000000000000036 +:102AA0000000000000000002020202020202020214 +:102AB0000202020202010000000000000001010108 +:102AC00001010101010101000000000000000000FF +:102AD00000000000000000000000000000000000F6 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000000000000D6 +:102B000000000000000000000000000000000000C5 +:102B100000000000000000000000000000000000B5 +:102B200000000000000000000000000000000000A5 +:102B30000000000000000000000000000000000095 +:102B40000000000000000000000000000000000085 +:102B50000000000000000000000000000000000075 +:102B60000000000000000000000000000000000065 +:102B70000000000000000000000000000000000055 +:102B80000000000000000000000000000000000045 +:102B90000000000000000000000000000000000035 +:102BA0000000000000000002020202020202020213 +:102BB0000202020202010000000000000001010107 +:102BC00001010101010101000000000000000000FE +:102BD00000000000000000000000000000000000F5 +:102BE00000000000000000000000000000000000E5 +:102BF00000000000000000000000000000000000D5 +:102C000000000000000000000000000000000000C4 +:102C100000000000000000000000000000000000B4 +:102C200000000000000000000000000000000000A4 +:102C30000000000000000000000000000000000094 +:102C40000000000000000000000000000000000084 +:102C50000000000000000000000000000000000074 +:102C60000000000000000000000000000000000064 +:102C70000000000000000000000000000000000054 +:102C80000000000000000000000000000000000044 +:102C90000000000000000000000000000000000034 +:102CA0000000000000000002020202020202020212 +:102CB0000202020202020000000000000101010104 +:102CC00001010101010101000000000000000000FD +:102CD00000000000000000000000000000000000F4 +:102CE00000000000000000000000000000000000E4 +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D200000000000000000000000000000000000A3 +:102D30000000000000000000000000000000000093 +:102D40000000000000000000000000000000000083 +:102D50000000000000000000000000000000000073 +:102D60000000000000000000000000000000000063 +:102D70000000000000000000000000000000000053 +:102D80000000000000000000000000000000000043 +:102D90000000000000000000000000000000000033 +:102DA0000000000000000002020202020202020211 +:102DB0000202020202020000000000000101010103 +:102DC00001010101010101000000000000000000FC +:102DD00000000000000000000000000000000000F3 +:102DE00000000000000000000000000000000000E3 +:102DF00000000000000000000000000000000000D3 +:102E000000000000000000000000000000000000C2 +:102E100000000000000000000000000000000000B2 +:102E200000000000000000000000000000000000A2 +:102E30000000000000000000000000000000000092 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000000000000000000000000052 +:102E80000000000000000000000000000000000042 +:102E90000000000000000000000000000000000032 +:102EA0000000000000000002020202020202020210 +:102EB0000202020202020000000000000101010102 +:102EC00001010101010101000000000000000000FB +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000000000E2 +:102EF00000000000000000000000000000000000D2 +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000000000000000000091 +:102F40000000000000000000000000000000000081 +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F70000000000000000000000000000000000051 +:102F80000000000000000000000000000000000041 +:102F90000000000000000000000000000000000031 +:102FA000000000000000000202020202020202020F +:102FB0000202020202020000000000010101010100 +:102FC00001010101010101000000000000000000FA +:102FD00000000000000000000000000000000000F1 +:102FE00000000000000000000000000000000000E1 +:102FF00000000000000000000000000000000000D1 +:1030000000000000000000000000000000000000C0 +:1030100000000000000000000000000000000000B0 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000000000000000000090 +:103040000000000000000000000000000000000080 +:103050000000000000000000000000000000000070 +:103060000000000000000000000000000000000060 +:103070000000000000000000000000000000000050 +:103080000000000000000000000000000000000040 +:103090000000000000000000000000000000000030 +:1030A000000000000000000202020202020202020E +:1030B00002020202020200000000000101010101FF +:1030C00001010101010101000000000000000000F9 +:1030D00000000000000000000000000000000000F0 +:1030E00000000000000000000000000000000000E0 +:1030F00000000000000000000000000000000000D0 +:1031000000000000000000000000000000000000BF +:1031100000000000000000000000000000000000AF +:10312000000000000000000000000000000000009F +:10313000000000000000000000000000000000008F +:10314000000000000000000000000000000000007F +:10315000000000000000000000000000000000006F +:10316000000000000000000000000000000000005F +:10317000000000000000000000000000000000004F +:10318000000000000000000000000000000000003F +:10319000000000000000000000000000000000002F +:1031A000000000000000000202020202020202020D +:1031B00002020202020200000000010101010101FD +:1031C00001010101010101000000000000000000F8 +:1031D00000000000000000000000000000000000EF +:1031E00000000000000000000000000000000000DF +:1031F00000000000000000000000000000000000CF +:1032000000000000000000000000000000000000BE +:1032100000000000000000000000000000000000AE +:10322000000000000000000000000000000000009E +:10323000000000000000000000000000000000008E +:10324000000000000000000000000000000000007E +:10325000000000000000000000000000000000006E +:10326000000000000000000000000000000000005E +:10327000000000000000000000000000000000004E +:10328000000000000000000000000000000000003E +:10329000000000000000000000000000000000002E +:1032A000000000000000000202020202020202020C +:1032B00002020202020200000001010101010101FB +:1032C00001010101010101000000000000000000F7 +:1032D00000000000000000000000000000000000EE +:1032E00000000000000000000000000000000000DE +:1032F00000000000000000000000000000000000CE +:1033000000000000000000000000000000000000BD +:1033100000000000000000000000000000000000AD +:10332000000000000000000000000000000000009D +:10333000000000000000000000000000000000008D +:10334000000000000000000000000000000000007D +:10335000000000000000000000000000000000006D +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000000003D +:10339000000000000000000000000000000000002D +:1033A000000000000000000202020202020202020B +:1033B00002020202020200000001010101010101FA +:1033C00001010101010101000000000000000000F6 +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000000000000000000000DD +:1033F00000000000000000000000000000000000CD +:1034000000000000000000000000000000000000BC +:1034100000000000000000000000000000000000AC +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000000008C +:10344000000000000000000000000000000000007C +:10345000000000000000000000000000000000006C +:10346000000000000000000000000000000000005C +:10347000000000000000000000000000000000004C +:10348000000000000000000000000000000000003C +:10349000000000000000000000000000000000002C +:1034A000000000000000000202020202020202020A +:1034B0000202020202020000000000000000000000 +:1034C00000000000000000000000000000000000FC +:1034D00000000000000000000000000000000000EC +:1034E00000000000000000000000000000000000DC +:1034F00000000000000000000000000000000000CC +:1035000000000000000000000000000000000000BB +:1035100000000000000000000000000000000000AB +:10352000000000000000000000000000000000009B +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B +:10355000000000000000000000000000000000006B +:10356000000000000000000000000000000000005B +:10357000000000000000000000000000000000004B +:10358000000000000000000000000000000000003B +:10359000000000000000000000000000000000002B +:1035A000000000000000000000000000000000001B +:1035B000000000000000001A0000000000000000F1 +:1035C00000000000000000000000000000000100FA +:1035D00000000000000000000000000000000000EB +:1035E00000000000000000000000000000000000DB +:1035F00000000000000000000000000000000000CB +:1036000000000000000000000000000000000000BA +:1036100000000000000000000000000000000000AA +:10362000000000000000000000000000000000009A +:10363000000000000000000000000000000000008A +:10364000000000000000000000000000000000007A +:10365000000000000000000000000000000000006A +:10366000000000000000000000000000000000005A +:10367000000000000000000000000000000000004A +:10368000000000000000000000000000000000003A +:10369000000000000000000000000000000000002A +:1036A0000000000000000000000000000000000218 +:1036B0000200000000000000000000000000000008 +:1036C00000000000000000000000000000000100F9 +:1036D00000000000000000000000000000000000EA +:1036E00000000000000000000000000000000000DA +:1036F00000000000000000000000000000000000CA +:1037000000000000000000000000000000000000B9 +:1037100000000000000000000000000000000000A9 +:103720000000000000000000000000000000000099 +:103730000000000000000000000000000000000089 +:103740000000000000000000000000000000000079 +:103750000000000000000000000000000000000069 +:103760000000000000000000000000000000000059 +:103770000000000000000000000000000000000049 +:103780000000000000000000000000000000000039 +:103790000000000000000000000000000000000029 +:1037A0000000000000000000000000000000000217 +:1037B0000200000001000000000000000000000006 +:1037C00000000000000000000000000000000100F8 +:1037D00000000000000000000000000000000000E9 +:1037E00000000000000000000000000000000000D9 +:1037F00000000000000000000000000000000000C9 +:1038000000000000000000000000000000000000B8 +:1038100000000000000000000000000000000000A8 +:103820000000000000000000000000000000000098 +:103830000000000000000000000000000000000088 +:103840000000000000000000000000000000000078 +:103850000000000000000000000000000000000068 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000000000000048 +:103880000000000000000000000000000000000038 +:103890000000000000000000000000000000000028 +:1038A0000000000000000000000000000000000216 +:1038B0000202010001010000000000000000000001 +:1038C00000000000000000000000000001010100F5 +:1038D00000000000000000000000000000000000E8 +:1038E00000000000000000000000000000000000D8 +:1038F00000000000000000000000000000000000C8 +:1039000000000000000000000000000000000000B7 +:1039100000000000000000000000000000000000A7 +:103920000000000000000000000000000000000097 +:103930000000000000000000000000000000000087 +:103940000000000000000000000000000000000077 +:103950000000000000000000000000000000000067 +:103960000000000000000000000000000000000057 +:103970000000000000000000000000000000000047 +:103980000000000000000000000000000000000037 +:103990000000000000000000000000000000000027 +:1039A0000000000000000000000000000000000215 +:1039B00002020200010100000000000000000000FF +:1039C00000000000000000000000000001010100F4 +:1039D00000000000000000000000000000000000E7 +:1039E00000000000000000000000000000000000D7 +:1039F00000000000000000000000000000000000C7 +:103A000000000000000000000000000000000000B6 +:103A100000000000000000000000000000000000A6 +:103A20000000000000000000000000000000000096 +:103A30000000000000000000000000000000000086 +:103A40000000000000000000000000000000000076 +:103A50000000000000000000000000000000000066 +:103A60000000000000000000000000000000000056 +:103A70000000000000000000000000000000000046 +:103A80000000000000000000000000000000000036 +:103A90000000000000000000000000000000000026 +:103AA0000000000000000000000000000000000214 +:103AB00002020201010101000000000000000000FC +:103AC00000000000000000000000000001010100F3 +:103AD00000000000000000000000000000000000E6 +:103AE00000000000000000000000000000000000D6 +:103AF00000000000000000000000000000000000C6 +:103B000000000000000000000000000000000000B5 +:103B100000000000000000000000000000000000A5 +:103B20000000000000000000000000000000000095 +:103B30000000000000000000000000000000000085 +:103B40000000000000000000000000000000000075 +:103B50000000000000000000000000000000000065 +:103B60000000000000000000000000000000000055 +:103B70000000000000000000000000000000000045 +:103B80000000000000000000000000000000000035 +:103B90000000000000000000000000000000000025 +:103BA0000000000000000000000000000000000213 +:103BB00002020202010101000000000000000000FA +:103BC00000000000000000000000000001010100F2 +:103BD00000000000000000000000000000000000E5 +:103BE00000000000000000000000000000000000D5 +:103BF00000000000000000000000000000000000C5 +:103C000000000000000000000000000000000000B4 +:103C100000000000000000000000000000000000A4 +:103C20000000000000000000000000000000000094 +:103C30000000000000000000000000000000000084 +:103C40000000000000000000000000000000000074 +:103C50000000000000000000000000000000000064 +:103C60000000000000000000000000000000000054 +:103C70000000000000000000000000000000000044 +:103C80000000000000000000000000000000000034 +:103C90000000000000000000000000000000000024 +:103CA0000000000000000000000000000000000212 +:103CB00002020202020101000000000000000000F8 +:103CC00000000000000000000000010101010100EF +:103CD00000000000000000000000000000000000E4 +:103CE00000000000000000000000000000000000D4 +:103CF00000000000000000000000000000000000C4 +:103D000000000000000000000000000000000000B3 +:103D100000000000000000000000000000000000A3 +:103D20000000000000000000000000000000000093 +:103D30000000000000000000000000000000000083 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D60000000000000000000000000000000000053 +:103D70000000000000000000000000000000000043 +:103D80000000000000000000000000000000000033 +:103D90000000000000000000000000000000000023 +:103DA0000000000000000000000000000000000211 +:103DB00002020202020201010100000000000000F4 +:103DC00000000000000000000000010101010100EE +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000000000D3 +:103DF00000000000000000000000000000000000C3 +:103E000000000000000000000000000000000000B2 +:103E100000000000000000000000000000000000A2 +:103E20000000000000000000000000000000000092 +:103E30000000000000000000000000000000000082 +:103E40000000000000000000000000000000000072 +:103E50000000000000000000000000000000000062 +:103E60000000000000000000000000000000000052 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000210 +:103EB00002020202020202010101010001000000EF +:103EC00000000000000000000001010101010100EC +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF00000000000000000000000000000000000C2 +:103F000000000000000000000000000000000000B1 +:103F100000000000000000000000000000000000A1 +:103F20000000000000000000000000000000000091 +:103F30000000000000000000000000000000000081 +:103F40000000000000000000000000000000000071 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000000000031 +:103F90000000000000000000000000000000000021 +:103FA000000000000000000000000000000000020F +:103FB00002020202020202010101010001000000EE +:103FC00000000000000000000101010101010100EA +:103FD00000000000000000000000000000000000E1 +:103FE00000000000000000000000000000000000D1 +:103FF00000000000000000000000000000000000C1 +:1040000000000000000000000000000000000000B0 +:1040100000000000000000000000000000000000A0 +:104020000000000000000000000000000000000090 +:104030000000000000000000000000000000000080 +:104040000000000000000000000000000000000070 +:104050000000000000000000000000000000000060 +:104060000000000000000000000000000000000050 +:104070000000000000000000000000000000000040 +:104080000000000000000000000000000000000030 +:104090000000000000000000000000000000000020 +:1040A000000000000000000000000000000000020E +:1040B00002020202020202020101010001000000EC +:1040C00000000000000000000101010101010100E9 +:1040D00000000000000000000000000000000000E0 +:1040E00000000000000000000000000000000000D0 +:1040F00000000000000000000000000000000000C0 +:1041000000000000000000000000000000000000AF +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:10414000000000000000000000000000000000006F +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F +:10417000000000000000000000000000000000003F +:10418000000000000000000000000000000000002F +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000020D +:1041B00002020202020202020201010001000000EA +:1041C00000000000000000010101010101010100E7 +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000000000AE +:10421000000000000000000000000000000000009E +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000007E +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000000000005E +:10426000000000000000000000000000000000004E +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000000002E +:10429000000000000000000000000000000000001E +:1042A000000000000000000000000000000000020C +:1042B00002020202020202020202010101000000E7 +:1042C00000000000000101010101010101010100E4 +:1042D00000000000000000000000000000000000DE +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000000000000BE +:1043000000000000000000000000000000000000AD +:10431000000000000000000000000000000000009D +:10432000000000000000000000000000000000008D +:10433000000000000000000000000000000000007D +:10434000000000000000000000000000000000006D +:10435000000000000000000000000000000000005D +:10436000000000000000000000000000000000004D +:10437000000000000000000000000000000000003D +:10438000000000000000000000000000000000002D +:10439000000000000000000000000000000000001D +:1043A000000000000000000000000000000000020B +:1043B00002020202020202020202020101000000E5 +:1043C00000000000010101010101010101010100E2 +:1043D00000000000000000000000000000000000DD +:1043E00000000000000000000000000000000000CD +:1043F00000000000000000000000000000000000BD +:1044000000000000000000000000000000000000AC +:10441000000000000000000000000000000000009C +:10442000000000000000000000000000000000008C +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C +:10445000000000000000000000000000000000005C +:10446000000000000000000000000000000000004C +:10447000000000000000000000000000000000003C +:10448000000000000000000000000000000000002C +:10449000000000000000000000000000000000001C +:1044A000000000000000000000000000000000020A +:1044B00002020202020202020202020101010000E3 +:1044C00000000000010101010101010101010100E1 +:1044D00000000000000000000000000000000000DC +:1044E00000000000000000000000000000000000CC +:1044F00000000000000000000000000000000000BC +:1045000000000000000000000000000000000000AB +:10451000000000000000000000000000000000009B +:10452000000000000000000000000000000000008B +:10453000000000000000000000000000000000007B +:10454000000000000000000000000000000000006B +:10455000000000000000000000000000000000005B +:10456000000000000000000000000000000000004B +:10457000000000000000000000000000000000003B +:10458000000000000000000000000000000000002B +:10459000000000000000000000000000000000001B +:1045A0000000000000000000000000000000000209 +:1045B00002020202020202020202020202010000E0 +:1045C00000000000010101010101010101010100E0 +:1045D00000000000000000000000000000000000DB +:1045E00000000000000000000000000000000000CB +:1045F00000000000000000000000000000000000BB +:1046000000000000000000000000000000000000AA +:10461000000000000000000000000000000000009A +:10462000000000000000000000000000000000008A +:10463000000000000000000000000000000000007A +:10464000000000000000000000000000000000006A +:10465000000000000000000000000000000000005A +:10466000000000000000000000000000000000004A +:10467000000000000000000000000000000000003A +:10468000000000000000000000000000000000002A +:10469000000000000000000000000000000000001A +:1046A0000000000000000000000000000000000208 +:1046B00002020202020202020202020202010000DF +:1046C00000000000010101010101010101010100DF +:1046D00000000000000000000000000000000000DA +:1046E00000000000000000000000000000000000CA +:1046F00000000000000000000000000000000000BA +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000000000000099 +:104720000000000000000000000000000000000089 +:104730000000000000000000000000000000000079 +:104740000000000000000000000000000000000069 +:104750000000000000000000000000000000000059 +:104760000000000000000000000000000000000049 +:104770000000000000000000000000000000000039 +:104780000000000000000000000000000000000029 +:104790000000000000000000000000000000000019 +:1047A0000000000000000000000000000000000207 +:1047B00002020202020202020202020202010000DE +:1047C00000000000010101010101010101010100DE +:1047D00000000000000000000000000000000000D9 +:1047E00000000000000000000000000000000000C9 +:1047F00000000000000000000000000000000000B9 +:1048000000000000000000000000000000000000A8 +:104810000000000000000000000000000000000098 +:104820000000000000000000000000000000000088 +:104830000000000000000000000000000000000078 +:104840000000000000000000000000000000000068 +:104850000000000000000000000000000000000058 +:104860000000000000000000000000000000000048 +:104870000000000000000000000000000000000038 +:104880000000000000000000000000000000000028 +:104890000000000000000000000000000000000018 +:1048A0000000000000000000000000000000000206 +:1048B00002020202020202020202020202020000DC +:1048C00000000001010101010101010101010100DC +:1048D00000000000000000000000000000000000D8 +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000000000000000000B8 +:1049000000000000000000000000000000000000A7 +:104910000000000000000000000000000000000097 +:104920000000000000000000000000000000000087 +:104930000000000000000000000000000000000077 +:104940000000000000000000000000000000000067 +:104950000000000000000000000000000000000057 +:104960000000000000000000000000000000000047 +:104970000000000000000000000000000000000037 +:104980000000000000000000000000000000000027 +:104990000000000000000000000000000000000017 +:1049A0000000000000000000000000000000000205 +:1049B00002020202020202020202020202020000DB +:1049C00000000001010101010101010101010100DB +:1049D00000000000000000000000000000000000D7 +:1049E00000000000000000000000000000000000C7 +:1049F00000000000000000000000000000000000B7 +:104A000000000000000000000000000000000000A6 +:104A10000000000000000000000000000000000096 +:104A20000000000000000000000000000000000086 +:104A30000000000000000000000000000000000076 +:104A40000000000000000000000000000000000066 +:104A50000000000000000000000000000000000056 +:104A60000000000000000000000000000000000046 +:104A70000000000000000000000000000000000036 +:104A80000000000000000000000000000000000026 +:104A90000000000000000000000000000000000016 +:104AA0000000000000000000000000000000000204 +:104AB00002020202020202020202020202020000DA +:104AC00000000101010101010101010101010100D9 +:104AD00000000000000000000000000000000000D6 +:104AE00000000000000000000000000000000000C6 +:104AF00000000000000000000000000000000000B6 +:104B000000000000000000000000000000000000A5 +:104B10000000000000000000000000000000000095 +:104B20000000000000000000000000000000000085 +:104B30000000000000000000000000000000000075 +:104B40000000000000000000000000000000000065 +:104B50000000000000000000000000000000000055 +:104B60000000000000000000000000000000000045 +:104B70000000000000000000000000000000000035 +:104B80000000000000000000000000000000000025 +:104B90000000000000000000000000000000000015 +:104BA0000000000000000000000000000000000203 +:104BB00002020202020202020202020202020000D9 +:104BC00000000101010101010101010101010100D8 +:104BD00000000000000000000000000000000000D5 +:104BE00000000000000000000000000000000000C5 +:104BF00000000000000000000000000000000000B5 +:104C000000000000000000000000000000000000A4 +:104C10000000000000000000000000000000000094 +:104C20000000000000000000000000000000000084 +:104C30000000000000000000000000000000000074 +:104C40000000000000000000000000000000000064 +:104C50000000000000000000000000000000000054 +:104C60000000000000000000000000000000000044 +:104C70000000000000000000000000000000000034 +:104C80000000000000000000000000000000000024 +:104C90000000000000000000000000000000000014 +:104CA0000000000000000000000000000000000202 +:104CB00002020202020202020202020202020000D8 +:104CC00000010101010101010101010101010100D6 +:104CD00000000000000000000000000000000000D4 +:104CE00000000000000000000000000000000000C4 +:104CF00000000000000000000000000000000000B4 +:104D000000000000000000000000000000000000A3 +:104D10000000000000000000000000000000000093 +:104D20000000000000000000000000000000000083 +:104D30000000000000000000000000000000000073 +:104D40000000000000000000000000000000000063 +:104D50000000000000000000000000000000000053 +:104D60000000000000000000000000000000000043 +:104D70000000000000000000000000000000000033 +:104D80000000000000000000000000000000000023 +:104D90000000000000000000000000000000000013 +:104DA0000000000000000000000000000000000201 +:104DB00002020202020202020202020202020000D7 +:104DC00000010101010101010101010101010100D5 +:104DD00000000000000000000000000000000000D3 +:104DE00000000000000000000000000000000000C3 +:104DF00000000000000000000000000000000000B3 +:104E000000000000000000000000000000000000A2 +:104E10000000000000000000000000000000000092 +:104E20000000000000000000000000000000000082 +:104E30000000000000000000000000000000000072 +:104E40000000000000000000000000000000000062 +:104E50000000000000000000000000000000000052 +:104E60000000000000000000000000000000000042 +:104E70000000000000000000000000000000000032 +:104E80000000000000000000000000000000000022 +:104E90000000000000000000000000000000000012 +:104EA0000000000000000000000000000000000200 +:104EB00002020202020202020202020202020000D6 +:104EC00000000000000000000000000000000000E2 +:104ED00000000000000000000000000000000000D2 +:104EE00000000000000000000000000000000000C2 +:104EF00000000000000000000000000000000000B2 +:104F000000000000000000000000000000000000A1 +:104F10000000000000000000000000000000000091 +:104F20000000000000000000000000000000000081 +:104F30000000000000000000000000000000000071 +:104F40000000000000000000000000000000000061 +:104F50000000000000000000000000000000000051 +:104F60000000000000000000000000000000000041 +:104F70000000000000000000000000000000000031 +:104F80000000000000000000000000000000000021 +:104F90000000000000000000000000000000000011 +:104FA0000000000000000000000000000000000001 +:104FB00000000000000000000000000000000017DA +:104FC00000000000000000000000000000000000E1 +:104FD00000000000000001000000000000000000D0 +:104FE00000000000000000000000000000000000C1 +:104FF00000000000000000000000000000000000B1 +:1050000000000000000000000000000000000000A0 +:105010000000000000000000000000000000000090 +:105020000000000000000000000000000000000080 +:105030000000000000000000000000000000000070 +:105040000000000000000000000000000000000060 +:105050000000000000000000000000000000000050 +:105060000000000000000000000000000000000040 +:105070000000000000000000000000000000000030 +:105080000000000000000000000000000000000020 +:105090000000000000000000000000000000000010 +:1050A0000000000000000000000000000000000000 +:1050B00000000000000000020000000000000000EE +:1050C00000000000000000000000000000000000E0 +:1050D00000000000000001000000000000000000CF +:1050E00000000000000000000000000000000000C0 +:1050F00000000000000000000000000000000000B0 +:10510000000000000000000000000000000000009F +:10511000000000000000000000000000000000008F +:10512000000000000000000000000000000000007F +:10513000000000000000000000000000000000006F +:10514000000000000000000000000000000000005F +:10515000000000000000000000000000000000004F +:10516000000000000000000000000000000000003F +:10517000000000000000000000000000000000002F +:10518000000000000000000000000000000000001F +:10519000000000000000000000000000000000000F +:1051A00000000000000000000000000000000000FF +:1051B00000000000000000020001000000000000EC +:1051C00000000000000000000000000000000000DF +:1051D00000000000000101000000000000000000CD +:1051E00000000000000000000000000000000000BF +:1051F00000000000000000000000000000000000AF +:10520000000000000000000000000000000000009E +:10521000000000000000000000000000000000008E +:10522000000000000000000000000000000000007E +:10523000000000000000000000000000000000006E +:10524000000000000000000000000000000000005E +:10525000000000000000000000000000000000004E +:10526000000000000000000000000000000000003E +:10527000000000000000000000000000000000002E +:10528000000000000000000000000000000000001E +:10529000000000000000000000000000000000000E +:1052A00000000000000000000000000000000000FE +:1052B00000000000000000020201000000000000E9 +:1052C00000000000000000000000000000000000DE +:1052D00000000000010101000000000000000000CB +:1052E00000000000000000000000000000000000BE +:1052F00000000000000000000000000000000000AE +:10530000000000000000000000000000000000009D +:10531000000000000000000000000000000000008D +:10532000000000000000000000000000000000007D +:10533000000000000000000000000000000000006D +:10534000000000000000000000000000000000005D +:10535000000000000000000000000000000000004D +:10536000000000000000000000000000000000003D +:10537000000000000000000000000000000000002D +:10538000000000000000000000000000000000001D +:10539000000000000000000000000000000000000D +:1053A00000000000000000000000000000000000FD +:1053B00000000000000000020202000000000000E7 +:1053C00000000000000000000000000000000000DD +:1053D00000000000010101000000000000000000CA +:1053E00000000000000000000000000000000000BD +:1053F00000000000000000000000000000000000AD +:10540000000000000000000000000000000000009C +:10541000000000000000000000000000000000008C +:10542000000000000000000000000000000000007C +:10543000000000000000000000000000000000006C +:10544000000000000000000000000000000000005C +:10545000000000000000000000000000000000004C +:10546000000000000000000000000000000000003C +:10547000000000000000000000000000000000002C +:10548000000000000000000000000000000000001C +:10549000000000000000000000000000000000000C +:1054A00000000000000000000000000000000000FC +:1054B00000000000000000020202000000000000E6 +:1054C00000000000000000000000000000000000DC +:1054D00000000000010101000000000000000000C9 +:1054E00000000000000000000000000000000000BC +:1054F00000000000000000000000000000000000AC +:10550000000000000000000000000000000000009B +:10551000000000000000000000000000000000008B +:10552000000000000000000000000000000000007B +:10553000000000000000000000000000000000006B +:10554000000000000000000000000000000000005B +:10555000000000000000000000000000000000004B +:10556000000000000000000000000000000000003B +:10557000000000000000000000000000000000002B +:10558000000000000000000000000000000000001B +:10559000000000000000000000000000000000000B +:1055A00000000000000000000000000000000000FB +:1055B00000000000000000020202020100000001E1 +:1055C00000000000000000000000000000000000DB +:1055D00000000001010101000000000000000000C7 +:1055E00000000000000000000000000000000000BB +:1055F00000000000000000000000000000000000AB +:10560000000000000000000000000000000000009A +:10561000000000000000000000000000000000008A +:10562000000000000000000000000000000000007A +:10563000000000000000000000000000000000006A +:10564000000000000000000000000000000000005A +:10565000000000000000000000000000000000004A +:10566000000000000000000000000000000000003A +:10567000000000000000000000000000000000002A +:10568000000000000000000000000000000000001A +:10569000000000000000000000000000000000000A +:1056A00000000000000000000000000000000000FA +:1056B00000000000000000020202020200000001DF +:1056C00000000000000000000000000000000000DA +:1056D00000000101010101000000000000000000C5 +:1056E00000000000000000000000000000000000BA +:1056F00000000000000000000000000000000000AA +:105700000000000000000000000000000000000099 +:105710000000000000000000000000000000000089 +:105720000000000000000000000000000000000079 +:105730000000000000000000000000000000000069 +:105740000000000000000000000000000000000059 +:105750000000000000000000000000000000000049 +:105760000000000000000000000000000000000039 +:105770000000000000000000000000000000000029 +:105780000000000000000000000000000000000019 +:105790000000000000000000000000000000000009 +:1057A00000000000000000000000000000000000F9 +:1057B00000000000000000020202020201010101DB +:1057C00000000000010000000000000000000000D8 +:1057D00000010101010101000000000000000000C3 +:1057E00000000000000000000000000000000000B9 +:1057F00000000000000000000000000000000000A9 +:105800000000000000000000000000000000000098 +:105810000000000000000000000000000000000088 +:105820000000000000000000000000000000000078 +:105830000000000000000000000000000000000068 +:105840000000000000000000000000000000000058 +:105850000000000000000000000000000000000048 +:105860000000000000000000000000000000000038 +:105870000000000000000000000000000000000028 +:105880000000000000000000000000000000000018 +:105890000000000000000000000000000000000008 +:1058A00000000000000000000000000000000000F8 +:1058B00000000000000000020202020202010101D9 +:1058C00000000000010000000000000000000001D6 +:1058D00001010101010101000000000000000000C1 +:1058E00000000000000000000000000000000000B8 +:1058F00000000000000000000000000000000000A8 +:105900000000000000000000000000000000000097 +:105910000000000000000000000000000000000087 +:105920000000000000000000000000000000000077 +:105930000000000000000000000000000000000067 +:105940000000000000000000000000000000000057 +:105950000000000000000000000000000000000047 +:105960000000000000000000000000000000000037 +:105970000000000000000000000000000000000027 +:105980000000000000000000000000000000000017 +:105990000000000000000000000000000000000007 +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000020202020202020202D5 +:1059C00001000100010000000000000000000001D3 +:1059D00001010101010101000000000000000000C0 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 +:105A00000000000000000000000000000000000096 +:105A10000000000000000000000000000000000086 +:105A20000000000000000000000000000000000076 +:105A30000000000000000000000000000000000066 +:105A40000000000000000000000000000000000056 +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000000000000016 +:105A90000000000000000000000000000000000006 +:105AA00000000000000000000000000000000000F6 +:105AB00000000000000000020202020202020202D4 +:105AC00001010100010100000000000000010101CE +:105AD00001010101010101000000000000000000BF +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 +:105B00000000000000000000000000000000000095 +:105B10000000000000000000000000000000000085 +:105B20000000000000000000000000000000000075 +:105B30000000000000000000000000000000000065 +:105B40000000000000000000000000000000000055 +:105B50000000000000000000000000000000000045 +:105B60000000000000000000000000000000000035 +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B90000000000000000000000000000000000005 +:105BA00000000000000000000000000000000000F5 +:105BB00000000000000000020202020202020202D3 +:105BC00002010100010100000000000000010101CC +:105BD00001010101010101000000000000000000BE +:105BE00000000000000000000000000000000000B5 +:105BF00000000000000000000000000000000000A5 +:105C00000000000000000000000000000000000094 +:105C10000000000000000000000000000000000084 +:105C20000000000000000000000000000000000074 +:105C30000000000000000000000000000000000064 +:105C40000000000000000000000000000000000054 +:105C50000000000000000000000000000000000044 +:105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 +:105C80000000000000000000000000000000000014 +:105C90000000000000000000000000000000000004 +:105CA00000000000000000000000000000000000F4 +:105CB00000000000000000020202020202020202D2 +:105CC00002020201010100000000000001010101C7 +:105CD00001010101010101000000000000000000BD +:105CE00000000000000000000000000000000000B4 +:105CF00000000000000000000000000000000000A4 +:105D00000000000000000000000000000000000093 +:105D10000000000000000000000000000000000083 +:105D20000000000000000000000000000000000073 +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000000000000000053 +:105D50000000000000000000000000000000000043 +:105D60000000000000000000000000000000000033 +:105D70000000000000000000000000000000000023 +:105D80000000000000000000000000000000000013 +:105D90000000000000000000000000000000000003 +:105DA00000000000000000000000000000000000F3 +:105DB00000000000000000020202020202020202D1 +:105DC00002020201020100000000000001010101C5 +:105DD00001010101010101000000000000000000BC +:105DE00000000000000000000000000000000000B3 +:105DF00000000000000000000000000000000000A3 +:105E00000000000000000000000000000000000092 +:105E10000000000000000000000000000000000082 +:105E20000000000000000000000000000000000072 +:105E30000000000000000000000000000000000062 +:105E40000000000000000000000000000000000052 +:105E50000000000000000000000000000000000042 +:105E60000000000000000000000000000000000032 +:105E70000000000000000000000000000000000022 +:105E80000000000000000000000000000000000012 +:105E90000000000000000000000000000000000002 +:105EA00000000000000000000000000000000000F2 +:105EB00000000000000000020202020202020202D0 +:105EC00002020202020100000000000101010101C2 +:105ED00001010101010101000000000000000000BB +:105EE00000000000000000000000000000000000B2 +:105EF00000000000000000000000000000000000A2 +:105F00000000000000000000000000000000000091 +:105F10000000000000000000000000000000000081 +:105F20000000000000000000000000000000000071 +:105F30000000000000000000000000000000000061 +:105F40000000000000000000000000000000000051 +:105F50000000000000000000000000000000000041 +:105F60000000000000000000000000000000000031 +:105F70000000000000000000000000000000000021 +:105F80000000000000000000000000000000000011 +:105F90000000000000000000000000000000000001 +:105FA00000000000000000000000000000000000F1 +:105FB00000000000000000020202020202020202CF +:105FC00002020202020200000000000101010101C0 +:105FD00001010101010101000000000000000000BA +:105FE00000000000000000000000000000000000B1 +:105FF00000000000000000000000000000000000A1 +:106000000000000000000000000000000000000090 +:106010000000000000000000000000000000000080 +:106020000000000000000000000000000000000070 +:106030000000000000000000000000000000000060 +:106040000000000000000000000000000000000050 +:106050000000000000000000000000000000000040 +:106060000000000000000000000000000000000030 +:106070000000000000000000000000000000000020 +:106080000000000000000000000000000000000010 +:106090000000000000000000000000000000000000 +:1060A00000000000000000000000000000000000F0 +:1060B00000000000000000020202020202020202CE +:1060C00002020202020200000001010101010101BD +:1060D00001010101010101000000000000000000B9 +:1060E00000000000000000000000000000000000B0 +:1060F00000000000000000000000000000000000A0 +:10610000000000000000000000000000000000008F +:10611000000000000000000000000000000000007F +:10612000000000000000000000000000000000006F +:10613000000000000000000000000000000000005F +:10614000000000000000000000000000000000004F +:10615000000000000000000000000000000000003F +:10616000000000000000000000000000000000002F +:10617000000000000000000000000000000000001F +:10618000000000000000000000000000000000000F +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000020202020202020202CD +:1061C00002020202020200000001010101010101BC +:1061D00001010101010101000000000000000000B8 +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:10620000000000000000000000000000000000008E +:10621000000000000000000000000000000000007E +:10622000000000000000000000000000000000006E +:10623000000000000000000000000000000000005E +:10624000000000000000000000000000000000004E +:10625000000000000000000000000000000000003E +:10626000000000000000000000000000000000002E +:10627000000000000000000000000000000000001E +:10628000000000000000000000000000000000000E +:1062900000000000000000000000000000000000FE +:1062A00000000000000000000000000000000000EE +:1062B00000000000000000020202020202020202CC +:1062C00002020202020200000001010101010101BB +:1062D00001010101010101000000000000000000B7 +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:10630000000000000000000000000000000000008D +:10631000000000000000000000000000000000007D +:10632000000000000000000000000000000000006D +:10633000000000000000000000000000000000005D +:10634000000000000000000000000000000000004D +:10635000000000000000000000000000000000003D +:10636000000000000000000000000000000000002D +:10637000000000000000000000000000000000001D +:10638000000000000000000000000000000000000D +:1063900000000000000000000000000000000000FD +:1063A00000000000000000000000000000000000ED +:1063B00000000000000000020202020202020202CB +:1063C00002020202020200000101010101010101B9 +:1063D00001010101010101000000000000000000B6 +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000000009D +:10640000000000000000000000000000000000008C +:10641000000000000000000000000000000000007C +:10642000000000000000000000000000000000006C +:10643000000000000000000000000000000000005C +:10644000000000000000000000000000000000004C +:10645000000000000000000000000000000000003C +:10646000000000000000000000000000000000002C +:10647000000000000000000000000000000000001C +:10648000000000000000000000000000000000000C +:1064900000000000000000000000000000000000FC +:1064A00000000000000000000000000000000000EC +:1064B00000000000000000020202020202020202CA +:1064C00002020202020200000101010101010101B8 +:1064D00001010101010101000000000000000000B5 +:1064E00000000000000000000000000000000000AC +:1064F000000000000000000000000000000000009C +:10650000000000000000000000000000000000008B +:10651000000000000000000000000000000000007B +:10652000000000000000000000000000000000006B +:10653000000000000000000000000000000000005B +:10654000000000000000000000000000000000004B +:10655000000000000000000000000000000000003B +:10656000000000000000000000000000000000002B +:10657000000000000000000000000000000000001B +:10658000000000000000000000000000000000000B +:1065900000000000000000000000000000000000FB +:1065A00000000000000000000000000000000000EB +:1065B00000000000000000020202020202020202C9 +:1065C00002020202020200000000000000000000BF +:1065D00000000000000000000000000000000000BB +:1065E00000000000000000000000000000000000AB +:1065F000000000000000000000000000000000009B +:10660000000000000000000000000000000000008A +:10661000000000000000000000000000000000007A +:10662000000000000000000000000000000000006A +:10663000000000000000000000000000000000005A +:10664000000000000000000000000000000000004A +:10665000000000000000000000000000000000003A +:10666000000000000000000000000000000000002A +:10667000000000000000000000000000000000001A +:10668000000000000000000000000000000000000A +:1066900000000000000000000000000000000000FA +:1066A00000000000000000000000000000000000EA +:1066B00000000000000000000000000000000000DA +:1066C00000000000000000170000000000000000B3 +:1066D00000000000000000000000000000000100B9 +:1066E00000000000000000000000000000000000AA +:1066F000000000000000000000000000000000009A +:106700000000000000000000000000000000000089 +:106710000000000000000000000000000000000079 +:106720000000000000000000000000000000000069 +:106730000000000000000000000000000000000059 +:106740000000000000000000000000000000000049 +:106750000000000000000000000000000000000039 +:106760000000000000000000000000000000000029 +:106770000000000000000000000000000000000019 +:106780000000000000000000000000000000000009 +:1067900000000000000000000000000000000000F9 +:1067A00000000000000000000000000000000000E9 +:1067B00000000000000000000000000000000002D7 +:1067C00000000000000000000000000000000000C9 +:1067D00000000000000000000000000000000100B8 +:1067E00000000000000000000000000000000000A9 +:1067F0000000000000000000000000000000000099 +:106800000000000000000000000000000000000088 +:106810000000000000000000000000000000000078 +:106820000000000000000000000000000000000068 +:106830000000000000000000000000000000000058 +:106840000000000000000000000000000000000048 +:106850000000000000000000000000000000000038 +:106860000000000000000000000000000000000028 +:106870000000000000000000000000000000000018 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000000000F8 +:1068A00000000000000000000000000000000000E8 +:1068B00000000000000000000000000000000002D6 +:1068C00001010000000000000000000000000000C6 +:1068D00000000000000000000000000000010100B6 +:1068E00000000000000000000000000000000000A8 +:1068F0000000000000000000000000000000000098 +:106900000000000000000000000000000000000087 +:106910000000000000000000000000000000000077 +:106920000000000000000000000000000000000067 +:106930000000000000000000000000000000000057 +:106940000000000000000000000000000000000047 +:106950000000000000000000000000000000000037 +:106960000000000000000000000000000000000027 +:106970000000000000000000000000000000000017 +:106980000000000000000000000000000000000007 +:1069900000000000000000000000000000000000F7 +:1069A00000000000000000000000000000000000E7 +:1069B00000000000000000000000000000000002D5 +:1069C00001010000000000000000000000000000C5 +:1069D00000000000000000000000000000010100B5 +:1069E00000000000000000000000000000000000A7 +:1069F0000000000000000000000000000000000097 +:106A00000000000000000000000000000000000086 +:106A10000000000000000000000000000000000076 +:106A20000000000000000000000000000000000066 +:106A30000000000000000000000000000000000056 +:106A40000000000000000000000000000000000046 +:106A50000000000000000000000000000000000036 +:106A60000000000000000000000000000000000026 +:106A70000000000000000000000000000000000016 +:106A80000000000000000000000000000000000006 +:106A900000000000000000000000000000000000F6 +:106AA00000000000000000000000000000000000E6 +:106AB00000000000000000000000000000000002D4 +:106AC00002020000000000000000000000000000C2 +:106AD00000000000000000000000000001010100B3 +:106AE00000000000000000000000000000000000A6 +:106AF0000000000000000000000000000000000096 +:106B00000000000000000000000000000000000085 +:106B10000000000000000000000000000000000075 +:106B20000000000000000000000000000000000065 +:106B30000000000000000000000000000000000055 +:106B40000000000000000000000000000000000045 +:106B50000000000000000000000000000000000035 +:106B60000000000000000000000000000000000025 +:106B70000000000000000000000000000000000015 +:106B80000000000000000000000000000000000005 +:106B900000000000000000000000000000000000F5 +:106BA00000000000000000000000000000000000E5 +:106BB00000000000000000000000000000000002D3 +:106BC00002020000000000000000000000000000C1 +:106BD00000000000000000000000000101010100B1 +:106BE00000000000000000000000000000000000A5 +:106BF0000000000000000000000000000000000095 +:106C00000000000000000000000000000000000084 +:106C10000000000000000000000000000000000074 +:106C20000000000000000000000000000000000064 +:106C30000000000000000000000000000000000054 +:106C40000000000000000000000000000000000044 +:106C50000000000000000000000000000000000034 +:106C60000000000000000000000000000000000024 +:106C70000000000000000000000000000000000014 +:106C80000000000000000000000000000000000004 +:106C900000000000000000000000000000000000F4 +:106CA00000000000000000000000000000000000E4 +:106CB00000000000000000000000000000000002D2 +:106CC00002020200010000000000000000000000BD +:106CD00000000000000000000000010101010100AF +:106CE00000000000000000000000000000000000A4 +:106CF0000000000000000000000000000000000094 +:106D00000000000000000000000000000000000083 +:106D10000000000000000000000000000000000073 +:106D20000000000000000000000000000000000063 +:106D30000000000000000000000000000000000053 +:106D40000000000000000000000000000000000043 +:106D50000000000000000000000000000000000033 +:106D60000000000000000000000000000000000023 +:106D70000000000000000000000000000000000013 +:106D80000000000000000000000000000000000003 +:106D900000000000000000000000000000000000F3 +:106DA00000000000000000000000000000000000E3 +:106DB00000000000000000000000000000000002D1 +:106DC00002020200010000000000000000000000BC +:106DD00000000000000000000101010101010100AC +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000000000000000000000093 +:106E00000000000000000000000000000000000082 +:106E10000000000000000000000000000000000072 +:106E20000000000000000000000000000000000062 +:106E30000000000000000000000000000000000052 +:106E40000000000000000000000000000000000042 +:106E50000000000000000000000000000000000032 +:106E60000000000000000000000000000000000022 +:106E70000000000000000000000000000000000012 +:106E80000000000000000000000000000000000002 +:106E900000000000000000000000000000000000F2 +:106EA00000000000000000000000000000000000E2 +:106EB00000000000000000000000000000000002D0 +:106EC00002020202010100000100000000000000B7 +:106ED00000000000000000000101010101010100AB +:106EE00000000000000000000000000000000000A2 +:106EF0000000000000000000000000000000000092 +:106F00000000000000000000000000000000000081 +:106F10000000000000000000000000000000000071 +:106F20000000000000000000000000000000000061 +:106F30000000000000000000000000000000000051 +:106F40000000000000000000000000000000000041 +:106F50000000000000000000000000000000000031 +:106F60000000000000000000000000000000000021 +:106F70000000000000000000000000000000000011 +:106F80000000000000000000000000000000000001 +:106F900000000000000000000000000000000000F1 +:106FA00000000000000000000000000000000000E1 +:106FB00000000000000000000000000000000002CF +:106FC00002020202020101000100000000000000B4 +:106FD00000000000000000010101010101010100A9 +:106FE00000000000000000000000000000000000A1 +:106FF0000000000000000000000000000000000091 +:107000000000000000000000000000000000000080 +:107010000000000000000000000000000000000070 +:107020000000000000000000000000000000000060 +:107030000000000000000000000000000000000050 +:107040000000000000000000000000000000000040 +:107050000000000000000000000000000000000030 +:107060000000000000000000000000000000000020 +:107070000000000000000000000000000000000010 +:107080000000000000000000000000000000000000 +:1070900000000000000000000000000000000000F0 +:1070A00000000000000000000000000000000000E0 +:1070B00000000000000000000000000000000002CE +:1070C00002020202020201000100000000000000B2 +:1070D00000000000000001010101010101010100A7 +:1070E00000000000000000000000000000000000A0 +:1070F0000000000000000000000000000000000090 +:10710000000000000000000000000000000000007F +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000003F +:10715000000000000000000000000000000000002F +:10716000000000000000000000000000000000001F +:10717000000000000000000000000000000000000F +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000000EF +:1071A00000000000000000000000000000000000DF +:1071B00000000000000000000000000000000002CD +:1071C00002020202020202000100010000010000AE +:1071D00000000000010101010101010101010100A4 +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000000000000000008F +:10720000000000000000000000000000000000007E +:10721000000000000000000000000000000000006E +:10722000000000000000000000000000000000005E +:10723000000000000000000000000000000000004E +:10724000000000000000000000000000000000003E +:10725000000000000000000000000000000000002E +:10726000000000000000000000000000000000001E +:10727000000000000000000000000000000000000E +:1072800000000000000000000000000000000000FE +:1072900000000000000000000000000000000000EE +:1072A00000000000000000000000000000000000DE +:1072B00000000000000000000000000000000002CC +:1072C00002020202020202010201010100010000A9 +:1072D00000000000010101010101010101010100A3 +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:10730000000000000000000000000000000000007D +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:10733000000000000000000000000000000000004D +:10734000000000000000000000000000000000003D +:10735000000000000000000000000000000000002D +:10736000000000000000000000000000000000001D +:10737000000000000000000000000000000000000D +:1073800000000000000000000000000000000000FD +:1073900000000000000000000000000000000000ED +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000000000000000002CB +:1073C00002020202020202020201010100010000A7 +:1073D00000000000010101010101010101010100A2 +:1073E000000000000000000000000000000000009D +:1073F000000000000000000000000000000000008D +:10740000000000000000000000000000000000007C +:10741000000000000000000000000000000000006C +:10742000000000000000000000000000000000005C +:10743000000000000000000000000000000000004C +:10744000000000000000000000000000000000003C +:10745000000000000000000000000000000000002C +:10746000000000000000000000000000000000001C +:10747000000000000000000000000000000000000C +:1074800000000000000000000000000000000000FC +:1074900000000000000000000000000000000000EC +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000000002CA +:1074C00002020202020202020202020100010000A4 +:1074D00000000000010101010101010101010100A1 +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000008C +:10750000000000000000000000000000000000007B +:10751000000000000000000000000000000000006B +:10752000000000000000000000000000000000005B +:10753000000000000000000000000000000000004B +:10754000000000000000000000000000000000003B +:10755000000000000000000000000000000000002B +:10756000000000000000000000000000000000001B +:10757000000000000000000000000000000000000B +:1075800000000000000000000000000000000000FB +:1075900000000000000000000000000000000000EB +:1075A00000000000000000000000000000000000DB +:1075B00000000000000000000000000000000002C9 +:1075C00002020202020202020202020201010000A1 +:1075D000000000010101010101010101010101009F +:1075E000000000000000000000000000000000009B +:1075F000000000000000000000000000000000008B +:10760000000000000000000000000000000000007A +:10761000000000000000000000000000000000006A +:10762000000000000000000000000000000000005A +:10763000000000000000000000000000000000004A +:10764000000000000000000000000000000000003A +:10765000000000000000000000000000000000002A +:10766000000000000000000000000000000000001A +:10767000000000000000000000000000000000000A +:1076800000000000000000000000000000000000FA +:1076900000000000000000000000000000000000EA +:1076A00000000000000000000000000000000000DA +:1076B00000000000000000000000000000000002C8 +:1076C000020202020202020202020202010200009F +:1076D000000000010101010101010101010101009E +:1076E000000000000000000000000000000000009A +:1076F000000000000000000000000000000000008A +:107700000000000000000000000000000000000079 +:107710000000000000000000000000000000000069 +:107720000000000000000000000000000000000059 +:107730000000000000000000000000000000000049 +:107740000000000000000000000000000000000039 +:107750000000000000000000000000000000000029 +:107760000000000000000000000000000000000019 +:107770000000000000000000000000000000000009 +:1077800000000000000000000000000000000000F9 +:1077900000000000000000000000000000000000E9 +:1077A00000000000000000000000000000000000D9 +:1077B00000000000000000000000000000000002C7 +:1077C000020202020202020202020202020200009D +:1077D000010101010101010101010101010101009A +:1077E0000000000000000000000000000000000099 +:1077F0000000000000000000000000000000000089 +:107800000000000000000000000000000000000078 +:107810000000000000000000000000000000000068 +:107820000000000000000000000000000000000058 +:107830000000000000000000000000000000000048 +:107840000000000000000000000000000000000038 +:107850000000000000000000000000000000000028 +:107860000000000000000000000000000000000018 +:107870000000000000000000000000000000000008 +:1078800000000000000000000000000000000000F8 +:1078900000000000000000000000000000000000E8 +:1078A00000000000000000000000000000000000D8 +:1078B00000000000000000000000000000000002C6 +:1078C000020202020202020202020202020200009C +:1078D0000101010101010101010101010101010099 +:1078E0000000000000000000000000000000000098 +:1078F0000000000000000000000000000000000088 +:107900000000000000000000000000000000000077 +:107910000000000000000000000000000000000067 +:107920000000000000000000000000000000000057 +:107930000000000000000000000000000000000047 +:107940000000000000000000000000000000000037 +:107950000000000000000000000000000000000027 +:107960000000000000000000000000000000000017 +:107970000000000000000000000000000000000007 +:1079800000000000000000000000000000000000F7 +:1079900000000000000000000000000000000000E7 +:1079A00000000000000000000000000000000000D7 +:1079B00000000000000000000000000000000002C5 +:1079C000020202020202020202020202020200009B +:1079D0000101010101010101010101010101010098 +:1079E0000000000000000000000000000000000097 +:1079F0000000000000000000000000000000000087 +:107A00000000000000000000000000000000000076 +:107A10000000000000000000000000000000000066 +:107A20000000000000000000000000000000000056 +:107A30000000000000000000000000000000000046 +:107A40000000000000000000000000000000000036 +:107A50000000000000000000000000000000000026 +:107A60000000000000000000000000000000000016 +:107A70000000000000000000000000000000000006 +:107A800000000000000000000000000000000000F6 +:107A900000000000000000000000000000000000E6 +:107AA00000000000000000000000000000000000D6 +:107AB00000000000000000000000000000000002C4 +:107AC000020202020202020202020202020200009A +:107AD0000101010101010101010101010101010097 +:107AE0000000000000000000000000000000000096 +:107AF0000000000000000000000000000000000086 +:107B00000000000000000000000000000000000075 +:107B10000000000000000000000000000000000065 +:107B20000000000000000000000000000000000055 +:107B30000000000000000000000000000000000045 +:107B40000000000000000000000000000000000035 +:107B50000000000000000000000000000000000025 +:107B60000000000000000000000000000000000015 +:107B70000000000000000000000000000000000005 +:107B800000000000000000000000000000000000F5 +:107B900000000000000000000000000000000000E5 +:107BA00000000000000000000000000000000000D5 +:107BB00000000000000000000000000000000002C3 +:107BC0000202020202020202020202020202000099 +:107BD0000101010101010101010101010101010096 +:107BE0000000000000000000000000000000000095 +:107BF0000000000000000000000000000000000085 +:107C00000000000000000000000000000000000074 +:107C10000000000000000000000000000000000064 +:107C20000000000000000000000000000000000054 +:107C30000000000000000000000000000000000044 +:107C40000000000000000000000000000000000034 +:107C50000000000000000000000000000000000024 +:107C60000000000000000000000000000000000014 +:107C70000000000000000000000000000000000004 +:107C800000000000000000000000000000000000F4 +:107C900000000000000000000000000000000000E4 +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000002C2 +:107CC0000202020202020202020202020202000098 +:107CD00000000000000000000000000000000000A4 +:107CE0000000000000000000000000000000000094 +:107CF0000000000000000000000000000000000084 +:107D00000000000000000000000000000000000073 +:107D10000000000000000000000000000000000063 +:107D20000000000000000000000000000000000053 +:107D30000000000000000000000000000000000043 +:107D40000000000000000000000000000000000033 +:107D50000000000000000000000000000000000023 +:107D60000000000000000000000000000000000013 +:107D70000000000000000000000000000000000003 +:107D800000000000000000000000000000000000F3 +:107D900000000000000000000000000000000000E3 +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000000000000000C3 +:107DC000000000000000000000000000000000159E +:107DD00000000000000000000000000000000000A3 +:107DE0000000000000000100000000000000000092 +:107DF0000000000000000000000000000000000083 +:107E00000000000000000000000000000000000072 +:107E10000000000000000000000000000000000062 +:107E20000000000000000000000000000000000052 +:107E30000000000000000000000000000000000042 +:107E40000000000000000000000000000000000032 +:107E50000000000000000000000000000000000022 +:107E60000000000000000000000000000000000012 +:107E70000000000000000000000000000000000002 +:107E800000000000000000000000000000000000F2 +:107E900000000000000000000000000000000000E2 +:107EA00000000000000000000000000000000000D2 +:107EB00000000000000000000000000000000000C2 +:107EC00000000000000000020000000000000000B0 +:107ED00000000000000000000000000000000000A2 +:107EE000000000000101010000000000000000008F +:107EF0000000000000000000000000000000000082 +:107F00000000000000000000000000000000000071 +:107F10000000000000000000000000000000000061 +:107F20000000000000000000000000000000000051 +:107F30000000000000000000000000000000000041 +:107F40000000000000000000000000000000000031 +:107F50000000000000000000000000000000000021 +:107F60000000000000000000000000000000000011 +:107F70000000000000000000000000000000000001 +:107F800000000000000000000000000000000000F1 +:107F900000000000000000000000000000000000E1 +:107FA00000000000000000000000000000000000D1 +:107FB00000000000000000000000000000000000C1 +:107FC00000000000000000020100000000000000AE +:107FD00000000000000000000000000000000000A1 +:107FE000000000010101010000000000000000008D +:107FF0000000000000000000000000000000000081 +:108000000000000000000000000000000000000070 +:108010000000000000000000000000000000000060 +:108020000000000000000000000000000000000050 +:108030000000000000000000000000000000000040 +:108040000000000000000000000000000000000030 +:108050000000000000000000000000000000000020 +:108060000000000000000000000000000000000010 +:108070000000000000000000000000000000000000 +:1080800000000000000000000000000000000000F0 +:1080900000000000000000000000000000000000E0 +:1080A00000000000000000000000000000000000D0 +:1080B00000000000000000000000000000000000C0 +:1080C00000000000000000020100000001000000AC +:1080D00000000000000000000000000000000000A0 +:1080E000000000010101010000000000000000008C +:1080F0000000000000000000000000000000000080 +:10810000000000000000000000000000000000006F +:10811000000000000000000000000000000000005F +:10812000000000000000000000000000000000004F +:10813000000000000000000000000000000000003F +:10814000000000000000000000000000000000002F +:10815000000000000000000000000000000000001F +:10816000000000000000000000000000000000000F +:1081700000000000000000000000000000000000FF +:1081800000000000000000000000000000000000EF +:1081900000000000000000000000000000000000DF +:1081A00000000000000000000000000000000000CF +:1081B00000000000000000000000000000000000BF +:1081C00000000000000000020201000001000000A9 +:1081D000000000000000000000000000000000009F +:1081E000000001010101010000000000000000008A +:1081F000000000000000000000000000000000007F +:10820000000000000000000000000000000000006E +:10821000000000000000000000000000000000005E +:10822000000000000000000000000000000000004E +:10823000000000000000000000000000000000003E +:10824000000000000000000000000000000000002E +:10825000000000000000000000000000000000001E +:10826000000000000000000000000000000000000E +:1082700000000000000000000000000000000000FE +:1082800000000000000000000000000000000000EE +:1082900000000000000000000000000000000000DE +:1082A00000000000000000000000000000000000CE +:1082B00000000000000000000000000000000000BE +:1082C00000000000000000020202010101000000A5 +:1082D000000000000000000000000000000000009E +:1082E0000101010101010100000000000000000087 +:1082F000000000000000000000000000000000007E +:10830000000000000000000000000000000000006D +:10831000000000000000000000000000000000005D +:10832000000000000000000000000000000000004D +:10833000000000000000000000000000000000003D +:10834000000000000000000000000000000000002D +:10835000000000000000000000000000000000001D +:10836000000000000000000000000000000000000D +:1083700000000000000000000000000000000000FD +:1083800000000000000000000000000000000000ED +:1083900000000000000000000000000000000000DD +:1083A00000000000000000000000000000000000CD +:1083B00000000000000000000000000000000000BD +:1083C00000000000000000020202010101000000A4 +:1083D000000000000000000000000000000000019C +:1083E0000101010101010100000000000000000086 +:1083F000000000000000000000000000000000007D +:10840000000000000000000000000000000000006C +:10841000000000000000000000000000000000005C +:10842000000000000000000000000000000000004C +:10843000000000000000000000000000000000003C +:10844000000000000000000000000000000000002C +:10845000000000000000000000000000000000001C +:10846000000000000000000000000000000000000C +:1084700000000000000000000000000000000000FC +:1084800000000000000000000000000000000000EC +:1084900000000000000000000000000000000000DC +:1084A00000000000000000000000000000000000CC +:1084B00000000000000000000000000000000000BC +:1084C00000000000000000020202020101010001A0 +:1084D0000000000100000000000000000000010199 +:1084E0000101010101010100000000000000000085 +:1084F000000000000000000000000000000000007C +:10850000000000000000000000000000000000006B +:10851000000000000000000000000000000000005B +:10852000000000000000000000000000000000004B +:10853000000000000000000000000000000000003B +:10854000000000000000000000000000000000002B +:10855000000000000000000000000000000000001B +:10856000000000000000000000000000000000000B +:1085700000000000000000000000000000000000FB +:1085800000000000000000000000000000000000EB +:1085900000000000000000000000000000000000DB +:1085A00000000000000000000000000000000000CB +:1085B00000000000000000000000000000000000BB +:1085C000000000000000000202020202020101019C +:1085D0000100000101010000000000000101010193 +:1085E0000101010101010100000000000000000084 +:1085F000000000000000000000000000000000007B +:10860000000000000000000000000000000000006A +:10861000000000000000000000000000000000005A +:10862000000000000000000000000000000000004A +:10863000000000000000000000000000000000003A +:10864000000000000000000000000000000000002A +:10865000000000000000000000000000000000001A +:10866000000000000000000000000000000000000A +:1086700000000000000000000000000000000000FA +:1086800000000000000000000000000000000000EA +:1086900000000000000000000000000000000000DA +:1086A00000000000000000000000000000000000CA +:1086B00000000000000000000000000000000000BA +:1086C000000000000000000202020202020101019B +:1086D0000100010101010000000000000101010191 +:1086E0000101010101010100000000000000000083 +:1086F000000000000000000000000000000000007A +:108700000000000000000000000000000000000069 +:108710000000000000000000000000000000000059 +:108720000000000000000000000000000000000049 +:108730000000000000000000000000000000000039 +:108740000000000000000000000000000000000029 +:108750000000000000000000000000000000000019 +:108760000000000000000000000000000000000009 +:1087700000000000000000000000000000000000F9 +:1087800000000000000000000000000000000000E9 +:1087900000000000000000000000000000000000D9 +:1087A00000000000000000000000000000000000C9 +:1087B00000000000000000000000000000000000B9 +:1087C0000000000000000002020202020202010199 +:1087D000010001010101000000000001010101018F +:1087E0000101010101010100000000000000000082 +:1087F0000000000000000000000000000000000079 +:108800000000000000000000000000000000000068 +:108810000000000000000000000000000000000058 +:108820000000000000000000000000000000000048 +:108830000000000000000000000000000000000038 +:108840000000000000000000000000000000000028 +:108850000000000000000000000000000000000018 +:108860000000000000000000000000000000000008 +:1088700000000000000000000000000000000000F8 +:1088800000000000000000000000000000000000E8 +:1088900000000000000000000000000000000000D8 +:1088A00000000000000000000000000000000000C8 +:1088B00000000000000000000000000000000000B8 +:1088C0000000000000000002020202020202020296 +:1088D000010001010101000000000001010101018E +:1088E0000101010101010100000000000000000081 +:1088F0000000000000000000000000000000000078 +:108900000000000000000000000000000000000067 +:108910000000000000000000000000000000000057 +:108920000000000000000000000000000000000047 +:108930000000000000000000000000000000000037 +:108940000000000000000000000000000000000027 +:108950000000000000000000000000000000000017 +:108960000000000000000000000000000000000007 +:1089700000000000000000000000000000000000F7 +:1089800000000000000000000000000000000000E7 +:1089900000000000000000000000000000000000D7 +:1089A00000000000000000000000000000000000C7 +:1089B00000000000000000000000000000000000B7 +:1089C0000000000000000002020202020202020295 +:1089D000020101010101000000000101010101018A +:1089E0000101010101010100000000000000000080 +:1089F0000000000000000000000000000000000077 +:108A00000000000000000000000000000000000066 +:108A10000000000000000000000000000000000056 +:108A20000000000000000000000000000000000046 +:108A30000000000000000000000000000000000036 +:108A40000000000000000000000000000000000026 +:108A50000000000000000000000000000000000016 +:108A60000000000000000000000000000000000006 +:108A700000000000000000000000000000000000F6 +:108A800000000000000000000000000000000000E6 +:108A900000000000000000000000000000000000D6 +:108AA00000000000000000000000000000000000C6 +:108AB00000000000000000000000000000000000B6 +:108AC0000000000000000002020202020202020294 +:108AD0000201020201010000000001010101010187 +:108AE000010101010101010000000000000000007F +:108AF0000000000000000000000000000000000076 +:108B00000000000000000000000000000000000065 +:108B10000000000000000000000000000000000055 +:108B20000000000000000000000000000000000045 +:108B30000000000000000000000000000000000035 +:108B40000000000000000000000000000000000025 +:108B50000000000000000000000000000000000015 +:108B60000000000000000000000000000000000005 +:108B700000000000000000000000000000000000F5 +:108B800000000000000000000000000000000000E5 +:108B900000000000000000000000000000000000D5 +:108BA00000000000000000000000000000000000C5 +:108BB00000000000000000000000000000000000B5 +:108BC0000000000000000002020202020202020293 +:108BD0000202020202020000000001010101010183 +:108BE000010101010101010000000000000000007E +:108BF0000000000000000000000000000000000075 +:108C00000000000000000000000000000000000064 +:108C10000000000000000000000000000000000054 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 +:108C40000000000000000000000000000000000024 +:108C50000000000000000000000000000000000014 +:108C60000000000000000000000000000000000004 +:108C700000000000000000000000000000000000F4 +:108C800000000000000000000000000000000000E4 +:108C900000000000000000000000000000000000D4 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000000000000000000B4 +:108CC0000000000000000002020202020202020292 +:108CD0000202020202020000010101010101010180 +:108CE000010101010101010000000000000000007D +:108CF0000000000000000000000000000000000074 +:108D00000000000000000000000000000000000063 +:108D10000000000000000000000000000000000053 +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 +:108D40000000000000000000000000000000000023 +:108D50000000000000000000000000000000000013 +:108D60000000000000000000000000000000000003 +:108D700000000000000000000000000000000000F3 +:108D800000000000000000000000000000000000E3 +:108D900000000000000000000000000000000000D3 +:108DA00000000000000000000000000000000000C3 +:108DB00000000000000000000000000000000000B3 +:108DC0000000000000000002020202020202020291 +:108DD000020202020202000001010101010101017F +:108DE000010101010101010000000000000000007C +:108DF0000000000000000000000000000000000073 +:108E00000000000000000000000000000000000062 +:108E10000000000000000000000000000000000052 +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 +:108E50000000000000000000000000000000000012 +:108E60000000000000000000000000000000000002 +:108E700000000000000000000000000000000000F2 +:108E800000000000000000000000000000000000E2 +:108E900000000000000000000000000000000000D2 +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC0000000000000000002020202020202020290 +:108ED000020202020202000001010101010101017E +:108EE000010101010101010000000000000000007B +:108EF0000000000000000000000000000000000072 +:108F00000000000000000000000000000000000061 +:108F10000000000000000000000000000000000051 +:108F20000000000000000000000000000000000041 +:108F30000000000000000000000000000000000031 +:108F40000000000000000000000000000000000021 +:108F50000000000000000000000000000000000011 +:108F60000000000000000000000000000000000001 +:108F700000000000000000000000000000000000F1 +:108F800000000000000000000000000000000000E1 +:108F900000000000000000000000000000000000D1 +:108FA00000000000000000000000000000000000C1 +:108FB00000000000000000000000000000000000B1 +:108FC000000000000000000202020202020202028F +:108FD000020202020202000001010101010101017D +:108FE000010101010101010000000000000000007A +:108FF0000000000000000000000000000000000071 +:109000000000000000000000000000000000000060 +:109010000000000000000000000000000000000050 +:109020000000000000000000000000000000000040 +:109030000000000000000000000000000000000030 +:109040000000000000000000000000000000000020 +:109050000000000000000000000000000000000010 +:109060000000000000000000000000000000000000 +:1090700000000000000000000000000000000000F0 +:1090800000000000000000000000000000000000E0 +:1090900000000000000000000000000000000000D0 +:1090A00000000000000000000000000000000000C0 +:1090B00000000000000000000000000000000000B0 +:1090C000000000000000000202020202020202028E +:1090D000020202020202000001010101010101017C +:1090E0000101010101010100000000000000000079 +:1090F0000000000000000000000000000000000070 +:10910000000000000000000000000000000000005F +:10911000000000000000000000000000000000004F +:10912000000000000000000000000000000000003F +:10913000000000000000000000000000000000002F +:10914000000000000000000000000000000000001F +:10915000000000000000000000000000000000000F +:1091600000000000000000000000000000000000FF +:1091700000000000000000000000000000000000EF +:1091800000000000000000000000000000000000DF +:1091900000000000000000000000000000000000CF +:1091A00000000000000000000000000000000000BF +:1091B00000000000000000000000000000000000AF +:1091C000000000000000000202020202020202028D +:1091D0000202020202020000000000000000000083 +:1091E000000000000000000000000000000000007F +:1091F000000000000000000000000000000000006F +:10920000000000000000000000000000000000005E +:10921000000000000000000000000000000000004E +:10922000000000000000000000000000000000003E +:10923000000000000000000000000000000000002E +:10924000000000000000000000000000000000001E +:10925000000000000000000000000000000000000E +:1092600000000000000000000000000000000000FE +:1092700000000000000000000000000000000000EE +:1092800000000000000000000000000000000000DE +:1092900000000000000000000000000000000000CE +:1092A00000000000000000000000000000000000BE +:1092B00000000000000000000000000000000000AE +:1092C000000000000000000000000000000000009E +:1092D000000000000000001300000000000000007B +:1092E000000000000000000000000000000101007C +:1092F000000000000000000000000000000000006E +:10930000000000000000000000000000000000005D +:10931000000000000000000000000000000000004D +:10932000000000000000000000000000000000003D +:10933000000000000000000000000000000000002D +:10934000000000000000000000000000000000001D +:10935000000000000000000000000000000000000D +:1093600000000000000000000000000000000000FD +:1093700000000000000000000000000000000000ED +:1093800000000000000000000000000000000000DD +:1093900000000000000000000000000000000000CD +:1093A00000000000000000000000000000000000BD +:1093B00000000000000000000000000000000000AD +:1093C000000000000000000000000000000000029B +:1093D000010000000000000000000000000000008C +:1093E000000000000000000000000000000101007B +:1093F000000000000000000000000000000000006D +:10940000000000000000000000000000000000005C +:10941000000000000000000000000000000000004C +:10942000000000000000000000000000000000003C +:10943000000000000000000000000000000000002C +:10944000000000000000000000000000000000001C +:10945000000000000000000000000000000000000C +:1094600000000000000000000000000000000000FC +:1094700000000000000000000000000000000000EC +:1094800000000000000000000000000000000000DC +:1094900000000000000000000000000000000000CC +:1094A00000000000000000000000000000000000BC +:1094B00000000000000000000000000000000000AC +:1094C000000000000000000000000000000000029A +:1094D000010000000000000000000000000000008B +:1094E000000000000000000000000000000101007A +:1094F000000000000000000000000000000000006C +:10950000000000000000000000000000000000005B +:10951000000000000000000000000000000000004B +:10952000000000000000000000000000000000003B +:10953000000000000000000000000000000000002B +:10954000000000000000000000000000000000001B +:10955000000000000000000000000000000000000B +:1095600000000000000000000000000000000000FB +:1095700000000000000000000000000000000000EB +:1095800000000000000000000000000000000000DB +:1095900000000000000000000000000000000000CB +:1095A00000000000000000000000000000000000BB +:1095B00000000000000000000000000000000000AB +:1095C0000000000000000000000000000000000299 +:1095D0000101010000000000000000000000000088 +:1095E0000000000000000000000000010101010077 +:1095F000000000000000000000000000000000006B +:10960000000000000000000000000000000000005A +:10961000000000000000000000000000000000004A +:10962000000000000000000000000000000000003A +:10963000000000000000000000000000000000002A +:10964000000000000000000000000000000000001A +:10965000000000000000000000000000000000000A +:1096600000000000000000000000000000000000FA +:1096700000000000000000000000000000000000EA +:1096800000000000000000000000000000000000DA +:1096900000000000000000000000000000000000CA +:1096A00000000000000000000000000000000000BA +:1096B00000000000000000000000000000000000AA +:1096C0000000000000000000000000000000000298 +:1096D0000201010101000000000000000000000084 +:1096E0000000000000000000000001010101010075 +:1096F000000000000000000000000000000000006A +:109700000000000000000000000000000000000059 +:109710000000000000000000000000000000000049 +:109720000000000000000000000000000000000039 +:109730000000000000000000000000000000000029 +:109740000000000000000000000000000000000019 +:109750000000000000000000000000000000000009 +:1097600000000000000000000000000000000000F9 +:1097700000000000000000000000000000000000E9 +:1097800000000000000000000000000000000000D9 +:1097900000000000000000000000000000000000C9 +:1097A00000000000000000000000000000000000B9 +:1097B00000000000000000000000000000000000A9 +:1097C0000000000000000000000000000000000297 +:1097D0000202010101000000000000000000000082 +:1097E0000000000000000001010101010101010071 +:1097F0000000000000000000000000000000000069 +:109800000000000000000000000000000000000058 +:109810000000000000000000000000000000000048 +:109820000000000000000000000000000000000038 +:109830000000000000000000000000000000000028 +:109840000000000000000000000000000000000018 +:109850000000000000000000000000000000000008 +:1098600000000000000000000000000000000000F8 +:1098700000000000000000000000000000000000E8 +:1098800000000000000000000000000000000000D8 +:1098900000000000000000000000000000000000C8 +:1098A00000000000000000000000000000000000B8 +:1098B00000000000000000000000000000000000A8 +:1098C0000000000000000000000000000000000296 +:1098D000020202010100000100000000000000007F +:1098E000000000000000010101010101010101006F +:1098F0000000000000000000000000000000000068 +:109900000000000000000000000000000000000057 +:109910000000000000000000000000000000000047 +:109920000000000000000000000000000000000037 +:109930000000000000000000000000000000000027 +:109940000000000000000000000000000000000017 +:109950000000000000000000000000000000000007 +:1099600000000000000000000000000000000000F7 +:1099700000000000000000000000000000000000E7 +:1099800000000000000000000000000000000000D7 +:1099900000000000000000000000000000000000C7 +:1099A00000000000000000000000000000000000B7 +:1099B00000000000000000000000000000000000A7 +:1099C0000000000000000000000000000000000295 +:1099D000020202020100010100000000000100007B +:1099E000000000000101010101010101010101006C +:1099F0000000000000000000000000000000000067 +:109A00000000000000000000000000000000000056 +:109A10000000000000000000000000000000000046 +:109A20000000000000000000000000000000000036 +:109A30000000000000000000000000000000000026 +:109A40000000000000000000000000000000000016 +:109A50000000000000000000000000000000000006 +:109A600000000000000000000000000000000000F6 +:109A700000000000000000000000000000000000E6 +:109A800000000000000000000000000000000000D6 +:109A900000000000000000000000000000000000C6 +:109AA00000000000000000000000000000000000B6 +:109AB00000000000000000000000000000000000A6 +:109AC0000000000000000000000000000000000294 +:109AD0000202020202010101000000000001000078 +:109AE000000000000101010101010101010101006B +:109AF0000000000000000000000000000000000066 +:109B00000000000000000000000000000000000055 +:109B10000000000000000000000000000000000045 +:109B20000000000000000000000000000000000035 +:109B30000000000000000000000000000000000025 +:109B40000000000000000000000000000000000015 +:109B50000000000000000000000000000000000005 +:109B600000000000000000000000000000000000F5 +:109B700000000000000000000000000000000000E5 +:109B800000000000000000000000000000000000D5 +:109B900000000000000000000000000000000000C5 +:109BA00000000000000000000000000000000000B5 +:109BB00000000000000000000000000000000000A5 +:109BC0000000000000000000000000000000000293 +:109BD0000202020202010101000000000001000077 +:109BE0000000000101010101010101010101010069 +:109BF0000000000000000000000000000000000065 +:109C00000000000000000000000000000000000054 +:109C10000000000000000000000000000000000044 +:109C20000000000000000000000000000000000034 +:109C30000000000000000000000000000000000024 +:109C40000000000000000000000000000000000014 +:109C50000000000000000000000000000000000004 +:109C600000000000000000000000000000000000F4 +:109C700000000000000000000000000000000000E4 +:109C800000000000000000000000000000000000D4 +:109C900000000000000000000000000000000000C4 +:109CA00000000000000000000000000000000000B4 +:109CB00000000000000000000000000000000000A4 +:109CC0000000000000000000000000000000000292 +:109CD0000202020202020202010000000001000072 +:109CE0000000010101010101010101010101010067 +:109CF0000000000000000000000000000000000064 +:109D00000000000000000000000000000000000053 +:109D10000000000000000000000000000000000043 +:109D20000000000000000000000000000000000033 +:109D30000000000000000000000000000000000023 +:109D40000000000000000000000000000000000013 +:109D50000000000000000000000000000000000003 +:109D600000000000000000000000000000000000F3 +:109D700000000000000000000000000000000000E3 +:109D800000000000000000000000000000000000D3 +:109D900000000000000000000000000000000000C3 +:109DA00000000000000000000000000000000000B3 +:109DB00000000000000000000000000000000000A3 +:109DC0000000000000000000000000000000000291 +:109DD0000202020202020202010001000001000070 +:109DE0000000010101010101010101010101010066 +:109DF0000000000000000000000000000000000063 +:109E00000000000000000000000000000000000052 +:109E10000000000000000000000000000000000042 +:109E20000000000000000000000000000000000032 +:109E30000000000000000000000000000000000022 +:109E40000000000000000000000000000000000012 +:109E50000000000000000000000000000000000002 +:109E600000000000000000000000000000000000F2 +:109E700000000000000000000000000000000000E2 +:109E800000000000000000000000000000000000D2 +:109E900000000000000000000000000000000000C2 +:109EA00000000000000000000000000000000000B2 +:109EB00000000000000000000000000000000000A2 +:109EC0000000000000000000000000000000000290 +:109ED000020202020202020202010101000100006C +:109EE0000101010101010101010101010101010063 +:109EF0000000000000000000000000000000000062 +:109F00000000000000000000000000000000000051 +:109F10000000000000000000000000000000000041 +:109F20000000000000000000000000000000000031 +:109F30000000000000000000000000000000000021 +:109F40000000000000000000000000000000000011 +:109F50000000000000000000000000000000000001 +:109F600000000000000000000000000000000000F1 +:109F700000000000000000000000000000000000E1 +:109F800000000000000000000000000000000000D1 +:109F900000000000000000000000000000000000C1 +:109FA00000000000000000000000000000000000B1 +:109FB00000000000000000000000000000000000A1 +:109FC000000000000000000000000000000000028F +:109FD0000202020202020202020202010002000068 +:109FE0000101010101010101010101010101010062 +:109FF0000000000000000000000000000000000061 +:10A000000000000000000000000000000000000050 +:10A010000000000000000000000000000000000040 +:10A020000000000000000000000000000000000030 +:10A030000000000000000000000000000000000020 +:10A040000000000000000000000000000000000010 +:10A050000000000000000000000000000000000000 +:10A0600000000000000000000000000000000000F0 +:10A0700000000000000000000000000000000000E0 +:10A0800000000000000000000000000000000000D0 +:10A0900000000000000000000000000000000000C0 +:10A0A00000000000000000000000000000000000B0 +:10A0B00000000000000000000000000000000000A0 +:10A0C000000000000000000000000000000000028E +:10A0D0000202020202020202020202020102000065 +:10A0E0000101010101010101010101010101010061 +:10A0F0000000000000000000000000000000000060 +:10A10000000000000000000000000000000000004F +:10A11000000000000000000000000000000000003F +:10A12000000000000000000000000000000000002F +:10A13000000000000000000000000000000000001F +:10A14000000000000000000000000000000000000F +:10A1500000000000000000000000000000000000FF +:10A1600000000000000000000000000000000000EF +:10A1700000000000000000000000000000000000DF +:10A1800000000000000000000000000000000000CF +:10A1900000000000000000000000000000000000BF +:10A1A00000000000000000000000000000000000AF +:10A1B000000000000000000000000000000000009F +:10A1C000000000000000000000000000000000028D +:10A1D0000202020202020202020202020202000063 +:10A1E0000101010101010101010101010101010060 +:10A1F000000000000000000000000000000000005F +:10A20000000000000000000000000000000000004E +:10A21000000000000000000000000000000000003E +:10A22000000000000000000000000000000000002E +:10A23000000000000000000000000000000000001E +:10A24000000000000000000000000000000000000E +:10A2500000000000000000000000000000000000FE +:10A2600000000000000000000000000000000000EE +:10A2700000000000000000000000000000000000DE +:10A2800000000000000000000000000000000000CE +:10A2900000000000000000000000000000000000BE +:10A2A00000000000000000000000000000000000AE +:10A2B000000000000000000000000000000000009E +:10A2C000000000000000000000000000000000028C +:10A2D0000202020202020202020202020202000062 +:10A2E000010101010101010101010101010101005F +:10A2F000000000000000000000000000000000005E +:10A30000000000000000000000000000000000004D +:10A31000000000000000000000000000000000003D +:10A32000000000000000000000000000000000002D +:10A33000000000000000000000000000000000001D +:10A34000000000000000000000000000000000000D +:10A3500000000000000000000000000000000000FD +:10A3600000000000000000000000000000000000ED +:10A3700000000000000000000000000000000000DD +:10A3800000000000000000000000000000000000CD +:10A3900000000000000000000000000000000000BD +:10A3A00000000000000000000000000000000000AD +:10A3B000000000000000000000000000000000009D +:10A3C000000000000000000000000000000000028B +:10A3D0000202020202020202020202020202000061 +:10A3E000010101010101010101010101010101005E +:10A3F000000000000000000000000000000000005D +:10A40000000000000000000000000000000000004C +:10A41000000000000000000000000000000000003C +:10A42000000000000000000000000000000000002C +:10A43000000000000000000000000000000000001C +:10A44000000000000000000000000000000000000C +:10A4500000000000000000000000000000000000FC +:10A4600000000000000000000000000000000000EC +:10A4700000000000000000000000000000000000DC +:10A4800000000000000000000000000000000000CC +:10A4900000000000000000000000000000000000BC +:10A4A00000000000000000000000000000000000AC +:10A4B000000000000000000000000000000000009C +:10A4C000000000000000000000000000000000028A +:10A4D0000202020202020202020202020202000060 +:10A4E000000000000000000000000000000000006C +:10A4F000000000000000000000000000000000005C +:10A50000000000000000000000000000000000004B +:10A51000000000000000000000000000000000003B +:10A52000000000000000000000000000000000002B +:10A53000000000000000000000000000000000001B +:10A54000000000000000000000000000000000000B +:10A5500000000000000000000000000000000000FB +:10A5600000000000000000000000000000000000EB +:10A5700000000000000000000000000000000000DB +:10A5800000000000000000000000000000000000CB +:10A5900000000000000000000000000000000000BB +:10A5A00000000000000000000000000000000000AB +:10A5B000000000000000000000000000000000009B +:10A5C000000000000000000000000000000000008B +:10A5D000000000000000000000000000000000116A +:10A5E000000000000000000000000000000000006B +:10A5F000000000000000000000000000000000005B +:10A60000000000000000000000000000000000004A +:10A61000000000000000000000000000000000003A +:10A62000000000000000000000000000000000002A +:10A63000000000000000000000000000000000001A +:10A64000000000000000000000000000000000000A +:10A6500000000000000000000000000000000000FA +:10A6600000000000000000000000000000000000EA +:10A6700000000000000000000000000000000000DA +:10A6800000000000000000000000000000000000CA +:10A6900000000000000000000000000000000000BA +:10A6A00000000000000000000000000000000000AA +:10A6B000000000000000000000000000000000009A +:10A6C000000000000000000000000000000000008A +:10A6D0000000000000000000010100000000000078 +:10A6E000000000000000000000000000000000006A +:10A6F0000000000000010100000000000000000058 +:10A700000000000000000000000000000000000049 +:10A710000000000000000000000000000000000039 +:10A720000000000000000000000000000000000029 +:10A730000000000000000000000000000000000019 +:10A740000000000000000000000000000000000009 +:10A7500000000000000000000000000000000000F9 +:10A7600000000000000000000000000000000000E9 +:10A7700000000000000000000000000000000000D9 +:10A7800000000000000000000000000000000000C9 +:10A7900000000000000000000000000000000000B9 +:10A7A00000000000000000000000000000000000A9 +:10A7B0000000000000000000000000000000000099 +:10A7C0000000000000000000000000000000000089 +:10A7D0000000000000000002010101000000000074 +:10A7E0000000000000000000000000000000000069 +:10A7F0000000000000010100000000000000000057 +:10A800000000000000000000000000000000000048 +:10A810000000000000000000000000000000000038 +:10A820000000000000000000000000000000000028 +:10A830000000000000000000000000000000000018 +:10A840000000000000000000000000000000000008 +:10A8500000000000000000000000000000000000F8 +:10A8600000000000000000000000000000000000E8 +:10A8700000000000000000000000000000000000D8 +:10A8800000000000000000000000000000000000C8 +:10A8900000000000000000000000000000000000B8 +:10A8A00000000000000000000000000000000000A8 +:10A8B0000000000000000000000000000000000098 +:10A8C0000000000000000000000000000000000088 +:10A8D0000000000000000002010101000000000073 +:10A8E0000000000000000000000000000000000068 +:10A8F0000000000101010100000000000000000054 +:10A900000000000000000000000000000000000047 +:10A910000000000000000000000000000000000037 +:10A920000000000000000000000000000000000027 +:10A930000000000000000000000000000000000017 +:10A940000000000000000000000000000000000007 +:10A9500000000000000000000000000000000000F7 +:10A9600000000000000000000000000000000000E7 +:10A9700000000000000000000000000000000000D7 +:10A9800000000000000000000000000000000000C7 +:10A9900000000000000000000000000000000000B7 +:10A9A00000000000000000000000000000000000A7 +:10A9B0000000000000000000000000000000000097 +:10A9C0000000000000000000000000000000000087 +:10A9D0000000000000000002020101010000000070 +:10A9E0000000000000000000000000000000000067 +:10A9F0000001010101010100000000000000000051 +:10AA00000000000000000000000000000000000046 +:10AA10000000000000000000000000000000000036 +:10AA20000000000000000000000000000000000026 +:10AA30000000000000000000000000000000000016 +:10AA40000000000000000000000000000000000006 +:10AA500000000000000000000000000000000000F6 +:10AA600000000000000000000000000000000000E6 +:10AA700000000000000000000000000000000000D6 +:10AA800000000000000000000000000000000000C6 +:10AA900000000000000000000000000000000000B6 +:10AAA00000000000000000000000000000000000A6 +:10AAB0000000000000000000000000000000000096 +:10AAC0000000000000000000000000000000000086 +:10AAD000000000000000000202020101000000006E +:10AAE0000000000000010000000000000000000164 +:10AAF000010101010101010000000000000000004F +:10AB00000000000000000000000000000000000045 +:10AB10000000000000000000000000000000000035 +:10AB20000000000000000000000000000000000025 +:10AB30000000000000000000000000000000000015 +:10AB40000000000000000000000000000000000005 +:10AB500000000000000000000000000000000000F5 +:10AB600000000000000000000000000000000000E5 +:10AB700000000000000000000000000000000000D5 +:10AB800000000000000000000000000000000000C5 +:10AB900000000000000000000000000000000000B5 +:10ABA00000000000000000000000000000000000A5 +:10ABB0000000000000000000000000000000000095 +:10ABC0000000000000000000000000000000000085 +:10ABD000000000000000000202020201000000006C +:10ABE0000000000000010000000000000000010162 +:10ABF000010101010101010000000000000000004E +:10AC00000000000000000000000000000000000044 +:10AC10000000000000000000000000000000000034 +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000000000000000000000014 +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000000F4 +:10AC600000000000000000000000000000000000E4 +:10AC700000000000000000000000000000000000D4 +:10AC800000000000000000000000000000000000C4 +:10AC900000000000000000000000000000000000B4 +:10ACA00000000000000000000000000000000000A4 +:10ACB0000000000000000000000000000000000094 +:10ACC0000000000000000000000000000000000084 +:10ACD0000000000000000002020202020000000169 +:10ACE0000000000000010000000000000001010160 +:10ACF000010101010101010000000000000000004D +:10AD00000000000000000000000000000000000043 +:10AD10000000000000000000000000000000000033 +:10AD20000000000000000000000000000000000023 +:10AD30000000000000000000000000000000000013 +:10AD40000000000000000000000000000000000003 +:10AD500000000000000000000000000000000000F3 +:10AD600000000000000000000000000000000000E3 +:10AD700000000000000000000000000000000000D3 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000000000000000000000A3 +:10ADB0000000000000000000000000000000000093 +:10ADC0000000000000000000000000000000000083 +:10ADD0000000000000000002020202020100010166 +:10ADE000000100000001000000000101010101015B +:10ADF000010101010101010000000000000000004C +:10AE00000000000000000000000000000000000042 +:10AE10000000000000000000000000000000000032 +:10AE20000000000000000000000000000000000022 +:10AE30000000000000000000000000000000000012 +:10AE40000000000000000000000000000000000002 +:10AE500000000000000000000000000000000000F2 +:10AE600000000000000000000000000000000000E2 +:10AE700000000000000000000000000000000000D2 +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000000000000000000B2 +:10AEA00000000000000000000000000000000000A2 +:10AEB0000000000000000000000000000000000092 +:10AEC0000000000000000000000000000000000082 +:10AED0000000000000000002020202020201010163 +:10AEE0000101000100010000000101010101010157 +:10AEF000010101010101010000000000000000004B +:10AF00000000000000000000000000000000000041 +:10AF10000000000000000000000000000000000031 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000000000000011 +:10AF40000000000000000000000000000000000001 +:10AF500000000000000000000000000000000000F1 +:10AF600000000000000000000000000000000000E1 +:10AF700000000000000000000000000000000000D1 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000000A1 +:10AFB0000000000000000000000000000000000091 +:10AFC0000000000000000000000000000000000081 +:10AFD000000000000000000202020202020202025F +:10AFE0000101010100010000000101010101010155 +:10AFF000010101010101010000000000000000004A +:10B000000000000000000000000000000000000040 +:10B010000000000000000000000000000000000030 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000000000000F0 +:10B0600000000000000000000000000000000000E0 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000000000000000000000000000000000090 +:10B0C0000000000000000000000000000000000080 +:10B0D000000000000000000202020202020202025E +:10B0E0000202010100020000010101010101010150 +:10B0F0000101010101010100000000000000000049 +:10B10000000000000000000000000000000000003F +:10B11000000000000000000000000000000000002F +:10B12000000000000000000000000000000000001F +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000000FF +:10B1500000000000000000000000000000000000EF +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000000009F +:10B1B000000000000000000000000000000000008F +:10B1C000000000000000000000000000000000007F +:10B1D000000000000000000202020202020202025D +:10B1E000020202020002000001010101010101014D +:10B1F0000101010101010100000000000000000048 +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B22000000000000000000000000000000000001E +:10B23000000000000000000000000000000000000E +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B000000000000000000000000000000000008E +:10B2C000000000000000000000000000000000007E +:10B2D000000000000000000202020202020202025C +:10B2E000020202020102000001010101010101014B +:10B2F0000101010101010100000000000000000047 +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000000000000007D +:10B3D000000000000000000202020202020202025B +:10B3E0000202020202020000010101010101010149 +:10B3F0000101010101010100000000000000000046 +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000000000000000000000000000000000FC +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B4700000000000000000000000000000000000CC +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000000000000000000007C +:10B4D000000000000000000202020202020202025A +:10B4E0000202020202020000010101010101010148 +:10B4F0000101010101010100000000000000000045 +:10B50000000000000000000000000000000000003B +:10B51000000000000000000000000000000000002B +:10B52000000000000000000000000000000000001B +:10B53000000000000000000000000000000000000B +:10B5400000000000000000000000000000000000FB +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B5700000000000000000000000000000000000CB +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C000000000000000000000000000000000007B +:10B5D0000000000000000002020202020202020259 +:10B5E000020202020202000000000000000000004F +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000000000000000FA +:10B6500000000000000000000000000000000000EA +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000001000000000000000004A +:10B6F0000000000000000000000000000000010049 +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B7400000000000000000000000000000000000F9 +:10B7500000000000000000000000000000000000E9 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 +:10B7A0000000000000000000000000000000000099 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000000000000000079 +:10B7D0000000000000000000000000000000000267 +:10B7E0000101010000000000000000000000000056 +:10B7F0000000000000000000000000000101010046 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820000000000000000000000000000000000018 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000000E8 +:10B8600000000000000000000000000000000000D8 +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000000000000000000266 +:10B8E0000101010100000000000000000000000054 +:10B8F0000000000000000000000000010101010044 +:10B900000000000000000000000000000000000037 +:10B910000000000000000000000000000000000027 +:10B920000000000000000000000000000000000017 +:10B930000000000000000000000000000000000007 +:10B9400000000000000000000000000000000000F7 +:10B9500000000000000000000000000000000000E7 +:10B9600000000000000000000000000000000000D7 +:10B9700000000000000000000000000000000000C7 +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000000000000265 +:10B9E0000201010100000000000000000000000052 +:10B9F0000000000000000000000101010101010041 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000000000000E6 +:10BA600000000000000000000000000000000000D6 +:10BA700000000000000000000000000000000000C6 +:10BA800000000000000000000000000000000000B6 +:10BA900000000000000000000000000000000000A6 +:10BAA0000000000000000000000000000000000096 +:10BAB0000000000000000000000000000000000086 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000264 +:10BAE0000202010100000000000000000000000050 +:10BAF000000000000000000101010101010101003E +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000263 +:10BBE000020202010000000000000000010000004D +:10BBF000000000000001010101010101010101003B +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000262 +:10BCE000020202020100000000000000010000004A +:10BCF0000000000101010101010101010101010038 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000000000000000D3 +:10BD700000000000000000000000000000000000C3 +:10BD800000000000000000000000000000000000B3 +:10BD900000000000000000000000000000000000A3 +:10BDA0000000000000000000000000000000000093 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000000000000073 +:10BDD0000000000000000000000000000000000261 +:10BDE0000202020201010000000000000101000047 +:10BDF0000000010101010101010101010101010036 +:10BE00000000000000000000000000000000000032 +:10BE10000000000000000000000000000000000022 +:10BE20000000000000000000000000000000000012 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000000000000000000000000D2 +:10BE700000000000000000000000000000000000C2 +:10BE800000000000000000000000000000000000B2 +:10BE900000000000000000000000000000000000A2 +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000260 +:10BEE0000202020202010001000000000101000044 +:10BEF0000000010101010101010101010101010035 +:10BF00000000000000000000000000000000000031 +:10BF10000000000000000000000000000000000021 +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000000000000000000000C1 +:10BF800000000000000000000000000000000000B1 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD000000000000000000000000000000000025F +:10BFE0000202020202020101000100000101000040 +:10BFF0000001010101010101010101010101010033 +:10C000000000000000000000000000000000000030 +:10C010000000000000000000000000000000000020 +:10C020000000000000000000000000000000000010 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C0700000000000000000000000000000000000C0 +:10C0800000000000000000000000000000000000B0 +:10C0900000000000000000000000000000000000A0 +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D000000000000000000000000000000000025E +:10C0E000020202020202020201010001020100003A +:10C0F0000001010101010101010101010101010032 +:10C10000000000000000000000000000000000002F +:10C11000000000000000000000000000000000001F +:10C12000000000000000000000000000000000000F +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000000000000000000000CF +:10C1700000000000000000000000000000000000BF +:10C1800000000000000000000000000000000000AF +:10C19000000000000000000000000000000000009F +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000000000006F +:10C1D000000000000000000000000000000000025D +:10C1E0000202020202020202020201010202000035 +:10C1F0000101010101010101010101010101010030 +:10C20000000000000000000000000000000000002E +:10C21000000000000000000000000000000000001E +:10C22000000000000000000000000000000000000E +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C2700000000000000000000000000000000000BE +:10C2800000000000000000000000000000000000AE +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000000000000000000000007E +:10C2C000000000000000000000000000000000006E +:10C2D000000000000000000000000000000000025C +:10C2E0000202020202020202020202020202000032 +:10C2F000010101010101010101010101010101002F +:10C30000000000000000000000000000000000002D +:10C31000000000000000000000000000000000001D +:10C32000000000000000000000000000000000000D +:10C3300000000000000000000000000000000000FD +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000000000000000000000BD +:10C3800000000000000000000000000000000000AD +:10C39000000000000000000000000000000000009D +:10C3A000000000000000000000000000000000008D +:10C3B000000000000000000000000000000000007D +:10C3C000000000000000000000000000000000006D +:10C3D000000000000000000000000000000000025B +:10C3E0000202020202020202020202020202000031 +:10C3F000010101010101010101010101010101002E +:10C40000000000000000000000000000000000002C +:10C41000000000000000000000000000000000001C +:10C42000000000000000000000000000000000000C +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000000000000000000000BC +:10C4800000000000000000000000000000000000AC +:10C49000000000000000000000000000000000009C +:10C4A000000000000000000000000000000000008C +:10C4B000000000000000000000000000000000007C +:10C4C000000000000000000000000000000000006C +:10C4D000000000000000000000000000000000025A +:10C4E0000202020202020202020202020202000030 +:10C4F000010101010101010101010101010101002D +:10C50000000000000000000000000000000000002B +:10C51000000000000000000000000000000000001B +:10C52000000000000000000000000000000000000B +:10C5300000000000000000000000000000000000FB +:10C5400000000000000000000000000000000000EB +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000000000000000009B +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000000006B +:10C5D0000000000000000000000000000000000259 +:10C5E000020202020202020202020202020200002F +:10C5F000000000000000000000000000000000003B +:10C60000000000000000000000000000000000002A +:10C61000000000000000000000000000000000001A +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000000CA +:10C6700000000000000000000000000000000000BA +:10C6800000000000000000000000000000000000AA +:10C69000000000000000000000000000000000009A +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D000000000000000000000000000000000005A +:10C6E000000000000000000000000000000000103A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000100000000000000000028 +:10C710000000000000000000000000000000000019 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000000000000000D9 +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000002000001000100000045 +:10C7F0000000000000000000000000000000000039 +:10C800000000010101010100000000000000000023 +:10C810000000000000000000000000000000000018 +:10C820000000000000000000000000000000000008 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000000000000000000000C8 +:10C8700000000000000000000000000000000000B8 +:10C8800000000000000000000000000000000000A8 +:10C890000000000000000000000000000000000098 +:10C8A0000000000000000000000000000000000088 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E0000000000000000002010101010100010040 +:10C8F0000000000000000000000000000000000038 +:10C900000000010101010100000000000000000022 +:10C910000000000000000000000000000000000017 +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000000000000000000000000C7 +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A0000000000000000000000000000000000087 +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E000000000000000000201010101010001003F +:10C9F0000000010101010000000000000000000033 +:10CA0000010101010101010000000000000000001F +:10CA10000000000000000000000000000000000016 +:10CA20000000000000000000000000000000000006 +:10CA300000000000000000000000000000000000F6 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000000000000000000000000000C6 +:10CA700000000000000000000000000000000000B6 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB0000000000000000000000000000000000076 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE000000000000000000202010101010001003D +:10CAF0000000010101010000000000000000010130 +:10CB0000010101010101010000000000000000001E +:10CB10000000000000000000000000000000000015 +:10CB20000000000000000000000000000000000005 +:10CB300000000000000000000000000000000000F5 +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB700000000000000000000000000000000000B5 +:10CB800000000000000000000000000000000000A5 +:10CB90000000000000000000000000000000000095 +:10CBA0000000000000000000000000000000000085 +:10CBB0000000000000000000000000000000000075 +:10CBC0000000000000000000000000000000000065 +:10CBD0000000000000000000000000000000000055 +:10CBE0000000000000000002020202010101010039 +:10CBF000010001010101000000000000010101012C +:10CC0000010101010101010000000000000000001D +:10CC10000000000000000000000000000000000014 +:10CC20000000000000000000000000000000000004 +:10CC300000000000000000000000000000000000F4 +:10CC400000000000000000000000000000000000E4 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000000000000000000B4 +:10CC800000000000000000000000000000000000A4 +:10CC90000000000000000000000000000000000094 +:10CCA0000000000000000000000000000000000084 +:10CCB0000000000000000000000000000000000074 +:10CCC0000000000000000000000000000000000064 +:10CCD0000000000000000000000000000000000054 +:10CCE0000000000000000002020202020201010135 +:10CCF000010001010101000000000001010101012A +:10CD0000010101010101010000000000000000001C +:10CD10000000000000000000000000000000000013 +:10CD20000000000000000000000000000000000003 +:10CD300000000000000000000000000000000000F3 +:10CD400000000000000000000000000000000000E3 +:10CD500000000000000000000000000000000000D3 +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000000000000000000B3 +:10CD800000000000000000000000000000000000A3 +:10CD90000000000000000000000000000000000093 +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000000000000000000073 +:10CDC0000000000000000000000000000000000063 +:10CDD0000000000000000000000000000000000053 +:10CDE0000000000000000002020202020201020133 +:10CDF0000101010101010000000001010101010127 +:10CE0000010101010101010000000000000000001B +:10CE10000000000000000000000000000000000012 +:10CE20000000000000000000000000000000000002 +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000000000000000000000000D2 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000092 +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0000000000000000000000000000000000052 +:10CEE0000000000000000002020202020202020131 +:10CEF0000101010101010000000101010101010125 +:10CF0000010101010101010000000000000000001A +:10CF10000000000000000000000000000000000011 +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000000000F1 +:10CF400000000000000000000000000000000000E1 +:10CF500000000000000000000000000000000000D1 +:10CF600000000000000000000000000000000000C1 +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000000000000000000071 +:10CFC0000000000000000000000000000000000061 +:10CFD0000000000000000000000000000000000051 +:10CFE000000000000000000202020202020202022F +:10CFF000020102020202000000010101010101011F +:10D000000101010101010100000000000000000019 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000000000000000000000E0 +:10D0500000000000000000000000000000000000D0 +:10D0600000000000000000000000000000000000C0 +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000000000000000000080 +:10D0B0000000000000000000000000000000000070 +:10D0C0000000000000000000000000000000000060 +:10D0D0000000000000000000000000000000000050 +:10D0E000000000000000000202020202020202022E +:10D0F000020202020202000001010101010101011C +:10D100000101010101010100000000000000000018 +:10D11000000000000000000000000000000000000F +:10D1200000000000000000000000000000000000FF +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000000000000000BF +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000004F +:10D1E000000000000000000202020202020202022D +:10D1F000020202020202000001010101010101011B +:10D200000101010101010100000000000000000017 +:10D21000000000000000000000000000000000000E +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE +:10D2700000000000000000000000000000000000AE +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C000000000000000000000000000000000005E +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000202020202020202022C +:10D2F000020202020202000001010101010101011A +:10D300000101010101010100000000000000000016 +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD +:10D3700000000000000000000000000000000000AD +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000202020202020202022B +:10D3F0000202020202020000010101010101010119 +:10D400000101010101010100000000000000000015 +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000202020202020202022A +:10D4F0000202020202020000010101010101010118 +:10D500000101010101010100000000000000000014 +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000000000000000000000004B +:10D5E0000000000000000002020202020202020229 +:10D5F000020202020202000000000000000000001F +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000F00000000000000001B +:10D700000000000000000000000000000001010017 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000000000000000C9 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000049 +:10D7E0000000000000000000000000000000000237 +:10D7F0000100000000000100000001000001000025 +:10D800000000000000000000000000000001010016 +:10D810000000000000000000000000000000000008 +:10D8200000000000000000000000000000000000F8 +:10D8300000000000000000000000000000000000E8 +:10D8400000000000000000000000000000000000D8 +:10D8500000000000000000000000000000000000C8 +:10D8600000000000000000000000000000000000B8 +:10D8700000000000000000000000000000000000A8 +:10D880000000000000000000000000000000000098 +:10D890000000000000000000000000000000000088 +:10D8A0000000000000000000000000000000000078 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000000000000000000000058 +:10D8D0000000000000000000000000000000000048 +:10D8E0000000000000000000000000000000000236 +:10D8F0000101010000000100010001000001000021 +:10D900000000000000000000000001010101010012 +:10D910000000000000000000000000000000000007 +:10D9200000000000000000000000000000000000F7 +:10D9300000000000000000000000000000000000E7 +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D9600000000000000000000000000000000000B7 +:10D9700000000000000000000000000000000000A7 +:10D980000000000000000000000000000000000097 +:10D990000000000000000000000000000000000087 +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000047 +:10D9E0000000000000000000000000000000000235 +:10D9F000020101000000010001000101000100001E +:10DA0000000000000000000001010101010101000F +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000000000000000000000F6 +:10DA300000000000000000000000000000000000E6 +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000000C6 +:10DA600000000000000000000000000000000000B6 +:10DA700000000000000000000000000000000000A6 +:10DA80000000000000000000000000000000000096 +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000000000000000000000000076 +:10DAB0000000000000000000000000000000000066 +:10DAC0000000000000000000000000000000000056 +:10DAD0000000000000000000000000000000000046 +:10DAE0000000000000000000000000000000000234 +:10DAF000020101000101010001010101000100001A +:10DB0000000000000000010101010101010101000C +:10DB10000000000000000000000000000000000005 +:10DB200000000000000000000000000000000000F5 +:10DB300000000000000000000000000000000000E5 +:10DB400000000000000000000000000000000000D5 +:10DB500000000000000000000000000000000000C5 +:10DB600000000000000000000000000000000000B5 +:10DB700000000000000000000000000000000000A5 +:10DB80000000000000000000000000000000000095 +:10DB90000000000000000000000000000000000085 +:10DBA0000000000000000000000000000000000075 +:10DBB0000000000000000000000000000000000065 +:10DBC0000000000000000000000000000000000055 +:10DBD0000000000000000000000000000000000045 +:10DBE0000000000000000000000000000000000233 +:10DBF0000202020001010101010101010101000015 +:10DC00000000000001010101010101010101010009 +:10DC10000000000000000000000000000000000004 +:10DC200000000000000000000000000000000000F4 +:10DC300000000000000000000000000000000000E4 +:10DC400000000000000000000000000000000000D4 +:10DC500000000000000000000000000000000000C4 +:10DC600000000000000000000000000000000000B4 +:10DC700000000000000000000000000000000000A4 +:10DC80000000000000000000000000000000000094 +:10DC90000000000000000000000000000000000084 +:10DCA0000000000000000000000000000000000074 +:10DCB0000000000000000000000000000000000064 +:10DCC0000000000000000000000000000000000054 +:10DCD0000000000000000000000000000000000044 +:10DCE0000000000000000000000000000000000232 +:10DCF0000202020101010201010101010101000012 +:10DD00000000000001010101010101010101010008 +:10DD10000000000000000000000000000000000003 +:10DD200000000000000000000000000000000000F3 +:10DD300000000000000000000000000000000000E3 +:10DD400000000000000000000000000000000000D3 +:10DD500000000000000000000000000000000000C3 +:10DD600000000000000000000000000000000000B3 +:10DD700000000000000000000000000000000000A3 +:10DD80000000000000000000000000000000000093 +:10DD90000000000000000000000000000000000083 +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 +:10DDC0000000000000000000000000000000000053 +:10DDD0000000000000000000000000000000000043 +:10DDE0000000000000000000000000000000000231 +:10DDF000020202020202020102010201010100000C +:10DE00000001010101010101010101010101010004 +:10DE10000000000000000000000000000000000002 +:10DE200000000000000000000000000000000000F2 +:10DE300000000000000000000000000000000000E2 +:10DE400000000000000000000000000000000000D2 +:10DE500000000000000000000000000000000000C2 +:10DE600000000000000000000000000000000000B2 +:10DE700000000000000000000000000000000000A2 +:10DE80000000000000000000000000000000000092 +:10DE90000000000000000000000000000000000082 +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC0000000000000000000000000000000000052 +:10DED0000000000000000000000000000000000042 +:10DEE0000000000000000000000000000000000230 +:10DEF0000202020202020202020202020102000007 +:10DF00000001010101010101010101010101010003 +:10DF10000000000000000000000000000000000001 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000000000000000000000000B1 +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000000000000000000000000091 +:10DF90000000000000000000000000000000000081 +:10DFA0000000000000000000000000000000000071 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000000000000000000000000051 +:10DFD0000000000000000000000000000000000041 +:10DFE000000000000000000000000000000000022F +:10DFF0000202020202020202020202020202000005 +:10E000000001010101010101010101010101010002 +:10E010000000000000000000000000000000000000 +:10E0200000000000000000000000000000000000F0 +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000000000000000000000C0 +:10E0600000000000000000000000000000000000B0 +:10E0700000000000000000000000000000000000A0 +:10E080000000000000000000000000000000000090 +:10E090000000000000000000000000000000000080 +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D0000000000000000000000000000000000040 +:10E0E000000000000000000000000000000000022E +:10E0F0000202020202020202020202020202000004 +:10E100000101010101010101010101010101010000 +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000000000000000009F +:10E18000000000000000000000000000000000008F +:10E19000000000000000000000000000000000007F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000000000000000000000003F +:10E1E000000000000000000000000000000000022D +:10E1F0000202020202020202020202020202000003 +:10E2000001010101010101010101010101010100FF +:10E2100000000000000000000000000000000000FE +:10E2200000000000000000000000000000000000EE +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E2600000000000000000000000000000000000AE +:10E27000000000000000000000000000000000009E +:10E28000000000000000000000000000000000008E +:10E29000000000000000000000000000000000007E +:10E2A000000000000000000000000000000000006E +:10E2B000000000000000000000000000000000005E +:10E2C000000000000000000000000000000000004E +:10E2D000000000000000000000000000000000003E +:10E2E000000000000000000000000000000000022C +:10E2F0000202020202020202020202020202000002 +:10E3000001010101010101010101010101010100FE +:10E3100000000000000000000000000000000000FD +:10E3200000000000000000000000000000000000ED +:10E3300000000000000000000000000000000000DD +:10E3400000000000000000000000000000000000CD +:10E3500000000000000000000000000000000000BD +:10E3600000000000000000000000000000000000AD +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D +:10E39000000000000000000000000000000000007D +:10E3A000000000000000000000000000000000006D +:10E3B000000000000000000000000000000000005D +:10E3C000000000000000000000000000000000004D +:10E3D000000000000000000000000000000000003D +:10E3E000000000000000000000000000000000022B +:10E3F0000202020202020202020202020202000001 +:10E4000001010101010101010101010101010100FD +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000000000009C +:10E48000000000000000000000000000000000008C +:10E49000000000000000000000000000000000007C +:10E4A000000000000000000000000000000000006C +:10E4B000000000000000000000000000000000005C +:10E4C000000000000000000000000000000000004C +:10E4D000000000000000000000000000000000003C +:10E4E000000000000000000000000000000000022A +:10E4F0000202020202020202020202020202000000 +:10E50000000000000000000000000000000000000B +:10E5100000000000000000000000000000000000FB +:10E5200000000000000000000000000000000000EB +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000000CB +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000000000000AB +:10E57000000000000000000000000000000000009B +:10E58000000000000000000000000000000000008B +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E000000000000000000000000000000000002B +:10E5F0000000000000000000000000000000000B10 +:10E60000000000000000000000000000000000000A +:10E6100000000000000001000000000000000000F9 +:10E6200000000000000000000000000000000000EA +:10E6300000000000000000000000000000000000DA +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E6600000000000000000000000000000000000AA +:10E67000000000000000000000000000000000009A +:10E68000000000000000000000000000000000008A +:10E69000000000000000000000000000000000007A +:10E6A000000000000000000000000000000000006A +:10E6B000000000000000000000000000000000005A +:10E6C000000000000000000000000000000000004A +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A +:10E6F0000000000000000002000001000000000017 +:10E700000000000000000000000000000000000009 +:10E7100000000000000101000000000000000000F7 +:10E7200000000000000000000000000000000000E9 +:10E7300000000000000000000000000000000000D9 +:10E7400000000000000000000000000000000000C9 +:10E7500000000000000000000000000000000000B9 +:10E7600000000000000000000000000000000000A9 +:10E770000000000000000000000000000000000099 +:10E780000000000000000000000000000000000089 +:10E790000000000000000000000000000000000079 +:10E7A0000000000000000000000000000000000069 +:10E7B0000000000000000000000000000000000059 +:10E7C0000000000000000000000000000000000049 +:10E7D0000000000000000000000000000000000039 +:10E7E0000000000000000000000000000000000029 +:10E7F0000000000000000002020101000000000013 +:10E800000000000000010000000000000000000007 +:10E8100000000101010101000000000000000000F3 +:10E8200000000000000000000000000000000000E8 +:10E8300000000000000000000000000000000000D8 +:10E8400000000000000000000000000000000000C8 +:10E8500000000000000000000000000000000000B8 +:10E8600000000000000000000000000000000000A8 +:10E870000000000000000000000000000000000098 +:10E880000000000000000000000000000000000088 +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000000000000000000000000000058 +:10E8C0000000000000000000000000000000000048 +:10E8D0000000000000000000000000000000000038 +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000000000002020202000000000010 +:10E900000000000000010000000000000000000105 +:10E9100001010101010101000000000000000000F0 +:10E9200000000000000000000000000000000000E7 +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000000A7 +:10E970000000000000000000000000000000000097 +:10E980000000000000000000000000000000000087 +:10E990000000000000000000000000000000000077 +:10E9A0000000000000000000000000000000000067 +:10E9B0000000000000000000000000000000000057 +:10E9C0000000000000000000000000000000000047 +:10E9D0000000000000000000000000000000000037 +:10E9E0000000000000000000000000000000000027 +:10E9F000000000000000000202020200000000000F +:10EA00000000000000010000000000000001010102 +:10EA100001010101010101000000000000000000EF +:10EA200000000000000000000000000000000000E6 +:10EA300000000000000000000000000000000000D6 +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000000000000000000096 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 +:10EAF000000000000000000202020202000101000A +:10EB000000000100000100000000000001010101FF +:10EB100001010101010101000000000000000000EE +:10EB200000000000000000000000000000000000E5 +:10EB300000000000000000000000000000000000D5 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000000000095 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000002020202020202020104 +:10EC000001000100000200000000010101010101FA +:10EC100001010101010101000000000000000000ED +:10EC200000000000000000000000000000000000E4 +:10EC300000000000000000000000000000000000D4 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000000A4 +:10EC70000000000000000000000000000000000094 +:10EC80000000000000000000000000000000000084 +:10EC90000000000000000000000000000000000074 +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000034 +:10ECE0000000000000000000000000000000000024 +:10ECF0000000000000000002020202020202020202 +:10ED000002000201000200000001010101010101F5 +:10ED100001010101010101000000000000000000EC +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000000000000000000000000B3 +:10ED600000000000000000000000000000000000A3 +:10ED70000000000000000000000000000000000093 +:10ED80000000000000000000000000000000000083 +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000002020202020202020201 +:10EE000002020202000200000001010101010101F1 +:10EE100001010101010101000000000000000000EB +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000092 +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000002020202020202020200 +:10EF000002020202020200000101010101010101ED +:10EF100001010101010101000000000000000000EA +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE0000000000000000000000000000000000021 +:10EFF00000000000000000020202020202020202FF +:10F0000002020202020200000000000000000000F4 +:10F0100000000000000000000000000000000000F0 +:10F0200000000000000000000000000000000000E0 +:10F0300000000000000000000000000000000000D0 +:10F0400000000000000000000000000000000000C0 +:10F0500000000000000000000000000000000000B0 +:10F0600000000000000000000000000000000000A0 +:10F070000000000000000000000000000000000090 +:10F080000000000000000000000000000000000080 +:10F090000000000000000000000000000000000070 +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D0000000000000000000000000000000000030 +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F10000000000000000000F0000000000000000F0 +:10F1100000000000000000000000000000000000EF +:10F1200000000000000000000000000000000000DF +:10F1300000000000000000000000000000000000CF +:10F1400000000000000000000000000000000000BF +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000000000009F +:10F17000000000000000000000000000000000008F +:10F18000000000000000000000000000000000007F +:10F19000000000000000000000000000000000006F +:10F1A000000000000000000000000000000000005F +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F +:10F1D000000000000000000000000000000000002F +:10F1E000000000000000000000000000000000001F +:10F1F000000000000000000000000000000000000F +:10F2000000010001000000000000000001000000FB +:10F2100000000000000000000000000000000000EE +:10F2200000000000000000000000000000000000DE +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000000000000000BE +:10F2500000000000000000000000000000000000AE +:10F26000000000000000000000000000000000009E +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000000000000007E +:10F29000000000000000000000000000000000006E +:10F2A000000000000000000000000000000000005E +:10F2B000000000000000000000000000000000004E +:10F2C000000000000000000000000000000000003E +:10F2D000000000000000000000000000000000002E +:10F2E000000000000000000000000000000000001E +:10F2F000000000000000000000000000000000000E +:10F3000000010001000000000001000001000000F9 +:10F3100000000000000000000000000000000000ED +:10F3200000000000000000000000000000000000DD +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F36000000000000000000000000000000000009D +:10F37000000000000000000000000000000000008D +:10F38000000000000000000000000000000000007D +:10F39000000000000000000000000000000000006D +:10F3A000000000000000000000000000000000005D +:10F3B000000000000000000000000000000000004D +:10F3C000000000000000000000000000000000003D +:10F3D000000000000000000000000000000000002D +:10F3E000000000000000000000000000000000001D +:10F3F000000000000000000000000000000000000D +:10F4000000010001000000000001000001000000F8 +:10F4100000000000000000000000000000000000EC +:10F4200000000000000000000000000000000000DC +:10F4300000000000000000000000000000000000CC +:10F4400000000000000000000000000000000000BC +:10F4500000000000000000000000000000000000AC +:10F46000000000000000000000000000000000009C +:10F47000000000000000000000000000000000008C +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B000000000000000000000000000000000004C +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000010001000000000001000001000000F7 +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B000000000000000000000000000000000004B +:10F5C000000000000000000000000000000000003B +:10F5D000000000000000000000000000000000002B +:10F5E000000000000000000000000000000000001B +:10F5F000000000000000000000000000000000000B +:10F6000001010001000000000001000001000000F5 +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F6400000000000000000000000000000000000BA +:10F6500000000000000000000000000000000000AA +:10F66000000000000000000000000000000000009A +:10F67000000000000000000000000000000000008A +:10F68000000000000000000000000000000000007A +:10F69000000000000000000000000000000000006A +:10F6A000000000000000000000000000000000005A +:10F6B000000000000000000000000000000000004A +:10F6C000000000000000000000000000000000003A +:10F6D000000000000000000000000000000000002A +:10F6E000000000000000000000000000000000001A +:10F6F000000000000000000000000000000000000A +:10F7000001020002000000000001000001000000F2 +:10F7100000000000000000000000000001000100E7 +:10F7200000000000000000000000000000000000D9 +:10F7300000000000000000000000000000000000C9 +:10F7400000000000000000000000000000000000B9 +:10F7500000000000000000000000000000000000A9 +:10F760000000000000000000000000000000000099 +:10F770000000000000000000000000000000000089 +:10F780000000000000000000000000000000000079 +:10F790000000000000000000000000000000000069 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C0000000000000000000000000000000000039 +:10F7D0000000000000000000000000000000000029 +:10F7E0000000000000000000000000000000000019 +:10F7F0000000000000000000000000000000000207 +:10F8000002020102000000000001010001000000EE +:10F8100000000000000000000001000101010100E3 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 +:10F8400000000000000000000000000000000000B8 +:10F8500000000000000000000000000000000000A8 +:10F860000000000000000000000000000000000098 +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000000000000000078 +:10F890000000000000000000000000000000000068 +:10F8A0000000000000000000000000000000000058 +:10F8B0000000000000000000000000000000000048 +:10F8C0000000000000000000000000000000000038 +:10F8D0000000000000000000000000000000000028 +:10F8E0000000000000000000000000000000000018 +:10F8F0000000000000000000000000000000000206 +:10F9000002020202010202010102010102000000E2 +:10F9100000000000000000000001010101010100E1 +:10F9200000000000000000000000000000000000D7 +:10F9300000000000000000000000000000000000C7 +:10F9400000000000000000000000000000000000B7 +:10F9500000000000000000000000000000000000A7 +:10F960000000000000000000000000000000000097 +:10F970000000000000000000000000000000000087 +:10F980000000000000000000000000000000000077 +:10F990000000000000000000000000000000000067 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000000000000000037 +:10F9D0000000000000000000000000000000000027 +:10F9E0000000000000000000000000000000000017 +:10F9F0000000000000000000000000000000000205 +:10FA000002020202020202020102010102000000DF +:10FA100000000000000000000101010101010100DF +:10FA200000000000000000000000000000000000D6 +:10FA300000000000000000000000000000000000C6 +:10FA400000000000000000000000000000000000B6 +:10FA500000000000000000000000000000000000A6 +:10FA60000000000000000000000000000000000096 +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000000000000000076 +:10FA90000000000000000000000000000000000066 +:10FAA0000000000000000000000000000000000056 +:10FAB0000000000000000000000000000000000046 +:10FAC0000000000000000000000000000000000036 +:10FAD0000000000000000000000000000000000026 +:10FAE0000000000000000000000000000000000016 +:10FAF0000000000000000000000000000000000204 +:10FB000002020202020202020202020102010000DB +:10FB100000010001000000000101010101010100DC +:10FB200000000000000000000000000000000000D5 +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000000000000000B5 +:10FB500000000000000000000000000000000000A5 +:10FB60000000000000000000000000000000000095 +:10FB70000000000000000000000000000000000085 +:10FB80000000000000000000000000000000000075 +:10FB90000000000000000000000000000000000065 +:10FBA0000000000000000000000000000000000055 +:10FBB0000000000000000000000000000000000045 +:10FBC0000000000000000000000000000000000035 +:10FBD0000000000000000000000000000000000025 +:10FBE0000000000000000000000000000000000015 +:10FBF0000000000000000000000000000000000203 +:10FC000002020202020202020202020202010000D9 +:10FC100000010001010000010101010101010100D9 +:10FC200000000000000000000000000000000000D4 +:10FC300000000000000000000000000000000000C4 +:10FC400000000000000000000000000000000000B4 +:10FC500000000000000000000000000000000000A4 +:10FC60000000000000000000000000000000000094 +:10FC70000000000000000000000000000000000084 +:10FC80000000000000000000000000000000000074 +:10FC90000000000000000000000000000000000064 +:10FCA0000000000000000000000000000000000054 +:10FCB0000000000000000000000000000000000044 +:10FCC0000000000000000000000000000000000034 +:10FCD0000000000000000000000000000000000024 +:10FCE0000000000000000000000000000000000014 +:10FCF0000000000000000000000000000000000202 +:10FD000002020202020202020202020202020000D7 +:10FD100001010101010000010101010101010100D6 +:10FD200000000000000000000000000000000000D3 +:10FD300000000000000000000000000000000000C3 +:10FD400000000000000000000000000000000000B3 +:10FD500000000000000000000000000000000000A3 +:10FD60000000000000000000000000000000000093 +:10FD70000000000000000000000000000000000083 +:10FD80000000000000000000000000000000000073 +:10FD90000000000000000000000000000000000063 +:10FDA0000000000000000000000000000000000053 +:10FDB0000000000000000000000000000000000043 +:10FDC0000000000000000000000000000000000033 +:10FDD0000000000000000000000000000000000023 +:10FDE0000000000000000000000000000000000013 +:10FDF0000000000000000000000000000000000201 +:10FE000002020202020202020202020202020000D6 +:10FE100001010101010101010101010101010100D3 +:10FE200000000000000000000000000000000000D2 +:10FE300000000000000000000000000000000000C2 +:10FE400000000000000000000000000000000000B2 +:10FE500000000000000000000000000000000000A2 +:10FE60000000000000000000000000000000000092 +:10FE70000000000000000000000000000000000082 +:10FE80000000000000000000000000000000000072 +:10FE90000000000000000000000000000000000062 +:10FEA0000000000000000000000000000000000052 +:10FEB0000000000000000000000000000000000042 +:10FEC0000000000000000000000000000000000032 +:10FED0000000000000000000000000000000000022 +:10FEE0000000000000000000000000000000000012 +:10FEF0000000000000000000000000000000000200 +:10FF000002020202020202020202020202020000D5 +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000000000000000000000000D1 +:10FF300000000000000000000000000000000000C1 +:10FF400000000000000000000000000000000000B1 +:10FF500000000000000000000000000000000000A1 +:10FF60000000000000000000000000000000000091 +:10FF70000000000000000000000000000000000081 +:10FF80000000000000000000000000000000000071 +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 +:10FFB0000000000000000000000000000000000041 +:10FFC0000000000000000000000000000000000031 +:10FFD0000000000000000000000000000000000021 +:10FFE0000000000000000000000000000000000011 +:10FFF0000000000000000000000000000000000001 +:0200000260009C +:1000000000000000000000000000000000000009E7 +:1000100000000000000000000000000000000000E0 +:1000200000000000000101000000000000000000CE +:1000300000000000000000000000000000000000C0 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:1001000000000000000000020100010000000000EB +:1001100000000101000100000000000000000000DC +:1001200000000000010101000000000000000000CC +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:1002000000000000000000020202020101010201E0 +:1002100001010101010100000000000000000000D8 +:1002200000000001010101000000000000000000CA +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000000000000000000FE +:1003000000000000000000020202020202020202DB +:1003100002010201010100000000000000000000D5 +:1003200000010001010101000000000000000000C8 +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E000000000000000000000000000000000000D +:1003F00000000000000000000000000000000000FD +:1004000000000000000000020202020202020202DA +:1004100002020202010100000000000000000000D2 +:1004200000010101010101000000000000000000C6 +:1004300000000000000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:1005000000000000000000020202020202020202D9 +:1005100002020202020200000000000101010001CB +:1005200001010101010101000000000000000000C4 +:1005300000000000000000000000000000000000BB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000000000000000003B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:1006000000000000000000020202020202020202D8 +:1006100002020202020200000100010101010001C8 +:1006200001010101010101000000000000000000C3 +:1006300000000000000000000000000000000000BA +:1006400000000000000000000000000000000000AA +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:10068000000000000000000000000000000000006A +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C000000000000000000000000000000000002A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000000000000FA +:1007000000000000000000020202020202020202D7 +:1007100002020202020200000101010101010101C5 +:1007200001010101010101000000000000000000C2 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000020202020202020202D6 +:1008100002020202020200000000000000000000CC +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000000B8 +:1008400000000000000000000000000000000000A8 +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:100890000000000000000000000000000000000058 +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000000000000000000028 +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:1009100000000000000000090000000000000000CE +:1009200000000000000000000000000000000100C6 +:1009300000000000000000000000000000000000B7 +:1009400000000000000000000000000000000000A7 +:100950000000000000000000000000000000000097 +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000002E4 +:100A100000000100000101000000010000000000D2 +:100A200000000000000000000100000000000100C4 +:100A300000000000000000000000000000000000B6 +:100A400000000000000000000000000000000000A6 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA0000000000000000000000000000000000046 +:100AB0000000000000000000000000000000000036 +:100AC0000000000000000000000000000000000026 +:100AD0000000000000000000000000000000000016 +:100AE0000000000000000000000000000000000006 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000002E3 +:100B100002010201000101000101010000000000CA +:100B200000000000000001000100000000010100C1 +:100B300000000000000000000000000000000000B5 +:100B400000000000000000000000000000000000A5 +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA0000000000000000000000000000000000045 +:100BB0000000000000000000000000000000000035 +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000000015 +:100BE0000000000000000000000000000000000005 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000002E2 +:100C100002020202020201000101020000010000C2 +:100C200000000000000001010101000001010100BD +:100C300000000000000000000000000000000000B4 +:100C400000000000000000000000000000000000A4 +:100C50000000000000000000000000000000000094 +:100C60000000000000000000000000000000000084 +:100C70000000000000000000000000000000000074 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA0000000000000000000000000000000000044 +:100CB0000000000000000000000000000000000034 +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000000000000000000000014 +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000000000000000000000F4 +:100D000000000000000000000000000000000002E1 +:100D100002020202020202010102020001010000BD +:100D200000000000000101010101010101010100B9 +:100D300000000000000000000000000000000000B3 +:100D400000000000000000000000000000000000A3 +:100D50000000000000000000000000000000000093 +:100D60000000000000000000000000000000000083 +:100D70000000000000000000000000000000000073 +:100D80000000000000000000000000000000000063 +:100D90000000000000000000000000000000000053 +:100DA0000000000000000000000000000000000043 +:100DB0000000000000000000000000000000000033 +:100DC0000000000000000000000000000000000023 +:100DD0000000000000000000000000000000000013 +:100DE0000000000000000000000000000000000003 +:100DF00000000000000000000000000000000000F3 +:100E000000000000000000000000000000000002E0 +:100E100002020202020202020202020202020000B6 +:100E200000010001000101010101010101010100B6 +:100E300000000000000000000000000000000000B2 +:100E400000000000000000000000000000000000A2 +:100E50000000000000000000000000000000000092 +:100E60000000000000000000000000000000000082 +:100E70000000000000000000000000000000000072 +:100E80000000000000000000000000000000000062 +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000000000000042 +:100EB0000000000000000000000000000000000032 +:100EC0000000000000000000000000000000000022 +:100ED0000000000000000000000000000000000012 +:100EE0000000000000000000000000000000000002 +:100EF00000000000000000000000000000000000F2 +:100F000000000000000000000000000000000002DF +:100F100002020202020202020202020202020000B5 +:100F200000010101010101010101010101010100B3 +:100F300000000000000000000000000000000000B1 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000000000000000000000091 +:100F60000000000000000000000000000000000081 +:100F70000000000000000000000000000000000071 +:100F80000000000000000000000000000000000061 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000000041 +:100FB0000000000000000000000000000000000031 +:100FC0000000000000000000000000000000000021 +:100FD0000000000000000000000000000000000011 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000000F1 +:1010000000000000000000000000000000000002DE +:1010100002020202020202020202020202020000B4 +:1010200001010101010101010101010101010100B1 +:1010300000000000000000000000000000000000B0 +:1010400000000000000000000000000000000000A0 +:101050000000000000000000000000000000000090 +:101060000000000000000000000000000000000080 +:101070000000000000000000000000000000000070 +:101080000000000000000000000000000000000060 +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D0000000000000000000000000000000000010 +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000000000000000000002DD +:1011100002020202020202020202020202020000B3 +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000000000009F +:10115000000000000000000000000000000000008F +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F +:10118000000000000000000000000000000000005F +:10119000000000000000000000000000000000004F +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000000000000000000FF +:1011F00000000000000000000000000000000000EF +:1012000000000000000000000000000000000000DE +:10121000000000000000000000000000000000507E +:101220001206000000000058620600000000006086 +:10123000AC06000000000068EE0600000000007030 +:1012400031070000000000787107000000000080F6 +:10125000AC07000000000088DF07000000000090DD +:10126000100800000000009841080000000000A0E5 +:1012700072080000000000A8A3080000000000B0F1 +:10128000D4080000000000B805090000000000506C +:10129000000000000000000000000001000000004D +:1012A000000000010100000000000000000000003C +:1012B000000000000000010000000000000000002D +:1012C000000000000000000000000000000000011D +:1012D000000000000000000000000000000000010D +:1012E00000000000000000000000000000000000FE +:1012F00000000000000000000000000000010000ED +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD +:1013200000000000000000000000000000000000BD +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000000000010000000000000000007C +:10137000000000000000000000000000000000006D +:10138000000000000000000000000000000000005D +:10139000000000000000000000010001000000004B +:1013A000000000010100000000000000000000003B +:1013B000000100000000010000000000000000002B +:1013C000000000000000000000000000000000011C +:1013D000000000000000010000000000000000010B +:1013E00001000000000000000000000000000000FC +:1013F00000000000000100000000000000010000EB +:1014000000000000000000000000000000000000DC +:1014100000000000000000000000000000000000CC +:1014200000000000000000000000000000000000BC +:1014300000000000000000000000000000000000AC +:10144000000000000000000000000000000000009C +:10145000000000000000000000000000000000008C +:10146000000000000000010000000000000000007B +:10147000000000000000000000000000000000006C +:10148000000000000000000000000000000000005C +:101490000000000000000000000101010000010048 +:1014A000000000010100000000000000000000003A +:1014B000000100000000010000000000000000002A +:1014C000000000000000010000000000000000011A +:1014D000000000000000010000000000000000010A +:1014E00001000000000000000000000001010000F9 +:1014F00000000000000100000000000000010000EA +:1015000000000000000000000000000000000000DB +:1015100000000000000000000000000000000000CB +:1015200000000000000100000000000000000000BA +:1015300000000000000000000000000000000000AB +:101540000000000000000000010100000000000099 +:10155000000000000000000000000000000000008B +:10156000000000000000010000000000000000007A +:10157000000000000000010000000000000000006A +:10158000000000000000000000000000000000005B +:101590000000000000000000000101010100010046 +:1015A0000000000101000000000000000000000039 +:1015B0000001000000000100000000000001000028 +:1015C0000000000000000100000000000000000119 +:1015D0000100010000000100000000000000000107 +:1015E00001000000000000000000000101010000F7 +:1015F00000000000000100000000000000010100E8 +:1016000000000000000100000000000000000000D9 +:1016100000000000000000000000000000000000CA +:1016200000000000000100000000000000000000B9 +:1016300000000000000000000000000000000000AA +:101640000000000000000000010101000000000097 +:101650000000000001000000000000000000000089 +:101660000000000000000100000000000000000079 +:101670000000000000000100000000000000000069 +:10168000000000000000000000000000000000005A +:101690000001000000000000000101010100010044 +:1016A0000000010101000000000000010000000036 +:1016B0000001000000000100000001000001000026 +:1016C0000000000000000100000000000000000118 +:1016D0000100010000000100000000000000000106 +:1016E00001000000000000000000000101010000F6 +:1016F00000010000000100000000000000010101E5 +:1017000000000000000100000000000000000000D8 +:1017100000000000000000000000000000000000C9 +:1017200000000000000100000000000000000000B8 +:1017300000000000000000000000000000000000A9 +:101740000000000000000000010101000000000096 +:101750000000000001000000000000000000000088 +:101760000000000000000100000000000000000078 +:101770000000000000000100000000000000000068 +:101780000000000000000000000000000000000059 +:101790000001010000000001010101010100010040 +:1017A0000000010101000001010100010000000032 +:1017B0000001000000000100000001000101000024 +:1017C0000000000000000100000000000000010116 +:1017D0000100010000000100000000000000000105 +:1017E00001000000000000000000000101010100F4 +:1017F00001010101000100000000000000010101E1 +:1018000000000000000100000000000000000000D7 +:1018100000000000000000000000000000000000C8 +:1018200000000000000100000000000000000000B7 +:1018300000000000000000000000000000000000A8 +:101840000000000000000000010101010000000094 +:101850000000000001000100000000000000000185 +:101860000000000000000100000000000000000077 +:101870000000000000000100000000000000000067 +:101880000000000000000000000000000000000058 +:10189000000101000000000101010101010001003F +:1018A0000000010101000001010100010000000031 +:1018B0000001000100000100000001000101010021 +:1018C0000100000000000100000000000000010114 +:1018D0000100010000000100000000000100000103 +:1018E00001000000000000000000000101010101F2 +:1018F00001010101000100000000000000010101E0 +:1019000000000000000100000000000000000000D6 +:1019100000000000000000000000000000000000C7 +:1019200000000000000100000000000000000000B6 +:1019300000000000000000000000000000000000A7 +:101940000000000000010001010101010000000091 +:101950000000000001000100000000000000000184 +:101960000000000000000100000000000000000076 +:101970000000000000010100000000000000000065 +:101980000000000000000000000000000000000057 +:10199000010101010100000101010101010001003B +:1019A0000000010101000001010100010000000030 +:1019B000000100010000010100000100010101001F +:1019C0000100000000000100000000000000010113 +:1019D0000100010000000100000000000100000102 +:1019E00001000000000000000000000101010101F1 +:1019F00001010101000100000000000000010101DF +:101A000000000001000100000000000000000000D4 +:101A100000000000000100000000000000000000C5 +:101A200000000000000100000000000000000000B5 +:101A300000000000000000000000000000000000A6 +:101A4000000100000001000101010101000000008F +:101A50000000000001000100000000000000000183 +:101A60000000000000000100000000000000000075 +:101A70000001000000010100000000000000000063 +:101A80000000000000000000000000000101000153 +:101A9000010101010100000101010101010001003A +:101AA000000001010100000101010001000000002F +:101AB000000100010100010100000100010101001D +:101AC0000100000000000100000100000000010111 +:101AD0000100010000000101000000000100000100 +:101AE00001000000000000000000000101010101F0 +:101AF00001010101000100000000000001010101DD +:101B000000000001000100000000000000000000D3 +:101B100000000000000100000000000000000000C4 +:101B200000000000010100000000000000000000B3 +:101B300000000000000100000000000000000000A4 +:101B4000010101000001000101010101010100008A +:101B50000000000001000100000000000000000182 +:101B60000100000000000100000000000000000073 +:101B7000010101000101010000000000000000005F +:101B8000000000000000000000000101010101014F +:101B90000101010101000001010101010100010138 +:101BA000000001010100000101010001000000002E +:101BB000000100010100010101010100010101001A +:101BC0000100000000000100000100000000010110 +:101BD00001000100000101010000000001000001FE +:101BE00001000000000000000000000101010101EF +:101BF00001010101000100000000000001010101DC +:101C000000000101010100000000000000000000D0 +:101C100001000000000100000100000000000001C0 +:101C200000000000010100000000000000000000B2 +:101C300000000000000100000101000001000000A0 +:101C40000101010000010001010101010101010088 +:101C50000000000001010100000000000000000180 +:101C60000100000000000100000000000000000072 +:101C7000010101000101010000000000000000005E +:101C8000000000000000000000000101010101014E +:101C90000101010101000001010101010100010137 +:101CA000010001010100000101010001000000002C +:101CB0000101010101000101010101000101010017 +:101CC000010000000000010001010000000001010E +:101CD00001010100000101010000000001000001FC +:101CE00001000000000000000000000101010101EE +:101CF00001010101000100000000000001010101DB +:101D000000000101010100000000000000000000CF +:101D100001010000000100000100000000000001BE +:101D200000000000010101000000000000000000B0 +:101D3000000000000001000001010100010000009E +:101D40000101010000010001010101010101010186 +:101D5000000100000101010000000000000000017E +:101D60000100000001000100000000000000000070 +:101D7000010101000101010000000000000000005D +:101D8000000000000000000000000101010101014D +:101D90000101010101000001010101010101010135 +:101DA0000101010101000001010100010100000029 +:101DB0000101010101000101010101000101010016 +:101DC000010000000000010001010000000001010D +:101DD00001010101000101010000000001000001FA +:101DE00001000100010000000000000101010101EB +:101DF00001010101010100000000010001010101D8 +:101E000000000101010100000000000000000000CE +:101E100001010000000101000101000000000001BB +:101E200000000000010101000000000000000000AF +:101E3000000000000001000001010100010100009C +:101E40000101010000010001010101010101010185 +:101E5000010101010101010000000000000000017A +:101E6000010000000100010000000000000000006F +:101E7000010101000101010000000000000000005C +:101E8000000000000000000000000101010101014C +:101E90000101010101000001010201020101010132 +:101EA0000101010101000002020100020100000025 +:101EB0000101010101000101010101010101010014 +:101EC000010000000000010101010000000101010A +:101ED00001010101000101010000000001010001F8 +:101EE00001000100010000000000000101010101EA +:101EF00001010101010100000000010001010101D7 +:101F000000000101010100000000000000010000CC +:101F100001010000000101000101000000000001BA +:101F200001000001010101000000010100000000AA +:101F3000000000000001000001010100010100009B +:101F40000101010001010101010101010101010182 +:101F50000101010101010100000000000000000179 +:101F6000010000000100010000000000000000006E +:101F7000010101000101010000000000000000005B +:101F8000000100000000000000000101010101014A +:101F90000101010101000001010202020101010130 +:101FA0000101010101000002020200020100000023 +:101FB0000101010101000101010102010101010111 +:101FC0000101000000000101010101000001010107 +:101FD00001010101000101010000000101010001F6 +:101FE00001000100010000000000000101010101E9 +:101FF00001010101010100000000010001010101D6 +:1020000000000101010100000000000000010000CB +:1020100001010000010101000101000000000001B8 +:1020200001010001010101000000010100000000A8 +:102030000000000000010000010101000101000199 +:102040000101010001010101010101010101010181 +:102050000101010101010101000000000001000176 +:10206000010000000100010000000000000100006C +:10207000010101000101010000000000000000005A +:102080000001010101000000000001010101010146 +:10209000010101010100000202020202010101012D +:1020A0000101010101000002020201020100000021 +:1020B000010201010101010201010201010201010C +:1020C0000101000100000101010101000001010105 +:1020D00001010101000101010000000101010001F5 +:1020E00001000100010000000001000101010101E7 +:1020F00001010101010100000000010001010101D5 +:1021000000000101010100000000000000010000CA +:1021100001010000010101000101000100000001B6 +:1021200001010101010101000000010100000000A6 +:102130000000000000010000010101000101010197 +:102140000101010001010101010101010101010180 +:102150000101010101010101000000000001010174 +:10216000010000000100010000000000000100006B +:102170000101010001010100000000000000000059 +:102180000001010101000000000001010101010145 +:10219000010101010100000202020202020102012A +:1021A000010101010100000202020102010100011E +:1021B0000102010101010102020102010202010109 +:1021C0000101000100000101010101000001010203 +:1021D00001010101000101010000000101010101F3 +:1021E00001000100010001000001010101010101E4 +:1021F00001010101010101000000010001010101D3 +:1022000000000101010100000000000000010100C8 +:1022100001010100010101000101000101000001B3 +:1022200001010101010101000101010101000000A2 +:102230000000000000010000010101000101010196 +:10224000010101000101010101010101010101017F +:102250000101010101010101010100000001010171 +:10226000010000000100010000000000000100006A +:102270000101010001010100000000000000000058 +:102280000001010101000000000001010101010144 +:102290000101010101000002020202020201020129 +:1022A000010101010100000202020102010100011D +:1022B0000102010101010102020202010202020106 +:1022C0000101010100000101010101000101010200 +:1022D00001010101000101010000000101010101F2 +:1022E00001010100010001000001010101010101E2 +:1022F00001010101010101010100010001010101D0 +:1023000000000101010100000000000001010101C5 +:1023100001010100010101000101010101000001B1 +:1023200001010101010101000101010101000000A1 +:102330000000000000010000010101010101010194 +:10234000010101010101010101010101010101017D +:10235000010101010101010101010100000101016F +:102360000100000001000100000000000001010068 +:102370000101010101010100000100000000000055 +:102380000001010101000000000001010101010143 +:102390000101010101000002020202020201020128 +:1023A000010101010100000202020102020100011B +:1023B0000102010201010102020202010202020104 +:1023C00002010101000001010202010001010202FB +:1023D00002010101010101020000000101010102ED +:1023E00001010101010001000001010201010101DF +:1023F00001010101010101010100010001010101CF +:1024000000000101010101000000000001010101C3 +:1024100001010101010101000101010101010001AE +:10242000010101010101010001010101010100019E +:102430000000000000010000010101010101010193 +:10244000010101010101010101010101010101017C +:10245000010101010101010101010100000101016E +:102460000100000001000101010100000001010064 +:102470000101010101010100000101000000000053 +:102480000001010101000000000001010101010142 +:102490000101010101000002020202020201020127 +:1024A0000101010201000002020202020201010117 +:1024B0000202010201010102020202020202020101 +:1024C00002010101000001010202010001010202FA +:1024D00002010201010101020100000102010102E9 +:1024E00002010101010001000001010202010101DC +:1024F00001010101010101010101010001020101CC +:1025000000010101010101000001000001010101C0 +:1025100001010101010101000101010101010101AC +:10252000010101010101010001010101010100019D +:102530000000000000010000010101010101010192 +:10254000010101010101010101010101010101017B +:10255000010101010101010101010101000101016C +:102560000100010101000101010101000001010060 +:102570000101010101010100010101000000000051 +:102580000001010101000000000001010101010141 +:102590000101010101000002020202020201020126 +:1025A0000101020202000002020202020201010114 +:1025B00002020202020102020202020202020201FD +:1025C00002010101000001020202010101010202F7 +:1025D00002010201010101020100010102010102E7 +:1025E00002010101010001000001010202020101DA +:1025F00001010101010101010101010001020101CB +:1026000001010101010101000001010001010101BD +:1026100001010101010101000101010101010101AB +:10262000010101010101010101010101010100019B +:102630000001000000010000010101010101010190 +:10264000010101010101010101010101010101017A +:10265000010101010101010101010101010101016A +:10266000010001010100010101010100000101005F +:10267000010101010101010001010101000000004F +:102680000001010101000000000001010101010140 +:102690000101010101000002020202020202020223 +:1026A0000101020202010002020202020202010111 +:1026B00002020202020102020202020202020201FC +:1026C00002010101010001020202020101010202F4 +:1026D00002010201010101020101010102010102E5 +:1026E00002010101010001010101010202020101D7 +:1026F00001010101010101010101010001020201C9 +:1027000001010101010101000001010001010101BC +:1027100001010101010101000101010101010101AA +:10272000010101010101010101010101010100019A +:10273000010100000001010001010101010101018D +:102740000101010101010101020101010101010178 +:102750000101010101010101010101010101010169 +:10276000010001010100010101010101000101005D +:10277000010101010101010001010101010100004C +:10278000000101010100000000000101010101013F +:102790000101010101000002020202020202020222 +:1027A000020102020201000202020202020201020E +:1027B00002020202020102020202020202020202FA +:1027C00002010101010001020202020101020202F2 +:1027D00002010201010101020101010202010102E3 +:1027E00002010101010001010101010202020201D5 +:1027F00001010101010101010101010101020201C7 +:1028000001010101010101000001010101010101BA +:1028100001010101010101010101010101010101A8 +:102820000101010101010101010101010101000199 +:10283000010100000001010101010101010101018B +:102840000101010101010101020201010101010176 +:102850000101010101010101010101010101010168 +:10286000010001010100010101010101010101005B +:10287000010101010101010001010101010100004B +:10288000000101010101010000000101010101013C +:102890000101010101000002020202020202020221 +:1028A000020102020201000202020202020202020C +:1028B00002020202020102020202020202020202F9 +:1028C00002020101010002020202020101020202EF +:1028D00002020201010101020101010202020102E0 +:1028E00002010101010001010101010202020201D4 +:1028F00002010101010101010101020102020202C2 +:1029000001010101010101000001010101010101B9 +:1029100001010101010101010101010101010101A7 +:102920000101010101010101010101010101000198 +:102930000101010101010101010101010101010187 +:102940000101010101010102020202010101010173 +:102950000101010101010101010101010101010167 +:10296000010001010100010101010101010101005A +:102970000101010101010100010101010101000149 +:10298000000101010101010000000101010101013B +:10299000010101010101010202020202020202021E +:1029A000020202020201000202020202020202020A +:1029B00002020202020102020202020202020202F8 +:1029C00002020102010002020202020102020202EC +:1029D00002020202010102020201010202020102DC +:1029E00002010101010001010102010202020202D1 +:1029F00002020101010101010101020102020202C0 +:102A000001010101010101000001010101010101B8 +:102A100001010101010101010201010101010101A5 +:102A20000101010101010101010101010101000197 +:102A30000101010101010101010101010101010186 +:102A40000101010101010102020202010101010172 +:102A50000101010101010101010101010101010166 +:102A60000101010101000101010101010101010157 +:102A70000101010101010100010101010101010147 +:102A80000101010101010100010101010101010137 +:102A9000010101010101010202020202020202021D +:102AA0000202020202010002020202020202020209 +:102AB00002020202020202020202020202020202F6 +:102AC00002020202010102020202020202020202E8 +:102AD00002020202010102020201020202020202D9 +:102AE00002010201010001010102020202020202CE +:102AF00002020201010101020201020102020202BC +:102B000001010101010101010101010101010101B5 +:102B100001010101010101010201010101010101A4 +:102B20000101010101010101010101010101010195 +:102B30000101010101010101020101010101010184 +:102B40000101010101010102020202020101010170 +:102B50000101010101010101010101010101010165 +:102B60000101010101010101010101010101010155 +:102B70000101010101010101010101010101010145 +:102B80000101010101010100010101010101010136 +:102B9000010101010101010202020202020202021C +:102BA0000202020202010002020202020202020208 +:102BB00002020202020202020202020202020202F5 +:102BC00002020202010102020202020202020202E7 +:102BD00002020202010102020202020202020202D7 +:102BE00002010201010101010102020202020202CC +:102BF00002020202010101020201020102020202BA +:102C000001010101010101010101010101020101B3 +:102C100002010101010101010202010101010101A1 +:102C20000101010101010101010102010101010193 +:102C30000101010101010101020201010101010182 +:102C4000010101010101010202020202010101016F +:102C50000101010101010101010101010101010164 +:102C60000101010101010101010101010101010154 +:102C70000101010101010101010101010101010144 +:102C80000101010101010100010102010101010134 +:102C9000010101010101010202020202020202021B +:102CA0000202020202010002020202020202020207 +:102CB00002020202020202020202020202020202F4 +:102CC00002020202010102020202020202020202E6 +:102CD00002020202010202020202020202020202D5 +:102CE00002010201020101020202020202020202C8 +:102CF00002020202010101020202020102020202B8 +:102D000001010101010101010102010101020101B1 +:102D100002010101010101010202010101010101A0 +:102D20000101010101010101020102020101010190 +:102D30000101010101010101020202010101010180 +:102D4000010101010101010202020202010101016E +:102D50000101010101010102010101010101010162 +:102D60000101010101010101010101010101010153 +:102D70000101010101010101010101010101010143 +:102D80000101010101010100010102020101010132 +:102D9000010101010101010202020202020202021A +:102DA0000202020202010002020202020202020206 +:102DB00002020202020202020202020202020202F3 +:102DC00002020202020102020202020202020202E4 +:102DD00002020202020202020202020202020202D3 +:102DE00002020201020101020202020202020202C6 +:102DF00002020202010201020202020102020202B6 +:102E000001010202010101010102020102020201AB +:102E1000020201010101010102020102010101019D +:102E2000010101010101010102020202010101018E +:102E3000010101010101010102020201020101017E +:102E4000010101010101010202020202020101016C +:102E5000010101010101010202010101010101025F +:102E60000101010101010101010101010101010152 +:102E70000101010101010101010101010101010142 +:102E80000101010101010100010102020201010130 +:102E90000101010101010102020202020202020219 +:102EA0000202020202010002020202020202020205 +:102EB00002020202020202020202020202020202F2 +:102EC00002020202020102020202020202020202E3 +:102ED00002020202020202020202020202020202D2 +:102EE00002020202020101020202020202020202C4 +:102EF00002020202010201020202020102020202B5 +:102F000001010202010101010102020102020201AA +:102F1000020201010101010102020202010101029A +:102F2000010101010101010202020202010101018C +:102F3000010101010101010102020201020101017D +:102F4000010101010101010202020202020201016A +:102F5000010101010101010202020101010101025D +:102F60000101010101010101010101010101010151 +:102F70000101010101010101010101010101010141 +:102F8000010101010101010001010202020201012E +:102F90000101010101010102020202020202020218 +:102FA0000202020202010002020202020202020204 +:102FB00002020202020202020202020202020202F1 +:102FC00002020202020102020202020202020202E2 +:102FD00002020202020202020202020202020202D1 +:102FE00002020202020101020202020202020202C3 +:102FF00002020202020201020202020202020202B2 +:1030000001010202020201020202020202020202A3 +:103010000202010101010101020202020201010298 +:10302000010101010101010202020202020101018A +:10303000010101010101010102020201020201017B +:103040000201010101010102020202020202020167 +:10305000010101010101010202020201010101025B +:10306000020101010101010202010101010101014D +:10307000010101010101010102020101010101013E +:10308000010101010101010001010202020202012C +:103090000101010101010102020202020202020217 +:1030A0000202020202010002020202020202020203 +:1030B00002020202020202020202020202020202F0 +:1030C00002020202020102020202020202020202E1 +:1030D00002020202020202020202020202020202D0 +:1030E00002020202020101020202020202020202C2 +:1030F00002020202020201020202020202020202B1 +:1031000001010202020201020202020202020202A2 +:103110000202020101010102020202020201010295 +:103120000201010101010102020202020201010188 +:103130000101010101010101020202020202010179 +:103140000202010101010102020202020202020165 +:103150000101010101010102020202010102010259 +:10316000020101010101010202020101010101014B +:10317000020101010101010102020201010101013B +:10318000010101010101010001010202020202022A +:103190000202010101010102020202020202020214 +:1031A0000202020202020002020202020202020201 +:1031B00002020202020202020202020202020202EF +:1031C00002020202020102020202020202020202E0 +:1031D00002020202020202020202020202020202CF +:1031E00002020202020102020202020202020202C0 +:1031F00002020202020201020202020202020202B0 +:1032000002010202020201020202020202020202A0 +:103210000202020102020102020202020202010291 +:103220000201010101020102020202020202010185 +:103230000101010101010102020202020202020176 +:103240000202020101010102020202020202020262 +:103250000101010101010102020202020102020256 +:103260000201010101010102020202010102010148 +:103270000202010101010101020202010101010139 +:103280000101010101010100010102020202020229 +:103290000202020101010102020202020202020212 +:1032A0000202020202020002020202020202020200 +:1032B00002020202020202020202020202020202EE +:1032C00002020202020202020202020202020202DE +:1032D00002020202020202020202020202020202CE +:1032E00002020202020102020202020202020202BF +:1032F00002020202020201020202020202020202AF +:10330000020202020202010202020202020202029E +:10331000020202020202010202020202020202028E +:103320000202010102020102020202020202010281 +:103330000101010101010102020202020202020274 +:103340000202020101010102020202020202020261 +:103350000201010102010102020202020102020253 +:103360000201010101010202020202010102010146 +:103370000202020101010101020202020101010136 +:103380000101010101010100020102020202020227 +:103390000202020101010102020202020202020211 +:1033A00002020202020200020202020202020202FF +:1033B00002020202020202020202020202020202ED +:1033C00002020202020202020202020202020202DD +:1033D00002020202020202020202020202020202CD +:1033E00002020202020102020202020202020202BE +:1033F00002020202020201020202020202020202AE +:10340000020202020202010202020202020202029D +:10341000020202020202010202020202020202028D +:10342000020202020202010202020202020201027E +:103430000101010101010102020202020202020273 +:103440000202020101010102020202020202020260 +:103450000202010102010102020202020202020250 +:103460000201010101010202020202020102020143 +:103470000202020101010102020202020101010134 +:103480000101010101010100020202020202020225 +:10349000020202020101010202020202020202020F +:1034A00002020202020200020202020202020202FE +:1034B00002020202020202020202020202020202EC +:1034C00002020202020202020202020202020202DC +:1034D00002020202020202020202020202020202CC +:1034E00002020202020102020202020202020202BD +:1034F00002020202020201020202020202020202AD +:10350000020202020202010202020202020202029C +:10351000020202020202020202020202020202028B +:10352000020202020202010202020202020201027D +:103530000201010101020102020202020202020270 +:10354000020202010101010202020202020202025F +:10355000020202010201010202020202020202024E +:103560000201010101010202020202020102020142 +:103570000202020101010202020202020201010131 +:103580000102010101010100020202020202020223 +:10359000020202020201010202020202020202020D +:1035A00002020202020200020202020202020202FD +:1035B00002020202020202020202020202020202EB +:1035C00002020202020202020202020202020202DB +:1035D00002020202020202020202020202020202CB +:1035E00002020202020102020202020202020202BC +:1035F00002020202020202020202020202020202AB +:10360000020202020202010202020202020202029B +:10361000020202020202020202020202020202028A +:10362000020202020202010202020202020202027B +:10363000020201010102010202020202020202026E +:10364000020202010102010202020202020202025D +:10365000020202020201010202020202020202024C +:10366000020101010201020202020202020202013F +:10367000020202010201020202020202020201012E +:103680000102020101010100020202020202020221 +:10369000020202020201010202020202020202020C +:1036A00002020202020200020202020202020202FC +:1036B00002020202020202020202020202020202EA +:1036C00002020202020202020202020202020202DA +:1036D00002020202020202020202020202020202CA +:1036E00002020202020202020202020202020202BA +:1036F00002020202020202020202020202020202AA +:10370000020202020202010202020202020202029A +:103710000202020202020202020202020202020289 +:10372000020202020202010202020202020202027A +:10373000020201010102010202020202020202026D +:10374000020202010202010202020202020202025B +:10375000020202020201020202020202020202024A +:10376000020101010201020202020202020202013E +:10377000020202010202020202020202020201012C +:10378000010202020101010002020202020202021F +:10379000020202020201010202020202020202020B +:1037A00002020202020200020202020202020202FB +:1037B00002020202020202020202020202020202E9 +:1037C00002020202020202020202020202020202D9 +:1037D00002020202020202020202020202020202C9 +:1037E00002020202020202020202020202020202B9 +:1037F00002020202020202020202020202020202A9 +:103800000202020202020202020202020202020298 +:103810000202020202020202020202020202020288 +:103820000202020202020202020202020202020278 +:10383000020202010102010202020202020202026B +:103840000202020202020102020202020202020259 +:103850000202020202010202020202020202020249 +:10386000020102010201020202020202020202013C +:10387000020202010202020202020202020202012A +:10388000010202020201010002020202020202021D +:10389000020202020201010202020202020202020A +:1038A00002020202020200020202020202020202FA +:1038B00002020202020202020202020202020202E8 +:1038C00002020202020202020202020202020202D8 +:1038D00002020202020202020202020202020202C8 +:1038E00002020202020202020202020202020202B8 +:1038F00002020202020202020202020202020202A8 +:103900000202020202020202020202020202020297 +:103910000202020202020202020202020202020287 +:103920000202020202020202020202020202020277 +:103930000202020201020102020202020202020269 +:103940000202020202020102020202020202020258 +:103950000202020202020202020202020202020247 +:10396000020102020201020202020202020202013A +:103970000202020202020202020202020202020227 +:10398000010202020201010002020202020202021C +:103990000202020202010102020202020202020209 +:1039A00002020202020200020202020202020202F9 +:1039B00002020202020202020202020202020202E7 +:1039C00002020202020202020202020202020202D7 +:1039D00002020202020202020202020202020202C7 +:1039E00002020202020202020202020202020202B7 +:1039F00002020202020202020202020202020202A7 +:103A00000202020202020202020202020202020296 +:103A10000202020202020202020202020202020286 +:103A20000202020202020202020202020202020276 +:103A30000202020202020102020202020202020267 +:103A40000202020202020202020202020202020256 +:103A50000202020202020202020202020202020246 +:103A60000201020202010202020202020202020238 +:103A70000202020202020202020202020202020226 +:103A8000020202020201010002020202020202021A +:103A90000202020202010102020202020202020208 +:103AA00002020202020200020202020202020202F8 +:103AB00002020202020202020202020202020202E6 +:103AC00002020202020202020202020202020202D6 +:103AD00002020202020202020202020202020202C6 +:103AE00002020202020202020202020202020202B6 +:103AF00002020202020202020202020202020202A6 +:103B00000202020202020202020202020202020295 +:103B10000202020202020202020202020202020285 +:103B20000202020202020202020202020202020275 +:103B30000202020202020102020202020202020266 +:103B40000202020202020202020202020202020255 +:103B50000202020202020202020202020202020245 +:103B60000202020202010202020202020202020236 +:103B70000202020202020202020202020202020225 +:103B80000202020202010100020202020202020219 +:103B90000202020202010102020202020202020207 +:103BA00002020202020200020202020202020202F7 +:103BB00002020201010102020202020202020202E8 +:103BC00002020202020202020202020202020202D5 +:103BD00002020202020202020202020202020202C5 +:103BE00002020202020202020202020202020202B5 +:103BF00002020202020202020202020202020202A5 +:103C00000202020202020202020202020202020294 +:103C10000202020202020202020202020202020284 +:103C20000202020202020202020202020202020274 +:103C30000202020202020102020202020202020265 +:103C40000202020202020202020202020202020254 +:103C50000202020202020202020202020202020244 +:103C60000202020202010202020202020202020235 +:103C70000202020202020202020202020202020224 +:103C80000202020202010100020202020202020218 +:103C90000202020202010102020202020202020206 +:103CA00002020202020200020202020202020202F6 +:103CB00002010101010101020202020202020202EA +:103CC00002020202020202020202020202020202D4 +:103CD00002020202020202020202020202020202C4 +:103CE00002020202020202020202020202020202B4 +:103CF00002020202020202020202020202020202A4 +:103D00000202020202020202020202020202020293 +:103D10000202020202020202020202020202020283 +:103D20000202020202020202020202020202020273 +:103D30000202020202020202020202020202020263 +:103D40000202020202020202020202020202020253 +:103D50000202020202020202020202020202020243 +:103D60000202020202010202020202020202020234 +:103D70000202020202020202020202020202020223 +:103D80000202020202010102020202020202020215 +:103D90000202020202010102020202020202020205 +:103DA00002020202020200020202020202020202F5 +:103DB00001010101010101020202020202020202EA +:103DC00002020202020202020202020202020202D3 +:103DD00002020202020202020202020202020202C3 +:103DE00002020202020202020202020202020202B3 +:103DF00002020202020202020202020202020202A3 +:103E00000202020202020202020202020202020292 +:103E10000202020202020202020202020202020282 +:103E20000202020202020202020202020202020272 +:103E30000202020202020202020202020202020262 +:103E40000202020202020202020202020202020252 +:103E50000202020202020202020202020202020242 +:103E60000202020202010202020202020202020233 +:103E70000202020202020202020202020202020222 +:103E80000202020202010102020202020202020214 +:103E90000202020202010102020202020202020204 +:103EA00002020202020200020202020202020201F5 +:103EB00001010101010101020202020202020202E9 +:103EC00002020201010202020202020202020202D4 +:103ED00002020202020202020202020202020202C2 +:103EE00002020202020202020202020202020202B2 +:103EF00002020202020202020202020202020202A2 +:103F00000202020202020202020202020202020291 +:103F10000202020202020202020202020202020281 +:103F20000202020202020202020202020202020271 +:103F30000202020202020202020202020202020261 +:103F40000202020202020202020202020202020251 +:103F50000202020202020202020202020202020241 +:103F60000202020202010202020202020202020232 +:103F70000202020202020202020202020202020221 +:103F80000202020202020102020202020202020212 +:103F90000202020202010102020202020202020203 +:103FA00002020202020200020202020101010101F8 +:103FB00001010101010101020202020202020202E8 +:103FC00001010101010101020202020202020202D8 +:103FD00002020202020202020202020202020202C1 +:103FE00002020202020202020202020202020202B1 +:103FF00002020202020202020202020202020202A1 +:104000000202020202020202020202020202020290 +:104010000202020202020202020202020202020280 +:104020000202020202020202020202020202020270 +:104030000202020202020202020202020202020260 +:104040000202020202020202020202020202020250 +:104050000202020202020202020202020202020240 +:104060000202020202010202020202020202020231 +:104070000202020202020202020202020202020220 +:104080000202020202020202020202020202020210 +:104090000202020202020102020202020202020201 +:1040A00002020101010100020202020101010101FB +:1040B00001010101010101020202020202010101EA +:1040C00001010101010101020202020202020202D7 +:1040D00002020101010202020202020202020202C3 +:1040E00002020202020202020202020202020202B0 +:1040F00002020202020202020202020202020202A0 +:10410000020202020202020202020202020202028F +:10411000020202020202020202020202020202027F +:10412000020202020202020202020202020202026F +:10413000020202020202020202020202020202025F +:10414000020202020202020202020202020202024F +:10415000020202020202020202020202020202023F +:10416000020202020202020202020202020202022F +:10417000020202020202020202020202020202021F +:10418000020202020202020202020202020202020F +:104190000202020202020202020202020202010101 +:1041A0000101010101010001010101010101010100 +:1041B00001010101010101020202020201010101EA +:1041C00001010101010101020202020202020201D7 +:1041D00001010101010101020202020202020202C6 +:1041E00002020202020202020202020202020202AF +:1041F000020202020202020202020202020202029F +:10420000020202020202020202020202020202028E +:10421000020202020202020202020202020202027E +:10422000020202020202020202020202020202026E +:10423000020202020202020202020202020202025E +:10424000020202020202020202020202020202024E +:10425000020202020202020202020202020202023E +:10426000020202020202020202020202020202022E +:10427000020202020202020202020202020202021E +:10428000020202020202020202020202020202020E +:104290000202020202020202020202010101010103 +:1042A00001010101010101010101010101010101FE +:1042B00001010101010101020202010101010101EB +:1042C00001010101010101020202020202020101D7 +:1042D00001010101010101020202020202020202C5 +:1042E00002020202020202020202020202020202AE +:1042F000020202020202020202020202020202029E +:10430000020202020202020202020202020202028D +:10431000020202020202020202020202020202027D +:10432000020202020202020202020202020202026D +:10433000020202020202020202020202020202025D +:10434000020202020202020202020202020202024D +:10435000020202020202020202020202020202023D +:10436000020202020202020202020202020202022D +:10437000020202020202020202020202020202021D +:10438000020202020202020202020202020202020D +:104390000202020202020202020101010101010104 +:1043A00001010101010101010101010101010101FD +:1043B00001010101010101010101010101010101ED +:1043C00001010101010101020202020202010101D7 +:1043D00001010101010101020202020202020202C4 +:1043E00002020101010201020202020202020202B1 +:1043F000020202020202020202020202020202029D +:10440000020202020202020202020202020202028C +:10441000020202020202020202020202020202027C +:10442000020202020202020202020202020202026C +:10443000020202020202020202020202020202025C +:10444000020202020202020202020202020202024C +:10445000020202020202020202020202020202023C +:10446000020202020202020202020202020202022C +:10447000020202020202020202020202020202021C +:10448000020202020202020202020202020202020C +:104490000202020202020201010101010101010105 +:1044A00001010101010101010101010101010101FC +:1044B00001010101010101010101010101010101EC +:1044C00001010101010101020202020201010101D7 +:1044D00001010101010101020202020202020201C4 +:1044E00001010101010101020202020202020202B3 +:1044F000020202020202020202020202020202029C +:10450000020202020202020202020202020202028B +:10451000020202020202020202020202020202027B +:10452000020202020202020202020202020202026B +:10453000020202020202020202020202020202025B +:10454000020202020202020202020202020202024B +:10455000020202020202020202020202020202023B +:10456000020202020202020202020202020202022B +:10457000020202020202020202020202020202021B +:10458000020202020202020202020202020202020B +:104590000202020202020201010101010101010104 +:1045A00001010101010101010101010101010101FB +:1045B00001010101010101010101010101010101EB +:1045C00001010101010101020101010101010101DA +:1045D00001010101010101020202020201010101C6 +:1045E00001010101010101020202020202020202B2 +:1045F000020202020202020202020202020202029B +:10460000020202020202020202020202020202028A +:10461000020202020202020202020202020202027A +:10462000020202020202020202020202020202026A +:10463000020202020202020202020202020202025A +:10464000020202020202020202020202020202024A +:10465000020202020202020202020202020202023A +:10466000020202020202020202020202020202022A +:10467000020202020202020202020202020202021A +:10468000020202020202020202020202020202020A +:104690000202020202020201010101010101010103 +:1046A00001010101010101010101010101010101FA +:1046B00001010101010101010101010101010101EA +:1046C00001010101010101010101010101010101DA +:1046D00001010101010101020202020101010101C6 +:1046E00001010101010101020202020202020202B1 +:1046F000020202020202020202020202020202029A +:104700000202020202020202020202020202020289 +:104710000202020202020202020202020202020279 +:104720000202020202020202020202020202020269 +:104730000202020202020202020202020202020259 +:104740000202020202020202020202020202020249 +:104750000202020202020202020202020202020239 +:104760000202020202020202020202020202020229 +:104770000202020202020202020202020202020219 +:104780000202020202020202020202020202020209 +:104790000202020202020201010101010101010102 +:1047A00001010101010101010101010101010101F9 +:1047B00001010101010101010101010101010101E9 +:1047C00001010101010101010101010101010101D9 +:1047D00001010101010101010202010101010101C7 +:1047E00001010101010101020202020202020202B0 +:1047F0000202020202020202020202020202020299 +:104800000202020202020202020202020202020288 +:104810000202020202020202020202020202020278 +:104820000202020202020202020202020202020268 +:104830000202020202020202020202020202020258 +:104840000202020202020202020202020202020248 +:104850000202020202020202020202020202020238 +:104860000202020202020202020202020202020228 +:104870000202020202020202020202020202020218 +:104880000202020202020202020202020202020208 +:104890000202020202020201010101010101010101 +:1048A00001010101010101010101010101010101F8 +:1048B00001010101010101010101010101010101E8 +:1048C00001010101010101010101010101010101D8 +:1048D00001010101010101010101010101010101C8 +:1048E00001010101010101020202020202020202AF +:1048F000010101010102020202020202020202029D +:104900000202020202020202020202020202020287 +:104910000202020202020202020202020202020277 +:104920000202020202020202020202020202020267 +:104930000202020202020202020202020202020257 +:104940000202020202020202020202020202020247 +:104950000202020202020202020202020202020237 +:104960000202020202020202020202020202020227 +:104970000202020202020202020202020202020217 +:104980000202020202020202020202020202020207 +:104990000202020202020201010101010101010100 +:1049A00001010101010101010101010101010101F7 +:1049B00001010101010101010101010101010101E7 +:1049C00001010101010101010101010101010101D7 +:1049D00001010101010101010101010101010101C7 +:1049E00001010101010101020202020101010101B3 +:1049F000010101010101010202020202020202029E +:104A00000202020202020202020202020202020286 +:104A10000202020202020202020202020202020276 +:104A20000202020202020202020202020202020266 +:104A30000202020202020202020202020202020256 +:104A40000202020202020202020202020202020246 +:104A50000202020202020202020202020202020236 +:104A60000202020202020202020202020202020226 +:104A70000202020202020202020202020202020216 +:104A80000202020202020202020202020202020206 +:104A900002020202020202010101010101010101FF +:104AA00001010101010101010101010101010101F6 +:104AB00001010101010101010101010101010101E6 +:104AC00001010101010101010101010101010101D6 +:104AD00001010101010101010101010101010101C6 +:104AE00001010101010101020202020101010101B2 +:104AF00001010101010101020202020202010101A0 +:104B00000202010101020202020202020202020288 +:104B1000010101010102020202020202020202027A +:104B20000202020202020202020202020202020265 +:104B30000202020202020202020202020202020255 +:104B40000202020202020202020202020202020245 +:104B50000202020202020202020202020202020235 +:104B60000202020202020202020202020202020225 +:104B70000202020202020202020202020202020215 +:104B80000202020202020202020202020202020205 +:104B900002020202020202010101010101010101FE +:104BA00001010101010101010101010101010101F5 +:104BB00001010101010101010101010101010101E5 +:104BC00001010101010101010101010101010101D5 +:104BD00001010101010101010101010101010101C5 +:104BE00001010101010101020201010101010101B3 +:104BF00001010101010101020202020201010101A0 +:104C0000010101010101010202020202020101018E +:104C1000010101010101010202020202020202027B +:104C20000202020202020202020202020202020264 +:104C30000202020202020202020202020202020254 +:104C40000202020202020202020202020202020244 +:104C50000202020202020202020202020202020234 +:104C60000202020202020202020202020202020224 +:104C70000202020202020202020202020202020214 +:104C80000202020202020202020202020202020204 +:104C900002020202020202010101010101010101FD +:104CA00001010101010101010101010101010101F4 +:104CB00001010101010101010101010101010101E4 +:104CC00001010101010101010101010101010101D4 +:104CD00001010101010101010101010101010101C4 +:104CE00001010101010101010101010101010101B4 +:104CF00001010101010101020202010201010101A0 +:104D0000010101010101010202020202010101018E +:104D1000010101010101010202020202020202027A +:104D20000202020202020202020202020202020263 +:104D30000202020202020202020202020202020253 +:104D40000202020202020202020202020202020243 +:104D50000202020202020202020202020202020233 +:104D60000202020202020202020202020202020223 +:104D70000202020202020202020202020202020213 +:104D80000202020202020202020202020202020203 +:104D900002020202020202010101010101010101FC +:104DA00001010101010101010101010101010101F3 +:104DB00001010101010101010101010101010101E3 +:104DC00001010101010101010101010101010101D3 +:104DD00001010101010101010101010101010101C3 +:104DE00001010101010101010101010101010101B3 +:104DF00001010101010101010101010101010101A3 +:104E00000101010101010102020101010101010190 +:104E10000101010101010102020202020202020279 +:104E20000202020202020202020202020202020262 +:104E30000202020202020202020202020202020252 +:104E40000202020202020202020202020202020242 +:104E50000202020202020202020202020202020232 +:104E60000202020202020202020202020202020222 +:104E70000202020202020202020202020202020212 +:104E80000202020202020202020202020202020202 +:104E900002020202020202010101010101010101FB +:104EA00001010101010101010101010101010101F2 +:104EB00001010101010101010101010101010101E2 +:104EC00001010101010101010101010101010101D2 +:104ED00001010101010101010101010101010101C2 +:104EE00001010101010101010101010101010101B2 +:104EF00001010101010101010101010101010101A2 +:104F00000101010101010101010101010101010191 +:104F10000101010101010102020202020202020278 +:104F20000202020202020202020202020202020261 +:104F30000202020202020202020202020202020251 +:104F40000202020202020202020202020202020241 +:104F50000202020202020202020202020202020231 +:104F60000202020202020202020202020202020221 +:104F70000202020202020202020202020202020211 +:104F80000202020202020202020202020202020201 +:104F900002020202020202010101010101010101FA +:104FA00001010101010101010101010101010101F1 +:104FB00001010101010101010101010101010101E1 +:104FC00001010101010101010101010101010101D1 +:104FD00001010101010101010101010101010101C1 +:104FE00001010101010101010101010101010101B1 +:104FF00001010101010101010101010101010101A1 +:105000000101010101010101010101010101010190 +:105010000101010101010102020202020202020277 +:105020000202020202020202020202020202020260 +:105030000202020202020202020202020202020250 +:105040000202020202020202020202020202020240 +:105050000202020202020202020202020202020230 +:105060000202020202020202020202020202020220 +:105070000202020202020202020202020202020210 +:105080000202020202020202020202020202020200 +:1050900002020202020202010101010101010101F9 +:1050A00001010101010101010101010101010101F0 +:1050B00001010101010101010101010101010101E0 +:1050C00001010101010101010101010101010101D0 +:1050D00001010101010101010101010101010101C0 +:1050E00001010101010101010101010101010101B0 +:1050F00001010101010101010101010101010101A0 +:10510000010101010101010101010101010101018F +:105110000101010101010102020202020202020177 +:105120000101010101010202020202020202020166 +:105130000101010101010202020202020202020255 +:10514000020202020202020202020202020202023F +:10515000020202020202020202020202020202022F +:10516000020202020202020202020202020202021F +:10517000020202020202020202020202020202020F +:1051800002020202020202020202020202020202FF +:1051900002020202020202010101010101010101F8 +:1051A00001010101010101010101010101010101EF +:1051B00001010101010101010101010101010101DF +:1051C00001010101010101010101010101010101CF +:1051D00001010101010101010101010101010101BF +:1051E00001010101010101010101010101010101AF +:1051F000010101010101010101010101010101019F +:10520000010101010101010101010101010101018E +:10521000010101010101010202020201010101017A +:10522000010101010101010202020101010101016B +:105230000101010101010102020202020202020255 +:10524000020202020202020202020202020202023E +:10525000020202020202020202020202020202022E +:10526000020202020202020202020202020202021E +:10527000020202020202020202020202020202020E +:1052800002020202020202020202020202020202FE +:1052900002020202020202010101010101010101F7 +:1052A00001010101010101010101010101010101EE +:1052B00001010101010101010101010101010101DE +:1052C00001010101010101010101010101010101CE +:1052D00001010101010101010101010101010101BE +:1052E00001010101010101010101010101010101AE +:1052F000010101010101010101010101010101019E +:10530000010101010101010101010101010101018D +:10531000010101010101010201010101010101017C +:10532000010101010101010101010101010101016D +:105330000101010101010102020202020202020254 +:10534000020202020202020202020202020202023D +:10535000020202020202020202020202020202022D +:10536000020202020202020202020202020202021D +:10537000020202020202020202020202020202020D +:1053800002020202020202020202020202020202FD +:1053900002020202020202010101010101010101F6 +:1053A00001010101010101010101010101010101ED +:1053B00001010101010101010101010101010101DD +:1053C00001010101010101010101010101010101CD +:1053D00001010101010101010101010101010101BD +:1053E00001010101010101010101010101010101AD +:1053F000010101010101010101010101010101019D +:10540000010101010101010101010101010101018C +:10541000010101010101010101010101010101017C +:10542000010101010101010101010101010101016C +:105430000101010101010102020202020202020253 +:10544000010101020202020202020202020202023F +:10545000020202020202020202020202020202022C +:10546000020202020202020202020202020202021C +:10547000020202020202020202020202020202020C +:1054800002020202020202020202020202020202FC +:1054900002020202020202010101010101010101F5 +:1054A00001010101010101010101010101010101EC +:1054B00001010101010101010101010101010101DC +:1054C00001010101010101010101010101010101CC +:1054D00001010101010101010101010101010101BC +:1054E00001010101010101010101010101010101AC +:1054F000010101010101010101010101010101019C +:10550000010101010101010101010101010101018B +:10551000010101010101010101010101010101017B +:10552000010101010101010101010101010101016B +:105530000101010101010102020202020101010156 +:105540000101010101010102020202020202020242 +:10555000020202020202020202020202020202012C +:10556000010202020202010202020202020202021D +:10557000020202020202020202020202020202020B +:1055800002020202020202020202020202020202FB +:1055900002020202020202010101010101010101F4 +:1055A00001010101010101010101010101010101EB +:1055B00001010101010101010101010101010101DB +:1055C00001010101010101010101010101010101CB +:1055D00001010101010101010101010101010101BB +:1055E00001010101010101010101010101010101AB +:1055F000010101010101010101010101010101019B +:10560000010101010101010101010101010101018A +:10561000010101010101010101010101010101017A +:10562000010101010101010101010101010101016A +:105630000101010101010102010101010101010159 +:10564000010101010101010101010101010101014A +:105650000101010101020102020202020201010133 +:10566000010201010102010202020202020202021F +:10567000020202020202020202020202020202020A +:1056800002020202020202020202020202020202FA +:1056900002020202020202010101010101010101F3 +:1056A00001010101010101010101010101010101EA +:1056B00001010101010101010101010101010101DA +:1056C00001010101010101010101010101010101CA +:1056D00001010101010101010101010101010101BA +:1056E00001010101010101010101010101010101AA +:1056F000010101010101010101010101010101019A +:105700000101010101010101010101010101010189 +:105710000101010101010101010101010101010179 +:105720000101010101010101010101010101010169 +:105730000101010101010101010101010101010159 +:105740000101010101010101010101010101010149 +:105750000101010101010101010101010101010139 +:10576000010101010102010202020202020202021F +:10577000010101020202010202020202020202020D +:1057800002020202020202020202020202020202F9 +:1057900002020202020202010101010101010101F2 +:1057A00001010101010101010101010101010101E9 +:1057B00001010101010101010101010101010101D9 +:1057C00001010101010101010101010101010101C9 +:1057D00001010101010101010101010101010101B9 +:1057E00001010101010101010101010101010101A9 +:1057F0000101010101010101010101010101010199 +:105800000101010101010101010101010101010188 +:105810000101010101010101010101010101010178 +:105820000101010101010101010101010101010168 +:105830000101010101010101010101010101010158 +:105840000101010101010101010101010101010148 +:105850000101010101010101010101010101010138 +:105860000101010101010102020202020201010221 +:10587000010101010101010202020202020202020F +:1058800002020202020202020202020202020202F8 +:1058900002020202020202010101010101010101F1 +:1058A00001010101010101010101010101010101E8 +:1058B00001010101010101010101010101010101D8 +:1058C00001010101010101010101010101010101C8 +:1058D00001010101010101010101010101010101B8 +:1058E00001010101010101010101010101010101A8 +:1058F0000101010101010101010101010101010198 +:105900000101010101010101010101010101010187 +:105910000101010101010101010101010101010177 +:105920000101010101010101010101010101010167 +:105930000101010101010101010101010101010157 +:105940000101010101010101010101010101010147 +:105950000101010101010101010101010101010137 +:105960000101010101010101010101010101010127 +:10597000010101010101010202020202020202020E +:105980000201010101020202020201010101010101 +:1059900001010101010202010101010101010101F5 +:1059A00001010101010101010101010101010101E7 +:1059B00001010101010101010101010101010101D7 +:1059C00001010101010101010101010101010101C7 +:1059D00001010101010101010101010101010101B7 +:1059E00001010101010101010101010101010101A7 +:1059F0000101010101010101010101010101010197 +:105A00000101010101010101010101010101010186 +:105A10000101010101010101010101010101010176 +:105A20000101010101010101010101010101010166 +:105A30000101010101010101010101010101010156 +:105A40000101010101010101010101010101010146 +:105A50000101010101010101010101010101010136 +:105A60000101010101010101010101010101010126 +:105A70000101010101010102010101010101010115 +:105A80000101010101010100010101010101010107 +:105A900001010101010101010101010101010101F6 +:105AA00001010101010101010101010101010101E6 +:105AB00001010101010101010101010101010101D6 +:105AC00001010101010101010101010101010101C6 +:105AD00001010101010101010101010101010101B6 +:105AE00001010101010101010101010101010101A6 +:105AF0000101010101010101010101010101010196 +:105B00000101010101010101010101010101010185 +:105B10000101010101010101010101010101010175 +:105B20000101010101010101010101010101010165 +:105B30000101010101010101010101010101010155 +:105B40000101010101010101010101010101010145 +:105B50000101010101010101010101010101010135 +:105B60000101010101010101010101010101010125 +:105B70000101010101010101010101010101010115 +:105B8000010101010101010000000000000000000E +:105B900000000000000000010101010101010101FC +:105BA00001010101010101010101010101010101E5 +:105BB00001010101010101010101010101010101D5 +:105BC00001010101010101010101010101010101C5 +:105BD00001010101010101010101010101010101B5 +:105BE00001010101010101010101010101010101A5 +:105BF0000101010101010101010101010101010195 +:105C00000101010101010101010101010101010184 +:105C10000101010101010101010101010101010174 +:105C20000101010101010101010101010101010164 +:105C30000101010101010101010101010101010154 +:105C40000101010101010101010101010101010144 +:105C50000101010101010101010101010101010134 +:105C60000101010101010101010101010101010124 +:105C70000101010101010101010101010101010114 +:105C8000010101010101010000000000000000000D +:105C900000000000000000010101010101010101FB +:105CA00001010101010101010101010101010101E4 +:105CB00001010101010101010101010101010101D4 +:105CC00001010101010101010101010101010101C4 +:105CD00001010101010101010101010101010101B4 +:105CE00001010101010101010101010101010101A4 +:105CF0000101010101010101010101010101010194 +:105D00000101010101010101010101010101010183 +:105D10000101010101010101010101010101010173 +:105D20000101010101010101010101010101010163 +:105D30000101010101010101010101010101010153 +:105D40000101010101010101010101010101010143 +:105D50000101010101010101010101010101010133 +:105D60000101010101010101010101010101010123 +:105D70000101010101010101010101010101010113 +:105D8000010101010101010000000000000000000C +:105D900000000000000000010101010101010101FA +:105DA00001010101010101010101010101010101E3 +:105DB00001010101010101010101010101010101D3 +:105DC00001010101010101010101010101010101C3 +:105DD00001010101010101010101010101010101B3 +:105DE00001010101010101010101010101010101A3 +:105DF0000101010101010101010101010101010193 +:105E00000101010101010101010101010101010182 +:105E10000101010101010101010101010101010172 +:105E20000101010101010101010101010101010162 +:105E30000101010101010101010101010101010152 +:105E40000101010101010101010101010101010142 +:105E50000101010101010101010101010101010132 +:105E60000101010101010101010101010101010122 +:105E70000101010101010101010101010101010112 +:105E8000010101010101010000000000000000000B +:105E900000000000000000010101010101010101F9 +:105EA00001010101010101010101010101010101E2 +:105EB00001010101010101010101010101010101D2 +:105EC00001010101010101010101010101010101C2 +:105ED00001010101010101010101010101010101B2 +:105EE00001010101010101010101010101010101A2 +:105EF0000101010101010101010101010101010192 +:105F00000101010101010101010101010101010181 +:105F10000101010101010101010101010101010171 +:105F20000101010101010101010101010101010161 +:105F30000101010101010101010101010101010151 +:105F40000101010101010101010101010101010141 +:105F50000101010101010101010101010101010131 +:105F60000101010101010101010101010101010121 +:105F70000101010101010101010101010101010111 +:105F8000010101010101010000000000000000000A +:105F90000000000000000000000000000000000001 +:105FA00000000000000000020202020202020202DF +:105FB00002020202020202020202020202020202C1 +:105FC00002020202020202020202020202020202B1 +:105FD00002020202020202020202020202020202A1 +:105FE0000202020202020202020202020202020291 +:105FF0000202020202020202020202020202020281 +:106000000202020202020202020202020202020270 +:106010000202020202020200000000000000000072 +:10602000000000000000000202020202020202025E +:106030000202020202020200000000000000000052 +:106040000000000000000000000000000000000050 +:10605000000000000000000202020202020202022E +:106060000202020202020202020202020202020210 +:106070000202020202020202020202020202020200 +:106080000202020202020200000000000000000002 +:106090000000000000000000000000000000000000 +:1060A00000000000000000020202020202020202DE +:1060B00002020202020202020202020202020202C0 +:1060C00002020202020202020202020202020202B0 +:1060D00002020202020202020202020202020202A0 +:1060E00002020202020202000000000000000000A2 +:1060F00000000000000000000000000000000000A0 +:10610000000000000000000202020202020202027D +:106110000202020202020200000000000000000071 +:10612000000000000000000000000000000000006F +:10613000000000000000000000000000000000005F +:10614000000000000000000000000000000000004F +:10615000000000000000000000000000000000003F +:10616000000000000000000000000000000000002F +:10617000000000000000000202020202020202020D +:106180000202020202020200000000000000000001 +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF +:1061C00000000000000000000000000000000000CF +:1061D00000000000000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:10620000000000000000000000000000000000008E +:10621000000000000000000000000000000000007E +:10622000000000000000000000000000000000006E +:10623000000000000000000000000000000000005E +:10624000000000000000000000000000000000004E +:10625000000000000000000000000000000000003E +:10626000000000000000000000000000000000002E +:10627000000000000000000000000000000000001E +:10628000000000000000000000000000000000000E +:10629000000000000000004A0000000000000000B4 +:1062A00000000000000000000000000000000000EE +:1062B00000000000000000000000000000000000DE +:1062C00000000000000000000000000000000000CE +:1062D00000000000000000000000000000000000BE +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:10630000000000000000000000000000000000008D +:10631000000000000000000000000100000000007C +:10632000000000000000000000000000000000006D +:10633000000000000000000000000000000000005D +:10634000000000000000000000000000000000004D +:10635000000000000000000000000000000000003D +:10636000000000000000000000000000000000002D +:10637000000000000000000000000000000000001D +:10638000000000000000000000000000000000000D +:1063900000000000000000000000000000000000FD +:1063A00000000000000000000000000000000000ED +:1063B00000000000000000000000000000000000DD +:1063C00000000000000000000000000000000000CD +:1063D00000000000000000000000000000000000BD +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000000009D +:10640000000000000000000000000000000000008C +:10641000000000000000000000000100000000007B +:10642000000000000000000000000000000000006C +:10643000000000000000000000000000000000005C +:10644000000000000000000000000000000000004C +:10645000000000000000000000000000000000003C +:10646000000000000000000000000000000000002C +:10647000000000000000000000000000000000001C +:10648000000000000000000000000000000000000C +:1064900000000000000000000000000000000000FC +:1064A00000000000000000000000000000000000EC +:1064B00000000000000000000000000000000000DC +:1064C00000000000000000000000000000000000CC +:1064D00000000000000000000000000000000000BC +:1064E00000000000000000000000000000000000AC +:1064F000000000000000000000000000000000009C +:10650000000000000000000000000000000000008B +:106510000000000000000000000101010101000076 +:10652000000000000000000000000000000000006B +:10653000000000000000000000000000000000005B +:10654000000000000000000000000000000000004B +:10655000000000000000000000000000000000003B +:10656000000000000000000000000000000000002B +:10657000000000000000000000000000000000001B +:10658000000000000000000000000000000000000B +:1065900000000000000000000000000000000000FB +:1065A00000000000000001000000000000000000EA +:1065B00000000000000000000000000000000000DB +:1065C00000000000000000000000000000000000CB +:1065D00000000000000000000000000000000000BB +:1065E00000000000000000000000000000000000AB +:1065F000000000000000000000000000000000009B +:10660000000000000000000000000000000000008A +:106610000000000000000001010101010101000172 +:106620000100000000000000000000000001000068 +:10663000000000000000000000000000000000005A +:10664000000000000000000000000000000000004A +:10665000000000000000000000000000000000003A +:10666000000000000000000000000000000000002A +:10667000000000000000000000000000000000001A +:10668000000000000000000000000000000000000A +:1066900000000000000000000000000000000000FA +:1066A00000000000010001010100000000000000E6 +:1066B00000000000000000000000000000000000DA +:1066C00000000000000000000000000000000000CA +:1066D00000000000000000000000000000000000BA +:1066E00000000000000000000000000000000000AA +:1066F0000000000000010000000000000000000099 +:106700000000000000000000000000000000000089 +:106710000000000000000101010101010101000170 +:106720000100000000000000000000000001000067 +:106730000000000000000000000000000000000059 +:106740000000000000000000000000000000000049 +:106750000000000000000000000000000000000039 +:106760000000000000000000000000000000000029 +:106770000000000000000000000000000000000019 +:106780000000000000000000000000000000000009 +:1067900000000000000000000000000000000001F8 +:1067A00001010101010101010101010001010000DC +:1067B00000000000000000000000000000000001D8 +:1067C00001000000000101000001010000000000C4 +:1067D00000000000000000000000000000000000B9 +:1067E00000010000000000000000000000000000A8 +:1067F0000000000000010000000000000000000098 +:106800000000000000000000000000000000000088 +:10681000000000000000010101010101010100016F +:106820000100000000000000000000000001000066 +:106830000000000000010000000000000000000057 +:106840000000000000000000000000000000000048 +:106850000000000000000000000000000000000038 +:106860000000000000000000000000000000010027 +:106870000000000000000000000001000100000016 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000000001F7 +:1068A00001010101010101010101010001010000DB +:1068B00000000000000000000000000000000001D7 +:1068C00001000000010101000101010000000000C1 +:1068D00000000000000000000000000000000000B8 +:1068E00000010000000000000000000000000000A7 +:1068F0000000000000010100000000000101000094 +:106900000000000000000000000000000000000087 +:10691000000000000000010101010101010100016E +:106920000100000000000000000000000001000065 +:106930000000000000010000000000000000000056 +:106940000000000000000000000000000000000047 +:106950000000000000000000000000000000000037 +:106960000000000000000000000000000000010026 +:106970000000000000000000010001000100000014 +:106980000000000000000000000000000000000007 +:1069900000000000000000000000000000000001F6 +:1069A00001010101010101010101010001010001D9 +:1069B00000010100000000000000000000000001D4 +:1069C00001010101010101000101010000000000BD +:1069D00001010101000000000000000000000000B3 +:1069E00000010100000000000000000000000000A5 +:1069F0000000000000010100000000000101010092 +:106A00000000000000000000000000000000000086 +:106A1000000000000000010101010101010100016D +:106A20000101010000000000000000000001000062 +:106A30000000000000010000000000000000000055 +:106A40000000000000000000000000000000000046 +:106A50000000000000000000000000000100000035 +:106A60000000000000000000000000000000010025 +:106A70000000000000000000010101000100000012 +:106A80000000000000000000000000000000000006 +:106A900000000000000000000000000000000001F5 +:106AA00001010101010101010101010001010001D8 +:106AB00000010100000000000000000000000001D3 +:106AC00001010101010101010101010000000000BB +:106AD00001010101010000000000000000000000B1 +:106AE00000010100000000000000000000000001A3 +:106AF000010100000001010000010100010101008D +:106B00000000000000000000000000000000000184 +:106B1000010100000000010101010101010100016A +:106B20000101010001000000000000000001000060 +:106B30000000000000010000000000000000000054 +:106B40000000000000000000000000000000000045 +:106B50000000000000000001010000000100000032 +:106B60000000000000000000000000000000010024 +:106B70000000000000000001010101000100000010 +:106B80000000000000000000000000000000000005 +:106B900000000000000000000000000000000001F4 +:106BA00001010101010101010101010101010001D6 +:106BB00001010101000000000000010000000001CF +:106BC00001010101010101010101010000010000B9 +:106BD00001010101010100000000000000000000AF +:106BE00000010100000100000000000000000001A1 +:106BF000010100000001010101010100010101008A +:106C00000000000000000000000000000000000183 +:106C10000101000000000101010101010101000169 +:106C2000010101000101010000000000000100005D +:106C30000000000000010100000000000000000052 +:106C40000000000000000000000000000000000044 +:106C5000000000000000000101010100010000002F +:106C60000000000000000000000000000000010023 +:106C7000000000000000000101010100010000000F +:106C80000000000000000000000000000000000004 +:106C900000000000000000000000000000000001F3 +:106CA00001010101010101010101010101010001D5 +:106CB00001010101010000000000010000000101CC +:106CC00001010101010101010101010000010000B8 +:106CD00001010101010100000000000000000000AE +:106CE000000101000101000000000000000000019F +:106CF0000101000000010101010101000101010089 +:106D00000000000000000000000000000000000182 +:106D10000101010000000101010101010101000167 +:106D2000010101000101010000000000000100005C +:106D30000000000000010100000000000000000051 +:106D40000000000000000000000000000000000043 +:106D5000000000000000000101010100010000002E +:106D60000000000000000000000000000000010022 +:106D7000000000000000000101010100010001000D +:106D80000000000000000000000000000000000003 +:106D900000000000000000000000000000000001F2 +:106DA00001010101010101010101010101010001D4 +:106DB00001010101010101000000010000000101C9 +:106DC00001010101010101010101010100010000B6 +:106DD00001010101010101000000000001000000AB +:106DE000000101010101000000000000000000019D +:106DF0000101000000010101010101000101010088 +:106E00000000000000000000000000000000000181 +:106E10000101010000000101010101010101000166 +:106E2000010101010101010000000000000100005A +:106E3000000000000001010000000000010100004E +:106E40000000000000000000000000000000000042 +:106E5000000000000000000101010100010100002C +:106E60000000000000000000000000000000010021 +:106E7000000000000000000101010100010001000C +:106E80000000000000010000000000000000000001 +:106E900000000000000000000000000000000001F1 +:106EA00001010101010101010101010101010001D3 +:106EB00001010101010101000000010000000101C8 +:106EC00001010101010101010101010100010100B4 +:106ED00001010101010101000000000001000000AA +:106EE000000101010101000000000000000000019C +:106EF0000101010000010101010101000101010086 +:106F00000000000000000000000000000000000180 +:106F10000101010000000101010101010101000165 +:106F20000101010101010100000000000001000059 +:106F3000000000000001010101000000010100004B +:106F40000000000000000000000000000000000041 +:106F5000000000000000000101010100010100002B +:106F60000000000000000000000000000000010020 +:106F7000000000000000000101010100010001000B +:106F80000000000000010000000000000000000000 +:106F900000000000000000000000000000000001F0 +:106FA00001010101010101010101010101010001D2 +:106FB00001010101010101000000010000000101C7 +:106FC00001010101010101010101010101010101B1 +:106FD00001010101010101000000000001000001A8 +:106FE000010101010101000000000000000000019A +:106FF0000101010000010101010101000101010184 +:10700000000000000000000000000000000100017E +:107010000101010001000101010101010101000163 +:107020000101010101010100000000000001000058 +:10703000000000000001010101000000010100004A +:107040000000000000000000000000000000000040 +:107050000000000000000001010101010101000029 +:10706000000000000000000000000000000001001F +:10707000000000000000000101010100010001000A +:1070800000000000000101000000000000000000FE +:1070900000000000000000000000000000000001EF +:1070A00001010101010101010101010101010001D1 +:1070B00001010101010101010000010000000101C5 +:1070C00001010101010101010101010101010101B0 +:1070D00001010101010101010100000001000001A5 +:1070E0000101010101010000000000000000000199 +:1070F0000101010000010101010101010101010182 +:10710000000000000000000000000000000100017D +:107110000101010101010101010101010101000160 +:107120000101010101010100000000000001000057 +:107130000000000000010101010000000101000049 +:10714000000000000000000000000000000000003F +:107150000000000000000001010101010101010126 +:10716000010100000000000000000000000001001C +:107170000000000000000001010101000100010009 +:1071800000000000000101010100000000000000FB +:1071900000000000000000000000000000000002ED +:1071A00002010101010101010101010101010001CF +:1071B00001010101010101010000010000000102C3 +:1071C00002010101010101010101010101010101AE +:1071D00001010101010101010101010001010001A1 +:1071E0000101010101010000000000000000000198 +:1071F0000101010000010101010101010101010181 +:10720000000000000000000000000001000100017B +:10721000010101010101010101010101010100015F +:107220000101010101010100000000000101000055 +:107230000000000000010101010000000101000048 +:10724000000000000000000000000000000000013D +:107250000101000000000001010101010101010123 +:10726000010100000000000000000000000001001B +:107270000000000000000001010101000100010008 +:1072800000000000000101010100000000000000FA +:1072900000000000000000000000000000000002EC +:1072A00002020101010101010101010101010001CD +:1072B00001010101010101010100010000000102C1 +:1072C00002010101010101010101010101010101AD +:1072D00001010101010101010101010001010001A0 +:1072E0000101010101010000000000000000000197 +:1072F000010101010001010101010101010101017F +:107300000000000000000000000000010001010179 +:10731000010101010101010101010101010100015E +:107320000101010101010100000000000101000054 +:107330000000000000010101010000000101010046 +:10734000000000000000000000000000000000013C +:107350000101000000000001010101010101010122 +:107360000101010000000000000000000100010018 +:107370000000000000000001010101000100010007 +:1073800000000000000101010100000000000000F9 +:1073900000000000000000000000000000000002EB +:1073A00002020202010101010101010101010002C9 +:1073B00001020201010101010100010000000102BE +:1073C00002020101010101010101010101010101AB +:1073D000020101010101010101010101010100019D +:1073E0000102010101010100000000000000000194 +:1073F000010101010101010101010101010101017D +:107400000000010000000000000000010001010177 +:10741000010101010101010101010101010100015D +:107420000101010101010100000000000101000152 +:107430000100000000010101010000000101010044 +:10744000000000000000000000000000000000013B +:107450000101000000000001010101010101010121 +:107460000101010001000000000000000100010016 +:107470000000000000000001010101000100010006 +:1074800000000000000101010101010000000000F6 +:1074900000000000000000000000000000000002EA +:1074A00002020202010102010101010101010002C7 +:1074B00002020202010101010100010000000102BB +:1074C00002020202010102010101010101010101A7 +:1074D000020202010101010101010101010100019A +:1074E0000102010101010100000000000000000193 +:1074F000010101010101010101010101010101017C +:107500000000010000000000000000010001010176 +:10751000010101010101010101010101010100015C +:10752000010101010101010101000000010101014E +:107530000100000000010101010000000101010043 +:10754000000000000000000000000000000000013A +:107550000101000000000001010101010101010120 +:107560000101010001010000000001000100010013 +:107570000000000000000001010101000100010005 +:1075800000000000000101010101010000000000F5 +:1075900000000000000000000000000000000002E9 +:1075A00002020202020102020101010101010002C4 +:1075B00002020202010101010101010000000102B9 +:1075C00002020202010202010101010101010101A5 +:1075D0000202020201010101010101010101000198 +:1075E0000102020101010100000000000100000190 +:1075F000010101010101010101010101010101017B +:107600000000010000000000000001010101010173 +:10761000010101010101010101010101010100025A +:10762000020101010101010101000000010101014C +:107630000101000000010101010000000101010041 +:107640000000000000010000000000000100000137 +:10765000010101000000000101010101010101011E +:107660000101010001010000010001000100010011 +:107670000000000000000001010101000100010103 +:1076800001010000000101010101010000000000F2 +:1076900000000000000000000000000000000002E8 +:1076A00002020202020202020201010101010002C1 +:1076B00002020202010101010101010000000102B8 +:1076C00002020202020202020202010101010101A0 +:1076D0000202020201010101010101010101000197 +:1076E000010202010101010001000000010000028D +:1076F0000201010101010101010101010101010179 +:107700000000010000000000000001010101010172 +:107710000101010101010101010101010101000259 +:10772000020101010101010101000000010101014B +:10773000010100000101010101000000010101003F +:107740000000000000010000000000000100000136 +:10775000010101000100000101010101010101011C +:10776000010101010101010001010100010101000C +:107770000000000000000001010101000100010102 +:1077800001010000010101010101010000000000F0 +:1077900000000000000000000000000000000002E7 +:1077A00002020202020202020202010101010002BF +:1077B00002020202020202010101010100000102B3 +:1077C000020202020202020202020201010101029D +:1077D0000202020202010101010101010101000294 +:1077E0000202020101010100010101000100000289 +:1077F0000202010101010101010101010101010177 +:10780000000001010000000000000101010101026F +:107810000201010101010101010101010101010256 +:107820000201010101010101010001010101010148 +:10783000010101000101010101010100010101013A +:107840000000000000010100000000000100000134 +:107850000101010101010001010101010101010119 +:107860000101010101010101010101000101010109 +:107870000000000000000001010101000100010101 +:1078800001010000010101010101010000000000EF +:1078900000000000000000000000000000000002E6 +:1078A00002020202020202020202020101010002BD +:1078B00002020202020202010101020100000102B1 +:1078C000020202020202020202020201010101029C +:1078D0000202020202020101010101010101010291 +:1078E0000202020201010100010101000100000287 +:1078F0000202010101010101010101010101010176 +:10790000000001010000000000000101010101026E +:107910000202010101010101010101010101010254 +:107920000202010101010101010001010101010146 +:107930000101010001010101010101000101010139 +:107940000000000000010101010000000100000131 +:107950000101010101010001010101010101010118 +:107960000101010101010101010101010101010107 +:1079700000000000010000010101010001000101FF +:1079800001010000010101010101010000000000EE +:1079900000000000000000000000000000000002E5 +:1079A00002020202020202020202020101010002BC +:1079B00002020202020202020101020101000102AE +:1079C000020202020202020202020201010101029B +:1079D000020202020202020101010101010101028F +:1079E0000202020201020100010101000100000285 +:1079F0000202010101020101010101010101010174 +:107A0000000001010001000000000101010101026C +:107A10000202010101010101010101010101010253 +:107A20000202020101010101010101010101010143 +:107A30000101010101010101010101010101010136 +:107A4000010100000001010101000000010100012D +:107A50000101010101010001010101010101010117 +:107A60000101010101010101010101010101010106 +:107A700001010100010100010101010001010101F9 +:107A800001010100010101010101010000000000EC +:107A900000000000010000000000000000000102E2 +:107AA00002020202020202020202020202020002B8 +:107AB00002020202020202020201020101000102AC +:107AC0000202020202020202020202020101010299 +:107AD000020202020202020201010101010101028D +:107AE0000202020202020100010101000100000283 +:107AF0000202020101020201010101010101010270 +:107B0000000001010101000000000101010101026A +:107B1000020202010101020201010101010101024F +:107B20000202020101010101010101010101010142 +:107B30000101010101010101010101010101010135 +:107B4000010100000001010101000000010101012B +:107B50000101010101010001010101010101010116 +:107B60000101010101010101010101010101010105 +:107B700001010100010100010101010001010101F8 +:107B800001010100010101010101010000000000EB +:107B900000000000010100000000000001010102DE +:107BA00002020202020202020202020202020002B7 +:107BB00002020202020202020201020101010202A9 +:107BC0000202020202020202020202020102010297 +:107BD000020202020202020202010101010101028B +:107BE0000202020202020100010101000100000282 +:107BF000020202010102020101010101010101026F +:107C00000101010101010000000001010101010267 +:107C1000020202010101020202020201010101024B +:107C20000202020101010101010101010101010141 +:107C30000101010101010101010101010101010134 +:107C40000101010000010101010101010101010126 +:107C50000101010101010001010101010101010115 +:107C60000101010101010101010101010101010104 +:107C700001010100010101010101010101010101F5 +:107C800001010101010101010101010001000000E8 +:107C900000000000010100000000000001010102DD +:107CA00002020202020202020202020202020002B6 +:107CB00002020202020202020202020101010202A7 +:107CC0000202020202020202020202020102010296 +:107CD0000202020202020202020201010101010289 +:107CE0000202020202020101010101000100000280 +:107CF000020202010102020201010101010101026D +:107D00000101010101010000000001010101010266 +:107D10000202020101010202020202020101010249 +:107D2000020202020101010101010101010101013F +:107D30000101010101020101010101010101010132 +:107D40000101010001010101010101010101010223 +:107D50000201010101010001010101010101010113 +:107D60000101010101010101010101010101010103 +:107D700001010100010101010101010101010101F4 +:107D800001010101010101010101010001000100E6 +:107D900001010101010101000000010101010102D5 +:107DA00002020202020202020202020202020002B5 +:107DB00002020202020202020202020101010202A6 +:107DC0000202020202020202020202020202020293 +:107DD0000202020202020202020202010201010286 +:107DE000020202020202020101010101010000027D +:107DF0000202020201020202020201010101010269 +:107E00000101010101010000000001010101010265 +:107E10000202020201010202020202020101010247 +:107E2000020202020201010101010101010101023C +:107E30000201010101020101010101010101010130 +:107E40000101010001010101010101010101010222 +:107E5000020201010101010101010101010101020F +:107E60000201010101010101010101010101010101 +:107E700001010101010101010101010101010101F2 +:107E800001010101010101010101010101010100E3 +:107E900001010101010101010100010101010102D2 +:107EA00002020202020202020202020202020002B4 +:107EB00002020202020202020202020201010202A4 +:107EC0000202020202020202020202020202020292 +:107ED0000202020202020202020202020201010284 +:107EE000020202020202020101010101010000027C +:107EF0000202020201020202020202010101010267 +:107F00000101020101010000000001010101010263 +:107F10000202020201010202020202020202010244 +:107F20000202020202020201010101010101010239 +:107F3000020101010102020101010101010101012E +:107F40000101010001010101010101010101010221 +:107F5000020201010101010201010101010101020D +:107F600002020101010101010101010101010101FF +:107F700001010101010101010101010101010101F1 +:107F800001010101010101010101010101010100E2 +:107F900001010101010101010101010101010102D0 +:107FA00002020202020202020202020202020002B3 +:107FB00002020202020202020202020201010202A3 +:107FC0000202020202020202020202020202020291 +:107FD0000202020202020202020202020202010282 +:107FE0000202020202020201020101010101000279 +:107FF0000202020201020202020202010202010264 +:108000000101020101010100000101010101010260 +:108010000202020202010202020202020202010242 +:108020000202020202020201010101010102010237 +:10803000020201010102020101010101010101022B +:10804000010101010101010101010101010101021F +:10805000020201010101010202010101010101020B +:1080600002020101010101010101010101010101FE +:1080700001010101010101010101010101010101F0 +:1080800001010101010101010101010101010100E1 +:1080900001010101010101010101010101010102CF +:1080A00002020202020202020202020202020002B2 +:1080B00002020202020202020202020201010202A2 +:1080C0000202020202020202020202020202020290 +:1080D0000202020202020202020202020202010281 +:1080E0000202020202020201020201010101010276 +:1080F0000202020202020202020202010202010262 +:10810000010102010101010101010101010101025D +:108110000202020202020202020202020202010240 +:108120000202020202020201010101010102010236 +:108130000202010101020202010101010101010229 +:10814000020101010101010101010101010101021D +:108150000202020101010102020201010101010208 +:1081600002020201010101010101010101010101FC +:1081700001010101010101020201010101010102EC +:1081800002010101010101010101010101010100DF +:1081900001010101010101010101010101010102CE +:1081A00002020202020202020202020202020002B1 +:1081B00002020202020202020202020202010202A0 +:1081C000020202020202020202020202020202028F +:1081D0000202020202020202020202020202010280 +:1081E0000202020202020201020202010101010274 +:1081F000020202020202020202020202020202025F +:10820000020102020101010101010101010101025A +:10821000020202020202020202020202020201023F +:108220000202020202020201010101010102010235 +:108230000202020101020202020101010101010226 +:10824000020201010101010101010101010101021B +:108250000202020101010102020202010101010206 +:1082600002020201010101010101010101010102FA +:1082700001010101010101020202020101010102E9 +:1082800002020101010201010101010101010100DC +:1082900001010101010101010101010101010102CD +:1082A00002020202020202020202020202020002B0 +:1082B000020202020202020202020202020202029E +:1082C000020202020202020202020202020202028E +:1082D000020202020202020202020202020201027F +:1082E0000202020202020202020202010201010271 +:1082F000020202020202020202020202020202025E +:108300000202020201010101010101020101010257 +:10831000020202020202020202020202020201023E +:108320000202020202020201010101010102010234 +:108330000202020101020202020101010101010225 +:10834000020201010101010101010101010101021A +:108350000202020201010102020202010201010203 +:1083600002020201010101010101010101010102F9 +:1083700002010101010101020202020101010102E7 +:1083800002020101010202010101010101010100DA +:1083900001010101010101010101010101010102CC +:1083A00002020202020202020202020202020002AF +:1083B000020202020202020202020202020202029D +:1083C000020202020202020202020202020202028D +:1083D000020202020202020202020202020202027D +:1083E000020202020202020202020202020101026F +:1083F000020202020202020202020202020202025D +:108400000202020201010101010101020101010256 +:10841000020202020202020202020202020201023D +:108420000202020202020202010101010102010232 +:108430000202020201020202020101010101010223 +:108440000202020101020101010101010101010217 +:108450000202020201010102020202020201010201 +:1084600002020202010101010101010101010102F7 +:1084700002020101010101020202020102010102E4 +:1084800002020101010202020101010101010100D8 +:1084900002010101010101010101010101010102CA +:1084A00002020202020202020202020202020002AE +:1084B000020202020202020202020202020202029C +:1084C000020202020202020202020202020202028C +:1084D000020202020202020202020202020202027C +:1084E000020202020202020202020202020101026E +:1084F000020202020202020202020202020202025C +:108500000202020201020101010102020102010252 +:10851000020202020202020202020202020201023C +:108520000202020202020202020101010102010230 +:10853000020202020202020202010101020201021F +:108540000202020101020201010101010101010215 +:1085500002020202020101020202020202020102FE +:1085600002020202020101010101010101010202F4 +:1085700002020201010101020202020102010102E2 +:1085800002020201010202020201010101010100D5 +:1085900002020101010101010101010101010102C8 +:1085A00002020202020202020202020202020002AD +:1085B000020202020202020202020202020202029B +:1085C000020202020202020202020202020202028B +:1085D000020202020202020202020202020202027B +:1085E000020202020202020202020202020101026D +:1085F000020202020202020202020202020202025B +:108600000202020202020101010102020102010250 +:10861000020202020202020202020202020201023B +:10862000020202020202020202010101010201022F +:10863000020202020202020202010101020201021E +:108640000202020101020202010101010101010213 +:1086500002020202020201020202020202020102FC +:1086600002020202020201010101010101010202F2 +:1086700002020201010101020202020102010102E1 +:1086800002020201010202020201010101010100D4 +:1086900002020201010101010101010101010102C6 +:1086A00002020202020202020202020202020002AC +:1086B000020202020202020202020202020202029A +:1086C000020202020202020202020202020202028A +:1086D000020202020202020202020202020202027A +:1086E000020202020202020202020202020201026B +:1086F000020202020202020202020202020202025A +:10870000020202020202010101010202010201024F +:10871000020202020202020202020202020201023A +:10872000020202020202020202010101020201022D +:10873000020202020202020202020101020201021C +:108740000202020201020202020101010101010210 +:1087500002020202020201020202020202020102FB +:1087600002020202020202010101010101010202F0 +:1087700002020201010101020202020102010102E0 +:1087800002020202020202020202010101010100D0 +:1087900002020202010101010101010101010102C4 +:1087A00002020202020202020202020202020002AB +:1087B0000202020202020202020202020202020299 +:1087C0000202020202020202020202020202020289 +:1087D0000202020202020202020202020202020279 +:1087E000020202020202020202020202020201026A +:1087F0000202020202020202020202020202020259 +:10880000020202020202020101010202020202024B +:108810000202020202020202020202020202010239 +:108820000202020202020202020202020202010229 +:10883000020202020202020202020201020201021A +:10884000020202020202020202010101010101020E +:1088500002020202020201020202020202020202F9 +:1088600002020202020202020201010101010202ED +:1088700002020202020101020202020102010202DC +:1088800002020202020202020202020101010100CE +:1088900002020202020101010101010101010102C2 +:1088A00002020202020202020202020202020002AA +:1088B0000202020202020202020202020202020298 +:1088C0000202020202020202020202020202020288 +:1088D0000202020202020202020202020202020278 +:1088E0000202020202020202020202020202010269 +:1088F0000202020202020202020202020202020258 +:108900000202020202020202010102020202020249 +:108910000202020202020202020202020202010238 +:108920000202020202020202020202020202010228 +:108930000202020202020202020202020202020217 +:10894000020202020202020202020101020101020B +:1089500002020202020202020202020202020202F7 +:1089600002020202020202020202020101010202EA +:1089700002020202020201020202020102010202DA +:1089800002020202020202020202020101010100CD +:1089900002020202020201010101010101010102C0 +:1089A00002020202020202020202020202020002A9 +:1089B0000202020202020202020202020202020297 +:1089C0000202020202020202020202020202020287 +:1089D0000202020202020202020202020202020277 +:1089E0000202020202020202020202020202020267 +:1089F0000202020202020202020202020202020257 +:108A00000202020202020202020202020202020246 +:108A10000202020202020202020202020202010237 +:108A20000202020202020202020202020202020226 +:108A30000202020202020202020202020202020216 +:108A40000202020202020202020202020201010208 +:108A500002020202020202020202020202020202F6 +:108A600002020202020202020202020102010202E8 +:108A700002020202020202020202020102010202D8 +:108A800002020202020202020202020101010100CC +:108A900002020202020202010101010101010102BE +:108AA00002020202020202020202020202020002A8 +:108AB0000202020202020202020202020202020296 +:108AC0000202020202020202020202020202020286 +:108AD0000202020202020202020202020202020276 +:108AE0000202020202020202020202020202020266 +:108AF0000202020202020202020202020202020256 +:108B00000202020202020202020202020202020245 +:108B10000202020202020202020202020202020235 +:108B20000202020202020202020202020202020225 +:108B30000202020202020202020202020202020215 +:108B40000202020202020202020202020202010206 +:108B500002020202020202020202020202020202F5 +:108B600002020202020202020202020202010202E6 +:108B700002020202020202020202020102010202D7 +:108B800002020202020202020202020101010100CB +:108B900002020202020202020101010101010102BC +:108BA00002020202020202020202020202020002A7 +:108BB0000202020202020202020202020202020295 +:108BC0000202020202020202020202020202020285 +:108BD0000202020202020202020202020202020275 +:108BE0000202020202020202020202020202020265 +:108BF0000202020202020202020202020202020255 +:108C00000202020202020202020202020202020244 +:108C10000202020202020202020202020202020234 +:108C20000202020202020202020202020202020224 +:108C30000202020202020202020202020202020214 +:108C40000202020202020202020202020202010205 +:108C500002020202020202020202020202020202F4 +:108C600002020202020202020202020202020202E4 +:108C700002020202020202020202020102010202D6 +:108C800002020202020202020202020101010100CA +:108C900002020202020202020201010101010102BA +:108CA00002020202020202020202020202020002A6 +:108CB0000202020202020202020202020202010295 +:108CC0000202020202020202020202020202020284 +:108CD0000202020202020202020202020202020274 +:108CE0000202020202020202020202020202020264 +:108CF0000202020202020202020202020202020254 +:108D00000202020202020202020202020202020243 +:108D10000202020202020202020202020202020233 +:108D20000202020202020202020202020202020223 +:108D30000202020202020202020202020202020213 +:108D40000202020202020202020202020202020203 +:108D500002020202020202020202020202020202F3 +:108D600002020202020202020202020202020202E3 +:108D700002020202020202020202020202010202D4 +:108D800002020202020202020202020101010102C7 +:108D900002020202020202020202020201010102B6 +:108DA00002020202020202020202020202020002A5 +:108DB000020202020202020201010101010101029A +:108DC0000202020202020202020202020202020283 +:108DD0000202020202020202020202020202020273 +:108DE0000202020202020202020202020202020263 +:108DF0000202020202020202020202020202020253 +:108E00000202020202020202020202020202020242 +:108E10000202020202020202020202020202020232 +:108E20000202020202020202020202020202020222 +:108E30000202020202020202020202020202020212 +:108E40000202020202020202020202020202020202 +:108E500002020202020202020202020202020202F2 +:108E600002020202020202020202020202020202E2 +:108E700002020202020202020202020202020202D2 +:108E800002020202020202020202020201010102C5 +:108E900002020202020202020202020202020102B3 +:108EA00002020202020202020202020202020002A4 +:108EB000020202020201010101010101010101029C +:108EC0000202020202020202020202020202010283 +:108ED0000202020202020202020202020202020272 +:108EE0000202020202020202020202020202020262 +:108EF0000202020202020202020202020202020252 +:108F00000202020202020202020202020202020241 +:108F10000202020202020202020202020202020231 +:108F20000202020202020202020202020202020221 +:108F30000202020202020202020202020202020211 +:108F40000202020202020202020202020202020201 +:108F500002020202020202020202020202020202F1 +:108F600002020202020202020202020202020202E1 +:108F700002020202020202020202020202020202D1 +:108F800002020202020202020202020202010102C3 +:108F900002020202020202020202020202020202B1 +:108FA00002020202020202020202020202020002A3 +:108FB000020202010101010101010101010101029D +:108FC000020202020202010101010101010101028A +:108FD0000202020202020202020202020202020271 +:108FE0000202020202020202020202020202020261 +:108FF0000202020202020202020202020202020251 +:109000000202020202020202020202020202020240 +:109010000202020202020202020202020202020230 +:109020000202020202020202020202020202020220 +:109030000202020202020202020202020202020210 +:109040000202020202020202020202020202020200 +:1090500002020202020202020202020202020202F0 +:1090600002020202020202020202020202020202E0 +:1090700002020202020202020202020202020202D0 +:1090800002020202020202020202020202020102C1 +:1090900002020202020202020202020202020202B0 +:1090A00002020202020201010101010101010102A9 +:1090B000020201010101010101010101010101029D +:1090C000020202020201010101010101010101028A +:1090D0000202020202020202020202020202010271 +:1090E0000202020202020202020202020202020260 +:1090F0000202020202020202020202020202020250 +:10910000020202020202020202020202020202023F +:10911000020202020202020202020202020202022F +:10912000020202020202020202020202020202021F +:10913000020202020202020202020202020202020F +:1091400002020202020202020202020202020202FF +:1091500002020202020202020202020202020202EF +:1091600002020202020202020202020202020202DF +:1091700002020202020202020202020202020202CF +:1091800002020202020202020202020202020202BF +:1091900002020202020202020202020202020202AF +:1091A00002020201010101010101010101010102AB +:1091B000020101010101010101010101010101029D +:1091C000020202010101010101010101010101028B +:1091D0000202020202020201010101010101010277 +:1091E000020202020202020202020202020202025F +:1091F000020202020202020202020202020202024F +:10920000020202020202020202020202020202023E +:10921000020202020202020202020202020202022E +:10922000020202020202020202020202020202021E +:10923000020202020202020202020202020202020E +:1092400002020202020202020202020202020202FE +:1092500002020202020202020202020202020202EE +:1092600002020202020202020202020202020202DE +:1092700002020202020202020202020202020202CE +:1092800002020202020202020202020202020202BE +:1092900002020202020202020202020202020201AF +:1092A00001010101010101010101010101010101AE +:1092B000010101010101010101010101010101019E +:1092C000010101010101010101010101010101028D +:1092D0000202020201010101010101010101010279 +:1092E0000202020202020202020202010201020260 +:1092F000020202020202020202020202020202024E +:10930000020202020202020202020202020202023D +:10931000020202020202020202020202020202022D +:10932000020202020202020202020202020202021D +:10933000020202020202020202020202020202020D +:1093400002020202020202020202020202020202FD +:1093500002020202020202020202020202020202ED +:1093600002020202020202020202020202020202DD +:1093700002020202020202020202020202020202CD +:1093800002020202020202020202020202020202BD +:1093900002020202020202020202020202020201AE +:1093A00001010101010101010101010101010101AD +:1093B000010101010101010101010101010101019D +:1093C000010101010101010101010101010101028C +:1093D000020201010101010101010101010101027A +:1093E0000202020202020202010101010101010264 +:1093F000020202020202020202020202020202024D +:10940000020202020202020202020202020202023C +:10941000020202020202020202020202020202022C +:10942000020202020202020202020202020202021C +:10943000020202020202020202020202020202020C +:1094400002020202020202020202020202020202FC +:1094500002020202020202020202020202020202EC +:1094600002020202020202020202020202020202DC +:1094700002020202020202020202020202020202CC +:1094800002020202020202020202020202020202BC +:1094900002020202020202020202020202020201AD +:1094A00001010101010101010101010101010101AC +:1094B000010101010101010101010101010101019C +:1094C000010101010101010101010101010101028B +:1094D000010101010101010101010101010101027B +:1094E0000202020202010101010101010101010266 +:1094F000020202020202020202020202020202024C +:10950000020202020202020202020202020202023B +:10951000020202020202020202020202020202022B +:10952000020202020202020202020202020202021B +:10953000020202020202020202020202020202020B +:1095400002020202020202020202020202020202FB +:1095500002020202020202020202020202020202EB +:1095600002020202020202020202020202020202DB +:1095700002020202020202020202020202020202CB +:1095800002020202020202020202020202020202BB +:1095900002020202020202020202020202020201AC +:1095A00001010101010101010101010101010101AB +:1095B000010101010101010101010101010101019B +:1095C000010101010101010101010101010101018B +:1095D000010101010101010101010101010101027A +:1095E0000201010101010101010101010101010269 +:1095F000020202020202020202020202020202024B +:10960000020202020202020202020202020202023A +:10961000020202020202020202020202020202022A +:10962000020202020202020202020202020202021A +:10963000020202020202020202020202020202020A +:1096400002020202020202020202020202020202FA +:1096500002020202020202020202020202020202EA +:1096600002020202020202020202020202020202DA +:1096700002020202020202020202020202020202CA +:1096800002020202020202020202020202020202BA +:1096900002020202020202020202020202020201AB +:1096A00001010101010101010101010101010101AA +:1096B000010101010101010101010101010101019A +:1096C000010101010101010101010101010101018A +:1096D000010101010101010101010101010101017A +:1096E0000101010101010101010101010101010269 +:1096F000020202020202020202020202020202024A +:109700000202020202020202020202020202020239 +:109710000202020202020202020202020202020229 +:109720000202020202020202020202020202020219 +:109730000202020202020202020202020202020209 +:1097400002020202020202020202020202020202F9 +:1097500002020202020202020202020202020202E9 +:1097600002020202020202020202020202020202D9 +:1097700002020202020202020202020202020202C9 +:1097800002020202020202020202020202020202B9 +:1097900002020202020202020202020202020201AA +:1097A00001010101010101010101010101010101A9 +:1097B0000101010101010101010101010101010199 +:1097C0000101010101010101010101010101010189 +:1097D0000101010101010101010101010101010179 +:1097E0000101010101010101010101010101010268 +:1097F0000202020202020202020202020202020249 +:109800000202020202020202020202020202020238 +:109810000202020202020202020202020202020228 +:109820000202020202020202020202020202020218 +:109830000202020202020202020202020202020208 +:1098400002020202020202020202020202020202F8 +:1098500002020202020202020202020202020202E8 +:1098600002020202020202020202020202020202D8 +:1098700002020202020202020202020202020202C8 +:1098800002020202020202020202020202020202B8 +:1098900002020202020202020202020202020201A9 +:1098A00001010101010101010101010101010101A8 +:1098B0000101010101010101010101010101010198 +:1098C0000101010101010101010101010101010188 +:1098D0000101010101010101010101010101010178 +:1098E0000101010101010101010101010101010267 +:1098F0000202020202020202020202020202020248 +:109900000202020202020202020202020202020237 +:109910000202020202020202020202020202020227 +:109920000202020202020202020202020202020217 +:109930000202020202020202020202020202020207 +:1099400002020202020202020202020202020202F7 +:1099500002020202020202020202020202020202E7 +:1099600002020202020202020202020202020202D7 +:1099700002020202020202020202020202020202C7 +:1099800002020202020202020202020202020202B7 +:1099900002020202020202020202020202020201A8 +:1099A00001010101010101010101010101010101A7 +:1099B0000101010101010101010101010101010197 +:1099C0000101010101010101010101010101010187 +:1099D0000101010101010101010101010101010177 +:1099E0000101010101010101010101010101010266 +:1099F0000202020202020202020202020202020247 +:109A00000202020202020202020202020202020236 +:109A10000202020202020202020202020202020226 +:109A20000202020202020202020202020202020216 +:109A30000202020202020202020202020202020206 +:109A400002020202020202020202020202020202F6 +:109A500002020202020202020202020202020202E6 +:109A600002020202020202020202020202020202D6 +:109A700002020202020202020202020202020202C6 +:109A800002020202020202020202020202020202B6 +:109A900002020202020202020202020202020201A7 +:109AA00001010101010101010101010101010101A6 +:109AB0000101010101010101010101010101010196 +:109AC0000101010101010101010101010101010186 +:109AD0000101010101010101010101010101010176 +:109AE0000101010101010101010101010101010265 +:109AF0000202020202010101010101010101010250 +:109B00000202020202020202020202020202020235 +:109B10000202020202020202020202020202020225 +:109B20000202020202020202020202020202020215 +:109B30000202020202020202020202020202020205 +:109B400002020202020202020202020202020202F5 +:109B500002020202020202020202020202020202E5 +:109B600002020202020202020202020202020202D5 +:109B700002020202020202020202020202020202C5 +:109B800002020202020202020202020202020202B5 +:109B900002020202020202020202020202020201A6 +:109BA00001010101010101010101010101010101A5 +:109BB0000101010101010101010101010101010195 +:109BC0000101010101010101010101010101010185 +:109BD0000101010101010101010101010101010175 +:109BE0000101010101010101010101010101010165 +:109BF0000101010101010101010101010101010254 +:109C00000202020202020202020201010202020236 +:109C1000020202020202010101010101010102022C +:109C20000202020202020202020202020202020214 +:109C30000202020202020202020202020202020204 +:109C400002020202020202020202020202020202F4 +:109C500002020202020202020202020202020202E4 +:109C600002020202020202020202020202020202D4 +:109C700002020202020202020202020202020202C4 +:109C800002020202020202020202020202020202B4 +:109C900002020202020202020202020202020201A5 +:109CA00001010101010101010101010101010101A4 +:109CB0000101010101010101010101010101010194 +:109CC0000101010101010101010101010101010184 +:109CD0000101010101010101010101010101010174 +:109CE0000101010101010101010101010101010164 +:109CF0000101010101010101010101010101010253 +:109D0000020202020201010101010101010101013E +:109D10000101010101010101010101010101010232 +:109D20000202020202020202020202020201020214 +:109D30000202020202020202020202020202020203 +:109D400002020202020202020202020202020202F3 +:109D500002020202020202020202020202020202E3 +:109D600002020202020202020202020202020202D3 +:109D700002020202020202020202020202020202C3 +:109D800002020202020202020202020202020202B3 +:109D900002020202020202020202020202020201A4 +:109DA00001010101010101010101010101010101A3 +:109DB0000101010101010101010101010101010193 +:109DC0000101010101010101010101010101010183 +:109DD0000101010101010101010101010101010173 +:109DE0000101010101010101010101010101010163 +:109DF0000101010101010101010101010101010153 +:109E00000202010101010101010101010101010140 +:109E10000101010101010101010101010101010132 +:109E20000101010101010101010101010101010221 +:109E30000202020202020202020202020202020202 +:109E400002020202020202020202020202020202F2 +:109E500002020202020202020202020202020202E2 +:109E600002020202020202020202020202020202D2 +:109E700002020202020202020202020202020202C2 +:109E800002020202020202020202020202020202B2 +:109E900002020202020202020202020202020201A3 +:109EA00001010101010101010101010101010101A2 +:109EB0000101010101010101010101010101010192 +:109EC0000101010101010101010101010101010182 +:109ED0000101010101010101010101010101010172 +:109EE0000101010101010101010101010101010162 +:109EF0000101010101010101010101010101010152 +:109F00000101010101010101010101010101010141 +:109F10000101010101010101010101010101010131 +:109F20000101010101010101010101010101010220 +:109F3000020202020201010101010101010101020B +:109F400002020202020101010101010101010102FB +:109F500002020202020202020202020202020202E1 +:109F600002020202020202020202020202020202D1 +:109F700002020202020202020202020202020202C1 +:109F800002020202020202020202020202020202B1 +:109F900002020202020202020202020202020201A2 +:109FA00001010101010101010101010101010101A1 +:109FB0000101010101010101010101010101010191 +:109FC0000101010101010101010101010101010181 +:109FD0000101010101010101010101010101010171 +:109FE0000101010101010101010101010101010161 +:109FF0000101010101010101010101010101010151 +:10A000000101010101010101010101010101010140 +:10A010000101010101010101010101010101010130 +:10A020000101010101010101010101010101010120 +:10A030000101010101010101010101010101010110 +:10A0400001010101010101010101010101010102FF +:10A0500002020202020202010101010101010102E8 +:10A0600002020202020202020202020202020202D0 +:10A0700002020202020202020202020202020202C0 +:10A0800002020202020202020202020202020202B0 +:10A0900002020202020202020202020202020201A1 +:10A0A00001010101010101010101010101010101A0 +:10A0B0000101010101010101010101010101010190 +:10A0C0000101010101010101010101010101010180 +:10A0D0000101010101010101010101010101010170 +:10A0E0000101010101010101010101010101010160 +:10A0F0000101010101010101010101010101010150 +:10A10000010101010101010101010101010101013F +:10A11000010101010101010101010101010101012F +:10A12000010101010101010101010101010101011F +:10A13000010101010101010101010101010101010F +:10A1400001010101010101010101010101010101FF +:10A1500001010101010101010101010101010102EE +:10A1600002020202020202020202020202020202CF +:10A1700002020202020202020202020202020202BF +:10A1800002020202020202020202020202020202AF +:10A1900002020202020202020202020202020201A0 +:10A1A000010101010101010101010101010101019F +:10A1B000010101010101010101010101010101018F +:10A1C000010101010101010101010101010101017F +:10A1D000010101010101010101010101010101016F +:10A1E000010101010101010101010101010101015F +:10A1F000010101010101010101010101010101014F +:10A20000010101010101010101010101010101013E +:10A21000010101010101010101010101010101012E +:10A22000010101010101010101010101010101011E +:10A23000010101010101010101010101010101010E +:10A2400001010101010101010101010101010101FE +:10A2500001010101010101010101010101010102ED +:10A2600002020202020202020202020202020102CF +:10A2700002020202020202020202020202020202BE +:10A2800002020202020202020202020202020202AE +:10A29000020202020202020202020202020202019F +:10A2A000010101010101010101010101010101019E +:10A2B000010101010101010101010101010101018E +:10A2C000010101010101010101010101010101017E +:10A2D000010101010101010101010101010101016E +:10A2E000010101010101010101010101010101015E +:10A2F000010101010101010101010101010101014E +:10A30000010101010101010101010101010101013D +:10A31000010101010101010101010101010101012D +:10A32000010101010101010101010101010101011D +:10A33000010101010101010101010101010101010D +:10A3400001010101010101010101010101010101FD +:10A3500001010101010101010101010101010101ED +:10A3600001010101010101010101010101010102DC +:10A3700002020202020202020202020202020202BD +:10A3800002020202020202020202020202020202AD +:10A39000020202020202020202020202020202019E +:10A3A000010101010101010101010101010101019D +:10A3B000010101010101010101010101010101018D +:10A3C000010101010101010101010101010101017D +:10A3D000010101010101010101010101010101016D +:10A3E000010101010101010101010101010101015D +:10A3F000010101010101010101010101010101014D +:10A40000010101010101010101010101010101013C +:10A41000010101010101010101010101010101012C +:10A42000010101010101010101010101010101011C +:10A43000010101010101010101010101010101010C +:10A4400001010101010101010101010101010101FC +:10A4500001010101010101010101010101010101EC +:10A4600001010101010101010101010101010102DB +:10A4700002020202020202020202020202020202BC +:10A4800002020202020101010101010202020202B2 +:10A49000020202020202020202020202020202019D +:10A4A000010101010101010101010101010101019C +:10A4B000010101010101010101010101010101018C +:10A4C000010101010101010101010101010101017C +:10A4D000010101010101010101010101010101016C +:10A4E000010101010101010101010101010101015C +:10A4F000010101010101010101010101010101014C +:10A50000010101010101010101010101010101013B +:10A51000010101010101010101010101010101012B +:10A52000010101010101010101010101010101011B +:10A53000010101010101010101010101010101010B +:10A5400001010101010101010101010101010101FB +:10A5500001010101010101010101010101010101EB +:10A5600001010101010101010101010101010102DA +:10A5700002020202020202010101010201020101C2 +:10A5800001010101010101010101010101010102BA +:10A5900001010101010101010101010101010101AB +:10A5A000010101010101010101010101010101019B +:10A5B000010101010101010101010101010101018B +:10A5C000010101010101010101010101010101017B +:10A5D000010101010101010101010101010101016B +:10A5E000010101010101010101010101010101015B +:10A5F000010101010101010101010101010101014B +:10A60000010101010101010101010101010101013A +:10A61000010101010101010101010101010101012A +:10A62000010101010101010101010101010101011A +:10A63000010101010101010101010101010101010A +:10A6400001010101010101010101010101010101FA +:10A6500001010101010101010101010101010101EA +:10A6600001010101010101010101010101010101DA +:10A6700001010101010101010101010101010101CA +:10A6800001010101010101010101010101010100BB +:10A6900000000000000000000000000000000001B9 +:10A6A000010101010101010101010101010101019A +:10A6B000010101010101010101010101010101018A +:10A6C000010101010101010101010101010101017A +:10A6D000010101010101010101010101010101016A +:10A6E000010101010101010101010101010101015A +:10A6F000010101010101010101010101010101014A +:10A700000101010101010101010101010101010139 +:10A710000101010101010101010101010101010129 +:10A720000101010101010101010101010101010119 +:10A730000101010101010101010101010101010109 +:10A7400001010101010101010101010101010101F9 +:10A7500001010101010101010101010101010101E9 +:10A7600001010101010101010101010101010101D9 +:10A7700001010101010101010101010101010101C9 +:10A7800001010101010101010101010101010100BA +:10A7900000000000000000000000000000000001B8 +:10A7A0000101010101010101010101010101010199 +:10A7B0000101010101010101010101010101010189 +:10A7C0000101010101010101010101010101010179 +:10A7D0000101010101010101010101010101010169 +:10A7E0000101010101010101010101010101010159 +:10A7F0000101010101010101010101010101010149 +:10A800000101010101010101010101010101010138 +:10A810000101010101010101010101010101010128 +:10A820000101010101010101010101010101010118 +:10A830000101010101010101010101010101010108 +:10A8400001010101010101010101010101010101F8 +:10A8500001010101010101010101010101010101E8 +:10A8600001010101010101010101010101010101D8 +:10A8700001010101010101010101010101010101C8 +:10A8800001010101010101010101010101010100B9 +:10A8900000000000000000000000000000000001B7 +:10A8A0000101010101010101010101010101010198 +:10A8B0000101010101010101010101010101010188 +:10A8C0000101010101010101010101010101010178 +:10A8D0000101010101010101010101010101010168 +:10A8E0000101010101010101010101010101010158 +:10A8F0000101010101010101010101010101010148 +:10A900000101010101010101010101010101010137 +:10A910000101010101010101010101010101010127 +:10A920000101010101010101010101010101010117 +:10A930000101010101010101010101010101010107 +:10A9400001010101010101010101010101010101F7 +:10A9500001010101010101010101010101010101E7 +:10A9600001010101010101010101010101010101D7 +:10A9700001010101010101010101010101010101C7 +:10A9800001010101010101010101010101010100B8 +:10A9900000000000000000000000000000000000B7 +:10A9A00000000000000000000000000000000002A5 +:10A9B0000202020202020202020202020202020277 +:10A9C0000202020202020202020202020202020267 +:10A9D0000202020202020202020202020202020257 +:10A9E0000202020202020202020202020202020049 +:10A9F0000000000000000000000000000000000057 +:10AA00000000000000000000000000000000000244 +:10AA10000202020202020202020202020202020216 +:10AA20000202020202020202020202020202020206 +:10AA300002020202020202020202020202020202F6 +:10AA400002020202020202020202020202020202E6 +:10AA500002020202020202020202020202020202D6 +:10AA600002020202020202020202020202020200C8 +:10AA700000000000000000000000000000000002D4 +:10AA800002020202020202020202020202020200A8 +:10AA900000000000000000000000000000000000B6 +:10AAA00000000000000000000000000000000002A4 +:10AAB0000202020202020202020202020202020276 +:10AAC0000202020202020202020202020202020266 +:10AAD0000202020202020202020202020202020256 +:10AAE0000202020202020202020202020202020048 +:10AAF0000000000000000000000000000000000056 +:10AB00000000000000000000000000000000000045 +:10AB10000000000000000000000000000000000035 +:10AB20000000000000000000000000000000000025 +:10AB30000000000000000000000000000000000213 +:10AB400002020202020202020202020202020202E5 +:10AB500002020202020202020202020202020200D7 +:10AB600000000000000000000000000000000000E5 +:10AB700000000000000000000000000000000002D3 +:10AB800002020202020202020202020202020200A7 +:10AB900000000000000000000000000000000000B5 +:10ABA00000000000000000000000000000000000A5 +:10ABB0000000000000000000000000000000000095 +:10ABC0000000000000000000000000000000000085 +:10ABD0000000000000000000000000000000000075 +:10ABE0000000000000000000000000000000000065 +:10ABF0000000000000000000000000000000000055 +:10AC00000000000000000000000000000000000044 +:10AC10000000000000000000000000000000000034 +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000000000000000000000014 +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000000F4 +:10AC600000000000000000000000000000000000E4 +:10AC700000000000000000000000000000000000D4 +:10AC800000000000000000000000000000000000C4 +:10AC90000000000000000000000000000000004272 +:10ACA00000000000000000000000000000000000A4 +:10ACB0000000000000000000000000000000000094 +:10ACC0000000000000000000000000000000000084 +:10ACD0000000000000000000000000000000000074 +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000000000000000054 +:10AD00000000000000000000000000000000000043 +:10AD10000000000000000000000000000000000033 +:10AD20000001000000010000000000000000000021 +:10AD30000000000000000000010000000000000012 +:10AD40000000000000000000000100000000000002 +:10AD500000000000000000000000000000000000F3 +:10AD600000000000000000000000000000000000E3 +:10AD700000000000000000000000000000000000D3 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000000000000000000000A3 +:10ADB0000000000000000000000000000000000093 +:10ADC0000000000000000000000000000000000083 +:10ADD0000000000000000000000000000000000073 +:10ADE0000000000000000000000000000000000063 +:10ADF0000000000000000000000000000000000053 +:10AE00000000000000000000000000010000000041 +:10AE10000000000000000000000000000000010130 +:10AE2000000100000101000000000000000000001F +:10AE3000000000000000000001010100000000000F +:10AE40000000000000000000010100000000000000 +:10AE500000000000000000000000000000000000F2 +:10AE600000000000000000000000000000000000E2 +:10AE700000000000000000000000000000000000D2 +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000000000000000000B2 +:10AEA00000000000000000000000000000000001A1 +:10AEB0000000000000000000000000000100000091 +:10AEC0000000000000000000000000000000000082 +:10AED0000000000000000000000000000000000072 +:10AEE0000000000000000000000000000000000062 +:10AEF0000000000000000000000000000000000052 +:10AF00000000000000000000000000010000000040 +:10AF1000000000000000000000000000000001012F +:10AF2000000100000101010000000000000000001D +:10AF3000000000000000000001010100000000000E +:10AF400000000000000000000101010000000000FE +:10AF500000000000010000000100000000000000EF +:10AF600000000000000000000000000000000000E1 +:10AF700000000000000000000000000000000000D1 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000001A0 +:10AFB0000000000000000000000000000100000090 +:10AFC0000000000000000000000000000000000081 +:10AFD0000000000000000000000000000000000071 +:10AFE0000000000000000000000000000000000061 +:10AFF0000000000000000000000000000000000051 +:10B00000000000000000000000000001000000003F +:10B01000000000000000000000000000000001012E +:10B02000010100000101010000000000000000001B +:10B03000000000000000000001010100000000000D +:10B0400000000000000000000101010000000000FD +:10B0500000000000010000000101000000000000ED +:10B0600000000000000000000000000000000000E0 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A000000000000000000000000000000000019F +:10B0B000000000000000000000000000010000008F +:10B0C0000000000000000000000000000000000080 +:10B0D0000000000000000000000000000000000070 +:10B0E000000000000000000001000000000000005F +:10B0F000000000010000000000000000000000004F +:10B10000000000000000000000000001000000003E +:10B11000000000000000000000000000000001012D +:10B120000101000101010100000000000000000019 +:10B13000000000000000000101010100000000000B +:10B1400000000000000000000101010001000000FB +:10B1500000000000010000000101000000000000EC +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000000019E +:10B1B000000000000000000000000000010000008E +:10B1C000000000000000000100000000000000007E +:10B1D000000000000000000000000000000000006F +:10B1E000000000000000000001000001010000015B +:10B1F000000001010000000000000000000000004D +:10B20000000000000000000000000001000000003D +:10B21000000000000000000000000000000001012C +:10B220000101010101010100000000000000000017 +:10B230000000000000000001010101010101000007 +:10B2400000000000000000010101010001000000F9 +:10B2500000000000010000000101010000000000EA +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000001000000019C +:10B2B000000000000000000000000100010000008C +:10B2C000000000000000000100000000000000007D +:10B2D000000000000000000000000000000000006E +:10B2E0000000000000000001010000010100000159 +:10B2F000000101010000000000000000000000004B +:10B30000000000000000000100000001000000003B +:10B31000000000000000000001000000000001012A +:10B320000101010101010101000000000000000015 +:10B330000000000000000001010101010101000006 +:10B3400000000000000000010101010101010000F6 +:10B3500000000000010000000101010000000000E9 +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000001000000019B +:10B3B000000000000000000000000100010000008B +:10B3C000000000000000000100000001000000007B +:10B3D000000000000000000000000000000001016B +:10B3E0000000000000000001010000010101000157 +:10B3F0000101010100000000000000000000000049 +:10B40000000000000000000100000001000000003A +:10B410000000000000000000010100000000010128 +:10B420000101010101010101000000010000000013 +:10B430000000000000000001010101010101000005 +:10B4400000000000010000010101010101010000F4 +:10B4500000000000010000000101010101010000E5 +:10B4600000000000000000000100000000000000DB +:10B4700000000000000000000000000000000000CC +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000001000000019A +:10B4B0000100000000000000000001000101000187 +:10B4C0000100000000000001000000010000000178 +:10B4D0000000000000000001000000000000010169 +:10B4E0000001000000000101010000010101000154 +:10B4F0000101010100000000000000000000000048 +:10B500000000000000000001000000010000000039 +:10B510000000000000000001010100000000010126 +:10B520000101010101010101000000010000000012 +:10B530000000000000000001010101010101000004 +:10B5400000000000010100010101010101010100F1 +:10B5500000000000010000010101010101010000E3 +:10B5600000000000000000000101010000000000D8 +:10B5700000000000000000000000000000000000CB +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A0000000000000000000000000010000000199 +:10B5B0000101000000000000000001000101000185 +:10B5C0000101000000000001000000010000000176 +:10B5D0000000000000000001000000000000010168 +:10B5E0000101000000000101010100010101000151 +:10B5F0000101010100000000000000000000000047 +:10B600000000000000000001000000010000000038 +:10B610000000000000000001010100000000010125 +:10B62000010101010101010100000001010000010F +:10B630000000000000000001010101010101010101 +:10B6400001000000010100010101010101010100EF +:10B6500000000000010100010101010101010101DF +:10B6600000000000010000010101010000000000D5 +:10B6700000000000000000000001010000000000C8 +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A0000000000000000000000001010100000196 +:10B6B0000101000000000000000001000101010183 +:10B6C0000101010000000001010000010000000173 +:10B6D0000000000000000001010000000000010166 +:10B6E000010100000001010101010001010100014F +:10B6F0000101010100000000000000000000000046 +:10B700000000000000000001000000010000000037 +:10B710000000000000000001010100000000010124 +:10B72000010101010101010100000001010000010E +:10B730000000000000000001010101010101010100 +:10B7400001000001010101010101010101010101EB +:10B7500001000000010100010101010101010101DD +:10B7600000000000010100010101010000000000D3 +:10B7700000000000000000000001010000000000C7 +:10B7800000000000000000000000000000010101B6 +:10B7900000000000010000000000000000000000A8 +:10B7A0000000000000000000000001010100000195 +:10B7B0000101000000010001000001000101010180 +:10B7C0000101010000000001010100010000000171 +:10B7D0000000000000000001010000010000010164 +:10B7E000010100000001010101010001010101014D +:10B7F0000101010100000000000000000000000045 +:10B800000000000000000001000000010000000036 +:10B810000000000000000001010101000000010122 +:10B82000010101010101010100000001010101010B +:10B8300000000100010000010101010101010101FD +:10B8400001000001010101010101010101010101EA +:10B8500001000001010101010101010101010101DA +:10B8600001000000010100010101010000000000D1 +:10B8700000000000000000000001010001000000C5 +:10B8800000000000000000000000000000010101B5 +:10B8900000000000010100000000000000000000A6 +:10B8A0000000000000000000000001010101000193 +:10B8B000010100000001000100000100010101017F +:10B8C000010101010000000101010001000000016F +:10B8D0000000000000000001010000010000010163 +:10B8E000010100000001010101010001010101014C +:10B8F0000101010100000000000000000000000044 +:10B900000000000000000101000000010000000034 +:10B910000000000000000001010101000000010121 +:10B92000010101010101010100000001010101010A +:10B9300000000100010000010101010101010101FC +:10B9400001010001010101010101010101010101E8 +:10B9500001000101010101010101010101010101D8 +:10B9600001010001010101010101010101000000CB +:10B9700000000000000000000001010001000000C4 +:10B9800000000000000000000000000000010101B4 +:10B9900001000100010100000000000000000000A3 +:10B9A0000000000000000001000001010101000191 +:10B9B000010100000001000101000100010101017D +:10B9C000010101010000010101010001000001016C +:10B9D0000000000000000001010100010000010161 +:10B9E0000101010000010101010101010101010149 +:10B9F0000101010100000000000000000000000043 +:10BA00000000000000000101000100010001000031 +:10BA10000000000000000001010101000000010120 +:10BA20000101010101010101000000010101010109 +:10BA300000000100010000010101010101010101FB +:10BA400001010101010101010101010101010101E6 +:10BA500001010101010101010101010101010101D6 +:10BA600001010101010101010101010101000000C9 +:10BA700000000000000000000001010101000000C2 +:10BA800000000000000000000000000000010101B3 +:10BA9000010101010101010000000000000000009F +:10BAA000000000000000000100010101010101018E +:10BAB000010100000001000101010101010101017A +:10BAC000010101010100010101010001000001016A +:10BAD0000000000000000001010100010000010160 +:10BAE0000101010000010101010101010101010148 +:10BAF0000101010100000001010000000000000040 +:10BB00000000000000000101000100010001000030 +:10BB1000000000000100000101010100000001011E +:10BB20000101010101010101000000010101010108 +:10BB300000000101010001010101010101010101F8 +:10BB400001010101010101010101010101010101E5 +:10BB500001010101010101010101010101010101D5 +:10BB600001010101010101010101010101010101C5 +:10BB700000000000010000000001010101000000C0 +:10BB800000000000000000000000000000010101B2 +:10BB9000010101010101010000000000000000009E +:10BBA000000000000000000101010101010101018C +:10BBB0000101000000010001010101010101010179 +:10BBC0000101010101000102010101010100010166 +:10BBD000000000000100000101010101010001015C +:10BBE0000101010001010101010101010101010146 +:10BBF000010101010000000101010001000000003D +:10BC0000000000000100010200010101000101002B +:10BC1000000100000100000101010100000001011C +:10BC20000101010101010101000100010101010106 +:10BC300001000101010001010101010101010101F6 +:10BC400001010101010101010101010101010101E4 +:10BC500001010101010101010101010101010101D4 +:10BC600001010101010101010101010101010101C4 +:10BC700000000000010100000001010101010101BB +:10BC800000000000000000000000000000010101B1 +:10BC9000010101010101010000000000000000009D +:10BCA000000000000000000101010101010101018B +:10BCB0000101010000010001010101010201010176 +:10BCC0000101010101000102010101010100010165 +:10BCD0000000000101000002010101010100010159 +:10BCE0000101010001010102020101010101010143 +:10BCF000010101010000000101010001000000003C +:10BD00000000000001010102000101010001010029 +:10BD1000000100000100000101010100000001011B +:10BD20000101010101010101010100010101010104 +:10BD300001010101010001010101010101010101F4 +:10BD400001010101010101010101010101010101E3 +:10BD500001010101010101010101010101010101D3 +:10BD600001010101010101010101010101010101C3 +:10BD700001000000010100000001010101010101B9 +:10BD800000000000000000000000000000010101B0 +:10BD9000010101010101010000010000000000009B +:10BDA000000000000000000101010101010101018A +:10BDB0000101010000010001010102010201010174 +:10BDC0000101010101010102010101010100010163 +:10BDD0000000000101000002010101010100010158 +:10BDE0000101010001010102020101010101010142 +:10BDF0000101010100000001010101010100010137 +:10BE00000000000001010102000101020001010027 +:10BE10000001000001000001010101010000010119 +:10BE20000101010101010101010100010101010103 +:10BE300001010101010001010101010101010101F3 +:10BE400001010101010101010101010101010101E2 +:10BE500001010101010101010101010101010101D2 +:10BE600001010101010101010101010101010101C2 +:10BE700001010001010101000001010101010101B5 +:10BE800001000000000000000000000000010101AE +:10BE90000101010101010100010100000000000099 +:10BEA0000000000000000001010101020101010287 +:10BEB0000101010000010002010102010201010172 +:10BEC0000101010101010102010101010100010162 +:10BED0000000000101000102020101010100010155 +:10BEE0000101010001010102020101020101010140 +:10BEF0000101010101000001010101010100010135 +:10BF00000000000001010102010101020001010025 +:10BF10000101010001000001010101010000010116 +:10BF20000101010101010101010100010101010102 +:10BF300001010101010001010101010101010101F2 +:10BF400001010101010101010101010101010101E1 +:10BF500001010101010101010101010101010101D1 +:10BF600001010101010101010101010101010101C1 +:10BF700001010101010101000001010101010101B3 +:10BF800001010000000100000000000000010101AB +:10BF90000101010101010100010101000000000097 +:10BFA0000000000000000001010101020101010286 +:10BFB0000101010100010002010102010201010170 +:10BFC000010101010101010202010102010101015E +:10BFD0000000000101000102020101010101020152 +:10BFE000010101000101010202010102020101013E +:10BFF0000101010101000001010101010101010133 +:10C000000100010001010102010101020001010022 +:10C010000101010101000001010101010101010112 +:10C020000101010101010101010101010101010100 +:10C0300001010101010001010201010101010101F0 +:10C0400001010101010101010101010101010101E0 +:10C0500001010101010101010101010101010101D0 +:10C0600001010101010101010101010101010101C0 +:10C0700001010101010101000001010101010101B2 +:10C0800001010100010100000000000000010101A8 +:10C090000101010101010100010101000000000096 +:10C0A0000000000000000002010102020101010283 +:10C0B000010101010001000202010201020201016D +:10C0C000020101010101010202010102010101015C +:10C0D000000000010100010202010102010102024F +:10C0E000010101000101010202020102020101023B +:10C0F0000101010101000001010101010101010132 +:10C10000010101010101010201010102000101001F +:10C11000010101010100000202010101010101010F +:10C1200001010101010101020101010101010101FE +:10C1300001010101010001020201010101010101EE +:10C1400001010101010101010201010101010101DE +:10C1500001010101010101010101010101010101CF +:10C1600001010101010101010101010101010101BF +:10C1700001010101010101000001010101010101B1 +:10C1800001010100010101000000000000010101A6 +:10C190000101010101010100010101010101010190 +:10C1A0000000000001000002010102020201010280 +:10C1B0000202010100010002020102010202020268 +:10C1C0000202020101010102020201020101010257 +:10C1D000000000010100010202020102010102024D +:10C1E0000202010001010102020201020202010237 +:10C1F000020202020100000201010101010101012C +:10C20000010101010101010201010102000101001E +:10C21000010101010100000202010101010102010D +:10C2200001010101010101020101010101010101FD +:10C2300001010101010001020202020101010101EB +:10C2400001010101010101020202010101010101DB +:10C2500001010101010101010201010101010101CD +:10C2600001010101010101010101010101010101BE +:10C2700001010101010101000001010101010101B0 +:10C2800001010100010101000100000000010101A4 +:10C29000010101010101010001010101010101018F +:10C2A000000000000101000202010202020101027D +:10C2B0000202010100010002020202020202020265 +:10C2C0000202020201010102020201020101010255 +:10C2D000000001010100010202020202010102024A +:10C2E0000202010001010102020202020202010235 +:10C2F000020202020100000202010101010101012A +:10C30000010101010101010201010102000101001D +:10C310000101010101000102020201010101020209 +:10C3200001020101010101020101010101010101FB +:10C3300001010101010001020202020101010101EA +:10C3400001010101010101020202020101010101D9 +:10C3500001010101010101010201010101010101CC +:10C3600001010101010101010101010101010101BD +:10C3700001010101010101000101010101010101AE +:10C3800001010101010101000101000000010101A1 +:10C39000010101010101010001010101010101018E +:10C3A0000100000001010002020202020202010279 +:10C3B0000202010100010002020202020202020264 +:10C3C0000202020201010102020202020101010253 +:10C3D0000100010101000102020202020201020247 +:10C3E0000202020001010102020202020202020232 +:10C3F0000202020201000002020101010101010129 +:10C400000101010101010102020201020101010118 +:10C410000101010101000102020201010101020208 +:10C4200002020101010101020101010101010101F9 +:10C4300001010101010001020202020101010101E9 +:10C4400001010101010101020202020101010101D8 +:10C4500001010101010101020202010101010101C9 +:10C4600001010101010101020201010101010101BA +:10C4700001010101010101000101010101010101AD +:10C4800001010101010101000101000000010101A0 +:10C49000010101010101010001010101010101018D +:10C4A0000101000101010102020202020202020274 +:10C4B0000202010101010002020202020202020262 +:10C4C0000202020201010102020202020201020250 +:10C4D0000100010201010102020202020201020244 +:10C4E0000202020101010102020202020202020230 +:10C4F0000202020201000002020201020101010126 +:10C500000101010101010102020202020101010116 +:10C510000101010101000102020202010101020206 +:10C5200002020101010101020101010201010101F7 +:10C5300001010101010001020202020201010101E7 +:10C5400001010101010101020202020101010101D7 +:10C5500001010101010101020202020101010101C7 +:10C5600001010101010101020201010101010101B9 +:10C5700001010101010101000102020101010101AA +:10C58000010101010101010001010100000101019E +:10C59000010101010101010001010101010101018C +:10C5A0000101010101010102020202020202020272 +:10C5B0000202020101010002020202020202020260 +:10C5C000020202020201010202020202020102024E +:10C5D0000100010202010102020202020201020242 +:10C5E000020202010102020202020202020202022D +:10C5F0000202020201000002020202020101010124 +:10C600000101010101010102020202020102010114 +:10C610000101010101000102020202010101020205 +:10C6200002020202020201020101010201010101F2 +:10C6300001010101010001020202020202010101E5 +:10C6400001010101010101020202020202010101D4 +:10C6500001010101010101020202020101010101C6 +:10C6600001010101010101020202020101010101B6 +:10C6700001010101010101000102020101010101A9 +:10C68000010101010101010101010100000101019C +:10C69000010101010101010001010101010101018B +:10C6A0000101010101010102020202020202020271 +:10C6B000020202010102000202020202020202025E +:10C6C000020202020201020202020202020102024C +:10C6D000010101020201010202020202020202023F +:10C6E000020202010102020202020202020202022C +:10C6F0000202020201000102020202020201020120 +:10C700000101010101010102020202020102020112 +:10C710000102010101010102020202010101020202 +:10C7200002020202020201020101010202010101F0 +:10C7300001010101010001020202020202020101E3 +:10C7400001010101010101020202020202010101D3 +:10C7500001010101010101020202020201010101C4 +:10C7600001010101010101020202020101010101B5 +:10C7700001010101010101010102020101010101A7 +:10C78000010101010101010101010100000101019B +:10C79000010101010101010001010101010101018A +:10C7A0000101010101010102020202020202020270 +:10C7B000020202020102000202020202020202025C +:10C7C0000202020202020202020202020202020249 +:10C7D000010102020201010202020202020202023D +:10C7E000020202010202020202020202020202022A +:10C7F000020202020100010202020202020102021E +:10C800000101010101010102020202020102020111 +:10C8100002020201010101020202020101010202FF +:10C8200002020202020202020202010202010101EC +:10C8300001010101010001020202020202020101E2 +:10C8400001010101010101020202020202020101D1 +:10C8500001010101010101020202020202010101C2 +:10C8600001010101010101020202020101010101B4 +:10C8700001010101010101010102020202010101A4 +:10C88000010101010101010101010100000101019A +:10C890000101010101010100010101010101010189 +:10C8A000010101010101010202020202020202026F +:10C8B000020202020102000202020202020202025B +:10C8C0000202020202020202020202020202020248 +:10C8D000020102020201010202020202020202023B +:10C8E0000202020102020202020202020202020229 +:10C8F000020202020100010202020202020202021C +:10C90000020102010201010202020202010202010D +:10C9100002020202010101020202020201010202FC +:10C9200002020202020202020202010202020202E8 +:10C9300001010101010001020202020202020201E0 +:10C9400001010101010101020202020202020201CF +:10C9500001010101010101020202020202020101C0 +:10C9600001010101010101020202020201010101B2 +:10C9700001010101010101010102020202010101A3 +:10C980000101010101010101010101010102020195 +:10C990000101010101010100020101010101010187 +:10C9A000010101010101010202020202020202026E +:10C9B000020202020102000202020202020202025A +:10C9C0000202020202020202020202020202020247 +:10C9D000020102020201010202020202020202023A +:10C9E0000202020202020202020202020202020227 +:10C9F000020202020200010202020202020202021A +:10CA00000202020202020202020202020102020108 +:10CA100002020202020101020202020201010202FA +:10CA200002020202020202020202020202020202E6 +:10CA300001010101010101020202020202020202DD +:10CA400002010101010101020202020202020201CD +:10CA500001010101020101020202020202020201BD +:10CA600001010101010101020202020202010101B0 +:10CA700001010101010101010102020202010101A2 +:10CA80000101010101010101010101010102020293 +:10CA90000101010101010100020201010101010185 +:10CAA000010101010101010202020202020202026D +:10CAB0000202020201020002020202020202020259 +:10CAC0000202020202020202020202020202020246 +:10CAD0000202020202020202020202020202020236 +:10CAE0000202020202020202020202020202020226 +:10CAF0000202020202000102020202020202020219 +:10CB00000202020202020202020202020202020106 +:10CB100002020202020101020202020202010202F8 +:10CB200002020202020202020202020202020202E5 +:10CB300001010201010101020202020202020202DB +:10CB400002010101010101020202020202020202CB +:10CB500002010101020101020202020202020202BA +:10CB600001010101010101020202020202010101AF +:10CB7000010101010101010102020202020202019E +:10CB80000101010101010101020101010102020291 +:10CB90000201010101010100020202010101010182 +:10CBA000010101010101010202020202020202026C +:10CBB0000202020202020002020202020202020257 +:10CBC0000202020202020200020202020202020247 +:10CBD0000202020202020202020202020202020235 +:10CBE0000202020202020202020202020202020225 +:10CBF0000202020202000102020202020202020218 +:10CC00000202020202020202020202020202020204 +:10CC100002020202020101020202020202020202F6 +:10CC200002020202020202020202020202020202E4 +:10CC300002010201010101020202020202020202D9 +:10CC400002020102020101020202020202020202C7 +:10CC500002010101020101020202020202020202B9 +:10CC600002010101010101020202020202020201AB +:10CC7000010101010101010202020202020202029B +:10CC8000010101010101010202010101010202028F +:10CC9000020202010101010002020201010101017F +:10CCA000010101010101010202020202020202026B +:10CCB0000202020202020002020202020202020256 +:10CCC0000202020202020202020202020202020046 +:10CCD0000202020000020202020202020202020238 +:10CCE0000202020202020202020202020202020224 +:10CCF0000202020202000102020202020202020217 +:10CD00000202020202020202020202020202020203 +:10CD100002020202020101020202020202020202F5 +:10CD200002020202020202020202020202020202E3 +:10CD300002020202020101020202020202020202D5 +:10CD400002020202020201020202020202020202C4 +:10CD500002020202020101020202020202020202B5 +:10CD600002020101010101020202020202020202A8 +:10CD7000010101010101010202020202020202029A +:10CD8000020101010101010202020101010202028C +:10CD9000020202020201010002020202010101017B +:10CDA000010101010101010202020202020202026A +:10CDB0000202020202020002020202020202020255 +:10CDC0000202020202020202020202020202020243 +:10CDD0000202020000020202020202020202020237 +:10CDE0000202020202020202020202020202020223 +:10CDF0000202020202000102020202020202020216 +:10CE00000202020202020202020202020202020202 +:10CE100002020202020101020202020202020202F4 +:10CE200002020202020202020202020202020202E2 +:10CE300002020202020101020202020202020202D4 +:10CE400002020202020201020202020202020202C3 +:10CE500002020202020201020202020202020202B3 +:10CE600002020202020101020202020202020202A4 +:10CE70000201010101010102020202020202020298 +:10CE80000202010101010102020202010102020289 +:10CE90000202020202020100020202020201010178 +:10CEA0000101010101010102020202020202020269 +:10CEB0000202020202020002020202020202020254 +:10CEC0000202020202020202020202020202020242 +:10CED0000202000200020202020202020202020236 +:10CEE0000202020202020202020202020202020222 +:10CEF0000202020202000202020202020202020214 +:10CF00000202020202020202020202020202020201 +:10CF100002020202020102020202020202020202F2 +:10CF200002020202020202020202020202020202E1 +:10CF300002020202020101020202020202020202D3 +:10CF400002020202020202020202020202020202C1 +:10CF500002020202020201020202020202020202B2 +:10CF600002020202020201020202020202020202A2 +:10CF70000202010101010102020202020202020296 +:10CF80000202020101010102020202010102020287 +:10CF90000202020202020100020202020202020175 +:10CFA0000101010101010102020202020202020268 +:10CFB0000202020202020002020202020202020253 +:10CFC0000202020202020202020202020202020241 +:10CFD0000202000202000202020202020202020235 +:10CFE0000202020202020202020202020202020221 +:10CFF0000202020202000202020202020202020213 +:10D000000202020202020202020202020202020200 +:10D0100002020202020202020202020202020202F0 +:10D0200002020202020202020202020202020202E0 +:10D0300002020202020102020202020202020202D1 +:10D0400002020202020202020202020202020202C0 +:10D0500002020202020202020202020202020202B0 +:10D0600002020202020201020202020202020202A1 +:10D070000202020202010102020202020202020292 +:10D080000202020101010102020202010102020286 +:10D090000202020202020200020202020202020272 +:10D0A0000101010101010102020202020202020267 +:10D0B0000202020202020002020202020202020252 +:10D0C0000202020202020202020202020202020240 +:10D0D0000202000202000202020202020202020234 +:10D0E0000202020202020202020202020202020220 +:10D0F0000202020202000202020202020202020212 +:10D1000002020202020202020202020202020202FF +:10D1100002020202020202020202020202020202EF +:10D1200002020202020202020202020202020202DF +:10D1300002020202020102020202020202020202D0 +:10D1400002020202020202020202020202020202BF +:10D1500002020202020202020202020202020202AF +:10D16000020202020202020202020202020202029F +:10D170000202020202020102020202020202020290 +:10D180000202020202020102020202020102020281 +:10D190000202020202020200020202020202020271 +:10D1A0000201010101010102020202020202020265 +:10D1B0000202020202020002020202020202020251 +:10D1C000020202020202020202020202020202023F +:10D1D0000202020202000202020202020202020231 +:10D1E000020202020202020202020202020202021F +:10D1F0000202020202000202020202020202020211 +:10D2000002020202020202020202020202020202FE +:10D2100002020202020202020202020202020202EE +:10D2200002020202020202020202020202020202DE +:10D2300002020202020102020202020202020202CF +:10D2400002020202020202020202020202020202BE +:10D2500002020202020202020202020202020202AE +:10D26000020202020202020202020202020202029E +:10D27000020202020202010202020202020202028F +:10D28000020202020202010202020202020202027F +:10D290000202020202020200020202020202020270 +:10D2A0000202010101010102020202020202020263 +:10D2B0000202020202020002020202020202020250 +:10D2C000020202020202020202020202020202023E +:10D2D0000202020202000202020202020202020230 +:10D2E000020202020202020202020202020202021E +:10D2F0000202020202000202020202020202020210 +:10D3000002020202020202020202020202020202FD +:10D3100002020202020202020202020202020202ED +:10D3200002020202020202020202020202020202DD +:10D3300002020202020102020202020202020202CE +:10D3400002020202020202020202020202020202BD +:10D3500002020202020202020202020202020202AD +:10D36000020202020202020202020202020202029D +:10D37000020202020202020202020202020202028D +:10D38000020202020202020202020202020202027D +:10D39000020202020202020202020202020202026D +:10D3A000020202020201010202020202020202025F +:10D3B000020202020202000202020202020202024F +:10D3C000020202000202020202020202020202023F +:10D3D000020202020202020202020202020202022D +:10D3E000020202020202020202020202020202021D +:10D3F000020202020200020202020202020202020F +:10D4000002020202020202020202020202020202FC +:10D4100002020202020202020202020202020202EC +:10D4200002020202020202020202020202020202DC +:10D4300002020202020102020202020202020202CD +:10D4400002020202020202020202020202020202BC +:10D4500002020202020202020202020202020202AC +:10D46000020202020202020202020202020202029C +:10D47000020202020202020202020202020202028C +:10D48000020202020202020202020202020202027C +:10D49000020202020202020202020202020202026C +:10D4A000020202020202010202020202020202025D +:10D4B000020202020202000202020202020202024E +:10D4C0000202000002020202020202020202020240 +:10D4D000020202020202020202020202020202022C +:10D4E000020202020202020202020202020202021C +:10D4F000020202020201020202020202020202020D +:10D5000002020202020202020202020202020202FB +:10D5100002020202020202020202020202020202EB +:10D5200002020202020202020202020202020202DB +:10D5300002020202020102020202020202020202CC +:10D5400002020202020202020202020202020202BB +:10D5500002020202020202020202020202020202AB +:10D56000020202020202020202020202020202029B +:10D57000020202020202020202020202020202028B +:10D58000020202020202020202020202020202027B +:10D59000020202020202020202020202020202026B +:10D5A000020202020202010202020202020202025C +:10D5B000020202020202000202020202020202024D +:10D5C0000202000001010102020202020202020242 +:10D5D000020202000002020202020202020202022F +:10D5E000020202020202020202020202020202021B +:10D5F000020202020202020202020202020202020B +:10D6000002020202020202020202020202020202FA +:10D6100002020202020202020202020202020202EA +:10D6200002020202020202020202020202020202DA +:10D6300002020202020202020202020202020202CA +:10D6400002020202020202020202020202020202BA +:10D6500002020202020202020202020202020202AA +:10D66000020202020202020202020202020202029A +:10D67000020202020202020202020202020202028A +:10D68000020202020202020202020202020202027A +:10D69000020202020202020202020202020202026A +:10D6A000020202020202020202020202020202025A +:10D6B0000201010101020002020202020202020250 +:10D6C0000101010101010102020202020202020241 +:10D6D000020202000002020202020202020202022E +:10D6E000020201010202020202020202020202021C +:10D6F000020202020202020202020202020202020A +:10D7000002020202020202020202020202020202F9 +:10D7100002020202020202020202020202020202E9 +:10D7200002020202020202020202020202020202D9 +:10D7300002020202020202020202020202020202C9 +:10D7400002020202020202020202020202020202B9 +:10D7500002020202020202020202020202020202A9 +:10D760000202020202020202020202020202020299 +:10D770000202020202020202020202020202020289 +:10D780000202020202020202020202020202020279 +:10D790000202020202020202020202020202020269 +:10D7A000020202020202020202020202020202015A +:10D7B0000101010101010102020202020101010154 +:10D7C0000101010101010102020202020202020240 +:10D7D000020202000002020202020202020201012F +:10D7E0000101010101010102020202020202020220 +:10D7F0000202020202020202020202020202020209 +:10D8000002020202020202020202020202020202F8 +:10D8100002020202020202020202020202020202E8 +:10D8200002020202020202020202020202020202D8 +:10D8300002020202020202020202020202020202C8 +:10D8400002020202020202020202020202020202B8 +:10D8500002020202020202020202020202020202A8 +:10D860000202020202020202020202020202020298 +:10D870000202020202020202020202020202020288 +:10D880000202020202020202020202020202020278 +:10D890000202020202020202020202020202020268 +:10D8A000020202020202020202020201010101015D +:10D8B0000101010101010102020201010101010155 +:10D8C0000101010101010102020202020202020041 +:10D8D0000101010000010102020202010101010136 +:10D8E000010101010101010202020202020202021F +:10D8F000020202020002010202020202020202020B +:10D9000002020202000002020202020202020202FB +:10D9100002020202020202020202020202020202E7 +:10D9200002020202020202020202020202020202D7 +:10D9300002020202020202020202020202020202C7 +:10D9400002020202020202020202020202020202B7 +:10D9500002020202020202020202020202020202A7 +:10D960000202020202020202020202020202020297 +:10D970000202020202020202020202020202020287 +:10D980000202020202020202020202020202020277 +:10D990000202020202020202020202020202020267 +:10D9A000020202020202020202020101010101015D +:10D9B0000101010101010101010101010101010157 +:10D9C0000101010101010102020202020202020040 +:10D9D0000101010100010101010101010101010138 +:10D9E000010101010101010202020202020202011F +:10D9F000010101010101010202020202020202020E +:10DA000002020202000002020202020202020202FA +:10DA100002020000020202020202020202020202EA +:10DA200002020202020202020202020202020202D6 +:10DA300002020202020202020202020202020202C6 +:10DA400002020202020202020202020202020202B6 +:10DA500002020202020202020202020202020202A6 +:10DA60000202020202020202020202020202020296 +:10DA70000202020202020202020202020202020286 +:10DA80000202020202020202020202020202020276 +:10DA90000202020202020202020202020202020266 +:10DAA000020202020202020101010101010101015F +:10DAB0000101010101010101010101010101010156 +:10DAC0000101010101010102020202010101010142 +:10DAD0000101010101010101010101010101010136 +:10DAE0000101010101010102020202010101010122 +:10DAF000010101010101010202020202020202020D +:10DB000002020101000002020202020202020202FB +:10DB100000000000020202020202020202020202ED +:10DB200002020202020202020202020202020202D5 +:10DB300002020202020202020202020202020202C5 +:10DB400002020202020202020202020202020202B5 +:10DB500002020202020202020202020202020202A5 +:10DB60000202020202020202020202020202020295 +:10DB70000202020202020202020202020202020285 +:10DB80000202020202020202020202020202020275 +:10DB90000202020202020202020202020202020265 +:10DBA000020202020202020101010101010101015E +:10DBB0000101010101010101010101010101010155 +:10DBC0000101010101010101010101010101010145 +:10DBD0000101010101010101010101010101010135 +:10DBE0000101010101010101010101010101010125 +:10DBF000010101010101010202020202020201010E +:10DC000001010101000001010202020202020202FE +:10DC100000000000020202020202020202020202EC +:10DC200002020202020202020202020202020202D4 +:10DC300002020202020202020202020202020202C4 +:10DC400002020202020202020202020202020202B4 +:10DC500002020202020202020202020202020202A4 +:10DC60000202020202020202020202020202020294 +:10DC70000202020202020202020202020202020284 +:10DC80000202020202020202020202020202020274 +:10DC90000202020202020202020202020202020264 +:10DCA000020202020202020101010101010101015D +:10DCB0000101010101010101010101010101010154 +:10DCC0000101010101010101010101010101010144 +:10DCD0000101010101010101010101010101010134 +:10DCE0000101010101010101010101010101010124 +:10DCF0000101010101010102020202010101010110 +:10DD000001010101010101010102020202020202FC +:10DD100000000101000101020202020202020202ED +:10DD200002020202020202020202020202020202D3 +:10DD300002020202020202020202020202020202C3 +:10DD400002020202020202020202020202020202B3 +:10DD500002020202020202020202020202020202A3 +:10DD60000202020202020202020202020202020293 +:10DD70000202020202020202020202020202020283 +:10DD80000202020202020202020202020202020273 +:10DD90000202020202020202020202020202020263 +:10DDA000020202020202020101010101010101015C +:10DDB0000101010101010101010101010101010153 +:10DDC0000101010101010101010101010101010143 +:10DDD0000101010101010101010101010101010133 +:10DDE0000101010101010101010101010101010123 +:10DDF0000101010101010101010101010101010113 +:10DE000001010101010101010102020102010101FF +:10DE100001010101010101020202020202020202E9 +:10DE200002020202020202020202020202020202D2 +:10DE300002020202020202020202020202020202C2 +:10DE400002020202020202020202020202020202B2 +:10DE500002020202020202020202020202020202A2 +:10DE60000202020202020202020202020202020292 +:10DE70000202020202020202020202020202020282 +:10DE80000202020202020202020202020202020272 +:10DE90000202020202020202020202020202020262 +:10DEA000020202020202020101010101010101015B +:10DEB0000101010101010101010101010101010152 +:10DEC0000101010101010101010101010101010142 +:10DED0000101010101010101010101010101010132 +:10DEE0000101010101010101010101010101010122 +:10DEF0000101010101010101010101010101010112 +:10DF00000101010101010101010101010101010101 +:10DF100001010101010101020202020202020202E8 +:10DF200002020202020202020202020202020202D1 +:10DF300002020202020202020202020202020202C1 +:10DF400002020202020202020202020202020202B1 +:10DF500002020202020202020202020202020202A1 +:10DF60000202020202020202020202020202020291 +:10DF70000202020202020202020202020202020281 +:10DF80000202020202020202020202020202020271 +:10DF90000202020202020202020202020202020261 +:10DFA000020202020202020101010101010101015A +:10DFB0000101010101010101010101010101010151 +:10DFC0000101010101010101010101010101010141 +:10DFD0000101010101010101010101010101010131 +:10DFE0000101010101010101010101010101010121 +:10DFF0000101010101010101010101010101010111 +:10E000000101010101010101010101010101010100 +:10E0100001010101010101020202020202020202E7 +:10E0200002020202020202020202020202020202D0 +:10E0300002020202020202020202020202020202C0 +:10E0400002020202020202020202020202020202B0 +:10E0500002020202020202020202020202020202A0 +:10E060000202020202020202020202020202020290 +:10E070000202020202020202020202020202020280 +:10E080000202020202020202020202020202020270 +:10E090000202020202020202020202020202020260 +:10E0A0000202020202020201010101010101010159 +:10E0B0000101010101010101010101010101010150 +:10E0C0000101010101010101010101010101010140 +:10E0D0000101010101010101010101010101010130 +:10E0E0000101010101010101010101010101010120 +:10E0F0000101010101010101010101010101010110 +:10E1000001010101010101010101010101010101FF +:10E1100001010101010101020202020202020101E8 +:10E1200001010101010101020202020202020202D6 +:10E1300002020202020202020202020202020202BF +:10E1400002020202020202020202020202020202AF +:10E15000020202020202020202020202020202029F +:10E16000020202020202020202020202020202028F +:10E17000020202020202020202020202020202027F +:10E18000020202020202020202020202020202026F +:10E19000020202020202020202020202020202025F +:10E1A0000202020202020201010101010101010158 +:10E1B000010101010101010101010101010101014F +:10E1C000010101010101010101010101010101013F +:10E1D000010101010101010101010101010101012F +:10E1E000010101010101010101010101010101011F +:10E1F000010101010101010101010101010101010F +:10E2000001010101010101010101010101010101FE +:10E2100001010101010101010101010101010101EE +:10E2200001010101010101020202020202020202D5 +:10E2300002020202020202020202020202020202BE +:10E2400002020202020202020202020202020202AE +:10E25000020202020202020202020202020202029E +:10E26000020202020202020202020202020202028E +:10E27000020202020202020202020202020202027E +:10E28000020202020202020202020202020202026E +:10E29000020202020202020202020202020202025E +:10E2A0000202020202020201010101010101010157 +:10E2B000010101010101010101010101010101014E +:10E2C000010101010101010101010101010101013E +:10E2D000010101010101010101010101010101012E +:10E2E000010101010101010101010101010101011E +:10E2F000010101010101010101010101010101010E +:10E3000001010101010101010101010101010101FD +:10E3100001010101010101010101010101010101ED +:10E3200001010101010101020202020202020202D4 +:10E3300002020202020002020202020202020202BF +:10E3400002020202020202020202020202020202AD +:10E35000020202020202020202020202020202029D +:10E36000020202020202020202020202020202028D +:10E37000020202020202020202020202020202027D +:10E38000020202020202020202020202020202026D +:10E39000020202020202020202020202020202025D +:10E3A0000202020202020201010101010101010156 +:10E3B000010101010101010101010101010101014D +:10E3C000010101010101010101010101010101013D +:10E3D000010101010101010101010101010101012D +:10E3E000010101010101010101010101010101011D +:10E3F000010101010101010101010101010101010D +:10E4000001010101010101010101010101010101FC +:10E4100001010101010101010101010101010101EC +:10E4200001010101010101020200000202020202D7 +:10E4300002020202020002020202020202020202BE +:10E4400002020202020202020202020202020202AC +:10E45000020202020202020202020202020202029C +:10E46000020202020202020202020202020202028C +:10E47000020202020202020202020202020202027C +:10E48000020202020202020202020202020202026C +:10E49000020202020202020202020202020202025C +:10E4A0000202020202020201010101010101010155 +:10E4B000010101010101010101010101010101014C +:10E4C000010101010101010101010101010101013C +:10E4D000010101010101010101010101010101012C +:10E4E000010101010101010101010101010101011C +:10E4F000010101010101010101010101010101010C +:10E5000001010101010101010101010101010101FB +:10E5100001010101010101010101010101010101EB +:10E5200001010101010101010200000101010101DC +:10E5300001010101010001020202020202020202C3 +:10E5400002020202020202020202020202020202AB +:10E55000020202020202020202020202020202029B +:10E56000020202020202020202020202020202028B +:10E57000020202020202020202020202020202027B +:10E58000020202020202020202020202020202026B +:10E59000020202020202020202020202020202025B +:10E5A0000202020202020201010101010101010154 +:10E5B000010101010101010101010101010101014B +:10E5C000010101010101010101010101010101013B +:10E5D000010101010101010101010101010101012B +:10E5E000010101010101010101010101010101011B +:10E5F000010101010101010101010101010101010B +:10E6000001010101010101010101010101010101FA +:10E6100001010101010101010101010101010101EA +:10E6200001010101010101010101010101010101DA +:10E6300001010101010101010101010101010101CA +:10E6400001010101010101020202020202020202B1 +:10E65000020202020202020202020202020202029A +:10E66000020202020202020202020202020202028A +:10E670000202020202020202020101010101010181 +:10E680000101010101010102020202020202020271 +:10E69000020202020202020202020202020202025A +:10E6A0000202020202020201010101010101010153 +:10E6B000010101010101010101010101010101014A +:10E6C000010101010101010101010101010101013A +:10E6D000010101010101010101010101010101012A +:10E6E000010101010101010101010101010101011A +:10E6F000010101010101010101010101010101010A +:10E7000001010101010101010101010101010101F9 +:10E7100001010101010101010101010101010101E9 +:10E7200001010101010101010101010101010101D9 +:10E7300001010101010101010101010101010101C9 +:10E7400001010101010101010101010101010101B9 +:10E7500001010101010101020202020202020202A0 +:10E760000202020202020201010101010101010192 +:10E770000101010101010101010101010101010189 +:10E780000101010101010102020202020201010173 +:10E790000101010101010102020202020202020260 +:10E7A0000202020202020201010101010101010152 +:10E7B0000101010101010101010101010101010149 +:10E7C0000101010101010101010101010101010139 +:10E7D0000101010101010101010101010101010129 +:10E7E0000101010101010101010101010101010119 +:10E7F0000101010101010101010101010101010109 +:10E8000001010101010101010101010101010101F8 +:10E8100001010101010101010101010101010101E8 +:10E8200001010101010101010101010101010101D8 +:10E8300001010101010101010101010101010101C8 +:10E8400001010101010101010101010101010101B8 +:10E8500001010101010101010101010101010101A8 +:10E860000101010101010101010101010101010198 +:10E870000101010101010101010101010101010188 +:10E880000101010101010101010101010101010178 +:10E89000010101010101010202020202020202025F +:10E8A0000202020202020201010101010101010151 +:10E8B0000101010101010101010101010101010148 +:10E8C0000101010101010101010101010101010138 +:10E8D0000101010101010101010101010101010128 +:10E8E0000101010101010101010101010101010118 +:10E8F0000101010101010101010101010101010108 +:10E9000001010101010101010101010101010101F7 +:10E9100001010101010101010101010101010101E7 +:10E9200001010101010101010101010101010101D7 +:10E9300001010101010101010101010101010101C7 +:10E9400001010101010101010101010101010101B7 +:10E9500001010101010101010101010101010101A7 +:10E960000101010101010101010101010101010197 +:10E970000101010101010101010101010101010187 +:10E980000101010101010101010101010101010177 +:10E990000101010101010100010101010101010168 +:10E9A0000101010101010101010101010101010157 +:10E9B0000101010101010101010101010101010147 +:10E9C0000101010101010101010101010101010137 +:10E9D0000101010101010101010101010101010127 +:10E9E0000101010101010101010101010101010117 +:10E9F0000101010101010101010101010101010107 +:10EA000001010101010101010101010101010101F6 +:10EA100001010101010101010101010101010101E6 +:10EA200001010101010101010101010101010101D6 +:10EA300001010101010101010101010101010101C6 +:10EA400001010101010101010101010101010101B6 +:10EA500001010101010101010101010101010101A6 +:10EA60000101010101010101010101010101010196 +:10EA70000101010101010101010101010101010186 +:10EA80000101010101010101010101010101010176 +:10EA9000010101010101010000000000000000006F +:10EAA000000000000000000101010101010101015D +:10EAB0000101010101010101010101010101010146 +:10EAC0000101010101010101010101010101010136 +:10EAD0000101010101010101010101010101010126 +:10EAE0000101010101010101010101010101010116 +:10EAF0000101010101010101010101010101010106 +:10EB000001010101010101020201010101010101F3 +:10EB100001010101010101010101010101010101E5 +:10EB200001010101010101010101010101010101D5 +:10EB300001010101010101010101010101010101C5 +:10EB400001010101010101010101010101010101B5 +:10EB500001010101010101010101010101010101A5 +:10EB60000101010101010101010101010101010195 +:10EB70000101010101010101010101010101010185 +:10EB80000101010101010101010101010101010175 +:10EB9000010101010101010000000000000000006E +:10EBA000000000000000000101010101010101015C +:10EBB0000101010101010101010101010101010145 +:10EBC0000101010101010101010101010101010135 +:10EBD000010101010101010202020202020202021C +:10EBE0000202020202020202020202020202020205 +:10EBF00002020202020202020202020202020202F5 +:10EC000002020202020202020202020202020202E4 +:10EC100002020202020202010101010101010101DD +:10EC200001010101010101010101010101010101D4 +:10EC300001010101010101010101010101010101C4 +:10EC400001010101010101010101010101010101B4 +:10EC500001010101010101010101010101010101A4 +:10EC60000101010101010101010101010101010194 +:10EC7000010101010101010202020202020202027B +:10EC80000202020202020202020202020202020264 +:10EC90000202020202020200000000000000000066 +:10ECA000000000000000000101010101010101015B +:10ECB000010101010101010202020202020202023B +:10ECC0000202020202020202020202020202020224 +:10ECD0000202020202020202020202020202020214 +:10ECE0000202020202020202020202020202020204 +:10ECF00002020202020202020202020202020202F4 +:10ED000002020202020202020202020202020202E3 +:10ED100002020202020202020202020202020202D3 +:10ED200002020202020202010101010101010101CC +:10ED300001010101010101010101010101010101C3 +:10ED400001010101010101010101010101010101B3 +:10ED500001010101010101010101010101010101A3 +:10ED6000010101010101010202020202020202028A +:10ED70000202020202020202020202020202020273 +:10ED80000202020202020202020202020202020263 +:10ED90000202020202020200000000000000000065 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000000000000000000000000000002 +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000092 +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA000000000000000004300000000000000001F +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000010000000000000000000000C0 +:10EF500000000000010000000000000000000000B0 +:10EF6000010100010100000000000000000000009D +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 +:10EFB000010101010101000000000000000000004B +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000000000000000000000000000000000F0 +:10F0200000000000000000000000000000000000E0 +:10F0300000000000000000000000000000000100CF +:10F0400000000000010000000000000000000000BF +:10F0500000000000010000000000000000000000AF +:10F06000010100010100000000000000000001009B +:10F070000000000000000000000000000000000090 +:10F080000000000000000000000000000000000080 +:10F090000000000000000000000000000000000070 +:10F0A000000000000000000000000000000000015F +:10F0B0000101010101010100000000000000000049 +:10F0C0000000000000000000000000000000000040 +:10F0D0000000000000000000000000000000000030 +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F1100000000000000000000000000000000000EF +:10F1200000000000000000000000000000000000DF +:10F1300000000001010100000000000000000100CB +:10F1400000000000010000000000000000000000BE +:10F1500000010001010100000000000000000000AB +:10F160000101010101010000000000000000010098 +:10F17000000000000000000000000000000000008F +:10F18000000000000000000000000000000000007F +:10F19000000000000000000000000000000000006F +:10F1A000000000000000000000000000000000015E +:10F1B0000101010101010101010000010000000045 +:10F1C000000000000000000000000000000000003F +:10F1D000000000000000000000000000000000002F +:10F1E000000000000000000000000000000000001F +:10F1F000000000000000010000000000000000000E +:10F2000000000000000000000000000000000000FE +:10F2100000000000000000000000000000000000EE +:10F2200000000000000000000000000000000000DE +:10F2300000000001010101000000000000000100C9 +:10F2400000000000010000000000000000000001BC +:10F2500000010001010100000000000000000101A8 +:10F260000101010101010000000000000000010097 +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000000000000007E +:10F29000000000000000000000000000000000006E +:10F2A000000000000000000000000000000000015D +:10F2B0000101010101010101010001010001000042 +:10F2C000000000000100000000000000000000003D +:10F2D000000000000000000000000000000000002E +:10F2E000000000010000000000000000000000001D +:10F2F000000000000000010000000000000000000D +:10F3000000000000000000000000000000000000FD +:10F3100000000000000000000000000000000000ED +:10F3200000000000000000000000000000000000DD +:10F3300000000001010101000000000000000100C8 +:10F3400000000001010100000000000000000001B9 +:10F3500000010101010100000000000000000101A6 +:10F360000101010101010000010000000000010095 +:10F37000000000000000000000000000000000008D +:10F38000000000000000000000000000000000007D +:10F39000000000000000000000000000000000006D +:10F3A000000000000000000000000000000000015C +:10F3B0000101010101010101010101010001000040 +:10F3C000000000000100000000000000000000003C +:10F3D000000000000000000000000000000000002D +:10F3E000000000010000000000000000000000001C +:10F3F000000000000000010000000100000000000B +:10F4000000000000000000000000000000000000FC +:10F4100000000000000000000000000000000000EC +:10F4200000000000000000000000000000000000DC +:10F4300000000001010101000000000000000100C7 +:10F4400000000001010100000000000000000101B7 +:10F4500000010101010100000000000000000101A5 +:10F460000101010101010100010000000001010092 +:10F47000000000000000000000000000000000008C +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000015B +:10F4B000010101010101010101010101010100003E +:10F4C000000000000100000000000000000000003B +:10F4D000000000000000000000000000000000002C +:10F4E000000000010000000000000000000000001B +:10F4F0000000010000000101010001010000000006 +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F5300000000001010101010100000000000100C4 +:10F5400000000001010100000000000000000101B6 +:10F5500000010101010100000100000000000101A3 +:10F560000101010101010101010000000001010090 +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000015A +:10F5B000010101010101010101010101010100003D +:10F5C000000000000100000000000000000000003A +:10F5D000000000000000000000000000010000002A +:10F5E000000000010000000000000000000000001A +:10F5F0000000010000000101010001010000000005 +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000000EA +:10F6200000000001010000000000000000000000D8 +:10F6300000000001010101010100000000000100C3 +:10F6400000000001010101000000000000000101B4 +:10F6500000010101010101000100000000000101A1 +:10F66000010101010101010101000000000101008F +:10F67000000000000000000000000000000000008A +:10F68000000000000000000000000000000000007A +:10F69000000000000000000000000000000000006A +:10F6A0000000000000000000000000000000000159 +:10F6B000010101010101010101010101010100003C +:10F6C0000000000001010000000000000000000038 +:10F6D0000000000000000000000000000100000029 +:10F6E0000000000100000000000000000000000019 +:10F6F0000100010000000101010001010000000003 +:10F7000000000000000000000000000000000000F9 +:10F7100000000000000000000000000000000000E9 +:10F7200000000001010000000000000000000000D7 +:10F7300000000001010101010101000000000100C1 +:10F7400000000001010101010100000000000101B1 +:10F75000000101010101010101000000000001019F +:10F76000010101010101010101010001000101008C +:10F770000000000001000000000000000000000088 +:10F780000000000000000000000000000000000079 +:10F790000000000000000000000000000000000069 +:10F7A0000000000000000000000000000000000158 +:10F7B000010101010101010101010101010100003B +:10F7C0000000000001010000000000000000000037 +:10F7D0000000000000000000000000000100000028 +:10F7E0000000000100000000000000000000000018 +:10F7F0000100010000000101010001010100000001 +:10F8000000000000000000000000000000000000F8 +:10F8100000000000000000000000000000000000E8 +:10F8200000000001010100000000000000000000D5 +:10F8300000000001010101010101000000000100C0 +:10F8400000000001010101010100000000000101B0 +:10F85000000101010101010101000000000101019D +:10F86000010101010101010101010101000101008A +:10F870000000000001000000000000000000000087 +:10F880000000000000000000000000000000000078 +:10F890000000000000000000000000000000000068 +:10F8A0000000000000000000000000000000000157 +:10F8B000010101010101010101010101010100003A +:10F8C0000100000001010000000000000000000035 +:10F8D0000000000000010000000000000100000026 +:10F8E0000000000100000000000000000000000017 +:10F8F00001010100000001010100010101000000FF +:10F9000000000000000100000000000000000000F6 +:10F9100000000000000000000000000000000000E7 +:10F9200000000001010100000000000000000100D3 +:10F9300000000001010101010101000000000100BF +:10F9400000000001010101010100000000000101AF +:10F95000000101010101010101010000000101019B +:10F960000101010101010101010101010001010089 +:10F970000100000001010000000000000000000084 +:10F980000000000001000000000000000000000076 +:10F990000000000000000000000000000000000067 +:10F9A0000000000000000000000000000000000156 +:10F9B0000101010101010101010101010101000039 +:10F9C0000100000001010000000000000000000034 +:10F9D0000000000000010000000000000100000025 +:10F9E0000000000100000000000000000000000016 +:10F9F00001010100000001010100010101000000FE +:10FA000000000000000101000000000000000000F4 +:10FA100000000000000000000000000000000000E6 +:10FA200000000001010100000000000000000100D2 +:10FA300000000001010101010101000000010100BD +:10FA400000000001010101010100000000000101AE +:10FA5000000101010101010101010000000101019A +:10FA60000101010101010101010101010101010087 +:10FA70000100000001010000000000000000000083 +:10FA80000000000001000000000000000000000075 +:10FA90000000000000000000000000000000000066 +:10FAA0000000000000000000000000000000000155 +:10FAB0000101010101010101010101010101000038 +:10FAC0000100000001010000000000000000000033 +:10FAD0000001000001010000000000000100000022 +:10FAE0000100000100000000000000000000000014 +:10FAF00001010101000001010101010101000000FB +:10FB000000000000000101000000000000000000F3 +:10FB100000000000000000000000000000000000E5 +:10FB200000000001010100000000000000000100D1 +:10FB300000000001010101010101000100010100BB +:10FB400000000001010101010101000000000101AC +:10FB50000001010101010101010100010001010198 +:10FB60000101010101010101010101010101010086 +:10FB70000101000101010000000000000000000080 +:10FB80000100000001010000000000000000000072 +:10FB90000000000000000000000000000000000065 +:10FBA0000000000000000000000000000000000253 +:10FBB0000101010101010101010101010101000037 +:10FBC0000100000001010100000000000000010030 +:10FBD0000001000001010100000000000100000020 +:10FBE0000100000100000000000000000000000013 +:10FBF00001010101000001010101010101000000FA +:10FC000000000000000101000000000000000000F2 +:10FC100000000000000000000000000000000000E4 +:10FC200000000001010100000000000000000100D0 +:10FC300000000001010101010101010100010100B9 +:10FC400000000001010101010101000000000101AB +:10FC50000001010101010101010101010001010196 +:10FC60000101010101010101010101010101010184 +:10FC7000010100010101010000000000000001007D +:10FC80000100000001010000000000000000010070 +:10FC90000000000000000000000000000000000064 +:10FCA0000000000000000000000000000000000252 +:10FCB0000101010101010101010101010101000036 +:10FCC000010101000101010000010000000001002C +:10FCD000000101010101010000000000010000001D +:10FCE0000100000101000000000000000000000011 +:10FCF00001010101000001010101010101000000F9 +:10FD000001000100000101010000000000000000EE +:10FD100000000000000000000000000000000000E3 +:10FD200000000001010100000000000000000100CF +:10FD300000000001010101010101010100010100B8 +:10FD400000000001010101010101000000000101AA +:10FD50000001010101010101010101010001010195 +:10FD60000101010101010101010101010101010183 +:10FD7000010101010101010001000000000001007A +:10FD8000010100010101000000000000000001006D +:10FD90000100000000000000000000000000000062 +:10FDA0000000000000000000000000000000000251 +:10FDB0000202020101010101010101010101000032 +:10FDC000010101000101010000010100000001002A +:10FDD000000101010101010000000000010000001C +:10FDE0000100000101000000000000000000000010 +:10FDF00001010101000001010101010101010101F5 +:10FE000001000100000101010000000000000000ED +:10FE100000000000000000000000000000000000E2 +:10FE200000000001010100000000000000000100CE +:10FE300000000001010101010101010100010100B7 +:10FE400000000001010101010101000000010101A8 +:10FE50000001010101010101010101010101010193 +:10FE60000101010101010101010101010101010182 +:10FE70000101010101010100010000000000010178 +:10FE8000010100010101010000000000000001006B +:10FE90000100000000000000000000000000000061 +:10FEA0000000000000000000000000000000000250 +:10FEB0000202020201010101010101010101000030 +:10FEC0000101010001010100000101000000010029 +:10FED000000101010101010000000000010000001B +:10FEE000010101010100000000000000000000000D +:10FEF00001010101000001010101010101010101F4 +:10FF000001010100000101010100000000000000EA +:10FF100000000000000000000000000000000000E1 +:10FF200000000001010101000000000000000100CC +:10FF300001000001010101010101010100010100B5 +:10FF400000000001010101010101000100010101A6 +:10FF50000001010101010101010101010101010192 +:10FF60000101010101010101010101010101010181 +:10FF70000101010101010100010000000000010177 +:10FF80000101010101010100010000000000010068 +:10FF90000100000000000000000000000000000060 +:10FFA000000000000000000000000000000000024F +:10FFB000020202020202010101010101010100002D +:10FFC0000101010001010100000101000101010125 +:10FFD000000101010101010000000000010000001A +:10FFE000010101010100000000000000000000000C +:10FFF00001010101000001010101010101010101F3 +:0200000270008C +:1000000001010100000101010100000000000000E9 +:1000100000000000000000000000000000000000E0 +:1000200000000001010101010100000000000101C8 +:1000300001000001010101010101010101010100B3 +:1000400000000001010101010101010100010101A4 +:100050000001010101010101010101010101010191 +:100060000101010101010101010101010101010180 +:100070000101010101010100010000000001010175 +:100080000101010101010100010000000001010165 +:10009000010000000000000000000000000000005F +:1000A000000000000000000000000000000000024E +:1000B000020202020202020101010101010100002B +:1000C0000101010101010100000101000101010123 +:1000D0000001010101010100000000000100000019 +:1000E000010101020100000000000000000000000A +:1000F00001010101000001010101010101010101F2 +:1001000001010100000101010100000000000000E8 +:1001100000000000000000000000000000000000DF +:1001200000000001010101010100000000000101C7 +:1001300001000001010101010101010101010100B2 +:1001400000000001010101010101010100010101A3 +:100150000001010101010101010101010101010190 +:10016000010101010101010101010101010101017F +:100170000101010101010101010100010001010171 +:100180000101010101010101010100010001010161 +:10019000010100000100000000000000000000005C +:1001A000000000000000000000000000000000024D +:1001B0000202020202020202010101010101000128 +:1001C0000101010101010100000101000101010122 +:1001D0000001010101010100000000000100000117 +:1001E0000101010201000000000000000000000108 +:1001F00001010101000001010101010101010101F1 +:1002000001010100000101010100000000000000E7 +:1002100000000000000000000000000000000000DE +:1002200000000001010101010100000000000101C6 +:1002300001000001010101010101010101010100B1 +:1002400000000001010101010101010101010101A1 +:10025000000101010101010101010101010101018F +:10026000010101010101010101010101010101017E +:10027000010101010101010101010101000101016F +:10028000010101010101010101010101000101015F +:10029000010100000100000000000000000000005B +:1002A000000000000000000000000000000000024C +:1002B0000202020202020202020102020101000124 +:1002C000010101010101010101010100010101011F +:1002D0000101010101010100000000000100000115 +:1002E0000101010201000000000000000000000107 +:1002F00001010201000001010101010101010101EF +:1003000001010101000101010100000000000000E5 +:1003100001000000000100000000000000000001DA +:1003200000000001010101010100000000000101C5 +:1003300001010001010101010101010101010100AF +:10034000000000010101010101010101010101029F +:10035000000101010101010101010101010101018E +:10036000010101010101010101010101010101017D +:10037000010101010101010101010101000101016E +:10038000010101010101010101010101000101015E +:100390000101010101010000000000000000000057 +:1003A000000000000000000000000000000000024B +:1003B0000202020202020202020202020101000122 +:1003C000010101010201010101010100010101011D +:1003D0000101010101010100000000000100000114 +:1003E0000101010201000000000000000000000106 +:1003F00002010201000002010101010101010101EC +:1004000001010101000101010100000000000101E2 +:1004100001000000000100000000000000000001D9 +:1004200001000001010101010100000000000101C3 +:1004300001010002010101010101010101010100AD +:10044000000000010101010101010101010101029E +:10045000000101010101010101010101010101028C +:10046000010101010101010101010101010101017C +:10047000010101010101010101010101010101016C +:10048000010101010101010101010101010101015C +:100490000101010101010000000000000000000056 +:1004A000000000000000000000000000000000024A +:1004B000020202020202020202020202020200011F +:1004C000020101010201010101010100010101011B +:1004D0000101010101010100000000000100000113 +:1004E0000201010201010000000200000000000101 +:1004F00002020201010002010101010101010102E8 +:1005000001010101000101010101000000000101E0 +:1005100001000000000100000000000000000001D8 +:1005200001000001010101010100000000000101C2 +:1005300001010102010101010101010101010100AB +:100540000101000202010101010101010101010299 +:100550000102010101010101010101010101010289 +:100560000202010101010101010101010101010179 +:10057000010101010101010101010101010101016B +:10058000010101010101010101010101010101015B +:100590000101010101010000000000000000000055 +:1005A0000000000000000000000000000000000249 +:1005B000020202020202020202020202020200011E +:1005C0000201010102020101010101000101010119 +:1005D0000102010101010100000000000100000111 +:1005E00002010102010100000002000002000101FD +:1005F00002020201010002020101020101010102E5 +:1006000001010101000101010101000000010101DE +:1006100001000000000100000000000000000001D7 +:1006200001010102010101010101000000000101BD +:1006300001010102020201010101010101010101A7 +:100640000101000202010101010101010101010298 +:100650000102020201010101010101010101010286 +:100660000202020201010101010101010101010176 +:10067000010101010101010101010101010101016A +:10068000010101010101010101010101010101015A +:100690000101010101010100000000000000010052 +:1006A0000000000000000000000000000000000248 +:1006B000020202020202020202020202020200011D +:1006C0000202020102020101010101010101010214 +:1006D000010202010102010000000000010000020D +:1006E00002020202010100000201000002000101F9 +:1006F00002020202010002020201020201010102E1 +:1007000002010201010201010101000000010101D9 +:1007100001010100000100010000000000000001D3 +:1007200001010102010101010101000000010101BB +:1007300001010102020202010101010101010101A5 +:100740000101010202020101010101010101010295 +:100750000102020202010101010101010101010284 +:100760000202020201010101010101010101010175 +:100770000101010101010101010101010101010169 +:100780000101010101010101010101010101010159 +:10079000010101010101010101000000000001004F +:1007A0000000000000000000000000000000000247 +:1007B000020202020202020202020202020200021B +:1007C0000202020102020101010101010101010213 +:1007D000010202020102010000000000020000020A +:1007E00002020202020100000101000001000102F8 +:1007F00002020202010002020201020201010102E0 +:1008000002020201010202010101010001010101D4 +:1008100001010100000100010000000000010001D1 +:1008200001010102020101010101000000010101B9 +:1008300001010102020202010101010101010101A4 +:100840000101010202020101010101010101010294 +:100850000102020202020101010101010101010282 +:100860000202020202010101010101010101010173 +:100870000101010101010101010101010101010168 +:100880000101010101010101010101010101010158 +:10089000010101010101010101000000000101004D +:1008A0000000000000000000000000020000000244 +:1008B000020202020202020202020202020200021A +:1008C0000202020102020201010101010101010211 +:1008D0000102020202020200000000000200000207 +:1008E00002020202020100020101000001000102F5 +:1008F00002020202010002020201020202010102DE +:1009000002020201010202010101010101010101D2 +:1009100001010100000100010000000000010001D0 +:1009200001010102020201010101010000010102B5 +:1009300001010102020202020101010101010101A2 +:100940000101010202020201010101010101010292 +:100950000102020202020101010101010101010281 +:100960000202020202020101010101010101010171 +:100970000101010101010101010101010101010167 +:100980000101010101010101010101010101010157 +:10099000010101010101010101010001000101004A +:1009A0000000000000000000000000020000000243 +:1009B0000202020202020202020202020202000219 +:1009C000020202020202020101020101010101020E +:1009D0000102020202020200000002000201010202 +:1009E00002020202020100010101020001000102F3 +:1009F00002020202010002020202020202010102DC +:100A000002020201010202020101010101010102CF +:100A100001010100000101010000000000010102CC +:100A200001010102020201010101010000010102B4 +:100A300001010102020202020201010101010101A0 +:100A40000101010202020202010101010101010290 +:100A50000102020202020101010101010101010280 +:100A6000020202020202010101010101010101026F +:100A70000101010101010101010101010101010166 +:100A80000101010101010101010101010101010255 +:100A90000101010101010101010101010001010048 +:100AA0000000000201000000000000010000000240 +:100AB0000202020202020202020202020202000218 +:100AC000020202020202020101020201010101020C +:100AD00002020202020202000202010202010102FB +:100AE00002020202020100010101020001000102F2 +:100AF00002020202010002020202020202010102DB +:100B000002020202010202020101010101010102CD +:100B100001010100000101010000000000010102CB +:100B200001010102020201010101010000010102B3 +:100B3000020101020202020202020101010102019C +:100B4000010101020202020202010101010101028E +:100B5000010202020202020101010101010101027E +:100B6000020202020202020101010101010101026D +:100B70000201010101010101010101010101010263 +:100B80000101010101010101010101010101010254 +:100B90000201010101010101010101010001010046 +:100BA000000000020100000000000001000000023F +:100BB0000202020202020202020202020202000217 +:100BC000020202020202020101020201010101020B +:100BD00002020202020202000101010102010102FD +:100BE00002020202020201010101010001000102F0 +:100BF00002020202010002020202020202010102DA +:100C000002020202010202020201010101010102CB +:100C100002010100000101010000000001010102C8 +:100C200001010102020201010101010000010102B2 +:100C3000020101020202020202020101010102029A +:100C4000010101020202020202010101010101028D +:100C5000010202020202020202010101010101027B +:100C6000020202020202020202010101010101026A +:100C70000202010101010101010101010101010261 +:100C80000201010101010101010101010101010252 +:100C90000201010101010101010101010101010044 +:100CA000000000010100000000000001000000023F +:100CB0000202020202020202020202020202000216 +:100CC0000202020202020202010202010201010208 +:100CD00002020202020202010101010102010102FB +:100CE00002020202020201010101010001000102EF +:100CF00002020202010102020202020202010102D8 +:100D000002020202010202020201010101010102CA +:100D100002010101000101010100000001010102C5 +:100D200002010102020202010101010000010102AF +:100D30000202010202020202020201010101020298 +:100D4000010101020202020202020101010102028A +:100D5000010202020202020202010101010101027A +:100D60000202020202020202020101010101010269 +:100D7000020202020201010101010101010101025D +:100D80000202010101010101010101010101010250 +:100D90000202010101010101010101010101010042 +:100DA000010001010100000000000001000000023C +:100DB0000202020202020202020202020202000215 +:100DC0000202020202020202020202010202020204 +:100DD00002020202020202010101010102010102FA +:100DE00002020202020201010101010001000102EE +:100DF00002020202020102020202020202020102D5 +:100E000002020202010202020201010101010102C9 +:100E100002020201000201010100010001010102C0 +:100E200002020202020202020101010200010102A9 +:100E30000202020202020202020202020101020294 +:100E40000202010202020202020201010101020287 +:100E50000102020202020202020201010101020277 +:100E60000202020202020202020201010101020266 +:100E7000020202020202010101010101010101025B +:100E8000020202020201010101010101010101024C +:100E90000202020101010101010101010101010040 +:100EA0000100000101000000020200010000010237 +:100EB0000202020202020202020202020202000214 +:100EC0000202020202020202020202010202020203 +:100ED00002020202020202010101010102010102F9 +:100EE00002020202020202020202010001000102E9 +:100EF00002020202020102020202020202020202D3 +:100F000002020202020202020202010101010102C6 +:100F100002020201000201010100010101010102BE +:100F200002020202020202020201010200010202A6 +:100F30000202020202020202020202020102020292 +:100F40000202020202020202020201010101020285 +:100F50000102020202020202020201010101020276 +:100F60000202020202020202020202020102020262 +:100F7000020202020202010101010101010101025A +:100F8000020202020202010101010101010101024A +:100F9000020202020101010101010101010101003E +:100FA0000100000000000200010202010000010235 +:100FB0000202020202020202020202020202000213 +:100FC0000202020202020202020202020202020201 +:100FD00002020202020202010101010102010102F8 +:100FE00002020202020202020202010002010202E5 +:100FF00002020202020102020202020202020202D2 +:1010000002020202020202020202020101010102C4 +:1010100002020201000201020100010101010102BC +:1010200002020202020202020201010100010202A6 +:101030000202020202020202020202020102020291 +:101040000202020202020202020202020101020282 +:101050000202020202020202020202020102020271 +:101060000202020202020202020202020102020261 +:101070000202020202020201010101010101010258 +:101080000202020202020101010101010101010249 +:10109000020202020201010101010101010101003C +:1010A0000001000000000100010102010200010234 +:1010B0000202020202020202020202020202000212 +:1010C0000202020202020202020202020202020200 +:1010D00002020202020202010101010102010102F7 +:1010E00002020202020202020202020002010202E3 +:1010F00002020202020102020202020202020202D1 +:1011000002020202020202020202020202020102C0 +:1011100002020201010201020100010101010102BA +:1011200002020202020202020201010102010202A3 +:10113000020202020202020202020202020202028F +:101140000202020202020202020202020102020280 +:101150000202020202020202020202020102020270 +:10116000020202020202020202020202020202025F +:101170000202020202020201010101010101010257 +:101180000202020202020201010101010101010247 +:10119000020202020202010101010101010101003A +:1011A0000000000000010100010101010100010235 +:1011B0000202020202020202020202020202000211 +:1011C00002020202020202020202020202020202FF +:1011D00002020202020202020102020102010102F3 +:1011E00002020202020202020202020002010202E2 +:1011F00002020202020202020202020202020202CF +:1012000002020202020202020202020202020202BE +:1012100002020202010202020100010101010102B7 +:1012200002020202020202020202010102010202A1 +:10123000020202020202020202020202020202028E +:10124000020202020202020202020202020202027E +:10125000020202020202020202020202020202026E +:10126000020202020202020202020202020202025E +:101270000202020202020201020101010101010255 +:101280000202020202020201010101010101010246 +:101290000202020202020101010101010101010039 +:1012A0000000000000010102010101000100010233 +:1012B0000202020202020202020202020202000210 +:1012C00002020202020202020202020202020202FE +:1012D00002020202020202020202020202020102EF +:1012E00002020202020202020202020102020202DF +:1012F00002020202020202020202020202020202CE +:1013000002020202020202020202020202020202BD +:1013100002020202010202020101010101010102B5 +:1013200002020202020202020202010102010202A0 +:10133000020202020202020202020202020202028D +:10134000020202020202020202020202020202027D +:10135000020202020202020202020202020202026D +:10136000020202020202020202020202020202025D +:101370000202020202020202020101010101010253 +:101380000202020202020202020101010101010243 +:101390000202020202020201010101010101010037 +:1013A0000000000000010101010101000102010231 +:1013B000020202020202020202020202020200020F +:1013C00002020202020202020202020202020202FD +:1013D00002020202020202020202020202020102EE +:1013E00002020202020202020202020202020202DD +:1013F00002020202020202020202020202020202CD +:1014000002020202020202020202020202020202BC +:1014100002020202010202020201020102020102B0 +:10142000020202020202020202020201010102029F +:10143000020202020202020202020202020202028C +:10144000020202020202020202020202020202027C +:10145000020202020202020202020202020202026C +:10146000020202020202020202020202020202025C +:101470000202020202020202020201010101010251 +:101480000202020202020202020201010101010241 +:101490000202020202020202010101010101010035 +:1014A0000000000000000001010101000101010233 +:1014B000020202020202020202020202020200020E +:1014C00002020202020202020202020202020202FC +:1014D00002020202020202020202020202020202EC +:1014E00002020202020202020202020202020202DC +:1014F00002020202020202020202020202020202CC +:1015000002020202020202020202020202020202BB +:1015100002020202010202020201020202020102AE +:10152000020202020202020202020201010202029D +:10153000020202020202020202020202020202028B +:10154000020202020202020202020202020202027B +:10155000020202020202020202020202020202026B +:10156000020202020202020202020202020202025B +:10157000020202020202020202020202010102024D +:10158000020202020202020202020202010102023D +:101590000202020202020202020101010101010033 +:1015A0000000000000000001000101000101010233 +:1015B000020202020202020202020202020200020D +:1015C00002020202020202020202020202020202FB +:1015D00002020202020202020202020202020202EB +:1015E00002020202020202020202020202020202DB +:1015F00002020202020202020202020202020202CB +:1016000002020202020202020202020202020202BA +:1016100002020202020202020201020202020102AC +:10162000020202020202020202020201010202029C +:10163000020202020202020202020202020202028A +:10164000020202020202020202020202020202027A +:10165000020202020202020202020202020202026A +:10166000020202020202020202020202020202025A +:10167000020202020202020202020202010202024B +:10168000020202020202020202020202010202023B +:101690000202020202020202020201010101010031 +:1016A0000000000000000000000001000101010234 +:1016B000020202020202020202020202020200020C +:1016C00002020202020202020202020202020202FA +:1016D00002020202020202020202020202020202EA +:1016E00002020202020202020202020202020202DA +:1016F00002020202020202020202020202020202CA +:1017000002020202020202020202020202020202B9 +:1017100002020202020202020202020202020202A9 +:10172000020202020202020202020201010202029B +:101730000202020202020202020202020202020289 +:101740000202020202020202020202020202020279 +:101750000202020202020202020202020202020269 +:101760000202020202020202020202020202020259 +:101770000202020202020202020202020202020249 +:101780000202020202020202020202020202020239 +:10179000020202020202020202020202010101022C +:1017A0000000000000000000000000000001010235 +:1017B000020202020202020202020202020200020B +:1017C00002020202020202020202020202020202F9 +:1017D00002020202020202020202020202020202E9 +:1017E00002020202020202020202020202020202D9 +:1017F00002020202020202020202020202020202C9 +:1018000002020202020202020202020202020202B8 +:1018100002020202020202020202020202020202A8 +:10182000020202020202020202020201010202029A +:101830000202020202020202020202020202020288 +:101840000202020202020202020202020202020278 +:101850000202020202020202020202020202020268 +:101860000202020202020202020202020202020258 +:101870000202020202020202020202020202020248 +:101880000202020202020202020202020202020238 +:101890000202020202020202020202020102020229 +:1018A0000000000000000000000000000001010234 +:1018B000020202020202020202020202020200020A +:1018C00002020202020202020202020202020202F8 +:1018D00002020202020202020202020202020202E8 +:1018E00002020202020202020202020202020202D8 +:1018F00002020202020202020202020202020202C8 +:1019000002020202020202020202020202020202B7 +:1019100002020202020202020202020202020202A7 +:101920000202020202020202020202020102020298 +:101930000202020202020202020202020202020287 +:101940000202020202020202020202020202020277 +:101950000202020202020202020202020202020267 +:101960000202020202020202020202020202020257 +:101970000202020202020202020202020202020247 +:101980000202020202020202020202020202020237 +:101990000202020202020202020202020202020227 +:1019A0000200000000000000000000000001010231 +:1019B000020202020202020202020101010100020D +:1019C00002020202020202020202020202020202F7 +:1019D00002020202020202020202020202020202E7 +:1019E00002020202020202020202020202010202D8 +:1019F00002020202020202020202020202020202C7 +:101A000002020202020202020202020202020202B6 +:101A100002020202020202020202020202020202A6 +:101A20000202020202020202020202020102020297 +:101A30000202020202020202020202020202020286 +:101A40000202020202020202020202020202020276 +:101A50000202020202020202020202020202020266 +:101A60000202020202020202020202020202020256 +:101A70000202020202020202020202020202020246 +:101A80000202020202020202020202020202020236 +:101A90000202020202020202020202020202020226 +:101AA0000200000000000000000000000001000231 +:101AB0000202020201010101010101010101010211 +:101AC00002020202020202020202020202020202F6 +:101AD00002020202020202020202020202020202E6 +:101AE00002020202020202020202010101010102DB +:101AF00002020202020202020202020202020202C6 +:101B000002020202020202020202020202020202B5 +:101B100002020202020202020202020202020202A5 +:101B20000202020202020202020202020102020296 +:101B30000202020202020202020202020202020285 +:101B40000202020202020202020202020202020275 +:101B50000202020202020202020202020202020265 +:101B60000202020202020202020202020202020255 +:101B70000202020202020202020202020202020245 +:101B80000202020202020202020202020202020235 +:101B90000202020202020202020202020202020225 +:101BA000020202000000000000000000000100012D +:101BB0000101010101010101010101010101010214 +:101BC00002020202020202020202020202020202F5 +:101BD00002020202020202020202020202020202E5 +:101BE00002020202020201010101010101010102DE +:101BF00002020202020202020202020202020202C5 +:101C000002020202020202020202020202020202B4 +:101C100002020202020202020202020202020202A4 +:101C20000202020202020202020202020202020294 +:101C30000202020202020202020202020202020284 +:101C40000202020202020202020202020202020274 +:101C50000202020202020202020202020202020264 +:101C60000202020202020202020202020202020254 +:101C70000202020202020202020202020202020244 +:101C80000202020202020202020202020202020234 +:101C90000202020202020202020202020202020224 +:101CA000020202000000000000000000000000012D +:101CB0000101010101010101010101010101010213 +:101CC00002020202020202020202020202020202F4 +:101CD00002020202020202020202020202020202E4 +:101CE00002020201010101010101010101010102E0 +:101CF00002020202020202020202020202020202C4 +:101D000002020202020202020202020202020202B3 +:101D100002020202020202020202020202020202A3 +:101D20000202020202020202020202020202020293 +:101D30000202020202020202020202020202020283 +:101D40000202020202020202020202020202020273 +:101D50000202020202020202020202020202020263 +:101D60000202020202020202020202020202020253 +:101D70000202020202020202020202020202020243 +:101D80000202020202020202020202020202020233 +:101D90000202020202020202020202020202020223 +:101DA0000202020202000000000000000000000128 +:101DB0000101010101010101010101010101010212 +:101DC00002020202020202020202020202020202F3 +:101DD00002020202020202020201010101010202E8 +:101DE00001010101010101010101010101010102E2 +:101DF00002020202020202020202010101020202C6 +:101E000002020202020202020202020202020202B2 +:101E100002020202020202020202020202020202A2 +:101E20000202020202020202020202020202020292 +:101E30000202020202020202020202020202020282 +:101E40000202020202020202020202020202020272 +:101E50000202020202020202020202020202020262 +:101E60000202020202020202020202020202020252 +:101E70000202020202020202020202020202020242 +:101E80000202020202020202020202020202020232 +:101E90000202020202020202020202020202020222 +:101EA0000202020202000000000000000000000127 +:101EB0000101010101010101010101010101010211 +:101EC00002020202020202020201010101010202F7 +:101ED00002020202020101010101010101010101ED +:101EE00001010101010101010101010101010102E1 +:101EF00002020202020201010101010101010102CB +:101F000002020202020202020202020202020202B1 +:101F100002020202020202020202020202020202A1 +:101F20000202020202020202020202020202020291 +:101F30000202020202020202020202020202020281 +:101F40000202020202020202020202020202020271 +:101F50000202020202020202020202020202020261 +:101F60000202020202020202020202020202020251 +:101F70000202020202020202020202020202020241 +:101F80000202020202020202020202020202020231 +:101F90000202020202020202020202020202020221 +:101FA0000202020202020000000000000000000124 +:101FB0000101010101010101010101010101010210 +:101FC00002020202010101010101010101010102FC +:101FD00002010101010101010101010101010101F0 +:101FE00001010101010101010101010101010102E0 +:101FF00001010101010101010101010101010102D0 +:1020000002020202020202020202010101010202B4 +:1020100002020202020202020202020202020202A0 +:102020000202020202020202020202020202020290 +:102030000202020202020202020202020202020280 +:102040000202020202020202020202020202020270 +:102050000202020202020202020202020202020260 +:102060000202020202020202020202020202020250 +:102070000202020202020202020202020202020240 +:102080000202020202020202020202020202020230 +:102090000202020202020202020202020202020220 +:1020A0000202020202020200000000000000000121 +:1020B000010101010101010101010101010101020F +:1020C0000101010101010101010101010101010100 +:1020D00001010101010101010101010101010101F0 +:1020E00001010101010101010101010101010101E0 +:1020F00001010101010101010101010101010102CF +:1021000002020202020101010101010101010102B9 +:1021100002020202020202020202010101020202A2 +:10212000020202020202020202020202020202028F +:10213000020202020202020202020202020202027F +:10214000020202020202020202020202020202026F +:10215000020202020202020202020202020202025F +:10216000020202020202020202020202020202024F +:10217000020202020202020202020202020202023F +:10218000020202020202020202020202020202022F +:10219000020202020202020202020202020202021F +:1021A000020202020202020002000000000002011C +:1021B000010101010101010101010101010101010F +:1021C00001010101010101010101010101010101FF +:1021D00001010101010101010101010101010101EF +:1021E00001010101010101010101010101010101DF +:1021F00001010101010101010101010101010101CF +:1022000001010101010101010101010101010102BD +:1022100002020202020202010101010101010202A5 +:10222000020202020202020202020202020202028E +:10223000020202020202020202020202020202027E +:10224000020202020202020202020202020202026E +:10225000020202020202020202020202020202025E +:10226000020202020202020202020202020202024E +:10227000020202020202020202020202020202023E +:10228000020202020202020202020202020202022E +:10229000020202020202020202020202020202021E +:1022A0000202020202020202020200020000020115 +:1022B000010101010101010101010101010101010E +:1022C00001010101010101010101010101010101FE +:1022D00001010101010101010101010101010101EE +:1022E00001010101010101010101010101010101DE +:1022F00001010101010101010101010101010101CE +:1023000001010101010101010101010101010102BC +:1023100002020202020101010101010101010102A7 +:10232000020202020202020202020202020202028D +:10233000020202020202020202020202020202027D +:10234000020202020202020202020202020202026D +:10235000020202020202020202020202020202025D +:10236000020202020202020202020202020202024D +:10237000020202020202020202020202020202023D +:10238000020202020202020202020202020202022D +:10239000020202020202020202020202020202021D +:1023A0000202020202020202020202020000020112 +:1023B000010101010101010101010101010101010D +:1023C00001010101010101010101010101010101FD +:1023D00001010101010101010101010101010101ED +:1023E00001010101010101010101010101010101DD +:1023F00001010101010101010101010101010101CD +:1024000001010101010101010101010101010101BC +:1024100001010101010101010101010101010102AB +:102420000202020101010101010101010101010298 +:10243000020202020202020202020202020202027C +:10244000020202020202020202020202020202026C +:10245000020202020202020202020202020202025C +:10246000020202020202020202020202020202024C +:10247000020202020202020202020202020202023C +:10248000020202020202020202020202020202022C +:10249000020202020202020202020202020202021C +:1024A000020202020202020202020202020202010D +:1024B000010101010101010101010101010101010C +:1024C00001010101010101010101010101010101FC +:1024D00001010101010101010101010101010101EC +:1024E00001010101010101010101010101010101DC +:1024F00001010101010101010101010101010101CC +:1025000001010101010101010101010101010101BB +:1025100001010101010101010101010101010101AB +:10252000010101010101010101010101010101029A +:102530000202020101010101010101010101010287 +:10254000020202020202020202020202020202026B +:10255000020202020202020202020202020202025B +:10256000020202020202020202020202020202024B +:10257000020202020202020202020202020202023B +:10258000020202020202020202020202020202022B +:10259000020202020202020202020202020202021B +:1025A000020202020202020202020202020202010C +:1025B000010101010101010101010101010101010B +:1025C00001010101010101010101010101010101FB +:1025D00001010101010101010101010101010101EB +:1025E00001010101010101010101010101010101DB +:1025F00001010101010101010101010101010101CB +:1026000001010101010101010101010101010101BA +:1026100001010101010101010101010101010101AA +:10262000010101010101010101010101010101019A +:102630000101010101010101010101010101010289 +:102640000202020101010101010101010101010276 +:10265000020202020202020202020202020202025A +:10266000020202020202020202020202020202024A +:10267000020202020202020202020202020202023A +:10268000020202020202020202020202020202022A +:10269000020202020202020202020202020202021A +:1026A000020202020202020202020202020202010B +:1026B000010101010101010101010101010101010A +:1026C00001010101010101010101010101010101FA +:1026D00001010101010101010101010101010101EA +:1026E00001010101010101010101010101010101DA +:1026F00001010101010101010101010101010101CA +:1027000001010101010101010101010101010101B9 +:1027100001010101010101010101010101010101A9 +:102720000101010101010101010101010101010199 +:102730000101010101010101010101010101010189 +:102740000101010101010101010101010101010278 +:102750000202020202020202020202020202020259 +:102760000202020202020202020202020202020249 +:102770000202020202020202020202020202020239 +:102780000202020202020202020202020202020229 +:102790000202020202020202020202020202020219 +:1027A000020202020202020202020202020202010A +:1027B0000101010101010101010101010101010109 +:1027C00001010101010101010101010101010101F9 +:1027D00001010101010101010101010101010101E9 +:1027E00001010101010101010101010101010101D9 +:1027F00001010101010101010101010101010101C9 +:1028000001010101010101010101010101010101B8 +:1028100001010101010101010101010101010101A8 +:102820000101010101010101010101010101010198 +:102830000101010101010101010101010101010188 +:102840000101010101010101010101010101010277 +:102850000202020202020202020202020202020258 +:102860000202020202020202020202020202020248 +:102870000202020202020202020202020202020238 +:102880000202020202020202020202020202020228 +:102890000202020202020202020202020202020218 +:1028A0000202020202020202020202020202020109 +:1028B0000101010101010101010101010101010108 +:1028C00001010101010101010101010101010101F8 +:1028D00001010101010101010101010101010101E8 +:1028E00001010101010101010101010101010101D8 +:1028F00001010101010101010101010101010101C8 +:1029000001010101010101010101010101010101B7 +:1029100001010101010101010101010101010101A7 +:102920000101010101010101010101010101010197 +:102930000101010101010101010101010101010187 +:102940000101010101010101010101010101010177 +:102950000201010101010101010101010101010265 +:102960000202020202020202020202020202020247 +:102970000202020202020202020202020202020237 +:102980000202020202020202020202020202020227 +:102990000202020202020202020202020202020217 +:1029A0000202020202020202020202020202020108 +:1029B0000101010101010101010101010101010107 +:1029C00001010101010101010101010101010101F7 +:1029D00001010101010101010101010101010101E7 +:1029E00001010101010101010101010101010101D7 +:1029F00001010101010101010101010101010101C7 +:102A000001010101010101010101010101010101B6 +:102A100001010101010101010101010101010101A6 +:102A20000101010101010101010101010101010196 +:102A30000101010101010101010101010101010186 +:102A40000101010101010101010101010101010176 +:102A50000101010101010101010101010101010265 +:102A60000202020202020202020202020202020246 +:102A70000202020202020202020202020202020236 +:102A80000202020202020202020202020202020028 +:102A90000000000000000000000000000000000234 +:102AA0000202020202020202020202020202020107 +:102AB0000101010101010101010101010101010106 +:102AC00001010101010101010101010101010101F6 +:102AD00001010101010101010101010101010101E6 +:102AE00001010101010101010101010101010101D6 +:102AF00001010101010101010101010101010101C6 +:102B000001010101010101010101010101010101B5 +:102B100001010101010101010101010101010101A5 +:102B20000101010101010101010101010101010195 +:102B30000101010101010101010101010101010185 +:102B40000101010101010101010101010101010175 +:102B50000101010101010101010101010101010066 +:102B60000000000000000000000000000000000263 +:102B70000202020202020202020202020202020235 +:102B80000202020202020202020202020202020027 +:102B90000000000000000000000000000000000233 +:102BA0000202020202020202020202020202020106 +:102BB0000101010101010101010101010101010105 +:102BC00001010101010101010101010101010101F5 +:102BD00001010101010101010101010101010101E5 +:102BE00001010101010101010101010101010101D5 +:102BF00001010101010101010101010101010101C5 +:102C000001010101010101010101010101010101B4 +:102C100001010101010101010101010101010101A4 +:102C20000101010101010101010101010101010194 +:102C30000101010101010101010101010101010184 +:102C40000101010101010101010101010101010174 +:102C50000101010101010101010101010101010164 +:102C60000101010101010101010101010101010253 +:102C70000202020202020202020202020202020234 +:102C80000202020202020202020202020202020026 +:102C90000000000000000000000000000000000232 +:102CA0000202020202020202020202020202020105 +:102CB0000101010101010101010101010101010104 +:102CC00001010101010101010101010101010101F4 +:102CD00001010101010101010101010101010101E4 +:102CE00001010101010101010101010101010101D4 +:102CF00001010101010101010101010101010101C4 +:102D000001010101010101010101010101010101B3 +:102D100001010101010101010101010101010101A3 +:102D20000101010101010101010101010101010193 +:102D30000101010101010101010101010101010183 +:102D40000101010101010101010101010101010173 +:102D50000101010101010101010101010101010163 +:102D60000101010101010101010101010101010153 +:102D70000101010101010101010101010101010044 +:102D80000000000000000000000000000000000142 +:102D90000101010101010101010101010101010024 +:102DA0000000000000000000000000000000000122 +:102DB0000101010101010101010101010101010103 +:102DC00001010101010101010101010101010101F3 +:102DD00001010101010101010101010101010101E3 +:102DE00001010101010101010101010101010101D3 +:102DF00001010101010101010101010101010101C3 +:102E000001010101010101010101010101010101B2 +:102E100001010101010101010101010101010101A2 +:102E20000101010101010101010101010101010192 +:102E30000101010101010101010101010101010182 +:102E40000101010101010101010101010101010172 +:102E50000101010101010101010101010101010162 +:102E60000101010101010101010101010101010152 +:102E70000101010101010101010101010101010142 +:102E80000101010101010101010101010101010132 +:102E90000101010101010101010101010101010023 +:102EA0000000000000000000000000000000000121 +:102EB0000101010101010101010101010101010102 +:102EC00001010101010101010101010101010101F2 +:102ED00001010101010101010101010101010102E1 +:102EE00002020202020202020202020202020202C2 +:102EF00002020202020202020202020202020202B2 +:102F000002020202020202020202020202020202A1 +:102F10000202020202020202020202020202020291 +:102F20000202020202020202020202020202020281 +:102F30000202020202020202020202020202020271 +:102F40000202020202020202020202020202020162 +:102F50000101010101010101010101010101010161 +:102F60000101010101010101010101010101010151 +:102F70000101010101010101010101010101010141 +:102F80000101010101010101010101010101010131 +:102F90000101010101010101010101010101010022 +:102FA0000000000000000000000000000000000120 +:102FB0000101010101010101010101010101010101 +:102FC00001010101010101010101010101010102F0 +:102FD00002020202020202020202020202020202D1 +:102FE00002020202020202020202020202020202C1 +:102FF00002020202020202020202020202020202B1 +:1030000002020202020202020202020202020202A0 +:103010000202020202020202020202020202020290 +:103020000202020202020202020202020202020280 +:103030000202020202020202020202020202020270 +:103040000202020202020202020202020202020260 +:103050000202020202020202020202020202020151 +:103060000101010101010101010101010101010150 +:103070000101010101010101010101010101010140 +:10308000010101010101010101010101010101022F +:103090000202020202020202020202020202020012 +:1030A0000000000000000000000000000000000020 +:1030B0000000000000000000000000000000000010 +:1030C0000000000000000000000000000000000000 +:1030D00000000000000000000000000000000000F0 +:1030E00000000000000000000000000000000000E0 +:1030F00000000000000000000000000000000000D0 +:1031000000000000000000000000000000000000BF +:1031100000000000000000000000000000000000AF +:10312000000000000000000000000000000000009F +:10313000000000000000000000000000000000008F +:10314000000000000000000000000000000000007F +:10315000000000000000000000000000000000006F +:10316000000000000000000000000000000000005F +:10317000000000000000000000000000000000004F +:10318000000000000000000000000000000000003F +:10319000000000000000000000000000000000002F +:1031A00000000000000000000000000000000040DF +:1031B000000000000000000000000000000000000F +:1031C00000000000010100000000000000000000FD +:1031D00000000000000000000000000000000000EF +:1031E00000000000000000000000000000000000DF +:1031F00000000000000000000000000000000000CF +:1032000000000000000000000000000000000000BE +:1032100000000000000000000000000000000000AE +:10322000000000000000000000000000000000009E +:10323000000000000000000000000000000000008E +:10324000000000000000000000000000000000007E +:10325000000000000000000000000000000000006E +:10326000000000000000000000000000000000005E +:10327000000000000000000000000000000000004E +:10328000000000000000000000000000000000003E +:10329000000000000000000000000000000000002E +:1032A000000000000000000000000000000000001E +:1032B0000000000000000001000000010101010009 +:1032C00000000000010100000000000000000000FC +:1032D00000000000000000000000000000000000EE +:1032E00000000000000000000000000000000000DE +:1032F00000000000000000000000000000000000CE +:1033000000000000000000000000000000000000BD +:1033100000000000000000000000000000000000AD +:10332000000000000000000000000000000000009D +:10333000000000000000000000000000000000008D +:10334000000000000000000000000000000000007D +:10335000000000000000000000000000000000006D +:10336000000000000000000000000000000000005D +:10337000000000000000000000000101000000004B +:10338000000000000000000000000000000000003D +:10339000000000000000000000000000000000002D +:1033A000000000000000000000000000000000001D +:1033B0000000000000000001010000010101010007 +:1033C00000000000010100000000000000000000FB +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000010000000000000000DC +:1033F00000000000000000000000000000000000CD +:1034000000000000000000010000000100000000BA +:1034100000000000000001000000000000000000AB +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000000008C +:10344000000000000000000000000000000000007C +:10345000000000000000000000000000000000006C +:10346000000000000000000000000000000000005C +:10347000000000000000000000000101000000004A +:103480000100000001010000000000000000000039 +:10349000000000000000000000000000000000002C +:1034A000000000000000000000000000000000001C +:1034B0000000000000000001010000010101010006 +:1034C00000000000010100000001000000000000F9 +:1034D00000000000000000000000000001000000EB +:1034E00000000000000000010100000000000000DA +:1034F00000000000000000000100000000000000CB +:1035000000000000000000010101000100000000B7 +:1035100000000000000001000000000100000000A9 +:10352000000000000000000000000000000000009B +:10353000000000000000000000000000000000008B +:10354000000000000000000001000000000000007A +:103550000000000000000000000000010100000069 +:10356000000000000000000000000000000000005B +:103570000000000000000000000001010101000047 +:103580000100000001010100000000000000000037 +:10359000000000000000000000000000000000002B +:1035A000000000000000000000000000000000001B +:1035B0000000000000000001010100010101010004 +:1035C00001000000010100000001010000000000F6 +:1035D00000000000000000000000000001000000EA +:1035E00000000000000000010100000000000000D9 +:1035F00000000000000000010100000000000000C9 +:1036000000000000000000010101010101000000B4 +:1036100000000000000001000101000100000000A6 +:10362000000000000000000000000000000000009A +:10363000000000000000000000000000000000008A +:103640000000000000000001010000000000000078 +:103650000000000000000000010100010100000066 +:103660000000000000000000010000000000000059 +:103670000000000000000000010101010101010043 +:103680000100000001010100000000000000000036 +:10369000000000000000000000000000000000002A +:1036A000000000000000000000000000000000001A +:1036B0000000000000000001010101010101010002 +:1036C00001000000010100000001010000000000F5 +:1036D00000000000000000010000000101000000E7 +:1036E00000000000000000010100000000000000D8 +:1036F00000000000000000010101000000000000C7 +:1037000000000000000000010101010101000000B3 +:1037100000000000000101010101010100000000A2 +:103720000000000000000000000000000000000099 +:103730000000000000000000010000000000000088 +:103740000000000000000001010100000000000076 +:103750000000000000000001010101010100000063 +:103760000000000000000101010001010100000053 +:103770000000000000000000010101010101010141 +:103780000100010101010100000000000000000033 +:103790000000000000000000000000000000000029 +:1037A0000000000000000000000000000000000019 +:1037B0000000000000000001010101010101010001 +:1037C00001010000010100000001010000000000F3 +:1037D00000000000000001010000000101000000E5 +:1037E00000000000000000010100000000000000D7 +:1037F00000000000000001010101010000000000C4 +:1038000000000000000000010101010101010000B1 +:1038100000000000000101010101010100000000A1 +:103820000000000000000000010000000000000097 +:103830000000000000000000010001010100000084 +:103840000000000000000001010100010100000073 +:103850000000000000000001010101010100000062 +:103860000000000000010101010101010100000050 +:103870000000000000000000010101010101010140 +:103880000101010101010100000000000000000031 +:103890000000000000000000000000000000000028 +:1038A0000000000000000000000000000000000018 +:1038B00000000000000000010101010101010101FF +:1038C00001010100010100000001010000000000F1 +:1038D00000000000000001010000000101000000E4 +:1038E00000000000000001010101000000000000D4 +:1038F00000000000000001010101010000000000C3 +:1039000000000000000000010101010101010100AF +:10391000010000000101010101010101000000009E +:103920000000000000000100010000000000000095 +:103930000000000000000000010101010100000082 +:103940000000000000000001010100010100000072 +:103950000000000000000001010101010100000061 +:10396000000000000001010101010101010000004F +:10397000000000000000000101010101010101013E +:103980000101010101010100000000000000000030 +:103990000000000000000000000000000000000027 +:1039A0000000000000000000000000000000000017 +:1039B00000000000000000010101010101010101FE +:1039C00001010100010100010001010101000000ED +:1039D00000000000000001010000000101000000E3 +:1039E00000000000000001010101010000010000D1 +:1039F00000000000000001010101010101000000C0 +:103A000000000000000000010101010101010100AE +:103A1000010000000101010101010101000000009D +:103A20000000000000000100010100000000000093 +:103A30000000000000000001010101010100000080 +:103A4000000000000000010101010101010000006F +:103A5000000000000000000101010101010001005F +:103A6000010000000101010101010101010000004C +:103A7000000000000000000101010101010101013D +:103A8000010101010101010001000000000000002E +:103A90000000000000000000000000000000000026 +:103AA0000000000000000000000000000000000016 +:103AB00000000000000000010101010101010101FD +:103AC00001010101010100010001010101000000EB +:103AD00000000000010101010000000101010000DF +:103AE00000000000000001010101010000010100CF +:103AF00001000000000001010101010101000000BE +:103B000000000000000000010101010101010100AD +:103B1000010000000101010101010101010000009B +:103B2000000000000000010101010101010100008D +:103B3000000000000000000101010101010000007F +:103B4000000000000001010101010101010000006D +:103B5000000000000000000101010101010101015C +:103B60000100010101010101010101010100000049 +:103B7000000000000000010101010101010101013B +:103B8000010101010101010101000000000000002C +:103B90000000000000000000000000000000000025 +:103BA0000000000000000000000000000000000015 +:103BB00000000000000000010101010101010101FC +:103BC00001010101010100010001010101000000EA +:103BD00000000000010101010100000101010000DD +:103BE00000000000000101010101010101010100CB +:103BF00001000000000001010101010101000000BD +:103C000000000000000001010101010101010101AA +:103C10000100000001010101010101010100010099 +:103C2000000000000001010101010101010100008B +:103C3000000000000000000101010101010100007D +:103C4000000000000001010101010101010000006C +:103C5000000000000000000101010101010101015B +:103C60000100010101010101010101010100000048 +:103C70000100000001010101010101010101010137 +:103C8000010101010101010101000000000000002B +:103C90000000000000000001000000000000000023 +:103CA0000000000000000000000000000000000014 +:103CB00000000000000000010101010101010101FB +:103CC00001010101010100010001010101000000E9 +:103CD00000000000010101010100010101010000DB +:103CE00000000000000101010101010101010100CA +:103CF00001000000010101010101010101000000BA +:103D000000000000000001010101010101010101A9 +:103D10000100000001010101010101010101010196 +:103D2000000000000001010101010101010100008A +:103D3000000000000000010101010101010101007A +:103D40000100000001010101010101010100000069 +:103D50000100000000000001010101010101010159 +:103D60000100010101010101010101010101000145 +:103D70000100010001010101010101010101010135 +:103D80000101010101010101010001010100000027 +:103D90000000000000000001010000000000000021 +:103DA0000000000000000000000000000000000013 +:103DB00000000000000000010101010101010101FA +:103DC00001010101010100010001010101000000E8 +:103DD00000000000010101010101010101010000D9 +:103DE00001000000010101010101010101010101C6 +:103DF00001000100010101010101010101010000B7 +:103E000000000000000001010101010101010101A8 +:103E10000100010101010101010101010101010193 +:103E20000100000001010101010101010101010086 +:103E30000000000000000101010101010101010079 +:103E40000100000001010101010101010100000068 +:103E50000100000000000101010101010101010157 +:103E60000101010101010101010101010101010142 +:103E70000100010001010101010101010101010134 +:103E80000101010101010101010101010100000025 +:103E90000000000000000001010000000000000020 +:103EA0000000000000000000000000000000000012 +:103EB00000000000000000020101010101010101F8 +:103EC00001010101010100010101010101000000E6 +:103ED00001000000010101010101010101010000D7 +:103EE00001000000010101010101010101010101C5 +:103EF00001000100010101010101010101010100B5 +:103F000001000000000001010101010101010101A6 +:103F10000100010101010101010101010101010192 +:103F20000100010001010101010101010101010084 +:103F30000000000000000101010101010101010078 +:103F40000100000001010101010101010100000067 +:103F50000100000000000101010101010101010156 +:103F60000101010101010101010101010101010141 +:103F70000100010101010101010101010101010132 +:103F80000101010101010101010101010100000024 +:103F9000000000000000000101000000000000001F +:103FA0000000000000000000000000000000000011 +:103FB00000000000000000020101010101010101F7 +:103FC00001010101010100010101010101010000E4 +:103FD00001000000010101010101010101010100D5 +:103FE00001000000010101010101010101010101C4 +:103FF00001000100010101010101010101010100B4 +:1040000001000000000001010101010101010101A5 +:104010000100010101010101010101010101010191 +:104020000100010001010101010101010101010083 +:104030000000000001010101010101010101010174 +:104040000100010101010101010101010101000063 +:104050000100000000000101010101010101010155 +:104060000101010101010101010101010101010140 +:104070000101010101010101010101010101010130 +:104080000101010101010101010101010100000023 +:10409000000000000000000101000100000000001D +:1040A0000000000000000000000000000000000010 +:1040B00000000000000000020101010101010201F5 +:1040C00001010101010100010101010101010100E2 +:1040D00001000000010101010101010101010101D3 +:1040E00001000000010101020101010101010101C2 +:1040F00001000100010101010101010101010100B3 +:1041000001000000010101010101010101010101A2 +:104110000100010101010101010101010101010190 +:104120000100010101010101010101010101010081 +:104130000000000001010101010101010101010173 +:104140000100010101010101010101010101010061 +:104150000100000001010101010101010101010152 +:10416000010101010101010101010101010101013F +:10417000010101010101010101010101010101012F +:104180000101010101010101010101010101000021 +:10419000000000000000000101010100000000001B +:1041A000000000000000000000000000000000000F +:1041B00000000000000000020201010101010201F3 +:1041C00001010101010100010101010101010101E0 +:1041D00001000100010101020101010101010101D0 +:1041E00001000000010101020101010101010101C1 +:1041F00001000101010101010101010101010101B0 +:1042000001000000010101020101010101010101A0 +:10421000010001010101010101010101010101018F +:104220000100010101010101010101010101010080 +:104230000100000001010101010101010101010171 +:10424000010001010101010101010101010101015F +:10425000010001010101010101010101010101014F +:10426000010101010101010101010101010101013E +:10427000010101010101010101010101010101012E +:10428000010101010101010101010101010101001F +:104290000100000000000001010101010100000017 +:1042A000000000000000000000000000000000000E +:1042B00000000000000000020202010201010201F0 +:1042C00001010101010100010102010101010101DE +:1042D00001000100010101020101010101010101CF +:1042E00001000100010101020101010101010101BF +:1042F00001010101010101020101010101010101AD +:10430000010000000101010201010101010101019F +:10431000010001010101010101010101010101018E +:10432000010001010101010101010101010101017E +:10433000010001010101010101010101010101016E +:10434000010101010101010101010101010101015D +:10435000010001010101010101010101010101014E +:10436000010101010101010101010101010101013D +:10437000010101010101010101010101010101012D +:10438000010101010101010101010101010101011D +:104390000100000100000001010101010100000015 +:1043A000000000000000000000000000000000000D +:1043B00000000000000000020202010202020201ED +:1043C00001010101010100020102010101010101DC +:1043D00001000101010101020101010101010101CD +:1043E00001000100010101020201010101010101BD +:1043F00001010101010101020101010101010101AC +:10440000010000000101010201010101010101019E +:10441000010001010101010201010101010101018C +:10442000010101010101010101010101010101017C +:10443000010001010101010101010101010101016D +:10444000010101010101010201010101010101015B +:10445000010001010101010101010101010101014D +:10446000010101010101010101010101010101013C +:10447000010101010101010101010101010101012C +:10448000010101010101010101010101010101011C +:104490000100000101010001010101010101000011 +:1044A000000000000000000000000000000000000C +:1044B00000000000000000020202020202020201EB +:1044C00001020101010100020102020101010101D9 +:1044D00001000101010101020101010101010101CC +:1044E00001000100010101020201010101010101BC +:1044F00001010101010101020201010101010101AA +:10450000010000000101010202020101010101019B +:10451000010001010101010201010101010101018B +:10452000010101010101010101010101010101017B +:10453000010001010101010101010101010101016C +:10454000010101010101010201010101010101015A +:10455000010101010101010201010101010101014A +:10456000010101010101010101010101010101013B +:10457000010101010101010101010101010101012B +:10458000010101010101010101010101010101011B +:10459000010001010101000101010101010101000E +:1045A0000000000000000000000200000000000009 +:1045B00000000000000000020202020202020201EA +:1045C00002020101010100020102020101010101D7 +:1045D00001000101010101020101010202010101C9 +:1045E00001000100010101020202010101010101BA +:1045F00001010101010101020202010101010101A8 +:10460000010000000101010202020101010101019A +:104610000100010101010102020201010101010188 +:104620000101010101010102010101010101010179 +:10463000010101010101010101010101010101016A +:104640000101010101010102020101010101010158 +:104650000101010101010102010101010101010149 +:104660000101010101010102010101010101010139 +:10467000010101010101010101010101010101012A +:104680000101010101010102010101010101010119 +:10469000010101010101000101010101010101010B +:1046A0000000000000000000000200000000000008 +:1046B00000000000000000020202020202020202E8 +:1046C00002020101020200020102020101010101D4 +:1046D00001000101010101020201010202010101C7 +:1046E00001000100010101020202010101010101B9 +:1046F00001010101010101020202010101010101A7 +:104700000100000001010102020202020101010197 +:104710000100010101010102020201010101010187 +:104720000101010101010102020101010101010177 +:104730000101010101010102010101010101010168 +:104740000101010101010102020201010101010156 +:104750000101010101010102020201010101010146 +:104760000101010101010102010101010101010138 +:104770000101010101010102010101010101010128 +:104780000101010101010102010101010101010118 +:104790000101010101010102010101010101010108 +:1047A0000100000001000000000200000000000005 +:1047B00000000000000000020202020202020202E7 +:1047C00002020201020200020102020201010101D1 +:1047D00001000101010101020202010202010101C5 +:1047E00001000100010101020202020101010101B7 +:1047F00001010101010101020202020101010101A5 +:104800000100000001010102020202020101010196 +:104810000100010101010102020202020101010184 +:104820000101010101010102020201010101010175 +:104830000101010101010102020101010101010166 +:104840000101010101010102020201010101010155 +:104850000101010101010102020201010101010145 +:104860000101010101010102020101010101010136 +:104870000101010101010102020202010101010124 +:104880000101010101010102020101010101010116 +:104890000101010101010102010101010101010107 +:1048A0000100010101000000000200000000000002 +:1048B00000000000000000020202020202020202E6 +:1048C00002020201020200020202020202010101CE +:1048D00001010101010101020202020202020101C1 +:1048E00001000100010101020202020101020101B5 +:1048F00001010101010101020202020101010101A4 +:104900000100000001010102020202020201010194 +:104910000101010101010102020202020101010182 +:104920000101010101010102020201010101010174 +:104930000101010101010102020201010101010164 +:104940000101010101010102020201010101010154 +:104950000101010101010102020202020101010142 +:104960000101010101010102020201010101010134 +:104970000101010101010102020202020101010122 +:104980000101010101010102020101010101010115 +:104990000101010101010102010101010101010106 +:1049A0000101010101010000000100000000000000 +:1049B00000000000010000020202020202020202E4 +:1049C00002020202020200020202020202010101CC +:1049D00001010101010101020202020202020101C0 +:1049E00001000100010101020202020201020201B2 +:1049F00001010101010101020202020201010101A2 +:104A00000100000101010102020202020202010191 +:104A10000101010101010102020202020101010181 +:104A20000101010101010102020202010101010172 +:104A30000101010101010102020202010101010162 +:104A40000101010101010102020202020101010151 +:104A50000101010101010102020202020201010140 +:104A60000101010101010102020202010101010132 +:104A70000101010101010102020202020101010121 +:104A80000101010101010102020201010101010113 +:104A90000101010101010102020101010101010104 +:104AA00001010101010101000001010000000000FD +:104AB00000000000010000020202020202020202E3 +:104AC00002020202020200020202020202010101CB +:104AD00001010101010101020202020202020101BF +:104AE00001000101010101020202020202020201AF +:104AF000020101010101010202020202020101019F +:104B0000010000010101010202020202020202018F +:104B10000101010101010102020202020101010180 +:104B20000101010101010102020202020101010170 +:104B30000101010101010102020202020101010160 +:104B4000010101010101010202020202020101014F +:104B5000010101010101010202020202020101013F +:104B60000101010101010102020202020101010130 +:104B7000010101010101010202020202020201011E +:104B80000101010101010102020202010101010111 +:104B90000101010101010102020101010101010103 +:104BA00001010101010101000001010000000000FC +:104BB00000000000010000020202020202020202E2 +:104BC00002020202020200020202020202020101C9 +:104BD00001010101010102020202020202020201BC +:104BE00002010101010102020202020202020202AA +:104BF000020101010101020202020202020101019D +:104C0000010000010101010202020202020202018E +:104C1000020101010101020202020202020101017C +:104C2000010101010101010202020202020201016D +:104C3000010101010101010202020202020101015E +:104C4000010101010101010202020202020101014E +:104C5000010101010101010202020202020101013E +:104C6000010101010101010202020202020101012E +:104C7000010101010101010202020202020202011C +:104C8000020101010101010202020202010101010E +:104C90000101010101010102020201010101010101 +:104CA00001010101010101000001010000000000FB +:104CB00000000000010000020202020202020202E1 +:104CC00002020202020200020202020202020201C7 +:104CD00002010101020202020202020202020202B7 +:104CE00002010101010202020202020202020202A8 +:104CF000020102010101020202020202020201019A +:104D0000010000010101010202020202020202028C +:104D10000201010101020202020202020202020178 +:104D2000010101010101010202020202020201016C +:104D3000010101010101010202020202020101015D +:104D4000010101010101010202020202020101014D +:104D5000010101010101010202020202020202013B +:104D6000010101010101010202020202020101012D +:104D7000010101010101010202020202020202021A +:104D8000020101010101010202020202020101010C +:104D900001010101010101020202020101010101FF +:104DA00001010101010101000101010000000000F9 +:104DB00000000000010100020202020202020202DF +:104DC00002020202020200020202020202020202C5 +:104DD00002010101020202020202020202020202B6 +:104DE00002010101020202020202020202020202A6 +:104DF0000201020102020202020202020202020196 +:104E0000010001010101010202020202020202028A +:104E10000201010102020202020202020202020275 +:104E2000010101010101010202020202020202016A +:104E3000010101010101010202020202020201015B +:104E4000010101010101010202020202020101014C +:104E50000101010101010102020202020202020239 +:104E6000020101010101010202020202020101012B +:104E70000101010101010102020202020202020219 +:104E80000202020102020102020202020201010107 +:104E900001010101010101020202020101010101FE +:104EA00001010101010101000101000101000001F6 +:104EB00000000000010101020202020202020202DD +:104EC00002020202020200020202020202020202C4 +:104ED00002010201020202020202020202020202B4 +:104EE00002010201020202020202020202020202A4 +:104EF0000202020102020202020202020202020194 +:104F00000202010101010102020202020202020286 +:104F10000201020102020202020202020202020273 +:104F20000201010101010202020202020202020167 +:104F30000101010101010102020202020202020159 +:104F4000010101010101010202020202020201014A +:104F50000201010101010102020202020202020237 +:104F60000201020101020202020202020202010126 +:104F70000101010101010102020202020202020218 +:104F80000202020202020202020202020202010103 +:104F900001010101010101020202020201010101FC +:104FA00001010101010101000100000101000001F6 +:104FB00000000000010101020202020202020202DC +:104FC00002020202020200020202020202020202C3 +:104FD00002010201020202020202020202020202B3 +:104FE00002010201020202020202020202020202A3 +:104FF0000202020202020202020202020202020291 +:105000000201010101010202020202020202020285 +:105010000201020202020202020202020202020271 +:105020000201020101020202020202020202020164 +:105030000101010101010102020202020202020158 +:105040000201010101010102020202020202020147 +:105050000201010101010102020202020202020236 +:105060000202020202020202020202020202020220 +:105070000201010101010102020202020202020216 +:105080000202020202020202020202020202020101 +:1050900001010101010101020202020202010101FA +:1050A00001010101010101000000000101000001F6 +:1050B00000000001010101020202020202020202DA +:1050C00002020202020200020202020202020202C2 +:1050D00002010202020202020202020202020202B1 +:1050E00002010201020202020202020202020202A2 +:1050F0000202020202020202020202020202020290 +:105100000201010101010202020202020202020284 +:105110000201020202020202020202020202020270 +:105120000201020102020202020202020202020261 +:105130000201010101010202020202020202020254 +:105140000201010101020202020202020202020243 +:105150000201010101010102020202020202020235 +:10516000020202020202020202020202020202021F +:105170000201020101010102020202020202020214 +:1051800002020202020202020202020202020202FF +:1051900002010101010101020202020202020101F7 +:1051A00001010101010101000000000101000001F5 +:1051B00001000101010101020202020202020202D7 +:1051C00002020202020200020202020202020202C1 +:1051D00002020202020202020202020202020202AF +:1051E00002010201020202020202020202020202A1 +:1051F000020202020202020202020202020202028F +:105200000201010102020202020202020202020281 +:10521000020102020202020202020202020202026F +:10522000020202020202020202020202020202025E +:105230000201020102020202020202020202020250 +:105240000201020102020202020202020202020240 +:105250000201020101010202020202020202020232 +:10526000020202020202020202020202020202021E +:10527000020202010202020202020202020202020F +:1052800002020202020202020202020202020202FE +:1052900002010101010101020202020202020201F5 +:1052A00001010101010101000000000101000001F4 +:1052B00001000101010101020202020202020202D6 +:1052C00002020202020200020202020202020202C0 +:1052D00002020202020202020202020202020202AE +:1052E000020202010202020202020202020202029F +:1052F000020202020202020202020202020202028E +:105300000201010102020202020202020202020280 +:10531000020102020202020202020202020202026E +:10532000020202020202020202020202020202025D +:10533000020202020202020202020202020202024D +:10534000020202020202020202020202020202023D +:10535000020202020202020202020202020202022D +:10536000020202020202020202020202020202021D +:10537000020202020202020202020202020202020D +:1053800002020202020202020202020202020202FD +:1053900002020202010101020202020202020202F0 +:1053A00001010101010101000000000001000101F3 +:1053B00001000101010101020202020202020202D5 +:1053C00002020202020200020202020202020202BF +:1053D00002020202020202020202020202020202AD +:1053E000020202020202020202020202020202029D +:1053F000020202020202020202020202020202028D +:10540000020101010202020202020202020202027F +:10541000020202020202020202020202020202026C +:10542000020202020202020202020202020202025C +:10543000020202020202020202020202020202024C +:10544000020202020202020202020202020202023C +:10545000020202020202020202020202020202022C +:10546000020202020202020202020202020202021C +:10547000020202020202020202020202020202020C +:1054800002020202020202020202020202020202FC +:1054900002020202020201020202020202020202ED +:1054A00002010101010101000000000000000100F3 +:1054B00001010101000101020202020202020202D4 +:1054C00002020202020200020202020202020202BE +:1054D00002020202020202020202020202020202AC +:1054E000020202020202020202020202020202029C +:1054F000020202020202020202020202020202028C +:10550000020101010202020202020202020202027E +:10551000020202020202020202020202020202026B +:10552000020202020202020202020202020202025B +:10553000020202020202020202020202020202024B +:10554000020202020202020202020202020202023B +:10555000020202020202020202020202020202022B +:10556000020202020202020202020202020202021B +:10557000020202020202020202020202020202020B +:1055800002020202020202020202020202020202FB +:1055900002020202020201020202020202020202EC +:1055A00002020201010101000000000000000100F0 +:1055B00001010101000101020202020202020102D4 +:1055C00002020202020200020202020202020202BD +:1055D00002020202020202020202020202020202AB +:1055E000020202020202020202020202020202029B +:1055F000020202020202020202020202020202028B +:10560000020101020202020202020202020202027C +:10561000020202020202020202020202020202026A +:10562000020202020202020202020202020202025A +:10563000020202020202020202020202020202024A +:10564000020202020202020202020202020202023A +:10565000020202020202020202020202020202022A +:10566000020202020202020202020202020202021A +:10567000020202020202020202020202020202020A +:1056800002020202020202020202020202020202FA +:1056900002020202020202020202020202020202EA +:1056A00002020202020101000000000000010100EC +:1056B00001010101000101020202020202020102D3 +:1056C00002010202020200020202020202020202BD +:1056D00002020202020202020202020202020202AA +:1056E000020202020202020202020202020202029A +:1056F000020202020202020202020202020202028A +:10570000020102020202020202020202020202027A +:105710000202020202020202020202020202020269 +:105720000202020202020202020202020202020259 +:105730000202020202020202020202020202020249 +:105740000202020202020202020202020202020239 +:105750000202020202020202020202020202020229 +:105760000202020202020202020202020202020219 +:105770000202020202020202020202020202020209 +:1057800002020202020202020202020202020202F9 +:1057900002020202020202020202020202020202E9 +:1057A00002020202020201000000000000010100EA +:1057B00000010101000001020202020202020102D4 +:1057C00002010202020200020202020202020202BC +:1057D00002020202020202020202020202020202A9 +:1057E0000202020202020202020202020202020299 +:1057F0000202020202020202020202020202020289 +:105800000202020202020202020202020202020278 +:105810000202020202020202020202020202020268 +:105820000202020202020202020202020202020258 +:105830000202020202020202020202020202020248 +:105840000202020202020202020202020202020238 +:105850000202020202020202020202020202020228 +:105860000202020202020202020202020202020218 +:105870000202020202020202020202020202020208 +:1058800002020202020202020202020202020202F8 +:1058900002020202020202020202020202020202E8 +:1058A00002020202020202020000000000010000E7 +:1058B00000010001000001020202020202020102D4 +:1058C00002010202020200020202020202020202BB +:1058D00002020202020202020202020202020202A8 +:1058E0000202020202020202020202020202020298 +:1058F0000202020202020202020202020202020288 +:105900000202020202020202020202020202020277 +:105910000202020202020202020202020202020267 +:105920000202020202020202020202020202020257 +:105930000202020202020202020202020202020247 +:105940000202020202020202020202020202020237 +:105950000202020202020202020202020202020227 +:105960000202020202020202020202020202020217 +:105970000202020202020202020202020202020207 +:1059800002020202020202020202020202020202F7 +:1059900002020202020202020202020202020202E7 +:1059A00002020202020202020000000000010000E6 +:1059B00000000000000000020202020202020102D6 +:1059C00002010202020200020202020202020202BA +:1059D00002020202020202020202020202020202A7 +:1059E0000202020202020202020202020202020297 +:1059F0000202020202020202020202020202020287 +:105A00000202020202020202020202020202020276 +:105A10000202020202020202020202020202020266 +:105A20000202020202020202020202020202020256 +:105A30000202020202020202020202020202020246 +:105A40000202020202020202020202020202020236 +:105A50000202020202020202020202020202020226 +:105A60000202020202020202020202020202020216 +:105A70000202020202020202020202020202020206 +:105A800002020202020202020202020202020202F6 +:105A900002020202020202020202020202020202E6 +:105AA00002020202020202020200000000000000E4 +:105AB00000000000000000020202020202020101D6 +:105AC00001010101020201020202020202020202BB +:105AD00002020202020202020202020202020202A6 +:105AE0000202020202020202020202020202020296 +:105AF0000202020202020202020202020202020286 +:105B00000202020202020202020202020202020275 +:105B10000202020202020202020202020202020265 +:105B20000202020202020202020202020202020255 +:105B30000202020202020202020202020202020245 +:105B40000202020202020202020202020202020235 +:105B50000202020202020202020202020202020225 +:105B60000202020202020202020202020202020215 +:105B70000202020202020202020202020202020205 +:105B800002020202020202020202020202020202F5 +:105B900002020202020202020202020202020202E5 +:105BA00002020202020202020202000000000000E1 +:105BB00000000000000000020202020101010101D8 +:105BC00001010101010101020202020202020202BC +:105BD00002020202020202020202020202020202A5 +:105BE0000202020202020202020202020202020295 +:105BF0000202020202020202020202020202020285 +:105C00000202020202020202020202020202020274 +:105C10000202020202020202020202020202020264 +:105C20000202020202020202020202020202020254 +:105C30000202020202020202020202020202020244 +:105C40000202020202020202020202020202020234 +:105C50000202020202020202020202020202020224 +:105C60000202020202020202020202020202020214 +:105C70000202020202020202020202020202020204 +:105C800002020202020202020202020202020202F4 +:105C900002020202020202020202020202020202E4 +:105CA00002020202020202020202020000000000DE +:105CB00000000000000000010101010101010101DB +:105CC00001010101010101020202020202020202BB +:105CD00002020202020202020202020202020202A4 +:105CE0000202020202020202020202020202020294 +:105CF0000202020202020202020202020202020284 +:105D00000202020202020202020202020202020273 +:105D10000202020202020202020202020202020263 +:105D20000202020202020202020202020202020253 +:105D30000202020202020202020202020202020243 +:105D40000202020202020202020202020202020233 +:105D50000202020202020202020202020202020223 +:105D60000202020202020202020202020202020213 +:105D70000202020202020202020202020202020203 +:105D800002020202020202020202020202020202F3 +:105D900002020202020202020202020202020202E3 +:105DA00002020202020202020202020200000000DB +:105DB00000000000000000010101010101010101DA +:105DC00001010101010101020202020202020202BA +:105DD00002020202020202020202020000000000AD +:105DE00000000000000000020202020202020202A1 +:105DF0000202020202020202020202020202020283 +:105E00000202020202020202020202020202020272 +:105E10000202020202020202020202020202020262 +:105E20000202020202020202020202020202020252 +:105E30000202020202020202020202020202020242 +:105E40000202020202020202020202020202020232 +:105E50000202020202020202020202020202020222 +:105E60000202020202020202020202020202020212 +:105E70000202020202020202020202020202020202 +:105E800002020202020202020202020202020202F2 +:105E900002020202020202020202020202020202E2 +:105EA00002020202020202020202020202000000D8 +:105EB00000000000000000010101010101010101D9 +:105EC00001010101010101020202020202020202B9 +:105ED00002020202020202000000000000000000B4 +:105EE00000000000000000020202020202010101A3 +:105EF0000101010101010102020202020202020289 +:105F00000202020202020202020202020202020271 +:105F10000202020202020202020202020202020261 +:105F20000202020202020202020202020202020251 +:105F30000202020202020202020202020202020241 +:105F40000202020202020202020202020202020231 +:105F50000202020202020202020202020202020221 +:105F60000202020202020202020202020202020211 +:105F70000202020202020202020202020202020201 +:105F800002020202020202020202020202020202F1 +:105F900002020202020202020202020202020202E1 +:105FA00002020202020202020202020202000000D7 +:105FB00000000000000000010101010101010001D9 +:105FC00001010101010101020201010101010101BF +:105FD00001010101010101000000000101010101B5 +:105FE0000101010101010102020202020202020298 +:105FF0000202020202020202020202020202020281 +:106000000202020202020202020202020202020270 +:106010000202020202020202020202020202020260 +:106020000202020202020202020202020202020250 +:106030000202020202020202020202020202020240 +:106040000202020202020202020202020202020230 +:106050000202020202020202020202020202020220 +:106060000202020202020202020202020202020210 +:106070000202020202020202020202020202020200 +:1060800002020202020202020202020202020202F0 +:1060900002020202020202020202020202020202E0 +:1060A00002020202020202020202020202020202D0 +:1060B00000000000020000010101010101010001D6 +:1060C00001000101010101010101010101010101C1 +:1060D00001010101010101010101010101010101B0 +:1060E00001010101010101010101010101000000A3 +:1060F000000000000000000202020202020202028E +:10610000020202020202020202020202020202026F +:10611000020202020202020202020202020202025F +:10612000020202020202020202020202020202024F +:10613000020202020202020202020202020202023F +:10614000020202020202020202020202020202022F +:10615000020202020202020202020202020202021F +:10616000020202020202020202020202020202020F +:1061700002020202020202020202020202020202FF +:1061800002020202020202020202020202020202EF +:1061900002020202020202020202020202020202DF +:1061A00002020202020202020202020202020202CF +:1061B00002000202020202010101010101010001CB +:1061C00001000101010101010101010101010101C0 +:1061D00001010101010101010101010101010101AF +:1061E000010101010101010202020202020000009C +:1061F000000000000000000202020202020202028D +:10620000020202020202020202020202020202026E +:10621000020202020202020202020202020202025E +:10622000020202020202020202020202020202024E +:10623000020202020202020202020202020202023E +:10624000020202020202020202020202020202022E +:10625000020202020202020202020202020202021E +:10626000020202020202020202020202020202020E +:1062700002020202020202020202020202020202FE +:1062800002020202020202020202020202020202EE +:1062900002020202020202020202020202020202DE +:1062A00002020202020202020202020202020202CE +:1062B00002020202020202010101010101010001C8 +:1062C00001000101010101010101010101010101BF +:1062D00001010101010101010101010101010101AE +:1062E000010101010101010101010101010101019E +:1062F0000101010101010102020202020202020285 +:10630000020202020202020202020202020202026D +:10631000020202020202020202020202020202025D +:10632000020202020202020202020202020202024D +:10633000020202020202020202020202020202023D +:10634000020202020202020202020202020202022D +:10635000020202020202020202020202020202021D +:10636000020202020202020202020202020202020D +:1063700002020202020202020202020202020202FD +:1063800002020202020202020202020202020202ED +:1063900002020202020202020202020202020202DD +:1063A00002020202020202020202020202020202CD +:1063B00002020202020202010101010101010001C7 +:1063C00001000101010101010101010101010101BE +:1063D00001010101010101010101010101010101AD +:1063E000010101010101010101010101010101019D +:1063F000010101010101010101010101010101018D +:106400000101010101010102020202020202020273 +:106410000202020202020201010101010101010165 +:10642000010101010101010101010101010101015C +:106430000101010101010102020202020202020243 +:10644000020202020202020202020202020202022C +:10645000020202020202020202020202020202021C +:10646000020202020202020202020202020202020C +:1064700002020202020202020202020202020202FC +:1064800002020202020202020202020202020202EC +:1064900002020202020202020202020202020202DC +:1064A00002020202020202020202020202020202CC +:1064B00002020202020202010101010101010101C5 +:1064C00001010101010101010101010101010101BC +:1064D00001010101010101010101010101010101AC +:1064E000010101010101010101010101010101019C +:1064F000010101010101010101010101010101018C +:10650000010101010101010101010101010101017B +:106510000101010101010102020202020202020262 +:10652000020202020202020202020202020202024B +:10653000020202020202020202020202020202023B +:10654000020202020202020202020202020202022B +:10655000020202020202020202020202020202021B +:10656000020202020202020202020202020202020B +:1065700002020202020202020202020202020202FB +:1065800002020202020202020202020202020202EB +:1065900002020202020202020202020202020202DB +:1065A00002020202020202020202020202020202CB +:1065B00002020202020202010101010101010101C4 +:1065C00001010101010101010101010101010101BB +:1065D00001010101010101010101010101010101AB +:1065E000010101010101010101010101010101019B +:1065F000010101010101010101010101010101018B +:10660000010101010101010101010101010101017A +:106610000101010101010100000000000000000073 +:10662000000000000000000000000000000000006A +:106630000000000000000002020202020202020248 +:106640000202020202020201010101010101010133 +:10665000010101010101010101010101010101012A +:106660000101010101010102020202020202020211 +:1066700002020202020202020202020202020202FA +:1066800002020202020202010101010101010101F3 +:1066900001010101010101010101010101010101EA +:1066A00001010101010101020202020202020202D1 +:1066B00002020202020202010101010101010101C3 +:1066C00001010101010101010101010101010101BA +:1066D00001010101010101010101010101010101AA +:1066E000010101010101010101010101010101019A +:1066F000010101010101010101010101010101018A +:106700000101010101010101010101010101010179 +:106710000101010101010101010101010101010169 +:106720000101010101010100000000000000000062 +:106730000000000000000002020202020202020247 +:106740000202020202020202020202020202020229 +:106750000202020202020202020202020202020219 +:106760000202020202020202020202020202020209 +:1067700002020202020202020202020202020202F9 +:1067800002020202020202020202020202020202E9 +:1067900002020202020202020202020202020202D9 +:1067A00002020202020202020202020202020202C9 +:1067B00002020202020202010101010101010101C2 +:1067C00001010101010101010101010101010101B9 +:1067D00001010101010101010101010101010101A9 +:1067E0000101010101010101010101010101010199 +:1067F0000101010101010101010101010101010189 +:106800000101010101010101010101010101010178 +:106810000101010101010101010101010101010168 +:106820000101010101010101010101010101010158 +:106830000101010101010101010101010101010148 +:106840000101010101010101010101010101010138 +:106850000101010101010100000000000000000031 +:106860000000000000000002020202020202020216 +:1068700002020202020202020202020202020202F8 +:1068800002020202020202000000000000000000FA +:1068900000000000000000000000000000000000F8 +:1068A00000000000000000020202020202020202D6 +:1068B00002020202020202010101010101010101C1 +:1068C00001010101010101010101010101010101B8 +:1068D00001010101010101010101010101010101A8 +:1068E0000101010101010101010101010101010198 +:1068F0000101010101010101010101010101010188 +:106900000101010101010101010101010101010177 +:106910000101010101010101010101010101010167 +:106920000101010101010101010101010101010157 +:106930000101010101010101010101010101010147 +:106940000101010101010101010101010101010137 +:106950000101010101010100000000000000000030 +:10696000000000000000000101010101010101011E +:1069700001010101010101020202020202020202FE +:1069800002020202020202000000000000000000F9 +:1069900000000000000000000000000000000000F7 +:1069A00000000000000000020202020202020202D5 +:1069B00002020202020202010101010101010101C0 +:1069C00001010101010101010101010101010101B7 +:1069D00001010101010101010101010101010101A7 +:1069E0000101010101010101010101010101010197 +:1069F0000101010101010101010101010101010187 +:106A00000101010101010101010101010101010176 +:106A10000101010101010101010101010101010166 +:106A20000101010101010101010101010101010156 +:106A30000101010101010101010101010101010146 +:106A40000101010101010101010101010101010136 +:106A50000101010101010101010101010101010126 +:106A60000101010101010101010101010101010116 +:106A70000101010101010101010101010101010106 +:106A800001010101010101000000000000000000FF +:106A900000000000000000000000000000000000F6 +:106AA00000000000000000020202020202020202D4 +:106AB00002020202020202010101010101010101BF +:106AC00001010101010101010101010101010101B6 +:106AD00001010101010101010101010101010101A6 +:106AE0000101010101010101010101010101010196 +:106AF0000101010101010101010101010101010186 +:106B00000101010101010101010101010101010175 +:106B10000101010101010101010101010101010165 +:106B20000101010101010101010101010101010155 +:106B30000101010101010101010101010101010145 +:106B40000101010101010101010101010101010135 +:106B50000101010101010101010101010101010125 +:106B60000101010101010101010101010101010115 +:106B700001010101010101020202020202020202FC +:106B800002020202020202000000000000000000F7 +:106B900000000000000000000000000000000000F5 +:106BA00000000000000000020202020202020202D3 +:106BB00002020202020202010101010101010101BE +:106BC00001010101010101010101010101010101B5 +:106BD00001010101010101010101010101010101A5 +:106BE0000101010101010101010101010101010195 +:106BF0000101010101010101010101010101010185 +:106C00000101010101010101010101010101010174 +:106C10000101010101010101010101010101010164 +:106C20000101010101010101010101010101010154 +:106C30000101010101010101010101010101010144 +:106C40000101010101010101010101010101010134 +:106C50000101010101010101010101010101010124 +:106C60000101010101010101010101010101010114 +:106C70000101010101010101010101010101010104 +:106C800001010101010101010101010101010101F4 +:106C900001010101010101010101010101010101E4 +:106CA00001010101010101000000000000000000DD +:106CB00000000000000000010101010101010101CB +:106CC00001010101010101010101010101010101B4 +:106CD00001010101010101010101010101010101A4 +:106CE0000101010101010101010101010101010194 +:106CF0000101010101010101010101010101010184 +:106D00000101010101010101010101010101010173 +:106D10000101010101010101010101010101010163 +:106D20000101010101010101010101010101010153 +:106D30000101010101010101010101010101010143 +:106D40000101010101010101010101010101010133 +:106D50000101010101010101010101010101010123 +:106D60000101010101010101010101010101010113 +:106D70000101010101010101010101010101010103 +:106D800001010101010101010101010101010101F3 +:106D900001010101010101010101010101010101E3 +:106DA00001010101010101000000000000000000DC +:106DB00000000000000000010101010101010101CA +:106DC00001010101010101010101010101010101B3 +:106DD00001010101010101010101010101010101A3 +:106DE0000101010101010101010101010101010193 +:106DF0000101010101010101010101010101010183 +:106E00000101010101010101010101010101010172 +:106E10000101010101010101010101010101010162 +:106E20000101010101010101010101010101010152 +:106E30000101010101010101010101010101010142 +:106E40000101010101010101010101010101010132 +:106E50000101010101010101010101010101010122 +:106E60000101010101010101010101010101010112 +:106E70000101010101010101010101010101010102 +:106E800001010101010101010101010101010101F2 +:106E900001010101010101010101010101010101E2 +:106EA00001010101010101000000000000000000DB +:106EB00000000000000000000000000000000000D2 +:106EC00000000000000000000000000000000000C2 +:106ED00000000000000000020202020202020202A0 +:106EE0000202020202020202020202020202020282 +:106EF0000202020202020202020202020202020272 +:106F00000202020202020202020202020202020261 +:106F10000202020202020202020202020202020251 +:106F20000202020202020202020202020202020241 +:106F30000202020202020202020202020202020231 +:106F40000202020202020202020202020202020221 +:106F50000202020202020202020202020202020211 +:106F60000202020202020202020202020202020201 +:106F70000202020202020200000000000000000003 +:106F800000000000000000020202020202020202EF +:106F900002020202020202020202020202020202D1 +:106FA00002020202020202000000000000000000D3 +:106FB00000000000000000000000000000000000D1 +:106FC00000000000000000000000000000000000C1 +:106FD00000000000000000000000000000000000B1 +:106FE00000000000000000000000000000000000A1 +:106FF0000000000000000000000000000000000091 +:107000000000000000000000000000000000000080 +:107010000000000000000000000000000000000070 +:107020000000000000000000000000000000000060 +:107030000000000000000000000000000000000050 +:10704000000000000000000202020202020202022E +:107050000202020202020200000000000000000022 +:10706000000000000000000202020202020202020E +:107070000202020202020200000000000000000002 +:107080000000000000000000000000000000000000 +:1070900000000000000000020202020202020202DE +:1070A00002020202020202000000000000000000D2 +:1070B00000000000000000000000000000000000D0 +:1070C00000000000000000000000000000000000C0 +:1070D00000000000000000000000000000000000B0 +:1070E00000000000000000000000000000000000A0 +:1070F0000000000000000000000000000000000090 +:10710000000000000000000000000000000000007F +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000003F +:10715000000000000000000000000000000000002F +:10716000000000000000000000000000000000001F +:10717000000000000000000000000000000000000F +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000000EF +:1071A00000000000000000000000000000000000DF +:1071B000000000000000003B000000000000000094 +:1071C00000000000000000000000000000000000BF +:1071D00000000000000000000000000000000000AF +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000000000000000008F +:10720000000000000000000000000000000001007D +:10721000000000000000000000000000000000006E +:10722000000000000000000000000000000000005E +:10723000000000000000000000000000000000004E +:10724000000000000000000000000000000000003E +:10725000000000000000000000000000000000002E +:10726000000000000000000000000000000000001E +:10727000000000000000000000000000000000000E +:1072800000000000000000000000000000000000FE +:1072900000000000000000000000000000000000EE +:1072A00000000000000000000000000000000000DE +:1072B00000000000000000000000000000000000CE +:1072C00000000001010000010000000101000000B9 +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:10730000000000000000000000000000000001007C +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:10733000000000000000000000000000000000004D +:10734000000000000000000000000000000000003D +:10735000000000000000000000000000000000002D +:10736000000000000000000000000000000000001D +:10737000000000000000000000000000000000000D +:1073800000000000000000000000000000000000FD +:1073900000000000000000000000000000000000ED +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000000000000000000CD +:1073C00000000001010000010000010101010000B6 +:1073D00000000000000000000000000000000000AD +:1073E000000000000000000000000000000000009D +:1073F000000000000000000000000000000000008D +:10740000000000000000000000000000000101007A +:10741000000000000000000000000000000000006C +:10742000000000000000000000000000000000005C +:10743000000000000000000000000000000000004C +:10744000000000000000000000000000000000003C +:10745000000000000000000000000000000000002C +:10746000000000000000000000000000000000001C +:10747000000000000000000000000000000000000C +:1074800000000000000000000000000000000000FC +:1074900000000000000000000000000000000000EC +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000000000CC +:1074C00000000001010000010100010101010000B4 +:1074D00000000000000000000000000000000000AC +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000008C +:107500000000000101000000000000000001010077 +:10751000000000000000000000000000000000006B +:10752000000000000000000000000000000000005B +:10753000000000000000000000000000000000004B +:10754000000000000000000000000000000000003B +:10755000000000000000000000000000000000002B +:10756000000000000000000000000000000000001B +:10757000000000000000000000000000000000000B +:1075800000000000000000000000000000000000FB +:1075900000000000000000000000000000000000EB +:1075A00000000000000000000000000000000000DB +:1075B00000000000000000000000000000000000CB +:1075C00001010001010000010100010101010000B1 +:1075D00000000000000000000000000000000000AB +:1075E000000000000000000000000000000000009B +:1075F000000000000000000000000000000000008B +:107600000000000101000000000000000001010076 +:10761000000000000000000000000000000000006A +:10762000000000000000000000000000000000005A +:10763000000000000000000000000000000000004A +:107640000000000000000000000000000000010039 +:10765000000000000000000000000000000000002A +:10766000000000000000000000000000000000001A +:10767000000000000000000000000000000000000A +:1076800000000000000000000000000000000000FA +:1076900000000000000000000000000000000000EA +:1076A00000000000000000000000000000000000DA +:1076B00000000000000000000000000000000000CA +:1076C00001010001010000010101010101010000AF +:1076D00000000000000000000000000000000000AA +:1076E000000000000000000000000000000000009A +:1076F000000000000000000000000000000000008A +:107700000000000101010000000000000001010074 +:107710000000000000000000000000000000000069 +:107720000000000000000000000000000000000059 +:107730000000000000000000000000000000000049 +:107740000000000000000000000000000000010038 +:107750000000000000000000000000000000000029 +:107760000000000000000000000000000000000019 +:107770000000000000000000000000000000000009 +:1077800000000000000000000000000000000000F9 +:1077900000000000000000000000000000000000E9 +:1077A00000000000000000000000000000000000D9 +:1077B00000000000000000000000000000000000C9 +:1077C00001010101010000010101010101010000AD +:1077D00001000000000000000000000000000000A8 +:1077E0000000000000000000000000000000000099 +:1077F0000000000000000000000000000000000089 +:107800000000000101010100000000000001010072 +:107810000000000000000000000000000000000068 +:107820000000000000000000000000000000000058 +:107830000000000000000000000000000000000048 +:107840000101010000000000000000000001010033 +:107850000000000000000000000000000000000028 +:107860000000000000000000000000000000000018 +:107870000000000000000000000000000000000008 +:1078800000000000000000000000000000000000F8 +:1078900000000000000000000000000000000000E8 +:1078A00000000000000000000000000000000000D8 +:1078B00000000000000000000000000000000000C8 +:1078C00001010101010100010101010101010000AB +:1078D00001000000000000000000000000000000A7 +:1078E0000000000000000000000000000000000098 +:1078F0000000000000000000000000000000000088 +:107900000000000101010101000000000001010070 +:107910000000000000000000000000000000000067 +:107920000000000000000000000000000000000057 +:107930000000000000000000000000000000010046 +:10794000010101010100000001000000000101002F +:107950000000000000000000000000000000000027 +:107960000101010000000000000000000000010013 +:107970000000000000000000000000000000000007 +:1079800000000000000000000000000000000000F7 +:1079900000000000000000000000000000000000E7 +:1079A00000000000000000000000000000000000D7 +:1079B00000000000000000000000000000000001C6 +:1079C00001010101010101010101010101010001A8 +:1079D00001010000000000000000000000000000A5 +:1079E0000000000000000000000000000000000097 +:1079F0000000000000000000000000000000000087 +:107A0000000000010101010100000000000101006F +:107A10000000000000000000000000000000000066 +:107A20000000000000000000000000000000010055 +:107A30000000000000000000000000000000010144 +:107A4000010101010100000001000000000101012D +:107A50000101010000000000000000000000000023 +:107A60000101010101000000000000000000010010 +:107A70000000000000000000000000000000000006 +:107A800000000000000000000000000000000000F6 +:107A900000000000010000000000000000000000E5 +:107AA00000000000000000000000000000000000D6 +:107AB00000000000000000000000000000000001C5 +:107AC00001010101010101010101010101010001A7 +:107AD00001010000000000000000000000000000A4 +:107AE0000000000000000000000000000000000096 +:107AF0000000000000000000000000000000010085 +:107B0000000000010101010101020000000101006B +:107B10000000000000000000000000000000000065 +:107B20000000000000000000000000000000010054 +:107B30000100000000000000000000000001010141 +:107B4000010101010101000001000000000101012B +:107B5000010101010100000000000000000000011F +:107B6000010101010100000000000000000001000F +:107B70000000000000000000000000000000000005 +:107B800001000000000000000000000000000000F4 +:107B900000000000010000000000000000010100E2 +:107BA00000000000000000000000000000000000D5 +:107BB00000000000000000000000000000000001C4 +:107BC00001010101010101010101010101010001A6 +:107BD00001010100000000000000000000010100A0 +:107BE0000000000100000000000000000000000094 +:107BF0000000000101000000000000000000010082 +:107C0000010000010101010101010000000101006A +:107C10000000000000000000000000000000000064 +:107C20000000000000000000000000000000010053 +:107C3000010000000000000001000000000101013F +:107C40000101010101010100010001000001010128 +:107C5000010101010100000000000000000000011E +:107C6000010101010101000101000000000001000B +:107C70000000000000000000000000000000000004 +:107C800001000000000000000000000000000000F3 +:107C900000000000010000010100000000010100DF +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000001C3 +:107CC00001010101010101010101010101010001A5 +:107CD000010101000000000000000000000101009F +:107CE0000000000100000000000000000000000093 +:107CF0000000000101000000000000000000010081 +:107D00000100000101010101010100020001010067 +:107D10000000000000000000000000000000000063 +:107D20000000000001000000000000000000010150 +:107D3000010101000000000001000000000101013C +:107D40000101010101010101010101010001010124 +:107D5000010101010100000000000000000000011D +:107D60000101010101010101010000000001010008 +:107D70000000000000000000000000000000000003 +:107D800001010100000000000000000000000000F0 +:107D900001000100010001010100010000010100DA +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000000000000001C2 +:107DC00001010101010101010101010101010001A4 +:107DD000010101000000000000000000000101009E +:107DE0000000000101000000000000000000000091 +:107DF000000000010101000000000000000001017E +:107E00000101000101010101010102010001010064 +:107E10000000000000000000000000000000000062 +:107E2000010101000100000000000000000101014B +:107E30000101010101000000010000000001010139 +:107E40000101010101010101010101010001010123 +:107E5000010101010100000000000000000001011B +:107E60000101010101010101010100010001010005 +:107E70000000000001000000000000000000000001 +:107E800001010101010000000000000000000000ED +:107E900001000101010101010101010100010100D5 +:107EA00000000000000000000000000000000000D2 +:107EB00000000000000000000000000000000001C1 +:107EC00001010101010101010101010101010001A3 +:107ED000010101000100000000000000010101019A +:107EE000010000010100000000000000000000008F +:107EF000000000010101000000000000000001017D +:107F00000101000101010101010101010001010064 +:107F10000000000000000000000000000000000061 +:107F2000010101000100000000000000000101014A +:107F30000101010101000100010000000001010137 +:107F40000101010101010101010101010001010122 +:107F50000101010101010001000000000000010118 +:107F60000101010101010101010101010001010003 +:107F700001010100010000000000000000000001FC +:107F800001010101010000000000000000010100EA +:107F900001010101010101010101010100010100D3 +:107FA00001000000000000000000000000000000D0 +:107FB00000000000000000000000000000000001C0 +:107FC00001010101010101010101010101010001A2 +:107FD0000101010001000000000001000101010198 +:107FE000010000010100000000000000000000008E +:107FF000000000010101000000000000000001017C +:108000000101010101010101010101010001010062 +:10801000000000000000000000000000000000015F +:108020000101010001000100000000000001010148 +:108030000101010101010101010100000001010133 +:108040000101010101010101010101010001010121 +:108050000101010101010101000000000000010116 +:108060000101010101010101010101010001010002 +:1080700001010101010000000000000000000001FA +:1080800001010101010100010100000000010100E6 +:1080900001010101010101010101010100010100D2 +:1080A00001000000010000000000000000000000CE +:1080B00000000000000000000000000000000001BF +:1080C00001010101010101010101010101010001A1 +:1080D0000101010101000000000101010101010194 +:1080E000010000010100000000000000000000008D +:1080F000000000010101000000000000000001017B +:108100000101010101010101010101010001010061 +:10811000000000000000000000000000000000015E +:108120000101010101010101010000000001010143 +:108130000101010101010101010101000001010131 +:10814000010101010101010101010101010101011F +:108150000101010101010101010000000000010114 +:108160000101010101010101010101010001010001 +:1081700001010101010000000000000000010101F7 +:1081800001010101010101010100000000010100E4 +:1081900001010101010101010101010100010100D1 +:1081A00001010000010000000000000000000000CC +:1081B00000000000000000000000000000000002BD +:1081C000010101020101010101010101020100029D +:1081D0000101010101000000000101010101010193 +:1081E000010000010100000000000000000000008C +:1081F000000000010101000000000000000001017A +:108200000101010101010101010101010001010060 +:10821000000000000000000000000000000000015D +:108220000101010101010101010000000001010142 +:10823000010101010101010101010101000101012F +:10824000010101010101010101010101010101011E +:108250000101010101010101010000000001010112 +:108260000101010101010101010101010001010000 +:1082700001010101010100010100000100010101F2 +:1082800001010101010101010101000100010100E1 +:1082900001010101010101010101010100010100D0 +:1082A00001010001010000000000000000000000CA +:1082B00001000000000000000000000000000002BB +:1082C0000202010202010102010102020201000296 +:1082D0000101010101000000000101010101010192 +:1082E0000101000101000000000000000000010089 +:1082F0000000000101010100000000000000010178 +:10830000010101010101010101010101020101005D +:10831000000000000000000000000000000000015C +:108320000101010101010101010000010001010140 +:10833000010101010101010101010101000101012E +:10834000010101010101010101010101010101011D +:10835000010101010101010101010001000101010F +:1083600001010101010101010101010100010101FE +:1083700001010101010101010100000100010101F0 +:1083800001010101010101010101010100010101DE +:1083900001010101010101010101010100010101CE +:1083A00001010101010000000000000000000000C8 +:1083B00001000000000000000000000000000002BA +:1083C0000202010202010102020102020201000294 +:1083D0000201010101000000000101010101010190 +:1083E0000101000101010000000000000000010087 +:1083F0000000000101010101000000000000010176 +:10840000010101010101010101010101020101005C +:108410000101010000000000000000000000010157 +:10842000010101010101010101000101000101013E +:10843000010101010101010101010101000101012D +:10844000010101010101010101010101010101011C +:10845000010101010101010101010101000101010D +:1084600001010101010101010101010101010101FC +:1084700001010101010101010101000100010101EE +:1084800001010101010101010101010100010101DD +:1084900001010101010101010101010101010101CC +:1084A00001010101010100010000000000000000C5 +:1084B00001000000000000000000000000000002B9 +:1084C0000202020202010102020202020202000290 +:1084D000020201010100000001010101010101018D +:1084E0000101010101010000000000000000010184 +:1084F0000100000101010101000000000000010174 +:10850000010101010101010101010101010101005C +:108510000101010000000000000000000000010156 +:10852000010101010101010101010101000101013C +:10853000010101010101010101010101000101012C +:10854000010101010101010101010101010101021A +:10855000010101010101010101010101000101010C +:1085600001010101010101010101010101010101FB +:1085700001010101010101010101010100010101EC +:1085800001010101010101010101010100010101DC +:1085900001010101010101010101010101010101CB +:1085A00001010101010101010000000000010000C2 +:1085B00001010000000000000000000000000002B7 +:1085C000020202020202010202020202020200028E +:1085D000020201010100010001010101010101028A +:1085E0000101010101010000000000000000010183 +:1085F000010000010101010100020002020001016D +:10860000010101020101010101010101010101005A +:108610000101010000000000000000000001010154 +:10862000010101010101010101010101000101013B +:10863000010101010101010101010101000101022A +:108640000101010101010101010101010101010219 +:10865000010101010101010101010101000101010B +:1086600001010101010101010101010101010101FA +:1086700001010101010101010101010100010101EB +:1086800001010101010101010101010100010101DB +:1086900001010101010101010101010101010101CA +:1086A00001010101010101010100000000010000C0 +:1086B00001010000000100000000000000010002B4 +:1086C000020202020202020202020202020200028C +:1086D0000202020101010101010101010101010286 +:1086E0000101010101010000000000000002010180 +:1086F0000100000101010101000202020201010268 +:108700000101010202010101010101010101010058 +:108710000101010000000000000000000001010153 +:108720000101010101010101010101010001010239 +:108730000101010101010101010101010001010229 +:108740000101010101010101010101010101010218 +:108750000101010101010101010101010001010209 +:1087600001010101010101010101010101010101F9 +:1087700001010101010101010101010100010101EA +:1087800001010101010101010101010100010101DA +:1087900001010101010101010101010101010101C9 +:1087A00001010101010101010100010000010100BD +:1087B00001010001010100000000000000010002B1 +:1087C000020202020202020202020202020200028B +:1087D0000202020101010101010101010101010285 +:1087E0000101010201010000000200020201010179 +:1087F0000100000101010101010102010201010268 +:108800000101010202020101010101010101010056 +:108810000101010000000000000000000001010152 +:108820000101010101010101010101010001010238 +:108830000101010101010101010101010101010227 +:108840000202010101010101010101010101010215 +:108850000202010101010101010101010001010206 +:1088600001010101010101010101010101010101F8 +:1088700001010101010101010101010100010101E9 +:1088800001010101010101010101010101010101D8 +:1088900001010101010101010101010101010101C8 +:1088A00001010101010101010101010000010100BB +:1088B00000010101010100000000000000010002B0 +:1088C000020202020202020202020202020200028A +:1088D0000202020101010101010101010101010284 +:1088E0000201010201010100000202020201010174 +:1088F0000101000201010101010101010101010267 +:108900000201010202020201010101010101020052 +:10891000010101010100000000000000000101024E +:108920000101010101010101010101010101010236 +:108930000201010101010101010101010101010225 +:108940000202020101010101010101010101010213 +:108950000202020101010101010101010101010203 +:1089600002020101010101010101010101010101F5 +:1089700001010101010101010101010100010102E7 +:1089800001010101010101010101010101010101D7 +:1089900001010101010101010101010101010101C7 +:1089A00001010101010101010101010000010100BA +:1089B00000010101010100010000000001010002AD +:1089C0000202020202020202020202020202000289 +:1089D0000202020202010101010101010101010281 +:1089E0000201010202010101020102010201010270 +:1089F0000101000202010101010101010101010265 +:108A0000020201020202020201010101010202004E +:108A1000010101010100000000000000000101024D +:108A20000101010101010101010101010101010235 +:108A30000202010101010101010101010101010223 +:108A40000202020201010101010101010101010211 +:108A50000202020201010101010101010101010201 +:108A600002020201010101010101010101010101F3 +:108A700001010101010101010101010101010102E5 +:108A800002010101010101010101010101010101D5 +:108A900001010101010101010101010101010101C6 +:108AA00001010101010101010101010100010100B8 +:108AB00000000101010101010000000001010002AC +:108AC0000202020202020202020202020202000288 +:108AD000020202020201010101020201020101027D +:108AE0000202010202010101010101010201010270 +:108AF0000101010202020101010101010101010262 +:108B0000020201020202020202010101010202004C +:108B1000010101010100000000000000000101024C +:108B20000202010101010101010101010101010232 +:108B30000202020101010101010101010101010221 +:108B4000020202020201010101010101010101020F +:108B500002020202020101010101010101010102FF +:108B600002020202010101010101010101010101F1 +:108B700001010101010101010101010101010102E4 +:108B800002020101010101010101010101010101D3 +:108B900001010101010101010101010101010102C4 +:108BA00001010101010101010101010100010100B7 +:108BB00000000101010101010100000101010002A9 +:108BC0000202020202020202020202020202000287 +:108BD0000202020202010101010202020202020279 +:108BE0000202010202010101010101010101010270 +:108BF0000101010202020101010101010101010261 +:108C00000202020202020202020201010102020148 +:108C1000010101010100000000000000000101024B +:108C20000202020101010101010101010101010230 +:108C3000020202020101010101010101010101021F +:108C4000020202020202010102010101010101020C +:108C500002020202020101010101010101010102FE +:108C600002020202020101010101010101010102EE +:108C700001010101010101010101010101010102E3 +:108C800002020201010101010101010101010101D1 +:108C900001010101010101010101010101010102C3 +:108CA00002010101010101010101010100010100B5 +:108CB00000000101010001010100010101010002A8 +:108CC0000202020202020202020202020202000286 +:108CD0000202020202010101010202020202020278 +:108CE000020202020202010101010101010101026D +:108CF000020101020202010101010101010102025E +:108D00000202020202020202020201010102020147 +:108D10000202010101010000000000000001010247 +:108D2000020202010201010101010101010101022E +:108D3000020202020201010102010101010101021C +:108D40000202020202020201020101010101020209 +:108D500002020202020201010101010101010102FC +:108D600002020202020201010101010101010102EC +:108D700002020101010101010101010101010102E0 +:108D800002020202010101010101010101010102CE +:108D900002010101010101010101010101010102C1 +:108DA00002020101010101010101010100010100B3 +:108DB00000000000010001010101010101010002A8 +:108DC0000202020202020202020202020202000285 +:108DD0000202020202020201020202020202020274 +:108DE000020202020202010101010101010101026C +:108DF000020101020202020101010101010102025C +:108E00000202020202020202020202020102020144 +:108E10000202020101010100000000000001010244 +:108E2000020202020201010101010101010101022C +:108E30000202020202020201020101010101020218 +:108E40000202020202020202020202010102020204 +:108E500002020202020202020101010101010102F9 +:108E600002020202020202020201010101010102E8 +:108E700002020201010101010101010101010102DE +:108E800002020202020101010101010101010102CC +:108E900002020201020101010101010101010102BD +:108EA00002020101010101010101010100010100B2 +:108EB00000000000000001010101010101010002A8 +:108EC0000202020202020202020202020202000284 +:108ED0000202020202020202020202020202020272 +:108EE000020202020202010101010101010101026B +:108EF0000202010202020202010101010101020259 +:108F00000202020202020202020202020102020242 +:108F10000202020101010101000000000001010242 +:108F20000202020202020201010101010101020228 +:108F30000202020202020202020201010102020214 +:108F40000202020202020202020202020102020202 +:108F500002020202020202020201010101010102F7 +:108F600002020202020202020202010101010202E5 +:108F700002020202020101010101010101010102DB +:108F800002020202020201010101010101010102CA +:108F900002020202020101010101010101010102BB +:108FA00002020202020101010101010100010100AE +:108FB00000000000000001010101010101010002A7 +:108FC0000202020202020202020202020202000283 +:108FD0000202020202020202020202020202020271 +:108FE0000202020202020201010101010101020268 +:108FF0000202010202020202010101010101020258 +:109000000202020202020202020202020102020241 +:109010000202020101010101000000000001010241 +:109020000202020202020202020101010101020225 +:109030000202020202020202020202010102020212 +:109040000202020202020202020202020102020201 +:1090500002020202020202020202010101010202F4 +:1090600002020202020202020202020201010202E2 +:1090700002020202020101010101010101010102DA +:1090800002020202020202020201010101010102C6 +:1090900002020202020202020201010101010102B6 +:1090A00002020202020101010101010101010100AC +:1090B00000000000000000000101010100010002A9 +:1090C0000202020202020202020202020202000282 +:1090D0000202020202020202020202020202020270 +:1090E0000202020202020202010101010101020266 +:1090F0000202020202020202020101010101020255 +:109100000202020202020202020202020102020240 +:10911000020202020101010101000000000101023E +:109120000202020202020202020101010102020223 +:109130000202020202020202020202020102020210 +:1091400002020202020202020202020202020202FF +:1091500002020202020202020202020201010202F1 +:1091600002020202020202020202020201020202E0 +:1091700002020202020201010101010101010102D8 +:1091800002020202020202020202010101010102C4 +:1091900002020202020202020202020101010102B3 +:1091A00002020202020201010101010101010100AA +:1091B00000000000000000000001010100000002AA +:1091C0000202020202020202020202020202000281 +:1091D000020202020202020202020202020202026F +:1091E0000202020202020202020201010101020263 +:1091F0000202020202020202020201010101020253 +:10920000020202020202020202020202020202023E +:10921000020202020201010101000000000101023C +:10922000020202020202020202020202010202021F +:10923000020202020202020202020202010202020F +:1092400002020202020202020202020202020202FE +:1092500002020202020202020202020201020202EF +:1092600002020202020202020202020201020202DF +:1092700002020202020202020201010101010102D4 +:1092800002020202020202020202020201020202BF +:1092900002020202020202020202020201020202AF +:1092A00002020202020202020101010101010100A7 +:1092B00000000000000000000000000000000002AC +:1092C0000202020202020202020202020202000280 +:1092D000020202020202020202020202020202026E +:1092E000020202020202020202020202010202025F +:1092F000020202020202020202020202010202024F +:10930000020202020202020202020202020202023D +:109310000202020202010101010000020201020236 +:10932000020202020202020202020202010202021E +:10933000020202020202020202020202010202020E +:1093400002020202020202020202020202020202FD +:1093500002020202020202020202020201020202EE +:1093600002020202020202020202020202020202DD +:1093700002020202020202020202010201010102D1 +:1093800002020202020202020202020201020202BE +:1093900002020202020202020202020201020202AE +:1093A00002020202020202020201010101010100A5 +:1093B00000000000000000000000000000000002AB +:1093C000020202020202020202020202020200027F +:1093D000020202020202020202020202020202026D +:1093E000020202020202020202020202010202025E +:1093F000020202020202020202020202020202024D +:10940000020202020202020202020202020202023C +:109410000202020202020101010002010202020232 +:10942000020202020202020202020202010202021D +:10943000020202020202020202020202020202020C +:1094400002020202020202020202020202020202FC +:1094500002020202020202020202020202020202EC +:1094600002020202020202020202020202020202DC +:1094700002020202020202020202020201020202CD +:1094800002020202020202020202020201020202BD +:1094900002020202020202020202020201020202AD +:1094A00002020202020202020202020101010100A2 +:1094B00000000000000000000000000000000002AA +:1094C000020202020202020202020202020200027E +:1094D000020202020202020202020202020202026C +:1094E000020202020202020202020202020202025C +:1094F000020202020202020202020202020202024C +:10950000020202020202020202020202020202023B +:109510000202020202020201010201010102020230 +:10952000020202020202020202020202020202021B +:10953000020202020202020202020202020202020B +:1095400002020202020202020202020202020202FB +:1095500002020202020202020202020202020202EB +:1095600002020202020202020202020202020202DB +:1095700002020202020202020202020201020202CC +:1095800002020202020202020202020202020202BB +:1095900002020202020202020202020202020202AB +:1095A000020202020202020202020201010201029E +:1095B00002000000000000000000000000000102A6 +:1095C000020202020202020202020202010200027E +:1095D000020202020202020202020202020202026B +:1095E000020202020202020202020202020202025B +:1095F000020202020202020202020202020202024B +:10960000020202020202020202020202020202023A +:10961000020202020202020201010101010202022F +:10962000020202020202020202020202020202021A +:10963000020202020202020202020202020202020A +:1096400002020202020202020202020202020202FA +:1096500002020202020202020202020202020202EA +:1096600002020202020202020202020202020202DA +:1096700002020202020202020202020201020202CB +:1096800002020202020202020202020202020202BA +:1096900002020202020202020202020202020202AA +:1096A000020202020202020202020202010202029B +:1096B00002020000000000000000000000000102A3 +:1096C0000202020202020202020201010101000280 +:1096D000020202020202020202020202020202026A +:1096E000020202020202020202020202020202025A +:1096F000020202020202020202020202020202024A +:109700000202020202020202020202020202020239 +:10971000020202020202020202010101010202022D +:109720000202020202020202020202020202020219 +:109730000202020202020202020202020202020209 +:1097400002020202020202020202020202020202F9 +:1097500002020202020202020202020202020202E9 +:1097600002020202020202020202020202020202D9 +:1097700002020202020202020202020202020202C9 +:1097800002020202020202020202020202020202B9 +:1097900002020202020202020202020202020202A9 +:1097A000020202020202020202020202010202029A +:1097B00002020000000000000000000000000102A2 +:1097C0000202020202020201010101010101010281 +:1097D0000202020202020202020202020202020269 +:1097E0000202020202020202020202020202020259 +:1097F0000202020202020202020202020202020249 +:109800000202020202020202020202020202020238 +:10981000020202020202020202010101010202022C +:109820000202020202020202020202020202020218 +:109830000202020202020202020202020202020208 +:1098400002020202020202020202020202020202F8 +:1098500002020202020202020202020202020202E8 +:1098600002020202020202020202020202020202D8 +:1098700002020202020202020202020202020202C8 +:1098800002020202020202020202020202020202B8 +:1098900002020202020202020202020202020202A8 +:1098A0000202020202020202020202020102020299 +:1098B000020202020000000000000000000001029D +:1098C0000202020101010101010101010101010284 +:1098D0000202020202020202020202020202020268 +:1098E0000202020202020202020202020202020258 +:1098F0000202020202020202020202020202020248 +:109900000202020202020202020202020202020237 +:10991000020202020202020202010101010202022B +:109920000202020202020202020202020202020217 +:109930000202020202020202020202020202020207 +:1099400002020202020202020202020202020202F7 +:1099500002020202020202020202020202020202E7 +:1099600002020202020202020202020202020202D7 +:1099700002020202020202020202020202020202C7 +:1099800002020202020202020202020202020202B7 +:1099900002020202020202020202020202020202A7 +:1099A0000202020202020202020202020202020297 +:1099B000020202020200000000000000000001019B +:1099C0000101010101010101010101010101010286 +:1099D0000202020202020202020202020202020267 +:1099E0000202020202020202020202020202020257 +:1099F0000202020202020202020202020202020247 +:109A00000202020202020202020202020202020236 +:109A10000202020202020202020202020102020227 +:109A20000202020202020202020202020202020216 +:109A30000202020202020202020202020202020206 +:109A400002020202020202020202020202020202F6 +:109A500002020202020202020202020202020202E6 +:109A600002020202020202020202020202020202D6 +:109A700002020202020202020202020202020202C6 +:109A800002020202020202020202020202020202B6 +:109A900002020202020202020202020202020202A6 +:109AA0000202020202020202020202020202020296 +:109AB0000202020202020000000000000000010198 +:109AC0000101010101010101010101010101010285 +:109AD0000202020202020202020202020202020266 +:109AE0000202020202020202020202020202020256 +:109AF0000202020202020202020202020202020246 +:109B00000202020202020202020202020202020235 +:109B10000202020202020202020202020202020225 +:109B20000202020202020202020202020202020215 +:109B30000202020202020202020202020202020205 +:109B400002020202020202020202020202020202F5 +:109B500002020202020202020202020202020202E5 +:109B600002020202020202020202020202020202D5 +:109B700002020202020202020202020202020202C5 +:109B800002020202020202020202020202020202B5 +:109B900002020202020202020202020202020202A5 +:109BA0000202020202020202020202020202020295 +:109BB0000202020202020202000000000000010193 +:109BC0000101010101010101010101010101010284 +:109BD0000202020202020202020101010102020269 +:109BE0000202020202020202020202020202020255 +:109BF0000202020202020202020202020202020245 +:109C00000202020202020202020202020202020234 +:109C10000202020202020202020202020202020224 +:109C20000202020202020202020202020202020214 +:109C30000202020202020202020202020202020204 +:109C400002020202020202020202020202020202F4 +:109C500002020202020202020202020202020202E4 +:109C600002020202020202020202020202020202D4 +:109C700002020202020202020202020202020202C4 +:109C800002020202020202020202020202020202B4 +:109C900002020202020202020202020202020202A4 +:109CA0000202020202020202020202020202020294 +:109CB000020202020202020202000000000201018E +:109CC0000101010101010101010101010101010184 +:109CD0000101010101010101010101010101010273 +:109CE0000202020101010101010101010101010260 +:109CF0000202020202020202020202020202020244 +:109D00000202020202020202020202020202020233 +:109D10000202020202020202020202020202020223 +:109D20000202020202020202020202020202020213 +:109D30000202020202020202020202020202020203 +:109D400002020202020202020202020202020202F3 +:109D500002020202020202020202020202020202E3 +:109D600002020202020202020202020202020202D3 +:109D700002020202020202020202020202020202C3 +:109D800002020202020202020202020202020202B3 +:109D900002020202020202020202020202020202A3 +:109DA0000202020202020202020202020202020293 +:109DB0000202020202020202020202020202010185 +:109DC0000101010101010101010101010101010183 +:109DD0000101010101010101010101010101010173 +:109DE0000101010101010101010101010101010262 +:109DF0000202020202020202020202020202020243 +:109E00000202020202020202020202020202020232 +:109E10000202020202020202020202020202020222 +:109E20000202020202020202020202020202020212 +:109E30000202020202020202020202020202020202 +:109E400002020202020202020202020202020202F2 +:109E500002020202020202020202020202020202E2 +:109E600002020202020202020202020202020202D2 +:109E700002020202020202020202020202020202C2 +:109E800002020202020202020202020202020202B2 +:109E900002020202020202020202020202020202A2 +:109EA0000202020202020202020202020202020292 +:109EB0000202020202020202020202020202020183 +:109EC0000101010101010101010101010101010182 +:109ED0000101010101010101010101010101010172 +:109EE0000101010101010101010101010101010261 +:109EF000020202010101010101010101010101024E +:109F0000020202010101010101010101010101023D +:109F10000202020202020202020202020202020221 +:109F20000202020202020202020202020202020211 +:109F30000202020202020202020202020202020201 +:109F400002020202020202020202020202020202F1 +:109F500002020202020202020202020202020202E1 +:109F600002020202020202020202020202020202D1 +:109F700002020202020202020202020202020202C1 +:109F800002020202020202020202020202020202B1 +:109F900002020202020202020202020202020202A1 +:109FA0000202020202020202020202020202020291 +:109FB0000202020202020202020202020202020182 +:109FC0000101010101010101010101010101010181 +:109FD0000101010101010101010101010101010171 +:109FE0000101010101010101010101010101010161 +:109FF0000101010101010101010101010101010250 +:10A000000202020202020202020202020202020230 +:10A010000202020202020202020202020202020220 +:10A020000202020202020202020202020202020210 +:10A030000202020202020202020202020202020200 +:10A0400002020202020202020202020202020202F0 +:10A0500002020202020202020202020202020202E0 +:10A0600002020202020202020202020202020202D0 +:10A0700002020202020202020202020202020202C0 +:10A0800002020202020202020202020202020202B0 +:10A0900002020202020202020202020202020202A0 +:10A0A0000202020202020202020202020202020290 +:10A0B0000202020202020202020202020202020181 +:10A0C0000101010101010101010101010101010180 +:10A0D0000101010101010101010101010101010170 +:10A0E0000101010101010101010101010101010160 +:10A0F0000101010101010101010101010101010150 +:10A10000010101010101010101010101010101023E +:10A11000010101010101010101010101010101022E +:10A12000020202020202020202020202020202020F +:10A1300002020202020202020202020202020202FF +:10A1400002020202020202020202020202020201F0 +:10A1500001010101010101010101010101010102EE +:10A1600002020202020202020202020202020202CF +:10A1700002020202020202020202020202020202BF +:10A1800002020202020202020202020202020202AF +:10A19000020202020202020202020202020202029F +:10A1A000020202020202020202020202020202028F +:10A1B0000202020202020202020202020202020180 +:10A1C000010101010101010101010101010101017F +:10A1D000010101010101010101010101010101016F +:10A1E000010101010101010101010101010101015F +:10A1F000010101010101010101010101010101014F +:10A20000010101010101010101010101010101023D +:10A21000020202020202020202020202020202021E +:10A22000020202020202020202020202020202010F +:10A23000010101010101010101010101010101020D +:10A2400002020202020202020202020202020202EE +:10A2500002020202020202020202020202020202DE +:10A2600002020202020202020202020202020202CE +:10A2700002020202020202020202020202020202BE +:10A2800002020202020202020202020202020202AE +:10A29000020202020202020202020202020202029E +:10A2A000020202020202020202020202020202028E +:10A2B000020202020202020202020202020202017F +:10A2C000010101010101010101010101010101017E +:10A2D000010101010101010101010101010101016E +:10A2E000010101010101010101010101010101015E +:10A2F000010101010101010101010101010101014E +:10A30000010101010101010101010101010101013D +:10A31000010101010101010101010101010101012D +:10A32000010101010101010101010101010101021C +:10A3300002020202020202020202020202020202FD +:10A3400002020202020202020202020202020200EF +:10A3500000000000000000000000000000000002FB +:10A3600002020202020202020202020202020202CD +:10A3700002020202020202020202020202020202BD +:10A3800002020202020202020202020202020202AD +:10A39000020202020202020202020202020202029D +:10A3A000020202020202020202020202020202028D +:10A3B000020202020202020202020202020202017E +:10A3C000010101010101010101010101010101017D +:10A3D000010101010101010101010101010101016D +:10A3E000010101010101010101010101010101015D +:10A3F000010101010101010101010101010101014D +:10A40000010101010101010101010101010101013C +:10A41000010101010101010101010101010101012C +:10A42000010101010101010101010101010101011C +:10A43000010101010101010101010101010101010C +:10A4400001010101010101010101010101010101FC +:10A4500001010101010101010101010101010101EC +:10A4600001010101010101010101010101010102DB +:10A4700002020202020202020202020202020201BD +:10A4800001010101010101010101010101010102BB +:10A49000020202020202020202020202020202029C +:10A4A000020202020202020202020202020202028C +:10A4B000020202020202020202020202020202017D +:10A4C000010101010101010101010101010101017C +:10A4D000010101010101010101010101010101016C +:10A4E000010101010101010101010101010101015C +:10A4F000010101010101010101010101010101014C +:10A50000010101010101010101010101010101013B +:10A51000010101010101010101010101010101012B +:10A52000010101010101010101010101010101011B +:10A53000010101010101010101010101010101010B +:10A5400001010101010101010101010101010101FB +:10A5500001010101010101010101010101010101EB +:10A5600001010101010101010101010101010102DA +:10A5700002020202020202020202020202020202BB +:10A5800002020202020202020202020202020202AB +:10A59000020202020202020202020202020202029B +:10A5A000020202020202020202020202020202028B +:10A5B000020202020202020202020202020202017C +:10A5C000010101010101010101010101010101017B +:10A5D000010101010101010101010101010101016B +:10A5E000010101010101010101010101010101015B +:10A5F000010101010101010101010101010101014B +:10A60000010101010101010101010101010101013A +:10A61000010101010101010101010101010101012A +:10A62000010101010101010101010101010101011A +:10A63000010101010101010101010101010101010A +:10A6400001010101010101010101010101010101FA +:10A6500001010101010101010101010101010101EA +:10A6600001010101010101010101010101010101DA +:10A6700001010101010101010101010101010100CB +:10A6800000000000000000000000000000000002C8 +:10A69000020202020202020202020202020202009C +:10A6A00000000000000000000000000000000002A8 +:10A6B000020202020202020202020202020202017B +:10A6C000010101010101010101010101010101017A +:10A6D000010101010101010101010101010101016A +:10A6E000010101010101010101010101010101015A +:10A6F000010101010101010101010101010101014A +:10A700000101010101010101010101010101010139 +:10A710000101010101010101010101010101010129 +:10A720000101010101010101010101010101010119 +:10A730000101010101010101010101010101010109 +:10A7400001010101010101010101010101010101F9 +:10A7500001010101010101010101010101010101E9 +:10A7600001010101010101010101010101010101D9 +:10A7700001010101010101010101010101010101C9 +:10A7800001010101010101010101010101010102B8 +:10A79000020202020202020202020202020202009B +:10A7A00000000000000000000000000000000000A9 +:10A7B0000000000000000000000000000000000198 +:10A7C0000101010101010101010101010101010179 +:10A7D0000101010101010101010101010101010169 +:10A7E0000101010101010101010101010101010159 +:10A7F0000101010101010101010101010101010149 +:10A800000101010101010101010101010101010138 +:10A810000101010101010101010101010101010128 +:10A820000101010101010101010101010101010118 +:10A830000101010101010101010101010101010108 +:10A8400001010101010101010101010101010101F8 +:10A8500001010101010101010101010101010101E8 +:10A8600001010101010101010101010101010101D8 +:10A8700001010101010101010101010101010101C8 +:10A8800001010101010101010101010101010101B8 +:10A8900001010101010101010101010101010101A8 +:10A8A0000101010101010101010101010101010099 +:10A8B0000000000000000000000000000000000197 +:10A8C0000101010101010101010101010101010178 +:10A8D0000101010101010101010101010101010168 +:10A8E0000101010101010101010101010101010158 +:10A8F0000101010101010101010101010101010148 +:10A900000101010101010101010101010101010137 +:10A910000101010101010101010101010101010127 +:10A920000101010101010101010101010101010117 +:10A930000101010101010101010101010101010107 +:10A9400001010101010101010101010101010101F7 +:10A9500001010101010101010101010101010101E7 +:10A9600001010101010101010101010101010101D7 +:10A9700001010101010101010101010101010101C7 +:10A9800001010101010101010101010101010101B7 +:10A9900001010101010101010101010101010101A7 +:10A9A0000101010101010101010101010101010098 +:10A9B0000000000000000000000000000000000097 +:10A9C0000000000000000000000000000000000087 +:10A9D0000000000000000000000000000000000275 +:10A9E0000202020202020202020202020202020247 +:10A9F0000202020202020202020202020202020237 +:10AA00000202020202020202020202020202020226 +:10AA10000202020202020202020202020202020216 +:10AA20000202020202020202020202020202020206 +:10AA300002020202020202020202020202020202F6 +:10AA400002020202020202020202020202020202E6 +:10AA500002020202020202020202020202020202D6 +:10AA600002020202020202020202020202020202C6 +:10AA700002020202020202020202020202020202B6 +:10AA800002020202020202020202020202020200A8 +:10AA900000000000000000000000000000000002B4 +:10AAA0000202020202020202020202020202020088 +:10AAB0000000000000000000000000000000000096 +:10AAC0000000000000000000000000000000000086 +:10AAD0000000000000000000000000000000000076 +:10AAE0000000000000000000000000000000000066 +:10AAF0000000000000000000000000000000000056 +:10AB00000000000000000000000000000000000045 +:10AB10000000000000000000000000000000000035 +:10AB20000000000000000000000000000000000025 +:10AB30000000000000000000000000000000000015 +:10AB40000000000000000000000000000000000203 +:10AB500002020202020202020202020202020202D5 +:10AB600002020202020202020202020202020200C7 +:10AB700000000000000000000000000000000000D5 +:10AB800000000000000000000000000000000000C5 +:10AB900000000000000000000000000000000000B5 +:10ABA00000000000000000000000000000000000A5 +:10ABB0000000000000000000000000000000000095 +:10ABC0000000000000000000000000000000000085 +:10ABD0000000000000000000000000000000000075 +:10ABE0000000000000000000000000000000000065 +:10ABF0000000000000000000000000000000000055 +:10AC00000000000000000000000000000000000044 +:10AC10000000000000000000000000000000000034 +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000000000000000000000014 +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000000F4 +:10AC600000000000000000000000000000000000E4 +:10AC700000000000000000000000000000000000D4 +:10AC800000000000000000000000000000000000C4 +:10AC900000000000000000000000000000000000B4 +:10ACA00000000000000000000000000000000000A4 +:10ACB0000000000000000000000000000000003361 +:10ACC0000000000000000000000000000000000084 +:10ACD0000000000000000000000000000000000074 +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000000000000000054 +:10AD00000000000000000100000000000000000042 +:10AD10000000000000000000000000000000000033 +:10AD20000000000000000000000000000000000023 +:10AD30000000000000000000000000000000000013 +:10AD40000000000000000000000000000000000003 +:10AD500000000000000000000000000000000000F3 +:10AD600000000000000000000000000000000000E3 +:10AD700000000000000000000000000000000000D3 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000000000000000000000A3 +:10ADB0000000000000000000000000000000000093 +:10ADC0000000000000000000000000000000000083 +:10ADD0000000000000000000000000000000000073 +:10ADE0000000000000000000000000000000000063 +:10ADF0000000000000000000000000000000000053 +:10AE00000000000000000100000000000000000041 +:10AE10000000000000000000000000000000000032 +:10AE20000000000000000000000000000000000022 +:10AE30000000000000000000000000000000000012 +:10AE40000000000000000000000000000000000002 +:10AE500000000000000000000000000000000000F2 +:10AE600000000000000000000000000000000000E2 +:10AE700000000000000000000000000000000000D2 +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000000000000000000B2 +:10AEA00000000000000000000000000000000000A2 +:10AEB0000000000000000000000000000000000092 +:10AEC0000000000000000000000000000000000082 +:10AED0000000000000000000000000000000000072 +:10AEE0000000000000000000000000000000000062 +:10AEF0000000000000000000000000000000000052 +:10AF0000000000000001010000000000000000003F +:10AF10000000000000000000000000000000000031 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000000000000011 +:10AF40000000000000000000000000000000000001 +:10AF500000000000000000000000000000000000F1 +:10AF600000000000000000000000000000000000E1 +:10AF700000000000000000000000000000000000D1 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000000A1 +:10AFB0000000000000000000000000000000000091 +:10AFC0000000000000000000000000000000000081 +:10AFD0000000000000000000000000000000000071 +:10AFE0000000000000000000000000000000000061 +:10AFF0000000000000000100000000000000000050 +:10B00000000000000001010000000000000000003E +:10B010000000000000000000000000000000000030 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000000000000F0 +:10B0600000000000000000000000000000000000E0 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000000000000000000000000000000000090 +:10B0C0000000000000000000000000000000000080 +:10B0D000000000000001000000000000000000006F +:10B0E0000000000000000000000000000000000060 +:10B0F000000000000000010001000000000000004E +:10B10000000000000001010000000000000000003D +:10B11000000000000000000000000000000000002F +:10B12000000000000000000000000000000000001F +:10B13000000000000000010000000000000000000E +:10B1400000000000000000000000000000000000FF +:10B1500000000000000000000000000000000000EF +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000000009F +:10B1B000000000000000000000000000000000008F +:10B1C000000000000000000000000000000001007E +:10B1D000000101000001000001000000000000006B +:10B1E000000000000000000000000000000000005F +:10B1F000000000000001010001000100000000004B +:10B20000000000000001010000000000000000003C +:10B21000000000000000010000000000000000002D +:10B22000000000000000000000000000000000001E +:10B23000000000000000010000000000000000000D +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B000000000000000000000000000000000008E +:10B2C000000000000000000000000000000101017B +:10B2D0000101010101010000010000000000000067 +:10B2E000000000000000000000000000000000005E +:10B2F0000000000000010100010101000000000049 +:10B30000000000000001010000000000000000003B +:10B31000000000000000010000000000000000002C +:10B32000000000000000000001010000000000001B +:10B33000000000000001010000000100000000000A +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000001010001000000009A +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000000000101017A +:10B3D0000101010101010000010100000000000065 +:10B3E000000000000000010001010000000000005A +:10B3F0000000000000010101010101010000000046 +:10B40000000000000001010000000000000000003A +:10B41000000000000001010000000000000000002A +:10B420000000000000000000010101000000000019 +:10B430000000000000010100010101000000000007 +:10B4400000000000000101000000000000000000FA +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B4700000000000000101000000000000000000CA +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A0000000000000000001010101010000000097 +:10B4B000000000000000000000000000000000008C +:10B4C0000000000000000000000000000001010179 +:10B4D0000101010101010001010101000000000062 +:10B4E0000000000000000101010101010000000056 +:10B4F0000000000000010101010101010000000045 +:10B500000000000001010100000000000000000038 +:10B510000000000000010100000000000000000029 +:10B520000000000000000000010101000000000018 +:10B530000000000000010101010101010000000004 +:10B5400000000000000101000000000000000000F9 +:10B5500000000000000101000000000000000000E9 +:10B5600000000000000101000000000000000000D9 +:10B5700000000000000101000000000000000000C9 +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A0000000000000000001010101010100000095 +:10B5B000000000000000000000000000000000008B +:10B5C0000000000000000000000001010001010176 +:10B5D0000101010101010001010101000000000061 +:10B5E0000000000000000101010101010000000055 +:10B5F0000000000000010101010101010000000044 +:10B600000000000001010100000000000000000037 +:10B610000000000000010100010100000000000026 +:10B620000000000000010101010101010000010012 +:10B630000000000000010101010101010000000003 +:10B6400000000000000101000000000000000000F8 +:10B6500000000000000101000000010000000000E7 +:10B6600000000000000101000101000000000000D6 +:10B6700000000000000101000000000000000000C8 +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A0000000000000000001010101010101000093 +:10B6B000000000000000000000000000000000008A +:10B6C0000000000000000000000001010001010175 +:10B6D000010101010101000101010101000000005F +:10B6E0000000000000000101010101010000000054 +:10B6F0000000000000010101010101010000000142 +:10B700000000000101010100000000000000000035 +:10B710000000000000010100010101000000000024 +:10B720000000000000010101010101010000010110 +:10B730000100000100010101010101010000000000 +:10B7400000000000000101000000000000000000F7 +:10B7500000000000000101000101010000000000E4 +:10B7600000000000000101000101010000000000D4 +:10B7700000000000000101000000000000000000C7 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000100000000000000000000A8 +:10B7A0000000000000000001010101010101010091 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000001010101010173 +:10B7D000010101010101000101010101000000005E +:10B7E0000000000001000101010101010000000052 +:10B7F000000000000001010101010101010001013F +:10B800000001000101010100000000000000000033 +:10B810000000000000010100010101000000000023 +:10B82000000000000001010101010101010001010E +:10B8300001000101000101010101010100000000FE +:10B8400000000000000101000000010000000000F5 +:10B8500000000000000101000101010100000000E2 +:10B8600000000000000101000101010000000001D2 +:10B8700000000001000101000000000000000000C5 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000100000000000000000000A7 +:10B8A000000000000000000101010101010101018F +:10B8B0000100000000000000000000000000000087 +:10B8C0000000000000000000010101010101010170 +:10B8D000010101010101000101010101000000005D +:10B8E0000000000001000101010101010000000051 +:10B8F000000000000001010101010101010101013D +:10B900000001000101010100000000000100000031 +:10B910000000000000010101010101000000000021 +:10B92000000000000001010101010101010101010C +:10B9300001000101010101010101010101000100FA +:10B9400000000000000101000101010000000000F2 +:10B9500000000000000101000101010100000000E1 +:10B9600000000000000101010101010100000101CE +:10B9700000010101000101000000000000000000C2 +:10B9800000000000000000000101000000000000B5 +:10B9900000000000000101000101000000000000A3 +:10B9A000000000000000000101010101010101018E +:10B9B0000100000000000000000000000000000086 +:10B9C000000000000000000101010101010101016E +:10B9D000010101010101000101010101000000005C +:10B9E000010000000101010101010101000000004E +:10B9F000000000000001010101010101010101013C +:10BA00000001000101010100000000000100000030 +:10BA10000000000000010101010101000000000020 +:10BA2000000000000001010101010101010101010B +:10BA300001010101010101010101010101010101F6 +:10BA400000000000000101010101010100000000EF +:10BA500000000000000101010101010101000000DE +:10BA600000000000000101010101010100010101CC +:10BA700001010101010101000100000000000000BE +:10BA800000000000000100000101010000000000B2 +:10BA9000000101000001010001010100000000009F +:10BAA000000000000000000101010101010101018D +:10BAB0000100000000000100000000000000000084 +:10BAC000000000000000000101010101010101016D +:10BAD000010101010101000201010101000000005A +:10BAE000010101000101010101010101000000004B +:10BAF000000000000001010101010101010101013B +:10BB0000000100010101010000000000010000002F +:10BB1000000000000001010101010101000000001E +:10BB2000000000000001010101010101010101010A +:10BB300001010101010101010101010101010101F5 +:10BB400000010000000101010101010100000001EC +:10BB500000000001010101010101010101010001D9 +:10BB600000000001010101010101010101010101C8 +:10BB700001010101010101000100010000000000BC +:10BB800000000000000100000101010000000001B0 +:10BB9000010101010001010001010100000000009C +:10BBA000000000000001000101010101010101018B +:10BBB0000101010000000100000000000000000081 +:10BBC000000000000000000101010101010101016C +:10BBD0000101010101010002020101010000000157 +:10BBE0000101010101010102010101010000000048 +:10BBF0000000000000010102010101010101010139 +:10BC0000000101010101010000000000010100002C +:10BC1000000000000001010101010101000000001D +:10BC20000000000000010101010101010101010109 +:10BC300001010101010101020101010101010101F3 +:10BC400001010001010101010101010101000101E6 +:10BC500000010101010101010101010101010101D5 +:10BC600000010101010101010101010101010101C5 +:10BC700001010101010101000101010000000000BA +:10BC800000000000000101000101010100000101AC +:10BC90000101010100010101010101010000000099 +:10BCA000000000000001000101010101010101018A +:10BCB000010101010001010000000000000000007E +:10BCC000000000000000000101010101010101016B +:10BCD0000101010101010002020101010000000156 +:10BCE0000101010101010102010101010000010046 +:10BCF0000000000000010102020101010101010137 +:10BD0000010101010101010000000000010100002A +:10BD1000000000000001010101010101000000001C +:10BD20000000000000010102010101010101010107 +:10BD300001010101010101020101010101010101F2 +:10BD400001010101010101010101010101010101E3 +:10BD500001010101010101010101010101010101D3 +:10BD600001010101010101010101010101010101C3 +:10BD700001010101010101010101010100000000B7 +:10BD800000010000000101000101010100010101A9 +:10BD90000101010101010101010101010000000097 +:10BDA0000000000000010002010101010101010188 +:10BDB000010101010001010000000000000000007D +:10BDC0000000000000000001010101010102020168 +:10BDD0000101010101010002020201010000000154 +:10BDE0000101010101010102020101010000010143 +:10BDF0000000000000010102020101010101010136 +:10BE00000101010101010100000000000101000029 +:10BE1000000000000001010101010101000000001B +:10BE20000000000100010102020101010101010104 +:10BE300001010101010101020201010101010101F0 +:10BE400001010101010101010101010101010101E2 +:10BE500001010101010101010101010101010101D2 +:10BE600001010101010101010101010101010101C2 +:10BE700001010101010101010101010100000001B5 +:10BE800001010000000101010101010101010101A5 +:10BE90000101010101010101010101010000000096 +:10BEA0000000000000010002010101010101010187 +:10BEB0000101010101010100000100000001000079 +:10BEC0000000000000000002010101010102020265 +:10BED000020202010101000202020201000000014F +:10BEE0000101010101010102020201010100010140 +:10BEF0000000000000010102020202010101010133 +:10BF00000101010101010100000000000101010027 +:10BF10000000000000010101010101010100000019 +:10BF20000000000100010102020201010101010102 +:10BF300001010101010101020202020101010101ED +:10BF400001010101010101010101010101010101E1 +:10BF500001010101010101010101010101010101D1 +:10BF600001010101010101010101010101010101C1 +:10BF700001010101010101010101010101000101B2 +:10BF800001010100000101010101010101010101A3 +:10BF90000101010101010101010101010001000193 +:10BFA0000000000000010102020101010101010184 +:10BFB0000101010101010100010101010001000174 +:10BFC0000000000100000002010102020102020261 +:10BFD000020202020202000202020202000000014A +:10BFE000010101010101010202020202010101013C +:10BFF0000000000000010102020202020101010131 +:10C000000101010101010201000000000101010024 +:10C010000000000202010102010101010101000111 +:10C020000000000100010102020202010101010100 +:10C0300001010101010101020202020201010101EB +:10C0400001010101010101010101010101010101E0 +:10C0500001010101010101010101010101010101D0 +:10C0600001010101010101010101010101010101C0 +:10C0700001010101010101010101010101010101B0 +:10C0800001010101010101010101010101010101A0 +:10C090000101010101010101010101010101010190 +:10C0A000000101000001010202020102010101017F +:10C0B0000101010101010100010101010001010172 +:10C0C000000100010100000202010202020202025C +:10C0D0000202020202020002020202020000010148 +:10C0E000010101010101010202020202010101013B +:10C0F000000000000001020202020202010101012F +:10C100000101010101020201010000000101010021 +:10C11000000200010101010202010101010101010E +:10C1200000010101000101020202020201010101FC +:10C1300001010101010101020202020201010101EA +:10C1400001010101010101020101010101010101DE +:10C1500001010101010101020101010101010101CE +:10C1600001010101010101020101010101010101BE +:10C1700001010101010101010101010101010101AF +:10C18000010101010101010101010101010101019F +:10C19000010101010101010101010101010101018F +:10C1A000010101010001010202020202020101017A +:10C1B0000101010101010100010101010101010170 +:10C1C0000101000101000002020202020202020259 +:10C1D0000202020202020002020202020001010146 +:10C1E0000201010102010202020202020101010137 +:10C1F000000000000002020202020202020101012C +:10C20000010101010102020201000000020101011D +:10C21000020100010101020202020101010101010A +:10C2200000010101000101020202020202010201F9 +:10C2300001010101010102020202020202010101E7 +:10C2400001010101010101020101010101010101DD +:10C2500001010101010101020201010101010101CC +:10C2600001010101010101020201010101010101BC +:10C2700001010101010101010101010101010101AE +:10C28000010101010101010101010101010101019E +:10C29000010101010101010201010101010101018D +:10C2A0000101010100010102020202020202010178 +:10C2B0000101010101010100010001010100010171 +:10C2C0000101010101000002020202020202020257 +:10C2D0000202020202020002020202020101010243 +:10C2E0000202020102010202020202020101010134 +:10C2F0000000000000020202020202020202020228 +:10C30000010101010202020201010000020101011A +:10C310000101020101020202020202010101010106 +:10C3200000010101000101020202020202020202F6 +:10C3300002010101010202020202020202020201E2 +:10C3400001010101010202020201010101010101D9 +:10C3500001010101010101020202020101010101C9 +:10C3600001010101010101020202010101010101BA +:10C3700001010101010101020101010101010101AC +:10C38000010101010101010101010101010101019D +:10C39000010101010101010202010101010101018B +:10C3A0000101010101010102020202020202020175 +:10C3B0000101010101010100000000000100010173 +:10C3C0000101010101000002020202020202020256 +:10C3D0000202020202020002020202020101010242 +:10C3E0000202020202010202020202020101010132 +:10C3F0000100000101020202020202020202020224 +:10C400000102010202020202010101000202010115 +:10C410000101010101020202020202010101010106 +:10C4200001010101010101020202020202020202F3 +:10C4300002010202010202020202020202020202DE +:10C4400001010101010202020202020101010101D6 +:10C4500001010101010101020202020201010101C7 +:10C4600001010101010101020202020101010101B8 +:10C4700001010101010101020201010101010101AA +:10C48000010101010101010202010101010101019A +:10C490000101010101010102020201010101010189 +:10C4A0000101010101010102020202020202020273 +:10C4B0000201010101010100000000000000010172 +:10C4C0000101010101000002020202020202020255 +:10C4D0000202020202020002020202020101010241 +:10C4E000020202020202020202020202020102012E +:10C4F0000101010101020202020202020202020221 +:10C500000102010202020202020101000202010113 +:10C510000101010101020202020202020101010104 +:10C5200001010101010101020202020202020202F2 +:10C5300002020202020202020202020202020202DB +:10C5400002020101010202020202020201010101D2 +:10C5500001010101010101020202020202010101C5 +:10C5600001010101010101020202020201010101B6 +:10C5700001010101010101020201010101010101A9 +:10C580000101010101010102020201010101010198 +:10C590000101010101010102020202010101010187 +:10C5A0000101010101010102020202020202020272 +:10C5B0000201010101010100000000000000000073 +:10C5C0000101010101000002020202020202020254 +:10C5D000020202020202000202020202020202023D +:10C5E000020202020202020202020202020202022B +:10C5F0000101010101020202020202020202020220 +:10C60000020202020202020202010101020202010E +:10C610000101010101020202020202020101010103 +:10C6200001010101010202020202020202020202EF +:10C6300002020202020202020202020202020202DA +:10C6400002020202020202020202020202010101CD +:10C6500001010101010202020202020202020101C1 +:10C6600001010101010202020202020202020202AF +:10C6700001010101010202020202020101010101A4 +:10C680000101010101010102020202010101010196 +:10C690000101010101010102020202020101010185 +:10C6A0000101010101010102020202020202020271 +:10C6B0000202020101010100000000000000000070 +:10C6C0000000010001000002020202020202020256 +:10C6D000020202020202000202020202020202023C +:10C6E000020202020202020202020202020202022A +:10C6F000010101010102020202020202020202021F +:10C70000020202020202020202020101020202010C +:10C710000101010101020202020202020201010101 +:10C7200001010101010202020202020202020202EE +:10C7300002020202020202020202020202020202D9 +:10C7400002020202020202020202020202020202C9 +:10C7500001010101010202020202020202020202BE +:10C7600001010101010202020202020202020202AE +:10C77000020202020102020202020202010101019E +:10C780000101010101010102020202020101010194 +:10C790000101010101010102020202020101010184 +:10C7A0000101010101010102020202020202020270 +:10C7B000020202020101020000000000000000006D +:10C7C0000000000000010002020202020202020256 +:10C7D000020202020202000202020202020202023B +:10C7E0000202020202020202020202020202020229 +:10C7F000010101010102020202020202020202021E +:10C800000202020202020202020202010202020209 +:10C8100001010101010202020202020202020101FF +:10C8200001010101010202020202020202020202ED +:10C8300002020202020202020202020202020202D8 +:10C8400002020202020202020202020202020202C8 +:10C8500002020202020202020202020202020202B8 +:10C8600002020202020202020202020202020202A8 +:10C87000020202020202020202020202020101019B +:10C88000010101010101010202020202020202028F +:10C89000020202010102010202020202020201017D +:10C8A000010101010101010202020202020202026F +:10C8B000020202020202020000000000000000006A +:10C8C0000000000000010002020202020202020255 +:10C8D000020202020202000202020202020202023A +:10C8E0000202020202020202020202020202020228 +:10C8F000020101010102020202020202020202021C +:10C900000202020202020202020202020202020207 +:10C9100002020102020202020202020202020202F8 +:10C9200001010102010202020202020202020202EB +:10C9300002020202020202020202020202020202D7 +:10C9400002020202020202020202020202020202C7 +:10C9500002020202020202020202020202020202B7 +:10C9600002020202020202020202020202020202A7 +:10C970000202020202020202020202020202020297 +:10C98000020201010102010202020202020202028B +:10C990000202020201020202020202020202020278 +:10C9A000010101010102010202020202020202026D +:10C9B0000202020202020200000000000000000069 +:10C9C0000000000000010002020202020202020254 +:10C9D0000202020202020002020202020202020239 +:10C9E0000202020202020202020202020202020227 +:10C9F0000202020202020202020202020202020217 +:10CA00000202020202020202020202020202020206 +:10CA100002020202020202020202020202020202F6 +:10CA200001020202010202020202020202020202E8 +:10CA300002020202020202020202020202020202D6 +:10CA400002020202020202020202020202020202C6 +:10CA500002020202020202020202020202020202B6 +:10CA600002020202020202020202020202020202A6 +:10CA70000202020202020202020202020202020296 +:10CA80000202020101020202020202020202020288 +:10CA90000202020202020202020202020202020276 +:10CAA0000202020101020102020202020202020269 +:10CAB0000202020202020202000000000000000066 +:10CAC0000000000000010002020202020202020253 +:10CAD0000202020202020002020202020202020238 +:10CAE0000202020202020202020202020202020226 +:10CAF0000202020202020202020202020202020216 +:10CB00000202020202020202020202020202020205 +:10CB100002020202020202020202020202020202F5 +:10CB200002020202010202020202020202020202E6 +:10CB300002020202020202020202020202020202D5 +:10CB400002020202020202020202020202020202C5 +:10CB500002020202020202020202020202020202B5 +:10CB600002020202020202020202020202020202A5 +:10CB70000202020202020202020202020202020295 +:10CB80000202020202020202020202020202020285 +:10CB90000202020202020202020202020202020275 +:10CBA0000202020201020202020202020202020266 +:10CBB0000202020202020202020000000000000063 +:10CBC0000000000000010102020202020202020251 +:10CBD0000202020202020002020202020202020237 +:10CBE0000202020202020202020202020202020225 +:10CBF0000202020202020202020202020202020215 +:10CC00000202020202020202020202020202020204 +:10CC100002020202020202020202020202020202F4 +:10CC200002020202020202020202020202020202E4 +:10CC300002020202020202020202020202020202D4 +:10CC400002020202020202020202020202020202C4 +:10CC500002020202020202020202020202020202B4 +:10CC600002020202020202020202020202020202A4 +:10CC70000202020202020202020202020202020294 +:10CC80000202020202020202020202020202020284 +:10CC90000202020202020202020202020202020274 +:10CCA0000202020202020202020202020202020264 +:10CCB0000202020202020202020000000000000062 +:10CCC0000000000000010102020202020202020250 +:10CCD0000202020202020102020202020202020235 +:10CCE0000202020202020202020202020202020224 +:10CCF0000202020202020202020202020202020214 +:10CD00000202020202020202020202020202020203 +:10CD100002020202020202020202020202020202F3 +:10CD200002020202020202020202020202020202E3 +:10CD300002020202020202020202020202020202D3 +:10CD400002020202020202020202020202020202C3 +:10CD500002020202020202020202020202020202B3 +:10CD600002020202020202020202020202020202A3 +:10CD70000202020202020202020202020202020293 +:10CD80000202020202020202020202020202020283 +:10CD90000202020202020202020202020202020273 +:10CDA0000202020202020202020202020202020263 +:10CDB000020202020202020202020000000000005F +:10CDC0000000000000010102020202020201010152 +:10CDD000010101010101010202020202020202023A +:10CDE0000202020202020202020202020202020223 +:10CDF0000202020202020202020202020202020213 +:10CE00000202020202020202020202020202020202 +:10CE100002020202020202020202020202020202F2 +:10CE200002020202020202020202020202020202E2 +:10CE300002020202020202020202020202020202D2 +:10CE400002020202020202020202020202020202C2 +:10CE500002020202020202020202020202020202B2 +:10CE600002020202020202020202020202020202A2 +:10CE70000202020202020202020202020202020292 +:10CE80000202020202020202020202020202020282 +:10CE90000202020202020202020202020202020272 +:10CEA0000202020202020202020202020202020262 +:10CEB000020202020202020202020202000000005A +:10CEC0000000000000000102020201010101010155 +:10CED0000101010101010102020202020202020239 +:10CEE0000202020202020202020202020202020222 +:10CEF0000202020202020202020202020202020212 +:10CF00000202020202020202020202020202020201 +:10CF100002020202020202020202020202020202F1 +:10CF200002020202020202020202020202020202E1 +:10CF300002020202020202020202020202020202D1 +:10CF400002020202020202020202020202020202C1 +:10CF500002020202020202020202020202020202B1 +:10CF600002020202020202020202020202020202A1 +:10CF70000202020202020202020202020202020291 +:10CF80000202020202020202020202020202020281 +:10CF90000202020202020202020202020202020271 +:10CFA0000202020202020202020202020202020261 +:10CFB0000202020202020202020202020202020251 +:10CFC0000000000000000101010101010101010157 +:10CFD0000101010101010102020202020202020139 +:10CFE0000101010101020202020202020202020226 +:10CFF0000202020202020202020202020202020211 +:10D000000202020202020202020202020202020200 +:10D0100002020202020202020202020202020202F0 +:10D0200002020202020202020202020202020202E0 +:10D0300002020202020202020202020202020202D0 +:10D0400002020202020202020202020202020202C0 +:10D0500002020202020202020202020202020202B0 +:10D0600002020202020202020202020202020202A0 +:10D070000202020202020202020202020202020290 +:10D080000202020202020202020202020202020280 +:10D090000202020202020202020202020202020270 +:10D0A0000202020202020202020202020202020260 +:10D0B0000202020202020202020202020202020250 +:10D0C000020200020200010101010101010101014E +:10D0D0000101010101010101010101010101010140 +:10D0E0000101010101010102020202020202020227 +:10D0F0000202020202020202020202020202020210 +:10D1000002020202020202020202020202020202FF +:10D1100002020202020202020202020202020202EF +:10D1200002020202020202020202020202020202DF +:10D1300002020202020202010101010101010101D8 +:10D1400001010101010101020202020202020202C6 +:10D1500002020202020202020202020202020202AF +:10D16000020202020202020202020202020202029F +:10D17000020202020202020202020202020202028F +:10D18000020202020202020202020202020202027F +:10D19000020202020202020202020202020202026F +:10D1A000020202020202020202020202020202025F +:10D1B000020202020202020202020202020202024F +:10D1C000020202020200010101010101010101014B +:10D1D000010101010101010101010101010101013F +:10D1E0000101010101010102020202020202020226 +:10D1F000020202020202020202020202020202020F +:10D200000202020202020201010101010101010107 +:10D2100001010101010101020202020202020202F5 +:10D2200002020202020202000000000000000000F0 +:10D2300000000000000000020202020202020202DC +:10D2400002020202020202020202020202020202BE +:10D2500002020202020202020202020202020202AE +:10D26000020202020202020202020202020202029E +:10D27000020202020202020202020202020202028E +:10D28000020202020202020202020202020202027E +:10D29000020202020202020202020202020202026E +:10D2A000020202020202020202020202020202025E +:10D2B000020202020202020202020202020202024E +:10D2C0000202020202020201010101010101010147 +:10D2D000010101010101010101010101010101013E +:10D2E000010101010101010101010101010101012E +:10D2F000010101010101010101010101010101011E +:10D300000101010101010102020202020202020204 +:10D3100002020202020202020202020202020202ED +:10D3200002020202020202000000000000000000EF +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000020202020202020202CB +:10D3500002020202020202020202020202020202AD +:10D36000020202020202020202020202020202029D +:10D37000020202020202020202020202020202028D +:10D38000020202020202020202020202020202027D +:10D39000020202020202020202020202020202026D +:10D3A000020202020202020202020202020202025D +:10D3B000020202020202020202020202020202024D +:10D3C0000202020202020201010101010101010146 +:10D3D000010101010101010101010101010101013D +:10D3E000010101010101010101010101010101012D +:10D3F0000101010101010102020202020202020214 +:10D40000020202020202020000000000010101010A +:10D4100001010101010101020202020202020202F3 +:10D4200002020202020202000000000000000000EE +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000020202020202020202CA +:10D4500002020202020202020202020202020202AC +:10D46000020202020202020202020202020202029C +:10D47000020202020202020202020202020202028C +:10D48000020202020202020202020202020202027C +:10D49000020202020202020202020202020202026C +:10D4A000020202020202020202020202020202025C +:10D4B000020202020202020202020202020202024C +:10D4C0000202020202020201010101010101010145 +:10D4D000010101010101010101010101010101013C +:10D4E000010101010101010101010101010101012C +:10D4F000010101010101010101010101010101011C +:10D50000010101010101010101010101010101010B +:10D5100001010101010101010101010101010101FB +:10D5200001010101010101000000000000000000F4 +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000020202020202020202C9 +:10D5500002020202020202020202020202020202AB +:10D56000020202020202020202020202020202029B +:10D57000020202020202020202020202020202028B +:10D58000020202020202020202020202020202027B +:10D59000020202020202020202020202020202026B +:10D5A0000202020202020202020202000000000065 +:10D5B0000000000000000002020202020202020259 +:10D5C0000202020202020201010101010101010144 +:10D5D000010101010101010101010101010101013B +:10D5E000010101010101010101010101010101012B +:10D5F000010101010101010101010101010101011B +:10D60000010101010101010101010101010101010A +:10D6100001010101010101010101010101010101FA +:10D6200001010101010101010101010101010101EA +:10D6300001010101010101000000000000000000E3 +:10D6400000000000000000020202020202020202C8 +:10D6500002020202020202010101010101010101B3 +:10D6600001010101010101020202020202020202A1 +:10D67000020202020202020202020202020202028A +:10D68000020202020202020202020202020202027A +:10D690000202020202020201010101010101010173 +:10D6A0000101010101010100000000000000000073 +:10D6B0000000000000000002020202020202020258 +:10D6C0000202020202020201010101010101010143 +:10D6D000010101010101010101010101010101013A +:10D6E000010101010101010101010101010101012A +:10D6F000010101010101010101010101010101011A +:10D700000101010101010101010101010101010109 +:10D7100001010101010101010101010101010101F9 +:10D7200001010101010101010101010101010101E9 +:10D7300001010101010101010101010101010101D9 +:10D7400001010101010101010101010101010101C9 +:10D7500001010101010101020202020202020202B0 +:10D760000202020202020202020202020202020299 +:10D770000202020202020201010101010101010192 +:10D780000101010101010102020202020202020280 +:10D790000202020202020202020202020202020269 +:10D7A000020202020202020000000000000000006B +:10D7B0000000000000000002020202020202020257 +:10D7C0000202020202020201010101010101010142 +:10D7D0000101010101010101010101010101010139 +:10D7E0000101010101010101010101010101010129 +:10D7F0000101010101010101010101010101010119 +:10D800000101010101010101010101010101010108 +:10D8100001010101010101010101010101010101F8 +:10D8200001010101010101010101010101010101E8 +:10D8300001010101010101010101010101010101D8 +:10D8400001010101010101010101010101010101C8 +:10D8500001010101010101010101010101010101B8 +:10D8600001010101010101010101010101010101A8 +:10D87000010101010101010202020202020202028F +:10D880000202020202020202020202020202020278 +:10D89000020202020202020000000000000000007A +:10D8A000000000000000000101010101010101016F +:10D8B000010101010101010202020202020202024F +:10D8C0000202020202020201010101010101010141 +:10D8D0000101010101010101010101010101010138 +:10D8E0000101010101010101010101010101010128 +:10D8F0000101010101010101010101010101010118 +:10D900000101010101010101010101010101010107 +:10D9100001010101010101010101010101010101F7 +:10D9200001010101010101010101010101010101E7 +:10D9300001010101010101010101010101010101D7 +:10D9400001010101010101010101010101010101C7 +:10D9500001010101010101010101010101010101B7 +:10D9600001010101010101010101010101010101A7 +:10D970000101010101010101010101010101010197 +:10D980000101010101010101010101010101010187 +:10D990000101010101010100000000000000000080 +:10D9A000000000000000000101010101010101016E +:10D9B0000101010101010100000000000000000060 +:10D9C000000000000000000101010101010101014E +:10D9D0000101010101010101010101010101010137 +:10D9E0000101010101010101010101010101010127 +:10D9F0000101010101010101010101010101010117 +:10DA00000101010101010101010101010101010106 +:10DA100001010101010101010101010101010101F6 +:10DA200001010101010101010101010101010101E6 +:10DA300001010101010101010101010101010101D6 +:10DA400001010101010101010101010101010101C6 +:10DA500001010101010101010101010101010101B6 +:10DA600001010101010101010101010101010101A6 +:10DA70000101010101010101010101010101010196 +:10DA80000101010101010101010101010101010186 +:10DA90000101010101010101010101010101010176 +:10DAA0000101010101010101010101010101010166 +:10DAB000010101010101010000000000000000005F +:10DAC000000000000000000101010101010101014D +:10DAD0000101010101010101010101010101010136 +:10DAE0000101010101010101010101010101010126 +:10DAF0000101010101010101010101010101010116 +:10DB00000101010101010101010101010101010105 +:10DB100001010101010101010101010101010101F5 +:10DB200001010101010101010101010101010101E5 +:10DB300001010101010101010101010101010101D5 +:10DB400001010101010101010101010101010101C5 +:10DB500001010101010101010101010101010101B5 +:10DB600001010101010101010101010101010101A5 +:10DB70000101010101010101010101010101010195 +:10DB80000101010101010101010101010101010185 +:10DB90000101010101010101010101010101010175 +:10DBA0000101010101010101010101010101010165 +:10DBB000010101010101010000000000000000005E +:10DBC0000000000000000000000000000000000055 +:10DBD0000000000000000000000000000000000045 +:10DBE0000000000000000000000000000000000035 +:10DBF0000000000000000000000000000000000025 +:10DC00000000000000000002020202020202020202 +:10DC100002020202020202020202020202020202E4 +:10DC200002020202020202020202020202020202D4 +:10DC300002020202020202020202020202020202C4 +:10DC400002020202020202020202020202020202B4 +:10DC500002020202020202020202020202020202A4 +:10DC60000202020202020202020202020202020294 +:10DC70000202020202020202020202020202020284 +:10DC80000202020202020202020202020202020274 +:10DC90000202020202020202020202020202020264 +:10DCA0000202020202020202020202020202020254 +:10DCB0000202020202020200000000000000000056 +:10DCC0000000000000000000000000000000000054 +:10DCD0000000000000000000000000000000000044 +:10DCE0000000000000000000000000000000000034 +:10DCF0000000000000000000000000000000000024 +:10DD00000000000000000000000000000000000013 +:10DD10000000000000000000000000000000000003 +:10DD200000000000000000000000000000000000F3 +:10DD300000000000000000000000000000000000E3 +:10DD400000000000000000000000000000000000D3 +:10DD500000000000000000000000000000000000C3 +:10DD600000000000000000000000000000000000B3 +:10DD700000000000000000000000000000000000A3 +:10DD80000000000000000000000000000000000093 +:10DD90000000000000000000000000000000000083 +:10DDA0000000000000000002020202020202020261 +:10DDB0000202020202020200000000000000000055 +:10DDC0000000000000000000000000000000000053 +:10DDD0000000000000000000000000000000000043 +:10DDE0000000000000000000000000000000000033 +:10DDF0000000000000000000000000000000000023 +:10DE00000000000000000000000000000000000012 +:10DE10000000000000000000000000000000000002 +:10DE200000000000000000000000000000000000F2 +:10DE300000000000000000000000000000000000E2 +:10DE400000000000000000000000000000000000D2 +:10DE500000000000000000000000000000000000C2 +:10DE600000000000000000000000000000000000B2 +:10DE700000000000000000000000000000000000A2 +:10DE80000000000000000000000000000000000092 +:10DE90000000000000000000000000000000000082 +:10DEA0000000000000000002020202020202020260 +:10DEB0000202020202020200000000000000000054 +:10DEC0000000000000000000000000000000000052 +:10DED0000000000000000000000000000000000042 +:10DEE0000000000000000000000000000000000032 +:10DEF0000000000000000000000000000000000022 +:10DF00000000000000000000000000000000000011 +:10DF10000000000000000000000000000000000001 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000000000000000000000000B1 +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000000000000000000000000091 +:10DF90000000000000000000000000000000000081 +:10DFA0000000000000000000000000000000000071 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000000031000000000000000020 +:10DFD0000000000100000000000000000000000040 +:10DFE0000000000000000000000000000000000031 +:10DFF0000000000000000000000000000000000021 +:10E000000000000000000000000000000000000010 +:10E010000000000000000000000000000000000000 +:10E0200000000000000000000000000000000000F0 +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000000000000000000000C0 +:10E0600000000000000000000000000000000000B0 +:10E0700000000000000000000000000000000000A0 +:10E080000000000000000000000000000000000090 +:10E09000000000010100000000000000000001007D +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D000000000010001000000000000010100003C +:10E0E000000000000000000000000000010000002F +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000001000E +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000000000000000009F +:10E18000000000000000000000000000000000008F +:10E190000000010101010000000000000101010078 +:10E1A000000000000000000000000000000000006F +:10E1B000000101000000000000000000000000005D +:10E1C000000000000000000000000000000000004F +:10E1D000000000010101000000000000010100003A +:10E1E000000000000000000000000000010000002E +:10E1F000000000000000000000000000000001001E +:10E20000000000000000000000000000000001000D +:10E2100000000000000000000000000000000000FE +:10E2200000000000000000000000000000000000EE +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E2600000000000000000000000000000000000AE +:10E27000000000000000000000000000000000009E +:10E28000000000000000000000000000000000008E +:10E290000000010101010001000000010101010075 +:10E2A000000000000000000000000000000000006E +:10E2B000010101010000000000000000000000005A +:10E2C000000000000000000000000000000000004E +:10E2D0000000000101010100000000000101000038 +:10E2E000000000000000000000000000010100002C +:10E2F000000000000000000000000000000001001D +:10E30000000000010000000000000000000001000B +:10E3100000000000000000000000000000000000FD +:10E3200000000000000000000000000001010000EB +:10E3300000000000000000000000000000000000DD +:10E3400000000000000000000000000000000000CD +:10E3500000000001000000000000000100000100BA +:10E3600000000000000000000000000000010000AC +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D +:10E390000000010101010101000100010101010072 +:10E3A000000000000000000000000000000000006D +:10E3B0000101010100000000000000000000000059 +:10E3C000000000000000000000000000000000004D +:10E3D0000000000101010101000000010101000035 +:10E3E000000000000000000000000000010101002A +:10E3F000000000010000000000000000000001001B +:10E400000000000100010000000000000001010008 +:10E4100000000000000000000000000000000000FC +:10E4200000000001000000000000000001010100E8 +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000001000000000000000101010100B7 +:10E4600000000000000000000000000100010100A9 +:10E47000000000000000000000000000000000009C +:10E48000000000000000000000000000000000008C +:10E490000000010101010101010100010101010070 +:10E4A000000000000000000000000000000000006C +:10E4B0000101010101000000000000000000000057 +:10E4C000000000000000000000000000000000004C +:10E4D000010101010101010100010101010100002F +:10E4E0000000000000000000000000000101010029 +:10E4F0000000000100010000000000000101010017 +:10E500000000000100010000000000010001010006 +:10E5100000000001000000000000000000000000FA +:10E5200000000001000000000000000001010100E7 +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000100CA +:10E5500000000001000000000000000101010100B6 +:10E5600000000000000000000000000100010100A8 +:10E57000000000000000000000000000000100009A +:10E58000000000000000000000000000000001008A +:10E59000000101010101010101010101010101006D +:10E5A000000000000000000000000000000000006B +:10E5B0000101010101000000000000000000000056 +:10E5C000000000000000000000000000000000004B +:10E5D000010101010101010101010101010100002D +:10E5E0000000000100000000000000000101010027 +:10E5F0000000000100010000000000010101010015 +:10E600000000000100010000000000010101010004 +:10E6100000000001000000000000000000000000F9 +:10E6200000000001000000000000000001010100E6 +:10E6300000000001000000000000000000000000D9 +:10E6400000000000000000000000000001010100C7 +:10E6500000010101000100000001000101010100B1 +:10E6600000000001000000000000000100010100A6 +:10E670000000000100000000000000000001010097 +:10E680000000000000000000000000000101010087 +:10E69000000101010101010101010101010101006C +:10E6A000000000000000000000000000000000006A +:10E6B0000101010101000000000000000000000055 +:10E6C0000000000000000000000000000000000149 +:10E6D000010101010101010101010101010100002C +:10E6E0000000000100000000000000000101010125 +:10E6F0000000000100010000000000010101010014 +:10E700000000000101010001000000010101010001 +:10E7100000000001000000000000000000000000F8 +:10E7200000000001000100000000000001010100E4 +:10E7300000000001000000000000000000000000D8 +:10E7400000000001000000000000000001010100C5 +:10E7500000010101010100000001000101010100AF +:10E7600000000001000100000001000101010100A2 +:10E770000000000100000000000000000101010095 +:10E780000000000100000000000000010101010084 +:10E79000010101010101010101010101010101006A +:10E7A0000000000000000000000000000000000069 +:10E7B0000101010101010100000000000000000052 +:10E7C0000000000000000000000000000000000148 +:10E7D000010101010101010101010101010100002B +:10E7E0000000000100000000000000000101010124 +:10E7F0000000000100010001000000010101010012 +:10E8000000000101010101010001000101010100FD +:10E8100000000001000000000000000001010000F5 +:10E8200000000001010100000000000001010100E2 +:10E8300000000001000000000000000000000000D7 +:10E8400000000001000100000001000001010100C2 +:10E8500001010101010101000001000101010100AC +:10E86000000000010101000100010001010101009F +:10E870000000000101000000000000010101010092 +:10E880000000000100010000000100010101010081 +:10E890000101010101010101010101010101010069 +:10E8A0000000000000000000000000000000000167 +:10E8B0000101010101010100000000000000010050 +:10E8C0000000000000000000000000000000000147 +:10E8D000010101010101010101010101010100002A +:10E8E0000100000100010000000000000101010121 +:10E8F0000000010100010001000000010101010010 +:10E9000000000101010101010101000101010100FB +:10E9100000000001000000000000000001010101F2 +:10E9200001000101010100000000000001010100DF +:10E9300000000101000000000000000000010000D4 +:10E9400000000001010100000001000101010100BF +:10E9500001010101010101010101000101010100A9 +:10E96000000101010101010100010001010101009B +:10E97000010101010101000000000001010101008D +:10E98000000000010101000101010001010101017C +:10E990000101010101010101010101010101010068 +:10E9A0000000000000000000000000000000000166 +:10E9B000010101010101010000000000000001004F +:10E9C0000000000000000000000000000000000146 +:10E9D0000101010101010101010101010101000029 +:10E9E0000100000100010000000000000101010120 +:10E9F000000001010101000100000001010101000E +:10EA000000000101010101010101010101010101F8 +:10EA100000000101000000000000000001010101F0 +:10EA200001000101010100010000000101010100DC +:10EA300000000101010000000000000000010100D1 +:10EA400000000001010101000001000101010101BC +:10EA500001010101010101010101000101010100A8 +:10EA60000001010101010101010100010101010099 +:10EA7000010101010101000000000001010101008C +:10EA80000101010101010101010101010101010176 +:10EA90000101010101010101010101010101010067 +:10EAA0000000000000000000000000000000000165 +:10EAB000010101010101010100000001000001004C +:10EAC0000000000000000000000000000000000145 +:10EAD0000101010101010101010101010101000127 +:10EAE000010101010001000000010000010101011C +:10EAF0000101010101010101000100010101010009 +:10EB000000000101010101010101010101010101F7 +:10EB100000000101000000000000000001010101EF +:10EB200001010101010101010001000101010101D7 +:10EB300001000101010100000000000001010100CD +:10EB400000000001010101010101000101010101B9 +:10EB500001010101010101010101000101010100A7 +:10EB60000101010101010101010100010101010196 +:10EB70000101010101010100000100010101010089 +:10EB80000101010101010101010101010101010175 +:10EB90000101010101010101010101010101010066 +:10EBA0000000000000000000000000000000000164 +:10EBB0000101010101010101000000010101010049 +:10EBC0000000000000000000000000000000000144 +:10EBD0000101010101010101010101010101000126 +:10EBE0000101010101010001000100010101010118 +:10EBF0000101010101010101010100010101010106 +:10EC000001010101010101010101010101010101F4 +:10EC100001000101000100000000000001010101EC +:10EC200001010101010101010001000101010101D6 +:10EC300001000101010100000000000001010100CC +:10EC400000000101010101010101010101010101B6 +:10EC500001010101010101010101010101010100A5 +:10EC60000101010101010101010100010101010195 +:10EC70000101010101010101010100010101010086 +:10EC80000101010101010101010101010101010174 +:10EC90000101010101010101010101010101010065 +:10ECA0000000000000000000000000000000000163 +:10ECB0000101010101010101010000010101010047 +:10ECC0000000000000000000000000000000000242 +:10ECD0000101010101010101010101010101000125 +:10ECE0000101010101010001000100010101010117 +:10ECF0000101010101010101010101010101010104 +:10ED000001010101010101010101010101010101F3 +:10ED100001000101010100000000000001010101EA +:10ED200001010101010101010001000101010101D5 +:10ED300001010101010100000000000001010100CA +:10ED400000000101010101010101010101010101B5 +:10ED500001010101010101010101010101010101A3 +:10ED60000101010101010101010101010101010193 +:10ED70000101010101010101010101010101010084 +:10ED80000101010101010101010101010101010173 +:10ED90000101010101010101010101010101010064 +:10EDA0000000000000000000000000000000000162 +:10EDB0000101010101010101010101010101010044 +:10EDC0000000000000000000000000000000000241 +:10EDD0000201010201010101010101010101000122 +:10EDE0000101010101010001000100010101010116 +:10EDF0000101010101010101010101010101010103 +:10EE000001010101010101010101010101010101F2 +:10EE100001010101010100000000000001010101E8 +:10EE200001010101010101010101000101010101D3 +:10EE300001010101010100000000000001010100C9 +:10EE400001000101010101010101010101010101B3 +:10EE500001010101010101010101010101010101A2 +:10EE60000101010101010101010101010101010192 +:10EE70000101010101010101010101010101010182 +:10EE80000101010101010101010101010101010172 +:10EE90000101010101010101010101010101010063 +:10EEA0000000000000000000000000000000000161 +:10EEB0000101010101010101010101010101010043 +:10EEC000000000010000000000000000000000023F +:10EED000020201020202010101010101010100021D +:10EEE0000101010101010001000100010101010214 +:10EEF0000101010101010101010101010101010102 +:10EF000001010101010101010101010101010101F1 +:10EF100001010101010100000000000001010101E7 +:10EF200001010101010101010101010101010101D1 +:10EF300001010101010101000000000001010100C7 +:10EF400001000101010101010101010101010101B2 +:10EF500001010101010101010101010101010101A1 +:10EF60000101010101010101010101010101010191 +:10EF70000101010101010101010101010101010181 +:10EF80000101010101010101010101010101010171 +:10EF90000101010101010101010101010101010062 +:10EFA000000001000000000000000000000000015F +:10EFB0000202010101010101010101010101010040 +:10EFC000000001010000000000000000000000023D +:10EFD000020202020202020101010101010100021A +:10EFE0000201010101010001000100010101010212 +:10EFF0000101010101010101010101010101010101 +:10F0000001010101010101010101010101010102EF +:10F0100001010101010100000000000001010102E5 +:10F0200001010101010101010101010101010102CF +:10F0300001010101010101000000000101010101C4 +:10F0400001010101010101010101010101010101B0 +:10F0500001010101010101010101010101010101A0 +:10F060000101010101010101010101010101010190 +:10F070000101010101010101010101010101010180 +:10F080000101010101010101010101010101010170 +:10F090000101010101010101010101010101010061 +:10F0A000000001010000000000000000000000025C +:10F0B000020202010101010101010101010101003E +:10F0C000000001010000000000000000000000023C +:10F0D0000202020202020202010101010202000216 +:10F0E000020101020101010100010101020101020D +:10F0F00001010101010101010101010101010102FF +:10F1000001010102010101010101010101010102ED +:10F1100001010101010100000000000001010102E4 +:10F1200001010101010101010101010101010102CE +:10F1300001010101010101000001000101010101C2 +:10F1400001010101010101010101010101010102AE +:10F15000010101010101010101010101010101019F +:10F16000010101010101010101010101010101028E +:10F17000010101010101010101010101010101017F +:10F18000010101010101010101010101010101016F +:10F190000101010101010101010101010101010060 +:10F1A0000101010100000000000000000000000259 +:10F1B000020202020101010101010101010101003C +:10F1C000000101010000000000000000000000023A +:10F1D0000202020202020202020202020202000211 +:10F1E0000202010201010101010101010202010209 +:10F1F00001010102010101010101010101010102FD +:10F2000001010102010201010101010101010102EB +:10F2100001010102010100000000000001010102E2 +:10F2200002010102010101010101010101010102CB +:10F2300002010102010101010001000101010101BE +:10F2400001010101010101010101010101010102AD +:10F25000020201020101010101010101010101019B +:10F26000010101010101010101010101010101028D +:10F27000020101010101010101010101010101017D +:10F28000010101010101010101010101010101026D +:10F29000010102020201010101010101010101005C +:10F2A0000101010100000000000000000000000258 +:10F2B000020202020201010101010101010101003A +:10F2C0000001010100000000000000000000000239 +:10F2D0000202020202020202020202020202000210 +:10F2E0000202020201020101010101010202020205 +:10F2F00002010102010201010101010101010102FA +:10F3000002010202020201010101010101010202E6 +:10F3100002010102010100000000000001010102E0 +:10F3200002010102010101010101010101010102CA +:10F3300002010202010101010001000101010101BC +:10F3400001010101010101010101010101010102AC +:10F350000202020201010101010101010101010199 +:10F36000010101010101010101010101010101028C +:10F37000020201020101010101010101010101017A +:10F38000010101010101010101010101010101026C +:10F390000202020202020101010101010101010157 +:10F3A0000101010100000000000000000000000257 +:10F3B0000202020202010101010101010101010039 +:10F3C0000001010100000000000000000000000238 +:10F3D000020202020202020202020202020200020F +:10F3E0000202020202020101010101010202020203 +:10F3F00002020202010201010101010101010202F6 +:10F4000002020202020202020101010201020202E0 +:10F4100002010202010100000002020001010102DA +:10F4200002020202020201010101010102020102C3 +:10F4300002020202020101010001000101010101B9 +:10F4400001010101010101010101010101010102AB +:10F450000202020202020101010101020101010294 +:10F46000010101010101010101010101010101028B +:10F470000202020202010101010101010101010276 +:10F48000020101010101010101010101010101026A +:10F490000202020202020202010101010101010154 +:10F4A0000101010101000000000000000000000255 +:10F4B0000202020202020201010101010101010036 +:10F4C0000001010001000000000000000000000237 +:10F4D000020202020202020202020202020200020E +:10F4E0000202020202020102010201010202020200 +:10F4F00002020202020201020101010202020202F0 +:10F5000002020202020202020202010202020202DC +:10F5100002020202010100020201010201010102D4 +:10F5200002020202020201010101010102020202C1 +:10F5300002020202020201010001020101010102B4 +:10F5400001010102010101010101010101010102A9 +:10F55000020202020202020101020102020202028E +:10F560000202010201010101010101010101010287 +:10F570000202020202020101010101010102010273 +:10F580000202010201010101010101010101010267 +:10F59000020202020202020202020102020202014D +:10F5A0000101010101010000000000000101000251 +:10F5B0000202020202020201010101010101010035 +:10F5C0000101000001010100000000000000000234 +:10F5D000020202020202020202020202020200020D +:10F5E00002020202020201020102010202020202FE +:10F5F00002020202020202020101010202020202EE +:10F6000002020202020202020202020202020202DA +:10F6100002020202020201010101010102020102D1 +:10F6200002020202020202020101010102020202BE +:10F6300002020202020201010101010101020102B2 +:10F6400002010102020201010101010101010102A5 +:10F65000020202020202020202020102020202028B +:10F660000202020202020101010101020102010281 +:10F67000020202020202020101010102020202026E +:10F680000202020202020101010101010101010263 +:10F69000020202020202020202020202020202024A +:10F6A000010101010101000000000001010101024E +:10F6B0000202020202020202010101010101010033 +:10F6C0000100000001010101010000000000000232 +:10F6D000020202020202020202020202020200020C +:10F6E00002020202020202020102010202020202FC +:10F6F00002020202020202020202010202020202EB +:10F7000002020202020202020202020202020202D9 +:10F7100002020202020201010101010102020202CF +:10F7200002020202020202020102010202020202BB +:10F7300002020202020202010101010102020202AE +:10F74000020102020202020101020101020202029E +:10F75000020202020202020202020102020202028A +:10F76000020202020202020201020102010202027C +:10F77000020202020202020202020102020202026A +:10F78000020202020202020202020102020202025A +:10F790000202020202020202020202020202020249 +:10F7A000020101010101010000000001010101024B +:10F7B000020202020202020202010102010102002F +:10F7C000010000000101010101000000010101022E +:10F7D000020202020202020202020202020200020B +:10F7E00002020202020202020202020202020202F9 +:10F7F00002020202020202020202020202020202E9 +:10F8000002020202020202020202020202020202D8 +:10F8100002020202020201010101010102020202CE +:10F8200002020202020202020202010202020202B9 +:10F8300002020202020202010101010102020202AD +:10F840000202020202020202020201020202020299 +:10F850000202020202020202020202020202020288 +:10F860000202020202020202020201020202020279 +:10F870000202020202020202020202020202020268 +:10F880000202020202020202020202020202020258 +:10F890000202020202020202020202020202020248 +:10F8A0000202020101010101000000010101010247 +:10F8B000020202020202020202020202020202002A +:10F8C000000000000101010101000000010101022E +:10F8D000020202020202020202020202020200020A +:10F8E00002020202020202020202020202020202F8 +:10F8F00002020202020202020202020202020202E8 +:10F9000002020202020202020202020202020202D7 +:10F9100002020202020201010101010102020202CD +:10F9200002020202020202020202020202020202B7 +:10F9300002020202020202020102010202020202A9 +:10F940000202020202020202020202020202020297 +:10F950000202020202020202020202020202020287 +:10F960000202020202020202020201020202020278 +:10F970000202020202020202020202020202020267 +:10F980000202020202020202020202020202020257 +:10F990000202020202020202020202020202020247 +:10F9A0000202020201010101000100010101010244 +:10F9B0000202020202020202020202020202020029 +:10F9C000000000000001010101010000010101022D +:10F9D0000202020202020202020202020202000209 +:10F9E00002020202020202020202020202020202F7 +:10F9F00002020202020202020202020202020202E7 +:10FA000002020202020202020202020202020202D6 +:10FA100002020202020201010101010102020202CC +:10FA200002020202020202020202020202020202B6 +:10FA300002020202020202020102010202020202A8 +:10FA40000202020202020202020202020202020296 +:10FA50000202020202020202020202020202020286 +:10FA60000202020202020202020202020202020276 +:10FA70000202020202020202020202020202020266 +:10FA80000202020202020202020202020202020256 +:10FA90000202020202020202020202020202020246 +:10FAA0000202020201010101010100010101010242 +:10FAB0000202020202020202020202020202020028 +:10FAC000000000000000000101010001010101022D +:10FAD0000202020202020202020202020202000208 +:10FAE00002020202020202020202020202020202F6 +:10FAF00002020202020202020202020202020202E6 +:10FB000002020202020202020202020202020202D5 +:10FB100002020202020202010101010102020202CA +:10FB200002020202020202020202020202020202B5 +:10FB300002020202020202020202010202020202A6 +:10FB40000202020202020202020202020202020295 +:10FB50000202020202020202020202020202020285 +:10FB60000202020202020202020202020202020275 +:10FB70000202020202020202020202020202020265 +:10FB80000202020202020202020202020202020255 +:10FB90000202020202020202020202020202020245 +:10FBA000020202020201010101010101010101023F +:10FBB0000202020202020202020202020202020027 +:10FBC000000000000000000000010001010101022E +:10FBD0000202020202020202020202020202000207 +:10FBE00002020202020202020202020202020202F5 +:10FBF00002020202020202020202020202020202E5 +:10FC000002020202020202020202020202020202D4 +:10FC100002020202020202020202020102020202C5 +:10FC200002020202020202020202020202020202B4 +:10FC300002020202020202020202020202020202A4 +:10FC40000202020202020202020202020202020294 +:10FC50000202020202020202020202020202020284 +:10FC60000202020202020202020202020202020274 +:10FC70000202020202020202020202020202020264 +:10FC80000202020202020202020202020202020254 +:10FC90000202020202020202020202020202020244 +:10FCA000020202020202010101010101010101023D +:10FCB0000202020202020202020202020202020224 +:10FCC000000000000000000000010001010101022D +:10FCD0000202020202020202020202020202000206 +:10FCE00002020202020202020202020202020202F4 +:10FCF00002020202020202020202020202020202E4 +:10FD000002020202020202020202020202020202D3 +:10FD100002020202020202020202020202020202C3 +:10FD200002020202020202020202020202020202B3 +:10FD300002020202020202020202020202020202A3 +:10FD40000202020202020202020202020202020293 +:10FD50000202020202020202020202020202020283 +:10FD60000202020202020202020202020202020273 +:10FD70000202020202020202020202020202020263 +:10FD80000202020202020202020202020202020253 +:10FD90000202020202020202020202020202020243 +:10FDA000020202020202020101010101010101023B +:10FDB0000202020202020202020202020202020223 +:10FDC0000202000000000000000001010101010228 +:10FDD0000202020202020202020202020202010204 +:10FDE00002020202020202020202020202020202F3 +:10FDF00002020202020202020202020202020202E3 +:10FE000002020202020202020202020202020202D2 +:10FE100002020202020202020202020202020202C2 +:10FE200002020202020202020202020202020202B2 +:10FE300002020202020202020202020202020202A2 +:10FE40000202020202020202020202020202020292 +:10FE50000202020202020202020202020202020282 +:10FE60000202020202020202020202020202020272 +:10FE70000202020202020202020202020202020262 +:10FE80000202020202020202020202020202020252 +:10FE90000202020202020202020202020202020242 +:10FEA0000202020202020202010101020202010236 +:10FEB0000202020202020202020202020202020222 +:10FEC0000202020000000000000001010101010225 +:10FED0000202020202020202020202020202010203 +:10FEE00002020202020202020202020202020202F2 +:10FEF00002020202020202020202020202020202E2 +:10FF000002020202020202020202020202020202D1 +:10FF100002020202020202020202020202020202C1 +:10FF200002020202020202020202020202020202B1 +:10FF300002020202020202020202020202020202A1 +:10FF40000202020202020202020202020202020291 +:10FF50000202020202020202020202020202020281 +:10FF60000202020202020202020202020202020271 +:10FF70000202020202020202020202020202020261 +:10FF80000202020202020202020202020202020251 +:10FF90000202020202020202020202020202020241 +:10FFA0000202020202020202020201020202020232 +:10FFB0000202020202020202020202020202020221 +:10FFC0000202020200000000000001010000010125 +:10FFD0000101010101010101010101010101010210 +:10FFE00002020202020202020202020202020202F1 +:10FFF00002020202020202020202020202020202E1 +:0200000280007C +:1000000002020202020202020202020202020202D0 +:1000100002020202020202020202020202020202C0 +:1000200002020202020202020202020202020202B0 +:1000300002020202020202020202020202020202A0 +:100040000202020202020202020202020202020290 +:100050000202020202020202020202020202020280 +:100060000202020202020202020202020202020270 +:100070000202020202020202020202020202020260 +:100080000202020202020202020202020202020250 +:100090000202020202020202020202020202020240 +:1000A0000202020202020202020202020202020230 +:1000B0000202020202020202020202020202020220 +:1000C0000202020202000000000001000000000124 +:1000D0000101010101010101010101010101010011 +:1000E000000000000000000000000000000000020E +:1000F00002020202020202020202020202020202E0 +:1001000002020202020202020202020202020202CF +:1001100002020202020202020202020202020202BF +:1001200002020202020202020202020202020202AF +:10013000020202020202020202020202020202029F +:10014000020202020202020202020202020202028F +:10015000020202020202020202020202020202027F +:10016000020202020202020202020202020202026F +:10017000020202020202020202020202020202025F +:10018000020202020202020202020202020202024F +:10019000020202020202020202020202020202023F +:1001A000020202020202020202020202020202022F +:1001B000020202020202020202020202020202021F +:1001C0000202020202020200000000000000000120 +:1001D0000101010101010101010101010101010010 +:1001E000000000000000000000000000000000020D +:1001F00002020202020202020202020202020202DF +:1002000002020202020202020202020202020202CE +:1002100002020202020202020202020202020202BE +:1002200002020202020202020202020202020202AE +:10023000020202020202020202020202020202029E +:10024000020202020202020202020202020202028E +:10025000020202020202020202020202020202027E +:10026000020202020202020202020202020202026E +:10027000020202020202020202020202020202025E +:10028000020202020202020202020202020202024E +:10029000020202020202020202020202020202023E +:1002A000020202020202020202020202020202022E +:1002B000020202020202020202020202020202021E +:1002C0000202020202020202020000000202020115 +:1002D000010101010101010101010101010101010E +:1002E00001010101010101010101010101010102FD +:1002F00002020202020202020202020202020202DE +:1003000002020202020202020202020202020202CD +:1003100002020202020202020202020202020202BD +:1003200002020202020202020202020202020201AE +:1003300001010101010101010101010101010102AC +:10034000020202020202020202020202020202028D +:10035000020202020202020202020202020202027D +:10036000020202020202020202020202020202026D +:10037000020202020202020202020202020202025D +:10038000020202020202020202020202020202024D +:10039000020202020202020202020202020202023D +:1003A000020202020202020202020202020202022D +:1003B000020202020202020202020202020202021D +:1003C0000202020202020202020000020202020112 +:1003D000010101010101010101010101010101010D +:1003E00001010101010101010101010101010102FC +:1003F00002020202020202020202020202020201DE +:1004000001010101010101010101010101010102DB +:1004100002020202020202020202020202020202BC +:1004200002020202020202020202020202020202AC +:10043000020202020202020202020202020202029C +:10044000020202020202020202020202020202028C +:10045000020202020202020202020202020202027C +:10046000020202020202020202020202020202026C +:10047000020202020202020202020202020202025C +:10048000020202020202020202020202020202024C +:10049000020202020202020202020202020202023C +:1004A000020202020202020202020202020202022C +:1004B000020202020202020202020202020202021C +:1004C000020202020202020202020202020202010D +:1004D000010101010101010101010101010101010C +:1004E00001010101010101010101010101010101FC +:1004F00001010101010101010101010101010102EB +:1005000002020202020202020202020202020200CD +:1005100000000000000000000000000000000001DA +:1005200001010101010101010101010101010100BC +:1005300000000000000000000000000000000002B9 +:10054000020202020202020202020202020202028B +:10055000020202020202020202020202020202027B +:10056000020202020202020202020202020202016C +:10057000010101010101010101010101010101026A +:10058000020202020202020202020202020202024B +:10059000020202020202020202020202020202023B +:1005A000020202020202020202020202020202022B +:1005B000020202020202020202020202020202021B +:1005C000020202020202020202020202020202010C +:1005D000010101010101010101010101010101010B +:1005E00001010101010101010101010101010101FB +:1005F00001010101010101010101010101010100EC +:1006000000000000000000000000000000000001E9 +:1006100001010101010101010101010101010102C9 +:1006200002020202020202020202020202020200AC +:1006300000000000000000000000000000000002B8 +:10064000020202020202020202020202020202018B +:100650000101010101010101010101010101010289 +:10066000020202020202020202020202020202026A +:10067000020202020202020202020202020202025A +:10068000020202020202020202020202020202024A +:10069000020202020202020202020202020202023A +:1006A000020202020202020202020202020202022A +:1006B0000200000000000000000000000000000236 +:1006C000020202020202020202020202020202010B +:1006D000010101010101010101010101010101010A +:1006E00001010101010101010101010101010101FA +:1006F00001010101010101010101010101010101EA +:1007000001010101010101010101010101010101D9 +:1007100001010101010101010101010101010101C9 +:1007200001010101010101010101010101010100BA +:1007300000000000000000000000000000000002B7 +:100740000202020202020202020202020202020289 +:100750000202020202020202020202020202020279 +:10076000020202020202020202020202020202006B +:100770000000000000000000000000000000000277 +:100780000202020202020202020202020202020249 +:100790000202020202020202020202020202020239 +:1007A000020202020202020202020202020202002B +:1007B0000000000000000000000000000000000237 +:1007C000020202020202020202020202020202010A +:1007D0000101010101010101010101010101010109 +:1007E00001010101010101010101010101010101F9 +:1007F00001010101010101010101010101010101E9 +:1008000001010101010101010101010101010101D8 +:1008100001010101010101010101010101010101C8 +:1008200001010101010101010101010101010101B8 +:1008300001010101010101010101010101010101A8 +:100840000101010101010101010101010101010099 +:100850000000000000000000000000000000000296 +:10086000020202020202020202020202020202006A +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000266 +:10089000020202020202020202020202020202003A +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000236 +:1008C0000202020202020202020202020202020109 +:1008D0000101010101010101010101010101010108 +:1008E00001010101010101010101010101010101F8 +:1008F00001010101010101010101010101010101E8 +:1009000001010101010101010101010101010101D7 +:1009100001010101010101010101010101010101C7 +:1009200001010101010101010101010101010101B7 +:1009300001010101010101010101010101010101A7 +:100940000101010101010101010101010101010197 +:100950000101010101010101010101010101010187 +:100960000101010101010101010101010101010078 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000265 +:100990000202020202020202020202020202020039 +:1009A0000000000000000000000000000000000146 +:1009B0000101010101010101010101010101010226 +:1009C0000202020202020202020202020202020108 +:1009D0000101010101010101010101010101010107 +:1009E00001010101010101010101010101010101F7 +:1009F00001010101010101010101010101010101E7 +:100A000001010101010101010101010101010101D6 +:100A100001010101010101010101010101010101C6 +:100A200001010101010101010101010101010101B6 +:100A300001010101010101010101010101010101A6 +:100A40000101010101010101010101010101010196 +:100A50000101010101010101010101010101010186 +:100A60000101010101010101010101010101010176 +:100A70000101010101010101010101010101010166 +:100A80000101010101010101010101010101010156 +:100A90000101010101010101010101010101010047 +:100AA0000000000000000000000000000000000145 +:100AB0000101010101010101010101010101010225 +:100AC0000202020202020202020202020202020107 +:100AD0000101010101010101010101010101010106 +:100AE00001010101010101010101010101010101F6 +:100AF00001010101010101010101010101010101E6 +:100B000001010101010101010101010101010101D5 +:100B100001010101010101010101010101010101C5 +:100B200001010101010101010101010101010101B5 +:100B300001010101010101010101010101010101A5 +:100B40000101010101010101010101010101010195 +:100B50000101010101010101010101010101010185 +:100B60000101010101010101010101010101010175 +:100B70000101010101010101010101010101010165 +:100B80000101010101010101010101010101010155 +:100B90000101010101010101010101010101010145 +:100BA0000101010101010101010101010101010135 +:100BB0000101010101010101010101010101010026 +:100BC0000000000000000000000000000000000124 +:100BD0000101010101010101010101010101010105 +:100BE00001010101010101010101010101010101F5 +:100BF00001010101010101010101010101010101E5 +:100C000001010101010101010101010101010101D4 +:100C100001010101010101010101010101010101C4 +:100C200001010101010101010101010101010101B4 +:100C300001010101010101010101010101010101A4 +:100C40000101010101010101010101010101010194 +:100C50000101010101010101010101010101010184 +:100C60000101010101010101010101010101010174 +:100C70000101010101010101010101010101010164 +:100C80000101010101010101010101010101010154 +:100C90000101010101010101010101010101010144 +:100CA0000101010101010101010101010101010134 +:100CB0000101010101010101010101010101010025 +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000000000000000000000014 +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000000000000000000000F4 +:100D000000000000000000000000000000000002E1 +:100D100002020202020202020202020202020202B3 +:100D200002020202020202020202020202020202A3 +:100D30000202020202020202020202020202020293 +:100D40000202020202020202020202020202020283 +:100D50000202020202020202020202020202020273 +:100D60000202020202020202020202020202020263 +:100D70000202020202020202020202020202020253 +:100D80000202020202020202020202020202020243 +:100D90000202020202020202020202020202020233 +:100DA0000202020202020202020202020202020223 +:100DB0000202020202020202020202020202020015 +:100DC0000000000000000000000000000000000023 +:100DD0000000000000000000000000000000000013 +:100DE0000000000000000000000000000000000003 +:100DF00000000000000000000000000000000000F3 +:100E000000000000000000000000000000000000E2 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E300000000000000000000000000000000000B2 +:100E400000000000000000000000000000000000A2 +:100E50000000000000000000000000000000000092 +:100E60000000000000000000000000000000000082 +:100E70000000000000000000000000000000000072 +:100E80000000000000000000000000000000000062 +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000000000000240 +:100EB0000202020202020202020202020202020014 +:100EC0000000000000000000000000000000000022 +:100ED0000000000000000000000000000000000012 +:100EE0000000000000000000000000000000000002 +:100EF00000000000000000000000000000000000F2 +:100F000000000000000000000000000000000000E1 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F300000000000000000000000000000000000B1 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000000000000000000000091 +:100F60000000000000000000000000000000000081 +:100F70000000000000000000000000000000000071 +:100F80000000000000000000000000000000000061 +:100F90000000000000000000000000000000000051 +:100FA000000000000000000000000000000000023F +:100FB0000202020202020202020202020202020013 +:100FC0000000000000000000000000000000000021 +:100FD0000000000000000000000000000000000011 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000000F1 +:1010000000000000000000000000000000000000E0 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 +:1010300000000000000000000000000000000000B0 +:1010400000000000000000000000000000000000A0 +:101050000000000000000000000000000000000090 +:101060000000000000000000000000000000000080 +:101070000000000000000000000000000000000070 +:101080000000000000000000000000000000000060 +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C00000000000000000000000000000000031EF +:1010D000000000000000000000000000000000010F +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:1011000001000001000000000000000000000000DD +:1011100000000000000000000000000000000000CF +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000000000009F +:10115000000000000000000000000000000000008F +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F +:10118000000000000000000000000000000000005F +:10119000000000000000000000000000000000004F +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000100010100010B +:1011E00001000101010100000000000000000000FA +:1011F00000000000000000000000000000000000EF +:1012000001000001000001000000000000000000DB +:1012100000000000000001000000000000000000CD +:1012200000000000000000000000000000000000BE +:1012300000000000000000000000000000000000AE +:10124000000000000000000000000000000000009E +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000000000007E +:10127000000000000000000000000000000000006E +:10128000000000000000000000000000000000005E +:10129000000000000000000000000000000000004E +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D0000000000000000000010101010101010106 +:1012E00001000101010100010000000000000000F8 +:1012F00000000101000100010000000000000000EA +:1013000001000101010101000000000000000000D7 +:1013100001000101010101000000000000000000C7 +:1013200000000000000001000000000000000000BC +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000000000010000000000000000007C +:10137000000000000000000000000000000000006D +:10138000000000000000000000000000000000005D +:10139000000000000000000000000000000000004D +:1013A000000000000000000000000000000000003D +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D0000000000000000000010101010101010105 +:1013E00001010101010100010000000000000000F6 +:1013F00000000101000101010000000000000100E7 +:1014000001000101010101000000000000000000D6 +:1014100001000101010101000000000000000000C6 +:1014200001000101010101000000000000000000B6 +:1014300000000101000100000000000000000000A9 +:10144000000000000000000000000000000000009C +:10145000000000000000000000000000000000008C +:101460000100010101010100000000000000000076 +:10147000000000000000000000000000000000006C +:10148000000000000000000000000000000000005C +:10149000000000000000000000000000000000004C +:1014A000000000000000000000000000000000003C +:1014B000000000000000000000000000000000002C +:1014C000000000000000000000000000000000001C +:1014D0000001000000000000010101010101010103 +:1014E00001010101010100010000000000000000F5 +:1014F00001000101010101010000000000000100E4 +:1015000001010101010101000000000000000000D4 +:1015100001010101010101000000000000000000C4 +:1015200001000101010101000000000000000000B5 +:1015300000000101000101000000000000000000A7 +:10154000000000000000000000000000000000009B +:10155000000000000000000000000001000000008A +:101560000100010101010100000000000000000075 +:10157000000000000000000000000000000000006B +:10158000000000000000000000000000000000005B +:101590000000000100010000000000000000000049 +:1015A000000000000000000000000000000000003B +:1015B000000000000000000000000000000000002B +:1015C0000000000000000000000100000001000019 +:1015D0000101000000000001010101010101010100 +:1015E00001010101010100010000000000000000F4 +:1015F00001000101010101010000000100000100E2 +:1016000001010101010101000000000000000100D2 +:1016100001010101010101000000000000000000C3 +:1016200001000101010101000000000000000000B4 +:1016300001000101010101000000000000000000A4 +:10164000000000000000000000000000000000009A +:101650000000000000000000000000010000000089 +:101660000101010101010100000000000000000073 +:10167000000000000000000000000000000000006A +:10168000000000000000000000000000000000005A +:101690000000000100010100000000000000000047 +:1016A000000000000000000000000000000000003A +:1016B000000000000000000000000000000000002A +:1016C0000000000000000000000100000001000018 +:1016D00001010000010000010101010101010101FE +:1016E00001010101010100010000000001000000F2 +:1016F00001000101010101010000000101000100E0 +:1017000001010101010101000000000001010100CF +:1017100001010101010101000101000100000100BE +:1017200001000101010101000000000000000000B3 +:1017300001000101010101000000000000000000A3 +:101740000000010100010000000000000000000096 +:101750000000000000000000010100010000010085 +:101760000101010101010100000000000000000072 +:101770000000000000000000000000000000000069 +:101780000000000000000000000000000000000059 +:101790000100010101010100000000000000000043 +:1017A0000000000000000000000000000000000039 +:1017B0000000000100010001000000000000000026 +:1017C0000000000000000000000100000001000017 +:1017D00001010000010000010101010101010101FD +:1017E00001010101010100010000000101000100EF +:1017F00001000101010101010000000101000101DE +:1018000001010101010101000000000101010101CC +:1018100001010101010101010101010101000100BA +:1018200001010101010101000000000000000000B1 +:1018300001000101010101000000000000000000A2 +:101840000000010100010100000000000000000094 +:101850000000000100000000010101010101010080 +:101860000101010101010100000000000000000071 +:101870000000000000000000000000000000000068 +:101880000000000100010000000000000000010055 +:101890000100010101010100000000000000000042 +:1018A0000000000000000000000000000000000038 +:1018B0000000000100010101000000000000000024 +:1018C0000000000000000000000100000001000016 +:1018D00001010000010000010101010101010101FC +:1018E00001010101010100010000000101000100EE +:1018F00001010101010101010000000101010101DB +:1019000001010101010101000000000101010101CB +:1019100001010101010101010101010101000100B9 +:1019200001010101010101000000000100000100AE +:1019300001000101010101000000000000000000A1 +:101940000100010101010100000000000000000091 +:10195000000000010000000001010101010101017E +:101960000101010101010100000000000000000070 +:101970000000000000000000000000000000000067 +:101980000000000100010100000000000000010053 +:101990000101010101010100000000000000000040 +:1019A0000000000000000000000000000000000037 +:1019B0000100010101010101000000000000000020 +:1019C0000000000000000000000100000001010014 +:1019D00001010100010000010101010101010101FA +:1019E00001010101010100010100000101000100EC +:1019F00001010101010101010001000101010101D9 +:101A000001010101010101000001000101010101C9 +:101A100001010101010101010101010101010100B7 +:101A200001010101010101000000000101000100AC +:101A3000010101010101010000000000000000009F +:101A40000100010101010100000000000000000090 +:101A5000000001010001000001010101010101017B +:101A6000010101010101010000000000000000006F +:101A70000000000000000000000000000000000066 +:101A8000000001010101010001010001000001004D +:101A9000010101010101010000000000000000003F +:101AA0000000000000000000000000000000010035 +:101AB000010001010101010101000000000000001E +:101AC0000000000000000000000100000101010111 +:101AD00001010100010000020101010101010101F8 +:101AE00001010101010100020100000101010100E9 +:101AF00001010101010101010001010101010101D7 +:101B000001010101010101000001010101010101C7 +:101B100001010101010101010101010101010101B5 +:101B200001010101010101000101000101000100A9 +:101B3000010101010101010000000000000000009E +:101B4000010001010101010000000001000000008E +:101B50000000010100010100010101010101010179 +:101B6000010101010101010000000000000000006E +:101B70000000000000000000000000000000000065 +:101B80000000010101010100010101010101010049 +:101B9000010101010101010000000000000000003E +:101BA0000000000000000000000000000100010033 +:101BB000010001010101010101000000000000001D +:101BC0000000000000000000000100000101010110 +:101BD00001010100010100020101010101010101F6 +:101BE00001010101010100020101000101010100E7 +:101BF00001010101010101020101010101010101D4 +:101C000001010101010101000101010101010101C5 +:101C100001010101010101010101010101010101B4 +:101C200001010101010101010101010101010100A5 +:101C30000101010101010100010100010000010099 +:101C4000010001010101010000000001010000008C +:101C50000000010101010101010101010101010176 +:101C6000010101010101010000000000000000006D +:101C70000000000000000000000000000100000063 +:101C80000100010101010100010101010101010146 +:101C9000010101010101010000000000000000003D +:101CA0000000000000000000000100010100010030 +:101CB000010001010101010101010001000000001A +:101CC000000000000000010000010001010101010D +:101CD00001010100010100020201010101010101F4 +:101CE00001010101010100020101010101010100E5 +:101CF00001010101010101020101010101010101D3 +:101D000001010101010101010101010101010101C3 +:101D100001010101010101010101010101010101B3 +:101D200001010101010101010101010101010101A3 +:101D30000101010101010100010101010100010096 +:101D40000101010101010100000100010100000089 +:101D50000000010101010101010101010101010175 +:101D6000010101010101010000000000000000006C +:101D7000000000000000000001010001010001005E +:101D80000100010101010100010101010101010145 +:101D9000010101010101010000000000000000003C +:101DA000000000000000000000010101010101002D +:101DB0000101010101010101010101010100000016 +:101DC0000000000100010100010100010101010109 +:101DD00001010100010100020202020101010102F0 +:101DE00001010101010100020101010101010101E3 +:101DF00001010101010101020101010101010101D2 +:101E000001010101010101010101010101010101C2 +:101E100001010101010101010101010101010101B2 +:101E200001010101010101010101010101010101A2 +:101E30000101010101010100010101010100010194 +:101E40000101010101010100000101010100000087 +:101E50000100010101010101010101010101010173 +:101E6000010101010101010000000000000000006B +:101E7000000000000000000001010101010101005B +:101E80000101010101010100010101010101010143 +:101E9000010101010101010000000000000000003B +:101EA0000000000100000000010101010101010129 +:101EB0000101010101010101010101010100010014 +:101EC0000000000100010100010101010101010107 +:101ED00001010100010100020202020202020102EC +:101EE00001010101010100020101010101010101E2 +:101EF00001010101010101020101010101010101D1 +:101F000001010101010101010101010101010101C1 +:101F100001010101010101020101010101010101B0 +:101F200001010101010101010101010101010101A1 +:101F30000101010101010101010101010101010191 +:101F40000101010101010100010101010100010084 +:101F50000100010101010101010101010101010172 +:101F6000010101010101010000000000000000006A +:101F70000000000000000000010101010101010159 +:101F80000101010101010101010101010101010141 +:101F90000101010101010100010100010000000037 +:101FA0000000000100000001010101010101010127 +:101FB0000101010101010101010101010101010012 +:101FC0000100010100010100010101010101010104 +:101FD00001010101010100020202020202020202E9 +:101FE00002020101020200020101010101010101DD +:101FF00001010101010101020101010101010101D0 +:1020000001010101010101010101010101010101C0 +:1020100001010101010101020101010101010101AF +:1020200001010101010101010101010101010101A0 +:102030000101010101010101010101010101010190 +:102040000101010101010101010101010100010082 +:102050000101010101010101010101010101010170 +:102060000101010101010100000000000000000069 +:102070000000010100010001010101010101010154 +:102080000101010101010101010101010101010140 +:102090000101010101010101010101010000000034 +:1020A0000000010100010001010101010101010124 +:1020B0000101010101010102010101010101010010 +:1020C0000100010100010100010101010101010103 +:1020D00001010101010100020202020202020202E8 +:1020E00002020202020200020101010101010101DA +:1020F00001010101010101020101010101010101CF +:1021000001010101010101010101010101010101BF +:1021100001010101010101020201010101010101AD +:10212000010101010101010201010101010101019E +:10213000010101010101010101010101010101018F +:102140000101010101010101010101010100010081 +:10215000010101010101010101010101010101016F +:102160000101010101010100000000000000000068 +:102170000000010100010101010101010101010152 +:10218000010101010101010101010101010101013F +:102190000101010101010101010101010000000033 +:1021A0000000010100010101010101010101010122 +:1021B000010101010101010201010101010101000F +:1021C0000101010101010100010001010101010101 +:1021D00001010101010100020202020202020202E7 +:1021E00002020202020200020201010101010101D8 +:1021F00001010101010101020101010101010101CE +:1022000002010101010101010101010101010101BD +:1022100001010101010101020202010101010101AB +:10222000010101010101010201010101010101019D +:10223000010101010101010101010101010101018E +:10224000010101010101010101010101010101007F +:10225000010101010101010202010101010101016C +:102260000101010101010100000000000000000067 +:102270000000010101010101010101010101010150 +:10228000010101010101010101010101010101013E +:102290000101010101010101010101010100000031 +:1022A0000000010101010101010101010101010120 +:1022B000010101010101010201010101010101010D +:1022C0000101010101010100010001010101010100 +:1022D00001010101010101020202020202020202E5 +:1022E00002020202020200020201010202010101D5 +:1022F00002010202010201020101010201010201C7 +:1023000002010102010101020101010101010101BA +:1023100001010101010101020202020201010101A8 +:10232000020101010101010202010101010101019A +:10233000010101010101010201010101010101018C +:10234000010101010101010101010101010101017D +:102350000101010101010102020201020101010169 +:102360000101010101010100010100000000000064 +:10237000000001010101010101010101010101014F +:10238000010101010101010101010101010101013D +:10239000010101010101010101010101010001002F +:1023A000000001010101010101010101010101011F +:1023B000010101010101010201010101010101010C +:1023C0000101010101010100010001010100010100 +:1023D00001010101010101020202020202020202E4 +:1023E00002020202020200020202010202010201D2 +:1023F00002010202020202020202010202010201C1 +:1024000002020202020202020101010101010101B4 +:1024100002010101010101020202020202010201A4 +:102420000201020202020202020201020101010192 +:102430000201020201020102020101010101010186 +:10244000010101010101010201010101010101017B +:102450000101010101010102020202020101010167 +:10246000020101010101010101010100010000005F +:10247000010001010101010101010101010101014D +:10248000010101010101010101010101010101013C +:10249000010101010101010101010101010001002E +:1024A000010001010101010101010101010101011D +:1024B000010101010101010202010101010101010A +:1024C00001010101010101000100010101000101FF +:1024D00000000101010101020202020202020202E5 +:1024E00002020202020200020202020202020201CF +:1024F00002020202020202020202020202020202BC +:1025000002020202020202020202010202020201AD +:10251000020202020202020202020202020202019C +:10252000020202020202020202020202020102018D +:102530000201020202020202020201010101010182 +:10254000010101010101010201010101010101017A +:102550000101010101010102020202020202020163 +:102560000202020202020201010101010100010056 +:10257000010001010101010201010101010101014B +:102580000101010101010102020101010101010139 +:10259000010101010101010201010101010001012B +:1025A000010001010101010201010101010101011B +:1025B0000101010101010102020101010101010109 +:1025C00001010101010101000000010101000101FF +:1025D00000000101010101020202020202020202E4 +:1025E00002020202020200020202020202020201CE +:1025F00002020202020202020202020202020202BB +:1026000002020202020202020202020202020202AA +:10261000020202020202020202020202020202029A +:10262000020202020202020202020202020202018B +:10263000020202020202020202020202010101017E +:102640000201020201020102020201020101010172 +:102650000101010101010102020202020202020261 +:102660000202020202020202010101010100010054 +:102670000100010101010102020101010101010149 +:102680000101010101010102020201010101010137 +:102690000101010101010102010101010101010129 +:1026A000010001010101010201010101010101011A +:1026B0000101010101010102020201010101010107 +:1026C00001010101010101000000010101000101FE +:1026D00000000101010101020202020202020202E3 +:1026E00002020202020200020202020202020202CC +:1026F00002020202020202020202020202020202BA +:1027000002020202020202020202020202020202A9 +:102710000202020202020202020202020202020299 +:102720000202020202020202020202020202020289 +:10273000020202020202020202020202020102017B +:10274000020102020202020202020202020101016D +:10275000010101020101010202020202020202025F +:102760000202020202020202010101010100010053 +:102770000100010101010102020201010101010147 +:102780000101010101010102020202020101020133 +:102790000201010201020102020101010101010124 +:1027A0000100010101010102020201010101010117 +:1027B0000101010101010102020202020101010104 +:1027C0000101010101010100000001010000000000 +:1027D00000000101000101020202020202020202E3 +:1027E00002020202020200020202020202020202CB +:1027F00002020202020202020202020202020202B9 +:1028000002020202020202020202020202020202A8 +:102810000202020202020202020202020202020298 +:102820000202020202020202020202020202020288 +:102830000202020202020202020202020202020278 +:10284000020202020202020202020202020101016B +:10285000010102020102010202020202020202025C +:102860000202020202020202020101010101010050 +:102870000101010101010102020202020201010142 +:10288000010101020102010202020202020202012E +:10289000020202020202020202020101010101011E +:1028A0000101010101010102020202020201020111 +:1028B00002010102010201020202020202010101FF +:1028C0000101010101010100000001000000000000 +:1028D00000000101000101020202020202020202E2 +:1028E00002020202020200020202020202020202CA +:1028F00002020202020202020202020202020202B8 +:1029000002020202020202020202020202020202A7 +:102910000202020202020202020202020202020297 +:102920000202020202020202020202020202020287 +:102930000202020202020202020202020202020277 +:102940000202020202020202020202020201020169 +:102950000201020202020202020202020202020258 +:10296000020202020202020202020101010101014D +:10297000010101010101010202020202020202013F +:102980000201020202020202020202020202020228 +:10299000020202020202020202020202010101011B +:1029A000010101010101010202020202020202010F +:1029B00002010202020202020202020202020201F9 +:1029C0000101010101010100000000000000000000 +:1029D00000000101000101020202020202020202E1 +:1029E00002020202020200020202020202020202C9 +:1029F00002020202020202020202020202020202B7 +:102A000002020202020202020202020202020202A6 +:102A10000202020202020202020202020202020296 +:102A20000202020202020202020202020202020286 +:102A30000202020202020202020202020202020276 +:102A40000202020202020202020202020202020167 +:102A50000202020202020202020202020202020256 +:102A6000020202020202020202020201010101014B +:102A7000010101010101010202020202020202023D +:102A80000202020202020202020202020202020226 +:102A9000020202020202020202020202010101011A +:102AA000010101010101010202020202020202020D +:102AB00002020202020202020202020202020201F7 +:102AC00002010102010202000002000000000000F9 +:102AD00000000001000101020202020202020202E1 +:102AE00002020202020200020202020202020202C8 +:102AF00002020202020202020202020202020202B6 +:102B000002020202020202020202020202020202A5 +:102B10000202020202020202020202020202020295 +:102B20000202020202020202020202020202020285 +:102B30000202020202020202020202020202020275 +:102B40000202020202020202020202020202020265 +:102B50000202020202020202020202020202020255 +:102B60000202020202020202020202020201010148 +:102B70000101020201020102020202020202020239 +:102B80000202020202020202020202020202020225 +:102B90000202020202020202020202020201010118 +:102BA000010101020101010202020202020202020B +:102BB00002020202020202020202020202020202F5 +:102BC00002020202010202000002000000020000F4 +:102BD00000020001000001020202020202020202DF +:102BE00002020202020200020202020202020202C7 +:102BF00002020202020202020202020202020202B5 +:102C000002020202020202020202020202020202A4 +:102C10000202020202020202020202020202020294 +:102C20000202020202020202020202020202020284 +:102C30000202020202020202020202020202020274 +:102C40000202020202020202020202020202020264 +:102C50000202020202020202020202020202020254 +:102C60000202020202020202020202020201020146 +:102C70000201020202020202020202020202020235 +:102C80000202020202020202020202020202020224 +:102C90000202020202020202020202020201020116 +:102CA0000101020201020102020202020202020208 +:102CB00002020202020202020202020202020202F4 +:102CC00002020202020202000202020202020200E8 +:102CD00002020201020001020202020202020202D8 +:102CE00002020202020200020202020202020202C6 +:102CF00002020202020202020202020202020202B4 +:102D000002020202020202020202020202020202A3 +:102D10000202020202020202020202020202020293 +:102D20000202020202020202020202020202020283 +:102D30000202020202020202020202020202020273 +:102D40000202020202020202020202020202020263 +:102D50000202020202020202020202020202020253 +:102D60000202020202020202020202020202020144 +:102D70000201020202020202020202020202020234 +:102D80000202020202020202020202020202020223 +:102D90000202020202020202020202020202020213 +:102DA0000201020202020202020202020202020204 +:102DB00002020202020202020202020202020202F3 +:102DC00002020202020202000202020202020202E5 +:102DD00002020200020201020202020202020202D6 +:102DE00002020202020200020202020202020202C5 +:102DF00002020202020202020202020202020202B3 +:102E000002020202020202020202020202020202A2 +:102E10000202020202020202020202020202020292 +:102E20000202020202020202020202020202020282 +:102E30000202020202020202020202020202020272 +:102E40000202020202020202020202020202020262 +:102E50000202020202020202020202020202020252 +:102E60000202020202020202020202020202020242 +:102E70000202020202020202020202020202020232 +:102E80000202020202020202020202020202020222 +:102E90000202020202020202020202020202020212 +:102EA0000201020202020202020202020202020203 +:102EB00002020202020202020202020202020202F2 +:102EC00002020202020202000202020202020202E4 +:102ED00002020200020201010202020202020201D7 +:102EE00002010202010101020202020202020202C6 +:102EF00002020202020202020202020202020202B2 +:102F000002020202020202020202020202020202A1 +:102F10000202020202020202020202020202020291 +:102F20000202020202020202020202020202020281 +:102F30000202020202020202020202020202020271 +:102F40000202020202020202020202020202020261 +:102F50000202020202020202020202020202020251 +:102F60000202020202020202020202020202020241 +:102F70000202020202020202020202020202020231 +:102F80000202020202020202020202020202020221 +:102F90000202020202020202020202020202020211 +:102FA0000202020202020202020202020202020201 +:102FB00002020202020202020202020202020202F1 +:102FC00002020202020202020202020202020202E1 +:102FD00002020202020200010101010101010101DC +:102FE00001010101010101020202020202020202C8 +:102FF00002020202020202020202020202020202B1 +:1030000002020202020202020202020202020202A0 +:103010000202020202020202020202020202020290 +:103020000202020202020202020202020202020280 +:103030000202020202020202020202020202020270 +:103040000202020202020202020202020202020260 +:103050000202020202020202020202020202020250 +:103060000202020202020202020202020202020240 +:103070000202020202020202020202020202020230 +:103080000202020202020202020202020202020220 +:103090000202020202020202020202020202020210 +:1030A0000202020202020202020202020202020200 +:1030B00002020202020202020202020202020202F0 +:1030C00002020202020202020202020202020202E0 +:1030D00002020202020200010101010101010101DB +:1030E00001010101010101020202020202020202C7 +:1030F00002020202020202020202020202020202B0 +:10310000020202020202020202020202020202029F +:10311000020202020202020202020202020202028F +:10312000020202020202020202020202020202027F +:10313000020202020202020202020202020202026F +:10314000020202020202020202020202020202025F +:10315000020202020202020202020202020202024F +:10316000020202020202020202020202020202023F +:10317000020202020202020202020202020202022F +:10318000020202020202020202020202020202021F +:10319000020202020202020202020202020202020F +:1031A00002020202020202020202020202020202FF +:1031B00002020202020202020202020202020202EF +:1031C00002020202020202020202020202020202DF +:1031D00002020202020202010101010101010101D8 +:1031E00001010101010101010202020202020202C7 +:1031F00002020202020202020202020202020202AF +:10320000020202020202020202020202020202029E +:10321000020202020202020202020202020202028E +:10322000020202020202020202020202020202027E +:10323000020202020202020202020202020202026E +:10324000020202020202020202020202020202025E +:10325000020202020202020202020202020202024E +:10326000020202020202020202020202020202023E +:10327000020202020202020202020202020202022E +:10328000020202020202020202020202020202021E +:10329000020202020202020202020202020202020E +:1032A00002020202020202020202020202020202FE +:1032B00002020202020202020202020202020202EE +:1032C00002020202020202020202020202020202DE +:1032D00002020202020202010101010101010101D7 +:1032E00001010101010101020101010101010101CD +:1032F00001010101010101020202020202020202B5 +:10330000020202020202020202020202020202029D +:10331000020202020202020202020202020202028D +:10332000020202020202020202020202020202027D +:10333000020202020202020202020202020202026D +:10334000020202020202020202020202020202025D +:10335000020202020202020202020202020202024D +:10336000020202020202020202020202020202023D +:10337000020202020202020202020202020202022D +:10338000020202020202020202020202020202021D +:10339000020202020202020202020202020202020D +:1033A00002020202020202020202020202020202FD +:1033B00002020202020202020202020202020202ED +:1033C00002020202020202020202020202020202DD +:1033D00002020202020202010101010101010101D6 +:1033E00001010101010101010202020202020202C5 +:1033F00002020202020202010202020202020202AE +:10340000020202020202020202020202020202029C +:10341000020202020202020202020202020202028C +:10342000020202020202020202020202020202027C +:10343000020202020202020202020202020202026C +:10344000020202020202020202020202020202025C +:10345000020202020202020202020202020202024C +:10346000020202020202020202020202020202023C +:10347000020202020202020202020202020202022C +:10348000020202020202020202020202020202021C +:10349000020202020202020202020202020202020C +:1034A00002020202020202020202020202020202FC +:1034B00002020202020202020202020202020202EC +:1034C00002020202020202020202020202020202DC +:1034D00002020202020202010101010101010101D5 +:1034E00001010101010101010101010101010101CC +:1034F00001010101010101020101010101010101BB +:1035000001010101010101020202020202020202A2 +:103510000202020202020201010101010101010194 +:103520000101010101010100000000000000000094 +:10353000000000000000000000000000000000008B +:103540000000000000000002020202020202020269 +:10355000020202020202020202020202020202024B +:10356000020202020202020202020202020202023B +:10357000020202020202020202020202020202022B +:10358000020202020202020202020202020202021B +:10359000020202020202020202020202020202020B +:1035A00002020202020202020202020202020202FB +:1035B00002020202020202020202020202020202EB +:1035C00002020202020202020202020202020202DB +:1035D00002020202020202010101010101010101D4 +:1035E00001010101010101010101010101010101CB +:1035F00001010101010101010202020202020202B3 +:10360000020202020202020202020202020202029A +:10361000020202020202020202020202020202028A +:10362000020202020202020000000000000000008C +:10363000000000000000000000000000000000008A +:103640000000000000000001010101010101010171 +:103650000101010101010100000000000000000063 +:103660000000000000000001010101010101010151 +:103670000101010101010102020202020202020231 +:10368000020202020202020202020202020202021A +:10369000020202020202020202020202020202020A +:1036A00002020202020202020202020202020202FA +:1036B00002020202020202020202020202020202EA +:1036C00002020202020202020202020202020202DA +:1036D00002020202020202010101010101010101D3 +:1036E00001010101010101010101010101010101CA +:1036F00001010101010101010101010101010101BA +:1037000001010101010101000000000000000000B2 +:1037100000000000000000010101010101010101A0 +:103720000101010101010100000000000000000092 +:103730000000000000000000000000000000000089 +:103740000000000000000002020202020202020267 +:10375000020202020202020000000000000000005B +:103760000000000000000002020202020202020247 +:103770000202020202020202020202020202020229 +:103780000202020202020202020202020202020219 +:103790000202020202020202020202020202020209 +:1037A00002020202020202020202020202020202F9 +:1037B00002020202020202020202020202020202E9 +:1037C00002020202020202020202020202020202D9 +:1037D00002020202020202010101010101010101D2 +:1037E00001010101010101010101010101010101C9 +:1037F00001010101010101010101010101010101B9 +:1038000001010101010101010101010101010101A8 +:103810000101010101010101010101010101010198 +:103820000101010101010101010101010101010188 +:103830000101010101010100000000000000000081 +:103840000000000000000000000000000000000078 +:103850000000000000000000000000000000000068 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000000000000048 +:103880000000000000000002020202020202020226 +:103890000202020202020202020202020202020208 +:1038A00002020202020202020202020202020202F8 +:1038B00002020202020202000000000000000000FA +:1038C00000000000000000020202020202020202E6 +:1038D00002020202020202010101010101010101D1 +:1038E00001010101010101010101010101010101C8 +:1038F00001010101010101010101010101010101B8 +:1039000001010101010101010101010101010101A7 +:103910000101010101010101010101010101010197 +:103920000101010101010101010101010101010187 +:103930000101010101010101010101010101010177 +:103940000101010101010100000000000000000070 +:103950000000000000000000000000000000000067 +:103960000000000000000000000000000000000057 +:103970000000000000000000000000000000000047 +:103980000000000000000002020202020202020225 +:103990000202020202020201010101010101010110 +:1039A00001010101010101020202020202020202FE +:1039B00002020202020202000000000000000000F9 +:1039C00000000000000000020202020202020202E5 +:1039D00002020202020202010101010101010101D0 +:1039E00001010101010101010101010101010101C7 +:1039F00001010101010101010101010101010101B7 +:103A000001010101010101010101010101010101A6 +:103A10000101010101010101010101010101010196 +:103A20000101010101010101010101010101010186 +:103A30000101010101010101010101010101010176 +:103A40000101010101010101010101010101010166 +:103A50000101010101010101010101010101010156 +:103A6000010101010101010000000000000000004F +:103A70000000000000000000000000000000000046 +:103A80000000000000000002020202020202020224 +:103A90000202020202020202020202020202020206 +:103AA0000202020202020200000000000000000008 +:103AB00000000000000000010101010101010101FD +:103AC00001010101010101020202020202020202DD +:103AD00002020202020202010101010101010101CF +:103AE00001010101010101010101010101010101C6 +:103AF00001010101010101010101010101010101B6 +:103B000001010101010101010101010101010101A5 +:103B10000101010101010101010101010101010195 +:103B20000101010101010101010101010101010185 +:103B30000101010101010101010101010101010175 +:103B40000101010101010101010101010101010165 +:103B50000101010101010101010101010101010155 +:103B60000101010101010101010101010101010145 +:103B70000101010101010101010101010101010135 +:103B80000101010101010101010101010101010125 +:103B9000010101010101010000000000000000001E +:103BA0000000000000000000000000000000000015 +:103BB00000000000000000010101010101010101FC +:103BC00001010101010101020202020202020202DC +:103BD00002020202020202010101010101010101CE +:103BE00001010101010101010101010101010101C5 +:103BF00001010101010101010101010101010101B5 +:103C000001010101010101010101010101010101A4 +:103C10000101010101010101010101010101010194 +:103C20000101010101010101010101010101010184 +:103C30000101010101010101010101010101010174 +:103C40000101010101010101010101010101010164 +:103C50000101010101010101010101010101010154 +:103C60000101010101010101010101010101010144 +:103C70000101010101010101010101010101010134 +:103C80000101010101010101010101010101010124 +:103C90000101010101010101010101010101010114 +:103CA0000101010101010101010101010101010104 +:103CB00001010101010101010101010101010101F4 +:103CC00001010101010101020202020202020202DB +:103CD00002020202020202010101010101010101CD +:103CE00001010101010101010101010101010101C4 +:103CF00001010101010101010101010101010101B4 +:103D000001010101010101010101010101010101A3 +:103D10000101010101010101010101010101010193 +:103D20000101010101010101010101010101010183 +:103D30000101010101010101010101010101010173 +:103D40000101010101010101010101010101010163 +:103D50000101010101010101010101010101010153 +:103D60000101010101010101010101010101010143 +:103D70000101010101010101010101010101010133 +:103D80000101010101010101010101010101010123 +:103D90000101010101010101010101010101010113 +:103DA0000101010101010101010101010101010103 +:103DB00001010101010101010101010101010101F3 +:103DC00001010101010101020202020202020202DA +:103DD00002020202020202000000000000000000D5 +:103DE00000000000000000000000000000000000D3 +:103DF00000000000000000000000000000000000C3 +:103E000000000000000000000000000000000000B2 +:103E10000000000000000002020202020202020290 +:103E20000202020202020202020202020202020272 +:103E30000202020202020202020202020202020262 +:103E40000202020202020202020202020202020252 +:103E50000202020202020202020202020202020242 +:103E60000202020202020202020202020202020232 +:103E70000202020202020202020202020202020222 +:103E80000202020202020202020202020202020212 +:103E90000202020202020202020202020202020202 +:103EA00002020202020202020202020202020202F2 +:103EB00002020202020202020202020202020202E2 +:103EC00002020202020202000000000000000000E4 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF00000000000000000000000000000000000C2 +:103F000000000000000000000000000000000000B1 +:103F100000000000000000000000000000000000A1 +:103F20000000000000000000000000000000000091 +:103F30000000000000000000000000000000000081 +:103F40000000000000000000000000000000000071 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000000000031 +:103F90000000000000000000000000000000000021 +:103FA0000000000000000000000000000000000011 +:103FB00000000000000000020202020202020202EF +:103FC00002020202020202000000000000000000E3 +:103FD00000000000000000000000000000000000E1 +:103FE00000000000000000000000000000000000D1 +:103FF00000000000000000000000000000000000C1 +:1040000000000000000000000000000000000000B0 +:1040100000000000000000000000000000000000A0 +:104020000000000000000000000000000000000090 +:104030000000000000000000000000000000000080 +:104040000000000000000000000000000000000070 +:104050000000000000000000000000000000000060 +:104060000000000000000000000000000000000050 +:104070000000000000000000000000000000000040 +:104080000000000000000000000000000000000030 +:104090000000000000000000000000000000000020 +:1040A0000000000000000000000000000000000010 +:1040B00000000000000000020202020202020202EE +:1040C00002020202020202000000000000000000E2 +:1040D00000000000000000000000000000000000E0 +:1040E00000000000000000000000000000000000D0 +:1040F00000000000000000000000000000000000C0 +:1041000000000000000000000000000000000000AF +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:10414000000000000000000000000000000000006F +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F +:10417000000000000000000000000000000000003F +:10418000000000000000000000000000000000002F +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000310000000000000000AE +:1041E00000000000000000000100000000000000CE +:1041F00000000000000000000000000000010000BE +:1042000000000000000000000000000000010000AD +:10421000000000000000000000000100000001009C +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000100007D +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000000000005E +:10426000000000000000000000000000000100004D +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000100002D +:10429000000000000000000000000000000000001E +:1042A000000000000000000000000000000100000D +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D00000000000000000000000000000000000DE +:1042E00000000000000000010100000000000000CC +:1042F00000000000000000000000000000010000BD +:1043000000000000000000000000010000010100AA +:10431000000000000000000000000100000001009B +:10432000000000000000000000000000000100008C +:10433000000000000000000000000000000100007C +:10434000000000000000000000000000000100006C +:10435000000000000000000000000000000100005C +:10436000000000000000000000000000000100004C +:10437000000000000000000000000000000100003C +:10438000000000000000000000000000000100002C +:10439000000000000000000000000000000000001D +:1043A000000000000000000000000000000100000C +:1043B00000000000000000000000000000000000FD +:1043C00000000000000000000000000000000000ED +:1043D00000000000000000000000000000000000DD +:1043E00000000000000000010101000000000000CA +:1043F00000000000000000000000000000010000BC +:1044000000000000000000000000010000010100A9 +:104410000000000000000000000001010100010098 +:104420000000000000000000000001000001010089 +:10443000000000000000000000000000000100007B +:10444000000000000000000000000000000100006B +:10445000000000000000000000000000000100005B +:10446000000000000000000000000000000100004B +:10447000000000000000000000000000000100003B +:104480000000000000000000000001000001010029 +:10449000000000000000000000000000000000001C +:1044A000000000000000000000000000000100000B +:1044B00000000000000000000000000000000000FC +:1044C00000000000000000000000000000000000EC +:1044D00000000000000000000000000000000000DC +:1044E00000000000000000010101010100000000C7 +:1044F00000000000000000000000000000010000BB +:1045000000000000000000000000010101010100A6 +:104510000000000001010000010001010100010094 +:104520000000000000000000000001000001010088 +:104530000000000000000000000001000001010078 +:10454000000000000000000000000000000100006A +:104550000000000000000000000001000001010058 +:10456000000000000000000000000000000100004A +:104570000000000000000000000000000001010039 +:104580000000000000000000000001000001010028 +:10459000000000000000000000000000000000001B +:1045A000000000000000000000000000000100000A +:1045B00000000000000000000000000000000000FB +:1045C00000000000000000000000000000000000EB +:1045D00000000000000000000000000000000000DB +:1045E00000000000010100010101010100000000C4 +:1045F00000000000000000000000010000010100B8 +:1046000000000000000000000100010101010100A4 +:104610000000000001010100010001010100010092 +:104620000000000000000000000001010101010085 +:104630000000000000000000000001000001010077 +:104640000000000000000000000000000001000069 +:104650000000000000000000000001000001010057 +:104660000000000000000000000001000001010047 +:104670000000000000000000000000000001010038 +:104680000000000000000000000001010101010025 +:10469000000000000000000000000000000000001A +:1046A0000000000000000000000000000001000009 +:1046B00000000000000000000000000000010000F9 +:1046C00000000000000000000000000000000000EA +:1046D00000000000000000000000000000000000DA +:1046E00000000000010101010101010100000000C2 +:1046F00000000000000000000000010000010100B7 +:1047000000000000000000000100010101010100A3 +:10471000000000010101010001010101010001008F +:104720000000000001000000000001010101010083 +:104730000000000000000000000001010101010074 +:104740000000000000000000000000000001000068 +:104750000000000000000000000001010101010054 +:104760000000000000000000000001000001010046 +:104770000000000000000000000001010101010034 +:104780000000000000000000010101010101010022 +:104790000000000000000000000000000000000019 +:1047A0000000000000000000000000000001000008 +:1047B00000000000000000000000000000010000F8 +:1047C00000000000000000000000000000000000E9 +:1047D00000000000000000000000000000000000D9 +:1047E00000000000010101010101010100000000C1 +:1047F00000000000000000000000010100010100B5 +:10480000000100000100000001010101010101009F +:10481000000000010101010101010101010001008D +:104820000000000001000000000001010101010082 +:104830000000000001000000000001010101010072 +:104840000000000000000000000000000001000067 +:104850000000000001010000000001010101010051 +:104860000000000000000000000001010101010043 +:104870000000000000000000010001010101010032 +:10488000000000000000010101010101010101001F +:104890000000000000000000000000000000000018 +:1048A0000000000000000000000001000001010005 +:1048B00000000000000000000000000000010000F7 +:1048C00000000000000000000000000000000000E8 +:1048D00000000000000000000000000000000000D8 +:1048E00000000000010101010101010100000000C0 +:1048F00000000000000000000000010100010100B4 +:10490000000100000100010001010101010101009D +:10491000000101010101010101010101010001008A +:10492000000100010101000001010101010101007C +:104930000000000001000000000001010101010071 +:104940000000000000000000000001000001010064 +:104950000000000001010000000001010101010050 +:104960000000000001000000010001010101010040 +:10497000000000000000010101000101010101002F +:10498000000000000101010101010101010101001C +:104990000000000000000000000000000000000017 +:1049A0000000000000000000000001000001010004 +:1049B00000000000000000000000000000010000F6 +:1049C00000000000000000000000000000000000E7 +:1049D00000000000000000000000000000000000D7 +:1049E00000010101010101010101010100000000BC +:1049F00000000000000000000000010101010100B2 +:104A0000000101000101010001010101010101009A +:104A10000001010101010101010101010101010088 +:104A20000001000101010101010101010101010079 +:104A3000000100000101000001010101010101006C +:104A40000000000000000000000001000001010063 +:104A5000000100010101000001010101010101004B +:104A6000000000000100010001000101010101003E +:104A7000000000000101010101010101010101002B +:104A8000000000000101010101010101010101001B +:104A90000000000000000000000000000000000016 +:104AA0000000000000000000000001010101010001 +:104AB00000000000000000000000000000010100F4 +:104AC00000000000000000000000000000000000E6 +:104AD00000000000000000000000000000010000D5 +:104AE00000010101010101010101010101000000BA +:104AF00000000000000000000000010101010100B1 +:104B00000001010001010101010101010101010098 +:104B10000001010101010101010101010101010087 +:104B20000001010101010101010101010101010077 +:104B3000000100000101010001010101010101006A +:104B40000000000000000000000001010101010060 +:104B50000001000101010101010101010101010048 +:104B6000000000000101010001010101010101003B +:104B7000000000000101010101010101010101002A +:104B80000001010101010101010101010101010017 +:104B90000000000000000000000000000001000014 +:104BA00000000000000000000100010101010100FF +:104BB00000000000000000000000000000010100F3 +:104BC00000000000000000000000000000000000E5 +:104BD00000000000000000000000000000010000D4 +:104BE00000010101010101010101010101000000B9 +:104BF00000000000000000000000010101010100B0 +:104C00000001010101010101010101010101010096 +:104C10000101010101010101010101010101010085 +:104C20000101010101010101010101010101010075 +:104C30000001010101010100010101010101010067 +:104C4000000000000000000000000101010101005F +:104C50000001010101010101010101010101010046 +:104C60000000000001010101010101010101010039 +:104C70000001000101010101010101010101010027 +:104C80000001010101010101010101010101010016 +:104C90000000000000000000000000000001000013 +:104CA00000000000000001000100010101010100FD +:104CB00000000000000001000000010101010101ED +:104CC00000000000000000000000000000000000E4 +:104CD00000000000000000000000010101010000D0 +:104CE00001010101010101010101010101010000B6 +:104CF00000010000010000000101010101010100AB +:104D00000001010101010101010101010101010095 +:104D10000101010101010101010101010101010084 +:104D20000101010101010101010101010101010074 +:104D30000101010101010101010101010101010064 +:104D4000000000000000000000000101010101005E +:104D50000001010101010101010101010101010045 +:104D60000001010101010101010101010101010035 +:104D70000001000101010101010101010101010026 +:104D80000001010101010101010101010101010015 +:104D90000000000000000000000000000001000012 +:104DA00000010000010101000101010101010100F8 +:104DB00000000000000001000100010101010101EB +:104DC00000000000000000000000000000000000E3 +:104DD00000000000000000000101010101010000CD +:104DE00001010101010101010101010101010001B4 +:104DF00000010000010000000101010101010100AA +:104E00000001010101010101010101010101010094 +:104E10000101010101010101010101010101010083 +:104E20000101010101010101010101010101010073 +:104E30000101010101010101010101010101010063 +:104E4000000000000100000001010101010101005A +:104E50000001010101010101010101010101010044 +:104E60000001010101010101010101010101010034 +:104E70000001010101010101010101010101010024 +:104E80000101010101010101010101010101010013 +:104E90000000000000000000000000000001000011 +:104EA00000010000010101010101010101010100F6 +:104EB00000000000000001000100010101010101EA +:104EC00000000000000000010000000000000000E1 +:104ED00000000000000001000101010101010000CB +:104EE00001010101010101010101010101010001B3 +:104EF00000010100010000000101010101010100A8 +:104F00000101010101010101010101010101010092 +:104F10000101010101010101010101010101010082 +:104F20000101010101010101010101010101010171 +:104F30000101010101010101010101010101010062 +:104F40000000000001000101010101010101010057 +:104F50000101010101010101010101010101010042 +:104F60000001010101010101010101010101010033 +:104F70000101010101010101010101010101010022 +:104F80000101010101010101010101010101010012 +:104F90000000000000000000000000000001000010 +:104FA00000010101010101010101010101010100F3 +:104FB00000010100010101000101010101010101E4 +:104FC00000000000000000010000000000000000E0 +:104FD00000000000010101000101010101010000C8 +:104FE00001010101010101020201010101010001B0 +:104FF00000010100010001000101010101010100A6 +:105000000101010101010101010101010101010190 +:105010000101010101010101010101010101010180 +:105020000101010101010101010101010101010170 +:105030000101010101010101010101010101010061 +:105040000001010001010101010101010101010053 +:105050000101010101010101010101010101010041 +:105060000101010101010101010101010101010031 +:105070000101010101010101010101010101010120 +:105080000101010101010101010101010101010011 +:10509000000000000000000000000000000100000F +:1050A00001010101010101010101010101010100F1 +:1050B00000010100010101010101010101010101E2 +:1050C00001000000000000010000000000010000DD +:1050D00000000000010101000101010101010101C5 +:1050E00001010101020201020202010101010001AC +:1050F00000010100010101000101010101010101A3 +:10510000010101010101010101010101010101018F +:10511000010101010101010101010101010101017F +:10512000010101010101010101010101010101016F +:105130000101010101010101010101010101010060 +:105140000001010001010101010101010101010151 +:105150000101010101010101010101010101010040 +:10516000010101010101010101010101010101012F +:10517000010101010101010101010101010101011F +:105180000101010101010101010101010101010010 +:10519000000000000000000000000000000100000E +:1051A00001010101010101010101010101010100F0 +:1051B00000010101010101010101010101010101E0 +:1051C00001000000000000010000000000010000DC +:1051D00001010101010101000101010101010102BF +:1051E00002020202020202020202010101010002A5 +:1051F00000010100010101010101010101010101A1 +:10520000010101010101010101010101010101018E +:10521000010101010101010101010101010101017E +:10522000010101010101010101010101010101016E +:10523000010101010101010101010101010101005F +:10524000000101010101010101010101010101014F +:10525000010101010101010101010101010101003F +:10526000010101010101010101010101010101012E +:10527000010101010101010101010101010101011E +:10528000010101010101010101010101010101000F +:10529000000000000000000000000000000100000D +:1052A00001010101010101010101010101010100EF +:1052B00000010101010101010101010101010102DE +:1052C00001000000000000010000000000010000DB +:1052D00001010101010101000101010101010102BE +:1052E00002020202020202020202020201010002A2 +:1052F000000101010101010101010101010101019F +:10530000010101010101010101010101010101018D +:10531000010101010101010101010101010101017D +:10532000010101010101010101010101010101026C +:10533000010101010101010101010101010101005E +:10534000010101010101010101010101010101014D +:10535000010101010101010101010101010101003E +:10536000010101010101010101010101010101012D +:10537000010101010101010101010101010101011D +:10538000010101010101010101010101010101000E +:10539000000000000000000000000000000101000B +:1053A00001010101010101010101010101010100EE +:1053B00000010101010101010101010101010102DD +:1053C00001010101000000010000000000010000D7 +:1053D00001010101010101000101010101010102BD +:1053E00002020202020202020202020201010002A1 +:1053F000010101010101010101010101010201019C +:10540000010201010101010101010201010101018A +:10541000010101010101010101010101010101017C +:10542000010101010101010101010101010101026B +:105430000202010102010101010102010101010059 +:10544000010101010101010101010101010101014C +:10545000010101010101010101010101010101013C +:10546000010101010101010101010101010101012C +:10547000010101010101010101010101010101011C +:10548000010101010101010101010101010101000D +:105490000001000000000000000000000001010108 +:1054A00001010101010101010101010101010101EC +:1054B00001010101010101010101010101010102DB +:1054C00001010101000000010000000000010100D5 +:1054D00001010101010101000101010101010102BC +:1054E00002020202020202020202020201010002A0 +:1054F0000101010101010101010102010102010299 +:105500000102020102010101020102020202020182 +:105510000101010202020101010102010101010276 +:105520000202010202010101010102010101010265 +:105530000202020202020101010102020202020051 +:10554000010101010101010101010101010101014B +:10555000010101010101010101010101010101013B +:10556000010101010101010101010101010101012B +:10557000010101010101010101010101010101011B +:10558000010101010101010101010101010101000C +:105590000101000000000000000000000001010106 +:1055A00001010101010101010101010101010101EB +:1055B00001010101010101010101010101010102DA +:1055C00001010101010100010000000000010100D2 +:1055D00001010101010101000101010101010102BB +:1055E000020202020202020202020202020100029E +:1055F0000102010101010101010102020102020295 +:10560000020202020202020102020202020202027B +:10561000020202020202020102010202020102026D +:10562000020202020202010101010202020202025E +:10563000020202020202020102020202020202004D +:105640000101010101010101010101010101010249 +:105650000102010202020101010102010102010134 +:105660000101010101010101010101010101010229 +:105670000101010101010101010101010102010119 +:10568000010101010101010101010101010101000B +:105690000101010001000000010000000001010102 +:1056A00001010101010101010101010101010101EA +:1056B00001010101010101010101010101010102D9 +:1056C00002010101010101010000010100010100CD +:1056D00001010101010101000101010101010102BA +:1056E000020202020202020202020202020100029D +:1056F0000102020102010101010102020202020291 +:105700000202020202020202020202020202020279 +:10571000020202020202020202020202020102026A +:105720000202020202020202020202020202020259 +:10573000020202020202020202020202020202014A +:105740000101010101010101010101010102010247 +:10575000020202020202010101010202020202012E +:105760000101010101010101010101010102010227 +:10577000020201020202020202010202020202020B +:105780000101010101010101010102010102010107 +:1057900001010100010001010100010100010101FD +:1057A00001010101010101010101010101020101E8 +:1057B00001010101010101010101010101010102D8 +:1057C00002010101010101010000010100010100CC +:1057D00001010101010101000101010101010102B9 +:1057E000020202020202020202020202020100029C +:1057F000020202010201010102020202020202028D +:105800000202020202020202020202020202020278 +:105810000202020202020202020202020201020269 +:105820000202020202020202020202020202020258 +:105830000202020202020202020202020202020149 +:105840000101010101010101010101010102010246 +:105850000202020202020202020202020202020129 +:105860000101010102010101010102010102010224 +:105870000202020202020202020202020202020208 +:1058800002020202020202020202020202020201F9 +:1058900001010101010101010101010100010101F9 +:1058A00001010101010101010101010101020101E7 +:1058B00001010101010101010101010101010102D7 +:1058C00002010101010101020000010101010100C9 +:1058D00000010101010101000101010101010102B9 +:1058E000020202020202020202020202020200029A +:1058F0000202020202020201020202020202020289 +:105900000202020202020202020202020202020277 +:105910000202020202020202020202020201020268 +:105920000202020202020202020202020202020257 +:105930000202020202020202020202020202020148 +:105940000101010101010101010102010102010244 +:105950000202020202020202020202020202020227 +:105960000202020202020201020102020202020219 +:105970000202020202020202020202020202020207 +:1059800002020202020202020202020202020202F7 +:1059900001010101010101010101010101010102F6 +:1059A00002020101010101010101020101020101E3 +:1059B00001010101010101010101010101010102D6 +:1059C00002020202010101020101010101010100C3 +:1059D00000010101010101000101010101010102B8 +:1059E0000202020202020202020202020202000299 +:1059F0000202020202020202020202020202020287 +:105A00000202020202020202020202020202020276 +:105A10000202020202020202020202020201020267 +:105A20000202020202020202020202020202020256 +:105A30000202020202020202020202020202020246 +:105A4000020202010201010101010202020202023C +:105A50000202020202020202020202020202020226 +:105A60000202020202020202020202020202020216 +:105A70000202020202020202020202020202020206 +:105A800002020202020202020202020202020202F6 +:105A900002010101010101010101010101020102F3 +:105AA00002020202020202010201020202020202D8 +:105AB00001010101010101010101010101020102D4 +:105AC00002020202010101020101010101010100C2 +:105AD00000010101010101010101010101010102B6 +:105AE0000202020202020202020202020202000298 +:105AF0000202020202020202020202020202020286 +:105B00000202020202020202020202020202020275 +:105B10000202020202020202020202020202020265 +:105B20000202020202020202020202020202020255 +:105B30000202020202020202020202020202020245 +:105B40000202020202020202020202020202020235 +:105B50000202020202020202020202020202020225 +:105B60000202020202020202020202020202020215 +:105B70000202020202020202020202020202020205 +:105B800002020202020202020202020202020202F5 +:105B900002020101010101010101010101020102F1 +:105BA00002020202020202020202020202020202D5 +:105BB00001020201010102010101010101020102D0 +:105BC00002020202020201020101010101020100BE +:105BD00000000000000000010000000000000102C1 +:105BE0000202020202020202020202020202000297 +:105BF0000202020202020202020202020202020285 +:105C00000202020202020202020202020202020274 +:105C10000202020202020202020202020202020264 +:105C20000202020202020202020202020202020254 +:105C30000202020202020202020202020202020244 +:105C40000202020202020202020202020202020234 +:105C50000202020202020202020202020202020224 +:105C60000202020202020202020202020202020214 +:105C70000202020202020202020202020202020204 +:105C800002020202020202020202020202020202F4 +:105C900002020201010101010101010101020102EF +:105CA00002020202020202020202020202020202D4 +:105CB00002020202020202010201020202020202C6 +:105CC00002020202020202020101010101020100BC +:105CD00002020202020202010202020202020102A6 +:105CE0000202020202020202020202020202000296 +:105CF0000202020202020202020202020202020284 +:105D00000202020202020202020202020202020273 +:105D10000202020202020202020202020202020263 +:105D20000202020202020202020202020202020253 +:105D30000202020202020202020202020202020243 +:105D40000202020202020202020202020202020233 +:105D50000202020202020202020202020202020223 +:105D60000202020202020202020202020202020213 +:105D70000202020202020202020202020202020203 +:105D800002020202020202020202020202020202F3 +:105D900002020202020101010101010101020102EC +:105DA00002020202020202020202020202020202D3 +:105DB00002020202020202020202020202020202C3 +:105DC00002020202020202020101020201020200B8 +:105DD00002020202020202010202020202020102A5 +:105DE0000202020202020202020202020202000295 +:105DF0000202020202020202020202020202020283 +:105E00000202020202020202020202020202020272 +:105E10000202020202020202020202020202020262 +:105E20000202020202020202020202020202020252 +:105E30000202020202020202020202020202020242 +:105E40000202020202020202020202020202020232 +:105E50000202020202020202020202020202020222 +:105E60000202020202020202020202020202020212 +:105E70000202020202020202020202020202020202 +:105E800002020202020202020202020202020202F2 +:105E900002020202020202020201010101020202E6 +:105EA00002020202020202020202020202020202D2 +:105EB00002020202020202020202020202020202C2 +:105EC00002020202020202020202020202020200B4 +:105ED00002020202020202010202020202020002A5 +:105EE0000202020202020202020202020202000294 +:105EF0000202020202020202020202020202020282 +:105F00000202020202020202020202020202020271 +:105F10000202020202020202020202020202020261 +:105F20000202020202020202020202020202020251 +:105F30000202020202020202020202020202020241 +:105F40000202020202020202020202020202020231 +:105F50000202020202020202020202020202020221 +:105F60000202020202020202020202020202020211 +:105F70000202020202020202020202020202020201 +:105F800002020202020202020202020202020202F1 +:105F900002020202020202020202020201020202E2 +:105FA00002020202020202020202020202020202D1 +:105FB00002020202020202020202020202020202C1 +:105FC00002020202020202020202020202020202B1 +:105FD00002020202020202010202020202020202A2 +:105FE0000202020202020202020202020202000293 +:105FF0000202020202020202020202020202020281 +:106000000202020202020202020202020202020270 +:106010000202020202020202020202020202020260 +:106020000202020202020202020202020202020250 +:106030000202020202020202020202020202020240 +:106040000202020202020202020202020202020230 +:106050000202020202020202020202020202020220 +:106060000202020202020202020202020202020210 +:106070000202020202020202020202020202020200 +:1060800002020202020202020202020202020202F0 +:1060900002020202020202020202020202020202E0 +:1060A00002020202020202020202020202020202D0 +:1060B00002020202020202020202020202020202C0 +:1060C00002020202020202020202020202020202B0 +:1060D00002020202020202010202020202020201A2 +:1060E000010101010101010101010202020201029B +:1060F0000202020202020202020202020202020280 +:10610000020202020202020202020202020202026F +:10611000020202020202020202020202020202025F +:10612000020202020202020202020202020202024F +:10613000020202020202020202020202020202023F +:10614000020202020202020202020202020202022F +:10615000020202020202020202020202020202021F +:10616000020202020202020202020202020202020F +:1061700002020202020202020202020202020202FF +:1061800002020202020202020202020202020202EF +:1061900002020202020202020202020202020202DF +:1061A00002020202020202020202020202020202CF +:1061B00002020202020202020202020202020202BF +:1061C00002020202020202020202020202020202AF +:1061D00002020202020202000202020202020201A2 +:1061E000010101010101010101010101010201029D +:1061F000020202020202020202020202020202027F +:10620000020202020202020202020202020202026E +:10621000020202020202020202020202020202025E +:10622000020202020202020202020202020202024E +:10623000020202020202020202020202020202023E +:10624000020202020202020202020202020202022E +:10625000020202020202020202020202020202021E +:10626000020202020202020202020202020202020E +:1062700002020202020202020202020202020202FE +:1062800002020202020202020202020202020202EE +:1062900002020202020202020202020202020202DE +:1062A00002020202020202020202020202020202CE +:1062B00002020202020202020202020202020202BE +:1062C00002020202020202020202020202020202AE +:1062D000020202020202020202020202020202019F +:1062E000010101010101010101010101010101029D +:1062F000020202020202020202020202020202027E +:10630000020202020202020202020202020202026D +:10631000020202020202020202020202020202025D +:10632000020202020202020202020202020202024D +:10633000020202020202020202020202020202023D +:10634000020202020202020202020202020202022D +:10635000020202020202020202020202020202021D +:10636000020202020202020202020202020202020D +:1063700002020202020202020202020202020202FD +:1063800002020202020202020202020202020202ED +:1063900002020202020202020202020202020202DD +:1063A00002020202020202020202020202020202CD +:1063B00002020202020202020202020202020202BD +:1063C00002020202020202020202020202020202AD +:1063D000020202020202020202020202020202019E +:1063E000010101010101010101010101010101009E +:1063F000020202020202020202020202020202027D +:10640000020202020202020202020202020202026C +:10641000020202020202020202020202020202025C +:10642000020202020202020202020202020202024C +:10643000020202020202020202020202020202023C +:10644000020202020202020202020202020202022C +:10645000020202020202020202020202020202021C +:10646000020202020202020202020202020202020C +:1064700002020202020202020202020202020202FC +:1064800002020202020202020202020202020202EC +:1064900002020202020202020202020202020202DC +:1064A00002020202020202020202020202020202CC +:1064B00002020202020202020202020202020202BC +:1064C00002020202020202020202020202020202AC +:1064D000020202020202020202020202020202019D +:1064E000010101010101010101010101010101019C +:1064F000000000000000000000000000000000029A +:10650000020202020202020202020202020202026B +:10651000020202020202020202020202020202025B +:10652000020202020202020202020202020202004D +:106530000000000000000000000000000002000257 +:10654000020202020202020202020202020202022B +:10655000020202020202020202020202020202021B +:10656000020202020202020202020202020202020B +:1065700002020202020202020202020202020202FB +:1065800002020202020202020202020202020202EB +:1065900002020202020202020202020202020202DB +:1065A00002020202020202020202020202020202CB +:1065B00002020202020202020202020202020202BB +:1065C00002020202020202020202020202020202AB +:1065D000020202020202020202020202020202019C +:1065E000010101010101010101010101010101019B +:1065F000010101010101010101010101010101028A +:10660000020202020202020202020202020202026A +:10661000020202020202020202020202020202025A +:10662000020202020202020202020202020202004C +:106630000000000000000000000000000002000256 +:10664000020202020202020202020202020202022A +:10665000020202020202020202020202020202021A +:10666000020202020202020202020202020202020A +:1066700002020202020202020202020202020202FA +:1066800002020202020202020202020202020202EA +:1066900002020202020202020202020202020202DA +:1066A00002020202020202020202020202020202CA +:1066B00002020202020202020202020202020202BA +:1066C00002020202020202020202020202020202AA +:1066D000020202020202020202020202020202019B +:1066E000010101010101010101010101010101019A +:1066F000010101010101010101010101010101008B +:106700000000000000000000000000000002000285 +:10671000020202020202020202020202020202005B +:106720000000000000000000000000000002000067 +:106730000000000000000000000000000002000255 +:106740000202020202020202020202020202020229 +:106750000202020202020202020202020202020219 +:106760000202020202020202020202020202020209 +:1067700002020202020202020202020202020202F9 +:1067800002020202020202020202020202020202E9 +:1067900002020202020202020202020202020202D9 +:1067A00002020202020202020202020202020202C9 +:1067B00002020202020202020202020202020201BA +:1067C00001010101010101010101010101010102B8 +:1067D000020202020202020202020202020202019A +:1067E0000101010101010101010101010101010199 +:1067F0000101010101010101010101010101010189 +:106800000101010101010101010101010101010277 +:106810000202020202020202020202020202020159 +:106820000101010101010101010101010101010059 +:106830000000000000000000000000000000000256 +:106840000202020202020202020202020202020129 +:106850000101010101010101010101010101010227 +:106860000202020202020202020202020202020109 +:106870000101010101010101010101010101010207 +:1068800002020202020202020202020202020201E9 +:1068900001010101010101010101010101010102E7 +:1068A00002020202020202020202020202020202C8 +:1068B00002020202020202020202020202020202B8 +:1068C00002020202020202020202020202020202A8 +:1068D0000202020202020202020202020202020199 +:1068E0000101010101010101010101010101010198 +:1068F0000101010101010101010101010101010188 +:106900000101010101010101010101010101010177 +:106910000101010101010101010101010102010166 +:106920000101010101010101010101010101010157 +:106930000101010101010101010101010101010246 +:106940000202020202020202020202020202020227 +:106950000202020202020202020202020202020217 +:106960000202020202020202020202020202020207 +:1069700002020202020202020202020202020202F7 +:1069800002020202020202020202020202020202E7 +:1069900002020202020202020202020202020202D7 +:1069A00002020202020202020202020202020202C7 +:1069B00002020202020202020202020202020200B9 +:1069C00000000000000000000000000000000002C5 +:1069D0000202020202020202020202020202020198 +:1069E0000101010101010101010101010101010197 +:1069F0000101010101010101010101010101010187 +:106A00000101010101010101010101010101010176 +:106A10000101010101010101010101010101010166 +:106A20000101010101010101010101010101010156 +:106A30000101010101010101010101010101010146 +:106A40000101010101010101010101010101010037 +:106A50000000000000000000000000000000000234 +:106A60000202020202020202020202020202020008 +:106A70000000000000000000000000000000000214 +:106A800002020202020202020202020202020200E8 +:106A900000000000000000000000000000000002F4 +:106AA00002020202020202020202020202020202C6 +:106AB00002020202020202020202020202020200B8 +:106AC00000000000000000000000000000000002C4 +:106AD0000202020202020202020202020202020197 +:106AE0000101010101010101010101010101010196 +:106AF0000101010101010101010101010101010186 +:106B00000101010101010101010101010101010175 +:106B10000101010101010101010101010101010165 +:106B20000101010101010101010101010101010155 +:106B30000101010101010101010101010101010145 +:106B40000101010101010101010101010101010135 +:106B50000101010101010101010101010101010125 +:106B60000101010101010101010101010101010016 +:106B70000000000000000000000000000000000015 +:106B80000000000000000000000000000000000005 +:106B900000000000000000000000000000000001F4 +:106BA00001010101010101010101010101010102D4 +:106BB00002020202020202020202020202020201B6 +:106BC00001010101010101010101010101010102B4 +:106BD0000202020202020202020202020202020196 +:106BE0000101010101010101010101010101010195 +:106BF0000101010101010101010101010101010185 +:106C00000101010101010101010101010101010174 +:106C10000101010101010101010101010101010164 +:106C20000101010101010101010101010101010154 +:106C30000101010101010101010101010101010144 +:106C40000101010101010101010101010101010134 +:106C50000101010101010101010101010101010124 +:106C60000101010101010101010101010101010114 +:106C70000101010101010101010101010101010104 +:106C800001010101010101010101010101010100F5 +:106C900000000000000000000000000000000002F2 +:106CA00002020202020202020202020202020202C4 +:106CB00002020202020202020202020202020201B5 +:106CC00001010101010101010101010101010102B3 +:106CD0000202020202020202020202020202020195 +:106CE0000101010101010101010101010101010194 +:106CF0000101010101010101010101010101010184 +:106D00000101010101010101010101010101010173 +:106D10000101010101010101010101010101010163 +:106D20000101010101010101010101010101010153 +:106D30000101010101010101010101010101010143 +:106D40000101010101010101010101010101010133 +:106D50000101010101010101010101010101010123 +:106D60000101010101010101010101010101010113 +:106D70000101010101010101010101010101010103 +:106D800001010101010101010101010101010101F3 +:106D900001010101010101010101010101010101E3 +:106DA00001010101010101010101010101010101D3 +:106DB00001010101010101010101010101010101C3 +:106DC00001010101010101010101010101010100B4 +:106DD00000000000000000000000000000000001B2 +:106DE0000101010101010101010101010101010193 +:106DF0000101010101010101010101010101010183 +:106E00000101010101010101010101010101010172 +:106E10000101010101010101010101010101010162 +:106E20000101010101010101010101010101010152 +:106E30000101010101010101010101010101010142 +:106E40000101010101010101010101010101010132 +:106E50000101010101010101010101010101010122 +:106E60000101010101010101010101010101010112 +:106E70000101010101010101010101010101010102 +:106E800001010101010101010101010101010101F2 +:106E900001010101010101010101010101010101E2 +:106EA00001010101010101010101010101010101D2 +:106EB00001010101010101010101010101010101C2 +:106EC00001010101010101010101010101010100B3 +:106ED00000000000000000000000000000000000B2 +:106EE00000000000000000000000000000000000A2 +:106EF0000000000000000000000000000000000092 +:106F00000000000000000000000000000000000081 +:106F1000000000000000000000000000000000026F +:106F20000202020202020202020202020202020241 +:106F30000202020202020202020202020202020231 +:106F40000202020202020202020202020202020221 +:106F50000202020202020202020202020202020211 +:106F60000202020202020202020202020202020201 +:106F700002020202020202020202020202020202F1 +:106F800002020202020202020202020202020202E1 +:106F900002020202020202020202020202020202D1 +:106FA00002020202020202020202020202020202C1 +:106FB00002020202020202020202020202020202B1 +:106FC00002020202020202020202020202020200A3 +:106FD00000000000000000000000000000000000B1 +:106FE00000000000000000000000000000000000A1 +:106FF0000000000000000000000000000000000091 +:107000000000000000000000000000000000000080 +:107010000000000000000000000000000000000070 +:107020000000000000000000000000000000000060 +:107030000000000000000000000000000000000050 +:107040000000000000000000000000000000000040 +:107050000000000000000000000000000000000030 +:107060000000000000000000000000000000000020 +:107070000000000000000000000000000000000010 +:107080000000000000000000000000000000000000 +:1070900000000000000000000000000000000000F0 +:1070A00000000000000000000000000000000000E0 +:1070B00000000000000000000000000000000002CE +:1070C00002020202020202020202020202020200A2 +:1070D00000000000000000000000000000000000B0 +:1070E00000000000000000000000000000000000A0 +:1070F0000000000000000000000000000000000090 +:10710000000000000000000000000000000000007F +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000003F +:10715000000000000000000000000000000000002F +:10716000000000000000000000000000000000001F +:10717000000000000000000000000000000000000F +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000000EF +:1071A00000000000000000000000000000000000DF +:1071B00000000000000000000000000000000002CD +:1071C00002020202020202020202020202020200A1 +:1071D00000000000000000000000000000000000AF +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000000000000000008F +:10720000000000000000000000000000000000007E +:10721000000000000000000000000000000000006E +:10722000000000000000000000000000000000005E +:10723000000000000000000000000000000000004E +:10724000000000000000000000000000000000003E +:10725000000000000000000000000000000000002E +:10726000000000000000000000000000000000001E +:10727000000000000000000000000000000000000E +:1072800000000000000000000000000000000000FE +:1072900000000000000000000000000000000000EE +:1072A00000000000000000000000000000000000DE +:1072B00000000000000000000000000000000000CE +:1072C00000000000000000000000000000000000BE +:1072D000000000000000000000000000000000317D +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:10730000000000000000000000000000000000007D +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:10733000000000000000000000000000000000004D +:10734000000000000000000000000000000000003D +:10735000000000000000000000000000000000002D +:10736000000000000000000000000000000000001D +:10737000000000000000000000000000000000000D +:1073800000000000000000000000000000000000FD +:1073900000000000000001000000000000000000EC +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000000000000000000CD +:1073C00000000000000000000000000000000000BD +:1073D00000000000000000000000000000000000AD +:1073E000000000000000000000000000000000009D +:1073F000000000000000000000000000000000008D +:10740000000000000001000000000000000000007B +:10741000000000000001000000000000000000006B +:10742000000000000000010000000000000000005B +:10743000000000000000000000000000000000004C +:10744000000000000000000000000000000000003C +:10745000000000000000000000000000000000002C +:10746000000000000000000000000000000000001C +:10747000000000000000000000000000000000000C +:1074800000000000000000000000000000000001FB +:1074900000000000000101000000000000000000EA +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000000000CC +:1074C00000000000000100000000000000000000BB +:1074D00000000000000001000000000000000000AB +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000008C +:107500000000000000010100000000000000000079 +:107510000000010000010100000000000000000068 +:107520000000000000010100000000000000000059 +:10753000000000000000000000000000000000004B +:10754000000000000000000000000000000000003B +:10755000000000000000000000000000000000002B +:10756000000000000000000000000000000000001B +:10757000000000000000000000000000000000000B +:1075800000000000000000000000000000000001FA +:1075900000000101010101000000000000000000E6 +:1075A00000000000000000000000000000000000DB +:1075B00000000000000000000000000000000000CB +:1075C00000000000000101000000000000000000B9 +:1075D00000000000000001000000000000000000AA +:1075E000000000000000000000000000000000009B +:1075F000000000000000000000000000000000008B +:107600000000000000010100000000000000000078 +:107610000000010000010100000000000000000067 +:107620000000010100010100000000000000000056 +:10763000000000000000000000000000000000004A +:10764000000000000000000000000000000000003A +:10765000000000000000000000000000000000002A +:10766000000000000000000000000000000000001A +:10767000000000000000000000000000000000000A +:1076800000000000000000000000000000000001F9 +:1076900001000101010101000000000000000000E4 +:1076A00000000000000000000000000000000000DA +:1076B00000000000000000000000000000000000CA +:1076C00000000000000101000000000000000000B8 +:1076D00000000000000001000000000000000000A9 +:1076E0000000000000000000000000000000000199 +:1076F0000100000000000000000000000000000089 +:107700000000010100010100000000000000000075 +:107710000000010101010100000000000000000163 +:107720000100010100010100000000000000000054 +:107730000000000000000000000000000000000049 +:107740000000000000010000000000000000000038 +:107750000000000000000100000000000000000028 +:107760000000000000000000000000000000000019 +:107770000000000000000000000000000000000009 +:1077800000000000000000000000000000010001F7 +:1077900001000101010101000000000000000000E3 +:1077A00000000000000000000000000000000000D9 +:1077B00000000000000000000000000000000000C9 +:1077C00000000101000101000000000000000000B5 +:1077D00000000000000101000000000000000000A7 +:1077E0000000000000000000000000000001000197 +:1077F0000100000000000000000000000000000187 +:107800000100010100010100000000000000000172 +:107810000100010101010100000000000000010160 +:107820000100010101010100000000000000000052 +:107830000000000000010000000000000000000047 +:107840000000000000010100000000000000000036 +:107850000000000000010100000000000000000026 +:107860000000000000000000000000000000000018 +:107870000000000000000000000000000000000008 +:1078800000000000000000000000000001010001F5 +:1078900001010101010101000000000000000000E1 +:1078A00000000000000000000000000000000000D8 +:1078B00000000000000000000000000000000001C7 +:1078C00001000101000101000000000000000000B3 +:1078D00000000101000101000000000000000000A4 +:1078E0000000000000000000000000000001000196 +:1078F0000100000000000000000000010000000185 +:107900000100010101010100000000000000000170 +:10791000010001010101010000000000010001015E +:107920000101010101010100000000000000000050 +:107930000000000000010100000000000000000045 +:107940000000000000010100000000000000000035 +:107950000000010101010100000000000000000022 +:107960000000000000010000000000000000000016 +:107970000000000000000000000000000000000007 +:1079800000000000000000000000000101010101F2 +:1079900001010101010101000000000000000000E0 +:1079A00000000000000000000000000000000000D7 +:1079B00000000000000000000000000000000101C5 +:1079C00001000101010101000000000000000000B1 +:1079D00000000101000101000000000000000000A3 +:1079E0000000000000000000000000000001010194 +:1079F0000100000001000000000000010000000183 +:107A0000010101010101010000000000010000016D +:107A1000010101010101010000000001010101015A +:107A2000010101010101010000000000000000004F +:107A30000000000000010100000000000000000044 +:107A40000000010000010100000000000000000132 +:107A50000100010101010100000000000000000020 +:107A60000000000000010100000000000000000014 +:107A70000000000000000000000000000000000006 +:107A800000000000000000000000000101010101F1 +:107A900001010101010101000000000000000000DF +:107AA00000000000000000000000000000000000D6 +:107AB00000000000000000000000000001000101C3 +:107AC00001010101010101000000000100000000AE +:107AD00000000101010101000000000000000000A1 +:107AE0000000000000000000000000000101010192 +:107AF0000100000001000000000000010001010180 +:107B00000101010101010100000000010101010169 +:107B10000101010101010100000000010101010159 +:107B2000010101010101010000000000000000004E +:107B30000000000000010100000000000000000043 +:107B40000000010000010100000000000000000131 +:107B5000010001010101010000000000000000001F +:107B60000000000000010100000000000000000013 +:107B70000000000000000000000000000000000005 +:107B800000000000000000000000010101010101EF +:107B900001010101010101000000000000000000DE +:107BA00000000000000000000000000000000000D5 +:107BB00000000000000000000000000101010101C0 +:107BC00001010101010101000000000101000001AB +:107BD000010001010101010000000000000000009F +:107BE000000000000000000000000101010101018F +:107BF000010000000100000000000001010101017E +:107C00000101010101010100000000010101010168 +:107C10000101010101010101000000010101010157 +:107C2000010101010101010000000000000000004D +:107C30000000000000010100000000000000000042 +:107C4000000001010001010000000000010000012E +:107C5000010101010101010000000000000000001D +:107C60000000010100010100000000000000000010 +:107C70000000000000000000000000000000000004 +:107C800000000000000100000001010101010101EC +:107C900001010101010101000000000000000000DD +:107CA00000000000000100000000000000000000D3 +:107CB00000000000000000000000000101010101BF +:107CC00001010101010101010000000101010101A7 +:107CD000010001010101010000000000000000009E +:107CE000000000000000000000010101010101018D +:107CF000010100000100000000000001010101017C +:107D00000101010101010101000000010101010166 +:107D10000101010101010101000100010101010155 +:107D2000010101010101010000000000000000004C +:107D30000000000000010100000000000000000041 +:107D4000000001010001010000000001010101012A +:107D5000010101010101010000000000000000011B +:107D6000000001010001010000000000000000000F +:107D70000000000000000000000000000000000003 +:107D800000000000000101010001010101010101E9 +:107D900001010101010101000000000000000000DC +:107DA00000000000000101000000000000000000D1 +:107DB00000000000000100000000010101010101BC +:107DC00001010101010101010101000101010101A4 +:107DD000010101010101010000000000000000009C +:107DE000000000000000000000010101010101018C +:107DF000010100010100000000000001010101017A +:107E00000101010101010101000000010101010165 +:107E10000101010101010101000101010101010153 +:107E2000010101010101010000000000000000004B +:107E3000000000000001010000000000000100003F +:107E40000000010101010100000000010101010128 +:107E5000010101010101010000000000000000011A +:107E6000000001010101010000000000000000000D +:107E70000000000000000000000000000000000002 +:107E800000000000000101010101010101010101E7 +:107E900001010101010101000000000000000000DB +:107EA00000000000000101000000000000000000D0 +:107EB00000000000000101000001010101010101B9 +:107EC00001010101010101010101010101010101A2 +:107ED000010101010101010000000000000000009B +:107EE000000000000000000100010101010101018A +:107EF0000101000101010000000001010101010177 +:107F00000101010101010101000001010101010163 +:107F10000101010101010101000101010101010152 +:107F2000010101010101010000000000000000004A +:107F3000000000000001010000000000000100013D +:107F40000100010101010100000000010101010126 +:107F50000101010101010100000000000100000118 +:107F6000010001010101010000000000000000000B +:107F70000000000000000000000000000000000001 +:107F800000000100000101010101010101010101E5 +:107F900001010101010101000000000000000000DA +:107FA00000000100000101000000000000000000CE +:107FB00000000000000101010001010101010101B7 +:107FC00001010101010101010101010101010101A1 +:107FD000010101010101010000000000000000009A +:107FE0000000000000000001000101010101010189 +:107FF0000101000101010000000001010101010176 +:108000000101010101010101000101010101010161 +:108010000101010101010101000101010101010151 +:108020000101010101010100000000000000000148 +:10803000010000000001010100000000000100013A +:108040000100010101010100000100010101010124 +:108050000101010101010100000000010101010114 +:10806000010001010101010000000000000000000A +:108070000000000000000000000000000000000000 +:1080800000000100000101010101010101010101E4 +:1080900001010101010101000000000000000000D9 +:1080A00000000100000101000000000000000000CD +:1080B00000000100000101010101010101010101B4 +:1080C00001010101010101010101010101010101A0 +:1080D0000101010101010100000000000000000099 +:1080E0000000000000000001000101010101010188 +:1080F0000101000101010001000001010101010174 +:108100000101010101010101000101010101010160 +:10811000010101010101010101010101010101014F +:108120000101010101010100000000000000010146 +:108130000100010001010101000000000101000136 +:108140000100010101010100000101010101010122 +:108150000101010101010100000000010101010113 +:108160000101010101010100000000000000000008 +:1081700000000000000100000000000000000000FE +:1081800000000101010101010101010101010101E1 +:1081900001010101010101000000000000000000D8 +:1081A00000000101000101000000000000000000CB +:1081B00000000100000101010101010101010101B3 +:1081C000010101010101010101010101010101019F +:1081D0000101010101010100000000000000000098 +:1081E0000000000000000001000202010102010283 +:1081F0000201000101010001000101010101010171 +:10820000010101010101010100010101010101015F +:10821000010101010101010101010101010101014E +:108220000101010101010100000000000000010145 +:108230000101010001010101000000010101010132 +:108240000100010101010100000101010101010121 +:108250000101010101010101000001010101010110 +:108260000101010101010100000000000000000007 +:1082700000000000000101000000000000000001FB +:1082800001000101010101010101010101010101DF +:1082900001010101010101000000000000000001D6 +:1082A00000000101000101000000000000000000CA +:1082B00000000101010101010101010101010101B0 +:1082C000010101010101010101010101010101019E +:1082D0000101010101010100000000000000000097 +:1082E000000000000000000201020202020202027D +:1082F0000201000101010001000101010101010170 +:10830000010101010101010100010101010101015E +:10831000010101010101010101010101010101014D +:108320000101010101010101000000000001010142 +:10833000010101010101010101010001010101012E +:10834000010101010101010100010101010101011E +:10835000010101010101010100010101010101010E +:108360000101010101010100000000000000000006 +:1083700000000000000101000000000000010001F9 +:1083800001000101010101010101010101010101DE +:1083900001010101010101000000000100010001D3 +:1083A00000000101010101000000000000000001C7 +:1083B00000000101010101010101010101010101AF +:1083C000010101010101010101010101010101019D +:1083D0000101010101010100020000000000000094 +:1083E000000000000000000201020202020202027C +:1083F000020100010201000100010101010101016E +:10840000010101010101010101010101010101015C +:10841000010101010101010101010101010101014C +:10842000010101010101010101000000010101013F +:10843000010101010101010101010101010101012C +:10844000010101010101010101010101010101011C +:10845000010101010101010100010101010101010D +:108460000101010101010100000000000000000005 +:1084700000000100000101000001000001010001F5 +:1084800001010101010101010101010101010101DC +:1084900001010101010101000000000101010001D1 +:1084A00000010101010101000000000000010001C4 +:1084B00000000101010101010101010101010101AE +:1084C000010101010101010101010101010101019C +:1084D0000101010101010100020000000000000093 +:1084E0000000010100000002020202020202020278 +:1084F000020200010201000100010102010101016B +:10850000010101010102010101010101010101015A +:10851000010101010101010101010101010101014B +:10852000010101010101010101000000010101013E +:10853000010101010101010101010101010101012B +:10854000010101010101010101010101010101011B +:10855000010101010101010101010101010101010B +:108560000101010101010100000000000000000004 +:1085700000000100000101000001000101010101F2 +:1085800001010101010101010101010101010101DB +:1085900001010101010101010000010101010101CD +:1085A00000010101010101000000000001010001C2 +:1085B00001010101010101010101010101010101AB +:1085C000010101010101010201010101010101019A +:1085D0000101010101010100020000000000000191 +:1085E0000101010100000002020202020202020275 +:1085F0000202000102010001010101020101010268 +:108600000201020201020202010101010101010154 +:108610000101020101020102010101010101010147 +:10862000010101010101010101000000010101013D +:10863000010101010101010101010101010101012A +:10864000010101010101010101010101010101011A +:10865000010101010101010101010101010101010A +:108660000101010101010100000000000000000003 +:1086700000000101010101000101000101010101EE +:1086800001010101010101010101010101010101DA +:1086900001010101010101010101010101010101CA +:1086A00001010101010101010000010101010101BC +:1086B00001010101010101010101010101010101AA +:1086C0000101010101010102020101020101010197 +:1086D000010101010101020001000000000101018E +:1086E0000101010101000002020202020202020273 +:1086F0000202010102010002010101020202020262 +:10870000020202020202020201010102020101024E +:10871000020102020202020201010102020102023E +:108720000201020201020201010001010101010135 +:108730000101010101020102010101010101010127 +:108740000101010101020101010101010101010118 +:108750000101010101010101010101010101010109 +:108760000101010101010100000000000000000101 +:1087700000000101010101010101010101010101EB +:1087800001010101010101010101010101010102D8 +:1087900001010101010101010101010101010101C9 +:1087A00001010101010101010101010101010101B9 +:1087B00001010101010101010101010101010101A9 +:1087C0000101010101010102020201020201010194 +:1087D0000101020201020200010000000101010189 +:1087E0000101010101000002020202020202020272 +:1087F000020201020201000201010202020202025F +:10880000020202020202020201010102020202024B +:10881000020202020202020201020102020202023A +:108820000202020202020202010101010101010130 +:108830000101010101020202010101010101010125 +:108840000101020101020201010101010101010115 +:108850000101010101010101010101010101010108 +:1088600001010101010101010000000000010001FE +:1088700000000101010101010101010101010101EA +:1088800001010101010101020101010202020102D3 +:1088900002010202020202010101010101010101C2 +:1088A00001010101010101010101010101010101B8 +:1088B00001010101010101010101010101010101A8 +:1088C000010101010101010202020202020202028F +:1088D0000201020202020200010001010101010184 +:1088E0000101010101000002020202020202020271 +:1088F000020201020201000201020202020202025D +:108900000202020202020202010202020202020248 +:108910000202020202020202020202020202020237 +:10892000020202020202020202010101010101012E +:108930000101010101020202020101010102010122 +:108940000101020201020201010101020201010210 +:108950000201020202020202010101010101010100 +:1089600001010101010201010000000001010001FB +:1089700001010101010101010101010101010101E7 +:1089800001010101010101020202020202020202CE +:1089900002020202020202010101010101010101C0 +:1089A00001010101010101010101010101010101B7 +:1089B00001010101010101010101010101010101A7 +:1089C000010101010102010202020202020202028D +:1089D0000202020202020200010001010101010182 +:1089E0000101010101000002020202020202020270 +:1089F000020201020202000202020202020202025A +:108A00000202020202020202020202020202020246 +:108A10000202020202020202020202020202020236 +:108A2000020202020202020202010101010102022B +:108A3000020101010102020202020102020201021C +:108A40000201020202020202010201020202020209 +:108A500002020202020202020101010202010102FB +:108A600001010202010202010000010101010101F4 +:108A700001010101010101010101010101010101E6 +:108A800001010101010101020202020202020202CD +:108A900002020202020202010101010101010101BF +:108AA00001010101010101010101010101010101B6 +:108AB00001010101010101020101010202010202A1 +:108AC0000201020201020202020202020202020288 +:108AD0000202020202020200000101010101010181 +:108AE000010101010100000202020202020202026F +:108AF0000202010202020002020202020202020259 +:108B00000202020202020202020202020202020245 +:108B10000202020202020202020202020202020235 +:108B20000202020202020202020101010202020228 +:108B30000202020102020202020202020202020216 +:108B40000201020202020202020202020202020206 +:108B500002020202020202020202020202020202F5 +:108B600002010202020202010001010101010101F0 +:108B700001010101010101010101010101010101E5 +:108B800001010101010201020202020202020202CB +:108B900002020202020202020101010101010101BD +:108BA00001010101010201010101010101010101B4 +:108BB000010101010101010202020202020202029C +:108BC0000202020202020202020202020202020285 +:108BD0000202020202020200000101010100000083 +:108BE0000000000001010002020202020202020271 +:108BF0000202010202020002020202020202020258 +:108C00000202020202020202020202020202020244 +:108C10000202020202020202020202020202020234 +:108C20000202020202020202020202020202020224 +:108C30000202020202020202020202020202020214 +:108C40000202020202020202020202020202020204 +:108C500002020202020202020202020202020202F4 +:108C600002020202020202020001010101010101ED +:108C700001010101010101020202010101010101E1 +:108C800001010201010202020202020202020202C8 +:108C900002020202020202020201010201010101BA +:108CA00001010201010202020101010101010101B0 +:108CB000010101010102010202020202020202029A +:108CC0000202020202020202020202020202020284 +:108CD0000202020202020200000100000000000085 +:108CE000000000000101010202020202020202026F +:108CF0000202020202020002020202020202020256 +:108D00000202020202020202020202020202020243 +:108D10000202020202020202020202020202020233 +:108D20000202020202020202020202020202020223 +:108D30000202020202020202020202020202020213 +:108D40000202020202020202020202020202020203 +:108D500002020202020202020202020202020202F3 +:108D600002020202020202020101010101010101EB +:108D700001010101010201020202010202020102DB +:108D800002010202020202020202020202020202C4 +:108D900002020202020202020202020202020102B4 +:108DA00001010202010202020201010101010101AD +:108DB0000101020101020202020202020202020297 +:108DC0000202020202020202020202020202020283 +:108DD0000202020202020200000000000000000085 +:108DE0000000000000010102020101020202020271 +:108DF0000202020202020002020202020202020255 +:108E00000202020202020202020202020202020242 +:108E10000202020202020202020202020202020232 +:108E20000202020202020202020202020202020222 +:108E30000202020202020202020202020202020212 +:108E40000202020202020202020202020202020202 +:108E500002020202020202020202020202020202F2 +:108E600002020202020202020101010101010101EA +:108E700001010201010202020202020202020202D6 +:108E800002020202020202020202020202020202C2 +:108E900002020202020202020202020202020202B2 +:108EA00001020202020202020202020202020102A4 +:108EB0000101020202020202020202020202020294 +:108EC0000202020202020202020202020202020282 +:108ED0000202020202020200000000000000000084 +:108EE0000000000000010102020101020202020270 +:108EF0000202020202020002020202020202020254 +:108F00000202020202020202020202020202020241 +:108F10000202020202020202020202020202020231 +:108F20000202020202020202020202020202020221 +:108F30000202020202020202020202020202020211 +:108F40000202020202020202020202020202020201 +:108F500002020202020202020202020202020202F1 +:108F600002020202020202020202020202020102E2 +:108F700001010202020202020202020202020202D3 +:108F800002020202020202020202020202020202C1 +:108F900002020202020202020202020202020202B1 +:108FA00002020202020202020202020202020202A1 +:108FB0000202020202020202020202020202020291 +:108FC0000202020202020202020202020202020281 +:108FD0000202020202020200000000000000000083 +:108FE0000000000000010102010101010101010175 +:108FF0000101020201020002020202020202020256 +:109000000202020202020202020202020202020240 +:109010000202020202020202020202020202020230 +:109020000202020202020202020202020202020220 +:109030000202020202020202020202020202020210 +:109040000202020202020202020202020202020200 +:1090500002020202020202020202020202020202F0 +:1090600002020202020202020202020202020202E0 +:1090700002020202020202020202020202020202D0 +:1090800002020202020202020202020202020202C0 +:1090900002020202020202020202020202020202B0 +:1090A00002020202020202020202020202020202A0 +:1090B0000202020202020202020202020202020290 +:1090C0000202020202020202020202020202020280 +:1090D0000202020202020200000000000000000082 +:1090E0000000000000010101010101010101010175 +:1090F0000101020201020002020202020202020255 +:10910000020202020202020202020202020202023F +:10911000020202020202020202020202020202022F +:10912000020202020202020202020202020202021F +:10913000020202020202020202020202020202020F +:1091400002020202020202020202020202020202FF +:1091500002020202020202020202020202020202EF +:1091600002020202020202020202020202020202DF +:1091700002020202020202020202020202020202CF +:1091800002020202020202020202020202020202BF +:1091900002020202020202020202020202020202AF +:1091A000020202020202020202020202020202029F +:1091B000020202020202020202020202020202028F +:1091C000020202020202020202020202020202027F +:1091D0000202020202020200000000000000000081 +:1091E0000000000000010101010101010101010174 +:1091F0000101020201020002020202020202020254 +:10920000020202020202020202020202020202023E +:10921000020202020202020202020202020202022E +:10922000020202020202020202020202020202021E +:10923000020202020202020202020202020202020E +:1092400002020202020202020202020202020202FE +:1092500002020202020202020202020202020202EE +:1092600002020202020202020202020202020202DE +:1092700002020202020202020202020202020202CE +:1092800002020202020202020202020202020202BE +:1092900002020202020202020202020202020202AE +:1092A000020202020202020202020202020202029E +:1092B000020202020202020202020202020202028E +:1092C000020202020202020202020202020202027E +:1092D0000202020202020200000000000000000080 +:1092E0000000000000010101010000010101010175 +:1092F0000101020201020002020202020202020253 +:10930000020202020202020202020202020202023D +:10931000020202020202020202020202020202022D +:10932000020202020202020202020202020202021D +:10933000020202020202020202020202020202020D +:1093400002020202020202020202020202020202FD +:1093500002020202020202020202020202020202ED +:1093600002020202020202020202020202020202DD +:1093700002020202020202020202020202020202CD +:1093800002020202020202020202020202020202BD +:1093900002020202020202020202020202020202AD +:1093A000020202020202020202020202020202029D +:1093B000020202020202020202020202020202028D +:1093C000020202020202020202020202020202027D +:1093D000020202020202020000000000000000007F +:1093E0000000000000000101010000010101010175 +:1093F0000101020101020002020202020202020253 +:10940000020202020202020202020202020202023C +:10941000020202020202020202020202020202022C +:10942000020202020202020202020202020202021C +:10943000020202020202020202020202020202020C +:1094400002020202020202020202020202020202FC +:1094500002020202020202020202020202020202EC +:1094600002020202020202020202020202020202DC +:1094700002020202020202020202020202020202CC +:1094800002020202020202020202020202020202BC +:1094900002020202020202020202020202020202AC +:1094A000020202020202020202020202020202029C +:1094B000020202020202020202020202020202028C +:1094C000020202020202020202020202020202027C +:1094D0000202020202020202020202020200000072 +:1094E000000000000000000100000000000000007B +:1094F0000000010100020002020202020202020256 +:10950000020202020202020202020202020202023B +:10951000020202020202020202020202020202022B +:10952000020202020202020202020202020202021B +:10953000020202020202020202020202020202020B +:1095400002020202020202020202020202020202FB +:1095500002020202020202020202020202020202EB +:1095600002020202020202020202020202020202DB +:1095700002020202020202020202020202020202CB +:1095800002020202020202020202020202020202BB +:1095900002020202020202020202020202020202AB +:1095A000020202020202020202020202020202029B +:1095B000020202020202020202020202020202028B +:1095C000020202020202020202020202020202027B +:1095D000020202020202020202020202020202026B +:1095E000020202020202000000000000000000006F +:1095F0000000010100010100000000000000000067 +:109600000000000000000002020202020202020248 +:10961000020202020202020202020202020202022A +:109620000202020202020201010101010101010123 +:109630000101010101010102020202020202020211 +:1096400002020202020202020202020202020202FA +:1096500002020202020202020202020202020202EA +:1096600002020202020202020202020202020202DA +:1096700002020202020202020202020202020202CA +:1096800002020202020202020202020202020202BA +:1096900002020202020202020202020202020202AA +:1096A000020202020202020202020202020202029A +:1096B000020202020202020202020202020202028A +:1096C000020202020202020202020202020202027A +:1096D000020202020202020202020202020202026A +:1096E000020202020202020000000000000000006C +:1096F0000000010100010100000000000000000066 +:109700000000000000000002020202020202020247 +:109710000202020202020202020202020202020229 +:109720000202020202020202020202020202020219 +:109730000202020202020201010101010101010112 +:109740000101010101010102020202020202020200 +:1097500002020202020202020202020202020202E9 +:1097600002020202020202020202020202020202D9 +:1097700002020202020202020202020202020202C9 +:1097800002020202020202020202020202020202B9 +:1097900002020202020202020202020202020202A9 +:1097A0000202020202020202020202020202020299 +:1097B0000202020202020202020202020202020289 +:1097C0000202020202020202020202020202020279 +:1097D0000202020202020202020202020202020269 +:1097E000020202020202020000000000000000006B +:1097F000000001010001010101010101010101015C +:109800000101010101010100000000000000000051 +:109810000000000000000002020202020202020236 +:10982000020202020202020000000000000000002A +:109830000000000000000002020202020202020216 +:1098400002020202020202020202020202020202F8 +:1098500002020202020202020202020202020202E8 +:1098600002020202020202020202020202020202D8 +:1098700002020202020202020202020202020202C8 +:1098800002020202020202020202020202020202B8 +:1098900002020202020202020202020202020202A8 +:1098A0000202020202020202020202020202020298 +:1098B0000202020202020202020202020202020288 +:1098C0000202020202020202020202020202020278 +:1098D0000202020202020202020202020202020268 +:1098E000020202020202020000000000000000006A +:1098F000000001000001010101010101010101015C +:109900000101010101010100000000000000000050 +:109910000000000000000000000000000000000047 +:109920000000000000000000000000000000000037 +:109930000000000000000000000000000000000027 +:109940000000000000000002020202020202020205 +:1099500002020202020202000000000000000000F9 +:1099600000000000000000010101010101010101EE +:1099700001010101010101020202020202020202CE +:1099800002020202020202020202020202020202B7 +:1099900002020202020202020202020202020202A7 +:1099A0000202020202020202020202020202020297 +:1099B0000202020202020202020202020202020287 +:1099C0000202020202020201010101010101010180 +:1099D000010101010101010202020202020202026E +:1099E0000202020202020200000000000000000069 +:1099F000000000000001010101010101010101015C +:109A00000101010101010101010101010101010146 +:109A1000010101010101010000000000000000003F +:109A2000000000000000000101010101010101012D +:109A3000010101010101010000000000000000001F +:109A40000000000000000002020202020202020204 +:109A500002020202020202000000000000000000F8 +:109A600000000000000000020202020202020202E4 +:109A700002020202020202000000000000000000D8 +:109A800000000000000000020202020202020202C4 +:109A900002020202020202010101010101010101AF +:109AA000010101010101010202020202020202029D +:109AB0000202020202020202020202020202020286 +:109AC0000202020202020202020202020202020276 +:109AD0000202020202020202020202020202020266 +:109AE000020202020202020101010101010101015F +:109AF0000101010101010101010101010101010156 +:109B00000101010101010101010101010101010145 +:109B10000101010101010101010101010101010135 +:109B20000101010101010101010101010101010125 +:109B30000101010101010101010101010101010115 +:109B40000101010101010101010101010101010105 +:109B500001010101010101000000000000000000FE +:109B600000000000000000000000000000000000F5 +:109B700000000000000000000000000000000000E5 +:109B800000000000000000020202020202020202C3 +:109B900002020202020202020202020202020202A5 +:109BA00002020202020202000000000000000000A7 +:109BB0000000000000000002020202020202020293 +:109BC000020202020202020101010101010101017E +:109BD000010101010101010202020202020202026C +:109BE000020202020202020101010101010101015E +:109BF0000101010101010101010101010101010155 +:109C00000101010101010101010101010101010144 +:109C10000101010101010101010101010101010134 +:109C20000101010101010101010101010101010124 +:109C30000101010101010101010101010101010114 +:109C40000101010101010101010101010101010104 +:109C500001010101010101010101010101010101F4 +:109C600001010101010101000000000000000000ED +:109C700000000000000000000000000000000000E4 +:109C800000000000000000000000000000000000D4 +:109C900000000000000000000000000000000000C4 +:109CA00000000000000000000000000000000000B4 +:109CB0000000000000000002020202020202020292 +:109CC000020202020202020101010101010101017D +:109CD000010101010101010202020202020202026B +:109CE000020202020202020101010101010101015D +:109CF0000101010101010101010101010101010154 +:109D00000101010101010101010101010101010143 +:109D10000101010101010101010101010101010133 +:109D20000101010101010101010101010101010123 +:109D30000101010101010101010101010101010113 +:109D40000101010101010101010101010101010103 +:109D500001010101010101010101010101010101F3 +:109D600001010101010101010101010101010101E3 +:109D700001010101010101010101010101010101D3 +:109D800001010101010101010101010101010101C3 +:109D900001010101010101000000000000000000BC +:109DA00000000000000000000000000000000000B3 +:109DB0000000000000000002020202020202020291 +:109DC000020202020202020101010101010101017C +:109DD000010101010101010202020202020202026A +:109DE000020202020202020101010101010101015C +:109DF0000101010101010101010101010101010153 +:109E00000101010101010101010101010101010142 +:109E10000101010101010101010101010101010132 +:109E20000101010101010101010101010101010122 +:109E30000101010101010101010101010101010112 +:109E40000101010101010101010101010101010102 +:109E500001010101010101010101010101010101F2 +:109E600001010101010101010101010101010101E2 +:109E700001010101010101010101010101010101D2 +:109E800001010101010101010101010101010101C2 +:109E900001010101010101010101010101010101B2 +:109EA00001010101010101010101010101010101A2 +:109EB0000101010101010101010101010101010192 +:109EC0000101010101010101010101010101010182 +:109ED000010101010101010000000000000000007B +:109EE0000000000000000001010101010101010169 +:109EF0000101010101010101010101010101010152 +:109F00000101010101010101010101010101010141 +:109F10000101010101010101010101010101010131 +:109F20000101010101010101010101010101010121 +:109F30000101010101010101010101010101010111 +:109F40000101010101010101010101010101010101 +:109F500001010101010101010101010101010101F1 +:109F600001010101010101010101010101010101E1 +:109F700001010101010101010101010101010101D1 +:109F800001010101010101010101010101010101C1 +:109F900001010101010101010101010101010101B1 +:109FA00001010101010101010101010101010101A1 +:109FB0000101010101010101010101010101010191 +:109FC0000101010101010101010101010101010181 +:109FD000010101010101010000000000000000007A +:109FE0000000000000000000000000000000000071 +:109FF0000000000000000000000000000000000061 +:10A000000000000000000000000000000000000050 +:10A010000000000000000000000000000000000040 +:10A02000000000000000000202020202020202021E +:10A030000202020202020202020202020202020200 +:10A0400002020202020202020202020202020202F0 +:10A0500002020202020202020202020202020202E0 +:10A0600002020202020202020202020202020202D0 +:10A0700002020202020202020202020202020202C0 +:10A0800002020202020202020202020202020202B0 +:10A0900002020202020202020202020202020202A0 +:10A0A0000202020202020202020202020202020290 +:10A0B0000202020202020202020202020202020280 +:10A0C0000202020202020202020202020202020270 +:10A0D0000202020202020200000000000000000072 +:10A0E0000000000000000000000000000000000070 +:10A0F0000000000000000000000000000000000060 +:10A10000000000000000000000000000000000004F +:10A11000000000000000000000000000000000003F +:10A12000000000000000000000000000000000002F +:10A13000000000000000000000000000000000001F +:10A14000000000000000000000000000000000000F +:10A1500000000000000000000000000000000000FF +:10A1600000000000000000000000000000000000EF +:10A1700000000000000000000000000000000000DF +:10A1800000000000000000000000000000000000CF +:10A1900000000000000000000000000000000000BF +:10A1A00000000000000000000000000000000000AF +:10A1B000000000000000000000000000000000009F +:10A1C000000000000000000202020202020202027D +:10A1D0000202020202020200000000000000000071 +:10A1E000000000000000000000000000000000006F +:10A1F000000000000000000000000000000000005F +:10A20000000000000000000000000000000000004E +:10A21000000000000000000000000000000000003E +:10A22000000000000000000000000000000000002E +:10A23000000000000000000000000000000000001E +:10A24000000000000000000000000000000000000E +:10A2500000000000000000000000000000000000FE +:10A2600000000000000000000000000000000000EE +:10A2700000000000000000000000000000000000DE +:10A2800000000000000000000000000000000000CE +:10A2900000000000000000000000000000000000BE +:10A2A00000000000000000000000000000000000AE +:10A2B000000000000000000000000000000000009E +:10A2C000000000000000000202020202020202027C +:10A2D0000202020202020200000000000000000070 +:10A2E000000000000000000000000000000000006E +:10A2F000000000000000000000000000000000005E +:10A30000000000000000000000000000000000004D +:10A31000000000000000000000000000000000003D +:10A32000000000000000000000000000000000002D +:10A33000000000000000000000000000000000001D +:10A34000000000000000000000000000000000000D +:10A3500000000000000000000000000000000000FD +:10A3600000000000000000000000000000000000ED +:10A3700000000000000000000000000000000000DD +:10A3800000000000000000000000000000000000CD +:10A3900000000000000000000000000000000000BD +:10A3A00000000000000000000000000000000000AD +:10A3B000000000000000000000000000000000009D +:10A3C000000000000000000000000000000000008D +:10A3D000000000000000000000000000000000007D +:10A3E000000000000000003100000000000000003C +:10A3F000000000000000000000000000000000005D +:10A40000000000000000000000000000000000004C +:10A41000000000000000000000000000000000003C +:10A42000000000000000000000000000000000002C +:10A43000000000000000000000000000000000001C +:10A44000000000000000000000000000000000000C +:10A4500000000000000000000001000000000000FB +:10A4600000000000000000000000000000000000EC +:10A4700000000000000000000000000000000000DC +:10A4800000000000000000000000000000000000CC +:10A4900000000000000000000000000000000000BC +:10A4A00000000000000000000000000000000000AC +:10A4B000000000000000000000000000000000009C +:10A4C000000000000000000000000000000000008C +:10A4D000000000000000000000000000000000007C +:10A4E000000000000000000000000000000000006C +:10A4F000000000000000000000000000000000005C +:10A50000000000000000000000000000000000004B +:10A51000000000000000000000000000000000003B +:10A52000000000000000000000000000000000002B +:10A53000000000000000000000000000000000001B +:10A54000000000000000000000000000000000000B +:10A5500000000000000000000001010000000000F9 +:10A5600000000000000000000000010000000000EA +:10A5700000000000000000000000000000000000DB +:10A5800000000000000000000000000000000000CB +:10A5900000000000000000000000000000000000BB +:10A5A00000000000000000000000000000000000AB +:10A5B000000000000000000000000000000000009B +:10A5C000000000000000000000000000000000008B +:10A5D000000000000000000000000000000000007B +:10A5E000000000000000000000000000000000006B +:10A5F000000000000000000000000000000000005B +:10A60000000000000000000000000000000000004A +:10A610000000000000000000000000000100000039 +:10A62000000000000000000000000000000000002A +:10A63000000000000000000000000000000000001A +:10A64000000000000000000000000000000000000A +:10A6500000000000000000000001010000010000F7 +:10A6600000000000000000000001010000000000E8 +:10A6700000000000000000000001000000000000D9 +:10A6800000000000000000000000000000000000CA +:10A6900000000000000000000000000000000000BA +:10A6A00000000000000000000000000000000000AA +:10A6B000000000000000000000000000000000009A +:10A6C000000000000000000000000000000000008A +:10A6D000000000000000000000000000000000007A +:10A6E000000000000000000000000000000000006A +:10A6F000000000000000000000000000000000005A +:10A700000000000000000000000000000000000049 +:10A710000000000000000000000000000100000038 +:10A720000000000000000000000000000000000029 +:10A730000000000000000000000000000000000019 +:10A740000000000000000000000000000000000009 +:10A7500000000000000000000001010000010000F6 +:10A7600000000000000000000001010001000000E6 +:10A7700000000000000000000001010000000000D7 +:10A7800000000000000000000000000000000000C9 +:10A7900000000000000000000000000000000000B9 +:10A7A00000000000000000000000000000000000A9 +:10A7B0000000000000000000000000000000000099 +:10A7C0000000000000000000000000000000000089 +:10A7D0000000000000000000000000000000000079 +:10A7E0000000000000000000000000000000000069 +:10A7F0000000000000000000000000000000000059 +:10A800000000000000000000000000000100000047 +:10A810000000000000000000000001000100010035 +:10A820000000000000000000000000000000000028 +:10A830000000000000000000000000000000000018 +:10A840000000000000000000000000000000000008 +:10A8500000000000000000000001010000010000F5 +:10A8600000000000000000000001010001010000E4 +:10A8700000000000000000000001010000000000D6 +:10A8800000000000000000000000000000000000C8 +:10A8900000000000000000000000000000000000B8 +:10A8A00000000000000000000000000001000100A6 +:10A8B0000000000000000000000000000000000098 +:10A8C0000000000000000000000000000000000088 +:10A8D0000000000000000000000000000100010076 +:10A8E0000000000000000000000000000000000068 +:10A8F0000000000000000000000000000000000058 +:10A900000000000000000000000000000100000046 +:10A910000000000000000000000101010101010031 +:10A920000000000000000000000000000000000027 +:10A930000000000000000000000000000100000016 +:10A940000000000000000000000000000000000007 +:10A9500000000000000000000001010001010000F3 +:10A9600000000000000000000001010001010000E3 +:10A9700000000000000000000001010001000000D4 +:10A9800000000000000000000000000000000000C7 +:10A9900000000000000000000000000001000000B6 +:10A9A00000000000000000000001000001000100A4 +:10A9B0000000000000000000000000000000000097 +:10A9C0000000000000000000000000000000000087 +:10A9D0000000000000000000000000000100010075 +:10A9E0000000000000000000000000000000000067 +:10A9F0000000000000000000000000000000000057 +:10AA00000000000000000000000000000100000045 +:10AA10000000000000000000000101010101010030 +:10AA20000000000000000000000000000000000026 +:10AA30000000000000000000000000000100000015 +:10AA40000000000000000000000100000000000005 +:10AA500000000000000000000001010001010000F2 +:10AA600000000000000000000001010001010000E2 +:10AA700000000000000000000001010101000000D2 +:10AA800000000000000000000000000000000000C6 +:10AA900000000000000000000001000001000000B4 +:10AAA00000000000000000000001010001000100A2 +:10AAB0000000000000000000000000000000000096 +:10AAC0000000000000000000000000000000000086 +:10AAD0000000000000000000000000000100010074 +:10AAE0000000000000000000000000000000000066 +:10AAF0000000000000000000000000000000000056 +:10AB00000000000000000000000000000100000044 +:10AB1000000000000000000001010101010101002E +:10AB20000000000000000000000000000000000025 +:10AB30000000000000000000000000000100000014 +:10AB40000000000000000000000100000100000003 +:10AB500000010001000000000001010001010000EF +:10AB600000000000000000000001010001010000E1 +:10AB700000000000000000000001010101000000D1 +:10AB800000000000000000000000000000000000C5 +:10AB900000000000000000000001000001000100B2 +:10ABA000000000000000000000010101010101009F +:10ABB0000000000000000000000000000000000095 +:10ABC0000000000000000000000000000000000085 +:10ABD0000000000000000100000000010101010070 +:10ABE0000000000000000000000000000000000065 +:10ABF0000000000000000000000000000000000055 +:10AC00000000000000000000000001000100010041 +:10AC1000000000010000000001010101010101002C +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000000000000010100000012 +:10AC40000000000000000000000100000100000002 +:10AC500000010001000000000001010001010000EE +:10AC600000000000000000000001010001010000E0 +:10AC700000000000000000000001010101000000D0 +:10AC800000000000000000000000000000000000C4 +:10AC900000000000000000000101000101010100AE +:10ACA000000100010000000000010101010101009C +:10ACB0000000000000000000000000000000000094 +:10ACC0000000000000000000000000000000000084 +:10ACD000000000010000010000000101010101006D +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000000000100000053 +:10AD0000000000000000000000010101010101003D +:10AD1000000000010000000101010101010101002A +:10AD20000000000000000000000000000000000023 +:10AD3000000000000000000000000101010001000F +:10AD40000000000000000000000100000100010000 +:10AD500000010001000000000001010001010100EC +:10AD600000010000000000000001010001010000DE +:10AD700000000000000000000001010101000000CF +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000101010101010100AC +:10ADA000000100010100000000010101010101009A +:10ADB0000000000000000000000000000000000093 +:10ADC0000000000000000000000000000000000083 +:10ADD000000000010000010100010101010101006A +:10ADE0000000000000000000000000000000000063 +:10ADF0000000000000000000000000000100000052 +:10AE0000000000000000000000010101010101003C +:10AE10000001010100000001010101010101010027 +:10AE20000000000000000000000000000000000022 +:10AE3000000000000000000200010101010101000A +:10AE400000000000000000000001000101010100FD +:10AE500000010001000000000101010001010100EA +:10AE600000010000000102000201010001010000D8 +:10AE700000000000000000000001010101000000CE +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000101010101010100AB +:10AEA0000101010101000000000101010101010097 +:10AEB0000000000000000000000000000000000092 +:10AEC0000000000000000000000000000000000181 +:10AED0000000010100000101000101010101010068 +:10AEE0000000000000000000000000000000000062 +:10AEF0000000000000000000000000010100000050 +:10AF0000000000000000000001010101010101003A +:10AF10000001010101000001010101010101010025 +:10AF20000000000000000000000000000100000020 +:10AF3000000000000000000100010101010101000A +:10AF400000010001000000000001010101010100F9 +:10AF500000010001000000000101010001010100E9 +:10AF600000010000000102000101010001010000D8 +:10AF700000010000000000000001010101000000CC +:10AF800000000000000000000000000000000000C1 +:10AF900000010001000000000101010101010100A8 +:10AFA0000101010101000000000101010101010096 +:10AFB0000000000000000000000000000000000091 +:10AFC0000000000000000000000000000000000180 +:10AFD0000000010101010101010101010101010064 +:10AFE0000000000000000000000000000000000061 +:10AFF000000000000000000000000001010000004F +:10B000000000000100000000010101010101010038 +:10B010000001010101000001010101010101010024 +:10B02000000000000000000000000000010000001F +:10B030000000000000000001000101010101010009 +:10B0400000010001000000000001010101010100F8 +:10B0500000010001010000000101010101010100E6 +:10B0600000010000000102000101010101010000D6 +:10B0700000010000000000000101010101000000CA +:10B0800000000000000000000000000000000000C0 +:10B0900000010001000000010101010101010101A5 +:10B0A0000101010101000000000101010101010095 +:10B0B0000000000000000000000000000000000090 +:10B0C000000000000000000000000000000000017F +:10B0D0000101010101010101010101010101010061 +:10B0E0000000000000000000000000000000000060 +:10B0F000000000000000000000000001010000004E +:10B100000000000100000000010101010101010037 +:10B110000001010101000001010101010101010023 +:10B12000000000000000000000000000010000001E +:10B130000000000100000001000101010101010007 +:10B1400000010101000000000001010101010100F6 +:10B1500001010101010000000101010101010100E3 +:10B1600000010000000102000101010101010000D5 +:10B1700000010001000000000101010101000000C8 +:10B1800000000000000000000000000000000000BF +:10B1900001010101000000010101010101010101A2 +:10B1A0000101010101010001000101010101010092 +:10B1B000000000000000000000000000000000008F +:10B1C000000000000000000000000000000000017E +:10B1D0000101010101010101010101010101010060 +:10B1E000000000000000020000000000000000005D +:10B1F000000000000000000000000001010000004D +:10B200000001010100000000010101010101010133 +:10B210000101010101000001010101010101010021 +:10B22000000000000000000000000000010000001D +:10B230000000000101000001000101010101010005 +:10B2400000010101010000000001010101010100F4 +:10B2500001010101010001020101010101010100DF +:10B2600000010000010101020101010101010000D2 +:10B2700000010001010000000101010101000000C6 +:10B2800000000000000000000000000001000000BD +:10B29000010101010101010101010101010101019E +:10B2A0000101010101010001000101010101010091 +:10B2B000000000000000000000000000000000008E +:10B2C000000000000000000000000000000000017D +:10B2D000010101010101010101010101010101005F +:10B2E000000000000000020000000000000000005C +:10B2F000000000000000000000000001010000004C +:10B300000001010100000000010101010101010132 +:10B310000101010101000001010101010101010020 +:10B32000000000000000000000000000010000001C +:10B330000001000101000001000101010101010003 +:10B3400001010101010000000001010101010100F2 +:10B3500001010101010001020101010101010100DE +:10B3600000010001010101010101010101010000D1 +:10B3700000010101010000000101010101000000C4 +:10B3800000000000000000000000000001000001BB +:10B39000010101010101010101010101010101019D +:10B3A000010101010101010100010101010101008F +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000000000000017C +:10B3D000010101010101010101010101010101005E +:10B3E0000000000000020200000000000100000058 +:10B3F000000000000000000000000001010000004B +:10B400000001010100000000010101010101010131 +:10B41000010101010100000101010101010101001F +:10B420000000000000020200000000000100000017 +:10B430000001000101020001000101010101010000 +:10B4400001010101010000000001010101010100F1 +:10B4500001010101010101010101010101010100DD +:10B4600000010001010101010101010101010000D0 +:10B4700000010101010202000101010101000000BF +:10B4800000000000000000000000000001000101B9 +:10B49000010101010101010101010101010101019C +:10B4A000010101010101010100010101010101008E +:10B4B000000000000000000000000000010000008B +:10B4C000000000000000000000000000000000017B +:10B4D000010101010101010101010101010101005D +:10B4E0000000000000020200000100000100000056 +:10B4F000000000000000000000000001010000004A +:10B500000001010100000000010101010101010130 +:10B51000010101010100000101010101010101001E +:10B520000000000000020200000000000100010114 +:10B530000001000101010001000101010101010000 +:10B5400001010101010000000001010101010100F0 +:10B5500001010101010101010102020101010100DA +:10B5600000010001010101010101010101010000CF +:10B5700000010101010202000101010101000000BE +:10B5800000000000000000000001000101010101B5 +:10B59000010101010101010101010101010101019B +:10B5A000010101010101010100010101010101008D +:10B5B000000000000000000000000000010000008A +:10B5C000000000000000000000000000000000017A +:10B5D000010101010101010101010101010101005C +:10B5E000000102000002020200010100010000014E +:10B5F0000000000000000000000000010100000148 +:10B60000010101010000000001010101010101012E +:10B61000010101010100000101010101010101001D +:10B62000000000000002020202000000010001010F +:10B6300000010001010102010101010101010100FC +:10B6400001010101010000000001010101010100EF +:10B6500001010101010102010102020101020100D7 +:10B6600000010001010101010101020101010000CD +:10B6700000010101010101010101010101000000BE +:10B6800000010000000000000001010101010101B2 +:10B69000010101010101010101010101010101019A +:10B6A000010101010101010100010101010101008C +:10B6B0000000000000000000000000000100010088 +:10B6C0000001000100000000000000000100010175 +:10B6D000010101010101010101010101010101005B +:10B6E000000102000002010200010101010100014C +:10B6F0000000000000000000000000010100000147 +:10B70000010101010000000001010101010101012D +:10B71000010101010100000101010201020101001A +:10B72000000000000002020202000000010001010E +:10B7300001010101010101010101010101010101F9 +:10B7400001010101010000000001010101010100EE +:10B7500001020102010102010102020101020100D4 +:10B7600001010001010201010102020101010100C8 +:10B7700001010101010101010102020101000100B9 +:10B7800000010000000000000001010101010101B1 +:10B790000101010101010101010101010101010199 +:10B7A000010101010101010100010101010101008B +:10B7B0000000000000000000000100010101010084 +:10B7C0000001000100000000000000000100010174 +:10B7D000010101010101010101010101010101005A +:10B7E000000101000001010100010101010100024D +:10B7F0000000000000000000000000010100000146 +:10B80000010101010000000001010101020101012B +:10B810000101020201000002020202020202020011 +:10B82000000000000201010201000001010001010D +:10B8300001010101010101010101010102010101F7 +:10B8400001010101010000000101010101010100EC +:10B8500001020102010202010102020102020100D1 +:10B8600001010001010201010102020102020100C5 +:10B8700001010101010101010102020101000100B8 +:10B8800000010001000000000001010101010101AF +:10B890000101010101010101010101010101010198 +:10B8A000010101010101010100010101010101008A +:10B8B000000100010000000000010101010101017F +:10B8C0000101010100000000000000000100010171 +:10B8D0000101010101010201010101010101010058 +:10B8E000000101010001010101010101010100024A +:10B8F0000000000000000000000000020100000144 +:10B900000101010100000000010102010201010228 +:10B91000010202020200000202020202020202000E +:10B92000000100000201010201000001010001010B +:10B9300001010101010101020101020202010101F3 +:10B9400001010101010000000101010101010100EB +:10B9500002020202020202010202020102020100CC +:10B9600001020001010201010102020102020100C3 +:10B9700001010101010101010102020202000100B5 +:10B9800000010001000000000001010101010101AE +:10B990000101010101010101010101010101010296 +:10B9A0000202020202010101000202010201020080 +:10B9B000000100010000000000010101010101017E +:10B9C000010101010001010000000000010001026D +:10B9D0000101010101010201010101010101010057 +:10B9E0000101010100010101010101010101000248 +:10B9F000000101000000000000010002020000013F +:10BA00000101020200000000020202020202020220 +:10BA1000020202020200000202020202020202000C +:10BA2000000100000101010101000001010101020A +:10BA300001010102020201020102020202020201EC +:10BA400001010101010000000102010101010100E9 +:10BA500002020202020202010202020102020200CA +:10BA600001020001010202020102020102020100C0 +:10BA700001020101010101010102020202000100B3 +:10BA800001010101000000000001010101010101AB +:10BA90000101010101010101010101010101010295 +:10BAA000020202020202010100020202020202007C +:10BAB000010100010000000000010101010101017C +:10BAC000010101010001010000000100010001026B +:10BAD0000101020201020202010101010201020050 +:10BAE0000100000100010101010101010101000249 +:10BAF000010101000000000101010002020000023A +:10BB0000010202020000010002020202020202021D +:10BB1000020202020200000202020202020202010A +:10BB20000101000001010101010001010101010207 +:10BB300001020102020202020102020202020201E9 +:10BB400001020202010000000102010102010100E4 +:10BB500002020202020202010202020202020200C8 +:10BB600001020001020202020202020102020100BD +:10BB700001020202020101010202020202000100AE +:10BB800001010101000000000101010101010101A9 +:10BB90000101010101010101020201010201010291 +:10BBA0000202020202020202000202020202020079 +:10BBB000010100010000000000010101010101017B +:10BBC0000101010101010101000101010101010265 +:10BBD000020102020202020201010202020202004A +:10BBE000010000000100000001010101010100024B +:10BBF0000101020000000001010101020200000237 +:10BC0000020202020000010002020202020202021B +:10BC10000202020202000002020202020202020109 +:10BC20000101000001010101010101010201010204 +:10BC300002020202020202020102020202020201E6 +:10BC400002020202020000000102020202020200DD +:10BC500002020202020202020202020202020200C6 +:10BC600001020002020202020202020202020100BA +:10BC700001020202020202020202020202010101A8 +:10BC800001010101000000000101010101010102A7 +:10BC90000202020201020202020202020202020285 +:10BCA0000202020202020202000202020202020177 +:10BCB0000101000100000000000101010101010279 +:10BCC0000101010101010101000101010101010264 +:10BCD0000202020202020202020202020202020046 +:10BCE000000000000000000000000001000101024F +:10BCF0000101020101000202020101020200000230 +:10BD00000202020201000100020202020202020219 +:10BD10000202020202000002020202020202020108 +:10BD200001010101010202010101010102010102FF +:10BD300002020202020202020202020202020202E3 +:10BD400002020202020000000102020202020200DC +:10BD500002020202020202020202020202020201C4 +:10BD600002020002020202020202020202020101B7 +:10BD700002020202020202020202020202010101A6 +:10BD800001010101010000000101010101010102A5 +:10BD90000202020202020202020202020202020283 +:10BDA0000202020202020202000202020202020176 +:10BDB0000101000100000000000101010101010278 +:10BDC000020202020102020101010101010101025C +:10BDD0000202020202020202020202020202020045 +:10BDE0000000000000000000000000000000010250 +:10BDF000020102010200020202010102020100022C +:10BE00000202020201000200020202020202020217 +:10BE10000202020202000002020202020202020206 +:10BE200001010101010202010101010102010102FE +:10BE300002020202020202020202020202020202E2 +:10BE400002020202020000000102020202020200DB +:10BE500002020202020202020202020202020201C3 +:10BE600002020002020202020202020202020101B6 +:10BE700002020202020202020202020202010101A5 +:10BE800001010101010000000101010101010102A4 +:10BE90000202020202020202020202020202020282 +:10BEA0000202020202020202000202020202020175 +:10BEB0000101010100000000000101010101010276 +:10BEC000020202020102020101010101010101025B +:10BED0000202020202020202020202020202020044 +:10BEE000000000000000000000000000000001024F +:10BEF000020202010200020202010102020100022A +:10BF00000202020201000201020202020202020215 +:10BF10000202020202010102020202020202020203 +:10BF200002020201020202010101010102010202F8 +:10BF300002020202020202020202020202020202E1 +:10BF400002020202020000000102020202020202D8 +:10BF500002020202020202020202020202020202C1 +:10BF600002020102020202020202020202020102B3 +:10BF700002020202020202020202020202010101A4 +:10BF8000010201010102020101010101020101029C +:10BF90000202020202020202020202020202020281 +:10BFA0000202020202020202000202020202020174 +:10BFB0000101010100000000010101010101010274 +:10BFC0000202020202020202010101010201020256 +:10BFD0000202020202020202020202020202020043 +:10BFE000000000000000000000000000000001024E +:10BFF0000202020202020202020101020201000226 +:10C000000202020202000201020202020202020213 +:10C010000202020202020202020202020202020200 +:10C0200002020201020202010201010202010202F5 +:10C0300002020202020202020202020202020202E0 +:10C0400002020202020100010202020202020202D4 +:10C0500002020202020202020202020202020202C0 +:10C0600002020102020202020202020202020202B1 +:10C0700002020202020202020202020202010202A1 +:10C080000202020201010101010202020202020295 +:10C090000202020202020202020202020202020280 +:10C0A0000202020202020202000202020202020272 +:10C0B000020201020000000001010101020101026F +:10C0C0000202020202020202010102010201020254 +:10C0D0000202020202020202020202020202020042 +:10C0E000000000000000000000000000000001024D +:10C0F0000202020202020202020202020201000223 +:10C10000020202020202020202020202020202020F +:10C1100002020202020202020202020202020202FF +:10C1200002020202020202020201020202020202F0 +:10C1300002020202020202020202020202020202DF +:10C1400002020202020100010202020202020202D3 +:10C1500002020202020202020202020202020202BF +:10C1600002020202020202020202020202020202AF +:10C1700002020202020202020202020202010202A0 +:10C180000202020201010101010202020202020294 +:10C19000020202020202020202020202020202027F +:10C1A0000202020202020202010202020202020270 +:10C1B0000202010201000000010202020202020268 +:10C1C000020202020202020202020202020202024F +:10C1D0000202020202020202020202020202020041 +:10C1E000000000000000000000000000000001014D +:10C1F0000202020202020202010202020201000223 +:10C20000020202020202020202020202020202020E +:10C2100002020202020202020202020202020202FE +:10C2200002020202020202020202020202020202EE +:10C2300002020202020202020202020202020202DE +:10C2400002020202020201010202020202020202D0 +:10C2500002020202020201020202020202020202BF +:10C2600002020202020202020202020202020202AE +:10C27000020202020202020202020202020202029E +:10C280000202020202010101020202020202020291 +:10C29000020202020202020202020202020202027E +:10C2A000020202020202020201020202020202026F +:10C2B0000202020201000000010202020202020266 +:10C2C000020202020202020202020202020202024E +:10C2D0000202020202020202020202020202020040 +:10C2E000000000000000000000000000000001014C +:10C2F0000202020202020202010202020202000221 +:10C30000020202020202020202020202020202020D +:10C3100002020202020202020202020202020202FD +:10C3200002020202020202020202020202020202ED +:10C3300002020202020202020202020202020202DD +:10C3400002020202020202020202020202020202CD +:10C3500002020202020201020202020202020202BE +:10C3600002020202020202020202020202020202AD +:10C37000020202020202020202020202020202029D +:10C38000020202020202020202020202020202028D +:10C39000020202020202020202020202020202027D +:10C3A000020202020202020201020202020202026E +:10C3B0000202020201010101010202020202020262 +:10C3C000020202020202020202020202020202024D +:10C3D000020202020202020202020202020202003F +:10C3E000000000000000000000000000000001014B +:10C3F0000202010201020101010202010202000225 +:10C40000020202020202020202020202020202020C +:10C4100002020202020202020202020202020202FC +:10C4200002020202020202020202020202020202EC +:10C4300002020202020202020202020202020202DC +:10C4400002020202020202020202020202020202CC +:10C4500002020202020101020202020202020202BE +:10C4600002020202020201010202020202020202AE +:10C47000020202020202020202020202020202029C +:10C48000020202020202020202020202020202028C +:10C49000020202020202020202020202020202027C +:10C4A000020202020202020202020202020202026C +:10C4B000020202020202020102020202020202025D +:10C4C000020202020202020202020202020202024C +:10C4D000020202020202020202020202020202003E +:10C4E000000000000000000000000000000000014B +:10C4F0000202010201020101010202010202000224 +:10C50000020202020202020202020202020202020B +:10C5100002020202020202020202020202020202FB +:10C5200002020202020101020202020202020202ED +:10C5300002020202020202020202020202020202DB +:10C5400002020202020202020202020202020202CB +:10C5500002020202020102020202020202020202BC +:10C5600002020202020201010202020202020202AD +:10C57000020202020202020202020202020202029B +:10C58000020202020202020202020202020202028B +:10C59000020202020202020202020202020202027B +:10C5A000020202020202020202020202020202026B +:10C5B000020202020202020202020202020202025B +:10C5C000020202020202020202020202020202024B +:10C5D000020202020202020202020202020202003D +:10C5E000000000000000000000000000000000004B +:10C5F0000202010201020101000202010202000224 +:10C60000020202020202020202020202020202020A +:10C6100002020202020202020202020202020202FA +:10C6200002020202020101020202020202020202EC +:10C6300002020202020101020202020202020202DC +:10C6400002020202020202020202020202020202CA +:10C6500002020202020202020202020202020202BA +:10C6600002020202020101010202020202020202AD +:10C67000020202020202020202020202020202029A +:10C68000020202020202020202020202020202028A +:10C69000020202020202020202020202020202027A +:10C6A000020202020202020202020202020202026A +:10C6B000020202020202020202020202020202025A +:10C6C000020202020202020202020202020202024A +:10C6D000020202020202020202020202020202003C +:10C6E0000202000000000000000202000200000040 +:10C6F0000102010101010101000202010102000227 +:10C700000202020202020202020202020202020209 +:10C7100002020202020202020202020202020202F9 +:10C7200002020102010101020202020202020202ED +:10C7300002020202020101020202020202020202DB +:10C7400002020202020202020202020202020202C9 +:10C7500002020202020202020202020202020202B9 +:10C7600002020202020102020202020202020202AA +:10C77000020202020201010102020202020202029C +:10C780000202020202020202020202020202020289 +:10C790000202020202020202020202020202020279 +:10C7A0000202020202020202020202020202020269 +:10C7B0000202020202020202020202020202020259 +:10C7C0000202020202020202020202020202020249 +:10C7D0000202020202020202020202020202020239 +:10C7E0000202000000000000000202020202020039 +:10C7F000010100010001000000020100010200022D +:10C800000202020202020202020202020202020208 +:10C8100002020202020202020202020202020202F8 +:10C8200002020102010202020202020202020201EB +:10C8300001010101010202010101010101010102E5 +:10C8400002020202020202020202020202020201C9 +:10C8500001010101010101010101010101010101C8 +:10C8600001010101010202020101010101010102B4 +:10C87000020202020201010102020202020202029B +:10C880000202020202020202020202020202020288 +:10C890000202020202020202020202020202020278 +:10C8A0000202020202020202020202020202020268 +:10C8B0000202020202020202020202020202020258 +:10C8C0000202020202020202020202020202020248 +:10C8D0000202020202020202020202020202020238 +:10C8E000020202020002020202020202020202002C +:10C8F0000101000100010000000101000101000030 +:10C900000000000000000000000000000000000126 +:10C910000101010101010101010101010101010107 +:10C9200001010201020202010101010101010102F2 +:10C9300002020202020202020202020202020202D7 +:10C9400002020202020202020202020202020201C8 +:10C9500001010101010101010101010101010102C6 +:10C9600002020202020202020202020202020201A8 +:10C9700001010101010202020101010101010102A3 +:10C980000202020202020202020202020202020287 +:10C990000202020202020202020202020202020277 +:10C9A0000202020202020202020202020202020267 +:10C9B0000202020202020202020202020202020158 +:10C9C0000101010101010101010101010101010256 +:10C9D0000202020202020202020202020202020237 +:10C9E0000202020202020202020202020202020029 +:10C9F000010100010001000000010100010101002E +:10CA00000000000000000000000000000000000224 +:10CA100002020202020202020202020202020202F6 +:10CA200002020202020202020202020202020200E8 +:10CA300000000000000000000000000000000001F5 +:10CA400001010101010101010101010101010101D6 +:10CA500001010101010101010101010101010101C6 +:10CA600001010101010101010101010101010102B5 +:10CA70000202020202020202020202020202020296 +:10CA80000202020202020202020202020202020286 +:10CA90000202020202020202020202020202020276 +:10CAA0000202020202020202020202020202020266 +:10CAB0000202020202020202020202020202020256 +:10CAC0000202020202020202020202020202020246 +:10CAD0000202020202020202020202020202020236 +:10CAE0000202020202020202020202020202020028 +:10CAF0000001000000000000000101000001010130 +:10CB00000101010101010101010101010101010016 +:10CB10000000000000000000000000000000000114 +:10CB200001010101010101010101010101010100F6 +:10CB300000000000000000000000000000000002F3 +:10CB400002020202020202020202020202020201C6 +:10CB500001010101010101010101010101010101C5 +:10CB600001010101010101010101010101010101B5 +:10CB700001010101010101010101010101010100A6 +:10CB800000000000000000000000000000000002A3 +:10CB90000202020202020202020202020202020176 +:10CBA0000101010101010101010101010101010274 +:10CBB0000202020202020202020202020202020057 +:10CBC0000000000000000000000000000000000263 +:10CBD0000202020202020202020202020202020235 +:10CBE0000202020202020202020202020202020027 +:10CBF0000000000000000000000100000001010131 +:10CC00000101010101010101010101010101010015 +:10CC10000000000000000000000000000000000113 +:10CC200001010101010101010101010101010101F4 +:10CC300001010101010101010101010101010100E5 +:10CC400000000000000000000000000000000001E3 +:10CC500001010101010101010101010101010101C4 +:10CC600001010101010101010101010101010101B4 +:10CC700001010101010101010101010101010100A5 +:10CC800000000000000000000000000000000002A2 +:10CC90000202020202020202020202020202020274 +:10CCA0000202020202020202020202020202020066 +:10CCB0000000000000000000000000000000000074 +:10CCC0000000000000000000000000000000000064 +:10CCD0000000000000000000000000000000000252 +:10CCE0000202020202020202020202020202020026 +:10CCF0000000000000000000000000000000010132 +:10CD00000101010101010101010101010101010113 +:10CD10000101010101010101010101010101010103 +:10CD200001010101010101010101010101010101F3 +:10CD300001010101010101010101010101010101E3 +:10CD400001010101010101010101010101010101D3 +:10CD500001010101010101010101010101010101C3 +:10CD600001010101010101010101010101010101B3 +:10CD700001010101010101010101010101010100A4 +:10CD800000000000000000000000000000000002A1 +:10CD90000202020202020202020202020202020174 +:10CDA0000101010101010101010101010101010074 +:10CDB0000000000000000000000000000000000073 +:10CDC0000000000000000000000000000000000063 +:10CDD0000000000000000000000000000000000251 +:10CDE0000202020202020202020202020202020124 +:10CDF0000101010101010101010101010101010123 +:10CE00000101010101010101010101010101010112 +:10CE10000101010101010101010101010101010102 +:10CE200001010101010101010101010101010101F2 +:10CE300001010101010101010101010101010101E2 +:10CE400001010101010101010101010101010101D2 +:10CE500001010101010101010101010101010101C2 +:10CE600001010101010101010101010101010101B2 +:10CE700001010101010101010101010101010100A3 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000191 +:10CEA0000101010101010101010101010101010073 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0000000000000000000000000000000000250 +:10CEE0000202020202020202020202020202020123 +:10CEF0000101010101010101010101010101010122 +:10CF00000101010101010101010101010101010111 +:10CF10000101010101010101010101010101010101 +:10CF200001010101010101010101010101010101F1 +:10CF300001010101010101010101010101010101E1 +:10CF400001010101010101010101010101010101D1 +:10CF500001010101010101010101010101010101C1 +:10CF600001010101010101010101010101010101B1 +:10CF700001010101010101010101010101010101A1 +:10CF80000101010101010101010101010101010191 +:10CF90000101010101010101010101010101010181 +:10CFA0000101010101010101010101010101010072 +:10CFB0000000000000000000000000000000000170 +:10CFC0000101010101010101010101010101010151 +:10CFD0000101010101010101010101010101010042 +:10CFE0000000000000000000000000000000000140 +:10CFF0000101010101010101010101010101010121 +:10D000000101010101010101010101010101010110 +:10D010000101010101010101010101010101010100 +:10D0200001010101010101010101010101010101F0 +:10D0300001010101010101010101010101010101E0 +:10D0400001010101010101010101010101010101D0 +:10D0500001010101010101010101010101010101C0 +:10D0600001010101010101010101010101010101B0 +:10D0700001010101010101010101010101010101A0 +:10D080000101010101010101010101010101010190 +:10D090000101010101010101010101010101010180 +:10D0A0000101010101010101010101010101010170 +:10D0B0000101010101010101010101010101010160 +:10D0C0000101010101010101010101010101010150 +:10D0D0000101010101010101010101010101010041 +:10D0E000000000000000000000000000000000013F +:10D0F0000101010101010101010101010101010120 +:10D10000010101010101010101010101010101010F +:10D1100001010101010101010101010101010101FF +:10D1200001010101010101010101010101010101EF +:10D1300001010101010101010101010101010101DF +:10D1400001010101010101010101010101010101CF +:10D1500001010101010101010101010101010101BF +:10D1600001010101010101010101010101010101AF +:10D17000010101010101010101010101010101019F +:10D18000010101010101010101010101010101018F +:10D19000010101010101010101010101010101017F +:10D1A000010101010101010101010101010101016F +:10D1B000010101010101010101010101010101015F +:10D1C000010101010101010101010101010101014F +:10D1D0000101010101010101010101010101010040 +:10D1E000000000000000000000000000000000003F +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000020C +:10D2200002020202020202020202020202020202DE +:10D2300002020202020202020202020202020202CE +:10D2400002020202020202020202020202020202BE +:10D2500002020202020202020202020202020202AE +:10D26000020202020202020202020202020202029E +:10D27000020202020202020202020202020202028E +:10D28000020202020202020202020202020202027E +:10D29000020202020202020202020202020202026E +:10D2A000020202020202020202020202020202025E +:10D2B000020202020202020202020202020202024E +:10D2C000020202020202020202020202020202023E +:10D2D0000202020202020202020202020202020030 +:10D2E000000000000000000000000000000000003E +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000000000000000000002DB +:10D3500002020202020202020202020202020202AD +:10D36000020202020202020202020202020202029D +:10D37000020202020202020202020202020202008F +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000028B +:10D3A000020202020202020202020202020202005F +:10D3B000000000000000000000000000000000026B +:10D3C000020202020202020202020202020202023D +:10D3D000020202020202020202020202020202002F +:10D3E000000000000000000000000000000000003D +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000000000000000000310B +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000100010101E7 +:10D5400001000000000000000000000000000000DA +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000010101010101E4 +:10D6400001010000000000010000000000000000D7 +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000010000000000000000000008 +:10D7200000000000010000000000000000000000F8 +:10D7300000000000000000000000010101010101E3 +:10D7400001010100000000010000000000000000D5 +:10D7500000000000000000000000000000000000C9 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000049 +:10D7E0000000000000000000000000000000000039 +:10D7F0000000000000000000000000000000000029 +:10D800000000000000000000000000000000000018 +:10D810000000000001010000000000000000000006 +:10D8200000000001010101000000000000000000F4 +:10D8300000000000010000000000010101010101E1 +:10D8400001010100000000010000000000000000D4 +:10D8500000000000000000000000000000000000C8 +:10D8600000000000000000000000000000000000B8 +:10D8700000000000000000000000000000000000A8 +:10D880000000000000000000000000000000000098 +:10D890000000000000000000000000000000000088 +:10D8A0000000000000000000000000000000000078 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000000000000000000000058 +:10D8D0000000000000000000000000000000000048 +:10D8E0000000000000000000000000000000000038 +:10D8F0000000000001000000000000000000000027 +:10D900000000000000000000000000000000000017 +:10D910000000000101010100000000000000000003 +:10D9200000000001010101000000000000000000F3 +:10D9300000000001010101000001010101010101DC +:10D9400001010100000000010000000000000000D3 +:10D9500000000000000000000000000000000000C7 +:10D9600000000000000000000000000000000000B7 +:10D9700000000000000000010000000000000000A6 +:10D980000000000000000000000000000000000097 +:10D990000000000000000000000000000000000087 +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000047 +:10D9E0000000000000000000000000000000000037 +:10D9F0000000000101000000000000000000000025 +:10DA00000000000000000000000000000000000016 +:10DA10000000000101010100000000000000000002 +:10DA200000000101010101000000000000000000F1 +:10DA300000000001010101010101010101010101D9 +:10DA400001010100000000010000000000000000D2 +:10DA500000000000000000000000000000000000C6 +:10DA600000000000010000000000000000000000B5 +:10DA700000000000000000010000000000000000A5 +:10DA80000000000000000000000000000000000096 +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000000000000000000000000076 +:10DAB0000000000000000000000000000000000066 +:10DAC0000000000000000000000000000000000056 +:10DAD0000000000000000000000000000000000046 +:10DAE0000000000000000000000000000000000036 +:10DAF0000000000101000000000000000000000024 +:10DB00000000000000000000000000000000000015 +:10DB100000000101010101000000000000000001FF +:10DB200000010101010101000000000000000000EF +:10DB300000000101010101010101010101010101D7 +:10DB400001010100000000010000000000000000D1 +:10DB500000000000000000000000000000000000C5 +:10DB600000000001010101000000000000000000B1 +:10DB700000000000000000010000000000000000A4 +:10DB80000000000000010000000000000000000094 +:10DB90000000000000000000000000000000000085 +:10DBA0000000000000000000000000000000000075 +:10DBB0000000000000010000000000000000000064 +:10DBC0000000000000010100000000000000000053 +:10DBD0000000000000000000000000000000000045 +:10DBE0000000000000000000000000000000000035 +:10DBF0000000000101000000000000000000000023 +:10DC00000000000000000000000000000000000014 +:10DC100000010101010101000000000000000001FD +:10DC200000010101010101000000000000000001ED +:10DC300000010101010101010101010101010101D5 +:10DC400001010100000000010000000000000000D0 +:10DC500000000000000000000000000000000000C4 +:10DC600000000001010101000000000000000000B0 +:10DC700000000000000000010000000000000000A3 +:10DC80000000000000010000000000000000000093 +:10DC90000000000000010000000000000000000083 +:10DCA0000000000000000000000000000000000074 +:10DCB0000000000001010000000000000000000062 +:10DCC0000000000001010100000000000000000051 +:10DCD0000000000000000000000000000000000044 +:10DCE0000000000000000000000000000000000034 +:10DCF0000000000101000000000000000000000022 +:10DD00000000000000000000000000000000000013 +:10DD100000010101010101000000000101010001F9 +:10DD200001010101010101000000000000000001EB +:10DD300000010101010101010101010101010101D4 +:10DD400001010100000000010000000000000000CF +:10DD500000000000000000000000000000000000C3 +:10DD600000000001010101000000000000000000AF +:10DD700000020000000000010000000000000000A0 +:10DD80000000000000010000000000000000000092 +:10DD90000000000001010000000000000000000081 +:10DDA0000000000000000000000000000000000073 +:10DDB000000000010101010000000000000000005F +:10DDC000000000010101010000000000000000004F +:10DDD0000000000000000000000000000000000043 +:10DDE0000000000000000000000000000000000033 +:10DDF0000000000101000000000000000000000021 +:10DE0000000000000000000000000001010000010F +:10DE100001010101010101010000000101010001F6 +:10DE200001010101010101000000000101010001E7 +:10DE300001010101010101010101010101010101D2 +:10DE400001010100000000010000000000000000CE +:10DE500000000000000100000000000100000000C0 +:10DE600000010001010101000000000000000000AD +:10DE7000000200000000000100000000000000009F +:10DE80000000000001010000000000000000000090 +:10DE9000000000010101000000000000000000007F +:10DEA0000000000000000000000000000000000072 +:10DEB000000000010101010000000001000000005D +:10DEC000000000010101010000000000000000004E +:10DED0000000000000000000000000000000000042 +:10DEE0000000000000000000000000000000000032 +:10DEF0000000000101000000000000000000000020 +:10DF0000000000000000000000000001010000010E +:10DF100001010101010101010000000101010101F4 +:10DF200001010101010101000000000101010001E6 +:10DF300001010101010101010101010101010101D1 +:10DF400001010100000100010000000000000000CC +:10DF500000000000010100000000000100000000BE +:10DF600000010101010101000000000000000000AB +:10DF7000020200000000000100000000000000009C +:10DF8000000000000101000000000000000000008F +:10DF9000000000010101000000000000000000007E +:10DFA000000000000001010000000000000000006F +:10DFB000000000010101010000000001000000005C +:10DFC000000000010101010000000000000000004D +:10DFD000000000000001010000000000000000003F +:10DFE0000000000000000100000000000000000030 +:10DFF000000000010100000000000000000000001F +:10E00000000000000000000000000001010100010C +:10E0100001010101010101010100010101010101F1 +:10E0200001010101010101000000000101010101E4 +:10E0300001010101010101010101010101010101D0 +:10E0400001010100010100010000000000000000CA +:10E0500000000001010101000000000101000001B9 +:10E0600000010101010101000000000000000000AA +:10E07000020100000000000100000000000000009C +:10E08000000000000101000000000000000000008E +:10E09000000000010101010000000000000000007C +:10E0A000000000000101010000000000000000006D +:10E0B000000000010101010000000001000000005B +:10E0C000000100010101010000000000000000004B +:10E0D000000000000101010000000000000000003D +:10E0E000000000000000010000000000000000002F +:10E0F000000000010100000000000000000000001E +:10E10000000000000000000001000001010100010A +:10E1100001010101010101010101010101010101EF +:10E1200001010101010101000100010101010101E1 +:10E1300001010101010101010101010101010101CF +:10E1400001010101010101010000000000000000C7 +:10E1500000000001010101000100000101000001B7 +:10E1600000010101010101000000000002020000A5 +:10E17000020100000000000100000000000000009B +:10E180000000000001010000000000000002000289 +:10E190000200000101010100000000000000000079 +:10E1A000000000010101010000000000000000006B +:10E1B000000000010101010000000001000000005A +:10E1C0000001010101010100000000000000000049 +:10E1D000000000010101010000000000000000003B +:10E1E000000000000001010000000000000000002D +:10E1F000000000010100000000000000000000001D +:10E200000000000000000000010000010101000109 +:10E2100001010101010101010101010101010101EE +:10E2200001010101010101000101010101010101DF +:10E2300001010101010101010101010101010101CE +:10E2400001010101010101010000000000000000C6 +:10E2500000000001010101000100000101010001B5 +:10E2600001010101010101000000000002020000A3 +:10E27000010100000001000100000000000000009A +:10E280000000000001010000000000000002000288 +:10E290000200000101010100000000010000000077 +:10E2A0000001000101010100000000000000000069 +:10E2B0000000000101010100000000010101000156 +:10E2C0000101010101010100000000000000000047 +:10E2D000000000010101010000000000000000003A +:10E2E000000000000101010000000000000000002B +:10E2F000000000010100000000000000000000001C +:10E300000000000000000001010001010101000106 +:10E3100001010101010101010101010101010101ED +:10E3200001010101010101010101010101010101DD +:10E3300001010101010101010101010101010201CC +:10E3400001010101010101010000000100000000C4 +:10E3500000000001010101000100010101010001B3 +:10E36000010101010101010000020002010102029C +:10E370000101000000010001000000000000000099 +:10E380000000000101010100000000000001000187 +:10E390000101000101010100000000010000000076 +:10E3A0000001010101010100000000000000000067 +:10E3B0000000000101010100010001010101000153 +:10E3C0000101010101010100000000000000000046 +:10E3D0000000000101010100000000000000000039 +:10E3E0000000000101010100000000000000000029 +:10E3F000000000010100000000000000000000001B +:10E400000000000000000001010001010101000105 +:10E4100001010101010101010101010101010101EC +:10E4200001010101010101010101010101010101DC +:10E4300001010101010101010101020201020202C7 +:10E4400002010101010101020000000100000000C1 +:10E4500000000001010101000101010101010001B1 +:10E460000101010101010101000102020101020299 +:10E470000101020000010002000000000002000291 +:10E480000200000101010100000000000001000184 +:10E490000101000101010100000000010100000173 +:10E4A0000101010101010100000000000000000065 +:10E4B000000100010101010001010101010101014F +:10E4C0000101010101010100000000010100000043 +:10E4D0000000000101010100000000010100000036 +:10E4E0000000000101010100000000000000000028 +:10E4F000000000010100000000000000000000001A +:10E500000000000000000001010001010101000104 +:10E5100001010101010101010101010101010101EB +:10E5200001010101010101010101010101010101DB +:10E5300001010101010101020102020202020202C3 +:10E5400002010101010101020000000100000000C0 +:10E5500000000001010101010101010101010001AF +:10E56000010101010101010100010101010102029A +:10E570000101010001010002000000000002000290 +:10E580000200010101010100000000000101000181 +:10E590000101000101010100010000010100000171 +:10E5A0000101010101010100010000000000000063 +:10E5B000000100010101010101010101010101014D +:10E5C0000101010101010100000000010100000042 +:10E5D0000000010101010100000000010100000034 +:10E5E0000000000101010100010000000000000026 +:10E5F000000000000001000000000000000000001A +:10E600000000000000010001010001010101000102 +:10E6100001010101010101010101010101010101EA +:10E6200001010101010101010101010101010101DA +:10E6300001010101010101020202020202020202C1 +:10E6400002020201010101020100000100000000BC +:10E6500000000101010101010101010101010101AC +:10E66000010101010101010100010101010101019B +:10E670000101010001010002000000000001000191 +:10E680000101010101010100000000000101000180 +:10E69000010100010101010001000001010100016F +:10E6A0000101010101010100010000000000000062 +:10E6B000000100010101010101010101010101014C +:10E6C0000101010101010100000000010101000040 +:10E6D0000001010101010100000000010101010030 +:10E6E0000001000101010100010000000000000024 +:10E6F0000000000000010000000000000000000019 +:10E700000000000100010001010001010101000100 +:10E7100001010101010101010101010101010101E9 +:10E7200001010101010101010101010101010101D9 +:10E7300001010101010101020202020202020202C0 +:10E7400002020201010101020100000100000000BB +:10E7500000000101010101010101010101010101AB +:10E76000010101010101010100010101010101019A +:10E77000010101000101000200000000000102018E +:10E78000010101010101010000000000010100017F +:10E79000010100010101010101000101010100016C +:10E7A0000101010101010100010001000000000060 +:10E7B000000101010101010101010101010101014A +:10E7C000010101010101010001000001010100003E +:10E7D000000101010101010001000001010101002E +:10E7E0000001010101010100010000010000000021 +:10E7F0000000000000010000000000000000000018 +:10E8000000000001000100010100010101010101FE +:10E8100001010202020201010101010101010101E4 +:10E8200001010101010101010101010101010101D8 +:10E8300001010101010101020202020202020202BF +:10E8400002020201010101020100000100000000BA +:10E8500000000101010101010101010101010101AA +:10E860000101010101010101000101010101010199 +:10E870000101010101010102000100010101020188 +:10E88000010101010101010000000000010100017E +:10E890000101000101010101010101010101010169 +:10E8A000010101010101010001000100000100005E +:10E8B0000001010101010101010101010101010149 +:10E8C000010101010101010001010001010100013B +:10E8D000000101010101010001010001010101012B +:10E8E000010101010101010001000101000000001E +:10E8F0000000000000010000000000000000000017 +:10E9000000000001000100010100010202010102FA +:10E9100002020202020202020101010101010102DE +:10E9200001010202020101010101010101010101D4 +:10E9300001010101010101020202020202020202BE +:10E9400002020201010101020100000101000000B8 +:10E9500000000101010101010101010101010101A9 +:10E960000101010101010101000101010101010198 +:10E970000101010101010102000101010101010187 +:10E98000010101010101010000000000010100017D +:10E990000101000101010101010101010101010168 +:10E9A000010101010101010101000100000100005C +:10E9B0000001010101010101010101010101010148 +:10E9C0000101010101010101010101010101000138 +:10E9D0000001010101010101010101010101010128 +:10E9E0000101010101010100000101010001020119 +:10E9F0000000000000010000000200000001000013 +:10EA000000010001000100020200010202020102F5 +:10EA100002020202020202020101010202020202D9 +:10EA200002020202020202010101010101010102CE +:10EA300001010202020101020202020202020202BA +:10EA400002020201010101020100000101000000B7 +:10EA500000000101010101010101010101010101A8 +:10EA60000101010101010102000201010101010195 +:10EA70000101010101010102000101010101010186 +:10EA80000101010101020100010000000101010179 +:10EA90000101020202020101010101010101010162 +:10EAA0000101010101010101010101010101000058 +:10EAB0000001010101010101010101010101010147 +:10EAC0000101010101010101010101010101010136 +:10EAD0000101010101010101010101010101010126 +:10EAE0000101010101010100000101010001010119 +:10EAF0000000010000010000000200000001000011 +:10EB000000010101000100020200020202020102F2 +:10EB100002020202020202020202020202020202D5 +:10EB200002020202020202010101010202020202C9 +:10EB300002020202020202020202020202020202B5 +:10EB400002020201010101020100000101010000B5 +:10EB500000000101010101010101010201010101A6 +:10EB6000010101020201010200020201020201018F +:10EB70000201010101010102010101010101010183 +:10EB80000101010102020100010000000101010177 +:10EB90000101010202020101010101010101010162 +:10EBA0000101010101010101010101010101000057 +:10EBB0000001010202020101010101020101010142 +:10EBC0000101010101010101010101010101010135 +:10EBD0000101010101010101010101010101010125 +:10EBE0000101010101010100000101010101010117 +:10EBF000000101000001010000020000000202000B +:10EC000000010101010100020200020202020102F0 +:10EC100002020202020202020202020202020202D4 +:10EC200002020202020202020202020202020202C4 +:10EC300002020202020202020202020202020202B4 +:10EC400002020202020201020100000101010000B1 +:10EC500000000101010101010201010202010102A2 +:10EC60000102020202020202000202020202010189 +:10EC70000201020101010102010201010101010180 +:10EC80000101020102020100010000000202010272 +:10EC9000020201020202020101010101010101015E +:10ECA0000101010101010101010101010101000056 +:10ECB0000001010202020201010101020101010140 +:10ECC0000101010202020201010101010101010130 +:10ECD0000101010101010101010101010101010124 +:10ECE0000101010101010100000101010101010116 +:10ECF0000001010000010100000202000002020008 +:10ED000000010102010100020200020202020202ED +:10ED100002020202020202020202020202020202D3 +:10ED200002020202020202020202020202020202C3 +:10ED300002020202020202020202020202020202B3 +:10ED400002020202020202020100000201010000AE +:10ED5000000001020202010202020202020201029A +:10ED60000202020202020202000202020202020285 +:10ED70000202020101010102010202020202010279 +:10ED8000020202020202010001000001020202026C +:10ED9000020201020202020101010101010101015D +:10EDA0000101010101010101020101010101000054 +:10EDB0000001010202020202020202020202020237 +:10EDC000020202020202020101010101010101012C +:10EDD0000101010101010101010101010101010123 +:10EDE0000101010101010100000000000101010118 +:10EDF0000101010000010100000202000202020202 +:10EE000002020202010100020200020202020202E8 +:10EE100002020202020202020202020202020202D2 +:10EE200002020202020202020202020202020202C2 +:10EE300002020202020202020202020202020202B2 +:10EE400002020202020202020200000201010000AC +:10EE50000000010202020202020202020202020297 +:10EE60000202020202020202000202020202020284 +:10EE70000202020101020102010202020202020276 +:10EE80000202020202020200020001010202020268 +:10EE9000020201020202020101010101010101015C +:10EEA0000101010101010102020102010101000051 +:10EEB0000002010202020202020202020202020235 +:10EEC0000202020202020201010101020201010129 +:10EED000010101020202020101010102020102011B +:10EEE0000101010101010200000000000100000019 +:10EEF00001010100000101020202020102020202FC +:10EF000002020202010100020200020202020202E7 +:10EF100002020202020202020202020202020202D1 +:10EF200002020202020202020202020202020202C1 +:10EF300002020202020202020202020202020202B1 +:10EF400002020202020202020200000201010000AB +:10EF50000000020202020202020202020202020295 +:10EF60000202020202020202000202020202020283 +:10EF70000202020102020102020202020202020273 +:10EF80000202020202020200020001010202020267 +:10EF9000020201020202020101010102010101015A +:10EFA000010101010101010202020201010200004E +:10EFB0000002020202020202020202020202020233 +:10EFC0000202020202020202020201020202010124 +:10EFD0000101020202020202020201020202020115 +:10EFE0000101010202020200000000000000000016 +:10EFF00001010000000101020202020102020202FC +:10F0000002020202010200020200020202020202E5 +:10F0100002020202020202020202020202020202D0 +:10F0200002020202020202020202020202020202C0 +:10F0300002020202020202020202020202020202B0 +:10F0400002020202020202020200010202010000A8 +:10F050000000020202020202020202020202020294 +:10F060000202020202020202010202020202020281 +:10F070000202020202020102020202020202020271 +:10F080000202020202020202020002020202020262 +:10F090000202020202020202020101020201010254 +:10F0A0000202020202020202020202020202000143 +:10F0B0000102020202020202020202020202020231 +:10F0C0000202020202020202020202020202020220 +:10F0D0000102020202020202020202020202020211 +:10F0E0000202020202020200000000000000000012 +:10F0F00000000000000101020201020202020202FD +:10F1000002020202010200020200020202020202E4 +:10F1100002020202020202020202020202020202CF +:10F1200002020202020202020202020202020202BF +:10F1300002020202020202020202020202020202AF +:10F1400002020202020202020201010202020001A4 +:10F150000000020202020202020202020202020293 +:10F160000202020202020202010202020202020280 +:10F17000020202020202020202020202020202026F +:10F18000020202020202020202020202020202025F +:10F19000020202020202020202020202020202024F +:10F1A0000202020202020202020202020202000142 +:10F1B0000102020202020202020202020202020230 +:10F1C000020202020202020202020202020202021F +:10F1D000020202020202020202020202020202020F +:10F1E0000202020202020200000000000000000011 +:10F1F00000000000000101020201020202020202FC +:10F2000002020202010200020202020202020202E1 +:10F2100002020202020202020202020202020202CE +:10F2200002020202020202020202020202020202BE +:10F2300002020202020202020202020202020202AE +:10F2400002020202020202020201010202020001A3 +:10F250000000020202020202020202020202020292 +:10F26000020202020202020202020202020202027E +:10F27000020202020202020202020202020202026E +:10F28000020202020202020202020202020202025E +:10F29000020202020202020202020202020202024E +:10F2A0000202020202020202020202020202000141 +:10F2B000010202020202020202020202020202022F +:10F2C000020202020202020202020202020202021E +:10F2D000020202020202020202020202020202020E +:10F2E0000202020202020200000000000000000010 +:10F2F0000000000000010102020101020101010100 +:10F3000001020202020200020202020202020202E0 +:10F3100002020202020202020202020202020202CD +:10F3200002020202020202020202020202020202BD +:10F3300002020202020202020202020202020202AD +:10F3400002020202020202020202020202020001A0 +:10F350000001020202020202020202020202020290 +:10F36000020202020202020202020202020202027D +:10F37000020202020202020202020202020202026D +:10F38000020202020202020202020202020202025D +:10F39000020202020202020202020202020202024D +:10F3A000020202020202020202020202020200023F +:10F3B000020202020202020202020202020202022D +:10F3C000020202020202020202020202020202021D +:10F3D000020202020202020202020202020202020D +:10F3E000020202020202020000000000000000000F +:10F3F00000000002020201020201010201010101FA +:10F4000001020202020200020202020202020202DF +:10F4100002020202020202020202020202020202CC +:10F4200002020202020202020202020202020202BC +:10F4300002020202020202020202020202020202AC +:10F44000020202020202020202020202020200029E +:10F45000000102020202020202020202020202028F +:10F46000020202020202020202020202020202027C +:10F47000020202020202020202020202020202026C +:10F48000020202020202020202020202020202025C +:10F49000020202020202020202020202020202024C +:10F4A000020202020202020202020202020202023C +:10F4B000020202020202020202020202020202022C +:10F4C000020202020202020202020202020202021C +:10F4D000020202020202020202020202020202020C +:10F4E000020202020202020000000000000000000E +:10F4F00000000002020201020100010201010101FB +:10F5000001010101020200020202020202020202E1 +:10F5100002020202020202020202020202020202CB +:10F5200002020202020202020202020202020202BB +:10F5300002020202020202020202020202020202AB +:10F54000020202020202020202020202020202029B +:10F55000010102020202020202020202020202028D +:10F560000202020202020202020101010101020181 +:10F57000010201020202020202020202020202026D +:10F58000020202020202020202020202020202025B +:10F59000020202020202020202020202020202024B +:10F5A000020202020202020202020202020202023B +:10F5B000020202020202020202020202020202022B +:10F5C000020202020202020202020202020202021B +:10F5D000020202020202020202020202020202020B +:10F5E000020202020202020000000000000000000D +:10F5F00000000002020201020100010201010101FA +:10F6000001010101020200020202020202020202E0 +:10F6100002020202020202020202020202020202CA +:10F6200002020202020202020202020202020202BA +:10F6300002020202020202020202020202020202AA +:10F64000020202020202020202020202020202029A +:10F65000020202020202020202020202020202028A +:10F660000202020202020202020101010101020180 +:10F67000010201020202020202020202020202026C +:10F68000020202020202020202020202020202025A +:10F69000020202020202020202020202020202024A +:10F6A000020202020202020202020202020202023A +:10F6B000020202020202020202020202020202022A +:10F6C000020202020202020202020202020202021A +:10F6D000020202020202020202020202020202020A +:10F6E0000202020202020200000202020000000006 +:10F6F00000000002020202010100000200000000FE +:10F7000000010101020200020202020202020202E0 +:10F7100002020202020202020202020202020202C9 +:10F7200002020202020202020202020202020202B9 +:10F7300002020202020202020202020202020202A9 +:10F740000202020202020202020202020202020299 +:10F750000202020202020202020202020202020289 +:10F76000020202020202020202010101010102017F +:10F77000010201020202020202020202020202026B +:10F780000202020202020202020202020202020259 +:10F790000202020202020202020202020202020249 +:10F7A0000202020202020202020202020202020239 +:10F7B0000202020202020202020202020202020229 +:10F7C0000202020202020202020202020202020219 +:10F7D0000202020202020202020202020202020209 +:10F7E00002020202020202000202020200020202FD +:10F7F00000000002020202010100000100000000FE +:10F8000000010101020200020202020202020202DF +:10F8100002020202020202020202020202020202C8 +:10F8200002020202020202020202020202020202B8 +:10F8300002020202020202020202020202020202A8 +:10F840000202020202020202020202020202020298 +:10F850000202020202020202020202020202020288 +:10F86000020202020202020102020202020201027A +:10F87000020202020202020202010101010102016E +:10F88000010101020202020000000000000000006D +:10F890000000000000000002020202020202020256 +:10F8A0000202020202020202020202020202020238 +:10F8B0000202020202020202020202020202020228 +:10F8C0000202020202020202020202020202020218 +:10F8D0000202020202020202020202020202020208 +:10F8E00002020202020202000202020202020202FA +:10F8F00000000202020202010000000100000000FC +:10F9000000000000020200020202020202020202E1 +:10F9100002020202020202020202020202020202C7 +:10F9200002020202020202020202020202020202B7 +:10F9300002020202020202010101010102010101AF +:10F94000010202010101010202020202020202029C +:10F950000202020202020202020202020202020287 +:10F960000202020202020202010202020202020278 +:10F97000020102010101010002020202020202026E +:10F980000202020202020200000000000000000069 +:10F990000000000000000002020202020202020255 +:10F9A0000202020202020202020202020202020237 +:10F9B0000202020202020202020202020202020227 +:10F9C0000202020202020202020202020202020217 +:10F9D0000202020202020202020202020202020207 +:10F9E00002020202020202020202020202020202F7 +:10F9F00002020202020202010000000100000000F7 +:10FA000000000000020100010101010101010101EA +:10FA100001010101010101020202020202020202CD +:10FA200002020202020202020202020202020202B6 +:10FA300002020202020202020202020201020202A7 +:10FA40000201010202020201020202020202020299 +:10FA50000202020202020202020202020202020286 +:10FA60000202020202020201020202020202010278 +:10FA70000202020202020201000000000000010076 +:10FA80000000000000000000000000000000000076 +:10FA90000000000000000002020202020202020254 +:10FAA000020202020202020101010101010101013F +:10FAB000010101010101010202020202020202022D +:10FAC0000202020202020202020202020202020216 +:10FAD0000202020202020202020202020202020206 +:10FAE00002020202020202020202020202020202F6 +:10FAF00002020202020202000000000100000000F7 +:10FB000000000000010101020202020202020202E0 +:10FB100002020202020202000000000000000000D7 +:10FB200000000000000000020202020202020202C3 +:10FB300002020202020202000000000002000000B5 +:10FB400000020200000000020101010101010101A7 +:10FB5000010101010101010202020202020202028C +:10FB6000020202020202020101010101010101017E +:10FB70000101010101010101010101010101010175 +:10FB8000010101010101010000000000000001006D +:10FB90000000000000000002020202020202020253 +:10FBA0000202020202020202020202020202020235 +:10FBB0000202020202020202020202020202020225 +:10FBC0000202020202020202020202020202020215 +:10FBD0000202020202020202020202020202020205 +:10FBE00002020202020202020202020202020202F5 +:10FBF00002020202020202000000000000000000F7 +:10FC000000000000010101010101010101010101E8 +:10FC100001010101010101000000000000000000DD +:10FC200000000000000000000000000000000000D4 +:10FC300000000000000000010101010101010101BB +:10FC400001010100000000000202020202020202A1 +:10FC50000202020202020200000000000000000096 +:10FC6000000000000000000101010101010101018B +:10FC70000101010101010101010101010101010174 +:10FC80000101010101010101010101010101010164 +:10FC9000010101010101010202020202020202024B +:10FCA0000202020202020200000000000000000046 +:10FCB0000000000000000002020202020202020232 +:10FCC0000202020202020202020202020202020214 +:10FCD0000202020202020202020202020202020204 +:10FCE00002020202020202020202020202020202F4 +:10FCF00002020202020202000000000000000000F6 +:10FD000000000000010101010101010101010101E7 +:10FD100001010101010101010101010101010101D3 +:10FD200001010101010101000000000000000000CC +:10FD300000000000000000010101010101010101BA +:10FD400001010101010101010000000000000000AB +:10FD500000000000000000000000000000000000A3 +:10FD6000000000000000000101010101010101018A +:10FD70000101010101010101010101010101010173 +:10FD80000101010101010101010101010101010163 +:10FD9000010101010101010202020202020202024A +:10FDA0000202020202020200000000000000000045 +:10FDB0000000000000000002020202020202020231 +:10FDC0000202020202020202020202020202020213 +:10FDD0000202020202020202020202020202020203 +:10FDE00002020202020202020202020202020202F3 +:10FDF00002020202020202000000000000000000F5 +:10FE000000000000010001010101010101010101E7 +:10FE100001010101010101010101010101010101D2 +:10FE200001010101010101010101010101010101C2 +:10FE300001010101010101010101010101010101B2 +:10FE400001010101010101010101010101010101A2 +:10FE50000101010101010101010101010101010192 +:10FE60000101010101010101010101010101010182 +:10FE70000101010101010101010101010101010172 +:10FE80000101010101010101010101010101010162 +:10FE90000101010101010102020202020202020249 +:10FEA000020202020202020101010101010101013B +:10FEB0000101010101010101010101010101010132 +:10FEC000010101010101010000000000000000002B +:10FED0000000000000000000000000000000000022 +:10FEE0000000000000000002020202020202020200 +:10FEF00002020202020202010101010101010101EB +:10FF000001010101010101010101010101010101E1 +:10FF100001010101010101010101010101010101D1 +:10FF200001010101010101010101010101010101C1 +:10FF300001010101010101010101010101010101B1 +:10FF400001010101010101010101010101010101A1 +:10FF50000101010101010101010101010101010191 +:10FF60000101010101010101010101010101010181 +:10FF70000101010101010101010101010101010171 +:10FF80000101010101010101010101010101010161 +:10FF90000101010101010102020202020202020248 +:10FFA000020202020202020101010101010101013A +:10FFB0000101010101010101010101010101010131 +:10FFC0000101010101010101010101010101010121 +:10FFD000010101010101010000000000000000001A +:10FFE00000000000000000020202020202020202FF +:10FFF00002020202020202010101010101010101EA +:0200000290006C +:1000000001010101010101010101010101010101E0 +:1000100001010101010101010101010101010101D0 +:1000200001010101010101010101010101010101C0 +:1000300001010101010101010101010101010101B0 +:1000400001010101010101010101010101010101A0 +:100050000101010101010101010101010101010190 +:100060000101010101010101010101010101010180 +:100070000101010101010101010101010101010170 +:100080000101010101010101010101010101010160 +:100090000101010101010101010101010101010150 +:1000A0000101010101010101010101010101010140 +:1000B0000101010101010101010101010101010130 +:1000C0000101010101010101010101010101010120 +:1000D0000101010101010101010101010101010110 +:1000E00001010101010101020202020202020202F7 +:1000F00002020202020202010101010101010101E9 +:1001000001010101010101010101010101010101DF +:1001100001010101010101010101010101010101CF +:1001200001010101010101010101010101010101BF +:1001300001010101010101010101010101010101AF +:10014000010101010101010101010101010101019F +:10015000010101010101010101010101010101018F +:10016000010101010101010101010101010101017F +:10017000010101010101010101010101010101016F +:10018000010101010101010101010101010101015F +:10019000010101010101010101010101010101014F +:1001A000010101010101010101010101010101013F +:1001B000010101010101010101010101010101012F +:1001C000010101010101010101010101010101011F +:1001D000010101010101010101010101010101010F +:1001E0000101010101010100000000000000000008 +:1001F00000000000000000010101010101010101F6 +:1002000001010101010101010101010101010101DE +:1002100001010101010101010101010101010101CE +:1002200001010101010101010101010101010101BE +:1002300001010101010101010101010101010101AE +:10024000010101010101010101010101010101019E +:10025000010101010101010101010101010101018E +:10026000010101010101010101010101010101017E +:10027000010101010101010101010101010101016E +:10028000010101010101010101010101010101015E +:10029000010101010101010101010101010101014E +:1002A000010101010101010101010101010101013E +:1002B000010101010101010101010101010101012E +:1002C000010101010101010101010101010101011E +:1002D000010101010101010101010101010101010E +:1002E0000101010101010100000000000000000007 +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000020202020202020202AB +:10034000020202020202020202020202020202028D +:10035000020202020202020202020202020202027D +:10036000020202020202020202020202020202026D +:10037000020202020202020202020202020202025D +:10038000020202020202020202020202020202024D +:10039000020202020202020202020202020202023D +:1003A000020202020202020202020202020202022D +:1003B000020202020202020202020202020202021D +:1003C000020202020202020202020202020202020D +:1003D00002020202020202020202020202020202FD +:1003E00002020202020202000000000000000000FF +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000202020202020202027A +:10047000020202020202020202020202020202025C +:10048000020202020202020202020202020202024C +:10049000020202020202020000000000000000004E +:1004A000000000000000000202020202020202023A +:1004B000020202020202020202020202020202021C +:1004C000020202020202020202020202020202020C +:1004D00002020202020202020202020202020202FC +:1004E00002020202020202000000000000000000FE +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:1005300000000000000000000000000000000000BB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000000000000000003B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000300000000000000000CB +:1006000000000000000000000000000000000000EA +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000000000000000000000BA +:1006400000000000000000000000000000000000AA +:100650000000000000000000000001000001010097 +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:100680000000000000000000000000000001010068 +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C0000000000000000000000000000000010029 +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000000000000FA +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000010001000101010094 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000001010000000001010065 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000010028 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000010008 +:1007F00000000000000001000000000000000000F8 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000000B8 +:1008400000000000000001000000000000000000A7 +:100850000000000000010100010001010101010090 +:100860000000000000000000000001000001010085 +:100870000000000000000000000000000000000078 +:100880000000000000010101010000000001010062 +:100890000000000000000000000000000000000058 +:1008A0000000000000000000000000000000010047 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000100000000000001010025 +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000010007 +:1008F00000000000000001010000000000000000F6 +:1009000001000000000000000001000000000000E5 +:1009100000000000000000000000000000000000D7 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000000000000000000000B7 +:1009400000000000000001000000000000000000A6 +:10095000000100000001010101010101010101008C +:100960000000000000000001010001000101010081 +:100970000000000000000000000000000000000077 +:10098000000000010001010101010000010101005E +:100990000000000000000000000000000000000057 +:1009A0000000000000000000010100000000010044 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000100010100000101010021 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000100000000000001010004 +:1009F00000000000000001010000000000010001F3 +:100A000001000000010000000001010100000000E1 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000000000000000000000C6 +:100A300000000000000000000000000000000000B6 +:100A400000000000000001000000000000010100A3 +:100A5000000100000101010101010101010101008A +:100A6000000000000001010101000100010101007E +:100A70000000000000000000000000000000000076 +:100A8000000001010001010101010101010101005A +:100A90000000000000000000000000000000000056 +:100AA0000000000000000100010100000001010041 +:100AB0000000000000000000000000000000000036 +:100AC000000000000000010001010101010101001E +:100AD0000000000000000000000000000000000016 +:100AE0000000000000000100010000000001010002 +:100AF00000000000000001010100000000010001F1 +:100B000001000000010000000001010100000000E0 +:100B100000000000000000000000000000010100D3 +:100B200000000000000000000000000000010100C3 +:100B300000000000000000000000000000000000B5 +:100B400000000000000001010100000000010100A0 +:100B50000101000101010101010101010101010087 +:100B6000000100000001010101010100010101007B +:100B70000000000000000000000000000000000075 +:100B80000001010100010101010101010101010058 +:100B90000000000000000000000000000000000055 +:100BA000000000000000010101010000010101003E +:100BB0000000000000000000000000000000000035 +:100BC000000000000000010101010101010101001C +:100BD0000000000000000000000000000000000015 +:100BE0000000000000000100010000000001010001 +:100BF00000000000000001010100000000010001F0 +:100C000001000000010100000001010100000000DE +:100C100000000000000000000100000001010100D0 +:100C200000000000000000000100000001010100C0 +:100C300000000000000000000000000000000000B4 +:100C4000000000000000010101000000000101009F +:100C50000101010101010101010101010101010085 +:100C60000001010000010101010101010101010078 +:100C70000000000000000000000000000000000074 +:100C80000001010101010101010101010101010056 +:100C90000000000000000000000000000000000054 +:100CA000000000000001010101010101010101003A +:100CB0000000000000000000000000000001010032 +:100CC000000000000001010101010101010101001A +:100CD0000000000000000000000000000000000014 +:100CE00000000000000001000101000001010100FE +:100CF00000000000000001010101000001010001ED +:100D000001010001010100000001010101000000DA +:100D100000000000000001000100010001010100CD +:100D200000000000000001000100010101010100BC +:100D300000000000000000000000000000000000B3 +:100D4000000000010000010101000000010101009C +:100D50000101010101010101010101010101010084 +:100D60000001010100010101010101010101010076 +:100D70000000000000000000000000000000000073 +:100D80000101010101010101010101010101010054 +:100D90000000000000000000000000000000000053 +:100DA0000001000100010101010101010101010037 +:100DB0000000000000000000010000000001010030 +:100DC0000001000100010101010101010101010017 +:100DD0000000000000000000000000000000000013 +:100DE00000000000000001000101010101010100FB +:100DF00000000000000001010101010101010002E9 +:100E000002010101010100000001010101000000D7 +:100E100000000000000001010101010001010100CA +:100E200000000000000001010101010101010100B9 +:100E300000000000000000000000000000010100B0 +:100E40000000010100010101010000010101010197 +:100E50000101010101010101010101010101010083 +:100E60000001010101010101010101010101010074 +:100E70000000000000000000000000000000000171 +:100E80000101010101010101010101010101010053 +:100E90000000000000000100000000000000010050 +:100EA0000001010101010101010101010101010034 +:100EB000000000000000010001000000000101002E +:100EC0000001010101010101010101010101010014 +:100ED0000000000000000000000000000000000012 +:100EE00000000000000001010101010101010100F9 +:100EF00000000000000001010101010101010002E8 +:100F000002010101020100000001010101000000D5 +:100F100000000000000101010101010101010101C6 +:100F200000000000000101010101010101010100B7 +:100F300000000000000000000100000000010100AE +:100F40000001010100010101010100010101010194 +:100F50000101010101010101010101010101010082 +:100F60000101010101010101010101010101010072 +:100F7000000000000000000000000000000101016E +:100F80000101010101010101010101010101010052 +:100F9000000000000000010001000000000001004E +:100FA0000101010101010101010101010101010032 +:100FB000000000000000010101010000010101002A +:100FC0000101010101010101010101010101010012 +:100FD0000000000000000000000000000000010010 +:100FE00000000100000101010101010101010100F6 +:100FF00000000000000101010101010101010002E6 +:1010000002010101020100000001010101000000D4 +:1010100000010001000101010101010101010101C3 +:1010200000000001000101010101010101010100B5 +:1010300000000000000001000100000100010100AB +:101040000001010100010101010101010101010192 +:101050000101010101010101010101010101010081 +:101060000101010101010101010101010101010071 +:10107000000000000000000001000000000101016C +:101080000101010101010101010101010101010051 +:10109000000000000001010001000000000101014A +:1010A0000101010101010101010101010101010031 +:1010B0000000000000000101010101010101010126 +:1010C0000101010101010101010101010101010011 +:1010D000000000000000000000000000000001000F +:1010E00000000101000101010101010101010100F4 +:1010F00000010001000101010101010101010002E3 +:1011000002010101020100010001010101000000D2 +:1011100000010101000101010101010101010101C1 +:1011200000000101000101010101010101010100B3 +:1011300001000001000001000100000101010100A7 +:101140000101010100010101010101010101010190 +:101150000101010101010101010101010101010080 +:101160000101010101010101010101010101010070 +:10117000000000000000010001000000000101016A +:101180000101010101010101010101010101010050 +:101190000000000000010100010000000101010148 +:1011A0000101010101010101010101010101010030 +:1011B0000000000000000101010101010101010125 +:1011C0000101010101010101010101010101010010 +:1011D000000000000000000000000000000101000D +:1011E00000000101000101010101010101010100F3 +:1011F00000010101010101010101010101010002E0 +:1012000002020202020200010002020201000000CA +:1012100000010101000101010101010101010101C0 +:1012200000010101000101010101010101010101B0 +:1012300001000101000101000100010101010100A3 +:10124000010101010101010101010101010101018E +:10125000010101010101010101010101010101017E +:10126000010101010101010101010101010101006F +:101270000000000000000101010000000101010167 +:10128000010101010101010101010101010101004F +:101290000000000000010100010001010101010145 +:1012A000010101010101010101010101010101002F +:1012B0000000000001010101010101010101010122 +:1012C000010101010101010101010101010101000F +:1012D000000000000000000001000000000101000B +:1012E00000010101000101010101010101010100F1 +:1012F00001010101010101010101010101010002DE +:1013000002020202020200010002020201000000C9 +:1013100000010101010101010101010101010101BE +:1013200000010101010101010101010101010101AE +:10133000010101010001010101010101010101009F +:10134000010101010101010101010101010101018D +:10135000010101010101010101010101010101017D +:10136000010101010101010101010101010101006E +:101370000000000000000101010001010101010164 +:10138000010101010101010101010101010101004E +:101390000001000000010101010101010101010141 +:1013A000010101010101010101010101010101002E +:1013B0000000000101010101010101010101010120 +:1013C000010101010101010101010101010101000E +:1013D0000000000000000100010000000001010009 +:1013E00000010101010101010101010101010100EF +:1013F00001010101010100000101010101010002DF +:1014000002020202020200010102020201000000C7 +:1014100001010101010101010101010101010101BC +:1014200001010101010101010101010101010101AC +:10143000010101010101010101010101010101019C +:10144000010101010101010101010101010101018C +:10145000010101010101010101010101010101017C +:10146000010101010101010101010101010101006D +:101470000000000000000101010101010101010162 +:10148000010101010101010101010101010101004D +:101490000001000000010101010101010101010140 +:1014A000010101010101010101010101010101002D +:1014B000000000010101010101010101010101011F +:1014C000010101010101010101010101010101000D +:1014D0000000000000000101010100000101010005 +:1014E00001010101010101010101010101010100ED +:1014F00001010101010100000101010101000002DF +:1015000002020202020200010102020202000001C4 +:1015100001010101010101010101010101010101BB +:1015200001010101010101010101010101010101AB +:10153000010101010101010101010101010101019B +:10154000010101010101010101010101010101018B +:10155000010101010101010101010101010101017B +:10156000010101010101010101010101010101006C +:101570000000000000010101010101010101010160 +:10158000010101010101010101010101010101004C +:10159000000100010001010101010101010101013E +:1015A000010101010101010101010101010101002C +:1015B000000100010101010101010101010101011D +:1015C000010101010101010101010101010101000C +:1015D0000000000000000101010101010101010101 +:1015E00001010101010101010101010101010100EC +:1015F00001010101010100000000000000000002E3 +:1016000002020202020200010102020202000001C3 +:1016100001010101010101010101010101010101BA +:1016200001010101010101010101010101010101AA +:10163000010101010101010101010101010101019A +:10164000010101010101010101010101010101018A +:10165000010101010101010101010101010101017A +:10166000010101010101010101010101010101006B +:10167000000100010001010101010101010101015D +:10168000010101010101010101010101010101004B +:10169000000101010001010101010101010101013C +:1016A000010101010101010101010101010101002B +:1016B000000100010101010101010101010101011C +:1016C000010101010101010101010101010101000B +:1016D0000000000000000101010101010101010100 +:1016E00001010101010101010101010101010100EB +:1016F00000000000000000000000000000000002E8 +:1017000002020202020201020102020202000001C0 +:1017100001010101010101010101010101010101B9 +:1017200001010101010101010101010101010101A9 +:101730000101010101010101010101010101010199 +:101740000101010101010101010101010101010189 +:101750000101010101010101010102010101010178 +:101760000101010101010101010102010101010069 +:10177000000101010001010101010101010101015B +:10178000010101010101010101010101010101004A +:10179000010101010001010101010101010101013A +:1017A000010101010101010101010101010101002A +:1017B000000100010101010101010101010101011B +:1017C000010101010101010101010101010101000A +:1017D00000000100000101010101010101010101FD +:1017E00001010101010101010101010101010100EA +:1017F00000000000000000000000000000000102E6 +:1018000002020202020201020102020202000001BF +:1018100001010101010101010101010101010102B7 +:1018200001010101010101010101010101010101A8 +:101830000101010101010101010101010101010198 +:101840000101010101010201010101010101010187 +:101850000202010102020101010102020202010170 +:101860000102020101020102010102010202010062 +:101870000101010100010101010101010101010159 +:101880000101010101010101010101010101010148 +:101890000101010101010101010101010101010138 +:1018A0000101010101010101010101010101010128 +:1018B0000001010101010101010101010101010119 +:1018C0000101010101010101010101010101010009 +:1018D00000010101000101010101010101010101FA +:1018E00001010101010101010101010101010100E9 +:1018F00000000000000000000000000000000102E5 +:1019000002020202020201020102020202010001BD +:1019100001010101010101010101020102020102B3 +:1019200001010101010101010101020202020102A2 +:101930000201010101010101010101010101010196 +:101940000101020201010202010101010102010281 +:101950000202020202020202020202020202020168 +:101960000202020202020202020202020202020158 +:101970000101010101010101010101010101010157 +:101980000101020201020102010101010102010142 +:101990000101010101010101010101010101010137 +:1019A0000101010101010101010101010101010127 +:1019B0000101010101010101010101010101010117 +:1019C0000101010101010101010101010101010008 +:1019D00000010101000101010101010101010101F9 +:1019E00001010101010102010101010101020200E5 +:1019F00000000000000000000000000000000102E4 +:101A000002020202020201020102020202010001BC +:101A100001020202010202020202020202020202A8 +:101A20000101020201020202020202020202020299 +:101A30000201020201010101010101020102010191 +:101A40000202020201020202020101020202020279 +:101A50000202020202020202020202020202020266 +:101A60000202020202020202020202020202020157 +:101A70000101010101010101010101010101010255 +:101A80000202020202020202020202020202020137 +:101A90000101010101010101010101010101010136 +:101AA0000101010101010101010101010101010126 +:101AB0000101010101010101010101010101010116 +:101AC0000101010101010201010202020202020000 +:101AD00001010101000101010101010101010101F7 +:101AE00001010201010102010202020202020200DE +:101AF00000000000000000000000000000000102E3 +:101B000002020202020201020102020202010002BA +:101B100002020202020202020202020202020202A5 +:101B20000202020202020202020202020202020295 +:101B30000202020202020201020102020202020287 +:101B40000202020202020202020202020202020275 +:101B50000202020202020202020202020202020265 +:101B60000202020202020202020202020202020156 +:101B70000101010101010101010101010101010254 +:101B80000202020202020202020202020202020136 +:101B90000101010101010101010101010101010135 +:101BA0000101010101010101010201010101010124 +:101BB0000101010101010101010101010102010213 +:101BC00002020202020202020202020202020201F6 +:101BD00001010101000101010101010101010101F6 +:101BE00001010202010202020202020202020200DA +:101BF00000000000000000000000000000000102E2 +:101C000002020202020201020202020202010002B8 +:101C100002020202020202020202020202020202A4 +:101C20000202020202020202020202020202020294 +:101C30000202020202020202020202020202020284 +:101C40000202020202020202020202020202020274 +:101C50000202020202020202020202020202020264 +:101C60000202020202020202020202020202020155 +:101C70000101010101010101010101010102010252 +:101C80000202020202020202020202020202020135 +:101C90000101010101020201010101010101010231 +:101CA0000202020202020202020202020202020115 +:101CB0000101010102010202020202020202020209 +:101CC00002020202020202020202020202020201F5 +:101CD00001010101000101010101010101010102F4 +:101CE00002020202020202020202020202020200D6 +:101CF00000000000000000000000000000000102E1 +:101D000002020202020202020202020202020002B5 +:101D100002020202020202020202020202020202A3 +:101D20000202020202020202020202020202020293 +:101D30000202020202020202020202020202020283 +:101D40000202020202020202020202020202020273 +:101D50000202020202020202020202020202020263 +:101D60000202020202020202020202020202020154 +:101D7000010101010101020202010202020202024A +:101D80000202020202020202020202020202020134 +:101D90000102010101020201020102020202020229 +:101DA0000202020202020202020202020202020114 +:101DB0000101010202020202020202020202020206 +:101DC00002020202020202020202020202020201F4 +:101DD00001010101010101010101010101010102F2 +:101DE00002020202020202020202020202020200D5 +:101DF00000000000000000000000000000000101E1 +:101E000001020202010202020202020202020002B6 +:101E100002020202020202020202020202020202A2 +:101E20000202020202020202020202020202020292 +:101E30000202020202020202020202020202020282 +:101E40000202020202020202020202020202020272 +:101E50000202020202020202020202020202020262 +:101E60000202020202020202020202020202020252 +:101E70000202020201020202020202020202020243 +:101E80000202020202020202020202020202020232 +:101E90000202020201020202020202020202020223 +:101EA0000202020202020202020202020202020212 +:101EB0000102010202020202020202020202020204 +:101EC00002020202020202020202020202020201F3 +:101ED00001010101010101010101010101010102F1 +:101EE00002020202020202020202020202020200D4 +:101EF00000000000000000000000000000000101E0 +:101F000001010101010102020202020202020002B9 +:101F100002020202020202020202020202020202A1 +:101F20000202020202020202020202020202020291 +:101F30000202020202020202020202020202020281 +:101F40000202020202020202020202020202020271 +:101F50000202020202020202020202020202020261 +:101F60000202020202020202020202020202020251 +:101F70000202020202020202020202020202020241 +:101F80000202020202020202020202020202020231 +:101F90000202020202020202020202020202020221 +:101FA0000202020202020202020202020202020211 +:101FB0000202020202020202020202020202020201 +:101FC00002020202020202020202020202020201F2 +:101FD00001010101010101010101010101020202EE +:101FE00002020202020202020202020202020200D3 +:101FF00000000000000000000000000000000101DF +:1020000001010101010102020201010102020002BB +:1020100002020202020202020202020202020202A0 +:102020000202020202020202020202020202020290 +:102030000202020202020202020202020202020280 +:102040000202020202020202020202020202020270 +:102050000202020202020202020202020202020260 +:102060000202020202020202020202020202020250 +:102070000202020202020202020202020202020240 +:102080000202020202020202020202020202020230 +:102090000202020202020202020202020202020220 +:1020A0000202020202020202020202020202020210 +:1020B0000202020202020202020202020202020200 +:1020C00002020202020202020202020202020201F1 +:1020D00001010201010102020202020202020202E5 +:1020E00002020202020202020202020202020200D2 +:1020F00000000000000000000000000000000101DE +:1021000001010101010102010201010101020002BC +:10211000020202020202020202020202020202029F +:10212000020202020202020202020202020202028F +:10213000020202020202020202020202020202027F +:10214000020202020202020202020202020202026F +:10215000020202020202020202020202020202025F +:10216000020202020202020202020202020202024F +:10217000020202020202020202020202020202023F +:10218000020202020202020202020202020202022F +:10219000020202020202020202020202020202021F +:1021A000020202020202020202020202020202020F +:1021B00002020202020202020202020202020202FF +:1021C00002020202020202020202020202020202EF +:1021D00002020202010202020202020202020202E0 +:1021E00002020202020202020202020202020200D1 +:1021F00000000000000002020000000000000101D9 +:1022000001010101010102010201010101020002BB +:10221000020202020202020202020202020202029E +:10222000020202020202020202020202020202028E +:10223000020202020202020202020202020202027E +:10224000020202020202020202020202020202026E +:10225000020202020202020202020202020202025E +:10226000020202020202020202020202020202024E +:10227000020202020202020202020202020202023E +:10228000020202020202020202020202020202022E +:10229000020202020202020202020202020202021E +:1022A000020202020202020202020202020202020E +:1022B00002020202020202020202020202020202FE +:1022C00002020202020202020202020202020202EE +:1022D00002020202010202020202020202020202DF +:1022E00002020202020202020202020202020200D0 +:1022F00000000000000002020000000000020201D5 +:1023000001010101010102010201010101010002BB +:10231000020202020202020202020202020202029D +:10232000020202020202020202020202020202028D +:10233000020202020202020202020202020202027D +:10234000020202020202020202020202020202026D +:10235000020202020202020202020202020202025D +:10236000020202020202020202020202020202024D +:10237000020202020202020202020202020202023D +:10238000020202020202020202020202020202022D +:10239000020202020202020202020202020202021D +:1023A000020202020202020202020202020202020D +:1023B00002020202020202020202020202020202FD +:1023C00002020202020202020202020202020202ED +:1023D00002020202020202020202020202020202DD +:1023E00002020202020202020202020202020200CF +:1023F00000000000000002020202020202020200CB +:1024000000010101010102010201010101010002BB +:10241000020202020202020202020202020202029C +:10242000020202020202020202020202020202028C +:10243000020202020202020202020202020202027C +:10244000020202020202020202020202020202026C +:10245000020202020202020202020202020202025C +:10246000020202020202020202020202020202024C +:10247000020202020202020202020202020202023C +:10248000020202020202020202020202020202022C +:10249000020202020202020202020202020202021C +:1024A000020202020202020202020202020202020C +:1024B00002020202020202020202020202020202FC +:1024C00002020202020202020202020202020202EC +:1024D00002020202020202020202020202020202DC +:1024E00002020202020202020202020202020200CE +:1024F00002020202020202020202020202020200BE +:1025000000010101010101010101010101010002BC +:10251000020202020202020202020202020202029B +:10252000020202020202020202020202020202028B +:10253000020202020202020202020202020202027B +:10254000020202020202020202020202020202026B +:10255000020202020202020202020202020202025B +:10256000020202020202020202020202020202024B +:10257000020202020202020202020202020202023B +:10258000020202020202020202020202020202022B +:10259000020202020202020202020202020202021B +:1025A000020202020202020202020202020202020B +:1025B00002020202020202020202020202020202FB +:1025C00002020202020202020202020202020202EB +:1025D00002020202020202020202020202020202DB +:1025E00002020202020202020202020202020200CD +:1025F00002020202020202020202020202020200BD +:1026000000000000000001000100000000010002C5 +:10261000020202020202020202020202020202029A +:10262000020202020202020202020202020202028A +:10263000020202020202020202020202020202027A +:10264000020202020202020202020202020202026A +:10265000020202020202020202020202020202025A +:10266000020202020202020202020202020202024A +:10267000020202020202020202020202020202023A +:10268000020202020202020202020202020202022A +:10269000020202020202020202020202020202021A +:1026A000020202020202020202020202020202020A +:1026B00002020202020202020202020202020202FA +:1026C00002020202020202020202020202020202EA +:1026D00002020202020202020202020202020202DA +:1026E00002020202020202020202020202020200CC +:1026F00002020202020202020202020202020200BC +:1027000000000000000001000100000000000002C5 +:102710000202020202020202020202020202020299 +:102720000202020202020202020202020202020289 +:102730000202020202020202020202020202020279 +:102740000202020202020202020202020202020269 +:102750000202020202020202020202020202020259 +:102760000202020202020202020202020202020249 +:102770000202020202020202020202020202020239 +:102780000202020202020202020202020202020229 +:102790000202020202020202020202020202020219 +:1027A0000202020202020202020202020202020209 +:1027B00002020202020202020202020202020202F9 +:1027C00002020202020202020202020202020202E9 +:1027D00002020202020202020202020202020202D9 +:1027E00002020202020202020202020202020202C9 +:1027F00002020202020202020202020202020200BB +:1028000000000000000001000100000000000002C4 +:102810000202020202020202020202020202020298 +:102820000202020202020202020202020202020288 +:102830000202020202020202020202020202020278 +:102840000202020202020202020202020202020268 +:102850000202020202020202020202020202020258 +:102860000202020202020202020202020202020248 +:102870000202020202020202020202020202020238 +:102880000202020202020202020202020202020228 +:102890000202020202020202020202020202020218 +:1028A0000202020202020202020202020202020208 +:1028B00002020202020202020202020202020202F8 +:1028C00002020202020202020202020202020202E8 +:1028D00002020202020202020202020202020202D8 +:1028E00002020202020202020202020202020202C8 +:1028F00002020202020202020202020202020000BC +:1029000000000000000000000000000000000001C6 +:1029100001010101010101010101010101010101A7 +:102920000101010101010101010101010101010098 +:102930000000000000000000000000000000000295 +:102940000202020202020202020202020202020267 +:102950000202020202020202020202020202020257 +:102960000202020202020202020202020202020247 +:102970000202020202020202020202020202020237 +:102980000202020202020202020202020202020227 +:102990000202020202020202020202020202020217 +:1029A0000202020202020202020202020202020207 +:1029B00002020202020202020202020202020202F7 +:1029C00002020202020202020202020202020202E7 +:1029D00002020202020202020202020202020202D7 +:1029E00002020202020202020202020202020202C7 +:1029F00002020202020202020202020202020000BB +:102A000000000000000000000000000000000102C3 +:102A10000202020202020202020202020202020296 +:102A20000202020202020202020202020202020187 +:102A30000101010101010101010101010101010285 +:102A40000202020202020202020202020202020266 +:102A50000202020202020202020202020202020058 +:102A60000000000000000000000000000000000264 +:102A70000202020202020202020202020202020236 +:102A80000202020202020202020202020202020226 +:102A90000202020202020202020202020202020216 +:102AA0000202020202020202020202020202020206 +:102AB00002020202020202020202020202020202F6 +:102AC00002020202020202020202020202020202E6 +:102AD00002020202020202020202020202020202D6 +:102AE00002020202020202020202020202020202C6 +:102AF00002020202020202020202020202020200B8 +:102B000000000000000000000000000000000101C3 +:102B100001010101010101010101010101010100A6 +:102B200000000000000000000000000000000001A4 +:102B30000101010101010101010101010101010185 +:102B40000101010101010101010101010101010076 +:102B50000000000000000000000000000000000075 +:102B60000000000000000000000000000000000263 +:102B70000202020202020202020202020202020235 +:102B80000202020202020202020202020202020225 +:102B90000202020202020202020202020202020215 +:102BA0000202020202020202020202020202020106 +:102BB0000101010101010101010101010101010204 +:102BC00002020202020202020202020202020202E5 +:102BD00002020202020202020202020202020202D5 +:102BE00002020202020202020202020202020202C5 +:102BF00002020202020202020202020202020201B6 +:102C000001000000000000000000000000000101C1 +:102C100001010101010101010101010101010100A5 +:102C200000000000000000000000000000000001A3 +:102C30000101010101010101010101010101010184 +:102C40000101010101010101010101010101010174 +:102C50000101010101010101010101010101010065 +:102C60000000000000000000000000000000000064 +:102C70000000000000000000000000000000000252 +:102C80000202020202020202020202020202020224 +:102C90000202020202020202020202020202020214 +:102CA0000202020202020202020202020202020204 +:102CB00002020202020202020202020202020202F4 +:102CC00002020202020202020202020202020202E4 +:102CD00002020202020202020202020202020201D5 +:102CE00001010101010101010101010101010102D3 +:102CF00002020202020202020202020202020201B5 +:102D000001000000000000000000000000000101C0 +:102D100001010101010101010101010101010101A3 +:102D20000101010101010101010101010101010193 +:102D30000101010101010101010101010101010183 +:102D40000101010101010101010101010101010173 +:102D50000101010101010101010101010101010163 +:102D60000101010101010101010101010101010054 +:102D70000000000000000000000000000000000251 +:102D80000202020202020202020202020202020025 +:102D90000000000000000000000000000000000231 +:102DA0000202020202020202020202020202020104 +:102DB0000101010101010101010101010101010103 +:102DC00001010101010101010101010101010102F2 +:102DD00002020202020202020202020202020201D4 +:102DE00001010101010101010101010101010102D2 +:102DF00002020202020202020202020202020201B4 +:102E000001010101010101010101010101010101B2 +:102E100001010101010101010101010101010101A2 +:102E20000101010101010101010101010101010192 +:102E30000101010101010101010101010101010182 +:102E40000101010101010101010101010101010172 +:102E50000101010101010101010101010101010162 +:102E60000101010101010101010101010101010152 +:102E70000101010101010101010101010101010142 +:102E80000101010101010101010101010101010033 +:102E90000000000000000000000000000000000230 +:102EA0000202020202020202020202020202020103 +:102EB0000101010101010101010101010101010102 +:102EC00001010101010101010101010101010101F2 +:102ED00001010101010101010101010101010101E2 +:102EE00001010101010101010101010101010102D1 +:102EF00002020202020202020202020202020201B3 +:102F000001010101010101010101010101010101B1 +:102F100001010101010101010101010101010101A1 +:102F20000101010101010101010101010101010191 +:102F30000101010101010101010101010101010181 +:102F40000101010101010101010101010101010171 +:102F50000101010101010101010101010101010161 +:102F60000101010101010101010101010101010151 +:102F70000101010101010101010101010101010141 +:102F80000101010101010101010101010101010131 +:102F90000101010101010101010101010101010121 +:102FA0000101010101010101010101010101010111 +:102FB0000101010101010101010101010101010101 +:102FC00001010101010101010101010101010101F1 +:102FD00001010101010101010101010101010101E1 +:102FE00001010101010101010101010101010100D2 +:102FF00000000000000000000000000000000001D0 +:1030000001010101010101010101010101010101B0 +:1030100001010101010101010101010101010101A0 +:103020000101010101010101010101010101010190 +:103030000101010101010101010101010101010180 +:103040000101010101010101010101010101010170 +:103050000101010101010101010101010101010160 +:103060000101010101010101010101010101010150 +:103070000101010101010101010101010101010140 +:103080000101010101010101010101010101010130 +:103090000101010101010101010101010101010120 +:1030A0000101010101010101010101010101010110 +:1030B0000101010101010101010101010101010100 +:1030C00001010101010101010101010101010101F0 +:1030D00001010101010101010101010101010101E0 +:1030E00001010101010101010101010101010100D1 +:1030F00000000000000000000000000000000001CF +:1031000001010101010101010101010101010101AF +:10311000010101010101010101010101010101019F +:10312000010101010101010101010101010101018F +:10313000010101010101010101010101010101017F +:10314000010101010101010101010101010101016F +:10315000010101010101010101010101010101015F +:10316000010101010101010101010101010101014F +:10317000010101010101010101010101010101013F +:10318000010101010101010101010101010101012F +:10319000010101010101010101010101010101011F +:1031A000010101010101010101010101010101010F +:1031B00001010101010101010101010101010101FF +:1031C00001010101010101010101010101010101EF +:1031D00001010101010101010101010101010101DF +:1031E00001010101010101010101010101010100D0 +:1031F00000000000000000000000000000000000CF +:1032000000000000000000000000000000000000BE +:1032100000000000000000000000000000000000AE +:10322000000000000000000000000000000000029C +:10323000020202020202020202020202020202026E +:10324000020202020202020202020202020202025E +:10325000020202020202020202020202020202024E +:10326000020202020202020202020202020202023E +:10327000020202020202020202020202020202022E +:10328000020202020202020202020202020202021E +:10329000020202020202020202020202020202020E +:1032A00002020202020202020202020202020202FE +:1032B00002020202020202020202020202020202EE +:1032C00002020202020202020202020202020202DE +:1032D00002020202020202020202020202020202CE +:1032E00002020202020202020202020202020200C0 +:1032F00000000000000000000000000000000000CE +:1033000000000000000000000000000000000000BD +:1033100000000000000000000000000000000000AD +:10332000000000000000000000000000000000009D +:10333000000000000000000000000000000000008D +:10334000000000000000000000000000000000007D +:10335000000000000000000000000000000000006D +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000000003D +:10339000000000000000000000000000000000002D +:1033A000000000000000000000000000000000021B +:1033B00002020202020202020202020202020202ED +:1033C00002020202020202020202020202020202DD +:1033D00002020202020202020202020202020202CD +:1033E00002020202020202020202020202020200BF +:1033F00000000000000000000000000000000000CD +:1034000000000000000000000000000000000000BC +:1034100000000000000000000000000000000000AC +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000000008C +:10344000000000000000000000000000000000007C +:10345000000000000000000000000000000000006C +:10346000000000000000000000000000000000005C +:10347000000000000000000000000000000000004C +:10348000000000000000000000000000000000003C +:10349000000000000000000000000000000000002C +:1034A000000000000000000000000000000000001C +:1034B000000000000000000000000000000000000C +:1034C00000000000000000000000000000000000FC +:1034D00000000000000000000000000000000002EA +:1034E00002020202020202020202020202020200BE +:1034F00000000000000000000000000000000000CC +:1035000000000000000000000000000000000000BB +:1035100000000000000000000000000000000000AB +:10352000000000000000000000000000000000009B +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B +:10355000000000000000000000000000000000006B +:10356000000000000000000000000000000000005B +:10357000000000000000000000000000000000004B +:10358000000000000000000000000000000000003B +:10359000000000000000000000000000000000002B +:1035A000000000000000000000000000000000001B +:1035B000000000000000000000000000000000000B +:1035C00000000000000000000000000000000000FB +:1035D00000000000000000000000000000000000EB +:1035E00000000000000000000000000000000000DB +:1035F000000000000000000000000000000000309B +:1036000036090000000000386B090000000000408F +:103610009A09000000000048C8090000000000509E +:10362000F409000000000058200A000000000060BB +:10363000440A000000000068620A000000000070F8 +:10364000800A0000000000789E0A00000000008050 +:10365000BC0A000000000088DA0A000000000090A8 +:10366000F80A000000000098160B0000000000356A +:103670000000000000000000000000000001000148 +:10368000000000000000000000000000000000003A +:10369000000000000000000000000000000000002A +:1036A000000000000000000000000000000000001A +:1036B000000000000000000000000000000000000A +:1036C00000000000000000000101000000000000F8 +:1036D00000000000000000000000000000000000EA +:1036E00000000000000000000000000000000000DA +:1036F00000000000000000000000000000000000CA +:1037000000000000000000000000000000000000B9 +:1037100000000000000000000000000000000000A9 +:103720000000000000000000000000000000000099 +:103730000000000000000000000000000000000089 +:103740000000000000000000000000000000000079 +:103750000000000000000000000000000000000069 +:103760000000000000000000000000000000000059 +:103770000000000000010100000000000001010144 +:103780000000000000000000000000000000000039 +:103790000000000000000000000000000000000029 +:1037A0000000000000000000000000000000000019 +:1037B0000000000000000000000000000000000009 +:1037C00000000000000000000101010000000000F6 +:1037D00000000000000001000000000000000000E8 +:1037E00000000000000000000000000000000000D9 +:1037F00000000000000000000000000000000000C9 +:1038000000000000000000000000000000000000B8 +:1038100000000000000000000000000000000000A8 +:103820000100000000000000000000000000000097 +:103830000000000000000000000000000000000088 +:103840000000000000000000000000000000000078 +:103850000000000000000000000000000000000068 +:103860000000000000000000000000000001000057 +:10387000000000000001010200010000010101013F +:103880000000000000000000000000000000000038 +:103890000000000000000000000000000000000028 +:1038A0000000000000000000000000000000000018 +:1038B0000000000000000000000000000000000008 +:1038C00000000000000000000101010000000000F5 +:1038D00000000000000001000000000000000000E7 +:1038E00000000000000000000000000000000000D8 +:1038F00000000000000000000000000000000000C8 +:1039000000000000000000000000000000000000B7 +:1039100000000000000000010000000000010000A5 +:103920000100000000000000000000000000000096 +:103930000000000000000000000000000000000087 +:103940000000000000000000000000000000000077 +:103950000000000000000000000000000000000067 +:103960000000000000000000000000010001000055 +:103970000000000000010102000201010202010139 +:103980000100000000000000000000000000000036 +:103990000000000000000000000000000000000027 +:1039A0000000000000000000000000000000000017 +:1039B0000000000000000000000000000000000007 +:1039C00000000000000000000201010100000000F2 +:1039D00000000000000001000000000000000000E6 +:1039E00000000000000000000000000000000000D7 +:1039F00000000000000000000000000000000000C7 +:103A000000000000000000000000000000000000B6 +:103A100000000000000000010000000000010000A4 +:103A20000100000000000000000000000000000095 +:103A30000000000000000000000000000000000086 +:103A40000000000000000000000000000000000076 +:103A50000000000000000000000000000000000066 +:103A60000000000000000000000000010101000152 +:103A70000000000000010102020202020202020232 +:103A80000100000000000000000000000000000035 +:103A90000000000000000000000000000000000026 +:103AA0000000000000000000000000000000000016 +:103AB0000000000000000000000000000000000006 +:103AC00000000000000000000202010100000000F0 +:103AD00000000000000001000000000000000000E5 +:103AE00000000000000000000000000000000000D6 +:103AF00000000000000000000000000000000000C6 +:103B000000000000000000000000000000000000B5 +:103B100000000000000000010101000001010000A0 +:103B20000100000000000000000000000000000094 +:103B30000000000000000000000000000000000085 +:103B40000000000000000000000000000000000075 +:103B50000000000000000000000000000000000065 +:103B6000000000000000000000000101010101014F +:103B7000010001010101010202020202020202022D +:103B80000100010101000000000000000000000031 +:103B90000000000000000000000000000000000025 +:103BA0000000000000000000000000000000000015 +:103BB0000000000000000000000000000000000005 +:103BC00000000000000000000202020100000000EE +:103BD00000000000000001000000000000000000E4 +:103BE00000000000000000000000000000000000D5 +:103BF00000000000000000000000000000000000C5 +:103C000000000000000000000000000000000000B4 +:103C1000000000000000000101010101010101009C +:103C20000100010000000000000000000000000092 +:103C30000000000000000000000000000000000084 +:103C40000000000000000000000000000000000074 +:103C50000000000000000000000000000000000064 +:103C6000000000000000000000010101010101014D +:103C7000010001010101010202020202020202022C +:103C8000020001010100000000000000000000002F +:103C90000000000000000000000000000000000024 +:103CA0000000000000000000000000000000000014 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000020202020101010000E9 +:103CD00000000000000001000000000000000000E3 +:103CE00000000000000000000000000000000000D4 +:103CF00000000000000000000000000000000000C4 +:103D000000000000000000000000000000000000B3 +:103D1000000000000000000101010101010101019A +:103D20000100010000000000000000000000000091 +:103D30000000000000000000000000000000000083 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D6000000000000000000000010101010101014C +:103D7000010001010101010202020202020202022B +:103D8000020001010100000000000000000000002E +:103D90000000000000000000000000000000000023 +:103DA0000000000000000000000000000000000013 +:103DB0000000000000000000000000000000000003 +:103DC00000000000000000020202020201010000E7 +:103DD00000000000000001000000000000000000E2 +:103DE00000000000000000000000000000000000D3 +:103DF00000000000000000000000000000000000C3 +:103E000000000000000000000000000000000000B2 +:103E10000000000000000002010101010101010198 +:103E2000010001000000010000000000000000008F +:103E30000000000000000000000000000000000082 +:103E40000000000000000000000000000000000072 +:103E50000000000000000000000000000000000062 +:103E6000000000000000000001010101010101014A +:103E70000101010101010102020202020202020229 +:103E8000020202010100000000000000000000002A +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000012 +:103EB0000000000000000000000000000000000002 +:103EC00000000000000000020202020202010000E5 +:103ED00000000000000001000000000000000000E1 +:103EE00000000000000000000000000000000000D2 +:103EF00000000000000000000000000000000000C2 +:103F000000000000000000000000000000000000B1 +:103F10000000000000000002020101010101010196 +:103F2000010001000000010000000000000000008E +:103F30000000000000000000000000000000000081 +:103F40000000000000000000000000000000000071 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000010101010101010149 +:103F70000101010101010102020202020202020228 +:103F80000202020201000000000000000000000028 +:103F90000000000000000000000000000000000021 +:103FA0000000000000000000000000000000000011 +:103FB0000000000000000000000000000000000001 +:103FC00000000000000000020202020202010100E3 +:103FD00000000000000001000000000000000000E0 +:103FE00000000000000000000000000000000000D1 +:103FF00000000000000000000000000000000000C1 +:1040000000000000000000000000000000000000B0 +:104010000000000000000002020201010101010194 +:10402000010001000000010000000000000000008D +:104030000000000000000000000000000000000080 +:104040000000000000000000000000000000000070 +:104050000000000000000000000000000000000060 +:104060000000000000000000010101010101010148 +:104070000101010101010102020202020202020227 +:104080000202020202000000000000000000000026 +:104090000000000000000000000000000000000020 +:1040A0000000000000000000000000000000000010 +:1040B0000000000000000000000000000000000000 +:1040C00000000000000000020202020202020101E0 +:1040D00000000000000001000000000000000000DF +:1040E00000000000000000000000000000000000D0 +:1040F00000000000000000000000000000000000C0 +:1041000000000000000000000000000000000000AF +:104110000000000000000002020202010101010192 +:10412000010001000000010000000000000000008C +:10413000000000000000000000000000000000007F +:10414000000000000000000000000000000000006F +:10415000000000000000000000000000000000005F +:104160000000000000000000010101010101010147 +:104170000101010101010102020202020202020226 +:104180000202020202010000000000000000000024 +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000020202020202020101DF +:1041D00000000100000001000000000000000000DD +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000000000AE +:10421000000000000000000202020202020201018E +:10422000010001010000010000000000000000008A +:10423000000000000000000000000000000000007E +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000000000005E +:104260000000000000000000010101010101010146 +:104270000101010101010102020202020202020225 +:104280000202020202010000000000000000000023 +:10429000000000000000000000000000000000001E +:1042A000000000000000000000000000000000000E +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000020202020202020201DD +:1042D00000000100000002000000000000000000DB +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000000000000BE +:1043000000000000000000000000000000000000AD +:10431000000000000000000202020202020201018D +:104320000200010100000100000000000000000088 +:10433000000000000000000000000000000000007D +:10434000000000000000000000000000000000006D +:10435000000000000000000000000000000000005D +:104360000000000000000000010101010101010145 +:104370000101010101010102020202020202020224 +:104380000202020202010000000000000000000022 +:10439000000000000000000000000000000000001D +:1043A000000000000000000000000000000000000D +:1043B00000000000000000000000000000000000FD +:1043C00000000000000000020202020202020201DC +:1043D00001000100010002000000000000000000D8 +:1043E00000000000000000000000000000000000CD +:1043F00000000000000000000000000000000000BD +:1044000000000000000000000000000000000000AC +:10441000000000000000000202020202020202018B +:104420000200010100010100000000000000000086 +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C +:10445000000000000000000000000000000000005C +:104460000000000000000000020202020101010140 +:104470000101010101010102020202020202020223 +:104480000202020202010000000000000000000021 +:10449000000000000000000000000000000000001C +:1044A000000000000000000000000000000000000C +:1044B00000000000000000000000000000000000FC +:1044C00000000000000000020202020202020202DA +:1044D00001000100010002000000000000000000D7 +:1044E00000000000000000000000000000000000CC +:1044F00000000000000000000000000000000000BC +:1045000000000000000000000000000000000000AB +:10451000000000000000000202020202020202018A +:104520000200010100010100000000000000000085 +:10453000000000000000000000000000000000007B +:10454000000000000000000000000000000000006B +:10455000000000000000000000000000000000005B +:10456000000000000000000002020202010101013F +:104570000101010101010102020202020202020222 +:104580000202020202010000000000000000000020 +:10459000000000000000000000000000000000001B +:1045A000000000000000000000000000000000000B +:1045B00000000000000000000000000000000000FB +:1045C00000000000000000020202020202020202D9 +:1045D00002000201010002000000000000000000D3 +:1045E00000000000000000000000000000000000CB +:1045F00000000000000000000000000000000000BB +:1046000000000000000000000000000000000000AA +:104610000000000000000002020202020202020288 +:104620000200010100010100000000000000000084 +:10463000000000000000000000000000000000007A +:10464000000000000000000000000000000000006A +:10465000000000000000000000000000000000005A +:10466000000000000000000002020202020201013C +:104670000101010101010102020202020202020221 +:10468000020202020201000000000000000000001F +:10469000000000000000000000000000000000001A +:1046A000000000000000000000000000000000000A +:1046B00000000000000000000000000000000000FA +:1046C00000000000000000020202020202020202D8 +:1046D00002020201010002000000000000000000D0 +:1046E00000000000000000000000000000000000CA +:1046F00000000000000000000000000000000000BA +:1047000000000000000000000000000000000000A9 +:104710000000000000000002020202020202020287 +:104720000200020100010100000000000000000082 +:104730000000000000000000000000000000000079 +:104740000000000000000000000000000000000069 +:104750000000000000000000000000000000000059 +:10476000000000000000000002020202020201013B +:104770000101010101010102020202020202020220 +:10478000020202020201000000000000000000001E +:104790000000000000000000000000000000000019 +:1047A0000000000000000000000000000000000009 +:1047B00000000000000000000000000000000000F9 +:1047C00000000000000000020202020202020202D7 +:1047D00002020201020002000000000000000000CE +:1047E00000000000000000000000000000000000C9 +:1047F00000000000000000000000000000000000B9 +:1048000000000000000000000000000000000000A8 +:104810000000000000000002020202020202020286 +:104820000200020101010100000000000000000080 +:104830000000000000000000000000000000000078 +:104840000000000000000000000000000000000068 +:104850000000000000000000000000000000000058 +:104860000000000000000000020202020202020139 +:10487000010101010101010202020202020202021F +:10488000020202020202000000000000000000001C +:104890000000000000000000000000000000000018 +:1048A0000000000000000000000000000000000008 +:1048B00000000000000000000000000000000000F8 +:1048C00000000000000000020202020202020202D6 +:1048D00002020202020002000000000000000000CC +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000000000000000000B8 +:1049000000000000000000000000000000000000A7 +:104910000000000000000002020202020202020285 +:10492000020002010101010000000000000000007F +:104930000000000000000000000000000000000077 +:104940000000000000000000000000000000000067 +:104950000000000000000000000000000000000057 +:104960000000000000000000020202020202020237 +:10497000010101010101010202020202020202021E +:10498000020202020202000000000000000000001B +:104990000000000000000000000000000000000017 +:1049A0000000000000000000000000000000000007 +:1049B00000000000000000000000000000000000F7 +:1049C00000000000000000020202020202020202D5 +:1049D00002020202020002000000000000000000CB +:1049E00000000000000000000000000000000000C7 +:1049F00000000000000000000000000000000000B7 +:104A000000000000000000000000000000000000A6 +:104A10000000000000000002020202020202020284 +:104A2000020002010101010000000000000000007E +:104A30000000000000000000000000000000000076 +:104A40000000000000000000000000000000000066 +:104A50000000000000000000000000000000000056 +:104A60000000000000000000020202020202020236 +:104A7000020101010101010202020202020202021C +:104A8000020102020202000000000000000000001B +:104A90000000000000000000000000000000000016 +:104AA0000000000000000000000000000000000006 +:104AB00000000000000000000000000000000000F6 +:104AC00000000000000000020202020202020202D4 +:104AD00002020202020002000000000000000000CA +:104AE00000000000000000000000000000000000C6 +:104AF00000000000000000000000000000000000B6 +:104B000000000000000000000000000000000000A5 +:104B10000000000000000002020202020202020283 +:104B2000020102020101020000000000000000007A +:104B30000000000000000000000000000000000075 +:104B40000000000000000000000000000000000065 +:104B50000000000000000000000000000000000055 +:104B60000000000000000002020202020202020233 +:104B7000020101010101010202020202020202021B +:104B8000020101010102010000000000000000001C +:104B90000000000000000000000000000000000015 +:104BA0000000000000000000000000000000000005 +:104BB00000000000000000000000000000000000F5 +:104BC00000000000000000020202020202020202D3 +:104BD00002020202020102000000000000000000C8 +:104BE00000000000000000000000000000000000C5 +:104BF00000000000000000000000000000000000B5 +:104C000000000000000000000000000000000000A4 +:104C10000000000000000002020202020202020282 +:104C20000201020201010200000000000000000079 +:104C30000000000000000000000000000000000074 +:104C40000000000000000000000000000000000064 +:104C50000000000000000000000000000000000054 +:104C60000000000000000002020202020202020232 +:104C7000020102010101010202020202020202011A +:104C8000010101010102010000000000000000001C +:104C90000000000000000000000000000000000014 +:104CA0000000000000000000000000000000000004 +:104CB00000000000000000000000000000000000F4 +:104CC00000000000000000020202020202020202D2 +:104CD00002020202020102000000000000000000C7 +:104CE00000000000000000000000000000000000C4 +:104CF00000000000000000000000000000000000B4 +:104D000000000000000000000000000000000000A3 +:104D10000000000000000002020202020202020281 +:104D20000201020201010200000000000000000078 +:104D30000000000000000000000000000000000073 +:104D40000000000000000000000000000000000063 +:104D50000000000000000000000000000000000053 +:104D60000000000000000002020202020202020231 +:104D7000020202020101010202020202010101011A +:104D8000010101010102010000000000000000001B +:104D90000000000000000000000000000000000013 +:104DA0000000000000000000000000000000000003 +:104DB00000000000000000000000000000000000F3 +:104DC00000000000000000020202020202020202D1 +:104DD00002020202020102000000000000000000C6 +:104DE00000000000000000000000000000000000C3 +:104DF00000000000000000000000000000000000B3 +:104E000000000000000000000000000000000000A2 +:104E10000000000000000002020202020202020280 +:104E20000202020201010200000000000000000076 +:104E30000000000000000000000000000000000072 +:104E40000000000000000000000000000000000062 +:104E50000000000000000000000000000000000052 +:104E60000000000000000002020202020202020230 +:104E70000202020202020102020202020101010117 +:104E8000010101010101010000000000000000001B +:104E90000000000000000000000000000000000012 +:104EA0000000000000000000000000000000000002 +:104EB00000000000000000000000000000000000F2 +:104EC00000000000000000020202020202020202D0 +:104ED00002020202020102000000000000000000C5 +:104EE00000000000000000000000000000000000C2 +:104EF00000000000000000000000000000000000B2 +:104F000000000000000000000000000000000000A1 +:104F1000000000000000000202020202020202027F +:104F20000202020202010200000000000000000074 +:104F30000000000000000000000000000000000071 +:104F40000000000000000000000000000000000061 +:104F50000000000000000000000000000000000051 +:104F6000000000000000000202020202020202022F +:104F70000202020202020202020202010101010116 +:104F8000010101010101010000000000000000001A +:104F90000000000000000000000000000000000011 +:104FA0000000000000000000000000000000000001 +:104FB00000000000000000000000000000000000F1 +:104FC00000000000000000020202020202020202CF +:104FD00002020202020101000000000000000000C5 +:104FE00000000000000000000000000000000000C1 +:104FF00000000000000000000000000000000000B1 +:1050000000000000000000000000000000000000A0 +:10501000000000000000000202020202020202027E +:105020000202020202020200000000000000000072 +:105030000000000000000000000000000000000070 +:105040000000000000000000000000000000000060 +:105050000000000000000000000000000000000050 +:10506000000000000000000202020202020202022E +:105070000202020202020201020101010101010118 +:105080000101010101010100000000000000000019 +:105090000000000000000000000000000000000010 +:1050A0000000000000000000000000000000000000 +:1050B00000000000000000000000000000000000F0 +:1050C00000000000000000020202020202020202CE +:1050D00002020202020201000000000000000000C3 +:1050E00000000000000000000000000000000000C0 +:1050F00000000000000000000000000000000000B0 +:10510000000000000000000000000000000000009F +:10511000000000000000000202020202020202027D +:105120000202020202020200000000000000000071 +:10513000000000000000000000000000000000006F +:10514000000000000000000000000000000000005F +:10515000000000000000000000000000000000004F +:10516000000000000000000202020202020202022D +:105170000202020202020201010101010101010118 +:105180000101010101010100000000000000000018 +:10519000000000000000000000000000000000000F +:1051A00000000000000000000000000000000000FF +:1051B00000000000000000000000000000000000EF +:1051C00000000000000000020202020202020202CD +:1051D00002010202010201000000000000000000C4 +:1051E00000000000000000000000000000000000BF +:1051F00000000000000000000000000000000000AF +:10520000000000000000000000000000000000009E +:10521000000000000000000202020202020202027C +:105220000202020202020200000000000000000070 +:10523000000000000000000000000000000000006E +:10524000000000000000000000000000000000005E +:10525000000000000000000000000000000000004E +:10526000000000000000000202020202020202022C +:105270000202020202020201010101010101010117 +:105280000101010101010100000000000000000017 +:10529000000000000000000000000000000000000E +:1052A00000000000000000000000000000000000FE +:1052B00000000000000000000000000000000000EE +:1052C00000000000000000020202020202020202CC +:1052D00002010101010201000000000000000000C5 +:1052E00000000000000000000000000000000000BE +:1052F00000000000000000000000000000000000AE +:10530000000000000000000000000000000000009D +:10531000000000000000000202020202020202027B +:10532000020202020202020000000000000000006F +:10533000000000000000000000000000000000006D +:10534000000000000000000000000000000000005D +:10535000000000000000000000000000000000004D +:10536000000000000000000202020202020202022B +:105370000202020202020201010101010101010116 +:105380000101010101010100000000000000000016 +:10539000000000000000000000000000000000000D +:1053A00000000000000000000000000000000000FD +:1053B00000000000000000000000000000000000ED +:1053C00000000000000000020202020201020202CC +:1053D00001010101010201000000000000000000C5 +:1053E00000000000000000000000000000000000BD +:1053F00000000000000000000000000000000000AD +:10540000000000000000000000000000000000009C +:10541000000000000000000202020202020202027A +:10542000020202020202020000000000000000006E +:10543000000000000000000000000000000000006C +:10544000000000000000000000000000000000005C +:10545000000000000000000000000000000000004C +:10546000000000000000000202020202020202022A +:105470000202020202020201010101010101010115 +:105480000101010101010100000000000000000015 +:10549000000000000000000000000000000000000C +:1054A00000000000000000000000000000000000FC +:1054B00000000000000000000000000000000000EC +:1054C00000000000000000020202020201010101CE +:1054D00001010101010101000000000000000000C5 +:1054E00000000000000000000000000000000000BC +:1054F00000000000000000000000000000000000AC +:10550000000000000000000000000000000000009B +:105510000000000000000002020202020202020279 +:10552000020202020202020000000000000000006D +:10553000000000000000000000000000000000006B +:10554000000000000000000000000000000000005B +:10555000000000000000000000000000000000004B +:105560000000000000000002020202020202020229 +:105570000202020202020201010101010101010114 +:105580000101010101010100000000000000000014 +:10559000000000000000000000000000000000000B +:1055A00000000000000000000000000000000000FB +:1055B00000000000000000000000000000000000EB +:1055C00000000000000000010101010101010101D2 +:1055D00001010101010101000000000000000000C4 +:1055E00000000000000000000000000000000000BB +:1055F00000000000000000000000000000000000AB +:10560000000000000000000000000000000000009A +:105610000000000000000002020202020202020278 +:10562000020202020202020000000000000000006C +:10563000000000000000000000000000000000006A +:10564000000000000000000000000000000000005A +:10565000000000000000000000000000000000004A +:105660000000000000000002020202020202020228 +:105670000202020202020201010101010101010113 +:105680000101010101010100000000000000000013 +:10569000000000000000000000000000000000000A +:1056A00000000000000000000000000000000000FA +:1056B00000000000000000000000000000000000EA +:1056C00000000000000000010101010101010101D1 +:1056D00001010101010101000000000000000000C3 +:1056E00000000000000000000000000000000000BA +:1056F00000000000000000000000000000000000AA +:105700000000000000000000000000000000000099 +:105710000000000000000002020202020202020277 +:10572000020202020202020000000000000000006B +:105730000000000000000000000000000000000069 +:105740000000000000000000000000000000000059 +:105750000000000000000000000000000000000049 +:105760000000000000000002020202020202020227 +:105770000202020202020201010101010101010112 +:105780000101010101010100000000000000000012 +:105790000000000000000000000000000000000009 +:1057A00000000000000000000000000000000000F9 +:1057B00000000000000000000000000000000000E9 +:1057C00000000000000000010101010101010101D0 +:1057D00001010101010101000000000000000000C2 +:1057E00000000000000000000000000000000000B9 +:1057F00000000000000000000000000000000000A9 +:105800000000000000000000000000000000000098 +:105810000000000000000002020202020202020276 +:10582000020202020202020000000000000000006A +:105830000000000000000000000000000000000068 +:105840000000000000000000000000000000000058 +:105850000000000000000000000000000000000048 +:105860000000000000000002020202020202020226 +:105870000202020202020201010101010101010111 +:105880000101010101010100000000000000000011 +:105890000000000000000000000000000000000008 +:1058A00000000000000000000000000000000000F8 +:1058B00000000000000000000000000000000000E8 +:1058C00000000000000000010101010101010101CF +:1058D00001010101010101000000000000000000C1 +:1058E00000000000000000000000000000000000B8 +:1058F00000000000000000000000000000000000A8 +:105900000000000000000000000000000000000097 +:105910000000000000000002020202020202020275 +:105920000202020202020200000000000000000069 +:105930000000000000000000000000000000000067 +:105940000000000000000000000000000000000057 +:105950000000000000000000000000000000000047 +:105960000000000000000002020202020202020225 +:105970000202020202020201010101010101010110 +:105980000101010101010100000000000000000010 +:105990000000000000000000000000000000000007 +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000000000000000000000E7 +:1059C00000000000000000010101010101010101CE +:1059D00001010101010101000000000000000000C0 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 +:105A00000000000000000000000000000000000096 +:105A10000000000000000002020202020202020274 +:105A20000202020202020100000000000000000069 +:105A30000000000000000000000000000000000066 +:105A40000000000000000000000000000000000056 +:105A50000000000000000000000000000000000046 +:105A60000000000000000002020202020202020224 +:105A7000020202020202020101010101010101010F +:105A8000010101010101010000000000000000000F +:105A90000000000000000000000000000000000006 +:105AA00000000000000000000000000000000000F6 +:105AB00000000000000000000000000000000000E6 +:105AC00000000000000000010101010101010101CD +:105AD00001010101010101000000000000000000BF +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 +:105B00000000000000000000000000000000000095 +:105B10000000000000000002020202020202020273 +:105B20000202020202020100000000000000000068 +:105B30000000000000000000000000000000000065 +:105B40000000000000000000000000000000000055 +:105B50000000000000000000000000000000000045 +:105B60000000000000000002020202020202020223 +:105B7000020202020202020101010101010101010E +:105B8000010101010101010000000000000000000E +:105B90000000000000000000000000000000000005 +:105BA00000000000000000000000000000000000F5 +:105BB00000000000000000000000000000000000E5 +:105BC00000000000000000010101010101010101CC +:105BD00001010101010101000000000000000000BE +:105BE00000000000000000000000000000000000B5 +:105BF00000000000000000000000000000000000A5 +:105C00000000000000000000000000000000000094 +:105C10000000000000000002020202020202020272 +:105C2000010101010102010000000000000000006C +:105C30000000000000000000000000000000000064 +:105C40000000000000000000000000000000000054 +:105C50000000000000000000000000000000000044 +:105C60000000000000000002020202020202020222 +:105C7000020202020202020101010101010101010D +:105C8000010101010101010000000000000000000D +:105C90000000000000000000000000000000000004 +:105CA00000000000000000000000000000000000F4 +:105CB00000000000000000000000000000000000E4 +:105CC00000000000000000010101010101010101CB +:105CD00001010101010101000000000000000000BD +:105CE00000000000000000000000000000000000B4 +:105CF00000000000000000000000000000000000A4 +:105D00000000000000000000000000000000000093 +:105D10000000000000000002020202020101010175 +:105D2000010101010101010000000000000000006C +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000000000000000053 +:105D50000000000000000000000000000000000043 +:105D60000000000000000002020202020202020221 +:105D7000020202020202020101010101010101010C +:105D8000010101010101010000000000000000000C +:105D90000000000000000000000000000000000003 +:105DA00000000000000000000000000000000000F3 +:105DB00000000000000000000000000000000000E3 +:105DC00000000000000000010101010101010101CA +:105DD00001010101010101000000000000000000BC +:105DE00000000000000000000000000000000000B3 +:105DF00000000000000000000000000000000000A3 +:105E00000000000000000000000000000000000092 +:105E10000000000000000001010101010101010179 +:105E2000010101010101010000000000000000006B +:105E30000000000000000000000000000000000062 +:105E40000000000000000000000000000000000052 +:105E50000000000000000000000000000000000042 +:105E60000000000000000002020202020202020220 +:105E7000020202020202020101010101010101010B +:105E8000010101010101010000000000000000000B +:105E90000000000000000000000000000000000002 +:105EA00000000000000000000000000000000000F2 +:105EB00000000000000000000000000000000000E2 +:105EC00000000000000000010101010101010101C9 +:105ED00001010101010101000000000000000000BB +:105EE00000000000000000000000000000000000B2 +:105EF00000000000000000000000000000000000A2 +:105F00000000000000000000000000000000000091 +:105F10000000000000000001010101010101010178 +:105F2000010101010101010000000000000000006A +:105F30000000000000000000000000000000000061 +:105F40000000000000000000000000000000000051 +:105F50000000000000000000000000000000000041 +:105F6000000000000000000202020202020202021F +:105F7000020202020202020101010101010101010A +:105F8000010101010101010000000000000000000A +:105F90000000000000000000000000000000000001 +:105FA00000000000000000000000000000000000F1 +:105FB00000000000000000000000000000000000E1 +:105FC00000000000000000010101010101010101C8 +:105FD00001010101010101000000000000000000BA +:105FE00000000000000000000000000000000000B1 +:105FF00000000000000000000000000000000000A1 +:106000000000000000000000000000000000000090 +:106010000000000000000001010101010101010177 +:106020000101010101010100000000000000000069 +:106030000000000000000000000000000000000060 +:106040000000000000000000000000000000000050 +:106050000000000000000000000000000000000040 +:10606000000000000000000202020202020202021E +:106070000202020202020201010101010101010109 +:106080000101010101010100000000000000000009 +:106090000000000000000000000000000000000000 +:1060A00000000000000000000000000000000000F0 +:1060B00000000000000000000000000000000000E0 +:1060C00000000000000000010101010101010101C7 +:1060D00001010101010101000000000000000000B9 +:1060E00000000000000000000000000000000000B0 +:1060F00000000000000000000000000000000000A0 +:10610000000000000000000000000000000000008F +:106110000000000000000001010101010101010176 +:106120000101010101010100000000000000000068 +:10613000000000000000000000000000000000005F +:10614000000000000000000000000000000000004F +:10615000000000000000000000000000000000003F +:10616000000000000000000202020202020202021D +:106170000202020202020201010101010101010108 +:106180000101010101010100000000000000000008 +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF +:1061C00000000000000000010101010101010101C6 +:1061D00001010101010101000000000000000000B8 +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:10620000000000000000000000000000000000008E +:106210000000000000000001010101010101010175 +:106220000101010101010100000000000000000067 +:10623000000000000000000000000000000000005E +:10624000000000000000000000000000000000004E +:10625000000000000000000000000000000000003E +:10626000000000000000000202020202020202021C +:106270000202020202020201010101010101010107 +:106280000101010101010100000000000000000007 +:1062900000000000000000000000000000000000FE +:1062A00000000000000000000000000000000000EE +:1062B00000000000000000000000000000000000DE +:1062C00000000000000000010101010101010101C5 +:1062D00001010101010101000000000000000000B7 +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:10630000000000000000000000000000000000008D +:106310000000000000000001010101010101010174 +:106320000101010101010100000000000000000066 +:10633000000000000000000000000000000000005D +:10634000000000000000000000000000000000004D +:10635000000000000000000000000000000000003D +:10636000000000000000000202020202020202021B +:106370000202020202020201010101010101010106 +:106380000101010101010100000000000000000006 +:1063900000000000000000000000000000000000FD +:1063A00000000000000000000000000000000000ED +:1063B00000000000000000000000000000000000DD +:1063C00000000000000000010101010101010101C4 +:1063D00001010101010101000000000000000000B6 +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000000009D +:10640000000000000000000000000000000000008C +:106410000000000000000001010101010101010173 +:106420000101010101010100000000000000000065 +:10643000000000000000000000000000000000005C +:10644000000000000000000000000000000000004C +:10645000000000000000000000000000000000003C +:10646000000000000000000202020202020202021A +:106470000202020202020201010101010101010105 +:106480000101010101010100000000000000000005 +:1064900000000000000000000000000000000000FC +:1064A00000000000000000000000000000000000EC +:1064B00000000000000000000000000000000000DC +:1064C00000000000000000010101010101010101C3 +:1064D00001010101010101000000000000000000B5 +:1064E00000000000000000000000000000000000AC +:1064F000000000000000000000000000000000009C +:10650000000000000000000000000000000000008B +:106510000000000000000001010101010101010172 +:106520000101010101010100000000000000000064 +:10653000000000000000000000000000000000005B +:10654000000000000000000000000000000000004B +:10655000000000000000000000000000000000003B +:106560000000000000000002020202020202020219 +:106570000202020202020201010101010101010104 +:106580000101010101010100000000000000000004 +:1065900000000000000000000000000000000000FB +:1065A00000000000000000000000000000000000EB +:1065B00000000000000000000000000000000000DB +:1065C00000000000000000010101010101010101C2 +:1065D00001010101010101000000000000000000B4 +:1065E00000000000000000000000000000000000AB +:1065F000000000000000000000000000000000009B +:10660000000000000000000000000000000000008A +:106610000000000000000001010101010101010171 +:106620000101010101010100000000000000000063 +:10663000000000000000000000000000000000005A +:10664000000000000000000000000000000000004A +:10665000000000000000000000000000000000003A +:106660000000000000000002020202020202020218 +:106670000202020202020201010101010101010103 +:106680000101010101010100000000000000000003 +:1066900000000000000000000000000000000000FA +:1066A00000000000000000000000000000000000EA +:1066B00000000000000000000000000000000000DA +:1066C00000000000000000010101010101010101C1 +:1066D00001010101010101000000000000000000B3 +:1066E00000000000000000000000000000000000AA +:1066F000000000000000000000000000000000009A +:106700000000000000000000000000000000000089 +:106710000000000000000001010101010101010170 +:106720000101010101010100000000000000000062 +:106730000000000000000000000000000000000059 +:106740000000000000000000000000000000000049 +:106750000000000000000000000000000000000039 +:106760000000000000000002020202020202020217 +:106770000202020202020201010101010101010102 +:106780000101010101010100000000000000000002 +:1067900000000000000000000000000000000000F9 +:1067A00000000000000000000000000000000000E9 +:1067B00000000000000000000000000000000000D9 +:1067C00000000000000000010101010101010101C0 +:1067D00001010101010101000000000000000000B2 +:1067E00000000000000000000000000000000000A9 +:1067F0000000000000000000000000000000000099 +:106800000000000000000000000000000000000088 +:10681000000000000000000101010101010101016F +:106820000101010101010100000000000000000061 +:106830000000000000000000000000000000000058 +:106840000000000000000000000000000000000048 +:106850000000000000000000000000000000000038 +:106860000000000000000000010101010101010120 +:106870000101010101010100000000000000000011 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000000000F8 +:1068A00000000000000000000000000000000000E8 +:1068B00000000000000000000000000000000000D8 +:1068C00000000000000000020202020202020202B6 +:1068D00002020202020202000000000000000000AA +:1068E00000000000000000000000000000000000A8 +:1068F0000000000000000000000000000000000098 +:106900000000000000000000000000000000000087 +:106910000000000000000002020202020202020265 +:106920000202020202020200000000000000000059 +:106930000000000000000000000000000000000057 +:106940000000000000000000000000000000000047 +:106950000000000000000000000000000000000037 +:106960000000000000000000000000000000000027 +:106970000000000000000000000000000000000017 +:106980000000000000000000000000000000000007 +:1069900000000000000000000000000000000000F7 +:1069A00000000000000000000000000000000000E7 +:1069B00000000000000000000000000000000000D7 +:1069C00000000000000000020202020202020202B5 +:1069D00002020202020202000000000000000000A9 +:1069E00000000000000000000000000000000000A7 +:1069F0000000000000000000000000000000000097 +:106A00000000000000000000000000000000000086 +:106A10000000000000000002020202020202020264 +:106A20000202020202020200000000000000000058 +:106A30000000000000000000000000000000000056 +:106A40000000000000000000000000000000000046 +:106A50000000000000000000000000000000000036 +:106A60000000000000000000000000000000000026 +:106A70000000000000000000000000000000000016 +:106A80000000000000000000000000000000000006 +:106A900000000000000000000000000000000000F6 +:106AA00000000000000000000000000000000000E6 +:106AB00000000000000000000000000000000000D6 +:106AC00000000000000000000000000000000000C6 +:106AD00000000000000000000000000000000000B6 +:106AE00000000000000000000000000000000000A6 +:106AF0000000000000000000000000000000000096 +:106B00000000000000000000000000000000000085 +:106B10000000000000000000000000000000000075 +:106B20000000000000000000000000000000000065 +:106B30000000000000000000000000000000000055 +:106B40000000000000000000000000000000000045 +:106B50000000000000000000000000000000000035 +:106B60000000000000000000000000000000000025 +:106B7000000000000000002F0000000000000000E6 +:106B80000000000000000000000000000000000005 +:106B900000000000000000000000000000000000F5 +:106BA00000000000000000000000000000000000E5 +:106BB00000000000000000000000000000000000D5 +:106BC00000000000000000000000000000000000C5 +:106BD00000000000010000010000000000000100B2 +:106BE00000000000000000000000000000000000A5 +:106BF0000000000000000000000000000000000095 +:106C00000000000000000000000000000000000084 +:106C10000000000000000000000000000000000074 +:106C20000000000000000000000000000000000064 +:106C30000000000000000000000000000000000054 +:106C40000000000000000000000000000000000044 +:106C50000000000000000000000000000000000034 +:106C60000000000000000000000000000000000024 +:106C70000000000000000000000000000000000014 +:106C80000000000000000000000000000000000004 +:106C900000000000000000000000000000000000F4 +:106CA00000000000000000000000000000000000E4 +:106CB00000000000000000000000000000000000D4 +:106CC00000000000000000000000000000000001C3 +:106CD00001010000010101010000010001000100AB +:106CE00000000000000000000000000000000000A4 +:106CF0000000000000000000000000000000000094 +:106D00000000000000000000000000000000000083 +:106D10000000000000000000000000000000000073 +:106D20000000000001000000000000000000000062 +:106D30000000000000000000000000000000000053 +:106D40000000000000000000000000000000000043 +:106D50000000000000000000000000000000000033 +:106D60000000000000000000000000000000000023 +:106D70000000000000000000000000000000000112 +:106D80000000000000000000000000000000000003 +:106D900000000000000000000000000000000000F3 +:106DA00000000000000000000000000000000000E3 +:106DB00000000000000000000000000000000000D3 +:106DC00000000000000000000000000000000001C2 +:106DD00002010000010101010000010001000100A9 +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000000000000000000000093 +:106E00000000000000000000000000000000000082 +:106E10000000000000000000000000000000000072 +:106E20000000000001000000000000000000000061 +:106E30000000000000000000000000000000000052 +:106E40000000000000000000000000000000000042 +:106E50000000000000000000000000000000000032 +:106E60000000000000000000000000000000000022 +:106E7000000000000100000000000000000001010F +:106E80000000000000000000000000000000000002 +:106E900000000000000000000000000000000000F2 +:106EA00000000000000000000000000000000000E2 +:106EB00000000000000000000000000000000000D2 +:106EC00000000000000000000000000000000002C0 +:106ED00002020000010101010000010001000100A7 +:106EE00000000000000000000000000000000000A2 +:106EF0000000000000000000000000000000000092 +:106F00000000000000000000000000000000000081 +:106F10000000000000000000000000000000000071 +:106F20000000000001000000000000000000000060 +:106F30000000000000000000000000000000000051 +:106F40000000000000000000000000000000000041 +:106F50000000000000000000000000000000000031 +:106F60000000000000000000000000000000000021 +:106F7000000000000101000000000000010101020A +:106F80000000000000000000000000000000000001 +:106F900000000000000000000000000000000000F1 +:106FA00000000000000000000000000000000000E1 +:106FB00000000000000000000000000000000000D1 +:106FC00000000000000000000000000000000002BF +:106FD00002020000010101010100010001000100A5 +:106FE00000000000000000000000000000000000A1 +:106FF0000000000000000000000000000000000091 +:107000000000000000000000000000000000000080 +:107010000000000000000000000000000000000070 +:10702000010000000100000000000001000000005D +:107030000000000000000000000000000000000050 +:107040000000000000000000000000000000000040 +:107050000000000000000000000000000000000030 +:107060000000000000000000000000000000000020 +:107070000000000001010000000000000101010209 +:107080000000000000000000000000000000000000 +:1070900000000000000000000000000000000000F0 +:1070A00000000000000000000000000000000000E0 +:1070B00000000000000000000000000000000000D0 +:1070C00000000000000000000000000000000002BE +:1070D00002020100010101010101010101000100A1 +:1070E00000000000000000000000000000000000A0 +:1070F0000000000000000000000000000000000090 +:10710000000000000000000000000000000000007F +:10711000000000000000000000000000000000006F +:10712000010000000100000000000001000000005C +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000003F +:10715000000000000000000000000000000000002F +:10716000000000000000000000000000000000001F +:107170000001010101010100000001000101010203 +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000000EF +:1071A00000000000000000000000000000000000DF +:1071B00000000000000000000000000000000000CF +:1071C00000000000000000000000000000000002BD +:1071D000020202000101020201010101010001009D +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000000000000000008F +:10720000000000000000000000000000000000007E +:10721000000000000000000000000000000000016D +:107220000101000001000100000001010000000058 +:10723000000000000000000000000000000000004E +:10724000000000000000000000000000000000003E +:10725000000000000000000000000000000000002E +:10726000000000000000000000000000000000001E +:107270000001010101010101010001000101010200 +:1072800000000000000000000000000000000000FE +:1072900000000000000000000000000000000000EE +:1072A00000000000000000000000000000000000DE +:1072B00000000000000000000000000000000000CE +:1072C00000000000000000000000000000000002BC +:1072D0000202020102020202010101010100010099 +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:10730000000000000000000000000000000000007D +:10731000000000000000000000000000000000016C +:107320000201000001000100000001010000010055 +:10733000000000000000000000000000000000004D +:10734000000000000000000000000000000000003D +:10735000000000000000000000000000000000002D +:10736000000000000000000000000000000000001D +:1073700001010101010101010101010101010102FC +:1073800002000000000000000000000000000000FB +:1073900000000000000000000000000000000000ED +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000000000000000000CD +:1073C00000000000000000000000000000000002BB +:1073D0000202020202020202010102010100010096 +:1073E000000000000000000000000000000000009D +:1073F000000000000000000000000000000000008D +:10740000000000000000000000000000000000007C +:10741000000000000000000000000000000000016B +:107420000201010001010100000101010100010050 +:10743000000000000000000000000000000000004C +:10744000000000000000000000000000000000003C +:10745000000000000000000000000000000000002C +:10746000000000000000000000000000000000001C +:1074700001010101010101010101010101010102FB +:1074800002000000010000000000000000000000F9 +:1074900000000000000000000000000000000000EC +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000000000CC +:1074C00000000000000000000000000000000002BA +:1074D0000202020202020202020102010100010094 +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000008C +:10750000000000000000000000000000000000007B +:107510000000000000000000000000000000000269 +:10752000020201000101010100010101010001004D +:10753000000000000000000000000000000000004B +:10754000000000000000000000000000000000003B +:10755000000000000000000000000000000000002B +:10756000000000000000000000000000000000001B +:1075700001010101010101010101010101010102FA +:1075800002020200010000000000000001000000F3 +:1075900000000000000000000000000000000000EB +:1075A00000000000000000000000000000000000DB +:1075B00000000000000000000000000000000000CB +:1075C00000000000000000000000000000000002B9 +:1075D0000202020202020202020202020200010090 +:1075E000000000000000000000000000000000009B +:1075F000000000000000000000000000000000008B +:10760000000000000000000000000000000000007A +:107610000000000000000000000000000000000268 +:10762000020201010101010100010101010001004B +:10763000000000000000000000000000000000004A +:10764000000000000000000000000000000000003A +:10765000000000000000000000000000000000002A +:10766000000000000000000000000000000000001A +:1076700001010101010101010101010101010102F9 +:1076800002020200010000000000000001000000F2 +:1076900000000000000000000000000000000000EA +:1076A00000000000000000000000000000000000DA +:1076B00000000000000000000000000000000000CA +:1076C00000000000000000000000000000000002B8 +:1076D000020202020202020202020202020002008E +:1076E000000000000000000000000000000000009A +:1076F000000000000000000000000000000000008A +:107700000000000000000000000000000000000079 +:107710000000000000000000000000000000000267 +:107720000202020102010101010101010100010047 +:107730000000000000000000000000000000000049 +:107740000000000000000000000000000000000039 +:107750000000000000000000000000000000000029 +:107760000000000000000000000000000000000019 +:1077700001010101010101010101010101010102F8 +:1077800002020202020000000000000001010000ED +:1077900000000000000000000000000000000000E9 +:1077A00000000000000000000000000000000000D9 +:1077B00000000000000000000000000000000000C9 +:1077C00000000000000000000000000000000002B7 +:1077D000020202020202020202020202020002008D +:1077E0000000000000000000000000000000000099 +:1077F0000000000000000000000000000000000089 +:107800000000000000000000000000000000000078 +:107810000000000000000000000000000000000266 +:107820000202020102010101010101010101010045 +:107830000000000000000000000000000000000048 +:107840000000000000000000000000000000000038 +:107850000000000000000000000000000000000028 +:107860000000000000000000000000000000000018 +:1078700001010101010101010101010101010102F7 +:1078800002020202020000020000000001010000EA +:1078900000000000000000000000000000000000E8 +:1078A00000000000000000000000000000000000D8 +:1078B00000000000000000000000000000000000C8 +:1078C00000000000000000000000000000000002B6 +:1078D000020202020202020202020202020102008B +:1078E0000000000000000000000000000000000098 +:1078F0000000000000000000000000000000000088 +:107900000000000000000000000000000000000077 +:107910000000000000000000000000000000000265 +:107920000202020202010201010101020101010041 +:107930000000000000000000000000000000000047 +:107940000000000000000000000000000000000037 +:107950000000000000000000000000000000000027 +:107960000000000000000000000000000000000017 +:1079700002020101010101010101010101010102F4 +:1079800002020202020002020002000202010000E2 +:1079900000000000000000000000000000000000E7 +:1079A00000000000000000000000000000000000D7 +:1079B00000000000000000000000000000000000C7 +:1079C00000000000000000000000000000000002B5 +:1079D000020202020202020202020202020102008A +:1079E0000000000000000000000000000000000097 +:1079F0000000000000000000000000000000000087 +:107A00000000000000000000000000000000000076 +:107A10000000000000000000000000000000000264 +:107A20000202020202010201010101020101010040 +:107A30000000000000000000000000000000000046 +:107A40000000000000000000000000000000000036 +:107A50000000000000000000000000000000000026 +:107A60000000000000000000000000000000000016 +:107A700002020201010101010101010101010102F2 +:107A800002020202020002020202000202020000DE +:107A900000000000000000000000000000000000E6 +:107AA00000000000000000000000000000000000D6 +:107AB00000000000000000000000000000000000C6 +:107AC00000000000000000000000000000000002B4 +:107AD0000202020202020202020202020201020089 +:107AE0000000000000000000000000000000000096 +:107AF0000000000000000000000000000000000086 +:107B00000000000000000000000000000000000075 +:107B10000000000000000000000000000000000263 +:107B2000020202020202020201010202010101003C +:107B30000000000000000000000000000000000045 +:107B40000000000000000000000000000000000035 +:107B50000000000000000000000000000000000025 +:107B60000000000000000000000000000000000015 +:107B700002020202010101010101010101010102F0 +:107B800002020202020202020202020202020000D9 +:107B900000000000000000000000000000000000E5 +:107BA00000000000000000000000000000000000D5 +:107BB00000000000000000000000000000000000C5 +:107BC00000000000000000000000000000000002B3 +:107BD0000202020202020202020202020202020087 +:107BE0000000000000000000000000000000000095 +:107BF0000000000000000000000000000000000085 +:107C00000000000000000000000000000000000074 +:107C10000000000000000000000000000000000262 +:107C2000020202020202020201020202010101003A +:107C30000000000000000000000000000000000044 +:107C40000000000000000000000000000000000034 +:107C50000000000000000000000000000000000024 +:107C60000000000000000000000000000000000014 +:107C700002020202020101010101010101010102EE +:107C800002020202020202020202020202020000D8 +:107C900000000000000000000000000000000000E4 +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000000C4 +:107CC00000000000000000000000000000000002B2 +:107CD0000202020202020202020202020202020086 +:107CE0000000000000000000000000000000000094 +:107CF0000000000000000000000000000000000084 +:107D00000000000000000000000000000000000073 +:107D10000000000000000000000000000000000261 +:107D20000202020202020202020202020101010038 +:107D30000000000000000000000000000000000043 +:107D40000000000000000000000000000000000033 +:107D50000000000000000000000000000000000023 +:107D60000000000000000000000000000000000013 +:107D700002020202020201010101010101010102EC +:107D800002020202020202020202020202020000D7 +:107D900000000000000000000000000000000000E3 +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000000000000000C3 +:107DC00000000000000000000000000000000002B1 +:107DD0000202020202020202020202020202020085 +:107DE0000000000000000000000000000000000093 +:107DF0000000000000000000000000000000000083 +:107E00000000000000000000000000000000000072 +:107E10000000000000000000000000000000000260 +:107E20000202020202020202020202020101010037 +:107E30000000000000000000000000000000000042 +:107E40000000000000000000000000000000000032 +:107E50000000000000000000000000000000000022 +:107E60000000000000000000000000000000000012 +:107E700002020202020202010101010101010102EA +:107E800002020202020202020202020202020000D6 +:107E900000000000000000000000000000000000E2 +:107EA00000000000000000000000000000000000D2 +:107EB00000000000000000000000000000000000C2 +:107EC00000000000000000000000000000000002B0 +:107ED0000202020202020202020202020202020084 +:107EE0000000000000000000000000000000000092 +:107EF0000000000000000000000000000000000082 +:107F00000000000000000000000000000000000071 +:107F1000000000000000000000000000000000025F +:107F20000202020202020202020202020201010035 +:107F30000000000000000000000000000000000041 +:107F40000000000000000000000000000000000031 +:107F50000000000000000000000000000000000021 +:107F6000000000000000000000000000000000020F +:107F700002020202020202020101010101010102E8 +:107F800002020202020202020202020202020000D5 +:107F900000000000000000000000000000000000E1 +:107FA00000000000000000000000000000000000D1 +:107FB00000000000000000000000000000000000C1 +:107FC00000000000000000000000000000000002AF +:107FD0000202020202020202020202020202020083 +:107FE0000000000000000000000000000000000091 +:107FF0000000000000000000000000000000000081 +:108000000000000000000000000000000000000070 +:10801000000000000000000000000000000000025E +:108020000202020202020202020202020201020033 +:108030000000000000000000000000000000000040 +:108040000000000000000000000000000000000030 +:108050000000000000000000000000000000000020 +:10806000000000000000000000000000000000020E +:1080700002020202020202020201010101010102E6 +:1080800002020202020202020202020101010100D6 +:1080900000000000000000000000000000000000E0 +:1080A00000000000000000000000000000000000D0 +:1080B00000000000000000000000000000000000C0 +:1080C00000000000000000000000000000000002AE +:1080D0000202020202020202020202020202020082 +:1080E0000000000000000000000000000000000090 +:1080F0000000000000000000000000000000000080 +:10810000000000000000000000000000000000006F +:10811000000000000000000000000000000000025D +:108120000202020202020202020202020202020031 +:10813000000000000000000000000000000000003F +:10814000000000000000000000000000000000002F +:10815000000000000000000000000000000000001F +:10816000000000000000000000000000000000020D +:1081700002020202020202020202020101010102E3 +:1081800002020202020202020201010101010100D7 +:1081900000000000000000000000000000000000DF +:1081A00000000000000000000000000000000000CF +:1081B00000000000000000000000000000000000BF +:1081C00000000000000000000000000000000002AD +:1081D0000202020202020202020202020202020081 +:1081E000000000000000000000000000000000008F +:1081F000000000000000000000000000000000007F +:10820000000000000000000000000000000000006E +:10821000000000000000000000000000000000025C +:108220000202020202020202020202020202020030 +:10823000000000000000000000000000000000003E +:10824000000000000000000000000000000000002E +:10825000000000000000000000000000000000001E +:10826000000000000000000000000000000000020C +:1082700002020202020202020202020202020102DF +:1082800002020202020202010101010101010100D8 +:1082900000000000000000000000000000000000DE +:1082A00000000000000000000000000000000000CE +:1082B00000000000000000000000000000000000BE +:1082C00000000000000000000000000000000002AC +:1082D0000202020202020202020202020202020080 +:1082E000000000000000000000000000000000008E +:1082F000000000000000000000000000000000007E +:10830000000000000000000000000000000000006D +:10831000000000000000000000000000000000025B +:10832000020202020202020202020202020202002F +:10833000000000000000000000000000000000003D +:10834000000000000000000000000000000000002D +:10835000000000000000000000000000000000001D +:10836000000000000000000000000000000000020B +:1083700002020202020202020202020202020202DD +:1083800002020202020201010101010101010100D8 +:1083900000000000000000000000000000000000DD +:1083A00000000000000000000000000000000000CD +:1083B00000000000000000000000000000000000BD +:1083C00000000000000000000000000000000002AB +:1083D000020202020202020202020202020202007F +:1083E000000000000000000000000000000000008D +:1083F000000000000000000000000000000000007D +:10840000000000000000000000000000000000006C +:10841000000000000000000000000000000000025A +:10842000020202020202020202020202020202002E +:10843000000000000000000000000000000000003C +:10844000000000000000000000000000000000002C +:10845000000000000000000000000000000000001C +:10846000000000000000000000000000000000020A +:1084700002020202020202020202020202020202DC +:1084800002020202010101010101010101010100D9 +:1084900000000000000000000000000000000000DC +:1084A00000000000000000000000000000000000CC +:1084B00000000000000000000000000000000000BC +:1084C00000000000000000000000000000000002AA +:1084D000020202020202020202020202020202007E +:1084E000000000000000000000000000000000008C +:1084F000000000000000000000000000000000007C +:10850000000000000000000000000000000000006B +:108510000000000000000000000000000000000259 +:10852000020202020202020202020202020202002D +:10853000000000000000000000000000000000003B +:10854000000000000000000000000000000000002B +:10855000000000000000000000000000000000001B +:108560000000000000000000000000000000000209 +:1085700002020202020202020202020202020201DC +:1085800002020101010101010101010101010100DA +:1085900000000000000000000000000000000000DB +:1085A00000000000000000000000000000000000CB +:1085B00000000000000000000000000000000000BB +:1085C00000000000000000000000000000000002A9 +:1085D0000202020202020202020201010101010082 +:1085E000000000000000000000000000000000008B +:1085F000000000000000000000000000000000007B +:10860000000000000000000000000000000000006A +:108610000000000000000000000000000000000258 +:10862000020202020202020202020202020202002C +:10863000000000000000000000000000000000003A +:10864000000000000000000000000000000000002A +:10865000000000000000000000000000000000001A +:108660000000000000000000000000000000000208 +:1086700002020202020202020202020202020201DB +:1086800001010101010101010101010101010100DB +:1086900000000000000000000000000000000000DA +:1086A00000000000000000000000000000000000CA +:1086B00000000000000000000000000000000000BA +:1086C00000000000000000000000000000000002A8 +:1086D0000202020202020101010101010101010085 +:1086E000000000000000000000000000000000008A +:1086F000000000000000000000000000000000007A +:108700000000000000000000000000000000000069 +:108710000000000000000000000000000000000257 +:10872000020202020202020202020202020202002B +:108730000000000000000000000000000000000039 +:108740000000000000000000000000000000000029 +:108750000000000000000000000000000000000019 +:108760000000000000000000000000000000000207 +:1087700002020202020202020202020202020201DA +:1087800001010101010101010101010101010100DA +:1087900000000000000000000000000000000000D9 +:1087A00000000000000000000000000000000000C9 +:1087B00000000000000000000000000000000000B9 +:1087C00000000000000000000000000000000002A7 +:1087D0000202020202010101010101010101010085 +:1087E0000000000000000000000000000000000089 +:1087F0000000000000000000000000000000000079 +:108800000000000000000000000000000000000068 +:108810000000000000000000000000000000000256 +:10882000020202020202020202020202020202002A +:108830000000000000000000000000000000000038 +:108840000000000000000000000000000000000028 +:108850000000000000000000000000000000000018 +:108860000000000000000000000000000000000206 +:1088700002020202020202020202020202020201D9 +:1088800001010101010101010101010101010100D9 +:1088900000000000000000000000000000000000D8 +:1088A00000000000000000000000000000000000C8 +:1088B00000000000000000000000000000000000B8 +:1088C00000000000000000000000000000000002A6 +:1088D0000101010101010101010101010101010089 +:1088E0000000000000000000000000000000000088 +:1088F0000000000000000000000000000000000078 +:108900000000000000000000000000000000000067 +:108910000000000000000000000000000000000255 +:108920000202020202020202020202020202020029 +:108930000000000000000000000000000000000037 +:108940000000000000000000000000000000000027 +:108950000000000000000000000000000000000017 +:108960000000000000000000000000000000000205 +:1089700002020202020202020202020202020201D8 +:1089800001010101010101010101010101010100D8 +:1089900000000000000000000000000000000000D7 +:1089A00000000000000000000000000000000000C7 +:1089B00000000000000000000000000000000000B7 +:1089C00000000000000000000000000000000001A6 +:1089D0000101010101010101010101010101010088 +:1089E0000000000000000000000000000000000087 +:1089F0000000000000000000000000000000000077 +:108A00000000000000000000000000000000000066 +:108A10000000000000000000000000000000000254 +:108A20000202020202020202020202020202020028 +:108A30000000000000000000000000000000000036 +:108A40000000000000000000000000000000000026 +:108A50000000000000000000000000000000000016 +:108A60000000000000000000000000000000000204 +:108A700002020202020202020202020202020201D7 +:108A800001010101010101010101010101010100D7 +:108A900000000000000000000000000000000000D6 +:108AA00000000000000000000000000000000000C6 +:108AB00000000000000000000000000000000000B6 +:108AC00000000000000000000000000000000001A5 +:108AD0000101010101010101010101010101010087 +:108AE0000000000000000000000000000000000086 +:108AF0000000000000000000000000000000000076 +:108B00000000000000000000000000000000000065 +:108B10000000000000000000000000000000000253 +:108B20000202020202020202020202010202020028 +:108B30000000000000000000000000000000000035 +:108B40000000000000000000000000000000000025 +:108B50000000000000000000000000000000000015 +:108B60000000000000000000000000000000000203 +:108B700002020202020202020202020202020201D6 +:108B800001010101010101010101010101010100D6 +:108B900000000000000000000000000000000000D5 +:108BA00000000000000000000000000000000000C5 +:108BB00000000000000000000000000000000000B5 +:108BC00000000000000000000000000000000001A4 +:108BD0000101010101010101010101010101010086 +:108BE0000000000000000000000000000000000085 +:108BF0000000000000000000000000000000000075 +:108C00000000000000000000000000000000000064 +:108C10000000000000000000000000000000000252 +:108C20000202020202020202020201010202020028 +:108C30000000000000000000000000000000000034 +:108C40000000000000000000000000000000000024 +:108C50000000000000000000000000000000000014 +:108C60000000000000000000000000000000000202 +:108C700002020202020202020202020202020201D5 +:108C800001010101010101010101010101010100D5 +:108C900000000000000000000000000000000000D4 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000000000000000000B4 +:108CC00000000000000000000000000000000001A3 +:108CD0000101010101010101010101010101010085 +:108CE0000000000000000000000000000000000084 +:108CF0000000000000000000000000000000000074 +:108D00000000000000000000000000000000000063 +:108D10000000000000000000000000000000000251 +:108D2000020202020202010101010101010101002E +:108D30000000000000000000000000000000000033 +:108D40000000000000000000000000000000000023 +:108D50000000000000000000000000000000000013 +:108D60000000000000000000000000000000000201 +:108D700002020202020202020202020202020201D4 +:108D800001010101010101010101010101010100D4 +:108D900000000000000000000000000000000000D3 +:108DA00000000000000000000000000000000000C3 +:108DB00000000000000000000000000000000000B3 +:108DC00000000000000000000000000000000001A2 +:108DD0000101010101010101010101010101010084 +:108DE0000000000000000000000000000000000083 +:108DF0000000000000000000000000000000000073 +:108E00000000000000000000000000000000000062 +:108E10000000000000000000000000000000000250 +:108E20000101010101010101010101010101010033 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 +:108E50000000000000000000000000000000000012 +:108E60000000000000000000000000000000000200 +:108E700002020202020202020202020202020201D3 +:108E800001010101010101010101010101010100D3 +:108E900000000000000000000000000000000000D2 +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC00000000000000000000000000000000001A1 +:108ED0000101010101010101010101010101010083 +:108EE0000000000000000000000000000000000082 +:108EF0000000000000000000000000000000000072 +:108F00000000000000000000000000000000000061 +:108F10000000000000000000000000000000000150 +:108F20000101010101010101010101010101010032 +:108F30000000000000000000000000000000000031 +:108F40000000000000000000000000000000000021 +:108F50000000000000000000000000000000000011 +:108F600000000000000000000000000000000002FF +:108F700002020202020202020202020202020201D2 +:108F800001010101010101010101010101010100D2 +:108F900000000000000000000000000000000000D1 +:108FA00000000000000000000000000000000000C1 +:108FB00000000000000000000000000000000000B1 +:108FC00000000000000000000000000000000001A0 +:108FD0000101010101010101010101010101010082 +:108FE0000000000000000000000000000000000081 +:108FF0000000000000000000000000000000000071 +:109000000000000000000000000000000000000060 +:10901000000000000000000000000000000000014F +:109020000101010101010101010101010101010031 +:109030000000000000000000000000000000000030 +:109040000000000000000000000000000000000020 +:109050000000000000000000000000000000000010 +:1090600000000000000000000000000000000002FE +:1090700002020202020202020202020202020201D1 +:1090800001010101010101010101010101010100D1 +:1090900000000000000000000000000000000000D0 +:1090A00000000000000000000000000000000000C0 +:1090B00000000000000000000000000000000000B0 +:1090C000000000000000000000000000000000019F +:1090D0000101010101010101010101010101010081 +:1090E0000000000000000000000000000000000080 +:1090F0000000000000000000000000000000000070 +:10910000000000000000000000000000000000005F +:10911000000000000000000000000000000000014E +:109120000101010101010101010101010101010030 +:10913000000000000000000000000000000000002F +:10914000000000000000000000000000000000001F +:10915000000000000000000000000000000000000F +:1091600000000000000000000000000000000002FD +:1091700002020202020202020202020202020201D0 +:1091800001010101010101010101010101010100D0 +:1091900000000000000000000000000000000000CF +:1091A00000000000000000000000000000000000BF +:1091B00000000000000000000000000000000000AF +:1091C000000000000000000000000000000000019E +:1091D0000101010101010101010101010101010080 +:1091E000000000000000000000000000000000007F +:1091F000000000000000000000000000000000006F +:10920000000000000000000000000000000000005E +:10921000000000000000000000000000000000014D +:10922000010101010101010101010101010101002F +:10923000000000000000000000000000000000002E +:10924000000000000000000000000000000000001E +:10925000000000000000000000000000000000000E +:1092600000000000000000000000000000000002FC +:1092700002020202020202020202020202020201CF +:1092800001010101010101010101010101010100CF +:1092900000000000000000000000000000000000CE +:1092A00000000000000000000000000000000000BE +:1092B00000000000000000000000000000000000AE +:1092C000000000000000000000000000000000019D +:1092D000010101010101010101010101010101007F +:1092E000000000000000000000000000000000007E +:1092F000000000000000000000000000000000006E +:10930000000000000000000000000000000000005D +:10931000000000000000000000000000000000014C +:10932000010101010101010101010101010101002E +:10933000000000000000000000000000000000002D +:10934000000000000000000000000000000000001D +:10935000000000000000000000000000000000000D +:1093600000000000000000000000000000000002FB +:1093700002020202020202020202020202020201CE +:1093800001010101010101010101010101010100CE +:1093900000000000000000000000000000000000CD +:1093A00000000000000000000000000000000000BD +:1093B00000000000000000000000000000000000AD +:1093C000000000000000000000000000000000019C +:1093D000010101010101010101010101010101007E +:1093E000000000000000000000000000000000007D +:1093F000000000000000000000000000000000006D +:10940000000000000000000000000000000000005C +:10941000000000000000000000000000000000014B +:10942000010101010101010101010101010101002D +:10943000000000000000000000000000000000002C +:10944000000000000000000000000000000000001C +:10945000000000000000000000000000000000000C +:1094600000000000000000000000000000000002FA +:1094700002020202020202020202020202020201CD +:1094800001010101010101010101010101010100CD +:1094900000000000000000000000000000000000CC +:1094A00000000000000000000000000000000000BC +:1094B00000000000000000000000000000000000AC +:1094C000000000000000000000000000000000019B +:1094D000010101010101010101010101010101007D +:1094E000000000000000000000000000000000007C +:1094F000000000000000000000000000000000006C +:10950000000000000000000000000000000000005B +:10951000000000000000000000000000000000014A +:10952000010101010101010101010101010101002C +:10953000000000000000000000000000000000002B +:10954000000000000000000000000000000000001B +:10955000000000000000000000000000000000000B +:1095600000000000000000000000000000000002F9 +:1095700002020202020202020202020202020201CC +:1095800001010101010101010101010101010100CC +:1095900000000000000000000000000000000000CB +:1095A00000000000000000000000000000000000BB +:1095B00000000000000000000000000000000000AB +:1095C000000000000000000000000000000000019A +:1095D000010101010101010101010101010101007C +:1095E000000000000000000000000000000000007B +:1095F000000000000000000000000000000000006B +:10960000000000000000000000000000000000005A +:109610000000000000000000000000000000000149 +:10962000010101010101010101010101010101002B +:10963000000000000000000000000000000000002A +:10964000000000000000000000000000000000001A +:10965000000000000000000000000000000000000A +:1096600000000000000000000000000000000002F8 +:1096700002020202020202020202020202020201CB +:1096800001010101010101010101010101010100CB +:1096900000000000000000000000000000000000CA +:1096A00000000000000000000000000000000000BA +:1096B00000000000000000000000000000000000AA +:1096C0000000000000000000000000000000000199 +:1096D000010101010101010101010101010101007B +:1096E000000000000000000000000000000000007A +:1096F000000000000000000000000000000000006A +:109700000000000000000000000000000000000059 +:109710000000000000000000000000000000000148 +:10972000010101010101010101010101010101002A +:109730000000000000000000000000000000000029 +:109740000000000000000000000000000000000019 +:109750000000000000000000000000000000000009 +:1097600000000000000000000000000000000002F7 +:1097700002020202020202020202020202020201CA +:1097800001010101010101010101010101010100CA +:1097900000000000000000000000000000000000C9 +:1097A00000000000000000000000000000000000B9 +:1097B00000000000000000000000000000000000A9 +:1097C0000000000000000000000000000000000198 +:1097D000010101010101010101010101010101007A +:1097E0000000000000000000000000000000000079 +:1097F0000000000000000000000000000000000069 +:109800000000000000000000000000000000000058 +:109810000000000000000000000000000000000246 +:10982000020202020202020202020202020202001A +:109830000000000000000000000000000000000028 +:109840000000000000000000000000000000000018 +:109850000000000000000000000000000000000008 +:1098600000000000000000000000000000000000F8 +:1098700002020202020202020202020202020201C9 +:1098800001010101010101010101010101010100C9 +:1098900000000000000000000000000000000000C8 +:1098A00000000000000000000000000000000000B8 +:1098B00000000000000000000000000000000000A8 +:1098C0000000000000000000000000000000000296 +:1098D000020202020202020202020202020202006A +:1098E0000000000000000000000000000000000078 +:1098F0000000000000000000000000000000000068 +:109900000000000000000000000000000000000057 +:109910000000000000000000000000000000000245 +:109920000202020202020202020202020202020019 +:109930000000000000000000000000000000000027 +:109940000000000000000000000000000000000017 +:109950000000000000000000000000000000000007 +:1099600000000000000000000000000000000000F7 +:1099700001010101010101010101010101010100D8 +:1099800000000000000000000000000000000000D7 +:1099900000000000000000000000000000000000C7 +:1099A00000000000000000000000000000000000B7 +:1099B00000000000000000000000000000000000A7 +:1099C0000000000000000000000000000000000097 +:1099D0000000000000000000000000000000000087 +:1099E0000000000000000000000000000000000077 +:1099F0000000000000000000000000000000000067 +:109A00000000000000000000000000000000000056 +:109A10000000000000000000000000000000000046 +:109A20000000000000000000000000000000000036 +:109A30000000000000000000000000000000000026 +:109A40000000000000000000000000000000000016 +:109A50000000000000000000000000000000000006 +:109A600000000000000000000000000000000000F6 +:109A70000000000000000000000000000000002EB8 +:109A800000000000000000000000000000000000D6 +:109A900000000000000000000000000000000000C6 +:109AA00000000000000000000000000000000000B6 +:109AB00000000000000000000000000000000000A6 +:109AC0000000000000000000000000000000000096 +:109AD0000000000000000000000000000000000086 +:109AE0000000000000000000000000000000000076 +:109AF0000000000000000000000000000000000066 +:109B00000000000000000000000000000000000055 +:109B10000000000000000000000000000000000045 +:109B20000000000000000000000000010000000034 +:109B30000000000000000000000000000000000025 +:109B40000000000000000000000000000000000015 +:109B50000000000000000000000000000000000005 +:109B600000000000000000000000000000000000F5 +:109B700000000000000000000000000000000000E5 +:109B800000000000000000010000000000000000D4 +:109B900000000000000000000000000000000000C5 +:109BA00000000000000000000000000000000000B5 +:109BB00000000000000000000000000000000000A5 +:109BC0000000000000000000000000000000000095 +:109BD0000000000000000000000000000000000085 +:109BE0000100000000000000000000000000000074 +:109BF0000000000000000000000000000000000065 +:109C00000000000000000000000000000000000054 +:109C10000000000000000000000000000000000044 +:109C20000000000000000000000000010000000033 +:109C30000000000000010000000000000000000023 +:109C40000000000000000000000000000000000014 +:109C50000000000000000000000000000000000004 +:109C600000000000000000000000000000000000F4 +:109C700000000000000000000000000000000000E4 +:109C800000000000000000010000000000000000D3 +:109C900000000000000000000000000000000000C4 +:109CA00000000000000000000000000000000000B4 +:109CB00000000000000000000000000000000000A4 +:109CC0000000000000000000000000000000000094 +:109CD0000000000000000000000000000000000084 +:109CE0000101000000000000000000000000000072 +:109CF0000000000000000000000000000000000064 +:109D00000000000000000000000000000000000053 +:109D10000000000000000000000000000000000043 +:109D2000000000000000000000000001010100012F +:109D30000000000001010000000000000000000021 +:109D40000000000000000000000000000000000013 +:109D50000000000000000000000000000000000003 +:109D600000000000000000000000000000000000F3 +:109D700000000000000000000000000000000000E3 +:109D800000000000000000010100000000000000D1 +:109D900000000000000000000000000000000000C3 +:109DA00000000000000000000000000000000000B3 +:109DB00000000000000000000000000000000000A3 +:109DC0000000000000000000000000000000000093 +:109DD0000000000000000001000000000000000082 +:109DE0000101000000000000000000000000000071 +:109DF0000000000000000000000000000000000063 +:109E00000000000000000000000000000000000052 +:109E10000000000000000000000000000000000042 +:109E2000000000000000000000000001010100012E +:109E3000000000000101010000000000000000001F +:109E40000000000000000000000000000000000012 +:109E50000000000000000000000000000000000002 +:109E600000000000000000000000000000000000F2 +:109E700000000000000000000000010100010001DE +:109E800000000000010000010100000000000000CF +:109E900001000000000000000000000000000000C1 +:109EA00000000000000000000000000000000000B2 +:109EB00000000000000000000000000000000000A2 +:109EC0000000000000000000000000000000000092 +:109ED0000000000000000001000000000000000081 +:109EE0000101000000000000000000000000000070 +:109EF0000000000000000000000000000000000062 +:109F00000000000000000000000000000000000051 +:109F10000000000000000000000000000000000041 +:109F2000000000000000000000000001010101012C +:109F3000000000000101010000000000000000001E +:109F40000000000000000000000000000000000011 +:109F50000000000000000000000000000000000001 +:109F600000000000000000000000000000000000F1 +:109F700000000000000000000000010100010001DD +:109F800000000000010100020100000000000000CC +:109F900001000000000000000000000000000000C0 +:109FA00000000000000000000000000000000000B1 +:109FB00000000000000000000000000000000000A1 +:109FC0000000000000000000000000000000000091 +:109FD000000000000000000100000001000000007F +:109FE000010100000000000000000000000000006F +:109FF0000000000000000000000000000000000061 +:10A000000000000000000000000000000000000050 +:10A010000000000000000000000000000000000040 +:10A02000000000000000000000000001010101012B +:10A03000000000000101010000000000000000001D +:10A040000000000000000000000000000000000010 +:10A050000000000000000000000000000000000000 +:10A0600000000000000000000000000000000000F0 +:10A0700000000000000000000000010101010101DA +:10A0800001000000010100020100000000000000CA +:10A0900001000000000000000000000000000000BF +:10A0A00000000000000000000000000000000000B0 +:10A0B00000000000000000000000000000000000A0 +:10A0C0000000000000000000000000000000000090 +:10A0D000000000000000000201010101000000007A +:10A0E000010100000000010000000000000000006D +:10A0F0000000000000000000000000000000000060 +:10A10000000000000000000000000000000000004F +:10A11000000000000000000000000000000000003F +:10A12000000000000000000000000001010101012A +:10A13000010001000101010000000000000000001A +:10A14000000000000000000000000000000000000F +:10A1500000000000000000000000000000000000FF +:10A1600000000000000000000000000000000000EF +:10A1700000000000000000000000010101010101D9 +:10A1800001010001010101020100000000000000C6 +:10A1900001000000000000000000000000000000BE +:10A1A00000000000000000000000000000000000AF +:10A1B000000000000000000000000000000000009F +:10A1C000000000000000000000000000000000008F +:10A1D0000000000000000002010101010100000078 +:10A1E000010100000000010000000000000000006C +:10A1F000000000000000000000000000000000005F +:10A20000000000000000000000000000000000004E +:10A21000000000000000000000000000000000003E +:10A220000000000000000001010000010101010127 +:10A230000100010001010100000000000000000019 +:10A24000000000000000000000000000000000000E +:10A2500000000000000000000000000000000000FE +:10A2600000000000000000000000000000000000EE +:10A2700000000000000000000000010101010101D8 +:10A2800001010101010101020200010000000001C1 +:10A2900001000000000000000000000000000000BD +:10A2A00000000000000000000000000000000000AE +:10A2B000000000000000000000000000000000009E +:10A2C000000000000000000000000000000000008E +:10A2D0000000000000000002010101010100000077 +:10A2E000010100000000010000000000000000006B +:10A2F000000000000000000000000000000000005E +:10A30000000000000000000000000000000000004D +:10A31000000000000000000000000000000000003D +:10A320000000000000000001010100010101010125 +:10A330000100010001010100000000000000000018 +:10A34000000000000000000000000000000000000D +:10A3500000000000000000000000000000000000FD +:10A3600000000000000000000000000000000000ED +:10A3700000000000000000000000010101010101D7 +:10A3800001010101010101020200010000000001C0 +:10A3900001000000000000000000000000000000BC +:10A3A00000000000000000000000000000000000AD +:10A3B000000000000000000000000000000000009D +:10A3C000000000000000000000000000000000008D +:10A3D0000000000000000002020102010101000073 +:10A3E0000202000000000100000000000000000068 +:10A3F000000000000000000000000000000000005D +:10A40000000000000000000000000000000000004C +:10A41000000000000000000000000000000000003C +:10A420000000000000000001010100010101010124 +:10A430000100010001010100000000000000000017 +:10A44000000000000000000000000000000000000C +:10A4500000000000000000000000000000000000FC +:10A4600000000000000000000000000000000000EC +:10A4700000000000000000000000010101010101D6 +:10A4800001010101010101020200010100000101BD +:10A4900002000000000000000000000000000000BA +:10A4A00000000000000000000000000000000000AC +:10A4B000000000000000000000000000000000009C +:10A4C000000000000000000000000000000000008C +:10A4D0000000000000000002020202020101000070 +:10A4E0000202000000000100000000000000000067 +:10A4F000000000000000000000000000000000005C +:10A50000000000000000000000000000000000004B +:10A51000000000000000000000000000000000003B +:10A520000000000000000001010101020101010121 +:10A530000100010001010100000000000000000016 +:10A54000000000000000000000000000000000000B +:10A5500000000000000000000000000000000000FB +:10A5600000000000000000000000000000000000EB +:10A5700000000000000000000000010101010101D5 +:10A5800001010101010101020200010100000101BC +:10A5900002000000000000000000000000000000B9 +:10A5A00000000000000000000000000000000000AB +:10A5B000000000000000000000000000000000009B +:10A5C000000000000000000000000000000000008B +:10A5D000000000000000000202020202020101006D +:10A5E0000202000000000100000000000000000066 +:10A5F000000000000000000000000000000000005B +:10A60000000000000000000000000000000000004A +:10A61000000000000000000000000000000000003A +:10A62000000000000000000201010102010101011F +:10A630000100010001010100000000000000000015 +:10A64000000000000000000000000000000000000A +:10A6500000000000000000000000000000000000FA +:10A6600000000000000000000000000000000000EA +:10A6700000000000000000000000010101010101D4 +:10A6800001010101010101020200020100010101B9 +:10A6900002000000000000000000000000000000B8 +:10A6A00000000000000000000000000000000000AA +:10A6B000000000000000000000000000000000009A +:10A6C000000000000000000000000000000000008A +:10A6D000000000000000000202020202020101016B +:10A6E0000202000000000100000000000000000065 +:10A6F000000000000000000000000000000000005A +:10A700000000000000000000000000000000000049 +:10A710000000000000000000000000000000000039 +:10A72000000000000000000202010102020101011C +:10A730000100010001010100000000000000000014 +:10A740000000000000000000000000000000000009 +:10A7500000000000000000000000000000000000F9 +:10A7600000000000000000000000000000000000E9 +:10A7700000000000000000000000010101010101D3 +:10A7800001010101010101020200020100010102B7 +:10A7900002010001000000000000000000000000B5 +:10A7A00000000000000000000000000000000000A9 +:10A7B0000000000000000000000000000000000099 +:10A7C0000000000000000000000000000000000089 +:10A7D0000000000000000002020202020202010169 +:10A7E0000202010000000100000000000000000063 +:10A7F0000000000000000000000000000000000059 +:10A800000000000000000000000000000000000048 +:10A810000000000000000000000000000000000038 +:10A82000000000000000000202010102020201011A +:10A830000101010101010100000000000000000011 +:10A840000000000000000000000000000000000008 +:10A8500000000000000000000000000000000000F8 +:10A8600000000000000000000000000000000000E8 +:10A8700000000000000000000000010101010101D2 +:10A8800001010101010101020201020201010202B2 +:10A8900002010001000000000000000000000000B4 +:10A8A00000000000000000000000000000000000A8 +:10A8B0000000000000000000000000000000000098 +:10A8C0000000000000000000000000000000000088 +:10A8D0000000000000000002020202020202020167 +:10A8E0000202010000000100000000000000000062 +:10A8F0000000000000000000000000000000000058 +:10A900000000000000000000000000000000000047 +:10A910000000000000000000000000000000000037 +:10A920000000000000000002020201020202020216 +:10A930000101010101010100000000000000000010 +:10A940000000000000000000000000000000000007 +:10A9500000000000000000000000000000000000F7 +:10A9600000000000000000000000000000000000E7 +:10A9700000000000000000000000000101010101D2 +:10A9800001010101010101020201020201010202B1 +:10A9900002020001000000000000000000000000B2 +:10A9A00000000000000000000000000000000000A7 +:10A9B0000000000000000000000000000000000097 +:10A9C0000000000000000000000000000000000087 +:10A9D0000000000000000002020202020202020265 +:10A9E000020202000100020000000000000000005E +:10A9F0000000000000000000000000000000000057 +:10AA00000000000000000000000000000000000046 +:10AA10000000000000000000000000000000000036 +:10AA20000000000000000002020202020202020214 +:10AA3000010101010101010000000000000000000F +:10AA40000000000000000000000000000000000006 +:10AA500000000000000000000000000000000000F6 +:10AA600000000000000000000000000000000000E6 +:10AA700000000000000000000000020001010101D0 +:10AA800001010101010101020201020202020202AE +:10AA900002020102000000000000000000000000AF +:10AAA00000000000000000000000000000000000A6 +:10AAB0000000000000000000000000000000000096 +:10AAC0000000000000000000000000000000000086 +:10AAD0000000000000000002020202020202020264 +:10AAE000020202000100020000000000000000005D +:10AAF0000000000000000000000000000000000056 +:10AB00000000000000000000000000000000000045 +:10AB10000000000000000000000000000000000035 +:10AB20000000000000000002020202020202020213 +:10AB3000020101010101010000000000000000000D +:10AB40000000000000000000000000000000000005 +:10AB500000000000000000000000000000000000F5 +:10AB600000000000000000000000000000000000E5 +:10AB700000000000000000000000020201010101CD +:10AB800001010101010101020202020202020202AC +:10AB900002020102000000000000000000000000AE +:10ABA00000000000000000000000000000000000A5 +:10ABB0000000000000000000000000000000000095 +:10ABC0000000000000000000000000000000000085 +:10ABD0000000000000000002020202020202020263 +:10ABE000020202000100020000000000000000005C +:10ABF0000000000000000000000000000000000055 +:10AC00000000000000000000000000000000000044 +:10AC10000000000000000000000000000000000034 +:10AC20000000000000000002020202020202020212 +:10AC30000201020102020100000000000000000009 +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000000F4 +:10AC600000000000000000000000000000000000E4 +:10AC700000000000000000000000020200000101CE +:10AC800001010101010101020202020202020202AB +:10AC900002020202000000000000000000000000AC +:10ACA00000000000000000000000000000000000A4 +:10ACB0000000000000000000000000000000000094 +:10ACC0000000000000000000000000000000000084 +:10ACD0000000000000000002020202020202020262 +:10ACE000020202010100020000000000000000005A +:10ACF0000000000000000000000000000000000054 +:10AD00000000000000000000000000000000000043 +:10AD10000000000000000000000000000000000033 +:10AD20000000000000000002020202020202020211 +:10AD30000201020102020100000000000000000008 +:10AD40000000000000000000000000000000000003 +:10AD500000000000000000000000000000000000F3 +:10AD600000000000000000000000000000000000E3 +:10AD700000000000000000000000020202020000CB +:10AD800001010101010101020202020202020202AA +:10AD900002020202000100000000000000000000AA +:10ADA00000000000000000000000000000000000A3 +:10ADB0000000000000000000000000000000000093 +:10ADC0000000000000000000000000000000000083 +:10ADD0000000000000000002020202020202020261 +:10ADE0000202020202000200000000000000000057 +:10ADF0000000000000000000000000000000000053 +:10AE00000000000000000000000000000000000042 +:10AE10000000000000000000000000000000000032 +:10AE20000000000000000002020202020202020210 +:10AE30000201020102020200000000000000000006 +:10AE40000000000000000000000000000000000002 +:10AE500000000000000000000000000000000000F2 +:10AE600000000000000000000000000000000000E2 +:10AE700000000000000000000000020202020202C6 +:10AE800000010101010101020202020202020202AA +:10AE900002020202000100000000000000000000A9 +:10AEA00000000000000000000000000000000000A2 +:10AEB0000000000000000000000000000000000092 +:10AEC0000000000000000000000000000000000082 +:10AED0000000000000000002020202020202020260 +:10AEE0000202020202000200000000000000000056 +:10AEF0000000000000000000000000000000000052 +:10AF00000000000000000000000000000000000041 +:10AF10000000000000000000000000000000000031 +:10AF2000000000000000000202020202020202020F +:10AF30000202020102020200000000000000000004 +:10AF40000000000000000000000000000000000001 +:10AF500000000000000000000000000000000000F1 +:10AF600000000000000000000000000000000000E1 +:10AF700000000000000000000001020202020202C4 +:10AF800002000101010101020202020202020202A8 +:10AF900002020202000100000000000000000000A8 +:10AFA00000000000000000000000000000000000A1 +:10AFB0000000000000000000000000000000000091 +:10AFC0000000000000000000000000000000000081 +:10AFD000000000000000000202020202020202025F +:10AFE0000202020202000200000000000000000055 +:10AFF0000000000000000000000000000000000051 +:10B000000000000000000000000000000000000040 +:10B010000000000000000000000000000000000030 +:10B02000000000000000000202020202020202020E +:10B030000202020202020200000000000000000002 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000000000000F0 +:10B0600000000000000000000000000000000000E0 +:10B0700000000000000000000101020202020202C2 +:10B0800002020000000101020202020202020202A8 +:10B0900002020202010100000000000000000000A6 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000000000000000000000000000000000090 +:10B0C0000000000000000000000000000000000080 +:10B0D000000000000000000202020202020202025E +:10B0E0000202020202010200000000000000000053 +:10B0F0000000000000000000000000000000000050 +:10B10000000000000000000000000000000000003F +:10B11000000000000000000000000000000000002F +:10B12000000000000000000202020202020202020D +:10B130000202020202020200000000000000000001 +:10B1400000000000000000000000000000000000FF +:10B1500000000000000000000000000000000000EF +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000020001020202020202C0 +:10B1800002020202020001020202020202020202A2 +:10B1900002020202010201000000000000000000A3 +:10B1A000000000000000000000000000000000009F +:10B1B000000000000000000000000000000000008F +:10B1C000000000000000000000000000000000007F +:10B1D000000000000000000202020202020202025D +:10B1E0000202020202020200000000000000000051 +:10B1F000000000000000000000000000000000004F +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B22000000000000000000202020202020202020C +:10B230000202020202020200000000000000000000 +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000020200020202020202BE +:10B28000020202020202010202020202020202029F +:10B2900001010201010201000000000000000000A5 +:10B2A000000000000000000000000000000000009E +:10B2B000000000000000000000000000000000008E +:10B2C000000000000000000000000000000000007E +:10B2D000000000000000000202020202020202025C +:10B2E0000202020202020200000000000000000050 +:10B2F000000000000000000000000000000000004E +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000202020202020202020B +:10B3300002020202020202000000000000000000FF +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000020202020202020202BB +:10B3800002020202020200020202020202020201A0 +:10B3900001010101010201000000000000000000A5 +:10B3A000000000000000000000000000000000009D +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000000000000007D +:10B3D000000000000000000202020202020202025B +:10B3E0000200000202020200000000000000000053 +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000000002C +:10B42000000000000000000202020202020202020A +:10B4300002020202020202000000000000000000FE +:10B4400000000000000000000000000000000000FC +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B4700000000000000000020202020202020202BA +:10B48000020202020202020202020202020201019E +:10B4900001010101020101000000000000000000A4 +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000000000000000000007C +:10B4D000000000000000000202020202020202005C +:10B4E0000200000202020100000000000000000053 +:10B4F000000000000000000000000000000000004C +:10B50000000000000000000000000000000000003B +:10B51000000000000000000000000000000000002B +:10B520000000000000000002020202020202020209 +:10B5300002020202020202000000000000000000FD +:10B5400000000000000000000000000000000000FB +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B5700000000000000000020202020202020202B9 +:10B5800002020202020202010202020201010101A0 +:10B5900001010101020101000000000000000000A3 +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C000000000000000000000000000000000007B +:10B5D0000000000000000002020200020000000063 +:10B5E0000101010101010100000000000000000054 +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B620000000000000000002020202020202020208 +:10B6300002020202020202000000000000000000FC +:10B6400000000000000000000000000000000000FA +:10B6500000000000000000000000000000000000EA +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000020202020202020202B8 +:10B6800002020202020202010102010101010101A2 +:10B6900001010101010101000000000000000000A3 +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D0000000000000000002020200020000000062 +:10B6E0000101010101010100000000000000000053 +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 +:10B720000000000000000002020202020202020207 +:10B7300002020202020202000000000000000000FB +:10B7400000000000000000000000000000000000F9 +:10B7500000000000000000000000000000000000E9 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000020202020202020202B7 +:10B7800002020202020202010102010101010101A1 +:10B7900001010101010101000000000000000000A2 +:10B7A0000000000000000000000000000000000099 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000000000000000079 +:10B7D0000000000000000000020000010101010162 +:10B7E0000101010101010100000000000000000052 +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820000000000000000002020202020202020206 +:10B8300002020202020202000000000000000000FA +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000000E8 +:10B8600000000000000000000000000000000000D8 +:10B8700000000000000000020202020202020202B6 +:10B8800002020202020202010101010101010101A1 +:10B8900001010101010101000000000000000000A1 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D000000000000000000101010101010101015F +:10B8E0000101010101010100000000000000000051 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000000000000000000000037 +:10B910000000000000000000000000000000000027 +:10B920000000000000000002020202020202020205 +:10B9300002020202020202000000000000000000F9 +:10B9400000000000000000000000000000000000F7 +:10B9500000000000000000000000000000000000E7 +:10B9600000000000000000000000000000000000D7 +:10B9700000000000000000020202020202020202B5 +:10B9800002020202020202010101010101010101A0 +:10B9900001010101010101000000000000000000A0 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D000000000000000000101010101010101015E +:10B9E0000101010101010100000000000000000050 +:10B9F0000000000000000000000000000000000047 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000002020202020202020204 +:10BA300002020202020202000000000000000000F8 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000000000000E6 +:10BA600000000000000000000000000000000000D6 +:10BA700000000000000000020202020202020202B4 +:10BA8000020202020202020101010101010101019F +:10BA9000010101010101010000000000000000009F +:10BAA0000000000000000000000000000000000096 +:10BAB0000000000000000000000000000000000086 +:10BAC0000000000000000000000000000000000076 +:10BAD000000000000000000101010101010101015D +:10BAE000010101010101010000000000000000004F +:10BAF0000000000000000000000000000000000046 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000002020202020202020203 +:10BB300002020202020202000000000000000000F7 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000020202020202020202B3 +:10BB8000020202020202020101010101010101019E +:10BB9000010101010101010000000000000000009E +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD000000000000000000101010101010101015C +:10BBE000010101010101010000000000000000004E +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000002020202020202020202 +:10BC300002020202020202000000000000000000F6 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000020202020202020202B2 +:10BC8000020202020202020101010101010101019D +:10BC9000010101010101010000000000000000009D +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD000000000000000000101010101010101015B +:10BCE000010101010101010000000000000000004D +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000002020202010101010106 +:10BD300001010101010101000000000000000000FC +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000000000000000D3 +:10BD700000000000000000020202020202020202B1 +:10BD8000020202020202020101010101010101019C +:10BD9000010101010101010000000000000000009C +:10BDA0000000000000000000000000000000000093 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000000000000073 +:10BDD000000000000000000101010101010101015A +:10BDE000010101010101010000000000000000004C +:10BDF0000000000000000000000000000000000043 +:10BE00000000000000000000000000000000000032 +:10BE10000000000000000000000000000000000022 +:10BE20000000000000000001010101010101010109 +:10BE300001010101010101000000000000000000FB +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000000000000000000000000D2 +:10BE700000000000000000020202020202020202B0 +:10BE8000020202020202020101010101010101019B +:10BE9000010101010101010000000000000000009B +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000001010101010101010159 +:10BEE000010101010101010000000000000000004B +:10BEF0000000000000000000000000000000000042 +:10BF00000000000000000000000000000000000031 +:10BF10000000000000000000000000000000000021 +:10BF20000000000000000001010101010101010108 +:10BF300001010101010101000000000000000000FA +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000020202020202020202AF +:10BF8000020202020202020101010101010101019A +:10BF9000010101010101010000000000000000009A +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000001010101010101010158 +:10BFE000010101010101010000000000000000004A +:10BFF0000000000000000000000000000000000041 +:10C000000000000000000000000000000000000030 +:10C010000000000000000000000000000000000020 +:10C020000000000000000001010101010101010107 +:10C0300001010101010101000000000000000000F9 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C0700000000000000000020202020202020202AE +:10C080000202020202020201010101010101010199 +:10C090000101010101010100000000000000000099 +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000001010101010101010157 +:10C0E0000101010101010100000000000000000049 +:10C0F0000000000000000000000000000000000040 +:10C10000000000000000000000000000000000002F +:10C11000000000000000000000000000000000001F +:10C120000000000000000001010101010101010106 +:10C1300001010101010101000000000000000000F8 +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000000000000000000000CF +:10C1700000000000000000020202020202020202AD +:10C180000202020202020201010101010101010198 +:10C190000101010101010100000000000000000098 +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000000000006F +:10C1D0000000000000000001010101010101010156 +:10C1E0000101010101010100000000000000000048 +:10C1F000000000000000000000000000000000003F +:10C20000000000000000000000000000000000002E +:10C21000000000000000000000000000000000001E +:10C220000000000000000001010101010101010105 +:10C2300001010101010101000000000000000000F7 +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C2700000000000000000020202020202020202AC +:10C280000202020202020201010101010101010197 +:10C290000101010101010100000000000000000097 +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000000000000000000000007E +:10C2C000000000000000000000000000000000006E +:10C2D0000000000000000001010101010101010155 +:10C2E0000101010101010100000000000000000047 +:10C2F000000000000000000000000000000000003E +:10C30000000000000000000000000000000000002D +:10C31000000000000000000000000000000000001D +:10C320000000000000000001010101010101010104 +:10C3300001010101010101000000000000000000F6 +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000020202020202020202AB +:10C380000202020202020201010101010101010196 +:10C390000101010101010100000000000000000096 +:10C3A000000000000000000000000000000000008D +:10C3B000000000000000000000000000000000007D +:10C3C000000000000000000000000000000000006D +:10C3D0000000000000000001010101010101010154 +:10C3E0000101010101010100000000000000000046 +:10C3F000000000000000000000000000000000003D +:10C40000000000000000000000000000000000002C +:10C41000000000000000000000000000000000001C +:10C420000000000000000001010101010101010103 +:10C4300001010101010101000000000000000000F5 +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000020202020202020202AA +:10C480000202020202020201010101010101010195 +:10C490000101010101010100000000000000000095 +:10C4A000000000000000000000000000000000008C +:10C4B000000000000000000000000000000000007C +:10C4C000000000000000000000000000000000006C +:10C4D0000000000000000001010101010101010153 +:10C4E0000101010101010100000000000000000045 +:10C4F000000000000000000000000000000000003C +:10C50000000000000000000000000000000000002B +:10C51000000000000000000000000000000000001B +:10C520000000000000000001010101010101010102 +:10C5300001010101010101000000000000000000F4 +:10C5400000000000000000000000000000000000EB +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000020202020202020202A9 +:10C580000202020202020201010101010101010194 +:10C590000101010101010100000000000000000094 +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000000006B +:10C5D0000000000000000002020202020202020249 +:10C5E000020202020202020000000000000000003D +:10C5F000000000000000000000000000000000003B +:10C60000000000000000000000000000000000002A +:10C61000000000000000000000000000000000001A +:10C6200000000000000000020202020202020202F8 +:10C6300002020202020202000000000000000000EC +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000000CA +:10C6700000000000000000020202020202020202A8 +:10C680000202020202020201010101010101010193 +:10C690000101010101010100000000000000000093 +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D0000000000000000002020202020202020248 +:10C6E000020202020202020000000000000000003C +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C710000000000000000000000000000000000019 +:10C7200000000000000000020202020202020202F7 +:10C7300002020202020202000000000000000000EB +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000000000000000D9 +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000010101010101B3 +:10C7800001010101010101000000000000000000A2 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F0000000000000000000000000000000000039 +:10C800000000000000000000000000000000000028 +:10C810000000000000000000000000000000000018 +:10C820000000000000000000000000000000000008 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000000000000000000000C8 +:10C8700000000000000000000000000000000000B8 +:10C88000000000000000002C00000000000000007C +:10C890000000000000000000000000000000000098 +:10C8A0000000000000000000000000000000000088 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E0000000000000000000000000000000000048 +:10C8F0000000000000000000000000000000000038 +:10C900000000000000000000000000000000000027 +:10C910000000000000000000000000000000000017 +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000100F6 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000000000000000000000000C7 +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A0000000000000000000000000000000000087 +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E0000000000000000000000000010000000046 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10000000000000000000000000000000000016 +:10CA20000000000000000000000000000000000006 +:10CA300000000000010100000000000000000100F3 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000000000000000000000000000C6 +:10CA700000000000000000000000000000000000B6 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB0000000000000000000000000000000000076 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000000000000010000000045 +:10CAF0000000000000000000000000000000000036 +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 +:10CB20000000000000000000000000000000000005 +:10CB300000000000010101000000000000000100F1 +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB700000000000000000000000000000000000B5 +:10CB800000000000000000000000000000000000A5 +:10CB90000000000000000000000000000000000095 +:10CBA0000000000000000000000000000000000085 +:10CBB0000000000000000000000000000000000075 +:10CBC0000000000000000000000000000000000065 +:10CBD0000000000000000000000000000000000055 +:10CBE0000100000001000000000000010000000042 +:10CBF0000000000000000000000000000000000035 +:10CC00000000000000000000000000000000000024 +:10CC10000000000000000000000000000000000014 +:10CC20000000000000000000000000000000000004 +:10CC300000000000010101000000000000000100F0 +:10CC400000000000000000000000000000000000E4 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000000000000000000B4 +:10CC800000000000000000000000000000000000A4 +:10CC90000001010000010000000000000000000091 +:10CCA0000000000000000000000000000000000084 +:10CCB0000000000000000000000000000000000074 +:10CCC0000000000000000000000000000000000064 +:10CCD0000000000000000000000000000000000153 +:10CCE0000100000001000000000000010000000041 +:10CCF0000000000000000000000000000000000034 +:10CD00000000000000000000000000000000000023 +:10CD10000000000000000000000000000000000013 +:10CD20000000000000000000000000000000000003 +:10CD300000000000010101000000000000000100EF +:10CD400000000000000000000000000000000000E3 +:10CD500000000000000000000000000000000000D3 +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000000000000000000B3 +:10CD800000000000000000000000000000000001A2 +:10CD90000001010000010000000000000000000090 +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000000000000000000073 +:10CDC0000000000000000000000000000000000063 +:10CDD0000000000000000000000000000000000152 +:10CDE000010000000101000000000001000000003F +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE10000000000000000000000000000000000012 +:10CE20000000000000000000000000000000000002 +:10CE300000000000010101000000000000000100EE +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000000000000000000000000D2 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000000001A1 +:10CE9000000101000101000000000000000000008E +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0000000000000000000000000000000000151 +:10CEE000010000000101000000000001010001003C +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000000000000000011 +:10CF20000000000000000000000000000000000100 +:10CF300000000000010101000000000000010100EC +:10CF400000000000000000000000000000000000E1 +:10CF500000000000000000000000000000000000D1 +:10CF600000000000000000000000000000000000C1 +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000001A0 +:10CF9000000101000101000000000000010000008C +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000000000000000000071 +:10CFC0000000000000000000000000000000000061 +:10CFD0000000000000000000000000000000000150 +:10CFE000010100000101000000000001010001003A +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D010000000000000000000000000000000000010 +:10D0200000000000000000000000000000000001FF +:10D0300001000000010101010101000000010100E7 +:10D0400000000000000000000000000000000000E0 +:10D0500000000000000000000000000000000000D0 +:10D0600000000000000000000000000000000000C0 +:10D0700000000000000000000000000000000000B0 +:10D08000000000000000000000000000000000029E +:10D090000001010101010000010100000100000088 +:10D0A0000000000000000000000000000000000080 +:10D0B0000000000000000000000000000000000070 +:10D0C0000000000000000000000000000000000060 +:10D0D000000000000000000000000000000000024E +:10D0E0000101000001010000000001010101010037 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D1200000000000000000000000000000000001FE +:10D1300001000000010101010101000000010100E6 +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000000000000000BF +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000029D +:10D190000002020101010000010100000100000085 +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000024D +:10D1E0000101010001010000000001010101010035 +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D2200000000000000000000000000000000001FD +:10D2300001000000010101010101000000010100E5 +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE +:10D2700000000000000000000000000000000000AE +:10D28000000000000100000000000000000000029B +:10D290000102020101020000010100010100000081 +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C000000000000000000000000000000000005E +:10D2D000000000000000000000000000000000024C +:10D2E0000201010001010100000001010101010032 +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000002FB +:10D3300001000000010101010101000001010100E3 +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD +:10D3700000000000000000000000000000000000AD +:10D38000000000000100000000000000000000029A +:10D39000010202010202000001010001010000007F +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000024B +:10D3E000020101010101010000010101010101002F +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000002FA +:10D4300001010000010101010101000001010100E1 +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D480000000000001000000000000010000000298 +:10D49000010202020202000101020001020000007A +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D000000000000000000000000000000000024A +:10D4E000020201010201010000010101010101002C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000002F9 +:10D5300001010000020201010101010001010100DD +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D580000100010001000000000000010000010294 +:10D590000102020202020101020200020201000075 +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D0000000000000000000000000000000000249 +:10D5E0000202020102020100000101020101010028 +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000002F8 +:10D6300002010100020202010101010101010100D8 +:10D6400000000000000000000000000000000000DA +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D680000100000101000000000000010000010293 +:10D690000202020202020101020200020201000073 +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D0000000000000000000000000000000000248 +:10D6E0000202020102020100000101020101010027 +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000002F7 +:10D7300002010100020202010101010101010100D7 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000000000000000C9 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D780000100000000000000000000010000010294 +:10D790000202020202020102020201020201000070 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000247 +:10D7E0000202020202020101000101020101010024 +:10D7F0000000000000000000000000000000000029 +:10D800000000000000000000000000000000000018 +:10D810000000000000000000000000000000000008 +:10D8200000000000000000000000000000000002F6 +:10D8300002020101020202010101010101010100D4 +:10D8400000000000000000000000000000000000D8 +:10D8500000000000000000000000000000000000C8 +:10D8600000000000000000000000000000000000B8 +:10D8700000000000000000000000000000000000A8 +:10D880000001000000000000010000010000010292 +:10D89000020202020202020202020202020200006C +:10D8A0000000000000000000000000000000000078 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000000000000000000000058 +:10D8D0000000000000000000000000000000000246 +:10D8E0000202020202020201000102020201010020 +:10D8F0000000000000000000000000000000000028 +:10D900000000000000000000000000000000000017 +:10D910000000000000000000000000000000000007 +:10D9200000000000000000000000000000000002F5 +:10D9300002020201020202020101010101010100D1 +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D9600000000000000000000000000000000000B7 +:10D9700000000000000000000000000000000000A7 +:10D980000000000000010100010000010000010290 +:10D99000020202020202020202020202020200006B +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000245 +:10D9E000020202020202020101020202020101001D +:10D9F0000000000000000000000000000000000027 +:10DA00000000000000000000000000000000000016 +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000000000000000000002F4 +:10DA300002020201020202020202010101010200CD +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000000C6 +:10DA600000000000000000000000000000000000B6 +:10DA700000000000000000000000000000000000A6 +:10DA8000000000000001010001000000010001028F +:10DA9000020202020202020202020202020200006A +:10DAA0000000000000000000000000000000000076 +:10DAB0000000000000000000000000000000000066 +:10DAC0000000000000000000000000000000000056 +:10DAD0000000000000000000000000000000000244 +:10DAE000020202020202020101020202020201001B +:10DAF0000000000000000000000000000000000026 +:10DB00000000000000000000000000000000000015 +:10DB10000000000000000000000000000000000005 +:10DB200000000000000000000000000000000002F3 +:10DB300002020202020202020202010101010200CB +:10DB400000000000000000000000000000000000D5 +:10DB500000000000000000000000000000000000C5 +:10DB600000000000000000000000000000000000B5 +:10DB700000000000000000000000000000000000A5 +:10DB8000000000000001010001000000010001028E +:10DB90000202020202020202020202020202000069 +:10DBA0000000000000000000000000000000000075 +:10DBB0000000000000000000000000000000000065 +:10DBC0000000000000000000000000000000000055 +:10DBD0000000000000000000000000000000000243 +:10DBE0000202020202020202010202020202020018 +:10DBF0000000000000000000000000000000000025 +:10DC00000000000000000000000000000000000014 +:10DC10000000000000000000000000000000000004 +:10DC200000000000000000000000000000000002F2 +:10DC300002020202020202020202010101020200C9 +:10DC400000000000000000000000000000000000D4 +:10DC500000000000000000000000000000000000C4 +:10DC600000000000000000000000000000000000B4 +:10DC700000000000000000000000000000000000A4 +:10DC8000000000000000000001000000010001028F +:10DC90000202020202020202020202020202000068 +:10DCA0000000000000000000000000000000000074 +:10DCB0000000000000000000000000000000000064 +:10DCC0000000000000000000000000000000000054 +:10DCD0000000000000000000000000000000000242 +:10DCE0000202020202020202010202020202020017 +:10DCF0000000000000000000000000000000000024 +:10DD00000000000000000000000000000000000013 +:10DD10000000000000000000000000000000000003 +:10DD200000000000000000000000000000000002F1 +:10DD300002020202020202020202020102020200C6 +:10DD400000000000000000000000000000000000D3 +:10DD500000000000000000000000000000000000C3 +:10DD600000000000000000000000000000000000B3 +:10DD700000000000000000000000000000000000A3 +:10DD8000000000000000000000000000010101028E +:10DD90000202020202020202020202010101010069 +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 +:10DDC0000000000000000000000000000000000053 +:10DDD0000000000000000000000000000000000241 +:10DDE0000202020202020202020202020202020015 +:10DDF0000000000000000000000000000000000023 +:10DE00000000000000000000000000000000000012 +:10DE10000000000000000000000000000000000002 +:10DE200000000000000000000000000000000002F0 +:10DE300002020202020202020202020202020200C4 +:10DE400000000000000000000000000000000000D2 +:10DE500000000000000000000000000000000000C2 +:10DE600000000000000000000000000000000000B2 +:10DE700000000000000000000000000000000002A0 +:10DE8000000000000000000000010000010101028C +:10DE9000020202020202020202010101010101006A +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC0000000000000000000000000000000000052 +:10DED0000000000000000000000000000000000240 +:10DEE0000202020202020202020202020202020014 +:10DEF0000000000000000000000000000000000022 +:10DF00000000000000000000000000000000000011 +:10DF10000000000000000000000000000000000001 +:10DF200000000000000000000000000000000002EF +:10DF300002020202020202020202020202020200C3 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000000000000000000000000B1 +:10DF7000000000000000000000000000000000029F +:10DF8000000000000000000000010100000101028B +:10DF9000020202020202020201010101010101006A +:10DFA0000000000000000000000000000000000071 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000000000000000000000000051 +:10DFD000000000000000000000000000000000023F +:10DFE0000202020202020202020202020202020013 +:10DFF0000000000000000000000000000000000021 +:10E000000000000000000000000000000000000010 +:10E010000000000000000000000000000000000000 +:10E0200000000000000000000000000000000002EE +:10E0300002020202020202020202020202020200C2 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000000000000000000000C0 +:10E0600000000000000000000000000000000000B0 +:10E07000000000000000000000000000000000029E +:10E080000200000000000001000101000001010287 +:10E09000020202020101020101010101010101006C +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D000000000000000000000000000000000023E +:10E0E0000202020202020202020202020202020012 +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000000000F +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000000000002ED +:10E1300002020202020202020202020202020200C1 +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000000000000000029D +:10E180000200000000000001000101000001000287 +:10E19000020202020101010101010101010101006C +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000000000000000000000023D +:10E1E0000202020202020202020202020202020011 +:10E1F000000000000000000000000000000000001F +:10E20000000000000000000000000000000000000E +:10E2100000000000000000000000000000000000FE +:10E2200000000000000000000000000000000002EC +:10E2300002020202020202020202020202020200C0 +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E2600000000000000000000000000000000000AE +:10E27000000000000000000000000000000000029C +:10E280000202020000000000000001000001000284 +:10E29000020101010101010101010101010101006E +:10E2A000000000000000000000000000000000006E +:10E2B000000000000000000000000000000000005E +:10E2C000000000000000000000000000000000004E +:10E2D000000000000000000000000000000000023C +:10E2E0000202020202020202020202020202020010 +:10E2F000000000000000000000000000000000001E +:10E30000000000000000000000000000000000000D +:10E3100000000000000000000000000000000000FD +:10E3200000000000000000000000000000000002EB +:10E3300002020202020202020202020202020200BF +:10E3400000000000000000000000000000000000CD +:10E3500000000000000000000000000000000000BD +:10E3600000000000000000000000000000000000AD +:10E37000000000000000000000000000000000029B +:10E380000202020000000000000000000001000185 +:10E39000020101010101010101010101010101006D +:10E3A000000000000000000000000000000000006D +:10E3B000000000000000000000000000000000005D +:10E3C000000000000000000000000000000000004D +:10E3D000000000000000000000000000000000023B +:10E3E000020202020202020202020202020202000F +:10E3F000000000000000000000000000000000001D +:10E40000000000000000000000000000000000000C +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000000000000000002EA +:10E4300002020202020202020202020202020200BE +:10E4400000000000000000000000000000000000CC +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000000000029A +:10E480000202020202000000000000000000000181 +:10E49000010101010101010101010101010101006D +:10E4A000000000000000000000000000000000006C +:10E4B000000000000000000000000000000000005C +:10E4C000000000000000000000000000000000004C +:10E4D000000000000000000000000000000000023A +:10E4E000020202020202020202020202020202000E +:10E4F000000000000000000000000000000000001C +:10E50000000000000000000000000000000000000B +:10E5100000000000000000000000000000000000FB +:10E5200000000000000000000000000000000002E9 +:10E5300002020202020202020202020202020200BD +:10E5400000000000000000000000000000000000CB +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000000000000AB +:10E570000000000000000000000000000000000299 +:10E580000202020202000000000000000000000180 +:10E59000010101010101010101010101010101006C +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C000000000000000000000000000000000004B +:10E5D0000000000000000000000000000000000239 +:10E5E000020202020202020202020202020202000D +:10E5F000000000000000000000000000000000001B +:10E60000000000000000000000000000000000000A +:10E6100000000000000000000000000000000000FA +:10E6200000000000000000000000000000000002E8 +:10E6300002020202020202020202020202020200BC +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E6600000000000000000000000000000000000AA +:10E670000000000000000000000000000000000298 +:10E68000020202020202000000000000000000017D +:10E69000010101010101010101010101010101006B +:10E6A000000000000000000000000000000000006A +:10E6B000000000000000000000000000000000005A +:10E6C000000000000000000000000000000000004A +:10E6D0000000000000000000000000000000000238 +:10E6E0000202020202020202020101010101020011 +:10E6F000000000000000000000000000000000001A +:10E700000000000000000000000000000000000009 +:10E7100000000000000000000000000000000000F9 +:10E7200000000000000000000000000000000002E7 +:10E7300002020202020202020202020202020200BB +:10E7400000000000000000000000000000000000C9 +:10E7500000000000000000000000000000000000B9 +:10E7600000000000000000000000000000000000A9 +:10E770000000000000000000000000000000000297 +:10E78000020202020202020000000000000000017A +:10E79000010101010101010101010101010101006A +:10E7A0000000000000000000000000000000000069 +:10E7B0000000000000000000000000000000000059 +:10E7C0000000000000000000000000000000000049 +:10E7D0000000000000000000000000000000000237 +:10E7E0000202020201010101010101010101010016 +:10E7F0000000000000000000000000000000000019 +:10E800000000000000000000000000000000000008 +:10E8100000000000000000000000000000000000F8 +:10E8200000000000000000000000000000000002E6 +:10E8300002020202020202020202020202020200BA +:10E8400000000000000000000000000000000000C8 +:10E8500000000000000000000000000000000000B8 +:10E8600000000000000000000000000000000000A8 +:10E870000000000000000000000000000000000296 +:10E880000202020202020200020000000000020175 +:10E890000101010101010101010101010101010069 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000000000000000000000000000058 +:10E8C0000000000000000000000000000000000048 +:10E8D0000000000000000000000000000000000137 +:10E8E0000101010101010101010101010101010019 +:10E8F0000000000000000000000000000000000018 +:10E900000000000000000000000000000000000007 +:10E9100000000000000000000000000000000000F7 +:10E9200000000000000000000000000000000002E5 +:10E9300002020202020202020202020202020200B9 +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000000A7 +:10E970000000000000000000000000000000000295 +:10E98000020202020202020202020002000002016E +:10E990000101010101010101010101010101010068 +:10E9A0000000000000000000000000000000000067 +:10E9B0000000000000000000000000000000000057 +:10E9C0000000000000000000000000000000000047 +:10E9D0000000000000000000000000000000000136 +:10E9E0000101010101010101010101010101010018 +:10E9F0000000000000000000000000000000000017 +:10EA00000000000000000000000000000000000006 +:10EA100000000000000000000000000000000000F6 +:10EA200000000000000000000000000000000002E4 +:10EA300002020202010101010101010101010100C3 +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000000000000000000294 +:10EA8000020202020202020202020202000002016B +:10EA90000101010101010101010101010101010067 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD0000000000000000000000000000000000135 +:10EAE0000101010101010101010101010101010017 +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000000000000000000F5 +:10EB200000000000000000000000000000000001E4 +:10EB300001010101010101010101010101010100C6 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000000000293 +:10EB80000202020202020202020202020202020166 +:10EB90000101010101010101010101010101010066 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000134 +:10EBE0000101010101010101010101010101010016 +:10EBF0000000000000000000000000000000000015 +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000000000000000000000F4 +:10EC200000000000000000000000000000000001E3 +:10EC300001010101010101010101010101010100C5 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000000A4 +:10EC70000000000000000000000000000000000292 +:10EC80000202020202020202020202020202020165 +:10EC90000101010101010101010101010101010065 +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000133 +:10ECE0000101010101010101010101010101010015 +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000000000001E2 +:10ED300001010101010101010101010101010100C4 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000000000000000000000000B3 +:10ED600000000000000000000000000000000000A3 +:10ED70000000000000000000000000000000000291 +:10ED80000202020202020202020202020202020164 +:10ED90000101010101010101010101010101010064 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000000000000000000000000132 +:10EDE0000101010101010101010101010101010014 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000000000000000000000000000002 +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000000001E1 +:10EE300001010101010101010101010101010100C3 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000290 +:10EE80000202020202020202020202020202020163 +:10EE90000101010101010101010101010101010063 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000131 +:10EEE0000101010101010101010101010101010013 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000001E0 +:10EF300001010101010101010101010101010100C2 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF7000000000000000000000000000000000028F +:10EF80000202020202020202020202020202020162 +:10EF90000101010101010101010101010101010062 +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000130 +:10EFE0000101010101010101010101010101010012 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000000000000000000000000000000000F0 +:10F0200000000000000000000000000000000001DF +:10F0300001010101010101010101010101010100C1 +:10F0400000000000000000000000000000000000C0 +:10F0500000000000000000000000000000000000B0 +:10F0600000000000000000000000000000000000A0 +:10F07000000000000000000000000000000000028E +:10F080000202020202020202020202020202020161 +:10F090000101010101010101010101010101010061 +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D000000000000000000000000000000000012F +:10F0E0000101010101010101010101010101010011 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F1100000000000000000000000000000000000EF +:10F1200000000000000000000000000000000001DE +:10F1300001010101010101010101010101010100C0 +:10F1400000000000000000000000000000000000BF +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000000000009F +:10F17000000000000000000000000000000000028D +:10F180000202020202020202020202020202020160 +:10F190000101010101010101010101010101010060 +:10F1A000000000000000000000000000000000005F +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F +:10F1D000000000000000000000000000000000012E +:10F1E0000101010101010101010101010101010010 +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE +:10F2100000000000000000000000000000000000EE +:10F2200000000000000000000000000000000002DC +:10F2300002020202020202020202020202020200B0 +:10F2400000000000000000000000000000000000BE +:10F2500000000000000000000000000000000000AE +:10F26000000000000000000000000000000000009E +:10F27000000000000000000000000000000000028C +:10F28000020202020202020202020202020202015F +:10F29000010101010101010101010101010101005F +:10F2A000000000000000000000000000000000005E +:10F2B000000000000000000000000000000000004E +:10F2C000000000000000000000000000000000003E +:10F2D000000000000000000000000000000000022C +:10F2E0000202020202020202020202020202020000 +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000000000FD +:10F3100000000000000000000000000000000000ED +:10F3200000000000000000000000000000000002DB +:10F3300002020202020202020202020202020200AF +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F36000000000000000000000000000000000009D +:10F37000000000000000000000000000000000028B +:10F38000020202020202020202020202020202005F +:10F39000000000000000000000000000000000006D +:10F3A000000000000000000000000000000000005D +:10F3B000000000000000000000000000000000004D +:10F3C000000000000000000000000000000000003D +:10F3D000000000000000000000000000000000002D +:10F3E000000000000000000000000000000000001D +:10F3F000000000000000000000000000000000000D +:10F4000000000000000000000000000000000000FC +:10F4100000000000000000000000000000000000EC +:10F4200000000000000000000000000000000000DC +:10F4300000000000000000000000000000000000CC +:10F4400000000000000000000000000000000000BC +:10F4500000000000000000000000000000000000AC +:10F46000000000000000000000000000000000009C +:10F47000000000000000000000000000000000008C +:10F480000000000000000000000000000000002C50 +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B000000000000000000000000000000000004C +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000100000000000000001B +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B000000000000000000000000000000000004B +:10F5C000000000000000000000000000000000003B +:10F5D000000000000000000000000000000000002B +:10F5E000000000000000000100000000000000001A +:10F5F000000000000000000000000000000000000B +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F6400000000000000000000000000000000000BA +:10F6500000000000000000000000000000000000AA +:10F66000000000000000000000000000000000009A +:10F67000000000000000000000000000000000008A +:10F68000000000000000000000000000000000007A +:10F69000000000000000000000000000000000006A +:10F6A000000000000000000000000000000000005A +:10F6B000000000000000000000000000000000004A +:10F6C000000000000000000000000000000000003A +:10F6D000000000000000000000000000000000002A +:10F6E0000000000000000001000000000000000019 +:10F6F000000000000000000000000000000000000A +:10F7000000000000000000000000000000000000F9 +:10F7100000000000000000000000000000000000E9 +:10F7200000000000000000000000000000000000D9 +:10F7300000000000000000000000000000000000C9 +:10F7400000000000000000000000000000000000B9 +:10F7500000000000000000000000000000000000A9 +:10F760000000000000000000000000000000000099 +:10F770000000000000000000000000000000000089 +:10F780000000000000000000000000000000000079 +:10F790000000000000000000000000000000000069 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C0000000000000000000000000000000000039 +:10F7D0000000000000000000000000000000000029 +:10F7E0000000000000000002000000000000000017 +:10F7F0000001000000000000000000000000000008 +:10F8000000000000000000000000000000000000F8 +:10F8100000000000000000000000000000000000E8 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 +:10F8400000000000000000000000000000000000B8 +:10F8500000000000000000000000000000000000A8 +:10F860000000000000000000000000000000000098 +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000000000000000078 +:10F890000000000000000000000100000000000067 +:10F8A0000000000000010000000000000000000057 +:10F8B0000000000000000000000000000000000048 +:10F8C0000000000000000000000000000000000038 +:10F8D0000000000000000000000000000000000028 +:10F8E0000000000000000002000000000001000015 +:10F8F0000001010100000100000000000000000004 +:10F9000000000000000000000000000000000000F7 +:10F9100000000000000000000000000000000000E7 +:10F9200000000000000000000000000000000000D7 +:10F9300000000000000000000000000000000000C7 +:10F9400000000000000000000000000000000000B7 +:10F9500000000000000000000000000000000000A7 +:10F960000000000000000000000000000000000097 +:10F970000000000000000000000000000000000087 +:10F980000000000000000000000200000000000075 +:10F990000000000000000000000100000100000065 +:10F9A0000000000000010000000000000000000056 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000000000000000037 +:10F9D0000000000000000000000000000000000027 +:10F9E0000000000000000002000100000001010012 +:10F9F0000001010101010100000000000000000001 +:10FA000000000000000000000000000000000000F6 +:10FA100000000000000000000000000000000000E6 +:10FA200000000000000000000000000000000000D6 +:10FA300000000000000000000000000000000000C6 +:10FA400000000000000000000000000000000000B6 +:10FA500000000000000000000000000000000000A6 +:10FA60000000000000000000000000000000000096 +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000200000000000074 +:10FA90000000000000000000010100000100000063 +:10FAA0000000000000010000000000000000000055 +:10FAB0000000000000000000000000000000000046 +:10FAC0000000000000000000000000000000000036 +:10FAD0000000000000000000000000000000000026 +:10FAE000000000000000000200010001010101010E +:10FAF0000001010101010100000000000000000000 +:10FB000000000000000000000000000000000000F5 +:10FB100000000000000000000000000000000000E5 +:10FB200000000000000000000000000000000000D5 +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000000000000000B5 +:10FB500000000000000000000000000000000000A5 +:10FB60000000000000000000000000000000000095 +:10FB70000000000000000000000000000000000085 +:10FB80000000000000000000000200000000000073 +:10FB90000000000000000001010100000100000061 +:10FBA0000000000000010000000000000000000054 +:10FBB0000000000000000000000000000000000045 +:10FBC0000000000000000000000000000000000035 +:10FBD0000000000000000000000000000000000025 +:10FBE000000000000000000201010001010101010C +:10FBF00000010101010101000000000000000000FF +:10FC000000000000000000000000000000000000F4 +:10FC100000000000000000000000000000000000E4 +:10FC200000000000000000000000000000000000D4 +:10FC300000000000000000000000000000000000C4 +:10FC400000000000000000000000000000000000B4 +:10FC500000000000000000000000000000000000A4 +:10FC60000000000000000000000000000000000094 +:10FC70000000000000000000000000000000000084 +:10FC80000000000000000000000200000000000072 +:10FC90000000000000000001010100000100000060 +:10FCA0000001000001010000000000000000000051 +:10FCB0000000000000000000000000000000000044 +:10FCC0000000000000000000000000000000000034 +:10FCD0000000000000000000000000000000000024 +:10FCE000000000000000000201010101010101010A +:10FCF00000010101010101000000000000000000FE +:10FD000000000000000000000000000000000000F3 +:10FD100000000000000000000000000000000000E3 +:10FD200000000000000000000000000000000000D3 +:10FD300000000000000000000000000000000000C3 +:10FD400000000000000000000000000000000000B3 +:10FD500000000000000000000000000000000000A3 +:10FD60000000000000000000000000000000000093 +:10FD70000000000000000000000000000000000083 +:10FD80000000000000000000000100000000000072 +:10FD9000000000000100000101010000010100005D +:10FDA000000101000101000000000000000000004F +:10FDB0000000000000000000000000000000000043 +:10FDC0000000000000000000000000000000000033 +:10FDD0000000000000000000000000000000000023 +:10FDE0000000000000000002010201010101010108 +:10FDF00001010101010101000000000000000000FC +:10FE000000000000000000000000000000000000F2 +:10FE100000000000000000000000000000000000E2 +:10FE200000000000000000000000000000000000D2 +:10FE300000000000000000010000000000000000C1 +:10FE400000000000000000000000000000000000B2 +:10FE500000000000000000000000000000000000A2 +:10FE60000000000000000000000000000000000092 +:10FE70000000000000000000000000000000000082 +:10FE80000000000000000000000101000000000070 +:10FE9000000000000100000101010000010101005B +:10FEA000000101000101000000000000000000004E +:10FEB0000000000000000000000000000000000042 +:10FEC0000000000000000000000000000000000032 +:10FED0000000000000000000000000000000000022 +:10FEE0000000000000000002010201010101010107 +:10FEF00001010101010101000000000000000000FB +:10FF000000000000000000000000000000000000F1 +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000000000000000000000000D1 +:10FF300000000000000000010000000000000000C0 +:10FF400000000000000000000000000000000000B1 +:10FF500000000000000000000000000000000000A1 +:10FF60000000000000000000000000000000000091 +:10FF70000000000000000000000000000000000081 +:10FF8000000000000000000000010100000000006F +:10FF90000000000001000002010200010101010057 +:10FFA000000101000101000000000000000000004D +:10FFB0000000000000000000000000000000000041 +:10FFC0000000000000000000000000000000000031 +:10FFD0000000000000000000000000000000000021 +:10FFE0000000000000000002020201010102010104 +:10FFF00001020101010101000000000000000000F9 +:02000002A0005C +:1000000000000000000000000000000000000000F0 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000000000000010000000000000000BF +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:10008000000000000000000000010100010000016C +:100090000000000001000002010200010101010056 +:1000A000000101000101000000000000000000004C +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000002020202020102020100 +:1000F00001020201010101000000000000000000F7 +:1001000000000000000000000000000000000000EF +:1001100000000000000000000000000000000000DF +:1001200000000000000000000000000000000000CF +:1001300000000000000000010000000000000000BE +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000001010100010000016A +:100190000000000001010002020201010101010151 +:1001A000000101010101000000000000000000004A +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000000000001F +:1001E00000000000000000020202020202020202FD +:1001F00001020202010101000000000000000000F5 +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:1002200000000000000000000000000000000000CE +:1002300000000000000000020000000001000000BB +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E +:100280000000000000000000010100010100000169 +:10029000000000000101010202020101010101014F +:1002A0000102010101010000000000000000000047 +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E00000000000000000020202020202020202FC +:1002F00001020202020202000000000000000000F1 +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000020001000001000000B9 +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D +:100380000000000000000000010100010100000168 +:10039000010000000101010202020101020201014B +:1003A0000102020101020000000000000000000044 +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E00000000000000000020202020202020202FB +:1003F00002020202020202000000000000000000EF +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC +:1004300000000000000000020101010101000000B5 +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C +:100480000000000000000000000000010100000169 +:100490000100000101010102020201010202020148 +:1004A0000102020101020000000000000000000043 +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E00000000000000000020202020202020202FA +:1004F00002020202020202000000000000000000EE +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:1005300000000000000000020101010101000000B4 +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:100580000000000000000000000000010100000168 +:100590000100010101010102020201020202020145 +:1005A0000102020101020000000000000000000042 +:1005B000000000000000000000000000000000003B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E00000000000000000020202020202020202F9 +:1005F00002020202020202000000000000000000ED +:1006000000000000000000000000000000000000EA +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000020101010101010000B2 +:1006400000000000000001000000000000000000A9 +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:100680000000000000000000000000010100000167 +:100690000100010101010102020202020202020242 +:1006A0000102020101020000000000000000000041 +:1006B000000000000000000000000000000000003A +:1006C000000000000000000000000000000000002A +:1006D000000000000000000000000000000000001A +:1006E00000000000000000020202020202020202F8 +:1006F00002020202020202000000000000000000EC +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000020102010101010100AF +:1007400001000000010101000000000000000000A5 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000010068 +:100790000100010101010102020202020202020241 +:1007A000010202010202000000000000000000003F +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E00000000000000000020202020202020202F7 +:1007F00002020202020202000000000000000000EB +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:1008200000000000000000000000000000000000C8 +:1008300000000000000000020202010101010101AC +:1008400001000101010101000000000000000000A2 +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000010067 +:100890000101010100010102020202020202020240 +:1008A000010202020202000000000000000000003D +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000000000000000000028 +:1008D0000000000000000000000000000000000018 +:1008E00000000000000000020202020202020202F6 +:1008F00002020202020202000000000000000000EA +:1009000000000000000000000000000000000000E7 +:1009100000000000000000000000000000000000D7 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000020202020101010101AA +:1009400001000101010101000000000000000000A1 +:100950000000000000000000000000000000000097 +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000010066 +:10099000010101010001010202020202020202023F +:1009A000020202020202000000000000000000003B +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000000000000000017 +:1009E00000000000000000020202020202020202F5 +:1009F00002020202020202000000000000000000E9 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000000000000000000000C6 +:100A300000000000000000020202020202010101A7 +:100A400001000101010101000000000000000000A0 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000001010064 +:100A9000000101010001010202020202020202023F +:100AA000020202020202000000000000000000003A +:100AB0000000000000000000000000000000000036 +:100AC0000000000000000000000000000000000026 +:100AD0000000000000000000000000000000000016 +:100AE00000000000000000020202020202020202F4 +:100AF00002020202020202000000000000000000E8 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000000000000000000000C5 +:100B300000000000000000020202020202010101A6 +:100B4000010001010101010000000000000000009F +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000001010063 +:100B9000000101010000010202020202020202023F +:100BA0000202020202020100000000000000000038 +:100BB0000000000000000000000000000000000035 +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000000015 +:100BE00000000000000000020202020202020202F3 +:100BF00002020202020202000000000000000000E7 +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000000000000000000000C4 +:100C300000000000000000020202020202020101A4 +:100C4000010001010101010000000000000000009E +:100C50000000000000000000000000000000000094 +:100C60000000000000000000000000000000000084 +:100C70000000000000000000000000000000000074 +:100C80000000000000000002000000000001000061 +:100C9000000100010000010202020202020202023F +:100CA0000201010202020100000000000000000039 +:100CB0000000000000000000000000000000000034 +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000000000000000000000014 +:100CE00000000000000000020202020202020202F2 +:100CF00002020202020202000000000000000000E6 +:100D000000000000000000000000000000000000E3 +:100D100000000000000000000000000000000000D3 +:100D200000000000000000000000000000000000C3 +:100D300000000000000000020202020202020201A2 +:100D4000010101010101010000000000000000009C +:100D50000000000000000000000000000000000093 +:100D60000000000000000000000000000000000083 +:100D70000000000000000000000000000000000073 +:100D80000000000000000002000000000001000060 +:100D90000000000000000002020202020202020241 +:100DA0000201010202010100000000000000000039 +:100DB0000000000000000000000000000000000033 +:100DC0000000000000000000000000000000000023 +:100DD0000000000000000000000000000000000013 +:100DE00000000000000000020202020202020202F1 +:100DF00002020202020202000000000000000000E5 +:100E000000000000000000000000000000000000E2 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E300000000000000000020202020202020202A0 +:100E4000020101010101010000000000000000009A +:100E50000000000000000000000000000000000092 +:100E60000000000000000000000000000000000082 +:100E70000000000000000000000000000000000072 +:100E8000000000000000000202020000000000005C +:100E90000000000000000002020202020201010143 +:100EA0000201010102010100000000000000000039 +:100EB0000000000000000000000000000000000032 +:100EC0000000000000000000000000000000000022 +:100ED0000000000000000000000000000000000012 +:100EE00000000000000000010202020202020202F1 +:100EF00002010101010101000000000000000000EA +:100F000000000000000000000000000000000000E1 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F3000000000000000000202020202020202029F +:100F40000201020101010100000000000000000098 +:100F50000000000000000000000000000000000091 +:100F60000000000000000000000000000000000081 +:100F70000000000000000000000000000000000071 +:100F8000000000000000000202020000000000005B +:100F90000000000000000002020202020201010142 +:100FA0000201010101010100000000000000000039 +:100FB0000000000000000000000000000000000031 +:100FC0000000000000000000000000000000000021 +:100FD0000000000000000000000000000000000011 +:100FE00000000000000000020202020202010202F0 +:100FF00002020202020202000000000000000000E3 +:1010000000000000000000000000000000000000E0 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 +:10103000000000000000000202020202020202029E +:101040000201020202020200000000000000000093 +:101050000000000000000000000000000000000090 +:101060000000000000000000000000000000000080 +:101070000000000000000000000000000000000070 +:101080000000000000000002020202000000000058 +:101090000000000000000002020102010101010144 +:1010A0000101010101010100000000000000000039 +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D0000000000000000000000000000000000010 +:1010E00000000000000000000201010202020000F6 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000000000000000000000DF +:1011100000000000000000000000000000000000CF +:1011200000000000000000000000000000000000BF +:10113000000000000000000202020202020202029D +:101140000202020202020200000000000000000091 +:10115000000000000000000000000000000000008F +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F +:101180000000000000000002020202020200000053 +:101190000000000000000001010101010101010146 +:1011A0000101010101010100000000000000000038 +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000202020000000101F7 +:1011F00001010101010101000000000000000000E8 +:1012000000000000000000000000000000000000DE +:1012100000000000000000000000000000000000CE +:1012200000000000000000000000000000000000BE +:10123000000000000000000202020202020202029C +:101240000202020202020200000000000000000090 +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000000000007E +:10127000000000000000000000000000000000006E +:101280000000000000000002020202020200000052 +:101290000000000000000001010101010101010145 +:1012A0000101010101010100000000000000000037 +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000000101010101F9 +:1012F00001010101010101000000000000000000E7 +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD +:1013200000000000000000000000000000000000BD +:10133000000000000000000202020202020202029B +:10134000020202020202020000000000000000008F +:10135000000000000000000000000000000000008D +:10136000000000000000000000000000000000007D +:10137000000000000000000000000000000000006D +:10138000000000000000000202020202020000024F +:101390000000000000000001010101010101010144 +:1013A0000101010101010100000000000000000036 +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D000000000000000000000000000000000000D +:1013E00000000000000000010101010101010101F4 +:1013F00001010101010101000000000000000000E6 +:1014000000000000000000000000000000000000DC +:1014100000000000000000000000000000000000CC +:1014200000000000000000000000000000000000BC +:10143000000000000000000202020202020202029A +:10144000020202020202020000000000000000008E +:10145000000000000000000000000000000000008C +:10146000000000000000000000000000000000007C +:10147000000000000000000000000000000000006C +:10148000000000000000000202020202020202024A +:10149000020000000200000101010101010101013F +:1014A0000101010101010100000000000000000035 +:1014B000000000000000000000000000000000002C +:1014C000000000000000000000000000000000001C +:1014D000000000000000000000000000000000000C +:1014E00000000000000000010101010101010101F3 +:1014F00001010101010101000000000000000000E5 +:1015000000000000000000000000000000000000DB +:1015100000000000000000000000000000000000CB +:1015200000000000000000000000000000000000BB +:101530000000000000000002020202020202020299 +:10154000020202020202020000000000000000008D +:10155000000000000000000000000000000000008B +:10156000000000000000000000000000000000007B +:10157000000000000000000000000000000000006B +:101580000000000000000002020202020202020249 +:101590000200020202020201010101010101010136 +:1015A0000101010101010100000000000000000034 +:1015B000000000000000000000000000000000002B +:1015C000000000000000000000000000000000001B +:1015D000000000000000000000000000000000000B +:1015E00000000000000000010101010101010101F2 +:1015F00001010101010101000000000000000000E4 +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:101630000000000000000002020202020202020298 +:10164000020202020202020000000000000000008C +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:10167000000000000000000000000000000000006A +:101680000000000000000002020202020202020248 +:101690000202020202020201010101010101010133 +:1016A0000101010101010100000000000000000033 +:1016B000000000000000000000000000000000002A +:1016C000000000000000000000000000000000001A +:1016D000000000000000000000000000000000000A +:1016E00000000000000000010101010101010101F1 +:1016F00001010101010101000000000000000000E3 +:1017000000000000000000000000000000000000D9 +:1017100000000000000000000000000000000000C9 +:1017200000000000000000000000000000000000B9 +:101730000000000000000002020202020202020297 +:10174000020202020202020000000000000000008B +:101750000000000000000000000000000000000089 +:101760000000000000000000000000000000000079 +:101770000000000000000000000000000000000069 +:101780000000000000000002020202020202020247 +:101790000202020202020201010101010101010132 +:1017A0000101010101010100000000000000000032 +:1017B0000000000000000000000000000000000029 +:1017C0000000000000000000000000000000000019 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000010101010101010101F0 +:1017F00001010101010101000000000000000000E2 +:1018000000000000000000000000000000000000D8 +:1018100000000000000000000000000000000000C8 +:1018200000000000000000000000000000000000B8 +:101830000000000000000002020202020202020296 +:10184000020202020202020000000000000000008A +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880000000000000000002020202020202020246 +:101890000202020202020201010101010101010131 +:1018A0000101010101010100000000000000000031 +:1018B0000000000000000000000000000000000028 +:1018C0000000000000000000000000000000000018 +:1018D0000000000000000000000000000000000008 +:1018E00000000000000000010101010101010101EF +:1018F00001010101010101000000000000000000E1 +:1019000000000000000000000000000000000000D7 +:1019100000000000000000000000000000000000C7 +:1019200000000000000000000000000000000000B7 +:1019300000000000000000000200000000000000A5 +:101940000000000000000000000000000000000097 +:101950000000000000000000000000000000000087 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:101980000000000000000002020202020202020245 +:101990000202020202020201010101010101010130 +:1019A0000101010101010100000000000000000030 +:1019B0000000000000000000000000000000000027 +:1019C0000000000000000000000000000000000017 +:1019D0000000000000000000000000000000000007 +:1019E00000000000000000010101010101010101EE +:1019F00001010101010101000000000000000000E0 +:101A000000000000000000000000000000000000D6 +:101A100000000000000000000000000000000000C6 +:101A200000000000000000000000000000000000B6 +:101A3000000000000000000101010101010101019D +:101A4000010101010101010000000000000000008F +:101A50000000000000000000000000000000000086 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000000000002020202020202020244 +:101A9000020202020202020101010101010101012F +:101AA000010101010101010000000000000000002F +:101AB0000000000000000000000000000000000026 +:101AC0000000000000000000000000000000000016 +:101AD0000000000000000000000000000000000006 +:101AE00000000000000000010101010101010101ED +:101AF00001010101010101000000000000000000DF +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000000000000000000C5 +:101B200000000000000000000000000000000000B5 +:101B3000000000000000000101010101010101019C +:101B4000010101010101010000000000000000008E +:101B50000000000000000000000000000000000085 +:101B60000000000000000000000000000000000075 +:101B70000000000000000000000000000000000065 +:101B80000000000000000002020202020202020243 +:101B9000020202020202020101010101010101012E +:101BA000010101010101010000000000000000002E +:101BB0000000000000000000000000000000000025 +:101BC0000000000000000000000000000000000015 +:101BD0000000000000000000000000000000000005 +:101BE00000000000000000010101010101010101EC +:101BF00001010101010101000000000000000000DE +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000000000000000000000B4 +:101C3000000000000000000101010101010101019B +:101C4000010101010101010000000000000000008D +:101C50000000000000000000000000000000000084 +:101C60000000000000000000000000000000000074 +:101C70000000000000000000000000000000000064 +:101C80000000000000000002020202020202020242 +:101C9000020202020202020101010101010101012D +:101CA000010101010101010000000000000000002D +:101CB0000000000000000000000000000000000024 +:101CC0000000000000000000000000000000000014 +:101CD0000000000000000000000000000000000004 +:101CE00000000000000000010101010101010101EB +:101CF00001010101010101000000000000000000DD +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D200000000000000000000000000000000000B3 +:101D3000000000000000000101010101010101019A +:101D4000010101010101010000000000000000008C +:101D50000000000000000000000000000000000083 +:101D60000000000000000000000000000000000073 +:101D70000000000000000000000000000000000063 +:101D80000000000000000002020202020202020241 +:101D9000020202020202020101010101010101012C +:101DA000010101010101010000000000000000002C +:101DB0000000000000000000000000000000000023 +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000000000000000000003 +:101DE00000000000000000020202020202020202E1 +:101DF00002020202020202000000000000000000D5 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E30000000000000000001010101010101010199 +:101E4000010101010101010000000000000000008B +:101E50000000000000000000000000000000000082 +:101E60000000000000000000000000000000000072 +:101E70000000000000000000000000000000000062 +:101E80000000000000000002020202020202020240 +:101E9000020202020202020101010101010101012B +:101EA000010101010101010000000000000000002B +:101EB0000000000000000000000000000000000022 +:101EC0000000000000000000000000000000000012 +:101ED0000000000000000000000000000000000002 +:101EE00000000000000000020202020202020202E0 +:101EF00002020202020202000000000000000000D4 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F3000000000000000000202020202020202028F +:101F40000202020202020200000000000000000083 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F8000000000000000000202020202020202023F +:101F90000202020202020200000000000000000033 +:101FA0000000000000000000000000000000000031 +:101FB0000000000000000000000000000000000021 +:101FC0000000000000000000000000000000000011 +:101FD0000000000000000000000000000000000001 +:101FE00000000000000000000000000000000000F1 +:101FF00000000000000000000000000000000000E1 +:1020000000000000000000000000000000000000D0 +:1020100000000000000000000000000000000000C0 +:1020200000000000000000000000000000000000B0 +:1020300000000000000000000000000000000000A0 +:102040000000000000000000000000000000000090 +:102050000000000000000000000000000000000080 +:102060000000000000000000000000000000000070 +:102070000000000000000000000000000000000060 +:102080000000000000000000000000000000000050 +:10209000000000000000002400000000000000011B +:1020A0000101010101010101010101010101010021 +:1020B0000000000000000000000000000000000020 +:1020C0000000000000000000000000000000000010 +:1020D0000000000000000000000000000000000000 +:1020E00000000000000000000000000000000000F0 +:1020F00000000000000000000000000000000100DF +:1021000000000000000000000000000000000000CF +:1021100000000000000000000000000000000000BF +:1021200000000000000000000000000000000000AF +:10213000000000000000000000000000000000009F +:10214000000000000000010000000000000101008C +:10215000000000000000000000000000000000007F +:10216000000000000000000000000000000000006F +:10217000000000000000000000000000000000005F +:10218000000000000000000000000000000000024D +:10219000010101010101010101010101010101012F +:1021A0000101010101010101010101010101010020 +:1021B000000000000000000000000000000000001F +:1021C000000000000000000000000000000000000F +:1021D00000000000000000000000000000000000FF +:1021E00000000000000000000000000000000000EF +:1021F00000000000000000000000000000000100DE +:1022000000000000000000000000000000000000CE +:1022100000000000000000000000000000000000BE +:1022200000000000000000000000000000000000AE +:10223000000000000000000000000000000000009E +:102240000000000001010101010100000001010086 +:10225000000000000000000000000000000000007E +:10226000000000000000000000000000000000006E +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000000000024C +:10229000010101010101010101010101010101012E +:1022A000010101010101010101010101010101001F +:1022B000000000000000000000000000000000001E +:1022C000000000000000000000000000000000000E +:1022D00000000000000000000000000000000000FE +:1022E00000000000000000000000000000000000EE +:1022F00000000000000000000000000000000100DD +:1023000000000000000000000000000000000000CD +:1023100000000000000000000000000000000000BD +:1023200000000000000000000000000000000000AD +:10233000000000000000000000000000000000009D +:102340000000000001010101010100000001010085 +:10235000000000000000000000000000000000007D +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000000000005D +:10238000000000000000000000000000000000024B +:10239000010101010101010101010101010101022C +:1023A000010101010101010101010101010101001E +:1023B000000000000000000000000000000000001D +:1023C000000000000000000000000000000000000D +:1023D00000000000000000000000000000000000FD +:1023E00000000000000000000000000000000000ED +:1023F00000000000000100000000000000000100DB +:1024000000000000000000000000000000000000CC +:1024100000000000000000000000000000000000BC +:1024200000000000000000000000000000000000AC +:10243000000000000000000000000000000000009C +:102440000000000001010101010100000001010084 +:10245000000000000000000000000000000000007C +:10246000000000000000000000000000000000006C +:10247000000000000000000000000000000000005C +:10248000000000000000000000000000000000024A +:10249000010101010101010101010101010101022B +:1024A000010101010101010101010101010101001D +:1024B000000000000000000000000000000000001C +:1024C000000000000000000000000000000000000C +:1024D00000000000000000000000000000000000FC +:1024E00000000000000000000000000000000000EC +:1024F00000000000000100000000000000000100DA +:1025000000000000000000000000000000000000CB +:1025100000000000000000000000000000000000BB +:1025200000000000000000000000000000000000AB +:10253000000000000000000000000000000000009B +:102540000000000001010101010100000001010083 +:10255000000000000000000000000000000000007B +:10256000000000000000000000000000000000006B +:10257000000000000000000000000000000000005B +:102580000000000000000000000000000000000249 +:10259000010101010101010101010101010101022A +:1025A0000102010201010101010101010201010019 +:1025B000000000000000000000000000000000001B +:1025C000000000000000000000000000000000000B +:1025D00000000000000000000000000000000000FB +:1025E00000000000000000000000000000000000EB +:1025F00000000000000100000000000000000100D9 +:1026000000000000000000000000000000000000CA +:1026100000000000000000000000000000000000BA +:1026200000000000000000000000000000000000AA +:10263000000000000000000000000000000000009A +:102640000000000001010101010100010001010081 +:10265000000000000000000000000000000000007A +:10266000000000000000000000000000000000006A +:10267000000000000000000000000000000000005A +:102680000000000000000000000000000000000248 +:10269000010001010101010101010101010101022A +:1026A0000202020201020201010102010201010013 +:1026B000000000000000000000000000000000001A +:1026C000000000000000000000000000000000000A +:1026D00000000000000000000000000000000000FA +:1026E00000000000000000000000000000000001E9 +:1026F00001000000000101000000000000010100D5 +:1027000000000000000000000000000000000000C9 +:1027100000000000000000000000000000000000B9 +:1027200000000000000000000000000000000000A9 +:102730000000000000000000000000000000000099 +:10274000000100000101010101010101000101007E +:102750000000000000000000000000000000000079 +:102760000000000000000000000000000000000069 +:102770000000000000000000000000000000000059 +:102780000000000000000000000000000000000247 +:10279000000000000101010101000001000101022F +:1027A000020202020102020202020202020101000E +:1027B0000000000000000000000000000000000019 +:1027C0000000000000000000000000000000000009 +:1027D00000000000000000000000000000000000F9 +:1027E00000000000000000000000000000000001E8 +:1027F00001000001010101010000000000010100D1 +:1028000000000000000000000000000000000000C8 +:1028100000000000000000000000000000000000B8 +:1028200000000000000000000000000000000000A8 +:102830000000000000000000000000000000000098 +:10284000000100000101010101010101000101007D +:102850000000000000000000000000000000000078 +:102860000000000000000000000000000000000068 +:102870000000000000000000000000000000000058 +:102880000000000000000000000000000000000246 +:102890000000000001000001000000000001010232 +:1028A000020202020202020202020202020101000C +:1028B0000000000000000000000000000000000018 +:1028C0000000000000000000000000000000000008 +:1028D00000000000000000000000000000000000F8 +:1028E00000000000000000000000000000000002E6 +:1028F00001000001010101010000000000010100D0 +:1029000000000000000000000000000000000000C7 +:1029100000000000000000000000000000000000B7 +:1029200000000000000000000000000000000000A7 +:102930000000000000000000000000000000000097 +:10294000000101000101010101010101000101007B +:102950000000000000000000000000000000000077 +:102960000000000000000000000000000000000067 +:102970000000000000000000000000000000000057 +:102980000000000000000000000000000000000245 +:102990000000000000000000000000000001010233 +:1029A000020202020202020202020202010101000C +:1029B0000000000000000000000000000000000017 +:1029C0000000000000000000000000000000000007 +:1029D00000000000000000000000000000000000F7 +:1029E00000000000000000000000000000000002E5 +:1029F00001000001010101010000000202010100CB +:102A000000000000000000000000000000000000C6 +:102A100000000000000000000000000000000000B6 +:102A200000000000000000000000000000000000A6 +:102A30000000000000000000000000000000000096 +:102A40000001010101010101010101010001010079 +:102A50000000000000000000000000000000000076 +:102A60000000000000000000000000000000000066 +:102A70000000000000000000000000000000000056 +:102A80000000000000000000000000000000000244 +:102A90000000000000000000000000000001020231 +:102AA000020202020202020202020202010101000B +:102AB0000000000000000000000000000000000016 +:102AC0000000000000000000000000000000000006 +:102AD00000000000000000000000000000000000F6 +:102AE00000000000000000000000000000000002E4 +:102AF00001010101010101010000010102010100C8 +:102B000000000000000000000000000000000000C5 +:102B100000000000000000000000000000000000B5 +:102B200000000000000000000000000000000000A5 +:102B30000000000000000000000000000000000095 +:102B40000101010101010101010101010001010077 +:102B50000000000000000000000000000000000075 +:102B60000000000000000000000000000000000065 +:102B70000000000000000000000000000000000055 +:102B80000000000000000000000000000000000243 +:102B90000000000000000000000000000001020230 +:102BA000020202020202020202020102010101000B +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 +:102BD00000000000000000000000000000000000F5 +:102BE00000000000000000000000000000000002E3 +:102BF00002010101010201010100010101010100C5 +:102C000000000000000000000000000000000000C4 +:102C100000000000000000000000000000000000B4 +:102C200000000000000000000000000000000000A4 +:102C30000000000000000000000000000000000094 +:102C40000102010102020201010101010101010071 +:102C50000000000000000000000000000000000074 +:102C60000000000000000000000000000000000064 +:102C70000000000000000000000000000000000054 +:102C80000000000000000000000000000000000242 +:102C9000000000000000000000000000000102022F +:102CA000020202010202010202020102010101000C +:102CB0000000000000000000000000000000000014 +:102CC0000000000000000000000000000000000004 +:102CD00000000000000000000000000000000000F4 +:102CE00000000000000000000000000000000002E2 +:102CF00002010102010201010100010101010100C3 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D200000000000000000000000000000000000A3 +:102D30000000000000000000000000000000000291 +:102D4000010201010202020202020101010101006D +:102D50000000000000000000000000000000000073 +:102D60000000000000000000000000000000000063 +:102D70000000000000000000000000000000000053 +:102D80000000000000000000000000000000000241 +:102D9000000000000000000000000000000002022F +:102DA000020202010201010101020101010101000F +:102DB0000000000000000000000000000000000013 +:102DC0000000000000000000000000000000000003 +:102DD00000000000000000000000000000000000F3 +:102DE00000000000000000000000000000000002E1 +:102DF00002020102020202010102010101010200BC +:102E000000000000000000000000000000000000C2 +:102E100000000000000000000000000000000000B2 +:102E200000000000000000000000000000000000A2 +:102E30000000000000000000000000000000000290 +:102E4000010202010202020202020101010101006B +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000000000000000000000000052 +:102E80000000000000000000000000000000000240 +:102E9000000000000000000000000000000002022E +:102EA000020102010201010101010101010201000F +:102EB0000000000000000000000000000000000012 +:102EC0000000000000000000000000000000000002 +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000000002E0 +:102EF00002020202020202020101010101010200BA +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000000000A1 +:102F3000000000000000000000000000000000028F +:102F40000202020202020202020201010102020066 +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F70000000000000000000000000000000000051 +:102F8000000000000000000000000000000000023F +:102F9000000200000000000000000000000002022B +:102FA000020101010201010101010101010201000F +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000000000000000001 +:102FD00000000000000000000000000000000000F1 +:102FE00000000000000000000000000000000002DF +:102FF00002020202020202020101020101010200B8 +:1030000000000000000000000000000000000000C0 +:1030100000000000000000000000000000000000B0 +:1030200000000000000000000000000000000000A0 +:10303000000000000000000000000000000000028E +:103040000202020202020202020202020102020063 +:103050000000000000000000000000000000000070 +:103060000000000000000000000000000000000060 +:103070000000000000000000000000000000000050 +:10308000000000000000000000000000000000023E +:10309000020202020000000000020200020002021E +:1030A0000101010101010101010101010102010010 +:1030B0000000000000000000000000000000000010 +:1030C0000000000000000000000000000000000000 +:1030D00000000000000000000000000000000000F0 +:1030E00000000000000000000000000000000002DE +:1030F00002020202020202020201020201020200B4 +:1031000000000000000000000000000000000000BF +:1031100000000000000000000000000000000000AF +:10312000000000000000000000000000000000009F +:10313000000000000000000000000000000000028D +:103140000202020202020202020202020102020062 +:10315000000000000000000000000000000000006F +:10316000000000000000000000000000000000005F +:10317000000000000000000000000000000000004F +:10318000000000000000000000000000000000023D +:103190000202020200020200020202020200020116 +:1031A000010101010101010101010101010201000F +:1031B000000000000000000000000000000000000F +:1031C00000000000000000000000000000000000FF +:1031D00000000000000000000000000000000000EF +:1031E00000000000000000000000000000000002DD +:1031F00002020202020202020201020202020200B2 +:1032000000000000000000000000000000000000BE +:1032100000000000000000000000000000000000AE +:10322000000000000000000000000000000000009E +:10323000000000000000000000000000000000028C +:103240000202020202020202020202020102020061 +:10325000000000000000000000000000000000006E +:10326000000000000000000000000000000000005E +:10327000000000000000000000000000000000004E +:10328000000000000000000000000000000000023C +:10329000020202020202020202020202020202010F +:1032A000010101010101010101010101010200000F +:1032B000000000000000000000000000000000000E +:1032C00000000000000000000000000000000000FE +:1032D00000000000000000000000000000000000EE +:1032E00000000000000000000000000000000002DC +:1032F00002020202020202020202020202020200B0 +:1033000000000000000000000000000000000000BD +:1033100000000000000000000000000000000000AD +:10332000000000000000000000000000000000009D +:10333000000000000000000000000000000000028B +:10334000020202020202020202020202020202005F +:10335000000000000000000000000000000000006D +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000000003D +:103390000202020202020202020202020202000110 +:1033A000010101010101010101010101010200000E +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000000000000000000FD +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000000000000000000002DB +:1033F00002020202020202020202020202020200AF +:1034000000000000000000000000000000000000BC +:1034100000000000000000000000000000000000AC +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000000028A +:10344000020202020202020202020202020202005E +:10345000000000000000000000000000000000006C +:10346000000000000000000000000000000000005C +:10347000000000000000000000000000000000004C +:10348000000000000000000000000000000000003C +:10349000020202020202020202020202020200010F +:1034A000010101010101010101010101010200000D +:1034B000000000000000000000000000000000000C +:1034C00000000000000000000000000000000000FC +:1034D00000000000000000000000000000000000EC +:1034E00000000000000000000000000000000002DA +:1034F00002020202020202020202020202020200AE +:1035000000000000000000000000000000000000BB +:1035100000000000000000000000000000000000AB +:10352000000000000000000000000000000000009B +:103530000000000000000000000000000000000289 +:10354000020202020202020202020202020202005D +:10355000000000000000000000000000000000006B +:10356000000000000000000000000000000000005B +:10357000000000000000000000000000000000004B +:10358000000000000000000000000000000000003B +:10359000020202020202020202020202020200010E +:1035A000010101010101010101010101010200000C +:1035B000000000000000000000000000000000000B +:1035C00000000000000000000000000000000000FB +:1035D00000000000000000000000000000000000EB +:1035E00000000000000000000000000000000002D9 +:1035F00002020202020202020202020202020200AD +:1036000000000000000000000000000000000000BA +:1036100000000000000000000000000000000000AA +:10362000000000000000000000000000000000009A +:103630000000000000000000000000000000000288 +:10364000020202020202020202020202020202005C +:10365000000000000000000000000000000000006A +:10366000000000000000000000000000000000005A +:10367000000000000000000000000000000000004A +:10368000000000000000000000000000000000003A +:10369000020202020202020202020202020200010D +:1036A000010101010101010101010101010100000C +:1036B000000000000000000000000000000000000A +:1036C00000000000000000000000000000000000FA +:1036D00000000000000000000000000000000000EA +:1036E00000000000000000000000000000000002D8 +:1036F00002020202020202020202020202020200AC +:1037000000000000000000000000000000000000B9 +:1037100000000000000000000000000000000000A9 +:103720000000000000000000000000000000000099 +:103730000000000000000000000000000000000287 +:10374000020202020202020202020202020202005B +:103750000000000000000000000000000000000069 +:103760000000000000000000000000000000000059 +:103770000000000000000000000000000000000049 +:103780000000000000000000000000000000000039 +:10379000020202020202020202020202020200010C +:1037A000010101000101010101010101000100000D +:1037B0000000000000000000000000000000000009 +:1037C00000000000000000000000000000000000F9 +:1037D00000000000000000000000000000000000E9 +:1037E00000000000000000000000000000000002D7 +:1037F00002020202020202020202020202020200AB +:1038000000000000000000000000000000000000B8 +:1038100000000000000000000000000000000000A8 +:103820000000000000000000000000000000000098 +:103830000000000000000000000000000000000286 +:10384000020202020202020202020202020202005A +:103850000000000000000000000000000000000068 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000000000000048 +:103880000000000000000000000000000000000038 +:10389000020202020202020202020202020200010B +:1038A000010001000101000101010001000100000F +:1038B0000000000000000000000000000000000008 +:1038C00000000000000000000000000000000000F8 +:1038D00000000000000000000000000000000000E8 +:1038E00000000000000000000000000000000002D6 +:1038F00002020202020202020202010101020200AD +:1039000000000000000000000000000000000000B7 +:1039100000000000000000000000000000000000A7 +:103920000000000000000000000000000000000097 +:103930000000000000000000000000000000000285 +:103940000202020202020202020202020202020059 +:103950000000000000000000000000000000000067 +:103960000000000000000000000000000000000057 +:103970000000000000000000000000000000000047 +:103980000000000000000000000000000000000037 +:10399000020202020202020202020202000200010C +:1039A0000100010001000000000100010001000011 +:1039B0000000000000000000000000000000000007 +:1039C00000000000000000000000000000000000F7 +:1039D00000000000000000000000000000000000E7 +:1039E00000000000000000000000000000000002D5 +:1039F00002020201010202020202020202020200AB +:103A000000000000000000000000000000000000B6 +:103A100000000000000000000000000000000000A6 +:103A20000000000000000000000000000000000096 +:103A30000000000000000000000000000000000284 +:103A40000202020202020202020202020202020058 +:103A50000000000000000000000000000000000066 +:103A60000000000000000000000000000000000056 +:103A70000000000000000000000000000000000046 +:103A80000000000000000000000000000000000036 +:103A9000020202020202020202020002000200010D +:103AA0000000000001000000000100010001000012 +:103AB0000000000000000000000000000000000006 +:103AC00000000000000000000000000000000000F6 +:103AD00000000000000000000000000000000000E6 +:103AE00000000000000000000000000000000002D4 +:103AF00002020202020101010101010101010100B2 +:103B000000000000000000000000000000000000B5 +:103B100000000000000000000000000000000000A5 +:103B20000000000000000000000000000000000095 +:103B30000000000000000000000000000000000283 +:103B4000020101010202020202020202020202005A +:103B50000000000000000000000000000000000065 +:103B60000000000000000000000000000000000055 +:103B70000000000000000000000000000000000045 +:103B80000000000000000000000000000000000035 +:103B90000202020202020202020000000002000110 +:103BA0000000000000000000000000000001000014 +:103BB0000000000000000000000000000000000005 +:103BC00000000000000000000000000000000000F5 +:103BD00000000000000000000000000000000000E5 +:103BE00000000000000000000000000000000001D4 +:103BF00001010101010101010101010101010100B6 +:103C000000000000000000000000000000000000B4 +:103C100000000000000000000000000000000000A4 +:103C20000000000000000000000000000000000094 +:103C30000000000000000000000000000000000282 +:103C40000202020201010101010101010101010061 +:103C50000000000000000000000000000000000064 +:103C60000000000000000000000000000000000054 +:103C70000000000000000000000000000000000044 +:103C80000000000000000000000000000000000034 +:103C90000202020202020202020000000002000010 +:103CA0000000000000000000000000000001000013 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 +:103CD00000000000000000000000000000000000E4 +:103CE00000000000000000000000000000000001D3 +:103CF00001010101010101010101010101010100B5 +:103D000000000000000000000000000000000000B3 +:103D100000000000000000000000000000000000A3 +:103D20000000000000000000000000000000000093 +:103D30000000000000000000000000000000000182 +:103D40000101010101010101010101010101010064 +:103D50000000000000000000000000000000000063 +:103D60000000000000000000000000000000000053 +:103D70000000000000000000000000000000000043 +:103D80000000000000000000000000000000000033 +:103D90000202020202020202000000000002000011 +:103DA0000000000000000000000000000001000012 +:103DB0000000000000000000000000000000000003 +:103DC00000000000000000000000000000000000F3 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000000001D2 +:103DF00001010101010101010101010101010100B4 +:103E000000000000000000000000000000000000B2 +:103E100000000000000000000000000000000000A2 +:103E20000000000000000000000000000000000092 +:103E30000000000000000000000000000000000181 +:103E40000101010101010101010101010101010063 +:103E50000000000000000000000000000000000062 +:103E60000000000000000000000000000000000052 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000000000000000000032 +:103E90000202020202020002000000000000000014 +:103EA0000000000000000000000000000001000011 +:103EB0000000000000000000000000000000000002 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000001D1 +:103EF00001010101010101010101010101010100B3 +:103F000000000000000000000000000000000000B1 +:103F100000000000000000000000000000000000A1 +:103F20000000000000000000000000000000000091 +:103F30000000000000000000000000000000000180 +:103F40000101010101010101010101010101010062 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000000000031 +:103F90000202020002000000000000000000000019 +:103FA0000000000000000000000000000001000010 +:103FB0000000000000000000000000000000000001 +:103FC00000000000000000000000000000000000F1 +:103FD00000000000000000000000000000000000E1 +:103FE00000000000000000000000000000000001D0 +:103FF00001010101010101010101010101010100B2 +:1040000000000000000000000000000000000000B0 +:1040100000000000000000000000000000000000A0 +:104020000000000000000000000000000000000090 +:10403000000000000000000000000000000000017F +:104040000101010101010101010101010101010061 +:104050000000000000000000000000000000000060 +:104060000000000000000000000000000000000050 +:104070000000000000000000000000000000000040 +:104080000000000000000000000000000000000030 +:10409000020000000200000000000000000000001C +:1040A000000000000000000000000000000100000F +:1040B0000000000000000000000000000000000000 +:1040C00000000000000000000000000000000000F0 +:1040D00000000000000000000000000000000000E0 +:1040E00000000000000000000000000000000001CF +:1040F00001010101010101010101010101010100B1 +:1041000000000000000000000000000000000000AF +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000017E +:104140000101010101010101010101010101010060 +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F +:10417000000000000000000000000000000000003F +:10418000000000000000000000000000000000002F +:10419000020000000000000000000000000000001D +:1041A000000000000000000000000000000100000E +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000001CE +:1041F00001010101010101010101010101010100B0 +:1042000000000000000000000000000000000000AE +:10421000000000000000000000000000000000009E +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000027C +:104240000202020202020202020202020202020050 +:10425000000000000000000000000000000000005E +:10426000000000000000000000000000000000004E +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000000002E +:10429000000000000000000000000000000000001E +:1042A000000000000000000000000000000000000E +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D00000000000000000000000000000000000DE +:1042E00000000000000000000000000000000002CC +:1042F00002020202020202020202020202020200A0 +:1043000000000000000000000000000000000000AD +:10431000000000000000000000000000000000009D +:10432000000000000000000000000000000000008D +:10433000000000000000000000000000000000027B +:10434000020202020202020202020202020202004F +:10435000000000000000000000000000000000005D +:10436000000000000000000000000000000000004D +:10437000000000000000000000000000000000003D +:10438000000000000000000000000000000000002D +:10439000000000000000000000000000000000001D +:1043A000000000000000000000000000000000000D +:1043B00000000000000000000000000000000000FD +:1043C00000000000000000000000000000000000ED +:1043D00000000000000000000000000000000000DD +:1043E00000000000000000000000000000000000CD +:1043F00000000000000000000000000000000000BD +:1044000000000000000000000000000000000000AC +:10441000000000000000000000000000000000009C +:10442000000000000000000000000000000000008C +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C +:10445000000000000000000000000000000000005C +:10446000000000000000000000000000000000004C +:10447000000000000000000000000000000000003C +:10448000000000000000000000000000000000002C +:104490000000000000000000000000000000001EFE +:1044A0000000000000000001010101010101010103 +:1044B00001010101010101000000000000000000F5 +:1044C00000000000000000000000000000000000EC +:1044D00000000000000000000000000000000000DC +:1044E00000000000000000000000000000000000CC +:1044F00000000000000000000000000000010001BA +:1045000000000000000101000000000000000000A9 +:10451000000000000000000000000000000000009B +:10452000000000000000000000000000000000008B +:10453000000000000000000000000000000000007B +:10454000000000000000000000000000000001006A +:10455000000100000000000000000000000000005A +:10456000000000000000000000000000000000004B +:10457000000000000000000000000000000000003B +:10458000000000000000000000000000000000002B +:104590000000000000000002010101010101010111 +:1045A00001010101010101010101010101010101FB +:1045B00001010101010101000000000000000000F4 +:1045C00000000000000000000000000000000000EB +:1045D00000000000000000000000000000000000DB +:1045E00000000000000000000000000000000000CB +:1045F00000000000000000000000000001010101B7 +:1046000000000000000101000000000000000000A8 +:10461000000000000000000000000000000000009A +:10462000000000000000000000000000000000008A +:10463000000000000000000000000000000000007A +:104640000000000000000000010000000001010166 +:104650000101000100010100000000000000000055 +:10466000000000000000000000000000000000004A +:10467000000000000000000000000000000000003A +:10468000000000000000000000000000000000002A +:104690000000000000000002010101010101010110 +:1046A00001010101010101020101010101010101F9 +:1046B00001010101010101000000000000000000F3 +:1046C00000000000000000000000000000000000EA +:1046D00000000000000000000000000000000000DA +:1046E00000000000000000000000000000000000CA +:1046F00000000000000000000000000001010101B6 +:1047000002000000000101000000000000000000A5 +:104710000000000000000000000000000000000099 +:104720000000000000000000000000000000000089 +:104730000000000000000000000000000000000079 +:104740000000000000000000010000000001010165 +:104750000101010100010100000000000000000053 +:104760000000000000000000000000000000000049 +:104770000000000000000000000000000000000039 +:104780000000000000000000000000000000000029 +:10479000000000000000000201010101010101010F +:1047A00001010101010101020101010101010101F8 +:1047B00001010101010101000000000000000000F2 +:1047C00000000000000000000000000000000000E9 +:1047D00000000000000000000000000000000000D9 +:1047E00000000000000000000000000000000000C9 +:1047F00000000000000000000000000001010101B5 +:1048000001010200000101000000000000000000A2 +:104810000000000000000000000000000000000098 +:104820000000000000000000000000000000000088 +:104830000000000000000000000000000000000078 +:104840000000000000000000010100000001010163 +:104850000101010100010100000000000000000052 +:104860000000000000000000000000000000000048 +:104870000000000000000000000000000000000038 +:104880000000000000000000000000000000000028 +:10489000000000000000000201010101010101010E +:1048A00001010101010101020101010101010101F7 +:1048B00001010101010101000000000000000000F1 +:1048C00000000000000000000000000000000000E8 +:1048D00000000000000000000000000000000000D8 +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000100000001010101B3 +:10490000010101020201010000000000000000009E +:104910000000000000000000000000000000000097 +:104920000000000000000000000000000000000087 +:104930000000000000000000000000000000000077 +:104940000000000000000000010101000001010161 +:104950000101010100010100000000000000000051 +:104960000000000000000000000000000000000047 +:104970000000000000000000000000000000000037 +:104980000000000000000000000000000000000027 +:104990000000000000000002000101010000000111 +:1049A00001010101010101020101010101020101F5 +:1049B00001010101010101000000000000000000F0 +:1049C00000000000000000000000000000000000E7 +:1049D00000000000000000000000000000000000D7 +:1049E00000000000000000000000000000000000C7 +:1049F00000000000000000000100000001010101B2 +:104A0000010101010101010000000000000000009F +:104A10000000000000000000000000000000000096 +:104A20000000000000000000000000000000000086 +:104A30000000000000000000000000000000000076 +:104A4000000000000000000201010100000101015E +:104A5000010101010101010000000000000000004F +:104A60000000000000000000000000000000000046 +:104A70000000000000000000000000000000000036 +:104A80000000000000000000000000000000000026 +:104A90000000000000000002000001000000000112 +:104AA00000000001010101020202010102020101F4 +:104AB00001010101010101000000000000000000EF +:104AC00000000000000000000000000000000000E6 +:104AD00000000000000000000000000000000000D6 +:104AE00000000000000000000000000000000000C6 +:104AF00000000000000000000101000001010101B0 +:104B0000010101010101010000000000000000009E +:104B10000000000000000000000000000000000095 +:104B20000000000000000000000000000000000085 +:104B30000000000000000000000000000000000075 +:104B4000000000000000000202010101000101015B +:104B5000010101010101010000000000000000004E +:104B60000000000000000000000000000000000045 +:104B70000000000000000000000000000000000035 +:104B80000000000000000000000000000000000025 +:104B90000000000000000002000000000000000013 +:104BA00000000000000101020202010102020201F4 +:104BB00001010101010101000000000000000000EE +:104BC00000000000000000000000000000000000E5 +:104BD00000000000000000000000000000000000D5 +:104BE00000000000000000000000000000000000C5 +:104BF00000000000000000000101000001010101AF +:104C0000010101010101010000000000000000009D +:104C10000000000000000000000000000000000094 +:104C20000000000000000000000000000000000084 +:104C30000000000000000000000000000000000074 +:104C4000000000000000000202010101000101015A +:104C5000010101010101010000000000000000004D +:104C60000000000000000000000000000000000044 +:104C70000000000000000000000000000000000034 +:104C80000000000000000000000000000000000024 +:104C90000000000000000002000000000000000012 +:104CA00000000000000102020202020202020201F0 +:104CB00001010201010101000000000000000000EC +:104CC00000000000000000000000000000000000E4 +:104CD00000000000000000000000000000000000D4 +:104CE00000000000000000000000000000000000C4 +:104CF00000000000000000000101000002020101AC +:104D0000010101010101010000000000000000009C +:104D10000000000000000000000000000000000093 +:104D20000000000000000000000000000000000083 +:104D30000000000000000000000000000000000073 +:104D40000000000000000002020201010002020156 +:104D5000010101010101010000000000000000004C +:104D60000000000000000000000000000000000043 +:104D70000000000000000000000000000000000033 +:104D80000000000000000000000000000000000023 +:104D90000000000000000002000000000000000011 +:104DA00000000000000002020202020202020202EF +:104DB00002020201010101000000000000000000E9 +:104DC00000000000000000000000000000000000E3 +:104DD00000000000000000000000000000000000D3 +:104DE00000000000000000000000000000000000C3 +:104DF00000000000000000020201010002020202A5 +:104E0000010101010101010000000000000000009B +:104E10000000000000000000000000000000000092 +:104E20000000000000000000000000000000000082 +:104E30000000000000000000000000000000000072 +:104E40000000000000000002020202010002020253 +:104E50000202010101010100000000000000000049 +:104E60000000000000000000000000000000000042 +:104E70000000000000000000000000000000000032 +:104E80000000000000000000000000000000000022 +:104E90000000000000000002000000000000000010 +:104EA00000020000000002020202020202020202EC +:104EB00002020202020101000000000000000000E6 +:104EC00000000000000000000000000000000000E2 +:104ED00000000000000000000000000000000000D2 +:104EE00000000000000000000000000000000000C2 +:104EF00000000000000000020201010002020202A4 +:104F0000010101010101010000000000000000009A +:104F10000000000000000000000000000000000091 +:104F20000000000000000000000000000000000081 +:104F30000000000000000000000000000000000071 +:104F40000000000000000002020202020002020251 +:104F50000202020201010100000000000000000046 +:104F60000000000000000000000000000000000041 +:104F70000000000000000000000000000000000031 +:104F80000000000000000000000000000000000021 +:104F9000000000000000000202000000000000000D +:104FA00000020000000002020202020202020202EB +:104FB00002020202020101000000000000000000E5 +:104FC00000000000000000000000000000000000E1 +:104FD00000000000000000000000000000000000D1 +:104FE00000000000000000000000000000000000C1 +:104FF00000000000000000020202010102020202A1 +:105000000202010101020200000000000000000095 +:105010000000000000000000000000000000000090 +:105020000000000000000000000000000000000080 +:105030000000000000000000000000000000000070 +:105040000000000000000002020202020002020250 +:105050000202020201020200000000000000000043 +:105060000000000000000000000000000000000040 +:105070000000000000000000000000000000000030 +:105080000000000000000000000000000000000020 +:10509000000000000000000202020000000000000A +:1050A00000020000000202020202020202010202E9 +:1050B00002020202020101000000000000000000E4 +:1050C00000000000000000000000000000000000E0 +:1050D00000000000000000000000000000000000D0 +:1050E00000000000000000000000000000000000C0 +:1050F00000000000000000020202010102020202A0 +:105100000202020101020200000000000000000093 +:10511000000000000000000000000000000000008F +:10512000000000000000000000000000000000007F +:10513000000000000000000000000000000000006F +:10514000000000000000000202020202010202024E +:105150000202020202020200000000000000000041 +:10516000000000000000000000000000000000003F +:10517000000000000000000000000000000000002F +:10518000000000000000000000000000000000001F +:105190000000000000000002020200000202020003 +:1051A00000020000000202010202020202010202E9 +:1051B00002020202020201000000000000000000E2 +:1051C00000000000000000000000000000000000DF +:1051D00000000000000000000000000000000000CF +:1051E00000000000000000000000000000000000BF +:1051F000000000000000000202020201020202029E +:105200000202020202020200000000000000000090 +:10521000000000000000000000000000000000008E +:10522000000000000000000000000000000000007E +:10523000000000000000000000000000000000006E +:10524000000000000000000202020202020202024C +:105250000202020202020200000000000000000040 +:10526000000000000000000000000000000000003E +:10527000000000000000000000000000000000002E +:10528000000000000000000000000000000000001E +:105290000000000000000002020200020202020000 +:1052A00002020200000202010201020201010202E6 +:1052B00002020202020201000000000000000000E1 +:1052C00000000000000000000000000000000000DE +:1052D00000000000000000000000000000000000CE +:1052E00000000000000000000000000000000000BE +:1052F000000000000000000202020202020202029C +:10530000020202020202020000000000000000008F +:10531000000000000000000000000000000000008D +:10532000000000000000000000000000000000007D +:10533000000000000000000000000000000000006D +:10534000000000000000000202020202020202024B +:10535000020202020202020000000000000000003F +:10536000000000000000000000000000000000003D +:10537000000000000000000000000000000000002D +:10538000000000000000000000000000000000001D +:1053900000000000000000020202020202020202FB +:1053A00002020202020200010201020201010102E4 +:1053B00002020102020200000000000000000000E2 +:1053C00000000000000000000000000000000000DD +:1053D00000000000000000000000000000000000CD +:1053E00000000000000000000000000000000000BD +:1053F000000000000000000202020202020202029B +:10540000020202020202020000000000000000008E +:10541000000000000000000000000000000000008C +:10542000000000000000000000000000000000007C +:10543000000000000000000000000000000000006C +:10544000000000000000000202020202020202024A +:10545000020202020202020000000000000000003E +:10546000000000000000000000000000000000003C +:10547000000000000000000000000000000000002C +:10548000000000000000000000000000000000001C +:1054900000000000000000000202020202020202FC +:1054A00002020202020200010101020201010102E4 +:1054B00002010102020200000000000000000000E2 +:1054C00000000000000000000000000000000000DC +:1054D00000000000000000000000000000000000CC +:1054E00000000000000000000000000000000000BC +:1054F000000000000000000202020202020202029A +:10550000020202020202020000000000000000008D +:10551000000000000000000000000000000000008B +:10552000000000000000000000000000000000007B +:10553000000000000000000000000000000000006B +:105540000000000000000002020202020202020249 +:10555000020202020202020000000000000000003D +:10556000000000000000000000000000000000003B +:10557000000000000000000000000000000000002B +:10558000000000000000000000000000000000001B +:1055900000000000000000000202020202020202FB +:1055A00002020202020200010101020201010102E3 +:1055B00002010102010200000000000000000000E2 +:1055C00000000000000000000000000000000000DB +:1055D00000000000000000000000000000000000CB +:1055E00000000000000000000000000000000000BB +:1055F0000000000000000002020202020202020299 +:10560000020202020202020000000000000000008C +:10561000000000000000000000000000000000008A +:10562000000000000000000000000000000000007A +:10563000000000000000000000000000000000006A +:105640000000000000000002020202020202020248 +:10565000020202020202020000000000000000003C +:10566000000000000000000000000000000000003A +:10567000000000000000000000000000000000002A +:10568000000000000000000000000000000000001A +:1056900000000000000000000202020202020202FA +:1056A00002000202020200010101010101010101E7 +:1056B00001010101010200000000000000000000E3 +:1056C00000000000000000000000000000000000DA +:1056D00000000000000000000000000000000000CA +:1056E00000000000000000000000000000000000BA +:1056F0000000000000000002020202020202020298 +:10570000020202020202020000000000000000008B +:105710000000000000000000000000000000000089 +:105720000000000000000000000000000000000079 +:105730000000000000000000000000000000000069 +:105740000000000000000002020202020202020247 +:10575000020202020202020000000000000000003B +:105760000000000000000000000000000000000039 +:105770000000000000000000000000000000000029 +:105780000000000000000000000000000000000019 +:1057900000000000000000000202020202020202F9 +:1057A00002000202020200010101010101010101E6 +:1057B00001010101010200000000000000000000E2 +:1057C00000000000000000000000000000000000D9 +:1057D00000000000000000000000000000000000C9 +:1057E00000000000000000000000000000000000B9 +:1057F0000000000000000002020202020202020297 +:10580000020202020202020000000000000000008A +:105810000000000000000000000000000000000088 +:105820000000000000000000000000000000000078 +:105830000000000000000000000000000000000068 +:105840000000000000000001020202020202020247 +:10585000020202020202020000000000000000003A +:105860000000000000000000000000000000000038 +:105870000000000000000000000000000000000028 +:105880000000000000000000000000000000000018 +:1058900000000000000000000202020202020202F8 +:1058A00002000202020000010101010101010101E7 +:1058B00001010101010100000000000000000000E2 +:1058C00000000000000000000000000000000000D8 +:1058D00000000000000000000000000000000000C8 +:1058E00000000000000000000000000000000000B8 +:1058F0000000000000000002020202020202020296 +:105900000202020202020200000000000000000089 +:105910000000000000000000000000000000000087 +:105920000000000000000000000000000000000077 +:105930000000000000000000000000000000000067 +:10594000000000000000000101010101010202024B +:105950000202020202020200000000000000000039 +:105960000000000000000000000000000000000037 +:105970000000000000000000000000000000000027 +:105980000000000000000000000000000000000017 +:1059900000000000000000000202020202020202F7 +:1059A00002000202020000010101010101010101E6 +:1059B00001010101010100000000000000000000E1 +:1059C00000000000000000000000000000000000D7 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F0000000000000000002020202020101010199 +:105A0000010101010101010000000000000000008F +:105A10000000000000000000000000000000000086 +:105A20000000000000000000000000000000000076 +:105A30000000000000000000000000000000000066 +:105A4000000000000000000202020202020000004A +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000000000000016 +:105A900000000000000000000202020202020002F8 +:105AA00002000002020000000101010101010101E8 +:105AB00001010101010100000000000000000000E0 +:105AC00000000000000000000000000000000000D6 +:105AD00000000000000000000000000000000000C6 +:105AE00000000000000000000000000000000000B6 +:105AF000000000000000000101010101010101019D +:105B0000010101010101010000000000000000008E +:105B10000000000000000000000000000000000085 +:105B20000000000000000000000000000000000075 +:105B30000000000000000000000000000000000065 +:105B40000000000000000002000000000001010150 +:105B5000010101010101010000000000000000003E +:105B60000000000000000000000000000000000035 +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B900000000000000000000202020202000002F9 +:105BA00000000000000000000100010101000101EF +:105BB00001010101010100000000000000000000DF +:105BC00000000000000000000000000000000000D5 +:105BD00000000000000000000000000000000000C5 +:105BE00000000000000000000000000000000000B5 +:105BF000000000000000000101010101010101019C +:105C0000010101010101010000000000000000008D +:105C10000000000000000000000000000000000084 +:105C20000000000000000000000000000000000074 +:105C30000000000000000000000000000000000064 +:105C4000000000000000000101010101010101014B +:105C5000010101010101010000000000000000003D +:105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 +:105C80000000000000000000000000000000000014 +:105C900000000000000000000202020200000002FA +:105CA00000000000000000000100010100000101EF +:105CB00001010101010100000000000000000000DE +:105CC00000000000000000000000000000000000D4 +:105CD00000000000000000000000000000000000C4 +:105CE00000000000000000000000000000000000B4 +:105CF000000000000000000101010101010101019B +:105D0000010101010101010000000000000000008C +:105D10000000000000000000000000000000000083 +:105D20000000000000000000000000000000000073 +:105D30000000000000000000000000000000000063 +:105D4000000000000000000101010101010101014A +:105D5000010101010101010000000000000000003C +:105D60000000000000000000000000000000000033 +:105D70000000000000000000000000000000000023 +:105D80000000000000000000000000000000000013 +:105D900000000000000000000000020200000000FF +:105DA00000000000000000000000010100000101EF +:105DB00001010101010100000000000000000000DD +:105DC00000000000000000000000000000000000D3 +:105DD00000000000000000000000000000000000C3 +:105DE00000000000000000000000000000000000B3 +:105DF000000000000000000101010101010101019A +:105E0000010101010101010000000000000000008B +:105E10000000000000000000000000000000000082 +:105E20000000000000000000000000000000000072 +:105E30000000000000000000000000000000000062 +:105E40000000000000000001010101010101010149 +:105E5000010101010101010000000000000000003B +:105E60000000000000000000000000000000000032 +:105E70000000000000000000000000000000000022 +:105E80000000000000000000000000000000000012 +:105E90000000000000000000000002000000000000 +:105EA00000000000000000000000010100000001EF +:105EB00001000001010100000000000000000000DE +:105EC00000000000000000000000000000000000D2 +:105ED00000000000000000000000000000000000C2 +:105EE00000000000000000000000000000000000B2 +:105EF0000000000000000001010101010101010199 +:105F0000010101010101010000000000000000008A +:105F10000000000000000000000000000000000081 +:105F20000000000000000000000000000000000071 +:105F30000000000000000000000000000000000061 +:105F40000000000000000001010101010101010148 +:105F5000010101010101010000000000000000003A +:105F60000000000000000000000000000000000031 +:105F70000000000000000000000000000000000021 +:105F80000000000000000000000000000000000011 +:105F900000000000000000000000020000000000FF +:105FA00000000000000000000000010100000001EE +:105FB00001000001000100000000000000000000DE +:105FC00000000000000000000000000000000000D1 +:105FD00000000000000000000000000000000000C1 +:105FE00000000000000000000000000000000000B1 +:105FF0000000000000000001010101010101010198 +:106000000101010101010100000000000000000089 +:106010000000000000000000000000000000000080 +:106020000000000000000000000000000000000070 +:106030000000000000000000000000000000000060 +:10604000000000000000000202020202020202023E +:106050000202020202020200000000000000000032 +:106060000000000000000000000000000000000030 +:106070000000000000000000000000000000000020 +:106080000000000000000000000000000000000010 +:106090000000000000000000000000000000000000 +:1060A00000000000000000000000000000000001EF +:1060B00001000001000100000000000000000000DD +:1060C00000000000000000000000000000000000D0 +:1060D00000000000000000000000000000000000C0 +:1060E00000000000000000000000000000000000B0 +:1060F000000000000000000202020202020202028E +:106100000202020202020200000000000000000081 +:10611000000000000000000000000000000000007F +:10612000000000000000000000000000000000006F +:10613000000000000000000000000000000000005F +:10614000000000000000000202020202020202023D +:106150000202020202020200000000000000000031 +:10616000000000000000000000000000000000002F +:10617000000000000000000000000000000000001F +:10618000000000000000000000000000000000000F +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF +:1061C00000000000000000000000000000000000CF +:1061D00000000000000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:10620000000000000000000000000000000000008E +:10621000000000000000000000000000000000007E +:10622000000000000000000000000000000000006E +:10623000000000000000000000000000000000005E +:10624000000000000000000000000000000000004E +:10625000000000000000000000000000000000003E +:10626000000000000000000000000000000000002E +:10627000000000000000000000000000000000001E +:10628000000000000000000000000000000000000E +:1062900000000000000000000000000000000000FE +:1062A000000000000000001E0000000000000001CF +:1062B00001010101010101010101010101010100CF +:1062C00000000000000000000000000000000000CE +:1062D00000000000000000000000000000000000BE +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:106300000001010001000000000000000000010089 +:10631000000000000000000000000000000000007D +:10632000000000000000000000000000000000006D +:10633000000000000000000000000000000000005D +:10634000000000000000000000000000000000004D +:10635000000000000000000000000000000000003D +:10636000000000000000000000000000000000002D +:10637000000000000000000000000000000000001D +:10638000000000000000000000000000000000000D +:1063900000000000000000000000000000000002FB +:1063A00001010101010101010101010101010101DD +:1063B00001010101010101010101010101010100CE +:1063C00000000000000000000000000000000000CD +:1063D00000000000000000000000000000000000BD +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000000009D +:106400000001010101010000000002000101010082 +:10641000000000000000000000000000000000007C +:10642000000000000000000000000000000000006C +:10643000000000000000000000000000000000005C +:10644000000000000000000000000000000000004C +:10645000000000000000000000000000000000003C +:10646000000000000000000000000000000000002C +:10647000000000000000000000000000000000001C +:10648000000000000000000000000000000000000C +:1064900000000000000000000000000000000002FA +:1064A00001010101010101010101010101010102DB +:1064B00001010101010101010101010101010100CD +:1064C00000000000000000000000000000000000CC +:1064D00000000000000000000000000000000000BC +:1064E00000000000000000000000000000000000AC +:1064F000000000000000000000000000000000009C +:106500000001010101010000000002000101010081 +:10651000000000000000000000000000000000007B +:10652000000000000000000000000000000000006B +:10653000000000000000000000000000000000005B +:10654000000000000000000000000000000000004B +:106550000101000100000000000000000000000038 +:10656000000000000000000000000000000000002B +:10657000000000000000000000000000000000001B +:10658000000000000000000000000000000000000B +:1065900000000000000000000000000000000002F9 +:1065A00001010101010101010101010101010102DA +:1065B00001010101010101010101010101010100CC +:1065C00000000000000000000000000000000000CB +:1065D00000000000000000000000000000000000BB +:1065E00000000000000000000000000000000000AB +:1065F000000000000000000000000000000000009B +:106600000001010101010000000001000101010081 +:10661000000000000000000000000000000000007A +:10662000000000000000000000000000000000006A +:10663000000000000000000000000000000000005A +:10664000000000000000000000000000000000004A +:106650000101000100000000000000000000000037 +:10666000000000000000000000000000000000002A +:10667000000000000000000000000000000000001A +:10668000000000000000000000000000000000000A +:1066900000000000000000000000000000000002F8 +:1066A00000010101010101010101010101010102DA +:1066B00002020101010101010101010101010100C9 +:1066C00000000000000000000000000000000000CA +:1066D00000000000000000000000000000000000BA +:1066E00000000000000000000000000000000000AA +:1066F0000000000000000000000000000000000199 +:106700000001010101010000000001000101010080 +:106710000000000000000000000000000000000079 +:106720000000000000000000000000000000000069 +:106730000000000000000000000000000000000059 +:106740000000000000000000000000000000000049 +:106750000101010101000000000000000000010033 +:106760000000000000000000000000000000000029 +:106770000000000000000000000000000000000019 +:106780000000000000000000000000000000000009 +:1067900000000000000000000000000000000002F7 +:1067A00000010101010101010101010101010102D9 +:1067B00002020201010101010101010101010100C7 +:1067C00000000000000000000000000000000000C9 +:1067D00000000000000000000000000000000000B9 +:1067E00000000000000000000000000000000000A9 +:1067F0000000000000000000000000000000000198 +:10680000000101010101000000000100010101007F +:106810000000000000000000000000000000000078 +:106820000000000000000000000000000000000068 +:106830000000000000000000000000000000000058 +:106840000000000000000000000000000000000048 +:10685000010101010101000000000000010101002F +:106860000000000000000000000000000000000028 +:106870000000000000000000000000000000000018 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000000002F6 +:1068A00000000001000000010000000001010102E1 +:1068B00002020201010102010101010101010100C5 +:1068C00000000000000000000000000000000000C8 +:1068D00000000000000000000000000000000000B8 +:1068E00000000000000000000000000000000000A8 +:1068F0000000000000000000000000000000000296 +:10690000000101010101000000000100010101007E +:106910000000000000000000000000000000000077 +:106920000000000000000000000000000000000067 +:106930000000000000000000000000000000000057 +:106940000000000000000000000000000000000047 +:10695000010101010101000000000000010101002E +:106960000000000000000000000000000000000027 +:106970000000000000000000000000000000000017 +:106980000000000000000000000000000000000007 +:1069900000000000000000000000000000000002F5 +:1069A00000000000000000000000000001010102E2 +:1069B00002020202020102020201010101010100C0 +:1069C00000000000000000000000000000000000C7 +:1069D00000000000000000000000000000000000B7 +:1069E00000000000000000000000000000000000A7 +:1069F0000000000000000000000000000000000295 +:106A0000010201010101000000000100010101007B +:106A10000000000000000000000000000000000076 +:106A20000000000000000000000000000000000066 +:106A30000000000000000000000000000000000056 +:106A40000000000000000000000000000000000046 +:106A5000010101010101000000010000010101002C +:106A60000000000000000000000000000000000026 +:106A70000000000000000000000000000000000016 +:106A80000000000000000000000000000000000006 +:106A900000000000000000000000000000000002F4 +:106AA00000000000000000000000000001000102E2 +:106AB00002020202020202020201020101010100BD +:106AC00000000000000000000000000000000000C6 +:106AD00000000000000000000000000000000000B6 +:106AE00000000000000000000000000000000000A6 +:106AF0000000000000000000000000000000000294 +:106B00000102020102010000000001000101010078 +:106B10000000000000000000000000000000000075 +:106B20000000000000000000000000000000000065 +:106B30000000000000000000000000000000000055 +:106B40000000000000000000000000000000000144 +:106B50000201010101010000000100010101010029 +:106B60000000000000000000000000000000000025 +:106B70000000000000000000000000000000000015 +:106B80000000000000000000000000000000000005 +:106B900000000000000000000000000000000002F3 +:106BA00000000000000000000000000000000102E2 +:106BB00002020202020202020202020201010100BA +:106BC00000000000000000000000000000000000C5 +:106BD00000000000000000000000000000000000B5 +:106BE00000000000000000000000000000000000A5 +:106BF0000000000000000000000000000000000293 +:106C00000202020202020000000001000101010074 +:106C10000000000000000000000000000000000074 +:106C20000000000000000000000000000000000064 +:106C30000000000000000000000000000000000054 +:106C40000000000000000000000000000000000242 +:106C50000202010101010100000100010101010026 +:106C60000000000000000000000000000000000024 +:106C70000000000000000000000000000000000014 +:106C80000000000000000000000000000000000004 +:106C900000000000000000000000000000000002F2 +:106CA00002000200020202000202020000000002D2 +:106CB00002010102020202020202020201010100BB +:106CC00000000000000000000000000000000000C4 +:106CD00000000000000000000000000000000000B4 +:106CE00000000000000000000000000000000000A4 +:106CF0000000000000000000000000000000000292 +:106D0000020202020202000002000102010101006F +:106D10000000000000000000000000000000000073 +:106D20000000000000000000000000000000000063 +:106D30000000000000000000000000000000000053 +:106D40000000000000000000000000000000000241 +:106D50000202010201010101010100010101010022 +:106D60000000000000000000000000000000000023 +:106D70000000000000000000000000000000000013 +:106D80000000000000000000000000000000000003 +:106D900000000000000000000000000000000002F1 +:106DA00002000202020202020202020000000002CD +:106DB00002010102020202020202020201010100BA +:106DC00000000000000000000000000000000000C3 +:106DD00000000000000000000000000000000000B3 +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000000000000000000000291 +:106E0000020202020202000101020101020202006A +:106E10000000000000000000000000000000000072 +:106E20000000000000000000000000000000000062 +:106E30000000000000000000000000000000000052 +:106E40000000000000000000000000000000000240 +:106E5000020202020201010101010101010101001E +:106E60000000000000000000000000000000000022 +:106E70000000000000000000000000000000000012 +:106E80000000000000000000000000000000000002 +:106E900000000000000000000000000000000002F0 +:106EA00002020202020202020202020200000202C6 +:106EB00001010102020201020202020202020100B9 +:106EC00000000000000000000000000000000000C2 +:106ED00000000000000000000000000000000000B2 +:106EE00000000000000000000000000000000000A2 +:106EF0000000000000000000000000000000000290 +:106F00000202020202020001010102010202020069 +:106F10000000000000000000000000000000000071 +:106F20000000000000000000000000000000000061 +:106F30000000000000000000000000000000000051 +:106F4000000000000000000000000000000000023F +:106F5000020202020202010101010101010101001C +:106F60000000000000000000000000000000000021 +:106F70000000000000000000000000000000000011 +:106F80000000000000000000000000000000000001 +:106F900000000000000000000000000000000002EF +:106FA00002020202020202020202020200000201C6 +:106FB00001010101020201010202020202020100BA +:106FC00000000000000000000000000000000000C1 +:106FD00000000000000000000000000000000000B1 +:106FE00000000000000000000000000000000000A1 +:106FF000000000000000000000000000000000028F +:107000000202020202020101010102010202020067 +:107010000000000000000000000000000000000070 +:107020000000000000000000000000000000000060 +:107030000000000000000000000000000000000050 +:10704000000000000000000000000000000000023E +:10705000020202020202010101010101010101001B +:107060000000000000000000000000000000000020 +:107070000000000000000000000000000000000010 +:107080000000000000000000000000000000000000 +:1070900000000000000000000000000000000002EE +:1070A00002020202020202020202020200020201C3 +:1070B00001010101010201010102010202020100BC +:1070C00000000000000000000000000000000000C0 +:1070D00000000000000000000000000000000000B0 +:1070E00000000000000000000000000000000000A0 +:1070F000000000000000000000000000000000028E +:107100000202020202020102010102010202020065 +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000023D +:107150000202020202020201010201010202020015 +:10716000000000000000000000000000000000001F +:10717000000000000000000000000000000000000F +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000002ED +:1071A00002020202020202020202020202020201C0 +:1071B00001010101010201010102010102020000BD +:1071C00000000000000000000000000000000000BF +:1071D00000000000000000000000000000000000AF +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000000000000000028D +:107200000202020202020202020102010202020062 +:10721000000000000000000000000000000000006E +:10722000000000000000000000000000000000005E +:10723000000000000000000000000000000000004E +:10724000000000000000000000000000000000023C +:107250000202020202020202020201020202020011 +:10726000000000000000000000000000000000001E +:10727000000000000000000000000000000000000E +:1072800000000000000000000000000000000000FE +:1072900000000000000000000000000000000000EE +:1072A00002020202020202020202020202020201BF +:1072B00001010101010101010101010102020000BE +:1072C00000000000000000000000000000000000BE +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000028C +:10730000020202020202020202020202020202005F +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:10733000000000000000000000000000000000004D +:10734000000000000000000000000000000000023B +:10735000020202020202020202020202020202000F +:10736000000000000000000000000000000000001D +:10737000000000000000000000000000000000000D +:1073800000000000000000000000000000000000FD +:1073900000000000000000000000000000000000ED +:1073A00002020202020202020202020202020201BE +:1073B00001010101010101010101010102020000BD +:1073C00000000000000000000000000000000000BD +:1073D00000000000000000000000000000000000AD +:1073E000000000000000000000000000000000009D +:1073F000000000000000000000000000000000028B +:10740000020202020202020202020202020202005E +:10741000000000000000000000000000000000006C +:10742000000000000000000000000000000000005C +:10743000000000000000000000000000000000004C +:10744000000000000000000000000000000000023A +:10745000020202020202020202020202020202000E +:10746000000000000000000000000000000000001C +:10747000000000000000000000000000000000000C +:1074800000000000000000000000000000000000FC +:1074900000000000000000000000000000000000EC +:1074A00002020202020202020200000202020201C1 +:1074B00001000001010101010101010101010000C0 +:1074C00000000000000000000000000000000000BC +:1074D00000000000000000000000000000000000AC +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000028A +:10750000020202020202020202020202020202005D +:10751000000000000000000000000000000000006B +:10752000000000000000000000000000000000005B +:10753000000000000000000000000000000000004B +:107540000000000000000000000000000000000239 +:10755000020202020202020202020202020202000D +:10756000000000000000000000000000000000001B +:10757000000000000000000000000000000000000B +:1075800000000000000000000000000000000000FB +:1075900000000000000000000000000000000000EB +:1075A00002020202020202020000000002020201C4 +:1075B00001000001010101010101010101010000BF +:1075C00000000000000000000000000000000000BB +:1075D00000000000000000000000000000000000AB +:1075E000000000000000000000000000000000009B +:1075F0000000000000000000000000000000000289 +:10760000020202020202020202020202020202005C +:10761000000000000000000000000000000000006A +:10762000000000000000000000000000000000005A +:10763000000000000000000000000000000000004A +:107640000000000000000000000000000000000238 +:10765000020202020202020202020202020202000C +:10766000000000000000000000000000000000001A +:10767000000000000000000000000000000000000A +:1076800000000000000000000000000000000000FA +:1076900000000000000000000000000000000000EA +:1076A00002020202020000020000000002020201C7 +:1076B00000000001010101010101010101010000BF +:1076C00000000000000000000000000000000000BA +:1076D00000000000000000000000000000000000AA +:1076E000000000000000000000000000000000009A +:1076F0000000000000000000000000000000000288 +:10770000020202020202020002020202020202005D +:107710000000000000000000000000000000000069 +:107720000000000000000000000000000000000059 +:107730000000000000000000000000000000000049 +:107740000000000000000000000000000000000237 +:10775000020202020202020202020202020202000B +:107760000000000000000000000000000000000019 +:107770000000000000000000000000000000000009 +:1077800000000000000000000000000000000000F9 +:1077900000000000000000000000000000000000E9 +:1077A00002020202000000000000000002020001CC +:1077B00000000000010101010101010101010000BF +:1077C00000000000000000000000000000000000B9 +:1077D00000000000000000000000000000000000A9 +:1077E0000000000000000000000000000000000099 +:1077F0000000000000000000000000000000000287 +:107800000002020200000000000000000000000072 +:107810000000000000000000000000000000000068 +:107820000000000000000000000000000000000058 +:107830000000000000000000000000000000000048 +:107840000000000000000000000000000000000236 +:10785000020202020202020202020202020202000A +:107860000000000000000000000000000000000018 +:107870000000000000000000000000000000000008 +:1078800000000000000000000000000000000000F8 +:1078900000000000000000000000000000000000E8 +:1078A00002020002000000000000000002000000D0 +:1078B00000000000010100010101010101010000BF +:1078C00000000000000000000000000000000000B8 +:1078D00000000000000000000000000000000000A8 +:1078E0000000000000000000000000000000000098 +:1078F0000000000000000000000000000000000187 +:107900000101010101010101010101010101010068 +:107910000000000000000000000000000000000067 +:107920000000000000000000000000000000000057 +:107930000000000000000000000000000000000047 +:107940000000000000000000000000000000000235 +:107950000202020202020202020202020202020009 +:107960000000000000000000000000000000000017 +:107970000000000000000000000000000000000007 +:1079800000000000000000000000000000000000F7 +:1079900000000000000000000000000000000000E7 +:1079A00002020000000000000000000002000000D1 +:1079B00000000000000100000101010101010000C0 +:1079C00000000000000000000000000000000000B7 +:1079D00000000000000000000000000000000000A7 +:1079E0000000000000000000000000000000000097 +:1079F0000000000000000000000000000000000186 +:107A00000101010101010101010101010101010067 +:107A10000000000000000000000000000000000066 +:107A20000000000000000000000000000000000056 +:107A30000000000000000000000000000000000046 +:107A40000000000000000000000000000000000234 +:107A50000202020000000000000000000000000020 +:107A60000000000000000000000000000000000016 +:107A70000000000000000000000000000000000006 +:107A800000000000000000000000000000000000F6 +:107A900000000000000000000000000000000000E6 +:107AA00000020000000000000000000000000000D4 +:107AB00000000000000100000101000101010000C0 +:107AC00000000000000000000000000000000000B6 +:107AD00000000000000000000000000000000000A6 +:107AE0000000000000000000000000000000000096 +:107AF0000000000000000000000000000000000185 +:107B00000101010101010101010101010101010066 +:107B10000000000000000000000000000000000065 +:107B20000000000000000000000000000000000055 +:107B30000000000000000000000000000000000045 +:107B40000000000000000000000000000000000035 +:107B50000000000000000000000000000000000025 +:107B60000000000000000000000000000000000015 +:107B70000000000000000000000000000000000005 +:107B800000000000000000000000000000000000F5 +:107B900000000000000000000000000000000000E5 +:107BA00000020000000000000000000000000000D3 +:107BB00000000000000100000001000001010000C1 +:107BC00000000000000000000000000000000000B5 +:107BD00000000000000000000000000000000000A5 +:107BE0000000000000000000000000000000000095 +:107BF0000000000000000000000000000000000184 +:107C00000101010101010101010101010101010065 +:107C10000000000000000000000000000000000064 +:107C20000000000000000000000000000000000054 +:107C30000000000000000000000000000000000044 +:107C40000000000000000000000000000000000133 +:107C50000101010101010101010101010101010015 +:107C60000000000000000000000000000000000014 +:107C70000000000000000000000000000000000004 +:107C800000000000000000000000000000000000F4 +:107C900000000000000000000000000000000000E4 +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000000C4 +:107CC00000000000000000000000000000000000B4 +:107CD00000000000000000000000000000000000A4 +:107CE0000000000000000000000000000000000094 +:107CF0000000000000000000000000000000000183 +:107D00000101010101010101010101010101010064 +:107D10000000000000000000000000000000000063 +:107D20000000000000000000000000000000000053 +:107D30000000000000000000000000000000000043 +:107D40000000000000000000000000000000000132 +:107D50000101010101010101010101010101010014 +:107D60000000000000000000000000000000000013 +:107D70000000000000000000000000000000000003 +:107D800000000000000000000000000000000000F3 +:107D900000000000000000000000000000000000E3 +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000000000000000C3 +:107DC00000000000000000000000000000000000B3 +:107DD00000000000000000000000000000000000A3 +:107DE0000000000000000000000000000000000093 +:107DF0000000000000000000000000000000000182 +:107E00000101010101010101010101010101010063 +:107E10000000000000000000000000000000000062 +:107E20000000000000000000000000000000000052 +:107E30000000000000000000000000000000000042 +:107E40000000000000000000000000000000000131 +:107E50000101010101010101010101010101010013 +:107E60000000000000000000000000000000000012 +:107E70000000000000000000000000000000000002 +:107E800000000000000000000000000000000000F2 +:107E900000000000000000000000000000000000E2 +:107EA00000000000000000000000000000000000D2 +:107EB00000000000000000000000000000000000C2 +:107EC00000000000000000000000000000000000B2 +:107ED00000000000000000000000000000000000A2 +:107EE0000000000000000000000000000000000092 +:107EF0000000000000000000000000000000000280 +:107F00000202020202020202020202020202020053 +:107F10000000000000000000000000000000000061 +:107F20000000000000000000000000000000000051 +:107F30000000000000000000000000000000000041 +:107F4000000000000000000000000000000000022F +:107F50000202020202020202020202020202020003 +:107F60000000000000000000000000000000000011 +:107F70000000000000000000000000000000000001 +:107F800000000000000000000000000000000000F1 +:107F900000000000000000000000000000000000E1 +:107FA00000000000000000000000000000000000D1 +:107FB00000000000000000000000000000000000C1 +:107FC00000000000000000000000000000000000B1 +:107FD00000000000000000000000000000000000A1 +:107FE0000000000000000000000000000000000091 +:107FF0000000000000000000000000000000000081 +:108000000000000000000000000000000000000070 +:108010000000000000000000000000000000000060 +:108020000000000000000000000000000000000050 +:108030000000000000000000000000000000000040 +:108040000000000000000000000000000000000030 +:108050000000000000000000000000000000000020 +:108060000000000000000000000000000000000010 +:108070000000000000000000000000000000000000 +:1080800000000000000000000000000000000000F0 +:1080900000000000000000000000000000000000E0 +:1080A0000000000000000000000000000000001EB2 +:1080B00000000000000000010101010101010101B7 +:1080C00001010101010101000000000000000000A9 +:1080D00000000000000000000000000000000000A0 +:1080E0000000000000000000000000000000000090 +:1080F0000000000000000000000000000000000080 +:10810000000000000000000001010000000000006D +:10811000000000000000010000000000000000005E +:10812000000000000000000000000000000000004F +:10813000000000000000000000000000000000003F +:10814000000000000000000000000000000000002F +:10815000000000000000000000000000000000001F +:10816000000000000000000000000000000000000F +:1081700000000000000000000000000000000000FF +:1081800000000000000000000000000000000000EF +:1081900000000000000000000000000000000000DF +:1081A00000000000000000000101010101010101C7 +:1081B00001010101010101010101010101010101AF +:1081C00001010101010101000000000000000000A8 +:1081D000000000000000000000000000000000009F +:1081E000000000000000000000000000000000008F +:1081F000000000000000000000000000000000007F +:10820000000000000000000001010000000000006C +:10821000000000000000010000000000000000005D +:10822000000000000000000000000000000000004E +:10823000000000000000000000000000000000003E +:10824000000000000000000000000000000000002E +:10825000000000000000000000000000000000001E +:10826000000000000000000000000000000000000E +:1082700000000000000000000000000000000000FE +:1082800000000000000000000000000000000000EE +:1082900000000000000000000000000000000000DE +:1082A00000000000000000000101010101010101C6 +:1082B00001010101010101020101010101010101AD +:1082C00001010101010101000000000000000000A7 +:1082D000000000000000000000000000000000009E +:1082E000000000000000000000000000000000008E +:1082F000000000000000000000000000000000007E +:10830000000000000000000001010001000000006A +:10831000000000000000010000000000000000005C +:10832000000000000000000000000000000000004D +:10833000000000000000000000000000000000003D +:10834000000000000000000000000000000000002D +:10835000000000000000000000000000000000001D +:10836000000000000000000000000000000000000D +:1083700000000000000000000000000000000000FD +:1083800000000000000000000000000000000000ED +:1083900000000000000000000000000000000000DD +:1083A00000000000000000000101010101010101C5 +:1083B00001010101010101020101010101010101AC +:1083C00001010101010101000000000000000000A6 +:1083D000000000000000000000000000000000009D +:1083E000000000000000000000000000000000008D +:1083F000000000000000000000000000000000007D +:108400000000000000000000010101010100000067 +:10841000000000000000010000000000000000005B +:10842000000000000000000000000000000000004C +:10843000000000000000000000000000000000003C +:10844000000000000000000000000000000000002C +:10845000000000000000000000000000000000001C +:108460000000010100010000000000000000000009 +:1084700000000000000000000000000000000000FC +:1084800000000000000000000000000000000000EC +:1084900000000000000000000000000000000000DC +:1084A00000000000000000020101010101010101C2 +:1084B00001010101010101020101010101010101AB +:1084C00001010101010101000000000000000000A5 +:1084D000000000000000000000000000000000009C +:1084E000000000000000000000000000000000008C +:1084F000000000000000000000000000000000007C +:108500000000000000000000010101010100000066 +:10851000000000000000010000000000000000005A +:10852000000000000000000000000000000000004B +:10853000000000000000000000000000000000003B +:10854000000000000000000000000000000000002B +:108550000000000000000000010100000000000019 +:108560000000010100010100000000000000000007 +:1085700000000000000000000000000000000000FB +:1085800000000000000000000000000000000000EB +:1085900000000000000000000000000000000000DB +:1085A00000000000000000020101010101010101C1 +:1085B00001010101010101020101010101010101AA +:1085C00001010101010101000000000000000000A4 +:1085D000000000000000000000000000000000009B +:1085E000000000000000000000000000000000008B +:1085F000000000000000000000000000000000007B +:108600000000000000000000010101010100000065 +:108610000000000000000100000000000000000059 +:10862000000000000000000000000000000000004A +:10863000000000000000000000000000000000003A +:10864000000000000000000000000000000000002A +:108650000000000000000000010100000100000017 +:108660000100010101010100000000000000000004 +:1086700000000000000000000000000000000000FA +:1086800000000000000000000000000000000000EA +:1086900000000000000000000000000000000000DA +:1086A00000000000000000020101010101010101C0 +:1086B00001010101010101020201010101010101A8 +:1086C00001010101010101000000000000000000A3 +:1086D000000000000000000000000000000000009A +:1086E000000000000000000000000000000000008A +:1086F000000000000000000000000000000000007A +:108700000000000000000002020101010100010060 +:108710000000000000000100000000000000000058 +:108720000000000000000000000000000000000049 +:108730000000000000000000000000000000000039 +:108740000000000000000000000000000000000029 +:108750000000000000000000010100010100010014 +:108760000100010101010100000000000000000003 +:1087700000000000000000000000000000000000F9 +:1087800000000000000000000000000000000000E9 +:1087900000000000000000000000000000000000D9 +:1087A00000000000000000020001010101010101C0 +:1087B00001010101010101020201010101010101A7 +:1087C00001010101010101000000000000000000A2 +:1087D0000000000000000000000000000000000099 +:1087E0000000000000000000000000000000000089 +:1087F0000000000000000000000000000000000079 +:10880000000000000000000202020101010001005E +:108810000100000001000100000000000000000055 +:108820000000000000000000000000000000000048 +:108830000000000000000000000000000000000038 +:108840000000000000000000000000000000000028 +:108850000000000000000000010101010100010012 +:108860000100010101010100000000000000000002 +:1088700000000000000000000000000000000000F8 +:1088800000000000000000000000000000000000E8 +:1088900000000000000000000000000000000000D8 +:1088A00000000000000000020000010101010101C0 +:1088B00001000101010101020202020101020102A3 +:1088C00002010101010101000000000000000000A0 +:1088D0000000000000000000000000000000000098 +:1088E0000000000000000000000000000000000088 +:1088F0000000000000000000000000000000000078 +:10890000000000000000000202020101010001005D +:108910000100000001000100000000000000000054 +:108920000000000000000000000000000000000047 +:108930000000000000000000000000000000000037 +:108940000000000000000000000000000000000027 +:108950000000000000000000010101010100010011 +:108960000100010101010100000000000000000001 +:1089700000000000000000000000000000000000F7 +:1089800000000000000000000000000000000000E7 +:1089900000000000000000000000000000000000D7 +:1089A00000000000000000020000010001010101C0 +:1089B00001000101010101020202020201020102A1 +:1089C000020101010101010000000000000000009F +:1089D0000000000000000000000000000000000097 +:1089E0000000000000000000000000000000000087 +:1089F0000000000000000000000000000000000077 +:108A0000000000000000000202020202010001005A +:108A10000100000001010100000000000000000052 +:108A20000000000000000000000000000000000046 +:108A30000000000000000000000000000000000036 +:108A40000000000000000000000000000000000026 +:108A5000000000000000000101010101010101000E +:108A600001010101010101000000000000000000FF +:108A700000000000000000000000000000000000F6 +:108A800000000000000000000000000000000000E6 +:108A900000000000000000000000000000000000D6 +:108AA00000000000000000020000000000000000C4 +:108AB000000001010101010202020202020202029F +:108AC000020101010101010000000000000000009E +:108AD0000000000000000000000000000000000096 +:108AE0000000000000000000000000000000000086 +:108AF0000000000000000000000000000000000076 +:108B00000000000000000002020202020200010058 +:108B10000100000001010100000000000000000051 +:108B20000000000000000000000000000000000045 +:108B30000000000000000000000000000000000035 +:108B40000000000000000000000000000000000025 +:108B5000000000000000000202010101010101010A +:108B600001010101010101000000000000000000FE +:108B700000000000000000000000000000000000F5 +:108B800000000000000000000000000000000000E5 +:108B900000000000000000000000000000000000D5 +:108BA00000000000000000020002000000000000C1 +:108BB000000201010101010202020202020202029C +:108BC000020201010101010000000000000000009C +:108BD0000000000000000000000000000000000095 +:108BE0000000000000000000000000000000000085 +:108BF0000000000000000000000000000000000075 +:108C00000000000000000002020202020201010155 +:108C1000010000000101020000000000000000004F +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 +:108C40000000000000000000000000000000000024 +:108C50000000000000000002020201010101010108 +:108C600001010101010101000000000000000000FD +:108C700000000000000000000000000000000000F4 +:108C800000000000000000000000000000000000E4 +:108C900000000000000000000000000000000000D4 +:108CA00000000000000000020202000200000000BC +:108CB000000201010001010202020202020202029C +:108CC000020202010101010000000000000000009A +:108CD0000000000000000000000000000000000094 +:108CE0000000000000000000000000000000000084 +:108CF0000000000000000000000000000000000074 +:108D00000000000000000002020202020201020153 +:108D1000010100000101020000000000000000004D +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 +:108D40000000000000000000000000000000000023 +:108D50000000000000000002020201010101010107 +:108D600001010101010101000000000000000000FC +:108D700000000000000000000000000000000000F3 +:108D800000000000000000000000000000000000E3 +:108D900000000000000000000000000000000000D3 +:108DA00000000000000000020202020202000200B5 +:108DB000020200000000000202020202020202029D +:108DC0000202020202010100000000000000000097 +:108DD0000000000000000000000000000000000093 +:108DE0000000000000000000000000000000000083 +:108DF0000000000000000000000000000000000073 +:108E00000000000000000002020202020201020251 +:108E1000020100010101020000000000000000004A +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 +:108E50000000000000000002020202020201010103 +:108E600001010101010101000000000000000000FB +:108E700000000000000000000000000000000000F2 +:108E800000000000000000000000000000000000E2 +:108E900000000000000000000000000000000000D2 +:108EA00000000000000000020202020202020202B0 +:108EB000020200000000000102020202020202029D +:108EC0000102020202020100000000000000000096 +:108ED0000000000000000000000000000000000092 +:108EE0000000000000000000000000000000000082 +:108EF0000000000000000000000000000000000072 +:108F0000000000000000000202020202020202024F +:108F10000202000102010200000000000000000047 +:108F20000000000000000000000000000000000041 +:108F30000000000000000000000000000000000031 +:108F40000000000000000000000000000000000021 +:108F50000000000000000002020202020201020101 +:108F600002010202010201000000000000000000F6 +:108F700000000000000000000000000000000000F1 +:108F800000000000000000000000000000000000E1 +:108F900000000000000000000000000000000000D1 +:108FA00000000000000000020202020202020202AF +:108FB000020200000200000102020202020202029A +:108FC0000102020202020000000000000000000096 +:108FD0000000000000000000000000000000000091 +:108FE0000000000000000000000000000000000081 +:108FF0000000000000000000000000000000000071 +:10900000000000000000000202020202020202024E +:109010000202010102020200000000000000000044 +:109020000000000000000000000000000000000040 +:109030000000000000000000000000000000000030 +:109040000000000000000000000000000000000020 +:1090500000000000000000020202020202020201FF +:1090600002010202020202000000000000000000F3 +:1090700000000000000000000000000000000000F0 +:1090800000000000000000000000000000000000E0 +:1090900000000000000000000000000000000000D0 +:1090A00000000000000000020202020202020202AE +:1090B0000202020202020201020202020202020291 +:1090C0000102020202020000000000000000000095 +:1090D0000000000000000000000000000000000090 +:1090E0000000000000000000000000000000000080 +:1090F0000000000000000000000000000000000070 +:10910000000000000000000202020202020202024D +:109110000202010102020200000000000000000043 +:10912000000000000000000000000000000000003F +:10913000000000000000000000000000000000002F +:10914000000000000000000000000000000000001F +:1091500000000000000000020202020202020202FD +:1091600002020202020202000000000000000000F1 +:1091700000000000000000000000000000000000EF +:1091800000000000000000000000000000000000DF +:1091900000000000000000000000000000000000CF +:1091A00000000000000000020202020202020202AD +:1091B0000202020202020201010202020201020193 +:1091C0000102020202020000000000000000000094 +:1091D000000000000000000000000000000000008F +:1091E000000000000000000000000000000000007F +:1091F000000000000000000000000000000000006F +:10920000000000000000000202020202020202024C +:109210000202010202020200000000000000000041 +:10922000000000000000000000000000000000003E +:10923000000000000000000000000000000000002E +:10924000000000000000000000000000000000001E +:1092500000000000000000020202020202020202FC +:1092600002020202020202000000000000000000F0 +:1092700000000000000000000000000000000000EE +:1092800000000000000000000000000000000000DE +:1092900000000000000000000000000000000000CE +:1092A00000000000000000020202020202020202AC +:1092B0000202020202020201010201020201020193 +:1092C0000102020202020000000000000000000093 +:1092D000000000000000000000000000000000008E +:1092E000000000000000000000000000000000007E +:1092F000000000000000000000000000000000006E +:10930000000000000000000202020202020202024B +:10931000020202020202020000000000000000003F +:10932000000000000000000000000000000000003D +:10933000000000000000000000000000000000002D +:10934000000000000000000000000000000000001D +:1093500000000000000000020202020202020202FB +:1093600002020202020202000000000000000000EF +:1093700000000000000000000000000000000000ED +:1093800000000000000000000000000000000000DD +:1093900000000000000000000000000000000000CD +:1093A00000000000000000000202020202020202AD +:1093B0000202020202020201010101010101010196 +:1093C0000101010202020000000000000000000094 +:1093D000000000000000000000000000000000008D +:1093E000000000000000000000000000000000007D +:1093F000000000000000000000000000000000006D +:10940000000000000000000202020202020202004C +:109410000200020202020200000000000000000040 +:10942000000000000000000000000000000000003C +:10943000000000000000000000000000000000002C +:10944000000000000000000000000000000000001C +:1094500000000000000000020202020202020202FA +:1094600002020202020202000000000000000000EE +:1094700000000000000000000000000000000000EC +:1094800000000000000000000000000000000000DC +:1094900000000000000000000000000000000000CC +:1094A00000000000000000000202020202020202AC +:1094B0000202020202020201010101010101010195 +:1094C0000101010101020000000000000000000095 +:1094D000000000000000000000000000000000008C +:1094E000000000000000000000000000000000007C +:1094F000000000000000000000000000000000006C +:10950000000000000000000102020202020202004C +:10951000020002020202020000000000000000003F +:10952000000000000000000000000000000000003B +:10953000000000000000000000000000000000002B +:10954000000000000000000000000000000000001B +:1095500000000000000000020202020202020202F9 +:1095600002020202020202000000000000000000ED +:1095700000000000000000000000000000000000EB +:1095800000000000000000000000000000000000DB +:1095900000000000000000000000000000000000CB +:1095A00000000000000000000202020202020202AB +:1095B0000200020202020201010101010101010196 +:1095C0000101010101010000000000000000000095 +:1095D000000000000000000000000000000000008B +:1095E000000000000000000000000000000000007B +:1095F000000000000000000000000000000000006B +:10960000000000000000000202020202020202004A +:10961000020002020202020000000000000000003E +:10962000000000000000000000000000000000003A +:10963000000000000000000000000000000000002A +:10964000000000000000000000000000000000001A +:1096500000000000000000020202020202020202F8 +:1096600002020202020202000000000000000000EC +:1096700000000000000000000000000000000000EA +:1096800000000000000000000000000000000000DA +:1096900000000000000000000000000000000000CA +:1096A00000000000000000000202020202020202AA +:1096B0000200020202020201010101010101010195 +:1096C0000101010101010000000000000000000094 +:1096D000000000000000000000000000000000008A +:1096E000000000000000000000000000000000007A +:1096F000000000000000000000000000000000006A +:109700000000000000000000010101010101010151 +:109710000101010101010100000000000000000042 +:109720000000000000000000000000000000000039 +:109730000000000000000000000000000000000029 +:109740000000000000000000000000000000000019 +:1097500000000000000000020202020202020202F7 +:1097600002020202020202000000000000000000EB +:1097700000000000000000000000000000000000E9 +:1097800000000000000000000000000000000000D9 +:1097900000000000000000000000000000000000C9 +:1097A00000000000000000000202020202020202A9 +:1097B0000200020202020201010101010101010194 +:1097C0000101010101010000000000000000000093 +:1097D0000000000000000000000000000000000089 +:1097E0000000000000000000000000000000000079 +:1097F0000000000000000000000000000000000069 +:10980000000000000000000101010101010101014F +:109810000101010101010100000000000000000041 +:109820000000000000000000000000000000000038 +:109830000000000000000000000000000000000028 +:109840000000000000000000000000000000000018 +:1098500000000000000000020202020202020202F6 +:1098600002020202020202000000000000000000EA +:1098700000000000000000000000000000000000E8 +:1098800000000000000000000000000000000000D8 +:1098900000000000000000000000000000000000C8 +:1098A00000000000000000000202020202020202A8 +:1098B0000200020202020200010101010101010194 +:1098C0000001010101010000000000000000000093 +:1098D0000000000000000000000000000000000088 +:1098E0000000000000000000000000000000000078 +:1098F0000000000000000000000000000000000068 +:10990000000000000000000101010101010101014E +:109910000101010101010100000000000000000040 +:109920000000000000000000000000000000000037 +:109930000000000000000000000000000000000027 +:109940000000000000000000000000000000000017 +:1099500000000000000000020202020202020202F5 +:1099600002020202020202000000000000000000E9 +:1099700000000000000000000000000000000000E7 +:1099800000000000000000000000000000000000D7 +:1099900000000000000000000000000000000000C7 +:1099A00000000000000000000202020202020202A7 +:1099B0000000020202020200010101010101010195 +:1099C0000001010101010000000000000000000092 +:1099D0000000000000000000000000000000000087 +:1099E0000000000000000000000000000000000077 +:1099F0000000000000000000000000000000000067 +:109A0000000000000000000101010101010101014D +:109A1000010101010101010000000000000000003F +:109A20000000000000000000000000000000000036 +:109A30000000000000000000000000000000000026 +:109A40000000000000000000000000000000000016 +:109A500000000000000000010101010101010101FD +:109A600001010101010101000000000000000000EF +:109A700000000000000000000000000000000000E6 +:109A800000000000000000000000000000000000D6 +:109A900000000000000000000000000000000000C6 +:109AA00000000000000000000200020002020002AC +:109AB0000000020202020200010101010101010194 +:109AC0000001010101010000000000000000000091 +:109AD0000000000000000000000000000000000086 +:109AE0000000000000000000000000000000000076 +:109AF0000000000000000000000000000000000066 +:109B0000000000000000000101010101010101014C +:109B1000010101010101010000000000000000003E +:109B20000000000000000000000000000000000035 +:109B30000000000000000000000000000000000025 +:109B40000000000000000000000000000000000015 +:109B500000000000000000010101010101010101FC +:109B600001010101010101000000000000000000EE +:109B700000000000000000000000000000000000E5 +:109B800000000000000000000000000000000000D5 +:109B900000000000000000000000000000000000C5 +:109BA00000000000000000000200020000020000AF +:109BB0000000020200020200000101010101010196 +:109BC0000001010101010000000000000000000090 +:109BD0000000000000000000000000000000000085 +:109BE0000000000000000000000000000000000075 +:109BF0000000000000000000000000000000000065 +:109C0000000000000000000101010101010101014B +:109C1000010101010101010000000000000000003D +:109C20000000000000000000000000000000000034 +:109C30000000000000000000000000000000000024 +:109C40000000000000000000000000000000000014 +:109C500000000000000000010101010101010101FB +:109C600001010101010101000000000000000000ED +:109C700000000000000000000000000000000000E4 +:109C800000000000000000000000000000000000D4 +:109C900000000000000000000000000000000000C4 +:109CA00000000000000000000000020000000000B2 +:109CB000000002020002000000010001000001019A +:109CC0000000000000000000000000000000000094 +:109CD0000000000000000000000000000000000084 +:109CE0000000000000000000000000000000000074 +:109CF0000000000000000000000000000000000064 +:109D00000000000000000002020202020202020241 +:109D10000202020202020200000000000000000035 +:109D20000000000000000000000000000000000033 +:109D30000000000000000000000000000000000023 +:109D40000000000000000000000000000000000013 +:109D500000000000000000020202020202020202F1 +:109D600002020202020202000000000000000000E5 +:109D700000000000000000000000000000000000E3 +:109D800000000000000000000000000000000000D3 +:109D900000000000000000000000000000000000C3 +:109DA00000000000000000000000000000000000B3 +:109DB00000000000000000000000000000000000A3 +:109DC0000000000000000000000000000000000093 +:109DD0000000000000000000000000000000000083 +:109DE0000000000000000000000000000000000073 +:109DF0000000000000000000000000000000000063 +:109E00000000000000000000000000000000000052 +:109E10000000000000000000000000000000000042 +:109E20000000000000000000000000000000000032 +:109E30000000000000000000000000000000000022 +:109E40000000000000000000000000000000000012 +:109E50000000000000000000000000000000000002 +:109E600000000000000000000000000000000000F2 +:109E700000000000000000000000000000000000E2 +:109E800000000000000000000000000000000000D2 +:109E900000000000000000000000000000000000C2 +:109EA00000000000000000000000000000000000B2 +:109EB000000000000000001E000000000000000282 +:109EC0000101010101010101010101010101010083 +:109ED0000000000000000000000000000000000082 +:109EE0000000000000000000000000000000000072 +:109EF0000000000000000000000000000000000062 +:109F00000000000000000000000000000000000051 +:109F1000010000000000000000000000000100003F +:109F20000000000000000000000000000000000031 +:109F30000000000000000000000000000000000021 +:109F40000000000000000000000000000000000011 +:109F50000000000000000000000000000000000001 +:109F600000000000000000000000000000000000F1 +:109F700000000000000000000000000000000000E1 +:109F800000000000000000000000000000000000D1 +:109F900000000000000000000000000000000000C1 +:109FA00000000000000000000000000000000000B1 +:109FB0000101010101010101010101010101010290 +:109FC0000101010101010101010101010101010082 +:109FD0000000000000000000000000000000000081 +:109FE0000000000000000000000000000000000071 +:109FF0000000000000000000000000000000000061 +:10A000000000000000000000000000000000000050 +:10A01000010000000100000000000000000100003D +:10A020000000000000000000000000000000000030 +:10A030000000000000000000000000000000000020 +:10A040000000000000000000000000000000000010 +:10A050000000000000000000000000000000000000 +:10A0600000000000000000000000000000000000F0 +:10A0700000000000000000000000000000000000E0 +:10A0800000000000000000000000000000000000D0 +:10A0900000000000000000000000000000000000C0 +:10A0A00000000000000000000000000000000000B0 +:10A0B000010101010101010101010101010101028F +:10A0C0000101010101010101010101010101010081 +:10A0D0000000000000000000000000000000000080 +:10A0E0000000000000000000000000000000000070 +:10A0F0000000000000000000000000000000000060 +:10A10000000000000000000000000000000000004F +:10A11000010000000100000000000000000101003B +:10A12000000000000000000000000000000000002F +:10A13000000000000000000000000000000000001F +:10A14000000000000000000000000000000000000F +:10A1500000000000000000000000000000000000FF +:10A1600000000000000000000000000000000000EF +:10A1700000000000000000000000000000000000DF +:10A1800000000000000000000000000000000000CF +:10A1900000000000000000000000000000000000BF +:10A1A00000000000000000000000000000000002AD +:10A1B000010101010101010101010101010101028E +:10A1C0000101010101010101010101010101010080 +:10A1D000000000000000000000000000000000007F +:10A1E000000000000000000000000000000000006F +:10A1F000000000000000000000000000000000005F +:10A20000000000000000000000000000000000004E +:10A210000101000001000000000000000001010039 +:10A22000000000000000000000000000000000002E +:10A23000000000000000000000000000000000001E +:10A24000000000000000000000000000000000000E +:10A2500000000000000000000000000000000000FE +:10A2600000000000000000000000000000000000EE +:10A2700000000000000000000000000000000000DE +:10A2800000000000000000000000000000000000CE +:10A2900000000000000000000000000000000000BE +:10A2A00000000000000000000000000000000002AC +:10A2B000010101010101010101010101010101028D +:10A2C000020101010101010101010101010101007E +:10A2D000000000000000000000000000000000007E +:10A2E000000000000000000000000000000000006E +:10A2F000000000000000000000000000000000005E +:10A30000000000000000000000000000000000004D +:10A310000101000001000000000001000001010037 +:10A32000000000000000000000000000000000002D +:10A33000000000000000000000000000000000001D +:10A34000000000000000000000000000000000000D +:10A3500000000000000000000000000000000000FD +:10A3600000000000000000000000000000000000ED +:10A3700000000000000000000000000000000000DD +:10A3800000000000000000000000000000000000CD +:10A3900000000000000000000000000000000000BD +:10A3A00000000000000000000000000000000002AB +:10A3B000010101010101010101010101010101028C +:10A3C000020101010101010101010101010101007D +:10A3D000000000000000000000000000000000007D +:10A3E000000000000000000000000000000000006D +:10A3F000000000000000000000000000000000005D +:10A40000000000000000000000000000000000004C +:10A410000201010001000000000001000001010034 +:10A42000000000000000000000000000000000002C +:10A43000000000000000000000000000000000001C +:10A44000000000000000000000000000000000000C +:10A4500000000000000000000000000000000000FC +:10A4600000000000000000000000000000000000EC +:10A4700000000000000000000000000000000000DC +:10A4800000000000000000000000000000000000CC +:10A4900000000000000000000000000000000000BC +:10A4A00000000000000000000000000000000002AA +:10A4B000010101010101010101010101010101028B +:10A4C000020101010101010101010101020101007B +:10A4D000000000000000000000000000000000007C +:10A4E000000000000000000000000000000000006C +:10A4F000000000000000000000000000000000005C +:10A500000000000000000000000000000000000249 +:10A510000201010001000000000001010101010031 +:10A52000000000000000000000000000000000002B +:10A53000000000000000000000000000000000001B +:10A54000000000000000000000000000000000000B +:10A5500000000000000000000000000000000000FB +:10A5600001000000000000000000000000000000EA +:10A5700000000000000000000000000000000000DB +:10A5800000000000000000000000000000000000CB +:10A5900000000000000000000000000000000000BB +:10A5A00000000000000000000000000000000002A9 +:10A5B000010101010101010101010101010101028A +:10A5C0000201010201010101010101020201010078 +:10A5D000000000000000000000000000000000007B +:10A5E000000000000000000000000000000000006B +:10A5F000000000000000000000000000000000005B +:10A600000000000000000000000000000000000248 +:10A61000020101000101000000000101010101002F +:10A62000000000000000000000000000000000002A +:10A63000000000000000000000000000000000001A +:10A64000000000000000000000000000000000000A +:10A6500000000000000000000000000000000000FA +:10A6600001010100010000000000000000000000E6 +:10A6700000000000000000000000000000000000DA +:10A6800000000000000000000000000000000000CA +:10A6900000000000000000000000000000000000BA +:10A6A00000000000000000000000000000000002A8 +:10A6B000000101010101010101010101010101028A +:10A6C0000202020201020102010101020201010073 +:10A6D000000000000000000000000000000000007A +:10A6E000000000000000000000000000000000006A +:10A6F000000000000000000000000000000000005A +:10A700000000000000000000000000000000000247 +:10A71000020201000201000000000101010101002C +:10A720000000000000000000000000000000000029 +:10A730000000000000000000000000000000000019 +:10A740000000000000000000000000000000000009 +:10A7500000000000000000000000000000000002F7 +:10A7600001010100010000000000000000010000E4 +:10A7700000000000000000000000000000000000D9 +:10A7800000000000000000000000000000000000C9 +:10A7900000000000000000000000000000000000B9 +:10A7A00000000000000000000000000000000002A7 +:10A7B0000001010101010101010101010101010289 +:10A7C0000202020202020202010101020201010070 +:10A7D0000000000000000000000000000000000079 +:10A7E0000000000000000000000000000000000069 +:10A7F0000000000000000000000000000000000059 +:10A800000000000000000000000000000000000246 +:10A810000202020102010000000001010101010029 +:10A820000000000000000000000000000000000028 +:10A830000000000000000000000000000000000018 +:10A840000000000000000000000000000000000008 +:10A8500000000000000000000000000000000002F6 +:10A8600002010101010100000000000000010000E0 +:10A8700000000000000000000000000000000000D8 +:10A8800000000000000000000000000000000000C8 +:10A8900000000000000000000000000000000000B8 +:10A8A00000000000000000000000000000000002A6 +:10A8B0000201010101010101010101010101010286 +:10A8C000020202020202020202010102020101006E +:10A8D0000000000000000000000000000000000078 +:10A8E0000000000000000000000000000000000068 +:10A8F0000000000000000000000000000000000058 +:10A900000000000000000000000000000000000245 +:10A910000202020102010000000001010101010028 +:10A920000000000000000000000000000000000027 +:10A930000000000000000000000000000000000017 +:10A940000000000000000000000000000000000007 +:10A9500000000000000000000000000000000002F5 +:10A9600002010101010101000000000000010100DD +:10A9700000000000000000000000000000000000D7 +:10A9800000000000000000000000000000000000C7 +:10A9900000000000000000000000000000000000B7 +:10A9A00000000000000000000000000000000002A5 +:10A9B0000200000001010101010101010101010189 +:10A9C000020202020202020202020102010101006D +:10A9D0000000000000000000000000000000000077 +:10A9E0000000000000000000000000000000000067 +:10A9F0000000000000000000000000000000000057 +:10AA00000000000000000000000000000000000244 +:10AA10000202020202020000000102010202020020 +:10AA20000000000000000000000000000000000026 +:10AA30000000000000000000000000000000000016 +:10AA40000000000000000000000000000000000006 +:10AA500000000000000000000000000000000002F4 +:10AA600002020201010101000000000000010100DA +:10AA700000000000000000000000000000000000D6 +:10AA800000000000000000000000000000000000C6 +:10AA900000000000000000000000000000000000B6 +:10AAA00000000000000000000000000000000002A4 +:10AAB0000202020200000000010101010101010186 +:10AAC000020202020202020202020201010101006C +:10AAD0000000000000000000000000000000000076 +:10AAE0000000000000000000000000000000000066 +:10AAF0000000000000000000000000000000000056 +:10AB00000000000000000000000000000000000243 +:10AB1000020202020202000000010202020202001E +:10AB20000000000000000000000000000000000025 +:10AB30000000000000000000000000000000000015 +:10AB40000000000000000000000000000000000005 +:10AB500000000000000000000000000000000002F3 +:10AB600002020202020101010000010000010100D5 +:10AB700000000000000000000000000000000000D5 +:10AB800000000000000000000000000000000000C5 +:10AB900000000000000000000000000000000000B5 +:10ABA00000000000000000000000000000000002A3 +:10ABB0000202020202020202000000000001000183 +:10ABC000020202020202020202020201010201006A +:10ABD0000000000000000000000000000000000075 +:10ABE0000000000000000000000000000000000065 +:10ABF0000000000000000000000000000000000055 +:10AC00000000000000000000000000000000000242 +:10AC1000020202020202000001020202020202001B +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000000000000000000000014 +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000002F2 +:10AC600002020202020201010101010000010100D1 +:10AC700000000000000000000000000000000000D4 +:10AC800000000000000000000000000000000000C4 +:10AC900000000000000000000000000000000000B4 +:10ACA00000000000000000000000000000000002A2 +:10ACB0000202020202020202020202020200020177 +:10ACC000020202020202020202020201010200006A +:10ACD0000000000000000000000000000000000074 +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000000000000000054 +:10AD00000000000000000000000000000000000241 +:10AD10000202020202020100020202020202020018 +:10AD20000000000000000000000000000000000023 +:10AD30000000000000000000000000000000000013 +:10AD40000000000000000000000000000000000003 +:10AD500000000000000000000000000000000002F1 +:10AD600002020202020202010101010100010100CE +:10AD700000000000000000000000000000000000D3 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000000000000000000002A1 +:10ADB0000202020202020202020202020202020174 +:10ADC000010202020202020202020201010200006A +:10ADD0000000000000000000000000000000000073 +:10ADE0000000000000000000000000000000000063 +:10ADF0000000000000000000000000000000000053 +:10AE00000000000000000000000000000000000240 +:10AE10000202020202020200020202020202020016 +:10AE20000000000000000000000000000000000022 +:10AE30000000000000000000000000000000000012 +:10AE40000000000000000000000000000000000002 +:10AE500000000000000000000000000000000002F0 +:10AE600002020202020202020101010100020100CB +:10AE700000000000000000000000000000000000D2 +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000000000000000000B2 +:10AEA00000000000000000000000000000000002A0 +:10AEB0000202020202020202020202020202020173 +:10AEC0000102020202020202020202010102000069 +:10AED0000000000000000000000000000000000072 +:10AEE0000000000000000000000000000000000062 +:10AEF0000000000000000000000000000000000052 +:10AF0000000000000000000000000000000000023F +:10AF10000202020202020202020202020202020013 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000000000000011 +:10AF40000000000000000000000000000000000001 +:10AF500000000000000000000000000000000002EF +:10AF600002020202020202020202020100020200C6 +:10AF700000000000000000000000000000000000D1 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000000A1 +:10AFB0000202020202020202020202020202020172 +:10AFC0000102020202020201020202010102000069 +:10AFD0000000000000000000000000000000000071 +:10AFE0000000000000000000000000000000000061 +:10AFF0000000000000000000000000000000000051 +:10B00000000000000000000000000000000000023E +:10B010000202020202020202010102020102020015 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000000000002EE +:10B0600002020202020202020202020200020200C4 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000202020202020202020202020202020171 +:10B0C000010202010201010102020201010100006C +:10B0D0000000000000000000000000000000000070 +:10B0E0000000000000000000000000000000000060 +:10B0F0000000000000000000000000000000000050 +:10B10000000000000000000000000000000000023D +:10B110000202020202020202010102020102020014 +:10B12000000000000000000000000000000000001F +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000000FF +:10B1500000000000000000000000000000000002ED +:10B1600002020202020202020202020200020200C3 +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000000009F +:10B1B0000202020202020202020202020202020170 +:10B1C000010101010101010101020201010100006F +:10B1D000000000000000000000000000000000006F +:10B1E000000000000000000000000000000000005F +:10B1F000000000000000000000000000000000004F +:10B20000000000000000000000000000000000013D +:10B21000010101010101010102020101020201001B +:10B22000000000000000000000000000000000001E +:10B23000000000000000000000000000000000000E +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000002EC +:10B2600002020202020202020202020200020200C2 +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B000020202020202020202020202020202016F +:10B2C0000101010101010101010101010101000070 +:10B2D000000000000000000000000000000000006E +:10B2E000000000000000000000000000000000005E +:10B2F000000000000000000000000000000000004E +:10B30000000000000000000000000000000000023B +:10B31000020202020202020202020202020202000F +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000002EB +:10B3600002020202020202020202020202020200BF +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B000020202020202020202020202020202016E +:10B3C000010101010101010101010101010100006F +:10B3D000000000000000000000000000000000006D +:10B3E000000000000000000000000000000000005D +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000100002B +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000000000000000000000000000000000FC +:10B4500000000000000000000000000000000002EA +:10B4600002020202020202020202020202020200BE +:10B4700000000000000000000000000000000000CC +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000020202020202020202020202020202006E +:10B4C0000101010101010101010101000001000070 +:10B4D000000000000000000000000000000000006C +:10B4E000000000000000000000000000000000005C +:10B4F000000000000000000000000000000000004C +:10B50000000000000000000000000000000000003B +:10B510000000000000000000000000000002000029 +:10B52000000000000000000000000000000000001B +:10B53000000000000000000000000000000000000B +:10B5400000000000000000000000000000000000FB +:10B5500000000000000000000000000000000001EA +:10B5600001010101010101010101010101010100CC +:10B5700000000000000000000000000000000000CB +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A000000000000000000000000000000000009B +:10B5B000020202020202020202020202020202006D +:10B5C000010101010101010101010100000100006F +:10B5D000000000000000000000000000000000006B +:10B5E000000000000000000000000000000000005B +:10B5F000000000000000000000000000000000004B +:10B600000000000000000000000000000000000139 +:10B61000010101010101010101010101010101001B +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000000000000000FA +:10B6500000000000000000000000000000000001E9 +:10B6600001010101010101010101010101010100CB +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A000000000000000000000000000000000009A +:10B6B000020202020202020202020202020202006C +:10B6C000010101010101010101010100000000006F +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000138 +:10B71000010101010101010101010101010101001A +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B7400000000000000000000000000000000000F9 +:10B7500000000000000000000000000000000001E8 +:10B7600001010101010101010101010101010100CA +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 +:10B7A0000000000000000000000000000000000099 +:10B7B000020202020202020202020202020202006B +:10B7C000010101010101010101010100000000006E +:10B7D0000000000000000000000000000000000069 +:10B7E0000000000000000000000000000000000059 +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000137 +:10B810000101010101010101010101010101010019 +:10B820000000000000000000000000000000000018 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000001E7 +:10B8600001010101010101010101010101010100C9 +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A0000000000000000000000000000000000098 +:10B8B000020202020202020202020202020200006C +:10B8C000000101010101010101010100000000006E +:10B8D0000000000000000000000000000000000068 +:10B8E0000000000000000000000000000000000058 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000000000000000000000136 +:10B910000101010101010101010101010101010018 +:10B920000000000000000000000000000000000017 +:10B930000000000000000000000000000000000007 +:10B9400000000000000000000000000000000000F7 +:10B9500000000000000000000000000000000001E6 +:10B9600001010101010101010101010101010100C8 +:10B9700000000000000000000000000000000000C7 +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000000000000000000097 +:10B9B000000202020202020202020202020200006D +:10B9C000000101010101010101010100000000006D +:10B9D0000000000000000000000000000000000067 +:10B9E0000000000000000000000000000000000057 +:10B9F0000000000000000000000000000000000047 +:10BA00000000000000000000000000000000000135 +:10BA10000101010101010101010101010101010017 +:10BA20000000000000000000000000000000000016 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000000000002E4 +:10BA600002020202020202020202020202020200B8 +:10BA700000000000000000000000000000000000C6 +:10BA800000000000000000000000000000000000B6 +:10BA900000000000000000000000000000000000A6 +:10BAA0000000000000000000000000000000000096 +:10BAB0000002020202020000020200000000000078 +:10BAC000000101010101000001010000000000006F +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000000000000000056 +:10BAF0000000000000000000000000000000000046 +:10BB00000000000000000000000000000000000233 +:10BB10000202020202020202020202020202020007 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000002E3 +:10BB600002020202020202020202020202020200B7 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000001E66 +:10BCC000000000000000000101010101010101016B +:10BCD000010101010201010000000000000000005C +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000010000000000000000D2 +:10BD700000000000000001000000000000000000C2 +:10BD800000000000000000000000000000000000B3 +:10BD900000000000000000000000000000000000A3 +:10BDA0000000000000000000000000000000000093 +:10BDB000000000000000000001010101010101017B +:10BDC0000101010101010102010101010101010162 +:10BDD0000201010202020100000000000000000058 +:10BDE0000000000000000000000000000000000053 +:10BDF0000000000000000000000000000000000043 +:10BE00000000000000000000000000000000000032 +:10BE10000000000000000000000000000000000022 +:10BE20000000000000000000000000000000000012 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000000010000000000000000D1 +:10BE700000000000000001000000000000000000C1 +:10BE800000000000000000000000000000000000B2 +:10BE900000000000000000000000000000000000A2 +:10BEA0000000000000000000000000000000000092 +:10BEB000000000000000000000010101000101017C +:10BEC0000101010101010102020101010101010160 +:10BED0000202010201020100000000000000000057 +:10BEE0000000000000000000000000000000000052 +:10BEF0000000000000000000000000000000000042 +:10BF00000000000000000000000000000000000031 +:10BF10000000000000000000000000000000000021 +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000010000000000000000D0 +:10BF700000000000010001000000000000000000BF +:10BF800000000000000000000000000000000000B1 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 +:10BFB000000000000000000000010101000101017B +:10BFC000010101010101010202020101010101015E +:10BFD0000202020201010100000000000000000056 +:10BFE0000000000000000000000000000000000051 +:10BFF0000000000000000000000000000000000041 +:10C000000000000000000000000000000000000030 +:10C010000000000000000000000000000000000020 +:10C020000000000000000000000000000000000010 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000010100000000000000CE +:10C0700000000000010101000000000000000000BD +:10C0800000000000000000000000000000000000B0 +:10C0900000000000000000000000000000000000A0 +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000002000101010201010176 +:10C0C0000101010101010102020202020101020259 +:10C0D0000202020101010100000000000000000056 +:10C0E0000000000000000000000000000000000050 +:10C0F0000000000000000000000000000000000040 +:10C10000000000000000000000000000000000002F +:10C11000000000000000000000000000000000001F +:10C12000000000000000000000000000000000000F +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000010100010100000000CB +:10C1700000000000010101000000000000000000BC +:10C1800000000000000000000000000000000000AF +:10C19000000000000000000000000000000000009F +:10C1A000000000000000000000000000000000008F +:10C1B0000000000000000002000001000201010177 +:10C1C0000101010101010102020202020202020256 +:10C1D0000102020101010100000000000000000056 +:10C1E000000000000000000000000000000000004F +:10C1F000000000000000000000000000000000003F +:10C20000000000000000000000000000000000002E +:10C21000000000000000000000000000000000001E +:10C22000000000000000000000000000000000000E +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000020101010101000000C7 +:10C2700000000000010101000000000000000000BB +:10C2800000000000000000000000000000000000AE +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E +:10C2B0000000000000000002000001000200010177 +:10C2C0000001010101010102020202020202020256 +:10C2D0000102020101010100000000000000000055 +:10C2E000000000000000000000000000000000004E +:10C2F000000000000000000000000000000000003E +:10C30000000000000000000000000000000000002D +:10C31000000000000000000000000000000000001D +:10C32000000000000000010000000000000000000C +:10C3300000000000000000000000000000000000FD +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000020101010101010000C5 +:10C3700000000000010101000000000000000000BA +:10C3800000000000000000000000000000000000AD +:10C39000000000000000000000000000000000009D +:10C3A000000000000000000000000000000000008D +:10C3B0000000000000000002000000000202010175 +:10C3C0000001000100010102020202020202020257 +:10C3D0000101020101010100000000000000000055 +:10C3E000000000000000000000000000000000004D +:10C3F000000000000000000000000000000000003D +:10C40000000000000000000000000000000000002C +:10C41000000000000000000000000000000000001C +:10C42000000000000001010000000000000000000A +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000020201010101010000C3 +:10C4700000000000010101000000000000000000B9 +:10C4800000000000000000000000000000000000AC +:10C49000000000000000000000000000000000009C +:10C4A000000000000000000000000000000000008C +:10C4B0000000000000000002000000000202000076 +:10C4C0000001000100010102020202020202020256 +:10C4D0000101010101010100000000000000000055 +:10C4E000000000000000000000000000000000004C +:10C4F000000000000000000000000000000000003C +:10C50000000000000000000000000000000000002B +:10C51000000000000000000100000000000000001A +:10C520000000000001010100000000000000000008 +:10C5300000000000000000000000000000000000FB +:10C5400000000000000000000000000000000000EB +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000020201010101010000C2 +:10C5700000000000010101000000000000000000B8 +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000000000000000009B +:10C5A000000000000000000000000000000000008B +:10C5B0000000000000000002000000000202000075 +:10C5C0000200020000010002020202020202020254 +:10C5D0000101010101010100000000000000000054 +:10C5E000000000000000000000000000000000004B +:10C5F000000000000000000000000000000000003B +:10C60000000000000000000000000000000000002A +:10C610000000000000000001010100000000000017 +:10C620000000000001010100000000000000000007 +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000020202020201010000BE +:10C6700000000000010101000000000000000000B7 +:10C6800000000000000000000000000000000000AA +:10C69000000000000000000000000000000000009A +:10C6A000000000000000000000000000000000008A +:10C6B0000000000000000002020200000002000072 +:10C6C0000200020002010001020202020202020153 +:10C6D0000101010101010000000000000000000054 +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C710000000000000000002010101000000000014 +:10C720000001000001010100000000000000000005 +:10C7300000000000000000000000000000000000F9 +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000000000000000D9 +:10C7600000000000000000020202020202010000BC +:10C7700000000000020102000000000000000000B4 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000000000000000000000000089 +:10C7B000000000000000000202020200000200006F +:10C7C0000200020002010201020202020202010151 +:10C7D0000101010101010000000000000000000053 +:10C7E0000000000000000000000000000000000049 +:10C7F0000000000000000000000000000000000039 +:10C800000000000000000000000000000000000028 +:10C810000000000000000002020101000000000012 +:10C820000001000001010100000000000000000004 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000020202020202020000BA +:10C8700000000000020202000000000000000000B2 +:10C8800000000000000000000000000000000000A8 +:10C890000000000000000000000000000000000098 +:10C8A0000000000000000000000000000000000088 +:10C8B000000000000000000202020200000200006E +:10C8C0000202020002000201010102020202010151 +:10C8D0000101010100010000000000000000000053 +:10C8E0000000000000000000000000000000000048 +:10C8F0000000000000000000000000000000000038 +:10C900000000000000000000000000000000000027 +:10C910000000000000000002020201000000000010 +:10C920000001000101010100000000000000000002 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000000020202020202020000B9 +:10C9700000000000020202000000000000000000B1 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A0000000000000000000000000000000000087 +:10C9B000000000000000000202020200000202006B +:10C9C000020202020202020101010101020101014F +:10C9D0000101010100000000000000000000000053 +:10C9E0000000000000000000000000000000000047 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA1000000000000000000202020200010000000D +:10CA20000001000102010100000000000000000000 +:10CA300000000000000000000000000000000000F6 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000000000020202020202020001B7 +:10CA700000010000020202000000000000000000AF +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB000000000000000000002020200000202026A +:10CAC0000202020202020200010101010101010150 +:10CAD0000101010000000000000000000000000053 +:10CAE0000000000000000000000000000000000046 +:10CAF0000000000000000000000000000000000036 +:10CB00000000000000000000000000000000000025 +:10CB1000000000000000000202020201010000000B +:10CB200000020001020202000000000000000000FC +:10CB300000000000000000000000000000000000F5 +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000020202020202020101B5 +:10CB700000010000020202000000000000000000AE +:10CB800000000000000000000000000000000000A5 +:10CB90000000000000000000000000000000000095 +:10CBA0000000000000000000000000000000000085 +:10CBB0000000000000000000020202020002020267 +:10CBC000020202020202020001010101010101014F +:10CBD0000001010000000000000000000000000053 +:10CBE0000000000000000000000000000000000045 +:10CBF0000000000000000000000000000000000035 +:10CC00000000000000000000000000000000000024 +:10CC10000000000000000002020202020200000107 +:10CC200000020002020202000000000000000000FA +:10CC300000000000000000000000000000000000F4 +:10CC400000000000000000000000000000000000E4 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000020202020202020202B2 +:10CC700001020000020202000000000000000000AB +:10CC800000000000000000000000000000000000A4 +:10CC90000000000000000000000000000000000094 +:10CCA0000000000000000000000000000000000084 +:10CCB0000000000000000000020202020000020268 +:10CCC000020202020202020001010101010101014E +:10CCD0000001010000000000000000000000000052 +:10CCE0000000000000000000000000000000000044 +:10CCF0000000000000000000000000000000000034 +:10CD00000000000000000000000000000000000023 +:10CD10000000000000000002020202020201000105 +:10CD200000020002020202000000000000000000F9 +:10CD300000000000000000000000000000000000F3 +:10CD400000000000000000000000000000000000E3 +:10CD500000000000000000000000000000000000D3 +:10CD600000000000000000020202020202020202B1 +:10CD700002020000020202000000000000000000A9 +:10CD800000000000000000000000000000000000A3 +:10CD90000000000000000000000000000000000093 +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000020202020000020267 +:10CDC0000002000202020200010101010101010151 +:10CDD0000000010000000000000000000000000052 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE10000000000000000002020202020202000202 +:10CE200000020002020202000000000000000000F8 +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000000000000000000000000D2 +:10CE600000000000000000020202020202020202B0 +:10CE700002020000020202000000000000000000A8 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000092 +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000020202020000020266 +:10CEC0000002000200020200010101010101010152 +:10CED0000000000000000000000000000000000052 +:10CEE0000000000000000000000000000000000042 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF100000000000000000020202020202020202FF +:10CF200000020202020202000000000000000000F5 +:10CF300000000000000000000000000000000000F1 +:10CF400000000000000000000000000000000000E1 +:10CF500000000000000000000000000000000000D1 +:10CF600000000000000000020202020202020202AF +:10CF700002020202020202000000000000000000A3 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000020202020000020265 +:10CFC0000002000200020001010101010101010053 +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D0100000000000000000020202020202020202FE +:10D0200002020101010202000000000000000000F5 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000000000000000000000E0 +:10D0500000000000000000000000000000000000D0 +:10D0600000000000000000020202020202020202AE +:10D0700002020202020202000000000000000000A2 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000000000000000000080 +:10D0B0000000000000000000000202020000020266 +:10D0C0000002000200020001010101010101000053 +:10D0D0000000000000000000000000000000000050 +:10D0E0000000000000000000000000000000000040 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D1100000000000000000020202020202020202FD +:10D1200002010202020202000000000000000000F2 +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000010101010101010101B6 +:10D1700001010101010101000000000000000000A8 +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000007F +:10D1B0000000000000000000000002020000020267 +:10D1C0000002000200020001000001010101000054 +:10D1D000000000000000000000000000000000004F +:10D1E000000000000000000000000000000000003F +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D2200000020000000000000000000000000000FC +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000020202020202020202AC +:10D2700002020202020202000000000000000000A0 +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E +:10D2A000000000000000000000000000000000007E +:10D2B0000000000000000000000002020000020266 +:10D2C0000002000200020001000000000100000056 +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000010101010101010101B4 +:10D3700001010101010101000000000000000000A6 +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000000000000000000000000007D +:10D3B0000000000000000000000000020000020267 +:10D3C000000000000002000000000000000000005B +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D410000000000000000001010101010101010103 +:10D4200001010101010101000000000000000000F5 +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000010101010101010101B3 +:10D4700001010101010101000000000000000000A5 +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000002000000006A +:10D4C000000000000002000000000000000000005A +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D510000000000000000001010101010101010102 +:10D5200001010101010101000000000000000000F4 +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000010101010101010101B2 +:10D5700001010101010101000000000000000000A4 +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D610000000000000000001010101010101010101 +:10D6200001010101010101000000000000000000F3 +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000010101010101010101B1 +:10D6700001010101010101000000000000000000A3 +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000001010101010101010100 +:10D7200001010101010101000000000000000000F2 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000000000000000C9 +:10D7600000000000000000010101010101010101B0 +:10D7700001010101010101000000000000000000A2 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000049 +:10D7E0000000000000000000000000000000000039 +:10D7F0000000000000000000000000000000000029 +:10D800000000000000000000000000000000000018 +:10D8100000000000000000010101010101010101FF +:10D8200001010101010101000000000000000000F1 +:10D8300000000000000000000000000000000000E8 +:10D8400000000000000000000000000000000000D8 +:10D8500000000000000000000000000000000000C8 +:10D8600000000000000000020202020202020202A6 +:10D87000020202020202020000000000000000009A +:10D880000000000000000000000000000000000098 +:10D890000000000000000000000000000000000088 +:10D8A0000000000000000000000000000000000078 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000000000000000000000058 +:10D8D0000000000000000000000000000000000048 +:10D8E0000000000000000000000000000000000038 +:10D8F0000000000000000000000000000000000028 +:10D900000000000000000000000000000000000017 +:10D9100000000000000000020202020202020202F5 +:10D9200002020202020202000000000000000000E9 +:10D9300000000000000000000000000000000000E7 +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D9600000000000000000020202020202020202A5 +:10D970000202020202020200000000000000000099 +:10D980000000000000000000000000000000000097 +:10D990000000000000000000000000000000000087 +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000047 +:10D9E0000000000000000000000000000000000037 +:10D9F0000000000000000000000000000000000027 +:10DA00000000000000000000000000000000000016 +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000000000000000000000F6 +:10DA300000000000000000000000000000000000E6 +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000000C6 +:10DA600000000000000000000000000000000000B6 +:10DA700000000000000000000000000000000000A6 +:10DA80000000000000000000000000000000000096 +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000000000000000000000000076 +:10DAB0000000000000000000000000000000000066 +:10DAC000000000000000001E000000000000000038 +:10DAD0000000000001000001010000010001000041 +:10DAE0000000000000000000000000000000000036 +:10DAF0000000000000000000000000000000000026 +:10DB00000000000000000000000000000000000015 +:10DB10000000000000000000000000000000000005 +:10DB200000000000000000000000000000000000F5 +:10DB300000000000000000000000000000000000E5 +:10DB400000000000000000000000000000000000D5 +:10DB500000000000000000000000000000000000C5 +:10DB600000000000000000000000000000000000B5 +:10DB700000000000000000000000000000000000A5 +:10DB80000000000000000000000000000000000095 +:10DB90000000000000000000000000000000000085 +:10DBA0000000000000000000000000000000000075 +:10DBB0000000000000000000000000000000000065 +:10DBC0000000000000020200000000000000000150 +:10DBD000010101010100000101000101010100003A +:10DBE0000000000000000000000000000000000035 +:10DBF0000000000000000000000000000000000025 +:10DC00000000000000000000000000000000000014 +:10DC10000000000000000000000000000000000004 +:10DC200000000000000000000000000000000000F4 +:10DC300000000000000000000000000000000000E4 +:10DC400000000000000000000000000000000000D4 +:10DC500000000000000000000000000000000000C4 +:10DC600000000000000000000000000000000000B4 +:10DC7000000000000002020000010000000000009F +:10DC80000000000000000000000000000000000094 +:10DC90000000000000000000000000000000000084 +:10DCA0000000000000000000000000000000000074 +:10DCB0000000000000000000000000000000000064 +:10DCC000000000000002020000000000000000014F +:10DCD0000101010101010101010001010101000037 +:10DCE0000000000000000000000000000000000034 +:10DCF0000000000000000000000000000000000024 +:10DD00000000000000000000000000000000000013 +:10DD10000000000000000000000000000000000003 +:10DD200000000000000000000000000000000000F3 +:10DD300000000000000000000000000000000000E3 +:10DD400000000000000000000000000000000000D3 +:10DD500000000000000000000000000000000000C3 +:10DD600000000000000000000000000000000000B3 +:10DD7000000100000002020000010000010001009B +:10DD80000000000000000000000000000000000093 +:10DD90000000000000000000000000000000000083 +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 +:10DDC000000000000002020000000000000000014E +:10DDD0000101010101010101010001010101000036 +:10DDE0000000000000000000000000000000000033 +:10DDF0000000000000000000000000000000000023 +:10DE00000000000000000000000000000000000012 +:10DE10000000000000000000000000000000000002 +:10DE200000000000000000000000000000000000F2 +:10DE300000000000000000000000000000000000E2 +:10DE400000000000000000000000000000000000D2 +:10DE500000000000000000000000000000000000C2 +:10DE600000000000000000000000000000000000B2 +:10DE7000000100000002020000010000010001009A +:10DE80000000000000000000000000000000000092 +:10DE90000000000000000000000000000000000082 +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC000000000000002020000000000000000014D +:10DED0000101010101020201010101010101000032 +:10DEE0000000000000000000000000000000000032 +:10DEF0000000000000000000000000000000000022 +:10DF00000000000000000000000000000000000011 +:10DF10000000000000000000000000000000000001 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000000000000000000000000B1 +:10DF70000001000000020200000100000100010099 +:10DF80000000000000000000000000000000000091 +:10DF90000000000000000000000000000000000081 +:10DFA0000000000000000000000000000000000071 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000020202020000000000000247 +:10DFD0000101010101020201010101010101000031 +:10DFE0000000000000000000000000000000000031 +:10DFF0000000000000000000000000000000000021 +:10E000000000000000000000000000000000000010 +:10E010000000000000000000000000000000000000 +:10E0200000000000000000000000000000000000F0 +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000000000000000000000C0 +:10E0600000000000000000000000000000000000B0 +:10E070000001000000020200000100010101010096 +:10E080000000000000000000000000000000000090 +:10E090000000000000000000000000000000000080 +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000010102020000000000000248 +:10E0D000020101010102020201010101010100002E +:10E0E0000000000000000000000000000000000030 +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000000000F +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000001000000EE +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E170000101000100010100000101010101010094 +:10E18000000000000000000000000000000000008F +:10E19000000000000000000000000000000000007F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C0000000000000010101010000000000000249 +:10E1D000020102010202020201010101010100002B +:10E1E000000000000000000000000000000000002F +:10E1F000000000000000000000000000000000001F +:10E20000000000000000000000000000000000000E +:10E2100000000000000000000000000000000000FE +:10E2200000000000000000000000000001000000ED +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E2600000000000000000000000000000000000AE +:10E270000101000100010100000101010101010093 +:10E28000000000000000000000000000000000008E +:10E29000000000000000000000000000000000007E +:10E2A000000000000000000000000000000000006E +:10E2B000000000000000000000000000000000005E +:10E2C0000000000000010101010000000000000248 +:10E2D0000202020202020202020101010101000027 +:10E2E000000000000000000000000000000000002E +:10E2F000000000000000000000000000000000001E +:10E30000000000000000000000000000000000000D +:10E3100000000000000000000000000000000000FD +:10E3200000010000000000000000000001000000EB +:10E3300000000000000000000000000000000000DD +:10E3400000000000000000000000000000000000CD +:10E3500000000000000000000000000000000000BD +:10E3600000000000000000000000000000000000AD +:10E370000101010100010100000101010101010091 +:10E38000000000000000000000000000000000008D +:10E39000000000000000000000000000000000007D +:10E3A000000000000000000000000000000000006D +:10E3B000000000000000000000000000000000005D +:10E3C0000000000001010101010000000100000245 +:10E3D0000202020202020202020101010101000026 +:10E3E000000000000000000000000000000000002D +:10E3F000000000000000000000000000000000001D +:10E40000000000000000000000000000000000000C +:10E4100000000000000000000000000000000000FC +:10E4200000010000010000000001000001000000E8 +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E470000101010100010100000101010101010090 +:10E48000000000000000000000000000000000008C +:10E49000000000000000000000000000000000007C +:10E4A000000000000000000000000000000000006C +:10E4B000000000000000000000000000000000005C +:10E4C0000000000001010101010000000100000244 +:10E4D0000202020202020202020102020102000022 +:10E4E000000000000000000000000000000000002C +:10E4F000000000000000000000000000000000001C +:10E50000000000000000000000000000000000000B +:10E5100000000000000000000000000000000000FB +:10E5200000010000010000000001000001000100E6 +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000000CB +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000000000000AB +:10E57000010101010001010000010101010101008F +:10E58000000000000000000000000000000000008B +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C0000000000001010101010000000100010242 +:10E5D0000202020202020202020102020102000021 +:10E5E000000000000000000000000000000000002B +:10E5F000000000000000000000000000000000001B +:10E60000000000000000000000000000000000000A +:10E6100000000000000000000000000000000000FA +:10E6200000010000010000000001000001000100E5 +:10E6300000000000000000000000000000000000DA +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E6600000000000000000000000000000000000AA +:10E67000010201010101010101010101010101008A +:10E68000000000000000000000000000000000008A +:10E69000000000000000000000000000000000007A +:10E6A000000000000000000000000000000000006A +:10E6B000000000000000000000000000000000005A +:10E6C0000000010000000000010100010101010241 +:10E6D000020202020202020202010202020200001F +:10E6E000000000000000000000000000000000002A +:10E6F000000000000000000000000000000000001A +:10E700000000000000000000000000000000000009 +:10E7100000000000000000000000000000000000F9 +:10E7200001010000010000000001000001000100E3 +:10E7300000000000000000000000000000000000D9 +:10E7400000000000000000000000000000000000C9 +:10E7500000000000000000000000000000000000B9 +:10E7600000000000000000000000000000000001A8 +:10E770000202010101010101010201010101010087 +:10E780000000000000000000000000000000000089 +:10E790000000000000000000000000000000000079 +:10E7A0000000000000000000000000000000000069 +:10E7B0000000000000000000000000000000000059 +:10E7C0000000000000000000010101010101010240 +:10E7D000020202020202020202020202020200001D +:10E7E0000000000000000000000000000000000029 +:10E7F0000000000000000000000000000000000019 +:10E800000000000000000000000000000000000008 +:10E8100000000000000000000000000000000000F8 +:10E8200001010000010000000001000101010100E0 +:10E8300000000000000000000000000000000000D8 +:10E8400000000000000000000000000000000000C8 +:10E8500000000000000000000000000000000000B8 +:10E8600000000000000000000000000000000001A7 +:10E870000202020201010101010201010201020082 +:10E880000000000000000000000000000000000088 +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000000000000000000000000000058 +:10E8C0000000000000000000000101010101010240 +:10E8D000020202020202020202020202020200001C +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000000000000000000000000000018 +:10E900000000000000000000000000000000000007 +:10E9100000000000000000000000000000000000F7 +:10E9200001010001020000000001000101010100DD +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000002A5 +:10E97000020202020102020101020202020202007C +:10E980000000000000000000000000000000000087 +:10E990000000000000000000000000000000000077 +:10E9A0000000000000000000000000000000000067 +:10E9B0000000000000000000000000000000000057 +:10E9C000000100010000000000010101010101023D +:10E9D000020202020202020202020202020200001B +:10E9E0000000000000000000000000000000000027 +:10E9F0000000000000000000000000000000000017 +:10EA00000000000000000000000000000000000006 +:10EA100000000000000000000000000000000000F6 +:10EA200001020001020101000001000101010100D9 +:10EA300000000000000000000000000000000000D6 +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000002A4 +:10EA70000202020202020202010202020202020079 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC000000100010000000000010101010101023C +:10EAD000020202020202020202020202020200001A +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000000000000000000F5 +:10EB200002020101020202000001010102010100D2 +:10EB300000000000000000000000000000000000D5 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000002A3 +:10EB70000202020202020202020202020202020077 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC000010100010000000000010101010101023A +:10EBD000020202020201010202020202020200001B +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000000000000000000000F4 +:10EC200002020101020202000002010102010100D0 +:10EC300000000000000000000000000000000000D4 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000002A2 +:10EC70000202020202020202020202020202020076 +:10EC80000000000000000000000000000000000084 +:10EC90000000000000000000000000000000000074 +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC000010100010000000000010101000101023A +:10ECD000020202020201010202020202020200001A +:10ECE0000000000000000000000000000000000024 +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000002F1 +:10ED200002020202020202000002010102010200CC +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000000000000000000000000B3 +:10ED600000000000000000000000000000000002A1 +:10ED70000202020202020202020202020202020075 +:10ED80000000000000000000000000000000000083 +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000142 +:10EDD000010202020201010102020202020200001B +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000000000000000000000000000002 +:10EE100000000000000000000000000000000002F0 +:10EE200002020202020202010002010202020200C8 +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000002A0 +:10EE70000202020202020202020202020202020074 +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000141 +:10EED000010101010101010101020202020200001F +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000002EF +:10EF200002020202020202020002020202020200C5 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF6000000000000000000000000000000000029F +:10EF70000202020202020202020202020202020073 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC000000000000000000000000000020000013E +:10EFD0000101010101010101010201010201010020 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000000000000000000000000000000002EE +:10F0200002020202020202020102020202020200C3 +:10F0300000000000000000000000000000000000D0 +:10F0400000000000000000000000000000000000C0 +:10F0500000000000000000000000000000000000B0 +:10F06000000000000000000000000000000000029E +:10F070000202020202020202020202020202020072 +:10F080000000000000000000000000000000000080 +:10F090000000000000000000000000000000000070 +:10F0A0000000000000000000000000000000000060 +:10F0B000000000000000000000000000000000024E +:10F0C0000202000202020202020202020202020123 +:10F0D0000101010101010101010101010101010021 +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F1100000000000000000000000000000000002ED +:10F1200002020202010101020202020202020200C4 +:10F1300000000000000000000000000000000000CF +:10F1400000000000000000000000000000000000BF +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000000000029D +:10F170000202020202020202020202020202020071 +:10F18000000000000000000000000000000000007F +:10F19000000000000000000000000000000000006F +:10F1A000000000000000000000000000000000005F +:10F1B000000000000000000000000000000000024D +:10F1C0000202020202020202020202020202020120 +:10F1D0000101010101010101010101010101010020 +:10F1E000000000000000000000000000000000001F +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE +:10F2100000000000000000000000000000000002EC +:10F2200002020202020202020202020202020200C0 +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000000000000000BE +:10F2500000000000000000000000000000000000AE +:10F26000000000000000000000000000000000029C +:10F270000202020202020202020202020202020070 +:10F28000000000000000000000000000000000007E +:10F29000000000000000000000000000000000006E +:10F2A000000000000000000000000000000000005E +:10F2B000000000000000000000000000000000024C +:10F2C000020202020202020202020202020202011F +:10F2D000010101010101010101010101010101001F +:10F2E000000000000000000000000000000000001E +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000000000FD +:10F3100000000000000000000000000000000001EC +:10F3200001010101010101010101010101010100CE +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F36000000000000000000000000000000000029B +:10F37000020202020202020202020202020202006F +:10F38000000000000000000000000000000000007D +:10F39000000000000000000000000000000000006D +:10F3A000000000000000000000000000000000005D +:10F3B000000000000000000000000000000000024B +:10F3C000020202020202020202020202020202011E +:10F3D000010101010101010101010101010101001E +:10F3E000000000000000000000000000000000001D +:10F3F000000000000000000000000000000000000D +:10F4000000000000000000000000000000000000FC +:10F4100000000000000000000000000000000001EB +:10F4200001010101010101010101010101010100CD +:10F4300000000000000000000000000000000000CC +:10F4400000000000000000000000000000000000BC +:10F4500000000000000000000000000000000000AC +:10F46000000000000000000000000000000000019B +:10F47000010101010101010101010101010101007D +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B000000000000000000000000000000000024A +:10F4C000020202020202020202020202020202011D +:10F4D000010101010101010101010101010101001D +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000001EA +:10F5200001010101010101010101010101010100CC +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000019A +:10F57000010101010101010101010101010101007C +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B0000000000000000000000000000000000249 +:10F5C000020202020202020202020202020202011C +:10F5D000010101010101010101010101010101001C +:10F5E000000000000000000000000000000000001B +:10F5F000000000000000000000000000000000000B +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000001E9 +:10F6200001010101010101010101010101010100CB +:10F6300000000000000000000000000000000000CA +:10F6400000000000000000000000000000000000BA +:10F6500000000000000000000000000000000000AA +:10F660000000000000000000000000000000000199 +:10F67000010101010101010101010101010101007B +:10F68000000000000000000000000000000000007A +:10F69000000000000000000000000000000000006A +:10F6A000000000000000000000000000000000005A +:10F6B0000000000000000000000000000000000248 +:10F6C000020202020202020202020202020202011B +:10F6D000010101010101010101010101010101001B +:10F6E000000000000000000000000000000000001A +:10F6F000000000000000000000000000000000000A +:10F7000000000000000000000000000000000000F9 +:10F7100000000000000000000000000000000002E7 +:10F7200002020202020202020202020202020200BB +:10F7300000000000000000000000000000000000C9 +:10F7400000000000000000000000000000000000B9 +:10F7500000000000000000000000000000000000A9 +:10F760000000000000000000000000000000000297 +:10F77000020202020202020202020202020202006B +:10F780000000000000000000000000000000000079 +:10F790000000000000000000000000000000000069 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000247 +:10F7C000020202020202020202020202020202001B +:10F7D0000000000000000000000000000000000029 +:10F7E0000000000000000000000000000000000019 +:10F7F0000000000000000000000000000000000009 +:10F8000000000000000000000000000000000000F8 +:10F8100000000000000000000000000000000000E8 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 +:10F8400000000000000000000000000000000000B8 +:10F8500000000000000000000000000000000000A8 +:10F860000000000000000000000000000000000098 +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000000000000000078 +:10F890000000000000000000000000000000000068 +:10F8A0000000000000000000000000000000000058 +:10F8B0000000000000000000000000000000000048 +:10F8C0000000000000000000000000000000001E1A +:10F8D0000000000000000000000000000000000028 +:10F8E0000000000000000000000000000000000018 +:10F8F0000000000000000000000000000000000008 +:10F9000000000000000000000000000000000000F7 +:10F9100000000000000000000000000000000000E7 +:10F9200000000000000000000000000000000200D5 +:10F9300000000000000000000000000000000000C7 +:10F9400000000000000000000000000000000000B7 +:10F9500000000000000000000000000000000000A7 +:10F960000000000000000000000000000000000097 +:10F970000000000000000000000000000000000087 +:10F980000000000000000000000000000000000077 +:10F990000000000000000000000000000000000067 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000000010000000036 +:10F9D0000000000000000000000001000001000025 +:10F9E0000100010000010000000000000000000014 +:10F9F0000000000000000000000000000000000007 +:10FA000000000000000000000000000000000000F6 +:10FA100000000000000000000000000000000000E6 +:10FA200000000000000000000000000000000200D4 +:10FA300000000000000000000000000000000000C6 +:10FA400000000000000000000000000000000000B6 +:10FA500000000000000000000000000000000000A6 +:10FA60000000000000000000000000000000000096 +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000000000000000076 +:10FA90000000000000000000000000000000000066 +:10FAA0000000000000000000000000000000000056 +:10FAB0000000000000000000000000000000000046 +:10FAC0000000000000000000000000010000000035 +:10FAD000000000000001000000010101010100011F +:10FAE0000101010000010000000000000000000012 +:10FAF0000000000000000000000000000000000006 +:10FB000000000000000000000000000000000000F5 +:10FB100000000000000000000000000000000000E5 +:10FB200000000000000000000000000000000200D3 +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000000000000000B5 +:10FB500000000000000000000000000000000000A5 +:10FB60000000000000000000000000000000000095 +:10FB70000000000000000000000000000000000085 +:10FB80000000000000000000000000000000000075 +:10FB90000000000000000000000000000000000065 +:10FBA0000000000000000000000000000000000055 +:10FBB0000000000000000000000000000000000045 +:10FBC0000000000000000000000000010000020032 +:10FBD0000000000001010002010201010101010118 +:10FBE0000101010100010000000000000000000010 +:10FBF0000000000000000000000000000000000005 +:10FC000000000000000000000000000000000000F4 +:10FC100000000000000000000000000000000000E4 +:10FC200000000000000000000000000000000200D2 +:10FC300000000000000100000000000000000000C3 +:10FC400000000000000000000000000000000000B4 +:10FC500000000000000000000000000000000000A4 +:10FC60000000000000000000000000000000000094 +:10FC70000000000000000000000000000000000084 +:10FC80000000000000000000000000000000000074 +:10FC90000000000000000000000000000000000064 +:10FCA0000000000000000000000000000000000054 +:10FCB0000000000000000000000000000000000044 +:10FCC0000000000000000000000000010000020031 +:10FCD0000000000101010002010202010102020113 +:10FCE000020101010101000000000000000000000D +:10FCF0000000000000000000000000000000000004 +:10FD000000000000000000000000000000000000F3 +:10FD100000000000000000000000000000000000E3 +:10FD200000000000000000000000000000000200D1 +:10FD300000000000000100000000000000000000C2 +:10FD400000000000000000000000000000000000B3 +:10FD500000000000000000000000000000000000A3 +:10FD60000000000000000000000000000000000093 +:10FD70000000000000000000000000000000000083 +:10FD80000000000000000000000000000000000073 +:10FD90000000000000000000000000000000000063 +:10FDA0000000000000000000000000000000000053 +:10FDB0000000000000000000000000000000000043 +:10FDC0000000000000000000000000010000010031 +:10FDD000000000010101000202020202010202020F +:10FDE000020102010101000000000000000000000B +:10FDF0000000000000000000000000000000000003 +:10FE000000000000000000000000000000000000F2 +:10FE100000000000000000000000000000000000E2 +:10FE200000000000000000000000000000000200D0 +:10FE300000000000000101000000000000000000C0 +:10FE400000000000000000000000000000000000B2 +:10FE500000000000000000000000000000000000A2 +:10FE60000000000000000000000000000000000092 +:10FE70000000000000000000000000000000000082 +:10FE80000000000000010000000000000000000071 +:10FE90000000000000000000000000000000000062 +:10FEA0000000000000000000000000000000000052 +:10FEB0000000000000000000000000000000000042 +:10FEC0000000000000000000000000010000010030 +:10FED000000000010101000202020202020202020D +:10FEE000020102010101000000000000000000000A +:10FEF0000000000000000000000000000000000002 +:10FF000000000000000000000000000000000000F1 +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000000000000000000000100D0 +:10FF300000000000010101000000000000000000BE +:10FF400000000000000000000000000000000000B1 +:10FF500000000000000000000000000000000000A1 +:10FF60000000000000000000000000000000000091 +:10FF70000000000000000000000000000000000081 +:10FF80000000000000010000000000000000000070 +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 +:10FFB0000000000000000000000000000000000041 +:10FFC000000000000000000000000001000001002F +:10FFD000000000010101000202020202020202020C +:10FFE0000201020101010000000000000000000009 +:10FFF0000000000000000000000000000000000001 +:02000002B0004C +:1000000000000000000000000000000000000000F0 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000010000000000000100CE +:1000300000000000010101000000000000000000BD +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:10008000000000000001010000000000000000006E +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C000000000000000000001000001000001002D +:1000D000000000010101010202020202020202020A +:1000E0000201020101010000000000000000000008 +:1000F0000000000000000000000000000000000000 +:1001000000000000000000000000000000000000EF +:1001100000000000000000000000000000000000DF +:1001200000000000000000010000000100000100CC +:1001300000000000010101000000000000000000BC +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000002007D +:10018000000000000101010000000000000000006C +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000001000000000001002D +:1001D0000101000101010102020202020202020207 +:1001E0000202020201010000000000000000000005 +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:1002200000000000000000020000010100000100C9 +:1002300000000000010101000000000000000000BB +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000002007C +:100280000000020001010100000000000000000069 +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000001000000000000012C +:1002D0000101000101010102020202020202020206 +:1002E0000202020201010000000000000000000004 +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000020001010101020100C4 +:1003300002000000010101000000000000000000B8 +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000002007B +:100380000000020001010100000000000000000068 +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000000000000000003D +:1003C000000000000000000001000000000000002C +:1003D0000101000101010102020202020202020205 +:1003E0000202020201020000000000000000000002 +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000020102020201020100BF +:1004300002000000010101000000000000000000B7 +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000002007A +:100480000000010101010100000000000000000067 +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000001000000000000002B +:1004D0000001010101010102020202020202020204 +:1004E0000202020202020000000000000000000000 +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000020102020202010100BE +:1005300002000000010201000000000000000000B5 +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:100570000000000000000000000000000002020077 +:100580000200010101010100000000000000000064 +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000000000000000003B +:1005C0000000000000000000010000000001000029 +:1005D0000001010101010102020202020202020203 +:1005E00002020202020200000000000000000000FF +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000000EA +:1006100000000000000000000000000000000000DA +:1006200000000000000000020202020202010200BB +:1006300001000201020202000000000000000000B0 +:1006400000000000000000000000000000000000AA +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:100670000000000000000000010000000002010076 +:100680000200010101010100000000000000000063 +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C0000000000000000000010000000001000028 +:1006D0000001010101010102020202020202020202 +:1006E00002020202020200000000000000000000FE +:1006F00000000000000000000000000000000000FA +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000020202020202020200B9 +:1007300001000201020202000000000000000000AF +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000010000010201010073 +:100780000101010101010100000000000000000062 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000010000000001000027 +:1007D0000001010101010102020102020202020202 +:1007E00002020202020200000000000000000000FD +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:1008200000000000000000020202020202020200B8 +:1008300001000101020202000000000000000000AF +:1008400000000000000000000000000000000000A8 +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000001010200010101010070 +:100880000101010101020100000000000000000060 +:100890000000000000000000000000000000000058 +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000020000000001000025 +:1008D0000000010202020101020102020201010202 +:1008E00001020202020200000000000000000000FD +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:1009100000000000000000000000000000000000D7 +:1009200000000000000000020202020202020202B5 +:1009300002000102020202000000000000000000AC +:1009400000000000000000000000000000000000A7 +:100950000000000000000000000000000000000097 +:100960000000000000000000000000000000000087 +:10097000000000000000000202010001010101006E +:10098000010101010202020000000000000000005D +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000020000020000000023 +:1009D0000000000202020101010101010201010106 +:1009E00001020102020200000000000000000000FD +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000020202020202020202B4 +:100A300002000202020202000000000000000000AA +:100A400000000000000000000000000000000000A6 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A7000000000000000000202020102010101006A +:100A8000010102020202020000000000000000005A +:100A90000000000000000000000000000000000056 +:100AA0000000000000000000000000000000000046 +:100AB0000000000000000000000000000000000036 +:100AC0000000000000000000020001020000000021 +:100AD0000000000202020101010101010101010106 +:100AE00001020102020200000000000000000000FC +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000010201010101010202B9 +:100B300002020202020202000000000000000000A7 +:100B400000000000000000000000000000000000A5 +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000002020202020202020164 +:100B80000202020202020200000000000000000057 +:100B90000000000000000000000000000000000055 +:100BA0000000000000000000000000000000000045 +:100BB0000000000000000000000000000000000035 +:100BC0000000000000000000020001020000000020 +:100BD0000000000202020201010101010101010104 +:100BE00001020101020200000000000000000000FC +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000020202020202020202B2 +:100C300002020202020202000000000000000000A6 +:100C400000000000000000000000000000000000A4 +:100C50000000000000000000000000000000000094 +:100C60000000000000000000000000000000000084 +:100C70000000000000000002020202020202020262 +:100C80000202020202020200000000000000000056 +:100C90000000000000000000000000000000000054 +:100CA0000000000000000000000000000000000044 +:100CB0000000000000000000000000000000000034 +:100CC000000000000000000002000102010002001C +:100CD0000002000202020201010101010101010101 +:100CE00001010101020200000000000000000000FC +:100CF00000000000000000000000000000000000F4 +:100D000000000000000000000000000000000000E3 +:100D100000000000000000000000000000000000D3 +:100D200000000000000000000000000000000000C3 +:100D300000000000000000000000000000000000B3 +:100D400000000000000000000000000000000000A3 +:100D50000000000000000000000000000000000093 +:100D60000000000000000000000000000000000083 +:100D70000000000000000002020202020202020261 +:100D80000202020202020200000000000000000055 +:100D90000000000000000000000000000000000053 +:100DA0000000000000000000000000000000000043 +:100DB0000000000000000000000000000000000033 +:100DC0000000000000000000020102020102020017 +:100DD00000020202020202010100010101010101FF +:100DE00001010101010101000000000000000000FC +:100DF00000000000000000000000000000000000F3 +:100E000000000000000000000000000000000000E2 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E300000000000000000000000000000000000B2 +:100E400000000000000000000000000000000000A2 +:100E50000000000000000000000000000000000092 +:100E60000000000000000000000000000000000082 +:100E70000000000000000002020202020202020260 +:100E80000202020202020200000000000000000054 +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000000000000042 +:100EB0000000000000000000000000000000000032 +:100EC0000000000000000002020202020002020014 +:100ED00002020202020202010100010101000001FE +:100EE00000010101010101000000000000000000FC +:100EF00000000000000000000000000000000000F2 +:100F000000000000000000000000000000000000E1 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F300000000000000000000000000000000000B1 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000000000000000000000091 +:100F60000000000000000000000000000000000081 +:100F70000000000000000002020102020202020260 +:100F80000202020202020200000000000000000053 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000000041 +:100FB0000000000000000000000000000000000031 +:100FC0000000000000000002020202020202020011 +:100FD00002020202020202010101010101010101FA +:100FE00001010101010101000000000000000000FA +:100FF00000000000000000000000000000000000F1 +:1010000000000000000000000000000000000000E0 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000010101010101010101B7 +:1010300001010101010101000000000000000000A9 +:1010400000000000000000000000000000000000A0 +:101050000000000000000000000000000000000090 +:101060000000000000000000000000000000000080 +:101070000000000000000001010101010101010167 +:101080000101010101010100000000000000000059 +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C000000000000000000202020202020202020E +:1010D00002020202020202010101010101010101F9 +:1010E00001010101010101000000000000000000F9 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000000000000000000000DF +:1011100000000000000000000000000000000000CF +:1011200000000000000000010101010101010101B6 +:1011300001010101010101000000000000000000A8 +:10114000000000000000000000000000000000009F +:10115000000000000000000000000000000000008F +:10116000000000000000000000000000000000007F +:10117000000000000000000202020202020202025D +:101180000202020202020200000000000000000051 +:10119000000000000000000000000000000000004F +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C000000000000000000202020202020202020D +:1011D00002020202020202010101010101010101F8 +:1011E00001010101010101000000000000000000F8 +:1011F00000000000000000000000000000000000EF +:1012000000000000000000000000000000000000DE +:1012100000000000000000000000000000000000CE +:1012200000000000000000010101010101010101B5 +:1012300001010101010101000000000000000000A7 +:10124000000000000000000000000000000000009E +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000000000007E +:10127000000000000000000000020000000000006C +:10128000000000000000000000000000000000005E +:10129000000000000000000000000000000000004E +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C000000000000000000202020202020202020C +:1012D00002020202020202010101010101010101F7 +:1012E00001010101010101000000000000000000F7 +:1012F00000000000000000000000000000000000EE +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD +:1013200000000000000000010101010101010101B4 +:1013300001010101010101000000000000000000A6 +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000000000000000000000000000007D +:101370000000000000000001010101010101010164 +:101380000101010101010100000000000000000056 +:10139000000000000000000000000000000000004D +:1013A000000000000000000000000000000000003D +:1013B000000000000000000000000000000000002D +:1013C000000000000000000202020202020202020B +:1013D00002020202020202010101010101010101F6 +:1013E00001010101010101000000000000000000F6 +:1013F00000000000000000000000000000000000ED +:1014000000000000000000000000000000000000DC +:1014100000000000000000000000000000000000CC +:1014200000000000000000010101010101010101B3 +:1014300001010101010101000000000000000000A5 +:10144000000000000000000000000000000000009C +:10145000000000000000000000000000000000008C +:10146000000000000000000000000000000000007C +:101470000000000000000001010101010101010163 +:101480000101010101010100000000000000000055 +:10149000000000000000000000000000000000004C +:1014A000000000000000000000000000000000003C +:1014B000000000000000000000000000000000002C +:1014C000000000000000000202020202020202020A +:1014D00002020202020202010101010101010101F5 +:1014E00001010101010101000000000000000000F5 +:1014F00000000000000000000000000000000000EC +:1015000000000000000000000000000000000000DB +:1015100000000000000000000000000000000000CB +:1015200000000000000000020202020202020202A9 +:10153000020202020202020000000000000000009D +:10154000000000000000000000000000000000009B +:10155000000000000000000000000000000000008B +:10156000000000000000000000000000000000007B +:101570000000000000000002020202020202020259 +:10158000020202020202020000000000000000004D +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B000000000000000000000000000000000002B +:1015C0000000000000000002020202020202020209 +:1015D00002020202020202000000000000000000FD +:1015E00000000000000000000000000000000000FB +:1015F00000000000000000000000000000000000EB +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:1016300000000000000000000000000000000000AA +:10164000000000000000000000000000000000009A +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:10167000000000000000000000000000000000006A +:10168000000000000000000000000000000000005A +:10169000000000000000000000000000000000004A +:1016A000000000000000000000000000000000003A +:1016B000000000000000000000000000000000002A +:1016C000000000000000000000000000000000001A +:1016D000000000000000001E0000000000000002EA +:1016E00000000000000000010001000001000000F7 +:1016F00000000000000000000000000000000000EA +:1017000000000000000000000000000000000000D9 +:1017100000000000000000000000000000000000C9 +:1017200000000000000000000000000000000000B9 +:1017300000000000000000000000000000000000A9 +:101740000000000000000000000000000000000099 +:101750000000000000000000000000000000000089 +:101760000000000000000000000000000000000079 +:101770000000000000000000000000000000000069 +:101780000000000000000000000000000000000059 +:101790000000000000000000000000000000000049 +:1017A0000000000000000000000000000000000039 +:1017B0000000000000000000000000000000000029 +:1017C0000000000000000000000000000000000019 +:1017D0000101000100000000000000000000000204 +:1017E00000000000010101010001010101010000F0 +:1017F00000000000000000000000000000000000E9 +:1018000000000000000000000000000000000000D8 +:1018100000000000000000000000000000000000C8 +:1018200000000000000000000000000000000000B8 +:1018300000000000000000000000000000000000A8 +:101840000000000000000000000000000000000098 +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880000000000000000000000000000000000058 +:101890000000000000000000000000000000000048 +:1018A0000000000000000000000000000000000038 +:1018B0000000000000000000000000000000000028 +:1018C0000000000000000000000000000000000018 +:1018D0000101010101000000000000000000000201 +:1018E00000010001010101010101010101010000EC +:1018F00000000000000000000000000000000000E8 +:1019000000000000000000000000000000000000D7 +:1019100000000000000000000000000000000000C7 +:1019200000000000000000000000000000000000B7 +:1019300000000000000000000000000000000000A7 +:101940000000000000000000000000000000000097 +:101950000000000000000000000000000000000087 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:101980000000000000000000000000000000000057 +:101990000000000000000000000000000000000047 +:1019A0000000000000000000000000000000000037 +:1019B0000000000000000000000000000000000027 +:1019C0000000000000000000000000000000000017 +:1019D00001010101010000000000010000000002FF +:1019E00001010101020101010101010101010000E8 +:1019F00000000000000000000000000000000000E7 +:101A000000000000000000000000000000000000D6 +:101A100000000000000000000000000000000000C6 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A40000000000000000000000000000000000096 +:101A50000000000000000000000000000000000086 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000002000000000000000000010053 +:101A90000000000000000000000000000000000046 +:101AA0000000000000000000000000000000000036 +:101AB0000000000000000000000000000000000026 +:101AC0000000000000000000000000000000000016 +:101AD00001010101010000010001010000000002FC +:101AE00002010101020101010101020201010000E4 +:101AF00000000000000000000000000000000000E6 +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000000000000000000C5 +:101B200000000000000000000000000000000000B5 +:101B300000000000000000000000000000000000A5 +:101B40000000000000000000000000000000000095 +:101B50000000000000000000000000000000000085 +:101B60000000000000000000000000000000000075 +:101B70000000000000000000000000000000000065 +:101B80000000000002000000010000000000010051 +:101B90000000000000000000000000000000000045 +:101BA0000000000000000000000000000000000035 +:101BB0000000000000000000000000000000000025 +:101BC0000000000000000000000000000000000015 +:101BD00000010101010100010001010000000002FB +:101BE00002020202020201020102020202010000DC +:101BF00000000000000000000000000000000000E5 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000000000000000000000B4 +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000000000000000094 +:101C50000000000000000000000000000000000084 +:101C60000000000000000000000000000000000074 +:101C70000000000000000000000000000000000064 +:101C80000000000002000000010000000000010050 +:101C90000000000000000000000000000000000044 +:101CA0000000000000000000000000000000000034 +:101CB0000000000000000000000000000000000024 +:101CC0000000000000000000000000000000000014 +:101CD00000000000000100010001010000000102FD +:101CE00002020202020201020102020202010000DB +:101CF00000000000000000000000000000000000E4 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D200000000000000000000000000000000000B3 +:101D300000000000000000000000000000000000A3 +:101D40000000000000000000000000000000000093 +:101D50000000000000000000000000000000000083 +:101D60000000000000000000000000000000000073 +:101D70000000000000000000000000000000000063 +:101D8000000000000200000001000000000001004F +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB0000000000000000000000000000000000023 +:101DC0000000000000000000000000000000000013 +:101DD00000000000000100010001010001000102FB +:101DE00002020202020202020102020202020000D8 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000000000000000000100A1 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E60000000000000000000000000000000000072 +:101E70000000000000000000000000000000000062 +:101E8000000000000100010001000000000101004D +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000000000000000000032 +:101EB0000000000000000000000000000000000022 +:101EC0000000000000000000000000000000000012 +:101ED00000000000000100010101010101000102F8 +:101EE00002020202020202020102020202020000D7 +:101EF00000000000000000000000000000000000E2 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F3000000000000000000001000000000001009F +:101F40000000000000000000000000000000000091 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F8000000000000100010001000000000101004C +:101F90000000000000000000000000000000000041 +:101FA0000000000000000000000000000000000031 +:101FB0000000000000000000000000000000000021 +:101FC0000000000000000000000000000000000011 +:101FD00000000000000101010101010101010102F5 +:101FE00002020202020202020202020202020000D5 +:101FF00000000000000000000000000000000000E1 +:1020000000000000000000000000000000000000D0 +:1020100000000000000000000000000000000000C0 +:1020200000000000000000000000000000000000B0 +:10203000000000000000010001000000000101009C +:102040000000000000000000000000000000000090 +:102050000000000000000000000000000000000080 +:102060000000000000000000000000000000000070 +:102070000000000000000000000000000000000060 +:10208000000000000100010001000000000101004B +:102090000000000000000000000000000000000040 +:1020A0000000000000000000000000000000000030 +:1020B0000000000000000000000000000000000020 +:1020C0000000000000000000000000000000000010 +:1020D00000000000000101010101000101010102F5 +:1020E00002020202020202020202020202020000D4 +:1020F00000000000000000000000000000000000E0 +:1021000000000000000000000000000000000000CF +:1021100000000000000000000000000000000000BF +:1021200000000000000000000000000000000000AF +:10213000000000000000010001000000000101009B +:10214000000000000000000000000000000000008F +:10215000000000000000000000000000000000007F +:10216000000000000000000000000000000000006F +:10217000000000000000000000000000000000005F +:102180000001000001000101010000000001010048 +:10219000000000000000000000000000000000003F +:1021A000000000000000000000000000000000002F +:1021B000000000000000000000000000000000001F +:1021C000000000000000000000000000000000000F +:1021D00000000000000101010101000101010102F4 +:1021E00002020202020202020202020202020000D3 +:1021F00000000000000000000000000000000000DF +:1022000000000000000000000000000000000000CE +:1022100000000000000000000000000000000000BE +:1022200000000000000000000000000000000000AE +:10223000000000000000010001000000000101009A +:10224000000000000000000000000000000000008E +:10225000000000000000000000000000000000007E +:10226000000000000000000000000000000000006E +:10227000000000000000000000000000000000015D +:102280000001000001000101010000000101010046 +:10229000000000000000000000000000000000003E +:1022A000000000000000000000000000000000002E +:1022B000000000000000000000000000000000001E +:1022C000000000000000000000000000000000000E +:1022D00000000000000001000100000101010102F6 +:1022E00002020202020202020202020202020000D2 +:1022F00000000000000000000000000000000000DE +:1023000000000000000000000000000000000000CD +:1023100000000000000000000000000000000000BD +:1023200000000000000000000000000000000000AD +:102330000000000000000100010100000101010097 +:10234000000000000000000000000000000000008D +:10235000000000000000000000000000000000007D +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000000000015C +:102380000101000101000101010100000101010042 +:10239000000000000000000000000000000000003D +:1023A000000000000000000000000000000000002D +:1023B000000000000000000000000000000000001D +:1023C000000000000000000000000000000000000D +:1023D00000000000000001000100000001010101F7 +:1023E00002020202020202020202020202020000D1 +:1023F00000000000000000000000000000000000DD +:1024000000000000000000000000000000000000CC +:1024100000000000000000000000000000000000BC +:1024200000000000000000000000000000000001AB +:102430000000000000000100010100000101010096 +:10244000000000000000000000000000000000008C +:10245000000000000000000000000000000000007C +:10246000000000000000000000000000000000006C +:10247000000000000000000000000000000000025A +:10248000010101010101010102010000010102003D +:10249000000000000000000000000000000000003C +:1024A000000000000000000000000000000000002C +:1024B000000000000000000000000000000000001C +:1024C000000000000000000000000000000000000C +:1024D00000000000000001000100000001010101F6 +:1024E00002020202020202020202020202020000D0 +:1024F00000000000000000000000000000000000DC +:1025000000000000000000000000000000000000CB +:1025100000000000000000000000000000000000BB +:1025200000000000000000000000000000000002A9 +:102530000001000001000101010100000101010092 +:10254000000000000000000000000000000000008B +:10255000000000000000000000000000000000007B +:10256000000000000000000000000000000000006B +:102570000000000000000000000000000000000259 +:102580000202010102010201020101000102020036 +:10259000000000000000000000000000000000003B +:1025A000000000000000000000000000000000002B +:1025B000000000000000000000000000000000001B +:1025C000000000000000000000000000000000000B +:1025D00000000000000001000100000000010101F6 +:1025E00002020202010202020202010102020000D2 +:1025F00000000000000000000000000000000000DB +:1026000000000000000000000000000000000000CA +:1026100000000000000000000000000000000000BA +:1026200000000000000000000000000000000002A8 +:102630000001000001010101010100000101010090 +:10264000000000000000000000000000000000008A +:10265000000000000000000000000000000000007A +:10266000000000000000000000000000000000006A +:102670000000000000000000000000000000000258 +:102680000202020202010202020101000102020032 +:10269000000000000000000000000000000000003A +:1026A000000000000000000000000000000000002A +:1026B000000000000000000000000000000000001A +:1026C000000000000000000000000000000000000A +:1026D00000000000000001000100000000010101F5 +:1026E00001020202010202020202010102020000D2 +:1026F00000000000000000000000000000000000DA +:1027000000000000000000000000000000000000C9 +:1027100000000000000000000000000000000000B9 +:1027200000000000000000000000000000000002A7 +:10273000000100010201010101010000010101008D +:102740000000000000000000000000000000000089 +:102750000000000000000000000000000000000079 +:102760000000000000000000000000000000000069 +:102770000000000000000000000000000000000257 +:10278000020202020202020202020101020202002D +:102790000000000000000000000000000000000039 +:1027A0000000000000000000000000000000000029 +:1027B0000000000000000000000000000000000019 +:1027C0000000000000000000000000000000000009 +:1027D00000000000000001000100000000010201F3 +:1027E00001010101010102010201010101020000D8 +:1027F00000000000000000000000000000000000D9 +:1028000000000000000000000000000000000000C8 +:1028100000000000000000000000000000000000B8 +:1028200000000000000000000000000000000002A6 +:102830000001000102010201020101000102020087 +:102840000000000000000000000000000000000088 +:102850000000000000000000000000000000000078 +:102860000000000000000000000000000000000068 +:102870000000000000000000000000000000000256 +:10288000020202020202020202020201020202002B +:102890000000000000000000000000000000000038 +:1028A0000000000000000000000000000000000028 +:1028B0000000000000000000000000000000000018 +:1028C0000000000000000000000000000000000008 +:1028D00000000000000202020202020002020201E5 +:1028E00001010101010101010201010101010000D9 +:1028F00000000000000000000000000000000000D8 +:1029000000000000000000000000000000000000C7 +:1029100000000000000000000000000000000000B7 +:1029200000000000000000000000000000000002A5 +:102930000102000102010201020201000202020082 +:102940000000000000000000000000000000000087 +:102950000000000000000000000000000000000077 +:102960000000000000000000000000000000000067 +:102970000000000000000000000000000000000255 +:102980000202020202020202020202020202020029 +:102990000000000000000000000000000000000037 +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000000000000017 +:1029C0000000000000000000000000000000000007 +:1029D00002000000000202020202020002020201E2 +:1029E00001010101010101010101010101010000D9 +:1029F00000000000000000000000000000000000D7 +:102A000000000000000000000000000000000000C6 +:102A100000000000000000000000000000000000B6 +:102A200000000000000000000000000000000002A4 +:102A3000020201020202020202020100020202007C +:102A40000000000000000000000000000000000086 +:102A50000000000000000000000000000000000076 +:102A60000000000000000000000000000000000066 +:102A70000000000000000000000000000000000254 +:102A80000202020202020202020202020202020028 +:102A90000000000000000000000000000000000036 +:102AA0000000000000000000000000000000000026 +:102AB0000000000000000000000000000000000016 +:102AC0000000000000000000000000000000000006 +:102AD00002020202020202020202020002020201D9 +:102AE00001010101010101010101010101010000D8 +:102AF00000000000000000000000000000000000D6 +:102B000000000000000000000000000000000000C5 +:102B100000000000000000000000000000000000B5 +:102B200000000000000000000000000000000001A4 +:102B30000202020202020202020202000202020079 +:102B40000000000000000000000000000000000085 +:102B50000000000000000000000000000000000075 +:102B60000000000000000000000000000000000065 +:102B70000000000000000000000000000000000253 +:102B80000202020202020202020202020202020027 +:102B90000000000000000000000000000000000035 +:102BA0000000000000000000000000000000000025 +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 +:102BD00002020202020202020202020202020201D6 +:102BE00001010101010101010101010101010100D6 +:102BF00000000000000000000000000000000000D5 +:102C000000000000000000000000000000000000C4 +:102C100000000000000000000000000000000000B4 +:102C200000000000000000000000000000000002A2 +:102C30000202020201020202020202000202020079 +:102C40000000000000000000000000000000000084 +:102C50000000000000000000000000000000000074 +:102C60000000000000000000000000000000000064 +:102C70000000000000000000000000000000000153 +:102C80000101010101010101010102020201010032 +:102C90000000000000000000000000000000000034 +:102CA0000000000000000000000000000000000024 +:102CB0000000000000000000000000000000000014 +:102CC0000000000000000000000000000000000202 +:102CD00002020202020202020202020202020200D6 +:102CE00001010101010101010101010101010100D5 +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D200000000000000000000000000000000000A3 +:102D30000202020202020202020202000202020077 +:102D40000000000000000000000000000000000083 +:102D50000000000000000000000000000000000073 +:102D60000000000000000000000000000000000063 +:102D70000000000000000000000000000000000152 +:102D80000202020201020202020201010102020029 +:102D90000000000000000000000000000000000033 +:102DA0000000000000000000000000000000000023 +:102DB0000000000000000000000000000000000013 +:102DC0000000000000000000000000000000000201 +:102DD00002020202020202020202020202020000D7 +:102DE00001010101000101010101000001010100D7 +:102DF00000000000000000000000000000000000D3 +:102E000000000000000000000000000000000000C2 +:102E100000000000000000000000000000000000B2 +:102E200000000000000000000000000000000000A2 +:102E30000202020200020202020202020202020076 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000000000000000000000000250 +:102E8000000000000200000000000202020000003A +:102E90000000000000000000000000000000000032 +:102EA0000000000000000000000000000000000022 +:102EB0000000000000000000000000000000000012 +:102EC0000000000000000000000000000000000200 +:102ED00002020202020000000000000200000000E6 +:102EE00000010101000101010101000001010100D7 +:102EF00000000000000000000000000000000000D2 +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000000001A0 +:102F30000101010101010101010101010101010082 +:102F40000000000000000000000000000000000081 +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F7000000000000000000000000000000000024F +:102F8000000000000200000000000000000000003F +:102F90000000000000000000000000000000000031 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC00000000000000000000000000000000002FF +:102FD00002020202020202020202020202020201D2 +:102FE00001010101010101010101010101010100D2 +:102FF00000000000000000000000000000000000D1 +:1030000000000000000000000000000000000000C0 +:1030100000000000000000000000000000000000B0 +:10302000000000000000000000000000000000019F +:103030000101010101010101010101010101010081 +:103040000000000000000000000000000000000080 +:103050000000000000000000000000000000000070 +:103060000000000000000000000000000000000060 +:103070000000000000000000000000000000000050 +:103080000000000000000000000000000000000040 +:103090000000000000000000000000000000000030 +:1030A0000000000000000000000000000000000020 +:1030B0000000000000000000000000000000000010 +:1030C00000000000000000000000000000000002FE +:1030D00002020202020202020202020202020201D1 +:1030E00001010101010101010101010101010100D1 +:1030F00000000000000000000000000000000000D0 +:1031000000000000000000000000000000000000BF +:1031100000000000000000000000000000000000AF +:10312000000000000000000000000000000000019E +:103130000101010101010101010101010101010080 +:10314000000000000000000000000000000000007F +:10315000000000000000000000000000000000006F +:10316000000000000000000000000000000000005F +:10317000000000000000000000000000000000014E +:103180000101010101010101010101010101010030 +:10319000000000000000000000000000000000002F +:1031A000000000000000000000000000000000001F +:1031B000000000000000000000000000000000000F +:1031C00000000000000000000000000000000002FD +:1031D00002020202020202020202020202020201D0 +:1031E00001010101010101010101010101010100D0 +:1031F00000000000000000000000000000000000CF +:1032000000000000000000000000000000000000BE +:1032100000000000000000000000000000000000AE +:10322000000000000000000000000000000000019D +:10323000010101010101010101010101010101007F +:10324000000000000000000000000000000000007E +:10325000000000000000000000000000000000006E +:10326000000000000000000000000000000000005E +:10327000000000000000000000000000000000014D +:10328000010101010101010101010101010101002F +:10329000000000000000000000000000000000002E +:1032A000000000000000000000000000000000001E +:1032B000000000000000000000000000000000000E +:1032C00000000000000000000000000000000002FC +:1032D00002020202020202020202020202020201CF +:1032E00001010101010101010101010101010100CF +:1032F00000000000000000000000000000000000CE +:1033000000000000000000000000000000000000BD +:1033100000000000000000000000000000000000AD +:10332000000000000000000000000000000000029B +:10333000020202020202020202020202020202006F +:10334000000000000000000000000000000000007D +:10335000000000000000000000000000000000006D +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000000000024B +:10338000020202020202020202020202020202001F +:10339000000000000000000000000000000000002D +:1033A000000000000000000000000000000000001D +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000000000000000002FB +:1033D00002020202020202020202020202020200CF +:1033E00000000000000000000000000000000000DD +:1033F00000000000000000000000000000000000CD +:1034000000000000000000000000000000000000BC +:1034100000000000000000000000000000000000AC +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000000008C +:10344000000000000000000000000000000000007C +:10345000000000000000000000000000000000006C +:10346000000000000000000000000000000000005C +:10347000000000000000000000000000000000004C +:10348000000000000000000000000000000000003C +:10349000000000000000000000000000000000002C +:1034A000000000000000000000000000000000001C +:1034B000000000000000000000000000000000000C +:1034C00000000000000000000000000000000000FC +:0F34D000000000000000000000000000000000ED +:00000001FF diff --git a/fs/binfmt_aout.c b/fs/binfmt_aout.c index b639dcf7c778..0133b5a30413 100644 --- a/fs/binfmt_aout.c +++ b/fs/binfmt_aout.c @@ -263,6 +263,7 @@ static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs) #else set_personality(PER_LINUX); #endif + setup_new_exec(bprm); current->mm->end_code = ex.a_text + (current->mm->start_code = N_TXTADDR(ex)); diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index b7c1603cd4bd..e9b214a1dfc8 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -501,22 +501,22 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex, } } - /* - * Now fill out the bss section. First pad the last page up - * to the page boundary, and then perform a mmap to make sure - * that there are zero-mapped pages up to and including the - * last bss page. - */ - if (padzero(elf_bss)) { - error = -EFAULT; - goto out_close; - } + if (last_bss > elf_bss) { + /* + * Now fill out the bss section. First pad the last page up + * to the page boundary, and then perform a mmap to make sure + * that there are zero-mapped pages up to and including the + * last bss page. + */ + if (padzero(elf_bss)) { + error = -EFAULT; + goto out_close; + } - /* What we have mapped so far */ - elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1); + /* What we have mapped so far */ + elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1); - /* Map the last of the bss segment */ - if (last_bss > elf_bss) { + /* Map the last of the bss segment */ down_write(¤t->mm->mmap_sem); error = do_brk(elf_bss, last_bss - elf_bss); up_write(¤t->mm->mmap_sem); @@ -662,27 +662,6 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) if (elf_interpreter[elf_ppnt->p_filesz - 1] != '\0') goto out_free_interp; - /* - * The early SET_PERSONALITY here is so that the lookup - * for the interpreter happens in the namespace of the - * to-be-execed image. SET_PERSONALITY can select an - * alternate root. - * - * However, SET_PERSONALITY is NOT allowed to switch - * this task into the new images's memory mapping - * policy - that is, TASK_SIZE must still evaluate to - * that which is appropriate to the execing application. - * This is because exit_mmap() needs to have TASK_SIZE - * evaluate to the size of the old image. - * - * So if (say) a 64-bit application is execing a 32-bit - * application it is the architecture's responsibility - * to defer changing the value of TASK_SIZE until the - * switch really is going to happen - do this in - * flush_thread(). - akpm - */ - SET_PERSONALITY(loc->elf_ex); - interpreter = open_exec(elf_interpreter); retval = PTR_ERR(interpreter); if (IS_ERR(interpreter)) @@ -730,9 +709,6 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) /* Verify the interpreter has a valid arch */ if (!elf_check_arch(&loc->interp_elf_ex)) goto out_free_dentry; - } else { - /* Executables without an interpreter also need a personality */ - SET_PERSONALITY(loc->elf_ex); } /* Flush all traces of the currently running executable */ @@ -752,7 +728,8 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space) current->flags |= PF_RANDOMIZE; - arch_pick_mmap_layout(current->mm); + + setup_new_exec(bprm); /* Do this so that we can load the interpreter, if need be. We will change some of these later */ diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c index 20fbeced472b..9fdbda927875 100644 --- a/fs/binfmt_elf_fdpic.c +++ b/fs/binfmt_elf_fdpic.c @@ -313,6 +313,9 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm, * defunct, deceased, etc. after this point we have to exit via * error_kill */ set_personality(PER_LINUX_FDPIC); + + setup_new_exec(bprm); + set_binfmt(&elf_fdpic_format); current->mm->start_code = 0; diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c index e92f229e3c6e..4510022659c5 100644 --- a/fs/binfmt_flat.c +++ b/fs/binfmt_flat.c @@ -521,6 +521,7 @@ static int load_flat_file(struct linux_binprm * bprm, /* OK, This is the point of no return */ set_personality(PER_LINUX_32BIT); + setup_new_exec(bprm); } /* diff --git a/fs/binfmt_som.c b/fs/binfmt_som.c index eff74b9c9e77..35cf0023ddb8 100644 --- a/fs/binfmt_som.c +++ b/fs/binfmt_som.c @@ -227,6 +227,7 @@ load_som_binary(struct linux_binprm * bprm, struct pt_regs * regs) /* OK, This is the point of no return */ current->flags &= ~PF_FORKNOEXEC; current->personality = PER_HPUX; + setup_new_exec(bprm); /* Set the task size for HP-UX processes such that * the gateway page is outside the address space. diff --git a/fs/block_dev.c b/fs/block_dev.c index 94dfda24c06e..9d544ea02c0a 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -1243,8 +1243,8 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) bd_set_size(bdev, (loff_t)bdev->bd_part->nr_sects << 9); } } else { - put_disk(disk); module_put(disk->fops->owner); + put_disk(disk); disk = NULL; if (bdev->bd_contains == bdev) { if (bdev->bd_disk->fops->open) { diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index 6084d6379c03..3cfec696af9c 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h @@ -572,9 +572,9 @@ require use of the stronger protocol */ #define CIFSSEC_MUST_LANMAN 0x10010 #define CIFSSEC_MUST_PLNTXT 0x20020 #ifdef CONFIG_CIFS_UPCALL -#define CIFSSEC_MASK 0xAF0AF /* allows weak security but also krb5 */ +#define CIFSSEC_MASK 0xBF0BF /* allows weak security but also krb5 */ #else -#define CIFSSEC_MASK 0xA70A7 /* current flags supported if weak */ +#define CIFSSEC_MASK 0xB70B7 /* current flags supported if weak */ #endif /* UPCALL */ #else /* do not allow weak pw hash */ #ifdef CONFIG_CIFS_UPCALL diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h index da8fbf565991..3949ae197809 100644 --- a/fs/cifs/cifsproto.h +++ b/fs/cifs/cifsproto.h @@ -389,4 +389,5 @@ extern int CIFSSMBSetPosixACL(const int xid, struct cifsTconInfo *tcon, const struct nls_table *nls_codepage, int remap_special_chars); extern int CIFSGetExtAttr(const int xid, struct cifsTconInfo *tcon, const int netfid, __u64 *pExtAttrBits, __u64 *pMask); +extern void cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb); #endif /* _CIFSPROTO_H */ diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 1f3345d7fa79..08a44ca2a8db 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -1556,7 +1556,8 @@ cifs_get_tcp_session(struct smb_vol *volume_info) out_err: if (tcp_ses) { - kfree(tcp_ses->hostname); + if (!IS_ERR(tcp_ses->hostname)) + kfree(tcp_ses->hostname); if (tcp_ses->ssocket) sock_release(tcp_ses->ssocket); kfree(tcp_ses); @@ -2199,16 +2200,8 @@ is_path_accessible(int xid, struct cifsTconInfo *tcon, struct cifs_sb_info *cifs_sb, const char *full_path) { int rc; - __u64 inode_num; FILE_ALL_INFO *pfile_info; - rc = CIFSGetSrvInodeNumber(xid, tcon, full_path, &inode_num, - cifs_sb->local_nls, - cifs_sb->mnt_cifs_flags & - CIFS_MOUNT_MAP_SPECIAL_CHR); - if (rc != -EOPNOTSUPP) - return rc; - pfile_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL); if (pfile_info == NULL) return -ENOMEM; @@ -2274,12 +2267,12 @@ int cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, char *mount_data_global, const char *devname) { - int rc = 0; + int rc; int xid; struct smb_vol *volume_info; - struct cifsSesInfo *pSesInfo = NULL; - struct cifsTconInfo *tcon = NULL; - struct TCP_Server_Info *srvTcp = NULL; + struct cifsSesInfo *pSesInfo; + struct cifsTconInfo *tcon; + struct TCP_Server_Info *srvTcp; char *full_path; char *mount_data = mount_data_global; #ifdef CONFIG_CIFS_DFS_UPCALL @@ -2288,6 +2281,10 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, int referral_walks_count = 0; try_mount_again: #endif + rc = 0; + tcon = NULL; + pSesInfo = NULL; + srvTcp = NULL; full_path = NULL; xid = GetXid(); @@ -2584,6 +2581,7 @@ remote_path_check: cleanup_volume_info(&volume_info); referral_walks_count++; + FreeXid(xid); goto try_mount_again; } #else /* No DFS support, return error on mount */ diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index 4326ffd90fa9..965269041c31 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c @@ -212,8 +212,6 @@ int cifs_posix_open(char *full_path, struct inode **pinode, posix_flags |= SMB_O_EXCL; if (oflags & O_TRUNC) posix_flags |= SMB_O_TRUNC; - if (oflags & O_APPEND) - posix_flags |= SMB_O_APPEND; if (oflags & O_SYNC) posix_flags |= SMB_O_SYNC; if (oflags & O_DIRECTORY) @@ -648,7 +646,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, * O_EXCL: optimize away the lookup, but don't hash the dentry. Let * the VFS handle the create. */ - if (nd->flags & LOOKUP_EXCL) { + if (nd && (nd->flags & LOOKUP_EXCL)) { d_instantiate(direntry, NULL); return 0; } @@ -680,7 +678,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, * reduction in network traffic in the other paths. */ if (pTcon->unix_ext) { - if (!(nd->flags & (LOOKUP_PARENT | LOOKUP_DIRECTORY)) && + if (nd && !(nd->flags & (LOOKUP_PARENT | LOOKUP_DIRECTORY)) && (nd->flags & LOOKUP_OPEN) && !pTcon->broken_posix_open && (nd->intent.open.flags & O_CREAT)) { rc = cifs_posix_open(full_path, &newInode, diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 82d83839655e..9a77a30756c4 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c @@ -512,13 +512,10 @@ int cifs_get_inode_info(struct inode **pinode, cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); - if (rc1) { + if (rc1 || !fattr.cf_uniqueid) { cFYI(1, ("GetSrvInodeNum rc %d", rc1)); fattr.cf_uniqueid = iunique(sb, ROOT_I); - /* disable serverino if call not supported */ - if (rc1 == -EINVAL) - cifs_sb->mnt_cifs_flags &= - ~CIFS_MOUNT_SERVER_INUM; + cifs_autodisable_serverino(cifs_sb); } } else { fattr.cf_uniqueid = iunique(sb, ROOT_I); diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c index e079a9190ec4..b8dc3ed5d46c 100644 --- a/fs/cifs/misc.c +++ b/fs/cifs/misc.c @@ -705,3 +705,17 @@ cifsConvertToUCS(__le16 *target, const char *source, int maxlen, ctoUCS_out: return i; } + +void +cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb) +{ + if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) { + cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SERVER_INUM; + cERROR(1, ("Autodisabling the use of server inode numbers on " + "%s. This server doesn't seem to support them " + "properly. Hardlinks will not be recognized on this " + "mount. Consider mounting with the \"noserverino\" " + "option to silence this message.", + cifs_sb->tcon->treeName)); + } +} diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index f823a4a208a7..f55d42bbf7e8 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c @@ -666,6 +666,7 @@ static int cifs_get_name_from_search_buf(struct qstr *pqst, min(len, max_len), nlt, cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); + pqst->len -= nls_nullsize(nlt); } else { pqst->name = filename; pqst->len = len; @@ -727,11 +728,12 @@ static int cifs_filldir(char *pfindEntry, struct file *file, filldir_t filldir, cifs_dir_info_to_fattr(&fattr, (FILE_DIRECTORY_INFO *) pfindEntry, cifs_sb); - /* FIXME: make _to_fattr functions fill this out */ - if (pCifsF->srch_inf.info_level == SMB_FIND_FILE_ID_FULL_DIR_INFO) + if (inum && (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) { fattr.cf_uniqueid = inum; - else + } else { fattr.cf_uniqueid = iunique(sb, ROOT_I); + cifs_autodisable_serverino(cifs_sb); + } ino = cifs_uniqueid_to_ino_t(fattr.cf_uniqueid); tmp_dentry = cifs_readdir_lookup(file->f_dentry, &qstring, &fattr); diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c index f91fd51b32e3..d84e7058c298 100644 --- a/fs/compat_ioctl.c +++ b/fs/compat_ioctl.c @@ -1800,7 +1800,7 @@ struct space_resv_32 { /* just account for different alignment */ static int compat_ioctl_preallocate(struct file *file, unsigned long arg) { - struct space_resv_32 __user *p32 = (void __user *)arg; + struct space_resv_32 __user *p32 = compat_ptr(arg); struct space_resv __user *p = compat_alloc_user_space(sizeof(*p)); if (copy_in_user(&p->l_type, &p32->l_type, sizeof(s16)) || @@ -2802,7 +2802,7 @@ asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd, #else case FS_IOC_RESVSP: case FS_IOC_RESVSP64: - error = ioctl_preallocate(filp, (void __user *)arg); + error = ioctl_preallocate(filp, compat_ptr(arg)); goto out_fput; #endif diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c index d22438ef7674..39c6ee868d7b 100644 --- a/fs/debugfs/inode.c +++ b/fs/debugfs/inode.c @@ -32,7 +32,9 @@ static struct vfsmount *debugfs_mount; static int debugfs_mount_count; static bool debugfs_registered; -static struct inode *debugfs_get_inode(struct super_block *sb, int mode, dev_t dev) +static struct inode *debugfs_get_inode(struct super_block *sb, int mode, dev_t dev, + void *data, const struct file_operations *fops) + { struct inode *inode = new_inode(sb); @@ -44,14 +46,18 @@ static struct inode *debugfs_get_inode(struct super_block *sb, int mode, dev_t d init_special_inode(inode, mode, dev); break; case S_IFREG: - inode->i_fop = &debugfs_file_operations; + inode->i_fop = fops ? fops : &debugfs_file_operations; + inode->i_private = data; break; case S_IFLNK: inode->i_op = &debugfs_link_operations; + inode->i_fop = fops; + inode->i_private = data; break; case S_IFDIR: inode->i_op = &simple_dir_inode_operations; - inode->i_fop = &simple_dir_operations; + inode->i_fop = fops ? fops : &simple_dir_operations; + inode->i_private = data; /* directory inodes start off with i_nlink == 2 * (for "." entry) */ @@ -64,7 +70,8 @@ static struct inode *debugfs_get_inode(struct super_block *sb, int mode, dev_t d /* SMP-safe */ static int debugfs_mknod(struct inode *dir, struct dentry *dentry, - int mode, dev_t dev) + int mode, dev_t dev, void *data, + const struct file_operations *fops) { struct inode *inode; int error = -EPERM; @@ -72,7 +79,7 @@ static int debugfs_mknod(struct inode *dir, struct dentry *dentry, if (dentry->d_inode) return -EEXIST; - inode = debugfs_get_inode(dir->i_sb, mode, dev); + inode = debugfs_get_inode(dir->i_sb, mode, dev, data, fops); if (inode) { d_instantiate(dentry, inode); dget(dentry); @@ -81,12 +88,13 @@ static int debugfs_mknod(struct inode *dir, struct dentry *dentry, return error; } -static int debugfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) +static int debugfs_mkdir(struct inode *dir, struct dentry *dentry, int mode, + void *data, const struct file_operations *fops) { int res; mode = (mode & (S_IRWXUGO | S_ISVTX)) | S_IFDIR; - res = debugfs_mknod(dir, dentry, mode, 0); + res = debugfs_mknod(dir, dentry, mode, 0, data, fops); if (!res) { inc_nlink(dir); fsnotify_mkdir(dir, dentry); @@ -94,18 +102,20 @@ static int debugfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) return res; } -static int debugfs_link(struct inode *dir, struct dentry *dentry, int mode) +static int debugfs_link(struct inode *dir, struct dentry *dentry, int mode, + void *data, const struct file_operations *fops) { mode = (mode & S_IALLUGO) | S_IFLNK; - return debugfs_mknod(dir, dentry, mode, 0); + return debugfs_mknod(dir, dentry, mode, 0, data, fops); } -static int debugfs_create(struct inode *dir, struct dentry *dentry, int mode) +static int debugfs_create(struct inode *dir, struct dentry *dentry, int mode, + void *data, const struct file_operations *fops) { int res; mode = (mode & S_IALLUGO) | S_IFREG; - res = debugfs_mknod(dir, dentry, mode, 0); + res = debugfs_mknod(dir, dentry, mode, 0, data, fops); if (!res) fsnotify_create(dir, dentry); return res; @@ -139,7 +149,9 @@ static struct file_system_type debug_fs_type = { static int debugfs_create_by_name(const char *name, mode_t mode, struct dentry *parent, - struct dentry **dentry) + struct dentry **dentry, + void *data, + const struct file_operations *fops) { int error = 0; @@ -164,13 +176,16 @@ static int debugfs_create_by_name(const char *name, mode_t mode, if (!IS_ERR(*dentry)) { switch (mode & S_IFMT) { case S_IFDIR: - error = debugfs_mkdir(parent->d_inode, *dentry, mode); + error = debugfs_mkdir(parent->d_inode, *dentry, mode, + data, fops); break; case S_IFLNK: - error = debugfs_link(parent->d_inode, *dentry, mode); + error = debugfs_link(parent->d_inode, *dentry, mode, + data, fops); break; default: - error = debugfs_create(parent->d_inode, *dentry, mode); + error = debugfs_create(parent->d_inode, *dentry, mode, + data, fops); break; } dput(*dentry); @@ -221,19 +236,13 @@ struct dentry *debugfs_create_file(const char *name, mode_t mode, if (error) goto exit; - error = debugfs_create_by_name(name, mode, parent, &dentry); + error = debugfs_create_by_name(name, mode, parent, &dentry, + data, fops); if (error) { dentry = NULL; simple_release_fs(&debugfs_mount, &debugfs_mount_count); goto exit; } - - if (dentry->d_inode) { - if (data) - dentry->d_inode->i_private = data; - if (fops) - dentry->d_inode->i_fop = fops; - } exit: return dentry; } diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c index 75efb028974b..e1925c71cd3b 100644 --- a/fs/devpts/inode.c +++ b/fs/devpts/inode.c @@ -518,11 +518,23 @@ int devpts_pty_new(struct inode *ptmx_inode, struct tty_struct *tty) struct tty_struct *devpts_get_tty(struct inode *pts_inode, int number) { + struct dentry *dentry; + struct tty_struct *tty; + BUG_ON(pts_inode->i_rdev == MKDEV(TTYAUX_MAJOR, PTMX_MINOR)); + /* Ensure dentry has not been deleted by devpts_pty_kill() */ + dentry = d_find_alias(pts_inode); + if (!dentry) + return NULL; + + tty = NULL; if (pts_inode->i_sb->s_magic == DEVPTS_SUPER_MAGIC) - return (struct tty_struct *)pts_inode->i_private; - return NULL; + tty = (struct tty_struct *)pts_inode->i_private; + + dput(dentry); + + return tty; } void devpts_pty_kill(struct tty_struct *tty) diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index b91851f1cda3..e7c0bc406fa0 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c @@ -797,6 +797,7 @@ int ecryptfs_init_crypt_ctx(struct ecryptfs_crypt_stat *crypt_stat) kfree(full_alg_name); if (IS_ERR(crypt_stat->tfm)) { rc = PTR_ERR(crypt_stat->tfm); + crypt_stat->tfm = NULL; ecryptfs_printk(KERN_ERR, "cryptfs: init_crypt_ctx(): " "Error initializing cipher [%s]\n", crypt_stat->cipher); @@ -1702,7 +1703,7 @@ ecryptfs_encrypt_filename(struct ecryptfs_filename *filename, } else { printk(KERN_ERR "%s: No support for requested filename " "encryption method in this release\n", __func__); - rc = -ENOTSUPP; + rc = -EOPNOTSUPP; goto out; } out: @@ -1744,7 +1745,7 @@ ecryptfs_process_key_cipher(struct crypto_blkcipher **key_tfm, char *cipher_name, size_t *key_size) { char dummy_key[ECRYPTFS_MAX_KEY_BYTES]; - char *full_alg_name; + char *full_alg_name = NULL; int rc; *key_tfm = NULL; @@ -1759,7 +1760,6 @@ ecryptfs_process_key_cipher(struct crypto_blkcipher **key_tfm, if (rc) goto out; *key_tfm = crypto_alloc_blkcipher(full_alg_name, 0, CRYPTO_ALG_ASYNC); - kfree(full_alg_name); if (IS_ERR(*key_tfm)) { rc = PTR_ERR(*key_tfm); printk(KERN_ERR "Unable to allocate crypto cipher with name " @@ -1781,6 +1781,7 @@ ecryptfs_process_key_cipher(struct crypto_blkcipher **key_tfm, goto out; } out: + kfree(full_alg_name); return rc; } @@ -2166,7 +2167,7 @@ int ecryptfs_encrypt_and_encode_filename( (*encoded_name)[(*encoded_name_size)] = '\0'; (*encoded_name_size)++; } else { - rc = -ENOTSUPP; + rc = -EOPNOTSUPP; } if (rc) { printk(KERN_ERR "%s: Error attempting to encode " diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index 9e944057001b..1744f17ce96e 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c @@ -191,13 +191,6 @@ static int ecryptfs_open(struct inode *inode, struct file *file) | ECRYPTFS_ENCRYPTED); } mutex_unlock(&crypt_stat->cs_mutex); - if ((ecryptfs_inode_to_private(inode)->lower_file->f_flags & O_RDONLY) - && !(file->f_flags & O_RDONLY)) { - rc = -EPERM; - printk(KERN_WARNING "%s: Lower persistent file is RO; eCryptfs " - "file must hence be opened RO\n", __func__); - goto out; - } if (!ecryptfs_inode_to_private(inode)->lower_file) { rc = ecryptfs_init_persistent_file(ecryptfs_dentry); if (rc) { @@ -208,6 +201,13 @@ static int ecryptfs_open(struct inode *inode, struct file *file) goto out; } } + if ((ecryptfs_inode_to_private(inode)->lower_file->f_flags & O_RDONLY) + && !(file->f_flags & O_RDONLY)) { + rc = -EPERM; + printk(KERN_WARNING "%s: Lower persistent file is RO; eCryptfs " + "file must hence be opened RO\n", __func__); + goto out; + } ecryptfs_set_file_lower( file, ecryptfs_inode_to_private(inode)->lower_file); if (S_ISDIR(ecryptfs_dentry->d_inode->i_mode)) { diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 2f0945d63297..056fed62d0de 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c @@ -476,6 +476,7 @@ static int ecryptfs_unlink(struct inode *dir, struct dentry *dentry) struct inode *lower_dir_inode = ecryptfs_inode_to_lower(dir); struct dentry *lower_dir_dentry; + dget(lower_dentry); lower_dir_dentry = lock_parent(lower_dentry); rc = vfs_unlink(lower_dir_inode, lower_dentry); if (rc) { @@ -489,6 +490,7 @@ static int ecryptfs_unlink(struct inode *dir, struct dentry *dentry) d_drop(dentry); out_unlock: unlock_dir(lower_dir_dentry); + dput(lower_dentry); return rc; } diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c index 259525c9abb8..c77438f70bbd 100644 --- a/fs/ecryptfs/keystore.c +++ b/fs/ecryptfs/keystore.c @@ -416,7 +416,9 @@ ecryptfs_find_global_auth_tok_for_sig( &mount_crypt_stat->global_auth_tok_list, mount_crypt_stat_list) { if (memcmp(walker->sig, sig, ECRYPTFS_SIG_SIZE_HEX) == 0) { - (*global_auth_tok) = walker; + rc = key_validate(walker->global_auth_tok_key); + if (!rc) + (*global_auth_tok) = walker; goto out; } } @@ -612,7 +614,12 @@ ecryptfs_write_tag_70_packet(char *dest, size_t *remaining_bytes, } /* TODO: Support other key modules than passphrase for * filename encryption */ - BUG_ON(s->auth_tok->token_type != ECRYPTFS_PASSWORD); + if (s->auth_tok->token_type != ECRYPTFS_PASSWORD) { + rc = -EOPNOTSUPP; + printk(KERN_INFO "%s: Filename encryption only supports " + "password tokens\n", __func__); + goto out_free_unlock; + } sg_init_one( &s->hash_sg, (u8 *)s->auth_tok->token.password.session_key_encryption_key, @@ -910,7 +917,12 @@ ecryptfs_parse_tag_70_packet(char **filename, size_t *filename_size, } /* TODO: Support other key modules than passphrase for * filename encryption */ - BUG_ON(s->auth_tok->token_type != ECRYPTFS_PASSWORD); + if (s->auth_tok->token_type != ECRYPTFS_PASSWORD) { + rc = -EOPNOTSUPP; + printk(KERN_INFO "%s: Filename encryption only supports " + "password tokens\n", __func__); + goto out_free_unlock; + } rc = crypto_blkcipher_setkey( s->desc.tfm, s->auth_tok->token.password.session_key_encryption_key, @@ -1316,8 +1328,10 @@ parse_tag_3_packet(struct ecryptfs_crypt_stat *crypt_stat, rc = -EINVAL; goto out_free; } - ecryptfs_cipher_code_to_string(crypt_stat->cipher, - (u16)data[(*packet_size)]); + rc = ecryptfs_cipher_code_to_string(crypt_stat->cipher, + (u16)data[(*packet_size)]); + if (rc) + goto out_free; /* A little extra work to differentiate among the AES key * sizes; see RFC2440 */ switch(data[(*packet_size)++]) { @@ -1328,7 +1342,9 @@ parse_tag_3_packet(struct ecryptfs_crypt_stat *crypt_stat, crypt_stat->key_size = (*new_auth_tok)->session_key.encrypted_key_size; } - ecryptfs_init_crypt_ctx(crypt_stat); + rc = ecryptfs_init_crypt_ctx(crypt_stat); + if (rc) + goto out_free; if (unlikely(data[(*packet_size)++] != 0x03)) { printk(KERN_WARNING "Only S2K ID 3 is currently supported\n"); rc = -ENOSYS; diff --git a/fs/ecryptfs/kthread.c b/fs/ecryptfs/kthread.c index c6d7a4d748a0..e14cf7e588db 100644 --- a/fs/ecryptfs/kthread.c +++ b/fs/ecryptfs/kthread.c @@ -136,6 +136,7 @@ int ecryptfs_privileged_open(struct file **lower_file, const struct cred *cred) { struct ecryptfs_open_req *req; + int flags = O_LARGEFILE; int rc = 0; /* Corresponding dput() and mntput() are done when the @@ -143,10 +144,14 @@ int ecryptfs_privileged_open(struct file **lower_file, * destroyed. */ dget(lower_dentry); mntget(lower_mnt); - (*lower_file) = dentry_open(lower_dentry, lower_mnt, - (O_RDWR | O_LARGEFILE), cred); + flags |= IS_RDONLY(lower_dentry->d_inode) ? O_RDONLY : O_RDWR; + (*lower_file) = dentry_open(lower_dentry, lower_mnt, flags, cred); if (!IS_ERR(*lower_file)) goto out; + if (flags & O_RDONLY) { + rc = PTR_ERR((*lower_file)); + goto out; + } req = kmem_cache_alloc(ecryptfs_open_req_cache, GFP_KERNEL); if (!req) { rc = -ENOMEM; @@ -180,21 +185,8 @@ int ecryptfs_privileged_open(struct file **lower_file, __func__); goto out_unlock; } - if (IS_ERR(*req->lower_file)) { + if (IS_ERR(*req->lower_file)) rc = PTR_ERR(*req->lower_file); - dget(lower_dentry); - mntget(lower_mnt); - (*lower_file) = dentry_open(lower_dentry, lower_mnt, - (O_RDONLY | O_LARGEFILE), cred); - if (IS_ERR(*lower_file)) { - rc = PTR_ERR(*req->lower_file); - (*lower_file) = NULL; - printk(KERN_WARNING "%s: Error attempting privileged " - "open of lower file with either RW or RO " - "perms; rc = [%d]. Giving up.\n", - __func__, rc); - } - } out_unlock: mutex_unlock(&req->mux); out_free: diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c index 9f0aa9883c28..c6ac85d6c701 100644 --- a/fs/ecryptfs/main.c +++ b/fs/ecryptfs/main.c @@ -35,6 +35,7 @@ #include <linux/key.h> #include <linux/parser.h> #include <linux/fs_stack.h> +#include <linux/ima.h> #include "ecryptfs_kernel.h" /** @@ -118,6 +119,7 @@ int ecryptfs_init_persistent_file(struct dentry *ecryptfs_dentry) const struct cred *cred = current_cred(); struct ecryptfs_inode_info *inode_info = ecryptfs_inode_to_private(ecryptfs_dentry->d_inode); + int opened_lower_file = 0; int rc = 0; mutex_lock(&inode_info->lower_file_mutex); @@ -129,15 +131,17 @@ int ecryptfs_init_persistent_file(struct dentry *ecryptfs_dentry) lower_dentry = ecryptfs_dentry_to_lower(ecryptfs_dentry); rc = ecryptfs_privileged_open(&inode_info->lower_file, lower_dentry, lower_mnt, cred); - if (rc || IS_ERR(inode_info->lower_file)) { + if (rc) { printk(KERN_ERR "Error opening lower persistent file " "for lower_dentry [0x%p] and lower_mnt [0x%p]; " "rc = [%d]\n", lower_dentry, lower_mnt, rc); - rc = PTR_ERR(inode_info->lower_file); inode_info->lower_file = NULL; - } + } else + opened_lower_file = 1; } mutex_unlock(&inode_info->lower_file_mutex); + if (opened_lower_file) + ima_counts_get(inode_info->lower_file); return rc; } diff --git a/fs/exec.c b/fs/exec.c index 172ceb6edde4..62cd056adde9 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -928,9 +928,7 @@ void set_task_comm(struct task_struct *tsk, char *buf) int flush_old_exec(struct linux_binprm * bprm) { - char * name; - int i, ch, retval; - char tcomm[sizeof(current->comm)]; + int retval; /* * Make sure we have a private signal table and that @@ -951,6 +949,25 @@ int flush_old_exec(struct linux_binprm * bprm) bprm->mm = NULL; /* We're using it now */ + current->flags &= ~PF_RANDOMIZE; + flush_thread(); + current->personality &= ~bprm->per_clear; + + return 0; + +out: + return retval; +} +EXPORT_SYMBOL(flush_old_exec); + +void setup_new_exec(struct linux_binprm * bprm) +{ + int i, ch; + char * name; + char tcomm[sizeof(current->comm)]; + + arch_pick_mmap_layout(current->mm); + /* This is the point of no return */ current->sas_ss_sp = current->sas_ss_size = 0; @@ -972,9 +989,6 @@ int flush_old_exec(struct linux_binprm * bprm) tcomm[i] = '\0'; set_task_comm(current, tcomm); - current->flags &= ~PF_RANDOMIZE; - flush_thread(); - /* Set the new mm task size. We have to do that late because it may * depend on TIF_32BIT which is only updated in flush_thread() on * some architectures like powerpc @@ -990,8 +1004,6 @@ int flush_old_exec(struct linux_binprm * bprm) set_dumpable(current->mm, suid_dumpable); } - current->personality &= ~bprm->per_clear; - /* * Flush performance counters when crossing a * security domain: @@ -1006,14 +1018,8 @@ int flush_old_exec(struct linux_binprm * bprm) flush_signal_handlers(current, 0); flush_old_files(current->files); - - return 0; - -out: - return retval; } - -EXPORT_SYMBOL(flush_old_exec); +EXPORT_SYMBOL(setup_new_exec); /* * Prepare credentials and lock ->cred_guard_mutex. @@ -1855,8 +1861,9 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs) /* * Dont allow local users get cute and trick others to coredump * into their pre-created files: + * Note, this is not relevant for pipes */ - if (inode->i_uid != current_fsuid()) + if (!ispipe && (inode->i_uid != current_fsuid())) goto close_fail; if (!file->f_op) goto close_fail; diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index b49908a167ae..6244b0cb98c5 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c @@ -1137,6 +1137,16 @@ static int do_journal_get_write_access(handle_t *handle, return ext3_journal_get_write_access(handle, bh); } +/* + * Truncate blocks that were not used by write. We have to truncate the + * pagecache as well so that corresponding buffers get properly unmapped. + */ +static void ext3_truncate_failed_write(struct inode *inode) +{ + truncate_inode_pages(inode->i_mapping, inode->i_size); + ext3_truncate(inode); +} + static int ext3_write_begin(struct file *file, struct address_space *mapping, loff_t pos, unsigned len, unsigned flags, struct page **pagep, void **fsdata) @@ -1195,7 +1205,7 @@ write_begin_failed: unlock_page(page); page_cache_release(page); if (pos + len > inode->i_size) - ext3_truncate(inode); + ext3_truncate_failed_write(inode); } if (ret == -ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries)) goto retry; @@ -1290,7 +1300,7 @@ static int ext3_ordered_write_end(struct file *file, page_cache_release(page); if (pos + len > inode->i_size) - ext3_truncate(inode); + ext3_truncate_failed_write(inode); return ret ? ret : copied; } @@ -1316,7 +1326,7 @@ static int ext3_writeback_write_end(struct file *file, page_cache_release(page); if (pos + len > inode->i_size) - ext3_truncate(inode); + ext3_truncate_failed_write(inode); return ret ? ret : copied; } @@ -1369,7 +1379,7 @@ static int ext3_journalled_write_end(struct file *file, page_cache_release(page); if (pos + len > inode->i_size) - ext3_truncate(inode); + ext3_truncate_failed_write(inode); return ret ? ret : copied; } diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index e2126d70dff5..34bb79799dba 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c @@ -761,7 +761,13 @@ static unsigned long ext4_bg_num_gdb_meta(struct super_block *sb, static unsigned long ext4_bg_num_gdb_nometa(struct super_block *sb, ext4_group_t group) { - return ext4_bg_has_super(sb, group) ? EXT4_SB(sb)->s_gdb_count : 0; + if (!ext4_bg_has_super(sb, group)) + return 0; + + if (EXT4_HAS_INCOMPAT_FEATURE(sb,EXT4_FEATURE_INCOMPAT_META_BG)) + return le32_to_cpu(EXT4_SB(sb)->s_es->s_first_meta_bg); + else + return EXT4_SB(sb)->s_gdb_count; } /** diff --git a/fs/ext4/block_validity.c b/fs/ext4/block_validity.c index 50784ef07563..dc79b75d8f70 100644 --- a/fs/ext4/block_validity.c +++ b/fs/ext4/block_validity.c @@ -160,7 +160,7 @@ int ext4_setup_system_zone(struct super_block *sb) if (ext4_bg_has_super(sb, i) && ((i < 5) || ((i % flex_size) == 0))) add_system_zone(sbi, ext4_group_first_block_no(sb, i), - sbi->s_gdb_count + 1); + ext4_bg_num_gdb(sb, i) + 1); gdp = ext4_get_group_desc(sb, i, NULL); ret = add_system_zone(sbi, ext4_block_bitmap(sb, gdp), 1); if (ret) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 9714db393efe..9bd595a78168 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -88,6 +88,8 @@ typedef unsigned int ext4_group_t; #define EXT4_MB_HINT_TRY_GOAL 512 /* blocks already pre-reserved by delayed allocation */ #define EXT4_MB_DELALLOC_RESERVED 1024 +/* We are doing stream allocation */ +#define EXT4_MB_STREAM_ALLOC 2048 struct ext4_allocation_request { @@ -111,6 +113,33 @@ struct ext4_allocation_request { unsigned int flags; }; +#define DIO_AIO_UNWRITTEN 0x1 +typedef struct ext4_io_end { + struct list_head list; /* per-file finished AIO list */ + struct inode *inode; /* file being written to */ + unsigned int flag; /* sync IO or AIO */ + int error; /* I/O error code */ + ext4_lblk_t offset; /* offset in the file */ + size_t size; /* size of the extent */ + struct work_struct work; /* data work queue */ +} ext4_io_end_t; + +/* + * Delayed allocation stuff + */ + +struct mpage_da_data { + struct inode *inode; + sector_t b_blocknr; /* start block number of extent */ + size_t b_size; /* size of extent */ + unsigned long b_state; /* state of the extent */ + unsigned long first_page, next_page; /* extent of pages */ + struct writeback_control *wbc; + int io_done; + int pages_written; + int retval; +}; + /* * Special inodes numbers */ @@ -251,7 +280,6 @@ struct flex_groups { #define EXT4_TOPDIR_FL 0x00020000 /* Top of directory hierarchies*/ #define EXT4_HUGE_FILE_FL 0x00040000 /* Set to each huge file */ #define EXT4_EXTENTS_FL 0x00080000 /* Inode uses extents */ -#define EXT4_EXT_MIGRATE 0x00100000 /* Inode is migrating */ #define EXT4_RESERVED_FL 0x80000000 /* reserved for ext4 lib */ #define EXT4_FL_USER_VISIBLE 0x000BDFFF /* User visible flags */ @@ -289,6 +317,8 @@ static inline __u32 ext4_mask_flags(umode_t mode, __u32 flags) #define EXT4_STATE_XATTR 0x00000004 /* has in-inode xattrs */ #define EXT4_STATE_NO_EXPAND 0x00000008 /* No space for expansion */ #define EXT4_STATE_DA_ALLOC_CLOSE 0x00000010 /* Alloc DA blks on close */ +#define EXT4_STATE_EXT_MIGRATE 0x00000020 /* Inode is migrating */ +#define EXT4_STATE_DIO_UNWRITTEN 0x00000040 /* need convert on dio done*/ /* Used to pass group descriptor data when online resize is done */ struct ext4_new_group_input { @@ -330,7 +360,16 @@ struct ext4_new_group_data { /* Call ext4_da_update_reserve_space() after successfully allocating the blocks */ #define EXT4_GET_BLOCKS_UPDATE_RESERVE_SPACE 0x0008 - + /* caller is from the direct IO path, request to creation of an + unitialized extents if not allocated, split the uninitialized + extent if blocks has been preallocated already*/ +#define EXT4_GET_BLOCKS_DIO 0x0010 +#define EXT4_GET_BLOCKS_CONVERT 0x0020 +#define EXT4_GET_BLOCKS_DIO_CREATE_EXT (EXT4_GET_BLOCKS_DIO|\ + EXT4_GET_BLOCKS_CREATE_UNINIT_EXT) + /* Convert extent to initialized after direct IO complete */ +#define EXT4_GET_BLOCKS_DIO_CONVERT_EXT (EXT4_GET_BLOCKS_CONVERT|\ + EXT4_GET_BLOCKS_DIO_CREATE_EXT) /* * ioctl commands @@ -386,6 +425,9 @@ struct ext4_mount_options { #endif }; +/* Max physical block we can addres w/o extents */ +#define EXT4_MAX_BLOCK_FILE_PHYS 0xFFFFFFFF + /* * Structure of an inode on the disk */ @@ -481,8 +523,8 @@ struct move_extent { static inline __le32 ext4_encode_extra_time(struct timespec *time) { return cpu_to_le32((sizeof(time->tv_sec) > 4 ? - time->tv_sec >> 32 : 0) | - ((time->tv_nsec << 2) & EXT4_NSEC_MASK)); + (time->tv_sec >> 32) & EXT4_EPOCH_MASK : 0) | + ((time->tv_nsec << EXT4_EPOCH_BITS) & EXT4_NSEC_MASK)); } static inline void ext4_decode_extra_time(struct timespec *time, __le32 extra) @@ -490,7 +532,7 @@ static inline void ext4_decode_extra_time(struct timespec *time, __le32 extra) if (sizeof(time->tv_sec) > 4) time->tv_sec |= (__u64)(le32_to_cpu(extra) & EXT4_EPOCH_MASK) << 32; - time->tv_nsec = (le32_to_cpu(extra) & EXT4_NSEC_MASK) >> 2; + time->tv_nsec = (le32_to_cpu(extra) & EXT4_NSEC_MASK) >> EXT4_EPOCH_BITS; } #define EXT4_INODE_SET_XTIME(xtime, inode, raw_inode) \ @@ -653,6 +695,22 @@ struct ext4_inode_info { __u16 i_extra_isize; spinlock_t i_block_reservation_lock; +#ifdef CONFIG_QUOTA + /* quota space reservation, managed internally by quota code */ + qsize_t i_reserved_quota; +#endif + + /* completed async DIOs that might need unwritten extents handling */ + struct list_head i_aio_dio_complete_list; + /* current io_end structure for async DIO write*/ + ext4_io_end_t *cur_aio_dio; + + /* + * Transactions that contain inode's metadata needed to complete + * fsync and fdatasync, respectively. + */ + tid_t i_sync_tid; + tid_t i_datasync_tid; }; /* @@ -700,6 +758,7 @@ struct ext4_inode_info { #define EXT4_MOUNT_DELALLOC 0x8000000 /* Delalloc support */ #define EXT4_MOUNT_DATA_ERR_ABORT 0x10000000 /* Abort on file data write */ #define EXT4_MOUNT_BLOCK_VALIDITY 0x20000000 /* Block validity checking */ +#define EXT4_MOUNT_DISCARD 0x40000000 /* Issue DISCARD requests */ #define clear_opt(o, opt) o &= ~EXT4_MOUNT_##opt #define set_opt(o, opt) o |= EXT4_MOUNT_##opt @@ -841,6 +900,7 @@ struct ext4_sb_info { unsigned long s_gdb_count; /* Number of group descriptor blocks */ unsigned long s_desc_per_block; /* Number of group descriptors per block */ ext4_group_t s_groups_count; /* Number of groups in the fs */ + ext4_group_t s_blockfile_groups;/* Groups acceptable for non-extent files */ unsigned long s_overhead_last; /* Last calculated overhead */ unsigned long s_blocks_last; /* Last seen block count */ loff_t s_bitmap_maxbytes; /* max bytes for bitmap files */ @@ -923,6 +983,7 @@ struct ext4_sb_info { unsigned int s_mb_stats; unsigned int s_mb_order2_reqs; unsigned int s_mb_group_prealloc; + unsigned int s_max_writeback_mb_bump; /* where last allocation was done - for stream allocation */ unsigned long s_mb_last_group; unsigned long s_mb_last_start; @@ -950,6 +1011,7 @@ struct ext4_sb_info { atomic_t s_mb_lost_chunks; atomic_t s_mb_preallocated; atomic_t s_mb_discarded; + atomic_t s_lock_busy; /* locality groups */ struct ext4_locality_group *s_locality_groups; @@ -960,6 +1022,9 @@ struct ext4_sb_info { unsigned int s_log_groups_per_flex; struct flex_groups *s_flex_groups; + + /* workqueue for dio unwritten */ + struct workqueue_struct *dio_unwritten_wq; }; static inline struct ext4_sb_info *EXT4_SB(struct super_block *sb) @@ -1367,6 +1432,7 @@ extern int ext4_change_inode_journal_flag(struct inode *, int); extern int ext4_get_inode_loc(struct inode *, struct ext4_iloc *); extern int ext4_can_truncate(struct inode *inode); extern void ext4_truncate(struct inode *); +extern int ext4_truncate_restart_trans(handle_t *, struct inode *, int nblocks); extern void ext4_set_inode_flags(struct inode *); extern void ext4_get_inode_flags(struct ext4_inode_info *); extern int ext4_alloc_da_blocks(struct inode *inode); @@ -1377,8 +1443,8 @@ extern int ext4_chunk_trans_blocks(struct inode *, int nrblocks); extern int ext4_block_truncate_page(handle_t *handle, struct address_space *mapping, loff_t from); extern int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf); -extern qsize_t ext4_get_reserved_space(struct inode *inode); - +extern qsize_t *ext4_get_reserved_space(struct inode *inode); +extern int flush_aio_dio_completed_IO(struct inode *inode); /* ioctl.c */ extern long ext4_ioctl(struct file *, unsigned int, unsigned long); extern long ext4_compat_ioctl(struct file *, unsigned int, unsigned long); @@ -1591,15 +1657,42 @@ struct ext4_group_info { #define EXT4_MB_GRP_NEED_INIT(grp) \ (test_bit(EXT4_GROUP_INFO_NEED_INIT_BIT, &((grp)->bb_state))) +#define EXT4_MAX_CONTENTION 8 +#define EXT4_CONTENTION_THRESHOLD 2 + static inline spinlock_t *ext4_group_lock_ptr(struct super_block *sb, ext4_group_t group) { return bgl_lock_ptr(EXT4_SB(sb)->s_blockgroup_lock, group); } +/* + * Returns true if the filesystem is busy enough that attempts to + * access the block group locks has run into contention. + */ +static inline int ext4_fs_is_busy(struct ext4_sb_info *sbi) +{ + return (atomic_read(&sbi->s_lock_busy) > EXT4_CONTENTION_THRESHOLD); +} + static inline void ext4_lock_group(struct super_block *sb, ext4_group_t group) { - spin_lock(ext4_group_lock_ptr(sb, group)); + spinlock_t *lock = ext4_group_lock_ptr(sb, group); + if (spin_trylock(lock)) + /* + * We're able to grab the lock right away, so drop the + * lock contention counter. + */ + atomic_add_unless(&EXT4_SB(sb)->s_lock_busy, -1, 0); + else { + /* + * The lock is busy, so bump the contention counter, + * and then wait on the spin lock. + */ + atomic_add_unless(&EXT4_SB(sb)->s_lock_busy, 1, + EXT4_MAX_CONTENTION); + spin_lock(lock); + } } static inline void ext4_unlock_group(struct super_block *sb, @@ -1650,6 +1743,8 @@ extern void ext4_ext_init(struct super_block *); extern void ext4_ext_release(struct super_block *); extern long ext4_fallocate(struct inode *inode, int mode, loff_t offset, loff_t len); +extern int ext4_convert_unwritten_extents(struct inode *inode, loff_t offset, + loff_t len); extern int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block, unsigned int max_blocks, struct buffer_head *bh, int flags); diff --git a/fs/ext4/ext4_extents.h b/fs/ext4/ext4_extents.h index 20a84105a10b..1c2db3fc4656 100644 --- a/fs/ext4/ext4_extents.h +++ b/fs/ext4/ext4_extents.h @@ -220,6 +220,11 @@ static inline int ext4_ext_get_actual_len(struct ext4_extent *ext) (le16_to_cpu(ext->ee_len) - EXT_INIT_MAX_LEN)); } +static inline void ext4_ext_mark_initialized(struct ext4_extent *ext) +{ + ext->ee_len = cpu_to_le16(ext4_ext_get_actual_len(ext)); +} + extern int ext4_ext_calc_metadata_amount(struct inode *inode, int blocks); extern ext4_fsblk_t ext_pblock(struct ext4_extent *ex); extern ext4_fsblk_t idx_pblock(struct ext4_extent_idx *); @@ -235,7 +240,7 @@ extern int ext4_ext_try_to_merge(struct inode *inode, struct ext4_ext_path *path, struct ext4_extent *); extern unsigned int ext4_ext_check_overlap(struct inode *, struct ext4_extent *, struct ext4_ext_path *); -extern int ext4_ext_insert_extent(handle_t *, struct inode *, struct ext4_ext_path *, struct ext4_extent *); +extern int ext4_ext_insert_extent(handle_t *, struct inode *, struct ext4_ext_path *, struct ext4_extent *, int); extern int ext4_ext_walk_space(struct inode *, ext4_lblk_t, ext4_lblk_t, ext_prepare_callback, void *); extern struct ext4_ext_path *ext4_ext_find_extent(struct inode *, ext4_lblk_t, diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c index eb27fd0f2ee8..6a9409920dee 100644 --- a/fs/ext4/ext4_jbd2.c +++ b/fs/ext4/ext4_jbd2.c @@ -44,7 +44,7 @@ int __ext4_journal_forget(const char *where, handle_t *handle, handle, err); } else - brelse(bh); + bforget(bh); return err; } @@ -60,7 +60,7 @@ int __ext4_journal_revoke(const char *where, handle_t *handle, handle, err); } else - brelse(bh); + bforget(bh); return err; } @@ -89,7 +89,10 @@ int __ext4_handle_dirty_metadata(const char *where, handle_t *handle, ext4_journal_abort_handle(where, __func__, bh, handle, err); } else { - mark_buffer_dirty(bh); + if (inode && bh) + mark_buffer_dirty_inode(bh, inode); + else + mark_buffer_dirty(bh); if (inode && inode_needs_sync(inode)) { sync_dirty_buffer(bh); if (buffer_req(bh) && !buffer_uptodate(bh)) { diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h index 139fb8cb87e4..1892a7763426 100644 --- a/fs/ext4/ext4_jbd2.h +++ b/fs/ext4/ext4_jbd2.h @@ -49,7 +49,7 @@ #define EXT4_DATA_TRANS_BLOCKS(sb) (EXT4_SINGLEDATA_TRANS_BLOCKS(sb) + \ EXT4_XATTR_TRANS_BLOCKS - 2 + \ - 2*EXT4_QUOTA_TRANS_BLOCKS(sb)) + EXT4_MAXQUOTAS_TRANS_BLOCKS(sb)) /* * Define the number of metadata blocks we need to account to modify data. @@ -57,7 +57,7 @@ * This include super block, inode block, quota blocks and xattr blocks */ #define EXT4_META_TRANS_BLOCKS(sb) (EXT4_XATTR_TRANS_BLOCKS + \ - 2*EXT4_QUOTA_TRANS_BLOCKS(sb)) + EXT4_MAXQUOTAS_TRANS_BLOCKS(sb)) /* Delete operations potentially hit one directory's namespace plus an * entire inode, plus arbitrary amounts of bitmap/indirection data. Be @@ -92,6 +92,7 @@ * but inode, sb and group updates are done only once */ #define EXT4_QUOTA_INIT_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_INIT_ALLOC*\ (EXT4_SINGLEDATA_TRANS_BLOCKS(sb)-3)+3+DQUOT_INIT_REWRITE) : 0) + #define EXT4_QUOTA_DEL_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_DEL_ALLOC*\ (EXT4_SINGLEDATA_TRANS_BLOCKS(sb)-3)+3+DQUOT_DEL_REWRITE) : 0) #else @@ -99,6 +100,9 @@ #define EXT4_QUOTA_INIT_BLOCKS(sb) 0 #define EXT4_QUOTA_DEL_BLOCKS(sb) 0 #endif +#define EXT4_MAXQUOTAS_TRANS_BLOCKS(sb) (MAXQUOTAS*EXT4_QUOTA_TRANS_BLOCKS(sb)) +#define EXT4_MAXQUOTAS_INIT_BLOCKS(sb) (MAXQUOTAS*EXT4_QUOTA_INIT_BLOCKS(sb)) +#define EXT4_MAXQUOTAS_DEL_BLOCKS(sb) (MAXQUOTAS*EXT4_QUOTA_DEL_BLOCKS(sb)) int ext4_mark_iloc_dirty(handle_t *handle, @@ -161,11 +165,13 @@ int __ext4_handle_dirty_metadata(const char *where, handle_t *handle, handle_t *ext4_journal_start_sb(struct super_block *sb, int nblocks); int __ext4_journal_stop(const char *where, handle_t *handle); -#define EXT4_NOJOURNAL_HANDLE ((handle_t *) 0x1) +#define EXT4_NOJOURNAL_MAX_REF_COUNT ((unsigned long) 4096) +/* Note: Do not use this for NULL handles. This is only to determine if + * a properly allocated handle is using a journal or not. */ static inline int ext4_handle_valid(handle_t *handle) { - if (handle == EXT4_NOJOURNAL_HANDLE) + if ((unsigned long)handle < EXT4_NOJOURNAL_MAX_REF_COUNT) return 0; return 1; } @@ -252,6 +258,19 @@ static inline int ext4_jbd2_file_inode(handle_t *handle, struct inode *inode) return 0; } +static inline void ext4_update_inode_fsync_trans(handle_t *handle, + struct inode *inode, + int datasync) +{ + struct ext4_inode_info *ei = EXT4_I(inode); + + if (ext4_handle_valid(handle)) { + ei->i_sync_tid = handle->h_transaction->t_tid; + if (datasync) + ei->i_datasync_tid = handle->h_transaction->t_tid; + } +} + /* super.c */ int ext4_force_commit(struct super_block *sb); diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 73ebfb44ad75..24fb20b2ed25 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -93,7 +93,9 @@ static void ext4_idx_store_pblock(struct ext4_extent_idx *ix, ext4_fsblk_t pb) ix->ei_leaf_hi = cpu_to_le16((unsigned long) ((pb >> 31) >> 1) & 0xffff); } -static int ext4_ext_journal_restart(handle_t *handle, int needed) +static int ext4_ext_truncate_extend_restart(handle_t *handle, + struct inode *inode, + int needed) { int err; @@ -104,7 +106,14 @@ static int ext4_ext_journal_restart(handle_t *handle, int needed) err = ext4_journal_extend(handle, needed); if (err <= 0) return err; - return ext4_journal_restart(handle, needed); + err = ext4_truncate_restart_trans(handle, inode, needed); + /* + * We have dropped i_data_sem so someone might have cached again + * an extent we are going to truncate. + */ + ext4_ext_invalidate_cache(inode); + + return err; } /* @@ -701,7 +710,7 @@ err: * insert new index [@logical;@ptr] into the block at @curp; * check where to insert: before @curp or after @curp */ -static int ext4_ext_insert_index(handle_t *handle, struct inode *inode, +int ext4_ext_insert_index(handle_t *handle, struct inode *inode, struct ext4_ext_path *curp, int logical, ext4_fsblk_t ptr) { @@ -1563,7 +1572,7 @@ out: */ int ext4_ext_insert_extent(handle_t *handle, struct inode *inode, struct ext4_ext_path *path, - struct ext4_extent *newext) + struct ext4_extent *newext, int flag) { struct ext4_extent_header *eh; struct ext4_extent *ex, *fex; @@ -1579,7 +1588,8 @@ int ext4_ext_insert_extent(handle_t *handle, struct inode *inode, BUG_ON(path[depth].p_hdr == NULL); /* try to insert block into found extent and return */ - if (ex && ext4_can_extents_be_merged(inode, ex, newext)) { + if (ex && (flag != EXT4_GET_BLOCKS_DIO_CREATE_EXT) + && ext4_can_extents_be_merged(inode, ex, newext)) { ext_debug("append %d block to %d:%d (from %llu)\n", ext4_ext_get_actual_len(newext), le32_to_cpu(ex->ee_block), @@ -1694,7 +1704,8 @@ has_space: merge: /* try to merge extents to the right */ - ext4_ext_try_to_merge(inode, path, nearex); + if (flag != EXT4_GET_BLOCKS_DIO_CREATE_EXT) + ext4_ext_try_to_merge(inode, path, nearex); /* try to merge extents to the left */ @@ -1731,7 +1742,9 @@ int ext4_ext_walk_space(struct inode *inode, ext4_lblk_t block, while (block < last && block != EXT_MAX_BLOCK) { num = last - block; /* find extent for this block */ + down_read(&EXT4_I(inode)->i_data_sem); path = ext4_ext_find_extent(inode, block, path); + up_read(&EXT4_I(inode)->i_data_sem); if (IS_ERR(path)) { err = PTR_ERR(path); path = NULL; @@ -2044,7 +2057,7 @@ static int ext4_remove_blocks(handle_t *handle, struct inode *inode, ext_debug("free last %u blocks starting %llu\n", num, start); for (i = 0; i < num; i++) { bh = sb_find_get_block(inode->i_sb, start + i); - ext4_forget(handle, 0, inode, bh, start + i); + ext4_forget(handle, metadata, inode, bh, start + i); } ext4_free_blocks(handle, inode, start, num, metadata); } else if (from == le32_to_cpu(ex->ee_block) @@ -2136,9 +2149,9 @@ ext4_ext_rm_leaf(handle_t *handle, struct inode *inode, correct_index = 1; credits += (ext_depth(inode)) + 1; } - credits += 2 * EXT4_QUOTA_TRANS_BLOCKS(inode->i_sb); + credits += EXT4_MAXQUOTAS_TRANS_BLOCKS(inode->i_sb); - err = ext4_ext_journal_restart(handle, credits); + err = ext4_ext_truncate_extend_restart(handle, inode, credits); if (err) goto out; @@ -2461,7 +2474,6 @@ static int ext4_ext_zeroout(struct inode *inode, struct ext4_extent *ex) } #define EXT4_EXT_ZERO_LEN 7 - /* * This function is called by ext4_ext_get_blocks() if someone tries to write * to an uninitialized extent. It may result in splitting the uninitialized @@ -2554,7 +2566,8 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, ex3->ee_block = cpu_to_le32(iblock); ext4_ext_store_pblock(ex3, newblock); ex3->ee_len = cpu_to_le16(allocated); - err = ext4_ext_insert_extent(handle, inode, path, ex3); + err = ext4_ext_insert_extent(handle, inode, path, + ex3, 0); if (err == -ENOSPC) { err = ext4_ext_zeroout(inode, &orig_ex); if (err) @@ -2610,7 +2623,7 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, ext4_ext_store_pblock(ex3, newblock + max_blocks); ex3->ee_len = cpu_to_le16(allocated - max_blocks); ext4_ext_mark_uninitialized(ex3); - err = ext4_ext_insert_extent(handle, inode, path, ex3); + err = ext4_ext_insert_extent(handle, inode, path, ex3, 0); if (err == -ENOSPC) { err = ext4_ext_zeroout(inode, &orig_ex); if (err) @@ -2728,7 +2741,191 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, err = ext4_ext_dirty(handle, inode, path + depth); goto out; insert: - err = ext4_ext_insert_extent(handle, inode, path, &newex); + err = ext4_ext_insert_extent(handle, inode, path, &newex, 0); + if (err == -ENOSPC) { + err = ext4_ext_zeroout(inode, &orig_ex); + if (err) + goto fix_extent_len; + /* update the extent length and mark as initialized */ + ex->ee_block = orig_ex.ee_block; + ex->ee_len = orig_ex.ee_len; + ext4_ext_store_pblock(ex, ext_pblock(&orig_ex)); + ext4_ext_dirty(handle, inode, path + depth); + /* zero out the first half */ + return allocated; + } else if (err) + goto fix_extent_len; +out: + return err ? err : allocated; + +fix_extent_len: + ex->ee_block = orig_ex.ee_block; + ex->ee_len = orig_ex.ee_len; + ext4_ext_store_pblock(ex, ext_pblock(&orig_ex)); + ext4_ext_mark_uninitialized(ex); + ext4_ext_dirty(handle, inode, path + depth); + return err; +} + +/* + * This function is called by ext4_ext_get_blocks() from + * ext4_get_blocks_dio_write() when DIO to write + * to an uninitialized extent. + * + * Writing to an uninitized extent may result in splitting the uninitialized + * extent into multiple /intialized unintialized extents (up to three) + * There are three possibilities: + * a> There is no split required: Entire extent should be uninitialized + * b> Splits in two extents: Write is happening at either end of the extent + * c> Splits in three extents: Somone is writing in middle of the extent + * + * One of more index blocks maybe needed if the extent tree grow after + * the unintialized extent split. To prevent ENOSPC occur at the IO + * complete, we need to split the uninitialized extent before DIO submit + * the IO. The uninitilized extent called at this time will be split + * into three uninitialized extent(at most). After IO complete, the part + * being filled will be convert to initialized by the end_io callback function + * via ext4_convert_unwritten_extents(). + * + * Returns the size of uninitialized extent to be written on success. + */ +static int ext4_split_unwritten_extents(handle_t *handle, + struct inode *inode, + struct ext4_ext_path *path, + ext4_lblk_t iblock, + unsigned int max_blocks, + int flags) +{ + struct ext4_extent *ex, newex, orig_ex; + struct ext4_extent *ex1 = NULL; + struct ext4_extent *ex2 = NULL; + struct ext4_extent *ex3 = NULL; + struct ext4_extent_header *eh; + ext4_lblk_t ee_block; + unsigned int allocated, ee_len, depth; + ext4_fsblk_t newblock; + int err = 0; + + ext_debug("ext4_split_unwritten_extents: inode %lu," + "iblock %llu, max_blocks %u\n", inode->i_ino, + (unsigned long long)iblock, max_blocks); + depth = ext_depth(inode); + eh = path[depth].p_hdr; + ex = path[depth].p_ext; + ee_block = le32_to_cpu(ex->ee_block); + ee_len = ext4_ext_get_actual_len(ex); + allocated = ee_len - (iblock - ee_block); + newblock = iblock - ee_block + ext_pblock(ex); + ex2 = ex; + orig_ex.ee_block = ex->ee_block; + orig_ex.ee_len = cpu_to_le16(ee_len); + ext4_ext_store_pblock(&orig_ex, ext_pblock(ex)); + + /* + * If the uninitialized extent begins at the same logical + * block where the write begins, and the write completely + * covers the extent, then we don't need to split it. + */ + if ((iblock == ee_block) && (allocated <= max_blocks)) + return allocated; + + err = ext4_ext_get_access(handle, inode, path + depth); + if (err) + goto out; + /* ex1: ee_block to iblock - 1 : uninitialized */ + if (iblock > ee_block) { + ex1 = ex; + ex1->ee_len = cpu_to_le16(iblock - ee_block); + ext4_ext_mark_uninitialized(ex1); + ex2 = &newex; + } + /* + * for sanity, update the length of the ex2 extent before + * we insert ex3, if ex1 is NULL. This is to avoid temporary + * overlap of blocks. + */ + if (!ex1 && allocated > max_blocks) + ex2->ee_len = cpu_to_le16(max_blocks); + /* ex3: to ee_block + ee_len : uninitialised */ + if (allocated > max_blocks) { + unsigned int newdepth; + ex3 = &newex; + ex3->ee_block = cpu_to_le32(iblock + max_blocks); + ext4_ext_store_pblock(ex3, newblock + max_blocks); + ex3->ee_len = cpu_to_le16(allocated - max_blocks); + ext4_ext_mark_uninitialized(ex3); + err = ext4_ext_insert_extent(handle, inode, path, ex3, flags); + if (err == -ENOSPC) { + err = ext4_ext_zeroout(inode, &orig_ex); + if (err) + goto fix_extent_len; + /* update the extent length and mark as initialized */ + ex->ee_block = orig_ex.ee_block; + ex->ee_len = orig_ex.ee_len; + ext4_ext_store_pblock(ex, ext_pblock(&orig_ex)); + ext4_ext_dirty(handle, inode, path + depth); + /* zeroed the full extent */ + /* blocks available from iblock */ + return allocated; + + } else if (err) + goto fix_extent_len; + /* + * The depth, and hence eh & ex might change + * as part of the insert above. + */ + newdepth = ext_depth(inode); + /* + * update the extent length after successful insert of the + * split extent + */ + orig_ex.ee_len = cpu_to_le16(ee_len - + ext4_ext_get_actual_len(ex3)); + depth = newdepth; + ext4_ext_drop_refs(path); + path = ext4_ext_find_extent(inode, iblock, path); + if (IS_ERR(path)) { + err = PTR_ERR(path); + goto out; + } + eh = path[depth].p_hdr; + ex = path[depth].p_ext; + if (ex2 != &newex) + ex2 = ex; + + err = ext4_ext_get_access(handle, inode, path + depth); + if (err) + goto out; + + allocated = max_blocks; + } + /* + * If there was a change of depth as part of the + * insertion of ex3 above, we need to update the length + * of the ex1 extent again here + */ + if (ex1 && ex1 != ex) { + ex1 = ex; + ex1->ee_len = cpu_to_le16(iblock - ee_block); + ext4_ext_mark_uninitialized(ex1); + ex2 = &newex; + } + /* + * ex2: iblock to iblock + maxblocks-1 : to be direct IO written, + * uninitialised still. + */ + ex2->ee_block = cpu_to_le32(iblock); + ext4_ext_store_pblock(ex2, newblock); + ex2->ee_len = cpu_to_le16(allocated); + ext4_ext_mark_uninitialized(ex2); + if (ex2 != ex) + goto insert; + /* Mark modified extent as dirty */ + err = ext4_ext_dirty(handle, inode, path + depth); + ext_debug("out here\n"); + goto out; +insert: + err = ext4_ext_insert_extent(handle, inode, path, &newex, flags); if (err == -ENOSPC) { err = ext4_ext_zeroout(inode, &orig_ex); if (err) @@ -2743,6 +2940,7 @@ insert: } else if (err) goto fix_extent_len; out: + ext4_ext_show_leaf(inode, path); return err ? err : allocated; fix_extent_len: @@ -2753,7 +2951,151 @@ fix_extent_len: ext4_ext_dirty(handle, inode, path + depth); return err; } +static int ext4_convert_unwritten_extents_dio(handle_t *handle, + struct inode *inode, + struct ext4_ext_path *path) +{ + struct ext4_extent *ex; + struct ext4_extent_header *eh; + int depth; + int err = 0; + int ret = 0; + + depth = ext_depth(inode); + eh = path[depth].p_hdr; + ex = path[depth].p_ext; + + err = ext4_ext_get_access(handle, inode, path + depth); + if (err) + goto out; + /* first mark the extent as initialized */ + ext4_ext_mark_initialized(ex); + + /* + * We have to see if it can be merged with the extent + * on the left. + */ + if (ex > EXT_FIRST_EXTENT(eh)) { + /* + * To merge left, pass "ex - 1" to try_to_merge(), + * since it merges towards right _only_. + */ + ret = ext4_ext_try_to_merge(inode, path, ex - 1); + if (ret) { + err = ext4_ext_correct_indexes(handle, inode, path); + if (err) + goto out; + depth = ext_depth(inode); + ex--; + } + } + /* + * Try to Merge towards right. + */ + ret = ext4_ext_try_to_merge(inode, path, ex); + if (ret) { + err = ext4_ext_correct_indexes(handle, inode, path); + if (err) + goto out; + depth = ext_depth(inode); + } + /* Mark modified extent as dirty */ + err = ext4_ext_dirty(handle, inode, path + depth); +out: + ext4_ext_show_leaf(inode, path); + return err; +} + +static int +ext4_ext_handle_uninitialized_extents(handle_t *handle, struct inode *inode, + ext4_lblk_t iblock, unsigned int max_blocks, + struct ext4_ext_path *path, int flags, + unsigned int allocated, struct buffer_head *bh_result, + ext4_fsblk_t newblock) +{ + int ret = 0; + int err = 0; + ext4_io_end_t *io = EXT4_I(inode)->cur_aio_dio; + + ext_debug("ext4_ext_handle_uninitialized_extents: inode %lu, logical" + "block %llu, max_blocks %u, flags %d, allocated %u", + inode->i_ino, (unsigned long long)iblock, max_blocks, + flags, allocated); + ext4_ext_show_leaf(inode, path); + /* DIO get_block() before submit the IO, split the extent */ + if (flags == EXT4_GET_BLOCKS_DIO_CREATE_EXT) { + ret = ext4_split_unwritten_extents(handle, + inode, path, iblock, + max_blocks, flags); + /* + * Flag the inode(non aio case) or end_io struct (aio case) + * that this IO needs to convertion to written when IO is + * completed + */ + if (io) + io->flag = DIO_AIO_UNWRITTEN; + else + EXT4_I(inode)->i_state |= EXT4_STATE_DIO_UNWRITTEN; + goto out; + } + /* async DIO end_io complete, convert the filled extent to written */ + if (flags == EXT4_GET_BLOCKS_DIO_CONVERT_EXT) { + ret = ext4_convert_unwritten_extents_dio(handle, inode, + path); + if (ret >= 0) + ext4_update_inode_fsync_trans(handle, inode, 1); + goto out2; + } + /* buffered IO case */ + /* + * repeat fallocate creation request + * we already have an unwritten extent + */ + if (flags & EXT4_GET_BLOCKS_UNINIT_EXT) + goto map_out; + + /* buffered READ or buffered write_begin() lookup */ + if ((flags & EXT4_GET_BLOCKS_CREATE) == 0) { + /* + * We have blocks reserved already. We + * return allocated blocks so that delalloc + * won't do block reservation for us. But + * the buffer head will be unmapped so that + * a read from the block returns 0s. + */ + set_buffer_unwritten(bh_result); + goto out1; + } + + /* buffered write, writepage time, convert*/ + ret = ext4_ext_convert_to_initialized(handle, inode, + path, iblock, + max_blocks); + if (ret >= 0) + ext4_update_inode_fsync_trans(handle, inode, 1); +out: + if (ret <= 0) { + err = ret; + goto out2; + } else + allocated = ret; + set_buffer_new(bh_result); +map_out: + set_buffer_mapped(bh_result); +out1: + if (allocated > max_blocks) + allocated = max_blocks; + ext4_ext_show_leaf(inode, path); + bh_result->b_bdev = inode->i_sb->s_bdev; + bh_result->b_blocknr = newblock; +out2: + if (path) { + ext4_ext_drop_refs(path); + kfree(path); + } + return err ? err : allocated; +} /* * Block allocation/map/preallocation routine for extents based files * @@ -2784,6 +3126,7 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, int err = 0, depth, ret, cache_type; unsigned int allocated = 0; struct ext4_allocation_request ar; + ext4_io_end_t *io = EXT4_I(inode)->cur_aio_dio; __clear_bit(BH_New, &bh_result->b_state); ext_debug("blocks %u/%u requested for inode %u\n", @@ -2859,33 +3202,10 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, EXT4_EXT_CACHE_EXTENT); goto out; } - if (flags & EXT4_GET_BLOCKS_UNINIT_EXT) - goto out; - if ((flags & EXT4_GET_BLOCKS_CREATE) == 0) { - if (allocated > max_blocks) - allocated = max_blocks; - /* - * We have blocks reserved already. We - * return allocated blocks so that delalloc - * won't do block reservation for us. But - * the buffer head will be unmapped so that - * a read from the block returns 0s. - */ - set_buffer_unwritten(bh_result); - bh_result->b_bdev = inode->i_sb->s_bdev; - bh_result->b_blocknr = newblock; - goto out2; - } - - ret = ext4_ext_convert_to_initialized(handle, inode, - path, iblock, - max_blocks); - if (ret <= 0) { - err = ret; - goto out2; - } else - allocated = ret; - goto outnew; + ret = ext4_ext_handle_uninitialized_extents(handle, + inode, iblock, max_blocks, path, + flags, allocated, bh_result, newblock); + return ret; } } @@ -2956,9 +3276,27 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, /* try to insert new extent into found leaf and return */ ext4_ext_store_pblock(&newex, newblock); newex.ee_len = cpu_to_le16(ar.len); - if (flags & EXT4_GET_BLOCKS_UNINIT_EXT) /* Mark uninitialized */ + /* Mark uninitialized */ + if (flags & EXT4_GET_BLOCKS_UNINIT_EXT){ ext4_ext_mark_uninitialized(&newex); - err = ext4_ext_insert_extent(handle, inode, path, &newex); + /* + * io_end structure was created for every async + * direct IO write to the middle of the file. + * To avoid unecessary convertion for every aio dio rewrite + * to the mid of file, here we flag the IO that is really + * need the convertion. + * For non asycn direct IO case, flag the inode state + * that we need to perform convertion when IO is done. + */ + if (flags == EXT4_GET_BLOCKS_DIO_CREATE_EXT) { + if (io) + io->flag = DIO_AIO_UNWRITTEN; + else + EXT4_I(inode)->i_state |= + EXT4_STATE_DIO_UNWRITTEN;; + } + } + err = ext4_ext_insert_extent(handle, inode, path, &newex, flags); if (err) { /* free data blocks we just allocated */ /* not a good idea to call discard here directly, @@ -2972,13 +3310,18 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, /* previous routine could use block we allocated */ newblock = ext_pblock(&newex); allocated = ext4_ext_get_actual_len(&newex); -outnew: set_buffer_new(bh_result); - /* Cache only when it is _not_ an uninitialized extent */ - if ((flags & EXT4_GET_BLOCKS_UNINIT_EXT) == 0) + /* + * Cache the extent and update transaction to commit on fdatasync only + * when it is _not_ an uninitialized extent. + */ + if ((flags & EXT4_GET_BLOCKS_UNINIT_EXT) == 0) { ext4_ext_put_in_cache(inode, iblock, allocated, newblock, EXT4_EXT_CACHE_EXTENT); + ext4_update_inode_fsync_trans(handle, inode, 1); + } else + ext4_update_inode_fsync_trans(handle, inode, 0); out: if (allocated > max_blocks) allocated = max_blocks; @@ -3171,6 +3514,64 @@ retry: } /* + * This function convert a range of blocks to written extents + * The caller of this function will pass the start offset and the size. + * all unwritten extents within this range will be converted to + * written extents. + * + * This function is called from the direct IO end io call back + * function, to convert the fallocated extents after IO is completed. + * Returns 0 on success. + */ +int ext4_convert_unwritten_extents(struct inode *inode, loff_t offset, + loff_t len) +{ + handle_t *handle; + ext4_lblk_t block; + unsigned int max_blocks; + int ret = 0; + int ret2 = 0; + struct buffer_head map_bh; + unsigned int credits, blkbits = inode->i_blkbits; + + block = offset >> blkbits; + /* + * We can't just convert len to max_blocks because + * If blocksize = 4096 offset = 3072 and len = 2048 + */ + max_blocks = (EXT4_BLOCK_ALIGN(len + offset, blkbits) >> blkbits) + - block; + /* + * credits to insert 1 extent into extent tree + */ + credits = ext4_chunk_trans_blocks(inode, max_blocks); + while (ret >= 0 && ret < max_blocks) { + block = block + ret; + max_blocks = max_blocks - ret; + handle = ext4_journal_start(inode, credits); + if (IS_ERR(handle)) { + ret = PTR_ERR(handle); + break; + } + map_bh.b_state = 0; + ret = ext4_get_blocks(handle, inode, block, + max_blocks, &map_bh, + EXT4_GET_BLOCKS_DIO_CONVERT_EXT); + if (ret <= 0) { + WARN_ON(ret <= 0); + printk(KERN_ERR "%s: ext4_ext_get_blocks " + "returned error inode#%lu, block=%u, " + "max_blocks=%u", __func__, + inode->i_ino, block, max_blocks); + } + ext4_mark_inode_dirty(handle, inode); + ret2 = ext4_journal_stop(handle); + if (ret <= 0 || ret2 ) + break; + } + return ret > 0 ? ret2 : ret; +} +/* * Callback function called for each extent to gather FIEMAP information. */ static int ext4_ext_fiemap_cb(struct inode *inode, struct ext4_ext_path *path, @@ -3308,10 +3709,8 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, * Walk the extent tree gathering extent information. * ext4_ext_fiemap_cb will push extents back to user. */ - down_read(&EXT4_I(inode)->i_data_sem); error = ext4_ext_walk_space(inode, start_blk, len_blks, ext4_ext_fiemap_cb, fieinfo); - up_read(&EXT4_I(inode)->i_data_sem); } return error; diff --git a/fs/ext4/fsync.c b/fs/ext4/fsync.c index 83cf6415f599..d6049e40b161 100644 --- a/fs/ext4/fsync.c +++ b/fs/ext4/fsync.c @@ -44,27 +44,37 @@ * * What we do is just kick off a commit and wait on it. This will snapshot the * inode to disk. + * + * i_mutex lock is held when entering and exiting this function */ int ext4_sync_file(struct file *file, struct dentry *dentry, int datasync) { struct inode *inode = dentry->d_inode; + struct ext4_inode_info *ei = EXT4_I(inode); journal_t *journal = EXT4_SB(inode->i_sb)->s_journal; - int ret = 0; + int ret; + tid_t commit_tid; J_ASSERT(ext4_journal_current_handle() == NULL); trace_ext4_sync_file(file, dentry, datasync); + if (inode->i_sb->s_flags & MS_RDONLY) + return 0; + + ret = flush_aio_dio_completed_IO(inode); + if (ret < 0) + return ret; + + if (!journal) + return simple_fsync(file, dentry, datasync); + /* - * data=writeback: + * data=writeback,ordered: * The caller's filemap_fdatawrite()/wait will sync the data. - * sync_inode() will sync the metadata - * - * data=ordered: - * The caller's filemap_fdatawrite() will write the data and - * sync_inode() will write the inode if it is dirty. Then the caller's - * filemap_fdatawait() will wait on the pages. + * Metadata is in the journal, we wait for proper transaction to + * commit here. * * data=journal: * filemap_fdatawrite won't do anything (the buffers are clean). @@ -74,27 +84,13 @@ int ext4_sync_file(struct file *file, struct dentry *dentry, int datasync) * (they were dirtied by commit). But that's OK - the blocks are * safe in-journal, which is all fsync() needs to ensure. */ - if (ext4_should_journal_data(inode)) { - ret = ext4_force_commit(inode->i_sb); - goto out; - } - - if (datasync && !(inode->i_state & I_DIRTY_DATASYNC)) - goto out; + if (ext4_should_journal_data(inode)) + return ext4_force_commit(inode->i_sb); - /* - * The VFS has written the file data. If the inode is unaltered - * then we need not start a commit. - */ - if (inode->i_state & (I_DIRTY_SYNC|I_DIRTY_DATASYNC)) { - struct writeback_control wbc = { - .sync_mode = WB_SYNC_ALL, - .nr_to_write = 0, /* sys_fsync did this */ - }; - ret = sync_inode(inode, &wbc); - if (journal && (journal->j_flags & JBD2_BARRIER)) - blkdev_issue_flush(inode->i_sb->s_bdev, NULL); - } -out: + commit_tid = datasync ? ei->i_datasync_tid : ei->i_sync_tid; + if (jbd2_log_start_commit(journal, commit_tid)) + jbd2_log_wait_commit(journal, commit_tid); + else if (journal->j_flags & JBD2_BARRIER) + blkdev_issue_flush(inode->i_sb->s_bdev, NULL); return ret; } diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index f9c642b22efa..ef06da68dc88 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -37,6 +37,7 @@ #include <linux/namei.h> #include <linux/uio.h> #include <linux/bio.h> +#include <linux/workqueue.h> #include "ext4_jbd2.h" #include "xattr.h" @@ -192,11 +193,25 @@ static int try_to_extend_transaction(handle_t *handle, struct inode *inode) * so before we call here everything must be consistently dirtied against * this transaction. */ -static int ext4_journal_test_restart(handle_t *handle, struct inode *inode) +int ext4_truncate_restart_trans(handle_t *handle, struct inode *inode, + int nblocks) { + int ret; + + /* + * Drop i_data_sem to avoid deadlock with ext4_get_blocks At this + * moment, get_block can be called only for blocks inside i_size since + * page cache has been already dropped and writes are blocked by + * i_mutex. So we can safely drop the i_data_sem here. + */ BUG_ON(EXT4_JOURNAL(inode) == NULL); jbd_debug(2, "restarting handle %p\n", handle); - return ext4_journal_restart(handle, blocks_for_truncate(inode)); + up_write(&EXT4_I(inode)->i_data_sem); + ret = ext4_journal_restart(handle, blocks_for_truncate(inode)); + down_write(&EXT4_I(inode)->i_data_sem); + ext4_discard_preallocations(inode); + + return ret; } /* @@ -551,15 +566,21 @@ static ext4_fsblk_t ext4_find_near(struct inode *inode, Indirect *ind) * * Normally this function find the preferred place for block allocation, * returns it. + * Because this is only used for non-extent files, we limit the block nr + * to 32 bits. */ static ext4_fsblk_t ext4_find_goal(struct inode *inode, ext4_lblk_t block, Indirect *partial) { + ext4_fsblk_t goal; + /* * XXX need to get goal block from mballoc's data structures */ - return ext4_find_near(inode, partial); + goal = ext4_find_near(inode, partial); + goal = goal & EXT4_MAX_BLOCK_FILE_PHYS; + return goal; } /** @@ -640,6 +661,8 @@ static int ext4_alloc_blocks(handle_t *handle, struct inode *inode, if (*err) goto failed_out; + BUG_ON(current_block + count > EXT4_MAX_BLOCK_FILE_PHYS); + target -= count; /* allocate blocks for indirect blocks */ while (index < indirect_blks && count) { @@ -674,6 +697,7 @@ static int ext4_alloc_blocks(handle_t *handle, struct inode *inode, ar.flags = EXT4_MB_HINT_DATA; current_block = ext4_mb_new_blocks(handle, &ar, err); + BUG_ON(current_block + ar.len > EXT4_MAX_BLOCK_FILE_PHYS); if (*err && (target == blks)) { /* @@ -998,10 +1022,12 @@ static int ext4_ind_get_blocks(handle_t *handle, struct inode *inode, if (!err) err = ext4_splice_branch(handle, inode, iblock, partial, indirect_blks, count); - else + if (err) goto cleanup; set_buffer_new(bh_result); + + ext4_update_inode_fsync_trans(handle, inode, 1); got_it: map_bh(bh_result, inode->i_sb, le32_to_cpu(chain[depth-1].key)); if (count > blocks_to_boundary) @@ -1020,17 +1046,12 @@ out: return err; } -qsize_t ext4_get_reserved_space(struct inode *inode) +#ifdef CONFIG_QUOTA +qsize_t *ext4_get_reserved_space(struct inode *inode) { - unsigned long long total; - - spin_lock(&EXT4_I(inode)->i_block_reservation_lock); - total = EXT4_I(inode)->i_reserved_data_blocks + - EXT4_I(inode)->i_reserved_meta_blocks; - spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); - - return total; + return &EXT4_I(inode)->i_reserved_quota; } +#endif /* * Calculate the number of metadata blocks need to reserve * to allocate @blocks for non extent file based file @@ -1109,22 +1130,79 @@ static void ext4_da_update_reserve_space(struct inode *inode, int used) ext4_discard_preallocations(inode); } -static int check_block_validity(struct inode *inode, sector_t logical, - sector_t phys, int len) +static int check_block_validity(struct inode *inode, const char *msg, + sector_t logical, sector_t phys, int len) { if (!ext4_data_block_valid(EXT4_SB(inode->i_sb), phys, len)) { - ext4_error(inode->i_sb, "check_block_validity", + ext4_error(inode->i_sb, msg, "inode #%lu logical block %llu mapped to %llu " "(size %d)", inode->i_ino, (unsigned long long) logical, (unsigned long long) phys, len); - WARN_ON(1); return -EIO; } return 0; } /* + * Return the number of contiguous dirty pages in a given inode + * starting at page frame idx. + */ +static pgoff_t ext4_num_dirty_pages(struct inode *inode, pgoff_t idx, + unsigned int max_pages) +{ + struct address_space *mapping = inode->i_mapping; + pgoff_t index; + struct pagevec pvec; + pgoff_t num = 0; + int i, nr_pages, done = 0; + + if (max_pages == 0) + return 0; + pagevec_init(&pvec, 0); + while (!done) { + index = idx; + nr_pages = pagevec_lookup_tag(&pvec, mapping, &index, + PAGECACHE_TAG_DIRTY, + (pgoff_t)PAGEVEC_SIZE); + if (nr_pages == 0) + break; + for (i = 0; i < nr_pages; i++) { + struct page *page = pvec.pages[i]; + struct buffer_head *bh, *head; + + lock_page(page); + if (unlikely(page->mapping != mapping) || + !PageDirty(page) || + PageWriteback(page) || + page->index != idx) { + done = 1; + unlock_page(page); + break; + } + if (page_has_buffers(page)) { + bh = head = page_buffers(page); + do { + if (!buffer_delay(bh) && + !buffer_unwritten(bh)) + done = 1; + bh = bh->b_this_page; + } while (!done && (bh != head)); + } + unlock_page(page); + if (done) + break; + idx++; + num++; + if (num >= max_pages) + break; + } + pagevec_release(&pvec); + } + return num; +} + +/* * The ext4_get_blocks() function tries to look up the requested blocks, * and returns if the blocks are already mapped. * @@ -1155,6 +1233,9 @@ int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block, clear_buffer_mapped(bh); clear_buffer_unwritten(bh); + ext_debug("ext4_get_blocks(): inode %lu, flag %d, max_blocks %u," + "logical block %lu\n", inode->i_ino, flags, max_blocks, + (unsigned long)block); /* * Try to see if we can get the block without requesting a new * file system block. @@ -1170,8 +1251,8 @@ int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block, up_read((&EXT4_I(inode)->i_data_sem)); if (retval > 0 && buffer_mapped(bh)) { - int ret = check_block_validity(inode, block, - bh->b_blocknr, retval); + int ret = check_block_validity(inode, "file system corruption", + block, bh->b_blocknr, retval); if (ret != 0) return ret; } @@ -1235,8 +1316,7 @@ int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block, * i_data's format changing. Force the migrate * to fail by clearing migrate flags */ - EXT4_I(inode)->i_flags = EXT4_I(inode)->i_flags & - ~EXT4_EXT_MIGRATE; + EXT4_I(inode)->i_state &= ~EXT4_STATE_EXT_MIGRATE; } } @@ -1252,8 +1332,9 @@ int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block, up_write((&EXT4_I(inode)->i_data_sem)); if (retval > 0 && buffer_mapped(bh)) { - int ret = check_block_validity(inode, block, - bh->b_blocknr, retval); + int ret = check_block_validity(inode, "file system " + "corruption after allocation", + block, bh->b_blocknr, retval); if (ret != 0) return ret; } @@ -1451,6 +1532,16 @@ static int do_journal_get_write_access(handle_t *handle, return ext4_journal_get_write_access(handle, bh); } +/* + * Truncate blocks that were not used by write. We have to truncate the + * pagecache as well so that corresponding buffers get properly unmapped. + */ +static void ext4_truncate_failed_write(struct inode *inode) +{ + truncate_inode_pages(inode->i_mapping, inode->i_size); + ext4_truncate(inode); +} + static int ext4_write_begin(struct file *file, struct address_space *mapping, loff_t pos, unsigned len, unsigned flags, struct page **pagep, void **fsdata) @@ -1516,7 +1607,7 @@ retry: ext4_journal_stop(handle); if (pos + len > inode->i_size) { - ext4_truncate(inode); + ext4_truncate_failed_write(inode); /* * If truncate failed early the inode might * still be on the orphan list; we need to @@ -1626,7 +1717,7 @@ static int ext4_ordered_write_end(struct file *file, ret = ret2; if (pos + len > inode->i_size) { - ext4_truncate(inode); + ext4_truncate_failed_write(inode); /* * If truncate failed early the inode might still be * on the orphan list; we need to make sure the inode @@ -1668,7 +1759,7 @@ static int ext4_writeback_write_end(struct file *file, ret = ret2; if (pos + len > inode->i_size) { - ext4_truncate(inode); + ext4_truncate_failed_write(inode); /* * If truncate failed early the inode might still be * on the orphan list; we need to make sure the inode @@ -1731,7 +1822,7 @@ static int ext4_journalled_write_end(struct file *file, if (!ret) ret = ret2; if (pos + len > inode->i_size) { - ext4_truncate(inode); + ext4_truncate_failed_write(inode); /* * If truncate failed early the inode might still be * on the orphan list; we need to make sure the inode @@ -1763,30 +1854,29 @@ repeat: md_needed = mdblocks - EXT4_I(inode)->i_reserved_meta_blocks; total = md_needed + nrblocks; + spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); /* * Make quota reservation here to prevent quota overflow * later. Real quota accounting is done at pages writeout * time. */ - if (vfs_dq_reserve_block(inode, total)) { - spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); + if (vfs_dq_reserve_block(inode, total)) return -EDQUOT; - } if (ext4_claim_free_blocks(sbi, total)) { - spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); + vfs_dq_release_reservation_block(inode, total); if (ext4_should_retry_alloc(inode->i_sb, &retries)) { yield(); goto repeat; } - vfs_dq_release_reservation_block(inode, total); return -ENOSPC; } + spin_lock(&EXT4_I(inode)->i_block_reservation_lock); EXT4_I(inode)->i_reserved_data_blocks += nrblocks; - EXT4_I(inode)->i_reserved_meta_blocks = mdblocks; - + EXT4_I(inode)->i_reserved_meta_blocks += md_needed; spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); + return 0; /* success */ } @@ -1860,22 +1950,6 @@ static void ext4_da_page_release_reservation(struct page *page, } /* - * Delayed allocation stuff - */ - -struct mpage_da_data { - struct inode *inode; - sector_t b_blocknr; /* start block number of extent */ - size_t b_size; /* size of extent */ - unsigned long b_state; /* state of the extent */ - unsigned long first_page, next_page; /* extent of pages */ - struct writeback_control *wbc; - int io_done; - int pages_written; - int retval; -}; - -/* * mpage_da_submit_io - walks through extent of pages and try to write * them with writepage() call back * @@ -2717,7 +2791,7 @@ static int ext4_da_writepages_trans_blocks(struct inode *inode) * number of contiguous block. So we will limit * number of contiguous block to a sane value */ - if (!(inode->i_flags & EXT4_EXTENTS_FL) && + if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) && (max_blocks > EXT4_MAX_TRANS_DATA)) max_blocks = EXT4_MAX_TRANS_DATA; @@ -2735,8 +2809,11 @@ static int ext4_da_writepages(struct address_space *mapping, int no_nrwrite_index_update; int pages_written = 0; long pages_skipped; + unsigned int max_pages; int range_cyclic, cycled = 1, io_done = 0; - int needed_blocks, ret = 0, nr_to_writebump = 0; + int needed_blocks, ret = 0; + long desired_nr_to_write, nr_to_writebump = 0; + loff_t range_start = wbc->range_start; struct ext4_sb_info *sbi = EXT4_SB(mapping->host->i_sb); trace_ext4_da_writepages(inode, wbc); @@ -2762,16 +2839,6 @@ static int ext4_da_writepages(struct address_space *mapping, if (unlikely(sbi->s_mount_flags & EXT4_MF_FS_ABORTED)) return -EROFS; - /* - * Make sure nr_to_write is >= sbi->s_mb_stream_request - * This make sure small files blocks are allocated in - * single attempt. This ensure that small files - * get less fragmented. - */ - if (wbc->nr_to_write < sbi->s_mb_stream_request) { - nr_to_writebump = sbi->s_mb_stream_request - wbc->nr_to_write; - wbc->nr_to_write = sbi->s_mb_stream_request; - } if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) range_whole = 1; @@ -2786,6 +2853,36 @@ static int ext4_da_writepages(struct address_space *mapping, } else index = wbc->range_start >> PAGE_CACHE_SHIFT; + /* + * This works around two forms of stupidity. The first is in + * the writeback code, which caps the maximum number of pages + * written to be 1024 pages. This is wrong on multiple + * levels; different architectues have a different page size, + * which changes the maximum amount of data which gets + * written. Secondly, 4 megabytes is way too small. XFS + * forces this value to be 16 megabytes by multiplying + * nr_to_write parameter by four, and then relies on its + * allocator to allocate larger extents to make them + * contiguous. Unfortunately this brings us to the second + * stupidity, which is that ext4's mballoc code only allocates + * at most 2048 blocks. So we force contiguous writes up to + * the number of dirty blocks in the inode, or + * sbi->max_writeback_mb_bump whichever is smaller. + */ + max_pages = sbi->s_max_writeback_mb_bump << (20 - PAGE_CACHE_SHIFT); + if (!range_cyclic && range_whole) + desired_nr_to_write = wbc->nr_to_write * 8; + else + desired_nr_to_write = ext4_num_dirty_pages(inode, index, + max_pages); + if (desired_nr_to_write > max_pages) + desired_nr_to_write = max_pages; + + if (wbc->nr_to_write < desired_nr_to_write) { + nr_to_writebump = desired_nr_to_write - wbc->nr_to_write; + wbc->nr_to_write = desired_nr_to_write; + } + mpd.wbc = wbc; mpd.inode = mapping->host; @@ -2904,7 +3001,9 @@ retry: out_writepages: if (!no_nrwrite_index_update) wbc->no_nrwrite_index_update = 0; - wbc->nr_to_write -= nr_to_writebump; + if (wbc->nr_to_write > nr_to_writebump) + wbc->nr_to_write -= nr_to_writebump; + wbc->range_start = range_start; trace_ext4_da_writepages_result(inode, wbc, ret, pages_written); return ret; } @@ -2994,7 +3093,7 @@ retry: * i_size_read because we hold i_mutex. */ if (pos + len > inode->i_size) - ext4_truncate(inode); + ext4_truncate_failed_write(inode); } if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) @@ -3259,6 +3358,8 @@ static int ext4_releasepage(struct page *page, gfp_t wait) } /* + * O_DIRECT for ext3 (or indirect map) based files + * * If the O_DIRECT write will extend the file then add this inode to the * orphan list. So recovery will truncate it back to the original size * if the machine crashes during the write. @@ -3267,7 +3368,7 @@ static int ext4_releasepage(struct page *page, gfp_t wait) * crashes then stale disk data _may_ be exposed inside the file. But current * VFS code falls back into buffered path in that case so we are safe. */ -static ssize_t ext4_direct_IO(int rw, struct kiocb *iocb, +static ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, loff_t offset, unsigned long nr_segs) { @@ -3278,6 +3379,7 @@ static ssize_t ext4_direct_IO(int rw, struct kiocb *iocb, ssize_t ret; int orphan = 0; size_t count = iov_length(iov, nr_segs); + int retries = 0; if (rw == WRITE) { loff_t final_size = offset + count; @@ -3300,9 +3402,12 @@ static ssize_t ext4_direct_IO(int rw, struct kiocb *iocb, } } +retry: ret = blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov, offset, nr_segs, ext4_get_block, NULL); + if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) + goto retry; if (orphan) { int err; @@ -3341,6 +3446,364 @@ out: return ret; } +static int ext4_get_block_dio_write(struct inode *inode, sector_t iblock, + struct buffer_head *bh_result, int create) +{ + handle_t *handle = NULL; + int ret = 0; + unsigned max_blocks = bh_result->b_size >> inode->i_blkbits; + int dio_credits; + + ext4_debug("ext4_get_block_dio_write: inode %lu, create flag %d\n", + inode->i_ino, create); + /* + * DIO VFS code passes create = 0 flag for write to + * the middle of file. It does this to avoid block + * allocation for holes, to prevent expose stale data + * out when there is parallel buffered read (which does + * not hold the i_mutex lock) while direct IO write has + * not completed. DIO request on holes finally falls back + * to buffered IO for this reason. + * + * For ext4 extent based file, since we support fallocate, + * new allocated extent as uninitialized, for holes, we + * could fallocate blocks for holes, thus parallel + * buffered IO read will zero out the page when read on + * a hole while parallel DIO write to the hole has not completed. + * + * when we come here, we know it's a direct IO write to + * to the middle of file (<i_size) + * so it's safe to override the create flag from VFS. + */ + create = EXT4_GET_BLOCKS_DIO_CREATE_EXT; + + if (max_blocks > DIO_MAX_BLOCKS) + max_blocks = DIO_MAX_BLOCKS; + dio_credits = ext4_chunk_trans_blocks(inode, max_blocks); + handle = ext4_journal_start(inode, dio_credits); + if (IS_ERR(handle)) { + ret = PTR_ERR(handle); + goto out; + } + ret = ext4_get_blocks(handle, inode, iblock, max_blocks, bh_result, + create); + if (ret > 0) { + bh_result->b_size = (ret << inode->i_blkbits); + ret = 0; + } + ext4_journal_stop(handle); +out: + return ret; +} + +static void ext4_free_io_end(ext4_io_end_t *io) +{ + BUG_ON(!io); + iput(io->inode); + kfree(io); +} +static void dump_aio_dio_list(struct inode * inode) +{ +#ifdef EXT4_DEBUG + struct list_head *cur, *before, *after; + ext4_io_end_t *io, *io0, *io1; + + if (list_empty(&EXT4_I(inode)->i_aio_dio_complete_list)){ + ext4_debug("inode %lu aio dio list is empty\n", inode->i_ino); + return; + } + + ext4_debug("Dump inode %lu aio_dio_completed_IO list \n", inode->i_ino); + list_for_each_entry(io, &EXT4_I(inode)->i_aio_dio_complete_list, list){ + cur = &io->list; + before = cur->prev; + io0 = container_of(before, ext4_io_end_t, list); + after = cur->next; + io1 = container_of(after, ext4_io_end_t, list); + + ext4_debug("io 0x%p from inode %lu,prev 0x%p,next 0x%p\n", + io, inode->i_ino, io0, io1); + } +#endif +} + +/* + * check a range of space and convert unwritten extents to written. + */ +static int ext4_end_aio_dio_nolock(ext4_io_end_t *io) +{ + struct inode *inode = io->inode; + loff_t offset = io->offset; + size_t size = io->size; + int ret = 0; + + ext4_debug("end_aio_dio_onlock: io 0x%p from inode %lu,list->next 0x%p," + "list->prev 0x%p\n", + io, inode->i_ino, io->list.next, io->list.prev); + + if (list_empty(&io->list)) + return ret; + + if (io->flag != DIO_AIO_UNWRITTEN) + return ret; + + if (offset + size <= i_size_read(inode)) + ret = ext4_convert_unwritten_extents(inode, offset, size); + + if (ret < 0) { + printk(KERN_EMERG "%s: failed to convert unwritten" + "extents to written extents, error is %d" + " io is still on inode %lu aio dio list\n", + __func__, ret, inode->i_ino); + return ret; + } + + /* clear the DIO AIO unwritten flag */ + io->flag = 0; + return ret; +} +/* + * work on completed aio dio IO, to convert unwritten extents to extents + */ +static void ext4_end_aio_dio_work(struct work_struct *work) +{ + ext4_io_end_t *io = container_of(work, ext4_io_end_t, work); + struct inode *inode = io->inode; + int ret = 0; + + mutex_lock(&inode->i_mutex); + ret = ext4_end_aio_dio_nolock(io); + if (ret >= 0) { + if (!list_empty(&io->list)) + list_del_init(&io->list); + ext4_free_io_end(io); + } + mutex_unlock(&inode->i_mutex); +} +/* + * This function is called from ext4_sync_file(). + * + * When AIO DIO IO is completed, the work to convert unwritten + * extents to written is queued on workqueue but may not get immediately + * scheduled. When fsync is called, we need to ensure the + * conversion is complete before fsync returns. + * The inode keeps track of a list of completed AIO from DIO path + * that might needs to do the conversion. This function walks through + * the list and convert the related unwritten extents to written. + */ +int flush_aio_dio_completed_IO(struct inode *inode) +{ + ext4_io_end_t *io; + int ret = 0; + int ret2 = 0; + + if (list_empty(&EXT4_I(inode)->i_aio_dio_complete_list)) + return ret; + + dump_aio_dio_list(inode); + while (!list_empty(&EXT4_I(inode)->i_aio_dio_complete_list)){ + io = list_entry(EXT4_I(inode)->i_aio_dio_complete_list.next, + ext4_io_end_t, list); + /* + * Calling ext4_end_aio_dio_nolock() to convert completed + * IO to written. + * + * When ext4_sync_file() is called, run_queue() may already + * about to flush the work corresponding to this io structure. + * It will be upset if it founds the io structure related + * to the work-to-be schedule is freed. + * + * Thus we need to keep the io structure still valid here after + * convertion finished. The io structure has a flag to + * avoid double converting from both fsync and background work + * queue work. + */ + ret = ext4_end_aio_dio_nolock(io); + if (ret < 0) + ret2 = ret; + else + list_del_init(&io->list); + } + return (ret2 < 0) ? ret2 : 0; +} + +static ext4_io_end_t *ext4_init_io_end (struct inode *inode) +{ + ext4_io_end_t *io = NULL; + + io = kmalloc(sizeof(*io), GFP_NOFS); + + if (io) { + igrab(inode); + io->inode = inode; + io->flag = 0; + io->offset = 0; + io->size = 0; + io->error = 0; + INIT_WORK(&io->work, ext4_end_aio_dio_work); + INIT_LIST_HEAD(&io->list); + } + + return io; +} + +static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, + ssize_t size, void *private) +{ + ext4_io_end_t *io_end = iocb->private; + struct workqueue_struct *wq; + + /* if not async direct IO or dio with 0 bytes write, just return */ + if (!io_end || !size) + return; + + ext_debug("ext4_end_io_dio(): io_end 0x%p" + "for inode %lu, iocb 0x%p, offset %llu, size %llu\n", + iocb->private, io_end->inode->i_ino, iocb, offset, + size); + + /* if not aio dio with unwritten extents, just free io and return */ + if (io_end->flag != DIO_AIO_UNWRITTEN){ + ext4_free_io_end(io_end); + iocb->private = NULL; + return; + } + + io_end->offset = offset; + io_end->size = size; + wq = EXT4_SB(io_end->inode->i_sb)->dio_unwritten_wq; + + /* queue the work to convert unwritten extents to written */ + queue_work(wq, &io_end->work); + + /* Add the io_end to per-inode completed aio dio list*/ + list_add_tail(&io_end->list, + &EXT4_I(io_end->inode)->i_aio_dio_complete_list); + iocb->private = NULL; +} +/* + * For ext4 extent files, ext4 will do direct-io write to holes, + * preallocated extents, and those write extend the file, no need to + * fall back to buffered IO. + * + * For holes, we fallocate those blocks, mark them as unintialized + * If those blocks were preallocated, we mark sure they are splited, but + * still keep the range to write as unintialized. + * + * The unwrritten extents will be converted to written when DIO is completed. + * For async direct IO, since the IO may still pending when return, we + * set up an end_io call back function, which will do the convertion + * when async direct IO completed. + * + * If the O_DIRECT write will extend the file then add this inode to the + * orphan list. So recovery will truncate it back to the original size + * if the machine crashes during the write. + * + */ +static ssize_t ext4_ext_direct_IO(int rw, struct kiocb *iocb, + const struct iovec *iov, loff_t offset, + unsigned long nr_segs) +{ + struct file *file = iocb->ki_filp; + struct inode *inode = file->f_mapping->host; + ssize_t ret; + size_t count = iov_length(iov, nr_segs); + + loff_t final_size = offset + count; + if (rw == WRITE && final_size <= inode->i_size) { + /* + * We could direct write to holes and fallocate. + * + * Allocated blocks to fill the hole are marked as uninitialized + * to prevent paralel buffered read to expose the stale data + * before DIO complete the data IO. + * + * As to previously fallocated extents, ext4 get_block + * will just simply mark the buffer mapped but still + * keep the extents uninitialized. + * + * for non AIO case, we will convert those unwritten extents + * to written after return back from blockdev_direct_IO. + * + * for async DIO, the conversion needs to be defered when + * the IO is completed. The ext4 end_io callback function + * will be called to take care of the conversion work. + * Here for async case, we allocate an io_end structure to + * hook to the iocb. + */ + iocb->private = NULL; + EXT4_I(inode)->cur_aio_dio = NULL; + if (!is_sync_kiocb(iocb)) { + iocb->private = ext4_init_io_end(inode); + if (!iocb->private) + return -ENOMEM; + /* + * we save the io structure for current async + * direct IO, so that later ext4_get_blocks() + * could flag the io structure whether there + * is a unwritten extents needs to be converted + * when IO is completed. + */ + EXT4_I(inode)->cur_aio_dio = iocb->private; + } + + ret = blockdev_direct_IO(rw, iocb, inode, + inode->i_sb->s_bdev, iov, + offset, nr_segs, + ext4_get_block_dio_write, + ext4_end_io_dio); + if (iocb->private) + EXT4_I(inode)->cur_aio_dio = NULL; + /* + * The io_end structure takes a reference to the inode, + * that structure needs to be destroyed and the + * reference to the inode need to be dropped, when IO is + * complete, even with 0 byte write, or failed. + * + * In the successful AIO DIO case, the io_end structure will be + * desctroyed and the reference to the inode will be dropped + * after the end_io call back function is called. + * + * In the case there is 0 byte write, or error case, since + * VFS direct IO won't invoke the end_io call back function, + * we need to free the end_io structure here. + */ + if (ret != -EIOCBQUEUED && ret <= 0 && iocb->private) { + ext4_free_io_end(iocb->private); + iocb->private = NULL; + } else if (ret > 0 && (EXT4_I(inode)->i_state & + EXT4_STATE_DIO_UNWRITTEN)) { + int err; + /* + * for non AIO case, since the IO is already + * completed, we could do the convertion right here + */ + err = ext4_convert_unwritten_extents(inode, + offset, ret); + if (err < 0) + ret = err; + EXT4_I(inode)->i_state &= ~EXT4_STATE_DIO_UNWRITTEN; + } + return ret; + } + + /* for write the the end of file case, we fall back to old way */ + return ext4_ind_direct_IO(rw, iocb, iov, offset, nr_segs); +} + +static ssize_t ext4_direct_IO(int rw, struct kiocb *iocb, + const struct iovec *iov, loff_t offset, + unsigned long nr_segs) +{ + struct file *file = iocb->ki_filp; + struct inode *inode = file->f_mapping->host; + + if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) + return ext4_ext_direct_IO(rw, iocb, iov, offset, nr_segs); + + return ext4_ind_direct_IO(rw, iocb, iov, offset, nr_segs); +} + /* * Pages can be marked dirty completely asynchronously from ext4's journalling * activity. By filemap_sync_pte(), try_to_unmap_one(), etc. We cannot do @@ -3653,13 +4116,16 @@ static void ext4_clear_blocks(handle_t *handle, struct inode *inode, __le32 *last) { __le32 *p; + int is_metadata = S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode); + if (try_to_extend_transaction(handle, inode)) { if (bh) { BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata"); ext4_handle_dirty_metadata(handle, inode, bh); } ext4_mark_inode_dirty(handle, inode); - ext4_journal_test_restart(handle, inode); + ext4_truncate_restart_trans(handle, inode, + blocks_for_truncate(inode)); if (bh) { BUFFER_TRACE(bh, "retaking write access"); ext4_journal_get_write_access(handle, bh); @@ -3682,11 +4148,11 @@ static void ext4_clear_blocks(handle_t *handle, struct inode *inode, *p = 0; tbh = sb_find_get_block(inode->i_sb, nr); - ext4_forget(handle, 0, inode, tbh, nr); + ext4_forget(handle, is_metadata, inode, tbh, nr); } } - ext4_free_blocks(handle, inode, block_to_free, count, 0); + ext4_free_blocks(handle, inode, block_to_free, count, is_metadata); } /** @@ -3870,7 +4336,8 @@ static void ext4_free_branches(handle_t *handle, struct inode *inode, return; if (try_to_extend_transaction(handle, inode)) { ext4_mark_inode_dirty(handle, inode); - ext4_journal_test_restart(handle, inode); + ext4_truncate_restart_trans(handle, inode, + blocks_for_truncate(inode)); } ext4_free_blocks(handle, inode, nr, 1, 1); @@ -3958,8 +4425,7 @@ void ext4_truncate(struct inode *inode) if (!ext4_can_truncate(inode)) return; - if (ei->i_disksize && inode->i_size == 0 && - !test_opt(inode->i_sb, NO_AUTO_DA_ALLOC)) + if (inode->i_size == 0 && !test_opt(inode->i_sb, NO_AUTO_DA_ALLOC)) ei->i_state |= EXT4_STATE_DA_ALLOC_CLOSE; if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) { @@ -4313,8 +4779,8 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) struct ext4_iloc iloc; struct ext4_inode *raw_inode; struct ext4_inode_info *ei; - struct buffer_head *bh; struct inode *inode; + journal_t *journal = EXT4_SB(sb)->s_journal; long ret; int block; @@ -4325,11 +4791,11 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) return inode; ei = EXT4_I(inode); + iloc.bh = 0; ret = __ext4_get_inode_loc(inode, &iloc, 0); if (ret < 0) goto bad_inode; - bh = iloc.bh; raw_inode = ext4_raw_inode(&iloc); inode->i_mode = le16_to_cpu(raw_inode->i_mode); inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); @@ -4352,7 +4818,6 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) if (inode->i_mode == 0 || !(EXT4_SB(inode->i_sb)->s_mount_state & EXT4_ORPHAN_FS)) { /* this inode is deleted */ - brelse(bh); ret = -ESTALE; goto bad_inode; } @@ -4369,6 +4834,9 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) ((__u64)le16_to_cpu(raw_inode->i_file_acl_high)) << 32; inode->i_size = ext4_isize(raw_inode); ei->i_disksize = inode->i_size; +#ifdef CONFIG_QUOTA + ei->i_reserved_quota = 0; +#endif inode->i_generation = le32_to_cpu(raw_inode->i_generation); ei->i_block_group = iloc.block_group; ei->i_last_alloc_group = ~0; @@ -4380,11 +4848,35 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) ei->i_data[block] = raw_inode->i_block[block]; INIT_LIST_HEAD(&ei->i_orphan); + /* + * Set transaction id's of transactions that have to be committed + * to finish f[data]sync. We set them to currently running transaction + * as we cannot be sure that the inode or some of its metadata isn't + * part of the transaction - the inode could have been reclaimed and + * now it is reread from disk. + */ + if (journal) { + transaction_t *transaction; + tid_t tid; + + spin_lock(&journal->j_state_lock); + if (journal->j_running_transaction) + transaction = journal->j_running_transaction; + else + transaction = journal->j_committing_transaction; + if (transaction) + tid = transaction->t_tid; + else + tid = journal->j_commit_sequence; + spin_unlock(&journal->j_state_lock); + ei->i_sync_tid = tid; + ei->i_datasync_tid = tid; + } + if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { ei->i_extra_isize = le16_to_cpu(raw_inode->i_extra_isize); if (EXT4_GOOD_OLD_INODE_SIZE + ei->i_extra_isize > EXT4_INODE_SIZE(inode->i_sb)) { - brelse(bh); ret = -EIO; goto bad_inode; } @@ -4416,10 +4908,7 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) ret = 0; if (ei->i_file_acl && - ((ei->i_file_acl < - (le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block) + - EXT4_SB(sb)->s_gdb_count)) || - (ei->i_file_acl >= ext4_blocks_count(EXT4_SB(sb)->s_es)))) { + !ext4_data_block_valid(EXT4_SB(sb), ei->i_file_acl, 1)) { ext4_error(sb, __func__, "bad extended attribute block %llu in inode #%lu", ei->i_file_acl, inode->i_ino); @@ -4437,10 +4926,8 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) /* Validate block references which are part of inode */ ret = ext4_check_inode_blockref(inode); } - if (ret) { - brelse(bh); + if (ret) goto bad_inode; - } if (S_ISREG(inode->i_mode)) { inode->i_op = &ext4_file_inode_operations; @@ -4468,7 +4955,6 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) init_special_inode(inode, inode->i_mode, new_decode_dev(le32_to_cpu(raw_inode->i_block[1]))); } else { - brelse(bh); ret = -EIO; ext4_error(inode->i_sb, __func__, "bogus i_mode (%o) for inode=%lu", @@ -4481,6 +4967,7 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) return inode; bad_inode: + brelse(iloc.bh); iget_failed(inode); return ERR_PTR(ret); } @@ -4581,8 +5068,7 @@ static int ext4_do_update_inode(handle_t *handle, if (ext4_inode_blocks_set(handle, raw_inode, ei)) goto out_brelse; raw_inode->i_dtime = cpu_to_le32(ei->i_dtime); - /* clear the migrate flag in the raw_inode */ - raw_inode->i_flags = cpu_to_le32(ei->i_flags & ~EXT4_EXT_MIGRATE); + raw_inode->i_flags = cpu_to_le32(ei->i_flags); if (EXT4_SB(inode->i_sb)->s_es->s_creator_os != cpu_to_le32(EXT4_OS_HURD)) raw_inode->i_file_acl_high = @@ -4641,6 +5127,7 @@ static int ext4_do_update_inode(handle_t *handle, err = rc; ei->i_state &= ~EXT4_STATE_NEW; + ext4_update_inode_fsync_trans(handle, inode, 0); out_brelse: brelse(bh); ext4_std_error(inode->i_sb, err); @@ -4684,19 +5171,40 @@ out_brelse: */ int ext4_write_inode(struct inode *inode, int wait) { + int err; + if (current->flags & PF_MEMALLOC) return 0; - if (ext4_journal_current_handle()) { - jbd_debug(1, "called recursively, non-PF_MEMALLOC!\n"); - dump_stack(); - return -EIO; - } + if (EXT4_SB(inode->i_sb)->s_journal) { + if (ext4_journal_current_handle()) { + jbd_debug(1, "called recursively, non-PF_MEMALLOC!\n"); + dump_stack(); + return -EIO; + } - if (!wait) - return 0; + if (!wait) + return 0; - return ext4_force_commit(inode->i_sb); + err = ext4_force_commit(inode->i_sb); + } else { + struct ext4_iloc iloc; + + err = ext4_get_inode_loc(inode, &iloc); + if (err) + return err; + if (wait) + sync_dirty_buffer(iloc.bh); + if (buffer_req(iloc.bh) && !buffer_uptodate(iloc.bh)) { + ext4_error(inode->i_sb, __func__, + "IO error syncing inode, " + "inode=%lu, block=%llu", + inode->i_ino, + (unsigned long long)iloc.bh->b_blocknr); + err = -EIO; + } + } + return err; } /* @@ -4739,8 +5247,8 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) /* (user+group)*(old+new) structure, inode write (sb, * inode block, ? - but truncate inode update has it) */ - handle = ext4_journal_start(inode, 2*(EXT4_QUOTA_INIT_BLOCKS(inode->i_sb)+ - EXT4_QUOTA_DEL_BLOCKS(inode->i_sb))+3); + handle = ext4_journal_start(inode, (EXT4_MAXQUOTAS_INIT_BLOCKS(inode->i_sb)+ + EXT4_MAXQUOTAS_DEL_BLOCKS(inode->i_sb))+3); if (IS_ERR(handle)) { error = PTR_ERR(handle); goto err_out; @@ -5137,24 +5645,13 @@ void ext4_dirty_inode(struct inode *inode) handle_t *current_handle = ext4_journal_current_handle(); handle_t *handle; - if (!ext4_handle_valid(current_handle)) { - ext4_mark_inode_dirty(current_handle, inode); - return; - } - handle = ext4_journal_start(inode, 2); if (IS_ERR(handle)) goto out; - if (current_handle && - current_handle->h_transaction != handle->h_transaction) { - /* This task has a transaction open against a different fs */ - printk(KERN_EMERG "%s: transactions do not match!\n", - __func__); - } else { - jbd_debug(5, "marking dirty. outer handle=%p\n", - current_handle); - ext4_mark_inode_dirty(handle, inode); - } + + jbd_debug(5, "marking dirty. outer handle=%p\n", current_handle); + ext4_mark_inode_dirty(handle, inode); + ext4_journal_stop(handle); out: return; @@ -5281,12 +5778,21 @@ int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) else len = PAGE_CACHE_SIZE; + lock_page(page); + /* + * return if we have all the buffers mapped. This avoid + * the need to call write_begin/write_end which does a + * journal_start/journal_stop which can block and take + * long time + */ if (page_has_buffers(page)) { - /* return if we have all the buffers mapped */ if (!walk_page_buffers(NULL, page_buffers(page), 0, len, NULL, - ext4_bh_unmapped)) + ext4_bh_unmapped)) { + unlock_page(page); goto out_unlock; + } } + unlock_page(page); /* * OK, we need to fill the hole... Do write_begin write_end * to do block allocation/reservation.We are not holding diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c index 7050a9cd04a4..b63d193126db 100644 --- a/fs/ext4/ioctl.c +++ b/fs/ext4/ioctl.c @@ -221,32 +221,38 @@ setversion_out: struct file *donor_filp; int err; + if (!(filp->f_mode & FMODE_READ) || + !(filp->f_mode & FMODE_WRITE)) + return -EBADF; + if (copy_from_user(&me, (struct move_extent __user *)arg, sizeof(me))) return -EFAULT; + me.moved_len = 0; donor_filp = fget(me.donor_fd); if (!donor_filp) return -EBADF; - if (!capable(CAP_DAC_OVERRIDE)) { - if ((current->real_cred->fsuid != inode->i_uid) || - !(inode->i_mode & S_IRUSR) || - !(donor_filp->f_dentry->d_inode->i_mode & - S_IRUSR)) { - fput(donor_filp); - return -EACCES; - } + if (!(donor_filp->f_mode & FMODE_WRITE)) { + err = -EBADF; + goto mext_out; } + err = mnt_want_write(filp->f_path.mnt); + if (err) + goto mext_out; + err = ext4_move_extents(filp, donor_filp, me.orig_start, me.donor_start, me.len, &me.moved_len); - fput(donor_filp); + mnt_drop_write(filp->f_path.mnt); + if (me.moved_len > 0) + file_remove_suid(donor_filp); - if (!err) - if (copy_to_user((struct move_extent *)arg, - &me, sizeof(me))) - return -EFAULT; + if (copy_to_user((struct move_extent *)arg, &me, sizeof(me))) + err = -EFAULT; +mext_out: + fput(donor_filp); return err; } diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index cd258463e2a9..099fd476273e 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -908,6 +908,97 @@ out: return err; } +static noinline_for_stack +int ext4_mb_init_group(struct super_block *sb, ext4_group_t group) +{ + + int ret = 0; + void *bitmap; + int blocks_per_page; + int block, pnum, poff; + int num_grp_locked = 0; + struct ext4_group_info *this_grp; + struct ext4_sb_info *sbi = EXT4_SB(sb); + struct inode *inode = sbi->s_buddy_cache; + struct page *page = NULL, *bitmap_page = NULL; + + mb_debug("init group %lu\n", group); + blocks_per_page = PAGE_CACHE_SIZE / sb->s_blocksize; + this_grp = ext4_get_group_info(sb, group); + /* + * This ensures we don't add group + * to this buddy cache via resize + */ + num_grp_locked = ext4_mb_get_buddy_cache_lock(sb, group); + if (!EXT4_MB_GRP_NEED_INIT(this_grp)) { + /* + * somebody initialized the group + * return without doing anything + */ + ret = 0; + goto err; + } + /* + * the buddy cache inode stores the block bitmap + * and buddy information in consecutive blocks. + * So for each group we need two blocks. + */ + block = group * 2; + pnum = block / blocks_per_page; + poff = block % blocks_per_page; + page = find_or_create_page(inode->i_mapping, pnum, GFP_NOFS); + if (page) { + BUG_ON(page->mapping != inode->i_mapping); + ret = ext4_mb_init_cache(page, NULL); + if (ret) { + unlock_page(page); + goto err; + } + unlock_page(page); + } + if (page == NULL || !PageUptodate(page)) { + ret = -EIO; + goto err; + } + mark_page_accessed(page); + bitmap_page = page; + bitmap = page_address(page) + (poff * sb->s_blocksize); + + /* init buddy cache */ + block++; + pnum = block / blocks_per_page; + poff = block % blocks_per_page; + page = find_or_create_page(inode->i_mapping, pnum, GFP_NOFS); + if (page == bitmap_page) { + /* + * If both the bitmap and buddy are in + * the same page we don't need to force + * init the buddy + */ + unlock_page(page); + } else if (page) { + BUG_ON(page->mapping != inode->i_mapping); + ret = ext4_mb_init_cache(page, bitmap); + if (ret) { + unlock_page(page); + goto err; + } + unlock_page(page); + } + if (page == NULL || !PageUptodate(page)) { + ret = -EIO; + goto err; + } + mark_page_accessed(page); +err: + ext4_mb_put_buddy_cache_lock(sb, group, num_grp_locked); + if (bitmap_page) + page_cache_release(bitmap_page); + if (page) + page_cache_release(page); + return ret; +} + static noinline_for_stack int ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group, struct ext4_buddy *e4b) @@ -941,8 +1032,26 @@ ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group, * groups mapped by the page is blocked * till we are done with allocation */ +repeat_load_buddy: down_read(e4b->alloc_semp); + if (unlikely(EXT4_MB_GRP_NEED_INIT(grp))) { + /* we need to check for group need init flag + * with alloc_semp held so that we can be sure + * that new blocks didn't get added to the group + * when we are loading the buddy cache + */ + up_read(e4b->alloc_semp); + /* + * we need full data about the group + * to make a good selection + */ + ret = ext4_mb_init_group(sb, group); + if (ret) + return ret; + goto repeat_load_buddy; + } + /* * the buddy cache inode stores the block bitmap * and buddy information in consecutive blocks. @@ -1360,7 +1469,7 @@ static void ext4_mb_use_best_found(struct ext4_allocation_context *ac, ac->alloc_semp = e4b->alloc_semp; e4b->alloc_semp = NULL; /* store last allocated for subsequent stream allocation */ - if ((ac->ac_flags & EXT4_MB_HINT_DATA)) { + if (ac->ac_flags & EXT4_MB_STREAM_ALLOC) { spin_lock(&sbi->s_md_lock); sbi->s_mb_last_group = ac->ac_f_ex.fe_group; sbi->s_mb_last_start = ac->ac_f_ex.fe_start; @@ -1837,97 +1946,6 @@ void ext4_mb_put_buddy_cache_lock(struct super_block *sb, } -static noinline_for_stack -int ext4_mb_init_group(struct super_block *sb, ext4_group_t group) -{ - - int ret; - void *bitmap; - int blocks_per_page; - int block, pnum, poff; - int num_grp_locked = 0; - struct ext4_group_info *this_grp; - struct ext4_sb_info *sbi = EXT4_SB(sb); - struct inode *inode = sbi->s_buddy_cache; - struct page *page = NULL, *bitmap_page = NULL; - - mb_debug("init group %lu\n", group); - blocks_per_page = PAGE_CACHE_SIZE / sb->s_blocksize; - this_grp = ext4_get_group_info(sb, group); - /* - * This ensures we don't add group - * to this buddy cache via resize - */ - num_grp_locked = ext4_mb_get_buddy_cache_lock(sb, group); - if (!EXT4_MB_GRP_NEED_INIT(this_grp)) { - /* - * somebody initialized the group - * return without doing anything - */ - ret = 0; - goto err; - } - /* - * the buddy cache inode stores the block bitmap - * and buddy information in consecutive blocks. - * So for each group we need two blocks. - */ - block = group * 2; - pnum = block / blocks_per_page; - poff = block % blocks_per_page; - page = find_or_create_page(inode->i_mapping, pnum, GFP_NOFS); - if (page) { - BUG_ON(page->mapping != inode->i_mapping); - ret = ext4_mb_init_cache(page, NULL); - if (ret) { - unlock_page(page); - goto err; - } - unlock_page(page); - } - if (page == NULL || !PageUptodate(page)) { - ret = -EIO; - goto err; - } - mark_page_accessed(page); - bitmap_page = page; - bitmap = page_address(page) + (poff * sb->s_blocksize); - - /* init buddy cache */ - block++; - pnum = block / blocks_per_page; - poff = block % blocks_per_page; - page = find_or_create_page(inode->i_mapping, pnum, GFP_NOFS); - if (page == bitmap_page) { - /* - * If both the bitmap and buddy are in - * the same page we don't need to force - * init the buddy - */ - unlock_page(page); - } else if (page) { - BUG_ON(page->mapping != inode->i_mapping); - ret = ext4_mb_init_cache(page, bitmap); - if (ret) { - unlock_page(page); - goto err; - } - unlock_page(page); - } - if (page == NULL || !PageUptodate(page)) { - ret = -EIO; - goto err; - } - mark_page_accessed(page); -err: - ext4_mb_put_buddy_cache_lock(sb, group, num_grp_locked); - if (bitmap_page) - page_cache_release(bitmap_page); - if (page) - page_cache_release(page); - return ret; -} - static noinline_for_stack int ext4_mb_regular_allocator(struct ext4_allocation_context *ac) { @@ -1938,11 +1956,14 @@ ext4_mb_regular_allocator(struct ext4_allocation_context *ac) struct ext4_sb_info *sbi; struct super_block *sb; struct ext4_buddy e4b; - loff_t size, isize; sb = ac->ac_sb; sbi = EXT4_SB(sb); ngroups = ext4_get_groups_count(sb); + /* non-extent files are limited to low blocks/groups */ + if (!(EXT4_I(ac->ac_inode)->i_flags & EXT4_EXTENTS_FL)) + ngroups = sbi->s_blockfile_groups; + BUG_ON(ac->ac_status == AC_STATUS_FOUND); /* first, try the goal */ @@ -1974,20 +1995,16 @@ ext4_mb_regular_allocator(struct ext4_allocation_context *ac) } bsbits = ac->ac_sb->s_blocksize_bits; - /* if stream allocation is enabled, use global goal */ - size = ac->ac_o_ex.fe_logical + ac->ac_o_ex.fe_len; - isize = i_size_read(ac->ac_inode) >> bsbits; - if (size < isize) - size = isize; - if (size < sbi->s_mb_stream_request && - (ac->ac_flags & EXT4_MB_HINT_DATA)) { + /* if stream allocation is enabled, use global goal */ + if (ac->ac_flags & EXT4_MB_STREAM_ALLOC) { /* TBD: may be hot point */ spin_lock(&sbi->s_md_lock); ac->ac_g_ex.fe_group = sbi->s_mb_last_group; ac->ac_g_ex.fe_start = sbi->s_mb_last_start; spin_unlock(&sbi->s_md_lock); } + /* Let's just scan groups to find more-less suitable blocks */ cr = ac->ac_2order ? 0 : 1; /* @@ -2015,27 +2032,6 @@ repeat: if (grp->bb_free == 0) continue; - /* - * if the group is already init we check whether it is - * a good group and if not we don't load the buddy - */ - if (EXT4_MB_GRP_NEED_INIT(grp)) { - /* - * we need full data about the group - * to make a good selection - */ - err = ext4_mb_init_group(sb, group); - if (err) - goto out; - } - - /* - * If the particular group doesn't satisfy our - * criteria we continue with the next group - */ - if (!ext4_mb_good_group(ac, group, cr)) - continue; - err = ext4_mb_load_buddy(sb, group, &e4b); if (err) goto out; @@ -2571,13 +2567,11 @@ static int ext4_mb_init_backend(struct super_block *sb) { ext4_group_t ngroups = ext4_get_groups_count(sb); ext4_group_t i; - int metalen; struct ext4_sb_info *sbi = EXT4_SB(sb); struct ext4_super_block *es = sbi->s_es; int num_meta_group_infos; int num_meta_group_infos_max; int array_size; - struct ext4_group_info **meta_group_info; struct ext4_group_desc *desc; /* This is the number of blocks used by GDT */ @@ -2622,22 +2616,6 @@ static int ext4_mb_init_backend(struct super_block *sb) goto err_freesgi; } EXT4_I(sbi->s_buddy_cache)->i_disksize = 0; - - metalen = sizeof(*meta_group_info) << EXT4_DESC_PER_BLOCK_BITS(sb); - for (i = 0; i < num_meta_group_infos; i++) { - if ((i + 1) == num_meta_group_infos) - metalen = sizeof(*meta_group_info) * - (ngroups - - (i << EXT4_DESC_PER_BLOCK_BITS(sb))); - meta_group_info = kmalloc(metalen, GFP_KERNEL); - if (meta_group_info == NULL) { - printk(KERN_ERR "EXT4-fs: can't allocate mem for a " - "buddy group\n"); - goto err_freemeta; - } - sbi->s_group_info[i] = meta_group_info; - } - for (i = 0; i < ngroups; i++) { desc = ext4_get_group_desc(sb, i, NULL); if (desc == NULL) { @@ -2655,7 +2633,6 @@ err_freebuddy: while (i-- > 0) kfree(ext4_get_group_info(sb, i)); i = num_meta_group_infos; -err_freemeta: while (i-- > 0) kfree(sbi->s_group_info[i]); iput(sbi->s_buddy_cache); @@ -2833,7 +2810,6 @@ static void release_blocks_on_commit(journal_t *journal, transaction_t *txn) struct ext4_group_info *db; int err, count = 0, count2 = 0; struct ext4_free_data *entry; - ext4_fsblk_t discard_block; struct list_head *l, *ltmp; list_for_each_safe(l, ltmp, &txn->t_private_list) { @@ -2863,13 +2839,19 @@ static void release_blocks_on_commit(journal_t *journal, transaction_t *txn) page_cache_release(e4b.bd_bitmap_page); } ext4_unlock_group(sb, entry->group); - discard_block = (ext4_fsblk_t) entry->group * EXT4_BLOCKS_PER_GROUP(sb) - + entry->start_blk - + le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block); - trace_ext4_discard_blocks(sb, (unsigned long long)discard_block, - entry->count); - sb_issue_discard(sb, discard_block, entry->count); - + if (test_opt(sb, DISCARD)) { + ext4_fsblk_t discard_block; + struct ext4_super_block *es = EXT4_SB(sb)->s_es; + + discard_block = (ext4_fsblk_t)entry->group * + EXT4_BLOCKS_PER_GROUP(sb) + + entry->start_blk + + le32_to_cpu(es->s_first_data_block); + trace_ext4_discard_blocks(sb, + (unsigned long long)discard_block, + entry->count); + sb_issue_discard(sb, discard_block, entry->count); + } kmem_cache_free(ext4_free_ext_cachep, entry); ext4_mb_release_desc(&e4b); } @@ -3276,6 +3258,24 @@ static void ext4_mb_collect_stats(struct ext4_allocation_context *ac) } /* + * Called on failure; free up any blocks from the inode PA for this + * context. We don't need this for MB_GROUP_PA because we only change + * pa_free in ext4_mb_release_context(), but on failure, we've already + * zeroed out ac->ac_b_ex.fe_len, so group_pa->pa_free is not changed. + */ +static void ext4_discard_allocated_blocks(struct ext4_allocation_context *ac) +{ + struct ext4_prealloc_space *pa = ac->ac_pa; + int len; + + if (pa && pa->pa_type == MB_INODE_PA) { + len = ac->ac_b_ex.fe_len; + pa->pa_free += len; + } + +} + +/* * use blocks preallocated to inode */ static void ext4_mb_use_inode_pa(struct ext4_allocation_context *ac, @@ -3382,6 +3382,11 @@ ext4_mb_use_preallocated(struct ext4_allocation_context *ac) ac->ac_o_ex.fe_logical >= pa->pa_lstart + pa->pa_len) continue; + /* non-extent files can't have physical blocks past 2^32 */ + if (!(EXT4_I(ac->ac_inode)->i_flags & EXT4_EXTENTS_FL) && + pa->pa_pstart + pa->pa_len > EXT4_MAX_BLOCK_FILE_PHYS) + continue; + /* found preallocated blocks, use them */ spin_lock(&pa->pa_lock); if (pa->pa_deleted == 0 && pa->pa_free) { @@ -4174,16 +4179,26 @@ static void ext4_mb_group_or_file(struct ext4_allocation_context *ac) if (!(ac->ac_flags & EXT4_MB_HINT_DATA)) return; + if (unlikely(ac->ac_flags & EXT4_MB_HINT_GOAL_ONLY)) + return; + size = ac->ac_o_ex.fe_logical + ac->ac_o_ex.fe_len; - isize = i_size_read(ac->ac_inode) >> bsbits; - size = max(size, isize); + isize = (i_size_read(ac->ac_inode) + ac->ac_sb->s_blocksize - 1) + >> bsbits; - /* don't use group allocation for large files */ - if (size >= sbi->s_mb_stream_request) + if ((size == isize) && + !ext4_fs_is_busy(sbi) && + (atomic_read(&ac->ac_inode->i_writecount) == 0)) { + ac->ac_flags |= EXT4_MB_HINT_NOPREALLOC; return; + } - if (unlikely(ac->ac_flags & EXT4_MB_HINT_GOAL_ONLY)) + /* don't use group allocation for large files */ + size = max(size, isize); + if (size >= sbi->s_mb_stream_request) { + ac->ac_flags |= EXT4_MB_STREAM_ALLOC; return; + } BUG_ON(ac->ac_lg != NULL); /* @@ -4549,6 +4564,7 @@ repeat: ac->ac_status = AC_STATUS_CONTINUE; goto repeat; } else if (*errp) { + ext4_discard_allocated_blocks(ac); ac->ac_b_ex.fe_len = 0; ar->len = 0; ext4_mb_show_ac(ac); diff --git a/fs/ext4/migrate.c b/fs/ext4/migrate.c index 313a50b39741..864614974536 100644 --- a/fs/ext4/migrate.c +++ b/fs/ext4/migrate.c @@ -75,7 +75,7 @@ static int finish_range(handle_t *handle, struct inode *inode, goto err_out; } } - retval = ext4_ext_insert_extent(handle, inode, path, &newext); + retval = ext4_ext_insert_extent(handle, inode, path, &newext, 0); err_out: if (path) { ext4_ext_drop_refs(path); @@ -238,7 +238,7 @@ static int extend_credit_for_blkdel(handle_t *handle, struct inode *inode) * So allocate a credit of 3. We may update * quota (user and group). */ - needed = 3 + 2*EXT4_QUOTA_TRANS_BLOCKS(inode->i_sb); + needed = 3 + EXT4_MAXQUOTAS_TRANS_BLOCKS(inode->i_sb); if (ext4_journal_extend(handle, needed) != 0) retval = ext4_journal_restart(handle, needed); @@ -353,17 +353,16 @@ static int ext4_ext_swap_inode_data(handle_t *handle, struct inode *inode, down_write(&EXT4_I(inode)->i_data_sem); /* - * if EXT4_EXT_MIGRATE is cleared a block allocation + * if EXT4_STATE_EXT_MIGRATE is cleared a block allocation * happened after we started the migrate. We need to * fail the migrate */ - if (!(EXT4_I(inode)->i_flags & EXT4_EXT_MIGRATE)) { + if (!(EXT4_I(inode)->i_state & EXT4_STATE_EXT_MIGRATE)) { retval = -EAGAIN; up_write(&EXT4_I(inode)->i_data_sem); goto err_out; } else - EXT4_I(inode)->i_flags = EXT4_I(inode)->i_flags & - ~EXT4_EXT_MIGRATE; + EXT4_I(inode)->i_state &= ~EXT4_STATE_EXT_MIGRATE; /* * We have the extent map build with the tmp inode. * Now copy the i_data across @@ -478,7 +477,7 @@ int ext4_ext_migrate(struct inode *inode) handle = ext4_journal_start(inode, EXT4_DATA_TRANS_BLOCKS(inode->i_sb) + EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3 + - 2 * EXT4_QUOTA_INIT_BLOCKS(inode->i_sb) + EXT4_MAXQUOTAS_INIT_BLOCKS(inode->i_sb) + 1); if (IS_ERR(handle)) { retval = PTR_ERR(handle); @@ -517,14 +516,15 @@ int ext4_ext_migrate(struct inode *inode) * when we add extents we extent the journal */ /* - * Even though we take i_mutex we can still cause block allocation - * via mmap write to holes. If we have allocated new blocks we fail - * migrate. New block allocation will clear EXT4_EXT_MIGRATE flag. - * The flag is updated with i_data_sem held to prevent racing with - * block allocation. + * Even though we take i_mutex we can still cause block + * allocation via mmap write to holes. If we have allocated + * new blocks we fail migrate. New block allocation will + * clear EXT4_STATE_EXT_MIGRATE flag. The flag is updated + * with i_data_sem held to prevent racing with block + * allocation. */ down_read((&EXT4_I(inode)->i_data_sem)); - EXT4_I(inode)->i_flags = EXT4_I(inode)->i_flags | EXT4_EXT_MIGRATE; + EXT4_I(inode)->i_state |= EXT4_STATE_EXT_MIGRATE; up_read((&EXT4_I(inode)->i_data_sem)); handle = ext4_journal_start(inode, 1); @@ -618,7 +618,7 @@ err_out: tmp_inode->i_nlink = 0; ext4_journal_stop(handle); - + unlock_new_inode(tmp_inode); iput(tmp_inode); return retval; diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c index bbf2dd9404dc..9a573a62dd63 100644 --- a/fs/ext4/move_extent.c +++ b/fs/ext4/move_extent.c @@ -19,14 +19,31 @@ #include "ext4_extents.h" #include "ext4.h" -#define get_ext_path(path, inode, block, ret) \ - do { \ - path = ext4_ext_find_extent(inode, block, path); \ - if (IS_ERR(path)) { \ - ret = PTR_ERR(path); \ - path = NULL; \ - } \ - } while (0) +/** + * get_ext_path - Find an extent path for designated logical block number. + * + * @inode: an inode which is searched + * @lblock: logical block number to find an extent path + * @path: pointer to an extent path pointer (for output) + * + * ext4_ext_find_extent wrapper. Return 0 on success, or a negative error value + * on failure. + */ +static inline int +get_ext_path(struct inode *inode, ext4_lblk_t lblock, + struct ext4_ext_path **path) +{ + int ret = 0; + + *path = ext4_ext_find_extent(inode, lblock, *path); + if (IS_ERR(*path)) { + ret = PTR_ERR(*path); + *path = NULL; + } else if ((*path)[ext_depth(inode)].p_ext == NULL) + ret = -ENODATA; + + return ret; +} /** * copy_extent_status - Copy the extent's initialization status @@ -60,12 +77,14 @@ static int mext_next_extent(struct inode *inode, struct ext4_ext_path *path, struct ext4_extent **extent) { + struct ext4_extent_header *eh; int ppos, leaf_ppos = path->p_depth; ppos = leaf_ppos; if (EXT_LAST_EXTENT(path[ppos].p_hdr) > path[ppos].p_ext) { /* leaf block */ *extent = ++path[ppos].p_ext; + path[ppos].p_block = ext_pblock(path[ppos].p_ext); return 0; } @@ -102,9 +121,18 @@ mext_next_extent(struct inode *inode, struct ext4_ext_path *path, ext_block_hdr(path[cur_ppos+1].p_bh); } + path[leaf_ppos].p_ext = *extent = NULL; + + eh = path[leaf_ppos].p_hdr; + if (le16_to_cpu(eh->eh_entries) == 0) + /* empty leaf is found */ + return -ENODATA; + /* leaf block */ path[leaf_ppos].p_ext = *extent = EXT_FIRST_EXTENT(path[leaf_ppos].p_hdr); + path[leaf_ppos].p_block = + ext_pblock(path[leaf_ppos].p_ext); return 0; } } @@ -113,47 +141,43 @@ mext_next_extent(struct inode *inode, struct ext4_ext_path *path, } /** - * mext_double_down_read - Acquire two inodes' read semaphore + * mext_check_null_inode - NULL check for two inodes * - * @orig_inode: original inode structure - * @donor_inode: donor inode structure - * Acquire read semaphore of the two inodes (orig and donor) by i_ino order. + * If inode1 or inode2 is NULL, return -EIO. Otherwise, return 0. */ -static void -mext_double_down_read(struct inode *orig_inode, struct inode *donor_inode) +static int +mext_check_null_inode(struct inode *inode1, struct inode *inode2, + const char *function) { - struct inode *first = orig_inode, *second = donor_inode; - - BUG_ON(orig_inode == NULL || donor_inode == NULL); - - /* - * Use the inode number to provide the stable locking order instead - * of its address, because the C language doesn't guarantee you can - * compare pointers that don't come from the same array. - */ - if (donor_inode->i_ino < orig_inode->i_ino) { - first = donor_inode; - second = orig_inode; + int ret = 0; + + if (inode1 == NULL) { + ext4_error(inode2->i_sb, function, + "Both inodes should not be NULL: " + "inode1 NULL inode2 %lu", inode2->i_ino); + ret = -EIO; + } else if (inode2 == NULL) { + ext4_error(inode1->i_sb, function, + "Both inodes should not be NULL: " + "inode1 %lu inode2 NULL", inode1->i_ino); + ret = -EIO; } - - down_read(&EXT4_I(first)->i_data_sem); - down_read(&EXT4_I(second)->i_data_sem); + return ret; } /** - * mext_double_down_write - Acquire two inodes' write semaphore + * double_down_write_data_sem - Acquire two inodes' write lock of i_data_sem * * @orig_inode: original inode structure * @donor_inode: donor inode structure - * Acquire write semaphore of the two inodes (orig and donor) by i_ino order. + * Acquire write lock of i_data_sem of the two inodes (orig and donor) by + * i_ino order. */ static void -mext_double_down_write(struct inode *orig_inode, struct inode *donor_inode) +double_down_write_data_sem(struct inode *orig_inode, struct inode *donor_inode) { struct inode *first = orig_inode, *second = donor_inode; - BUG_ON(orig_inode == NULL || donor_inode == NULL); - /* * Use the inode number to provide the stable locking order instead * of its address, because the C language doesn't guarantee you can @@ -165,37 +189,19 @@ mext_double_down_write(struct inode *orig_inode, struct inode *donor_inode) } down_write(&EXT4_I(first)->i_data_sem); - down_write(&EXT4_I(second)->i_data_sem); -} - -/** - * mext_double_up_read - Release two inodes' read semaphore - * - * @orig_inode: original inode structure to be released its lock first - * @donor_inode: donor inode structure to be released its lock second - * Release read semaphore of two inodes (orig and donor). - */ -static void -mext_double_up_read(struct inode *orig_inode, struct inode *donor_inode) -{ - BUG_ON(orig_inode == NULL || donor_inode == NULL); - - up_read(&EXT4_I(orig_inode)->i_data_sem); - up_read(&EXT4_I(donor_inode)->i_data_sem); + down_write_nested(&EXT4_I(second)->i_data_sem, SINGLE_DEPTH_NESTING); } /** - * mext_double_up_write - Release two inodes' write semaphore + * double_up_write_data_sem - Release two inodes' write lock of i_data_sem * * @orig_inode: original inode structure to be released its lock first * @donor_inode: donor inode structure to be released its lock second - * Release write semaphore of two inodes (orig and donor). + * Release write lock of i_data_sem of two inodes (orig and donor). */ static void -mext_double_up_write(struct inode *orig_inode, struct inode *donor_inode) +double_up_write_data_sem(struct inode *orig_inode, struct inode *donor_inode) { - BUG_ON(orig_inode == NULL || donor_inode == NULL); - up_write(&EXT4_I(orig_inode)->i_data_sem); up_write(&EXT4_I(donor_inode)->i_data_sem); } @@ -283,23 +289,23 @@ mext_insert_across_blocks(handle_t *handle, struct inode *orig_inode, } if (new_flag) { - get_ext_path(orig_path, orig_inode, eblock, err); - if (orig_path == NULL) + err = get_ext_path(orig_inode, eblock, &orig_path); + if (err) goto out; if (ext4_ext_insert_extent(handle, orig_inode, - orig_path, new_ext)) + orig_path, new_ext, 0)) goto out; } if (end_flag) { - get_ext_path(orig_path, orig_inode, - le32_to_cpu(end_ext->ee_block) - 1, err); - if (orig_path == NULL) + err = get_ext_path(orig_inode, + le32_to_cpu(end_ext->ee_block) - 1, &orig_path); + if (err) goto out; if (ext4_ext_insert_extent(handle, orig_inode, - orig_path, end_ext)) + orig_path, end_ext, 0)) goto out; } out: @@ -519,7 +525,15 @@ mext_leaf_block(handle_t *handle, struct inode *orig_inode, * oext |-----------| * new_ext |-------| */ - BUG_ON(le32_to_cpu(oext->ee_block) + oext_alen - 1 < new_ext_end); + if (le32_to_cpu(oext->ee_block) + oext_alen - 1 < new_ext_end) { + ext4_error(orig_inode->i_sb, __func__, + "new_ext_end(%u) should be less than or equal to " + "oext->ee_block(%u) + oext_alen(%d) - 1", + new_ext_end, le32_to_cpu(oext->ee_block), + oext_alen); + ret = -EIO; + goto out; + } /* * Case: new_ext is smaller than original extent @@ -543,6 +557,7 @@ mext_leaf_block(handle_t *handle, struct inode *orig_inode, ret = mext_insert_extents(handle, orig_inode, orig_path, o_start, o_end, &start_ext, &new_ext, &end_ext); +out: return ret; } @@ -554,8 +569,10 @@ mext_leaf_block(handle_t *handle, struct inode *orig_inode, * @orig_off: block offset of original inode * @donor_off: block offset of donor inode * @max_count: the maximun length of extents + * + * Return 0 on success, or a negative error value on failure. */ -static void +static int mext_calc_swap_extents(struct ext4_extent *tmp_dext, struct ext4_extent *tmp_oext, ext4_lblk_t orig_off, ext4_lblk_t donor_off, @@ -564,6 +581,19 @@ mext_calc_swap_extents(struct ext4_extent *tmp_dext, ext4_lblk_t diff, orig_diff; struct ext4_extent dext_old, oext_old; + BUG_ON(orig_off != donor_off); + + /* original and donor extents have to cover the same block offset */ + if (orig_off < le32_to_cpu(tmp_oext->ee_block) || + le32_to_cpu(tmp_oext->ee_block) + + ext4_ext_get_actual_len(tmp_oext) - 1 < orig_off) + return -ENODATA; + + if (orig_off < le32_to_cpu(tmp_dext->ee_block) || + le32_to_cpu(tmp_dext->ee_block) + + ext4_ext_get_actual_len(tmp_dext) - 1 < orig_off) + return -ENODATA; + dext_old = *tmp_dext; oext_old = *tmp_oext; @@ -591,6 +621,8 @@ mext_calc_swap_extents(struct ext4_extent *tmp_dext, copy_extent_status(&oext_old, tmp_dext); copy_extent_status(&dext_old, tmp_oext); + + return 0; } /** @@ -601,6 +633,7 @@ mext_calc_swap_extents(struct ext4_extent *tmp_dext, * @donor_inode: donor inode * @from: block offset of orig_inode * @count: block count to be replaced + * @err: pointer to save return value * * Replace original inode extents and donor inode extents page by page. * We implement this replacement in the following three steps: @@ -611,33 +644,33 @@ mext_calc_swap_extents(struct ext4_extent *tmp_dext, * 3. Change the block information of donor inode to point at the saved * original inode blocks in the dummy extents. * - * Return 0 on success, or a negative error value on failure. + * Return replaced block count. */ static int mext_replace_branches(handle_t *handle, struct inode *orig_inode, struct inode *donor_inode, ext4_lblk_t from, - ext4_lblk_t count) + ext4_lblk_t count, int *err) { struct ext4_ext_path *orig_path = NULL; struct ext4_ext_path *donor_path = NULL; struct ext4_extent *oext, *dext; struct ext4_extent tmp_dext, tmp_oext; ext4_lblk_t orig_off = from, donor_off = from; - int err = 0; int depth; int replaced_count = 0; int dext_alen; - mext_double_down_write(orig_inode, donor_inode); + /* Protect extent trees against block allocations via delalloc */ + double_down_write_data_sem(orig_inode, donor_inode); /* Get the original extent for the block "orig_off" */ - get_ext_path(orig_path, orig_inode, orig_off, err); - if (orig_path == NULL) + *err = get_ext_path(orig_inode, orig_off, &orig_path); + if (*err) goto out; /* Get the donor extent for the head */ - get_ext_path(donor_path, donor_inode, donor_off, err); - if (donor_path == NULL) + *err = get_ext_path(donor_inode, donor_off, &donor_path); + if (*err) goto out; depth = ext_depth(orig_inode); oext = orig_path[depth].p_ext; @@ -647,24 +680,39 @@ mext_replace_branches(handle_t *handle, struct inode *orig_inode, dext = donor_path[depth].p_ext; tmp_dext = *dext; - mext_calc_swap_extents(&tmp_dext, &tmp_oext, orig_off, + *err = mext_calc_swap_extents(&tmp_dext, &tmp_oext, orig_off, donor_off, count); + if (*err) + goto out; /* Loop for the donor extents */ while (1) { /* The extent for donor must be found. */ - BUG_ON(!dext || donor_off != le32_to_cpu(tmp_dext.ee_block)); + if (!dext) { + ext4_error(donor_inode->i_sb, __func__, + "The extent for donor must be found"); + *err = -EIO; + goto out; + } else if (donor_off != le32_to_cpu(tmp_dext.ee_block)) { + ext4_error(donor_inode->i_sb, __func__, + "Donor offset(%u) and the first block of donor " + "extent(%u) should be equal", + donor_off, + le32_to_cpu(tmp_dext.ee_block)); + *err = -EIO; + goto out; + } /* Set donor extent to orig extent */ - err = mext_leaf_block(handle, orig_inode, + *err = mext_leaf_block(handle, orig_inode, orig_path, &tmp_dext, &orig_off); - if (err < 0) + if (*err) goto out; /* Set orig extent to donor extent */ - err = mext_leaf_block(handle, donor_inode, + *err = mext_leaf_block(handle, donor_inode, donor_path, &tmp_oext, &donor_off); - if (err < 0) + if (*err) goto out; dext_alen = ext4_ext_get_actual_len(&tmp_dext); @@ -678,36 +726,26 @@ mext_replace_branches(handle_t *handle, struct inode *orig_inode, if (orig_path) ext4_ext_drop_refs(orig_path); - get_ext_path(orig_path, orig_inode, orig_off, err); - if (orig_path == NULL) + *err = get_ext_path(orig_inode, orig_off, &orig_path); + if (*err) goto out; depth = ext_depth(orig_inode); oext = orig_path[depth].p_ext; - if (le32_to_cpu(oext->ee_block) + - ext4_ext_get_actual_len(oext) <= orig_off) { - err = 0; - goto out; - } tmp_oext = *oext; if (donor_path) ext4_ext_drop_refs(donor_path); - get_ext_path(donor_path, donor_inode, - donor_off, err); - if (donor_path == NULL) + *err = get_ext_path(donor_inode, donor_off, &donor_path); + if (*err) goto out; depth = ext_depth(donor_inode); dext = donor_path[depth].p_ext; - if (le32_to_cpu(dext->ee_block) + - ext4_ext_get_actual_len(dext) <= donor_off) { - err = 0; - goto out; - } tmp_dext = *dext; - mext_calc_swap_extents(&tmp_dext, &tmp_oext, orig_off, - donor_off, - count - replaced_count); + *err = mext_calc_swap_extents(&tmp_dext, &tmp_oext, orig_off, + donor_off, count - replaced_count); + if (*err) + goto out; } out: @@ -720,8 +758,12 @@ out: kfree(donor_path); } - mext_double_up_write(orig_inode, donor_inode); - return err; + ext4_ext_invalidate_cache(orig_inode); + ext4_ext_invalidate_cache(donor_inode); + + double_up_write_data_sem(orig_inode, donor_inode); + + return replaced_count; } /** @@ -733,16 +775,17 @@ out: * @data_offset_in_page: block index where data swapping starts * @block_len_in_page: the number of blocks to be swapped * @uninit: orig extent is uninitialized or not + * @err: pointer to save return value * * Save the data in original inode blocks and replace original inode extents * with donor inode extents by calling mext_replace_branches(). - * Finally, write out the saved data in new original inode blocks. Return 0 - * on success, or a negative error value on failure. + * Finally, write out the saved data in new original inode blocks. Return + * replaced block count. */ static int -move_extent_par_page(struct file *o_filp, struct inode *donor_inode, +move_extent_per_page(struct file *o_filp, struct inode *donor_inode, pgoff_t orig_page_offset, int data_offset_in_page, - int block_len_in_page, int uninit) + int block_len_in_page, int uninit, int *err) { struct inode *orig_inode = o_filp->f_dentry->d_inode; struct address_space *mapping = orig_inode->i_mapping; @@ -754,9 +797,11 @@ move_extent_par_page(struct file *o_filp, struct inode *donor_inode, long long offs = orig_page_offset << PAGE_CACHE_SHIFT; unsigned long blocksize = orig_inode->i_sb->s_blocksize; unsigned int w_flags = 0; - unsigned int tmp_data_len, data_len; + unsigned int tmp_data_size, data_size, replaced_size; void *fsdata; - int ret, i, jblocks; + int i, jblocks; + int err2 = 0; + int replaced_count = 0; int blocks_per_page = PAGE_CACHE_SIZE >> orig_inode->i_blkbits; /* @@ -766,8 +811,8 @@ move_extent_par_page(struct file *o_filp, struct inode *donor_inode, jblocks = ext4_writepage_trans_blocks(orig_inode) * 2; handle = ext4_journal_start(orig_inode, jblocks); if (IS_ERR(handle)) { - ret = PTR_ERR(handle); - return ret; + *err = PTR_ERR(handle); + return 0; } if (segment_eq(get_fs(), KERNEL_DS)) @@ -783,39 +828,36 @@ move_extent_par_page(struct file *o_filp, struct inode *donor_inode, * Just swap data blocks between orig and donor. */ if (uninit) { - ret = mext_replace_branches(handle, orig_inode, - donor_inode, orig_blk_offset, - block_len_in_page); - - /* Clear the inode cache not to refer to the old data */ - ext4_ext_invalidate_cache(orig_inode); - ext4_ext_invalidate_cache(donor_inode); + replaced_count = mext_replace_branches(handle, orig_inode, + donor_inode, orig_blk_offset, + block_len_in_page, err); goto out2; } offs = (long long)orig_blk_offset << orig_inode->i_blkbits; - /* Calculate data_len */ + /* Calculate data_size */ if ((orig_blk_offset + block_len_in_page - 1) == ((orig_inode->i_size - 1) >> orig_inode->i_blkbits)) { /* Replace the last block */ - tmp_data_len = orig_inode->i_size & (blocksize - 1); + tmp_data_size = orig_inode->i_size & (blocksize - 1); /* - * If data_len equal zero, it shows data_len is multiples of + * If data_size equal zero, it shows data_size is multiples of * blocksize. So we set appropriate value. */ - if (tmp_data_len == 0) - tmp_data_len = blocksize; + if (tmp_data_size == 0) + tmp_data_size = blocksize; - data_len = tmp_data_len + + data_size = tmp_data_size + ((block_len_in_page - 1) << orig_inode->i_blkbits); - } else { - data_len = block_len_in_page << orig_inode->i_blkbits; - } + } else + data_size = block_len_in_page << orig_inode->i_blkbits; + + replaced_size = data_size; - ret = a_ops->write_begin(o_filp, mapping, offs, data_len, w_flags, + *err = a_ops->write_begin(o_filp, mapping, offs, data_size, w_flags, &page, &fsdata); - if (unlikely(ret < 0)) + if (unlikely(*err < 0)) goto out; if (!PageUptodate(page)) { @@ -836,14 +878,17 @@ move_extent_par_page(struct file *o_filp, struct inode *donor_inode, /* Release old bh and drop refs */ try_to_release_page(page, 0); - ret = mext_replace_branches(handle, orig_inode, donor_inode, - orig_blk_offset, block_len_in_page); - if (ret < 0) - goto out; - - /* Clear the inode cache not to refer to the old data */ - ext4_ext_invalidate_cache(orig_inode); - ext4_ext_invalidate_cache(donor_inode); + replaced_count = mext_replace_branches(handle, orig_inode, donor_inode, + orig_blk_offset, block_len_in_page, + &err2); + if (err2) { + if (replaced_count) { + block_len_in_page = replaced_count; + replaced_size = + block_len_in_page << orig_inode->i_blkbits; + } else + goto out; + } if (!page_has_buffers(page)) create_empty_buffers(page, 1 << orig_inode->i_blkbits, 0); @@ -853,16 +898,16 @@ move_extent_par_page(struct file *o_filp, struct inode *donor_inode, bh = bh->b_this_page; for (i = 0; i < block_len_in_page; i++) { - ret = ext4_get_block(orig_inode, + *err = ext4_get_block(orig_inode, (sector_t)(orig_blk_offset + i), bh, 0); - if (ret < 0) + if (*err < 0) goto out; if (bh->b_this_page != NULL) bh = bh->b_this_page; } - ret = a_ops->write_end(o_filp, mapping, offs, data_len, data_len, + *err = a_ops->write_end(o_filp, mapping, offs, data_size, replaced_size, page, fsdata); page = NULL; @@ -871,11 +916,15 @@ out: if (PageLocked(page)) unlock_page(page); page_cache_release(page); + ext4_journal_stop(handle); } out2: ext4_journal_stop(handle); - return ret < 0 ? ret : 0; + if (err2) + *err = err2; + + return replaced_count; } /** @@ -886,7 +935,6 @@ out2: * @orig_start: logical start offset in block for orig * @donor_start: logical start offset in block for donor * @len: the number of blocks to be moved - * @moved_len: moved block length * * Check the arguments of ext4_move_extents() whether the files can be * exchanged with each other. @@ -894,9 +942,13 @@ out2: */ static int mext_check_arguments(struct inode *orig_inode, - struct inode *donor_inode, __u64 orig_start, - __u64 donor_start, __u64 *len, __u64 moved_len) + struct inode *donor_inode, __u64 orig_start, + __u64 donor_start, __u64 *len) { + ext4_lblk_t orig_blocks, donor_blocks; + unsigned int blkbits = orig_inode->i_blkbits; + unsigned int blocksize = 1 << blkbits; + /* Regular file check */ if (!S_ISREG(orig_inode->i_mode) || !S_ISREG(donor_inode->i_mode)) { ext4_debug("ext4 move extent: The argument files should be " @@ -905,6 +957,13 @@ mext_check_arguments(struct inode *orig_inode, return -EINVAL; } + if (donor_inode->i_mode & (S_ISUID|S_ISGID)) { + ext4_debug("ext4 move extent: suid or sgid is set" + " to donor file [ino:orig %lu, donor %lu]\n", + orig_inode->i_ino, donor_inode->i_ino); + return -EINVAL; + } + /* Ext4 move extent does not support swapfile */ if (IS_SWAPFILE(orig_inode) || IS_SWAPFILE(donor_inode)) { ext4_debug("ext4 move extent: The argument files should " @@ -921,14 +980,6 @@ mext_check_arguments(struct inode *orig_inode, return -EINVAL; } - /* orig and donor should be different file */ - if (orig_inode->i_ino == donor_inode->i_ino) { - ext4_debug("ext4 move extent: The argument files should not " - "be same file [ino:orig %lu, donor %lu]\n", - orig_inode->i_ino, donor_inode->i_ino); - return -EINVAL; - } - /* Ext4 move extent supports only extent based file */ if (!(EXT4_I(orig_inode)->i_flags & EXT4_EXTENTS_FL)) { ext4_debug("ext4 move extent: orig file is not extents " @@ -953,13 +1004,6 @@ mext_check_arguments(struct inode *orig_inode, return -EINVAL; } - if (moved_len) { - ext4_debug("ext4 move extent: moved_len should be 0 " - "[ino:orig %lu, donor %lu]\n", orig_inode->i_ino, - donor_inode->i_ino); - return -EINVAL; - } - if ((orig_start > MAX_DEFRAG_SIZE) || (donor_start > MAX_DEFRAG_SIZE) || (*len > MAX_DEFRAG_SIZE) || @@ -971,43 +1015,47 @@ mext_check_arguments(struct inode *orig_inode, } if (orig_inode->i_size > donor_inode->i_size) { - if (orig_start >= donor_inode->i_size) { + donor_blocks = (donor_inode->i_size + blocksize - 1) >> blkbits; + /* TODO: eliminate this artificial restriction */ + if (orig_start >= donor_blocks) { ext4_debug("ext4 move extent: orig start offset " - "[%llu] should be less than donor file size " - "[%lld] [ino:orig %lu, donor_inode %lu]\n", - orig_start, donor_inode->i_size, + "[%llu] should be less than donor file blocks " + "[%u] [ino:orig %lu, donor %lu]\n", + orig_start, donor_blocks, orig_inode->i_ino, donor_inode->i_ino); return -EINVAL; } - if (orig_start + *len > donor_inode->i_size) { + /* TODO: eliminate this artificial restriction */ + if (orig_start + *len > donor_blocks) { ext4_debug("ext4 move extent: End offset [%llu] should " - "be less than donor file size [%lld]." - "So adjust length from %llu to %lld " + "be less than donor file blocks [%u]." + "So adjust length from %llu to %llu " "[ino:orig %lu, donor %lu]\n", - orig_start + *len, donor_inode->i_size, - *len, donor_inode->i_size - orig_start, + orig_start + *len, donor_blocks, + *len, donor_blocks - orig_start, orig_inode->i_ino, donor_inode->i_ino); - *len = donor_inode->i_size - orig_start; + *len = donor_blocks - orig_start; } } else { - if (orig_start >= orig_inode->i_size) { + orig_blocks = (orig_inode->i_size + blocksize - 1) >> blkbits; + if (orig_start >= orig_blocks) { ext4_debug("ext4 move extent: start offset [%llu] " - "should be less than original file size " - "[%lld] [inode:orig %lu, donor %lu]\n", - orig_start, orig_inode->i_size, + "should be less than original file blocks " + "[%u] [ino:orig %lu, donor %lu]\n", + orig_start, orig_blocks, orig_inode->i_ino, donor_inode->i_ino); return -EINVAL; } - if (orig_start + *len > orig_inode->i_size) { + if (orig_start + *len > orig_blocks) { ext4_debug("ext4 move extent: Adjust length " - "from %llu to %lld. Because it should be " - "less than original file size " + "from %llu to %llu. Because it should be " + "less than original file blocks " "[ino:orig %lu, donor %lu]\n", - *len, orig_inode->i_size - orig_start, + *len, orig_blocks - orig_start, orig_inode->i_ino, donor_inode->i_ino); - *len = orig_inode->i_size - orig_start; + *len = orig_blocks - orig_start; } } @@ -1027,18 +1075,23 @@ mext_check_arguments(struct inode *orig_inode, * @inode1: the inode structure * @inode2: the inode structure * - * Lock two inodes' i_mutex by i_ino order. This function is moved from - * fs/inode.c. + * Lock two inodes' i_mutex by i_ino order. + * If inode1 or inode2 is NULL, return -EIO. Otherwise, return 0. */ -static void +static int mext_inode_double_lock(struct inode *inode1, struct inode *inode2) { - if (inode1 == NULL || inode2 == NULL || inode1 == inode2) { - if (inode1) - mutex_lock(&inode1->i_mutex); - else if (inode2) - mutex_lock(&inode2->i_mutex); - return; + int ret = 0; + + BUG_ON(inode1 == NULL && inode2 == NULL); + + ret = mext_check_null_inode(inode1, inode2, __func__); + if (ret < 0) + goto out; + + if (inode1 == inode2) { + mutex_lock(&inode1->i_mutex); + goto out; } if (inode1->i_ino < inode2->i_ino) { @@ -1048,6 +1101,9 @@ mext_inode_double_lock(struct inode *inode1, struct inode *inode2) mutex_lock_nested(&inode2->i_mutex, I_MUTEX_PARENT); mutex_lock_nested(&inode1->i_mutex, I_MUTEX_CHILD); } + +out: + return ret; } /** @@ -1056,17 +1112,28 @@ mext_inode_double_lock(struct inode *inode1, struct inode *inode2) * @inode1: the inode that is released first * @inode2: the inode that is released second * - * This function is moved from fs/inode.c. + * If inode1 or inode2 is NULL, return -EIO. Otherwise, return 0. */ -static void +static int mext_inode_double_unlock(struct inode *inode1, struct inode *inode2) { + int ret = 0; + + BUG_ON(inode1 == NULL && inode2 == NULL); + + ret = mext_check_null_inode(inode1, inode2, __func__); + if (ret < 0) + goto out; + if (inode1) mutex_unlock(&inode1->i_mutex); if (inode2 && inode2 != inode1) mutex_unlock(&inode2->i_mutex); + +out: + return ret; } /** @@ -1123,70 +1190,84 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, ext4_lblk_t block_end, seq_start, add_blocks, file_end, seq_blocks = 0; ext4_lblk_t rest_blocks; pgoff_t orig_page_offset = 0, seq_end_page; - int ret, depth, last_extent = 0; + int ret1, ret2, depth, last_extent = 0; int blocks_per_page = PAGE_CACHE_SIZE >> orig_inode->i_blkbits; int data_offset_in_page; int block_len_in_page; int uninit; - /* protect orig and donor against a truncate */ - mext_inode_double_lock(orig_inode, donor_inode); + /* orig and donor should be different file */ + if (orig_inode->i_ino == donor_inode->i_ino) { + ext4_debug("ext4 move extent: The argument files should not " + "be same file [ino:orig %lu, donor %lu]\n", + orig_inode->i_ino, donor_inode->i_ino); + return -EINVAL; + } + + /* Protect orig and donor inodes against a truncate */ + ret1 = mext_inode_double_lock(orig_inode, donor_inode); + if (ret1 < 0) + return ret1; - mext_double_down_read(orig_inode, donor_inode); + /* Protect extent tree against block allocations via delalloc */ + double_down_write_data_sem(orig_inode, donor_inode); /* Check the filesystem environment whether move_extent can be done */ - ret = mext_check_arguments(orig_inode, donor_inode, orig_start, - donor_start, &len, *moved_len); - mext_double_up_read(orig_inode, donor_inode); - if (ret) - goto out2; + ret1 = mext_check_arguments(orig_inode, donor_inode, orig_start, + donor_start, &len); + if (ret1) + goto out; file_end = (i_size_read(orig_inode) - 1) >> orig_inode->i_blkbits; block_end = block_start + len - 1; if (file_end < block_end) len -= block_end - file_end; - get_ext_path(orig_path, orig_inode, block_start, ret); - if (orig_path == NULL) - goto out2; + ret1 = get_ext_path(orig_inode, block_start, &orig_path); + if (ret1) + goto out; /* Get path structure to check the hole */ - get_ext_path(holecheck_path, orig_inode, block_start, ret); - if (holecheck_path == NULL) + ret1 = get_ext_path(orig_inode, block_start, &holecheck_path); + if (ret1) goto out; depth = ext_depth(orig_inode); ext_cur = holecheck_path[depth].p_ext; - if (ext_cur == NULL) { - ret = -EINVAL; - goto out; - } /* - * Get proper extent whose ee_block is beyond block_start - * if block_start was within the hole. + * Get proper starting location of block replacement if block_start was + * within the hole. */ if (le32_to_cpu(ext_cur->ee_block) + ext4_ext_get_actual_len(ext_cur) - 1 < block_start) { + /* + * The hole exists between extents or the tail of + * original file. + */ last_extent = mext_next_extent(orig_inode, holecheck_path, &ext_cur); if (last_extent < 0) { - ret = last_extent; + ret1 = last_extent; goto out; } last_extent = mext_next_extent(orig_inode, orig_path, &ext_dummy); if (last_extent < 0) { - ret = last_extent; + ret1 = last_extent; goto out; } - } - seq_start = block_start; + seq_start = le32_to_cpu(ext_cur->ee_block); + } else if (le32_to_cpu(ext_cur->ee_block) > block_start) + /* The hole exists at the beginning of original file. */ + seq_start = le32_to_cpu(ext_cur->ee_block); + else + seq_start = block_start; /* No blocks within the specified range. */ if (le32_to_cpu(ext_cur->ee_block) > block_end) { ext4_debug("ext4 move extent: The specified range of file " "may be the hole\n"); - ret = -EINVAL; + ret1 = -EINVAL; goto out; } @@ -1206,7 +1287,7 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, last_extent = mext_next_extent(orig_inode, holecheck_path, &ext_cur); if (last_extent < 0) { - ret = last_extent; + ret1 = last_extent; break; } add_blocks = ext4_ext_get_actual_len(ext_cur); @@ -1246,29 +1327,39 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, seq_start = le32_to_cpu(ext_cur->ee_block); rest_blocks = seq_blocks; - /* Discard preallocations of two inodes */ - down_write(&EXT4_I(orig_inode)->i_data_sem); - ext4_discard_preallocations(orig_inode); - up_write(&EXT4_I(orig_inode)->i_data_sem); - - down_write(&EXT4_I(donor_inode)->i_data_sem); - ext4_discard_preallocations(donor_inode); - up_write(&EXT4_I(donor_inode)->i_data_sem); + /* + * Up semaphore to avoid following problems: + * a. transaction deadlock among ext4_journal_start, + * ->write_begin via pagefault, and jbd2_journal_commit + * b. racing with ->readpage, ->write_begin, and ext4_get_block + * in move_extent_per_page + */ + double_up_write_data_sem(orig_inode, donor_inode); while (orig_page_offset <= seq_end_page) { /* Swap original branches with new branches */ - ret = move_extent_par_page(o_filp, donor_inode, + block_len_in_page = move_extent_per_page( + o_filp, donor_inode, orig_page_offset, data_offset_in_page, - block_len_in_page, uninit); - if (ret < 0) - goto out; - orig_page_offset++; + block_len_in_page, uninit, + &ret1); + /* Count how many blocks we have exchanged */ *moved_len += block_len_in_page; - BUG_ON(*moved_len > len); + if (ret1 < 0) + break; + if (*moved_len > len) { + ext4_error(orig_inode->i_sb, __func__, + "We replaced blocks too much! " + "sum of replaced: %llu requested: %llu", + *moved_len, len); + ret1 = -EIO; + break; + } + orig_page_offset++; data_offset_in_page = 0; rest_blocks -= block_len_in_page; if (rest_blocks > blocks_per_page) @@ -1277,20 +1368,23 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, block_len_in_page = rest_blocks; } + double_down_write_data_sem(orig_inode, donor_inode); + if (ret1 < 0) + break; + /* Decrease buffer counter */ if (holecheck_path) ext4_ext_drop_refs(holecheck_path); - get_ext_path(holecheck_path, orig_inode, - seq_start, ret); - if (holecheck_path == NULL) + ret1 = get_ext_path(orig_inode, seq_start, &holecheck_path); + if (ret1) break; depth = holecheck_path->p_depth; /* Decrease buffer counter */ if (orig_path) ext4_ext_drop_refs(orig_path); - get_ext_path(orig_path, orig_inode, seq_start, ret); - if (orig_path == NULL) + ret1 = get_ext_path(orig_inode, seq_start, &orig_path); + if (ret1) break; ext_cur = holecheck_path[depth].p_ext; @@ -1299,6 +1393,11 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, } out: + if (*moved_len) { + ext4_discard_preallocations(orig_inode); + ext4_discard_preallocations(donor_inode); + } + if (orig_path) { ext4_ext_drop_refs(orig_path); kfree(orig_path); @@ -1307,14 +1406,13 @@ out: ext4_ext_drop_refs(holecheck_path); kfree(holecheck_path); } -out2: - mext_inode_double_unlock(orig_inode, donor_inode); - - if (ret) - return ret; + double_up_write_data_sem(orig_inode, donor_inode); + ret2 = mext_inode_double_unlock(orig_inode, donor_inode); - /* All of the specified blocks must be exchanged in succeed */ - BUG_ON(*moved_len != len); + if (ret1) + return ret1; + else if (ret2) + return ret2; return 0; } diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index de04013d16ff..9dcd6863c1a3 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -1292,9 +1292,6 @@ errout: * add_dirent_to_buf will attempt search the directory block for * space. It will return -ENOSPC if no space is available, and -EIO * and -EEXIST if directory entry already exists. - * - * NOTE! bh is NOT released in the case where ENOSPC is returned. In - * all other cases bh is released. */ static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, struct inode *inode, struct ext4_dir_entry_2 *de, @@ -1315,14 +1312,10 @@ static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, top = bh->b_data + blocksize - reclen; while ((char *) de <= top) { if (!ext4_check_dir_entry("ext4_add_entry", dir, de, - bh, offset)) { - brelse(bh); + bh, offset)) return -EIO; - } - if (ext4_match(namelen, name, de)) { - brelse(bh); + if (ext4_match(namelen, name, de)) return -EEXIST; - } nlen = EXT4_DIR_REC_LEN(de->name_len); rlen = ext4_rec_len_from_disk(de->rec_len, blocksize); if ((de->inode? rlen - nlen: rlen) >= reclen) @@ -1337,7 +1330,6 @@ static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, err = ext4_journal_get_write_access(handle, bh); if (err) { ext4_std_error(dir->i_sb, err); - brelse(bh); return err; } @@ -1377,7 +1369,6 @@ static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, err = ext4_handle_dirty_metadata(handle, dir, bh); if (err) ext4_std_error(dir->i_sb, err); - brelse(bh); return 0; } @@ -1471,7 +1462,9 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry, if (!(de)) return retval; - return add_dirent_to_buf(handle, dentry, inode, de, bh); + retval = add_dirent_to_buf(handle, dentry, inode, de, bh); + brelse(bh); + return retval; } /* @@ -1514,8 +1507,10 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, if(!bh) return retval; retval = add_dirent_to_buf(handle, dentry, inode, NULL, bh); - if (retval != -ENOSPC) + if (retval != -ENOSPC) { + brelse(bh); return retval; + } if (blocks == 1 && !dx_fallback && EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX)) @@ -1528,7 +1523,9 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, de = (struct ext4_dir_entry_2 *) bh->b_data; de->inode = 0; de->rec_len = ext4_rec_len_to_disk(blocksize, blocksize); - return add_dirent_to_buf(handle, dentry, inode, de, bh); + retval = add_dirent_to_buf(handle, dentry, inode, de, bh); + brelse(bh); + return retval; } /* @@ -1561,10 +1558,8 @@ static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry, goto journal_error; err = add_dirent_to_buf(handle, dentry, inode, NULL, bh); - if (err != -ENOSPC) { - bh = NULL; + if (err != -ENOSPC) goto cleanup; - } /* Block full, should compress but for now just split */ dxtrace(printk(KERN_DEBUG "using %u of %u node entries\n", @@ -1590,9 +1585,9 @@ static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry, goto cleanup; node2 = (struct dx_node *)(bh2->b_data); entries2 = node2->entries; + memset(&node2->fake, 0, sizeof(struct fake_dirent)); node2->fake.rec_len = ext4_rec_len_to_disk(sb->s_blocksize, sb->s_blocksize); - node2->fake.inode = 0; BUFFER_TRACE(frame->bh, "get_write_access"); err = ext4_journal_get_write_access(handle, frame->bh); if (err) @@ -1657,7 +1652,6 @@ static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry, if (!de) goto cleanup; err = add_dirent_to_buf(handle, dentry, inode, de, bh); - bh = NULL; goto cleanup; journal_error: @@ -1775,7 +1769,7 @@ static int ext4_create(struct inode *dir, struct dentry *dentry, int mode, retry: handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3 + - 2*EXT4_QUOTA_INIT_BLOCKS(dir->i_sb)); + EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb)); if (IS_ERR(handle)) return PTR_ERR(handle); @@ -1809,7 +1803,7 @@ static int ext4_mknod(struct inode *dir, struct dentry *dentry, retry: handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3 + - 2*EXT4_QUOTA_INIT_BLOCKS(dir->i_sb)); + EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb)); if (IS_ERR(handle)) return PTR_ERR(handle); @@ -1846,7 +1840,7 @@ static int ext4_mkdir(struct inode *dir, struct dentry *dentry, int mode) retry: handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3 + - 2*EXT4_QUOTA_INIT_BLOCKS(dir->i_sb)); + EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb)); if (IS_ERR(handle)) return PTR_ERR(handle); @@ -2068,7 +2062,8 @@ int ext4_orphan_del(handle_t *handle, struct inode *inode) struct ext4_iloc iloc; int err = 0; - if (!ext4_handle_valid(handle)) + /* ext4_handle_valid() assumes a valid handle_t pointer */ + if (handle && !ext4_handle_valid(handle)) return 0; mutex_lock(&EXT4_SB(inode->i_sb)->s_orphan_lock); @@ -2258,7 +2253,7 @@ static int ext4_symlink(struct inode *dir, retry: handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + EXT4_INDEX_EXTRA_TRANS_BLOCKS + 5 + - 2*EXT4_QUOTA_INIT_BLOCKS(dir->i_sb)); + EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb)); if (IS_ERR(handle)) return PTR_ERR(handle); @@ -2310,7 +2305,7 @@ static int ext4_link(struct dentry *old_dentry, struct inode *inode = old_dentry->d_inode; int err, retries = 0; - if (EXT4_DIR_LINK_MAX(inode)) + if (inode->i_nlink >= EXT4_LINK_MAX) return -EMLINK; /* @@ -2413,7 +2408,7 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, goto end_rename; retval = -EMLINK; if (!new_inode && new_dir != old_dir && - new_dir->i_nlink >= EXT4_LINK_MAX) + EXT4_DIR_LINK_MAX(new_dir)) goto end_rename; } if (!new_bh) { diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index 68b0351fc647..96302cdb8dc3 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c @@ -247,7 +247,7 @@ static int setup_new_group_blocks(struct super_block *sb, goto exit_bh; if (IS_ERR(gdb = bclean(handle, sb, block))) { - err = PTR_ERR(bh); + err = PTR_ERR(gdb); goto exit_bh; } ext4_handle_dirty_metadata(handle, NULL, gdb); diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 8f4f079e6b9a..3278acf50423 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -45,6 +45,7 @@ #include "ext4_jbd2.h" #include "xattr.h" #include "acl.h" +#include "mballoc.h" #define CREATE_TRACE_POINTS #include <trace/events/ext4.h> @@ -188,6 +189,36 @@ void ext4_itable_unused_set(struct super_block *sb, bg->bg_itable_unused_hi = cpu_to_le16(count >> 16); } + +/* Just increment the non-pointer handle value */ +static handle_t *ext4_get_nojournal(void) +{ + handle_t *handle = current->journal_info; + unsigned long ref_cnt = (unsigned long)handle; + + BUG_ON(ref_cnt >= EXT4_NOJOURNAL_MAX_REF_COUNT); + + ref_cnt++; + handle = (handle_t *)ref_cnt; + + current->journal_info = handle; + return handle; +} + + +/* Decrement the non-pointer handle value */ +static void ext4_put_nojournal(handle_t *handle) +{ + unsigned long ref_cnt = (unsigned long)handle; + + BUG_ON(ref_cnt == 0); + + ref_cnt--; + handle = (handle_t *)ref_cnt; + + current->journal_info = handle; +} + /* * Wrappers for jbd2_journal_start/end. * @@ -214,11 +245,7 @@ handle_t *ext4_journal_start_sb(struct super_block *sb, int nblocks) } return jbd2_journal_start(journal, nblocks); } - /* - * We're not journaling, return the appropriate indication. - */ - current->journal_info = EXT4_NOJOURNAL_HANDLE; - return current->journal_info; + return ext4_get_nojournal(); } /* @@ -234,11 +261,7 @@ int __ext4_journal_stop(const char *where, handle_t *handle) int rc; if (!ext4_handle_valid(handle)) { - /* - * Do this here since we don't call jbd2_journal_stop() in - * no-journal mode. - */ - current->journal_info = NULL; + ext4_put_nojournal(handle); return 0; } sb = handle->h_transaction->t_journal->j_private; @@ -344,7 +367,8 @@ static const char *ext4_decode_error(struct super_block *sb, int errno, errstr = "Out of memory"; break; case -EROFS: - if (!sb || EXT4_SB(sb)->s_journal->j_flags & JBD2_ABORT) + if (!sb || (EXT4_SB(sb)->s_journal && + EXT4_SB(sb)->s_journal->j_flags & JBD2_ABORT)) errstr = "Journal has aborted"; else errstr = "Readonly filesystem"; @@ -578,15 +602,14 @@ static void ext4_put_super(struct super_block *sb) struct ext4_super_block *es = sbi->s_es; int i, err; + flush_workqueue(sbi->dio_unwritten_wq); + destroy_workqueue(sbi->dio_unwritten_wq); + lock_super(sb); lock_kernel(); if (sb->s_dirt) ext4_commit_super(sb, 1); - ext4_release_system_zone(sb); - ext4_mb_release(sb); - ext4_ext_release(sb); - ext4_xattr_put_super(sb); if (sbi->s_journal) { err = jbd2_journal_destroy(sbi->s_journal); sbi->s_journal = NULL; @@ -594,6 +617,12 @@ static void ext4_put_super(struct super_block *sb) ext4_abort(sb, __func__, "Couldn't clean up the journal"); } + + ext4_release_system_zone(sb); + ext4_mb_release(sb); + ext4_ext_release(sb); + ext4_xattr_put_super(sb); + if (!(sb->s_flags & MS_RDONLY)) { EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); es->s_state = cpu_to_le16(sbi->s_mount_state); @@ -682,6 +711,13 @@ static struct inode *ext4_alloc_inode(struct super_block *sb) ei->i_allocated_meta_blocks = 0; ei->i_delalloc_reserved_flag = 0; spin_lock_init(&(ei->i_block_reservation_lock)); +#ifdef CONFIG_QUOTA + ei->i_reserved_quota = 0; +#endif + INIT_LIST_HEAD(&ei->i_aio_dio_complete_list); + ei->cur_aio_dio = NULL; + ei->i_sync_tid = 0; + ei->i_datasync_tid = 0; return &ei->vfs_inode; } @@ -877,6 +913,12 @@ static int ext4_show_options(struct seq_file *seq, struct vfsmount *vfs) if (test_opt(sb, NO_AUTO_DA_ALLOC)) seq_puts(seq, ",noauto_da_alloc"); + if (test_opt(sb, DISCARD)) + seq_puts(seq, ",discard"); + + if (test_opt(sb, NOLOAD)) + seq_puts(seq, ",norecovery"); + ext4_show_quota_options(seq, sb); return 0; @@ -969,7 +1011,9 @@ static struct dquot_operations ext4_quota_operations = { .reserve_space = dquot_reserve_space, .claim_space = dquot_claim_space, .release_rsv = dquot_release_reserved_space, +#ifdef CONFIG_QUOTA .get_reserved_space = ext4_get_reserved_space, +#endif .alloc_inode = dquot_alloc_inode, .free_space = dquot_free_space, .free_inode = dquot_free_inode, @@ -1057,7 +1101,8 @@ enum { Opt_usrquota, Opt_grpquota, Opt_i_version, Opt_stripe, Opt_delalloc, Opt_nodelalloc, Opt_block_validity, Opt_noblock_validity, - Opt_inode_readahead_blks, Opt_journal_ioprio + Opt_inode_readahead_blks, Opt_journal_ioprio, + Opt_discard, Opt_nodiscard, }; static const match_table_t tokens = { @@ -1082,6 +1127,7 @@ static const match_table_t tokens = { {Opt_acl, "acl"}, {Opt_noacl, "noacl"}, {Opt_noload, "noload"}, + {Opt_noload, "norecovery"}, {Opt_nobh, "nobh"}, {Opt_bh, "bh"}, {Opt_commit, "commit=%u"}, @@ -1123,6 +1169,8 @@ static const match_table_t tokens = { {Opt_auto_da_alloc, "auto_da_alloc=%u"}, {Opt_auto_da_alloc, "auto_da_alloc"}, {Opt_noauto_da_alloc, "noauto_da_alloc"}, + {Opt_discard, "discard"}, + {Opt_nodiscard, "nodiscard"}, {Opt_err, NULL}, }; @@ -1551,6 +1599,12 @@ set_qf_format: else set_opt(sbi->s_mount_opt,NO_AUTO_DA_ALLOC); break; + case Opt_discard: + set_opt(sbi->s_mount_opt, DISCARD); + break; + case Opt_nodiscard: + clear_opt(sbi->s_mount_opt, DISCARD); + break; default: ext4_msg(sb, KERN_ERR, "Unrecognized mount option \"%s\" " @@ -1666,14 +1720,14 @@ static int ext4_fill_flex_info(struct super_block *sb) size_t size; int i; - if (!sbi->s_es->s_log_groups_per_flex) { + sbi->s_log_groups_per_flex = sbi->s_es->s_log_groups_per_flex; + groups_per_flex = 1 << sbi->s_log_groups_per_flex; + + if (groups_per_flex < 2) { sbi->s_log_groups_per_flex = 0; return 1; } - sbi->s_log_groups_per_flex = sbi->s_es->s_log_groups_per_flex; - groups_per_flex = 1 << sbi->s_log_groups_per_flex; - /* We allocate both existing and potentially added groups */ flex_group_count = ((sbi->s_groups_count + groups_per_flex - 1) + ((le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks) + 1) << @@ -1695,12 +1749,12 @@ static int ext4_fill_flex_info(struct super_block *sb) gdp = ext4_get_group_desc(sb, i, NULL); flex_group = ext4_flex_group(sbi, i); - atomic_set(&sbi->s_flex_groups[flex_group].free_inodes, - ext4_free_inodes_count(sb, gdp)); - atomic_set(&sbi->s_flex_groups[flex_group].free_blocks, - ext4_free_blks_count(sb, gdp)); - atomic_set(&sbi->s_flex_groups[flex_group].used_dirs, - ext4_used_dirs_count(sb, gdp)); + atomic_add(ext4_free_inodes_count(sb, gdp), + &sbi->s_flex_groups[flex_group].free_inodes); + atomic_add(ext4_free_blks_count(sb, gdp), + &sbi->s_flex_groups[flex_group].free_blocks); + atomic_add(ext4_used_dirs_count(sb, gdp), + &sbi->s_flex_groups[flex_group].used_dirs); } return 1; @@ -2197,6 +2251,7 @@ EXT4_RW_ATTR_SBI_UI(mb_min_to_scan, s_mb_min_to_scan); EXT4_RW_ATTR_SBI_UI(mb_order2_req, s_mb_order2_reqs); EXT4_RW_ATTR_SBI_UI(mb_stream_req, s_mb_stream_request); EXT4_RW_ATTR_SBI_UI(mb_group_prealloc, s_mb_group_prealloc); +EXT4_RW_ATTR_SBI_UI(max_writeback_mb_bump, s_max_writeback_mb_bump); static struct attribute *ext4_attrs[] = { ATTR_LIST(delayed_allocation_blocks), @@ -2210,6 +2265,7 @@ static struct attribute *ext4_attrs[] = { ATTR_LIST(mb_order2_req), ATTR_LIST(mb_stream_req), ATTR_LIST(mb_group_prealloc), + ATTR_LIST(max_writeback_mb_bump), NULL, }; @@ -2253,6 +2309,49 @@ static struct kobj_type ext4_ktype = { .release = ext4_sb_release, }; +/* + * Check whether this filesystem can be mounted based on + * the features present and the RDONLY/RDWR mount requested. + * Returns 1 if this filesystem can be mounted as requested, + * 0 if it cannot be. + */ +static int ext4_feature_set_ok(struct super_block *sb, int readonly) +{ + if (EXT4_HAS_INCOMPAT_FEATURE(sb, ~EXT4_FEATURE_INCOMPAT_SUPP)) { + ext4_msg(sb, KERN_ERR, + "Couldn't mount because of " + "unsupported optional features (%x)", + (le32_to_cpu(EXT4_SB(sb)->s_es->s_feature_incompat) & + ~EXT4_FEATURE_INCOMPAT_SUPP)); + return 0; + } + + if (readonly) + return 1; + + /* Check that feature set is OK for a read-write mount */ + if (EXT4_HAS_RO_COMPAT_FEATURE(sb, ~EXT4_FEATURE_RO_COMPAT_SUPP)) { + ext4_msg(sb, KERN_ERR, "couldn't mount RDWR because of " + "unsupported optional features (%x)", + (le32_to_cpu(EXT4_SB(sb)->s_es->s_feature_ro_compat) & + ~EXT4_FEATURE_RO_COMPAT_SUPP)); + return 0; + } + /* + * Large file size enabled file system can only be mounted + * read-write on 32-bit systems if kernel is built with CONFIG_LBDAF + */ + if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_HUGE_FILE)) { + if (sizeof(blkcnt_t) < sizeof(u64)) { + ext4_msg(sb, KERN_ERR, "Filesystem with huge files " + "cannot be mounted RDWR without " + "CONFIG_LBDAF"); + return 0; + } + } + return 1; +} + static int ext4_fill_super(struct super_block *sb, void *data, int silent) __releases(kernel_lock) __acquires(kernel_lock) @@ -2274,7 +2373,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) unsigned int db_count; unsigned int i; int needs_recovery, has_huge_files; - int features; __u64 blocks_count; int err; unsigned int journal_ioprio = DEFAULT_JOURNAL_IOPRIO; @@ -2401,39 +2499,9 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) * previously didn't change the revision level when setting the flags, * so there is a chance incompat flags are set on a rev 0 filesystem. */ - features = EXT4_HAS_INCOMPAT_FEATURE(sb, ~EXT4_FEATURE_INCOMPAT_SUPP); - if (features) { - ext4_msg(sb, KERN_ERR, - "Couldn't mount because of " - "unsupported optional features (%x)", - (le32_to_cpu(EXT4_SB(sb)->s_es->s_feature_incompat) & - ~EXT4_FEATURE_INCOMPAT_SUPP)); - goto failed_mount; - } - features = EXT4_HAS_RO_COMPAT_FEATURE(sb, ~EXT4_FEATURE_RO_COMPAT_SUPP); - if (!(sb->s_flags & MS_RDONLY) && features) { - ext4_msg(sb, KERN_ERR, - "Couldn't mount RDWR because of " - "unsupported optional features (%x)", - (le32_to_cpu(EXT4_SB(sb)->s_es->s_feature_ro_compat) & - ~EXT4_FEATURE_RO_COMPAT_SUPP)); + if (!ext4_feature_set_ok(sb, (sb->s_flags & MS_RDONLY))) goto failed_mount; - } - has_huge_files = EXT4_HAS_RO_COMPAT_FEATURE(sb, - EXT4_FEATURE_RO_COMPAT_HUGE_FILE); - if (has_huge_files) { - /* - * Large file size enabled file system can only be - * mount if kernel is build with CONFIG_LBDAF - */ - if (sizeof(root->i_blocks) < sizeof(u64) && - !(sb->s_flags & MS_RDONLY)) { - ext4_msg(sb, KERN_ERR, "Filesystem with huge " - "files cannot be mounted read-write " - "without CONFIG_LBDAF"); - goto failed_mount; - } - } + blocksize = BLOCK_SIZE << le32_to_cpu(es->s_log_block_size); if (blocksize < EXT4_MIN_BLOCK_SIZE || @@ -2469,6 +2537,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) } } + has_huge_files = EXT4_HAS_RO_COMPAT_FEATURE(sb, + EXT4_FEATURE_RO_COMPAT_HUGE_FILE); sbi->s_bitmap_maxbytes = ext4_max_bitmap_size(sb->s_blocksize_bits, has_huge_files); sb->s_maxbytes = ext4_max_size(sb->s_blocksize_bits, has_huge_files); @@ -2549,12 +2619,19 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) goto failed_mount; } - if (ext4_blocks_count(es) > - (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) { + /* + * Test whether we have more sectors than will fit in sector_t, + * and whether the max offset is addressable by the page cache. + */ + if ((ext4_blocks_count(es) > + (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) || + (ext4_blocks_count(es) > + (pgoff_t)(~0ULL) >> (PAGE_CACHE_SHIFT - sb->s_blocksize_bits))) { ext4_msg(sb, KERN_ERR, "filesystem" - " too large to mount safely"); + " too large to mount safely on this system"); if (sizeof(sector_t) < 8) ext4_msg(sb, KERN_WARNING, "CONFIG_LBDAF not enabled"); + ret = -EFBIG; goto failed_mount; } @@ -2595,6 +2672,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) goto failed_mount; } sbi->s_groups_count = blocks_count; + sbi->s_blockfile_groups = min_t(ext4_group_t, sbi->s_groups_count, + (EXT4_MAX_BLOCK_FILE_PHYS / EXT4_BLOCKS_PER_GROUP(sb))); db_count = (sbi->s_groups_count + EXT4_DESC_PER_BLOCK(sb) - 1) / EXT4_DESC_PER_BLOCK(sb); sbi->s_group_desc = kmalloc(db_count * sizeof(struct buffer_head *), @@ -2656,6 +2735,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) } sbi->s_stripe = ext4_get_stripe_size(sbi); + sbi->s_max_writeback_mb_bump = 128; /* * set up enough so that it can read an inode @@ -2781,6 +2861,12 @@ no_journal: clear_opt(sbi->s_mount_opt, NOBH); } } + EXT4_SB(sb)->dio_unwritten_wq = create_workqueue("ext4-dio-unwritten"); + if (!EXT4_SB(sb)->dio_unwritten_wq) { + printk(KERN_ERR "EXT4-fs: failed to create DIO workqueue\n"); + goto failed_mount_wq; + } + /* * The jbd2_journal_load will have done any necessary log recovery, * so we can safely mount the rest of the filesystem now. @@ -2893,6 +2979,8 @@ cantfind_ext4: failed_mount4: ext4_msg(sb, KERN_ERR, "mount failed"); + destroy_workqueue(EXT4_SB(sb)->dio_unwritten_wq); +failed_mount_wq: ext4_release_system_zone(sb); if (sbi->s_journal) { jbd2_journal_destroy(sbi->s_journal); @@ -3208,7 +3296,18 @@ static int ext4_commit_super(struct super_block *sb, int sync) clear_buffer_write_io_error(sbh); set_buffer_uptodate(sbh); } - es->s_wtime = cpu_to_le32(get_seconds()); + /* + * If the file system is mounted read-only, don't update the + * superblock write time. This avoids updating the superblock + * write time when we are mounting the root file system + * read/only but we need to replay the journal; at that point, + * for people who are east of GMT and who make their clock + * tick in localtime for Windows bug-for-bug compatibility, + * the clock is set in the future, and this will cause e2fsck + * to complain and force a full file system check. + */ + if (!(sb->s_flags & MS_RDONLY)) + es->s_wtime = cpu_to_le32(get_seconds()); es->s_kbytes_written = cpu_to_le64(EXT4_SB(sb)->s_kbytes_written + ((part_stat_read(sb->s_bdev->bd_part, sectors[1]) - @@ -3333,11 +3432,13 @@ static int ext4_sync_fs(struct super_block *sb, int wait) { int ret = 0; tid_t target; + struct ext4_sb_info *sbi = EXT4_SB(sb); trace_ext4_sync_fs(sb, wait); - if (jbd2_journal_start_commit(EXT4_SB(sb)->s_journal, &target)) { + flush_workqueue(sbi->dio_unwritten_wq); + if (jbd2_journal_start_commit(sbi->s_journal, &target)) { if (wait) - jbd2_log_wait_commit(EXT4_SB(sb)->s_journal, target); + jbd2_log_wait_commit(sbi->s_journal, target); } return ret; } @@ -3477,18 +3578,11 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) if (sbi->s_journal) ext4_mark_recovery_complete(sb, es); } else { - int ret; - if ((ret = EXT4_HAS_RO_COMPAT_FEATURE(sb, - ~EXT4_FEATURE_RO_COMPAT_SUPP))) { - ext4_msg(sb, KERN_WARNING, "couldn't " - "remount RDWR because of unsupported " - "optional features (%x)", - (le32_to_cpu(sbi->s_es->s_feature_ro_compat) & - ~EXT4_FEATURE_RO_COMPAT_SUPP)); + /* Make sure we can mount this feature set readwrite */ + if (!ext4_feature_set_ok(sb, 0)) { err = -EROFS; goto restore_opts; } - /* * Make sure the group descriptor checksums * are sane. If they aren't, refuse to remount r/w. @@ -3624,13 +3718,11 @@ static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf) buf->f_blocks = ext4_blocks_count(es) - sbi->s_overhead_last; buf->f_bfree = percpu_counter_sum_positive(&sbi->s_freeblocks_counter) - percpu_counter_sum_positive(&sbi->s_dirtyblocks_counter); - ext4_free_blocks_count_set(es, buf->f_bfree); buf->f_bavail = buf->f_bfree - ext4_r_blocks_count(es); if (buf->f_bfree < ext4_r_blocks_count(es)) buf->f_bavail = 0; buf->f_files = le32_to_cpu(es->s_inodes_count); buf->f_ffree = percpu_counter_sum_positive(&sbi->s_freeinodes_counter); - es->s_free_inodes_count = cpu_to_le32(buf->f_ffree); buf->f_namelen = EXT4_NAME_LEN; fsid = le64_to_cpup((void *)es->s_uuid) ^ le64_to_cpup((void *)es->s_uuid + sizeof(u64)); diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c index 62b31c246994..025701926f9a 100644 --- a/fs/ext4/xattr.c +++ b/fs/ext4/xattr.c @@ -810,12 +810,23 @@ inserted: get_bh(new_bh); } else { /* We need to allocate a new block */ - ext4_fsblk_t goal = ext4_group_first_block_no(sb, + ext4_fsblk_t goal, block; + + goal = ext4_group_first_block_no(sb, EXT4_I(inode)->i_block_group); - ext4_fsblk_t block = ext4_new_meta_blocks(handle, inode, + + /* non-extent files can't have physical blocks past 2^32 */ + if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)) + goal = goal & EXT4_MAX_BLOCK_FILE_PHYS; + + block = ext4_new_meta_blocks(handle, inode, goal, NULL, &error); if (error) goto cleanup; + + if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)) + BUG_ON(block > EXT4_MAX_BLOCK_FILE_PHYS); + ea_idebug(inode, "creating block %d", block); new_bh = sb_getblk(sb, block); @@ -977,6 +988,10 @@ ext4_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index, if (error) goto cleanup; + error = ext4_journal_get_write_access(handle, is.iloc.bh); + if (error) + goto cleanup; + if (EXT4_I(inode)->i_state & EXT4_STATE_NEW) { struct ext4_inode *raw_inode = ext4_raw_inode(&is.iloc); memset(raw_inode, 0, EXT4_SB(inode->i_sb)->s_inode_size); @@ -1002,9 +1017,6 @@ ext4_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index, if (flags & XATTR_CREATE) goto cleanup; } - error = ext4_journal_get_write_access(handle, is.iloc.bh); - if (error) - goto cleanup; if (!value) { if (!is.s.not_found) error = ext4_xattr_ibody_set(handle, inode, &i, &is); diff --git a/fs/fat/dir.c b/fs/fat/dir.c index 4ceff5110417..530b4ca01510 100644 --- a/fs/fat/dir.c +++ b/fs/fat/dir.c @@ -758,13 +758,6 @@ static int fat_ioctl_readdir(struct inode *inode, struct file *filp, return ret; } -static int fat_ioctl_volume_id(struct inode *dir) -{ - struct super_block *sb = dir->i_sb; - struct msdos_sb_info *sbi = MSDOS_SB(sb); - return sbi->vol_id; -} - static int fat_dir_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { @@ -780,8 +773,6 @@ static int fat_dir_ioctl(struct inode *inode, struct file *filp, short_only = 0; both = 1; break; - case VFAT_IOCTL_GET_VOLUME_ID: - return fat_ioctl_volume_id(inode); default: return fat_generic_ioctl(inode, filp, cmd, arg); } diff --git a/fs/fat/fat.h b/fs/fat/fat.h index 09305185330f..adb0e72a176d 100644 --- a/fs/fat/fat.h +++ b/fs/fat/fat.h @@ -76,7 +76,6 @@ struct msdos_sb_info { const void *dir_ops; /* Opaque; default directory operations */ int dir_per_block; /* dir entries per block */ int dir_per_block_bits; /* log2(dir_per_block) */ - unsigned long vol_id; /* volume ID */ int fatent_shift; struct fatent_operations *fatent_ops; diff --git a/fs/fcntl.c b/fs/fcntl.c index ae413086db97..11fd78c4b07e 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c @@ -526,60 +526,90 @@ static DEFINE_RWLOCK(fasync_lock); static struct kmem_cache *fasync_cache __read_mostly; /* - * fasync_helper() is used by almost all character device drivers - * to set up the fasync queue. It returns negative on error, 0 if it did - * no changes and positive if it added/deleted the entry. + * Remove a fasync entry. If successfully removed, return + * positive and clear the FASYNC flag. If no entry exists, + * do nothing and return 0. + * + * NOTE! It is very important that the FASYNC flag always + * match the state "is the filp on a fasync list". + * + * We always take the 'filp->f_lock', in since fasync_lock + * needs to be irq-safe. */ -int fasync_helper(int fd, struct file * filp, int on, struct fasync_struct **fapp) +static int fasync_remove_entry(struct file *filp, struct fasync_struct **fapp) { struct fasync_struct *fa, **fp; - struct fasync_struct *new = NULL; int result = 0; - if (on) { - new = kmem_cache_alloc(fasync_cache, GFP_KERNEL); - if (!new) - return -ENOMEM; + spin_lock(&filp->f_lock); + write_lock_irq(&fasync_lock); + for (fp = fapp; (fa = *fp) != NULL; fp = &fa->fa_next) { + if (fa->fa_file != filp) + continue; + *fp = fa->fa_next; + kmem_cache_free(fasync_cache, fa); + filp->f_flags &= ~FASYNC; + result = 1; + break; } + write_unlock_irq(&fasync_lock); + spin_unlock(&filp->f_lock); + return result; +} + +/* + * Add a fasync entry. Return negative on error, positive if + * added, and zero if did nothing but change an existing one. + * + * NOTE! It is very important that the FASYNC flag always + * match the state "is the filp on a fasync list". + */ +static int fasync_add_entry(int fd, struct file *filp, struct fasync_struct **fapp) +{ + struct fasync_struct *new, *fa, **fp; + int result = 0; + + new = kmem_cache_alloc(fasync_cache, GFP_KERNEL); + if (!new) + return -ENOMEM; - /* - * We need to take f_lock first since it's not an IRQ-safe - * lock. - */ spin_lock(&filp->f_lock); write_lock_irq(&fasync_lock); for (fp = fapp; (fa = *fp) != NULL; fp = &fa->fa_next) { - if (fa->fa_file == filp) { - if(on) { - fa->fa_fd = fd; - kmem_cache_free(fasync_cache, new); - } else { - *fp = fa->fa_next; - kmem_cache_free(fasync_cache, fa); - result = 1; - } - goto out; - } + if (fa->fa_file != filp) + continue; + fa->fa_fd = fd; + kmem_cache_free(fasync_cache, new); + goto out; } - if (on) { - new->magic = FASYNC_MAGIC; - new->fa_file = filp; - new->fa_fd = fd; - new->fa_next = *fapp; - *fapp = new; - result = 1; - } + new->magic = FASYNC_MAGIC; + new->fa_file = filp; + new->fa_fd = fd; + new->fa_next = *fapp; + *fapp = new; + result = 1; + filp->f_flags |= FASYNC; + out: - if (on) - filp->f_flags |= FASYNC; - else - filp->f_flags &= ~FASYNC; write_unlock_irq(&fasync_lock); spin_unlock(&filp->f_lock); return result; } +/* + * fasync_helper() is used by almost all character device drivers + * to set up the fasync queue, and for regular files by the file + * lease code. It returns negative on error, 0 if it did no changes + * and positive if it added/deleted the entry. + */ +int fasync_helper(int fd, struct file * filp, int on, struct fasync_struct **fapp) +{ + if (!on) + return fasync_remove_entry(filp, fapp); + return fasync_add_entry(fd, filp, fapp); +} + EXPORT_SYMBOL(fasync_helper); void __kill_fasync(struct fasync_struct *fa, int sig, int band) diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index e703654e7f40..d0dcaef04e46 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -385,6 +385,9 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode, if (fc->no_create) return -ENOSYS; + if (flags & O_DIRECT) + return -EINVAL; + forget_req = fuse_get_req(fc); if (IS_ERR(forget_req)) return PTR_ERR(forget_req); diff --git a/fs/fuse/file.c b/fs/fuse/file.c index cbc464043b6f..899870ada138 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -1063,7 +1063,8 @@ ssize_t fuse_direct_io(struct file *file, const char __user *buf, break; } } - fuse_put_request(fc, req); + if (!IS_ERR(req)) + fuse_put_request(fc, req); if (res > 0) *ppos = pos; @@ -1599,7 +1600,7 @@ static int fuse_ioctl_copy_user(struct page **pages, struct iovec *iov, kaddr += copy; } - kunmap(map); + kunmap(page); } return 0; diff --git a/fs/hfs/catalog.c b/fs/hfs/catalog.c index 6d98f116ca03..424b0337f524 100644 --- a/fs/hfs/catalog.c +++ b/fs/hfs/catalog.c @@ -289,6 +289,10 @@ int hfs_cat_move(u32 cnid, struct inode *src_dir, struct qstr *src_name, err = hfs_brec_find(&src_fd); if (err) goto out; + if (src_fd.entrylength > sizeof(entry) || src_fd.entrylength < 0) { + err = -EIO; + goto out; + } hfs_bnode_read(src_fd.bnode, &entry, src_fd.entryoffset, src_fd.entrylength); diff --git a/fs/hfs/dir.c b/fs/hfs/dir.c index 7c69b98a2e45..2b3b8611b41b 100644 --- a/fs/hfs/dir.c +++ b/fs/hfs/dir.c @@ -79,6 +79,11 @@ static int hfs_readdir(struct file *filp, void *dirent, filldir_t filldir) filp->f_pos++; /* fall through */ case 1: + if (fd.entrylength > sizeof(entry) || fd.entrylength < 0) { + err = -EIO; + goto out; + } + hfs_bnode_read(fd.bnode, &entry, fd.entryoffset, fd.entrylength); if (entry.type != HFS_CDR_THD) { printk(KERN_ERR "hfs: bad catalog folder thread\n"); @@ -109,6 +114,12 @@ static int hfs_readdir(struct file *filp, void *dirent, filldir_t filldir) err = -EIO; goto out; } + + if (fd.entrylength > sizeof(entry) || fd.entrylength < 0) { + err = -EIO; + goto out; + } + hfs_bnode_read(fd.bnode, &entry, fd.entryoffset, fd.entrylength); type = entry.type; len = hfs_mac2asc(sb, strbuf, &fd.key->cat.CName); diff --git a/fs/hfs/super.c b/fs/hfs/super.c index f7fcbe49da72..5ed7252b7b23 100644 --- a/fs/hfs/super.c +++ b/fs/hfs/super.c @@ -409,8 +409,13 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent) /* try to get the root inode */ hfs_find_init(HFS_SB(sb)->cat_tree, &fd); res = hfs_cat_find_brec(sb, HFS_ROOT_CNID, &fd); - if (!res) + if (!res) { + if (fd.entrylength > sizeof(rec) || fd.entrylength < 0) { + res = -EIO; + goto bail; + } hfs_bnode_read(fd.bnode, &rec, fd.entryoffset, fd.entrylength); + } if (res) { hfs_find_exit(&fd); goto bail_no_root; diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c index 175d08eacc86..bed78ac8f6d1 100644 --- a/fs/hfsplus/wrapper.c +++ b/fs/hfsplus/wrapper.c @@ -99,6 +99,10 @@ int hfsplus_read_wrapper(struct super_block *sb) if (hfsplus_get_last_session(sb, &part_start, &part_size)) return -EINVAL; + if ((u64)part_start + part_size > 0x100000000ULL) { + pr_err("hfs: volumes larger than 2TB are not supported yet\n"); + return -EINVAL; + } while (1) { bh = sb_bread512(sb, part_start + HFSPLUS_VOLHEAD_SECTOR, vhdr); if (!bh) diff --git a/fs/inode.c b/fs/inode.c index ae7b67e48661..1a959c081514 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -697,13 +697,15 @@ void unlock_new_inode(struct inode *inode) } #endif /* - * This is special! We do not need the spinlock - * when clearing I_LOCK, because we're guaranteed - * that nobody else tries to do anything about the - * state of the inode when it is locked, as we - * just created it (so there can be no old holders - * that haven't tested I_LOCK). + * This is special! We do not need the spinlock when clearing I_LOCK, + * because we're guaranteed that nobody else tries to do anything about + * the state of the inode when it is locked, as we just created it (so + * there can be no old holders that haven't tested I_LOCK). + * However we must emit the memory barrier so that other CPUs reliably + * see the clearing of I_LOCK after the other inode initialisation has + * completed. */ + smp_mb(); WARN_ON((inode->i_state & (I_LOCK|I_NEW)) != (I_LOCK|I_NEW)); inode->i_state &= ~(I_LOCK|I_NEW); wake_up_inode(inode); diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index 7b4088b2364d..8cf902ae7147 100644 --- a/fs/jbd2/commit.c +++ b/fs/jbd2/commit.c @@ -636,6 +636,10 @@ void jbd2_journal_commit_transaction(journal_t *journal) JBUFFER_TRACE(jh, "ph3: write metadata"); flags = jbd2_journal_write_metadata_buffer(commit_transaction, jh, &new_jh, blocknr); + if (flags < 0) { + jbd2_journal_abort(journal, flags); + continue; + } set_bit(BH_JWrite, &jh2bh(new_jh)->b_state); wbuf[bufs++] = jh2bh(new_jh); diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index e378cb383979..ead427ced0a6 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -78,6 +78,7 @@ EXPORT_SYMBOL(jbd2_journal_errno); EXPORT_SYMBOL(jbd2_journal_ack_err); EXPORT_SYMBOL(jbd2_journal_clear_err); EXPORT_SYMBOL(jbd2_log_wait_commit); +EXPORT_SYMBOL(jbd2_log_start_commit); EXPORT_SYMBOL(jbd2_journal_start_commit); EXPORT_SYMBOL(jbd2_journal_force_commit_nested); EXPORT_SYMBOL(jbd2_journal_wipe); @@ -361,6 +362,10 @@ repeat: jbd_unlock_bh_state(bh_in); tmp = jbd2_alloc(bh_in->b_size, GFP_NOFS); + if (!tmp) { + jbd2_journal_put_journal_head(new_jh); + return -ENOMEM; + } jbd_lock_bh_state(bh_in); if (jh_in->b_frozen_data) { jbd2_free(tmp, bh_in->b_size); @@ -1187,6 +1192,12 @@ static int journal_reset(journal_t *journal) first = be32_to_cpu(sb->s_first); last = be32_to_cpu(sb->s_maxlen); + if (first + JBD2_MIN_JOURNAL_BLOCKS > last + 1) { + printk(KERN_ERR "JBD: Journal too short (blocks %llu-%llu).\n", + first, last); + journal_fail_superblock(journal); + return -EINVAL; + } journal->j_first = first; journal->j_last = last; @@ -1410,6 +1421,13 @@ int jbd2_journal_load(journal_t *journal) if (jbd2_journal_recover(journal)) goto recovery_error; + if (journal->j_failed_commit) { + printk(KERN_ERR "JBD2: journal transaction %u on %s " + "is corrupt.\n", journal->j_failed_commit, + journal->j_devname); + return -EIO; + } + /* OK, we've finished with the dynamic journal bits: * reinitialise the dynamic contents of the superblock in memory * and reset them on disk. */ diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index 6213ac728f30..a0512700542f 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c @@ -57,7 +57,7 @@ jbd2_get_transaction(journal_t *journal, transaction_t *transaction) INIT_LIST_HEAD(&transaction->t_private_list); /* Set up the commit timer for the new transaction. */ - journal->j_commit_timer.expires = round_jiffies(transaction->t_expires); + journal->j_commit_timer.expires = round_jiffies_up(transaction->t_expires); add_timer(&journal->j_commit_timer); J_ASSERT(journal->j_running_transaction == NULL); @@ -238,6 +238,8 @@ repeat_locked: __jbd2_log_space_left(journal)); spin_unlock(&transaction->t_handle_lock); spin_unlock(&journal->j_state_lock); + + lock_map_acquire(&handle->h_lockdep_map); out: if (unlikely(new_transaction)) /* It's usually NULL */ kfree(new_transaction); @@ -303,8 +305,6 @@ handle_t *jbd2_journal_start(journal_t *journal, int nblocks) handle = ERR_PTR(err); goto out; } - - lock_map_acquire(&handle->h_lockdep_map); out: return handle; } @@ -426,6 +426,7 @@ int jbd2_journal_restart(handle_t *handle, int nblocks) __jbd2_log_start_commit(journal, transaction->t_tid); spin_unlock(&journal->j_state_lock); + lock_map_release(&handle->h_lockdep_map); handle->h_buffer_credits = nblocks; ret = start_this_handle(journal, handle); return ret; diff --git a/fs/jffs2/gc.c b/fs/jffs2/gc.c index 090c556ffed2..3b6f2fa12cff 100644 --- a/fs/jffs2/gc.c +++ b/fs/jffs2/gc.c @@ -700,7 +700,8 @@ static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_ struct jffs2_raw_inode ri; struct jffs2_node_frag *last_frag; union jffs2_device_node dev; - char *mdata = NULL, mdatalen = 0; + char *mdata = NULL; + int mdatalen = 0; uint32_t alloclen, ilen; int ret; diff --git a/fs/jffs2/read.c b/fs/jffs2/read.c index cfe05c1966a5..3f39be1b0455 100644 --- a/fs/jffs2/read.c +++ b/fs/jffs2/read.c @@ -164,12 +164,15 @@ int jffs2_read_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f, /* XXX FIXME: Where a single physical node actually shows up in two frags, we read it twice. Don't do that. */ - /* Now we're pointing at the first frag which overlaps our page */ + /* Now we're pointing at the first frag which overlaps our page + * (or perhaps is before it, if we've been asked to read off the + * end of the file). */ while(offset < end) { D2(printk(KERN_DEBUG "jffs2_read_inode_range: offset %d, end %d\n", offset, end)); - if (unlikely(!frag || frag->ofs > offset)) { + if (unlikely(!frag || frag->ofs > offset || + frag->ofs + frag->size <= offset)) { uint32_t holesize = end - offset; - if (frag) { + if (frag && frag->ofs > offset) { D1(printk(KERN_NOTICE "Eep. Hole in ino #%u fraglist. frag->ofs = 0x%08x, offset = 0x%08x\n", f->inocache->ino, frag->ofs, offset)); holesize = min(holesize, frag->ofs - offset); } diff --git a/fs/namei.c b/fs/namei.c index 1f13751693a5..20ab69f3320a 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -221,6 +221,7 @@ int generic_permission(struct inode *inode, int mask, /* * Searching includes executable on directories, else just read. */ + mask &= MAY_READ | MAY_WRITE | MAY_EXEC; if (mask == MAY_READ || (S_ISDIR(inode->i_mode) && !(mask & MAY_WRITE))) if (capable(CAP_DAC_READ_SEARCH)) return 0; @@ -822,6 +823,17 @@ fail: } /* + * This is a temporary kludge to deal with "automount" symlinks; proper + * solution is to trigger them on follow_mount(), so that do_lookup() + * would DTRT. To be killed before 2.6.34-final. + */ +static inline int follow_on_final(struct inode *inode, unsigned lookup_flags) +{ + return inode && unlikely(inode->i_op->follow_link) && + ((lookup_flags & LOOKUP_FOLLOW) || S_ISDIR(inode->i_mode)); +} + +/* * Name resolution. * This is the basic name resolution function, turning a pathname into * the final dentry. We expect 'base' to be positive and a directory. @@ -963,8 +975,7 @@ last_component: if (err) break; inode = next.dentry->d_inode; - if ((lookup_flags & LOOKUP_FOLLOW) - && inode && inode->i_op->follow_link) { + if (follow_on_final(inode, lookup_flags)) { err = do_follow_link(&next, nd); if (err) goto return_err; @@ -1533,9 +1544,11 @@ int may_open(struct path *path, int acc_mode, int flag) if (error) return error; - error = ima_path_check(path, - acc_mode & (MAY_READ | MAY_WRITE | MAY_EXEC), + error = ima_path_check(path, acc_mode ? + acc_mode & (MAY_READ | MAY_WRITE | MAY_EXEC) : + ACC_MODE(flag) & (MAY_READ | MAY_WRITE), IMA_COUNT_UPDATE); + if (error) return error; /* diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 8d25ccb2d51d..bdd76b9b5700 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c @@ -1171,7 +1171,7 @@ static int nfs4_init_client(struct nfs_client *clp, 1, flags & NFS_MOUNT_NORESVPORT); if (error < 0) goto error; - memcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr)); + strlcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr)); error = nfs_idmap_new(clp); if (error < 0) { diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 32062c33c859..7cb298525eef 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -1536,6 +1536,8 @@ nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) old_dentry->d_parent->d_name.name, old_dentry->d_name.name, dentry->d_parent->d_name.name, dentry->d_name.name); + nfs_inode_return_delegation(inode); + d_drop(dentry); error = NFS_PROTO(dir)->link(inode, dir, &dentry->d_name); if (error == 0) { diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index e4e089a8f294..1af78ffbe337 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c @@ -457,6 +457,7 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq) }; struct rpc_task_setup task_setup_data = { .rpc_client = NFS_CLIENT(inode), + .rpc_message = &msg, .callback_ops = &nfs_write_direct_ops, .workqueue = nfsiod_workqueue, .flags = RPC_TASK_ASYNC, diff --git a/fs/nfs/fscache.c b/fs/nfs/fscache.c index 379be678cb7e..a81d05b693f9 100644 --- a/fs/nfs/fscache.c +++ b/fs/nfs/fscache.c @@ -337,21 +337,20 @@ void nfs_fscache_reset_inode_cookie(struct inode *inode) */ int nfs_fscache_release_page(struct page *page, gfp_t gfp) { - struct nfs_inode *nfsi = NFS_I(page->mapping->host); - struct fscache_cookie *cookie = nfsi->fscache; - - BUG_ON(!cookie); - - if (fscache_check_page_write(cookie, page)) { - if (!(gfp & __GFP_WAIT)) - return 0; - fscache_wait_on_page_write(cookie, page); - } - if (PageFsCache(page)) { + struct nfs_inode *nfsi = NFS_I(page->mapping->host); + struct fscache_cookie *cookie = nfsi->fscache; + + BUG_ON(!cookie); dfprintk(FSCACHE, "NFS: fscache releasepage (0x%p/0x%p/0x%p)\n", cookie, page, nfsi); + if (fscache_check_page_write(cookie, page)) { + if (!(gfp & __GFP_WAIT)) + return 0; + fscache_wait_on_page_write(cookie, page); + } + fscache_uncache_page(cookie, page); nfs_add_fscache_stats(page->mapping->host, NFSIOS_FSCACHE_PAGES_UNCACHED, 1); diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 6917311f201c..54baaef8998e 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -71,12 +71,17 @@ static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, /* Prevent leaks of NFSv4 errors into userland */ static int nfs4_map_errors(int err) { - if (err < -1000) { + if (err >= -1000) + return err; + switch (err) { + case -NFS4ERR_RESOURCE: + return -EREMOTEIO; + default: dprintk("%s could not handle NFSv4 error %d\n", __func__, -err); - return -EIO; + break; } - return err; + return -EIO; } /* @@ -2735,7 +2740,7 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred, .pages = &page, .pgbase = 0, .count = count, - .bitmask = NFS_SERVER(dentry->d_inode)->cache_consistency_bitmask, + .bitmask = NFS_SERVER(dentry->d_inode)->attr_bitmask, }; struct nfs4_readdir_res res; struct rpc_message msg = { @@ -3033,9 +3038,6 @@ static void nfs4_renew_done(struct rpc_task *task, void *data) if (time_before(clp->cl_last_renewal,timestamp)) clp->cl_last_renewal = timestamp; spin_unlock(&clp->cl_lock); - dprintk("%s calling put_rpccred on rpc_cred %p\n", __func__, - task->tk_msg.rpc_cred); - put_rpccred(task->tk_msg.rpc_cred); } static const struct rpc_call_ops nfs4_renew_ops = { @@ -4850,7 +4852,6 @@ void nfs41_sequence_call_done(struct rpc_task *task, void *data) nfs41_sequence_free_slot(clp, task->tk_msg.rpc_resp); dprintk("%s rpc_cred %p\n", __func__, task->tk_msg.rpc_cred); - put_rpccred(task->tk_msg.rpc_cred); kfree(task->tk_msg.rpc_argp); kfree(task->tk_msg.rpc_resp); diff --git a/fs/nfs/nfs4renewd.c b/fs/nfs/nfs4renewd.c index e27c6cef18f2..0156c01c212c 100644 --- a/fs/nfs/nfs4renewd.c +++ b/fs/nfs/nfs4renewd.c @@ -127,12 +127,6 @@ nfs4_schedule_state_renewal(struct nfs_client *clp) } void -nfs4_renewd_prepare_shutdown(struct nfs_server *server) -{ - cancel_delayed_work(&server->nfs_client->cl_renewd); -} - -void nfs4_kill_renewd(struct nfs_client *clp) { cancel_delayed_work_sync(&clp->cl_renewd); diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index 617273e7d47f..f4c9e1a0d9ce 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c @@ -5406,7 +5406,6 @@ static struct { { NFS4ERR_SERVERFAULT, -ESERVERFAULT }, { NFS4ERR_BADTYPE, -EBADTYPE }, { NFS4ERR_LOCKED, -EAGAIN }, - { NFS4ERR_RESOURCE, -EREMOTEIO }, { NFS4ERR_SYMLINK, -ELOOP }, { NFS4ERR_OP_ILLEGAL, -EOPNOTSUPP }, { NFS4ERR_DEADLOCK, -EDEADLK }, diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 0b4cbdc60abd..98481693665e 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c @@ -1323,6 +1323,7 @@ static int nfs_parse_mount_options(char *raw, default: dfprintk(MOUNT, "NFS: unrecognized " "transport protocol\n"); + kfree(string); return 0; } break; @@ -2669,7 +2670,6 @@ static void nfs4_kill_super(struct super_block *sb) dprintk("--> %s\n", __func__); nfs_super_return_all_delegations(sb); kill_anon_super(sb); - nfs4_renewd_prepare_shutdown(server); nfs_fscache_release_super_cookie(sb); nfs_free_server(server); dprintk("<-- %s\n", __func__); diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c index 3fd23f7aceca..bf9b470f4d00 100644 --- a/fs/nfsd/nfs4callback.c +++ b/fs/nfsd/nfs4callback.c @@ -444,6 +444,7 @@ static struct rpc_cred *lookup_cb_cred(struct nfs4_cb_conn *cb) struct auth_cred acred = { .machine_cred = 1 }; + struct rpc_auth *auth = cb->cb_client->cl_auth; /* * Note in the gss case this doesn't actually have to wait for a @@ -451,8 +452,7 @@ static struct rpc_cred *lookup_cb_cred(struct nfs4_cb_conn *cb) * non-uptodate cred which the rpc state machine will fill in with * a refresh_upcall later. */ - return rpcauth_lookup_credcache(cb->cb_client->cl_auth, &acred, - RPCAUTH_LOOKUP_NEW); + return auth->au_ops->lookup_cred(auth, &acred, RPCAUTH_LOOKUP_NEW); } void do_probe_callback(struct nfs4_client *clp) diff --git a/fs/nilfs2/btnode.c b/fs/nilfs2/btnode.c index c668bca579c1..862ad299aad0 100644 --- a/fs/nilfs2/btnode.c +++ b/fs/nilfs2/btnode.c @@ -36,6 +36,7 @@ void nilfs_btnode_cache_init_once(struct address_space *btnc) { + memset(btnc, 0, sizeof(*btnc)); INIT_RADIX_TREE(&btnc->page_tree, GFP_ATOMIC); spin_lock_init(&btnc->tree_lock); INIT_LIST_HEAD(&btnc->private_list); @@ -275,8 +276,7 @@ void nilfs_btnode_commit_change_key(struct address_space *btnc, "invalid oldkey %lld (newkey=%lld)", (unsigned long long)oldkey, (unsigned long long)newkey); - if (!test_set_buffer_dirty(obh) && TestSetPageDirty(opage)) - BUG(); + nilfs_btnode_mark_dirty(obh); spin_lock_irq(&btnc->tree_lock); radix_tree_delete(&btnc->page_tree, oldkey); diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c index 6ea5f872e2de..f6b6016e60f2 100644 --- a/fs/nilfs2/ioctl.c +++ b/fs/nilfs2/ioctl.c @@ -297,7 +297,18 @@ static int nilfs_ioctl_move_inode_block(struct inode *inode, (unsigned long long)vdesc->vd_vblocknr); return ret; } - bh->b_private = vdesc; + if (unlikely(!list_empty(&bh->b_assoc_buffers))) { + printk(KERN_CRIT "%s: conflicting %s buffer: ino=%llu, " + "cno=%llu, offset=%llu, blocknr=%llu, vblocknr=%llu\n", + __func__, vdesc->vd_flags ? "node" : "data", + (unsigned long long)vdesc->vd_ino, + (unsigned long long)vdesc->vd_cno, + (unsigned long long)vdesc->vd_offset, + (unsigned long long)vdesc->vd_blocknr, + (unsigned long long)vdesc->vd_vblocknr); + brelse(bh); + return -EEXIST; + } list_add_tail(&bh->b_assoc_buffers, buffers); return 0; } @@ -335,24 +346,10 @@ static int nilfs_ioctl_move_blocks(struct the_nilfs *nilfs, list_for_each_entry_safe(bh, n, &buffers, b_assoc_buffers) { ret = nilfs_gccache_wait_and_mark_dirty(bh); if (unlikely(ret < 0)) { - if (ret == -EEXIST) { - vdesc = bh->b_private; - printk(KERN_CRIT - "%s: conflicting %s buffer: " - "ino=%llu, cno=%llu, offset=%llu, " - "blocknr=%llu, vblocknr=%llu\n", - __func__, - vdesc->vd_flags ? "node" : "data", - (unsigned long long)vdesc->vd_ino, - (unsigned long long)vdesc->vd_cno, - (unsigned long long)vdesc->vd_offset, - (unsigned long long)vdesc->vd_blocknr, - (unsigned long long)vdesc->vd_vblocknr); - } + WARN_ON(ret == -EEXIST); goto failed; } list_del_init(&bh->b_assoc_buffers); - bh->b_private = NULL; brelse(bh); } return nmembs; @@ -360,7 +357,6 @@ static int nilfs_ioctl_move_blocks(struct the_nilfs *nilfs, failed: list_for_each_entry_safe(bh, n, &buffers, b_assoc_buffers) { list_del_init(&bh->b_assoc_buffers); - bh->b_private = NULL; brelse(bh); } return ret; diff --git a/fs/notify/dnotify/dnotify.c b/fs/notify/dnotify/dnotify.c index 828a889be909..7e54e52964dd 100644 --- a/fs/notify/dnotify/dnotify.c +++ b/fs/notify/dnotify/dnotify.c @@ -91,6 +91,7 @@ static int dnotify_handle_event(struct fsnotify_group *group, struct dnotify_struct *dn; struct dnotify_struct **prev; struct fown_struct *fown; + __u32 test_mask = event->mask & ~FS_EVENT_ON_CHILD; to_tell = event->to_tell; @@ -106,7 +107,7 @@ static int dnotify_handle_event(struct fsnotify_group *group, spin_lock(&entry->lock); prev = &dnentry->dn; while ((dn = *prev) != NULL) { - if ((dn->dn_mask & event->mask) == 0) { + if ((dn->dn_mask & test_mask) == 0) { prev = &dn->dn_next; continue; } diff --git a/fs/notify/inode_mark.c b/fs/notify/inode_mark.c index c8a07c65482b..3165d85aada2 100644 --- a/fs/notify/inode_mark.c +++ b/fs/notify/inode_mark.c @@ -324,11 +324,11 @@ int fsnotify_add_mark(struct fsnotify_mark_entry *entry, spin_lock(&group->mark_lock); spin_lock(&inode->i_lock); - entry->group = group; - entry->inode = inode; - lentry = fsnotify_find_mark_entry(group, inode); if (!lentry) { + entry->group = group; + entry->inode = inode; + hlist_add_head(&entry->i_list, &inode->i_fsnotify_mark_entries); list_add(&entry->g_list, &group->mark_entries); diff --git a/fs/notify/inotify/inotify_fsnotify.c b/fs/notify/inotify/inotify_fsnotify.c index c9ee67b442e1..1afb0a10229f 100644 --- a/fs/notify/inotify/inotify_fsnotify.c +++ b/fs/notify/inotify/inotify_fsnotify.c @@ -121,7 +121,7 @@ static int idr_callback(int id, void *p, void *data) if (warned) return 0; - warned = false; + warned = true; entry = p; ientry = container_of(entry, struct inotify_inode_mark_entry, fsn_entry); diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c index dcd2040d330c..ca44337b06ce 100644 --- a/fs/notify/inotify/inotify_user.c +++ b/fs/notify/inotify/inotify_user.c @@ -558,7 +558,7 @@ retry: spin_lock(&group->inotify_data.idr_lock); ret = idr_get_new_above(&group->inotify_data.idr, &tmp_ientry->fsn_entry, - group->inotify_data.last_wd, + group->inotify_data.last_wd+1, &tmp_ientry->wd); spin_unlock(&group->inotify_data.idr_lock); if (ret) { @@ -638,7 +638,7 @@ static struct fsnotify_group *inotify_new_group(struct user_struct *user, unsign spin_lock_init(&group->inotify_data.idr_lock); idr_init(&group->inotify_data.idr); - group->inotify_data.last_wd = 1; + group->inotify_data.last_wd = 0; group->inotify_data.user = user; group->inotify_data.fa = NULL; diff --git a/fs/notify/notification.c b/fs/notify/notification.c index 3816d5750dd5..b8bf53b4c108 100644 --- a/fs/notify/notification.c +++ b/fs/notify/notification.c @@ -143,7 +143,7 @@ static bool event_compare(struct fsnotify_event *old, struct fsnotify_event *new /* remember, after old was put on the wait_q we aren't * allowed to look at the inode any more, only thing * left to check was if the file_name is the same */ - if (old->name_len && + if (!old->name_len || !strcmp(old->file_name, new->file_name)) return true; break; diff --git a/fs/ntfs/malloc.h b/fs/ntfs/malloc.h index cd0be3f5c3cd..a44b14cbceeb 100644 --- a/fs/ntfs/malloc.h +++ b/fs/ntfs/malloc.h @@ -47,7 +47,7 @@ static inline void *__ntfs_malloc(unsigned long size, gfp_t gfp_mask) return kmalloc(PAGE_SIZE, gfp_mask & ~__GFP_HIGHMEM); /* return (void *)__get_free_page(gfp_mask); */ } - if (likely(size >> PAGE_SHIFT < num_physpages)) + if (likely((size >> PAGE_SHIFT) < totalram_pages)) return __vmalloc(size, gfp_mask, PAGE_KERNEL); return NULL; } diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 5ff78a202e0a..ea4e6cb29e13 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c @@ -317,19 +317,10 @@ static void part_release(struct device *dev) kfree(p); } -static int part_uevent(struct device *dev, struct kobj_uevent_env *env) -{ - struct hd_struct *part = dev_to_part(dev); - - add_uevent_var(env, "PARTN=%u", part->partno); - return 0; -} - struct device_type part_type = { .name = "partition", .groups = part_attr_groups, .release = part_release, - .uevent = part_uevent, }; static void delete_partition_rcu_cb(struct rcu_head *head) diff --git a/fs/partitions/efi.c b/fs/partitions/efi.c index 038a6022152f..49cfd5f54238 100644 --- a/fs/partitions/efi.c +++ b/fs/partitions/efi.c @@ -1,7 +1,9 @@ /************************************************************ * EFI GUID Partition Table handling - * Per Intel EFI Specification v1.02 - * http://developer.intel.com/technology/efi/efi.htm + * + * http://www.uefi.org/specs/ + * http://www.intel.com/technology/efi/ + * * efi.[ch] by Matt Domsch <Matt_Domsch@dell.com> * Copyright 2000,2001,2002,2004 Dell Inc. * @@ -92,6 +94,7 @@ * ************************************************************/ #include <linux/crc32.h> +#include <linux/math64.h> #include "check.h" #include "efi.h" @@ -141,7 +144,8 @@ last_lba(struct block_device *bdev) { if (!bdev || !bdev->bd_inode) return 0; - return (bdev->bd_inode->i_size >> 9) - 1ULL; + return div_u64(bdev->bd_inode->i_size, + bdev_logical_block_size(bdev)) - 1ULL; } static inline int @@ -188,6 +192,7 @@ static size_t read_lba(struct block_device *bdev, u64 lba, u8 * buffer, size_t count) { size_t totalreadcount = 0; + sector_t n = lba * (bdev_logical_block_size(bdev) / 512); if (!bdev || !buffer || lba > last_lba(bdev)) return 0; @@ -195,7 +200,7 @@ read_lba(struct block_device *bdev, u64 lba, u8 * buffer, size_t count) while (count) { int copied = 512; Sector sect; - unsigned char *data = read_dev_sector(bdev, lba++, §); + unsigned char *data = read_dev_sector(bdev, n++, §); if (!data) break; if (copied > count) @@ -257,15 +262,16 @@ static gpt_header * alloc_read_gpt_header(struct block_device *bdev, u64 lba) { gpt_header *gpt; + unsigned ssz = bdev_logical_block_size(bdev); + if (!bdev) return NULL; - gpt = kzalloc(sizeof (gpt_header), GFP_KERNEL); + gpt = kzalloc(ssz, GFP_KERNEL); if (!gpt) return NULL; - if (read_lba(bdev, lba, (u8 *) gpt, - sizeof (gpt_header)) < sizeof (gpt_header)) { + if (read_lba(bdev, lba, (u8 *) gpt, ssz) < ssz) { kfree(gpt); gpt=NULL; return NULL; @@ -601,6 +607,7 @@ efi_partition(struct parsed_partitions *state, struct block_device *bdev) gpt_header *gpt = NULL; gpt_entry *ptes = NULL; u32 i; + unsigned ssz = bdev_logical_block_size(bdev) / 512; if (!find_valid_gpt(bdev, &gpt, &ptes) || !gpt || !ptes) { kfree(gpt); @@ -611,13 +618,14 @@ efi_partition(struct parsed_partitions *state, struct block_device *bdev) pr_debug("GUID Partition Table is valid! Yea!\n"); for (i = 0; i < le32_to_cpu(gpt->num_partition_entries) && i < state->limit-1; i++) { + u64 start = le64_to_cpu(ptes[i].starting_lba); + u64 size = le64_to_cpu(ptes[i].ending_lba) - + le64_to_cpu(ptes[i].starting_lba) + 1ULL; + if (!is_pte_valid(&ptes[i], last_lba(bdev))) continue; - put_partition(state, i+1, le64_to_cpu(ptes[i].starting_lba), - (le64_to_cpu(ptes[i].ending_lba) - - le64_to_cpu(ptes[i].starting_lba) + - 1ULL)); + put_partition(state, i+1, start * ssz, size * ssz); /* If this is a RAID volume, tell md */ if (!efi_guidcmp(ptes[i].partition_type_guid, diff --git a/fs/partitions/efi.h b/fs/partitions/efi.h index 2cc89d0475bf..6998b589abf9 100644 --- a/fs/partitions/efi.h +++ b/fs/partitions/efi.h @@ -37,7 +37,6 @@ #define EFI_PMBR_OSTYPE_EFI 0xEF #define EFI_PMBR_OSTYPE_EFI_GPT 0xEE -#define GPT_BLOCK_SIZE 512 #define GPT_HEADER_SIGNATURE 0x5452415020494645ULL #define GPT_HEADER_REVISION_V1 0x00010000 #define GPT_PRIMARY_PARTITION_TABLE_LBA 1 @@ -79,7 +78,12 @@ typedef struct _gpt_header { __le32 num_partition_entries; __le32 sizeof_partition_entry; __le32 partition_entry_array_crc32; - u8 reserved2[GPT_BLOCK_SIZE - 92]; + + /* The rest of the logical block is reserved by UEFI and must be zero. + * EFI standard handles this by: + * + * uint8_t reserved2[ BlockSize - 92 ]; + */ } __attribute__ ((packed)) gpt_header; typedef struct _gpt_entry_attributes { diff --git a/fs/pipe.c b/fs/pipe.c index 52c415114838..ae17d026aaa3 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -777,36 +777,55 @@ pipe_rdwr_release(struct inode *inode, struct file *filp) static int pipe_read_open(struct inode *inode, struct file *filp) { - /* We could have perhaps used atomic_t, but this and friends - below are the only places. So it doesn't seem worthwhile. */ + int ret = -ENOENT; + mutex_lock(&inode->i_mutex); - inode->i_pipe->readers++; + + if (inode->i_pipe) { + ret = 0; + inode->i_pipe->readers++; + } + mutex_unlock(&inode->i_mutex); - return 0; + return ret; } static int pipe_write_open(struct inode *inode, struct file *filp) { + int ret = -ENOENT; + mutex_lock(&inode->i_mutex); - inode->i_pipe->writers++; + + if (inode->i_pipe) { + ret = 0; + inode->i_pipe->writers++; + } + mutex_unlock(&inode->i_mutex); - return 0; + return ret; } static int pipe_rdwr_open(struct inode *inode, struct file *filp) { + int ret = -ENOENT; + mutex_lock(&inode->i_mutex); - if (filp->f_mode & FMODE_READ) - inode->i_pipe->readers++; - if (filp->f_mode & FMODE_WRITE) - inode->i_pipe->writers++; + + if (inode->i_pipe) { + ret = 0; + if (filp->f_mode & FMODE_READ) + inode->i_pipe->readers++; + if (filp->f_mode & FMODE_WRITE) + inode->i_pipe->writers++; + } + mutex_unlock(&inode->i_mutex); - return 0; + return ret; } /* diff --git a/fs/proc/base.c b/fs/proc/base.c index a0f94952faf2..baf53d92081a 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -127,8 +127,6 @@ struct pid_entry { NOD(NAME, (S_IFREG|(MODE)), \ NULL, &proc_single_file_operations, \ { .proc_show = show } ) -#define ARD(NAME, MODE, iops, fops) \ - NOD(NAME, (S_IFREG|(MODE)), &iops, &fops, {} ) /* * Count the number of hardlinks for the pid_entry table, excluding the . @@ -1045,35 +1043,6 @@ static ssize_t oom_adjust_write(struct file *file, const char __user *buf, return end - buffer; } -#ifdef CONFIG_ANDROID -static int oom_adjust_permission(struct inode *inode, int mask) -{ - uid_t uid; - struct task_struct *p = get_proc_task(inode); - if(p) { - uid = task_uid(p); - put_task_struct(p); - } - - /* - * System Server (uid == 1000) is granted access to oom_adj of all - * android applications (uid > 10000) as and services (uid >= 1000) - */ - if (p && (current_fsuid() == 1000) && (uid >= 1000)) { - if (inode->i_mode >> 6 & mask) { - return 0; - } - } - - /* Fall back to default. */ - return generic_permission(inode, mask, NULL); -} - -static const struct inode_operations proc_oom_adjust_inode_operations = { - .permission = oom_adjust_permission, -}; -#endif - static const struct file_operations proc_oom_adjust_operations = { .read = oom_adjust_read, .write = oom_adjust_write, @@ -2562,11 +2531,7 @@ static const struct pid_entry tgid_base_stuff[] = { REG("cgroup", S_IRUGO, proc_cgroup_operations), #endif INF("oom_score", S_IRUGO, proc_oom_score), -#ifndef CONFIG_ANDROID REG("oom_adj", S_IRUGO|S_IWUSR, proc_oom_adjust_operations), -#else - ARD("oom_adj", S_IRUGO|S_IWUSR, proc_oom_adjust_inode_operations, proc_oom_adjust_operations), -#endif #ifdef CONFIG_AUDITSYSCALL REG("loginuid", S_IWUSR|S_IRUGO, proc_loginuid_operations), REG("sessionid", S_IRUGO, proc_sessionid_operations), @@ -2615,8 +2580,7 @@ static void proc_flush_task_mnt(struct vfsmount *mnt, pid_t pid, pid_t tgid) name.len = snprintf(buf, sizeof(buf), "%d", pid); dentry = d_hash_and_lookup(mnt->mnt_root, &name); if (dentry) { - if (!(current->flags & PF_EXITING)) - shrink_dcache_parent(dentry); + shrink_dcache_parent(dentry); d_drop(dentry); dput(dentry); } diff --git a/fs/proc/kcore.c b/fs/proc/kcore.c index 59b43a068872..5fd7d2b3da82 100644 --- a/fs/proc/kcore.c +++ b/fs/proc/kcore.c @@ -361,7 +361,13 @@ read_kcore(struct file *file, char __user *buffer, size_t buflen, loff_t *fpos) /* don't dump ioremap'd stuff! (TA) */ if (m->flags & VM_IOREMAP) continue; - memcpy(elf_buf + (vmstart - start), + /* + * we may access memory holes, then use + * ex_table. checking return value just for + * avoid warnings. + */ + vmsize = __copy_from_user_inatomic( + elf_buf + (vmstart - start), (char *)vmstart, vmsize); } read_unlock(&vmlist_lock); diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 07376a4a3ed1..9bd8be1d235c 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -689,6 +689,8 @@ static ssize_t pagemap_read(struct file *file, char __user *buf, down_read(¤t->mm->mmap_sem); ret = get_user_pages(current, current->mm, uaddr, pagecount, 1, 0, pages, NULL); + up_read(¤t->mm->mmap_sem); + if (ret < 0) goto out_free; @@ -737,7 +739,6 @@ out_pages: page_cache_release(page); } out_free: - up_read(¤t->mm->mmap_sem); kfree(pages); out_mm: mmput(mm); diff --git a/fs/proc/uptime.c b/fs/proc/uptime.c index 0c10a0b3f146..766b1d456050 100644 --- a/fs/proc/uptime.c +++ b/fs/proc/uptime.c @@ -4,13 +4,18 @@ #include <linux/sched.h> #include <linux/seq_file.h> #include <linux/time.h> +#include <linux/kernel_stat.h> #include <asm/cputime.h> static int uptime_proc_show(struct seq_file *m, void *v) { struct timespec uptime; struct timespec idle; - cputime_t idletime = cputime_add(init_task.utime, init_task.stime); + int i; + cputime_t idletime = cputime_zero; + + for_each_possible_cpu(i) + idletime = cputime64_add(idletime, kstat_cpu(i).cpustat.idle); do_posix_clock_monotonic_gettime(&uptime); monotonic_to_bootbased(&uptime); diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 38f7bd559f35..86034fe03059 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -1388,6 +1388,70 @@ void vfs_dq_drop(struct inode *inode) EXPORT_SYMBOL(vfs_dq_drop); /* + * inode_reserved_space is managed internally by quota, and protected by + * i_lock similar to i_blocks+i_bytes. + */ +static qsize_t *inode_reserved_space(struct inode * inode) +{ + /* Filesystem must explicitly define it's own method in order to use + * quota reservation interface */ + BUG_ON(!inode->i_sb->dq_op->get_reserved_space); + return inode->i_sb->dq_op->get_reserved_space(inode); +} + +static void inode_add_rsv_space(struct inode *inode, qsize_t number) +{ + spin_lock(&inode->i_lock); + *inode_reserved_space(inode) += number; + spin_unlock(&inode->i_lock); +} + + +static void inode_claim_rsv_space(struct inode *inode, qsize_t number) +{ + spin_lock(&inode->i_lock); + *inode_reserved_space(inode) -= number; + __inode_add_bytes(inode, number); + spin_unlock(&inode->i_lock); +} + +static void inode_sub_rsv_space(struct inode *inode, qsize_t number) +{ + spin_lock(&inode->i_lock); + *inode_reserved_space(inode) -= number; + spin_unlock(&inode->i_lock); +} + +static qsize_t inode_get_rsv_space(struct inode *inode) +{ + qsize_t ret; + + if (!inode->i_sb->dq_op->get_reserved_space) + return 0; + spin_lock(&inode->i_lock); + ret = *inode_reserved_space(inode); + spin_unlock(&inode->i_lock); + return ret; +} + +static void inode_incr_space(struct inode *inode, qsize_t number, + int reserve) +{ + if (reserve) + inode_add_rsv_space(inode, number); + else + inode_add_bytes(inode, number); +} + +static void inode_decr_space(struct inode *inode, qsize_t number, int reserve) +{ + if (reserve) + inode_sub_rsv_space(inode, number); + else + inode_sub_bytes(inode, number); +} + +/* * Following four functions update i_blocks+i_bytes fields and * quota information (together with appropriate checks) * NOTE: We absolutely rely on the fact that caller dirties @@ -1405,6 +1469,21 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number, int cnt, ret = QUOTA_OK; char warntype[MAXQUOTAS]; + /* + * First test before acquiring mutex - solves deadlocks when we + * re-enter the quota code and are already holding the mutex + */ + if (IS_NOQUOTA(inode)) { + inode_incr_space(inode, number, reserve); + goto out; + } + + down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); + if (IS_NOQUOTA(inode)) { + inode_incr_space(inode, number, reserve); + goto out_unlock; + } + for (cnt = 0; cnt < MAXQUOTAS; cnt++) warntype[cnt] = QUOTA_NL_NOWARN; @@ -1415,7 +1494,8 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number, if (check_bdq(inode->i_dquot[cnt], number, warn, warntype+cnt) == NO_QUOTA) { ret = NO_QUOTA; - goto out_unlock; + spin_unlock(&dq_data_lock); + goto out_flush_warn; } } for (cnt = 0; cnt < MAXQUOTAS; cnt++) { @@ -1426,64 +1506,32 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number, else dquot_incr_space(inode->i_dquot[cnt], number); } - if (!reserve) - inode_add_bytes(inode, number); -out_unlock: + inode_incr_space(inode, number, reserve); spin_unlock(&dq_data_lock); - flush_warnings(inode->i_dquot, warntype); - return ret; -} - -int dquot_alloc_space(struct inode *inode, qsize_t number, int warn) -{ - int cnt, ret = QUOTA_OK; - - /* - * First test before acquiring mutex - solves deadlocks when we - * re-enter the quota code and are already holding the mutex - */ - if (IS_NOQUOTA(inode)) { - inode_add_bytes(inode, number); - goto out; - } - - down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); - if (IS_NOQUOTA(inode)) { - inode_add_bytes(inode, number); - goto out_unlock; - } - - ret = __dquot_alloc_space(inode, number, warn, 0); - if (ret == NO_QUOTA) - goto out_unlock; + if (reserve) + goto out_flush_warn; /* Dirtify all the dquots - this can block when journalling */ for (cnt = 0; cnt < MAXQUOTAS; cnt++) if (inode->i_dquot[cnt]) mark_dquot_dirty(inode->i_dquot[cnt]); +out_flush_warn: + flush_warnings(inode->i_dquot, warntype); out_unlock: up_read(&sb_dqopt(inode->i_sb)->dqptr_sem); out: return ret; } + +int dquot_alloc_space(struct inode *inode, qsize_t number, int warn) +{ + return __dquot_alloc_space(inode, number, warn, 0); +} EXPORT_SYMBOL(dquot_alloc_space); int dquot_reserve_space(struct inode *inode, qsize_t number, int warn) { - int ret = QUOTA_OK; - - if (IS_NOQUOTA(inode)) - goto out; - - down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); - if (IS_NOQUOTA(inode)) - goto out_unlock; - - ret = __dquot_alloc_space(inode, number, warn, 1); -out_unlock: - up_read(&sb_dqopt(inode->i_sb)->dqptr_sem); -out: - return ret; + return __dquot_alloc_space(inode, number, warn, 1); } EXPORT_SYMBOL(dquot_reserve_space); @@ -1540,14 +1588,14 @@ int dquot_claim_space(struct inode *inode, qsize_t number) int ret = QUOTA_OK; if (IS_NOQUOTA(inode)) { - inode_add_bytes(inode, number); + inode_claim_rsv_space(inode, number); goto out; } down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); if (IS_NOQUOTA(inode)) { up_read(&sb_dqopt(inode->i_sb)->dqptr_sem); - inode_add_bytes(inode, number); + inode_claim_rsv_space(inode, number); goto out; } @@ -1559,7 +1607,7 @@ int dquot_claim_space(struct inode *inode, qsize_t number) number); } /* Update inode bytes */ - inode_add_bytes(inode, number); + inode_claim_rsv_space(inode, number); spin_unlock(&dq_data_lock); /* Dirtify all the dquots - this can block when journalling */ for (cnt = 0; cnt < MAXQUOTAS; cnt++) @@ -1572,38 +1620,9 @@ out: EXPORT_SYMBOL(dquot_claim_space); /* - * Release reserved quota space - */ -void dquot_release_reserved_space(struct inode *inode, qsize_t number) -{ - int cnt; - - if (IS_NOQUOTA(inode)) - goto out; - - down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); - if (IS_NOQUOTA(inode)) - goto out_unlock; - - spin_lock(&dq_data_lock); - /* Release reserved dquots */ - for (cnt = 0; cnt < MAXQUOTAS; cnt++) { - if (inode->i_dquot[cnt]) - dquot_free_reserved_space(inode->i_dquot[cnt], number); - } - spin_unlock(&dq_data_lock); - -out_unlock: - up_read(&sb_dqopt(inode->i_sb)->dqptr_sem); -out: - return; -} -EXPORT_SYMBOL(dquot_release_reserved_space); - -/* * This operation can block, but only after everything is updated */ -int dquot_free_space(struct inode *inode, qsize_t number) +int __dquot_free_space(struct inode *inode, qsize_t number, int reserve) { unsigned int cnt; char warntype[MAXQUOTAS]; @@ -1612,7 +1631,7 @@ int dquot_free_space(struct inode *inode, qsize_t number) * re-enter the quota code and are already holding the mutex */ if (IS_NOQUOTA(inode)) { out_sub: - inode_sub_bytes(inode, number); + inode_decr_space(inode, number, reserve); return QUOTA_OK; } @@ -1627,21 +1646,43 @@ out_sub: if (!inode->i_dquot[cnt]) continue; warntype[cnt] = info_bdq_free(inode->i_dquot[cnt], number); - dquot_decr_space(inode->i_dquot[cnt], number); + if (reserve) + dquot_free_reserved_space(inode->i_dquot[cnt], number); + else + dquot_decr_space(inode->i_dquot[cnt], number); } - inode_sub_bytes(inode, number); + inode_decr_space(inode, number, reserve); spin_unlock(&dq_data_lock); + + if (reserve) + goto out_unlock; /* Dirtify all the dquots - this can block when journalling */ for (cnt = 0; cnt < MAXQUOTAS; cnt++) if (inode->i_dquot[cnt]) mark_dquot_dirty(inode->i_dquot[cnt]); +out_unlock: flush_warnings(inode->i_dquot, warntype); up_read(&sb_dqopt(inode->i_sb)->dqptr_sem); return QUOTA_OK; } + +int dquot_free_space(struct inode *inode, qsize_t number) +{ + return __dquot_free_space(inode, number, 0); +} EXPORT_SYMBOL(dquot_free_space); /* + * Release reserved quota space + */ +void dquot_release_reserved_space(struct inode *inode, qsize_t number) +{ + __dquot_free_space(inode, number, 1); + +} +EXPORT_SYMBOL(dquot_release_reserved_space); + +/* * This operation can block, but only after everything is updated */ int dquot_free_inode(const struct inode *inode, qsize_t number) @@ -1679,19 +1720,6 @@ int dquot_free_inode(const struct inode *inode, qsize_t number) EXPORT_SYMBOL(dquot_free_inode); /* - * call back function, get reserved quota space from underlying fs - */ -qsize_t dquot_get_reserved_space(struct inode *inode) -{ - qsize_t reserved_space = 0; - - if (sb_any_quota_active(inode->i_sb) && - inode->i_sb->dq_op->get_reserved_space) - reserved_space = inode->i_sb->dq_op->get_reserved_space(inode); - return reserved_space; -} - -/* * Transfer the number of inode and blocks from one diskquota to an other. * * This operation can block, but only after everything is updated @@ -1734,7 +1762,7 @@ int dquot_transfer(struct inode *inode, struct iattr *iattr) } spin_lock(&dq_data_lock); cur_space = inode_get_bytes(inode); - rsv_space = dquot_get_reserved_space(inode); + rsv_space = inode_get_rsv_space(inode); space = cur_space + rsv_space; /* Build the transfer_from list and check the limits */ for (cnt = 0; cnt < MAXQUOTAS; cnt++) { diff --git a/fs/reiserfs/dir.c b/fs/reiserfs/dir.c index 6d2668fdc384..d42c30ceaee5 100644 --- a/fs/reiserfs/dir.c +++ b/fs/reiserfs/dir.c @@ -45,8 +45,6 @@ static inline bool is_privroot_deh(struct dentry *dir, struct reiserfs_de_head *deh) { struct dentry *privroot = REISERFS_SB(dir->d_sb)->priv_root; - if (reiserfs_expose_privroot(dir->d_sb)) - return 0; return (dir == dir->d_parent && privroot->d_inode && deh->deh_objectid == INODE_PKEY(privroot->d_inode)->k_objectid); } diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index a14d6cd9eeda..d240c15bf086 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c @@ -2531,6 +2531,12 @@ static int reiserfs_writepage(struct page *page, struct writeback_control *wbc) return reiserfs_write_full_page(page, wbc); } +static void reiserfs_truncate_failed_write(struct inode *inode) +{ + truncate_inode_pages(inode->i_mapping, inode->i_size); + reiserfs_truncate_file(inode, 0); +} + static int reiserfs_write_begin(struct file *file, struct address_space *mapping, loff_t pos, unsigned len, unsigned flags, @@ -2597,6 +2603,8 @@ static int reiserfs_write_begin(struct file *file, if (ret) { unlock_page(page); page_cache_release(page); + /* Truncate allocated blocks */ + reiserfs_truncate_failed_write(inode); } return ret; } @@ -2689,8 +2697,7 @@ static int reiserfs_write_end(struct file *file, struct address_space *mapping, ** transaction tracking stuff when the size changes. So, we have ** to do the i_size updates here. */ - pos += copied; - if (pos > inode->i_size) { + if (pos + copied > inode->i_size) { struct reiserfs_transaction_handle myth; reiserfs_write_lock(inode->i_sb); /* If the file have grown beyond the border where it @@ -2708,7 +2715,7 @@ static int reiserfs_write_end(struct file *file, struct address_space *mapping, goto journal_error; } reiserfs_update_inode_transaction(inode); - inode->i_size = pos; + inode->i_size = pos + copied; /* * this will just nest into our transaction. It's important * to use mark_inode_dirty so the inode gets pushed around on the @@ -2735,6 +2742,10 @@ static int reiserfs_write_end(struct file *file, struct address_space *mapping, out: unlock_page(page); page_cache_release(page); + + if (pos + len > inode->i_size) + reiserfs_truncate_failed_write(inode); + return ret == 0 ? copied : ret; journal_error: diff --git a/fs/reiserfs/xattr.c b/fs/reiserfs/xattr.c index 6925b835a43b..cc1caa26be52 100644 --- a/fs/reiserfs/xattr.c +++ b/fs/reiserfs/xattr.c @@ -536,7 +536,7 @@ reiserfs_xattr_set_handle(struct reiserfs_transaction_handle *th, if (!err && new_size < i_size_read(dentry->d_inode)) { struct iattr newattrs = { .ia_ctime = current_fs_time(inode->i_sb), - .ia_size = buffer_size, + .ia_size = new_size, .ia_valid = ATTR_SIZE | ATTR_CTIME, }; mutex_lock_nested(&dentry->d_inode->i_mutex, I_MUTEX_XATTR); @@ -952,21 +952,13 @@ int reiserfs_permission(struct inode *inode, int mask) return generic_permission(inode, mask, NULL); } -/* This will catch lookups from the fs root to .reiserfs_priv */ -static int -xattr_lookup_poison(struct dentry *dentry, struct qstr *q1, struct qstr *name) +static int xattr_hide_revalidate(struct dentry *dentry, struct nameidata *nd) { - struct dentry *priv_root = REISERFS_SB(dentry->d_sb)->priv_root; - if (container_of(q1, struct dentry, d_name) == priv_root) - return -ENOENT; - if (q1->len == name->len && - !memcmp(q1->name, name->name, name->len)) - return 0; - return 1; + return -EPERM; } static const struct dentry_operations xattr_lookup_poison_ops = { - .d_compare = xattr_lookup_poison, + .d_revalidate = xattr_hide_revalidate, }; int reiserfs_lookup_privroot(struct super_block *s) @@ -980,8 +972,7 @@ int reiserfs_lookup_privroot(struct super_block *s) strlen(PRIVROOT_NAME)); if (!IS_ERR(dentry)) { REISERFS_SB(s)->priv_root = dentry; - if (!reiserfs_expose_privroot(s)) - s->s_root->d_op = &xattr_lookup_poison_ops; + dentry->d_op = &xattr_lookup_poison_ops; if (dentry->d_inode) dentry->d_inode->i_flags |= S_PRIVATE; } else diff --git a/fs/stat.c b/fs/stat.c index 075694e31d8b..c4ecd52c5737 100644 --- a/fs/stat.c +++ b/fs/stat.c @@ -401,9 +401,9 @@ SYSCALL_DEFINE4(fstatat64, int, dfd, char __user *, filename, } #endif /* __ARCH_WANT_STAT64 */ -void inode_add_bytes(struct inode *inode, loff_t bytes) +/* Caller is here responsible for sufficient locking (ie. inode->i_lock) */ +void __inode_add_bytes(struct inode *inode, loff_t bytes) { - spin_lock(&inode->i_lock); inode->i_blocks += bytes >> 9; bytes &= 511; inode->i_bytes += bytes; @@ -411,6 +411,12 @@ void inode_add_bytes(struct inode *inode, loff_t bytes) inode->i_blocks++; inode->i_bytes -= 512; } +} + +void inode_add_bytes(struct inode *inode, loff_t bytes) +{ + spin_lock(&inode->i_lock); + __inode_add_bytes(inode, bytes); spin_unlock(&inode->i_lock); } diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c index 561a9c050cef..f5ea4680f15f 100644 --- a/fs/sysfs/file.c +++ b/fs/sysfs/file.c @@ -268,7 +268,7 @@ static int sysfs_get_open_dirent(struct sysfs_dirent *sd, struct sysfs_open_dirent *od, *new_od = NULL; retry: - spin_lock(&sysfs_open_dirent_lock); + spin_lock_irq(&sysfs_open_dirent_lock); if (!sd->s_attr.open && new_od) { sd->s_attr.open = new_od; @@ -281,7 +281,7 @@ static int sysfs_get_open_dirent(struct sysfs_dirent *sd, list_add_tail(&buffer->list, &od->buffers); } - spin_unlock(&sysfs_open_dirent_lock); + spin_unlock_irq(&sysfs_open_dirent_lock); if (od) { kfree(new_od); @@ -315,8 +315,9 @@ static void sysfs_put_open_dirent(struct sysfs_dirent *sd, struct sysfs_buffer *buffer) { struct sysfs_open_dirent *od = sd->s_attr.open; + unsigned long flags; - spin_lock(&sysfs_open_dirent_lock); + spin_lock_irqsave(&sysfs_open_dirent_lock, flags); list_del(&buffer->list); if (atomic_dec_and_test(&od->refcnt)) @@ -324,7 +325,7 @@ static void sysfs_put_open_dirent(struct sysfs_dirent *sd, else od = NULL; - spin_unlock(&sysfs_open_dirent_lock); + spin_unlock_irqrestore(&sysfs_open_dirent_lock, flags); kfree(od); } @@ -456,8 +457,9 @@ static unsigned int sysfs_poll(struct file *filp, poll_table *wait) void sysfs_notify_dirent(struct sysfs_dirent *sd) { struct sysfs_open_dirent *od; + unsigned long flags; - spin_lock(&sysfs_open_dirent_lock); + spin_lock_irqsave(&sysfs_open_dirent_lock, flags); od = sd->s_attr.open; if (od) { @@ -465,7 +467,7 @@ void sysfs_notify_dirent(struct sysfs_dirent *sd) wake_up_interruptible(&od->poll); } - spin_unlock(&sysfs_open_dirent_lock); + spin_unlock_irqrestore(&sysfs_open_dirent_lock, flags); } EXPORT_SYMBOL_GPL(sysfs_notify_dirent); diff --git a/fs/udf/super.c b/fs/udf/super.c index 9d1b8c2e6c45..1e4543cbcd27 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c @@ -1078,21 +1078,39 @@ static int udf_fill_partdesc_info(struct super_block *sb, return 0; } -static int udf_load_vat(struct super_block *sb, int p_index, int type1_index) +static void udf_find_vat_block(struct super_block *sb, int p_index, + int type1_index, sector_t start_block) { struct udf_sb_info *sbi = UDF_SB(sb); struct udf_part_map *map = &sbi->s_partmaps[p_index]; + sector_t vat_block; struct kernel_lb_addr ino; + + /* + * VAT file entry is in the last recorded block. Some broken disks have + * it a few blocks before so try a bit harder... + */ + ino.partitionReferenceNum = type1_index; + for (vat_block = start_block; + vat_block >= map->s_partition_root && + vat_block >= start_block - 3 && + !sbi->s_vat_inode; vat_block--) { + ino.logicalBlockNum = vat_block - map->s_partition_root; + sbi->s_vat_inode = udf_iget(sb, &ino); + } +} + +static int udf_load_vat(struct super_block *sb, int p_index, int type1_index) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + struct udf_part_map *map = &sbi->s_partmaps[p_index]; struct buffer_head *bh = NULL; struct udf_inode_info *vati; uint32_t pos; struct virtualAllocationTable20 *vat20; sector_t blocks = sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits; - /* VAT file entry is in the last recorded block */ - ino.partitionReferenceNum = type1_index; - ino.logicalBlockNum = sbi->s_last_block - map->s_partition_root; - sbi->s_vat_inode = udf_iget(sb, &ino); + udf_find_vat_block(sb, p_index, type1_index, sbi->s_last_block); if (!sbi->s_vat_inode && sbi->s_last_block != blocks - 1) { printk(KERN_NOTICE "UDF-fs: Failed to read VAT inode from the" @@ -1100,9 +1118,7 @@ static int udf_load_vat(struct super_block *sb, int p_index, int type1_index) "block of the device (%lu).\n", (unsigned long)sbi->s_last_block, (unsigned long)blocks - 1); - ino.partitionReferenceNum = type1_index; - ino.logicalBlockNum = blocks - 1 - map->s_partition_root; - sbi->s_vat_inode = udf_iget(sb, &ino); + udf_find_vat_block(sb, p_index, type1_index, blocks - 1); } if (!sbi->s_vat_inode) return 1; diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 47da2fb45377..83ebd523bf74 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1980,7 +1980,7 @@ xlog_recover_do_reg_buffer( "XFS: NULL dquot in %s.", __func__); goto next; } - if (item->ri_buf[i].i_len < sizeof(xfs_dqblk_t)) { + if (item->ri_buf[i].i_len < sizeof(xfs_disk_dquot_t)) { cmn_err(CE_ALERT, "XFS: dquot too small (%d) in %s.", item->ri_buf[i].i_len, __func__); @@ -2635,7 +2635,7 @@ xlog_recover_do_dquot_trans( "XFS: NULL dquot in %s.", __func__); return XFS_ERROR(EIO); } - if (item->ri_buf[1].i_len < sizeof(xfs_dqblk_t)) { + if (item->ri_buf[1].i_len < sizeof(xfs_disk_dquot_t)) { cmn_err(CE_ALERT, "XFS: dquot too small (%d) in %s.", item->ri_buf[1].i_len, __func__); diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 45b67d9c39c1..4637dce03fab 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -1268,6 +1268,7 @@ extern u32 drm_vblank_count(struct drm_device *dev, int crtc); extern void drm_handle_vblank(struct drm_device *dev, int crtc); extern int drm_vblank_get(struct drm_device *dev, int crtc); extern void drm_vblank_put(struct drm_device *dev, int crtc); +extern void drm_vblank_off(struct drm_device *dev, int crtc); extern void drm_vblank_cleanup(struct drm_device *dev); /* Modesetting support */ extern void drm_vblank_pre_modeset(struct drm_device *dev, int crtc); diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h index 853508499d20..3f6e545609be 100644 --- a/include/drm/drm_pciids.h +++ b/include/drm/drm_pciids.h @@ -552,6 +552,7 @@ {0x8086, 0x2e12, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ {0x8086, 0x2e22, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ {0x8086, 0x2e32, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ + {0x8086, 0x2e42, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ {0x8086, 0xa001, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ {0x8086, 0xa011, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ {0x8086, 0x35e8, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h index 2046b5b8af48..f1da7e4549a0 100644 --- a/include/linux/binfmts.h +++ b/include/linux/binfmts.h @@ -101,6 +101,7 @@ extern int prepare_binprm(struct linux_binprm *); extern int __must_check remove_arg_zero(struct linux_binprm *); extern int search_binary_handler(struct linux_binprm *,struct pt_regs *); extern int flush_old_exec(struct linux_binprm * bprm); +extern void setup_new_exec(struct linux_binprm * bprm); extern int suid_dumpable; #define SUID_DUMP_DISABLE 0 /* No setuid dumping */ diff --git a/include/linux/connector.h b/include/linux/connector.h index b68d27850d51..ecb61c40b344 100644 --- a/include/linux/connector.h +++ b/include/linux/connector.h @@ -24,9 +24,6 @@ #include <linux/types.h> -#define CN_IDX_CONNECTOR 0xffffffff -#define CN_VAL_CONNECTOR 0xffffffff - /* * Process Events connector unique ids -- used for message routing */ @@ -73,30 +70,6 @@ struct cn_msg { __u8 data[0]; }; -/* - * Notify structure - requests notification about - * registering/unregistering idx/val in range [first, first+range]. - */ -struct cn_notify_req { - __u32 first; - __u32 range; -}; - -/* - * Main notification control message - * *_notify_num - number of appropriate cn_notify_req structures after - * this struct. - * group - notification receiver's idx. - * len - total length of the attached data. - */ -struct cn_ctl_msg { - __u32 idx_notify_num; - __u32 val_notify_num; - __u32 group; - __u32 len; - __u8 data[0]; -}; - #ifdef __KERNEL__ #include <asm/atomic.h> @@ -132,11 +105,8 @@ struct cn_callback_id { }; struct cn_callback_data { - void (*destruct_data) (void *); - void *ddata; - - void *callback_priv; - void (*callback) (void *); + struct sk_buff *skb; + void (*callback) (struct cn_msg *, struct netlink_skb_parms *); void *free; }; @@ -152,11 +122,6 @@ struct cn_callback_entry { u32 seq, group; }; -struct cn_ctl_entry { - struct list_head notify_entry; - struct cn_ctl_msg *msg; -}; - struct cn_dev { struct cb_id id; @@ -167,11 +132,11 @@ struct cn_dev { struct cn_queue_dev *cbdev; }; -int cn_add_callback(struct cb_id *, char *, void (*callback) (void *)); +int cn_add_callback(struct cb_id *, char *, void (*callback) (struct cn_msg *, struct netlink_skb_parms *)); void cn_del_callback(struct cb_id *); int cn_netlink_send(struct cn_msg *, u32, gfp_t); -int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id, void (*callback)(void *)); +int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id, void (*callback)(struct cn_msg *, struct netlink_skb_parms *)); void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id); int queue_cn_work(struct cn_callback_entry *cbq, struct work_struct *work); diff --git a/include/linux/enclosure.h b/include/linux/enclosure.h index 4332442b1b57..cceb406d194c 100644 --- a/include/linux/enclosure.h +++ b/include/linux/enclosure.h @@ -42,6 +42,8 @@ enum enclosure_status { ENCLOSURE_STATUS_NOT_INSTALLED, ENCLOSURE_STATUS_UNKNOWN, ENCLOSURE_STATUS_UNAVAILABLE, + /* last element for counting purposes */ + ENCLOSURE_STATUS_MAX }; /* SFF-8485 activity light settings */ diff --git a/include/linux/fec.h b/include/linux/fec.h index 39ba482298e1..5ebd1f4742de 100644 --- a/include/linux/fec.h +++ b/include/linux/fec.h @@ -13,13 +13,10 @@ #ifndef __LINUX_FEC_H__ #define __LINUX_FEC_H__ -#include <linux/etherdevice.h> #include <linux/phy.h> struct fec_platform_data { phy_interface_t phy; - unsigned int phy_mask; - unsigned char mac[ETH_ALEN]; int (*init)(void); int (*uninit)(void); struct regulator *vddio_reg; diff --git a/include/linux/fs.h b/include/linux/fs.h index 73e9b643e455..e2eeaa5cfe94 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2296,6 +2296,7 @@ extern const struct inode_operations page_symlink_inode_operations; extern int generic_readlink(struct dentry *, char __user *, int); extern void generic_fillattr(struct inode *, struct kstat *); extern int vfs_getattr(struct vfsmount *, struct dentry *, struct kstat *); +void __inode_add_bytes(struct inode *inode, loff_t bytes); void inode_add_bytes(struct inode *inode, loff_t bytes); void inode_sub_bytes(struct inode *inode, loff_t bytes); loff_t inode_get_bytes(struct inode *inode); diff --git a/include/linux/fsl_devices.h b/include/linux/fsl_devices.h index 8ee3006f4678..e018b0d0dfc6 100644 --- a/include/linux/fsl_devices.h +++ b/include/linux/fsl_devices.h @@ -93,7 +93,6 @@ struct fsl_usb2_platform_data { void (*platform_suspend)(struct fsl_usb2_platform_data *); void (*platform_resume)(struct fsl_usb2_platform_data *); void (*wake_up_enable)(struct fsl_usb2_platform_data *pdata, bool on); - void (*phy_lowpower_suspend)(bool); void (*platform_driver_vbus)(bool on); /* platform special function for vbus shutdown/open */ unsigned big_endian_mmio : 1; unsigned big_endian_desc : 1; diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index dc3b1328aaeb..708085aeb692 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h @@ -241,7 +241,7 @@ extern void ftrace_enable_daemon(void); # define ftrace_set_filter(buf, len, reset) do { } while (0) # define ftrace_disable_daemon() do { } while (0) # define ftrace_enable_daemon() do { } while (0) -static inline void ftrace_release(void *start, unsigned long size) { } +static inline void ftrace_release_mod(struct module *mod) {} static inline int register_ftrace_command(struct ftrace_func_command *cmd) { return -EINVAL; diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h index 4759917adc71..5c66f2e64088 100644 --- a/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h @@ -448,7 +448,7 @@ extern void timer_stats_update_stats(void *timer, pid_t pid, void *startf, static inline void timer_stats_account_hrtimer(struct hrtimer *timer) { - if (likely(!timer->start_site)) + if (likely(!timer_stats_active)) return; timer_stats_update_stats(timer, timer->start_pid, timer->start_site, timer->function, timer->start_comm, 0); @@ -459,8 +459,6 @@ extern void __timer_stats_hrtimer_set_start_info(struct hrtimer *timer, static inline void timer_stats_hrtimer_set_start_info(struct hrtimer *timer) { - if (likely(!timer_stats_active)) - return; __timer_stats_hrtimer_set_start_info(timer, __builtin_return_address(0)); } diff --git a/include/linux/ipu.h b/include/linux/ipu.h index 54a889b57f73..424f0212c69e 100644 --- a/include/linux/ipu.h +++ b/include/linux/ipu.h @@ -956,8 +956,6 @@ int32_t ipu_init_sync_panel(int disp, int32_t ipu_disp_set_window_pos(ipu_channel_t channel, int16_t x_pos, int16_t y_pos); -int32_t ipu_disp_get_window_pos(ipu_channel_t channel, int16_t *x_pos, - int16_t *y_pos); int32_t ipu_disp_set_global_alpha(ipu_channel_t channel, bool enable, uint8_t alpha); int32_t ipu_disp_set_color_key(ipu_channel_t channel, bool enable, diff --git a/include/linux/isdn_ppp.h b/include/linux/isdn_ppp.h index 4c218ee7587a..8687a7dc0632 100644 --- a/include/linux/isdn_ppp.h +++ b/include/linux/isdn_ppp.h @@ -157,7 +157,7 @@ typedef struct { typedef struct { int mp_mrru; /* unused */ - struct sk_buff_head frags; /* fragments sl list */ + struct sk_buff * frags; /* fragments sl list -- use skb->next */ long frames; /* number of frames in the frame list */ unsigned int seq; /* last processed packet seq #: any packets * with smaller seq # will be dropped diff --git a/include/linux/kvm.h b/include/linux/kvm.h index 3db5d8d37485..bd3dc67c589f 100644 --- a/include/linux/kvm.h +++ b/include/linux/kvm.h @@ -104,6 +104,11 @@ struct kvm_run { __u64 cr8; __u64 apic_base; +#ifdef __KVM_S390 + /* the processor status word for s390 */ + __u64 psw_mask; /* psw upper half */ + __u64 psw_addr; /* psw lower half */ +#endif union { /* KVM_EXIT_UNKNOWN */ struct { @@ -155,8 +160,6 @@ struct kvm_run { /* KVM_EXIT_S390_SIEIC */ struct { __u8 icptcode; - __u64 mask; /* psw upper half */ - __u64 addr; /* psw lower half */ __u16 ipa; __u32 ipb; } s390_sieic; @@ -453,6 +456,7 @@ struct kvm_irq_routing { }; #endif +#define KVM_CAP_S390_PSW 42 /* * ioctls for VM fds diff --git a/include/linux/kvm_para.h b/include/linux/kvm_para.h index 3ddce03766ca..d73109243fda 100644 --- a/include/linux/kvm_para.h +++ b/include/linux/kvm_para.h @@ -13,6 +13,7 @@ #define KVM_ENOSYS 1000 #define KVM_EFAULT EFAULT #define KVM_E2BIG E2BIG +#define KVM_EPERM EPERM #define KVM_HC_VAPIC_POLL_IRQ 1 #define KVM_HC_MMU_OP 2 diff --git a/include/linux/mm.h b/include/linux/mm.h index 291bc1c9d0ed..ef3603991d6f 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -25,6 +25,7 @@ extern unsigned long max_mapnr; #endif extern unsigned long num_physpages; +extern unsigned long totalram_pages; extern void * high_memory; extern int page_cluster; @@ -710,7 +711,6 @@ static inline int shmem_lock(struct file *file, int lock, } #endif struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags); -void shmem_set_file(struct vm_area_struct *vma, struct file *file); int shmem_zero_setup(struct vm_area_struct *); diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 9167c389779e..9d6c28cee241 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -46,10 +46,6 @@ struct mmc_ext_csd { unsigned int sectors; unsigned int card_type; #define MMC_DDR_MODE_MASK (0x3<<2) - unsigned char boot_info; - unsigned char boot_size_mult; - unsigned char boot_config; - unsigned char boot_bus_width; }; struct sd_scr { diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index 37a51b3122df..cf97645775a0 100644 --- a/include/linux/mmc/mmc.h +++ b/include/linux/mmc/mmc.h @@ -250,16 +250,12 @@ struct _mmc_csd { * EXT_CSD fields */ -#define EXT_CSD_BOOT_BUS_WIDTH 177 /* R/W */ -#define EXT_CSD_BOOT_CONFIG 179 /* R/W */ #define EXT_CSD_BUS_WIDTH 183 /* R/W */ #define EXT_CSD_HS_TIMING 185 /* R/W */ #define EXT_CSD_CARD_TYPE 196 /* RO */ #define EXT_CSD_REV 192 /* RO */ #define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */ #define EXT_CSD_S_A_TIMEOUT 217 -#define EXT_CSD_BOOT_SIZE_MULT 226 /* RO, 1 bytes */ -#define EXT_CSD_BOOT_INFO 228 /* RO, 1 bytes */ /* * EXT_CSD field definitions @@ -279,29 +275,6 @@ struct _mmc_csd { #define EXT_CSD_BUS_WIDTH_4_DDR 5 /* Card is in 4 bit ddr mode */ #define EXT_CSD_BUS_WIDTH_8_DDR 6 /* Card is in 8 bit ddr mode */ -#define EXT_CSD_BOOT_BUS_WIDTH_MASK (0x1F) -#define EXT_CSD_BOOT_BUS_WIDTH_MODE_MASK (0x3 << 3) -#define EXT_CSD_BOOT_BUS_WIDTH_MODE_SDR_NORMAL (0x0) -#define EXT_CSD_BOOT_BUS_WIDTH_MODE_SDR_HIGH (0x1) -#define EXT_CSD_BOOT_BUS_WIDTH_MODE_DDR (0x2) -#define EXT_CSD_BOOT_BUS_WIDTH_RST_WIDTH (1 << 2) -#define EXT_CSD_BOOT_BUS_WIDTH_WIDTH_MASK (0x3) -#define EXT_CSD_BOOT_BUS_WIDTH_1_SDR_4_DDR (0x0) -#define EXT_CSD_BOOT_BUS_WIDTH_4_SDR_4_DDR (0x1) -#define EXT_CSD_BOOT_BUS_WIDTH_8_SDR_8_DDR (0x2) - -#define EXT_CSD_BOOT_ACK_ENABLE (0x1 << 6) -#define EXT_CSD_BOOT_PARTITION_ENABLE_MASK (0x7 << 3) -#define EXT_CSD_BOOT_PARTITION_DISABLE (0x0) -#define EXT_CSD_BOOT_PARTITION_PART1 (0x1 << 3) -#define EXT_CSD_BOOT_PARTITION_PART2 (0x2 << 3) -#define EXT_CSD_BOOT_PARTITION_USER (0x7 << 3) - -#define EXT_CSD_BOOT_PARTITION_ACCESS_MASK (0x7) -#define EXT_CSD_BOOT_PARTITION_ACCESS_DISABLE (0x0) -#define EXT_CSD_BOOT_PARTITION_ACCESS_PART1 (0x1) -#define EXT_CSD_BOOT_PARTITION_ACCESS_PART2 (0x2) - /* * MMC_SWITCH access modes */ diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h index 6547c3cdbc4c..82a9124f7d75 100644 --- a/include/linux/moduleparam.h +++ b/include/linux/moduleparam.h @@ -37,7 +37,6 @@ typedef int (*param_set_fn)(const char *val, struct kernel_param *kp); typedef int (*param_get_fn)(char *buffer, struct kernel_param *kp); /* Flag bits for kernel_param.flags */ -#define KPARAM_KMALLOCED 1 #define KPARAM_ISBOOL 2 struct kernel_param { diff --git a/include/linux/msdos_fs.h b/include/linux/msdos_fs.h index 844d77ddfb34..ce38f1caa5e1 100644 --- a/include/linux/msdos_fs.h +++ b/include/linux/msdos_fs.h @@ -100,7 +100,6 @@ struct __fat_dirent { /* <linux/videotext.h> has used 0x72 ('r') in collision, so skip a few */ #define FAT_IOCTL_GET_ATTRIBUTES _IOR('r', 0x10, __u32) #define FAT_IOCTL_SET_ATTRIBUTES _IOW('r', 0x11, __u32) -#define VFAT_IOCTL_GET_VOLUME_ID _IOR('r', 0x12, __u32) struct fat_boot_sector { __u8 ignored[3]; /* Boot strap short or near jump */ @@ -138,17 +137,6 @@ struct fat_boot_fsinfo { __le32 reserved2[4]; }; -struct fat_boot_bsx { - __u8 drive; /* drive number */ - __u8 reserved1; - __u8 signature; /* extended boot signature */ - __u8 vol_id[4]; /* volume ID */ - __u8 vol_label[11]; /* volume label */ - __u8 type[8]; /* file system type */ -}; -#define FAT16_BSX_OFFSET 36 /* offset of fat_boot_bsx in FAT12 and FAT16 */ -#define FAT32_BSX_OFFSET 64 /* offset of fat_boot_bsx in FAT32 */ - struct msdos_dir_entry { __u8 name[MSDOS_NAME];/* name and extension */ __u8 attr; /* attribute bits */ diff --git a/include/linux/mxcfb.h b/include/linux/mxcfb.h index 0f92ad04942c..27f786e5f018 100644 --- a/include/linux/mxcfb.h +++ b/include/linux/mxcfb.h @@ -78,8 +78,6 @@ struct mxcfb_rect { #define TEMP_USE_AMBIENT 0x1000 -#define FB_POWERDOWN_DISABLE -1 - struct mxcfb_alt_buffer_data { __u32 phys_addr; __u32 width; /* width of entire buffer */ @@ -120,7 +118,6 @@ struct mxcfb_waveform_modes { #define MXCFB_SET_GAMMA _IOW('F', 0x28, struct mxcfb_gamma) #define MXCFB_GET_FB_IPU_DI _IOR('F', 0x29, u_int32_t) #define MXCFB_GET_DIFMT _IOR('F', 0x2A, u_int32_t) -#define MXCFB_GET_FB_BLANK _IOR('F', 0x2B, u_int32_t) /* IOCTLs for E-ink panel updates */ #define MXCFB_SET_WAVEFORM_MODES _IOW('F', 0x2B, struct mxcfb_waveform_modes) @@ -128,8 +125,6 @@ struct mxcfb_waveform_modes { #define MXCFB_SET_AUTO_UPDATE_MODE _IOW('F', 0x2D, __u32) #define MXCFB_SEND_UPDATE _IOW('F', 0x2E, struct mxcfb_update_data) #define MXCFB_WAIT_FOR_UPDATE_COMPLETE _IOW('F', 0x2F, __u32) -#define MXCFB_SET_PWRDOWN_DELAY _IOW('F', 0x30, int32_t) -#define MXCFB_GET_PWRDOWN_DELAY _IOR('F', 0x31, int32_t) #ifdef __KERNEL__ @@ -145,6 +140,5 @@ enum { int mxcfb_set_refresh_mode(struct fb_info *fbi, int mode, struct mxcfb_rect *update_region); -int mxc_elcdif_frame_addr_setup(dma_addr_t phys); #endif /* __KERNEL__ */ #endif diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 73b46b6b904f..dc4cc294b256 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h @@ -479,6 +479,9 @@ #define PCI_DEVICE_ID_IBM_ICOM_V2_ONE_PORT_RVX_ONE_PORT_MDM_PCIE 0x0361 #define PCI_DEVICE_ID_IBM_ICOM_FOUR_PORT_MODEL 0x252 +#define PCI_SUBVENDOR_ID_IBM 0x1014 +#define PCI_SUBDEVICE_ID_IBM_SATURN_SERIAL_ONE_PORT 0x03d4 + #define PCI_VENDOR_ID_UNISYS 0x1018 #define PCI_DEVICE_ID_UNISYS_DMA_DIRECTOR 0x001C @@ -877,6 +880,7 @@ #define PCI_DEVICE_ID_APPLE_SH_SUNGEM 0x0051 #define PCI_DEVICE_ID_APPLE_U3L_AGP 0x0058 #define PCI_DEVICE_ID_APPLE_U3H_AGP 0x0059 +#define PCI_DEVICE_ID_APPLE_U4_PCIE 0x005b #define PCI_DEVICE_ID_APPLE_IPID2_AGP 0x0066 #define PCI_DEVICE_ID_APPLE_IPID2_ATA 0x0069 #define PCI_DEVICE_ID_APPLE_IPID2_FW 0x006a diff --git a/include/linux/quota.h b/include/linux/quota.h index 78c48895b12a..8fd8efcb6f2e 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -313,8 +313,9 @@ struct dquot_operations { int (*claim_space) (struct inode *, qsize_t); /* release rsved quota for delayed alloc */ void (*release_rsv) (struct inode *, qsize_t); - /* get reserved quota for delayed alloc */ - qsize_t (*get_reserved_space) (struct inode *); + /* get reserved quota for delayed alloc, value returned is managed by + * quota code only */ + qsize_t *(*get_reserved_space) (struct inode *); }; /* Operations handling requests from userspace */ diff --git a/include/linux/regulator/max17135.h b/include/linux/regulator/max17135.h index 348b82b62b9f..06eaf88d2536 100644 --- a/include/linux/regulator/max17135.h +++ b/include/linux/regulator/max17135.h @@ -50,8 +50,6 @@ struct max17135_platform_data { int gpio_pmic_vcom_ctrl; int gpio_pmic_wakeup; int gpio_pmic_intr; - int pass_num; - int vcom_uV; struct regulator_init_data *regulator_init; }; diff --git a/include/linux/sched.h b/include/linux/sched.h index 5c6993ea13c5..1e174cacf3e5 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1296,7 +1296,7 @@ struct task_struct { char comm[TASK_COMM_LEN]; /* executable name excluding path - access with [gs]et_task_comm (which lock it with task_lock()) - - initialized normally by flush_old_exec */ + - initialized normally by setup_new_exec */ /* file system info */ int link_count, total_link_count; #ifdef CONFIG_SYSVIPC @@ -1665,9 +1665,6 @@ extern cputime_t task_utime(struct task_struct *p); extern cputime_t task_stime(struct task_struct *p); extern cputime_t task_gtime(struct task_struct *p); -extern int task_free_register(struct notifier_block *n); -extern int task_free_unregister(struct notifier_block *n); - /* * Per process flags */ @@ -2002,11 +1999,18 @@ static inline int is_si_special(const struct siginfo *info) return info <= SEND_SIG_FORCED; } -/* True if we are on the alternate signal stack. */ - +/* + * True if we are on the alternate signal stack. + */ static inline int on_sig_stack(unsigned long sp) { - return (sp - current->sas_ss_sp < current->sas_ss_size); +#ifdef CONFIG_STACK_GROWSUP + return sp >= current->sas_ss_sp && + sp - current->sas_ss_sp < current->sas_ss_size; +#else + return sp > current->sas_ss_sp && + sp - current->sas_ss_sp <= current->sas_ss_size; +#endif } static inline int sas_ss_flags(unsigned long sp) @@ -2481,6 +2485,28 @@ static inline void mm_init_owner(struct mm_struct *mm, struct task_struct *p) #define TASK_STATE_TO_CHAR_STR "RSDTtZX" +static inline unsigned long task_rlimit(const struct task_struct *tsk, + unsigned int limit) +{ + return ACCESS_ONCE(tsk->signal->rlim[limit].rlim_cur); +} + +static inline unsigned long task_rlimit_max(const struct task_struct *tsk, + unsigned int limit) +{ + return ACCESS_ONCE(tsk->signal->rlim[limit].rlim_max); +} + +static inline unsigned long rlimit(unsigned int limit) +{ + return task_rlimit(current, limit); +} + +static inline unsigned long rlimit_max(unsigned int limit) +{ + return task_rlimit_max(current, limit); +} + #endif /* __KERNEL__ */ #endif diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index f2c69a2cca17..ff06fb2b159f 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -1761,6 +1761,8 @@ extern int skb_copy_datagram_const_iovec(const struct sk_buff *from, int to_offset, int size); extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb); +extern void skb_free_datagram_locked(struct sock *sk, + struct sk_buff *skb); extern int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, unsigned int flags); extern __wsum skb_checksum(const struct sk_buff *skb, int offset, diff --git a/include/linux/sockios.h b/include/linux/sockios.h index f4fa1a164c74..241f179347d9 100644 --- a/include/linux/sockios.h +++ b/include/linux/sockios.h @@ -65,7 +65,6 @@ #define SIOCDIFADDR 0x8936 /* delete PA address */ #define SIOCSIFHWBROADCAST 0x8937 /* set hardware broadcast addr */ #define SIOCGIFCOUNT 0x8938 /* get number of devices */ -#define SIOCKILLADDR 0x8939 /* kill sockets with this local addr */ #define SIOCGIFBR 0x8940 /* Bridging support */ #define SIOCSIFBR 0x8941 /* Set bridging options */ diff --git a/include/linux/tty.h b/include/linux/tty.h index e8c6c9136c97..b982a1771141 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h @@ -185,7 +185,12 @@ struct tty_port; struct tty_port_operations { /* Return 1 if the carrier is raised */ int (*carrier_raised)(struct tty_port *port); + /* Control the DTR line */ void (*dtr_rts)(struct tty_port *port, int raise); + /* Called when the last close completes or a hangup finishes + IFF the port was initialized. Do not use to free resources */ + void (*shutdown)(struct tty_port *port); + void (*drop)(struct tty_port *port); }; struct tty_port { @@ -457,7 +462,8 @@ extern int tty_port_block_til_ready(struct tty_port *port, extern int tty_port_close_start(struct tty_port *port, struct tty_struct *tty, struct file *filp); extern void tty_port_close_end(struct tty_port *port, struct tty_struct *tty); - +extern void tty_port_close(struct tty_port *port, + struct tty_struct *tty, struct file *filp); extern int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc); extern int tty_unregister_ldisc(int disc); extern int tty_set_ldisc(struct tty_struct *tty, int ldisc); diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h index 8f33ae3e00f3..4f6bb3d2160e 100644 --- a/include/linux/usb/composite.h +++ b/include/linux/usb/composite.h @@ -100,7 +100,6 @@ struct usb_function { struct usb_descriptor_header **hs_descriptors; struct usb_configuration *config; - int hidden; /* REVISIT: bind() functions can be marked __init, which * makes trouble for section mismatch analysis. See if diff --git a/include/linux/usb/serial.h b/include/linux/usb/serial.h index 0ec50ba62139..20b12f3207ae 100644 --- a/include/linux/usb/serial.h +++ b/include/linux/usb/serial.h @@ -148,6 +148,7 @@ struct usb_serial { struct usb_interface *interface; unsigned char disconnected:1; unsigned char suspending:1; + unsigned char attached:1; unsigned char minor; unsigned char num_ports; unsigned char num_port_pointers; @@ -261,6 +262,9 @@ struct usb_serial_driver { be an attached tty at this point */ void (*dtr_rts)(struct usb_serial_port *port, int on); int (*carrier_raised)(struct usb_serial_port *port); + /* Called by the usb serial hooks to allow the user to rework the + termios state */ + void (*init_termios)(struct tty_struct *tty); /* USB events */ void (*read_int_callback)(struct urb *urb); void (*write_int_callback)(struct urb *urb); diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h index 310e18a880ff..c42eeb32058a 100644 --- a/include/linux/usb/usbnet.h +++ b/include/linux/usb/usbnet.h @@ -86,6 +86,7 @@ struct driver_info { #define FLAG_FRAMING_AX 0x0040 /* AX88772/178 packets */ #define FLAG_WLAN 0x0080 /* use "wlan%d" names */ +#define FLAG_SEND_ZLP 0x0200 /* hw requires ZLPs are sent */ /* init device ... can sleep, or cause probe() failure */ diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h index 3d15fb9bc116..a4b947e470a5 100644 --- a/include/linux/usb_usual.h +++ b/include/linux/usb_usual.h @@ -56,7 +56,9 @@ US_FLAG(SANE_SENSE, 0x00008000) \ /* Sane Sense (> 18 bytes) */ \ US_FLAG(CAPACITY_OK, 0x00010000) \ - /* READ CAPACITY response is correct */ + /* READ CAPACITY response is correct */ \ + US_FLAG(BAD_SENSE, 0x00020000) \ + /* Bad Sense (never more than 18 bytes) */ #define US_FLAG(name, value) US_FL_##name = value , enum { US_DO_ALL_FLAGS }; diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 59cdece3a1a4..ed3aea1605e8 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h @@ -139,10 +139,8 @@ enum { #define ESCO_2EV5 0x0100 #define ESCO_3EV5 0x0200 -#define SCO_ESCO_MASK (ESCO_HV1 | ESCO_HV2 | ESCO_HV3) -#define EDR_ESCO_MASK (ESCO_2EV3 | ESCO_3EV3 | ESCO_2EV5 | ESCO_3EV5) -#define ALL_ESCO_MASK (SCO_ESCO_MASK | ESCO_EV3 | ESCO_EV4 | ESCO_EV5 | \ - EDR_ESCO_MASK) +#define SCO_ESCO_MASK (ESCO_HV1 | ESCO_HV2 | ESCO_HV3) +#define EDR_ESCO_MASK (ESCO_2EV3 | ESCO_3EV3 | ESCO_2EV5 | ESCO_3EV5) /* ACL flags */ #define ACL_CONT 0x01 diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 2b8fc2c58b14..25b8a0345a6a 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -187,6 +187,7 @@ struct hci_conn { struct work_struct work_del; struct device dev; + atomic_t devref; struct hci_dev *hdev; void *l2cap_data; @@ -325,15 +326,12 @@ void hci_acl_disconn(struct hci_conn *conn, __u8 reason); void hci_add_sco(struct hci_conn *conn, __u16 handle); void hci_setup_sync(struct hci_conn *conn, __u16 handle); -struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, - __u16 pkt_type, bdaddr_t *dst); +struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst); int hci_conn_del(struct hci_conn *conn); void hci_conn_hash_flush(struct hci_dev *hdev); void hci_conn_check_pending(struct hci_dev *hdev); -struct hci_conn *hci_connect(struct hci_dev *hdev, int type, - __u16 pkt_type, bdaddr_t *dst, - __u8 sec_level, __u8 auth_type); +struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8 sec_level, __u8 auth_type); int hci_conn_check_link_mode(struct hci_conn *conn); int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type); int hci_conn_change_link_key(struct hci_conn *conn); @@ -342,6 +340,9 @@ int hci_conn_switch_role(struct hci_conn *conn, __u8 role); void hci_conn_enter_active_mode(struct hci_conn *conn); void hci_conn_enter_sniff_mode(struct hci_conn *conn); +void hci_conn_hold_device(struct hci_conn *conn); +void hci_conn_put_device(struct hci_conn *conn); + static inline void hci_conn_hold(struct hci_conn *conn) { atomic_inc(&conn->refcnt); diff --git a/include/net/bluetooth/sco.h b/include/net/bluetooth/sco.h index 924338ac3223..e28a2a771471 100644 --- a/include/net/bluetooth/sco.h +++ b/include/net/bluetooth/sco.h @@ -37,7 +37,6 @@ struct sockaddr_sco { sa_family_t sco_family; bdaddr_t sco_bdaddr; - __u16 sco_pkt_type; }; /* SCO socket options */ @@ -73,8 +72,7 @@ struct sco_conn { struct sco_pinfo { struct bt_sock bt; - __u16 pkt_type; - + __u32 flags; struct sco_conn *conn; }; diff --git a/include/net/ipv6.h b/include/net/ipv6.h index f27fd83d67d8..2c161892520a 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h @@ -354,8 +354,15 @@ static inline int ipv6_prefix_equal(const struct in6_addr *a1, struct inet_frag_queue; +enum ip6_defrag_users { + IP6_DEFRAG_LOCAL_DELIVER, + IP6_DEFRAG_CONNTRACK_IN, + IP6_DEFRAG_CONNTRACK_OUT, +}; + struct ip6_create_arg { __be32 id; + u32 user; struct in6_addr *src; struct in6_addr *dst; }; diff --git a/include/net/mac80211.h b/include/net/mac80211.h index c06104476973..5edf79254065 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -1244,6 +1244,12 @@ enum ieee80211_filter_flags { * * These flags are used with the ampdu_action() callback in * &struct ieee80211_ops to indicate which action is needed. + * + * Note that drivers MUST be able to deal with a TX aggregation + * session being stopped even before they OK'ed starting it by + * calling ieee80211_start_tx_ba_cb(_irqsafe), because the peer + * might receive the addBA frame and send a delBA right away! + * * @IEEE80211_AMPDU_RX_START: start Rx aggregation * @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation * @IEEE80211_AMPDU_TX_START: start Tx aggregation diff --git a/include/net/netfilter/ipv6/nf_conntrack_ipv6.h b/include/net/netfilter/ipv6/nf_conntrack_ipv6.h index abc55ad75c2b..1ee717eb5b09 100644 --- a/include/net/netfilter/ipv6/nf_conntrack_ipv6.h +++ b/include/net/netfilter/ipv6/nf_conntrack_ipv6.h @@ -9,7 +9,7 @@ extern struct nf_conntrack_l4proto nf_conntrack_l4proto_icmpv6; extern int nf_ct_frag6_init(void); extern void nf_ct_frag6_cleanup(void); -extern struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb); +extern struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb, u32 user); extern void nf_ct_frag6_output(unsigned int hooknum, struct sk_buff *skb, struct net_device *in, struct net_device *out, diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h index cbdd6284996d..5cf7270e3ffc 100644 --- a/include/net/netfilter/nf_conntrack.h +++ b/include/net/netfilter/nf_conntrack.h @@ -255,11 +255,9 @@ static inline bool nf_ct_kill(struct nf_conn *ct) } /* These are for NAT. Icky. */ -/* Update TCP window tracking data when NAT mangles the packet */ -extern void nf_conntrack_tcp_update(const struct sk_buff *skb, - unsigned int dataoff, - struct nf_conn *ct, int dir, - s16 offset); +extern s16 (*nf_ct_nat_offset)(const struct nf_conn *ct, + enum ip_conntrack_dir dir, + u32 seq); /* Fake conntrack entry for untracked connections */ extern struct nf_conn nf_conntrack_untracked; diff --git a/include/net/netfilter/nf_nat_helper.h b/include/net/netfilter/nf_nat_helper.h index 237a961f40e1..4222220920a5 100644 --- a/include/net/netfilter/nf_nat_helper.h +++ b/include/net/netfilter/nf_nat_helper.h @@ -32,4 +32,8 @@ extern int (*nf_nat_seq_adjust_hook)(struct sk_buff *skb, * to port ct->master->saved_proto. */ extern void nf_nat_follow_master(struct nf_conn *ct, struct nf_conntrack_expect *this); + +extern s16 nf_nat_get_offset(const struct nf_conn *ct, + enum ip_conntrack_dir dir, + u32 seq); #endif diff --git a/include/net/tcp.h b/include/net/tcp.h index eb2ed40659c6..88af84306471 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -1396,8 +1396,6 @@ extern struct sk_buff **tcp4_gro_receive(struct sk_buff **head, extern int tcp_gro_complete(struct sk_buff *skb); extern int tcp4_gro_complete(struct sk_buff *skb); -extern void tcp_v4_nuke_addr(__u32 saddr); - #ifdef CONFIG_PROC_FS extern int tcp4_proc_init(void); extern void tcp4_proc_exit(void); diff --git a/include/pcmcia/ss.h b/include/pcmcia/ss.h index 9b4ac9385f5d..fbc0146a7cf0 100644 --- a/include/pcmcia/ss.h +++ b/include/pcmcia/ss.h @@ -262,6 +262,8 @@ struct pcmcia_socket { struct device dev; /* data internal to the socket driver */ void *driver_data; + /* status of the card during resume from a system sleep state */ + int resume_status; }; @@ -279,7 +281,9 @@ extern struct pccard_resource_ops pccard_iodyn_ops; extern struct pccard_resource_ops pccard_nonstatic_ops; /* socket drivers are expected to use these callbacks in their .drv struct */ -extern int pcmcia_socket_dev_suspend(struct device *dev, pm_message_t state); +extern int pcmcia_socket_dev_suspend(struct device *dev); +extern void pcmcia_socket_dev_early_resume(struct device *dev); +extern void pcmcia_socket_dev_late_resume(struct device *dev); extern int pcmcia_socket_dev_resume(struct device *dev); /* socket drivers use this callback in their IRQ handler */ diff --git a/include/scsi/osd_protocol.h b/include/scsi/osd_protocol.h index 2cc8e8b1cc19..685661283540 100644 --- a/include/scsi/osd_protocol.h +++ b/include/scsi/osd_protocol.h @@ -17,6 +17,7 @@ #define __OSD_PROTOCOL_H__ #include <linux/types.h> +#include <linux/kernel.h> #include <asm/unaligned.h> #include <scsi/scsi.h> diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index b62a097b3ecb..6cc72e2fea88 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h @@ -677,6 +677,12 @@ struct Scsi_Host { void *shost_data; /* + * Points to the physical bus device we'd use to do DMA + * Needed just in case we have virtual hosts. + */ + struct device *dma_dev; + + /* * We should ensure that this is aligned, both for better performance * and also because some compilers (m68k) don't automatically force * alignment to a long boundary. @@ -720,7 +726,9 @@ extern int scsi_queue_work(struct Scsi_Host *, struct work_struct *); extern void scsi_flush_work(struct Scsi_Host *); extern struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *, int); -extern int __must_check scsi_add_host(struct Scsi_Host *, struct device *); +extern int __must_check scsi_add_host_with_dma(struct Scsi_Host *, + struct device *, + struct device *); extern void scsi_scan_host(struct Scsi_Host *); extern void scsi_rescan_device(struct device *); extern void scsi_remove_host(struct Scsi_Host *); @@ -731,6 +739,12 @@ extern const char *scsi_host_state_name(enum scsi_host_state); extern u64 scsi_calculate_bounce_limit(struct Scsi_Host *); +static inline int __must_check scsi_add_host(struct Scsi_Host *host, + struct device *dev) +{ + return scsi_add_host_with_dma(host, dev, dev); +} + static inline struct device *scsi_get_device(struct Scsi_Host *shost) { return shost->shost_gendev.parent; diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 7d8b5bc74185..824979e60677 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -5,10 +5,12 @@ #define _TRACE_EXT4_H #include <linux/writeback.h> -#include "../../../fs/ext4/ext4.h" -#include "../../../fs/ext4/mballoc.h" #include <linux/tracepoint.h> +struct ext4_allocation_context; +struct ext4_allocation_request; +struct ext4_prealloc_space; + TRACE_EVENT(ext4_free_inode, TP_PROTO(struct inode *inode), @@ -229,6 +231,7 @@ TRACE_EVENT(ext4_da_writepages, __field( char, for_reclaim ) __field( char, for_writepages ) __field( char, range_cyclic ) + __field( pgoff_t, writeback_index ) ), TP_fast_assign( @@ -243,14 +246,51 @@ TRACE_EVENT(ext4_da_writepages, __entry->for_reclaim = wbc->for_reclaim; __entry->for_writepages = wbc->for_writepages; __entry->range_cyclic = wbc->range_cyclic; + __entry->writeback_index = inode->i_mapping->writeback_index; ), - TP_printk("dev %s ino %lu nr_t_write %ld pages_skipped %ld range_start %llu range_end %llu nonblocking %d for_kupdate %d for_reclaim %d for_writepages %d range_cyclic %d", - jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->nr_to_write, + TP_printk("dev %s ino %lu nr_to_write %ld pages_skipped %ld range_start %llu range_end %llu nonblocking %d for_kupdate %d for_reclaim %d for_writepages %d range_cyclic %d writeback_index %lu", + jbd2_dev_to_name(__entry->dev), + (unsigned long) __entry->ino, __entry->nr_to_write, __entry->pages_skipped, __entry->range_start, __entry->range_end, __entry->nonblocking, __entry->for_kupdate, __entry->for_reclaim, - __entry->for_writepages, __entry->range_cyclic) + __entry->for_writepages, __entry->range_cyclic, + (unsigned long) __entry->writeback_index) +); + +TRACE_EVENT(ext4_da_write_pages, + TP_PROTO(struct inode *inode, struct mpage_da_data *mpd), + + TP_ARGS(inode, mpd), + + TP_STRUCT__entry( + __field( dev_t, dev ) + __field( ino_t, ino ) + __field( __u64, b_blocknr ) + __field( __u32, b_size ) + __field( __u32, b_state ) + __field( unsigned long, first_page ) + __field( int, io_done ) + __field( int, pages_written ) + ), + + TP_fast_assign( + __entry->dev = inode->i_sb->s_dev; + __entry->ino = inode->i_ino; + __entry->b_blocknr = mpd->b_blocknr; + __entry->b_size = mpd->b_size; + __entry->b_state = mpd->b_state; + __entry->first_page = mpd->first_page; + __entry->io_done = mpd->io_done; + __entry->pages_written = mpd->pages_written; + ), + + TP_printk("dev %s ino %lu b_blocknr %llu b_size %u b_state 0x%04x first_page %lu io_done %d pages_written %d", + jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, + __entry->b_blocknr, __entry->b_size, + __entry->b_state, __entry->first_page, + __entry->io_done, __entry->pages_written) ); TRACE_EVENT(ext4_da_writepages_result, @@ -268,6 +308,7 @@ TRACE_EVENT(ext4_da_writepages_result, __field( char, encountered_congestion ) __field( char, more_io ) __field( char, no_nrwrite_index_update ) + __field( pgoff_t, writeback_index ) ), TP_fast_assign( @@ -279,13 +320,16 @@ TRACE_EVENT(ext4_da_writepages_result, __entry->encountered_congestion = wbc->encountered_congestion; __entry->more_io = wbc->more_io; __entry->no_nrwrite_index_update = wbc->no_nrwrite_index_update; + __entry->writeback_index = inode->i_mapping->writeback_index; ), - TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld congestion %d more_io %d no_nrwrite_index_update %d", - jbd2_dev_to_name(__entry->dev), __entry->ino, __entry->ret, + TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld congestion %d more_io %d no_nrwrite_index_update %d writeback_index %lu", + jbd2_dev_to_name(__entry->dev), + (unsigned long) __entry->ino, __entry->ret, __entry->pages_written, __entry->pages_skipped, __entry->encountered_congestion, __entry->more_io, - __entry->no_nrwrite_index_update) + __entry->no_nrwrite_index_update, + (unsigned long) __entry->writeback_index) ); TRACE_EVENT(ext4_da_write_begin, diff --git a/init/Kconfig b/init/Kconfig index 419134cfc80d..3f7e60995c80 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -976,15 +976,6 @@ config EVENT_PROFILE endmenu -config ASHMEM - bool "Enable the Anonymous Shared Memory Subsystem" - default n - depends on SHMEM || TINY_SHMEM - help - The ashmem subsystem is a new shared memory allocator, similar to - POSIX SHM but with different behavior and sporting a simpler - file-based API. - config VM_EVENT_COUNTERS default y bool "Enable VM event counters for /proc/vmstat" if EMBEDDED diff --git a/init/main.c b/init/main.c index 4c6c9dbf65bc..82e798f1a41f 100644 --- a/init/main.c +++ b/init/main.c @@ -250,7 +250,7 @@ early_param("loglevel", loglevel); /* * Unknown boot options get handed to init, unless they look like - * failed parameters + * unused parameters (modprobe will find them in /proc/cmdline). */ static int __init unknown_bootoption(char *param, char *val) { @@ -271,14 +271,9 @@ static int __init unknown_bootoption(char *param, char *val) if (obsolete_checksetup(param)) return 0; - /* - * Preemptive maintenance for "why didn't my misspelled command - * line work?" - */ - if (strchr(param, '.') && (!val || strchr(param, '.') < val)) { - printk(KERN_ERR "Unknown boot option `%s': ignoring\n", param); + /* Unused module parameter. */ + if (strchr(param, '.') && (!val || strchr(param, '.') < val)) return 0; - } if (panic_later) return 0; @@ -691,12 +686,12 @@ asmlinkage void __init start_kernel(void) #endif thread_info_cache_init(); cred_init(); - fork_init(num_physpages); + fork_init(totalram_pages); proc_caches_init(); buffer_init(); key_init(); security_init(); - vfs_caches_init(num_physpages); + vfs_caches_init(totalram_pages); radix_tree_init(); signals_init(); /* rootfs populating might need page-writeback */ diff --git a/ipc/msg.c b/ipc/msg.c index 2ceab7f12fcb..779f7622ebcb 100644 --- a/ipc/msg.c +++ b/ipc/msg.c @@ -125,6 +125,7 @@ void msg_init_ns(struct ipc_namespace *ns) void msg_exit_ns(struct ipc_namespace *ns) { free_ipcs(ns, &msg_ids(ns), freeque); + idr_destroy(&ns->ids[IPC_MSG_IDS].ipcs_idr); } #endif diff --git a/ipc/sem.c b/ipc/sem.c index 87c2b641fd7b..2f2a47959576 100644 --- a/ipc/sem.c +++ b/ipc/sem.c @@ -129,6 +129,7 @@ void sem_init_ns(struct ipc_namespace *ns) void sem_exit_ns(struct ipc_namespace *ns) { free_ipcs(ns, &sem_ids(ns), freeary); + idr_destroy(&ns->ids[IPC_SEM_IDS].ipcs_idr); } #endif diff --git a/ipc/shm.c b/ipc/shm.c index 1bc4701ef4f0..9f779ab67726 100644 --- a/ipc/shm.c +++ b/ipc/shm.c @@ -101,6 +101,7 @@ static void do_shm_rmid(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp) void shm_exit_ns(struct ipc_namespace *ns) { free_ipcs(ns, &shm_ids(ns), do_shm_rmid); + idr_destroy(&ns->ids[IPC_SHM_IDS].ipcs_idr); } #endif @@ -410,7 +411,7 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params) return error; no_id: - if (shp->mlock_user) /* shmflg & SHM_HUGETLB case */ + if (is_file_hugepages(file) && shp->mlock_user) user_shm_unlock(size, shp->mlock_user); fput(file); no_file: diff --git a/kernel/acct.c b/kernel/acct.c index 9f3391090b3e..a6605ca921b6 100644 --- a/kernel/acct.c +++ b/kernel/acct.c @@ -491,13 +491,17 @@ static void do_acct_process(struct bsd_acct_struct *acct, u64 run_time; struct timespec uptime; struct tty_struct *tty; + const struct cred *orig_cred; + + /* Perform file operations on behalf of whoever enabled accounting */ + orig_cred = override_creds(file->f_cred); /* * First check to see if there is enough free_space to continue * the process accounting system. */ if (!check_free_space(acct, file)) - return; + goto out; /* * Fill the accounting struct with the needed info as recorded @@ -532,7 +536,8 @@ static void do_acct_process(struct bsd_acct_struct *acct, do_div(elapsed, AHZ); ac.ac_btime = get_seconds() - elapsed; /* we really need to bite the bullet and change layout */ - current_uid_gid(&ac.ac_uid, &ac.ac_gid); + ac.ac_uid = orig_cred->uid; + ac.ac_gid = orig_cred->gid; #if ACCT_VERSION==2 ac.ac_ahz = AHZ; #endif @@ -578,6 +583,8 @@ static void do_acct_process(struct bsd_acct_struct *acct, sizeof(acct_t), &file->f_pos); current->signal->rlim[RLIMIT_FSIZE].rlim_cur = flim; set_fs(fs); +out: + revert_creds(orig_cred); } /** diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c index 2451dc6f3282..4b05bd9479db 100644 --- a/kernel/audit_tree.c +++ b/kernel/audit_tree.c @@ -277,7 +277,7 @@ static void untag_chunk(struct node *p) owner->root = NULL; } - for (i = j = 0; i < size; i++, j++) { + for (i = j = 0; j <= size; i++, j++) { struct audit_tree *s; if (&chunk->owners[j] == p) { list_del_init(&p->list); @@ -290,7 +290,7 @@ static void untag_chunk(struct node *p) if (!s) /* result of earlier fallback */ continue; get_tree(s); - list_replace_init(&chunk->owners[i].list, &new->owners[j].list); + list_replace_init(&chunk->owners[j].list, &new->owners[i].list); } list_replace_rcu(&chunk->hash, &new->hash); @@ -373,15 +373,17 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree) for (n = 0; n < old->count; n++) { if (old->owners[n].owner == tree) { spin_unlock(&hash_lock); - put_inotify_watch(watch); + put_inotify_watch(&old->watch); return 0; } } spin_unlock(&hash_lock); chunk = alloc_chunk(old->count + 1); - if (!chunk) + if (!chunk) { + put_inotify_watch(&old->watch); return -ENOMEM; + } mutex_lock(&inode->inotify_mutex); if (inotify_clone_watch(&old->watch, &chunk->watch) < 0) { @@ -425,7 +427,8 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree) spin_unlock(&hash_lock); inotify_evict_watch(&old->watch); mutex_unlock(&inode->inotify_mutex); - put_inotify_watch(&old->watch); + put_inotify_watch(&old->watch); /* pair to inotify_find_watch */ + put_inotify_watch(&old->watch); /* and kill it */ return 0; } diff --git a/kernel/exit.c b/kernel/exit.c index 869dc221733e..b8606f0f22e4 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -987,8 +987,6 @@ NORET_TYPE void do_exit(long code) tsk->mempolicy = NULL; #endif #ifdef CONFIG_FUTEX - if (unlikely(!list_empty(&tsk->pi_state_list))) - exit_pi_state_list(tsk); if (unlikely(current->pi_state_cache)) kfree(current->pi_state_cache); #endif diff --git a/kernel/fork.c b/kernel/fork.c index 4c21988d6195..4b36858c0f4a 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -136,9 +136,6 @@ struct kmem_cache *vm_area_cachep; /* SLAB cache for mm_struct structures (tsk->mm) */ static struct kmem_cache *mm_cachep; -/* Notifier list called when a task struct is freed */ -static ATOMIC_NOTIFIER_HEAD(task_free_notifier); - void free_task(struct task_struct *tsk) { prop_local_destroy_single(&tsk->dirties); @@ -149,18 +146,6 @@ void free_task(struct task_struct *tsk) } EXPORT_SYMBOL(free_task); -int task_free_register(struct notifier_block *n) -{ - return atomic_notifier_chain_register(&task_free_notifier, n); -} -EXPORT_SYMBOL(task_free_register); - -int task_free_unregister(struct notifier_block *n) -{ - return atomic_notifier_chain_unregister(&task_free_notifier, n); -} -EXPORT_SYMBOL(task_free_unregister); - void __put_task_struct(struct task_struct *tsk) { WARN_ON(!tsk->exit_state); @@ -171,7 +156,6 @@ void __put_task_struct(struct task_struct *tsk) put_cred(tsk->cred); delayacct_tsk_free(tsk); - atomic_notifier_call_chain(&task_free_notifier, 0, tsk); if (!profile_handoff_task(tsk)) free_task(tsk); } @@ -560,12 +544,18 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm) /* Get rid of any futexes when releasing the mm */ #ifdef CONFIG_FUTEX - if (unlikely(tsk->robust_list)) + if (unlikely(tsk->robust_list)) { exit_robust_list(tsk); + tsk->robust_list = NULL; + } #ifdef CONFIG_COMPAT - if (unlikely(tsk->compat_robust_list)) + if (unlikely(tsk->compat_robust_list)) { compat_exit_robust_list(tsk); + tsk->compat_robust_list = NULL; + } #endif + if (unlikely(!list_empty(&tsk->pi_state_list))) + exit_pi_state_list(tsk); #endif /* Get rid of any cached register state */ diff --git a/kernel/futex.c b/kernel/futex.c index e18cfbdc7190..fdc88aa1c5f1 100644 --- a/kernel/futex.c +++ b/kernel/futex.c @@ -115,6 +115,9 @@ struct futex_q { /* rt_waiter storage for requeue_pi: */ struct rt_mutex_waiter *rt_waiter; + /* The expected requeue pi target futex key: */ + union futex_key *requeue_pi_key; + /* Bitset for the optional bitmasked wakeup */ u32 bitset; }; @@ -147,7 +150,8 @@ static struct futex_hash_bucket *hash_futex(union futex_key *key) */ static inline int match_futex(union futex_key *key1, union futex_key *key2) { - return (key1->both.word == key2->both.word + return (key1 && key2 + && key1->both.word == key2->both.word && key1->both.ptr == key2->both.ptr && key1->both.offset == key2->both.offset); } @@ -299,8 +303,14 @@ void put_futex_key(int fshared, union futex_key *key) */ static int fault_in_user_writeable(u32 __user *uaddr) { - int ret = get_user_pages(current, current->mm, (unsigned long)uaddr, - 1, 1, 0, NULL, NULL); + struct mm_struct *mm = current->mm; + int ret; + + down_read(&mm->mmap_sem); + ret = get_user_pages(current, mm, (unsigned long)uaddr, + 1, 1, 0, NULL, NULL); + up_read(&mm->mmap_sem); + return ret < 0 ? ret : 0; } @@ -521,8 +531,25 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, return -EINVAL; WARN_ON(!atomic_read(&pi_state->refcount)); - WARN_ON(pid && pi_state->owner && - pi_state->owner->pid != pid); + + /* + * When pi_state->owner is NULL then the owner died + * and another waiter is on the fly. pi_state->owner + * is fixed up by the task which acquires + * pi_state->rt_mutex. + * + * We do not check for pid == 0 which can happen when + * the owner died and robust_list_exit() cleared the + * TID. + */ + if (pid && pi_state->owner) { + /* + * Bail out if user space manipulated the + * futex value. + */ + if (pid != task_pid_vnr(pi_state->owner)) + return -EINVAL; + } atomic_inc(&pi_state->refcount); *ps = pi_state; @@ -749,6 +776,13 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this) if (!pi_state) return -EINVAL; + /* + * If current does not own the pi_state then the futex is + * inconsistent and user space fiddled with the futex value. + */ + if (pi_state->owner != current) + return -EINVAL; + spin_lock(&pi_state->pi_mutex.wait_lock); new_owner = rt_mutex_next_owner(&pi_state->pi_mutex); @@ -912,8 +946,8 @@ retry: hb1 = hash_futex(&key1); hb2 = hash_futex(&key2); - double_lock_hb(hb1, hb2); retry_private: + double_lock_hb(hb1, hb2); op_ret = futex_atomic_op_inuser(op, uaddr2); if (unlikely(op_ret < 0)) { @@ -1024,7 +1058,6 @@ static inline void requeue_pi_wake_futex(struct futex_q *q, union futex_key *key, struct futex_hash_bucket *hb) { - drop_futex_key_refs(&q->key); get_futex_key_refs(key); q->key = *key; @@ -1089,6 +1122,10 @@ static int futex_proxy_trylock_atomic(u32 __user *pifutex, if (!top_waiter) return 0; + /* Ensure we requeue to the expected futex. */ + if (!match_futex(top_waiter->requeue_pi_key, key2)) + return -EINVAL; + /* * Try to take the lock for top_waiter. Set the FUTEX_WAITERS bit in * the contended case or if set_waiters is 1. The pi_state is returned @@ -1218,6 +1255,7 @@ retry_private: */ if (ret == 1) { WARN_ON(pi_state); + drop_count++; task_count++; ret = get_futex_value_locked(&curval2, uaddr2); if (!ret) @@ -1276,6 +1314,12 @@ retry_private: continue; } + /* Ensure we requeue to the expected futex for requeue_pi. */ + if (requeue_pi && !match_futex(this->requeue_pi_key, &key2)) { + ret = -EINVAL; + break; + } + /* * Requeue nr_requeue waiters and possibly one more in the case * of requeue_pi if we couldn't acquire the lock atomically. @@ -1290,6 +1334,7 @@ retry_private: if (ret == 1) { /* We got the lock. */ requeue_pi_wake_futex(this, &key2, hb2); + drop_count++; continue; } else if (ret) { /* -EDEADLK */ @@ -1625,17 +1670,8 @@ out: static void futex_wait_queue_me(struct futex_hash_bucket *hb, struct futex_q *q, struct hrtimer_sleeper *timeout) { - queue_me(q, hb); - - /* - * There might have been scheduling since the queue_me(), as we - * cannot hold a spinlock across the get_user() in case it - * faults, and we cannot just set TASK_INTERRUPTIBLE state when - * queueing ourselves into the futex hash. This code thus has to - * rely on the futex_wake() code removing us from hash when it - * wakes us up. - */ set_current_state(TASK_INTERRUPTIBLE); + queue_me(q, hb); /* Arm the timer */ if (timeout) { @@ -1645,8 +1681,8 @@ static void futex_wait_queue_me(struct futex_hash_bucket *hb, struct futex_q *q, } /* - * !plist_node_empty() is safe here without any lock. - * q.lock_ptr != 0 is not safe, because of ordering against wakeup. + * If we have been removed from the hash list, then another task + * has tried to wake us, and we can skip the call to schedule(). */ if (likely(!plist_node_empty(&q->list))) { /* @@ -1751,6 +1787,7 @@ static int futex_wait(u32 __user *uaddr, int fshared, q.pi_state = NULL; q.bitset = bitset; q.rt_waiter = NULL; + q.requeue_pi_key = NULL; if (abs_time) { to = &timeout; @@ -1762,6 +1799,7 @@ static int futex_wait(u32 __user *uaddr, int fshared, current->timer_slack_ns); } +retry: /* Prepare to wait on uaddr. */ ret = futex_wait_setup(uaddr, val, fshared, &q, &hb); if (ret) @@ -1779,9 +1817,14 @@ static int futex_wait(u32 __user *uaddr, int fshared, goto out_put_key; /* - * We expect signal_pending(current), but another thread may - * have handled it for us already. + * We expect signal_pending(current), but we might be the + * victim of a spurious wakeup as well. */ + if (!signal_pending(current)) { + put_futex_key(fshared, &q.key); + goto retry; + } + ret = -ERESTARTSYS; if (!abs_time) goto out_put_key; @@ -1858,6 +1901,7 @@ static int futex_lock_pi(u32 __user *uaddr, int fshared, q.pi_state = NULL; q.rt_waiter = NULL; + q.requeue_pi_key = NULL; retry: q.key = FUTEX_KEY_INIT; ret = get_futex_key(uaddr, fshared, &q.key, VERIFY_WRITE); @@ -1930,7 +1974,7 @@ retry_private: /* Unqueue and drop the lock */ unqueue_me_pi(&q); - goto out; + goto out_put_key; out_unlock_put_key: queue_unlock(&q, hb); @@ -2087,11 +2131,12 @@ int handle_early_requeue_pi_wakeup(struct futex_hash_bucket *hb, * Unqueue the futex_q and determine which it was. */ plist_del(&q->list, &q->list.plist); - drop_futex_key_refs(&q->key); + /* Handle spurious wakeups gracefully */ + ret = -EWOULDBLOCK; if (timeout && !timeout->task) ret = -ETIMEDOUT; - else + else if (signal_pending(current)) ret = -ERESTARTNOINTR; } return ret; @@ -2169,15 +2214,16 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, int fshared, debug_rt_mutex_init_waiter(&rt_waiter); rt_waiter.task = NULL; - q.pi_state = NULL; - q.bitset = bitset; - q.rt_waiter = &rt_waiter; - key2 = FUTEX_KEY_INIT; ret = get_futex_key(uaddr2, fshared, &key2, VERIFY_WRITE); if (unlikely(ret != 0)) goto out; + q.pi_state = NULL; + q.bitset = bitset; + q.rt_waiter = &rt_waiter; + q.requeue_pi_key = &key2; + /* Prepare to wait on uaddr. */ ret = futex_wait_setup(uaddr, val, fshared, &q, &hb); if (ret) diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index e8108a1a0eaf..929ecec50913 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c @@ -369,6 +369,9 @@ irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action) irqreturn_t ret, retval = IRQ_NONE; unsigned int status = 0; + if (!(action->flags & IRQF_DISABLED)) + local_irq_enable_in_hardirq(); + do { trace_irq_handler_entry(irq, action); ret = action->handler(irq, action->dev_id); diff --git a/kernel/module.c b/kernel/module.c index 2d537186191f..cda4d7667d70 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -1179,7 +1179,8 @@ static void add_sect_attrs(struct module *mod, unsigned int nsect, /* Count loaded sections and allocate structures */ for (i = 0; i < nsect; i++) - if (sechdrs[i].sh_flags & SHF_ALLOC) + if (sechdrs[i].sh_flags & SHF_ALLOC + && sechdrs[i].sh_size) nloaded++; size[0] = ALIGN(sizeof(*sect_attrs) + nloaded * sizeof(sect_attrs->attrs[0]), @@ -1199,6 +1200,8 @@ static void add_sect_attrs(struct module *mod, unsigned int nsect, for (i = 0; i < nsect; i++) { if (! (sechdrs[i].sh_flags & SHF_ALLOC)) continue; + if (!sechdrs[i].sh_size) + continue; sattr->address = sechdrs[i].sh_addr; sattr->name = kstrdup(secstrings + sechdrs[i].sh_name, GFP_KERNEL); diff --git a/kernel/params.c b/kernel/params.c index 7f6912ced2ba..f04a1e70c18b 100644 --- a/kernel/params.c +++ b/kernel/params.c @@ -217,15 +217,11 @@ int param_set_charp(const char *val, struct kernel_param *kp) return -ENOSPC; } - if (kp->flags & KPARAM_KMALLOCED) - kfree(*(char **)kp->arg); - /* This is a hack. We can't need to strdup in early boot, and we * don't need to; this mangled commandline is preserved. */ if (slab_is_available()) { - kp->flags |= KPARAM_KMALLOCED; *(char **)kp->arg = kstrdup(val, GFP_KERNEL); - if (!kp->arg) + if (!*(char **)kp->arg) return -ENOMEM; } else *(const char **)kp->arg = val; @@ -303,6 +299,7 @@ static int param_array(const char *name, unsigned int min, unsigned int max, void *elem, int elemsize, int (*set)(const char *, struct kernel_param *kp), + u16 flags, unsigned int *num) { int ret; @@ -312,6 +309,7 @@ static int param_array(const char *name, /* Get the name right for errors. */ kp.name = name; kp.arg = elem; + kp.flags = flags; /* No equals sign? */ if (!val) { @@ -357,7 +355,8 @@ int param_array_set(const char *val, struct kernel_param *kp) unsigned int temp_num; return param_array(kp->name, val, 1, arr->max, arr->elem, - arr->elemsize, arr->set, arr->num ?: &temp_num); + arr->elemsize, arr->set, kp->flags, + arr->num ?: &temp_num); } int param_array_get(char *buffer, struct kernel_param *kp) @@ -604,11 +603,7 @@ void module_param_sysfs_remove(struct module *mod) void destroy_params(const struct kernel_param *params, unsigned num) { - unsigned int i; - - for (i = 0; i < num; i++) - if (params[i].flags & KPARAM_KMALLOCED) - kfree(*(char **)params[i].arg); + /* FIXME: This should free kmalloced charp parameters. It doesn't. */ } static void __init kernel_add_sysfs_param(const char *name, diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c index d7cbc579fc80..237fd07a369f 100644 --- a/kernel/perf_counter.c +++ b/kernel/perf_counter.c @@ -469,7 +469,8 @@ static void update_counter_times(struct perf_counter *counter) struct perf_counter_context *ctx = counter->ctx; u64 run_end; - if (counter->state < PERF_COUNTER_STATE_INACTIVE) + if (counter->state < PERF_COUNTER_STATE_INACTIVE || + counter->group_leader->state < PERF_COUNTER_STATE_INACTIVE) return; counter->total_time_enabled = ctx->time - counter->tstamp_enabled; @@ -518,7 +519,7 @@ static void __perf_counter_disable(void *info) */ if (counter->state >= PERF_COUNTER_STATE_INACTIVE) { update_context_time(ctx); - update_counter_times(counter); + update_group_times(counter); if (counter == counter->group_leader) group_sched_out(counter, cpuctx, ctx); else @@ -573,7 +574,7 @@ static void perf_counter_disable(struct perf_counter *counter) * in, so we can change the state safely. */ if (counter->state == PERF_COUNTER_STATE_INACTIVE) { - update_counter_times(counter); + update_group_times(counter); counter->state = PERF_COUNTER_STATE_OFF; } @@ -851,6 +852,27 @@ retry: } /* + * Put a counter into inactive state and update time fields. + * Enabling the leader of a group effectively enables all + * the group members that aren't explicitly disabled, so we + * have to update their ->tstamp_enabled also. + * Note: this works for group members as well as group leaders + * since the non-leader members' sibling_lists will be empty. + */ +static void __perf_counter_mark_enabled(struct perf_counter *counter, + struct perf_counter_context *ctx) +{ + struct perf_counter *sub; + + counter->state = PERF_COUNTER_STATE_INACTIVE; + counter->tstamp_enabled = ctx->time - counter->total_time_enabled; + list_for_each_entry(sub, &counter->sibling_list, list_entry) + if (sub->state >= PERF_COUNTER_STATE_INACTIVE) + sub->tstamp_enabled = + ctx->time - sub->total_time_enabled; +} + +/* * Cross CPU call to enable a performance counter */ static void __perf_counter_enable(void *info) @@ -877,8 +899,7 @@ static void __perf_counter_enable(void *info) if (counter->state >= PERF_COUNTER_STATE_INACTIVE) goto unlock; - counter->state = PERF_COUNTER_STATE_INACTIVE; - counter->tstamp_enabled = ctx->time - counter->total_time_enabled; + __perf_counter_mark_enabled(counter, ctx); /* * If the counter is in a group and isn't the group leader, @@ -971,11 +992,9 @@ static void perf_counter_enable(struct perf_counter *counter) * Since we have the lock this context can't be scheduled * in, so we can change the state safely. */ - if (counter->state == PERF_COUNTER_STATE_OFF) { - counter->state = PERF_COUNTER_STATE_INACTIVE; - counter->tstamp_enabled = - ctx->time - counter->total_time_enabled; - } + if (counter->state == PERF_COUNTER_STATE_OFF) + __perf_counter_mark_enabled(counter, ctx); + out: spin_unlock_irq(&ctx->lock); } @@ -1344,7 +1363,7 @@ static void perf_ctx_adjust_freq(struct perf_counter_context *ctx) u64 interrupts, freq; spin_lock(&ctx->lock); - list_for_each_entry(counter, &ctx->counter_list, list_entry) { + list_for_each_entry_rcu(counter, &ctx->counter_list, event_entry) { if (counter->state != PERF_COUNTER_STATE_ACTIVE) continue; @@ -1479,9 +1498,7 @@ static void perf_counter_enable_on_exec(struct task_struct *task) counter->attr.enable_on_exec = 0; if (counter->state >= PERF_COUNTER_STATE_INACTIVE) continue; - counter->state = PERF_COUNTER_STATE_INACTIVE; - counter->tstamp_enabled = - ctx->time - counter->total_time_enabled; + __perf_counter_mark_enabled(counter, ctx); enabled = 1; } @@ -4126,8 +4143,8 @@ done: static int perf_copy_attr(struct perf_counter_attr __user *uattr, struct perf_counter_attr *attr) { - int ret; u32 size; + int ret; if (!access_ok(VERIFY_WRITE, uattr, PERF_ATTR_SIZE_VER0)) return -EFAULT; @@ -4152,25 +4169,26 @@ static int perf_copy_attr(struct perf_counter_attr __user *uattr, /* * If we're handed a bigger struct than we know of, - * ensure all the unknown bits are 0. + * ensure all the unknown bits are 0 - i.e. new + * user-space does not rely on any kernel feature + * extensions we dont know about yet. */ if (size > sizeof(*attr)) { - unsigned long val; - unsigned long __user *addr; - unsigned long __user *end; + unsigned char __user *addr; + unsigned char __user *end; + unsigned char val; - addr = PTR_ALIGN((void __user *)uattr + sizeof(*attr), - sizeof(unsigned long)); - end = PTR_ALIGN((void __user *)uattr + size, - sizeof(unsigned long)); + addr = (void __user *)uattr + sizeof(*attr); + end = (void __user *)uattr + size; - for (; addr < end; addr += sizeof(unsigned long)) { + for (; addr < end; addr++) { ret = get_user(val, addr); if (ret) return ret; if (val) goto err_size; } + size = sizeof(*attr); } ret = copy_from_user(attr, uattr, size); diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c index d089d052c4a9..187d7a6d7761 100644 --- a/kernel/posix-timers.c +++ b/kernel/posix-timers.c @@ -524,14 +524,7 @@ SYSCALL_DEFINE3(timer_create, const clockid_t, which_clock, new_timer->it_id = (timer_t) new_timer_id; new_timer->it_clock = which_clock; new_timer->it_overrun = -1; - error = CLOCK_DISPATCH(which_clock, timer_create, (new_timer)); - if (error) - goto out; - /* - * return the timer_id now. The next step is hard to - * back out if there is an error. - */ if (copy_to_user(created_timer_id, &new_timer_id, sizeof (new_timer_id))) { error = -EFAULT; @@ -562,6 +555,10 @@ SYSCALL_DEFINE3(timer_create, const clockid_t, which_clock, new_timer->sigq->info.si_tid = new_timer->it_id; new_timer->sigq->info.si_code = SI_TIMER; + error = CLOCK_DISPATCH(which_clock, timer_create, (new_timer)); + if (error) + goto out; + spin_lock_irq(¤t->sighand->siglock); new_timer->it_signal = current->signal; list_add(&new_timer->list, ¤t->signal->posix_timers); diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig index bd007aa74549..72067cbdb37f 100644 --- a/kernel/power/Kconfig +++ b/kernel/power/Kconfig @@ -119,73 +119,6 @@ config SUSPEND_FREEZER config HIBERNATION_NVS bool -config HAS_WAKELOCK - bool - -config HAS_EARLYSUSPEND - bool - -config WAKELOCK - bool "Wake lock" - depends on PM && RTC_CLASS - default n - select HAS_WAKELOCK - ---help--- - Enable wakelocks. When user space request a sleep state the - sleep request will be delayed until no wake locks are held. - -config WAKELOCK_STAT - bool "Wake lock stats" - depends on WAKELOCK - default y - ---help--- - Report wake lock stats in /proc/wakelocks - -config USER_WAKELOCK - bool "Userspace wake locks" - depends on WAKELOCK - default y - ---help--- - User-space wake lock api. Write "lockname" or "lockname timeout" - to /sys/power/wake_lock lock and if needed create a wake lock. - Write "lockname" to /sys/power/wake_unlock to unlock a user wake - lock. - -config EARLYSUSPEND - bool "Early suspend" - depends on WAKELOCK - default y - select HAS_EARLYSUSPEND - ---help--- - Call early suspend handlers when the user requested sleep state - changes. - -choice - prompt "User-space screen access" - default FB_EARLYSUSPEND if !FRAMEBUFFER_CONSOLE - default CONSOLE_EARLYSUSPEND - depends on HAS_EARLYSUSPEND - - config NO_USER_SPACE_SCREEN_ACCESS_CONTROL - bool "None" - - config CONSOLE_EARLYSUSPEND - bool "Console switch on early-suspend" - depends on HAS_EARLYSUSPEND && VT - ---help--- - Register early suspend handler to perform a console switch to - when user-space should stop drawing to the screen and a switch - back when it should resume. - - config FB_EARLYSUSPEND - bool "Sysfs interface" - depends on HAS_EARLYSUSPEND - ---help--- - Register early suspend handler that notifies and waits for - user-space through sysfs when user-space should stop drawing - to the screen and notifies user-space when it should resume. -endchoice - config HIBERNATION bool "Hibernation (aka 'suspend to disk')" depends on PM && SWAP && ARCH_HIBERNATION_POSSIBLE diff --git a/kernel/power/Makefile b/kernel/power/Makefile index 058ec85a98bd..c3b81c30e5d5 100644 --- a/kernel/power/Makefile +++ b/kernel/power/Makefile @@ -12,8 +12,3 @@ obj-$(CONFIG_HIBERNATION) += swsusp.o hibernate.o snapshot.o swap.o user.o obj-$(CONFIG_HIBERNATION_NVS) += hibernate_nvs.o obj-$(CONFIG_MAGIC_SYSRQ) += poweroff.o -obj-$(CONFIG_WAKELOCK) += wakelock.o -obj-$(CONFIG_USER_WAKELOCK) += userwakelock.o -obj-$(CONFIG_EARLYSUSPEND) += earlysuspend.o -obj-$(CONFIG_CONSOLE_EARLYSUSPEND) += consoleearlysuspend.o -obj-$(CONFIG_FB_EARLYSUSPEND) += fbearlysuspend.o diff --git a/kernel/power/main.c b/kernel/power/main.c index ef94a083302f..f710e36930cc 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c @@ -146,11 +146,7 @@ static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t n) { #ifdef CONFIG_SUSPEND -#ifdef CONFIG_EARLYSUSPEND - suspend_state_t state = PM_SUSPEND_ON; -#else suspend_state_t state = PM_SUSPEND_STANDBY; -#endif const char * const *s; #endif char *p; @@ -172,15 +168,8 @@ static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr, break; } if (state < PM_SUSPEND_MAX && *s) -#ifdef CONFIG_EARLYSUSPEND - if (state == PM_SUSPEND_ON || valid_state(state)) { - error = 0; - request_suspend_state(state); - } -#else error = enter_state(state); #endif -#endif Exit: return error ? error : n; @@ -213,11 +202,6 @@ pm_trace_store(struct kobject *kobj, struct kobj_attribute *attr, power_attr(pm_trace); #endif /* CONFIG_PM_TRACE */ -#ifdef CONFIG_USER_WAKELOCK -power_attr(wake_lock); -power_attr(wake_unlock); -#endif - static struct attribute * g[] = { &state_attr.attr, #ifdef CONFIG_PM_TRACE @@ -226,10 +210,6 @@ static struct attribute * g[] = { #if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PM_DEBUG) &pm_test_attr.attr, #endif -#ifdef CONFIG_USER_WAKELOCK - &wake_lock_attr.attr, - &wake_unlock_attr.attr, -#endif NULL, }; diff --git a/kernel/power/power.h b/kernel/power/power.h index a665c1e4e597..26d5a26f82e3 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h @@ -236,27 +236,3 @@ static inline void suspend_thaw_processes(void) { } #endif - -#ifdef CONFIG_WAKELOCK -/* kernel/power/wakelock.c */ -extern struct workqueue_struct *suspend_work_queue; -extern struct wake_lock main_wake_lock; -extern suspend_state_t requested_suspend_state; -#endif - -#ifdef CONFIG_USER_WAKELOCK -ssize_t wake_lock_show(struct kobject *kobj, struct kobj_attribute *attr, - char *buf); -ssize_t wake_lock_store(struct kobject *kobj, struct kobj_attribute *attr, - const char *buf, size_t n); -ssize_t wake_unlock_show(struct kobject *kobj, struct kobj_attribute *attr, - char *buf); -ssize_t wake_unlock_store(struct kobject *kobj, struct kobj_attribute *attr, - const char *buf, size_t n); -#endif - -#ifdef CONFIG_EARLYSUSPEND -/* kernel/power/earlysuspend.c */ -void request_suspend_state(suspend_state_t state); -suspend_state_t get_suspend_state(void); -#endif diff --git a/kernel/power/process.c b/kernel/power/process.c index d366c35f8ba0..da2072d73811 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c @@ -13,7 +13,6 @@ #include <linux/module.h> #include <linux/syscalls.h> #include <linux/freezer.h> -#include <linux/wakelock.h> /* * Timeout for stopping processes @@ -37,7 +36,6 @@ static int try_to_freeze_tasks(bool sig_only) struct timeval start, end; u64 elapsed_csecs64; unsigned int elapsed_csecs; - unsigned int wakeup = 0; do_gettimeofday(&start); @@ -64,12 +62,6 @@ static int try_to_freeze_tasks(bool sig_only) } while_each_thread(g, p); read_unlock(&tasklist_lock); yield(); /* Yield is okay here */ -#ifdef CONFIG_WAKELOCK - if (todo && has_wake_lock(WAKE_LOCK_SUSPEND)) { - wakeup = 1; - break; - } -#endif if (time_after(jiffies, end_time)) break; } while (todo); @@ -85,18 +77,11 @@ static int try_to_freeze_tasks(bool sig_only) * and caller must call thaw_processes() if something fails), * but it cleans up leftover PF_FREEZE requests. */ - if(wakeup) { - printk("\n"); - printk(KERN_ERR "Freezing of %s aborted\n", - sig_only ? "user space " : "tasks "); - } - else { - printk("\n"); - printk(KERN_ERR "Freezing of tasks failed after %d.%02d seconds " - "(%d tasks refusing to freeze):\n", - elapsed_csecs / 100, elapsed_csecs % 100, todo); - show_state(); - } + printk("\n"); + printk(KERN_ERR "Freezing of tasks failed after %d.%02d seconds " + "(%d tasks refusing to freeze):\n", + elapsed_csecs / 100, elapsed_csecs % 100, todo); + show_state(); read_lock(&tasklist_lock); do_each_thread(g, p) { task_lock(p); diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index cd515ba1c8ce..6f10dfc2d3e9 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c @@ -19,9 +19,6 @@ #include "power.h" const char *const pm_states[PM_SUSPEND_MAX] = { -#ifdef CONFIG_EARLYSUSPEND - [PM_SUSPEND_ON] = "on", -#endif [PM_SUSPEND_STANDBY] = "standby", [PM_SUSPEND_MEM] = "mem", }; diff --git a/kernel/sched.c b/kernel/sched.c index 1b59e265273b..81ede13d2238 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -7945,6 +7945,7 @@ static cpumask_var_t cpu_isolated_map; /* Setup the mask of cpus configured for isolated domains */ static int __init isolated_cpu_setup(char *str) { + alloc_bootmem_cpumask_var(&cpu_isolated_map); cpulist_parse(str, cpu_isolated_map); return 1; } @@ -9383,13 +9384,15 @@ void __init sched_init(void) current->sched_class = &fair_sched_class; /* Allocate the nohz_cpu_mask if CONFIG_CPUMASK_OFFSTACK */ - alloc_cpumask_var(&nohz_cpu_mask, GFP_NOWAIT); + zalloc_cpumask_var(&nohz_cpu_mask, GFP_NOWAIT); #ifdef CONFIG_SMP #ifdef CONFIG_NO_HZ - alloc_cpumask_var(&nohz.cpu_mask, GFP_NOWAIT); + zalloc_cpumask_var(&nohz.cpu_mask, GFP_NOWAIT); alloc_cpumask_var(&nohz.ilb_grp_nohz_mask, GFP_NOWAIT); #endif - alloc_cpumask_var(&cpu_isolated_map, GFP_NOWAIT); + /* May be allocated at isolcpus cmdline parse time */ + if (cpu_isolated_map == NULL) + zalloc_cpumask_var(&cpu_isolated_map, GFP_NOWAIT); #endif /* SMP */ perf_counter_init(); diff --git a/kernel/signal.c b/kernel/signal.c index 64c5deeaca5d..86464ce4ceba 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -939,7 +939,8 @@ static void print_fatal_signal(struct pt_regs *regs, int signr) for (i = 0; i < 16; i++) { unsigned char insn; - __get_user(insn, (unsigned char *)(regs->ip + i)); + if (get_user(insn, (unsigned char *)(regs->ip + i))) + break; printk("%02x ", insn); } } diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c index 620b58abdc32..0d809ae02d60 100644 --- a/kernel/time/clockevents.c +++ b/kernel/time/clockevents.c @@ -20,6 +20,8 @@ #include <linux/sysdev.h> #include <linux/tick.h> +#include "tick-internal.h" + /* The registered clock event devices */ static LIST_HEAD(clockevent_devices); static LIST_HEAD(clockevents_released); @@ -237,8 +239,9 @@ void clockevents_exchange_device(struct clock_event_device *old, */ void clockevents_notify(unsigned long reason, void *arg) { - struct list_head *node, *tmp; + struct clock_event_device *dev, *tmp; unsigned long flags; + int cpu; spin_lock_irqsave(&clockevents_lock, flags); clockevents_do_notify(reason, arg); @@ -249,8 +252,20 @@ void clockevents_notify(unsigned long reason, void *arg) * Unregister the clock event devices which were * released from the users in the notify chain. */ - list_for_each_safe(node, tmp, &clockevents_released) - list_del(node); + list_for_each_entry_safe(dev, tmp, &clockevents_released, list) + list_del(&dev->list); + /* + * Now check whether the CPU has left unused per cpu devices + */ + cpu = *((int *)arg); + list_for_each_entry_safe(dev, tmp, &clockevent_devices, list) { + if (cpumask_test_cpu(cpu, dev->cpumask) && + cpumask_weight(dev->cpumask) == 1 && + !tick_is_broadcast_device(dev)) { + BUG_ON(dev->mode != CLOCK_EVT_MODE_UNUSED); + list_del(&dev->list); + } + } break; default: break; diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index e0f59a21c061..89aed5933ed4 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -231,6 +231,13 @@ void tick_nohz_stop_sched_tick(int inidle) if (!inidle && !ts->inidle) goto end; + /* + * Set ts->inidle unconditionally. Even if the system did not + * switch to NOHZ mode the cpu frequency governers rely on the + * update of the idle time accounting in tick_nohz_start_idle(). + */ + ts->inidle = 1; + now = tick_nohz_start_idle(ts); /* @@ -248,8 +255,6 @@ void tick_nohz_stop_sched_tick(int inidle) if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE)) goto end; - ts->inidle = 1; - if (need_resched()) goto end; diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 25edd5cc5935..52eb25189928 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -1110,14 +1110,9 @@ static void ftrace_replace_code(int enable) failed = __ftrace_replace_code(rec, enable); if (failed) { rec->flags |= FTRACE_FL_FAILED; - if ((system_state == SYSTEM_BOOTING) || - !core_kernel_text(rec->ip)) { - ftrace_free_rec(rec); - } else { - ftrace_bug(failed, rec->ip); - /* Stop processing */ - return; - } + ftrace_bug(failed, rec->ip); + /* Stop processing */ + return; } } while_for_each_ftrace_rec(); } @@ -2801,19 +2796,17 @@ static int ftrace_convert_nops(struct module *mod, } #ifdef CONFIG_MODULES -void ftrace_release(void *start, void *end) +void ftrace_release_mod(struct module *mod) { struct dyn_ftrace *rec; struct ftrace_page *pg; - unsigned long s = (unsigned long)start; - unsigned long e = (unsigned long)end; - if (ftrace_disabled || !start || start == end) + if (ftrace_disabled) return; mutex_lock(&ftrace_lock); do_for_each_ftrace_rec(pg, rec) { - if ((rec->ip >= s) && (rec->ip < e)) { + if (within_module_core(rec->ip, mod)) { /* * rec->ip is changed in ftrace_free_rec() * It should not between s and e if record was freed. @@ -2845,9 +2838,7 @@ static int ftrace_module_notify(struct notifier_block *self, mod->num_ftrace_callsites); break; case MODULE_STATE_GOING: - ftrace_release(mod->ftrace_callsites, - mod->ftrace_callsites + - mod->num_ftrace_callsites); + ftrace_release_mod(mod); break; } diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c index f32dc9d1ea7b..a6b0d73a0d9d 100644 --- a/kernel/trace/trace_events_filter.c +++ b/kernel/trace/trace_events_filter.c @@ -844,8 +844,9 @@ static void postfix_clear(struct filter_parse_state *ps) while (!list_empty(&ps->postfix)) { elt = list_first_entry(&ps->postfix, struct postfix_elt, list); - kfree(elt->operand); list_del(&elt->list); + kfree(elt->operand); + kfree(elt); } } diff --git a/kernel/user.c b/kernel/user.c index 2c000e7132ac..46d0165ca70c 100644 --- a/kernel/user.c +++ b/kernel/user.c @@ -330,9 +330,9 @@ done: */ static void free_user(struct user_struct *up, unsigned long flags) { - spin_unlock_irqrestore(&uidhash_lock, flags); INIT_DELAYED_WORK(&up->work, cleanup_user_struct); schedule_delayed_work(&up->work, msecs_to_jiffies(1000)); + spin_unlock_irqrestore(&uidhash_lock, flags); } #else /* CONFIG_USER_SCHED && CONFIG_SYSFS */ diff --git a/mm/Makefile b/mm/Makefile index f4e009cba6a5..5e0bd6426693 100644 --- a/mm/Makefile +++ b/mm/Makefile @@ -22,7 +22,6 @@ obj-$(CONFIG_HUGETLBFS) += hugetlb.o obj-$(CONFIG_NUMA) += mempolicy.o obj-$(CONFIG_SPARSEMEM) += sparse.o obj-$(CONFIG_SPARSEMEM_VMEMMAP) += sparse-vmemmap.o -obj-$(CONFIG_ASHMEM) += ashmem.o obj-$(CONFIG_TMPFS_POSIX_ACL) += shmem_acl.o obj-$(CONFIG_SLOB) += slob.o obj-$(CONFIG_MMU_NOTIFIER) += mmu_notifier.o diff --git a/mm/highmem.c b/mm/highmem.c index 25878cc49daa..9c1e627f282e 100644 --- a/mm/highmem.c +++ b/mm/highmem.c @@ -426,16 +426,21 @@ void __init page_address_init(void) void debug_kmap_atomic(enum km_type type) { - static unsigned warn_count = 10; + static int warn_count = 10; - if (unlikely(warn_count == 0)) + if (unlikely(warn_count < 0)) return; if (unlikely(in_interrupt())) { - if (in_irq()) { + if (in_nmi()) { + if (type != KM_NMI && type != KM_NMI_PTE) { + WARN_ON(1); + warn_count--; + } + } else if (in_irq()) { if (type != KM_IRQ0 && type != KM_IRQ1 && type != KM_BIO_SRC_IRQ && type != KM_BIO_DST_IRQ && - type != KM_BOUNCE_READ) { + type != KM_BOUNCE_READ && type != KM_IRQ_PTE) { WARN_ON(1); warn_count--; } @@ -452,7 +457,9 @@ void debug_kmap_atomic(enum km_type type) } if (type == KM_IRQ0 || type == KM_IRQ1 || type == KM_BOUNCE_READ || - type == KM_BIO_SRC_IRQ || type == KM_BIO_DST_IRQ) { + type == KM_BIO_SRC_IRQ || type == KM_BIO_DST_IRQ || + type == KM_IRQ_PTE || type == KM_NMI || + type == KM_NMI_PTE ) { if (!irqs_disabled()) { WARN_ON(1); warn_count--; diff --git a/mm/hugetlb.c b/mm/hugetlb.c index cafdcee154e8..cae03370a8ea 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -1010,6 +1010,7 @@ int __weak alloc_bootmem_huge_page(struct hstate *h) NODE_DATA(h->hugetlb_next_nid), huge_page_size(h), huge_page_size(h), 0); + hstate_next_node(h); if (addr) { /* * Use the beginning of the huge page to store the @@ -1019,7 +1020,6 @@ int __weak alloc_bootmem_huge_page(struct hstate *h) m = addr; goto found; } - hstate_next_node(h); nr_nodes--; } return 0; diff --git a/mm/memcontrol.c b/mm/memcontrol.c index fd4529d86de5..566925e7cdbd 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -496,7 +496,13 @@ int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem) task_unlock(task); if (!curr) return 0; - if (curr->use_hierarchy) + /* + * We should check use_hierarchy of "mem" not "curr". Because checking + * use_hierarchy of "curr" here make this function true if hierarchy is + * enabled in "curr" and "curr" is a child of "mem" in *cgroup* + * hierarchy(even if use_hierarchy is disabled in "mem"). + */ + if (mem->use_hierarchy) ret = css_is_ancestor(&curr->css, &mem->css); else ret = (curr == mem); diff --git a/mm/memory.c b/mm/memory.c index aede2ce3aba4..753b2e6ffd28 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -2638,7 +2638,8 @@ static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma, goto oom_free_page; entry = mk_pte(page, vma->vm_page_prot); - entry = maybe_mkwrite(pte_mkdirty(entry), vma); + if (vma->vm_flags & VM_WRITE) + entry = pte_mkwrite(pte_mkdirty(entry)); page_table = pte_offset_map_lock(mm, pmd, address, &ptl); if (!pte_none(*page_table)) diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 7dd9d9f80694..f29d8d70884d 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -1024,7 +1024,7 @@ static long do_mbind(unsigned long start, unsigned long len, err = migrate_prep(); if (err) - return err; + goto mpol_out; } { NODEMASK_SCRATCH(scratch); @@ -1039,10 +1039,9 @@ static long do_mbind(unsigned long start, unsigned long len, err = -ENOMEM; NODEMASK_SCRATCH_FREE(scratch); } - if (err) { - mpol_put(new); - return err; - } + if (err) + goto mpol_out; + vma = check_range(mm, start, end, nmask, flags | MPOL_MF_INVERT, &pagelist); @@ -1058,9 +1057,11 @@ static long do_mbind(unsigned long start, unsigned long len, if (!err && nr_failed && (flags & MPOL_MF_STRICT)) err = -EIO; - } + } else + putback_lru_pages(&pagelist); up_write(&mm->mmap_sem); + mpol_out: mpol_put(new); return err; } @@ -2121,8 +2122,8 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) char *rest = nodelist; while (isdigit(*rest)) rest++; - if (!*rest) - err = 0; + if (*rest) + goto out; } break; case MPOL_INTERLEAVE: @@ -2131,7 +2132,6 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) */ if (!nodelist) nodes = node_states[N_HIGH_MEMORY]; - err = 0; break; case MPOL_LOCAL: /* @@ -2141,11 +2141,19 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) goto out; mode = MPOL_PREFERRED; break; - - /* - * case MPOL_BIND: mpol_new() enforces non-empty nodemask. - * case MPOL_DEFAULT: mpol_new() enforces empty nodemask, ignores flags. - */ + case MPOL_DEFAULT: + /* + * Insist on a empty nodelist + */ + if (!nodelist) + err = 0; + goto out; + case MPOL_BIND: + /* + * Insist on a nodelist + */ + if (!nodelist) + goto out; } mode_flags = 0; @@ -2159,13 +2167,14 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) else if (!strcmp(flags, "relative")) mode_flags |= MPOL_F_RELATIVE_NODES; else - err = 1; + goto out; } new = mpol_new(mode, mode_flags, &nodes); if (IS_ERR(new)) - err = 1; - else { + goto out; + + { int ret; NODEMASK_SCRATCH(scratch); if (scratch) { @@ -2176,13 +2185,15 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) ret = -ENOMEM; NODEMASK_SCRATCH_FREE(scratch); if (ret) { - err = 1; mpol_put(new); - } else if (no_context) { - /* save for contextualization */ - new->w.user_nodemask = nodes; + goto out; } } + err = 0; + if (no_context) { + /* save for contextualization */ + new->w.user_nodemask = nodes; + } out: /* Restore string for error message */ diff --git a/mm/migrate.c b/mm/migrate.c index 939888f9ddab..eebfb79d7748 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -597,7 +597,7 @@ static int unmap_and_move(new_page_t get_new_page, unsigned long private, struct page *newpage = get_new_page(page, private, &result); int rcu_locked = 0; int charge = 0; - struct mem_cgroup *mem; + struct mem_cgroup *mem = NULL; if (!newpage) return -ENOMEM; @@ -937,6 +937,9 @@ static int do_pages_move(struct mm_struct *mm, struct task_struct *task, goto out_pm; err = -ENODEV; + if (node < 0 || node >= MAX_NUMNODES) + goto out_pm; + if (!node_state(node, N_HIGH_MEMORY)) goto out_pm; diff --git a/mm/mincore.c b/mm/mincore.c index 8cb508f84ea4..7a3436ef39eb 100644 --- a/mm/mincore.c +++ b/mm/mincore.c @@ -14,6 +14,7 @@ #include <linux/syscalls.h> #include <linux/swap.h> #include <linux/swapops.h> +#include <linux/hugetlb.h> #include <asm/uaccess.h> #include <asm/pgtable.h> @@ -72,6 +73,42 @@ static long do_mincore(unsigned long addr, unsigned char *vec, unsigned long pag if (!vma || addr < vma->vm_start) return -ENOMEM; +#ifdef CONFIG_HUGETLB_PAGE + if (is_vm_hugetlb_page(vma)) { + struct hstate *h; + unsigned long nr_huge; + unsigned char present; + + i = 0; + nr = min(pages, (vma->vm_end - addr) >> PAGE_SHIFT); + h = hstate_vma(vma); + nr_huge = ((addr + pages * PAGE_SIZE - 1) >> huge_page_shift(h)) + - (addr >> huge_page_shift(h)) + 1; + nr_huge = min(nr_huge, + (vma->vm_end - addr) >> huge_page_shift(h)); + while (1) { + /* hugepage always in RAM for now, + * but generally it needs to be check */ + ptep = huge_pte_offset(current->mm, + addr & huge_page_mask(h)); + present = !!(ptep && + !huge_pte_none(huge_ptep_get(ptep))); + while (1) { + vec[i++] = present; + addr += PAGE_SIZE; + /* reach buffer limit */ + if (i == nr) + return nr; + /* check hugepage border */ + if (!((addr & ~huge_page_mask(h)) + >> PAGE_SHIFT)) + break; + } + } + return nr; + } +#endif + /* * Calculate how many pages there are left in the last level of the * PTE array for our address. diff --git a/mm/mlock.c b/mm/mlock.c index 45eb650b9654..e13918d4fc4f 100644 --- a/mm/mlock.c +++ b/mm/mlock.c @@ -139,49 +139,36 @@ static void munlock_vma_page(struct page *page) } /** - * __mlock_vma_pages_range() - mlock/munlock a range of pages in the vma. + * __mlock_vma_pages_range() - mlock a range of pages in the vma. * @vma: target vma * @start: start address * @end: end address - * @mlock: 0 indicate munlock, otherwise mlock. * - * If @mlock == 0, unlock an mlocked range; - * else mlock the range of pages. This takes care of making the pages present , - * too. + * This takes care of making the pages present too. * * return 0 on success, negative error code on error. * * vma->vm_mm->mmap_sem must be held for at least read. */ static long __mlock_vma_pages_range(struct vm_area_struct *vma, - unsigned long start, unsigned long end, - int mlock) + unsigned long start, unsigned long end) { struct mm_struct *mm = vma->vm_mm; unsigned long addr = start; struct page *pages[16]; /* 16 gives a reasonable batch */ int nr_pages = (end - start) / PAGE_SIZE; int ret = 0; - int gup_flags = 0; + int gup_flags; VM_BUG_ON(start & ~PAGE_MASK); VM_BUG_ON(end & ~PAGE_MASK); VM_BUG_ON(start < vma->vm_start); VM_BUG_ON(end > vma->vm_end); - VM_BUG_ON((!rwsem_is_locked(&mm->mmap_sem)) && - (atomic_read(&mm->mm_users) != 0)); - - /* - * mlock: don't page populate if vma has PROT_NONE permission. - * munlock: always do munlock although the vma has PROT_NONE - * permission, or SIGKILL is pending. - */ - if (!mlock) - gup_flags |= GUP_FLAGS_IGNORE_VMA_PERMISSIONS | - GUP_FLAGS_IGNORE_SIGKILL; + VM_BUG_ON(!rwsem_is_locked(&mm->mmap_sem)); + gup_flags = 0; if (vma->vm_flags & VM_WRITE) - gup_flags |= GUP_FLAGS_WRITE; + gup_flags = GUP_FLAGS_WRITE; while (nr_pages > 0) { int i; @@ -201,19 +188,10 @@ static long __mlock_vma_pages_range(struct vm_area_struct *vma, * This can happen for, e.g., VM_NONLINEAR regions before * a page has been allocated and mapped at a given offset, * or for addresses that map beyond end of a file. - * We'll mlock the the pages if/when they get faulted in. + * We'll mlock the pages if/when they get faulted in. */ if (ret < 0) break; - if (ret == 0) { - /* - * We know the vma is there, so the only time - * we cannot get a single page should be an - * error (ret < 0) case. - */ - WARN_ON(1); - break; - } lru_add_drain(); /* push cached pages to LRU */ @@ -224,28 +202,22 @@ static long __mlock_vma_pages_range(struct vm_area_struct *vma, /* * Because we lock page here and migration is blocked * by the elevated reference, we need only check for - * page truncation (file-cache only). + * file-cache page truncation. This page->mapping + * check also neatly skips over the ZERO_PAGE(), + * though if that's common we'd prefer not to lock it. */ - if (page->mapping) { - if (mlock) - mlock_vma_page(page); - else - munlock_vma_page(page); - } + if (page->mapping) + mlock_vma_page(page); unlock_page(page); - put_page(page); /* ref from get_user_pages() */ - - /* - * here we assume that get_user_pages() has given us - * a list of virtually contiguous pages. - */ - addr += PAGE_SIZE; /* for next get_user_pages() */ - nr_pages--; + put_page(page); /* ref from get_user_pages() */ } + + addr += ret * PAGE_SIZE; + nr_pages -= ret; ret = 0; } - return ret; /* count entire vma as locked_vm */ + return ret; /* 0 or negative error code */ } /* @@ -289,7 +261,7 @@ long mlock_vma_pages_range(struct vm_area_struct *vma, is_vm_hugetlb_page(vma) || vma == get_gate_vma(current))) { - __mlock_vma_pages_range(vma, start, end, 1); + __mlock_vma_pages_range(vma, start, end); /* Hide errors from mmap() and other callers */ return 0; @@ -310,7 +282,6 @@ no_mlock: return nr_pages; /* error or pages NOT mlocked */ } - /* * munlock_vma_pages_range() - munlock all pages in the vma range.' * @vma - vma containing range to be munlock()ed. @@ -330,10 +301,24 @@ no_mlock: * free them. This will result in freeing mlocked pages. */ void munlock_vma_pages_range(struct vm_area_struct *vma, - unsigned long start, unsigned long end) + unsigned long start, unsigned long end) { + unsigned long addr; + + lru_add_drain(); vma->vm_flags &= ~VM_LOCKED; - __mlock_vma_pages_range(vma, start, end, 0); + + for (addr = start; addr < end; addr += PAGE_SIZE) { + struct page *page = follow_page(vma, addr, FOLL_GET); + if (page) { + lock_page(page); + if (page->mapping) + munlock_vma_page(page); + unlock_page(page); + put_page(page); + } + cond_resched(); + } } /* @@ -400,18 +385,14 @@ success: * It's okay if try_to_unmap_one unmaps a page just after we * set VM_LOCKED, __mlock_vma_pages_range will bring it back. */ - vma->vm_flags = newflags; if (lock) { - ret = __mlock_vma_pages_range(vma, start, end, 1); - - if (ret > 0) { - mm->locked_vm -= ret; - ret = 0; - } else - ret = __mlock_posix_error_return(ret); /* translate if needed */ + vma->vm_flags = newflags; + ret = __mlock_vma_pages_range(vma, start, end); + if (ret < 0) + ret = __mlock_posix_error_return(ret); } else { - __mlock_vma_pages_range(vma, start, end, 0); + munlock_vma_pages_range(vma, start, end); } out: diff --git a/mm/mmap.c b/mm/mmap.c index 8101de490c73..cbb7cb308243 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -570,9 +570,9 @@ again: remove_next = 1 + (end > next->vm_end); /* * When changing only vma->vm_end, we don't really need - * anon_vma lock: but is that case worth optimizing out? + * anon_vma lock. */ - if (vma->anon_vma) + if (vma->anon_vma && (insert || importer || start != vma->vm_start)) anon_vma = vma->anon_vma; if (anon_vma) { spin_lock(&anon_vma->lock); diff --git a/mm/nommu.c b/mm/nommu.c index 66e81e7e9fe9..10cdd4c61292 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -1056,7 +1056,7 @@ static int do_mmap_shared_file(struct vm_area_struct *vma) ret = vma->vm_file->f_op->mmap(vma->vm_file, vma); if (ret == 0) { vma->vm_region->vm_top = vma->vm_region->vm_end; - return ret; + return 0; } if (ret != -ENOSYS) return ret; @@ -1073,7 +1073,8 @@ static int do_mmap_shared_file(struct vm_area_struct *vma) */ static int do_mmap_private(struct vm_area_struct *vma, struct vm_region *region, - unsigned long len) + unsigned long len, + unsigned long capabilities) { struct page *pages; unsigned long total, point, n, rlen; @@ -1084,13 +1085,13 @@ static int do_mmap_private(struct vm_area_struct *vma, * shared mappings on devices or memory * - VM_MAYSHARE will be set if it may attempt to share */ - if (vma->vm_file) { + if (capabilities & BDI_CAP_MAP_DIRECT) { ret = vma->vm_file->f_op->mmap(vma->vm_file, vma); if (ret == 0) { /* shouldn't return success if we're not sharing */ BUG_ON(!(vma->vm_flags & VM_MAYSHARE)); vma->vm_region->vm_top = vma->vm_region->vm_end; - return ret; + return 0; } if (ret != -ENOSYS) return ret; @@ -1328,7 +1329,7 @@ unsigned long do_mmap_pgoff(struct file *file, * - this is the hook for quasi-memory character devices to * tell us the location of a shared mapping */ - if (file && file->f_op->get_unmapped_area) { + if (capabilities & BDI_CAP_MAP_DIRECT) { addr = file->f_op->get_unmapped_area(file, addr, len, pgoff, flags); if (IS_ERR((void *) addr)) { @@ -1352,15 +1353,17 @@ unsigned long do_mmap_pgoff(struct file *file, } vma->vm_region = region; - add_nommu_region(region); - /* set up the mapping */ + /* set up the mapping + * - the region is filled in if BDI_CAP_MAP_DIRECT is still set + */ if (file && vma->vm_flags & VM_SHARED) ret = do_mmap_shared_file(vma); else - ret = do_mmap_private(vma, region, len); + ret = do_mmap_private(vma, region, len, capabilities); if (ret < 0) - goto error_put_region; + goto error_just_free; + add_nommu_region(region); /* okay... we have a mapping; now we have to register it */ result = vma->vm_start; @@ -1378,25 +1381,14 @@ share: kleave(" = %lx", result); return result; -error_put_region: - __put_nommu_region(region); - if (vma) { - if (vma->vm_file) { - fput(vma->vm_file); - if (vma->vm_flags & VM_EXECUTABLE) - removed_exe_file_vma(vma->vm_mm); - } - kmem_cache_free(vm_area_cachep, vma); - } - kleave(" = %d [pr]", ret); - return ret; - error_just_free: up_write(&nommu_region_sem); error: - fput(region->vm_file); + if (region->vm_file) + fput(region->vm_file); kmem_cache_free(vm_region_jar, region); - fput(vma->vm_file); + if (vma->vm_file) + fput(vma->vm_file); if (vma->vm_flags & VM_EXECUTABLE) removed_exe_file_vma(vma->vm_mm); kmem_cache_free(vm_area_cachep, vma); diff --git a/mm/oom_kill.c b/mm/oom_kill.c index a7b2460e922b..ed452e9485d4 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -400,7 +400,7 @@ static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order, cpuset_print_task_mems_allowed(current); task_unlock(current); dump_stack(); - mem_cgroup_print_oom_info(mem, current); + mem_cgroup_print_oom_info(mem, p); show_mem(); if (sysctl_oom_dump_tasks) dump_tasks(mem); diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a0de15f46987..d04c8428c364 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1167,10 +1167,10 @@ again: } spin_lock_irqsave(&zone->lock, flags); page = __rmqueue(zone, order, migratetype); - __mod_zone_page_state(zone, NR_FREE_PAGES, -(1 << order)); spin_unlock(&zone->lock); if (!page) goto failed; + __mod_zone_page_state(zone, NR_FREE_PAGES, -(1 << order)); } __count_zone_vm_events(PGALLOC, zone, 1 << order); @@ -1715,7 +1715,7 @@ gfp_to_alloc_flags(gfp_t gfp_mask) * See also cpuset_zone_allowed() comment in kernel/cpuset.c. */ alloc_flags &= ~ALLOC_CPUSET; - } else if (unlikely(rt_task(p))) + } else if (unlikely(rt_task(p)) && !in_interrupt()) alloc_flags |= ALLOC_HARDER; if (likely(!(gfp_mask & __GFP_NOMEMALLOC))) { @@ -1763,6 +1763,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, if (NUMA_BUILD && (gfp_mask & GFP_THISNODE) == GFP_THISNODE) goto nopage; +restart: wake_all_kswapd(order, zonelist, high_zoneidx); /* @@ -1772,7 +1773,6 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, */ alloc_flags = gfp_to_alloc_flags(gfp_mask); -restart: /* This is the last chance, in general, before the goto nopage. */ page = get_page_from_freelist(gfp_mask, nodemask, order, zonelist, high_zoneidx, alloc_flags & ~ALLOC_NO_WATERMARKS, @@ -2783,7 +2783,8 @@ static void setup_zone_migrate_reserve(struct zone *zone) { unsigned long start_pfn, pfn, end_pfn; struct page *page; - unsigned long reserve, block_migratetype; + unsigned long block_migratetype; + int reserve; /* Get the start pfn, end pfn and the number of blocks to reserve */ start_pfn = zone->zone_start_pfn; @@ -2791,6 +2792,15 @@ static void setup_zone_migrate_reserve(struct zone *zone) reserve = roundup(min_wmark_pages(zone), pageblock_nr_pages) >> pageblock_order; + /* + * Reserve blocks are generally in place to help high-order atomic + * allocations that are short-lived. A min_free_kbytes value that + * would result in more than 2 reserve blocks for atomic allocations + * is assumed to be in place to help anti-fragmentation for the + * future allocation of hugepages at runtime. + */ + reserve = min(2, reserve); + for (pfn = start_pfn; pfn < end_pfn; pfn += pageblock_nr_pages) { if (!pfn_valid(pfn)) continue; diff --git a/mm/pagewalk.c b/mm/pagewalk.c index d5878bed7841..a286915e23ef 100644 --- a/mm/pagewalk.c +++ b/mm/pagewalk.c @@ -1,6 +1,7 @@ #include <linux/mm.h> #include <linux/highmem.h> #include <linux/sched.h> +#include <linux/hugetlb.h> static int walk_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, struct mm_walk *walk) @@ -107,6 +108,7 @@ int walk_page_range(unsigned long addr, unsigned long end, pgd_t *pgd; unsigned long next; int err = 0; + struct vm_area_struct *vma; if (addr >= end) return err; @@ -117,11 +119,22 @@ int walk_page_range(unsigned long addr, unsigned long end, pgd = pgd_offset(walk->mm, addr); do { next = pgd_addr_end(addr, end); + + /* skip hugetlb vma to avoid hugepage PMD being cleared + * in pmd_none_or_clear_bad(). */ + vma = find_vma(walk->mm, addr); + if (vma && is_vm_hugetlb_page(vma)) { + if (vma->vm_end < next) + next = vma->vm_end; + continue; + } + if (pgd_none_or_clear_bad(pgd)) { if (walk->pte_hole) err = walk->pte_hole(addr, next, walk); if (err) break; + pgd++; continue; } if (walk->pgd_entry) @@ -131,7 +144,8 @@ int walk_page_range(unsigned long addr, unsigned long end, err = walk_pud_range(pgd, addr, next, walk); if (err) break; - } while (pgd++, addr = next, addr != end); + pgd++; + } while (addr = next, addr != end); return err; } diff --git a/mm/shmem.c b/mm/shmem.c index fb7861108d31..d713239ce2ce 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -2668,14 +2668,6 @@ put_memory: } EXPORT_SYMBOL_GPL(shmem_file_setup); -void shmem_set_file(struct vm_area_struct *vma, struct file *file) -{ - if (vma->vm_file) - fput(vma->vm_file); - vma->vm_file = file; - vma->vm_ops = &shmem_vm_ops; -} - /** * shmem_zero_setup - setup a shared anonymous mapping * @vma: the vma to be mmapped is prepared by do_mmap_pgoff @@ -2688,8 +2680,11 @@ int shmem_zero_setup(struct vm_area_struct *vma) file = shmem_file_setup("dev/zero", size, vma->vm_flags); if (IS_ERR(file)) return PTR_ERR(file); - shmem_set_file(vma, file); + if (vma->vm_file) + fput(vma->vm_file); + vma->vm_file = file; + vma->vm_ops = &shmem_vm_ops; return 0; } diff --git a/mm/slab.c b/mm/slab.c index 7b5d4deacfcd..7dfa481c96ba 100644 --- a/mm/slab.c +++ b/mm/slab.c @@ -1384,7 +1384,7 @@ void __init kmem_cache_init(void) * Fragmentation resistance on low memory - only use bigger * page orders on machines with more than 32MB of memory. */ - if (num_physpages > (32 << 20) >> PAGE_SHIFT) + if (totalram_pages > (32 << 20) >> PAGE_SHIFT) slab_break_gfp_order = BREAK_GFP_ORDER_HI; /* Bootstrap is tricky, because several objects are allocated diff --git a/mm/swap.c b/mm/swap.c index cb29ae5d33ab..9387f17f99c5 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -496,7 +496,7 @@ EXPORT_SYMBOL(pagevec_lookup_tag); */ void __init swap_setup(void) { - unsigned long megs = num_physpages >> (20 - PAGE_SHIFT); + unsigned long megs = totalram_pages >> (20 - PAGE_SHIFT); #ifdef CONFIG_SWAP bdi_init(swapper_space.backing_dev_info); diff --git a/mm/swap_state.c b/mm/swap_state.c index 42cd38eba79f..0313a135f2a1 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c @@ -66,10 +66,10 @@ void show_swap_cache_info(void) } /* - * add_to_swap_cache resembles add_to_page_cache_locked on swapper_space, + * __add_to_swap_cache resembles add_to_page_cache_locked on swapper_space, * but sets SwapCache flag and private instead of mapping and index. */ -int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask) +static int __add_to_swap_cache(struct page *page, swp_entry_t entry) { int error; @@ -77,28 +77,37 @@ int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask) VM_BUG_ON(PageSwapCache(page)); VM_BUG_ON(!PageSwapBacked(page)); + page_cache_get(page); + SetPageSwapCache(page); + set_page_private(page, entry.val); + + spin_lock_irq(&swapper_space.tree_lock); + error = radix_tree_insert(&swapper_space.page_tree, entry.val, page); + if (likely(!error)) { + total_swapcache_pages++; + __inc_zone_page_state(page, NR_FILE_PAGES); + INC_CACHE_INFO(add_total); + } + spin_unlock_irq(&swapper_space.tree_lock); + + if (unlikely(error)) { + set_page_private(page, 0UL); + ClearPageSwapCache(page); + page_cache_release(page); + } + + return error; +} + + +int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask) +{ + int error; + error = radix_tree_preload(gfp_mask); if (!error) { - page_cache_get(page); - SetPageSwapCache(page); - set_page_private(page, entry.val); - - spin_lock_irq(&swapper_space.tree_lock); - error = radix_tree_insert(&swapper_space.page_tree, - entry.val, page); - if (likely(!error)) { - total_swapcache_pages++; - __inc_zone_page_state(page, NR_FILE_PAGES); - INC_CACHE_INFO(add_total); - } - spin_unlock_irq(&swapper_space.tree_lock); + error = __add_to_swap_cache(page, entry); radix_tree_preload_end(); - - if (unlikely(error)) { - set_page_private(page, 0UL); - ClearPageSwapCache(page); - page_cache_release(page); - } } return error; } @@ -289,13 +298,24 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, } /* + * call radix_tree_preload() while we can wait. + */ + err = radix_tree_preload(gfp_mask & GFP_KERNEL); + if (err) + break; + + /* * Swap entry may have been freed since our caller observed it. */ err = swapcache_prepare(entry); - if (err == -EEXIST) /* seems racy */ + if (err == -EEXIST) { /* seems racy */ + radix_tree_preload_end(); continue; - if (err) /* swp entry is obsolete ? */ + } + if (err) { /* swp entry is obsolete ? */ + radix_tree_preload_end(); break; + } /* * Associate the page with swap entry in the swap cache. @@ -307,8 +327,9 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, */ __set_page_locked(new_page); SetPageSwapBacked(new_page); - err = add_to_swap_cache(new_page, entry, gfp_mask & GFP_KERNEL); + err = __add_to_swap_cache(new_page, entry); if (likely(!err)) { + radix_tree_preload_end(); /* * Initiate read into locked page and return. */ @@ -316,6 +337,7 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, swap_readpage(new_page); return new_page; } + radix_tree_preload_end(); ClearPageSwapBacked(new_page); __clear_page_locked(new_page); swapcache_free(entry, NULL); diff --git a/mm/swapfile.c b/mm/swapfile.c index 8ffdc0d23c53..b47ccd77f050 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -1149,8 +1149,7 @@ static int try_to_unuse(unsigned int type) } else retval = unuse_mm(mm, entry, page); - if (set_start_mm && - swap_count(*swap_map) < swcount) { + if (set_start_mm && *swap_map < swcount) { mmput(new_start_mm); atomic_inc(&mm->mm_users); new_start_mm = mm; diff --git a/mm/vmalloc.c b/mm/vmalloc.c index f8189a4b3e13..f603667f5d02 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -546,10 +546,8 @@ static void __purge_vmap_area_lazy(unsigned long *start, unsigned long *end, } rcu_read_unlock(); - if (nr) { - BUG_ON(nr > atomic_read(&vmap_lazy_nr)); + if (nr) atomic_sub(nr, &vmap_lazy_nr); - } if (nr || force_flush) flush_tlb_kernel_range(*start, *end); @@ -1368,7 +1366,7 @@ void *vmap(struct page **pages, unsigned int count, might_sleep(); - if (count > num_physpages) + if (count > totalram_pages) return NULL; area = get_vm_area_caller((count << PAGE_SHIFT), flags, @@ -1475,7 +1473,7 @@ static void *__vmalloc_node(unsigned long size, gfp_t gfp_mask, pgprot_t prot, unsigned long real_size = size; size = PAGE_ALIGN(size); - if (!size || (size >> PAGE_SHIFT) > num_physpages) + if (!size || (size >> PAGE_SHIFT) > totalram_pages) return NULL; area = __get_vm_area_node(size, VM_ALLOC, VMALLOC_START, VMALLOC_END, diff --git a/mm/vmscan.c b/mm/vmscan.c index 94e86dd6954c..95f35a7d1f05 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1298,7 +1298,7 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, * IO, plus JVM can create lots of anon VM_EXEC pages, * so we ignore them here. */ - if ((vm_flags & VM_EXEC) && !PageAnon(page)) { + if ((vm_flags & VM_EXEC) && page_is_file_cache(page)) { list_add(&page->lru, &l_active); continue; } diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index fe649081fbdc..db09b9466354 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c @@ -287,8 +287,11 @@ out_uninit_applicant: if (ngrp) vlan_gvrp_uninit_applicant(real_dev); out_free_group: - if (ngrp) - vlan_group_free(ngrp); + if (ngrp) { + hlist_del_rcu(&ngrp->hlist); + /* Free the group, after all cpu's are done. */ + call_rcu(&ngrp->rcu, vlan_rcu_free); + } return err; } diff --git a/net/appletalk/aarp.c b/net/appletalk/aarp.c index 89f99d3beb60..9d4adfd22757 100644 --- a/net/appletalk/aarp.c +++ b/net/appletalk/aarp.c @@ -599,7 +599,7 @@ int aarp_send_ddp(struct net_device *dev, struct sk_buff *skb, /* Non ELAP we cannot do. */ if (dev->type != ARPHRD_ETHER) - return -1; + goto free_it; skb->dev = dev; skb->protocol = htons(ETH_P_ATALK); @@ -634,7 +634,7 @@ int aarp_send_ddp(struct net_device *dev, struct sk_buff *skb, if (!a) { /* Whoops slipped... good job it's an unreliable protocol 8) */ write_unlock_bh(&aarp_lock); - return -1; + goto free_it; } /* Set up the queue */ @@ -663,15 +663,21 @@ out_unlock: write_unlock_bh(&aarp_lock); /* Tell the ddp layer we have taken over for this frame. */ - return 0; + goto sent; sendit: if (skb->sk) skb->priority = skb->sk->sk_priority; - dev_queue_xmit(skb); + if (dev_queue_xmit(skb)) + goto drop; sent: - return 1; + return NET_XMIT_SUCCESS; +free_it: + kfree_skb(skb); +drop: + return NET_XMIT_DROP; } +EXPORT_SYMBOL(aarp_send_ddp); /* * An entry in the aarp unresolved queue has become resolved. Send diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index 875eda5dbad7..0e165443ab0f 100644 --- a/net/appletalk/ddp.c +++ b/net/appletalk/ddp.c @@ -1270,8 +1270,10 @@ static int handle_ip_over_ddp(struct sk_buff *skb) struct net_device_stats *stats; /* This needs to be able to handle ipddp"N" devices */ - if (!dev) - return -ENODEV; + if (!dev) { + kfree_skb(skb); + return NET_RX_DROP; + } skb->protocol = htons(ETH_P_IP); skb_pull(skb, 13); @@ -1281,8 +1283,7 @@ static int handle_ip_over_ddp(struct sk_buff *skb) stats = netdev_priv(dev); stats->rx_packets++; stats->rx_bytes += skb->len + 13; - netif_rx(skb); /* Send the SKB up to a higher place. */ - return 0; + return netif_rx(skb); /* Send the SKB up to a higher place. */ } #else /* make it easy for gcc to optimize this test out, i.e. kill the code */ @@ -1290,9 +1291,8 @@ static int handle_ip_over_ddp(struct sk_buff *skb) #define handle_ip_over_ddp(skb) 0 #endif -static void atalk_route_packet(struct sk_buff *skb, struct net_device *dev, - struct ddpehdr *ddp, __u16 len_hops, - int origlen) +static int atalk_route_packet(struct sk_buff *skb, struct net_device *dev, + struct ddpehdr *ddp, __u16 len_hops, int origlen) { struct atalk_route *rt; struct atalk_addr ta; @@ -1359,8 +1359,6 @@ static void atalk_route_packet(struct sk_buff *skb, struct net_device *dev, /* 22 bytes - 12 ether, 2 len, 3 802.2 5 snap */ struct sk_buff *nskb = skb_realloc_headroom(skb, 32); kfree_skb(skb); - if (!nskb) - goto out; skb = nskb; } else skb = skb_unshare(skb, GFP_ATOMIC); @@ -1369,12 +1367,18 @@ static void atalk_route_packet(struct sk_buff *skb, struct net_device *dev, * If the buffer didn't vanish into the lack of space bitbucket we can * send it. */ - if (skb && aarp_send_ddp(rt->dev, skb, &ta, NULL) == -1) - goto free_it; -out: - return; + if (skb == NULL) + goto drop; + + /* + * It is OK, NET_XMIT_SUCCESS == NET_RX_SUCCESS and + * NET_XMIT_DROP == NET_RX_DROP + */ + return aarp_send_ddp(rt->dev, skb, &ta, NULL); free_it: kfree_skb(skb); +drop: + return NET_RX_DROP; } /** @@ -1404,7 +1408,7 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev, /* Don't mangle buffer if shared */ if (!(skb = skb_share_check(skb, GFP_ATOMIC))) - goto out; + goto drop; /* Size check and make sure header is contiguous */ if (!pskb_may_pull(skb, sizeof(*ddp))) @@ -1448,8 +1452,7 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev, /* Not ours, so we route the packet via the correct * AppleTalk iface */ - atalk_route_packet(skb, dev, ddp, len_hops, origlen); - goto out; + return atalk_route_packet(skb, dev, ddp, len_hops, origlen); } /* if IP over DDP is not selected this code will be optimized out */ @@ -1472,11 +1475,12 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev, if (sock_queue_rcv_skb(sock, skb) < 0) goto freeit; -out: - return 0; + + return NET_RX_SUCCESS; freeit: kfree_skb(skb); - goto out; +drop: + return NET_RX_DROP; } /* @@ -1652,10 +1656,10 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr if (skb2) { loopback = 1; SOCK_DEBUG(sk, "SK %p: send out(copy).\n", sk); - if (aarp_send_ddp(dev, skb2, - &usat->sat_addr, NULL) == -1) - kfree_skb(skb2); - /* else queued/sent above in the aarp queue */ + /* + * If it fails it is queued/sent above in the aarp queue + */ + aarp_send_ddp(dev, skb2, &usat->sat_addr, NULL); } } @@ -1685,9 +1689,10 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr usat = &gsat; } - if (aarp_send_ddp(dev, skb, &usat->sat_addr, NULL) == -1) - kfree_skb(skb); - /* else queued/sent above in the aarp queue */ + /* + * If it fails it is queued/sent above in the aarp queue + */ + aarp_send_ddp(dev, skb, &usat->sat_addr, NULL); } SOCK_DEBUG(sk, "SK %p: Done write (%Zd).\n", sk, len); @@ -1865,7 +1870,6 @@ static struct packet_type ppptalk_packet_type __read_mostly = { static unsigned char ddp_snap_id[] = { 0x08, 0x00, 0x07, 0x80, 0x9B }; /* Export symbols for use by drivers when AppleTalk is a module */ -EXPORT_SYMBOL(aarp_send_ddp); EXPORT_SYMBOL(atrtr_get_dev); EXPORT_SYMBOL(atalk_find_dev_addr); diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c index da0f64f82b57..f8969febab72 100644 --- a/net/ax25/af_ax25.c +++ b/net/ax25/af_ax25.c @@ -538,7 +538,7 @@ static int ax25_setsockopt(struct socket *sock, int level, int optname, if (level != SOL_AX25) return -ENOPROTOOPT; - if (optlen < sizeof(int)) + if (optlen < (int)sizeof(int)) return -EINVAL; if (get_user(opt, (int __user *)optval)) @@ -893,7 +893,6 @@ struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev) sock_init_data(NULL, sk); - sk->sk_destruct = ax25_free_sock; sk->sk_type = osk->sk_type; sk->sk_priority = osk->sk_priority; sk->sk_protocol = osk->sk_protocol; @@ -931,6 +930,7 @@ struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev) } sk->sk_protinfo = ax25; + sk->sk_destruct = ax25_free_sock; ax25->sk = sk; return sk; @@ -1781,8 +1781,8 @@ static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) ax25_info.idletimer = ax25_display_timer(&ax25->idletimer) / (60 * HZ); ax25_info.n2count = ax25->n2count; ax25_info.state = ax25->state; - ax25_info.rcv_q = sk_wmem_alloc_get(sk); - ax25_info.snd_q = sk_rmem_alloc_get(sk); + ax25_info.rcv_q = sk_rmem_alloc_get(sk); + ax25_info.snd_q = sk_wmem_alloc_get(sk); ax25_info.vs = ax25->vs; ax25_info.vr = ax25->vr; ax25_info.va = ax25->va; diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index 6b25e6eaed19..a9750984f772 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c @@ -196,8 +196,7 @@ static void hci_conn_idle(unsigned long arg) hci_conn_enter_sniff_mode(conn); } -struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, - __u16 pkt_type, bdaddr_t *dst) +struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst) { struct hci_conn *conn; @@ -221,22 +220,14 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, conn->pkt_type = hdev->pkt_type & ACL_PTYPE_MASK; break; case SCO_LINK: - if (!pkt_type) - pkt_type = SCO_ESCO_MASK; + if (lmp_esco_capable(hdev)) + conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) | + (hdev->esco_type & EDR_ESCO_MASK); + else + conn->pkt_type = hdev->pkt_type & SCO_PTYPE_MASK; + break; case ESCO_LINK: - if (!pkt_type) - pkt_type = ALL_ESCO_MASK; - if (lmp_esco_capable(hdev)) { - /* HCI Setup Synchronous Connection Command uses - reverse logic on the EDR_ESCO_MASK bits */ - conn->pkt_type = (pkt_type ^ EDR_ESCO_MASK) & - hdev->esco_type; - } else { - /* Legacy HCI Add Sco Connection Command uses a - shifted bitmask */ - conn->pkt_type = (pkt_type << 5) & hdev->pkt_type & - SCO_PTYPE_MASK; - } + conn->pkt_type = hdev->esco_type & ~EDR_ESCO_MASK; break; } @@ -255,6 +246,8 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, if (hdev->notify) hdev->notify(hdev, HCI_NOTIFY_CONN_ADD); + atomic_set(&conn->devref, 0); + hci_conn_init_sysfs(conn); tasklet_enable(&hdev->tx_task); @@ -297,7 +290,7 @@ int hci_conn_del(struct hci_conn *conn) skb_queue_purge(&conn->data_q); - hci_conn_del_sysfs(conn); + hci_conn_put_device(conn); hci_dev_put(hdev); @@ -346,9 +339,7 @@ EXPORT_SYMBOL(hci_get_route); /* Create SCO or ACL connection. * Device _must_ be locked */ -struct hci_conn *hci_connect(struct hci_dev *hdev, int type, - __u16 pkt_type, bdaddr_t *dst, - __u8 sec_level, __u8 auth_type) +struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8 sec_level, __u8 auth_type) { struct hci_conn *acl; struct hci_conn *sco; @@ -356,7 +347,7 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, BT_DBG("%s dst %s", hdev->name, batostr(dst)); if (!(acl = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst))) { - if (!(acl = hci_conn_add(hdev, ACL_LINK, 0, dst))) + if (!(acl = hci_conn_add(hdev, ACL_LINK, dst))) return NULL; } @@ -372,7 +363,7 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, return acl; if (!(sco = hci_conn_hash_lookup_ba(hdev, type, dst))) { - if (!(sco = hci_conn_add(hdev, type, pkt_type, dst))) { + if (!(sco = hci_conn_add(hdev, type, dst))) { hci_conn_put(acl); return NULL; } @@ -594,6 +585,19 @@ void hci_conn_check_pending(struct hci_dev *hdev) hci_dev_unlock(hdev); } +void hci_conn_hold_device(struct hci_conn *conn) +{ + atomic_inc(&conn->devref); +} +EXPORT_SYMBOL(hci_conn_hold_device); + +void hci_conn_put_device(struct hci_conn *conn) +{ + if (atomic_dec_and_test(&conn->devref)) + hci_conn_del_sysfs(conn); +} +EXPORT_SYMBOL(hci_conn_put_device); + int hci_get_conn_list(void __user *arg) { struct hci_conn_list_req req, *cl; diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 39f13cc05e5c..e99fe385fba2 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -579,7 +579,7 @@ static inline void hci_cs_create_conn(struct hci_dev *hdev, __u8 status) } } else { if (!conn) { - conn = hci_conn_add(hdev, ACL_LINK, 0, &cp->bdaddr); + conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr); if (conn) { conn->out = 1; conn->link_mode |= HCI_LM_MASTER; @@ -887,6 +887,7 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s } else conn->state = BT_CONNECTED; + hci_conn_hold_device(conn); hci_conn_add_sysfs(conn); if (test_bit(HCI_AUTH, &hdev->flags)) @@ -963,9 +964,7 @@ static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *sk conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr); if (!conn) { - /* pkt_type not yet used for incoming connections */ - if (!(conn = hci_conn_add(hdev, ev->link_type, 0, - &ev->bdaddr))) { + if (!(conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr))) { BT_ERR("No memmory for new connection"); hci_dev_unlock(hdev); return; @@ -1695,6 +1694,7 @@ static inline void hci_sync_conn_complete_evt(struct hci_dev *hdev, struct sk_bu conn->handle = __le16_to_cpu(ev->handle); conn->state = BT_CONNECTED; + hci_conn_hold_device(conn); hci_conn_add_sysfs(conn); break; diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c index b18676870d55..9f1e765cc558 100644 --- a/net/bluetooth/hidp/core.c +++ b/net/bluetooth/hidp/core.c @@ -40,6 +40,7 @@ #include <linux/input.h> #include <linux/hid.h> +#include <linux/hidraw.h> #include <net/bluetooth/bluetooth.h> #include <net/bluetooth/hci_core.h> @@ -92,10 +93,14 @@ static void __hidp_link_session(struct hidp_session *session) { __module_get(THIS_MODULE); list_add(&session->list, &hidp_session_list); + + hci_conn_hold_device(session->conn); } static void __hidp_unlink_session(struct hidp_session *session) { + hci_conn_put_device(session->conn); + list_del(&session->list); module_put(THIS_MODULE); } @@ -573,7 +578,11 @@ static int hidp_session(void *arg) if (session->hid) { if (session->hid->claimed & HID_CLAIMED_INPUT) hidinput_disconnect(session->hid); + if (session->hid->claimed & HID_CLAIMED_HIDRAW) + hidraw_disconnect(session->hid); + hid_destroy_device(session->hid); + session->hid = NULL; } /* Wakeup user-space polling for socket errors */ @@ -601,25 +610,27 @@ static struct device *hidp_get_device(struct hidp_session *session) { bdaddr_t *src = &bt_sk(session->ctrl_sock->sk)->src; bdaddr_t *dst = &bt_sk(session->ctrl_sock->sk)->dst; + struct device *device = NULL; struct hci_dev *hdev; - struct hci_conn *conn; hdev = hci_get_route(dst, src); if (!hdev) return NULL; - conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst); + session->conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst); + if (session->conn) + device = &session->conn->dev; hci_dev_put(hdev); - return conn ? &conn->dev : NULL; + return device; } static int hidp_setup_input(struct hidp_session *session, struct hidp_connadd_req *req) { struct input_dev *input; - int i; + int err, i; input = input_allocate_device(); if (!input) @@ -666,7 +677,13 @@ static int hidp_setup_input(struct hidp_session *session, input->event = hidp_input_event; - return input_register_device(input); + err = input_register_device(input); + if (err < 0) { + hci_conn_put_device(session->conn); + return err; + } + + return 0; } static int hidp_open(struct hid_device *hid) @@ -748,13 +765,11 @@ static int hidp_setup_hid(struct hidp_session *session, { struct hid_device *hid; bdaddr_t src, dst; - int ret; + int err; hid = hid_allocate_device(); - if (IS_ERR(hid)) { - ret = PTR_ERR(session->hid); - goto err; - } + if (IS_ERR(hid)) + return PTR_ERR(session->hid); session->hid = hid; session->req = req; @@ -776,16 +791,17 @@ static int hidp_setup_hid(struct hidp_session *session, hid->dev.parent = hidp_get_device(session); hid->ll_driver = &hidp_hid_driver; - ret = hid_add_device(hid); - if (ret) - goto err_hid; + err = hid_add_device(hid); + if (err < 0) + goto failed; return 0; -err_hid: + +failed: hid_destroy_device(hid); session->hid = NULL; -err: - return ret; + + return err; } int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock, struct socket *intr_sock) @@ -835,13 +851,13 @@ int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock, if (req->rd_size > 0) { err = hidp_setup_hid(session, req); if (err && err != -ENODEV) - goto err_skb; + goto purge; } if (!session->hid) { err = hidp_setup_input(session, req); if (err < 0) - goto err_skb; + goto purge; } __hidp_link_session(session); @@ -869,13 +885,20 @@ unlink: __hidp_unlink_session(session); - if (session->input) + if (session->input) { input_unregister_device(session->input); - if (session->hid) + session->input = NULL; + } + + if (session->hid) { hid_destroy_device(session->hid); -err_skb: + session->hid = NULL; + } + +purge: skb_queue_purge(&session->ctrl_transmit); skb_queue_purge(&session->intr_transmit); + failed: up_write(&hidp_session_sem); diff --git a/net/bluetooth/hidp/hidp.h b/net/bluetooth/hidp/hidp.h index e503c89057ad..faf3d74c3586 100644 --- a/net/bluetooth/hidp/hidp.h +++ b/net/bluetooth/hidp/hidp.h @@ -126,6 +126,8 @@ int hidp_get_conninfo(struct hidp_conninfo *ci); struct hidp_session { struct list_head list; + struct hci_conn *conn; + struct socket *ctrl_sock; struct socket *intr_sock; diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index d780295364da..bd0a4c1bced0 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c @@ -403,8 +403,7 @@ static void l2cap_conn_start(struct l2cap_conn *conn) struct sock *parent = bt_sk(sk)->parent; rsp.result = cpu_to_le16(L2CAP_CR_PEND); rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND); - if (parent) - parent->sk_data_ready(parent, 0); + parent->sk_data_ready(parent, 0); } else { sk->sk_state = BT_CONFIG; @@ -897,7 +896,7 @@ static int l2cap_do_connect(struct sock *sk) } } - hcon = hci_connect(hdev, ACL_LINK, 0, dst, + hcon = hci_connect(hdev, ACL_LINK, dst, l2cap_pi(sk)->sec_level, auth_type); if (!hcon) goto done; diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index 4e6e1c637de9..94b3388c188b 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c @@ -448,6 +448,7 @@ static int __rfcomm_dlc_close(struct rfcomm_dlc *d, int err) break; case BT_OPEN: + case BT_CONNECT2: if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) { set_bit(RFCOMM_AUTH_REJECT, &d->flags); rfcomm_schedule(RFCOMM_SCHED_AUTH); @@ -1193,6 +1194,8 @@ void rfcomm_dlc_accept(struct rfcomm_dlc *d) rfcomm_send_ua(d->session, d->dlci); + rfcomm_dlc_clear_timer(d); + rfcomm_dlc_lock(d); d->state = BT_CONNECTED; d->state_change(d, 0); @@ -1210,6 +1213,11 @@ static void rfcomm_check_accept(struct rfcomm_dlc *d) if (d->defer_setup) { set_bit(RFCOMM_DEFER_SETUP, &d->flags); rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT); + + rfcomm_dlc_lock(d); + d->state = BT_CONNECT2; + d->state_change(d, 0); + rfcomm_dlc_unlock(d); } else rfcomm_dlc_accept(d); } else { @@ -1751,6 +1759,11 @@ static inline void rfcomm_process_dlcs(struct rfcomm_session *s) if (d->defer_setup) { set_bit(RFCOMM_DEFER_SETUP, &d->flags); rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT); + + rfcomm_dlc_lock(d); + d->state = BT_CONNECT2; + d->state_change(d, 0); + rfcomm_dlc_unlock(d); } else rfcomm_dlc_accept(d); } diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index 98d9d07ddbff..51ae0c3e470a 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c @@ -176,7 +176,6 @@ static int sco_connect(struct sock *sk) { bdaddr_t *src = &bt_sk(sk)->src; bdaddr_t *dst = &bt_sk(sk)->dst; - __u16 pkt_type = sco_pi(sk)->pkt_type; struct sco_conn *conn; struct hci_conn *hcon; struct hci_dev *hdev; @@ -193,13 +192,10 @@ static int sco_connect(struct sock *sk) if (lmp_esco_capable(hdev) && !disable_esco) type = ESCO_LINK; - else { + else type = SCO_LINK; - pkt_type &= SCO_ESCO_MASK; - } - hcon = hci_connect(hdev, type, pkt_type, dst, - BT_SECURITY_LOW, HCI_AT_NO_BONDING); + hcon = hci_connect(hdev, type, dst, BT_SECURITY_LOW, HCI_AT_NO_BONDING); if (!hcon) goto done; @@ -460,22 +456,18 @@ static int sco_sock_create(struct net *net, struct socket *sock, int protocol) return 0; } -static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int alen) +static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len) { - struct sockaddr_sco sa; + struct sockaddr_sco *sa = (struct sockaddr_sco *) addr; struct sock *sk = sock->sk; - bdaddr_t *src = &sa.sco_bdaddr; - int len, err = 0; + bdaddr_t *src = &sa->sco_bdaddr; + int err = 0; - BT_DBG("sk %p %s", sk, batostr(&sa.sco_bdaddr)); + BT_DBG("sk %p %s", sk, batostr(&sa->sco_bdaddr)); if (!addr || addr->sa_family != AF_BLUETOOTH) return -EINVAL; - memset(&sa, 0, sizeof(sa)); - len = min_t(unsigned int, sizeof(sa), alen); - memcpy(&sa, addr, len); - lock_sock(sk); if (sk->sk_state != BT_OPEN) { @@ -489,8 +481,7 @@ static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int alen) err = -EADDRINUSE; } else { /* Save source address */ - bacpy(&bt_sk(sk)->src, &sa.sco_bdaddr); - sco_pi(sk)->pkt_type = sa.sco_pkt_type; + bacpy(&bt_sk(sk)->src, &sa->sco_bdaddr); sk->sk_state = BT_BOUND; } @@ -503,34 +494,26 @@ done: static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags) { + struct sockaddr_sco *sa = (struct sockaddr_sco *) addr; struct sock *sk = sock->sk; - struct sockaddr_sco sa; - int len, err = 0; + int err = 0; + BT_DBG("sk %p", sk); - if (!addr || addr->sa_family != AF_BLUETOOTH) + if (addr->sa_family != AF_BLUETOOTH || alen < sizeof(struct sockaddr_sco)) return -EINVAL; - memset(&sa, 0, sizeof(sa)); - len = min_t(unsigned int, sizeof(sa), alen); - memcpy(&sa, addr, len); - - lock_sock(sk); + if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) + return -EBADFD; - if (sk->sk_type != SOCK_SEQPACKET) { - err = -EINVAL; - goto done; - } + if (sk->sk_type != SOCK_SEQPACKET) + return -EINVAL; - if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) { - err = -EBADFD; - goto done; - } + lock_sock(sk); /* Set destination address and psm */ - bacpy(&bt_sk(sk)->dst, &sa.sco_bdaddr); - sco_pi(sk)->pkt_type = sa.sco_pkt_type; + bacpy(&bt_sk(sk)->dst, &sa->sco_bdaddr); if ((err = sco_connect(sk))) goto done; @@ -636,7 +619,6 @@ static int sco_sock_getname(struct socket *sock, struct sockaddr *addr, int *len bacpy(&sa->sco_bdaddr, &bt_sk(sk)->dst); else bacpy(&sa->sco_bdaddr, &bt_sk(sk)->src); - sa->sco_pkt_type = sco_pi(sk)->pkt_type; return 0; } diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index d22f611e4004..991fe40bb288 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c @@ -359,7 +359,7 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb) }, .proto = 0, }; - struct in_device *in_dev = in_dev_get(dev); + struct in_device *in_dev = __in_dev_get_rcu(dev); /* If err equals -EHOSTUNREACH the error is due to a * martian destination or due to the fact that diff --git a/net/bridge/netfilter/ebt_ulog.c b/net/bridge/netfilter/ebt_ulog.c index 133eeae45a4f..ce50688a6431 100644 --- a/net/bridge/netfilter/ebt_ulog.c +++ b/net/bridge/netfilter/ebt_ulog.c @@ -266,7 +266,7 @@ static bool ebt_ulog_tg_check(const struct xt_tgchk_param *par) if (uloginfo->qthreshold > EBT_ULOG_MAX_QLEN) uloginfo->qthreshold = EBT_ULOG_MAX_QLEN; - return 0; + return true; } static struct xt_target ebt_ulog_tg_reg __read_mostly = { diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c index 37928d5f2840..4877d57205de 100644 --- a/net/bridge/netfilter/ebtables.c +++ b/net/bridge/netfilter/ebtables.c @@ -1405,6 +1405,9 @@ static int do_ebt_set_ctl(struct sock *sk, { int ret; + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + switch(cmd) { case EBT_SO_SET_ENTRIES: ret = do_replace(sock_net(sk), user, len); @@ -1424,6 +1427,9 @@ static int do_ebt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) struct ebt_replace tmp; struct ebt_table *t; + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + if (copy_from_user(&tmp, user, sizeof(tmp))) return -EFAULT; diff --git a/net/can/af_can.c b/net/can/af_can.c index e733725b11d4..264c96883db0 100644 --- a/net/can/af_can.c +++ b/net/can/af_can.c @@ -199,6 +199,8 @@ static int can_create(struct net *net, struct socket *sock, int protocol) * @skb: pointer to socket buffer with CAN frame in data section * @loop: loopback for listeners on local CAN sockets (recommended default!) * + * Due to the loopback this routine must not be called from hardirq context. + * * Return: * 0 on success * -ENETDOWN when the selected interface is down @@ -278,7 +280,7 @@ int can_send(struct sk_buff *skb, int loop) } if (newskb) - netif_rx(newskb); + netif_rx_ni(newskb); /* update statistics */ can_stats.tx_frames++; diff --git a/net/core/datagram.c b/net/core/datagram.c index b0fe69211eef..caeb2852c3c8 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c @@ -223,6 +223,15 @@ void skb_free_datagram(struct sock *sk, struct sk_buff *skb) consume_skb(skb); sk_mem_reclaim_partial(sk); } +EXPORT_SYMBOL(skb_free_datagram); + +void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb) +{ + lock_sock(sk); + skb_free_datagram(sk, skb); + release_sock(sk); +} +EXPORT_SYMBOL(skb_free_datagram_locked); /** * skb_kill_datagram - Free a datagram skbuff forcibly @@ -749,5 +758,4 @@ unsigned int datagram_poll(struct file *file, struct socket *sock, EXPORT_SYMBOL(datagram_poll); EXPORT_SYMBOL(skb_copy_and_csum_datagram_iovec); EXPORT_SYMBOL(skb_copy_datagram_iovec); -EXPORT_SYMBOL(skb_free_datagram); EXPORT_SYMBOL(skb_recv_datagram); diff --git a/net/core/dev.c b/net/core/dev.c index ec28414f3564..908efef1a7eb 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -933,14 +933,15 @@ rollback: ret = notifier_to_errno(ret); if (ret) { - if (err) { - printk(KERN_ERR - "%s: name change rollback failed: %d.\n", - dev->name, ret); - } else { + /* err >= 0 after dev_alloc_name() or stores the first errno */ + if (err >= 0) { err = ret; memcpy(dev->name, oldname, IFNAMSIZ); goto rollback; + } else { + printk(KERN_ERR + "%s: name change rollback failed: %d.\n", + dev->name, ret); } } @@ -2248,6 +2249,9 @@ int netif_receive_skb(struct sk_buff *skb) int ret = NET_RX_DROP; __be16 type; + if (!skb->tstamp.tv64) + net_timestamp(skb); + if (skb->vlan_tci && vlan_hwaccel_do_receive(skb)) return NET_RX_SUCCESS; @@ -2255,9 +2259,6 @@ int netif_receive_skb(struct sk_buff *skb) if (netpoll_receive_skb(skb)) return NET_RX_DROP; - if (!skb->tstamp.tv64) - net_timestamp(skb); - if (!skb->iif) skb->iif = skb->dev->ifindex; @@ -4817,6 +4818,11 @@ int register_netdevice(struct net_device *dev) rollback_registered(dev); dev->reg_state = NETREG_UNREGISTERED; } + /* + * Prevent userspace races by waiting until the network + * device is fully setup before sending notifications. + */ + rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U); out: return ret; @@ -5352,6 +5358,12 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char /* Notify protocols, that a new device appeared. */ call_netdevice_notifiers(NETDEV_REGISTER, dev); + /* + * Prevent userspace races by waiting until the network + * device is fully setup before sending notifications. + */ + rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U); + synchronize_net(); err = 0; out: diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index d78030f88bd0..93f18454ef1d 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -1347,13 +1347,11 @@ static int rtnetlink_event(struct notifier_block *this, unsigned long event, voi case NETDEV_UNREGISTER: rtmsg_ifinfo(RTM_DELLINK, dev, ~0U); break; - case NETDEV_REGISTER: - rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U); - break; case NETDEV_UP: case NETDEV_DOWN: rtmsg_ifinfo(RTM_NEWLINK, dev, IFF_UP|IFF_RUNNING); break; + case NETDEV_REGISTER: case NETDEV_CHANGE: case NETDEV_GOING_DOWN: break; diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 9e0597d189b0..79ae8954da3d 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -2704,7 +2704,8 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb) NAPI_GRO_CB(skb)->free = 1; goto done; - } + } else if (skb_gro_len(p) != pinfo->gso_size) + return -E2BIG; headroom = skb_headroom(p); nskb = netdev_alloc_skb(p->dev, headroom + skb_gro_offset(p)); diff --git a/net/core/sock.c b/net/core/sock.c index 76334228ed1c..a8c9b14f07ed 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -1196,12 +1196,12 @@ EXPORT_SYMBOL_GPL(sk_setup_caps); void __init sk_init(void) { - if (num_physpages <= 4096) { + if (totalram_pages <= 4096) { sysctl_wmem_max = 32767; sysctl_rmem_max = 32767; sysctl_wmem_default = 32767; sysctl_rmem_default = 32767; - } else if (num_physpages >= 131072) { + } else if (totalram_pages >= 131072) { sysctl_wmem_max = 131071; sysctl_rmem_max = 131071; } @@ -1218,17 +1218,22 @@ void __init sk_init(void) void sock_wfree(struct sk_buff *skb) { struct sock *sk = skb->sk; - int res; + unsigned int len = skb->truesize; - /* In case it might be waiting for more memory. */ - res = atomic_sub_return(skb->truesize, &sk->sk_wmem_alloc); - if (!sock_flag(sk, SOCK_USE_WRITE_QUEUE)) + if (!sock_flag(sk, SOCK_USE_WRITE_QUEUE)) { + /* + * Keep a reference on sk_wmem_alloc, this will be released + * after sk_write_space() call + */ + atomic_sub(len - 1, &sk->sk_wmem_alloc); sk->sk_write_space(sk); + len = 1; + } /* - * if sk_wmem_alloc reached 0, we are last user and should - * free this sock, as sk_free() call could not do it. + * if sk_wmem_alloc reaches 0, we must finish what sk_free() + * could not do because of in-flight packets */ - if (res == 0) + if (atomic_sub_and_test(len, &sk->sk_wmem_alloc)) __sk_free(sk); } EXPORT_SYMBOL(sock_wfree); diff --git a/net/dccp/proto.c b/net/dccp/proto.c index 1bca9205104e..d9c44d82e86e 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c @@ -1049,10 +1049,10 @@ static int __init dccp_init(void) * * The methodology is similar to that of the buffer cache. */ - if (num_physpages >= (128 * 1024)) - goal = num_physpages >> (21 - PAGE_SHIFT); + if (totalram_pages >= (128 * 1024)) + goal = totalram_pages >> (21 - PAGE_SHIFT); else - goal = num_physpages >> (23 - PAGE_SHIFT); + goal = totalram_pages >> (23 - PAGE_SHIFT); if (thash_entries) goal = (thash_entries * diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 1d6ca8a98dc6..44d0d3bd2914 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c @@ -1750,7 +1750,7 @@ void __init dn_route_init(void) dn_route_timer.expires = jiffies + decnet_dst_gc_interval * HZ; add_timer(&dn_route_timer); - goal = num_physpages >> (26 - PAGE_SHIFT); + goal = totalram_pages >> (26 - PAGE_SHIFT); for(order = 0; (1UL << order) < goal; order++) /* NOTHING */; diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 3b478b320ad5..566ea6c4321d 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -257,7 +257,6 @@ static inline int inet_netns_ok(struct net *net, int protocol) return ipprot->netns_ok; } - /* * Create an inet socket. */ @@ -826,7 +825,6 @@ int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) case SIOCSIFPFLAGS: case SIOCGIFPFLAGS: case SIOCSIFFLAGS: - case SIOCKILLADDR: err = devinet_ioctl(net, cmd, (void __user *)arg); break; default: diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 11b2ea9d2a56..3863c3a4223f 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c @@ -57,7 +57,6 @@ #include <net/arp.h> #include <net/ip.h> -#include <net/tcp.h> #include <net/route.h> #include <net/ip_fib.h> #include <net/rtnetlink.h> @@ -632,7 +631,6 @@ int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg) case SIOCSIFBRDADDR: /* Set the broadcast address */ case SIOCSIFDSTADDR: /* Set the destination address */ case SIOCSIFNETMASK: /* Set the netmask for the interface */ - case SIOCKILLADDR: /* Nuke all sockets on this address */ ret = -EACCES; if (!capable(CAP_NET_ADMIN)) goto out; @@ -682,8 +680,7 @@ int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg) } ret = -EADDRNOTAVAIL; - if (!ifa && cmd != SIOCSIFADDR && cmd != SIOCSIFFLAGS - && cmd != SIOCKILLADDR) + if (!ifa && cmd != SIOCSIFADDR && cmd != SIOCSIFFLAGS) goto done; switch (cmd) { @@ -807,10 +804,6 @@ int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg) inet_insert_ifa(ifa); } break; - case SIOCKILLADDR: /* Nuke all connections on this address */ - ret = 0; - tcp_v4_nuke_addr(sin->sin_addr.s_addr); - break; } done: rtnl_unlock(); diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c index 575f9bd51ccd..d3fe10be7219 100644 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c @@ -563,7 +563,7 @@ out_oversize: printk(KERN_INFO "Oversized IP packet from %pI4.\n", &qp->saddr); out_fail: - IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_REASMFAILS); + IP_INC_STATS_BH(net, IPSTATS_MIB_REASMFAILS); return err; } diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 7ffcd96fe591..4d64a801bd3e 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c @@ -500,8 +500,8 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) if (skb->sk) { frag->sk = skb->sk; frag->destructor = sock_wfree; - truesizes += frag->truesize; } + truesizes += frag->truesize; } /* Everything is OK. Generate! */ diff --git a/net/ipv4/netfilter/nf_nat_core.c b/net/ipv4/netfilter/nf_nat_core.c index 3229e0a81ba6..d396abf20b6f 100644 --- a/net/ipv4/netfilter/nf_nat_core.c +++ b/net/ipv4/netfilter/nf_nat_core.c @@ -212,7 +212,7 @@ find_best_ips_proto(struct nf_conntrack_tuple *tuple, maxip = ntohl(range->max_ip); j = jhash_2words((__force u32)tuple->src.u3.ip, range->flags & IP_NAT_RANGE_PERSISTENT ? - (__force u32)tuple->dst.u3.ip : 0, 0); + 0 : (__force u32)tuple->dst.u3.ip, 0); j = ((u64)j * (maxip - minip + 1)) >> 32; *var_ipp = htonl(minip + j); } @@ -750,6 +750,8 @@ static int __init nf_nat_init(void) BUG_ON(nfnetlink_parse_nat_setup_hook != NULL); rcu_assign_pointer(nfnetlink_parse_nat_setup_hook, nfnetlink_parse_nat_setup); + BUG_ON(nf_ct_nat_offset != NULL); + rcu_assign_pointer(nf_ct_nat_offset, nf_nat_get_offset); return 0; cleanup_extend: @@ -764,6 +766,7 @@ static void __exit nf_nat_cleanup(void) nf_ct_extend_unregister(&nat_extend); rcu_assign_pointer(nf_nat_seq_adjust_hook, NULL); rcu_assign_pointer(nfnetlink_parse_nat_setup_hook, NULL); + rcu_assign_pointer(nf_ct_nat_offset, NULL); synchronize_net(); } diff --git a/net/ipv4/netfilter/nf_nat_helper.c b/net/ipv4/netfilter/nf_nat_helper.c index 09172a65d9b6..f9520fa3aba9 100644 --- a/net/ipv4/netfilter/nf_nat_helper.c +++ b/net/ipv4/netfilter/nf_nat_helper.c @@ -73,6 +73,28 @@ adjust_tcp_sequence(u32 seq, DUMP_OFFSET(this_way); } +/* Get the offset value, for conntrack */ +s16 nf_nat_get_offset(const struct nf_conn *ct, + enum ip_conntrack_dir dir, + u32 seq) +{ + struct nf_conn_nat *nat = nfct_nat(ct); + struct nf_nat_seq *this_way; + s16 offset; + + if (!nat) + return 0; + + this_way = &nat->seq[dir]; + spin_lock_bh(&nf_nat_seqofs_lock); + offset = after(seq, this_way->correction_pos) + ? this_way->offset_after : this_way->offset_before; + spin_unlock_bh(&nf_nat_seqofs_lock); + + return offset; +} +EXPORT_SYMBOL_GPL(nf_nat_get_offset); + /* Frobs data inside this packet, which is linear. */ static void mangle_contents(struct sk_buff *skb, unsigned int dataoff, @@ -189,11 +211,6 @@ nf_nat_mangle_tcp_packet(struct sk_buff *skb, adjust_tcp_sequence(ntohl(tcph->seq), (int)rep_len - (int)match_len, ct, ctinfo); - /* Tell TCP window tracking about seq change */ - nf_conntrack_tcp_update(skb, ip_hdrlen(skb), - ct, CTINFO2DIR(ctinfo), - (int)rep_len - (int)match_len); - nf_conntrack_event_cache(IPCT_NATSEQADJ, ct); } return 1; @@ -415,12 +432,7 @@ nf_nat_seq_adjust(struct sk_buff *skb, tcph->seq = newseq; tcph->ack_seq = newack; - if (!nf_nat_sack_adjust(skb, tcph, ct, ctinfo)) - return 0; - - nf_conntrack_tcp_update(skb, ip_hdrlen(skb), ct, dir, seqoff); - - return 1; + return nf_nat_sack_adjust(skb, tcph, ct, ctinfo); } /* Setup NAT on this expected conntrack so it follows master. */ diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 278f46f5011b..62ccdf12f5f0 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -3412,7 +3412,7 @@ int __init ip_rt_init(void) alloc_large_system_hash("IP route cache", sizeof(struct rt_hash_bucket), rhash_entries, - (num_physpages >= 128 * 1024) ? + (totalram_pages >= 128 * 1024) ? 15 : 17, 0, &rt_hash_log, diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 91145244ea63..33ed849d3715 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -2862,7 +2862,7 @@ void __init tcp_init(void) alloc_large_system_hash("TCP established", sizeof(struct inet_ehash_bucket), thash_entries, - (num_physpages >= 128 * 1024) ? + (totalram_pages >= 128 * 1024) ? 13 : 15, 0, &tcp_hashinfo.ehash_size, @@ -2879,7 +2879,7 @@ void __init tcp_init(void) alloc_large_system_hash("TCP bind", sizeof(struct inet_bind_hashbucket), tcp_hashinfo.ehash_size, - (num_physpages >= 128 * 1024) ? + (totalram_pages >= 128 * 1024) ? 13 : 15, 0, &tcp_hashinfo.bhash_size, diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 770fd759a6e9..6d88219c5e22 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -1846,49 +1846,6 @@ void tcp_v4_destroy_sock(struct sock *sk) EXPORT_SYMBOL(tcp_v4_destroy_sock); -/* - * tcp_v4_nuke_addr - destroy all sockets on the given local address - */ -void tcp_v4_nuke_addr(__u32 saddr) -{ - unsigned int bucket; - - for (bucket = 0; bucket < tcp_hashinfo.ehash_size; bucket++) { - struct hlist_nulls_node *node; - struct sock *sk; - spinlock_t *lock = inet_ehash_lockp(&tcp_hashinfo, bucket); - -restart: - spin_lock_bh(lock); - sk_nulls_for_each(sk, node, &tcp_hashinfo.ehash[bucket].chain) { - struct inet_sock *inet = inet_sk(sk); - - if (inet->rcv_saddr != saddr) - continue; - if (sysctl_ip_dynaddr && sk->sk_state == TCP_SYN_SENT) - continue; - if (sock_flag(sk, SOCK_DEAD)) - continue; - - sock_hold(sk); - spin_unlock_bh(lock); - - local_bh_disable(); - bh_lock_sock(sk); - sk->sk_err = ETIMEDOUT; - sk->sk_error_report(sk); - - tcp_done(sk); - bh_unlock_sock(sk); - local_bh_enable(); - sock_put(sk); - - goto restart; - } - spin_unlock_bh(lock); - } -} - #ifdef CONFIG_PROC_FS /* Proc filesystem TCP sock list dumping. */ @@ -2498,3 +2455,4 @@ EXPORT_SYMBOL(tcp_proc_register); EXPORT_SYMBOL(tcp_proc_unregister); #endif EXPORT_SYMBOL(sysctl_tcp_low_latency); + diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index f8d67ccc64f3..96440e581c15 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c @@ -363,7 +363,7 @@ void tcp_twsk_destructor(struct sock *sk) #ifdef CONFIG_TCP_MD5SIG struct tcp_timewait_sock *twsk = tcp_twsk(sk); if (twsk->tw_md5_keylen) - tcp_put_md5sig_pool(); + tcp_free_md5sig_pool(); #endif } diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 80e3812837ad..00d1f6d82d26 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -831,6 +831,42 @@ out: return ret; } + +/** + * first_packet_length - return length of first packet in receive queue + * @sk: socket + * + * Drops all bad checksum frames, until a valid one is found. + * Returns the length of found skb, or 0 if none is found. + */ +static unsigned int first_packet_length(struct sock *sk) +{ + struct sk_buff_head list_kill, *rcvq = &sk->sk_receive_queue; + struct sk_buff *skb; + unsigned int res; + + __skb_queue_head_init(&list_kill); + + spin_lock_bh(&rcvq->lock); + while ((skb = skb_peek(rcvq)) != NULL && + udp_lib_checksum_complete(skb)) { + UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, + IS_UDPLITE(sk)); + __skb_unlink(skb, rcvq); + __skb_queue_tail(&list_kill, skb); + } + res = skb ? skb->len : 0; + spin_unlock_bh(&rcvq->lock); + + if (!skb_queue_empty(&list_kill)) { + lock_sock(sk); + __skb_queue_purge(&list_kill); + sk_mem_reclaim_partial(sk); + release_sock(sk); + } + return res; +} + /* * IOCTL requests applicable to the UDP protocol */ @@ -847,21 +883,16 @@ int udp_ioctl(struct sock *sk, int cmd, unsigned long arg) case SIOCINQ: { - struct sk_buff *skb; - unsigned long amount; + unsigned int amount = first_packet_length(sk); - amount = 0; - spin_lock_bh(&sk->sk_receive_queue.lock); - skb = skb_peek(&sk->sk_receive_queue); - if (skb != NULL) { + if (amount) /* * We will only return the amount * of this packet since that is all * that will be read. */ - amount = skb->len - sizeof(struct udphdr); - } - spin_unlock_bh(&sk->sk_receive_queue.lock); + amount -= sizeof(struct udphdr); + return put_user(amount, (int __user *)arg); } @@ -956,9 +987,7 @@ try_again: err = ulen; out_free: - lock_sock(sk); - skb_free_datagram(sk, skb); - release_sock(sk); + skb_free_datagram_locked(sk, skb); out: return err; @@ -1525,32 +1554,13 @@ unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait) { unsigned int mask = datagram_poll(file, sock, wait); struct sock *sk = sock->sk; - int is_lite = IS_UDPLITE(sk); /* Check for false positives due to checksum errors */ - if ( (mask & POLLRDNORM) && - !(file->f_flags & O_NONBLOCK) && - !(sk->sk_shutdown & RCV_SHUTDOWN)){ - struct sk_buff_head *rcvq = &sk->sk_receive_queue; - struct sk_buff *skb; - - spin_lock_bh(&rcvq->lock); - while ((skb = skb_peek(rcvq)) != NULL && - udp_lib_checksum_complete(skb)) { - UDP_INC_STATS_BH(sock_net(sk), - UDP_MIB_INERRORS, is_lite); - __skb_unlink(skb, rcvq); - kfree_skb(skb); - } - spin_unlock_bh(&rcvq->lock); - - /* nothing to see, move along */ - if (skb == NULL) - mask &= ~(POLLIN | POLLRDNORM); - } + if ((mask & POLLRDNORM) && !(file->f_flags & O_NONBLOCK) && + !(sk->sk_shutdown & RCV_SHUTDOWN) && !first_packet_length(sk)) + mask &= ~(POLLIN | POLLRDNORM); return mask; - } struct proto udp_prot = { diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c index 4aae658e5501..b15ba057ff35 100644 --- a/net/ipv6/exthdrs.c +++ b/net/ipv6/exthdrs.c @@ -559,6 +559,11 @@ static inline struct inet6_dev *ipv6_skb_idev(struct sk_buff *skb) return skb_dst(skb) ? ip6_dst_idev(skb_dst(skb)) : __in6_dev_get(skb->dev); } +static inline struct net *ipv6_skb_net(struct sk_buff *skb) +{ + return skb_dst(skb) ? dev_net(skb_dst(skb)->dev) : dev_net(skb->dev); +} + /* Router Alert as of RFC 2711 */ static int ipv6_hop_ra(struct sk_buff *skb, int optoff) @@ -580,8 +585,8 @@ static int ipv6_hop_ra(struct sk_buff *skb, int optoff) static int ipv6_hop_jumbo(struct sk_buff *skb, int optoff) { const unsigned char *nh = skb_network_header(skb); + struct net *net = ipv6_skb_net(skb); u32 pkt_len; - struct net *net = dev_net(skb_dst(skb)->dev); if (nh[optoff + 1] != 4 || (optoff & 3) != 2) { LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_jumbo: wrong jumbo opt length/alignment %d\n", diff --git a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c index 2a15c2d66c69..5cdf423d68bc 100644 --- a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c +++ b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c @@ -183,6 +183,16 @@ out: return nf_conntrack_confirm(skb); } +static enum ip6_defrag_users nf_ct6_defrag_user(unsigned int hooknum, + struct sk_buff *skb) +{ + if (hooknum == NF_INET_PRE_ROUTING) + return IP6_DEFRAG_CONNTRACK_IN; + else + return IP6_DEFRAG_CONNTRACK_OUT; + +} + static unsigned int ipv6_defrag(unsigned int hooknum, struct sk_buff *skb, const struct net_device *in, @@ -195,8 +205,7 @@ static unsigned int ipv6_defrag(unsigned int hooknum, if (skb->nfct) return NF_ACCEPT; - reasm = nf_ct_frag6_gather(skb); - + reasm = nf_ct_frag6_gather(skb, nf_ct6_defrag_user(hooknum, skb)); /* queued */ if (reasm == NULL) return NF_STOLEN; diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index f3aba255ad9f..4b6a539cb87a 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c @@ -170,13 +170,14 @@ out: /* Creation primitives. */ static __inline__ struct nf_ct_frag6_queue * -fq_find(__be32 id, struct in6_addr *src, struct in6_addr *dst) +fq_find(__be32 id, u32 user, struct in6_addr *src, struct in6_addr *dst) { struct inet_frag_queue *q; struct ip6_create_arg arg; unsigned int hash; arg.id = id; + arg.user = user; arg.src = src; arg.dst = dst; @@ -561,7 +562,7 @@ find_prev_fhdr(struct sk_buff *skb, u8 *prevhdrp, int *prevhoff, int *fhoff) return 0; } -struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb) +struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb, u32 user) { struct sk_buff *clone; struct net_device *dev = skb->dev; @@ -607,7 +608,7 @@ struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb) if (atomic_read(&nf_init_frags.mem) > nf_init_frags.high_thresh) nf_ct_frag6_evictor(); - fq = fq_find(fhdr->identification, &hdr->saddr, &hdr->daddr); + fq = fq_find(fhdr->identification, user, &hdr->saddr, &hdr->daddr); if (fq == NULL) { pr_debug("Can't find and can't create new queue\n"); goto ret_orig; diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index 2642a41a8535..6a36f134d19b 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c @@ -72,6 +72,7 @@ struct frag_queue struct inet_frag_queue q; __be32 id; /* fragment id */ + u32 user; struct in6_addr saddr; struct in6_addr daddr; @@ -141,7 +142,7 @@ int ip6_frag_match(struct inet_frag_queue *q, void *a) struct ip6_create_arg *arg = a; fq = container_of(q, struct frag_queue, q); - return (fq->id == arg->id && + return (fq->id == arg->id && fq->user == arg->user && ipv6_addr_equal(&fq->saddr, arg->src) && ipv6_addr_equal(&fq->daddr, arg->dst)); } @@ -163,6 +164,7 @@ void ip6_frag_init(struct inet_frag_queue *q, void *a) struct ip6_create_arg *arg = a; fq->id = arg->id; + fq->user = arg->user; ipv6_addr_copy(&fq->saddr, arg->src); ipv6_addr_copy(&fq->daddr, arg->dst); } @@ -244,6 +246,7 @@ fq_find(struct net *net, __be32 id, struct in6_addr *src, struct in6_addr *dst, unsigned int hash; arg.id = id; + arg.user = IP6_DEFRAG_LOCAL_DELIVER; arg.src = src; arg.dst = dst; diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 98b7327d0949..2e41849ab1a1 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c @@ -313,7 +313,7 @@ static int ipip6_tunnel_get_prl(struct ip_tunnel *t, c = 0; for (prl = t->prl; prl; prl = prl->next) { - if (c > cmax) + if (c >= cmax) break; if (kprl.addr != htonl(INADDR_ANY) && prl->addr != kprl.addr) continue; diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 33b59bd92c4d..333a6ec38bf3 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -288,9 +288,7 @@ try_again: err = ulen; out_free: - lock_sock(sk); - skb_free_datagram(sk, skb); - release_sock(sk); + skb_free_datagram_locked(sk, skb); out: return err; diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c index bc064d7933ff..ce8e0e772bab 100644 --- a/net/mac80211/agg-rx.c +++ b/net/mac80211/agg-rx.c @@ -85,10 +85,6 @@ void ieee80211_sta_stop_rx_ba_session(struct ieee80211_sub_if_data *sdata, u8 *r struct ieee80211_local *local = sdata->local; struct sta_info *sta; - /* stop HW Rx aggregation. ampdu_action existence - * already verified in session init so we add the BUG_ON */ - BUG_ON(!local->ops->ampdu_action); - rcu_read_lock(); sta = sta_info_get(local, ra); diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c index a24e59816b93..b9005e1be8c3 100644 --- a/net/mac80211/agg-tx.c +++ b/net/mac80211/agg-tx.c @@ -123,13 +123,18 @@ void ieee80211_send_bar(struct ieee80211_sub_if_data *sdata, u8 *ra, u16 tid, u1 ieee80211_tx_skb(sdata, skb, 0); } -static int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, - enum ieee80211_back_parties initiator) +int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, + enum ieee80211_back_parties initiator) { struct ieee80211_local *local = sta->local; int ret; u8 *state; +#ifdef CONFIG_MAC80211_HT_DEBUG + printk(KERN_DEBUG "Tx BA session stop requested for %pM tid %u\n", + sta->sta.addr, tid); +#endif /* CONFIG_MAC80211_HT_DEBUG */ + state = &sta->ampdu_mlme.tid_state_tx[tid]; if (*state == HT_AGG_STATE_OPERATIONAL) @@ -143,7 +148,6 @@ static int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, /* HW shall not deny going back to legacy */ if (WARN_ON(ret)) { - *state = HT_AGG_STATE_OPERATIONAL; /* * We may have pending packets get stuck in this case... * Not bothering with a workaround for now. @@ -526,11 +530,6 @@ int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, goto unlock; } -#ifdef CONFIG_MAC80211_HT_DEBUG - printk(KERN_DEBUG "Tx BA session stop requested for %pM tid %u\n", - sta->sta.addr, tid); -#endif /* CONFIG_MAC80211_HT_DEBUG */ - ret = ___ieee80211_stop_tx_ba_session(sta, tid, initiator); unlock: @@ -546,7 +545,7 @@ int ieee80211_stop_tx_ba_session(struct ieee80211_hw *hw, struct sta_info *sta; int ret = 0; - if (WARN_ON(!local->ops->ampdu_action)) + if (!local->ops->ampdu_action) return -EINVAL; if (tid >= STA_TID_NUM) diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 3f47276caeb8..88b06485a780 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -87,6 +87,9 @@ static int ieee80211_change_iface(struct wiphy *wiphy, int ifindex, if (!dev) return -ENODEV; + if (netif_running(dev)) + return -EBUSY; + if (!nl80211_type_check(type)) return -EINVAL; @@ -96,9 +99,6 @@ static int ieee80211_change_iface(struct wiphy *wiphy, int ifindex, if (ret) return ret; - if (netif_running(sdata->dev)) - return -EBUSY; - if (ieee80211_vif_is_mesh(&sdata->vif) && params->mesh_id_len) ieee80211_sdata_set_mesh_id(sdata, params->mesh_id_len, diff --git a/net/mac80211/ht.c b/net/mac80211/ht.c index 0891bfb06996..a6b8eb418ef7 100644 --- a/net/mac80211/ht.c +++ b/net/mac80211/ht.c @@ -141,7 +141,6 @@ void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata, struct sta_info *sta, struct ieee80211_mgmt *mgmt, size_t len) { - struct ieee80211_local *local = sdata->local; u16 tid, params; u16 initiator; @@ -161,10 +160,9 @@ void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata, WLAN_BACK_INITIATOR, 0); else { /* WLAN_BACK_RECIPIENT */ spin_lock_bh(&sta->lock); - sta->ampdu_mlme.tid_state_tx[tid] = - HT_AGG_STATE_OPERATIONAL; + if (sta->ampdu_mlme.tid_state_tx[tid] & HT_ADDBA_REQUESTED_MSK) + ___ieee80211_stop_tx_ba_session(sta, tid, + WLAN_BACK_RECIPIENT); spin_unlock_bh(&sta->lock); - ieee80211_stop_tx_ba_session(&local->hw, sta->sta.addr, tid, - WLAN_BACK_RECIPIENT); } } diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 68eb5052179a..33a7e75e8380 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h @@ -1057,6 +1057,8 @@ void ieee80211_process_addba_request(struct ieee80211_local *local, int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, enum ieee80211_back_parties initiator); +int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, + enum ieee80211_back_parties initiator); /* Spectrum management */ void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata, diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 0936fc24942d..9e50fdbdacfc 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c @@ -2155,11 +2155,17 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw, skb = rx.skb; - list_for_each_entry_rcu(sdata, &local->interfaces, list) { + if (rx.sdata && ieee80211_is_data(hdr->frame_control)) { + rx.flags |= IEEE80211_RX_RA_MATCH; + prepares = prepare_for_handlers(rx.sdata, &rx, hdr); + if (prepares) + prev = rx.sdata; + } else list_for_each_entry_rcu(sdata, &local->interfaces, list) { if (!netif_running(sdata->dev)) continue; - if (sdata->vif.type == NL80211_IFTYPE_MONITOR) + if (sdata->vif.type == NL80211_IFTYPE_MONITOR || + sdata->vif.type == NL80211_IFTYPE_AP_VLAN) continue; rx.flags |= IEEE80211_RX_RA_MATCH; diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index a360bceeba59..5ccfd1074eaa 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c @@ -360,6 +360,7 @@ int sta_info_insert(struct sta_info *sta) u.ap); drv_sta_notify(local, &sdata->vif, STA_NOTIFY_ADD, &sta->sta); + sdata = sta->sdata; } #ifdef CONFIG_MAC80211_VERBOSE_DEBUG @@ -494,6 +495,7 @@ static void __sta_info_unlink(struct sta_info **sta) drv_sta_notify(local, &sdata->vif, STA_NOTIFY_REMOVE, &(*sta)->sta); + sdata = (*sta)->sdata; } if (ieee80211_vif_is_mesh(&sdata->vif)) { diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 3a8922cd1038..e5d720e15137 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -1478,7 +1478,7 @@ int ieee80211_master_start_xmit(struct sk_buff *skb, struct net_device *dev) if (sdata->vif.type != NL80211_IFTYPE_AP) continue; if (compare_ether_addr(sdata->dev->dev_addr, - hdr->addr2)) { + hdr->addr2) == 0) { dev_hold(sdata->dev); dev_put(odev); osdata = sdata; @@ -1736,7 +1736,8 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, if (!is_multicast_ether_addr(hdr.addr1)) { rcu_read_lock(); sta = sta_info_get(local, hdr.addr1); - if (sta) + /* XXX: in the future, use sdata to look up the sta */ + if (sta && sta->sdata == sdata) sta_flags = get_sta_flags(sta); rcu_read_unlock(); } diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 915e77769312..005016d18a52 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c @@ -537,7 +537,7 @@ u32 ieee802_11_parse_elems_crc(u8 *start, size_t len, if (elen > left) break; - if (calc_crc && id < 64 && (filter & BIT(id))) + if (calc_crc && id < 64 && (filter & (1ULL << id))) crc = crc32_be(crc, pos - 2, elen + 2); switch (id) { diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index 7c1333c67ff3..27a15f56cb69 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c @@ -2713,6 +2713,8 @@ static int ip_vs_genl_parse_service(struct ip_vs_service_user_kern *usvc, if (!(nla_af && (nla_fwmark || (nla_port && nla_protocol && nla_addr)))) return -EINVAL; + memset(usvc, 0, sizeof(*usvc)); + usvc->af = nla_get_u16(nla_af); #ifdef CONFIG_IP_VS_IPV6 if (usvc->af != AF_INET && usvc->af != AF_INET6) @@ -2900,6 +2902,8 @@ static int ip_vs_genl_parse_dest(struct ip_vs_dest_user_kern *udest, if (!(nla_addr && nla_port)) return -EINVAL; + memset(udest, 0, sizeof(*udest)); + nla_memcpy(&udest->addr, nla_addr, sizeof(udest->addr)); udest->port = nla_get_u16(nla_port); diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index b5869b9574b0..e7407e5bfacc 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c @@ -1089,14 +1089,14 @@ void nf_conntrack_flush_report(struct net *net, u32 pid, int report) } EXPORT_SYMBOL_GPL(nf_conntrack_flush_report); -static void nf_ct_release_dying_list(void) +static void nf_ct_release_dying_list(struct net *net) { struct nf_conntrack_tuple_hash *h; struct nf_conn *ct; struct hlist_nulls_node *n; spin_lock_bh(&nf_conntrack_lock); - hlist_nulls_for_each_entry(h, n, &init_net.ct.dying, hnnode) { + hlist_nulls_for_each_entry(h, n, &net->ct.dying, hnnode) { ct = nf_ct_tuplehash_to_ctrack(h); /* never fails to remove them, no listeners at this point */ nf_ct_kill(ct); @@ -1115,7 +1115,7 @@ static void nf_conntrack_cleanup_net(struct net *net) { i_see_dead_people: nf_ct_iterate_cleanup(net, kill_all, NULL); - nf_ct_release_dying_list(); + nf_ct_release_dying_list(net); if (atomic_read(&net->ct.count) != 0) { schedule(); goto i_see_dead_people; @@ -1245,9 +1245,9 @@ static int nf_conntrack_init_init_net(void) * machine has 512 buckets. >= 1GB machines have 16384 buckets. */ if (!nf_conntrack_htable_size) { nf_conntrack_htable_size - = (((num_physpages << PAGE_SHIFT) / 16384) + = (((totalram_pages << PAGE_SHIFT) / 16384) / sizeof(struct hlist_head)); - if (num_physpages > (1024 * 1024 * 1024 / PAGE_SIZE)) + if (totalram_pages > (1024 * 1024 * 1024 / PAGE_SIZE)) nf_conntrack_htable_size = 16384; if (nf_conntrack_htable_size < 32) nf_conntrack_htable_size = 32; @@ -1350,6 +1350,11 @@ err_stat: return ret; } +s16 (*nf_ct_nat_offset)(const struct nf_conn *ct, + enum ip_conntrack_dir dir, + u32 seq); +EXPORT_SYMBOL_GPL(nf_ct_nat_offset); + int nf_conntrack_init(struct net *net) { int ret; @@ -1367,6 +1372,9 @@ int nf_conntrack_init(struct net *net) /* For use by REJECT target */ rcu_assign_pointer(ip_ct_attach, nf_conntrack_attach); rcu_assign_pointer(nf_ct_destroy, destroy_conntrack); + + /* Howto get NAT offsets */ + rcu_assign_pointer(nf_ct_nat_offset, NULL); } return 0; diff --git a/net/netfilter/nf_conntrack_ftp.c b/net/netfilter/nf_conntrack_ftp.c index 5509dd1f14cf..7dfd469c0cf8 100644 --- a/net/netfilter/nf_conntrack_ftp.c +++ b/net/netfilter/nf_conntrack_ftp.c @@ -323,24 +323,24 @@ static void update_nl_seq(struct nf_conn *ct, u32 nl_seq, struct nf_ct_ftp_master *info, int dir, struct sk_buff *skb) { - unsigned int i, oldest = NUM_SEQ_TO_REMEMBER; + unsigned int i, oldest; /* Look for oldest: if we find exact match, we're done. */ for (i = 0; i < info->seq_aft_nl_num[dir]; i++) { if (info->seq_aft_nl[dir][i] == nl_seq) return; - - if (oldest == info->seq_aft_nl_num[dir] || - before(info->seq_aft_nl[dir][i], - info->seq_aft_nl[dir][oldest])) - oldest = i; } if (info->seq_aft_nl_num[dir] < NUM_SEQ_TO_REMEMBER) { info->seq_aft_nl[dir][info->seq_aft_nl_num[dir]++] = nl_seq; - } else if (oldest != NUM_SEQ_TO_REMEMBER && - after(nl_seq, info->seq_aft_nl[dir][oldest])) { - info->seq_aft_nl[dir][oldest] = nl_seq; + } else { + if (before(info->seq_aft_nl[dir][0], info->seq_aft_nl[dir][1])) + oldest = 0; + else + oldest = 1; + + if (after(nl_seq, info->seq_aft_nl[dir][oldest])) + info->seq_aft_nl[dir][oldest] = nl_seq; } } diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c index 97a82ba75376..ba2b76937283 100644 --- a/net/netfilter/nf_conntrack_proto_tcp.c +++ b/net/netfilter/nf_conntrack_proto_tcp.c @@ -492,6 +492,21 @@ static void tcp_sack(const struct sk_buff *skb, unsigned int dataoff, } } +#ifdef CONFIG_NF_NAT_NEEDED +static inline s16 nat_offset(const struct nf_conn *ct, + enum ip_conntrack_dir dir, + u32 seq) +{ + typeof(nf_ct_nat_offset) get_offset = rcu_dereference(nf_ct_nat_offset); + + return get_offset != NULL ? get_offset(ct, dir, seq) : 0; +} +#define NAT_OFFSET(pf, ct, dir, seq) \ + (pf == NFPROTO_IPV4 ? nat_offset(ct, dir, seq) : 0) +#else +#define NAT_OFFSET(pf, ct, dir, seq) 0 +#endif + static bool tcp_in_window(const struct nf_conn *ct, struct ip_ct_tcp *state, enum ip_conntrack_dir dir, @@ -506,6 +521,7 @@ static bool tcp_in_window(const struct nf_conn *ct, struct ip_ct_tcp_state *receiver = &state->seen[!dir]; const struct nf_conntrack_tuple *tuple = &ct->tuplehash[dir].tuple; __u32 seq, ack, sack, end, win, swin; + s16 receiver_offset; bool res; /* @@ -519,11 +535,16 @@ static bool tcp_in_window(const struct nf_conn *ct, if (receiver->flags & IP_CT_TCP_FLAG_SACK_PERM) tcp_sack(skb, dataoff, tcph, &sack); + /* Take into account NAT sequence number mangling */ + receiver_offset = NAT_OFFSET(pf, ct, !dir, ack - 1); + ack -= receiver_offset; + sack -= receiver_offset; + pr_debug("tcp_in_window: START\n"); pr_debug("tcp_in_window: "); nf_ct_dump_tuple(tuple); - pr_debug("seq=%u ack=%u sack=%u win=%u end=%u\n", - seq, ack, sack, win, end); + pr_debug("seq=%u ack=%u+(%d) sack=%u+(%d) win=%u end=%u\n", + seq, ack, receiver_offset, sack, receiver_offset, win, end); pr_debug("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i " "receiver end=%u maxend=%u maxwin=%u scale=%i\n", sender->td_end, sender->td_maxend, sender->td_maxwin, @@ -613,8 +634,8 @@ static bool tcp_in_window(const struct nf_conn *ct, pr_debug("tcp_in_window: "); nf_ct_dump_tuple(tuple); - pr_debug("seq=%u ack=%u sack =%u win=%u end=%u\n", - seq, ack, sack, win, end); + pr_debug("seq=%u ack=%u+(%d) sack=%u+(%d) win=%u end=%u\n", + seq, ack, receiver_offset, sack, receiver_offset, win, end); pr_debug("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i " "receiver end=%u maxend=%u maxwin=%u scale=%i\n", sender->td_end, sender->td_maxend, sender->td_maxwin, @@ -700,7 +721,7 @@ static bool tcp_in_window(const struct nf_conn *ct, before(seq, sender->td_maxend + 1) ? after(end, sender->td_end - receiver->td_maxwin - 1) ? before(sack, receiver->td_end + 1) ? - after(ack, receiver->td_end - MAXACKWINDOW(sender)) ? "BUG" + after(sack, receiver->td_end - MAXACKWINDOW(sender) - 1) ? "BUG" : "ACK is under the lower bound (possible overly delayed ACK)" : "ACK is over the upper bound (ACKed data not seen yet)" : "SEQ is under the lower bound (already ACKed data retransmitted)" @@ -715,39 +736,6 @@ static bool tcp_in_window(const struct nf_conn *ct, return res; } -#ifdef CONFIG_NF_NAT_NEEDED -/* Update sender->td_end after NAT successfully mangled the packet */ -/* Caller must linearize skb at tcp header. */ -void nf_conntrack_tcp_update(const struct sk_buff *skb, - unsigned int dataoff, - struct nf_conn *ct, int dir, - s16 offset) -{ - const struct tcphdr *tcph = (const void *)skb->data + dataoff; - const struct ip_ct_tcp_state *sender = &ct->proto.tcp.seen[dir]; - const struct ip_ct_tcp_state *receiver = &ct->proto.tcp.seen[!dir]; - __u32 end; - - end = segment_seq_plus_len(ntohl(tcph->seq), skb->len, dataoff, tcph); - - spin_lock_bh(&ct->lock); - /* - * We have to worry for the ack in the reply packet only... - */ - if (ct->proto.tcp.seen[dir].td_end + offset == end) - ct->proto.tcp.seen[dir].td_end = end; - ct->proto.tcp.last_end = end; - spin_unlock_bh(&ct->lock); - pr_debug("tcp_update: sender end=%u maxend=%u maxwin=%u scale=%i " - "receiver end=%u maxend=%u maxwin=%u scale=%i\n", - sender->td_end, sender->td_maxend, sender->td_maxwin, - sender->td_scale, - receiver->td_end, receiver->td_maxend, receiver->td_maxwin, - receiver->td_scale); -} -EXPORT_SYMBOL_GPL(nf_conntrack_tcp_update); -#endif - #define TH_FIN 0x01 #define TH_SYN 0x02 #define TH_RST 0x04 diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c index 025d1a0af78b..0319516b7d39 100644 --- a/net/netfilter/x_tables.c +++ b/net/netfilter/x_tables.c @@ -617,7 +617,7 @@ struct xt_table_info *xt_alloc_table_info(unsigned int size) int cpu; /* Pedantry: prevent them from hitting BUG() in vmalloc.c --RR */ - if ((SMP_ALIGN(size) >> PAGE_SHIFT) + 2 > num_physpages) + if ((SMP_ALIGN(size) >> PAGE_SHIFT) + 2 > totalram_pages) return NULL; newinfo = kzalloc(XT_TABLE_INFO_SZ, GFP_KERNEL); diff --git a/net/netfilter/xt_connlimit.c b/net/netfilter/xt_connlimit.c index 680980954395..38f03f75a636 100644 --- a/net/netfilter/xt_connlimit.c +++ b/net/netfilter/xt_connlimit.c @@ -103,7 +103,7 @@ static int count_them(struct xt_connlimit_data *data, const struct nf_conntrack_tuple *tuple, const union nf_inet_addr *addr, const union nf_inet_addr *mask, - const struct xt_match *match) + u_int8_t family) { const struct nf_conntrack_tuple_hash *found; struct xt_connlimit_conn *conn; @@ -113,8 +113,7 @@ static int count_them(struct xt_connlimit_data *data, bool addit = true; int matches = 0; - - if (match->family == NFPROTO_IPV6) + if (family == NFPROTO_IPV6) hash = &data->iphash[connlimit_iphash6(addr, mask)]; else hash = &data->iphash[connlimit_iphash(addr->ip & mask->ip)]; @@ -157,8 +156,7 @@ static int count_them(struct xt_connlimit_data *data, continue; } - if (same_source_net(addr, mask, &conn->tuple.src.u3, - match->family)) + if (same_source_net(addr, mask, &conn->tuple.src.u3, family)) /* same source network -> be counted! */ ++matches; nf_ct_put(found_ct); @@ -207,7 +205,7 @@ connlimit_mt(const struct sk_buff *skb, const struct xt_match_param *par) spin_lock_bh(&info->data->lock); connections = count_them(info->data, tuple_ptr, &addr, - &info->mask, par->match); + &info->mask, par->family); spin_unlock_bh(&info->data->lock); if (connections < 0) { diff --git a/net/netfilter/xt_hashlimit.c b/net/netfilter/xt_hashlimit.c index 219dcdbe388c..dd16e404424f 100644 --- a/net/netfilter/xt_hashlimit.c +++ b/net/netfilter/xt_hashlimit.c @@ -194,9 +194,9 @@ static int htable_create_v0(struct xt_hashlimit_info *minfo, u_int8_t family) if (minfo->cfg.size) size = minfo->cfg.size; else { - size = ((num_physpages << PAGE_SHIFT) / 16384) / + size = ((totalram_pages << PAGE_SHIFT) / 16384) / sizeof(struct list_head); - if (num_physpages > (1024 * 1024 * 1024 / PAGE_SIZE)) + if (totalram_pages > (1024 * 1024 * 1024 / PAGE_SIZE)) size = 8192; if (size < 16) size = 16; @@ -266,9 +266,9 @@ static int htable_create(struct xt_hashlimit_mtinfo1 *minfo, u_int8_t family) if (minfo->cfg.size) { size = minfo->cfg.size; } else { - size = (num_physpages << PAGE_SHIFT) / 16384 / + size = (totalram_pages << PAGE_SHIFT) / 16384 / sizeof(struct list_head); - if (num_physpages > 1024 * 1024 * 1024 / PAGE_SIZE) + if (totalram_pages > 1024 * 1024 * 1024 / PAGE_SIZE) size = 8192; if (size < 16) size = 16; diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 2936fa3b6dc8..8b9a87c87753 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -2026,10 +2026,10 @@ static int __init netlink_proto_init(void) if (!nl_table) goto panic; - if (num_physpages >= (128 * 1024)) - limit = num_physpages >> (21 - PAGE_SHIFT); + if (totalram_pages >= (128 * 1024)) + limit = totalram_pages >> (21 - PAGE_SHIFT); else - limit = num_physpages >> (23 - PAGE_SHIFT); + limit = totalram_pages >> (23 - PAGE_SHIFT); order = get_bitmask_order(limit) - 1 + PAGE_SHIFT; limit = (1UL << order) / sizeof(struct hlist_head); diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index ebe5718baa31..f9f71770de5b 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -1836,7 +1836,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv static int packet_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen) { - int len; + unsigned int len; int val; struct sock *sk = sock->sk; struct packet_sock *po = pkt_sk(sk); @@ -1849,7 +1849,7 @@ static int packet_getsockopt(struct socket *sock, int level, int optname, if (get_user(len, optlen)) return -EFAULT; - if (len < 0) + if ((int)len < 0) return -EINVAL; switch (optname) { diff --git a/net/rfkill/core.c b/net/rfkill/core.c index a88743bc0032..d2438f940a25 100644 --- a/net/rfkill/core.c +++ b/net/rfkill/core.c @@ -121,7 +121,6 @@ static struct { static bool rfkill_epo_lock_active; -static unsigned long rfkill_no; #ifdef CONFIG_RFKILL_LEDS static void rfkill_led_trigger_event(struct rfkill *rfkill) @@ -694,7 +693,7 @@ static struct device_attribute rfkill_dev_attrs[] = { __ATTR(type, S_IRUGO, rfkill_type_show, NULL), __ATTR(index, S_IRUGO, rfkill_idx_show, NULL), __ATTR(persistent, S_IRUGO, rfkill_persistent_show, NULL), - __ATTR(state, S_IRUGO|S_IWUGO, rfkill_state_show, rfkill_state_store), + __ATTR(state, S_IRUGO|S_IWUSR, rfkill_state_show, rfkill_state_store), __ATTR(claim, S_IRUGO|S_IWUSR, rfkill_claim_show, rfkill_claim_store), __ATTR_NULL }; @@ -881,6 +880,7 @@ static void rfkill_sync_work(struct work_struct *work) int __must_check rfkill_register(struct rfkill *rfkill) { + static unsigned long rfkill_no; struct device *dev = &rfkill->dev; int error; @@ -960,8 +960,8 @@ void rfkill_unregister(struct rfkill *rfkill) mutex_lock(&rfkill_global_mutex); rfkill_send_events(rfkill, RFKILL_OP_DEL); list_del_init(&rfkill->node); - rfkill_no--; mutex_unlock(&rfkill_global_mutex); + rfkill_led_trigger_unregister(rfkill); } EXPORT_SYMBOL(rfkill_unregister); @@ -1180,6 +1180,7 @@ static long rfkill_fop_ioctl(struct file *file, unsigned int cmd, #endif static const struct file_operations rfkill_fops = { + .owner = THIS_MODULE, .open = rfkill_fop_open, .read = rfkill_fop_read, .write = rfkill_fop_write, diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c index 96c0ed115e2a..6b0359a500e6 100644 --- a/net/sched/act_pedit.c +++ b/net/sched/act_pedit.c @@ -34,7 +34,7 @@ static struct tcf_hashinfo pedit_hash_info = { }; static const struct nla_policy pedit_policy[TCA_PEDIT_MAX + 1] = { - [TCA_PEDIT_PARMS] = { .len = sizeof(struct tcf_pedit) }, + [TCA_PEDIT_PARMS] = { .len = sizeof(struct tc_pedit) }, }; static int tcf_pedit_init(struct nlattr *nla, struct nlattr *est, diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c index 09cdcdfe7e91..b83ac88a1448 100644 --- a/net/sched/cls_api.c +++ b/net/sched/cls_api.c @@ -348,7 +348,7 @@ static int tcf_fill_node(struct sk_buff *skb, struct tcf_proto *tp, tcm = NLMSG_DATA(nlh); tcm->tcm_family = AF_UNSPEC; tcm->tcm__pad1 = 0; - tcm->tcm__pad1 = 0; + tcm->tcm__pad2 = 0; tcm->tcm_ifindex = qdisc_dev(tp->q)->ifindex; tcm->tcm_parent = tp->classid; tcm->tcm_info = TC_H_MAKE(tp->prio, tp->protocol); diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index a76da657244a..4905051ffd83 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c @@ -1186,10 +1186,10 @@ SCTP_STATIC __init int sctp_init(void) /* Size and allocate the association hash table. * The methodology is similar to that of the tcp hash tables. */ - if (num_physpages >= (128 * 1024)) - goal = num_physpages >> (22 - PAGE_SHIFT); + if (totalram_pages >= (128 * 1024)) + goal = totalram_pages >> (22 - PAGE_SHIFT); else - goal = num_physpages >> (24 - PAGE_SHIFT); + goal = totalram_pages >> (24 - PAGE_SHIFT); for (order = 0; (1UL << order) < goal; order++) ; diff --git a/net/socket.c b/net/socket.c index f3cfd48191af..6d4716559047 100644 --- a/net/socket.c +++ b/net/socket.c @@ -96,10 +96,6 @@ #include <net/sock.h> #include <linux/netfilter.h> -#ifdef CONFIG_UID_STAT -#include <linux/uid_stat.h> -#endif - static int sock_no_open(struct inode *irrelevant, struct file *dontcare); static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos); @@ -574,12 +570,7 @@ static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock, if (err) return err; - err = sock->ops->sendmsg(iocb, sock, msg, size); -#ifdef CONFIG_UID_STAT - if (err > 0) - update_tcp_snd(current_uid(), err); -#endif - return err; + return sock->ops->sendmsg(iocb, sock, msg, size); } int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) @@ -693,12 +684,7 @@ static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock, if (err) return err; - err = sock->ops->recvmsg(iocb, sock, msg, size, flags); -#ifdef CONFIG_UID_STAT - if (err > 0) - update_tcp_rcv(current_uid(), err); -#endif - return err; + return sock->ops->recvmsg(iocb, sock, msg, size, flags); } int sock_recvmsg(struct socket *sock, struct msghdr *msg, diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c index 66d458fc6920..836c50e3beed 100644 --- a/net/sunrpc/auth_gss/auth_gss.c +++ b/net/sunrpc/auth_gss/auth_gss.c @@ -485,7 +485,7 @@ gss_refresh_upcall(struct rpc_task *task) dprintk("RPC: %5u gss_refresh_upcall for uid %u\n", task->tk_pid, cred->cr_uid); gss_msg = gss_setup_upcall(task->tk_client, gss_auth, cred); - if (IS_ERR(gss_msg) == -EAGAIN) { + if (PTR_ERR(gss_msg) == -EAGAIN) { /* XXX: warning on the first, under the assumption we * shouldn't normally hit this case on a refresh. */ warn_gssd(); diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index 23128ee191ae..39e37bca2576 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c @@ -110,7 +110,7 @@ static void svc_release_skb(struct svc_rqst *rqstp) rqstp->rq_xprt_ctxt = NULL; dprintk("svc: service %p, releasing skb %p\n", rqstp, skb); - skb_free_datagram(svsk->sk_sk, skb); + skb_free_datagram_locked(svsk->sk_sk, skb); } } @@ -537,7 +537,7 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp) printk("rpcsvc: received unknown control message:" "%d/%d\n", cmh->cmsg_level, cmh->cmsg_type); - skb_free_datagram(svsk->sk_sk, skb); + skb_free_datagram_locked(svsk->sk_sk, skb); return 0; } svc_udp_get_dest_address(rqstp, cmh); @@ -548,18 +548,18 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp) if (csum_partial_copy_to_xdr(&rqstp->rq_arg, skb)) { local_bh_enable(); /* checksum error */ - skb_free_datagram(svsk->sk_sk, skb); + skb_free_datagram_locked(svsk->sk_sk, skb); return 0; } local_bh_enable(); - skb_free_datagram(svsk->sk_sk, skb); + skb_free_datagram_locked(svsk->sk_sk, skb); } else { /* we can use it in-place */ rqstp->rq_arg.head[0].iov_base = skb->data + sizeof(struct udphdr); rqstp->rq_arg.head[0].iov_len = len; if (skb_checksum_complete(skb)) { - skb_free_datagram(svsk->sk_sk, skb); + skb_free_datagram_locked(svsk->sk_sk, skb); return 0; } rqstp->rq_xprt_ctxt = skb; diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index fc3ebb906911..fc820cd75453 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -1074,6 +1074,8 @@ restart: err = -ECONNREFUSED; if (other->sk_state != TCP_LISTEN) goto out_unlock; + if (other->sk_shutdown & RCV_SHUTDOWN) + goto out_unlock; if (unix_recvq_full(other)) { err = -EAGAIN; @@ -1501,6 +1503,7 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock, struct sk_buff *skb; int sent = 0; struct scm_cookie tmp_scm; + bool fds_sent = false; if (NULL == siocb->scm) siocb->scm = &tmp_scm; @@ -1562,12 +1565,14 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock, size = min_t(int, size, skb_tailroom(skb)); memcpy(UNIXCREDS(skb), &siocb->scm->creds, sizeof(struct ucred)); - if (siocb->scm->fp) { + /* Only send the fds in the first buffer */ + if (siocb->scm->fp && !fds_sent) { err = unix_attach_fds(siocb->scm, skb); if (err) { kfree_skb(skb); goto out_err; } + fds_sent = true; } err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size); diff --git a/net/wireless/scan.c b/net/wireless/scan.c index 7e595ce24eeb..46c101a5e44e 100644 --- a/net/wireless/scan.c +++ b/net/wireless/scan.c @@ -97,7 +97,7 @@ void cfg80211_bss_expire(struct cfg80211_registered_device *dev) dev->bss_generation++; } -static u8 *find_ie(u8 num, u8 *ies, size_t len) +static u8 *find_ie(u8 num, u8 *ies, int len) { while (len > 2 && ies[0] != num) { len -= ies[1] + 2; diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include index c29be8f90248..43300b337fda 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include @@ -105,12 +105,12 @@ as-instr = $(call try-run,\ # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586) cc-option = $(call try-run,\ - $(CC) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",$(1),$(2)) + $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",$(1),$(2)) # cc-option-yn # Usage: flag := $(call cc-option-yn,-march=winchip-c6) cc-option-yn = $(call try-run,\ - $(CC) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",y,n) + $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",y,n) # cc-option-align # Prefix align with either -falign or -malign diff --git a/scripts/Makefile b/scripts/Makefile index 9dd5b25a1d53..842dbc2d5aed 100644 --- a/scripts/Makefile +++ b/scripts/Makefile @@ -10,7 +10,6 @@ hostprogs-$(CONFIG_KALLSYMS) += kallsyms hostprogs-$(CONFIG_LOGO) += pnmtologo hostprogs-$(CONFIG_VT) += conmakehash -hostprogs-$(CONFIG_PROM_CONSOLE) += conmakehash hostprogs-$(CONFIG_IKCONFIG) += bin2c always := $(hostprogs-y) $(hostprogs-m) diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 5c4b7a400c18..98112d04fcb8 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -269,7 +269,8 @@ targets += $(extra-y) $(MAKECMDGOALS) $(always) # Linker scripts preprocessor (.lds.S -> .lds) # --------------------------------------------------------------------------- quiet_cmd_cpp_lds_S = LDS $@ - cmd_cpp_lds_S = $(CPP) $(cpp_flags) -D__ASSEMBLY__ -o $@ $< + cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -C -U$(ARCH) \ + -D__ASSEMBLY__ -o $@ $< $(obj)/%.lds: $(src)/%.lds.S FORCE $(call if_changed_dep,cpp_lds_S) diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c index 9d5bb40ed0c5..d5c232ff58c8 100644 --- a/scripts/kallsyms.c +++ b/scripts/kallsyms.c @@ -586,7 +586,7 @@ static int prefix_underscores_count(const char *str) { const char *tail = str; - while (*tail != '_') + while (*tail == '_') tail++; return tail - str; diff --git a/security/integrity/ima/ima_iint.c b/security/integrity/ima/ima_iint.c index b8dd693f8790..a4e2b1dac943 100644 --- a/security/integrity/ima/ima_iint.c +++ b/security/integrity/ima/ima_iint.c @@ -58,11 +58,11 @@ struct ima_iint_cache *ima_iint_insert(struct inode *inode) if (!ima_initialized) return iint; - iint = kmem_cache_alloc(iint_cache, GFP_KERNEL); + iint = kmem_cache_alloc(iint_cache, GFP_NOFS); if (!iint) return iint; - rc = radix_tree_preload(GFP_KERNEL); + rc = radix_tree_preload(GFP_NOFS); if (rc < 0) goto out; diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c index 7f09fb897d2b..667aecd0fe52 100644 --- a/security/keys/keyctl.c +++ b/security/keys/keyctl.c @@ -860,7 +860,7 @@ static long get_instantiation_keyring(key_serial_t ringid, /* otherwise specify the destination keyring recorded in the * authorisation key (any KEY_SPEC_*_KEYRING) */ if (ringid >= KEY_SPEC_REQUESTOR_KEYRING) { - *_dest_keyring = rka->dest_keyring; + *_dest_keyring = key_get(rka->dest_keyring); return 0; } diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 8d8b69c5664e..43f26dd8ab64 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -2360,7 +2360,7 @@ static void selinux_bprm_committing_creds(struct linux_binprm *bprm) initrlim = init_task.signal->rlim + i; rlim->rlim_cur = min(rlim->rlim_max, initrlim->rlim_cur); } - update_rlimit_cpu(rlim->rlim_cur); + update_rlimit_cpu(current->signal->rlim[RLIMIT_CPU].rlim_cur); } } diff --git a/sound/aoa/codecs/tas.c b/sound/aoa/codecs/tas.c index f0ebc971c686..1dd66ddffcaf 100644 --- a/sound/aoa/codecs/tas.c +++ b/sound/aoa/codecs/tas.c @@ -897,6 +897,15 @@ static int tas_create(struct i2c_adapter *adapter, client = i2c_new_device(adapter, &info); if (!client) return -ENODEV; + /* + * We know the driver is already loaded, so the device should be + * already bound. If not it means binding failed, and then there + * is no point in keeping the device instantiated. + */ + if (!client->driver) { + i2c_unregister_device(client); + return -ENODEV; + } /* * Let i2c-core delete that device on driver removal. diff --git a/sound/arm/aaci.c b/sound/arm/aaci.c index dc78272fc39f..dbb05b772558 100644 --- a/sound/arm/aaci.c +++ b/sound/arm/aaci.c @@ -504,6 +504,10 @@ static int aaci_pcm_hw_params(struct snd_pcm_substream *substream, int err; aaci_pcm_hw_free(substream); + if (aacirun->pcm_open) { + snd_ac97_pcm_close(aacirun->pcm); + aacirun->pcm_open = 0; + } err = devdma_hw_alloc(NULL, substream, params_buffer_bytes(params)); @@ -517,7 +521,7 @@ static int aaci_pcm_hw_params(struct snd_pcm_substream *substream, else err = snd_ac97_pcm_open(aacirun->pcm, params_rate(params), params_channels(params), - aacirun->pcm->r[1].slots); + aacirun->pcm->r[0].slots); if (err) goto out; diff --git a/sound/arm/mxc-alsa-spdif.c b/sound/arm/mxc-alsa-spdif.c index ae48051b49e8..93a34cd03e11 100644 --- a/sound/arm/mxc-alsa-spdif.c +++ b/sound/arm/mxc-alsa-spdif.c @@ -257,7 +257,6 @@ struct mxc_spdif_device { * SPDIF module register base address */ unsigned long __iomem *reg_base; - unsigned long reg_phys_base; /*! * spdif tx available or not @@ -944,9 +943,8 @@ static void spdif_stop_tx(struct mxc_spdif_stream *s) */ static void spdif_start_tx(struct mxc_spdif_stream *s) { - struct snd_pcm_substream *substream = s->stream; - struct snd_pcm_runtime *runtime = substream->runtime; - struct mxc_spdif_device *chip = snd_pcm_substream_chip(substream); + struct snd_pcm_substream *substream; + struct snd_pcm_runtime *runtime; unsigned int dma_size = 0; unsigned int offset; int ret = 0; @@ -962,7 +960,7 @@ static void spdif_start_tx(struct mxc_spdif_stream *s) (NULL, runtime->dma_area + offset, dma_size, DMA_TO_DEVICE)); - dma_request.dst_addr = (dma_addr_t) (chip->reg_phys_base + 0x2c); + dma_request.dst_addr = (dma_addr_t) (SPDIF_BASE_ADDR + 0x2c); dma_request.num_of_bytes = dma_size; mxc_dma_config(s->dma_wchannel, &dma_request, 1, @@ -1281,14 +1279,15 @@ static void spdif_stop_rx(struct mxc_spdif_stream *s) */ static void spdif_start_rx(struct mxc_spdif_stream *s) { - struct snd_pcm_substream *substream = s->stream; - struct snd_pcm_runtime *runtime = substream->runtime; - struct mxc_spdif_device *chip = snd_pcm_substream_chip(substream); + struct snd_pcm_substream *substream; + struct snd_pcm_runtime *runtime; unsigned int dma_size = 0; unsigned int offset; int ret = 0; mxc_dma_requestbuf_t dma_request; + substream = s->stream; + runtime = substream->runtime; memset(&dma_request, 0, sizeof(mxc_dma_requestbuf_t)); if (s->active) { @@ -1306,7 +1305,7 @@ static void spdif_start_rx(struct mxc_spdif_stream *s) DMA_FROM_DEVICE)); dma_request.src_addr = - (dma_addr_t) (chip->reg_phys_base + SPDIF_REG_SRL); + (dma_addr_t) (SPDIF_BASE_ADDR + SPDIF_REG_SRL); dma_request.num_of_bytes = dma_size; /* config and enable sdma for RX */ mxc_dma_config(s->dma_wchannel, &dma_request, 1, @@ -2090,7 +2089,6 @@ static int mxc_alsa_spdif_probe(struct platform_device chip = card->private_data; chip->card = card; card->dev = &pdev->dev; - chip->reg_phys_base = res->start; chip->reg_base = ioremap(res->start, res->end - res->start + 1); spdif_base_addr = (unsigned long)chip->reg_base; plat_data = (struct mxc_spdif_platform_data *)pdev->dev.platform_data; diff --git a/sound/core/hrtimer.c b/sound/core/hrtimer.c index 34c7d48f5061..7f4d744ae40a 100644 --- a/sound/core/hrtimer.c +++ b/sound/core/hrtimer.c @@ -37,14 +37,22 @@ static unsigned int resolution; struct snd_hrtimer { struct snd_timer *timer; struct hrtimer hrt; + atomic_t running; }; static enum hrtimer_restart snd_hrtimer_callback(struct hrtimer *hrt) { struct snd_hrtimer *stime = container_of(hrt, struct snd_hrtimer, hrt); struct snd_timer *t = stime->timer; + + if (!atomic_read(&stime->running)) + return HRTIMER_NORESTART; + hrtimer_forward_now(hrt, ns_to_ktime(t->sticks * resolution)); snd_timer_interrupt(stime->timer, t->sticks); + + if (!atomic_read(&stime->running)) + return HRTIMER_NORESTART; return HRTIMER_RESTART; } @@ -58,6 +66,7 @@ static int snd_hrtimer_open(struct snd_timer *t) hrtimer_init(&stime->hrt, CLOCK_MONOTONIC, HRTIMER_MODE_REL); stime->timer = t; stime->hrt.function = snd_hrtimer_callback; + atomic_set(&stime->running, 0); t->private_data = stime; return 0; } @@ -78,16 +87,18 @@ static int snd_hrtimer_start(struct snd_timer *t) { struct snd_hrtimer *stime = t->private_data; + atomic_set(&stime->running, 0); + hrtimer_cancel(&stime->hrt); hrtimer_start(&stime->hrt, ns_to_ktime(t->sticks * resolution), HRTIMER_MODE_REL); + atomic_set(&stime->running, 1); return 0; } static int snd_hrtimer_stop(struct snd_timer *t) { struct snd_hrtimer *stime = t->private_data; - - hrtimer_cancel(&stime->hrt); + atomic_set(&stime->running, 0); return 0; } diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c index 473247c8e6d3..70d6f25ba526 100644 --- a/sound/core/rawmidi.c +++ b/sound/core/rawmidi.c @@ -248,7 +248,8 @@ static int assign_substream(struct snd_rawmidi *rmidi, int subdevice, list_for_each_entry(substream, &s->substreams, list) { if (substream->opened) { if (stream == SNDRV_RAWMIDI_STREAM_INPUT || - !(mode & SNDRV_RAWMIDI_LFLG_APPEND)) + !(mode & SNDRV_RAWMIDI_LFLG_APPEND) || + !substream->append) continue; } if (subdevice < 0 || subdevice == substream->number) { @@ -266,17 +267,21 @@ static int open_substream(struct snd_rawmidi *rmidi, { int err; - err = snd_rawmidi_runtime_create(substream); - if (err < 0) - return err; - err = substream->ops->open(substream); - if (err < 0) - return err; - substream->opened = 1; - if (substream->use_count++ == 0) - substream->active_sensing = 1; - if (mode & SNDRV_RAWMIDI_LFLG_APPEND) - substream->append = 1; + if (substream->use_count == 0) { + err = snd_rawmidi_runtime_create(substream); + if (err < 0) + return err; + err = substream->ops->open(substream); + if (err < 0) { + snd_rawmidi_runtime_free(substream); + return err; + } + substream->opened = 1; + substream->active_sensing = 0; + if (mode & SNDRV_RAWMIDI_LFLG_APPEND) + substream->append = 1; + } + substream->use_count++; rmidi->streams[substream->stream].substream_opened++; return 0; } @@ -297,27 +302,27 @@ static int rawmidi_open_priv(struct snd_rawmidi *rmidi, int subdevice, int mode, SNDRV_RAWMIDI_STREAM_INPUT, mode, &sinput); if (err < 0) - goto __error; + return err; } if (mode & SNDRV_RAWMIDI_LFLG_OUTPUT) { err = assign_substream(rmidi, subdevice, SNDRV_RAWMIDI_STREAM_OUTPUT, mode, &soutput); if (err < 0) - goto __error; + return err; } if (sinput) { err = open_substream(rmidi, sinput, mode); if (err < 0) - goto __error; + return err; } if (soutput) { err = open_substream(rmidi, soutput, mode); if (err < 0) { if (sinput) close_substream(rmidi, sinput, 0); - goto __error; + return err; } } @@ -325,13 +330,6 @@ static int rawmidi_open_priv(struct snd_rawmidi *rmidi, int subdevice, int mode, rfile->input = sinput; rfile->output = soutput; return 0; - - __error: - if (sinput && sinput->runtime) - snd_rawmidi_runtime_free(sinput); - if (soutput && soutput->runtime) - snd_rawmidi_runtime_free(soutput); - return err; } /* called from sound/core/seq/seq_midi.c */ diff --git a/sound/core/seq/seq_midi.c b/sound/core/seq/seq_midi.c index 4d26146a62cc..90356b880dbb 100644 --- a/sound/core/seq/seq_midi.c +++ b/sound/core/seq/seq_midi.c @@ -236,6 +236,7 @@ static int midisynth_use(void *private_data, struct snd_seq_port_subscribe *info memset(¶ms, 0, sizeof(params)); params.avail_min = 1; params.buffer_size = output_buffer_size; + params.no_active_sensing = 1; if ((err = snd_rawmidi_output_params(msynth->output_rfile.output, ¶ms)) < 0) { snd_rawmidi_kernel_release(&msynth->output_rfile); return err; diff --git a/sound/mips/sgio2audio.c b/sound/mips/sgio2audio.c index e497525bc11b..db7ff29ee9a1 100644 --- a/sound/mips/sgio2audio.c +++ b/sound/mips/sgio2audio.c @@ -609,7 +609,7 @@ static int snd_sgio2audio_pcm_hw_params(struct snd_pcm_substream *substream, /* alloc virtual 'dma' area */ if (runtime->dma_area) vfree(runtime->dma_area); - runtime->dma_area = vmalloc(size); + runtime->dma_area = vmalloc_user(size); if (runtime->dma_area == NULL) return -ENOMEM; runtime->dma_bytes = size; diff --git a/sound/pci/cs46xx/cs46xx_lib.h b/sound/pci/cs46xx/cs46xx_lib.h index 4eb55aa33612..b5189495d58a 100644 --- a/sound/pci/cs46xx/cs46xx_lib.h +++ b/sound/pci/cs46xx/cs46xx_lib.h @@ -35,7 +35,7 @@ #ifdef CONFIG_SND_CS46XX_NEW_DSP -#define CS46XX_MIN_PERIOD_SIZE 1 +#define CS46XX_MIN_PERIOD_SIZE 64 #define CS46XX_MAX_PERIOD_SIZE 1024*1024 #else #define CS46XX_MIN_PERIOD_SIZE 2048 diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 175f07a381ba..7ea92f58ffd4 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -1839,6 +1839,12 @@ static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev) if (!bdl_pos_adj[chip->dev_index]) return 1; /* no delayed ack */ + if (azx_dev->period_bytes == 0) { + printk(KERN_WARNING + "hda-intel: Divide by zero was avoided " + "in azx_dev->period_bytes.\n"); + return 0; + } if (pos % azx_dev->period_bytes > azx_dev->period_bytes / 2) return 0; /* NG - it's below the period boundary */ return 1; /* OK, it's fine */ @@ -2392,6 +2398,11 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, } } + /* disable 64bit DMA address for Teradici */ + /* it does not work with device 6549:1200 subsys e4a2:040b */ + if (chip->driver_type == AZX_DRIVER_TERA) + gcap &= ~ICH6_GCAP_64OK; + /* allow 64bit DMA address if supported by H/W */ if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64))) pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64)); diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 30eeb304351c..713bf692bc27 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -16876,6 +16876,7 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = { SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS), SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K", ALC662_3ST_6ch_DIG), + SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB200", ALC663_ASUS_MODE4), SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10), SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", ALC662_3ST_6ch_DIG), diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 6990cfcb6a38..285b1e24e995 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -1817,6 +1817,8 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = { "Dell Studio 17", STAC_DELL_M6_DMIC), SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02be, "Dell Studio 1555", STAC_DELL_M6_DMIC), + SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02bd, + "Dell Studio 1557", STAC_DELL_M6_DMIC), {} /* terminator */ }; diff --git a/sound/pci/ice1712/ice1724.c b/sound/pci/ice1712/ice1724.c index cc84a831eb21..56d1bd8b6118 100644 --- a/sound/pci/ice1712/ice1724.c +++ b/sound/pci/ice1712/ice1724.c @@ -643,7 +643,7 @@ static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate, (inb(ICEMT1724(ice, DMA_PAUSE)) & DMA_PAUSES)) { /* running? we cannot change the rate now... */ spin_unlock_irqrestore(&ice->reg_lock, flags); - return -EBUSY; + return ((rate == ice->cur_rate) && !force) ? 0 : -EBUSY; } if (!force && is_pro_rate_locked(ice)) { spin_unlock_irqrestore(&ice->reg_lock, flags); diff --git a/sound/pci/mixart/mixart.c b/sound/pci/mixart/mixart.c index a83d1968a845..32f98535c0b4 100644 --- a/sound/pci/mixart/mixart.c +++ b/sound/pci/mixart/mixart.c @@ -1161,13 +1161,15 @@ static long snd_mixart_BA0_read(struct snd_info_entry *entry, void *file_private unsigned long count, unsigned long pos) { struct mixart_mgr *mgr = entry->private_data; + unsigned long maxsize; - count = count & ~3; /* make sure the read size is a multiple of 4 bytes */ - if(count <= 0) + if (pos >= MIXART_BA0_SIZE) return 0; - if(pos + count > MIXART_BA0_SIZE) - count = (long)(MIXART_BA0_SIZE - pos); - if(copy_to_user_fromio(buf, MIXART_MEM( mgr, pos ), count)) + maxsize = MIXART_BA0_SIZE - pos; + if (count > maxsize) + count = maxsize; + count = count & ~3; /* make sure the read size is a multiple of 4 bytes */ + if (copy_to_user_fromio(buf, MIXART_MEM(mgr, pos), count)) return -EFAULT; return count; } @@ -1180,13 +1182,15 @@ static long snd_mixart_BA1_read(struct snd_info_entry *entry, void *file_private unsigned long count, unsigned long pos) { struct mixart_mgr *mgr = entry->private_data; + unsigned long maxsize; - count = count & ~3; /* make sure the read size is a multiple of 4 bytes */ - if(count <= 0) + if (pos > MIXART_BA1_SIZE) return 0; - if(pos + count > MIXART_BA1_SIZE) - count = (long)(MIXART_BA1_SIZE - pos); - if(copy_to_user_fromio(buf, MIXART_REG( mgr, pos ), count)) + maxsize = MIXART_BA1_SIZE - pos; + if (count > maxsize) + count = maxsize; + count = count & ~3; /* make sure the read size is a multiple of 4 bytes */ + if (copy_to_user_fromio(buf, MIXART_REG(mgr, pos), count)) return -EFAULT; return count; } diff --git a/sound/pci/oxygen/oxygen_io.c b/sound/pci/oxygen/oxygen_io.c index c1eb923f2ac9..09b2b2a36df5 100644 --- a/sound/pci/oxygen/oxygen_io.c +++ b/sound/pci/oxygen/oxygen_io.c @@ -215,17 +215,8 @@ EXPORT_SYMBOL(oxygen_write_spi); void oxygen_write_i2c(struct oxygen *chip, u8 device, u8 map, u8 data) { - unsigned long timeout; - /* should not need more than about 300 us */ - timeout = jiffies + msecs_to_jiffies(1); - do { - if (!(oxygen_read16(chip, OXYGEN_2WIRE_BUS_STATUS) - & OXYGEN_2WIRE_BUSY)) - break; - udelay(1); - cond_resched(); - } while (time_after_eq(timeout, jiffies)); + msleep(1); oxygen_write8(chip, OXYGEN_2WIRE_MAP, map); oxygen_write8(chip, OXYGEN_2WIRE_DATA, data); diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c index acfa4760da49..91683a349035 100644 --- a/sound/pci/via82xx.c +++ b/sound/pci/via82xx.c @@ -1626,7 +1626,7 @@ static int snd_via8233_dxs_volume_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct via82xx *chip = snd_kcontrol_chip(kcontrol); - unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id); + unsigned int idx = kcontrol->id.subdevice; ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0]; ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1]; @@ -1646,7 +1646,7 @@ static int snd_via8233_dxs_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct via82xx *chip = snd_kcontrol_chip(kcontrol); - unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id); + unsigned int idx = kcontrol->id.subdevice; unsigned long port = chip->port + 0x10 * idx; unsigned char val; int i, change = 0; @@ -1705,11 +1705,12 @@ static struct snd_kcontrol_new snd_via8233_pcmdxs_volume_control __devinitdata = }; static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = { - .name = "VIA DXS Playback Volume", - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + .iface = SNDRV_CTL_ELEM_IFACE_PCM, + .device = 0, + /* .subdevice set later */ + .name = "PCM Playback Volume", .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ), - .count = 4, .info = snd_via8233_dxs_volume_info, .get = snd_via8233_dxs_volume_get, .put = snd_via8233_dxs_volume_put, @@ -1936,10 +1937,18 @@ static int __devinit snd_via8233_init_misc(struct via82xx *chip) } else /* Using DXS when PCM emulation is enabled is really weird */ { - /* Standalone DXS controls */ - err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs_volume_control, chip)); - if (err < 0) - return err; + for (i = 0; i < 4; ++i) { + struct snd_kcontrol *kctl; + + kctl = snd_ctl_new1( + &snd_via8233_dxs_volume_control, chip); + if (!kctl) + return -ENOMEM; + kctl->id.subdevice = i; + err = snd_ctl_add(chip->card, kctl); + if (err < 0) + return err; + } } } /* select spdif data slot 10/11 */ diff --git a/sound/pcmcia/pdaudiocf/pdaudiocf_pcm.c b/sound/pcmcia/pdaudiocf/pdaudiocf_pcm.c index d057e6489643..5cfa608823f7 100644 --- a/sound/pcmcia/pdaudiocf/pdaudiocf_pcm.c +++ b/sound/pcmcia/pdaudiocf/pdaudiocf_pcm.c @@ -51,7 +51,7 @@ static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs, size_t s return 0; /* already enough large */ vfree(runtime->dma_area); } - runtime->dma_area = vmalloc_32(size); + runtime->dma_area = vmalloc_32_user(size); if (! runtime->dma_area) return -ENOMEM; runtime->dma_bytes = size; diff --git a/sound/ppc/keywest.c b/sound/ppc/keywest.c index 835fa19ed461..bb6819aab133 100644 --- a/sound/ppc/keywest.c +++ b/sound/ppc/keywest.c @@ -59,6 +59,18 @@ static int keywest_attach_adapter(struct i2c_adapter *adapter) strlcpy(info.type, "keywest", I2C_NAME_SIZE); info.addr = keywest_ctx->addr; keywest_ctx->client = i2c_new_device(adapter, &info); + if (!keywest_ctx->client) + return -ENODEV; + /* + * We know the driver is already loaded, so the device should be + * already bound. If not it means binding failed, and then there + * is no point in keeping the device instantiated. + */ + if (!keywest_ctx->client->driver) { + i2c_unregister_device(keywest_ctx->client); + keywest_ctx->client = NULL; + return -ENODEV; + } /* * Let i2c-core delete that device on driver removal. diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c index 9bea4d8a523d..dbe96a8e1d3b 100644 --- a/sound/soc/codecs/sgtl5000.c +++ b/sound/soc/codecs/sgtl5000.c @@ -608,8 +608,6 @@ static int sgtl5000_pcm_hw_params(struct snd_pcm_substream *substream, fs = sgtl5000->lrclk; /* SGTL5000 rev1 has a IC bug to prevent switching to MCLK from PLL. */ if (!sgtl5000->master) { - sys_fs = sgtl5000->lrclk; - clk_ctl = SGTL5000_RATE_MODE_DIV_1 << SGTL5000_RATE_MODE_SHIFT; if (fs * 256 == sgtl5000->sysclk) clk_ctl |= SGTL5000_MCLK_FREQ_256FS << \ SGTL5000_MCLK_FREQ_SHIFT; diff --git a/sound/soc/codecs/tlv320aic23.c b/sound/soc/codecs/tlv320aic23.c index 0b8dcb5cd729..1365de0f7aec 100644 --- a/sound/soc/codecs/tlv320aic23.c +++ b/sound/soc/codecs/tlv320aic23.c @@ -625,11 +625,10 @@ static int tlv320aic23_resume(struct platform_device *pdev) { struct snd_soc_device *socdev = platform_get_drvdata(pdev); struct snd_soc_codec *codec = socdev->card->codec; - int i; u16 reg; /* Sync reg_cache with the hardware */ - for (reg = 0; reg < ARRAY_SIZE(tlv320aic23_reg); i++) { + for (reg = 0; reg < TLV320AIC23_RESET; reg++) { u16 val = tlv320aic23_read_reg_cache(codec, reg); tlv320aic23_write(codec, reg, val); } diff --git a/sound/soc/codecs/wm9712.c b/sound/soc/codecs/wm9712.c index 1fd4e88f50cf..e9123f54202d 100644 --- a/sound/soc/codecs/wm9712.c +++ b/sound/soc/codecs/wm9712.c @@ -464,7 +464,8 @@ static int ac97_write(struct snd_soc_codec *codec, unsigned int reg, { u16 *cache = codec->reg_cache; - soc_ac97_ops.write(codec->ac97, reg, val); + if (reg < 0x7c) + soc_ac97_ops.write(codec->ac97, reg, val); reg = reg >> 1; if (reg < (ARRAY_SIZE(wm9712_reg))) cache[reg] = val; diff --git a/sound/soc/mxs/mxs-dai.c b/sound/soc/mxs/mxs-dai.c index 9ca22ecdb4b0..a548b9948516 100644 --- a/sound/soc/mxs/mxs-dai.c +++ b/sound/soc/mxs/mxs-dai.c @@ -288,7 +288,6 @@ static int mxs_saif_set_dai_clkdiv(struct snd_soc_dai *cpu_dai, default: return -EINVAL; } - break; default: return -EINVAL; } diff --git a/sound/soc/mxs/mxs-pcm.c b/sound/soc/mxs/mxs-pcm.c index dac91e3eb8fb..f3cdcdbd2861 100644 --- a/sound/soc/mxs/mxs-pcm.c +++ b/sound/soc/mxs/mxs-pcm.c @@ -378,7 +378,6 @@ static int mxs_pcm_close(struct snd_pcm_substream *substream) free_irq(prtd->params->irq, substream); mxs_dma_get_cooked(prtd->dma_ch, &list); /* Free DMA channel*/ - mxs_dma_reset(prtd->dma_ch); for (desc = 0; desc < desc_num; desc++) mxs_dma_free_desc(prtd->dma_desc_array[desc]); mxs_dma_release(prtd->dma_ch, mxs_pcm_dev); diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index 21c69074aa17..4aba33fa6b70 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c @@ -774,9 +774,19 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event) if (!w->power_check) continue; - power = w->power_check(w); - if (power) - sys_power = 1; + /* If we're suspending then pull down all the + * power. */ + switch (event) { + case SND_SOC_DAPM_STREAM_SUSPEND: + power = 0; + break; + + default: + power = w->power_check(w); + if (power) + sys_power = 1; + break; + } if (w->power == power) continue; diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index 44b9cdc8a83b..8da53c56c4d2 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c @@ -752,7 +752,7 @@ static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs, size_t s return 0; /* already large enough */ vfree(runtime->dma_area); } - runtime->dma_area = vmalloc(size); + runtime->dma_area = vmalloc_user(size); if (!runtime->dma_area) return -ENOMEM; runtime->dma_bytes = size; @@ -1934,7 +1934,7 @@ static int snd_usb_pcm_close(struct snd_pcm_substream *substream, int direction) struct snd_usb_stream *as = snd_pcm_substream_chip(substream); struct snd_usb_substream *subs = &as->substream[direction]; - if (subs->interface >= 0) { + if (!as->chip->shutdown && subs->interface >= 0) { usb_set_interface(subs->dev, subs->interface, 0); subs->interface = -1; } diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index 8e7f78941ba6..e9a3a9dca15c 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h @@ -210,7 +210,7 @@ struct snd_usb_midi_endpoint_info { /* */ -#define combine_word(s) ((*s) | ((unsigned int)(s)[1] << 8)) +#define combine_word(s) ((*(s)) | ((unsigned int)(s)[1] << 8)) #define combine_triple(s) (combine_word(s) | ((unsigned int)(s)[2] << 16)) #define combine_quad(s) (combine_triple(s) | ((unsigned int)(s)[3] << 24)) diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index 5e17de984dc8..5010952c1d81 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c @@ -1335,8 +1335,8 @@ static int __cmd_annotate(void) exit(-1); } - if (!force && (stat.st_uid != geteuid())) { - fprintf(stderr, "file: %s not owned by current user\n", input_name); + if (!force && stat.st_uid && (stat.st_uid != geteuid())) { + fprintf(stderr, "file: %s not owned by current user or root\n", input_name); exit(-1); } diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 8b2ec882e6e0..b8a75f63d535 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -1857,8 +1857,8 @@ static int __cmd_report(void) exit(-1); } - if (!force && (stat.st_uid != geteuid())) { - fprintf(stderr, "file: %s not owned by current user\n", input_name); + if (!force && stat.st_uid && (stat.st_uid != geteuid())) { + fprintf(stderr, "file: %s not owned by current user or root\n", input_name); exit(-1); } diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index b4b06c7903e1..e874ad447ff9 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -82,19 +82,32 @@ static u64 runtime_cycles[MAX_RUN]; static u64 event_res[MAX_RUN][MAX_COUNTERS][3]; static u64 event_scaled[MAX_RUN][MAX_COUNTERS]; -static u64 event_res_avg[MAX_COUNTERS][3]; -static u64 event_res_noise[MAX_COUNTERS][3]; +struct stats +{ + double sum; + double sum_sq; +}; -static u64 event_scaled_avg[MAX_COUNTERS]; +static double avg_stats(struct stats *stats) +{ + return stats->sum / run_count; +} -static u64 runtime_nsecs_avg; -static u64 runtime_nsecs_noise; +/* + * stddev = sqrt(1/N (\Sum n_i^2) - avg(n)^2) + */ +static double stddev_stats(struct stats *stats) +{ + double avg = stats->sum / run_count; -static u64 walltime_nsecs_avg; -static u64 walltime_nsecs_noise; + return sqrt(stats->sum_sq/run_count - avg*avg); +} -static u64 runtime_cycles_avg; -static u64 runtime_cycles_noise; +struct stats event_res_stats[MAX_COUNTERS][3]; +struct stats event_scaled_stats[MAX_COUNTERS]; +struct stats runtime_nsecs_stats; +struct stats walltime_nsecs_stats; +struct stats runtime_cycles_stats; #define MATCH_EVENT(t, c, counter) \ (attrs[counter].type == PERF_TYPE_##t && \ @@ -278,42 +291,37 @@ static int run_perf_stat(int argc __used, const char **argv) return WEXITSTATUS(status); } -static void print_noise(u64 *count, u64 *noise) +static void print_noise(double avg, double stddev) { if (run_count > 1) - fprintf(stderr, " ( +- %7.3f%% )", - (double)noise[0]/(count[0]+1)*100.0); + fprintf(stderr, " ( +- %7.3f%% )", 100*stddev / avg); } -static void nsec_printout(int counter, u64 *count, u64 *noise) +static void nsec_printout(int counter, double avg, double stddev) { - double msecs = (double)count[0] / 1000000; + double msecs = avg / 1e6; fprintf(stderr, " %14.6f %-24s", msecs, event_name(counter)); if (MATCH_EVENT(SOFTWARE, SW_TASK_CLOCK, counter)) { - if (walltime_nsecs_avg) - fprintf(stderr, " # %10.3f CPUs ", - (double)count[0] / (double)walltime_nsecs_avg); + fprintf(stderr, " # %10.3f CPUs ", + avg / avg_stats(&walltime_nsecs_stats)); } - print_noise(count, noise); + print_noise(avg, stddev); } -static void abs_printout(int counter, u64 *count, u64 *noise) +static void abs_printout(int counter, double avg, double stddev) { - fprintf(stderr, " %14Ld %-24s", count[0], event_name(counter)); + fprintf(stderr, " %14.0f %-24s", avg, event_name(counter)); - if (runtime_cycles_avg && - MATCH_EVENT(HARDWARE, HW_INSTRUCTIONS, counter)) { + if (MATCH_EVENT(HARDWARE, HW_INSTRUCTIONS, counter)) { fprintf(stderr, " # %10.3f IPC ", - (double)count[0] / (double)runtime_cycles_avg); + avg / avg_stats(&runtime_cycles_stats)); } else { - if (runtime_nsecs_avg) { - fprintf(stderr, " # %10.3f M/sec", - (double)count[0]/runtime_nsecs_avg*1000.0); - } + fprintf(stderr, " # %10.3f M/sec", + 1000.0 * avg / avg_stats(&runtime_nsecs_stats)); } - print_noise(count, noise); + print_noise(avg, stddev); } /* @@ -321,12 +329,12 @@ static void abs_printout(int counter, u64 *count, u64 *noise) */ static void print_counter(int counter) { - u64 *count, *noise; + double avg, stddev; int scaled; - count = event_res_avg[counter]; - noise = event_res_noise[counter]; - scaled = event_scaled_avg[counter]; + avg = avg_stats(&event_res_stats[counter][0]); + stddev = stddev_stats(&event_res_stats[counter][0]); + scaled = avg_stats(&event_scaled_stats[counter]); if (scaled == -1) { fprintf(stderr, " %14s %-24s\n", @@ -335,36 +343,34 @@ static void print_counter(int counter) } if (nsec_counter(counter)) - nsec_printout(counter, count, noise); + nsec_printout(counter, avg, stddev); else - abs_printout(counter, count, noise); + abs_printout(counter, avg, stddev); + + if (scaled) { + double avg_enabled, avg_running; + + avg_enabled = avg_stats(&event_res_stats[counter][1]); + avg_running = avg_stats(&event_res_stats[counter][2]); - if (scaled) fprintf(stderr, " (scaled from %.2f%%)", - (double) count[2] / count[1] * 100); + 100 * avg_running / avg_enabled); + } fprintf(stderr, "\n"); } -/* - * normalize_noise noise values down to stddev: - */ -static void normalize_noise(u64 *val) +static void update_stats(const char *name, int idx, struct stats *stats, u64 *val) { - double res; + double sq = *val; - res = (double)*val / (run_count * sqrt((double)run_count)); - - *val = (u64)res; -} - -static void update_avg(const char *name, int idx, u64 *avg, u64 *val) -{ - *avg += *val; + stats->sum += *val; + stats->sum_sq += sq * sq; if (verbose > 1) fprintf(stderr, "debug: %20s[%d]: %Ld\n", name, idx, *val); } + /* * Calculate the averages and noises: */ @@ -376,61 +382,22 @@ static void calc_avg(void) fprintf(stderr, "\n"); for (i = 0; i < run_count; i++) { - update_avg("runtime", 0, &runtime_nsecs_avg, runtime_nsecs + i); - update_avg("walltime", 0, &walltime_nsecs_avg, walltime_nsecs + i); - update_avg("runtime_cycles", 0, &runtime_cycles_avg, runtime_cycles + i); + update_stats("runtime", 0, &runtime_nsecs_stats, runtime_nsecs + i); + update_stats("walltime", 0, &walltime_nsecs_stats, walltime_nsecs + i); + update_stats("runtime_cycles", 0, &runtime_cycles_stats, runtime_cycles + i); for (j = 0; j < nr_counters; j++) { - update_avg("counter/0", j, - event_res_avg[j]+0, event_res[i][j]+0); - update_avg("counter/1", j, - event_res_avg[j]+1, event_res[i][j]+1); - update_avg("counter/2", j, - event_res_avg[j]+2, event_res[i][j]+2); + update_stats("counter/0", j, + event_res_stats[j]+0, event_res[i][j]+0); + update_stats("counter/1", j, + event_res_stats[j]+1, event_res[i][j]+1); + update_stats("counter/2", j, + event_res_stats[j]+2, event_res[i][j]+2); if (event_scaled[i][j] != (u64)-1) - update_avg("scaled", j, - event_scaled_avg + j, event_scaled[i]+j); - else - event_scaled_avg[j] = -1; + update_stats("scaled", j, + event_scaled_stats + j, event_scaled[i]+j); } } - runtime_nsecs_avg /= run_count; - walltime_nsecs_avg /= run_count; - runtime_cycles_avg /= run_count; - - for (j = 0; j < nr_counters; j++) { - event_res_avg[j][0] /= run_count; - event_res_avg[j][1] /= run_count; - event_res_avg[j][2] /= run_count; - } - - for (i = 0; i < run_count; i++) { - runtime_nsecs_noise += - abs((s64)(runtime_nsecs[i] - runtime_nsecs_avg)); - walltime_nsecs_noise += - abs((s64)(walltime_nsecs[i] - walltime_nsecs_avg)); - runtime_cycles_noise += - abs((s64)(runtime_cycles[i] - runtime_cycles_avg)); - - for (j = 0; j < nr_counters; j++) { - event_res_noise[j][0] += - abs((s64)(event_res[i][j][0] - event_res_avg[j][0])); - event_res_noise[j][1] += - abs((s64)(event_res[i][j][1] - event_res_avg[j][1])); - event_res_noise[j][2] += - abs((s64)(event_res[i][j][2] - event_res_avg[j][2])); - } - } - - normalize_noise(&runtime_nsecs_noise); - normalize_noise(&walltime_nsecs_noise); - normalize_noise(&runtime_cycles_noise); - - for (j = 0; j < nr_counters; j++) { - normalize_noise(&event_res_noise[j][0]); - normalize_noise(&event_res_noise[j][1]); - normalize_noise(&event_res_noise[j][2]); - } } static void print_stat(int argc, const char **argv) @@ -457,10 +424,11 @@ static void print_stat(int argc, const char **argv) fprintf(stderr, "\n"); fprintf(stderr, " %14.9f seconds time elapsed", - (double)walltime_nsecs_avg/1e9); + avg_stats(&walltime_nsecs_stats)/1e9); if (run_count > 1) { fprintf(stderr, " ( +- %7.3f%% )", - 100.0*(double)walltime_nsecs_noise/(double)walltime_nsecs_avg); + 100*stddev_stats(&walltime_nsecs_stats) / + avg_stats(&walltime_nsecs_stats)); } fprintf(stderr, "\n\n"); } diff --git a/tools/perf/util/module.c b/tools/perf/util/module.c index ddabe925d65d..702083d342ff 100644 --- a/tools/perf/util/module.c +++ b/tools/perf/util/module.c @@ -422,7 +422,7 @@ static int mod_dso__load_module_paths(struct mod_dso *self) len += strlen(uts.release); len += strlen("/modules.dep"); - path = calloc(1, len); + path = calloc(1, len + 1); if (path == NULL) goto out_failure; diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c index 1150c6d5c7b8..5f3980525191 100644 --- a/virt/kvm/ioapic.c +++ b/virt/kvm/ioapic.c @@ -188,6 +188,8 @@ int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level) if ((edge && old_irr != ioapic->irr) || (!edge && !entry.fields.remote_irr)) ret = ioapic_service(ioapic, irq); + else + ret = 0; /* report coalesced interrupt */ } } return ret; diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 2884baf1d5f9..198c750aa851 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2590,8 +2590,6 @@ int kvm_init(void *opaque, unsigned int vcpu_size, int r; int cpu; - kvm_init_debug(); - r = kvm_arch_init(opaque); if (r) goto out_fail; @@ -2658,6 +2656,8 @@ int kvm_init(void *opaque, unsigned int vcpu_size, kvm_preempt_ops.sched_in = kvm_sched_in; kvm_preempt_ops.sched_out = kvm_sched_out; + kvm_init_debug(); + return 0; out_free: @@ -2679,7 +2679,6 @@ out_free_0: __free_page(bad_page); out: kvm_arch_exit(); - kvm_exit_debug(); out_fail: return r; } @@ -2688,6 +2687,7 @@ EXPORT_SYMBOL_GPL(kvm_init); void kvm_exit(void) { kvm_trace_cleanup(); + kvm_exit_debug(); misc_deregister(&kvm_dev); kmem_cache_destroy(kvm_vcpu_cache); sysdev_unregister(&kvm_sysdev); @@ -2697,7 +2697,6 @@ void kvm_exit(void) on_each_cpu(hardware_disable, NULL, 1); kvm_arch_hardware_unsetup(); kvm_arch_exit(); - kvm_exit_debug(); free_cpumask_var(cpus_hardware_enabled); __free_page(bad_page); } |