From d4db749fd7871921ff4a6aeb6e9631c641851998 Mon Sep 17 00:00:00 2001 From: kaloz Date: Tue, 9 Feb 2010 00:11:50 +0000 Subject: [PATCH 01/44] [pxa]: upgrade to 2.6.32.7, switch to squashfs, remove broken flag git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19562 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/pxa/Makefile | 6 +- target/linux/pxa/config-default | 246 +- target/linux/pxa/image/Makefile | 10 +- .../001-pxa-regs-additions.patch | 26 - .../linux/pxa/patches-2.6.21/002-header.patch | 168 - .../pxa/patches-2.6.21/003-arch-config.patch | 58 - .../pxa/patches-2.6.21/004-board-init.patch | 79 - .../patches-2.6.21/005-compact-flash.patch | 283 - .../pxa/patches-2.6.21/006-defconfig.patch | 764 -- .../linux/pxa/patches-2.6.21/007-flash.patch | 165 - .../pxa/patches-2.6.21/008-pxa2xx_udc.patch | 63 - .../patches-2.6.21/009-bkpxa-pxa-cpu.patch | 113 - .../010-bkpxa-pxa-cpufreq.patch | 395 - .../pxa/patches-2.6.21/011-proc-gpio.patch | 318 - .../012-serial-ether-addr.patch | 60 - .../013-cpufreq-better-freqs.patch | 51 - .../patches-2.6.21/014-ethernet-config.patch | 24 - .../patches-2.6.21/015-smc-ether-addr.patch | 60 - .../016-cpufreq-ondemand-by-default.patch | 38 - .../017-modular-init-bluetooth.patch | 100 - .../018-modular-init-smc91x.patch | 195 - .../019-modular-init-usb-gadget.patch | 98 - .../020-bugfix-i2c-include.patch | 10 - .../patches-2.6.21/021-bugfix-mmc-clock.patch | 12 - .../022-bugfix-pxa-cpufreq.patch | 62 - .../023-bugfix-serial-interrupt.patch | 23 - .../024-bugfix-serial-register-status.patch | 67 - .../patches-2.6.21/025-mach-types-fix.patch | 11 - .../026-pcm-gcc-411-bugfix.patch | 54 - .../027-ucb1400-ac97-audio.patch | 294 - .../pxa/patches-2.6.21/028-gumstix-asoc.patch | 212 - .../029-disable-uncompress-message.patch | 30 - .../patches-2.6.21/030-serial-divisor.patch | 29 - .../patches-2.6.21/031-mmc-card-detect.patch | 76 - .../032-misalignment-handling.patch | 34 - .../033-compile-fix-pxa_cpufreq.patch | 11 - .../034-ramfs-mode-support.patch | 86 - .../patches-2.6.21/035-pxafb-definition.patch | 174 - .../036-270-usb-gadget-udc.patch | 2731 ---- .../037-gumstix-pxa270-usb-host.patch | 356 - .../patches-2.6.21/038-cpufreq-fixup.patch | 22 - .../patches-2.6.21/040-pxa-regs-fixup.patch | 10 - .../patches-2.6.21/041-gumstix-fb-logo.patch | 10453 ---------------- .../042-gumstix-pxa270-mmc.patch | 31 - .../patches-2.6.21/043-pxafb-18bpp-mode.patch | 415 - .../patches-2.6.21/044-smc911x-fixup.patch | 371 - target/linux/pxa/patches/000-cpufreq.patch | 533 - .../001-gumstix_verdex_pro_arch_support.patch | 837 ++ target/linux/pxa/patches/001-pm.patch | 869 -- target/linux/pxa/patches/002-usb_gadget.patch | 58 - .../pxa/patches/002-verdex_lcd_support.patch | 52 + .../003-gumstix_h_verdex_pro_support.patch | 211 + target/linux/pxa/patches/004-skbuf_hack.patch | 10 - .../004-smsc911x_verdex_pro_support.patch | 102 + target/linux/pxa/patches/005-mtd.patch | 111 - .../patches/005-verdex_pcmcia_support.patch | 234 + .../006-define_smsc911x_for_pcmcia.patch | 37 + ...07-fix_verdex_pro_mmc_initialization.patch | 30 + .../pxa/patches/008-verdex_mtd_support.patch | 57 + 59 files changed, 1655 insertions(+), 20380 deletions(-) delete mode 100644 target/linux/pxa/patches-2.6.21/001-pxa-regs-additions.patch delete mode 100644 target/linux/pxa/patches-2.6.21/002-header.patch delete mode 100644 target/linux/pxa/patches-2.6.21/003-arch-config.patch delete mode 100644 target/linux/pxa/patches-2.6.21/004-board-init.patch delete mode 100644 target/linux/pxa/patches-2.6.21/005-compact-flash.patch delete mode 100644 target/linux/pxa/patches-2.6.21/006-defconfig.patch delete mode 100644 target/linux/pxa/patches-2.6.21/007-flash.patch delete mode 100644 target/linux/pxa/patches-2.6.21/008-pxa2xx_udc.patch delete mode 100644 target/linux/pxa/patches-2.6.21/009-bkpxa-pxa-cpu.patch delete mode 100644 target/linux/pxa/patches-2.6.21/010-bkpxa-pxa-cpufreq.patch delete mode 100644 target/linux/pxa/patches-2.6.21/011-proc-gpio.patch delete mode 100644 target/linux/pxa/patches-2.6.21/012-serial-ether-addr.patch delete mode 100644 target/linux/pxa/patches-2.6.21/013-cpufreq-better-freqs.patch delete mode 100644 target/linux/pxa/patches-2.6.21/014-ethernet-config.patch delete mode 100644 target/linux/pxa/patches-2.6.21/015-smc-ether-addr.patch delete mode 100644 target/linux/pxa/patches-2.6.21/016-cpufreq-ondemand-by-default.patch delete mode 100644 target/linux/pxa/patches-2.6.21/017-modular-init-bluetooth.patch delete mode 100644 target/linux/pxa/patches-2.6.21/018-modular-init-smc91x.patch delete mode 100644 target/linux/pxa/patches-2.6.21/019-modular-init-usb-gadget.patch delete mode 100644 target/linux/pxa/patches-2.6.21/020-bugfix-i2c-include.patch delete mode 100644 target/linux/pxa/patches-2.6.21/021-bugfix-mmc-clock.patch delete mode 100644 target/linux/pxa/patches-2.6.21/022-bugfix-pxa-cpufreq.patch delete mode 100644 target/linux/pxa/patches-2.6.21/023-bugfix-serial-interrupt.patch delete mode 100644 target/linux/pxa/patches-2.6.21/024-bugfix-serial-register-status.patch delete mode 100644 target/linux/pxa/patches-2.6.21/025-mach-types-fix.patch delete mode 100644 target/linux/pxa/patches-2.6.21/026-pcm-gcc-411-bugfix.patch delete mode 100644 target/linux/pxa/patches-2.6.21/027-ucb1400-ac97-audio.patch delete mode 100644 target/linux/pxa/patches-2.6.21/028-gumstix-asoc.patch delete mode 100644 target/linux/pxa/patches-2.6.21/029-disable-uncompress-message.patch delete mode 100644 target/linux/pxa/patches-2.6.21/030-serial-divisor.patch delete mode 100644 target/linux/pxa/patches-2.6.21/031-mmc-card-detect.patch delete mode 100644 target/linux/pxa/patches-2.6.21/032-misalignment-handling.patch delete mode 100644 target/linux/pxa/patches-2.6.21/033-compile-fix-pxa_cpufreq.patch delete mode 100644 target/linux/pxa/patches-2.6.21/034-ramfs-mode-support.patch delete mode 100644 target/linux/pxa/patches-2.6.21/035-pxafb-definition.patch delete mode 100644 target/linux/pxa/patches-2.6.21/036-270-usb-gadget-udc.patch delete mode 100644 target/linux/pxa/patches-2.6.21/037-gumstix-pxa270-usb-host.patch delete mode 100644 target/linux/pxa/patches-2.6.21/038-cpufreq-fixup.patch delete mode 100644 target/linux/pxa/patches-2.6.21/040-pxa-regs-fixup.patch delete mode 100644 target/linux/pxa/patches-2.6.21/041-gumstix-fb-logo.patch delete mode 100644 target/linux/pxa/patches-2.6.21/042-gumstix-pxa270-mmc.patch delete mode 100644 target/linux/pxa/patches-2.6.21/043-pxafb-18bpp-mode.patch delete mode 100644 target/linux/pxa/patches-2.6.21/044-smc911x-fixup.patch delete mode 100644 target/linux/pxa/patches/000-cpufreq.patch create mode 100644 target/linux/pxa/patches/001-gumstix_verdex_pro_arch_support.patch delete mode 100644 target/linux/pxa/patches/001-pm.patch delete mode 100644 target/linux/pxa/patches/002-usb_gadget.patch create mode 100644 target/linux/pxa/patches/002-verdex_lcd_support.patch create mode 100644 target/linux/pxa/patches/003-gumstix_h_verdex_pro_support.patch delete mode 100644 target/linux/pxa/patches/004-skbuf_hack.patch create mode 100644 target/linux/pxa/patches/004-smsc911x_verdex_pro_support.patch delete mode 100644 target/linux/pxa/patches/005-mtd.patch create mode 100644 target/linux/pxa/patches/005-verdex_pcmcia_support.patch create mode 100644 target/linux/pxa/patches/006-define_smsc911x_for_pcmcia.patch create mode 100644 target/linux/pxa/patches/007-fix_verdex_pro_mmc_initialization.patch create mode 100644 target/linux/pxa/patches/008-verdex_mtd_support.patch diff --git a/target/linux/pxa/Makefile b/target/linux/pxa/Makefile index 3f95fb558..f63a1f32a 100644 --- a/target/linux/pxa/Makefile +++ b/target/linux/pxa/Makefile @@ -1,5 +1,5 @@ # -# Copyright (C) 2006-2009 OpenWrt.org +# Copyright (C) 2006-2010 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -9,9 +9,9 @@ include $(TOPDIR)/rules.mk ARCH:=arm BOARD:=pxa BOARDNAME:=Marvell/Intel PXA2xx -FEATURES:=jffs2 broken +FEATURES:=squashfs -LINUX_VERSION:=2.6.21.7 +LINUX_VERSION:=2.6.32.7 include $(INCLUDE_DIR)/target.mk diff --git a/target/linux/pxa/config-default b/target/linux/pxa/config-default index f7056d672..7ddc41685 100644 --- a/target/linux/pxa/config-default +++ b/target/linux/pxa/config-default @@ -1,240 +1,168 @@ -CONFIG_AC97_BUS=m # CONFIG_AEABI is not set -# CONFIG_AIRO_CS is not set -CONFIG_ALIGNMENT_HANDLING=0x2 CONFIG_ALIGNMENT_TRAP=y CONFIG_APM_EMULATION=m -# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set -# CONFIG_ARCH_GUMSTIX_F is not set -# CONFIG_ARCH_GUMSTIX_ORIG is not set -CONFIG_ARCH_GUMSTIX_VERDEX=y CONFIG_ARCH_GUMSTIX=y -# CONFIG_ARCH_HAS_ILOG2_U32 is not set -# CONFIG_ARCH_HAS_ILOG2_U64 is not set # CONFIG_ARCH_LUBBOCK is not set CONFIG_ARCH_MTD_XIP=y -# CONFIG_ARCH_PXA_IDP is not set CONFIG_ARCH_PXA=y -# CONFIG_ARM_THUMB is not set +# CONFIG_ARCH_PXA_ESERIES is not set +# CONFIG_ARCH_PXA_IDP is not set +# CONFIG_ARCH_PXA_PALM is not set +CONFIG_ARCH_REQUIRE_GPIOLIB=y +# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set +# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set +# CONFIG_ARCH_SUPPORTS_MSI is not set +CONFIG_ARCH_SUSPEND_POSSIBLE=y +# CONFIG_ARCH_VIPER is not set CONFIG_ARM=y +# CONFIG_ARM_THUMB is not set # CONFIG_ARPD is not set -# CONFIG_ARTHUR is not set CONFIG_ATA=m -# CONFIG_ATM is not set -# CONFIG_BINFMT_AOUT is not set CONFIG_BITREVERSE=y -# CONFIG_BLK_DEV_CRYPTOLOOP is not set -# CONFIG_BLK_DEV_HD is not set CONFIG_BLK_DEV_IDECS=m -CONFIG_BLK_DEV_IDEDISK=m # CONFIG_BLK_DEV_IDEDMA is not set -CONFIG_BLK_DEV_IDE=m # CONFIG_BLK_DEV_INITRD is not set -# CONFIG_BONDING is not set -# CONFIG_BSD_DISKLABEL is not set # CONFIG_BSD_PROCESS_ACCT is not set -CONFIG_BT_GUMSTIX=m -# CONFIG_CIFS is not set -CONFIG_CMDLINE="console=ttyS0,115200n8" -CONFIG_CPU_32v5=y +CONFIG_CMDLINE="rootfstype=squashfs,jffs2 noinitrd console=ttyS0,115200" +CONFIG_COMMON_CLKDEV=y CONFIG_CPU_32=y +CONFIG_CPU_32v5=y CONFIG_CPU_ABRT_EV5T=y CONFIG_CPU_CACHE_VIVT=y -CONFIG_CPU_CP15_MMU=y CONFIG_CPU_CP15=y -# CONFIG_CPU_DCACHE_DISABLE is not set +CONFIG_CPU_CP15_MMU=y +CONFIG_CPU_PABRT_NOIFAR=y CONFIG_CPU_TLB_V4WBI=y CONFIG_CPU_XSCALE=y # CONFIG_DEBUG_USER is not set +CONFIG_DECOMPRESS_LZMA=y # CONFIG_DM9000 is not set -CONFIG_DUMMY_CONSOLE=y CONFIG_ENABLE_MUST_CHECK=y # CONFIG_EPOLL is not set -# CONFIG_EXT2_FS is not set -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_IMAGEBLIT=y -# CONFIG_FB_PXA_ALPS_CDOLLAR is not set -# CONFIG_FB_PXA_NONEOFTHEABOVE is not set -CONFIG_FB_PXA_PARAMETERS=y -CONFIG_FB_PXA_SAMSUNG_LTE430WQ_F0C=y -# CONFIG_FB_PXA_SHARP_LQ043_PSP is not set -CONFIG_FB_PXA=y -CONFIG_FB_TILEBLITTING=y -CONFIG_FB=y -# CONFIG_FIRMWARE_EDID is not set -# CONFIG_FONT_10x18 is not set -CONFIG_FONT_6x11=y -# CONFIG_FONT_7x14 is not set -# CONFIG_FONT_8x16 is not set -# CONFIG_FONT_8x8 is not set -# CONFIG_FONT_ACORN_8x8 is not set -# CONFIG_FONT_MINI_4x6 is not set -# CONFIG_FONT_PEARL_8x8 is not set -# CONFIG_FONT_SUN12x22 is not set -# CONFIG_FONT_SUN8x16 is not set -CONFIG_FONTS=y # CONFIG_FPE_FASTFPE is not set # CONFIG_FPE_NWFPE is not set -CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y -CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAME_POINTER=y -CONFIG_FS_POSIX_ACL=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_GPIO=y +CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y +CONFIG_GPIOLIB=y # CONFIG_HAMRADIO is not set CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_HAS_DMA=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT=y -# CONFIG_HERMES is not set -# CONFIG_HFS_FS is not set -# CONFIG_HFSPLUS_FS is not set -CONFIG_HID=m -CONFIG_HW_CONSOLE=y +CONFIG_HAVE_AOUT=y +CONFIG_HAVE_ARCH_KGDB=y +CONFIG_HAVE_CLK=y +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_GENERIC_DMA_COHERENT=y +CONFIG_HAVE_IDE=y +CONFIG_HAVE_KERNEL_GZIP=y +CONFIG_HAVE_KERNEL_LZMA=y +CONFIG_HAVE_KERNEL_LZO=y +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_LATENCYTOP_SUPPORT=y +CONFIG_HAVE_OPROFILE=y # CONFIG_HW_RANDOM is not set -# CONFIG_I2C_ALGOBIT is not set -CONFIG_I2C_CHARDEV=m CONFIG_I2C=m +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_CHARDEV=m +# CONFIG_I2C_DESIGNWARE is not set CONFIG_I2C_PXA=m CONFIG_I2C_PXA_SLAVE=y -# CONFIG_IDE_ARM is not set -CONFIG_IDE_GENERIC=m CONFIG_IDE=m -# CONFIG_IEEE80211_SOFTMAC is not set -# CONFIG_IFB is not set -# CONFIG_INET_DIAG is not set -CONFIG_INOTIFY_USER=y CONFIG_INOTIFY=y -CONFIG_INPUT_KEYBOARD=y -CONFIG_INPUT_MOUSE=y -CONFIG_INPUT_TOUCHSCREEN=y -CONFIG_INPUT_TSDEV=m -CONFIG_INPUT_TSDEV_SCREEN_X=480 -CONFIG_INPUT_TSDEV_SCREEN_Y=272 -CONFIG_INPUT=y -CONFIG_IP_NF_TARGET_MASQUERADE=m -CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_INOTIFY_USER=y # CONFIG_ISDN is not set -# CONFIG_ISO9660_FS is not set CONFIG_IWMMXT=y -CONFIG_KEYBOARD_ATKBD=m -# CONFIG_KEYBOARD_GPIO is not set -# CONFIG_KEYBOARD_LKKBD is not set -# CONFIG_KEYBOARD_NEWTON is not set -# CONFIG_KEYBOARD_STOWAWAY is not set -# CONFIG_KEYBOARD_SUNKBD is not set -# CONFIG_KEYBOARD_XTKBD is not set -# CONFIG_LLC2 is not set -CONFIG_LOGO_LINUX_CLUT224=y -# CONFIG_LOGO_LINUX_MONO is not set -# CONFIG_LOGO_LINUX_VGA16 is not set -CONFIG_LOGO=y +# CONFIG_KERNEL_BZIP2 is not set +# CONFIG_LEDS_GPIO is not set +CONFIG_MAC80211_DEFAULT_PS_VALUE=0 +# CONFIG_MACH_ARMCORE is not set +# CONFIG_MACH_BALLOON3 is not set +# CONFIG_MACH_CM_X300 is not set +# CONFIG_MACH_COLIBRI is not set +# CONFIG_MACH_COLIBRI300 is not set +# CONFIG_MACH_COLIBRI320 is not set +# CONFIG_MACH_CSB726 is not set +# CONFIG_MACH_EM_X270 is not set +# CONFIG_MACH_EXEDA is not set +# CONFIG_MACH_GUMSTIX_F is not set +CONFIG_MACH_GUMSTIX_VERDEX=y +# CONFIG_MACH_H4700 is not set +# CONFIG_MACH_H5000 is not set +# CONFIG_MACH_HIMALAYA is not set +# CONFIG_MACH_INTELMOTE2 is not set +# CONFIG_MACH_LITTLETON is not set # CONFIG_MACH_LOGICPD_PXA270 is not set +# CONFIG_MACH_MAGICIAN is not set # CONFIG_MACH_MAINSTONE is not set -# CONFIG_MACH_TRIZEPS4 is not set +# CONFIG_MACH_MIOA701 is not set +# CONFIG_MACH_MP900C is not set +# CONFIG_MACH_PCM027 is not set +# CONFIG_MACH_SAAR is not set +# CONFIG_MACH_STARGATE2 is not set +# CONFIG_MACH_TAVOREVB is not set +# CONFIG_MACH_XCEP is not set +# CONFIG_MACH_ZYLONITE is not set +# CONFIG_MFD_T7L66XB is not set CONFIG_MII=m -# CONFIG_MINIX_FS is not set +CONFIG_MMC=y CONFIG_MMC_BLOCK=y CONFIG_MMC_PXA=y -CONFIG_MMC=y -CONFIG_MOUSE_PS2=m -# CONFIG_MOUSE_SERIAL is not set -# CONFIG_MOUSE_VSXXXAA is not set CONFIG_MTD_CFI_ADV_OPTIONS=y # CONFIG_MTD_CFI_AMDSTD is not set CONFIG_MTD_CFI_GEOMETRY=y # CONFIG_MTD_CFI_I2 is not set -CONFIG_MTD_GUMSTIX=y # CONFIG_MTD_MAP_BANK_WIDTH_1 is not set # CONFIG_MTD_MAP_BANK_WIDTH_4 is not set -# CONFIG_MTD_OBSOLETE_CHIPS is not set -# CONFIG_MTD_SHARP_SL is not set +CONFIG_MTD_PHYSMAP=y +CONFIG_MTD_PXA2XX=y # CONFIG_MTD_XIP is not set -# CONFIG_NETFILTER_XT_TARGET_TARPIT is not set -CONFIG_NET_SCH_FIFO=y -CONFIG_NO_IDLE_HZ=y -# CONFIG_NO_IOPORT is not set -# CONFIG_OUTER_CACHE is not set # CONFIG_PACKET is not set +CONFIG_PAGEFLAGS_EXTENDED=y +CONFIG_PAGE_OFFSET=0xC0000000 CONFIG_PATA_PCMCIA=m -# CONFIG_PATA_PLATFORM is not set CONFIG_PCCARD=m -CONFIG_PCMCIA_LOAD_CIS=y +# CONFIG_PCI_SYSCALL is not set CONFIG_PCMCIA=m +CONFIG_PCMCIA_LOAD_CIS=y CONFIG_PCMCIA_PXA2XX=m -# CONFIG_PM_DEBUG is not set -# CONFIG_PM_LEGACY is not set -# CONFIG_PM_SYSFS_DEPRECATED is not set +CONFIG_PLAT_PXA=y CONFIG_PM=y -# CONFIG_PNPACPI is not set -# CONFIG_PROC_GPIO_DEBUG is not set -CONFIG_PROC_GPIO=m +# CONFIG_PM_DEBUG is not set +# CONFIG_PM_RUNTIME is not set CONFIG_PXA27x=y +# CONFIG_PXA_EZX is not set # CONFIG_PXA_SHARPSL is not set CONFIG_SA1100_WATCHDOG=m +CONFIG_SCSI=m # CONFIG_SCSI_MULTI_LUN is not set # CONFIG_SCSI_PROC_FS is not set +# CONFIG_SDIO_UART is not set # CONFIG_SERIAL_8250 is not set -CONFIG_SERIAL_PXA_CONSOLE=y CONFIG_SERIAL_PXA=y -CONFIG_SERIO_LIBPS2=m +CONFIG_SERIAL_PXA_CONSOLE=y CONFIG_SERIO=m +CONFIG_SERIO_LIBPS2=m # CONFIG_SERIO_RAW is not set CONFIG_SERIO_SERPORT=m -CONFIG_SMC911X_GUMSTIX=m +CONFIG_SMSC911X=y CONFIG_SMC911X=m -CONFIG_SMC91X_GUMSTIX=m CONFIG_SMC91X=m -CONFIG_SND_AC97_CODEC=m -CONFIG_SND_PXA2XX_AC97=m -CONFIG_SND_PXA2XX_PCM=m -CONFIG_SND_PXA2XX_SOC_AC97=m -CONFIG_SND_PXA2XX_SOC_GUMSTIX=m -CONFIG_SND_PXA2XX_SOC=m -CONFIG_SND_SOC_AC97_BUS=y -CONFIG_SND_SOC_AC97_CODEC=m -CONFIG_SND_SOC=m -# CONFIG_SND_USB_AUDIO is not set -# CONFIG_SND_VERBOSE_PROCFS is not set CONFIG_SPLIT_PTLOCK_CPUS=4096 +# CONFIG_SUSPEND is not set # CONFIG_SYSCTL_SYSCALL is not set CONFIG_SYS_SUPPORTS_APM_EMULATION=y -CONFIG_TOUCHSCREEN_UCB1400=m -# CONFIG_UDF_FS is not set +# CONFIG_TRIZEPS_PXA is not set CONFIG_UID16=y CONFIG_UNIX=m -# CONFIG_UNUSED_SYMBOLS is not set -# CONFIG_USB_ARCH_HAS_EHCI is not set -# CONFIG_USB_CATC is not set -# CONFIG_USB_GTCO is not set -# CONFIG_USB_KAWETH is not set -# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set -# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set -CONFIG_USB_OHCI_HCD=m -# CONFIG_USBPCWATCHDOG is not set -# CONFIG_USB_PEGASUS is not set -# CONFIG_USB_SERIAL is not set -# CONFIG_USB_STORAGE_ALAUDA is not set -# CONFIG_USB_STORAGE_DATAFAB is not set -# CONFIG_USB_STORAGE_DPCM is not set -# CONFIG_USB_STORAGE_FREECOM is not set -# CONFIG_USB_STORAGE_JUMPSHOT is not set -# CONFIG_USB_STORAGE_KARMA is not set -# CONFIG_USB_STORAGE_SDDR09 is not set -# CONFIG_USB_STORAGE_SDDR55 is not set -# CONFIG_USB_STORAGE_USBAT is not set -# CONFIG_USB_USBNET is not set -# CONFIG_USB_USBNET_MII is not set -# CONFIG_USB_YEALINK is not set CONFIG_VECTORS_BASE=0xffff0000 -# CONFIG_VGA_CONSOLE is not set -# CONFIG_VIDEO_DEV is not set # CONFIG_VLAN_8021Q is not set -CONFIG_VT_CONSOLE=y -CONFIG_VT_HW_CONSOLE_BINDING=y -CONFIG_VT=y -# CONFIG_XFRM_USER is not set -# CONFIG_XFS_FS is not set -# CONFIG_XIP_KERNEL is not set CONFIG_XSCALE_PMU=y CONFIG_ZBOOT_ROM_BSS=0x0 CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZONE_DMA_FLAG=0 diff --git a/target/linux/pxa/image/Makefile b/target/linux/pxa/image/Makefile index 64330b026..7b7fa3997 100644 --- a/target/linux/pxa/image/Makefile +++ b/target/linux/pxa/image/Makefile @@ -1,5 +1,5 @@ -# -# Copyright (C) 2008 OpenWrt.org +# +# Copyright (C) 2008-2010 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -20,16 +20,16 @@ define Image/Build endef define Image/Build/jffs2-64k - dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/openwrt-$(BOARD)-$(1).img bs=65536 conv=sync + dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/openwrt-$(BOARD)-$(1).img bs=64k conv=sync endef define Image/Build/jffs2-128k - dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/openwrt-$(BOARD)-$(1).img bs=131072 conv=sync + dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/openwrt-$(BOARD)-$(1).img bs=128k conv=sync endef define Image/Build/squashfs $(call prepare_generic_squashfs,$(KDIR)/root.squashfs) - dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/openwrt-$(BOARD)-$(1).img bs=131072 conv=sync + dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/openwrt-$(BOARD)-$(1).img bs=128k conv=sync endef $(eval $(call BuildImage)) diff --git a/target/linux/pxa/patches-2.6.21/001-pxa-regs-additions.patch b/target/linux/pxa/patches-2.6.21/001-pxa-regs-additions.patch deleted file mode 100644 index e6df68968..000000000 --- a/target/linux/pxa/patches-2.6.21/001-pxa-regs-additions.patch +++ /dev/null @@ -1,26 +0,0 @@ ---- a/include/asm-arm/arch-pxa/pxa-regs.h -+++ b/include/asm-arm/arch-pxa/pxa-regs.h -@@ -1316,6 +1316,7 @@ - #define GPIO77_LCD_ACBIAS 77 /* LCD AC Bias */ - #define GPIO78_nCS_2 78 /* chip select 2 */ - #define GPIO79_nCS_3 79 /* chip select 3 */ -+#define GPIO79_pSKTSEL 79 /* Socket Select for Card Space (PXA27x) */ - #define GPIO80_nCS_4 80 /* chip select 4 */ - #define GPIO81_NSCLK 81 /* NSSP clock */ - #define GPIO82_NSFRM 82 /* NSSP Frame */ -@@ -1324,6 +1325,7 @@ - #define GPIO85_nPCE_1 85 /* Card Enable for Card Space (PXA27x) */ - #define GPIO92_MMCDAT0 92 /* MMC DAT0 (PXA27x) */ - #define GPIO102_nPCE_1 102 /* PCMCIA (PXA27x) */ -+#define GPIO105_nPCE_2 105 /* Card Enable for Card Space (PXA27x) */ - #define GPIO109_MMCDAT1 109 /* MMC DAT1 (PXA27x) */ - #define GPIO110_MMCDAT2 110 /* MMC DAT2 (PXA27x) */ - #define GPIO110_MMCCS0 110 /* MMC Chip Select 0 (PXA27x) */ -@@ -1468,6 +1470,7 @@ - #define GPIO92_MMCDAT0_MD (92 | GPIO_ALT_FN_1_OUT) - #define GPIO102_nPCE_1_MD (102 | GPIO_ALT_FN_1_OUT) - #define GPIO104_pSKTSEL_MD (104 | GPIO_ALT_FN_1_OUT) -+#define GPIO105_nPCE_2_MD (105 | GPIO_ALT_FN_1_OUT) - #define GPIO109_MMCDAT1_MD (109 | GPIO_ALT_FN_1_OUT) - #define GPIO110_MMCDAT2_MD (110 | GPIO_ALT_FN_1_OUT) - #define GPIO110_MMCCS0_MD (110 | GPIO_ALT_FN_1_OUT) diff --git a/target/linux/pxa/patches-2.6.21/002-header.patch b/target/linux/pxa/patches-2.6.21/002-header.patch deleted file mode 100644 index 4fa7e7a9d..000000000 --- a/target/linux/pxa/patches-2.6.21/002-header.patch +++ /dev/null @@ -1,168 +0,0 @@ ---- /dev/null -+++ b/include/asm-arm/arch-pxa/gumstix.h -@@ -0,0 +1,165 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/gumstix.h -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+ -+ -+/* BTRESET - Reset line to Bluetooth module, active low signal. */ -+#define GPIO_GUMSTIX_BTRESET 7 -+#define GPIO_GUMSTIX_BTRESET_MD (GPIO_GUMSTIX_BTRESET | GPIO_OUT) -+ -+ -+/* GPIOn - Input from MAX823 (or equiv), normalizing USB +5V -+ into a clean interrupt signal for determining cable presence -+ On the original gumstix, this is GPIO81, and GPIO83 needs to be defined as well. -+ On the gumstix F, this moves to GPIO17 and GPIO37 */ -+/* GPIOx - Connects to USB D+ and used as a pull-up after GPIOn -+ has detected a cable insertion; driven low otherwise. */ -+ -+#ifdef CONFIG_ARCH_GUMSTIX_ORIG -+ -+#define GPIO_GUMSTIX_USB_GPIOn 81 -+#define GPIO_GUMSTIX_USB_GPIOx 83 -+ -+#else -+ -+#define GPIO_GUMSTIX_USB_GPIOn 35 -+#define GPIO_GUMSTIX_USB_GPIOx 41 -+ -+#endif -+ -+#define GUMSTIX_USB_INTR_IRQ IRQ_GPIO(GPIO_GUMSTIX_USB_GPIOn) /* usb state change */ -+#define GPIO_GUMSTIX_USB_GPIOn_MD (GPIO_GUMSTIX_USB_GPIOn | GPIO_IN) -+#define GPIO_GUMSTIX_USB_GPIOx_CON_MD (GPIO_GUMSTIX_USB_GPIOx | GPIO_OUT) -+#define GPIO_GUMSTIX_USB_GPIOx_DIS_MD (GPIO_GUMSTIX_USB_GPIOx | GPIO_IN) -+ -+ -+/* -+ * SMC Ethernet definitions -+ * ETH_RST provides a hardware reset line to the ethernet chip -+ * ETH is the IRQ line in from the ethernet chip to the PXA -+ */ -+#ifndef CONFIG_ARCH_GUMSTIX_VERDEX -+#define GPIO_GUMSTIX_ETH0_RST 80 -+#define GPIO_GUMSTIX_ETH0 36 -+#else -+#define GPIO_GUMSTIX_ETH0_RST 32 -+#define GPIO_GUMSTIX_ETH0 99 -+#endif -+#define GPIO_GUMSTIX_ETH1_RST 52 -+#define GPIO_GUMSTIX_ETH1 27 -+ -+#define GPIO_GUMSTIX_ETH0_RST_MD (GPIO_GUMSTIX_ETH0_RST | GPIO_OUT) -+#define GPIO_GUMSTIX_ETH1_RST_MD (GPIO_GUMSTIX_ETH1_RST | GPIO_OUT) -+#define GPIO_GUMSTIX_ETH0_MD (GPIO_GUMSTIX_ETH0 | GPIO_IN) -+#define GPIO_GUMSTIX_ETH1_MD (GPIO_GUMSTIX_ETH1 | GPIO_IN) -+ -+#define GUMSTIX_ETH0_IRQ IRQ_GPIO(GPIO_GUMSTIX_ETH0) -+#define GUMSTIX_ETH1_IRQ IRQ_GPIO(GPIO_GUMSTIX_ETH1) -+ -+ -+/* CF reset line */ -+#define GPIO8_CF_RESET 8 -+#define GPIO97_CF_RESET 97 -+#define GPIO110_CF_RESET 110 -+#ifndef CONFIG_ARCH_GUMSTIX_VERDEX -+#define GPIO_GUMSTIX_CF_RESET GPIO8_CF_RESET -+#else -+#define GPIO_GUMSTIX_CF_RESET GPIO97_CF_RESET -+#endif -+#define GPIO_GUMSTIX_CF_OLD_RESET GPIO110_CF_RESET -+ -+ -+/* CF signals shared by both sockets */ -+#define GPIO_GUMSTIX_nPOE GPIO48_nPOE -+#define GPIO_GUMSTIX_nPWE GPIO49_nPWE -+#define GPIO_GUMSTIX_nPIOR GPIO50_nPIOR -+#define GPIO_GUMSTIX_nPIOW GPIO51_nPIOW -+#ifndef CONFIG_ARCH_GUMSTIX_VERDEX -+#define GPIO_GUMSTIX_nPCE_1 GPIO52_nPCE_1 -+#define GPIO_GUMSTIX_nPCE_2 GPIO53_nPCE_2 -+#define GPIO_GUMSTIX_pSKTSEL GPIO54_pSKTSEL -+#else -+#define GPIO_GUMSTIX_nPCE_1 GPIO102_nPCE_1 -+#define GPIO_GUMSTIX_nPCE_2 GPIO105_nPCE_2 -+#define GPIO_GUMSTIX_pSKTSEL GPIO79_pSKTSEL -+#endif -+#define GPIO_GUMSTIX_nPREG GPIO55_nPREG -+#define GPIO_GUMSTIX_nPWAIT GPIO56_nPWAIT -+#define GPIO_GUMSTIX_nIOIS16 GPIO57_nIOIS16 -+ -+#define GPIO_GUMSTIX_nPOE_MD GPIO48_nPOE_MD -+#define GPIO_GUMSTIX_nPWE_MD GPIO49_nPWE_MD -+#define GPIO_GUMSTIX_nPIOR_MD GPIO50_nPIOR_MD -+#define GPIO_GUMSTIX_nPIOW_MD GPIO51_nPIOW_MD -+#ifndef CONFIG_ARCH_GUMSTIX_VERDEX -+#define GPIO_GUMSTIX_nPCE_1_MD GPIO52_nPCE_1_MD -+#define GPIO_GUMSTIX_nPCE_2_MD GPIO53_nPCE_2_MD -+#define GPIO_GUMSTIX_pSKTSEL_MD GPIO54_pSKTSEL_MD -+#else -+#define GPIO_GUMSTIX_nPCE_1_MD GPIO102_nPCE_1_MD -+#define GPIO_GUMSTIX_nPCE_2_MD GPIO105_nPCE_2_MD -+#define GPIO_GUMSTIX_pSKTSEL_MD GPIO79_pSKTSEL_MD -+#endif -+#define GPIO_GUMSTIX_nPREG_MD GPIO55_nPREG_MD -+#define GPIO_GUMSTIX_nPWAIT_MD GPIO56_nPWAIT_MD -+#define GPIO_GUMSTIX_nIOIS16_MD GPIO57_nIOIS16_MD -+ -+/* CF slot 0 */ -+#define GPIO4_nBVD1_0 4 -+#define GPIO4_nSTSCHG_0 GPIO4_nBVD1_0 -+#define GPIO11_nCD_0 11 -+#define GPIO26_PRDY_nBSY_0 26 -+ -+#define GPIO111_nBVD1_0 111 -+#define GPIO111_nSTSCHG_0 GPIO111_nBVD1_0 -+#define GPIO104_nCD_0 104 -+#define GPIO96_PRDY_nBSY_0 96 -+#define GPIO109_PRDY_nBSY_0 109 -+ -+#ifndef CONFIG_ARCH_GUMSTIX_VERDEX -+#define GPIO_GUMSTIX_nBVD1_0 GPIO4_nBVD1_0 -+#define GPIO_GUMSTIX_nSTSCHG_0 GPIO4_nSTSCHG_0 -+#define GPIO_GUMSTIX_nCD_0 GPIO11_nCD_0 -+#define GPIO_GUMSTIX_PRDY_nBSY_0 GPIO26_PRDY_nBSY_0 -+#else -+#define GPIO_GUMSTIX_nBVD1_0 GPIO111_nBVD1_0 -+#define GPIO_GUMSTIX_nSTSCHG_0 GPIO111_nSTSCHG_0 -+#define GPIO_GUMSTIX_nCD_0 GPIO104_nCD_0 -+#define GPIO_GUMSTIX_PRDY_nBSY_0 GPIO96_PRDY_nBSY_0 -+#endif -+#define GPIO_GUMSTIX_PRDY_nBSY_0_OLD GPIO109_PRDY_nBSY_0 -+ -+#define GUMSTIX_S0_nSTSCHG_IRQ IRQ_GPIO(GPIO_GUMSTIX_nSTSCHG_0) -+#define GUMSTIX_S0_nCD_IRQ IRQ_GPIO(GPIO_GUMSTIX_nCD_0) -+#define GUMSTIX_S0_PRDY_nBSY_IRQ IRQ_GPIO(GPIO_GUMSTIX_PRDY_nBSY_0) -+#define GUMSTIX_S0_PRDY_nBSY_OLD_IRQ IRQ_GPIO(GPIO_GUMSTIX_PRDY_nBSY_0_OLD) -+ -+/* CF slot 1 */ -+#define GPIO18_nBVD1_1 18 -+#define GPIO18_nSTSCHG_1 GPIO18_nBVD1_1 -+#define GPIO36_nCD_1 36 -+#define GPIO27_PRDY_nBSY_1 27 -+ -+#define GPIO_GUMSTIX_nBVD1_1 GPIO18_nBVD1_1 -+#define GPIO_GUMSTIX_nSTSCHG_1 GPIO18_nSTSCHG_1 -+#define GPIO_GUMSTIX_nCD_1 GPIO36_nCD_1 -+#define GPIO_GUMSTIX_PRDY_nBSY_1 GPIO27_PRDY_nBSY_1 -+ -+#define GUMSTIX_S1_nSTSCHG_IRQ IRQ_GPIO(GPIO_GUMSTIX_nSTSCHG_1) -+#define GUMSTIX_S1_nCD_IRQ IRQ_GPIO(GPIO_GUMSTIX_nCD_1) -+#define GUMSTIX_S1_PRDY_nBSY_IRQ IRQ_GPIO(GPIO_GUMSTIX_PRDY_nBSY_1) -+ -+/* CF GPIO line modes */ -+#define GPIO_GUMSTIX_CF_RESET_MD ( GPIO_GUMSTIX_CF_RESET | GPIO_OUT ) -+#define GPIO_GUMSTIX_CF_OLD_RESET_MD ( GPIO_GUMSTIX_CF_OLD_RESET | GPIO_OUT ) -+#define GPIO_GUMSTIX_nSTSCHG_0_MD ( GPIO_GUMSTIX_nSTSCHG_0 | GPIO_IN ) -+#define GPIO_GUMSTIX_nCD_0_MD ( GPIO_GUMSTIX_nCD_0 | GPIO_IN ) -+#define GPIO_GUMSTIX_PRDY_nBSY_0_MD ( GPIO_GUMSTIX_PRDY_nBSY_0 | GPIO_IN ) -+#define GPIO_GUMSTIX_PRDY_nBSY_0_OLD_MD ( GPIO_GUMSTIX_PRDY_nBSY_0_OLD | GPIO_IN ) -+#define GPIO_GUMSTIX_nSTSCHG_1_MD ( GPIO_GUMSTIX_nSTSCHG_1 | GPIO_IN ) -+#define GPIO_GUMSTIX_nCD_1_MD ( GPIO_GUMSTIX_nCD_1 | GPIO_IN ) -+#define GPIO_GUMSTIX_PRDY_nBSY_1_MD ( GPIO_GUMSTIX_PRDY_nBSY_1 | GPIO_IN ) diff --git a/target/linux/pxa/patches-2.6.21/003-arch-config.patch b/target/linux/pxa/patches-2.6.21/003-arch-config.patch deleted file mode 100644 index 381be934b..000000000 --- a/target/linux/pxa/patches-2.6.21/003-arch-config.patch +++ /dev/null @@ -1,58 +0,0 @@ ---- a/arch/arm/mach-pxa/Kconfig -+++ b/arch/arm/mach-pxa/Kconfig -@@ -5,6 +5,10 @@ menu "Intel PXA2xx Implementations" - choice - prompt "Select target board" - -+config ARCH_GUMSTIX -+ bool "Gumstix Platform" -+ depends on ARCH_PXA -+ - config ARCH_LUBBOCK - bool "Intel DBPXA250 Development Platform" - select PXA25x -@@ -116,6 +120,34 @@ config MACH_TOSA - bool "Enable Sharp SL-6000x (Tosa) Support" - depends on PXA_SHARPSL_25x - -+choice -+ depends on ARCH_GUMSTIX -+ prompt "Gumstix Platform Version" -+ default ARCH_GUMSTIX_F -+ -+config ARCH_GUMSTIX_ORIG -+ bool "Original Gumstix" -+ select PXA25x -+ help -+ The original gumstix platform, including the gs-200x and gs-400x and the waysmall -+ systems using these boards. (Almost nobody has one of these) -+ -+config ARCH_GUMSTIX_F -+ bool "Gumstix-F" -+ select PXA25x -+ help -+ The updated Gumstix basix and connex boards with 60-pin connector, and -+ waysmall systems using these boards, including ws-200ax and ws-400ax. -+ -+config ARCH_GUMSTIX_VERDEX -+ bool "Gumstix Verdex" -+ select PXA27x -+ help -+ The Gumstix verdex boards with 24, 60, and 120-pin connectors, and -+ computer systems using these boards. -+ -+endchoice -+ - config PXA25x - bool - help ---- a/arch/arm/mach-pxa/Makefile -+++ b/arch/arm/mach-pxa/Makefile -@@ -8,6 +8,7 @@ obj-$(CONFIG_PXA25x) += pxa25x.o - obj-$(CONFIG_PXA27x) += pxa27x.o - - # Specific board support -+obj-$(CONFIG_ARCH_GUMSTIX) += gumstix.o - obj-$(CONFIG_ARCH_LUBBOCK) += lubbock.o - obj-$(CONFIG_MACH_LOGICPD_PXA270) += lpd270.o - obj-$(CONFIG_MACH_MAINSTONE) += mainstone.o diff --git a/target/linux/pxa/patches-2.6.21/004-board-init.patch b/target/linux/pxa/patches-2.6.21/004-board-init.patch deleted file mode 100644 index ebf37e7f6..000000000 --- a/target/linux/pxa/patches-2.6.21/004-board-init.patch +++ /dev/null @@ -1,79 +0,0 @@ ---- /dev/null -+++ b/arch/arm/mach-pxa/gumstix.c -@@ -0,0 +1,76 @@ -+/* -+ * linux/arch/arm/mach-pxa/gumstix.c -+ * -+ * Support for the Gumstix computer platform -+ * -+ * Author: Craig Hughes -+ * Created: December 8 2004 -+ * Copyright: (C) 2004, Craig Hughes -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+ -+#include -+ -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "generic.h" -+ -+static int gumstix_mci_init(struct device *dev, irqreturn_t (*lubbock_detect_int)(int, void *, struct pt_regs *), void *data) -+{ -+ // Set up MMC controller -+ pxa_gpio_mode(GPIO6_MMCCLK_MD); -+ pxa_gpio_mode(GPIO53_MMCCLK_MD); -+ pxa_gpio_mode(GPIO8_MMCCS0_MD); -+ -+ return 0; -+} -+ -+static struct pxamci_platform_data gumstix_mci_platform_data = { -+ .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, -+ .init = &gumstix_mci_init, -+}; -+ -+static struct pxa2xx_udc_mach_info gumstix_udc_info __initdata = { -+ .gpio_vbus = GPIO_GUMSTIX_USB_GPIOn, -+ .gpio_pullup = GPIO_GUMSTIX_USB_GPIOx, -+}; -+ -+static struct platform_device gum_audio_device = { -+ .name = "pxa2xx-ac97", -+ .id = -1, -+}; -+ -+static struct platform_device *devices[] __initdata = { -+ &gum_audio_device, -+}; -+ -+static void __init gumstix_init(void) -+{ -+ pxa_set_mci_info(&gumstix_mci_platform_data); -+ pxa_set_udc_info(&gumstix_udc_info); -+ (void) platform_add_devices(devices, ARRAY_SIZE(devices)); -+} -+ -+MACHINE_START(GUMSTIX, "The Gumstix Platform") -+ .phys_io = 0x40000000, -+ .boot_params = 0xa0000100, -+ .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, -+ .timer = &pxa_timer, -+ .map_io = pxa_map_io, -+ .init_irq = pxa_init_irq, -+ .init_machine = gumstix_init, -+MACHINE_END diff --git a/target/linux/pxa/patches-2.6.21/005-compact-flash.patch b/target/linux/pxa/patches-2.6.21/005-compact-flash.patch deleted file mode 100644 index 6143fc69d..000000000 --- a/target/linux/pxa/patches-2.6.21/005-compact-flash.patch +++ /dev/null @@ -1,283 +0,0 @@ ---- a/drivers/pcmcia/Makefile -+++ b/drivers/pcmcia/Makefile -@@ -69,4 +69,4 @@ sa1100_cs-$(CONFIG_SA1100_SIMPAD) += sa - pxa2xx_cs-$(CONFIG_ARCH_LUBBOCK) += pxa2xx_lubbock.o sa1111_generic.o - pxa2xx_cs-$(CONFIG_MACH_MAINSTONE) += pxa2xx_mainstone.o - pxa2xx_cs-$(CONFIG_PXA_SHARPSL) += pxa2xx_sharpsl.o -- -+pxa2xx_cs-$(CONFIG_ARCH_GUMSTIX) += pxa2xx_gumstix.o ---- /dev/null -+++ b/drivers/pcmcia/pxa2xx_gumstix.c -@@ -0,0 +1,272 @@ -+/* -+ * linux/drivers/pcmcia/pxa2xx_gumstix.c -+ * -+ * Gumstix PCMCIA specific routines. Based on Mainstone -+ * -+ * Copyright 2004, Craig Hughes -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#include "soc_common.h" -+ -+static struct pcmcia_irqs gumstix_pcmcia_irqs0[] = { -+ { 0, GUMSTIX_S0_nCD_IRQ, "CF0 nCD" }, -+ { 0, GUMSTIX_S0_nSTSCHG_IRQ, "CF0 nSTSCHG" }, -+}; -+ -+static struct pcmcia_irqs gumstix_pcmcia_irqs1[] = { -+ { 1, GUMSTIX_S1_nCD_IRQ, "CF1 nCD" }, -+ { 1, GUMSTIX_S1_nSTSCHG_IRQ, "CF1 nSTSCHG" }, -+}; -+ -+static int net_cf_vx_mode = 0; -+ -+static int gumstix_pcmcia_hw_init(struct soc_pcmcia_socket *skt) -+{ -+ if(skt->nr == 0) -+ { -+ pxa_gpio_mode(GPIO_GUMSTIX_nSTSCHG_0_MD); -+ pxa_gpio_mode(GPIO_GUMSTIX_nCD_0_MD); -+ if(net_cf_vx_mode) -+ pxa_gpio_mode(GPIO_GUMSTIX_PRDY_nBSY_0_OLD_MD); -+ else -+ pxa_gpio_mode(GPIO_GUMSTIX_PRDY_nBSY_0_MD); -+ } else { -+ pxa_gpio_mode(GPIO_GUMSTIX_nSTSCHG_1_MD); -+ pxa_gpio_mode(GPIO_GUMSTIX_nCD_1_MD); -+ pxa_gpio_mode(GPIO_GUMSTIX_PRDY_nBSY_1_MD); -+ } -+ -+ pxa_gpio_mode(GPIO_GUMSTIX_nPOE_MD); -+ pxa_gpio_mode(GPIO_GUMSTIX_nPWE_MD); -+ pxa_gpio_mode(GPIO_GUMSTIX_nPIOR_MD); -+ pxa_gpio_mode(GPIO_GUMSTIX_nPIOW_MD); -+ pxa_gpio_mode(GPIO_GUMSTIX_nPCE_1_MD); -+ pxa_gpio_mode(GPIO_GUMSTIX_nPCE_2_MD); -+ pxa_gpio_mode(GPIO_GUMSTIX_pSKTSEL_MD); -+ pxa_gpio_mode(GPIO_GUMSTIX_nPREG_MD); -+ pxa_gpio_mode(GPIO_GUMSTIX_nPWAIT_MD); -+ pxa_gpio_mode(GPIO_GUMSTIX_nIOIS16_MD); -+ -+ skt->irq = (skt->nr == 0) ? ((net_cf_vx_mode == 0) ? GUMSTIX_S0_PRDY_nBSY_IRQ : GUMSTIX_S0_PRDY_nBSY_OLD_IRQ) : GUMSTIX_S1_PRDY_nBSY_IRQ; -+ -+ return (skt->nr == 0) ? soc_pcmcia_request_irqs(skt, gumstix_pcmcia_irqs0, ARRAY_SIZE(gumstix_pcmcia_irqs0)) : -+ soc_pcmcia_request_irqs(skt, gumstix_pcmcia_irqs1, ARRAY_SIZE(gumstix_pcmcia_irqs1)); -+} -+ -+static void gumstix_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) -+{ -+ if(skt->nr == 0) -+ { -+ soc_pcmcia_free_irqs(skt, gumstix_pcmcia_irqs0, ARRAY_SIZE(gumstix_pcmcia_irqs0)); -+ } else { -+ soc_pcmcia_free_irqs(skt, gumstix_pcmcia_irqs1, ARRAY_SIZE(gumstix_pcmcia_irqs1)); -+ } -+} -+ -+static void gumstix_pcmcia_socket_state(struct soc_pcmcia_socket *skt, -+ struct pcmcia_state *state) -+{ -+ unsigned int cd, prdy_nbsy, nbvd1; -+ if(skt->nr == 0) -+ { -+ cd = GPIO_GUMSTIX_nCD_0; -+ if(net_cf_vx_mode) -+ prdy_nbsy = GPIO_GUMSTIX_PRDY_nBSY_0_OLD; -+ else -+ prdy_nbsy = GPIO_GUMSTIX_PRDY_nBSY_0; -+ nbvd1 = GPIO_GUMSTIX_nBVD1_0; -+ } else { -+ cd = GPIO_GUMSTIX_nCD_1; -+ prdy_nbsy = GPIO_GUMSTIX_PRDY_nBSY_1; -+ nbvd1 = GPIO_GUMSTIX_nBVD1_1; -+ } -+ state->detect = !(GPLR(cd) & GPIO_bit(cd)); -+ state->ready = !!(GPLR(prdy_nbsy) & GPIO_bit(prdy_nbsy)); -+ state->bvd1 = !!(GPLR(nbvd1) & GPIO_bit(nbvd1)); -+ state->bvd2 = 1; -+ state->vs_3v = 0; -+ state->vs_Xv = 0; -+ state->wrprot = 0; -+} -+ -+static int gumstix_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, -+ const socket_state_t *state) -+{ -+ return 0; -+} -+ -+static void gumstix_pcmcia_socket_init(struct soc_pcmcia_socket *skt) -+{ -+ if(skt->nr) { -+ soc_pcmcia_enable_irqs(skt, gumstix_pcmcia_irqs0, ARRAY_SIZE(gumstix_pcmcia_irqs0)); -+ } else { -+ soc_pcmcia_enable_irqs(skt, gumstix_pcmcia_irqs1, ARRAY_SIZE(gumstix_pcmcia_irqs1)); -+ } -+} -+ -+static void gumstix_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) -+{ -+ if(skt->nr) { -+ soc_pcmcia_disable_irqs(skt, gumstix_pcmcia_irqs0, ARRAY_SIZE(gumstix_pcmcia_irqs0)); -+ } else { -+ soc_pcmcia_disable_irqs(skt, gumstix_pcmcia_irqs1, ARRAY_SIZE(gumstix_pcmcia_irqs1)); -+ } -+} -+ -+static struct pcmcia_low_level gumstix_pcmcia_ops = { -+ .owner = THIS_MODULE, -+ .hw_init = gumstix_pcmcia_hw_init, -+ .hw_shutdown = gumstix_pcmcia_hw_shutdown, -+ .socket_state = gumstix_pcmcia_socket_state, -+ .configure_socket = gumstix_pcmcia_configure_socket, -+ .socket_init = gumstix_pcmcia_socket_init, -+ .socket_suspend = gumstix_pcmcia_socket_suspend, -+ .nr = 2, -+}; -+ -+static struct platform_device *gumstix_pcmcia_device; -+ -+inline void __init gumstix_pcmcia_cpld_clk(void) -+{ -+ GPCR(GPIO_GUMSTIX_nPOE) = GPIO_bit(GPIO_GUMSTIX_nPOE); -+ GPSR(GPIO_GUMSTIX_nPOE) = GPIO_bit(GPIO_GUMSTIX_nPOE); -+} -+ -+inline unsigned char __init gumstix_pcmcia_cpld_read_bits(int bits) -+{ -+ unsigned char result = 0; -+ unsigned int shift = 0; -+ while(bits--) -+ { -+ result |= !!(GPLR(GPIO_GUMSTIX_nCD_0) & GPIO_bit(GPIO_GUMSTIX_nCD_0)) << shift; -+ shift ++; -+ gumstix_pcmcia_cpld_clk(); -+ } -+ printk("CPLD responded with: %02x\n",result); -+ return result; -+} -+ -+/* We use the CPLD on the CF-CF card to read a value from a shift register. If we can read that -+ * magic sequence, then we have 2 CF cards; otherwise we assume just one -+ * The CPLD will send the value of the shift register on GPIO11 (the CD line for slot 0) -+ * when RESET is held in reset. We use GPIO48 (nPOE) as a clock signal, -+ * GPIO52/53 (card enable for both cards) to control read/write to the shift register -+ */ -+static void __init gumstix_count_cards(void) -+{ -+ pxa_gpio_mode(GPIO_GUMSTIX_nPOE | GPIO_OUT); -+ pxa_gpio_mode(GPIO_GUMSTIX_nPCE_1 | GPIO_OUT); -+ pxa_gpio_mode(GPIO_GUMSTIX_nPCE_2 | GPIO_OUT); -+ pxa_gpio_mode(GPIO_GUMSTIX_nCD_0 | GPIO_IN); -+ if(net_cf_vx_mode) -+ pxa_gpio_mode(GPIO_GUMSTIX_CF_OLD_RESET | GPIO_OUT); -+ else -+ pxa_gpio_mode(GPIO_GUMSTIX_CF_RESET | GPIO_OUT); -+ -+ // Enter reset -+ if(net_cf_vx_mode) -+ GPSR(GPIO_GUMSTIX_CF_OLD_RESET) = GPIO_bit(GPIO_GUMSTIX_CF_OLD_RESET); -+ else -+ GPSR(GPIO_GUMSTIX_CF_RESET) = GPIO_bit(GPIO_GUMSTIX_CF_RESET); -+ -+ // Setup the shift register -+ GPSR(GPIO_GUMSTIX_nPCE_1) = GPIO_bit(GPIO_GUMSTIX_nPCE_1); -+ GPCR(GPIO_GUMSTIX_nPCE_2) = GPIO_bit(GPIO_GUMSTIX_nPCE_2); -+ -+ // Tick the clock to program the shift register -+ gumstix_pcmcia_cpld_clk(); -+ -+ // Now set shift register into read mode -+ GPCR(GPIO_GUMSTIX_nPCE_1) = GPIO_bit(GPIO_GUMSTIX_nPCE_1); -+ GPSR(GPIO_GUMSTIX_nPCE_2) = GPIO_bit(GPIO_GUMSTIX_nPCE_2); -+ -+ // We can read the bits now -- 0xC2 means "Dual compact flash" -+ if(gumstix_pcmcia_cpld_read_bits(8) != 0xC2) -+ { -+ // We do not have 2 CF slots -+ gumstix_pcmcia_ops.nr = 1; -+ } -+} -+ -+#ifdef CONFIG_ARCH_GUMSTIX_VERDEX -+static void __init gumstix_check_if_netCF_vx(void) -+{ -+ void *network_controller_memory = ioremap(0x04000300,16); -+ // Look for the special 91c111 value in the bank select register -+ if((0xff00 & readw(network_controller_memory+0x0e)) == 0x3300) { -+ printk("Detected netCF-vx board: using older GPIO configuration\n"); -+ net_cf_vx_mode = 1; -+ } else { -+ printk("Not netCF-vx board: using newer GPIO configuration\n"); -+ net_cf_vx_mode = 0; -+ } -+ iounmap(network_controller_memory); -+} -+#endif -+ -+static int __init gumstix_pcmcia_init(void) -+{ -+ int ret; -+ -+#ifdef CONFIG_ARCH_GUMSTIX_VERDEX -+ gumstix_check_if_netCF_vx(); -+#endif -+ -+ gumstix_count_cards(); -+ -+ udelay(50); -+ if(net_cf_vx_mode) -+ GPCR(GPIO_GUMSTIX_CF_OLD_RESET) = GPIO_bit(GPIO_GUMSTIX_CF_OLD_RESET); -+ else -+ GPCR(GPIO_GUMSTIX_CF_RESET) = GPIO_bit(GPIO_GUMSTIX_CF_RESET); -+ -+ gumstix_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1); -+ if (!gumstix_pcmcia_device) -+ return -ENOMEM; -+ -+ gumstix_pcmcia_device->dev.platform_data = &gumstix_pcmcia_ops; -+ -+ ret = platform_device_add(gumstix_pcmcia_device); -+ if (ret) -+ platform_device_put(gumstix_pcmcia_device); -+ -+ return ret; -+} -+ -+static void __exit gumstix_pcmcia_exit(void) -+{ -+ /* -+ * This call is supposed to free our gumstix_pcmcia_device. -+ * Unfortunately platform_device don't have a free method, and -+ * we can't assume it's free of any reference at this point so we -+ * can't free it either. -+ */ -+ platform_device_unregister(gumstix_pcmcia_device); -+} -+ -+fs_initcall(gumstix_pcmcia_init); -+module_exit(gumstix_pcmcia_exit); -+ -+MODULE_LICENSE("GPL"); diff --git a/target/linux/pxa/patches-2.6.21/006-defconfig.patch b/target/linux/pxa/patches-2.6.21/006-defconfig.patch deleted file mode 100644 index 472e5fd52..000000000 --- a/target/linux/pxa/patches-2.6.21/006-defconfig.patch +++ /dev/null @@ -1,764 +0,0 @@ ---- /dev/null -+++ b/arch/arm/configs/gumstix_defconfig -@@ -0,0 +1,761 @@ -+# -+# Automatically generated make config: don't edit -+# -+CONFIG_ARM=y -+CONFIG_MMU=y -+CONFIG_UID16=y -+CONFIG_RWSEM_GENERIC_SPINLOCK=y -+ -+# -+# Code maturity level options -+# -+CONFIG_EXPERIMENTAL=y -+CONFIG_CLEAN_COMPILE=y -+CONFIG_BROKEN_ON_SMP=y -+ -+# -+# General setup -+# -+# CONFIG_SWAP is not set -+CONFIG_SYSVIPC=y -+# CONFIG_POSIX_MQUEUE is not set -+# CONFIG_BSD_PROCESS_ACCT is not set -+# CONFIG_SYSCTL is not set -+# CONFIG_AUDIT is not set -+CONFIG_LOG_BUF_SHIFT=14 -+CONFIG_HOTPLUG=y -+# CONFIG_IKCONFIG is not set -+CONFIG_EMBEDDED=y -+# CONFIG_KALLSYMS is not set -+# CONFIG_FUTEX is not set -+# CONFIG_EPOLL is not set -+CONFIG_IOSCHED_NOOP=y -+# CONFIG_IOSCHED_AS is not set -+# CONFIG_IOSCHED_DEADLINE is not set -+# CONFIG_IOSCHED_CFQ is not set -+CONFIG_CC_OPTIMIZE_FOR_SIZE=y -+ -+# -+# Loadable module support -+# -+CONFIG_MODULES=y -+CONFIG_MODULE_UNLOAD=y -+# CONFIG_MODULE_FORCE_UNLOAD is not set -+CONFIG_OBSOLETE_MODPARM=y -+# CONFIG_MODVERSIONS is not set -+CONFIG_KMOD=y -+ -+# -+# System Type -+# -+# CONFIG_ARCH_CLPS7500 is not set -+# CONFIG_ARCH_CLPS711X is not set -+# CONFIG_ARCH_CO285 is not set -+# CONFIG_ARCH_EBSA110 is not set -+# CONFIG_ARCH_CAMELOT is not set -+# CONFIG_ARCH_FOOTBRIDGE is not set -+# CONFIG_ARCH_INTEGRATOR is not set -+# CONFIG_ARCH_IOP3XX is not set -+# CONFIG_ARCH_IXP4XX is not set -+# CONFIG_ARCH_L7200 is not set -+CONFIG_ARCH_PXA=y -+# CONFIG_ARCH_RPC is not set -+# CONFIG_ARCH_SA1100 is not set -+# CONFIG_ARCH_S3C2410 is not set -+# CONFIG_ARCH_SHARK is not set -+# CONFIG_ARCH_LH7A40X is not set -+# CONFIG_ARCH_OMAP is not set -+# CONFIG_ARCH_VERSATILE_PB is not set -+# CONFIG_ARCH_IMX is not set -+ -+# -+# Intel PXA2xx Implementations -+# -+CONFIG_ARCH_GUMSTIX=y -+# CONFIG_ARCH_LUBBOCK is not set -+# CONFIG_MACH_MAINSTONE is not set -+# CONFIG_ARCH_PXA_IDP is not set -+# CONFIG_ARCH_GUMSTIX_ORIG is not set -+CONFIG_ARCH_GUMSTIX_F=y -+CONFIG_PXA25x=y -+ -+# -+# Processor Type -+# -+CONFIG_CPU_32=y -+CONFIG_CPU_XSCALE=y -+CONFIG_CPU_32v5=y -+CONFIG_CPU_ABRT_EV5T=y -+CONFIG_CPU_TLB_V4WBI=y -+CONFIG_CPU_MINICACHE=y -+ -+# -+# Processor Features -+# -+# CONFIG_ARM_THUMB is not set -+CONFIG_XSCALE_PMU=y -+ -+# -+# General setup -+# -+# CONFIG_ZBOOT_ROM is not set -+CONFIG_ZBOOT_ROM_TEXT=0x0 -+CONFIG_ZBOOT_ROM_BSS=0x0 -+CONFIG_CPU_FREQ=y -+CONFIG_CPU_FREQ_TABLE=y -+CONFIG_CPU_FREQ_PXA=y -+# CONFIG_CPU_FREQ_PROC_INTF is not set -+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set -+CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y -+CONFIG_CPU_FREQ_GOV_PERFORMANCE=m -+CONFIG_CPU_FREQ_GOV_POWERSAVE=m -+CONFIG_CPU_FREQ_GOV_USERSPACE=y -+CONFIG_PROC_GPIO=m -+ -+# -+# PCMCIA/CardBus support -+# -+CONFIG_PCMCIA=m -+# CONFIG_PCMCIA_DEBUG is not set -+# CONFIG_TCIC is not set -+CONFIG_PCMCIA_PXA2XX=m -+ -+# -+# At least one math emulation must be selected -+# -+CONFIG_FPE_NWFPE=y -+# CONFIG_FPE_NWFPE_XP is not set -+# CONFIG_FPE_FASTFPE is not set -+# CONFIG_VFP is not set -+CONFIG_BINFMT_ELF=y -+# CONFIG_BINFMT_AOUT is not set -+# CONFIG_BINFMT_MISC is not set -+ -+# -+# Generic Driver Options -+# -+CONFIG_STANDALONE=y -+CONFIG_PREVENT_FIRMWARE_BUILD=y -+# CONFIG_FW_LOADER is not set -+# CONFIG_PM is not set -+# CONFIG_PREEMPT is not set -+# CONFIG_ARTHUR is not set -+CONFIG_CMDLINE="console=ttyS0,115200n8 root=1f02 rootfstype=jffs2 reboot=cold,hard" -+CONFIG_ALIGNMENT_TRAP=y -+ -+# -+# Parallel port support -+# -+# CONFIG_PARPORT is not set -+ -+# -+# Memory Technology Devices (MTD) -+# -+CONFIG_MTD=y -+# CONFIG_MTD_DEBUG is not set -+CONFIG_MTD_PARTITIONS=y -+# CONFIG_MTD_CONCAT is not set -+# CONFIG_MTD_REDBOOT_PARTS is not set -+# CONFIG_MTD_CMDLINE_PARTS is not set -+# CONFIG_MTD_AFS_PARTS is not set -+ -+# -+# User Modules And Translation Layers -+# -+CONFIG_MTD_CHAR=y -+CONFIG_MTD_BLOCK=y -+# CONFIG_FTL is not set -+# CONFIG_NFTL is not set -+# CONFIG_INFTL is not set -+ -+# -+# RAM/ROM/Flash chip drivers -+# -+CONFIG_MTD_CFI=y -+# CONFIG_MTD_JEDECPROBE is not set -+CONFIG_MTD_GEN_PROBE=y -+CONFIG_MTD_CFI_ADV_OPTIONS=y -+CONFIG_MTD_CFI_NOSWAP=y -+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set -+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set -+CONFIG_MTD_CFI_GEOMETRY=y -+# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set -+CONFIG_MTD_MAP_BANK_WIDTH_2=y -+# CONFIG_MTD_MAP_BANK_WIDTH_4 is not set -+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set -+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set -+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set -+CONFIG_MTD_CFI_I1=y -+# CONFIG_MTD_CFI_I2 is not set -+# CONFIG_MTD_CFI_I4 is not set -+# CONFIG_MTD_CFI_I8 is not set -+CONFIG_MTD_CFI_INTELEXT=y -+# CONFIG_MTD_CFI_AMDSTD is not set -+# CONFIG_MTD_CFI_STAA is not set -+CONFIG_MTD_CFI_UTIL=y -+# CONFIG_MTD_RAM is not set -+# CONFIG_MTD_ROM is not set -+# CONFIG_MTD_ABSENT is not set -+ -+# -+# Mapping drivers for chip access -+# -+CONFIG_MTD_COMPLEX_MAPPINGS=y -+CONFIG_MTD_PHYSMAP=y -+CONFIG_MTD_PHYSMAP_START=0x00000000 -+CONFIG_MTD_PHYSMAP_LEN=0x00400000 -+CONFIG_MTD_PHYSMAP_BANKWIDTH=2 -+CONFIG_MTD_GUMSTIX=y -+# CONFIG_MTD_ARM_INTEGRATOR is not set -+# CONFIG_MTD_EDB7312 is not set -+ -+# -+# Self-contained MTD device drivers -+# -+# CONFIG_MTD_SLRAM is not set -+# CONFIG_MTD_PHRAM is not set -+# CONFIG_MTD_MTDRAM is not set -+# CONFIG_MTD_BLKMTD is not set -+ -+# -+# Disk-On-Chip Device Drivers -+# -+# CONFIG_MTD_DOC2000 is not set -+# CONFIG_MTD_DOC2001 is not set -+# CONFIG_MTD_DOC2001PLUS is not set -+ -+# -+# NAND Flash Device Drivers -+# -+# CONFIG_MTD_NAND is not set -+ -+# -+# Plug and Play support -+# -+ -+# -+# Block devices -+# -+# CONFIG_BLK_DEV_FD is not set -+CONFIG_BLK_DEV_LOOP=m -+# CONFIG_BLK_DEV_CRYPTOLOOP is not set -+# CONFIG_BLK_DEV_NBD is not set -+# CONFIG_BLK_DEV_RAM is not set -+ -+# -+# Multi-device support (RAID and LVM) -+# -+# CONFIG_MD is not set -+ -+# -+# Networking support -+# -+CONFIG_NET=y -+ -+# -+# Networking options -+# -+CONFIG_PACKET=m -+CONFIG_PACKET_MMAP=y -+# CONFIG_NETLINK_DEV is not set -+CONFIG_UNIX=m -+# CONFIG_NET_KEY is not set -+CONFIG_INET=y -+# CONFIG_IP_MULTICAST is not set -+# CONFIG_IP_ADVANCED_ROUTER is not set -+# CONFIG_IP_PNP is not set -+# CONFIG_NET_IPIP is not set -+# CONFIG_NET_IPGRE is not set -+# CONFIG_ARPD is not set -+# CONFIG_SYN_COOKIES is not set -+# CONFIG_INET_AH is not set -+# CONFIG_INET_ESP is not set -+# CONFIG_INET_IPCOMP is not set -+# CONFIG_INET_TUNNEL is not set -+# CONFIG_IPV6 is not set -+# CONFIG_NETFILTER is not set -+ -+# -+# SCTP Configuration (EXPERIMENTAL) -+# -+# CONFIG_IP_SCTP is not set -+# CONFIG_ATM is not set -+# CONFIG_BRIDGE is not set -+# CONFIG_VLAN_8021Q is not set -+# CONFIG_DECNET is not set -+# CONFIG_LLC2 is not set -+# CONFIG_IPX is not set -+# CONFIG_ATALK is not set -+# CONFIG_X25 is not set -+# CONFIG_LAPB is not set -+# CONFIG_NET_DIVERT is not set -+# CONFIG_ECONET is not set -+# CONFIG_WAN_ROUTER is not set -+# CONFIG_NET_HW_FLOWCONTROL is not set -+ -+# -+# QoS and/or fair queueing -+# -+# CONFIG_NET_SCHED is not set -+# CONFIG_NET_CLS_ROUTE is not set -+ -+# -+# Network testing -+# -+# CONFIG_NET_PKTGEN is not set -+# CONFIG_NETPOLL is not set -+# CONFIG_NET_POLL_CONTROLLER is not set -+# CONFIG_HAMRADIO is not set -+# CONFIG_IRDA is not set -+CONFIG_BT=m -+CONFIG_BT_GUMSTIX=m -+CONFIG_BT_L2CAP=m -+CONFIG_BT_SCO=m -+CONFIG_BT_RFCOMM=m -+CONFIG_BT_RFCOMM_TTY=y -+CONFIG_BT_BNEP=m -+CONFIG_BT_BNEP_MC_FILTER=y -+CONFIG_BT_BNEP_PROTO_FILTER=y -+CONFIG_BT_HIDP=m -+ -+# -+# Bluetooth device drivers -+# -+CONFIG_BT_HCIUART=m -+CONFIG_BT_HCIUART_H4=y -+# CONFIG_BT_HCIUART_BCSP is not set -+# CONFIG_BT_HCIDTL1 is not set -+# CONFIG_BT_HCIBT3C is not set -+# CONFIG_BT_HCIBLUECARD is not set -+# CONFIG_BT_HCIBTUART is not set -+CONFIG_BT_HCIVHCI=m -+CONFIG_NETDEVICES=y -+# CONFIG_DUMMY is not set -+# CONFIG_BONDING is not set -+# CONFIG_EQUALIZER is not set -+# CONFIG_TUN is not set -+ -+# -+# Ethernet (10 or 100Mbit) -+# -+CONFIG_NET_ETHERNET=y -+CONFIG_MII=m -+CONFIG_SMC91X=m -+CONFIG_SMC91X_GUMSTIX=m -+ -+# -+# Ethernet (1000 Mbit) -+# -+ -+# -+# Ethernet (10000 Mbit) -+# -+ -+# -+# Token Ring devices -+# -+ -+# -+# Wireless LAN (non-hamradio) -+# -+# CONFIG_NET_RADIO is not set -+ -+# -+# PCMCIA network device support -+# -+# CONFIG_NET_PCMCIA is not set -+ -+# -+# Wan interfaces -+# -+# CONFIG_WAN is not set -+# CONFIG_PPP is not set -+# CONFIG_SLIP is not set -+# CONFIG_SHAPER is not set -+# CONFIG_NETCONSOLE is not set -+ -+# -+# ATA/ATAPI/MFM/RLL support -+# -+CONFIG_IDE=m -+CONFIG_BLK_DEV_IDE=m -+ -+# -+# Please see Documentation/ide.txt for help/info on IDE drives -+# -+# CONFIG_BLK_DEV_IDE_SATA is not set -+# CONFIG_BLK_DEV_IDEDISK is not set -+CONFIG_BLK_DEV_IDECS=m -+# CONFIG_BLK_DEV_IDECD is not set -+# CONFIG_BLK_DEV_IDETAPE is not set -+# CONFIG_BLK_DEV_IDEFLOPPY is not set -+# CONFIG_IDE_TASK_IOCTL is not set -+# CONFIG_IDE_TASKFILE_IO is not set -+ -+# -+# IDE chipset support/bugfixes -+# -+CONFIG_IDE_GENERIC=m -+# CONFIG_IDE_ARM is not set -+# CONFIG_BLK_DEV_IDEDMA is not set -+# CONFIG_IDEDMA_AUTO is not set -+# CONFIG_BLK_DEV_HD is not set -+ -+# -+# SCSI device support -+# -+# CONFIG_SCSI is not set -+ -+# -+# Fusion MPT device support -+# -+ -+# -+# IEEE 1394 (FireWire) support -+# -+ -+# -+# I2O device support -+# -+ -+# -+# ISDN subsystem -+# -+# CONFIG_ISDN is not set -+ -+# -+# Input device support -+# -+CONFIG_INPUT=m -+ -+# -+# Userland interfaces -+# -+# CONFIG_INPUT_MOUSEDEV is not set -+# CONFIG_INPUT_JOYDEV is not set -+# CONFIG_INPUT_TSDEV is not set -+# CONFIG_INPUT_EVDEV is not set -+# CONFIG_INPUT_EVBUG is not set -+ -+# -+# Input I/O drivers -+# -+# CONFIG_GAMEPORT is not set -+CONFIG_SOUND_GAMEPORT=y -+CONFIG_SERIO=y -+# CONFIG_SERIO_I8042 is not set -+# CONFIG_SERIO_SERPORT is not set -+# CONFIG_SERIO_CT82C710 is not set -+ -+# -+# Input Device Drivers -+# -+# CONFIG_INPUT_KEYBOARD is not set -+# CONFIG_INPUT_MOUSE is not set -+# CONFIG_INPUT_JOYSTICK is not set -+# CONFIG_INPUT_TOUCHSCREEN is not set -+# CONFIG_INPUT_MISC is not set -+ -+# -+# Character devices -+# -+# CONFIG_VT is not set -+# CONFIG_SERIAL_NONSTANDARD is not set -+ -+# -+# Serial drivers -+# -+# CONFIG_SERIAL_8250 is not set -+ -+# -+# Non-8250 serial port support -+# -+CONFIG_SERIAL_PXA=y -+CONFIG_SERIAL_PXA_CONSOLE=y -+CONFIG_SERIAL_CORE=y -+CONFIG_SERIAL_CORE_CONSOLE=y -+CONFIG_UNIX98_PTYS=y -+# CONFIG_LEGACY_PTYS is not set -+# CONFIG_QIC02_TAPE is not set -+ -+# -+# IPMI -+# -+# CONFIG_IPMI_HANDLER is not set -+ -+# -+# Watchdog Cards -+# -+CONFIG_WATCHDOG=y -+# CONFIG_WATCHDOG_NOWAYOUT is not set -+ -+# -+# Watchdog Device Drivers -+# -+# CONFIG_SOFT_WATCHDOG is not set -+CONFIG_SA1100_WATCHDOG=y -+# CONFIG_NVRAM is not set -+# CONFIG_RTC is not set -+# CONFIG_GEN_RTC is not set -+CONFIG_SA1100_RTC=m -+# CONFIG_DTLK is not set -+# CONFIG_R3964 is not set -+ -+# -+# Ftape, the floppy tape device driver -+# -+# CONFIG_AGP is not set -+# CONFIG_DRM is not set -+ -+# -+# PCMCIA character devices -+# -+# CONFIG_SYNCLINK_CS is not set -+# CONFIG_RAW_DRIVER is not set -+ -+# -+# I2C support -+# -+# CONFIG_I2C is not set -+ -+# -+# Multimedia devices -+# -+# CONFIG_VIDEO_DEV is not set -+ -+# -+# Digital Video Broadcasting Devices -+# -+# CONFIG_DVB is not set -+ -+# -+# File systems -+# -+# CONFIG_EXT2_FS is not set -+# CONFIG_EXT3_FS is not set -+# CONFIG_JBD is not set -+# CONFIG_REISERFS_FS is not set -+# CONFIG_JFS_FS is not set -+# CONFIG_XFS_FS is not set -+# CONFIG_MINIX_FS is not set -+# CONFIG_ROMFS_FS is not set -+# CONFIG_QUOTA is not set -+# CONFIG_AUTOFS_FS is not set -+# CONFIG_AUTOFS4_FS is not set -+ -+# -+# CD-ROM/DVD Filesystems -+# -+# CONFIG_ISO9660_FS is not set -+# CONFIG_UDF_FS is not set -+ -+# -+# DOS/FAT/NT Filesystems -+# -+CONFIG_FAT_FS=m -+CONFIG_MSDOS_FS=m -+CONFIG_VFAT_FS=m -+CONFIG_FAT_DEFAULT_CODEPAGE=437 -+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" -+# CONFIG_NTFS_FS is not set -+ -+# -+# Pseudo filesystems -+# -+CONFIG_PROC_FS=y -+CONFIG_SYSFS=y -+# CONFIG_DEVFS_FS is not set -+# CONFIG_DEVPTS_FS_XATTR is not set -+CONFIG_TMPFS=y -+# CONFIG_HUGETLB_PAGE is not set -+CONFIG_RAMFS=y -+ -+# -+# Miscellaneous filesystems -+# -+# CONFIG_ADFS_FS is not set -+# CONFIG_AFFS_FS is not set -+# CONFIG_HFS_FS is not set -+# CONFIG_HFSPLUS_FS is not set -+# CONFIG_BEFS_FS is not set -+# CONFIG_BFS_FS is not set -+# CONFIG_EFS_FS is not set -+# CONFIG_JFFS_FS is not set -+CONFIG_JFFS2_FS=y -+CONFIG_JFFS2_FS_DEBUG=0 -+# CONFIG_JFFS2_FS_NAND is not set -+CONFIG_JFFS2_COMPRESSION_OPTIONS=y -+CONFIG_JFFS2_ZLIB=y -+CONFIG_JFFS2_RTIME=y -+CONFIG_JFFS2_RUBIN=y -+# CONFIG_JFFS2_CMODE_NONE is not set -+# CONFIG_JFFS2_CMODE_PRIORITY is not set -+CONFIG_JFFS2_CMODE_SIZE=y -+# CONFIG_CRAMFS is not set -+# CONFIG_VXFS_FS is not set -+# CONFIG_HPFS_FS is not set -+# CONFIG_QNX4FS_FS is not set -+# CONFIG_SYSV_FS is not set -+# CONFIG_UFS_FS is not set -+ -+# -+# Network File Systems -+# -+CONFIG_NFS_FS=m -+CONFIG_NFS_V3=y -+# CONFIG_NFS_V4 is not set -+# CONFIG_NFS_DIRECTIO is not set -+# CONFIG_NFSD is not set -+CONFIG_LOCKD=m -+CONFIG_LOCKD_V4=y -+# CONFIG_EXPORTFS is not set -+CONFIG_SUNRPC=m -+# CONFIG_RPCSEC_GSS_KRB5 is not set -+# CONFIG_RPCSEC_GSS_SPKM3 is not set -+# CONFIG_SMB_FS is not set -+# CONFIG_CIFS is not set -+# CONFIG_NCP_FS is not set -+# CONFIG_CODA_FS is not set -+# CONFIG_AFS_FS is not set -+ -+# -+# Partition Types -+# -+CONFIG_PARTITION_ADVANCED=y -+# CONFIG_ACORN_PARTITION is not set -+# CONFIG_OSF_PARTITION is not set -+# CONFIG_AMIGA_PARTITION is not set -+# CONFIG_ATARI_PARTITION is not set -+# CONFIG_MAC_PARTITION is not set -+CONFIG_MSDOS_PARTITION=y -+# CONFIG_BSD_DISKLABEL is not set -+# CONFIG_MINIX_SUBPARTITION is not set -+# CONFIG_SOLARIS_X86_PARTITION is not set -+# CONFIG_UNIXWARE_DISKLABEL is not set -+# CONFIG_LDM_PARTITION is not set -+# CONFIG_SGI_PARTITION is not set -+# CONFIG_ULTRIX_PARTITION is not set -+# CONFIG_SUN_PARTITION is not set -+# CONFIG_EFI_PARTITION is not set -+ -+# -+# Native Language Support -+# -+CONFIG_NLS=m -+CONFIG_NLS_DEFAULT="iso8859-1" -+CONFIG_NLS_CODEPAGE_437=m -+# CONFIG_NLS_CODEPAGE_737 is not set -+# CONFIG_NLS_CODEPAGE_775 is not set -+# CONFIG_NLS_CODEPAGE_850 is not set -+# CONFIG_NLS_CODEPAGE_852 is not set -+# CONFIG_NLS_CODEPAGE_855 is not set -+# CONFIG_NLS_CODEPAGE_857 is not set -+# CONFIG_NLS_CODEPAGE_860 is not set -+# CONFIG_NLS_CODEPAGE_861 is not set -+# CONFIG_NLS_CODEPAGE_862 is not set -+# CONFIG_NLS_CODEPAGE_863 is not set -+# CONFIG_NLS_CODEPAGE_864 is not set -+# CONFIG_NLS_CODEPAGE_865 is not set -+# CONFIG_NLS_CODEPAGE_866 is not set -+# CONFIG_NLS_CODEPAGE_869 is not set -+# CONFIG_NLS_CODEPAGE_936 is not set -+# CONFIG_NLS_CODEPAGE_950 is not set -+# CONFIG_NLS_CODEPAGE_932 is not set -+# CONFIG_NLS_CODEPAGE_949 is not set -+# CONFIG_NLS_CODEPAGE_874 is not set -+# CONFIG_NLS_ISO8859_8 is not set -+# CONFIG_NLS_CODEPAGE_1250 is not set -+# CONFIG_NLS_CODEPAGE_1251 is not set -+# CONFIG_NLS_ASCII is not set -+CONFIG_NLS_ISO8859_1=m -+# CONFIG_NLS_ISO8859_2 is not set -+# CONFIG_NLS_ISO8859_3 is not set -+# CONFIG_NLS_ISO8859_4 is not set -+# CONFIG_NLS_ISO8859_5 is not set -+# CONFIG_NLS_ISO8859_6 is not set -+# CONFIG_NLS_ISO8859_7 is not set -+# CONFIG_NLS_ISO8859_9 is not set -+# CONFIG_NLS_ISO8859_13 is not set -+# CONFIG_NLS_ISO8859_14 is not set -+# CONFIG_NLS_ISO8859_15 is not set -+# CONFIG_NLS_KOI8_R is not set -+# CONFIG_NLS_KOI8_U is not set -+# CONFIG_NLS_UTF8 is not set -+ -+# -+# Profiling support -+# -+# CONFIG_PROFILING is not set -+ -+# -+# Graphics support -+# -+# CONFIG_FB is not set -+ -+# -+# Sound -+# -+# CONFIG_SOUND is not set -+ -+# -+# Misc devices -+# -+ -+# -+# USB support -+# -+ -+# -+# USB Gadget Support -+# -+CONFIG_USB_GADGET=m -+CONFIG_USB_GADGET_GUMSTIX=m -+# CONFIG_USB_GADGET_NET2280 is not set -+CONFIG_USB_GADGET_PXA2XX=y -+CONFIG_USB_PXA2XX=m -+# CONFIG_USB_PXA2XX_SMALL is not set -+# CONFIG_USB_GADGET_GOKU is not set -+# CONFIG_USB_GADGET_SA1100 is not set -+# CONFIG_USB_GADGET_DUMMY_HCD is not set -+# CONFIG_USB_GADGET_DUALSPEED is not set -+# CONFIG_USB_ZERO is not set -+CONFIG_USB_ETH=m -+CONFIG_USB_ETH_RNDIS=y -+# CONFIG_USB_GADGETFS is not set -+# CONFIG_USB_FILE_STORAGE is not set -+# CONFIG_USB_G_SERIAL is not set -+ -+# -+# MMC/SD Card support -+# -+CONFIG_MMC=m -+# CONFIG_MMC_DEBUG is not set -+CONFIG_MMC_BLOCK=m -+CONFIG_MMC_PXA=m -+ -+# -+# Kernel hacking -+# -+# CONFIG_DEBUG_KERNEL is not set -+# CONFIG_DEBUG_INFO is not set -+CONFIG_FRAME_POINTER=y -+# CONFIG_DEBUG_USER is not set -+ -+# -+# Security options -+# -+# CONFIG_SECURITY is not set -+ -+# -+# Cryptographic options -+# -+# CONFIG_CRYPTO is not set -+ -+# -+# Library routines -+# -+# CONFIG_CRC_CCITT is not set -+CONFIG_CRC32=y -+# CONFIG_LIBCRC32C is not set -+CONFIG_ZLIB_INFLATE=y -+CONFIG_ZLIB_DEFLATE=y diff --git a/target/linux/pxa/patches-2.6.21/007-flash.patch b/target/linux/pxa/patches-2.6.21/007-flash.patch deleted file mode 100644 index 3d091b276..000000000 --- a/target/linux/pxa/patches-2.6.21/007-flash.patch +++ /dev/null @@ -1,165 +0,0 @@ ---- /dev/null -+++ b/drivers/mtd/maps/gumstix-flash.c -@@ -0,0 +1,136 @@ -+/* -+ * Map driver for the Gumstix platform -+ * -+ * Author: Craig Hughes -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+ -+#define ROM_ADDR 0x00000000 -+#define FLASH_ADDR 0x00000000 -+ -+#define WINDOW_SIZE 64*1024*1024 -+ -+static struct map_info gumstix_flash_maps[1] = { { -+ .name = "Gumstix Flash ROM", -+ .size = WINDOW_SIZE, -+ .phys = FLASH_ADDR, -+ .bankwidth = 2, -+} }; -+ -+static struct mtd_partition gumstix_flash_partitions[] = { -+ { -+ .name = "Bootloader", -+ .size = 0x00040000, -+ .offset = FLASH_ADDR -+ },{ -+ .name = "RootFS", -+ .size = MTDPART_SIZ_FULL, -+ .offset = MTDPART_OFS_APPEND -+ } -+}; -+ -+static struct mtd_info *mymtds[1]; -+static struct mtd_partition *parsed_parts[1]; -+static int nr_parsed_parts[1]; -+ -+static const char *probes[] = { NULL }; -+ -+static int __init gumstix_flashmap_init(void) -+{ -+ int ret = 0, i; -+ -+ for (i = 0; i < 1; i++) { -+ gumstix_flash_maps[i].virt = ioremap(gumstix_flash_maps[i].phys, WINDOW_SIZE); -+ if (!gumstix_flash_maps[i].virt) { -+ printk(KERN_WARNING "Failed to ioremap %s\n", gumstix_flash_maps[i].name); -+ if (!ret) -+ ret = -ENOMEM; -+ continue; -+ } -+ simple_map_init(&gumstix_flash_maps[i]); -+ -+ printk(KERN_NOTICE "Probing %s at physical address 0x%08lx (%d-bit bankwidth)\n", -+ gumstix_flash_maps[i].name, gumstix_flash_maps[i].phys, -+ gumstix_flash_maps[i].bankwidth * 8); -+ -+ mymtds[i] = do_map_probe("cfi_probe", &gumstix_flash_maps[i]); -+ -+ if (!mymtds[i]) { -+ iounmap((void *)gumstix_flash_maps[i].virt); -+ if (gumstix_flash_maps[i].cached) -+ iounmap(gumstix_flash_maps[i].cached); -+ if (!ret) -+ ret = -EIO; -+ continue; -+ } -+ mymtds[i]->owner = THIS_MODULE; -+ -+ ret = parse_mtd_partitions(mymtds[i], probes, -+ &parsed_parts[i], 0); -+ -+ if (ret > 0) -+ nr_parsed_parts[i] = ret; -+ } -+ -+ if (!mymtds[0]) -+ return ret; -+ -+ for (i = 0; i < 1; i++) { -+ if (!mymtds[i]) { -+ printk(KERN_WARNING "%s is absent. Skipping\n", gumstix_flash_maps[i].name); -+ } else if (nr_parsed_parts[i]) { -+ add_mtd_partitions(mymtds[i], parsed_parts[i], nr_parsed_parts[i]); -+ } else if (!i) { -+ printk("Using static partitions on %s\n", gumstix_flash_maps[i].name); -+ add_mtd_partitions(mymtds[i], gumstix_flash_partitions, ARRAY_SIZE(gumstix_flash_partitions)); -+ } else { -+ printk("Registering %s as whole device\n", gumstix_flash_maps[i].name); -+ add_mtd_device(mymtds[i]); -+ } -+ } -+ return 0; -+} -+ -+static void __exit gumstix_flashmap_cleanup(void) -+{ -+ int i; -+ for (i = 0; i < 1; i++) { -+ if (!mymtds[i]) -+ continue; -+ -+ if (nr_parsed_parts[i] || !i) -+ del_mtd_partitions(mymtds[i]); -+ else -+ del_mtd_device(mymtds[i]); -+ -+ map_destroy(mymtds[i]); -+ iounmap((void *)gumstix_flash_maps[i].virt); -+ if (gumstix_flash_maps[i].cached) -+ iounmap(gumstix_flash_maps[i].cached); -+ -+ if (parsed_parts[i]) -+ kfree(parsed_parts[i]); -+ } -+} -+ -+module_init(gumstix_flashmap_init); -+module_exit(gumstix_flashmap_cleanup); -+ -+MODULE_LICENSE("GPL"); -+MODULE_AUTHOR("Gumstix, Inc. "); -+MODULE_DESCRIPTION("MTD map driver for the Gumstix Platform"); ---- a/drivers/mtd/maps/Kconfig -+++ b/drivers/mtd/maps/Kconfig -@@ -131,6 +131,13 @@ config MTD_SBC_GXX - More info at - . - -+config MTD_GUMSTIX -+ tristate "CFI Flash device mapped on Gumstix" -+ depends on ARCH_GUMSTIX && MTD_CFI_INTELEXT && MTD_PARTITIONS -+ help -+ This provides a driver for the on-board flash of the Gumstix -+ single board computers. -+ - config MTD_LUBBOCK - tristate "CFI Flash device mapped on Intel Lubbock XScale eval board" - depends on ARCH_LUBBOCK && MTD_CFI_INTELEXT && MTD_PARTITIONS ---- a/drivers/mtd/maps/Makefile -+++ b/drivers/mtd/maps/Makefile -@@ -21,6 +21,7 @@ obj-$(CONFIG_MTD_ICHXROM) += ichxrom.o - obj-$(CONFIG_MTD_CK804XROM) += ck804xrom.o - obj-$(CONFIG_MTD_TSUNAMI) += tsunami_flash.o - obj-$(CONFIG_MTD_LUBBOCK) += lubbock-flash.o -+obj-$(CONFIG_MTD_GUMSTIX) += gumstix-flash.o - obj-$(CONFIG_MTD_MAINSTONE) += mainstone-flash.o - obj-$(CONFIG_MTD_MBX860) += mbx860.o - obj-$(CONFIG_MTD_CEIVA) += ceiva.o diff --git a/target/linux/pxa/patches-2.6.21/008-pxa2xx_udc.patch b/target/linux/pxa/patches-2.6.21/008-pxa2xx_udc.patch deleted file mode 100644 index 51c413318..000000000 --- a/target/linux/pxa/patches-2.6.21/008-pxa2xx_udc.patch +++ /dev/null @@ -1,63 +0,0 @@ ---- a/drivers/usb/gadget/pxa2xx_udc.c -+++ b/drivers/usb/gadget/pxa2xx_udc.c -@@ -51,6 +51,7 @@ - #include - #include - #include -+#include - #ifdef CONFIG_ARCH_PXA - #include - #endif -@@ -101,6 +102,10 @@ static const char ep0name [] = "ep0"; - - #endif - -+#ifdef CONFIG_ARCH_GUMSTIX -+#undef CONFIG_USB_PXA2XX_SMALL -+#endif -+ - #include "pxa2xx_udc.h" - - -@@ -2541,6 +2546,41 @@ static int __init pxa2xx_udc_probe(struc - } - #endif - -+ /* Reset UDCCS register to be able to recover from whatever -+ * state UDC was previously in. */ -+ *dev->ep[ 2].reg_udccs = UDCCS_BO_RPC | UDCCS_BO_SST; -+#ifndef CONFIG_USB_PXA2XX_SMALL -+ *dev->ep[ 7].reg_udccs = UDCCS_BO_RPC | UDCCS_BO_SST; -+ *dev->ep[12].reg_udccs = UDCCS_BO_RPC | UDCCS_BO_SST; -+#endif -+ -+ *dev->ep[ 1].reg_udccs = UDCCS_BI_TPC | UDCCS_BI_FTF | -+ UDCCS_BI_TUR | UDCCS_BI_SST | UDCCS_BI_TSP; -+#ifndef CONFIG_USB_PXA2XX_SMALL -+ *dev->ep[ 6].reg_udccs = UDCCS_BI_TPC | UDCCS_BI_FTF | -+ UDCCS_BI_TUR | UDCCS_BI_SST | UDCCS_BI_TSP; -+ *dev->ep[11].reg_udccs = UDCCS_BI_TPC | UDCCS_BI_FTF | -+ UDCCS_BI_TUR | UDCCS_BI_SST | UDCCS_BI_TSP; -+ -+ *dev->ep[ 3].reg_udccs = UDCCS_II_TPC | UDCCS_II_FTF | -+ UDCCS_II_TUR | UDCCS_II_TSP; -+ *dev->ep[ 8].reg_udccs = UDCCS_II_TPC | UDCCS_II_FTF | -+ UDCCS_II_TUR | UDCCS_II_TSP; -+ *dev->ep[13].reg_udccs = UDCCS_II_TPC | UDCCS_II_FTF | -+ UDCCS_II_TUR | UDCCS_II_TSP; -+ -+ *dev->ep[ 4].reg_udccs = UDCCS_IO_RPC | UDCCS_IO_ROF; -+ *dev->ep[ 9].reg_udccs = UDCCS_IO_RPC | UDCCS_IO_ROF; -+ *dev->ep[11].reg_udccs = UDCCS_IO_RPC | UDCCS_IO_ROF; -+ -+ *dev->ep[ 5].reg_udccs = UDCCS_INT_TPC | UDCCS_INT_FTF | -+ UDCCS_INT_TUR | UDCCS_INT_SST; -+ *dev->ep[10].reg_udccs = UDCCS_INT_TPC | UDCCS_INT_FTF | -+ UDCCS_INT_TUR | UDCCS_INT_SST; -+ *dev->ep[15].reg_udccs = UDCCS_INT_TPC | UDCCS_INT_FTF | -+ UDCCS_INT_TUR | UDCCS_INT_SST; -+#endif -+ - /* other non-static parts of init */ - dev->dev = &pdev->dev; - dev->mach = pdev->dev.platform_data; diff --git a/target/linux/pxa/patches-2.6.21/009-bkpxa-pxa-cpu.patch b/target/linux/pxa/patches-2.6.21/009-bkpxa-pxa-cpu.patch deleted file mode 100644 index 72480612c..000000000 --- a/target/linux/pxa/patches-2.6.21/009-bkpxa-pxa-cpu.patch +++ /dev/null @@ -1,113 +0,0 @@ -Status: WORKS -PXA CPU enhancements - -from patch 1667: -- 64K PTEs -from hh.org-cvs: -- support in pxa_gpio_mode for active low - -# -# Patch managed by http://www.mn-logistik.de/unsupported/pxa250/patcher -# - ---- a/arch/arm/mm/proc-xscale.S -+++ b/arch/arm/mm/proc-xscale.S -@@ -474,11 +474,62 @@ ENTRY(cpu_xscale_set_pte_ext) - movne r2, #0 @ no -> fault - - str r2, [r0] @ hardware version -+ -+ @ We try to map 64K page entries when possible. -+ @ We do that for kernel space only since the usage pattern from -+ @ the setting of VM area is quite simple. User space is not worth -+ @ the implied complexity because of ever randomly changing PTEs -+ @ (page aging, swapout, etc) requiring constant coherency checks. -+ @ Since PTEs are usually set in increasing order, we test the -+ @ possibility for a large page only when given the last PTE of a -+ @ 64K boundary. -+ tsteq r1, #L_PTE_USER -+ andeq r1, r0, #(15 << 2) -+ teqeq r1, #(15 << 2) -+ beq 1f -+ - mov ip, #0 - mcr p15, 0, r0, c7, c10, 1 @ Clean D cache line - mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer - mov pc, lr - -+ @ See if we have 16 identical PTEs but with consecutive base addresses -+1: bic r3, r2, #0x0000f000 -+ mov r1, #0x0000f000 -+2: eor r2, r2, r3 -+ teq r2, r1 -+ bne 4f -+ subs r1, r1, #0x00001000 -+ ldr r2, [r0, #-4]! -+ bne 2b -+ eors r2, r2, r3 -+ bne 4f -+ -+ @ Now create our LARGE PTE from the current EXT one. -+ bic r3, r3, #PTE_TYPE_MASK -+ orr r3, r3, #PTE_TYPE_LARGE -+ and r2, r3, #0x30 @ EXT_AP --> LARGE_AP0 -+ orr r2, r2, r2, lsl #2 @ add LARGE_AP1 -+ orr r2, r2, r2, lsl #4 @ add LARGE_AP3 + LARGE_AP2 -+ and r1, r3, #0x3c0 @ EXT_TEX -+ bic r3, r3, #0x3c0 -+ orr r2, r2, r1, lsl #(12 - 6) @ --> LARGE_TEX -+ orr r2, r2, r3 @ add remaining bits -+ -+ @ then put it in the pagetable -+ mov r3, r2 -+3: strd r2, [r0], #8 -+ tst r0, #(15 << 2) -+ bne 3b -+ -+ @ Then sync the 2 corresponding cache lines -+ sub r0, r0, #(16 << 2) -+ mcr p15, 0, r0, c7, c10, 1 @ Clean D cache line -+4: orr r0, r0, #(15 << 2) -+ mcr p15, 0, r0, c7, c10, 1 @ Clean D cache line -+ mov ip, #0 -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+ mov pc, lr - - .ltorg - ---- a/include/asm-arm/arch-pxa/pxa-regs.h -+++ b/include/asm-arm/arch-pxa/pxa-regs.h -@@ -1345,6 +1345,7 @@ - #define GPIO_ALT_FN_2_OUT 0x280 - #define GPIO_ALT_FN_3_IN 0x300 - #define GPIO_ALT_FN_3_OUT 0x380 -+#define GPIO_ACTIVE_LOW 0x1000 - #define GPIO_MD_MASK_NR 0x07f - #define GPIO_MD_MASK_DIR 0x080 - #define GPIO_MD_MASK_FN 0x300 -@@ -1597,6 +1598,25 @@ - #define PWER_GPIO15 PWER_GPIO (15) /* GPIO [15] wake-up enable */ - #define PWER_RTC 0x80000000 /* RTC alarm wake-up enable */ - -+#define PWER_GPIO(Nb) (1 << Nb) /* GPIO [0..15] wake-up enable */ -+#define PWER_GPIO0 PWER_GPIO (0) /* GPIO [0] wake-up enable */ -+#define PWER_GPIO1 PWER_GPIO (1) /* GPIO [1] wake-up enable */ -+#define PWER_GPIO2 PWER_GPIO (2) /* GPIO [2] wake-up enable */ -+#define PWER_GPIO3 PWER_GPIO (3) /* GPIO [3] wake-up enable */ -+#define PWER_GPIO4 PWER_GPIO (4) /* GPIO [4] wake-up enable */ -+#define PWER_GPIO5 PWER_GPIO (5) /* GPIO [5] wake-up enable */ -+#define PWER_GPIO6 PWER_GPIO (6) /* GPIO [6] wake-up enable */ -+#define PWER_GPIO7 PWER_GPIO (7) /* GPIO [7] wake-up enable */ -+#define PWER_GPIO8 PWER_GPIO (8) /* GPIO [8] wake-up enable */ -+#define PWER_GPIO9 PWER_GPIO (9) /* GPIO [9] wake-up enable */ -+#define PWER_GPIO10 PWER_GPIO (10) /* GPIO [10] wake-up enable */ -+#define PWER_GPIO11 PWER_GPIO (11) /* GPIO [11] wake-up enable */ -+#define PWER_GPIO12 PWER_GPIO (12) /* GPIO [12] wake-up enable */ -+#define PWER_GPIO13 PWER_GPIO (13) /* GPIO [13] wake-up enable */ -+#define PWER_GPIO14 PWER_GPIO (14) /* GPIO [14] wake-up enable */ -+#define PWER_GPIO15 PWER_GPIO (15) /* GPIO [15] wake-up enable */ -+#define PWER_RTC 0x80000000 /* RTC alarm wake-up enable */ -+ - - /* - * SSP Serial Port Registers diff --git a/target/linux/pxa/patches-2.6.21/010-bkpxa-pxa-cpufreq.patch b/target/linux/pxa/patches-2.6.21/010-bkpxa-pxa-cpufreq.patch deleted file mode 100644 index f523c721a..000000000 --- a/target/linux/pxa/patches-2.6.21/010-bkpxa-pxa-cpufreq.patch +++ /dev/null @@ -1,395 +0,0 @@ -Status: WORKS -PXA CPU frequency change support -added mods from Stefan Eletzhofer and Lothar Weissmann - -# -# Patch managed by http://www.mn-logistik.de/unsupported/pxa250/patcher -# - ---- a/arch/arm/Kconfig -+++ b/arch/arm/Kconfig -@@ -800,7 +800,7 @@ config KEXEC - - endmenu - --if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP || ARCH_IMX ) -+if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP || ARCH_IMX || ARCH_PXA ) - - menu "CPU Frequency scaling" - -@@ -838,6 +838,12 @@ config CPU_FREQ_IMX - - endmenu - -+config CPU_FREQ_PXA -+ bool -+ depends on CPU_FREQ && ARCH_PXA -+ default y -+ select CPU_FREQ_DEFAULT_GOV_USERSPACE -+ - endif - - menu "Floating point emulation" ---- a/arch/arm/mach-pxa/Makefile -+++ b/arch/arm/mach-pxa/Makefile -@@ -32,6 +32,7 @@ obj-$(CONFIG_LEDS) += $(led-y) - # Misc features - obj-$(CONFIG_PM) += pm.o sleep.o - obj-$(CONFIG_PXA_SSP) += ssp.o -+obj-$(CONFIG_CPU_FREQ) += cpu-pxa.o - - ifeq ($(CONFIG_PXA27x),y) - obj-$(CONFIG_PM) += standby.o ---- /dev/null -+++ b/arch/arm/mach-pxa/cpu-pxa.c -@@ -0,0 +1,321 @@ -+/* -+ * linux/arch/arm/mach-pxa/cpu-pxa.c -+ * -+ * Copyright (C) 2002,2003 Intrinsyc Software -+ * -+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ * -+ * History: -+ * 31-Jul-2002 : Initial version [FB] -+ * 29-Jan-2003 : added PXA255 support [FB] -+ * 20-Apr-2003 : ported to v2.5 (Dustin McIntire, Sensoria Corp.) -+ * -+ * Note: -+ * This driver may change the memory bus clock rate, but will not do any -+ * platform specific access timing changes... for example if you have flash -+ * memory connected to CS0, you will need to register a platform specific -+ * notifier which will adjust the memory access strobes to maintain a -+ * minimum strobe width. -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#define DEBUG 0 -+ -+#ifdef DEBUG -+ static unsigned int freq_debug = DEBUG; -+ MODULE_PARM(freq_debug, "i"); -+ MODULE_PARM_DESC(freq_debug, "Set the debug messages to on=1/off=0"); -+#else -+ #define freq_debug 0 -+#endif -+ -+typedef struct -+{ -+ unsigned int khz; -+ unsigned int membus; -+ unsigned int cccr; -+ unsigned int div2; -+} pxa_freqs_t; -+ -+/* Define the refresh period in mSec for the SDRAM and the number of rows */ -+#define SDRAM_TREF 64 /* standard 64ms SDRAM */ -+#define SDRAM_ROWS 4096 /* 64MB=8192 32MB=4096 */ -+#define MDREFR_DRI(x) ((x*SDRAM_TREF)/(SDRAM_ROWS*32)) -+ -+#define CCLKCFG_TURBO 0x1 -+#define CCLKCFG_FCS 0x2 -+#define PXA25x_MIN_FREQ 99500 -+#define PXA25x_MAX_FREQ 398100 -+#define MDREFR_DB2_MASK (MDREFR_K2DB2 | MDREFR_K1DB2) -+#define MDREFR_DRI_MASK 0xFFF -+ -+ -+/* Use the run mode frequencies for the CPUFREQ_POLICY_PERFORMANCE policy */ -+static pxa_freqs_t pxa255_run_freqs[] = -+{ -+ /* CPU MEMBUS CCCR DIV2*/ -+ { 99500, 99500, 0x121, 1}, /* run= 99, turbo= 99, PXbus=50, SDRAM=50 */ -+ {132700, 132700, 0x123, 1}, /* run=133, turbo=133, PXbus=66, SDRAM=66 */ -+ {199100, 99500, 0x141, 0}, /* run=199, turbo=199, PXbus=99, SDRAM=99 */ -+ {265400, 132700, 0x143, 1}, /* run=265, turbo=265, PXbus=133, SDRAM=66 */ -+ {331800, 165900, 0x145, 1}, /* run=331, turbo=331, PXbus=166, SDRAM=83 */ -+ {398100, 99500, 0x161, 0}, /* run=398, turbo=398, PXbus=196, SDRAM=99 */ -+ {0,} -+}; -+#define NUM_RUN_FREQS (sizeof(pxa255_run_freqs)/sizeof(pxa_freqs_t)) -+ -+static struct cpufreq_frequency_table pxa255_run_freq_table[NUM_RUN_FREQS+1]; -+ -+/* Use the turbo mode frequencies for the CPUFREQ_POLICY_POWERSAVE policy */ -+static pxa_freqs_t pxa255_turbo_freqs[] = -+{ -+ /* CPU MEMBUS CCCR DIV2*/ -+ { 99500, 99500, 0x121, 1}, /* run=99, turbo= 99, PXbus=50, SDRAM=50 */ -+ {199100, 99500, 0x221, 0}, /* run=99, turbo=199, PXbus=50, SDRAM=99 */ -+ {298500, 99500, 0x321, 0}, /* run=99, turbo=287, PXbus=50, SDRAM=99 */ -+ {298600, 99500, 0x1c1, 0}, /* run=199, turbo=287, PXbus=99, SDRAM=99 */ -+ {398100, 99500, 0x241, 0}, /* run=199, turbo=398, PXbus=99, SDRAM=99 */ -+ {0,} -+}; -+#define NUM_TURBO_FREQS (sizeof(pxa255_turbo_freqs)/sizeof(pxa_freqs_t)) -+ -+static struct cpufreq_frequency_table pxa255_turbo_freq_table[NUM_TURBO_FREQS+1]; -+ -+extern unsigned get_clk_frequency_khz(int info); -+ -+/* find a valid frequency point */ -+static int pxa_verify_policy(struct cpufreq_policy *policy) -+{ -+ int ret; -+ struct cpufreq_frequency_table *pxa_freqs_table; -+ -+ if(policy->policy == CPUFREQ_POLICY_PERFORMANCE) { -+ pxa_freqs_table = pxa255_run_freq_table; -+ } else if (policy->policy == CPUFREQ_POLICY_POWERSAVE) { -+ pxa_freqs_table = pxa255_turbo_freq_table; -+ } else { -+ printk("CPU PXA: Unknown policy found. " -+ "Using CPUFREQ_POLICY_PERFORMANCE\n"); -+ pxa_freqs_table = pxa255_run_freq_table; -+ } -+ ret=cpufreq_frequency_table_verify(policy, pxa_freqs_table); -+ -+ if(freq_debug) { -+ printk("Verified CPU policy: %dKhz min to %dKhz max\n", -+ policy->min, policy->max); -+ } -+ -+ return ret; -+} -+ -+static int pxa_set_target(struct cpufreq_policy *policy, -+ unsigned int target_freq, -+ unsigned int relation) -+{ -+ int idx; -+ unsigned long cpus_allowed; -+ int cpu = policy->cpu; -+ struct cpufreq_freqs freqs; -+ pxa_freqs_t *pxa_freq_settings; -+ struct cpufreq_frequency_table *pxa_freqs_table; -+ unsigned long flags; -+ unsigned int unused; -+ unsigned int preset_mdrefr, postset_mdrefr; -+ -+ /* -+ * Save this threads cpus_allowed mask. -+ */ -+ cpus_allowed = current->cpus_allowed; -+ -+ /* -+ * Bind to the specified CPU. When this call returns, -+ * we should be running on the right CPU. -+ */ -+ set_cpus_allowed(current, 1 << cpu); -+ BUG_ON(cpu != smp_processor_id()); -+ -+ /* Get the current policy */ -+ if(policy->policy == CPUFREQ_POLICY_PERFORMANCE) { -+ pxa_freq_settings = pxa255_run_freqs; -+ pxa_freqs_table = pxa255_run_freq_table; -+ }else if (policy->policy == CPUFREQ_POLICY_POWERSAVE) { -+ pxa_freq_settings = pxa255_turbo_freqs; -+ pxa_freqs_table = pxa255_turbo_freq_table; -+ }else { -+ printk("CPU PXA: Unknown policy found. " -+ "Using CPUFREQ_POLICY_PERFORMANCE\n"); -+ pxa_freq_settings = pxa255_run_freqs; -+ pxa_freqs_table = pxa255_run_freq_table; -+ } -+ -+ /* Lookup the next frequency */ -+ if (cpufreq_frequency_table_target(policy, pxa_freqs_table, -+ target_freq, relation, &idx)) { -+ return -EINVAL; -+ } -+ -+ freqs.old = policy->cur; -+ freqs.new = pxa_freq_settings[idx].khz; -+ freqs.cpu = policy->cpu; -+ if(freq_debug) { -+ printk(KERN_INFO "Changing CPU frequency to %d Mhz, (SDRAM %d Mhz)\n", -+ freqs.new/1000, (pxa_freq_settings[idx].div2) ? -+ (pxa_freq_settings[idx].membus/2000) : -+ (pxa_freq_settings[idx].membus/1000)); -+ } -+ -+ void *ramstart = phys_to_virt(0xa0000000); -+ -+ /* -+ * Tell everyone what we're about to do... -+ * you should add a notify client with any platform specific -+ * Vcc changing capability -+ */ -+ cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); -+ -+ /* Calculate the next MDREFR. If we're slowing down the SDRAM clock -+ * we need to preset the smaller DRI before the change. If we're speeding -+ * up we need to set the larger DRI value after the change. -+ */ -+ preset_mdrefr = postset_mdrefr = MDREFR; -+ if((MDREFR & MDREFR_DRI_MASK) > MDREFR_DRI(pxa_freq_settings[idx].membus)) { -+ preset_mdrefr = (preset_mdrefr & ~MDREFR_DRI_MASK) | -+ MDREFR_DRI(pxa_freq_settings[idx].membus); -+ } -+ postset_mdrefr = (postset_mdrefr & ~MDREFR_DRI_MASK) | -+ MDREFR_DRI(pxa_freq_settings[idx].membus); -+ -+ /* If we're dividing the memory clock by two for the SDRAM clock, this -+ * must be set prior to the change. Clearing the divide must be done -+ * after the change. -+ */ -+ if(pxa_freq_settings[idx].div2) { -+ preset_mdrefr |= MDREFR_DB2_MASK; -+ postset_mdrefr |= MDREFR_DB2_MASK; -+ } else { -+ postset_mdrefr &= ~MDREFR_DB2_MASK; -+ } -+ -+ local_irq_save(flags); -+ -+ /* Set new the CCCR */ -+ CCCR = pxa_freq_settings[idx].cccr; -+ -+ __asm__ __volatile__(" \ -+ ldr r4, [%1] ; /* load MDREFR */ \ -+ b 2f ; \ -+ .align 5 ; \ -+1: \ -+ str %4, [%1] ; /* preset the MDREFR */ \ -+ mcr p14, 0, %2, c6, c0, 0 ; /* set CCLKCFG[FCS] */ \ -+ str %5, [%1] ; /* postset the MDREFR */ \ -+ \ -+ b 3f ; \ -+2: b 1b ; \ -+3: nop ; \ -+ " -+ : "=&r" (unused) -+ : "r" (&MDREFR), "r" (CCLKCFG_TURBO|CCLKCFG_FCS), "r" (ramstart), \ -+ "r" (preset_mdrefr), "r" (postset_mdrefr) -+ : "r4", "r5"); -+ local_irq_restore(flags); -+ -+ /* -+ * Restore the CPUs allowed mask. -+ */ -+ set_cpus_allowed(current, cpus_allowed); -+ -+ /* -+ * Tell everyone what we've just done... -+ * you should add a notify client with any platform specific -+ * SDRAM refresh timer adjustments -+ */ -+ cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); -+ -+ return 0; -+} -+ -+static int pxa_cpufreq_init(struct cpufreq_policy *policy) -+{ -+ unsigned long cpus_allowed; -+ unsigned int cpu = policy->cpu; -+ int i; -+ -+ cpus_allowed = current->cpus_allowed; -+ -+ set_cpus_allowed(current, 1 << cpu); -+ BUG_ON(cpu != smp_processor_id()); -+ -+ /* set default policy and cpuinfo */ -+ policy->governor = CPUFREQ_DEFAULT_GOVERNOR; -+ policy->policy = CPUFREQ_POLICY_PERFORMANCE; -+ policy->cpuinfo.max_freq = PXA25x_MAX_FREQ; -+ policy->cpuinfo.min_freq = PXA25x_MIN_FREQ; -+ policy->cpuinfo.transition_latency = 1000; /* FIXME: 1 ms, assumed */ -+ policy->cur = get_clk_frequency_khz(0); /* current freq */ -+ policy->min = policy->max = policy->cur; -+ -+ /* Generate the run cpufreq_frequency_table struct */ -+ for(i=0;i -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+ -+static struct proc_dir_entry *proc_gpio_parent; -+static struct proc_dir_entry *proc_gpios[PXA_LAST_GPIO + 1]; -+ -+typedef struct -+{ -+ int gpio; -+ char name[32]; -+} gpio_summary_type; -+ -+static gpio_summary_type gpio_summaries[PXA_LAST_GPIO + 1]; -+ -+static int proc_gpio_write(struct file *file, const char __user *buf, -+ unsigned long count, void *data) -+{ -+ char *cur, lbuf[count + 1]; -+ gpio_summary_type *summary = data; -+ u32 altfn, direction, setclear, gafr; -+ -+ if (!capable(CAP_SYS_ADMIN)) -+ return -EACCES; -+ -+ memset(lbuf, 0, count + 1); -+ -+ if (copy_from_user(lbuf, buf, count)) -+ return -EFAULT; -+ -+ cur = lbuf; -+ -+ // Initialize to current state -+ altfn = ((GAFR(summary->gpio) >> ((summary->gpio & 0x0f) << 0x01)) & 0x03); -+ direction = GPDR(summary->gpio) & GPIO_bit(summary->gpio); -+ setclear = GPLR(summary->gpio) & GPIO_bit(summary->gpio); -+ while(1) -+ { -+ // We accept options: {GPIO|AF1|AF2|AF3}, {set|clear}, {in|out} -+ // Anything else is an error -+ while(cur[0] && (isspace(cur[0]) || ispunct(cur[0]))) cur = &(cur[1]); -+ -+ if('\0' == cur[0]) break; -+ -+ // Ok, so now we're pointing at the start of something -+ switch(cur[0]) -+ { -+ case 'G': -+ // Check that next is "PIO" -- '\0' will cause safe short-circuit if end of buf -+ if(!(cur[1] == 'P' && cur[2] == 'I' && cur[3] == 'O')) goto parse_error; -+ // Ok, so set this GPIO to GPIO (non-ALT) function -+ altfn = 0; -+ cur = &(cur[4]); -+ break; -+ case 'A': -+ if(!(cur[1] == 'F' && cur[2] >= '1' && cur[2] <= '3')) goto parse_error; -+ altfn = cur[2] - '0'; -+ cur = &(cur[3]); -+ break; -+ case 's': -+ if(!(cur[1] == 'e' && cur[2] == 't')) goto parse_error; -+ setclear = 1; -+ cur = &(cur[3]); -+ break; -+ case 'c': -+ if(!(cur[1] == 'l' && cur[2] == 'e' && cur[3] == 'a' && cur[4] == 'r')) goto parse_error; -+ setclear = 0; -+ cur = &(cur[5]); -+ break; -+ case 'i': -+ if(!(cur[1] == 'n')) goto parse_error; -+ direction = 0; -+ cur = &(cur[2]); -+ break; -+ case 'o': -+ if(!(cur[1] == 'u' && cur[2] == 't')) goto parse_error; -+ direction = 1; -+ cur = &(cur[3]); -+ break; -+ default: goto parse_error; -+ } -+ } -+ // Ok, now set gpio mode and value -+ if(direction) -+ GPDR(summary->gpio) |= GPIO_bit(summary->gpio); -+ else -+ GPDR(summary->gpio) &= ~GPIO_bit(summary->gpio); -+ -+ gafr = GAFR(summary->gpio) & ~(0x3 << (((summary->gpio) & 0xf)*2)); -+ GAFR(summary->gpio) = gafr | (altfn << (((summary->gpio) & 0xf)*2)); -+ -+ if(direction && !altfn) -+ { -+ if(setclear) GPSR(summary->gpio) = GPIO_bit(summary->gpio); -+ else GPCR(summary->gpio) = GPIO_bit(summary->gpio); -+ } -+ -+#ifdef CONFIG_PROC_GPIO_DEBUG -+ printk(KERN_INFO "Set (%s,%s,%s) via /proc/gpio/%s\n",altfn ? (altfn == 1 ? "AF1" : (altfn == 2 ? "AF2" : "AF3")) : "GPIO", -+ direction ? "out" : "in", -+ setclear ? "set" : "clear", -+ summary->name); -+#endif -+ -+ return count; -+ -+parse_error: -+ printk(KERN_CRIT "Parse error: Expect \"[GPIO|AF1|AF2|AF3]|[set|clear]|[in|out] ...\"\n"); -+ return -EINVAL; -+} -+ -+static int proc_gpio_read(char *page, char **start, off_t off, -+ int count, int *eof, void *data) -+{ -+ char *p = page; -+ gpio_summary_type *summary = data; -+ int len, i, af; -+ i = summary->gpio; -+ -+ p += sprintf(p, "%d\t%s\t%s\t%s\n", i, -+ (af = ((GAFR(i) >> ((i & 0x0f) << 0x01)) & 0x03)) ? (af == 1 ? "AF1" : (af == 2 ? "AF2" : "AF3")) : "GPIO", -+ (GPDR(i) & GPIO_bit(i)) ? "out" : "in", -+ (GPLR(i) & GPIO_bit(i)) ? "set" : "clear"); -+ -+ len = (p - page) - off; -+ -+ if(len < 0) -+ { -+ len = 0; -+ } -+ -+ *eof = (len <= count) ? 1 : 0; -+ *start = page + off; -+ -+ return len; -+} -+ -+ -+#ifdef CONFIG_PXA25x -+static const char const *GAFR_DESC[] = { "GAFR0_L", "GAFR0_U", "GAFR1_L", "GAFR1_U", "GAFR2_L", "GAFR2_U" }; -+#elif defined(CONFIG_PXA27x) -+static const char const *GAFR_DESC[] = { "GAFR0_L", "GAFR0_U", "GAFR1_L", "GAFR1_U", "GAFR2_L", "GAFR2_U", "GAFR3_L", "GAFR3_U" }; -+#endif -+ -+static int proc_gafr_read(char *page, char **start, off_t off, -+ int count, int *eof, void *data) -+{ -+ char *p = page; -+ int i, len; -+ -+ for(i=0; idata = &gpio_summaries[i]; -+ proc_gpios[i]->read_proc = proc_gpio_read; -+ proc_gpios[i]->write_proc = proc_gpio_write; -+ } -+ } -+ -+ create_proc_read_entry("GAFR", 0444, proc_gpio_parent, proc_gafr_read, NULL); -+ create_proc_read_entry("GPDR", 0444, proc_gpio_parent, proc_gpdr_read, NULL); -+ create_proc_read_entry("GPLR", 0444, proc_gpio_parent, proc_gplr_read, NULL); -+ -+ return 0; -+} -+ -+static void gpio_exit(void) -+{ -+ int i; -+ -+ remove_proc_entry("GAFR", proc_gpio_parent); -+ remove_proc_entry("GPDR", proc_gpio_parent); -+ remove_proc_entry("GPLR", proc_gpio_parent); -+ -+ for(i=0; i < (PXA_LAST_GPIO+1); i++) -+ { -+ if(proc_gpios[i]) remove_proc_entry(gpio_summaries[i].name, proc_gpio_parent); -+ } -+ if(proc_gpio_parent) remove_proc_entry("gpio", NULL); -+} -+ -+module_init(gpio_init); -+module_exit(gpio_exit); -+MODULE_LICENSE("GPL"); diff --git a/target/linux/pxa/patches-2.6.21/012-serial-ether-addr.patch b/target/linux/pxa/patches-2.6.21/012-serial-ether-addr.patch deleted file mode 100644 index 7fdbebe5a..000000000 --- a/target/linux/pxa/patches-2.6.21/012-serial-ether-addr.patch +++ /dev/null @@ -1,60 +0,0 @@ ---- a/drivers/usb/gadget/ether.c -+++ b/drivers/usb/gadget/ether.c -@@ -2249,6 +2249,38 @@ static u8 __devinit nibble (unsigned cha - return 0; - } - -+static inline unsigned int is_gumstix_oui(u8 *addr) -+{ -+ return (addr[0] == 0x00 && addr[1] == 0x15 && addr[2] == 0xC9); -+} -+ -+/** -+ * gen_serial_ether_addr - Generate software assigned Ethernet address -+ * based on the system_serial number -+ * @addr: Pointer to a six-byte array containing the Ethernet address -+ * -+ * Generate an Ethernet address (MAC) that is not multicast -+ * and has the local assigned bit set, keyed on the system_serial -+ */ -+static inline void gen_serial_ether_addr(u8 *addr) -+{ -+ static u8 ether_serial_digit = 0; -+ addr [0] = system_serial_high >> 8; -+ addr [1] = system_serial_high; -+ addr [2] = system_serial_low >> 24; -+ addr [3] = system_serial_low >> 16; -+ addr [4] = system_serial_low >> 8; -+ addr [5] = (system_serial_low & 0xc0) | /* top bits are from system serial */ -+ (2 << 4) | /* 2 bits identify interface type 1=ether, 2=usb, 3&4 undef */ -+ ((ether_serial_digit++) & 0x0f); /* 15 possible interfaces of each type */ -+ -+ if(!is_gumstix_oui(addr)) -+ { -+ addr [0] &= 0xfe; /* clear multicast bit */ -+ addr [0] |= 0x02; /* set local assignment bit (IEEE802) */ -+ } -+} -+ - static int __devinit get_ether_addr(const char *str, u8 *dev_addr) - { - if (str) { -@@ -2266,8 +2298,16 @@ static int __devinit get_ether_addr(cons - if (is_valid_ether_addr (dev_addr)) - return 0; - } -- random_ether_addr(dev_addr); -- return 1; -+ if(system_serial_high | system_serial_low) -+ { -+ gen_serial_ether_addr(dev_addr); -+ return 0; -+ } -+ else -+ { -+ random_ether_addr(dev_addr); -+ return 1; -+ } - } - - static int __devinit diff --git a/target/linux/pxa/patches-2.6.21/013-cpufreq-better-freqs.patch b/target/linux/pxa/patches-2.6.21/013-cpufreq-better-freqs.patch deleted file mode 100644 index 89a9fa37b..000000000 --- a/target/linux/pxa/patches-2.6.21/013-cpufreq-better-freqs.patch +++ /dev/null @@ -1,51 +0,0 @@ ---- a/arch/arm/mach-pxa/cpu-pxa.c -+++ b/arch/arm/mach-pxa/cpu-pxa.c -@@ -65,8 +65,8 @@ typedef struct - - #define CCLKCFG_TURBO 0x1 - #define CCLKCFG_FCS 0x2 --#define PXA25x_MIN_FREQ 99500 --#define PXA25x_MAX_FREQ 398100 -+#define PXA25x_MIN_FREQ 99533 -+#define PXA25x_MAX_FREQ 530842 - #define MDREFR_DB2_MASK (MDREFR_K2DB2 | MDREFR_K1DB2) - #define MDREFR_DRI_MASK 0xFFF - -@@ -75,12 +75,14 @@ typedef struct - static pxa_freqs_t pxa255_run_freqs[] = - { - /* CPU MEMBUS CCCR DIV2*/ -- { 99500, 99500, 0x121, 1}, /* run= 99, turbo= 99, PXbus=50, SDRAM=50 */ -- {132700, 132700, 0x123, 1}, /* run=133, turbo=133, PXbus=66, SDRAM=66 */ -- {199100, 99500, 0x141, 0}, /* run=199, turbo=199, PXbus=99, SDRAM=99 */ -- {265400, 132700, 0x143, 1}, /* run=265, turbo=265, PXbus=133, SDRAM=66 */ -- {331800, 165900, 0x145, 1}, /* run=331, turbo=331, PXbus=166, SDRAM=83 */ -- {398100, 99500, 0x161, 0}, /* run=398, turbo=398, PXbus=196, SDRAM=99 */ -+ { 99533, 99533, 0x121, 1}, /* run= 99, turbo= 99, PXbus=50, SDRAM=50 */ -+ {132710, 132710, 0x123, 1}, /* run=133, turbo=133, PXbus=66, SDRAM=66 */ -+ {199066, 99533, 0x141, 0}, /* run=199, turbo=199, PXbus=99, SDRAM=99 */ -+ {265421, 132710, 0x143, 0}, /* run=265, turbo=265, PXbus=133, SDRAM=133 */ -+ {331776, 165888, 0x145, 1}, /* run=331, turbo=331, PXbus=166, SDRAM=83 */ -+ {398131, 99533, 0x161, 0}, /* run=398, turbo=398, PXbus=99, SDRAM=99 */ -+ {398131, 132710, 0x1c3, 0}, /* run=265, turbo=398, PXbus=133, SDRAM=133 */ -+ {530842, 132710, 0x163, 0}, /* run=531, turbo=531, PXbus=133, SDRAM=133 */ - {0,} - }; - #define NUM_RUN_FREQS (sizeof(pxa255_run_freqs)/sizeof(pxa_freqs_t)) -@@ -91,11 +93,11 @@ static struct cpufreq_frequency_table px - static pxa_freqs_t pxa255_turbo_freqs[] = - { - /* CPU MEMBUS CCCR DIV2*/ -- { 99500, 99500, 0x121, 1}, /* run=99, turbo= 99, PXbus=50, SDRAM=50 */ -- {199100, 99500, 0x221, 0}, /* run=99, turbo=199, PXbus=50, SDRAM=99 */ -- {298500, 99500, 0x321, 0}, /* run=99, turbo=287, PXbus=50, SDRAM=99 */ -- {298600, 99500, 0x1c1, 0}, /* run=199, turbo=287, PXbus=99, SDRAM=99 */ -- {398100, 99500, 0x241, 0}, /* run=199, turbo=398, PXbus=99, SDRAM=99 */ -+ { 99533, 99533, 0x121, 1}, /* run=99, turbo= 99, PXbus=99, SDRAM=50 */ -+ {149299, 99533, 0x1a1, 0}, /* run=99, turbo=149, PXbus=99, SDRAM=99 */ -+ {199066, 99533, 0x221, 0}, /* run=99, turbo=199, PXbus=99, SDRAM=99 */ -+ {298598, 99533, 0x321, 0}, /* run=99, turbo=299, PXbus=99, SDRAM=99 */ -+ {398131, 99533, 0x241, 1}, /* run=199, turbo=398, PXbus=99, SDRAM=50 */ - {0,} - }; - #define NUM_TURBO_FREQS (sizeof(pxa255_turbo_freqs)/sizeof(pxa_freqs_t)) diff --git a/target/linux/pxa/patches-2.6.21/014-ethernet-config.patch b/target/linux/pxa/patches-2.6.21/014-ethernet-config.patch deleted file mode 100644 index be38f03f7..000000000 --- a/target/linux/pxa/patches-2.6.21/014-ethernet-config.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- a/drivers/net/smc91x.h -+++ b/drivers/net/smc91x.h -@@ -55,6 +55,21 @@ - #define SMC_insw(a, r, p, l) readsw((a) + (r), p, l) - #define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) - -+#elif defined(CONFIG_ARCH_GUMSTIX) -+#define SMC_CAN_USE_8BIT 0 -+#define SMC_CAN_USE_16BIT 1 -+#define SMC_CAN_USE_32BIT 0 -+#define SMC_NOWAIT 1 -+#define SMC_USE_PXA_DMA 1 -+#define SMC_IO_SHIFT 0 -+#define SMC_inw(a, r) readw((a) + (r)) -+#define SMC_outw(v, a, r) writew(v, (a) + (r)) -+#define SMC_insw(a, r, p, l) readsw((a) + (r), p, l) -+#define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) -+#define RPC_LSA_DEFAULT RPC_LED_100_10 -+#define RPC_LSB_DEFAULT RPC_LED_TX_RX -+ -+ - #elif defined(CONFIG_REDWOOD_5) || defined(CONFIG_REDWOOD_6) - - /* We can only do 16-bit reads and writes in the static memory space. */ diff --git a/target/linux/pxa/patches-2.6.21/015-smc-ether-addr.patch b/target/linux/pxa/patches-2.6.21/015-smc-ether-addr.patch deleted file mode 100644 index 285a8f080..000000000 --- a/target/linux/pxa/patches-2.6.21/015-smc-ether-addr.patch +++ /dev/null @@ -1,60 +0,0 @@ ---- a/drivers/net/smc91x.c -+++ b/drivers/net/smc91x.c -@@ -1815,6 +1815,39 @@ static int __init smc_findirq(void __iom - return probe_irq_off(cookie); - } - -+static inline unsigned int is_gumstix_oui(u8 *addr) -+{ -+ return (addr[0] == 0x00 && addr[1] == 0x15 && addr[2] == 0xC9); -+} -+ -+/** -+ * gen_serial_ether_addr - Generate software assigned Ethernet address -+ * based on the system_serial number -+ * @addr: Pointer to a six-byte array containing the Ethernet address -+ * -+ * Generate an Ethernet address (MAC) that is not multicast -+ * and has the local assigned bit set, keyed on the system_serial -+ */ -+static inline void gen_serial_ether_addr(u8 *addr) -+{ -+ static u8 ether_serial_digit = 0; -+ addr [0] = system_serial_high >> 8; -+ addr [1] = system_serial_high; -+ addr [2] = system_serial_low >> 24; -+ addr [3] = system_serial_low >> 16; -+ addr [4] = system_serial_low >> 8; -+ addr [5] = (system_serial_low & 0xc0) | /* top bits are from system serial */ -+ (1 << 4) | /* 2 bits identify interface type 1=ether, 2=usb, 3&4 undef */ -+ ((ether_serial_digit++) & 0x0f); /* 15 possible interfaces of each type */ -+ -+ if(!is_gumstix_oui(addr)) -+ { -+ addr [0] &= 0xfe; /* clear multicast bit */ -+ addr [0] |= 0x02; /* set local assignment bit (IEEE802) */ -+ } -+} -+ -+ - /* - * Function: smc_probe(unsigned long ioaddr) - * -@@ -2032,15 +2065,13 @@ static int __init smc_probe(struct net_d - THROTTLE_TX_PKTS ? " [throttle_tx]" : ""); - - if (!is_valid_ether_addr(dev->dev_addr)) { -- printk("%s: Invalid ethernet MAC address. Please " -- "set using ifconfig\n", dev->name); -- } else { -+ gen_serial_ether_addr(dev->dev_addr); -+ } - /* Print the Ethernet address */ - printk("%s: Ethernet addr: ", dev->name); - for (i = 0; i < 5; i++) - printk("%2.2x:", dev->dev_addr[i]); - printk("%2.2x\n", dev->dev_addr[5]); -- } - - if (lp->phy_type == 0) { - PRINTK("%s: No PHY found\n", dev->name); diff --git a/target/linux/pxa/patches-2.6.21/016-cpufreq-ondemand-by-default.patch b/target/linux/pxa/patches-2.6.21/016-cpufreq-ondemand-by-default.patch deleted file mode 100644 index 78d99f2bc..000000000 --- a/target/linux/pxa/patches-2.6.21/016-cpufreq-ondemand-by-default.patch +++ /dev/null @@ -1,38 +0,0 @@ ---- a/drivers/cpufreq/Kconfig -+++ b/drivers/cpufreq/Kconfig -@@ -52,7 +52,7 @@ config CPU_FREQ_STAT_DETAILS - - choice - prompt "Default CPUFreq governor" -- default CPU_FREQ_DEFAULT_GOV_USERSPACE if CPU_FREQ_SA1100 || CPU_FREQ_SA1110 -+ default CPU_FREQ_DEFAULT_GOV_USERSPACE if CPU_FREQ_SA1100 || CPU_FREQ_SA1110 || CPU_FREQ_PXA - default CPU_FREQ_DEFAULT_GOV_PERFORMANCE - help - This option sets which CPUFreq governor shall be loaded at -@@ -75,6 +75,14 @@ config CPU_FREQ_DEFAULT_GOV_USERSPACE - program shall be able to set the CPU dynamically without having - to enable the userspace governor manually. - -+config CPU_FREQ_DEFAULT_GOV_ONDEMAND -+ bool "ondemand" -+ select CPU_FREQ_GOV_ONDEMAND -+ help -+ Use the CPUFreq governor 'ondemand' as default. This sets -+ the frequency dynamically based on CPU load, throttling up -+ and down as necessary. -+ - endchoice - - config CPU_FREQ_GOV_PERFORMANCE ---- a/include/linux/cpufreq.h -+++ b/include/linux/cpufreq.h -@@ -286,6 +286,9 @@ extern struct cpufreq_governor cpufreq_g - #elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE) - extern struct cpufreq_governor cpufreq_gov_userspace; - #define CPUFREQ_DEFAULT_GOVERNOR &cpufreq_gov_userspace -+#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND) -+extern struct cpufreq_governor cpufreq_gov_dbs; -+#define CPUFREQ_DEFAULT_GOVERNOR &cpufreq_gov_dbs; - #endif - - diff --git a/target/linux/pxa/patches-2.6.21/017-modular-init-bluetooth.patch b/target/linux/pxa/patches-2.6.21/017-modular-init-bluetooth.patch deleted file mode 100644 index 306cc8e8e..000000000 --- a/target/linux/pxa/patches-2.6.21/017-modular-init-bluetooth.patch +++ /dev/null @@ -1,100 +0,0 @@ ---- a/net/bluetooth/Kconfig -+++ b/net/bluetooth/Kconfig -@@ -30,6 +30,12 @@ menuconfig BT - Bluetooth kernel modules are provided in the BlueZ packages. - For more information, see . - -+config BT_GUMSTIX -+ tristate -+ default m if BT=m -+ default y if BT=y -+ depends on BT && ARCH_GUMSTIX -+ - config BT_L2CAP - tristate "L2CAP protocol support" - depends on BT ---- a/net/bluetooth/Makefile -+++ b/net/bluetooth/Makefile -@@ -9,5 +9,6 @@ obj-$(CONFIG_BT_RFCOMM) += rfcomm/ - obj-$(CONFIG_BT_BNEP) += bnep/ - obj-$(CONFIG_BT_CMTP) += cmtp/ - obj-$(CONFIG_BT_HIDP) += hidp/ -+obj-$(CONFIG_BT_GUMSTIX)+= gumstix_bluetooth.o - - bluetooth-objs := af_bluetooth.o hci_core.o hci_conn.o hci_event.o hci_sock.o hci_sysfs.o lib.o ---- a/net/bluetooth/af_bluetooth.c -+++ b/net/bluetooth/af_bluetooth.c -@@ -327,12 +327,20 @@ static struct net_proto_family bt_sock_f - .create = bt_sock_create, - }; - -+#ifdef CONFIG_ARCH_GUMSTIX -+extern void gumstix_bluetooth_load(void); -+#endif -+ - static int __init bt_init(void) - { - int err; - - BT_INFO("Core ver %s", VERSION); - -+#ifdef CONFIG_ARCH_GUMSTIX -+ gumstix_bluetooth_load(); -+#endif -+ - err = bt_sysfs_init(); - if (err < 0) - return err; ---- /dev/null -+++ b/net/bluetooth/gumstix_bluetooth.c -@@ -0,0 +1,50 @@ -+/* -+ * Gumstix bluetooth module intialization driver -+ * -+ * Author: Craig Hughes -+ * Created: December 9, 2004 -+ * Copyright: (C) 2004 Craig Hughes -+ * -+ * 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. -+ * -+ */ -+ -+#include -+ -+#include -+#include -+#include -+ -+#include -+ -+static void gumstix_bluetooth_load(void) -+{ -+} -+ -+EXPORT_SYMBOL(gumstix_bluetooth_load); -+ -+int __init gumstix_bluetooth_init(void) -+{ -+ /* Set up GPIOs to use the BTUART */ -+ pxa_gpio_mode(GPIO42_HWRXD_MD); -+ pxa_gpio_mode(GPIO43_HWTXD_MD); -+ pxa_gpio_mode(GPIO44_HWCTS_MD); -+ pxa_gpio_mode(GPIO45_HWRTS_MD); -+ -+ return 0; -+} -+ -+void __exit gumstix_bluetooth_exit(void) -+{ -+} -+ -+module_init(gumstix_bluetooth_init); -+module_exit(gumstix_bluetooth_exit); -+ -+MODULE_LICENSE("GPL"); -+MODULE_AUTHOR("Craig Hughes "); -+MODULE_DESCRIPTION("Gumstix board bluetooth module initialization driver"); -+MODULE_VERSION("1:0.1"); diff --git a/target/linux/pxa/patches-2.6.21/018-modular-init-smc91x.patch b/target/linux/pxa/patches-2.6.21/018-modular-init-smc91x.patch deleted file mode 100644 index 993f30b41..000000000 --- a/target/linux/pxa/patches-2.6.21/018-modular-init-smc91x.patch +++ /dev/null @@ -1,195 +0,0 @@ ---- a/drivers/net/Kconfig -+++ b/drivers/net/Kconfig -@@ -959,6 +959,12 @@ config SMC91X - module, say M here and read as well - as . - -+config SMC91X_GUMSTIX -+ tristate -+ default m if SMC91X=m -+ default y if SMC91X=y -+ depends on SMC91X && ARCH_GUMSTIX -+ - config SMC9194 - tristate "SMC 9194 support" - depends on NET_VENDOR_SMC && (ISA || MAC && BROKEN) ---- a/drivers/net/Makefile -+++ b/drivers/net/Makefile -@@ -201,6 +201,7 @@ obj-$(CONFIG_PASEMI_MAC) += pasemi_mac.o - - obj-$(CONFIG_MACB) += macb.o - -+obj-$(CONFIG_SMC91X_GUMSTIX) += gumstix-smc91x.o - obj-$(CONFIG_ARM) += arm/ - obj-$(CONFIG_DEV_APPLETALK) += appletalk/ - obj-$(CONFIG_TR) += tokenring/ ---- a/drivers/net/smc91x.c -+++ b/drivers/net/smc91x.c -@@ -2373,6 +2373,10 @@ static struct platform_driver smc_driver - }, - }; - -+#ifdef CONFIG_ARCH_GUMSTIX -+extern void gumstix_smc91x_load(void); -+#endif -+ - static int __init smc_init(void) - { - #ifdef MODULE -@@ -2384,6 +2388,10 @@ static int __init smc_init(void) - #endif - #endif - -+#ifdef CONFIG_ARCH_GUMSTIX -+ gumstix_smc91x_load(); -+#endif -+ - return platform_driver_register(&smc_driver); - } - ---- /dev/null -+++ b/drivers/net/gumstix-smc91x.c -@@ -0,0 +1,143 @@ -+/* -+ * Gumstix SMC91C111 chip intialization driver -+ * -+ * Author: Craig Hughes -+ * Created: December 9, 2004 -+ * Copyright: (C) 2004 Craig Hughes -+ * -+ * 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. -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+ -+#include -+ -+#define SMC_DEBUG 0 -+#include -+#include "smc91x.h" -+ -+static struct resource gumstix_smc91x0_resources[] = { -+ [0] = { -+ .name = "smc91x-regs", -+ .start = PXA_CS1_PHYS + 0x00000300, -+ .end = PXA_CS1_PHYS + 0x000fffff, -+ .flags = IORESOURCE_MEM, -+ }, -+ [1] = { -+ .start = GUMSTIX_ETH0_IRQ, -+ .end = GUMSTIX_ETH0_IRQ, -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static struct resource gumstix_smc91x1_resources[] = { -+ [0] = { -+ .name = "smc91x-regs", -+ .start = PXA_CS2_PHYS + 0x00000300, -+ .end = PXA_CS2_PHYS + 0x000fffff, -+ .flags = IORESOURCE_MEM, -+ }, -+ [1] = { -+ .start = GUMSTIX_ETH1_IRQ, -+ .end = GUMSTIX_ETH1_IRQ, -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static struct platform_device gumstix_smc91x0_device = { -+ .name = "smc91x", -+ .id = 0, -+ .num_resources = ARRAY_SIZE(gumstix_smc91x0_resources), -+ .resource = gumstix_smc91x0_resources, -+}; -+ -+static struct platform_device gumstix_smc91x1_device = { -+ .name = "smc91x", -+ .id = 1, -+ .num_resources = ARRAY_SIZE(gumstix_smc91x1_resources), -+ .resource = gumstix_smc91x1_resources, -+}; -+ -+static struct platform_device *smc91x_devices[] = { -+ &gumstix_smc91x0_device, -+ &gumstix_smc91x1_device, -+}; -+ -+/* First we're going to test if there's a 2nd SMC91C111, and if not, then we'll free up those resources and the GPIO lines -+ * that it would otherwise use. We have no choice but to probe by doing: -+ * Set nCS2 to CS2 mode -+ * Set the reset line to GPIO out mode, and pull it high, then drop it low (to trigger reset) -+ * Read from the memory space to check for the sentinel sequence identifying a likely SMC91C111 device -+ */ -+int __init gumstix_smc91x_init(void) -+{ -+ unsigned int val, num_devices=ARRAY_SIZE(smc91x_devices); -+ void *ioaddr; -+ -+ /* Set up nPWE */ -+ pxa_gpio_mode(GPIO49_nPWE_MD); -+ -+ pxa_gpio_mode(GPIO78_nCS_2_MD); -+ // If either if statement fails, then we'll drop out and turn_off_eth1, -+ // if both succeed, then we'll skip that and just proceed with 2 cards -+ if(request_mem_region(gumstix_smc91x1_resources[0].start, SMC_IO_EXTENT, "smc91x probe")) -+ { -+ ioaddr = ioremap(gumstix_smc91x1_resources[0].start, SMC_IO_EXTENT); -+ val = ioread16(ioaddr + BANK_SELECT); -+ iounmap(ioaddr); -+ release_mem_region(gumstix_smc91x1_resources[0].start, SMC_IO_EXTENT); -+ if ((val & 0xFF00) == 0x3300) { -+ goto proceed; -+ } -+ } -+ -+turn_off_eth1: -+ // This is apparently not an SMC91C111 -+ // So, let's decrement the number of devices to request, and reset the GPIO lines to GPIO IN mode -+ num_devices--; -+ smc91x_devices[1] = NULL; -+ pxa_gpio_mode(78 | GPIO_IN); -+ -+proceed: -+ pxa_gpio_mode(GPIO15_nCS_1_MD); -+ -+ if(smc91x_devices[1]) pxa_gpio_mode(GPIO_GUMSTIX_ETH1_RST_MD); -+ pxa_gpio_mode(GPIO_GUMSTIX_ETH0_RST_MD); -+ if(smc91x_devices[1]) GPSR(GPIO_GUMSTIX_ETH1_RST) = GPIO_bit(GPIO_GUMSTIX_ETH1_RST); -+ GPSR(GPIO_GUMSTIX_ETH0_RST) = GPIO_bit(GPIO_GUMSTIX_ETH0_RST); -+ udelay(1); // Hold RESET for at least 100ns -+ if(smc91x_devices[1]) GPCR(GPIO_GUMSTIX_ETH1_RST) = GPIO_bit(GPIO_GUMSTIX_ETH1_RST); -+ GPCR(GPIO_GUMSTIX_ETH0_RST) = GPIO_bit(GPIO_GUMSTIX_ETH0_RST); -+ msleep(50); -+ -+ return platform_add_devices(smc91x_devices, num_devices); -+} -+ -+void __exit gumstix_smc91x_exit(void) -+{ -+ if(smc91x_devices[1] != NULL) platform_device_unregister(&gumstix_smc91x1_device); -+ platform_device_unregister(&gumstix_smc91x0_device); -+} -+ -+void gumstix_smc91x_load(void) {} -+EXPORT_SYMBOL(gumstix_smc91x_load); -+ -+module_init(gumstix_smc91x_init); -+module_exit(gumstix_smc91x_exit); -+ -+MODULE_LICENSE("GPL"); -+MODULE_AUTHOR("Craig Hughes "); -+MODULE_DESCRIPTION("Gumstix board SMC91C111 chip initialization driver"); -+MODULE_VERSION("1:0.1"); diff --git a/target/linux/pxa/patches-2.6.21/019-modular-init-usb-gadget.patch b/target/linux/pxa/patches-2.6.21/019-modular-init-usb-gadget.patch deleted file mode 100644 index e0017934f..000000000 --- a/target/linux/pxa/patches-2.6.21/019-modular-init-usb-gadget.patch +++ /dev/null @@ -1,98 +0,0 @@ ---- a/drivers/usb/gadget/Kconfig -+++ b/drivers/usb/gadget/Kconfig -@@ -56,6 +56,14 @@ config USB_GADGET_DEBUG_FILES - config USB_GADGET_SELECTED - boolean - -+config USB_GADGET_GUMSTIX -+ tristate -+ default m if USB_GADGET=m -+ default y if USB_GADGET=y -+ depends on USB_GADGET && ARCH_GUMSTIX -+ help -+ USB Gadget support for the Gumstix platform -+ - # - # USB Peripheral Controller Support - # ---- a/drivers/usb/gadget/Makefile -+++ b/drivers/usb/gadget/Makefile -@@ -8,6 +8,7 @@ obj-$(CONFIG_USB_GOKU) += goku_udc.o - obj-$(CONFIG_USB_OMAP) += omap_udc.o - obj-$(CONFIG_USB_LH7A40X) += lh7a40x_udc.o - obj-$(CONFIG_USB_AT91) += at91_udc.o -+obj-$(CONFIG_USB_GADGET_GUMSTIX) += gumstix_gadget.o - - # - # USB gadget drivers ---- a/drivers/usb/gadget/pxa2xx_udc.c -+++ b/drivers/usb/gadget/pxa2xx_udc.c -@@ -2752,8 +2752,16 @@ static struct platform_driver udc_driver - }, - }; - -+#ifdef CONFIG_ARCH_GUMSTIX -+extern void gumstix_usb_gadget_load(void); -+#endif -+ - static int __init udc_init(void) - { -+#ifdef CONFIG_ARCH_GUMSTIX -+ gumstix_usb_gadget_load(); -+#endif -+ - printk(KERN_INFO "%s: version %s\n", driver_name, DRIVER_VERSION); - return platform_driver_register(&udc_driver); - } ---- /dev/null -+++ b/drivers/usb/gadget/gumstix_gadget.c -@@ -0,0 +1,49 @@ -+/* -+ * Gumstix USB gadget intialization driver -+ * -+ * Author: Craig Hughes -+ * Created: December 9, 2004 -+ * Copyright: (C) 2004 Craig Hughes -+ * -+ * 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. -+ * -+ */ -+ -+#include -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+int __init gumstix_usb_gadget_init(void) -+{ -+ pxa_gpio_mode(GPIO_GUMSTIX_USB_GPIOx_DIS_MD); -+ pxa_gpio_mode(GPIO_GUMSTIX_USB_GPIOn_MD); -+ -+ set_irq_type(GUMSTIX_USB_INTR_IRQ, IRQT_BOTHEDGE); -+ -+ return 0; -+} -+ -+void __exit gumstix_usb_gadget_exit(void) -+{ -+} -+ -+void gumstix_usb_gadget_load(void) {} -+EXPORT_SYMBOL(gumstix_usb_gadget_load); -+ -+module_init(gumstix_usb_gadget_init); -+module_exit(gumstix_usb_gadget_exit); -+ -+MODULE_LICENSE("GPL"); -+MODULE_AUTHOR("Craig Hughes "); -+MODULE_DESCRIPTION("Gumstix board USB gadget initialization driver"); -+MODULE_VERSION("1:0.1"); diff --git a/target/linux/pxa/patches-2.6.21/020-bugfix-i2c-include.patch b/target/linux/pxa/patches-2.6.21/020-bugfix-i2c-include.patch deleted file mode 100644 index 5947e7df7..000000000 --- a/target/linux/pxa/patches-2.6.21/020-bugfix-i2c-include.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/drivers/i2c/busses/i2c-pxa.c -+++ b/drivers/i2c/busses/i2c-pxa.c -@@ -32,6 +32,7 @@ - #include - #include - -+#include - #include - #include - #include diff --git a/target/linux/pxa/patches-2.6.21/021-bugfix-mmc-clock.patch b/target/linux/pxa/patches-2.6.21/021-bugfix-mmc-clock.patch deleted file mode 100644 index d97997605..000000000 --- a/target/linux/pxa/patches-2.6.21/021-bugfix-mmc-clock.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/drivers/mmc/pxamci.c -+++ b/drivers/mmc/pxamci.c -@@ -366,8 +366,7 @@ static void pxamci_set_ios(struct mmc_ho - - if (ios->clock) { - unsigned int clk = CLOCKRATE / ios->clock; -- if (CLOCKRATE / clk > ios->clock) -- clk <<= 1; -+ if(clk > (1<<6)) clk = (1<<6); - host->clkrt = fls(clk) - 1; - pxa_set_cken(CKEN12_MMC, 1); - diff --git a/target/linux/pxa/patches-2.6.21/022-bugfix-pxa-cpufreq.patch b/target/linux/pxa/patches-2.6.21/022-bugfix-pxa-cpufreq.patch deleted file mode 100644 index c2397759a..000000000 --- a/target/linux/pxa/patches-2.6.21/022-bugfix-pxa-cpufreq.patch +++ /dev/null @@ -1,62 +0,0 @@ ---- a/arch/arm/mach-pxa/cpu-pxa.c -+++ b/arch/arm/mach-pxa/cpu-pxa.c -@@ -60,7 +60,7 @@ typedef struct - - /* Define the refresh period in mSec for the SDRAM and the number of rows */ - #define SDRAM_TREF 64 /* standard 64ms SDRAM */ --#define SDRAM_ROWS 4096 /* 64MB=8192 32MB=4096 */ -+#define SDRAM_ROWS 8192 /* 64MB=8192 32MB=4096 */ - #define MDREFR_DRI(x) ((x*SDRAM_TREF)/(SDRAM_ROWS*32)) - - #define CCLKCFG_TURBO 0x1 -@@ -136,7 +136,7 @@ static int pxa_set_target(struct cpufreq - unsigned int relation) - { - int idx; -- unsigned long cpus_allowed; -+ cpumask_t cpus_allowed; - int cpu = policy->cpu; - struct cpufreq_freqs freqs; - pxa_freqs_t *pxa_freq_settings; -@@ -144,6 +144,7 @@ static int pxa_set_target(struct cpufreq - unsigned long flags; - unsigned int unused; - unsigned int preset_mdrefr, postset_mdrefr; -+ void *ramstart; - - /* - * Save this threads cpus_allowed mask. -@@ -154,7 +155,7 @@ static int pxa_set_target(struct cpufreq - * Bind to the specified CPU. When this call returns, - * we should be running on the right CPU. - */ -- set_cpus_allowed(current, 1 << cpu); -+ set_cpus_allowed(current, cpumask_of_cpu(cpu)); - BUG_ON(cpu != smp_processor_id()); - - /* Get the current policy */ -@@ -187,7 +188,7 @@ static int pxa_set_target(struct cpufreq - (pxa_freq_settings[idx].membus/1000)); - } - -- void *ramstart = phys_to_virt(0xa0000000); -+ ramstart = phys_to_virt(0xa0000000); - - /* - * Tell everyone what we're about to do... -@@ -260,13 +261,13 @@ static int pxa_set_target(struct cpufreq - - static int pxa_cpufreq_init(struct cpufreq_policy *policy) - { -- unsigned long cpus_allowed; -+ cpumask_t cpus_allowed; - unsigned int cpu = policy->cpu; - int i; - - cpus_allowed = current->cpus_allowed; - -- set_cpus_allowed(current, 1 << cpu); -+ set_cpus_allowed(current, cpumask_of_cpu(cpu)); - BUG_ON(cpu != smp_processor_id()); - - /* set default policy and cpuinfo */ diff --git a/target/linux/pxa/patches-2.6.21/023-bugfix-serial-interrupt.patch b/target/linux/pxa/patches-2.6.21/023-bugfix-serial-interrupt.patch deleted file mode 100644 index ba0337160..000000000 --- a/target/linux/pxa/patches-2.6.21/023-bugfix-serial-interrupt.patch +++ /dev/null @@ -1,23 +0,0 @@ ---- a/drivers/serial/pxa.c -+++ b/drivers/serial/pxa.c -@@ -235,15 +235,19 @@ static inline irqreturn_t serial_pxa_irq - struct uart_pxa_port *up = dev_id; - unsigned int iir, lsr; - -+ serial_out(up, UART_MCR, serial_in(up, UART_MCR) & ~UART_MCR_RTS); // Clear RTS - iir = serial_in(up, UART_IIR); - if (iir & UART_IIR_NO_INT) -- return IRQ_NONE; -+ { -+ //printk(KERN_WARNING "serial_pxa_irq: odd -- interrupt triggered, but no interrupt in IIR: %08x\n",iir); -+ } - lsr = serial_in(up, UART_LSR); - if (lsr & UART_LSR_DR) - receive_chars(up, &lsr); - check_modem_status(up); - if (lsr & UART_LSR_THRE) - transmit_chars(up); -+ serial_out(up, UART_MCR, serial_in(up, UART_MCR) | UART_MCR_RTS); // Assert RTS - return IRQ_HANDLED; - } - diff --git a/target/linux/pxa/patches-2.6.21/024-bugfix-serial-register-status.patch b/target/linux/pxa/patches-2.6.21/024-bugfix-serial-register-status.patch deleted file mode 100644 index da1597280..000000000 --- a/target/linux/pxa/patches-2.6.21/024-bugfix-serial-register-status.patch +++ /dev/null @@ -1,67 +0,0 @@ ---- a/drivers/serial/pxa.c -+++ b/drivers/serial/pxa.c -@@ -57,6 +57,8 @@ struct uart_pxa_port { - unsigned int lsr_break_flag; - unsigned int cken; - char *name; -+ unsigned int msr; -+ unsigned int lsr; - }; - - static inline unsigned int serial_in(struct uart_pxa_port *up, int offset) -@@ -159,6 +161,7 @@ static inline void receive_chars(struct - - ignore_char: - *status = serial_in(up, UART_LSR); -+ up->lsr = *status; - } while ((*status & UART_LSR_DR) && (max_count-- > 0)); - tty_flip_buffer_push(tty); - } -@@ -211,7 +214,7 @@ static inline void check_modem_status(st - int status; - - status = serial_in(up, UART_MSR); -- -+ up->msr = status; - if ((status & UART_MSR_ANY_DELTA) == 0) - return; - -@@ -242,6 +245,7 @@ static inline irqreturn_t serial_pxa_irq - //printk(KERN_WARNING "serial_pxa_irq: odd -- interrupt triggered, but no interrupt in IIR: %08x\n",iir); - } - lsr = serial_in(up, UART_LSR); -+ up->lsr = lsr; - if (lsr & UART_LSR_DR) - receive_chars(up, &lsr); - check_modem_status(up); -@@ -258,7 +262,7 @@ static unsigned int serial_pxa_tx_empty( - unsigned int ret; - - spin_lock_irqsave(&up->port.lock, flags); -- ret = serial_in(up, UART_LSR) & UART_LSR_TEMT ? TIOCSER_TEMT : 0; -+ ret = up->lsr & UART_LSR_TEMT ? TIOCSER_TEMT : 0; - spin_unlock_irqrestore(&up->port.lock, flags); - - return ret; -@@ -270,7 +274,7 @@ static unsigned int serial_pxa_get_mctrl - unsigned char status; - unsigned int ret; - -- status = serial_in(up, UART_MSR); -+ status = up->msr; - - ret = 0; - if (status & UART_MSR_DCD) -@@ -400,10 +404,10 @@ static int serial_pxa_startup(struct uar - /* - * And clear the interrupt registers again for luck. - */ -- (void) serial_in(up, UART_LSR); -+ up->lsr = serial_in(up, UART_LSR); - (void) serial_in(up, UART_RX); - (void) serial_in(up, UART_IIR); -- (void) serial_in(up, UART_MSR); -+ up->msr = serial_in(up, UART_MSR); - - return 0; - } diff --git a/target/linux/pxa/patches-2.6.21/025-mach-types-fix.patch b/target/linux/pxa/patches-2.6.21/025-mach-types-fix.patch deleted file mode 100644 index 34d56ba3b..000000000 --- a/target/linux/pxa/patches-2.6.21/025-mach-types-fix.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/arch/arm/tools/mach-types -+++ b/arch/arm/tools/mach-types -@@ -387,7 +387,7 @@ s5c7375 ARCH_S5C7375 S5C7375 369 - spearhead ARCH_SPEARHEAD SPEARHEAD 370 - pantera ARCH_PANTERA PANTERA 371 - prayoglite ARCH_PRAYOGLITE PRAYOGLITE 372 --gumstix ARCH_GUMSTIK GUMSTIK 373 -+gumstix ARCH_GUMSTIX GUMSTIX 373 - rcube ARCH_RCUBE RCUBE 374 - rea_olv ARCH_REA_OLV REA_OLV 375 - pxa_iphone ARCH_PXA_IPHONE PXA_IPHONE 376 diff --git a/target/linux/pxa/patches-2.6.21/026-pcm-gcc-411-bugfix.patch b/target/linux/pxa/patches-2.6.21/026-pcm-gcc-411-bugfix.patch deleted file mode 100644 index e7d8a10b7..000000000 --- a/target/linux/pxa/patches-2.6.21/026-pcm-gcc-411-bugfix.patch +++ /dev/null @@ -1,54 +0,0 @@ ---- a/include/sound/pcm_params.h -+++ b/include/sound/pcm_params.h -@@ -179,16 +179,8 @@ static inline int snd_mask_single(const - return 1; - } - --static inline int snd_mask_refine(struct snd_mask *mask, -- const struct snd_mask *v) --{ -- struct snd_mask old; -- snd_mask_copy(&old, mask); -- snd_mask_intersect(mask, v); -- if (snd_mask_empty(mask)) -- return -EINVAL; -- return !snd_mask_eq(mask, &old); --} -+void snd_mask_print( const struct snd_mask *m1, const struct snd_mask *m2 ); -+int snd_mask_refine(struct snd_mask *mask, const struct snd_mask *v); - - static inline int snd_mask_refine_first(struct snd_mask *mask) - { ---- a/sound/core/pcm_lib.c -+++ b/sound/core/pcm_lib.c -@@ -2128,3 +2128,18 @@ snd_pcm_sframes_t snd_pcm_lib_readv(stru - } - - EXPORT_SYMBOL(snd_pcm_lib_readv); -+ -+int snd_mask_refine(struct snd_mask *mask, -+ const struct snd_mask *v) -+{ -+ struct snd_mask old; -+ snd_mask_copy(&old, mask); -+ snd_mask_print(mask, v); -+ snd_mask_intersect(mask, v); -+ snd_mask_print(mask, v); -+ if (snd_mask_empty(mask)) -+ return -EINVAL; -+ return !snd_mask_eq(mask, &old); -+} -+ -+EXPORT_SYMBOL(snd_mask_refine); ---- a/sound/core/pcm_native.c -+++ b/sound/core/pcm_native.c -@@ -3450,3 +3450,9 @@ const struct file_operations snd_pcm_f_o - .fasync = snd_pcm_fasync, - } - }; -+ -+void snd_mask_print( const struct snd_mask *m1, const struct snd_mask *m2 ) -+{ -+// printk( "0x%08x %08x v: 0x%08x %08x\n", m1->bits[1], m1->bits[0], m2->bits[1], m2->bits[0] ); -+} -+ diff --git a/target/linux/pxa/patches-2.6.21/027-ucb1400-ac97-audio.patch b/target/linux/pxa/patches-2.6.21/027-ucb1400-ac97-audio.patch deleted file mode 100644 index e1686da2b..000000000 --- a/target/linux/pxa/patches-2.6.21/027-ucb1400-ac97-audio.patch +++ /dev/null @@ -1,294 +0,0 @@ ---- a/sound/pci/ac97/ac97_codec.c -+++ b/sound/pci/ac97/ac97_codec.c -@@ -158,7 +158,7 @@ static const struct ac97_codec_id snd_ac - { 0x4e534300, 0xffffffff, "LM4540,43,45,46,48", NULL, NULL }, // only guess --jk - { 0x4e534331, 0xffffffff, "LM4549", NULL, NULL }, - { 0x4e534350, 0xffffffff, "LM4550", patch_lm4550, NULL }, // volume wrap fix --{ 0x50534304, 0xffffffff, "UCB1400", patch_ucb1400, NULL }, -+{ 0x50534304, 0xffffffff, "UCB1400", patch_ucb1400, NULL, AC97_HAS_NO_STD_PCM }, - { 0x53494c20, 0xffffffe0, "Si3036,8", mpatch_si3036, mpatch_si3036, AC97_MODEM_PATCH }, - { 0x54524102, 0xffffffff, "TR28022", NULL, NULL }, - { 0x54524106, 0xffffffff, "TR28026", NULL, NULL }, ---- a/sound/pci/ac97/ac97_patch.c -+++ b/sound/pci/ac97/ac97_patch.c -@@ -29,6 +29,10 @@ - #include - #include - -+#include -+#include -+#include -+ - #include - #include - #include -@@ -406,6 +410,227 @@ int patch_yamaha_ymf753(struct snd_ac97 - } - - /* -+ * UCB1400 codec -+ */ -+ -+#define AC97_UCB1400_FCSR1 0x6a -+#define AC97_UCB1400_FCSR2 0x6c -+ -+static const struct snd_kcontrol_new ucb1400_snd_ac97_controls[] = { -+ AC97_SINGLE("Tone Control - Bass", AC97_UCB1400_FCSR1, 11, 4, 0), -+ AC97_SINGLE("Tone Control - Treble", AC97_UCB1400_FCSR1, 9, 2, 0), -+ AC97_SINGLE("Headphone Playback Switch", AC97_UCB1400_FCSR1, 6, 1, 0), -+ AC97_SINGLE("De-emphasis", AC97_UCB1400_FCSR1, 5, 1, 0), -+ AC97_SINGLE("DC Filter", AC97_UCB1400_FCSR1, 4, 1, 0), -+ AC97_SINGLE("Hi-pass Filter", AC97_UCB1400_FCSR1, 3, 1, 0), -+ AC97_SINGLE("ADC Filter", AC97_UCB1400_FCSR2, 12, 1, 0), -+}; -+ -+#define NUM_GPIO_LINES 10 -+ -+static struct proc_dir_entry *proc_gpio_parent; -+static struct proc_dir_entry *proc_gpios[NUM_GPIO_LINES]; -+ -+typedef struct -+{ -+ int gpio; -+ char name[32]; -+ struct snd_ac97 *ac97; -+} gpio_summary_type; -+ -+static gpio_summary_type gpio_summaries[NUM_GPIO_LINES] = -+{ -+ { 0, "UCB1400-0-0" }, -+ { 1, "UCB1400-0-1" }, -+ { 2, "UCB1400-0-2" }, -+ { 3, "UCB1400-0-3" }, -+ { 4, "UCB1400-0-4" }, -+ { 5, "UCB1400-0-5" }, -+ { 6, "UCB1400-0-6" }, -+ { 7, "UCB1400-0-7" }, -+ { 8, "UCB1400-0-8" }, -+ { 9, "UCB1400-0-9" } -+}; -+ -+ -+static int proc_ucb1400_ac97_gpio_write(struct file *file, const char __user *buf, -+ unsigned long count, void *data) -+{ -+ char *cur, lbuf[count + 1]; -+ gpio_summary_type *summary = data; -+ u32 direction_is_out, operation_is_set; -+ int i = summary->gpio; -+ u16 dir, value; -+ -+ if (!capable(CAP_SYS_ADMIN)) -+ return -EACCES; -+ -+ memset(lbuf, 0, count + 1); -+ -+ if (copy_from_user(lbuf, buf, count)) -+ return -EFAULT; -+ -+ cur = lbuf; -+ -+ // Get current values -+ direction_is_out = !!(snd_ac97_read(summary->ac97, 0x5c) & (0x0001 << i)); -+ operation_is_set = !!(snd_ac97_read(summary->ac97, 0x5a) & (0x0001 << i)); -+ while(1) -+ { -+ // We accept options: {GPIO|AF1|AF2|AF3}, {set|clear}, {in|out} -+ // Anything else is an error -+ while(cur[0] && (isspace(cur[0]) || ispunct(cur[0]))) cur = &(cur[1]); -+ -+ if('\0' == cur[0]) break; -+ -+ // Ok, so now we're pointing at the start of something -+ switch(cur[0]) -+ { -+ case 'G': -+ // Check that next is "PIO" -- '\0' will cause safe short-circuit if end of buf -+ if(!(cur[1] == 'P' && cur[2] == 'I' && cur[3] == 'O')) goto parse_error; -+ cur = &(cur[4]); -+ break; -+ case 's': -+ if(!(cur[1] == 'e' && cur[2] == 't')) goto parse_error; -+ operation_is_set = 1; -+ cur = &(cur[3]); -+ break; -+ case 'c': -+ if(!(cur[1] == 'l' && cur[2] == 'e' && cur[3] == 'a' && cur[4] == 'r')) goto -+parse_error; -+ operation_is_set = 0; -+ cur = &(cur[5]); -+ break; -+ case 'i': -+ if(!(cur[1] == 'n')) goto parse_error; -+ direction_is_out = 0; -+ cur = &(cur[2]); -+ break; -+ case 'o': -+ if(!(cur[1] == 'u' && cur[2] == 't')) goto parse_error; -+ direction_is_out = 1; -+ cur = &(cur[3]); -+ break; -+ default: goto parse_error; -+ } -+ } -+ -+ // set/get value -+ dir = snd_ac97_read(summary->ac97, 0x5c); -+ value = snd_ac97_read(summary->ac97, 0x5a); -+ if (direction_is_out) -+ { -+ dir |= 0x0001 << i; -+ if (operation_is_set) -+ { -+ value |= 0x0001 << i; -+ } -+ else -+ { -+ value &= ~(0x0001 << i); -+ } -+ -+ snd_ac97_write(summary->ac97, 0x5c, dir); -+ snd_ac97_write(summary->ac97, 0x5a, value); -+ } -+ else // direction in -+ { -+ dir &= ~(0x0001 << i); -+ snd_ac97_write(summary->ac97, 0x5c, dir); -+ operation_is_set = snd_ac97_read(summary->ac97, 0x5a) & ~(0x0001 << i); -+ } -+ -+#ifdef CONFIG_PROC_GPIO_DEBUG -+ printk(KERN_INFO "Set (%s,%s,%s) via /proc/gpio/%s\n", -+ "GPIO", -+ direction_is_out ? "out" : "in", -+ operation_is_set ? "set" : "clear", -+ summary->name); -+#endif -+ -+ return count; -+ -+parse_error: -+ printk(KERN_CRIT "Parse error: Expect \"GPIO|[set|clear]|[in|out] ...\"\n"); -+ return -EINVAL; -+} -+ -+static int proc_ucb1400_ac97_gpio_read(char *page, char **start, off_t off, -+ int count, int *eof, void *data) -+{ -+ char *p = page; -+ gpio_summary_type *summary = data; -+ int len, i; /*, af;*/ -+ i = summary->gpio; -+ -+ p += sprintf(p, "%d\t%s\t%s\t%s\n", i, -+ "GPIO", -+ (snd_ac97_read(summary->ac97, 0x5c) & (0x0001 << i)) ? "out" : "in", -+ (snd_ac97_read(summary->ac97, 0x5a) & (0x0001 << i)) ? "set" : "clear"); -+ -+ len = (p - page) - off; -+ -+ if(len < 0) -+ { -+ len = 0; -+ } -+ -+ *eof = (len <= count) ? 1 : 0; -+ *start = page + off; -+ -+ return len; -+} -+ -+int patch_ucb1400(struct snd_ac97 * ac97) -+{ -+ int err, i; -+ -+ proc_gpio_parent = proc_mkdir("gpio", NULL); -+ if(!proc_gpio_parent) return 0; -+ -+ for(i=0; i < NUM_GPIO_LINES; i++) -+ { -+ proc_gpios[i] = create_proc_entry(gpio_summaries[i].name, 0644, proc_gpio_parent); -+ if(proc_gpios[i]) -+ { -+ gpio_summaries[i].ac97 = ac97; -+ proc_gpios[i]->data = &gpio_summaries[i]; -+ proc_gpios[i]->read_proc = proc_ucb1400_ac97_gpio_read; -+ proc_gpios[i]->write_proc = proc_ucb1400_ac97_gpio_write; -+ } -+ } -+ -+ for(i = 0; i < ARRAY_SIZE(ucb1400_snd_ac97_controls); i++) { -+ if((err = snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&ucb1400_snd_ac97_controls[i], ac97))) < 0) -+ return err; -+ } -+ -+ snd_ac97_write_cache(ac97, AC97_UCB1400_FCSR1, -+ (0 << 11) | // 0 base boost -+ (0 << 9) | // 0 treble boost -+ (0 << 7) | // Mode = flat -+ (1 << 6) | // Headphones enable -+ (0 << 5) | // De-emphasis disabled -+ (1 << 4) | // DC filter enabled -+ (1 << 3) | // Hi-pass filter enabled -+ (0 << 2) | // disable interrupt signalling via GPIO_INT -+ (1 << 0) // clear ADC overflow status if set -+ ); -+ -+ snd_ac97_write_cache(ac97, AC97_UCB1400_FCSR2, -+ (0 << 15) | // must be 0 -+ (0 << 13) | // must be 0 -+ (1 << 12) | // ADC filter enabled -+ (0 << 10) | // must be 0 -+ (0 << 4) | // Smart low power mode on neither Codec nor PLL -+ (0 << 0) // must be 0 -+ ); -+ -+ return 0; -+} -+ -+/* - * May 2, 2003 Liam Girdwood - * removed broken wolfson00 patch. - * added support for WM9705,WM9708,WM9709,WM9710,WM9711,WM9712 and WM9717. -@@ -3408,41 +3633,3 @@ int patch_lm4550(struct snd_ac97 *ac97) - ac97->res_table = lm4550_restbl; - return 0; - } -- --/* -- * UCB1400 codec (http://www.semiconductors.philips.com/acrobat_download/datasheets/UCB1400-02.pdf) -- */ --static const struct snd_kcontrol_new snd_ac97_controls_ucb1400[] = { --/* enable/disable headphone driver which allows direct connection to -- stereo headphone without the use of external DC blocking -- capacitors */ --AC97_SINGLE("Headphone Driver", 0x6a, 6, 1, 0), --/* Filter used to compensate the DC offset is added in the ADC to remove idle -- tones from the audio band. */ --AC97_SINGLE("DC Filter", 0x6a, 4, 1, 0), --/* Control smart-low-power mode feature. Allows automatic power down -- of unused blocks in the ADC analog front end and the PLL. */ --AC97_SINGLE("Smart Low Power Mode", 0x6c, 4, 3, 0), --}; -- --static int patch_ucb1400_specific(struct snd_ac97 * ac97) --{ -- int idx, err; -- for (idx = 0; idx < ARRAY_SIZE(snd_ac97_controls_ucb1400); idx++) -- if ((err = snd_ctl_add(ac97->bus->card, snd_ctl_new1(&snd_ac97_controls_ucb1400[idx], ac97))) < 0) -- return err; -- return 0; --} -- --static struct snd_ac97_build_ops patch_ucb1400_ops = { -- .build_specific = patch_ucb1400_specific, --}; -- --int patch_ucb1400(struct snd_ac97 * ac97) --{ -- ac97->build_ops = &patch_ucb1400_ops; -- /* enable headphone driver and smart low power mode by default */ -- snd_ac97_write(ac97, 0x6a, 0x0050); -- snd_ac97_write(ac97, 0x6c, 0x0030); -- return 0; --} diff --git a/target/linux/pxa/patches-2.6.21/028-gumstix-asoc.patch b/target/linux/pxa/patches-2.6.21/028-gumstix-asoc.patch deleted file mode 100644 index c9f014ff2..000000000 --- a/target/linux/pxa/patches-2.6.21/028-gumstix-asoc.patch +++ /dev/null @@ -1,212 +0,0 @@ ---- a/sound/soc/pxa/Kconfig -+++ b/sound/soc/pxa/Kconfig -@@ -16,6 +16,7 @@ config SND_PXA2XX_SOC_AC97 - tristate - select AC97_BUS - select SND_SOC_AC97_BUS -+ select SND_PXA2XX_AC97 - - config SND_PXA2XX_SOC_I2S - tristate -@@ -56,4 +57,12 @@ config SND_PXA2XX_SOC_TOSA - Say Y if you want to add support for SoC audio on Sharp - Zaurus SL-C6000x models (Tosa). - -+config SND_PXA2XX_SOC_GUMSTIX -+ tristate "SoC AC97 Audio support for Gumstix" -+ depends on SND_PXA2XX_SOC && ARCH_GUMSTIX -+ select SND_PXA2XX_SOC_AC97 -+ select SND_SOC_AC97_CODEC -+ help -+ Say Y if you want to add support for SoC audio on Gumstix -+ - endmenu ---- a/sound/soc/pxa/Makefile -+++ b/sound/soc/pxa/Makefile -@@ -12,9 +12,11 @@ snd-soc-corgi-objs := corgi.o - snd-soc-poodle-objs := poodle.o - snd-soc-tosa-objs := tosa.o - snd-soc-spitz-objs := spitz.o -+snd-soc-gumstix-objs := gumstix.o - - obj-$(CONFIG_SND_PXA2XX_SOC_CORGI) += snd-soc-corgi.o - obj-$(CONFIG_SND_PXA2XX_SOC_POODLE) += snd-soc-poodle.o - obj-$(CONFIG_SND_PXA2XX_SOC_TOSA) += snd-soc-tosa.o - obj-$(CONFIG_SND_PXA2XX_SOC_SPITZ) += snd-soc-spitz.o -+obj-$(CONFIG_SND_PXA2XX_SOC_GUMSTIX) += snd-soc-gumstix.o - ---- /dev/null -+++ b/sound/soc/pxa/gumstix.c -@@ -0,0 +1,109 @@ -+/* -+ * gumstix.c -- SoC audio for Gumstix -+ * -+ * Copyright 2005 Wolfson Microelectronics PLC. -+ * Copyright 2005 Openedhand Ltd. -+ * Copyright 2007 Gumstix Inc. -+ * -+ * Authors: Liam Girdwood -+ * Richard Purdie -+ * Craig Hughes -+ * -+ * 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. -+ * -+ * Revision history -+ * 26 April 2007 - Initial revision forked from tosa.c -+ * -+ * -+ */ -+ -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include "pxa2xx-pcm.h" -+#include "pxa2xx-ac97.h" -+#include "../codecs/ac97.h" -+ -+static struct snd_soc_machine gumstix; -+ -+static int gumstix_ac97_init(struct snd_soc_codec *codec) -+{ -+ // For now, do nothing -- should move the ucb1400 patch stuff here -+ return 0; -+} -+ -+/* For right now, just add UCB1400 -- once that's working, we can also add -+ * PCM channels via SPI to bluetooth module, GSM module, or whatnot */ -+static struct snd_soc_dai_link gumstix_dai[] = { -+{ -+ .name = "ucb1400", -+ .stream_name = "UCB1400", -+ .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI], -+ .codec_dai = &ac97_dai, -+ .init = gumstix_ac97_init, -+}, -+}; -+ -+static struct snd_soc_machine snd_soc_machine_gumstix = { -+ .name = "Gumstix", -+ .dai_link = gumstix_dai, -+ .num_links = ARRAY_SIZE(gumstix_dai), -+}; -+ -+static struct snd_soc_device gumstix_snd_devdata = { -+ .machine = &snd_soc_machine_gumstix, -+ .platform = &pxa2xx_soc_platform, -+ .codec_dev = &soc_codec_dev_ac97, -+}; -+ -+static struct platform_device *gumstix_snd_device; -+ -+static int __init gumstix_init(void) -+{ -+ int ret; -+ -+ if (!machine_is_gumstix()) -+ return -ENODEV; -+ -+ gumstix_snd_device = platform_device_alloc("soc-audio", -1); -+ if (!gumstix_snd_device) -+ return -ENOMEM; -+ -+ platform_set_drvdata(gumstix_snd_device, &gumstix_snd_devdata); -+ gumstix_snd_devdata.dev = &gumstix_snd_device->dev; -+ ret = platform_device_add(gumstix_snd_device); -+ -+ if (ret) -+ platform_device_put(gumstix_snd_device); -+ -+ return ret; -+} -+ -+static void __exit gumstix_exit(void) -+{ -+ platform_device_unregister(gumstix_snd_device); -+} -+ -+module_init(gumstix_init); -+module_exit(gumstix_exit); -+ -+/* Module information */ -+MODULE_AUTHOR("Craig Hughes "); -+MODULE_DESCRIPTION("ALSA SoC Gumstix"); -+MODULE_LICENSE("GPL"); ---- a/sound/soc/codecs/ac97.c -+++ b/sound/soc/codecs/ac97.c -@@ -43,7 +43,7 @@ static int ac97_prepare(struct snd_pcm_s - #define STD_AC97_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\ - SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000) - --static struct snd_soc_codec_dai ac97_dai = { -+struct snd_soc_codec_dai ac97_dai = { - .name = "AC97 HiFi", - .playback = { - .stream_name = "AC97 Playback", -@@ -61,6 +61,8 @@ static struct snd_soc_codec_dai ac97_dai - .prepare = ac97_prepare,}, - }; - -+EXPORT_SYMBOL_GPL(ac97_dai); -+ - static unsigned int ac97_read(struct snd_soc_codec *codec, - unsigned int reg) - { ---- a/sound/soc/codecs/ac97.h -+++ b/sound/soc/codecs/ac97.h -@@ -14,5 +14,6 @@ - #define __LINUX_SND_SOC_AC97_H - - extern struct snd_soc_codec_device soc_codec_dev_ac97; -+extern struct snd_soc_codec_dai ac97_dai; - - #endif ---- a/sound/soc/pxa/pxa2xx-ac97.c -+++ b/sound/soc/pxa/pxa2xx-ac97.c -@@ -154,18 +154,26 @@ static void pxa2xx_ac97_warm_reset(struc - - static void pxa2xx_ac97_cold_reset(struct snd_ac97 *ac97) - { -- GCR &= GCR_COLD_RST; /* clear everything but nCRST */ -- GCR &= ~GCR_COLD_RST; /* then assert nCRST */ -- -- gsr_bits = 0; - #ifdef CONFIG_PXA27x - /* PXA27x Developers Manual section 13.5.2.2.1 */ -+ GCR |= GCR_ACLINK_OFF; -+ udelay(5); -+ GCR &= GCR_COLD_RST; /* Mask all interrupts */ -+ GCR &= ~GCR_COLD_RST; /* cold reset */ -+ udelay(5); - pxa_set_cken(1 << 31, 1); - udelay(5); -- pxa_set_cken(1 << 31, 0); -+ GCR |= GCR_PRIRDY_IEN|GCR_SECRDY_IEN; /* unmask the interrupts */ -+ pxa_set_cken(1 << 31, 0); /* clear CKEN31 */ -+ udelay(5); - GCR = GCR_COLD_RST; - udelay(50); -+ wait_event_timeout(gsr_wq, gsr_bits & (GSR_PCR | GSR_SCR), 1); - #else -+ GCR &= GCR_COLD_RST; /* clear everything but nCRST */ -+ GCR &= ~GCR_COLD_RST; /* then assert nCRST */ -+ -+ gsr_bits = 0; - GCR = GCR_COLD_RST; - GCR |= GCR_CDONE_IE|GCR_SDONE_IE; - wait_event_timeout(gsr_wq, gsr_bits & (GSR_PCR | GSR_SCR), 1); diff --git a/target/linux/pxa/patches-2.6.21/029-disable-uncompress-message.patch b/target/linux/pxa/patches-2.6.21/029-disable-uncompress-message.patch deleted file mode 100644 index dfd0ad737..000000000 --- a/target/linux/pxa/patches-2.6.21/029-disable-uncompress-message.patch +++ /dev/null @@ -1,30 +0,0 @@ ---- a/arch/arm/boot/compressed/misc.c -+++ b/arch/arm/boot/compressed/misc.c -@@ -322,7 +322,6 @@ void flush_window(void) - bytes_out += (ulg)outcnt; - output_ptr += (ulg)outcnt; - outcnt = 0; -- putstr("."); - } - - #ifndef arch_error -@@ -354,9 +353,7 @@ decompress_kernel(ulg output_start, ulg - arch_decomp_setup(); - - makecrc(); -- putstr("Uncompressing Linux..."); - gunzip(); -- putstr(" done, booting the kernel.\n"); - return output_ptr; - } - #else -@@ -368,9 +365,7 @@ int main() - output_data = output_buffer; - - makecrc(); -- putstr("Uncompressing Linux..."); - gunzip(); -- putstr("done.\n"); - return 0; - } - #endif diff --git a/target/linux/pxa/patches-2.6.21/030-serial-divisor.patch b/target/linux/pxa/patches-2.6.21/030-serial-divisor.patch deleted file mode 100644 index 5f9e386d5..000000000 --- a/target/linux/pxa/patches-2.6.21/030-serial-divisor.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- a/drivers/serial/pxa.c -+++ b/drivers/serial/pxa.c -@@ -41,6 +41,7 @@ - #include - #include - #include -+#include - #include - - #include -@@ -577,8 +578,16 @@ static void serial_pxa_config_port(struc - static int - serial_pxa_verify_port(struct uart_port *port, struct serial_struct *ser) - { -- /* we don't want the core code to modify any port params */ -- return -EINVAL; -+ struct uart_pxa_port *up = (struct uart_pxa_port *)port; -+ int ret = 0; -+ -+ if (up->port.uartclk / 16 != ser->baud_base) -+ ret = -EINVAL; -+ else if (((up->port.line & 1) == 0) && ser->baud_base > 230400) /* Max baud rate for STUART and FFUART */ -+ ret = -EINVAL; -+ else if (((up->port.line & 1) != 0) && ser->baud_base > 921600) /* Max baud rate for HWUART and BTUART */ -+ ret = -EINVAL; -+ return ret; - } - - static const char * diff --git a/target/linux/pxa/patches-2.6.21/031-mmc-card-detect.patch b/target/linux/pxa/patches-2.6.21/031-mmc-card-detect.patch deleted file mode 100644 index 890f19578..000000000 --- a/target/linux/pxa/patches-2.6.21/031-mmc-card-detect.patch +++ /dev/null @@ -1,76 +0,0 @@ ---- a/arch/arm/mach-pxa/gumstix.c -+++ b/arch/arm/mach-pxa/gumstix.c -@@ -29,19 +29,55 @@ - - #include "generic.h" - --static int gumstix_mci_init(struct device *dev, irqreturn_t (*lubbock_detect_int)(int, void *, struct pt_regs *), void *data) -+static struct pxamci_platform_data gumstix_mci_platform_data; -+ -+static int gumstix_mci_init(struct device *dev, irqreturn_t (*gumstix_detect_int)(int, void *, struct pt_regs *), void *data) - { -- // Set up MMC controller -+ int err; -+ - pxa_gpio_mode(GPIO6_MMCCLK_MD); - pxa_gpio_mode(GPIO53_MMCCLK_MD); - pxa_gpio_mode(GPIO8_MMCCS0_MD); - -+ pxa_gpio_mode(GUMSTIX_GPIO_nSD_DETECT | GPIO_IN); -+ set_irq_type(GUMSTIX_IRQ_GPIO_nSD_DETECT, IRQT_BOTHEDGE); -+ pxa_gpio_mode(GUMSTIX_GPIO_nSD_WP | GPIO_IN); -+ -+ gumstix_mci_platform_data.detect_delay = msecs_to_jiffies(250); -+ -+ err = request_irq(GUMSTIX_IRQ_GPIO_nSD_DETECT, gumstix_detect_int, SA_INTERRUPT, -+ "MMC card detect", data); -+ if (err) { -+ printk(KERN_ERR "gumstix_mci_init: MMC/SD: can't request MMC card detect IRQ\n"); -+ return -1; -+ } -+ -+ err = set_irq_type(GUMSTIX_IRQ_GPIO_nSD_DETECT, IRQT_BOTHEDGE); -+ - return 0; - } - -+static int gumstix_mci_get_ro(struct device *dev) -+{ -+#ifdef CONFIG_ARCH_GUMSTIX_VERDEX -+ return 0; // microSD is always writable on verdex -+#else -+ int ro; -+ ro = GPLR(GUMSTIX_GPIO_nSD_WP) & GPIO_bit(GUMSTIX_GPIO_nSD_WP); -+ return ro; -+#endif -+} -+ -+static void gumstix_mci_exit(struct device *dev, void *data) -+{ -+ free_irq(GUMSTIX_IRQ_GPIO_nSD_DETECT, data); -+} -+ - static struct pxamci_platform_data gumstix_mci_platform_data = { - .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, -- .init = &gumstix_mci_init, -+ .init = gumstix_mci_init, -+ .get_ro = gumstix_mci_get_ro, -+ .exit = gumstix_mci_exit, - }; - - static struct pxa2xx_udc_mach_info gumstix_udc_info __initdata = { ---- a/include/asm-arm/arch-pxa/gumstix.h -+++ b/include/asm-arm/arch-pxa/gumstix.h -@@ -36,6 +36,12 @@ - #define GPIO_GUMSTIX_USB_GPIOx_CON_MD (GPIO_GUMSTIX_USB_GPIOx | GPIO_OUT) - #define GPIO_GUMSTIX_USB_GPIOx_DIS_MD (GPIO_GUMSTIX_USB_GPIOx | GPIO_IN) - -+/* -+ * SD/MMC definitions -+ */ -+#define GUMSTIX_GPIO_nSD_WP 22 /* SD Write Protect */ -+#define GUMSTIX_GPIO_nSD_DETECT 11 /* MMC/SD Card Detect */ -+#define GUMSTIX_IRQ_GPIO_nSD_DETECT IRQ_GPIO(GUMSTIX_GPIO_nSD_DETECT) - - /* - * SMC Ethernet definitions diff --git a/target/linux/pxa/patches-2.6.21/032-misalignment-handling.patch b/target/linux/pxa/patches-2.6.21/032-misalignment-handling.patch deleted file mode 100644 index 980d5a6f9..000000000 --- a/target/linux/pxa/patches-2.6.21/032-misalignment-handling.patch +++ /dev/null @@ -1,34 +0,0 @@ -Change the default alingment handling to not be silent failure ---- a/arch/arm/mm/alignment.c -+++ b/arch/arm/mm/alignment.c -@@ -797,6 +797,8 @@ static int __init alignment_init(void) - res->write_proc = proc_alignment_write; - #endif - -+ ai_usermode = CONFIG_ALIGNMENT_HANDLING; -+ - hook_fault_code(1, do_alignment, SIGILL, "alignment exception"); - hook_fault_code(3, do_alignment, SIGILL, "alignment exception"); - ---- a/arch/arm/Kconfig -+++ b/arch/arm/Kconfig -@@ -709,6 +709,19 @@ config ALIGNMENT_TRAP - correct operation of some network protocols. With an IP-only - configuration it is safe to say N, otherwise say Y. - -+config ALIGNMENT_HANDLING -+ hex "Userspace alignment trap handling" -+ default "0x3" -+ depends on ALIGNMENT_TRAP -+ help -+ How should we handle alignment errors in userspace by default? This is a bitfield where: -+ 0 - silently ignore alignment errors (will lead to unexpected results) -+ 1 - report alignment errors through printk (will lead to unexpected results, but you'll know about them) -+ 2 - fix the alignment and make things work properly (performance degradation for un-aligned code) -+ 4 - raise SIGBUS on alignment traps -+ A good number to choose is probably either 3 (work slowly but log message) or 5 (log message and SIGBUS). -+ You can change the behavior at runtime through /proc/cpu/alignment if you have PROC_FS enabled. -+ - endmenu - - menu "Boot options" diff --git a/target/linux/pxa/patches-2.6.21/033-compile-fix-pxa_cpufreq.patch b/target/linux/pxa/patches-2.6.21/033-compile-fix-pxa_cpufreq.patch deleted file mode 100644 index 4da27520d..000000000 --- a/target/linux/pxa/patches-2.6.21/033-compile-fix-pxa_cpufreq.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/arch/arm/mach-pxa/cpu-pxa.c -+++ b/arch/arm/mach-pxa/cpu-pxa.c -@@ -42,7 +42,7 @@ - - #define DEBUG 0 - --#ifdef DEBUG -+#if defined (DEBUG) && DEBUG > 0 - static unsigned int freq_debug = DEBUG; - MODULE_PARM(freq_debug, "i"); - MODULE_PARM_DESC(freq_debug, "Set the debug messages to on=1/off=0"); diff --git a/target/linux/pxa/patches-2.6.21/034-ramfs-mode-support.patch b/target/linux/pxa/patches-2.6.21/034-ramfs-mode-support.patch deleted file mode 100644 index 81548573f..000000000 --- a/target/linux/pxa/patches-2.6.21/034-ramfs-mode-support.patch +++ /dev/null @@ -1,86 +0,0 @@ ---- a/fs/ramfs/inode.c -+++ b/fs/ramfs/inode.c -@@ -33,6 +33,7 @@ - #include - #include - #include -+#include - - #include - #include "internal.h" -@@ -160,10 +161,66 @@ static const struct super_operations ram - .drop_inode = generic_delete_inode, - }; - -+static int ramfs_parse_options(char *options, int *mode) -+{ -+ char *this_char, *value, *rest; -+ -+ while (options != NULL) { -+ this_char = options; -+ for (;;) { -+ /* -+ * NUL-terminate this option: unfortunately, -+ * mount options form a comma-separated list, -+ * but mpol's nodelist may also contain commas. -+ */ -+ options = strchr(options, ','); -+ if (options == NULL) -+ break; -+ options++; -+ if (!isdigit(*options)) { -+ options[-1] = '\0'; -+ break; -+ } -+ } -+ if (!*this_char) -+ continue; -+ if ((value = strchr(this_char,'=')) != NULL) { -+ *value++ = 0; -+ } else { -+ printk(KERN_ERR -+ "ramfs: No value for mount option '%s'\n", -+ this_char); -+ return 1; -+ } -+ -+ if (!strcmp(this_char,"mode")) { -+ if (!mode) -+ continue; -+ *mode = simple_strtoul(value,&rest,8); -+ if (*rest) -+ goto bad_val; -+ } else { -+ printk(KERN_ERR "ramfs: Bad mount option %s\n", -+ this_char); -+ return 1; -+ } -+ } -+ return 0; -+ -+bad_val: -+ printk(KERN_ERR "ramfs: Bad value '%s' for mount option '%s'\n", -+ value, this_char); -+ return 1; -+} -+ - static int ramfs_fill_super(struct super_block * sb, void * data, int silent) - { - struct inode * inode; - struct dentry * root; -+ int mode = 0755; -+ -+ if (ramfs_parse_options(data, &mode)) -+ return -EINVAL; - - sb->s_maxbytes = MAX_LFS_FILESIZE; - sb->s_blocksize = PAGE_CACHE_SIZE; -@@ -171,7 +228,7 @@ static int ramfs_fill_super(struct super - sb->s_magic = RAMFS_MAGIC; - sb->s_op = &ramfs_ops; - sb->s_time_gran = 1; -- inode = ramfs_get_inode(sb, S_IFDIR | 0755, 0); -+ inode = ramfs_get_inode(sb, S_IFDIR | mode, 0); - if (!inode) - return -ENOMEM; - diff --git a/target/linux/pxa/patches-2.6.21/035-pxafb-definition.patch b/target/linux/pxa/patches-2.6.21/035-pxafb-definition.patch deleted file mode 100644 index d48b6e827..000000000 --- a/target/linux/pxa/patches-2.6.21/035-pxafb-definition.patch +++ /dev/null @@ -1,174 +0,0 @@ ---- a/arch/arm/mach-pxa/gumstix.c -+++ b/arch/arm/mach-pxa/gumstix.c -@@ -25,6 +25,7 @@ - #include - #include - #include -+#include - #include - - #include "generic.h" -@@ -90,6 +91,89 @@ static struct platform_device gum_audio_ - .id = -1, - }; - -+ -+#if defined(CONFIG_FB_PXA_SHARP_LQ043_PSP) || defined(CONFIG_FB_PXA_SAMSUNG_LTE430WQ_F0C) -+static void gumstix_lcd_backlight(int on_or_off) -+{ -+ if(on_or_off) -+ { -+ pxa_gpio_mode(17 | GPIO_IN); -+ } else { -+ GPCR(17) = GPIO_bit(17); -+ pxa_gpio_mode(17 | GPIO_OUT); -+ GPCR(17) = GPIO_bit(17); -+ } -+} -+#endif -+ -+ -+#ifdef CONFIG_FB_PXA_ALPS_CDOLLAR -+static struct pxafb_mode_info gumstix_fb_mode = { -+ .pixclock = 300000, -+ .xres = 240, -+ .yres = 320, -+ .bpp = 16, -+ .hsync_len = 2, -+ .left_margin = 1, -+ .right_margin = 1, -+ .vsync_len = 3, -+ .upper_margin = 0, -+ .lower_margin = 0, -+ .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, -+}; -+ -+static struct pxafb_mach_info gumstix_fb_info = { -+ .modes = &gumstix_fb_mode, -+ .num_modes = 1, -+ .lccr0 = LCCR0_Pas | LCCR0_Sngl | LCCR0_Color, -+ .lccr3 = 0, -+}; -+#elif defined(CONFIG_FB_PXA_SHARP_LQ043_PSP) -+static struct pxafb_mode_info gumstix_fb_mode = { -+ .pixclock = 110000, -+ .xres = 480, -+ .yres = 272, -+ .bpp = 16, -+ .hsync_len = 41, -+ .left_margin = 2, -+ .right_margin = 2, -+ .vsync_len = 10, -+ .upper_margin = 2, -+ .lower_margin = 2, -+ .sync = 0, // Hsync and Vsync both active low -+}; -+ -+static struct pxafb_mach_info gumstix_fb_info = { -+ .modes = &gumstix_fb_mode, -+ .num_modes = 1, -+ .lccr0 = LCCR0_Act | LCCR0_Sngl | LCCR0_Color, -+ .lccr3 = LCCR3_OutEnH | LCCR3_PixFlEdg | (3 << 30), -+ .pxafb_backlight_power = &gumstix_lcd_backlight, -+}; -+#elif defined(CONFIG_FB_PXA_SAMSUNG_LTE430WQ_F0C) -+static struct pxafb_mode_info gumstix_fb_mode = { -+ .pixclock = 108696, // 9.2MHz typical DOTCLK from datasheet -+ .xres = 480, -+ .hsync_len = 41, // HLW from datasheet: 41 typ -+ .left_margin = 4, // HBP - HLW from datasheet: 45 - 41 = 4 -+ .right_margin = 8, // HFP from datasheet: 8 typ -+ .yres = 272, -+ .vsync_len = 10, // VLW from datasheet: 10 typ -+ .upper_margin = 2, // VBP - VLW from datasheet: 12 - 10 = 2 -+ .lower_margin = 4, // VFP from datasheet: 4 typ -+ .bpp = 16, -+ .sync = 0, // Hsync and Vsync both active low -+}; -+ -+static struct pxafb_mach_info gumstix_fb_info = { -+ .modes = &gumstix_fb_mode, -+ .num_modes = 1, -+ .lccr0 = LCCR0_Act | LCCR0_Sngl | LCCR0_Color, -+ .lccr3 = LCCR3_OutEnH | LCCR3_PixFlEdg | (3 << 30), -+ .pxafb_backlight_power = &gumstix_lcd_backlight, -+}; -+#endif -+ - static struct platform_device *devices[] __initdata = { - &gum_audio_device, - }; -@@ -98,6 +182,9 @@ static void __init gumstix_init(void) - { - pxa_set_mci_info(&gumstix_mci_platform_data); - pxa_set_udc_info(&gumstix_udc_info); -+#if defined(CONFIG_FB_PXA_ALPS_CDOLLAR) | defined(CONFIG_FB_PXA_SHARP_LQ043_PSP) | defined(CONFIG_FB_PXA_SAMSUNG_LTE430WQ_F0C) -+ set_pxa_fb_info(&gumstix_fb_info); -+#endif - (void) platform_add_devices(devices, ARRAY_SIZE(devices)); - } - ---- a/drivers/video/Kconfig -+++ b/drivers/video/Kconfig -@@ -1495,6 +1495,37 @@ config FB_PXA - - If unsure, say N. - -+choice -+ depends on FB_PXA -+ prompt "LCD Panel" -+ default FB_PXA_SAMSUNG_LTE430WQ_F0C -+ -+config FB_PXA_ALPS_CDOLLAR -+ boolean "Chris Dollar's ALPS screen" -+ ---help--- -+ Enable definitions (over-ridable on the kernel command line if -+ "PXA LCD command line parameters" is also selected) for an ALPS -+ screen which Chris Dollar uses -+ -+config FB_PXA_SHARP_LQ043_PSP -+ boolean "SHARP LQ043... series" -+ ---help--- -+ Enable definitions (over-ridable on the kernel command line if -+ "PXA LCD command line parameters" is also selected) for a SHARP -+ LQ043... screen, such as the one used by the PSP. These screens are -+ the ones normally sold by gumstix with its boards. -+ -+config FB_PXA_SAMSUNG_LTE430WQ_F0C -+ boolean "Samsung LTE430WQ-F0C (standard gumstix LCD)" -+ ---help--- -+ Enable definitions for a Samsung LTE430WQ-F0C LCD panel, such as the ones resold -+ by gumstix for use with their "LCD-Ready" boards. -+ -+config FB_PXA_NONEOFTHEABOVE -+ boolean "None of the above" -+ -+endchoice -+ - config FB_PXA_PARAMETERS - bool "PXA LCD command line parameters" - default n ---- a/drivers/video/pxafb.c -+++ b/drivers/video/pxafb.c -@@ -22,6 +22,7 @@ - * - */ - -+#include - #include - #include - #include -@@ -789,7 +790,13 @@ static void pxafb_setup_gpio(struct pxaf - pxa_gpio_mode(GPIO74_LCD_FCLK_MD); - pxa_gpio_mode(GPIO75_LCD_LCLK_MD); - pxa_gpio_mode(GPIO76_LCD_PCLK_MD); -+#ifdef CONFIG_FB_PXA_SHARP_LQ043_PSP -+ /* DISP must be always high while screen is on */ -+ pxa_gpio_mode(GPIO77_LCD_ACBIAS | GPIO_OUT); -+ GPSR(GPIO77_LCD_ACBIAS) = GPIO_bit(GPIO77_LCD_ACBIAS); -+#else - pxa_gpio_mode(GPIO77_LCD_ACBIAS_MD); -+#endif - } - - static void pxafb_enable_controller(struct pxafb_info *fbi) diff --git a/target/linux/pxa/patches-2.6.21/036-270-usb-gadget-udc.patch b/target/linux/pxa/patches-2.6.21/036-270-usb-gadget-udc.patch deleted file mode 100644 index 4f1a5a9d2..000000000 --- a/target/linux/pxa/patches-2.6.21/036-270-usb-gadget-udc.patch +++ /dev/null @@ -1,2731 +0,0 @@ ---- a/drivers/usb/gadget/Kconfig -+++ b/drivers/usb/gadget/Kconfig -@@ -129,6 +129,28 @@ config USB_PXA2XX_SMALL - default y if USB_ETH - default y if USB_G_SERIAL - -+config USB_GADGET_PXA27X -+ boolean "PXA 27x" -+ depends on ARCH_PXA && PXA27x -+ help -+ Intel's PXA 27x series XScale ARM-5TE processors include -+ an integrated full speed USB 1.1 device controller. -+ -+ Say "y" to link the driver statically, or "m" to build a -+ dynamically linked module called "pxa27x_udc" and force all -+ gadget drivers to also be dynamically linked. -+ -+config USB_PXA27X -+ tristate -+ depends on USB_GADGET_PXA27X -+ default USB_GADGET -+ select USB_GADGET_SELECTED -+ -+config USB_PXA27X_DMA -+ bool # "Use DMA support" -+ depends on USB_GADGET_PXA27X -+ default n -+ - config USB_GADGET_GOKU - boolean "Toshiba TC86C001 'Goku-S'" - depends on PCI ---- a/drivers/usb/gadget/Makefile -+++ b/drivers/usb/gadget/Makefile -@@ -7,6 +7,7 @@ obj-$(CONFIG_USB_PXA2XX) += pxa2xx_udc.o - obj-$(CONFIG_USB_GOKU) += goku_udc.o - obj-$(CONFIG_USB_OMAP) += omap_udc.o - obj-$(CONFIG_USB_LH7A40X) += lh7a40x_udc.o -+obj-$(CONFIG_USB_PXA27X) += pxa27x_udc.o - obj-$(CONFIG_USB_AT91) += at91_udc.o - obj-$(CONFIG_USB_GADGET_GUMSTIX) += gumstix_gadget.o - ---- /dev/null -+++ b/drivers/usb/gadget/pxa27x_udc.c -@@ -0,0 +1,2352 @@ -+/* -+ * linux/drivers/usb/gadget/pxa27x_udc.c -+ * Intel PXA2xx and IXP4xx on-chip full speed USB device controllers -+ * -+ * Copyright (C) 2002 Intrinsyc, Inc. (Frank Becker) -+ * Copyright (C) 2003 Robert Schwebel, Pengutronix -+ * Copyright (C) 2003 Benedikt Spranger, Pengutronix -+ * Copyright (C) 2003 David Brownell -+ * Copyright (C) 2003 Joshua Wise -+ * Copyright (C) 2004 Intel Corporation -+ * Copyright (C) 2005 SDG Systems, LLC (Aric Blumer) -+ * -+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ * -+ */ -+ -+#undef DEBUG -+ // #define DEBUG 1 -+ //#define VERBOSE DBG_VERBOSE -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#include -+ -+ -+/* -+ * This driver handles the USB Device Controller (UDC) in Intel's PXA 27777777x -+ * series processors. -+ * Such controller drivers work with a gadget driver. The gadget driver -+ * returns descriptors, implements configuration and data protocols used -+ * by the host to interact with this device, and allocates endpoints to -+ * the different protocol interfaces. The controller driver virtualizes -+ * usb hardware so that the gadget drivers will be more portable. -+ * -+ * This UDC hardware wants to implement a bit too much USB protocol, so -+ * it constrains the sorts of USB configuration change events that work. -+ * The errata for these chips are misleading; some "fixed" bugs from -+ * pxa250 a0/a1 b0/b1/b2 sure act like they're still there. -+ */ -+ -+#define DRIVER_VERSION "21-Jul-2005" -+#define DRIVER_DESC "PXA 27x USB Device Controller driver" -+ -+ -+static const char driver_name [] = "pxa27x_udc"; -+ -+static const char ep0name [] = "ep0"; -+ -+ -+#define USE_DMA -+//#define DISABLE_TEST_MODE -+ -+#ifdef CONFIG_PROC_FS -+#define UDC_PROC_FILE -+#endif -+ -+#include "pxa27x_udc.h" -+ -+#if 0 -+#ifdef CONFIG_EMBEDDED -+/* few strings, and little code to use them */ -+#undef DEBUG -+#undef UDC_PROC_FILE -+#endif -+#endif -+ -+#ifdef USE_DMA -+static int use_dma = 1; -+module_param(use_dma, bool, 0); -+MODULE_PARM_DESC (use_dma, "true to use dma"); -+ -+static void dma_nodesc_handler (int dmach, void *_ep); -+static void kick_dma(struct pxa27x_ep *ep, struct pxa27x_request *req); -+ -+#define DMASTR " (dma support)" -+ -+#else /* !USE_DMA */ -+#define DMASTR " (pio only)" -+#endif -+ -+#ifdef CONFIG_USB_PXA27X_SMALL -+#define SIZE_STR " (small)" -+#else -+#define SIZE_STR "" -+#endif -+ -+#ifdef DISABLE_TEST_MODE -+/* (mode == 0) == no undocumented chip tweaks -+ * (mode & 1) == double buffer bulk IN -+ * (mode & 2) == double buffer bulk OUT -+ * ... so mode = 3 (or 7, 15, etc) does it for both -+ */ -+static ushort fifo_mode = 0; -+module_param(fifo_mode, ushort, 0); -+MODULE_PARM_DESC (fifo_mode, "pxa27x udc fifo mode"); -+#endif -+ -+#define UDCISR0_IR0 0x3 -+#define UDCISR_INT_MASK (UDC_INT_FIFOERROR | UDC_INT_PACKETCMP) -+#define UDCICR_INT_MASK UDCISR_INT_MASK -+ -+#define UDCCSR_MASK (UDCCSR_FST | UDCCSR_DME) -+/* --------------------------------------------------------------------------- -+ * endpoint related parts of the api to the usb controller hardware, -+ * used by gadget driver; and the inner talker-to-hardware core. -+ * --------------------------------------------------------------------------- -+ */ -+ -+static void pxa27x_ep_fifo_flush (struct usb_ep *ep); -+static void nuke (struct pxa27x_ep *, int status); -+ -+static void pio_irq_enable(int ep_num) -+{ -+ if (ep_num < 16) -+ UDCICR0 |= 3 << (ep_num * 2); -+ else { -+ ep_num -= 16; -+ UDCICR1 |= 3 << (ep_num * 2); -+ } -+} -+ -+static void pio_irq_disable(int ep_num) -+{ -+ ep_num &= 0xf; -+ if (ep_num < 16) -+ UDCICR0 &= ~(3 << (ep_num * 2)); -+ else { -+ ep_num -= 16; -+ UDCICR1 &= ~(3 << (ep_num * 2)); -+ } -+} -+ -+/* The UDCCR reg contains mask and interrupt status bits, -+ * so using '|=' isn't safe as it may ack an interrupt. -+ */ -+#define UDCCR_MASK_BITS (UDCCR_OEN | UDCCR_UDE) -+ -+static inline void udc_set_mask_UDCCR(int mask) -+{ -+ UDCCR = (UDCCR & UDCCR_MASK_BITS) | (mask & UDCCR_MASK_BITS); -+} -+ -+static inline void udc_clear_mask_UDCCR(int mask) -+{ -+ UDCCR = (UDCCR & UDCCR_MASK_BITS) & ~(mask & UDCCR_MASK_BITS); -+} -+ -+static inline void udc_ack_int_UDCCR(int mask) -+{ -+ /* udccr contains the bits we dont want to change */ -+ __u32 udccr = UDCCR & UDCCR_MASK_BITS; -+ -+ UDCCR = udccr | (mask & ~UDCCR_MASK_BITS); -+} -+ -+/* -+ * endpoint enable/disable -+ * -+ * we need to verify the descriptors used to enable endpoints. since pxa27x -+ * endpoint configurations are fixed, and are pretty much always enabled, -+ * there's not a lot to manage here. -+ * -+ * because pxa27x can't selectively initialize bulk (or interrupt) endpoints, -+ * (resetting endpoint halt and toggle), SET_INTERFACE is unusable except -+ * for a single interface (with only the default altsetting) and for gadget -+ * drivers that don't halt endpoints (not reset by set_interface). that also -+ * means that if you use ISO, you must violate the USB spec rule that all -+ * iso endpoints must be in non-default altsettings. -+ */ -+static int pxa27x_ep_enable (struct usb_ep *_ep, -+ const struct usb_endpoint_descriptor *desc) -+{ -+ struct pxa27x_ep *ep; -+ struct pxa27x_udc *dev; -+ -+ ep = container_of (_ep, struct pxa27x_ep, ep); -+ if (!_ep || !desc || _ep->name == ep0name -+ || desc->bDescriptorType != USB_DT_ENDPOINT -+ || ep->fifo_size < le16_to_cpu(desc->wMaxPacketSize)) { -+ DMSG("%s, bad ep or descriptor\n", __FUNCTION__); -+ return -EINVAL; -+ } -+ -+ /* xfer types must match, except that interrupt ~= bulk */ -+ if( ep->ep_type != USB_ENDPOINT_XFER_BULK -+ && desc->bmAttributes != USB_ENDPOINT_XFER_INT) { -+ DMSG("%s, %s type mismatch\n", __FUNCTION__, _ep->name); -+ return -EINVAL; -+ } -+ -+ /* hardware _could_ do smaller, but driver doesn't */ -+ if ((desc->bmAttributes == USB_ENDPOINT_XFER_BULK -+ && le16_to_cpu (desc->wMaxPacketSize) -+ != BULK_FIFO_SIZE) -+ || !desc->wMaxPacketSize) { -+ DMSG("%s, bad %s maxpacket\n", __FUNCTION__, _ep->name); -+ return -ERANGE; -+ } -+ -+ dev = ep->dev; -+ if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN) { -+ DMSG("%s, bogus device state\n", __FUNCTION__); -+ return -ESHUTDOWN; -+ } -+ -+ ep->desc = desc; -+ ep->dma = -1; -+ ep->stopped = 0; -+ ep->pio_irqs = ep->dma_irqs = 0; -+ ep->ep.maxpacket = le16_to_cpu (desc->wMaxPacketSize); -+ -+ /* flush fifo (mostly for OUT buffers) */ -+ pxa27x_ep_fifo_flush (_ep); -+ -+ /* ... reset halt state too, if we could ... */ -+ -+#ifdef USE_DMA -+ /* for (some) bulk and ISO endpoints, try to get a DMA channel and -+ * bind it to the endpoint. otherwise use PIO. -+ */ -+ DMSG("%s: called attributes=%d\n", __FUNCTION__, ep->ep_type); -+ switch (ep->ep_type) { -+ case USB_ENDPOINT_XFER_ISOC: -+ if (le16_to_cpu(desc->wMaxPacketSize) % 32) -+ break; -+ // fall through -+ case USB_ENDPOINT_XFER_BULK: -+ if (!use_dma || !ep->reg_drcmr) -+ break; -+ ep->dma = pxa_request_dma ((char *)_ep->name, -+ (le16_to_cpu (desc->wMaxPacketSize) > 64) -+ ? DMA_PRIO_MEDIUM /* some iso */ -+ : DMA_PRIO_LOW, -+ dma_nodesc_handler, ep); -+ if (ep->dma >= 0) { -+ *ep->reg_drcmr = DRCMR_MAPVLD | ep->dma; -+ DMSG("%s using dma%d\n", _ep->name, ep->dma); -+ } -+ default: -+ break; -+ } -+#endif -+ DBG(DBG_VERBOSE, "enabled %s\n", _ep->name); -+ return 0; -+} -+ -+static int pxa27x_ep_disable (struct usb_ep *_ep) -+{ -+ struct pxa27x_ep *ep; -+ -+ ep = container_of (_ep, struct pxa27x_ep, ep); -+ if (!_ep || !ep->desc) { -+ DMSG("%s, %s not enabled\n", __FUNCTION__, -+ _ep ? ep->ep.name : NULL); -+ return -EINVAL; -+ } -+ nuke (ep, -ESHUTDOWN); -+ -+#ifdef USE_DMA -+ if (ep->dma >= 0) { -+ *ep->reg_drcmr = 0; -+ pxa_free_dma (ep->dma); -+ ep->dma = -1; -+ } -+#endif -+ -+ /* flush fifo (mostly for IN buffers) */ -+ pxa27x_ep_fifo_flush (_ep); -+ -+ ep->desc = 0; -+ ep->stopped = 1; -+ -+ DBG(DBG_VERBOSE, "%s disabled\n", _ep->name); -+ return 0; -+} -+ -+/*-------------------------------------------------------------------------*/ -+ -+/* for the pxa27x, these can just wrap kmalloc/kfree. gadget drivers -+ * must still pass correctly initialized endpoints, since other controller -+ * drivers may care about how it's currently set up (dma issues etc). -+ */ -+ -+/* -+ * pxa27x_ep_alloc_request - allocate a request data structure -+ */ -+static struct usb_request * -+pxa27x_ep_alloc_request (struct usb_ep *_ep, unsigned gfp_flags) -+{ -+ struct pxa27x_request *req; -+ -+ req = kmalloc (sizeof *req, gfp_flags); -+ if (!req) -+ return 0; -+ -+ memset (req, 0, sizeof *req); -+ INIT_LIST_HEAD (&req->queue); -+ return &req->req; -+} -+ -+ -+/* -+ * pxa27x_ep_free_request - deallocate a request data structure -+ */ -+static void -+pxa27x_ep_free_request (struct usb_ep *_ep, struct usb_request *_req) -+{ -+ struct pxa27x_request *req; -+ -+ req = container_of(_req, struct pxa27x_request, req); -+ WARN_ON (!list_empty (&req->queue)); -+ kfree(req); -+} -+ -+ -+/* PXA cache needs flushing with DMA I/O (it's dma-incoherent), but there's -+ * no device-affinity and the heap works perfectly well for i/o buffers. -+ * It wastes much less memory than dma_alloc_coherent() would, and even -+ * prevents cacheline (32 bytes wide) sharing problems. -+ */ -+static void * -+pxa27x_ep_alloc_buffer(struct usb_ep *_ep, unsigned bytes, -+ dma_addr_t *dma, unsigned gfp_flags) -+{ -+ char *retval; -+ -+ retval = kmalloc (bytes, gfp_flags & ~(__GFP_DMA|__GFP_HIGHMEM)); -+ if (retval) -+ *dma = virt_to_bus (retval); -+ return retval; -+} -+ -+static void -+pxa27x_ep_free_buffer(struct usb_ep *_ep, void *buf, dma_addr_t dma, -+ unsigned bytes) -+{ -+ kfree (buf); -+} -+ -+/*-------------------------------------------------------------------------*/ -+ -+/* -+ * done - retire a request; caller blocked irqs -+ */ -+static void done(struct pxa27x_ep *ep, struct pxa27x_request *req, int status) -+{ -+ list_del_init(&req->queue); -+ if (likely (req->req.status == -EINPROGRESS)) -+ req->req.status = status; -+ else -+ status = req->req.status; -+ -+ if (status && status != -ESHUTDOWN) -+ DBG(DBG_VERBOSE, "complete %s req %p stat %d len %u/%u\n", -+ ep->ep.name, &req->req, status, -+ req->req.actual, req->req.length); -+ -+ /* don't modify queue heads during completion callback */ -+ req->req.complete(&ep->ep, &req->req); -+} -+ -+ -+static inline void ep0_idle (struct pxa27x_udc *dev) -+{ -+ dev->ep0state = EP0_IDLE; -+ LED_EP0_OFF; -+} -+ -+static int -+write_packet(volatile u32 *uddr, struct pxa27x_request *req, unsigned max) -+{ -+ u32 *buf; -+ int length, count, remain; -+ -+ buf = (u32*)(req->req.buf + req->req.actual); -+ prefetch(buf); -+ -+ /* how big will this packet be? */ -+ length = min(req->req.length - req->req.actual, max); -+ req->req.actual += length; -+ -+ remain = length & 0x3; -+ count = length & ~(0x3); -+ -+ while (likely(count)) { -+ *uddr = *buf++; -+ count -= 4; -+ } -+ -+ if (remain) { -+ volatile u8* reg=(u8*)uddr; -+ char *rd =(u8*)buf; -+ -+ while (remain--) { -+ *reg=*rd++; -+ } -+ } -+ -+ return length; -+} -+ -+/* -+ * write to an IN endpoint fifo, as many packets as possible. -+ * irqs will use this to write the rest later. -+ * caller guarantees at least one packet buffer is ready (or a zlp). -+ */ -+static int -+write_fifo (struct pxa27x_ep *ep, struct pxa27x_request *req) -+{ -+ unsigned max; -+ -+ max = le16_to_cpu(ep->desc->wMaxPacketSize); -+ do { -+ int count; -+ int is_last, is_short; -+ -+ count = write_packet(ep->reg_udcdr, req, max); -+ -+ /* last packet is usually short (or a zlp) */ -+ if (unlikely (count != max)) -+ is_last = is_short = 1; -+ else { -+ if (likely(req->req.length != req->req.actual) -+ || req->req.zero) -+ is_last = 0; -+ else -+ is_last = 1; -+ /* interrupt/iso maxpacket may not fill the fifo */ -+ is_short = unlikely (max < ep->fifo_size); -+ } -+ -+ DMSG("wrote %s count:%d bytes%s%s %d left %p\n", -+ ep->ep.name, count, -+ is_last ? "/L" : "", is_short ? "/S" : "", -+ req->req.length - req->req.actual, &req->req); -+ -+ /* let loose that packet. maybe try writing another one, -+ * double buffering might work. TSP, TPC, and TFS -+ * bit values are the same for all normal IN endpoints. -+ */ -+ *ep->reg_udccsr = UDCCSR_PC; -+ if (is_short) -+ *ep->reg_udccsr = UDCCSR_SP; -+ -+ /* requests complete when all IN data is in the FIFO */ -+ if (is_last) { -+ done (ep, req, 0); -+ if (list_empty(&ep->queue) || unlikely(ep->dma >= 0)) { -+ pio_irq_disable (ep->ep_num); -+#ifdef USE_DMA -+ /* unaligned data and zlps couldn't use dma */ -+ if (unlikely(!list_empty(&ep->queue))) { -+ req = list_entry(ep->queue.next, -+ struct pxa27x_request, queue); -+ kick_dma(ep,req); -+ return 0; -+ } -+#endif -+ } -+ return 1; -+ } -+ -+ // TODO experiment: how robust can fifo mode tweaking be? -+ // double buffering is off in the default fifo mode, which -+ // prevents TFS from being set here. -+ -+ } while (*ep->reg_udccsr & UDCCSR_FS); -+ return 0; -+} -+ -+/* caller asserts req->pending (ep0 irq status nyet cleared); starts -+ * ep0 data stage. these chips want very simple state transitions. -+ */ -+static inline -+void ep0start(struct pxa27x_udc *dev, u32 flags, const char *tag) -+{ -+ UDCCSR0 = flags|UDCCSR0_SA|UDCCSR0_OPC; -+ UDCISR0 = UDCICR_INT(0, UDC_INT_FIFOERROR | UDC_INT_PACKETCMP); -+ dev->req_pending = 0; -+ DBG(DBG_VERY_NOISY, "%s %s, %02x/%02x\n", -+ __FUNCTION__, tag, UDCCSR0, flags); -+} -+ -+static int -+write_ep0_fifo (struct pxa27x_ep *ep, struct pxa27x_request *req) -+{ -+ unsigned count; -+ int is_short; -+ -+ count = write_packet(&UDCDR0, req, EP0_FIFO_SIZE); -+ ep->dev->stats.write.bytes += count; -+ -+ /* last packet "must be" short (or a zlp) */ -+ is_short = (count != EP0_FIFO_SIZE); -+ -+ DBG(DBG_VERY_NOISY, "ep0in %d bytes %d left %p\n", count, -+ req->req.length - req->req.actual, &req->req); -+ -+ if (unlikely (is_short)) { -+ if (ep->dev->req_pending) -+ ep0start(ep->dev, UDCCSR0_IPR, "short IN"); -+ else -+ UDCCSR0 = UDCCSR0_IPR; -+ -+ count = req->req.length; -+ done (ep, req, 0); -+ ep0_idle(ep->dev); -+#if 0 -+ /* This seems to get rid of lost status irqs in some cases: -+ * host responds quickly, or next request involves config -+ * change automagic, or should have been hidden, or ... -+ * -+ * FIXME get rid of all udelays possible... -+ */ -+ if (count >= EP0_FIFO_SIZE) { -+ count = 100; -+ do { -+ if ((UDCCSR0 & UDCCSR0_OPC) != 0) { -+ /* clear OPC, generate ack */ -+ UDCCSR0 = UDCCSR0_OPC; -+ break; -+ } -+ count--; -+ udelay(1); -+ } while (count); -+ } -+#endif -+ } else if (ep->dev->req_pending) -+ ep0start(ep->dev, 0, "IN"); -+ return is_short; -+} -+ -+ -+/* -+ * read_fifo - unload packet(s) from the fifo we use for usb OUT -+ * transfers and put them into the request. caller should have made -+ * sure there's at least one packet ready. -+ * -+ * returns true if the request completed because of short packet or the -+ * request buffer having filled (and maybe overran till end-of-packet). -+ */ -+static int -+read_fifo (struct pxa27x_ep *ep, struct pxa27x_request *req) -+{ -+ for (;;) { -+ u32 *buf; -+ int bufferspace, count, is_short; -+ -+ /* make sure there's a packet in the FIFO.*/ -+ if (unlikely ((*ep->reg_udccsr & UDCCSR_PC) == 0)) -+ break; -+ buf =(u32*) (req->req.buf + req->req.actual); -+ prefetchw(buf); -+ bufferspace = req->req.length - req->req.actual; -+ -+ /* read all bytes from this packet */ -+ if (likely (*ep->reg_udccsr & UDCCSR_BNE)) { -+ count = 0x3ff & *ep->reg_udcbcr; -+ req->req.actual += min (count, bufferspace); -+ } else /* zlp */ -+ count = 0; -+ -+ is_short = (count < ep->ep.maxpacket); -+ DMSG("read %s udccsr:%02x, count:%d bytes%s req %p %d/%d\n", -+ ep->ep.name, *ep->reg_udccsr, count, -+ is_short ? "/S" : "", -+ &req->req, req->req.actual, req->req.length); -+ -+// dump_regs(ep->ep_num ); -+ count = min(count, bufferspace); -+ while (likely (count > 0)) { -+ *buf++ = *ep->reg_udcdr; -+ count -= 4; -+ } -+ DMSG("Buf:0x%p\n", req->req.buf); -+ -+ *ep->reg_udccsr = UDCCSR_PC; -+ /* RPC/RSP/RNE could now reflect the other packet buffer */ -+ -+ /* completion */ -+ if (is_short || req->req.actual == req->req.length) { -+ done (ep, req, 0); -+ if (list_empty(&ep->queue)) -+ pio_irq_disable (ep->ep_num); -+ return 1; -+ } -+ -+ /* finished that packet. the next one may be waiting... */ -+ } -+ return 0; -+} -+ -+/* -+ * special ep0 version of the above. no UBCR0 or double buffering; status -+ * handshaking is magic. most device protocols don't need control-OUT. -+ * CDC vendor commands (and RNDIS), mass storage CB/CBI, and some other -+ * protocols do use them. -+ */ -+static int -+read_ep0_fifo (struct pxa27x_ep *ep, struct pxa27x_request *req) -+{ -+ u32 *buf, word; -+ unsigned bufferspace; -+ -+ buf = (u32*) (req->req.buf + req->req.actual); -+ bufferspace = req->req.length - req->req.actual; -+ -+ while (UDCCSR0 & UDCCSR0_RNE) { -+ word = UDCDR0; -+ -+ if (unlikely (bufferspace == 0)) { -+ /* this happens when the driver's buffer -+ * is smaller than what the host sent. -+ * discard the extra data. -+ */ -+ if (req->req.status != -EOVERFLOW) -+ DMSG("%s overflow\n", ep->ep.name); -+ req->req.status = -EOVERFLOW; -+ } else { -+ *buf++ = word; -+ req->req.actual += 4; -+ bufferspace -= 4; -+ } -+ } -+ -+ UDCCSR0 = UDCCSR0_OPC ; -+ -+ /* completion */ -+ if (req->req.actual >= req->req.length) -+ return 1; -+ -+ /* finished that packet. the next one may be waiting... */ -+ return 0; -+} -+ -+#ifdef USE_DMA -+ -+#define MAX_IN_DMA ((DCMD_LENGTH + 1) - BULK_FIFO_SIZE) -+static void kick_dma(struct pxa27x_ep *ep, struct pxa27x_request *req) -+{ -+ u32 dcmd = 0; -+ u32 len = req->req.length; -+ u32 buf = req->req.dma; -+ u32 fifo = io_v2p ((u32)ep->reg_udcdr); -+ -+ buf += req->req.actual; -+ len -= req->req.actual; -+ ep->dma_con = 0; -+ -+ DMSG("%s: req:0x%p length:%d, actual:%d dma:%d\n", -+ __FUNCTION__, &req->req, req->req.length, -+ req->req.actual,ep->dma); -+ -+ /* no-descriptor mode can be simple for bulk-in, iso-in, iso-out */ -+ DCSR(ep->dma) = DCSR_NODESC; -+ if (buf & 0x3) -+ DALGN |= 1 << ep->dma; -+ else -+ DALGN &= ~(1 << ep->dma); -+ -+ if (ep->dir_in) { -+ DSADR(ep->dma) = buf; -+ DTADR(ep->dma) = fifo; -+ if (len > MAX_IN_DMA) { -+ len= MAX_IN_DMA; -+ ep->dma_con =1 ; -+ } else if (len >= ep->ep.maxpacket) { -+ if ((ep->dma_con = (len % ep->ep.maxpacket) != 0)) -+ len = ep->ep.maxpacket; -+ } -+ dcmd = len | DCMD_BURST32 | DCMD_WIDTH4 | DCMD_ENDIRQEN -+ | DCMD_FLOWTRG | DCMD_INCSRCADDR; -+ } else { -+ DSADR(ep->dma) = fifo; -+ DTADR(ep->dma) = buf; -+ dcmd = len | DCMD_BURST32 | DCMD_WIDTH4 | DCMD_ENDIRQEN -+ | DCMD_FLOWSRC | DCMD_INCTRGADDR; -+ } -+ *ep->reg_udccsr = UDCCSR_DME; -+ DCMD(ep->dma) = dcmd; -+ DCSR(ep->dma) = DCSR_NODESC | DCSR_EORIRQEN \ -+ | ((ep->dir_in) ? DCSR_STOPIRQEN : 0); -+ *ep->reg_drcmr = ep->dma | DRCMR_MAPVLD; -+ DCSR(ep->dma) |= DCSR_RUN; -+} -+ -+static void cancel_dma(struct pxa27x_ep *ep) -+{ -+ struct pxa27x_request *req; -+ u32 tmp; -+ -+ if (DCSR(ep->dma) == 0 || list_empty(&ep->queue)) -+ return; -+ -+ DMSG("hehe dma:%d,dcsr:0x%x\n", ep->dma, DCSR(ep->dma)); -+ DCSR(ep->dma) = 0; -+ while ((DCSR(ep->dma) & DCSR_STOPSTATE) == 0) -+ cpu_relax(); -+ -+ req = list_entry(ep->queue.next, struct pxa27x_request, queue); -+ tmp = DCMD(ep->dma) & DCMD_LENGTH; -+ req->req.actual = req->req.length - tmp; -+ -+ /* the last tx packet may be incomplete, so flush the fifo. -+ * FIXME correct req.actual if we can -+ */ -+ *ep->reg_udccsr = UDCCSR_FEF; -+} -+ -+static void dma_nodesc_handler(int dmach, void *_ep) -+{ -+ struct pxa27x_ep *ep = _ep; -+ struct pxa27x_request *req, *req_next; -+ u32 dcsr, tmp, completed; -+ -+ local_irq_disable(); -+ -+ req = list_entry(ep->queue.next, struct pxa27x_request, queue); -+ -+ DMSG("%s, buf:0x%p\n",__FUNCTION__, req->req.buf); -+ -+ ep->dma_irqs++; -+ ep->dev->stats.irqs++; -+ HEX_DISPLAY(ep->dev->stats.irqs); -+ -+ completed = 0; -+ -+ dcsr = DCSR(dmach); -+ DCSR(ep->dma) &= ~DCSR_RUN; -+ -+ if (dcsr & DCSR_BUSERR) { -+ DCSR(dmach) = DCSR_BUSERR; -+ printk(KERN_ERR " Buss Error\n"); -+ req->req.status = -EIO; -+ completed = 1; -+ } else if (dcsr & DCSR_ENDINTR) { -+ DCSR(dmach) = DCSR_ENDINTR; -+ if (ep->dir_in) { -+ tmp = req->req.length - req->req.actual; -+ /* Last packet is a short one*/ -+ if ( tmp < ep->ep.maxpacket) { -+ int count = 0; -+ -+ *ep->reg_udccsr = UDCCSR_SP | \ -+ (*ep->reg_udccsr & UDCCSR_MASK); -+ /*Wait for packet out */ -+ while( (count++ < 10000) && \ -+ !(*ep->reg_udccsr & UDCCSR_FS)); -+ if (count >= 10000) -+ DMSG("Failed to send packet\n"); -+ else -+ DMSG("%s: short packet sent len:%d," -+ "length:%d,actual:%d\n", __FUNCTION__, -+ tmp, req->req.length, req->req.actual); -+ req->req.actual = req->req.length; -+ completed = 1; -+ /* There are still packets to transfer */ -+ } else if ( ep->dma_con) { -+ DMSG("%s: more packets,length:%d,actual:%d\n", -+ __FUNCTION__,req->req.length, -+ req->req.actual); -+ req->req.actual += ep->ep.maxpacket; -+ completed = 0; -+ } else { -+ DMSG("%s: no more packets,length:%d," -+ "actual:%d\n", __FUNCTION__, -+ req->req.length, req->req.actual); -+ req->req.actual = req->req.length; -+ completed = 1; -+ } -+ } else { -+ req->req.actual = req->req.length; -+ completed = 1; -+ } -+ } else if (dcsr & DCSR_EORINTR) { //Only happened in OUT DMA -+ int remain,udccsr ; -+ -+ DCSR(dmach) = DCSR_EORINTR; -+ remain = DCMD(dmach) & DCMD_LENGTH; -+ req->req.actual = req->req.length - remain; -+ -+ udccsr = *ep->reg_udccsr; -+ if (udccsr & UDCCSR_SP) { -+ *ep->reg_udccsr = UDCCSR_PC | (udccsr & UDCCSR_MASK); -+ completed = 1; -+ } -+ DMSG("%s: length:%d actual:%d\n", -+ __FUNCTION__, req->req.length, req->req.actual); -+ } else -+ DMSG("%s: Others dma:%d DCSR:0x%x DCMD:0x%x\n", -+ __FUNCTION__, dmach, DCSR(dmach), DCMD(dmach)); -+ -+ if (likely(completed)) { -+ if (req->queue.next != &ep->queue) { -+ req_next = list_entry(req->queue.next, -+ struct pxa27x_request, queue); -+ kick_dma(ep, req_next); -+ } -+ done(ep, req, 0); -+ } else { -+ kick_dma(ep, req); -+ } -+ -+ local_irq_enable(); -+} -+ -+#endif -+/*-------------------------------------------------------------------------*/ -+ -+static int -+pxa27x_ep_queue(struct usb_ep *_ep, struct usb_request *_req, unsigned gfp_flags) -+{ -+ struct pxa27x_ep *ep; -+ struct pxa27x_request *req; -+ struct pxa27x_udc *dev; -+ unsigned long flags; -+ -+ req = container_of(_req, struct pxa27x_request, req); -+ if (unlikely (!_req || !_req->complete || !_req->buf|| -+ !list_empty(&req->queue))) { -+ DMSG("%s, bad params\n", __FUNCTION__); -+ return -EINVAL; -+ } -+ -+ ep = container_of(_ep, struct pxa27x_ep, ep); -+ if (unlikely (!_ep || (!ep->desc && ep->ep.name != ep0name))) { -+ DMSG("%s, bad ep\n", __FUNCTION__); -+ return -EINVAL; -+ } -+ -+ DMSG("%s, ep point %d is queue\n", __FUNCTION__, ep->ep_num); -+ -+ dev = ep->dev; -+ if (unlikely (!dev->driver -+ || dev->gadget.speed == USB_SPEED_UNKNOWN)) { -+ DMSG("%s, bogus device state\n", __FUNCTION__); -+ return -ESHUTDOWN; -+ } -+ -+ /* iso is always one packet per request, that's the only way -+ * we can report per-packet status. that also helps with dma. -+ */ -+ if (unlikely (ep->ep_type == USB_ENDPOINT_XFER_ISOC -+ && req->req.length > le16_to_cpu -+ (ep->desc->wMaxPacketSize))) -+ return -EMSGSIZE; -+ -+#ifdef USE_DMA -+ // FIXME caller may already have done the dma mapping -+ if (ep->dma >= 0) { -+ _req->dma = dma_map_single(dev->dev, _req->buf, _req->length, -+ (ep->dir_in) ? DMA_TO_DEVICE : DMA_FROM_DEVICE); -+ } -+#endif -+ -+ DBG(DBG_NOISY, "%s queue req %p, len %d buf %p\n", -+ _ep->name, _req, _req->length, _req->buf); -+ -+ local_irq_save(flags); -+ -+ _req->status = -EINPROGRESS; -+ _req->actual = 0; -+ -+ /* kickstart this i/o queue? */ -+ if (list_empty(&ep->queue) && !ep->stopped) { -+ if (ep->desc == 0 /* ep0 */) { -+ unsigned length = _req->length; -+ -+ switch (dev->ep0state) { -+ case EP0_IN_DATA_PHASE: -+ dev->stats.write.ops++; -+ if (write_ep0_fifo(ep, req)) -+ req = 0; -+ break; -+ -+ case EP0_OUT_DATA_PHASE: -+ dev->stats.read.ops++; -+ if (dev->req_pending) -+ ep0start(dev, UDCCSR0_IPR, "OUT"); -+ if (length == 0 || ((UDCCSR0 & UDCCSR0_RNE) != 0 -+ && read_ep0_fifo(ep, req))) { -+ ep0_idle(dev); -+ done(ep, req, 0); -+ req = 0; -+ } -+ break; -+ case EP0_NO_ACTION: -+ ep0_idle(dev); -+ req=0; -+ break; -+ default: -+ DMSG("ep0 i/o, odd state %d\n", dev->ep0state); -+ local_irq_restore (flags); -+ return -EL2HLT; -+ } -+#ifdef USE_DMA -+ /* either start dma or prime pio pump */ -+ } else if (ep->dma >= 0) { -+ kick_dma(ep, req); -+#endif -+ /* can the FIFO can satisfy the request immediately? */ -+ } else if (ep->dir_in -+ && (*ep->reg_udccsr & UDCCSR_FS) != 0 -+ && write_fifo(ep, req)) { -+ req = 0; -+ } else if ((*ep->reg_udccsr & UDCCSR_FS) != 0 -+ && read_fifo(ep, req)) { -+ req = 0; -+ } -+ DMSG("req:%p,ep->desc:%p,ep->dma:%d\n", req, ep->desc, ep->dma); -+ if (likely (req && ep->desc) && ep->dma < 0) -+ pio_irq_enable(ep->ep_num); -+ } -+ -+ /* pio or dma irq handler advances the queue. */ -+ if (likely (req != 0)) -+ list_add_tail(&req->queue, &ep->queue); -+ local_irq_restore(flags); -+ -+ return 0; -+} -+ -+ -+/* -+ * nuke - dequeue ALL requests -+ */ -+static void nuke(struct pxa27x_ep *ep, int status) -+{ -+ struct pxa27x_request *req; -+ -+ /* called with irqs blocked */ -+#ifdef USE_DMA -+ if (ep->dma >= 0 && !ep->stopped) -+ cancel_dma(ep); -+#endif -+ while (!list_empty(&ep->queue)) { -+ req = list_entry(ep->queue.next, struct pxa27x_request, queue); -+ done(ep, req, status); -+ } -+ if (ep->desc) -+ pio_irq_disable (ep->ep_num); -+} -+ -+ -+/* dequeue JUST ONE request */ -+static int pxa27x_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) -+{ -+ struct pxa27x_ep *ep; -+ struct pxa27x_request *req; -+ unsigned long flags; -+ -+ ep = container_of(_ep, struct pxa27x_ep, ep); -+ if (!_ep || ep->ep.name == ep0name) -+ return -EINVAL; -+ -+ local_irq_save(flags); -+ -+ /* make sure it's actually queued on this endpoint */ -+ list_for_each_entry (req, &ep->queue, queue) { -+ if (&req->req == _req) -+ break; -+ } -+ if (&req->req != _req) { -+ local_irq_restore(flags); -+ return -EINVAL; -+ } -+ -+#ifdef USE_DMA -+ if (ep->dma >= 0 && ep->queue.next == &req->queue && !ep->stopped) { -+ cancel_dma(ep); -+ done(ep, req, -ECONNRESET); -+ /* restart i/o */ -+ if (!list_empty(&ep->queue)) { -+ req = list_entry(ep->queue.next, -+ struct pxa27x_request, queue); -+ kick_dma(ep, req); -+ } -+ } else -+#endif -+ done(ep, req, -ECONNRESET); -+ -+ local_irq_restore(flags); -+ return 0; -+} -+ -+/*-------------------------------------------------------------------------*/ -+ -+static int pxa27x_ep_set_halt(struct usb_ep *_ep, int value) -+{ -+ struct pxa27x_ep *ep; -+ unsigned long flags; -+ -+ DMSG("%s is called\n", __FUNCTION__); -+ ep = container_of(_ep, struct pxa27x_ep, ep); -+ if (unlikely (!_ep -+ || (!ep->desc && ep->ep.name != ep0name)) -+ || ep->ep_type == USB_ENDPOINT_XFER_ISOC) { -+ DMSG("%s, bad ep\n", __FUNCTION__); -+ return -EINVAL; -+ } -+ if (value == 0) { -+ /* this path (reset toggle+halt) is needed to implement -+ * SET_INTERFACE on normal hardware. but it can't be -+ * done from software on the PXA UDC, and the hardware -+ * forgets to do it as part of SET_INTERFACE automagic. -+ */ -+ DMSG("only host can clear %s halt\n", _ep->name); -+ return -EROFS; -+ } -+ -+ local_irq_save(flags); -+ -+ if (ep->dir_in && ((*ep->reg_udccsr & UDCCSR_FS) == 0 -+ || !list_empty(&ep->queue))) { -+ local_irq_restore(flags); -+ return -EAGAIN; -+ } -+ -+ /* FST bit is the same for control, bulk in, bulk out, interrupt in */ -+ *ep->reg_udccsr = UDCCSR_FST|UDCCSR_FEF; -+ -+ /* ep0 needs special care */ -+ if (!ep->desc) { -+ start_watchdog(ep->dev); -+ ep->dev->req_pending = 0; -+ ep->dev->ep0state = EP0_STALL; -+ LED_EP0_OFF; -+ -+ /* and bulk/intr endpoints like dropping stalls too */ -+ } else { -+ unsigned i; -+ for (i = 0; i < 1000; i += 20) { -+ if (*ep->reg_udccsr & UDCCSR_SST) -+ break; -+ udelay(20); -+ } -+ } -+ local_irq_restore(flags); -+ -+ DBG(DBG_VERBOSE, "%s halt\n", _ep->name); -+ return 0; -+} -+ -+static int pxa27x_ep_fifo_status(struct usb_ep *_ep) -+{ -+ struct pxa27x_ep *ep; -+ -+ ep = container_of(_ep, struct pxa27x_ep, ep); -+ if (!_ep) { -+ DMSG("%s, bad ep\n", __FUNCTION__); -+ return -ENODEV; -+ } -+ /* pxa can't report unclaimed bytes from IN fifos */ -+ if (ep->dir_in) -+ return -EOPNOTSUPP; -+ if (ep->dev->gadget.speed == USB_SPEED_UNKNOWN -+ || (*ep->reg_udccsr & UDCCSR_FS) == 0) -+ return 0; -+ else -+ return (*ep->reg_udcbcr & 0xfff) + 1; -+} -+ -+static void pxa27x_ep_fifo_flush(struct usb_ep *_ep) -+{ -+ struct pxa27x_ep *ep; -+ -+ ep = container_of(_ep, struct pxa27x_ep, ep); -+ if (!_ep || ep->ep.name == ep0name || !list_empty(&ep->queue)) { -+ DMSG("%s, bad ep\n", __FUNCTION__); -+ return; -+ } -+ -+ /* toggle and halt bits stay unchanged */ -+ -+ /* for OUT, just read and discard the FIFO contents. */ -+ if (!ep->dir_in) { -+ while (((*ep->reg_udccsr) & UDCCSR_BNE) != 0) -+ (void) *ep->reg_udcdr; -+ return; -+ } -+ -+ /* most IN status is the same, but ISO can't stall */ -+ *ep->reg_udccsr = UDCCSR_PC|UDCCSR_FST|UDCCSR_TRN -+ | (ep->ep_type == USB_ENDPOINT_XFER_ISOC) -+ ? 0 : UDCCSR_SST; -+} -+ -+ -+static struct usb_ep_ops pxa27x_ep_ops = { -+ .enable = pxa27x_ep_enable, -+ .disable = pxa27x_ep_disable, -+ -+ .alloc_request = pxa27x_ep_alloc_request, -+ .free_request = pxa27x_ep_free_request, -+ -+ .alloc_buffer = pxa27x_ep_alloc_buffer, -+ .free_buffer = pxa27x_ep_free_buffer, -+ -+ .queue = pxa27x_ep_queue, -+ .dequeue = pxa27x_ep_dequeue, -+ -+ .set_halt = pxa27x_ep_set_halt, -+ .fifo_status = pxa27x_ep_fifo_status, -+ .fifo_flush = pxa27x_ep_fifo_flush, -+}; -+ -+ -+/* --------------------------------------------------------------------------- -+ * device-scoped parts of the api to the usb controller hardware -+ * --------------------------------------------------------------------------- -+ */ -+ -+static int pxa27x_udc_get_frame(struct usb_gadget *_gadget) -+{ -+ return (UDCFNR & 0x3FF); -+} -+ -+static int pxa27x_udc_wakeup(struct usb_gadget *_gadget) -+{ -+ /* host may not have enabled remote wakeup */ -+ if ((UDCCR & UDCCR_DWRE) == 0) -+ return -EHOSTUNREACH; -+ udc_set_mask_UDCCR(UDCCR_UDR); -+ return 0; -+} -+ -+static const struct usb_gadget_ops pxa27x_udc_ops = { -+ .get_frame = pxa27x_udc_get_frame, -+ .wakeup = pxa27x_udc_wakeup, -+ // current versions must always be self-powered -+}; -+ -+ -+/*-------------------------------------------------------------------------*/ -+ -+#ifdef UDC_PROC_FILE -+ -+static const char proc_node_name [] = "driver/udc"; -+ -+static int -+udc_proc_read(char *page, char **start, off_t off, int count, -+ int *eof, void *_dev) -+{ -+ char *buf = page; -+ struct pxa27x_udc *dev = _dev; -+ char *next = buf; -+ unsigned size = count; -+ unsigned long flags; -+ int i, t; -+ u32 tmp; -+ -+ if (off != 0) -+ return 0; -+ -+ local_irq_save(flags); -+ -+ /* basic device status */ -+ t = scnprintf(next, size, DRIVER_DESC "\n" -+ "%s version: %s\nGadget driver: %s\n", -+ driver_name, DRIVER_VERSION SIZE_STR DMASTR, -+ dev->driver ? dev->driver->driver.name : "(none)"); -+ size -= t; -+ next += t; -+ -+ /* registers for device and ep0 */ -+ t = scnprintf(next, size, -+ "uicr %02X.%02X, usir %02X.%02x, ufnr %02X\n", -+ UDCICR1, UDCICR0, UDCISR1, UDCISR0, UDCFNR); -+ size -= t; -+ next += t; -+ -+ tmp = UDCCR; -+ t = scnprintf(next, size,"udccr %02X =%s%s%s%s%s%s%s%s%s%s, con=%d,inter=%d,altinter=%d\n", tmp, -+ (tmp & UDCCR_OEN) ? " oen":"", -+ (tmp & UDCCR_AALTHNP) ? " aalthnp":"", -+ (tmp & UDCCR_AHNP) ? " rem" : "", -+ (tmp & UDCCR_BHNP) ? " rstir" : "", -+ (tmp & UDCCR_DWRE) ? " dwre" : "", -+ (tmp & UDCCR_SMAC) ? " smac" : "", -+ (tmp & UDCCR_EMCE) ? " emce" : "", -+ (tmp & UDCCR_UDR) ? " udr" : "", -+ (tmp & UDCCR_UDA) ? " uda" : "", -+ (tmp & UDCCR_UDE) ? " ude" : "", -+ (tmp & UDCCR_ACN) >> UDCCR_ACN_S, -+ (tmp & UDCCR_AIN) >> UDCCR_AIN_S, -+ (tmp & UDCCR_AAISN)>> UDCCR_AAISN_S ); -+ -+ size -= t; -+ next += t; -+ -+ tmp = UDCCSR0; -+ t = scnprintf(next, size, -+ "udccsr0 %02X =%s%s%s%s%s%s%s\n", tmp, -+ (tmp & UDCCSR0_SA) ? " sa" : "", -+ (tmp & UDCCSR0_RNE) ? " rne" : "", -+ (tmp & UDCCSR0_FST) ? " fst" : "", -+ (tmp & UDCCSR0_SST) ? " sst" : "", -+ (tmp & UDCCSR0_DME) ? " dme" : "", -+ (tmp & UDCCSR0_IPR) ? " ipr" : "", -+ (tmp & UDCCSR0_OPC) ? " opc" : ""); -+ size -= t; -+ next += t; -+ -+ if (!dev->driver) -+ goto done; -+ -+ t = scnprintf(next, size, "ep0 IN %lu/%lu, OUT %lu/%lu\nirqs %lu\n\n", -+ dev->stats.write.bytes, dev->stats.write.ops, -+ dev->stats.read.bytes, dev->stats.read.ops, -+ dev->stats.irqs); -+ size -= t; -+ next += t; -+ -+ /* dump endpoint queues */ -+ for (i = 0; i < UDC_EP_NUM; i++) { -+ struct pxa27x_ep *ep = &dev->ep [i]; -+ struct pxa27x_request *req; -+ int t; -+ -+ if (i != 0) { -+ const struct usb_endpoint_descriptor *d; -+ -+ d = ep->desc; -+ if (!d) -+ continue; -+ tmp = *dev->ep [i].reg_udccsr; -+ t = scnprintf(next, size, -+ "%s max %d %s udccs %02x udccr:0x%x\n", -+ ep->ep.name, le16_to_cpu (d->wMaxPacketSize), -+ (ep->dma >= 0) ? "dma" : "pio", tmp, -+ *dev->ep[i].reg_udccr); -+ /* TODO translate all five groups of udccs bits! */ -+ -+ } else /* ep0 should only have one transfer queued */ -+ t = scnprintf(next, size, "ep0 max 16 pio irqs %lu\n", -+ ep->pio_irqs); -+ if (t <= 0 || t > size) -+ goto done; -+ size -= t; -+ next += t; -+ -+ if (list_empty(&ep->queue)) { -+ t = scnprintf(next, size, "\t(nothing queued)\n"); -+ if (t <= 0 || t > size) -+ goto done; -+ size -= t; -+ next += t; -+ continue; -+ } -+ list_for_each_entry(req, &ep->queue, queue) { -+#ifdef USE_DMA -+ if (ep->dma >= 0 && req->queue.prev == &ep->queue) -+ t = scnprintf(next, size, -+ "\treq %p len %d/%d " -+ "buf %p (dma%d dcmd %08x)\n", -+ &req->req, req->req.actual, -+ req->req.length, req->req.buf, -+ ep->dma, DCMD(ep->dma) -+ // low 13 bits == bytes-to-go -+ ); -+ else -+#endif -+ t = scnprintf(next, size, -+ "\treq %p len %d/%d buf %p\n", -+ &req->req, req->req.actual, -+ req->req.length, req->req.buf); -+ if (t <= 0 || t > size) -+ goto done; -+ size -= t; -+ next += t; -+ } -+ } -+ -+done: -+ local_irq_restore(flags); -+ *eof = 1; -+ return count - size; -+} -+ -+#define create_proc_files() \ -+ create_proc_read_entry(proc_node_name, 0, NULL, udc_proc_read, dev) -+#define remove_proc_files() \ -+ remove_proc_entry(proc_node_name, NULL) -+ -+#else /* !UDC_PROC_FILE */ -+#define create_proc_files() do {} while (0) -+#define remove_proc_files() do {} while (0) -+ -+#endif /* UDC_PROC_FILE */ -+ -+/* "function" sysfs attribute */ -+static ssize_t -+show_function (struct device *_dev, struct device_attribute *attr, char *buf) -+{ -+ struct pxa27x_udc *dev = dev_get_drvdata (_dev); -+ -+ if (!dev->driver -+ || !dev->driver->function -+ || strlen (dev->driver->function) > PAGE_SIZE) -+ return 0; -+ return scnprintf (buf, PAGE_SIZE, "%s\n", dev->driver->function); -+} -+static DEVICE_ATTR (function, S_IRUGO, show_function, NULL); -+ -+/*-------------------------------------------------------------------------*/ -+ -+/* -+ * udc_disable - disable USB device controller -+ */ -+static void udc_disable(struct pxa27x_udc *dev) -+{ -+ UDCICR0 = UDCICR1 = 0x00000000; -+ -+ udc_clear_mask_UDCCR(UDCCR_UDE); -+ -+ /* Disable clock for USB device */ -+ pxa_set_cken(CKEN11_USB, 0); -+ -+ ep0_idle (dev); -+ dev->gadget.speed = USB_SPEED_UNKNOWN; -+ LED_CONNECTED_OFF; -+ if (dev->mach->udc_command) -+ dev->mach->udc_command(PXA2XX_UDC_CMD_DISCONNECT); -+} -+ -+ -+/* -+ * udc_reinit - initialize software state -+ */ -+static void udc_reinit(struct pxa27x_udc *dev) -+{ -+ u32 i; -+ -+ dev->ep0state = EP0_IDLE; -+ -+ /* basic endpoint records init */ -+ for (i = 0; i < UDC_EP_NUM; i++) { -+ struct pxa27x_ep *ep = &dev->ep[i]; -+ -+ ep->stopped = 0; -+ ep->pio_irqs = ep->dma_irqs = 0; -+ } -+ dev->configuration = 0; -+ dev->interface = 0; -+ dev->alternate = 0; -+ /* the rest was statically initialized, and is read-only */ -+} -+ -+/* until it's enabled, this UDC should be completely invisible -+ * to any USB host. -+ */ -+static void udc_enable (struct pxa27x_udc *dev) -+{ -+ udc_clear_mask_UDCCR(UDCCR_UDE); -+ -+ // MST_MSCWR2 &= ~(MST_MSCWR2_nUSBC_SC); -+ -+ /* Enable clock for USB device */ -+ pxa_set_cken(CKEN11_USB, 1); -+ -+ UDCICR0 = UDCICR1 = 0; -+ -+ ep0_idle(dev); -+ dev->gadget.speed = USB_SPEED_FULL; -+ dev->stats.irqs = 0; -+ -+ udc_set_mask_UDCCR(UDCCR_UDE); -+ udelay (2); -+ if (UDCCR & UDCCR_EMCE) -+ { -+ printk(KERN_ERR ": There are error in configuration, udc disabled\n"); -+ } -+ -+ /* caller must be able to sleep in order to cope -+ * with startup transients. -+ */ -+ msleep(100); -+ -+ /* enable suspend/resume and reset irqs */ -+ UDCICR1 = UDCICR1_IECC | UDCICR1_IERU | UDCICR1_IESU | UDCICR1_IERS; -+ -+ /* enable ep0 irqs */ -+ UDCICR0 = UDCICR_INT(0,UDCICR_INT_MASK); -+#if 0 -+ for(i=1; i < UDC_EP_NUM; i++) { -+ if (dev->ep[i].assigned) -+ pio_irq_enable(i); -+ } -+#endif -+ if (dev->mach->udc_command) -+ dev->mach->udc_command(PXA2XX_UDC_CMD_CONNECT); -+} -+ -+ -+/* when a driver is successfully registered, it will receive -+ * control requests including set_configuration(), which enables -+ * non-control requests. then usb traffic follows until a -+ * disconnect is reported. then a host may connect again, or -+ * the driver might get unbound. -+ */ -+int usb_gadget_register_driver(struct usb_gadget_driver *driver) -+{ -+ struct pxa27x_udc *dev = the_controller; -+ int retval; -+#if 0 -+ DMSG("dev=0x%x, driver=0x%x, speed=%d," -+ "bind=0x%x, unbind=0x%x, disconnect=0x%x, setup=0x%x\n", -+ (unsigned)dev, (unsigned)driver, driver->speed, -+ (unsigned)driver->bind, (unsigned)driver->unbind, -+ (unsigned)driver->disconnect, (unsigned)driver->setup); -+#endif -+ if (!driver || driver->speed != USB_SPEED_FULL -+ || !driver->bind -+ || !driver->unbind -+ || !driver->disconnect -+ || !driver->setup) -+ return -EINVAL; -+ if (!dev) -+ return -ENODEV; -+ if (dev->driver) -+ return -EBUSY; -+ -+ /* first hook up the driver ... */ -+ dev->driver = driver; -+ dev->gadget.dev.driver = &driver->driver; -+ -+ device_add (&dev->gadget.dev); -+ retval = driver->bind(&dev->gadget); -+ if (retval) { -+ DMSG("bind to driver %s --> error %d\n", -+ driver->driver.name, retval); -+ device_del (&dev->gadget.dev); -+ -+ dev->driver = 0; -+ dev->gadget.dev.driver = 0; -+ return retval; -+ } -+ device_create_file(dev->dev, &dev_attr_function); -+ -+ /* ... then enable host detection and ep0; and we're ready -+ * for set_configuration as well as eventual disconnect. -+ * NOTE: this shouldn't power up until later. -+ */ -+ DMSG("registered gadget driver '%s'\n", driver->driver.name); -+ udc_enable(dev); -+ dump_state(dev); -+ return 0; -+} -+EXPORT_SYMBOL(usb_gadget_register_driver); -+ -+static void -+stop_activity(struct pxa27x_udc *dev, struct usb_gadget_driver *driver) -+{ -+ int i; -+ -+ DMSG("Trace path 1\n"); -+ /* don't disconnect drivers more than once */ -+ if (dev->gadget.speed == USB_SPEED_UNKNOWN) -+ driver = 0; -+ dev->gadget.speed = USB_SPEED_UNKNOWN; -+ -+ /* prevent new request submissions, kill any outstanding requests */ -+ for (i = 0; i < UDC_EP_NUM; i++) { -+ struct pxa27x_ep *ep = &dev->ep[i]; -+ -+ ep->stopped = 1; -+ nuke(ep, -ESHUTDOWN); -+ } -+ del_timer_sync(&dev->timer); -+ -+ /* report disconnect; the driver is already quiesced */ -+ if (driver) -+ driver->disconnect(&dev->gadget); -+ -+ /* re-init driver-visible data structures */ -+ udc_reinit(dev); -+} -+ -+int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) -+{ -+ struct pxa27x_udc *dev = the_controller; -+ -+ if (!dev) -+ return -ENODEV; -+ if (!driver || driver != dev->driver) -+ return -EINVAL; -+ -+ local_irq_disable(); -+ udc_disable(dev); -+ stop_activity(dev, driver); -+ local_irq_enable(); -+ -+ driver->unbind(&dev->gadget); -+ dev->driver = 0; -+ -+ device_del (&dev->gadget.dev); -+ device_remove_file(dev->dev, &dev_attr_function); -+ -+ DMSG("unregistered gadget driver '%s'\n", driver->driver.name); -+ dump_state(dev); -+ return 0; -+} -+EXPORT_SYMBOL(usb_gadget_unregister_driver); -+ -+#ifndef enable_disconnect_irq -+#define enable_disconnect_irq() do {} while (0) -+#define disable_disconnect_irq() do {} while (0) -+#endif -+ -+ -+/*-------------------------------------------------------------------------*/ -+ -+static inline void clear_ep_state (struct pxa27x_udc *dev) -+{ -+ unsigned i; -+ -+ /* hardware SET_{CONFIGURATION,INTERFACE} automagic resets endpoint -+ * fifos, and pending transactions mustn't be continued in any case. -+ */ -+ for (i = 1; i < UDC_EP_NUM; i++) -+ nuke(&dev->ep[i], -ECONNABORTED); -+} -+ -+static void udc_watchdog(unsigned long _dev) -+{ -+ struct pxa27x_udc *dev = (void *)_dev; -+ -+ local_irq_disable(); -+ if (dev->ep0state == EP0_STALL -+ && (UDCCSR0 & UDCCSR0_FST) == 0 -+ && (UDCCSR0 & UDCCSR0_SST) == 0) { -+ UDCCSR0 = UDCCSR0_FST|UDCCSR0_FTF; -+ DBG(DBG_VERBOSE, "ep0 re-stall\n"); -+ start_watchdog(dev); -+ } -+ local_irq_enable(); -+} -+ -+static void handle_ep0 (struct pxa27x_udc *dev) -+{ -+ u32 udccsr0 = UDCCSR0; -+ struct pxa27x_ep *ep = &dev->ep [0]; -+ struct pxa27x_request *req; -+ union { -+ struct usb_ctrlrequest r; -+ u8 raw [8]; -+ u32 word [2]; -+ } u; -+ -+ if (list_empty(&ep->queue)) -+ req = 0; -+ else -+ req = list_entry(ep->queue.next, struct pxa27x_request, queue); -+ -+ /* clear stall status */ -+ if (udccsr0 & UDCCSR0_SST) { -+ nuke(ep, -EPIPE); -+ UDCCSR0 = UDCCSR0_SST; -+ del_timer(&dev->timer); -+ ep0_idle(dev); -+ } -+ -+ /* previous request unfinished? non-error iff back-to-back ... */ -+ if ((udccsr0 & UDCCSR0_SA) != 0 && dev->ep0state != EP0_IDLE) { -+ nuke(ep, 0); -+ del_timer(&dev->timer); -+ ep0_idle(dev); -+ } -+ -+ switch (dev->ep0state) { -+ case EP0_NO_ACTION: -+ printk(KERN_INFO"%s: Busy\n", __FUNCTION__); -+ /*Fall through */ -+ case EP0_IDLE: -+ /* late-breaking status? */ -+ udccsr0 = UDCCSR0; -+ -+ /* start control request? */ -+ if (likely((udccsr0 & (UDCCSR0_OPC|UDCCSR0_SA|UDCCSR0_RNE)) -+ == (UDCCSR0_OPC|UDCCSR0_SA|UDCCSR0_RNE))) { -+ int i; -+ -+ nuke (ep, -EPROTO); -+ /* read SETUP packet */ -+ for (i = 0; i < 2; i++) { -+ if (unlikely(!(UDCCSR0 & UDCCSR0_RNE))) { -+bad_setup: -+ DMSG("SETUP %d!\n", i); -+ goto stall; -+ } -+ u.word [i] = UDCDR0; -+ } -+ if (unlikely((UDCCSR0 & UDCCSR0_RNE) != 0)) -+ goto bad_setup; -+ -+ le16_to_cpus (&u.r.wValue); -+ le16_to_cpus (&u.r.wIndex); -+ le16_to_cpus (&u.r.wLength); -+ -+ LED_EP0_ON; -+ -+ DBG(DBG_VERBOSE, "SETUP %02x.%02x v%04x i%04x l%04x\n", -+ u.r.bRequestType, u.r.bRequest, -+ u.r.wValue, u.r.wIndex, u.r.wLength); -+ /* cope with automagic for some standard requests. */ -+ dev->req_std = (u.r.bRequestType & USB_TYPE_MASK) -+ == USB_TYPE_STANDARD; -+ dev->req_config = 0; -+ dev->req_pending = 1; -+#if 0 -+ switch (u.r.bRequest) { -+ /* hardware was supposed to hide this */ -+ case USB_REQ_SET_CONFIGURATION: -+ case USB_REQ_SET_INTERFACE: -+ case USB_REQ_SET_ADDRESS: -+ printk(KERN_ERR "Should not come here\n"); -+ break; -+ } -+ -+#endif -+ if (u.r.bRequestType & USB_DIR_IN) -+ dev->ep0state = EP0_IN_DATA_PHASE; -+ else -+ dev->ep0state = EP0_OUT_DATA_PHASE; -+ i = dev->driver->setup(&dev->gadget, &u.r); -+ -+ if (i < 0) { -+ /* hardware automagic preventing STALL... */ -+ if (dev->req_config) { -+ /* hardware sometimes neglects to tell -+ * tell us about config change events, -+ * so later ones may fail... -+ */ -+ WARN("config change %02x fail %d?\n", -+ u.r.bRequest, i); -+ return; -+ /* TODO experiment: if has_cfr, -+ * hardware didn't ACK; maybe we -+ * could actually STALL! -+ */ -+ } -+ DBG(DBG_VERBOSE, "protocol STALL, " -+ "%02x err %d\n", UDCCSR0, i); -+stall: -+ /* the watchdog timer helps deal with cases -+ * where udc seems to clear FST wrongly, and -+ * then NAKs instead of STALLing. -+ */ -+ ep0start(dev, UDCCSR0_FST|UDCCSR0_FTF, "stall"); -+ start_watchdog(dev); -+ dev->ep0state = EP0_STALL; -+ LED_EP0_OFF; -+ -+ /* deferred i/o == no response yet */ -+ } else if (dev->req_pending) { -+ if (likely(dev->ep0state == EP0_IN_DATA_PHASE -+ || dev->req_std || u.r.wLength)) -+ ep0start(dev, 0, "defer"); -+ else -+ ep0start(dev, UDCCSR0_IPR, "defer/IPR"); -+ } -+ -+ /* expect at least one data or status stage irq */ -+ return; -+ -+ } else { -+ /* some random early IRQ: -+ * - we acked FST -+ * - IPR cleared -+ * - OPC got set, without SA (likely status stage) -+ */ -+ UDCCSR0 = udccsr0 & (UDCCSR0_SA|UDCCSR0_OPC); -+ } -+ break; -+ case EP0_IN_DATA_PHASE: /* GET_DESCRIPTOR etc */ -+ if (udccsr0 & UDCCSR0_OPC) { -+ UDCCSR0 = UDCCSR0_OPC|UDCCSR0_FTF; -+ DBG(DBG_VERBOSE, "ep0in premature status\n"); -+ if (req) -+ done(ep, req, 0); -+ ep0_idle(dev); -+ } else /* irq was IPR clearing */ { -+ if (req) { -+ /* this IN packet might finish the request */ -+ (void) write_ep0_fifo(ep, req); -+ } /* else IN token before response was written */ -+ } -+ break; -+ case EP0_OUT_DATA_PHASE: /* SET_DESCRIPTOR etc */ -+ if (udccsr0 & UDCCSR0_OPC) { -+ if (req) { -+ /* this OUT packet might finish the request */ -+ if (read_ep0_fifo(ep, req)) -+ done(ep, req, 0); -+ /* else more OUT packets expected */ -+ } /* else OUT token before read was issued */ -+ } else /* irq was IPR clearing */ { -+ DBG(DBG_VERBOSE, "ep0out premature status\n"); -+ if (req) -+ done(ep, req, 0); -+ ep0_idle(dev); -+ } -+ break; -+ case EP0_STALL: -+ UDCCSR0 = UDCCSR0_FST; -+ break; -+ } -+ UDCISR0 = UDCISR_INT(0, UDCISR_INT_MASK); -+} -+ -+ -+static void handle_ep(struct pxa27x_ep *ep) -+{ -+ struct pxa27x_request *req; -+ int completed; -+ u32 udccsr=0; -+ -+ DMSG("%s is called\n", __FUNCTION__); -+ do { -+ completed = 0; -+ if (likely (!list_empty(&ep->queue))) { -+ req = list_entry(ep->queue.next, -+ struct pxa27x_request, queue); -+ } else -+ req = 0; -+ -+// udccsr = *ep->reg_udccsr; -+ DMSG("%s: req:%p, udcisr0:0x%x udccsr %p:0x%x\n", __FUNCTION__, -+ req, UDCISR0, ep->reg_udccsr, *ep->reg_udccsr); -+ if (unlikely(ep->dir_in)) { -+ udccsr = (UDCCSR_SST | UDCCSR_TRN) & *ep->reg_udccsr; -+ if (unlikely (udccsr)) -+ *ep->reg_udccsr = udccsr; -+ -+ if (req && likely ((*ep->reg_udccsr & UDCCSR_FS) != 0)) -+ completed = write_fifo(ep, req); -+ -+ } else { -+ udccsr = (UDCCSR_SST | UDCCSR_TRN) & *ep->reg_udccsr; -+ if (unlikely(udccsr)) -+ *ep->reg_udccsr = udccsr; -+ -+ /* fifos can hold packets, ready for reading... */ -+ if (likely(req)) { -+ completed = read_fifo(ep, req); -+ } else { -+ pio_irq_disable (ep->ep_num); -+ *ep->reg_udccsr = UDCCSR_FEF; -+ DMSG("%s: no req for out data\n", -+ __FUNCTION__); -+ } -+ } -+ ep->pio_irqs++; -+ } while (completed); -+} -+ -+static void pxa27x_change_configuration (struct pxa27x_udc *dev) -+{ -+ struct usb_ctrlrequest req ; -+ -+ req.bRequestType = 0; -+ req.bRequest = USB_REQ_SET_CONFIGURATION; -+ req.wValue = dev->configuration; -+ req.wIndex = 0; -+ req.wLength = 0; -+ -+ dev->ep0state = EP0_NO_ACTION; -+ dev->driver->setup(&dev->gadget, &req); -+ -+} -+ -+static void pxa27x_change_interface (struct pxa27x_udc *dev) -+{ -+ struct usb_ctrlrequest req; -+ -+ req.bRequestType = USB_RECIP_INTERFACE; -+ req.bRequest = USB_REQ_SET_INTERFACE; -+ req.wValue = dev->alternate; -+ req.wIndex = dev->interface; -+ req.wLength = 0; -+ -+ dev->ep0state = EP0_NO_ACTION; -+ dev->driver->setup(&dev->gadget, &req); -+} -+ -+/* -+ * pxa27x_udc_irq - interrupt handler -+ * -+ * avoid delays in ep0 processing. the control handshaking isn't always -+ * under software control (pxa250c0 and the pxa255 are better), and delays -+ * could cause usb protocol errors. -+ */ -+static irqreturn_t -+pxa27x_udc_irq(int irq, void *_dev) -+{ -+ struct pxa27x_udc *dev = _dev; -+ int handled; -+ -+ dev->stats.irqs++; -+ HEX_DISPLAY(dev->stats.irqs); -+ -+// printk("\n"); -+ DBG(DBG_VERBOSE, "Interrupt, UDCISR0:0x%08x, UDCISR1:0x%08x, " -+ "UDCCR:0x%08x\n", UDCISR0, UDCISR1, UDCCR); -+ do { -+ u32 udcir = UDCISR1 & 0xF8000000; -+ -+ handled = 0; -+ -+ /* SUSpend Interrupt Request */ -+ if (unlikely(udcir & UDCISR1_IRSU)) { -+ UDCISR1 = UDCISR1_IRSU; -+ handled = 1; -+ DBG(DBG_VERBOSE, "USB suspend\n"); -+ if (dev->gadget.speed != USB_SPEED_UNKNOWN -+ && dev->driver -+ && dev->driver->suspend) -+ dev->driver->suspend(&dev->gadget); -+ ep0_idle (dev); -+ } -+ -+ /* RESume Interrupt Request */ -+ if (unlikely(udcir & UDCISR1_IRRU)) { -+ UDCISR1 = UDCISR1_IRRU; -+ handled = 1; -+ DBG(DBG_VERBOSE, "USB resume\n"); -+ -+ if (dev->gadget.speed != USB_SPEED_UNKNOWN -+ && dev->driver -+ && dev->driver->resume) -+ dev->driver->resume(&dev->gadget); -+ } -+ -+ if (unlikely(udcir & UDCISR1_IRCC)) { -+ unsigned config, interface, alternate; -+ -+ handled = 1; -+ DBG(DBG_VERBOSE, "USB SET_CONFIGURATION or " -+ "SET_INTERFACE command received\n"); -+ -+ UDCCR |= UDCCR_SMAC; -+ -+ config = (UDCCR & UDCCR_ACN) >> UDCCR_ACN_S; -+ -+ if (dev->configuration != config) { -+ dev->configuration = config; -+ pxa27x_change_configuration(dev) ; -+ } -+ -+ interface = (UDCCR & UDCCR_AIN) >> UDCCR_AIN_S; -+ alternate = (UDCCR & UDCCR_AAISN) >> UDCCR_AAISN_S; -+ -+ if ( (dev->configuration != interface) || \ -+ (dev->alternate != alternate)){ -+ dev->interface = config; -+ dev->alternate = alternate; -+ pxa27x_change_interface(dev); -+ } -+ -+ UDCISR1 = UDCISR1_IRCC; -+ DMSG("%s: con:%d,inter:%d,alt:%d\n", -+ __FUNCTION__, config,interface, alternate); -+ } -+ -+ /* ReSeT Interrupt Request - USB reset */ -+ if (unlikely(udcir & UDCISR1_IRRS)) { -+ UDCISR1 = UDCISR1_IRRS; -+ handled = 1; -+ -+ if ((UDCCR & UDCCR_UDA) == 0) { -+ DBG(DBG_VERBOSE, "USB reset start\n"); -+ -+ /* reset driver and endpoints, -+ * in case that's not yet done -+ */ -+ stop_activity (dev, dev->driver); -+ -+ } -+ INFO("USB reset\n"); -+ dev->gadget.speed = USB_SPEED_FULL; -+ memset(&dev->stats, 0, sizeof dev->stats); -+ -+ } else { -+ u32 udcisr0 = UDCISR0 ; -+ u32 udcisr1 = UDCISR1 & 0xFFFF; -+ int i; -+ -+ if (unlikely (!udcisr0 && !udcisr1)) -+ continue; -+ -+ DBG(DBG_VERY_NOISY, "irq %02x.%02x\n", udcisr1,udcisr0); -+ -+ /* control traffic */ -+ if (udcisr0 & UDCISR0_IR0) { -+ dev->ep[0].pio_irqs++; -+ handle_ep0(dev); -+ handled = 1; -+ } -+ -+ udcisr0 >>= 2; -+ /* endpoint data transfers */ -+ for (i = 1; udcisr0!=0 && i < 16; udcisr0>>=2,i++) { -+ UDCISR0 = UDCISR_INT(i, UDCISR_INT_MASK); -+ -+ if (udcisr0 & UDC_INT_FIFOERROR) -+ printk(KERN_ERR" Endpoint %d Fifo error\n", i); -+ if (udcisr0 & UDC_INT_PACKETCMP) { -+ handle_ep(&dev->ep[i]); -+ handled = 1; -+ } -+ -+ } -+ -+ for (i = 0; udcisr1!=0 && i < 8; udcisr1 >>= 2, i++) { -+ UDCISR1 = UDCISR_INT(i, UDCISR_INT_MASK); -+ -+ if (udcisr1 & UDC_INT_FIFOERROR) { -+ printk(KERN_ERR" Endpoint %d fifo error\n", (i+16)); -+ } -+ -+ if (udcisr1 & UDC_INT_PACKETCMP) { -+ handle_ep(&dev->ep[i+16]); -+ handled = 1; -+ } -+ } -+ } -+ -+ /* we could also ask for 1 msec SOF (SIR) interrupts */ -+ -+ } while (handled); -+ return IRQ_HANDLED; -+} -+ -+static inline void validate_fifo_size(struct pxa27x_ep *pxa_ep, u8 bmAttributes) -+{ -+ switch (bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) { -+ case USB_ENDPOINT_XFER_CONTROL: -+ pxa_ep->fifo_size = EP0_FIFO_SIZE; -+ break; -+ case USB_ENDPOINT_XFER_ISOC: -+ pxa_ep->fifo_size = ISO_FIFO_SIZE; -+ break; -+ case USB_ENDPOINT_XFER_BULK: -+ pxa_ep->fifo_size = BULK_FIFO_SIZE; -+ break; -+ case USB_ENDPOINT_XFER_INT: -+ pxa_ep->fifo_size = INT_FIFO_SIZE; -+ break; -+ default: -+ break; -+ } -+} -+ -+static void udc_init_ep(struct pxa27x_udc *dev) -+{ -+ int i; -+ -+ INIT_LIST_HEAD (&dev->gadget.ep_list); -+ INIT_LIST_HEAD (&dev->gadget.ep0->ep_list); -+ -+ for (i = 0; i < UDC_EP_NUM; i++) { -+ struct pxa27x_ep *ep = &dev->ep[i]; -+ -+ ep->dma = -1; -+ if (i != 0) { -+ memset(ep, 0, sizeof(*ep)); -+ } -+ INIT_LIST_HEAD (&ep->queue); -+ } -+} -+#define NAME_SIZE 18 -+ -+struct usb_ep* pxa27x_ep_config( -+ struct usb_gadget *gadget, -+ struct usb_endpoint_descriptor *desc, -+ int config, int interface, int alt -+) -+{ -+ u32 tmp ; -+ unsigned i; -+ char* name; -+ struct usb_ep * ep = NULL; -+ struct pxa27x_ep *pxa_ep = NULL; -+ struct pxa27x_udc *dev = the_controller; -+ -+ DMSG("pxa27x_config_ep is called\n"); -+ DMSG(" usb endpoint descriptor is:\n" -+ " bLength:%d\n" -+ " bDescriptorType:%x\n" -+ " bEndpointAddress:%x\n" -+ " bmAttributes:%x\n" -+ " wMaxPacketSize:%d\n", -+ desc->bLength, -+ desc->bDescriptorType,desc->bEndpointAddress, -+ desc->bmAttributes,desc->wMaxPacketSize); -+ -+ for (i = 1; i < UDC_EP_NUM; i++) { -+ if(!dev->ep[i].assigned) { -+ pxa_ep = &dev->ep[i]; -+ pxa_ep->assigned = 1; -+ pxa_ep->ep_num = i; -+ break; -+ } -+ } -+ if (unlikely(i == UDC_EP_NUM)) { -+ printk(KERN_ERR __FILE__ ": Failed to find a spare endpoint\n"); -+ return ep; -+ } -+ -+ -+ ep = &pxa_ep->ep; -+ -+ pxa_ep->dev = dev; -+ pxa_ep->desc = desc; -+ pxa_ep->pio_irqs = pxa_ep->dma_irqs = 0; -+ pxa_ep->dma = -1; -+ -+ if (!(desc->bEndpointAddress & 0xF)) -+ desc->bEndpointAddress |= i; -+ -+ if (!(desc->wMaxPacketSize)) { -+ validate_fifo_size(pxa_ep, desc->bmAttributes); -+ desc->wMaxPacketSize = pxa_ep->fifo_size; -+ } else -+ pxa_ep->fifo_size = desc->wMaxPacketSize; -+ -+ pxa_ep->dir_in = (desc->bEndpointAddress & USB_DIR_IN) ? 1 : 0; -+ pxa_ep->ep_type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; -+ pxa_ep->stopped = 1; -+ pxa_ep->dma_con = 0; -+ pxa_ep->config = config; -+ pxa_ep->interface = interface; -+ pxa_ep->aisn = alt; -+ -+ pxa_ep->reg_udccsr = &UDCCSR0 + i; -+ pxa_ep->reg_udcbcr = &UDCBCR0 + i; -+ pxa_ep->reg_udcdr = &UDCDR0 + i ; -+ pxa_ep->reg_udccr = &UDCCRA - 1 + i; -+#ifdef USE_DMA -+ pxa_ep->reg_drcmr = &DRCMR24 + i; -+#endif -+ -+#if 0 -+ DMSG("udccsr=0x%8x, udcbcr=0x%8x, udcdr=0x%8x," -+ "udccr0=0x%8x\n", -+ (unsigned)pxa_ep->reg_udccsr, -+ (unsigned)pxa_ep->reg_udcbcr, -+ (unsigned)pxa_ep->reg_udcdr, -+ (unsigned)pxa_ep->reg_udccr); -+#endif -+ /* Configure UDCCR */ -+ tmp = 0; -+ tmp |= (pxa_ep->config << UDCCONR_CN_S) & UDCCONR_CN; -+ tmp |= (pxa_ep->interface << UDCCONR_IN_S) & UDCCONR_IN; -+ tmp |= (pxa_ep->aisn << UDCCONR_AISN_S) & UDCCONR_AISN; -+ tmp |= (desc->bEndpointAddress << UDCCONR_EN_S) & UDCCONR_EN; -+ tmp |= (pxa_ep->ep_type << UDCCONR_ET_S) & UDCCONR_ET; -+ tmp |= (pxa_ep->dir_in) ? UDCCONR_ED : 0; -+ tmp |= (min(pxa_ep->fifo_size, (unsigned)desc->wMaxPacketSize) \ -+ << UDCCONR_MPS_S ) & UDCCONR_MPS; -+ tmp |= UDCCONR_DE | UDCCONR_EE; -+// tmp |= UDCCONR_EE; -+ -+ *pxa_ep->reg_udccr = tmp; -+ -+#ifdef USE_DMA -+ /* Only BULK use DMA */ -+ if ((pxa_ep->ep_type & USB_ENDPOINT_XFERTYPE_MASK)\ -+ == USB_ENDPOINT_XFER_BULK) -+ *pxa_ep->reg_udccsr = UDCCSR_DME; -+#endif -+ -+ DMSG("UDCCR: 0x%p is 0x%x\n", pxa_ep->reg_udccr,*pxa_ep->reg_udccr); -+ -+ /* Fill ep name*/ -+ name = kmalloc(NAME_SIZE, GFP_KERNEL); -+ if (!name) { -+ printk(KERN_ERR "%s: Error\n", __FUNCTION__); -+ return NULL; -+ } -+ -+ switch (pxa_ep->ep_type) { -+ case USB_ENDPOINT_XFER_BULK: -+ sprintf(name, "Bulk-%s-%d", (pxa_ep->dir_in ? "in":"out"), i); -+ break; -+ case USB_ENDPOINT_XFER_INT: -+ sprintf(name, "Interrupt-%s-%d", (pxa_ep->dir_in ? \ -+ "in":"out"), i); -+ break; -+ default: -+ sprintf(name, "endpoint-%s-%d", (pxa_ep->dir_in ? \ -+ "in":"out"), i); -+ break; -+ } -+ ep->name = name; -+ -+ ep->ops = &pxa27x_ep_ops; -+ ep->maxpacket = min((ushort)pxa_ep->fifo_size, desc->wMaxPacketSize); -+ -+ list_add_tail (&ep->ep_list, &gadget->ep_list); -+ return ep; -+} -+ -+EXPORT_SYMBOL(pxa27x_ep_config); -+ -+/*-------------------------------------------------------------------------*/ -+ -+static void nop_release (struct device *dev) -+{ -+ DMSG("%s %s\n", __FUNCTION__, dev->bus_id); -+} -+ -+/* this uses load-time allocation and initialization (instead of -+ * doing it at run-time) to save code, eliminate fault paths, and -+ * be more obviously correct. -+ */ -+static struct pxa27x_udc memory = { -+ .gadget = { -+ .ops = &pxa27x_udc_ops, -+ .ep0 = &memory.ep[0].ep, -+ .name = driver_name, -+ .dev = { -+ .bus_id = "gadget", -+ .release = nop_release, -+ }, -+ }, -+ -+ /* control endpoint */ -+ .ep[0] = { -+ .ep = { -+ .name = ep0name, -+ .ops = &pxa27x_ep_ops, -+ .maxpacket = EP0_FIFO_SIZE, -+ }, -+ .dev = &memory, -+ .reg_udccsr = &UDCCSR0, -+ .reg_udcdr = &UDCDR0, -+ } -+}; -+ -+#define CP15R0_VENDOR_MASK 0xffffe000 -+ -+#define CP15R0_XSCALE_VALUE 0x69054000 /* intel/arm/xscale */ -+ -+/* -+ * probe - binds to the platform device -+ */ -+static int __init pxa27x_udc_probe(struct platform_device *_dev) -+{ -+ struct pxa27x_udc *dev = &memory; -+ int retval; -+ u32 chiprev; -+ -+ /* insist on Intel/ARM/XScale */ -+ asm("mrc%? p15, 0, %0, c0, c0" : "=r" (chiprev)); -+ if ((chiprev & CP15R0_VENDOR_MASK) != CP15R0_XSCALE_VALUE) { -+ printk(KERN_ERR "%s: not XScale!\n", driver_name); -+ return -ENODEV; -+ } -+ /* other non-static parts of init */ -+ dev->dev = &_dev->dev; -+ dev->mach = _dev->dev.platform_data; -+ -+ init_timer(&dev->timer); -+ dev->timer.function = udc_watchdog; -+ dev->timer.data = (unsigned long) dev; -+ -+ device_initialize(&dev->gadget.dev); -+ dev->gadget.dev.parent = &_dev->dev; -+ dev->gadget.dev.dma_mask = _dev->dev.dma_mask; -+ -+ the_controller = dev; -+ platform_set_drvdata(_dev, dev); -+ -+ udc_disable(dev); -+ udc_init_ep(dev); -+ udc_reinit(dev); -+ -+ /* irq setup after old hardware state is cleaned up */ -+ retval = request_irq(IRQ_USB, pxa27x_udc_irq, -+ SA_INTERRUPT, driver_name, dev); -+ if (retval != 0) { -+ printk(KERN_ERR "%s: can't get irq %i, err %d\n", -+ driver_name, IRQ_USB, retval); -+ return -EBUSY; -+ } -+ dev->got_irq = 1; -+ -+ create_proc_files(); -+ -+ return 0; -+} -+ -+static int __exit pxa27x_udc_remove(struct platform_device *_dev) -+{ -+ struct pxa27x_udc *dev = (struct pxa27x_udc*)platform_get_drvdata(_dev); -+ -+ udc_disable(dev); -+ remove_proc_files(); -+ usb_gadget_unregister_driver(dev->driver); -+ -+ if (dev->got_irq) { -+ free_irq(IRQ_USB, dev); -+ dev->got_irq = 0; -+ } -+ if (machine_is_lubbock() && dev->got_disc) { -+ free_irq(LUBBOCK_USB_DISC_IRQ, dev); -+ dev->got_disc = 0; -+ } -+ platform_set_drvdata(_dev, 0); -+ the_controller = 0; -+ return 0; -+} -+ -+#ifdef CONFIG_PM -+static void pxa27x_udc_shutdown(struct platform_device *_dev) -+{ -+ struct pxa27x_udc *dev = (struct pxa27x_udc*)platform_get_drvdata(_dev); -+ -+ udc_disable(dev); -+} -+ -+static int pxa27x_udc_suspend(struct platform_device *_dev, pm_message_t state) -+{ -+ int i; -+ struct pxa27x_udc *dev = (struct pxa27x_udc*)platform_get_drvdata(_dev); -+ -+ DMSG("%s is called\n", __FUNCTION__); -+ dev->udccsr0 = UDCCSR0; -+ for(i=1; (iep[i].assigned) { -+ struct pxa27x_ep *ep = &dev->ep[i]; -+ -+ ep->udccsr_value = *ep->reg_udccsr; -+ ep->udccr_value = *ep->reg_udccr; -+ DMSG("EP%d, udccsr:0x%x, udccr:0x%x\n", -+ i, *ep->reg_udccsr, *ep->reg_udccr); -+ } -+ } -+ -+ udc_clear_mask_UDCCR(UDCCR_UDE); -+ pxa_set_cken(CKEN11_USB, 0); -+ // MST_MSCWR2 |= MST_MSCWR2_nUSBC_SC; -+ -+ return 0; -+} -+ -+static int pxa27x_udc_resume(struct platform_device *_dev) -+{ -+ int i; -+ struct pxa27x_udc *dev = (struct pxa27x_udc*)platform_get_drvdata(_dev); -+ -+ DMSG("%s is called\n", __FUNCTION__); -+ -+ UDCCSR0 = dev->udccsr0 & (UDCCSR0_FST | UDCCSR0_DME); -+ for (i=1; i < UDC_EP_NUM; i++) { -+ if (dev->ep[i].assigned) { -+ struct pxa27x_ep *ep = &dev->ep[i]; -+ -+ *ep->reg_udccsr = ep->udccsr_value; -+ *ep->reg_udccr = ep->udccr_value; -+ DMSG("EP%d, udccsr:0x%x, udccr:0x%x\n", -+ i, *ep->reg_udccsr, *ep->reg_udccr); -+ } -+ } -+ udc_enable(dev); -+ /* OTGPH bit is set when sleep mode is entered. -+ * it indicates that OTG pad is retaining its state. -+ * Upon exit from sleep mode and before clearing OTGPH, -+ * Software must configure the USB OTG pad, UDC, and UHC -+ * to the state they were in before entering sleep mode.*/ -+ PSSR |= PSSR_OTGPH; -+ return 0; -+} -+#endif -+ -+/*-------------------------------------------------------------------------*/ -+ -+static struct platform_driver udc_driver = { -+ .driver = { -+ .name = "pxa2xx-udc", -+ }, -+ .probe = pxa27x_udc_probe, -+ .remove = __exit_p(pxa27x_udc_remove), -+ -+#ifdef CONFIG_PM -+ // FIXME power management support -+ .shutdown = pxa27x_udc_shutdown, -+ .suspend = pxa27x_udc_suspend, -+ .resume = pxa27x_udc_resume -+#endif -+}; -+ -+static int __init udc_init(void) -+{ -+ printk(KERN_INFO "%s: version %s\n", driver_name, DRIVER_VERSION); -+ return platform_driver_register(&udc_driver); -+} -+module_init(udc_init); -+ -+static void __exit udc_exit(void) -+{ -+ platform_driver_unregister(&udc_driver); -+} -+module_exit(udc_exit); -+ -+MODULE_DESCRIPTION(DRIVER_DESC); -+MODULE_AUTHOR("Frank Becker, Robert Schwebel, David Brownell"); -+MODULE_LICENSE("GPL"); -+ ---- /dev/null -+++ b/drivers/usb/gadget/pxa27x_udc.h -@@ -0,0 +1,332 @@ -+/* -+ * linux/drivers/usb/gadget/pxa27x_udc.h -+ * Intel PXA27x on-chip full speed USB device controller -+ * -+ * Copyright (C) 2003 Robert Schwebel , Pengutronix -+ * Copyright (C) 2003 David Brownell -+ * Copyright (C) 2004 Intel Corporation -+ * -+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ */ -+ -+#ifndef __LINUX_USB_GADGET_PXA27X_H -+#define __LINUX_USB_GADGET_PXA27X_H -+ -+#include -+ -+struct pxa27x_udc; -+ -+struct pxa27x_ep { -+ struct usb_ep ep; -+ struct pxa27x_udc *dev; -+ -+ const struct usb_endpoint_descriptor *desc; -+ struct list_head queue; -+ unsigned long pio_irqs; -+ unsigned long dma_irqs; -+ -+ int dma; -+ unsigned fifo_size; -+ unsigned ep_num; -+ unsigned ep_type; -+ -+ unsigned stopped : 1; -+ unsigned dma_con : 1; -+ unsigned dir_in : 1; -+ unsigned assigned : 1; -+ -+ unsigned config; -+ unsigned interface; -+ unsigned aisn; -+ /* UDCCSR = UDC Control/Status Register for this EP -+ * UBCR = UDC Byte Count Remaining (contents of OUT fifo) -+ * UDCDR = UDC Endpoint Data Register (the fifo) -+ * UDCCR = UDC Endpoint Configuration Registers -+ * DRCM = DMA Request Channel Map -+ */ -+ volatile u32 *reg_udccsr; -+ volatile u32 *reg_udcbcr; -+ volatile u32 *reg_udcdr; -+ volatile u32 *reg_udccr; -+#ifdef USE_DMA -+ volatile u32 *reg_drcmr; -+#define drcmr(n) .reg_drcmr = & DRCMR ## n , -+#else -+#define drcmr(n) -+#endif -+ -+#ifdef CONFIG_PM -+ unsigned udccsr_value; -+ unsigned udccr_value; -+#endif -+}; -+ -+struct pxa27x_request { -+ struct usb_request req; -+ struct list_head queue; -+}; -+ -+enum ep0_state { -+ EP0_IDLE, -+ EP0_IN_DATA_PHASE, -+ EP0_OUT_DATA_PHASE, -+// EP0_END_XFER, -+ EP0_STALL, -+ EP0_NO_ACTION -+}; -+ -+#define EP0_FIFO_SIZE ((unsigned)16) -+#define BULK_FIFO_SIZE ((unsigned)64) -+#define ISO_FIFO_SIZE ((unsigned)256) -+#define INT_FIFO_SIZE ((unsigned)8) -+ -+struct udc_stats { -+ struct ep0stats { -+ unsigned long ops; -+ unsigned long bytes; -+ } read, write; -+ unsigned long irqs; -+}; -+ -+#ifdef CONFIG_USB_PXA27X_SMALL -+/* when memory's tight, SMALL config saves code+data. */ -+//#undef USE_DMA -+//#define UDC_EP_NUM 3 -+#endif -+ -+#ifndef UDC_EP_NUM -+#define UDC_EP_NUM 24 -+#endif -+ -+struct pxa27x_udc { -+ struct usb_gadget gadget; -+ struct usb_gadget_driver *driver; -+ -+ enum ep0_state ep0state; -+ struct udc_stats stats; -+ unsigned got_irq : 1, -+ got_disc : 1, -+ has_cfr : 1, -+ req_pending : 1, -+ req_std : 1, -+ req_config : 1; -+ -+#define start_watchdog(dev) mod_timer(&dev->timer, jiffies + (HZ/200)) -+ struct timer_list timer; -+ -+ struct device *dev; -+ struct pxa2xx_udc_mach_info *mach; -+ u64 dma_mask; -+ struct pxa27x_ep ep [UDC_EP_NUM]; -+ -+ unsigned configuration, -+ interface, -+ alternate; -+#ifdef CONFIG_PM -+ unsigned udccsr0; -+#endif -+}; -+ -+/*-------------------------------------------------------------------------*/ -+#if 0 -+#ifdef DEBUG -+#define HEX_DISPLAY(n) do { \ -+ if (machine_is_mainstone())\ -+ { MST_LEDDAT1 = (n); } \ -+ } while(0) -+ -+#define HEX_DISPLAY1(n) HEX_DISPLAY(n) -+ -+#define HEX_DISPLAY2(n) do { \ -+ if (machine_is_mainstone()) \ -+ { MST_LEDDAT2 = (n); } \ -+ } while(0) -+ -+#endif /* DEBUG */ -+#endif -+/*-------------------------------------------------------------------------*/ -+ -+/* LEDs are only for debug */ -+#ifndef HEX_DISPLAY -+#define HEX_DISPLAY(n) do {} while(0) -+#endif -+ -+#ifndef LED_CONNECTED_ON -+#define LED_CONNECTED_ON do {} while(0) -+#define LED_CONNECTED_OFF do {} while(0) -+#endif -+#ifndef LED_EP0_ON -+#define LED_EP0_ON do {} while (0) -+#define LED_EP0_OFF do {} while (0) -+#endif -+ -+static struct pxa27x_udc *the_controller; -+ -+#if 0 -+/*-------------------------------------------------------------------------*/ -+ -+ -+/* one GPIO should be used to detect host disconnect */ -+static inline int is_usb_connected(void) -+{ -+ if (!the_controller->mach->udc_is_connected) -+ return 1; -+ return the_controller->mach->udc_is_connected(); -+} -+ -+/* one GPIO should force the host to see this device (or not) */ -+static inline void make_usb_disappear(void) -+{ -+ if (!the_controller->mach->udc_command) -+ return; -+ the_controller->mach->udc_command(PXA27X_UDC_CMD_DISCONNECT); -+} -+ -+static inline void let_usb_appear(void) -+{ -+ if (!the_controller->mach->udc_command) -+ return; -+ the_controller->mach->udc_command(PXA2XX_UDC_CMD_CONNECT); -+} -+#endif -+ -+/*-------------------------------------------------------------------------*/ -+ -+/* -+ * Debugging support vanishes in non-debug builds. DBG_NORMAL should be -+ * mostly silent during normal use/testing, with no timing side-effects. -+ */ -+#define DBG_NORMAL 1 /* error paths, device state transitions */ -+#define DBG_VERBOSE 2 /* add some success path trace info */ -+#define DBG_NOISY 3 /* ... even more: request level */ -+#define DBG_VERY_NOISY 4 /* ... even more: packet level */ -+ -+#ifdef DEBUG -+ -+static const char *state_name[] = { -+ "EP0_IDLE", -+ "EP0_IN_DATA_PHASE", "EP0_OUT_DATA_PHASE", -+ "EP0_END_XFER", "EP0_STALL" -+}; -+ -+#define DMSG(stuff...) printk(KERN_ERR "udc: " stuff) -+ -+#ifdef VERBOSE -+# define UDC_DEBUG DBG_VERBOSE -+#else -+# define UDC_DEBUG DBG_NORMAL -+#endif -+ -+static void __attribute__ ((__unused__)) -+dump_udccr(const char *label) -+{ -+ u32 udccr = UDCCR; -+ DMSG("%s 0x%08x =%s%s%s%s%s%s%s%s%s%s, con=%d,inter=%d,altinter=%d\n", -+ label, udccr, -+ (udccr & UDCCR_OEN) ? " oen":"", -+ (udccr & UDCCR_AALTHNP) ? " aalthnp":"", -+ (udccr & UDCCR_AHNP) ? " rem" : "", -+ (udccr & UDCCR_BHNP) ? " rstir" : "", -+ (udccr & UDCCR_DWRE) ? " dwre" : "", -+ (udccr & UDCCR_SMAC) ? " smac" : "", -+ (udccr & UDCCR_EMCE) ? " emce" : "", -+ (udccr & UDCCR_UDR) ? " udr" : "", -+ (udccr & UDCCR_UDA) ? " uda" : "", -+ (udccr & UDCCR_UDE) ? " ude" : "", -+ (udccr & UDCCR_ACN) >> UDCCR_ACN_S, -+ (udccr & UDCCR_AIN) >> UDCCR_AIN_S, -+ (udccr & UDCCR_AAISN)>> UDCCR_AAISN_S ); -+} -+ -+static void __attribute__ ((__unused__)) -+dump_udccsr0(const char *label) -+{ -+ u32 udccsr0 = UDCCSR0; -+ -+ DMSG("%s %s 0x%08x =%s%s%s%s%s%s%s\n", -+ label, state_name[the_controller->ep0state], udccsr0, -+ (udccsr0 & UDCCSR0_SA) ? " sa" : "", -+ (udccsr0 & UDCCSR0_RNE) ? " rne" : "", -+ (udccsr0 & UDCCSR0_FST) ? " fst" : "", -+ (udccsr0 & UDCCSR0_SST) ? " sst" : "", -+ (udccsr0 & UDCCSR0_DME) ? " dme" : "", -+ (udccsr0 & UDCCSR0_IPR) ? " ipr" : "", -+ (udccsr0 & UDCCSR0_OPC) ? " opr" : ""); -+} -+ -+static void __attribute__ ((__unused__)) -+dump_state(struct pxa27x_udc *dev) -+{ -+ unsigned i; -+ -+ DMSG("%s, udcicr %02X.%02X, udcsir %02X.%02x, udcfnr %02X\n", -+ state_name[dev->ep0state], -+ UDCICR1, UDCICR0, UDCISR1, UDCISR0, UDCFNR); -+ dump_udccr("udccr"); -+ -+ if (!dev->driver) { -+ DMSG("no gadget driver bound\n"); -+ return; -+ } else -+ DMSG("ep0 driver '%s'\n", dev->driver->driver.name); -+ -+ -+ dump_udccsr0 ("udccsr0"); -+ DMSG("ep0 IN %lu/%lu, OUT %lu/%lu\n", -+ dev->stats.write.bytes, dev->stats.write.ops, -+ dev->stats.read.bytes, dev->stats.read.ops); -+ -+ for (i = 1; i < UDC_EP_NUM; i++) { -+ if (dev->ep [i].desc == 0) -+ continue; -+ DMSG ("udccs%d = %02x\n", i, *dev->ep->reg_udccsr); -+ } -+} -+ -+#if 0 -+static void dump_regs(u8 ep) -+{ -+ DMSG("EP:%d UDCCSR:0x%08x UDCBCR:0x%08x\n UDCCR:0x%08x\n", -+ ep,UDCCSN(ep), UDCBCN(ep), UDCCN(ep)); -+} -+static void dump_req (struct pxa27x_request *req) -+{ -+ struct usb_request *r = &req->req; -+ -+ DMSG("%s: buf:0x%08x length:%d dma:0x%08x actual:%d\n", -+ __FUNCTION__, (unsigned)r->buf, r->length, -+ r->dma, r->actual); -+} -+#endif -+ -+#else -+ -+#define DMSG(stuff...) do{}while(0) -+ -+#define dump_udccr(x) do{}while(0) -+#define dump_udccsr0(x) do{}while(0) -+#define dump_state(x) do{}while(0) -+ -+#define UDC_DEBUG ((unsigned)0) -+ -+#endif -+ -+#define DBG(lvl, stuff...) do{if ((lvl) <= UDC_DEBUG) DMSG(stuff);}while(0) -+ -+#define WARN(stuff...) printk(KERN_WARNING "udc: " stuff) -+#define INFO(stuff...) printk(KERN_INFO "udc: " stuff) -+ -+ -+#endif /* __LINUX_USB_GADGET_PXA27X_H */ diff --git a/target/linux/pxa/patches-2.6.21/037-gumstix-pxa270-usb-host.patch b/target/linux/pxa/patches-2.6.21/037-gumstix-pxa270-usb-host.patch deleted file mode 100644 index 8b43765ce..000000000 --- a/target/linux/pxa/patches-2.6.21/037-gumstix-pxa270-usb-host.patch +++ /dev/null @@ -1,356 +0,0 @@ ---- a/arch/arm/mach-pxa/gumstix.c -+++ b/arch/arm/mach-pxa/gumstix.c -@@ -22,6 +22,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -178,9 +179,34 @@ static struct platform_device *devices[] - &gum_audio_device, - }; - -+#ifdef CONFIG_ARCH_GUMSTIX_VERDEX -+static int gumstix_ohci_init(struct device *dev) -+{ -+ /* setup Port1 GPIO pin. */ -+ //pxa_gpio_mode( 88 | GPIO_ALT_FN_1_IN); /* USBHPWR1 */ -+ //pxa_gpio_mode( 89 | GPIO_ALT_FN_2_OUT); /* USBHPEN1 */ -+ -+ // Turn on port 2 in host mode -+ UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE; -+ -+ UHCHR = (UHCHR) & -+ ~(UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSEP3 | UHCHR_SSE); -+ -+ return 0; -+} -+ -+static struct pxaohci_platform_data gumstix_ohci_platform_data = { -+ .port_mode = PMM_PERPORT_MODE, -+ .init = gumstix_ohci_init, -+}; -+#endif -+ - static void __init gumstix_init(void) - { - pxa_set_mci_info(&gumstix_mci_platform_data); -+#ifdef CONFIG_ARCH_GUMSTIX_VERDEX -+ pxa_set_ohci_info(&gumstix_ohci_platform_data); -+#endif - pxa_set_udc_info(&gumstix_udc_info); - #if defined(CONFIG_FB_PXA_ALPS_CDOLLAR) | defined(CONFIG_FB_PXA_SHARP_LQ043_PSP) | defined(CONFIG_FB_PXA_SAMSUNG_LTE430WQ_F0C) - set_pxa_fb_info(&gumstix_fb_info); ---- a/drivers/usb/gadget/ether.c -+++ b/drivers/usb/gadget/ether.c -@@ -260,6 +260,8 @@ MODULE_PARM_DESC(host_addr, "Host Ethern - - #ifdef CONFIG_USB_GADGET_PXA27X - #define DEV_CONFIG_CDC -+extern struct usb_ep* pxa27x_ep_config(struct usb_gadget *gadget, -+ struct usb_endpoint_descriptor *desc,int config,int interface,int alt); - #endif - - #ifdef CONFIG_USB_GADGET_S3C2410 -@@ -482,15 +484,15 @@ eth_config = { - #ifdef CONFIG_USB_ETH_RNDIS - static struct usb_config_descriptor - rndis_config = { -- .bLength = sizeof rndis_config, -+ .bLength = sizeof rndis_config, - .bDescriptorType = USB_DT_CONFIG, - - /* compute wTotalLength on the fly */ -- .bNumInterfaces = 2, -+ .bNumInterfaces = 2, - .bConfigurationValue = DEV_RNDIS_CONFIG_VALUE, -- .iConfiguration = STRING_RNDIS, -+ .iConfiguration = STRING_RNDIS, - .bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER, -- .bMaxPower = 50, -+ .bMaxPower = 50, - }; - #endif - -@@ -532,15 +534,15 @@ control_intf = { - #ifdef CONFIG_USB_ETH_RNDIS - static const struct usb_interface_descriptor - rndis_control_intf = { -- .bLength = sizeof rndis_control_intf, -+ .bLength = sizeof rndis_control_intf, - .bDescriptorType = USB_DT_INTERFACE, - - .bInterfaceNumber = 0, -- .bNumEndpoints = 1, -+ .bNumEndpoints = 1, - .bInterfaceClass = USB_CLASS_COMM, - .bInterfaceSubClass = USB_CDC_SUBCLASS_ACM, - .bInterfaceProtocol = USB_CDC_ACM_PROTO_VENDOR, -- .iInterface = STRING_RNDIS_CONTROL, -+ .iInterface = STRING_RNDIS_CONTROL, - }; - #endif - -@@ -1342,7 +1344,7 @@ static void rndis_response_complete (str - - static void rndis_command_complete (struct usb_ep *ep, struct usb_request *req) - { -- struct eth_dev *dev = ep->driver_data; -+ struct eth_dev *dev = ep->driver_data; - int status; - - /* received RNDIS command from USB_CDC_SEND_ENCAPSULATED_COMMAND */ -@@ -1578,7 +1580,7 @@ done_set_intf: - - /* return the result */ - buf = rndis_get_next_response (dev->rndis_config, -- &value); -+ &value); - if (buf) { - memcpy (req->buf, buf, value); - req->complete = rndis_response_complete; -@@ -2064,7 +2066,7 @@ static void eth_req_free (struct usb_ep - static void - rndis_control_ack_complete (struct usb_ep *ep, struct usb_request *req) - { -- struct eth_dev *dev = ep->driver_data; -+ struct eth_dev *dev = ep->driver_data; - - if (req->status || req->actual != req->length) - DEBUG (dev, -@@ -2415,7 +2417,27 @@ eth_bind (struct usb_gadget *gadget) - - /* all we really need is bulk IN/OUT */ - usb_ep_autoconfig_reset (gadget); -+#ifdef CONFIG_USB_GADGET_PXA27X -+#ifdef CONFIG_USB_ETH_RNDIS -+ in_ep = pxa27x_ep_config (gadget, &fs_source_desc, -+ DEV_RNDIS_CONFIG_VALUE, -+ (int)rndis_data_intf.bInterfaceNumber, -+ (int)rndis_data_intf.bAlternateSetting); -+#elif defined(DEV_CONFIG_CDC) -+ in_ep = pxa27x_ep_config (gadget, &fs_source_desc, -+ DEV_CONFIG_VALUE, -+ (int)data_intf.bInterfaceNumber, -+ (int)data_intf.bAlternateSetting); -+#elif defined(DEV_CONFIG_SUBSET) -+ in_ep = pxa27x_ep_config (gadget, &fs_source_desc, -+ DEV_CONFIG_VALUE, -+ (int)subset_data_intf.bInterfaceNumber, -+ (int)subset_data_intf.bAlternateSetting); -+ -+#endif //CONFIG_USB_ETH_RNDIS -+#else - in_ep = usb_ep_autoconfig (gadget, &fs_source_desc); -+#endif //CONFIG_USB_GADGET_PXA27X - if (!in_ep) { - autoconf_fail: - dev_err (&gadget->dev, -@@ -2425,7 +2447,26 @@ autoconf_fail: - } - in_ep->driver_data = in_ep; /* claim */ - -+#ifdef CONFIG_USB_GADGET_PXA27X -+#ifdef CONFIG_USB_ETH_RNDIS -+ out_ep = pxa27x_ep_config (gadget, &fs_sink_desc, -+ DEV_RNDIS_CONFIG_VALUE, -+ (int)rndis_data_intf.bInterfaceNumber, -+ (int)rndis_data_intf.bAlternateSetting); -+#elif defined(DEV_CONFIG_CDC) -+ out_ep = pxa27x_ep_config (gadget, &fs_sink_desc, -+ DEV_CONFIG_VALUE, -+ (int)data_intf.bInterfaceNumber, -+ (int)data_intf.bAlternateSetting); -+#elif defined(DEV_CONFIG_SUBSET) -+ out_ep = pxa27x_ep_config (gadget, &fs_sink_desc, -+ DEV_CONFIG_VALUE, -+ (int)subset_data_intf.bInterfaceNumber, -+ (int)subset_data_intf.bAlternateSetting); -+#endif //CONFIG_USB_ETH_RNDIS -+#else - out_ep = usb_ep_autoconfig (gadget, &fs_sink_desc); -+#endif //CONFIG_USB_GADGET_PXA27X - if (!out_ep) - goto autoconf_fail; - out_ep->driver_data = out_ep; /* claim */ -@@ -2435,7 +2476,22 @@ autoconf_fail: - * Since some hosts expect one, try to allocate one anyway. - */ - if (cdc || rndis) { -+#ifdef CONFIG_USB_GADGET_PXA27X -+#ifdef CONFIG_USB_ETH_RNDIS -+ status_ep = pxa27x_ep_config (gadget, &fs_status_desc, -+ DEV_RNDIS_CONFIG_VALUE, -+ (int)rndis_control_intf.bInterfaceNumber, -+ (int)rndis_control_intf.bAlternateSetting); -+#elif defined(DEV_CONFIG_CDC) -+ status_ep = pxa27x_ep_config (gadget, &fs_status_desc, -+ DEV_CONFIG_VALUE, -+ (int)control_intf.bInterfaceNumber, -+ (int)control_intf.bAlternateSetting); -+ -+#endif //CONFIG_USB_ETH_RNDIS -+#else - status_ep = usb_ep_autoconfig (gadget, &fs_status_desc); -+#endif //CONFIG_USB_GADGET_PXA27X - if (status_ep) { - status_ep->driver_data = status_ep; /* claim */ - } else if (rndis) { -@@ -2444,11 +2500,13 @@ autoconf_fail: - gadget->name); - return -ENODEV; - #ifdef DEV_CONFIG_CDC -+#ifndef CONFIG_USB_GADGET_PXA27X - /* pxa25x only does CDC subset; often used with RNDIS */ - } else if (cdc) { - control_intf.bNumEndpoints = 0; - /* FIXME remove endpoint from descriptor list */ - #endif -+#endif - } - } - #endif ---- a/drivers/usb/gadget/file_storage.c -+++ b/drivers/usb/gadget/file_storage.c -@@ -280,6 +280,12 @@ MODULE_LICENSE("Dual BSD/GPL"); - #define DRIVER_PRODUCT_ID 0xa4a5 // Linux-USB File-backed Storage Gadget - - -+ -+#ifdef CONFIG_USB_GADGET_PXA27X -+extern struct usb_ep* pxa27x_ep_config(struct usb_gadget *gadget, -+ struct usb_endpoint_descriptor *desc,int config,int interface,int alt); -+#endif -+ - /* - * This driver assumes self-powered hardware and has no way for users to - * trigger remote wakeup. It uses autoconfiguration to select endpoints -@@ -3920,20 +3926,32 @@ static int __init fsg_bind(struct usb_ga - - /* Find all the endpoints we will use */ - usb_ep_autoconfig_reset(gadget); -+#ifdef CONFIG_USB_GADGET_PXA27X -+ ep = pxa27x_ep_config(gadget, &fs_bulk_in_desc, CONFIG_VALUE, 0, 0); -+#else - ep = usb_ep_autoconfig(gadget, &fs_bulk_in_desc); -+#endif - if (!ep) - goto autoconf_fail; - ep->driver_data = fsg; // claim the endpoint - fsg->bulk_in = ep; - -+#ifdef CONFIG_USB_GADGET_PXA27X -+ ep = pxa27x_ep_config(gadget, &fs_bulk_out_desc, CONFIG_VALUE, 0, 0); -+#else - ep = usb_ep_autoconfig(gadget, &fs_bulk_out_desc); -+#endif - if (!ep) - goto autoconf_fail; - ep->driver_data = fsg; // claim the endpoint - fsg->bulk_out = ep; - - if (transport_is_cbi()) { -+#ifdef CONFIG_USB_GADGET_PXA27X -+ ep = pxa27x_ep_config(gadget, &fs_intr_in_desc, CONFIG_VALUE, 0, 0); -+#else - ep = usb_ep_autoconfig(gadget, &fs_intr_in_desc); -+#endif - if (!ep) - goto autoconf_fail; - ep->driver_data = fsg; // claim the endpoint -@@ -4063,6 +4081,7 @@ autoconf_fail: - rc = -ENOTSUPP; - - out: -+ ERROR(fsg, "cleaning up on the way out\n"); - fsg->state = FSG_STATE_TERMINATED; // The thread is dead - fsg_unbind(gadget); - close_all_backing_files(fsg); ---- a/drivers/usb/gadget/serial.c -+++ b/drivers/usb/gadget/serial.c -@@ -126,6 +126,10 @@ static int debug = 1; - #define GS_LOG2_NOTIFY_INTERVAL 5 /* 1 << 5 == 32 msec */ - #define GS_NOTIFY_MAXPACKET 8 - -+#ifdef CONFIG_USB_GADGET_PXA27X -+extern struct usb_ep* pxa27x_ep_config(struct usb_gadget *gadget, -+ struct usb_endpoint_descriptor *desc,int config,int interface,int alt); -+#endif - - /* Structures */ - -@@ -1378,20 +1382,32 @@ static int __init gs_bind(struct usb_gad - - usb_ep_autoconfig_reset(gadget); - -+#ifdef CONFIG_USB_GADGET_PXA27X -+ ep = pxa27x_ep_config(gadget, &gs_fullspeed_in_desc, use_acm ? GS_ACM_CONFIG_ID : GS_BULK_CONFIG_ID, gs_bulk_interface_desc.bInterfaceNumber, gs_bulk_interface_desc.bAlternateSetting); -+#else - ep = usb_ep_autoconfig(gadget, &gs_fullspeed_in_desc); -+#endif - if (!ep) - goto autoconf_fail; - EP_IN_NAME = ep->name; - ep->driver_data = ep; /* claim the endpoint */ - -+#ifdef CONFIG_USB_GADGET_PXA27X -+ ep = pxa27x_ep_config(gadget, &gs_fullspeed_out_desc, use_acm ? GS_ACM_CONFIG_ID : GS_BULK_CONFIG_ID, gs_bulk_interface_desc.bInterfaceNumber, gs_bulk_interface_desc.bAlternateSetting); -+#else - ep = usb_ep_autoconfig(gadget, &gs_fullspeed_out_desc); -+#endif - if (!ep) - goto autoconf_fail; - EP_OUT_NAME = ep->name; - ep->driver_data = ep; /* claim the endpoint */ - - if (use_acm) { -+#ifdef CONFIG_USB_GADGET_PXA27X -+ ep = pxa27x_ep_config(gadget, &gs_fullspeed_notify_desc, GS_BULK_CONFIG_ID, gs_control_interface_desc.bInterfaceNumber, gs_control_interface_desc.bAlternateSetting); -+#else - ep = usb_ep_autoconfig(gadget, &gs_fullspeed_notify_desc); -+#endif - if (!ep) { - printk(KERN_ERR "gs_bind: cannot run ACM on %s\n", gadget->name); - goto autoconf_fail; ---- a/drivers/usb/gadget/zero.c -+++ b/drivers/usb/gadget/zero.c -@@ -212,6 +212,11 @@ module_param (loopdefault, bool, S_IRUGO - #define STRING_SOURCE_SINK 250 - #define STRING_LOOPBACK 251 - -+#ifdef CONFIG_USB_GADGET_PXA27X -+extern struct usb_ep* pxa27x_ep_config(struct usb_gadget *gadget, -+ struct usb_endpoint_descriptor *desc,int config,int interface,int alt); -+#endif -+ - /* - * This device advertises two configurations; these numbers work - * on a pxa250 as well as more flexible hardware. -@@ -1155,7 +1160,11 @@ zero_bind (struct usb_gadget *gadget) - * but there may also be important quirks to address. - */ - usb_ep_autoconfig_reset (gadget); -+#ifdef CONFIG_USB_GADGET_PXA27X -+ ep = pxa27x_ep_config(gadget, &fs_source_desc, CONFIG_SOURCE_SINK, source_sink_intf.bInterfaceNumber, source_sink_intf.bAlternateSetting); -+#else - ep = usb_ep_autoconfig (gadget, &fs_source_desc); -+#endif - if (!ep) { - autoconf_fail: - printk (KERN_ERR "%s: can't autoconfigure on %s\n", -@@ -1164,8 +1173,12 @@ autoconf_fail: - } - EP_IN_NAME = ep->name; - ep->driver_data = ep; /* claim */ -- -+ -+#ifdef CONFIG_USB_GADGET_PXA27X -+ ep = pxa27x_ep_config(gadget, &fs_sink_desc, CONFIG_SOURCE_SINK, source_sink_intf.bInterfaceNumber, source_sink_intf.bAlternateSetting); -+#else - ep = usb_ep_autoconfig (gadget, &fs_sink_desc); -+#endif - if (!ep) - goto autoconf_fail; - EP_OUT_NAME = ep->name; diff --git a/target/linux/pxa/patches-2.6.21/038-cpufreq-fixup.patch b/target/linux/pxa/patches-2.6.21/038-cpufreq-fixup.patch deleted file mode 100644 index de58cd214..000000000 --- a/target/linux/pxa/patches-2.6.21/038-cpufreq-fixup.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- a/drivers/cpufreq/cpufreq_ondemand.c -+++ b/drivers/cpufreq/cpufreq_ondemand.c -@@ -573,7 +573,7 @@ static int cpufreq_governor_dbs(struct c - return 0; - } - --static struct cpufreq_governor cpufreq_gov_dbs = { -+struct cpufreq_governor cpufreq_gov_dbs = { - .name = "ondemand", - .governor = cpufreq_governor_dbs, - .owner = THIS_MODULE, ---- a/drivers/cpufreq/cpufreq_conservative.c -+++ b/drivers/cpufreq/cpufreq_conservative.c -@@ -551,7 +551,7 @@ static int cpufreq_governor_dbs(struct c - return 0; - } - --static struct cpufreq_governor cpufreq_gov_dbs = { -+struct cpufreq_governor cpufreq_gov_dbs = { - .name = "conservative", - .governor = cpufreq_governor_dbs, - .owner = THIS_MODULE, diff --git a/target/linux/pxa/patches-2.6.21/040-pxa-regs-fixup.patch b/target/linux/pxa/patches-2.6.21/040-pxa-regs-fixup.patch deleted file mode 100644 index 9f983fb80..000000000 --- a/target/linux/pxa/patches-2.6.21/040-pxa-regs-fixup.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/include/asm-arm/arch-pxa/udc.h -+++ b/include/asm-arm/arch-pxa/udc.h -@@ -5,6 +5,7 @@ - * USB Device Controller (UDC) is wired. - * - */ -+#include - #include - - extern void pxa_set_udc_info(struct pxa2xx_udc_mach_info *info); diff --git a/target/linux/pxa/patches-2.6.21/041-gumstix-fb-logo.patch b/target/linux/pxa/patches-2.6.21/041-gumstix-fb-logo.patch deleted file mode 100644 index 4b9abe150..000000000 --- a/target/linux/pxa/patches-2.6.21/041-gumstix-fb-logo.patch +++ /dev/null @@ -1,10453 +0,0 @@ ---- a/drivers/video/logo/logo_linux_clut224.ppm -+++ b/drivers/video/logo/logo_linux_clut224.ppm -@@ -1,1604 +1,8848 @@ - P3 --# Standard 224-color Linux logo --80 80 -+480 145 - 255 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 6 6 6 6 6 6 10 10 10 10 10 10 -- 10 10 10 6 6 6 6 6 6 6 6 6 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 6 6 6 10 10 10 14 14 14 -- 22 22 22 26 26 26 30 30 30 34 34 34 -- 30 30 30 30 30 30 26 26 26 18 18 18 -- 14 14 14 10 10 10 6 6 6 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 1 0 0 1 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 6 6 6 14 14 14 26 26 26 42 42 42 -- 54 54 54 66 66 66 78 78 78 78 78 78 -- 78 78 78 74 74 74 66 66 66 54 54 54 -- 42 42 42 26 26 26 18 18 18 10 10 10 -- 6 6 6 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 1 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 10 10 10 -- 22 22 22 42 42 42 66 66 66 86 86 86 -- 66 66 66 38 38 38 38 38 38 22 22 22 -- 26 26 26 34 34 34 54 54 54 66 66 66 -- 86 86 86 70 70 70 46 46 46 26 26 26 -- 14 14 14 6 6 6 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 1 0 0 1 0 0 1 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 10 10 10 26 26 26 -- 50 50 50 82 82 82 58 58 58 6 6 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 6 6 6 54 54 54 86 86 86 66 66 66 -- 38 38 38 18 18 18 6 6 6 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 6 6 6 22 22 22 50 50 50 -- 78 78 78 34 34 34 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 6 6 6 70 70 70 -- 78 78 78 46 46 46 22 22 22 6 6 6 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 1 0 0 1 0 0 1 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 6 6 6 18 18 18 42 42 42 82 82 82 -- 26 26 26 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 14 14 14 -- 46 46 46 34 34 34 6 6 6 2 2 6 -- 42 42 42 78 78 78 42 42 42 18 18 18 -- 6 6 6 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 1 0 0 0 0 0 1 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 10 10 10 30 30 30 66 66 66 58 58 58 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 26 26 26 -- 86 86 86 101 101 101 46 46 46 10 10 10 -- 2 2 6 58 58 58 70 70 70 34 34 34 -- 10 10 10 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 1 0 0 1 0 0 1 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 14 14 14 42 42 42 86 86 86 10 10 10 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 30 30 30 -- 94 94 94 94 94 94 58 58 58 26 26 26 -- 2 2 6 6 6 6 78 78 78 54 54 54 -- 22 22 22 6 6 6 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 6 6 6 -- 22 22 22 62 62 62 62 62 62 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 26 26 26 -- 54 54 54 38 38 38 18 18 18 10 10 10 -- 2 2 6 2 2 6 34 34 34 82 82 82 -- 38 38 38 14 14 14 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 1 0 0 1 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 6 6 6 -- 30 30 30 78 78 78 30 30 30 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 10 10 10 -- 10 10 10 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 78 78 78 -- 50 50 50 18 18 18 6 6 6 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 1 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 10 10 10 -- 38 38 38 86 86 86 14 14 14 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 54 54 54 -- 66 66 66 26 26 26 6 6 6 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 1 0 0 1 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 14 14 14 -- 42 42 42 82 82 82 2 2 6 2 2 6 -- 2 2 6 6 6 6 10 10 10 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 6 6 6 -- 14 14 14 10 10 10 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 18 18 18 -- 82 82 82 34 34 34 10 10 10 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 1 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 14 14 14 -- 46 46 46 86 86 86 2 2 6 2 2 6 -- 6 6 6 6 6 6 22 22 22 34 34 34 -- 6 6 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 18 18 18 34 34 34 -- 10 10 10 50 50 50 22 22 22 2 2 6 -- 2 2 6 2 2 6 2 2 6 10 10 10 -- 86 86 86 42 42 42 14 14 14 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 1 0 0 1 0 0 1 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 14 14 14 -- 46 46 46 86 86 86 2 2 6 2 2 6 -- 38 38 38 116 116 116 94 94 94 22 22 22 -- 22 22 22 2 2 6 2 2 6 2 2 6 -- 14 14 14 86 86 86 138 138 138 162 162 162 --154 154 154 38 38 38 26 26 26 6 6 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 86 86 86 46 46 46 14 14 14 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 14 14 14 -- 46 46 46 86 86 86 2 2 6 14 14 14 --134 134 134 198 198 198 195 195 195 116 116 116 -- 10 10 10 2 2 6 2 2 6 6 6 6 --101 98 89 187 187 187 210 210 210 218 218 218 --214 214 214 134 134 134 14 14 14 6 6 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 86 86 86 50 50 50 18 18 18 6 6 6 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 1 0 0 0 -- 0 0 1 0 0 1 0 0 1 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 14 14 14 -- 46 46 46 86 86 86 2 2 6 54 54 54 --218 218 218 195 195 195 226 226 226 246 246 246 -- 58 58 58 2 2 6 2 2 6 30 30 30 --210 210 210 253 253 253 174 174 174 123 123 123 --221 221 221 234 234 234 74 74 74 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 70 70 70 58 58 58 22 22 22 6 6 6 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 14 14 14 -- 46 46 46 82 82 82 2 2 6 106 106 106 --170 170 170 26 26 26 86 86 86 226 226 226 --123 123 123 10 10 10 14 14 14 46 46 46 --231 231 231 190 190 190 6 6 6 70 70 70 -- 90 90 90 238 238 238 158 158 158 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 70 70 70 58 58 58 22 22 22 6 6 6 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 1 0 0 0 -- 0 0 1 0 0 1 0 0 1 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 14 14 14 -- 42 42 42 86 86 86 6 6 6 116 116 116 --106 106 106 6 6 6 70 70 70 149 149 149 --128 128 128 18 18 18 38 38 38 54 54 54 --221 221 221 106 106 106 2 2 6 14 14 14 -- 46 46 46 190 190 190 198 198 198 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 74 74 74 62 62 62 22 22 22 6 6 6 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 1 0 0 0 -- 0 0 1 0 0 0 0 0 1 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 14 14 14 -- 42 42 42 94 94 94 14 14 14 101 101 101 --128 128 128 2 2 6 18 18 18 116 116 116 --118 98 46 121 92 8 121 92 8 98 78 10 --162 162 162 106 106 106 2 2 6 2 2 6 -- 2 2 6 195 195 195 195 195 195 6 6 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 74 74 74 62 62 62 22 22 22 6 6 6 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 1 0 0 1 -- 0 0 1 0 0 0 0 0 1 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 10 10 10 -- 38 38 38 90 90 90 14 14 14 58 58 58 --210 210 210 26 26 26 54 38 6 154 114 10 --226 170 11 236 186 11 225 175 15 184 144 12 --215 174 15 175 146 61 37 26 9 2 2 6 -- 70 70 70 246 246 246 138 138 138 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 70 70 70 66 66 66 26 26 26 6 6 6 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 10 10 10 -- 38 38 38 86 86 86 14 14 14 10 10 10 --195 195 195 188 164 115 192 133 9 225 175 15 --239 182 13 234 190 10 232 195 16 232 200 30 --245 207 45 241 208 19 232 195 16 184 144 12 --218 194 134 211 206 186 42 42 42 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 50 50 50 74 74 74 30 30 30 6 6 6 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 10 10 10 -- 34 34 34 86 86 86 14 14 14 2 2 6 --121 87 25 192 133 9 219 162 10 239 182 13 --236 186 11 232 195 16 241 208 19 244 214 54 --246 218 60 246 218 38 246 215 20 241 208 19 --241 208 19 226 184 13 121 87 25 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 50 50 50 82 82 82 34 34 34 10 10 10 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 10 10 10 -- 34 34 34 82 82 82 30 30 30 61 42 6 --180 123 7 206 145 10 230 174 11 239 182 13 --234 190 10 238 202 15 241 208 19 246 218 74 --246 218 38 246 215 20 246 215 20 246 215 20 --226 184 13 215 174 15 184 144 12 6 6 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 26 26 26 94 94 94 42 42 42 14 14 14 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 10 10 10 -- 30 30 30 78 78 78 50 50 50 104 69 6 --192 133 9 216 158 10 236 178 12 236 186 11 --232 195 16 241 208 19 244 214 54 245 215 43 --246 215 20 246 215 20 241 208 19 198 155 10 --200 144 11 216 158 10 156 118 10 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 6 6 6 90 90 90 54 54 54 18 18 18 -- 6 6 6 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 10 10 10 -- 30 30 30 78 78 78 46 46 46 22 22 22 --137 92 6 210 162 10 239 182 13 238 190 10 --238 202 15 241 208 19 246 215 20 246 215 20 --241 208 19 203 166 17 185 133 11 210 150 10 --216 158 10 210 150 10 102 78 10 2 2 6 -- 6 6 6 54 54 54 14 14 14 2 2 6 -- 2 2 6 62 62 62 74 74 74 30 30 30 -- 10 10 10 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 10 10 10 -- 34 34 34 78 78 78 50 50 50 6 6 6 -- 94 70 30 139 102 15 190 146 13 226 184 13 --232 200 30 232 195 16 215 174 15 190 146 13 --168 122 10 192 133 9 210 150 10 213 154 11 --202 150 34 182 157 106 101 98 89 2 2 6 -- 2 2 6 78 78 78 116 116 116 58 58 58 -- 2 2 6 22 22 22 90 90 90 46 46 46 -- 18 18 18 6 6 6 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 10 10 10 -- 38 38 38 86 86 86 50 50 50 6 6 6 --128 128 128 174 154 114 156 107 11 168 122 10 --198 155 10 184 144 12 197 138 11 200 144 11 --206 145 10 206 145 10 197 138 11 188 164 115 --195 195 195 198 198 198 174 174 174 14 14 14 -- 2 2 6 22 22 22 116 116 116 116 116 116 -- 22 22 22 2 2 6 74 74 74 70 70 70 -- 30 30 30 10 10 10 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 6 6 6 18 18 18 -- 50 50 50 101 101 101 26 26 26 10 10 10 --138 138 138 190 190 190 174 154 114 156 107 11 --197 138 11 200 144 11 197 138 11 192 133 9 --180 123 7 190 142 34 190 178 144 187 187 187 --202 202 202 221 221 221 214 214 214 66 66 66 -- 2 2 6 2 2 6 50 50 50 62 62 62 -- 6 6 6 2 2 6 10 10 10 90 90 90 -- 50 50 50 18 18 18 6 6 6 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 10 10 10 34 34 34 -- 74 74 74 74 74 74 2 2 6 6 6 6 --144 144 144 198 198 198 190 190 190 178 166 146 --154 121 60 156 107 11 156 107 11 168 124 44 --174 154 114 187 187 187 190 190 190 210 210 210 --246 246 246 253 253 253 253 253 253 182 182 182 -- 6 6 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 62 62 62 -- 74 74 74 34 34 34 14 14 14 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 10 10 10 22 22 22 54 54 54 -- 94 94 94 18 18 18 2 2 6 46 46 46 --234 234 234 221 221 221 190 190 190 190 190 190 --190 190 190 187 187 187 187 187 187 190 190 190 --190 190 190 195 195 195 214 214 214 242 242 242 --253 253 253 253 253 253 253 253 253 253 253 253 -- 82 82 82 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 14 14 14 -- 86 86 86 54 54 54 22 22 22 6 6 6 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 6 6 6 18 18 18 46 46 46 90 90 90 -- 46 46 46 18 18 18 6 6 6 182 182 182 --253 253 253 246 246 246 206 206 206 190 190 190 --190 190 190 190 190 190 190 190 190 190 190 190 --206 206 206 231 231 231 250 250 250 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --202 202 202 14 14 14 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 42 42 42 86 86 86 42 42 42 18 18 18 -- 6 6 6 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 6 6 6 -- 14 14 14 38 38 38 74 74 74 66 66 66 -- 2 2 6 6 6 6 90 90 90 250 250 250 --253 253 253 253 253 253 238 238 238 198 198 198 --190 190 190 190 190 190 195 195 195 221 221 221 --246 246 246 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 82 82 82 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 78 78 78 70 70 70 34 34 34 -- 14 14 14 6 6 6 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 14 14 14 -- 34 34 34 66 66 66 78 78 78 6 6 6 -- 2 2 6 18 18 18 218 218 218 253 253 253 --253 253 253 253 253 253 253 253 253 246 246 246 --226 226 226 231 231 231 246 246 246 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 178 178 178 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 18 18 18 90 90 90 62 62 62 -- 30 30 30 10 10 10 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 10 10 10 26 26 26 -- 58 58 58 90 90 90 18 18 18 2 2 6 -- 2 2 6 110 110 110 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --250 250 250 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 231 231 231 18 18 18 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 18 18 18 94 94 94 -- 54 54 54 26 26 26 10 10 10 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 6 6 6 22 22 22 50 50 50 -- 90 90 90 26 26 26 2 2 6 2 2 6 -- 14 14 14 195 195 195 250 250 250 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --250 250 250 242 242 242 54 54 54 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 38 38 38 -- 86 86 86 50 50 50 22 22 22 6 6 6 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 6 6 6 14 14 14 38 38 38 82 82 82 -- 34 34 34 2 2 6 2 2 6 2 2 6 -- 42 42 42 195 195 195 246 246 246 253 253 253 --253 253 253 253 253 253 253 253 253 250 250 250 --242 242 242 242 242 242 250 250 250 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 250 250 250 246 246 246 238 238 238 --226 226 226 231 231 231 101 101 101 6 6 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 38 38 38 82 82 82 42 42 42 14 14 14 -- 6 6 6 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 10 10 10 26 26 26 62 62 62 66 66 66 -- 2 2 6 2 2 6 2 2 6 6 6 6 -- 70 70 70 170 170 170 206 206 206 234 234 234 --246 246 246 250 250 250 250 250 250 238 238 238 --226 226 226 231 231 231 238 238 238 250 250 250 --250 250 250 250 250 250 246 246 246 231 231 231 --214 214 214 206 206 206 202 202 202 202 202 202 --198 198 198 202 202 202 182 182 182 18 18 18 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 62 62 62 66 66 66 30 30 30 -- 10 10 10 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 14 14 14 42 42 42 82 82 82 18 18 18 -- 2 2 6 2 2 6 2 2 6 10 10 10 -- 94 94 94 182 182 182 218 218 218 242 242 242 --250 250 250 253 253 253 253 253 253 250 250 250 --234 234 234 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 246 246 246 --238 238 238 226 226 226 210 210 210 202 202 202 --195 195 195 195 195 195 210 210 210 158 158 158 -- 6 6 6 14 14 14 50 50 50 14 14 14 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 6 6 6 86 86 86 46 46 46 -- 18 18 18 6 6 6 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 6 6 6 -- 22 22 22 54 54 54 70 70 70 2 2 6 -- 2 2 6 10 10 10 2 2 6 22 22 22 --166 166 166 231 231 231 250 250 250 253 253 253 --253 253 253 253 253 253 253 253 253 250 250 250 --242 242 242 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 246 246 246 --231 231 231 206 206 206 198 198 198 226 226 226 -- 94 94 94 2 2 6 6 6 6 38 38 38 -- 30 30 30 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 62 62 62 66 66 66 -- 26 26 26 10 10 10 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 10 10 10 -- 30 30 30 74 74 74 50 50 50 2 2 6 -- 26 26 26 26 26 26 2 2 6 106 106 106 --238 238 238 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 246 246 246 218 218 218 202 202 202 --210 210 210 14 14 14 2 2 6 2 2 6 -- 30 30 30 22 22 22 2 2 6 2 2 6 -- 2 2 6 2 2 6 18 18 18 86 86 86 -- 42 42 42 14 14 14 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 14 14 14 -- 42 42 42 90 90 90 22 22 22 2 2 6 -- 42 42 42 2 2 6 18 18 18 218 218 218 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 250 250 250 221 221 221 --218 218 218 101 101 101 2 2 6 14 14 14 -- 18 18 18 38 38 38 10 10 10 2 2 6 -- 2 2 6 2 2 6 2 2 6 78 78 78 -- 58 58 58 22 22 22 6 6 6 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 6 6 6 18 18 18 -- 54 54 54 82 82 82 2 2 6 26 26 26 -- 22 22 22 2 2 6 123 123 123 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 250 250 250 --238 238 238 198 198 198 6 6 6 38 38 38 -- 58 58 58 26 26 26 38 38 38 2 2 6 -- 2 2 6 2 2 6 2 2 6 46 46 46 -- 78 78 78 30 30 30 10 10 10 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 10 10 10 30 30 30 -- 74 74 74 58 58 58 2 2 6 42 42 42 -- 2 2 6 22 22 22 231 231 231 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 250 250 250 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 246 246 246 46 46 46 38 38 38 -- 42 42 42 14 14 14 38 38 38 14 14 14 -- 2 2 6 2 2 6 2 2 6 6 6 6 -- 86 86 86 46 46 46 14 14 14 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 6 6 6 14 14 14 42 42 42 -- 90 90 90 18 18 18 18 18 18 26 26 26 -- 2 2 6 116 116 116 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 250 250 250 238 238 238 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 94 94 94 6 6 6 -- 2 2 6 2 2 6 10 10 10 34 34 34 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 74 74 74 58 58 58 22 22 22 6 6 6 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 10 10 10 26 26 26 66 66 66 -- 82 82 82 2 2 6 38 38 38 6 6 6 -- 14 14 14 210 210 210 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 246 246 246 242 242 242 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 144 144 144 2 2 6 -- 2 2 6 2 2 6 2 2 6 46 46 46 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 42 42 42 74 74 74 30 30 30 10 10 10 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 6 6 6 14 14 14 42 42 42 90 90 90 -- 26 26 26 6 6 6 42 42 42 2 2 6 -- 74 74 74 250 250 250 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 242 242 242 242 242 242 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 182 182 182 2 2 6 -- 2 2 6 2 2 6 2 2 6 46 46 46 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 10 10 10 86 86 86 38 38 38 10 10 10 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 10 10 10 26 26 26 66 66 66 82 82 82 -- 2 2 6 22 22 22 18 18 18 2 2 6 --149 149 149 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 234 234 234 242 242 242 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 206 206 206 2 2 6 -- 2 2 6 2 2 6 2 2 6 38 38 38 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 6 6 6 86 86 86 46 46 46 14 14 14 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 6 6 6 -- 18 18 18 46 46 46 86 86 86 18 18 18 -- 2 2 6 34 34 34 10 10 10 6 6 6 --210 210 210 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 234 234 234 242 242 242 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 221 221 221 6 6 6 -- 2 2 6 2 2 6 6 6 6 30 30 30 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 82 82 82 54 54 54 18 18 18 -- 6 6 6 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 10 10 10 -- 26 26 26 66 66 66 62 62 62 2 2 6 -- 2 2 6 38 38 38 10 10 10 26 26 26 --238 238 238 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 231 231 231 238 238 238 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 231 231 231 6 6 6 -- 2 2 6 2 2 6 10 10 10 30 30 30 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 66 66 66 58 58 58 22 22 22 -- 6 6 6 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 10 10 10 -- 38 38 38 78 78 78 6 6 6 2 2 6 -- 2 2 6 46 46 46 14 14 14 42 42 42 --246 246 246 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 231 231 231 242 242 242 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 234 234 234 10 10 10 -- 2 2 6 2 2 6 22 22 22 14 14 14 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 66 66 66 62 62 62 22 22 22 -- 6 6 6 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 6 6 6 18 18 18 -- 50 50 50 74 74 74 2 2 6 2 2 6 -- 14 14 14 70 70 70 34 34 34 62 62 62 --250 250 250 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 231 231 231 246 246 246 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 234 234 234 14 14 14 -- 2 2 6 2 2 6 30 30 30 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 66 66 66 62 62 62 22 22 22 -- 6 6 6 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 6 6 6 18 18 18 -- 54 54 54 62 62 62 2 2 6 2 2 6 -- 2 2 6 30 30 30 46 46 46 70 70 70 --250 250 250 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 231 231 231 246 246 246 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 226 226 226 10 10 10 -- 2 2 6 6 6 6 30 30 30 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 66 66 66 58 58 58 22 22 22 -- 6 6 6 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 6 6 6 22 22 22 -- 58 58 58 62 62 62 2 2 6 2 2 6 -- 2 2 6 2 2 6 30 30 30 78 78 78 --250 250 250 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 231 231 231 246 246 246 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 206 206 206 2 2 6 -- 22 22 22 34 34 34 18 14 6 22 22 22 -- 26 26 26 18 18 18 6 6 6 2 2 6 -- 2 2 6 82 82 82 54 54 54 18 18 18 -- 6 6 6 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 6 6 6 26 26 26 -- 62 62 62 106 106 106 74 54 14 185 133 11 --210 162 10 121 92 8 6 6 6 62 62 62 --238 238 238 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 231 231 231 246 246 246 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 158 158 158 18 18 18 -- 14 14 14 2 2 6 2 2 6 2 2 6 -- 6 6 6 18 18 18 66 66 66 38 38 38 -- 6 6 6 94 94 94 50 50 50 18 18 18 -- 6 6 6 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 6 6 6 -- 10 10 10 10 10 10 18 18 18 38 38 38 -- 78 78 78 142 134 106 216 158 10 242 186 14 --246 190 14 246 190 14 156 118 10 10 10 10 -- 90 90 90 238 238 238 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 231 231 231 250 250 250 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 246 230 190 --238 204 91 238 204 91 181 142 44 37 26 9 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 38 38 38 46 46 46 -- 26 26 26 106 106 106 54 54 54 18 18 18 -- 6 6 6 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 6 6 6 14 14 14 22 22 22 -- 30 30 30 38 38 38 50 50 50 70 70 70 --106 106 106 190 142 34 226 170 11 242 186 14 --246 190 14 246 190 14 246 190 14 154 114 10 -- 6 6 6 74 74 74 226 226 226 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 231 231 231 250 250 250 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 228 184 62 --241 196 14 241 208 19 232 195 16 38 30 10 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 6 6 6 30 30 30 26 26 26 --203 166 17 154 142 90 66 66 66 26 26 26 -- 6 6 6 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 6 6 6 18 18 18 38 38 38 58 58 58 -- 78 78 78 86 86 86 101 101 101 123 123 123 --175 146 61 210 150 10 234 174 13 246 186 14 --246 190 14 246 190 14 246 190 14 238 190 10 --102 78 10 2 2 6 46 46 46 198 198 198 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 234 234 234 242 242 242 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 224 178 62 --242 186 14 241 196 14 210 166 10 22 18 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 6 6 6 121 92 8 --238 202 15 232 195 16 82 82 82 34 34 34 -- 10 10 10 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 14 14 14 38 38 38 70 70 70 154 122 46 --190 142 34 200 144 11 197 138 11 197 138 11 --213 154 11 226 170 11 242 186 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --225 175 15 46 32 6 2 2 6 22 22 22 --158 158 158 250 250 250 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 250 250 250 242 242 242 224 178 62 --239 182 13 236 186 11 213 154 11 46 32 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 61 42 6 225 175 15 --238 190 10 236 186 11 112 100 78 42 42 42 -- 14 14 14 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 6 6 6 -- 22 22 22 54 54 54 154 122 46 213 154 11 --226 170 11 230 174 11 226 170 11 226 170 11 --236 178 12 242 186 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --241 196 14 184 144 12 10 10 10 2 2 6 -- 6 6 6 116 116 116 242 242 242 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 231 231 231 198 198 198 214 170 54 --236 178 12 236 178 12 210 150 10 137 92 6 -- 18 14 6 2 2 6 2 2 6 2 2 6 -- 6 6 6 70 47 6 200 144 11 236 178 12 --239 182 13 239 182 13 124 112 88 58 58 58 -- 22 22 22 6 6 6 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 10 10 10 -- 30 30 30 70 70 70 180 133 36 226 170 11 --239 182 13 242 186 14 242 186 14 246 186 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 232 195 16 98 70 6 2 2 6 -- 2 2 6 2 2 6 66 66 66 221 221 221 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 206 206 206 198 198 198 214 166 58 --230 174 11 230 174 11 216 158 10 192 133 9 --163 110 8 116 81 8 102 78 10 116 81 8 --167 114 7 197 138 11 226 170 11 239 182 13 --242 186 14 242 186 14 162 146 94 78 78 78 -- 34 34 34 14 14 14 6 6 6 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 6 6 6 -- 30 30 30 78 78 78 190 142 34 226 170 11 --239 182 13 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 241 196 14 203 166 17 22 18 6 -- 2 2 6 2 2 6 2 2 6 38 38 38 --218 218 218 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --250 250 250 206 206 206 198 198 198 202 162 69 --226 170 11 236 178 12 224 166 10 210 150 10 --200 144 11 197 138 11 192 133 9 197 138 11 --210 150 10 226 170 11 242 186 14 246 190 14 --246 190 14 246 186 14 225 175 15 124 112 88 -- 62 62 62 30 30 30 14 14 14 6 6 6 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 10 10 10 -- 30 30 30 78 78 78 174 135 50 224 166 10 --239 182 13 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 241 196 14 139 102 15 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 78 78 78 250 250 250 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --250 250 250 214 214 214 198 198 198 190 150 46 --219 162 10 236 178 12 234 174 13 224 166 10 --216 158 10 213 154 11 213 154 11 216 158 10 --226 170 11 239 182 13 246 190 14 246 190 14 --246 190 14 246 190 14 242 186 14 206 162 42 --101 101 101 58 58 58 30 30 30 14 14 14 -- 6 6 6 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 10 10 10 -- 30 30 30 74 74 74 174 135 50 216 158 10 --236 178 12 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 241 196 14 226 184 13 -- 61 42 6 2 2 6 2 2 6 2 2 6 -- 22 22 22 238 238 238 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 226 226 226 187 187 187 180 133 36 --216 158 10 236 178 12 239 182 13 236 178 12 --230 174 11 226 170 11 226 170 11 230 174 11 --236 178 12 242 186 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 186 14 239 182 13 --206 162 42 106 106 106 66 66 66 34 34 34 -- 14 14 14 6 6 6 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 6 6 6 -- 26 26 26 70 70 70 163 133 67 213 154 11 --236 178 12 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 241 196 14 --190 146 13 18 14 6 2 2 6 2 2 6 -- 46 46 46 246 246 246 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 221 221 221 86 86 86 156 107 11 --216 158 10 236 178 12 242 186 14 246 186 14 --242 186 14 239 182 13 239 182 13 242 186 14 --242 186 14 246 186 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --242 186 14 225 175 15 142 122 72 66 66 66 -- 30 30 30 10 10 10 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 6 6 6 -- 26 26 26 70 70 70 163 133 67 210 150 10 --236 178 12 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --232 195 16 121 92 8 34 34 34 106 106 106 --221 221 221 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --242 242 242 82 82 82 18 14 6 163 110 8 --216 158 10 236 178 12 242 186 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 242 186 14 163 133 67 -- 46 46 46 18 18 18 6 6 6 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 10 10 10 -- 30 30 30 78 78 78 163 133 67 210 150 10 --236 178 12 246 186 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --241 196 14 215 174 15 190 178 144 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 218 218 218 -- 58 58 58 2 2 6 22 18 6 167 114 7 --216 158 10 236 178 12 246 186 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 186 14 242 186 14 190 150 46 -- 54 54 54 22 22 22 6 6 6 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 14 14 14 -- 38 38 38 86 86 86 180 133 36 213 154 11 --236 178 12 246 186 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 232 195 16 190 146 13 214 214 214 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 250 250 250 170 170 170 26 26 26 -- 2 2 6 2 2 6 37 26 9 163 110 8 --219 162 10 239 182 13 246 186 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 186 14 236 178 12 224 166 10 142 122 72 -- 46 46 46 18 18 18 6 6 6 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 6 6 6 18 18 18 -- 50 50 50 109 106 95 192 133 9 224 166 10 --242 186 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --242 186 14 226 184 13 210 162 10 142 110 46 --226 226 226 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --253 253 253 253 253 253 253 253 253 253 253 253 --198 198 198 66 66 66 2 2 6 2 2 6 -- 2 2 6 2 2 6 50 34 6 156 107 11 --219 162 10 239 182 13 246 186 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 242 186 14 --234 174 13 213 154 11 154 122 46 66 66 66 -- 30 30 30 10 10 10 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 6 6 6 22 22 22 -- 58 58 58 154 121 60 206 145 10 234 174 13 --242 186 14 246 186 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 186 14 236 178 12 210 162 10 163 110 8 -- 61 42 6 138 138 138 218 218 218 250 250 250 --253 253 253 253 253 253 253 253 253 250 250 250 --242 242 242 210 210 210 144 144 144 66 66 66 -- 6 6 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 61 42 6 163 110 8 --216 158 10 236 178 12 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 239 182 13 230 174 11 216 158 10 --190 142 34 124 112 88 70 70 70 38 38 38 -- 18 18 18 6 6 6 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 6 6 6 22 22 22 -- 62 62 62 168 124 44 206 145 10 224 166 10 --236 178 12 239 182 13 242 186 14 242 186 14 --246 186 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 236 178 12 216 158 10 175 118 6 -- 80 54 7 2 2 6 6 6 6 30 30 30 -- 54 54 54 62 62 62 50 50 50 38 38 38 -- 14 14 14 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 6 6 6 80 54 7 167 114 7 --213 154 11 236 178 12 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 190 14 242 186 14 239 182 13 239 182 13 --230 174 11 210 150 10 174 135 50 124 112 88 -- 82 82 82 54 54 54 34 34 34 18 18 18 -- 6 6 6 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 6 6 6 18 18 18 -- 50 50 50 158 118 36 192 133 9 200 144 11 --216 158 10 219 162 10 224 166 10 226 170 11 --230 174 11 236 178 12 239 182 13 239 182 13 --242 186 14 246 186 14 246 190 14 246 190 14 --246 190 14 246 190 14 246 190 14 246 190 14 --246 186 14 230 174 11 210 150 10 163 110 8 --104 69 6 10 10 10 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 6 6 6 91 60 6 167 114 7 --206 145 10 230 174 11 242 186 14 246 190 14 --246 190 14 246 190 14 246 186 14 242 186 14 --239 182 13 230 174 11 224 166 10 213 154 11 --180 133 36 124 112 88 86 86 86 58 58 58 -- 38 38 38 22 22 22 10 10 10 6 6 6 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 14 14 14 -- 34 34 34 70 70 70 138 110 50 158 118 36 --167 114 7 180 123 7 192 133 9 197 138 11 --200 144 11 206 145 10 213 154 11 219 162 10 --224 166 10 230 174 11 239 182 13 242 186 14 --246 186 14 246 186 14 246 186 14 246 186 14 --239 182 13 216 158 10 185 133 11 152 99 6 --104 69 6 18 14 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 2 2 6 2 2 6 2 2 6 -- 2 2 6 6 6 6 80 54 7 152 99 6 --192 133 9 219 162 10 236 178 12 239 182 13 --246 186 14 242 186 14 239 182 13 236 178 12 --224 166 10 206 145 10 192 133 9 154 121 60 -- 94 94 94 62 62 62 42 42 42 22 22 22 -- 14 14 14 6 6 6 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 6 6 6 -- 18 18 18 34 34 34 58 58 58 78 78 78 --101 98 89 124 112 88 142 110 46 156 107 11 --163 110 8 167 114 7 175 118 6 180 123 7 --185 133 11 197 138 11 210 150 10 219 162 10 --226 170 11 236 178 12 236 178 12 234 174 13 --219 162 10 197 138 11 163 110 8 130 83 6 -- 91 60 6 10 10 10 2 2 6 2 2 6 -- 18 18 18 38 38 38 38 38 38 38 38 38 -- 38 38 38 38 38 38 38 38 38 38 38 38 -- 38 38 38 38 38 38 26 26 26 2 2 6 -- 2 2 6 6 6 6 70 47 6 137 92 6 --175 118 6 200 144 11 219 162 10 230 174 11 --234 174 13 230 174 11 219 162 10 210 150 10 --192 133 9 163 110 8 124 112 88 82 82 82 -- 50 50 50 30 30 30 14 14 14 6 6 6 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 6 6 6 14 14 14 22 22 22 34 34 34 -- 42 42 42 58 58 58 74 74 74 86 86 86 --101 98 89 122 102 70 130 98 46 121 87 25 --137 92 6 152 99 6 163 110 8 180 123 7 --185 133 11 197 138 11 206 145 10 200 144 11 --180 123 7 156 107 11 130 83 6 104 69 6 -- 50 34 6 54 54 54 110 110 110 101 98 89 -- 86 86 86 82 82 82 78 78 78 78 78 78 -- 78 78 78 78 78 78 78 78 78 78 78 78 -- 78 78 78 82 82 82 86 86 86 94 94 94 --106 106 106 101 101 101 86 66 34 124 80 6 --156 107 11 180 123 7 192 133 9 200 144 11 --206 145 10 200 144 11 192 133 9 175 118 6 --139 102 15 109 106 95 70 70 70 42 42 42 -- 22 22 22 10 10 10 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 6 6 6 10 10 10 -- 14 14 14 22 22 22 30 30 30 38 38 38 -- 50 50 50 62 62 62 74 74 74 90 90 90 --101 98 89 112 100 78 121 87 25 124 80 6 --137 92 6 152 99 6 152 99 6 152 99 6 --138 86 6 124 80 6 98 70 6 86 66 30 --101 98 89 82 82 82 58 58 58 46 46 46 -- 38 38 38 34 34 34 34 34 34 34 34 34 -- 34 34 34 34 34 34 34 34 34 34 34 34 -- 34 34 34 34 34 34 38 38 38 42 42 42 -- 54 54 54 82 82 82 94 86 76 91 60 6 --134 86 6 156 107 11 167 114 7 175 118 6 --175 118 6 167 114 7 152 99 6 121 87 25 --101 98 89 62 62 62 34 34 34 18 18 18 -- 6 6 6 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 6 6 6 6 6 6 10 10 10 -- 18 18 18 22 22 22 30 30 30 42 42 42 -- 50 50 50 66 66 66 86 86 86 101 98 89 --106 86 58 98 70 6 104 69 6 104 69 6 --104 69 6 91 60 6 82 62 34 90 90 90 -- 62 62 62 38 38 38 22 22 22 14 14 14 -- 10 10 10 10 10 10 10 10 10 10 10 10 -- 10 10 10 10 10 10 6 6 6 10 10 10 -- 10 10 10 10 10 10 10 10 10 14 14 14 -- 22 22 22 42 42 42 70 70 70 89 81 66 -- 80 54 7 104 69 6 124 80 6 137 92 6 --134 86 6 116 81 8 100 82 52 86 86 86 -- 58 58 58 30 30 30 14 14 14 6 6 6 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 6 6 6 10 10 10 14 14 14 -- 18 18 18 26 26 26 38 38 38 54 54 54 -- 70 70 70 86 86 86 94 86 76 89 81 66 -- 89 81 66 86 86 86 74 74 74 50 50 50 -- 30 30 30 14 14 14 6 6 6 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 6 6 6 18 18 18 34 34 34 58 58 58 -- 82 82 82 89 81 66 89 81 66 89 81 66 -- 94 86 66 94 86 76 74 74 74 50 50 50 -- 26 26 26 14 14 14 6 6 6 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 6 6 6 6 6 6 14 14 14 18 18 18 -- 30 30 30 38 38 38 46 46 46 54 54 54 -- 50 50 50 42 42 42 30 30 30 18 18 18 -- 10 10 10 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 6 6 6 14 14 14 26 26 26 -- 38 38 38 50 50 50 58 58 58 58 58 58 -- 54 54 54 42 42 42 30 30 30 18 18 18 -- 10 10 10 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 6 6 6 -- 6 6 6 10 10 10 14 14 14 18 18 18 -- 18 18 18 14 14 14 10 10 10 6 6 6 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 6 6 6 -- 14 14 14 18 18 18 22 22 22 22 22 22 -- 18 18 18 14 14 14 10 10 10 6 6 6 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -- 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+8 8 8 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 17 17 17 44 44 44 -+17 17 17 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 27 27 27 45 45 45 -+28 28 28 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 16 16 16 49 49 49 -+38 38 38 3 3 3 0 0 0 6 6 6 3 3 3 0 0 0 16 16 16 49 49 49 -+50 50 50 13 13 13 0 0 0 4 4 4 3 3 3 0 0 0 14 14 14 44 44 44 -+56 56 56 21 21 21 0 0 0 0 0 0 8 8 8 0 0 0 8 8 8 45 45 45 -+57 57 57 29 29 29 0 0 0 0 0 0 6 6 6 0 0 0 11 11 11 46 46 46 -+59 59 59 29 29 29 0 0 0 0 0 0 4 4 4 0 0 0 8 8 8 42 42 42 -+59 59 59 37 37 37 8 8 8 0 0 0 3 3 3 0 0 0 0 0 0 28 28 28 -+63 63 63 36 36 36 10 10 10 3 3 3 0 0 0 3 3 3 8 8 8 10 10 10 -+56 56 56 43 43 43 20 20 20 8 8 8 11 11 11 10 10 10 4 4 4 10 10 10 -+52 52 52 38 38 38 13 13 13 0 0 0 10 10 10 10 10 10 3 3 3 8 8 8 -+43 43 43 40 40 40 19 19 19 13 13 13 32 32 32 25 25 25 4 4 4 11 11 11 -+29 29 29 43 43 43 25 25 25 0 0 0 11 11 11 13 13 13 3 3 3 13 13 13 -+14 14 14 11 11 11 8 8 8 8 8 8 10 10 10 11 11 11 11 11 11 13 13 13 -+13 13 13 13 13 13 13 13 13 14 14 14 14 14 14 16 16 16 16 16 16 17 17 17 -+17 17 17 16 16 16 19 19 19 23 23 23 19 19 19 11 11 11 14 14 14 23 23 23 -+14 14 14 32 32 32 38 38 38 37 37 37 40 40 40 43 43 43 43 43 43 46 46 46 -+45 45 45 40 40 40 44 44 44 49 49 49 42 42 42 27 27 27 21 21 21 28 28 28 -+25 25 25 28 28 28 25 25 25 45 45 45 70 70 70 58 58 58 31 31 31 29 29 29 -+29 29 29 34 34 34 70 70 70 51 51 51 42 42 42 56 56 56 29 29 29 42 42 42 -+70 70 70 36 36 36 28 28 28 28 28 28 27 27 27 62 62 62 76 76 76 39 39 39 -+32 32 32 25 25 25 33 33 33 49 49 49 68 68 68 52 52 52 49 49 49 50 50 50 -+49 49 49 52 52 52 49 49 49 43 43 43 28 28 28 33 33 33 62 62 62 73 73 73 -+76 76 76 63 63 63 33 33 33 28 28 28 65 65 65 71 71 71 66 66 66 34 34 34 -+32 32 32 54 54 54 65 65 65 54 54 54 37 37 37 27 27 27 40 40 40 65 65 65 -+39 39 39 44 44 44 54 54 54 70 70 70 73 73 73 53 53 53 42 42 42 53 53 53 -+59 59 59 58 58 58 36 36 36 29 29 29 27 27 27 42 42 42 49 49 49 68 68 68 -+43 43 43 20 20 20 42 42 42 54 54 54 42 42 42 33 33 33 27 27 27 31 31 31 -+32 32 32 34 34 34 48 48 48 52 52 52 38 38 38 25 25 25 27 27 27 31 31 31 -+28 28 28 28 28 28 27 27 27 27 27 27 27 27 27 27 27 27 25 25 25 24 24 24 -+42 42 42 39 39 39 27 27 27 25 25 25 19 19 19 27 27 27 17 17 17 27 27 27 -+19 19 19 23 23 23 20 20 20 27 27 27 23 23 23 28 28 28 48 48 48 39 39 39 -+27 27 27 24 24 24 21 21 21 20 20 20 21 21 21 24 24 24 24 24 24 24 24 24 -+33 33 33 46 46 46 49 49 49 43 43 43 44 44 44 43 43 43 42 42 42 46 46 46 -+43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 -+37 37 37 42 42 42 45 45 45 45 45 45 39 39 39 33 33 33 31 31 31 29 29 29 -+31 31 31 29 29 29 27 27 27 25 25 25 25 25 25 28 28 28 29 29 29 31 31 31 -+23 23 23 21 21 21 28 28 28 25 25 25 31 31 31 42 42 42 33 33 33 24 24 24 -+23 23 23 16 16 16 31 31 31 27 27 27 14 14 14 23 23 23 28 28 28 36 36 36 -+27 27 27 29 29 29 31 31 31 32 32 32 32 32 32 31 31 31 29 29 29 28 28 28 -+29 29 29 24 24 24 27 27 27 27 27 27 27 27 27 29 29 29 27 27 27 25 25 25 -+32 32 32 29 29 29 27 27 27 27 27 27 29 29 29 31 31 31 29 29 29 27 27 27 -+29 29 29 27 27 27 27 27 27 29 29 29 32 32 32 32 32 32 28 28 28 23 23 23 -+23 23 23 21 21 21 21 21 21 25 25 25 24 24 24 21 21 21 23 23 23 28 28 28 -+21 21 21 28 28 28 40 40 40 43 43 43 29 29 29 21 21 21 29 29 29 32 32 32 -+27 27 27 29 29 29 32 32 32 27 27 27 27 27 27 32 32 32 28 28 28 24 24 24 -+36 36 36 38 38 38 36 36 36 23 23 23 28 28 28 28 28 28 28 28 28 24 24 24 -+31 31 31 25 25 25 27 27 27 25 25 25 23 23 23 25 25 25 31 31 31 40 40 40 -+42 42 42 28 28 28 24 24 24 28 28 28 27 27 27 28 28 28 29 29 29 23 23 23 -+23 23 23 16 16 16 11 11 11 11 11 11 14 14 14 25 25 25 37 37 37 40 40 40 -+17 17 17 11 11 11 23 23 23 33 33 33 31 31 31 31 31 31 32 32 32 28 28 28 -+29 29 29 25 25 25 24 24 24 33 33 33 21 21 21 14 14 14 36 36 36 36 36 36 -+4 4 4 19 19 19 17 17 17 21 21 21 20 20 20 11 11 11 16 16 16 14 14 14 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 0 0 0 0 0 0 6 6 6 4 4 4 0 0 0 3 3 3 19 19 19 -+43 43 43 32 32 32 4 4 4 0 0 0 10 10 10 0 0 0 0 0 0 17 17 17 -+39 39 39 29 29 29 11 11 11 0 0 0 6 6 6 0 0 0 0 0 0 20 20 20 -+42 42 42 39 39 39 16 16 16 0 0 0 4 4 4 0 0 0 0 0 0 17 17 17 -+45 45 45 43 43 43 19 19 19 0 0 0 6 6 6 0 0 0 0 0 0 20 20 20 -+43 43 43 46 46 46 29 29 29 0 0 0 0 0 0 4 4 4 8 8 8 6 6 6 -+49 49 49 51 51 51 33 33 33 4 4 4 0 0 0 4 4 4 8 8 8 8 8 8 -+46 46 46 54 54 54 39 39 39 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 -+40 40 40 54 54 54 39 39 39 0 0 0 0 0 0 6 6 6 10 10 10 0 0 0 -+27 27 27 56 56 56 42 42 42 6 6 6 6 6 6 0 0 0 0 0 0 19 19 19 -+29 29 29 57 57 57 43 43 43 8 8 8 6 6 6 3 3 3 0 0 0 11 11 11 -+21 21 21 40 40 40 38 38 38 13 13 13 0 0 0 6 6 6 6 6 6 3 3 3 -+16 16 16 36 36 36 39 39 39 16 16 16 4 4 4 27 27 27 32 32 32 13 13 13 -+13 13 13 36 36 36 44 44 44 24 24 24 0 0 0 8 8 8 16 16 16 8 8 8 -+6 6 6 10 10 10 11 11 11 13 13 13 14 14 14 16 16 16 14 14 14 13 13 13 -+13 13 13 13 13 13 14 14 14 14 14 14 16 16 16 16 16 16 17 17 17 17 17 17 -+20 20 20 20 20 20 19 19 19 17 17 17 19 19 19 23 23 23 21 21 21 17 17 17 -+25 25 25 34 34 34 36 36 36 37 37 37 45 45 45 46 46 46 43 43 43 43 43 43 -+49 49 49 46 46 46 43 43 43 42 42 42 38 38 38 34 34 34 36 36 36 38 38 38 -+37 37 37 36 36 36 36 36 36 46 46 46 59 59 59 56 56 56 42 42 42 33 33 33 -+40 40 40 51 51 51 45 45 45 53 53 53 56 56 56 50 50 50 51 51 51 37 37 37 -+50 50 50 52 52 52 46 46 46 43 43 43 51 51 51 58 58 58 57 57 57 52 52 52 -+45 45 45 44 44 44 48 48 48 50 50 50 61 61 61 51 51 51 51 51 51 54 54 54 -+50 50 50 54 54 54 54 54 54 57 57 57 50 50 50 45 45 45 56 56 56 58 58 58 -+49 49 49 54 54 54 54 54 54 49 49 49 59 59 59 51 51 51 53 53 53 50 50 50 -+44 44 44 54 54 54 57 57 57 52 52 52 52 52 52 52 52 52 54 54 54 60 60 60 -+50 50 50 52 52 52 51 51 51 52 52 52 57 57 57 58 58 58 53 53 53 51 51 51 -+54 54 54 54 54 54 44 44 44 52 52 52 46 46 46 48 48 48 46 46 46 50 50 50 -+53 53 53 40 40 40 49 49 49 54 54 54 48 48 48 45 45 45 45 45 45 48 48 48 -+43 43 43 42 42 42 45 45 45 46 46 46 43 43 43 46 46 46 50 50 50 48 48 48 -+44 44 44 45 45 45 45 45 45 44 44 44 40 40 40 39 39 39 40 40 40 42 42 42 -+44 44 44 48 48 48 38 38 38 43 43 43 40 40 40 45 45 45 37 37 37 43 43 43 -+37 37 37 42 42 42 38 38 38 39 39 39 40 40 40 37 37 37 39 39 39 39 39 39 -+39 39 39 39 39 39 39 39 39 39 39 39 38 38 38 37 37 37 34 34 34 32 32 32 -+36 36 36 38 38 38 34 34 34 32 32 32 34 34 34 32 32 32 29 29 29 37 37 37 -+32 32 32 33 33 33 33 33 33 32 32 32 31 31 31 31 31 31 31 31 31 32 32 32 -+34 34 34 34 34 34 34 34 34 36 36 36 36 36 36 33 33 33 29 29 29 27 27 27 -+29 29 29 33 33 33 32 32 32 25 25 25 25 25 25 32 32 32 36 36 36 33 33 33 -+37 37 37 28 28 28 25 25 25 24 24 24 31 31 31 31 31 31 21 21 21 32 32 32 -+24 24 24 37 37 37 32 32 32 25 25 25 32 32 32 31 31 31 24 24 24 27 27 27 -+25 25 25 28 28 28 31 31 31 31 31 31 31 31 31 31 31 31 28 28 28 25 25 25 -+29 29 29 25 25 25 28 28 28 33 33 33 34 34 34 33 33 33 31 31 31 33 33 33 -+32 32 32 28 28 28 28 28 28 31 31 31 32 32 32 29 29 29 28 28 28 29 29 29 -+31 31 31 29 29 29 28 28 28 31 31 31 34 34 34 34 34 34 31 31 31 27 27 27 -+29 29 29 27 27 27 27 27 27 28 28 28 28 28 28 28 28 28 29 29 29 32 32 32 -+34 34 34 38 38 38 40 40 40 36 36 36 25 25 25 25 25 25 29 29 29 23 23 23 -+29 29 29 28 28 28 28 28 28 28 28 28 29 29 29 31 31 31 33 33 33 37 37 37 -+39 39 39 31 31 31 32 32 32 32 32 32 25 25 25 31 31 31 28 28 28 29 29 29 -+19 19 19 33 33 33 28 28 28 32 32 32 32 32 32 27 27 27 39 39 39 45 45 45 -+34 34 34 28 28 28 32 32 32 34 34 34 28 28 28 27 27 27 32 32 32 33 33 33 -+25 25 25 21 21 21 8 8 8 8 8 8 25 25 25 29 29 29 21 21 21 21 21 21 -+13 13 13 10 10 10 19 19 19 29 29 29 27 27 27 25 25 25 25 25 25 21 21 21 -+24 24 24 39 39 39 25 25 25 21 21 21 37 37 37 39 39 39 32 32 32 16 16 16 -+13 13 13 11 11 11 10 10 10 20 20 20 24 24 24 19 19 19 13 13 13 6 6 6 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+4 4 4 0 0 0 0 0 0 4 4 4 6 6 6 0 0 0 0 0 0 0 0 0 -+21 21 21 38 38 38 25 25 25 0 0 0 3 3 3 8 8 8 0 0 0 0 0 0 -+21 21 21 40 40 40 32 32 32 0 0 0 0 0 0 8 8 8 0 0 0 0 0 0 -+19 19 19 49 49 49 40 40 40 4 4 4 0 0 0 8 8 8 0 0 0 0 0 0 -+16 16 16 50 50 50 45 45 45 11 11 11 0 0 0 6 6 6 0 0 0 0 0 0 -+13 13 13 48 48 48 52 52 52 23 23 23 0 0 0 4 4 4 3 3 3 0 0 0 -+16 16 16 49 49 49 57 57 57 32 32 32 4 4 4 0 0 0 0 0 0 0 0 0 -+8 8 8 45 45 45 58 58 58 34 34 34 6 6 6 0 0 0 0 0 0 0 0 0 -+0 0 0 45 45 45 57 57 57 31 31 31 3 3 3 0 0 0 4 4 4 0 0 0 -+0 0 0 34 34 34 52 52 52 38 38 38 11 11 11 3 3 3 13 13 13 20 20 20 -+11 11 11 31 31 31 49 49 49 39 39 39 8 8 8 0 0 0 10 10 10 3 3 3 -+0 0 0 28 28 28 42 42 42 32 32 32 17 17 17 6 6 6 3 3 3 6 6 6 -+3 3 3 21 21 21 40 40 40 39 39 39 16 16 16 4 4 4 17 17 17 27 27 27 -+14 14 14 14 14 14 32 32 32 44 44 44 28 28 28 6 6 6 8 8 8 20 20 20 -+4 4 4 11 11 11 14 14 14 13 13 13 13 13 13 17 17 17 17 17 17 13 13 13 -+14 14 14 14 14 14 16 16 16 16 16 16 17 17 17 17 17 17 19 19 19 19 19 19 -+21 21 21 21 21 21 19 19 19 17 17 17 20 20 20 24 24 24 25 25 25 24 24 24 -+40 40 40 37 37 37 28 28 28 32 32 32 44 44 44 48 48 48 44 44 44 46 46 46 -+45 45 45 49 49 49 49 49 49 45 45 45 45 45 45 50 50 50 51 51 51 50 50 50 -+45 45 45 48 48 48 54 54 54 54 54 54 48 48 48 51 51 51 57 57 57 54 54 54 -+56 56 56 51 51 51 53 53 53 50 50 50 51 51 51 57 57 57 53 53 53 57 57 57 -+56 56 56 51 51 51 54 54 54 54 54 54 48 48 48 51 51 51 58 58 58 54 54 54 -+60 60 60 56 56 56 51 51 51 46 46 46 59 59 59 57 57 57 53 53 53 53 53 53 -+49 49 49 53 53 53 51 51 51 58 58 58 57 57 57 48 48 48 51 51 51 53 53 53 -+54 54 54 51 51 51 56 56 56 48 48 48 53 53 53 46 46 46 51 51 51 60 60 60 -+53 53 53 57 57 57 51 51 51 48 48 48 56 56 56 58 58 58 52 52 52 48 48 48 -+54 54 54 53 53 53 54 54 54 53 53 53 49 49 49 50 50 50 53 53 53 51 51 51 -+49 49 49 51 51 51 44 44 44 57 57 57 53 53 53 51 51 51 54 54 54 51 51 51 -+54 54 54 54 54 54 50 50 50 50 50 50 51 51 51 51 51 51 51 51 51 42 42 42 -+50 50 50 50 50 50 51 51 51 46 46 46 43 43 43 48 48 48 49 49 49 39 39 39 -+43 43 43 45 45 45 48 48 48 48 48 48 45 45 45 43 43 43 44 44 44 45 45 45 -+43 43 43 50 50 50 38 38 38 42 42 42 40 40 40 45 45 45 37 37 37 42 42 42 -+42 42 42 43 43 43 39 39 39 34 34 34 44 44 44 44 44 44 33 33 33 42 42 42 -+34 34 34 36 36 36 37 37 37 37 37 37 37 37 37 36 36 36 34 34 34 34 34 34 -+37 37 37 32 32 32 27 27 27 32 32 32 39 39 39 37 37 37 33 33 33 37 37 37 -+31 31 31 32 32 32 33 33 33 33 33 33 31 31 31 29 29 29 31 31 31 32 32 32 -+33 33 33 29 29 29 25 25 25 27 27 27 31 31 31 32 32 32 31 31 31 27 27 27 -+37 37 37 27 27 27 27 27 27 37 37 37 37 37 37 24 24 24 23 23 23 32 32 32 -+17 17 17 34 34 34 37 37 37 25 25 25 32 32 32 34 34 34 24 24 24 37 37 37 -+38 38 38 27 27 27 21 21 21 20 20 20 16 16 16 37 37 37 45 45 45 13 13 13 -+23 23 23 24 24 24 24 24 24 23 23 23 21 21 21 24 24 24 32 32 32 39 39 39 -+36 36 36 34 34 34 32 32 32 33 33 33 33 33 33 28 28 28 29 29 29 34 34 34 -+27 27 27 25 25 25 29 29 29 36 36 36 36 36 36 32 32 32 31 31 31 34 34 34 -+37 37 37 36 36 36 36 36 36 38 38 38 40 40 40 42 42 42 38 38 38 36 36 36 -+40 40 40 40 40 40 39 39 39 39 39 39 39 39 39 42 42 42 42 42 42 40 40 40 -+39 39 39 42 42 42 44 44 44 37 37 37 34 34 34 43 43 43 40 40 40 27 27 27 -+24 24 24 24 24 24 17 17 17 13 13 13 16 16 16 27 27 27 39 39 39 44 44 44 -+37 37 37 19 19 19 27 27 27 44 44 44 27 27 27 45 45 45 40 40 40 44 44 44 -+38 38 38 40 40 40 8 8 8 21 21 21 42 42 42 42 42 42 53 53 53 44 44 44 -+44 44 44 44 44 44 48 48 48 42 42 42 21 21 21 3 3 3 0 0 0 0 0 0 -+11 11 11 19 19 19 8 8 8 13 13 13 37 37 37 37 37 37 21 21 21 24 24 24 -+16 16 16 10 10 10 14 14 14 20 20 20 16 16 16 14 14 14 16 16 16 17 17 17 -+0 0 0 8 8 8 0 0 0 11 11 11 36 36 36 36 36 36 21 21 21 4 4 4 -+19 19 19 3 3 3 3 3 3 13 13 13 23 23 23 27 27 27 21 21 21 17 17 17 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 3 3 3 0 0 0 0 0 0 3 3 3 4 4 4 3 3 3 0 0 0 -+0 0 0 23 23 23 39 39 39 24 24 24 0 0 0 0 0 0 10 10 10 0 0 0 -+0 0 0 16 16 16 37 37 37 28 28 28 3 3 3 0 0 0 6 6 6 0 0 0 -+0 0 0 17 17 17 39 39 39 37 37 37 11 11 11 0 0 0 4 4 4 4 4 4 -+0 0 0 19 19 19 44 44 44 43 43 43 16 16 16 0 0 0 4 4 4 4 4 4 -+0 0 0 20 20 20 45 45 45 49 49 49 28 28 28 0 0 0 0 0 0 8 8 8 -+0 0 0 19 19 19 46 46 46 53 53 53 32 32 32 0 0 0 0 0 0 14 14 14 -+0 0 0 8 8 8 36 36 36 56 56 56 43 43 43 4 4 4 0 0 0 14 14 14 -+0 0 0 8 8 8 38 38 38 58 58 58 44 44 44 6 6 6 0 0 0 10 10 10 -+3 3 3 0 0 0 32 32 32 51 51 51 36 36 36 20 20 20 19 19 19 14 14 14 -+11 11 11 0 0 0 27 27 27 53 53 53 36 36 36 16 16 16 11 11 11 0 0 0 -+8 8 8 8 8 8 24 24 24 44 44 44 42 42 42 16 16 16 0 0 0 4 4 4 -+4 4 4 0 0 0 11 11 11 42 42 42 50 50 50 19 19 19 0 0 0 31 31 31 -+28 28 28 13 13 13 10 10 10 37 37 37 52 52 52 24 24 24 0 0 0 17 17 17 -+11 11 11 16 16 16 16 16 16 10 10 10 8 8 8 14 14 14 17 17 17 14 14 14 -+16 16 16 16 16 16 17 17 17 17 17 17 19 19 19 19 19 19 20 20 20 20 20 20 -+21 21 21 20 20 20 21 21 21 23 23 23 20 20 20 20 20 20 28 28 28 39 39 39 -+39 39 39 32 32 32 24 24 24 32 32 32 46 46 46 49 49 49 45 45 45 49 49 49 -+42 42 42 49 49 49 53 53 53 51 51 51 48 48 48 46 46 46 46 46 46 45 45 45 -+57 57 57 53 53 53 52 52 52 49 49 49 43 43 43 45 45 45 52 52 52 54 54 54 -+52 52 52 48 48 48 54 54 54 46 46 46 46 46 46 56 56 56 50 50 50 53 53 53 -+51 51 51 50 50 50 57 57 57 58 58 58 48 48 48 51 51 51 54 54 54 44 44 44 -+52 52 52 54 54 54 58 58 58 53 53 53 54 54 54 50 50 50 49 49 49 60 60 60 -+58 58 58 53 53 53 42 42 42 51 51 51 61 61 61 57 57 57 58 58 58 58 58 58 -+62 62 62 53 53 53 65 65 65 57 57 57 62 62 62 57 57 57 50 50 50 53 53 53 -+53 53 53 59 59 59 59 59 59 57 57 57 56 56 56 49 49 49 45 45 45 51 51 51 -+56 56 56 53 53 53 53 53 53 49 49 49 45 45 45 54 54 54 57 57 57 44 44 44 -+52 52 52 65 65 65 52 52 52 50 50 50 44 44 44 39 39 39 46 46 46 43 43 43 -+45 45 45 57 57 57 42 42 42 36 36 36 45 45 45 51 51 51 56 56 56 45 45 45 -+36 36 36 38 38 38 42 42 42 40 40 40 37 37 37 44 44 44 52 52 52 51 51 51 -+38 38 38 37 37 37 37 37 37 36 36 36 36 36 36 34 34 34 32 32 32 31 31 31 -+43 43 43 51 51 51 31 31 31 28 28 28 25 25 25 28 28 28 21 21 21 27 27 27 -+27 27 27 24 24 24 27 27 27 21 21 21 37 37 37 46 46 46 28 28 28 24 24 24 -+21 21 21 21 21 21 21 21 21 20 20 20 19 19 19 20 20 20 21 21 21 24 24 24 -+25 25 25 21 21 21 21 21 21 33 33 33 49 49 49 54 54 54 51 51 51 46 46 46 -+51 51 51 53 53 53 57 57 57 57 57 57 54 54 54 52 52 52 51 51 51 52 52 52 -+59 59 59 56 56 56 52 52 52 51 51 51 53 53 53 56 56 56 57 57 57 57 57 57 -+48 48 48 25 25 25 14 14 14 29 29 29 42 42 42 34 34 34 17 17 17 6 6 6 -+0 0 0 28 28 28 40 40 40 37 37 37 40 40 40 31 31 31 20 20 20 45 45 45 -+50 50 50 17 17 17 13 13 13 0 0 0 3 3 3 48 48 48 56 56 56 28 28 28 -+4 4 4 0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 16 16 16 32 32 32 -+39 39 39 51 51 51 50 50 50 49 49 49 50 50 50 46 46 46 45 45 45 42 42 42 -+27 27 27 34 34 34 43 43 43 45 45 45 45 45 45 46 46 46 48 48 48 48 48 48 -+43 43 43 43 43 43 43 43 43 45 45 45 48 48 48 49 49 49 46 46 46 45 45 45 -+44 44 44 46 46 46 46 46 46 45 45 45 46 46 46 49 49 49 46 46 46 44 44 44 -+42 42 42 44 44 44 50 50 50 45 45 45 45 45 45 51 51 51 42 42 42 33 33 33 -+24 24 24 25 25 25 8 8 8 0 0 0 4 4 4 29 29 29 49 49 49 48 48 48 -+19 19 19 0 0 0 16 16 16 40 40 40 11 11 11 44 44 44 32 32 32 34 34 34 -+54 54 54 46 46 46 31 31 31 33 33 33 33 33 33 31 31 31 45 45 45 46 46 46 -+50 50 50 51 51 51 54 54 54 52 52 52 38 38 38 21 21 21 13 13 13 11 11 11 -+28 28 28 38 38 38 33 33 33 28 28 28 32 32 32 23 23 23 13 13 13 20 20 20 -+23 23 23 16 16 16 11 11 11 10 10 10 4 4 4 3 3 3 8 8 8 14 14 14 -+11 11 11 0 0 0 8 8 8 34 34 34 28 28 28 8 8 8 11 11 11 16 16 16 -+42 42 42 27 27 27 25 25 25 16 16 16 8 8 8 19 19 19 21 21 21 19 19 19 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 -+6 6 6 0 0 0 20 20 20 39 39 39 21 21 21 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 17 17 17 44 44 44 29 29 29 0 0 0 0 0 0 6 6 6 -+6 6 6 0 0 0 16 16 16 49 49 49 37 37 37 0 0 0 0 0 0 6 6 6 -+8 8 8 0 0 0 16 16 16 52 52 52 42 42 42 8 8 8 0 0 0 3 3 3 -+0 0 0 0 0 0 19 19 19 48 48 48 46 46 46 19 19 19 0 0 0 0 0 0 -+3 3 3 0 0 0 13 13 13 43 43 43 51 51 51 31 31 31 6 6 6 0 0 0 -+13 13 13 0 0 0 4 4 4 43 43 43 56 56 56 37 37 37 8 8 8 0 0 0 -+10 10 10 0 0 0 4 4 4 44 44 44 58 58 58 38 38 38 8 8 8 0 0 0 -+0 0 0 8 8 8 8 8 8 28 28 28 53 53 53 45 45 45 16 16 16 8 8 8 -+0 0 0 8 8 8 3 3 3 24 24 24 53 53 53 39 39 39 6 6 6 10 10 10 -+20 20 20 6 6 6 10 10 10 33 33 33 44 44 44 34 34 34 16 16 16 0 0 0 -+13 13 13 10 10 10 0 0 0 14 14 14 45 45 45 50 50 50 25 25 25 0 0 0 -+23 23 23 31 31 31 20 20 20 14 14 14 36 36 36 45 45 45 27 27 27 4 4 4 -+10 10 10 14 14 14 14 14 14 10 10 10 11 11 11 16 16 16 17 17 17 14 14 14 -+17 17 17 17 17 17 19 19 19 19 19 19 20 20 20 20 20 20 21 21 21 21 21 21 -+20 20 20 23 23 23 23 23 23 20 20 20 21 21 21 29 29 29 37 37 37 42 42 42 -+25 25 25 24 24 24 24 24 24 36 36 36 50 50 50 50 50 50 45 45 45 48 48 48 -+49 49 49 50 50 50 50 50 50 45 45 45 34 34 34 28 28 28 32 32 32 40 40 40 -+61 61 61 46 46 46 31 31 31 31 31 31 39 39 39 36 36 36 32 32 32 36 36 36 -+72 72 72 76 76 76 37 37 37 38 38 38 42 42 42 42 42 42 71 71 71 54 54 54 -+33 33 33 63 63 63 60 60 60 51 51 51 68 68 68 61 61 61 37 37 37 38 38 38 -+36 36 36 52 52 52 73 73 73 71 71 71 50 50 50 34 34 34 39 39 39 74 74 74 -+69 69 69 61 61 61 50 50 50 57 57 57 66 66 66 66 66 66 69 69 69 66 66 66 -+72 72 72 68 68 68 78 78 78 65 65 65 65 65 65 61 61 61 58 58 58 57 57 57 -+68 68 68 75 75 75 81 81 81 81 81 81 68 68 68 44 44 44 36 36 36 46 46 46 -+58 58 58 50 50 50 39 39 39 33 33 33 46 46 46 71 71 71 69 69 69 40 40 40 -+44 44 44 70 70 70 62 62 62 44 44 44 39 39 39 32 32 32 34 34 34 33 33 33 -+45 45 45 66 66 66 49 49 49 28 28 28 27 27 27 37 37 37 54 54 54 58 58 58 -+39 39 39 29 29 29 28 28 28 31 31 31 29 29 29 39 39 39 56 56 56 65 65 65 -+40 40 40 32 32 32 23 23 23 21 21 21 27 27 27 32 32 32 32 32 32 29 29 29 -+43 43 43 53 53 53 27 27 27 23 23 23 21 21 21 23 23 23 19 19 19 21 21 21 -+19 19 19 11 11 11 23 23 23 21 21 21 32 32 32 50 50 50 33 33 33 4 4 4 -+19 19 19 17 17 17 16 16 16 14 14 14 14 14 14 13 13 13 13 13 13 13 13 13 -+8 8 8 10 10 10 13 13 13 23 23 23 42 42 42 60 60 60 62 62 62 51 51 51 -+48 48 48 51 51 51 54 54 54 56 56 56 53 53 53 51 51 51 49 49 49 49 49 49 -+53 53 53 53 53 53 52 52 52 50 50 50 48 48 48 48 48 48 51 51 51 54 54 54 -+57 57 57 45 45 45 16 16 16 0 0 0 24 24 24 51 51 51 37 37 37 0 0 0 -+13 13 13 3 3 3 21 21 21 49 49 49 52 52 52 16 16 16 0 0 0 44 44 44 -+45 45 45 38 38 38 27 27 27 0 0 0 29 29 29 54 54 54 29 29 29 49 49 49 -+17 17 17 0 0 0 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 10 10 10 -+13 13 13 43 43 43 44 44 44 43 43 43 49 49 49 49 49 49 46 46 46 33 33 33 -+24 24 24 39 39 39 48 48 48 45 45 45 45 45 45 50 50 50 51 51 51 45 45 45 -+45 45 45 45 45 45 45 45 45 46 46 46 49 49 49 49 49 49 49 49 49 48 48 48 -+43 43 43 44 44 44 46 46 46 46 46 46 46 46 46 46 46 46 44 44 44 42 42 42 -+48 48 48 46 46 46 52 52 52 44 44 44 36 36 36 32 32 32 20 20 20 25 25 25 -+32 32 32 27 27 27 6 6 6 8 8 8 19 19 19 32 32 32 50 50 50 52 52 52 -+11 11 11 0 0 0 24 24 24 37 37 37 3 3 3 40 40 40 17 17 17 16 16 16 -+45 45 45 21 21 21 37 37 37 43 43 43 33 33 33 34 34 34 40 40 40 51 51 51 -+51 51 51 49 49 49 48 48 48 51 51 51 53 53 53 50 50 50 46 46 46 46 46 46 -+48 48 48 49 49 49 45 45 45 33 33 33 17 17 17 6 6 6 6 6 6 11 11 11 -+23 23 23 20 20 20 16 16 16 11 11 11 6 6 6 0 0 0 3 3 3 11 11 11 -+24 24 24 16 16 16 29 29 29 36 36 36 14 14 14 0 0 0 10 10 10 27 27 27 -+49 49 49 45 45 45 48 48 48 31 31 31 0 0 0 13 13 13 31 31 31 25 25 25 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 6 6 6 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 0 0 0 0 0 0 19 19 19 36 36 36 24 24 24 3 3 3 0 0 0 -+3 3 3 4 4 4 0 0 0 20 20 20 38 38 38 29 29 29 11 11 11 0 0 0 -+3 3 3 3 3 3 0 0 0 16 16 16 38 38 38 38 38 38 14 14 14 0 0 0 -+0 0 0 0 0 0 0 0 0 16 16 16 44 44 44 46 46 46 20 20 20 0 0 0 -+8 8 8 0 0 0 0 0 0 19 19 19 43 43 43 50 50 50 28 28 28 0 0 0 -+3 3 3 0 0 0 0 0 0 16 16 16 39 39 39 52 52 52 34 34 34 0 0 0 -+0 0 0 3 3 3 3 3 3 8 8 8 33 33 33 58 58 58 43 43 43 0 0 0 -+3 3 3 0 0 0 0 0 0 6 6 6 32 32 32 54 54 54 43 43 43 3 3 3 -+0 0 0 3 3 3 4 4 4 8 8 8 34 34 34 56 56 56 44 44 44 11 11 11 -+0 0 0 11 11 11 0 0 0 0 0 0 28 28 28 49 49 49 42 42 42 27 27 27 -+3 3 3 10 10 10 11 11 11 10 10 10 25 25 25 48 48 48 45 45 45 21 21 21 -+11 11 11 13 13 13 16 16 16 4 4 4 10 10 10 45 45 45 51 51 51 16 16 16 -+10 10 10 23 23 23 31 31 31 16 16 16 8 8 8 40 40 40 52 52 52 27 27 27 -+13 13 13 11 11 11 13 13 13 16 16 16 20 20 20 20 20 20 19 19 19 16 16 16 -+19 19 19 19 19 19 20 20 20 20 20 20 21 21 21 21 21 21 23 23 23 23 23 23 -+20 20 20 27 27 27 25 25 25 17 17 17 28 28 28 45 45 45 44 44 44 29 29 29 -+25 25 25 25 25 25 23 23 23 29 29 29 43 43 43 48 48 48 48 48 48 52 52 52 -+54 54 54 49 49 49 42 42 42 34 34 34 28 28 28 29 29 29 43 43 43 57 57 57 -+44 44 44 38 38 38 29 29 29 32 32 32 36 36 36 29 29 29 33 33 33 50 50 50 -+78 78 78 77 77 77 51 51 51 38 38 38 31 31 31 34 34 34 62 62 62 68 68 68 -+62 62 62 67 67 67 48 48 48 37 37 37 59 59 59 70 70 70 56 56 56 44 44 44 -+45 45 45 53 53 53 72 72 72 73 73 73 57 57 57 44 44 44 39 39 39 72 72 72 -+69 69 69 72 72 72 70 70 70 63 63 63 46 46 46 46 46 46 69 69 69 77 77 77 -+77 77 77 60 60 60 58 58 58 54 54 54 75 75 75 87 87 87 87 87 87 72 72 72 -+56 56 56 62 62 62 71 71 71 82 82 82 83 83 83 66 66 66 52 52 52 56 56 56 -+51 51 51 34 34 34 33 33 33 51 51 51 60 60 60 60 60 60 59 59 59 61 61 61 -+43 43 43 66 66 66 67 67 67 40 40 40 36 36 36 33 33 33 34 34 34 38 38 38 -+34 34 34 61 61 61 60 60 60 39 39 39 27 27 27 31 31 31 50 50 50 63 63 63 -+49 49 49 32 32 32 25 25 25 29 29 29 28 28 28 31 31 31 37 37 37 39 39 39 -+62 62 62 49 49 49 31 31 31 21 21 21 23 23 23 25 25 25 25 25 25 23 23 23 -+37 37 37 54 54 54 27 27 27 25 25 25 28 28 28 28 28 28 24 24 24 25 25 25 -+27 27 27 19 19 19 21 21 21 19 19 19 27 27 27 50 50 50 51 51 51 32 32 32 -+16 16 16 14 14 14 16 16 16 17 17 17 20 20 20 20 20 20 17 17 17 14 14 14 -+10 10 10 11 11 11 11 11 11 11 11 11 28 28 28 54 54 54 65 65 65 57 57 57 -+54 54 54 56 56 56 57 57 57 57 57 57 58 58 58 56 56 56 54 54 54 52 52 52 -+51 51 51 53 53 53 54 54 54 52 52 52 48 48 48 46 46 46 49 49 49 52 52 52 -+59 59 59 57 57 57 37 37 37 4 4 4 0 0 0 29 29 29 40 40 40 36 36 36 -+10 10 10 0 0 0 16 16 16 46 46 46 50 50 50 28 28 28 6 6 6 20 20 20 -+39 39 39 32 32 32 40 40 40 28 28 28 40 40 40 39 39 39 0 0 0 32 32 32 -+50 50 50 28 28 28 4 4 4 3 3 3 8 8 8 3 3 3 0 0 0 0 0 0 -+28 28 28 51 51 51 37 37 37 28 28 28 34 34 34 39 39 39 46 46 46 38 38 38 -+25 25 25 40 40 40 48 48 48 45 45 45 43 43 43 48 48 48 46 46 46 40 40 40 -+43 43 43 43 43 43 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 -+46 46 46 46 46 46 48 48 48 50 50 50 49 49 49 44 44 44 44 44 44 48 48 48 -+44 44 44 39 39 39 42 42 42 24 24 24 10 10 10 4 4 4 0 0 0 20 20 20 -+32 32 32 21 21 21 4 4 4 24 24 24 28 28 28 17 17 17 37 37 37 50 50 50 -+8 8 8 4 4 4 37 37 37 34 34 34 14 14 14 44 44 44 13 13 13 23 23 23 -+39 39 39 0 0 0 21 21 21 27 27 27 24 24 24 38 38 38 37 37 37 50 50 50 -+58 58 58 53 53 53 48 48 48 48 48 48 53 53 53 52 52 52 51 51 51 54 54 54 -+48 48 48 37 37 37 28 28 28 19 19 19 8 8 8 10 10 10 16 16 16 16 16 16 -+16 16 16 19 19 19 20 20 20 20 20 20 17 17 17 6 6 6 0 0 0 8 8 8 -+17 17 17 36 36 36 33 33 33 3 3 3 0 0 0 3 3 3 3 3 3 16 16 16 -+40 40 40 46 46 46 54 54 54 46 46 46 14 14 14 17 17 17 44 44 44 36 36 36 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 4 4 4 6 6 6 3 3 3 0 0 0 0 0 0 0 0 0 -+4 4 4 10 10 10 0 0 0 0 0 0 19 19 19 34 34 34 24 24 24 3 3 3 -+0 0 0 16 16 16 0 0 0 0 0 0 20 20 20 40 40 40 37 37 37 0 0 0 -+0 0 0 14 14 14 4 4 4 0 0 0 17 17 17 49 49 49 40 40 40 6 6 6 -+0 0 0 13 13 13 3 3 3 0 0 0 20 20 20 53 53 53 45 45 45 14 14 14 -+6 6 6 0 0 0 0 0 0 0 0 0 23 23 23 49 49 49 48 48 48 23 23 23 -+3 3 3 8 8 8 8 8 8 3 3 3 14 14 14 40 40 40 48 48 48 33 33 33 -+0 0 0 4 4 4 6 6 6 0 0 0 4 4 4 42 42 42 54 54 54 39 39 39 -+6 6 6 8 8 8 4 4 4 0 0 0 3 3 3 34 34 34 49 49 49 40 40 40 -+11 11 11 0 0 0 6 6 6 16 16 16 10 10 10 38 38 38 54 54 54 34 34 34 -+13 13 13 0 0 0 6 6 6 6 6 6 0 0 0 33 33 33 57 57 57 42 42 42 -+8 8 8 10 10 10 10 10 10 0 0 0 6 6 6 32 32 32 48 48 48 44 44 44 -+19 19 19 6 6 6 14 14 14 14 14 14 0 0 0 20 20 20 49 49 49 53 53 53 -+25 25 25 13 13 13 24 24 24 29 29 29 13 13 13 20 20 20 43 43 43 48 48 48 -+31 31 31 20 20 20 13 13 13 17 17 17 21 21 21 19 19 19 19 19 19 20 20 20 -+20 20 20 20 20 20 21 21 21 21 21 21 23 23 23 23 23 23 24 24 24 24 24 24 -+24 24 24 24 24 24 25 25 25 31 31 31 42 42 42 48 48 48 38 38 38 23 23 23 -+31 31 31 31 31 31 23 23 23 24 24 24 39 39 39 49 49 49 48 48 48 48 48 48 -+46 46 46 43 43 43 36 36 36 32 32 32 36 36 36 46 46 46 56 56 56 59 59 59 -+32 32 32 33 33 33 40 40 40 42 42 42 34 34 34 36 36 36 52 52 52 68 68 68 -+43 43 43 43 43 43 68 68 68 58 58 58 40 40 40 37 37 37 33 33 33 63 63 63 -+84 84 84 63 63 63 44 44 44 33 33 33 37 37 37 61 61 61 72 72 72 61 61 61 -+66 66 66 52 52 52 52 52 52 57 57 57 61 61 61 69 69 69 48 48 48 60 60 60 -+71 71 71 74 74 74 74 74 74 63 63 63 36 36 36 39 39 39 68 68 68 70 70 70 -+85 85 85 68 68 68 63 63 63 69 69 69 84 84 84 78 78 78 75 75 75 54 54 54 -+58 58 58 56 56 56 51 51 51 61 61 61 78 78 78 78 78 78 62 62 62 49 49 49 -+40 40 40 36 36 36 50 50 50 69 69 69 61 61 61 34 34 34 43 43 43 78 78 78 -+67 67 67 60 60 60 71 71 71 46 46 46 33 33 33 34 34 34 39 39 39 42 42 42 -+29 29 29 50 50 50 66 66 66 59 59 59 51 51 51 52 52 52 57 57 57 66 66 66 -+69 69 69 63 63 63 63 63 63 66 66 66 62 62 62 61 61 61 60 60 60 54 54 54 -+77 77 77 69 69 69 57 57 57 46 46 46 39 39 39 33 33 33 28 28 28 23 23 23 -+42 42 42 60 60 60 28 28 28 25 25 25 27 27 27 27 27 27 24 24 24 25 25 25 -+29 29 29 28 28 28 19 19 19 17 17 17 21 21 21 34 34 34 51 51 51 53 53 53 -+31 31 31 24 24 24 17 17 17 16 16 16 19 19 19 21 21 21 19 19 19 16 16 16 -+19 19 19 16 16 16 14 14 14 11 11 11 20 20 20 44 44 44 60 60 60 58 58 58 -+57 57 57 53 53 53 50 50 50 50 50 50 51 51 51 53 53 53 53 53 53 52 52 52 -+50 50 50 52 52 52 53 53 53 54 54 54 53 53 53 51 51 51 49 49 49 49 49 49 -+54 54 54 54 54 54 52 52 52 39 39 39 13 13 13 0 0 0 20 20 20 52 52 52 -+20 20 20 13 13 13 33 33 33 33 33 33 25 25 25 42 42 42 37 37 37 8 8 8 -+43 43 43 11 11 11 25 25 25 51 51 51 45 45 45 21 21 21 0 0 0 0 0 0 -+39 39 39 36 36 36 23 23 23 0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 -+44 44 44 51 51 51 16 16 16 0 0 0 3 3 3 6 6 6 25 25 25 29 29 29 -+33 33 33 38 38 38 45 45 45 50 50 50 50 50 50 49 49 49 48 48 48 49 49 49 -+44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 45 45 45 45 45 45 -+50 50 50 44 44 44 44 44 44 48 48 48 44 44 44 36 36 36 40 40 40 52 52 52 -+32 32 32 31 31 31 34 34 34 8 8 8 0 0 0 0 0 0 0 0 0 23 23 23 -+25 25 25 27 27 27 14 14 14 24 24 24 14 14 14 0 0 0 29 29 29 45 45 45 -+0 0 0 0 0 0 34 34 34 21 21 21 21 21 21 38 38 38 3 3 3 32 32 32 -+36 36 36 28 28 28 28 28 28 8 8 8 0 0 0 0 0 0 10 10 10 33 33 33 -+43 43 43 51 51 51 53 53 53 53 53 53 52 52 52 45 45 45 45 45 45 56 56 56 -+48 48 48 36 36 36 16 16 16 3 3 3 8 8 8 13 13 13 11 11 11 13 13 13 -+10 10 10 16 16 16 19 19 19 20 20 20 21 21 21 11 11 11 8 8 8 17 17 17 -+32 32 32 37 37 37 29 29 29 3 3 3 0 0 0 4 4 4 0 0 0 6 6 6 -+50 50 50 49 49 49 49 49 49 56 56 56 25 25 25 14 14 14 46 46 46 31 31 31 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+11 11 11 4 4 4 0 0 0 4 4 4 8 8 8 8 8 8 8 8 8 13 13 13 -+3 3 3 0 0 0 8 8 8 6 6 6 0 0 0 23 23 23 42 42 42 29 29 29 -+8 8 8 3 3 3 3 3 3 10 10 10 0 0 0 20 20 20 44 44 44 27 27 27 -+13 13 13 0 0 0 8 8 8 13 13 13 0 0 0 21 21 21 44 44 44 42 42 42 -+16 16 16 3 3 3 13 13 13 13 13 13 0 0 0 19 19 19 46 46 46 48 48 48 -+8 8 8 10 10 10 14 14 14 8 8 8 0 0 0 20 20 20 46 46 46 57 57 57 -+24 24 24 14 14 14 11 11 11 6 6 6 0 0 0 16 16 16 43 43 43 57 57 57 -+29 29 29 3 3 3 0 0 0 3 3 3 0 0 0 6 6 6 37 37 37 59 59 59 -+36 36 36 3 3 3 0 0 0 10 10 10 3 3 3 0 0 0 29 29 29 58 58 58 -+37 37 37 13 13 13 0 0 0 19 19 19 21 21 21 4 4 4 21 21 21 58 58 58 -+36 36 36 10 10 10 4 4 4 19 19 19 13 13 13 3 3 3 27 27 27 53 53 53 -+39 39 39 11 11 11 4 4 4 16 16 16 3 3 3 0 0 0 23 23 23 52 52 52 -+56 56 56 29 29 29 10 10 10 16 16 16 16 16 16 3 3 3 14 14 14 43 43 43 -+49 49 49 31 31 31 20 20 20 28 28 28 25 25 25 6 6 6 14 14 14 42 42 42 -+50 50 50 31 31 31 14 14 14 14 14 14 17 17 17 14 14 14 16 16 16 24 24 24 -+20 20 20 21 21 21 21 21 21 23 23 23 23 23 23 24 24 24 24 24 24 24 24 24 -+28 28 28 17 17 17 25 25 25 48 48 48 53 53 53 37 37 37 24 24 24 27 27 27 -+27 27 27 31 31 31 29 29 29 34 34 34 51 51 51 54 54 54 42 42 42 29 29 29 -+32 32 32 36 36 36 33 33 33 32 32 32 42 42 42 53 53 53 49 49 49 34 34 34 -+44 44 44 33 33 33 38 38 38 40 40 40 33 33 33 46 46 46 61 61 61 56 56 56 -+36 36 36 46 46 46 54 54 54 75 75 75 65 65 65 38 38 38 54 54 54 72 72 72 -+56 56 56 70 70 70 62 62 62 45 45 45 44 44 44 43 43 43 53 53 53 78 78 78 -+71 71 71 51 51 51 39 39 39 42 42 42 58 58 58 78 78 78 56 56 56 58 58 58 -+82 82 82 69 69 69 63 63 63 65 65 65 58 58 58 68 68 68 74 74 74 43 43 43 -+66 66 66 73 73 73 85 85 85 84 84 84 66 66 66 40 40 40 69 69 69 81 81 81 -+70 70 70 60 60 60 40 40 40 40 40 40 68 68 68 84 84 84 69 69 69 45 45 45 -+38 38 38 60 60 60 68 68 68 56 56 56 40 40 40 32 32 32 48 48 48 73 73 73 -+72 72 72 43 43 43 69 69 69 57 57 57 40 40 40 46 46 46 52 52 52 50 50 50 -+68 68 68 68 68 68 78 78 78 73 73 73 69 69 69 69 69 69 57 57 57 57 57 57 -+62 62 62 66 66 66 69 69 69 63 63 63 52 52 52 53 53 53 57 57 57 51 51 51 -+56 56 56 60 60 60 67 67 67 70 70 70 70 70 70 67 67 67 63 63 63 62 62 62 -+57 57 57 73 73 73 34 34 34 24 24 24 24 24 24 23 23 23 23 23 23 25 25 25 -+20 20 20 31 31 31 20 20 20 24 24 24 24 24 24 11 11 11 28 28 28 45 45 45 -+59 59 59 46 46 46 28 28 28 17 17 17 14 14 14 16 16 16 16 16 16 13 13 13 -+14 14 14 10 10 10 11 11 11 13 13 13 16 16 16 33 33 33 50 50 50 52 52 52 -+65 65 65 58 58 58 51 51 51 50 50 50 52 52 52 57 57 57 58 58 58 58 58 58 -+50 50 50 50 50 50 51 51 51 56 56 56 58 58 58 57 57 57 51 51 51 45 45 45 -+50 50 50 51 51 51 56 56 56 53 53 53 32 32 32 4 4 4 3 3 3 21 21 21 -+57 57 57 39 39 39 46 46 46 25 25 25 0 0 0 29 29 29 51 51 51 31 31 31 -+48 48 48 21 21 21 0 0 0 44 44 44 65 65 65 24 24 24 3 3 3 3 3 3 -+0 0 0 33 33 33 45 45 45 21 21 21 0 0 0 3 3 3 11 11 11 6 6 6 -+48 48 48 48 48 48 8 8 8 0 0 0 6 6 6 0 0 0 17 17 17 28 28 28 -+20 20 20 17 17 17 27 27 27 42 42 42 44 44 44 37 37 37 37 37 37 45 45 45 -+49 49 49 49 49 49 48 48 48 48 48 48 46 46 46 46 46 46 48 48 48 48 48 48 -+44 44 44 34 34 34 33 33 33 37 37 37 31 31 31 21 21 21 31 31 31 49 49 49 -+28 28 28 33 33 33 38 38 38 6 6 6 0 0 0 13 13 13 3 3 3 21 21 21 -+24 24 24 45 45 45 32 32 32 17 17 17 0 0 0 0 0 0 37 37 37 49 49 49 -+6 6 6 0 0 0 40 40 40 19 19 19 31 31 31 33 33 33 0 0 0 39 39 39 -+28 28 28 36 36 36 8 8 8 0 0 0 0 0 0 3 3 3 0 0 0 3 3 3 -+4 4 4 32 32 32 49 49 49 51 51 51 43 43 43 27 27 27 25 25 25 40 40 40 -+44 44 44 39 39 39 11 11 11 0 0 0 13 13 13 14 14 14 6 6 6 17 17 17 -+10 10 10 16 16 16 14 14 14 14 14 14 17 17 17 13 13 13 14 14 14 28 28 28 -+36 36 36 0 0 0 4 4 4 23 23 23 13 13 13 0 0 0 0 0 0 23 23 23 -+54 54 54 42 42 42 32 32 32 54 54 54 32 32 32 16 16 16 52 52 52 36 36 36 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 -+4 4 4 8 8 8 13 13 13 17 17 17 20 20 20 20 20 20 19 19 19 19 19 19 -+19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 -+17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 -+19 19 19 19 19 19 20 20 20 21 21 21 19 19 19 17 17 17 28 28 28 40 40 40 -+34 34 34 21 21 21 17 17 17 19 19 19 16 16 16 17 17 17 32 32 32 48 48 48 -+37 37 37 24 24 24 10 10 10 14 14 14 20 20 20 11 11 11 23 23 23 49 49 49 -+43 43 43 27 27 27 10 10 10 17 17 17 24 24 24 17 17 17 23 23 23 46 46 46 -+46 46 46 31 31 31 14 14 14 16 16 16 20 20 20 11 11 11 21 21 21 50 50 50 -+57 57 57 25 25 25 10 10 10 21 21 21 21 21 21 13 13 13 23 23 23 42 42 42 -+57 57 57 39 39 39 14 14 14 3 3 3 3 3 3 0 0 0 10 10 10 36 36 36 -+58 58 58 43 43 43 10 10 10 0 0 0 8 8 8 0 0 0 0 0 0 29 29 29 -+63 63 63 36 36 36 10 10 10 19 19 19 13 13 13 0 0 0 13 13 13 8 8 8 -+56 56 56 38 38 38 21 21 21 11 11 11 0 0 0 4 4 4 14 14 14 17 17 17 -+52 52 52 44 44 44 13 13 13 0 0 0 19 19 19 19 19 19 8 8 8 21 21 21 -+54 54 54 52 52 52 32 32 32 11 11 11 13 13 13 13 13 13 6 6 6 14 14 14 -+48 48 48 50 50 50 31 31 31 28 28 28 28 28 28 16 16 16 16 16 16 14 14 14 -+33 33 33 56 56 56 34 34 34 14 14 14 23 23 23 23 23 23 23 23 23 21 21 21 -+27 27 27 21 21 21 21 21 21 27 27 27 28 28 28 24 24 24 23 23 23 25 25 25 -+25 25 25 32 32 32 49 49 49 52 52 52 36 36 36 27 27 27 32 32 32 31 31 31 -+36 36 36 23 23 23 34 34 34 53 53 53 49 49 49 34 34 34 32 32 32 33 33 33 -+38 38 38 32 32 32 33 33 33 44 44 44 52 52 52 50 50 50 42 42 42 37 37 37 -+39 39 39 40 40 40 37 37 37 37 37 37 50 50 50 63 63 63 57 57 57 39 39 39 -+38 38 38 38 38 38 43 43 43 52 52 52 80 80 80 73 73 73 73 73 73 46 46 46 -+44 44 44 61 61 61 74 74 74 65 65 65 43 43 43 42 42 42 60 60 60 74 74 74 -+76 76 76 71 71 71 44 44 44 45 45 45 46 46 46 54 54 54 83 83 83 77 77 77 -+81 81 81 63 63 63 42 42 42 59 59 59 81 81 81 80 80 80 44 44 44 50 50 50 -+71 71 71 78 78 78 90 90 90 85 85 85 59 59 59 48 48 48 61 61 61 76 76 76 -+80 80 80 61 61 61 39 39 39 58 58 58 72 72 72 81 81 81 87 87 87 57 57 57 -+53 53 53 70 70 70 52 52 52 48 48 48 43 43 43 44 44 44 68 68 68 59 59 59 -+74 74 74 71 71 71 71 71 71 74 74 74 71 71 71 62 62 62 59 59 59 61 61 61 -+60 60 60 58 58 58 51 51 51 68 68 68 68 68 68 42 42 42 33 33 33 36 36 36 -+39 39 39 45 45 45 67 67 67 70 70 70 43 43 43 31 31 31 37 37 37 33 33 33 -+39 39 39 33 33 33 31 31 31 43 43 43 60 60 60 71 71 71 70 70 70 63 63 63 -+52 52 52 73 73 73 69 69 69 67 67 67 54 54 54 51 51 51 34 34 34 29 29 29 -+29 29 29 25 25 25 21 21 21 21 21 21 24 24 24 25 25 25 23 23 23 19 19 19 -+32 32 32 49 49 49 58 58 58 48 48 48 28 28 28 17 17 17 17 17 17 21 21 21 -+19 19 19 10 10 10 11 11 11 19 19 19 44 44 44 60 60 60 50 50 50 52 52 52 -+53 53 53 60 60 60 59 59 59 54 54 54 53 53 53 50 50 50 50 50 50 60 60 60 -+61 61 61 54 54 54 49 49 49 50 50 50 56 56 56 59 59 59 56 56 56 51 51 51 -+46 46 46 46 46 46 51 51 51 57 57 57 51 51 51 32 32 32 8 8 8 0 0 0 -+16 16 16 56 56 56 50 50 50 4 4 4 0 0 0 8 8 8 13 13 13 57 57 57 -+49 49 49 38 38 38 23 23 23 48 48 48 32 32 32 52 52 52 32 32 32 13 13 13 -+16 16 16 17 17 17 40 40 40 46 46 46 34 34 34 32 32 32 33 33 33 39 39 39 -+54 54 54 42 42 42 31 31 31 29 29 29 29 29 29 28 28 28 27 27 27 29 29 29 -+32 32 32 32 32 32 42 42 42 45 45 45 33 33 33 31 31 31 44 44 44 53 53 53 -+28 28 28 40 40 40 45 45 45 25 25 25 10 10 10 0 0 0 4 4 4 50 50 50 -+24 24 24 0 0 0 23 23 23 36 36 36 42 42 42 0 0 0 37 37 37 51 51 51 -+28 28 28 32 32 32 34 34 34 6 6 6 0 0 0 3 3 3 0 0 0 23 23 23 -+36 36 36 33 33 33 10 10 10 3 3 3 0 0 0 0 0 0 28 28 28 51 51 51 -+28 28 28 0 0 0 57 57 57 13 13 13 44 44 44 29 29 29 0 0 0 40 40 40 -+25 25 25 6 6 6 6 6 6 3 3 3 0 0 0 4 4 4 3 3 3 6 6 6 -+11 11 11 0 0 0 11 11 11 44 44 44 54 54 54 44 44 44 39 39 39 45 45 45 -+45 45 45 52 52 52 44 44 44 0 0 0 10 10 10 31 31 31 6 6 6 20 20 20 -+16 16 16 10 10 10 13 13 13 14 14 14 13 13 13 28 28 28 40 40 40 36 36 36 -+11 11 11 4 4 4 0 0 0 10 10 10 17 17 17 6 6 6 6 6 6 29 29 29 -+49 49 49 50 50 50 21 21 21 24 24 24 44 44 44 43 43 43 43 43 43 44 44 44 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 6 6 6 10 10 10 13 13 13 14 14 14 -+21 21 21 21 21 21 21 21 21 20 20 20 19 19 19 17 17 17 16 16 16 14 14 14 -+17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 -+20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 -+16 16 16 16 16 16 17 17 17 20 20 20 17 17 17 14 14 14 21 21 21 29 29 29 -+46 46 46 39 39 39 17 17 17 14 14 14 27 27 27 16 16 16 8 8 8 32 32 32 -+49 49 49 40 40 40 27 27 27 20 20 20 21 21 21 16 16 16 14 14 14 25 25 25 -+46 46 46 42 42 42 27 27 27 16 16 16 17 17 17 20 20 20 23 23 23 32 32 32 -+54 54 54 45 45 45 27 27 27 17 17 17 23 23 23 23 23 23 19 19 19 20 20 20 -+38 38 38 57 57 57 37 37 37 10 10 10 23 23 23 23 23 23 13 13 13 27 27 27 -+46 46 46 54 54 54 42 42 42 13 13 13 0 0 0 3 3 3 4 4 4 4 4 4 -+43 43 43 50 50 50 38 38 38 11 11 11 0 0 0 3 3 3 3 3 3 0 0 0 -+21 21 21 59 59 59 45 45 45 16 16 16 10 10 10 0 0 0 3 3 3 8 8 8 -+27 27 27 57 57 57 42 42 42 10 10 10 13 13 13 10 10 10 0 0 0 11 11 11 -+20 20 20 45 45 45 51 51 51 23 23 23 0 0 0 11 11 11 20 20 20 4 4 4 -+27 27 27 44 44 44 54 54 54 32 32 32 0 0 0 8 8 8 21 21 21 8 8 8 -+13 13 13 46 46 46 49 49 49 38 38 38 28 28 28 23 23 23 25 25 25 17 17 17 -+20 20 20 46 46 46 51 51 51 37 37 37 16 16 16 14 14 14 28 28 28 17 17 17 -+20 20 20 23 23 23 24 24 24 21 21 21 21 21 21 25 25 25 28 28 28 27 27 27 -+27 27 27 45 45 45 51 51 51 38 38 38 25 25 25 25 25 25 31 31 31 36 36 36 -+25 25 25 37 37 37 50 50 50 51 51 51 39 39 39 32 32 32 37 37 37 42 42 42 -+38 38 38 38 38 38 44 44 44 54 54 54 53 53 53 44 44 44 37 37 37 37 37 37 -+43 43 43 38 38 38 42 42 42 54 54 54 62 62 62 56 56 56 45 45 45 39 39 39 -+45 45 45 51 51 51 38 38 38 48 48 48 61 61 61 77 77 77 69 69 69 43 43 43 -+46 46 46 34 34 34 68 68 68 83 83 83 58 58 58 69 69 69 85 85 85 56 56 56 -+66 66 66 77 77 77 67 67 67 51 51 51 39 39 39 54 54 54 85 85 85 84 84 84 -+89 89 89 61 61 61 50 50 50 68 68 68 69 69 69 83 83 83 78 78 78 70 70 70 -+87 87 87 87 87 87 87 87 87 83 83 83 74 74 74 67 67 67 62 62 62 58 58 58 -+75 75 75 75 75 75 67 67 67 69 69 69 60 60 60 65 65 65 89 89 89 82 82 82 -+70 70 70 57 57 57 39 39 39 44 44 44 54 54 54 61 61 61 69 69 69 70 70 70 -+77 77 77 76 76 76 72 72 72 67 67 67 63 63 63 61 61 61 60 60 60 60 60 60 -+63 63 63 59 59 59 50 50 50 63 63 63 68 68 68 50 50 50 44 44 44 45 45 45 -+36 36 36 32 32 32 46 46 46 66 66 66 62 62 62 46 46 46 39 39 39 40 40 40 -+37 37 37 33 33 33 31 31 31 32 32 32 42 42 42 53 53 53 65 65 65 71 71 71 -+54 54 54 62 62 62 51 51 51 48 48 48 45 45 45 59 59 59 63 63 63 72 72 72 -+52 52 52 44 44 44 33 33 33 24 24 24 20 20 20 21 21 21 23 23 23 23 23 23 -+8 8 8 24 24 24 40 40 40 52 52 52 53 53 53 45 45 45 28 28 28 13 13 13 -+27 27 27 39 39 39 53 53 53 52 52 52 56 56 56 59 59 59 52 52 52 59 59 59 -+50 50 50 58 58 58 59 59 59 56 56 56 56 56 56 53 53 53 52 52 52 58 58 58 -+56 56 56 52 52 52 50 50 50 49 49 49 50 50 50 51 51 51 52 52 52 51 51 51 -+49 49 49 48 48 48 49 49 49 53 53 53 52 52 52 43 43 43 27 27 27 16 16 16 -+44 44 44 58 58 58 54 54 54 25 25 25 13 13 13 6 6 6 0 0 0 23 23 23 -+56 56 56 57 57 57 52 52 52 57 57 57 39 39 39 56 56 56 53 53 53 50 50 50 -+48 48 48 38 38 38 43 43 43 45 45 45 45 45 45 40 40 40 37 37 37 52 52 52 -+39 39 39 36 36 36 29 29 29 25 25 25 25 25 25 27 27 27 28 28 28 28 28 28 -+43 43 43 42 42 42 49 49 49 51 51 51 46 46 46 48 48 48 51 51 51 49 49 49 -+51 51 51 59 59 59 57 57 57 32 32 32 20 20 20 19 19 19 11 11 11 27 27 27 -+37 37 37 19 19 19 36 36 36 31 31 31 31 31 31 17 17 17 42 42 42 45 45 45 -+28 28 28 28 28 28 36 36 36 17 17 17 11 11 11 14 14 14 6 6 6 28 28 28 -+38 38 38 32 32 32 6 6 6 3 3 3 10 10 10 10 10 10 29 29 29 43 43 43 -+25 25 25 10 10 10 50 50 50 19 19 19 31 31 31 33 33 33 31 31 31 42 42 42 -+21 21 21 8 8 8 16 16 16 14 14 14 11 11 11 14 14 14 10 10 10 8 8 8 -+8 8 8 17 17 17 24 24 24 32 32 32 44 44 44 48 48 48 40 40 40 31 31 31 -+21 21 21 29 29 29 38 38 38 28 28 28 20 20 20 28 28 28 23 23 23 10 10 10 -+11 11 11 17 17 17 11 11 11 6 6 6 21 21 21 37 37 37 36 36 36 25 25 25 -+16 16 16 8 8 8 8 8 8 20 20 20 29 29 29 24 24 24 21 21 21 31 31 31 -+36 36 36 40 40 40 29 29 29 24 24 24 32 32 32 40 40 40 43 43 43 36 36 36 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 3 3 8 8 8 13 13 13 17 17 17 20 20 20 21 21 21 -+19 19 19 19 19 19 19 19 19 19 19 19 20 20 20 21 21 21 23 23 23 24 24 24 -+20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 -+17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 -+16 16 16 16 16 16 19 19 19 20 20 20 19 19 19 14 14 14 16 16 16 20 20 20 -+29 29 29 48 48 48 37 37 37 14 14 14 20 20 20 24 24 24 16 16 16 17 17 17 -+27 27 27 46 46 46 44 44 44 23 23 23 16 16 16 24 24 24 23 23 23 11 11 11 -+27 27 27 49 49 49 48 48 48 21 21 21 10 10 10 17 17 17 19 19 19 11 11 11 -+23 23 23 48 48 48 50 50 50 25 25 25 13 13 13 17 17 17 17 17 17 10 10 10 -+19 19 19 43 43 43 50 50 50 31 31 31 14 14 14 17 17 17 19 19 19 11 11 11 -+21 21 21 46 46 46 53 53 53 36 36 36 19 19 19 10 10 10 0 0 0 0 0 0 -+10 10 10 38 38 38 57 57 57 42 42 42 8 8 8 0 0 0 3 3 3 0 0 0 -+0 0 0 36 36 36 57 57 57 45 45 45 13 13 13 0 0 0 11 11 11 8 8 8 -+0 0 0 36 36 36 54 54 54 42 42 42 16 16 16 0 0 0 4 4 4 11 11 11 -+0 0 0 24 24 24 49 49 49 49 49 49 24 24 24 4 4 4 10 10 10 14 14 14 -+10 10 10 20 20 20 45 45 45 52 52 52 28 28 28 8 8 8 14 14 14 19 19 19 -+11 11 11 29 29 29 42 42 42 56 56 56 49 49 49 23 23 23 14 14 14 19 19 19 -+16 16 16 24 24 24 40 40 40 53 53 53 38 38 38 16 16 16 21 21 21 27 27 27 -+17 17 17 23 23 23 28 28 28 29 29 29 28 28 28 28 28 28 28 28 28 29 29 29 -+42 42 42 48 48 48 37 37 37 25 25 25 32 32 32 33 33 33 29 29 29 33 33 33 -+31 31 31 50 50 50 54 54 54 42 42 42 33 33 33 36 36 36 39 39 39 42 42 42 -+32 32 32 49 49 49 61 61 61 57 57 57 44 44 44 36 36 36 39 39 39 46 46 46 -+42 42 42 44 44 44 54 54 54 65 65 65 61 61 61 48 48 48 42 42 42 45 45 45 -+48 48 48 39 39 39 52 52 52 49 49 49 75 75 75 58 58 58 75 75 75 69 69 69 -+43 43 43 53 53 53 45 45 45 58 58 58 90 90 90 82 82 82 49 49 49 42 42 42 -+48 48 48 65 65 65 77 77 77 72 72 72 62 62 62 67 67 67 72 72 72 66 66 66 -+81 81 81 84 84 84 67 67 67 68 68 68 70 70 70 82 82 82 84 84 84 92 92 92 -+78 78 78 65 65 65 73 73 73 90 90 90 87 87 87 77 77 77 65 65 65 44 44 44 -+50 50 50 70 70 70 80 80 80 76 76 76 52 52 52 50 50 50 83 83 83 93 93 93 -+87 87 87 62 62 62 54 54 54 60 60 60 76 76 76 87 87 87 81 81 81 85 85 85 -+84 84 84 84 84 84 76 76 76 66 66 66 62 62 62 67 67 67 68 68 68 65 65 65 -+67 67 67 65 65 65 60 60 60 71 71 71 82 82 82 75 75 75 72 72 72 73 73 73 -+82 82 82 74 74 74 69 69 69 76 76 76 82 82 82 67 67 67 52 52 52 56 56 56 -+40 40 40 43 43 43 44 44 44 40 40 40 37 37 37 38 38 38 43 43 43 48 48 48 -+63 63 63 62 62 62 51 51 51 43 43 43 38 38 38 44 44 44 43 43 43 50 50 50 -+61 61 61 57 57 57 50 50 50 44 44 44 40 40 40 38 38 38 38 38 38 38 38 38 -+40 40 40 33 33 33 29 29 29 36 36 36 46 46 46 51 51 51 48 48 48 43 43 43 -+46 46 46 52 52 52 57 57 57 50 50 50 48 48 48 46 46 46 37 37 37 38 38 38 -+44 44 44 52 52 52 51 51 51 45 45 45 43 43 43 42 42 42 37 37 37 34 34 34 -+39 39 39 40 40 40 42 42 42 39 39 39 36 36 36 36 36 36 38 38 38 42 42 42 -+40 40 40 38 38 38 36 36 36 37 37 37 42 42 42 42 42 42 34 34 34 24 24 24 -+32 32 32 29 29 29 39 39 39 34 34 34 23 23 23 24 24 24 28 28 28 34 34 34 -+36 36 36 39 39 39 39 39 39 34 34 34 25 25 25 33 33 33 34 34 34 29 29 29 -+32 32 32 25 25 25 24 24 24 28 28 28 38 38 38 29 29 29 14 14 14 31 31 31 -+31 31 31 32 32 32 32 32 32 29 29 29 28 28 28 28 28 28 28 28 28 27 27 27 -+24 24 24 29 29 29 37 37 37 38 38 38 32 32 32 31 31 31 32 32 32 29 29 29 -+24 24 24 28 28 28 31 31 31 20 20 20 20 20 20 28 28 28 25 25 25 28 28 28 -+44 44 44 32 32 32 36 36 36 25 25 25 21 21 21 23 23 23 32 32 32 29 29 29 -+29 29 29 25 25 25 34 34 34 25 25 25 24 24 24 31 31 31 25 25 25 42 42 42 -+33 33 33 36 36 36 25 25 25 28 28 28 33 33 33 25 25 25 23 23 23 23 23 23 -+32 32 32 16 16 16 27 27 27 24 24 24 29 29 29 42 42 42 43 43 43 28 28 28 -+31 31 31 24 24 24 33 33 33 31 31 31 28 28 28 33 33 33 29 29 29 25 25 25 -+24 24 24 31 31 31 28 28 28 29 29 29 39 39 39 38 38 38 31 31 31 33 33 33 -+21 21 21 29 29 29 32 32 32 36 36 36 28 28 28 25 25 25 27 27 27 3 3 3 -+8 8 8 17 17 17 14 14 14 17 17 17 33 33 33 33 33 33 21 21 21 20 20 20 -+23 23 23 13 13 13 13 13 13 23 23 23 29 29 29 32 32 32 33 33 33 31 31 31 -+32 32 32 27 27 27 31 31 31 31 31 31 33 33 33 42 42 42 38 38 38 28 28 28 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+6 6 6 8 8 8 11 11 11 16 16 16 17 17 17 19 19 19 19 19 19 19 19 19 -+20 20 20 19 19 19 19 19 19 17 17 17 17 17 17 19 19 19 19 19 19 20 20 20 -+17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 -+19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 -+20 20 20 20 20 20 20 20 20 21 21 21 21 21 21 19 19 19 17 17 17 17 17 17 -+8 8 8 32 32 32 49 49 49 37 37 37 14 14 14 21 21 21 29 29 29 17 17 17 -+11 11 11 37 37 37 49 49 49 37 37 37 20 20 20 13 13 13 11 11 11 10 10 10 -+0 0 0 24 24 24 43 43 43 42 42 42 24 24 24 3 3 3 0 0 0 6 6 6 -+0 0 0 21 21 21 44 44 44 42 42 42 21 21 21 0 0 0 0 0 0 17 17 17 -+4 4 4 6 6 6 36 36 36 50 50 50 25 25 25 3 3 3 6 6 6 6 6 6 -+0 0 0 16 16 16 38 38 38 53 53 53 44 44 44 16 16 16 0 0 0 10 10 10 -+0 0 0 11 11 11 42 42 42 57 57 57 38 38 38 8 8 8 0 0 0 8 8 8 -+10 10 10 0 0 0 33 33 33 63 63 63 39 39 39 8 8 8 8 8 8 8 8 8 -+11 11 11 3 3 3 33 33 33 54 54 54 37 37 37 13 13 13 10 10 10 8 8 8 -+10 10 10 3 3 3 17 17 17 49 49 49 58 58 58 23 23 23 0 0 0 20 20 20 -+17 17 17 11 11 11 17 17 17 44 44 44 56 56 56 29 29 29 4 4 4 17 17 17 -+21 21 21 4 4 4 16 16 16 51 51 51 62 62 62 39 39 39 20 20 20 19 19 19 -+20 20 20 19 19 19 20 20 20 42 42 42 58 58 58 39 39 39 20 20 20 27 27 27 -+29 29 29 27 27 27 28 28 28 33 33 33 32 32 32 27 27 27 32 32 32 42 42 42 -+48 48 48 36 36 36 25 25 25 32 32 32 40 40 40 34 34 34 29 29 29 39 39 39 -+49 49 49 53 53 53 43 43 43 33 33 33 39 39 39 44 44 44 39 39 39 37 37 37 -+45 45 45 61 61 61 62 62 62 44 44 44 33 33 33 40 40 40 46 46 46 44 44 44 -+43 43 43 58 58 58 66 66 66 57 57 57 46 46 46 45 45 45 49 49 49 50 50 50 -+43 43 43 57 57 57 58 58 58 81 81 81 54 54 54 54 54 54 53 53 53 78 78 78 -+70 70 70 49 49 49 49 49 49 69 69 69 82 82 82 84 84 84 72 72 72 53 53 53 -+57 57 57 46 46 46 63 63 63 80 80 80 83 83 83 76 76 76 59 59 59 52 52 52 -+67 67 67 94 94 94 84 84 84 76 76 76 72 72 72 76 76 76 77 77 77 91 91 91 -+74 74 74 48 48 48 61 61 61 91 91 91 92 92 92 83 83 83 72 72 72 52 52 52 -+62 62 62 72 72 72 80 80 80 82 82 82 65 65 65 56 56 56 76 76 76 85 85 85 -+89 89 89 83 83 83 85 85 85 83 83 83 87 87 87 92 92 92 85 85 85 83 83 83 -+85 85 85 84 84 84 77 77 77 69 69 69 66 66 66 66 66 66 63 63 63 60 60 60 -+61 61 61 62 62 62 60 60 60 63 63 63 69 69 69 63 63 63 59 59 59 61 61 61 -+60 60 60 61 61 61 58 58 58 56 56 56 60 60 60 60 60 60 57 57 57 57 57 57 -+53 53 53 57 57 57 59 59 59 59 59 59 57 57 57 54 54 54 54 54 54 57 57 57 -+51 51 51 49 49 49 50 50 50 50 50 50 50 50 50 52 52 52 48 48 48 53 53 53 -+48 48 48 49 49 49 49 49 49 49 49 49 48 48 48 45 45 45 44 44 44 43 43 43 -+48 48 48 44 44 44 42 42 42 44 44 44 45 45 45 44 44 44 44 44 44 44 44 44 -+43 43 43 36 36 36 32 32 32 37 37 37 42 42 42 42 42 42 37 37 37 37 37 37 -+33 33 33 38 38 38 38 38 38 33 33 33 34 34 34 39 39 39 38 38 38 34 34 34 -+32 32 32 34 34 34 37 37 37 36 36 36 33 33 33 31 31 31 32 32 32 33 33 33 -+31 31 31 33 33 33 31 31 31 28 28 28 31 31 31 36 36 36 36 36 36 29 29 29 -+36 36 36 24 24 24 28 28 28 32 32 32 28 28 28 34 34 34 36 36 36 24 24 24 -+32 32 32 28 28 28 32 32 32 31 31 31 34 34 34 29 29 29 31 31 31 25 25 25 -+24 24 24 28 28 28 31 31 31 21 21 21 27 27 27 33 33 33 28 28 28 33 33 33 -+25 25 25 23 23 23 23 23 23 27 27 27 29 29 29 29 29 29 29 29 29 29 29 29 -+27 27 27 28 28 28 32 32 32 34 34 34 31 31 31 24 24 24 21 21 21 21 21 21 -+32 32 32 27 27 27 31 31 31 33 33 33 28 28 28 24 24 24 29 29 29 39 39 39 -+36 36 36 37 37 37 21 21 21 25 25 25 34 34 34 21 21 21 25 25 25 32 32 32 -+32 32 32 25 25 25 32 32 32 20 20 20 23 23 23 36 36 36 32 32 32 43 43 43 -+25 25 25 32 32 32 31 31 31 31 31 31 32 32 32 27 27 27 28 28 28 34 34 34 -+34 34 34 28 28 28 23 23 23 38 38 38 39 39 39 45 45 45 27 27 27 27 27 27 -+25 25 25 17 17 17 24 24 24 19 19 19 14 14 14 23 23 23 21 21 21 20 20 20 -+28 28 28 23 23 23 23 23 23 42 42 42 49 49 49 21 21 21 11 11 11 42 42 42 -+33 33 33 38 38 38 25 25 25 17 17 17 29 29 29 38 38 38 38 38 38 36 36 36 -+17 17 17 14 14 14 20 20 20 36 36 36 38 38 38 16 16 16 4 4 4 21 21 21 -+24 24 24 14 14 14 14 14 14 16 16 16 14 14 14 23 23 23 31 31 31 25 25 25 -+39 39 39 19 19 19 27 27 27 39 39 39 49 49 49 45 45 45 24 24 24 24 24 24 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 6 6 6 -+16 16 16 17 17 17 19 19 19 19 19 19 19 19 19 17 17 17 16 16 16 16 16 16 -+19 19 19 19 19 19 20 20 20 20 20 20 19 19 19 19 19 19 17 17 17 16 16 16 -+20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 -+20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 -+19 19 19 19 19 19 17 17 17 17 17 17 17 17 17 19 19 19 19 19 19 17 17 17 -+19 19 19 10 10 10 32 32 32 51 51 51 36 36 36 16 16 16 17 17 17 23 23 23 -+21 21 21 11 11 11 24 24 24 48 48 48 43 43 43 16 16 16 4 4 4 20 20 20 -+8 8 8 0 0 0 16 16 16 46 46 46 44 44 44 11 11 11 0 0 0 0 0 0 -+8 8 8 0 0 0 6 6 6 40 40 40 44 44 44 14 14 14 0 0 0 0 0 0 -+0 0 0 3 3 3 13 13 13 34 34 34 46 46 46 20 20 20 0 0 0 0 0 0 -+0 0 0 0 0 0 17 17 17 45 45 45 52 52 52 36 36 36 13 13 13 0 0 0 -+8 8 8 0 0 0 8 8 8 38 38 38 57 57 57 42 42 42 11 11 11 0 0 0 -+10 10 10 4 4 4 14 14 14 39 39 39 56 56 56 37 37 37 6 6 6 6 6 6 -+20 20 20 10 10 10 0 0 0 24 24 24 56 56 56 48 48 48 14 14 14 3 3 3 -+8 8 8 11 11 11 10 10 10 23 23 23 48 48 48 49 49 49 27 27 27 6 6 6 -+14 14 14 21 21 21 16 16 16 20 20 20 45 45 45 51 51 51 29 29 29 6 6 6 -+19 19 19 16 16 16 17 17 17 24 24 24 43 43 43 56 56 56 40 40 40 11 11 11 -+19 19 19 29 29 29 25 25 25 21 21 21 44 44 44 57 57 57 39 39 39 19 19 19 -+34 34 34 29 29 29 25 25 25 23 23 23 25 25 25 32 32 32 43 43 43 51 51 51 -+39 39 39 28 28 28 33 33 33 40 40 40 34 34 34 29 29 29 40 40 40 52 52 52 -+54 54 54 46 46 46 33 33 33 34 34 34 45 45 45 43 43 43 39 39 39 49 49 49 -+68 68 68 61 61 61 48 48 48 36 36 36 39 39 39 49 49 49 46 46 46 37 37 37 -+57 57 57 66 66 66 62 62 62 46 46 46 40 40 40 50 50 50 53 53 53 46 46 46 -+45 45 45 59 59 59 80 80 80 52 52 52 54 54 54 43 43 43 59 59 59 54 54 54 -+85 85 85 66 66 66 81 81 81 82 82 82 52 52 52 67 67 67 89 89 89 68 68 68 -+66 66 66 44 44 44 61 61 61 82 82 82 88 88 88 80 80 80 57 57 57 54 54 54 -+74 74 74 84 84 84 93 93 93 94 94 94 68 68 68 76 76 76 81 81 81 69 69 69 -+85 85 85 75 75 75 68 68 68 78 78 78 92 92 92 91 91 91 81 81 81 76 76 76 -+82 82 82 65 65 65 56 56 56 72 72 72 80 80 80 78 78 78 84 84 84 85 85 85 -+85 85 85 92 92 92 92 92 92 90 90 90 81 81 81 70 70 70 69 69 69 63 63 63 -+56 56 56 54 54 54 58 58 58 66 66 66 71 71 71 70 70 70 69 69 69 70 70 70 -+70 70 70 71 71 71 69 69 69 65 65 65 63 63 63 61 61 61 61 61 61 69 69 69 -+65 65 65 66 66 66 68 68 68 66 66 66 61 61 61 63 63 63 63 63 63 58 58 58 -+65 65 65 65 65 65 63 63 63 59 59 59 56 56 56 56 56 56 60 60 60 65 65 65 -+59 59 59 53 53 53 59 59 59 53 53 53 51 51 51 51 51 51 48 48 48 52 52 52 -+53 53 53 54 54 54 54 54 54 54 54 54 54 54 54 56 56 56 57 57 57 58 58 58 -+46 46 46 50 50 50 52 52 52 51 51 51 45 45 45 43 43 43 44 44 44 49 49 49 -+53 53 53 46 46 46 49 49 49 56 56 56 48 48 48 29 29 29 28 28 28 37 37 37 -+45 45 45 45 45 45 45 45 45 42 42 42 43 43 43 49 49 49 52 52 52 49 49 49 -+44 44 44 44 44 44 45 45 45 46 46 46 48 48 48 46 46 46 43 43 43 39 39 39 -+38 38 38 44 44 44 46 46 46 40 40 40 38 38 38 42 42 42 43 43 43 43 43 43 -+50 50 50 36 36 36 19 19 19 16 16 16 25 25 25 38 38 38 37 37 37 17 17 17 -+40 40 40 28 28 28 33 33 33 39 39 39 34 34 34 11 11 11 10 10 10 14 14 14 -+25 25 25 37 37 37 40 40 40 11 11 11 0 0 0 33 33 33 48 48 48 43 43 43 -+29 29 29 14 14 14 4 4 4 14 14 14 25 25 25 29 29 29 34 34 34 42 42 42 -+49 49 49 43 43 43 42 42 42 48 48 48 45 45 45 31 31 31 17 17 17 14 14 14 -+4 4 4 0 0 0 4 4 4 13 13 13 10 10 10 8 8 8 21 21 21 32 32 32 -+19 19 19 44 44 44 13 13 13 21 21 21 50 50 50 24 24 24 38 38 38 51 51 51 -+49 49 49 43 43 43 45 45 45 25 25 25 19 19 19 29 29 29 16 16 16 11 11 11 -+29 29 29 24 24 24 8 8 8 0 0 0 0 0 0 0 0 0 17 17 17 39 39 39 -+21 21 21 46 46 46 46 46 46 43 43 43 37 37 37 42 42 42 4 4 4 45 45 45 -+14 14 14 0 0 0 6 6 6 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 -+0 0 0 0 0 0 14 14 14 38 38 38 43 43 43 11 11 11 0 0 0 36 36 36 -+49 49 49 42 42 42 42 42 42 19 19 19 23 23 23 46 46 46 45 45 45 53 53 53 -+37 37 37 21 21 21 27 27 27 38 38 38 25 25 25 4 4 4 6 6 6 19 19 19 -+20 20 20 16 16 16 19 19 19 14 14 14 3 3 3 10 10 10 20 20 20 16 16 16 -+36 36 36 27 27 27 29 29 29 38 38 38 52 52 52 42 42 42 10 10 10 19 19 19 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 6 6 6 10 10 10 11 11 11 -+19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 17 17 17 17 17 17 -+17 17 17 19 19 19 19 19 19 19 19 19 19 19 19 17 17 17 16 16 16 16 16 16 -+14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 -+11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 -+10 10 10 11 11 11 10 10 10 6 6 6 8 8 8 11 11 11 13 13 13 10 10 10 -+19 19 19 6 6 6 4 4 4 28 28 28 45 45 45 34 34 34 17 17 17 17 17 17 -+24 24 24 6 6 6 8 8 8 32 32 32 46 46 46 46 46 46 32 32 32 16 16 16 -+20 20 20 10 10 10 6 6 6 19 19 19 37 37 37 44 44 44 25 25 25 0 0 0 -+6 6 6 0 0 0 0 0 0 14 14 14 36 36 36 46 46 46 28 28 28 0 0 0 -+0 0 0 0 0 0 0 0 0 14 14 14 36 36 36 45 45 45 28 28 28 0 0 0 -+0 0 0 0 0 0 0 0 0 17 17 17 40 40 40 57 57 57 39 39 39 0 0 0 -+0 0 0 3 3 3 0 0 0 8 8 8 42 42 42 57 57 57 38 38 38 10 10 10 -+0 0 0 8 8 8 20 20 20 13 13 13 27 27 27 56 56 56 45 45 45 10 10 10 -+8 8 8 8 8 8 0 0 0 0 0 0 32 32 32 56 56 56 48 48 48 19 19 19 -+0 0 0 10 10 10 17 17 17 10 10 10 16 16 16 51 51 51 57 57 57 23 23 23 -+8 8 8 13 13 13 19 19 19 14 14 14 21 21 21 49 49 49 54 54 54 32 32 32 -+13 13 13 20 20 20 25 25 25 11 11 11 21 21 21 52 52 52 52 52 52 34 34 34 -+24 24 24 17 17 17 29 29 29 27 27 27 25 25 25 46 46 46 52 52 52 39 39 39 -+23 23 23 28 28 28 28 28 28 24 24 24 31 31 31 43 43 43 46 46 46 40 40 40 -+36 36 36 32 32 32 37 37 37 36 36 36 29 29 29 42 42 42 56 56 56 52 52 52 -+43 43 43 39 39 39 38 38 38 44 44 44 44 44 44 39 39 39 48 48 48 66 66 66 -+60 60 60 46 46 46 40 40 40 46 46 46 50 50 50 48 48 48 50 50 50 58 58 58 -+71 71 71 61 61 61 51 51 51 48 48 48 51 51 51 53 53 53 51 51 51 48 48 48 -+66 66 66 69 69 69 53 53 53 60 60 60 43 43 43 68 68 68 50 50 50 53 53 53 -+53 53 53 94 94 94 91 91 91 59 59 59 53 53 53 54 54 54 61 61 61 84 84 84 -+68 68 68 66 66 66 80 80 80 81 81 81 76 76 76 78 78 78 72 72 72 73 73 73 -+91 91 91 90 90 90 93 93 93 91 91 91 77 77 77 84 84 84 67 67 67 54 54 54 -+70 70 70 99 99 99 90 90 90 72 72 72 88 88 88 92 92 92 84 84 84 93 93 93 -+82 82 82 56 56 56 45 45 45 69 69 69 92 92 92 96 96 96 92 92 92 88 88 88 -+92 92 92 91 91 91 84 84 84 87 87 87 76 76 76 54 54 54 53 53 53 52 52 52 -+54 54 54 52 52 52 57 57 57 69 69 69 73 73 73 70 70 70 66 66 66 67 67 67 -+69 69 69 66 66 66 62 62 62 53 53 53 53 53 53 56 56 56 60 60 60 75 75 75 -+62 62 62 48 48 48 44 44 44 49 49 49 44 44 44 42 42 42 44 44 44 44 44 44 -+53 53 53 61 61 61 68 68 68 66 66 66 54 54 54 43 43 43 38 38 38 37 37 37 -+61 61 61 59 59 59 76 76 76 66 66 66 57 57 57 49 49 49 37 37 37 34 34 34 -+48 48 48 48 48 48 50 50 50 52 52 52 54 54 54 56 56 56 56 56 56 54 54 54 -+67 67 67 69 69 69 68 68 68 65 65 65 65 65 65 68 68 68 67 67 67 63 63 63 -+59 59 59 50 50 50 50 50 50 59 59 59 48 48 48 28 28 28 31 31 31 38 38 38 -+56 56 56 52 52 52 52 52 52 53 53 53 52 52 52 54 54 54 57 57 57 54 54 54 -+56 56 56 53 53 53 52 52 52 54 54 54 58 58 58 58 58 58 53 53 53 49 49 49 -+49 49 49 54 54 54 58 58 58 56 56 56 51 51 51 49 49 49 50 50 50 50 50 50 -+52 52 52 49 49 49 28 28 28 6 6 6 0 0 0 21 21 21 46 46 46 52 52 52 -+52 52 52 25 25 25 31 31 31 56 56 56 48 48 48 28 28 28 8 8 8 0 0 0 -+0 0 0 21 21 21 40 40 40 20 20 20 6 6 6 33 33 33 36 36 36 13 13 13 -+44 44 44 28 28 28 14 14 14 16 16 16 24 24 24 32 32 32 42 42 42 51 51 51 -+45 45 45 51 51 51 54 54 54 49 49 49 33 33 33 6 6 6 0 0 0 4 4 4 -+0 0 0 8 8 8 0 0 0 0 0 0 6 6 6 16 16 16 20 20 20 13 13 13 -+6 6 6 48 48 48 23 23 23 10 10 10 48 48 48 13 13 13 36 36 36 52 52 52 -+49 49 49 43 43 43 52 52 52 42 42 42 37 37 37 44 44 44 27 27 27 19 19 19 -+32 32 32 24 24 24 19 19 19 14 14 14 19 19 19 20 20 20 24 24 24 44 44 44 -+14 14 14 50 50 50 52 52 52 25 25 25 21 21 21 43 43 43 3 3 3 43 43 43 -+21 21 21 3 3 3 4 4 4 4 4 4 0 0 0 3 3 3 0 0 0 0 0 0 -+4 4 4 28 28 28 34 34 34 29 29 29 34 34 34 38 38 38 40 40 40 50 50 50 -+54 54 54 33 33 33 58 58 58 45 45 45 23 23 23 45 45 45 50 50 50 50 50 50 -+50 50 50 38 38 38 33 33 33 24 24 24 8 8 8 13 13 13 20 20 20 11 11 11 -+14 14 14 19 19 19 24 24 24 21 21 21 11 11 11 8 8 8 11 11 11 11 11 11 -+21 21 21 38 38 38 37 37 37 28 28 28 37 37 37 29 29 29 4 4 4 10 10 10 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 3 3 3 6 6 6 10 10 10 14 14 14 17 17 17 -+19 19 19 17 17 17 17 17 17 17 17 17 17 17 17 19 19 19 19 19 19 19 19 19 -+21 21 21 20 20 20 16 16 16 11 11 11 8 8 8 4 4 4 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 6 6 6 6 6 6 0 0 0 0 0 0 3 3 3 4 4 4 0 0 0 -+3 3 3 8 8 8 0 0 0 0 0 0 23 23 23 40 40 40 34 34 34 19 19 19 -+20 20 20 23 23 23 21 21 21 16 16 16 27 27 27 49 49 49 44 44 44 14 14 14 -+20 20 20 24 24 24 19 19 19 0 0 0 14 14 14 46 46 46 44 44 44 8 8 8 -+0 0 0 6 6 6 8 8 8 0 0 0 8 8 8 44 44 44 49 49 49 23 23 23 -+6 6 6 0 0 0 0 0 0 4 4 4 4 4 4 40 40 40 54 54 54 23 23 23 -+6 6 6 0 0 0 0 0 0 3 3 3 25 25 25 50 50 50 51 51 51 29 29 29 -+0 0 0 3 3 3 3 3 3 0 0 0 11 11 11 38 38 38 50 50 50 43 43 43 -+11 11 11 0 0 0 23 23 23 13 13 13 0 0 0 40 40 40 59 59 59 36 36 36 -+14 14 14 0 0 0 14 14 14 13 13 13 0 0 0 31 31 31 58 58 58 45 45 45 -+23 23 23 6 6 6 11 11 11 14 14 14 6 6 6 27 27 27 50 50 50 50 50 50 -+27 27 27 10 10 10 13 13 13 20 20 20 19 19 19 29 29 29 49 49 49 56 56 56 -+24 24 24 10 10 10 16 16 16 19 19 19 24 24 24 42 42 42 51 51 51 59 59 59 -+43 43 43 11 11 11 24 24 24 34 34 34 25 25 25 29 29 29 43 43 43 56 56 56 -+33 33 33 29 29 29 31 31 31 39 39 39 46 46 46 46 46 46 38 38 38 32 32 32 -+38 38 38 37 37 37 34 34 34 33 33 33 42 42 42 56 56 56 56 56 56 44 44 44 -+39 39 39 40 40 40 44 44 44 45 45 45 43 43 43 50 50 50 60 60 60 63 63 63 -+43 43 43 42 42 42 46 46 46 53 53 53 51 51 51 48 48 48 59 59 59 75 75 75 -+66 66 66 53 53 53 48 48 48 53 53 53 57 57 57 53 53 53 57 57 57 66 66 66 -+87 87 87 62 62 62 58 58 58 56 56 56 62 62 62 57 57 57 52 52 52 60 60 60 -+73 73 73 89 89 89 90 90 90 75 75 75 63 63 63 52 52 52 53 53 53 67 67 67 -+87 87 87 88 88 88 85 85 85 65 65 65 54 54 54 74 74 74 92 92 92 96 97 98 -+92 92 92 89 89 89 88 88 88 84 84 84 87 87 87 91 91 91 56 56 56 62 62 62 -+66 66 66 88 88 88 93 93 93 83 83 83 83 83 83 91 91 91 89 89 89 84 84 84 -+90 90 90 81 81 81 78 78 78 84 84 84 90 90 90 89 89 89 85 85 85 87 87 87 -+99 99 99 90 90 90 88 88 88 84 84 84 78 78 78 70 70 70 58 58 58 57 57 57 -+58 58 58 58 58 58 59 59 59 66 66 66 72 72 72 74 74 74 73 73 73 72 72 72 -+77 77 77 68 68 68 60 60 60 51 51 51 51 51 51 52 52 52 49 49 49 65 65 65 -+78 78 78 67 67 67 51 51 51 46 46 46 48 48 48 43 43 43 43 43 43 49 49 49 -+40 40 40 51 51 51 63 63 63 71 71 71 69 69 69 60 60 60 50 50 50 44 44 44 -+34 34 34 42 42 42 75 75 75 68 68 68 65 65 65 65 65 65 61 61 61 61 61 61 -+37 37 37 34 34 34 32 32 32 32 32 32 33 33 33 32 32 32 29 29 29 25 25 25 -+27 27 27 37 37 37 45 45 45 52 52 52 61 61 61 65 65 65 49 49 49 25 25 25 -+27 27 27 21 21 21 24 24 24 45 45 45 53 53 53 52 52 52 59 59 59 53 53 53 -+32 32 32 28 28 28 40 40 40 54 54 54 56 56 56 57 57 57 60 60 60 61 61 61 -+60 60 60 57 57 57 53 53 53 53 53 53 56 56 56 57 57 57 56 56 56 54 54 54 -+51 51 51 52 52 52 54 54 54 58 58 58 57 57 57 52 52 52 49 49 49 49 49 49 -+60 60 60 63 63 63 53 53 53 34 34 34 0 0 0 0 0 0 39 39 39 57 57 57 -+43 43 43 4 4 4 0 0 0 50 50 50 42 42 42 44 44 44 27 27 27 10 10 10 -+0 0 0 11 11 11 36 36 36 42 42 42 48 48 48 49 49 49 23 23 23 0 0 0 -+34 34 34 36 36 36 32 32 32 27 27 27 29 29 29 39 39 39 46 46 46 49 49 49 -+42 42 42 56 56 56 53 53 53 32 32 32 8 8 8 0 0 0 0 0 0 4 4 4 -+0 0 0 10 10 10 0 0 0 0 0 0 19 19 19 19 19 19 13 13 13 0 0 0 -+4 4 4 29 29 29 40 40 40 16 16 16 46 46 46 0 0 0 19 19 19 46 46 46 -+33 33 33 21 21 21 42 42 42 49 49 49 51 51 51 56 56 56 43 43 43 44 44 44 -+27 27 27 29 29 29 45 45 45 56 56 56 57 57 57 48 48 48 40 40 40 60 60 60 -+31 31 31 42 42 42 44 44 44 23 23 23 14 14 14 43 43 43 21 21 21 28 28 28 -+29 29 29 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 0 0 0 3 3 3 -+21 21 21 27 27 27 16 16 16 0 0 0 0 0 0 21 21 21 31 31 31 31 31 31 -+44 44 44 14 14 14 40 40 40 54 54 54 40 40 40 49 49 49 57 57 57 51 51 51 -+48 48 48 49 49 49 39 39 39 21 21 21 10 10 10 17 17 17 20 20 20 10 10 10 -+13 13 13 17 17 17 20 20 20 21 21 21 20 20 20 14 14 14 11 11 11 16 16 16 -+24 24 24 39 39 39 33 33 33 21 21 21 20 20 20 16 16 16 13 13 13 8 8 8 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 4 4 4 8 8 8 13 13 13 17 17 17 20 20 20 -+20 20 20 19 19 19 17 17 17 16 16 16 16 16 16 16 16 16 17 17 17 19 19 19 -+6 6 6 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 -+8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+0 0 0 6 6 6 8 8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 0 0 0 4 4 4 0 0 0 0 0 0 17 17 17 39 39 39 29 29 29 -+3 3 3 8 8 8 20 20 20 20 20 20 16 16 16 28 28 28 44 44 44 48 48 48 -+20 20 20 13 13 13 19 19 19 23 23 23 11 11 11 11 11 11 33 33 33 51 51 51 -+11 11 11 0 0 0 0 0 0 4 4 4 0 0 0 10 10 10 38 38 38 57 57 57 -+11 11 11 10 10 10 0 0 0 0 0 0 0 0 0 11 11 11 34 34 34 56 56 56 -+21 21 21 0 0 0 3 3 3 16 16 16 16 16 16 21 21 21 43 43 43 59 59 59 -+29 29 29 0 0 0 0 0 0 8 8 8 0 0 0 10 10 10 43 43 43 58 58 58 -+39 39 39 10 10 10 11 11 11 17 17 17 8 8 8 3 3 3 24 24 24 65 65 65 -+40 40 40 19 19 19 3 3 3 11 11 11 13 13 13 3 3 3 27 27 27 62 62 62 -+49 49 49 24 24 24 4 4 4 13 13 13 14 14 14 4 4 4 24 24 24 54 54 54 -+50 50 50 34 34 34 13 13 13 13 13 13 24 24 24 19 19 19 25 25 25 52 52 52 -+59 59 59 28 28 28 21 21 21 24 24 24 25 25 25 33 33 33 33 33 33 40 40 40 -+59 59 59 34 34 34 25 25 25 24 24 24 29 29 29 29 29 29 25 25 25 44 44 44 -+63 63 63 36 36 36 27 27 27 48 48 48 54 54 54 38 38 38 31 31 31 40 40 40 -+33 33 33 39 39 39 39 39 39 43 43 43 54 54 54 52 52 52 43 43 43 45 45 45 -+46 46 46 45 45 45 44 44 44 39 39 39 46 46 46 67 67 67 69 69 69 49 49 49 -+48 48 48 51 51 51 50 50 50 45 45 45 49 49 49 60 60 60 67 67 67 67 67 67 -+51 51 51 50 50 50 52 52 52 56 56 56 52 52 52 52 52 52 68 68 68 88 88 88 -+60 60 60 58 58 58 57 57 57 61 61 61 49 49 49 63 63 63 58 58 58 75 75 75 -+90 90 90 62 62 62 66 66 66 88 88 88 84 84 84 65 65 65 59 59 59 62 62 62 -+93 93 93 91 91 91 81 81 81 63 63 63 58 58 58 78 78 78 96 97 98 96 97 98 -+83 83 83 60 60 60 85 85 85 93 93 93 80 80 80 93 93 93 72 72 72 73 73 73 -+99 99 99 66 66 66 76 76 76 93 93 93 82 82 82 96 96 96 101 101 101 61 61 61 -+88 88 88 96 96 96 96 97 98 82 82 82 66 66 66 63 63 63 74 74 74 88 88 88 -+93 93 93 89 89 89 99 99 99 82 82 82 80 80 80 91 91 91 68 68 68 62 62 62 -+60 60 60 61 61 61 59 59 59 58 58 58 63 63 63 73 73 73 75 75 75 71 71 71 -+73 73 73 59 59 59 54 54 54 51 51 51 57 57 57 56 56 56 45 45 45 57 57 57 -+73 73 73 82 82 82 67 67 67 50 50 50 54 54 54 52 52 52 44 44 44 49 49 49 -+51 51 51 46 46 46 44 44 44 51 51 51 62 62 62 71 71 71 72 72 72 70 70 70 -+53 53 53 51 51 51 72 72 72 46 46 46 36 36 36 43 43 43 52 52 52 60 60 60 -+75 75 75 65 65 65 50 50 50 38 38 38 33 33 33 32 32 32 32 32 32 32 32 32 -+28 28 28 29 29 29 24 24 24 23 23 23 42 42 42 62 62 62 62 62 62 48 48 48 -+25 25 25 33 33 33 40 40 40 58 58 58 62 62 62 60 60 60 58 58 58 36 36 36 -+14 14 14 11 11 11 32 32 32 54 54 54 57 57 57 53 53 53 56 56 56 57 57 57 -+62 62 62 59 59 59 56 56 56 52 52 52 52 52 52 54 54 54 58 58 58 60 60 60 -+53 53 53 48 48 48 49 49 49 56 56 56 60 60 60 56 56 56 49 49 49 46 46 46 -+44 44 44 46 46 46 54 54 54 62 62 62 38 38 38 24 24 24 45 45 45 46 46 46 -+59 59 59 23 23 23 8 8 8 44 44 44 16 16 16 37 37 37 38 38 38 34 34 34 -+6 6 6 0 0 0 0 0 0 24 24 24 49 49 49 42 42 42 6 6 6 0 0 0 -+0 0 0 20 20 20 34 34 34 29 29 29 31 31 31 44 44 44 48 48 48 42 42 42 -+52 52 52 54 54 54 32 32 32 0 0 0 0 0 0 8 8 8 6 6 6 0 0 0 -+0 0 0 8 8 8 0 0 0 13 13 13 31 31 31 13 13 13 0 0 0 0 0 0 -+4 4 4 0 0 0 53 53 53 34 34 34 58 58 58 0 0 0 11 11 11 54 54 54 -+51 51 51 27 27 27 39 39 39 46 46 46 39 39 39 29 29 29 11 11 11 20 20 20 -+31 31 31 31 31 31 46 46 46 48 48 48 34 34 34 13 13 13 10 10 10 44 44 44 -+49 49 49 38 38 38 51 51 51 46 46 46 21 21 21 37 37 37 38 38 38 28 28 28 -+40 40 40 6 6 6 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 16 16 16 -+39 39 39 16 16 16 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 4 4 4 -+46 46 46 19 19 19 16 16 16 48 48 48 56 56 56 48 48 48 50 50 50 46 46 46 -+38 38 38 50 50 50 46 46 46 32 32 32 24 24 24 14 14 14 8 8 8 16 16 16 -+14 14 14 16 16 16 11 11 11 14 14 14 23 23 23 19 19 19 14 14 14 23 23 23 -+39 39 39 36 36 36 21 21 21 21 21 21 16 16 16 8 8 8 20 20 20 11 11 11 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 10 10 10 17 17 17 17 17 17 17 17 17 20 20 20 -+16 16 16 17 17 17 17 17 17 19 19 19 19 19 19 14 14 14 8 8 8 3 3 3 -+0 0 0 4 4 4 8 8 8 13 13 13 16 16 16 19 19 19 21 21 21 21 21 21 -+20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 -+19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 -+19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 -+19 19 19 14 14 14 13 13 13 13 13 13 4 4 4 0 0 0 19 19 19 42 42 42 -+23 23 23 8 8 8 0 0 0 8 8 8 21 21 21 16 16 16 21 21 21 44 44 44 -+44 44 44 24 24 24 8 8 8 19 19 19 24 24 24 6 6 6 10 10 10 37 37 37 -+50 50 50 14 14 14 0 0 0 3 3 3 3 3 3 0 0 0 11 11 11 34 34 34 -+56 56 56 17 17 17 0 0 0 3 3 3 6 6 6 0 0 0 13 13 13 33 33 33 -+54 54 54 28 28 28 0 0 0 3 3 3 23 23 23 21 21 21 21 21 21 36 36 36 -+62 62 62 37 37 37 6 6 6 0 0 0 4 4 4 0 0 0 10 10 10 42 42 42 -+62 62 62 48 48 48 23 23 23 8 8 8 8 8 8 4 4 4 10 10 10 28 28 28 -+67 67 67 49 49 49 19 19 19 0 0 0 11 11 11 14 14 14 13 13 13 20 20 20 -+65 65 65 52 52 52 23 23 23 0 0 0 11 11 11 19 19 19 13 13 13 11 11 11 -+54 54 54 51 51 51 25 25 25 11 11 11 29 29 29 29 29 29 17 17 17 21 21 21 -+53 53 53 52 52 52 38 38 38 20 20 20 23 23 23 39 39 39 37 37 37 21 21 21 -+42 42 42 63 63 63 40 40 40 19 19 19 31 31 31 38 38 38 38 38 38 29 29 29 -+44 44 44 59 59 59 56 56 56 57 57 57 42 42 42 33 33 33 36 36 36 34 34 34 -+38 38 38 34 34 34 44 44 44 60 60 60 62 62 62 49 49 49 39 39 39 39 39 39 -+48 48 48 37 37 37 37 37 37 56 56 56 69 69 69 67 67 67 56 56 56 49 49 49 -+49 49 49 52 52 52 51 51 51 50 50 50 61 61 61 73 73 73 68 68 68 51 51 51 -+57 57 57 54 54 54 58 58 58 57 57 57 57 57 57 72 72 72 82 82 82 72 72 72 -+62 62 62 61 61 61 56 56 56 59 59 59 66 66 66 61 61 61 71 71 71 96 96 96 -+59 59 59 68 68 68 62 62 62 65 65 65 94 94 94 90 90 90 66 66 66 87 87 87 -+89 89 89 74 74 74 88 88 88 85 85 85 85 85 85 101 101 101 88 88 88 75 75 75 -+87 87 87 91 91 91 92 92 92 92 92 92 74 74 74 68 68 68 91 91 91 99 99 99 -+72 72 72 69 69 69 61 61 61 81 81 81 99 99 99 99 99 99 101 101 101 96 97 98 -+96 96 96 93 93 93 96 97 98 87 87 87 60 60 60 62 62 62 80 80 80 81 81 81 -+93 93 93 99 99 99 72 72 72 89 89 89 90 90 90 74 74 74 93 93 93 75 75 75 -+60 60 60 65 65 65 66 66 66 58 58 58 60 60 60 62 62 62 67 67 67 89 89 89 -+88 88 88 67 67 67 58 58 58 67 67 67 71 71 71 71 71 71 73 73 73 74 74 74 -+82 82 82 87 87 87 87 87 87 77 77 77 72 72 72 75 75 75 77 77 77 75 75 75 -+76 76 76 73 73 73 68 68 68 63 63 63 59 59 59 59 59 59 67 67 67 76 76 76 -+81 81 81 78 78 78 81 81 81 59 59 59 56 56 56 39 39 39 42 42 42 40 40 40 -+39 39 39 53 53 53 69 69 69 70 70 70 56 56 56 38 38 38 29 29 29 32 32 32 -+28 28 28 29 29 29 31 31 31 27 27 27 24 24 24 32 32 32 52 52 52 70 70 70 -+67 67 67 68 68 68 59 59 59 44 44 44 31 31 31 25 25 25 40 40 40 63 63 63 -+50 50 50 17 17 17 6 6 6 38 38 38 61 61 61 59 59 59 52 52 52 56 56 56 -+57 57 57 58 58 58 58 58 58 56 56 56 51 51 51 51 51 51 54 54 54 59 59 59 -+59 59 59 52 52 52 50 50 50 49 49 49 51 51 51 59 59 59 60 60 60 51 51 51 -+50 50 50 44 44 44 52 52 52 57 57 57 51 51 51 53 53 53 45 45 45 19 19 19 -+8 8 8 50 50 50 32 32 32 21 21 21 42 42 42 19 19 19 10 10 10 56 56 56 -+31 31 31 0 0 0 6 6 6 31 31 31 44 44 44 52 52 52 33 33 33 0 0 0 -+4 4 4 19 19 19 20 20 20 31 31 31 49 49 49 39 39 39 32 32 32 52 52 52 -+54 54 54 31 31 31 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 6 6 6 -+0 0 0 3 3 3 17 17 17 24 24 24 14 14 14 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 28 28 28 57 57 57 50 50 50 13 13 13 13 13 13 50 50 50 -+50 50 50 31 31 31 50 50 50 21 21 21 0 0 0 3 3 3 0 0 0 20 20 20 -+24 24 24 25 25 25 11 11 11 19 19 19 48 48 48 52 52 52 40 40 40 42 42 42 -+38 38 38 19 19 19 33 33 33 46 46 46 51 51 51 54 54 54 50 50 50 53 53 53 -+44 44 44 17 17 17 0 0 0 3 3 3 0 0 0 0 0 0 19 19 19 40 40 40 -+10 10 10 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+13 13 13 39 39 39 32 32 32 21 21 21 42 42 42 50 50 50 42 42 42 45 45 45 -+31 31 31 28 28 28 48 48 48 59 59 59 45 45 45 36 36 36 28 28 28 6 6 6 -+17 17 17 17 17 17 13 13 13 14 14 14 19 19 19 19 19 19 27 27 27 42 42 42 -+32 32 32 20 20 20 13 13 13 19 19 19 23 23 23 19 19 19 11 11 11 10 10 10 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 0 0 0 -+0 0 0 0 0 0 4 4 4 14 14 14 20 20 20 19 19 19 17 17 17 20 20 20 -+14 14 14 19 19 19 20 20 20 16 16 16 10 10 10 6 6 6 8 8 8 11 11 11 -+13 13 13 14 14 14 17 17 17 19 19 19 20 20 20 20 20 20 19 19 19 19 19 19 -+19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 -+19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 -+19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 -+21 21 21 19 19 19 20 20 20 23 23 23 19 19 19 11 11 11 14 14 14 23 23 23 -+42 42 42 36 36 36 13 13 13 0 0 0 0 0 0 6 6 6 16 16 16 24 24 24 -+44 44 44 43 43 43 28 28 28 14 14 14 17 17 17 19 19 19 13 13 13 10 10 10 -+33 33 33 49 49 49 23 23 23 0 0 0 0 0 0 3 3 3 0 0 0 11 11 11 -+33 33 33 51 51 51 28 28 28 0 0 0 4 4 4 3 3 3 0 0 0 11 11 11 -+38 38 38 49 49 49 37 37 37 11 11 11 13 13 13 24 24 24 20 20 20 8 8 8 -+40 40 40 53 53 53 42 42 42 8 8 8 0 0 0 8 8 8 11 11 11 4 4 4 -+42 42 42 56 56 56 49 49 49 23 23 23 6 6 6 4 4 4 4 4 4 8 8 8 -+37 37 37 56 56 56 51 51 51 23 23 23 4 4 4 6 6 6 11 11 11 13 13 13 -+24 24 24 49 49 49 51 51 51 27 27 27 8 8 8 8 8 8 16 16 16 21 21 21 -+28 28 28 53 53 53 60 60 60 32 32 32 8 8 8 23 23 23 28 28 28 10 10 10 -+19 19 19 52 52 52 58 58 58 33 33 33 21 21 21 39 39 39 44 44 44 28 28 28 -+29 29 29 49 49 49 53 53 53 45 45 45 27 27 27 21 21 21 34 34 34 28 28 28 -+25 25 25 59 59 59 74 74 74 49 49 49 39 39 39 32 32 32 53 53 53 43 43 43 -+36 36 36 51 51 51 61 61 61 58 58 58 50 50 50 43 43 43 42 42 42 46 46 46 -+45 45 45 46 46 46 57 57 57 69 69 69 67 67 67 52 52 52 46 46 46 51 51 51 -+54 54 54 50 50 50 53 53 53 63 63 63 69 69 69 65 65 65 58 58 58 56 56 56 -+58 58 58 65 65 65 54 54 54 53 53 53 74 74 74 85 85 85 72 72 72 58 58 58 -+63 63 63 58 58 58 65 65 65 65 65 65 60 60 60 81 81 81 90 90 90 70 70 70 -+66 66 66 65 65 65 69 69 69 63 63 63 74 74 74 93 93 93 92 92 92 89 89 89 -+67 67 67 54 54 54 82 82 82 96 96 96 94 94 94 90 90 90 72 72 72 68 68 68 -+89 89 89 91 91 91 90 90 90 89 89 89 83 83 83 85 85 85 99 99 99 103 103 102 -+83 83 83 69 69 69 70 70 70 95 95 94 103 103 102 96 96 96 99 99 99 95 95 94 -+95 95 94 88 88 88 83 83 83 88 88 88 91 91 91 80 80 80 70 70 70 73 73 73 -+80 80 80 99 99 99 91 91 91 72 72 72 82 82 82 87 87 87 77 77 77 87 87 87 -+76 76 76 63 63 63 60 60 60 60 60 60 67 67 67 70 70 70 74 74 74 91 91 91 -+94 94 94 95 95 94 94 94 94 87 87 87 77 77 77 82 82 82 85 85 85 77 77 77 -+74 74 74 62 62 62 66 66 66 85 85 85 87 87 87 69 69 69 58 58 58 62 62 62 -+67 67 67 68 68 68 70 70 70 74 74 74 75 75 75 76 76 76 81 81 81 87 87 87 -+82 82 82 81 81 81 87 87 87 81 81 81 77 77 77 69 69 69 68 68 68 65 65 65 -+63 63 63 53 53 53 52 52 52 68 68 68 78 78 78 71 71 71 56 56 56 44 44 44 -+45 45 45 48 48 48 51 51 51 56 56 56 63 63 63 70 70 70 66 66 66 58 58 58 -+44 44 44 65 65 65 65 65 65 39 39 39 20 20 20 17 17 17 24 24 24 32 32 32 -+49 49 49 45 45 45 37 37 37 33 33 33 45 45 45 60 60 60 60 60 60 50 50 50 -+53 53 53 58 58 58 62 62 62 61 61 61 56 56 56 51 51 51 51 51 51 52 52 52 -+61 61 61 56 56 56 53 53 53 50 50 50 46 46 46 52 52 52 58 58 58 56 56 56 -+52 52 52 46 46 46 51 51 51 52 52 52 46 46 46 45 45 45 38 38 38 21 21 21 -+8 8 8 32 32 32 39 39 39 32 32 32 43 43 43 32 32 32 0 0 0 20 20 20 -+43 43 43 42 42 42 17 17 17 40 40 40 36 36 36 17 17 17 45 45 45 28 28 28 -+8 8 8 36 36 36 29 29 29 31 31 31 53 53 53 39 39 39 21 21 21 49 49 49 -+34 34 34 14 14 14 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 -+4 4 4 17 17 17 23 23 23 14 14 14 4 4 4 4 4 4 4 4 4 0 0 0 -+4 4 4 8 8 8 19 19 19 38 38 38 52 52 52 48 48 48 43 43 43 50 50 50 -+42 42 42 19 19 19 33 33 33 21 21 21 8 8 8 24 24 24 20 20 20 27 27 27 -+28 28 28 34 34 34 34 34 34 40 40 40 54 54 54 54 54 54 45 45 45 46 46 46 -+49 49 49 31 31 31 44 44 44 49 49 49 23 23 23 14 14 14 36 36 36 54 54 54 -+53 53 53 11 11 11 0 0 0 3 3 3 0 0 0 21 21 21 37 37 37 8 8 8 -+8 8 8 4 4 4 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 0 0 0 -+6 6 6 28 28 28 28 28 28 28 28 28 46 46 46 49 49 49 40 40 40 43 43 43 -+44 44 44 20 20 20 24 24 24 45 45 45 48 48 48 38 38 38 36 36 36 36 36 36 -+8 8 8 11 11 11 6 6 6 10 10 10 24 24 24 32 32 32 32 32 32 34 34 34 -+14 14 14 13 13 13 14 14 14 16 16 16 16 16 16 16 16 16 20 20 20 27 27 27 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 -+0 0 0 3 3 3 11 11 11 19 19 19 21 21 21 19 19 19 19 19 19 20 20 20 -+17 17 17 17 17 17 14 14 14 8 8 8 4 4 4 6 6 6 11 11 11 16 16 16 -+17 17 17 19 19 19 20 20 20 21 21 21 23 23 23 21 21 21 20 20 20 19 19 19 -+19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 -+20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 -+20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 -+19 19 19 19 19 19 20 20 20 23 23 23 24 24 24 21 21 21 17 17 17 13 13 13 -+33 33 33 40 40 40 31 31 31 6 6 6 0 0 0 0 0 0 4 4 4 4 4 4 -+23 23 23 42 42 42 42 42 42 23 23 23 17 17 17 24 24 24 20 20 20 8 8 8 -+19 19 19 39 39 39 40 40 40 16 16 16 0 0 0 0 0 0 3 3 3 0 0 0 -+10 10 10 38 38 38 48 48 48 25 25 25 0 0 0 0 0 0 3 3 3 0 0 0 -+6 6 6 44 44 44 53 53 53 33 33 33 20 20 20 24 24 24 17 17 17 0 0 0 -+0 0 0 46 46 46 61 61 61 38 38 38 11 11 11 3 3 3 0 0 0 0 0 0 -+4 4 4 42 42 42 60 60 60 49 49 49 23 23 23 0 0 0 0 0 0 11 11 11 -+3 3 3 42 42 42 60 60 60 48 48 48 24 24 24 8 8 8 8 8 8 16 16 16 -+0 0 0 37 37 37 59 59 59 52 52 52 28 28 28 3 3 3 4 4 4 20 20 20 -+16 16 16 32 32 32 54 54 54 57 57 57 33 33 33 16 16 16 19 19 19 23 23 23 -+17 17 17 37 37 37 54 54 54 56 56 56 45 45 45 34 34 34 31 31 31 32 32 32 -+23 23 23 34 34 34 50 50 50 60 60 60 44 44 44 24 24 24 29 29 29 34 34 34 -+44 44 44 61 61 61 56 56 56 69 69 69 43 43 43 42 42 42 33 33 33 42 42 42 -+40 40 40 62 62 62 65 65 65 49 49 49 43 43 43 45 45 45 48 48 48 51 51 51 -+44 44 44 57 57 57 69 69 69 70 70 70 59 59 59 49 49 49 50 50 50 57 57 57 -+53 53 53 56 56 56 65 65 65 73 73 73 69 69 69 58 58 58 56 56 56 61 61 61 -+65 65 65 59 59 59 56 56 56 72 72 72 89 89 89 77 77 77 59 59 59 60 60 60 -+61 61 61 67 67 67 65 65 65 65 65 65 81 81 81 91 91 91 80 80 80 62 62 62 -+70 70 70 65 65 65 71 71 71 68 68 68 71 71 71 93 93 93 103 103 102 94 94 94 -+67 67 67 61 61 61 90 90 90 105 105 105 99 99 99 91 91 91 76 76 76 75 75 75 -+91 91 91 87 87 87 90 90 90 96 96 96 99 99 99 89 89 89 76 76 76 78 78 78 -+101 101 101 89 89 89 95 95 94 109 110 110 101 101 101 96 96 96 105 105 105 103 103 102 -+93 93 93 71 71 71 62 62 62 87 87 87 105 105 105 94 94 94 74 74 74 69 69 69 -+67 67 67 78 78 78 103 103 102 91 91 91 78 78 78 88 88 88 81 81 81 75 75 75 -+95 95 94 82 82 82 84 84 84 87 87 87 87 87 87 88 88 88 87 87 87 89 89 89 -+76 76 76 87 87 87 91 91 91 74 74 74 56 56 56 56 56 56 61 61 61 54 54 54 -+57 57 57 54 54 54 58 58 58 71 71 71 82 82 82 78 78 78 65 65 65 51 51 51 -+51 51 51 49 49 49 49 49 49 51 51 51 51 51 51 49 49 49 50 50 50 53 53 53 -+65 65 65 66 66 66 73 73 73 87 87 87 78 78 78 82 82 82 83 83 83 80 80 80 -+76 76 76 66 66 66 63 63 63 74 74 74 77 77 77 70 70 70 67 67 67 72 72 72 -+73 73 73 73 73 73 65 65 65 49 49 49 42 42 42 42 42 42 34 34 34 20 20 20 -+28 28 28 32 32 32 45 45 45 63 63 63 59 59 59 28 28 28 11 11 11 27 27 27 -+45 45 45 59 59 59 63 63 63 52 52 52 44 44 44 50 50 50 57 57 57 57 57 57 -+51 51 51 53 53 53 57 57 57 60 60 60 60 60 60 58 58 58 54 54 54 51 51 51 -+59 59 59 57 57 57 59 59 59 57 57 57 48 48 48 46 46 46 53 53 53 57 57 57 -+63 63 63 52 52 52 40 40 40 34 34 34 27 27 27 20 20 20 17 17 17 16 16 16 -+20 20 20 3 3 3 23 23 23 16 16 16 27 27 27 45 45 45 14 14 14 0 0 0 -+23 23 23 40 40 40 48 48 48 33 33 33 6 6 6 0 0 0 24 24 24 43 43 43 -+27 27 27 24 24 24 33 33 33 43 43 43 43 43 43 49 49 49 54 54 54 49 49 49 -+8 8 8 0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 3 3 3 -+19 19 19 21 21 21 16 16 16 3 3 3 0 0 0 4 4 4 8 8 8 3 3 3 -+4 4 4 0 0 0 4 4 4 34 34 34 53 53 53 45 45 45 32 32 32 36 36 36 -+45 45 45 37 37 37 53 53 53 56 56 56 44 44 44 39 39 39 36 36 36 38 38 38 -+28 28 28 28 28 28 27 27 27 27 27 27 31 31 31 34 34 34 36 36 36 37 37 37 -+51 51 51 48 48 48 50 50 50 52 52 52 31 31 31 0 0 0 19 19 19 46 46 46 -+52 52 52 36 36 36 6 6 6 0 0 0 23 23 23 36 36 36 20 20 20 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 3 3 3 -+0 0 0 10 10 10 21 21 21 32 32 32 42 42 42 39 39 39 31 31 31 32 32 32 -+48 48 48 23 23 23 17 17 17 40 40 40 57 57 57 49 49 49 38 38 38 36 36 36 -+33 33 33 20 20 20 3 3 3 8 8 8 29 29 29 34 34 34 28 28 28 25 25 25 -+10 10 10 13 13 13 13 13 13 10 10 10 11 11 11 21 21 21 32 32 32 38 38 38 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 10 10 10 17 17 17 21 21 21 21 21 21 19 19 19 19 19 19 20 20 20 -+21 21 21 13 13 13 4 4 4 3 3 3 11 11 11 17 17 17 17 17 17 16 16 16 -+20 20 20 20 20 20 20 20 20 19 19 19 17 17 17 16 16 16 14 14 14 13 13 13 -+14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 -+11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 -+11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 -+6 6 6 10 10 10 10 10 10 10 10 10 16 16 16 23 23 23 23 23 23 19 19 19 -+14 14 14 27 27 27 37 37 37 37 37 37 23 23 23 3 3 3 0 0 0 3 3 3 -+0 0 0 21 21 21 39 39 39 39 39 39 28 28 28 17 17 17 19 19 19 27 27 27 -+14 14 14 10 10 10 32 32 32 43 43 43 19 19 19 0 0 0 3 3 3 0 0 0 -+0 0 0 4 4 4 37 37 37 50 50 50 23 23 23 0 0 0 3 3 3 3 3 3 -+0 0 0 16 16 16 39 39 39 51 51 51 43 43 43 23 23 23 11 11 11 14 14 14 -+0 0 0 13 13 13 42 42 42 60 60 60 45 45 45 4 4 4 0 0 0 13 13 13 -+0 0 0 11 11 11 38 38 38 58 58 58 50 50 50 19 19 19 3 3 3 16 16 16 -+6 6 6 16 16 16 38 38 38 59 59 59 52 52 52 24 24 24 6 6 6 14 14 14 -+8 8 8 8 8 8 29 29 29 56 56 56 56 56 56 29 29 29 11 11 11 19 19 19 -+25 25 25 14 14 14 23 23 23 57 57 57 68 68 68 32 32 32 6 6 6 31 31 31 -+27 27 27 16 16 16 28 28 28 56 56 56 66 66 66 49 49 49 32 32 32 29 29 29 -+32 32 32 34 34 34 32 32 32 50 50 50 66 66 66 48 48 48 32 32 32 45 45 45 -+62 62 62 32 32 32 40 40 40 51 51 51 78 78 78 46 46 46 46 46 46 40 40 40 -+59 59 59 63 63 63 52 52 52 40 40 40 46 46 46 51 51 51 46 46 46 46 46 46 -+57 57 57 67 67 67 67 67 67 56 56 56 50 50 50 57 57 57 60 60 60 56 56 56 -+52 52 52 69 69 69 77 77 77 70 70 70 60 60 60 59 59 59 62 62 62 62 62 62 -+63 63 63 58 58 58 74 74 74 90 90 90 77 77 77 62 62 62 65 65 65 70 70 70 -+66 66 66 69 69 69 67 67 67 80 80 80 94 94 94 80 80 80 62 62 62 71 71 71 -+69 69 69 70 70 70 69 69 69 76 76 76 90 90 90 87 87 87 84 84 84 96 96 96 -+96 97 98 94 94 94 99 99 99 87 87 87 80 80 80 92 92 92 96 97 98 99 99 99 -+77 77 77 70 70 70 83 83 83 101 101 101 112 112 113 95 95 94 70 70 70 80 80 80 -+103 103 102 105 105 105 109 110 110 99 99 99 82 82 82 87 87 87 103 103 102 101 101 101 -+105 105 105 75 75 75 70 70 70 87 87 87 91 91 91 92 92 92 88 88 88 72 72 72 -+71 71 71 67 67 67 85 85 85 103 103 102 87 87 87 84 84 84 99 99 99 87 87 87 -+101 101 101 94 94 94 103 103 102 93 93 93 75 75 75 73 73 73 69 69 69 61 61 61 -+69 69 69 74 74 74 87 87 87 87 87 87 72 72 72 63 63 63 65 65 65 67 67 67 -+57 57 57 66 66 66 63 63 63 53 53 53 63 63 63 83 83 83 82 82 82 63 63 63 -+65 65 65 58 58 58 54 54 54 54 54 54 53 53 53 50 50 50 49 49 49 50 50 50 -+49 49 49 50 50 50 54 54 54 76 76 76 60 60 60 66 66 66 71 71 71 70 70 70 -+81 81 81 61 61 61 44 44 44 43 43 43 46 46 46 43 43 43 40 40 40 42 42 42 -+58 58 58 68 68 68 66 66 66 44 44 44 23 23 23 19 19 19 28 28 28 34 34 34 -+33 33 33 31 31 31 31 31 31 43 43 43 59 59 59 60 60 60 49 49 49 44 44 44 -+57 57 57 52 52 52 56 56 56 59 59 59 43 43 43 23 23 23 37 37 37 65 65 65 -+59 59 59 54 54 54 51 51 51 52 52 52 58 58 58 60 60 60 58 58 58 53 53 53 -+52 52 52 52 52 52 59 59 59 62 62 62 54 54 54 50 50 50 52 52 52 52 52 52 -+62 62 62 44 44 44 23 23 23 14 14 14 16 16 16 16 16 16 23 23 23 34 34 34 -+40 40 40 16 16 16 23 23 23 13 13 13 11 11 11 33 33 33 23 23 23 4 4 4 -+0 0 0 37 37 37 65 65 65 36 36 36 6 6 6 8 8 8 10 10 10 34 34 34 -+36 36 36 25 25 25 37 37 37 34 34 34 8 8 8 23 23 23 45 45 45 38 38 38 -+0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 4 4 4 16 16 16 -+23 23 23 10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 -+0 0 0 3 3 3 21 21 21 45 45 45 53 53 53 42 42 42 37 37 37 50 50 50 -+51 51 51 40 40 40 38 38 38 37 37 37 19 19 19 3 3 3 10 10 10 16 16 16 -+27 27 27 23 23 23 25 25 25 28 28 28 24 24 24 24 24 24 19 19 19 0 0 0 -+31 31 31 46 46 46 25 25 25 36 36 36 59 59 59 39 39 39 31 31 31 53 53 53 -+50 50 50 52 52 52 31 31 31 19 19 19 34 34 34 21 21 21 0 0 0 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 17 17 17 36 36 36 43 43 43 40 40 40 36 36 36 32 32 32 31 31 31 -+27 27 27 24 24 24 16 16 16 24 24 24 46 46 46 50 50 50 31 31 31 11 11 11 -+48 48 48 29 29 29 14 14 14 24 24 24 39 39 39 32 32 32 17 17 17 16 16 16 -+25 25 25 20 20 20 11 11 11 8 8 8 19 19 19 32 32 32 37 37 37 33 33 33 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+11 11 11 16 16 16 20 20 20 20 20 20 19 19 19 19 19 19 20 20 20 20 20 20 -+16 16 16 11 11 11 6 6 6 10 10 10 17 17 17 23 23 23 21 21 21 19 19 19 -+21 21 21 19 19 19 16 16 16 11 11 11 8 8 8 6 6 6 4 4 4 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 6 6 6 6 6 6 0 0 0 0 0 0 11 11 11 17 17 17 16 16 16 -+19 19 19 20 20 20 32 32 32 42 42 42 34 34 34 14 14 14 4 4 4 6 6 6 -+0 0 0 0 0 0 21 21 21 42 42 42 39 39 39 23 23 23 16 16 16 21 21 21 -+14 14 14 16 16 16 14 14 14 32 32 32 44 44 44 19 19 19 0 0 0 3 3 3 -+0 0 0 6 6 6 13 13 13 34 34 34 50 50 50 24 24 24 0 0 0 0 0 0 -+4 4 4 0 0 0 14 14 14 44 44 44 53 53 53 38 38 38 16 16 16 0 0 0 -+11 11 11 0 0 0 8 8 8 44 44 44 57 57 57 38 38 38 13 13 13 0 0 0 -+14 14 14 0 0 0 4 4 4 38 38 38 58 58 58 51 51 51 25 25 25 0 0 0 -+14 14 14 4 4 4 17 17 17 44 44 44 58 58 58 48 48 48 25 25 25 8 8 8 -+20 20 20 4 4 4 10 10 10 37 37 37 56 56 56 53 53 53 32 32 32 11 11 11 -+23 23 23 21 21 21 19 19 19 36 36 36 60 60 60 58 58 58 33 33 33 17 17 17 -+24 24 24 25 25 25 25 25 25 34 34 34 54 54 54 67 67 67 49 49 49 19 19 19 -+28 28 28 33 33 33 25 25 25 29 29 29 59 59 59 68 68 68 58 58 58 59 59 59 -+44 44 44 42 42 42 25 25 25 51 51 51 51 51 51 76 76 76 59 59 59 57 57 57 -+65 65 65 56 56 56 43 43 43 44 44 44 51 51 51 49 49 49 45 45 45 53 53 53 -+73 73 73 69 69 69 59 59 59 51 51 51 51 51 51 57 57 57 58 58 58 56 56 56 -+68 68 68 77 77 77 76 76 76 62 62 62 58 58 58 66 66 66 67 67 67 60 60 60 -+62 62 62 78 78 78 91 91 91 78 78 78 59 59 59 66 66 66 75 75 75 68 68 68 -+72 72 72 66 66 66 84 84 84 96 96 96 78 78 78 66 66 66 70 70 70 72 72 72 -+71 71 71 76 76 76 72 72 72 84 84 84 99 99 99 82 82 82 70 70 70 88 88 88 -+99 99 99 99 99 99 94 94 94 75 75 75 71 71 71 90 90 90 96 97 98 93 93 93 -+76 76 76 73 73 73 84 84 84 94 94 94 105 105 105 105 105 105 94 94 94 105 105 105 -+101 101 101 105 105 105 105 105 105 93 93 93 85 85 85 87 87 87 88 88 88 88 88 88 -+105 105 105 93 93 93 91 91 91 87 87 87 76 76 76 88 88 88 101 101 101 93 93 93 -+74 74 74 75 75 75 76 76 76 94 94 94 109 110 110 101 101 101 95 95 94 101 101 101 -+93 93 93 84 84 84 93 93 93 87 87 87 67 67 67 66 66 66 68 68 68 67 67 67 -+72 72 72 69 69 69 82 82 82 94 94 94 89 89 89 75 75 75 67 67 67 63 63 63 -+65 65 65 63 63 63 60 60 60 57 57 57 60 60 60 69 69 69 78 78 78 85 85 85 -+63 63 63 57 57 57 53 53 53 53 53 53 54 54 54 52 52 52 52 52 52 53 53 53 -+51 51 51 52 52 52 54 54 54 76 76 76 52 52 52 48 48 48 52 52 52 52 52 52 -+56 56 56 69 69 69 78 78 78 72 72 72 53 53 53 38 38 38 37 37 37 42 42 42 -+39 39 39 51 51 51 62 62 62 63 63 63 52 52 52 39 39 39 32 32 32 29 29 29 -+29 29 29 25 25 25 21 21 21 33 33 33 54 54 54 63 63 63 65 65 65 69 69 69 -+42 42 42 20 20 20 20 20 20 43 43 43 50 50 50 37 37 37 38 38 38 54 54 54 -+60 60 60 58 58 58 54 54 54 53 53 53 54 54 54 54 54 54 56 56 56 56 56 56 -+51 51 51 49 49 49 53 53 53 59 59 59 58 58 58 57 57 57 54 54 54 46 46 46 -+37 37 37 21 21 21 11 11 11 21 21 21 36 36 36 42 42 42 48 48 48 58 58 58 -+49 49 49 48 48 48 49 49 49 40 40 40 21 21 21 11 11 11 13 13 13 6 6 6 -+17 17 17 56 56 56 42 42 42 44 44 44 37 37 37 16 16 16 32 32 32 24 24 24 -+17 17 17 46 46 46 40 40 40 14 14 14 3 3 3 0 0 0 14 14 14 46 46 46 -+19 19 19 11 11 11 3 3 3 0 0 0 0 0 0 6 6 6 16 16 16 24 24 24 -+14 14 14 3 3 3 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 3 3 3 -+3 3 3 29 29 29 39 39 39 34 34 34 36 36 36 40 40 40 43 43 43 44 44 44 -+52 52 52 38 38 38 27 27 27 37 37 37 39 39 39 37 37 37 44 44 44 44 44 44 -+29 29 29 29 29 29 40 40 40 46 46 46 44 44 44 49 49 49 49 49 49 36 36 36 -+32 32 32 46 46 46 13 13 13 16 16 16 56 56 56 52 52 52 43 43 43 53 53 53 -+48 48 48 46 46 46 49 49 49 39 39 39 14 14 14 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 -+11 11 11 28 28 28 43 43 43 39 39 39 28 28 28 25 25 25 27 27 27 23 23 23 -+25 25 25 34 34 34 24 24 24 19 19 19 38 38 38 50 50 50 39 39 39 25 25 25 -+20 20 20 29 29 29 36 36 36 39 39 39 40 40 40 28 28 28 13 13 13 11 11 11 -+24 24 24 21 21 21 17 17 17 19 19 19 28 28 28 36 36 36 31 31 31 17 17 17 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 6 6 6 -+16 16 16 19 19 19 20 20 20 19 19 19 17 17 17 19 19 19 19 19 19 17 17 17 -+4 4 4 11 11 11 17 17 17 19 19 19 19 19 19 19 19 19 19 19 19 20 20 20 -+10 10 10 10 10 10 8 8 8 8 8 8 8 8 8 10 10 10 11 11 11 13 13 13 -+21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 -+13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 -+13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 -+4 4 4 13 13 13 14 14 14 6 6 6 0 0 0 3 3 3 4 4 4 3 3 3 -+14 14 14 13 13 13 20 20 20 29 29 29 34 34 34 36 36 36 25 25 25 8 8 8 -+13 13 13 0 0 0 0 0 0 20 20 20 38 38 38 42 42 42 29 29 29 10 10 10 -+19 19 19 16 16 16 11 11 11 16 16 16 32 32 32 40 40 40 24 24 24 0 0 0 -+6 6 6 0 0 0 0 0 0 11 11 11 36 36 36 46 46 46 28 28 28 0 0 0 -+10 10 10 0 0 0 0 0 0 14 14 14 42 42 42 58 58 58 38 38 38 0 0 0 -+0 0 0 0 0 0 4 4 4 10 10 10 34 34 34 58 58 58 45 45 45 6 6 6 -+4 4 4 6 6 6 6 6 6 10 10 10 36 36 36 61 61 61 52 52 52 16 16 16 -+6 6 6 10 10 10 11 11 11 17 17 17 38 38 38 60 60 60 52 52 52 23 23 23 -+10 10 10 19 19 19 17 17 17 13 13 13 32 32 32 60 60 60 57 57 57 25 25 25 -+13 13 13 20 20 20 29 29 29 25 25 25 31 31 31 59 59 59 63 63 63 31 31 31 -+19 19 19 29 29 29 29 29 29 25 25 25 40 40 40 61 61 61 59 59 59 40 40 40 -+33 33 33 39 39 39 42 42 42 27 27 27 34 34 34 65 65 65 69 69 69 57 57 57 -+37 37 37 38 38 38 53 53 53 29 29 29 48 48 48 56 56 56 77 77 77 80 80 80 -+53 53 53 43 43 43 44 44 44 52 52 52 53 53 53 50 50 50 59 59 59 75 75 75 -+71 71 71 58 58 58 52 52 52 60 60 60 61 61 61 54 54 54 58 58 58 70 70 70 -+87 87 87 76 76 76 65 65 65 61 61 61 65 65 65 68 68 68 67 67 67 62 62 62 -+78 78 78 90 90 90 82 82 82 65 65 65 67 67 67 73 73 73 70 70 70 69 69 69 -+69 69 69 87 87 87 96 96 96 85 85 85 69 69 69 71 71 71 77 77 77 74 74 74 -+78 78 78 82 82 82 80 80 80 85 85 85 87 87 87 82 82 82 82 82 82 80 80 80 -+82 82 82 83 83 83 85 85 85 85 85 85 84 84 84 87 87 87 84 84 84 81 81 81 -+83 83 83 90 90 90 93 93 93 87 87 87 94 94 94 105 105 105 109 110 110 109 110 110 -+101 101 101 96 97 98 96 97 98 101 101 101 105 105 105 99 99 99 80 80 80 77 77 77 -+92 92 92 105 105 105 105 104 105 85 85 85 74 74 74 80 80 80 91 91 91 101 101 101 -+95 95 94 82 82 82 96 97 98 94 94 94 105 105 105 117 117 117 93 93 93 93 93 93 -+99 99 99 83 83 83 93 93 93 101 101 101 94 94 94 92 92 92 92 92 92 93 93 93 -+101 101 101 96 96 96 96 97 98 101 101 101 101 101 101 103 103 102 101 101 101 92 92 92 -+96 96 96 92 92 92 90 90 90 88 88 88 83 83 83 78 78 78 85 85 85 95 95 94 -+92 92 92 81 81 81 69 69 69 61 61 61 56 56 56 52 52 52 52 52 52 54 54 54 -+52 52 52 53 53 53 57 57 57 78 78 78 63 63 63 46 46 46 50 50 50 46 46 46 -+49 49 49 49 49 49 51 51 51 59 59 59 72 72 72 76 76 76 62 62 62 43 43 43 -+39 39 39 33 33 33 37 37 37 52 52 52 66 66 66 62 62 62 46 46 46 31 31 31 -+28 28 28 29 29 29 43 43 43 61 61 61 63 63 63 44 44 44 40 40 40 61 61 61 -+56 56 56 38 38 38 20 20 20 24 24 24 43 43 43 54 54 54 44 44 44 24 24 24 -+45 45 45 53 53 53 60 60 60 59 59 59 54 54 54 52 52 52 58 58 58 63 63 63 -+57 57 57 51 51 51 50 50 50 51 51 51 54 54 54 59 59 59 56 56 56 42 42 42 -+17 17 17 13 13 13 24 24 24 43 43 43 50 50 50 48 48 48 44 44 44 44 44 44 -+42 42 42 48 48 48 42 42 42 43 43 43 38 38 38 23 23 23 17 17 17 6 6 6 -+51 51 51 38 38 38 8 8 8 21 21 21 37 37 37 28 28 28 31 31 31 32 32 32 -+31 31 31 45 45 45 37 37 37 17 17 17 11 11 11 6 6 6 8 8 8 24 24 24 -+33 33 33 17 17 17 0 0 0 0 0 0 13 13 13 23 23 23 23 23 23 20 20 20 -+4 4 4 11 11 11 11 11 11 6 6 6 8 8 8 14 14 14 11 11 11 3 3 3 -+14 14 14 25 25 25 25 25 25 23 23 23 27 27 27 25 25 25 17 17 17 11 11 11 -+23 23 23 16 16 16 14 14 14 24 24 24 25 25 25 19 19 19 19 19 19 16 16 16 -+20 20 20 25 25 25 33 33 33 27 27 27 13 13 13 17 17 17 25 25 25 20 20 20 -+20 20 20 24 24 24 6 6 6 0 0 0 6 6 6 10 10 10 11 11 11 10 10 10 -+13 13 13 32 32 32 34 34 34 19 19 19 10 10 10 13 13 13 17 17 17 17 17 17 -+11 11 11 11 11 11 13 13 13 11 11 11 10 10 10 8 8 8 10 10 10 11 11 11 -+17 17 17 29 29 29 34 34 34 24 24 24 10 10 10 10 10 10 13 13 13 11 11 11 -+13 13 13 16 16 16 8 8 8 4 4 4 16 16 16 17 17 17 11 11 11 13 13 13 -+0 0 0 36 36 36 48 48 48 32 32 32 17 17 17 16 16 16 13 13 13 11 11 11 -+4 4 4 16 16 16 27 27 27 32 32 32 33 33 33 28 28 28 17 17 17 6 6 6 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 8 8 8 13 13 13 -+16 16 16 19 19 19 20 20 20 17 17 17 19 19 19 20 20 20 16 16 16 10 10 10 -+3 3 3 11 11 11 20 20 20 23 23 23 20 20 20 16 16 16 14 14 14 14 14 14 -+4 4 4 6 6 6 10 10 10 14 14 14 17 17 17 19 19 19 20 20 20 20 20 20 -+16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 -+19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 -+19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 -+13 13 13 16 16 16 19 19 19 16 16 16 13 13 13 10 10 10 6 6 6 3 3 3 -+0 0 0 0 0 0 8 8 8 14 14 14 24 24 24 39 39 39 38 38 38 20 20 20 -+16 16 16 0 0 0 0 0 0 0 0 0 20 20 20 42 42 42 43 43 43 24 24 24 -+21 21 21 8 8 8 17 17 17 16 16 16 4 4 4 36 36 36 48 48 48 14 14 14 -+10 10 10 0 0 0 0 0 0 4 4 4 3 3 3 38 38 38 52 52 52 20 20 20 -+8 8 8 0 0 0 0 0 0 0 0 0 23 23 23 51 51 51 52 52 52 28 28 28 -+0 0 0 8 8 8 11 11 11 0 0 0 6 6 6 38 38 38 51 51 51 39 39 39 -+6 6 6 11 11 11 13 13 13 3 3 3 11 11 11 40 40 40 57 57 57 50 50 50 -+19 19 19 14 14 14 10 10 10 6 6 6 17 17 17 44 44 44 56 56 56 49 49 49 -+16 16 16 17 17 17 16 16 16 11 11 11 19 19 19 44 44 44 60 60 60 56 56 56 -+29 29 29 20 20 20 28 28 28 29 29 29 20 20 20 37 37 37 59 59 59 57 57 57 -+29 29 29 21 21 21 21 21 21 33 33 33 43 43 43 48 48 48 58 58 58 71 71 71 -+38 38 38 29 29 29 36 36 36 36 36 36 44 44 44 63 63 63 69 69 69 72 72 72 -+49 49 49 44 44 44 39 39 39 49 49 49 43 43 43 65 65 65 68 68 68 89 89 89 -+57 57 57 48 48 48 50 50 50 54 54 54 53 53 53 62 62 62 74 74 74 76 76 76 -+59 59 59 52 52 52 54 54 54 63 63 63 65 65 65 60 60 60 69 69 69 84 84 84 -+83 83 83 69 69 69 60 60 60 66 66 66 70 70 70 67 67 67 70 70 70 77 77 77 -+91 91 91 81 81 81 67 67 67 70 70 70 78 78 78 71 71 71 66 66 66 78 78 78 -+78 78 78 96 97 98 88 88 88 71 71 71 78 78 78 83 83 83 77 77 77 83 83 83 -+84 84 84 87 87 87 83 83 83 84 84 84 82 82 82 87 87 87 96 96 96 83 83 83 -+87 87 87 84 84 84 84 84 84 89 89 89 88 88 88 84 84 84 87 87 87 92 92 92 -+84 84 84 90 90 90 89 89 89 87 87 87 89 89 89 103 103 102 115 116 115 109 110 110 -+99 99 99 84 84 84 89 89 89 99 99 99 103 103 102 101 101 101 85 85 85 80 80 80 -+94 94 94 109 110 110 112 112 113 96 97 98 82 82 82 74 74 74 81 81 81 94 94 94 -+117 117 117 99 99 99 105 105 105 92 92 92 88 88 88 112 112 113 109 110 110 99 99 99 -+105 105 105 99 99 99 103 103 102 103 103 102 101 101 101 103 103 102 94 94 94 82 82 82 -+81 81 81 76 76 76 73 73 73 71 71 71 74 74 74 90 90 90 103 103 102 103 103 102 -+81 81 81 80 80 80 77 77 77 75 75 75 77 77 77 83 83 83 87 87 87 85 85 85 -+99 99 99 92 92 92 84 84 84 77 77 77 71 71 71 65 65 65 61 61 61 61 61 61 -+54 54 54 51 51 51 52 52 52 72 72 72 76 76 76 52 52 52 56 56 56 48 48 48 -+48 48 48 45 45 45 42 42 42 40 40 40 46 46 46 58 58 58 68 68 68 74 74 74 -+62 62 62 52 52 52 39 39 39 37 37 37 48 48 48 59 59 59 60 60 60 56 56 56 -+52 52 52 68 68 68 66 66 66 46 46 46 37 37 37 34 34 34 29 29 29 25 25 25 -+59 59 59 57 57 57 40 40 40 20 20 20 21 21 21 42 42 42 53 53 53 50 50 50 -+44 44 44 51 51 51 58 58 58 59 59 59 57 57 57 54 54 54 58 58 58 62 62 62 -+60 60 60 57 57 57 53 53 53 49 49 49 50 50 50 58 58 58 52 52 52 31 31 31 -+17 17 17 20 20 20 40 40 40 53 53 53 44 44 44 34 34 34 31 31 31 25 25 25 -+39 39 39 37 37 37 33 33 33 31 31 31 40 40 40 45 45 45 28 28 28 13 13 13 -+51 51 51 19 19 19 11 11 11 6 6 6 24 24 24 34 34 34 19 19 19 32 32 32 -+23 23 23 6 6 6 10 10 10 14 14 14 8 8 8 17 17 17 23 23 23 4 4 4 -+23 23 23 14 14 14 6 6 6 11 11 11 24 24 24 28 28 28 21 21 21 11 11 11 -+6 6 6 14 14 14 17 17 17 11 11 11 11 11 11 16 16 16 16 16 16 11 11 11 -+11 11 11 13 13 13 17 17 17 28 28 28 32 32 32 19 19 19 6 6 6 13 13 13 -+14 14 14 14 14 14 17 17 17 13 13 13 8 8 8 8 8 8 11 11 11 21 21 21 -+13 13 13 24 24 24 32 32 32 24 24 24 13 13 13 13 13 13 14 14 14 8 8 8 -+14 14 14 13 13 13 21 21 21 17 17 17 8 8 8 13 13 13 16 16 16 17 17 17 -+27 27 27 42 42 42 23 23 23 0 0 0 14 14 14 13 13 13 0 0 0 10 10 10 -+14 14 14 14 14 14 16 16 16 14 14 14 13 13 13 13 13 13 16 16 16 19 19 19 -+36 36 36 34 34 34 25 25 25 16 16 16 14 14 14 13 13 13 13 13 13 14 14 14 -+13 13 13 10 10 10 11 11 11 16 16 16 16 16 16 4 4 4 0 0 0 11 11 11 -+23 23 23 39 39 39 34 34 34 13 13 13 3 3 3 6 6 6 11 11 11 16 16 16 -+3 3 3 17 17 17 32 32 32 37 37 37 29 29 29 16 16 16 10 10 10 11 11 11 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 10 10 10 16 16 16 -+14 14 14 19 19 19 20 20 20 19 19 19 20 20 20 20 20 20 14 14 14 4 4 4 -+10 10 10 13 13 13 17 17 17 21 21 21 21 21 21 17 17 17 10 10 10 3 3 3 -+17 17 17 19 19 19 21 21 21 23 23 23 23 23 23 20 20 20 16 16 16 13 13 13 -+14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 -+11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 -+11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 -+17 17 17 16 16 16 16 16 16 19 19 19 21 21 21 21 21 21 19 19 19 17 17 17 -+4 4 4 0 0 0 3 3 3 3 3 3 4 4 4 23 23 23 37 37 37 37 37 37 -+17 17 17 14 14 14 11 11 11 0 0 0 0 0 0 21 21 21 43 43 43 44 44 44 -+19 19 19 24 24 24 21 21 21 13 13 13 6 6 6 10 10 10 29 29 29 51 51 51 -+4 4 4 10 10 10 4 4 4 0 0 0 0 0 0 10 10 10 34 34 34 59 59 59 -+13 13 13 4 4 4 8 8 8 11 11 11 8 8 8 23 23 23 46 46 46 59 59 59 -+32 32 32 4 4 4 0 0 0 11 11 11 4 4 4 3 3 3 32 32 32 58 58 58 -+40 40 40 10 10 10 0 0 0 11 11 11 11 11 11 16 16 16 42 42 42 65 65 65 -+49 49 49 19 19 19 8 8 8 19 19 19 11 11 11 8 8 8 36 36 36 63 63 63 -+59 59 59 25 25 25 14 14 14 28 28 28 20 20 20 6 6 6 29 29 29 58 58 58 -+53 53 53 38 38 38 27 27 27 27 27 27 24 24 24 17 17 17 34 34 34 63 63 63 -+62 62 62 39 39 39 28 28 28 39 39 39 42 42 42 33 33 33 40 40 40 59 59 59 -+77 77 77 48 48 48 33 33 33 50 50 50 69 69 69 52 52 52 31 31 31 60 60 60 -+82 82 82 54 54 54 45 45 45 43 43 43 62 62 62 69 69 69 58 58 58 53 53 53 -+81 81 81 65 65 65 57 57 57 52 52 52 54 54 54 74 74 74 77 77 77 53 53 53 -+56 56 56 60 60 60 62 62 62 59 59 59 59 59 59 67 67 67 77 77 77 84 84 84 -+65 65 65 62 62 62 66 66 66 70 70 70 68 68 68 66 66 66 76 76 76 92 92 92 -+84 84 84 70 70 70 71 71 71 77 77 77 72 72 72 71 71 71 78 78 78 81 81 81 -+105 104 105 80 80 80 73 73 73 83 83 83 84 84 84 84 84 84 87 87 87 85 85 85 -+85 85 85 89 89 89 81 81 81 84 84 84 88 88 88 92 92 92 101 101 101 94 94 94 -+81 81 81 88 88 88 95 95 94 101 101 101 99 99 99 89 89 89 88 88 88 90 90 90 -+99 99 99 91 91 91 84 84 84 92 92 92 91 91 91 93 93 93 112 112 113 112 112 113 -+103 103 102 88 88 88 96 97 98 96 97 98 93 93 93 105 105 105 105 105 105 96 97 98 -+93 93 93 90 90 90 105 105 105 115 116 115 96 96 96 88 88 88 103 103 102 109 110 110 -+99 99 99 117 117 117 96 96 96 92 92 92 105 105 105 105 105 105 112 112 113 115 116 115 -+99 99 99 105 104 105 103 103 102 84 84 84 84 84 84 103 103 102 96 96 96 73 73 73 -+77 77 77 74 74 74 75 75 75 74 74 74 72 72 72 80 80 80 93 93 93 99 99 99 -+96 97 98 82 82 82 68 68 68 66 66 66 69 69 69 68 68 68 65 65 65 62 62 62 -+59 59 59 66 66 66 80 80 80 92 92 92 95 95 94 89 89 89 81 81 81 77 77 77 -+69 69 69 58 58 58 50 50 50 65 65 65 83 83 83 53 53 53 57 57 57 46 46 46 -+51 51 51 48 48 48 48 48 48 49 49 49 46 46 46 42 42 42 42 42 42 45 45 45 -+67 67 67 72 72 72 65 65 65 42 42 42 29 29 29 42 42 42 63 63 63 75 75 75 -+72 72 72 58 58 58 37 37 37 27 27 27 29 29 29 28 28 28 27 27 27 32 32 32 -+25 25 25 49 49 49 65 65 65 52 52 52 23 23 23 10 10 10 34 34 34 63 63 63 -+61 61 61 59 59 59 56 56 56 56 56 56 56 56 56 56 56 56 52 52 52 49 49 49 -+60 60 60 60 60 60 59 59 59 52 52 52 50 50 50 57 57 57 45 45 45 19 19 19 -+20 20 20 25 25 25 46 46 46 53 53 53 34 34 34 29 29 29 40 40 40 42 42 42 -+49 49 49 48 48 48 59 59 59 39 39 39 36 36 36 49 49 49 28 28 28 19 19 19 -+37 37 37 50 50 50 33 33 33 36 36 36 32 32 32 24 24 24 37 37 37 19 19 19 -+16 16 16 21 21 21 16 16 16 10 10 10 14 14 14 10 10 10 6 6 6 16 16 16 -+0 0 0 6 6 6 16 16 16 23 23 23 27 27 27 25 25 25 17 17 17 8 8 8 -+13 13 13 11 11 11 13 13 13 17 17 17 14 14 14 6 6 6 10 10 10 20 20 20 -+10 10 10 31 31 31 33 33 33 21 21 21 11 11 11 8 8 8 8 8 8 14 14 14 -+13 13 13 6 6 6 11 11 11 8 8 8 14 14 14 20 20 20 8 8 8 8 8 8 -+28 28 28 31 31 31 23 23 23 10 10 10 6 6 6 14 14 14 16 16 16 11 11 11 -+13 13 13 6 6 6 13 13 13 8 8 8 17 17 17 20 20 20 8 8 8 25 25 25 -+46 46 46 20 20 20 11 11 11 16 16 16 10 10 10 13 13 13 19 19 19 11 11 11 -+11 11 11 13 13 13 13 13 13 11 11 11 11 11 11 13 13 13 17 17 17 21 21 21 -+42 42 42 28 28 28 8 8 8 6 6 6 17 17 17 13 13 13 6 6 6 14 14 14 -+10 10 10 8 8 8 11 11 11 14 14 14 13 13 13 13 13 13 19 19 19 25 25 25 -+45 45 45 29 29 29 10 10 10 8 8 8 19 19 19 14 14 14 10 10 10 17 17 17 -+19 19 19 24 24 24 33 33 33 36 36 36 24 24 24 10 10 10 10 10 10 20 20 20 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 10 10 10 20 20 20 -+19 19 19 20 20 20 16 16 16 17 17 17 23 23 23 14 14 14 3 3 3 11 11 11 -+17 17 17 17 17 17 20 20 20 21 21 21 16 16 16 6 6 6 10 10 10 20 20 20 -+23 23 23 20 20 20 17 17 17 13 13 13 8 8 8 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 3 3 4 4 4 8 8 8 11 11 11 13 13 13 14 14 14 -+17 17 17 14 14 14 11 11 11 6 6 6 0 0 0 0 0 0 20 20 20 39 39 39 -+44 44 44 28 28 28 8 8 8 6 6 6 6 6 6 0 0 0 11 11 11 43 43 43 -+46 46 46 23 23 23 8 8 8 21 21 21 23 23 23 0 0 0 0 0 0 37 37 37 -+48 48 48 10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 14 14 14 37 37 37 -+58 58 58 19 19 19 0 0 0 11 11 11 17 17 17 13 13 13 24 24 24 42 42 42 -+60 60 60 29 29 29 4 4 4 3 3 3 3 3 3 3 3 3 14 14 14 28 28 28 -+63 63 63 36 36 36 13 13 13 10 10 10 6 6 6 6 6 6 20 20 20 34 34 34 -+66 66 66 50 50 50 23 23 23 6 6 6 13 13 13 16 16 16 16 16 16 24 24 24 -+63 63 63 54 54 54 29 29 29 8 8 8 13 13 13 20 20 20 21 21 21 27 27 27 -+66 66 66 58 58 58 31 31 31 16 16 16 32 32 32 31 31 31 23 23 23 37 37 37 -+65 65 65 66 66 66 38 38 38 36 36 36 48 48 48 39 39 39 33 33 33 34 34 34 -+66 66 66 70 70 70 62 62 62 62 62 62 52 52 52 38 38 38 40 40 40 37 37 37 -+58 58 58 78 78 78 56 56 56 60 60 60 74 74 74 52 52 52 45 45 45 57 57 57 -+65 65 65 80 80 80 66 66 66 58 58 58 70 70 70 76 76 76 60 60 60 58 58 58 -+61 61 61 65 65 65 62 62 62 60 60 60 71 71 71 85 85 85 82 82 82 70 70 70 -+68 68 68 68 68 68 72 72 72 69 69 69 67 67 67 82 82 82 92 92 92 84 84 84 -+75 75 75 76 76 76 74 74 74 78 78 78 82 82 82 75 75 75 83 83 83 105 105 105 -+84 84 84 78 78 78 81 81 81 89 89 89 90 90 90 85 85 85 89 89 89 99 99 99 -+103 103 102 90 90 90 78 78 78 83 83 83 101 101 101 112 112 113 103 103 102 87 87 87 -+92 85 93 105 101 107 105 101 107 101 96 101 115 116 115 103 103 102 84 86 80 112 115 112 -+115 116 115 105 105 105 99 100 97 96 95 96 92 90 91 92 85 93 101 96 101 112 112 113 -+115 116 115 109 110 110 94 94 94 93 93 93 87 87 87 88 88 88 112 112 113 112 112 113 -+91 91 91 85 85 85 99 99 99 115 116 115 115 116 115 115 116 115 112 112 113 105 104 105 -+101 101 101 109 110 110 117 117 117 112 112 113 96 97 98 91 91 91 101 101 101 115 116 115 -+109 110 110 96 96 96 96 96 96 105 105 105 93 93 93 87 87 87 103 103 102 99 99 99 -+80 80 80 76 76 76 78 78 78 83 83 83 80 80 80 75 75 75 83 83 83 96 97 98 -+101 101 101 101 101 101 94 94 94 81 81 81 70 70 70 68 68 68 68 68 68 67 67 67 -+69 69 69 67 67 67 67 67 67 71 71 71 80 80 80 88 88 88 92 92 92 94 94 94 -+88 88 88 87 87 87 76 76 76 75 75 75 81 81 81 63 63 63 48 48 48 57 57 57 -+53 53 53 52 52 52 51 51 51 50 50 50 49 49 49 48 48 48 45 45 45 44 44 44 -+48 48 48 46 46 46 66 66 66 74 74 74 62 62 62 68 68 68 73 73 73 57 57 57 -+58 58 58 68 68 68 56 56 56 31 31 31 28 28 28 36 36 36 32 32 32 27 27 27 -+29 29 29 25 25 25 34 34 34 59 59 59 59 59 59 48 48 48 59 59 59 62 62 62 -+63 63 63 61 61 61 44 44 44 51 51 51 61 61 61 56 56 56 56 56 56 51 51 51 -+57 57 57 60 60 60 58 58 58 58 58 58 51 51 51 50 50 50 25 25 25 28 28 28 -+14 14 14 45 45 45 46 46 46 34 34 34 32 32 32 42 42 42 42 42 42 49 49 49 -+54 54 54 45 45 45 52 52 52 52 52 52 36 36 36 38 38 38 40 40 40 19 19 19 -+20 20 20 31 31 31 23 23 23 40 40 40 42 42 42 36 36 36 20 20 20 17 17 17 -+19 19 19 13 13 13 14 14 14 6 6 6 13 13 13 17 17 17 3 3 3 13 13 13 -+10 10 10 11 11 11 25 25 25 33 33 33 23 23 23 14 14 14 13 13 13 8 8 8 -+6 6 6 10 10 10 14 14 14 14 14 14 13 13 13 11 11 11 11 11 11 13 13 13 -+23 23 23 29 29 29 27 27 27 14 14 14 8 8 8 13 13 13 14 14 14 11 11 11 -+10 10 10 14 14 14 16 16 16 8 8 8 13 13 13 6 6 6 3 3 3 29 29 29 -+28 28 28 16 16 16 8 8 8 14 14 14 16 16 16 11 11 11 10 10 10 16 16 16 -+13 13 13 11 11 11 11 11 11 11 11 11 8 8 8 11 11 11 25 25 25 42 42 42 -+21 21 21 11 11 11 8 8 8 14 14 14 16 16 16 10 10 10 10 10 10 16 16 16 -+8 8 8 16 16 16 17 17 17 10 10 10 6 6 6 17 17 17 32 32 32 39 39 39 -+20 20 20 14 14 14 10 10 10 8 8 8 11 11 11 11 11 11 10 10 10 6 6 6 -+14 14 14 13 13 13 6 6 6 10 10 10 17 17 17 13 13 13 20 20 20 42 42 42 -+28 28 28 16 16 16 11 11 11 14 14 14 16 16 16 11 11 11 13 13 13 17 17 17 -+31 31 31 39 39 39 34 34 34 14 14 14 10 10 10 24 24 24 25 25 25 13 13 13 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 11 11 11 20 20 20 -+17 17 17 20 20 20 17 17 17 17 17 17 20 20 20 11 11 11 4 4 4 13 13 13 -+20 20 20 19 19 19 19 19 19 17 17 17 13 13 13 10 10 10 14 14 14 20 20 20 -+19 19 19 16 16 16 11 11 11 6 6 6 3 3 3 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 3 3 3 3 3 4 4 4 6 6 6 6 6 6 8 8 8 -+19 19 19 19 19 19 19 19 19 14 14 14 4 4 4 0 0 0 4 4 4 13 13 13 -+39 39 39 43 43 43 32 32 32 11 11 11 0 0 0 0 0 0 3 3 3 16 16 16 -+38 38 38 45 45 45 36 36 36 16 16 16 10 10 10 10 10 10 4 4 4 3 3 3 -+31 31 31 46 46 46 21 21 21 0 0 0 3 3 3 6 6 6 0 0 0 11 11 11 -+39 39 39 51 51 51 21 21 21 0 0 0 16 16 16 25 25 25 14 14 14 24 24 24 -+25 25 25 57 57 57 40 40 40 0 0 0 3 3 3 10 10 10 0 0 0 11 11 11 -+32 32 32 60 60 60 43 43 43 6 6 6 11 11 11 13 13 13 3 3 3 17 17 17 -+39 39 39 59 59 59 54 54 54 27 27 27 8 8 8 8 8 8 13 13 13 16 16 16 -+32 32 32 56 56 56 56 56 56 32 32 32 14 14 14 16 16 16 23 23 23 31 31 31 -+36 36 36 59 59 59 65 65 65 37 37 37 13 13 13 25 25 25 34 34 34 23 23 23 -+33 33 33 54 54 54 61 61 61 54 54 54 38 38 38 34 34 34 44 44 44 34 34 34 -+38 38 38 71 71 71 77 77 77 60 60 60 42 42 42 42 42 42 54 54 54 49 49 49 -+46 46 46 66 66 66 81 81 81 81 81 81 48 48 48 40 40 40 65 65 65 45 45 45 -+59 59 59 62 62 62 82 82 82 77 77 77 72 72 72 50 50 50 59 59 59 61 61 61 -+62 62 62 58 58 58 61 61 61 73 73 73 81 81 81 77 77 77 71 71 71 68 68 68 -+70 70 70 74 74 74 69 69 69 70 70 70 85 85 85 88 88 88 80 80 80 78 78 78 -+80 80 80 74 74 74 81 81 81 81 81 81 75 75 75 93 93 93 103 103 102 84 84 84 -+80 80 80 87 87 87 90 90 90 88 88 88 85 85 85 89 89 89 96 97 98 103 103 102 -+99 99 99 82 82 82 80 80 80 101 101 101 112 112 113 103 103 102 89 89 89 87 87 87 -+91 93 92 109 110 110 107 112 107 83 83 83 91 92 87 121 121 119 121 121 119 107 112 107 -+99 100 97 95 95 94 99 100 97 105 105 105 105 105 105 101 96 101 96 91 95 96 95 96 -+121 121 119 112 112 113 115 116 115 99 99 99 91 91 91 103 103 102 105 105 105 115 116 115 -+105 105 105 99 99 99 105 105 105 117 117 117 115 116 115 117 117 117 117 117 117 109 110 110 -+105 105 105 99 99 99 101 101 101 105 105 105 103 103 102 90 90 90 91 91 91 101 101 101 -+105 104 105 117 117 117 105 105 105 99 99 99 101 101 101 91 91 91 93 93 93 103 103 102 -+94 94 94 84 84 84 75 75 75 76 76 76 78 78 78 77 77 77 78 78 78 83 83 83 -+99 99 99 103 103 102 105 105 105 101 101 101 91 91 91 83 83 83 75 75 75 70 70 70 -+69 69 69 69 69 69 67 67 67 62 62 62 61 61 61 68 68 68 81 81 81 91 91 91 -+95 95 94 96 96 96 91 91 91 92 92 92 93 93 93 76 76 76 58 58 58 58 58 58 -+53 53 53 50 50 50 48 48 48 48 48 48 50 50 50 50 50 50 46 46 46 43 43 43 -+40 40 40 36 36 36 52 52 52 69 69 69 71 71 71 75 75 75 68 68 68 40 40 40 -+34 34 34 56 56 56 66 66 66 57 57 57 43 43 43 27 27 27 20 20 20 25 25 25 -+24 24 24 27 27 27 37 37 37 60 60 60 66 66 66 62 62 62 67 67 67 60 60 60 -+49 49 49 60 60 60 57 57 57 54 54 54 56 56 56 53 53 53 56 56 56 57 57 57 -+51 51 51 57 57 57 58 58 58 61 61 61 53 53 53 50 50 50 23 23 23 23 23 23 -+27 27 27 54 54 54 53 53 53 28 28 28 28 28 28 34 34 34 44 44 44 53 53 53 -+49 49 49 40 40 40 51 51 51 54 54 54 38 38 38 36 36 36 37 37 37 20 20 20 -+23 23 23 38 38 38 34 34 34 46 46 46 38 38 38 25 25 25 11 11 11 13 13 13 -+8 8 8 13 13 13 20 20 20 13 13 13 14 14 14 16 16 16 8 8 8 20 20 20 -+17 17 17 23 23 23 28 28 28 21 21 21 8 8 8 13 13 13 19 19 19 11 11 11 -+17 17 17 13 13 13 10 10 10 11 11 11 16 16 16 17 17 17 14 14 14 11 11 11 -+39 39 39 25 25 25 11 11 11 8 8 8 13 13 13 14 14 14 11 11 11 10 10 10 -+14 14 14 8 8 8 17 17 17 13 13 13 11 11 11 23 23 23 27 27 27 31 31 31 -+25 25 25 13 13 13 6 6 6 11 11 11 14 14 14 10 10 10 8 8 8 13 13 13 -+21 21 21 19 19 19 13 13 13 8 8 8 17 17 17 29 29 29 34 34 34 33 33 33 -+19 19 19 17 17 17 14 14 14 11 11 11 11 11 11 14 14 14 13 13 13 8 8 8 -+8 8 8 19 19 19 25 25 25 25 25 25 25 25 25 31 31 31 37 37 37 39 39 39 -+19 19 19 20 20 20 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 23 23 23 -+14 14 14 23 23 23 24 24 24 21 21 21 23 23 23 27 27 27 34 34 34 44 44 44 -+28 28 28 11 11 11 4 4 4 19 19 19 23 23 23 11 11 11 10 10 10 25 25 25 -+37 37 37 37 37 37 36 36 36 32 32 32 25 25 25 19 19 19 14 14 14 14 14 14 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 6 6 6 13 13 13 20 20 20 -+17 17 17 20 20 20 19 19 19 16 16 16 16 16 16 10 10 10 8 8 8 17 17 17 -+21 21 21 21 21 21 17 17 17 11 11 11 11 11 11 16 16 16 19 19 19 19 19 19 -+14 14 14 10 10 10 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 11 11 11 17 17 17 17 17 17 14 14 14 10 10 10 3 3 3 0 0 0 -+17 17 17 39 39 39 43 43 43 25 25 25 8 8 8 0 0 0 0 0 0 0 0 0 -+20 20 20 44 44 44 48 48 48 25 25 25 14 14 14 16 16 16 8 8 8 0 0 0 -+11 11 11 37 37 37 43 43 43 21 21 21 0 0 0 0 0 0 3 3 3 0 0 0 -+10 10 10 40 40 40 48 48 48 23 23 23 3 3 3 16 16 16 24 24 24 19 19 19 -+3 3 3 38 38 38 51 51 51 33 33 33 8 8 8 4 4 4 6 6 6 0 0 0 -+0 0 0 40 40 40 59 59 59 44 44 44 17 17 17 4 4 4 8 8 8 11 11 11 -+10 10 10 44 44 44 61 61 61 49 49 49 27 27 27 13 13 13 13 13 13 20 20 20 -+10 10 10 40 40 40 59 59 59 54 54 54 38 38 38 23 23 23 23 23 23 33 33 33 -+19 19 19 38 38 38 60 60 60 60 60 60 37 37 37 21 21 21 25 25 25 31 31 31 -+16 16 16 45 45 45 67 67 67 69 69 69 50 50 50 34 34 34 39 39 39 37 37 37 -+49 49 49 63 63 63 71 71 71 70 70 70 56 56 56 42 42 42 44 44 44 46 46 46 -+42 42 42 63 63 63 74 74 74 82 82 82 66 66 66 46 46 46 56 56 56 56 56 56 -+49 49 49 65 65 65 76 76 76 96 97 98 67 67 67 63 63 63 56 56 56 68 68 68 -+62 62 62 63 63 63 72 72 72 83 83 83 82 82 82 72 72 72 67 67 67 70 70 70 -+72 72 72 74 74 74 73 73 73 81 81 81 94 94 94 89 89 89 76 76 76 76 76 76 -+81 81 81 84 84 84 80 80 80 78 78 78 94 94 94 105 105 105 96 96 96 80 80 80 -+83 83 83 92 92 92 93 93 93 87 87 87 89 89 89 101 101 101 105 105 105 99 99 99 -+87 87 87 87 87 87 96 97 98 112 112 113 109 110 110 91 91 91 87 87 87 99 99 99 -+113 122 108 94 99 95 91 96 86 88 90 87 99 100 97 115 116 115 121 121 119 128 121 122 -+101 101 101 103 103 102 109 110 110 115 116 115 112 112 113 105 104 105 101 96 101 101 96 101 -+103 103 102 103 103 102 115 116 115 105 105 105 103 103 102 101 101 101 90 90 90 101 101 101 -+121 121 119 112 112 113 115 116 115 117 117 117 115 116 115 115 116 115 117 117 117 112 112 113 -+99 99 99 88 88 88 87 87 87 101 101 101 109 110 110 103 103 102 93 93 93 91 91 91 -+112 112 113 115 116 115 105 105 105 101 101 101 103 103 102 105 105 105 105 105 105 92 92 92 -+109 110 110 99 99 99 87 87 87 81 81 81 82 82 82 83 83 83 81 81 81 78 78 78 -+83 83 83 90 90 90 101 101 101 109 110 110 105 105 105 96 96 96 87 87 87 84 84 84 -+72 72 72 70 70 70 67 67 67 66 66 66 66 66 66 68 68 68 69 69 69 69 69 69 -+83 83 83 85 85 85 89 89 89 94 94 94 96 96 96 91 91 91 82 82 82 75 75 75 -+62 62 62 57 57 57 50 50 50 46 46 46 49 49 49 50 50 50 49 49 49 46 46 46 -+53 53 53 63 63 63 76 76 76 73 73 73 58 58 58 56 56 56 65 65 65 68 68 68 -+42 42 42 40 40 40 45 45 45 57 57 57 59 59 59 45 45 45 37 37 37 43 43 43 -+59 59 59 63 63 63 66 66 66 71 71 71 67 67 67 61 61 61 60 60 60 49 49 49 -+21 21 21 33 33 33 50 50 50 58 58 58 62 62 62 57 57 57 51 51 51 61 61 61 -+53 53 53 56 56 56 56 56 56 62 62 62 59 59 59 57 57 57 24 24 24 16 16 16 -+29 29 29 57 57 57 59 59 59 21 21 21 36 36 36 36 36 36 51 51 51 61 61 61 -+56 56 56 45 45 45 49 49 49 49 49 49 31 31 31 25 25 25 27 27 27 16 16 16 -+23 23 23 44 44 44 44 44 44 52 52 52 33 33 33 16 16 16 6 6 6 14 14 14 -+8 8 8 25 25 25 39 39 39 36 36 36 32 32 32 29 29 29 27 27 27 39 39 39 -+43 43 43 34 34 34 17 17 17 3 3 3 14 14 14 37 37 37 36 36 36 10 10 10 -+6 6 6 0 0 0 0 0 0 13 13 13 32 32 32 40 40 40 37 37 37 29 29 29 -+19 19 19 0 0 0 3 3 3 29 29 29 45 45 45 44 44 44 39 39 39 42 42 42 -+43 43 43 27 27 27 38 38 38 33 33 33 21 21 21 38 38 38 44 44 44 28 28 28 -+17 17 17 4 4 4 0 0 0 4 4 4 6 6 6 0 0 0 0 0 0 4 4 4 -+0 0 0 0 0 0 0 0 0 3 3 3 24 24 24 39 39 39 45 45 45 45 45 45 -+46 46 46 34 34 34 11 11 11 0 0 0 21 21 21 51 51 51 58 58 58 48 48 48 -+54 54 54 56 56 56 52 52 52 45 45 45 42 42 42 43 43 43 44 44 44 44 44 44 -+24 24 24 29 29 29 33 33 33 34 34 34 31 31 31 28 28 28 31 31 31 33 33 33 -+32 32 32 32 32 32 39 39 39 45 45 45 44 44 44 45 45 45 50 50 50 51 51 51 -+51 51 51 40 40 40 29 29 29 33 33 33 42 42 42 34 34 34 31 31 31 40 40 40 -+31 31 31 29 29 29 39 39 39 53 53 53 46 46 46 23 23 23 11 11 11 19 19 19 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 10 10 10 14 14 14 20 20 20 -+17 17 17 20 20 20 20 20 20 16 16 16 10 10 10 6 6 6 11 11 11 20 20 20 -+21 21 21 21 21 21 16 16 16 10 10 10 13 13 13 20 20 20 20 20 20 14 14 14 -+6 6 6 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 8 8 8 11 11 11 17 17 17 20 20 20 14 14 14 3 3 3 -+0 0 0 19 19 19 38 38 38 42 42 42 27 27 27 4 4 4 0 0 0 6 6 6 -+6 6 6 21 21 21 38 38 38 44 44 44 36 36 36 16 16 16 4 4 4 8 8 8 -+0 0 0 4 4 4 38 38 38 50 50 50 20 20 20 0 0 0 3 3 3 10 10 10 -+0 0 0 8 8 8 43 43 43 51 51 51 24 24 24 10 10 10 21 21 21 24 24 24 -+16 16 16 0 0 0 29 29 29 56 56 56 37 37 37 4 4 4 0 0 0 8 8 8 -+8 8 8 0 0 0 34 34 34 63 63 63 45 45 45 13 13 13 8 8 8 14 14 14 -+8 8 8 14 14 14 37 37 37 58 58 58 56 56 56 32 32 32 19 19 19 25 25 25 -+25 25 25 20 20 20 34 34 34 60 60 60 63 63 63 39 39 39 21 21 21 24 24 24 -+27 27 27 20 20 20 28 28 28 59 59 59 70 70 70 39 39 39 16 16 16 36 36 36 -+32 32 32 43 43 43 48 48 48 62 62 62 72 72 72 49 49 49 32 32 32 44 44 44 -+59 59 59 43 43 43 42 42 42 66 66 66 75 75 75 61 61 61 48 48 48 45 45 45 -+59 59 59 70 70 70 53 53 53 65 65 65 89 89 89 70 70 70 51 51 51 58 58 58 -+60 60 60 70 70 70 83 83 83 66 66 66 92 92 92 76 76 76 74 74 74 61 61 61 -+65 65 65 80 80 80 89 89 89 81 81 81 71 71 71 71 71 71 74 74 74 75 75 75 -+72 72 72 73 73 73 87 87 87 95 95 94 87 87 87 83 83 83 84 84 84 80 80 80 -+84 84 84 84 84 84 81 81 81 92 92 92 109 110 110 96 97 98 82 82 82 90 90 90 -+94 94 94 92 92 92 88 88 88 90 90 90 101 101 101 109 110 110 103 103 102 88 88 88 -+85 85 85 105 105 105 121 121 119 112 112 113 95 95 94 92 92 92 103 103 102 115 116 115 -+99 100 97 91 93 92 88 90 87 99 99 99 117 117 117 121 113 124 111 104 112 124 112 115 -+115 116 115 112 115 112 105 105 105 101 101 101 99 99 99 100 101 103 105 104 105 103 103 102 -+99 99 99 112 112 113 109 110 110 121 121 119 122 121 126 101 101 101 101 101 101 101 101 101 -+112 112 113 105 105 105 109 110 110 112 112 113 112 112 113 117 117 117 125 122 126 122 121 126 -+105 105 105 99 99 99 91 91 91 93 93 93 103 103 102 109 110 110 105 105 105 96 96 96 -+96 97 98 109 110 110 117 117 117 112 112 113 99 99 99 101 101 101 109 110 110 103 103 102 -+105 105 105 105 105 105 96 97 98 87 87 87 81 81 81 82 82 82 83 83 83 82 82 82 -+78 78 78 83 83 83 94 94 94 105 104 105 105 105 105 103 103 102 99 99 99 101 101 101 -+96 96 96 89 89 89 78 78 78 72 72 72 70 70 70 70 70 70 68 68 68 65 65 65 -+63 63 63 63 63 63 71 71 71 77 77 77 83 83 83 92 92 92 96 97 98 90 90 90 -+90 90 90 83 83 83 71 71 71 60 60 60 53 53 53 52 52 52 53 53 53 54 54 54 -+74 74 74 71 71 71 61 61 61 45 45 45 36 36 36 38 38 38 51 51 51 62 62 62 -+71 71 71 48 48 48 34 34 34 51 51 51 70 70 70 71 71 71 65 65 65 66 66 66 -+66 66 66 70 70 70 69 69 69 62 62 62 52 52 52 49 49 49 53 53 53 56 56 56 -+40 40 40 24 24 24 36 36 36 56 56 56 68 68 68 57 57 57 38 38 38 53 53 53 -+60 60 60 57 57 57 51 51 51 59 59 59 61 61 61 61 61 61 27 27 27 13 13 13 -+28 28 28 54 54 54 59 59 59 20 20 20 44 44 44 36 36 36 49 49 49 52 52 52 -+50 50 50 40 40 40 37 37 37 32 32 32 24 24 24 28 28 28 33 33 33 25 25 25 -+25 25 25 45 45 45 46 46 46 51 51 51 28 28 28 14 14 14 11 11 11 19 19 19 -+16 16 16 38 38 38 53 53 53 52 52 52 50 50 50 44 44 44 42 42 42 49 49 49 -+44 44 44 46 46 46 39 39 39 24 24 24 25 25 25 42 42 42 48 48 48 39 39 39 -+11 11 11 6 6 6 8 8 8 21 21 21 36 36 36 40 40 40 33 33 33 23 23 23 -+4 4 4 3 3 3 21 21 21 46 46 46 54 54 54 45 45 45 39 39 39 44 44 44 -+54 54 54 38 38 38 48 48 48 42 42 42 25 25 25 34 34 34 36 36 36 20 20 20 -+10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+8 8 8 0 0 0 0 0 0 23 23 23 31 31 31 27 27 27 34 34 34 50 50 50 -+51 51 51 52 52 52 37 37 37 10 10 10 3 3 3 25 25 25 44 44 44 49 49 49 -+48 48 48 50 50 50 51 51 51 48 48 48 40 40 40 27 27 27 8 8 8 0 0 0 -+16 16 16 19 19 19 23 23 23 24 24 24 24 24 24 24 24 24 25 25 25 28 28 28 -+29 29 29 13 13 13 25 25 25 46 46 46 45 45 45 33 33 33 32 32 32 33 33 33 -+24 24 24 27 27 27 11 11 11 6 6 6 28 28 28 40 40 40 37 37 37 33 33 33 -+10 10 10 0 0 0 6 6 6 17 17 17 13 13 13 0 0 0 4 4 4 23 23 23 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 13 13 13 17 17 17 20 20 20 -+17 17 17 20 20 20 21 21 21 16 16 16 6 6 6 6 6 6 14 14 14 20 20 20 -+19 19 19 19 19 19 16 16 16 11 11 11 16 16 16 21 21 21 17 17 17 8 8 8 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 4 4 4 3 3 3 10 10 10 19 19 19 17 17 17 10 10 10 -+0 0 0 4 4 4 24 24 24 42 42 42 39 39 39 20 20 20 0 0 0 0 0 0 -+6 6 6 6 6 6 24 24 24 45 45 45 46 46 46 28 28 28 11 11 11 3 3 3 -+0 0 0 4 4 4 13 13 13 34 34 34 48 48 48 23 23 23 0 0 0 8 8 8 -+3 3 3 6 6 6 8 8 8 29 29 29 51 51 51 37 37 37 14 14 14 20 20 20 -+21 21 21 8 8 8 3 3 3 36 36 36 56 56 56 29 29 29 0 0 0 10 10 10 -+14 14 14 4 4 4 0 0 0 33 33 33 63 63 63 49 49 49 13 13 13 6 6 6 -+16 16 16 3 3 3 14 14 14 44 44 44 61 61 61 54 54 54 36 36 36 20 20 20 -+31 31 31 17 17 17 20 20 20 42 42 42 59 59 59 56 56 56 36 36 36 16 16 16 -+24 24 24 27 27 27 23 23 23 36 36 36 61 61 61 65 65 65 43 43 43 25 25 25 -+34 34 34 39 39 39 36 36 36 43 43 43 68 68 68 71 71 71 57 57 57 60 60 60 -+46 46 46 42 42 42 39 39 39 46 46 46 65 65 65 77 77 77 69 69 69 54 54 54 -+68 68 68 60 60 60 52 52 52 58 58 58 69 69 69 81 81 81 77 77 77 51 51 51 -+74 74 74 85 85 85 62 62 62 70 70 70 71 71 71 96 97 98 75 75 75 67 67 67 -+72 72 72 87 87 87 88 88 88 75 75 75 68 68 68 75 75 75 80 80 80 75 75 75 -+78 78 78 84 84 84 95 95 94 94 94 94 81 81 81 80 80 80 87 87 87 85 85 85 -+87 87 87 80 80 80 96 96 96 109 110 110 95 95 94 87 87 87 91 91 91 92 92 92 -+96 97 98 92 92 92 93 93 93 103 103 102 109 110 110 101 101 101 93 93 93 90 90 90 -+103 103 102 121 121 119 121 121 119 99 99 99 92 92 92 105 105 105 115 116 115 112 112 113 -+96 91 95 101 96 101 111 104 112 121 113 124 122 121 126 105 104 105 94 94 95 96 97 98 -+127 127 127 121 121 119 105 105 105 93 93 93 96 97 98 109 110 110 109 110 110 100 101 103 -+109 110 110 121 121 119 109 110 110 121 121 119 125 125 127 115 116 115 117 117 117 115 116 115 -+112 112 113 109 110 110 109 110 110 109 110 110 109 110 110 115 116 115 121 121 119 117 117 117 -+127 127 127 117 117 117 103 103 102 92 92 92 93 93 93 103 103 102 109 110 110 112 112 113 -+89 89 89 112 112 113 112 112 113 105 105 105 112 112 113 105 104 105 94 94 94 109 110 110 -+105 105 105 109 110 110 109 110 110 99 99 99 92 92 92 92 92 92 95 95 94 95 95 94 -+96 96 96 96 96 96 101 101 101 105 105 105 105 105 105 103 103 102 103 103 102 105 105 105 -+105 104 105 105 104 105 101 101 101 91 91 91 80 80 80 72 72 72 71 71 71 72 72 72 -+68 68 68 63 63 63 67 67 67 69 69 69 70 70 70 83 83 83 91 91 91 83 83 83 -+90 90 90 89 89 89 85 85 85 76 76 76 69 69 69 68 68 68 72 72 72 77 77 77 -+80 80 80 69 69 69 51 51 51 44 44 44 50 50 50 54 54 54 54 54 54 56 56 56 -+85 85 85 73 73 73 69 69 69 74 74 74 78 78 78 77 77 77 76 76 76 77 77 77 -+67 67 67 63 63 63 57 57 57 43 43 43 31 31 31 24 24 24 28 28 28 39 39 39 -+65 65 65 36 36 36 28 28 28 40 40 40 58 58 58 56 56 56 40 40 40 53 53 53 -+57 57 57 54 54 54 48 48 48 51 51 51 51 51 51 53 53 53 24 24 24 17 17 17 -+29 29 29 48 48 48 52 52 52 16 16 16 42 42 42 28 28 28 33 33 33 31 31 31 -+36 36 36 34 34 34 31 31 31 27 27 27 29 29 29 37 37 37 33 33 33 19 19 19 -+34 34 34 49 49 49 45 45 45 48 48 48 24 24 24 16 16 16 16 16 16 19 19 19 -+19 19 19 40 40 40 52 52 52 54 54 54 54 54 54 49 49 49 43 43 43 43 43 43 -+43 43 43 51 51 51 53 53 53 46 46 46 42 42 42 43 43 43 49 49 49 53 53 53 -+50 50 50 46 46 46 45 45 45 48 48 48 50 50 50 49 49 49 43 43 43 37 37 37 -+34 34 34 37 37 37 44 44 44 50 50 50 46 46 46 38 38 38 37 37 37 42 42 42 -+50 50 50 40 40 40 49 49 49 45 45 45 33 33 33 31 31 31 28 28 28 32 32 32 -+43 43 43 39 39 39 37 37 37 38 38 38 38 38 38 37 37 37 37 37 37 38 38 38 -+37 37 37 29 29 29 34 34 34 45 45 45 42 42 42 29 29 29 33 33 33 50 50 50 -+39 39 39 51 51 51 57 57 57 50 50 50 43 43 43 43 43 43 49 49 49 52 52 52 -+46 46 46 43 43 43 40 40 40 43 43 43 46 46 46 48 48 48 46 46 46 45 45 45 -+43 43 43 39 39 39 33 33 33 29 29 29 27 27 27 23 23 23 19 19 19 14 14 14 -+13 13 13 0 0 0 19 19 19 38 38 38 29 29 29 11 11 11 8 8 8 10 10 10 -+13 13 13 17 17 17 8 8 8 8 8 8 32 32 32 44 44 44 34 34 34 21 21 21 -+13 13 13 16 16 16 13 13 13 8 8 8 10 10 10 20 20 20 32 32 32 39 39 39 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 0 0 0 0 0 0 6 6 6 14 14 14 20 20 20 20 20 20 -+17 17 17 19 19 19 21 21 21 14 14 14 4 4 4 8 8 8 17 17 17 20 20 20 -+17 17 17 16 16 16 14 14 14 14 14 14 19 19 19 20 20 20 13 13 13 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 3 3 3 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 -+4 4 4 4 4 4 0 0 0 0 0 0 3 3 3 13 13 13 17 17 17 19 19 19 -+10 10 10 0 0 0 6 6 6 24 24 24 38 38 38 40 40 40 23 23 23 0 0 0 -+0 0 0 6 6 6 14 14 14 25 25 25 39 39 39 49 49 49 33 33 33 0 0 0 -+4 4 4 0 0 0 0 0 0 10 10 10 38 38 38 51 51 51 31 31 31 0 0 0 -+10 10 10 0 0 0 0 0 0 3 3 3 32 32 32 51 51 51 43 43 43 20 20 20 -+19 19 19 17 17 17 8 8 8 6 6 6 31 31 31 51 51 51 39 39 39 4 4 4 -+0 0 0 13 13 13 10 10 10 4 4 4 33 33 33 61 61 61 50 50 50 11 11 11 -+10 10 10 11 11 11 13 13 13 17 17 17 40 40 40 65 65 65 58 58 58 29 29 29 -+11 11 11 23 23 23 23 23 23 17 17 17 33 33 33 62 62 62 62 62 62 36 36 36 -+19 19 19 24 24 24 31 31 31 25 25 25 33 33 33 67 67 67 73 73 73 42 42 42 -+46 46 46 53 53 53 53 53 53 34 34 34 39 39 39 70 70 70 74 74 74 58 58 58 -+39 39 39 46 46 46 50 50 50 40 40 40 45 45 45 68 68 68 77 77 77 81 81 81 -+58 58 58 48 48 48 52 52 52 59 59 59 54 54 54 70 70 70 88 88 88 81 81 81 -+83 83 83 61 61 61 70 70 70 60 60 60 72 72 72 72 72 72 93 93 93 83 83 83 -+85 85 85 81 81 81 75 75 75 74 74 74 75 75 75 77 77 77 77 77 77 76 76 76 -+88 88 88 96 97 98 93 93 93 84 84 84 87 87 87 84 84 84 82 82 82 88 88 88 -+83 83 83 99 99 99 109 110 110 99 99 99 87 87 87 90 90 90 96 97 98 95 95 94 -+95 95 94 99 99 99 109 110 110 115 116 115 105 104 105 89 89 89 93 93 93 109 110 110 -+127 127 127 117 117 117 103 103 102 96 96 96 105 105 105 115 116 115 109 110 110 96 97 98 -+111 104 112 111 104 112 121 121 119 118 122 119 94 99 95 91 96 86 86 124 83 86 124 83 -+112 115 112 118 122 119 121 121 119 115 116 115 112 112 113 112 112 113 112 112 113 109 110 110 -+105 105 105 112 112 113 121 121 119 112 112 113 115 116 115 128 128 128 117 117 117 115 116 115 -+109 110 110 109 110 110 112 112 113 112 112 113 112 112 113 117 117 117 121 121 119 121 121 119 -+127 127 127 117 117 117 109 110 110 105 105 105 101 101 101 99 99 99 109 110 110 121 121 119 -+109 110 110 103 103 102 103 103 102 105 105 105 115 116 115 115 116 115 99 99 99 99 99 99 -+112 112 113 115 116 115 115 116 115 109 110 110 109 110 110 109 110 110 109 110 110 105 105 105 -+105 104 105 103 103 102 103 103 102 105 104 105 105 104 105 103 103 102 101 101 101 103 103 102 -+96 96 96 99 99 99 99 99 99 99 99 99 95 95 94 89 89 89 83 83 83 80 80 80 -+82 82 82 77 77 77 77 77 77 75 75 75 73 73 73 80 80 80 83 83 83 73 73 73 -+70 70 70 75 75 75 81 81 81 81 81 81 77 77 77 76 76 76 80 80 80 84 84 84 -+77 77 77 75 75 75 72 72 72 70 70 70 68 68 68 65 65 65 66 66 66 69 69 69 -+59 59 59 62 62 62 67 67 67 63 63 63 54 54 54 52 52 52 56 56 56 54 54 54 -+58 58 58 51 51 51 46 46 46 38 38 38 38 38 38 39 39 39 36 36 36 43 43 43 -+51 51 51 43 43 43 32 32 32 28 28 28 43 43 43 51 51 51 45 45 45 45 45 45 -+43 43 43 46 46 46 43 43 43 44 44 44 38 38 38 40 40 40 20 20 20 24 24 24 -+24 24 24 36 36 36 39 39 39 16 16 16 32 32 32 23 23 23 27 27 27 27 27 27 -+27 27 27 34 34 34 37 37 37 37 37 37 40 40 40 39 39 39 24 24 24 8 8 8 -+45 45 45 53 53 53 48 48 48 46 46 46 20 20 20 16 16 16 16 16 16 14 14 14 -+27 27 27 45 45 45 49 49 49 50 50 50 53 53 53 50 50 50 46 46 46 40 40 40 -+48 48 48 51 51 51 52 52 52 54 54 54 54 54 54 48 48 48 43 43 43 46 46 46 -+51 51 51 49 49 49 46 46 46 43 43 43 42 42 42 42 42 42 44 44 44 45 45 45 -+46 46 46 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 -+48 48 48 45 45 45 50 50 50 45 45 45 37 37 37 29 29 29 28 28 28 43 43 43 -+48 48 48 46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 -+43 43 43 45 45 45 46 46 46 46 46 46 46 46 46 48 48 48 48 48 48 48 48 48 -+48 48 48 45 45 45 44 44 44 49 49 49 53 53 53 52 52 52 46 46 46 40 40 40 -+48 48 48 45 45 45 45 45 45 49 49 49 49 49 49 42 42 42 32 32 32 27 27 27 -+20 20 20 14 14 14 10 10 10 10 10 10 13 13 13 16 16 16 14 14 14 11 11 11 -+11 11 11 25 25 25 38 38 38 34 34 34 19 19 19 11 11 11 13 13 13 11 11 11 -+16 16 16 10 10 10 14 14 14 28 28 28 36 36 36 28 28 28 13 13 13 0 0 0 -+6 6 6 17 17 17 19 19 19 11 11 11 17 17 17 31 31 31 33 33 33 25 25 25 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 0 0 0 0 0 0 6 6 6 17 17 17 21 21 21 20 20 20 -+17 17 17 17 17 17 21 21 21 14 14 14 3 3 3 10 10 10 20 20 20 17 17 17 -+19 19 19 14 14 14 13 13 13 17 17 17 20 20 20 16 16 16 6 6 6 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 13 13 13 21 21 21 -+13 13 13 3 3 3 0 0 0 6 6 6 24 24 24 43 43 43 39 39 39 16 16 16 -+0 0 0 0 0 0 10 10 10 14 14 14 25 25 25 45 45 45 45 45 45 24 24 24 -+8 8 8 0 0 0 0 0 0 3 3 3 6 6 6 42 42 42 52 52 52 16 16 16 -+10 10 10 0 0 0 4 4 4 6 6 6 0 0 0 31 31 31 56 56 56 40 40 40 -+24 24 24 14 14 14 19 19 19 6 6 6 0 0 0 39 39 39 58 58 58 29 29 29 -+10 10 10 6 6 6 20 20 20 10 10 10 0 0 0 38 38 38 63 63 63 42 42 42 -+19 19 19 16 16 16 13 13 13 10 10 10 20 20 20 46 46 46 59 59 59 53 53 53 -+20 20 20 23 23 23 21 21 21 14 14 14 19 19 19 45 45 45 63 63 63 60 60 60 -+36 36 36 23 23 23 28 28 28 31 31 31 25 25 25 45 45 45 69 69 69 70 70 70 -+50 50 50 45 45 45 46 46 46 37 37 37 42 42 42 66 66 66 74 74 74 75 75 75 -+53 53 53 44 44 44 46 46 46 46 46 46 51 51 51 62 62 62 74 74 74 94 94 94 -+63 63 63 56 56 56 51 51 51 57 57 57 62 62 62 66 66 66 78 78 78 99 99 99 -+82 82 82 66 66 66 60 60 60 76 76 76 60 60 60 74 74 74 88 88 88 99 99 99 -+94 94 94 80 80 80 72 72 72 76 76 76 80 80 80 77 77 77 81 81 81 89 89 89 -+95 95 94 95 95 94 87 87 87 83 83 83 90 90 90 87 87 87 84 84 84 91 91 91 -+94 94 94 112 112 113 103 103 102 87 87 87 94 94 94 99 99 99 94 94 94 101 101 101 -+101 101 101 109 110 110 112 112 113 109 110 110 96 97 98 94 94 94 109 110 110 125 122 126 -+128 128 128 109 110 110 99 99 99 105 105 105 115 116 115 112 112 113 103 103 102 99 99 99 -+105 101 107 125 122 126 116 129 109 86 124 83 86 124 83 83 172 72 83 172 115 83 172 72 -+94 99 95 107 112 107 118 122 119 128 129 128 118 122 119 105 105 105 105 104 105 112 112 113 -+105 105 105 112 112 113 129 129 130 125 122 126 121 121 119 128 128 128 117 117 117 115 116 115 -+117 117 117 121 121 119 121 121 119 115 116 115 115 116 115 117 117 117 117 117 117 115 116 115 -+115 116 115 112 112 113 115 116 115 117 117 117 115 116 115 109 110 110 112 112 113 117 117 117 -+115 116 115 101 101 101 115 116 115 117 117 117 103 103 102 105 105 105 109 110 110 105 104 105 -+109 110 110 109 110 110 105 105 105 105 105 105 109 110 110 109 110 110 105 105 105 103 103 102 -+101 101 101 101 101 101 101 101 101 99 99 99 99 99 99 99 99 99 99 99 99 96 96 96 -+99 99 99 94 94 94 89 89 89 89 89 89 93 93 93 95 95 94 93 93 93 90 90 90 -+87 87 87 84 84 84 83 83 83 83 83 83 83 83 83 85 85 85 83 83 83 77 77 77 -+74 74 74 77 77 77 80 80 80 78 78 78 75 75 75 72 72 72 69 69 69 68 68 68 -+75 75 75 67 67 67 65 65 65 67 67 67 67 67 67 66 66 66 62 62 62 60 60 60 -+60 60 60 58 58 58 59 59 59 57 57 57 53 53 53 59 59 59 60 60 60 51 51 51 -+52 52 52 53 53 53 53 53 53 43 43 43 49 49 49 56 56 56 46 46 46 48 48 48 -+38 38 38 52 52 52 48 48 48 39 39 39 42 42 42 44 44 44 42 42 42 33 33 33 -+34 34 34 37 37 37 34 34 34 39 39 39 38 38 38 43 43 43 23 23 23 27 27 27 -+17 17 17 28 28 28 36 36 36 32 32 32 31 31 31 25 25 25 32 32 32 38 38 38 -+29 29 29 34 34 34 38 38 38 42 42 42 43 43 43 33 33 33 27 27 27 33 33 33 -+48 48 48 57 57 57 50 50 50 48 48 48 19 19 19 13 13 13 16 16 16 11 11 11 -+37 37 37 53 53 53 49 49 49 46 46 46 50 50 50 50 50 50 53 53 53 49 49 49 -+40 40 40 51 51 51 56 56 56 56 56 56 52 52 52 42 42 42 39 39 39 50 50 50 -+53 53 53 52 52 52 49 49 49 45 45 45 43 43 43 43 43 43 45 45 45 48 48 48 -+44 44 44 43 43 43 44 44 44 45 45 45 48 48 48 48 48 48 44 44 44 42 42 42 -+44 44 44 42 42 42 44 44 44 34 34 34 25 25 25 25 25 25 28 28 28 40 40 40 -+48 48 48 48 48 48 48 48 48 48 48 48 46 46 46 46 46 46 48 48 48 48 48 48 -+46 46 46 48 48 48 46 46 46 43 43 43 45 45 45 49 49 49 46 46 46 40 40 40 -+50 50 50 50 50 50 49 49 49 44 44 44 40 40 40 40 40 40 46 46 46 51 51 51 -+50 50 50 38 38 38 27 27 27 21 21 21 17 17 17 11 11 11 10 10 10 11 11 11 -+11 11 11 11 11 11 11 11 11 11 11 11 13 13 13 14 14 14 16 16 16 14 14 14 -+21 21 21 34 34 34 34 34 34 20 20 20 11 11 11 11 11 11 13 13 13 14 14 14 -+13 13 13 10 10 10 27 27 27 42 42 42 32 32 32 20 20 20 19 19 19 14 14 14 -+17 17 17 17 17 17 13 13 13 11 11 11 19 19 19 28 28 28 28 28 28 20 20 20 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 0 0 0 0 0 0 6 6 6 17 17 17 21 21 21 20 20 20 -+17 17 17 17 17 17 20 20 20 14 14 14 3 3 3 11 11 11 20 20 20 16 16 16 -+21 21 21 13 13 13 11 11 11 17 17 17 19 19 19 11 11 11 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 13 13 13 -+19 19 19 8 8 8 3 3 3 4 4 4 10 10 10 29 29 29 40 40 40 36 36 36 -+3 3 3 0 0 0 8 8 8 21 21 21 19 19 19 21 21 21 38 38 38 50 50 50 -+0 0 0 8 8 8 10 10 10 0 0 0 0 0 0 4 4 4 31 31 31 57 57 57 -+14 14 14 10 10 10 6 6 6 8 8 8 4 4 4 3 3 3 28 28 28 59 59 59 -+36 36 36 25 25 25 17 17 17 13 13 13 6 6 6 3 3 3 29 29 29 62 62 62 -+39 39 39 14 14 14 0 0 0 10 10 10 16 16 16 10 10 10 32 32 32 67 67 67 -+44 44 44 16 16 16 10 10 10 21 21 21 14 14 14 11 11 11 40 40 40 70 70 70 -+58 58 58 23 23 23 11 11 11 28 28 28 24 24 24 16 16 16 40 40 40 69 69 69 -+59 59 59 38 38 38 24 24 24 31 31 31 32 32 32 27 27 27 45 45 45 76 76 76 -+80 80 80 49 49 49 33 33 33 46 46 46 63 63 63 48 48 48 37 37 37 74 74 74 -+84 84 84 57 57 57 48 48 48 50 50 50 61 61 61 68 68 68 61 61 61 67 67 67 -+89 89 89 73 73 73 62 62 62 54 54 54 59 59 59 76 76 76 82 82 82 74 74 74 -+91 91 91 78 78 78 70 70 70 68 68 68 74 74 74 72 72 72 81 81 81 92 92 92 -+99 99 99 88 88 88 80 80 80 78 78 78 76 76 76 77 77 77 89 89 89 103 103 102 -+99 99 99 83 83 83 83 83 83 91 91 91 88 88 88 87 87 87 94 94 94 95 95 94 -+121 121 119 96 97 98 90 90 90 96 97 98 96 96 96 96 96 96 101 101 101 103 103 102 -+112 112 113 115 116 115 109 110 110 96 96 96 95 95 94 112 112 113 125 125 127 128 128 128 -+117 117 117 105 105 105 109 110 110 121 121 119 115 116 115 103 103 102 103 103 102 115 116 115 -+127 127 127 116 129 109 86 124 83 86 124 83 83 172 115 83 172 72 83 172 72 83 172 72 -+112 115 112 105 105 105 112 115 112 129 129 130 128 129 128 112 112 113 105 105 105 115 116 115 -+112 112 113 115 116 115 121 121 119 137 137 137 127 127 127 109 110 110 121 121 119 121 121 119 -+115 116 115 121 121 119 121 121 119 115 116 115 115 116 115 121 121 119 121 121 119 117 117 117 -+115 116 115 121 121 119 117 117 117 112 112 113 112 112 113 117 117 117 117 117 117 112 112 113 -+115 116 115 112 112 113 112 112 113 109 110 110 112 112 113 115 116 115 109 110 110 112 112 113 -+109 110 110 109 110 110 105 105 105 105 105 105 105 105 105 105 104 105 103 103 102 103 103 102 -+103 103 102 105 104 105 101 101 101 95 95 94 94 94 94 96 97 98 96 97 98 94 94 94 -+96 97 98 99 99 99 101 101 101 96 97 98 91 91 91 87 87 87 85 85 85 85 85 85 -+85 85 85 84 84 84 82 82 82 84 84 84 87 87 87 87 87 87 85 85 85 84 84 84 -+84 84 84 82 82 82 78 78 78 78 78 78 81 81 81 80 80 80 76 76 76 74 74 74 -+75 75 75 69 69 69 71 71 71 76 76 76 74 74 74 72 72 72 72 72 72 70 70 70 -+61 61 61 53 53 53 51 51 51 52 52 52 54 54 54 62 62 62 60 60 60 45 45 45 -+45 45 45 57 57 57 59 59 59 38 38 38 38 38 38 48 48 48 37 37 37 37 37 37 -+37 37 37 54 54 54 51 51 51 52 52 52 53 53 53 49 49 49 54 54 54 52 52 52 -+34 34 34 31 31 31 27 27 27 38 38 38 48 48 48 56 56 56 29 29 29 24 24 24 -+20 20 20 32 32 32 45 45 45 52 52 52 36 36 36 31 31 31 34 34 34 43 43 43 -+52 52 52 49 49 49 42 42 42 39 39 39 32 32 32 14 14 14 21 21 21 50 50 50 -+44 44 44 56 56 56 53 53 53 50 50 50 19 19 19 13 13 13 17 17 17 13 13 13 -+39 39 39 56 56 56 46 46 46 42 42 42 43 43 43 45 45 45 56 56 56 54 54 54 -+50 50 50 48 48 48 40 40 40 44 44 44 57 57 57 58 58 58 46 46 46 43 43 43 -+44 44 44 44 44 44 46 46 46 48 48 48 48 48 48 48 48 48 46 46 46 45 45 45 -+51 51 51 48 48 48 46 46 46 49 49 49 48 48 48 44 44 44 44 44 44 48 48 48 -+46 46 46 42 42 42 44 44 44 32 32 32 23 23 23 37 37 37 44 44 44 48 48 48 -+45 45 45 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 -+44 44 44 40 40 40 42 42 42 46 46 46 48 48 48 45 45 45 45 45 45 49 49 49 -+48 48 48 48 48 48 46 46 46 45 45 45 49 49 49 51 51 51 45 45 45 37 37 37 -+37 37 37 27 27 27 17 17 17 16 16 16 14 14 14 10 10 10 11 11 11 14 14 14 -+10 10 10 14 14 14 19 19 19 19 19 19 14 14 14 13 13 13 14 14 14 17 17 17 -+37 37 37 34 34 34 19 19 19 8 8 8 14 14 14 13 13 13 10 10 10 16 16 16 -+13 13 13 19 19 19 38 38 38 37 37 37 10 10 10 4 4 4 17 17 17 11 11 11 -+17 17 17 10 10 10 11 11 11 27 27 27 36 36 36 31 31 31 19 19 19 11 11 11 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 11 11 11 20 20 20 21 21 21 17 17 17 -+20 20 20 17 17 17 20 20 20 10 10 10 10 10 10 20 20 20 17 17 17 20 20 20 -+20 20 20 3 3 3 21 21 21 19 19 19 20 20 20 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 -+10 10 10 23 23 23 8 8 8 0 0 0 10 10 10 19 19 19 23 23 23 38 38 38 -+39 39 39 10 10 10 0 0 0 17 17 17 25 25 25 17 17 17 21 21 21 40 40 40 -+56 56 56 4 4 4 0 0 0 11 11 11 6 6 6 0 0 0 6 6 6 28 28 28 -+59 59 59 14 14 14 0 0 0 3 3 3 8 8 8 6 6 6 4 4 4 27 27 27 -+60 60 60 37 37 37 21 21 21 20 20 20 14 14 14 6 6 6 13 13 13 24 24 24 -+67 67 67 36 36 36 11 11 11 11 11 11 13 13 13 13 13 13 19 19 19 25 25 25 -+62 62 62 51 51 51 28 28 28 11 11 11 14 14 14 19 19 19 24 24 24 37 37 37 -+73 73 73 54 54 54 28 28 28 20 20 20 27 27 27 25 25 25 25 25 25 37 37 37 -+68 68 68 74 74 74 44 44 44 27 27 27 37 37 37 39 39 39 46 46 46 52 52 52 -+71 71 71 74 74 74 59 59 59 65 65 65 50 50 50 43 43 43 42 42 42 43 43 43 -+74 74 74 83 83 83 63 63 63 61 61 61 71 71 71 59 59 59 53 53 53 57 57 57 -+75 75 75 85 85 85 68 68 68 61 61 61 83 83 83 83 83 83 67 67 67 70 70 70 -+77 77 77 94 94 94 87 87 87 69 69 69 76 76 76 94 94 94 91 91 91 75 75 75 -+87 87 87 96 97 98 90 90 90 83 83 83 82 82 82 91 91 91 105 105 105 99 99 99 -+90 90 90 88 88 88 89 89 89 91 91 91 90 90 90 92 92 92 103 103 102 117 117 117 -+99 99 99 95 95 94 93 93 93 96 96 96 101 101 101 105 104 105 105 104 105 105 104 105 -+121 121 119 105 104 105 103 103 102 105 105 105 109 110 110 121 121 119 129 129 130 122 121 126 -+109 108 122 122 111 100 113 122 108 98 114 115 124 112 115 124 112 115 112 115 112 122 111 100 -+105 107 94 86 124 83 83 172 72 83 172 72 83 172 72 83 172 72 83 172 72 83 172 72 -+83 172 72 86 124 83 118 122 119 143 136 140 143 136 140 105 107 94 109 108 122 91 96 86 -+99 99 99 112 112 113 129 129 130 134 134 134 131 131 131 115 116 115 121 121 119 121 121 119 -+125 125 127 122 121 126 125 125 127 118 122 119 78 79 82 40 42 44 50 51 53 46 47 50 -+43 44 47 43 44 47 43 44 47 43 44 47 43 44 47 43 44 47 43 44 47 43 44 47 -+46 47 50 46 47 50 46 47 50 42 43 45 35 36 38 43 44 47 122 121 126 118 122 119 -+121 121 119 115 116 115 103 103 102 96 97 98 105 105 105 121 121 119 121 121 119 109 110 110 -+92 92 92 91 91 91 91 91 91 92 92 92 94 94 94 93 93 93 87 87 87 82 82 82 -+85 85 85 90 90 90 101 101 101 105 105 105 109 110 110 103 103 102 92 92 92 83 83 83 -+80 80 80 75 75 75 71 71 71 72 72 72 74 74 74 80 80 80 91 91 91 103 103 102 -+101 101 101 91 91 91 99 99 99 96 96 96 87 87 87 85 85 85 80 80 80 82 82 82 -+83 83 83 89 89 89 88 88 88 76 76 76 65 65 65 58 58 58 51 51 51 45 45 45 -+44 44 44 44 44 44 43 43 43 43 43 43 44 44 44 51 51 51 60 60 60 68 68 68 -+38 38 38 46 46 46 63 63 63 56 56 56 34 34 34 27 27 27 31 31 31 48 48 48 -+63 63 63 59 59 59 56 56 56 66 66 66 67 67 67 66 66 66 48 48 48 60 60 60 -+42 42 42 20 20 20 10 10 10 20 20 20 38 38 38 53 53 53 49 49 49 25 25 25 -+21 21 21 23 23 23 40 40 40 56 56 56 52 52 52 42 42 42 32 32 32 21 21 21 -+10 10 10 19 19 19 21 21 21 17 17 17 24 24 24 39 39 39 49 49 49 50 50 50 -+44 44 44 51 51 51 49 49 49 32 32 32 16 16 16 11 11 11 11 11 11 10 10 10 -+48 48 48 50 50 50 50 50 50 46 46 46 43 43 43 43 43 43 48 48 48 52 52 52 -+53 53 53 48 48 48 43 43 43 44 44 44 50 50 50 53 53 53 52 52 52 50 50 50 -+45 45 45 46 46 46 49 49 49 51 51 51 52 52 52 52 52 52 50 50 50 48 48 48 -+45 45 45 48 48 48 46 46 46 43 43 43 45 45 45 49 49 49 46 46 46 40 40 40 -+48 48 48 40 40 40 29 29 29 24 24 24 27 27 27 36 36 36 44 44 44 50 50 50 -+45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 44 44 44 43 43 43 -+42 42 42 45 45 45 48 48 48 48 48 48 45 45 45 45 45 45 48 48 48 51 51 51 -+48 48 48 46 46 46 48 48 48 45 45 45 36 36 36 25 25 25 32 32 32 43 43 43 -+16 16 16 14 14 14 14 14 14 13 13 13 11 11 11 11 11 11 11 11 11 13 13 13 -+20 20 20 8 8 8 6 6 6 16 16 16 16 16 16 11 11 11 24 24 24 42 42 42 -+29 29 29 23 23 23 13 13 13 10 10 10 13 13 13 17 17 17 16 16 16 11 11 11 -+32 32 32 33 33 33 27 27 27 16 16 16 11 11 11 16 16 16 16 16 16 11 11 11 -+14 14 14 8 8 8 20 20 20 38 38 38 34 34 34 13 13 13 3 3 3 17 17 17 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 11 11 11 20 20 20 21 21 21 17 17 17 -+20 20 20 17 17 17 20 20 20 10 10 10 10 10 10 20 20 20 17 17 17 20 20 20 -+20 20 20 3 3 3 21 21 21 19 19 19 20 20 20 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 6 6 6 10 10 10 11 11 11 13 13 13 13 13 13 13 13 13 -+13 13 13 13 13 13 10 10 10 6 6 6 3 3 3 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+6 6 6 20 20 20 13 13 13 0 0 0 6 6 6 14 14 14 19 19 19 29 29 29 -+38 38 38 36 36 36 23 23 23 4 4 4 6 6 6 21 21 21 24 24 24 17 17 17 -+39 39 39 43 43 43 25 25 25 0 0 0 4 4 4 10 10 10 0 0 0 6 6 6 -+23 23 23 56 56 56 20 20 20 0 0 0 11 11 11 0 0 0 4 4 4 10 10 10 -+31 31 31 57 57 57 43 43 43 16 16 16 21 21 21 16 16 16 3 3 3 17 17 17 -+31 31 31 59 59 59 46 46 46 14 14 14 14 14 14 8 8 8 0 0 0 21 21 21 -+39 39 39 60 60 60 57 57 57 31 31 31 13 13 13 14 14 14 19 19 19 23 23 23 -+39 39 39 69 69 69 68 68 68 33 33 33 16 16 16 25 25 25 29 29 29 24 24 24 -+48 48 48 68 68 68 68 68 68 54 54 54 38 38 38 42 42 42 53 53 53 42 42 42 -+39 39 39 81 81 81 82 82 82 62 62 62 32 32 32 43 43 43 52 52 52 44 44 44 -+50 50 50 73 73 73 85 85 85 81 81 81 59 59 59 48 48 48 59 59 59 60 60 60 -+61 61 61 77 77 77 91 91 91 90 90 90 80 80 80 68 68 68 66 66 66 70 70 70 -+67 67 67 84 84 84 91 91 91 87 87 87 87 87 87 87 87 87 83 83 83 82 82 82 -+80 80 80 85 85 85 105 105 105 91 91 91 94 94 94 109 110 110 92 92 92 87 87 87 -+90 90 90 92 92 92 92 92 92 90 90 90 95 95 94 105 105 105 109 110 110 105 105 105 -+96 97 98 101 101 101 101 101 101 99 99 99 99 99 99 103 103 102 105 105 105 109 110 110 -+109 110 110 103 103 102 105 105 105 112 112 113 117 117 117 125 122 126 125 125 127 115 116 115 -+115 116 115 122 111 100 109 110 110 98 114 115 109 108 122 109 108 122 98 114 115 83 172 72 -+146 184 30 83 172 72 83 172 72 83 172 115 83 172 72 83 172 72 83 172 72 83 172 72 -+83 172 72 86 124 83 238 240 244 254 249 251 255 255 255 255 255 255 252 251 251 252 251 251 -+252 251 251 200 220 210 200 220 210 200 220 210 200 220 210 180 183 185 180 183 185 169 175 167 -+112 112 113 118 122 119 122 121 126 115 116 115 26 29 32 1 3 7 11 13 16 14 16 19 -+11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 -+11 13 16 6 8 11 11 13 16 20 21 24 6 8 11 58 59 61 109 110 110 117 117 117 -+121 121 119 121 121 119 115 116 115 103 103 102 95 95 94 103 103 102 115 116 115 125 125 127 -+117 117 117 105 105 105 94 94 94 89 89 89 88 88 88 89 89 89 92 92 92 96 97 98 -+88 88 88 87 87 87 83 83 83 84 84 84 90 90 90 99 99 99 105 105 105 112 112 113 -+96 97 98 95 95 94 88 88 88 76 76 76 67 67 67 69 69 69 82 82 82 94 94 94 -+93 93 93 89 89 89 95 95 94 84 84 84 63 63 63 57 57 57 58 58 58 68 68 68 -+58 58 58 69 69 69 78 78 78 75 75 75 59 59 59 46 46 46 45 45 45 52 52 52 -+43 43 43 43 43 43 42 42 42 39 39 39 40 40 40 45 45 45 52 52 52 57 57 57 -+71 71 71 31 31 31 48 48 48 70 70 70 59 59 59 60 60 60 63 63 63 52 52 52 -+40 40 40 38 38 38 45 45 45 63 63 63 65 65 65 57 57 57 34 34 34 45 45 45 -+60 60 60 42 42 42 20 20 20 10 10 10 19 19 19 37 37 37 44 44 44 38 38 38 -+24 24 24 19 19 19 27 27 27 40 40 40 48 48 48 51 51 51 49 49 49 39 39 39 -+40 40 40 46 46 46 45 45 45 38 38 38 39 39 39 49 49 49 57 57 57 58 58 58 -+56 56 56 45 45 45 31 31 31 19 19 19 11 11 11 8 8 8 16 16 16 23 23 23 -+46 46 46 49 49 49 51 51 51 51 51 51 50 50 50 49 49 49 49 49 49 50 50 50 -+54 54 54 53 53 53 50 50 50 48 48 48 48 48 48 50 50 50 52 52 52 53 53 53 -+43 43 43 43 43 43 44 44 44 49 49 49 52 52 52 52 52 52 49 49 49 44 44 44 -+45 45 45 45 45 45 45 45 45 45 45 45 48 48 48 49 49 49 48 48 48 44 44 44 -+40 40 40 33 33 33 27 27 27 27 27 27 34 34 34 42 42 42 45 45 45 46 46 46 -+46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 44 44 44 44 44 44 -+48 48 48 46 46 46 45 45 45 44 44 44 45 45 45 46 46 46 48 48 48 48 48 48 -+50 50 50 46 46 46 34 34 34 23 23 23 23 23 23 32 32 32 33 33 33 28 28 28 -+14 14 14 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 14 14 14 14 14 14 -+10 10 10 17 17 17 17 17 17 10 10 10 14 14 14 27 27 27 34 34 34 32 32 32 -+23 23 23 14 14 14 13 13 13 19 19 19 17 17 17 11 11 11 16 16 16 27 27 27 -+33 33 33 28 28 28 20 20 20 11 11 11 10 10 10 13 13 13 13 13 13 11 11 11 -+4 4 4 24 24 24 37 37 37 31 31 31 19 19 19 13 13 13 13 13 13 13 13 13 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 11 11 11 20 20 20 21 21 21 17 17 17 -+20 20 20 17 17 17 20 20 20 10 10 10 10 10 10 20 20 20 17 17 17 20 20 20 -+20 20 20 3 3 3 21 21 21 19 19 19 20 20 20 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+10 10 10 11 11 11 16 16 16 19 19 19 20 20 20 19 19 19 17 17 17 17 17 17 -+20 20 20 19 19 19 17 17 17 14 14 14 11 11 11 8 8 8 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 14 14 14 17 17 17 6 6 6 0 0 0 8 8 8 16 16 16 17 17 17 -+23 23 23 37 37 37 34 34 34 14 14 14 6 6 6 20 20 20 24 24 24 14 14 14 -+24 24 24 33 33 33 39 39 39 19 19 19 0 0 0 6 6 6 3 3 3 0 0 0 -+4 4 4 25 25 25 54 54 54 23 23 23 0 0 0 13 13 13 0 0 0 6 6 6 -+4 4 4 36 36 36 50 50 50 39 39 39 24 24 24 21 21 21 20 20 20 14 14 14 -+3 3 3 40 40 40 59 59 59 43 43 43 16 16 16 4 4 4 11 11 11 14 14 14 -+11 11 11 45 45 45 61 61 61 50 50 50 31 31 31 17 17 17 14 14 14 19 19 19 -+19 19 19 50 50 50 68 68 68 59 59 59 39 39 39 24 24 24 24 24 24 32 32 32 -+25 25 25 50 50 50 69 69 69 73 73 73 57 57 57 44 44 44 46 46 46 39 39 39 -+40 40 40 67 67 67 74 74 74 76 76 76 52 52 52 45 45 45 45 45 45 50 50 50 -+46 46 46 68 68 68 88 88 88 91 91 91 69 69 69 51 51 51 58 58 58 59 59 59 -+49 49 49 70 70 70 94 94 94 99 99 99 81 81 81 66 66 66 66 66 66 72 72 72 -+70 70 70 71 71 71 87 87 87 105 105 105 105 104 105 78 78 78 71 71 71 87 87 87 -+81 81 81 90 90 90 87 87 87 112 112 113 115 116 115 96 96 96 99 99 99 85 85 85 -+92 92 92 94 94 94 94 94 94 96 97 98 105 105 105 112 112 113 109 110 110 99 99 99 -+101 101 101 103 103 102 105 104 105 103 103 102 103 103 102 105 105 105 109 110 110 109 110 110 -+103 103 102 105 105 105 115 116 115 121 121 119 125 122 126 127 127 127 121 121 119 112 112 113 -+98 114 115 109 108 122 109 108 122 121 113 124 113 122 108 86 124 83 141 180 99 146 184 30 -+146 184 30 83 172 72 83 172 72 83 172 115 83 172 72 83 172 72 83 172 72 83 172 72 -+83 172 72 83 172 115 238 240 244 255 255 255 252 251 251 255 255 255 255 255 255 252 251 251 -+255 255 255 252 251 251 255 255 255 255 255 255 255 255 255 252 251 251 246 251 251 200 220 210 -+134 134 134 122 121 126 129 129 130 87 87 87 1 3 7 11 13 16 6 8 11 10 11 14 -+8 10 13 8 10 13 8 10 13 8 10 13 8 10 13 8 10 13 8 10 13 8 10 13 -+11 13 16 1 3 7 6 8 11 11 13 16 8 10 13 96 97 98 109 110 110 112 112 113 -+121 121 119 128 128 128 131 131 131 121 121 119 105 105 105 96 96 96 99 99 99 103 103 102 -+127 127 127 122 121 126 115 116 115 105 105 105 101 101 101 95 95 94 91 91 91 88 88 88 -+94 94 94 91 91 91 87 87 87 84 84 84 83 83 83 85 85 85 90 90 90 93 93 93 -+105 105 105 105 105 105 103 103 102 93 93 93 85 85 85 85 85 85 93 93 93 101 101 101 -+82 82 82 70 70 70 75 75 75 87 87 87 94 94 94 92 92 92 72 72 72 54 54 54 -+57 57 57 60 60 60 71 71 71 81 81 81 76 76 76 61 61 61 52 52 52 52 52 52 -+50 50 50 50 50 50 48 48 48 45 45 45 43 43 43 42 42 42 43 43 43 44 44 44 -+76 76 76 66 66 66 72 72 72 75 75 75 72 72 72 65 65 65 48 48 48 42 42 42 -+50 50 50 67 67 67 59 59 59 32 32 32 28 28 28 56 56 56 49 49 49 37 37 37 -+62 62 62 51 51 51 28 28 28 6 6 6 8 8 8 19 19 19 25 25 25 29 29 29 -+24 24 24 19 19 19 20 20 20 27 27 27 37 37 37 50 50 50 56 56 56 51 51 51 -+50 50 50 56 56 56 56 56 56 49 49 49 45 45 45 49 49 49 51 51 51 50 50 50 -+54 54 54 37 37 37 23 23 23 21 21 21 17 17 17 11 11 11 20 20 20 36 36 36 -+42 42 42 43 43 43 46 46 46 50 50 50 52 52 52 51 51 51 46 46 46 43 43 43 -+48 48 48 51 51 51 52 52 52 49 49 49 44 44 44 42 42 42 44 44 44 48 48 48 -+49 49 49 46 46 46 44 44 44 48 48 48 52 52 52 54 54 54 53 53 53 50 50 50 -+46 46 46 45 45 45 45 45 45 48 48 48 48 48 48 46 46 46 44 44 44 44 44 44 -+31 31 31 28 28 28 27 27 27 33 33 33 43 43 43 48 48 48 46 46 46 43 43 43 -+46 46 46 46 46 46 45 45 45 45 45 45 44 44 44 44 44 44 45 45 45 45 45 45 -+49 49 49 45 45 45 44 44 44 45 45 45 48 48 48 48 48 48 43 43 43 38 38 38 -+37 37 37 28 28 28 14 14 14 11 11 11 25 25 25 37 37 37 32 32 32 17 17 17 -+11 11 11 11 11 11 11 11 11 11 11 11 13 13 13 14 14 14 16 16 16 16 16 16 -+10 10 10 17 17 17 17 17 17 13 13 13 24 24 24 39 39 39 37 37 37 20 20 20 -+13 13 13 11 11 11 13 13 13 16 16 16 14 14 14 14 14 14 25 25 25 38 38 38 -+27 27 27 20 20 20 13 13 13 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 -+14 14 14 34 34 34 38 38 38 19 19 19 4 4 4 11 11 11 17 17 17 13 13 13 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 11 11 11 20 20 20 21 21 21 17 17 17 -+20 20 20 17 17 17 20 20 20 10 10 10 10 10 10 20 20 20 17 17 17 20 20 20 -+20 20 20 3 3 3 21 21 21 19 19 19 20 20 20 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 6 6 6 10 10 10 -+19 19 19 19 19 19 19 19 19 17 17 17 16 16 16 14 14 14 11 11 11 10 10 10 -+14 14 14 14 14 14 17 17 17 19 19 19 19 19 19 16 16 16 8 8 8 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 -+0 0 0 10 10 10 20 20 20 13 13 13 0 0 0 4 4 4 17 17 17 14 14 14 -+11 11 11 14 14 14 27 27 27 37 37 37 31 31 31 16 16 16 14 14 14 25 25 25 -+19 19 19 4 4 4 27 27 27 40 40 40 20 20 20 0 0 0 4 4 4 6 6 6 -+0 0 0 6 6 6 27 27 27 48 48 48 27 27 27 0 0 0 11 11 11 0 0 0 -+6 6 6 0 0 0 32 32 32 54 54 54 42 42 42 27 27 27 25 25 25 20 20 20 -+14 14 14 11 11 11 39 39 39 58 58 58 39 39 39 19 19 19 16 16 16 11 11 11 -+11 11 11 17 17 17 37 37 37 59 59 59 57 57 57 32 32 32 17 17 17 23 23 23 -+25 25 25 20 20 20 37 37 37 67 67 67 69 69 69 42 42 42 27 27 27 38 38 38 -+42 42 42 50 50 50 56 56 56 72 72 72 80 80 80 50 50 50 28 28 28 42 42 42 -+62 62 62 45 45 45 45 45 45 83 83 83 83 83 83 62 62 62 42 42 42 50 50 50 -+68 68 68 69 69 69 67 67 67 80 80 80 90 90 90 74 74 74 56 56 56 56 56 56 -+63 63 63 77 77 77 80 80 80 81 81 81 89 89 89 84 84 84 71 71 71 71 71 71 -+78 78 78 77 77 77 87 87 87 103 103 102 105 104 105 90 90 90 80 80 80 82 82 82 -+89 89 89 82 82 82 96 96 96 109 110 110 112 112 113 105 105 105 92 92 92 96 97 98 -+95 95 94 93 93 93 96 97 98 109 110 110 115 116 115 109 110 110 103 103 102 101 101 101 -+105 105 105 103 103 102 103 103 102 109 110 110 115 116 115 115 116 115 112 112 113 109 110 110 -+109 110 110 121 121 119 125 122 126 122 121 126 127 127 127 127 127 127 122 121 126 121 121 119 -+125 128 138 122 111 100 105 107 94 86 124 83 83 172 72 83 172 72 83 172 72 146 184 30 -+146 184 30 83 172 72 83 172 72 83 172 72 83 172 72 83 172 72 83 172 72 83 172 115 -+83 172 72 83 172 115 200 220 210 248 249 239 255 255 255 255 255 255 252 251 251 255 255 255 -+255 255 255 252 251 251 255 255 255 255 255 255 252 251 251 252 251 251 255 255 255 238 240 244 -+166 167 167 127 127 127 122 121 126 14 16 19 0 0 4 10 11 14 8 10 13 14 16 19 -+11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 -+11 13 16 14 16 19 11 13 16 8 10 13 49 50 52 131 131 131 125 125 127 117 117 117 -+112 112 113 121 121 119 128 128 128 129 129 130 121 121 119 112 112 113 105 104 105 103 103 102 -+105 105 105 117 117 117 125 125 127 121 121 119 112 112 113 109 110 110 101 101 101 91 91 91 -+89 89 89 92 92 92 94 94 94 94 94 94 91 91 91 87 87 87 85 85 85 84 84 84 -+87 87 87 87 87 87 92 92 92 101 101 101 105 104 105 103 103 102 103 103 102 105 105 105 -+90 90 90 76 76 76 68 68 68 68 68 68 77 77 77 87 87 87 87 87 87 83 83 83 -+70 70 70 54 54 54 49 49 49 63 63 63 80 80 80 78 78 78 62 62 62 48 48 48 -+46 46 46 46 46 46 46 46 46 50 50 50 56 56 56 62 62 62 68 68 68 71 71 71 -+69 69 69 80 80 80 67 67 67 39 39 39 49 49 49 67 67 67 60 60 60 58 58 58 -+54 54 54 45 45 45 32 32 32 14 14 14 14 14 14 37 37 37 49 49 49 63 63 63 -+66 66 66 63 63 63 45 45 45 23 23 23 17 17 17 14 14 14 11 11 11 17 17 17 -+20 20 20 23 23 23 21 21 21 17 17 17 17 17 17 28 28 28 36 36 36 36 36 36 -+44 44 44 52 52 52 56 56 56 52 52 52 46 46 46 44 44 44 43 43 43 40 40 40 -+29 29 29 17 17 17 13 13 13 20 20 20 20 20 20 19 19 19 34 34 34 54 54 54 -+46 46 46 46 46 46 46 46 46 51 51 51 56 56 56 56 56 56 51 51 51 46 46 46 -+44 44 44 49 49 49 54 54 54 53 53 53 49 49 49 44 44 44 43 43 43 43 43 43 -+54 54 54 51 51 51 48 48 48 46 46 46 48 48 48 51 51 51 54 54 54 57 57 57 -+51 51 51 46 46 46 45 45 45 48 48 48 45 45 45 38 38 38 34 34 34 37 37 37 -+25 25 25 28 28 28 34 34 34 42 42 42 48 48 48 50 50 50 48 48 48 45 45 45 -+46 46 46 46 46 46 45 45 45 44 44 44 44 44 44 44 44 44 45 45 45 46 46 46 -+43 43 43 44 44 44 48 48 48 50 50 50 49 49 49 43 43 43 33 33 33 25 25 25 -+16 16 16 8 8 8 13 13 13 29 29 29 37 37 37 31 31 31 17 17 17 10 10 10 -+13 13 13 13 13 13 13 13 13 11 11 11 13 13 13 13 13 13 14 14 14 16 16 16 -+17 17 17 10 10 10 11 11 11 25 25 25 37 37 37 37 37 37 24 24 24 13 13 13 -+8 8 8 17 17 17 14 14 14 3 3 3 10 10 10 28 28 28 37 37 37 32 32 32 -+16 16 16 11 11 11 10 10 10 14 14 14 14 14 14 10 10 10 13 13 13 20 20 20 -+36 36 36 31 31 31 20 20 20 8 8 8 6 6 6 11 11 11 14 14 14 14 14 14 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 11 11 11 20 20 20 21 21 21 17 17 17 -+20 20 20 17 17 17 20 20 20 10 10 10 10 10 10 20 20 20 17 17 17 20 20 20 -+20 20 20 3 3 3 21 21 21 19 19 19 20 20 20 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 3 3 3 3 3 4 4 4 8 8 8 13 13 13 17 17 17 -+17 17 17 16 16 16 13 13 13 10 10 10 6 6 6 4 4 4 3 3 3 3 3 3 -+4 4 4 4 4 4 8 8 8 11 11 11 16 16 16 17 17 17 14 14 14 11 11 11 -+4 4 4 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 -+0 0 0 6 6 6 19 19 19 16 16 16 0 0 0 3 3 3 19 19 19 19 19 19 -+16 16 16 4 4 4 14 14 14 34 34 34 39 39 39 23 23 23 14 14 14 20 20 20 -+17 17 17 13 13 13 4 4 4 28 28 28 44 44 44 19 19 19 0 0 0 8 8 8 -+4 4 4 10 10 10 0 0 0 29 29 29 50 50 50 24 24 24 0 0 0 0 0 0 -+8 8 8 10 10 10 10 10 10 33 33 33 56 56 56 42 42 42 19 19 19 23 23 23 -+25 25 25 25 25 25 23 23 23 43 43 43 62 62 62 45 45 45 17 17 17 17 17 17 -+24 24 24 16 16 16 25 25 25 50 50 50 62 62 62 53 53 53 37 37 37 25 25 25 -+31 31 31 27 27 27 33 33 33 51 51 51 67 67 67 68 68 68 53 53 53 34 34 34 -+39 39 39 40 40 40 38 38 38 52 52 52 77 77 77 74 74 74 58 58 58 63 63 63 -+52 52 52 42 42 42 37 37 37 61 61 61 75 75 75 84 84 84 66 66 66 57 57 57 -+72 72 72 62 62 62 52 52 52 61 61 61 85 85 85 89 89 89 73 73 73 66 66 66 -+87 87 87 85 85 85 72 72 72 70 70 70 88 88 88 96 97 98 87 87 87 73 73 73 -+82 82 82 94 94 94 94 94 94 82 82 82 87 87 87 105 105 105 103 103 102 82 82 82 -+82 82 82 96 96 96 109 110 110 99 99 99 99 99 99 115 116 115 105 105 105 96 97 98 -+95 95 94 99 99 99 105 105 105 115 116 115 112 112 113 105 104 105 101 101 101 105 105 105 -+105 105 105 103 103 102 105 105 105 121 121 119 125 122 126 117 117 117 115 116 115 115 116 115 -+125 122 126 125 122 126 121 121 119 121 121 119 128 128 128 131 131 131 125 122 126 115 116 115 -+109 108 122 86 124 83 83 172 72 83 172 72 83 172 115 83 172 72 83 172 72 83 172 72 -+141 180 99 83 172 72 83 172 115 83 172 72 83 172 72 83 172 72 83 172 72 83 172 115 -+83 172 72 83 172 72 136 172 147 248 249 239 255 255 255 255 255 255 248 249 239 255 255 255 -+255 255 255 255 255 255 252 251 251 255 255 255 255 255 255 255 255 255 252 251 251 200 220 210 -+125 125 127 117 117 117 87 88 90 1 3 7 26 29 32 8 10 13 10 11 14 6 8 11 -+8 10 13 8 10 13 8 10 13 8 10 13 8 10 13 8 10 13 8 10 13 8 10 13 -+6 8 11 14 16 19 1 3 7 11 13 16 78 79 82 122 121 126 125 125 127 122 121 126 -+112 112 113 117 117 117 127 127 127 133 133 133 133 133 133 127 127 127 121 121 119 117 117 117 -+117 117 117 127 127 127 131 131 131 129 129 130 125 125 127 122 121 126 122 121 126 122 121 126 -+115 116 115 115 116 115 112 112 113 105 105 105 99 99 99 93 93 93 90 90 90 90 90 90 -+83 83 83 78 78 78 87 87 87 101 101 101 105 105 105 101 101 101 99 99 99 105 105 105 -+101 101 101 103 103 102 99 99 99 93 93 93 90 90 90 89 89 89 94 94 94 99 99 99 -+91 91 91 76 76 76 63 63 63 67 67 67 80 80 80 88 88 88 84 84 84 76 76 76 -+82 82 82 81 81 81 78 78 78 76 76 76 73 73 73 66 66 66 57 57 57 50 50 50 -+28 28 28 45 45 45 74 74 74 72 72 72 61 61 61 71 71 71 70 70 70 56 56 56 -+29 29 29 13 13 13 21 21 21 29 29 29 36 36 36 37 37 37 42 42 42 58 58 58 -+63 63 63 70 70 70 58 58 58 34 34 34 19 19 19 10 10 10 13 13 13 28 28 28 -+46 46 46 46 46 46 37 37 37 21 21 21 14 14 14 17 17 17 20 20 20 21 21 21 -+23 23 23 28 28 28 31 31 31 27 27 27 21 21 21 19 19 19 17 17 17 14 14 14 -+20 20 20 11 11 11 6 6 6 10 10 10 14 14 14 24 24 24 39 39 39 54 54 54 -+51 51 51 48 48 48 45 45 45 48 48 48 51 51 51 54 54 54 53 53 53 50 50 50 -+45 45 45 46 46 46 48 48 48 49 49 49 49 49 49 46 46 46 44 44 44 42 42 42 -+50 50 50 52 52 52 52 52 52 49 49 49 44 44 44 44 44 44 49 49 49 53 53 53 -+54 54 54 49 49 49 45 45 45 45 45 45 39 39 39 29 29 29 27 27 27 29 29 29 -+29 29 29 36 36 36 43 43 43 48 48 48 48 48 48 46 46 46 48 48 48 49 49 49 -+46 46 46 45 45 45 44 44 44 44 44 44 44 44 44 45 45 45 46 46 46 46 46 46 -+45 45 45 48 48 48 50 50 50 46 46 46 38 38 38 28 28 28 20 20 20 16 16 16 -+8 8 8 19 19 19 32 32 32 39 39 39 31 31 31 13 13 13 4 4 4 10 10 10 -+16 16 16 14 14 14 13 13 13 13 13 13 11 11 11 13 13 13 13 13 13 13 13 13 -+14 14 14 13 13 13 21 21 21 36 36 36 36 36 36 20 20 20 11 11 11 13 13 13 -+10 10 10 14 14 14 11 11 11 8 8 8 21 21 21 37 37 37 33 33 33 17 17 17 -+13 13 13 10 10 10 11 11 11 14 14 14 13 13 13 11 11 11 21 21 21 33 33 33 -+37 37 37 21 21 21 8 8 8 8 8 8 13 13 13 11 11 11 10 10 10 10 10 10 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 11 11 11 20 20 20 21 21 21 17 17 17 -+20 20 20 17 17 17 20 20 20 10 10 10 10 10 10 20 20 20 17 17 17 20 20 20 -+20 20 20 3 3 3 21 21 21 19 19 19 20 20 20 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 3 3 6 6 6 11 11 11 14 14 14 16 16 16 17 17 17 -+8 8 8 6 6 6 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 -+3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 11 11 11 17 17 17 21 21 21 -+11 11 11 6 6 6 0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 -+3 3 3 3 3 3 14 14 14 17 17 17 3 3 3 0 0 0 16 16 16 23 23 23 -+19 19 19 13 13 13 4 4 4 6 6 6 25 25 25 40 40 40 33 33 33 13 13 13 -+19 19 19 14 14 14 0 0 0 8 8 8 33 33 33 38 38 38 24 24 24 0 0 0 -+8 8 8 0 0 0 8 8 8 3 3 3 28 28 28 52 52 52 23 23 23 8 8 8 -+6 6 6 8 8 8 4 4 4 10 10 10 33 33 33 52 52 52 44 44 44 21 21 21 -+25 25 25 29 29 29 28 28 28 31 31 31 46 46 46 61 61 61 51 51 51 28 28 28 -+25 25 25 31 31 31 32 32 32 33 33 33 48 48 48 68 68 68 63 63 63 40 40 40 -+29 29 29 38 38 38 42 42 42 38 38 38 49 49 49 71 71 71 73 73 73 53 53 53 -+36 36 36 37 37 37 38 38 38 29 29 29 45 45 45 77 77 77 80 80 80 62 62 62 -+33 33 33 44 44 44 44 44 44 43 43 43 49 49 49 82 82 82 84 84 84 83 83 83 -+59 59 59 52 52 52 59 59 59 54 54 54 58 58 58 85 85 85 95 95 94 84 84 84 -+85 85 85 69 69 69 70 70 70 72 72 72 71 71 71 90 90 90 101 101 101 85 85 85 -+93 93 93 92 92 92 88 88 88 81 81 81 83 83 83 99 99 99 105 105 105 103 103 102 -+93 93 93 112 112 113 99 99 99 95 95 94 94 94 94 99 99 99 121 121 119 105 105 105 -+99 99 99 109 110 110 115 116 115 112 112 113 105 104 105 105 104 105 105 105 105 105 105 105 -+105 105 105 109 110 110 117 117 117 127 127 127 122 121 126 115 116 115 115 116 115 121 121 119 -+129 129 130 121 121 119 117 117 117 125 125 127 134 134 134 134 134 134 121 121 119 105 105 105 -+146 184 30 146 184 30 141 180 99 136 172 147 136 172 147 83 172 115 83 172 72 83 172 72 -+83 172 72 83 172 72 83 172 115 83 172 115 83 172 72 83 172 115 83 172 115 83 172 115 -+83 172 115 83 172 72 141 180 99 248 249 239 255 255 255 252 251 251 255 255 255 255 255 255 -+252 251 251 255 255 255 255 255 255 252 251 251 255 255 255 252 251 251 255 255 255 231 224 220 -+137 137 137 137 138 139 35 36 38 11 13 16 14 16 19 0 0 4 16 20 21 14 16 19 -+11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 -+11 13 16 14 16 19 1 3 7 51 52 54 109 110 110 105 105 105 122 121 126 133 133 133 -+131 131 131 128 128 128 125 125 127 128 128 128 133 133 133 134 134 134 128 128 128 121 121 119 -+112 112 113 109 110 110 112 112 113 121 121 119 121 121 119 105 105 105 105 105 105 112 112 113 -+117 117 117 117 117 117 121 121 119 121 121 119 117 117 117 112 112 113 112 112 113 109 110 110 -+105 105 105 99 99 99 99 99 99 101 101 101 94 94 94 83 83 83 85 85 85 96 96 96 -+105 105 105 103 103 102 87 87 87 78 78 78 80 80 80 81 81 81 85 85 85 85 85 85 -+87 87 87 93 93 93 96 96 96 91 91 91 83 83 83 77 77 77 81 81 81 87 87 87 -+80 80 80 72 72 72 61 61 61 53 53 53 50 50 50 46 46 46 42 42 42 38 38 38 -+59 59 59 60 60 60 73 73 73 75 75 75 66 66 66 49 49 49 46 46 46 70 70 70 -+38 38 38 31 31 31 44 44 44 44 44 44 48 48 48 45 45 45 43 43 43 43 43 43 -+46 46 46 62 62 62 66 66 66 51 51 51 33 33 33 28 28 28 40 40 40 56 56 56 -+68 68 68 59 59 59 39 39 39 21 21 21 19 19 19 19 19 19 19 19 19 20 20 20 -+31 31 31 29 29 29 25 25 25 19 19 19 14 14 14 14 14 14 16 16 16 17 17 17 -+23 23 23 19 19 19 16 16 16 23 23 23 34 34 34 43 43 43 45 45 45 44 44 44 -+54 54 54 52 52 52 49 49 49 48 48 48 50 50 50 52 52 52 54 54 54 56 56 56 -+52 52 52 48 48 48 44 44 44 44 44 44 48 48 48 50 50 50 50 50 50 49 49 49 -+45 45 45 52 52 52 58 58 58 56 56 56 50 50 50 44 44 44 44 44 44 48 48 48 -+51 51 51 48 48 48 44 44 44 39 39 39 33 33 33 28 28 28 27 27 27 29 29 29 -+37 37 37 43 43 43 49 49 49 49 49 49 46 46 46 45 45 45 46 46 46 50 50 50 -+45 45 45 45 45 45 44 44 44 44 44 44 45 45 45 45 45 45 46 46 46 46 46 46 -+51 51 51 49 49 49 44 44 44 33 33 33 20 20 20 11 11 11 10 10 10 13 13 13 -+14 14 14 32 32 32 39 39 39 28 28 28 11 11 11 8 8 8 16 16 16 20 20 20 -+16 16 16 16 16 16 14 14 14 13 13 13 11 11 11 11 11 11 11 11 11 11 11 11 -+10 10 10 24 24 24 36 36 36 33 33 33 20 20 20 6 6 6 8 8 8 14 14 14 -+14 14 14 8 8 8 13 13 13 27 27 27 36 36 36 31 31 31 17 17 17 6 6 6 -+16 16 16 13 13 13 11 11 11 10 10 10 11 11 11 17 17 17 28 28 28 38 38 38 -+17 17 17 17 17 17 16 16 16 13 13 13 13 13 13 14 14 14 13 13 13 10 10 10 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 11 11 11 20 20 20 21 21 21 17 17 17 -+20 20 20 17 17 17 20 20 20 10 10 10 10 10 10 20 20 20 17 17 17 20 20 20 -+20 20 20 3 3 3 21 21 21 19 19 19 20 20 20 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 4 4 4 11 11 11 17 17 17 17 17 17 13 13 13 8 8 8 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 11 11 11 16 16 16 -+17 17 17 11 11 11 3 3 3 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 -+3 3 3 0 0 0 10 10 10 19 19 19 10 10 10 0 0 0 6 6 6 21 21 21 -+16 16 16 16 16 16 0 0 0 0 0 0 10 10 10 38 38 38 42 42 42 28 28 28 -+20 20 20 6 6 6 0 0 0 6 6 6 6 6 6 31 31 31 46 46 46 16 16 16 -+0 0 0 3 3 3 0 0 0 11 11 11 3 3 3 25 25 25 59 59 59 21 21 21 -+13 13 13 0 0 0 8 8 8 10 10 10 3 3 3 38 38 38 58 58 58 36 36 36 -+24 24 24 14 14 14 27 27 27 28 28 28 19 19 19 48 48 48 67 67 67 48 48 48 -+33 33 33 32 32 32 32 32 32 28 28 28 33 33 33 53 53 53 66 66 66 59 59 59 -+43 43 43 36 36 36 36 36 36 36 36 36 36 36 36 49 49 49 66 66 66 73 73 73 -+42 42 42 32 32 32 33 33 33 28 28 28 42 42 42 68 68 68 74 74 74 72 72 72 -+52 52 52 48 48 48 45 45 45 46 46 46 48 48 48 72 72 72 80 80 80 94 94 94 -+66 66 66 54 54 54 63 63 63 57 57 57 52 52 52 77 77 77 95 95 94 95 95 94 -+83 83 83 63 63 63 68 68 68 74 74 74 65 65 65 77 77 77 101 101 101 99 99 99 -+105 105 105 85 85 85 80 80 80 89 89 89 88 88 88 84 84 84 99 99 99 115 116 115 -+121 121 119 99 99 99 103 103 102 92 92 92 91 91 91 103 103 102 101 101 101 121 121 119 -+115 116 115 117 117 117 115 116 115 105 105 105 105 104 105 105 105 105 109 110 110 105 105 105 -+112 112 113 121 121 119 125 125 127 122 121 126 115 116 115 115 116 115 117 117 117 125 122 126 -+125 125 127 117 117 117 125 125 127 137 137 137 137 137 137 129 129 130 121 121 119 109 110 110 -+146 184 30 146 184 30 146 184 30 136 172 147 136 172 147 83 172 115 83 172 72 83 172 72 -+83 172 72 83 172 72 83 172 72 83 172 72 187 210 182 187 210 182 83 172 72 83 172 72 -+83 172 72 83 172 72 83 172 72 231 246 232 255 255 255 252 251 251 255 255 255 248 249 239 -+255 255 255 255 255 255 252 251 251 255 255 255 255 255 255 246 251 251 255 255 255 231 224 220 -+133 133 133 100 101 103 0 0 4 16 20 21 8 10 13 8 10 13 16 20 21 10 11 14 -+10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 -+8 10 13 8 10 13 11 13 16 100 101 103 129 129 130 122 121 126 129 129 130 137 138 139 -+139 139 139 133 133 133 121 121 119 112 112 113 117 117 117 129 129 130 133 133 133 131 131 131 -+109 110 110 103 103 102 103 103 102 115 116 115 121 121 119 117 117 117 105 105 105 103 103 102 -+103 103 102 105 105 105 112 112 113 117 117 117 121 121 119 121 121 119 121 121 119 115 116 115 -+115 116 115 112 112 113 109 110 110 103 103 102 91 91 91 81 81 81 78 78 78 81 81 81 -+95 95 94 105 104 105 94 94 94 85 85 85 76 76 76 66 66 66 69 69 69 69 69 69 -+62 62 62 72 72 72 87 87 87 90 90 90 77 77 77 59 59 59 53 53 53 58 58 58 -+84 84 84 71 71 71 54 54 54 48 48 48 52 52 52 63 63 63 73 73 73 78 78 78 -+75 75 75 69 69 69 45 45 45 40 40 40 68 68 68 59 59 59 34 34 34 59 59 59 -+65 65 65 32 32 32 39 39 39 50 50 50 52 52 52 36 36 36 38 38 38 54 54 54 -+42 42 42 53 53 53 66 66 66 63 63 63 53 53 53 53 53 53 60 60 60 65 65 65 -+53 53 53 45 45 45 27 27 27 14 14 14 17 17 17 17 17 17 19 19 19 28 28 28 -+29 29 29 25 25 25 19 19 19 14 14 14 14 14 14 14 14 14 16 16 16 17 17 17 -+16 16 16 16 16 16 24 24 24 38 38 38 51 51 51 56 56 56 51 51 51 44 44 44 -+51 51 51 51 51 51 51 51 51 49 49 49 48 48 48 49 49 49 51 51 51 54 54 54 -+51 51 51 49 49 49 46 46 46 46 46 46 48 48 48 50 50 50 50 50 50 50 50 50 -+40 40 40 44 44 44 48 48 48 49 49 49 46 46 46 42 42 42 39 39 39 38 38 38 -+40 40 40 40 40 40 39 39 39 33 33 33 32 32 32 34 34 34 38 38 38 39 39 39 -+45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 -+44 44 44 44 44 44 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 -+45 45 45 39 39 39 28 28 28 17 17 17 8 8 8 8 8 8 13 13 13 17 17 17 -+27 27 27 32 32 32 29 29 29 16 16 16 8 8 8 14 14 14 20 20 20 21 21 21 -+14 14 14 14 14 14 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 14 14 14 -+23 23 23 32 32 32 33 33 33 23 23 23 10 10 10 8 8 8 13 13 13 14 14 14 -+11 11 11 13 13 13 23 23 23 34 34 34 32 32 32 17 17 17 8 8 8 10 10 10 -+16 16 16 13 13 13 11 11 11 13 13 13 21 21 21 28 28 28 29 29 29 25 25 25 -+6 6 6 16 16 16 20 20 20 16 16 16 11 11 11 14 14 14 20 20 20 24 24 24 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 11 11 11 20 20 20 21 21 21 17 17 17 -+20 20 20 17 17 17 20 20 20 10 10 10 10 10 10 20 20 20 17 17 17 20 20 20 -+20 20 20 3 3 3 21 21 21 19 19 19 20 20 20 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 6 6 6 14 14 14 20 20 20 17 17 17 8 8 8 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 -+0 0 0 3 3 3 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 3 3 3 -+20 20 20 13 13 13 4 4 4 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 -+3 3 3 0 0 0 6 6 6 19 19 19 14 14 14 0 0 0 0 0 0 20 20 20 -+19 19 19 13 13 13 4 4 4 3 3 3 4 4 4 16 16 16 32 32 32 44 44 44 -+16 16 16 24 24 24 3 3 3 0 0 0 6 6 6 0 0 0 27 27 27 50 50 50 -+10 10 10 10 10 10 16 16 16 0 0 0 0 0 0 10 10 10 25 25 25 53 53 53 -+20 20 20 11 11 11 4 4 4 8 8 8 8 8 8 8 8 8 31 31 31 60 60 60 -+24 24 24 17 17 17 13 13 13 17 17 17 20 20 20 20 20 20 39 39 39 67 67 67 -+53 53 53 27 27 27 23 23 23 34 34 34 28 28 28 23 23 23 43 43 43 67 67 67 -+60 60 60 36 36 36 27 27 27 31 31 31 25 25 25 25 25 25 49 49 49 70 70 70 -+74 74 74 46 46 46 34 34 34 49 49 49 67 67 67 53 53 53 45 45 45 82 82 82 -+82 82 82 57 57 57 43 43 43 53 53 53 61 61 61 76 76 76 70 70 70 82 82 82 -+89 89 89 67 67 67 58 58 58 59 59 59 70 70 70 78 78 78 80 80 80 96 96 96 -+99 99 99 81 81 81 73 73 73 76 76 76 75 75 75 75 75 75 92 92 92 109 110 110 -+109 110 110 90 90 90 83 83 83 87 87 87 85 85 85 85 85 85 96 96 96 105 105 105 -+117 117 117 109 110 110 96 96 96 99 99 99 101 101 101 96 97 98 105 105 105 109 110 110 -+129 129 130 117 117 117 105 105 105 105 105 105 109 110 110 109 110 110 109 110 110 109 110 110 -+121 121 119 128 128 128 127 127 127 115 116 115 112 112 113 117 117 117 121 121 119 121 121 119 -+121 121 119 117 117 117 137 137 137 147 147 148 134 134 134 121 121 119 122 121 126 121 121 119 -+86 124 83 141 180 99 83 172 72 83 172 72 83 172 72 83 172 72 83 172 72 83 172 72 -+83 172 72 83 172 72 83 172 72 83 172 72 136 172 147 136 172 147 83 172 72 83 172 72 -+83 172 72 83 172 72 141 180 99 187 210 182 254 249 251 252 251 251 246 251 251 252 251 251 -+252 251 251 255 255 255 255 255 255 252 251 251 252 251 251 255 255 255 252 251 251 161 161 162 -+122 121 126 37 39 42 11 13 16 11 13 16 8 10 13 14 16 19 8 10 13 10 11 14 -+11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 -+8 10 13 11 13 16 24 25 28 133 133 133 137 137 137 137 138 139 125 125 127 115 116 115 -+121 121 119 129 129 130 133 133 133 121 121 119 112 112 113 115 116 115 125 122 126 128 128 128 -+129 129 130 121 121 119 109 110 110 103 103 102 115 116 115 128 128 128 121 121 119 103 103 102 -+105 104 105 101 101 101 96 97 98 99 99 99 103 103 102 109 110 110 115 116 115 121 121 119 -+112 112 113 117 117 117 121 121 119 115 116 115 109 110 110 105 105 105 94 94 94 81 81 81 -+89 89 89 105 105 105 101 101 101 96 97 98 91 91 91 77 77 77 73 73 73 68 68 68 -+68 68 68 60 60 60 66 66 66 84 84 84 89 89 89 75 75 75 62 62 62 59 59 59 -+82 82 82 81 81 81 81 81 81 83 83 83 84 84 84 76 76 76 63 63 63 52 52 52 -+38 38 38 43 43 43 43 43 43 33 33 33 48 48 48 66 66 66 53 53 53 37 37 37 -+63 63 63 51 51 51 57 57 57 44 44 44 46 46 46 48 48 48 50 50 50 40 40 40 -+45 45 45 42 42 42 46 46 46 48 48 48 43 43 43 46 46 46 46 46 46 37 37 37 -+38 38 38 37 37 37 29 29 29 27 27 27 28 28 28 27 27 27 34 34 34 51 51 51 -+29 29 29 27 27 27 25 25 25 28 28 28 31 31 31 31 31 31 28 28 28 25 25 25 -+28 28 28 28 28 28 32 32 32 39 39 39 42 42 42 37 37 37 32 32 32 31 31 31 -+27 27 27 31 31 31 33 33 33 32 32 32 28 28 28 25 25 25 28 28 28 32 32 32 -+27 27 27 29 29 29 33 33 33 34 34 34 33 33 33 31 31 31 28 28 28 27 27 27 -+33 33 33 29 29 29 27 27 27 28 28 28 29 29 29 31 31 31 28 28 28 24 24 24 -+31 31 31 36 36 36 34 34 34 31 31 31 32 32 32 40 40 40 48 48 48 50 50 50 -+50 50 50 45 45 45 42 42 42 43 43 43 48 48 48 49 49 49 46 46 46 43 43 43 -+43 43 43 44 44 44 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 45 45 45 -+33 33 33 24 24 24 13 13 13 6 6 6 10 10 10 16 16 16 20 20 20 21 21 21 -+43 43 43 28 28 28 16 16 16 19 19 19 21 21 21 17 17 17 10 10 10 6 6 6 -+13 13 13 13 13 13 11 11 11 11 11 11 13 13 13 14 14 14 16 16 16 16 16 16 -+43 43 43 32 32 32 19 19 19 13 13 13 14 14 14 17 17 17 16 16 16 14 14 14 -+6 6 6 24 24 24 36 36 36 31 31 31 16 16 16 4 4 4 10 10 10 19 19 19 -+11 11 11 11 11 11 11 11 11 20 20 20 33 33 33 38 38 38 25 25 25 4 4 4 -+16 16 16 13 13 13 11 11 11 13 13 13 11 11 11 11 11 11 24 24 24 39 39 39 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 20 20 20 21 21 21 17 17 17 -+17 17 17 19 19 19 17 17 17 11 11 11 11 11 11 17 17 17 19 19 19 17 17 17 -+20 20 20 3 3 3 21 21 21 19 19 19 20 20 20 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 4 4 4 3 3 3 0 0 0 -+0 0 0 13 13 13 19 19 19 14 14 14 10 10 10 6 6 6 4 4 4 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 -+6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 6 6 6 4 4 4 -+4 4 4 21 21 21 19 19 19 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 6 6 6 17 17 17 13 13 13 0 0 0 3 3 3 19 19 19 -+17 17 17 17 17 17 3 3 3 3 3 3 0 0 0 16 16 16 21 21 21 28 28 28 -+51 51 51 20 20 20 0 0 0 6 6 6 3 3 3 0 0 0 4 4 4 24 24 24 -+51 51 51 6 6 6 0 0 0 4 4 4 3 3 3 8 8 8 14 14 14 27 27 27 -+57 57 57 21 21 21 6 6 6 3 3 3 8 8 8 16 16 16 17 17 17 31 31 31 -+63 63 63 31 31 31 8 8 8 14 14 14 14 14 14 10 10 10 21 21 21 38 38 38 -+69 69 69 46 46 46 25 25 25 17 17 17 19 19 19 25 25 25 28 28 28 25 25 25 -+69 69 69 61 61 61 34 34 34 28 28 28 31 31 31 27 27 27 36 36 36 39 39 39 -+80 80 80 70 70 70 51 51 51 65 65 65 54 54 54 43 43 43 39 39 39 44 44 44 -+78 78 78 91 91 91 60 60 60 54 54 54 78 78 78 65 65 65 49 49 49 57 57 57 -+82 82 82 95 95 94 75 75 75 56 56 56 77 77 77 89 89 89 74 74 74 66 66 66 -+94 94 94 99 99 99 89 89 89 73 73 73 77 77 77 94 94 94 95 95 94 81 81 81 -+99 99 99 109 110 110 105 105 105 88 88 88 84 84 84 99 99 99 109 110 110 105 105 105 -+99 99 99 127 127 127 112 112 113 91 91 91 101 101 101 105 105 105 105 105 105 127 127 127 -+109 110 110 127 127 127 121 121 119 112 112 113 109 110 110 105 105 105 117 117 117 125 125 127 -+134 134 134 125 125 127 115 116 115 115 116 115 125 125 127 134 134 134 131 131 131 125 122 126 -+121 121 119 131 131 131 142 143 144 134 134 134 127 127 127 125 125 127 125 125 127 137 137 137 -+116 129 109 83 172 115 83 172 72 83 172 72 83 172 72 83 172 115 83 172 72 83 172 72 -+83 172 72 83 172 115 83 172 115 83 172 72 83 172 72 83 172 115 83 172 115 83 172 72 -+83 172 72 83 172 72 141 180 99 141 180 99 252 251 251 255 255 255 248 249 239 252 251 251 -+255 255 255 252 251 251 255 255 255 252 251 251 255 255 255 255 255 255 252 251 251 231 246 232 -+83 84 85 20 21 24 8 10 13 11 13 16 6 8 11 11 13 16 8 10 13 14 16 19 -+10 11 14 14 16 19 6 8 11 6 8 11 14 16 19 11 13 16 8 10 13 10 11 14 -+13 13 13 14 14 14 92 92 92 117 117 117 121 121 119 133 133 133 134 134 134 121 121 119 -+117 117 117 121 121 119 129 129 130 134 134 134 122 121 126 112 112 113 115 116 115 115 116 115 -+133 133 133 134 134 134 125 122 126 109 110 110 109 110 110 115 116 115 121 121 119 127 127 127 -+105 105 105 101 101 101 103 103 102 105 104 105 101 101 101 95 95 94 105 104 105 117 117 117 -+109 110 110 109 110 110 109 110 110 112 112 113 112 112 113 112 112 113 112 112 113 109 110 110 -+105 105 105 103 103 102 103 103 102 105 105 105 105 105 105 101 101 101 90 90 90 85 85 85 -+87 87 87 77 77 77 80 80 80 90 90 90 91 91 91 91 91 91 92 92 92 92 92 92 -+83 83 83 77 77 77 84 84 84 78 78 78 53 53 53 44 44 44 50 50 50 44 44 44 -+46 46 46 40 40 40 36 36 36 39 39 39 44 44 44 48 48 48 52 52 52 57 57 57 -+42 42 42 57 57 57 53 53 53 43 43 43 48 48 48 51 51 51 46 46 46 46 46 46 -+46 46 46 42 42 42 44 44 44 45 45 45 39 39 39 38 38 38 40 40 40 39 39 39 -+36 36 36 45 45 45 39 39 39 31 31 31 39 39 39 49 49 49 43 43 43 37 37 37 -+34 34 34 29 29 29 34 34 34 34 34 34 27 27 27 29 29 29 34 34 34 28 28 28 -+33 33 33 29 29 29 34 34 34 43 43 43 38 38 38 31 31 31 32 32 32 28 28 28 -+31 31 31 29 29 29 28 28 28 29 29 29 31 31 31 27 27 27 25 25 25 29 29 29 -+28 28 28 44 44 44 31 31 31 24 24 24 29 29 29 29 29 29 32 32 32 23 23 23 -+25 25 25 29 29 29 24 24 24 23 23 23 29 29 29 29 29 29 27 27 27 32 32 32 -+40 40 40 42 42 42 43 43 43 46 46 46 49 49 49 50 50 50 46 46 46 44 44 44 -+46 46 46 50 50 50 46 46 46 45 45 45 50 50 50 48 48 48 42 42 42 44 44 44 -+45 45 45 48 48 48 49 49 49 46 46 46 46 46 46 46 46 46 40 40 40 33 33 33 -+16 16 16 13 13 13 14 14 14 16 16 16 13 13 13 13 13 13 27 27 27 43 43 43 -+28 28 28 21 21 21 13 13 13 10 10 10 11 11 11 14 14 14 13 13 13 11 11 11 -+14 14 14 8 8 8 13 13 13 20 20 20 14 14 14 6 6 6 21 21 21 43 43 43 -+32 32 32 20 20 20 10 10 10 13 13 13 19 19 19 16 16 16 11 11 11 11 11 11 -+23 23 23 39 39 39 44 44 44 29 29 29 17 17 17 21 21 21 28 28 28 29 29 29 -+27 27 27 28 28 28 31 31 31 36 36 36 37 37 37 34 34 34 29 29 29 27 27 27 -+28 28 28 31 31 31 29 29 29 24 24 24 27 27 27 36 36 36 38 38 38 36 36 36 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 20 20 20 21 21 21 17 17 17 -+17 17 17 19 19 19 17 17 17 11 11 11 11 11 11 17 17 17 19 19 19 17 17 17 -+20 20 20 3 3 3 21 21 21 19 19 19 20 20 20 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 3 3 3 4 4 4 0 0 0 -+4 4 4 14 14 14 19 19 19 13 13 13 6 6 6 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 3 3 3 8 8 8 11 11 11 13 13 13 11 11 11 10 10 10 -+14 14 14 14 14 14 11 11 11 8 8 8 3 3 3 0 0 0 0 0 0 0 0 0 -+3 3 3 20 20 20 19 19 19 4 4 4 3 3 3 3 3 3 0 0 0 0 0 0 -+3 3 3 0 0 0 4 4 4 16 16 16 13 13 13 0 0 0 3 3 3 17 17 17 -+17 17 17 19 19 19 3 3 3 3 3 3 0 0 0 16 16 16 20 20 20 27 27 27 -+29 29 29 49 49 49 25 25 25 0 0 0 3 3 3 8 8 8 0 0 0 10 10 10 -+27 27 27 52 52 52 17 17 17 3 3 3 11 11 11 0 0 0 8 8 8 4 4 4 -+21 21 21 59 59 59 25 25 25 6 6 6 14 14 14 0 0 0 13 13 13 16 16 16 -+36 36 36 59 59 59 38 38 38 0 0 0 16 16 16 21 21 21 10 10 10 14 14 14 -+32 32 32 63 63 63 52 52 52 21 21 21 24 24 24 21 21 21 13 13 13 29 29 29 -+37 37 37 71 71 71 62 62 62 37 37 37 29 29 29 28 28 28 32 32 32 32 32 32 -+42 42 42 78 78 78 78 78 78 62 62 62 33 33 33 40 40 40 49 49 49 45 45 45 -+54 54 54 77 77 77 85 85 85 78 78 78 59 59 59 45 45 45 56 56 56 58 58 58 -+60 60 60 78 78 78 92 92 92 89 89 89 77 77 77 69 69 69 65 65 65 65 65 65 -+76 76 76 91 91 91 96 96 96 88 88 88 85 85 85 92 92 92 91 91 91 83 83 83 -+81 81 81 103 103 102 112 112 113 103 103 102 99 99 99 105 105 105 105 105 105 96 96 96 -+99 99 99 99 99 99 121 121 119 121 121 119 101 101 101 109 110 110 122 121 126 112 112 113 -+112 112 113 105 105 105 133 133 133 121 121 119 105 105 105 121 121 119 121 121 119 131 131 131 -+128 128 128 117 117 117 115 116 115 128 128 128 134 134 134 128 128 128 122 121 126 127 127 127 -+131 131 131 140 140 140 137 137 137 125 125 127 125 125 127 133 133 133 137 137 137 145 146 147 -+140 140 140 86 124 83 83 172 72 83 172 72 83 172 72 83 172 72 83 172 72 83 172 72 -+83 172 72 83 172 115 136 172 147 83 172 72 83 172 72 83 172 72 83 172 72 141 180 99 -+83 172 72 83 172 72 83 172 72 141 180 99 246 251 251 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 252 251 251 255 255 255 255 255 255 246 251 251 231 224 220 109 110 110 -+49 50 52 6 8 11 10 11 14 11 13 16 6 8 11 14 16 19 8 10 13 10 11 14 -+8 10 13 11 13 16 10 11 14 8 10 13 11 13 16 11 13 16 11 13 16 11 13 16 -+4 4 4 42 42 42 109 110 110 121 121 119 117 117 117 127 127 127 137 137 137 137 138 139 -+125 125 127 127 127 127 129 129 130 131 131 131 127 127 127 121 121 119 121 121 119 117 117 117 -+125 122 126 137 137 137 142 143 144 134 134 134 125 122 126 115 116 115 117 117 117 125 125 127 -+125 122 126 112 112 113 101 101 101 96 97 98 103 103 102 109 110 110 112 112 113 112 112 113 -+96 96 96 94 94 94 92 92 92 92 92 92 92 92 92 93 93 93 93 93 93 92 92 92 -+109 110 110 105 105 105 105 105 105 105 104 105 99 99 99 96 96 96 101 101 101 105 105 105 -+94 94 94 83 83 83 83 83 83 82 82 82 70 70 70 74 74 74 87 87 87 87 87 87 -+67 67 67 54 54 54 60 60 60 77 77 77 73 73 73 52 52 52 44 44 44 50 50 50 -+42 42 42 43 43 43 43 43 43 39 39 39 33 33 33 37 37 37 53 53 53 70 70 70 -+38 38 38 45 45 45 53 53 53 53 53 53 48 48 48 44 44 44 45 45 45 46 46 46 -+45 45 45 43 43 43 44 44 44 44 44 44 40 40 40 43 43 43 40 40 40 29 29 29 -+37 37 37 36 36 36 28 28 28 31 31 31 42 42 42 43 43 43 33 33 33 28 28 28 -+32 32 32 31 31 31 34 34 34 43 43 43 45 45 45 37 37 37 32 32 32 38 38 38 -+36 36 36 37 37 37 44 44 44 48 48 48 39 39 39 34 34 34 37 37 37 36 36 36 -+39 39 39 32 32 32 29 29 29 37 37 37 39 39 39 37 37 37 37 37 37 42 42 42 -+37 37 37 49 49 49 42 42 42 40 40 40 40 40 40 34 34 34 39 39 39 40 40 40 -+38 38 38 44 44 44 42 42 42 38 38 38 39 39 39 38 38 38 39 39 39 48 48 48 -+46 46 46 45 45 45 46 46 46 50 50 50 54 54 54 54 54 54 50 50 50 45 45 45 -+43 43 43 49 49 49 48 48 48 46 46 46 48 48 48 44 44 44 40 40 40 45 45 45 -+44 44 44 46 46 46 49 49 49 48 48 48 45 45 45 39 39 39 25 25 25 11 11 11 -+10 10 10 11 11 11 10 10 10 4 4 4 14 14 14 29 29 29 37 37 37 36 36 36 -+16 16 16 14 14 14 11 11 11 13 13 13 16 16 16 16 16 16 14 14 14 11 11 11 -+11 11 11 16 16 16 11 11 11 4 4 4 13 13 13 29 29 29 38 38 38 37 37 37 -+13 13 13 11 11 11 14 14 14 20 20 20 24 24 24 29 29 29 36 36 36 40 40 40 -+40 40 40 36 36 36 29 29 29 25 25 25 27 27 27 28 28 28 27 27 27 24 24 24 -+16 16 16 29 29 29 37 37 37 32 32 32 24 24 24 21 21 21 20 20 20 20 20 20 -+23 23 23 20 20 20 20 20 20 27 27 27 33 33 33 33 33 33 28 28 28 23 23 23 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 20 20 20 21 21 21 17 17 17 -+17 17 17 19 19 19 17 17 17 11 11 11 11 11 11 17 17 17 19 19 19 17 17 17 -+20 20 20 3 3 3 21 21 21 19 19 19 20 20 20 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 3 3 3 -+13 13 13 17 17 17 17 17 17 11 11 11 4 4 4 0 0 0 0 0 0 0 0 0 -+0 0 0 4 4 4 10 10 10 13 13 13 11 11 11 8 8 8 4 4 4 3 3 3 -+4 4 4 10 10 10 14 14 14 13 13 13 6 6 6 0 0 0 0 0 0 4 4 4 -+0 0 0 16 16 16 17 17 17 8 8 8 4 4 4 3 3 3 0 0 0 0 0 0 -+4 4 4 0 0 0 3 3 3 16 16 16 14 14 14 0 0 0 3 3 3 16 16 16 -+19 19 19 19 19 19 4 4 4 3 3 3 0 0 0 16 16 16 19 19 19 24 24 24 -+19 19 19 40 40 40 42 42 42 16 16 16 0 0 0 4 4 4 8 8 8 0 0 0 -+17 17 17 24 24 24 50 50 50 24 24 24 0 0 0 11 11 11 0 0 0 8 8 8 -+8 8 8 27 27 27 56 56 56 28 28 28 3 3 3 14 14 14 0 0 0 16 16 16 -+6 6 6 44 44 44 59 59 59 38 38 38 13 13 13 11 11 11 16 16 16 10 10 10 -+10 10 10 40 40 40 59 59 59 50 50 50 28 28 28 19 19 19 23 23 23 28 28 28 -+20 20 20 46 46 46 67 67 67 63 63 63 39 39 39 28 28 28 38 38 38 33 33 33 -+37 37 37 66 66 66 75 75 75 76 76 76 50 50 50 39 39 39 40 40 40 48 48 48 -+42 42 42 62 62 62 87 87 87 91 91 91 63 63 63 48 48 48 60 60 60 60 60 60 -+53 53 53 70 70 70 92 92 92 99 99 99 82 82 82 62 62 62 65 65 65 77 77 77 -+73 73 73 75 75 75 91 91 91 109 110 110 105 105 105 87 87 87 80 80 80 89 89 89 -+85 85 85 90 90 90 103 103 102 115 116 115 117 117 117 105 105 105 99 99 99 96 97 98 -+99 99 99 99 99 99 112 112 113 121 121 119 121 121 119 121 121 119 117 117 117 109 110 110 -+105 105 105 115 116 115 115 116 115 131 131 131 127 127 127 117 117 117 137 137 137 125 122 126 -+121 121 119 117 117 117 125 125 127 137 137 137 134 134 134 122 121 126 122 121 126 133 133 133 -+133 133 133 139 139 139 129 129 130 127 127 127 129 129 130 137 138 139 142 143 144 144 145 144 -+124 112 115 116 129 109 83 172 115 83 172 115 83 172 72 83 172 72 83 172 72 83 172 72 -+83 172 115 83 172 115 141 180 99 83 172 72 83 172 115 83 172 72 146 184 30 146 184 30 -+141 180 99 83 172 72 83 172 72 83 172 72 231 246 232 252 251 251 255 255 255 252 251 251 -+255 255 255 255 255 255 255 255 255 252 251 251 255 255 255 255 255 255 252 251 251 180 183 185 -+14 16 19 1 3 7 14 16 19 11 13 16 6 8 11 16 20 21 8 10 13 10 11 14 -+8 10 13 11 13 16 14 16 19 10 11 14 6 8 11 11 13 16 11 13 16 11 13 16 -+17 17 17 78 78 78 121 121 119 117 117 117 112 112 113 109 110 110 125 122 126 133 133 133 -+137 137 137 137 138 139 134 134 134 133 133 133 134 134 134 133 133 133 127 127 127 121 121 119 -+121 121 119 121 121 119 128 128 128 133 133 133 131 131 131 128 128 128 125 122 126 121 121 119 -+127 127 127 121 121 119 109 110 110 103 103 102 112 112 113 121 121 119 117 117 117 103 103 102 -+99 99 99 96 96 96 93 93 93 92 92 92 92 92 92 92 92 92 91 91 91 90 90 90 -+85 85 85 95 95 94 112 112 113 109 110 110 88 88 88 75 75 75 87 87 87 99 99 99 -+94 94 94 73 73 73 62 62 62 66 66 66 65 65 65 61 61 61 70 70 70 81 81 81 -+87 87 87 68 68 68 52 52 52 65 65 65 82 82 82 73 73 73 52 52 52 44 44 44 -+44 44 44 45 45 45 48 48 48 48 48 48 43 43 43 39 39 39 44 44 44 52 52 52 -+66 66 66 43 43 43 39 39 39 49 49 49 50 50 50 51 51 51 51 51 51 42 42 42 -+49 49 49 52 52 52 57 57 57 59 59 59 62 62 62 67 67 67 54 54 54 29 29 29 -+16 16 16 19 19 19 24 24 24 34 34 34 36 36 36 20 20 20 6 6 6 11 11 11 -+17 17 17 43 43 43 57 57 57 59 59 59 50 50 50 23 23 23 6 6 6 19 19 19 -+42 42 42 43 43 43 52 52 52 54 54 54 46 46 46 46 46 46 53 53 53 58 58 58 -+54 54 54 50 50 50 46 46 46 46 46 46 48 48 48 51 51 51 52 52 52 50 50 50 -+45 45 45 50 50 50 48 48 48 53 53 53 53 53 53 45 45 45 45 45 45 49 49 49 -+46 46 46 53 53 53 54 54 54 50 50 50 46 46 46 43 43 43 46 46 46 56 56 56 -+52 52 52 50 50 50 48 48 48 50 50 50 53 53 53 56 56 56 53 53 53 50 50 50 -+43 43 43 49 49 49 49 49 49 46 46 46 45 45 45 43 43 43 42 42 42 46 46 46 -+44 44 44 49 49 49 50 50 50 45 45 45 36 36 36 25 25 25 13 13 13 3 3 3 -+11 11 11 13 13 13 10 10 10 13 13 13 24 24 24 34 34 34 31 31 31 17 17 17 -+14 14 14 13 13 13 10 10 10 10 10 10 11 11 11 13 13 13 14 14 14 14 14 14 -+14 14 14 19 19 19 14 14 14 6 6 6 21 21 21 42 42 42 40 40 40 25 25 25 -+34 34 34 37 37 37 34 34 34 24 24 24 16 16 16 16 16 16 24 24 24 29 29 29 -+37 37 37 20 20 20 8 8 8 17 17 17 24 24 24 19 19 19 13 13 13 11 11 11 -+20 20 20 33 33 33 36 36 36 21 21 21 11 11 11 13 13 13 16 16 16 13 13 13 -+11 11 11 10 10 10 20 20 20 32 32 32 34 34 34 24 24 24 14 14 14 11 11 11 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 20 20 20 21 21 21 17 17 17 -+17 17 17 19 19 19 17 17 17 11 11 11 11 11 11 17 17 17 19 19 19 17 17 17 -+20 20 20 3 3 3 21 21 21 19 19 19 20 20 20 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 6 6 6 -+19 19 19 19 19 19 14 14 14 8 8 8 0 0 0 0 0 0 0 0 0 3 3 3 -+11 11 11 11 11 11 11 11 11 8 8 8 3 3 3 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 6 6 6 8 8 8 6 6 6 4 4 4 4 4 4 6 6 6 -+0 0 0 11 11 11 17 17 17 11 11 11 6 6 6 3 3 3 0 0 0 0 0 0 -+6 6 6 0 0 0 0 0 0 14 14 14 14 14 14 3 3 3 3 3 3 14 14 14 -+19 19 19 19 19 19 3 3 3 3 3 3 0 0 0 16 16 16 17 17 17 21 21 21 -+20 20 20 13 13 13 32 32 32 40 40 40 17 17 17 0 0 0 6 6 6 4 4 4 -+3 3 3 4 4 4 28 28 28 51 51 51 27 27 27 0 0 0 13 13 13 11 11 11 -+6 6 6 8 8 8 29 29 29 52 52 52 33 33 33 6 6 6 17 17 17 11 11 11 -+10 10 10 6 6 6 40 40 40 61 61 61 37 37 37 6 6 6 11 11 11 23 23 23 -+19 19 19 10 10 10 38 38 38 62 62 62 49 49 49 31 31 31 27 27 27 24 24 24 -+28 28 28 23 23 23 42 42 42 70 70 70 67 67 67 39 39 39 32 32 32 46 46 46 -+58 58 58 45 45 45 48 48 48 82 82 82 80 80 80 60 60 60 39 39 39 44 44 44 -+59 59 59 60 60 60 63 63 63 80 80 80 88 88 88 73 73 73 58 58 58 57 57 57 -+59 59 59 75 75 75 82 82 82 91 91 91 101 101 101 87 87 87 68 68 68 74 74 74 -+80 80 80 75 75 75 87 87 87 109 110 110 112 112 113 93 93 93 84 84 84 89 89 89 -+93 93 93 89 89 89 96 97 98 115 116 115 121 121 119 112 112 113 101 101 101 99 99 99 -+103 103 102 109 110 110 103 103 102 112 112 113 134 134 134 133 133 133 112 112 113 105 105 105 -+117 117 117 112 112 113 115 116 115 121 121 119 140 140 140 142 143 144 122 121 126 125 122 126 -+117 117 117 128 128 128 134 134 134 129 129 130 125 122 126 127 127 127 133 133 133 140 140 140 -+133 133 133 133 133 133 128 128 128 137 138 139 139 139 139 142 143 144 139 139 139 134 134 134 -+128 121 122 231 224 220 231 246 232 136 172 147 83 172 115 83 172 72 83 172 72 83 172 72 -+83 172 72 83 172 72 83 172 72 83 172 115 141 180 99 146 184 30 141 180 99 146 184 30 -+141 180 99 83 172 72 83 172 72 83 172 72 200 220 210 252 251 251 252 251 251 255 255 255 -+252 251 251 246 251 251 255 255 255 255 255 255 255 255 255 252 251 251 180 183 185 88 88 88 -+10 11 14 11 13 16 20 21 24 8 10 13 6 8 11 14 16 19 8 10 13 14 16 19 -+10 11 14 8 10 13 14 16 19 10 11 14 6 8 11 11 13 16 10 11 14 6 8 11 -+28 28 28 93 93 93 115 116 115 115 116 115 121 121 119 117 117 117 122 121 126 134 134 134 -+137 138 139 142 143 144 139 139 139 137 137 137 142 143 144 142 143 144 137 137 137 133 133 133 -+129 129 130 128 128 128 134 134 134 140 140 140 133 133 133 128 128 128 129 129 130 129 129 130 -+127 127 127 128 128 128 125 125 127 117 117 117 117 117 117 117 117 117 109 110 110 96 97 98 -+99 99 99 99 99 99 99 99 99 96 97 98 96 97 98 95 95 94 92 92 92 89 89 89 -+87 87 87 85 85 85 99 99 99 112 112 113 105 105 105 95 95 94 88 88 88 78 78 78 -+96 96 96 91 91 91 75 75 75 68 68 68 74 74 74 65 65 65 57 57 57 70 70 70 -+85 85 85 84 84 84 67 67 67 50 50 50 63 63 63 77 77 77 65 65 65 39 39 39 -+51 51 51 46 46 46 42 42 42 42 42 42 39 39 39 37 37 37 37 37 37 39 39 39 -+69 69 69 57 57 57 57 57 57 60 60 60 51 51 51 48 48 48 51 51 51 48 48 48 -+52 52 52 49 49 49 43 43 43 38 38 38 48 48 48 67 67 67 67 67 67 45 45 45 -+6 6 6 17 17 17 29 29 29 33 33 33 20 20 20 0 0 0 6 6 6 27 27 27 -+48 48 48 57 57 57 51 51 51 40 40 40 43 43 43 43 43 43 25 25 25 8 8 8 -+36 36 36 33 33 33 49 49 49 56 56 56 51 51 51 48 48 48 46 46 46 50 50 50 -+54 54 54 58 58 58 58 58 58 49 49 49 43 43 43 50 50 50 51 51 51 42 42 42 -+51 51 51 49 49 49 46 46 46 52 52 52 58 58 58 54 54 54 49 49 49 44 44 44 -+45 45 45 50 50 50 52 52 52 50 50 50 45 45 45 43 43 43 44 44 44 49 49 49 -+53 53 53 51 51 51 48 48 48 45 45 45 45 45 45 49 49 49 52 52 52 56 56 56 -+49 49 49 49 49 49 46 46 46 44 44 44 45 45 45 44 44 44 45 45 45 46 46 46 -+48 48 48 50 50 50 48 48 48 36 36 36 20 20 20 11 11 11 13 13 13 17 17 17 -+13 13 13 10 10 10 17 17 17 32 32 32 37 37 37 27 27 27 13 13 13 6 6 6 -+13 13 13 13 13 13 13 13 13 11 11 11 10 10 10 10 10 10 11 11 11 13 13 13 -+10 10 10 11 11 11 17 17 17 28 28 28 38 38 38 39 39 39 34 34 34 27 27 27 -+16 16 16 19 19 19 17 17 17 11 11 11 14 14 14 28 28 28 38 38 38 42 42 42 -+16 16 16 6 6 6 4 4 4 14 14 14 13 13 13 4 4 4 4 4 4 14 14 14 -+36 36 36 32 32 32 21 21 21 10 10 10 8 8 8 16 16 16 16 16 16 11 11 11 -+6 6 6 16 16 16 28 28 28 32 32 32 24 24 24 11 11 11 6 6 6 13 13 13 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 20 20 20 21 21 21 17 17 17 -+17 17 17 19 19 19 17 17 17 11 11 11 11 11 11 17 17 17 19 19 19 17 17 17 -+20 20 20 3 3 3 21 21 21 19 19 19 20 20 20 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 10 10 10 -+21 21 21 17 17 17 11 11 11 4 4 4 0 0 0 0 0 0 3 3 3 8 8 8 -+11 11 11 8 8 8 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 6 6 6 -+8 8 8 4 4 4 4 4 4 4 4 4 6 6 6 4 4 4 0 0 0 0 0 0 -+0 0 0 6 6 6 16 16 16 13 13 13 6 6 6 3 3 3 3 3 3 0 0 0 -+6 6 6 0 0 0 0 0 0 14 14 14 14 14 14 3 3 3 3 3 3 14 14 14 -+19 19 19 19 19 19 3 3 3 3 3 3 0 0 0 16 16 16 17 17 17 20 20 20 -+17 17 17 13 13 13 8 8 8 27 27 27 43 43 43 21 21 21 0 0 0 10 10 10 -+0 0 0 13 13 13 6 6 6 32 32 32 50 50 50 27 27 27 4 4 4 6 6 6 -+10 10 10 17 17 17 8 8 8 34 34 34 54 54 54 33 33 33 13 13 13 11 11 11 -+19 19 19 10 10 10 6 6 6 36 36 36 58 58 58 39 39 39 11 11 11 19 19 19 -+21 21 21 20 20 20 16 16 16 38 38 38 63 63 63 53 53 53 27 27 27 24 24 24 -+27 27 27 36 36 36 24 24 24 40 40 40 75 75 75 63 63 63 36 36 36 53 53 53 -+50 50 50 43 43 43 37 37 37 58 58 58 73 73 73 85 85 85 66 66 66 50 50 50 -+69 69 69 61 61 61 50 50 50 60 60 60 88 88 88 89 89 89 68 68 68 59 59 59 -+78 78 78 83 83 83 73 73 73 74 74 74 95 95 94 99 99 99 83 83 83 75 75 75 -+80 80 80 91 91 91 93 93 93 88 88 88 95 95 94 109 110 110 105 105 105 89 89 89 -+85 85 85 101 101 101 109 110 110 105 104 105 109 110 110 121 121 119 115 116 115 96 97 98 -+105 104 105 103 103 102 115 116 115 125 122 126 125 122 126 129 129 130 127 127 127 105 105 105 -+117 117 117 115 116 115 117 117 117 125 125 127 140 140 140 140 140 140 125 125 127 128 128 128 -+129 129 130 137 137 137 134 134 134 125 125 127 125 122 126 137 137 137 144 145 144 144 145 144 -+142 143 144 137 138 139 131 131 131 142 143 144 137 138 139 147 147 148 137 138 139 121 121 119 -+180 183 185 238 240 244 255 255 255 248 249 239 136 172 147 83 172 72 83 172 72 83 172 115 -+83 172 72 83 172 72 146 184 30 146 184 30 146 184 30 146 184 30 141 180 99 83 172 72 -+83 172 72 83 172 72 83 172 72 83 172 72 136 172 147 255 255 255 252 251 251 252 251 251 -+255 255 255 255 255 255 252 251 251 252 251 251 252 251 251 255 255 255 200 220 210 16 16 16 -+14 16 19 14 16 19 11 13 16 6 8 11 10 11 14 11 13 16 6 8 11 14 16 19 -+11 13 16 6 8 11 11 13 16 8 10 13 10 11 14 14 16 19 6 8 11 8 10 13 -+54 54 54 101 101 101 105 105 105 115 116 115 129 129 130 127 127 127 129 129 130 140 140 140 -+131 131 131 140 140 140 137 138 139 133 133 133 139 139 139 142 143 144 144 145 144 147 147 148 -+140 140 140 133 133 133 134 134 134 140 140 140 137 137 137 134 134 134 137 137 137 137 137 137 -+134 134 134 137 138 139 137 137 137 129 129 130 121 121 119 109 110 110 105 104 105 103 103 102 -+101 101 101 99 99 99 96 97 98 95 95 94 95 95 94 94 94 94 91 91 91 90 90 90 -+92 92 92 84 84 84 90 90 90 105 105 105 105 105 105 103 103 102 99 99 99 92 92 92 -+83 83 83 99 99 99 99 99 99 78 78 78 67 67 67 65 65 65 63 63 63 63 63 63 -+56 56 56 74 74 74 84 84 84 69 69 69 58 58 58 68 68 68 74 74 74 66 66 66 -+44 44 44 44 44 44 44 44 44 44 44 44 40 40 40 36 36 36 38 38 38 44 44 44 -+67 67 67 69 69 69 67 67 67 59 59 59 51 51 51 50 50 50 51 51 51 50 50 50 -+40 40 40 33 33 33 23 23 23 16 16 16 29 29 29 57 57 57 67 67 67 54 54 54 -+33 33 33 31 31 31 27 27 27 20 20 20 13 13 13 21 21 21 42 42 42 57 57 57 -+63 63 63 46 46 46 21 21 21 0 0 0 6 6 6 37 37 37 52 52 52 44 44 44 -+19 19 19 13 13 13 40 40 40 58 58 58 61 61 61 59 59 59 48 48 48 48 48 48 -+48 48 48 46 46 46 53 53 53 54 54 54 46 46 46 44 44 44 49 49 49 49 49 49 -+56 56 56 50 50 50 46 46 46 44 44 44 48 48 48 54 54 54 52 52 52 46 46 46 -+46 46 46 45 45 45 46 46 46 48 48 48 46 46 46 46 46 46 44 44 44 42 42 42 -+50 50 50 51 51 51 52 52 52 49 49 49 44 44 44 44 44 44 49 49 49 54 54 54 -+56 56 56 49 49 49 44 44 44 43 43 43 45 45 45 49 49 49 49 49 49 46 46 46 -+50 50 50 44 44 44 34 34 34 21 21 21 11 11 11 6 6 6 13 13 13 19 19 19 -+6 6 6 13 13 13 27 27 27 37 37 37 32 32 32 17 17 17 10 10 10 13 13 13 -+8 8 8 11 11 11 14 14 14 16 16 16 16 16 16 14 14 14 13 13 13 11 11 11 -+21 21 21 25 25 25 34 34 34 40 40 40 34 34 34 21 21 21 14 14 14 16 16 16 -+11 11 11 11 11 11 10 10 10 11 11 11 23 23 23 34 34 34 33 33 33 25 25 25 -+8 8 8 13 13 13 17 17 17 16 16 16 10 10 10 11 11 11 23 23 23 34 34 34 -+37 37 37 21 21 21 6 6 6 8 8 8 14 14 14 16 16 16 13 13 13 13 13 13 -+17 17 17 27 27 27 31 31 31 23 23 23 13 13 13 10 10 10 11 11 11 14 14 14 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 20 20 20 21 21 21 17 17 17 -+17 17 17 19 19 19 17 17 17 11 11 11 11 11 11 17 17 17 19 19 19 17 17 17 -+20 20 20 3 3 3 21 21 21 19 19 19 20 20 20 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 13 13 13 -+23 23 23 16 16 16 8 8 8 3 3 3 0 0 0 0 0 0 4 4 4 11 11 11 -+13 13 13 8 8 8 0 0 0 0 0 0 3 3 3 8 8 8 11 11 11 13 13 13 -+14 14 14 10 10 10 6 6 6 6 6 6 10 10 10 8 8 8 3 3 3 0 0 0 -+0 0 0 4 4 4 14 14 14 14 14 14 4 4 4 0 0 0 3 3 3 0 0 0 -+4 4 4 0 0 0 3 3 3 16 16 16 14 14 14 0 0 0 3 3 3 16 16 16 -+17 17 17 17 17 17 0 0 0 3 3 3 0 0 0 17 17 17 17 17 17 19 19 19 -+24 24 24 13 13 13 0 0 0 8 8 8 29 29 29 39 39 39 23 23 23 0 0 0 -+8 8 8 0 0 0 13 13 13 0 0 0 32 32 32 59 59 59 24 24 24 0 0 0 -+14 14 14 0 0 0 17 17 17 10 10 10 34 34 34 61 61 61 33 33 33 16 16 16 -+8 8 8 14 14 14 10 10 10 10 10 10 33 33 33 57 57 57 48 48 48 17 17 17 -+16 16 16 20 20 20 17 17 17 19 19 19 42 42 42 63 63 63 57 57 57 31 31 31 -+20 20 20 32 32 32 33 33 33 21 21 21 44 44 44 81 81 81 77 77 77 52 52 52 -+29 29 29 43 43 43 42 42 42 38 38 38 46 46 46 84 84 84 84 84 84 77 77 77 -+56 56 56 51 51 51 56 56 56 52 52 52 61 61 61 87 87 87 91 91 91 80 80 80 -+87 87 87 75 75 75 68 68 68 63 63 63 70 70 70 91 91 91 103 103 102 95 95 94 -+87 87 87 95 95 94 91 91 91 81 81 81 85 85 85 105 104 105 112 112 113 105 105 105 -+93 93 93 105 105 105 109 110 110 99 99 99 96 97 98 109 110 110 117 117 117 117 117 117 -+105 105 105 109 110 110 127 127 127 125 122 126 109 110 110 115 116 115 129 129 130 127 127 127 -+115 116 115 125 125 127 125 122 126 137 137 137 128 128 128 121 121 119 142 143 144 137 137 137 -+144 145 144 134 134 134 127 127 127 128 128 128 137 137 137 144 145 144 144 145 144 144 145 144 -+140 140 140 140 140 140 134 134 134 137 138 139 134 134 134 147 147 148 129 129 130 125 125 127 -+238 240 244 255 255 255 255 255 255 255 255 255 248 249 239 136 172 147 83 172 115 83 172 115 -+83 172 115 141 180 99 146 184 30 146 184 30 146 184 30 83 172 72 83 172 72 83 172 72 -+83 172 72 83 172 72 83 172 72 83 172 72 112 122 122 255 255 255 252 251 251 248 249 239 -+252 251 251 255 255 255 255 255 255 252 251 251 255 255 255 255 255 255 200 220 210 40 40 40 -+11 13 16 8 10 13 6 8 11 8 10 13 11 13 16 10 11 14 6 8 11 10 11 14 -+14 16 19 6 8 11 11 13 16 6 8 11 11 13 16 14 16 19 6 8 11 26 29 32 -+83 83 83 103 103 102 99 99 99 109 110 110 121 121 119 121 121 119 125 125 127 134 134 134 -+134 134 134 140 140 140 139 139 139 133 133 133 131 131 131 133 133 133 137 138 139 144 145 144 -+142 143 144 129 129 130 121 121 119 125 122 126 129 129 130 137 137 137 137 137 137 134 134 134 -+134 134 134 134 134 134 137 137 137 137 137 137 131 131 131 121 121 119 115 116 115 115 116 115 -+109 110 110 105 105 105 101 101 101 96 96 96 95 95 94 95 95 94 95 95 94 95 95 94 -+87 87 87 88 88 88 94 94 94 99 99 99 93 93 93 85 85 85 89 89 89 103 103 102 -+89 89 89 80 80 80 89 89 89 91 91 91 70 70 70 62 62 62 69 69 69 65 65 65 -+59 59 59 61 61 61 77 77 77 87 87 87 70 70 70 58 58 58 69 69 69 84 84 84 -+53 53 53 46 46 46 42 42 42 46 46 46 53 53 53 60 60 60 68 68 68 74 74 74 -+57 57 57 65 65 65 63 63 63 59 59 59 60 60 60 62 62 62 51 51 51 33 33 33 -+28 28 28 24 24 24 23 23 23 24 24 24 32 32 32 51 51 51 62 62 62 59 59 59 -+51 51 51 34 34 34 19 19 19 17 17 17 32 32 32 53 53 53 62 62 62 56 56 56 -+44 44 44 25 25 25 17 17 17 11 11 11 0 0 0 14 14 14 40 40 40 51 51 51 -+50 50 50 39 39 39 51 51 51 49 49 49 48 48 48 53 53 53 43 43 43 39 39 39 -+36 36 36 16 16 16 29 29 29 53 53 53 50 50 50 37 37 37 44 44 44 58 58 58 -+54 54 54 50 50 50 51 51 51 42 42 42 38 38 38 49 49 49 54 54 54 57 57 57 -+52 52 52 45 45 45 44 44 44 48 48 48 50 50 50 53 53 53 51 51 51 44 44 44 -+45 45 45 50 50 50 54 54 54 54 54 54 51 51 51 46 46 46 46 46 46 48 48 48 -+56 56 56 48 48 48 44 44 44 44 44 44 45 45 45 49 49 49 50 50 50 44 44 44 -+44 44 44 31 31 31 16 16 16 11 11 11 11 11 11 11 11 11 10 10 10 8 8 8 -+17 17 17 31 31 31 34 34 34 25 25 25 13 13 13 10 10 10 13 13 13 11 11 11 -+14 14 14 11 11 11 10 10 10 10 10 10 13 13 13 19 19 19 24 24 24 27 27 27 -+29 29 29 42 42 42 45 45 45 33 33 33 16 16 16 8 8 8 8 8 8 8 8 8 -+11 11 11 13 13 13 17 17 17 25 25 25 33 33 33 33 33 33 21 21 21 4 4 4 -+14 14 14 17 17 17 14 14 14 10 10 10 13 13 13 24 24 24 34 34 34 38 38 38 -+19 19 19 8 8 8 6 6 6 14 14 14 16 16 16 8 8 8 10 10 10 17 17 17 -+31 31 31 31 31 31 23 23 23 11 11 11 10 10 10 17 17 17 17 17 17 13 13 13 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 20 20 20 21 21 21 17 17 17 -+17 17 17 19 19 19 17 17 17 11 11 11 11 11 11 17 17 17 19 19 19 17 17 17 -+20 20 20 3 3 3 21 21 21 19 19 19 20 20 20 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 4 4 4 16 16 16 -+20 20 20 13 13 13 4 4 4 0 0 0 0 0 0 0 0 0 8 8 8 16 16 16 -+11 11 11 6 6 6 0 0 0 0 0 0 6 6 6 10 10 10 8 8 8 3 3 3 -+6 6 6 6 6 6 6 6 6 6 6 6 8 8 8 8 8 8 4 4 4 3 3 3 -+0 0 0 4 4 4 14 14 14 16 16 16 3 3 3 0 0 0 3 3 3 0 0 0 -+3 3 3 0 0 0 4 4 4 16 16 16 13 13 13 0 0 0 3 3 3 17 17 17 -+16 16 16 14 14 14 0 0 0 0 0 0 0 0 0 19 19 19 17 17 17 20 20 20 -+28 28 28 4 4 4 6 6 6 6 6 6 0 0 0 29 29 29 42 42 42 10 10 10 -+0 0 0 8 8 8 0 0 0 8 8 8 10 10 10 31 31 31 58 58 58 20 20 20 -+8 8 8 6 6 6 0 0 0 17 17 17 13 13 13 32 32 32 65 65 65 28 28 28 -+8 8 8 6 6 6 23 23 23 16 16 16 0 0 0 38 38 38 62 62 62 42 42 42 -+27 27 27 11 11 11 23 23 23 24 24 24 16 16 16 45 45 45 68 68 68 51 51 51 -+34 34 34 21 21 21 36 36 36 31 31 31 31 31 31 69 69 69 84 84 84 65 65 65 -+44 44 44 43 43 43 40 40 40 40 40 40 42 42 42 69 69 69 77 77 77 92 92 92 -+60 60 60 48 48 48 60 60 60 54 54 54 48 48 48 76 76 76 96 97 98 96 97 98 -+81 81 81 67 67 67 68 68 68 72 72 72 72 72 72 83 83 83 101 101 101 105 105 105 -+103 103 102 89 89 89 83 83 83 87 87 87 88 88 88 88 88 88 103 103 102 121 121 119 -+115 116 115 105 105 105 99 99 99 101 101 101 99 99 99 99 99 99 112 112 113 129 129 130 -+117 117 117 127 127 127 121 121 119 109 110 110 109 110 110 112 112 113 121 121 119 137 137 137 -+128 128 128 121 121 119 142 143 144 129 129 130 117 117 117 131 131 131 133 133 133 147 147 148 -+144 145 144 133 133 133 128 128 128 137 137 137 144 145 144 142 143 144 142 143 144 145 146 147 -+139 139 139 142 143 144 137 137 137 140 140 140 137 137 137 137 137 137 125 122 126 180 183 185 -+252 251 251 252 251 251 238 240 244 255 255 255 254 249 251 248 249 239 187 210 182 83 172 115 -+83 172 72 83 172 72 146 184 30 146 184 30 83 172 72 83 172 72 83 172 72 83 172 72 -+83 172 115 83 172 115 86 124 83 86 124 83 109 110 110 238 240 244 252 251 251 255 255 255 -+255 255 255 252 251 251 255 255 255 255 255 255 255 255 255 238 240 244 142 143 144 0 0 0 -+6 8 11 6 8 11 8 10 13 11 13 16 10 11 14 10 11 14 11 13 16 6 8 11 -+11 13 16 8 10 13 14 16 19 6 8 11 11 13 16 11 13 16 10 11 14 53 54 57 -+88 88 88 91 91 91 91 91 91 105 105 105 105 105 105 121 121 119 128 128 128 128 128 128 -+139 139 139 140 140 140 144 145 144 144 145 144 134 134 134 128 128 128 131 131 131 134 134 134 -+140 140 140 144 145 144 142 143 144 133 133 133 127 127 127 125 125 127 129 129 130 139 139 139 -+129 129 130 128 128 128 128 128 128 133 133 133 137 137 137 134 134 134 129 129 130 127 127 127 -+117 117 117 115 116 115 109 110 110 105 104 105 101 101 101 99 99 99 96 96 96 94 94 94 -+96 97 98 93 93 93 89 89 89 96 96 96 105 104 105 93 93 93 82 82 82 88 88 88 -+105 105 105 87 87 87 85 85 85 96 96 96 92 92 92 75 75 75 67 67 67 66 66 66 -+70 70 70 59 59 59 58 58 58 73 73 73 77 77 77 65 65 65 62 62 62 78 78 78 -+70 70 70 68 68 68 70 70 70 76 76 76 77 77 77 68 68 68 52 52 52 42 42 42 -+42 42 42 56 56 56 74 74 74 75 75 75 62 62 62 58 58 58 48 48 48 23 23 23 -+32 32 32 21 21 21 20 20 20 21 21 21 19 19 19 31 31 31 51 51 51 63 63 63 -+53 53 53 39 39 39 32 32 32 39 39 39 52 52 52 63 63 63 57 57 57 38 38 38 -+16 16 16 6 6 6 16 16 16 37 37 37 46 46 46 46 46 46 46 46 46 46 46 46 -+52 52 52 46 46 46 48 48 48 20 20 20 16 16 16 46 46 46 49 49 49 44 44 44 -+28 28 28 0 0 0 6 6 6 40 40 40 42 42 42 33 33 33 39 39 39 48 48 48 -+46 46 46 39 39 39 50 50 50 48 48 48 42 42 42 48 48 48 51 51 51 58 58 58 -+54 54 54 45 45 45 43 43 43 45 45 45 46 46 46 53 53 53 57 57 57 51 51 51 -+46 46 46 46 46 46 48 48 48 50 50 50 51 51 51 49 49 49 43 43 43 38 38 38 -+49 49 49 45 45 45 48 48 48 49 49 49 44 44 44 45 45 45 46 46 46 43 43 43 -+29 29 29 19 19 19 10 10 10 10 10 10 14 14 14 14 14 14 14 14 14 16 16 16 -+36 36 36 37 37 37 29 29 29 14 14 14 4 4 4 10 10 10 11 11 11 10 10 10 -+16 16 16 13 13 13 10 10 10 13 13 13 19 19 19 24 24 24 28 28 28 28 28 28 -+24 24 24 36 36 36 34 34 34 17 17 17 6 6 6 16 16 16 21 21 21 19 19 19 -+8 8 8 14 14 14 25 25 25 33 33 33 33 33 33 24 24 24 16 16 16 13 13 13 -+17 17 17 13 13 13 6 6 6 8 8 8 21 21 21 32 32 32 31 31 31 23 23 23 -+8 8 8 8 8 8 13 13 13 16 16 16 11 11 11 8 8 8 16 16 16 28 28 28 -+32 32 32 24 24 24 14 14 14 8 8 8 11 11 11 17 17 17 17 17 17 14 14 14 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 20 20 20 21 21 21 17 17 17 -+17 17 17 19 19 19 17 17 17 11 11 11 11 11 11 17 17 17 19 19 19 17 17 17 -+20 20 20 3 3 3 21 21 21 19 19 19 20 20 20 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 6 6 6 17 17 17 -+19 19 19 10 10 10 0 0 0 0 0 0 0 0 0 3 3 3 10 10 10 19 19 19 -+0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 11 11 11 4 4 4 0 0 0 -+0 0 0 3 3 3 8 8 8 8 8 8 3 3 3 0 0 0 0 0 0 0 0 0 -+4 4 4 3 3 3 14 14 14 16 16 16 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 6 6 6 17 17 17 13 13 13 0 0 0 3 3 3 19 19 19 -+14 14 14 14 14 14 0 0 0 0 0 0 0 0 0 19 19 19 19 19 19 20 20 20 -+19 19 19 13 13 13 4 4 4 0 0 0 0 0 0 4 4 4 27 27 27 51 51 51 -+4 4 4 8 8 8 13 13 13 0 0 0 0 0 0 8 8 8 24 24 24 65 65 65 -+19 19 19 6 6 6 11 11 11 10 10 10 10 10 10 13 13 13 27 27 27 60 60 60 -+29 29 29 17 17 17 11 11 11 19 19 19 16 16 16 8 8 8 32 32 32 66 66 66 -+45 45 45 28 28 28 19 19 19 27 27 27 25 25 25 16 16 16 37 37 37 72 72 72 -+57 57 57 37 37 37 23 23 23 36 36 36 60 60 60 43 43 43 36 36 36 87 87 87 -+71 71 71 49 49 49 38 38 38 48 48 48 51 51 51 67 67 67 66 66 66 83 83 83 -+88 88 88 59 59 59 58 58 58 59 59 59 56 56 56 69 69 69 84 84 84 96 97 98 -+95 95 94 80 80 80 65 65 65 70 70 70 78 78 78 74 74 74 85 85 85 112 112 113 -+112 112 113 92 92 92 82 82 82 88 88 88 88 88 88 84 84 84 95 95 94 115 116 115 -+122 121 126 109 110 110 99 99 99 103 103 102 105 105 105 105 104 105 105 105 105 115 116 115 -+137 137 137 127 127 127 112 112 113 112 112 113 117 117 117 117 117 117 115 116 115 121 121 119 -+137 138 139 144 145 144 128 128 128 121 121 119 128 128 128 129 129 130 137 138 139 140 140 140 -+139 139 139 137 137 137 137 138 139 142 143 144 140 140 140 137 137 137 142 143 144 149 151 153 -+149 149 149 145 146 147 139 139 139 145 146 147 140 140 140 125 122 126 128 128 128 238 240 244 -+254 249 251 252 251 251 246 251 251 255 255 255 254 249 251 254 249 251 248 249 239 187 210 182 -+83 172 72 83 172 72 83 172 72 83 172 115 83 172 115 83 172 72 83 172 72 83 172 115 -+86 124 83 98 114 115 112 115 112 128 121 122 124 112 115 200 220 210 252 251 251 255 255 255 -+252 251 251 255 255 255 252 251 251 252 251 251 255 255 255 252 251 251 200 220 210 27 27 27 -+10 11 14 14 16 19 16 20 21 11 13 16 1 3 7 10 11 14 20 21 24 10 11 14 -+11 13 16 11 13 16 16 20 21 6 8 11 11 13 16 8 10 13 14 16 19 73 74 76 -+91 91 91 84 84 84 90 90 90 105 105 105 105 105 105 128 128 128 133 133 133 125 122 126 -+134 134 134 137 137 137 149 149 149 155 156 156 144 145 144 134 134 134 133 133 133 129 129 130 -+131 131 131 144 145 144 145 146 147 142 143 144 140 140 140 137 137 137 131 131 131 133 133 133 -+137 137 137 129 129 130 121 121 119 121 121 119 127 127 127 133 133 133 134 134 134 133 133 133 -+127 127 127 125 125 127 122 121 126 121 121 119 117 117 117 109 110 110 103 103 102 96 96 96 -+93 93 93 92 92 92 87 87 87 96 96 96 109 110 110 95 95 94 78 78 78 85 85 85 -+81 81 81 103 103 102 93 93 93 81 81 81 96 96 96 92 92 92 70 70 70 67 67 67 -+60 60 60 67 67 67 60 60 60 66 66 66 87 87 87 88 88 88 78 78 78 84 84 84 -+87 87 87 78 78 78 67 67 67 54 54 54 44 44 44 43 43 43 53 53 53 67 67 67 -+75 75 75 59 59 59 59 59 59 58 58 58 48 48 48 58 58 58 58 58 58 29 29 29 -+32 32 32 23 23 23 28 28 28 33 33 33 23 23 23 20 20 20 39 39 39 58 58 58 -+60 60 60 53 53 53 57 57 57 61 61 61 60 60 60 57 57 57 49 49 49 36 36 36 -+44 44 44 54 54 54 53 53 53 48 48 48 43 43 43 27 27 27 8 8 8 4 4 4 -+38 38 38 46 46 46 52 52 52 11 11 11 6 6 6 54 54 54 60 60 60 52 52 52 -+43 43 43 19 19 19 21 21 21 40 40 40 46 46 46 50 50 50 52 52 52 44 44 44 -+37 37 37 24 24 24 43 43 43 54 54 54 53 53 53 52 52 52 44 44 44 48 48 48 -+51 51 51 42 42 42 38 38 38 39 39 39 39 39 39 48 48 48 56 56 56 53 53 53 -+51 51 51 43 43 43 37 37 37 38 38 38 45 45 45 48 48 48 40 40 40 33 33 33 -+40 40 40 42 42 42 51 51 51 53 53 53 43 43 43 40 40 40 43 43 43 40 40 40 -+13 13 13 11 11 11 13 13 13 16 16 16 14 14 14 14 14 14 24 24 24 36 36 36 -+43 43 43 27 27 27 13 13 13 13 13 13 16 16 16 14 14 14 13 13 13 16 16 16 -+4 4 4 11 11 11 20 20 20 31 31 31 36 36 36 32 32 32 21 21 21 11 11 11 -+37 37 37 37 37 37 28 28 28 13 13 13 8 8 8 13 13 13 13 13 13 6 6 6 -+14 14 14 23 23 23 33 33 33 34 34 34 21 21 21 4 4 4 6 6 6 17 17 17 -+16 16 16 8 8 8 8 8 8 21 21 21 34 34 34 36 36 36 23 23 23 6 6 6 -+13 13 13 16 16 16 17 17 17 11 11 11 8 8 8 14 14 14 27 27 27 37 37 37 -+24 24 24 16 16 16 11 11 11 14 14 14 14 14 14 11 11 11 13 13 13 19 19 19 -+ -+3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 0 0 0 0 0 0 14 14 14 19 19 19 17 17 17 20 20 20 -+17 17 17 21 21 21 14 14 14 8 8 8 16 16 16 19 19 19 17 17 17 19 19 19 -+19 19 19 14 14 14 14 14 14 17 17 17 17 17 17 10 10 10 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 8 8 8 19 19 19 -+21 21 21 8 8 8 0 0 0 6 6 6 0 0 0 0 0 0 17 17 17 0 0 0 -+0 0 0 0 0 0 0 0 0 4 4 4 8 8 8 8 8 8 4 4 4 0 0 0 -+0 0 0 3 3 3 4 4 4 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 -+0 0 0 10 10 10 17 17 17 11 11 11 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 4 4 4 11 11 11 11 11 11 4 4 4 0 0 0 8 8 8 17 17 17 -+19 19 19 10 10 10 0 0 0 0 0 0 8 8 8 17 17 17 20 20 20 20 20 20 -+20 20 20 8 8 8 0 0 0 4 4 4 4 4 4 0 0 0 10 10 10 21 21 21 -+52 52 52 11 11 11 3 3 3 8 8 8 0 0 0 0 0 0 10 10 10 27 27 27 -+60 60 60 19 19 19 11 11 11 4 4 4 6 6 6 10 10 10 14 14 14 20 20 20 -+63 63 63 31 31 31 17 17 17 13 13 13 16 16 16 20 20 20 17 17 17 29 29 29 -+66 66 66 46 46 46 24 24 24 20 20 20 29 29 29 28 28 28 28 28 28 38 38 38 -+71 71 71 63 63 63 39 39 39 52 52 52 50 50 50 40 40 40 36 36 36 46 46 46 -+75 75 75 81 81 81 49 49 49 46 46 46 73 73 73 61 61 61 44 44 44 59 59 59 -+87 87 87 95 95 94 65 65 65 46 46 46 80 80 80 91 91 91 71 71 71 68 68 68 -+95 95 94 101 101 101 90 90 90 71 71 71 74 74 74 94 94 94 96 97 98 83 83 83 -+105 105 105 109 110 110 101 101 101 87 87 87 84 84 84 96 97 98 109 110 110 109 110 110 -+109 110 110 125 122 126 115 116 115 99 99 99 103 103 102 105 105 105 112 112 113 128 128 128 -+121 121 119 137 137 137 125 125 127 117 117 117 121 121 119 115 116 115 121 121 119 129 129 130 -+137 137 137 142 143 144 137 137 137 128 128 128 131 131 131 144 145 144 142 143 144 128 128 128 -+133 133 133 142 143 144 152 153 154 144 145 144 134 134 134 140 140 140 152 153 154 157 157 157 -+144 145 144 142 143 144 139 139 139 155 156 156 142 143 144 134 134 134 180 183 185 252 251 251 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+187 210 182 83 172 115 83 172 72 83 172 72 83 172 72 83 172 72 86 124 83 107 112 107 -+117 117 117 122 121 126 127 127 127 118 122 119 125 125 127 166 165 167 255 255 255 255 255 255 -+255 255 255 255 255 255 252 251 251 252 251 251 255 255 255 169 175 167 57 57 57 0 0 0 -+10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 -+8 10 13 14 16 19 8 10 13 14 16 19 10 11 14 6 8 11 43 44 47 69 70 72 -+84 84 84 94 94 94 96 96 96 96 97 98 105 105 105 117 117 117 131 131 131 144 145 144 -+129 129 130 133 133 133 142 143 144 149 149 149 155 156 156 149 151 153 140 140 140 129 129 130 -+131 131 131 133 133 133 140 140 140 142 143 144 134 134 134 134 134 134 140 140 140 142 143 144 -+142 143 144 134 134 134 125 122 126 117 117 117 117 117 117 122 121 126 128 128 128 133 133 133 -+127 127 127 115 116 115 105 105 105 105 105 105 112 112 113 117 117 117 121 121 119 122 121 126 -+121 121 119 112 112 113 109 110 110 109 110 110 112 112 113 109 110 110 99 99 99 89 89 89 -+87 87 87 99 99 99 105 104 105 99 99 99 96 96 96 99 99 99 93 93 93 82 82 82 -+90 90 90 91 91 91 93 93 93 88 88 88 83 83 83 87 87 87 85 85 85 71 71 71 -+70 70 70 80 80 80 59 59 59 60 60 60 63 63 63 73 73 73 71 71 71 65 65 65 -+37 37 37 43 43 43 37 37 37 56 56 56 61 61 61 50 50 50 56 56 56 45 45 45 -+24 24 24 29 29 29 23 23 23 17 17 17 25 25 25 34 34 34 45 45 45 60 60 60 -+60 60 60 60 60 60 61 61 61 61 61 61 59 59 59 56 56 56 54 54 54 54 54 54 -+36 36 36 20 20 20 17 17 17 31 31 31 27 27 27 8 8 8 0 0 0 16 16 16 -+13 13 13 31 31 31 49 49 49 28 28 28 19 19 19 39 39 39 34 34 34 24 24 24 -+39 39 39 42 42 42 32 32 32 38 38 38 43 43 43 40 40 40 37 37 37 13 13 13 -+37 37 37 48 48 48 46 46 46 44 44 44 50 50 50 42 42 42 21 21 21 11 11 11 -+38 38 38 44 44 44 42 42 42 49 49 49 29 29 29 40 40 40 38 38 38 33 33 33 -+27 27 27 11 11 11 16 16 16 3 3 3 8 8 8 33 33 33 34 34 34 37 37 37 -+27 27 27 13 13 13 23 23 23 34 34 34 23 23 23 4 4 4 8 8 8 17 17 17 -+19 19 19 10 10 10 13 13 13 16 16 16 4 4 4 10 10 10 31 31 31 43 43 43 -+32 32 32 16 16 16 13 13 13 4 4 4 11 11 11 21 21 21 8 8 8 8 8 8 -+21 21 21 10 10 10 11 11 11 23 23 23 17 17 17 4 4 4 17 17 17 42 42 42 -+39 39 39 21 21 21 8 8 8 14 14 14 21 21 21 16 16 16 11 11 11 13 13 13 -+16 16 16 36 36 36 38 38 38 19 19 19 8 8 8 19 19 19 20 20 20 10 10 10 -+13 13 13 10 10 10 14 14 14 39 39 39 33 33 33 13 13 13 19 19 19 10 10 10 -+8 8 8 16 16 16 11 11 11 11 11 11 19 19 19 31 31 31 36 36 36 20 20 20 -+8 8 8 16 16 16 6 6 6 4 4 4 13 13 13 21 21 21 0 0 0 19 19 19 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 0 0 0 0 0 0 14 14 14 19 19 19 17 17 17 20 20 20 -+17 17 17 21 21 21 14 14 14 8 8 8 16 16 16 19 19 19 17 17 17 19 19 19 -+19 19 19 14 14 14 14 14 14 19 19 19 17 17 17 10 10 10 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 8 8 8 19 19 19 -+20 20 20 8 8 8 0 0 0 4 4 4 0 0 0 3 3 3 19 19 19 4 4 4 -+4 4 4 0 0 0 0 0 0 3 3 3 10 10 10 11 11 11 4 4 4 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 13 13 13 16 16 16 11 11 11 3 3 3 0 0 0 0 0 0 0 0 0 -+0 0 0 8 8 8 17 17 17 11 11 11 0 0 0 0 0 0 10 10 10 20 20 20 -+17 17 17 8 8 8 0 0 0 0 0 0 10 10 10 17 17 17 20 20 20 20 20 20 -+21 21 21 10 10 10 0 0 0 4 4 4 4 4 4 0 0 0 4 4 4 16 16 16 -+20 20 20 51 51 51 17 17 17 0 0 0 8 8 8 0 0 0 14 14 14 6 6 6 -+27 27 27 59 59 59 19 19 19 13 13 13 6 6 6 6 6 6 10 10 10 8 8 8 -+27 27 27 63 63 63 32 32 32 16 16 16 24 24 24 8 8 8 17 17 17 19 19 19 -+31 31 31 61 61 61 56 56 56 27 27 27 23 23 23 29 29 29 28 28 28 28 28 28 -+34 34 34 76 76 76 71 71 71 50 50 50 25 25 25 36 36 36 43 43 43 40 40 40 -+53 53 53 72 72 72 76 76 76 70 70 70 54 54 54 45 45 45 53 53 53 52 52 52 -+66 66 66 83 83 83 90 90 90 87 87 87 81 81 81 70 70 70 63 63 63 68 68 68 -+73 73 73 95 95 94 105 104 105 93 93 93 85 85 85 89 89 89 87 87 87 75 75 75 -+81 81 81 105 105 105 115 116 115 101 101 101 96 96 96 109 110 110 112 112 113 99 99 99 -+96 97 98 112 112 113 127 127 127 121 121 119 109 110 110 115 116 115 122 121 126 121 121 119 -+115 116 115 115 116 115 139 139 139 127 127 127 115 116 115 125 125 127 122 121 126 137 138 139 -+129 129 130 128 128 128 133 133 133 140 140 140 140 140 140 134 134 134 133 133 133 134 134 134 -+137 137 137 144 145 144 149 149 149 147 147 148 142 143 144 149 149 149 157 157 157 157 157 157 -+147 147 148 139 139 139 152 153 154 149 151 153 149 149 149 134 134 134 231 246 232 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 249 251 200 220 210 141 180 99 146 184 30 146 184 30 83 172 72 86 124 83 121 113 124 -+118 122 119 118 122 119 118 122 119 113 122 108 118 122 119 134 134 134 255 255 255 255 255 255 -+255 255 255 255 255 255 252 251 251 255 255 255 255 255 255 255 255 255 92 92 92 27 27 27 -+10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 -+10 11 14 8 10 13 11 13 16 14 16 19 6 8 11 20 21 24 53 54 57 71 72 74 -+78 78 78 92 92 92 101 101 101 105 105 105 115 116 115 122 121 126 128 128 128 134 134 134 -+142 143 144 140 140 140 142 143 144 144 145 144 147 147 148 147 147 148 144 145 144 142 143 144 -+137 137 137 134 134 134 137 138 139 139 139 139 134 134 134 134 134 134 137 137 137 133 133 133 -+133 133 133 134 134 134 134 134 134 128 128 128 117 117 117 115 116 115 121 121 119 127 127 127 -+128 128 128 115 116 115 109 110 110 109 110 110 109 110 110 103 103 102 99 99 99 103 103 102 -+103 103 102 105 105 105 105 104 105 101 101 101 96 97 98 99 99 99 99 99 99 96 97 98 -+92 92 92 90 90 90 90 90 90 91 91 91 89 89 89 83 83 83 81 81 81 82 82 82 -+76 76 76 75 75 75 76 76 76 70 70 70 63 63 63 67 67 67 69 69 69 61 61 61 -+61 61 61 63 63 63 51 51 51 58 58 58 52 52 52 56 56 56 54 54 54 45 45 45 -+48 48 48 48 48 48 34 34 34 44 44 44 45 45 45 36 36 36 44 44 44 37 37 37 -+34 34 34 37 37 37 37 37 37 38 38 38 40 40 40 37 37 37 32 32 32 33 33 33 -+25 25 25 33 33 33 32 32 32 24 24 24 25 25 25 28 28 28 25 25 25 21 21 21 -+20 20 20 29 29 29 33 33 33 27 27 27 20 20 20 19 19 19 19 19 19 16 16 16 -+20 20 20 11 11 11 23 23 23 17 17 17 10 10 10 16 16 16 13 13 13 17 17 17 -+39 39 39 28 28 28 14 14 14 17 17 17 17 17 17 11 11 11 14 14 14 14 14 14 -+19 19 19 8 8 8 8 8 8 13 13 13 10 10 10 14 14 14 25 25 25 32 32 32 -+23 23 23 17 17 17 6 6 6 13 13 13 8 8 8 14 14 14 11 11 11 11 11 11 -+16 16 16 3 3 3 10 10 10 20 20 20 13 13 13 19 19 19 34 34 34 28 28 28 -+16 16 16 8 8 8 13 13 13 21 21 21 17 17 17 8 8 8 11 11 11 17 17 17 -+14 14 14 11 11 11 11 11 11 10 10 10 13 13 13 28 28 28 36 36 36 28 28 28 -+13 13 13 10 10 10 17 17 17 13 13 13 11 11 11 16 16 16 10 10 10 17 17 17 -+8 8 8 14 14 14 14 14 14 11 11 11 13 13 13 23 23 23 32 32 32 37 37 37 -+21 21 21 17 17 17 14 14 14 14 14 14 11 11 11 8 8 8 13 13 13 20 20 20 -+39 39 39 29 29 29 17 17 17 11 11 11 10 10 10 10 10 10 10 10 10 10 10 10 -+13 13 13 24 24 24 32 32 32 29 29 29 19 19 19 16 16 16 14 14 14 8 8 8 -+14 14 14 10 10 10 3 3 3 14 14 14 27 27 27 33 33 33 28 28 28 14 14 14 -+14 14 14 19 19 19 17 17 17 13 13 13 6 6 6 21 21 21 16 16 16 31 31 31 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 0 0 0 3 3 3 16 16 16 19 19 19 17 17 17 20 20 20 -+17 17 17 21 21 21 14 14 14 8 8 8 16 16 16 19 19 19 17 17 17 19 19 19 -+19 19 19 14 14 14 14 14 14 19 19 19 17 17 17 10 10 10 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 8 8 8 19 19 19 -+19 19 19 8 8 8 0 0 0 4 4 4 0 0 0 3 3 3 19 19 19 8 8 8 -+8 8 8 3 3 3 0 0 0 3 3 3 11 11 11 13 13 13 6 6 6 0 0 0 -+3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+11 11 11 14 14 14 14 14 14 8 8 8 3 3 3 3 3 3 0 0 0 0 0 0 -+0 0 0 13 13 13 20 20 20 10 10 10 0 0 0 0 0 0 14 14 14 21 21 21 -+13 13 13 6 6 6 0 0 0 3 3 3 11 11 11 19 19 19 21 21 21 21 21 21 -+21 21 21 10 10 10 0 0 0 4 4 4 6 6 6 0 0 0 0 0 0 6 6 6 -+11 11 11 25 25 25 51 51 51 19 19 19 0 0 0 17 17 17 0 0 0 3 3 3 -+16 16 16 17 17 17 57 57 57 16 16 16 14 14 14 11 11 11 10 10 10 8 8 8 -+10 10 10 28 28 28 59 59 59 36 36 36 17 17 17 27 27 27 10 10 10 21 21 21 -+14 14 14 44 44 44 67 67 67 56 56 56 28 28 28 25 25 25 31 31 31 21 21 21 -+31 31 31 65 65 65 71 71 71 67 67 67 40 40 40 32 32 32 33 33 33 40 40 40 -+34 34 34 65 65 65 91 91 91 89 89 89 54 54 54 39 39 39 57 57 57 56 56 56 -+50 50 50 72 72 72 92 92 92 95 95 94 80 80 80 60 60 60 60 60 60 75 75 75 -+68 68 68 78 78 78 99 99 99 112 112 113 103 103 102 82 82 82 76 76 76 87 87 87 -+80 80 80 92 92 92 109 110 110 117 117 117 115 116 115 109 110 110 101 101 101 99 99 99 -+99 99 99 103 103 102 121 121 119 127 127 127 121 121 119 121 121 119 125 125 127 112 112 113 -+109 110 110 121 121 119 121 121 119 137 137 137 133 133 133 121 121 119 139 139 139 131 131 131 -+125 125 127 125 125 127 134 134 134 149 149 149 145 146 147 133 133 133 129 129 130 139 139 139 -+147 147 148 144 145 144 144 145 144 145 146 147 149 151 153 157 157 157 155 156 156 144 145 144 -+142 143 144 144 145 144 157 157 157 147 147 148 134 134 134 169 175 167 255 255 255 252 251 251 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 249 251 255 255 255 231 224 220 146 184 30 146 184 30 146 184 30 83 172 72 112 122 122 -+116 129 109 116 129 109 118 122 119 118 122 119 113 122 108 107 112 107 238 240 244 252 251 251 -+255 255 255 246 251 251 255 255 255 255 255 255 246 251 251 157 157 157 10 10 10 13 13 13 -+10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 -+11 13 16 1 3 7 14 16 19 11 13 16 6 8 11 37 39 42 66 69 71 76 76 76 -+83 83 83 94 94 94 103 103 102 109 110 110 121 121 119 127 127 127 129 129 130 134 134 134 -+140 140 140 140 140 140 142 143 144 142 143 144 142 143 144 142 143 144 142 143 144 140 140 140 -+140 140 140 137 137 137 134 134 134 134 134 134 133 133 133 133 133 133 129 129 130 127 127 127 -+131 131 131 128 128 128 125 122 126 122 121 126 125 122 126 125 122 126 121 121 119 121 121 119 -+121 121 119 112 112 113 109 110 110 115 116 115 115 116 115 105 105 105 105 104 105 105 105 105 -+103 103 102 103 103 102 99 99 99 93 93 93 93 93 93 95 95 94 94 94 94 89 89 89 -+92 92 92 84 84 84 82 82 82 85 85 85 82 82 82 73 73 73 72 72 72 77 77 77 -+74 74 74 72 72 72 72 72 72 69 69 69 63 63 63 63 63 63 67 67 67 65 65 65 -+62 62 62 56 56 56 52 52 52 62 62 62 52 52 52 50 50 50 52 52 52 46 46 46 -+45 45 45 46 46 46 36 36 36 43 43 43 44 44 44 37 37 37 43 43 43 36 36 36 -+39 39 39 32 32 32 33 33 33 40 40 40 40 40 40 36 36 36 29 29 29 24 24 24 -+24 24 24 32 32 32 25 25 25 17 17 17 23 23 23 24 24 24 21 21 21 24 24 24 -+20 20 20 36 36 36 37 37 37 21 21 21 14 14 14 24 24 24 27 27 27 17 17 17 -+27 27 27 11 11 11 17 17 17 20 20 20 13 13 13 13 13 13 21 21 21 32 32 32 -+31 31 31 20 20 20 10 10 10 0 0 0 10 10 10 19 19 19 14 14 14 13 13 13 -+19 19 19 14 14 14 13 13 13 16 16 16 17 17 17 23 23 23 29 29 29 31 31 31 -+17 17 17 6 6 6 14 14 14 16 16 16 16 16 16 6 6 6 11 11 11 13 13 13 -+13 13 13 17 17 17 3 3 3 14 14 14 20 20 20 25 25 25 38 38 38 16 16 16 -+8 8 8 13 13 13 11 11 11 10 10 10 13 13 13 14 14 14 13 13 13 14 14 14 -+14 14 14 10 10 10 10 10 10 14 14 14 25 25 25 37 37 37 32 32 32 14 14 14 -+10 10 10 11 11 11 19 19 19 16 16 16 11 11 11 11 11 11 8 8 8 14 14 14 -+10 10 10 14 14 14 11 11 11 8 8 8 20 20 20 37 37 37 37 37 37 25 25 25 -+6 6 6 17 17 17 20 20 20 13 13 13 3 3 3 8 8 8 21 21 21 31 31 31 -+38 38 38 23 23 23 11 11 11 16 16 16 21 21 21 17 17 17 13 13 13 14 14 14 -+19 19 19 31 31 31 36 36 36 19 19 19 10 10 10 14 14 14 11 11 11 14 14 14 -+17 17 17 14 14 14 14 14 14 27 27 27 32 32 32 31 31 31 11 11 11 8 8 8 -+10 10 10 8 8 8 14 14 14 13 13 13 3 3 3 24 24 24 29 29 29 32 32 32 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 0 0 0 3 3 3 17 17 17 20 20 20 17 17 17 20 20 20 -+17 17 17 21 21 21 14 14 14 8 8 8 16 16 16 19 19 19 17 17 17 19 19 19 -+17 17 17 14 14 14 16 16 16 19 19 19 16 16 16 8 8 8 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 8 8 8 19 19 19 -+17 17 17 10 10 10 0 0 0 3 3 3 0 0 0 3 3 3 19 19 19 11 11 11 -+3 3 3 3 3 3 3 3 3 4 4 4 10 10 10 10 10 10 8 8 8 4 4 4 -+6 6 6 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 -+14 14 14 13 13 13 10 10 10 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 16 16 16 16 16 16 0 0 0 0 0 0 8 8 8 19 19 19 20 20 20 -+8 8 8 3 3 3 0 0 0 4 4 4 14 14 14 20 20 20 21 21 21 20 20 20 -+17 17 17 6 6 6 0 0 0 4 4 4 6 6 6 3 3 3 0 0 0 0 0 0 -+0 0 0 8 8 8 31 31 31 46 46 46 20 20 20 0 0 0 13 13 13 8 8 8 -+6 6 6 11 11 11 16 16 16 57 57 57 21 21 21 17 17 17 11 11 11 11 11 11 -+8 8 8 10 10 10 31 31 31 57 57 57 40 40 40 19 19 19 25 25 25 19 19 19 -+23 23 23 21 21 21 40 40 40 63 63 63 58 58 58 31 31 31 23 23 23 37 37 37 -+51 51 51 39 39 39 40 40 40 75 75 75 73 73 73 51 51 51 31 31 31 40 40 40 -+51 51 51 65 65 65 70 70 70 82 82 82 82 82 82 62 62 62 53 53 53 53 53 53 -+51 51 51 73 73 73 81 81 81 87 87 87 96 97 98 84 84 84 63 63 63 67 67 67 -+74 74 74 74 74 74 89 89 89 109 110 110 109 110 110 92 92 92 84 84 84 88 88 88 -+89 89 89 85 85 85 96 97 98 121 121 119 125 125 127 109 110 110 96 97 98 99 99 99 -+105 104 105 101 101 101 105 105 105 121 121 119 133 133 133 129 129 130 117 117 117 109 110 110 -+117 117 117 115 116 115 121 121 119 128 128 128 144 145 144 144 145 144 127 127 127 128 128 128 -+127 127 127 137 137 137 144 145 144 144 145 144 142 143 144 142 143 144 142 143 144 140 140 140 -+149 149 149 142 143 144 139 139 139 144 145 144 157 157 157 161 161 162 152 153 154 137 138 139 -+145 146 147 161 161 162 155 156 156 145 146 147 128 128 128 238 240 244 255 255 255 252 251 251 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+252 251 251 252 251 251 248 249 239 231 224 220 141 180 99 146 184 30 83 172 72 83 172 72 -+113 122 108 118 122 119 125 125 127 122 121 126 118 122 119 107 112 107 200 220 210 252 251 251 -+252 251 251 255 255 255 246 251 251 255 255 255 255 255 255 200 220 210 48 48 48 4 4 4 -+10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 -+11 13 16 6 8 11 14 16 19 6 8 11 14 16 19 53 54 57 72 73 75 78 79 82 -+88 88 88 99 99 99 105 104 105 109 110 110 122 121 126 131 131 131 134 134 134 139 139 139 -+140 140 140 142 143 144 144 145 144 144 145 144 142 143 144 140 140 140 139 139 139 139 139 139 -+142 143 144 139 139 139 137 138 139 137 137 137 134 134 134 134 134 134 133 133 133 129 129 130 -+129 129 130 129 129 130 129 129 130 127 127 127 125 122 126 121 121 119 117 117 117 117 117 117 -+117 117 117 115 116 115 115 116 115 112 112 113 109 110 110 109 110 110 105 105 105 105 105 105 -+105 105 105 103 103 102 99 99 99 99 99 99 99 99 99 95 95 94 90 90 90 87 87 87 -+89 89 89 87 87 87 84 84 84 83 83 83 82 82 82 78 78 78 76 76 76 76 76 76 -+75 75 75 71 71 71 69 69 69 68 68 68 67 67 67 65 65 65 63 63 63 62 62 62 -+59 59 59 57 57 57 54 54 54 57 57 57 52 52 52 50 50 50 52 52 52 53 53 53 -+50 50 50 50 50 50 42 42 42 44 44 44 44 44 44 38 38 38 40 40 40 34 34 34 -+43 43 43 32 32 32 36 36 36 44 44 44 39 39 39 36 36 36 36 36 36 32 32 32 -+28 28 28 31 31 31 24 24 24 23 23 23 28 28 28 23 23 23 19 19 19 29 29 29 -+36 36 36 31 31 31 23 23 23 16 16 16 16 16 16 20 20 20 20 20 20 17 17 17 -+14 14 14 16 16 16 21 21 21 19 19 19 8 8 8 17 17 17 36 36 36 32 32 32 -+16 16 16 13 13 13 23 23 23 19 19 19 23 23 23 24 24 24 8 8 8 16 16 16 -+8 8 8 23 23 23 17 17 17 8 8 8 25 25 25 38 38 38 25 25 25 8 8 8 -+19 19 19 4 4 4 21 21 21 8 8 8 16 16 16 8 8 8 19 19 19 14 14 14 -+11 11 11 19 19 19 4 4 4 17 17 17 34 34 34 27 27 27 17 17 17 11 11 11 -+8 8 8 25 25 25 23 23 23 10 10 10 13 13 13 17 17 17 13 13 13 13 13 13 -+17 17 17 8 8 8 13 13 13 28 28 28 34 34 34 29 29 29 19 19 19 13 13 13 -+19 19 19 13 13 13 11 11 11 11 11 11 17 17 17 19 19 19 14 14 14 10 10 10 -+20 20 20 10 10 10 8 8 8 21 21 21 34 34 34 34 34 34 24 24 24 14 14 14 -+11 11 11 19 19 19 19 19 19 10 10 10 10 10 10 23 23 23 32 32 32 33 33 33 -+8 8 8 14 14 14 14 14 14 10 10 10 8 8 8 13 13 13 14 14 14 11 11 11 -+31 31 31 33 33 33 19 19 19 11 11 11 13 13 13 6 6 6 8 8 8 19 19 19 -+4 4 4 19 19 19 31 31 31 34 34 34 29 29 29 27 27 27 3 3 3 20 20 20 -+14 14 14 13 13 13 16 16 16 14 14 14 14 14 14 28 28 28 28 28 28 20 20 20 -+ -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 -+0 0 0 3 3 3 0 0 0 4 4 4 17 17 17 20 20 20 17 17 17 20 20 20 -+17 17 17 21 21 21 14 14 14 8 8 8 16 16 16 19 19 19 17 17 17 19 19 19 -+17 17 17 14 14 14 16 16 16 19 19 19 16 16 16 6 6 6 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 8 8 8 19 19 19 -+17 17 17 13 13 13 0 0 0 0 0 0 0 0 0 3 3 3 19 19 19 14 14 14 -+0 0 0 0 0 0 6 6 6 8 8 8 6 6 6 6 6 6 10 10 10 13 13 13 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 6 6 6 10 10 10 13 13 13 -+13 13 13 8 8 8 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+13 13 13 16 16 16 8 8 8 0 0 0 0 0 0 16 16 16 21 21 21 16 16 16 -+3 3 3 0 0 0 3 3 3 8 8 8 16 16 16 20 20 20 21 21 21 20 20 20 -+11 11 11 3 3 3 0 0 0 3 3 3 6 6 6 6 6 6 3 3 3 0 0 0 -+0 0 0 11 11 11 4 4 4 31 31 31 44 44 44 16 16 16 0 0 0 16 16 16 -+8 8 8 10 10 10 16 16 16 21 21 21 58 58 58 17 17 17 13 13 13 6 6 6 -+14 14 14 19 19 19 8 8 8 34 34 34 57 57 57 38 38 38 20 20 20 17 17 17 -+17 17 17 27 27 27 16 16 16 36 36 36 70 70 70 54 54 54 29 29 29 51 51 51 -+44 44 44 31 31 31 28 28 28 57 57 57 69 69 69 74 74 74 56 56 56 46 46 46 -+69 69 69 60 60 60 40 40 40 59 59 59 90 90 90 87 87 87 65 65 65 50 50 50 -+72 72 72 78 78 78 70 70 70 71 71 71 95 95 94 103 103 102 84 84 84 69 69 69 -+74 74 74 89 89 89 93 93 93 88 88 88 96 97 98 112 112 113 103 103 102 78 78 78 -+84 84 84 96 96 96 105 105 105 109 110 110 115 116 115 121 121 119 112 112 113 96 96 96 -+101 101 101 105 104 105 109 110 110 121 121 119 133 133 133 131 131 131 121 121 119 112 112 113 -+121 121 119 115 116 115 121 121 119 128 128 128 144 145 144 147 147 148 129 129 130 129 129 130 -+134 134 134 144 145 144 144 145 144 134 134 134 137 137 137 149 151 153 155 156 156 144 145 144 -+137 138 139 137 138 139 140 140 140 149 149 149 158 159 161 160 161 160 155 156 156 149 149 149 -+157 157 157 160 161 160 142 143 144 137 137 137 180 183 185 255 255 255 252 251 251 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+246 251 251 246 251 251 255 255 255 254 249 251 238 240 244 136 172 147 83 172 72 83 172 72 -+113 122 108 118 122 119 122 121 126 122 121 126 122 121 126 126 132 129 157 157 157 255 255 255 -+255 255 255 246 251 251 255 255 255 252 251 251 252 251 251 200 220 210 42 42 42 14 14 14 -+10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 -+10 11 14 11 13 16 14 16 19 6 8 11 33 34 37 66 69 71 73 74 76 83 84 85 -+91 91 91 103 103 102 109 110 110 117 117 117 129 129 130 137 137 137 140 140 140 142 143 144 -+147 147 148 147 147 148 147 147 148 147 147 148 145 146 147 144 145 144 144 145 144 144 145 144 -+134 134 134 137 138 139 140 140 140 137 138 139 137 137 137 134 134 134 134 134 134 137 138 139 -+133 133 133 129 129 130 128 128 128 128 128 128 129 129 130 128 128 128 122 121 126 121 121 119 -+121 121 119 117 117 117 115 116 115 117 117 117 115 116 115 112 112 113 109 110 110 112 112 113 -+103 103 102 101 101 101 101 101 101 103 103 102 99 99 99 90 90 90 93 93 93 103 103 102 -+93 93 93 88 88 88 84 84 84 83 83 83 83 83 83 82 82 82 82 82 82 84 84 84 -+87 87 87 81 81 81 71 71 71 67 67 67 67 67 67 63 63 63 59 59 59 58 58 58 -+59 59 59 69 69 69 66 66 66 56 56 56 59 59 59 52 52 52 44 44 44 51 51 51 -+45 45 45 45 45 45 37 37 37 38 38 38 40 40 40 44 44 44 53 53 53 53 53 53 -+54 54 54 50 50 50 57 57 57 59 59 59 46 46 46 36 36 36 32 32 32 25 25 25 -+27 27 27 38 38 38 42 42 42 42 42 42 44 44 44 38 38 38 28 28 28 28 28 28 -+31 31 31 20 20 20 13 13 13 14 14 14 16 16 16 13 13 13 11 11 11 13 13 13 -+10 10 10 19 19 19 21 21 21 27 27 27 20 20 20 28 28 28 46 46 46 31 31 31 -+33 33 33 33 33 33 46 46 46 46 46 46 42 42 42 25 25 25 13 13 13 37 37 37 -+43 43 43 44 44 44 39 39 39 29 29 29 33 33 33 48 48 48 43 43 43 20 20 20 -+43 43 43 44 44 44 39 39 39 6 6 6 37 37 37 39 39 39 38 38 38 46 46 46 -+16 16 16 0 0 0 16 16 16 39 39 39 40 40 40 20 20 20 0 0 0 3 3 3 -+3 3 3 28 28 28 31 31 31 16 16 16 13 13 13 14 14 14 11 11 11 13 13 13 -+14 14 14 19 19 19 25 25 25 33 33 33 31 31 31 17 17 17 10 10 10 13 13 13 -+14 14 14 10 10 10 4 4 4 14 14 14 25 25 25 28 28 28 21 21 21 11 11 11 -+17 17 17 14 14 14 23 23 23 36 36 36 36 36 36 23 23 23 11 11 11 13 13 13 -+17 17 17 14 14 14 11 11 11 11 11 11 24 24 24 36 36 36 32 32 32 20 20 20 -+4 4 4 14 14 14 19 19 19 13 13 13 8 8 8 16 16 16 23 23 23 27 27 27 -+44 44 44 43 43 43 6 6 6 3 3 3 11 11 11 0 0 0 8 8 8 0 0 0 -+3 3 3 24 24 24 33 33 33 25 25 25 19 19 19 31 31 31 10 10 10 39 39 39 -+48 48 48 54 54 54 52 52 52 46 46 46 49 49 49 46 46 46 45 45 45 43 43 43 -+ -+13 13 13 10 10 10 6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 -+0 0 0 4 4 4 0 0 0 6 6 6 19 19 19 21 21 21 17 17 17 20 20 20 -+17 17 17 21 21 21 14 14 14 8 8 8 16 16 16 19 19 19 17 17 17 19 19 19 -+16 16 16 16 16 16 17 17 17 20 20 20 16 16 16 6 6 6 0 0 0 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 8 8 8 19 19 19 -+17 17 17 16 16 16 0 0 0 0 0 0 0 0 0 0 0 0 16 16 16 16 16 16 -+0 0 0 0 0 0 6 6 6 6 6 6 3 3 3 3 3 3 8 8 8 14 14 14 -+8 8 8 8 8 8 8 8 8 10 10 10 13 13 13 14 14 14 16 16 16 17 17 17 -+8 8 8 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 6 6 6 -+16 16 16 11 11 11 0 0 0 0 0 0 8 8 8 20 20 20 20 20 20 10 10 10 -+0 0 0 0 0 0 4 4 4 11 11 11 17 17 17 20 20 20 20 20 20 17 17 17 -+6 6 6 0 0 0 0 0 0 3 3 3 6 6 6 6 6 6 6 6 6 4 4 4 -+11 11 11 0 0 0 13 13 13 4 4 4 27 27 27 45 45 45 13 13 13 4 4 4 -+4 4 4 6 6 6 11 11 11 16 16 16 19 19 19 58 58 58 19 19 19 16 16 16 -+21 21 21 4 4 4 19 19 19 8 8 8 33 33 33 62 62 62 36 36 36 21 21 21 -+14 14 14 27 27 27 25 25 25 20 20 20 40 40 40 69 69 69 68 68 68 45 45 45 -+25 25 25 31 31 31 33 33 33 37 37 37 42 42 42 72 72 72 73 73 73 70 70 70 -+52 52 52 46 46 46 40 40 40 51 51 51 63 63 63 80 80 80 88 88 88 72 72 72 -+80 80 80 66 66 66 60 60 60 59 59 59 68 68 68 92 92 92 103 103 102 88 88 88 -+83 83 83 90 90 90 85 85 85 74 74 74 87 87 87 109 110 110 112 112 113 101 101 101 -+92 92 92 105 105 105 109 110 110 99 99 99 101 101 101 117 117 117 125 122 126 115 116 115 -+103 103 102 112 112 113 127 127 127 121 121 119 112 112 113 125 122 126 137 137 137 129 129 130 -+117 117 117 125 122 126 125 122 126 140 140 140 133 133 133 128 128 128 147 147 148 137 137 137 -+142 143 144 140 140 140 134 134 134 133 133 133 139 139 139 149 149 149 155 156 156 152 153 154 -+139 139 139 144 145 144 152 153 154 157 157 157 157 157 157 152 153 154 155 156 156 163 163 163 -+163 163 163 145 146 147 144 145 144 137 138 139 248 249 239 252 251 251 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+246 251 251 255 255 255 254 249 251 255 255 255 255 255 255 231 246 232 83 172 115 83 172 72 -+86 124 83 113 122 108 122 121 126 125 122 126 113 122 108 116 129 109 116 129 109 255 255 255 -+255 255 255 255 255 255 252 251 251 252 251 251 231 224 220 231 224 220 128 128 128 11 11 11 -+10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 -+10 11 14 14 16 19 11 13 16 16 20 21 53 54 57 73 74 76 75 78 80 87 88 90 -+101 101 101 112 112 113 117 117 117 121 121 119 129 129 130 139 139 139 144 145 144 152 153 154 -+147 147 148 147 147 148 149 149 149 149 151 153 152 153 154 149 149 149 144 145 144 140 140 140 -+144 145 144 152 153 154 155 156 156 152 153 154 149 149 149 147 147 148 147 147 148 152 153 154 -+144 145 144 133 133 133 122 121 126 122 121 126 131 131 131 137 138 139 137 137 137 131 131 131 -+122 121 126 112 112 113 112 112 113 125 122 126 128 128 128 121 121 119 115 116 115 122 121 126 -+112 112 113 103 103 102 99 99 99 99 99 99 95 95 94 91 91 91 95 95 94 105 104 105 -+105 104 105 88 88 88 78 78 78 83 83 83 83 83 83 76 76 76 80 80 80 90 90 90 -+103 103 102 99 99 99 85 85 85 72 72 72 68 68 68 63 63 63 60 60 60 60 60 60 -+59 59 59 75 75 75 76 76 76 62 62 62 71 71 71 58 58 58 38 38 38 45 45 45 -+39 39 39 43 43 43 46 46 46 50 50 50 58 58 58 66 66 66 72 72 72 72 72 72 -+63 63 63 63 63 63 62 62 62 56 56 56 40 40 40 29 29 29 24 24 24 19 19 19 -+21 21 21 46 46 46 63 63 63 62 62 62 59 59 59 57 57 57 48 48 48 31 31 31 -+8 8 8 13 13 13 16 16 16 13 13 13 11 11 11 10 10 10 10 10 10 8 8 8 -+16 16 16 13 13 13 14 14 14 44 44 44 44 44 44 43 43 43 63 63 63 49 49 49 -+53 53 53 61 61 61 54 54 54 38 38 38 45 45 45 52 52 52 44 44 44 43 43 43 -+19 19 19 6 6 6 31 31 31 46 46 46 37 37 37 44 44 44 52 52 52 36 36 36 -+23 23 23 54 54 54 49 49 49 11 11 11 37 37 37 38 38 38 23 23 23 53 53 53 -+40 40 40 6 6 6 28 28 28 33 33 33 23 23 23 39 39 39 28 28 28 0 0 0 -+0 0 0 17 17 17 24 24 24 17 17 17 11 11 11 10 10 10 11 11 11 13 13 13 -+13 13 13 31 31 31 36 36 36 27 27 27 17 17 17 13 13 13 10 10 10 11 11 11 -+10 10 10 16 16 16 16 16 16 24 24 24 27 27 27 21 21 21 19 19 19 8 8 8 -+4 4 4 24 24 24 39 39 39 37 37 37 23 23 23 13 13 13 13 13 13 16 16 16 -+14 14 14 8 8 8 10 10 10 23 23 23 34 34 34 34 34 34 23 23 23 11 11 11 -+16 16 16 8 8 8 16 16 16 36 36 36 42 42 42 33 33 33 36 36 36 49 49 49 -+51 51 51 51 51 51 19 19 19 0 0 0 0 0 0 0 0 0 6 6 6 0 0 0 -+27 27 27 31 31 31 24 24 24 4 4 4 8 8 8 37 37 37 6 6 6 42 42 42 -+29 29 29 44 44 44 46 46 46 38 38 38 34 34 34 23 23 23 36 36 36 48 48 48 -+ -+21 21 21 17 17 17 10 10 10 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 -+0 0 0 4 4 4 0 0 0 6 6 6 19 19 19 21 21 21 17 17 17 20 20 20 -+17 17 17 21 21 21 14 14 14 8 8 8 16 16 16 19 19 19 17 17 17 19 19 19 -+16 16 16 16 16 16 17 17 17 20 20 20 16 16 16 4 4 4 0 0 0 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 8 8 8 19 19 19 -+19 19 19 19 19 19 3 3 3 0 0 0 0 0 0 0 0 0 14 14 14 16 16 16 -+3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 6 6 6 6 6 6 -+16 16 16 16 16 16 16 16 16 16 16 16 14 14 14 13 13 13 11 11 11 10 10 10 -+4 4 4 0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 6 6 6 13 13 13 -+11 11 11 6 6 6 0 0 0 6 6 6 14 14 14 20 20 20 14 14 14 6 6 6 -+0 0 0 0 0 0 6 6 6 14 14 14 19 19 19 20 20 20 19 19 19 16 16 16 -+4 4 4 3 3 3 3 3 3 3 3 3 4 4 4 6 6 6 6 6 6 6 6 6 -+6 6 6 10 10 10 0 0 0 11 11 11 6 6 6 19 19 19 46 46 46 8 8 8 -+3 3 3 6 6 6 6 6 6 10 10 10 16 16 16 20 20 20 60 60 60 25 25 25 -+16 16 16 16 16 16 6 6 6 20 20 20 13 13 13 32 32 32 68 68 68 36 36 36 -+28 28 28 20 20 20 29 29 29 29 29 29 25 25 25 58 58 58 74 74 74 51 51 51 -+36 36 36 31 31 31 33 33 33 36 36 36 34 34 34 62 62 62 72 72 72 82 82 82 -+48 48 48 44 44 44 50 50 50 52 52 52 42 42 42 62 62 62 95 95 94 92 92 92 -+72 72 72 54 54 54 58 58 58 67 67 67 63 63 63 75 75 75 96 96 96 99 99 99 -+101 101 101 84 84 84 73 73 73 75 75 75 83 83 83 90 90 90 105 105 105 121 121 119 -+112 112 113 105 105 105 99 99 99 96 96 96 96 96 96 101 101 101 115 116 115 129 129 130 -+117 117 117 121 121 119 125 125 127 115 116 115 105 105 105 115 116 115 133 133 133 139 139 139 -+131 131 131 121 121 119 144 145 144 134 134 134 121 121 119 134 134 134 140 140 140 149 149 149 -+147 147 148 137 137 137 133 133 133 140 140 140 144 145 144 144 145 144 145 146 147 149 151 153 -+152 153 154 155 156 156 155 156 156 157 157 157 157 157 157 149 151 153 152 153 154 166 167 167 -+166 167 167 152 153 154 152 153 154 149 149 149 231 246 232 255 255 255 252 251 251 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 249 251 254 249 251 255 255 255 252 251 251 255 255 255 246 251 251 136 172 147 -+83 172 115 116 129 109 113 122 108 113 122 108 116 129 109 86 124 83 116 129 109 231 246 232 -+252 251 251 255 255 255 255 255 255 252 251 251 246 251 251 200 220 210 200 220 210 42 42 42 -+10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 -+11 13 16 11 13 16 11 13 16 35 36 38 69 70 72 81 81 81 87 87 87 90 91 93 -+109 110 110 121 121 119 127 127 127 127 127 127 131 131 131 139 139 139 149 149 149 160 161 160 -+149 151 153 147 147 148 147 147 148 149 151 153 155 156 156 152 153 154 145 146 147 140 140 140 -+140 140 140 149 149 149 149 151 153 147 147 148 144 145 144 139 139 139 137 137 137 142 143 144 -+145 146 147 145 146 147 144 145 144 134 134 134 128 128 128 128 128 128 134 134 134 142 143 144 -+129 129 130 121 121 119 115 116 115 117 117 117 121 121 119 121 121 119 115 116 115 112 112 113 -+121 121 119 112 112 113 101 101 101 93 93 93 93 93 93 95 95 94 94 94 94 91 91 91 -+109 110 110 93 93 93 82 82 82 81 81 81 80 80 80 73 73 73 75 75 75 84 84 84 -+95 95 94 101 101 101 93 93 93 75 75 75 65 65 65 59 59 59 56 56 56 59 59 59 -+54 54 54 62 62 62 74 74 74 68 68 68 77 77 77 62 62 62 46 46 46 53 53 53 -+58 58 58 63 63 63 70 70 70 72 72 72 73 73 73 75 75 75 71 71 71 67 67 67 -+68 68 68 67 67 67 52 52 52 33 33 33 24 24 24 23 23 23 23 23 23 21 21 21 -+11 11 11 25 25 25 51 51 51 61 61 61 51 51 51 45 45 45 43 43 43 33 33 33 -+6 6 6 11 11 11 13 13 13 10 10 10 8 8 8 10 10 10 11 11 11 8 8 8 -+4 4 4 3 3 3 10 10 10 48 48 48 42 42 42 32 32 32 62 62 62 57 57 57 -+54 54 54 62 62 62 38 38 38 19 19 19 37 37 37 52 52 52 48 48 48 33 33 33 -+8 8 8 6 6 6 27 27 27 43 43 43 42 42 42 39 39 39 40 40 40 36 36 36 -+8 8 8 32 32 32 50 50 50 38 38 38 27 27 27 34 34 34 19 19 19 33 33 33 -+54 54 54 37 37 37 27 27 27 6 6 6 0 0 0 39 39 39 49 49 49 20 20 20 -+4 4 4 6 6 6 14 14 14 17 17 17 11 11 11 10 10 10 13 13 13 13 13 13 -+24 24 24 34 34 34 29 29 29 16 16 16 11 11 11 11 11 11 10 10 10 13 13 13 -+16 16 16 24 24 24 21 21 21 25 25 25 20 20 20 8 8 8 13 13 13 8 8 8 -+17 17 17 33 33 33 38 38 38 25 25 25 11 11 11 11 11 11 16 16 16 14 14 14 -+11 11 11 10 10 10 20 20 20 33 33 33 31 31 31 19 19 19 19 19 19 29 29 29 -+23 23 23 0 0 0 13 13 13 48 48 48 56 56 56 36 36 36 32 32 32 50 50 50 -+44 44 44 37 37 37 36 36 36 11 11 11 0 0 0 0 0 0 4 4 4 14 14 14 -+34 34 34 24 24 24 10 10 10 0 0 0 13 13 13 43 43 43 0 0 0 38 38 38 -+10 10 10 23 23 23 38 38 38 37 37 37 25 25 25 3 3 3 33 33 33 45 45 45 -+ -+27 27 27 21 21 21 13 13 13 4 4 4 0 0 0 0 0 0 0 0 0 3 3 3 -+0 0 0 4 4 4 3 3 3 6 6 6 20 20 20 21 21 21 17 17 17 20 20 20 -+17 17 17 21 21 21 14 14 14 8 8 8 16 16 16 19 19 19 17 17 17 19 19 19 -+16 16 16 16 16 16 19 19 19 20 20 20 14 14 14 4 4 4 0 0 0 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 8 8 8 19 19 19 -+20 20 20 20 20 20 4 4 4 0 0 0 0 0 0 0 0 0 13 13 13 16 16 16 -+11 11 11 4 4 4 0 0 0 0 0 0 4 4 4 8 8 8 3 3 3 0 0 0 -+0 0 0 3 3 3 3 3 3 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 10 10 10 19 19 19 -+3 3 3 3 3 3 6 6 6 14 14 14 20 20 20 17 17 17 10 10 10 3 3 3 -+0 0 0 0 0 0 8 8 8 16 16 16 20 20 20 20 20 20 17 17 17 14 14 14 -+4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 4 4 4 6 6 6 6 6 6 -+0 0 0 3 3 3 10 10 10 0 0 0 4 4 4 10 10 10 17 17 17 51 51 51 -+14 14 14 11 11 11 11 11 11 10 10 10 10 10 10 14 14 14 20 20 20 60 60 60 -+24 24 24 16 16 16 23 23 23 17 17 17 11 11 11 14 14 14 32 32 32 68 68 68 -+38 38 38 29 29 29 11 11 11 31 31 31 57 57 57 39 39 39 36 36 36 77 77 77 -+56 56 56 37 37 37 31 31 31 38 38 38 42 42 42 68 68 68 68 68 68 72 72 72 -+75 75 75 56 56 56 44 44 44 50 50 50 48 48 48 59 59 59 83 83 83 85 85 85 -+92 92 92 70 70 70 60 60 60 69 69 69 70 70 70 65 65 65 82 82 82 112 112 113 -+109 110 110 90 90 90 78 78 78 82 82 82 83 83 83 82 82 82 93 93 93 112 112 113 -+121 121 119 103 103 102 93 93 93 99 99 99 99 99 99 96 96 96 105 104 105 121 121 119 -+131 131 131 127 127 127 109 110 110 109 110 110 121 121 119 115 116 115 112 112 113 133 133 133 -+140 140 140 144 145 144 133 133 133 128 128 128 128 128 128 129 129 130 144 145 144 144 145 144 -+152 153 154 140 140 140 139 139 139 147 147 148 149 151 153 142 143 144 140 140 140 144 145 144 -+161 161 162 155 156 156 147 147 148 149 151 153 157 157 157 157 157 157 155 156 156 166 165 167 -+157 157 157 161 161 162 142 143 144 140 140 140 147 147 148 255 255 255 231 246 232 252 251 251 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+252 251 251 252 251 251 254 249 251 255 255 255 252 251 251 248 249 239 252 251 251 255 255 255 -+141 180 99 83 172 115 86 124 83 86 124 83 83 172 115 83 172 115 141 180 99 187 210 182 -+255 255 255 255 255 255 252 251 251 255 255 255 200 220 210 200 220 210 238 240 244 169 175 167 -+10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 -+14 16 19 8 10 13 11 13 16 50 51 53 76 76 76 83 84 85 94 94 95 91 92 94 -+105 105 105 125 122 126 134 134 134 137 137 137 139 139 139 142 143 144 147 147 148 157 157 157 -+166 165 167 155 156 156 147 147 148 145 146 147 152 153 154 157 157 157 155 156 156 149 151 153 -+147 147 148 152 153 154 152 153 154 149 149 149 147 147 148 140 140 140 134 134 134 137 137 137 -+139 139 139 144 145 144 147 147 148 147 147 148 144 145 144 137 138 139 137 137 137 137 137 137 -+139 139 139 137 138 139 127 127 127 112 112 113 117 117 117 131 131 131 128 128 128 112 112 113 -+115 116 115 121 121 119 112 112 113 99 99 99 91 91 91 94 94 94 94 94 94 88 88 88 -+105 105 105 101 101 101 91 91 91 81 81 81 77 77 77 77 77 77 75 75 75 71 71 71 -+82 82 82 99 99 99 101 101 101 83 83 83 69 69 69 60 60 60 57 57 57 60 60 60 -+58 58 58 54 54 54 75 75 75 78 78 78 89 89 89 77 77 77 71 71 71 81 81 81 -+70 70 70 73 73 73 77 77 77 73 73 73 72 72 72 74 74 74 70 70 70 67 67 67 -+71 71 71 70 70 70 49 49 49 24 24 24 23 23 23 28 28 28 24 24 24 23 23 23 -+27 27 27 14 14 14 40 40 40 66 66 66 52 52 52 36 36 36 44 44 44 54 54 54 -+27 27 27 13 13 13 0 0 0 6 6 6 11 11 11 10 10 10 8 8 8 11 11 11 -+0 0 0 17 17 17 25 25 25 50 50 50 27 27 27 10 10 10 53 53 53 52 52 52 -+59 59 59 54 54 54 34 34 34 42 42 42 45 45 45 20 20 20 24 24 24 44 44 44 -+21 21 21 37 37 37 16 16 16 3 3 3 34 34 34 40 40 40 34 34 34 51 51 51 -+33 33 33 0 0 0 32 32 32 51 51 51 13 13 13 43 43 43 34 34 34 0 0 0 -+42 42 42 45 45 45 14 14 14 0 0 0 0 0 0 0 0 0 25 25 25 54 54 54 -+19 19 19 4 4 4 8 8 8 17 17 17 14 14 14 11 11 11 14 14 14 11 11 11 -+38 38 38 29 29 29 16 16 16 11 11 11 16 16 16 10 10 10 6 6 6 19 19 19 -+19 19 19 24 24 24 14 14 14 16 16 16 11 11 11 4 4 4 20 20 20 19 19 19 -+39 39 39 36 36 36 25 25 25 14 14 14 10 10 10 13 13 13 13 13 13 10 10 10 -+14 14 14 17 17 17 32 32 32 40 40 40 23 23 23 0 0 0 20 20 20 53 53 53 -+46 46 46 25 25 25 27 27 27 51 51 51 52 52 52 29 29 29 28 28 28 49 49 49 -+33 33 33 10 10 10 42 42 42 24 24 24 0 0 0 4 4 4 4 4 4 49 49 49 -+20 20 20 4 4 4 0 0 0 0 0 0 25 25 25 50 50 50 0 0 0 43 43 43 -+21 21 21 21 21 21 44 44 44 51 51 51 33 33 33 6 6 6 36 36 36 37 37 37 -+ -+0 0 0 11 11 11 23 23 23 19 19 19 4 4 4 0 0 0 0 0 0 4 4 4 -+4 4 4 0 0 0 4 4 4 19 19 19 17 17 17 19 19 19 20 20 20 16 16 16 -+17 17 17 16 16 16 14 14 14 14 14 14 17 17 17 19 19 19 17 17 17 17 17 17 -+10 10 10 16 16 16 21 21 21 19 19 19 10 10 10 3 3 3 0 0 0 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 6 6 6 -+19 19 19 16 16 16 11 11 11 4 4 4 0 0 0 0 0 0 6 6 6 10 10 10 -+16 16 16 6 6 6 0 0 0 0 0 0 4 4 4 10 10 10 4 4 4 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 3 3 3 3 3 3 6 6 6 10 10 10 11 11 11 8 8 8 4 4 4 -+0 0 0 4 4 4 14 14 14 19 19 19 14 14 14 8 8 8 3 3 3 3 3 3 -+0 0 0 4 4 4 11 11 11 16 16 16 19 19 19 17 17 17 13 13 13 10 10 10 -+4 4 4 4 4 4 4 4 4 4 4 4 6 6 6 6 6 6 6 6 6 6 6 6 -+4 4 4 6 6 6 6 6 6 8 8 8 10 10 10 11 11 11 13 13 13 13 13 13 -+49 49 49 16 16 16 10 10 10 6 6 6 13 13 13 13 13 13 11 11 11 23 23 23 -+59 59 59 29 29 29 16 16 16 21 21 21 17 17 17 16 16 16 24 24 24 25 25 25 -+69 69 69 40 40 40 29 29 29 51 51 51 46 46 46 29 29 29 37 37 37 37 37 37 -+69 69 69 68 68 68 39 39 39 43 43 43 67 67 67 53 53 53 39 39 39 50 50 50 -+82 82 82 80 80 80 57 57 57 42 42 42 62 62 62 77 77 77 67 67 67 52 52 52 -+90 90 90 88 88 88 74 74 74 59 59 59 66 66 66 87 87 87 91 91 91 82 82 82 -+105 105 105 103 103 102 95 95 94 84 84 84 77 77 77 82 82 82 96 96 96 109 110 110 -+109 110 110 121 121 119 109 110 110 93 93 93 99 99 99 105 104 105 105 105 105 121 121 119 -+122 121 126 131 131 131 121 121 119 112 112 113 121 121 119 115 116 115 115 116 115 128 128 128 -+140 140 140 144 145 144 137 137 137 127 127 127 133 133 133 144 145 144 142 143 144 133 133 133 -+137 138 139 152 153 154 161 161 162 152 153 154 140 140 140 137 137 137 144 145 144 152 153 154 -+157 157 157 155 156 156 161 161 162 166 165 167 157 157 157 155 156 156 158 159 161 163 163 163 -+145 146 147 160 161 160 163 163 163 134 134 134 142 143 144 157 157 157 109 110 110 252 251 251 -+231 224 220 255 255 255 255 255 255 255 255 255 252 251 251 255 255 255 252 251 251 255 255 255 -+255 255 255 252 251 251 255 255 255 255 255 255 255 255 255 252 251 251 255 255 255 255 255 255 -+252 251 251 169 175 167 83 172 115 83 172 72 83 172 72 83 172 72 83 172 115 136 172 147 -+246 251 251 255 255 255 252 251 251 252 251 251 252 251 251 200 220 210 238 240 244 238 240 244 -+89 90 92 8 10 13 11 13 16 6 8 11 22 23 26 0 0 4 8 10 13 14 16 19 -+16 16 16 0 0 0 29 29 29 71 71 71 84 84 84 89 89 89 101 101 101 105 105 105 -+115 116 115 121 121 119 137 137 137 147 147 148 149 149 149 145 146 147 145 146 147 149 151 153 -+157 157 157 166 167 167 160 161 160 149 149 149 149 149 149 152 153 154 155 156 156 161 161 162 -+160 161 160 152 153 154 142 143 144 140 140 140 147 147 148 152 153 154 144 145 144 133 133 133 -+129 129 130 134 134 134 140 140 140 144 145 144 137 138 139 133 133 133 137 137 137 144 145 144 -+140 140 140 140 140 140 137 138 139 133 133 133 125 125 127 117 117 117 121 121 119 127 127 127 -+112 112 113 109 110 110 125 122 126 115 116 115 94 94 94 93 93 93 93 93 93 90 90 90 -+91 91 91 112 112 113 99 99 99 81 81 81 83 83 83 82 82 82 77 77 77 74 74 74 -+73 73 73 88 88 88 101 101 101 95 95 94 77 77 77 62 62 62 62 62 62 70 70 70 -+80 80 80 78 78 78 80 80 80 84 84 84 90 90 90 88 88 88 71 71 71 52 52 52 -+48 48 48 71 71 71 77 77 77 70 70 70 70 70 70 69 69 69 57 57 57 45 45 45 -+63 63 63 74 74 74 61 61 61 34 34 34 24 24 24 27 27 27 25 25 25 23 23 23 -+20 20 20 6 6 6 28 28 28 52 52 52 58 58 58 37 37 37 17 17 17 37 37 37 -+52 52 52 16 16 16 4 4 4 13 13 13 4 4 4 13 13 13 20 20 20 0 0 0 -+4 4 4 36 36 36 42 42 42 45 45 45 45 45 45 42 42 42 51 51 51 52 52 52 -+19 19 19 46 46 46 59 59 59 42 42 42 14 14 14 0 0 0 8 8 8 19 19 19 -+45 45 45 36 36 36 4 4 4 0 0 0 0 0 0 23 23 23 58 58 58 48 48 48 -+51 51 51 33 33 33 10 10 10 40 40 40 49 49 49 27 27 27 37 37 37 46 46 46 -+31 31 31 53 53 53 59 59 59 21 21 21 0 0 0 0 0 0 11 11 11 20 20 20 -+24 24 24 19 19 19 14 14 14 14 14 14 10 10 10 10 10 10 25 25 25 43 43 43 -+31 31 31 20 20 20 11 11 11 13 13 13 16 16 16 14 14 14 11 11 11 11 11 11 -+31 31 31 36 36 36 21 21 21 6 6 6 10 10 10 13 13 13 19 19 19 33 33 33 -+42 42 42 19 19 19 10 10 10 17 17 17 14 14 14 11 11 11 13 13 13 10 10 10 -+14 14 14 36 36 36 43 43 43 40 40 40 29 29 29 0 0 0 8 8 8 48 48 48 -+25 25 25 49 49 49 54 54 54 51 51 51 39 39 39 34 34 34 52 52 52 57 57 57 -+39 39 39 0 0 0 32 32 32 34 34 34 0 0 0 19 19 19 36 36 36 14 14 14 -+0 0 0 0 0 0 0 0 0 3 3 3 32 32 32 29 29 29 0 0 0 39 39 39 -+38 38 38 32 32 32 38 38 38 52 52 52 52 52 52 37 37 37 37 37 37 52 52 52 -+ -+0 0 0 0 0 0 13 13 13 25 25 25 24 24 24 8 8 8 0 0 0 0 0 0 -+3 3 3 0 0 0 6 6 6 19 19 19 19 19 19 17 17 17 20 20 20 17 17 17 -+17 17 17 16 16 16 13 13 13 14 14 14 17 17 17 19 19 19 17 17 17 16 16 16 -+11 11 11 16 16 16 20 20 20 17 17 17 8 8 8 0 0 0 0 0 0 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 8 8 8 10 10 10 -+17 17 17 16 16 16 10 10 10 3 3 3 0 0 0 0 0 0 0 0 0 6 6 6 -+17 17 17 13 13 13 8 8 8 4 4 4 4 4 4 8 8 8 11 11 11 13 13 13 -+10 10 10 6 6 6 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 -+0 0 0 4 4 4 8 8 8 11 11 11 13 13 13 10 10 10 4 4 4 0 0 0 -+0 0 0 10 10 10 17 17 17 20 20 20 16 16 16 10 10 10 6 6 6 4 4 4 -+6 6 6 13 13 13 19 19 19 23 23 23 21 21 21 17 17 17 11 11 11 6 6 6 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 3 3 4 4 4 6 6 6 8 8 8 8 8 8 10 10 10 -+20 20 20 59 59 59 17 17 17 10 10 10 8 8 8 6 6 6 6 6 6 13 13 13 -+27 27 27 48 48 48 36 36 36 11 11 11 19 19 19 20 20 20 16 16 16 28 28 28 -+29 29 29 65 65 65 58 58 58 42 42 42 36 36 36 23 23 23 23 23 23 33 33 33 -+53 53 53 62 62 62 66 66 66 65 65 65 50 50 50 40 40 40 46 46 46 39 39 39 -+56 56 56 89 89 89 72 72 72 58 58 58 80 80 80 63 63 63 40 40 40 69 69 69 -+67 67 67 91 91 91 99 99 99 83 83 83 76 76 76 87 87 87 84 84 84 69 69 69 -+78 78 78 105 105 105 115 116 115 95 95 94 88 88 88 103 103 102 105 105 105 93 93 93 -+96 96 96 109 110 110 121 121 119 109 110 110 96 97 98 105 105 105 117 117 117 115 116 115 -+112 112 113 121 121 119 129 129 130 128 128 128 115 116 115 115 116 115 127 127 127 134 134 134 -+131 131 131 137 137 137 137 137 137 137 137 137 140 140 140 137 138 139 133 133 133 133 133 133 -+142 143 144 149 149 149 155 156 156 149 151 153 144 145 144 144 145 144 149 151 153 157 157 157 -+149 149 149 149 151 153 158 159 161 163 163 163 158 159 161 157 157 157 160 161 160 161 161 162 -+158 159 161 152 153 154 152 153 154 152 153 154 122 121 126 128 128 128 115 116 115 144 145 144 -+83 83 83 238 240 244 231 224 220 231 224 220 255 255 255 246 251 251 255 255 255 252 251 251 -+252 251 251 255 255 255 255 255 255 252 251 251 255 255 255 255 255 255 255 255 255 255 255 255 -+252 251 251 252 251 251 187 210 182 83 172 115 83 172 72 83 172 72 83 172 115 83 172 115 -+252 251 251 252 251 251 252 251 251 255 255 255 200 220 210 180 183 185 246 251 251 238 240 244 -+187 210 182 14 16 19 11 13 16 16 20 21 1 3 7 26 29 32 0 0 4 20 21 24 -+10 10 10 14 14 14 46 46 46 77 77 77 87 87 87 91 91 91 105 104 105 112 112 113 -+121 121 119 125 125 127 137 137 137 149 149 149 157 157 157 157 157 157 152 153 154 149 149 149 -+155 156 156 160 161 160 161 161 162 157 157 157 149 151 153 145 146 147 147 147 148 157 157 157 -+157 157 157 152 153 154 144 145 144 140 140 140 144 145 144 147 147 148 145 146 147 144 145 144 -+131 131 131 133 133 133 137 137 137 140 140 140 140 140 140 133 133 133 127 127 127 121 121 119 -+129 129 130 133 133 133 137 138 139 140 140 140 134 134 134 129 129 130 131 131 131 137 137 137 -+128 128 128 125 125 127 128 128 128 115 116 115 105 105 105 103 103 102 96 96 96 94 94 94 -+95 95 94 105 105 105 101 101 101 92 92 92 89 89 89 87 87 87 88 88 88 83 83 83 -+84 84 84 91 91 91 99 99 99 103 103 102 101 101 101 96 96 96 93 93 93 92 92 92 -+73 73 73 73 73 73 73 73 73 74 74 74 77 77 77 76 76 76 67 67 67 54 54 54 -+52 52 52 56 56 56 50 50 50 45 45 45 51 51 51 53 53 53 44 44 44 38 38 38 -+34 34 34 44 44 44 42 42 42 33 33 33 33 33 33 32 32 32 25 25 25 21 21 21 -+20 20 20 27 27 27 40 40 40 52 52 52 62 62 62 46 46 46 14 14 14 23 23 23 -+44 44 44 48 48 48 28 28 28 8 8 8 14 14 14 16 16 16 6 6 6 10 10 10 -+37 37 37 43 43 43 23 23 23 24 24 24 51 51 51 59 59 59 54 54 54 56 56 56 -+57 57 57 46 46 46 56 56 56 50 50 50 27 27 27 8 8 8 10 10 10 32 32 32 -+25 25 25 54 54 54 29 29 29 0 0 0 0 0 0 4 4 4 31 31 31 48 48 48 -+51 51 51 54 54 54 27 27 27 33 33 33 54 54 54 50 50 50 46 46 46 37 37 37 -+20 20 20 24 24 24 48 48 48 49 49 49 23 23 23 0 0 0 0 0 0 11 11 11 -+14 14 14 19 19 19 14 14 14 6 6 6 14 14 14 29 29 29 34 34 34 28 28 28 -+11 11 11 8 8 8 8 8 8 11 11 11 13 13 13 13 13 13 13 13 13 14 14 14 -+34 34 34 11 11 11 10 10 10 20 20 20 13 13 13 14 14 14 29 29 29 37 37 37 -+24 24 24 14 14 14 13 13 13 16 16 16 10 10 10 6 6 6 11 11 11 17 17 17 -+43 43 43 43 43 43 40 40 40 48 48 48 56 56 56 48 48 48 44 44 44 59 59 59 -+32 32 32 40 40 40 38 38 38 40 40 40 39 39 39 38 38 38 48 48 48 45 45 45 -+53 53 53 4 4 4 19 19 19 43 43 43 28 28 28 23 23 23 27 27 27 13 13 13 -+3 3 3 4 4 4 0 0 0 0 0 0 27 27 27 29 29 29 8 8 8 40 40 40 -+34 34 34 25 25 25 37 37 37 48 48 48 46 46 46 54 54 54 58 58 58 44 44 44 -+ -+0 0 0 0 0 0 0 0 0 14 14 14 24 24 24 19 19 19 4 4 4 0 0 0 -+0 0 0 0 0 0 10 10 10 19 19 19 19 19 19 19 19 19 20 20 20 19 19 19 -+19 19 19 14 14 14 13 13 13 14 14 14 19 19 19 20 20 20 19 19 19 14 14 14 -+13 13 13 17 17 17 20 20 20 16 16 16 6 6 6 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 6 6 6 -+17 17 17 17 17 17 14 14 14 6 6 6 0 0 0 0 0 0 0 0 0 6 6 6 -+11 11 11 14 14 14 13 13 13 6 6 6 0 0 0 0 0 0 3 3 3 11 11 11 -+14 14 14 11 11 11 8 8 8 4 4 4 4 4 4 6 6 6 8 8 8 10 10 10 -+10 10 10 11 11 11 11 11 11 10 10 10 6 6 6 3 3 3 0 0 0 0 0 0 -+10 10 10 13 13 13 16 16 16 14 14 14 8 8 8 0 0 0 0 0 0 0 0 0 -+6 6 6 13 13 13 20 20 20 23 23 23 19 19 19 11 11 11 4 4 4 0 0 0 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 6 6 6 8 8 8 10 10 10 10 10 10 11 11 11 11 11 11 -+19 19 19 23 23 23 59 59 59 19 19 19 19 19 19 14 14 14 11 11 11 16 16 16 -+16 16 16 36 36 36 51 51 51 42 42 42 21 21 21 17 17 17 24 24 24 24 24 24 -+27 27 27 58 58 58 69 69 69 52 52 52 25 25 25 23 23 23 37 37 37 32 32 32 -+29 29 29 52 52 52 77 77 77 78 78 78 44 44 44 27 27 27 45 45 45 42 42 42 -+45 45 45 49 49 49 82 82 82 95 95 94 66 66 66 49 49 49 58 58 58 59 59 59 -+54 54 54 70 70 70 90 90 90 101 101 101 92 92 92 75 75 75 70 70 70 74 74 74 -+72 72 72 88 88 88 103 103 102 109 110 110 105 105 105 101 101 101 95 95 94 90 90 90 -+89 89 89 99 99 99 117 117 117 121 121 119 112 112 113 112 112 113 117 117 117 109 110 110 -+105 105 105 115 116 115 128 128 128 133 133 133 125 125 127 125 125 127 133 133 133 137 137 137 -+125 122 126 128 128 128 137 137 137 145 146 147 147 147 148 134 134 134 129 129 130 139 139 139 -+149 151 153 147 147 148 145 146 147 149 149 149 155 156 156 155 156 156 152 153 154 149 149 149 -+144 145 144 149 151 153 161 161 162 166 167 167 161 161 162 161 161 162 161 161 162 157 157 157 -+157 157 157 152 153 154 142 143 144 149 149 149 131 131 131 129 129 130 128 128 128 96 96 96 -+94 94 94 131 131 131 73 73 73 180 183 185 231 224 220 180 183 185 255 255 255 255 255 255 -+255 255 255 252 251 251 252 251 251 255 255 255 246 251 251 255 255 255 255 255 255 252 251 251 -+246 251 251 252 251 251 252 251 251 187 210 182 83 172 115 83 172 72 83 172 72 83 172 72 -+252 251 251 248 249 239 255 255 255 231 224 220 200 220 210 238 240 244 246 251 251 246 251 251 -+246 251 251 117 117 117 11 13 16 6 8 11 10 11 14 6 8 11 14 16 19 6 8 11 -+4 4 4 33 33 33 65 65 65 84 84 84 89 89 89 94 94 94 109 110 110 121 121 119 -+129 129 130 131 131 131 137 137 137 147 147 148 157 157 157 166 165 167 161 161 162 155 156 156 -+152 153 154 155 156 156 163 163 163 166 167 167 158 159 161 149 151 153 152 153 154 160 161 160 -+157 157 157 155 156 156 149 149 149 144 145 144 140 140 140 140 140 140 144 145 144 152 153 154 -+137 138 139 134 134 134 133 133 133 134 134 134 142 143 144 142 143 144 133 133 133 121 121 119 -+121 121 119 125 125 127 129 129 130 137 137 137 134 134 134 131 131 131 128 128 128 128 128 128 -+133 133 133 129 129 130 127 127 127 121 121 119 127 127 127 129 129 130 121 121 119 121 121 119 -+109 110 110 112 112 113 112 112 113 117 117 117 109 110 110 103 103 102 109 110 110 103 103 102 -+96 97 98 93 93 93 91 91 91 94 94 94 96 96 96 89 89 89 71 71 71 54 54 54 -+61 61 61 61 61 61 60 60 60 58 58 58 58 58 58 58 58 58 54 54 54 51 51 51 -+56 56 56 53 53 53 49 49 49 50 50 50 56 56 56 52 52 52 43 43 43 39 39 39 -+39 39 39 38 38 38 32 32 32 31 31 31 34 34 34 33 33 33 29 29 29 32 32 32 -+28 28 28 43 43 43 42 42 42 42 42 42 63 63 63 58 58 58 21 21 21 10 10 10 -+23 23 23 51 51 51 44 44 44 20 20 20 14 14 14 3 3 3 3 3 3 31 31 31 -+49 49 49 24 24 24 13 13 13 36 36 36 56 56 56 45 45 45 32 32 32 50 50 50 -+59 59 59 33 33 33 44 44 44 52 52 52 43 43 43 38 38 38 32 32 32 29 29 29 -+0 0 0 29 29 29 46 46 46 38 38 38 6 6 6 0 0 0 10 10 10 19 19 19 -+46 46 46 63 63 63 43 43 43 42 42 42 56 56 56 45 45 45 42 42 42 48 48 48 -+44 44 44 17 17 17 32 32 32 56 56 56 51 51 51 24 24 24 0 0 0 4 4 4 -+10 10 10 14 14 14 11 11 11 10 10 10 24 24 24 39 39 39 32 32 32 13 13 13 -+6 6 6 11 11 11 14 14 14 14 14 14 14 14 14 16 16 16 20 20 20 23 23 23 -+24 24 24 10 10 10 8 8 8 13 13 13 19 19 19 33 33 33 38 38 38 23 23 23 -+8 8 8 14 14 14 14 14 14 10 10 10 8 8 8 10 10 10 19 19 19 31 31 31 -+45 45 45 39 39 39 40 40 40 48 48 48 48 48 48 38 38 38 36 36 36 40 40 40 -+50 50 50 48 48 48 42 42 42 49 49 49 53 53 53 51 51 51 52 52 52 49 49 49 -+53 53 53 16 16 16 10 10 10 43 43 43 40 40 40 16 16 16 3 3 3 0 0 0 -+0 0 0 3 3 3 8 8 8 11 11 11 38 38 38 42 42 42 24 24 24 46 46 46 -+54 54 54 51 51 51 44 44 44 32 32 32 34 34 34 50 50 50 44 44 44 16 16 16 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 23 23 23 20 20 20 6 6 6 -+0 0 0 4 4 4 13 13 13 19 19 19 19 19 19 19 19 19 20 20 20 20 20 20 -+19 19 19 14 14 14 13 13 13 14 14 14 20 20 20 21 21 21 17 17 17 13 13 13 -+16 16 16 17 17 17 19 19 19 13 13 13 4 4 4 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+14 14 14 19 19 19 20 20 20 14 14 14 4 4 4 0 0 0 0 0 0 4 4 4 -+6 6 6 13 13 13 16 16 16 10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 -+6 6 6 8 8 8 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 -+8 8 8 8 8 8 4 4 4 0 0 0 0 0 0 0 0 0 6 6 6 13 13 13 -+19 19 19 17 17 17 14 14 14 8 8 8 0 0 0 0 0 0 0 0 0 0 0 0 -+10 10 10 16 16 16 20 20 20 20 20 20 14 14 14 8 8 8 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 -+3 3 3 3 3 3 4 4 4 4 4 4 6 6 6 8 8 8 8 8 8 8 8 8 -+3 3 3 11 11 11 16 16 16 57 57 57 21 21 21 16 16 16 8 8 8 8 8 8 -+16 16 16 4 4 4 34 34 34 58 58 58 38 38 38 14 14 14 19 19 19 23 23 23 -+48 48 48 33 33 33 44 44 44 58 58 58 44 44 44 33 33 33 34 34 34 24 24 24 -+37 37 37 51 51 51 59 59 59 71 71 71 67 67 67 44 44 44 39 39 39 45 45 45 -+40 40 40 58 58 58 70 70 70 78 78 78 81 81 81 65 65 65 51 51 51 59 59 59 -+60 60 60 57 57 57 73 73 73 99 99 99 101 101 101 80 80 80 70 70 70 77 77 77 -+83 83 83 72 72 72 85 85 85 112 112 113 121 121 119 101 101 101 87 87 87 92 92 92 -+93 93 93 94 94 94 101 101 101 117 117 117 129 129 130 125 125 127 112 112 113 105 104 105 -+109 110 110 115 116 115 115 116 115 125 122 126 140 140 140 140 140 140 129 129 130 128 128 128 -+125 122 126 129 129 130 137 138 139 144 145 144 147 147 148 140 140 140 139 139 139 147 147 148 -+149 149 149 142 143 144 140 140 140 149 151 153 161 161 162 161 161 162 152 153 154 144 145 144 -+152 153 154 157 157 157 166 165 167 166 167 167 163 163 163 166 165 167 166 165 167 157 157 157 -+152 153 154 144 145 144 142 143 144 137 137 137 137 137 137 129 129 130 115 116 115 101 101 101 -+83 83 83 87 87 87 74 74 74 96 96 96 78 78 78 101 101 101 200 220 210 157 157 157 -+255 255 255 252 251 251 252 251 251 255 255 255 255 255 255 252 251 251 255 255 255 255 255 255 -+238 240 244 255 255 255 254 249 251 252 251 251 187 210 182 83 172 115 83 172 72 83 172 72 -+200 220 210 246 251 251 255 255 255 246 251 251 180 183 185 238 240 244 238 240 244 238 240 244 -+238 240 244 231 224 220 42 43 45 10 11 14 16 20 21 8 10 13 14 16 19 10 11 14 -+10 10 10 49 49 49 77 77 77 87 87 87 93 93 93 101 101 101 112 112 113 127 127 127 -+139 139 139 142 143 144 144 145 144 145 146 147 155 156 156 163 163 163 166 167 167 163 163 163 -+157 157 157 152 153 154 160 161 160 166 167 167 161 161 162 161 161 162 163 163 163 160 161 160 -+155 156 156 155 156 156 155 156 156 152 153 154 144 145 144 137 137 137 140 140 140 145 146 147 -+149 149 149 142 143 144 131 131 131 125 125 127 129 129 130 137 137 137 134 134 134 129 129 130 -+121 121 119 121 121 119 125 125 127 131 131 131 137 138 139 140 140 140 137 137 137 134 134 134 -+131 131 131 127 127 127 121 121 119 112 112 113 112 112 113 112 112 113 103 103 102 93 93 93 -+101 101 101 96 97 98 96 97 98 105 105 105 99 99 99 83 83 83 82 82 82 78 78 78 -+74 74 74 73 73 73 76 76 76 87 87 87 96 97 98 94 94 94 76 76 76 60 60 60 -+66 66 66 65 65 65 61 61 61 59 59 59 58 58 58 57 57 57 57 57 57 54 54 54 -+45 45 45 51 51 51 57 57 57 59 59 59 54 54 54 45 45 45 38 38 38 39 39 39 -+44 44 44 43 43 43 40 40 40 39 39 39 39 39 39 34 34 34 31 31 31 32 32 32 -+40 40 40 44 44 44 29 29 29 25 25 25 51 51 51 60 60 60 34 34 34 10 10 10 -+6 6 6 24 24 24 45 45 45 44 44 44 19 19 19 3 3 3 25 25 25 50 50 50 -+21 21 21 8 8 8 39 39 39 58 58 58 52 52 52 40 40 40 39 39 39 61 61 61 -+43 43 43 29 29 29 25 25 25 34 34 34 32 32 32 40 40 40 39 39 39 0 0 0 -+0 0 0 0 0 0 29 29 29 46 46 46 25 25 25 3 3 3 0 0 0 3 3 3 -+23 23 23 51 51 51 46 46 46 44 44 44 49 49 49 39 39 39 44 44 44 57 57 57 -+49 49 49 28 28 28 28 28 28 43 43 43 56 56 56 48 48 48 20 20 20 13 13 13 -+14 14 14 10 10 10 14 14 14 27 27 27 34 34 34 28 28 28 17 17 17 10 10 10 -+17 17 17 17 17 17 16 16 16 11 11 11 11 11 11 17 17 17 23 23 23 24 24 24 -+13 13 13 19 19 19 10 10 10 11 11 11 34 34 34 40 40 40 24 24 24 11 11 11 -+10 10 10 19 19 19 13 13 13 4 4 4 16 16 16 25 25 25 32 32 32 40 40 40 -+33 33 33 34 34 34 50 50 50 58 58 58 51 51 51 44 44 44 49 49 49 51 51 51 -+43 43 43 42 42 42 44 44 44 54 54 54 56 56 56 48 48 48 48 48 48 51 51 51 -+59 59 59 50 50 50 34 34 34 46 46 46 51 51 51 38 38 38 40 40 40 39 39 39 -+44 44 44 42 42 42 43 43 43 46 46 46 60 60 60 53 53 53 36 36 36 51 51 51 -+23 23 23 42 42 42 31 31 31 21 21 21 48 48 48 62 62 62 54 54 54 51 51 51 -+ -+0 0 0 8 8 8 8 8 8 0 0 0 3 3 3 16 16 16 24 24 24 24 24 24 -+6 6 6 13 13 13 17 17 17 19 19 19 19 19 19 19 19 19 19 19 19 20 20 20 -+17 17 17 14 14 14 13 13 13 16 16 16 20 20 20 20 20 20 17 17 17 14 14 14 -+17 17 17 19 19 19 17 17 17 11 11 11 4 4 4 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 -+8 8 8 14 14 14 20 20 20 19 19 19 10 10 10 0 0 0 0 0 0 0 0 0 -+3 3 3 10 10 10 16 16 16 17 17 17 13 13 13 8 8 8 3 3 3 0 0 0 -+0 0 0 0 0 0 3 3 3 4 4 4 6 6 6 4 4 4 4 4 4 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 8 17 17 17 24 24 24 -+19 19 19 16 16 16 10 10 10 3 3 3 0 0 0 3 3 3 10 10 10 14 14 14 -+19 19 19 21 21 21 23 23 23 19 19 19 11 11 11 4 4 4 4 4 4 6 6 6 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+6 6 6 6 6 6 6 6 6 8 8 8 8 8 8 10 10 10 10 10 10 10 10 10 -+10 10 10 10 10 10 16 16 16 21 21 21 58 58 58 19 19 19 16 16 16 8 8 8 -+13 13 13 13 13 13 14 14 14 37 37 37 58 58 58 42 42 42 24 24 24 39 39 39 -+44 44 44 33 33 33 24 24 24 44 44 44 69 69 69 57 57 57 29 29 29 34 34 34 -+58 58 58 51 51 51 32 32 32 51 51 51 78 78 78 69 69 69 49 49 49 40 40 40 -+54 54 54 76 76 76 58 58 58 52 52 52 87 87 87 84 84 84 57 57 57 62 62 62 -+65 65 65 76 76 76 82 82 82 82 82 82 91 91 91 101 101 101 90 90 90 69 69 69 -+75 75 75 85 85 85 94 94 94 103 103 102 112 112 113 115 116 115 105 105 105 91 91 91 -+94 94 94 96 96 96 101 101 101 112 112 113 127 127 127 128 128 128 117 117 117 109 110 110 -+112 112 113 112 112 113 112 112 113 121 121 119 142 143 144 144 145 144 133 133 133 127 127 127 -+128 128 128 137 137 137 134 134 134 133 133 133 140 140 140 149 149 149 149 151 153 152 153 154 -+140 140 140 137 137 137 140 140 140 149 151 153 158 159 161 158 159 161 155 156 156 152 153 154 -+157 157 157 158 159 161 163 163 163 163 163 163 161 161 162 166 165 167 166 167 167 161 161 162 -+152 153 154 137 137 137 149 149 149 140 140 140 127 127 127 121 121 119 109 110 110 95 95 94 -+91 91 91 84 84 84 77 77 77 54 54 54 58 58 58 63 63 63 78 78 78 52 52 52 -+231 224 220 128 128 128 200 220 210 238 240 244 246 251 251 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 200 220 210 141 180 99 83 172 72 -+169 175 167 252 251 251 238 240 244 180 183 185 231 224 220 238 240 244 238 240 244 246 251 251 -+238 240 244 252 251 251 152 153 154 6 8 11 26 29 32 14 16 19 6 8 11 14 16 19 -+25 25 25 60 60 60 82 82 82 89 89 89 99 99 99 109 110 110 115 116 115 128 128 128 -+140 140 140 147 147 148 152 153 154 152 153 154 152 153 154 157 157 157 166 165 167 166 167 167 -+166 167 167 157 157 157 155 156 156 155 156 156 157 157 157 166 165 167 163 163 163 149 151 153 -+149 149 149 149 149 149 155 156 156 157 157 157 152 153 154 142 143 144 137 137 137 137 138 139 -+149 149 149 147 147 148 140 140 140 129 129 130 128 128 128 134 134 134 142 143 144 144 145 144 -+128 128 128 122 121 126 121 121 119 121 121 119 129 129 130 137 137 137 134 134 134 129 129 130 -+133 133 133 127 127 127 127 127 127 125 125 127 115 116 115 112 112 113 109 110 110 93 93 93 -+90 90 90 91 91 91 89 89 89 101 101 101 101 101 101 85 85 85 78 78 78 81 81 81 -+71 71 71 73 73 73 78 78 78 85 85 85 88 88 88 85 85 85 75 75 75 67 67 67 -+69 69 69 66 66 66 62 62 62 61 61 61 61 61 61 60 60 60 57 57 57 54 54 54 -+49 49 49 54 54 54 58 58 58 52 52 52 42 42 42 37 37 37 40 40 40 43 43 43 -+37 37 37 38 38 38 39 39 39 34 34 34 31 31 31 33 33 33 39 39 39 42 42 42 -+43 43 43 36 36 36 23 23 23 21 21 21 34 34 34 45 45 45 38 38 38 16 16 16 -+13 13 13 4 4 4 29 29 29 45 45 45 36 36 36 34 34 34 45 45 45 42 42 42 -+4 4 4 36 36 36 58 58 58 39 39 39 33 33 33 49 49 49 45 45 45 42 42 42 -+58 58 58 51 51 51 25 25 25 39 39 39 36 36 36 31 31 31 54 54 54 28 28 28 -+6 6 6 0 0 0 0 0 0 20 20 20 48 48 48 34 34 34 0 0 0 0 0 0 -+0 0 0 38 38 38 48 48 48 40 40 40 43 43 43 51 51 51 52 52 52 39 39 39 -+51 51 51 56 56 56 53 53 53 48 48 48 56 56 56 46 46 46 17 17 17 17 17 17 -+13 13 13 13 13 13 25 25 25 37 37 37 32 32 32 14 14 14 8 8 8 16 16 16 -+17 17 17 13 13 13 8 8 8 8 8 8 13 13 13 17 17 17 17 17 17 14 14 14 -+13 13 13 11 11 11 14 14 14 34 34 34 43 43 43 21 21 21 3 3 3 19 19 19 -+11 11 11 19 19 19 10 10 10 8 8 8 28 28 28 38 38 38 36 36 36 34 34 34 -+17 17 17 13 13 13 27 27 27 40 40 40 43 43 43 48 48 48 51 51 51 45 45 45 -+40 40 40 38 38 38 43 43 43 46 46 46 38 38 38 19 19 19 8 8 8 14 14 14 -+39 39 39 50 50 50 42 42 42 45 45 45 49 49 49 36 36 36 31 31 31 25 25 25 -+21 21 21 10 10 10 11 11 11 24 24 24 37 37 37 32 32 32 29 29 29 51 51 51 -+39 39 39 54 54 54 49 49 49 42 42 42 50 50 50 42 42 42 28 28 28 37 37 37 -+ -+4 4 4 0 0 0 0 0 0 8 8 8 3 3 3 0 0 0 6 6 6 27 27 27 -+16 16 16 23 23 23 21 21 21 17 17 17 20 20 20 20 20 20 17 17 17 19 19 19 -+14 14 14 14 14 14 16 16 16 17 17 17 19 19 19 19 19 19 17 17 17 14 14 14 -+19 19 19 19 19 19 16 16 16 10 10 10 4 4 4 0 0 0 0 0 0 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 10 10 10 17 17 17 19 19 19 11 11 11 3 3 3 0 0 0 0 0 0 -+0 0 0 0 0 0 6 6 6 14 14 14 19 19 19 17 17 17 11 11 11 4 4 4 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 6 6 6 11 11 11 13 13 13 13 13 13 14 14 14 14 14 14 -+6 6 6 3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 13 13 13 19 19 19 -+21 21 21 20 20 20 17 17 17 11 11 11 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 -+6 6 6 6 6 6 6 6 6 6 6 6 8 8 8 8 8 8 8 8 8 8 8 8 -+14 14 14 8 8 8 11 11 11 14 14 14 16 16 16 59 59 59 24 24 24 21 21 21 -+14 14 14 19 19 19 11 11 11 13 13 13 39 39 39 60 60 60 57 57 57 42 42 42 -+25 25 25 24 24 24 23 23 23 23 23 23 44 44 44 65 65 65 60 60 60 56 56 56 -+45 45 45 38 38 38 29 29 29 40 40 40 56 56 56 66 66 66 69 69 69 54 54 54 -+70 70 70 48 48 48 51 51 51 58 58 58 56 56 56 82 82 82 92 92 92 62 62 62 -+71 71 71 84 84 84 81 81 81 66 66 66 74 74 74 99 99 99 103 103 102 84 84 84 -+75 75 75 96 96 96 101 101 101 87 87 87 91 91 91 115 116 115 121 121 119 105 104 105 -+93 93 93 101 101 101 115 116 115 115 116 115 105 105 105 121 121 119 131 131 131 121 121 119 -+115 116 115 112 112 113 122 121 126 131 131 131 128 128 128 134 134 134 140 140 140 134 134 134 -+134 134 134 139 139 139 133 133 133 127 127 127 137 137 137 149 151 153 152 153 154 152 153 154 -+140 140 140 144 145 144 149 149 149 149 149 149 149 149 149 149 149 149 157 157 157 166 165 167 -+158 159 161 157 157 157 160 161 160 161 161 162 160 161 160 163 163 163 166 167 167 161 161 162 -+147 147 148 147 147 148 144 145 144 137 137 137 125 122 126 117 117 117 115 116 115 99 99 99 -+89 89 89 78 78 78 76 76 76 65 65 65 67 67 67 56 56 56 46 46 46 56 56 56 -+62 62 62 46 46 46 127 127 127 78 78 78 180 183 185 252 251 251 231 224 220 255 255 255 -+254 249 251 255 255 255 246 251 251 255 255 255 254 249 251 248 249 239 200 220 210 83 172 115 -+152 153 154 246 251 251 255 255 255 231 246 232 180 183 185 246 251 251 246 251 251 231 246 232 -+246 251 251 238 240 244 238 240 244 78 79 82 0 0 4 8 10 13 14 16 19 1 3 7 -+48 48 48 69 69 69 84 84 84 93 93 93 105 105 105 115 116 115 121 121 119 129 129 130 -+139 139 139 149 151 153 161 161 162 163 163 163 157 157 157 157 157 157 161 161 162 166 167 167 -+166 167 167 163 163 163 155 156 156 152 153 154 158 159 161 166 167 167 166 167 167 155 156 156 -+147 147 148 147 147 148 149 149 149 155 156 156 157 157 157 149 151 153 142 143 144 137 137 137 -+139 139 139 144 145 144 149 149 149 145 146 147 142 143 144 140 140 140 144 145 144 147 147 148 -+147 147 148 142 143 144 134 134 134 129 129 130 133 133 133 137 137 137 137 137 137 134 134 134 -+133 133 133 128 128 128 129 129 130 131 131 131 121 121 119 117 117 117 121 121 119 103 103 102 -+96 96 96 99 99 99 94 94 94 105 104 105 112 112 113 103 103 102 96 96 96 96 96 96 -+103 103 102 103 103 102 99 99 99 91 91 91 81 81 81 71 71 71 66 66 66 63 63 63 -+66 66 66 61 61 61 59 59 59 59 59 59 59 59 59 57 57 57 54 54 54 54 54 54 -+63 63 63 59 59 59 54 54 54 48 48 48 42 42 42 43 43 43 45 45 45 42 42 42 -+37 37 37 37 37 37 39 39 39 36 36 36 29 29 29 36 36 36 46 46 46 51 51 51 -+34 34 34 31 31 31 29 29 29 31 31 31 23 23 23 24 24 24 32 32 32 19 19 19 -+20 20 20 10 10 10 4 4 4 20 20 20 48 48 48 60 60 60 43 43 43 13 13 13 -+32 32 32 52 52 52 43 43 43 20 20 20 37 37 37 50 50 50 25 25 25 0 0 0 -+52 52 52 48 48 48 19 19 19 44 44 44 38 38 38 0 0 0 33 33 33 45 45 45 -+25 25 25 14 14 14 0 0 0 3 3 3 33 33 33 44 44 44 28 28 28 0 0 0 -+0 0 0 19 19 19 39 39 39 50 50 50 52 52 52 52 52 52 51 51 51 49 49 49 -+56 56 56 56 56 56 51 51 51 45 45 45 48 48 48 32 32 32 3 3 3 13 13 13 -+8 8 8 25 25 25 37 37 37 32 32 32 19 19 19 13 13 13 14 14 14 17 17 17 -+14 14 14 10 10 10 11 11 11 23 23 23 28 28 28 24 24 24 16 16 16 10 10 10 -+8 8 8 11 11 11 33 33 33 43 43 43 24 24 24 6 6 6 13 13 13 17 17 17 -+6 6 6 13 13 13 14 14 14 20 20 20 34 34 34 38 38 38 29 29 29 17 17 17 -+25 25 25 19 19 19 23 23 23 29 29 29 32 32 32 42 42 42 46 46 46 38 38 38 -+42 42 42 37 37 37 44 44 44 49 49 49 45 45 45 36 36 36 24 24 24 29 29 29 -+42 42 42 44 44 44 40 40 40 46 46 46 45 45 45 27 27 27 10 10 10 0 0 0 -+10 10 10 3 3 3 8 8 8 23 23 23 28 28 28 20 20 20 20 20 20 36 36 36 -+38 38 38 32 32 32 36 36 36 37 37 37 25 25 25 21 21 21 28 28 28 33 33 33 -+ -+21 21 21 3 3 3 0 0 0 6 6 6 4 4 4 0 0 0 0 0 0 16 16 16 -+25 25 25 31 31 31 24 24 24 16 16 16 20 20 20 20 20 20 16 16 16 16 16 16 -+13 13 13 14 14 14 19 19 19 19 19 19 19 19 19 17 17 17 16 16 16 16 16 16 -+20 20 20 19 19 19 14 14 14 10 10 10 4 4 4 3 3 3 4 4 4 6 6 6 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 -+3 3 3 10 10 10 17 17 17 19 19 19 16 16 16 11 11 11 6 6 6 4 4 4 -+0 0 0 0 0 0 0 0 0 8 8 8 14 14 14 17 17 17 16 16 16 13 13 13 -+13 13 13 10 10 10 6 6 6 3 3 3 0 0 0 3 3 3 6 6 6 8 8 8 -+13 13 13 14 14 14 17 17 17 20 20 20 20 20 20 17 17 17 13 13 13 8 8 8 -+3 3 3 3 3 3 0 0 0 3 3 3 6 6 6 10 10 10 14 14 14 16 16 16 -+19 19 19 17 17 17 14 14 14 10 10 10 4 4 4 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 6 6 6 6 6 6 -+8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 10 10 10 -+11 11 11 8 8 8 10 10 10 13 13 13 16 16 16 21 21 21 62 62 62 23 23 23 -+21 21 21 16 16 16 20 20 20 16 16 16 17 17 17 51 51 51 66 66 66 42 42 42 -+25 25 25 16 16 16 29 29 29 20 20 20 17 17 17 56 56 56 74 74 74 66 66 66 -+39 39 39 38 38 38 42 42 42 48 48 48 42 42 42 54 54 54 80 80 80 77 77 77 -+68 68 68 51 51 51 51 51 51 58 58 58 58 58 58 72 72 72 88 88 88 85 85 85 -+87 87 87 77 77 77 70 70 70 69 69 69 74 74 74 83 83 83 96 96 96 105 105 105 -+96 97 98 96 97 98 93 93 93 87 87 87 89 89 89 101 101 101 112 112 113 121 121 119 -+105 105 105 112 112 113 121 121 119 115 116 115 105 105 105 115 116 115 128 128 128 129 129 130 -+125 122 126 121 121 119 133 133 133 134 134 134 121 121 119 127 127 127 142 143 144 144 145 144 -+144 145 144 140 140 140 133 133 133 134 134 134 144 145 144 149 149 149 149 149 149 152 153 154 -+152 153 154 155 156 156 155 156 156 149 149 149 147 147 148 149 149 149 157 157 157 163 163 163 -+163 163 163 157 157 157 160 161 160 163 163 163 163 163 163 163 163 163 163 163 163 160 161 160 -+152 153 154 160 161 160 140 140 140 128 128 128 121 121 119 117 117 117 105 104 105 99 99 99 -+92 92 92 70 70 70 67 67 67 70 70 70 50 50 50 63 63 63 71 71 71 53 53 53 -+49 49 49 66 66 66 57 57 57 54 54 54 128 128 128 105 105 105 169 175 167 255 255 255 -+200 220 210 252 251 251 252 251 251 246 251 251 254 249 251 255 255 255 246 251 251 231 246 232 -+126 132 129 246 251 251 231 224 220 187 210 182 246 251 251 238 240 244 238 240 244 246 251 251 -+238 240 244 246 251 251 246 251 251 180 183 185 14 16 19 16 20 21 11 13 16 14 16 19 -+69 69 69 76 76 76 88 88 88 101 101 101 112 112 113 121 121 119 128 128 128 137 137 137 -+144 145 144 149 151 153 161 161 162 166 167 167 166 167 167 161 161 162 160 161 160 161 161 162 -+163 163 163 166 167 167 163 163 163 163 163 163 166 165 167 166 167 167 163 163 163 166 165 167 -+155 156 156 152 153 154 147 147 148 147 147 148 152 153 154 155 156 156 149 149 149 142 143 144 -+137 137 137 142 143 144 149 149 149 149 151 153 144 145 144 134 134 134 128 128 128 128 128 128 -+134 134 134 137 137 137 134 134 134 129 129 130 125 125 127 127 127 127 129 129 130 133 133 133 -+133 133 133 131 131 131 128 128 128 128 128 128 125 125 127 125 125 127 129 129 130 117 117 117 -+117 117 117 112 112 113 105 104 105 105 105 105 109 110 110 105 105 105 105 105 105 92 92 92 -+81 81 81 82 82 82 80 80 80 75 75 75 70 70 70 68 68 68 70 70 70 72 72 72 -+68 68 68 66 66 66 63 63 63 62 62 62 60 60 60 58 58 58 62 62 62 69 69 69 -+70 70 70 52 52 52 43 43 43 44 44 44 42 42 42 39 39 39 38 38 38 33 33 33 -+32 32 32 34 34 34 50 50 50 62 62 62 57 57 57 45 45 45 38 38 38 33 33 33 -+27 27 27 33 33 33 31 31 31 32 32 32 25 25 25 19 19 19 27 27 27 20 20 20 -+19 19 19 17 17 17 6 6 6 17 17 17 49 49 49 58 58 58 39 39 39 19 19 19 -+51 51 51 37 37 37 25 25 25 38 38 38 49 49 49 45 45 45 32 32 32 10 10 10 -+45 45 45 54 54 54 38 38 38 44 44 44 45 45 45 10 10 10 4 4 4 25 25 25 -+44 44 44 32 32 32 11 11 11 0 0 0 0 0 0 23 23 23 52 52 52 31 31 31 -+37 37 37 32 32 32 36 36 36 52 52 52 57 57 57 34 34 34 25 25 25 46 46 46 -+45 45 45 28 28 28 29 29 29 34 34 34 32 32 32 21 21 21 6 6 6 14 14 14 -+20 20 20 37 37 37 39 39 39 21 21 21 8 8 8 16 16 16 19 19 19 11 11 11 -+16 16 16 11 11 11 20 20 20 34 34 34 37 37 37 25 25 25 14 14 14 14 14 14 -+13 13 13 29 29 29 40 40 40 27 27 27 3 3 3 13 13 13 23 23 23 6 6 6 -+6 6 6 14 14 14 25 25 25 32 32 32 29 29 29 27 27 27 21 21 21 13 13 13 -+16 16 16 16 16 16 19 19 19 20 20 20 24 24 24 33 33 33 36 36 36 31 31 31 -+23 23 23 14 14 14 21 21 21 21 21 21 20 20 20 20 20 20 13 13 13 23 23 23 -+40 40 40 25 25 25 23 23 23 20 20 20 17 17 17 21 21 21 20 20 20 19 19 19 -+13 13 13 21 21 21 31 31 31 37 37 37 31 31 31 21 21 21 17 17 17 17 17 17 -+21 21 21 8 8 8 13 13 13 14 14 14 6 6 6 21 21 21 33 33 33 25 25 25 -+ -+42 42 42 24 24 24 6 6 6 4 4 4 10 10 10 8 8 8 8 8 8 13 13 13 -+31 31 31 34 34 34 25 25 25 16 16 16 20 20 20 20 20 20 14 14 14 14 14 14 -+11 11 11 16 16 16 20 20 20 20 20 20 17 17 17 16 16 16 16 16 16 17 17 17 -+20 20 20 17 17 17 14 14 14 10 10 10 4 4 4 4 4 4 6 6 6 8 8 8 -+16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 -+16 16 16 16 16 16 17 17 17 17 17 17 17 17 17 16 16 16 16 16 16 14 14 14 -+11 11 11 14 14 14 20 20 20 23 23 23 21 21 21 20 20 20 17 17 17 16 16 16 -+16 16 16 14 14 14 11 11 11 13 13 13 14 14 14 19 19 19 21 21 21 24 24 24 -+14 14 14 16 16 16 17 17 17 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 -+17 17 17 17 17 17 17 17 17 20 20 20 23 23 23 24 24 24 21 21 21 19 19 19 -+20 20 20 20 20 20 20 20 20 21 21 21 23 23 23 21 21 21 20 20 20 19 19 19 -+21 21 21 21 21 21 20 20 20 21 21 21 21 21 21 23 23 23 23 23 23 23 23 23 -+23 23 23 23 23 23 24 24 24 25 25 25 28 28 28 29 29 29 31 31 31 31 31 31 -+31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 -+36 36 36 29 29 29 36 36 36 39 39 39 34 34 34 34 34 34 36 36 36 62 62 62 -+38 38 38 44 44 44 40 40 40 39 39 39 48 48 48 48 48 48 52 52 52 68 68 68 -+51 51 51 50 50 50 49 49 49 44 44 44 56 56 56 62 62 62 58 58 58 74 74 74 -+70 70 70 58 58 58 50 50 50 60 60 60 60 60 60 62 62 62 81 81 81 88 88 88 -+81 81 81 71 71 71 66 66 66 71 71 71 72 72 72 67 67 67 77 77 77 101 101 101 -+96 97 98 80 80 80 75 75 75 87 87 87 88 88 88 78 78 78 88 88 88 109 110 110 -+115 116 115 99 99 99 93 93 93 103 103 102 105 105 105 101 101 101 105 105 105 121 121 119 -+127 127 127 125 122 126 112 112 113 112 112 113 121 121 119 115 116 115 112 112 113 134 134 134 -+137 137 137 137 138 139 134 134 134 129 129 130 128 128 128 129 129 130 137 137 137 145 146 147 -+149 149 149 140 140 140 137 137 137 147 147 148 155 156 156 145 146 147 144 145 144 152 153 154 -+157 157 157 157 157 157 152 153 154 149 149 149 155 156 156 161 161 162 163 163 163 160 161 160 -+166 167 167 163 163 163 166 165 167 166 167 167 166 167 167 163 163 163 161 161 162 157 157 157 -+166 167 167 149 149 149 147 147 148 142 143 144 121 121 119 125 125 127 101 101 101 99 99 99 -+89 89 89 85 85 85 72 72 72 75 75 75 59 59 59 59 59 59 50 50 50 63 63 63 -+61 61 61 50 50 50 65 65 65 50 50 50 57 57 57 40 40 40 103 103 102 200 220 210 -+180 183 185 248 249 239 231 224 220 231 224 220 255 255 255 252 251 251 254 249 251 254 249 251 -+238 240 244 200 220 210 180 183 185 238 240 244 246 251 251 246 251 251 246 251 251 238 240 244 -+246 251 251 238 240 244 238 240 244 238 240 244 127 127 127 0 0 4 14 16 19 37 39 42 -+82 82 82 82 82 82 92 92 92 109 110 110 117 117 117 121 121 119 131 131 131 142 143 144 -+149 151 153 149 151 153 157 157 157 166 167 167 166 167 167 166 167 167 161 161 162 160 161 160 -+157 157 157 166 167 167 166 167 167 166 167 167 166 165 167 152 153 154 152 153 154 163 163 163 -+163 163 163 157 157 157 147 147 148 142 143 144 145 146 147 152 153 154 152 153 154 147 147 148 -+140 140 140 140 140 140 144 145 144 149 149 149 147 147 148 137 138 139 128 128 128 127 127 127 -+127 127 127 137 137 137 140 140 140 131 131 131 121 121 119 115 116 115 121 121 119 122 121 126 -+134 134 134 134 134 134 121 121 119 121 121 119 125 122 126 125 122 126 127 127 127 121 121 119 -+105 105 105 94 94 94 87 87 87 90 90 90 87 87 87 95 95 94 103 103 102 82 82 82 -+83 83 83 82 82 82 80 80 80 77 77 77 75 75 75 73 73 73 71 71 71 69 69 69 -+63 63 63 63 63 63 62 62 62 60 60 60 53 53 53 52 52 52 63 63 63 76 76 76 -+77 77 77 50 50 50 37 37 37 42 42 42 38 38 38 32 32 32 34 34 34 38 38 38 -+34 34 34 29 29 29 48 48 48 70 70 70 67 67 67 46 46 46 32 32 32 24 24 24 -+24 24 24 36 36 36 24 24 24 24 24 24 32 32 32 27 27 27 27 27 27 21 21 21 -+17 17 17 19 19 19 31 31 31 44 44 44 49 49 49 46 46 46 48 48 48 52 52 52 -+53 53 53 20 20 20 28 28 28 49 49 49 21 21 21 23 23 23 46 46 46 11 11 11 -+20 20 20 51 51 51 42 42 42 16 16 16 38 38 38 40 40 40 0 0 0 0 0 0 -+29 29 29 52 52 52 29 29 29 8 8 8 0 0 0 0 0 0 40 40 40 57 57 57 -+46 46 46 33 33 33 11 11 11 23 23 23 56 56 56 54 54 54 39 39 39 53 53 53 -+54 54 54 38 38 38 53 53 53 57 57 57 32 32 32 17 17 17 14 14 14 16 16 16 -+38 38 38 43 43 43 36 36 36 16 16 16 8 8 8 14 14 14 14 14 14 3 3 3 -+17 17 17 11 11 11 20 20 20 34 34 34 32 32 32 13 13 13 6 6 6 14 14 14 -+33 33 33 40 40 40 27 27 27 6 6 6 11 11 11 16 16 16 8 8 8 8 8 8 -+11 11 11 20 20 20 37 37 37 38 38 38 21 21 21 13 13 13 20 20 20 20 20 20 -+19 19 19 20 20 20 19 19 19 21 21 21 32 32 32 37 37 37 28 28 28 14 14 14 -+20 20 20 14 14 14 23 23 23 17 17 17 14 14 14 21 21 21 24 24 24 40 40 40 -+27 27 27 16 16 16 28 28 28 19 19 19 8 8 8 27 27 27 28 28 28 19 19 19 -+13 13 13 29 29 29 38 38 38 34 34 34 24 24 24 23 23 23 25 25 25 16 16 16 -+8 8 8 17 17 17 14 14 14 10 10 10 24 24 24 37 37 37 27 27 27 3 3 3 -+ -+33 33 33 43 43 43 43 43 43 31 31 31 24 24 24 27 27 27 27 27 27 21 21 21 -+11 11 11 29 29 29 39 39 39 32 32 32 20 20 20 17 17 17 21 21 21 24 24 24 -+25 25 25 20 20 20 14 14 14 14 14 14 20 20 20 24 24 24 23 23 23 19 19 19 -+19 19 19 21 21 21 27 27 27 29 29 29 31 31 31 29 29 29 28 28 28 27 27 27 -+29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 -+29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 -+28 28 28 27 27 27 25 25 25 23 23 23 21 21 21 20 20 20 19 19 19 17 17 17 -+27 27 27 27 27 27 28 28 28 28 28 28 28 28 28 29 29 29 29 29 29 29 29 29 -+24 24 24 23 23 23 23 23 23 21 21 21 20 20 20 20 20 20 19 19 19 19 19 19 -+25 25 25 27 27 27 28 28 28 29 29 29 31 31 31 29 29 29 29 29 29 28 28 28 -+31 31 31 28 28 28 24 24 24 19 19 19 17 17 17 16 16 16 16 16 16 17 17 17 -+25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 27 27 27 27 27 27 27 27 27 -+28 28 28 28 28 28 29 29 29 29 29 29 29 29 29 29 29 29 31 31 31 31 31 31 -+31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 -+34 34 34 32 32 32 34 34 34 38 38 38 37 37 37 34 34 34 37 37 37 42 42 42 -+57 57 57 46 46 46 43 43 43 50 50 50 49 49 49 40 40 40 42 42 42 52 52 52 -+66 66 66 57 57 57 43 43 43 54 54 54 65 65 65 54 54 54 51 51 51 53 53 53 -+73 73 73 71 71 71 61 61 61 56 56 56 66 66 66 76 76 76 71 71 71 59 59 59 -+87 87 87 82 82 82 72 72 72 65 65 65 69 69 69 80 80 80 80 80 80 73 73 73 -+96 96 96 91 91 91 84 84 84 80 80 80 80 80 80 85 85 85 93 93 93 101 101 101 -+109 110 110 105 105 105 99 99 99 94 94 94 91 91 91 95 95 94 105 105 105 115 116 115 -+125 122 126 125 122 126 117 117 117 112 112 113 109 110 110 115 116 115 121 121 119 121 121 119 -+134 134 134 137 137 137 134 134 134 122 121 126 129 129 130 142 143 144 137 137 137 134 134 134 -+139 139 139 147 147 148 152 153 154 144 145 144 137 138 139 139 139 139 145 146 147 152 153 154 -+152 153 154 157 157 157 157 157 157 152 153 154 152 153 154 157 157 157 157 157 157 155 156 156 -+158 159 161 166 167 167 166 167 167 166 167 167 161 161 162 160 161 160 160 161 160 160 161 160 -+155 156 156 152 153 154 149 149 149 140 140 140 128 128 128 115 116 115 105 105 105 103 103 102 -+91 91 91 85 85 85 77 77 77 72 72 72 69 69 69 67 67 67 63 63 63 60 60 60 -+58 58 58 61 61 61 59 59 59 57 57 57 61 61 61 50 50 50 71 71 71 180 183 185 -+246 251 251 180 183 185 231 224 220 200 220 210 231 224 220 166 167 167 255 255 255 231 224 220 -+255 255 255 180 183 185 231 246 232 238 240 244 238 240 244 238 240 244 238 240 244 238 240 244 -+238 240 244 238 240 244 246 251 251 238 240 244 231 246 232 37 39 42 16 20 21 66 69 71 -+77 77 77 88 88 88 94 94 94 109 110 110 125 125 127 129 129 130 134 134 134 144 145 144 -+149 149 149 157 157 157 161 161 162 160 161 160 166 167 167 169 175 167 169 175 167 160 161 160 -+158 159 161 161 161 162 166 167 167 166 167 167 163 163 163 155 156 156 152 153 154 157 157 157 -+157 157 157 161 161 162 157 157 157 147 147 148 142 143 144 144 145 144 152 153 154 155 156 156 -+139 139 139 140 140 140 149 151 153 140 140 140 139 139 139 149 149 149 133 133 133 125 125 127 -+127 127 127 127 127 127 131 131 131 137 137 137 131 131 131 117 117 117 112 112 113 115 116 115 -+117 117 117 133 133 133 129 129 130 115 116 115 115 116 115 121 121 119 121 121 119 121 121 119 -+117 117 117 101 101 101 89 89 89 84 84 84 83 83 83 90 90 90 93 93 93 87 87 87 -+83 83 83 83 83 83 75 75 75 73 73 73 78 78 78 77 77 77 69 69 69 67 67 67 -+69 69 69 60 60 60 61 61 61 53 53 53 52 52 52 61 61 61 66 66 66 80 80 80 -+80 80 80 60 60 60 43 43 43 39 39 39 39 39 39 37 37 37 34 34 34 38 38 38 -+34 34 34 27 27 27 32 32 32 58 58 58 70 70 70 49 49 49 24 24 24 25 25 25 -+25 25 25 23 23 23 21 21 21 25 25 25 28 28 28 28 28 28 25 25 25 23 23 23 -+19 19 19 43 43 43 39 39 39 36 36 36 46 46 46 14 14 14 24 24 24 52 52 52 -+44 44 44 37 37 37 44 44 44 19 19 19 17 17 17 8 8 8 38 38 38 40 40 40 -+36 36 36 44 44 44 58 58 58 33 33 33 28 28 28 45 45 45 23 23 23 0 0 0 -+0 0 0 20 20 20 46 46 46 43 43 43 19 19 19 34 34 34 56 56 56 45 45 45 -+45 45 45 46 46 46 48 48 48 50 50 50 52 52 52 54 54 54 54 54 54 54 54 54 -+39 39 39 36 36 36 60 60 60 49 49 49 4 4 4 4 4 4 25 25 25 36 36 36 -+33 33 33 28 28 28 19 19 19 13 13 13 11 11 11 14 14 14 14 14 14 13 13 13 -+6 6 6 25 25 25 37 37 37 31 31 31 14 14 14 8 8 8 20 20 20 32 32 32 -+43 43 43 25 25 25 13 13 13 14 14 14 16 16 16 10 10 10 11 11 11 19 19 19 -+13 13 13 21 21 21 45 45 45 42 42 42 6 6 6 6 6 6 24 24 24 17 17 17 -+21 21 21 14 14 14 17 17 17 33 33 33 46 46 46 50 50 50 50 50 50 51 51 51 -+44 44 44 56 56 56 42 42 42 0 0 0 0 0 0 23 23 23 33 33 33 19 19 19 -+0 0 0 3 3 3 45 45 45 21 21 21 8 8 8 48 48 48 48 48 48 48 48 48 -+34 34 34 29 29 29 31 31 31 39 39 39 44 44 44 37 37 37 20 20 20 8 8 8 -+16 16 16 8 8 8 13 13 13 28 28 28 31 31 31 19 19 19 10 10 10 13 13 13 -+ -+19 19 19 33 33 33 43 43 43 39 39 39 28 28 28 21 21 21 20 20 20 21 21 21 -+17 17 17 19 19 19 27 27 27 36 36 36 34 34 34 24 24 24 17 17 17 19 19 19 -+20 20 20 19 19 19 17 17 17 19 19 19 20 20 20 20 20 20 20 20 20 20 20 20 -+20 20 20 19 19 19 19 19 19 19 19 19 20 20 20 20 20 20 19 19 19 19 19 19 -+20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 -+20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 -+20 20 20 17 17 17 16 16 16 14 14 14 14 14 14 16 16 16 19 19 19 20 20 20 -+23 23 23 21 21 21 20 20 20 17 17 17 16 16 16 14 14 14 14 14 14 14 14 14 -+19 19 19 19 19 19 19 19 19 19 19 19 17 17 17 17 17 17 17 17 17 17 17 17 -+17 17 17 17 17 17 16 16 16 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 -+21 21 21 21 21 21 21 21 21 21 21 21 20 20 20 19 19 19 17 17 17 16 16 16 -+8 8 8 8 8 8 8 8 8 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 -+8 8 8 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 -+11 11 11 11 11 11 11 11 11 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 -+17 17 17 13 13 13 10 10 10 11 11 11 13 13 13 10 10 10 11 11 11 16 16 16 -+31 31 31 51 51 51 56 56 56 34 34 34 17 17 17 21 21 21 27 27 27 23 23 23 -+42 42 42 59 59 59 56 56 56 45 45 45 37 37 37 29 29 29 32 32 32 29 29 29 -+43 43 43 69 69 69 60 60 60 49 49 49 62 62 62 51 51 51 36 36 36 56 56 56 -+58 58 58 80 80 80 83 83 83 66 66 66 61 61 61 75 75 75 76 76 76 61 61 61 -+68 68 68 96 97 98 101 101 101 76 76 76 72 72 72 96 96 96 101 101 101 82 82 82 -+87 87 87 103 103 102 112 112 113 101 101 101 92 92 92 96 97 98 109 110 110 115 116 115 -+101 101 101 115 116 115 127 127 127 121 121 119 103 103 102 101 101 101 115 116 115 129 129 130 -+125 125 127 128 128 128 137 137 137 137 137 137 137 137 137 133 133 133 122 121 126 129 129 130 -+129 129 130 142 143 144 152 153 154 147 147 148 137 137 137 134 134 134 145 146 147 157 157 157 -+147 147 148 152 153 154 157 157 157 160 161 160 157 157 157 152 153 154 149 149 149 149 149 149 -+157 157 157 166 167 167 169 175 167 166 167 167 166 167 167 163 163 163 161 161 162 158 159 161 -+152 153 154 149 149 149 144 145 144 139 139 139 131 131 131 121 121 119 109 110 110 103 103 102 -+92 92 92 87 87 87 81 81 81 76 76 76 73 73 73 71 71 71 67 67 67 63 63 63 -+67 67 67 65 65 65 57 57 57 51 51 51 59 59 59 59 59 59 43 43 43 92 92 92 -+238 240 244 238 240 244 238 240 244 231 224 220 231 224 220 200 220 210 200 220 210 200 220 210 -+180 183 185 180 183 185 238 240 244 238 240 244 246 251 251 238 240 244 238 240 244 238 240 244 -+238 240 244 246 251 251 238 240 244 238 240 244 238 240 244 149 151 153 26 29 32 83 84 85 -+85 85 85 95 95 94 103 103 102 117 117 117 129 129 130 133 133 133 142 143 144 149 149 149 -+152 153 154 160 161 160 163 163 163 158 159 161 161 161 162 166 167 167 169 175 167 166 167 167 -+163 163 163 166 167 167 166 167 167 166 167 167 163 163 163 161 161 162 157 157 157 152 153 154 -+155 156 156 157 157 157 157 157 157 152 153 154 147 147 148 144 145 144 145 146 147 147 147 148 -+155 156 156 152 153 154 152 153 154 137 137 137 134 134 134 145 146 147 142 143 144 144 145 144 -+128 128 128 127 127 127 128 128 128 131 131 131 129 129 130 121 121 119 115 116 115 115 116 115 -+115 116 115 127 127 127 131 131 131 125 125 127 115 116 115 115 116 115 115 116 115 112 112 113 -+121 121 119 105 105 105 94 94 94 87 87 87 87 87 87 88 88 88 88 88 88 83 83 83 -+80 80 80 83 83 83 80 80 80 76 76 76 75 75 75 70 70 70 70 70 70 80 80 80 -+78 78 78 60 60 60 54 54 54 56 56 56 61 61 61 65 65 65 60 60 60 68 68 68 -+84 84 84 65 65 65 46 46 46 42 42 42 42 42 42 37 37 37 33 33 33 33 33 33 -+32 32 32 34 34 34 42 42 42 60 60 60 71 71 71 56 56 56 32 32 32 23 23 23 -+23 23 23 21 21 21 20 20 20 19 19 19 19 19 19 20 20 20 23 23 23 25 25 25 -+36 36 36 36 36 36 24 24 24 19 19 19 32 32 32 24 24 24 39 39 39 45 45 45 -+48 48 48 45 45 45 49 49 49 11 11 11 0 0 0 0 0 0 37 37 37 42 42 42 -+34 34 34 25 25 25 52 52 52 43 43 43 21 21 21 38 38 38 33 33 33 11 11 11 -+11 11 11 23 23 23 46 46 46 53 53 53 45 45 45 51 51 51 52 52 52 32 32 32 -+36 36 36 46 46 46 54 54 54 51 51 51 42 42 42 38 38 38 46 46 46 56 56 56 -+31 31 31 20 20 20 34 34 34 27 27 27 8 8 8 23 23 23 33 33 33 33 33 33 -+20 20 20 17 17 17 13 13 13 13 13 13 14 14 14 16 16 16 16 16 16 14 14 14 -+11 11 11 32 32 32 37 37 37 20 20 20 8 8 8 19 19 19 33 33 33 37 37 37 -+24 24 24 16 16 16 10 10 10 11 11 11 10 10 10 10 10 10 16 16 16 24 24 24 -+49 49 49 44 44 44 54 54 54 52 52 52 27 27 27 19 19 19 27 27 27 20 20 20 -+14 14 14 24 24 24 36 36 36 40 40 40 44 44 44 48 48 48 52 52 52 54 54 54 -+53 53 53 53 53 53 40 40 40 21 21 21 20 20 20 31 31 31 24 24 24 4 4 4 -+10 10 10 11 11 11 40 40 40 23 23 23 6 6 6 36 36 36 42 42 42 45 45 45 -+42 42 42 45 45 45 48 48 48 43 43 43 28 28 28 11 11 11 10 10 10 17 17 17 -+8 8 8 19 19 19 28 28 28 29 29 29 21 21 21 11 11 11 10 10 10 11 11 11 -+ -+0 0 0 3 3 3 17 17 17 28 28 28 28 28 28 21 21 21 17 17 17 17 17 17 -+21 21 21 14 14 14 16 16 16 31 31 31 38 38 38 32 32 32 21 21 21 14 14 14 -+17 17 17 16 16 16 19 19 19 23 23 23 20 20 20 16 16 16 16 16 16 23 23 23 -+20 20 20 14 14 14 6 6 6 3 3 3 4 4 4 6 6 6 6 6 6 6 6 6 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+8 8 8 4 4 4 3 3 3 0 0 0 4 4 4 11 11 11 17 17 17 21 21 21 -+21 21 21 19 19 19 14 14 14 10 10 10 6 6 6 3 3 3 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 6 6 11 11 11 14 14 14 -+16 16 16 17 17 17 21 21 21 23 23 23 21 21 21 17 17 17 13 13 13 8 8 8 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 6 6 6 6 6 6 -+16 16 16 11 11 11 8 8 8 10 10 10 10 10 10 8 8 8 8 8 8 10 10 10 -+16 16 16 44 44 44 53 53 53 36 36 36 16 16 16 19 19 19 24 24 24 21 21 21 -+14 14 14 52 52 52 61 61 61 51 51 51 37 37 37 27 27 27 29 29 29 27 27 27 -+27 27 27 50 50 50 68 68 68 72 72 72 61 61 61 40 40 40 34 34 34 44 44 44 -+42 42 42 60 60 60 78 78 78 85 85 85 77 77 77 67 67 67 59 59 59 57 57 57 -+54 54 54 78 78 78 95 95 94 93 93 93 91 91 91 93 93 93 87 87 87 73 73 73 -+75 75 75 92 92 92 105 105 105 109 110 110 109 110 110 109 110 110 105 105 105 96 97 98 -+94 94 94 109 110 110 125 125 127 129 129 130 121 121 119 115 116 115 117 117 117 127 127 127 -+115 116 115 117 117 117 133 133 133 144 145 144 144 145 144 131 131 131 121 121 119 133 133 133 -+137 137 137 139 139 139 144 145 144 149 151 153 152 153 154 149 151 153 149 149 149 149 149 149 -+142 143 144 144 145 144 155 156 156 163 163 163 163 163 163 155 156 156 152 153 154 155 156 156 -+158 159 161 166 167 167 169 175 167 169 175 167 166 167 167 166 167 167 161 161 162 155 156 156 -+152 153 154 147 147 148 142 143 144 140 140 140 137 137 137 128 128 128 117 117 117 105 105 105 -+99 99 99 94 94 94 89 89 89 85 85 85 83 83 83 80 80 80 75 75 75 71 71 71 -+70 70 70 70 70 70 67 67 67 61 61 61 60 60 60 70 70 70 56 56 56 51 51 51 -+139 140 142 252 251 251 238 240 244 238 240 244 238 240 244 255 255 255 238 240 244 246 251 251 -+200 220 210 231 224 220 231 246 232 252 251 251 231 246 232 255 255 255 231 246 232 238 240 244 -+238 240 244 246 251 251 238 240 244 238 240 244 246 251 251 238 240 244 96 98 100 75 78 80 -+87 87 87 99 99 99 105 105 105 121 121 119 133 133 133 139 139 139 149 151 153 155 156 156 -+157 157 157 161 161 162 166 167 167 163 163 163 161 161 162 163 163 163 166 167 167 169 175 167 -+166 167 167 166 167 167 166 167 167 158 159 161 161 161 162 166 167 167 163 163 163 152 153 154 -+152 153 154 152 153 154 155 156 156 157 157 157 152 153 154 145 146 147 142 143 144 142 143 144 -+155 156 156 149 149 149 149 149 149 137 137 137 133 133 133 140 140 140 137 138 139 144 145 144 -+131 131 131 127 127 127 122 121 126 125 125 127 128 128 128 127 127 127 121 121 119 115 116 115 -+109 110 110 115 116 115 128 128 128 133 133 133 121 121 119 112 112 113 115 116 115 109 110 110 -+115 116 115 109 110 110 96 97 98 90 90 90 90 90 90 89 89 89 85 85 85 84 84 84 -+77 77 77 78 78 78 78 78 78 76 76 76 74 74 74 70 70 70 75 75 75 88 88 88 -+84 84 84 62 62 62 56 56 56 61 61 61 67 67 67 61 61 61 51 51 51 56 56 56 -+85 85 85 67 67 67 49 49 49 42 42 42 40 40 40 36 36 36 33 33 33 33 33 33 -+32 32 32 40 40 40 46 46 46 54 54 54 61 61 61 54 54 54 32 32 32 14 14 14 -+23 23 23 24 24 24 23 23 23 17 17 17 14 14 14 20 20 20 28 28 28 34 34 34 -+45 45 45 31 31 31 19 19 19 13 13 13 17 17 17 25 25 25 39 39 39 23 23 23 -+37 37 37 38 38 38 42 42 42 8 8 8 6 6 6 13 13 13 42 42 42 40 40 40 -+24 24 24 11 11 11 42 42 42 44 44 44 29 29 29 39 39 39 43 43 43 39 39 39 -+46 46 46 37 37 37 34 34 34 36 36 36 37 37 37 39 39 39 32 32 32 13 13 13 -+11 11 11 27 27 27 38 38 38 32 32 32 16 16 16 8 8 8 20 20 20 34 34 34 -+28 28 28 14 14 14 14 14 14 14 14 14 23 23 23 38 38 38 33 33 33 20 20 20 -+10 10 10 8 8 8 10 10 10 13 13 13 14 14 14 14 14 14 13 13 13 13 13 13 -+14 14 14 28 28 28 28 28 28 11 11 11 13 13 13 32 32 32 38 38 38 29 29 29 -+10 10 10 11 11 11 13 13 13 10 10 10 8 8 8 11 11 11 23 23 23 31 31 31 -+37 37 37 25 25 25 25 25 25 29 29 29 21 21 21 16 16 16 17 17 17 17 17 17 -+16 16 16 29 29 29 34 34 34 28 28 28 20 20 20 23 23 23 27 27 27 28 28 28 -+24 24 24 19 19 19 19 19 19 27 27 27 33 33 33 29 29 29 17 17 17 6 6 6 -+8 8 8 4 4 4 21 21 21 11 11 11 0 0 0 17 17 17 28 28 28 32 32 32 -+17 17 17 19 19 19 20 20 20 17 17 17 10 10 10 3 3 3 8 8 8 16 16 16 -+14 14 14 28 28 28 32 32 32 20 20 20 8 8 8 10 10 10 13 13 13 11 11 11 -+ -+0 0 0 0 0 0 0 0 0 6 6 6 27 27 27 31 31 31 23 23 23 13 13 13 -+19 19 19 19 19 19 17 17 17 16 16 16 25 25 25 34 34 34 32 32 32 21 21 21 -+21 21 21 16 16 16 17 17 17 21 21 21 21 21 21 16 16 16 16 16 16 21 21 21 -+17 17 17 10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 11 11 11 16 16 16 -+21 21 21 20 20 20 17 17 17 14 14 14 11 11 11 8 8 8 4 4 4 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 6 6 6 13 13 13 17 17 17 20 20 20 -+19 19 19 20 20 20 21 21 21 20 20 20 16 16 16 10 10 10 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+6 6 6 6 6 6 6 6 6 6 6 6 8 8 8 8 8 8 8 8 8 8 8 8 -+8 8 8 8 8 8 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 -+10 10 10 11 11 11 13 13 13 14 14 14 13 13 13 11 11 11 13 13 13 16 16 16 -+39 39 39 32 32 32 37 37 37 49 49 49 43 43 43 21 21 21 14 14 14 27 27 27 -+31 31 31 49 49 49 52 52 52 56 56 56 50 50 50 32 32 32 31 31 31 34 34 34 -+34 34 34 43 43 43 66 66 66 75 75 75 63 63 63 52 52 52 49 49 49 44 44 44 -+51 51 51 48 48 48 65 65 65 89 89 89 88 88 88 65 65 65 53 53 53 62 62 62 -+66 66 66 58 58 58 73 73 73 101 101 101 105 105 105 84 84 84 71 71 71 78 78 78 -+84 84 84 83 83 83 90 90 90 105 105 105 115 116 115 112 112 113 99 99 99 89 89 89 -+99 99 99 99 99 99 105 105 105 121 121 119 128 128 128 127 127 127 117 117 117 112 112 113 -+115 116 115 117 117 117 127 127 127 137 137 137 142 143 144 134 134 134 128 128 128 134 134 134 -+140 140 140 133 133 133 131 131 131 142 143 144 152 153 154 152 153 154 144 145 144 137 137 137 -+144 145 144 144 145 144 152 153 154 158 159 161 158 159 161 155 156 156 157 157 157 163 163 163 -+158 159 161 166 165 167 166 167 167 166 167 167 166 167 167 166 165 167 158 159 161 152 153 154 -+155 156 156 149 151 153 145 146 147 144 145 144 142 143 144 134 134 134 125 125 127 117 117 117 -+109 110 110 105 104 105 99 99 99 95 95 94 92 92 92 89 89 89 84 84 84 80 80 80 -+75 75 75 73 73 73 73 73 73 71 71 71 59 59 59 59 59 59 65 65 65 62 62 62 -+56 57 59 180 183 185 238 240 244 246 251 251 238 240 244 238 240 244 238 240 244 238 240 244 -+180 183 185 187 210 182 200 220 210 246 251 251 238 240 244 238 240 244 246 251 251 246 251 251 -+246 251 251 238 240 244 238 240 244 238 240 244 246 251 251 252 251 251 180 183 185 78 79 82 -+90 90 90 105 105 105 112 112 113 121 121 119 137 137 137 144 145 144 152 153 154 155 156 156 -+158 159 161 163 163 163 166 167 167 166 167 167 166 167 167 163 163 163 166 167 167 166 167 167 -+166 167 167 166 167 167 163 163 163 157 157 157 160 161 160 166 167 167 163 163 163 155 156 156 -+152 153 154 149 151 153 152 153 154 157 157 157 155 156 156 147 147 148 142 143 144 142 143 144 -+144 145 144 142 143 144 145 146 147 140 140 140 134 134 134 134 134 134 129 129 130 134 134 134 -+133 133 133 128 128 128 122 121 126 121 121 119 125 125 127 127 127 127 122 121 126 117 117 117 -+112 112 113 109 110 110 112 112 113 115 116 115 109 110 110 105 105 105 105 105 105 109 110 110 -+103 103 102 105 104 105 96 96 96 91 91 91 94 94 94 90 90 90 85 85 85 87 87 87 -+88 88 88 84 84 84 77 77 77 74 74 74 74 74 74 72 72 72 71 71 71 72 72 72 -+72 72 72 65 65 65 63 63 63 67 67 67 65 65 65 57 57 57 52 52 52 57 57 57 -+54 54 54 50 50 50 48 48 48 50 50 50 50 50 50 45 45 45 42 42 42 42 42 42 -+51 51 51 49 49 49 40 40 40 33 33 33 37 37 37 40 40 40 37 37 37 29 29 29 -+32 32 32 33 33 33 31 31 31 27 27 27 27 27 27 33 33 33 40 40 40 44 44 44 -+32 32 32 21 21 21 23 23 23 24 24 24 17 17 17 21 21 21 27 27 27 8 8 8 -+19 19 19 17 17 17 23 23 23 11 11 11 28 28 28 31 31 31 36 36 36 20 20 20 -+8 8 8 6 6 6 19 19 19 16 16 16 16 16 16 14 14 14 6 6 6 20 20 20 -+19 19 19 10 10 10 8 8 8 20 20 20 33 33 33 32 32 32 20 20 20 11 11 11 -+10 10 10 13 13 13 14 14 14 11 11 11 6 6 6 4 4 4 8 8 8 11 11 11 -+19 19 19 11 11 11 10 10 10 20 20 20 33 33 33 33 33 33 20 20 20 10 10 10 -+10 10 10 10 10 10 11 11 11 14 14 14 14 14 14 10 10 10 10 10 10 11 11 11 -+14 14 14 16 16 16 14 14 14 19 19 19 31 31 31 38 38 38 28 28 28 10 10 10 -+11 11 11 16 16 16 17 17 17 11 11 11 11 11 11 21 21 21 29 29 29 33 33 33 -+24 24 24 16 16 16 8 8 8 10 10 10 14 14 14 13 13 13 13 13 13 16 16 16 -+37 37 37 34 34 34 27 27 27 14 14 14 10 10 10 13 13 13 13 13 13 10 10 10 -+14 14 14 16 16 16 27 27 27 38 38 38 34 34 34 20 20 20 11 11 11 14 14 14 -+14 14 14 14 14 14 16 16 16 16 16 16 14 14 14 25 25 25 34 34 34 27 27 27 -+13 13 13 8 8 8 6 6 6 8 8 8 13 13 13 16 16 16 14 14 14 13 13 13 -+28 28 28 29 29 29 20 20 20 6 6 6 4 4 4 16 16 16 17 17 17 10 10 10 -+ -+8 8 8 4 4 4 0 0 0 10 10 10 24 24 24 33 33 33 31 31 31 23 23 23 -+14 14 14 21 21 21 20 20 20 14 14 14 16 16 16 25 25 25 33 33 33 33 33 33 -+28 28 28 19 19 19 14 14 14 17 17 17 20 20 20 19 19 19 17 17 17 17 17 17 -+11 11 11 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 -+16 16 16 17 17 17 19 19 19 20 20 20 20 20 20 19 19 19 16 16 16 14 14 14 -+3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+14 14 14 14 14 14 14 14 14 16 16 16 17 17 17 17 17 17 19 19 19 19 19 19 -+23 23 23 20 20 20 16 16 16 11 11 11 6 6 6 3 3 3 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 8 8 8 8 8 8 8 8 -+3 3 3 10 10 10 13 13 13 11 11 11 8 8 8 11 11 11 21 21 21 29 29 29 -+37 37 37 13 13 13 13 13 13 42 42 42 49 49 49 28 28 28 17 17 17 28 28 28 -+40 40 40 39 39 39 32 32 32 42 42 42 46 46 46 33 33 33 34 34 34 42 42 42 -+37 37 37 54 54 54 49 49 49 45 45 45 60 60 60 57 57 57 44 44 44 52 52 52 -+56 56 56 58 58 58 62 62 62 67 67 67 71 71 71 70 70 70 67 67 67 63 63 63 -+70 70 70 65 65 65 70 70 70 84 84 84 89 89 89 82 82 82 78 78 78 83 83 83 -+87 87 87 84 84 84 87 87 87 96 97 98 101 101 101 99 99 99 96 97 98 101 101 101 -+103 103 102 99 99 99 101 101 101 112 112 113 117 117 117 117 117 117 115 116 115 117 117 117 -+117 117 117 125 125 127 125 125 127 127 127 127 129 129 130 131 131 131 129 129 130 129 129 130 -+137 137 137 133 133 133 133 133 133 137 138 139 142 143 144 140 140 140 142 143 144 144 145 144 -+147 147 148 149 149 149 152 153 154 152 153 154 152 153 154 152 153 154 155 156 156 158 159 161 -+157 157 157 158 159 161 161 161 162 161 161 162 163 163 163 163 163 163 160 161 160 155 156 156 -+157 157 157 155 156 156 152 153 154 147 147 148 142 143 144 137 137 137 131 131 131 127 127 127 -+117 117 117 115 116 115 109 110 110 103 103 102 101 101 101 96 96 96 90 90 90 87 87 87 -+83 83 83 76 76 76 71 71 71 75 75 75 73 73 73 63 63 63 65 65 65 63 63 63 -+51 52 54 90 91 93 231 224 220 238 240 244 246 251 251 238 240 244 255 255 255 238 240 244 -+246 251 251 238 240 244 187 210 182 238 240 244 238 240 244 238 240 244 246 251 251 238 240 244 -+238 240 244 238 240 244 246 251 251 238 240 244 238 240 244 238 240 244 238 240 244 137 138 139 -+94 94 94 112 112 113 122 121 126 128 128 128 142 143 144 149 149 149 149 151 153 158 159 161 -+166 165 167 166 167 167 166 167 167 166 167 167 166 167 167 166 167 167 166 165 167 166 167 167 -+166 167 167 166 165 167 161 161 162 160 161 160 160 161 160 160 161 160 158 159 161 157 157 157 -+157 157 157 152 153 154 149 151 153 152 153 154 152 153 154 147 147 148 147 147 148 149 149 149 -+144 145 144 142 143 144 144 145 144 140 140 140 137 138 139 134 134 134 131 131 131 134 134 134 -+131 131 131 129 129 130 127 127 127 125 122 126 122 121 126 121 121 119 121 121 119 121 121 119 -+121 121 119 117 117 117 109 110 110 109 110 110 112 112 113 105 105 105 101 101 101 101 101 101 -+96 96 96 101 101 101 95 95 94 92 92 92 94 94 94 90 90 90 85 85 85 88 88 88 -+84 84 84 82 82 82 77 77 77 74 74 74 74 74 74 77 77 77 73 73 73 65 65 65 -+62 62 62 68 68 68 69 69 69 67 67 67 61 61 61 57 57 57 58 58 58 59 59 59 -+49 49 49 49 49 49 50 50 50 49 49 49 45 45 45 42 42 42 45 45 45 51 51 51 -+53 53 53 44 44 44 37 37 37 34 34 34 34 34 34 36 36 36 36 36 36 34 34 34 -+31 31 31 31 31 31 28 28 28 25 25 25 28 28 28 34 34 34 36 36 36 32 32 32 -+19 19 19 16 16 16 20 20 20 25 25 25 21 21 21 20 20 20 19 19 19 20 20 20 -+24 24 24 14 14 14 17 17 17 20 20 20 38 38 38 33 33 33 23 23 23 6 6 6 -+19 19 19 20 20 20 19 19 19 13 13 13 17 17 17 17 17 17 8 8 8 14 14 14 -+11 11 11 13 13 13 19 19 19 29 29 29 34 34 34 21 21 21 6 6 6 8 8 8 -+21 21 21 13 13 13 6 6 6 8 8 8 17 17 17 21 21 21 17 17 17 10 10 10 -+10 10 10 13 13 13 16 16 16 28 28 28 31 31 31 16 16 16 10 10 10 17 17 17 -+14 14 14 13 13 13 13 13 13 16 16 16 13 13 13 8 8 8 11 11 11 19 19 19 -+17 17 17 10 10 10 16 16 16 34 34 34 40 40 40 28 28 28 11 11 11 4 4 4 -+14 14 14 17 17 17 14 14 14 11 11 11 19 19 19 31 31 31 36 36 36 33 33 33 -+13 13 13 17 17 17 14 14 14 6 6 6 11 11 11 17 17 17 19 19 19 21 21 21 -+34 34 34 23 23 23 11 11 11 10 10 10 13 13 13 14 14 14 13 13 13 14 14 14 -+16 16 16 21 21 21 31 31 31 32 32 32 23 23 23 8 8 8 6 6 6 14 14 14 -+14 14 14 17 17 17 13 13 13 17 17 17 24 24 24 32 32 32 31 31 31 6 6 6 -+11 11 11 17 17 17 20 20 20 17 17 17 13 13 13 13 13 13 20 20 20 25 25 25 -+31 31 31 21 21 21 8 8 8 4 4 4 13 13 13 19 19 19 16 16 16 10 10 10 -+ -+0 0 0 8 8 8 20 20 20 19 19 19 17 17 17 23 23 23 32 32 32 37 37 37 -+20 20 20 17 17 17 20 20 20 23 23 23 19 19 19 14 14 14 24 24 24 37 37 37 -+32 32 32 24 24 24 17 17 17 14 14 14 19 19 19 21 21 21 17 17 17 13 13 13 -+4 4 4 3 3 3 0 0 0 0 0 0 3 3 3 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+6 6 6 10 10 10 14 14 14 17 17 17 20 20 20 20 20 20 20 20 20 20 20 20 -+23 23 23 23 23 23 21 21 21 21 21 21 20 20 20 19 19 19 17 17 17 17 17 17 -+16 16 16 17 17 17 20 20 20 21 21 21 21 21 21 20 20 20 19 19 19 17 17 17 -+17 17 17 13 13 13 8 8 8 3 3 3 0 0 0 0 0 0 3 3 3 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 6 6 6 -+8 8 8 13 13 13 13 13 13 10 10 10 10 10 10 19 19 19 31 31 31 38 38 38 -+11 11 11 10 10 10 14 14 14 27 27 27 36 36 36 38 38 38 34 34 34 31 31 31 -+27 27 27 34 34 34 28 28 28 34 34 34 42 42 42 38 38 38 40 40 40 40 40 40 -+39 39 39 48 48 48 48 48 48 44 44 44 49 49 49 51 51 51 48 48 48 48 48 48 -+50 50 50 59 59 59 62 62 62 59 59 59 60 60 60 67 67 67 68 68 68 63 63 63 -+65 65 65 72 72 72 77 77 77 76 76 76 76 76 76 81 81 81 83 83 83 82 82 82 -+82 82 82 87 87 87 90 90 90 91 91 91 93 93 93 99 99 99 101 101 101 101 101 101 -+101 101 101 103 103 102 109 110 110 112 112 113 112 112 113 112 112 113 115 116 115 117 117 117 -+112 112 113 127 127 127 125 122 126 121 121 119 125 122 126 127 127 127 129 129 130 129 129 130 -+131 131 131 134 134 134 139 139 139 142 143 144 142 143 144 142 143 144 144 145 144 147 147 148 -+145 146 147 147 147 148 149 149 149 149 149 149 149 149 149 152 153 154 152 153 154 152 153 154 -+155 156 156 157 157 157 157 157 157 157 157 157 158 159 161 163 163 163 163 163 163 161 161 162 -+158 159 161 157 157 157 155 156 156 149 149 149 144 145 144 140 140 140 137 137 137 134 134 134 -+128 128 128 125 122 126 117 117 117 112 112 113 109 110 110 105 105 105 101 101 101 96 96 96 -+91 91 91 90 90 90 83 83 83 78 78 78 87 87 87 80 80 80 73 73 73 67 67 67 -+69 70 72 58 59 61 152 153 154 238 240 244 238 240 244 238 240 244 238 240 244 238 240 244 -+238 240 244 238 240 244 158 159 161 180 183 185 200 220 210 246 251 251 238 240 244 238 240 244 -+238 240 244 246 251 251 238 240 244 238 240 244 238 240 244 238 240 244 246 251 251 200 220 210 -+109 110 110 105 105 105 125 125 127 134 134 134 144 145 144 152 153 154 152 153 154 166 165 167 -+166 167 167 166 167 167 166 167 167 166 167 167 166 167 167 166 167 167 166 167 167 166 167 167 -+166 165 167 161 161 162 161 161 162 163 163 163 161 161 162 157 157 157 155 156 156 158 159 161 -+157 157 157 155 156 156 152 153 154 149 151 153 149 149 149 147 147 148 149 149 149 152 153 154 -+145 146 147 142 143 144 140 140 140 140 140 140 142 143 144 140 140 140 134 134 134 133 133 133 -+129 129 130 129 129 130 129 129 130 128 128 128 125 125 127 121 121 119 117 117 117 117 117 117 -+115 116 115 117 117 117 105 105 105 101 101 101 109 110 110 109 110 110 101 101 101 96 97 98 -+96 96 96 99 99 99 96 96 96 93 93 93 92 92 92 89 89 89 85 85 85 87 87 87 -+76 76 76 78 78 78 82 82 82 81 81 81 75 75 75 74 74 74 73 73 73 67 67 67 -+73 73 73 77 77 77 70 70 70 63 63 63 59 59 59 56 56 56 57 57 57 50 50 50 -+54 54 54 54 54 54 53 53 53 49 49 49 44 44 44 44 44 44 51 51 51 58 58 58 -+44 44 44 36 36 36 36 36 36 40 40 40 38 38 38 33 33 33 31 31 31 29 29 29 -+36 36 36 39 39 39 38 38 38 36 36 36 39 39 39 44 44 44 39 39 39 29 29 29 -+37 37 37 31 31 31 24 24 24 21 21 21 17 17 17 21 21 21 14 14 14 27 27 27 -+39 39 39 34 34 34 33 33 33 37 37 37 45 45 45 38 38 38 34 34 34 36 36 36 -+32 32 32 23 23 23 29 29 29 29 29 29 24 24 24 32 32 32 37 37 37 25 25 25 -+33 33 33 33 33 33 36 36 36 39 39 39 37 37 37 28 28 28 29 29 29 39 39 39 -+36 36 36 29 29 29 25 25 25 27 27 27 32 32 32 36 36 36 33 33 33 31 31 31 -+32 32 32 33 33 33 31 31 31 33 33 33 23 23 23 4 4 4 16 16 16 29 29 29 -+14 14 14 11 11 11 13 13 13 16 16 16 14 14 14 11 11 11 20 20 20 32 32 32 -+24 24 24 20 20 20 28 28 28 40 40 40 34 34 34 13 13 13 6 6 6 19 19 19 -+11 11 11 11 11 11 11 11 11 16 16 16 28 28 28 39 39 39 40 40 40 34 34 34 -+34 34 34 44 44 44 46 46 46 39 39 39 36 36 36 39 39 39 43 43 43 44 44 44 -+43 43 43 37 37 37 37 37 37 42 42 42 42 42 42 38 38 38 38 38 38 43 43 43 -+36 36 36 39 39 39 40 40 40 39 39 39 37 37 37 37 37 37 39 39 39 42 42 42 -+36 36 36 39 39 39 37 37 37 38 38 38 43 43 43 45 45 45 34 34 34 10 10 10 -+4 4 4 10 10 10 13 13 13 8 8 8 6 6 6 14 14 14 24 24 24 31 31 31 -+19 19 19 11 11 11 10 10 10 16 16 16 19 19 19 14 14 14 11 11 11 11 11 11 -+ -+3 3 3 10 10 10 17 17 17 19 19 19 16 16 16 16 16 16 25 25 25 36 36 36 -+31 31 31 23 23 23 19 19 19 20 20 20 19 19 19 14 14 14 19 19 19 27 27 27 -+29 29 29 29 29 29 25 25 25 17 17 17 17 17 17 20 20 20 17 17 17 10 10 10 -+0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 6 6 6 10 10 10 13 13 13 16 16 16 19 19 19 20 20 20 -+20 20 20 20 20 20 20 20 20 19 19 19 19 19 19 17 17 17 17 17 17 17 17 17 -+14 14 14 16 16 16 17 17 17 19 19 19 19 19 19 17 17 17 14 14 14 13 13 13 -+8 8 8 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 6 6 6 -+3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 6 6 6 6 6 6 -+6 6 6 6 6 6 6 6 6 6 6 6 8 8 8 8 8 8 8 8 8 8 8 8 -+6 6 6 8 8 8 8 8 8 8 8 8 16 16 16 25 25 25 27 27 27 23 23 23 -+16 16 16 24 24 24 29 29 29 27 27 27 27 27 27 32 32 32 33 33 33 29 29 29 -+28 28 28 40 40 40 36 36 36 36 36 36 39 39 39 38 38 38 42 42 42 38 38 38 -+46 46 46 36 36 36 48 48 48 56 56 56 42 42 42 46 46 46 59 59 59 52 52 52 -+56 56 56 52 52 52 56 56 56 63 63 63 63 63 63 58 58 58 62 62 62 71 71 71 -+73 73 73 70 70 70 73 73 73 78 78 78 78 78 78 75 75 75 78 78 78 87 87 87 -+89 89 89 89 89 89 89 89 89 90 90 90 94 94 94 99 99 99 99 99 99 96 97 98 -+103 103 102 105 105 105 109 110 110 105 105 105 105 105 105 109 110 110 112 112 113 115 116 115 -+121 121 119 125 122 126 117 117 117 125 122 126 129 129 130 127 127 127 129 129 130 134 134 134 -+134 134 134 134 134 134 134 134 134 137 137 137 140 140 140 144 145 144 142 143 144 140 140 140 -+149 149 149 145 146 147 147 147 148 152 153 154 155 156 156 152 153 154 152 153 154 155 156 156 -+158 159 161 161 161 162 161 161 162 157 157 157 157 157 157 161 161 162 163 163 163 161 161 162 -+166 165 167 161 161 162 157 157 157 155 156 156 155 156 156 149 151 153 144 145 144 140 140 140 -+140 140 140 134 134 134 128 128 128 125 125 127 121 121 119 121 121 119 115 116 115 112 112 113 -+105 105 105 105 105 105 101 101 101 83 83 83 87 87 87 80 80 80 73 73 73 69 69 69 -+58 59 61 69 70 72 60 61 64 200 220 210 238 240 244 246 251 251 238 240 244 238 240 244 -+238 240 244 255 255 255 231 246 232 200 220 210 238 240 244 246 251 251 246 251 251 238 240 244 -+238 240 244 246 251 251 238 240 244 238 240 244 246 251 251 246 251 251 238 240 244 246 251 251 -+166 167 167 109 110 110 121 121 119 140 140 140 144 145 144 158 159 161 157 157 157 166 167 167 -+166 167 167 166 167 167 166 167 167 166 167 167 166 167 167 166 167 167 166 167 167 166 167 167 -+163 163 163 158 159 161 160 161 160 166 167 167 166 167 167 158 159 161 155 156 156 155 156 156 -+155 156 156 157 157 157 157 157 157 152 153 154 147 147 148 145 146 147 147 147 148 149 149 149 -+147 147 148 142 143 144 137 138 139 140 140 140 145 146 147 147 147 148 139 139 139 128 128 128 -+128 128 128 127 127 127 128 128 128 133 133 133 129 129 130 121 121 119 115 116 115 115 116 115 -+128 128 128 129 129 130 121 121 119 105 105 105 109 110 110 125 122 126 128 128 128 121 121 119 -+99 99 99 96 97 98 96 96 96 95 95 94 91 91 91 89 89 89 88 88 88 85 85 85 -+83 83 83 80 80 80 88 88 88 91 91 91 78 78 78 66 66 66 66 66 66 68 68 68 -+81 81 81 80 80 80 66 66 66 62 62 62 58 58 58 54 54 54 58 58 58 52 52 52 -+48 48 48 50 50 50 54 54 54 58 58 58 61 61 61 63 63 63 63 63 63 62 62 62 -+60 60 60 49 49 49 45 45 45 43 43 43 34 34 34 33 33 33 36 36 36 34 34 34 -+43 43 43 51 51 51 56 56 56 54 54 54 57 57 57 61 61 61 58 58 58 49 49 49 -+53 53 53 49 49 49 43 43 43 32 32 32 14 14 14 23 23 23 13 13 13 20 20 20 -+37 37 37 45 45 45 49 49 49 49 49 49 51 51 51 46 46 46 48 48 48 57 57 57 -+56 56 56 50 50 50 52 52 52 54 54 54 45 45 45 46 46 46 51 51 51 45 45 45 -+44 44 44 42 42 42 46 46 46 51 51 51 48 48 48 43 43 43 44 44 44 48 48 48 -+50 50 50 51 51 51 50 50 50 49 49 49 48 48 48 48 48 48 51 51 51 53 53 53 -+48 48 48 46 46 46 33 33 33 25 25 25 14 14 14 11 11 11 27 27 27 25 25 25 -+13 13 13 10 10 10 11 11 11 16 16 16 14 14 14 13 13 13 24 24 24 38 38 38 -+29 29 29 33 33 33 34 34 34 29 29 29 17 17 17 10 10 10 13 13 13 19 19 19 -+8 8 8 11 11 11 17 17 17 28 28 28 39 39 39 45 45 45 43 43 43 37 37 37 -+44 44 44 49 49 49 53 53 53 50 50 50 39 39 39 34 34 34 36 36 36 36 36 36 -+39 39 39 40 40 40 43 43 43 44 44 44 42 42 42 39 39 39 39 39 39 42 42 42 -+43 43 43 42 42 42 39 39 39 37 37 37 38 38 38 40 40 40 42 42 42 39 39 39 -+38 38 38 39 39 39 42 42 42 40 40 40 38 38 38 32 32 32 19 19 19 10 10 10 -+19 19 19 16 16 16 10 10 10 10 10 10 19 19 19 27 27 27 25 25 25 19 19 19 -+10 10 10 10 10 10 13 13 13 17 17 17 16 16 16 11 11 11 10 10 10 13 13 13 -+ -+44 44 44 25 25 25 11 11 11 17 17 17 23 23 23 19 19 19 16 16 16 20 20 20 -+39 39 39 33 33 33 19 19 19 6 6 6 11 11 11 21 21 21 21 21 21 13 13 13 -+24 24 24 33 33 33 32 32 32 21 21 21 16 16 16 19 19 19 17 17 17 8 8 8 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+3 3 3 0 0 0 0 0 0 3 3 3 6 6 6 13 13 13 17 17 17 20 20 20 -+19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 20 20 20 20 20 20 20 20 20 -+21 21 21 21 21 21 20 20 20 17 17 17 14 14 14 10 10 10 4 4 4 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 6 6 6 -+6 6 6 6 6 6 6 6 6 6 6 6 8 8 8 8 8 8 8 8 8 8 8 8 -+8 8 8 10 10 10 11 11 11 20 20 20 32 32 32 36 36 36 24 24 24 4 4 4 -+21 21 21 17 17 17 23 23 23 32 32 32 31 31 31 23 23 23 28 28 28 40 40 40 -+33 33 33 36 36 36 23 23 23 24 24 24 33 33 33 37 37 37 51 51 51 60 60 60 -+50 50 50 45 45 45 34 34 34 36 36 36 44 44 44 44 44 44 53 53 53 76 76 76 -+69 69 69 58 58 58 51 51 51 53 53 53 57 57 57 58 58 58 68 68 68 81 81 81 -+90 90 90 72 72 72 62 62 62 69 69 69 74 74 74 73 73 73 81 81 81 94 94 94 -+105 105 105 94 94 94 88 88 88 89 89 89 89 89 89 87 87 87 95 95 94 109 110 110 -+121 121 119 121 121 119 115 116 115 105 104 105 103 103 102 112 112 113 125 125 127 133 133 133 -+140 140 140 128 128 128 112 112 113 128 128 128 137 138 139 127 127 127 128 128 128 133 133 133 -+149 151 153 147 147 148 139 139 139 131 131 131 133 133 133 142 143 144 149 149 149 149 149 149 -+161 161 162 152 153 154 149 149 149 157 157 157 157 157 157 149 151 153 149 149 149 155 156 156 -+166 167 167 166 167 167 166 167 167 161 161 162 157 157 157 158 159 161 160 161 160 158 159 161 -+169 175 167 166 167 167 161 161 162 161 161 162 166 165 167 161 161 162 152 153 154 144 145 144 -+149 149 149 144 145 144 139 139 139 134 134 134 133 133 133 133 133 133 129 129 130 128 128 128 -+115 116 115 109 110 110 112 112 113 92 92 92 95 95 94 89 89 89 82 82 82 78 78 78 -+76 76 76 63 65 67 16 20 21 71 72 74 246 251 251 238 240 244 246 251 251 246 251 251 -+238 240 244 238 240 244 231 224 220 180 183 185 180 183 185 238 240 244 238 240 244 246 251 251 -+238 240 244 238 240 244 246 251 251 238 240 244 238 240 244 238 240 244 246 251 251 238 240 244 -+238 240 244 131 131 131 127 127 127 147 147 148 147 147 148 166 167 167 163 163 163 166 165 167 -+161 161 162 166 167 167 166 167 167 166 167 167 166 167 167 166 167 167 169 175 167 169 175 167 -+163 163 163 158 159 161 160 161 160 166 167 167 166 167 167 163 163 163 157 157 157 152 153 154 -+149 151 153 157 157 157 161 161 162 155 156 156 147 147 148 144 145 144 144 145 144 144 145 144 -+157 157 157 147 147 148 137 137 137 137 137 137 147 147 148 152 153 154 147 147 148 134 134 134 -+128 128 128 125 122 126 127 127 127 134 134 134 134 134 134 125 122 126 115 116 115 112 112 113 -+109 110 110 121 121 119 127 127 127 115 116 115 109 110 110 121 121 119 121 121 119 101 101 101 -+101 101 101 95 95 94 96 96 96 96 96 96 90 90 90 91 91 91 93 93 93 87 87 87 -+76 76 76 68 68 68 78 78 78 95 95 94 87 87 87 72 72 72 74 74 74 85 85 85 -+73 73 73 70 70 70 58 58 58 61 61 61 60 60 60 56 56 56 68 68 68 71 71 71 -+77 77 77 67 67 67 54 54 54 50 50 50 54 54 54 63 63 63 69 69 69 69 69 69 -+69 69 69 67 67 67 70 70 70 68 68 68 57 57 57 49 49 49 40 40 40 27 27 27 -+23 23 23 38 38 38 49 49 49 50 50 50 51 51 51 57 57 57 57 57 57 52 52 52 -+51 51 51 54 54 54 60 60 60 46 46 46 17 17 17 28 28 28 19 19 19 14 14 14 -+21 21 21 42 42 42 51 51 51 50 50 50 50 50 50 48 48 48 44 44 44 48 48 48 -+42 42 42 50 50 50 45 45 45 46 46 46 50 50 50 40 40 40 40 40 40 56 56 56 -+50 50 50 42 42 42 44 44 44 50 50 50 49 49 49 48 48 48 49 49 49 44 44 44 -+50 50 50 52 52 52 53 53 53 50 50 50 45 45 45 45 45 45 50 50 50 54 54 54 -+40 40 40 36 36 36 16 16 16 4 4 4 4 4 4 20 20 20 33 33 33 14 14 14 -+14 14 14 10 10 10 13 13 13 17 17 17 14 14 14 11 11 11 23 23 23 38 38 38 -+31 31 31 39 39 39 32 32 32 11 11 11 4 4 4 17 17 17 17 17 17 4 4 4 -+11 11 11 17 17 17 28 28 28 42 42 42 49 49 49 49 49 49 44 44 44 39 39 39 -+39 39 39 38 38 38 49 49 49 56 56 56 46 46 46 39 39 39 43 43 43 44 44 44 -+36 36 36 39 39 39 39 39 39 34 34 34 34 34 34 40 40 40 43 43 43 39 39 39 -+42 42 42 40 40 40 39 39 39 40 40 40 40 40 40 40 40 40 42 42 42 43 43 43 -+40 40 40 37 37 37 45 45 45 44 44 44 36 36 36 23 23 23 8 8 8 20 20 20 -+10 10 10 11 11 11 13 13 13 16 16 16 25 25 25 31 31 31 24 24 24 13 13 13 -+13 13 13 13 13 13 11 11 11 10 10 10 10 10 10 11 11 11 13 13 13 13 13 13 -+ -+36 36 36 36 36 36 29 29 29 20 20 20 16 16 16 17 17 17 17 17 17 16 16 16 -+20 20 20 32 32 32 33 33 33 20 20 20 13 13 13 19 19 19 21 21 21 14 14 14 -+19 19 19 25 25 25 31 31 31 31 31 31 25 25 25 17 17 17 6 6 6 0 0 0 -+0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 4 4 4 3 3 3 0 0 0 0 0 0 3 3 3 4 4 4 -+0 0 0 4 4 4 8 8 8 10 10 10 11 11 11 8 8 8 6 6 6 4 4 4 -+4 4 4 4 4 4 4 4 4 8 8 8 8 8 8 8 8 8 6 6 6 6 6 6 -+10 10 10 3 3 3 14 14 14 34 34 34 34 34 34 17 17 17 10 10 10 19 19 19 -+27 27 27 23 23 23 19 19 19 32 32 32 46 46 46 38 38 38 21 21 21 23 23 23 -+57 57 57 43 43 43 24 24 24 23 23 23 40 40 40 52 52 52 46 46 46 33 33 33 -+73 73 73 48 48 48 42 42 42 34 34 34 36 36 36 56 56 56 73 73 73 59 59 59 -+88 88 88 68 68 68 59 59 59 51 51 51 49 49 49 54 54 54 66 66 66 90 90 90 -+96 96 96 88 88 88 72 72 72 68 68 68 73 73 73 70 70 70 73 73 73 90 90 90 -+105 105 105 112 112 113 93 93 93 80 80 80 89 89 89 92 92 92 89 89 89 99 99 99 -+115 116 115 127 127 127 121 121 119 99 99 99 105 105 105 128 128 128 125 122 126 115 116 115 -+129 129 130 137 137 137 140 140 140 134 134 134 127 127 127 121 121 119 127 127 127 134 134 134 -+144 145 144 149 149 149 147 147 148 140 140 140 137 138 139 144 145 144 145 146 147 142 143 144 -+144 145 144 161 161 162 163 163 163 149 149 149 144 145 144 147 147 148 152 153 154 161 161 162 -+163 163 163 169 175 167 166 167 167 160 161 160 158 159 161 157 157 157 161 161 162 158 159 161 -+163 163 163 166 167 167 166 167 167 166 167 167 169 175 167 161 161 162 155 156 156 152 153 154 -+152 153 154 152 153 154 155 156 156 149 149 149 142 143 144 144 145 144 142 143 144 131 131 131 -+125 125 127 127 127 127 121 121 119 115 116 115 103 103 102 94 94 94 94 94 94 87 87 87 -+71 72 74 60 61 64 8 10 13 8 10 13 147 147 148 238 240 244 238 240 244 238 240 244 -+238 240 244 238 240 244 238 240 244 238 240 244 200 220 210 238 240 244 238 240 244 246 251 251 -+238 240 244 246 251 251 238 240 244 246 251 251 238 240 244 238 240 244 238 240 244 238 240 244 -+238 240 244 187 210 182 134 134 134 142 143 144 155 156 156 158 159 161 169 175 167 161 161 162 -+166 167 167 166 167 167 166 167 167 163 163 163 163 163 163 169 175 167 169 175 167 161 161 162 -+158 159 161 160 161 160 158 159 161 158 159 161 163 163 163 166 167 167 161 161 162 155 156 156 -+149 151 153 149 151 153 155 156 156 158 159 161 157 157 157 147 147 148 142 143 144 142 143 144 -+139 139 139 155 156 156 149 149 149 134 134 134 137 138 139 147 147 148 145 146 147 144 145 144 -+137 137 137 129 129 130 121 121 119 121 121 119 128 128 128 133 133 133 127 127 127 115 116 115 -+109 110 110 109 110 110 121 121 119 125 125 127 117 117 117 115 116 115 109 110 110 101 101 101 -+99 99 99 96 97 98 96 97 98 95 95 94 91 91 91 90 90 90 96 97 98 105 105 105 -+84 84 84 78 78 78 76 76 76 85 85 85 96 96 96 99 99 99 87 87 87 75 75 75 -+66 66 66 65 65 65 61 61 61 62 62 62 70 70 70 80 80 80 82 82 82 77 77 77 -+61 61 61 53 53 53 54 54 54 63 63 63 61 61 61 51 51 51 56 56 56 70 70 70 -+68 68 68 66 66 66 63 63 63 65 65 65 66 66 66 65 65 65 60 60 60 56 56 56 -+32 32 32 42 42 42 44 44 44 40 40 40 45 45 45 57 57 57 59 59 59 52 52 52 -+52 52 52 58 58 58 50 50 50 51 51 51 42 42 42 14 14 14 13 13 13 25 25 25 -+36 36 36 40 40 40 46 46 46 49 49 49 50 50 50 50 50 50 49 49 49 48 48 48 -+50 50 50 49 49 49 46 46 46 42 42 42 38 38 38 39 39 39 43 43 43 46 46 46 -+40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 -+36 36 36 42 42 42 44 44 44 49 49 49 39 39 39 34 34 34 45 45 45 44 44 44 -+32 32 32 21 21 21 17 17 17 11 11 11 20 20 20 8 8 8 32 32 32 19 19 19 -+14 14 14 13 13 13 14 14 14 17 17 17 14 14 14 13 13 13 25 25 25 38 38 38 -+38 38 38 25 25 25 14 14 14 11 11 11 13 13 13 14 14 14 14 14 14 14 14 14 -+11 11 11 32 32 32 44 44 44 39 39 39 36 36 36 44 44 44 51 51 51 50 50 50 -+33 33 33 40 40 40 44 44 44 43 43 43 42 42 42 44 44 44 42 42 42 38 38 38 -+39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 -+39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 42 42 42 -+36 36 36 44 44 44 44 44 44 32 32 32 17 17 17 11 11 11 11 11 11 10 10 10 -+16 16 16 8 8 8 13 13 13 28 28 28 31 31 31 20 20 20 13 13 13 16 16 16 -+14 14 14 11 11 11 11 11 11 16 16 16 13 13 13 13 13 13 24 24 24 38 38 38 -+ -+21 21 21 34 34 34 37 37 37 24 24 24 14 14 14 17 17 17 21 21 21 20 20 20 -+16 16 16 19 19 19 27 27 27 33 33 33 28 28 28 17 17 17 16 16 16 23 23 23 -+16 16 16 14 14 14 21 21 21 33 33 33 32 32 32 14 14 14 0 0 0 0 0 0 -+3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 8 8 8 10 10 10 -+13 13 13 13 13 13 13 13 13 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 -+10 10 10 6 6 6 0 0 0 0 0 0 6 6 6 10 10 10 11 11 11 11 11 11 -+0 0 0 17 17 17 34 34 34 37 37 37 23 23 23 8 8 8 14 14 14 28 28 28 -+24 24 24 24 24 24 36 36 36 46 46 46 38 38 38 20 20 20 16 16 16 24 24 24 -+32 32 32 60 60 60 48 48 48 32 32 32 51 51 51 46 46 46 27 27 27 38 38 38 -+33 33 33 71 71 71 59 59 59 43 43 43 45 45 45 72 72 72 57 57 57 44 44 44 -+45 45 45 87 87 87 75 75 75 58 58 58 53 53 53 68 68 68 88 88 88 61 61 61 -+62 62 62 93 93 93 94 94 94 74 74 74 70 70 70 76 76 76 85 85 85 96 97 98 -+88 88 88 101 101 101 112 112 113 103 103 102 87 87 87 87 87 87 99 99 99 109 110 110 -+115 116 115 121 121 119 125 122 126 117 117 117 121 121 119 121 121 119 109 110 110 112 112 113 -+117 117 117 129 129 130 139 139 139 134 134 134 125 122 126 121 121 119 129 129 130 140 140 140 -+134 134 134 140 140 140 144 145 144 147 147 148 144 145 144 139 139 139 137 138 139 139 139 139 -+149 149 149 157 157 157 160 161 160 157 157 157 152 153 154 152 153 154 152 153 154 157 157 157 -+157 157 157 169 175 167 166 167 167 166 165 167 161 161 162 157 157 157 160 161 160 158 159 161 -+157 157 157 166 167 167 166 167 167 169 175 167 169 175 167 161 161 162 157 157 157 157 157 157 -+155 156 156 157 157 157 158 159 161 157 157 157 152 153 154 155 156 156 149 151 153 140 140 140 -+137 137 137 128 128 128 125 125 127 128 128 128 115 116 115 105 105 105 103 103 102 85 85 85 -+87 88 90 20 21 24 14 16 19 11 13 16 25 27 29 200 220 210 246 251 251 238 240 244 -+238 240 244 246 251 251 246 251 251 238 240 244 180 183 185 180 183 185 231 224 220 238 240 244 -+246 251 251 246 251 251 238 240 244 238 240 244 238 240 244 246 251 251 238 240 244 246 251 251 -+238 240 244 238 240 244 149 151 153 142 143 144 157 157 157 152 153 154 180 183 185 161 161 162 -+166 167 167 166 167 167 166 165 167 166 165 167 166 167 167 169 175 167 166 167 167 161 161 162 -+161 161 162 161 161 162 158 159 161 157 157 157 157 157 157 158 159 161 161 161 162 163 163 163 -+152 153 154 149 151 153 149 149 149 155 156 156 157 157 157 152 153 154 145 146 147 140 140 140 -+144 145 144 140 140 140 149 149 149 144 145 144 131 131 131 139 139 139 147 147 148 137 137 137 -+140 140 140 134 134 134 125 122 126 117 117 117 121 121 119 127 127 127 128 128 128 122 121 126 -+109 110 110 105 105 105 109 110 110 117 117 117 115 116 115 109 110 110 105 104 105 99 99 99 -+101 101 101 96 96 96 94 94 94 92 92 92 87 87 87 82 82 82 85 85 85 91 91 91 -+103 103 102 99 99 99 95 95 94 92 92 92 90 90 90 84 84 84 74 74 74 67 67 67 -+68 68 68 72 72 72 76 76 76 77 77 77 81 81 81 83 83 83 80 80 80 75 75 75 -+59 59 59 59 59 59 61 61 61 63 63 63 59 59 59 52 52 52 50 50 50 52 52 52 -+49 49 49 44 44 44 39 39 39 37 37 37 37 37 37 38 38 38 37 37 37 36 36 36 -+46 46 46 43 43 43 34 34 34 27 27 27 27 27 27 32 32 32 31 31 31 25 25 25 -+28 28 28 32 32 32 27 27 27 32 32 32 29 29 29 19 19 19 27 27 27 34 34 34 -+28 28 28 25 25 25 23 23 23 23 23 23 23 23 23 21 21 21 23 23 23 25 25 25 -+21 21 21 21 21 21 21 21 21 20 20 20 21 21 21 25 25 25 32 32 32 37 37 37 -+20 20 20 20 20 20 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 17 17 17 -+21 21 21 20 20 20 17 17 17 21 21 21 19 19 19 21 21 21 36 36 36 33 33 33 -+23 23 23 14 14 14 13 13 13 10 10 10 13 13 13 13 13 13 23 23 23 10 10 10 -+11 11 11 11 11 11 13 13 13 13 13 13 11 11 11 20 20 20 33 33 33 39 39 39 -+25 25 25 14 14 14 8 8 8 13 13 13 16 16 16 11 11 11 10 10 10 14 14 14 -+34 34 34 32 32 32 29 29 29 28 28 28 31 31 31 38 38 38 46 46 46 52 52 52 -+52 52 52 45 45 45 37 37 37 36 36 36 44 44 44 52 52 52 48 48 48 38 38 38 -+39 39 39 39 39 39 38 38 38 39 39 39 40 40 40 40 40 40 39 39 39 39 39 39 -+40 40 40 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 39 39 39 40 40 40 -+42 42 42 37 37 37 28 28 28 19 19 19 14 14 14 14 14 14 14 14 14 13 13 13 -+8 8 8 19 19 19 29 29 29 31 31 31 23 23 23 14 14 14 11 11 11 13 13 13 -+8 8 8 14 14 14 16 16 16 13 13 13 16 16 16 24 24 24 25 25 25 20 20 20 -+ -+14 14 14 27 27 27 36 36 36 34 34 34 27 27 27 20 20 20 17 17 17 17 17 17 -+11 11 11 11 11 11 21 21 21 36 36 36 38 38 38 27 27 27 17 17 17 19 19 19 -+14 14 14 13 13 13 17 17 17 25 25 25 27 27 27 17 17 17 4 4 4 0 0 0 -+0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 8 8 8 11 11 11 13 13 13 -+10 10 10 8 8 8 6 6 6 4 4 4 4 4 4 6 6 6 10 10 10 11 11 11 -+13 13 13 10 10 10 4 4 4 0 0 0 4 4 4 10 10 10 11 11 11 10 10 10 -+13 13 13 31 31 31 39 39 39 27 27 27 10 10 10 8 8 8 20 20 20 28 28 28 -+19 19 19 25 25 25 43 43 43 44 44 44 23 23 23 14 14 14 24 24 24 25 25 25 -+19 19 19 45 45 45 61 61 61 59 59 59 48 48 48 32 32 32 25 25 25 32 32 32 -+32 32 32 45 45 45 70 70 70 58 58 58 66 66 66 48 48 48 51 51 51 39 39 39 -+45 45 45 57 57 57 84 84 84 69 69 69 67 67 67 82 82 82 63 63 63 61 61 61 -+59 59 59 67 67 67 99 99 99 99 99 99 69 69 69 82 82 82 101 101 101 80 80 80 -+71 71 71 88 88 88 105 105 105 109 110 110 96 96 96 95 95 94 105 105 105 112 112 113 -+96 96 96 99 99 99 115 116 115 127 127 127 127 127 127 112 112 113 99 99 99 112 112 113 -+125 122 126 129 129 130 137 138 139 139 139 139 133 133 133 129 129 130 133 133 133 137 137 137 -+125 122 126 129 129 130 142 143 144 152 153 154 149 151 153 140 140 140 137 138 139 142 143 144 -+152 153 154 147 147 148 152 153 154 158 159 161 161 161 162 157 157 157 152 153 154 149 149 149 -+157 157 157 166 167 167 166 167 167 166 165 167 166 165 167 161 161 162 161 161 162 157 157 157 -+155 156 156 163 163 163 166 167 167 169 175 167 169 175 167 166 167 167 163 163 163 161 161 162 -+158 159 161 161 161 162 163 163 163 163 163 163 163 163 163 163 163 163 158 159 161 147 147 148 -+144 145 144 139 139 139 133 133 133 137 137 137 128 128 128 117 117 117 109 110 110 96 96 96 -+71 72 74 8 10 13 20 21 24 0 0 4 0 0 4 73 74 76 246 251 251 238 240 244 -+238 240 244 238 240 244 246 251 251 246 251 251 238 240 244 200 220 210 238 240 244 238 240 244 -+238 240 244 238 240 244 238 240 244 238 240 244 238 240 244 246 251 251 238 240 244 238 240 244 -+238 240 244 246 251 251 200 220 210 139 140 142 152 153 154 166 165 167 166 167 167 169 175 167 -+166 165 167 166 167 167 166 165 167 166 167 167 169 175 167 166 167 167 166 165 167 161 161 162 -+161 161 162 160 161 160 158 159 161 157 157 157 152 153 154 152 153 154 158 159 161 166 167 167 -+157 157 157 152 153 154 145 146 147 147 147 148 152 153 154 157 157 157 149 151 153 144 145 144 -+137 137 137 140 140 140 142 143 144 144 145 144 142 143 144 137 137 137 134 134 134 137 138 139 -+137 138 139 137 137 137 129 129 130 121 121 119 115 116 115 117 117 117 125 122 126 128 128 128 -+121 121 119 109 110 110 103 103 102 105 105 105 112 112 113 105 105 105 99 99 99 101 101 101 -+99 99 99 94 94 94 93 93 93 96 97 98 96 97 98 91 91 91 91 91 91 95 95 94 -+109 110 110 105 105 105 103 103 102 93 93 93 83 83 83 74 74 74 71 71 71 71 71 71 -+81 81 81 83 83 83 84 84 84 84 84 84 84 84 84 84 84 84 82 82 82 77 77 77 -+58 58 58 62 62 62 61 61 61 54 54 54 51 51 51 51 51 51 48 48 48 40 40 40 -+43 43 43 44 44 44 45 45 45 46 46 46 46 46 46 46 46 46 44 44 44 43 43 43 -+49 49 49 40 40 40 33 33 33 29 29 29 25 25 25 24 24 24 29 29 29 38 38 38 -+33 33 33 34 34 34 29 29 29 33 33 33 32 32 32 31 31 31 37 37 37 31 31 31 -+19 19 19 14 14 14 16 16 16 24 24 24 31 31 31 29 29 29 28 28 28 29 29 29 -+28 28 28 28 28 28 28 28 28 27 27 27 27 27 27 29 29 29 34 34 34 38 38 38 -+27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 25 25 25 25 25 25 25 25 25 -+31 31 31 28 28 28 24 24 24 31 31 31 32 32 32 33 33 33 40 40 40 31 31 31 -+16 16 16 11 11 11 10 10 10 11 11 11 10 10 10 24 24 24 16 16 16 6 6 6 -+14 14 14 10 10 10 10 10 10 10 10 10 17 17 17 33 33 33 38 38 38 28 28 28 -+14 14 14 8 8 8 10 10 10 14 14 14 13 13 13 8 8 8 14 14 14 28 28 28 -+43 43 43 31 31 31 23 23 23 24 24 24 25 25 25 20 20 20 24 24 24 34 34 34 -+51 51 51 49 49 49 43 43 43 39 39 39 40 40 40 46 46 46 49 49 49 49 49 49 -+42 42 42 39 39 39 38 38 38 38 38 38 40 40 40 42 42 42 40 40 40 39 39 39 -+42 42 42 42 42 42 39 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 -+43 43 43 28 28 28 13 13 13 8 8 8 14 14 14 16 16 16 13 13 13 10 10 10 -+13 13 13 29 29 29 34 34 34 23 23 23 11 11 11 11 11 11 13 13 13 10 10 10 -+8 8 8 13 13 13 14 14 14 14 14 14 21 21 21 28 28 28 24 24 24 13 13 13 -+ -+21 21 21 16 16 16 23 23 23 38 38 38 42 42 42 28 28 28 13 13 13 8 8 8 -+11 11 11 19 19 19 21 21 21 24 24 24 32 32 32 38 38 38 29 29 29 10 10 10 -+14 14 14 23 23 23 21 21 21 10 10 10 11 11 11 21 21 21 21 21 21 10 10 10 -+0 0 0 0 0 0 4 4 4 6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 6 6 6 11 11 11 11 11 11 10 10 10 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 -+11 11 11 14 14 14 14 14 14 10 10 10 6 6 6 8 8 8 10 10 10 8 8 8 -+37 37 37 33 33 33 21 21 21 6 6 6 6 6 6 20 20 20 25 25 25 20 20 20 -+25 25 25 32 32 32 33 33 33 21 21 21 11 11 11 23 23 23 29 29 29 19 19 19 -+23 23 23 27 27 27 51 51 51 65 65 65 49 49 49 31 31 31 29 29 29 29 29 29 -+38 38 38 34 34 34 44 44 44 87 87 87 61 61 61 51 51 51 33 33 33 48 48 48 -+53 53 53 45 45 45 52 52 52 87 87 87 91 91 91 63 63 63 56 56 56 60 60 60 -+65 65 65 67 67 67 71 71 71 89 89 89 105 105 105 94 94 94 74 74 74 72 72 72 -+76 76 76 83 83 83 83 83 83 93 93 93 112 112 113 112 112 113 101 101 101 99 99 99 -+92 92 92 99 99 99 115 116 115 125 125 127 128 128 128 121 121 119 112 112 113 121 121 119 -+128 128 128 121 121 119 121 121 119 129 129 130 139 139 139 140 140 140 133 133 133 121 121 119 -+125 125 127 131 131 131 142 143 144 149 149 149 149 149 149 147 147 148 145 146 147 145 146 147 -+147 147 148 139 139 139 142 143 144 155 156 156 161 161 162 163 163 163 157 157 157 144 145 144 -+161 161 162 166 167 167 157 157 157 158 159 161 166 167 167 166 167 167 166 167 167 157 157 157 -+161 161 162 161 161 162 160 161 160 169 175 167 180 183 185 169 175 167 166 167 167 163 163 163 -+163 163 163 163 163 163 163 163 163 166 165 167 166 167 167 166 167 167 163 163 163 152 153 154 -+149 149 149 152 153 154 142 143 144 137 137 137 134 134 134 127 127 127 117 117 117 109 110 110 -+35 36 38 11 13 16 14 16 19 14 16 19 14 16 19 1 3 7 142 143 144 246 251 251 -+246 251 251 238 240 244 238 240 244 238 240 244 238 240 244 180 183 185 180 183 185 200 220 210 -+238 240 244 238 240 244 238 240 244 238 240 244 238 240 244 246 251 251 246 251 251 246 251 251 -+238 240 244 246 251 251 238 240 244 180 183 185 149 149 149 161 161 162 169 175 167 169 175 167 -+163 163 163 166 167 167 166 165 167 166 167 167 169 175 167 166 167 167 158 159 161 161 161 162 -+158 159 161 157 157 157 157 157 157 158 159 161 155 156 156 149 151 153 152 153 154 160 161 160 -+161 161 162 157 157 157 149 149 149 142 143 144 144 145 144 149 151 153 152 153 154 149 149 149 -+133 133 133 140 140 140 137 137 137 139 139 139 147 147 148 140 140 140 133 133 133 142 143 144 -+129 129 130 131 131 131 134 134 134 133 133 133 121 121 119 112 112 113 115 116 115 125 122 126 -+128 128 128 121 121 119 105 105 105 103 103 102 109 110 110 105 104 105 99 99 99 105 104 105 -+96 96 96 93 93 93 96 96 96 105 105 105 109 110 110 105 105 105 105 104 105 105 105 105 -+101 101 101 99 99 99 93 93 93 85 85 85 75 75 75 73 73 73 77 77 77 83 83 83 -+90 90 90 87 87 87 84 84 84 83 83 83 83 83 83 83 83 83 80 80 80 76 76 76 -+68 68 68 67 67 67 58 58 58 45 45 45 42 42 42 46 46 46 48 48 48 42 42 42 -+45 45 45 49 49 49 52 52 52 56 56 56 58 58 58 59 59 59 59 59 59 59 59 59 -+59 59 59 54 54 54 52 52 52 49 49 49 36 36 36 21 21 21 31 31 31 48 48 48 -+54 54 54 54 54 54 52 52 52 51 51 51 45 45 45 44 44 44 43 43 43 19 19 19 -+20 20 20 16 16 16 21 21 21 38 38 38 50 50 50 51 51 51 49 49 49 49 49 49 -+51 51 51 50 50 50 48 48 48 45 45 45 44 44 44 44 44 44 45 45 45 46 46 46 -+49 49 49 48 48 48 48 48 48 46 46 46 46 46 46 45 45 45 44 44 44 44 44 44 -+39 39 39 40 40 40 38 38 38 44 44 44 43 43 43 44 44 44 49 49 49 37 37 37 -+16 16 16 13 13 13 11 11 11 17 17 17 11 11 11 36 36 36 14 14 14 10 10 10 -+20 20 20 10 10 10 8 8 8 19 19 19 32 32 32 40 40 40 32 32 32 10 10 10 -+11 11 11 13 13 13 14 14 14 14 14 14 11 11 11 16 16 16 28 28 28 39 39 39 -+28 28 28 29 29 29 33 33 33 39 39 39 37 37 37 20 20 20 11 11 11 21 21 21 -+37 37 37 42 42 42 45 45 45 42 42 42 38 38 38 39 39 39 45 45 45 51 51 51 -+45 45 45 43 43 43 38 38 38 38 38 38 39 39 39 40 40 40 40 40 40 39 39 39 -+42 42 42 40 40 40 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 -+36 36 36 23 23 23 11 11 11 13 13 13 16 16 16 13 13 13 10 10 10 11 11 11 -+31 31 31 31 31 31 23 23 23 8 8 8 6 6 6 17 17 17 17 17 17 8 8 8 -+16 16 16 10 10 10 11 11 11 23 23 23 28 28 28 27 27 27 24 24 24 27 27 27 -+ -+21 21 21 13 13 13 13 13 13 27 27 27 37 37 37 36 36 36 24 24 24 13 13 13 -+13 13 13 23 23 23 23 23 23 13 13 13 20 20 20 36 36 36 37 37 37 23 23 23 -+16 16 16 24 24 24 19 19 19 0 0 0 0 0 0 14 14 14 24 24 24 20 20 20 -+11 11 11 0 0 0 0 0 0 4 4 4 6 6 6 0 0 0 0 0 0 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 3 3 3 8 8 8 11 11 11 11 11 11 8 8 8 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 6 6 6 -+4 4 4 14 14 14 19 19 19 10 10 10 3 3 3 6 6 6 14 14 14 19 19 19 -+36 36 36 23 23 23 4 4 4 0 0 0 13 13 13 25 25 25 25 25 25 20 20 20 -+38 38 38 34 34 34 20 20 20 8 8 8 17 17 17 21 21 21 16 16 16 13 13 13 -+31 31 31 40 40 40 32 32 32 37 37 37 57 57 57 48 48 48 28 28 28 36 36 36 -+28 28 28 48 48 48 59 59 59 44 44 44 82 82 82 60 60 60 49 49 49 42 42 42 -+42 42 42 52 52 52 59 59 59 80 80 80 87 87 87 75 75 75 68 68 68 54 54 54 -+65 65 65 63 63 63 65 65 65 85 85 85 105 105 105 99 99 99 77 77 77 72 72 72 -+83 83 83 81 81 81 76 76 76 91 91 91 115 116 115 117 117 117 101 101 101 88 88 88 -+99 99 99 105 105 105 112 112 113 109 110 110 117 117 117 128 128 128 125 122 126 125 125 127 -+117 117 117 109 110 110 112 112 113 127 127 127 137 138 139 144 145 144 140 140 140 127 127 127 -+134 134 134 140 140 140 139 139 139 134 134 134 140 140 140 152 153 154 152 153 154 145 146 147 -+139 139 139 137 138 139 144 145 144 149 151 153 152 153 154 157 157 157 158 159 161 149 151 153 -+163 163 163 163 163 163 152 153 154 152 153 154 163 163 163 166 167 167 166 167 167 163 163 163 -+163 163 163 158 159 161 157 157 157 166 167 167 169 175 167 166 167 167 169 175 167 166 167 167 -+166 167 167 166 165 167 161 161 162 163 163 163 166 167 167 169 175 167 166 167 167 161 161 162 -+155 156 156 157 157 157 149 149 149 142 143 144 137 137 137 137 137 137 127 127 127 93 93 93 -+10 11 14 11 13 16 6 8 11 20 21 24 6 8 11 24 25 28 20 21 24 200 220 210 -+238 240 244 238 240 244 246 251 251 246 251 251 252 251 251 238 240 244 200 220 210 238 240 244 -+238 240 244 252 251 251 246 251 251 238 240 244 238 240 244 238 240 244 238 240 244 238 240 244 -+238 240 244 238 240 244 238 240 244 231 246 232 152 153 154 160 161 160 163 163 163 169 175 167 -+163 163 163 166 167 167 166 165 167 166 167 167 169 175 167 163 163 163 157 157 157 161 161 162 -+160 161 160 157 157 157 157 157 157 157 157 157 157 157 157 152 153 154 149 149 149 152 153 154 -+155 156 156 157 157 157 155 156 156 145 146 147 140 140 140 144 145 144 149 149 149 149 151 153 -+147 147 148 134 134 134 137 137 137 139 139 139 133 133 133 140 140 140 147 147 148 137 138 139 -+133 133 133 127 127 127 128 128 128 137 137 137 133 133 133 117 117 117 109 110 110 112 112 113 -+122 121 126 127 127 127 115 116 115 105 105 105 105 105 105 105 105 105 101 101 101 103 103 102 -+96 96 96 96 96 96 101 101 101 109 110 110 112 112 113 109 110 110 105 105 105 105 104 105 -+99 99 99 93 93 93 85 85 85 78 78 78 75 75 75 77 77 77 84 84 84 88 88 88 -+87 87 87 87 87 87 87 87 87 84 84 84 78 78 78 72 72 72 69 69 69 68 68 68 -+63 63 63 59 59 59 50 50 50 45 45 45 50 50 50 59 59 59 67 67 67 70 70 70 -+58 58 58 56 56 56 52 52 52 50 50 50 50 50 50 53 53 53 58 58 58 61 61 61 -+62 62 62 60 60 60 61 61 61 59 59 59 44 44 44 24 24 24 24 24 24 36 36 36 -+53 53 53 57 57 57 56 56 56 54 54 54 49 49 49 51 51 51 49 49 49 23 23 23 -+24 24 24 16 16 16 16 16 16 28 28 28 43 43 43 49 49 49 50 50 50 50 50 50 -+49 49 49 49 49 49 48 48 48 46 46 46 46 46 46 48 48 48 48 48 48 48 48 48 -+49 49 49 49 49 49 48 48 48 46 46 46 44 44 44 43 43 43 42 42 42 42 42 42 -+39 39 39 42 42 42 39 39 39 40 40 40 39 39 39 44 44 44 54 54 54 48 48 48 -+16 16 16 14 14 14 11 11 11 19 19 19 16 16 16 37 37 37 14 14 14 14 14 14 -+13 13 13 10 10 10 16 16 16 33 33 33 45 45 45 39 39 39 21 21 21 4 4 4 -+13 13 13 16 16 16 13 13 13 11 11 11 20 20 20 31 31 31 34 34 34 32 32 32 -+20 20 20 33 33 33 43 43 43 49 49 49 52 52 52 44 44 44 33 33 33 33 33 33 -+36 36 36 29 29 29 24 24 24 29 29 29 38 38 38 44 44 44 43 43 43 39 39 39 -+50 50 50 45 45 45 40 40 40 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 -+39 39 39 38 38 38 38 38 38 39 39 39 42 42 42 42 42 42 39 39 39 37 37 37 -+21 21 21 17 17 17 16 16 16 17 17 17 14 14 14 10 10 10 16 16 16 25 25 25 -+36 36 36 24 24 24 10 10 10 4 4 4 11 11 11 19 19 19 17 17 17 11 11 11 -+13 13 13 14 14 14 21 21 21 32 32 32 34 34 34 31 31 31 32 32 32 39 39 39 -+ -+13 13 13 19 19 19 16 16 16 8 8 8 17 17 17 34 34 34 37 37 37 29 29 29 -+17 17 17 19 19 19 20 20 20 17 17 17 16 16 16 21 21 21 32 32 32 42 42 42 -+23 23 23 16 16 16 8 8 8 4 4 4 0 0 0 0 0 0 8 8 8 20 20 20 -+28 28 28 6 6 6 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 8 8 8 11 11 11 11 11 11 8 8 8 3 3 3 0 0 0 -+3 3 3 4 4 4 6 6 6 8 8 8 8 8 8 8 8 8 6 6 6 6 6 6 -+0 0 0 13 13 13 14 14 14 6 6 6 3 3 3 13 13 13 24 24 24 28 28 28 -+11 11 11 8 8 8 8 8 8 13 13 13 17 17 17 20 20 20 24 24 24 27 27 27 -+32 32 32 21 21 21 8 8 8 16 16 16 28 28 28 16 16 16 10 10 10 31 31 31 -+44 44 44 43 43 43 29 29 29 23 23 23 42 42 42 56 56 56 49 49 49 36 36 36 -+39 39 39 62 62 62 45 45 45 43 43 43 44 44 44 81 81 81 66 66 66 51 51 51 -+44 44 44 59 59 59 81 81 81 56 56 56 58 58 58 90 90 90 80 80 80 72 72 72 -+59 59 59 60 60 60 87 87 87 91 91 91 72 72 72 91 91 91 105 105 105 81 81 81 -+76 76 76 73 73 73 90 90 90 105 104 105 103 103 102 105 105 105 112 112 113 105 104 105 -+103 103 102 105 105 105 105 104 105 94 94 94 105 105 105 128 128 128 128 128 128 127 127 127 -+112 112 113 112 112 113 122 121 126 129 129 130 128 128 128 134 134 134 142 143 144 140 140 140 -+137 137 137 137 137 137 131 131 131 125 125 127 133 133 133 149 151 153 155 156 156 149 149 149 -+137 138 139 144 145 144 152 153 154 149 151 153 145 146 147 149 149 149 158 159 161 161 161 162 -+161 161 162 163 163 163 152 153 154 149 151 153 155 156 156 157 157 157 166 167 167 166 167 167 -+161 161 162 157 157 157 160 161 160 169 175 167 166 167 167 163 163 163 169 175 167 169 175 167 -+166 167 167 166 167 167 163 163 163 166 165 167 169 175 167 180 183 185 169 175 167 169 175 167 -+166 165 167 152 153 154 152 153 154 152 153 154 139 139 139 144 145 144 125 125 127 52 52 52 -+8 10 13 11 13 16 14 16 19 0 0 4 14 16 19 8 10 13 6 8 11 96 97 98 -+238 240 244 246 251 251 238 240 244 238 240 244 238 240 244 238 240 244 180 183 185 200 220 210 -+200 220 210 231 246 232 238 240 244 238 240 244 246 251 251 238 240 244 246 251 251 238 240 244 -+246 251 251 238 240 244 246 251 251 238 240 244 200 220 210 152 153 154 157 157 157 169 175 167 -+166 167 167 166 167 167 166 167 167 166 167 167 166 167 167 161 161 162 157 157 157 160 161 160 -+161 161 162 157 157 157 152 153 154 152 153 154 152 153 154 152 153 154 149 149 149 147 147 148 -+145 146 147 152 153 154 157 157 157 152 153 154 144 145 144 142 143 144 142 143 144 144 145 144 -+155 156 156 147 147 148 137 137 137 128 128 128 128 128 128 137 137 137 144 145 144 140 140 140 -+142 143 144 127 127 127 121 121 119 128 128 128 133 133 133 127 127 127 112 112 113 105 105 105 -+105 105 105 117 117 117 117 117 117 109 110 110 105 105 105 105 105 105 103 103 102 99 99 99 -+96 97 98 103 103 102 105 105 105 109 110 110 112 112 113 112 112 113 105 105 105 103 103 102 -+96 96 96 89 89 89 82 82 82 80 80 80 83 83 83 88 88 88 91 91 91 91 91 91 -+87 87 87 87 87 87 85 85 85 77 77 77 67 67 67 60 60 60 63 63 63 71 71 71 -+78 78 78 72 72 72 66 66 66 62 62 62 63 63 63 65 65 65 67 67 67 69 69 69 -+71 71 71 68 68 68 62 62 62 58 58 58 54 54 54 53 53 53 52 52 52 51 51 51 -+57 57 57 54 54 54 56 56 56 59 59 59 56 56 56 43 43 43 32 32 32 25 25 25 -+42 42 42 52 52 52 51 51 51 49 49 49 48 48 48 52 52 52 56 56 56 40 40 40 -+21 21 21 16 16 16 14 14 14 24 24 24 39 39 39 49 49 49 49 49 49 45 45 45 -+48 48 48 46 46 46 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 45 45 45 -+43 43 43 43 43 43 42 42 42 40 40 40 38 38 38 37 37 37 36 36 36 36 36 36 -+38 38 38 43 43 43 42 42 42 43 43 43 39 39 39 42 42 42 48 48 48 36 36 36 -+14 14 14 13 13 13 8 8 8 16 16 16 20 20 20 27 27 27 13 13 13 14 14 14 -+0 0 0 17 17 17 27 27 27 39 39 39 48 48 48 32 32 32 13 13 13 16 16 16 -+14 14 14 11 11 11 8 8 8 16 16 16 31 31 31 39 39 39 29 29 29 10 10 10 -+34 34 34 43 43 43 40 40 40 39 39 39 51 51 51 53 53 53 45 45 45 44 44 44 -+39 39 39 27 27 27 14 14 14 19 19 19 31 31 31 38 38 38 38 38 38 37 37 37 -+48 48 48 46 46 46 44 44 44 40 40 40 39 39 39 38 38 38 38 38 38 39 39 39 -+38 38 38 37 37 37 38 38 38 39 39 39 42 42 42 39 39 39 34 34 34 29 29 29 -+13 13 13 14 14 14 14 14 14 14 14 14 11 11 11 14 14 14 25 25 25 37 37 37 -+24 24 24 16 16 16 10 10 10 14 14 14 16 16 16 14 14 14 13 13 13 16 16 16 -+8 8 8 25 25 25 38 38 38 38 38 38 37 37 37 39 39 39 40 40 40 39 39 39 -+ -+14 14 14 17 17 17 14 14 14 10 10 10 11 11 11 23 23 23 34 34 34 38 38 38 -+28 28 28 19 19 19 16 16 16 21 21 21 20 20 20 14 14 14 23 23 23 38 38 38 -+34 34 34 17 17 17 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 8 8 8 -+24 24 24 17 17 17 6 6 6 0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 4 4 4 8 8 8 11 11 11 10 10 10 6 6 6 3 3 3 0 0 0 -+0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 -+3 3 3 10 10 10 11 11 11 6 6 6 13 13 13 23 23 23 25 25 25 20 20 20 -+0 0 0 6 6 6 13 13 13 16 16 16 16 16 16 19 19 19 21 21 21 24 24 24 -+19 19 19 8 8 8 8 8 8 20 20 20 24 24 24 19 19 19 28 28 28 46 46 46 -+43 43 43 27 27 27 29 29 29 29 29 29 21 21 21 42 42 42 60 60 60 51 51 51 -+65 65 65 37 37 37 43 43 43 36 36 36 37 37 37 48 48 48 76 76 76 66 66 66 -+61 61 61 74 74 74 53 53 53 52 52 52 53 53 53 60 60 60 90 90 90 87 87 87 -+61 61 61 88 88 88 87 87 87 68 68 68 70 70 70 81 81 81 89 89 89 99 99 99 -+84 84 84 82 82 82 96 97 98 103 103 102 89 89 89 93 93 93 112 112 113 121 121 119 -+112 112 113 105 104 105 99 99 99 101 101 101 115 116 115 125 125 127 125 122 126 133 133 133 -+121 121 119 121 121 119 125 125 127 122 121 126 112 112 113 121 121 119 134 134 134 140 140 140 -+140 140 140 133 133 133 127 127 127 128 128 128 134 134 134 142 143 144 147 147 148 149 151 153 -+147 147 148 149 149 149 149 149 149 145 146 147 144 145 144 144 145 144 152 153 154 161 161 162 -+161 161 162 163 163 163 155 156 156 149 151 153 152 153 154 152 153 154 160 161 160 166 167 167 -+166 167 167 161 161 162 161 161 162 169 175 167 166 167 167 158 159 161 166 167 167 169 175 167 -+166 167 167 166 167 167 166 165 167 166 167 167 169 175 167 169 175 167 169 175 167 169 175 167 -+169 175 167 157 157 157 157 157 157 157 157 157 147 147 148 142 143 144 105 105 105 14 14 14 -+14 16 19 6 8 11 22 23 26 8 10 13 0 0 4 20 21 24 6 8 11 6 8 11 -+161 161 162 238 240 244 246 251 251 238 240 244 238 240 244 246 251 251 238 240 244 231 224 220 -+200 220 210 200 220 210 246 251 251 238 240 244 238 240 244 238 240 244 238 240 244 238 240 244 -+238 240 244 246 251 251 238 240 244 238 240 244 238 240 244 158 159 161 166 167 167 166 167 167 -+166 167 167 166 167 167 166 167 167 166 167 167 161 161 162 158 159 161 158 159 161 157 157 157 -+157 157 157 155 156 156 152 153 154 149 151 153 149 151 153 152 153 154 149 149 149 147 147 148 -+144 145 144 147 147 148 149 151 153 152 153 154 149 151 153 144 145 144 140 140 140 137 138 139 -+144 145 144 152 153 154 140 140 140 127 127 127 133 133 133 131 131 131 128 128 128 140 140 140 -+145 146 147 134 134 134 121 121 119 117 117 117 125 122 126 128 128 128 122 121 126 112 112 113 -+105 104 105 109 110 110 112 112 113 109 110 110 105 104 105 105 104 105 103 103 102 96 96 96 -+99 99 99 109 110 110 115 116 115 109 110 110 109 110 110 109 110 110 109 110 110 101 101 101 -+87 87 87 83 83 83 80 80 80 84 84 84 91 91 91 96 97 98 96 96 96 93 93 93 -+89 89 89 81 81 81 73 73 73 68 68 68 65 65 65 66 66 66 71 71 71 78 78 78 -+77 77 77 76 76 76 74 74 74 72 72 72 71 71 71 70 70 70 69 69 69 68 68 68 -+69 69 69 67 67 67 66 66 66 65 65 65 62 62 62 57 57 57 50 50 50 44 44 44 -+56 56 56 57 57 57 57 57 57 58 58 58 60 60 60 56 56 56 39 39 39 20 20 20 -+31 31 31 50 50 50 51 51 51 50 50 50 50 50 50 52 52 52 56 56 56 51 51 51 -+21 21 21 21 21 21 20 20 20 24 24 24 39 39 39 53 53 53 54 54 54 48 48 48 -+51 51 51 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 45 45 45 43 43 43 -+42 42 42 42 42 42 42 42 42 40 40 40 40 40 40 40 40 40 39 39 39 39 39 39 -+36 36 36 40 40 40 39 39 39 42 42 42 39 39 39 38 38 38 34 34 34 10 10 10 -+13 13 13 13 13 13 10 10 10 16 16 16 29 29 29 16 16 16 14 14 14 13 13 13 -+10 10 10 32 32 32 31 31 31 31 31 31 43 43 43 29 29 29 8 8 8 20 20 20 -+14 14 14 10 10 10 14 14 14 28 28 28 34 34 34 29 29 29 17 17 17 8 8 8 -+46 46 46 51 51 51 39 39 39 32 32 32 42 42 42 45 45 45 43 43 43 48 48 48 -+42 42 42 36 36 36 29 29 29 24 24 24 21 21 21 23 23 23 32 32 32 42 42 42 -+42 42 42 44 44 44 46 46 46 45 45 45 43 43 43 39 39 39 39 39 39 39 39 39 -+39 39 39 38 38 38 39 39 39 40 40 40 40 40 40 37 37 37 27 27 27 19 19 19 -+13 13 13 13 13 13 11 11 11 11 11 11 17 17 17 25 25 25 28 28 28 28 28 28 -+13 13 13 11 11 11 13 13 13 16 16 16 14 14 14 11 11 11 13 13 13 17 17 17 -+21 21 21 36 36 36 44 44 44 42 42 42 38 38 38 40 40 40 40 40 40 38 38 38 -+ -+24 24 24 10 10 10 10 10 10 23 23 23 23 23 23 11 11 11 19 19 19 38 38 38 -+39 39 39 24 24 24 14 14 14 20 20 20 24 24 24 19 19 19 16 16 16 17 17 17 -+45 45 45 29 29 29 8 8 8 0 0 0 0 0 0 4 4 4 4 4 4 0 0 0 -+6 6 6 24 24 24 28 28 28 11 11 11 0 0 0 0 0 0 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 8 8 8 10 10 10 6 6 6 4 4 4 3 3 3 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 6 6 6 6 6 6 6 6 6 6 6 6 -+4 4 4 10 10 10 13 13 13 14 14 14 24 24 24 31 31 31 20 20 20 0 0 0 -+16 16 16 14 14 14 8 8 8 6 6 6 14 14 14 24 24 24 21 21 21 13 13 13 -+17 17 17 14 14 14 17 17 17 14 14 14 8 8 8 24 24 24 44 44 44 48 48 48 -+23 23 23 23 23 23 21 21 21 27 27 27 27 27 27 20 20 20 40 40 40 77 77 77 -+57 57 57 38 38 38 25 25 25 40 40 40 39 39 39 36 36 36 49 49 49 78 78 78 -+82 82 82 54 54 54 49 49 49 51 51 51 54 54 54 57 57 57 63 63 63 89 89 89 -+93 93 93 85 85 85 70 70 70 65 65 65 69 69 69 68 68 68 75 75 75 95 95 94 -+105 105 105 103 103 102 94 94 94 87 87 87 83 83 83 87 87 87 99 99 99 115 116 115 -+121 121 119 96 97 98 94 94 94 109 110 110 117 117 117 109 110 110 103 103 102 122 121 126 -+137 137 137 127 127 127 125 122 126 121 121 119 112 112 113 121 121 119 139 139 139 142 143 144 -+149 151 153 137 137 137 131 131 131 140 140 140 140 140 140 129 129 130 133 133 133 144 145 144 -+160 161 160 149 151 153 139 139 139 140 140 140 145 146 147 144 145 144 144 145 144 152 153 154 -+163 163 163 163 163 163 152 153 154 149 151 153 152 153 154 152 153 154 157 157 157 158 159 161 -+169 175 167 166 167 167 161 161 162 169 175 167 166 167 167 157 157 157 161 161 162 161 161 162 -+169 175 167 169 175 167 166 167 167 166 167 167 169 175 167 166 167 167 163 163 163 166 165 167 -+169 175 167 169 175 167 160 161 160 155 156 156 157 157 157 134 134 134 80 80 80 0 0 0 -+11 13 16 6 8 11 11 13 16 8 10 13 20 21 24 0 0 4 20 21 24 14 16 19 -+37 39 42 200 220 210 238 240 244 238 240 244 246 251 251 238 240 244 246 251 251 231 246 232 -+187 210 182 180 183 185 238 240 244 246 251 251 238 240 244 246 251 251 238 240 244 238 240 244 -+238 240 244 238 240 244 238 240 244 252 251 251 238 240 244 231 224 220 140 140 140 169 175 167 -+166 167 167 166 167 167 166 167 167 166 167 167 157 157 157 157 157 157 161 161 162 157 157 157 -+149 149 149 152 153 154 155 156 156 152 153 154 149 151 153 152 153 154 149 149 149 147 147 148 -+149 149 149 144 145 144 142 143 144 147 147 148 152 153 154 149 149 149 140 140 140 137 137 137 -+137 137 137 137 137 137 144 145 144 144 145 144 129 129 130 127 127 127 129 129 130 129 129 130 -+144 145 144 144 145 144 133 133 133 115 116 115 112 112 113 127 127 127 129 129 130 121 121 119 -+112 112 113 105 105 105 105 105 105 105 105 105 101 101 101 101 101 101 103 103 102 99 99 99 -+101 101 101 115 116 115 121 121 119 109 110 110 101 101 101 103 103 102 101 101 101 92 92 92 -+81 81 81 80 80 80 81 81 81 88 88 88 95 95 94 99 99 99 94 94 94 90 90 90 -+84 84 84 70 70 70 60 60 60 66 66 66 77 77 77 83 83 83 81 81 81 77 77 77 -+73 73 73 76 76 76 76 76 76 72 72 72 70 70 70 71 71 71 70 70 70 65 65 65 -+67 67 67 63 63 63 61 61 61 61 61 61 63 63 63 62 62 62 59 59 59 54 54 54 -+44 44 44 53 53 53 57 57 57 56 56 56 59 59 59 60 60 60 48 48 48 28 28 28 -+17 17 17 45 45 45 51 51 51 51 51 51 53 53 53 50 50 50 51 51 51 51 51 51 -+31 31 31 28 28 28 17 17 17 10 10 10 23 23 23 45 45 45 52 52 52 48 48 48 -+44 44 44 43 43 43 43 43 43 44 44 44 46 46 46 46 46 46 44 44 44 42 42 42 -+38 38 38 38 38 38 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 -+43 43 43 42 42 42 36 36 36 37 37 37 40 40 40 44 44 44 42 42 42 17 17 17 -+14 14 14 14 14 14 13 13 13 19 19 19 38 38 38 10 10 10 17 17 17 14 14 14 -+27 27 27 45 45 45 27 27 27 14 14 14 38 38 38 33 33 33 8 8 8 16 16 16 -+14 14 14 14 14 14 28 28 28 39 39 39 32 32 32 10 10 10 8 8 8 24 24 24 -+45 45 45 53 53 53 46 46 46 39 39 39 44 44 44 43 43 43 44 44 44 59 59 59 -+46 46 46 43 43 43 38 38 38 32 32 32 23 23 23 19 19 19 27 27 27 39 39 39 -+34 34 34 42 42 42 48 48 48 50 50 50 45 45 45 42 42 42 39 39 39 39 39 39 -+40 40 40 40 40 40 40 40 40 42 42 42 40 40 40 33 33 33 21 21 21 11 11 11 -+17 17 17 13 13 13 10 10 10 13 13 13 25 25 25 33 33 33 24 24 24 8 8 8 -+13 13 13 13 13 13 11 11 11 10 10 10 10 10 10 13 13 13 16 16 16 17 17 17 -+42 42 42 38 38 38 39 39 39 43 43 43 40 40 40 34 34 34 36 36 36 43 43 43 -+ -+48 48 48 24 24 24 17 17 17 20 20 20 14 14 14 17 17 17 21 21 21 16 16 16 -+36 36 36 33 33 33 25 25 25 17 17 17 16 16 16 19 19 19 19 19 19 14 14 14 -+0 0 0 33 33 33 33 33 33 8 8 8 0 0 0 0 0 0 0 0 0 4 4 4 -+0 0 0 8 8 8 23 23 23 25 25 25 13 13 13 0 0 0 0 0 0 4 4 4 -+0 0 0 0 0 0 0 0 0 6 6 6 4 4 4 0 0 0 0 0 0 6 6 6 -+4 4 4 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 4 4 4 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 14 14 14 11 11 11 0 0 0 0 0 0 8 8 8 3 3 3 -+0 0 0 10 10 10 8 8 8 0 0 0 3 3 3 13 13 13 11 11 11 0 0 0 -+3 3 3 0 0 0 11 11 11 28 28 28 29 29 29 16 16 16 4 4 4 4 4 4 -+8 8 8 14 14 14 13 13 13 8 8 8 14 14 14 24 24 24 23 23 23 11 11 11 -+16 16 16 8 8 8 13 13 13 16 16 16 24 24 24 44 44 44 44 44 44 19 19 19 -+20 20 20 21 21 21 28 28 28 25 25 25 23 23 23 42 42 42 56 56 56 50 50 50 -+72 72 72 48 48 48 39 39 39 34 34 34 38 38 38 45 45 45 51 51 51 71 71 71 -+82 82 82 67 67 67 48 48 48 48 48 48 56 56 56 52 52 52 57 57 57 77 77 77 -+95 95 94 87 87 87 75 75 75 68 68 68 67 67 67 70 70 70 73 73 73 76 76 76 -+105 105 105 112 112 113 93 93 93 76 76 76 81 81 81 101 101 101 109 110 110 93 93 93 -+112 112 113 121 121 119 115 116 115 112 112 113 101 101 101 105 105 105 105 105 105 112 112 113 -+128 128 128 137 138 139 127 127 127 112 112 113 121 121 119 129 129 130 125 125 127 121 121 119 -+134 134 134 147 147 148 144 145 144 129 129 130 127 127 127 129 129 130 134 134 134 140 140 140 -+147 147 148 155 156 156 152 153 154 142 143 144 137 137 137 142 143 144 144 145 144 144 145 144 -+158 159 161 166 167 167 157 157 157 152 153 154 152 153 154 152 153 154 155 156 156 155 156 156 -+157 157 157 166 165 167 169 175 167 166 167 167 158 159 161 158 159 161 163 163 163 160 161 160 -+158 159 161 169 175 167 180 183 185 166 167 167 166 167 167 166 167 167 166 167 167 166 167 167 -+166 165 167 166 167 167 166 167 167 160 161 160 149 149 149 126 132 129 2 8 7 6 13 11 -+10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 -+10 11 14 89 90 92 238 240 244 238 240 244 246 251 251 238 240 244 246 251 251 238 240 244 -+169 175 167 200 220 210 200 220 210 238 240 244 238 240 244 246 251 251 246 251 251 238 240 244 -+246 251 251 238 240 244 246 251 251 238 240 244 246 251 251 238 240 244 180 183 185 149 151 153 -+169 175 167 166 167 167 169 175 167 155 156 156 166 167 167 149 151 153 157 157 157 155 156 156 -+152 153 154 152 153 154 152 153 154 149 151 153 149 149 149 149 149 149 147 147 148 147 147 148 -+142 143 144 145 146 147 144 145 144 137 138 139 144 145 144 157 157 157 152 153 154 137 138 139 -+131 131 131 133 133 133 139 139 139 142 143 144 139 139 139 129 129 130 122 121 126 122 121 126 -+125 122 126 137 137 137 142 143 144 122 121 126 109 110 110 109 110 110 115 116 115 133 133 133 -+128 128 128 115 116 115 105 105 105 103 103 102 105 105 105 103 103 102 91 91 91 101 101 101 -+109 110 110 109 110 110 112 112 113 112 112 113 112 112 113 103 103 102 94 94 94 87 87 87 -+76 76 76 81 81 81 93 93 93 99 99 99 93 93 93 94 94 94 94 94 94 85 85 85 -+58 58 58 73 73 73 81 81 81 76 76 76 73 73 73 77 77 77 80 80 80 80 80 80 -+75 75 75 75 75 75 73 73 73 70 70 70 68 68 68 69 69 69 68 68 68 67 67 67 -+62 62 62 61 61 61 62 62 62 61 61 61 63 63 63 65 65 65 59 59 59 58 58 58 -+46 46 46 40 40 40 57 57 57 61 61 61 50 50 50 58 58 58 60 60 60 39 39 39 -+40 40 40 44 44 44 52 52 52 57 57 57 51 51 51 50 50 50 53 53 53 53 53 53 -+42 42 42 20 20 20 14 14 14 13 13 13 19 19 19 43 43 43 54 54 54 44 44 44 -+46 46 46 48 48 48 48 48 48 44 44 44 42 42 42 40 40 40 40 40 40 42 42 42 -+42 42 42 38 38 38 38 38 38 42 42 42 43 43 43 40 40 40 40 40 40 45 45 45 -+42 42 42 39 39 39 40 40 40 39 39 39 38 38 38 43 43 43 36 36 36 13 13 13 -+19 19 19 14 14 14 6 6 6 21 21 21 34 34 34 16 16 16 4 4 4 31 31 31 -+40 40 40 29 29 29 16 16 16 19 19 19 37 37 37 17 17 17 16 16 16 11 11 11 -+10 10 10 33 33 33 38 38 38 27 27 27 17 17 17 11 11 11 13 13 13 23 23 23 -+38 38 38 40 40 40 46 46 46 51 51 51 48 48 48 40 40 40 39 39 39 45 45 45 -+56 56 56 49 49 49 40 40 40 37 37 37 36 36 36 34 34 34 33 33 33 34 34 34 -+20 20 20 42 42 42 42 42 42 38 38 38 54 54 54 54 54 54 40 40 40 37 37 37 -+46 46 46 38 38 38 37 37 37 43 43 43 40 40 40 27 27 27 14 14 14 13 13 13 -+14 14 14 4 4 4 10 10 10 28 28 28 33 33 33 23 23 23 14 14 14 16 16 16 -+19 19 19 14 14 14 14 14 14 16 16 16 13 13 13 13 13 13 24 24 24 39 39 39 -+39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 -+ -+27 27 27 43 43 43 29 29 29 11 11 11 23 23 23 20 20 20 10 10 10 20 20 20 -+20 20 20 36 36 36 39 39 39 24 24 24 13 13 13 16 16 16 11 11 11 0 0 0 -+6 6 6 0 0 0 24 24 24 33 33 33 10 10 10 0 0 0 8 8 8 0 0 0 -+3 3 3 0 0 0 4 4 4 23 23 23 29 29 29 19 19 19 4 4 4 0 0 0 -+6 6 6 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 14 14 14 11 11 11 0 0 0 0 0 0 8 8 8 3 3 3 -+0 0 0 8 8 8 6 6 6 0 0 0 0 0 0 8 8 8 11 11 11 8 8 8 -+3 3 3 10 10 10 19 19 19 20 20 20 13 13 13 4 4 4 4 4 4 11 11 11 -+4 4 4 6 6 6 13 13 13 23 23 23 29 29 29 27 27 27 19 19 19 13 13 13 -+14 14 14 19 19 19 8 8 8 20 20 20 46 46 46 39 39 39 17 17 17 23 23 23 -+19 19 19 29 29 29 21 21 21 19 19 19 42 42 42 53 53 53 43 43 43 31 31 31 -+39 39 39 69 69 69 52 52 52 40 40 40 39 39 39 51 51 51 72 72 72 49 49 49 -+46 46 46 75 75 75 74 74 74 51 51 51 49 49 49 58 58 58 69 69 69 82 82 82 -+65 65 65 82 82 82 85 85 85 74 74 74 65 65 65 59 59 59 70 70 70 92 92 92 -+93 93 93 95 95 94 109 110 110 91 91 91 91 91 91 109 110 110 94 94 94 91 91 91 -+95 95 94 112 112 113 121 121 119 117 117 117 99 99 99 101 101 101 109 110 110 122 121 126 -+112 112 113 125 125 127 127 127 127 125 125 127 128 128 128 125 122 126 117 117 117 121 121 119 -+129 129 130 140 140 140 145 146 147 140 140 140 133 133 133 129 129 130 134 134 134 144 145 144 -+137 138 139 145 146 147 152 153 154 149 149 149 144 145 144 142 143 144 144 145 144 144 145 144 -+155 156 156 163 163 163 158 159 161 158 159 161 157 157 157 149 149 149 149 149 149 152 153 154 -+152 153 154 157 157 157 166 167 167 169 175 167 163 163 163 157 157 157 160 161 160 161 161 162 -+161 161 162 166 165 167 166 167 167 166 167 167 169 175 167 166 167 167 163 163 163 166 165 167 -+166 165 167 163 163 163 169 175 167 157 157 157 157 157 157 66 69 71 10 16 15 6 13 11 -+10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 -+11 13 16 1 3 7 166 167 167 238 240 244 238 240 244 246 251 251 238 240 244 238 240 244 -+246 251 251 238 240 244 200 220 210 238 240 244 238 240 244 238 240 244 238 240 244 238 240 244 -+238 240 244 238 240 244 246 251 251 246 251 251 238 240 244 238 240 244 231 224 220 149 151 153 -+166 167 167 169 175 167 161 161 162 157 157 157 152 153 154 166 167 167 145 146 147 157 157 157 -+152 153 154 152 153 154 152 153 154 149 151 153 149 149 149 147 147 148 147 147 148 145 146 147 -+142 143 144 144 145 144 144 145 144 139 139 139 137 137 137 142 143 144 145 146 147 147 147 148 -+134 134 134 129 129 130 129 129 130 133 133 133 137 137 137 134 134 134 127 127 127 121 121 119 -+117 117 117 127 127 127 134 134 134 125 125 127 115 116 115 109 110 110 109 110 110 127 127 127 -+125 122 126 112 112 113 105 105 105 101 101 101 105 104 105 103 103 102 95 95 94 105 105 105 -+112 112 113 112 112 113 109 110 110 109 110 110 105 105 105 99 99 99 89 89 89 80 80 80 -+78 78 78 92 92 92 99 99 99 95 95 94 94 94 94 93 93 93 83 83 83 70 70 70 -+72 72 72 78 78 78 82 82 82 81 81 81 81 81 81 82 82 82 80 80 80 74 74 74 -+75 75 75 74 74 74 74 74 74 76 76 76 76 76 76 71 71 71 65 65 65 61 61 61 -+63 63 63 59 59 59 58 58 58 58 58 58 59 59 59 60 60 60 59 59 59 61 61 61 -+57 57 57 45 45 45 50 50 50 60 60 60 59 59 59 56 56 56 54 54 54 53 53 53 -+42 42 42 33 33 33 43 43 43 56 56 56 52 52 52 48 48 48 50 50 50 52 52 52 -+50 50 50 31 31 31 23 23 23 20 20 20 20 20 20 37 37 37 48 48 48 40 40 40 -+48 48 48 46 46 46 44 44 44 39 39 39 37 37 37 37 37 37 40 40 40 44 44 44 -+43 43 43 39 39 39 38 38 38 39 39 39 39 39 39 38 38 38 39 39 39 43 43 43 -+39 39 39 38 38 38 39 39 39 38 38 38 37 37 37 42 42 42 33 33 33 13 13 13 -+10 10 10 11 11 11 11 11 11 21 21 21 31 31 31 23 23 23 21 21 21 38 38 38 -+29 29 29 17 17 17 11 11 11 24 24 24 39 39 39 13 13 13 10 10 10 13 13 13 -+25 25 25 33 33 33 28 28 28 16 16 16 10 10 10 10 10 10 20 20 20 37 37 37 -+38 38 38 38 38 38 40 40 40 44 44 44 44 44 44 40 40 40 37 37 37 36 36 36 -+42 42 42 51 51 51 52 52 52 43 43 43 38 38 38 39 39 39 33 33 33 21 21 21 -+21 21 21 33 33 33 37 37 37 38 38 38 45 45 45 50 50 50 46 46 46 42 42 42 -+40 40 40 39 39 39 43 43 43 43 43 43 32 32 32 14 14 14 6 6 6 13 13 13 -+4 4 4 17 17 17 28 28 28 31 31 31 24 24 24 16 16 16 11 11 11 13 13 13 -+4 4 4 11 11 11 11 11 11 8 8 8 16 16 16 31 31 31 39 39 39 39 39 39 -+38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 -+ -+21 21 21 32 32 32 39 39 39 32 32 32 17 17 17 16 16 16 19 19 19 14 14 14 -+14 14 14 20 20 20 31 31 31 37 37 37 28 28 28 10 10 10 0 0 0 0 0 0 -+0 0 0 0 0 0 4 4 4 24 24 24 31 31 31 16 16 16 0 0 0 0 0 0 -+8 8 8 0 0 0 0 0 0 11 11 11 27 27 27 32 32 32 17 17 17 0 0 0 -+0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 13 13 13 11 11 11 0 0 0 0 0 0 6 6 6 3 3 3 -+3 3 3 6 6 6 8 8 8 6 6 6 3 3 3 3 3 3 6 6 6 8 8 8 -+0 0 0 11 11 11 17 17 17 11 11 11 3 3 3 4 4 4 10 10 10 14 14 14 -+3 3 3 20 20 20 33 33 33 33 33 33 24 24 24 16 16 16 14 14 14 16 16 16 -+13 13 13 13 13 13 27 27 27 40 40 40 37 37 37 24 24 24 19 19 19 19 19 19 -+23 23 23 19 19 19 19 19 19 38 38 38 56 56 56 43 43 43 24 24 24 28 28 28 -+27 27 27 44 44 44 71 71 71 49 49 49 49 49 49 72 72 72 52 52 52 42 42 42 -+40 40 40 51 51 51 81 81 81 74 74 74 45 45 45 67 67 67 89 89 89 65 65 65 -+56 56 56 65 65 65 88 88 88 92 92 92 73 73 73 74 74 74 92 92 92 96 96 96 -+75 75 75 87 87 87 88 88 88 117 117 117 115 116 115 85 85 85 90 90 90 88 88 88 -+101 101 101 109 110 110 115 116 115 121 121 119 112 112 113 112 112 113 115 116 115 121 121 119 -+103 103 102 117 117 117 128 128 128 134 134 134 134 134 134 121 121 119 112 112 113 121 121 119 -+128 128 128 129 129 130 139 139 139 144 145 144 142 143 144 137 137 137 137 137 137 137 137 137 -+131 131 131 137 137 137 147 147 148 152 153 154 152 153 154 144 145 144 142 143 144 142 143 144 -+155 156 156 157 157 157 152 153 154 161 161 162 163 163 163 152 153 154 147 147 148 147 147 148 -+152 153 154 152 153 154 161 161 162 169 175 167 166 167 167 161 161 162 157 157 157 157 157 157 -+161 161 162 160 161 160 160 161 160 166 167 167 169 175 167 169 175 167 161 161 162 158 159 161 -+161 161 162 158 159 161 166 167 167 158 159 161 144 145 144 2 8 7 14 20 19 6 13 11 -+10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 -+6 8 11 8 10 13 26 29 32 231 224 220 238 240 244 238 240 244 246 251 251 238 240 244 -+238 240 244 231 224 220 180 183 185 200 220 210 246 251 251 238 240 244 238 240 244 238 240 244 -+238 240 244 246 251 251 238 240 244 238 240 244 238 240 244 246 251 251 238 240 244 180 183 185 -+157 157 157 169 175 167 147 147 148 163 163 163 149 149 149 157 157 157 152 153 154 152 153 154 -+152 153 154 149 151 153 149 149 149 149 149 149 147 147 148 145 146 147 144 145 144 144 145 144 -+142 143 144 140 140 140 142 143 144 140 140 140 134 134 134 131 131 131 137 138 139 149 149 149 -+142 143 144 133 133 133 125 122 126 125 122 126 133 133 133 137 138 139 133 133 133 125 125 127 -+117 117 117 117 117 117 127 127 127 129 129 130 127 127 127 117 117 117 112 112 113 128 128 128 -+117 117 117 109 110 110 103 103 102 101 101 101 103 103 102 99 99 99 99 99 99 115 116 115 -+115 116 115 112 112 113 109 110 110 105 104 105 101 101 101 92 92 92 83 83 83 74 74 74 -+87 87 87 99 99 99 99 99 99 96 96 96 96 96 96 85 85 85 69 69 69 65 65 65 -+84 84 84 84 84 84 85 85 85 84 84 84 82 82 82 81 81 81 77 77 77 73 73 73 -+75 75 75 74 74 74 72 72 72 66 66 66 51 51 51 38 38 38 38 38 38 46 46 46 -+52 52 52 43 43 43 36 36 36 38 38 38 42 42 42 46 46 46 57 57 57 65 65 65 -+58 58 58 50 50 50 40 40 40 49 49 49 58 58 58 51 51 51 46 46 46 53 53 53 -+39 39 39 16 16 16 28 28 28 52 52 52 51 51 51 44 44 44 48 48 48 50 50 50 -+48 48 48 25 25 25 11 11 11 16 16 16 20 20 20 34 34 34 46 46 46 42 42 42 -+42 42 42 42 42 42 43 43 43 44 44 44 42 42 42 39 39 39 38 38 38 39 39 39 -+44 44 44 40 40 40 38 38 38 39 39 39 38 38 38 37 37 37 38 38 38 42 42 42 -+38 38 38 38 38 38 39 39 39 38 38 38 38 38 38 40 40 40 31 31 31 11 11 11 -+10 10 10 10 10 10 14 14 14 23 23 23 31 31 31 33 33 33 33 33 33 34 34 34 -+16 16 16 10 10 10 14 14 14 33 33 33 38 38 38 8 8 8 14 14 14 28 28 28 -+34 34 34 28 28 28 16 16 16 10 10 10 8 8 8 10 10 10 25 25 25 48 48 48 -+42 42 42 40 40 40 39 39 39 42 42 42 45 45 45 48 48 48 43 43 43 37 37 37 -+39 39 39 50 50 50 53 53 53 46 46 46 40 40 40 42 42 42 39 39 39 32 32 32 -+23 23 23 23 23 23 34 34 34 44 44 44 44 44 44 49 49 49 51 51 51 45 45 45 -+37 37 37 38 38 38 40 40 40 38 38 38 24 24 24 8 8 8 6 6 6 16 16 16 -+11 11 11 28 28 28 34 34 34 24 24 24 13 13 13 13 13 13 13 13 13 10 10 10 -+13 13 13 16 16 16 16 16 16 19 19 19 29 29 29 43 43 43 45 45 45 39 39 39 -+40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 -+ -+24 24 24 16 16 16 33 33 33 43 43 43 25 25 25 17 17 17 21 21 21 14 14 14 -+21 21 21 11 11 11 14 14 14 31 31 31 33 33 33 17 17 17 0 0 0 0 0 0 -+0 0 0 10 10 10 0 0 0 0 0 0 27 27 27 28 28 28 6 6 6 0 0 0 -+0 0 0 8 8 8 4 4 4 0 0 0 6 6 6 28 28 28 29 29 29 14 14 14 -+0 0 0 0 0 0 4 4 4 8 8 8 4 4 4 0 0 0 0 0 0 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 11 11 11 13 13 13 3 3 3 0 0 0 6 6 6 3 3 3 -+3 3 3 6 6 6 11 11 11 13 13 13 8 8 8 0 0 0 0 0 0 3 3 3 -+6 6 6 10 10 10 11 11 11 8 8 8 6 6 6 8 8 8 8 8 8 4 4 4 -+6 6 6 31 31 31 37 37 37 20 20 20 10 10 10 19 19 19 24 24 24 19 19 19 -+4 4 4 21 21 21 46 46 46 42 42 42 13 13 13 13 13 13 27 27 27 17 17 17 -+19 19 19 14 14 14 38 38 38 56 56 56 42 42 42 23 23 23 25 25 25 34 34 34 -+28 28 28 32 32 32 42 42 42 71 71 71 76 76 76 54 54 54 45 45 45 38 38 38 -+46 46 46 50 50 50 52 52 52 68 68 68 87 87 87 80 80 80 61 61 61 57 57 57 -+60 60 60 54 54 54 66 66 66 82 82 82 89 89 89 94 94 94 89 89 89 73 73 73 -+75 75 75 70 70 70 92 92 92 109 110 110 109 110 110 94 94 94 84 84 84 99 99 99 -+105 105 105 94 94 94 93 93 93 112 112 113 122 121 126 125 125 127 112 112 113 99 99 99 -+99 99 99 112 112 113 122 121 126 129 129 130 134 134 134 129 129 130 125 125 127 127 127 127 -+127 127 127 121 121 119 125 125 127 137 138 139 144 145 144 145 146 147 139 139 139 125 125 127 -+133 133 133 131 131 131 137 137 137 147 147 148 155 156 156 152 153 154 144 145 144 139 139 139 -+157 157 157 155 156 156 144 145 144 152 153 154 163 163 163 160 161 160 152 153 154 147 147 148 -+155 156 156 149 149 149 155 156 156 166 167 167 166 167 167 166 167 167 158 159 161 152 153 154 -+157 157 157 161 161 162 161 161 162 161 161 162 169 175 167 169 175 167 166 165 167 155 156 156 -+158 159 161 157 157 157 155 156 156 157 157 157 95 95 94 0 3 0 10 16 15 6 13 11 -+10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 -+22 23 26 6 8 11 10 11 14 99 99 99 246 251 251 238 240 244 238 240 244 246 251 251 -+238 240 244 238 240 244 238 240 244 200 220 210 246 251 251 238 240 244 246 251 251 238 240 244 -+246 251 251 238 240 244 238 240 244 246 251 251 246 251 251 238 240 244 238 240 244 246 251 251 -+166 165 167 149 149 149 149 151 153 157 157 157 149 151 153 149 149 149 157 157 157 147 147 148 -+149 149 149 149 149 149 147 147 148 147 147 148 145 146 147 144 145 144 144 145 144 144 145 144 -+142 143 144 137 137 137 137 137 137 140 140 140 139 139 139 133 133 133 133 133 133 137 138 139 -+145 146 147 140 140 140 129 129 130 122 121 126 125 125 127 133 133 133 134 134 134 133 133 133 -+121 121 119 115 116 115 115 116 115 125 122 126 129 129 130 128 128 128 125 125 127 129 129 130 -+112 112 113 105 104 105 103 103 102 103 103 102 101 101 101 96 97 98 103 103 102 117 117 117 -+115 116 115 112 112 113 109 110 110 101 101 101 92 92 92 84 84 84 80 80 80 77 77 77 -+95 95 94 94 94 94 94 94 94 99 99 99 93 93 93 74 74 74 67 67 67 78 78 78 -+85 85 85 84 84 84 87 87 87 87 87 87 78 78 78 75 75 75 77 77 77 78 78 78 -+75 75 75 67 67 67 57 57 57 51 51 51 42 42 42 37 37 37 49 49 49 66 66 66 -+68 68 68 58 58 58 48 48 48 48 48 48 42 42 42 37 37 37 46 46 46 48 48 48 -+57 57 57 57 57 57 45 45 45 46 46 46 56 56 56 58 58 58 54 54 54 48 48 48 -+48 48 48 21 21 21 31 31 31 56 56 56 56 56 56 51 51 51 56 56 56 53 53 53 -+57 57 57 36 36 36 17 17 17 24 24 24 29 29 29 37 37 37 48 48 48 43 43 43 -+42 42 42 40 40 40 40 40 40 42 42 42 40 40 40 38 38 38 38 38 38 40 40 40 -+43 43 43 42 42 42 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 -+40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 28 28 28 13 13 13 -+20 20 20 8 8 8 13 13 13 27 27 27 34 34 34 38 38 38 32 32 32 17 17 17 -+13 13 13 14 14 14 20 20 20 36 36 36 34 34 34 14 14 14 25 25 25 42 42 42 -+27 27 27 17 17 17 11 11 11 13 13 13 11 11 11 8 8 8 25 25 25 49 49 49 -+43 43 43 44 44 44 42 42 42 40 40 40 45 45 45 51 51 51 51 51 51 46 46 46 -+38 38 38 37 37 37 39 39 39 45 45 45 45 45 45 39 39 39 38 38 38 42 42 42 -+25 25 25 17 17 17 20 20 20 32 32 32 37 37 37 40 40 40 44 44 44 43 43 43 -+48 48 48 43 43 43 37 37 37 28 28 28 17 17 17 10 10 10 11 11 11 17 17 17 -+28 28 28 31 31 31 24 24 24 10 10 10 6 6 6 16 16 16 17 17 17 10 10 10 -+16 16 16 10 10 10 16 16 16 31 31 31 39 39 39 39 39 39 37 37 37 38 38 38 -+38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 -+ -+16 16 16 23 23 23 19 19 19 27 27 27 43 43 43 32 32 32 13 13 13 21 21 21 -+20 20 20 21 21 21 14 14 14 6 6 6 16 16 16 28 28 28 20 20 20 0 0 0 -+0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 20 20 20 31 31 31 10 10 10 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 14 14 28 28 28 32 32 32 -+8 8 8 0 0 0 0 0 0 6 6 6 8 8 8 0 0 0 0 0 0 6 6 6 -+3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 4 4 4 8 8 8 10 10 10 10 10 10 8 8 8 6 6 6 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 10 10 10 13 13 13 4 4 4 0 0 0 4 4 4 3 3 3 -+3 3 3 4 4 4 8 8 8 10 10 10 8 8 8 4 4 4 6 6 6 10 10 10 -+16 16 16 11 11 11 8 8 8 8 8 8 6 6 6 3 3 3 3 3 3 6 6 6 -+34 34 34 33 33 33 20 20 20 3 3 3 10 10 10 27 27 27 23 23 23 0 0 0 -+16 16 16 44 44 44 38 38 38 14 14 14 14 14 14 17 17 17 14 14 14 21 21 21 -+16 16 16 38 38 38 54 54 54 42 42 42 19 19 19 25 25 25 37 37 37 28 28 28 -+32 32 32 33 33 33 40 40 40 70 70 70 75 75 75 53 53 53 45 45 45 42 42 42 -+48 48 48 43 43 43 45 45 45 69 69 69 90 90 90 78 78 78 54 54 54 51 51 51 -+59 59 59 63 63 63 56 56 56 68 68 68 99 99 99 99 99 99 73 73 73 66 66 66 -+77 77 77 87 87 87 96 96 96 87 87 87 91 91 91 109 110 110 109 110 110 103 103 102 -+99 99 99 84 84 84 87 87 87 105 105 105 121 121 119 125 122 126 115 116 115 99 99 99 -+112 112 113 117 117 117 115 116 115 112 112 113 125 125 127 137 137 137 134 134 134 128 128 128 -+121 121 119 115 116 115 121 121 119 131 131 131 139 139 139 145 146 147 144 145 144 131 131 131 -+131 131 131 129 129 130 129 129 130 137 137 137 145 146 147 152 153 154 149 151 153 144 145 144 -+157 157 157 155 156 156 140 140 140 142 143 144 155 156 156 161 161 162 161 161 162 152 153 154 -+149 151 153 149 149 149 157 157 157 163 163 163 166 165 167 166 167 167 163 163 163 157 157 157 -+152 153 154 158 159 161 157 157 157 158 159 161 166 167 167 169 175 167 166 167 167 163 163 163 -+157 157 157 157 157 157 157 157 157 134 134 134 38 40 39 10 16 15 6 13 11 6 13 11 -+10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 -+1 3 7 20 21 24 14 16 19 6 8 11 180 183 185 238 240 244 238 240 244 238 240 244 -+238 240 244 238 240 244 231 224 220 180 183 185 180 183 185 200 220 210 238 240 244 238 240 244 -+238 240 244 238 240 244 246 251 251 238 240 244 238 240 244 246 251 251 246 251 251 238 240 244 -+180 183 185 147 147 148 157 157 157 147 147 148 149 149 149 157 157 157 142 143 144 152 153 154 -+147 147 148 147 147 148 145 146 147 144 145 144 144 145 144 142 143 144 142 143 144 142 143 144 -+140 140 140 137 137 137 137 137 137 137 138 139 139 139 139 137 137 137 131 131 131 129 129 130 -+137 137 137 142 143 144 142 143 144 129 129 130 121 121 119 121 121 119 128 128 128 133 133 133 -+128 128 128 117 117 117 109 110 110 112 112 113 125 122 126 129 129 130 129 129 130 122 121 126 -+105 105 105 103 103 102 103 103 102 105 104 105 101 101 101 96 97 98 105 105 105 115 116 115 -+109 110 110 112 112 113 109 110 110 99 99 99 85 85 85 78 78 78 82 82 82 87 87 87 -+103 103 102 93 93 93 93 93 93 93 93 93 78 78 78 69 69 69 78 78 78 92 92 92 -+82 82 82 80 80 80 87 87 87 88 88 88 82 82 82 78 78 78 81 81 81 77 77 77 -+71 71 71 53 53 53 42 42 42 50 50 50 60 60 60 63 63 63 62 62 62 65 65 65 -+65 65 65 60 60 60 54 54 54 58 58 58 46 46 46 33 33 33 38 38 38 29 29 29 -+43 43 43 42 42 42 38 38 38 45 45 45 45 45 45 51 51 51 57 57 57 36 36 36 -+42 42 42 24 24 24 29 29 29 42 42 42 40 40 40 40 40 40 43 43 43 36 36 36 -+39 39 39 32 32 32 23 23 23 32 32 32 33 33 33 32 32 32 44 44 44 43 43 43 -+48 48 48 38 38 38 28 28 28 25 25 25 25 25 25 28 28 28 36 36 36 45 45 45 -+39 39 39 40 40 40 42 42 42 43 43 43 43 43 43 43 43 43 42 42 42 39 39 39 -+42 42 42 43 43 43 42 42 42 40 40 40 40 40 40 37 37 37 25 25 25 14 14 14 -+21 21 21 8 8 8 17 17 17 34 34 34 37 37 37 32 32 32 23 23 23 4 4 4 -+13 13 13 16 16 16 17 17 17 34 34 34 36 36 36 31 31 31 33 33 33 33 33 33 -+14 14 14 10 10 10 11 11 11 17 17 17 11 11 11 10 10 10 25 25 25 45 45 45 -+42 42 42 45 45 45 44 44 44 38 38 38 37 37 37 44 44 44 49 49 49 50 50 50 -+43 43 43 37 37 37 39 39 39 50 50 50 54 54 54 49 49 49 43 43 43 42 42 42 -+40 40 40 29 29 29 19 19 19 24 24 24 38 38 38 42 42 42 42 42 42 49 49 49 -+54 54 54 49 49 49 37 37 37 21 21 21 10 10 10 10 10 10 16 16 16 21 21 21 -+33 33 33 24 24 24 13 13 13 6 6 6 11 11 11 16 16 16 16 16 16 11 11 11 -+13 13 13 14 14 14 25 25 25 39 39 39 44 44 44 40 40 40 38 38 38 42 42 42 -+39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 -+ -+14 14 14 20 20 20 17 17 17 19 19 19 33 33 33 39 39 39 29 29 29 19 19 19 -+11 11 11 11 11 11 4 4 4 0 0 0 6 6 6 20 20 20 27 27 27 24 24 24 -+0 0 0 0 0 0 4 4 4 8 8 8 0 0 0 3 3 3 19 19 19 28 28 28 -+13 13 13 0 0 0 0 0 0 4 4 4 3 3 3 0 0 0 4 4 4 23 23 23 -+28 28 28 10 10 10 0 0 0 0 0 0 4 4 4 3 3 3 0 0 0 0 0 0 -+4 4 4 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+10 10 10 11 11 11 14 14 14 17 17 17 17 17 17 17 17 17 16 16 16 14 14 14 -+16 16 16 13 13 13 8 8 8 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 8 8 8 13 13 13 4 4 4 0 0 0 4 4 4 3 3 3 -+4 4 4 0 0 0 0 0 0 0 0 0 6 6 6 14 14 14 19 19 19 19 19 19 -+8 8 8 6 6 6 4 4 4 4 4 4 3 3 3 4 4 4 17 17 17 29 29 29 -+34 34 34 20 20 20 8 8 8 10 10 10 19 19 19 21 21 21 19 19 19 14 14 14 -+45 45 45 33 33 33 14 14 14 6 6 6 17 17 17 21 21 21 17 17 17 16 16 16 -+36 36 36 50 50 50 40 40 40 21 21 21 24 24 24 31 31 31 28 28 28 27 27 27 -+34 34 34 45 45 45 68 68 68 46 46 46 46 46 46 69 69 69 52 52 52 49 49 49 -+42 42 42 38 38 38 68 68 68 75 75 75 53 53 53 65 65 65 80 80 80 54 54 54 -+56 56 56 53 53 53 71 71 71 85 85 85 82 82 82 87 87 87 91 91 91 81 81 81 -+84 84 84 101 101 101 80 80 80 75 75 75 85 85 85 99 99 99 121 121 119 101 101 101 -+85 85 85 87 87 87 103 103 102 109 110 110 109 110 110 109 110 110 121 121 119 121 121 119 -+117 117 117 115 116 115 105 105 105 101 101 101 115 116 115 133 133 133 137 137 137 128 128 128 -+112 112 113 121 121 119 128 128 128 128 128 128 128 128 128 134 134 134 144 145 144 147 147 148 -+131 131 131 131 131 131 129 129 130 129 129 130 134 134 134 144 145 144 152 153 154 155 156 156 -+155 156 156 157 157 157 142 143 144 137 138 139 144 145 144 152 153 154 161 161 162 161 161 162 -+145 146 147 149 151 153 161 161 162 163 163 163 157 157 157 158 159 161 166 165 167 166 167 167 -+157 157 157 152 153 154 152 153 154 161 161 162 166 167 167 166 167 167 166 165 167 169 175 167 -+160 161 160 152 153 154 161 161 162 85 85 85 2 8 7 14 20 19 10 16 15 2 8 7 -+10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 -+6 8 11 6 8 11 14 16 19 10 11 14 46 47 50 231 224 220 238 240 244 246 251 251 -+246 251 251 246 251 251 238 240 244 238 240 244 200 220 210 231 224 220 246 251 251 238 240 244 -+238 240 244 252 251 251 238 240 244 238 240 244 246 251 251 238 240 244 238 240 244 200 220 210 -+231 224 220 200 220 210 147 147 148 145 146 147 152 153 154 152 153 154 142 143 144 152 153 154 -+145 146 147 144 145 144 144 145 144 144 145 144 142 143 144 140 140 140 140 140 140 140 140 140 -+137 138 139 139 139 139 137 137 137 134 134 134 133 133 133 133 133 133 131 131 131 129 129 130 -+125 122 126 134 134 134 142 143 144 137 137 137 125 122 126 115 116 115 117 117 117 121 121 119 -+133 133 133 127 127 127 115 116 115 115 116 115 121 121 119 129 129 130 129 129 130 115 116 115 -+105 104 105 103 103 102 101 101 101 103 103 102 99 99 99 99 99 99 109 110 110 109 110 110 -+105 105 105 109 110 110 105 105 105 94 94 94 80 80 80 76 76 76 85 85 85 96 96 96 -+101 101 101 99 99 99 96 96 96 82 82 82 65 65 65 73 73 73 91 91 91 91 91 91 -+83 83 83 77 77 77 83 83 83 88 88 88 85 85 85 85 85 85 80 80 80 65 65 65 -+53 53 53 49 49 49 53 53 53 65 65 65 69 69 69 59 59 59 43 43 43 32 32 32 -+33 33 33 32 32 32 27 27 27 34 34 34 28 28 28 27 27 27 45 45 45 36 36 36 -+25 25 25 16 16 16 23 23 23 40 40 40 32 32 32 33 33 33 50 50 50 24 24 24 -+24 24 24 17 17 17 16 16 16 16 16 16 11 11 11 11 11 11 13 13 13 8 8 8 -+6 6 6 23 23 23 25 25 25 33 33 33 25 25 25 17 17 17 38 38 38 43 43 43 -+42 42 42 29 29 29 19 19 19 17 17 17 17 17 17 19 19 19 27 27 27 36 36 36 -+37 37 37 39 39 39 40 40 40 38 38 38 38 38 38 39 39 39 38 38 38 34 34 34 -+37 37 37 39 39 39 36 36 36 34 34 34 37 37 37 32 32 32 21 21 21 16 16 16 -+14 14 14 13 13 13 28 28 28 38 38 38 29 29 29 19 19 19 16 16 16 10 10 10 -+13 13 13 11 11 11 8 8 8 33 33 33 38 38 38 38 38 38 29 29 29 10 10 10 -+10 10 10 8 8 8 13 13 13 13 13 13 8 8 8 14 14 14 31 31 31 39 39 39 -+46 46 46 51 51 51 51 51 51 44 44 44 39 39 39 40 40 40 48 48 48 53 53 53 -+49 49 49 45 45 45 39 39 39 37 37 37 43 43 43 48 48 48 43 43 43 34 34 34 -+37 37 37 33 33 33 27 27 27 32 32 32 43 43 43 40 40 40 33 33 33 37 37 37 -+39 39 39 40 40 40 33 33 33 17 17 17 8 8 8 16 16 16 28 28 28 33 33 33 -+23 23 23 16 16 16 13 13 13 16 16 16 16 16 16 13 13 13 11 11 11 14 14 14 -+14 14 14 27 27 27 36 36 36 34 34 34 33 33 33 36 36 36 34 34 34 29 29 29 -+34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 -+ -+20 20 20 10 10 10 21 21 21 25 25 25 14 14 14 29 29 29 40 40 40 23 23 23 -+10 10 10 0 0 0 0 0 0 4 4 4 6 6 6 0 0 0 17 17 17 38 38 38 -+8 8 8 16 16 16 0 0 0 0 0 0 11 11 11 0 0 0 0 0 0 24 24 24 -+28 28 28 13 13 13 3 3 3 6 6 6 4 4 4 0 0 0 0 0 0 3 3 3 -+23 23 23 20 20 20 10 10 10 0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 8 8 8 10 10 10 -+17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 -+20 20 20 19 19 19 16 16 16 13 13 13 8 8 8 3 3 3 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 0 0 0 6 6 6 13 13 13 6 6 6 0 0 0 4 4 4 3 3 3 -+6 6 6 3 3 3 0 0 0 0 0 0 10 10 10 23 23 23 23 23 23 13 13 13 -+0 0 0 0 0 0 0 0 0 0 0 0 6 6 6 19 19 19 31 31 31 36 36 36 -+3 3 3 0 0 0 4 4 4 17 17 17 20 20 20 20 20 20 29 29 29 44 44 44 -+44 44 44 10 10 10 6 6 6 19 19 19 11 11 11 16 16 16 31 31 31 25 25 25 -+48 48 48 36 36 36 19 19 19 23 23 23 33 33 33 25 25 25 20 20 20 34 34 34 -+42 42 42 65 65 65 46 46 46 38 38 38 37 37 37 45 45 45 69 69 69 52 52 52 -+40 40 40 69 69 69 70 70 70 52 52 52 52 52 52 61 61 61 69 69 69 82 82 82 -+63 63 63 52 52 52 84 84 84 96 96 96 67 67 67 77 77 77 105 104 105 92 92 92 -+103 103 102 82 82 82 88 88 88 82 82 82 90 90 90 105 105 105 96 97 98 112 112 113 -+90 90 90 93 93 93 109 110 110 101 101 101 91 91 91 94 94 94 117 117 117 125 125 127 -+115 116 115 105 104 105 99 99 99 105 105 105 117 117 117 125 122 126 129 129 130 137 137 137 -+127 127 127 128 128 128 127 127 127 121 121 119 121 121 119 125 125 127 134 134 134 147 147 148 -+140 140 140 134 134 134 131 131 131 129 129 130 131 131 131 137 137 137 144 145 144 152 153 154 -+155 156 156 157 157 157 144 145 144 139 139 139 140 140 140 142 143 144 152 153 154 157 157 157 -+152 153 154 152 153 154 158 159 161 163 163 163 157 157 157 152 153 154 157 157 157 161 161 162 -+161 161 162 155 156 156 149 151 153 158 159 161 166 167 167 166 165 167 160 161 160 166 165 167 -+161 161 162 155 156 156 139 139 139 32 34 33 4 4 4 10 16 15 6 13 11 6 13 11 -+10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 -+10 11 14 16 20 21 0 0 4 14 16 19 24 25 28 118 122 119 238 240 244 238 240 244 -+238 240 244 238 240 244 238 240 244 246 251 251 200 220 210 180 183 185 200 220 210 238 240 244 -+238 240 244 246 251 251 238 240 244 246 251 251 238 240 244 200 220 210 200 220 210 238 240 244 -+238 240 244 246 251 251 169 175 167 142 143 144 152 153 154 140 140 140 149 149 149 147 147 148 -+144 145 144 144 145 144 144 145 144 142 143 144 140 140 140 140 140 140 139 139 139 137 138 139 -+137 137 137 137 137 137 134 134 134 133 133 133 129 129 130 128 128 128 128 128 128 129 129 130 -+122 121 126 125 125 127 129 129 130 133 133 133 129 129 130 122 121 126 117 117 117 115 116 115 -+127 127 127 128 128 128 127 127 127 128 128 128 127 127 127 127 127 127 127 127 127 109 110 110 -+103 103 102 105 104 105 99 99 99 99 99 99 96 96 96 103 103 102 115 116 115 105 105 105 -+105 105 105 105 105 105 101 101 101 88 88 88 77 77 77 77 77 77 88 88 88 99 99 99 -+96 97 98 101 101 101 92 92 92 71 71 71 66 66 66 82 82 82 92 92 92 87 87 87 -+87 87 87 80 80 80 81 81 81 80 80 80 73 73 73 76 76 76 72 72 72 52 52 52 -+44 44 44 58 58 58 72 72 72 75 75 75 63 63 63 45 45 45 32 32 32 28 28 28 -+25 25 25 28 28 28 19 19 19 23 23 23 16 16 16 25 25 25 52 52 52 42 42 42 -+25 25 25 25 25 25 29 29 29 39 39 39 24 24 24 29 29 29 50 50 50 23 23 23 -+17 17 17 21 21 21 19 19 19 11 11 11 8 8 8 6 6 6 10 10 10 20 20 20 -+27 27 27 43 43 43 37 37 37 34 34 34 21 21 21 13 13 13 38 38 38 43 43 43 -+33 33 33 23 23 23 17 17 17 21 21 21 21 21 21 17 17 17 17 17 17 24 24 24 -+34 34 34 37 37 37 34 34 34 29 29 29 27 27 27 29 29 29 29 29 29 25 25 25 -+27 27 27 29 29 29 25 25 25 25 25 25 31 31 31 25 25 25 16 16 16 14 14 14 -+16 16 16 25 25 25 36 36 36 31 31 31 17 17 17 11 11 11 13 13 13 14 14 14 -+13 13 13 13 13 13 13 13 13 38 38 38 33 33 33 28 28 28 19 19 19 4 4 4 -+11 11 11 11 11 11 14 14 14 10 10 10 10 10 10 27 27 27 37 37 37 29 29 29 -+14 14 14 17 17 17 19 19 19 19 19 19 13 13 13 11 11 11 17 17 17 24 24 24 -+42 42 42 34 34 34 23 23 23 16 16 16 17 17 17 24 24 24 27 27 27 24 24 24 -+17 17 17 19 19 19 28 28 28 33 33 33 29 29 29 24 24 24 20 20 20 14 14 14 -+20 20 20 25 25 25 21 21 21 13 13 13 14 14 14 25 25 25 32 32 32 32 32 32 -+14 14 14 11 11 11 13 13 13 17 17 17 16 16 16 11 11 11 11 11 11 14 14 14 -+21 21 21 28 28 28 28 28 28 21 21 21 17 17 17 20 20 20 20 20 20 14 14 14 -+21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 -+ -+14 14 14 23 23 23 19 19 19 19 19 19 23 23 23 17 17 17 21 21 21 44 44 44 -+11 11 11 8 8 8 4 4 4 0 0 0 0 0 0 0 0 0 6 6 6 19 19 19 -+40 40 40 13 13 13 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 -+21 21 21 19 19 19 8 8 8 0 0 0 0 0 0 4 4 4 6 6 6 0 0 0 -+0 0 0 23 23 23 28 28 28 10 10 10 0 0 0 0 0 0 6 6 6 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 6 6 13 13 13 16 16 16 -+21 21 21 19 19 19 16 16 16 13 13 13 11 11 11 11 11 11 13 13 13 14 14 14 -+19 19 19 19 19 19 20 20 20 19 19 19 16 16 16 10 10 10 4 4 4 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 0 0 0 4 4 4 13 13 13 6 6 6 0 0 0 4 4 4 3 3 3 -+6 6 6 6 6 6 3 3 3 3 3 3 17 17 17 28 28 28 19 19 19 0 0 0 -+3 3 3 8 8 8 6 6 6 3 3 3 14 14 14 31 31 31 31 31 31 19 19 19 -+10 10 10 13 13 13 14 14 14 13 13 13 13 13 13 20 20 20 29 29 29 37 37 37 -+4 4 4 14 14 14 14 14 14 14 14 14 17 17 17 11 11 11 23 23 23 52 52 52 -+39 39 39 20 20 20 20 20 20 28 28 28 23 23 23 23 23 23 32 32 32 36 36 36 -+70 70 70 39 39 39 29 29 29 32 32 32 36 36 36 37 37 37 43 43 43 69 69 69 -+71 71 71 69 69 69 57 57 57 49 49 49 54 54 54 59 59 59 70 70 70 89 89 89 -+85 85 85 94 94 94 93 93 93 90 90 90 91 91 91 90 90 90 93 93 93 105 104 105 -+105 104 105 101 101 101 92 92 92 103 103 102 105 105 105 103 103 102 109 110 110 109 110 110 -+117 117 117 109 110 110 109 110 110 96 96 96 91 91 91 99 99 99 121 121 119 117 117 117 -+129 129 130 112 112 113 109 110 110 122 121 126 121 121 119 105 105 105 109 110 110 127 127 127 -+144 145 144 131 131 131 115 116 115 112 112 113 121 121 119 121 121 119 122 121 126 134 134 134 -+152 153 154 139 139 139 129 129 130 131 131 131 133 133 133 131 131 131 134 134 134 144 145 144 -+157 157 157 155 156 156 140 140 140 140 140 140 142 143 144 139 139 139 144 145 144 149 149 149 -+166 167 167 155 156 156 155 156 156 163 163 163 157 157 157 149 149 149 147 147 148 149 149 149 -+166 167 167 163 163 163 155 156 156 155 156 156 166 165 167 166 167 167 157 157 157 149 151 153 -+161 161 162 158 159 161 103 103 102 0 3 0 10 13 11 20 21 24 2 8 7 10 16 15 -+10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 10 11 14 -+14 16 19 6 8 11 16 20 21 8 10 13 43 44 47 43 44 47 180 183 185 238 240 244 -+246 251 251 246 251 251 246 251 251 238 240 244 238 240 244 180 183 185 187 210 182 231 246 232 -+238 240 244 238 240 244 246 251 251 231 224 220 200 220 210 238 240 244 238 240 244 238 240 244 -+246 251 251 238 240 244 231 224 220 129 129 130 144 145 144 144 145 144 142 143 144 149 149 149 -+144 145 144 144 145 144 142 143 144 140 140 140 140 140 140 139 139 139 137 138 139 137 137 137 -+137 137 137 133 133 133 129 129 130 133 133 133 133 133 133 128 128 128 127 127 127 127 127 127 -+129 129 130 121 121 119 117 117 117 127 127 127 134 134 134 133 133 133 121 121 119 112 112 113 -+109 110 110 121 121 119 128 128 128 134 134 134 127 127 127 117 117 117 121 121 119 105 105 105 -+103 103 102 105 104 105 96 97 98 94 94 94 94 94 94 105 104 105 117 117 117 105 105 105 -+109 110 110 103 103 102 94 94 94 84 84 84 77 77 77 80 80 80 90 90 90 99 99 99 -+93 93 93 96 97 98 83 83 83 68 68 68 75 75 75 87 87 87 87 87 87 87 87 87 -+90 90 90 83 83 83 80 80 80 68 68 68 53 53 53 59 59 59 63 63 63 49 49 49 -+58 58 58 68 68 68 74 74 74 66 66 66 48 48 48 33 33 33 28 28 28 28 28 28 -+21 21 21 31 31 31 27 27 27 31 31 31 23 23 23 29 29 29 52 52 52 34 34 34 -+25 25 25 42 42 42 39 39 39 29 29 29 10 10 10 25 25 25 48 48 48 10 10 10 -+10 10 10 21 21 21 19 19 19 14 14 14 14 14 14 11 11 11 17 17 17 38 38 38 -+40 40 40 48 48 48 25 25 25 17 17 17 13 13 13 17 17 17 45 45 45 46 46 46 -+37 37 37 25 25 25 19 19 19 21 21 21 23 23 23 17 17 17 19 19 19 25 25 25 -+34 34 34 34 34 34 29 29 29 20 20 20 17 17 17 20 20 20 21 21 21 19 19 19 -+17 17 17 20 20 20 16 16 16 16 16 16 24 24 24 20 20 20 11 11 11 14 14 14 -+25 25 25 38 38 38 38 38 38 21 21 21 8 8 8 11 11 11 13 13 13 10 10 10 -+13 13 13 17 17 17 24 24 24 45 45 45 24 24 24 10 10 10 13 13 13 20 20 20 -+11 11 11 13 13 13 14 14 14 10 10 10 17 17 17 38 38 38 40 40 40 19 19 19 -+16 16 16 16 16 16 20 20 20 27 27 27 28 28 28 24 24 24 27 27 27 33 33 33 -+38 38 38 27 27 27 23 23 23 28 28 28 27 27 27 19 19 19 20 20 20 31 31 31 -+29 29 29 25 25 25 38 38 38 37 37 37 16 16 16 17 17 17 32 32 32 27 27 27 -+20 20 20 20 20 20 14 14 14 10 10 10 20 20 20 31 31 31 24 24 24 10 10 10 -+16 16 16 13 13 13 10 10 10 10 10 10 11 11 11 14 14 14 14 14 14 13 13 13 -+42 42 42 33 33 33 28 28 28 31 31 31 31 31 31 28 28 28 29 29 29 36 36 36 -+29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 -+ -+28 28 28 14 14 14 17 17 17 20 20 20 6 6 6 4 4 4 13 13 13 13 13 13 -+48 48 48 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 -+14 14 14 37 37 37 21 21 21 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 -+0 0 0 21 21 21 27 27 27 11 11 11 0 0 0 0 0 0 6 6 6 4 4 4 -+3 3 3 4 4 4 16 16 16 25 25 25 16 16 16 0 0 0 0 0 0 8 8 8 -+0 0 0 3 3 3 3 3 3 0 0 0 3 3 3 11 11 11 17 17 17 17 17 17 -+19 19 19 11 11 11 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 -+6 6 6 0 0 0 0 0 0 11 11 11 23 23 23 20 20 20 6 6 6 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+6 6 6 0 0 0 0 0 0 11 11 11 14 14 14 8 8 8 3 3 3 3 3 3 -+6 6 6 0 0 0 6 6 6 29 29 29 25 25 25 8 8 8 3 3 3 3 3 3 -+10 10 10 10 10 10 0 0 0 11 11 11 33 33 33 33 33 33 11 11 11 0 0 0 -+8 8 8 3 3 3 8 8 8 17 17 17 21 21 21 19 19 19 14 14 14 14 14 14 -+16 16 16 6 6 6 16 16 16 17 17 17 11 11 11 34 34 34 53 53 53 43 43 43 -+21 21 21 28 28 28 24 24 24 21 21 21 27 27 27 28 28 28 39 39 39 65 65 65 -+36 36 36 36 36 36 34 34 34 32 32 32 33 33 33 37 37 37 43 43 43 48 48 48 -+76 76 76 74 74 74 72 72 72 73 73 73 76 76 76 81 81 81 82 82 82 83 83 83 -+93 93 93 89 89 89 87 87 87 88 88 88 91 91 91 95 95 94 96 97 98 96 96 96 -+105 104 105 105 105 105 105 104 105 103 103 102 101 101 101 101 101 101 105 104 105 105 105 105 -+109 110 110 121 121 119 115 116 115 109 110 110 112 112 113 117 117 117 112 112 113 109 110 110 -+115 116 115 127 127 127 127 127 127 112 112 113 103 103 102 105 104 105 112 112 113 117 117 117 -+127 127 127 134 134 134 131 131 131 117 117 117 112 112 113 122 121 126 127 127 127 121 121 119 -+133 133 133 147 147 148 147 147 148 133 133 133 122 121 126 129 129 130 137 137 137 137 137 137 -+149 151 153 157 157 157 152 153 154 137 137 137 140 140 140 134 134 134 142 143 144 142 143 144 -+145 146 147 152 153 154 163 163 163 161 161 162 161 161 162 144 145 144 145 146 147 147 147 148 -+149 149 149 158 159 161 166 167 167 157 157 157 163 163 163 166 165 167 161 161 162 149 149 149 -+145 146 147 152 153 154 37 39 42 6 8 11 14 16 19 14 16 19 10 11 14 6 8 11 -+10 11 14 11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 14 16 19 -+11 11 11 11 11 11 8 8 8 24 24 24 48 48 48 52 52 52 73 73 73 231 224 220 -+238 240 244 246 251 251 238 240 244 238 240 244 238 240 244 238 240 244 200 220 210 238 240 244 -+246 251 251 231 224 220 200 220 210 231 224 220 238 240 244 238 240 244 238 240 244 238 240 244 -+252 251 251 200 220 210 160 161 160 147 147 148 144 145 144 137 137 137 144 145 144 144 145 144 -+142 143 144 140 140 140 140 140 140 140 140 140 137 138 139 137 137 137 137 137 137 137 137 137 -+134 134 134 133 133 133 129 129 130 129 129 130 128 128 128 127 127 127 125 125 127 122 121 126 -+121 121 119 121 121 119 121 121 119 121 121 119 121 121 119 133 133 133 131 131 131 115 116 115 -+115 116 115 125 125 127 127 127 127 127 127 127 128 128 128 125 122 126 112 112 113 105 105 105 -+101 101 101 101 101 101 99 99 99 96 97 98 101 101 101 109 110 110 112 112 113 109 110 110 -+109 110 110 105 105 105 87 87 87 81 81 81 81 81 81 83 83 83 96 97 98 101 101 101 -+96 97 98 87 87 87 72 72 72 73 73 73 87 87 87 85 85 85 77 77 77 81 81 81 -+66 66 66 82 82 82 90 90 90 57 57 57 46 46 46 46 46 46 50 50 50 48 48 48 -+68 68 68 57 57 57 68 68 68 75 75 75 69 69 69 56 56 56 32 32 32 21 21 21 -+27 27 27 23 23 23 25 25 25 27 27 27 19 19 19 16 16 16 51 51 51 33 33 33 -+37 37 37 43 43 43 20 20 20 13 13 13 21 21 21 36 36 36 46 46 46 16 16 16 -+13 13 13 20 20 20 21 21 21 14 14 14 16 16 16 29 29 29 42 42 42 45 45 45 -+49 49 49 43 43 43 17 17 17 19 19 19 17 17 17 20 20 20 45 45 45 40 40 40 -+38 38 38 25 25 25 17 17 17 21 21 21 23 23 23 20 20 20 23 23 23 32 32 32 -+36 36 36 36 36 36 34 34 34 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 -+36 36 36 32 32 32 36 36 36 38 38 38 44 44 44 38 38 38 20 20 20 24 24 24 -+45 45 45 25 25 25 17 17 17 29 29 29 13 13 13 16 16 16 11 11 11 4 4 4 -+13 13 13 28 28 28 44 44 44 50 50 50 17 17 17 11 11 11 10 10 10 8 8 8 -+14 14 14 10 10 10 8 8 8 27 27 27 33 33 33 38 38 38 51 51 51 50 50 50 -+40 40 40 34 34 34 34 34 34 44 44 44 52 52 52 49 49 49 40 40 40 34 34 34 -+37 37 37 42 42 42 50 50 50 53 53 53 45 45 45 36 36 36 37 37 37 44 44 44 -+44 44 44 44 44 44 39 39 39 28 28 28 20 20 20 25 25 25 42 42 42 54 54 54 -+42 42 42 21 21 21 11 11 11 25 25 25 33 33 33 24 24 24 13 13 13 13 13 13 -+11 11 11 10 10 10 13 13 13 14 14 14 8 8 8 4 4 4 19 19 19 36 36 36 -+38 38 38 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 39 39 39 -+40 40 40 39 39 39 38 38 38 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 -+ -+46 46 46 36 36 36 13 13 13 4 4 4 10 10 10 0 0 0 0 0 0 8 8 8 -+10 10 10 48 48 48 4 4 4 3 3 3 0 0 0 0 0 0 3 3 3 0 0 0 -+0 0 0 21 21 21 36 36 36 19 19 19 0 0 0 0 0 0 8 8 8 3 3 3 -+0 0 0 0 0 0 16 16 16 24 24 24 19 19 19 3 3 3 0 0 0 0 0 0 -+0 0 0 0 0 0 8 8 8 19 19 19 24 24 24 20 20 20 8 8 8 0 0 0 -+3 3 3 4 4 4 0 0 0 0 0 0 3 3 3 19 19 19 23 23 23 17 17 17 -+10 10 10 4 4 4 0 0 0 0 0 0 6 6 6 11 11 11 13 13 13 11 11 11 -+8 8 8 10 10 10 6 6 6 6 6 6 14 14 14 19 19 19 11 11 11 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 0 0 0 0 0 0 0 0 0 8 8 8 13 13 13 11 11 11 10 10 10 -+0 0 0 4 4 4 24 24 24 31 31 31 17 17 17 0 0 0 0 0 0 3 3 3 -+0 0 0 0 0 0 10 10 10 28 28 28 31 31 31 20 20 20 10 10 10 6 6 6 -+13 13 13 10 10 10 10 10 10 16 16 16 20 20 20 19 19 19 11 11 11 6 6 6 -+8 8 8 21 21 21 14 14 14 3 3 3 25 25 25 49 49 49 42 42 42 20 20 20 -+27 27 27 14 14 14 23 23 23 25 25 25 17 17 17 36 36 36 53 53 53 42 42 42 -+32 32 32 31 31 31 29 29 29 32 32 32 40 40 40 54 54 54 69 69 69 80 80 80 -+76 76 76 77 77 77 78 78 78 78 78 78 78 78 78 81 81 81 83 83 83 85 85 85 -+87 87 87 89 89 89 89 89 89 87 87 87 89 89 89 96 96 96 96 96 96 92 92 92 -+92 92 92 96 97 98 103 103 102 103 103 102 101 101 101 101 101 101 105 105 105 112 112 113 -+109 110 110 115 116 115 115 116 115 112 112 113 117 117 117 117 117 117 112 112 113 115 116 115 -+121 121 119 128 128 128 127 127 127 115 116 115 103 103 102 105 105 105 115 116 115 121 121 119 -+112 112 113 122 121 126 133 133 133 129 129 130 121 121 119 115 116 115 117 117 117 122 121 126 -+125 125 127 134 134 134 144 145 144 140 140 140 131 131 131 128 128 128 131 131 131 137 138 139 -+149 149 149 149 149 149 152 153 154 147 147 148 147 147 148 131 131 131 134 134 134 144 145 144 -+140 140 140 145 146 147 157 157 157 160 161 160 160 161 160 145 146 147 145 146 147 144 145 144 -+147 147 148 149 151 153 161 161 162 157 157 157 163 163 163 160 161 160 155 156 156 144 145 144 -+145 146 147 96 98 100 11 13 16 8 10 13 8 10 13 8 10 13 1 3 7 11 13 16 -+8 10 13 8 10 13 8 10 13 8 10 13 8 10 13 8 10 13 8 10 13 8 10 13 -+16 16 16 16 16 16 16 16 16 43 43 43 52 52 52 44 44 44 36 36 36 125 125 127 -+252 251 251 238 240 244 238 240 244 238 240 244 238 240 244 252 251 251 169 175 167 180 183 185 -+180 183 185 231 224 220 246 251 251 238 240 244 238 240 244 246 251 251 238 240 244 246 251 251 -+161 161 162 140 140 140 133 133 133 144 145 144 144 145 144 137 138 139 144 145 144 140 140 140 -+140 140 140 139 139 139 137 138 139 137 137 137 137 137 137 134 134 134 134 134 134 134 134 134 -+129 129 130 129 129 130 129 129 130 129 129 130 129 129 130 128 128 128 125 125 127 121 121 119 -+121 121 119 121 121 119 117 117 117 115 116 115 112 112 113 121 121 119 128 128 128 122 121 126 -+125 122 126 128 128 128 127 127 127 125 125 127 128 128 128 125 125 127 109 110 110 101 101 101 -+101 101 101 96 97 98 92 92 92 90 90 90 96 96 96 105 105 105 109 110 110 105 105 105 -+112 112 113 103 103 102 83 83 83 80 80 80 83 83 83 88 88 88 99 99 99 99 99 99 -+93 93 93 88 88 88 82 82 82 83 83 83 88 88 88 84 84 84 66 66 66 46 46 46 -+61 61 61 58 58 58 85 85 85 70 70 70 42 42 42 40 40 40 57 57 57 46 46 46 -+76 76 76 68 68 68 65 65 65 52 52 52 49 49 49 60 60 60 53 53 53 40 40 40 -+28 28 28 31 31 31 36 36 36 32 32 32 21 21 21 23 23 23 59 59 59 46 46 46 -+38 38 38 38 38 38 17 17 17 10 10 10 11 11 11 37 37 37 52 52 52 8 8 8 -+8 8 8 11 11 11 16 16 16 25 25 25 37 37 37 44 44 44 44 44 44 43 43 43 -+42 42 42 37 37 37 16 16 16 20 20 20 17 17 17 19 19 19 40 40 40 34 34 34 -+44 44 44 34 34 34 24 24 24 20 20 20 23 23 23 28 28 28 36 36 36 42 42 42 -+43 43 43 42 42 42 40 40 40 39 39 39 39 39 39 38 38 38 38 38 38 39 39 39 -+36 36 36 38 38 38 40 40 40 36 36 36 39 39 39 42 42 42 36 36 36 42 42 42 -+33 33 33 16 16 16 16 16 16 34 34 34 17 17 17 16 16 16 11 11 11 11 11 11 -+31 31 31 33 33 33 38 38 38 44 44 44 16 16 16 13 13 13 13 13 13 13 13 13 -+14 14 14 16 16 16 24 24 24 38 38 38 28 28 28 19 19 19 39 39 39 53 53 53 -+50 50 50 43 43 43 37 37 37 40 40 40 44 44 44 45 45 45 46 46 46 48 48 48 -+36 36 36 39 39 39 46 46 46 52 52 52 51 51 51 44 44 44 38 38 38 37 37 37 -+45 45 45 50 50 50 50 50 50 42 42 42 28 28 28 23 23 23 33 33 33 45 45 45 -+39 39 39 25 25 25 19 19 19 25 25 25 27 27 27 17 17 17 10 10 10 13 13 13 -+11 11 11 17 17 17 14 14 14 6 6 6 10 10 10 24 24 24 37 37 37 42 42 42 -+39 39 39 40 40 40 40 40 40 42 42 42 42 42 42 42 42 42 40 40 40 40 40 40 -+42 42 42 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 -+ -+28 28 28 43 43 43 28 28 28 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 -+8 8 8 10 10 10 49 49 49 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 21 21 21 38 38 38 21 21 21 0 0 0 0 0 0 8 8 8 -+0 0 0 0 0 0 4 4 4 24 24 24 31 31 31 19 19 19 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 14 14 14 23 23 23 10 10 10 0 0 0 -+0 0 0 3 3 3 0 0 0 0 0 0 6 6 6 21 21 21 24 24 24 16 16 16 -+3 3 3 0 0 0 0 0 0 6 6 6 13 13 13 16 16 16 17 17 17 16 16 16 -+11 11 11 16 16 16 13 13 13 3 3 3 4 4 4 17 17 17 16 16 16 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 13 13 13 14 14 14 10 10 10 -+0 0 0 24 24 24 31 31 31 17 17 17 0 0 0 0 0 0 3 3 3 11 11 11 -+3 3 3 6 6 6 27 27 27 33 33 33 16 16 16 3 3 3 8 8 8 4 4 4 -+8 8 8 11 11 11 14 14 14 16 16 16 17 17 17 16 16 16 13 13 13 10 10 10 -+17 17 17 6 6 6 3 3 3 25 25 25 44 44 44 38 38 38 20 20 20 14 14 14 -+17 17 17 19 19 19 19 19 19 25 25 25 40 40 40 45 45 45 37 37 37 29 29 29 -+28 28 28 37 37 37 49 49 49 60 60 60 67 67 67 71 71 71 74 74 74 75 75 75 -+73 73 73 76 76 76 81 81 81 82 82 82 80 80 80 80 80 80 82 82 82 84 84 84 -+82 82 82 88 88 88 91 91 91 91 91 91 93 93 93 94 94 94 94 94 94 93 93 93 -+101 101 101 103 103 102 105 105 105 105 105 105 105 104 105 103 103 102 105 105 105 105 105 105 -+109 110 110 109 110 110 112 112 113 115 116 115 121 121 119 115 116 115 115 116 115 117 117 117 -+117 117 117 125 122 126 127 127 127 121 121 119 117 117 117 117 117 117 115 116 115 109 110 110 -+105 104 105 109 110 110 122 121 126 134 134 134 133 133 133 121 121 119 115 116 115 121 121 119 -+121 121 119 121 121 119 133 133 133 144 145 144 142 143 144 129 129 130 128 128 128 133 133 133 -+149 149 149 144 145 144 149 149 149 149 149 149 152 153 154 137 137 137 133 133 133 139 139 139 -+137 137 137 140 140 140 152 153 154 157 157 157 157 157 157 147 147 148 144 145 144 142 143 144 -+147 147 148 142 143 144 149 151 153 157 157 157 163 163 163 157 157 157 155 156 156 142 143 144 -+137 137 137 37 39 42 1 3 7 16 20 21 11 13 16 14 16 19 14 16 19 20 21 24 -+11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 11 13 16 10 11 14 10 11 14 -+10 10 10 13 13 13 21 21 21 52 52 52 52 52 52 52 52 52 39 39 39 53 53 53 -+180 183 185 238 240 244 246 251 251 252 251 251 238 240 244 238 240 244 200 220 210 200 220 210 -+246 251 251 238 240 244 231 246 232 246 251 251 246 251 251 238 240 244 200 220 210 112 122 122 -+117 117 117 117 117 117 129 129 130 147 147 148 142 143 144 134 134 134 139 139 139 137 137 137 -+137 137 137 137 137 137 134 134 134 134 134 134 133 133 133 133 133 133 131 131 131 131 131 131 -+129 129 130 129 129 130 129 129 130 129 129 130 129 129 130 127 127 127 121 121 119 121 121 119 -+121 121 119 115 116 115 115 116 115 112 112 113 109 110 110 115 116 115 127 127 127 129 129 130 -+131 131 131 129 129 130 122 121 126 121 121 119 128 128 128 125 122 126 109 110 110 99 99 99 -+101 101 101 99 99 99 94 94 94 95 95 94 103 103 102 109 110 110 109 110 110 105 105 105 -+105 105 105 96 96 96 80 80 80 78 78 78 84 84 84 91 91 91 99 99 99 96 96 96 -+92 92 92 82 82 82 76 76 76 73 73 73 73 73 73 82 82 82 75 75 75 50 50 50 -+42 42 42 57 57 57 87 87 87 83 83 83 73 73 73 52 52 52 48 48 48 52 52 52 -+62 62 62 69 69 69 73 73 73 51 51 51 32 32 32 44 44 44 54 54 54 58 58 58 -+33 33 33 25 25 25 20 20 20 17 17 17 21 21 21 32 32 32 60 60 60 42 42 42 -+25 25 25 24 24 24 14 14 14 10 10 10 11 11 11 42 42 42 57 57 57 10 10 10 -+42 42 42 27 27 27 21 21 21 34 34 34 46 46 46 48 48 48 43 43 43 42 42 42 -+45 45 45 38 38 38 19 19 19 17 17 17 14 14 14 19 19 19 43 43 43 40 40 40 -+40 40 40 37 37 37 29 29 29 23 23 23 25 25 25 34 34 34 40 40 40 43 43 43 -+42 42 42 40 40 40 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 -+38 38 38 42 42 42 43 43 43 32 32 32 37 37 37 44 44 44 36 36 36 38 38 38 -+17 17 17 10 10 10 16 16 16 34 34 34 14 14 14 13 13 13 17 17 17 27 27 27 -+39 39 39 31 31 31 29 29 29 37 37 37 13 13 13 14 14 14 13 13 13 13 13 13 -+3 3 3 31 31 31 40 40 40 32 32 32 13 13 13 17 17 17 40 40 40 42 42 42 -+52 52 52 46 46 46 42 42 42 39 39 39 39 39 39 40 40 40 46 46 46 53 53 53 -+40 40 40 39 39 39 37 37 37 39 39 39 45 45 45 49 49 49 44 44 44 37 37 37 -+39 39 39 45 45 45 52 52 52 49 49 49 34 34 34 20 20 20 24 24 24 36 36 36 -+37 37 37 31 31 31 25 25 25 23 23 23 17 17 17 10 10 10 8 8 8 13 13 13 -+13 13 13 16 16 16 14 14 14 11 11 11 19 19 19 33 33 33 40 40 40 39 39 39 -+38 38 38 39 39 39 39 39 39 40 40 40 40 40 40 39 39 39 39 39 39 38 38 38 -+39 39 39 39 39 39 38 38 38 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 -+ -+0 0 0 21 21 21 40 40 40 24 24 24 0 0 0 0 0 0 11 11 11 0 0 0 -+3 3 3 6 6 6 4 4 4 46 46 46 4 4 4 0 0 0 0 0 0 0 0 0 -+6 6 6 0 0 0 0 0 0 23 23 23 39 39 39 14 14 14 0 0 0 0 0 0 -+4 4 4 6 6 6 3 3 3 4 4 4 20 20 20 31 31 31 20 20 20 0 0 0 -+0 0 0 6 6 6 4 4 4 0 0 0 6 6 6 20 20 20 23 23 23 16 16 16 -+0 0 0 0 0 0 0 0 0 4 4 4 13 13 13 19 19 19 19 19 19 16 16 16 -+4 4 4 6 6 6 8 8 8 11 11 11 13 13 13 13 13 13 11 11 11 8 8 8 -+11 11 11 13 13 13 13 13 13 4 4 4 0 0 0 13 13 13 19 19 19 10 10 10 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 6 6 6 11 11 11 -+13 13 13 28 28 28 21 21 21 4 4 4 0 0 0 4 4 4 6 6 6 11 11 11 -+10 10 10 24 24 24 33 33 33 20 20 20 0 0 0 4 4 4 13 13 13 4 4 4 -+13 13 13 20 20 20 23 23 23 19 19 19 10 10 10 6 6 6 6 6 6 8 8 8 -+20 20 20 0 0 0 14 14 14 48 48 48 40 40 40 16 16 16 13 13 13 21 21 21 -+19 19 19 21 21 21 17 17 17 34 34 34 53 53 53 42 42 42 27 27 27 40 40 40 -+53 53 53 59 59 59 66 66 66 70 70 70 71 71 71 70 70 70 69 69 69 68 68 68 -+69 69 69 72 72 72 76 76 76 78 78 78 80 80 80 80 80 80 80 80 80 81 81 81 -+82 82 82 84 84 84 87 87 87 93 93 93 95 95 94 89 89 89 88 88 88 96 96 96 -+99 99 99 95 95 94 93 93 93 96 96 96 103 103 102 105 105 105 105 104 105 101 101 101 -+105 104 105 105 105 105 109 110 110 112 112 113 115 116 115 112 112 113 115 116 115 117 117 117 -+115 116 115 121 121 119 121 121 119 125 122 126 128 128 128 128 128 128 121 121 119 109 110 110 -+112 112 113 105 105 105 109 110 110 122 121 126 133 133 133 129 129 130 121 121 119 115 116 115 -+121 121 119 117 117 117 122 121 126 134 134 134 142 143 144 139 139 139 131 131 131 128 128 128 -+147 147 148 144 145 144 147 147 148 137 138 139 147 147 148 147 147 148 142 143 144 129 129 130 -+137 137 137 137 137 137 149 149 149 152 153 154 152 153 154 149 149 149 144 145 144 140 140 140 -+144 145 144 137 137 137 142 143 144 149 151 153 160 161 160 157 157 157 158 159 161 144 145 144 -+105 105 105 6 8 11 14 16 19 11 13 16 1 3 7 10 11 14 11 13 16 1 3 7 -+10 11 14 8 10 13 8 10 13 10 11 14 10 11 14 10 11 14 8 10 13 6 8 11 -+11 11 11 20 20 20 38 38 38 56 56 56 43 43 43 57 57 57 53 53 53 43 43 43 -+78 79 82 231 224 220 246 251 251 231 224 220 231 224 220 200 220 210 238 240 244 238 240 244 -+238 240 244 238 240 244 252 251 251 238 240 244 200 220 210 143 144 144 87 88 90 94 94 95 -+112 112 113 117 117 117 127 127 127 137 137 137 137 138 139 131 131 131 133 133 133 137 137 137 -+134 134 134 134 134 134 133 133 133 133 133 133 131 131 131 129 129 130 129 129 130 129 129 130 -+133 133 133 131 131 131 129 129 130 129 129 130 128 128 128 125 125 127 121 121 119 117 117 117 -+115 116 115 115 116 115 117 117 117 115 116 115 112 112 113 117 117 117 127 127 127 128 128 128 -+129 129 130 127 127 127 121 121 119 117 117 117 122 121 126 121 121 119 105 105 105 99 99 99 -+99 99 99 99 99 99 99 99 99 103 103 102 105 105 105 109 110 110 105 105 105 103 103 102 -+99 99 99 88 88 88 78 78 78 78 78 78 81 81 81 88 88 88 93 93 93 90 90 90 -+101 101 101 82 82 82 71 71 71 61 61 61 52 52 52 70 70 70 82 82 82 69 69 69 -+49 49 49 65 65 65 81 81 81 73 73 73 78 78 78 59 59 59 50 50 50 65 65 65 -+45 45 45 52 52 52 70 70 70 60 60 60 33 33 33 25 25 25 37 37 37 57 57 57 -+59 59 59 39 39 39 27 27 27 23 23 23 29 29 29 32 32 32 49 49 49 27 27 27 -+19 19 19 21 21 21 17 17 17 19 19 19 20 20 20 39 39 39 48 48 48 14 14 14 -+49 49 49 28 28 28 19 19 19 34 34 34 46 46 46 43 43 43 40 40 40 44 44 44 -+42 42 42 34 34 34 19 19 19 17 17 17 13 13 13 17 17 17 38 38 38 37 37 37 -+34 34 34 36 36 36 37 37 37 38 38 38 38 38 38 38 38 38 37 37 37 36 36 36 -+36 36 36 34 34 34 33 33 33 33 33 33 32 32 32 32 32 32 33 33 33 33 33 33 -+32 32 32 32 32 32 33 33 33 31 31 31 40 40 40 44 44 44 24 24 24 16 16 16 -+8 8 8 13 13 13 17 17 17 27 27 27 6 6 6 16 16 16 27 27 27 39 39 39 -+28 28 28 19 19 19 19 19 19 31 31 31 10 10 10 11 11 11 11 11 11 11 11 11 -+19 19 19 37 37 37 36 36 36 20 20 20 6 6 6 20 20 20 36 36 36 21 21 21 -+32 32 32 36 36 36 38 38 38 37 37 37 32 32 32 29 29 29 33 33 33 38 38 38 -+33 33 33 31 31 31 24 24 24 21 21 21 29 29 29 39 39 39 38 38 38 31 31 31 -+21 21 21 25 25 25 32 32 32 34 34 34 25 25 25 14 14 14 16 16 16 25 25 25 -+34 34 34 31 31 31 24 24 24 16 16 16 10 10 10 10 10 10 10 10 10 11 11 11 -+13 13 13 8 8 8 14 14 14 25 25 25 29 29 29 25 25 25 23 23 23 27 27 27 -+20 20 20 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 20 20 20 19 19 19 -+21 21 21 20 20 20 20 20 20 20 20 20 19 19 19 19 19 19 19 19 19 19 19 19 -+ -+0 0 0 0 0 0 23 23 23 44 44 44 25 25 25 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 4 4 4 45 45 45 4 4 4 4 4 4 0 0 0 -+0 0 0 8 8 8 0 0 0 0 0 0 23 23 23 33 33 33 16 16 16 0 0 0 -+0 0 0 8 8 8 4 4 4 0 0 0 0 0 0 24 24 24 28 28 28 17 17 17 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 11 11 23 23 23 29 29 29 -+10 10 10 0 0 0 0 0 0 6 6 6 17 17 17 17 17 17 14 14 14 14 14 14 -+4 4 4 8 8 8 13 13 13 13 13 13 11 11 11 6 6 6 0 0 0 0 0 0 -+10 10 10 4 4 4 10 10 10 13 13 13 6 6 6 10 10 10 17 17 17 14 14 14 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 0 0 0 0 0 0 6 6 6 3 3 3 0 0 0 6 6 6 21 21 21 -+10 10 10 19 19 19 13 13 13 10 10 10 16 16 16 14 14 14 4 4 4 6 6 6 -+11 11 11 25 25 25 21 21 21 6 6 6 10 10 10 19 19 19 19 19 19 16 16 16 -+16 16 16 17 17 17 16 16 16 13 13 13 11 11 11 10 10 10 11 11 11 11 11 11 -+10 10 10 21 21 21 38 38 38 36 36 36 17 17 17 14 14 14 20 20 20 16 16 16 -+28 28 28 14 14 14 32 32 32 49 49 49 40 40 40 39 39 39 53 53 53 57 57 57 -+66 66 66 67 67 67 68 68 68 68 68 68 67 67 67 68 68 68 70 70 70 72 72 72 -+69 69 69 69 69 69 72 72 72 76 76 76 81 81 81 83 83 83 81 81 81 78 78 78 -+80 80 80 84 84 84 85 85 85 87 87 87 91 91 91 88 88 88 88 88 88 95 95 94 -+92 92 92 90 90 90 90 90 90 96 96 96 103 103 102 105 105 105 105 104 105 101 101 101 -+105 104 105 105 105 105 109 110 110 109 110 110 109 110 110 115 116 115 115 116 115 115 116 115 -+115 116 115 115 116 115 117 117 117 121 121 119 122 121 126 127 127 127 127 127 127 121 121 119 -+121 121 119 115 116 115 109 110 110 109 110 110 121 121 119 131 131 131 129 129 130 121 121 119 -+117 117 117 117 117 117 117 117 117 121 121 119 133 133 133 142 143 144 140 140 140 133 133 133 -+144 145 144 140 140 140 142 143 144 127 127 127 137 137 137 149 149 149 147 147 148 137 137 137 -+137 137 137 133 133 133 144 145 144 147 147 148 145 146 147 152 153 154 149 149 149 145 146 147 -+140 140 140 137 137 137 139 139 139 145 146 147 157 157 157 152 153 154 155 156 156 137 137 137 -+50 51 53 0 0 4 14 16 19 6 8 11 11 13 16 10 11 14 16 20 21 10 11 14 -+11 13 16 10 11 14 8 10 13 10 11 14 11 13 16 11 13 16 11 13 16 10 11 14 -+4 4 4 20 20 20 51 51 51 56 56 56 40 40 40 54 54 54 50 50 50 49 49 49 -+43 44 47 139 140 142 231 224 220 200 220 210 231 224 220 238 240 244 238 240 244 238 240 244 -+238 240 244 246 251 251 238 240 244 161 161 162 87 88 90 81 81 81 94 94 95 96 97 98 -+101 101 101 112 112 113 117 117 117 125 122 126 140 140 140 137 138 139 128 128 128 134 134 134 -+133 133 133 133 133 133 131 131 131 129 129 130 129 129 130 128 128 128 128 128 128 128 128 128 -+131 131 131 129 129 130 128 128 128 128 128 128 127 127 127 125 125 127 121 121 119 121 121 119 -+115 116 115 117 117 117 117 117 117 115 116 115 112 112 113 121 121 119 122 121 126 117 117 117 -+117 117 117 117 117 117 112 112 113 109 110 110 112 112 113 109 110 110 101 101 101 99 99 99 -+94 94 94 96 96 96 99 99 99 99 99 99 96 97 98 94 94 94 92 92 92 91 91 91 -+90 90 90 81 81 81 80 80 80 78 78 78 75 75 75 81 81 81 85 85 85 82 82 82 -+88 88 88 71 71 71 68 68 68 67 67 67 56 56 56 60 60 60 72 72 72 70 70 70 -+59 59 59 50 50 50 69 69 69 63 63 63 57 57 57 56 56 56 62 62 62 56 56 56 -+49 49 49 39 39 39 49 49 49 50 50 50 40 40 40 37 37 37 36 36 36 42 42 42 -+45 45 45 32 32 32 36 36 36 39 39 39 43 43 43 34 34 34 45 45 45 36 36 36 -+27 27 27 32 32 32 25 25 25 25 25 25 28 28 28 28 28 28 28 28 28 20 20 20 -+28 28 28 16 16 16 20 20 20 38 38 38 43 43 43 31 31 31 23 23 23 27 27 27 -+24 24 24 20 20 20 16 16 16 20 20 20 16 16 16 16 16 16 23 23 23 16 16 16 -+23 23 23 21 21 21 28 28 28 38 38 38 37 37 37 25 25 25 19 19 19 21 21 21 -+20 20 20 20 20 20 19 19 19 19 19 19 17 17 17 19 19 19 19 19 19 19 19 19 -+20 20 20 17 17 17 24 24 24 32 32 32 43 43 43 39 39 39 14 14 14 10 10 10 -+11 11 11 17 17 17 14 14 14 19 19 19 11 11 11 31 31 31 34 34 34 33 33 33 -+16 16 16 10 10 10 14 14 14 27 27 27 4 4 4 13 13 13 17 17 17 21 21 21 -+43 43 43 28 28 28 14 14 14 20 20 20 16 16 16 8 8 8 20 20 20 19 19 19 -+13 13 13 21 21 21 31 31 31 32 32 32 27 27 27 21 21 21 19 19 19 19 19 19 -+14 14 14 20 20 20 21 21 21 21 21 21 24 24 24 29 29 29 28 28 28 20 20 20 -+17 17 17 13 13 13 11 11 11 16 16 16 19 19 19 16 16 16 17 17 17 21 21 21 -+29 29 29 25 25 25 17 17 17 10 10 10 10 10 10 14 14 14 13 13 13 10 10 10 -+11 11 11 11 11 11 20 20 20 31 31 31 31 31 31 21 21 21 16 16 16 19 19 19 -+19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 17 17 17 16 16 16 16 16 16 -+17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 16 16 16 16 16 16 -+ -+10 10 10 0 0 0 0 0 0 25 25 25 43 43 43 24 24 24 0 0 0 0 0 0 -+0 0 0 0 0 0 3 3 3 6 6 6 8 8 8 50 50 50 10 10 10 8 8 8 -+0 0 0 0 0 0 8 8 8 4 4 4 0 0 0 21 21 21 34 34 34 17 17 17 -+0 0 0 0 0 0 6 6 6 3 3 3 0 0 0 4 4 4 21 21 21 33 33 33 -+13 13 13 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 11 11 11 -+28 28 28 10 10 10 0 0 0 0 0 0 17 17 17 20 20 20 16 16 16 11 11 11 -+0 0 0 6 6 6 13 13 13 14 14 14 10 10 10 4 4 4 0 0 0 0 0 0 -+6 6 6 0 0 0 8 8 8 16 16 16 8 8 8 10 10 10 17 17 17 14 14 14 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 16 16 31 31 31 -+8 8 8 10 10 10 8 8 8 10 10 10 14 14 14 11 11 11 11 11 11 17 17 17 -+16 16 16 19 19 19 10 10 10 11 11 11 23 23 23 19 19 19 11 11 11 23 23 23 -+25 25 25 13 13 13 4 4 4 8 8 8 14 14 14 14 14 14 13 13 13 13 13 13 -+14 14 14 43 43 43 38 38 38 13 13 13 13 13 13 17 17 17 13 13 13 14 14 14 -+14 14 14 33 33 33 50 50 50 52 52 52 49 49 49 54 54 54 63 63 63 65 65 65 -+58 58 58 62 62 62 68 68 68 71 71 71 71 71 71 70 70 70 69 69 69 68 68 68 -+71 71 71 71 71 71 72 72 72 76 76 76 81 81 81 83 83 83 83 83 83 82 82 82 -+82 82 82 90 90 90 87 87 87 81 81 81 89 89 89 95 95 94 93 93 93 95 95 94 -+87 87 87 91 91 91 96 97 98 99 99 99 101 101 101 101 101 101 103 103 102 105 104 105 -+105 105 105 105 105 105 105 105 105 105 105 105 109 110 110 115 116 115 117 117 117 112 112 113 -+109 110 110 115 116 115 121 121 119 121 121 119 121 121 119 121 121 119 125 125 127 128 128 128 -+121 121 119 125 125 127 121 121 119 109 110 110 109 110 110 121 121 119 129 129 130 131 131 131 -+115 116 115 121 121 119 117 117 117 115 116 115 121 121 119 134 134 134 142 143 144 140 140 140 -+140 140 140 129 129 130 139 139 139 127 127 127 129 129 130 137 137 137 144 145 144 149 149 149 -+137 137 137 129 129 130 140 140 140 142 143 144 139 139 139 152 153 154 149 151 153 149 151 153 -+139 139 139 140 140 140 137 138 139 142 143 144 152 153 154 144 145 144 142 143 144 127 127 127 -+14 16 19 6 8 11 10 11 14 1 3 7 16 20 21 1 3 7 11 13 16 11 13 16 -+14 16 19 10 11 14 6 8 11 6 8 11 10 11 14 11 13 16 10 11 14 6 8 11 -+14 14 14 29 29 29 51 51 51 53 53 53 49 49 49 54 54 54 49 49 49 57 57 57 -+51 52 54 49 50 52 180 183 185 238 240 244 238 240 244 246 251 251 246 251 251 238 240 244 -+246 251 251 180 183 185 83 83 83 54 54 54 83 83 83 74 74 74 80 80 80 92 92 92 -+99 99 99 109 110 110 112 112 113 115 116 115 134 134 134 140 140 140 127 127 127 128 128 128 -+129 129 130 129 129 130 129 129 130 128 128 128 128 128 128 127 127 127 127 127 127 125 125 127 -+128 128 128 127 127 127 125 125 127 125 125 127 125 125 127 125 125 127 122 121 126 121 121 119 -+117 117 117 117 117 117 117 117 117 112 112 113 109 110 110 115 116 115 117 117 117 109 110 110 -+105 105 105 109 110 110 105 105 105 105 105 105 105 105 105 101 101 101 94 94 94 96 96 96 -+99 99 99 96 97 98 95 95 94 93 93 93 89 89 89 85 85 85 85 85 85 88 88 88 -+87 87 87 76 76 76 80 80 80 77 77 77 71 71 71 77 77 77 80 80 80 78 78 78 -+68 68 68 60 60 60 65 65 65 74 74 74 70 70 70 58 58 58 57 57 57 63 63 63 -+59 59 59 56 56 56 63 63 63 51 51 51 57 57 57 58 58 58 57 57 57 52 52 52 -+50 50 50 44 44 44 46 46 46 40 40 40 43 43 43 56 56 56 46 46 46 31 31 31 -+36 36 36 27 27 27 40 40 40 49 49 49 53 53 53 40 40 40 38 38 38 24 24 24 -+31 31 31 33 33 33 24 24 24 24 24 24 32 32 32 28 28 28 25 25 25 34 34 34 -+17 17 17 20 20 20 32 32 32 43 43 43 40 40 40 28 28 28 20 20 20 23 23 23 -+25 25 25 17 17 17 16 16 16 19 19 19 19 19 19 23 23 23 27 27 27 20 20 20 -+24 24 24 20 20 20 24 24 24 34 34 34 32 32 32 20 20 20 16 16 16 23 23 23 -+20 20 20 19 19 19 19 19 19 17 17 17 17 17 17 19 19 19 19 19 19 20 20 20 -+25 25 25 24 24 24 32 32 32 37 37 37 39 39 39 29 29 29 10 10 10 16 16 16 -+14 14 14 17 17 17 11 11 11 21 21 21 27 27 27 43 43 43 31 31 31 14 14 14 -+14 14 14 13 13 13 17 17 17 25 25 25 4 4 4 20 20 20 29 29 29 33 33 33 -+31 31 31 19 19 19 6 6 6 14 14 14 11 11 11 13 13 13 29 29 29 33 33 33 -+24 24 24 31 31 31 34 34 34 36 36 36 34 34 34 33 33 33 31 31 31 27 27 27 -+27 27 27 32 32 32 34 34 34 33 33 33 32 32 32 33 33 33 34 34 34 34 34 34 -+39 39 39 32 32 32 25 25 25 24 24 24 29 29 29 33 33 33 32 32 32 28 28 28 -+24 24 24 17 17 17 10 10 10 8 8 8 13 13 13 16 16 16 14 14 14 10 10 10 -+13 13 13 23 23 23 28 28 28 25 25 25 25 25 25 31 31 31 31 31 31 25 25 25 -+34 34 34 36 36 36 36 36 36 36 36 36 34 34 34 33 33 33 32 32 32 32 32 32 -+33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 32 32 32 32 32 32 -+ -+11 11 11 16 16 16 4 4 4 4 4 4 31 31 31 40 40 40 27 27 27 13 13 13 -+8 8 8 13 13 13 11 11 11 13 13 13 16 16 16 16 16 16 53 53 53 16 16 16 -+19 19 19 0 0 0 11 11 11 23 23 23 4 4 4 6 6 6 28 28 28 34 34 34 -+19 19 19 11 11 11 11 11 11 17 17 17 13 13 13 4 4 4 14 14 14 31 31 31 -+34 34 34 25 25 25 19 19 19 16 16 16 16 16 16 11 11 11 8 8 8 10 10 10 -+28 28 28 24 24 24 17 17 17 11 11 11 14 14 14 21 21 21 17 17 17 10 10 10 -+0 0 0 6 6 6 13 13 13 14 14 14 10 10 10 4 4 4 0 0 0 3 3 3 -+4 4 4 0 0 0 11 11 11 14 14 14 4 4 4 11 11 11 19 19 19 8 8 8 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 17 17 17 21 21 21 20 20 20 -+10 10 10 4 4 4 4 4 4 4 4 4 3 3 3 11 11 11 20 20 20 23 23 23 -+16 16 16 10 10 10 8 8 8 13 13 13 14 14 14 10 10 10 14 14 14 28 28 28 -+33 33 33 19 19 19 8 8 8 11 11 11 10 10 10 3 3 3 4 4 4 16 16 16 -+31 31 31 33 33 33 17 17 17 8 8 8 20 20 20 14 14 14 6 6 6 23 23 23 -+21 21 21 54 54 54 58 58 58 51 51 51 62 62 62 65 65 65 58 58 58 62 62 62 -+65 65 65 66 66 66 67 67 67 67 67 67 67 67 67 67 67 67 68 68 68 69 69 69 -+71 71 71 73 73 73 75 75 75 75 75 75 74 74 74 75 75 75 80 80 80 83 83 83 -+81 81 81 78 78 78 70 70 70 73 73 73 87 87 87 87 87 87 83 83 83 92 92 92 -+75 75 75 78 78 78 82 82 82 82 82 82 81 81 81 87 87 87 96 96 96 105 105 105 -+105 105 105 99 99 99 99 99 99 103 103 102 105 105 105 109 110 110 115 116 115 112 112 113 -+109 110 110 112 112 113 121 121 119 121 121 119 117 117 117 117 117 117 121 121 119 122 121 126 -+122 121 126 125 125 127 125 125 127 121 121 119 115 116 115 112 112 113 121 121 119 129 129 130 -+125 122 126 121 121 119 117 117 117 115 116 115 115 116 115 122 121 126 131 131 131 139 139 139 -+142 143 144 128 128 128 140 140 140 128 128 128 127 127 127 127 127 127 133 133 133 147 147 148 -+142 143 144 133 133 133 140 140 140 140 140 140 131 131 131 149 149 149 144 145 144 145 146 147 -+144 145 144 144 145 144 134 134 134 140 140 140 152 153 154 133 133 133 134 134 134 128 128 128 -+109 110 110 105 104 105 91 92 94 85 85 85 81 81 81 71 72 74 66 67 69 60 61 64 -+51 52 54 46 47 50 42 43 45 39 40 43 40 42 44 42 43 45 40 42 44 37 39 42 -+45 45 45 54 54 54 52 52 52 57 57 57 58 58 58 50 50 50 51 51 51 53 53 53 -+51 52 54 50 51 53 134 134 134 246 251 251 238 240 244 238 240 244 238 240 244 231 224 220 -+112 112 113 56 56 56 50 50 50 57 57 57 66 66 66 76 76 76 71 71 71 90 90 90 -+92 92 92 96 97 98 105 104 105 105 105 105 121 121 119 133 133 133 128 128 128 127 127 127 -+128 128 128 128 128 128 127 127 127 127 127 127 125 125 127 125 122 126 122 121 126 121 121 119 -+125 125 127 125 122 126 122 121 126 122 121 126 122 121 126 121 121 119 121 121 119 117 117 117 -+115 116 115 115 116 115 117 117 117 117 117 117 115 116 115 115 116 115 115 116 115 112 112 113 -+109 110 110 112 112 113 109 110 110 109 110 110 109 110 110 103 103 102 94 94 94 95 95 94 -+103 103 102 96 96 96 91 91 91 92 92 92 93 93 93 92 92 92 92 92 92 94 94 94 -+91 91 91 74 74 74 78 78 78 75 75 75 71 71 71 81 81 81 83 83 83 78 78 78 -+68 68 68 66 66 66 62 62 62 70 70 70 76 76 76 60 60 60 50 50 50 63 63 63 -+73 73 73 78 78 78 68 68 68 43 43 43 61 61 61 56 56 56 46 46 46 62 62 62 -+52 52 52 58 58 58 60 60 60 40 40 40 36 36 36 56 56 56 50 50 50 31 31 31 -+29 29 29 28 28 28 44 44 44 45 45 45 56 56 56 52 52 52 46 46 46 27 27 27 -+20 20 20 19 19 19 19 19 19 25 25 25 36 36 36 39 39 39 37 37 37 38 38 38 -+19 19 19 29 29 29 40 40 40 44 44 44 42 42 42 40 40 40 42 42 42 43 43 43 -+37 37 37 23 23 23 14 14 14 14 14 14 19 19 19 32 32 32 40 40 40 39 39 39 -+40 40 40 38 38 38 39 39 39 43 43 43 40 40 40 36 36 36 37 37 37 42 42 42 -+38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 -+37 37 37 38 38 38 43 43 43 38 38 38 36 36 36 28 28 28 11 11 11 14 14 14 -+13 13 13 17 17 17 17 17 17 33 33 33 33 33 33 34 34 34 16 16 16 6 6 6 -+14 14 14 17 17 17 21 21 21 28 28 28 11 11 11 29 29 29 36 36 36 29 29 29 -+6 6 6 14 14 14 11 11 11 8 8 8 6 6 6 23 23 23 46 46 46 45 45 45 -+42 42 42 42 42 42 40 40 40 40 40 40 44 44 44 49 49 49 45 45 45 39 39 39 -+43 43 43 43 43 43 43 43 43 43 43 43 42 42 42 39 39 39 42 42 42 45 45 45 -+51 51 51 50 50 50 44 44 44 39 39 39 40 40 40 44 44 44 38 38 38 28 28 28 -+17 17 17 11 11 11 8 8 8 11 11 11 14 14 14 14 14 14 11 11 11 11 11 11 -+23 23 23 25 25 25 25 25 25 24 24 24 31 31 31 40 40 40 40 40 40 34 34 34 -+37 37 37 38 38 38 38 38 38 37 37 37 37 37 37 36 36 36 34 34 34 33 33 33 -+36 36 36 36 36 36 37 37 37 37 37 37 37 37 37 36 36 36 34 34 34 34 34 34 -+ -+21 21 21 16 16 16 20 20 20 20 20 20 16 16 16 27 27 27 37 37 37 28 28 28 -+19 19 19 17 17 17 20 20 20 21 21 21 20 20 20 20 20 20 21 21 21 59 59 59 -+25 25 25 21 21 21 16 16 16 16 16 16 17 17 17 16 16 16 20 20 20 29 29 29 -+46 46 46 29 29 29 16 16 16 20 20 20 24 24 24 20 20 20 16 16 16 17 17 17 -+34 34 34 31 31 31 25 25 25 19 19 19 16 16 16 17 17 17 20 20 20 23 23 23 -+16 16 16 36 36 36 40 40 40 25 25 25 13 13 13 17 17 17 17 17 17 8 8 8 -+0 0 0 8 8 8 16 16 16 16 16 16 11 11 11 4 4 4 3 3 3 3 3 3 -+4 4 4 4 4 4 14 14 14 11 11 11 0 0 0 13 13 13 20 20 20 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 4 4 4 3 3 3 0 0 0 11 11 11 29 29 29 21 21 21 0 0 0 -+4 4 4 0 0 0 4 4 4 6 6 6 6 6 6 19 19 19 24 24 24 13 13 13 -+0 0 0 0 0 0 10 10 10 6 6 6 0 0 0 6 6 6 31 31 31 38 38 38 -+8 8 8 0 0 0 3 3 3 13 13 13 8 8 8 0 0 0 20 20 20 44 44 44 -+34 34 34 14 14 14 4 4 4 13 13 13 16 16 16 13 13 13 19 19 19 25 25 25 -+61 61 61 54 54 54 58 58 58 57 57 57 51 51 51 59 59 59 66 66 66 58 58 58 -+67 67 67 68 68 68 68 68 68 68 68 68 66 66 66 66 66 66 66 66 66 68 68 68 -+68 68 68 73 73 73 77 77 77 74 74 74 67 67 67 67 67 67 74 74 74 83 83 83 -+73 73 73 53 53 53 42 42 42 63 63 63 80 80 80 63 63 63 58 58 58 82 82 82 -+90 90 90 84 84 84 74 74 74 66 66 66 66 66 66 74 74 74 88 88 88 99 99 99 -+103 103 102 89 89 89 88 88 88 99 99 99 103 103 102 105 104 105 109 110 110 109 110 110 -+121 121 119 115 116 115 112 112 113 112 112 113 115 116 115 117 117 117 121 121 119 121 121 119 -+128 128 128 121 121 119 121 121 119 128 128 128 128 128 128 115 116 115 112 112 113 121 121 119 -+137 137 137 121 121 119 112 112 113 117 117 117 117 117 117 112 112 113 117 117 117 129 129 130 -+145 146 147 131 131 131 142 143 144 129 129 130 125 122 126 122 121 126 125 125 127 133 133 133 -+149 149 149 139 139 139 144 145 144 140 140 140 127 127 127 144 145 144 137 138 139 137 138 139 -+152 153 154 149 149 149 133 133 133 137 137 137 149 149 149 128 128 128 133 133 133 139 139 139 -+133 133 133 125 125 127 109 110 110 94 94 95 83 84 85 87 88 90 76 76 76 58 59 61 -+63 65 67 58 59 61 51 52 54 49 50 52 49 50 52 49 50 52 46 47 50 46 47 50 -+51 51 51 65 65 65 48 48 48 61 61 61 65 65 65 49 49 49 59 59 59 50 50 50 -+51 52 54 56 57 59 49 50 52 200 220 210 238 240 244 246 251 251 149 151 153 60 61 64 -+44 44 44 48 48 48 49 49 49 62 62 62 65 65 65 67 67 67 81 81 81 81 81 81 -+93 93 93 94 94 94 112 112 113 112 112 113 112 112 113 129 129 130 133 133 133 127 127 127 -+127 127 127 125 125 127 125 125 127 125 122 126 121 121 119 121 121 119 121 121 119 121 121 119 -+125 125 127 125 122 126 122 121 126 122 121 126 121 121 119 117 117 117 112 112 113 109 110 110 -+109 110 110 109 110 110 117 117 117 127 127 127 122 121 126 117 117 117 121 121 119 121 121 119 -+121 121 119 117 117 117 115 116 115 115 116 115 117 117 117 109 110 110 99 99 99 96 97 98 -+96 96 96 88 88 88 84 84 84 91 91 91 101 101 101 103 103 102 101 101 101 99 99 99 -+96 96 96 75 75 75 76 76 76 73 73 73 72 72 72 87 87 87 87 87 87 82 82 82 -+60 60 60 63 63 63 53 53 53 62 62 62 84 84 84 75 75 75 63 63 63 82 82 82 -+83 83 83 74 74 74 81 81 81 67 67 67 60 60 60 49 49 49 45 45 45 43 43 43 -+70 70 70 69 69 69 62 62 62 34 34 34 25 25 25 48 48 48 49 49 49 34 34 34 -+24 24 24 37 37 37 51 51 51 33 33 33 31 31 31 31 31 31 34 34 34 19 19 19 -+14 14 14 8 8 8 20 20 20 31 31 31 39 39 39 48 48 48 42 42 42 25 25 25 -+28 28 28 42 42 42 50 50 50 45 45 45 40 40 40 42 42 42 40 40 40 38 38 38 -+34 34 34 17 17 17 13 13 13 14 14 14 21 21 21 37 37 37 44 44 44 42 42 42 -+38 38 38 40 40 40 42 42 42 39 39 39 38 38 38 40 40 40 43 43 43 44 44 44 -+38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 -+37 37 37 40 40 40 42 42 42 34 34 34 38 38 38 39 39 39 20 20 20 13 13 13 -+6 6 6 19 19 19 27 27 27 43 43 43 29 29 29 16 16 16 0 0 0 16 16 16 -+11 11 11 19 19 19 24 24 24 32 32 32 19 19 19 36 36 36 33 33 33 17 17 17 -+14 14 14 11 11 11 11 11 11 20 20 20 14 14 14 17 17 17 40 40 40 50 50 50 -+44 44 44 40 40 40 37 37 37 37 37 37 44 44 44 51 51 51 46 46 46 38 38 38 -+38 38 38 37 37 37 42 42 42 48 48 48 46 46 46 38 38 38 34 34 34 34 34 34 -+43 43 43 49 49 49 48 48 48 39 39 39 37 37 37 38 38 38 29 29 29 14 14 14 -+13 13 13 10 10 10 10 10 10 14 14 14 14 14 14 10 10 10 8 8 8 13 13 13 -+32 32 32 20 20 20 17 17 17 29 29 29 40 40 40 42 42 42 39 39 39 38 38 38 -+38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 36 36 36 34 34 34 33 33 33 -+37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 37 37 37 36 36 36 34 34 34 -+ -+16 16 16 21 21 21 17 17 17 17 17 17 21 21 21 13 13 13 21 21 21 46 46 46 -+29 29 29 17 17 17 16 16 16 21 21 21 17 17 17 13 13 13 20 20 20 29 29 29 -+52 52 52 20 20 20 20 20 20 23 23 23 17 17 17 19 19 19 16 16 16 23 23 23 -+37 37 37 33 33 33 25 25 25 19 19 19 19 19 19 23 23 23 21 21 21 17 17 17 -+16 16 16 36 36 36 42 42 42 29 29 29 16 16 16 19 19 19 23 23 23 21 21 21 -+27 27 27 17 17 17 27 27 27 36 36 36 25 25 25 16 16 16 11 11 11 0 0 0 -+3 3 3 0 0 0 11 11 11 14 14 14 6 6 6 6 6 6 11 11 11 4 4 4 -+16 16 16 8 8 8 0 0 0 3 3 3 10 10 10 13 13 13 10 10 10 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 6 6 6 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 13 13 13 36 36 36 16 16 16 0 0 0 4 4 4 -+8 8 8 3 3 3 0 0 0 6 6 6 19 19 19 23 23 23 13 13 13 0 0 0 -+0 0 0 6 6 6 10 10 10 0 0 0 3 3 3 34 34 34 38 38 38 6 6 6 -+4 4 4 4 4 4 10 10 10 4 4 4 0 0 0 21 21 21 37 37 37 31 31 31 -+8 8 8 16 16 16 19 19 19 13 13 13 8 8 8 20 20 20 43 43 43 61 61 61 -+54 54 54 54 54 54 56 56 56 58 58 58 60 60 60 62 62 62 62 62 62 61 61 61 -+72 72 72 65 65 65 60 60 60 62 62 62 66 66 66 66 66 66 65 65 65 66 66 66 -+69 69 69 71 71 71 56 56 56 43 43 43 38 38 38 54 54 54 70 70 70 54 54 54 -+76 76 76 66 66 66 59 59 59 77 77 77 62 62 62 57 57 57 59 59 59 60 60 60 -+92 92 92 84 84 84 69 69 69 59 59 59 69 69 69 88 88 88 87 87 87 67 67 67 -+90 90 90 103 103 102 96 97 98 85 85 85 81 81 81 81 81 81 88 88 88 103 103 102 -+105 105 105 112 112 113 115 116 115 112 112 113 109 110 110 112 112 113 117 117 117 121 121 119 -+121 121 119 125 125 127 125 122 126 121 121 119 121 121 119 127 127 127 121 121 119 112 112 113 -+117 117 117 129 129 130 129 129 130 115 116 115 105 105 105 115 116 115 117 117 117 112 112 113 -+133 133 133 139 139 139 142 143 144 137 138 139 121 121 119 115 116 115 127 127 127 127 127 127 -+127 127 127 142 143 144 152 153 154 140 140 140 121 121 119 134 134 134 149 149 149 127 127 127 -+133 133 133 144 145 144 152 153 154 137 138 139 142 143 144 133 133 133 125 122 126 127 127 127 -+115 116 115 115 116 115 112 112 113 96 96 96 77 77 77 73 73 73 70 70 70 59 59 59 -+53 53 53 54 54 54 52 52 52 46 46 46 46 46 46 50 50 50 50 50 50 46 46 46 -+57 57 57 59 59 59 57 57 57 58 58 58 63 63 63 60 60 60 53 53 53 54 54 54 -+53 53 53 51 51 51 61 61 61 69 69 69 160 161 160 78 78 78 43 43 43 45 45 45 -+45 45 45 44 44 44 49 49 49 58 58 58 62 62 62 66 66 66 71 71 71 77 77 77 -+87 87 87 92 92 92 96 97 98 103 103 102 112 112 113 125 122 126 128 128 128 127 127 127 -+121 121 119 121 121 119 121 121 119 117 117 117 121 121 119 121 121 119 117 117 117 117 117 117 -+121 121 119 115 116 115 115 116 115 121 121 119 117 117 117 112 112 113 105 105 105 105 105 105 -+112 112 113 117 117 117 122 121 126 125 122 126 121 121 119 117 117 117 117 117 117 117 117 117 -+115 116 115 115 116 115 115 116 115 109 110 110 112 112 113 109 110 110 95 95 94 95 95 94 -+88 88 88 84 84 84 87 87 87 87 87 87 103 103 102 99 99 99 99 99 99 101 101 101 -+89 89 89 73 73 73 68 68 68 74 74 74 81 81 81 69 69 69 62 62 62 88 88 88 -+71 71 71 60 60 60 54 54 54 50 50 50 57 57 57 83 83 83 87 87 87 59 59 59 -+68 68 68 77 77 77 65 65 65 70 70 70 67 67 67 44 44 44 42 42 42 37 37 37 -+32 32 32 72 72 72 63 63 63 27 27 27 19 19 19 27 27 27 34 34 34 44 44 44 -+52 52 52 42 42 42 28 28 28 16 16 16 36 36 36 58 58 58 57 57 57 57 57 57 -+23 23 23 24 24 24 34 34 34 46 46 46 50 50 50 40 40 40 28 28 28 21 21 21 -+45 45 45 44 44 44 42 42 42 42 42 42 43 43 43 43 43 43 42 42 42 39 39 39 -+20 20 20 24 24 24 19 19 19 20 20 20 34 34 34 39 39 39 39 39 39 45 45 45 -+39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 -+39 39 39 37 37 37 37 37 37 39 39 39 38 38 38 34 34 34 36 36 36 40 40 40 -+42 42 42 40 40 40 45 45 45 38 38 38 39 39 39 34 34 34 13 13 13 14 14 14 -+6 6 6 29 29 29 44 44 44 40 40 40 4 4 4 11 11 11 16 16 16 10 10 10 -+13 13 13 14 14 14 24 24 24 38 38 38 40 40 40 25 25 25 13 13 13 13 13 13 -+13 13 13 17 17 17 14 14 14 14 14 14 11 11 11 21 21 21 42 42 42 43 43 43 -+48 48 48 50 50 50 48 48 48 40 40 40 34 34 34 38 38 38 49 49 49 57 57 57 -+45 45 45 40 40 40 36 36 36 39 39 39 49 49 49 50 50 50 42 42 42 33 33 33 -+36 36 36 39 39 39 46 46 46 44 44 44 37 37 37 39 39 39 34 34 34 17 17 17 -+14 14 14 11 11 11 13 13 13 16 16 16 13 13 13 11 11 11 23 23 23 37 37 37 -+25 25 25 14 14 14 0 0 0 43 43 43 51 51 51 49 49 49 36 36 36 39 39 39 -+40 40 40 38 38 38 40 40 40 39 39 39 34 34 34 37 37 37 40 40 40 36 36 36 -+38 38 38 38 38 38 39 39 39 38 38 38 36 36 36 34 34 34 34 34 34 36 36 36 -+ -+40 40 40 10 10 10 13 13 13 24 24 24 10 10 10 10 10 10 21 21 21 16 16 16 -+42 42 42 34 34 34 14 14 14 16 16 16 31 31 31 19 19 19 6 6 6 27 27 27 -+14 14 14 51 51 51 25 25 25 14 14 14 21 21 21 8 8 8 20 20 20 14 14 14 -+6 6 6 31 31 31 39 39 39 25 25 25 11 11 11 16 16 16 20 20 20 16 16 16 -+6 6 6 13 13 13 24 24 24 33 33 33 27 27 27 13 13 13 8 8 8 13 13 13 -+3 3 3 24 24 24 19 19 19 17 17 17 33 33 33 21 21 21 0 0 0 0 0 0 -+6 6 6 0 0 0 6 6 6 14 14 14 13 13 13 11 11 11 8 8 8 0 0 0 -+6 6 6 4 4 4 6 6 6 13 13 13 17 17 17 17 17 17 10 10 10 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 -+0 0 0 0 0 0 21 21 21 27 27 27 4 4 4 0 0 0 6 6 6 0 0 0 -+0 0 0 0 0 0 10 10 10 24 24 24 25 25 25 11 11 11 0 0 0 4 4 4 -+4 4 4 10 10 10 0 0 0 6 6 6 37 37 37 29 29 29 6 6 6 11 11 11 -+0 0 0 16 16 16 6 6 6 0 0 0 23 23 23 38 38 38 27 27 27 10 10 10 -+14 14 14 10 10 10 8 8 8 16 16 16 29 29 29 43 43 43 52 52 52 57 57 57 -+56 56 56 54 54 54 53 53 53 53 53 53 54 54 54 58 58 58 63 63 63 67 67 67 -+61 61 61 60 60 60 62 62 62 66 66 66 62 62 62 57 57 57 60 60 60 70 70 70 -+68 68 68 37 37 37 43 43 43 38 38 38 52 52 52 72 72 72 53 53 53 49 49 49 -+44 44 44 80 80 80 72 72 72 63 63 63 54 54 54 51 51 51 56 56 56 76 76 76 -+65 65 65 89 89 89 81 81 81 67 67 67 81 81 81 80 80 80 63 63 63 68 68 68 -+69 69 69 94 94 94 96 96 96 83 83 83 78 78 78 77 77 77 85 85 85 101 101 101 -+84 84 84 101 101 101 115 116 115 115 116 115 112 112 113 112 112 113 115 116 115 112 112 113 -+112 112 113 117 117 117 121 121 119 121 121 119 122 121 126 122 121 126 121 121 119 121 121 119 -+121 121 119 121 121 119 125 122 126 125 122 126 117 117 117 109 110 110 109 110 110 115 116 115 -+128 128 128 131 131 131 134 134 134 139 139 139 127 127 127 115 116 115 121 121 119 121 121 119 -+122 121 126 128 128 128 140 140 140 144 145 144 129 129 130 128 128 128 140 140 140 131 131 131 -+128 128 128 131 131 131 142 143 144 139 139 139 144 145 144 129 129 130 117 117 117 122 121 126 -+121 121 119 105 105 105 99 99 99 99 99 99 87 87 87 69 69 69 61 61 61 59 59 59 -+51 51 51 53 53 53 52 52 52 49 49 49 49 49 49 52 52 52 52 52 52 50 50 50 -+56 56 56 60 60 60 60 60 60 62 62 62 69 69 69 66 66 66 58 58 58 57 57 57 -+59 59 59 52 52 52 49 49 49 43 43 43 73 73 73 37 37 37 43 43 43 51 51 51 -+44 44 44 45 45 45 50 50 50 58 58 58 61 61 61 65 65 65 70 70 70 77 77 77 -+85 85 85 91 91 91 99 99 99 103 103 102 109 110 110 117 117 117 125 125 127 129 129 130 -+117 117 117 115 116 115 117 117 117 121 121 119 115 116 115 115 116 115 115 116 115 115 116 115 -+115 116 115 112 112 113 112 112 113 112 112 113 112 112 113 105 105 105 105 105 105 105 105 105 -+117 117 117 121 121 119 121 121 119 121 121 119 121 121 119 117 117 117 115 116 115 117 117 117 -+115 116 115 112 112 113 112 112 113 109 110 110 109 110 110 105 105 105 92 92 92 92 92 92 -+87 87 87 85 85 85 84 84 84 81 81 81 103 103 102 105 104 105 101 101 101 90 90 90 -+92 92 92 70 70 70 78 78 78 83 83 83 65 65 65 59 59 59 61 61 61 61 61 61 -+61 61 61 58 58 58 53 53 53 58 58 58 70 70 70 75 75 75 72 72 72 71 71 71 -+67 67 67 69 69 69 49 49 49 53 53 53 58 58 58 45 45 45 43 43 43 33 33 33 -+46 46 46 75 75 75 68 68 68 53 53 53 39 39 39 16 16 16 23 23 23 44 44 44 -+52 52 52 46 46 46 31 31 31 14 14 14 37 37 37 56 56 56 43 43 43 33 33 33 -+49 49 49 50 50 50 52 52 52 50 50 50 42 42 42 34 34 34 37 37 37 44 44 44 -+44 44 44 42 42 42 40 40 40 42 42 42 43 43 43 43 43 43 39 39 39 37 37 37 -+20 20 20 16 16 16 11 11 11 19 19 19 33 33 33 38 38 38 38 38 38 39 39 39 -+38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 -+39 39 39 37 37 37 37 37 37 39 39 39 38 38 38 36 36 36 37 37 37 39 39 39 -+37 37 37 34 34 34 37 37 37 36 36 36 43 43 43 39 39 39 14 14 14 8 8 8 -+27 27 27 29 29 29 33 33 33 33 33 33 4 4 4 14 14 14 17 17 17 13 13 13 -+10 10 10 14 14 14 28 28 28 37 37 37 31 31 31 16 16 16 10 10 10 11 11 11 -+10 10 10 10 10 10 4 4 4 13 13 13 19 19 19 29 29 29 44 44 44 37 37 37 -+37 37 37 40 40 40 43 43 43 44 44 44 40 40 40 37 37 37 39 39 39 43 43 43 -+39 39 39 43 43 43 39 39 39 34 34 34 40 40 40 51 51 51 50 50 50 39 39 39 -+36 36 36 40 40 40 50 50 50 50 50 50 45 45 45 43 43 43 33 33 33 11 11 11 -+11 11 11 16 16 16 14 14 14 8 8 8 11 11 11 23 23 23 27 27 27 25 25 25 -+13 13 13 20 20 20 21 21 21 44 44 44 50 50 50 53 53 53 52 52 52 45 45 45 -+45 45 45 43 43 43 46 46 46 48 48 48 36 36 36 28 28 28 33 33 33 37 37 37 -+50 50 50 50 50 50 48 48 48 44 44 44 39 39 39 36 36 36 33 33 33 33 33 33 -+ -+38 38 38 29 29 29 13 13 13 4 4 4 10 10 10 8 8 8 0 0 0 0 0 0 -+16 16 16 33 33 33 20 20 20 0 0 0 0 0 0 6 6 6 0 0 0 0 0 0 -+0 0 0 10 10 10 42 42 42 16 16 16 0 0 0 10 10 10 0 0 0 0 0 0 -+0 0 0 3 3 3 20 20 20 27 27 27 16 16 16 0 0 0 0 0 0 4 4 4 -+4 4 4 0 0 0 4 4 4 24 24 24 31 31 31 20 20 20 4 4 4 0 0 0 -+4 4 4 0 0 0 3 3 3 10 10 10 20 20 20 29 29 29 20 20 20 0 0 0 -+3 3 3 0 0 0 3 3 3 14 14 14 14 14 14 11 11 11 8 8 8 4 4 4 -+6 6 6 8 8 8 13 13 13 16 16 16 17 17 17 14 14 14 6 6 6 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 0 0 0 0 0 0 3 3 3 6 6 6 0 0 0 0 0 0 0 0 0 -+0 0 0 21 21 21 27 27 27 10 10 10 0 0 0 0 0 0 3 3 3 10 10 10 -+0 0 0 6 6 6 23 23 23 28 28 28 19 19 19 0 0 0 0 0 0 4 4 4 -+10 10 10 0 0 0 8 8 8 33 33 33 33 33 33 14 14 14 3 3 3 6 6 6 -+13 13 13 4 4 4 0 0 0 16 16 16 37 37 37 29 29 29 10 10 10 10 10 10 -+11 11 11 10 10 10 16 16 16 32 32 32 51 51 51 60 60 60 58 58 58 52 52 52 -+52 52 52 53 53 53 54 54 54 56 56 56 57 57 57 59 59 59 62 62 62 65 65 65 -+60 60 60 62 62 62 60 60 60 53 53 53 48 48 48 49 49 49 54 54 54 59 59 59 -+45 45 45 38 38 38 24 24 24 58 58 58 67 67 67 46 46 46 52 52 52 37 37 37 -+46 46 46 71 71 71 75 75 75 69 69 69 51 51 51 59 59 59 73 73 73 72 72 72 -+57 57 57 57 57 57 83 83 83 99 99 99 80 80 80 61 61 61 66 66 66 70 70 70 -+84 84 84 74 74 74 96 96 96 101 101 101 74 74 74 78 78 78 93 93 93 75 75 75 -+80 80 80 78 78 78 92 92 92 112 112 113 115 116 115 105 105 105 105 105 105 115 116 115 -+112 112 113 112 112 113 115 116 115 121 121 119 122 121 126 121 121 119 121 121 119 121 121 119 -+121 121 119 115 116 115 121 121 119 127 127 127 127 127 127 115 116 115 109 110 110 109 110 110 -+127 127 127 122 121 126 125 122 126 134 134 134 133 133 133 121 121 119 117 117 117 115 116 115 -+121 121 119 115 116 115 128 128 128 144 145 144 137 138 139 128 128 128 134 134 134 131 131 131 -+121 121 119 125 122 126 133 133 133 133 133 133 142 143 144 129 129 130 112 112 113 112 112 113 -+121 121 119 99 99 99 89 89 89 93 93 93 87 87 87 69 69 69 58 58 58 54 54 54 -+50 50 50 52 52 52 52 52 52 51 51 51 51 51 51 54 54 54 57 57 57 57 57 57 -+58 58 58 63 63 63 63 63 63 68 68 68 75 75 75 74 74 74 66 66 66 63 63 63 -+57 57 57 59 59 59 54 54 54 57 57 57 43 43 43 48 48 48 49 49 49 38 38 38 -+44 44 44 48 48 48 53 53 53 58 58 58 60 60 60 63 63 63 70 70 70 76 76 76 -+83 83 83 90 90 90 99 99 99 103 103 102 105 105 105 109 110 110 121 121 119 129 129 130 -+117 117 117 112 112 113 115 116 115 121 121 119 112 112 113 112 112 113 112 112 113 112 112 113 -+109 110 110 109 110 110 105 105 105 105 105 105 103 103 102 103 103 102 105 105 105 112 112 113 -+121 121 119 121 121 119 121 121 119 117 117 117 115 116 115 115 116 115 115 116 115 115 116 115 -+112 112 113 109 110 110 109 110 110 105 105 105 105 105 105 103 103 102 88 88 88 87 87 87 -+87 87 87 82 82 82 81 81 81 81 81 81 101 101 101 99 99 99 95 95 94 88 88 88 -+78 78 78 75 75 75 76 76 76 71 71 71 71 71 71 68 68 68 56 56 56 57 57 57 -+60 60 60 60 60 60 66 66 66 75 75 75 72 72 72 54 54 54 53 53 53 71 71 71 -+73 73 73 67 67 67 38 38 38 36 36 36 44 44 44 43 43 43 45 45 45 33 33 33 -+48 48 48 65 65 65 49 49 49 57 57 57 58 58 58 33 33 33 39 39 39 51 51 51 -+43 43 43 49 49 49 39 39 39 23 23 23 42 42 42 54 54 54 33 33 33 21 21 21 -+49 49 49 46 46 46 43 43 43 34 34 34 24 24 24 23 23 23 34 34 34 48 48 48 -+43 43 43 42 42 42 40 40 40 43 43 43 44 44 44 43 43 43 37 37 37 31 31 31 -+27 27 27 16 16 16 17 17 17 31 31 31 40 40 40 45 45 45 45 45 45 42 42 42 -+40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 -+40 40 40 38 38 38 38 38 38 40 40 40 40 40 40 39 39 39 39 39 39 40 40 40 -+44 44 44 42 42 42 42 42 42 38 38 38 43 43 43 38 38 38 17 17 17 13 13 13 -+37 37 37 25 25 25 23 23 23 32 32 32 11 11 11 16 16 16 14 14 14 11 11 11 -+14 14 14 20 20 20 36 36 36 38 38 38 19 19 19 8 8 8 13 13 13 10 10 10 -+14 14 14 13 13 13 8 8 8 19 19 19 27 27 27 36 36 36 44 44 44 31 31 31 -+37 37 37 44 44 44 52 52 52 51 51 51 38 38 38 25 25 25 31 31 31 45 45 45 -+42 42 42 50 50 50 42 42 42 13 13 13 0 0 0 28 28 28 49 49 49 51 51 51 -+25 25 25 27 27 27 33 33 33 42 42 42 49 49 49 51 51 51 36 36 36 10 10 10 -+13 13 13 14 14 14 13 13 13 10 10 10 17 17 17 27 27 27 25 25 25 16 16 16 -+11 11 11 3 3 3 21 21 21 44 44 44 46 46 46 32 32 32 46 46 46 50 50 50 -+17 17 17 4 4 4 8 8 8 14 14 14 3 3 3 0 0 0 0 0 0 6 6 6 -+0 0 0 0 0 0 8 8 8 13 13 13 17 17 17 21 21 21 25 25 25 28 28 28 -+ -+13 13 13 38 38 38 27 27 27 0 0 0 0 0 0 4 4 4 0 0 0 4 4 4 -+0 0 0 19 19 19 34 34 34 19 19 19 0 0 0 0 0 0 8 8 8 0 0 0 -+4 4 4 0 0 0 13 13 13 38 38 38 20 20 20 0 0 0 8 8 8 0 0 0 -+11 11 11 0 0 0 0 0 0 20 20 20 28 28 28 16 16 16 0 0 0 0 0 0 -+8 8 8 6 6 6 0 0 0 0 0 0 19 19 19 29 29 29 19 19 19 0 0 0 -+6 6 6 0 0 0 0 0 0 4 4 4 3 3 3 23 23 23 34 34 34 19 19 19 -+3 3 3 0 0 0 0 0 0 10 10 10 10 10 10 6 6 6 11 11 11 17 17 17 -+17 17 17 16 16 16 13 13 13 11 11 11 8 8 8 4 4 4 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 0 0 0 0 0 0 8 8 8 6 6 6 0 0 0 0 0 0 0 0 0 -+13 13 13 27 27 27 10 10 10 0 0 0 10 10 10 8 8 8 0 0 0 0 0 0 -+4 4 4 23 23 23 28 28 28 13 13 13 0 0 0 3 3 3 4 4 4 0 0 0 -+0 0 0 4 4 4 33 33 33 37 37 37 10 10 10 0 0 0 11 11 11 6 6 6 -+10 10 10 0 0 0 13 13 13 37 37 37 29 29 29 10 10 10 8 8 8 11 11 11 -+8 8 8 21 21 21 39 39 39 53 53 53 61 61 61 60 60 60 56 56 56 51 51 51 -+53 53 53 53 53 53 54 54 54 58 58 58 61 61 61 62 62 62 61 61 61 59 59 59 -+59 59 59 58 58 58 44 44 44 28 28 28 34 34 34 52 52 52 52 52 52 38 38 38 -+27 27 27 32 32 32 59 59 59 65 65 65 51 51 51 37 37 37 34 34 34 54 54 54 -+67 67 67 53 53 53 51 51 51 68 68 68 70 70 70 75 75 75 75 75 75 51 51 51 -+48 48 48 63 63 63 75 75 75 87 87 87 87 87 87 67 67 67 60 60 60 81 81 81 -+78 78 78 74 74 74 72 72 72 87 87 87 105 104 105 96 96 96 78 78 78 77 77 77 -+84 84 84 71 71 71 76 76 76 99 99 99 109 110 110 103 103 102 99 99 99 105 105 105 -+115 116 115 112 112 113 112 112 113 117 117 117 121 121 119 121 121 119 117 117 117 117 117 117 -+121 121 119 117 117 117 117 117 117 121 121 119 125 125 127 127 127 127 115 116 115 105 104 105 -+127 127 127 121 121 119 112 112 113 127 127 127 137 137 137 128 128 128 121 121 119 112 112 113 -+121 121 119 117 117 117 121 121 119 137 137 137 137 138 139 137 137 137 139 139 139 129 129 130 -+117 117 117 122 121 126 127 127 127 121 121 119 131 131 131 133 133 133 115 116 115 105 105 105 -+109 110 110 99 99 99 88 88 88 81 81 81 77 77 77 73 73 73 63 63 63 52 52 52 -+51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 57 57 57 61 61 61 65 65 65 -+63 63 63 69 69 69 68 68 68 69 69 69 76 76 76 78 78 78 74 74 74 73 73 73 -+59 59 59 67 67 67 54 54 54 57 57 57 51 51 51 63 63 63 51 51 51 43 43 43 -+46 46 46 51 51 51 57 57 57 60 60 60 61 61 61 63 63 63 70 70 70 77 77 77 -+83 83 83 87 87 87 96 96 96 103 103 102 105 104 105 105 105 105 115 116 115 125 125 127 -+125 122 126 112 112 113 109 110 110 115 116 115 109 110 110 109 110 110 112 112 113 105 105 105 -+105 105 105 105 105 105 105 105 105 103 103 102 101 101 101 103 103 102 109 110 110 117 117 117 -+121 121 119 121 121 119 115 116 115 115 116 115 115 116 115 115 116 115 112 112 113 112 112 113 -+109 110 110 109 110 110 109 110 110 103 103 102 105 104 105 99 99 99 85 85 85 84 84 84 -+87 87 87 76 76 76 80 80 80 84 84 84 95 95 94 82 82 82 87 87 87 96 97 98 -+85 85 85 83 83 83 71 71 71 63 63 63 78 78 78 76 76 76 54 54 54 56 56 56 -+62 62 62 57 57 57 76 76 76 87 87 87 59 59 59 40 40 40 53 53 53 63 63 63 -+78 78 78 72 72 72 45 45 45 32 32 32 33 33 33 37 37 37 45 45 45 39 39 39 -+60 60 60 65 65 65 28 28 28 37 37 37 58 58 58 50 50 50 51 51 51 34 34 34 -+24 24 24 40 40 40 44 44 44 38 38 38 54 54 54 60 60 60 45 45 45 46 46 46 -+40 40 40 36 36 36 32 32 32 32 32 32 34 34 34 39 39 39 44 44 44 48 48 48 -+44 44 44 42 42 42 42 42 42 43 43 43 44 44 44 40 40 40 32 32 32 24 24 24 -+19 19 19 8 8 8 20 20 20 37 37 37 40 40 40 42 42 42 43 43 43 39 39 39 -+37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 -+34 34 34 33 33 33 34 34 34 36 36 36 37 37 37 36 36 36 36 36 36 36 36 36 -+32 32 32 37 37 37 37 37 37 34 34 34 36 36 36 33 33 33 29 29 29 36 36 36 -+29 29 29 17 17 17 20 20 20 37 37 37 17 17 17 14 14 14 11 11 11 13 13 13 -+27 27 27 28 28 28 40 40 40 39 39 39 16 16 16 10 10 10 17 17 17 10 10 10 -+13 13 13 19 19 19 20 20 20 29 29 29 31 31 31 37 37 37 45 45 45 36 36 36 -+13 13 13 24 24 24 42 42 42 52 52 52 44 44 44 24 24 24 19 19 19 25 25 25 -+43 43 43 50 50 50 43 43 43 20 20 20 10 10 10 33 33 33 51 51 51 50 50 50 -+45 45 45 46 46 46 48 48 48 46 46 46 44 44 44 42 42 42 29 29 29 13 13 13 -+16 16 16 8 8 8 10 10 10 21 21 21 27 27 27 21 21 21 14 14 14 14 14 14 -+16 16 16 0 0 0 29 29 29 50 50 50 50 50 50 20 20 20 39 39 39 42 42 42 -+34 34 34 16 16 16 6 6 6 11 11 11 8 8 8 6 6 6 8 8 8 8 8 8 -+13 13 13 14 14 14 13 13 13 10 10 10 4 4 4 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 13 13 13 34 34 34 28 28 28 0 0 0 0 0 0 13 13 13 0 0 0 -+4 4 4 0 0 0 20 20 20 39 39 39 23 23 23 0 0 0 3 3 3 8 8 8 -+0 0 0 6 6 6 0 0 0 17 17 17 40 40 40 19 19 19 0 0 0 4 4 4 -+6 6 6 6 6 6 0 0 0 0 0 0 16 16 16 33 33 33 27 27 27 3 3 3 -+0 0 0 8 8 8 3 3 3 0 0 0 3 3 3 24 24 24 27 27 27 11 11 11 -+0 0 0 11 11 11 0 0 0 0 0 0 4 4 4 0 0 0 11 11 11 42 42 42 -+16 16 16 6 6 6 0 0 0 0 0 0 4 4 4 6 6 6 10 10 10 16 16 16 -+16 16 16 13 13 13 10 10 10 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 3 3 3 4 4 4 0 0 0 0 0 0 3 3 3 13 13 13 -+36 36 36 4 4 4 0 0 0 10 10 10 0 0 0 0 0 0 4 4 4 0 0 0 -+24 24 24 28 28 28 19 19 19 0 0 0 0 0 0 4 4 4 6 6 6 0 0 0 -+0 0 0 34 34 34 32 32 32 8 8 8 4 4 4 3 3 3 0 0 0 10 10 10 -+0 0 0 13 13 13 36 36 36 33 33 33 10 10 10 6 6 6 14 14 14 4 4 4 -+23 23 23 39 39 39 56 56 56 61 61 61 57 57 57 51 51 51 51 51 51 54 54 54 -+59 59 59 56 56 56 53 53 53 57 57 57 61 61 61 62 62 62 57 57 57 50 50 50 -+40 40 40 34 34 34 25 25 25 27 27 27 42 42 42 53 53 53 45 45 45 27 27 27 -+27 27 27 43 43 43 63 63 63 52 52 52 38 38 38 39 39 39 48 48 48 68 68 68 -+53 53 53 50 50 50 33 33 33 52 52 52 85 85 85 77 77 77 57 57 57 44 44 44 -+50 50 50 75 75 75 70 70 70 54 54 54 71 71 71 89 89 89 85 85 85 76 76 76 -+67 67 67 66 66 66 62 62 62 76 76 76 99 99 99 96 97 98 82 82 82 76 76 76 -+75 75 75 82 82 82 83 83 83 84 84 84 94 94 94 105 105 105 101 101 101 87 87 87 -+103 103 102 105 105 105 112 112 113 115 116 115 115 116 115 117 117 117 117 117 117 115 116 115 -+117 117 117 121 121 119 121 121 119 115 116 115 121 121 119 127 127 127 121 121 119 112 112 113 -+121 121 119 121 121 119 109 110 110 115 116 115 131 131 131 131 131 131 128 128 128 121 121 119 -+115 116 115 115 116 115 117 117 117 127 127 127 131 131 131 133 133 133 140 140 140 137 137 137 -+121 121 119 121 121 119 121 121 119 115 116 115 122 121 126 133 133 133 121 121 119 112 112 113 -+101 101 101 101 101 101 90 90 90 73 73 73 69 69 69 72 72 72 68 68 68 59 59 59 -+54 54 54 53 53 53 52 52 52 52 52 52 52 52 52 57 57 57 65 65 65 70 70 70 -+71 71 71 76 76 76 73 73 73 70 70 70 75 75 75 81 81 81 81 81 81 82 82 82 -+68 68 68 67 67 67 60 60 60 50 50 50 54 54 54 51 51 51 52 52 52 65 65 65 -+51 51 51 57 57 57 62 62 62 63 63 63 63 63 63 67 67 67 73 73 73 78 78 78 -+85 85 85 87 87 87 93 93 93 103 103 102 105 105 105 105 105 105 109 110 110 115 116 115 -+128 128 128 115 116 115 105 105 105 109 110 110 109 110 110 109 110 110 105 105 105 103 103 102 -+105 105 105 105 105 105 103 103 102 101 101 101 99 99 99 105 105 105 112 112 113 121 121 119 -+117 117 117 115 116 115 112 112 113 112 112 113 112 112 113 112 112 113 109 110 110 109 110 110 -+105 105 105 105 105 105 105 105 105 103 103 102 103 103 102 99 99 99 83 83 83 82 82 82 -+84 84 84 76 76 76 78 78 78 80 80 80 87 87 87 73 73 73 83 83 83 101 101 101 -+94 94 94 67 67 67 67 67 67 70 70 70 67 67 67 74 74 74 71 71 71 59 59 59 -+56 56 56 53 53 53 69 69 69 72 72 72 54 54 54 52 52 52 63 63 63 61 61 61 -+68 68 68 69 69 69 58 58 58 44 44 44 33 33 33 33 33 33 42 42 42 40 40 40 -+61 61 61 65 65 65 24 24 24 29 29 29 51 51 51 50 50 50 53 53 53 29 29 29 -+13 13 13 21 21 21 28 28 28 28 28 28 38 38 38 33 33 33 17 17 17 27 27 27 -+29 29 29 27 27 27 27 27 27 32 32 32 42 42 42 46 46 46 43 43 43 38 38 38 -+44 44 44 43 43 43 42 42 42 42 42 42 40 40 40 36 36 36 25 25 25 17 17 17 -+11 11 11 13 13 13 31 31 31 44 44 44 40 40 40 38 38 38 40 40 40 39 39 39 -+39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 -+37 37 37 38 38 38 39 39 39 39 39 39 39 39 39 39 39 39 38 38 38 37 37 37 -+33 33 33 40 40 40 38 38 38 38 38 38 40 40 40 37 37 37 36 36 36 40 40 40 -+13 13 13 10 10 10 21 21 21 38 38 38 14 14 14 8 8 8 11 11 11 21 21 21 -+34 34 34 29 29 29 37 37 37 34 34 34 14 14 14 11 11 11 19 19 19 6 6 6 -+4 4 4 20 20 20 28 28 28 33 33 33 25 25 25 27 27 27 43 43 43 42 42 42 -+11 11 11 0 0 0 8 8 8 32 32 32 48 48 48 43 43 43 31 31 31 23 23 23 -+50 50 50 48 48 48 50 50 50 50 50 50 50 50 50 53 53 53 45 45 45 23 23 23 -+39 39 39 48 48 48 46 46 46 32 32 32 13 13 13 0 0 0 3 3 3 11 11 11 -+11 11 11 10 10 10 17 17 17 27 27 27 25 25 25 16 16 16 10 10 10 11 11 11 -+11 11 11 20 20 20 49 49 49 53 53 53 52 52 52 37 37 37 46 46 46 23 23 23 -+40 40 40 25 25 25 13 13 13 4 4 4 0 0 0 4 4 4 8 8 8 0 0 0 -+6 6 6 6 6 6 6 6 6 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 21 21 21 36 36 36 28 28 28 10 10 10 0 0 0 0 0 0 -+4 4 4 0 0 0 0 0 0 17 17 17 33 33 33 19 19 19 0 0 0 0 0 0 -+0 0 0 0 0 0 4 4 4 0 0 0 14 14 14 42 42 42 11 11 11 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 17 17 25 25 25 25 25 25 -+0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 4 4 4 16 16 16 25 25 25 -+13 13 13 6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 17 17 -+25 25 25 17 17 17 0 0 0 0 0 0 4 4 4 8 8 8 3 3 3 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 17 17 17 27 27 27 -+16 16 16 0 0 0 0 0 0 8 8 8 0 0 0 0 0 0 6 6 6 20 20 20 -+29 29 29 17 17 17 4 4 4 3 3 3 4 4 4 3 3 3 3 3 3 6 6 6 -+32 32 32 27 27 27 11 11 11 0 0 0 3 3 3 8 8 8 4 4 4 0 0 0 -+17 17 17 32 32 32 25 25 25 8 8 8 4 4 4 4 4 4 11 11 11 28 28 28 -+46 46 46 52 52 52 57 57 57 54 54 54 50 50 50 46 46 46 50 50 50 54 54 54 -+52 52 52 53 53 53 57 57 57 61 61 61 61 61 61 54 54 54 40 40 40 29 29 29 -+23 23 23 19 19 19 29 29 29 48 48 48 52 52 52 40 40 40 28 28 28 25 25 25 -+49 49 49 62 62 62 36 36 36 33 33 33 40 40 40 45 45 45 66 66 66 52 52 52 -+33 33 33 48 48 48 53 53 53 56 56 56 67 67 67 63 63 63 66 66 66 57 57 57 -+78 78 78 70 70 70 63 63 63 53 53 53 56 56 56 83 83 83 90 90 90 65 65 65 -+67 67 67 59 59 59 80 80 80 85 85 85 66 66 66 83 83 83 101 101 101 76 76 76 -+73 73 73 77 77 77 77 77 77 74 74 74 81 81 81 95 95 94 103 103 102 101 101 101 -+84 84 84 96 96 96 105 105 105 109 110 110 112 112 113 115 116 115 121 121 119 121 121 119 -+115 116 115 117 117 117 121 121 119 121 121 119 115 116 115 115 116 115 121 121 119 125 122 126 -+112 112 113 121 121 119 109 110 110 109 110 110 122 121 126 127 127 127 128 128 128 131 131 131 -+112 112 113 112 112 113 109 110 110 121 121 119 125 125 127 121 121 119 129 129 130 142 143 144 -+127 127 127 117 117 117 109 110 110 112 112 113 117 117 117 128 128 128 121 121 119 121 121 119 -+101 101 101 101 101 101 89 89 89 75 75 75 69 69 69 67 67 67 66 66 66 69 69 69 -+61 61 61 59 59 59 58 58 58 57 57 57 57 57 57 59 59 59 67 67 67 74 74 74 -+77 77 77 85 85 85 81 81 81 74 74 74 77 77 77 82 82 82 84 84 84 87 87 87 -+80 80 80 62 62 62 70 70 70 62 62 62 65 65 65 49 49 49 54 54 54 61 61 61 -+58 58 58 63 63 63 68 68 68 68 68 68 68 68 68 72 72 72 77 77 77 81 81 81 -+87 87 87 89 89 89 94 94 94 101 101 101 105 104 105 105 104 105 105 105 105 105 105 105 -+125 125 127 117 117 117 105 105 105 103 103 102 105 105 105 105 105 105 103 103 102 99 99 99 -+101 101 101 101 101 101 99 99 99 96 97 98 99 99 99 105 105 105 112 112 113 115 116 115 -+112 112 113 112 112 113 112 112 113 112 112 113 112 112 113 112 112 113 109 110 110 105 105 105 -+105 105 105 105 104 105 105 105 105 101 101 101 103 103 102 96 97 98 81 81 81 80 80 80 -+80 80 80 78 78 78 76 76 76 69 69 69 81 81 81 80 80 80 87 87 87 90 90 90 -+84 84 84 65 65 65 61 61 61 62 62 62 65 65 65 68 68 68 69 69 69 77 77 77 -+54 54 54 58 58 58 53 53 53 52 52 52 61 61 61 66 66 66 61 61 61 56 56 56 -+49 49 49 54 54 54 60 60 60 54 54 54 40 40 40 34 34 34 38 38 38 38 38 38 -+40 40 40 52 52 52 36 36 36 43 43 43 49 49 49 39 39 39 50 50 50 48 48 48 -+25 25 25 17 17 17 24 24 24 33 33 33 45 45 45 44 44 44 33 33 33 40 40 40 -+40 40 40 43 43 43 45 45 45 45 45 45 45 45 45 46 46 46 45 45 45 42 42 42 -+39 39 39 38 38 38 38 38 38 37 37 37 33 33 33 27 27 27 20 20 20 14 14 14 -+13 13 13 24 24 24 39 39 39 44 44 44 38 38 38 34 34 34 37 37 37 38 38 38 -+36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 -+33 33 33 38 38 38 40 40 40 38 38 38 36 36 36 36 36 36 36 36 36 34 34 34 -+36 36 36 40 40 40 33 33 33 38 38 38 44 44 44 36 36 36 24 24 24 14 14 14 -+6 6 6 8 8 8 20 20 20 32 32 32 4 4 4 10 10 10 20 20 20 28 28 28 -+29 29 29 21 21 21 25 25 25 24 24 24 13 13 13 10 10 10 14 14 14 8 8 8 -+14 14 14 27 27 27 31 31 31 28 28 28 11 11 11 10 10 10 29 29 29 32 32 32 -+28 28 28 11 11 11 0 0 0 16 16 16 33 33 33 39 39 39 38 38 38 36 36 36 -+37 37 37 32 32 32 39 39 39 44 44 44 37 37 37 34 34 34 32 32 32 19 19 19 -+31 31 31 34 34 34 29 29 29 20 20 20 16 16 16 13 13 13 16 16 16 24 24 24 -+8 8 8 20 20 20 25 25 25 20 20 20 16 16 16 16 16 16 13 13 13 6 6 6 -+10 10 10 19 19 19 33 33 33 37 37 37 34 34 34 28 28 28 37 37 37 20 20 20 -+31 31 31 24 24 24 20 20 20 11 11 11 0 0 0 6 6 6 16 16 16 13 13 13 -+17 17 17 17 17 17 16 16 16 13 13 13 11 11 11 13 13 13 17 17 17 21 21 21 -+ -+0 0 0 6 6 6 0 0 0 14 14 14 39 39 39 27 27 27 0 0 0 6 6 6 -+0 0 0 6 6 6 0 0 0 0 0 0 17 17 17 32 32 32 24 24 24 4 4 4 -+3 3 3 10 10 10 0 0 0 10 10 10 0 0 0 16 16 16 46 46 46 11 11 11 -+11 11 11 0 0 0 0 0 0 11 11 11 8 8 8 0 0 0 14 14 14 36 36 36 -+16 16 16 0 0 0 0 0 0 6 6 6 4 4 4 0 0 0 3 3 3 17 17 17 -+29 29 29 3 3 3 3 3 3 10 10 10 0 0 0 3 3 3 10 10 10 0 0 0 -+16 16 16 21 21 21 14 14 14 0 0 0 3 3 3 4 4 4 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 16 16 21 21 21 19 19 19 -+0 0 0 6 6 6 3 3 3 0 0 0 4 4 4 6 6 6 14 14 14 34 34 34 -+16 16 16 4 4 4 0 0 0 6 6 6 6 6 6 3 3 3 11 11 11 24 24 24 -+34 34 34 0 0 0 0 0 0 10 10 10 0 0 0 3 3 3 17 17 17 8 8 8 -+37 37 37 25 25 25 3 3 3 0 0 0 11 11 11 11 11 11 24 24 24 51 51 51 -+56 56 56 53 53 53 51 51 51 48 48 48 48 48 48 49 49 49 51 51 51 52 52 52 -+48 48 48 52 52 52 57 57 57 56 56 56 46 46 46 34 34 34 23 23 23 17 17 17 -+19 19 19 29 29 29 45 45 45 53 53 53 42 42 42 25 25 25 27 27 27 40 40 40 -+61 61 61 42 42 42 39 39 39 24 24 24 44 44 44 66 66 66 40 40 40 42 42 42 -+36 36 36 49 49 49 68 68 68 59 59 59 43 43 43 49 49 49 80 80 80 70 70 70 -+63 63 63 59 59 59 40 40 40 51 51 51 80 80 80 74 74 74 67 67 67 92 92 92 -+63 63 63 78 78 78 75 75 75 67 67 67 70 70 70 74 74 74 82 82 82 99 99 99 -+87 87 87 71 71 71 66 66 66 74 74 74 77 77 77 78 78 78 92 92 92 109 110 110 -+91 91 91 90 90 90 92 92 92 99 99 99 105 104 105 109 110 110 112 112 113 117 117 117 -+117 117 117 112 112 113 115 116 115 121 121 119 115 116 115 109 110 110 115 116 115 121 121 119 -+117 117 117 121 121 119 105 105 105 105 104 105 117 117 117 115 116 115 115 116 115 125 125 127 -+121 121 119 115 116 115 105 105 105 117 117 117 121 121 119 109 110 110 115 116 115 129 129 130 -+129 129 130 121 121 119 112 112 113 109 110 110 109 110 110 121 121 119 112 112 113 112 112 113 -+105 104 105 103 103 102 91 91 91 80 80 80 73 73 73 66 66 66 65 65 65 71 71 71 -+68 68 68 66 66 66 66 66 66 66 66 66 63 63 63 62 62 62 68 68 68 75 75 75 -+82 82 82 92 92 92 91 91 91 83 83 83 83 83 83 85 85 85 85 85 85 87 87 87 -+90 90 90 72 72 72 70 70 70 63 63 63 62 62 62 59 59 59 53 53 53 57 57 57 -+65 65 65 70 70 70 72 72 72 72 72 72 73 73 73 78 78 78 82 82 82 83 83 83 -+88 88 88 93 93 93 96 97 98 99 99 99 101 101 101 103 103 102 103 103 102 103 103 102 -+112 112 113 117 117 117 109 110 110 101 101 101 103 103 102 103 103 102 99 99 99 99 99 99 -+99 99 99 99 99 99 96 96 96 95 95 94 101 101 101 109 110 110 112 112 113 112 112 113 -+112 112 113 109 110 110 109 110 110 109 110 110 109 110 110 105 105 105 105 105 105 105 104 105 -+101 101 101 101 101 101 103 103 102 99 99 99 101 101 101 95 95 94 80 80 80 78 78 78 -+75 75 75 74 74 74 73 73 73 67 67 67 84 84 84 87 87 87 87 87 87 81 81 81 -+77 77 77 74 74 74 62 62 62 54 54 54 68 68 68 67 67 67 59 59 59 81 81 81 -+60 60 60 57 57 57 51 51 51 54 54 54 62 62 62 60 60 60 51 51 51 49 49 49 -+44 44 44 43 43 43 51 51 51 53 53 53 44 44 44 39 39 39 38 38 38 36 36 36 -+34 34 34 49 49 49 48 48 48 50 50 50 44 44 44 29 29 29 37 37 37 44 44 44 -+37 37 37 23 23 23 29 29 29 36 36 36 38 38 38 40 40 40 34 34 34 34 34 34 -+33 33 33 39 39 39 40 40 40 34 34 34 28 28 28 27 27 27 29 29 29 29 29 29 -+31 31 31 31 31 31 31 31 31 28 28 28 23 23 23 19 19 19 16 16 16 14 14 14 -+14 14 14 29 29 29 34 34 34 28 28 28 23 23 23 23 23 23 21 21 21 21 21 21 -+17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 -+19 19 19 27 27 27 31 31 31 27 27 27 21 21 21 20 20 20 20 20 20 20 20 20 -+14 14 14 21 21 21 14 14 14 25 25 25 36 36 36 27 27 27 16 16 16 0 0 0 -+10 10 10 11 11 11 16 16 16 23 23 23 4 4 4 24 24 24 29 29 29 25 25 25 -+17 17 17 11 11 11 14 14 14 17 17 17 11 11 11 6 6 6 11 11 11 19 19 19 -+31 31 31 31 31 31 24 24 24 17 17 17 3 3 3 6 6 6 24 24 24 20 20 20 -+20 20 20 21 21 21 23 23 23 25 25 25 24 24 24 21 21 21 20 20 20 20 20 20 -+16 16 16 10 10 10 19 19 19 21 21 21 11 11 11 20 20 20 36 36 36 36 36 36 -+19 19 19 20 20 20 14 14 14 13 13 13 21 21 21 19 19 19 8 8 8 6 6 6 -+17 17 17 23 23 23 23 23 23 14 14 14 10 10 10 14 14 14 14 14 14 10 10 10 -+11 11 11 19 19 19 14 14 14 24 24 24 13 13 13 13 13 13 21 21 21 24 24 24 -+16 16 16 13 13 13 19 19 19 24 24 24 19 19 19 19 19 19 23 23 23 23 23 23 -+21 21 21 20 20 20 16 16 16 13 13 13 11 11 11 13 13 13 19 19 19 24 24 24 -+ -+6 6 6 0 0 0 0 0 0 3 3 3 16 16 16 36 36 36 32 32 32 0 0 0 -+0 0 0 0 0 0 6 6 6 3 3 3 0 0 0 17 17 17 39 39 39 29 29 29 -+3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 45 45 45 -+11 11 11 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 6 6 -+40 40 40 17 17 17 0 0 0 0 0 0 10 10 10 4 4 4 0 0 0 0 0 0 -+16 16 16 28 28 28 19 19 19 0 0 0 3 3 3 3 3 3 0 0 0 8 8 8 -+0 0 0 21 21 21 28 28 28 11 11 11 0 0 0 0 0 0 0 0 0 6 6 6 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 3 3 3 3 3 3 14 14 14 25 25 25 17 17 17 0 0 0 -+4 4 4 0 0 0 10 10 10 0 0 0 0 0 0 20 20 20 34 34 34 13 13 13 -+0 0 0 3 3 3 6 6 6 0 0 0 0 0 0 6 6 6 24 24 24 37 37 37 -+0 0 0 6 6 6 3 3 3 3 3 3 8 8 8 0 0 0 8 8 8 36 36 36 -+25 25 25 11 11 11 8 8 8 11 11 11 13 13 13 32 32 32 49 49 49 46 46 46 -+52 52 52 50 50 50 48 48 48 49 49 49 50 50 50 52 52 52 51 51 51 50 50 50 -+56 56 56 57 57 57 52 52 52 37 37 37 19 19 19 10 10 10 16 16 16 25 25 25 -+20 20 20 43 43 43 53 53 53 39 39 39 21 21 21 24 24 24 44 44 44 61 61 61 -+36 36 36 37 37 37 28 28 28 44 44 44 59 59 59 49 49 49 42 42 42 34 34 34 -+43 43 43 60 60 60 57 57 57 38 38 38 44 44 44 42 42 42 65 65 65 76 76 76 -+71 71 71 52 52 52 54 54 54 72 72 72 70 70 70 53 53 53 56 56 56 71 71 71 -+90 90 90 78 78 78 65 65 65 63 63 63 65 65 65 56 56 56 62 62 62 87 87 87 -+95 95 94 80 80 80 71 71 71 75 75 75 77 77 77 74 74 74 78 78 78 89 89 89 -+112 112 113 90 90 90 76 76 76 84 84 84 96 97 98 105 104 105 105 105 105 109 110 110 -+117 117 117 112 112 113 109 110 110 115 116 115 117 117 117 115 116 115 112 112 113 112 112 113 -+129 129 130 125 122 126 99 99 99 101 101 101 121 121 119 109 110 110 103 103 102 109 110 110 -+133 133 133 125 122 126 105 105 105 112 112 113 122 121 126 112 112 113 109 110 110 112 112 113 -+129 129 130 128 128 128 117 117 117 105 105 105 101 101 101 117 117 117 105 105 105 96 97 98 -+105 105 105 105 105 105 95 95 94 78 78 78 73 73 73 70 70 70 66 66 66 67 67 67 -+71 71 71 70 70 70 71 71 71 72 72 72 69 69 69 66 66 66 69 69 69 75 75 75 -+83 83 83 96 96 96 99 99 99 91 91 91 88 88 88 87 87 87 85 85 85 87 87 87 -+91 91 91 94 94 94 78 78 78 70 70 70 65 65 65 73 73 73 54 54 54 69 69 69 -+69 69 69 73 73 73 75 75 75 74 74 74 76 76 76 82 82 82 85 85 85 85 85 85 -+89 89 89 96 96 96 101 101 101 99 99 99 96 96 96 99 99 99 103 103 102 103 103 102 -+101 101 101 117 117 117 112 112 113 99 99 99 101 101 101 101 101 101 95 95 94 101 101 101 -+99 99 99 99 99 99 96 96 96 96 97 98 105 105 105 115 116 115 115 116 115 109 110 110 -+112 112 113 109 110 110 109 110 110 105 105 105 105 105 105 105 104 105 103 103 102 103 103 102 -+99 99 99 99 99 99 101 101 101 96 97 98 99 99 99 94 94 94 78 78 78 76 76 76 -+73 73 73 69 69 69 71 71 71 73 73 73 90 90 90 84 84 84 81 81 81 80 80 80 -+75 75 75 57 57 57 59 59 59 61 61 61 62 62 62 75 75 75 81 81 81 81 81 81 -+61 61 61 45 45 45 56 56 56 70 70 70 57 57 57 46 46 46 51 51 51 50 50 50 -+53 53 53 40 40 40 43 43 43 48 48 48 44 44 44 43 43 43 40 40 40 37 37 37 -+33 33 33 46 46 46 46 46 46 42 42 42 38 38 38 33 33 33 32 32 32 31 31 31 -+33 33 33 25 25 25 36 36 36 34 34 34 24 24 24 29 29 29 29 29 29 27 27 27 -+32 32 32 37 37 37 37 37 37 31 31 31 24 24 24 25 25 25 28 28 28 28 28 28 -+23 23 23 24 24 24 24 24 24 21 21 21 16 16 16 13 13 13 14 14 14 16 16 16 -+25 25 25 39 39 39 36 36 36 20 20 20 20 20 20 21 21 21 16 16 16 16 16 16 -+17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 -+21 21 21 32 32 32 36 36 36 31 31 31 23 23 23 21 21 21 23 23 23 23 23 23 -+21 21 21 32 32 32 25 25 25 32 32 32 36 36 36 24 24 24 20 20 20 13 13 13 -+13 13 13 13 13 13 11 11 11 20 20 20 13 13 13 37 37 37 34 34 34 14 14 14 -+6 6 6 6 6 6 10 10 10 16 16 16 14 14 14 6 6 6 13 13 13 31 31 31 -+33 33 33 25 25 25 10 10 10 6 6 6 8 8 8 20 20 20 33 33 33 25 25 25 -+31 31 31 33 33 33 32 32 32 29 29 29 25 25 25 24 24 24 23 23 23 21 21 21 -+33 33 33 21 21 21 27 27 27 33 33 33 32 32 32 38 38 38 36 36 36 13 13 13 -+6 6 6 25 25 25 33 33 33 34 34 34 31 31 31 17 17 17 6 6 6 13 13 13 -+31 31 31 20 20 20 11 11 11 13 13 13 11 11 11 8 8 8 10 10 10 17 17 17 -+3 3 3 42 42 42 36 36 36 32 32 32 14 14 14 32 32 32 29 29 29 17 17 17 -+11 11 11 0 0 0 11 11 11 29 29 29 29 29 29 21 21 21 17 17 17 13 13 13 -+3 3 3 3 3 3 4 4 4 6 6 6 13 13 13 21 21 21 32 32 32 39 39 39 -+ -+8 8 8 0 0 0 0 0 0 0 0 0 0 0 0 17 17 17 32 32 32 31 31 31 -+0 0 0 0 0 0 8 8 8 11 11 11 0 0 0 0 0 0 13 13 13 37 37 37 -+23 23 23 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 3 3 3 0 0 0 -+44 44 44 10 10 10 0 0 0 6 6 6 3 3 3 0 0 0 3 3 3 0 0 0 -+14 14 14 29 29 29 28 28 28 3 3 3 0 0 0 0 0 0 6 6 6 0 0 0 -+0 0 0 16 16 16 24 24 24 16 16 16 0 0 0 0 0 0 4 4 4 8 8 8 -+0 0 0 0 0 0 13 13 13 31 31 31 11 11 11 0 0 0 6 6 6 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 6 6 6 8 8 8 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 0 0 0 13 13 13 25 25 25 10 10 10 0 0 0 6 6 6 -+4 4 4 0 0 0 0 0 0 0 0 0 21 21 21 32 32 32 20 20 20 0 0 0 -+0 0 0 6 6 6 4 4 4 0 0 0 10 10 10 29 29 29 27 27 27 8 8 8 -+10 10 10 0 0 0 4 4 4 6 6 6 0 0 0 16 16 16 38 38 38 31 31 31 -+4 4 4 3 3 3 4 4 4 19 19 19 34 34 34 46 46 46 49 49 49 48 48 48 -+51 51 51 45 45 45 42 42 42 46 46 46 49 49 49 46 46 46 48 48 48 51 51 51 -+60 60 60 42 42 42 21 21 21 14 14 14 19 19 19 21 21 21 17 17 17 14 14 14 -+34 34 34 56 56 56 34 34 34 20 20 20 23 23 23 42 42 42 61 61 61 37 37 37 -+28 28 28 31 31 31 39 39 39 57 57 57 46 46 46 28 28 28 37 37 37 38 38 38 -+57 57 57 53 53 53 43 43 43 36 36 36 45 45 45 60 60 60 58 58 58 44 44 44 -+57 57 57 75 75 75 71 71 71 60 60 60 62 62 62 54 54 54 49 49 49 65 65 65 -+80 80 80 82 82 82 69 69 69 57 57 57 62 62 62 70 70 70 66 66 66 62 62 62 -+80 80 80 90 90 90 82 82 82 67 67 67 70 70 70 81 81 81 80 80 80 74 74 74 -+87 87 87 103 103 102 99 99 99 80 80 80 80 80 80 92 92 92 101 101 101 105 105 105 -+112 112 113 115 116 115 115 116 115 112 112 113 109 110 110 112 112 113 112 112 113 109 110 110 -+99 99 99 115 116 115 122 121 126 96 97 98 99 99 99 121 121 119 105 105 105 99 99 99 -+101 101 101 122 121 126 125 125 127 115 116 115 117 117 117 115 116 115 103 103 102 103 103 102 -+112 112 113 128 128 128 127 127 127 112 112 113 99 99 99 105 105 105 115 116 115 94 94 94 -+89 89 89 103 103 102 105 105 105 90 90 90 76 76 76 75 75 75 74 74 74 70 70 70 -+66 66 66 76 76 76 85 85 85 82 82 82 75 75 75 74 74 74 76 76 76 77 77 77 -+87 87 87 91 91 91 96 96 96 95 95 94 94 94 94 93 93 93 91 91 91 88 88 88 -+85 85 85 83 83 83 78 78 78 74 74 74 71 71 71 70 70 70 70 70 70 71 71 71 -+73 73 73 72 72 72 74 74 74 81 81 81 83 83 83 84 84 84 88 88 88 95 95 94 -+94 94 94 96 96 96 99 99 99 101 101 101 103 103 102 101 101 101 99 99 99 96 96 96 -+94 94 94 105 105 105 115 116 115 105 105 105 92 92 92 94 94 94 96 97 98 91 91 91 -+96 96 96 89 89 89 91 91 91 105 104 105 112 112 113 109 110 110 105 105 105 109 110 110 -+105 105 105 105 105 105 105 105 105 105 104 105 103 103 102 101 101 101 99 99 99 99 99 99 -+96 97 98 101 101 101 96 97 98 93 93 93 96 96 96 91 91 91 77 77 77 71 71 71 -+71 71 71 70 70 70 72 72 72 72 72 72 74 74 74 85 85 85 88 88 88 76 76 76 -+53 53 53 58 58 58 58 58 58 52 52 52 59 59 59 71 71 71 75 75 75 77 77 77 -+54 54 54 54 54 54 61 61 61 60 60 60 49 49 49 45 45 45 49 49 49 48 48 48 -+48 48 48 45 45 45 33 33 33 31 31 31 38 38 38 56 56 56 67 67 67 53 53 53 -+44 44 44 44 44 44 44 44 44 48 48 48 48 48 48 31 31 31 16 16 16 23 23 23 -+27 27 27 45 45 45 50 50 50 43 43 43 39 39 39 39 39 39 40 40 40 49 49 49 -+49 49 49 45 45 45 40 40 40 38 38 38 39 39 39 42 42 42 43 43 43 43 43 43 -+36 36 36 34 34 34 29 29 29 20 20 20 11 11 11 11 11 11 21 21 21 29 29 29 -+38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 -+38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 -+36 36 36 38 38 38 39 39 39 38 38 38 36 36 36 33 33 33 33 33 33 34 34 34 -+31 31 31 40 40 40 43 43 43 36 36 36 32 32 32 33 33 33 25 25 25 13 13 13 -+14 14 14 8 8 8 0 0 0 14 14 14 31 31 31 27 27 27 14 14 14 14 14 14 -+8 8 8 6 6 6 11 11 11 8 8 8 0 0 0 16 16 16 32 32 32 34 34 34 -+23 23 23 8 8 8 8 8 8 14 14 14 14 14 14 23 23 23 33 33 33 36 36 36 -+21 21 21 32 32 32 38 38 38 43 43 43 43 43 43 27 27 27 8 8 8 6 6 6 -+34 34 34 50 50 50 46 46 46 43 43 43 38 38 38 51 51 51 43 43 43 43 43 43 -+27 27 27 49 49 49 32 32 32 14 14 14 36 36 36 34 34 34 16 16 16 25 25 25 -+20 20 20 17 17 17 11 11 11 10 10 10 11 11 11 11 11 11 11 11 11 10 10 10 -+6 6 6 43 43 43 49 49 49 39 39 39 10 10 10 10 10 10 44 44 44 38 38 38 -+0 0 0 8 8 8 0 0 0 6 6 6 39 39 39 34 34 34 4 4 4 0 0 0 -+0 0 0 3 3 3 11 11 11 10 10 10 13 13 13 32 32 32 34 34 34 13 13 13 -+ -+6 6 6 0 0 0 0 0 0 10 10 10 0 0 0 0 0 0 17 17 17 37 37 37 -+31 31 31 10 10 10 0 0 0 0 0 0 6 6 6 0 0 0 4 4 4 14 14 14 -+40 40 40 25 25 25 0 0 0 0 0 0 11 11 11 0 0 0 0 0 0 6 6 6 -+8 8 8 33 33 33 20 20 20 0 0 0 4 4 4 6 6 6 0 0 0 0 0 0 -+0 0 0 17 17 17 28 28 28 23 23 23 4 4 4 0 0 0 0 0 0 11 11 11 -+0 0 0 3 3 3 16 16 16 21 21 21 16 16 16 0 0 0 0 0 0 0 0 0 -+3 3 3 10 10 10 3 3 3 8 8 8 24 24 24 17 17 17 0 0 0 0 0 0 -+4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 6 6 6 0 0 0 -+0 0 0 0 0 0 21 21 21 29 29 29 6 6 6 3 3 3 13 13 13 0 0 0 -+4 4 4 0 0 0 4 4 4 23 23 23 27 27 27 13 13 13 0 0 0 0 0 0 -+4 4 4 0 0 0 0 0 0 10 10 10 23 23 23 25 25 25 14 14 14 0 0 0 -+3 3 3 6 6 6 0 0 0 0 0 0 19 19 19 33 33 33 25 25 25 14 14 14 -+0 0 0 4 4 4 16 16 16 29 29 29 42 42 42 48 48 48 49 49 49 46 46 46 -+48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 49 49 49 48 48 48 -+38 38 38 21 21 21 13 13 13 19 19 19 19 19 19 13 13 13 21 21 21 36 36 36 -+53 53 53 32 32 32 28 28 28 21 21 21 36 36 36 51 51 51 32 32 32 25 25 25 -+29 29 29 29 29 29 60 60 60 44 44 44 27 27 27 38 38 38 38 38 38 59 59 59 -+51 51 51 39 39 39 33 33 33 42 42 42 54 54 54 57 57 57 49 49 49 40 40 40 -+49 49 49 65 65 65 74 74 74 62 62 62 45 45 45 52 52 52 67 67 67 68 68 68 -+59 59 59 77 77 77 80 80 80 66 66 66 60 60 60 61 61 61 62 62 62 63 63 63 -+69 69 69 83 83 83 88 88 88 82 82 82 73 73 73 66 66 66 68 68 68 77 77 77 -+78 78 78 94 94 94 99 99 99 93 93 93 84 84 84 78 78 78 85 85 85 99 99 99 -+105 104 105 109 110 110 112 112 113 112 112 113 109 110 110 112 112 113 112 112 113 109 110 110 -+105 104 105 109 110 110 121 121 119 109 110 110 105 105 105 112 112 113 99 99 99 101 101 101 -+96 97 98 109 110 110 115 116 115 121 121 119 122 121 126 109 110 110 96 97 98 105 105 105 -+105 105 105 121 121 119 122 121 126 117 117 117 105 105 105 103 103 102 105 105 105 99 99 99 -+91 91 91 91 91 91 94 94 94 96 96 96 88 88 88 75 75 75 71 71 71 76 76 76 -+73 73 73 81 81 81 87 87 87 87 87 87 83 83 83 81 81 81 83 83 83 85 85 85 -+87 87 87 91 91 91 93 93 93 92 92 92 92 92 92 94 94 94 95 95 94 94 94 94 -+88 88 88 85 85 85 80 80 80 75 75 75 73 73 73 73 73 73 73 73 73 74 74 74 -+75 75 75 78 78 78 82 82 82 84 84 84 87 87 87 89 89 89 91 91 91 91 91 91 -+99 99 99 96 97 98 96 97 98 96 97 98 96 97 98 99 99 99 99 99 99 99 99 99 -+95 95 94 99 99 99 109 110 110 105 105 105 96 97 98 91 91 91 92 92 92 89 89 89 -+90 90 90 89 89 89 94 94 94 105 104 105 109 110 110 105 105 105 105 104 105 105 105 105 -+103 103 102 103 103 102 103 103 102 101 101 101 101 101 101 99 99 99 96 97 98 96 97 98 -+95 95 94 99 99 99 94 94 94 91 91 91 94 94 94 89 89 89 76 76 76 70 70 70 -+63 63 63 69 69 69 74 74 74 71 71 71 67 67 67 75 75 75 84 84 84 82 82 82 -+62 62 62 61 61 61 61 61 61 56 56 56 54 54 54 70 70 70 73 73 73 60 60 60 -+67 67 67 59 59 59 58 58 58 57 57 57 50 50 50 49 49 49 49 49 49 44 44 44 -+51 51 51 54 54 54 43 43 43 29 29 29 23 23 23 40 40 40 63 63 63 61 61 61 -+46 46 46 38 38 38 29 29 29 37 37 37 49 49 49 44 44 44 28 28 28 24 24 24 -+40 40 40 53 53 53 57 57 57 52 52 52 49 49 49 42 42 42 38 38 38 43 43 43 -+49 49 49 48 48 48 45 45 45 43 43 43 42 42 42 40 40 40 38 38 38 37 37 37 -+33 33 33 28 28 28 19 19 19 11 11 11 13 13 13 20 20 20 29 29 29 36 36 36 -+38 38 38 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 -+38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 -+37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 34 34 34 34 34 34 33 33 33 -+36 36 36 34 34 34 33 33 33 34 34 34 34 34 34 31 31 31 20 20 20 10 10 10 -+6 6 6 16 16 16 20 20 20 25 25 25 29 29 29 21 21 21 10 10 10 10 10 10 -+6 6 6 10 10 10 8 8 8 0 0 0 6 6 6 27 27 27 32 32 32 19 19 19 -+16 16 16 10 10 10 11 11 11 11 11 11 4 4 4 3 3 3 8 8 8 13 13 13 -+33 33 33 16 16 16 19 19 19 49 49 49 54 54 54 19 19 19 0 0 0 0 0 0 -+11 11 11 44 44 44 49 49 49 36 36 36 23 23 23 40 40 40 46 46 46 56 56 56 -+49 49 49 44 44 44 10 10 10 0 0 0 10 10 10 25 25 25 21 21 21 25 25 25 -+17 17 17 14 14 14 11 11 11 10 10 10 11 11 11 13 13 13 13 13 13 11 11 11 -+16 16 16 49 49 49 49 49 49 40 40 40 23 23 23 14 14 14 42 42 42 48 48 48 -+37 37 37 3 3 3 0 0 0 14 14 14 14 14 14 34 34 34 38 38 38 0 0 0 -+0 0 0 16 16 16 31 31 31 34 34 34 34 34 34 42 42 42 46 46 46 43 43 43 -+ -+34 34 34 10 10 10 0 0 0 6 6 6 3 3 3 0 0 0 0 0 0 14 14 14 -+39 39 39 23 23 23 3 3 3 0 0 0 0 0 0 6 6 6 0 0 0 0 0 0 -+21 21 21 37 37 37 25 25 25 0 0 0 0 0 0 6 6 6 4 4 4 6 6 6 -+0 0 0 19 19 19 32 32 32 19 19 19 0 0 0 0 0 0 4 4 4 0 0 0 -+0 0 0 0 0 0 19 19 19 31 31 31 23 23 23 0 0 0 0 0 0 10 10 10 -+0 0 0 0 0 0 4 4 4 16 16 16 21 21 21 16 16 16 0 0 0 0 0 0 -+10 10 10 0 0 0 0 0 0 6 6 6 11 11 11 21 21 21 19 19 19 0 0 0 -+4 4 4 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 6 6 6 4 4 4 0 0 0 -+0 0 0 20 20 20 27 27 27 16 16 16 4 4 4 3 3 3 3 3 3 3 3 3 -+0 0 0 4 4 4 17 17 17 28 28 28 19 19 19 0 0 0 0 0 0 4 4 4 -+4 4 4 0 0 0 4 4 4 24 24 24 28 28 28 14 14 14 0 0 0 0 0 0 -+0 0 0 6 6 6 0 0 0 3 3 3 33 33 33 33 33 33 11 11 11 0 0 0 -+0 0 0 13 13 13 28 28 28 42 42 42 48 48 48 49 49 49 46 46 46 44 44 44 -+45 45 45 49 49 49 49 49 49 46 46 46 49 49 49 51 51 51 44 44 44 32 32 32 -+14 14 14 10 10 10 10 10 10 16 16 16 14 14 14 17 17 17 32 32 32 50 50 50 -+33 33 33 27 27 27 0 0 0 42 42 42 54 54 54 29 29 29 37 37 37 24 24 24 -+37 37 37 58 58 58 44 44 44 38 38 38 25 25 25 28 28 28 59 59 59 49 49 49 -+37 37 37 31 31 31 36 36 36 51 51 51 53 53 53 43 43 43 40 40 40 48 48 48 -+61 61 61 62 62 62 71 71 71 67 67 67 51 51 51 57 57 57 66 66 66 57 57 57 -+50 50 50 57 57 57 69 69 69 78 78 78 73 73 73 56 56 56 54 54 54 69 69 69 -+59 59 59 67 67 67 80 80 80 88 88 88 82 82 82 66 66 66 65 65 65 77 77 77 -+69 69 69 76 76 76 88 88 88 96 97 98 93 93 93 78 78 78 75 75 75 87 87 87 -+94 94 94 101 101 101 109 110 110 109 110 110 109 110 110 109 110 110 109 110 110 109 110 110 -+109 110 110 105 104 105 115 116 115 109 110 110 109 110 110 115 116 115 101 101 101 95 95 94 -+93 93 93 95 95 94 101 101 101 115 116 115 125 122 126 109 110 110 96 96 96 101 101 101 -+99 99 99 112 112 113 115 116 115 117 117 117 112 112 113 105 105 105 105 104 105 101 101 101 -+92 92 92 85 85 85 87 87 87 99 99 99 99 99 99 87 87 87 78 78 78 83 83 83 -+78 78 78 81 81 81 85 85 85 87 87 87 85 85 85 83 83 83 84 84 84 87 87 87 -+91 91 91 94 94 94 95 95 94 93 93 93 94 94 94 96 96 96 95 95 94 92 92 92 -+89 89 89 87 87 87 82 82 82 81 81 81 81 81 81 81 81 81 80 80 80 77 77 77 -+81 81 81 87 87 87 87 87 87 87 87 87 89 89 89 95 95 94 95 95 94 90 90 90 -+96 97 98 96 97 98 96 96 96 96 96 96 96 96 96 96 96 96 96 97 98 99 99 99 -+95 95 94 92 92 92 99 99 99 105 105 105 101 101 101 90 90 90 87 87 87 87 87 87 -+84 84 84 90 90 90 99 99 99 105 105 105 105 105 105 105 104 105 101 101 101 101 101 101 -+101 101 101 99 99 99 99 99 99 96 97 98 96 96 96 95 95 94 95 95 94 95 95 94 -+92 92 92 95 95 94 91 91 91 89 89 89 91 91 91 87 87 87 76 76 76 68 68 68 -+65 65 65 72 72 72 78 78 78 74 74 74 68 68 68 71 71 71 76 76 76 75 75 75 -+73 73 73 60 60 60 57 57 57 56 56 56 51 51 51 63 63 63 71 71 71 56 56 56 -+68 68 68 54 54 54 50 50 50 54 54 54 59 59 59 57 57 57 48 48 48 36 36 36 -+38 38 38 54 54 54 56 56 56 43 43 43 27 27 27 37 37 37 59 59 59 57 57 57 -+50 50 50 38 38 38 23 23 23 25 25 25 40 40 40 44 44 44 37 37 37 31 31 31 -+40 40 40 46 46 46 49 49 49 51 51 51 52 52 52 46 46 46 43 43 43 48 48 48 -+49 49 49 49 49 49 49 49 49 46 46 46 42 42 42 37 37 37 32 32 32 29 29 29 -+25 25 25 17 17 17 10 10 10 13 13 13 21 21 21 32 32 32 37 37 37 38 38 38 -+38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 -+37 37 37 37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 -+36 36 36 34 34 34 33 33 33 33 33 33 34 34 34 36 36 36 34 34 34 33 33 33 -+38 38 38 40 40 40 37 37 37 25 25 25 11 11 11 3 3 3 4 4 4 6 6 6 -+8 8 8 24 24 24 31 31 31 28 28 28 21 21 21 13 13 13 6 6 6 10 10 10 -+11 11 11 8 8 8 0 0 0 0 0 0 20 20 20 31 31 31 23 23 23 6 6 6 -+8 8 8 13 13 13 13 13 13 13 13 13 13 13 13 10 10 10 16 16 16 29 29 29 -+21 21 21 37 37 37 31 31 31 13 13 13 24 24 24 40 40 40 29 29 29 0 0 0 -+34 34 34 50 50 50 44 44 44 37 37 37 33 33 33 39 39 39 37 37 37 36 36 36 -+53 53 53 40 40 40 13 13 13 0 0 0 10 10 10 24 24 24 21 21 21 17 17 17 -+11 11 11 11 11 11 10 10 10 10 10 10 13 13 13 13 13 13 13 13 13 13 13 13 -+8 8 8 38 38 38 34 34 34 36 36 36 37 37 37 31 31 31 43 43 43 50 50 50 -+48 48 48 33 33 33 27 27 27 13 13 13 0 0 0 17 17 17 40 40 40 39 39 39 -+37 37 37 38 38 38 36 36 36 33 33 33 31 31 31 23 23 23 17 17 17 19 19 19 -+ -+43 43 43 32 32 32 14 14 14 0 0 0 0 0 0 6 6 6 3 3 3 0 0 0 -+13 13 13 28 28 28 28 28 28 6 6 6 0 0 0 0 0 0 4 4 4 0 0 0 -+0 0 0 16 16 16 37 37 37 24 24 24 0 0 0 0 0 0 14 14 14 0 0 0 -+4 4 4 0 0 0 17 17 17 34 34 34 14 14 14 0 0 0 0 0 0 0 0 0 -+8 8 8 0 0 0 0 0 0 17 17 17 28 28 28 23 23 23 6 6 6 0 0 0 -+4 4 4 6 6 6 0 0 0 0 0 0 14 14 14 31 31 31 23 23 23 0 0 0 -+3 3 3 0 0 0 3 3 3 10 10 10 0 0 0 13 13 13 27 27 27 13 13 13 -+3 3 3 0 0 0 0 0 0 6 6 6 6 6 6 0 0 0 0 0 0 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 3 3 3 6 6 6 4 4 4 0 0 0 0 0 0 0 0 0 -+16 16 16 32 32 32 19 19 19 0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 -+0 0 0 17 17 17 23 23 23 11 11 11 0 0 0 0 0 0 3 3 3 3 3 3 -+0 0 0 3 3 3 17 17 17 25 25 25 19 19 19 0 0 0 0 0 0 6 6 6 -+0 0 0 0 0 0 11 11 11 28 28 28 27 27 27 13 13 13 0 0 0 0 0 0 -+13 13 13 25 25 25 39 39 39 48 48 48 49 49 49 46 46 46 44 44 44 44 44 44 -+44 44 44 44 44 44 43 43 43 45 45 45 49 49 49 45 45 45 29 29 29 11 11 11 -+10 10 10 16 16 16 14 14 14 8 8 8 16 16 16 32 32 32 40 40 40 39 39 39 -+19 19 19 20 20 20 40 40 40 48 48 48 38 38 38 24 24 24 19 19 19 38 38 38 -+54 54 54 42 42 42 36 36 36 25 25 25 34 34 34 51 51 51 43 43 43 34 34 34 -+27 27 27 37 37 37 51 51 51 53 53 53 40 40 40 31 31 31 42 42 42 60 60 60 -+59 59 59 49 49 49 46 46 46 61 61 61 74 74 74 70 70 70 57 57 57 50 50 50 -+57 57 57 48 48 48 53 53 53 73 73 73 80 80 80 67 67 67 56 56 56 58 58 58 -+61 61 61 58 58 58 63 63 63 77 77 77 87 87 87 81 81 81 70 70 70 66 66 66 -+71 71 71 67 67 67 71 71 71 87 87 87 96 97 98 91 91 91 78 78 78 72 72 72 -+83 83 83 92 92 92 103 103 102 105 105 105 105 105 105 105 105 105 105 104 105 105 104 105 -+105 105 105 105 104 105 109 110 110 99 99 99 101 101 101 121 121 119 112 112 113 92 92 92 -+90 90 90 91 91 91 92 92 92 101 101 101 115 116 115 117 117 117 105 104 105 92 92 92 -+92 92 92 105 104 105 105 105 105 109 110 110 109 110 110 112 112 113 112 112 113 101 101 101 -+89 89 89 88 88 88 88 88 88 92 92 92 99 99 99 101 101 101 94 94 94 84 84 84 -+85 85 85 84 84 84 84 84 84 87 87 87 87 87 87 87 87 87 88 88 88 90 90 90 -+92 92 92 93 93 93 93 93 93 96 96 96 103 103 102 105 105 105 99 99 99 91 91 91 -+87 87 87 84 84 84 84 84 84 87 87 87 89 89 89 89 89 89 87 87 87 83 83 83 -+87 87 87 88 88 88 87 87 87 85 85 85 89 89 89 95 95 94 99 99 99 96 96 96 -+92 92 92 93 93 93 95 95 94 96 96 96 96 96 96 96 96 96 95 95 94 94 94 94 -+94 94 94 89 89 89 92 92 92 101 101 101 99 99 99 90 90 90 84 84 84 84 84 84 -+82 82 82 93 93 93 103 103 102 105 104 105 103 103 102 101 101 101 99 99 99 96 97 98 -+99 99 99 96 97 98 95 95 94 94 94 94 93 93 93 93 93 93 93 93 93 93 93 93 -+90 90 90 91 91 91 89 89 89 87 87 87 88 88 88 87 87 87 76 76 76 68 68 68 -+67 67 67 66 66 66 63 63 63 60 60 60 61 61 61 67 67 67 67 67 67 62 62 62 -+82 82 82 66 66 66 52 52 52 53 53 53 51 51 51 53 53 53 65 65 65 63 63 63 -+58 58 58 45 45 45 40 40 40 54 54 54 67 67 67 65 65 65 48 48 48 29 29 29 -+21 21 21 43 43 43 52 52 52 51 51 51 46 46 46 51 51 51 59 59 59 44 44 44 -+46 46 46 43 43 43 34 34 34 27 27 27 25 25 25 28 28 28 32 32 32 33 33 33 -+44 44 44 42 42 42 43 43 43 48 48 48 49 49 49 44 44 44 43 43 43 46 46 46 -+43 43 43 45 45 45 45 45 45 42 42 42 36 36 36 28 28 28 23 23 23 21 21 21 -+14 14 14 14 14 14 17 17 17 25 25 25 34 34 34 39 39 39 38 38 38 34 34 34 -+37 37 37 37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 34 34 34 -+37 37 37 37 37 37 36 36 36 36 36 36 36 36 36 36 36 36 34 34 34 34 34 34 -+33 33 33 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 34 34 34 37 37 37 -+36 36 36 34 34 34 21 21 21 0 0 0 0 0 0 0 0 0 13 13 13 13 13 13 -+21 21 21 28 28 28 27 27 27 16 16 16 8 8 8 10 10 10 11 11 11 11 11 11 -+16 16 16 4 4 4 3 3 3 20 20 20 31 31 31 20 20 20 8 8 8 11 11 11 -+13 13 13 16 16 16 10 10 10 6 6 6 13 13 13 14 14 14 23 23 23 39 39 39 -+42 42 42 38 38 38 20 20 20 0 0 0 3 3 3 29 29 29 43 43 43 43 43 43 -+40 40 40 37 37 37 25 25 25 36 36 36 48 48 48 39 39 39 20 20 20 0 0 0 -+39 39 39 40 40 40 32 32 32 24 24 24 25 25 25 21 21 21 11 11 11 11 11 11 -+10 10 10 10 10 10 10 10 10 11 11 11 13 13 13 13 13 13 11 11 11 11 11 11 -+24 24 24 38 38 38 32 32 32 36 36 36 46 46 46 44 44 44 39 39 39 25 25 25 -+42 42 42 33 33 33 24 24 24 20 20 20 25 25 25 32 32 32 39 39 39 45 45 45 -+44 44 44 34 34 34 11 11 11 0 0 0 10 10 10 4 4 4 0 0 0 0 0 0 -+ -+11 11 11 29 29 29 32 32 32 14 14 14 0 0 0 0 0 0 4 4 4 3 3 3 -+0 0 0 19 19 19 33 33 33 23 23 23 4 4 4 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 17 17 17 38 38 38 24 24 24 0 0 0 0 0 0 0 0 0 -+4 4 4 3 3 3 0 0 0 11 11 11 32 32 32 16 16 16 0 0 0 8 8 8 -+6 6 6 0 0 0 0 0 0 0 0 0 16 16 16 28 28 28 21 21 21 3 3 3 -+0 0 0 6 6 6 0 0 0 0 0 0 0 0 0 21 21 21 27 27 27 20 20 20 -+0 0 0 10 10 10 0 0 0 0 0 0 10 10 10 4 4 4 3 3 3 27 27 27 -+14 14 14 3 3 3 0 0 0 0 0 0 4 4 4 3 3 3 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 3 3 3 10 10 10 4 4 4 0 0 0 0 0 0 13 13 13 -+31 31 31 11 11 11 8 8 8 4 4 4 0 0 0 0 0 0 8 8 8 0 0 0 -+13 13 13 23 23 23 17 17 17 0 0 0 0 0 0 6 6 6 8 8 8 0 0 0 -+0 0 0 16 16 16 23 23 23 14 14 14 0 0 0 0 0 0 3 3 3 3 3 3 -+0 0 0 11 11 11 25 25 25 28 28 28 14 14 14 0 0 0 0 0 0 10 10 10 -+29 29 29 37 37 37 45 45 45 48 48 48 45 45 45 42 42 42 42 42 42 44 44 44 -+43 43 43 42 42 42 44 44 44 48 48 48 43 43 43 29 29 29 13 13 13 4 4 4 -+13 13 13 13 13 13 10 10 10 14 14 14 31 31 31 42 42 42 34 34 34 16 16 16 -+11 11 11 32 32 32 53 53 53 34 34 34 17 17 17 25 25 25 32 32 32 49 49 49 -+44 44 44 23 23 23 21 21 21 32 32 32 49 49 49 52 52 52 32 32 32 28 28 28 -+36 36 36 50 50 50 54 54 54 42 42 42 32 32 32 38 38 38 51 51 51 60 60 60 -+46 46 46 37 37 37 37 37 37 54 54 54 71 71 71 68 68 68 54 54 54 46 46 46 -+51 51 51 57 57 57 56 56 56 53 53 53 65 65 65 78 78 78 71 71 71 48 48 48 -+63 63 63 60 60 60 59 59 59 65 65 65 77 77 77 87 87 87 78 78 78 61 61 61 -+72 72 72 70 70 70 69 69 69 74 74 74 87 87 87 94 94 94 87 87 87 71 71 71 -+72 72 72 81 81 81 92 92 92 101 101 101 105 104 105 103 103 102 103 103 102 105 104 105 -+103 103 102 105 104 105 105 105 105 91 91 91 89 89 89 109 110 110 112 112 113 101 101 101 -+87 87 87 88 88 88 88 88 88 90 90 90 101 101 101 112 112 113 112 112 113 101 101 101 -+91 91 91 93 93 93 99 99 99 105 105 105 101 101 101 103 103 102 115 116 115 105 105 105 -+90 90 90 90 90 90 87 87 87 85 85 85 94 94 94 105 104 105 99 99 99 85 85 85 -+89 89 89 87 87 87 87 87 87 88 88 88 92 92 92 96 96 96 99 99 99 101 101 101 -+92 92 92 88 88 88 87 87 87 92 92 92 105 105 105 115 116 115 109 110 110 101 101 101 -+88 88 88 85 85 85 83 83 83 84 84 84 88 88 88 92 92 92 92 92 92 91 91 91 -+94 94 94 87 87 87 82 82 82 83 83 83 87 87 87 91 91 91 96 97 98 103 103 102 -+90 90 90 90 90 90 91 91 91 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 -+91 91 91 90 90 90 89 89 89 91 91 91 93 93 93 90 90 90 84 84 84 82 82 82 -+85 85 85 95 95 94 103 103 102 101 101 101 96 97 98 96 97 98 99 99 99 96 96 96 -+95 95 94 94 94 94 93 93 93 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 -+89 89 89 88 88 88 87 87 87 87 87 87 87 87 87 85 85 85 78 78 78 68 68 68 -+80 80 80 72 72 72 62 62 62 58 58 58 65 65 65 73 73 73 73 73 73 71 71 71 -+74 74 74 75 75 75 56 56 56 50 50 50 52 52 52 51 51 51 59 59 59 63 63 63 -+59 59 59 49 49 49 39 39 39 46 46 46 62 62 62 67 67 67 54 54 54 42 42 42 -+27 27 27 32 32 32 33 33 33 43 43 43 52 52 52 61 61 61 58 58 58 31 31 31 -+34 34 34 40 40 40 45 45 45 38 38 38 25 25 25 20 20 20 24 24 24 28 28 28 -+29 29 29 27 27 27 33 33 33 44 44 44 48 48 48 46 46 46 46 46 46 48 48 48 -+32 32 32 32 32 32 32 32 32 27 27 27 21 21 21 16 16 16 14 14 14 14 14 14 -+16 16 16 21 21 21 29 29 29 37 37 37 39 39 39 39 39 39 36 36 36 34 34 34 -+36 36 36 36 36 36 36 36 36 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 -+36 36 36 36 36 36 36 36 36 36 36 36 34 34 34 34 34 34 34 34 34 34 34 34 -+31 31 31 34 34 34 37 37 37 36 36 36 32 32 32 31 31 31 34 34 34 38 38 38 -+16 16 16 25 25 25 32 32 32 24 24 24 8 8 8 0 0 0 0 0 0 10 10 10 -+29 29 29 24 24 24 13 13 13 3 3 3 3 3 3 13 13 13 16 16 16 8 8 8 -+13 13 13 13 13 13 23 23 23 34 34 34 29 29 29 10 10 10 4 4 4 17 17 17 -+16 16 16 16 16 16 6 6 6 8 8 8 21 21 21 27 27 27 32 32 32 45 45 45 -+42 42 42 17 17 17 0 0 0 0 0 0 3 3 3 10 10 10 31 31 31 51 51 51 -+34 34 34 43 43 43 36 36 36 40 40 40 50 50 50 38 38 38 23 23 23 0 0 0 -+34 34 34 44 44 44 36 36 36 27 27 27 29 29 29 14 14 14 0 0 0 16 16 16 -+11 11 11 11 11 11 13 13 13 13 13 13 11 11 11 10 10 10 10 10 10 10 10 10 -+20 20 20 27 27 27 27 27 27 28 28 28 33 33 33 44 44 44 40 40 40 10 10 10 -+37 37 37 21 21 21 37 37 37 52 52 52 40 40 40 29 29 29 25 25 25 10 10 10 -+27 27 27 25 25 25 8 8 8 0 0 0 0 0 0 0 0 0 0 0 0 11 11 11 -+ -+0 0 0 11 11 11 27 27 27 27 27 27 16 16 16 0 0 0 0 0 0 8 8 8 -+0 0 0 0 0 0 13 13 13 25 25 25 24 24 24 8 8 8 0 0 0 0 0 0 -+14 14 14 0 0 0 0 0 0 16 16 16 38 38 38 25 25 25 0 0 0 0 0 0 -+3 3 3 8 8 8 0 0 0 0 0 0 13 13 13 29 29 29 20 20 20 0 0 0 -+0 0 0 4 4 4 6 6 6 0 0 0 0 0 0 14 14 14 24 24 24 23 23 23 -+0 0 0 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 11 11 11 29 29 29 -+13 13 13 11 11 11 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 13 13 13 -+24 24 24 16 16 16 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 10 10 10 28 28 28 -+13 13 13 3 3 3 0 0 0 6 6 6 3 3 3 0 0 0 4 4 4 6 6 6 -+20 20 20 16 16 16 6 6 6 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 -+17 17 17 21 21 21 16 16 16 0 0 0 0 0 0 6 6 6 6 6 6 0 0 0 -+0 0 0 29 29 29 25 25 25 6 6 6 6 6 6 8 8 8 8 8 8 20 20 20 -+42 42 42 43 43 43 45 45 45 43 43 43 40 40 40 39 39 39 40 40 40 43 43 43 -+42 42 42 44 44 44 49 49 49 46 46 46 32 32 32 11 11 11 6 6 6 14 14 14 -+13 13 13 0 0 0 8 8 8 29 29 29 40 40 40 34 34 34 19 19 19 8 8 8 -+19 19 19 44 44 44 28 28 28 16 16 16 17 17 17 33 33 33 57 57 57 43 43 43 -+21 21 21 33 33 33 23 23 23 48 48 48 49 49 49 21 21 21 32 32 32 31 31 31 -+50 50 50 50 50 50 40 40 40 29 29 29 36 36 36 53 53 53 56 56 56 46 46 46 -+40 40 40 43 43 43 56 56 56 56 56 56 48 48 48 57 57 57 66 66 66 56 56 56 -+40 40 40 49 49 49 53 53 53 50 50 50 52 52 52 69 69 69 76 76 76 69 69 69 -+54 54 54 59 59 59 60 60 60 58 58 58 62 62 62 77 77 77 84 84 84 76 76 76 -+63 63 63 70 70 70 72 72 72 68 68 68 69 69 69 84 84 84 92 92 92 88 88 88 -+70 70 70 72 72 72 80 80 80 90 90 90 96 97 98 101 101 101 103 103 102 105 104 105 -+99 99 99 101 101 101 101 101 101 93 93 93 84 84 84 89 89 89 101 101 101 109 110 110 -+89 89 89 83 83 83 85 85 85 88 88 88 88 88 88 99 99 99 112 112 113 112 112 113 -+95 95 94 88 88 88 93 93 93 105 105 105 96 97 98 88 88 88 105 104 105 115 116 115 -+96 96 96 89 89 89 82 82 82 83 83 83 91 91 91 95 95 94 92 92 92 87 87 87 -+87 87 87 87 87 87 87 87 87 85 85 85 90 90 90 99 99 99 103 103 102 103 103 102 -+101 101 101 93 93 93 87 87 87 87 87 87 99 99 99 109 110 110 112 112 113 105 105 105 -+96 96 96 90 90 90 83 83 83 78 78 78 82 82 82 88 88 88 94 94 94 96 97 98 -+99 99 99 90 90 90 83 83 83 83 83 83 84 84 84 87 87 87 92 92 92 101 101 101 -+93 93 93 90 90 90 87 87 87 85 85 85 84 84 84 87 87 87 89 89 89 91 91 91 -+87 87 87 89 89 89 87 87 87 83 83 83 87 87 87 88 88 88 83 83 83 80 80 80 -+89 89 89 96 96 96 99 99 99 96 96 96 93 93 93 94 94 94 95 95 94 94 94 94 -+91 91 91 91 91 91 90 90 90 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 -+87 87 87 85 85 85 85 85 85 85 85 85 84 84 84 84 84 84 78 78 78 68 68 68 -+61 61 61 62 62 62 57 57 57 53 53 53 54 54 54 53 53 53 50 50 50 49 49 49 -+52 52 52 74 74 74 58 58 58 46 46 46 54 54 54 58 58 58 62 62 62 59 59 59 -+69 69 69 62 62 62 46 46 46 37 37 37 46 46 46 60 60 60 62 62 62 59 59 59 -+39 39 39 31 31 31 21 21 21 38 38 38 54 54 54 61 61 61 52 52 52 20 20 20 -+21 21 21 28 28 28 42 42 42 48 48 48 40 40 40 32 32 32 27 27 27 21 21 21 -+25 25 25 25 25 25 33 33 33 39 39 39 36 36 36 29 29 29 24 24 24 17 17 17 -+20 20 20 19 19 19 17 17 17 14 14 14 13 13 13 13 13 13 14 14 14 17 17 17 -+27 27 27 32 32 32 37 37 37 38 38 38 37 37 37 34 34 34 36 36 36 37 37 37 -+34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 33 -+36 36 36 36 36 36 34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 -+31 31 31 32 32 32 34 34 34 34 34 34 32 32 32 31 31 31 31 31 31 32 32 32 -+6 6 6 8 8 8 23 23 23 36 36 36 32 32 32 19 19 19 20 20 20 34 34 34 -+25 25 25 16 16 16 8 8 8 6 6 6 10 10 10 16 16 16 16 16 16 3 3 3 -+10 10 10 23 23 23 39 39 39 37 37 37 17 17 17 8 8 8 13 13 13 13 13 13 -+11 11 11 11 11 11 11 11 11 20 20 20 29 29 29 32 32 32 31 31 31 36 36 36 -+43 43 43 43 43 43 39 39 39 32 32 32 31 31 31 39 39 39 39 39 39 25 25 25 -+34 34 34 56 56 56 48 48 48 37 37 37 44 44 44 43 43 43 44 44 44 20 20 20 -+42 42 42 46 46 46 33 33 33 28 28 28 37 37 37 23 23 23 4 4 4 20 20 20 -+13 13 13 13 13 13 13 13 13 13 13 13 10 10 10 10 10 10 11 11 11 11 11 11 -+10 10 10 23 23 23 32 32 32 27 27 27 23 23 23 40 40 40 48 48 48 27 27 27 -+33 33 33 37 37 37 39 39 39 43 43 43 40 40 40 19 19 19 0 0 0 4 4 4 -+14 14 14 29 29 29 34 34 34 20 20 20 0 0 0 0 0 0 4 4 4 24 24 24 -+ -+6 6 6 3 3 3 6 6 6 23 23 23 31 31 31 14 14 14 0 0 0 0 0 0 -+8 8 8 0 0 0 0 0 0 11 11 11 24 24 24 20 20 20 8 8 8 0 0 0 -+0 0 0 10 10 10 0 0 0 0 0 0 20 20 20 36 36 36 23 23 23 6 6 6 -+4 4 4 0 0 0 4 4 4 0 0 0 0 0 0 19 19 19 34 34 34 11 11 11 -+0 0 0 3 3 3 4 4 4 0 0 0 0 0 0 0 0 0 13 13 13 25 25 25 -+14 14 14 3 3 3 0 0 0 8 8 8 0 0 0 0 0 0 0 0 0 19 19 19 -+27 27 27 11 11 11 10 10 10 6 6 6 0 0 0 3 3 3 10 10 10 0 0 0 -+16 16 16 20 20 20 14 14 14 0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 11 11 11 17 17 17 21 21 21 -+0 0 0 10 10 10 0 0 0 0 0 0 14 14 14 6 6 6 0 0 0 23 23 23 -+13 13 13 3 3 3 0 0 0 4 4 4 4 4 4 0 0 0 3 3 3 14 14 14 -+23 23 23 13 13 13 0 0 0 0 0 0 0 0 0 6 6 6 4 4 4 3 3 3 -+20 20 20 24 24 24 13 13 13 0 0 0 0 0 0 11 11 11 21 21 21 33 33 33 -+45 45 45 44 44 44 42 42 42 40 40 40 39 39 39 38 38 38 39 39 39 39 39 39 -+44 44 44 45 45 45 43 43 43 32 32 32 16 16 16 4 4 4 8 8 8 19 19 19 -+10 10 10 11 11 11 23 23 23 36 36 36 32 32 32 16 16 16 14 14 14 25 25 25 -+44 44 44 23 23 23 33 33 33 10 10 10 23 23 23 53 53 53 27 27 27 27 27 27 -+23 23 23 28 28 28 52 52 52 38 38 38 27 27 27 28 28 28 16 16 16 46 46 46 -+46 46 46 38 38 38 31 31 31 32 32 32 43 43 43 51 51 51 45 45 45 36 36 36 -+36 36 36 50 50 50 59 59 59 50 50 50 38 38 38 51 51 51 68 68 68 68 68 68 -+51 51 51 40 40 40 44 44 44 53 53 53 51 51 51 51 51 51 67 67 67 80 80 80 -+60 60 60 56 56 56 57 57 57 57 57 57 54 54 54 63 63 63 77 77 77 83 83 83 -+70 70 70 66 66 66 68 68 68 67 67 67 62 62 62 70 70 70 85 85 85 91 91 91 -+81 81 81 74 74 74 72 72 72 78 78 78 88 88 88 94 94 94 99 99 99 101 101 101 -+99 99 99 96 97 98 96 96 96 95 95 94 87 87 87 76 76 76 84 84 84 103 103 102 -+101 101 101 85 85 85 83 83 83 85 85 85 82 82 82 90 90 90 105 104 105 105 105 105 -+103 103 102 95 95 94 87 87 87 99 99 99 101 101 101 83 83 83 88 88 88 105 105 105 -+103 103 102 93 93 93 85 85 85 87 87 87 89 89 89 88 88 88 88 88 88 89 89 89 -+88 88 88 91 91 91 87 87 87 81 81 81 84 84 84 95 95 94 101 101 101 96 97 98 -+105 105 105 101 101 101 92 92 92 87 87 87 89 89 89 99 99 99 103 103 102 105 104 105 -+103 103 102 96 96 96 87 87 87 78 78 78 77 77 77 81 81 81 87 87 87 92 92 92 -+101 101 101 96 96 96 90 90 90 85 85 85 82 82 82 82 82 82 87 87 87 90 90 90 -+94 94 94 91 91 91 87 87 87 82 82 82 80 80 80 80 80 80 82 82 82 84 84 84 -+80 80 80 85 85 85 83 83 83 78 78 78 82 82 82 82 82 82 78 78 78 78 78 78 -+91 91 91 93 93 93 94 94 94 92 92 92 90 90 90 90 90 90 90 90 90 90 90 90 -+87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 85 85 85 85 85 85 -+84 84 84 81 81 81 82 82 82 82 82 82 81 81 81 82 82 82 77 77 77 66 66 66 -+53 53 53 60 60 60 60 60 60 58 58 58 56 56 56 49 49 49 42 42 42 45 45 45 -+51 51 51 66 66 66 50 50 50 50 50 50 57 57 57 54 54 54 59 59 59 50 50 50 -+62 62 62 69 69 69 56 56 56 34 34 34 37 37 37 51 51 51 61 61 61 65 65 65 -+51 51 51 40 40 40 33 33 33 49 49 49 58 58 58 57 57 57 50 50 50 29 29 29 -+20 20 20 16 16 16 31 31 31 49 49 49 51 51 51 46 46 46 38 38 38 28 28 28 -+23 23 23 25 25 25 33 33 33 33 33 33 23 23 23 19 19 19 17 17 17 8 8 8 -+19 19 19 17 17 17 16 16 16 16 16 16 20 20 20 25 25 25 31 31 31 33 33 33 -+34 34 34 36 36 36 37 37 37 36 36 36 34 34 34 33 33 33 34 34 34 37 37 37 -+34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 32 32 -+34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 33 -+32 32 32 28 28 28 25 25 25 28 28 28 33 33 33 33 33 33 27 27 27 20 20 20 -+45 45 45 25 25 25 4 4 4 8 8 8 25 25 25 36 36 36 34 34 34 28 28 28 -+16 16 16 10 10 10 16 16 16 20 20 20 14 14 14 11 11 11 13 13 13 8 8 8 -+20 20 20 24 24 24 40 40 40 37 37 37 13 13 13 10 10 10 17 17 17 4 4 4 -+11 11 11 10 10 10 17 17 17 24 24 24 19 19 19 8 8 8 3 3 3 0 0 0 -+3 3 3 4 4 4 24 24 24 38 38 38 38 38 38 37 37 37 37 37 37 32 32 32 -+25 25 25 44 44 44 36 36 36 25 25 25 34 34 34 31 31 31 49 49 49 39 39 39 -+44 44 44 39 39 39 32 32 32 37 37 37 43 43 43 29 29 29 11 11 11 13 13 13 -+11 11 11 13 13 13 13 13 13 11 11 11 10 10 10 11 11 11 14 14 14 17 17 17 -+27 27 27 42 42 42 51 51 51 42 42 42 34 34 34 40 40 40 43 43 43 36 36 36 -+38 38 38 40 40 40 4 4 4 0 0 0 38 38 38 37 37 37 10 10 10 17 17 17 -+0 0 0 13 13 13 29 29 29 33 33 33 16 16 16 3 3 3 19 19 19 37 37 37 -+ -+19 19 19 8 8 8 0 0 0 13 13 13 33 33 33 25 25 25 6 6 6 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 27 27 27 23 23 23 4 4 4 -+0 0 0 0 0 0 10 10 10 3 3 3 0 0 0 13 13 13 27 27 27 19 19 19 -+0 0 0 3 3 3 0 0 0 3 3 3 6 6 6 0 0 0 10 10 10 44 44 44 -+21 21 21 0 0 0 0 0 0 8 8 8 10 10 10 0 0 0 0 0 0 11 11 11 -+32 32 32 17 17 17 0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 -+16 16 16 32 32 32 16 16 16 0 0 0 8 8 8 11 11 11 0 0 0 0 0 0 -+0 0 0 16 16 16 23 23 23 11 11 11 0 0 0 4 4 4 8 8 8 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 8 8 8 6 6 6 0 0 0 8 8 8 21 21 21 17 17 17 0 0 0 -+10 10 10 0 0 0 0 0 0 3 3 3 0 0 0 10 10 10 23 23 23 19 19 19 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 16 16 32 32 32 -+19 19 19 0 0 0 0 0 0 4 4 4 10 10 10 0 0 0 4 4 4 21 21 21 -+38 38 38 0 0 0 0 0 0 11 11 11 0 0 0 3 3 3 32 32 32 44 44 44 -+44 44 44 42 42 42 39 39 39 39 39 39 39 39 39 39 39 39 38 38 38 37 37 37 -+46 46 46 43 43 43 29 29 29 10 10 10 0 0 0 8 8 8 13 13 13 13 13 13 -+11 11 11 29 29 29 43 43 43 34 34 34 11 11 11 0 0 0 20 20 20 44 44 44 -+32 32 32 16 16 16 11 11 11 31 31 31 45 45 45 42 42 42 27 27 27 14 14 14 -+17 17 17 45 45 45 40 40 40 28 28 28 21 21 21 24 24 24 43 43 43 50 50 50 -+29 29 29 25 25 25 32 32 32 45 45 45 46 46 46 36 36 36 32 32 32 37 37 37 -+45 45 45 59 59 59 48 48 48 36 36 36 43 43 43 39 39 39 37 37 37 53 53 53 -+70 70 70 52 52 52 45 45 45 49 49 49 45 45 45 46 46 46 53 53 53 58 58 58 -+81 81 81 58 58 58 51 51 51 58 58 58 56 56 56 52 52 52 61 61 61 71 71 71 -+92 92 92 68 68 68 60 60 60 67 67 67 65 65 65 60 60 60 67 67 67 74 74 74 -+93 93 93 80 80 80 69 69 69 71 71 71 81 81 81 88 88 88 92 92 92 94 94 94 -+99 99 99 99 99 99 92 92 92 93 93 93 91 91 91 76 76 76 74 74 74 87 87 87 -+112 112 113 91 91 91 82 82 82 80 80 80 77 77 77 90 90 90 99 99 99 90 90 90 -+105 105 105 105 105 105 83 83 83 87 87 87 105 105 105 91 91 91 78 78 78 89 89 89 -+105 105 105 101 101 101 93 93 93 88 88 88 88 88 88 89 89 89 89 89 89 88 88 88 -+96 97 98 101 101 101 95 95 94 83 83 83 83 83 83 95 95 94 99 99 99 93 93 93 -+99 99 99 101 101 101 96 96 96 88 88 88 85 85 85 91 91 91 99 99 99 105 104 105 -+105 105 105 101 101 101 91 91 91 83 83 83 77 77 77 77 77 77 80 80 80 83 83 83 -+103 103 102 103 103 102 99 99 99 87 87 87 81 81 81 81 81 81 82 82 82 80 80 80 -+93 93 93 91 91 91 87 87 87 83 83 83 80 80 80 76 76 76 75 75 75 75 75 75 -+75 75 75 81 81 81 80 80 80 77 77 77 81 81 81 77 77 77 73 73 73 77 77 77 -+92 92 92 91 91 91 90 90 90 90 90 90 89 89 89 88 88 88 87 87 87 87 87 87 -+84 84 84 84 84 84 85 85 85 85 85 85 85 85 85 84 84 84 83 83 83 82 82 82 -+82 82 82 77 77 77 80 80 80 81 81 81 77 77 77 80 80 80 76 76 76 65 65 65 -+53 53 53 57 57 57 52 52 52 49 49 49 52 52 52 52 52 52 54 54 54 63 63 63 -+73 73 73 62 62 62 44 44 44 57 57 57 56 56 56 38 38 38 44 44 44 38 38 38 -+43 43 43 63 63 63 61 61 61 40 40 40 36 36 36 48 48 48 56 56 56 58 58 58 -+63 63 63 53 53 53 46 46 46 56 56 56 56 56 56 51 51 51 57 57 57 51 51 51 -+28 28 28 13 13 13 23 23 23 44 44 44 52 52 52 51 51 51 48 48 48 40 40 40 -+42 42 42 43 43 43 44 44 44 34 34 34 19 19 19 19 19 19 23 23 23 17 17 17 -+24 24 24 23 23 23 21 21 21 25 25 25 33 33 33 40 40 40 45 45 45 48 48 48 -+36 36 36 34 34 34 34 34 34 34 34 34 36 36 36 36 36 36 34 34 34 33 33 33 -+33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 -+34 34 34 34 34 34 34 34 34 34 34 34 33 33 33 33 33 33 33 33 33 33 33 33 -+33 33 33 23 23 23 16 16 16 23 23 23 34 34 34 37 37 37 24 24 24 8 8 8 -+6 6 6 34 34 34 43 43 43 27 27 27 19 19 19 31 31 31 31 31 31 16 16 16 -+8 8 8 10 10 10 24 24 24 28 28 28 13 13 13 3 3 3 11 11 11 17 17 17 -+33 33 33 17 17 17 32 32 32 39 39 39 16 16 16 8 8 8 16 16 16 3 3 3 -+10 10 10 10 10 10 24 24 24 29 29 29 16 16 16 4 4 4 3 3 3 0 0 0 -+0 0 0 16 16 16 33 33 33 34 34 34 21 21 21 23 23 23 32 32 32 31 31 31 -+37 37 37 46 46 46 39 39 39 36 36 36 31 31 31 0 0 0 33 33 33 49 49 49 -+38 38 38 27 27 27 28 28 28 38 38 38 34 34 34 21 21 21 11 11 11 3 3 3 -+10 10 10 11 11 11 13 13 13 11 11 11 10 10 10 11 11 11 17 17 17 21 21 21 -+14 14 14 34 34 34 43 43 43 39 39 39 40 40 40 37 37 37 25 25 25 27 27 27 -+46 46 46 33 33 33 16 16 16 0 0 0 8 8 8 27 27 27 25 25 25 3 3 3 -+4 4 4 0 0 0 6 6 6 31 31 31 31 31 31 25 25 25 34 34 34 43 43 43 -+ -+32 32 32 21 21 21 13 13 13 0 0 0 6 6 6 33 33 33 23 23 23 6 6 6 -+0 0 0 4 4 4 3 3 3 0 0 0 0 0 0 10 10 10 23 23 23 29 29 29 -+10 10 10 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 6 6 6 31 31 31 -+25 25 25 10 10 10 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 -+34 34 34 17 17 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 -+13 13 13 24 24 24 23 23 23 6 6 6 0 0 0 0 0 0 3 3 3 0 0 0 -+0 0 0 14 14 14 25 25 25 14 14 14 0 0 0 0 0 0 0 0 0 4 4 4 -+0 0 0 0 0 0 13 13 13 20 20 20 14 14 14 0 0 0 0 0 0 0 0 0 -+4 4 4 0 0 0 0 0 0 4 4 4 4 4 4 0 0 0 0 0 0 4 4 4 -+0 0 0 0 0 0 0 0 0 14 14 14 20 20 20 14 14 14 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 14 14 14 21 21 21 13 13 13 0 0 0 -+0 0 0 3 3 3 0 0 0 0 0 0 3 3 3 20 20 20 21 21 21 13 13 13 -+3 3 3 0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 17 17 17 36 36 36 -+3 3 3 4 4 4 0 0 0 0 0 0 8 8 8 28 28 28 40 40 40 44 44 44 -+43 43 43 38 38 38 37 37 37 40 40 40 40 40 40 37 37 37 38 38 38 44 44 44 -+43 43 43 28 28 28 10 10 10 3 3 3 6 6 6 10 10 10 10 10 10 10 10 10 -+24 24 24 43 43 43 29 29 29 6 6 6 8 8 8 29 29 29 43 43 43 24 24 24 -+13 13 13 10 10 10 23 23 23 42 42 42 39 39 39 19 19 19 11 11 11 23 23 23 -+38 38 38 39 39 39 31 31 31 20 20 20 25 25 25 39 39 39 40 40 40 32 32 32 -+24 24 24 32 32 32 42 42 42 45 45 45 38 38 38 29 29 29 34 34 34 46 46 46 -+51 51 51 44 44 44 37 37 37 34 34 34 38 38 38 42 42 42 42 42 42 40 40 40 -+59 59 59 63 63 63 58 58 58 44 44 44 39 39 39 48 48 48 50 50 50 46 46 46 -+66 66 66 72 72 72 63 63 63 50 50 50 52 52 52 57 57 57 54 54 54 52 52 52 -+68 68 68 78 78 78 73 73 73 60 60 60 61 61 61 65 65 65 63 63 63 62 62 62 -+67 67 67 87 87 87 87 87 87 65 65 65 61 61 61 84 84 84 93 93 93 84 84 84 -+94 94 94 92 92 92 95 95 94 96 97 98 88 88 88 73 73 73 70 70 70 77 77 77 -+95 95 94 101 101 101 96 97 98 82 82 82 74 74 74 83 83 83 90 90 90 88 88 88 -+83 83 83 103 103 102 101 101 101 88 88 88 91 91 91 96 96 96 87 87 87 76 76 76 -+96 97 98 87 87 87 87 87 87 81 81 81 81 81 81 87 87 87 87 87 87 96 96 96 -+92 92 92 99 99 99 105 105 105 95 95 94 77 77 77 82 82 82 94 94 94 96 96 96 -+81 81 81 96 96 96 105 105 105 96 96 96 78 78 78 73 73 73 87 87 87 103 103 102 -+96 96 96 101 101 101 99 99 99 87 87 87 76 76 76 76 76 76 83 83 83 89 89 89 -+93 93 93 82 82 82 94 94 94 105 105 105 91 91 91 80 80 80 78 78 78 72 72 72 -+80 80 80 80 80 80 88 88 88 91 91 91 80 80 80 71 71 71 72 72 72 71 71 71 -+71 71 71 68 68 68 71 71 71 73 73 73 69 69 69 71 71 71 75 75 75 74 74 74 -+75 75 75 85 85 85 90 90 90 88 88 88 85 85 85 87 87 87 87 87 87 84 84 84 -+87 87 87 85 85 85 83 83 83 82 82 82 81 81 81 81 81 81 78 78 78 76 76 76 -+83 83 83 72 72 72 60 60 60 65 65 65 72 72 72 62 62 62 57 57 57 71 71 71 -+50 50 50 50 50 50 52 52 52 53 53 53 50 50 50 49 49 49 59 59 59 72 72 72 -+68 68 68 70 70 70 65 65 65 53 53 53 43 43 43 40 40 40 40 40 40 38 38 38 -+52 52 52 66 66 66 59 59 59 40 40 40 33 33 33 39 39 39 48 48 48 57 57 57 -+52 52 52 50 50 50 51 51 51 59 59 59 53 53 53 28 28 28 21 21 21 43 43 43 -+48 48 48 43 43 43 38 38 38 39 39 39 44 44 44 49 49 49 48 48 48 45 45 45 -+38 38 38 37 37 37 39 39 39 46 46 46 46 46 46 39 39 39 36 36 36 36 36 36 -+38 38 38 42 42 42 44 44 44 40 40 40 34 34 34 32 32 32 37 37 37 42 42 42 -+39 39 39 36 36 36 32 32 32 32 32 32 34 34 34 36 36 36 34 34 34 32 32 32 -+32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 33 -+33 33 33 33 33 33 33 33 33 32 32 32 32 32 32 33 33 33 33 33 33 34 34 34 -+37 37 37 38 38 38 33 33 33 21 21 21 10 10 10 13 13 13 27 27 27 39 39 39 -+10 10 10 4 4 4 4 4 4 24 24 24 37 37 37 29 29 29 14 14 14 14 14 14 -+6 6 6 13 13 13 29 29 29 33 33 33 14 14 14 4 4 4 19 19 19 32 32 32 -+4 4 4 23 23 23 34 34 34 29 29 29 16 16 16 8 8 8 11 11 11 16 16 16 -+13 13 13 25 25 25 24 24 24 14 14 14 10 10 10 4 4 4 0 0 0 10 10 10 -+31 31 31 36 36 36 24 24 24 17 17 17 27 27 27 19 19 19 0 0 0 3 3 3 -+11 11 11 25 25 25 40 40 40 46 46 46 43 43 43 36 36 36 33 33 33 36 36 36 -+37 37 37 37 37 37 28 28 28 29 29 29 21 21 21 6 6 6 11 11 11 4 4 4 -+13 13 13 11 11 11 8 8 8 8 8 8 11 11 11 14 14 14 14 14 14 13 13 13 -+21 21 21 40 40 40 46 46 46 39 39 39 25 25 25 28 28 28 33 33 33 10 10 10 -+29 29 29 43 43 43 21 21 21 0 0 0 10 10 10 19 19 19 23 23 23 42 42 42 -+0 0 0 0 0 0 13 13 13 23 23 23 28 28 28 40 40 40 34 34 34 0 0 0 -+ -+11 11 11 37 37 37 17 17 17 8 8 8 0 0 0 0 0 0 33 33 33 24 24 24 -+11 11 11 0 0 0 0 0 0 6 6 6 6 6 6 0 0 0 4 4 4 24 24 24 -+28 28 28 10 10 10 0 0 0 0 0 0 3 3 3 0 0 0 6 6 6 19 19 19 -+31 31 31 27 27 27 19 19 19 13 13 13 13 13 13 16 16 16 16 16 16 14 14 14 -+17 17 17 23 23 23 19 19 19 6 6 6 0 0 0 0 0 0 3 3 3 0 0 0 -+0 0 0 13 13 13 20 20 20 16 16 16 3 3 3 0 0 0 0 0 0 3 3 3 -+0 0 0 3 3 3 13 13 13 21 21 21 19 19 19 4 4 4 0 0 0 0 0 0 -+6 6 6 4 4 4 4 4 4 10 10 10 16 16 16 16 16 16 6 6 6 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 -+0 0 0 6 6 6 16 16 16 16 16 16 10 10 10 4 4 4 3 3 3 3 3 3 -+3 3 3 0 0 0 4 4 4 14 14 14 16 16 16 8 8 8 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 6 6 6 16 16 16 20 20 20 13 13 13 0 0 0 -+4 4 4 3 3 3 0 0 0 0 0 0 6 6 6 20 20 20 20 20 20 11 11 11 -+6 6 6 0 0 0 0 0 0 4 4 4 20 20 20 36 36 36 40 40 40 40 40 40 -+38 38 38 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 39 39 39 38 38 38 -+25 25 25 10 10 10 3 3 3 10 10 10 10 10 10 3 3 3 10 10 10 24 24 24 -+34 34 34 27 27 27 4 4 4 8 8 8 25 25 25 36 36 36 33 33 33 8 8 8 -+11 11 11 27 27 27 38 38 38 33 33 33 20 20 20 14 14 14 25 25 25 37 37 37 -+37 37 37 24 24 24 17 17 17 25 25 25 39 39 39 42 42 42 32 32 32 23 23 23 -+29 29 29 37 37 37 40 40 40 37 37 37 29 29 29 31 31 31 38 38 38 45 45 45 -+42 42 42 39 39 39 36 36 36 36 36 36 38 38 38 40 40 40 40 40 40 39 39 39 -+45 45 45 53 53 53 59 59 59 53 53 53 44 44 44 42 42 42 45 45 45 50 50 50 -+48 48 48 63 63 63 69 69 69 62 62 62 54 54 54 49 49 49 51 51 51 60 60 60 -+54 54 54 70 70 70 75 75 75 69 69 69 62 62 62 57 57 57 58 58 58 67 67 67 -+61 61 61 71 71 71 81 81 81 80 80 80 70 70 70 67 67 67 77 77 77 92 92 92 -+89 89 89 87 87 87 89 89 89 93 93 93 90 90 90 81 81 81 72 72 72 71 71 71 -+81 81 81 92 92 92 96 96 96 91 91 91 82 82 82 71 71 71 76 76 76 96 97 98 -+78 78 78 87 87 87 96 96 96 95 95 94 90 90 90 91 91 91 89 89 89 80 80 80 -+87 87 87 80 80 80 82 82 82 84 84 84 87 87 87 80 80 80 73 73 73 89 89 89 -+96 97 98 90 90 90 90 90 90 95 95 94 92 92 92 80 80 80 81 81 81 94 94 94 -+85 85 85 82 82 82 87 87 87 96 97 98 94 94 94 82 82 82 82 82 82 92 92 92 -+99 99 99 93 93 93 96 96 96 101 101 101 90 90 90 72 72 72 75 75 75 95 95 94 -+77 77 77 75 75 75 81 81 81 89 89 89 92 92 92 93 93 93 91 91 91 87 87 87 -+76 76 76 70 70 70 75 75 75 85 85 85 80 80 80 72 72 72 71 71 71 71 71 71 -+70 70 70 67 67 67 71 71 71 73 73 73 70 70 70 71 71 71 73 73 73 69 69 69 -+70 70 70 77 77 77 84 84 84 84 84 84 83 83 83 82 82 82 82 82 82 81 81 81 -+81 81 81 80 80 80 78 78 78 78 78 78 80 80 80 80 80 80 77 77 77 76 76 76 -+65 65 65 57 57 57 60 60 60 62 62 62 52 52 52 52 52 52 61 61 61 63 63 63 -+52 52 52 50 50 50 49 49 49 50 50 50 50 50 50 49 49 49 51 51 51 54 54 54 -+48 48 48 49 49 49 48 48 48 44 44 44 42 42 42 42 42 42 40 40 40 38 38 38 -+53 53 53 59 59 59 54 54 54 46 46 46 37 37 37 28 28 28 29 29 29 43 43 43 -+54 54 54 54 54 54 57 57 57 60 60 60 54 54 54 31 31 31 14 14 14 23 23 23 -+45 45 45 44 44 44 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 -+42 42 42 38 38 38 37 37 37 39 39 39 43 43 43 42 42 42 39 39 39 37 37 37 -+34 34 34 38 38 38 42 42 42 40 40 40 37 37 37 34 34 34 34 34 34 36 36 36 -+38 38 38 38 38 38 37 37 37 34 34 34 31 31 31 31 31 31 32 32 32 33 33 33 -+32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 -+28 28 28 28 28 28 31 31 31 34 34 34 31 31 31 19 19 19 6 6 6 0 0 0 -+20 20 20 28 28 28 37 37 37 38 38 38 33 33 33 28 28 28 31 31 31 36 36 36 -+42 42 42 28 28 28 14 14 14 23 23 23 37 37 37 29 29 29 11 11 11 4 4 4 -+4 4 4 13 13 13 23 23 23 20 20 20 13 13 13 19 19 19 24 24 24 19 19 19 -+6 6 6 3 3 3 3 3 3 4 4 4 10 10 10 8 8 8 3 3 3 0 0 0 -+21 21 21 25 25 25 17 17 17 8 8 8 14 14 14 20 20 20 23 23 23 29 29 29 -+36 36 36 37 37 37 24 24 24 16 16 16 19 19 19 11 11 11 0 0 0 3 3 3 -+0 0 0 8 8 8 27 27 27 34 34 34 36 36 36 36 36 36 36 36 36 36 36 36 -+43 43 43 40 40 40 36 36 36 45 45 45 40 40 40 20 20 20 14 14 14 8 8 8 -+11 11 11 10 10 10 11 11 11 13 13 13 14 14 14 13 13 13 11 11 11 11 11 11 -+6 6 6 25 25 25 28 28 28 25 25 25 24 24 24 34 34 34 40 40 40 24 24 24 -+4 4 4 32 32 32 31 31 31 16 16 16 13 13 13 6 6 6 4 4 4 23 23 23 -+36 36 36 25 25 25 24 24 24 21 21 21 14 14 14 25 25 25 32 32 32 17 17 17 -+ -+0 0 0 6 6 6 38 38 38 19 19 19 0 0 0 3 3 3 0 0 0 37 37 37 -+27 27 27 6 6 6 0 0 0 6 6 6 8 8 8 0 0 0 0 0 0 11 11 11 -+29 29 29 24 24 24 11 11 11 0 0 0 0 0 0 10 10 10 11 11 11 3 3 3 -+10 10 10 20 20 20 20 20 20 8 8 8 0 0 0 0 0 0 8 8 8 8 8 8 -+3 3 3 19 19 19 27 27 27 17 17 17 6 6 6 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 11 11 11 19 19 19 13 13 13 0 0 0 0 0 0 0 0 0 -+8 8 8 0 0 0 0 0 0 16 16 16 25 25 25 19 19 19 3 3 3 0 0 0 -+4 4 4 3 3 3 0 0 0 0 0 0 13 13 13 23 23 23 17 17 17 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 -+0 0 0 16 16 16 23 23 23 13 13 13 0 0 0 0 0 0 3 3 3 3 3 3 -+0 0 0 6 6 6 14 14 14 16 16 16 10 10 10 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 8 8 8 19 19 19 21 21 21 13 13 13 0 0 0 0 0 0 -+3 3 3 3 3 3 0 0 0 3 3 3 17 17 17 25 25 25 14 14 14 0 0 0 -+6 6 6 0 0 0 0 0 0 19 19 19 34 34 34 42 42 42 40 40 40 36 36 36 -+36 36 36 38 38 38 37 37 37 34 34 34 38 38 38 42 42 42 36 36 36 24 24 24 -+6 6 6 0 0 0 0 0 0 8 8 8 10 10 10 8 8 8 20 20 20 34 34 34 -+28 28 28 11 11 11 0 0 0 23 23 23 37 37 37 29 29 29 17 17 17 3 3 3 -+21 21 21 38 38 38 38 38 38 19 19 19 8 8 8 24 24 24 38 38 38 38 38 38 -+27 27 27 14 14 14 17 17 17 36 36 36 43 43 43 32 32 32 23 23 23 24 24 24 -+37 37 37 38 38 38 33 33 33 25 25 25 27 27 27 36 36 36 40 40 40 38 38 38 -+32 32 32 32 32 32 33 33 33 36 36 36 37 37 37 38 38 38 38 38 38 38 38 38 -+37 37 37 44 44 44 54 54 54 58 58 58 51 51 51 42 42 42 40 40 40 46 46 46 -+38 38 38 52 52 52 65 65 65 68 68 68 61 61 61 50 50 50 48 48 48 57 57 57 -+49 49 49 58 58 58 67 67 67 71 71 71 68 68 68 58 58 58 53 53 53 60 60 60 -+59 59 59 57 57 57 69 69 69 84 84 84 78 78 78 62 62 62 66 66 66 84 84 84 -+85 85 85 83 83 83 84 84 84 88 88 88 91 91 91 87 87 87 73 73 73 62 62 62 -+68 68 68 84 84 84 90 90 90 91 91 91 88 88 88 71 71 71 69 69 69 92 92 92 -+78 78 78 69 69 69 83 83 83 95 95 94 89 89 89 90 90 90 91 91 91 77 77 77 -+76 76 76 74 74 74 77 77 77 84 84 84 90 90 90 84 84 84 71 71 71 76 76 76 -+89 89 89 87 87 87 81 81 81 88 88 88 96 96 96 87 87 87 75 75 75 84 84 84 -+93 93 93 77 77 77 73 73 73 88 88 88 96 96 96 89 89 89 77 77 77 74 74 74 -+92 92 92 83 83 83 83 83 83 94 94 94 96 96 96 87 87 87 84 84 84 91 91 91 -+72 72 72 75 75 75 72 72 72 74 74 74 87 87 87 92 92 92 87 87 87 82 82 82 -+83 83 83 75 75 75 73 73 73 76 76 76 75 75 75 73 73 73 70 70 70 63 63 63 -+67 67 67 62 62 62 62 62 62 63 63 63 65 65 65 68 68 68 69 69 69 65 65 65 -+63 63 63 68 68 68 74 74 74 80 80 80 80 80 80 76 76 76 76 76 76 77 77 77 -+75 75 75 75 75 75 75 75 75 75 75 75 76 76 76 75 75 75 73 73 73 71 71 71 -+54 54 54 51 51 51 57 57 57 59 59 59 56 56 56 62 62 62 65 65 65 52 52 52 -+48 48 48 49 49 49 48 48 48 46 46 46 45 45 45 46 46 46 45 45 45 42 42 42 -+46 46 46 40 40 40 37 37 37 38 38 38 40 40 40 40 40 40 38 38 38 37 37 37 -+49 49 49 53 53 53 53 53 53 49 49 49 42 42 42 34 34 34 34 34 34 44 44 44 -+42 42 42 49 49 49 51 51 51 50 50 50 46 46 46 34 34 34 20 20 20 17 17 17 -+42 42 42 45 45 45 49 49 49 46 46 46 40 40 40 37 37 37 39 39 39 42 42 42 -+44 44 44 40 40 40 36 36 36 33 33 33 37 37 37 43 43 43 43 43 43 39 39 39 -+32 32 32 34 34 34 37 37 37 39 39 39 39 39 39 37 37 37 33 33 33 31 31 31 -+34 34 34 39 39 39 40 40 40 37 37 37 29 29 29 25 25 25 29 29 29 34 34 34 -+32 32 32 32 32 32 31 31 31 31 31 31 31 31 31 31 31 31 29 29 29 29 29 29 -+28 28 28 25 25 25 25 25 25 24 24 24 16 16 16 0 0 0 0 0 0 0 0 0 -+24 24 24 24 24 24 29 29 29 37 37 37 39 39 39 36 36 36 33 33 33 36 36 36 -+37 37 37 36 36 36 32 32 32 34 34 34 36 36 36 23 23 23 8 8 8 8 8 8 -+8 8 8 10 10 10 13 13 13 14 14 14 17 17 17 25 25 25 21 21 21 6 6 6 -+13 13 13 13 13 13 14 14 14 14 14 14 13 13 13 11 11 11 16 16 16 20 20 20 -+24 24 24 21 21 21 8 8 8 0 0 0 14 14 14 27 27 27 29 29 29 31 31 31 -+21 21 21 28 28 28 34 34 34 38 38 38 37 37 37 27 27 27 11 11 11 0 0 0 -+0 0 0 13 13 13 24 24 24 28 28 28 31 31 31 36 36 36 38 38 38 37 37 37 -+32 32 32 25 25 25 24 24 24 39 39 39 43 43 43 24 24 24 13 13 13 10 10 10 -+8 8 8 11 11 11 14 14 14 16 16 16 14 14 14 11 11 11 10 10 10 8 8 8 -+17 17 17 32 32 32 24 24 24 19 19 19 27 27 27 36 36 36 38 38 38 27 27 27 -+3 3 3 24 24 24 29 29 29 23 23 23 13 13 13 3 3 3 4 4 4 19 19 19 -+40 40 40 29 29 29 23 23 23 14 14 14 0 0 0 10 10 10 28 28 28 29 29 29 -+ -+0 0 0 0 0 0 6 6 6 32 32 32 27 27 27 0 0 0 0 0 0 10 10 10 -+29 29 29 23 23 23 10 10 10 0 0 0 0 0 0 8 8 8 6 6 6 0 0 0 -+6 6 6 27 27 27 28 28 28 8 8 8 0 0 0 13 13 13 14 14 14 0 0 0 -+0 0 0 11 11 11 21 21 21 16 16 16 3 3 3 0 0 0 0 0 0 4 4 4 -+3 3 3 6 6 6 16 16 16 24 24 24 19 19 19 4 4 4 0 0 0 3 3 3 -+3 3 3 0 0 0 0 0 0 10 10 10 17 17 17 13 13 13 3 3 3 0 0 0 -+4 4 4 3 3 3 0 0 0 0 0 0 11 11 11 21 21 21 16 16 16 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 14 14 14 20 20 20 20 20 20 -+0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 -+11 11 11 14 14 14 13 13 13 6 6 6 0 0 0 3 3 3 0 0 0 0 0 0 -+0 0 0 16 16 16 20 20 20 6 6 6 0 0 0 6 6 6 6 6 6 0 0 0 -+0 0 0 6 6 6 19 19 19 23 23 23 14 14 14 3 3 3 0 0 0 4 4 4 -+0 0 0 0 0 0 10 10 10 20 20 20 20 20 20 8 8 8 0 0 0 0 0 0 -+3 3 3 0 0 0 11 11 11 31 31 31 42 42 42 42 42 42 37 37 37 34 34 34 -+38 38 38 34 34 34 32 32 32 33 33 33 40 40 40 40 40 40 25 25 25 6 6 6 -+0 0 0 8 8 8 8 8 8 3 3 3 10 10 10 25 25 25 32 32 32 28 28 28 -+6 6 6 13 13 13 24 24 24 36 36 36 29 29 29 13 13 13 10 10 10 17 17 17 -+33 33 33 31 31 31 19 19 19 10 10 10 21 21 21 39 39 39 37 37 37 20 20 20 -+14 14 14 21 21 21 33 33 33 38 38 38 29 29 29 17 17 17 23 23 23 37 37 37 -+39 39 39 32 32 32 24 24 24 23 23 23 33 33 33 42 42 42 38 38 38 29 29 29 -+27 27 27 29 29 29 33 33 33 34 34 34 34 34 34 34 34 34 36 36 36 37 37 37 -+39 39 39 39 39 39 44 44 44 52 52 52 56 56 56 50 50 50 42 42 42 37 37 37 -+44 44 44 44 44 44 48 48 48 58 58 58 67 67 67 62 62 62 51 51 51 43 43 43 -+53 53 53 50 50 50 51 51 51 61 61 61 71 71 71 69 69 69 57 57 57 49 49 49 -+59 59 59 54 54 54 56 56 56 68 68 68 76 76 76 74 74 74 68 68 68 63 63 63 -+82 82 82 82 82 82 82 82 82 84 84 84 88 88 88 87 87 87 75 75 75 61 61 61 -+66 66 66 77 77 77 80 80 80 78 78 78 85 85 85 85 85 85 77 77 77 74 74 74 -+84 84 84 65 65 65 67 67 67 82 82 82 85 85 85 90 90 90 88 88 88 71 71 71 -+73 73 73 74 74 74 77 77 77 80 80 80 87 87 87 93 93 93 85 85 85 71 71 71 -+71 71 71 87 87 87 87 87 87 76 76 76 83 83 83 93 93 93 87 87 87 73 73 73 -+90 90 90 84 84 84 73 73 73 71 71 71 81 81 81 89 89 89 83 83 83 70 70 70 -+82 82 82 85 85 85 81 81 81 74 74 74 82 82 82 94 94 94 92 92 92 77 77 77 -+69 69 69 70 70 70 66 66 66 67 67 67 76 76 76 81 81 81 76 76 76 72 72 72 -+83 83 83 85 85 85 84 84 84 80 80 80 82 82 82 87 87 87 80 80 80 66 66 66 -+65 65 65 63 63 63 63 63 63 65 65 65 69 69 69 71 71 71 68 68 68 61 61 61 -+60 60 60 60 60 60 67 67 67 75 75 75 77 77 77 73 73 73 73 73 73 76 76 76 -+74 74 74 74 74 74 73 73 73 73 73 73 73 73 73 70 70 70 67 67 67 63 63 63 -+48 48 48 57 57 57 54 54 54 54 54 54 66 66 66 65 65 65 50 50 50 43 43 43 -+40 40 40 46 46 46 49 49 49 43 43 43 40 40 40 43 43 43 46 46 46 46 46 46 -+52 52 52 39 39 39 29 29 29 32 32 32 37 37 37 37 37 37 36 36 36 36 36 36 -+32 32 32 44 44 44 45 45 45 34 34 34 31 31 31 38 38 38 40 40 40 38 38 38 -+42 42 42 53 53 53 56 56 56 49 49 49 45 45 45 48 48 48 46 46 46 42 42 42 -+39 39 39 44 44 44 48 48 48 46 46 46 42 42 42 37 37 37 37 37 37 38 38 38 -+43 43 43 43 43 43 39 39 39 32 32 32 32 32 32 38 38 38 42 42 42 39 39 39 -+34 34 34 33 33 33 33 33 33 36 36 36 38 38 38 38 38 38 36 36 36 32 32 32 -+32 32 32 37 37 37 39 39 39 38 38 38 33 33 33 28 28 28 29 29 29 32 32 32 -+31 31 31 31 31 31 31 31 31 31 31 31 29 29 29 28 28 28 28 28 28 27 27 27 -+23 23 23 25 25 25 23 23 23 14 14 14 4 4 4 6 6 6 19 19 19 28 28 28 -+29 29 29 16 16 16 8 8 8 16 16 16 24 24 24 24 24 24 21 21 21 21 21 21 -+21 21 21 31 31 31 34 34 34 32 32 32 28 28 28 16 16 16 6 6 6 11 11 11 -+13 13 13 6 6 6 10 10 10 21 21 21 24 24 24 17 17 17 10 10 10 8 8 8 -+6 6 6 21 21 21 29 29 29 20 20 20 8 8 8 10 10 10 20 20 20 28 28 28 -+19 19 19 14 14 14 6 6 6 3 3 3 11 11 11 20 20 20 19 19 19 14 14 14 -+17 17 17 19 19 19 24 24 24 27 27 27 24 24 24 23 23 23 23 23 23 20 20 20 -+13 13 13 19 19 19 20 20 20 17 17 17 19 19 19 27 27 27 28 28 28 25 25 25 -+21 21 21 16 16 16 8 8 8 17 17 17 28 28 28 20 20 20 10 10 10 6 6 6 -+8 8 8 11 11 11 16 16 16 16 16 16 13 13 13 10 10 10 8 8 8 8 8 8 -+13 13 13 29 29 29 19 19 19 11 11 11 19 19 19 21 21 21 24 24 24 19 19 19 -+16 16 16 14 14 14 17 17 17 20 20 20 19 19 19 17 17 17 19 19 19 20 20 20 -+25 25 25 17 17 17 19 19 19 20 20 20 10 10 10 11 11 11 23 23 23 28 28 28 -+ -+13 13 13 0 0 0 0 0 0 19 19 19 32 32 32 19 19 19 8 8 8 0 0 0 -+14 14 14 25 25 25 23 23 23 6 6 6 0 0 0 6 6 6 8 8 8 0 0 0 -+0 0 0 13 13 13 25 25 25 24 24 24 16 16 16 10 10 10 4 4 4 0 0 0 -+0 0 0 3 3 3 13 13 13 21 21 21 21 21 21 11 11 11 3 3 3 0 0 0 -+6 6 6 0 0 0 3 3 3 16 16 16 21 21 21 16 16 16 6 6 6 3 3 3 -+4 4 4 0 0 0 0 0 0 0 0 0 10 10 10 17 17 17 14 14 14 6 6 6 -+0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 11 11 11 17 17 17 14 14 14 -+0 0 0 0 0 0 3 3 3 4 4 4 0 0 0 0 0 0 11 11 11 24 24 24 -+16 16 16 6 6 6 0 0 0 6 6 6 4 4 4 0 0 0 0 0 0 11 11 11 -+19 19 19 8 8 8 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 -+11 11 11 19 19 19 14 14 14 0 0 0 0 0 0 6 6 6 6 6 6 0 0 0 -+3 3 3 16 16 16 21 21 21 14 14 14 3 3 3 0 0 0 0 0 0 4 4 4 -+0 0 0 6 6 6 19 19 19 23 23 23 11 11 11 0 0 0 0 0 0 8 8 8 -+0 0 0 6 6 6 23 23 23 37 37 37 42 42 42 36 36 36 33 33 33 34 34 34 -+36 36 36 33 33 33 33 33 33 38 38 38 37 37 37 25 25 25 10 10 10 0 0 0 -+4 4 4 8 8 8 8 8 8 10 10 10 21 21 21 31 31 31 25 25 25 10 10 10 -+3 3 3 24 24 24 38 38 38 28 28 28 11 11 11 8 8 8 19 19 19 29 29 29 -+29 29 29 14 14 14 6 6 6 20 20 20 36 36 36 38 38 38 24 24 24 8 8 8 -+20 20 20 34 34 34 39 39 39 27 27 27 16 16 16 20 20 20 32 32 32 38 38 38 -+31 31 31 24 24 24 24 24 24 32 32 32 38 38 38 37 37 37 31 31 31 27 27 27 -+28 28 28 31 31 31 33 33 33 33 33 33 32 32 32 32 32 32 34 34 34 37 37 37 -+38 38 38 37 37 37 36 36 36 42 42 42 51 51 51 56 56 56 49 49 49 39 39 39 -+45 45 45 39 39 39 37 37 37 45 45 45 59 59 59 66 66 66 57 57 57 42 42 42 -+51 51 51 45 45 45 44 44 44 50 50 50 62 62 62 70 70 70 65 65 65 53 53 53 -+53 53 53 53 53 53 51 51 51 53 53 53 66 66 66 77 77 77 73 73 73 61 61 61 -+75 75 75 78 78 78 81 81 81 80 80 80 82 82 82 84 84 84 78 78 78 69 69 69 -+63 63 63 67 67 67 73 73 73 73 73 73 74 74 74 85 85 85 87 87 87 72 72 72 -+85 85 85 73 73 73 62 62 62 65 65 65 75 75 75 83 83 83 77 77 77 68 68 68 -+73 73 73 71 71 71 77 77 77 80 80 80 76 76 76 87 87 87 93 93 93 78 78 78 -+63 63 63 76 76 76 84 84 84 76 76 76 72 72 72 87 87 87 90 90 90 77 77 77 -+75 75 75 83 83 83 78 78 78 65 65 65 66 66 66 82 82 82 87 87 87 81 81 81 -+65 65 65 77 77 77 81 81 81 72 72 72 73 73 73 85 85 85 90 90 90 87 87 87 -+69 69 69 61 61 61 61 61 61 63 63 63 65 65 65 69 69 69 75 75 75 77 77 77 -+58 58 58 63 63 63 68 68 68 71 71 71 77 77 77 83 83 83 82 82 82 78 78 78 -+71 71 71 73 73 73 74 74 74 75 75 75 81 81 81 81 81 81 71 71 71 60 60 60 -+60 60 60 58 58 58 61 61 61 70 70 70 73 73 73 72 72 72 72 72 72 75 75 75 -+72 72 72 71 71 71 71 71 71 71 71 71 70 70 70 68 68 68 65 65 65 61 61 61 -+54 54 54 63 63 63 62 62 62 60 60 60 59 59 59 46 46 46 34 34 34 40 40 40 -+43 43 43 46 46 46 46 46 46 40 40 40 38 38 38 44 44 44 49 49 49 49 49 49 -+42 42 42 29 29 29 23 23 23 29 29 29 37 37 37 38 38 38 36 36 36 34 34 34 -+32 32 32 40 40 40 43 43 43 34 34 34 31 31 31 37 37 37 36 36 36 28 28 28 -+32 32 32 45 45 45 49 49 49 37 37 37 29 29 29 37 37 37 44 44 44 40 40 40 -+39 39 39 40 40 40 42 42 42 43 43 43 43 43 43 40 40 40 38 38 38 36 36 36 -+37 37 37 43 43 43 44 44 44 36 36 36 31 31 31 33 33 33 37 37 37 37 37 37 -+39 39 39 36 36 36 32 32 32 32 32 32 34 34 34 37 37 37 37 37 37 37 37 37 -+31 31 31 32 32 32 34 34 34 37 37 37 37 37 37 36 36 36 32 32 32 29 29 29 -+31 31 31 31 31 31 31 31 31 29 29 29 28 28 28 27 27 27 24 24 24 24 24 24 -+16 16 16 23 23 23 21 21 21 14 14 14 16 16 16 27 27 27 32 32 32 28 28 28 -+25 25 25 17 17 17 13 13 13 17 17 17 20 20 20 19 19 19 17 17 17 17 17 17 -+31 31 31 33 33 33 24 24 24 16 16 16 17 17 17 13 13 13 6 6 6 6 6 6 -+11 11 11 14 14 14 23 23 23 27 27 27 21 21 21 6 6 6 3 3 3 11 11 11 -+10 10 10 23 23 23 24 24 24 13 13 13 11 11 11 21 21 21 21 21 21 10 10 10 -+10 10 10 10 10 10 10 10 10 8 8 8 11 11 11 17 17 17 20 20 20 16 16 16 -+34 34 34 31 31 31 27 27 27 21 21 21 14 14 14 17 17 17 25 25 25 29 29 29 -+23 23 23 24 24 24 24 24 24 21 21 21 24 24 24 28 28 28 24 24 24 16 16 16 -+29 29 29 31 31 31 20 20 20 11 11 11 23 23 23 25 25 25 13 13 13 4 4 4 -+11 11 11 13 13 13 14 14 14 13 13 13 10 10 10 8 8 8 8 8 8 11 11 11 -+0 0 0 24 24 24 21 21 21 19 19 19 23 23 23 20 20 20 27 27 27 29 29 29 -+17 17 17 11 11 11 17 17 17 27 27 27 29 29 29 29 29 29 23 23 23 13 13 13 -+19 19 19 13 13 13 19 19 19 29 29 29 27 27 27 20 20 20 16 16 16 13 13 13 -+ -+27 27 27 10 10 10 16 16 16 0 0 0 6 6 6 37 37 37 14 14 14 6 6 6 -+0 0 0 11 11 11 23 23 23 23 23 23 8 8 8 0 0 0 0 0 0 3 3 3 -+3 3 3 0 0 0 8 8 8 29 29 29 31 31 31 10 10 10 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 13 13 13 25 25 25 20 20 20 4 4 4 0 0 0 -+3 3 3 4 4 4 0 0 0 0 0 0 11 11 11 21 21 21 17 17 17 4 4 4 -+0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 11 11 11 19 19 19 21 21 21 -+0 0 0 0 0 0 0 0 0 6 6 6 0 0 0 0 0 0 4 4 4 19 19 19 -+13 13 13 4 4 4 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 11 11 11 -+24 24 24 13 13 13 3 3 3 0 0 0 0 0 0 0 0 0 8 8 8 19 19 19 -+13 13 13 3 3 3 0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 11 11 11 -+24 24 24 13 13 13 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 4 4 4 -+20 20 20 20 20 20 13 13 13 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 16 16 16 19 19 19 10 10 10 0 0 0 0 0 0 3 3 3 0 0 0 -+3 3 3 17 17 17 32 32 32 39 39 39 37 37 37 31 31 31 31 31 31 34 34 34 -+31 31 31 33 33 33 39 39 39 39 39 39 25 25 25 4 4 4 0 0 0 6 6 6 -+10 10 10 0 0 0 6 6 6 23 23 23 31 31 31 21 21 21 6 6 6 0 0 0 -+24 24 24 28 28 28 28 28 28 8 8 8 3 3 3 23 23 23 28 28 28 28 28 28 -+13 13 13 10 10 10 19 19 19 33 33 33 32 32 32 19 19 19 13 13 13 19 19 19 -+34 34 34 36 36 36 25 25 25 11 11 11 19 19 19 36 36 36 37 37 37 25 25 25 -+20 20 20 23 23 23 32 32 32 39 39 39 36 36 36 25 25 25 24 24 24 31 31 31 -+29 29 29 31 31 31 32 32 32 31 31 31 29 29 29 29 29 29 32 32 32 34 34 34 -+31 31 31 33 33 33 33 33 33 34 34 34 42 42 42 50 50 50 52 52 52 50 50 50 -+39 39 39 38 38 38 40 40 40 40 40 40 44 44 44 53 53 53 58 58 58 53 53 53 -+43 43 43 44 44 44 48 48 48 46 46 46 46 46 46 57 57 57 67 67 67 67 67 67 -+48 48 48 50 50 50 52 52 52 51 51 51 54 54 54 61 61 61 69 69 69 73 73 73 -+68 68 68 73 73 73 75 75 75 74 74 74 75 75 75 80 80 80 81 81 81 78 78 78 -+62 62 62 57 57 57 69 69 69 77 77 77 66 66 66 67 67 67 81 81 81 84 84 84 -+81 81 81 82 82 82 67 67 67 56 56 56 65 65 65 70 70 70 66 66 66 68 68 68 -+72 72 72 67 67 67 72 72 72 81 81 81 69 69 69 66 66 66 83 83 83 87 87 87 -+74 74 74 63 63 63 71 71 71 81 81 81 73 73 73 70 70 70 80 80 80 85 85 85 -+71 71 71 78 78 78 80 80 80 71 71 71 63 63 63 67 67 67 75 75 75 81 81 81 -+71 71 71 65 65 65 69 69 69 83 83 83 84 84 84 75 75 75 74 74 74 84 84 84 -+82 82 82 72 72 72 69 69 69 66 66 66 58 58 58 58 58 58 68 68 68 73 73 73 -+71 71 71 62 62 62 54 54 54 56 56 56 58 58 58 54 54 54 60 60 60 74 74 74 -+78 78 78 80 80 80 73 73 73 67 67 67 72 72 72 75 75 75 70 70 70 63 63 63 -+60 60 60 58 58 58 57 57 57 61 61 61 67 67 67 69 69 69 70 70 70 72 72 72 -+67 67 67 67 67 67 66 66 66 67 67 67 68 68 68 67 67 67 65 65 65 62 62 62 -+72 72 72 59 59 59 62 62 62 70 70 70 65 65 65 62 62 62 68 68 68 68 68 68 -+50 50 50 45 45 45 39 39 39 37 37 37 42 42 42 48 48 48 46 46 46 42 42 42 -+34 34 34 32 32 32 34 34 34 43 43 43 49 49 49 46 46 46 38 38 38 31 31 31 -+34 34 34 33 33 33 40 40 40 48 48 48 44 44 44 38 38 38 33 33 33 27 27 27 -+28 28 28 39 39 39 45 45 45 38 38 38 31 31 31 38 38 38 46 46 46 43 43 43 -+39 39 39 38 38 38 37 37 37 38 38 38 42 42 42 42 42 42 39 39 39 36 36 36 -+32 32 32 39 39 39 44 44 44 39 39 39 33 33 33 31 31 31 32 32 32 34 34 34 -+39 39 39 37 37 37 33 33 33 31 31 31 31 31 31 33 33 33 37 37 37 39 39 39 -+32 32 32 31 31 31 29 29 29 33 33 33 38 38 38 38 38 38 33 33 33 28 28 28 -+29 29 29 29 29 29 29 29 29 29 29 29 28 28 28 25 25 25 21 21 21 20 20 20 -+23 23 23 21 21 21 13 13 13 10 10 10 21 21 21 33 33 33 25 25 25 8 8 8 -+13 13 13 17 17 17 20 20 20 17 17 17 13 13 13 13 13 13 21 21 21 29 29 29 -+23 23 23 33 33 33 31 31 31 19 19 19 13 13 13 10 10 10 6 6 6 11 11 11 -+8 8 8 27 27 27 32 32 32 21 21 21 11 11 11 6 6 6 4 4 4 8 8 8 -+13 13 13 24 24 24 25 25 25 17 17 17 19 19 19 27 27 27 21 21 21 3 3 3 -+8 8 8 8 8 8 11 11 11 11 11 11 13 13 13 24 24 24 32 32 32 31 31 31 -+24 24 24 28 28 28 29 29 29 29 29 29 31 31 31 31 31 31 31 31 31 34 34 34 -+36 36 36 32 32 32 31 31 31 34 34 34 37 37 37 32 32 32 19 19 19 4 4 4 -+27 27 27 37 37 37 34 34 34 20 20 20 31 31 31 37 37 37 19 19 19 10 10 10 -+13 13 13 13 13 13 11 11 11 8 8 8 6 6 6 8 8 8 10 10 10 13 13 13 -+14 14 14 34 34 34 37 37 37 34 34 34 27 27 27 17 17 17 25 25 25 29 29 29 -+27 27 27 29 29 29 33 33 33 36 36 36 34 34 34 32 32 32 27 27 27 20 20 20 -+11 11 11 4 4 4 10 10 10 23 23 23 27 27 27 21 21 21 11 11 11 0 0 0 -+ -+8 8 8 32 32 32 8 8 8 0 0 0 0 0 0 6 6 6 34 34 34 16 16 16 -+0 0 0 0 0 0 10 10 10 23 23 23 21 21 21 3 3 3 0 0 0 3 3 3 -+8 8 8 0 0 0 0 0 0 16 16 16 27 27 27 21 21 21 8 8 8 0 0 0 -+4 4 4 0 0 0 0 0 0 8 8 8 19 19 19 21 21 21 17 17 17 13 13 13 -+0 0 0 8 8 8 8 8 8 0 0 0 0 0 0 10 10 10 16 16 16 16 16 16 -+4 4 4 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 11 11 11 21 21 21 -+13 13 13 4 4 4 3 3 3 6 6 6 3 3 3 0 0 0 0 0 0 10 10 10 -+17 17 17 11 11 11 6 6 6 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+13 13 13 14 14 14 10 10 10 0 0 0 0 0 0 10 10 10 14 14 14 14 14 14 -+3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 3 3 3 13 13 13 21 21 21 -+19 19 19 3 3 3 0 0 0 6 6 6 4 4 4 0 0 0 0 0 0 17 17 17 -+21 21 21 13 13 13 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 -+16 16 16 17 17 17 10 10 10 0 0 0 0 0 0 6 6 6 4 4 4 0 0 0 -+14 14 14 27 27 27 37 37 37 37 37 37 32 32 32 29 29 29 32 32 32 34 34 34 -+31 31 31 36 36 36 37 37 37 29 29 29 13 13 13 0 0 0 0 0 0 8 8 8 -+8 8 8 4 4 4 16 16 16 28 28 28 25 25 25 8 8 8 3 3 3 14 14 14 -+32 32 32 19 19 19 13 13 13 3 3 3 14 14 14 29 29 29 23 23 23 17 17 17 -+8 8 8 19 19 19 29 29 29 31 31 31 19 19 19 8 8 8 17 17 17 32 32 32 -+33 33 33 23 23 23 13 13 13 16 16 16 29 29 29 37 37 37 31 31 31 17 17 17 -+23 23 23 28 28 28 34 34 34 33 33 33 27 27 27 21 21 21 23 23 23 28 28 28 -+27 27 27 27 27 27 28 28 28 28 28 28 28 28 28 29 29 29 31 31 31 32 32 32 -+28 28 28 29 29 29 32 32 32 34 34 34 34 34 34 37 37 37 45 45 45 53 53 53 -+44 44 44 39 39 39 40 40 40 42 42 42 36 36 36 39 39 39 51 51 51 56 56 56 -+49 49 49 44 44 44 45 45 45 45 45 45 39 39 39 44 44 44 58 58 58 63 63 63 -+53 53 53 50 50 50 49 49 49 50 50 50 49 49 49 49 49 49 58 58 58 70 70 70 -+67 67 67 69 69 69 70 70 70 70 70 70 71 71 71 74 74 74 77 77 77 77 77 77 -+71 71 71 57 57 57 62 62 62 74 74 74 66 66 66 56 56 56 66 66 66 78 78 78 -+77 77 77 81 81 81 68 68 68 56 56 56 60 60 60 61 61 61 59 59 59 66 66 66 -+72 72 72 72 72 72 68 68 68 75 75 75 70 70 70 57 57 57 67 67 67 77 77 77 -+83 83 83 67 67 67 61 61 61 71 71 71 72 72 72 66 66 66 67 67 67 75 75 75 -+76 76 76 76 76 76 75 75 75 72 72 72 65 65 65 59 59 59 61 61 61 68 68 68 -+84 84 84 67 67 67 63 63 63 80 80 80 84 84 84 69 69 69 57 57 57 59 59 59 -+82 82 82 84 84 84 76 76 76 67 67 67 62 62 62 59 59 59 57 57 57 58 58 58 -+71 71 71 66 66 66 56 56 56 53 53 53 60 60 60 65 65 65 69 69 69 80 80 80 -+70 70 70 72 72 72 61 61 61 51 51 51 59 59 59 68 68 68 68 68 68 67 67 67 -+60 60 60 57 57 57 52 52 52 51 51 51 57 57 57 65 65 65 67 67 67 67 67 67 -+65 65 65 63 63 63 62 62 62 62 62 62 63 63 63 63 63 63 61 61 61 60 60 60 -+63 63 63 43 43 43 38 38 38 43 43 43 38 38 38 37 37 37 39 39 39 33 33 33 -+45 45 45 39 39 39 36 36 36 39 39 39 45 45 45 45 45 45 39 39 39 34 34 34 -+36 36 36 42 42 42 49 49 49 54 54 54 56 56 56 52 52 52 39 39 39 28 28 28 -+25 25 25 23 23 23 32 32 32 43 43 43 42 42 42 38 38 38 33 33 33 25 25 25 -+17 17 17 19 19 19 25 25 25 27 27 27 25 25 25 33 33 33 40 40 40 37 37 37 -+40 40 40 38 38 38 36 36 36 36 36 36 38 38 38 39 39 39 39 39 39 38 38 38 -+31 31 31 32 32 32 37 37 37 39 39 39 38 38 38 33 33 33 31 31 31 32 32 32 -+34 34 34 36 36 36 36 36 36 33 33 33 29 29 29 29 29 29 32 32 32 36 36 36 -+36 36 36 33 33 33 29 29 29 31 31 31 33 33 33 36 36 36 33 33 33 31 31 31 -+29 29 29 29 29 29 29 29 29 29 29 29 27 27 27 23 23 23 20 20 20 17 17 17 -+25 25 25 14 14 14 6 6 6 10 10 10 20 20 20 20 20 20 11 11 11 0 0 0 -+0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 4 4 4 20 20 20 25 25 25 -+8 8 8 31 31 31 37 37 37 23 23 23 11 11 11 6 6 6 10 10 10 16 16 16 -+17 17 17 28 28 28 24 24 24 10 10 10 8 8 8 8 8 8 6 6 6 10 10 10 -+3 3 3 13 13 13 20 20 20 19 19 19 14 14 14 11 11 11 8 8 8 4 4 4 -+10 10 10 6 6 6 8 8 8 10 10 10 11 11 11 24 24 24 32 32 32 25 25 25 -+33 33 33 34 34 34 23 23 23 11 11 11 13 13 13 8 8 8 4 4 4 16 16 16 -+36 36 36 24 24 24 19 19 19 27 27 27 32 32 32 24 24 24 11 11 11 3 3 3 -+19 19 19 33 33 33 38 38 38 28 28 28 37 37 37 39 39 39 19 19 19 17 17 17 -+13 13 13 10 10 10 8 8 8 6 6 6 8 8 8 10 10 10 11 11 11 13 13 13 -+16 16 16 28 28 28 33 33 33 33 33 33 17 17 17 0 0 0 11 11 11 11 11 11 -+32 32 32 39 39 39 38 38 38 29 29 29 27 27 27 27 27 27 25 25 25 24 24 24 -+3 3 3 0 0 0 0 0 0 10 10 10 19 19 19 17 17 17 11 11 11 3 3 3 -+ -+0 0 0 6 6 6 25 25 25 13 13 13 0 0 0 3 3 3 8 8 8 28 28 28 -+21 21 21 0 0 0 0 0 0 11 11 11 27 27 27 24 24 24 10 10 10 0 0 0 -+0 0 0 6 6 6 0 0 0 0 0 0 11 11 11 33 33 33 28 28 28 3 3 3 -+0 0 0 6 6 6 11 11 11 3 3 3 0 0 0 8 8 8 21 21 21 28 28 28 -+0 0 0 4 4 4 11 11 11 10 10 10 0 0 0 0 0 0 6 6 6 28 28 28 -+17 17 17 3 3 3 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 10 10 10 -+23 23 23 19 19 19 6 6 6 0 0 0 0 0 0 6 6 6 6 6 6 0 0 0 -+10 10 10 16 16 16 14 14 14 3 3 3 0 0 0 3 3 3 4 4 4 0 0 0 -+0 0 0 11 11 11 16 16 16 4 4 4 6 6 6 20 20 20 17 17 17 0 0 0 -+0 0 0 4 4 4 4 4 4 0 0 0 0 0 0 13 13 13 21 21 21 23 23 23 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 14 14 14 25 25 25 -+13 13 13 0 0 0 0 0 0 4 4 4 4 4 4 0 0 0 4 4 4 19 19 19 -+27 27 27 11 11 11 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 3 3 3 -+24 24 24 33 33 33 38 38 38 34 34 34 29 29 29 32 32 32 34 34 34 33 33 33 -+34 34 34 36 36 36 29 29 29 16 16 16 6 6 6 6 6 6 8 8 8 4 4 4 -+4 4 4 19 19 19 29 29 29 25 25 25 10 10 10 0 0 0 16 16 16 33 33 33 -+25 25 25 4 4 4 8 8 8 16 16 16 25 25 25 27 27 27 10 10 10 10 10 10 -+17 17 17 28 28 28 31 31 31 17 17 17 6 6 6 13 13 13 28 28 28 36 36 36 -+20 20 20 10 10 10 13 13 13 29 29 29 36 36 36 25 25 25 19 19 19 20 20 20 -+33 33 33 34 34 34 29 29 29 21 21 21 20 20 20 25 25 25 25 25 25 21 21 21 -+23 23 23 24 24 24 25 25 25 27 27 27 28 28 28 29 29 29 29 29 29 29 29 29 -+34 34 34 28 28 28 29 29 29 36 36 36 34 34 34 28 28 28 34 34 34 48 48 48 -+59 59 59 40 40 40 36 36 36 40 40 40 38 38 38 36 36 36 43 43 43 46 46 46 -+66 66 66 44 44 44 36 36 36 42 42 42 42 42 42 42 42 42 46 46 46 49 49 49 -+66 66 66 53 53 53 43 43 43 43 43 43 48 48 48 50 50 50 50 50 50 50 50 50 -+71 71 71 69 69 69 68 68 68 68 68 68 69 69 69 70 70 70 70 70 70 71 71 71 -+83 83 83 63 63 63 54 54 54 65 65 65 69 69 69 59 59 59 52 52 52 59 59 59 -+78 78 78 74 74 74 63 63 63 58 58 58 61 61 61 60 60 60 57 57 57 60 60 60 -+73 73 73 83 83 83 67 67 67 66 66 66 75 75 75 62 62 62 57 57 57 61 61 61 -+82 82 82 78 78 78 62 62 62 53 53 53 68 68 68 74 74 74 65 65 65 56 56 56 -+77 77 77 73 73 73 68 68 68 65 65 65 65 65 65 63 63 63 61 61 61 60 60 60 -+61 61 61 63 63 63 63 63 63 66 66 66 70 70 70 72 72 72 67 67 67 58 58 58 -+59 59 59 77 77 77 73 73 73 65 65 65 73 73 73 71 71 71 57 57 57 54 54 54 -+54 54 54 69 69 69 68 68 68 59 59 59 67 67 67 73 73 73 61 61 61 46 46 46 -+52 52 52 60 60 60 57 57 57 53 53 53 63 63 63 71 71 71 69 69 69 66 66 66 -+59 59 59 56 56 56 49 49 49 44 44 44 50 50 50 60 60 60 65 65 65 62 62 62 -+67 67 67 65 65 65 61 61 61 60 60 60 60 60 60 59 59 59 57 57 57 56 56 56 -+39 39 39 43 43 43 37 37 37 34 34 34 39 39 39 34 34 34 32 32 32 43 43 43 -+33 33 33 32 32 32 37 37 37 44 44 44 46 46 46 39 39 39 34 34 34 33 33 33 -+31 31 31 40 40 40 49 49 49 51 51 51 52 52 52 50 50 50 40 40 40 29 29 29 -+29 29 29 33 33 33 38 38 38 38 38 38 37 37 37 45 45 45 44 44 44 27 27 27 -+29 29 29 19 19 19 19 19 19 24 24 24 27 27 27 34 34 34 40 40 40 37 37 37 -+40 40 40 39 39 39 38 38 38 36 36 36 34 34 34 34 34 34 38 38 38 40 40 40 -+31 31 31 27 27 27 29 29 29 38 38 38 42 42 42 37 37 37 31 31 31 29 29 29 -+28 28 28 34 34 34 38 38 38 36 36 36 29 29 29 27 27 27 28 28 28 32 32 32 -+39 39 39 36 36 36 31 31 31 28 28 28 28 28 28 31 31 31 33 33 33 34 34 34 -+28 28 28 29 29 29 29 29 29 28 28 28 27 27 27 23 23 23 19 19 19 16 16 16 -+13 13 13 4 4 4 8 8 8 21 21 21 23 23 23 6 6 6 0 0 0 0 0 0 -+0 0 0 4 4 4 0 0 0 0 0 0 4 4 4 23 23 23 27 27 27 20 20 20 -+24 24 24 34 34 34 28 28 28 10 10 10 6 6 6 10 10 10 10 10 10 10 10 10 -+31 31 31 23 23 23 6 6 6 3 3 3 11 11 11 6 6 6 3 3 3 16 16 16 -+6 6 6 4 4 4 11 11 11 20 20 20 19 19 19 8 8 8 3 3 3 6 6 6 -+11 11 11 3 3 3 4 4 4 6 6 6 8 8 8 16 16 16 17 17 17 0 0 0 -+23 23 23 27 27 27 8 8 8 0 0 0 6 6 6 8 8 8 10 10 10 25 25 25 -+36 36 36 17 17 17 4 4 4 19 19 19 31 31 31 29 29 29 27 27 27 28 28 28 -+25 25 25 37 37 37 43 43 43 34 34 34 40 40 40 37 37 37 13 13 13 20 20 20 -+11 11 11 8 8 8 6 6 6 6 6 6 10 10 10 13 13 13 13 13 13 11 11 11 -+3 3 3 11 11 11 21 21 21 29 29 29 16 16 16 8 8 8 23 23 23 20 20 20 -+20 20 20 32 32 32 27 27 27 14 14 14 16 16 16 17 17 17 13 13 13 10 10 10 -+13 13 13 11 11 11 8 8 8 10 10 10 16 16 16 17 17 17 13 13 13 8 8 8 -+ -+0 0 0 0 0 0 11 11 11 24 24 24 19 19 19 0 0 0 0 0 0 8 8 8 -+24 24 24 19 19 19 0 0 0 0 0 0 6 6 6 25 25 25 24 24 24 6 6 6 -+0 0 0 0 0 0 3 3 3 4 4 4 3 3 3 8 8 8 20 20 20 31 31 31 -+0 0 0 0 0 0 3 3 3 6 6 6 3 3 3 0 0 0 10 10 10 23 23 23 -+27 27 27 11 11 11 3 3 3 8 8 8 4 4 4 0 0 0 0 0 0 11 11 11 -+25 25 25 14 14 14 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 6 6 6 -+10 10 10 20 20 20 20 20 20 4 4 4 0 0 0 3 3 3 3 3 3 0 0 0 -+0 0 0 10 10 10 17 17 17 10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 -+10 10 10 0 0 0 0 0 0 25 25 25 29 29 29 6 6 6 0 0 0 4 4 4 -+4 4 4 0 0 0 0 0 0 0 0 0 16 16 16 21 21 21 13 13 13 0 0 0 -+0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 19 19 19 20 20 20 10 10 10 -+3 3 3 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 14 14 14 29 29 29 -+3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 11 11 24 24 24 -+34 34 34 31 31 31 29 29 29 32 32 32 32 32 32 31 31 31 33 33 33 38 38 38 -+39 39 39 32 32 32 20 20 20 6 6 6 3 3 3 4 4 4 4 4 4 0 0 0 -+17 17 17 28 28 28 24 24 24 6 6 6 3 3 3 20 20 20 27 27 27 20 20 20 -+10 10 10 4 4 4 11 11 11 24 24 24 24 24 24 11 11 11 8 8 8 16 16 16 -+31 31 31 27 27 27 17 17 17 10 10 10 17 17 17 27 27 27 27 27 27 19 19 19 -+6 6 6 17 17 17 31 31 31 36 36 36 27 27 27 14 14 14 17 17 17 28 28 28 -+32 32 32 28 28 28 24 24 24 21 21 21 21 21 21 21 21 21 21 21 21 20 20 20 -+23 23 23 24 24 24 24 24 24 24 24 24 25 25 25 27 27 27 27 27 27 27 27 27 -+28 28 28 28 28 28 28 28 28 28 28 28 29 29 29 31 31 31 31 31 31 32 32 32 -+40 40 40 45 45 45 43 43 43 34 34 34 31 31 31 34 34 34 37 37 37 37 37 37 -+46 46 46 54 54 54 53 53 53 40 40 40 36 36 36 42 42 42 44 44 44 40 40 40 -+51 51 51 60 60 60 59 59 59 46 46 46 38 38 38 43 43 43 45 45 45 43 43 43 -+52 52 52 65 65 65 73 73 73 71 71 71 67 67 67 68 68 68 68 68 68 67 67 67 -+69 69 69 63 63 63 71 71 71 63 63 63 57 57 57 63 63 63 56 56 56 49 49 49 -+58 58 58 67 67 67 73 73 73 61 61 61 54 54 54 57 57 57 52 52 52 54 54 54 -+52 52 52 72 72 72 76 76 76 67 67 67 66 66 66 63 63 63 57 57 57 54 54 54 -+54 54 54 63 63 63 76 76 76 69 69 69 52 52 52 60 60 60 70 70 70 61 61 61 -+58 58 58 58 58 58 59 59 59 60 60 60 61 61 61 60 60 60 56 56 56 52 52 52 -+68 68 68 63 63 63 59 59 59 56 56 56 53 53 53 54 54 54 59 59 59 63 63 63 -+51 51 51 58 58 58 68 68 68 63 63 63 52 52 52 59 59 59 70 70 70 69 69 69 -+60 60 60 58 58 58 67 67 67 72 72 72 62 62 62 52 52 52 48 48 48 42 42 42 -+43 43 43 50 50 50 58 58 58 63 63 63 65 65 65 63 63 63 62 62 62 61 61 61 -+65 65 65 50 50 50 45 45 45 48 48 48 44 44 44 50 50 50 59 59 59 60 60 60 -+62 62 62 59 59 59 57 57 57 58 58 58 53 53 53 44 44 44 37 37 37 36 36 36 -+43 43 43 43 43 43 44 44 44 45 45 45 46 46 46 46 46 46 45 45 45 45 45 45 -+40 40 40 50 50 50 53 53 53 45 45 45 37 37 37 33 33 33 32 32 32 31 31 31 -+34 34 34 33 33 33 39 39 39 49 49 49 46 46 46 37 37 37 34 34 34 39 39 39 -+33 33 33 38 38 38 34 34 34 24 24 24 27 27 27 42 42 42 48 48 48 42 42 42 -+32 32 32 20 20 20 23 23 23 24 24 24 17 17 17 29 29 29 39 39 39 32 32 32 -+33 33 33 38 38 38 40 40 40 38 38 38 33 33 33 31 31 31 32 32 32 34 34 34 -+38 38 38 36 36 36 31 31 31 27 27 27 31 31 31 36 36 36 36 36 36 32 32 32 -+32 32 32 29 29 29 29 29 29 32 32 32 36 36 36 36 36 36 31 31 31 25 25 25 -+31 31 31 34 34 34 37 37 37 33 33 33 27 27 27 24 24 24 29 29 29 34 34 34 -+28 28 28 25 25 25 27 27 27 31 31 31 28 28 28 24 24 24 28 28 28 36 36 36 -+3 3 3 13 13 13 20 20 20 19 19 19 10 10 10 0 0 0 0 0 0 4 4 4 -+0 0 0 0 0 0 0 0 0 3 3 3 16 16 16 25 25 25 31 31 31 32 32 32 -+33 33 33 28 28 28 19 19 19 10 10 10 4 4 4 10 10 10 20 20 20 28 28 28 -+25 25 25 13 13 13 3 3 3 6 6 6 10 10 10 6 6 6 4 4 4 4 4 4 -+10 10 10 19 19 19 21 21 21 14 14 14 8 8 8 8 8 8 8 8 8 4 4 4 -+6 6 6 8 8 8 6 6 6 14 14 14 21 21 21 13 13 13 0 0 0 4 4 4 -+17 17 17 27 27 27 20 20 20 3 3 3 0 0 0 0 0 0 11 11 11 33 33 33 -+17 17 17 0 0 0 23 23 23 29 29 29 3 3 3 13 13 13 32 32 32 33 33 33 -+25 25 25 19 19 19 28 28 28 39 39 39 31 31 31 17 17 17 13 13 13 11 11 11 -+11 11 11 11 11 11 4 4 4 14 14 14 11 11 11 8 8 8 17 17 17 3 3 3 -+6 6 6 8 8 8 8 8 8 10 10 10 14 14 14 17 17 17 16 16 16 13 13 13 -+13 13 13 13 13 13 13 13 13 13 13 13 14 14 14 17 17 17 17 17 17 14 14 14 -+11 11 11 11 11 11 11 11 11 13 13 13 16 16 16 17 17 17 14 14 14 10 10 10 -+ -+10 10 10 3 3 3 0 0 0 10 10 10 19 19 19 19 19 19 6 6 6 0 0 0 -+11 11 11 16 16 16 16 16 16 10 10 10 0 0 0 4 4 4 16 16 16 24 24 24 -+11 11 11 0 0 0 0 0 0 8 8 8 11 11 11 3 3 3 4 4 4 17 17 17 -+20 20 20 14 14 14 4 4 4 0 0 0 0 0 0 6 6 6 6 6 6 3 3 3 -+19 19 19 21 21 21 14 14 14 0 0 0 0 0 0 4 4 4 4 4 4 0 0 0 -+10 10 10 17 17 17 16 16 16 4 4 4 0 0 0 3 3 3 3 3 3 0 0 0 -+0 0 0 11 11 11 19 19 19 16 16 16 6 6 6 0 0 0 0 0 0 3 3 3 -+3 3 3 0 0 0 6 6 6 14 14 14 13 13 13 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 11 11 11 20 20 20 20 20 20 11 11 11 4 4 4 4 4 4 -+0 0 0 0 0 0 3 3 3 10 10 10 14 14 14 13 13 13 4 4 4 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 14 14 14 19 19 19 13 13 13 0 0 0 -+0 0 0 3 3 3 0 0 0 0 0 0 6 6 6 17 17 17 19 19 19 11 11 11 -+0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 3 3 3 17 17 17 31 31 31 -+32 32 32 28 28 28 28 28 28 31 31 31 31 31 31 29 29 29 32 32 32 36 36 36 -+36 36 36 21 21 21 11 11 11 11 11 11 8 8 8 0 0 0 3 3 3 16 16 16 -+24 24 24 19 19 19 8 8 8 4 4 4 16 16 16 24 24 24 20 20 20 10 10 10 -+6 6 6 16 16 16 24 24 24 23 23 23 14 14 14 8 8 8 13 13 13 21 21 21 -+27 27 27 17 17 17 10 10 10 14 14 14 24 24 24 25 25 25 19 19 19 11 11 11 -+16 16 16 24 24 24 31 31 31 27 27 27 19 19 19 16 16 16 21 21 21 28 28 28 -+19 19 19 17 17 17 16 16 16 16 16 16 19 19 19 21 21 21 23 23 23 23 23 23 -+23 23 23 24 24 24 24 24 24 25 25 25 25 25 25 27 27 27 27 27 27 27 27 27 -+25 25 25 25 25 25 25 25 25 27 27 27 27 27 27 27 27 27 28 28 28 28 28 28 -+33 33 33 38 38 38 44 44 44 43 43 43 34 34 34 28 28 28 31 31 31 36 36 36 -+34 34 34 44 44 44 50 50 50 46 46 46 39 39 39 37 37 37 39 39 39 43 43 43 -+39 39 39 49 49 49 56 56 56 51 51 51 43 43 43 39 39 39 42 42 42 45 45 45 -+43 43 43 52 52 52 62 62 62 65 65 65 65 65 65 63 63 63 65 65 65 65 65 65 -+63 63 63 58 58 58 63 63 63 63 63 63 60 60 60 62 62 62 57 57 57 49 49 49 -+49 49 49 56 56 56 65 65 65 56 56 56 51 51 51 54 54 54 49 49 49 48 48 48 -+51 51 51 57 57 57 65 65 65 72 72 72 75 75 75 67 67 67 56 56 56 52 52 52 -+53 53 53 51 51 51 63 63 63 70 70 70 58 58 58 53 53 53 58 58 58 56 56 56 -+54 54 54 54 54 54 60 60 60 68 68 68 69 69 69 65 65 65 62 62 62 63 63 63 -+62 62 62 54 54 54 58 58 58 68 68 68 67 67 67 53 53 53 50 50 50 58 58 58 -+50 50 50 52 52 52 56 56 56 61 61 61 61 61 61 52 52 52 48 48 48 53 53 53 -+67 67 67 65 65 65 70 70 70 70 70 70 58 58 58 49 49 49 50 50 50 50 50 50 -+49 49 49 53 53 53 59 59 59 61 61 61 60 60 60 58 58 58 57 57 57 56 56 56 -+60 60 60 50 50 50 44 44 44 43 43 43 42 42 42 46 46 46 54 54 54 59 59 59 -+57 57 57 56 56 56 57 57 57 60 60 60 60 60 60 56 56 56 54 54 54 57 57 57 -+49 49 49 50 50 50 49 49 49 48 48 48 45 45 45 42 42 42 40 40 40 39 39 39 -+49 49 49 46 46 46 40 40 40 33 33 33 28 28 28 29 29 29 31 31 31 31 31 31 -+33 33 33 31 31 31 33 33 33 37 37 37 33 33 33 24 24 24 19 19 19 21 21 21 -+31 31 31 28 28 28 25 25 25 24 24 24 23 23 23 25 25 25 36 36 36 48 48 48 -+33 33 33 11 11 11 13 13 13 23 23 23 17 17 17 16 16 16 27 27 27 29 29 29 -+31 31 31 34 34 34 39 39 39 39 39 39 37 37 37 32 32 32 31 31 31 31 31 31 -+33 33 33 36 36 36 34 34 34 29 29 29 28 28 28 32 32 32 32 32 32 31 31 31 -+32 32 32 29 29 29 28 28 28 29 29 29 32 32 32 33 33 33 31 31 31 28 28 28 -+25 25 25 29 29 29 34 34 34 36 36 36 32 32 32 28 28 28 27 27 27 27 27 27 -+31 31 31 29 29 29 31 31 31 33 33 33 32 32 32 28 28 28 25 25 25 25 25 25 -+20 20 20 20 20 20 14 14 14 4 4 4 0 0 0 3 3 3 3 3 3 0 0 0 -+6 6 6 3 3 3 6 6 6 17 17 17 29 29 29 33 33 33 28 28 28 21 21 21 -+23 23 23 16 16 16 6 6 6 4 4 4 11 11 11 20 20 20 27 27 27 29 29 29 -+17 17 17 11 11 11 6 6 6 6 6 6 6 6 6 6 6 6 10 10 10 13 13 13 -+19 19 19 17 17 17 13 13 13 6 6 6 6 6 6 8 8 8 10 10 10 8 8 8 -+4 4 4 10 10 10 11 11 11 17 17 17 20 20 20 11 11 11 0 0 0 3 3 3 -+0 0 0 19 19 19 21 21 21 0 0 0 0 0 0 20 20 20 27 27 27 23 23 23 -+0 0 0 14 14 14 25 25 25 31 31 31 25 25 25 28 28 28 27 27 27 0 0 0 -+32 32 32 21 21 21 20 20 20 23 23 23 16 16 16 14 14 14 13 13 13 4 4 4 -+6 6 6 10 10 10 0 0 0 6 6 6 14 14 14 10 10 10 14 14 14 11 11 11 -+10 10 10 13 13 13 17 17 17 19 19 19 17 17 17 17 17 17 21 21 21 27 27 27 -+24 24 24 16 16 16 10 10 10 13 13 13 20 20 20 23 23 23 20 20 20 16 16 16 -+8 8 8 11 11 11 17 17 17 19 19 19 10 10 10 0 0 0 0 0 0 11 11 11 -+ -+16 16 16 11 11 11 0 0 0 0 0 0 10 10 10 23 23 23 16 16 16 0 0 0 -+0 0 0 6 6 6 20 20 20 23 23 23 6 6 6 0 0 0 0 0 0 24 24 24 -+23 23 23 8 8 8 0 0 0 6 6 6 10 10 10 3 3 3 0 0 0 3 3 3 -+25 25 25 23 23 23 13 13 13 0 0 0 0 0 0 8 8 8 4 4 4 0 0 0 -+10 10 10 23 23 23 23 23 23 4 4 4 0 0 0 4 4 4 4 4 4 0 0 0 -+0 0 0 11 11 11 17 17 17 11 11 11 6 6 6 6 6 6 3 3 3 0 0 0 -+0 0 0 0 0 0 11 11 11 20 20 20 17 17 17 6 6 6 0 0 0 0 0 0 -+4 4 4 0 0 0 0 0 0 11 11 11 16 16 16 8 8 8 0 0 0 0 0 0 -+0 0 0 14 14 14 21 21 21 11 11 11 6 6 6 16 16 16 16 16 16 4 4 4 -+0 0 0 4 4 4 13 13 13 16 16 16 13 13 13 6 6 6 0 0 0 0 0 0 -+0 0 0 0 0 0 4 4 4 16 16 16 19 19 19 13 13 13 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 16 16 16 23 23 23 13 13 13 0 0 0 -+0 0 0 0 0 0 0 0 0 4 4 4 10 10 10 14 14 14 24 24 24 33 33 33 -+29 29 29 27 27 27 27 27 27 29 29 29 31 31 31 29 29 29 31 31 31 33 33 33 -+28 28 28 13 13 13 0 0 0 4 4 4 4 4 4 0 0 0 11 11 11 25 25 25 -+20 20 20 6 6 6 0 0 0 14 14 14 25 25 25 23 23 23 11 11 11 3 3 3 -+14 14 14 24 24 24 25 25 25 11 11 11 4 4 4 13 13 13 21 21 21 23 23 23 -+16 16 16 8 8 8 10 10 10 21 21 21 24 24 24 17 17 17 11 11 11 11 11 11 -+28 28 28 29 29 29 24 24 24 14 14 14 14 14 14 23 23 23 27 27 27 23 23 23 -+17 17 17 16 16 16 14 14 14 16 16 16 17 17 17 19 19 19 19 19 19 17 17 17 -+20 20 20 20 20 20 20 20 20 21 21 21 21 21 21 23 23 23 23 23 23 24 24 24 -+24 24 24 24 24 24 25 25 25 25 25 25 27 27 27 27 27 27 27 27 27 25 25 25 -+28 28 28 29 29 29 37 37 37 45 45 45 42 42 42 31 31 31 27 27 27 29 29 29 -+27 27 27 33 33 33 43 43 43 49 49 49 45 45 45 37 37 37 34 34 34 37 37 37 -+33 33 33 37 37 37 46 46 46 52 52 52 50 50 50 42 42 42 38 38 38 40 40 40 -+37 37 37 40 40 40 50 50 50 60 60 60 62 62 62 60 60 60 59 59 59 60 60 60 -+57 57 57 52 52 52 51 51 51 60 60 60 62 62 62 60 60 60 59 59 59 50 50 50 -+42 42 42 43 43 43 52 52 52 48 48 48 48 48 48 54 54 54 46 46 46 42 42 42 -+46 46 46 43 43 43 51 51 51 66 66 66 73 73 73 70 70 70 61 61 61 51 51 51 -+49 49 49 40 40 40 51 51 51 63 63 63 58 58 58 51 51 51 51 51 51 48 48 48 -+62 62 62 59 59 59 56 56 56 58 58 58 65 65 65 69 69 69 67 67 67 65 65 65 -+50 50 50 42 42 42 45 45 45 61 61 61 66 66 66 53 53 53 44 44 44 44 44 44 -+45 45 45 46 46 46 42 42 42 49 49 49 62 62 62 59 59 59 52 52 52 60 60 60 -+54 54 54 46 46 46 46 46 46 54 54 54 59 59 59 60 60 60 60 60 60 56 56 56 -+54 54 54 57 57 57 59 59 59 60 60 60 59 59 59 58 58 58 58 58 58 58 58 58 -+54 54 54 51 51 51 43 43 43 38 38 38 39 39 39 40 40 40 48 48 48 58 58 58 -+54 54 54 53 53 53 52 52 52 49 49 49 43 43 43 36 36 36 34 34 34 37 37 37 -+31 31 31 32 32 32 33 33 33 31 31 31 28 28 28 27 27 27 28 28 28 29 29 29 -+49 49 49 38 38 38 27 27 27 24 24 24 25 25 25 28 28 28 29 29 29 29 29 29 -+27 27 27 27 27 27 29 29 29 33 33 33 37 37 37 38 38 38 38 38 38 38 38 38 -+36 36 36 25 25 25 20 20 20 21 21 21 19 19 19 17 17 17 27 27 27 40 40 40 -+39 39 39 21 21 21 23 23 23 31 31 31 23 23 23 20 20 20 25 25 25 27 27 27 -+21 21 21 27 27 27 32 32 32 37 37 37 37 37 37 34 34 34 31 31 31 28 28 28 -+27 27 27 34 34 34 37 37 37 33 33 33 28 28 28 28 28 28 29 29 29 29 29 29 -+34 34 34 33 33 33 31 31 31 29 29 29 29 29 29 31 31 31 33 33 33 34 34 34 -+27 27 27 28 28 28 32 32 32 34 34 34 34 34 34 32 32 32 28 28 28 25 25 25 -+28 28 28 32 32 32 34 34 34 36 36 36 34 34 34 32 32 32 24 24 24 16 16 16 -+28 28 28 25 25 25 16 16 16 0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 -+0 0 0 6 6 6 16 16 16 25 25 25 29 29 29 25 25 25 14 14 14 3 3 3 -+13 13 13 3 3 3 0 0 0 6 6 6 20 20 20 28 28 28 28 28 28 24 24 24 -+6 6 6 10 10 10 10 10 10 6 6 6 4 4 4 10 10 10 16 16 16 19 19 19 -+20 20 20 13 13 13 4 4 4 4 4 4 10 10 10 10 10 10 8 8 8 8 8 8 -+4 4 4 13 13 13 16 16 16 19 19 19 20 20 20 8 8 8 0 0 0 0 0 0 -+0 0 0 13 13 13 23 23 23 14 14 14 11 11 11 24 24 24 23 23 23 3 3 3 -+11 11 11 27 27 27 28 28 28 37 37 37 24 24 24 0 0 0 0 0 0 10 10 10 -+21 21 21 14 14 14 10 10 10 10 10 10 13 13 13 23 23 23 24 24 24 16 16 16 -+0 0 0 8 8 8 13 13 13 19 19 19 14 14 14 3 3 3 3 3 3 0 0 0 -+4 4 4 8 8 8 16 16 16 21 21 21 16 16 16 10 10 10 19 19 19 32 32 32 -+38 38 38 27 27 27 20 20 20 27 27 27 32 32 32 32 32 32 31 31 31 31 31 31 -+4 4 4 4 4 4 14 14 14 21 21 21 13 13 13 0 0 0 4 4 4 20 20 20 -+ -+14 14 14 19 19 19 14 14 14 0 0 0 0 0 0 11 11 11 19 19 19 17 17 17 -+0 0 0 0 0 0 8 8 8 21 21 21 19 19 19 3 3 3 0 0 0 6 6 6 -+23 23 23 25 25 25 19 19 19 4 4 4 0 0 0 6 6 6 8 8 8 0 0 0 -+10 10 10 19 19 19 21 21 21 13 13 13 3 3 3 0 0 0 3 3 3 3 3 3 -+4 4 4 13 13 13 21 21 21 20 20 20 10 10 10 0 0 0 0 0 0 4 4 4 -+0 0 0 0 0 0 6 6 6 17 17 17 17 17 17 6 6 6 0 0 0 0 0 0 -+4 4 4 0 0 0 0 0 0 11 11 11 20 20 20 16 16 16 3 3 3 0 0 0 -+0 0 0 3 3 3 4 4 4 0 0 0 6 6 6 14 14 14 14 14 14 4 4 4 -+6 6 6 19 19 19 17 17 17 0 0 0 0 0 0 11 11 11 16 16 16 8 8 8 -+0 0 0 8 8 8 13 13 13 13 13 13 8 8 8 0 0 0 0 0 0 0 0 0 -+0 0 0 6 6 6 17 17 17 20 20 20 11 11 11 0 0 0 0 0 0 4 4 4 -+3 3 3 0 0 0 0 0 0 16 16 16 21 21 21 13 13 13 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 6 6 6 16 16 16 23 23 23 27 27 27 27 27 27 -+28 28 28 27 27 27 27 27 27 28 28 28 31 31 31 31 31 31 31 31 31 31 31 31 -+19 19 19 11 11 11 0 0 0 0 0 0 0 0 0 14 14 14 20 20 20 21 21 21 -+3 3 3 6 6 6 16 16 16 24 24 24 21 21 21 11 11 11 6 6 6 11 11 11 -+27 27 27 24 24 24 13 13 13 0 0 0 4 4 4 21 21 21 24 24 24 16 16 16 -+6 6 6 13 13 13 20 20 20 23 23 23 16 16 16 8 8 8 13 13 13 21 21 21 -+31 31 31 23 23 23 13 13 13 10 10 10 20 20 20 28 28 28 24 24 24 13 13 13 -+19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 17 17 17 17 17 17 -+21 21 21 23 23 23 23 23 23 24 24 24 24 24 24 25 25 25 25 25 25 25 25 25 -+23 23 23 23 23 23 25 25 25 27 27 27 27 27 27 28 28 28 28 28 28 28 28 28 -+28 28 28 24 24 24 27 27 27 37 37 37 44 44 44 40 40 40 31 31 31 24 24 24 -+31 31 31 28 28 28 32 32 32 40 40 40 45 45 45 42 42 42 34 34 34 29 29 29 -+36 36 36 32 32 32 34 34 34 44 44 44 51 51 51 49 49 49 39 39 39 33 33 33 -+38 38 38 36 36 36 43 43 43 57 57 57 62 62 62 59 59 59 56 56 56 58 58 58 -+56 56 56 50 50 50 39 39 39 52 52 52 59 59 59 57 57 57 61 61 61 54 54 54 -+42 42 42 38 38 38 45 45 45 44 44 44 48 48 48 57 57 57 51 51 51 43 43 43 -+44 44 44 40 40 40 44 44 44 49 49 49 54 54 54 68 68 68 70 70 70 54 54 54 -+46 46 46 40 40 40 44 44 44 49 49 49 50 50 50 54 54 54 54 54 54 45 45 45 -+52 52 52 58 58 58 57 57 57 50 50 50 53 53 53 63 63 63 66 66 66 59 59 59 -+49 49 49 42 42 42 36 36 36 40 40 40 52 52 52 58 58 58 51 51 51 40 40 40 -+44 44 44 49 49 49 44 44 44 40 40 40 52 52 52 61 61 61 59 59 59 57 57 57 -+45 45 45 37 37 37 36 36 36 46 46 46 58 58 58 60 60 60 57 57 57 52 52 52 -+45 45 45 48 48 48 51 51 51 54 54 54 57 57 57 58 58 58 58 58 58 58 58 58 -+52 52 52 53 53 53 43 43 43 34 34 34 36 36 36 36 36 36 40 40 40 53 53 53 -+51 51 51 50 50 50 48 48 48 42 42 42 33 33 33 27 27 27 27 27 27 29 29 29 -+24 24 24 27 27 27 27 27 27 25 25 25 23 23 23 25 25 25 32 32 32 37 37 37 -+38 38 38 28 28 28 23 23 23 28 28 28 33 33 33 31 31 31 27 27 27 27 27 27 -+25 25 25 25 25 25 25 25 25 25 25 25 29 29 29 34 34 34 34 34 34 33 33 33 -+43 43 43 34 34 34 23 23 23 17 17 17 20 20 20 24 24 24 24 24 24 21 21 21 -+38 38 38 37 37 37 39 39 39 36 36 36 28 28 28 32 32 32 32 32 32 21 21 21 -+16 16 16 17 17 17 21 21 21 27 27 27 32 32 32 33 33 33 31 31 31 29 29 29 -+23 23 23 31 31 31 36 36 36 33 33 33 29 29 29 29 29 29 28 28 28 27 27 27 -+28 28 28 28 28 28 28 28 28 25 25 25 24 24 24 25 25 25 28 28 28 31 31 31 -+28 28 28 25 25 25 21 21 21 21 21 21 25 25 25 27 27 27 27 27 27 25 25 25 -+20 20 20 31 31 31 37 37 37 36 36 36 33 33 33 32 32 32 25 25 25 17 17 17 -+21 21 21 23 23 23 23 23 23 17 17 17 6 6 6 0 0 0 0 0 0 4 4 4 -+0 0 0 14 14 14 27 27 27 29 29 29 20 20 20 10 10 10 3 3 3 0 0 0 -+8 8 8 4 4 4 6 6 6 14 14 14 24 24 24 27 27 27 20 20 20 13 13 13 -+4 4 4 10 10 10 10 10 10 4 4 4 6 6 6 14 14 14 19 19 19 17 17 17 -+13 13 13 6 6 6 4 4 4 11 11 11 14 14 14 8 8 8 4 4 4 6 6 6 -+11 11 11 16 16 16 14 14 14 14 14 14 19 19 19 11 11 11 0 0 0 0 0 0 -+4 4 4 3 3 3 20 20 20 29 29 29 20 20 20 11 11 11 10 10 10 0 0 0 -+20 20 20 33 33 33 31 31 31 17 17 17 3 3 3 0 0 0 11 11 11 19 19 19 -+8 8 8 8 8 8 13 13 13 20 20 20 27 27 27 31 31 31 32 32 32 28 28 28 -+16 16 16 11 11 11 6 6 6 4 4 4 3 3 3 14 14 14 20 20 20 10 10 10 -+14 14 14 14 14 14 19 19 19 24 24 24 17 17 17 3 3 3 6 6 6 21 21 21 -+31 31 31 24 24 24 23 23 23 29 29 29 28 28 28 21 21 21 24 24 24 33 33 33 -+17 17 17 11 11 11 10 10 10 16 16 16 20 20 20 19 19 19 19 19 19 20 20 20 -+ -+10 10 10 19 19 19 23 23 23 14 14 14 3 3 3 0 0 0 14 14 14 25 25 25 -+16 16 16 4 4 4 0 0 0 10 10 10 21 21 21 23 23 23 11 11 11 0 0 0 -+11 11 11 24 24 24 28 28 28 14 14 14 0 0 0 0 0 0 4 4 4 4 4 4 -+0 0 0 6 6 6 20 20 20 23 23 23 13 13 13 0 0 0 0 0 0 10 10 10 -+3 3 3 0 0 0 10 10 10 21 21 21 19 19 19 3 3 3 0 0 0 6 6 6 -+4 4 4 0 0 0 0 0 0 11 11 11 17 17 17 11 11 11 4 4 4 3 3 3 -+4 4 4 0 0 0 0 0 0 0 0 0 11 11 11 19 19 19 13 13 13 0 0 0 -+0 0 0 3 3 3 4 4 4 0 0 0 0 0 0 11 11 11 19 19 19 17 17 17 -+23 23 23 14 14 14 3 3 3 0 0 0 0 0 0 3 3 3 6 6 6 11 11 11 -+16 16 16 13 13 13 10 10 10 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 13 13 13 19 19 19 13 13 13 0 0 0 0 0 0 0 0 0 6 6 6 -+0 0 0 3 3 3 11 11 11 19 19 19 13 13 13 0 0 0 0 0 0 4 4 4 -+0 0 0 0 0 0 6 6 6 11 11 11 16 16 16 20 20 20 23 23 23 24 24 24 -+27 27 27 27 27 27 27 27 27 28 28 28 31 31 31 32 32 32 29 29 29 25 25 25 -+10 10 10 4 4 4 0 0 0 0 0 0 13 13 13 20 20 20 16 16 16 6 6 6 -+0 0 0 16 16 16 25 25 25 20 20 20 6 6 6 3 3 3 13 13 13 23 23 23 -+24 24 24 14 14 14 4 4 4 4 4 4 16 16 16 23 23 23 16 16 16 4 4 4 -+11 11 11 21 21 21 24 24 24 16 16 16 6 6 6 10 10 10 21 21 21 28 28 28 -+20 20 20 13 13 13 10 10 10 19 19 19 24 24 24 21 21 21 14 14 14 11 11 11 -+11 11 11 13 13 13 14 14 14 17 17 17 19 19 19 19 19 19 20 20 20 21 21 21 -+16 16 16 16 16 16 16 16 16 17 17 17 17 17 17 19 19 19 19 19 19 19 19 19 -+20 20 20 20 20 20 21 21 21 23 23 23 24 24 24 25 25 25 25 25 25 27 27 27 -+25 25 25 24 24 24 23 23 23 27 27 27 37 37 37 43 43 43 38 38 38 28 28 28 -+29 29 29 28 28 28 27 27 27 29 29 29 38 38 38 43 43 43 40 40 40 33 33 33 -+34 34 34 32 32 32 29 29 29 33 33 33 43 43 43 50 50 50 45 45 45 37 37 37 -+37 37 37 29 29 29 34 34 34 50 50 50 60 60 60 57 57 57 54 54 54 58 58 58 -+57 57 57 50 50 50 33 33 33 42 42 42 51 51 51 50 50 50 59 59 59 59 59 59 -+49 49 49 38 38 38 43 43 43 43 43 43 46 46 46 59 59 59 57 57 57 50 50 50 -+44 44 44 38 38 38 38 38 38 38 38 38 40 40 40 56 56 56 66 66 66 60 60 60 -+52 52 52 44 44 44 39 39 39 39 39 39 43 43 43 52 52 52 58 58 58 54 54 54 -+31 31 31 44 44 44 57 57 57 59 59 59 56 56 56 53 53 53 57 57 57 59 59 59 -+57 57 57 51 51 51 40 40 40 36 36 36 42 42 42 52 52 52 54 54 54 52 52 52 -+38 38 38 40 40 40 45 45 45 45 45 45 44 44 44 52 52 52 57 57 57 49 49 49 -+42 42 42 44 44 44 48 48 48 50 50 50 49 49 49 45 45 45 50 50 50 58 58 58 -+34 34 34 37 37 37 42 42 42 46 46 46 50 50 50 52 52 52 52 52 52 52 52 52 -+50 50 50 53 53 53 44 44 44 33 33 33 33 33 33 33 33 33 37 37 37 48 48 48 -+48 48 48 48 48 48 45 45 45 38 38 38 31 31 31 28 28 28 31 31 31 33 33 33 -+31 31 31 31 31 31 29 29 29 27 27 27 25 25 25 29 29 29 37 37 37 44 44 44 -+33 33 33 28 28 28 29 29 29 36 36 36 36 36 36 29 29 29 25 25 25 25 25 25 -+27 27 27 25 25 25 23 23 23 21 21 21 23 23 23 25 25 25 25 25 25 23 23 23 -+39 39 39 33 33 33 25 25 25 21 21 21 23 23 23 24 24 24 20 20 20 14 14 14 -+25 25 25 31 31 31 37 37 37 33 33 33 29 29 29 32 32 32 31 31 31 19 19 19 -+19 19 19 16 16 16 14 14 14 16 16 16 20 20 20 24 24 24 25 25 25 25 25 25 -+20 20 20 25 25 25 29 29 29 29 29 29 31 31 31 32 32 32 28 28 28 23 23 23 -+29 29 29 31 31 31 32 32 32 32 32 32 29 29 29 28 28 28 31 31 31 33 33 33 -+34 34 34 29 29 29 25 25 25 24 24 24 27 27 27 31 31 31 32 32 32 32 32 32 -+8 8 8 24 24 24 34 34 34 32 32 32 28 28 28 27 27 27 27 27 27 24 24 24 -+19 19 19 16 16 16 20 20 20 25 25 25 19 19 19 0 0 0 0 0 0 10 10 10 -+14 14 14 23 23 23 29 29 29 25 25 25 14 14 14 4 4 4 6 6 6 11 11 11 -+6 6 6 11 11 11 19 19 19 24 24 24 24 24 24 20 20 20 13 13 13 6 6 6 -+8 8 8 10 10 10 6 6 6 4 4 4 11 11 11 19 19 19 17 17 17 10 10 10 -+6 6 6 4 4 4 8 8 8 14 14 14 11 11 11 4 4 4 4 4 4 13 13 13 -+17 17 17 17 17 17 8 8 8 8 8 8 17 17 17 16 16 16 4 4 4 0 0 0 -+4 4 4 0 0 0 16 16 16 31 31 31 20 20 20 4 4 4 11 11 11 20 20 20 -+32 32 32 6 6 6 0 0 0 0 0 0 4 4 4 24 24 24 17 17 17 14 14 14 -+11 11 11 13 13 13 21 21 21 32 32 32 32 32 32 23 23 23 21 21 21 28 28 28 -+0 0 0 19 19 19 19 19 19 4 4 4 10 10 10 11 11 11 3 3 3 8 8 8 -+6 6 6 3 3 3 10 10 10 24 24 24 28 28 28 23 23 23 24 24 24 31 31 31 -+23 23 23 17 17 17 20 20 20 28 28 28 25 25 25 16 16 16 16 16 16 25 25 25 -+28 28 28 23 23 23 14 14 14 10 10 10 17 17 17 25 25 25 21 21 21 11 11 11 -+ -+8 8 8 11 11 11 19 19 19 23 23 23 19 19 19 10 10 10 10 10 10 16 16 16 -+24 24 24 19 19 19 10 10 10 6 6 6 14 14 14 24 24 24 23 23 23 14 14 14 -+0 0 0 6 6 6 19 19 19 24 24 24 13 13 13 0 0 0 0 0 0 4 4 4 -+0 0 0 0 0 0 10 10 10 20 20 20 20 20 20 8 8 8 0 0 0 3 3 3 -+3 3 3 0 0 0 0 0 0 8 8 8 19 19 19 20 20 20 10 10 10 0 0 0 -+0 0 0 3 3 3 0 0 0 0 0 0 6 6 6 16 16 16 14 14 14 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 17 17 17 17 17 17 -+6 6 6 0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 13 13 13 25 25 25 -+28 28 28 10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 13 13 13 -+23 23 23 17 17 17 10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+13 13 13 13 13 13 8 8 8 0 0 0 0 0 0 3 3 3 4 4 4 3 3 3 -+0 0 0 13 13 13 20 20 20 10 10 10 0 0 0 0 0 0 3 3 3 4 4 4 -+0 0 0 8 8 8 17 17 17 14 14 14 10 10 10 13 13 13 20 20 20 25 25 25 -+27 27 27 27 27 27 27 27 27 27 27 27 29 29 29 31 31 31 27 27 27 20 20 20 -+4 4 4 0 0 0 0 0 0 20 20 20 27 27 27 16 16 16 3 3 3 0 0 0 -+11 11 11 20 20 20 19 19 19 4 4 4 0 0 0 10 10 10 21 21 21 25 25 25 -+10 10 10 6 6 6 11 11 11 20 20 20 21 21 21 14 14 14 6 6 6 4 4 4 -+21 21 21 23 23 23 17 17 17 6 6 6 8 8 8 19 19 19 24 24 24 21 21 21 -+6 6 6 10 10 10 19 19 19 25 25 25 21 21 21 10 10 10 8 8 8 16 16 16 -+10 10 10 11 11 11 13 13 13 13 13 13 13 13 13 14 14 14 16 16 16 17 17 17 -+16 16 16 16 16 16 17 17 17 17 17 17 19 19 19 19 19 19 20 20 20 20 20 20 -+19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 20 20 20 21 21 21 23 23 23 -+20 20 20 25 25 25 25 25 25 21 21 21 24 24 24 34 34 34 38 38 38 36 36 36 -+25 25 25 28 28 28 27 27 27 24 24 24 28 28 28 37 37 37 43 43 43 43 43 43 -+31 31 31 32 32 32 29 29 29 27 27 27 32 32 32 40 40 40 45 45 45 45 45 45 -+34 34 34 25 25 25 25 25 25 40 40 40 51 51 51 52 52 52 52 52 52 56 56 56 -+57 57 57 51 51 51 34 34 34 33 33 33 39 39 39 43 43 43 50 50 50 56 56 56 -+53 53 53 39 39 39 42 42 42 42 42 42 43 43 43 56 56 56 58 58 58 53 53 53 -+46 46 46 36 36 36 34 34 34 39 39 39 39 39 39 39 39 39 49 49 49 58 58 58 -+56 56 56 43 43 43 34 34 34 38 38 38 40 40 40 42 42 42 50 50 50 59 59 59 -+46 46 46 39 39 39 43 43 43 56 56 56 58 58 58 48 48 48 45 45 45 53 53 53 -+56 56 56 50 50 50 45 45 45 43 43 43 37 37 37 32 32 32 40 40 40 53 53 53 -+45 45 45 37 37 37 43 43 43 49 49 49 40 40 40 40 40 40 52 52 52 56 56 56 -+48 48 48 48 48 48 43 43 43 38 38 38 37 37 37 33 33 33 38 38 38 49 49 49 -+39 39 39 40 40 40 43 43 43 46 46 46 49 49 49 50 50 50 49 49 49 46 46 46 -+45 45 45 49 49 49 43 43 43 33 33 33 29 29 29 31 31 31 36 36 36 42 42 42 -+44 44 44 45 45 45 40 40 40 32 32 32 25 25 25 23 23 23 24 24 24 24 24 24 -+23 23 23 23 23 23 23 23 23 21 21 21 23 23 23 29 29 29 37 37 37 44 44 44 -+36 36 36 34 34 34 34 34 34 34 34 34 32 32 32 27 27 27 23 23 23 24 24 24 -+24 24 24 23 23 23 24 24 24 27 27 27 29 29 29 31 31 31 32 32 32 33 33 33 -+27 27 27 21 21 21 23 23 23 28 28 28 24 24 24 13 13 13 13 13 13 20 20 20 -+17 17 17 17 17 17 25 25 25 33 33 33 32 32 32 28 28 28 27 27 27 27 27 27 -+25 25 25 20 20 20 14 14 14 11 11 11 13 13 13 14 14 14 16 16 16 17 17 17 -+17 17 17 21 21 21 24 24 24 24 24 24 25 25 25 28 28 28 25 25 25 19 19 19 -+24 24 24 27 27 27 29 29 29 29 29 29 27 27 27 25 25 25 27 27 27 27 27 27 -+27 27 27 27 27 27 28 28 28 28 28 28 28 28 28 28 28 28 27 27 27 27 27 27 -+3 3 3 16 16 16 27 27 27 27 27 27 21 21 21 20 20 20 23 23 23 24 24 24 -+20 20 20 10 10 10 8 8 8 17 17 17 20 20 20 13 13 13 10 10 10 14 14 14 -+21 21 21 19 19 19 14 14 14 10 10 10 8 8 8 6 6 6 8 8 8 8 8 8 -+8 8 8 14 14 14 21 21 21 24 24 24 20 20 20 14 14 14 10 10 10 8 8 8 -+11 11 11 10 10 10 6 6 6 10 10 10 16 16 16 20 20 20 14 14 14 4 4 4 -+6 6 6 6 6 6 8 8 8 8 8 8 4 4 4 3 3 3 11 11 11 20 20 20 -+17 17 17 16 16 16 6 6 6 4 4 4 16 16 16 19 19 19 10 10 10 3 3 3 -+3 3 3 10 10 10 19 19 19 20 20 20 11 11 11 10 10 10 17 17 17 23 23 23 -+16 16 16 6 6 6 11 11 11 8 8 8 13 13 13 21 21 21 13 13 13 8 8 8 -+14 14 14 16 16 16 20 20 20 27 27 27 25 25 25 11 11 11 11 11 11 27 27 27 -+13 13 13 20 20 20 6 6 6 0 0 0 17 17 17 20 20 20 0 0 0 14 14 14 -+14 14 14 8 8 8 10 10 10 19 19 19 23 23 23 17 17 17 13 13 13 14 14 14 -+24 24 24 17 17 17 16 16 16 24 24 24 27 27 27 21 21 21 17 17 17 16 16 16 -+20 20 20 23 23 23 17 17 17 6 6 6 10 10 10 20 20 20 20 20 20 11 11 11 -+ -+13 13 13 8 8 8 8 8 8 16 16 16 21 21 21 17 17 17 10 10 10 4 4 4 -+13 13 13 19 19 19 20 20 20 11 11 11 6 6 6 11 11 11 19 19 19 24 24 24 -+8 8 8 0 0 0 0 0 0 19 19 19 20 20 20 4 4 4 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 6 6 6 16 16 16 14 14 14 6 6 6 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 8 8 8 19 19 19 16 16 16 4 4 4 -+0 0 0 4 4 4 3 3 3 0 0 0 0 0 0 10 10 10 14 14 14 13 13 13 -+6 6 6 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 8 8 8 19 19 19 -+16 16 16 4 4 4 0 0 0 0 0 0 3 3 3 3 3 3 10 10 10 19 19 19 -+17 17 17 11 11 11 4 4 4 0 0 0 0 0 0 3 3 3 8 8 8 11 11 11 -+14 14 14 13 13 13 10 10 10 3 3 3 0 0 0 0 0 0 0 0 0 6 6 6 -+16 16 16 8 8 8 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 4 4 4 -+6 6 6 14 14 14 14 14 14 3 3 3 0 0 0 0 0 0 4 4 4 3 3 3 -+6 6 6 13 13 13 14 14 14 10 10 10 10 10 10 16 16 16 23 23 23 25 25 25 -+24 24 24 27 27 27 25 25 25 24 24 24 27 27 27 28 28 28 21 21 21 13 13 13 -+3 3 3 0 0 0 8 8 8 21 21 21 20 20 20 6 6 6 0 0 0 6 6 6 -+19 19 19 16 16 16 6 6 6 0 0 0 8 8 8 21 21 21 21 21 21 14 14 14 -+0 0 0 8 8 8 19 19 19 21 21 21 14 14 14 6 6 6 6 6 6 14 14 14 -+21 21 21 16 16 16 10 10 10 8 8 8 14 14 14 19 19 19 16 16 16 11 11 11 -+8 8 8 16 16 16 21 21 21 21 21 21 14 14 14 6 6 6 10 10 10 14 14 14 -+13 13 13 14 14 14 14 14 14 13 13 13 11 11 11 13 13 13 16 16 16 19 19 19 -+32 32 32 32 32 32 33 33 33 33 33 33 34 34 34 34 34 34 36 36 36 36 36 36 -+28 28 28 25 25 25 23 23 23 19 19 19 17 17 17 19 19 19 20 20 20 20 20 20 -+20 20 20 23 23 23 23 23 23 20 20 20 19 19 19 23 23 23 31 31 31 34 34 34 -+32 32 32 27 27 27 23 23 23 23 23 23 25 25 25 28 28 28 34 34 34 40 40 40 -+34 34 34 31 31 31 28 28 28 27 27 27 27 27 27 29 29 29 36 36 36 43 43 43 -+40 40 40 31 31 31 25 25 25 34 34 34 43 43 43 46 46 46 48 48 48 50 50 50 -+51 51 51 49 49 49 40 40 40 28 28 28 29 29 29 36 36 36 37 37 37 45 45 45 -+51 51 51 34 34 34 39 39 39 37 37 37 34 34 34 46 46 46 51 51 51 49 49 49 -+49 49 49 40 40 40 34 34 34 37 37 37 37 37 37 31 31 31 34 34 34 48 48 48 -+48 48 48 43 43 43 39 39 39 37 37 37 34 34 34 33 33 33 39 39 39 48 48 48 -+59 59 59 45 45 45 36 36 36 39 39 39 44 44 44 43 43 43 42 42 42 44 44 44 -+45 45 45 43 43 43 42 42 42 40 40 40 32 32 32 25 25 25 29 29 29 40 40 40 -+56 56 56 48 48 48 44 44 44 43 43 43 36 36 36 31 31 31 39 39 39 49 49 49 -+53 53 53 46 46 46 33 33 33 28 28 28 32 32 32 28 28 28 24 24 24 29 29 29 -+45 45 45 44 44 44 43 43 43 43 43 43 44 44 44 44 44 44 43 43 43 40 40 40 -+39 39 39 39 39 39 38 38 38 32 32 32 27 27 27 31 31 31 37 37 37 37 37 37 -+38 38 38 39 39 39 37 37 37 31 31 31 28 28 28 31 31 31 32 32 32 31 31 31 -+21 21 21 23 23 23 24 24 24 27 27 27 29 29 29 34 34 34 39 39 39 42 42 42 -+36 36 36 34 34 34 31 31 31 27 27 27 25 25 25 27 27 27 25 25 25 21 21 21 -+24 24 24 21 21 21 23 23 23 28 28 28 27 27 27 21 21 21 20 20 20 24 24 24 -+19 19 19 20 20 20 24 24 24 27 27 27 21 21 21 14 14 14 14 14 14 20 20 20 -+16 16 16 19 19 19 23 23 23 28 28 28 28 28 28 24 24 24 24 24 24 27 27 27 -+25 25 25 21 21 21 17 17 17 14 14 14 13 13 13 13 13 13 13 13 13 11 11 11 -+13 13 13 20 20 20 21 21 21 19 19 19 14 14 14 16 16 16 17 17 17 14 14 14 -+6 6 6 8 8 8 10 10 10 10 10 10 8 8 8 8 8 8 8 8 8 8 8 8 -+6 6 6 11 11 11 17 17 17 17 17 17 13 13 13 8 8 8 6 6 6 8 8 8 -+6 6 6 10 10 10 16 16 16 20 20 20 20 20 20 16 16 16 14 14 14 14 14 14 -+13 13 13 10 10 10 4 4 4 4 4 4 11 11 11 16 16 16 16 16 16 14 14 14 -+14 14 14 8 8 8 0 0 0 0 0 0 3 3 3 6 6 6 6 6 6 3 3 3 -+16 16 16 17 17 17 17 17 17 16 16 16 11 11 11 8 8 8 8 8 8 10 10 10 -+10 10 10 8 8 8 10 10 10 16 16 16 19 19 19 16 16 16 10 10 10 6 6 6 -+6 6 6 8 8 8 6 6 6 3 3 3 4 4 4 11 11 11 16 16 16 17 17 17 -+8 8 8 16 16 16 11 11 11 6 6 6 14 14 14 16 16 16 11 11 11 11 11 11 -+11 11 11 23 23 23 21 21 21 11 11 11 10 10 10 14 14 14 16 16 16 16 16 16 -+3 3 3 25 25 25 6 6 6 8 8 8 14 14 14 3 3 3 14 14 14 11 11 11 -+11 11 11 14 14 14 13 13 13 14 14 14 17 17 17 11 11 11 11 11 11 23 23 23 -+27 27 27 0 0 0 6 6 6 23 23 23 0 0 0 3 3 3 11 11 11 8 8 8 -+4 4 4 3 3 3 3 3 3 8 8 8 11 11 11 13 13 13 11 11 11 11 11 11 -+17 17 17 14 14 14 13 13 13 16 16 16 19 19 19 16 16 16 13 13 13 10 10 10 -+11 11 11 17 17 17 17 17 17 11 11 11 10 10 10 14 14 14 17 17 17 14 14 14 -+ -+19 19 19 8 8 8 0 0 0 0 0 0 13 13 13 19 19 19 13 13 13 3 3 3 -+0 0 0 10 10 10 21 21 21 19 19 19 4 4 4 0 0 0 6 6 6 20 20 20 -+20 20 20 3 3 3 0 0 0 3 3 3 19 19 19 21 21 21 11 11 11 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 6 6 6 17 17 17 14 14 14 3 3 3 -+3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 13 13 13 21 21 21 -+4 4 4 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 8 8 8 24 24 24 -+20 20 20 6 6 6 0 0 0 6 6 6 4 4 4 0 0 0 0 0 0 8 8 8 -+19 19 19 14 14 14 3 3 3 0 0 0 0 0 0 11 11 11 11 11 11 0 0 0 -+3 3 3 16 16 16 16 16 16 0 0 0 0 0 0 10 10 10 16 16 16 11 11 11 -+0 0 0 4 4 4 10 10 10 8 8 8 3 3 3 0 0 0 8 8 8 16 16 16 -+13 13 13 0 0 0 0 0 0 8 8 8 4 4 4 0 0 0 0 0 0 10 10 10 -+20 20 20 6 6 6 0 0 0 0 0 0 6 6 6 0 0 0 0 0 0 3 3 3 -+20 20 20 14 14 14 4 4 4 0 0 0 13 13 13 25 25 25 28 28 28 23 23 23 -+23 23 23 24 24 24 24 24 24 23 23 23 24 24 24 25 25 25 17 17 17 6 6 6 -+0 0 0 13 13 13 17 17 17 10 10 10 0 0 0 0 0 0 10 10 10 17 17 17 -+14 14 14 6 6 6 0 0 0 6 6 6 20 20 20 27 27 27 17 17 17 0 0 0 -+8 8 8 14 14 14 17 17 17 13 13 13 3 3 3 3 3 3 14 14 14 24 24 24 -+13 13 13 6 6 6 8 8 8 17 17 17 19 19 19 11 11 11 4 4 4 4 4 4 -+20 20 20 21 21 21 19 19 19 10 10 10 10 10 10 14 14 14 14 14 14 10 10 10 -+10 10 10 11 11 11 14 14 14 14 14 14 16 16 16 20 20 20 25 25 25 31 31 31 -+31 31 31 31 31 31 32 32 32 32 32 32 33 33 33 33 33 33 34 34 34 34 34 34 -+37 37 37 34 34 34 29 29 29 24 24 24 21 21 21 20 20 20 21 21 21 23 23 23 -+25 25 25 19 19 19 14 14 14 19 19 19 21 21 21 20 20 20 23 23 23 28 28 28 -+43 43 43 27 27 27 17 17 17 24 24 24 28 28 28 24 24 24 24 24 24 29 29 29 -+45 45 45 32 32 32 23 23 23 27 27 27 28 28 28 23 23 23 24 24 24 31 31 31 -+51 51 51 40 40 40 32 32 32 33 33 33 39 39 39 43 43 43 44 44 44 44 44 44 -+45 45 45 46 46 46 45 45 45 27 27 27 25 25 25 32 32 32 25 25 25 37 37 37 -+46 46 46 29 29 29 34 34 34 33 33 33 27 27 27 38 38 38 44 44 44 42 42 42 -+49 49 49 50 50 50 38 38 38 27 27 27 31 31 31 32 32 32 31 31 31 36 36 36 -+33 33 33 46 46 46 46 46 46 33 33 33 25 25 25 31 31 31 33 33 33 29 29 29 -+34 34 34 48 48 48 49 49 49 34 34 34 25 25 25 34 34 34 43 43 43 43 43 43 -+39 39 39 42 42 42 39 39 39 33 33 33 34 34 34 39 39 39 38 38 38 31 31 31 -+31 31 31 43 43 43 39 39 39 31 31 31 34 34 34 37 37 37 33 33 33 37 37 37 -+34 34 34 37 37 37 33 33 33 33 33 33 37 37 37 34 34 34 34 34 34 44 44 44 -+42 42 42 38 38 38 34 34 34 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 -+33 33 33 31 31 31 34 34 34 31 31 31 24 24 24 31 31 31 39 39 39 34 34 34 -+36 36 36 37 37 37 33 33 33 27 27 27 25 25 25 29 29 29 29 29 29 25 25 25 -+28 28 28 28 28 28 29 29 29 31 31 31 31 31 31 31 31 31 29 29 29 29 29 29 -+28 28 28 27 27 27 24 24 24 20 20 20 25 25 25 32 32 32 28 28 28 20 20 20 -+23 23 23 19 19 19 23 23 23 29 29 29 27 27 27 16 16 16 14 14 14 21 21 21 -+19 19 19 28 28 28 28 28 28 19 19 19 19 19 19 25 25 25 21 21 21 8 8 8 -+13 13 13 25 25 25 25 25 25 14 14 14 13 13 13 20 20 20 20 20 20 13 13 13 -+19 19 19 19 19 19 19 19 19 19 19 19 17 17 17 16 16 16 14 14 14 13 13 13 -+10 10 10 19 19 19 23 23 23 14 14 14 4 4 4 3 3 3 8 8 8 13 13 13 -+8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 -+8 8 8 16 16 16 20 20 20 19 19 19 11 11 11 6 6 6 8 8 8 13 13 13 -+14 14 14 6 6 6 8 8 8 17 17 17 20 20 20 14 14 14 4 4 4 3 3 3 -+0 0 0 11 11 11 13 13 13 0 0 0 0 0 0 13 13 13 19 19 19 13 13 13 -+6 6 6 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 10 10 10 11 11 11 -+24 24 24 20 20 20 13 13 13 6 6 6 3 3 3 4 4 4 6 6 6 8 8 8 -+4 4 4 6 6 6 13 13 13 21 21 21 20 20 20 11 11 11 6 6 6 11 11 11 -+3 3 3 6 6 6 6 6 6 4 4 4 11 11 11 19 19 19 17 17 17 8 8 8 -+0 0 0 14 14 14 16 16 16 11 11 11 13 13 13 13 13 13 13 13 13 16 16 16 -+16 16 16 23 23 23 16 16 16 10 10 10 16 16 16 17 17 17 14 14 14 17 17 17 -+21 21 21 8 8 8 24 24 24 149 149 149 180 183 185 75 75 75 10 10 10 10 10 10 -+11 11 11 17 17 17 11 11 11 6 6 6 14 14 14 16 16 16 10 10 10 13 13 13 -+3 3 3 21 21 21 144 145 144 180 183 185 71 71 71 0 0 0 23 23 23 8 8 8 -+4 4 4 6 6 6 8 8 8 6 6 6 8 8 8 14 14 14 17 17 17 19 19 19 -+19 19 19 23 23 23 25 25 25 21 21 21 17 17 17 16 16 16 19 19 19 20 20 20 -+20 20 20 19 19 19 19 19 19 19 19 19 16 16 16 11 11 11 8 8 8 6 6 6 -+ -+14 14 14 14 14 14 8 8 8 0 0 0 0 0 0 11 11 11 14 14 14 13 13 13 -+0 0 0 0 0 0 6 6 6 21 21 21 17 17 17 0 0 0 0 0 0 3 3 3 -+17 17 17 19 19 19 11 11 11 0 0 0 0 0 0 17 17 17 20 20 20 11 11 11 -+0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 3 3 3 11 11 11 17 17 17 -+10 10 10 3 3 3 0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 10 10 10 -+19 19 19 8 8 8 0 0 0 0 0 0 0 0 0 4 4 4 3 3 3 0 0 0 -+20 20 20 14 14 14 4 4 4 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 -+6 6 6 6 6 6 6 6 6 10 10 10 13 13 13 11 11 11 4 4 4 0 0 0 -+0 0 0 8 8 8 13 13 13 10 10 10 10 10 10 14 14 14 11 11 11 0 0 0 -+0 0 0 3 3 3 8 8 8 10 10 10 10 10 10 10 10 10 11 11 11 13 13 13 -+0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 13 13 13 21 21 21 -+0 0 0 4 4 4 8 8 8 4 4 4 0 0 0 0 0 0 8 8 8 16 16 16 -+11 11 11 4 4 4 0 0 0 3 3 3 14 14 14 23 23 23 24 24 24 21 21 21 -+27 27 27 23 23 23 20 20 20 23 23 23 24 24 24 20 20 20 8 8 8 0 0 0 -+8 8 8 19 19 19 19 19 19 4 4 4 0 0 0 13 13 13 17 17 17 13 13 13 -+3 3 3 0 0 0 4 4 4 21 21 21 23 23 23 8 8 8 0 0 0 3 3 3 -+20 20 20 17 17 17 10 10 10 3 3 3 8 8 8 19 19 19 20 20 20 13 13 13 -+6 6 6 8 8 8 13 13 13 19 19 19 14 14 14 6 6 6 8 8 8 19 19 19 -+23 23 23 19 19 19 13 13 13 10 10 10 10 10 10 11 11 11 11 11 11 10 10 10 -+8 8 8 10 10 10 14 14 14 21 21 21 29 29 29 33 33 33 33 33 33 32 32 32 -+31 31 31 29 29 29 29 29 29 28 28 28 27 27 27 25 25 25 24 24 24 24 24 24 -+29 29 29 32 32 32 34 34 34 34 34 34 32 32 32 25 25 25 19 19 19 14 14 14 -+14 14 14 17 17 17 20 20 20 20 20 20 19 19 19 17 17 17 19 19 19 21 21 21 -+28 28 28 32 32 32 29 29 29 23 23 23 20 20 20 24 24 24 25 25 25 21 21 21 -+32 32 32 36 36 36 33 33 33 24 24 24 21 21 21 24 24 24 24 24 24 21 21 21 -+25 25 25 39 39 39 42 42 42 29 29 29 28 28 28 39 39 39 45 45 45 40 40 40 -+39 39 39 46 46 46 45 45 45 33 33 33 25 25 25 29 29 29 32 32 32 28 28 28 -+31 31 31 25 25 25 27 27 27 33 33 33 31 31 31 25 25 25 31 31 31 44 44 44 -+27 27 27 44 44 44 49 49 49 36 36 36 25 25 25 29 29 29 33 33 33 31 31 31 -+31 31 31 42 42 42 48 48 48 42 42 42 32 32 32 28 28 28 28 28 28 28 28 28 -+44 44 44 46 46 46 44 44 44 36 36 36 31 31 31 33 33 33 36 36 36 34 34 34 -+36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 -+34 34 34 34 34 34 36 36 36 37 37 37 37 37 37 36 36 36 32 32 32 28 28 28 -+32 32 32 34 34 34 37 37 37 36 36 36 33 33 33 32 32 32 33 33 33 37 37 37 -+34 34 34 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 -+28 28 28 31 31 31 32 32 32 31 31 31 29 29 29 28 28 28 27 27 27 28 28 28 -+28 28 28 29 29 29 29 29 29 31 31 31 29 29 29 29 29 29 29 29 29 31 31 31 -+31 31 31 31 31 31 31 31 31 32 32 32 31 31 31 31 31 31 29 29 29 29 29 29 -+28 28 28 28 28 28 29 29 29 28 28 28 27 27 27 24 24 24 20 20 20 19 19 19 -+21 21 21 23 23 23 24 24 24 20 20 20 16 16 16 13 13 13 14 14 14 19 19 19 -+17 17 17 19 19 19 19 19 19 17 17 17 14 14 14 13 13 13 16 16 16 17 17 17 -+21 21 21 20 20 20 17 17 17 14 14 14 13 13 13 13 13 13 13 13 13 13 13 13 -+19 19 19 21 21 21 23 23 23 24 24 24 24 24 24 23 23 23 21 21 21 20 20 20 -+20 20 20 20 20 20 19 19 19 17 17 17 14 14 14 11 11 11 10 10 10 8 8 8 -+8 8 8 10 10 10 11 11 11 10 10 10 8 8 8 8 8 8 10 10 10 13 13 13 -+19 19 19 19 19 19 11 11 11 0 0 0 3 3 3 14 14 14 14 14 14 4 4 4 -+6 6 6 6 6 6 14 14 14 21 21 21 14 14 14 0 0 0 0 0 0 11 11 11 -+11 11 11 4 4 4 0 0 0 4 4 4 13 13 13 16 16 16 14 14 14 10 10 10 -+0 0 0 0 0 0 8 8 8 13 13 13 14 14 14 14 14 14 16 16 16 16 16 16 -+6 6 6 14 14 14 0 0 0 6 6 6 10 10 10 4 4 4 13 13 13 0 0 0 -+10 10 10 10 10 10 14 14 14 3 3 3 8 8 8 0 0 0 4 4 4 0 0 0 -+0 0 0 20 20 20 0 0 0 11 11 11 14 14 14 16 16 16 10 10 10 0 0 0 -+0 0 0 8 8 8 4 4 4 0 0 0 20 20 20 20 20 20 27 27 27 25 25 25 -+21 21 21 0 0 0 27 27 27 19 19 19 29 29 29 42 42 42 112 112 113 149 151 153 -+36 36 36 13 13 13 17 17 17 180 183 185 180 183 185 101 101 101 0 0 0 19 19 19 -+0 0 0 4 4 4 0 0 0 17 17 17 23 23 23 0 0 0 24 24 24 21 21 21 -+3 3 3 19 19 19 166 167 167 200 220 210 88 88 88 8 8 8 16 16 16 0 0 0 -+6 6 6 10 10 10 3 3 3 0 0 0 17 17 17 0 0 0 13 13 13 27 27 27 -+28 28 28 17 17 17 21 21 21 14 14 14 11 11 11 29 29 29 27 27 27 0 0 0 -+21 21 21 17 17 17 14 14 14 17 17 17 21 21 21 20 20 20 13 13 13 3 3 3 -+ -+0 0 0 8 8 8 14 14 14 11 11 11 3 3 3 0 0 0 4 4 4 14 14 14 -+10 10 10 3 3 3 0 0 0 6 6 6 14 14 14 14 14 14 6 6 6 0 0 0 -+6 6 6 13 13 13 14 14 14 10 10 10 0 0 0 0 0 0 10 10 10 17 17 17 -+8 8 8 4 4 4 0 0 0 0 0 0 0 0 0 3 3 3 8 8 8 11 11 11 -+16 16 16 10 10 10 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 0 0 0 -+11 11 11 8 8 8 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+10 10 10 11 11 11 11 11 11 8 8 8 0 0 0 0 0 0 0 0 0 3 3 3 -+0 0 0 6 6 6 13 13 13 14 14 14 11 11 11 4 4 4 0 0 0 0 0 0 -+3 3 3 0 0 0 6 6 6 17 17 17 17 17 17 8 8 8 3 3 3 6 6 6 -+3 3 3 0 0 0 0 0 0 6 6 6 16 16 16 19 19 19 13 13 13 4 4 4 -+0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 8 8 8 10 10 10 11 11 11 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 10 10 10 11 11 11 -+10 10 10 3 3 3 0 0 0 4 4 4 16 16 16 23 23 23 23 23 23 21 21 21 -+21 21 21 21 21 21 21 21 21 21 21 21 20 20 20 16 16 16 11 11 11 6 6 6 -+19 19 19 10 10 10 0 0 0 0 0 0 8 8 8 14 14 14 13 13 13 8 8 8 -+0 0 0 10 10 10 17 17 17 17 17 17 10 10 10 4 4 4 8 8 8 14 14 14 -+19 19 19 10 10 10 0 0 0 8 8 8 17 17 17 19 19 19 13 13 13 4 4 4 -+0 0 0 13 13 13 19 19 19 14 14 14 4 4 4 3 3 3 11 11 11 20 20 20 -+16 16 16 14 14 14 11 11 11 10 10 10 10 10 10 10 10 10 10 10 10 8 8 8 -+11 11 11 14 14 14 19 19 19 24 24 24 28 28 28 28 28 28 25 25 25 24 24 24 -+17 17 17 16 16 16 16 16 16 14 14 14 14 14 14 13 13 13 13 13 13 13 13 13 -+20 20 20 21 21 21 24 24 24 25 25 25 27 27 27 27 27 27 25 25 25 24 24 24 -+16 16 16 17 17 17 17 17 17 17 17 17 16 16 16 16 16 16 17 17 17 19 19 19 -+20 20 20 24 24 24 29 29 29 28 28 28 21 21 21 16 16 16 19 19 19 24 24 24 -+23 23 23 28 28 28 33 33 33 33 33 33 25 25 25 19 19 19 19 19 19 24 24 24 -+23 23 23 31 31 31 34 34 34 32 32 32 32 32 32 37 37 37 40 40 40 39 39 39 -+39 39 39 42 42 42 40 40 40 36 36 36 31 31 31 28 28 28 25 25 25 23 23 23 -+28 28 28 25 25 25 28 28 28 34 34 34 33 33 33 28 28 28 29 29 29 34 34 34 -+36 36 36 33 33 33 37 37 37 40 40 40 37 37 37 27 27 27 25 25 25 33 33 33 -+23 23 23 34 34 34 40 40 40 38 38 38 32 32 32 31 31 31 31 31 31 31 31 31 -+32 32 32 36 36 36 36 36 36 33 33 33 33 33 33 36 36 36 36 36 36 33 33 33 -+33 33 33 33 33 33 34 34 34 36 36 36 37 37 37 36 36 36 32 32 32 29 29 29 -+33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 27 27 27 24 24 24 -+21 21 21 23 23 23 27 27 27 31 31 31 33 33 33 34 34 34 34 34 34 33 33 33 -+32 32 32 34 34 34 36 36 36 37 37 37 37 37 37 36 36 36 34 34 34 33 33 33 -+31 31 31 32 32 32 32 32 32 29 29 29 27 27 27 24 24 24 24 24 24 25 25 25 -+34 34 34 34 34 34 34 34 34 34 34 34 36 36 36 34 34 34 34 34 34 33 33 33 -+34 34 34 32 32 32 29 29 29 28 28 28 29 29 29 32 32 32 33 33 33 34 34 34 -+31 31 31 28 28 28 27 27 27 27 27 27 28 28 28 28 28 28 28 28 28 27 27 27 -+29 29 29 27 27 27 21 21 21 17 17 17 16 16 16 16 16 16 14 14 14 14 14 14 -+16 16 16 16 16 16 14 14 14 14 14 14 14 14 14 16 16 16 20 20 20 23 23 23 -+20 20 20 19 19 19 16 16 16 14 14 14 13 13 13 11 11 11 11 11 11 11 11 11 -+11 11 11 11 11 11 14 14 14 17 17 17 21 21 21 24 24 24 25 25 25 25 25 25 -+20 20 20 21 21 21 23 23 23 23 23 23 23 23 23 20 20 20 17 17 17 14 14 14 -+17 17 17 19 19 19 19 19 19 17 17 17 16 16 16 16 16 16 16 16 16 17 17 17 -+17 17 17 21 21 21 19 19 19 13 13 13 16 16 16 23 23 23 19 19 19 8 8 8 -+11 11 11 10 10 10 16 16 16 21 21 21 14 14 14 0 0 0 0 0 0 10 10 10 -+17 17 17 17 17 17 17 17 17 17 17 17 19 19 19 20 20 20 20 20 20 21 21 21 -+20 20 20 17 17 17 17 17 17 19 19 19 21 21 21 21 21 21 19 19 19 14 14 14 -+10 10 10 3 3 3 4 4 4 10 10 10 13 13 13 0 0 0 0 0 0 20 20 20 -+10 10 10 3 3 3 24 24 24 0 0 0 0 0 0 4 4 4 14 14 14 13 13 13 -+6 6 6 6 6 6 0 0 0 19 19 19 3 3 3 10 10 10 17 17 17 0 0 0 -+19 19 19 8 8 8 27 27 27 28 28 28 16 16 16 13 13 13 28 28 28 14 14 14 -+24 24 24 21 21 21 31 31 31 21 21 21 24 24 24 73 73 73 200 220 210 187 210 182 -+10 10 10 40 40 40 0 0 0 36 36 36 57 57 57 6 6 6 0 0 0 0 0 0 -+14 14 14 0 0 0 10 10 10 21 21 21 11 11 11 11 11 11 0 0 0 24 24 24 -+28 28 28 0 0 0 49 49 49 49 49 49 19 19 19 0 0 0 6 6 6 14 14 14 -+0 0 0 14 14 14 10 10 10 16 16 16 0 0 0 10 10 10 8 8 8 0 0 0 -+23 23 23 20 20 20 19 19 19 6 6 6 29 29 29 4 4 4 32 32 32 16 16 16 -+19 19 19 16 16 16 14 14 14 17 17 17 21 21 21 23 23 23 19 19 19 13 13 13 -+ -+0 0 0 0 0 0 10 10 10 16 16 16 8 8 8 0 0 0 0 0 0 10 10 10 -+14 14 14 13 13 13 3 3 3 0 0 0 4 4 4 19 19 19 16 16 16 0 0 0 -+0 0 0 3 3 3 11 11 11 17 17 17 8 8 8 0 0 0 0 0 0 16 16 16 -+16 16 16 10 10 10 3 3 3 0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 -+14 14 14 14 14 14 8 8 8 0 0 0 0 0 0 6 6 6 4 4 4 0 0 0 -+0 0 0 8 8 8 11 11 11 8 8 8 0 0 0 0 0 0 0 0 0 4 4 4 -+0 0 0 6 6 6 11 11 11 11 11 11 6 6 6 0 0 0 0 0 0 0 0 0 -+0 0 0 4 4 4 13 13 13 14 14 14 10 10 10 4 4 4 0 0 0 0 0 0 -+3 3 3 0 0 0 6 6 6 16 16 16 17 17 17 8 8 8 0 0 0 4 4 4 -+3 3 3 0 0 0 0 0 0 4 4 4 17 17 17 20 20 20 13 13 13 3 3 3 -+3 3 3 0 0 0 0 0 0 4 4 4 11 11 11 13 13 13 6 6 6 0 0 0 -+6 6 6 0 0 0 0 0 0 0 0 0 6 6 6 11 11 11 10 10 10 6 6 6 -+4 4 4 0 0 0 0 0 0 8 8 8 17 17 17 23 23 23 23 23 23 20 20 20 -+16 16 16 19 19 19 21 21 21 19 19 19 14 14 14 11 11 11 13 13 13 14 14 14 -+17 17 17 0 0 0 0 0 0 6 6 6 16 16 16 10 10 10 3 3 3 3 3 3 -+3 3 3 17 17 17 20 20 20 8 8 8 0 0 0 8 8 8 17 17 17 19 19 19 -+11 11 11 3 3 3 3 3 3 14 14 14 19 19 19 13 13 13 4 4 4 3 3 3 -+4 4 4 14 14 14 16 16 16 6 6 6 3 3 3 10 10 10 14 14 14 14 14 14 -+8 8 8 10 10 10 10 10 10 10 10 10 8 8 8 8 8 8 8 8 8 10 10 10 -+16 16 16 20 20 20 24 24 24 25 25 25 24 24 24 20 20 20 16 16 16 14 14 14 -+11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 -+11 11 11 11 11 11 13 13 13 14 14 14 19 19 19 24 24 24 28 28 28 31 31 31 -+19 19 19 17 17 17 14 14 14 13 13 13 13 13 13 14 14 14 14 14 14 14 14 14 -+14 14 14 14 14 14 21 21 21 28 28 28 25 25 25 14 14 14 13 13 13 20 20 20 -+16 16 16 19 19 19 27 27 27 34 34 34 31 31 31 20 20 20 16 16 16 20 20 20 -+19 19 19 21 21 21 25 25 25 31 31 31 33 33 33 34 34 34 36 36 36 36 36 36 -+38 38 38 34 34 34 34 34 34 37 37 37 34 34 34 28 28 28 21 21 21 19 19 19 -+24 24 24 25 25 25 29 29 29 33 33 33 34 34 34 32 32 32 28 28 28 24 24 24 -+37 37 37 25 25 25 27 27 27 39 39 39 40 40 40 28 28 28 23 23 23 29 29 29 -+20 20 20 27 27 27 33 33 33 33 33 33 31 31 31 31 31 31 31 31 31 29 29 29 -+27 27 27 28 28 28 28 28 28 29 29 29 32 32 32 33 33 33 29 29 29 23 23 23 -+24 24 24 27 27 27 29 29 29 34 34 34 38 38 38 37 37 37 32 32 32 28 28 28 -+32 32 32 31 31 31 29 29 29 29 29 29 29 29 29 28 28 28 24 24 24 20 20 20 -+21 21 21 21 21 21 23 23 23 28 28 28 33 33 33 34 34 34 29 29 29 24 24 24 -+27 27 27 31 31 31 36 36 36 38 38 38 37 37 37 34 34 34 33 33 33 33 33 33 -+33 33 33 33 33 33 31 31 31 27 27 27 23 23 23 20 20 20 20 20 20 21 21 21 -+36 36 36 33 33 33 31 31 31 31 31 31 33 33 33 33 33 33 32 32 32 29 29 29 -+25 25 25 24 24 24 21 21 21 21 21 21 24 24 24 27 27 27 27 27 27 27 27 27 -+21 21 21 19 19 19 14 14 14 14 14 14 19 19 19 23 23 23 24 24 24 25 25 25 -+28 28 28 21 21 21 14 14 14 11 11 11 14 14 14 16 16 16 14 14 14 11 11 11 -+14 14 14 13 13 13 10 10 10 11 11 11 14 14 14 19 19 19 23 23 23 25 25 25 -+19 19 19 19 19 19 16 16 16 14 14 14 11 11 11 11 11 11 10 10 10 10 10 10 -+11 11 11 10 10 10 8 8 8 11 11 11 17 17 17 20 20 20 21 21 21 20 20 20 -+16 16 16 19 19 19 21 21 21 24 24 24 24 24 24 23 23 23 20 20 20 17 17 17 -+21 21 21 21 21 21 20 20 20 20 20 20 20 20 20 20 20 20 19 19 19 17 17 17 -+17 17 17 20 20 20 20 20 20 17 17 17 20 20 20 24 24 24 21 21 21 11 11 11 -+14 14 14 11 11 11 14 14 14 19 19 19 14 14 14 3 3 3 0 0 0 6 6 6 -+13 13 13 17 17 17 20 20 20 17 17 17 13 13 13 11 11 11 16 16 16 21 21 21 -+21 21 21 16 16 16 11 11 11 13 13 13 17 17 17 17 17 17 11 11 11 4 4 4 -+10 10 10 0 0 0 58 58 58 137 138 139 180 183 185 166 167 167 144 145 144 180 183 185 -+109 110 110 23 23 23 137 138 139 187 210 182 112 112 113 17 17 17 96 97 98 200 220 210 -+149 149 149 0 0 0 78 78 78 187 210 182 152 153 154 129 129 130 180 183 185 180 183 185 -+69 69 69 112 112 113 180 183 185 180 183 185 112 112 113 27 27 27 13 13 13 29 29 29 -+142 143 144 180 183 185 180 183 185 133 133 133 16 16 16 180 183 185 200 220 210 200 220 210 -+200 220 210 112 112 113 14 14 14 187 210 182 187 210 182 70 70 70 56 56 56 180 183 185 -+180 183 185 81 81 81 10 10 10 180 183 185 200 220 210 83 83 83 14 14 14 21 21 21 -+16 16 16 19 19 19 180 183 185 180 183 185 66 66 66 20 20 20 144 145 144 180 183 185 -+105 105 105 163 163 163 180 183 185 144 145 144 34 34 34 0 0 0 0 0 0 29 29 29 -+117 117 117 180 183 185 180 183 185 169 175 167 8 8 8 0 0 0 17 17 17 21 21 21 -+13 13 13 11 11 11 11 11 11 13 13 13 16 16 16 17 17 17 17 17 17 16 16 16 -+ -+6 6 6 0 0 0 0 0 0 6 6 6 11 11 11 8 8 8 0 0 0 0 0 0 -+6 6 6 14 14 14 13 13 13 0 0 0 0 0 0 10 10 10 14 14 14 10 10 10 -+8 8 8 0 0 0 0 0 0 13 13 13 14 14 14 3 3 3 0 0 0 6 6 6 -+13 13 13 11 11 11 6 6 6 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 13 13 13 16 16 16 8 8 8 0 0 0 0 0 0 3 3 3 3 3 3 -+0 0 0 4 4 4 11 11 11 10 10 10 3 3 3 0 0 0 0 0 0 3 3 3 -+3 3 3 0 0 0 3 3 3 8 8 8 11 11 11 11 11 11 4 4 4 0 0 0 -+4 4 4 3 3 3 3 3 3 6 6 6 10 10 10 10 10 10 4 4 4 0 0 0 -+0 0 0 8 8 8 11 11 11 6 6 6 6 6 6 11 11 11 8 8 8 0 0 0 -+0 0 0 3 3 3 8 8 8 10 10 10 8 8 8 6 6 6 8 8 8 10 10 10 -+4 4 4 3 3 3 3 3 3 6 6 6 11 11 11 11 11 11 3 3 3 0 0 0 -+3 3 3 0 0 0 0 0 0 3 3 3 10 10 10 13 13 13 8 8 8 3 3 3 -+0 0 0 0 0 0 4 4 4 11 11 11 17 17 17 21 21 21 20 20 20 19 19 19 -+14 14 14 16 16 16 17 17 17 17 17 17 14 14 14 11 11 11 11 11 11 11 11 11 -+3 3 3 0 0 0 4 4 4 17 17 17 16 16 16 0 0 0 0 0 0 4 4 4 -+13 13 13 16 16 16 10 10 10 0 0 0 4 4 4 17 17 17 19 19 19 10 10 10 -+0 0 0 4 4 4 13 13 13 17 17 17 11 11 11 0 0 0 3 3 3 11 11 11 -+13 13 13 10 10 10 4 4 4 3 3 3 10 10 10 16 16 16 13 13 13 4 4 4 -+4 4 4 6 6 6 10 10 10 8 8 8 8 8 8 8 8 8 11 11 11 14 14 14 -+19 19 19 21 21 21 24 24 24 21 21 21 17 17 17 13 13 13 10 10 10 8 8 8 -+13 13 13 13 13 13 13 13 13 14 14 14 14 14 14 14 14 14 14 14 14 16 16 16 -+13 13 13 11 11 11 10 10 10 10 10 10 13 13 13 19 19 19 23 23 23 27 27 27 -+23 23 23 19 19 19 14 14 14 11 11 11 13 13 13 14 14 14 14 14 14 13 13 13 -+16 16 16 10 10 10 11 11 11 21 21 21 27 27 27 23 23 23 16 16 16 11 11 11 -+16 16 16 13 13 13 16 16 16 25 25 25 31 31 31 27 27 27 19 19 19 14 14 14 -+14 14 14 16 16 16 19 19 19 24 24 24 29 29 29 33 33 33 33 33 33 32 32 32 -+33 33 33 32 32 32 29 29 29 32 32 32 33 33 33 32 32 32 24 24 24 17 17 17 -+23 23 23 24 24 24 25 25 25 25 25 25 31 31 31 34 34 34 28 28 28 19 19 19 -+28 28 28 29 29 29 29 29 29 28 28 28 31 31 31 32 32 32 28 28 28 23 23 23 -+24 24 24 25 25 25 28 28 28 28 28 28 28 28 28 29 29 29 29 29 29 28 28 28 -+27 27 27 24 24 24 21 21 21 23 23 23 28 28 28 31 31 31 27 27 27 21 21 21 -+17 17 17 19 19 19 24 24 24 31 31 31 37 37 37 38 38 38 36 36 36 32 32 32 -+31 31 31 29 29 29 28 28 28 28 28 28 28 28 28 28 28 28 25 25 25 23 23 23 -+24 24 24 24 24 24 25 25 25 28 28 28 31 31 31 29 29 29 25 25 25 21 21 21 -+20 20 20 25 25 25 32 32 32 33 33 33 31 31 31 28 28 28 28 28 28 31 31 31 -+33 33 33 32 32 32 28 28 28 23 23 23 19 19 19 17 17 17 19 19 19 21 21 21 -+27 27 27 23 23 23 17 17 17 17 17 17 20 20 20 24 24 24 23 23 23 21 21 21 -+19 19 19 17 17 17 20 20 20 23 23 23 25 25 25 24 24 24 20 20 20 16 16 16 -+14 14 14 10 10 10 6 6 6 6 6 6 11 11 11 17 17 17 19 19 19 19 19 19 -+17 17 17 13 13 13 10 10 10 8 8 8 11 11 11 14 14 14 14 14 14 13 13 13 -+13 13 13 10 10 10 8 8 8 11 11 11 16 16 16 20 20 20 23 23 23 23 23 23 -+19 19 19 19 19 19 17 17 17 16 16 16 13 13 13 11 11 11 11 11 11 10 10 10 -+11 11 11 8 8 8 6 6 6 8 8 8 14 14 14 16 16 16 14 14 14 11 11 11 -+10 10 10 11 11 11 14 14 14 16 16 16 16 16 16 16 16 16 14 14 14 13 13 13 -+16 16 16 14 14 14 13 13 13 14 14 14 17 17 17 17 17 17 16 16 16 13 13 13 -+16 16 16 16 16 16 11 11 11 4 4 4 8 8 8 16 16 16 19 19 19 14 14 14 -+13 13 13 8 8 8 10 10 10 13 13 13 13 13 13 4 4 4 3 3 3 6 6 6 -+6 6 6 11 11 11 13 13 13 10 10 10 4 4 4 3 3 3 6 6 6 11 11 11 -+6 6 6 4 4 4 4 4 4 6 6 6 10 10 10 10 10 10 4 4 4 0 0 0 -+0 0 0 23 23 23 157 157 157 200 220 210 149 149 149 134 134 134 180 183 185 200 220 210 -+105 105 105 0 0 0 152 153 154 200 220 210 88 88 88 0 0 0 105 105 105 187 210 182 -+157 157 157 6 6 6 65 65 65 187 210 182 200 220 210 157 157 157 180 183 185 187 210 182 -+180 183 185 180 183 185 166 167 167 180 183 185 180 183 185 65 65 65 4 4 4 166 165 167 -+187 210 182 145 146 147 121 121 119 127 127 127 16 16 16 144 145 144 180 183 185 187 210 182 -+115 116 115 62 62 62 14 14 14 180 183 185 200 220 210 60 60 60 29 29 29 105 105 105 -+200 220 210 166 167 167 92 92 92 187 210 182 144 145 144 21 21 21 19 19 19 4 4 4 -+21 21 21 3 3 3 187 210 182 200 220 210 66 66 66 0 0 0 155 156 156 200 220 210 -+187 210 182 163 163 163 180 183 185 200 220 210 129 129 130 10 10 10 23 23 23 157 157 157 -+187 210 182 169 175 167 121 121 119 101 101 101 13 13 13 8 8 8 0 0 0 17 17 17 -+8 8 8 8 8 8 6 6 6 6 6 6 6 6 6 8 8 8 8 8 8 10 10 10 -+ -+13 13 13 6 6 6 0 0 0 0 0 0 6 6 6 16 16 16 10 10 10 0 0 0 -+0 0 0 8 8 8 13 13 13 8 8 8 0 0 0 0 0 0 4 4 4 11 11 11 -+11 11 11 4 4 4 0 0 0 4 4 4 13 13 13 13 13 13 6 6 6 0 0 0 -+4 4 4 8 8 8 11 11 11 8 8 8 3 3 3 0 0 0 0 0 0 3 3 3 -+0 0 0 4 4 4 11 11 11 14 14 14 8 8 8 0 0 0 0 0 0 8 8 8 -+0 0 0 0 0 0 4 4 4 8 8 8 8 8 8 4 4 4 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 4 4 4 10 10 10 11 11 11 6 6 6 3 3 3 -+8 8 8 3 3 3 0 0 0 0 0 0 4 4 4 8 8 8 6 6 6 3 3 3 -+3 3 3 10 10 10 8 8 8 0 0 0 0 0 0 8 8 8 10 10 10 3 3 3 -+0 0 0 10 10 10 14 14 14 8 8 8 0 0 0 0 0 0 3 3 3 13 13 13 -+4 4 4 6 6 6 8 8 8 8 8 8 6 6 6 3 3 3 0 0 0 0 0 0 -+0 0 0 0 0 0 6 6 6 10 10 10 10 10 10 8 8 8 4 4 4 0 0 0 -+0 0 0 0 0 0 6 6 6 13 13 13 17 17 17 19 19 19 19 19 19 17 17 17 -+16 16 16 14 14 14 14 14 14 14 14 14 16 16 16 13 13 13 8 8 8 3 3 3 -+0 0 0 4 4 4 14 14 14 14 14 14 8 8 8 0 0 0 3 3 3 10 10 10 -+13 13 13 6 6 6 0 0 0 0 0 0 13 13 13 17 17 17 11 11 11 0 0 0 -+3 3 3 13 13 13 17 17 17 10 10 10 3 3 3 4 4 4 10 10 10 13 13 13 -+14 14 14 4 4 4 0 0 0 8 8 8 14 14 14 13 13 13 6 6 6 3 3 3 -+6 6 6 8 8 8 8 8 8 8 8 8 8 8 8 10 10 10 16 16 16 20 20 20 -+20 20 20 20 20 20 19 19 19 16 16 16 10 10 10 8 8 8 8 8 8 10 10 10 -+8 8 8 8 8 8 8 8 8 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 -+13 13 13 13 13 13 11 11 11 11 11 11 11 11 11 14 14 14 17 17 17 19 19 19 -+24 24 24 20 20 20 16 16 16 13 13 13 14 14 14 14 14 14 14 14 14 13 13 13 -+13 13 13 13 13 13 11 11 11 13 13 13 21 21 21 25 25 25 20 20 20 11 11 11 -+16 16 16 14 14 14 11 11 11 13 13 13 20 20 20 27 27 27 23 23 23 14 14 14 -+11 11 11 16 16 16 16 16 16 14 14 14 20 20 20 31 31 31 32 32 32 27 27 27 -+28 28 28 31 31 31 28 28 28 23 23 23 27 27 27 34 34 34 31 31 31 20 20 20 -+20 20 20 21 21 21 19 19 19 16 16 16 23 23 23 31 31 31 29 29 29 23 23 23 -+20 20 20 29 29 29 31 31 31 21 21 21 20 20 20 28 28 28 29 29 29 23 23 23 -+28 28 28 25 25 25 23 23 23 23 23 23 25 25 25 27 27 27 28 28 28 29 29 29 -+24 24 24 19 19 19 14 14 14 16 16 16 23 23 23 28 28 28 31 31 31 31 31 31 -+19 19 19 20 20 20 23 23 23 27 27 27 32 32 32 34 34 34 34 34 34 33 33 33 -+29 29 29 27 27 27 25 25 25 27 27 27 28 28 28 29 29 29 29 29 29 28 28 28 -+17 17 17 20 20 20 23 23 23 23 23 23 21 21 21 23 23 23 25 25 25 28 28 28 -+20 20 20 24 24 24 28 28 28 28 28 28 25 25 25 24 24 24 27 27 27 29 29 29 -+29 29 29 28 28 28 24 24 24 20 20 20 16 16 16 16 16 16 19 19 19 21 21 21 -+23 23 23 16 16 16 10 10 10 8 8 8 13 13 13 19 19 19 20 20 20 20 20 20 -+23 23 23 24 24 24 24 24 24 27 27 27 27 27 27 25 25 25 20 20 20 16 16 16 -+20 20 20 17 17 17 16 16 16 17 17 17 19 19 19 21 21 21 21 21 21 21 21 21 -+10 10 10 13 13 13 14 14 14 14 14 14 13 13 13 11 11 11 13 13 13 16 16 16 -+11 11 11 11 11 11 11 11 11 13 13 13 17 17 17 19 19 19 19 19 19 16 16 16 -+19 19 19 19 19 19 17 17 17 17 17 17 16 16 16 14 14 14 13 13 13 13 13 13 -+4 4 4 3 3 3 3 3 3 8 8 8 14 14 14 17 17 17 14 14 14 10 10 10 -+8 8 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+6 6 6 6 6 6 6 6 6 10 10 10 13 13 13 14 14 14 13 13 13 10 10 10 -+11 11 11 10 10 10 3 3 3 0 0 0 0 0 0 8 8 8 13 13 13 13 13 13 -+6 6 6 3 3 3 3 3 3 6 6 6 8 8 8 6 6 6 4 4 4 6 6 6 -+13 13 13 11 11 11 10 10 10 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 -+0 0 0 4 4 4 11 11 11 13 13 13 10 10 10 6 6 6 6 6 6 8 8 8 -+11 11 11 78 78 78 187 210 182 169 175 167 10 10 10 13 13 13 166 167 167 200 220 210 -+101 101 101 6 6 6 152 153 154 187 210 182 105 105 105 14 14 14 103 103 102 187 210 182 -+149 149 149 25 25 25 70 70 70 200 220 210 187 210 182 32 32 32 33 33 33 187 210 182 -+187 210 182 78 78 78 24 24 24 161 161 162 200 220 210 90 90 90 29 29 29 180 183 185 -+187 210 182 133 133 133 48 48 48 11 11 11 19 19 19 70 70 70 180 183 185 200 220 210 -+6 6 6 17 17 17 14 14 14 180 183 185 187 210 182 74 74 74 14 14 14 14 14 14 -+149 151 153 187 210 182 200 220 210 180 183 185 33 33 33 0 0 0 27 27 27 16 16 16 -+0 0 0 14 14 14 200 220 210 180 183 185 71 71 71 6 6 6 149 149 149 180 183 185 -+125 122 126 3 3 3 69 69 69 200 220 210 187 210 182 13 13 13 67 67 67 200 220 210 -+180 183 185 19 19 19 0 0 0 11 11 11 0 0 0 14 14 14 17 17 17 0 0 0 -+6 6 6 6 6 6 6 6 6 4 4 4 4 4 4 4 4 4 8 8 8 11 11 11 -+ -+10 10 10 11 11 11 6 6 6 0 0 0 0 0 0 10 10 10 13 13 13 6 6 6 -+3 3 3 0 0 0 3 3 3 10 10 10 10 10 10 3 3 3 0 0 0 3 3 3 -+6 6 6 10 10 10 10 10 10 4 4 4 4 4 4 10 10 10 10 10 10 4 4 4 -+0 0 0 4 4 4 11 11 11 11 11 11 4 4 4 0 0 0 0 0 0 3 3 3 -+3 3 3 0 0 0 0 0 0 11 11 11 16 16 16 8 8 8 3 3 3 4 4 4 -+3 3 3 0 0 0 0 0 0 3 3 3 8 8 8 8 8 8 4 4 4 0 0 0 -+0 0 0 0 0 0 4 4 4 4 4 4 0 0 0 3 3 3 8 8 8 11 11 11 -+3 3 3 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 4 4 4 11 11 11 -+13 13 13 4 4 4 0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 11 11 11 -+11 11 11 11 11 11 8 8 8 3 3 3 0 0 0 0 0 0 0 0 0 6 6 6 -+6 6 6 10 10 10 10 10 10 6 6 6 0 0 0 0 0 0 0 0 0 4 4 4 -+0 0 0 3 3 3 10 10 10 11 11 11 8 8 8 3 3 3 0 0 0 3 3 3 -+0 0 0 3 3 3 10 10 10 14 14 14 16 16 16 16 16 16 16 16 16 16 16 16 -+16 16 16 13 13 13 11 11 11 13 13 13 14 14 14 11 11 11 4 4 4 0 0 0 -+10 10 10 11 11 11 8 8 8 0 0 0 0 0 0 8 8 8 11 11 11 10 10 10 -+4 4 4 0 0 0 3 3 3 10 10 10 11 11 11 6 6 6 3 3 3 4 4 4 -+11 11 11 14 14 14 10 10 10 0 0 0 3 3 3 13 13 13 14 14 14 8 8 8 -+6 6 6 3 3 3 6 6 6 13 13 13 11 11 11 0 0 0 0 0 0 8 8 8 -+10 10 10 8 8 8 8 8 8 6 6 6 8 8 8 13 13 13 19 19 19 23 23 23 -+17 17 17 16 16 16 13 13 13 8 8 8 6 6 6 6 6 6 8 8 8 11 11 11 -+8 8 8 8 8 8 8 8 8 8 8 8 10 10 10 10 10 10 11 11 11 11 11 11 -+10 10 10 10 10 10 11 11 11 11 11 11 13 13 13 13 13 13 14 14 14 14 14 14 -+21 21 21 19 19 19 16 16 16 14 14 14 14 14 14 14 14 14 13 13 13 13 13 13 -+8 8 8 16 16 16 17 17 17 11 11 11 11 11 11 19 19 19 21 21 21 17 17 17 -+11 11 11 17 17 17 16 16 16 8 8 8 8 8 8 17 17 17 23 23 23 20 20 20 -+11 11 11 16 16 16 14 14 14 8 8 8 14 14 14 25 25 25 29 29 29 23 23 23 -+25 25 25 29 29 29 27 27 27 17 17 17 19 19 19 31 31 31 32 32 32 24 24 24 -+17 17 17 19 19 19 16 16 16 11 11 11 14 14 14 24 24 24 27 27 27 25 25 25 -+21 21 21 24 24 24 24 24 24 21 21 21 19 19 19 19 19 19 21 21 21 25 25 25 -+27 27 27 21 21 21 19 19 19 20 20 20 23 23 23 24 24 24 27 27 27 29 29 29 -+28 28 28 23 23 23 17 17 17 16 16 16 17 17 17 20 20 20 25 25 25 31 31 31 -+25 25 25 25 25 25 25 25 25 24 24 24 24 24 24 24 24 24 24 24 24 25 25 25 -+27 27 27 24 24 24 23 23 23 23 23 23 25 25 25 28 28 28 29 29 29 29 29 29 -+17 17 17 19 19 19 20 20 20 16 16 16 11 11 11 11 11 11 17 17 17 23 23 23 -+23 23 23 25 25 25 27 27 27 25 25 25 23 23 23 24 24 24 27 27 27 29 29 29 -+24 24 24 24 24 24 21 21 21 17 17 17 14 14 14 14 14 14 17 17 17 20 20 20 -+25 25 25 20 20 20 16 16 16 14 14 14 17 17 17 21 21 21 23 23 23 23 23 23 -+25 25 25 24 24 24 21 21 21 19 19 19 17 17 17 17 17 17 17 17 17 19 19 19 -+21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 20 20 20 20 20 20 20 20 20 -+14 14 14 19 19 19 23 23 23 21 21 21 16 16 16 11 11 11 11 11 11 14 14 14 -+11 11 11 11 11 11 13 13 13 14 14 14 16 16 16 14 14 14 13 13 13 10 10 10 -+16 16 16 16 16 16 16 16 16 17 17 17 16 16 16 16 16 16 14 14 14 14 14 14 -+10 10 10 10 10 10 10 10 10 13 13 13 14 14 14 14 14 14 8 8 8 3 3 3 -+10 10 10 8 8 8 6 6 6 4 4 4 3 3 3 4 4 4 6 6 6 6 6 6 -+4 4 4 4 4 4 6 6 6 10 10 10 13 13 13 13 13 13 11 11 11 10 10 10 -+4 4 4 6 6 6 6 6 6 4 4 4 6 6 6 8 8 8 10 10 10 8 8 8 -+0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 6 6 6 8 8 8 -+13 13 13 10 10 10 4 4 4 4 4 4 8 8 8 10 10 10 8 8 8 4 4 4 -+0 0 0 10 10 10 14 14 14 14 14 14 6 6 6 0 0 0 3 3 3 8 8 8 -+0 0 0 105 105 105 187 210 182 152 153 154 11 11 11 0 0 0 147 147 148 200 220 210 -+105 104 105 6 6 6 145 146 147 180 183 185 109 110 110 6 6 6 105 105 105 180 183 185 -+157 157 157 0 0 0 62 62 62 200 220 210 180 183 185 14 14 14 24 24 24 187 210 182 -+200 220 210 72 72 72 10 10 10 147 147 148 187 210 182 109 110 110 4 4 4 93 93 93 -+180 183 185 180 183 185 187 210 182 117 117 117 0 0 0 78 78 78 200 220 210 180 183 185 -+10 10 10 19 19 19 0 0 0 200 220 210 180 183 185 78 78 78 0 0 0 13 13 13 -+82 82 82 187 210 182 180 183 185 112 112 113 4 4 4 33 33 33 0 0 0 10 10 10 -+16 16 16 4 4 4 200 220 210 200 220 210 63 63 63 0 0 0 157 157 157 180 183 185 -+99 99 99 10 10 10 69 69 69 200 220 210 187 210 182 0 0 0 112 112 113 187 210 182 -+149 151 153 4 4 4 19 19 19 19 19 19 19 19 19 0 0 0 11 11 11 10 10 10 -+6 6 6 6 6 6 8 8 8 8 8 8 10 10 10 13 13 13 16 16 16 17 17 17 -+ -+3 3 3 8 8 8 11 11 11 6 6 6 0 0 0 0 0 0 6 6 6 13 13 13 -+8 8 8 0 0 0 0 0 0 4 4 4 11 11 11 8 8 8 3 3 3 0 0 0 -+0 0 0 10 10 10 13 13 13 6 6 6 0 0 0 0 0 0 8 8 8 10 10 10 -+4 4 4 4 4 4 4 4 4 6 6 6 8 8 8 8 8 8 3 3 3 0 0 0 -+3 3 3 0 0 0 0 0 0 4 4 4 11 11 11 11 11 11 6 6 6 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 6 6 6 6 6 6 4 4 4 -+0 0 0 0 0 0 4 4 4 3 3 3 0 0 0 0 0 0 8 8 8 13 13 13 -+3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 11 11 11 -+13 13 13 3 3 3 0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 10 10 10 -+13 13 13 10 10 10 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+10 10 10 10 10 10 8 8 8 4 4 4 0 0 0 0 0 0 0 0 0 3 3 3 -+6 6 6 8 8 8 8 8 8 6 6 6 3 3 3 0 0 0 0 0 0 3 3 3 -+0 0 0 6 6 6 11 11 11 14 14 14 14 14 14 13 13 13 13 13 13 14 14 14 -+11 11 11 13 13 13 13 13 13 11 11 11 8 8 8 4 4 4 3 3 3 3 3 3 -+14 14 14 10 10 10 0 0 0 0 0 0 0 0 0 11 11 11 11 11 11 4 4 4 -+0 0 0 3 3 3 10 10 10 13 13 13 6 6 6 0 0 0 3 3 3 11 11 11 -+13 13 13 10 10 10 3 3 3 3 3 3 10 10 10 13 13 13 11 11 11 4 4 4 -+3 3 3 6 6 6 11 11 11 10 10 10 3 3 3 0 0 0 3 3 3 8 8 8 -+8 8 8 6 6 6 6 6 6 8 8 8 11 11 11 14 14 14 17 17 17 19 19 19 -+13 13 13 10 10 10 6 6 6 4 4 4 6 6 6 6 6 6 8 8 8 8 8 8 -+10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 -+8 8 8 8 8 8 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 -+16 16 16 17 17 17 16 16 16 14 14 14 13 13 13 11 11 11 11 11 11 13 13 13 -+10 10 10 13 13 13 13 13 13 11 11 11 10 10 10 13 13 13 17 17 17 20 20 20 -+14 14 14 16 16 16 14 14 14 10 10 10 8 8 8 11 11 11 17 17 17 20 20 20 -+16 16 16 14 14 14 13 13 13 11 11 11 14 14 14 19 19 19 21 21 21 23 23 23 -+24 24 24 27 27 27 23 23 23 14 14 14 13 13 13 19 19 19 24 24 24 25 25 25 -+13 13 13 16 16 16 16 16 16 13 13 13 13 13 13 16 16 16 20 20 20 23 23 23 -+23 23 23 19 19 19 19 19 19 21 21 21 20 20 20 16 16 16 16 16 16 23 23 23 -+25 25 25 20 20 20 17 17 17 20 20 20 21 21 21 19 19 19 19 19 19 21 21 21 -+29 29 29 27 27 27 24 24 24 21 21 21 16 16 16 11 11 11 14 14 14 23 23 23 -+25 25 25 27 27 27 27 27 27 23 23 23 17 17 17 14 14 14 14 14 14 17 17 17 -+23 23 23 20 20 20 17 17 17 17 17 17 20 20 20 23 23 23 24 24 24 25 25 25 -+21 21 21 20 20 20 16 16 16 13 13 13 10 10 10 11 11 11 14 14 14 16 16 16 -+23 23 23 23 23 23 23 23 23 21 21 21 21 21 21 21 21 21 23 23 23 25 25 25 -+23 23 23 21 21 21 20 20 20 16 16 16 13 13 13 13 13 13 14 14 14 17 17 17 -+23 23 23 23 23 23 21 21 21 20 20 20 20 20 20 19 19 19 17 17 17 17 17 17 -+17 17 17 19 19 19 17 17 17 13 13 13 8 8 8 8 8 8 13 13 13 16 16 16 -+16 16 16 17 17 17 19 19 19 17 17 17 14 14 14 13 13 13 14 14 14 16 16 16 -+17 17 17 19 19 19 19 19 19 17 17 17 14 14 14 13 13 13 11 11 11 11 11 11 -+11 11 11 13 13 13 13 13 13 13 13 13 11 11 11 10 10 10 10 10 10 10 10 10 -+10 10 10 11 11 11 13 13 13 14 14 14 16 16 16 14 14 14 14 14 14 13 13 13 -+17 17 17 16 16 16 16 16 16 14 14 14 13 13 13 10 10 10 6 6 6 4 4 4 -+8 8 8 8 8 8 6 6 6 6 6 6 4 4 4 6 6 6 6 6 6 6 6 6 -+4 4 4 8 8 8 11 11 11 11 11 11 11 11 11 8 8 8 6 6 6 6 6 6 -+0 0 0 4 4 4 8 8 8 10 10 10 10 10 10 8 8 8 6 6 6 4 4 4 -+3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 6 6 6 10 10 10 -+6 6 6 3 3 3 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 0 0 0 -+6 6 6 8 8 8 8 8 8 6 6 6 0 0 0 0 0 0 0 0 0 4 4 4 -+3 3 3 89 89 89 200 220 210 163 163 163 14 14 14 23 23 23 166 167 167 180 183 185 -+109 110 110 6 6 6 147 147 148 200 220 210 115 116 115 0 0 0 125 125 127 200 220 210 -+152 153 154 6 6 6 68 68 68 180 183 185 187 210 182 6 6 6 8 8 8 200 220 210 -+187 210 182 63 63 63 25 25 25 157 157 157 180 183 185 125 125 127 8 8 8 10 10 10 -+6 6 6 92 92 92 200 220 210 187 210 182 75 75 75 51 51 51 180 183 185 200 220 210 -+3 3 3 4 4 4 17 17 17 187 210 182 200 220 210 65 65 65 6 6 6 21 21 21 -+169 175 167 180 183 185 180 183 185 187 210 182 66 66 66 0 0 0 19 19 19 10 10 10 -+13 13 13 10 10 10 180 183 185 187 210 182 75 75 75 6 6 6 147 147 148 200 220 210 -+105 105 105 0 0 0 57 57 57 180 183 185 187 210 182 14 14 14 96 96 96 180 183 185 -+180 183 185 25 25 25 0 0 0 0 0 0 6 6 6 39 39 39 112 112 113 42 42 42 -+10 10 10 10 10 10 10 10 10 10 10 10 13 13 13 14 14 14 16 16 16 17 17 17 -+ -+0 0 0 3 3 3 8 8 8 11 11 11 4 4 4 0 0 0 0 0 0 11 11 11 -+10 10 10 4 4 4 0 0 0 0 0 0 6 6 6 10 10 10 6 6 6 3 3 3 -+0 0 0 6 6 6 8 8 8 6 6 6 0 0 0 0 0 0 3 3 3 10 10 10 -+13 13 13 4 4 4 0 0 0 0 0 0 10 10 10 13 13 13 4 4 4 0 0 0 -+0 0 0 4 4 4 6 6 6 0 0 0 0 0 0 6 6 6 8 8 8 4 4 4 -+0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 3 3 3 6 6 6 10 10 10 -+4 4 4 0 0 0 0 0 0 0 0 0 4 4 4 8 8 8 8 8 8 6 6 6 -+6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 6 6 6 6 6 6 4 4 4 -+4 4 4 10 10 10 6 6 6 0 0 0 0 0 0 4 4 4 6 6 6 0 0 0 -+8 8 8 6 6 6 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 -+11 11 11 8 8 8 4 4 4 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 -+14 14 14 10 10 10 4 4 4 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+0 0 0 8 8 8 13 13 13 14 14 14 13 13 13 11 11 11 11 11 11 14 14 14 -+8 8 8 13 13 13 14 14 14 10 10 10 0 0 0 0 0 0 4 4 4 11 11 11 -+8 8 8 3 3 3 0 0 0 3 3 3 6 6 6 8 8 8 4 4 4 0 0 0 -+0 0 0 8 8 8 11 11 11 8 8 8 0 0 0 0 0 0 6 6 6 14 14 14 -+8 8 8 3 3 3 4 4 4 11 11 11 13 13 13 4 4 4 3 3 3 8 8 8 -+6 6 6 11 11 11 8 8 8 0 0 0 0 0 0 6 6 6 6 6 6 3 3 3 -+6 6 6 4 4 4 4 4 4 8 8 8 13 13 13 16 16 16 16 16 16 14 14 14 -+10 10 10 6 6 6 4 4 4 4 4 4 6 6 6 8 8 8 6 6 6 4 4 4 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+10 10 10 10 10 10 8 8 8 8 8 8 6 6 6 6 6 6 6 6 6 6 6 6 -+11 11 11 14 14 14 16 16 16 14 14 14 11 11 11 10 10 10 10 10 10 11 11 11 -+16 16 16 6 6 6 0 0 0 10 10 10 14 14 14 13 13 13 13 13 13 16 16 16 -+20 20 20 11 11 11 6 6 6 13 13 13 16 16 16 13 13 13 13 13 13 16 16 16 -+20 20 20 13 13 13 11 11 11 16 16 16 17 17 17 13 13 13 16 16 16 23 23 23 -+24 24 24 23 23 23 20 20 20 16 16 16 10 10 10 8 8 8 16 16 16 24 24 24 -+10 10 10 13 13 13 17 17 17 17 17 17 13 13 13 10 10 10 14 14 14 19 19 19 -+20 20 20 20 20 20 19 19 19 19 19 19 20 20 20 20 20 20 17 17 17 13 13 13 -+27 27 27 23 23 23 20 20 20 21 21 21 20 20 20 13 13 13 8 8 8 11 11 11 -+21 21 21 23 23 23 25 25 25 25 25 25 17 17 17 10 10 10 13 13 13 23 23 23 -+20 20 20 24 24 24 25 25 25 21 21 21 14 14 14 10 10 10 10 10 10 13 13 13 -+20 20 20 17 17 17 14 14 14 13 13 13 14 14 14 17 17 17 19 19 19 20 20 20 -+20 20 20 14 14 14 11 11 11 11 11 11 17 17 17 21 21 21 23 23 23 21 21 21 -+19 19 19 19 19 19 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 -+21 21 21 21 21 21 20 20 20 16 16 16 11 11 11 11 11 11 13 13 13 14 14 14 -+17 17 17 19 19 19 20 20 20 20 20 20 17 17 17 13 13 13 8 8 8 4 4 4 -+13 13 13 17 17 17 21 21 21 20 20 20 14 14 14 11 11 11 14 14 14 17 17 17 -+13 13 13 17 17 17 19 19 19 16 16 16 10 10 10 8 8 8 13 13 13 17 17 17 -+16 16 16 11 11 11 6 6 6 8 8 8 11 11 11 13 13 13 11 11 11 6 6 6 -+11 11 11 13 13 13 13 13 13 11 11 11 8 8 8 6 6 6 10 10 10 11 11 11 -+6 6 6 6 6 6 10 10 10 11 11 11 13 13 13 13 13 13 13 13 13 13 13 13 -+14 14 14 14 14 14 14 14 14 13 13 13 13 13 13 14 14 14 14 14 14 16 16 16 -+3 3 3 4 4 4 4 4 4 6 6 6 6 6 6 6 6 6 6 6 6 4 4 4 -+4 4 4 10 10 10 13 13 13 11 11 11 8 8 8 3 3 3 0 0 0 0 0 0 -+3 3 3 4 4 4 6 6 6 8 8 8 6 6 6 4 4 4 4 4 4 4 4 4 -+4 4 4 6 6 6 6 6 6 3 3 3 0 0 0 3 3 3 6 6 6 10 10 10 -+4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 4 4 4 6 6 6 -+13 13 13 10 10 10 4 4 4 3 3 3 4 4 4 6 6 6 10 10 10 11 11 11 -+10 10 10 34 34 34 180 183 185 200 220 210 140 140 140 129 129 130 180 183 185 187 210 182 -+101 101 101 3 3 3 112 112 113 180 183 185 187 210 182 149 149 149 187 210 182 180 183 185 -+149 149 149 3 3 3 71 71 71 187 210 182 200 220 210 14 14 14 10 10 10 187 210 182 -+187 210 182 74 74 74 8 8 8 152 153 154 187 210 182 101 101 101 10 10 10 152 153 154 -+117 117 117 127 127 127 180 183 185 180 183 185 17 17 17 40 40 40 187 210 182 180 183 185 -+166 167 167 91 91 91 0 0 0 187 210 182 187 210 182 69 69 69 17 17 17 96 97 98 -+180 183 185 137 137 137 101 101 101 200 220 210 142 143 144 19 19 19 3 3 3 16 16 16 -+8 8 8 16 16 16 200 220 210 187 210 182 63 63 63 14 14 14 155 156 156 180 183 185 -+105 105 105 0 0 0 74 74 74 187 210 182 187 210 182 8 8 8 17 17 17 180 183 185 -+180 183 185 169 175 167 105 105 105 121 121 119 11 11 11 139 139 139 200 220 210 140 140 140 -+13 13 13 11 11 11 10 10 10 10 10 10 11 11 11 11 11 11 10 10 10 8 8 8 -+ -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+6 6 6 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 6 6 6 -+0 0 0 0 0 0 3 3 3 6 6 6 6 6 6 3 3 3 0 0 0 0 0 0 -+8 8 8 6 6 6 3 3 3 0 0 0 0 0 0 3 3 3 6 6 6 8 8 8 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 6 6 6 8 8 8 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 -+14 14 14 6 6 6 0 0 0 0 0 0 4 4 4 8 8 8 3 3 3 0 0 0 -+6 6 6 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 6 6 6 -+6 6 6 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 6 6 6 -+0 0 0 4 4 4 6 6 6 4 4 4 0 0 0 0 0 0 6 6 6 11 11 11 -+0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 6 6 6 8 8 8 8 8 8 -+8 8 8 6 6 6 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+8 8 8 8 8 8 10 10 10 10 10 10 11 11 11 11 11 11 10 10 10 10 10 10 -+14 14 14 11 11 11 8 8 8 4 4 4 3 3 3 3 3 3 4 4 4 6 6 6 -+0 0 0 3 3 3 8 8 8 10 10 10 6 6 6 3 3 3 3 3 3 3 3 3 -+10 10 10 6 6 6 3 3 3 3 3 3 4 4 4 6 6 6 6 6 6 6 6 6 -+0 0 0 4 4 4 8 8 8 10 10 10 10 10 10 8 8 8 4 4 4 0 0 0 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+8 8 8 6 6 6 4 4 4 8 8 8 11 11 11 13 13 13 13 13 13 10 10 10 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 -+10 10 10 13 13 13 14 14 14 14 14 14 11 11 11 10 10 10 10 10 10 11 11 11 -+10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 -+14 14 14 14 14 14 14 14 14 13 13 13 13 13 13 11 11 11 11 11 11 11 11 11 -+14 14 14 14 14 14 13 13 13 13 13 13 14 14 14 14 14 14 16 16 16 17 17 17 -+19 19 19 19 19 19 17 17 17 13 13 13 8 8 8 8 8 8 11 11 11 14 14 14 -+14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 -+13 13 13 14 14 14 16 16 16 16 16 16 16 16 16 14 14 14 13 13 13 13 13 13 -+13 13 13 16 16 16 17 17 17 16 16 16 13 13 13 8 8 8 8 8 8 8 8 8 -+11 11 11 16 16 16 20 20 20 21 21 21 20 20 20 19 19 19 19 19 19 19 19 19 -+19 19 19 17 17 17 16 16 16 14 14 14 13 13 13 11 11 11 10 10 10 10 10 10 -+8 8 8 10 10 10 13 13 13 16 16 16 17 17 17 17 17 17 16 16 16 14 14 14 -+10 10 10 11 11 11 14 14 14 16 16 16 17 17 17 17 17 17 16 16 16 16 16 16 -+19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 -+19 19 19 19 19 19 17 17 17 16 16 16 14 14 14 13 13 13 11 11 11 11 11 11 -+4 4 4 6 6 6 10 10 10 13 13 13 13 13 13 11 11 11 10 10 10 6 6 6 -+14 14 14 16 16 16 19 19 19 19 19 19 19 19 19 16 16 16 13 13 13 11 11 11 -+11 11 11 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+11 11 11 11 11 11 10 10 10 8 8 8 8 8 8 6 6 6 6 6 6 4 4 4 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 -+11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 -+8 8 8 10 10 10 10 10 10 10 10 10 8 8 8 6 6 6 3 3 3 0 0 0 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+4 4 4 6 6 6 8 8 8 8 8 8 8 8 8 8 8 8 6 6 6 4 4 4 -+0 0 0 3 3 3 4 4 4 4 4 4 3 3 3 4 4 4 6 6 6 10 10 10 -+8 8 8 8 8 8 6 6 6 4 4 4 4 4 4 6 6 6 8 8 8 8 8 8 -+0 0 0 16 16 16 59 59 59 158 159 161 200 220 210 144 145 144 166 167 167 180 183 185 -+103 103 102 0 0 0 28 28 28 127 127 127 200 220 210 166 167 167 112 112 113 180 183 185 -+152 153 154 6 6 6 60 60 60 200 220 210 180 183 185 4 4 4 16 16 16 187 210 182 -+187 210 182 63 63 63 14 14 14 149 149 149 200 220 210 95 95 94 44 44 44 139 139 139 -+169 175 167 180 183 185 157 157 157 80 80 80 6 6 6 4 4 4 95 95 94 180 183 185 -+187 210 182 94 94 94 25 25 25 180 183 185 187 210 182 68 68 68 60 60 60 180 183 185 -+180 183 185 42 42 42 34 34 34 180 183 185 200 220 210 101 101 101 14 14 14 16 16 16 -+3 3 3 25 25 25 180 183 185 200 220 210 67 67 67 13 13 13 152 153 154 187 210 182 -+96 97 98 11 11 11 68 68 68 187 210 182 180 183 185 25 25 25 0 0 0 40 40 40 -+131 131 131 169 175 167 200 220 210 155 156 156 16 16 16 105 105 105 187 210 182 112 112 113 -+8 8 8 8 8 8 8 8 8 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 -+ -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 -+8 8 8 6 6 6 6 6 6 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 4 4 4 6 6 6 6 6 6 4 4 4 3 3 3 3 3 3 -+3 3 3 3 3 3 4 4 4 6 6 6 6 6 6 4 4 4 3 3 3 3 3 3 -+4 4 4 3 3 3 3 3 3 3 3 3 4 4 4 6 6 6 6 6 6 6 6 6 -+0 0 0 0 0 0 3 3 3 3 3 3 4 4 4 6 6 6 6 6 6 8 8 8 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+6 6 6 8 8 8 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 -+11 11 11 10 10 10 8 8 8 6 6 6 4 4 4 4 4 4 3 3 3 3 3 3 -+3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 4 4 4 4 4 4 -+6 6 6 4 4 4 4 4 4 4 4 4 6 6 6 6 6 6 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 6 6 6 6 6 6 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+6 6 6 4 4 4 6 6 6 8 8 8 11 11 11 13 13 13 11 11 11 8 8 8 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+8 8 8 11 11 11 13 13 13 13 13 13 10 10 10 8 8 8 8 8 8 10 10 10 -+10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 -+13 13 13 13 13 13 13 13 13 11 11 11 11 11 11 10 10 10 10 10 10 10 10 10 -+13 13 13 13 13 13 13 13 13 13 13 13 14 14 14 16 16 16 17 17 17 19 19 19 -+17 17 17 17 17 17 17 17 17 16 16 16 11 11 11 10 10 10 11 11 11 13 13 13 -+13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 -+13 13 13 14 14 14 16 16 16 16 16 16 16 16 16 16 16 16 14 14 14 14 14 14 -+13 13 13 14 14 14 17 17 17 17 17 17 14 14 14 11 11 11 10 10 10 8 8 8 -+10 10 10 13 13 13 16 16 16 19 19 19 19 19 19 19 19 19 17 17 17 17 17 17 -+17 17 17 17 17 17 16 16 16 16 16 16 14 14 14 13 13 13 11 11 11 11 11 11 -+8 8 8 10 10 10 13 13 13 14 14 14 16 16 16 16 16 16 14 14 14 13 13 13 -+11 11 11 13 13 13 13 13 13 14 14 14 14 14 14 14 14 14 13 13 13 13 13 13 -+17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 -+17 17 17 16 16 16 16 16 16 14 14 14 13 13 13 11 11 11 10 10 10 10 10 10 -+11 11 11 13 13 13 14 14 14 16 16 16 16 16 16 16 16 16 14 14 14 13 13 13 -+14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 13 13 13 -+13 13 13 13 13 13 13 13 13 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 -+8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 -+11 11 11 10 10 10 10 10 10 8 8 8 8 8 8 6 6 6 4 4 4 4 4 4 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 -+10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 -+8 8 8 8 8 8 8 8 8 8 8 8 6 6 6 4 4 4 4 4 4 3 3 3 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+6 6 6 6 6 6 6 6 6 8 8 8 8 8 8 6 6 6 6 6 6 6 6 6 -+0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 4 4 4 6 6 6 8 8 8 -+8 8 8 8 8 8 6 6 6 4 4 4 4 4 4 6 6 6 8 8 8 8 8 8 -+14 14 14 0 0 0 24 24 24 13 13 13 0 0 0 42 42 42 166 167 167 200 220 210 -+68 68 68 8 8 8 0 0 0 0 0 0 16 16 16 11 11 11 0 0 0 11 11 11 -+0 0 0 0 0 0 19 19 19 0 0 0 4 4 4 8 8 8 10 10 10 10 10 10 -+8 8 8 6 6 6 0 0 0 6 6 6 20 20 20 6 6 6 0 0 0 8 8 8 -+11 11 11 21 21 21 10 10 10 0 0 0 13 13 13 8 8 8 0 0 0 14 14 14 -+13 13 13 21 21 21 0 0 0 14 14 14 11 11 11 13 13 13 3 3 3 19 19 19 -+19 19 19 0 0 0 0 0 0 17 17 17 10 10 10 4 4 4 3 3 3 0 0 0 -+16 16 16 0 0 0 16 16 16 0 0 0 19 19 19 0 0 0 8 8 8 3 3 3 -+13 13 13 0 0 0 0 0 0 8 8 8 11 11 11 0 0 0 21 21 21 0 0 0 -+0 0 0 19 19 19 0 0 0 14 14 14 0 0 0 0 0 0 16 16 16 6 6 6 -+6 6 6 6 6 6 8 8 8 8 8 8 8 8 8 8 8 8 10 10 10 10 10 10 -+ -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 4 4 4 6 6 6 6 6 6 4 4 4 0 0 0 0 0 0 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 -+0 0 0 3 3 3 4 4 4 6 6 6 6 6 6 4 4 4 3 3 3 0 0 0 -+6 6 6 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 6 6 6 11 11 11 8 8 8 0 0 0 0 0 0 0 0 0 6 6 6 -+0 0 0 3 3 3 6 6 6 8 8 8 8 8 8 6 6 6 3 3 3 0 0 0 -+0 0 0 3 3 3 6 6 6 8 8 8 8 8 8 6 6 6 3 3 3 0 0 0 -+6 6 6 0 0 0 0 0 0 0 0 0 8 8 8 10 10 10 6 6 6 0 0 0 -+0 0 0 0 0 0 3 3 3 3 3 3 4 4 4 4 4 4 6 6 6 6 6 6 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 6 6 6 -+6 6 6 6 6 6 8 8 8 10 10 10 10 10 10 10 10 10 10 10 10 8 8 8 -+8 8 8 8 8 8 8 8 8 8 8 8 6 6 6 4 4 4 3 3 3 0 0 0 -+8 8 8 4 4 4 0 0 0 0 0 0 0 0 0 3 3 3 6 6 6 6 6 6 -+0 0 0 4 4 4 6 6 6 8 8 8 6 6 6 4 4 4 3 3 3 3 3 3 -+8 8 8 6 6 6 3 3 3 0 0 0 0 0 0 3 3 3 6 6 6 8 8 8 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 4 4 4 6 6 6 10 10 10 11 11 11 11 11 11 10 10 10 6 6 6 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+6 6 6 10 10 10 11 11 11 10 10 10 8 8 8 6 6 6 6 6 6 8 8 8 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+10 10 10 10 10 10 10 10 10 10 10 10 8 8 8 8 8 8 8 8 8 8 8 8 -+10 10 10 10 10 10 11 11 11 11 11 11 13 13 13 16 16 16 17 17 17 19 19 19 -+14 14 14 16 16 16 17 17 17 16 16 16 13 13 13 11 11 11 10 10 10 11 11 11 -+11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 -+11 11 11 11 11 11 13 13 13 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 -+13 13 13 13 13 13 14 14 14 16 16 16 16 16 16 14 14 14 11 11 11 8 8 8 -+8 8 8 10 10 10 11 11 11 14 14 14 17 17 17 17 17 17 16 16 16 14 14 14 -+16 16 16 16 16 16 16 16 16 14 14 14 14 14 14 14 14 14 13 13 13 13 13 13 -+8 8 8 8 8 8 11 11 11 13 13 13 14 14 14 14 14 14 13 13 13 11 11 11 -+11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 10 10 10 10 10 10 8 8 8 -+14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 -+14 14 14 14 14 14 13 13 13 11 11 11 11 11 11 10 10 10 8 8 8 8 8 8 -+13 13 13 13 13 13 13 13 13 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 -+14 14 14 13 13 13 10 10 10 8 8 8 10 10 10 11 11 11 13 13 13 16 16 16 -+13 13 13 11 11 11 11 11 11 11 11 11 10 10 10 10 10 10 8 8 8 8 8 8 -+8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 -+10 10 10 10 10 10 8 8 8 8 8 8 6 6 6 6 6 6 4 4 4 4 4 4 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 -+8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 -+10 10 10 8 8 8 6 6 6 6 6 6 4 4 4 4 4 4 4 4 4 4 4 4 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+6 6 6 6 6 6 6 6 6 4 4 4 4 4 4 6 6 6 6 6 6 6 6 6 -+0 0 0 0 0 0 3 3 3 4 4 4 6 6 6 6 6 6 4 4 4 3 3 3 -+6 6 6 6 6 6 6 6 6 4 4 4 4 4 4 6 6 6 6 6 6 6 6 6 -+4 4 4 19 19 19 129 129 130 166 167 167 155 156 156 180 183 185 200 220 210 155 156 156 -+0 0 0 0 0 0 6 6 6 0 0 0 0 0 0 3 3 3 17 17 17 0 0 0 -+19 19 19 0 0 0 3 3 3 6 6 6 16 16 16 6 6 6 3 3 3 11 11 11 -+0 0 0 6 6 6 11 11 11 0 0 0 0 0 0 13 13 13 17 17 17 0 0 0 -+6 6 6 6 6 6 0 0 0 0 0 0 13 13 13 16 16 16 13 13 13 14 14 14 -+0 0 0 6 6 6 11 11 11 4 4 4 0 0 0 19 19 19 13 13 13 8 8 8 -+8 8 8 16 16 16 11 11 11 0 0 0 3 3 3 8 8 8 13 13 13 17 17 17 -+11 11 11 17 17 17 10 10 10 0 0 0 16 16 16 17 17 17 4 4 4 3 3 3 -+0 0 0 0 0 0 10 10 10 0 0 0 10 10 10 0 0 0 16 16 16 0 0 0 -+0 0 0 16 16 16 0 0 0 4 4 4 3 3 3 6 6 6 0 0 0 3 3 3 -+4 4 4 4 4 4 4 4 4 6 6 6 6 6 6 6 6 6 6 6 6 8 8 8 -+ -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 -+0 0 0 3 3 3 4 4 4 6 6 6 6 6 6 4 4 4 3 3 3 0 0 0 -+6 6 6 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 4 4 4 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 4 4 4 10 10 10 8 8 8 3 3 3 0 0 0 0 0 0 4 4 4 -+0 0 0 3 3 3 4 4 4 6 6 6 6 6 6 4 4 4 3 3 3 0 0 0 -+0 0 0 3 3 3 4 4 4 6 6 6 6 6 6 4 4 4 3 3 3 0 0 0 -+3 3 3 0 0 0 0 0 0 4 4 4 6 6 6 6 6 6 3 3 3 0 0 0 -+0 0 0 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 6 6 6 -+4 4 4 6 6 6 8 8 8 8 8 8 10 10 10 8 8 8 8 8 8 8 8 8 -+8 8 8 8 8 8 6 6 6 6 6 6 4 4 4 3 3 3 3 3 3 3 3 3 -+8 8 8 4 4 4 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 -+0 0 0 3 3 3 6 6 6 6 6 6 4 4 4 0 0 0 3 3 3 4 4 4 -+6 6 6 4 4 4 3 3 3 0 0 0 0 0 0 3 3 3 4 4 4 6 6 6 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 6 6 6 10 10 10 11 11 11 10 10 10 6 6 6 3 3 3 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+4 4 4 6 6 6 8 8 8 8 8 8 6 6 6 3 3 3 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+4 4 4 6 6 6 6 6 6 8 8 8 10 10 10 13 13 13 14 14 14 16 16 16 -+13 13 13 13 13 13 13 13 13 11 11 11 10 10 10 10 10 10 8 8 8 8 8 8 -+8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 -+6 6 6 6 6 6 8 8 8 10 10 10 11 11 11 11 11 11 11 11 11 13 13 13 -+13 13 13 11 11 11 8 8 8 10 10 10 11 11 11 13 13 13 11 11 11 8 8 8 -+6 6 6 4 4 4 6 6 6 10 10 10 14 14 14 16 16 16 14 14 14 11 11 11 -+11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 13 13 13 -+6 6 6 8 8 8 10 10 10 11 11 11 11 11 11 11 11 11 10 10 10 10 10 10 -+8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 6 6 6 6 6 6 -+11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 -+11 11 11 11 11 11 10 10 10 10 10 10 8 8 8 6 6 6 6 6 6 6 6 6 -+8 8 8 6 6 6 6 6 6 6 6 6 6 6 6 8 8 8 10 10 10 10 10 10 -+10 10 10 8 8 8 6 6 6 4 4 4 6 6 6 8 8 8 11 11 11 13 13 13 -+11 11 11 11 11 11 10 10 10 10 10 10 8 8 8 6 6 6 6 6 6 4 4 4 -+8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 -+8 8 8 8 8 8 8 8 8 6 6 6 6 6 6 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+8 8 8 6 6 6 4 4 4 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+6 6 6 6 6 6 4 4 4 3 3 3 3 3 3 4 4 4 6 6 6 6 6 6 -+0 0 0 0 0 0 0 0 0 4 4 4 8 8 8 8 8 8 4 4 4 0 0 0 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+6 6 6 0 0 0 87 87 87 144 145 144 152 153 154 139 139 139 101 101 101 23 23 23 -+0 0 0 8 8 8 6 6 6 19 19 19 17 17 17 0 0 0 3 3 3 6 6 6 -+0 0 0 8 8 8 14 14 14 6 6 6 4 4 4 6 6 6 3 3 3 0 0 0 -+10 10 10 0 0 0 0 0 0 10 10 10 3 3 3 0 0 0 4 4 4 10 10 10 -+0 0 0 3 3 3 10 10 10 10 10 10 3 3 3 0 0 0 0 0 0 0 0 0 -+11 11 11 0 0 0 8 8 8 13 13 13 4 4 4 0 0 0 0 0 0 11 11 11 -+8 8 8 3 3 3 0 0 0 0 0 0 11 11 11 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 19 19 19 23 23 23 0 0 0 0 0 0 13 13 13 0 0 0 -+10 10 10 0 0 0 6 6 6 0 0 0 11 11 11 0 0 0 0 0 0 6 6 6 -+14 14 14 0 0 0 3 3 3 20 20 20 0 0 0 6 6 6 14 14 14 0 0 0 -+3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 3 3 3 6 6 6 6 6 6 3 3 3 0 0 0 0 0 0 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 -+0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+4 4 4 4 4 4 6 6 6 8 8 8 8 8 8 8 8 8 8 8 8 6 6 6 -+8 8 8 6 6 6 4 4 4 3 3 3 0 0 0 0 0 0 3 3 3 4 4 4 -+6 6 6 3 3 3 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 0 0 0 -+3 3 3 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 3 3 3 6 6 6 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 6 6 6 10 10 10 10 10 10 6 6 6 4 4 4 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 4 4 4 6 6 6 6 6 6 3 3 3 0 0 0 0 0 0 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 -+0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 8 8 8 10 10 10 11 11 11 -+11 11 11 8 8 8 6 6 6 3 3 3 3 3 3 4 4 4 4 4 4 6 6 6 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 6 6 6 8 8 8 8 8 8 -+11 11 11 8 8 8 3 3 3 0 0 0 4 4 4 6 6 6 8 8 8 8 8 8 -+4 4 4 3 3 3 3 3 3 6 6 6 10 10 10 11 11 11 10 10 10 8 8 8 -+6 6 6 6 6 6 6 6 6 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 -+6 6 6 6 6 6 6 6 6 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 -+3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 6 6 6 6 6 6 8 8 8 -+8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 -+8 8 8 8 8 8 8 8 8 6 6 6 6 6 6 4 4 4 4 4 4 4 4 4 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 6 6 6 -+4 4 4 4 4 4 4 4 4 4 4 4 6 6 6 6 6 6 8 8 8 8 8 8 -+10 10 10 8 8 8 8 8 8 6 6 6 4 4 4 4 4 4 3 3 3 3 3 3 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+6 6 6 6 6 6 6 6 6 6 6 6 4 4 4 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+6 6 6 6 6 6 4 4 4 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+6 6 6 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 6 6 6 -+0 0 0 0 0 0 0 0 0 4 4 4 8 8 8 6 6 6 3 3 3 0 0 0 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+10 10 10 0 0 0 0 0 0 0 0 0 4 4 4 0 0 0 10 10 10 10 10 10 -+0 0 0 4 4 4 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 14 14 14 -+13 13 13 4 4 4 0 0 0 10 10 10 10 10 10 3 3 3 0 0 0 6 6 6 -+3 3 3 10 10 10 8 8 8 4 4 4 4 4 4 6 6 6 4 4 4 6 6 6 -+10 10 10 0 0 0 0 0 0 0 0 0 3 3 3 8 8 8 10 10 10 3 3 3 -+0 0 0 13 13 13 13 13 13 0 0 0 0 0 0 0 0 0 6 6 6 0 0 0 -+0 0 0 8 8 8 13 13 13 0 0 0 0 0 0 4 4 4 14 14 14 10 10 10 -+10 10 10 0 0 0 0 0 0 3 3 3 6 6 6 17 17 17 11 11 11 3 3 3 -+0 0 0 0 0 0 11 11 11 0 0 0 4 4 4 8 8 8 3 3 3 0 0 0 -+8 8 8 0 0 0 0 0 0 11 11 11 3 3 3 8 8 8 0 0 0 6 6 6 -+0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 -+0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 -+0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 -+4 4 4 0 0 0 0 0 0 0 0 0 4 4 4 6 6 6 3 3 3 0 0 0 -+4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 -+4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 -+0 0 0 4 4 4 8 8 8 6 6 6 0 0 0 0 0 0 0 0 0 4 4 4 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 -+3 3 3 4 4 4 6 6 6 6 6 6 8 8 8 6 6 6 6 6 6 6 6 6 -+8 8 8 6 6 6 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 6 6 6 -+0 0 0 0 0 0 3 3 3 3 3 3 4 4 4 4 4 4 3 3 3 0 0 0 -+3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 -+0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 6 6 6 8 8 8 6 6 6 4 4 4 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 6 6 6 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 6 6 6 8 8 8 -+8 8 8 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 -+10 10 10 6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 -+3 3 3 3 3 3 3 3 3 3 3 3 6 6 6 6 6 6 6 6 6 6 6 6 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 6 6 6 8 8 8 -+6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -+6 6 6 6 6 6 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 -+4 4 4 3 3 3 3 3 3 0 0 0 3 3 3 4 4 4 6 6 6 6 6 6 -+0 0 0 3 3 3 4 4 4 4 4 4 6 6 6 4 4 4 4 4 4 3 3 3 -+6 6 6 6 6 6 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 0 0 0 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 -+0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 4 4 4 3 3 3 0 0 0 -+3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 -+0 0 0 17 17 17 13 13 13 10 10 10 13 13 13 0 0 0 4 4 4 4 4 4 -+4 4 4 0 0 0 8 8 8 3 3 3 3 3 3 8 8 8 0 0 0 3 3 3 -+3 3 3 4 4 4 0 0 0 8 8 8 3 3 3 0 0 0 0 0 0 4 4 4 -+4 4 4 0 0 0 0 0 0 0 0 0 14 14 14 6 6 6 0 0 0 0 0 0 -+0 0 0 3 3 3 8 8 8 8 8 8 0 0 0 0 0 0 0 0 0 3 3 3 -+4 4 4 10 10 10 0 0 0 3 3 3 16 16 16 0 0 0 0 0 0 6 6 6 -+10 10 10 0 0 0 0 0 0 11 11 11 6 6 6 0 0 0 0 0 0 0 0 0 -+0 0 0 17 17 17 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 -+13 13 13 3 3 3 4 4 4 4 4 4 8 8 8 0 0 0 0 0 0 8 8 8 -+0 0 0 14 14 14 10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 -+0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 -+3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 3 3 3 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 3 3 3 3 3 3 -+4 4 4 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 3 3 3 3 3 3 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 -+4 4 4 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 3 3 3 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 4 4 4 6 6 6 6 6 6 6 6 6 6 6 6 4 4 4 -+4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+0 0 0 0 0 0 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 6 6 6 6 6 6 3 3 3 0 0 0 0 0 0 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 6 6 6 -+6 6 6 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 4 4 4 -+6 6 6 6 6 6 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 -+3 3 3 3 3 3 4 4 4 3 3 3 3 3 3 0 0 0 3 3 3 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 6 6 6 -+3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 -+0 0 0 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 -+0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 -+11 11 11 8 8 8 0 0 0 0 0 0 13 13 13 10 10 10 6 6 6 0 0 0 -+3 3 3 0 0 0 0 0 0 6 6 6 3 3 3 0 0 0 6 6 6 3 3 3 -+0 0 0 16 16 16 10 10 10 17 17 17 4 4 4 6 6 6 10 10 10 4 4 4 -+0 0 0 10 10 10 10 10 10 3 3 3 4 4 4 6 6 6 4 4 4 8 8 8 -+4 4 4 6 6 6 6 6 6 6 6 6 11 11 11 10 10 10 8 8 8 10 10 10 -+0 0 0 8 8 8 0 0 0 11 11 11 10 10 10 4 4 4 0 0 0 10 10 10 -+4 4 4 0 0 0 4 4 4 6 6 6 0 0 0 4 4 4 10 10 10 3 3 3 -+4 4 4 6 6 6 8 8 8 8 8 8 11 11 11 6 6 6 17 17 17 0 0 0 -+0 0 0 3 3 3 3 3 3 4 4 4 3 3 3 4 4 4 11 11 11 6 6 6 -+16 16 16 0 0 0 0 0 0 4 4 4 6 6 6 3 3 3 8 8 8 8 8 8 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 -+0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 -+0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 6 6 6 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 -+10 10 10 4 4 4 0 0 0 0 0 0 3 3 3 4 4 4 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 -+3 3 3 3 3 3 4 4 4 6 6 6 6 6 6 6 6 6 4 4 4 4 4 4 -+0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 -+0 0 0 3 3 3 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 6 6 6 6 6 6 -+4 4 4 3 3 3 0 0 0 3 3 3 4 4 4 6 6 6 3 3 3 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+6 6 6 4 4 4 3 3 3 3 3 3 0 0 0 3 3 3 4 4 4 4 4 4 -+4 4 4 8 8 8 10 10 10 8 8 8 3 3 3 0 0 0 0 0 0 0 0 0 -+3 3 3 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 -+6 6 6 6 6 6 6 6 6 6 6 6 4 4 4 4 4 4 4 4 4 4 4 4 -+4 4 4 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 -+4 4 4 4 4 4 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 3 3 3 3 3 3 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 -+0 0 0 3 3 3 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 4 4 4 -+0 0 0 0 0 0 3 3 3 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 -+0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 6 6 6 0 0 0 4 4 4 -+0 0 0 17 17 17 0 0 0 0 0 0 8 8 8 3 3 3 8 8 8 0 0 0 -+3 3 3 11 11 11 0 0 0 8 8 8 0 0 0 4 4 4 4 4 4 0 0 0 -+14 14 14 0 0 0 0 0 0 6 6 6 6 6 6 0 0 0 0 0 0 0 0 0 -+0 0 0 8 8 8 3 3 3 0 0 0 4 4 4 0 0 0 0 0 0 3 3 3 -+0 0 0 4 4 4 6 6 6 11 11 11 0 0 0 11 11 11 0 0 0 0 0 0 -+6 6 6 3 3 3 0 0 0 0 0 0 6 6 6 4 4 4 0 0 0 4 4 4 -+4 4 4 0 0 0 6 6 6 4 4 4 10 10 10 0 0 0 8 8 8 3 3 3 -+6 6 6 3 3 3 0 0 0 10 10 10 3 3 3 0 0 0 6 6 6 0 0 0 -+0 0 0 10 10 10 6 6 6 3 3 3 0 0 0 0 0 0 10 10 10 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 4 4 4 -+0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 -+3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 -+3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+3 3 3 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 -+0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 -+4 4 4 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 -+3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 4 4 4 -+3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 -+0 0 0 4 4 4 6 6 6 3 3 3 3 3 3 6 6 6 4 4 4 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 4 4 4 4 4 4 3 3 3 0 0 0 3 3 3 4 4 4 -+3 3 3 4 4 4 6 6 6 4 4 4 3 3 3 0 0 0 0 0 0 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 -+3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 4 4 4 3 3 3 0 0 0 0 0 0 0 0 0 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -+4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 -+ diff --git a/target/linux/pxa/patches-2.6.21/042-gumstix-pxa270-mmc.patch b/target/linux/pxa/patches-2.6.21/042-gumstix-pxa270-mmc.patch deleted file mode 100644 index 02fddd64b..000000000 --- a/target/linux/pxa/patches-2.6.21/042-gumstix-pxa270-mmc.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- a/arch/arm/mach-pxa/gumstix.c -+++ b/arch/arm/mach-pxa/gumstix.c -@@ -33,8 +33,9 @@ - - static struct pxamci_platform_data gumstix_mci_platform_data; - --static int gumstix_mci_init(struct device *dev, irqreturn_t (*gumstix_detect_int)(int, void *, struct pt_regs *), void *data) -+static int gumstix_mci_init(struct device *dev, irq_handler_t gumstix_detect_int, void *data) - { -+#ifndef CONFIG_ARCH_GUMSTIX_VERDEX - int err; - - pxa_gpio_mode(GPIO6_MMCCLK_MD); -@@ -55,6 +56,17 @@ static int gumstix_mci_init(struct devic - } - - err = set_irq_type(GUMSTIX_IRQ_GPIO_nSD_DETECT, IRQT_BOTHEDGE); -+#else -+ // Setup GPIOs for MMC on the 120-pin connector -+ // There is no card detect on a uSD connector so no interrupt to register -+ // There is no WP detect GPIO line either -+ pxa_gpio_mode(GPIO92_MMCDAT0_MD); -+ pxa_gpio_mode(GPIO112_MMCCMD_MD); -+ pxa_gpio_mode(GPIO110_MMCDAT2_MD); -+ pxa_gpio_mode(GPIO111_MMCDAT3_MD); -+ pxa_gpio_mode(GPIO109_MMCDAT1_MD); -+ pxa_gpio_mode(GPIO32_MMCCLK_MD); -+#endif - - return 0; - } diff --git a/target/linux/pxa/patches-2.6.21/043-pxafb-18bpp-mode.patch b/target/linux/pxa/patches-2.6.21/043-pxafb-18bpp-mode.patch deleted file mode 100644 index c41310a61..000000000 --- a/target/linux/pxa/patches-2.6.21/043-pxafb-18bpp-mode.patch +++ /dev/null @@ -1,415 +0,0 @@ ---- a/drivers/video/pxafb.c -+++ b/drivers/video/pxafb.c -@@ -191,6 +191,10 @@ static int pxafb_bpp_to_lccr3(struct fb_ - case 4: ret = LCCR3_4BPP; break; - case 8: ret = LCCR3_8BPP; break; - case 16: ret = LCCR3_16BPP; break; -+ case 18: ret = (var->nonstd == 24 ? LCCR3_18BPP_PACKED : LCCR3_18BPP); break; -+ case 19: ret = (var->nonstd == 24 ? LCCR3_19BPP_PACKED : LCCR3_19BPP); break; -+ case 24: ret = LCCR3_24BPP; break; -+ case 25: ret = LCCR3_25BPP; break; - } - return ret; - } -@@ -204,11 +208,12 @@ static int pxafb_bpp_to_lccr3(struct fb_ - */ - static unsigned int pxafb_display_dma_period(struct fb_var_screeninfo *var) - { -- /* -- * Period = pixclock * bits_per_byte * bytes_per_transfer -- * / memory_bits_per_pixel; -- */ -- return var->pixclock * 8 * 16 / var->bits_per_pixel; -+ /* -+ * Period = pixclock * bits_per_byte * bytes_per_transfer -+ * / memory_bits_per_pixel; -+ */ -+ struct pxafb_mach_info *inf = fbi->dev->platform_data; -+ return var->pixclock * 8 * 16 / (var->nonstd ? var->nonstd : var->bits_per_pixel); - } - - extern unsigned int get_clk_frequency_khz(int info); -@@ -307,6 +312,26 @@ static int pxafb_check_var(struct fb_var - var->green.offset = 5; var->green.length = 6; - var->blue.offset = 0; var->blue.length = 5; - var->transp.offset = var->transp.length = 0; -+ } else if (var->bits_per_pixel == 18) { -+ var->transp.offset = var->transp.length = 0; -+ var->red.offset = 12; var->red.length=6; -+ var->green.offset = 6; var->green.length=6; -+ var->blue.offset = 0; var->blue.length=6; -+ } else if (var->bits_per_pixel == 19) { -+ var->transp.offset = 18; var->transp.length = 1; -+ var->red.offset = 12; var->red.length=6; -+ var->green.offset = 6; var->green.length=6; -+ var->blue.offset = 0; var->blue.length=6; -+ } else if (var->bits_per_pixel == 24) { -+ var->transp.offset = var->transp.length = 0; -+ var->red.offset = 16; var->red.length=8; -+ var->green.offset = 8; var->green.length=8; -+ var->blue.offset = 0; var->blue.length=8; -+ } else if (var->bits_per_pixel == 25) { -+ var->transp.offset = 18; var->transp.length = 1; -+ var->red.offset = 16; var->red.length=8; -+ var->green.offset = 8; var->green.length=8; -+ var->blue.offset = 0; var->blue.length=8; - } else { - var->red.offset = var->green.offset = var->blue.offset = var->transp.offset = 0; - var->red.length = 8; -@@ -342,7 +367,7 @@ static int pxafb_set_par(struct fb_info - - pr_debug("pxafb: set_par\n"); - -- if (var->bits_per_pixel == 16) -+ if (var->bits_per_pixel >= 16) - fbi->fb.fix.visual = FB_VISUAL_TRUECOLOR; - else if (!fbi->cmap_static) - fbi->fb.fix.visual = FB_VISUAL_PSEUDOCOLOR; -@@ -355,9 +380,10 @@ static int pxafb_set_par(struct fb_info - fbi->fb.fix.visual = FB_VISUAL_STATIC_PSEUDOCOLOR; - } - -- fbi->fb.fix.line_length = var->xres_virtual * -- var->bits_per_pixel / 8; -- if (var->bits_per_pixel == 16) -+ fbi->fb.fix.line_length = var->xres_virtual * -+ (var->nonstd ? var->nonstd : var->bits_per_pixel) / 8; -+ -+ if (var->bits_per_pixel >= 16) - fbi->palette_size = 0; - else - fbi->palette_size = var->bits_per_pixel == 1 ? 4 : 1 << var->bits_per_pixel; -@@ -374,7 +400,7 @@ static int pxafb_set_par(struct fb_info - */ - pxafb_set_truecolor(fbi->fb.fix.visual == FB_VISUAL_TRUECOLOR); - -- if (fbi->fb.var.bits_per_pixel == 16) -+ if (fbi->fb.var.bits_per_pixel >= 16) - fb_dealloc_cmap(&fbi->fb.cmap); - else - fb_alloc_cmap(&fbi->fb.cmap, 1<fb.var.bits_per_pixel, 0); -@@ -584,6 +610,14 @@ static int pxafb_activate_var(struct fb_ - case 8: - case 16: - break; -+ case 18: -+ case 19: -+ case 24: -+ case 25: -+ if(var->nonstd) break; -+ printk(KERN_ERR "%s: must specify nonstd when bit depth==%d\n", -+ fbi->fb.fix.id, var->bits_per_pixel); -+ break; - default: - printk(KERN_ERR "%s: invalid bit depth %d\n", - fbi->fb.fix.id, var->bits_per_pixel); -@@ -679,7 +713,7 @@ static int pxafb_activate_var(struct fb_ - fbi->dmadesc_palette_cpu->fidr = 0; - fbi->dmadesc_palette_cpu->ldcmd = (fbi->palette_size * 2) | LDCMD_PAL; - -- if (var->bits_per_pixel == 16) { -+ if (var->bits_per_pixel >= 16) { - /* palette shouldn't be loaded in true-color mode */ - fbi->dmadesc_fbhigh_cpu->fdadr = fbi->dmadesc_fbhigh_dma; - fbi->fdadr0 = fbi->dmadesc_fbhigh_dma; /* no pal just fbhigh */ -@@ -785,8 +819,19 @@ static void pxafb_setup_gpio(struct pxaf - return; - } - -- for (gpio = 58; ldd_bits; gpio++, ldd_bits--) -+ for (gpio = 58; min(ldd_bits,16); gpio++, ldd_bits--) - pxa_gpio_mode(gpio | GPIO_ALT_FN_2_OUT); -+ -+ switch(fbi->fb.var.bits_per_pixel) -+ { -+ case 25: -+ case 24: -+ case 19: -+ case 18: -+ pxa_gpio_mode(GPIO86_LDD_16_MD); -+ pxa_gpio_mode(GPIO87_LDD_17_MD); -+ default: break; -+ } - pxa_gpio_mode(GPIO74_LCD_FCLK_MD); - pxa_gpio_mode(GPIO75_LCD_LCLK_MD); - pxa_gpio_mode(GPIO76_LCD_PCLK_MD); -@@ -1135,7 +1180,7 @@ static struct pxafb_info * __init pxafb_ - fbi->fb.fix.ywrapstep = 0; - fbi->fb.fix.accel = FB_ACCEL_NONE; - -- fbi->fb.var.nonstd = 0; -+ fbi->fb.var.nonstd = mode->nonstd; - fbi->fb.var.activate = FB_ACTIVATE_NOW; - fbi->fb.var.height = -1; - fbi->fb.var.width = -1; -@@ -1161,7 +1206,7 @@ static struct pxafb_info * __init pxafb_ - fbi->task_state = (u_char)-1; - - for (i = 0; i < inf->num_modes; i++) { -- smemlen = mode[i].xres * mode[i].yres * mode[i].bpp / 8; -+ smemlen = mode[i].xres * mode[i].yres * (mode[i].nonstd ? mode[i].nonstd : mode[i].bpp) / 8; - if (smemlen > fbi->fb.fix.smem_len) - fbi->fb.fix.smem_len = smemlen; - } -@@ -1189,12 +1234,19 @@ static int __init pxafb_parse_options(st - if (!strncmp(this_opt, "mode:", 5)) { - const char *name = this_opt+5; - unsigned int namelen = strlen(name); -- int res_specified = 0, bpp_specified = 0; -- unsigned int xres = 0, yres = 0, bpp = 0; -+ int res_specified = 0, bpp_specified = 0, nonstd_specified = 0; -+ unsigned int xres = 0, yres = 0, bpp = 0, nonstd = 0; - int yres_specified = 0; - int i; - for (i = namelen-1; i >= 0; i--) { - switch (name[i]) { -+ case '/': -+ if (!nonstd_specified) { -+ nonstd = simple_strtoul(&name[i+1], NULL, 0); -+ nonstd_specified = 1; -+ } else -+ goto done; -+ break; - case '-': - namelen = i; - if (!bpp_specified && !yres_specified) { -@@ -1227,12 +1279,29 @@ static int __init pxafb_parse_options(st - } - if (bpp_specified) - switch (bpp) { -+ case 18: -+ case 19: -+ case 24: -+ case 25: -+ if(nonstd_specified && (((bpp == 18 || bpp == 19) && nonstd == 24) || nonstd == 32)) -+ { -+ inf->modes[0].nonstd = nonstd; -+ dev_info(dev, "overriding nonstd pixel packing: %d\n",nonstd); -+ } else { -+ dev_err(dev, "Depth %d requires nonstd to be specified\n",bpp); -+ break; -+ } - case 1: - case 2: - case 4: - case 8: - case 16: - inf->modes[0].bpp = bpp; -+ if(nonstd_specified) { -+ dev_err(dev, "Depth %d requires nonstd to *not* be specified\n",bpp); -+ } else { -+ inf->modes[0].nonstd = 0; -+ } - dev_info(dev, "overriding bit depth: %d\n", bpp); - break; - default: ---- a/include/asm-arm/arch-pxa/pxa-regs.h -+++ b/include/asm-arm/arch-pxa/pxa-regs.h -@@ -1323,6 +1323,8 @@ - #define GPIO83_NSTXD 83 /* NSSP transmit */ - #define GPIO84_NSRXD 84 /* NSSP receive */ - #define GPIO85_nPCE_1 85 /* Card Enable for Card Space (PXA27x) */ -+#define GPIO86_LDD_16 86 /* LCD data pin 16 */ -+#define GPIO87_LDD_17 87 /* LCD data pin 17 */ - #define GPIO92_MMCDAT0 92 /* MMC DAT0 (PXA27x) */ - #define GPIO102_nPCE_1 102 /* PCMCIA (PXA27x) */ - #define GPIO105_nPCE_2 105 /* Card Enable for Card Space (PXA27x) */ -@@ -1468,6 +1470,8 @@ - #define GPIO84_NSSP_TX (84 | GPIO_ALT_FN_1_OUT) - #define GPIO84_NSSP_RX (84 | GPIO_ALT_FN_2_IN) - #define GPIO85_nPCE_1_MD (85 | GPIO_ALT_FN_1_OUT) -+#define GPIO86_LDD_16_MD (86 | GPIO_ALT_FN_2_OUT) -+#define GPIO87_LDD_17_MD (87 | GPIO_ALT_FN_2_OUT) - #define GPIO92_MMCDAT0_MD (92 | GPIO_ALT_FN_1_OUT) - #define GPIO102_nPCE_1_MD (102 | GPIO_ALT_FN_1_OUT) - #define GPIO104_pSKTSEL_MD (104 | GPIO_ALT_FN_1_OUT) -@@ -1878,6 +1882,12 @@ - #define LCCR3_4BPP (2 << 24) - #define LCCR3_8BPP (3 << 24) - #define LCCR3_16BPP (4 << 24) -+#define LCCR3_18BPP (5 << 24) -+#define LCCR3_18BPP_PACKED (6 << 24) -+#define LCCR3_19BPP (7 << 24) -+#define LCCR3_19BPP_PACKED (1 << 29) -+#define LCCR3_24BPP ((1 << 29) | (1 << 24)) -+#define LCCR3_25BPP ((1 << 29) | (2 << 24)) - - #define FDADR0 __REG(0x44000200) /* DMA Channel 0 Frame Descriptor Address Register */ - #define FSADR0 __REG(0x44000204) /* DMA Channel 0 Frame Source Address Register */ ---- a/include/asm-arm/arch-pxa/pxafb.h -+++ b/include/asm-arm/arch-pxa/pxafb.h -@@ -25,6 +25,7 @@ struct pxafb_mode_info { - u_short xres; - u_short yres; - -+ /* bpp is the path-to-screen bits per pixel, not the in-memory storage required */ - u_char bpp; - u_char hsync_len; - u_char left_margin; -@@ -36,7 +37,9 @@ struct pxafb_mode_info { - u_char sync; - - u_int cmap_greyscale:1, -- unused:31; -+ nonstd:8, /* nonstd represents the in-memory bits per pixel -+ ie 24 or 32 for 18/19bpp mode, or 32 for 24/25bpp mode */ -+ unused:23; - }; - - struct pxafb_mach_info { ---- a/arch/arm/mach-pxa/gumstix.c -+++ b/arch/arm/mach-pxa/gumstix.c -@@ -146,7 +146,8 @@ static struct pxafb_mode_info gumstix_fb - .pixclock = 110000, - .xres = 480, - .yres = 272, -- .bpp = 16, -+ .bpp = 18, -+ .nonstd = 24, - .hsync_len = 41, - .left_margin = 2, - .right_margin = 2, -@@ -174,7 +175,8 @@ static struct pxafb_mode_info gumstix_fb - .vsync_len = 10, // VLW from datasheet: 10 typ - .upper_margin = 2, // VBP - VLW from datasheet: 12 - 10 = 2 - .lower_margin = 4, // VFP from datasheet: 4 typ -- .bpp = 16, -+ .bpp = 18, -+ .nonstd = 24, - .sync = 0, // Hsync and Vsync both active low - }; - ---- a/drivers/video/cfbfillrect.c -+++ b/drivers/video/cfbfillrect.c -@@ -62,7 +62,10 @@ pixel_to_pat( u32 bpp, u32 pixel) - return 0x0001001001001001ul*pixel; - case 16: - return 0x0001000100010001ul*pixel; -+ case 18: -+ case 19: - case 24: -+ case 25: - return 0x0000000001000001ul*pixel; - case 32: - return 0x0000000100000001ul*pixel; -@@ -87,7 +90,10 @@ pixel_to_pat( u32 bpp, u32 pixel) - return 0x00001001ul*pixel; - case 16: - return 0x00010001ul*pixel; -+ case 18: -+ case 19: - case 24: -+ case 25: - return 0x00000001ul*pixel; - case 32: - return 0x00000001ul*pixel; -@@ -346,7 +352,7 @@ void cfb_fillrect(struct fb_info *p, con - unsigned long pat, fg; - unsigned long width = rect->width, height = rect->height; - int bits = BITS_PER_LONG, bytes = bits >> 3; -- u32 bpp = p->var.bits_per_pixel; -+ u32 bpp = (p->var.nonstd ? p->var.nonstd : p->var.bits_per_pixel); - unsigned long __iomem *dst; - int dst_idx, left; - ---- a/drivers/video/cfbimgblt.c -+++ b/drivers/video/cfbimgblt.c -@@ -83,7 +83,7 @@ static inline void color_imageblit(const - /* Draw the penguin */ - u32 __iomem *dst, *dst2; - u32 color = 0, val, shift; -- int i, n, bpp = p->var.bits_per_pixel; -+ int i, n, bpp = (p->var.nonstd ? p->var.nonstd : p->var.bits_per_pixel); - u32 null_bits = 32 - bpp; - u32 *palette = (u32 *) p->pseudo_palette; - const u8 *src = image->data; -@@ -140,7 +140,7 @@ static inline void slow_imageblit(const - u32 start_index, - u32 pitch_index) - { -- u32 shift, color = 0, bpp = p->var.bits_per_pixel; -+ u32 shift, color = 0, bpp = (p->var.nonstd ? p->var.nonstd : p->var.bits_per_pixel); - u32 __iomem *dst, *dst2; - u32 val, pitch = p->fix.line_length; - u32 null_bits = 32 - bpp; -@@ -213,7 +213,7 @@ static inline void fast_imageblit(const - u8 __iomem *dst1, u32 fgcolor, - u32 bgcolor) - { -- u32 fgx = fgcolor, bgx = bgcolor, bpp = p->var.bits_per_pixel; -+ u32 fgx = fgcolor, bgx = bgcolor, bpp = (p->var.nonstd ? p->var.nonstd : p->var.bits_per_pixel); - u32 ppw = 32/bpp, spitch = (image->width + 7)/8; - u32 bit_mask, end_mask, eorx, shift; - const char *s = image->data, *src; -@@ -262,7 +262,7 @@ static inline void fast_imageblit(const - void cfb_imageblit(struct fb_info *p, const struct fb_image *image) - { - u32 fgcolor, bgcolor, start_index, bitstart, pitch_index = 0; -- u32 bpl = sizeof(u32), bpp = p->var.bits_per_pixel; -+ u32 bpl = sizeof(u32), bpp = (p->var.nonstd ? p->var.nonstd : p->var.bits_per_pixel); - u32 width = image->width; - u32 dx = image->dx, dy = image->dy; - u8 __iomem *dst1; ---- a/drivers/video/cfbcopyarea.c -+++ b/drivers/video/cfbcopyarea.c -@@ -365,8 +365,8 @@ void cfb_copyarea(struct fb_info *p, con - dst = src = (unsigned long __iomem *)((unsigned long)p->screen_base & ~(bytes-1)); - dst_idx = src_idx = 8*((unsigned long)p->screen_base & (bytes-1)); - // add offset of source and target area -- dst_idx += dy*bits_per_line + dx*p->var.bits_per_pixel; -- src_idx += sy*bits_per_line + sx*p->var.bits_per_pixel; -+ dst_idx += dy*bits_per_line + dx*(p->var.nonstd ? p->var.nonstd : p->var.bits_per_pixel); -+ src_idx += sy*bits_per_line + sx*(p->var.nonstd ? p->var.nonstd : p->var.bits_per_pixel); - - if (p->fbops->fb_sync) - p->fbops->fb_sync(p); -@@ -380,7 +380,7 @@ void cfb_copyarea(struct fb_info *p, con - src += src_idx >> (ffs(bits) - 1); - src_idx &= (bytes - 1); - bitcpy_rev(dst, dst_idx, src, src_idx, bits, -- width*p->var.bits_per_pixel); -+ width*(p->var.nonstd ? p->var.nonstd : p->var.bits_per_pixel)); - } - } else { - while (height--) { -@@ -389,7 +389,7 @@ void cfb_copyarea(struct fb_info *p, con - src += src_idx >> (ffs(bits) - 1); - src_idx &= (bytes - 1); - bitcpy(dst, dst_idx, src, src_idx, bits, -- width*p->var.bits_per_pixel); -+ width*(p->var.nonstd ? p->var.nonstd : p->var.bits_per_pixel)); - dst_idx += bits_per_line; - src_idx += bits_per_line; - } ---- a/drivers/video/console/fbcon.c -+++ b/drivers/video/console/fbcon.c -@@ -983,9 +983,10 @@ static const char *fbcon_startup(void) - - DPRINTK("mode: %s\n", info->fix.id); - DPRINTK("visual: %d\n", info->fix.visual); -- DPRINTK("res: %dx%d-%d\n", info->var.xres, -+ DPRINTK("res: %dx%d-%d(%d)\n", info->var.xres, - info->var.yres, -- info->var.bits_per_pixel); -+ info->var.bits_per_pixel, -+ info->var.nonstd ? info->var.nonstd : info->var.bits_per_pixel); - - #ifdef CONFIG_ATARI - if (MACH_IS_ATARI) { ---- a/Documentation/fb/pxafb.txt -+++ b/Documentation/fb/pxafb.txt -@@ -9,11 +9,13 @@ For example: - or on the kernel command line - video=pxafb:mode:640x480-8,passive - --mode:XRESxYRES[-BPP] -+mode:XRESxYRES[-BPP[/PACKING]] - XRES == LCCR1_PPL + 1 - YRES == LLCR2_LPP + 1 - The resolution of the display in pixels - BPP == The bit depth. Valid values are 1, 2, 4, 8 and 16. -+ PACKING == The in-memory bits per pixel. Valid values are 24, 32 when -+ BPP == 18,19,24,25 - - pixclock:PIXCLOCK - Pixel clock in picoseconds diff --git a/target/linux/pxa/patches-2.6.21/044-smc911x-fixup.patch b/target/linux/pxa/patches-2.6.21/044-smc911x-fixup.patch deleted file mode 100644 index 7ddfd5fda..000000000 --- a/target/linux/pxa/patches-2.6.21/044-smc911x-fixup.patch +++ /dev/null @@ -1,371 +0,0 @@ ---- a/drivers/net/smc911x.c -+++ b/drivers/net/smc911x.c -@@ -76,6 +76,7 @@ static const char version[] = - #include - #include - -+#include - #include - #include - -@@ -303,14 +304,14 @@ static void smc911x_reset(struct net_dev - SMC_SET_AFC_CFG(lp->afc_cfg); - - -- /* Set to LED outputs */ -- SMC_SET_GPIO_CFG(0x70070000); -+ /* Set to LED outputs and configure EEPROM pins as GP outputs */ -+ SMC_SET_GPIO_CFG(GPIO_CFG_LED1_EN_ | GPIO_CFG_LED2_EN_ | 1 << 20); - - /* -- * Deassert IRQ for 1*10us for edge type interrupts -+ * Deassert IRQ for 22*10us for edge type interrupts - * and drive IRQ pin push-pull - */ -- SMC_SET_IRQ_CFG( (1 << 24) | INT_CFG_IRQ_EN_ | INT_CFG_IRQ_TYPE_ ); -+ SMC_SET_IRQ_CFG( (22 << 24) | INT_CFG_IRQ_EN_ | INT_CFG_IRQ_TYPE_ ); - - /* clear anything saved */ - if (lp->pending_tx_skb != NULL) { -@@ -413,7 +414,7 @@ static inline void smc911x_drop_pkt(stru - if (fifo_count <= 4) { - /* Manually dump the packet data */ - while (fifo_count--) -- SMC_GET_RX_FIFO(); -+ (void)SMC_GET_RX_FIFO(); - } else { - /* Fast forward through the bad packet */ - SMC_SET_RX_DP_CTRL(RX_DP_CTRL_FFWD_BUSY_); -@@ -900,6 +901,7 @@ static void smc911x_phy_powerdown(struct - unsigned long ioaddr = dev->base_addr; - unsigned int bmcr; - -+ DBG(SMC_DEBUG_FUNC, "%s: --> %s\n", dev->name, __FUNCTION__); - /* Enter Link Disable state */ - SMC_GET_PHY_BMCR(phy, bmcr); - bmcr |= BMCR_PDOWN; -@@ -925,6 +927,7 @@ static void smc911x_phy_check_media(stru - - if (mii_check_media(&lp->mii, netif_msg_link(lp), init)) { - /* duplex state has changed */ -+ DBG(SMC_DEBUG_MISC, "%s: duplex state has changed\n", dev->name); - SMC_GET_PHY_BMCR(phyaddr, bmcr); - SMC_GET_MAC_CR(cr); - if (lp->mii.full_duplex) { -@@ -960,6 +963,7 @@ static void smc911x_phy_configure(struct - int my_phy_caps; /* My PHY capabilities */ - int my_ad_caps; /* My Advertised capabilities */ - int status; -+ int bmcr; - unsigned long flags; - - DBG(SMC_DEBUG_FUNC, "%s: --> %s()\n", dev->name, __FUNCTION__); -@@ -1033,9 +1037,12 @@ static void smc911x_phy_configure(struct - - DBG(SMC_DEBUG_MISC, "%s: phy caps=0x%04x\n", dev->name, my_phy_caps); - DBG(SMC_DEBUG_MISC, "%s: phy advertised caps=0x%04x\n", dev->name, my_ad_caps); -+ DBG(SMC_DEBUG_MISC, "%s: phy advertised readback caps=0x%04x\n", dev->name, status); - - /* Restart auto-negotiation process in order to advertise my caps */ -- SMC_SET_PHY_BMCR(phyaddr, BMCR_ANENABLE | BMCR_ANRESTART); -+ SMC_GET_PHY_BMCR(phyaddr, bmcr); -+ bmcr |= BMCR_ANENABLE | BMCR_ANRESTART; -+ SMC_SET_PHY_BMCR(phyaddr, bmcr); - - smc911x_phy_check_media(dev, 1); - -@@ -1888,6 +1895,39 @@ static int __init smc911x_findirq(unsign - return probe_irq_off(cookie); - } - -+static inline unsigned int is_gumstix_oui(u8 *addr) -+{ -+ return (addr[0] == 0x00 && addr[1] == 0x15 && addr[2] == 0xC9); -+} -+ -+/** -+ * gen_serial_ether_addr - Generate software assigned Ethernet address -+ * based on the system_serial number -+ * @addr: Pointer to a six-byte array containing the Ethernet address -+ * -+ * Generate an Ethernet address (MAC) that is not multicast -+ * and has the local assigned bit set, keyed on the system_serial -+ */ -+static inline void gen_serial_ether_addr(u8 *addr) -+{ -+ static u8 ether_serial_digit = 0; -+ addr [0] = system_serial_high >> 8; -+ addr [1] = system_serial_high; -+ addr [2] = system_serial_low >> 24; -+ addr [3] = system_serial_low >> 16; -+ addr [4] = system_serial_low >> 8; -+ addr [5] = (system_serial_low & 0xc0) | /* top bits are from system serial */ -+ (1 << 4) | /* 2 bits identify interface type 1=ether, 2=usb, 3&4 undef */ -+ ((ether_serial_digit++) & 0x0f); /* 15 possible interfaces of each type */ -+ -+ if(!is_gumstix_oui(addr)) -+ { -+ addr [0] &= 0xfe; /* clear multicast bit */ -+ addr [0] |= 0x02; /* set local assignment bit (IEEE802) */ -+ } -+} -+ -+ - /* - * Function: smc911x_probe(unsigned long ioaddr) - * -@@ -2116,15 +2156,13 @@ static int __init smc911x_probe(struct n - #endif - printk("\n"); - if (!is_valid_ether_addr(dev->dev_addr)) { -- printk("%s: Invalid ethernet MAC address. Please " -- "set using ifconfig\n", dev->name); -- } else { -- /* Print the Ethernet address */ -- printk("%s: Ethernet addr: ", dev->name); -- for (i = 0; i < 5; i++) -- printk("%2.2x:", dev->dev_addr[i]); -- printk("%2.2x\n", dev->dev_addr[5]); -+ gen_serial_ether_addr(dev->dev_addr); - } -+ /* Print the Ethernet address */ -+ printk("%s: Ethernet addr: ", dev->name); -+ for (i = 0; i < 5; i++) -+ printk("%2.2x:", dev->dev_addr[i]); -+ printk("%2.2x\n", dev->dev_addr[5]); - - if (lp->phy_type == 0) { - PRINTK("%s: No PHY found\n", dev->name); -@@ -2300,8 +2338,15 @@ static struct platform_driver smc911x_dr - }, - }; - -+#ifdef CONFIG_ARCH_GUMSTIX -+extern void gumstix_smc911x_load(void); -+#endif -+ - static int __init smc911x_init(void) - { -+#ifdef CONFIG_ARCH_GUMSTIX -+ gumstix_smc911x_load(); -+#endif - return platform_driver_register(&smc911x_driver); - } - ---- /dev/null -+++ b/drivers/net/gumstix-smc911x.c -@@ -0,0 +1,148 @@ -+/* -+ * Gumstix SMC911x chip intialization driver -+ * -+ * Author: Craig Hughes -+ * Created: December 9, 2004 -+ * Copyright: (C) 2004 Craig Hughes -+ * -+ * 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. -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+ -+#include -+ -+#define SMC_DEBUG 9 -+#include -+#include "smc911x.h" -+ -+static struct resource gumstix_smc911x0_resources[] = { -+ [0] = { -+ .name = "smc911x-regs", -+ .start = PXA_CS1_PHYS, -+ .end = PXA_CS1_PHYS + 0x000fffff, -+ .flags = IORESOURCE_MEM, -+ }, -+ [1] = { -+ .start = GUMSTIX_ETH0_IRQ, -+ .end = GUMSTIX_ETH0_IRQ, -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static struct resource gumstix_smc911x1_resources[] = { -+ [0] = { -+ .name = "smc911x-regs", -+ .start = PXA_CS2_PHYS, -+ .end = PXA_CS2_PHYS + 0x000fffff, -+ .flags = IORESOURCE_MEM, -+ }, -+ [1] = { -+ .start = GUMSTIX_ETH1_IRQ, -+ .end = GUMSTIX_ETH1_IRQ, -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static struct platform_device gumstix_smc911x0_device = { -+ .name = "smc911x", -+ .id = 0, -+ .num_resources = ARRAY_SIZE(gumstix_smc911x0_resources), -+ .resource = gumstix_smc911x0_resources, -+}; -+ -+static struct platform_device gumstix_smc911x1_device = { -+ .name = "smc911x", -+ .id = 1, -+ .num_resources = ARRAY_SIZE(gumstix_smc911x1_resources), -+ .resource = gumstix_smc911x1_resources, -+}; -+ -+static struct platform_device *smc911x_devices[] = { -+ &gumstix_smc911x0_device, -+ &gumstix_smc911x1_device, -+}; -+ -+/* First we're going to test if there's a 2nd SMC911x, and if not, then we'll free up those resources and the GPIO lines -+ * that it would otherwise use. We have no choice but to probe by doing: -+ * Set nCS2 to CS2 mode -+ * Set the reset line to GPIO out mode, and pull it high, then drop it low (to trigger reset) -+ * Read from the memory space to check for the sentinel sequence identifying a likely SMC911x device -+ */ -+int __init gumstix_smc911x_init(void) -+{ -+ unsigned int val, num_devices=ARRAY_SIZE(smc911x_devices); -+ void *ioaddr; -+ -+ /* Set up nPWE */ -+ pxa_gpio_mode(GPIO49_nPWE_MD); -+ -+ pxa_gpio_mode(GPIO78_nCS_2_MD); -+ // If either if statement fails, then we'll drop out and turn_off_eth1, -+ // if both succeed, then we'll skip that and just proceed with 2 cards -+ if(request_mem_region(gumstix_smc911x1_resources[1].start, SMC911X_IO_EXTENT, "smc911x probe")) -+ { -+ ioaddr = ioremap(gumstix_smc911x1_resources[1].start, SMC911X_IO_EXTENT); -+ val = SMC_GET_PN(); -+ iounmap(ioaddr); -+ release_mem_region(gumstix_smc911x1_resources[1].start, SMC911X_IO_EXTENT); -+ if (CHIP_9115 == val || -+ CHIP_9116 == val || -+ CHIP_9117 == val || -+ CHIP_9118 == val ) { -+ goto proceed; -+ } -+ } -+ -+turn_off_eth1: -+ // This is apparently not an SMC911x -+ // So, let's decrement the number of devices to request, and reset the GPIO lines to GPIO IN mode -+ num_devices--; -+ smc911x_devices[1] = NULL; -+ pxa_gpio_mode(78 | GPIO_IN); -+ -+proceed: -+ pxa_gpio_mode(GPIO15_nCS_1_MD); -+ -+ if(smc911x_devices[1]) pxa_gpio_mode(GPIO_GUMSTIX_ETH1_RST_MD); -+ pxa_gpio_mode(GPIO_GUMSTIX_ETH0_RST_MD); -+ -+ if(smc911x_devices[1]) GPCR(GPIO_GUMSTIX_ETH1_RST) = GPIO_bit(GPIO_GUMSTIX_ETH1_RST); -+ GPCR(GPIO_GUMSTIX_ETH0_RST) = GPIO_bit(GPIO_GUMSTIX_ETH0_RST); -+ msleep(500); // Hold RESET for at least 200µ -+ -+ if(smc911x_devices[1]) GPSR(GPIO_GUMSTIX_ETH1_RST) = GPIO_bit(GPIO_GUMSTIX_ETH1_RST); -+ GPSR(GPIO_GUMSTIX_ETH0_RST) = GPIO_bit(GPIO_GUMSTIX_ETH0_RST); -+ msleep(50); -+ -+ return platform_add_devices(smc911x_devices, num_devices); -+} -+ -+void __exit gumstix_smc911x_exit(void) -+{ -+ if(smc911x_devices[1] != NULL) platform_device_unregister(&gumstix_smc911x1_device); -+ platform_device_unregister(&gumstix_smc911x0_device); -+} -+ -+void gumstix_smc911x_load(void) {} -+EXPORT_SYMBOL(gumstix_smc911x_load); -+ -+module_init(gumstix_smc911x_init); -+module_exit(gumstix_smc911x_exit); -+ -+MODULE_LICENSE("GPL"); -+MODULE_AUTHOR("Craig Hughes "); -+MODULE_DESCRIPTION("Gumstix board SMC911x chip initialization driver"); -+MODULE_VERSION("1:0.1"); ---- a/drivers/net/Kconfig -+++ b/drivers/net/Kconfig -@@ -1020,6 +1020,13 @@ config SMC911X - called smc911x. If you want to compile it as a module, say M - here and read - -+config SMC911X_GUMSTIX -+ tristate -+ default m if SMC911X=m -+ default y if SMC911X=y -+ depends on SMC911X && ARCH_GUMSTIX -+ -+ - config NET_VENDOR_RACAL - bool "Racal-Interlan (Micom) NI cards" - depends on NET_ETHERNET && ISA ---- a/drivers/net/Makefile -+++ b/drivers/net/Makefile -@@ -202,6 +202,7 @@ obj-$(CONFIG_PASEMI_MAC) += pasemi_mac.o - obj-$(CONFIG_MACB) += macb.o - - obj-$(CONFIG_SMC91X_GUMSTIX) += gumstix-smc91x.o -+obj-$(CONFIG_SMC911X_GUMSTIX) += gumstix-smc911x.o - obj-$(CONFIG_ARM) += arm/ - obj-$(CONFIG_DEV_APPLETALK) += appletalk/ - obj-$(CONFIG_TR) += tokenring/ ---- a/include/asm-arm/arch-pxa/gumstix.h -+++ b/include/asm-arm/arch-pxa/gumstix.h -@@ -52,7 +52,7 @@ - #define GPIO_GUMSTIX_ETH0_RST 80 - #define GPIO_GUMSTIX_ETH0 36 - #else --#define GPIO_GUMSTIX_ETH0_RST 32 -+#define GPIO_GUMSTIX_ETH0_RST 107 - #define GPIO_GUMSTIX_ETH0 99 - #endif - #define GPIO_GUMSTIX_ETH1_RST 52 ---- a/drivers/net/smc911x.h -+++ b/drivers/net/smc911x.h -@@ -33,7 +33,9 @@ - * Use the DMA feature on PXA chips - */ - #ifdef CONFIG_ARCH_PXA -+#if !defined( CONFIG_SMC911X_GUMSTIX ) && !defined( CONFIG_SMC911X_GUMSTIX_MODULE ) - #define SMC_USE_PXA_DMA 1 -+#endif - #define SMC_USE_16BIT 0 - #define SMC_USE_32BIT 1 - #endif -@@ -46,13 +48,13 @@ - #if SMC_USE_16BIT - #define SMC_inb(a, r) readb((a) + (r)) - #define SMC_inw(a, r) readw((a) + (r)) --#define SMC_inl(a, r) ((SMC_inw(a, r) & 0xFFFF)+(SMC_inw(a+2, r)<<16)) -+#define SMC_inl(a, r) ((SMC_inw(a, r) & 0xFFFF)+(SMC_inw((a)+2, r)<<16)) - #define SMC_outb(v, a, r) writeb(v, (a) + (r)) - #define SMC_outw(v, a, r) writew(v, (a) + (r)) - #define SMC_outl(v, a, r) \ - do{ \ -- writel(v & 0xFFFF, (a) + (r)); \ -- writel(v >> 16, (a) + (r) + 2); \ -+ writel((v) & 0xFFFF, (a) + (r)); \ -+ writel((v) >> 16, (a) + (r) + 2); \ - } while (0) - #define SMC_insl(a, r, p, l) readsw((short*)((a) + (r)), p, l*2) - #define SMC_outsl(a, r, p, l) writesw((short*)((a) + (r)), p, l*2) diff --git a/target/linux/pxa/patches/000-cpufreq.patch b/target/linux/pxa/patches/000-cpufreq.patch deleted file mode 100644 index 3cb6676b4..000000000 --- a/target/linux/pxa/patches/000-cpufreq.patch +++ /dev/null @@ -1,533 +0,0 @@ -diff -Nurbw linux-2.6.17/arch/arm/Kconfig linux-2.6.17-patched/arch/arm/Kconfig ---- linux-2.6.17/arch/arm/Kconfig 2006-06-17 18:49:35.000000000 -0700 -+++ linux-2.6.17-patched/arch/arm/Kconfig 2006-09-21 14:57:02.000000000 -0700 -@@ -656,7 +656,7 @@ - - endmenu - --if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP1) -+if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP1 || ARCH_PXA) - - menu "CPU Frequency scaling" - -@@ -685,6 +685,13 @@ - - endmenu - -+config CPU_FREQ_PXA -+ bool -+ depends on CPU_FREQ && ARCH_PXA -+ default y -+ select CPU_FREQ_DEFAULT_GOV_USERSPACE -+ select CPU_FREQ_TABLE -+ - endif - - menu "Floating point emulation" -diff -Nurbw linux-2.6.17/arch/arm/mach-pxa/cpu-pxa.c linux-2.6.17-patched/arch/arm/mach-pxa/cpu-pxa.c ---- linux-2.6.17/arch/arm/mach-pxa/cpu-pxa.c 1969-12-31 16:00:00.000000000 -0800 -+++ linux-2.6.17-patched/arch/arm/mach-pxa/cpu-pxa.c 2006-09-21 14:57:02.000000000 -0700 -@@ -0,0 +1,324 @@ -+/* -+ * linux/arch/arm/mach-pxa/cpu-pxa.c -+ * -+ * Copyright (C) 2002,2003 Intrinsyc Software -+ * -+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ * -+ * History: -+ * 31-Jul-2002 : Initial version [FB] -+ * 29-Jan-2003 : added PXA255 support [FB] -+ * 20-Apr-2003 : ported to v2.5 (Dustin McIntire, Sensoria Corp.) -+ * -+ * Note: -+ * This driver may change the memory bus clock rate, but will not do any -+ * platform specific access timing changes... for example if you have flash -+ * memory connected to CS0, you will need to register a platform specific -+ * notifier which will adjust the memory access strobes to maintain a -+ * minimum strobe width. -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#undef DEBUG -+ -+#ifdef DEBUG -+ static unsigned int freq_debug = DEBUG; -+ module_param(freq_debug, int, 0); -+ MODULE_PARM_DESC(freq_debug, "Set the debug messages to on=1/off=0"); -+#else -+ #define freq_debug 0 -+#endif -+ -+typedef struct -+{ -+ unsigned int khz; -+ unsigned int membus; -+ unsigned int cccr; -+ unsigned int div2; -+} pxa_freqs_t; -+ -+/* Define the refresh period in mSec for the SDRAM and the number of rows */ -+#define SDRAM_TREF 64 /* standard 64ms SDRAM */ -+#define SDRAM_ROWS 2048 /* 64MB=8192 32MB=4096 */ -+#define MDREFR_DRI(x) ((x*SDRAM_TREF)/(SDRAM_ROWS*32)) -+ -+#define CCLKCFG_TURBO 0x1 -+#define CCLKCFG_FCS 0x2 -+#define PXA25x_MIN_FREQ 99533 -+#define PXA25x_MAX_FREQ 530842 -+#define MDREFR_DB2_MASK (MDREFR_K2DB2 | MDREFR_K1DB2) -+#define MDREFR_DRI_MASK 0xFFF -+ -+ -+/* Use the run mode frequencies for the CPUFREQ_POLICY_PERFORMANCE policy */ -+static pxa_freqs_t pxa255_run_freqs[] = -+{ -+ /* CPU MEMBUS CCCR DIV2*/ -+ { 99533, 99533, 0x121, 1}, /* run= 99, turbo= 99, PXbus=50, SDRAM=50 */ -+ {132710, 132710, 0x123, 1}, /* run=133, turbo=133, PXbus=66, SDRAM=66 */ -+ {199066, 99533, 0x141, 0}, /* run=199, turbo=199, PXbus=99, SDRAM=99 */ -+ {265421, 132710, 0x143, 0}, /* run=265, turbo=265, PXbus=133, SDRAM=133 */ -+ {331776, 165888, 0x145, 1}, /* run=331, turbo=331, PXbus=166, SDRAM=83 */ -+ {398131, 99533, 0x161, 0}, /* run=398, turbo=398, PXbus=99, SDRAM=99 */ -+ {398131, 132710, 0x1c3, 0}, /* run=265, turbo=398, PXbus=133, SDRAM=133 */ -+ {530842, 132710, 0x163, 0}, /* run=531, turbo=531, PXbus=133, SDRAM=133 */ -+ {0,} -+}; -+#define NUM_RUN_FREQS (sizeof(pxa255_run_freqs)/sizeof(pxa_freqs_t)) -+ -+static struct cpufreq_frequency_table pxa255_run_freq_table[NUM_RUN_FREQS+1]; -+ -+/* Use the turbo mode frequencies for the CPUFREQ_POLICY_POWERSAVE policy */ -+static pxa_freqs_t pxa255_turbo_freqs[] = -+{ -+ /* CPU MEMBUS CCCR DIV2*/ -+ { 99533, 99533, 0x121, 1}, /* run=99, turbo= 99, PXbus=99, SDRAM=50 */ -+ {149299, 99533, 0x1a1, 0}, /* run=99, turbo=149, PXbus=99, SDRAM=99 */ -+ {199066, 99533, 0x221, 0}, /* run=99, turbo=199, PXbus=99, SDRAM=99 */ -+ {298598, 99533, 0x321, 0}, /* run=99, turbo=299, PXbus=99, SDRAM=99 */ -+ {398131, 99533, 0x241, 1}, /* run=199, turbo=398, PXbus=99, SDRAM=50 */ -+ {0,} -+}; -+#define NUM_TURBO_FREQS (sizeof(pxa255_turbo_freqs)/sizeof(pxa_freqs_t)) -+ -+static struct cpufreq_frequency_table pxa255_turbo_freq_table[NUM_TURBO_FREQS+1]; -+ -+extern unsigned get_clk_frequency_khz(int info); -+ -+/* find a valid frequency point */ -+static int pxa_verify_policy(struct cpufreq_policy *policy) -+{ -+ int ret; -+ struct cpufreq_frequency_table *pxa_freqs_table; -+ -+ if(policy->policy == CPUFREQ_POLICY_PERFORMANCE) { -+ pxa_freqs_table = pxa255_run_freq_table; -+ } else if (policy->policy == CPUFREQ_POLICY_POWERSAVE) { -+ pxa_freqs_table = pxa255_turbo_freq_table; -+ } else { -+ printk("CPU PXA: Unknown policy found. " -+ "Using CPUFREQ_POLICY_PERFORMANCE\n"); -+ pxa_freqs_table = pxa255_run_freq_table; -+ } -+ ret=cpufreq_frequency_table_verify(policy, pxa_freqs_table); -+ -+ if(freq_debug) { -+ printk("Verified CPU policy: %dKhz min to %dKhz max\n", -+ policy->min, policy->max); -+ } -+ -+ return ret; -+} -+ -+static int pxa_set_target(struct cpufreq_policy *policy, -+ unsigned int target_freq, -+ unsigned int relation) -+{ -+ int idx; -+ cpumask_t cpus_allowed; -+ int cpu = policy->cpu; -+ struct cpufreq_freqs freqs; -+ pxa_freqs_t *pxa_freq_settings; -+ struct cpufreq_frequency_table *pxa_freqs_table; -+ unsigned long flags; -+ unsigned int unused; -+ unsigned int preset_mdrefr, postset_mdrefr; -+ void *ramstart; -+ -+ /* -+ * Save this threads cpus_allowed mask. -+ */ -+ cpus_allowed = current->cpus_allowed; -+ -+ /* -+ * Bind to the specified CPU. When this call returns, -+ * we should be running on the right CPU. -+ */ -+ set_cpus_allowed(current, cpumask_of_cpu(cpu)); -+ BUG_ON(cpu != smp_processor_id()); -+ -+ /* Get the current policy */ -+ if(policy->policy == CPUFREQ_POLICY_PERFORMANCE) { -+ pxa_freq_settings = pxa255_run_freqs; -+ pxa_freqs_table = pxa255_run_freq_table; -+ }else if (policy->policy == CPUFREQ_POLICY_POWERSAVE) { -+ pxa_freq_settings = pxa255_turbo_freqs; -+ pxa_freqs_table = pxa255_turbo_freq_table; -+ }else { -+ printk("CPU PXA: Unknown policy found. " -+ "Using CPUFREQ_POLICY_PERFORMANCE\n"); -+ pxa_freq_settings = pxa255_run_freqs; -+ pxa_freqs_table = pxa255_run_freq_table; -+ } -+ -+ /* Lookup the next frequency */ -+ if (cpufreq_frequency_table_target(policy, pxa_freqs_table, -+ target_freq, relation, &idx)) { -+ return -EINVAL; -+ } -+ -+ freqs.old = policy->cur; -+ freqs.new = pxa_freq_settings[idx].khz; -+ freqs.cpu = policy->cpu; -+ if(freq_debug) { -+ printk(KERN_INFO "Changing CPU frequency to %d Mhz, (SDRAM %d Mhz)\n", -+ freqs.new/1000, (pxa_freq_settings[idx].div2) ? -+ (pxa_freq_settings[idx].membus/2000) : -+ (pxa_freq_settings[idx].membus/1000)); -+ } -+ -+ ramstart = phys_to_virt(0xa0000000); -+ -+ /* -+ * Tell everyone what we're about to do... -+ * you should add a notify client with any platform specific -+ * Vcc changing capability -+ */ -+ cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); -+ -+ /* Calculate the next MDREFR. If we're slowing down the SDRAM clock -+ * we need to preset the smaller DRI before the change. If we're speeding -+ * up we need to set the larger DRI value after the change. -+ */ -+ preset_mdrefr = postset_mdrefr = MDREFR; -+ if((MDREFR & MDREFR_DRI_MASK) > MDREFR_DRI(pxa_freq_settings[idx].membus)) { -+ preset_mdrefr = (preset_mdrefr & ~MDREFR_DRI_MASK) | -+ MDREFR_DRI(pxa_freq_settings[idx].membus); -+ } -+ postset_mdrefr = (postset_mdrefr & ~MDREFR_DRI_MASK) | -+ MDREFR_DRI(pxa_freq_settings[idx].membus); -+ -+ /* If we're dividing the memory clock by two for the SDRAM clock, this -+ * must be set prior to the change. Clearing the divide must be done -+ * after the change. -+ */ -+ if(pxa_freq_settings[idx].div2) { -+ preset_mdrefr |= MDREFR_DB2_MASK; -+ postset_mdrefr |= MDREFR_DB2_MASK; -+ } else { -+ postset_mdrefr &= ~MDREFR_DB2_MASK; -+ } -+ -+ local_irq_save(flags); -+ -+ /* Set new the CCCR */ -+ CCCR = pxa_freq_settings[idx].cccr; -+ -+ __asm__ __volatile__(" \ -+ ldr r4, [%1] ; /* load MDREFR */ \ -+ b 2f ; \ -+ .align 5 ; \ -+1: \ -+ str %4, [%1] ; /* preset the MDREFR */ \ -+ mcr p14, 0, %2, c6, c0, 0 ; /* set CCLKCFG[FCS] */ \ -+ str %5, [%1] ; /* postset the MDREFR */ \ -+ \ -+ b 3f ; \ -+2: b 1b ; \ -+3: nop ; \ -+ " -+ : "=&r" (unused) -+ : "r" (&MDREFR), "r" (CCLKCFG_TURBO|CCLKCFG_FCS), "r" (ramstart), \ -+ "r" (preset_mdrefr), "r" (postset_mdrefr) -+ : "r4", "r5"); -+ local_irq_restore(flags); -+ -+ /* -+ * Restore the CPUs allowed mask. -+ */ -+ set_cpus_allowed(current, cpus_allowed); -+ -+ /* -+ * Tell everyone what we've just done... -+ * you should add a notify client with any platform specific -+ * SDRAM refresh timer adjustments -+ */ -+ cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); -+ -+ return 0; -+} -+ -+static int pxa_cpufreq_init(struct cpufreq_policy *policy) -+{ -+ cpumask_t cpus_allowed; -+ unsigned int cpu = policy->cpu; -+ int i; -+ -+ cpus_allowed = current->cpus_allowed; -+ -+ set_cpus_allowed(current, cpumask_of_cpu(cpu)); -+ BUG_ON(cpu != smp_processor_id()); -+ -+ /* set default policy and cpuinfo */ -+ policy->governor = CPUFREQ_DEFAULT_GOVERNOR; -+ policy->policy = CPUFREQ_POLICY_PERFORMANCE; -+ policy->cpuinfo.max_freq = PXA25x_MAX_FREQ; -+ policy->cpuinfo.min_freq = PXA25x_MIN_FREQ; -+ policy->cpuinfo.transition_latency = 1000; /* FIXME: 1 ms, assumed */ -+ policy->cur = get_clk_frequency_khz(0); /* current freq */ -+ policy->min = policy->max = policy->cur; -+ -+ /* Generate the run cpufreq_frequency_table struct */ -+ for(i=0;i +Date: Wed, 28 Oct 2009 21:11:28 -0400 +Subject: [PATCH] [ARM] Gumstix Verdex Pro arch support + +add an option for Verdex Pro when ARCH_GUMSTIX is selected, and +factor earlier Gumstix support into a seperate option + +Signed-off-by: Bobby Powers +--- + arch/arm/mach-pxa/Kconfig | 29 +- + arch/arm/mach-pxa/Makefile | 3 +- + arch/arm/mach-pxa/gumstix-verdex.c | 749 +++++++++++++++++++++++++++ + arch/arm/mach-pxa/include/mach/mfp-pxa27x.h | 1 + + 4 files changed, 772 insertions(+), 10 deletions(-) + create mode 100644 arch/arm/mach-pxa/gumstix-verdex.c + +--- a/arch/arm/mach-pxa/Kconfig ++++ b/arch/arm/mach-pxa/Kconfig +@@ -32,23 +32,34 @@ endmenu + endif + + config ARCH_GUMSTIX +- bool "Gumstix XScale 255 boards" +- select PXA25x ++ bool "Gumstix boards" + help +- Say Y here if you intend to run this kernel on +- Basix, Connex, ws-200ax, ws-400ax systems ++ Say Y here if you intend to run this kernel on a ++ gumstix computer. + +-choice +- prompt "Gumstix Carrier/Expansion Board" + depends on ARCH_GUMSTIX + +-config GUMSTIX_AM200EPD ++config MACH_GUMSTIX_F ++ bool "Gumstix Basix/Connex ..." ++ depends on ARCH_GUMSTIX ++ select PXA25x ++ ++ choice ++ prompt "Gumstix Carrier/Expansion Board" ++ depends on MACH_GUMSTIX_F ++ ++ config GUMSTIX_AM200EPD + bool "Enable AM200EPD board support" + +-config GUMSTIX_AM300EPD ++ config GUMSTIX_AM300EPD + bool "Enable AM300EPD board support" + +-endchoice ++ endchoice ++ ++config MACH_GUMSTIX_VERDEX ++ bool "Gumstix VERDEX ..." ++ depends on ARCH_GUMSTIX ++ select PXA27x + + config MACH_INTELMOTE2 + bool "Intel Mote 2 Platform" +--- a/arch/arm/mach-pxa/Makefile ++++ b/arch/arm/mach-pxa/Makefile +@@ -25,7 +25,8 @@ obj-$(CONFIG_CPU_PXA320) += pxa320.o + obj-$(CONFIG_CPU_PXA930) += pxa930.o + + # Specific board support +-obj-$(CONFIG_ARCH_GUMSTIX) += gumstix.o ++obj-$(CONFIG_MACH_GUMSTIX_F) += gumstix.o ++obj-$(CONFIG_MACH_GUMSTIX_VERDEX) += gumstix-verdex.o + obj-$(CONFIG_GUMSTIX_AM200EPD) += am200epd.o + obj-$(CONFIG_GUMSTIX_AM300EPD) += am300epd.o + obj-$(CONFIG_ARCH_LUBBOCK) += lubbock.o +--- /dev/null ++++ b/arch/arm/mach-pxa/gumstix-verdex.c +@@ -0,0 +1,749 @@ ++/* ++ * linux/arch/arm/mach-pxa/gumstix-verdex.c ++ * ++ * Support for the Gumstix verdex motherboard. ++ * ++ * Original Author: Craig Hughes ++ * Created: Feb 14, 2008 ++ * Copyright: Craig Hughes ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * Implemented based on lubbock.c by Nicolas Pitre and code from Craig ++ * Hughes ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include "generic.h" ++ ++#include ++ ++#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) ++ ++#include ++ ++static struct resource verdex_smsc911x_resources[] = { ++ [0] = { ++ .name = "smsc911x-memory", ++ .start = PXA_CS1_PHYS, ++ .end = PXA_CS1_PHYS + 0x000fffff, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = IRQ_GPIO(GPIO_GUMSTIX_ETH0), ++ .end = IRQ_GPIO(GPIO_GUMSTIX_ETH0), ++ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE, ++ }, ++}; ++ ++static struct smsc911x_platform_config verdex_smsc911x_config = { ++ .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, ++ .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, ++ .flags = SMSC911X_USE_16BIT | SMSC911X_SAVE_MAC_ADDRESS, ++ .phy_interface = PHY_INTERFACE_MODE_MII, ++}; ++ ++static struct platform_device verdex_smsc911x_device = { ++ .name = "smsc911x", ++ .id = -1, ++ .num_resources = ARRAY_SIZE(verdex_smsc911x_resources), ++ .resource = verdex_smsc911x_resources, ++ .dev = { ++ .platform_data = &verdex_smsc911x_config, ++ }, ++}; ++ ++static void __init verdex_init_smsc911x(void) ++{ ++ ++ printk(KERN_INFO "Initializing Gumstix verdex smsc911x\n"); ++ ++ if (gpio_request(GPIO_GUMSTIX_ETH0_RST, "SMSC911x_ETH0_RST") != 0) { ++ printk(KERN_ERR "could not obtain gpio for SMSC911x_ETH0_RST\n"); ++ goto err_request_gpio_eth0_rst; ++ } ++ ++ if (gpio_request(GPIO_GUMSTIX_ETH0, "SMSC911x_ETH0_IRQ") != 0) { ++ printk(KERN_ERR "could not obtain gpio for SMSC911x_ETH0_IRQ\n"); ++ goto err_request_gpio_eth0_irq; ++ } ++ ++ if (gpio_direction_output(GPIO_GUMSTIX_ETH0_RST, 0) != 0) { ++ printk(KERN_ERR "could not set SMSC911x_ETH0_RST pin to output\n"); ++ goto err_dir; ++ } ++ ++ gpio_set_value(GPIO_GUMSTIX_ETH0_RST, 0); ++ ++ msleep(500); // Hold RESET for at least 200ms ++ ++ gpio_set_value(GPIO_GUMSTIX_ETH0_RST, 1); ++ ++ msleep(50); ++ ++ if (gpio_direction_input(GPIO_GUMSTIX_ETH0) != 0) { ++ printk(KERN_ERR "could not set SMSC911x_ETH0_IRQ pin to input\n"); ++ goto err_dir; ++ } ++ ++ gpio_export(GPIO_GUMSTIX_ETH0, 0); ++ platform_device_register(&verdex_smsc911x_device); ++ return; ++ ++err_dir: ++ gpio_free(GPIO_GUMSTIX_ETH0_RST); ++ ++err_request_gpio_eth0_irq: ++ gpio_free(GPIO_GUMSTIX_ETH0); ++ ++err_request_gpio_eth0_rst: ++ return; ++} ++ ++#else ++static void __init verdex_init_smsc911x(void) { return; } ++#endif ++ ++static unsigned long verdex_pin_config[] = { ++ /* MMC */ ++ GPIO32_MMC_CLK, ++ GPIO112_MMC_CMD, ++ GPIO92_MMC_DAT_0, ++ GPIO109_MMC_DAT_1, ++ GPIO110_MMC_DAT_2, ++ GPIO111_MMC_DAT_3, ++ ++ /* BTUART */ ++ GPIO42_BTUART_RXD, ++ GPIO43_BTUART_TXD, ++ GPIO44_BTUART_CTS, ++ GPIO45_BTUART_RTS, ++ ++ /* STUART */ ++ GPIO46_STUART_RXD, ++ GPIO47_STUART_TXD, ++ ++ /* FFUART */ ++ GPIO34_FFUART_RXD, ++ GPIO39_FFUART_TXD, ++ ++ /* SSP 2 */ ++ GPIO19_SSP2_SCLK, ++ GPIO14_SSP2_SFRM, ++ GPIO13_SSP2_TXD, ++ GPIO11_SSP2_RXD, ++ ++ /* SDRAM and local bus */ ++ GPIO49_nPWE, ++ GPIO15_nCS_1, ++ ++ /* I2C */ ++ GPIO117_I2C_SCL, ++ GPIO118_I2C_SDA, ++ ++ /* PWM 0 */ ++ GPIO16_PWM0_OUT, ++ ++ /* BRIGHTNESS */ ++ GPIO17_PWM1_OUT, ++ ++ /* LCD */ ++ GPIO58_LCD_LDD_0, ++ GPIO59_LCD_LDD_1, ++ GPIO60_LCD_LDD_2, ++ GPIO61_LCD_LDD_3, ++ GPIO62_LCD_LDD_4, ++ GPIO63_LCD_LDD_5, ++ GPIO64_LCD_LDD_6, ++ GPIO65_LCD_LDD_7, ++ GPIO66_LCD_LDD_8, ++ GPIO67_LCD_LDD_9, ++ GPIO68_LCD_LDD_10, ++ GPIO69_LCD_LDD_11, ++ GPIO70_LCD_LDD_12, ++ GPIO71_LCD_LDD_13, ++ GPIO72_LCD_LDD_14, ++ GPIO73_LCD_LDD_15, ++ GPIO74_LCD_FCLK, ++ GPIO75_LCD_LCLK, ++ GPIO76_LCD_PCLK, ++#ifdef CONFIG_FB_PXA_SHARP_LQ043_PSP ++ /* DISP must be always high while screen is on */ ++ /* Done below in verdex_init */ ++#else ++ GPIO77_LCD_BIAS, ++#endif ++ ++}; ++ ++#if defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE) ++ ++static unsigned long gpio_ntschg_0[] = { ++ GPIO104_GPIO, // pxa_gpio_mode(GPIO_GUMSTIX_nCD_0_MD); ++}; ++ ++static unsigned long gpio_ntschg_1[] = { ++ GPIO18_GPIO, // pxa_gpio_mode(GPIO_GUMSTIX_nSTSCHG_1_MD); ++ GPIO36_GPIO, // pxa_gpio_mode(GPIO_GUMSTIX_nCD_1_MD); ++ GPIO27_GPIO, // pxa_gpio_mode(GPIO_GUMSTIX_PRDY_nBSY_1_MD); ++}; ++ ++static unsigned long gpio_prdy_nbsy_old[] = { ++ GPIO111_GPIO, // pxa_gpio_mode(GPIO_GUMSTIX_nSTSCHG_0_MD); ++ GPIO109_GPIO, // pxa_gpio_mode(GPIO_GUMSTIX_PRDY_nBSY_0_OLD_MD); ++}; ++ ++static unsigned long gpio_prdy_nbsy[] = { ++ GPIO96_GPIO, // pxa_gpio_mode(GPIO_GUMSTIX_PRDY_nBSY_0_MD); ++}; ++ ++static unsigned long gpio_nhw_init[] = { ++ GPIO48_nPOE, // pxa_gpio_mode(GPIO_GUMSTIX_nPOE_MD); ++ GPIO102_nPCE_1, // pxa_gpio_mode(GPIO_GUMSTIX_nPCE_1_MD); ++ GPIO105_nPCE_2, // pxa_gpio_mode(GPIO_GUMSTIX_nPCE_2_MD); ++ GPIO104_GPIO, // pxa_gpio_mode(GPIO_GUMSTIX_nCD_0_MD); ++ ++ GPIO49_nPWE, // pxa_gpio_mode(GPIO_GUMSTIX_nPWE_MD); ++ GPIO50_nPIOR, // pxa_gpio_mode(GPIO_GUMSTIX_nPIOR_MD); ++ GPIO51_nPIOW, // pxa_gpio_mode(GPIO_GUMSTIX_nPIOW_MD); ++ GPIO79_PSKTSEL, // pxa_gpio_mode(GPIO_GUMSTIX_pSKTSEL_MD); ++ GPIO55_nPREG, // pxa_gpio_mode(GPIO_GUMSTIX_nPREG_MD); ++ GPIO56_nPWAIT, // pxa_gpio_mode(GPIO_GUMSTIX_nPWAIT_MD); ++ GPIO57_nIOIS16, // pxa_gpio_mode(GPIO_GUMSTIX_nIOIS16_MD); ++}; ++ ++static int net_cf_vx_mode = 0; ++static int pcmcia_cf_nr = 2; ++ ++inline void __init gumstix_pcmcia_cpld_clk(void) ++{ ++ GPCR(GPIO_GUMSTIX_nPOE) = GPIO_bit(GPIO_GUMSTIX_nPOE); ++ GPSR(GPIO_GUMSTIX_nPOE) = GPIO_bit(GPIO_GUMSTIX_nPOE); ++} ++ ++inline unsigned char __init gumstix_pcmcia_cpld_read_bits(int bits) ++{ ++ unsigned char result = 0; ++ unsigned int shift = 0; ++ while(bits--) ++ { ++ result |= !!(GPLR(GPIO_GUMSTIX_nCD_0) & GPIO_bit(GPIO_GUMSTIX_nCD_0)) << shift; ++ shift ++; ++ gumstix_pcmcia_cpld_clk(); ++ } ++ printk("CPLD responded with: %02x\n",result); ++ return result; ++} ++ ++/* We use the CPLD on the CF-CF card to read a value from a shift register. If we can read that ++ * magic sequence, then we have 2 CF cards; otherwise we assume just one ++ * The CPLD will send the value of the shift register on GPIO11 (the CD line for slot 0) ++ * when RESET is held in reset. We use GPIO48 (nPOE) as a clock signal, ++ * GPIO52/53 (card enable for both cards) to control read/write to the shift register ++ */ ++static void __init gumstix_count_cards(void) ++{ ++ ++ if ((gpio_request(GPIO_GUMSTIX_nPOE, "GPIO_GUMSTIX_nPOE") == 0) && ++ (gpio_direction_output(GPIO_GUMSTIX_nPOE, 1) == 0)) ++ gpio_export(GPIO_GUMSTIX_nPOE, 0); ++ else ++ printk(KERN_ERR "could not obtain gpio for GPIO_GUMSTIX_nPOE\n"); ++ ++ if ((gpio_request(GPIO_GUMSTIX_nPCE_1, "GPIO_GUMSTIX_nPCE_1") == 0) && ++ (gpio_direction_output(GPIO_GUMSTIX_nPCE_1, 1) == 0)) ++ gpio_export(GPIO_GUMSTIX_nPCE_1, 0); ++ else ++ printk(KERN_ERR "could not obtain gpio for GPIO_GUMSTIX_nPCE_1\n"); ++ ++ if ((gpio_request(GPIO_GUMSTIX_nPCE_2, "GPIO_GUMSTIX_nPCE_2") == 0) && ++ (gpio_direction_output(GPIO_GUMSTIX_nPCE_2, 1) == 0)) ++ gpio_export(GPIO_GUMSTIX_nPCE_2, 0); ++ else ++ printk(KERN_ERR "could not obtain gpio for GPIO_GUMSTIX_nPCE_2\n"); ++ ++ if ((gpio_request(GPIO_GUMSTIX_nCD_0, "GPIO_GUMSTIX_nCD_0") == 0) && ++ (gpio_direction_input(GPIO_GUMSTIX_nCD_0) == 0)) ++ gpio_export(GPIO_GUMSTIX_nCD_0, 0); ++ else ++ printk(KERN_ERR "could not obtain gpio for GPIO_GUMSTIX_nCD_0\n"); ++ ++ if (net_cf_vx_mode) { ++ if ((gpio_request(GPIO_GUMSTIX_CF_OLD_RESET, "GPIO_GUMSTIX_CF_OLD_RESET") == 0) && ++ (gpio_direction_output(GPIO_GUMSTIX_CF_OLD_RESET, 1) == 0)) { ++ gpio_export(GPIO_GUMSTIX_CF_OLD_RESET, 0); ++ } else { ++ printk(KERN_ERR "could not obtain gpio for GPIO_GUMSTIX_CF_OLD_RESET\n"); ++ } ++ } else { ++ if ((gpio_request(GPIO_GUMSTIX_CF_RESET, "GPIO_GUMSTIX_CF_RESET") == 0) && ++ (gpio_direction_output(GPIO_GUMSTIX_CF_RESET, 1) == 0)) { ++ gpio_export(GPIO_GUMSTIX_CF_RESET, 0); ++ } else { ++ printk(KERN_ERR "could not obtain gpio for GPIO_GUMSTIX_CF_RESET\n"); ++ } ++ } ++ ++ // Setup the shift register ++ GPSR(GPIO_GUMSTIX_nPCE_1) = GPIO_bit(GPIO_GUMSTIX_nPCE_1); ++ GPCR(GPIO_GUMSTIX_nPCE_2) = GPIO_bit(GPIO_GUMSTIX_nPCE_2); ++ ++ // Tick the clock to program the shift register ++ gumstix_pcmcia_cpld_clk(); ++ ++ // Now set shift register into read mode ++ GPCR(GPIO_GUMSTIX_nPCE_1) = GPIO_bit(GPIO_GUMSTIX_nPCE_1); ++ GPSR(GPIO_GUMSTIX_nPCE_2) = GPIO_bit(GPIO_GUMSTIX_nPCE_2); ++ ++ // We can read the bits now -- 0xC2 means "Dual compact flash" ++ if(gumstix_pcmcia_cpld_read_bits(8) != 0xC2) ++ { ++ // We do not have 2 CF slots ++ pcmcia_cf_nr = 1; ++ } ++ ++ udelay(50); ++ ++ if (net_cf_vx_mode) { ++ gpio_set_value(GPIO_GUMSTIX_CF_OLD_RESET, 0); ++ gpio_free(GPIO_GUMSTIX_CF_OLD_RESET); ++ } else { ++ gpio_set_value(GPIO_GUMSTIX_CF_RESET, 0); ++ gpio_free(GPIO_GUMSTIX_CF_RESET); ++ } ++ ++ printk(KERN_INFO "found %d CF slots\n", pcmcia_cf_nr); ++ ++ gpio_free(GPIO_GUMSTIX_nPCE_2); ++ gpio_free(GPIO_GUMSTIX_nPCE_1); ++ gpio_free(GPIO_GUMSTIX_nPOE); ++ return; ++} ++ ++#define SMC_IO_EXTENT 16 ++#define BANK_SELECT 14 ++ ++static void __init verdex_pcmcia_pin_config(void) ++{ ++ struct resource *res; ++ void *network_controller_memory; ++ struct platform_device *pdev = &verdex_smsc911x_device; ++ ++ printk(KERN_INFO "Initializing Gumstix verdex pcmcia\n"); ++ ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (res == NULL) { ++ printk(KERN_ERR "no memory resource defined\n"); ++ goto err_done; ++ } ++ ++ res = request_mem_region(res->start, SMC_IO_EXTENT, "smc91x probe"); ++ if (res == NULL) { ++ printk(KERN_ERR "failed to request memory resource\n"); ++ goto err_done; ++ } ++ ++ // We check for the possibility of SMSC91c111 (reg base offset 0x300 from CS1 base) ++ network_controller_memory = ioremap(res->start + 0x300, SMC_IO_EXTENT); ++ if (network_controller_memory == NULL) { ++ printk(KERN_ERR "failed to ioremap() registers\n"); ++ goto err_free_mem; ++ } ++ ++ // Look for the special 91c111 value in the bank select register ++ if((0xff00 & readw(network_controller_memory+BANK_SELECT)) == 0x3300) { ++ printk(KERN_INFO "Detected netCF-vx board: pcmcia using older GPIO configuration\n"); ++ net_cf_vx_mode = 1; ++ } else { ++ printk(KERN_INFO "Not netCF-vx board: pcmcia using newer GPIO configuration\n"); ++ net_cf_vx_mode = 0; ++ } ++ ++ iounmap(network_controller_memory); ++err_free_mem: ++ release_mem_region(res->start, SMC_IO_EXTENT); ++err_done: ++ ++ gumstix_count_cards(); // this can update pcmcia_cf_nr ++ ++ // If pcmcia_cf_nr is 1 then we do not have 2 CF slots ++ // Note: logic sequence was altered from previous kernel revs ++ // so that this works as intended now. ++ if (pcmcia_cf_nr != 0) ++ { ++ pxa2xx_mfp_config(ARRAY_AND_SIZE(gpio_ntschg_0)); ++ ++ if(net_cf_vx_mode) ++ pxa2xx_mfp_config(gpio_prdy_nbsy_old, 1); ++ else ++ pxa2xx_mfp_config(gpio_prdy_nbsy, 1); ++ ++ } else { ++ // Note: this reconfigures pin GPIO18 to be GPIO-IN so make ++ // sure that this only gets done for the old dual slot board ++ // since that pin is an active AF1 out-mode signal (RDY) on ++ // newer boards and changing the pin mode on the newer boards ++ // would result in memory corruption for the NIC (and hang during ++ // PHY test). ++ pxa2xx_mfp_config(ARRAY_AND_SIZE(gpio_ntschg_1)); ++ } ++ ++ pxa2xx_mfp_config(ARRAY_AND_SIZE(gpio_nhw_init)); ++ return; ++} ++ ++int __init gumstix_get_cf_cards(void) ++{ ++ return pcmcia_cf_nr; ++} ++EXPORT_SYMBOL(gumstix_get_cf_cards); ++ ++#ifdef CONFIG_MACH_GUMSTIX_VERDEX ++int __init gumstix_check_if_netCF_vx(void) ++{ ++ return net_cf_vx_mode; ++} ++EXPORT_SYMBOL(gumstix_check_if_netCF_vx); ++#endif ++ ++#endif ++ ++#if defined(CONFIG_FB_PXA_SHARP_LQ043_PSP) || defined(CONFIG_FB_PXA_SAMSUNG_LTE430WQ_F0C) ++static void gumstix_lcd_backlight(int on_or_off) ++{ ++ int err; ++ err = gpio_request(17, "LCD BACKLIGHT"); ++ if (err) { ++ //pr_warning("Gumstix Verdex: Failed to request LCD Backlight gpio\n"); ++ return; ++ } ++ ++ if(on_or_off) { ++ gpio_direction_input(17); ++ } else { ++ GPCR(17) = GPIO_bit(17); ++ gpio_direction_output(17, 0); ++ GPCR(17) = GPIO_bit(17); ++ } ++ ++ return; ++} ++#endif ++ ++#ifdef CONFIG_FB_PXA_ALPS_CDOLLAR ++static struct pxafb_mode_info gumstix_fb_mode = { ++ .pixclock = 300000, ++ .xres = 240, ++ .yres = 320, ++ .bpp = 16, ++ .hsync_len = 2, ++ .left_margin = 1, ++ .right_margin = 1, ++ .vsync_len = 3, ++ .upper_margin = 0, ++ .lower_margin = 0, ++ .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, ++}; ++ ++static struct pxafb_mach_info gumstix_fb_info = { ++ .modes = &gumstix_fb_mode, ++ .num_modes = 1, ++ .lccr0 = LCCR0_Pas | LCCR0_Sngl | LCCR0_Color, ++ .lccr3 = LCCR3_PixFlEdg, ++}; ++#elif defined(CONFIG_FB_PXA_SHARP_LQ043_PSP) ++static struct pxafb_mode_info gumstix_fb_mode = { ++ .pixclock = 110000, ++ .xres = 480, ++ .yres = 272, ++ .bpp = 16, ++ .hsync_len = 41, ++ .left_margin = 2, ++ .right_margin = 2, ++ .vsync_len = 10, ++ .upper_margin = 2, ++ .lower_margin = 2, ++ .sync = 0, // Hsync and Vsync both active low ++}; ++ ++static struct pxafb_mach_info gumstix_fb_info = { ++ .modes = &gumstix_fb_mode, ++ .num_modes = 1, ++ .lccr0 = LCCR0_Act | LCCR0_Sngl | LCCR0_Color, ++ .lccr3 = LCCR3_OutEnH | LCCR3_PixFlEdg | (0 << 30), ++ .pxafb_backlight_power = &gumstix_lcd_backlight, ++}; ++#elif defined(CONFIG_FB_PXA_SAMSUNG_LTE430WQ_F0C) ++static struct pxafb_mode_info gumstix_fb_mode = { ++ .pixclock = 108696, // 9.2MHz typical DOTCLK from datasheet ++ .xres = 480, ++ .hsync_len = 41, // HLW from datasheet: 41 typ ++ .left_margin = 4, // HBP - HLW from datasheet: 45 - 41 = 4 ++ .right_margin = 8, // HFP from datasheet: 8 typ ++ .yres = 272, ++ .vsync_len = 10, // VLW from datasheet: 10 typ ++ .upper_margin = 2, // VBP - VLW from datasheet: 12 - 10 = 2 ++ .lower_margin = 4, // VFP from datasheet: 4 typ ++ .bpp = 16, ++ .sync = 0, // Hsync and Vsync both active low ++}; ++ ++static struct pxafb_mach_info gumstix_fb_info = { ++ .modes = &gumstix_fb_mode, ++ .num_modes = 1, ++ .lccr0 = LCCR0_Act | LCCR0_Sngl | LCCR0_Color, ++ .lccr3 = LCCR3_OutEnH | LCCR3_PixFlEdg | (0 << 30), ++ .pxafb_backlight_power = &gumstix_lcd_backlight, ++}; ++#endif ++ ++static struct platform_device verdex_audio_device = { ++ .name = "pxa2xx-ac97", ++ .id = -1, ++}; ++ ++static struct platform_device *devices[] __initdata = { ++ &verdex_audio_device, ++}; ++ ++/* PXA27x OHCI controller setup */ ++#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) ++static int ohci_verdex_init(struct device *dev) ++{ ++ // Turn on port 2 in host mode ++ UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE; ++ ++ /* See drivers/usb/host/ohci-pxa27x.c for further details but ++ ENABLE_PORT_ALL flag is equivalent to using this old sequence: ++ UHCHR = (UHCHR) & ++ ~(UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSEP3 | UHCHR_SSE); ++ */ ++ return 0; ++} ++ ++static struct pxaohci_platform_data verdex_ohci_platform_data = { ++ .port_mode = PMM_PERPORT_MODE, ++ .flags = ENABLE_PORT_ALL, ++ .init = ohci_verdex_init, ++}; ++ ++static void __init verdex_ohci_init(void) ++{ ++ pxa_set_ohci_info(&verdex_ohci_platform_data); ++} ++#else ++static void __init verdex_ohci_init(void) { ++ printk(KERN_INFO "Gumstix verdex host usb ohci is disabled\n"); ++} ++#endif ++ ++ ++#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE) ++static struct pxamci_platform_data verdex_mci_platform_data; ++ ++static int verdex_mci_init(struct device *dev, irq_handler_t detect_int, ++ void *data) ++{ ++ /* GPIO setup for MMC on the 120-pin connector is done in verdex_init. ++ * There is no card detect on a uSD connector so no interrupt to register. ++ * There is no WP detect GPIO line either. ++ */ ++ ++ return 0; ++} ++ ++static struct pxamci_platform_data verdex_mci_platform_data = { ++ .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, ++ .init = verdex_mci_init, ++}; ++ ++static void __init verdex_mmc_init(void) ++{ ++ pxa_set_mci_info(&verdex_mci_platform_data); ++} ++#else ++static void __init verdex_mmc_init(void) ++{ ++ printk(KERN_INFO "Gumstix verdex mmc disabled\n"); ++} ++#endif ++ ++#if defined(CONFIG_USB_GADGET_PXA2XX) || defined(CONFIG_USB_GADGET_PXA2XX_MODULE) ++static struct pxa2xx_udc_mach_info verdex_udc_info __initdata = { ++ .gpio_vbus = GPIO35, ++ .gpio_pullup = GPIO41, ++}; ++ ++static void __init verdex_udc_init(void) ++{ ++ pxa_set_udc_info(&verdex_udc_info); ++} ++#else ++static void __init verdex_udc_init(void) ++{ ++ printk(KERN_INFO "Gumstix verdex udc is disabled\n"); ++} ++#endif ++ ++#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) ++ ++#if defined(CONFIG_TOUCHSCREEN_TSC2003) || defined(CONFIG_TOUCHSCREEN_TSC2003_MODULE) ++ ++#define VERDEX_GPIO_PENDOWN 16 ++ ++static int tsc2003_init_platform_hw(void) ++{ ++ return 0; ++} ++ ++static void tsc2003_exit_platform_hw(void) ++{ ++ return; ++} ++ ++static void tsc2003_clear_penirq(void) ++{ ++ return; ++} ++ ++static int tsc2003_get_pendown_state(void) ++{ ++ return !gpio_get_value(VERDEX_GPIO_PENDOWN); ++} ++ ++static struct tsc2007_platform_data tsc2003_config = { ++ .model = 2003, ++ .x_plate_ohms = 100, ++ .get_pendown_state = tsc2003_get_pendown_state, ++ .clear_penirq = tsc2003_clear_penirq, ++ .init_platform_hw = tsc2003_init_platform_hw, ++ .exit_platform_hw = tsc2003_exit_platform_hw, ++}; ++#endif ++ ++static struct i2c_board_info __initdata verdex_i2c_board_info[] = { ++#if defined(CONFIG_RTC_DRV_DS1307) || defined(CONFIG_RTC_DRV_DS1307_MODULE) ++ ++ { ++ I2C_BOARD_INFO("rtc-ds1307", 0x68), ++ }, ++#endif ++#if defined(CONFIG_TOUCHSCREEN_TSC2003) || defined(CONFIG_TOUCHSCREEN_TSC2003_MODULE) ++ { ++ I2C_BOARD_INFO("tsc2003", 0x48), ++ .platform_data = &tsc2003_config, ++ .irq = IRQ_GPIO(VERDEX_GPIO_PENDOWN), ++ }, ++#endif ++}; ++ ++static struct i2c_pxa_platform_data verdex_i2c_pwr_info = { ++ .fast_mode = 1, ++}; ++ ++static struct i2c_pxa_platform_data verdex_i2c_info = { ++ .fast_mode = 1, ++}; ++ ++static void __init verdex_i2c_init(void) ++{ ++ printk(KERN_INFO "Initializing Gumstix verdex i2c\n"); ++ ++#if defined(CONFIG_TOUCHSCREEN_TSC2003) || defined(CONFIG_TOUCHSCREEN_TSC2003_MODULE) ++ if ((gpio_request(VERDEX_GPIO_PENDOWN, "TSC2003_PENDOWN") == 0) && ++ (gpio_direction_input(VERDEX_GPIO_PENDOWN) == 0)) { ++ gpio_export(VERDEX_GPIO_PENDOWN, 0); ++ } else { ++ printk(KERN_ERR "could not obtain gpio for TSC2003_PENDOWN\n"); ++ return; ++ } ++#endif ++ ++ i2c_register_board_info(0, verdex_i2c_board_info, ++ ARRAY_SIZE(verdex_i2c_board_info)); ++ pxa_set_i2c_info(&verdex_i2c_info); ++ pxa27x_set_i2c_power_info(&verdex_i2c_pwr_info); ++} ++#else ++static inline void verdex_i2c_init(void) {} ++#endif ++ ++#if defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE) ++static void __init verdex_pcmcia_init(void) ++{ ++ verdex_pcmcia_pin_config(); ++} ++#else ++static void __init verdex_pcmcia_init(void) { ++ printk(KERN_INFO "Gumstix verdex pcmcia is disabled\n"); ++} ++#endif ++ ++ ++static void __init verdex_init(void) ++{ ++ pxa2xx_mfp_config(ARRAY_AND_SIZE(verdex_pin_config)); ++ ++#ifdef CONFIG_FB_PXA_SHARP_LQ043_PSP ++ /* DISP must be always high while screen is on */ ++ gpio_direction_output(GPIO77, 0); ++ GPSR(GPIO77) = GPIO_bit(GPIO77); ++#endif ++ verdex_udc_init(); ++ verdex_mmc_init(); ++ verdex_ohci_init(); ++ verdex_i2c_init(); ++ verdex_init_smsc911x(); ++ verdex_pcmcia_init(); ++ ++#if defined(CONFIG_FB_PXA_ALPS_CDOLLAR) || defined(CONFIG_FB_PXA_SHARP_LQ043_PSP) || defined(CONFIG_FB_PXA_SAMSUNG_LTE430WQ_F0C) ++ printk(KERN_INFO "Initializing Gumstix verdex FB info\n"); ++ set_pxa_fb_info(&gumstix_fb_info); ++#endif ++ printk(KERN_INFO "Initializing Gumstix platform_add_devices\n"); ++ (void) platform_add_devices(devices, ARRAY_SIZE(devices)); ++} ++ ++MACHINE_START(GUMSTIX, "Gumstix verdex") ++ .phys_io = 0x40000000, ++ .boot_params = 0xa0000100, /* match u-boot bi_boot_params */ ++ .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, ++ .map_io = pxa_map_io, ++ .init_irq = pxa27x_init_irq, ++ .timer = &pxa_timer, ++ .init_machine = verdex_init, ++MACHINE_END ++ +--- a/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h ++++ b/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h +@@ -109,6 +109,7 @@ + #define GPIO54_nPCE_2 MFP_CFG_OUT(GPIO54, AF2, DRIVE_HIGH) + #define GPIO78_nPCE_2 MFP_CFG_OUT(GPIO78, AF1, DRIVE_HIGH) + #define GPIO87_nPCE_2 MFP_CFG_IN(GPIO87, AF1) ++#define GPIO105_nPCE_2 MFP_CFG_OUT(GPIO105, AF1, DRIVE_HIGH) + #define GPIO55_nPREG MFP_CFG_OUT(GPIO55, AF2, DRIVE_HIGH) + #define GPIO50_nPIOR MFP_CFG_OUT(GPIO50, AF2, DRIVE_HIGH) + #define GPIO51_nPIOW MFP_CFG_OUT(GPIO51, AF2, DRIVE_HIGH) diff --git a/target/linux/pxa/patches/001-pm.patch b/target/linux/pxa/patches/001-pm.patch deleted file mode 100644 index 799b9bd53..000000000 --- a/target/linux/pxa/patches/001-pm.patch +++ /dev/null @@ -1,869 +0,0 @@ -diff -NurbwB linux-2.6.17/arch/arm/mach-pxa/pm.c linux-2.6.17-patched/arch/arm/mach-pxa/pm.c ---- linux-2.6.17/arch/arm/mach-pxa/pm.c 2006-06-17 18:49:35.000000000 -0700 -+++ linux-2.6.17-patched/arch/arm/mach-pxa/pm.c 2006-09-11 10:58:41.000000000 -0700 -@@ -10,35 +10,50 @@ - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License. - */ -+ - #include - #include --#include --#include -+#include -+#include -+#include -+#include -+#include - #include --#include - - #include - #include - #include --#include -+#include -+#include - #include - #include - #include - -+/**/ -+#include -+/**/ -+//kirti -+#include -+//kirti~ - - /* - * Debug macros - */ --#undef DEBUG -+#define DEBUG -+ -+extern void pxa_cpu_suspend(void); -+extern void pxa_cpu_resume(void); -+ -+int pm_pwronoff; -+/*Angelia Additions */ -+int pm_pedr=0; -+EXPORT_SYMBOL(pm_pwronoff); -+EXPORT_SYMBOL(pm_pedr); -+ - - #define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x - #define RESTORE(x) x = sleep_save[SLEEP_SAVE_##x] - --#define RESTORE_GPLEVEL(n) do { \ -- GPSR##n = sleep_save[SLEEP_SAVE_GPLR##n]; \ -- GPCR##n = ~sleep_save[SLEEP_SAVE_GPLR##n]; \ --} while (0) -- - /* - * List of global PXA peripheral registers to preserve. - * More ones like CP and general purpose register values are preserved -@@ -46,97 +61,405 @@ - */ - enum { SLEEP_SAVE_START = 0, - -- SLEEP_SAVE_GPLR0, SLEEP_SAVE_GPLR1, SLEEP_SAVE_GPLR2, SLEEP_SAVE_GPLR3, -- SLEEP_SAVE_GPDR0, SLEEP_SAVE_GPDR1, SLEEP_SAVE_GPDR2, SLEEP_SAVE_GPDR3, -- SLEEP_SAVE_GRER0, SLEEP_SAVE_GRER1, SLEEP_SAVE_GRER2, SLEEP_SAVE_GRER3, -- SLEEP_SAVE_GFER0, SLEEP_SAVE_GFER1, SLEEP_SAVE_GFER2, SLEEP_SAVE_GFER3, -- SLEEP_SAVE_PGSR0, SLEEP_SAVE_PGSR1, SLEEP_SAVE_PGSR2, SLEEP_SAVE_PGSR3, -- -- SLEEP_SAVE_GAFR0_L, SLEEP_SAVE_GAFR0_U, -- SLEEP_SAVE_GAFR1_L, SLEEP_SAVE_GAFR1_U, -- SLEEP_SAVE_GAFR2_L, SLEEP_SAVE_GAFR2_U, -- SLEEP_SAVE_GAFR3_L, SLEEP_SAVE_GAFR3_U, -+ SLEEP_SAVE_OSCR, SLEEP_SAVE_OIER, -+ SLEEP_SAVE_OSMR0, SLEEP_SAVE_OSMR1, SLEEP_SAVE_OSMR2, SLEEP_SAVE_OSMR3, - -- SLEEP_SAVE_PSTR, -+ SLEEP_SAVE_GPDR0, SLEEP_SAVE_GPDR1, SLEEP_SAVE_GPDR2, -+ SLEEP_SAVE_GRER0, SLEEP_SAVE_GRER1, SLEEP_SAVE_GRER2, -+ SLEEP_SAVE_GFER0, SLEEP_SAVE_GFER1, SLEEP_SAVE_GFER2, -+ SLEEP_SAVE_GAFR0_L, SLEEP_SAVE_GAFR1_L, SLEEP_SAVE_GAFR2_L, -+ SLEEP_SAVE_GAFR0_U, SLEEP_SAVE_GAFR1_U, SLEEP_SAVE_GAFR2_U, -+ -+ SLEEP_SAVE_FFIER, SLEEP_SAVE_FFLCR, SLEEP_SAVE_FFMCR, -+ SLEEP_SAVE_FFSPR, SLEEP_SAVE_FFISR, -+ SLEEP_SAVE_FFDLL, SLEEP_SAVE_FFDLH,SLEEP_SAVE_FFFCR, -+ -+ SLEEP_SAVE_STIER, SLEEP_SAVE_STLCR, SLEEP_SAVE_STMCR, -+ SLEEP_SAVE_STSPR, SLEEP_SAVE_STISR, -+ SLEEP_SAVE_STDLL, SLEEP_SAVE_STDLH, -+ -+ SLEEP_SAVE_BTIER, SLEEP_SAVE_BTLCR, SLEEP_SAVE_BTMCR, -+ SLEEP_SAVE_BTSPR, SLEEP_SAVE_BTISR, -+ SLEEP_SAVE_BTDLL, SLEEP_SAVE_BTDLH, - - SLEEP_SAVE_ICMR, - SLEEP_SAVE_CKEN, - --#ifdef CONFIG_PXA27x -- SLEEP_SAVE_MDREFR, -- SLEEP_SAVE_PWER, SLEEP_SAVE_PCFR, SLEEP_SAVE_PRER, -- SLEEP_SAVE_PFER, SLEEP_SAVE_PKWR, --#endif -+ SLEEP_SAVE_LCCR0, SLEEP_SAVE_LCCR1, SLEEP_SAVE_LCCR2,SLEEP_SAVE_LCCR3, -+ SLEEP_SAVE_TMEDCR, SLEEP_SAVE_FDADR0, SLEEP_SAVE_FSADR0,SLEEP_SAVE_FIDR0,SLEEP_SAVE_FDADR1, -+ SLEEP_SAVE_LDCMD0, -+ -+ SLEEP_SAVE_NSSCR0,SLEEP_SAVE_NSSCR1,SLEEP_SAVE_NSSSR,SLEEP_SAVE_NSSITR,SLEEP_SAVE_NSSDR, -+ SLEEP_SAVE_NSSTO,SLEEP_SAVE_NSSPSP, - -- SLEEP_SAVE_CKSUM, - -+ SLEEP_SAVE_CKSUM, - SLEEP_SAVE_SIZE - }; - -+/**/ -+#define UART_DTR 1 -+#define UART_RTS 2 -+ -+/**/ - --int pxa_pm_enter(suspend_state_t state) -+int pm_do_suspend(void) - { - unsigned long sleep_save[SLEEP_SAVE_SIZE]; - unsigned long checksum = 0; -- struct timespec delta, rtc; - int i; -+ int valbefore,valafter,valafter1; -+ int gpsr0,gpsr1,gpsr2; - extern void pxa_cpu_pm_enter(suspend_state_t state); - --#ifdef CONFIG_IWMMXT -- /* force any iWMMXt context to ram **/ -- iwmmxt_task_disable(NULL); --#endif -+ // YoKu 16Feb06 GPIO Changed -----> -+ -+ PGSR2 |= GPIO_bit(78); -+/* if(GPLR2 & GPIO_bit(78)) // LCD Reset Pin -+ PGSR2 |= GPIO_bit(78); -+ else -+ PGSR2 &= ~GPIO_bit(78); */ -+ GPDR0 &= ~GPIO_bit(0); -+ GPDR0 &= ~GPIO_bit(1); -+ GPDR0 &= ~GPIO_bit(3); //Tushar: 20 apr GPIO3 configured as input -+ GPDR0 &= ~GPIO_bit(2); -+// GPDR0 &= ~GPIO_bit(5); -+// GPDR0 &= ~GPIO_bit(6); -+// GPDR0 &= ~GPIO_bit(7); -+// GPDR0 &= ~GPIO_bit(8); -+ -+ -+// KeyCol pin Status in sleep mode -+ PGSR0 &= ~GPIO_bit(9); //19 -+ PGSR0 &= ~GPIO_bit(10); //20 -+ PGSR0 &= ~GPIO_bit(11); //21 -+ PGSR0 &= ~GPIO_bit(12); //22 -+ PGSR0 &= ~GPIO_bit(13); //23 -+ PGSR0 &= ~GPIO_bit(14); //24 -+ -+ printk("KER_PM: Setting up wakeup sources 26May06\n"); -+ -+ // KeyPad -+ //printk("KER_PM: Uncommented key pad wakeup sources\n"); -+ PWER |= GPIO_bit(5); //11 -+ PWER |= GPIO_bit(6); //12 -+ PWER |= GPIO_bit(7); //13 -+ PWER |= GPIO_bit(8); //14 -+ PFER |= GPIO_bit(5); //11 -+ PFER |= GPIO_bit(6); //12 -+ PFER |= GPIO_bit(7); //13 -+ PFER |= GPIO_bit(8); //14 -+ PRER |= GPIO_bit(5); //11 -+ PRER |= GPIO_bit(6); //12 -+ PRER |= GPIO_bit(7); //13 -+ PRER |= GPIO_bit(8); //14 -+ -+ // USB -+ PWER |= GPIO_bit(3); //6 -+ PFER |= GPIO_bit(3); //6 -+ PRER |= GPIO_bit(3); //6 -+ -+ // PMU -+ PWER |= GPIO_bit(2); //4 -+ PFER |= GPIO_bit(2); //4 -+ PRER |= GPIO_bit(2); //4 -+ -+ // Anup : GSM RI -+ PWER |= GPIO_bit(0); //0 -+ PFER |= GPIO_bit(0); //0 -+ PRER |= GPIO_bit(0); //0 -+ // anup prashant : for gsm reset problem 19 may 2006 -+ //GPDR0 |= GPIO_bit(18); YoKu Commented this line, GPIO18 should be i/p pin to avoid GSM Reset pulse -+ PGSR0 |= GPIO_bit(18); // GSM reset pin -+ PGSR0 |= GPIO_bit(0); // -+ PGSR1 |= GPIO_bit(38); // commneted .18 apr -+ // <----- YoKu -+ -+ // YoKu -----> -+ // When exiting from sleep mode, 10us Low pulse comes on GSM Reset and Pwr pin -+ // to avoid this configure GPIO 18,80 as input pins before going to sleep mode -+ GPDR0 &= ~GPIO_bit(18); -+ //GPDR2 &= ~GPIO_bit(80); -+ // <----- YoKu -+ -+ //kirti for RTC -+ PWER |= PWER_RTC; -+ //kirti cli(); -+ local_irq_disable(); -+ //kirti clf(); -+ local_fiq_disable(); -+ leds_event(led_stop); -+ -+ /* Put Current time into RCNR */ -+ RCNR = xtime.tv_sec; - -- /* preserve current time */ -- rtc.tv_sec = RCNR; -- rtc.tv_nsec = 0; -- save_time_delta(&delta, &rtc); -+ printk("11May2006 KERR: pgsr0=0x%08x pgsr1=0x%08x pgsr2= 0x%08x\n",PGSR0,PGSR1,PGSR2); -+ printk("KER_PM_DELAY: SSCR Going to Sleep at RCNR =%d\n\n\n\n\n\n",RCNR); -+ -+ /* -+ * Temporary solution. This won't be necessary once -+ * we move pxa support into the serial driver -+ * Save the FF UART -+ */ -+ -+ // Anup : commented for power saving mode problem -+ printk("\nPM: Why doesnt it prnt?? 26May06\n"); -+ printk("\nPM : GSM Sleep Mode enabled"); -+ -+ -+ FFMCR &= ~UART_RTS; -+ udelay(2000); -+ udelay(2000); -+ FFMCR &= ~UART_DTR ; -+ udelay(2000); -+ -+ udelay(2000); -+ // rupali -+ // Anup : Do not check here -+/* if(!pm_pwronoff) -+ { -+ printk("\nPM : Modem Control Register = %x " , FFMCR); -+ while( FFMSR & 0x00000020) -+ { -+ printk("\nPM : FFFSR = %x " , FFMSR); -+ } -+ } */ -+ udelay(2000); -+ -+//Tushar: 19 apr -+// NSSCR0 &= 0xFFFFFF7F; -+// printk("\nPM: NSSCR0 = %x" ,NSSCR0 ); -+ -+ SAVE(FFIER); -+ SAVE(FFLCR); -+ SAVE(FFMCR); -+ SAVE(FFSPR); -+ SAVE(FFISR); -+ FFLCR |= 0x80; -+ SAVE(FFDLL); -+ SAVE(FFDLH); -+ SAVE(FFFCR); -+ FFLCR &= 0xef; -+ -+ SAVE(STIER); -+ SAVE(STLCR); -+ SAVE(STMCR); -+ SAVE(STSPR); -+ SAVE(STISR); -+ STLCR |= 0x80; -+ SAVE(STDLL); -+ SAVE(STDLH); -+ STLCR &= 0xef; -+ -+ SAVE(BTIER); -+ SAVE(BTLCR); -+ SAVE(BTMCR); -+ SAVE(BTSPR); -+ SAVE(BTISR); -+ BTLCR |= 0x80; -+ SAVE(BTDLL); -+ SAVE(BTDLH); -+ BTLCR &= 0xef; -+ -+ /* save vital registers */ -+ SAVE(OSCR); -+ SAVE(OSMR0); -+ SAVE(OSMR1); -+ SAVE(OSMR2); -+ SAVE(OSMR3); -+ SAVE(OIER); - -- SAVE(GPLR0); SAVE(GPLR1); SAVE(GPLR2); - SAVE(GPDR0); SAVE(GPDR1); SAVE(GPDR2); - SAVE(GRER0); SAVE(GRER1); SAVE(GRER2); - SAVE(GFER0); SAVE(GFER1); SAVE(GFER2); -- SAVE(PGSR0); SAVE(PGSR1); SAVE(PGSR2); -- - SAVE(GAFR0_L); SAVE(GAFR0_U); - SAVE(GAFR1_L); SAVE(GAFR1_U); - SAVE(GAFR2_L); SAVE(GAFR2_U); - --#ifdef CONFIG_PXA27x -- SAVE(MDREFR); -- SAVE(GPLR3); SAVE(GPDR3); SAVE(GRER3); SAVE(GFER3); SAVE(PGSR3); -- SAVE(GAFR3_L); SAVE(GAFR3_U); -- SAVE(PWER); SAVE(PCFR); SAVE(PRER); -- SAVE(PFER); SAVE(PKWR); --#endif -+ // YoKu 23Feb06 Added To save LCD Registers, updated by kirti 24Feb06 -----> -+ SAVE(LCCR0); SAVE(LCCR1); SAVE(LCCR2); SAVE(LCCR3); -+ SAVE(FDADR0); -+ SAVE(FDADR1); -+ LCSR = 0xffffffff; /* Clear LCD Status Register */ -+ -+// LCCR0 &= ~LCCR0_LDM; /* Enable LCD Disable Done Interrupt */ -+// LCCR0 |= LCCR0_DIS; /* Disable LCD Controller */ -+ -+ SAVE(LDCMD0); -+ // <----- YoKu -+ -+// LCCR0 &= ~LCCR0_LDM; /* Enable LCD Disable Done Interrupt */ -+// LCCR0 |= LCCR0_DIS; /* Disable LCD Controller */ -+ - - SAVE(ICMR); - ICMR = 0; - - SAVE(CKEN); -- SAVE(PSTR); -+ CKEN = 0; -+ -+ // Anup : For Wifi power saving mode 2 May 2006 -+ SAVE(NSSCR0);SAVE(NSSCR1);SAVE(NSSSR);SAVE(NSSITR);SAVE(NSSDR);SAVE(NSSTO); -+ SAVE(NSSPSP); -+ printk("\nMY favourite mode in life.......sleep.....\n"); -+ - - /* Note: wake up source are set up in each machine specific files */ - -+ /*Changes to keep the right sim selected */ -+ gpsr0 = GPLR0; -+ gpsr1 = GPLR1; -+ gpsr2 = GPLR2; -+ -+ /*Sim 1 selected */ -+ // YoKu GPIOs Changed -----> -+ if( (GPLR0 & GPIO_bit(21)) && !(GPLR0 & GPIO_bit(22)) ) // 62,63 -+ { -+ PGSR0 |= GPIO_bit(21) ; //62 -+ PGSR0 &= ~GPIO_bit(22) ; //63 -+ } -+ else if (!(GPLR0 & GPIO_bit(21)) && (GPLR0 & GPIO_bit(22)) ) // 62,63 -+ { -+ PGSR0 |= GPIO_bit(22) ; //63 -+ PGSR0 &= ~GPIO_bit(21) ; //62 -+ } /* sim 2*/ -+ // <----- YoKu -+ - /* clear GPIO transition detect bits */ - GEDR0 = GEDR0; GEDR1 = GEDR1; GEDR2 = GEDR2; --#ifdef CONFIG_PXA27x -- GEDR3 = GEDR3; --#endif - - /* Clear sleep reset status */ - RCSR = RCSR_SMR; - -+ /* set resume return address */ -+ PSPR = virt_to_phys(pxa_cpu_resume); -+ - /* before sleeping, calculate and save a checksum */ - for (i = 0; i < SLEEP_SAVE_SIZE - 1; i++) - checksum += sleep_save[i]; - sleep_save[SLEEP_SAVE_CKSUM] = checksum; - -- /* *** go zzz *** */ -- pxa_cpu_pm_enter(state); -+ PGSR0 |= GPIO_bit(15); //sidd for wake from Sleep 15, YoKu Comented ?? GPIO15 was ChipSelect -+ PGSR2 |= GPIO_bit(80); //sidd for GSM Engine 69, YoKu GPIO Changed Anup :commented -+ -+ PGSR1 &= ~GPIO_bit(33); //Tushar: BT Codec Power Down -+ -+ PGSR0 &= ~GPIO_bit(23); //Tushar: BGW200 Regulator OFF -+ -+// GPDR1 |= GPIO_bit(49); //Tushar: LCD Serial Data in changed to O/P -+ -+// PGSR1 &= ~GPIO_bit(48);//Tushar: LCD Serial Pins -+ -+// PGSR1 &= ~GPIO_bit(49); -+ -+// PGSR1 &= ~GPIO_bit(50); -+ -+// PGSR1 |= GPIO_bit(51); -+ -+// PGSR1 &= 0x03FFFFFF;//Tushar: 24apr LCD datalines -+// PGSR2 &= 0xFFFFFC00; -+ -+ PGSR0 &= ~GPIO_bit(24); //Tushar: Mux Control Signals -+ -+ PGSR0 &= ~GPIO_bit(25); -+ -+ PGSR0 &= ~GPIO_bit(26); -+ -+ PGSR0 &= ~GPIO_bit(27); -+ -+ // GPDR0 |= GPIO_bit(17); //Tushar: unused GPIOs 19apr -+ // GPCR0 |= GPIO_bit(17); -+ PGSR0 &= ~GPIO_bit(17); -+ -+// GPDR1 |= GPIO_bit(56); //Tushar: unused GPIOs 19apr -+ // GPCR1 |= GPIO_bit(56); -+ PGSR1 &= ~GPIO_bit(56); -+ -+// GPDR2 |= GPIO_bit(79);//Tushar: unused GPIOs 19apr -+// GPCR2 |= GPIO_bit(79); -+ PGSR2 &= ~GPIO_bit(79); -+ -+// GPDR1 |= 0x03F00000;//Tushar: unused GPIOs 19apr -+// GPCR1 |= 0x03F00000; -+ PGSR1 &= 0xFC0FFFFF; -+ -+ -+ GPDR0 |= GPIO_bit(19);//Tushar: SIM Present Inputs configured as outputs -+ GPDR0 |= GPIO_bit(20); -+ PGSR0 &= ~GPIO_bit(19); -+ PGSR0 &= ~GPIO_bit(20); -+ -+ -+//Tushar: 25apr FFRTS FFDTR & FFTXD -+ -+ PGSR1 |= GPIO_bit(39); -+ PGSR1 |= GPIO_bit(40); -+ PGSR1 |= GPIO_bit(41); -+/* -+ PGSR2 &= GPIO_bit(81); //Tushar: 24apr NSSP pins -+ PGSR2 &= GPIO_bit(82); -+ PGSR2 &= GPIO_bit(83); -+ -+ PGSR2 |= GPIO_bit(74); -+ PGSR2 |= GPIO_bit(75); -+ PGSR2 |= GPIO_bit(76); -+ PGSR2 |= GPIO_bit(77); -+*/ -+ if(pm_pwronoff) -+ { -+ /* We are here bcos of pressing of on off switch -+ We wake up now only on pwr switch */ -+ printk("Anup: Before sleeping \n"); -+ pm_pwronoff = 0; -+ PGSR0 &= ~GPIO_bit(23); //7 YoKu GPIO Changed -+ //PGSR2 &= ~GPIO_bit(64); //64 YoKu Commented in PWG500 64,7 was WifiReg, IN PWG600 it is 23 -+ -+ PGSR2 &= ~GPIO_bit(80); //69 YoKu GPIO Changed Anup : commnented -+ PWER = 0x0004; // YoKu Changed from 0x10 to 0x04 (i.e GPIO 4 -> 2) -+ PFER = 0x0004; -+ PRER = 0x0004; -+ -+// YoKu ----> -+// 11May2006 To reduce Power Off current from 7mA to 4mA -+ GPDR0 |= GPIO_bit(16); // BTReset o/p Low -+ PGSR0 &= ~GPIO_bit(16); -+ -+ GPDR1 |= GPIO_bit(33); // nMEC/nPDI o/p Low -+ PGSR1 &= ~GPIO_bit(33); -+ -+ GPDR1 |= GPIO_bit(45); // BTRTS o/p High -+ PGSR1 |= GPIO_bit(45); -+ -+ -+ GPDR1 |= GPIO_bit(43); // BTTXD o/p High -+ PGSR1 |= GPIO_bit(43); -+ -+ GPDR1 &= ~GPIO_bit(42); // BTRXD i/p -+ GPDR1 &= ~GPIO_bit(44); // BTCTS i/p -+// <---- YoKu -+ -+ PSPR = virt_to_phys(pxa_cpu_resume); // YoKu 29July05 to Resume from where u left, Original PSPR = 0 -+ } -+ -+ valbefore = GPLR0 & (GPIO_bit(21) | GPIO_bit(22)) ; // 62,63 YoKu GPIO Changed -+ -+ //printk("Anup: Before sleeping gpsr0=0x%08x gpsr1=0x%08x gpsr2= 0x%08x\n",gpsr0,gpsr1,gpsr2); -+ //kirti pxa_cpu_suspend(); -+ //printk("KER_PM: Going to sleep zzzzzzzzz\n"); -+ -+// OSCC |= OSCC_OON; //Tushar: 18 apr. enable 32.768KHz Oscillator -+ -+// PCFR |= PCFR_OPDE; //Tushar: 18 apr. disable 3.6864MHz oscillator -+ -+ pxa_cpu_pm_enter(PM_SUSPEND_MEM); - - cpu_init(); - -+ //kirti~ -+ /**/ -+ //FFMCR |= UART_DTR ; -+ /**/ -+ - /* after sleeping, validate the checksum */ - checksum = 0; - for (i = 0; i < SLEEP_SAVE_SIZE - 1; i++) -@@ -141,39 +464,63 @@ - checksum = 0; - for (i = 0; i < SLEEP_SAVE_SIZE - 1; i++) - checksum += sleep_save[i]; -- - /* if invalid, display message and wait for a hardware reset */ -- if (checksum != sleep_save[SLEEP_SAVE_CKSUM]) { -+ if (checksum != sleep_save[SLEEP_SAVE_CKSUM]) -+ { - #ifdef CONFIG_ARCH_LUBBOCK - LUB_HEXLED = 0xbadbadc5; - #endif - while (1) -- pxa_cpu_pm_enter(state); -+ { -+ printk("\n\n\nKERN_PM: CRC Error!!! after wakeup\n\n\n"); // YoKu 25May06 -+ - } - -+ } -+ valafter = GPLR0 & (GPIO_bit(21) | GPIO_bit(22)) ; //62,63 YoKu GPIO Changed -+ pm_pedr = PEDR ; -+ - /* ensure not to come back here if it wasn't intended */ - PSPR = 0; - -+ /*printk("YoKu: gafr0_L=0x%08x gafr0_U=0x%08x\n",GAFR0_L,GAFR0_U); -+ printk(" gafr1_L= 0x%08x gafr1_U= 0x%08x\n",GAFR1_L,GAFR1_U); -+ printk(" gafr2_L= 0x%08x gafr2_U= 0x%08x\n",GAFR2_L,GAFR2_U); */ - /* restore registers */ -- RESTORE_GPLEVEL(0); RESTORE_GPLEVEL(1); RESTORE_GPLEVEL(2); - RESTORE(GPDR0); RESTORE(GPDR1); RESTORE(GPDR2); -+ RESTORE(GRER0); RESTORE(GRER1); RESTORE(GRER2); -+ RESTORE(GFER0); RESTORE(GFER1); RESTORE(GFER2); - RESTORE(GAFR0_L); RESTORE(GAFR0_U); - RESTORE(GAFR1_L); RESTORE(GAFR1_U); - RESTORE(GAFR2_L); RESTORE(GAFR2_U); -- RESTORE(GRER0); RESTORE(GRER1); RESTORE(GRER2); -- RESTORE(GFER0); RESTORE(GFER1); RESTORE(GFER2); -- RESTORE(PGSR0); RESTORE(PGSR1); RESTORE(PGSR2); - --#ifdef CONFIG_PXA27x -- RESTORE(MDREFR); -- RESTORE_GPLEVEL(3); RESTORE(GPDR3); -- RESTORE(GAFR3_L); RESTORE(GAFR3_U); -- RESTORE(GRER3); RESTORE(GFER3); RESTORE(PGSR3); -- RESTORE(PWER); RESTORE(PCFR); RESTORE(PRER); -- RESTORE(PFER); RESTORE(PKWR); --#endif - -- PSSR = PSSR_RDH | PSSR_PH; -+ // Anup : For Wifi power saving mode 2 May 2006 -+ RESTORE(NSSCR0);RESTORE(NSSCR1);RESTORE(NSSSR);RESTORE(NSSITR);RESTORE(NSSDR);RESTORE(NSSTO); -+ RESTORE(NSSPSP); -+ -+ // PSSR = PSSR_PH; -+ GPSR0 = gpsr0; -+ GPSR1 = gpsr1; -+ GPSR2 = gpsr2; -+ -+ // Anup : check values of these registers -+// printk("YoKu: gpsr0=0x%08x gpsr1=0x%08x gpsr2= 0x%08x\n",gpsr0,gpsr1,gpsr2); -+ //sidd -+ -+ GPCR0 |= ~gpsr0; -+ GPCR1 |= ~gpsr1; -+ GPCR2 |= ~gpsr2; -+ -+ -+ PSSR = ~PSSR_PH; -+ -+ RESTORE(OSMR0); -+ RESTORE(OSMR1); -+ RESTORE(OSMR2); -+ RESTORE(OSMR3); -+ RESTORE(OSCR); -+ RESTORE(OIER); - - RESTORE(CKEN); - -@@ -181,62 +528,181 @@ - ICCR = 1; - RESTORE(ICMR); - -- RESTORE(PSTR); -+ /* -+ * Temporary solution. This won't be necessary once -+ * we move pxa support into the serial driver. -+ * Restore the FF UART. -+ */ -+ RESTORE(BTMCR); -+ RESTORE(BTSPR); -+ RESTORE(BTLCR); -+ BTLCR |= 0x80; -+ RESTORE(BTDLH); -+ RESTORE(BTDLL); -+ RESTORE(BTLCR); -+ RESTORE(BTISR); -+ BTFCR = 0xc7; -+ RESTORE(BTIER); -+ -+ RESTORE(STMCR); -+ RESTORE(STSPR); -+ RESTORE(STLCR); -+ STLCR |= 0x80; -+ RESTORE(STDLH); -+ RESTORE(STDLL); -+ RESTORE(STLCR); -+ RESTORE(STISR); -+ STFCR = 0xc7; -+ RESTORE(STIER); -+ -+ RESTORE(FFMCR); -+ RESTORE(FFSPR); -+ RESTORE(FFLCR); -+ FFLCR |= 0x80; -+ RESTORE(FFDLH); -+ RESTORE(FFDLL); -+ RESTORE(FFLCR); -+ RESTORE(FFISR); -+ RESTORE(FFFCR); -+ FFFCR = 0xc7; -+ RESTORE(FFIER); -+ -+ // YoKu 23Feb06 Added To save LCD Registers, updated by kirti 24Feb06 -----> -+ RESTORE(LCCR3); RESTORE(LCCR2); RESTORE(LCCR1); -+ LCCR0=RESTORE(LCCR0) & ~LCCR0_ENB; -+ RESTORE(FDADR0); RESTORE(FDADR1); -+ LCCR0 |= LCCR0_ENB; -+ -+ // <----- YoKu - - /* restore current time */ -- rtc.tv_sec = RCNR; -- restore_time_delta(&delta, &rtc); -+ xtime.tv_sec = RCNR; -+ -+ valafter1 = GPLR0 & (GPIO_bit(21) | GPIO_bit(22)) ; //62,63 YoKu GPIO Changed -+ -+// SSCR0 &=0xFFFFFFFF; -+// printk("\nPM : val of SSCR0 = %x " , SSCR0); -+ -+ printk("KER_PM: Resumed at RCNR = %d RTSR= %x\n",RCNR,RTSR); -+ -+ printk("YoKu: pgsr0=0x%08x pgsr1=0x%08x pgsr2= 0x%08x\n",PGSR0,PGSR1,PGSR2); -+ -+ OSMR0 = 0; /* set initial match at 0 */ -+ OSSR = 0xf; /* clear status on all timers */ -+ OIER |= OIER_E0; /* enable match on timer 0 to cause interrupts */ -+ OSCR = 0; /* initialize free-running timer, force first match */ -+ -+ leds_event(led_start); -+ //kirti sti(); -+ // call i2c reset here----> -+ ICR = ICR_UR; -+ ISR = 0x7FF; //I2C_ISR_INIT; -+ ICR &= ~ICR_UR; -+ -+ ISAR = 0x32;//i2c->slave_addr; -+ -+ /* set control register values */ -+ ICR = (ICR_BEIE | ICR_IRFIE | ICR_ITEIE | ICR_GCD | ICR_SCLE);//I2C_ICR_INIT; -+ -+ /* enable unit */ -+ ICR |= ICR_IUE; -+ udelay(100); -+ //<----- -+ -+ local_irq_enable(); - --#ifdef DEBUG -- printk(KERN_DEBUG "*** made it back from resume\n"); --#endif - - return 0; - } - --EXPORT_SYMBOL_GPL(pxa_pm_enter); -- - unsigned long sleep_phys_sp(void *sp) - { - return virt_to_phys(sp); - } - -+#ifdef CONFIG_SYSCTL - /* -- * Called after processes are frozen, but before we shut down devices. -+ * ARGH! ACPI people defined CTL_ACPI in linux/acpi.h rather than -+ * linux/sysctl.h. -+ * -+ * This means our interface here won't survive long - it needs a new -+ * interface. Quick hack to get this working - use sysctl id 9999. - */ --int pxa_pm_prepare(suspend_state_t state) --{ -- extern int pxa_cpu_pm_prepare(suspend_state_t state); -+#warning ACPI broke the kernel, this interface needs to be fixed up. -+#define CTL_ACPI 9999 -+#define ACPI_S1_SLP_TYP 19 - -- return pxa_cpu_pm_prepare(state); -+/* -+ * Send us to sleep. -+ */ -+static int sysctl_pm_do_suspend(ctl_table *ctl, int write, struct file *filp, -+ void *buffer, size_t *lenp) -+{ -+ int retval=0; -+ unsigned i , clock ; -+ if (write) -+ { -+ char buf[16], *p; -+ unsigned int sleepsec; -+ int len,left = *lenp; -+ -+ len = left; -+ if (left > sizeof(buf)) -+ left = sizeof(buf); -+ if (!copy_from_user(buf, buffer, left)) -+ { -+ buf[sizeof(buf) - 1] = '\0'; -+ sleepsec = simple_strtoul(buf, &p, 0); -+ printk("\nSleeping %d Pwronoff=%x RCNR=%d\n",sleepsec,pm_pwronoff,RCNR); -+ printk("\nPWER %x PFER=%x PRER=%x\n",PWER,PFER,PRER); -+ RTAR = xtime.tv_sec + sleepsec; -+ printk("\nRTAR=%d \n",RTAR); -+ } -+ } -+ retval = pm_do_suspend(); -+ clock = get_memclk_frequency_10khz(); -+ return retval; - } -- --EXPORT_SYMBOL_GPL(pxa_pm_prepare); - - /* -- * Called after devices are re-setup, but before processes are thawed. -+static struct ctl_table pm_table[] = -+{ -+ {ACPI_S1_SLP_TYP, "suspend", NULL, 0, 0600, NULL, (proc_handler *)&sysctl_pm_do_suspend}, -+ {0} -+}; - */ --int pxa_pm_finish(suspend_state_t state) -+static struct ctl_table pm_table[] = - { -- return 0; -+ { -+ ctl_name: ACPI_S1_SLP_TYP, -+ procname: "suspend", -+ mode: 0600, -+ proc_handler: (proc_handler *)&sysctl_pm_do_suspend, -+ }, -+ { -+ ctl_name: 0 - } -+}; - --EXPORT_SYMBOL_GPL(pxa_pm_finish); -+static struct ctl_table pm_dir_table[] = -+{ -+ {CTL_ACPI, "pm", NULL, 0, 0555, pm_table}, -+ {0} -+}; - - /* -- * Set to PM_DISK_FIRMWARE so we can quickly veto suspend-to-disk. -+ * Initialize power interface - */ --static struct pm_ops pxa_pm_ops = { -- .pm_disk_mode = PM_DISK_FIRMWARE, -- .prepare = pxa_pm_prepare, -- .enter = pxa_pm_enter, -- .finish = pxa_pm_finish, --}; -- --static int __init pxa_pm_init(void) -+static int __init pm_init(void) - { -- pm_set_ops(&pxa_pm_ops); -+ register_sysctl_table(pm_dir_table, 1); -+ /*Adi: Adjust for clock value to RTC -+ RTTR = RTC clk - 1*/ -+ RTTR = 32913; -+ - return 0; - } - --device_initcall(pxa_pm_init); -+__initcall(pm_init); -+ -+#endif -diff -NurbwB linux-2.6.17/arch/arm/mach-pxa/sleep.S linux-2.6.17-patched/arch/arm/mach-pxa/sleep.S ---- linux-2.6.17/arch/arm/mach-pxa/sleep.S 2006-06-17 18:49:35.000000000 -0700 -+++ linux-2.6.17-patched/arch/arm/mach-pxa/sleep.S 2006-09-11 13:07:05.000000000 -0700 -@@ -79,7 +79,7 @@ - ldr r5, [r4] - - @ enable SDRAM self-refresh mode -- orr r5, r5, #MDREFR_SLFRSH -+ orr r5, r5, #(MDREFR_SLFRSH | MDREFR_APD) - - #ifdef CONFIG_PXA27x - @ set SDCLKx divide-by-2 bits (this is part of a workaround for Errata 50) -diff -NurbwB linux-2.6.17/include/asm-arm/arch-pxa/pxa-regs.h linux-2.6.17-patched/include/asm-arm/arch-pxa/pxa-regs.h ---- linux-2.6.17/include/asm-arm/arch-pxa/pxa-regs.h 2006-06-17 18:49:35.000000000 -0700 -+++ linux-2.6.17-patched/include/asm-arm/arch-pxa/pxa-regs.h 2006-09-11 11:04:36.000000000 -0700 -@@ -1748,6 +1748,15 @@ - #define SSTO_P(x) (*(((x) == 1) ? &SSTO_P1 : ((x) == 2) ? &SSTO_P2 : ((x) == 3) ? &SSTO_P3 : NULL)) - #define SSPSP_P(x) (*(((x) == 1) ? &SSPSP_P1 : ((x) == 2) ? &SSPSP_P2 : ((x) == 3) ? &SSPSP_P3 : NULL)) - -+#define NSSCR0 __REG(0x41400000) /* SSP Port 1 Control Register 0 */ -+#define NSSCR1 __REG(0x41400004) /* SSP Port 1 Control Register 1 */ -+#define NSSSR __REG(0x41400008) /* SSP Port 1 Status Register */ -+#define NSSITR __REG(0x4140000C) /* SSP Port 1 Interrupt Test Register */ -+#define NSSDR __REG(0x41400010) /* (Write / Read) SSP Port 1 Data Write Register/SSP Data Read Register */ -+#define NSSTO __REG(0x41400028) /* SSP Port 1 Time Out Register */ -+#define NSSPSP __REG(0x4140002C) /* SSP Port 1 Programmable Serial Port Register */ -+ -+ - /* - * MultiMediaCard (MMC) controller - */ -diff -NurbwB linux-2.6.17/kernel/power/main.c linux-2.6.17-patched/kernel/power/main.c ---- linux-2.6.17/kernel/power/main.c 2006-06-17 18:49:35.000000000 -0700 -+++ linux-2.6.17-patched/kernel/power/main.c 2006-09-11 12:59:20.000000000 -0700 -@@ -66,10 +66,12 @@ - goto Enable_cpu; - } - -+ /* - if (freeze_processes()) { - error = -EAGAIN; - goto Thaw; - } -+ */ - - if ((free_pages = nr_free_pages()) < FREE_PAGE_NUMBER) { - pr_debug("PM: free some memory\n"); -@@ -110,12 +112,15 @@ - - local_irq_save(flags); - -+ /* - if ((error = device_power_down(PMSG_SUSPEND))) { - printk(KERN_ERR "Some devices failed to power down\n"); - goto Done; - } -+ */ -+ - error = pm_ops->enter(state); -- device_power_up(); -+ //device_power_up(); - Done: - local_irq_restore(flags); - return error; diff --git a/target/linux/pxa/patches/002-usb_gadget.patch b/target/linux/pxa/patches/002-usb_gadget.patch deleted file mode 100644 index b6766d9b3..000000000 --- a/target/linux/pxa/patches/002-usb_gadget.patch +++ /dev/null @@ -1,58 +0,0 @@ -diff -NurbwB linux-2.6.17/drivers/usb/gadget/pxa2xx_udc.c linux-2.6.17-patched/drivers/usb/gadget/pxa2xx_udc.c ---- linux-2.6.17/drivers/usb/gadget/pxa2xx_udc.c 2006-06-17 18:49:35.000000000 -0700 -+++ linux-2.6.17-patched/drivers/usb/gadget/pxa2xx_udc.c 2006-09-11 13:02:39.000000000 -0700 -@@ -87,8 +87,8 @@ - static const char ep0name [] = "ep0"; - - --// #define USE_DMA --// #define USE_OUT_DMA -+#define USE_DMA -+#define USE_OUT_DMA - // #define DISABLE_TEST_MODE - - #ifdef CONFIG_ARCH_IXP4XX -@@ -1513,7 +1513,7 @@ - #endif - - /* try to clear these bits before we enable the udc */ -- udc_ack_int_UDCCR(UDCCR_SUSIR|/*UDCCR_RSTIR|*/UDCCR_RESIR); -+ udc_ack_int_UDCCR(UDCCR_SUSIR|UDCCR_RSTIR|UDCCR_RESIR); - - ep0_idle(dev); - dev->gadget.speed = USB_SPEED_UNKNOWN; -@@ -2043,6 +2043,9 @@ - struct pxa2xx_udc *dev = _dev; - int handled; - -+ -+ udc_set_mask_UDCCR( UDCCR_REM | UDCCR_SRM); -+ - dev->stats.irqs++; - HEX_DISPLAY(dev->stats.irqs); - do { -@@ -2137,6 +2139,8 @@ - /* we could also ask for 1 msec SOF (SIR) interrupts */ - - } while (handled); -+ -+ udc_clear_mask_UDCCR( UDCCR_SRM | UDCCR_REM); - return IRQ_HANDLED; - } - -@@ -2437,6 +2441,7 @@ - int retval, out_dma = 1; - u32 chiprev; - -+ local_irq_disable(); - /* insist on Intel/ARM/XScale */ - asm("mrc%? p15, 0, %0, c0, c0" : "=r" (chiprev)); - if ((chiprev & CP15R0_VENDOR_MASK) != CP15R0_XSCALE_VALUE) { -@@ -2553,6 +2558,7 @@ - #endif - } - #endif -+ local_irq_enable(); - create_proc_files(); - - return 0; diff --git a/target/linux/pxa/patches/002-verdex_lcd_support.patch b/target/linux/pxa/patches/002-verdex_lcd_support.patch new file mode 100644 index 000000000..834930703 --- /dev/null +++ b/target/linux/pxa/patches/002-verdex_lcd_support.patch @@ -0,0 +1,52 @@ +From eb92a178eceae4e5d18bbb442b8e44cb88457d60 Mon Sep 17 00:00:00 2001 +From: Joseph Kortje +Date: Wed, 28 Oct 2009 21:25:57 -0400 +Subject: [PATCH] [ARM] Gumstix Verdex LCD config options + +add options to Kconfig for Verdex LCD support + +Signed-off-by: Bobby Powers +--- + drivers/video/Kconfig | 31 +++++++++++++++++++++++++++++++ + 1 files changed, 31 insertions(+), 0 deletions(-) + +--- a/drivers/video/Kconfig ++++ b/drivers/video/Kconfig +@@ -1772,6 +1772,37 @@ config FB_PXA + say M here and read . + + If unsure, say N. ++choice ++ depends on FB_PXA ++ prompt "LCD Panel" ++ default FB_PXA_SAMSUNG_LTE430WQ_F0C ++ ++config FB_PXA_ALPS_CDOLLAR ++ boolean "Chris Dollar's ALPS screen" ++ ---help--- ++ Enable definitions (over-ridable on the kernel command line if ++ "PXA LCD command line parameters" is also selected) for an ALPS ++ screen which Chris Dollar uses ++ ++config FB_PXA_SHARP_LQ043_PSP ++ boolean "SHARP LQ043... series" ++ ---help--- ++ Enable definitions (over-ridable on the kernel command line if ++ "PXA LCD command line parameters" is also selected) for a SHARP ++ LQ043... screen, such as the one used by the PSP. These screens are ++ the ones normally sold by gumstix with its boards. ++ ++config FB_PXA_SAMSUNG_LTE430WQ_F0C ++ boolean "Samsung LTE430WQ-F0C (standard gumstix LCD)" ++ ---help--- ++ Enable definitions for a Samsung LTE430WQ-F0C LCD panel, such as the ones resold ++ by gumstix for use with their "LCD-Ready" boards. ++ ++config FB_PXA_NONEOFTHEABOVE ++ boolean "None of the above" ++ ++endchoice ++ + + config FB_PXA_OVERLAY + bool "Support PXA27x/PXA3xx Overlay(s) as framebuffer" diff --git a/target/linux/pxa/patches/003-gumstix_h_verdex_pro_support.patch b/target/linux/pxa/patches/003-gumstix_h_verdex_pro_support.patch new file mode 100644 index 000000000..570a40354 --- /dev/null +++ b/target/linux/pxa/patches/003-gumstix_h_verdex_pro_support.patch @@ -0,0 +1,211 @@ +From adb6abbe4e3bc17c20cdc70e4a4357f1633d4970 Mon Sep 17 00:00:00 2001 +From: Joseph Kortje +Date: Wed, 28 Oct 2009 21:49:11 -0400 +Subject: [PATCH] [ARM] gumstix.h: Verdex Pro support + +Added a bunch of ifdefs to support both original gumstix boards +as well as the Verdex Pro in gumstix.h + +Signed-off-by: Bobby Powers +--- + arch/arm/mach-pxa/include/mach/gumstix.h | 160 ++++++++++++++++++++++++------ + 1 files changed, 130 insertions(+), 30 deletions(-) + +--- a/arch/arm/mach-pxa/include/mach/gumstix.h ++++ b/arch/arm/mach-pxa/include/mach/gumstix.h +@@ -6,6 +6,9 @@ + * published by the Free Software Foundation. + */ + ++#if !defined(__ASM_ARCH_MFP_PXA27X_H) && !defined(__ASM_ARCH_MFP_PXA25X_H) ++ #error You need to include either mfp-pxa27x.h or mfp-pxa25x.h ++#endif + + /* BTRESET - Reset line to Bluetooth module, active low signal. */ + #define GPIO_GUMSTIX_BTRESET 7 +@@ -28,9 +31,18 @@ has detected a cable insertion; driven l + + #else + ++#ifndef CONFIG_MACH_GUMSTIX_VERDEX ++ + #define GPIO_GUMSTIX_USB_GPIOn 35 + #define GPIO_GUMSTIX_USB_GPIOx 41 + ++#else ++ ++#define GPIO_GUMSTIX_USB_GPIOn 100 ++#define GPIO_GUMSTIX_USB_GPIOx 27 ++ ++#endif ++ + #endif + + /* usb state change */ +@@ -52,48 +64,136 @@ has detected a cable insertion; driven l + * ETH_RST provides a hardware reset line to the ethernet chip + * ETH is the IRQ line in from the ethernet chip to the PXA + */ ++#ifndef CONFIG_MACH_GUMSTIX_VERDEX + #define GPIO_GUMSTIX_ETH0_RST 80 +-#define GPIO_GUMSTIX_ETH0_RST_MD (GPIO_GUMSTIX_ETH0_RST | GPIO_OUT) ++#define GPIO_GUMSTIX_ETH0 36 ++#else ++#define GPIO_GUMSTIX_ETH0_RST 107 ++#define GPIO_GUMSTIX_ETH0 99 ++#endif + #define GPIO_GUMSTIX_ETH1_RST 52 +-#define GPIO_GUMSTIX_ETH1_RST_MD (GPIO_GUMSTIX_ETH1_RST | GPIO_OUT) ++#define GPIO_GUMSTIX_ETH1 27 + +-#define GPIO_GUMSTIX_ETH0 36 ++#define GPIO_GUMSTIX_ETH0_RST_MD (GPIO_GUMSTIX_ETH0_RST | GPIO_OUT) ++#define GPIO_GUMSTIX_ETH1_RST_MD (GPIO_GUMSTIX_ETH1_RST | GPIO_OUT) + #define GPIO_GUMSTIX_ETH0_MD (GPIO_GUMSTIX_ETH0 | GPIO_IN) +-#define GUMSTIX_ETH0_IRQ IRQ_GPIO(GPIO_GUMSTIX_ETH0) +-#define GPIO_GUMSTIX_ETH1 27 + #define GPIO_GUMSTIX_ETH1_MD (GPIO_GUMSTIX_ETH1 | GPIO_IN) +-#define GUMSTIX_ETH1_IRQ IRQ_GPIO(GPIO_GUMSTIX_ETH1) + ++#define GUMSTIX_ETH0_IRQ IRQ_GPIO(GPIO_GUMSTIX_ETH0) ++#define GUMSTIX_ETH1_IRQ IRQ_GPIO(GPIO_GUMSTIX_ETH1) + + /* CF reset line */ +-#define GPIO8_RESET 8 ++#define GPIO8_CF_RESET 8 ++#define GPIO97_CF_RESET 97 ++#define GPIO110_CF_RESET 110 ++ ++#ifndef CONFIG_MACH_GUMSTIX_VERDEX ++#define GPIO_GUMSTIX_CF_RESET GPIO8_CF_RESET ++#else ++#define GPIO_GUMSTIX_CF_RESET GPIO97_CF_RESET ++#endif ++ ++#define GPIO_GUMSTIX_CF_OLD_RESET GPIO110_CF_RESET ++ ++/* CF signals shared by both sockets */ ++#define GPIO_GUMSTIX_nPOE 48 ++#define GPIO_GUMSTIX_nPWE 49 ++#define GPIO_GUMSTIX_nPIOR 50 ++#define GPIO_GUMSTIX_nPIOW 51 ++ ++#ifndef CONFIG_MACH_GUMSTIX_VERDEX ++#define GPIO_GUMSTIX_nPCE_1 52 ++#define GPIO_GUMSTIX_nPCE_2 53 ++#define GPIO_GUMSTIX_pSKTSEL 54 ++#else ++#define GPIO_GUMSTIX_nPCE_1 102 ++#define GPIO_GUMSTIX_nPCE_2 105 ++#define GPIO_GUMSTIX_pSKTSEL 79 ++#endif ++ ++#define GPIO_GUMSTIX_nPREG 55 ++#define GPIO_GUMSTIX_nPWAIT 56 ++#define GPIO_GUMSTIX_nIOIS16 57 ++ ++/* Pin mode definitions correspond to mfp-pxa2[57]x.h */ ++#define GPIO_GUMSTIX_nPOE_MD GPIO48_nPOE ++#define GPIO_GUMSTIX_nPWE_MD GPIO49_nPWE ++#define GPIO_GUMSTIX_nPIOR_MD GPIO50_nPIOR ++#define GPIO_GUMSTIX_nPIOW_MD GPIO51_nPIOW ++ ++#ifndef CONFIG_MACH_GUMSTIX_VERDEX ++#define GPIO_GUMSTIX_nPCE_1_MD GPIO52_nPCE_1 ++#define GPIO_GUMSTIX_nPCE_2_MD GPIO53_nPCE_2 ++#define GPIO_GUMSTIX_pSKTSEL_MD GPIO54_pSKTSEL ++#else ++#define GPIO_GUMSTIX_nPCE_1_MD GPIO102_nPCE_1 ++#define GPIO_GUMSTIX_nPCE_2_MD GPIO105_nPCE_2 ++#define GPIO_GUMSTIX_pSKTSEL_MD GPIO79_pSKTSEL ++#endif ++ ++#define GPIO_GUMSTIX_nPREG_MD GPIO55_nPREG ++#define GPIO_GUMSTIX_nPWAIT_MD GPIO56_nPWAIT ++#define GPIO_GUMSTIX_nIOIS16_MD GPIO57_nIOIS16 + + /* CF slot 0 */ +-#define GPIO4_nBVD1 4 +-#define GPIO4_nSTSCHG GPIO4_nBVD1 +-#define GPIO11_nCD 11 +-#define GPIO26_PRDY_nBSY 26 +-#define GUMSTIX_S0_nSTSCHG_IRQ IRQ_GPIO(GPIO4_nSTSCHG) +-#define GUMSTIX_S0_nCD_IRQ IRQ_GPIO(GPIO11_nCD) +-#define GUMSTIX_S0_PRDY_nBSY_IRQ IRQ_GPIO(GPIO26_PRDY_nBSY) ++#define GPIO4_nBVD1_0 4 ++#define GPIO4_nSTSCHG_0 GPIO4_nBVD1_0 ++#define GPIO11_nCD_0 11 ++#define GPIO26_PRDY_nBSY_0 26 ++ ++#define GPIO111_nBVD1_0 111 ++#define GPIO111_nSTSCHG_0 GPIO111_nBVD1_0 ++#define GPIO104_nCD_0 104 ++#define GPIO96_PRDY_nBSY_0 96 ++#define GPIO109_PRDY_nBSY_0 109 ++ ++#ifndef CONFIG_MACH_GUMSTIX_VERDEX ++#define GPIO_GUMSTIX_nBVD1_0 GPIO4_nBVD1_0 ++#define GPIO_GUMSTIX_nSTSCHG_0 GPIO4_nSTSCHG_0 ++#define GPIO_GUMSTIX_nCD_0 GPIO11_nCD_0 ++#define GPIO_GUMSTIX_PRDY_nBSY_0 GPIO26_PRDY_nBSY_0 ++#else ++#define GPIO_GUMSTIX_nBVD1_0 GPIO111_nBVD1_0 ++#define GPIO_GUMSTIX_nSTSCHG_0 GPIO111_nSTSCHG_0 ++#define GPIO_GUMSTIX_nCD_0 GPIO104_nCD_0 ++#define GPIO_GUMSTIX_PRDY_nBSY_0 GPIO96_PRDY_nBSY_0 ++#endif ++ ++#define GPIO_GUMSTIX_PRDY_nBSY_0_OLD GPIO109_PRDY_nBSY_0 ++ ++#define GUMSTIX_S0_nSTSCHG_IRQ IRQ_GPIO(GPIO_GUMSTIX_nSTSCHG_0) ++#define GUMSTIX_S0_nCD_IRQ IRQ_GPIO(GPIO_GUMSTIX_nCD_0) ++#define GUMSTIX_S0_PRDY_nBSY_IRQ IRQ_GPIO(GPIO_GUMSTIX_PRDY_nBSY_0) ++#define GUMSTIX_S0_PRDY_nBSY_OLD_IRQ IRQ_GPIO(GPIO_GUMSTIX_PRDY_nBSY_0_OLD) + + /* CF slot 1 */ +-#define GPIO18_nBVD1 18 +-#define GPIO18_nSTSCHG GPIO18_nBVD1 +-#define GPIO36_nCD 36 +-#define GPIO27_PRDY_nBSY 27 +-#define GUMSTIX_S1_nSTSCHG_IRQ IRQ_GPIO(GPIO18_nSTSCHG) +-#define GUMSTIX_S1_nCD_IRQ IRQ_GPIO(GPIO36_nCD) +-#define GUMSTIX_S1_PRDY_nBSY_IRQ IRQ_GPIO(GPIO27_PRDY_nBSY) +- +-/* CF GPIO line modes */ +-#define GPIO4_nSTSCHG_MD (GPIO4_nSTSCHG | GPIO_IN) +-#define GPIO8_RESET_MD (GPIO8_RESET | GPIO_OUT) +-#define GPIO11_nCD_MD (GPIO11_nCD | GPIO_IN) +-#define GPIO18_nSTSCHG_MD (GPIO18_nSTSCHG | GPIO_IN) +-#define GPIO26_PRDY_nBSY_MD (GPIO26_PRDY_nBSY | GPIO_IN) +-#define GPIO27_PRDY_nBSY_MD (GPIO27_PRDY_nBSY | GPIO_IN) +-#define GPIO36_nCD_MD (GPIO36_nCD | GPIO_IN) ++#define GPIO18_nBVD1_1 18 ++#define GPIO18_nSTSCHG_1 GPIO18_nBVD1_1 ++#define GPIO36_nCD_1 36 ++#define GPIO27_PRDY_nBSY_1 27 ++ ++#define GPIO_GUMSTIX_nBVD1_1 GPIO18_nBVD1_1 ++#define GPIO_GUMSTIX_nSTSCHG_1 GPIO18_nSTSCHG_1 ++#define GPIO_GUMSTIX_nCD_1 GPIO36_nCD_1 ++#define GPIO_GUMSTIX_PRDY_nBSY_1 GPIO27_PRDY_nBSY_1 ++ ++#define GUMSTIX_S1_nSTSCHG_IRQ IRQ_GPIO(GPIO_GUMSTIX_nSTSCHG_1) ++#define GUMSTIX_S1_nCD_IRQ IRQ_GPIO(GPIO_GUMSTIX_nCD_1) ++#define GUMSTIX_S1_PRDY_nBSY_IRQ IRQ_GPIO(GPIO_GUMSTIX_PRDY_nBSY_1) ++ ++/* CF GPIO line modes - correspond to mfp-pxa2[57]x.h */ ++#define GPIO_GUMSTIX_CF_RESET_MD ( GPIO_GUMSTIX_CF_RESET | GPIO_OUT ) ++#define GPIO_GUMSTIX_CF_OLD_RESET_MD ( GPIO_GUMSTIX_CF_OLD_RESET | GPIO_OUT ) ++ ++#define GPIO_GUMSTIX_nSTSCHG_0_MD GPIO111_GPIO ++#define GPIO_GUMSTIX_nCD_0_MD GPIO104_GPIO ++ ++#define GPIO_GUMSTIX_PRDY_nBSY_0_MD GPIO96_GPIO ++#define GPIO_GUMSTIX_PRDY_nBSY_0_OLD_MD GPIO109_GPIO ++ ++#define GPIO_GUMSTIX_nSTSCHG_1_MD GPIO18_GPIO ++#define GPIO_GUMSTIX_nCD_1_MD GPIO36_GPIO ++#define GPIO_GUMSTIX_PRDY_nBSY_1_MD GPIO27_GPIO + + /* for expansion boards that can't be programatically detected */ + extern int am200_init(void); diff --git a/target/linux/pxa/patches/004-skbuf_hack.patch b/target/linux/pxa/patches/004-skbuf_hack.patch deleted file mode 100644 index 434e3b98b..000000000 --- a/target/linux/pxa/patches/004-skbuf_hack.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- linux-2.6.17/include/linux/skbuff.h 2006-09-20 16:13:42.000000000 -0700 -+++ linux-2.6.17-patched/include/linux/skbuff.h 2006-09-20 16:14:29.000000000 -0700 -@@ -239,6 +239,7 @@ - } nh; - - union { -+ struct ethhdr *ethernet; - unsigned char *raw; - } mac; - diff --git a/target/linux/pxa/patches/004-smsc911x_verdex_pro_support.patch b/target/linux/pxa/patches/004-smsc911x_verdex_pro_support.patch new file mode 100644 index 000000000..82490b33b --- /dev/null +++ b/target/linux/pxa/patches/004-smsc911x_verdex_pro_support.patch @@ -0,0 +1,102 @@ +From 7645a459feb02f7aae4c3a5724b7800495d1b659 Mon Sep 17 00:00:00 2001 +From: Bobby Powers +Date: Wed, 28 Oct 2009 22:41:31 -0400 +Subject: [PATCH] [ARM] smsc911x: Verdex Pro support + +Basically Joseph Kortje's patch, cleaned up to apply to Linus's +tree. Some of the smsc911x.c had been applied already + +Signed-off-by: Bobby Powers +--- + drivers/net/smsc911x.c | 50 +++++++++++++++++++++++++++++++++++++-------- + drivers/net/smsc911x.h | 2 +- + include/linux/smsc911x.h | 11 ++++++++++ + 3 files changed, 53 insertions(+), 10 deletions(-) + +--- a/drivers/net/smsc911x.c ++++ b/drivers/net/smsc911x.c +@@ -1181,7 +1181,7 @@ static int smsc911x_open(struct net_devi + SMSC_WARNING(IFUP, + "Timed out waiting for EEPROM busy bit to clear"); + +- smsc911x_reg_write(pdata, GPIO_CFG, 0x70070000); ++ smsc911x_reg_write(pdata, GPIO_CFG, GPIO_CFG_LED1_EN_ | GPIO_CFG_LED2_EN_ | (1 << 20)); + + /* The soft reset above cleared the device's MAC address, + * restore it from local copy (set in probe) */ +@@ -1193,8 +1193,8 @@ static int smsc911x_open(struct net_devi + smsc911x_reg_write(pdata, INT_EN, 0); + smsc911x_reg_write(pdata, INT_STS, 0xFFFFFFFF); + +- /* Set interrupt deassertion to 100uS */ +- intcfg = ((10 << 24) | INT_CFG_IRQ_EN_); ++ /* Set interrupt deassertion to 22*10uS */ ++ intcfg = ((22 << 24) | INT_CFG_IRQ_EN_); + + if (pdata->config.irq_polarity) { + SMSC_TRACE(IFUP, "irq polarity: active high"); +@@ -1220,7 +1220,7 @@ static int smsc911x_open(struct net_devi + temp |= INT_EN_SW_INT_EN_; + smsc911x_reg_write(pdata, INT_EN, temp); + +- timeout = 1000; ++ timeout = 2000; + while (timeout--) { + if (pdata->software_irq_signal) + break; +@@ -1948,6 +1948,38 @@ static int __devexit smsc911x_drv_remove + return 0; + } + ++static inline unsigned int is_gumstix_oui(u8 *addr) ++{ ++ return (addr[0] == 0x00 && addr[1] == 0x15 && addr[2] == 0xC9); ++} ++ ++/** ++ * gen_serial_ether_addr - Generate software assigned Ethernet address ++ * based on the system_serial number ++ * @addr: Pointer to a six-byte array containing the Ethernet address ++ * ++ * Generate an Ethernet address (MAC) that is not multicast ++ * and has the local assigned bit set, keyed on the system_serial ++ */ ++static inline void gen_serial_ether_addr(u8 *addr) ++{ ++ static u8 ether_serial_digit = 0; ++ addr [0] = system_serial_high >> 8; ++ addr [1] = system_serial_high; ++ addr [2] = system_serial_low >> 24; ++ addr [3] = system_serial_low >> 16; ++ addr [4] = system_serial_low >> 8; ++ addr [5] = (system_serial_low & 0xc0) | /* top bits are from system serial */ ++ (1 << 4) | /* 2 bits identify interface type 1=ether, 2=usb, 3&4 undef */ ++ ((ether_serial_digit++) & 0x0f); /* 15 possible interfaces of each type */ ++ ++ if(!is_gumstix_oui(addr)) ++ { ++ addr [0] &= 0xfe; /* clear multicast bit */ ++ addr [0] |= 0x02; /* set local assignment bit (IEEE802) */ ++ } ++} ++ + static int __devinit smsc911x_drv_probe(struct platform_device *pdev) + { + struct net_device *dev; +@@ -2081,11 +2113,11 @@ static int __devinit smsc911x_drv_probe( + SMSC_TRACE(PROBE, + "Mac Address is read from LAN911x EEPROM"); + } else { +- /* eeprom values are invalid, generate random MAC */ +- random_ether_addr(dev->dev_addr); +- smsc911x_set_hw_mac_address(pdata, dev->dev_addr); +- SMSC_TRACE(PROBE, +- "MAC Address is set to random_ether_addr"); ++ /* eeprom values are invalid, generate MAC from serial number */ ++ gen_serial_ether_addr(dev->dev_addr); ++ smsc911x_set_hw_mac_address(pdata, dev->dev_addr); ++ SMSC_TRACE(PROBE, ++ "MAC Address is derived from system serial number"); + } + } + diff --git a/target/linux/pxa/patches/005-mtd.patch b/target/linux/pxa/patches/005-mtd.patch deleted file mode 100644 index 6156b6a93..000000000 --- a/target/linux/pxa/patches/005-mtd.patch +++ /dev/null @@ -1,111 +0,0 @@ -diff -Nurb linux-2.6.17/drivers/mtd/chips/cfi_cmdset_0001.c linux-2.6.17-patched/drivers/mtd/chips/cfi_cmdset_0001.c ---- linux-2.6.17/drivers/mtd/chips/cfi_cmdset_0001.c 2006-06-17 18:49:35.000000000 -0700 -+++ linux-2.6.17-patched/drivers/mtd/chips/cfi_cmdset_0001.c 2006-09-25 11:27:06.000000000 -0700 -@@ -40,7 +40,7 @@ - /* #define CMDSET0001_DISABLE_WRITE_SUSPEND */ - - // debugging, turns off buffer write mode if set to 1 --#define FORCE_WORD_WRITE 0 -+#define FORCE_WORD_WRITE 1 - - #define MANUFACTURER_INTEL 0x0089 - #define I82802AB 0x00ad -diff -Nurb linux-2.6.17/drivers/mtd/maps/lubbock-flash.c linux-2.6.17-patched/drivers/mtd/maps/lubbock-flash.c ---- linux-2.6.17/drivers/mtd/maps/lubbock-flash.c 2006-06-17 18:49:35.000000000 -0700 -+++ linux-2.6.17-patched/drivers/mtd/maps/lubbock-flash.c 2006-09-25 10:50:08.000000000 -0700 -@@ -26,6 +26,7 @@ - #include - #include - #include -+#include - - - #define ROM_ADDR 0x00000000 -@@ -48,24 +49,27 @@ - .inval_cache = lubbock_map_inval_cache, - } }; - --static struct mtd_partition lubbock_partitions[] = { -+static struct mtd_partition lubbock_partitions[] = -+{ - { -- .name = "Bootloader", -- .size = 0x00040000, -- .offset = 0, -- .mask_flags = MTD_WRITEABLE /* force read-only */ -- },{ -- .name = "Kernel", -- .size = 0x00100000, -- .offset = 0x00040000, -- },{ -- .name = "Filesystem", -- .size = MTDPART_SIZ_FULL, -- .offset = 0x00140000 -- } -+ .name = "root", -+ .offset = 0x00410000 -+ }, -+ { -+ .name = "kernel", -+ .size = 0x00150000, -+ .offset = 0x000B0000 -+ }, -+ { -+ .name = "bootloader", -+ .size = 0x000B0000, -+ .offset = 0x00000000 -+ }, - }; - -+ - static struct mtd_info *mymtds[2]; -+static struct mtd_info *merged_mtd; - static struct mtd_partition *parsed_parts[2]; - static int nr_parsed_parts[2]; - -@@ -83,8 +87,8 @@ - printk(KERN_NOTICE "Lubbock configured to boot from %s (bank %d)\n", - flashboot?"Flash":"ROM", flashboot); - -- lubbock_maps[flashboot^1].name = "Lubbock Application Flash"; -- lubbock_maps[flashboot].name = "Lubbock Boot ROM"; -+ lubbock_maps[flashboot^1].name = "Flash-1"; -+ lubbock_maps[flashboot].name = "Flash-0"; - - for (i = 0; i < 2; i++) { - lubbock_maps[i].virt = ioremap(lubbock_maps[i].phys, WINDOW_SIZE); -@@ -125,25 +129,23 @@ - if (!mymtds[0] && !mymtds[1]) - return ret; - -- for (i = 0; i < 2; i++) { -- if (!mymtds[i]) { -- printk(KERN_WARNING "%s is absent. Skipping\n", lubbock_maps[i].name); -- } else if (nr_parsed_parts[i]) { -- add_mtd_partitions(mymtds[i], parsed_parts[i], nr_parsed_parts[i]); -- } else if (!i) { -- printk("Using static partitions on %s\n", lubbock_maps[i].name); -- add_mtd_partitions(mymtds[i], lubbock_partitions, ARRAY_SIZE(lubbock_partitions)); -- } else { -- printk("Registering %s as whole device\n", lubbock_maps[i].name); -- add_mtd_device(mymtds[i]); -- } -- } -+ if (mymtds[0] && mymtds[1]) { -+ merged_mtd = mtd_concat_create(mymtds, 2, "Concated Flash #1 and #2"); -+ if(merged_mtd) -+ add_mtd_partitions(merged_mtd, lubbock_partitions, ARRAY_SIZE(lubbock_partitions)); -+ else -+ printk("YoKu: Failed to concate\n"); - return 0; -+ } - } - - static void __exit cleanup_lubbock(void) - { - int i; -+ -+ del_mtd_partitions(merged_mtd); -+ map_destroy(merged_mtd); -+ - for (i = 0; i < 2; i++) { diff --git a/target/linux/pxa/patches/005-verdex_pcmcia_support.patch b/target/linux/pxa/patches/005-verdex_pcmcia_support.patch new file mode 100644 index 000000000..ca50022c6 --- /dev/null +++ b/target/linux/pxa/patches/005-verdex_pcmcia_support.patch @@ -0,0 +1,234 @@ +From 76a102bd5c9d792db19c6c72eafdecea0311a0c9 Mon Sep 17 00:00:00 2001 +From: Craig Hughes +Date: Fri, 30 Oct 2009 14:16:27 -0400 +Subject: [PATCH] [ARM] pxa: Gumstix Verdex PCMCIA support + +Needed for the Libertas CS wireless device. + +Signed-off-by: Bobby Powers +--- + drivers/pcmcia/Kconfig | 3 +- + drivers/pcmcia/Makefile | 3 + + drivers/pcmcia/pxa2xx_gumstix.c | 194 +++++++++++++++++++++++++++++++++++++++ + 3 files changed, 199 insertions(+), 1 deletions(-) + create mode 100644 drivers/pcmcia/pxa2xx_gumstix.c + +--- a/drivers/pcmcia/Kconfig ++++ b/drivers/pcmcia/Kconfig +@@ -221,7 +221,8 @@ config PCMCIA_PXA2XX + depends on ARM && ARCH_PXA && PCMCIA + depends on (ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL \ + || MACH_ARMCORE || ARCH_PXA_PALM || TRIZEPS_PCMCIA \ +- || ARCH_VIPER || ARCH_PXA_ESERIES || MACH_STARGATE2) ++ || ARCH_VIPER || ARCH_PXA_ESERIES || MACH_STARGATE2 \ ++ || ARCH_GUMSTIX) + help + Say Y here to include support for the PXA2xx PCMCIA controller + +--- a/drivers/pcmcia/Makefile ++++ b/drivers/pcmcia/Makefile +@@ -77,4 +77,7 @@ pxa2xx-obj-$(CONFIG_MACH_PALMLD) += pxa + pxa2xx-obj-$(CONFIG_MACH_E740) += pxa2xx_e740.o + pxa2xx-obj-$(CONFIG_MACH_STARGATE2) += pxa2xx_stargate2.o + ++pxa2xx-obj-$(CONFIG_MACH_GUMSTIX_VERDEX) += pxa2xx_cs.o ++pxa2xx_cs-objs := pxa2xx_gumstix.o ++ + obj-$(CONFIG_PCMCIA_PXA2XX) += pxa2xx_core.o $(pxa2xx-obj-y) +--- /dev/null ++++ b/drivers/pcmcia/pxa2xx_gumstix.c +@@ -0,0 +1,194 @@ ++/* ++ * linux/drivers/pcmcia/pxa2xx_gumstix.c ++ * ++ * Gumstix PCMCIA specific routines. Based on Mainstone ++ * ++ * Copyright 2004, Craig Hughes ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include ++ ++#include ++#include ++ ++#ifdef CONFIG_MACH_GUMSTIX_VERDEX ++#include ++#else ++#include ++#endif ++ ++#include ++#include ++#include ++#include "soc_common.h" ++ ++#define ARRAY_AND_SIZE(x) (x), ARRAY_SIZE(x) ++ ++static struct pcmcia_irqs gumstix_pcmcia_irqs0[] = { ++ { 0, GUMSTIX_S0_nCD_IRQ, "CF0 nCD" }, ++ { 0, GUMSTIX_S0_nSTSCHG_IRQ, "CF0 nSTSCHG" }, ++}; ++ ++static struct pcmcia_irqs gumstix_pcmcia_irqs1[] = { ++ { 1, GUMSTIX_S1_nCD_IRQ, "CF1 nCD" }, ++ { 1, GUMSTIX_S1_nSTSCHG_IRQ, "CF1 nSTSCHG" }, ++}; ++ ++ ++static int net_cf_vx_mode = 0; ++ ++static int gumstix_pcmcia_hw_init(struct soc_pcmcia_socket *skt) ++{ ++/* Note: The verdex_pcmcia_pin_config is moved to gumstix_verdex.c in order to use mfp_pxa2xx_config ++ for board-specific pin configuration instead of the old deprecated pxa_gpio_mode function. Thus, ++ only the IRQ init is still needed to be done here. */ ++ skt->irq = (skt->nr == 0) ? ((net_cf_vx_mode == 0) ? GUMSTIX_S0_PRDY_nBSY_IRQ : GUMSTIX_S0_PRDY_nBSY_OLD_IRQ) : GUMSTIX_S1_PRDY_nBSY_IRQ; ++ ++ return (skt->nr == 0) ? soc_pcmcia_request_irqs(skt, gumstix_pcmcia_irqs0, ARRAY_SIZE(gumstix_pcmcia_irqs0)) : ++ soc_pcmcia_request_irqs(skt, gumstix_pcmcia_irqs1, ARRAY_SIZE(gumstix_pcmcia_irqs1)); ++} ++ ++static void gumstix_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) ++{ ++ if(skt->nr == 0) ++ { ++ soc_pcmcia_free_irqs(skt, gumstix_pcmcia_irqs0, ARRAY_SIZE(gumstix_pcmcia_irqs0)); ++ } else { ++ soc_pcmcia_free_irqs(skt, gumstix_pcmcia_irqs1, ARRAY_SIZE(gumstix_pcmcia_irqs1)); ++ } ++ ++ if (net_cf_vx_mode) { ++ gpio_free(GPIO_GUMSTIX_CF_OLD_RESET); ++ } else { ++ gpio_free(GPIO_GUMSTIX_CF_RESET); ++ } ++ ++} ++ ++static void gumstix_pcmcia_socket_state(struct soc_pcmcia_socket *skt, ++ struct pcmcia_state *state) ++{ ++ unsigned int cd, prdy_nbsy, nbvd1; ++ if(skt->nr == 0) ++ { ++ cd = GPIO_GUMSTIX_nCD_0; ++ if(net_cf_vx_mode) ++ prdy_nbsy = GPIO_GUMSTIX_PRDY_nBSY_0_OLD; ++ else ++ prdy_nbsy = GPIO_GUMSTIX_PRDY_nBSY_0; ++ nbvd1 = GPIO_GUMSTIX_nBVD1_0; ++ } else { ++ cd = GPIO_GUMSTIX_nCD_1; ++ prdy_nbsy = GPIO_GUMSTIX_PRDY_nBSY_1; ++ nbvd1 = GPIO_GUMSTIX_nBVD1_1; ++ } ++ state->detect = !(GPLR(cd) & GPIO_bit(cd)); ++ state->ready = !!(GPLR(prdy_nbsy) & GPIO_bit(prdy_nbsy)); ++ state->bvd1 = !!(GPLR(nbvd1) & GPIO_bit(nbvd1)); ++ state->bvd2 = 1; ++ state->vs_3v = 0; ++ state->vs_Xv = 0; ++ state->wrprot = 0; ++} ++ ++static int gumstix_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, ++ const socket_state_t *state) ++{ ++ return 0; ++} ++ ++static void gumstix_pcmcia_socket_init(struct soc_pcmcia_socket *skt) ++{ ++ if(skt->nr) { ++ soc_pcmcia_enable_irqs(skt, gumstix_pcmcia_irqs0, ARRAY_SIZE(gumstix_pcmcia_irqs0)); ++ } else { ++ soc_pcmcia_enable_irqs(skt, gumstix_pcmcia_irqs1, ARRAY_SIZE(gumstix_pcmcia_irqs1)); ++ } ++} ++ ++static void gumstix_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) ++{ ++ if(skt->nr) { ++ soc_pcmcia_disable_irqs(skt, gumstix_pcmcia_irqs0, ARRAY_SIZE(gumstix_pcmcia_irqs0)); ++ } else { ++ soc_pcmcia_disable_irqs(skt, gumstix_pcmcia_irqs1, ARRAY_SIZE(gumstix_pcmcia_irqs1)); ++ } ++} ++ ++static struct pcmcia_low_level gumstix_pcmcia_ops = { ++ .owner = THIS_MODULE, ++ .hw_init = gumstix_pcmcia_hw_init, ++ .hw_shutdown = gumstix_pcmcia_hw_shutdown, ++ .socket_state = gumstix_pcmcia_socket_state, ++ .configure_socket = gumstix_pcmcia_configure_socket, ++ .socket_init = gumstix_pcmcia_socket_init, ++ .socket_suspend = gumstix_pcmcia_socket_suspend, ++ .nr = 2, ++}; ++ ++static struct platform_device *gumstix_pcmcia_device; ++ ++extern int __init gumstix_get_cf_cards(void); ++ ++#ifdef CONFIG_MACH_GUMSTIX_VERDEX ++extern int __init gumstix_check_if_netCF_vx(void); ++#endif ++ ++static int __init gumstix_pcmcia_init(void) ++{ ++ int ret; ++ ++#ifdef CONFIG_MACH_GUMSTIX_VERDEX ++ net_cf_vx_mode = gumstix_check_if_netCF_vx(); ++#endif ++ ++ gumstix_pcmcia_ops.nr = gumstix_get_cf_cards(); ++ ++ gumstix_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1); ++ if (!gumstix_pcmcia_device) ++ return -ENOMEM; ++ ++ ret = platform_device_add_data(gumstix_pcmcia_device, &gumstix_pcmcia_ops, ++ sizeof(gumstix_pcmcia_ops)); ++ ++ if (ret == 0) { ++ printk(KERN_INFO "Registering gumstix PCMCIA interface.\n"); ++ ret = platform_device_add(gumstix_pcmcia_device); ++ } ++ ++ if (ret) ++ platform_device_put(gumstix_pcmcia_device); ++ ++ return ret; ++} ++ ++static void __exit gumstix_pcmcia_exit(void) ++{ ++ /* ++ * This call is supposed to free our gumstix_pcmcia_device. ++ * Unfortunately platform_device don't have a free method, and ++ * we can't assume it's free of any reference at this point so we ++ * can't free it either. ++ */ ++ platform_device_unregister(gumstix_pcmcia_device); ++} ++ ++fs_initcall(gumstix_pcmcia_init); ++module_exit(gumstix_pcmcia_exit); ++ ++MODULE_LICENSE("GPL"); diff --git a/target/linux/pxa/patches/006-define_smsc911x_for_pcmcia.patch b/target/linux/pxa/patches/006-define_smsc911x_for_pcmcia.patch new file mode 100644 index 000000000..fe039ae62 --- /dev/null +++ b/target/linux/pxa/patches/006-define_smsc911x_for_pcmcia.patch @@ -0,0 +1,37 @@ +From ddd30dbf3cfd805b0de99fc581d0fa1cc7236ef9 Mon Sep 17 00:00:00 2001 +From: Bobby Powers +Date: Fri, 13 Nov 2009 01:33:05 -0500 +Subject: [PATCH] pxa: define smsc911x structures for pcmcia too + +The gumstix pcmcia support (which the wireless driver uses) needs +to know about the smsc911x platform device even if smsc811x support +is disabled, as they share resources. + +Signed-off-by: Bobby Powers +--- + arch/arm/mach-pxa/gumstix-verdex.c | 6 +++++- + 1 files changed, 5 insertions(+), 1 deletions(-) + +--- a/arch/arm/mach-pxa/gumstix-verdex.c ++++ b/arch/arm/mach-pxa/gumstix-verdex.c +@@ -51,7 +51,9 @@ + + #include + +-#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) ++ ++#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) \ ++ || defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE) + + #include + +@@ -85,7 +87,9 @@ static struct platform_device verdex_sms + .platform_data = &verdex_smsc911x_config, + }, + }; ++#endif + ++#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) + static void __init verdex_init_smsc911x(void) + { + diff --git a/target/linux/pxa/patches/007-fix_verdex_pro_mmc_initialization.patch b/target/linux/pxa/patches/007-fix_verdex_pro_mmc_initialization.patch new file mode 100644 index 000000000..0f2332896 --- /dev/null +++ b/target/linux/pxa/patches/007-fix_verdex_pro_mmc_initialization.patch @@ -0,0 +1,30 @@ +From 7169c68fec79e61549b8e9c0106dde88e4d1bf9d Mon Sep 17 00:00:00 2001 +From: Bobby Powers +Date: Thu, 29 Oct 2009 15:39:45 -0400 +Subject: [PATCH] [ARM] pxa: fix Verdex Pro mmc initialization + +The MicroSD port doesn't have card detect, read-only switch +support, and is continuously powered. Somewhere in the +forward-porting this got lost in the structure initialization. + +Signed-off-by: Bobby Powers +--- + arch/arm/mach-pxa/gumstix-verdex.c | 7 +++++-- + 1 files changed, 5 insertions(+), 2 deletions(-) + +--- a/arch/arm/mach-pxa/gumstix-verdex.c ++++ b/arch/arm/mach-pxa/gumstix-verdex.c +@@ -590,8 +590,11 @@ static int verdex_mci_init(struct device + } + + static struct pxamci_platform_data verdex_mci_platform_data = { +- .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, +- .init = verdex_mci_init, ++ .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, ++ .init = verdex_mci_init, ++ .gpio_card_detect = -1, ++ .gpio_card_ro = -1, ++ .gpio_power = -1, + }; + + static void __init verdex_mmc_init(void) diff --git a/target/linux/pxa/patches/008-verdex_mtd_support.patch b/target/linux/pxa/patches/008-verdex_mtd_support.patch new file mode 100644 index 000000000..dbb5bf855 --- /dev/null +++ b/target/linux/pxa/patches/008-verdex_mtd_support.patch @@ -0,0 +1,57 @@ +--- a/arch/arm/mach-pxa/gumstix-verdex.c ++++ b/arch/arm/mach-pxa/gumstix-verdex.c +@@ -51,6 +51,46 @@ + + #include + ++static struct resource flash_resource = { ++ .start = 0x00000000, ++ .end = SZ_64M - 1, ++ .flags = IORESOURCE_MEM, ++}; ++ ++static struct mtd_partition gumstix_partitions[] = { ++ { ++ .name = "u-boot", ++ .size = 0x00040000, ++ .offset = 0, ++ .mask_flags = MTD_WRITEABLE /* force read-only */ ++ } , { ++ .name = "rootfs", ++ .size = 0x01ec0000, ++ .offset = 0x00040000 ++ } , { ++ .name = "kernel", ++ .size = 0x00100000, ++ .offset = 0x01f00000 ++ } ++}; ++ ++static struct flash_platform_data gumstix_flash_data = { ++ .map_name = "cfi_probe", ++ .parts = gumstix_partitions, ++ .nr_parts = ARRAY_SIZE(gumstix_partitions), ++ .width = 2, ++}; ++ ++static struct platform_device gumstix_flash_device = { ++ .name = "pxa2xx-flash", ++ .id = 0, ++ .dev = { ++ .platform_data = &gumstix_flash_data, ++ }, ++ .resource = &flash_resource, ++ .num_resources = 1, ++}; ++ + + #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) \ + || defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE) +@@ -540,6 +580,7 @@ static struct platform_device verdex_aud + }; + + static struct platform_device *devices[] __initdata = { ++ &gumstix_flash_device, + &verdex_audio_device, + }; + From ae4dfcda151d955e36ca8535f9776b3739913a40 Mon Sep 17 00:00:00 2001 From: juhosg Date: Tue, 9 Feb 2010 16:27:35 +0000 Subject: [PATCH 02/44] ar71xx/mac80211: add a workaround for the bad signal strength on the WNDR3700 git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19565 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/mac80211/Makefile | 4 +- ...-add-wndr3700-antenna-initialization.patch | 76 +++++++++++++++++++ .../files/arch/mips/ar71xx/dev-ap94-pci.c | 8 +- .../files/arch/mips/ar71xx/dev-ap94-pci.h | 11 ++- .../files/arch/mips/ar71xx/mach-wndr3700.c | 3 +- .../files/include/linux/ath9k_platform.h | 2 + 6 files changed, 96 insertions(+), 8 deletions(-) create mode 100644 package/mac80211/patches/409-ath9k-add-wndr3700-antenna-initialization.patch diff --git a/package/mac80211/Makefile b/package/mac80211/Makefile index 4e98a5dc0..f8d8d390f 100644 --- a/package/mac80211/Makefile +++ b/package/mac80211/Makefile @@ -1,5 +1,5 @@ # -# Copyright (C) 2007-2009 OpenWrt.org +# Copyright (C) 2007-2010 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -11,7 +11,7 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=mac80211 PKG_VERSION:=2010-02-02 -PKG_RELEASE:=1 +PKG_RELEASE:=2 PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources # http://www.orbit-lab.org/kernel/compat-wireless-2.6/2010/11 \ # http://wireless.kernel.org/download/compat-wireless-2.6 diff --git a/package/mac80211/patches/409-ath9k-add-wndr3700-antenna-initialization.patch b/package/mac80211/patches/409-ath9k-add-wndr3700-antenna-initialization.patch new file mode 100644 index 000000000..98c989176 --- /dev/null +++ b/package/mac80211/patches/409-ath9k-add-wndr3700-antenna-initialization.patch @@ -0,0 +1,76 @@ +--- a/drivers/net/wireless/ath/ath9k/init.c ++++ b/drivers/net/wireless/ath/ath9k/init.c +@@ -14,6 +14,7 @@ + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + ++#include "linux/ath9k_platform.h" + #include "ath9k.h" + + static char *dev_info = "ath9k"; +@@ -546,6 +547,8 @@ static int ath9k_init_softc(u16 devid, s + pdata = (struct ath9k_platform_data *) sc->dev->platform_data; + if (!pdata) + ah->ah_flags |= AH_USE_EEPROM; ++ else ++ sc->quirk_wndr3700 = pdata->quirk_wndr3700; + + common = ath9k_hw_common(ah); + common->ops = &ath9k_common_ops; +@@ -670,6 +673,24 @@ void ath9k_set_hw_capab(struct ath_softc + SET_IEEE80211_PERM_ADDR(hw, common->macaddr); + } + ++#ifdef CONFIG_ATHEROS_AR71XX ++static void wndr3700_init_antenna(struct ath_hw *ah) ++{ ++ ath9k_hw_cfg_output(ah, 6, AR_GPIO_OUTPUT_MUX_AS_OUTPUT); ++ ath9k_hw_cfg_output(ah, 7, AR_GPIO_OUTPUT_MUX_AS_OUTPUT); ++ ath9k_hw_cfg_output(ah, 8, AR_GPIO_OUTPUT_MUX_AS_OUTPUT); ++ ath9k_hw_cfg_output(ah, 9, AR_GPIO_OUTPUT_MUX_AS_OUTPUT); ++ ++ /* select the first antenna group */ ++ ath9k_hw_set_gpio(ah, 6, 0); ++ ath9k_hw_set_gpio(ah, 7, 1); ++ ath9k_hw_set_gpio(ah, 8, 0); ++ ath9k_hw_set_gpio(ah, 9, 1); ++} ++#else ++static inline void wndr3700_init_antenna(struct ath_hw *ah) {} ++#endif /* CONFIG_ATHEROS_AR71XX */ ++ + int ath9k_init_device(u16 devid, struct ath_softc *sc, u16 subsysid, + const struct ath_bus_ops *bus_ops) + { +@@ -688,6 +709,9 @@ int ath9k_init_device(u16 devid, struct + common = ath9k_hw_common(ah); + ath9k_set_hw_capab(sc, hw); + ++ if (sc->quirk_wndr3700) ++ wndr3700_init_antenna(ah); ++ + /* Initialize regulatory */ + error = ath_regd_init(&common->regulatory, sc->hw->wiphy, + ath9k_reg_notifier); +--- a/drivers/net/wireless/ath/ath9k/ath9k.h ++++ b/drivers/net/wireless/ath/ath9k/ath9k.h +@@ -510,6 +510,8 @@ struct ath_softc { + struct ath_beacon_config cur_beacon_conf; + struct delayed_work tx_complete_work; + struct ath_btcoex btcoex; ++ ++ unsigned long quirk_wndr3700:1; + }; + + struct ath_wiphy { +--- a/include/linux/ath9k_platform.h ++++ b/include/linux/ath9k_platform.h +@@ -24,6 +24,8 @@ + struct ath9k_platform_data { + u16 eeprom_data[ATH9K_PLAT_EEP_MAX_WORDS]; + u8 *macaddr; ++ ++ unsigned long quirk_wndr3700:1; + }; + + #endif /* _LINUX_ATH9K_PLATFORM_H */ diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/dev-ap94-pci.c b/target/linux/ar71xx/files/arch/mips/ar71xx/dev-ap94-pci.c index 920ab6c72..bfa668f74 100644 --- a/target/linux/ar71xx/files/arch/mips/ar71xx/dev-ap94-pci.c +++ b/target/linux/ar71xx/files/arch/mips/ar71xx/dev-ap94-pci.c @@ -1,7 +1,7 @@ /* * Atheros AP94 reference board PCI initialization * - * Copyright (C) 2009 Gabor Juhos + * Copyright (C) 2009-2010 Gabor Juhos * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published @@ -125,6 +125,12 @@ static void ap94_pci_fixup(struct pci_dev *dev) } DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_ATHEROS, PCI_ANY_ID, ap94_pci_fixup); +void __init ap94_pci_enable_quirk_wndr3700(void) +{ + ap94_wmac0_data.quirk_wndr3700 = 1; + ap94_wmac1_data.quirk_wndr3700 = 1; +} + void __init ap94_pci_init(u8 *cal_data0, u8 *mac_addr0, u8 *cal_data1, u8 *mac_addr1) { diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/dev-ap94-pci.h b/target/linux/ar71xx/files/arch/mips/ar71xx/dev-ap94-pci.h index 7969ed427..e69ba55e5 100644 --- a/target/linux/ar71xx/files/arch/mips/ar71xx/dev-ap94-pci.h +++ b/target/linux/ar71xx/files/arch/mips/ar71xx/dev-ap94-pci.h @@ -1,7 +1,7 @@ /* * Atheros AP94 reference board PCI initialization * - * Copyright (C) 2009 Gabor Juhos + * Copyright (C) 2009-2010 Gabor Juhos * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published @@ -14,11 +14,14 @@ #if defined(CONFIG_AR71XX_DEV_AP94_PCI) void ap94_pci_init(u8 *cal_data0, u8 *mac_addr0, u8 *cal_data1, u8 *mac_addr1) __init; + +void ap94_pci_enable_quirk_wndr3700(void) __init; + #else static inline void ap94_pci_init(u8 *cal_data0, u8 *mac_addr0, - u8 *cal_data1, u8 *mac_addr1) -{ -} + u8 *cal_data1, u8 *mac_addr1) {} + +static inline void ap94_pci_enable_quirk_wndr3700(void) {} #endif #endif /* _AR71XX_DEV_AP94_PCI_H */ diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/mach-wndr3700.c b/target/linux/ar71xx/files/arch/mips/ar71xx/mach-wndr3700.c index a0eb8d482..eaa9654aa 100644 --- a/target/linux/ar71xx/files/arch/mips/ar71xx/mach-wndr3700.c +++ b/target/linux/ar71xx/files/arch/mips/ar71xx/mach-wndr3700.c @@ -2,7 +2,7 @@ * Netgear WNDR3700 board support * * Copyright (C) 2009 Marco Porsch - * Copyright (C) 2009 Gabor Juhos + * Copyright (C) 2009-2010 Gabor Juhos * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published @@ -191,6 +191,7 @@ static void __init wndr3700_setup(void) platform_device_register(&wndr3700_rtl8366s_device); platform_device_register_simple("wndr3700-led-usb", -1, NULL, 0); + ap94_pci_enable_quirk_wndr3700(); ap94_pci_init(art + WNDR3700_CALDATA0_OFFSET, art + WNDR3700_WMAC0_MAC_OFFSET, art + WNDR3700_CALDATA1_OFFSET, diff --git a/target/linux/ar71xx/files/include/linux/ath9k_platform.h b/target/linux/ar71xx/files/include/linux/ath9k_platform.h index 9fb8c6e42..3c2201202 100644 --- a/target/linux/ar71xx/files/include/linux/ath9k_platform.h +++ b/target/linux/ar71xx/files/include/linux/ath9k_platform.h @@ -16,6 +16,8 @@ struct ath9k_platform_data { u16 eeprom_data[ATH9K_PLAT_EEP_MAX_WORDS]; u8 *macaddr; + + unsigned long quirk_wndr3700:1; }; #endif /* _LINUX_ATH9K_PLATFORM_H */ From 5f21a10d5e3f526457eef453578ba115823867a5 Mon Sep 17 00:00:00 2001 From: juhosg Date: Tue, 9 Feb 2010 17:55:33 +0000 Subject: [PATCH 03/44] ar71xx: sync kernel config git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19566 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/ar71xx/config-2.6.32 | 4 ---- 1 file changed, 4 deletions(-) diff --git a/target/linux/ar71xx/config-2.6.32 b/target/linux/ar71xx/config-2.6.32 index 192daa65e..2ec93a15c 100644 --- a/target/linux/ar71xx/config-2.6.32 +++ b/target/linux/ar71xx/config-2.6.32 @@ -106,7 +106,6 @@ CONFIG_GENERIC_FIND_NEXT_BIT=y CONFIG_GENERIC_GPIO=y CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y CONFIG_GPIOLIB=y -# CONFIG_GPIO_MC33880 is not set CONFIG_GPIO_NXP_74HC153=y CONFIG_GPIO_PCF857X=y CONFIG_GPIO_SYSFS=y @@ -142,7 +141,6 @@ CONFIG_IRQ_CPU=y # CONFIG_MACH_TX39XX is not set # CONFIG_MACH_TX49XX is not set # CONFIG_MACH_VR41XX is not set -# CONFIG_MFD_MC13783 is not set CONFIG_MICREL_PHY=y # CONFIG_MIKROTIK_RB532 is not set CONFIG_MIPS=y @@ -165,7 +163,6 @@ CONFIG_MTD_NAND=y CONFIG_MTD_NAND_RB4XX=y CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-2 CONFIG_MTD_REDBOOT_PARTS=y -# CONFIG_MTD_SST25L is not set CONFIG_MTD_WRT160NL_PARTS=y CONFIG_MYLOADER=y CONFIG_NET_DSA=y @@ -192,7 +189,6 @@ CONFIG_PHYLIB=y # CONFIG_PROBE_INITRD_HEADER is not set CONFIG_RTL8306_PHY=y CONFIG_RTL8366S_PHY=y -# CONFIG_RTL8366S_PHY_DEBUG_FS is not set CONFIG_RTL8366_SMI=y CONFIG_SCHED_OMIT_FRAME_POINTER=y # CONFIG_SCSI_DMA is not set From 213a414e3ba0dd96a3029f90c13d78cb4bb72597 Mon Sep 17 00:00:00 2001 From: juhosg Date: Tue, 9 Feb 2010 17:55:36 +0000 Subject: [PATCH 04/44] ar71xx: enable CFI probe for the WZR-HP-G300NH git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19567 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/ar71xx/config-2.6.32 | 1 - 1 file changed, 1 deletion(-) diff --git a/target/linux/ar71xx/config-2.6.32 b/target/linux/ar71xx/config-2.6.32 index 2ec93a15c..0defd8672 100644 --- a/target/linux/ar71xx/config-2.6.32 +++ b/target/linux/ar71xx/config-2.6.32 @@ -153,7 +153,6 @@ CONFIG_MIPS_MT_DISABLED=y # CONFIG_MIPS_MT_SMTC is not set # CONFIG_MIPS_SIM is not set CONFIG_MTD_AR91XX_FLASH=y -# CONFIG_MTD_CFI is not set # CONFIG_MTD_CFI_INTELEXT is not set CONFIG_MTD_CMDLINE_PARTS=y CONFIG_MTD_JEDECPROBE=y From ab8bd8a6bda5d4df24ad9a8c33e142981860dfac Mon Sep 17 00:00:00 2001 From: lars Date: Tue, 9 Feb 2010 18:07:36 +0000 Subject: [PATCH 05/44] [base-files] Don't do lazy unmounting of filessystems at reboot/poweroff. It is unneeded and could couse a broken filesystem if unmounting takes to long. Thanks to Peter Wagner git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19568 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/base-files/files/etc/init.d/umount | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/base-files/files/etc/init.d/umount b/package/base-files/files/etc/init.d/umount index d360afed3..a4e477e2e 100755 --- a/package/base-files/files/etc/init.d/umount +++ b/package/base-files/files/etc/init.d/umount @@ -4,5 +4,5 @@ STOP=99 stop() { sync - umount -a -r -l + umount -a -r } From cce5cf4ccd3427b804952d4d53f47454c586f630 Mon Sep 17 00:00:00 2001 From: jow Date: Wed, 10 Feb 2010 00:34:32 +0000 Subject: [PATCH 06/44] [package] dropbear: performance improvements in init script, quiet mode for start-stop-daemon - patch by Matthias Buecher git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19569 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/dropbear/files/dropbear.init | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/package/dropbear/files/dropbear.init b/package/dropbear/files/dropbear.init index 4ee130c3a..85a90d02f 100755 --- a/package/dropbear/files/dropbear.init +++ b/package/dropbear/files/dropbear.init @@ -1,5 +1,5 @@ #!/bin/sh /etc/rc.common -# Copyright (C) 2006-2009 OpenWrt.org +# Copyright (C) 2006-2010 OpenWrt.org # Copyright (C) 2006 Carlos Sobrinho NAME=dropbear @@ -91,7 +91,7 @@ stop() local pidfile for pidfile in `ls /var/run/${NAME}.*.pid` do - start-stop-daemon -K -s KILL -p "${pidfile}" -n "${NAME}" >/dev/null + start-stop-daemon -q -K -s KILL -p "${pidfile}" -n "${NAME}" rm -f "${pidfile}" done [ -z "${pidfile}" ] && echo "${initscript}: no pid files, if you get problems with start then try killclients" @@ -112,12 +112,10 @@ killclients() [ "${pid}" -eq 0 ] && break # check if client connection - ps | grep -e "^[ ]*${pid} " | grep "${PROG}" >/dev/null - if [ $? -eq 0 ] - then + grep -F -q -e "${PROG}" "/proc/${pid}/cmdline" && { append ignore "${pid}" break - fi + } done # get all server pids that should be ignored @@ -130,9 +128,10 @@ killclients() local skip for pid in `pidof "${NAME}"` do - # check if correct program - ps | grep -e "^[ ]*${pid} " | grep "${PROG}" >/dev/null - [ $? -ne 0 ] && continue + # check if correct program, otherwise process next pid + grep -F -q -e "${PROG}" "/proc/${pid}/cmdline" || { + continue + } # check if pid should be ignored (servers, ourself) skip=0 From a02f62c75f5990e1ae196f9cd23d2c1ffd582af7 Mon Sep 17 00:00:00 2001 From: florian Date: Wed, 10 Feb 2010 08:48:29 +0000 Subject: [PATCH 07/44] [cobalt] switch to 2.6.32 git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19571 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/cobalt/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/linux/cobalt/Makefile b/target/linux/cobalt/Makefile index 266e4dfdb..d3a57292c 100644 --- a/target/linux/cobalt/Makefile +++ b/target/linux/cobalt/Makefile @@ -12,7 +12,7 @@ BOARDNAME:=Cobalt Microservers FEATURES:=tgz pci ext2 CFLAGS:=-O2 -pipe -mtune=r5000 -funit-at-a-time -LINUX_VERSION:=2.6.30.10 +LINUX_VERSION:=2.6.32.7 include $(INCLUDE_DIR)/target.mk From 1b043cb00c034f51af0a07fe6a91539938fa6d17 Mon Sep 17 00:00:00 2001 From: florian Date: Wed, 10 Feb 2010 08:48:33 +0000 Subject: [PATCH 08/44] [uml] move 2.6.30 patches to their appropriate directory git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19572 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../001-gcc4_unit_at_a_time_i386_fix.patch | 0 .../{patches => patches-2.6.30}/002-gcc4_unfortify_source.patch | 0 .../uml/{patches => patches-2.6.30}/004-fix_section_warning.patch | 0 .../uml/{patches => patches-2.6.30}/005-fix_bash4_builds.patch | 0 .../901-lib_zlib_deflate_visible.patch | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename target/linux/uml/{patches => patches-2.6.30}/001-gcc4_unit_at_a_time_i386_fix.patch (100%) rename target/linux/uml/{patches => patches-2.6.30}/002-gcc4_unfortify_source.patch (100%) rename target/linux/uml/{patches => patches-2.6.30}/004-fix_section_warning.patch (100%) rename target/linux/uml/{patches => patches-2.6.30}/005-fix_bash4_builds.patch (100%) rename target/linux/uml/{patches => patches-2.6.30}/901-lib_zlib_deflate_visible.patch (100%) diff --git a/target/linux/uml/patches/001-gcc4_unit_at_a_time_i386_fix.patch b/target/linux/uml/patches-2.6.30/001-gcc4_unit_at_a_time_i386_fix.patch similarity index 100% rename from target/linux/uml/patches/001-gcc4_unit_at_a_time_i386_fix.patch rename to target/linux/uml/patches-2.6.30/001-gcc4_unit_at_a_time_i386_fix.patch diff --git a/target/linux/uml/patches/002-gcc4_unfortify_source.patch b/target/linux/uml/patches-2.6.30/002-gcc4_unfortify_source.patch similarity index 100% rename from target/linux/uml/patches/002-gcc4_unfortify_source.patch rename to target/linux/uml/patches-2.6.30/002-gcc4_unfortify_source.patch diff --git a/target/linux/uml/patches/004-fix_section_warning.patch b/target/linux/uml/patches-2.6.30/004-fix_section_warning.patch similarity index 100% rename from target/linux/uml/patches/004-fix_section_warning.patch rename to target/linux/uml/patches-2.6.30/004-fix_section_warning.patch diff --git a/target/linux/uml/patches/005-fix_bash4_builds.patch b/target/linux/uml/patches-2.6.30/005-fix_bash4_builds.patch similarity index 100% rename from target/linux/uml/patches/005-fix_bash4_builds.patch rename to target/linux/uml/patches-2.6.30/005-fix_bash4_builds.patch diff --git a/target/linux/uml/patches/901-lib_zlib_deflate_visible.patch b/target/linux/uml/patches-2.6.30/901-lib_zlib_deflate_visible.patch similarity index 100% rename from target/linux/uml/patches/901-lib_zlib_deflate_visible.patch rename to target/linux/uml/patches-2.6.30/901-lib_zlib_deflate_visible.patch From 03ec19bb1a36174d04d90624b94f9c1810b2c7ec Mon Sep 17 00:00:00 2001 From: juhosg Date: Wed, 10 Feb 2010 20:01:20 +0000 Subject: [PATCH 09/44] ar71xx: fix WLAN mac address on the TL-WR1043ND git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19573 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/ar71xx/files/arch/mips/ar71xx/mach-tl-wr1043nd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/mach-tl-wr1043nd.c b/target/linux/ar71xx/files/arch/mips/ar71xx/mach-tl-wr1043nd.c index 03508dbab..985b9f249 100644 --- a/target/linux/ar71xx/files/arch/mips/ar71xx/mach-tl-wr1043nd.c +++ b/target/linux/ar71xx/files/arch/mips/ar71xx/mach-tl-wr1043nd.c @@ -130,7 +130,7 @@ static void __init tl_wr1043nd_setup(void) ar71xx_add_device_gpio_buttons(-1, TL_WR1043ND_BUTTONS_POLL_INTERVAL, ARRAY_SIZE(tl_wr1043nd_gpio_buttons), tl_wr1043nd_gpio_buttons); - ar913x_add_device_wmac(eeprom, NULL); + ar913x_add_device_wmac(eeprom, mac); } MIPS_MACHINE(AR71XX_MACH_TL_WR1043ND, "TL-WR1043ND", "TP-LINK TL-WR1043ND", From 58a312461e35ace79bbb0a3b3e21215c389ee177 Mon Sep 17 00:00:00 2001 From: thepeople Date: Thu, 11 Feb 2010 02:33:34 +0000 Subject: [PATCH 10/44] Add destination ip of the wan adapter useful if you have multiple ip addresses. git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19574 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/firewall/files/uci_firewall.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package/firewall/files/uci_firewall.sh b/package/firewall/files/uci_firewall.sh index 49e5ca859..207dcd8df 100755 --- a/package/firewall/files/uci_firewall.sh +++ b/package/firewall/files/uci_firewall.sh @@ -343,6 +343,7 @@ fw_redirect() { config_get src $1 src config_get src_ip $1 src_ip + config_get src_dip $1 src_dip config_get src_port $1 src_port config_get src_dport $1 src_dport config_get src_mac $1 src_mac @@ -372,6 +373,7 @@ fw_redirect() { $IPTABLES -A zone_${src}_prerouting -t nat \ ${proto:+-p $proto} \ ${src_ip:+-s $src_ip} \ + ${src_dip:+-d $src_dip} \ ${src_port:+--sport $src_port} \ ${src_dport:+--dport $src_dport} \ ${src_mac:+-m mac --mac-source $src_mac} \ From 5059d246b9aae5b7649ec39c58c24eab8f24e768 Mon Sep 17 00:00:00 2001 From: thepeople Date: Thu, 11 Feb 2010 02:38:08 +0000 Subject: [PATCH 11/44] change the opkg path due to changes in the buildsystem, fixes incorrect path in snapshot images git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19575 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/opkg/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/opkg/Makefile b/package/opkg/Makefile index 6894ae7cb..243e0b6d3 100644 --- a/package/opkg/Makefile +++ b/package/opkg/Makefile @@ -70,7 +70,7 @@ define Package/opkg/install $(INSTALL_DIR) $(1)/bin $(INSTALL_DIR) $(1)/etc $(INSTALL_DATA) ./files/opkg.conf $(1)/etc/ - $(SED) 's,$$$$S,$(PKGARCH),g' $(1)/etc/opkg.conf + $(SED) 's,$$$$S,$(TARGET),g' $(1)/etc/opkg.conf $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/opkg-cl $(1)/bin/opkg endef From c35cd80f405e65a34c1b03d5d53911f227c75548 Mon Sep 17 00:00:00 2001 From: kaloz Date: Thu, 11 Feb 2010 08:30:12 +0000 Subject: [PATCH 12/44] [iop32x]: upgrade to 2.6.32.7, only build squashfs images by default git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19576 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/iop32x/Makefile | 6 +- target/linux/iop32x/config-default | 166 +++++++---------------------- 2 files changed, 40 insertions(+), 132 deletions(-) diff --git a/target/linux/iop32x/Makefile b/target/linux/iop32x/Makefile index 9bb89eee4..d5f419e6c 100644 --- a/target/linux/iop32x/Makefile +++ b/target/linux/iop32x/Makefile @@ -1,5 +1,5 @@ # -# Copyright (C) 2007 OpenWrt.org +# Copyright (C) 2007-2010 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -9,9 +9,9 @@ include $(TOPDIR)/rules.mk ARCH:=arm BOARD:=iop32x BOARDNAME:=Intel IOP32x -FEATURES:=squashfs jffs2 +FEATURES:=squashfs -LINUX_VERSION:=2.6.30.10 +LINUX_VERSION:=2.6.32.7 include $(INCLUDE_DIR)/target.mk diff --git a/target/linux/iop32x/config-default b/target/linux/iop32x/config-default index 96830ae7e..979a4051b 100644 --- a/target/linux/iop32x/config-default +++ b/target/linux/iop32x/config-default @@ -1,46 +1,34 @@ -# CONFIG_8139TOO is not set # CONFIG_AEABI is not set CONFIG_ALIGNMENT_TRAP=y -# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set -# CONFIG_ARCH_HAS_ILOG2_U32 is not set -# CONFIG_ARCH_HAS_ILOG2_U64 is not set CONFIG_ARCH_IOP32X=y # CONFIG_ARCH_IQ31244 is not set # CONFIG_ARCH_IQ80321 is not set -CONFIG_ARCH_SUPPORTS_AOUT=y +CONFIG_ARCH_REQUIRE_GPIOLIB=y +# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set +# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set # CONFIG_ARCH_SUPPORTS_MSI is not set CONFIG_ARCH_SUSPEND_POSSIBLE=y -# CONFIG_ARM_THUMB is not set CONFIG_ARM=y +CONFIG_ARM_L1_CACHE_SHIFT=5 +# CONFIG_ARM_THUMB is not set # CONFIG_ARPD is not set -# CONFIG_ARTHUR is not set -CONFIG_ASYNC_CORE=y CONFIG_ATA=m -# CONFIG_ATMEL is not set -# CONFIG_ATM is not set -# CONFIG_BINFMT_AOUT is not set +# CONFIG_ATA_PIIX is not set CONFIG_BITREVERSE=y -# CONFIG_BLK_DEV_CRYPTOLOOP is not set -# CONFIG_BLK_DEV_NBD is not set -# CONFIG_BONDING is not set -CONFIG_BOUNCE=y -# CONFIG_BSD_DISKLABEL is not set -# CONFIG_CIFS_STATS is not set -CONFIG_CLASSIC_RCU=y +CONFIG_CFG80211_DEFAULT_PS_VALUE=0 CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=squashfs,jffs2 noinitrd console=ttyS0,115200" -CONFIG_CPU_32v5=y CONFIG_CPU_32=y +CONFIG_CPU_32v5=y CONFIG_CPU_ABRT_EV5T=y CONFIG_CPU_CACHE_VIVT=y -CONFIG_CPU_CP15_MMU=y CONFIG_CPU_CP15=y -# CONFIG_CPU_DCACHE_DISABLE is not set -CONFIG_CPU_PABRT_NOIFAR=y +CONFIG_CPU_CP15_MMU=y +CONFIG_CPU_PABRT_LEGACY=y CONFIG_CPU_TLB_V4WBI=y CONFIG_CPU_XSCALE=y CONFIG_CRC16=y -# CONFIG_CRC_CCITT is not set # CONFIG_DEBUG_USER is not set +CONFIG_DECOMPRESS_LZMA=y CONFIG_DEVPORT=y CONFIG_DLCI=m CONFIG_DLCI_MAX=8 @@ -49,169 +37,89 @@ CONFIG_DMADEVICES=y CONFIG_DMA_ENGINE=y CONFIG_DNOTIFY=y # CONFIG_DSCC4 is not set -# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set -# CONFIG_E1000E_ENABLED is not set -CONFIG_E1000_NAPI=y CONFIG_E1000=y -# CONFIG_E100 is not set # CONFIG_FARSYNC is not set # CONFIG_FPE_FASTFPE is not set # CONFIG_FPE_NWFPE is not set CONFIG_FRAME_POINTER=y -CONFIG_FS_POSIX_ACL=y -# CONFIG_GENERIC_CLOCKEVENTS is not set -# CONFIG_GENERIC_FIND_FIRST_BIT is not set -# CONFIG_GENERIC_FIND_NEXT_BIT is not set -# CONFIG_GENERIC_GPIO is not set -# CONFIG_GENERIC_TIME is not set +CONFIG_GENERIC_FIND_LAST_BIT=y +CONFIG_GENERIC_GPIO=y +CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y +CONFIG_GPIOLIB=y # CONFIG_HAMRADIO is not set CONFIG_HARDIRQS_SW_RESEND=y CONFIG_HAS_DMA=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT=y -# CONFIG_HAVE_DMA_ATTRS is not set +CONFIG_HAVE_AOUT=y +CONFIG_HAVE_ARCH_KGDB=y +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_GENERIC_DMA_COHERENT=y CONFIG_HAVE_IDE=y +CONFIG_HAVE_KERNEL_GZIP=y +CONFIG_HAVE_KERNEL_LZMA=y +CONFIG_HAVE_KERNEL_LZO=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_LATENCYTOP_SUPPORT=y CONFIG_HAVE_OPROFILE=y +CONFIG_HDLC=m CONFIG_HDLC_CISCO=m CONFIG_HDLC_FR=m -CONFIG_HDLC=m CONFIG_HDLC_PPP=m -# CONFIG_HDLC_RAW_ETH is not set CONFIG_HDLC_RAW=m -# CONFIG_HERMES is not set -# CONFIG_HWMON_DEBUG_CHIP is not set CONFIG_HWMON=y +# CONFIG_HWMON_DEBUG_CHIP is not set CONFIG_HW_RANDOM=y +CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_CHARDEV=y # CONFIG_I2C_IOP3XX is not set -CONFIG_I2C=y -# CONFIG_IDE is not set CONFIG_INITRAMFS_SOURCE="" CONFIG_INTEL_IOP_ADMA=y # CONFIG_IOP_WATCHDOG is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_MATCH_EUI64 is not set -# CONFIG_IP6_NF_MATCH_FRAG is not set -# CONFIG_IP6_NF_MATCH_HL is not set -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -# CONFIG_IP6_NF_MATCH_OPTS is not set -# CONFIG_IP6_NF_MATCH_RT is not set -# CONFIG_IP6_NF_TARGET_LOG is not set # CONFIG_IP_ADVANCED_ROUTER is not set -CONFIG_IP_MROUTE=y -# CONFIG_IP_NF_ARPTABLES is not set -# CONFIG_IP_NF_MATCH_ADDRTYPE is not set -# CONFIG_IP_NF_MATCH_ECN is not set -# CONFIG_IP_NF_MATCH_RECENT is not set -# CONFIG_IP_NF_MATCH_TIME is not set -# CONFIG_IP_NF_SET is not set -# CONFIG_IP_NF_TARGET_ECN is not set -# CONFIG_IP_NF_TARGET_LOG is not set -# CONFIG_IP_NF_TARGET_NETMAP is not set -# CONFIG_IP_NF_TARGET_TTL is not set -# CONFIG_IP_NF_TARGET_ULOG is not set CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y -CONFIG_IPV6_NDISC_NODETYPE=y -# CONFIG_IPV6_ROUTER_PREF is not set -# CONFIG_IWLWIFI_LEDS is not set # CONFIG_IWMMXT is not set -# CONFIG_LANMEDIA is not set -CONFIG_LEGACY_PTY_COUNT=256 +# CONFIG_KERNEL_BZIP2 is not set +# CONFIG_LEDS_GPIO is not set CONFIG_LEGACY_PTYS=y -# CONFIG_LLC2 is not set -CONFIG_LZO_COMPRESS=m -CONFIG_LZO_DECOMPRESS=m +CONFIG_LEGACY_PTY_COUNT=256 # CONFIG_MACH_EM7210 is not set # CONFIG_MACH_GLANTANK is not set CONFIG_MACH_N2100=y -# CONFIG_MEDIA_TUNER_CUSTOMIZE is not set -CONFIG_MEDIA_TUNER=m -CONFIG_MEDIA_TUNER_MT20XX=m -CONFIG_MEDIA_TUNER_SIMPLE=m -CONFIG_MEDIA_TUNER_TDA8290=m -CONFIG_MEDIA_TUNER_TDA9887=m -CONFIG_MEDIA_TUNER_TEA5761=m -CONFIG_MEDIA_TUNER_TEA5767=m -CONFIG_MEDIA_TUNER_XC2028=m -CONFIG_MEDIA_TUNER_XC5000=m -# CONFIG_MINIX_FS is not set # CONFIG_MTD_CFI_AMDSTD is not set CONFIG_MTD_REDBOOT_PARTS=y -# CONFIG_NE2K_PCI is not set CONFIG_NET_DMA=y -# CONFIG_NET_EMATCH is not set -# CONFIG_NET_IPIP is not set -# CONFIG_NET_SCH_NETEM is not set -# CONFIG_NET_VENDOR_3COM is not set -# CONFIG_NLS_CODEPAGE_437 is not set -# CONFIG_NLS_CODEPAGE_850 is not set -# CONFIG_NLS_ISO8859_15 is not set -# CONFIG_NLS_ISO8859_1 is not set -# CONFIG_NLS_KOI8_R is not set -# CONFIG_NO_IDLE_HZ is not set -# CONFIG_NO_IOPORT is not set -# CONFIG_OABI_COMPAT is not set -# CONFIG_OCF_OCF is not set -# CONFIG_OUTER_CACHE is not set +CONFIG_NLS=m CONFIG_PAGEFLAGS_EXTENDED=y -# CONFIG_PC300 is not set -# CONFIG_PCI200SYN is not set -# CONFIG_PCIPCWATCHDOG is not set +CONFIG_PAGE_OFFSET=0xC0000000 CONFIG_PLAT_IOP=y -# CONFIG_PPP is not set -# CONFIG_PRISM54 is not set -# CONFIG_R6040 is not set -CONFIG_R8169_NAPI=y -CONFIG_R8169_VLAN=y CONFIG_R8169=y +CONFIG_R8169_VLAN=y CONFIG_RTC_CLASS=y CONFIG_RTC_DRV_PCF8563=y CONFIG_RTC_DRV_X1205=y +CONFIG_SCSI=m # CONFIG_SCSI_MULTI_LUN is not set -# CONFIG_SENSORS_PC87360 is not set # CONFIG_SERIAL_8250_EXTENDED is not set -CONFIG_SLABINFO=y -# CONFIG_SMC91X is not set CONFIG_SPLIT_PTLOCK_CPUS=4096 CONFIG_SYS_SUPPORTS_APM_EMULATION=y +# CONFIG_TREE_PREEMPT_RCU is not set +CONFIG_TREE_RCU=y CONFIG_UID16=y -# CONFIG_USB_ACM is not set -# CONFIG_USB_CATC is not set -CONFIG_USB_EHCI_HCD=m -# CONFIG_USB_ISIGHTFW is not set -# CONFIG_USB_KAWETH is not set CONFIG_USB=m +CONFIG_USB_EHCI_HCD=m # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set CONFIG_USB_OHCI_HCD=m -# CONFIG_USB_PEGASUS is not set -# CONFIG_USB_PRINTER is not set -# CONFIG_USB_SERIAL is not set -# CONFIG_USB_STORAGE_ALAUDA is not set -# CONFIG_USB_STORAGE_DATAFAB is not set -# CONFIG_USB_STORAGE_DPCM is not set -# CONFIG_USB_STORAGE_FREECOM is not set -# CONFIG_USB_STORAGE_JUMPSHOT is not set -# CONFIG_USB_STORAGE_KARMA is not set -# CONFIG_USB_STORAGE_SDDR09 is not set -# CONFIG_USB_STORAGE_SDDR55 is not set -# CONFIG_USB_STORAGE_USBAT is not set CONFIG_USB_SUPPORT=y CONFIG_USB_UHCI_HCD=m -# CONFIG_USB_USBNET is not set CONFIG_VECTORS_BASE=0xffff0000 -# CONFIG_VGASTATE is not set -# CONFIG_VIA_RHINE is not set -CONFIG_VIDEO_MEDIA=m CONFIG_VM_EVENT_COUNTERS=y -# CONFIG_WANXL is not set CONFIG_WAN=y -# CONFIG_XFS_FS is not set -# CONFIG_XIP_KERNEL is not set CONFIG_XSCALE_PMU=y CONFIG_ZBOOT_ROM_BSS=0x0 CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZONE_DMA_FLAG=0 From ac57f1f6878fa670776ab469e81c101916972022 Mon Sep 17 00:00:00 2001 From: kaloz Date: Thu, 11 Feb 2010 08:35:33 +0000 Subject: [PATCH 13/44] we use per-target kernel versions for 2.6 for a long time now git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19577 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- include/kernel-version.mk | 2 -- 1 file changed, 2 deletions(-) diff --git a/include/kernel-version.mk b/include/kernel-version.mk index e23289f3f..c2faae0d0 100644 --- a/include/kernel-version.mk +++ b/include/kernel-version.mk @@ -2,8 +2,6 @@ ifeq ($(KERNEL),2.4) LINUX_VERSION?=2.4.37.5 -else - LINUX_VERSION?=2.6.21.7 endif LINUX_RELEASE?=1 From cdce93c921d5ba95387133b6609111ed660f5b5c Mon Sep 17 00:00:00 2001 From: kaloz Date: Thu, 11 Feb 2010 08:37:57 +0000 Subject: [PATCH 14/44] with no users left, remove support for 2.6.21 git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19578 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- Config.in | 1 - include/image.mk | 2 +- include/kernel-version.mk | 3 --- package/mac80211/Makefile | 2 +- tools/Makefile | 2 +- 5 files changed, 3 insertions(+), 7 deletions(-) diff --git a/Config.in b/Config.in index c798510f0..30d7eca4a 100644 --- a/Config.in +++ b/Config.in @@ -23,7 +23,6 @@ menu "Target Images" choice prompt "ramdisk compression" depends TARGET_ROOTFS_INITRAMFS - depends !LINUX_2_6_21 depends !LINUX_2_6_25 default TARGET_INITRAMFS_COMPRESSION_LZMA if TARGET_ar71xx default TARGET_INITRAMFS_COMPRESSION_NONE diff --git a/include/image.mk b/include/image.mk index 990ce8e40..e133f7212 100644 --- a/include/image.mk +++ b/include/image.mk @@ -23,7 +23,7 @@ JFFS2OPTS := --pad --big-endian --squash SQUASHFS_OPTS := -be endif -ifneq ($(CONFIG_LINUX_2_4)$(CONFIG_LINUX_2_6_21)$(CONFIG_LINUX_2_6_25),) +ifneq ($(CONFIG_LINUX_2_4)$(CONFIG_LINUX_2_6_25),) USE_SQUASHFS3 := y endif diff --git a/include/kernel-version.mk b/include/kernel-version.mk index c2faae0d0..b2810ce75 100644 --- a/include/kernel-version.mk +++ b/include/kernel-version.mk @@ -8,9 +8,6 @@ LINUX_RELEASE?=1 ifeq ($(LINUX_VERSION),2.4.37.5) LINUX_KERNEL_MD5SUM:=cb221187422acaf6c63a40c646e5e476 endif -ifeq ($(LINUX_VERSION),2.6.21.7) - LINUX_KERNEL_MD5SUM:=bc15fad1487336d5dcb0945cd039d8ed -endif ifeq ($(LINUX_VERSION),2.6.25.20) LINUX_KERNEL_MD5SUM:=0da698edccf03e2235abc2830a495114 endif diff --git a/package/mac80211/Makefile b/package/mac80211/Makefile index f8d8d390f..a9c868763 100644 --- a/package/mac80211/Makefile +++ b/package/mac80211/Makefile @@ -40,7 +40,7 @@ endef define KernelPackage/mac80211 $(call KernelPackage/mac80211/Default) TITLE:=Linux 802.11 Wireless Networking Stack - DEPENDS+= +kmod-crypto-core +kmod-crypto-arc4 +kmod-crypto-aes +wireless-tools +iw @!LINUX_2_6_21 @!LINUX_2_6_25 + DEPENDS+= +kmod-crypto-core +kmod-crypto-arc4 +kmod-crypto-aes +wireless-tools +iw @!LINUX_2_6_25 FILES:= \ $(PKG_BUILD_DIR)/compat/compat.$(LINUX_KMOD_SUFFIX) \ $(PKG_BUILD_DIR)/compat/compat_firmware_class.$(LINUX_KMOD_SUFFIX) \ diff --git a/tools/Makefile b/tools/Makefile index 3d1989210..8fc2da3d9 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -17,7 +17,7 @@ tools-y += m4 autoconf automake bison pkg-config sed mklibs tools-y += sstrip ipkg-utils genext2fs libuuid mtd-utils mkimage tools-y += firmware-utils patch-cmdline quilt yaffs2 tools-$(CONFIG_TARGET_orion) += wrt350nv2-builder upslug2 -ifneq ($(CONFIG_LINUX_2_4)$(CONFIG_LINUX_2_6_21)$(CONFIG_LINUX_2_6_25),) +ifneq ($(CONFIG_LINUX_2_4)$(CONFIG_LINUX_2_6_25),) tools-y += squashfs lzma-old else ifneq ($(CONFIG_TARGET_ar71xx),) From 6f4062c05197835c5be7d0d76f51e0e48edd68f1 Mon Sep 17 00:00:00 2001 From: kaloz Date: Thu, 11 Feb 2010 08:40:20 +0000 Subject: [PATCH 15/44] remove 2.6.21 patches and config, too git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19579 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic-2.6/config-2.6.21 | 1782 ---- .../patches-2.6.21/001-squashfs.patch | 4160 --------- .../patches-2.6.21/002-lzma_decompress.patch | 788 -- .../patches-2.6.21/003-squashfs_lzma.patch | 107 - .../004-extra_optimization.patch | 12 - .../patches-2.6.21/006-gcc4_inline_fix.patch | 11 - .../patches-2.6.21/007-samsung_flash.patch | 36 - .../009-revert_intel_flash_breakage.patch | 169 - ...0-disable_old_squashfs_compatibility.patch | 19 - .../patches-2.6.21/011-mips_boot.patch | 19 - .../patches-2.6.21/012-mips_cpu_tlb.patch | 18 - .../013-mips_generic_gpio_support.patch | 32 - .../patches-2.6.21/024-mips_disable_fpu.patch | 150 - .../patches-2.6.21/060-rootfs_split.patch | 488 -- .../patches-2.6.21/065-block2mtd_init.patch | 112 - .../100-netfilter_layer7_2.21.patch | 2106 ----- .../101-netfilter_layer7_pktmatch.patch | 109 - .../120-openswan-2.4.0.kernel-2.6-natt.patch | 166 - .../patches-2.6.21/140-netfilter_time.patch | 237 - .../patches-2.6.21/150-netfilter_imq.patch | 872 -- .../patches-2.6.21/160-netfilter_route.patch | 947 -- .../180-netfilter_depends.patch | 20 - .../patches-2.6.21/200-sched_esfq.patch | 789 -- .../201-multiple_default_gateways.patch | 352 - .../202-mips-freestanding.patch | 12 - .../patches-2.6.21/204-jffs2_eofdetect.patch | 56 - .../207-powerpc_asm_segment_h.patch | 9 - .../patches-2.6.21/208-rtl8110sb_fix.patch | 24 - .../patches-2.6.21/209-mini_fo.patch | 7779 ----------------- .../patches-2.6.21/210-d80211_compat.patch | 11 - .../211-no_block2mtd_readahead.patch | 11 - .../212-block2mtd_erase_scan.patch | 11 - .../patches-2.6.21/213-kobject_uevent.patch | 37 - .../30-fix_conflicting_getline.patch | 29 - .../patches-2.6.21/31-use_kbuild.h.patch | 21 - .../32-time_fix_timespec_add_ns.patch | 17 - .../patches-2.6.21/420-gpiodev.patch | 26 - .../patches-2.6.21/510-yaffs_support.patch | 17 - .../511-yaffs_reduce_compiler_warnings.patch | 80 - .../900-headers_type_and_time.patch | 46 - .../902-darwin_scripts_include.patch | 138 - .../patches-2.6.21/903-hostap_txpower.patch | 154 - .../patches-2.6.21/903-stddef_include.patch | 17 - .../patches-2.6.21/904-ls_time_locale.patch | 20 - .../patches-2.6.21/990-buildfix.patch | 7 - .../999-backport_ip_hdr_and_friends.patch | 52 - .../999-use_preinit_as_init.patch | 14 - 47 files changed, 22089 deletions(-) delete mode 100644 target/linux/generic-2.6/config-2.6.21 delete mode 100644 target/linux/generic-2.6/patches-2.6.21/001-squashfs.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/002-lzma_decompress.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/003-squashfs_lzma.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/004-extra_optimization.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/006-gcc4_inline_fix.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/007-samsung_flash.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/009-revert_intel_flash_breakage.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/010-disable_old_squashfs_compatibility.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/011-mips_boot.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/012-mips_cpu_tlb.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/013-mips_generic_gpio_support.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/024-mips_disable_fpu.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/060-rootfs_split.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/065-block2mtd_init.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/100-netfilter_layer7_2.21.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/101-netfilter_layer7_pktmatch.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/120-openswan-2.4.0.kernel-2.6-natt.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/140-netfilter_time.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/150-netfilter_imq.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/160-netfilter_route.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/180-netfilter_depends.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/200-sched_esfq.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/201-multiple_default_gateways.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/202-mips-freestanding.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/204-jffs2_eofdetect.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/207-powerpc_asm_segment_h.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/208-rtl8110sb_fix.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/209-mini_fo.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/210-d80211_compat.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/211-no_block2mtd_readahead.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/212-block2mtd_erase_scan.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/213-kobject_uevent.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/30-fix_conflicting_getline.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/31-use_kbuild.h.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/32-time_fix_timespec_add_ns.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/420-gpiodev.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/510-yaffs_support.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/511-yaffs_reduce_compiler_warnings.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/900-headers_type_and_time.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/902-darwin_scripts_include.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/903-hostap_txpower.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/903-stddef_include.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/904-ls_time_locale.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/990-buildfix.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/999-backport_ip_hdr_and_friends.patch delete mode 100644 target/linux/generic-2.6/patches-2.6.21/999-use_preinit_as_init.patch diff --git a/target/linux/generic-2.6/config-2.6.21 b/target/linux/generic-2.6/config-2.6.21 deleted file mode 100644 index 1d91636b2..000000000 --- a/target/linux/generic-2.6/config-2.6.21 +++ /dev/null @@ -1,1782 +0,0 @@ -# CONFIG_6PACK is not set -# CONFIG_8139CP is not set -# CONFIG_9P_FS is not set -# CONFIG_ACENIC is not set -# CONFIG_ACORN_PARTITION is not set -# CONFIG_ADAPTEC_STARFIRE is not set -# CONFIG_ADFS_FS is not set -# CONFIG_AFFS_FS is not set -# CONFIG_AFS_FS is not set -# CONFIG_AIRO_CS is not set -# CONFIG_AIRO is not set -# CONFIG_AMD8111_ETH is not set -# CONFIG_AMIGA_PARTITION is not set -# CONFIG_APPLICOM is not set -# CONFIG_ARCH_AAEC2000 is not set -# CONFIG_ARCH_AT91 is not set -# CONFIG_ARCH_CLPS711X is not set -# CONFIG_ARCH_CLPS7500 is not set -# CONFIG_ARCH_CO285 is not set -# CONFIG_ARCH_DAVINCI is not set -# CONFIG_ARCH_EBSA110 is not set -# CONFIG_ARCH_EP93XX is not set -CONFIG_ARCH_FLATMEM_ENABLE=y -# CONFIG_ARCH_FOOTBRIDGE is not set -# CONFIG_ARCH_GEMINI is not set -# CONFIG_ARCH_H720X is not set -# CONFIG_ARCH_IMX is not set -# CONFIG_ARCH_INTEGRATOR is not set -# CONFIG_ARCH_IOP13XX is not set -# CONFIG_ARCH_IOP32X is not set -# CONFIG_ARCH_IOP33X is not set -# CONFIG_ARCH_IXP2000 is not set -# CONFIG_ARCH_IXP23XX is not set -# CONFIG_ARCH_IXP4XX is not set -# CONFIG_ARCH_KIRKWOOD is not set -# CONFIG_ARCH_KS8695 is not set -# CONFIG_ARCH_L7200 is not set -# CONFIG_ARCH_LH7A40X is not set -# CONFIG_ARCH_LOKI is not set -# CONFIG_ARCH_MMP is not set -# CONFIG_ARCH_MV78XX0 is not set -# CONFIG_ARCH_MXC is not set -# CONFIG_ARCH_NETX is not set -# CONFIG_ARCH_NS9XXX is not set -# CONFIG_ARCH_OMAP is not set -# CONFIG_ARCH_PNX4008 is not set -# CONFIG_ARCH_PXA is not set -# CONFIG_ARCH_REALVIEW is not set -# CONFIG_ARCH_RPC is not set -# CONFIG_ARCH_S3C2410 is not set -# CONFIG_ARCH_S3C64XX is not set -# CONFIG_ARCH_SA1100 is not set -# CONFIG_ARCH_SHARK is not set -# CONFIG_ARCH_VERSATILE is not set -# CONFIG_ARCNET is not set -CONFIG_ARPD=y -CONFIG_ASK_IP_FIB_HASH=y -# CONFIG_ATA is not set -# CONFIG_ATALK is not set -# CONFIG_ATA_NONSTANDARD is not set -# CONFIG_ATA_OVER_ETH is not set -# CONFIG_ATARI_PARTITION is not set -CONFIG_ATA_SFF=y -# CONFIG_ATL1 is not set -# CONFIG_ATM_AMBASSADOR is not set -CONFIG_ATM_BR2684_IPFILTER=y -# CONFIG_ATM_BR2684 is not set -# CONFIG_ATM_CLIP is not set -CONFIG_ATM_CLIP_NO_ICMP=y -# CONFIG_ATM_DRIVERS is not set -# CONFIG_ATM_DUMMY is not set -# CONFIG_ATMEL is not set -# CONFIG_ATM_ENI is not set -# CONFIG_ATM_FIRESTREAM is not set -# CONFIG_ATM_FORE200E_MAYBE is not set -# CONFIG_ATM_HE is not set -# CONFIG_ATM_HORIZON is not set -# CONFIG_ATM_IA is not set -# CONFIG_ATM_IDT77252 is not set -# CONFIG_ATM is not set -# CONFIG_ATM_LANAI is not set -# CONFIG_ATM_LANE is not set -# CONFIG_ATM_MPOA is not set -# CONFIG_ATM_NICSTAR is not set -# CONFIG_ATM_TCP is not set -# CONFIG_ATM_ZATM is not set -# CONFIG_AUDIT is not set -# CONFIG_AUTOFS4_FS is not set -# CONFIG_AUTOFS_FS is not set -# CONFIG_AX25_DAMA_SLAVE is not set -# CONFIG_AX25 is not set -# CONFIG_B44 is not set -# CONFIG_BACKLIGHT_LCD_SUPPORT is not set -CONFIG_BASE_FULL=y -CONFIG_BASE_SMALL=0 -# CONFIG_BASLER_EXCITE is not set -# CONFIG_BAYCOM_EPP is not set -# CONFIG_BAYCOM_PAR is not set -# CONFIG_BAYCOM_SER_FDX is not set -# CONFIG_BAYCOM_SER_HDX is not set -CONFIG_BCM43XX_DEBUG=y -CONFIG_BCM43XX_DMA_AND_PIO_MODE=y -# CONFIG_BCM43XX_DMA_MODE is not set -CONFIG_BCM43XX_DMA=y -# CONFIG_BCM43XX is not set -# CONFIG_BCM43XX_PIO_MODE is not set -CONFIG_BCM43XX_PIO=y -# CONFIG_BEFS_FS is not set -# CONFIG_BFS_FS is not set -CONFIG_BINFMT_ELF=y -# CONFIG_BINFMT_MISC is not set -# CONFIG_BLK_CPQ_CISS_DA is not set -# CONFIG_BLK_CPQ_DA is not set -# CONFIG_BLK_DEV_3W_XXXX_RAID is not set -# CONFIG_BLK_DEV_AEC62XX is not set -# CONFIG_BLK_DEV_ALI15X3 is not set -# CONFIG_BLK_DEV_AMD74XX is not set -# CONFIG_BLK_DEV_ATIIXP is not set -# CONFIG_BLK_DEV_CMD640 is not set -# CONFIG_BLK_DEV_CMD64X is not set -# CONFIG_BLK_DEV_COW_COMMON is not set -# CONFIG_BLK_DEV_CRYPTOLOOP is not set -# CONFIG_BLK_DEV_CS5520 is not set -# CONFIG_BLK_DEV_CS5530 is not set -# CONFIG_BLK_DEV_CS5535 is not set -# CONFIG_BLK_DEV_CY82C693 is not set -# CONFIG_BLK_DEV_DAC960 is not set -# CONFIG_BLK_DEV_DELKIN is not set -# CONFIG_BLK_DEV_FD is not set -# CONFIG_BLK_DEV_IDECD is not set -# CONFIG_BLK_DEV_IDECS is not set -# CONFIG_BLK_DEV_IDEFLOPPY is not set -# CONFIG_BLK_DEV_IDEPCI is not set -# CONFIG_BLK_DEV_IDEPNP is not set -# CONFIG_BLK_DEV_IDE_SATA is not set -# CONFIG_BLK_DEV_IDESCSI is not set -# CONFIG_BLK_DEV_IDETAPE is not set -CONFIG_BLK_DEV_INITRD=y -# CONFIG_BLK_DEV_IO_TRACE is not set -# CONFIG_BLK_DEV_IT8213 is not set -# CONFIG_BLK_DEV_IT821X is not set -# CONFIG_BLK_DEV_JMICRON is not set -# CONFIG_BLK_DEV_LOOP is not set -# CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_NS87415 is not set -# CONFIG_BLK_DEV_OFFBOARD is not set -# CONFIG_BLK_DEV_OPTI621 is not set -# CONFIG_BLK_DEV_PDC202XX_NEW is not set -# CONFIG_BLK_DEV_PDC202XX_OLD is not set -# CONFIG_BLK_DEV_PIIX is not set -# CONFIG_BLK_DEV_RAM is not set -# CONFIG_BLK_DEV_RZ1000 is not set -# CONFIG_BLK_DEV_SD is not set -# CONFIG_BLK_DEV_SIIMAGE is not set -# CONFIG_BLK_DEV_SIS5513 is not set -# CONFIG_BLK_DEV_SLC90E66 is not set -# CONFIG_BLK_DEV_SR is not set -# CONFIG_BLK_DEV_SVWKS is not set -# CONFIG_BLK_DEV_SX8 is not set -# CONFIG_BLK_DEV_TC86C001 is not set -# CONFIG_BLK_DEV_TRIFLEX is not set -# CONFIG_BLK_DEV_TRM290 is not set -# CONFIG_BLK_DEV_UB is not set -# CONFIG_BLK_DEV_UMEM is not set -CONFIG_BLOCK=y -# CONFIG_BNX2 is not set -# CONFIG_BONDING is not set -# CONFIG_BPQETHER is not set -# CONFIG_BRIDGE_EBT_802_3 is not set -# CONFIG_BRIDGE_EBT_AMONG is not set -# CONFIG_BRIDGE_EBT_ARP is not set -# CONFIG_BRIDGE_EBT_ARPREPLY is not set -# CONFIG_BRIDGE_EBT_BROUTE is not set -# CONFIG_BRIDGE_EBT_DNAT is not set -# CONFIG_BRIDGE_EBT_IP is not set -# CONFIG_BRIDGE_EBT_LIMIT is not set -# CONFIG_BRIDGE_EBT_LOG is not set -# CONFIG_BRIDGE_EBT_MARK is not set -# CONFIG_BRIDGE_EBT_MARK_T is not set -# CONFIG_BRIDGE_EBT_NFLOG is not set -# CONFIG_BRIDGE_EBT_PKTTYPE is not set -# CONFIG_BRIDGE_EBT_REDIRECT is not set -# CONFIG_BRIDGE_EBT_SNAT is not set -# CONFIG_BRIDGE_EBT_STP is not set -# CONFIG_BRIDGE_EBT_T_FILTER is not set -# CONFIG_BRIDGE_EBT_T_NAT is not set -# CONFIG_BRIDGE_EBT_ULOG is not set -# CONFIG_BRIDGE_EBT_VLAN is not set -# CONFIG_BRIDGE_NETFILTER is not set -# CONFIG_BRIDGE_NF_EBTABLES is not set -CONFIG_BRIDGE=y -CONFIG_BROKEN_ON_SMP=y -CONFIG_BSD_DISKLABEL=y -# CONFIG_BSD_PROCESS_ACCT_V3 is not set -CONFIG_BSD_PROCESS_ACCT=y -# CONFIG_BT_BNEP is not set -CONFIG_BT_BNEP_MC_FILTER=y -CONFIG_BT_BNEP_PROTO_FILTER=y -# CONFIG_BT_CMTP is not set -# CONFIG_BT_HCIBCM203X is not set -# CONFIG_BT_HCIBFUSB is not set -# CONFIG_BT_HCIBLUECARD is not set -# CONFIG_BT_HCIBPA10X is not set -# CONFIG_BT_HCIBT3C is not set -# CONFIG_BT_HCIBTUART is not set -# CONFIG_BT_HCIDTL1 is not set -CONFIG_BT_HCIUART_BCSP=y -CONFIG_BT_HCIUART_H4=y -# CONFIG_BT_HCIUART is not set -# CONFIG_BT_HCIUSB is not set -CONFIG_BT_HCIUSB_SCO=y -# CONFIG_BT_HCIVHCI is not set -# CONFIG_BT_HIDP is not set -# CONFIG_BT is not set -# CONFIG_BT_L2CAP is not set -# CONFIG_BT_RFCOMM is not set -CONFIG_BT_RFCOMM_TTY=y -# CONFIG_BT_SCO is not set -CONFIG_BUG=y -# CONFIG_CAPI_AVM is not set -# CONFIG_CAPI_EICON is not set -# CONFIG_CAPI_TRACE is not set -CONFIG_CARDBUS=y -# CONFIG_CARDMAN_4000 is not set -# CONFIG_CARDMAN_4040 is not set -# CONFIG_CASSINI is not set -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -# CONFIG_CDROM_PKTCDVD is not set -# CONFIG_CHELSIO_T1 is not set -# CONFIG_CHELSIO_T3 is not set -# CONFIG_CHR_DEV_OSST is not set -# CONFIG_CHR_DEV_SCH is not set -# CONFIG_CHR_DEV_SG is not set -# CONFIG_CHR_DEV_ST is not set -# CONFIG_CICADA_PHY is not set -# CONFIG_CIFS_DEBUG2 is not set -# CONFIG_CIFS_EXPERIMENTAL is not set -# CONFIG_CIFS is not set -CONFIG_CIFS_POSIX=y -# CONFIG_CIFS_STATS2 is not set -CONFIG_CIFS_STATS=y -# CONFIG_CIFS_WEAK_PW_HASH is not set -# CONFIG_CIFS_XATTR is not set -CONFIG_CLS_U32_MARK=y -CONFIG_CLS_U32_PERF=y -CONFIG_CMDLINE="" -# CONFIG_CODA_FS is not set -# CONFIG_CONFIGFS_FS is not set -# CONFIG_CONNECTOR is not set -# CONFIG_CPU_FREQ is not set -# CONFIG_CRAMFS is not set -# CONFIG_CRC16 is not set -CONFIG_CRC32=y -# CONFIG_CRC_CCITT is not set -CONFIG_CROSSCOMPILE=y -# CONFIG_CRYPTO_AES is not set -# CONFIG_CRYPTO_ALGAPI is not set -# CONFIG_CRYPTO_ANUBIS is not set -# CONFIG_CRYPTO_ARC4 is not set -# CONFIG_CRYPTO_BLKCIPHER is not set -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST6 is not set -# CONFIG_CRYPTO_CBC is not set -# CONFIG_CRYPTO_CRC32C is not set -# CONFIG_CRYPTO_DEFLATE is not set -# CONFIG_CRYPTO_DES is not set -# CONFIG_CRYPTO_ECB is not set -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_GF128MUL is not set -# CONFIG_CRYPTO_HASH is not set -# CONFIG_CRYPTO_HMAC is not set -# CONFIG_CRYPTO_KHAZAD is not set -# CONFIG_CRYPTO_LRW is not set -# CONFIG_CRYPTO_MANAGER is not set -# CONFIG_CRYPTO_MD4 is not set -# CONFIG_CRYPTO_MD5 is not set -# CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_NULL is not set -# CONFIG_CRYPTO_PCBC is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_SHA1 is not set -# CONFIG_CRYPTO_SHA256 is not set -# CONFIG_CRYPTO_SHA512 is not set -# CONFIG_CRYPTO_TEA is not set -# CONFIG_CRYPTO_TEST is not set -# CONFIG_CRYPTO_TGR192 is not set -# CONFIG_CRYPTO_TWOFISH_COMMON is not set -# CONFIG_CRYPTO_TWOFISH is not set -# CONFIG_CRYPTO_WP512 is not set -# CONFIG_CRYPTO_XCBC is not set -CONFIG_CRYPTO=y -# CONFIG_DAVICOM_PHY is not set -# CONFIG_DEBUG_BUGVERBOSE is not set -# CONFIG_DEBUG_FS is not set -# CONFIG_DEBUG_KERNEL is not set -# CONFIG_DECNET is not set -# CONFIG_DEFAULT_AS is not set -# CONFIG_DEFAULT_BIC is not set -# CONFIG_DEFAULT_CFQ is not set -# CONFIG_DEFAULT_CUBIC is not set -CONFIG_DEFAULT_DEADLINE=y -# CONFIG_DEFAULT_HTCP is not set -CONFIG_DEFAULT_IOSCHED="deadline" -# CONFIG_DEFAULT_NOOP is not set -# CONFIG_DEFAULT_RENO is not set -CONFIG_DEFAULT_TCP_CONG="westwood" -# CONFIG_DEFAULT_VEGAS is not set -CONFIG_DEFAULT_WESTWOOD=y -CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" -# CONFIG_DEVFS_DEBUG is not set -CONFIG_DEVFS_FS=y -CONFIG_DEVFS_MOUNT=y -# CONFIG_DGRS is not set -# CONFIG_DISCONTIGMEM_MANUAL is not set -# CONFIG_DL2K is not set -# CONFIG_DLM is not set -# CONFIG_DMA_ENGINE is not set -# CONFIG_DNOTIFY is not set -# CONFIG_DRM is not set -# CONFIG_DTLK is not set -# CONFIG_DUMMY is not set -# CONFIG_DVB is not set -# CONFIG_E1000 is not set -# CONFIG_E100 is not set -# CONFIG_ECONET is not set -# CONFIG_EEPRO100 is not set -# CONFIG_EFI_PARTITION is not set -# CONFIG_EFS_FS is not set -# CONFIG_ELF_CORE is not set -CONFIG_EMBEDDED=y -# CONFIG_ENABLE_MUST_CHECK is not set -# CONFIG_EPIC100 is not set -CONFIG_EPOLL=y -# CONFIG_EQUALIZER is not set -CONFIG_EXPERIMENTAL=y -# CONFIG_EXPORTFS is not set -# CONFIG_EXT2_FS is not set -# CONFIG_EXT2_FS_XATTR is not set -# CONFIG_EXT2_FS_XIP is not set -# CONFIG_EXT3_FS is not set -# CONFIG_EXT3_FS_XATTR is not set -# CONFIG_EXT4DEV_FS is not set -CONFIG_FAT_DEFAULT_CODEPAGE=437 -CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" -# CONFIG_FAT_FS is not set -# CONFIG_FB_BACKLIGHT is not set -# CONFIG_FB_CFB_COPYAREA is not set -# CONFIG_FB_CFB_FILLRECT is not set -# CONFIG_FB_CFB_IMAGEBLIT is not set -# CONFIG_FB_DDC is not set -# CONFIG_FB_IBM_GXT4500 is not set -# CONFIG_FB is not set -# CONFIG_FB_MACMODES is not set -# CONFIG_FB_MBX is not set -# CONFIG_FB_MODE_HELPERS is not set -# CONFIG_FB_PXA is not set -# CONFIG_FB_S1D13XXX is not set -# CONFIG_FB_SVGALIB is not set -# CONFIG_FB_TILEBLITTING is not set -# CONFIG_FB_VIRTUAL is not set -# CONFIG_FDDI is not set -# CONFIG_FEALNX is not set -CONFIG_FIB_RULES=y -CONFIG_FLATMEM_MANUAL=y -CONFIG_FLATMEM=y -CONFIG_FLAT_NODE_MEM_MAP=y -# CONFIG_FORCEDETH is not set -# CONFIG_FS_POSIX_ACL is not set -# CONFIG_FTL is not set -# CONFIG_FUSE_FS is not set -# CONFIG_FUSION_FC is not set -# CONFIG_FUSION is not set -# CONFIG_FUSION_SAS is not set -# CONFIG_FUSION_SPI is not set -CONFIG_FUTEX=y -CONFIG_FW_LOADER=y -CONFIG_GACT_PROB=y -# CONFIG_GAMEPORT is not set -CONFIG_GENERIC_CALIBRATE_DELAY=y -CONFIG_GENERIC_HARDIRQS=y -CONFIG_GENERIC_HWEIGHT=y -CONFIG_GENERIC_IRQ_PROBE=y -CONFIG_GENERIC_TIME=y -# CONFIG_GFS2_FS is not set -# CONFIG_GPIO_DEVICE is not set -# CONFIG_HAMACHI is not set -CONFIG_HAMRADIO=y -# CONFIG_HAPPYMEAL is not set -# CONFIG_HEADERS_CHECK is not set -# CONFIG_HERMES is not set -# CONFIG_HFS_FS is not set -# CONFIG_HFSPLUS_FS is not set -# CONFIG_HID_DEBUG is not set -# CONFIG_HID_FF is not set -# CONFIG_HIPPI is not set -# CONFIG_HOSTAP_CS is not set -# CONFIG_HOSTAP is not set -# CONFIG_HOSTAP_PCI is not set -# CONFIG_HOSTAP_PLX is not set -# CONFIG_HOTPLUG_PCI is not set -CONFIG_HOTPLUG=y -# CONFIG_HP100 is not set -# CONFIG_HPFS_FS is not set -# CONFIG_HUGETLB_PAGE is not set -# CONFIG_HWMON is not set -# CONFIG_HWMON_VID is not set -CONFIG_HZ=100 -# CONFIG_HZ_1000 is not set -CONFIG_HZ_100=y -# CONFIG_HZ_1024 is not set -# CONFIG_HZ_128 is not set -# CONFIG_HZ_250 is not set -# CONFIG_HZ_256 is not set -# CONFIG_HZ_300 is not set -# CONFIG_HZ_48 is not set -# CONFIG_I2C_ALGOPCA is not set -# CONFIG_I2C_ALGOPCF is not set -# CONFIG_I2C_ALI1535 is not set -# CONFIG_I2C_ALI1563 is not set -# CONFIG_I2C_ALI15X3 is not set -# CONFIG_I2C_AMD756 is not set -# CONFIG_I2C_AMD8111 is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set -# CONFIG_I2C_DEBUG_CHIP is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_ELEKTOR is not set -# CONFIG_I2C_I801 is not set -# CONFIG_I2C_I810 is not set -# CONFIG_I2C is not set -# CONFIG_I2C_NFORCE2 is not set -# CONFIG_I2C_OCORES is not set -# CONFIG_I2C_PARPORT_LIGHT is not set -# CONFIG_I2C_PCA_ISA is not set -# CONFIG_I2C_PIIX4 is not set -# CONFIG_I2C_PROSAVAGE is not set -# CONFIG_I2C_SAVAGE4 is not set -# CONFIG_I2C_SIS5595 is not set -# CONFIG_I2C_SIS630 is not set -# CONFIG_I2C_SIS96X is not set -# CONFIG_I2C_STUB is not set -# CONFIG_I2C_VIA is not set -# CONFIG_I2C_VIAPRO is not set -# CONFIG_I2C_VOODOO3 is not set -# CONFIG_I2O is not set -# CONFIG_I82092 is not set -# CONFIG_IDEDISK_MULTI_MODE is not set -CONFIG_IDE_MAX_HWIFS=4 -# CONFIG_IDE_TASK_IOCTL is not set -# CONFIG_IEEE1394 is not set -# CONFIG_IEEE80211_CRYPT_CCMP is not set -# CONFIG_IEEE80211_CRYPT_TKIP is not set -# CONFIG_IEEE80211_CRYPT_WEP is not set -# CONFIG_IEEE80211_DEBUG is not set -# CONFIG_IEEE80211 is not set -# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set -# CONFIG_IEEE80211_SOFTMAC is not set -# CONFIG_IFB is not set -# CONFIG_IKCONFIG is not set -# CONFIG_IKCONFIG_PROC is not set -# CONFIG_IMQ_BEHAVIOR_AA is not set -# CONFIG_IMQ_BEHAVIOR_AB is not set -CONFIG_IMQ_BEHAVIOR_BA=y -# CONFIG_IMQ_BEHAVIOR_BB is not set -# CONFIG_IMQ is not set -CONFIG_IMQ_NUM_DEVS=2 -# CONFIG_INET6_AH is not set -# CONFIG_INET6_ESP is not set -# CONFIG_INET6_IPCOMP is not set -# CONFIG_INET6_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_BEET is not set -# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set -# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET6_XFRM_MODE_TUNNEL is not set -# CONFIG_INET6_XFRM_TUNNEL is not set -# CONFIG_INET_AH is not set -# CONFIG_INET_DCCP_DIAG is not set -# CONFIG_INET_DIAG is not set -# CONFIG_INET_ESP is not set -# CONFIG_INET_IPCOMP is not set -# CONFIG_INET_TCP_DIAG is not set -# CONFIG_INET_TUNNEL is not set -# CONFIG_INET_XFRM_MODE_BEET is not set -# CONFIG_INET_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET_XFRM_MODE_TUNNEL is not set -# CONFIG_INET_XFRM_TUNNEL is not set -CONFIG_INET=y -# CONFIG_INFINIBAND is not set -# CONFIG_INFTL is not set -CONFIG_INIT_ENV_ARG_LIMIT=32 -# CONFIG_INOTIFY is not set -# CONFIG_INOTIFY_USER is not set -# CONFIG_INPUT_ATI_REMOTE2 is not set -# CONFIG_INPUT_ATI_REMOTE is not set -# CONFIG_INPUT_EVBUG is not set -# CONFIG_INPUT_EVDEV is not set -# CONFIG_INPUT_FF_MEMLESS is not set -# CONFIG_INPUT is not set -# CONFIG_INPUT_JOYDEV is not set -# CONFIG_INPUT_JOYSTICK is not set -# CONFIG_INPUT_KEYBOARD is not set -# CONFIG_INPUT_KEYSPAN_REMOTE is not set -CONFIG_INPUT_MISC=y -# CONFIG_INPUT_MOUSEDEV is not set -# CONFIG_INPUT_MOUSE is not set -# CONFIG_INPUT_PCSPKR is not set -# CONFIG_INPUT_POWERMATE is not set -# CONFIG_INPUT_TOUCHSCREEN is not set -# CONFIG_INPUT_TSDEV is not set -# CONFIG_INPUT_UINPUT is not set -# CONFIG_INPUT_WISTRON_BTNS is not set -# CONFIG_IOSCHED_AS is not set -# CONFIG_IOSCHED_CFQ is not set -CONFIG_IOSCHED_DEADLINE=y -CONFIG_IOSCHED_NOOP=y -# CONFIG_IP6_NF_FILTER is not set -# CONFIG_IP6_NF_IPTABLES is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_MATCH_AH is not set -# CONFIG_IP6_NF_MATCH_EUI64 is not set -# CONFIG_IP6_NF_MATCH_FRAG is not set -# CONFIG_IP6_NF_MATCH_HL is not set -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -# CONFIG_IP6_NF_MATCH_LIMIT is not set -# CONFIG_IP6_NF_MATCH_MH is not set -# CONFIG_IP6_NF_MATCH_OPTS is not set -# CONFIG_IP6_NF_MATCH_OWNER is not set -# CONFIG_IP6_NF_MATCH_RT is not set -# CONFIG_IP6_NF_QUEUE is not set -# CONFIG_IP6_NF_RAW is not set -# CONFIG_IP6_NF_TARGET_HL is not set -# CONFIG_IP6_NF_TARGET_IMQ is not set -# CONFIG_IP6_NF_TARGET_LOG is not set -# CONFIG_IP6_NF_TARGET_REJECT is not set -# CONFIG_IP6_NF_TARGET_ROUTE is not set -CONFIG_IP_ADVANCED_ROUTER=y -# CONFIG_IPC_NS is not set -CONFIG_IP_DCCP_ACKVEC=y -# CONFIG_IP_DCCP_CCID2_DEBUG is not set -# CONFIG_IP_DCCP_CCID2 is not set -# CONFIG_IP_DCCP_CCID3_DEBUG is not set -# CONFIG_IP_DCCP_CCID3 is not set -CONFIG_IP_DCCP_CCID3_RTO=100 -# CONFIG_IP_DCCP is not set -# CONFIG_IP_DCCP_TFRC_LIB is not set -CONFIG_IP_FIB_HASH=y -# CONFIG_IP_FIB_TRIE is not set -# CONFIG_IPMI_HANDLER is not set -CONFIG_IP_MROUTE=y -CONFIG_IP_MULTICAST=y -CONFIG_IP_MULTIPLE_TABLES=y -# CONFIG_IP_NF_AMANDA is not set -# CONFIG_IP_NF_ARPFILTER is not set -# CONFIG_IP_NF_ARP_MANGLE is not set -# CONFIG_IP_NF_ARPTABLES is not set -# CONFIG_IP_NF_CONNTRACK_EVENTS is not set -CONFIG_IP_NF_CONNTRACK_MARK=y -# CONFIG_IP_NF_CONNTRACK_SUPPORT is not set -CONFIG_IP_NF_CONNTRACK=y -CONFIG_IP_NF_CT_ACCT=y -# CONFIG_IP_NF_CT_PROTO_SCTP is not set -CONFIG_IP_NF_FILTER=y -# CONFIG_IP_NF_FTP is not set -# CONFIG_IP_NF_H323 is not set -CONFIG_IP_NF_IPTABLES=y -# CONFIG_IP_NF_IRC is not set -CONFIG_IP_NF_MANGLE=y -# CONFIG_IP_NF_MATCH_ADDRTYPE is not set -# CONFIG_IP_NF_MATCH_AH is not set -# CONFIG_IP_NF_MATCH_ECN is not set -# CONFIG_IP_NF_MATCH_HASHLIMIT is not set -# CONFIG_IP_NF_MATCH_IPP2P is not set -# CONFIG_IP_NF_MATCH_IPRANGE is not set -# CONFIG_IP_NF_MATCH_OWNER is not set -# CONFIG_IP_NF_MATCH_RECENT is not set -# CONFIG_IP_NF_MATCH_SET is not set -# CONFIG_IP_NF_MATCH_TIME is not set -# CONFIG_IP_NF_MATCH_TOS is not set -# CONFIG_IP_NF_MATCH_TTL is not set -# CONFIG_IP_NF_NAT_AMANDA is not set -# CONFIG_IP_NF_NAT_FTP is not set -# CONFIG_IP_NF_NAT_H323 is not set -# CONFIG_IP_NF_NAT_IRC is not set -CONFIG_IP_NF_NAT_NEEDED=y -# CONFIG_IP_NF_NAT_PPTP is not set -# CONFIG_IP_NF_NAT_SIP is not set -# CONFIG_IP_NF_NAT_SNMP_BASIC is not set -# CONFIG_IP_NF_NAT_TFTP is not set -CONFIG_IP_NF_NAT=y -# CONFIG_IP_NF_NETBIOS_NS is not set -# CONFIG_IP_NF_PPTP is not set -# CONFIG_IP_NF_QUEUE is not set -# CONFIG_IP_NF_RAW is not set -CONFIG_IP_NF_SET_HASHSIZE=1024 -# CONFIG_IP_NF_SET_IPHASH is not set -# CONFIG_IP_NF_SET_IPMAP is not set -# CONFIG_IP_NF_SET_IPPORTHASH is not set -# CONFIG_IP_NF_SET_IPTREE is not set -# CONFIG_IP_NF_SET_IPTREEMAP is not set -# CONFIG_IP_NF_SET is not set -# CONFIG_IP_NF_SET_MACIPMAP is not set -CONFIG_IP_NF_SET_MAX=256 -# CONFIG_IP_NF_SET_NETHASH is not set -# CONFIG_IP_NF_SET_PORTMAP is not set -# CONFIG_IP_NF_SIP is not set -# CONFIG_IP_NF_TARGET_CLUSTERIP is not set -# CONFIG_IP_NF_TARGET_ECN is not set -# CONFIG_IP_NF_TARGET_IMQ is not set -# CONFIG_IP_NF_TARGET_LOG is not set -CONFIG_IP_NF_TARGET_MASQUERADE=y -# CONFIG_IP_NF_TARGET_NETMAP is not set -CONFIG_IP_NF_TARGET_REDIRECT=y -CONFIG_IP_NF_TARGET_REJECT=y -# CONFIG_IP_NF_TARGET_ROUTE is not set -# CONFIG_IP_NF_TARGET_SAME is not set -# CONFIG_IP_NF_TARGET_SET is not set -CONFIG_IP_NF_TARGET_TCPMSS=y -# CONFIG_IP_NF_TARGET_TOS is not set -# CONFIG_IP_NF_TARGET_TTL is not set -# CONFIG_IP_NF_TARGET_ULOG is not set -# CONFIG_IP_NF_TFTP is not set -# CONFIG_IP_PIMSM_V1 is not set -# CONFIG_IP_PIMSM_V2 is not set -# CONFIG_IP_PNP is not set -CONFIG_IP_ROUTE_FWMARK=y -CONFIG_IP_ROUTE_MULTIPATH_CACHED=y -# CONFIG_IP_ROUTE_MULTIPATH_DRR is not set -# CONFIG_IP_ROUTE_MULTIPATH_RANDOM is not set -# CONFIG_IP_ROUTE_MULTIPATH_RR is not set -# CONFIG_IP_ROUTE_MULTIPATH_WRANDOM is not set -CONFIG_IP_ROUTE_MULTIPATH=y -CONFIG_IP_ROUTE_VERBOSE=y -# CONFIG_IP_SCTP is not set -CONFIG_IPSEC_NAT_TRAVERSAL=y -# CONFIG_IPV6 is not set -# CONFIG_IPV6_MIP6 is not set -# CONFIG_IPV6_MULTIPLE_TABLES is not set -# CONFIG_IPV6_PRIVACY is not set -# CONFIG_IPV6_ROUTE_INFO is not set -CONFIG_IPV6_ROUTER_PREF=y -# CONFIG_IPV6_SIT is not set -# CONFIG_IPV6_TUNNEL is not set -# CONFIG_IP_VS is not set -# CONFIG_IPW2100_DEBUG is not set -# CONFIG_IPW2100 is not set -CONFIG_IPW2100_MONITOR=y -# CONFIG_IPW2200_DEBUG is not set -# CONFIG_IPW2200 is not set -CONFIG_IPW2200_MONITOR=y -# CONFIG_IPW2200_PROMISCUOUS is not set -# CONFIG_IPW2200_QOS is not set -# CONFIG_IPW2200_RADIOTAP is not set -# CONFIG_IPX is not set -# CONFIG_IRDA is not set -# CONFIG_ISCSI_TCP is not set -# CONFIG_ISDN_CAPI_CAPI20 is not set -CONFIG_ISDN_CAPI_CAPIFS_BOOL=y -# CONFIG_ISDN_CAPI_CAPIFS is not set -# CONFIG_ISDN_CAPI is not set -CONFIG_ISDN_CAPI_MIDDLEWARE=y -# CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON is not set -# CONFIG_ISDN_I4L is not set -# CONFIG_ISDN is not set -# CONFIG_ISO9660_FS is not set -# CONFIG_IXGB is not set -# CONFIG_JBD_DEBUG is not set -# CONFIG_JBD is not set -# CONFIG_JFFS2_CMODE_NONE is not set -CONFIG_JFFS2_CMODE_PRIORITY=y -# CONFIG_JFFS2_CMODE_SIZE is not set -CONFIG_JFFS2_COMPRESSION_OPTIONS=y -CONFIG_JFFS2_FS_DEBUG=0 -CONFIG_JFFS2_FS_WRITEBUFFER=y -# CONFIG_JFFS2_FS_XATTR is not set -CONFIG_JFFS2_FS=y -CONFIG_JFFS2_RTIME=y -# CONFIG_JFFS2_RUBIN is not set -CONFIG_JFFS2_SUMMARY=y -CONFIG_JFFS2_ZLIB=y -# CONFIG_JFFS_FS is not set -# CONFIG_JFS_DEBUG is not set -# CONFIG_JFS_FS is not set -# CONFIG_JFS_POSIX_ACL is not set -# CONFIG_JFS_SECURITY is not set -# CONFIG_JFS_STATISTICS is not set -CONFIG_JOLIET=y -# CONFIG_KALLSYMS is not set -# CONFIG_KARMA_PARTITION is not set -# CONFIG_KEXEC is not set -# CONFIG_KEYS is not set -CONFIG_KMOD=y -# CONFIG_LAPB is not set -# CONFIG_LASAT is not set -# CONFIG_LBD is not set -# CONFIG_LDM_PARTITION is not set -CONFIG_LEDS_CLASS=y -CONFIG_LEDS_TRIGGER_HEARTBEAT=y -# CONFIG_LEDS_TRIGGER_IDE_DISK is not set -# CONFIG_LEDS_TRIGGER_MORSE is not set -CONFIG_LEDS_TRIGGERS=y -CONFIG_LEDS_TRIGGER_TIMER=y -# CONFIG_LEGACY_PTYS is not set -# CONFIG_LIBCRC32C is not set -# CONFIG_LLC2 is not set -CONFIG_LLC=y -CONFIG_LOCALVERSION="" -# CONFIG_LOCALVERSION_AUTO is not set -CONFIG_LOCKDEP_SUPPORT=y -# CONFIG_LOCKD is not set -CONFIG_LOCKD_V4=y -CONFIG_LOG_BUF_SHIFT=14 -# CONFIG_LSF is not set -# CONFIG_LXT_PHY is not set -# CONFIG_MAC_EMUMOUSEBTN is not set -# CONFIG_MAC_PARTITION is not set -# CONFIG_MAGIC_SYSRQ is not set -# CONFIG_MARKEINS is not set -# CONFIG_MARVELL_PHY is not set -# CONFIG_MD is not set -# CONFIG_MEGARAID_LEGACY is not set -# CONFIG_MEGARAID_NEWGEN is not set -# CONFIG_MEGARAID_SAS is not set -# CONFIG_MFD_SM501 is not set -CONFIG_MII=y -CONFIG_MINI_FO=y -# CONFIG_MINIX_FS is not set -# CONFIG_MINIX_SUBPARTITION is not set -# CONFIG_MIPS_FPU_EMU is not set -# CONFIG_MKISS is not set -CONFIG_MMC_BLOCK_BOUNCE=y -# CONFIG_MMC_BLOCK is not set -# CONFIG_MMC_DEBUG is not set -# CONFIG_MMC is not set -# CONFIG_MMC_PXA is not set -CONFIG_MMU=y -# CONFIG_MODULE_FORCE_UNLOAD is not set -# CONFIG_MODULE_SRCVERSION_ALL is not set -CONFIG_MODULES=y -CONFIG_MODULE_UNLOAD=y -# CONFIG_MODVERSIONS is not set -# CONFIG_MSDOS_FS is not set -CONFIG_MSDOS_PARTITION=y -# CONFIG_MTD_ABSENT is not set -# CONFIG_MTD_AFS_PARTS is not set -# CONFIG_MTD_ARM_INTEGRATOR is not set -CONFIG_MTD_BLKDEVS=y -# CONFIG_MTD_BLOCK2MTD is not set -CONFIG_MTD_BLOCK=y -# CONFIG_MTD_CFI_ADV_OPTIONS is not set -CONFIG_MTD_CFI_AMDSTD=y -# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set -CONFIG_MTD_CFI_I1=y -CONFIG_MTD_CFI_I2=y -# CONFIG_MTD_CFI_I4 is not set -# CONFIG_MTD_CFI_I8 is not set -CONFIG_MTD_CFI_INTELEXT=y -# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set -CONFIG_MTD_CFI_NOSWAP=y -# CONFIG_MTD_CFI_STAA is not set -CONFIG_MTD_CFI_UTIL=y -CONFIG_MTD_CFI=y -CONFIG_MTD_CHAR=y -# CONFIG_MTD_CMDLINE_PARTS is not set -CONFIG_MTD_COMPLEX_MAPPINGS=y -# CONFIG_MTD_CONCAT is not set -# CONFIG_MTD_DEBUG is not set -# CONFIG_MTD_DOC2000 is not set -# CONFIG_MTD_DOC2001 is not set -# CONFIG_MTD_DOC2001PLUS is not set -CONFIG_MTD_GEN_PROBE=y -# CONFIG_MTD_JEDECPROBE is not set -# CONFIG_MTD_LPDDR is not set -# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set -CONFIG_MTD_MAP_BANK_WIDTH_1=y -CONFIG_MTD_MAP_BANK_WIDTH_2=y -# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set -CONFIG_MTD_MAP_BANK_WIDTH_4=y -# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set -# CONFIG_MTD_MTDRAM is not set -# CONFIG_MTD_NAND_CAFE is not set -# CONFIG_MTD_NAND_DISKONCHIP is not set -# CONFIG_MTD_NAND_ECC_SMC is not set -CONFIG_MTD_NAND_IDS=y -# CONFIG_MTD_NAND is not set -# CONFIG_MTD_NAND_MUSEUM_IDS is not set -# CONFIG_MTD_NAND_NANDSIM is not set -# CONFIG_MTD_NAND_PLATFORM is not set -# CONFIG_MTD_NAND_VERIFY_WRITE is not set -# CONFIG_MTD_ONENAND is not set -# CONFIG_MTD_OTP is not set -CONFIG_MTD_PARTITIONS=y -# CONFIG_MTD_PCI is not set -# CONFIG_MTD_PHRAM is not set -# CONFIG_MTD_PHYSMAP is not set -# CONFIG_MTD_PLATRAM is not set -# CONFIG_MTD_PMC551 is not set -# CONFIG_MTD_RAM is not set -CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 -# CONFIG_MTD_REDBOOT_PARTS is not set -CONFIG_MTD_REDBOOT_PARTS_READONLY=y -# CONFIG_MTD_ROM is not set -CONFIG_MTD_ROOTFS_ROOT_DEV=y -CONFIG_MTD_ROOTFS_SPLIT=y -# CONFIG_MTD_SLRAM is not set -CONFIG_MTD=y -# CONFIG_MYRI10GE is not set -# CONFIG_NATSEMI is not set -# CONFIG_NCP_FS is not set -# CONFIG_NET_ACT_GACT is not set -# CONFIG_NET_ACT_IPT is not set -# CONFIG_NET_ACT_MIRRED is not set -# CONFIG_NET_ACT_PEDIT is not set -# CONFIG_NET_ACT_POLICE is not set -# CONFIG_NET_ACT_SIMP is not set -CONFIG_NET_CLS_ACT=y -# CONFIG_NET_CLS_BASIC is not set -# CONFIG_NET_CLS_FW is not set -CONFIG_NET_CLS_IND=y -CONFIG_NET_CLS_POLICE=y -# CONFIG_NET_CLS_ROUTE4 is not set -CONFIG_NET_CLS_ROUTE=y -# CONFIG_NET_CLS_RSVP6 is not set -# CONFIG_NET_CLS_RSVP is not set -# CONFIG_NET_CLS_TCINDEX is not set -# CONFIG_NET_CLS_U32 is not set -CONFIG_NET_CLS=y -# CONFIG_NETCONSOLE is not set -# CONFIG_NETDEBUG is not set -CONFIG_NETDEVICES=y -# CONFIG_NET_EMATCH_CMP is not set -# CONFIG_NET_EMATCH_META is not set -# CONFIG_NET_EMATCH_NBYTE is not set -CONFIG_NET_EMATCH_STACK=32 -# CONFIG_NET_EMATCH_TEXT is not set -# CONFIG_NET_EMATCH_U32 is not set -CONFIG_NET_EMATCH=y -CONFIG_NET_ESTIMATOR=y -CONFIG_NET_ETHERNET=y -# CONFIG_NET_FC is not set -# CONFIG_NETFILTER_DEBUG is not set -# CONFIG_NETFILTER_NETLINK is not set -CONFIG_NETFILTER_XTABLES=y -# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set -# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set -# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set -CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y -# CONFIG_NETFILTER_XT_MATCH_DCCP is not set -# CONFIG_NETFILTER_XT_MATCH_DSCP is not set -# CONFIG_NETFILTER_XT_MATCH_ESP is not set -# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set -# CONFIG_NETFILTER_XT_MATCH_HELPER is not set -# CONFIG_NETFILTER_XT_MATCH_LAYER7_DEBUG is not set -# CONFIG_NETFILTER_XT_MATCH_LAYER7 is not set -# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set -CONFIG_NETFILTER_XT_MATCH_LIMIT=y -# CONFIG_NETFILTER_XT_MATCH_MAC is not set -# CONFIG_NETFILTER_XT_MATCH_MARK is not set -CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y -# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set -# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set -# CONFIG_NETFILTER_XT_MATCH_POLICY is not set -# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set -# CONFIG_NETFILTER_XT_MATCH_REALM is not set -# CONFIG_NETFILTER_XT_MATCH_SCTP is not set -CONFIG_NETFILTER_XT_MATCH_STATE=y -# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set -# CONFIG_NETFILTER_XT_MATCH_STRING is not set -CONFIG_NETFILTER_XT_MATCH_TCPMSS=y -# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set -# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set -# CONFIG_NETFILTER_XT_TARGET_DSCP is not set -# CONFIG_NETFILTER_XT_TARGET_MARK is not set -# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set -# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set -# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set -CONFIG_NETFILTER_XT_TARGET_TCPMSS=y -CONFIG_NETFILTER=y -CONFIG_NET_IPGRE_BROADCAST=y -# CONFIG_NET_IPGRE is not set -# CONFIG_NET_IPIP is not set -# CONFIG_NET_KEY is not set -# CONFIG_NET_KEY_MIGRATE is not set -CONFIG_NET_PCI=y -# CONFIG_NET_PCMCIA is not set -# CONFIG_NET_PKTGEN is not set -# CONFIG_NET_POLL_CONTROLLER is not set -# CONFIG_NETPOLL is not set -CONFIG_NET_RADIO=y -# CONFIG_NETROM is not set -# CONFIG_NET_SCH_ATM is not set -# CONFIG_NET_SCH_CBQ is not set -# CONFIG_NET_SCH_CLK_CPU is not set -# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set -CONFIG_NET_SCH_CLK_JIFFIES=y -# CONFIG_NET_SCH_DSMARK is not set -CONFIG_NET_SCHED=y -# CONFIG_NET_SCH_ESFQ is not set -# CONFIG_NET_SCH_GRED is not set -# CONFIG_NET_SCH_HFSC is not set -# CONFIG_NET_SCH_HTB is not set -# CONFIG_NET_SCH_INGRESS is not set -# CONFIG_NET_SCH_NETEM is not set -# CONFIG_NET_SCH_PRIO is not set -# CONFIG_NET_SCH_RED is not set -# CONFIG_NET_SCH_SFQ is not set -# CONFIG_NET_SCH_TBF is not set -# CONFIG_NET_SCH_TEQL is not set -# CONFIG_NET_TULIP is not set -CONFIG_NET_WIRELESS_RTNETLINK=y -CONFIG_NET_WIRELESS=y -# CONFIG_NETWORK_SECMARK is not set -# CONFIG_NETXEN_NIC is not set -CONFIG_NET=y -CONFIG_NEW_LEDS=y -# CONFIG_NF_CONNTRACK_AMANDA is not set -CONFIG_NF_CONNTRACK_ENABLED=y -# CONFIG_NF_CONNTRACK_EVENTS is not set -# CONFIG_NF_CONNTRACK_FTP is not set -# CONFIG_NF_CONNTRACK_H323 is not set -CONFIG_NF_CONNTRACK_IPV4=y -# CONFIG_NF_CONNTRACK_IPV6 is not set -# CONFIG_NF_CONNTRACK_IRC is not set -CONFIG_NF_CONNTRACK_MARK=y -# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set -# CONFIG_NF_CONNTRACK_PPTP is not set -CONFIG_NF_CONNTRACK_PROC_COMPAT=y -# CONFIG_NF_CONNTRACK_SANE is not set -# CONFIG_NF_CONNTRACK_SIP is not set -CONFIG_NF_CONNTRACK_SUPPORT=y -# CONFIG_NF_CONNTRACK_TFTP is not set -CONFIG_NF_CONNTRACK=y -CONFIG_NF_CT_ACCT=y -# CONFIG_NF_CT_PROTO_SCTP is not set -# CONFIG_NF_NAT_AMANDA is not set -# CONFIG_NF_NAT_FTP is not set -# CONFIG_NF_NAT_H323 is not set -# CONFIG_NF_NAT_IRC is not set -CONFIG_NF_NAT_NEEDED=y -# CONFIG_NF_NAT_PPTP is not set -# CONFIG_NF_NAT_SIP is not set -# CONFIG_NF_NAT_SNMP_BASIC is not set -# CONFIG_NF_NAT_TFTP is not set -CONFIG_NF_NAT=y -# CONFIG_NFS_ACL_SUPPORT is not set -CONFIG_NFS_COMMON=y -# CONFIG_NFS_DIRECTIO is not set -# CONFIG_NFSD is not set -CONFIG_NFSD_TCP=y -# CONFIG_NFSD_V2_ACL is not set -# CONFIG_NFSD_V3_ACL is not set -CONFIG_NFSD_V3=y -CONFIG_NFSD_V4=y -# CONFIG_NFS_FS is not set -# CONFIG_NFS_V3_ACL is not set -CONFIG_NFS_V3=y -CONFIG_NFS_V4=y -# CONFIG_NFTL is not set -# CONFIG_NLS_ASCII is not set -# CONFIG_NLS_CODEPAGE_1250 is not set -# CONFIG_NLS_CODEPAGE_1251 is not set -# CONFIG_NLS_CODEPAGE_437 is not set -# CONFIG_NLS_CODEPAGE_737 is not set -# CONFIG_NLS_CODEPAGE_775 is not set -# CONFIG_NLS_CODEPAGE_850 is not set -# CONFIG_NLS_CODEPAGE_852 is not set -# CONFIG_NLS_CODEPAGE_855 is not set -# CONFIG_NLS_CODEPAGE_857 is not set -# CONFIG_NLS_CODEPAGE_860 is not set -# CONFIG_NLS_CODEPAGE_861 is not set -# CONFIG_NLS_CODEPAGE_862 is not set -# CONFIG_NLS_CODEPAGE_863 is not set -# CONFIG_NLS_CODEPAGE_864 is not set -# CONFIG_NLS_CODEPAGE_865 is not set -# CONFIG_NLS_CODEPAGE_866 is not set -# CONFIG_NLS_CODEPAGE_869 is not set -# CONFIG_NLS_CODEPAGE_874 is not set -# CONFIG_NLS_CODEPAGE_932 is not set -# CONFIG_NLS_CODEPAGE_936 is not set -# CONFIG_NLS_CODEPAGE_949 is not set -# CONFIG_NLS_CODEPAGE_950 is not set -CONFIG_NLS_DEFAULT="iso8859-1" -# CONFIG_NLS is not set -# CONFIG_NLS_ISO8859_13 is not set -# CONFIG_NLS_ISO8859_14 is not set -# CONFIG_NLS_ISO8859_15 is not set -# CONFIG_NLS_ISO8859_1 is not set -# CONFIG_NLS_ISO8859_2 is not set -# CONFIG_NLS_ISO8859_3 is not set -# CONFIG_NLS_ISO8859_4 is not set -# CONFIG_NLS_ISO8859_5 is not set -# CONFIG_NLS_ISO8859_6 is not set -# CONFIG_NLS_ISO8859_7 is not set -# CONFIG_NLS_ISO8859_8 is not set -# CONFIG_NLS_ISO8859_9 is not set -# CONFIG_NLS_KOI8_R is not set -# CONFIG_NLS_KOI8_U is not set -# CONFIG_NLS_UTF8 is not set -# CONFIG_NORTEL_HERMES is not set -# CONFIG_NS83820 is not set -# CONFIG_NTFS_DEBUG is not set -# CONFIG_NTFS_FS is not set -# CONFIG_NTFS_RW is not set -# CONFIG_NVRAM is not set -# CONFIG_OCFS2_FS is not set -# CONFIG_OSF_PARTITION is not set -CONFIG_PACKET_MMAP=y -CONFIG_PACKET=y -# CONFIG_PAGE_SIZE_16KB is not set -CONFIG_PAGE_SIZE_4KB=y -# CONFIG_PAGE_SIZE_64KB is not set -# CONFIG_PAGE_SIZE_8KB is not set -# CONFIG_PARPORT is not set -CONFIG_PARTITION_ADVANCED=y -# CONFIG_PATA_ALI is not set -# CONFIG_PATA_AMD is not set -# CONFIG_PATA_ARTOP is not set -# CONFIG_PATA_ATIIXP is not set -# CONFIG_PATA_CMD64X is not set -# CONFIG_PATA_CS5520 is not set -# CONFIG_PATA_CS5530 is not set -# CONFIG_PATA_CS5535 is not set -# CONFIG_PATA_CYPRESS is not set -# CONFIG_PATA_EFAR is not set -# CONFIG_PATA_HPT366 is not set -# CONFIG_PATA_HPT37X is not set -# CONFIG_PATA_HPT3X2N is not set -# CONFIG_PATA_HPT3X3 is not set -# CONFIG_PATA_ISAPNP is not set -# CONFIG_PATA_IT8213 is not set -# CONFIG_PATA_IT821X is not set -# CONFIG_PATA_JMICRON is not set -# CONFIG_PATA_LEGACY is not set -# CONFIG_PATA_MARVELL is not set -# CONFIG_PATA_MPIIX is not set -# CONFIG_PATA_NETCELL is not set -# CONFIG_PATA_NS87410 is not set -# CONFIG_PATA_OLDPIIX is not set -# CONFIG_PATA_OPTIDMA is not set -# CONFIG_PATA_OPTI is not set -# CONFIG_PATA_PCMCIA is not set -# CONFIG_PATA_PDC2027X is not set -# CONFIG_PATA_PDC_OLD is not set -# CONFIG_PATA_PLATFORM is not set -# CONFIG_PATA_QDI is not set -# CONFIG_PATA_RADISYS is not set -# CONFIG_PATA_RZ1000 is not set -# CONFIG_PATA_SC1200 is not set -# CONFIG_PATA_SERVERWORKS is not set -# CONFIG_PATA_SIL680 is not set -# CONFIG_PATA_SIS is not set -# CONFIG_PATA_TRIFLEX is not set -# CONFIG_PATA_VIA is not set -# CONFIG_PATA_WINBOND is not set -# CONFIG_PATA_WINBOND_VLB is not set -# CONFIG_PC300TOO is not set -# CONFIG_PCCARD is not set -# CONFIG_PCI_ATMEL is not set -# CONFIG_PCI_HERMES is not set -CONFIG_PCI_SYSCALL=y -CONFIG_PCI=y -# CONFIG_PCMCIA_AHA152X is not set -# CONFIG_PCMCIA_ATMEL is not set -# CONFIG_PCMCIA_DEBUG is not set -# CONFIG_PCMCIA_FDOMAIN is not set -# CONFIG_PCMCIA_HERMES is not set -# CONFIG_PCMCIA_IOCTL is not set -# CONFIG_PCMCIA is not set -# CONFIG_PCMCIA_LOAD_CIS is not set -# CONFIG_PCMCIA_NETWAVE is not set -# CONFIG_PCMCIA_NINJA_SCSI is not set -# CONFIG_PCMCIA_QLOGIC is not set -# CONFIG_PCMCIA_RAYCS is not set -# CONFIG_PCMCIA_SPECTRUM is not set -# CONFIG_PCMCIA_SYM53C500 is not set -# CONFIG_PCMCIA_WAVELAN is not set -# CONFIG_PCMCIA_WL3501 is not set -# CONFIG_PCNET32 is not set -# CONFIG_PCSPKR_PLATFORM is not set -# CONFIG_PD6729 is not set -# CONFIG_PHONE is not set -# CONFIG_PHYLIB is not set -CONFIG_PLIST=y -# CONFIG_PLX_HERMES is not set -# CONFIG_PM is not set -# CONFIG_POSIX_MQUEUE is not set -# CONFIG_PPP_ASYNC is not set -# CONFIG_PPP_BSDCOMP is not set -# CONFIG_PPP_DEFLATE is not set -CONFIG_PPP_FILTER=y -# CONFIG_PPP is not set -# CONFIG_PPP_MPPE is not set -CONFIG_PPP_MULTILINK=y -# CONFIG_PPPOATM is not set -# CONFIG_PPPOE is not set -# CONFIG_PPP_SYNC_TTY is not set -# CONFIG_PREEMPT is not set -CONFIG_PREEMPT_NONE=y -# CONFIG_PREEMPT_VOLUNTARY is not set -CONFIG_PREVENT_FIRMWARE_BUILD=y -# CONFIG_PRINTK_TIME is not set -CONFIG_PRINTK=y -# CONFIG_PRISM54 is not set -CONFIG_PROC_FS=y -CONFIG_PROC_KCORE=y -CONFIG_PROC_SYSCTL=y -# CONFIG_PROFILING is not set -# CONFIG_QEMU is not set -# CONFIG_QLA3XXX is not set -# CONFIG_QNX4FS_FS is not set -# CONFIG_QUOTA is not set -# CONFIG_R3964 is not set -# CONFIG_R8169 is not set -# CONFIG_RADIO_AZTECH is not set -# CONFIG_RADIO_CADET is not set -# CONFIG_RADIO_GEMTEK is not set -# CONFIG_RADIO_GEMTEK_PCI is not set -# CONFIG_RADIO_MAESTRO is not set -# CONFIG_RADIO_MAXIRADIO is not set -# CONFIG_RADIO_RTRACK2 is not set -# CONFIG_RADIO_RTRACK is not set -# CONFIG_RADIO_SF16FMI is not set -# CONFIG_RADIO_SF16FMR2 is not set -# CONFIG_RADIO_TERRATEC is not set -# CONFIG_RADIO_TRUST is not set -# CONFIG_RADIO_TYPHOON is not set -# CONFIG_RADIO_ZOLTRIX is not set -# CONFIG_RAID_ATTRS is not set -CONFIG_RAMFS=y -# CONFIG_RAW_DRIVER is not set -# CONFIG_REISERFS_CHECK is not set -# CONFIG_REISERFS_FS is not set -# CONFIG_REISERFS_FS_XATTR is not set -# CONFIG_REISERFS_PROC_INFO is not set -# CONFIG_RELAY is not set -# CONFIG_RESOURCES_64BIT is not set -# CONFIG_RFD_FTL is not set -# CONFIG_ROMFS_FS is not set -# CONFIG_ROSE is not set -# CONFIG_RPCSEC_GSS_KRB5 is not set -# CONFIG_RPCSEC_GSS_SPKM3 is not set -# CONFIG_RTC_CLASS is not set -# CONFIG_RTC_DEBUG is not set -CONFIG_RTC_DRV_CMOS=y -# CONFIG_RTC_DRV_DS1307 is not set -# CONFIG_RTC_DRV_DS1374 is not set -# CONFIG_RTC_DRV_DS1553 is not set -# CONFIG_RTC_DRV_DS1672 is not set -# CONFIG_RTC_DRV_DS1742 is not set -# CONFIG_RTC_DRV_ISL1208 is not set -# CONFIG_RTC_DRV_M41T80 is not set -# CONFIG_RTC_DRV_M48T59 is not set -# CONFIG_RTC_DRV_M48T86 is not set -# CONFIG_RTC_DRV_PCF50606 is not set -# CONFIG_RTC_DRV_PCF8563 is not set -# CONFIG_RTC_DRV_PCF8583 is not set -# CONFIG_RTC_DRV_RS5C372 is not set -# CONFIG_RTC_DRV_STK17TA8 is not set -# CONFIG_RTC_DRV_TEST is not set -# CONFIG_RTC_DRV_V3020 is not set -# CONFIG_RTC_DRV_X1205 is not set -CONFIG_RTC_HCTOSYS_DEVICE="rtc0" -CONFIG_RTC_HCTOSYS=y -# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set -CONFIG_RTC_LIB=y -CONFIG_RT_MUTEXES=y -CONFIG_RWSEM_GENERIC_SPINLOCK=y -# CONFIG_S2IO is not set -# CONFIG_SATA_INIC162X is not set -# CONFIG_SATA_MV is not set -# CONFIG_SATA_NV is not set -# CONFIG_SATA_PROMISE is not set -# CONFIG_SATA_QSTOR is not set -# CONFIG_SATA_SIL24 is not set -# CONFIG_SATA_SIL is not set -# CONFIG_SATA_SIS is not set -# CONFIG_SATA_SVW is not set -# CONFIG_SATA_SX4 is not set -# CONFIG_SATA_ULI is not set -# CONFIG_SATA_VIA is not set -# CONFIG_SATA_VITESSE is not set -# CONFIG_SC92031 is not set -# CONFIG_SCSI_3W_9XXX is not set -# CONFIG_SCSI_7000FASST is not set -# CONFIG_SCSI_AACRAID is not set -# CONFIG_SCSI_ACARD is not set -# CONFIG_SCSI_ADVANSYS is not set -# CONFIG_SCSI_AHA152X is not set -# CONFIG_SCSI_AHA1542 is not set -# CONFIG_SCSI_AIC79XX is not set -# CONFIG_SCSI_AIC7XXX is not set -# CONFIG_SCSI_AIC7XXX_OLD is not set -# CONFIG_SCSI_AIC94XX is not set -# CONFIG_SCSI_ARCMSR is not set -# CONFIG_SCSI_BUSLOGIC is not set -# CONFIG_SCSI_CONSTANTS is not set -# CONFIG_SCSI_DC390T is not set -# CONFIG_SCSI_DC395x is not set -# CONFIG_SCSI_DEBUG is not set -# CONFIG_SCSI_DMX3191D is not set -# CONFIG_SCSI_DPT_I2O is not set -# CONFIG_SCSI_DTC3280 is not set -# CONFIG_SCSI_EATA is not set -# CONFIG_SCSI_FC_ATTRS is not set -# CONFIG_SCSI_FUTURE_DOMAIN is not set -# CONFIG_SCSI_GDTH is not set -# CONFIG_SCSI_GENERIC_NCR5380 is not set -# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set -# CONFIG_SCSI_HPTIOP is not set -# CONFIG_SCSI_IN2000 is not set -# CONFIG_SCSI_INIA100 is not set -# CONFIG_SCSI_INITIO is not set -# CONFIG_SCSI_IPR is not set -# CONFIG_SCSI_IPS is not set -# CONFIG_SCSI_ISCSI_ATTRS is not set -# CONFIG_SCSI is not set -# CONFIG_SCSI_LOGGING is not set -# CONFIG_SCSI_LPFC is not set -CONFIG_SCSI_MULTI_LUN=y -# CONFIG_SCSI_NCR53C406A is not set -# CONFIG_SCSI_NETLINK is not set -# CONFIG_SCSI_NSP32 is not set -# CONFIG_SCSI_PAS16 is not set -CONFIG_SCSI_PROC_FS=y -# CONFIG_SCSI_PSI240I is not set -# CONFIG_SCSI_QLA_FC is not set -# CONFIG_SCSI_QLA_ISCSI is not set -# CONFIG_SCSI_QLOGIC_1280 is not set -# CONFIG_SCSI_QLOGIC_FAS is not set -# CONFIG_SCSI_SAS_ATTRS is not set -# CONFIG_SCSI_SAS_LIBSAS is not set -# CONFIG_SCSI_SCAN_ASYNC is not set -# CONFIG_SCSI_SEAGATE is not set -# CONFIG_SCSI_SPI_ATTRS is not set -# CONFIG_SCSI_SRP is not set -# CONFIG_SCSI_STEX is not set -# CONFIG_SCSI_SYM53C416 is not set -# CONFIG_SCSI_SYM53C8XX_2 is not set -# CONFIG_SCSI_T128 is not set -# CONFIG_SCSI_TGT is not set -# CONFIG_SCSI_U14_34F is not set -# CONFIG_SCSI_ULTRASTOR is not set -# CONFIG_SECURITY is not set -CONFIG_SELECT_MEMORY_MODEL=y -# CONFIG_SENSORS_ABITUGURU is not set -# CONFIG_SENSORS_ADM1021 is not set -# CONFIG_SENSORS_ADM1025 is not set -# CONFIG_SENSORS_ADM1026 is not set -# CONFIG_SENSORS_ADM1029 is not set -# CONFIG_SENSORS_ADM1031 is not set -# CONFIG_SENSORS_ADM9240 is not set -# CONFIG_SENSORS_ASB100 is not set -# CONFIG_SENSORS_ATXP1 is not set -# CONFIG_SENSORS_DS1337 is not set -# CONFIG_SENSORS_DS1374 is not set -# CONFIG_SENSORS_DS1621 is not set -# CONFIG_SENSORS_EEPROM is not set -# CONFIG_SENSORS_F71805F is not set -# CONFIG_SENSORS_FSCHER is not set -# CONFIG_SENSORS_FSCPOS is not set -# CONFIG_SENSORS_GL518SM is not set -# CONFIG_SENSORS_GL520SM is not set -# CONFIG_SENSORS_HDAPS is not set -# CONFIG_SENSORS_IT87 is not set -# CONFIG_SENSORS_K8TEMP is not set -# CONFIG_SENSORS_LM63 is not set -# CONFIG_SENSORS_LM75 is not set -# CONFIG_SENSORS_LM77 is not set -# CONFIG_SENSORS_LM78 is not set -# CONFIG_SENSORS_LM80 is not set -# CONFIG_SENSORS_LM83 is not set -# CONFIG_SENSORS_LM85 is not set -# CONFIG_SENSORS_LM87 is not set -# CONFIG_SENSORS_LM90 is not set -# CONFIG_SENSORS_LM92 is not set -# CONFIG_SENSORS_MAX1619 is not set -# CONFIG_SENSORS_MAX6875 is not set -# CONFIG_SENSORS_PC87427 is not set -# CONFIG_SENSORS_PCA9539 is not set -# CONFIG_SENSORS_PCF8574 is not set -# CONFIG_SENSORS_PCF8591 is not set -# CONFIG_SENSORS_SIS5595 is not set -# CONFIG_SENSORS_SMSC47B397 is not set -# CONFIG_SENSORS_SMSC47M192 is not set -# CONFIG_SENSORS_SMSC47M1 is not set -# CONFIG_SENSORS_VIA686A is not set -# CONFIG_SENSORS_VT1211 is not set -# CONFIG_SENSORS_VT8231 is not set -# CONFIG_SENSORS_W83627EHF is not set -# CONFIG_SENSORS_W83627HF is not set -# CONFIG_SENSORS_W83781D is not set -# CONFIG_SENSORS_W83791D is not set -# CONFIG_SENSORS_W83792D is not set -# CONFIG_SENSORS_W83793 is not set -# CONFIG_SENSORS_W83L785TS is not set -CONFIG_SERIAL_8250_CONSOLE=y -# CONFIG_SERIAL_8250_CS is not set -CONFIG_SERIAL_8250_NR_UARTS=2 -# CONFIG_SERIAL_8250_PCI is not set -CONFIG_SERIAL_8250_RUNTIME_UARTS=2 -CONFIG_SERIAL_8250=y -CONFIG_SERIAL_CORE_CONSOLE=y -CONFIG_SERIAL_CORE=y -# CONFIG_SERIAL_JSM is not set -# CONFIG_SERIAL_NONSTANDARD is not set -# CONFIG_SERIAL_UARTLITE is not set -# CONFIG_SERIO is not set -# CONFIG_SGI_IOC4 is not set -# CONFIG_SGI_PARTITION is not set -# CONFIG_SHAPER is not set -CONFIG_SHMEM=y -# CONFIG_SIS190 is not set -# CONFIG_SIS900 is not set -# CONFIG_SK98LIN is not set -# CONFIG_SKGE is not set -# CONFIG_SKY2 is not set -CONFIG_SLAB=y -# CONFIG_SLHC is not set -# CONFIG_SLIP is not set -# CONFIG_SLOB is not set -# CONFIG_SMB_FS is not set -# CONFIG_SMB_NLS_DEFAULT is not set -# CONFIG_SMP is not set -# CONFIG_SND_AC97_POWER_SAVE is not set -# CONFIG_SND_AD1816A is not set -# CONFIG_SND_AD1848 is not set -# CONFIG_SND_AD1889 is not set -# CONFIG_SND_ADLIB is not set -# CONFIG_SND_ALI5451 is not set -# CONFIG_SND_ALS100 is not set -# CONFIG_SND_ALS300 is not set -# CONFIG_SND_ALS4000 is not set -# CONFIG_SND_ATIIXP is not set -# CONFIG_SND_ATIIXP_MODEM is not set -# CONFIG_SND_AU8810 is not set -# CONFIG_SND_AU8820 is not set -# CONFIG_SND_AU8830 is not set -# CONFIG_SND_AZT2320 is not set -# CONFIG_SND_AZT3328 is not set -# CONFIG_SND_BT87X is not set -# CONFIG_SND_CA0106 is not set -# CONFIG_SND_CMI8330 is not set -# CONFIG_SND_CMIPCI is not set -# CONFIG_SND_CS4231 is not set -# CONFIG_SND_CS4232 is not set -# CONFIG_SND_CS4236 is not set -# CONFIG_SND_CS4281 is not set -# CONFIG_SND_CS46XX is not set -# CONFIG_SND_CS5535AUDIO is not set -# CONFIG_SND_DARLA20 is not set -# CONFIG_SND_DARLA24 is not set -# CONFIG_SND_DEBUG is not set -# CONFIG_SND_DT019X is not set -# CONFIG_SND_DUMMY is not set -# CONFIG_SND_DYNAMIC_MINORS is not set -# CONFIG_SND_ECHO3G is not set -# CONFIG_SND_EMU10K1 is not set -# CONFIG_SND_EMU10K1X is not set -# CONFIG_SND_ENS1370 is not set -# CONFIG_SND_ENS1371 is not set -# CONFIG_SND_ES1688 is not set -# CONFIG_SND_ES18XX is not set -# CONFIG_SND_ES1938 is not set -# CONFIG_SND_ES1968 is not set -# CONFIG_SND_ES968 is not set -# CONFIG_SND_FM801 is not set -# CONFIG_SND_GINA20 is not set -# CONFIG_SND_GINA24 is not set -# CONFIG_SND_GUSCLASSIC is not set -# CONFIG_SND_GUSEXTREME is not set -# CONFIG_SND_GUSMAX is not set -# CONFIG_SND_HDA_INTEL is not set -# CONFIG_SND_HDSP is not set -# CONFIG_SND_HDSPM is not set -# CONFIG_SND_HWDEP is not set -# CONFIG_SND_ICE1712 is not set -# CONFIG_SND_ICE1724 is not set -# CONFIG_SND_INDIGODJ is not set -# CONFIG_SND_INDIGOIO is not set -# CONFIG_SND_INDIGO is not set -# CONFIG_SND_INTEL8X0 is not set -# CONFIG_SND_INTEL8X0M is not set -# CONFIG_SND_INTERWAVE is not set -# CONFIG_SND_INTERWAVE_STB is not set -# CONFIG_SND is not set -# CONFIG_SND_KORG1212 is not set -# CONFIG_SND_LAYLA20 is not set -# CONFIG_SND_LAYLA24 is not set -# CONFIG_SND_MAESTRO3 is not set -# CONFIG_SND_MIA is not set -# CONFIG_SND_MIRO is not set -# CONFIG_SND_MIXART is not set -# CONFIG_SND_MIXER_OSS is not set -# CONFIG_SND_MONA is not set -# CONFIG_SND_MPU401 is not set -# CONFIG_SND_MTPAV is not set -# CONFIG_SND_NM256 is not set -# CONFIG_SND_OPL3SA2 is not set -# CONFIG_SND_OPTI92X_AD1848 is not set -# CONFIG_SND_OPTI92X_CS4231 is not set -# CONFIG_SND_OPTI93X is not set -CONFIG_SND_OSSEMUL=y -# CONFIG_SND_PCM is not set -# CONFIG_SND_PCM_OSS is not set -CONFIG_SND_PCM_OSS_PLUGINS=y -# CONFIG_SND_PCXHR is not set -# CONFIG_SND_PDAUDIOCF is not set -# CONFIG_SND_RAWMIDI is not set -# CONFIG_SND_RIPTIDE is not set -# CONFIG_SND_RME32 is not set -# CONFIG_SND_RME9652 is not set -# CONFIG_SND_RME96 is not set -# CONFIG_SND_RTCTIMER is not set -# CONFIG_SND_SB16 is not set -# CONFIG_SND_SB8 is not set -# CONFIG_SND_SBAWE is not set -# CONFIG_SND_SEQUENCER is not set -# CONFIG_SND_SERIAL_U16550 is not set -# CONFIG_SND_SGALAXY is not set -# CONFIG_SND_SOC is not set -# CONFIG_SND_SONICVIBES is not set -# CONFIG_SND_SSCAPE is not set -# CONFIG_SND_SUPPORT_OLD_API is not set -# CONFIG_SND_TIMER is not set -# CONFIG_SND_TRIDENT is not set -# CONFIG_SND_USB_AUDIO is not set -# CONFIG_SND_USB_USX2Y is not set -# CONFIG_SND_VERBOSE_PRINTK is not set -CONFIG_SND_VERBOSE_PROCFS=y -# CONFIG_SND_VIA82XX is not set -# CONFIG_SND_VIA82XX_MODEM is not set -# CONFIG_SND_VX222 is not set -# CONFIG_SND_VXPOCKET is not set -# CONFIG_SND_WAVEFRONT is not set -# CONFIG_SND_YMFPCI is not set -# CONFIG_SNI_RM is not set -# CONFIG_SOFT_WATCHDOG is not set -# CONFIG_SOLARIS_X86_PARTITION is not set -# CONFIG_SOUND is not set -# CONFIG_SOUND_PRIME is not set -# CONFIG_SPARSEMEM_MANUAL is not set -# CONFIG_SPARSEMEM_STATIC is not set -# CONFIG_SPI is not set -# CONFIG_SPI_MASTER is not set -CONFIG_SPLIT_PTLOCK_CPUS=4 -# CONFIG_SQUASHFS_EMBEDDED is not set -CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 -# CONFIG_SQUASHFS_VMALLOC is not set -CONFIG_SQUASHFS=y -# CONFIG_SSFDC is not set -CONFIG_STACKTRACE_SUPPORT=y -CONFIG_STANDALONE=y -# CONFIG_STRIP is not set -# CONFIG_SUNDANCE is not set -# CONFIG_SUNGEM is not set -# CONFIG_SUN_PARTITION is not set -# CONFIG_SUNRPC_GSS is not set -# CONFIG_SUNRPC is not set -CONFIG_SWAP=y -# CONFIG_SYNCLINK_CS is not set -CONFIG_SYN_COOKIES=y -CONFIG_SYSCTL_SYSCALL=y -CONFIG_SYSCTL=y -# CONFIG_SYSFS_DEPRECATED is not set -CONFIG_SYSFS=y -# CONFIG_SYS_HYPERVISOR is not set -# CONFIG_SYSV_FS is not set -CONFIG_SYSVIPC_SYSCTL=y -CONFIG_SYSVIPC=y -# CONFIG_TASKSTATS is not set -# CONFIG_TCG_TPM is not set -CONFIG_TCP_CONG_ADVANCED=y -# CONFIG_TCP_CONG_BIC is not set -# CONFIG_TCP_CONG_CUBIC is not set -# CONFIG_TCP_CONG_HSTCP is not set -# CONFIG_TCP_CONG_HTCP is not set -# CONFIG_TCP_CONG_HYBLA is not set -# CONFIG_TCP_CONG_LP is not set -# CONFIG_TCP_CONG_SCALABLE is not set -# CONFIG_TCP_CONG_VEGAS is not set -# CONFIG_TCP_CONG_VENO is not set -CONFIG_TCP_CONG_WESTWOOD=y -# CONFIG_TCP_MD5SIG is not set -# CONFIG_TEXTSEARCH_BM is not set -# CONFIG_TEXTSEARCH_FSM is not set -# CONFIG_TEXTSEARCH_KMP is not set -CONFIG_TEXTSEARCH=y -CONFIG_TICK_ONESHOT=y -# CONFIG_TIFM_CORE is not set -# CONFIG_TIGON3 is not set -# CONFIG_TINY_SHMEM is not set -# CONFIG_TIPC is not set -# CONFIG_TLAN is not set -# CONFIG_TMD_HERMES is not set -# CONFIG_TMPFS_POSIX_ACL is not set -CONFIG_TMPFS=y -# CONFIG_TOUCHSCREEN_ELO is not set -# CONFIG_TOUCHSCREEN_GUNZE is not set -# CONFIG_TOUCHSCREEN_MK712 is not set -# CONFIG_TOUCHSCREEN_MTOUCH is not set -# CONFIG_TOUCHSCREEN_PENMOUNT is not set -# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set -# CONFIG_TOUCHSCREEN_TOUCHWIN is not set -# CONFIG_TOUCHSCREEN_UCB1400 is not set -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -# CONFIG_TR is not set -# CONFIG_TUNER_3036 is not set -# CONFIG_TUN is not set -# CONFIG_UDF_FS is not set -CONFIG_UDF_NLS=y -# CONFIG_UFS_FS is not set -# CONFIG_ULTRIX_PARTITION is not set -CONFIG_UNIX98_PTYS=y -# CONFIG_UNIXWARE_DISKLABEL is not set -CONFIG_UNIX=y -# CONFIG_USB_ACECAD is not set -# CONFIG_USB_ACM is not set -# CONFIG_USB_ADUTUX is not set -# CONFIG_USB_AIPTEK is not set -CONFIG_USB_ALI_M5632=y -CONFIG_USB_AN2720=y -# CONFIG_USB_APPLEDISPLAY is not set -# CONFIG_USB_APPLETOUCH is not set -CONFIG_USB_ARCH_HAS_EHCI=y -CONFIG_USB_ARCH_HAS_HCD=y -CONFIG_USB_ARCH_HAS_OHCI=y -CONFIG_USB_ARMLINUX=y -# CONFIG_USB_ATI_REMOTE2 is not set -# CONFIG_USB_ATI_REMOTE is not set -# CONFIG_USB_ATM is not set -# CONFIG_USB_AUERSWALD is not set -# CONFIG_USB_BANDWIDTH is not set -CONFIG_USB_BELKIN=y -# CONFIG_USB_BERRY_CHARGE is not set -# CONFIG_USB_CATC is not set -# CONFIG_USB_CXACRU is not set -# CONFIG_USB_CYPRESS_CY7C63 is not set -# CONFIG_USB_CYTHERM is not set -# CONFIG_USB_DABUSB is not set -# CONFIG_USB_DEBUG is not set -CONFIG_USB_DEVICEFS=y -# CONFIG_USB_DSBR is not set -# CONFIG_USB_DYNAMIC_MINORS is not set -# CONFIG_USB_EMI26 is not set -# CONFIG_USB_EMI62 is not set -# CONFIG_USB_EPSON2888 is not set -# CONFIG_USB_ET61X251 is not set -CONFIG_USB_EZUSB=y -# CONFIG_USB_FTDI_ELAN is not set -# CONFIG_USB_GADGET is not set -# CONFIG_USB_HIDDEV is not set -# CONFIG_USB_HIDINPUT_POWERBOOK is not set -CONFIG_USB_HIDINPUT=y -# CONFIG_USB_HID is not set -# CONFIG_USB_IBMCAM is not set -# CONFIG_USB_IDMOUSE is not set -# CONFIG_USB_IOWARRIOR is not set -# CONFIG_USB is not set -# CONFIG_USB_ISP116X_HCD is not set -# CONFIG_USB_KAWETH is not set -# CONFIG_USB_KBD is not set -# CONFIG_USB_KBTAB is not set -# CONFIG_USB_KC2190 is not set -# CONFIG_USB_KEYSPAN_REMOTE is not set -# CONFIG_USB_KONICAWC is not set -# CONFIG_USB_LCD is not set -# CONFIG_USB_LD is not set -# CONFIG_USB_LED is not set -# CONFIG_USB_LEGOTOWER is not set -# CONFIG_USB_LIBUSUAL is not set -# CONFIG_USB_MDC800 is not set -# CONFIG_USB_MICROTEK is not set -# CONFIG_USB_MON is not set -# CONFIG_USB_MOUSE is not set -# CONFIG_USB_NET_AX8817X is not set -# CONFIG_USB_NET_CDCETHER is not set -# CONFIG_USB_NET_CDC_SUBSET is not set -# CONFIG_USB_NET_DM9601 is not set -# CONFIG_USB_NET_GL620A is not set -# CONFIG_USB_NET_MCS7830 is not set -# CONFIG_USB_NET_NET1080 is not set -# CONFIG_USB_NET_PLUSB is not set -# CONFIG_USB_NET_RNDIS_HOST is not set -# CONFIG_USB_NET_ZAURUS is not set -# CONFIG_USB_OHCI_BIG_ENDIAN is not set -# CONFIG_USB_OHCI_HCD is not set -CONFIG_USB_OHCI_LITTLE_ENDIAN=y -# CONFIG_USB_OTG is not set -# CONFIG_USB_OV511 is not set -# CONFIG_USB_PEGASUS is not set -# CONFIG_USB_PHIDGET is not set -# CONFIG_USB_POWERMATE is not set -# CONFIG_USB_PRINTER is not set -# CONFIG_USB_QUICKCAM_MESSENGER is not set -# CONFIG_USB_RIO500 is not set -# CONFIG_USB_RTL8150 is not set -# CONFIG_USB_SE401 is not set -# CONFIG_USB_SERIAL_AIRCABLE is not set -# CONFIG_USB_SERIAL_AIRPRIME is not set -# CONFIG_USB_SERIAL_ARK3116 is not set -# CONFIG_USB_SERIAL_BELKIN is not set -# CONFIG_USB_SERIAL_CP2101 is not set -# CONFIG_USB_SERIAL_CYBERJACK is not set -# CONFIG_USB_SERIAL_CYPRESS_M8 is not set -# CONFIG_USB_SERIAL_DEBUG is not set -# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set -# CONFIG_USB_SERIAL_EDGEPORT is not set -# CONFIG_USB_SERIAL_EDGEPORT_TI is not set -# CONFIG_USB_SERIAL_EMPEG is not set -# CONFIG_USB_SERIAL_FTDI_SIO is not set -# CONFIG_USB_SERIAL_FUNSOFT is not set -# CONFIG_USB_SERIAL_GARMIN is not set -CONFIG_USB_SERIAL_GENERIC=y -# CONFIG_USB_SERIAL_HP4X is not set -# CONFIG_USB_SERIAL_IPAQ is not set -# CONFIG_USB_SERIAL_IPW is not set -# CONFIG_USB_SERIAL_IR is not set -# CONFIG_USB_SERIAL is not set -# CONFIG_USB_SERIAL_KEYSPAN is not set -CONFIG_USB_SERIAL_KEYSPAN_MPR=y -# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set -CONFIG_USB_SERIAL_KEYSPAN_USA18X=y -CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y -CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y -CONFIG_USB_SERIAL_KEYSPAN_USA19W=y -CONFIG_USB_SERIAL_KEYSPAN_USA19=y -CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y -CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y -CONFIG_USB_SERIAL_KEYSPAN_USA28X=y -CONFIG_USB_SERIAL_KEYSPAN_USA28=y -CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y -CONFIG_USB_SERIAL_KEYSPAN_USA49W=y -# CONFIG_USB_SERIAL_KLSI is not set -# CONFIG_USB_SERIAL_KOBIL_SCT is not set -# CONFIG_USB_SERIAL_MCT_U232 is not set -# CONFIG_USB_SERIAL_MOS7720 is not set -# CONFIG_USB_SERIAL_MOS7840 is not set -# CONFIG_USB_SERIAL_NAVMAN is not set -# CONFIG_USB_SERIAL_OMNINET is not set -# CONFIG_USB_SERIAL_OPTION is not set -# CONFIG_USB_SERIAL_PL2303 is not set -# CONFIG_USB_SERIAL_SAFE is not set -CONFIG_USB_SERIAL_SAFE_PADDED=y -# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set -# CONFIG_USB_SERIAL_TI is not set -# CONFIG_USB_SERIAL_VISOR is not set -# CONFIG_USB_SERIAL_WHITEHEAT is not set -# CONFIG_USB_SERIAL_XIRCOM is not set -# CONFIG_USB_SISUSBVGA is not set -# CONFIG_USB_SL811_HCD is not set -# CONFIG_USB_SN9C102 is not set -# CONFIG_USB_SPEEDTOUCH is not set -CONFIG_USB_STORAGE_ALAUDA=y -CONFIG_USB_STORAGE_DATAFAB=y -# CONFIG_USB_STORAGE_DEBUG is not set -CONFIG_USB_STORAGE_DPCM=y -CONFIG_USB_STORAGE_FREECOM=y -# CONFIG_USB_STORAGE_ISD200 is not set -# CONFIG_USB_STORAGE is not set -CONFIG_USB_STORAGE_JUMPSHOT=y -CONFIG_USB_STORAGE_KARMA=y -# CONFIG_USB_STORAGE_ONETOUCH is not set -CONFIG_USB_STORAGE_SDDR09=y -CONFIG_USB_STORAGE_SDDR55=y -CONFIG_USB_STORAGE_USBAT=y -# CONFIG_USB_STV680 is not set -# CONFIG_USB_SUSPEND is not set -# CONFIG_USB_TEST is not set -# CONFIG_USB_TOUCHSCREEN is not set -# CONFIG_USB_TRANCEVIBRATOR is not set -# CONFIG_USB_UEAGLEATM is not set -# CONFIG_USB_USBNET is not set -# CONFIG_USB_USBNET_MII is not set -# CONFIG_USB_VICAM is not set -# CONFIG_USB_W9968CF is not set -# CONFIG_USB_WACOM is not set -# CONFIG_USB_XPAD is not set -# CONFIG_USB_XUSBATM is not set -# CONFIG_USB_YEALINK is not set -# CONFIG_USB_ZC0301 is not set -# CONFIG_USB_ZD1201 is not set -# CONFIG_USB_ZR364XX is not set -# CONFIG_UTS_NS is not set -# CONFIG_VFAT_FS is not set -# CONFIG_VIA_VELOCITY is not set -# CONFIG_VIDEO_ADV7170 is not set -# CONFIG_VIDEO_ADV7175 is not set -# CONFIG_VIDEO_ADV_DEBUG is not set -# CONFIG_VIDEO_BT819 is not set -# CONFIG_VIDEO_BT848 is not set -# CONFIG_VIDEO_BT856 is not set -# CONFIG_VIDEO_BT866 is not set -# CONFIG_VIDEO_CAFE_CCIC is not set -# CONFIG_VIDEO_CPIA is not set -# CONFIG_VIDEO_CS53L32A is not set -# CONFIG_VIDEO_CX2341X is not set -# CONFIG_VIDEO_CX25840 is not set -# CONFIG_VIDEO_CX88 is not set -# CONFIG_VIDEO_DEV is not set -# CONFIG_VIDEO_DPC is not set -# CONFIG_VIDEO_EM28XX is not set -# CONFIG_VIDEO_HELPER_CHIPS_AUTO is not set -# CONFIG_VIDEO_HEXIUM_GEMINI is not set -# CONFIG_VIDEO_HEXIUM_ORION is not set -# CONFIG_VIDEO_IVTV is not set -# CONFIG_VIDEO_KS0127 is not set -# CONFIG_VIDEO_MSP3400 is not set -# CONFIG_VIDEO_MXB is not set -# CONFIG_VIDEO_OV7670 is not set -# CONFIG_VIDEO_OVCAMCHIP is not set -# CONFIG_VIDEO_PMS is not set -# CONFIG_VIDEO_PVRUSB2 is not set -# CONFIG_VIDEO_SAA5246A is not set -# CONFIG_VIDEO_SAA5249 is not set -# CONFIG_VIDEO_SAA7110 is not set -# CONFIG_VIDEO_SAA7111 is not set -# CONFIG_VIDEO_SAA7114 is not set -# CONFIG_VIDEO_SAA711X is not set -# CONFIG_VIDEO_SAA7127 is not set -# CONFIG_VIDEO_SAA7134 is not set -# CONFIG_VIDEO_SAA7185 is not set -# CONFIG_VIDEO_SAA7191 is not set -# CONFIG_VIDEO_STRADIS 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_TLV320AIC23B is not set -# CONFIG_VIDEO_TVAUDIO is not set -# CONFIG_VIDEO_TVP5150 is not set -# CONFIG_VIDEO_UPD64031A is not set -# CONFIG_VIDEO_UPD64083 is not set -# CONFIG_VIDEO_USBVISION is not set -CONFIG_VIDEO_V4L1_COMPAT=y -# CONFIG_VIDEO_V4L1 is not set -CONFIG_VIDEO_V4L2=y -# CONFIG_VIDEO_VIVI is not set -# CONFIG_VIDEO_VPX3220 is not set -# CONFIG_VIDEO_WM8739 is not set -# CONFIG_VIDEO_WM8775 is not set -# CONFIG_VIDEO_ZORAN is not set -# CONFIG_VITESSE_PHY is not set -CONFIG_VLAN_8021Q=y -# CONFIG_VM_EVENT_COUNTERS is not set -# CONFIG_VT is not set -# CONFIG_VXFS_FS is not set -# CONFIG_W1 is not set -# CONFIG_WAN is not set -# CONFIG_WAN_ROUTER is not set -# CONFIG_WATCHDOG_NOWAYOUT is not set -CONFIG_WATCHDOG=y -# CONFIG_WDTPCI is not set -CONFIG_WIRELESS_EXT=y -# CONFIG_WR_PPMC is not set -# CONFIG_X25 is not set -# CONFIG_XFRM_MIGRATE is not set -# CONFIG_XFRM_SUB_POLICY is not set -# CONFIG_XFRM_USER is not set -CONFIG_XFRM=y -# CONFIG_XFS_FS is not set -# CONFIG_XFS_POSIX_ACL is not set -# CONFIG_XFS_QUOTA is not set -# CONFIG_XFS_RT is not set -# CONFIG_XFS_SECURITY is not set -# CONFIG_YAFFS_FS is not set -# CONFIG_YAM is not set -# CONFIG_YELLOWFIN is not set -# CONFIG_YENTA is not set -# CONFIG_YENTA_O2 is not set -# CONFIG_YENTA_RICOH is not set -# CONFIG_YENTA_TI is not set -# CONFIG_YENTA_TOSHIBA is not set -# CONFIG_ZD1211RW_DEBUG is not set -# CONFIG_ZD1211RW is not set -# CONFIG_ZISOFS_FS is not set -CONFIG_ZISOFS=y -CONFIG_ZLIB_DEFLATE=y -CONFIG_ZLIB_INFLATE=y -CONFIG_ZONE_DMA_FLAG=1 -CONFIG_ZONE_DMA=y diff --git a/target/linux/generic-2.6/patches-2.6.21/001-squashfs.patch b/target/linux/generic-2.6/patches-2.6.21/001-squashfs.patch deleted file mode 100644 index eebcbd99f..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/001-squashfs.patch +++ /dev/null @@ -1,4160 +0,0 @@ ---- a/fs/Kconfig -+++ b/fs/Kconfig -@@ -1371,6 +1371,71 @@ config CRAMFS - - If unsure, say N. - -+config SQUASHFS -+ tristate "SquashFS 3.0 - Squashed file system support" -+ select ZLIB_INFLATE -+ help -+ Saying Y here includes support for SquashFS 3.0 (a Compressed Read-Only File -+ System). Squashfs is a highly compressed read-only filesystem for Linux. -+ It uses zlib compression to compress both files, inodes and directories. -+ Inodes in the system are very small and all blocks are packed to minimise -+ data overhead. Block sizes greater than 4K are supported up to a maximum of 64K. -+ SquashFS 3.0 supports 64 bit filesystems and files (larger than 4GB), full -+ uid/gid information, hard links and timestamps. -+ -+ Squashfs is intended for general read-only filesystem use, for archival -+ use (i.e. in cases where a .tar.gz file may be used), and in embedded -+ systems where low overhead is needed. Further information and filesystem tools -+ are available from http://squashfs.sourceforge.net. -+ -+ If you want to compile this as a module ( = code which can be -+ inserted in and removed from the running kernel whenever you want), -+ say M here and read . The module -+ will be called squashfs. Note that the root file system (the one -+ containing the directory /) cannot be compiled as a module. -+ -+ If unsure, say N. -+ -+config SQUASHFS_EMBEDDED -+ -+ bool "Additional options for memory-constrained systems" -+ depends on SQUASHFS -+ default n -+ help -+ Saying Y here allows you to specify cache sizes and how Squashfs -+ allocates memory. This is only intended for memory constrained -+ systems. -+ -+ If unsure, say N. -+ -+config SQUASHFS_FRAGMENT_CACHE_SIZE -+ int "Number of fragments cached" if SQUASHFS_EMBEDDED -+ depends on SQUASHFS -+ default "3" -+ help -+ By default SquashFS caches the last 3 fragments read from -+ the filesystem. Increasing this amount may mean SquashFS -+ has to re-read fragments less often from disk, at the expense -+ of extra system memory. Decreasing this amount will mean -+ SquashFS uses less memory at the expense of extra reads from disk. -+ -+ Note there must be at least one cached fragment. Anything -+ much more than three will probably not make much difference. -+ -+config SQUASHFS_VMALLOC -+ bool "Use Vmalloc rather than Kmalloc" if SQUASHFS_EMBEDDED -+ depends on SQUASHFS -+ default n -+ help -+ By default SquashFS uses kmalloc to obtain fragment cache memory. -+ Kmalloc memory is the standard kernel allocator, but it can fail -+ on memory constrained systems. Because of the way Vmalloc works, -+ Vmalloc can succeed when kmalloc fails. Specifying this option -+ will make SquashFS always use Vmalloc to allocate the -+ fragment cache memory. -+ -+ If unsure, say N. -+ - config VXFS_FS - tristate "FreeVxFS file system support (VERITAS VxFS(TM) compatible)" - depends on BLOCK ---- a/fs/Makefile -+++ b/fs/Makefile -@@ -68,6 +68,7 @@ obj-$(CONFIG_JBD) += jbd/ - obj-$(CONFIG_JBD2) += jbd2/ - obj-$(CONFIG_EXT2_FS) += ext2/ - obj-$(CONFIG_CRAMFS) += cramfs/ -+obj-$(CONFIG_SQUASHFS) += squashfs/ - obj-$(CONFIG_RAMFS) += ramfs/ - obj-$(CONFIG_HUGETLBFS) += hugetlbfs/ - obj-$(CONFIG_CODA_FS) += coda/ ---- /dev/null -+++ b/fs/squashfs/inode.c -@@ -0,0 +1,2124 @@ -+/* -+ * Squashfs - a compressed read only filesystem for Linux -+ * -+ * Copyright (c) 2002, 2003, 2004, 2005, 2006 -+ * Phillip Lougher -+ * -+ * 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, -+ * 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -+ * -+ * inode.c -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "squashfs.h" -+ -+static void squashfs_put_super(struct super_block *); -+static int squashfs_statfs(struct dentry *, struct kstatfs *); -+static int squashfs_symlink_readpage(struct file *file, struct page *page); -+static int squashfs_readpage(struct file *file, struct page *page); -+static int squashfs_readpage4K(struct file *file, struct page *page); -+static int squashfs_readdir(struct file *, void *, filldir_t); -+static struct inode *squashfs_alloc_inode(struct super_block *sb); -+static void squashfs_destroy_inode(struct inode *inode); -+static int init_inodecache(void); -+static void destroy_inodecache(void); -+static struct dentry *squashfs_lookup(struct inode *, struct dentry *, -+ struct nameidata *); -+static struct inode *squashfs_iget(struct super_block *s, squashfs_inode_t inode); -+static long long read_blocklist(struct inode *inode, int index, -+ int readahead_blks, char *block_list, -+ unsigned short **block_p, unsigned int *bsize); -+static int squashfs_get_sb(struct file_system_type *, int, -+ const char *, void *, struct vfsmount *); -+ -+ -+static z_stream stream; -+ -+static struct file_system_type squashfs_fs_type = { -+ .owner = THIS_MODULE, -+ .name = "squashfs", -+ .get_sb = squashfs_get_sb, -+ .kill_sb = kill_block_super, -+ .fs_flags = FS_REQUIRES_DEV -+}; -+ -+static unsigned char squashfs_filetype_table[] = { -+ DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_FIFO, DT_SOCK -+}; -+ -+static struct super_operations squashfs_ops = { -+ .alloc_inode = squashfs_alloc_inode, -+ .destroy_inode = squashfs_destroy_inode, -+ .statfs = squashfs_statfs, -+ .put_super = squashfs_put_super, -+}; -+ -+SQSH_EXTERN struct address_space_operations squashfs_symlink_aops = { -+ .readpage = squashfs_symlink_readpage -+}; -+ -+SQSH_EXTERN struct address_space_operations squashfs_aops = { -+ .readpage = squashfs_readpage -+}; -+ -+SQSH_EXTERN struct address_space_operations squashfs_aops_4K = { -+ .readpage = squashfs_readpage4K -+}; -+ -+static struct file_operations squashfs_dir_ops = { -+ .read = generic_read_dir, -+ .readdir = squashfs_readdir -+}; -+ -+SQSH_EXTERN struct inode_operations squashfs_dir_inode_ops = { -+ .lookup = squashfs_lookup -+}; -+ -+ -+static struct buffer_head *get_block_length(struct super_block *s, -+ int *cur_index, int *offset, int *c_byte) -+{ -+ struct squashfs_sb_info *msblk = s->s_fs_info; -+ unsigned short temp; -+ struct buffer_head *bh; -+ -+ if (!(bh = sb_bread(s, *cur_index))) -+ goto out; -+ -+ if (msblk->devblksize - *offset == 1) { -+ if (msblk->swap) -+ ((unsigned char *) &temp)[1] = *((unsigned char *) -+ (bh->b_data + *offset)); -+ else -+ ((unsigned char *) &temp)[0] = *((unsigned char *) -+ (bh->b_data + *offset)); -+ brelse(bh); -+ if (!(bh = sb_bread(s, ++(*cur_index)))) -+ goto out; -+ if (msblk->swap) -+ ((unsigned char *) &temp)[0] = *((unsigned char *) -+ bh->b_data); -+ else -+ ((unsigned char *) &temp)[1] = *((unsigned char *) -+ bh->b_data); -+ *c_byte = temp; -+ *offset = 1; -+ } else { -+ if (msblk->swap) { -+ ((unsigned char *) &temp)[1] = *((unsigned char *) -+ (bh->b_data + *offset)); -+ ((unsigned char *) &temp)[0] = *((unsigned char *) -+ (bh->b_data + *offset + 1)); -+ } else { -+ ((unsigned char *) &temp)[0] = *((unsigned char *) -+ (bh->b_data + *offset)); -+ ((unsigned char *) &temp)[1] = *((unsigned char *) -+ (bh->b_data + *offset + 1)); -+ } -+ *c_byte = temp; -+ *offset += 2; -+ } -+ -+ if (SQUASHFS_CHECK_DATA(msblk->sblk.flags)) { -+ if (*offset == msblk->devblksize) { -+ brelse(bh); -+ if (!(bh = sb_bread(s, ++(*cur_index)))) -+ goto out; -+ *offset = 0; -+ } -+ if (*((unsigned char *) (bh->b_data + *offset)) != -+ SQUASHFS_MARKER_BYTE) { -+ ERROR("Metadata block marker corrupt @ %x\n", -+ *cur_index); -+ brelse(bh); -+ goto out; -+ } -+ (*offset)++; -+ } -+ return bh; -+ -+out: -+ return NULL; -+} -+ -+ -+SQSH_EXTERN unsigned int squashfs_read_data(struct super_block *s, char *buffer, -+ long long index, unsigned int length, -+ long long *next_index) -+{ -+ struct squashfs_sb_info *msblk = s->s_fs_info; -+ struct buffer_head *bh[((SQUASHFS_FILE_MAX_SIZE - 1) >> -+ msblk->devblksize_log2) + 2]; -+ unsigned int offset = index & ((1 << msblk->devblksize_log2) - 1); -+ unsigned int cur_index = index >> msblk->devblksize_log2; -+ int bytes, avail_bytes, b = 0, k; -+ char *c_buffer; -+ unsigned int compressed; -+ unsigned int c_byte = length; -+ -+ if (c_byte) { -+ bytes = msblk->devblksize - offset; -+ compressed = SQUASHFS_COMPRESSED_BLOCK(c_byte); -+ c_buffer = compressed ? msblk->read_data : buffer; -+ c_byte = SQUASHFS_COMPRESSED_SIZE_BLOCK(c_byte); -+ -+ TRACE("Block @ 0x%llx, %scompressed size %d\n", index, compressed -+ ? "" : "un", (unsigned int) c_byte); -+ -+ if (!(bh[0] = sb_getblk(s, cur_index))) -+ goto block_release; -+ -+ for (b = 1; bytes < c_byte; b++) { -+ if (!(bh[b] = sb_getblk(s, ++cur_index))) -+ goto block_release; -+ bytes += msblk->devblksize; -+ } -+ ll_rw_block(READ, b, bh); -+ } else { -+ if (!(bh[0] = get_block_length(s, &cur_index, &offset, -+ &c_byte))) -+ goto read_failure; -+ -+ bytes = msblk->devblksize - offset; -+ compressed = SQUASHFS_COMPRESSED(c_byte); -+ c_buffer = compressed ? msblk->read_data : buffer; -+ c_byte = SQUASHFS_COMPRESSED_SIZE(c_byte); -+ -+ TRACE("Block @ 0x%llx, %scompressed size %d\n", index, compressed -+ ? "" : "un", (unsigned int) c_byte); -+ -+ for (b = 1; bytes < c_byte; b++) { -+ if (!(bh[b] = sb_getblk(s, ++cur_index))) -+ goto block_release; -+ bytes += msblk->devblksize; -+ } -+ ll_rw_block(READ, b - 1, bh + 1); -+ } -+ -+ if (compressed) -+ down(&msblk->read_data_mutex); -+ -+ for (bytes = 0, k = 0; k < b; k++) { -+ avail_bytes = (c_byte - bytes) > (msblk->devblksize - offset) ? -+ msblk->devblksize - offset : -+ c_byte - bytes; -+ wait_on_buffer(bh[k]); -+ if (!buffer_uptodate(bh[k])) -+ goto block_release; -+ memcpy(c_buffer + bytes, bh[k]->b_data + offset, avail_bytes); -+ bytes += avail_bytes; -+ offset = 0; -+ brelse(bh[k]); -+ } -+ -+ /* -+ * uncompress block -+ */ -+ if (compressed) { -+ int zlib_err; -+ -+ stream.next_in = c_buffer; -+ stream.avail_in = c_byte; -+ stream.next_out = buffer; -+ stream.avail_out = msblk->read_size; -+ -+ if (((zlib_err = zlib_inflateInit(&stream)) != Z_OK) || -+ ((zlib_err = zlib_inflate(&stream, Z_FINISH)) -+ != Z_STREAM_END) || ((zlib_err = -+ zlib_inflateEnd(&stream)) != Z_OK)) { -+ ERROR("zlib_fs returned unexpected result 0x%x\n", -+ zlib_err); -+ bytes = 0; -+ } else -+ bytes = stream.total_out; -+ -+ up(&msblk->read_data_mutex); -+ } -+ -+ if (next_index) -+ *next_index = index + c_byte + (length ? 0 : -+ (SQUASHFS_CHECK_DATA(msblk->sblk.flags) -+ ? 3 : 2)); -+ return bytes; -+ -+block_release: -+ while (--b >= 0) -+ brelse(bh[b]); -+ -+read_failure: -+ ERROR("sb_bread failed reading block 0x%x\n", cur_index); -+ return 0; -+} -+ -+ -+SQSH_EXTERN int squashfs_get_cached_block(struct super_block *s, char *buffer, -+ long long block, unsigned int offset, -+ int length, long long *next_block, -+ unsigned int *next_offset) -+{ -+ struct squashfs_sb_info *msblk = s->s_fs_info; -+ int n, i, bytes, return_length = length; -+ long long next_index; -+ -+ TRACE("Entered squashfs_get_cached_block [%llx:%x]\n", block, offset); -+ -+ while ( 1 ) { -+ for (i = 0; i < SQUASHFS_CACHED_BLKS; i++) -+ if (msblk->block_cache[i].block == block) -+ break; -+ -+ down(&msblk->block_cache_mutex); -+ -+ if (i == SQUASHFS_CACHED_BLKS) { -+ /* read inode header block */ -+ for (i = msblk->next_cache, n = SQUASHFS_CACHED_BLKS; -+ n ; n --, i = (i + 1) % -+ SQUASHFS_CACHED_BLKS) -+ if (msblk->block_cache[i].block != -+ SQUASHFS_USED_BLK) -+ break; -+ -+ if (n == 0) { -+ wait_queue_t wait; -+ -+ init_waitqueue_entry(&wait, current); -+ add_wait_queue(&msblk->waitq, &wait); -+ set_current_state(TASK_UNINTERRUPTIBLE); -+ up(&msblk->block_cache_mutex); -+ schedule(); -+ set_current_state(TASK_RUNNING); -+ remove_wait_queue(&msblk->waitq, &wait); -+ continue; -+ } -+ msblk->next_cache = (i + 1) % SQUASHFS_CACHED_BLKS; -+ -+ if (msblk->block_cache[i].block == -+ SQUASHFS_INVALID_BLK) { -+ if (!(msblk->block_cache[i].data = -+ kmalloc(SQUASHFS_METADATA_SIZE, -+ GFP_KERNEL))) { -+ ERROR("Failed to allocate cache" -+ "block\n"); -+ up(&msblk->block_cache_mutex); -+ goto out; -+ } -+ } -+ -+ msblk->block_cache[i].block = SQUASHFS_USED_BLK; -+ up(&msblk->block_cache_mutex); -+ -+ if (!(msblk->block_cache[i].length = -+ squashfs_read_data(s, -+ msblk->block_cache[i].data, -+ block, 0, &next_index))) { -+ ERROR("Unable to read cache block [%llx:%x]\n", -+ block, offset); -+ goto out; -+ } -+ -+ down(&msblk->block_cache_mutex); -+ wake_up(&msblk->waitq); -+ msblk->block_cache[i].block = block; -+ msblk->block_cache[i].next_index = next_index; -+ TRACE("Read cache block [%llx:%x]\n", block, offset); -+ } -+ -+ if (msblk->block_cache[i].block != block) { -+ up(&msblk->block_cache_mutex); -+ continue; -+ } -+ -+ if ((bytes = msblk->block_cache[i].length - offset) >= length) { -+ if (buffer) -+ memcpy(buffer, msblk->block_cache[i].data + -+ offset, length); -+ if (msblk->block_cache[i].length - offset == length) { -+ *next_block = msblk->block_cache[i].next_index; -+ *next_offset = 0; -+ } else { -+ *next_block = block; -+ *next_offset = offset + length; -+ } -+ up(&msblk->block_cache_mutex); -+ goto finish; -+ } else { -+ if (buffer) { -+ memcpy(buffer, msblk->block_cache[i].data + -+ offset, bytes); -+ buffer += bytes; -+ } -+ block = msblk->block_cache[i].next_index; -+ up(&msblk->block_cache_mutex); -+ length -= bytes; -+ offset = 0; -+ } -+ } -+ -+finish: -+ return return_length; -+out: -+ return 0; -+} -+ -+ -+static int get_fragment_location(struct super_block *s, unsigned int fragment, -+ long long *fragment_start_block, -+ unsigned int *fragment_size) -+{ -+ struct squashfs_sb_info *msblk = s->s_fs_info; -+ long long start_block = -+ msblk->fragment_index[SQUASHFS_FRAGMENT_INDEX(fragment)]; -+ int offset = SQUASHFS_FRAGMENT_INDEX_OFFSET(fragment); -+ struct squashfs_fragment_entry fragment_entry; -+ -+ if (msblk->swap) { -+ struct squashfs_fragment_entry sfragment_entry; -+ -+ if (!squashfs_get_cached_block(s, (char *) &sfragment_entry, -+ start_block, offset, -+ sizeof(sfragment_entry), &start_block, -+ &offset)) -+ goto out; -+ SQUASHFS_SWAP_FRAGMENT_ENTRY(&fragment_entry, &sfragment_entry); -+ } else -+ if (!squashfs_get_cached_block(s, (char *) &fragment_entry, -+ start_block, offset, -+ sizeof(fragment_entry), &start_block, -+ &offset)) -+ goto out; -+ -+ *fragment_start_block = fragment_entry.start_block; -+ *fragment_size = fragment_entry.size; -+ -+ return 1; -+ -+out: -+ return 0; -+} -+ -+ -+SQSH_EXTERN void release_cached_fragment(struct squashfs_sb_info *msblk, struct -+ squashfs_fragment_cache *fragment) -+{ -+ down(&msblk->fragment_mutex); -+ fragment->locked --; -+ wake_up(&msblk->fragment_wait_queue); -+ up(&msblk->fragment_mutex); -+} -+ -+ -+SQSH_EXTERN struct squashfs_fragment_cache *get_cached_fragment(struct super_block -+ *s, long long start_block, -+ int length) -+{ -+ int i, n; -+ struct squashfs_sb_info *msblk = s->s_fs_info; -+ -+ while ( 1 ) { -+ down(&msblk->fragment_mutex); -+ -+ for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS && -+ msblk->fragment[i].block != start_block; i++); -+ -+ if (i == SQUASHFS_CACHED_FRAGMENTS) { -+ for (i = msblk->next_fragment, n = -+ SQUASHFS_CACHED_FRAGMENTS; n && -+ msblk->fragment[i].locked; n--, i = (i + 1) % -+ SQUASHFS_CACHED_FRAGMENTS); -+ -+ if (n == 0) { -+ wait_queue_t wait; -+ -+ init_waitqueue_entry(&wait, current); -+ add_wait_queue(&msblk->fragment_wait_queue, -+ &wait); -+ set_current_state(TASK_UNINTERRUPTIBLE); -+ up(&msblk->fragment_mutex); -+ schedule(); -+ set_current_state(TASK_RUNNING); -+ remove_wait_queue(&msblk->fragment_wait_queue, -+ &wait); -+ continue; -+ } -+ msblk->next_fragment = (msblk->next_fragment + 1) % -+ SQUASHFS_CACHED_FRAGMENTS; -+ -+ if (msblk->fragment[i].data == NULL) -+ if (!(msblk->fragment[i].data = SQUASHFS_ALLOC -+ (SQUASHFS_FILE_MAX_SIZE))) { -+ ERROR("Failed to allocate fragment " -+ "cache block\n"); -+ up(&msblk->fragment_mutex); -+ goto out; -+ } -+ -+ msblk->fragment[i].block = SQUASHFS_INVALID_BLK; -+ msblk->fragment[i].locked = 1; -+ up(&msblk->fragment_mutex); -+ -+ if (!(msblk->fragment[i].length = squashfs_read_data(s, -+ msblk->fragment[i].data, -+ start_block, length, NULL))) { -+ ERROR("Unable to read fragment cache block " -+ "[%llx]\n", start_block); -+ msblk->fragment[i].locked = 0; -+ goto out; -+ } -+ -+ msblk->fragment[i].block = start_block; -+ TRACE("New fragment %d, start block %lld, locked %d\n", -+ i, msblk->fragment[i].block, -+ msblk->fragment[i].locked); -+ break; -+ } -+ -+ msblk->fragment[i].locked++; -+ up(&msblk->fragment_mutex); -+ TRACE("Got fragment %d, start block %lld, locked %d\n", i, -+ msblk->fragment[i].block, -+ msblk->fragment[i].locked); -+ break; -+ } -+ -+ return &msblk->fragment[i]; -+ -+out: -+ return NULL; -+} -+ -+ -+static struct inode *squashfs_new_inode(struct super_block *s, -+ struct squashfs_base_inode_header *inodeb) -+{ -+ struct squashfs_sb_info *msblk = s->s_fs_info; -+ struct inode *i = new_inode(s); -+ -+ if (i) { -+ i->i_ino = inodeb->inode_number; -+ i->i_mtime.tv_sec = inodeb->mtime; -+ i->i_atime.tv_sec = inodeb->mtime; -+ i->i_ctime.tv_sec = inodeb->mtime; -+ i->i_uid = msblk->uid[inodeb->uid]; -+ i->i_mode = inodeb->mode; -+ i->i_size = 0; -+ if (inodeb->guid == SQUASHFS_GUIDS) -+ i->i_gid = i->i_uid; -+ else -+ i->i_gid = msblk->guid[inodeb->guid]; -+ } -+ -+ return i; -+} -+ -+ -+static struct inode *squashfs_iget(struct super_block *s, squashfs_inode_t inode) -+{ -+ struct inode *i; -+ struct squashfs_sb_info *msblk = s->s_fs_info; -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ long long block = SQUASHFS_INODE_BLK(inode) + -+ sblk->inode_table_start; -+ unsigned int offset = SQUASHFS_INODE_OFFSET(inode); -+ long long next_block; -+ unsigned int next_offset; -+ union squashfs_inode_header id, sid; -+ struct squashfs_base_inode_header *inodeb = &id.base, -+ *sinodeb = &sid.base; -+ -+ TRACE("Entered squashfs_iget\n"); -+ -+ if (msblk->swap) { -+ if (!squashfs_get_cached_block(s, (char *) sinodeb, block, -+ offset, sizeof(*sinodeb), &next_block, -+ &next_offset)) -+ goto failed_read; -+ SQUASHFS_SWAP_BASE_INODE_HEADER(inodeb, sinodeb, -+ sizeof(*sinodeb)); -+ } else -+ if (!squashfs_get_cached_block(s, (char *) inodeb, block, -+ offset, sizeof(*inodeb), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ switch(inodeb->inode_type) { -+ case SQUASHFS_FILE_TYPE: { -+ unsigned int frag_size; -+ long long frag_blk; -+ struct squashfs_reg_inode_header *inodep = &id.reg; -+ struct squashfs_reg_inode_header *sinodep = &sid.reg; -+ -+ if (msblk->swap) { -+ if (!squashfs_get_cached_block(s, (char *) -+ sinodep, block, offset, -+ sizeof(*sinodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ SQUASHFS_SWAP_REG_INODE_HEADER(inodep, sinodep); -+ } else -+ if (!squashfs_get_cached_block(s, (char *) -+ inodep, block, offset, -+ sizeof(*inodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ frag_blk = SQUASHFS_INVALID_BLK; -+ if (inodep->fragment != SQUASHFS_INVALID_FRAG && -+ !get_fragment_location(s, -+ inodep->fragment, &frag_blk, &frag_size)) -+ goto failed_read; -+ -+ if((i = squashfs_new_inode(s, inodeb)) == NULL) -+ goto failed_read1; -+ -+ i->i_nlink = 1; -+ i->i_size = inodep->file_size; -+ i->i_fop = &generic_ro_fops; -+ i->i_mode |= S_IFREG; -+ i->i_blocks = ((i->i_size - 1) >> 9) + 1; -+ SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk; -+ SQUASHFS_I(i)->u.s1.fragment_size = frag_size; -+ SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset; -+ SQUASHFS_I(i)->start_block = inodep->start_block; -+ SQUASHFS_I(i)->u.s1.block_list_start = next_block; -+ SQUASHFS_I(i)->offset = next_offset; -+ if (sblk->block_size > 4096) -+ i->i_data.a_ops = &squashfs_aops; -+ else -+ i->i_data.a_ops = &squashfs_aops_4K; -+ -+ TRACE("File inode %x:%x, start_block %llx, " -+ "block_list_start %llx, offset %x\n", -+ SQUASHFS_INODE_BLK(inode), offset, -+ inodep->start_block, next_block, -+ next_offset); -+ break; -+ } -+ case SQUASHFS_LREG_TYPE: { -+ unsigned int frag_size; -+ long long frag_blk; -+ struct squashfs_lreg_inode_header *inodep = &id.lreg; -+ struct squashfs_lreg_inode_header *sinodep = &sid.lreg; -+ -+ if (msblk->swap) { -+ if (!squashfs_get_cached_block(s, (char *) -+ sinodep, block, offset, -+ sizeof(*sinodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ SQUASHFS_SWAP_LREG_INODE_HEADER(inodep, sinodep); -+ } else -+ if (!squashfs_get_cached_block(s, (char *) -+ inodep, block, offset, -+ sizeof(*inodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ frag_blk = SQUASHFS_INVALID_BLK; -+ if (inodep->fragment != SQUASHFS_INVALID_FRAG && -+ !get_fragment_location(s, -+ inodep->fragment, &frag_blk, &frag_size)) -+ goto failed_read; -+ -+ if((i = squashfs_new_inode(s, inodeb)) == NULL) -+ goto failed_read1; -+ -+ i->i_nlink = inodep->nlink; -+ i->i_size = inodep->file_size; -+ i->i_fop = &generic_ro_fops; -+ i->i_mode |= S_IFREG; -+ i->i_blocks = ((i->i_size - 1) >> 9) + 1; -+ SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk; -+ SQUASHFS_I(i)->u.s1.fragment_size = frag_size; -+ SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset; -+ SQUASHFS_I(i)->start_block = inodep->start_block; -+ SQUASHFS_I(i)->u.s1.block_list_start = next_block; -+ SQUASHFS_I(i)->offset = next_offset; -+ if (sblk->block_size > 4096) -+ i->i_data.a_ops = &squashfs_aops; -+ else -+ i->i_data.a_ops = &squashfs_aops_4K; -+ -+ TRACE("File inode %x:%x, start_block %llx, " -+ "block_list_start %llx, offset %x\n", -+ SQUASHFS_INODE_BLK(inode), offset, -+ inodep->start_block, next_block, -+ next_offset); -+ break; -+ } -+ case SQUASHFS_DIR_TYPE: { -+ struct squashfs_dir_inode_header *inodep = &id.dir; -+ struct squashfs_dir_inode_header *sinodep = &sid.dir; -+ -+ if (msblk->swap) { -+ if (!squashfs_get_cached_block(s, (char *) -+ sinodep, block, offset, -+ sizeof(*sinodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ SQUASHFS_SWAP_DIR_INODE_HEADER(inodep, sinodep); -+ } else -+ if (!squashfs_get_cached_block(s, (char *) -+ inodep, block, offset, -+ sizeof(*inodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ if((i = squashfs_new_inode(s, inodeb)) == NULL) -+ goto failed_read1; -+ -+ i->i_nlink = inodep->nlink; -+ i->i_size = inodep->file_size; -+ i->i_op = &squashfs_dir_inode_ops; -+ i->i_fop = &squashfs_dir_ops; -+ i->i_mode |= S_IFDIR; -+ SQUASHFS_I(i)->start_block = inodep->start_block; -+ SQUASHFS_I(i)->offset = inodep->offset; -+ SQUASHFS_I(i)->u.s2.directory_index_count = 0; -+ SQUASHFS_I(i)->u.s2.parent_inode = inodep->parent_inode; -+ -+ TRACE("Directory inode %x:%x, start_block %x, offset " -+ "%x\n", SQUASHFS_INODE_BLK(inode), -+ offset, inodep->start_block, -+ inodep->offset); -+ break; -+ } -+ case SQUASHFS_LDIR_TYPE: { -+ struct squashfs_ldir_inode_header *inodep = &id.ldir; -+ struct squashfs_ldir_inode_header *sinodep = &sid.ldir; -+ -+ if (msblk->swap) { -+ if (!squashfs_get_cached_block(s, (char *) -+ sinodep, block, offset, -+ sizeof(*sinodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ SQUASHFS_SWAP_LDIR_INODE_HEADER(inodep, -+ sinodep); -+ } else -+ if (!squashfs_get_cached_block(s, (char *) -+ inodep, block, offset, -+ sizeof(*inodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ if((i = squashfs_new_inode(s, inodeb)) == NULL) -+ goto failed_read1; -+ -+ i->i_nlink = inodep->nlink; -+ i->i_size = inodep->file_size; -+ i->i_op = &squashfs_dir_inode_ops; -+ i->i_fop = &squashfs_dir_ops; -+ i->i_mode |= S_IFDIR; -+ SQUASHFS_I(i)->start_block = inodep->start_block; -+ SQUASHFS_I(i)->offset = inodep->offset; -+ SQUASHFS_I(i)->u.s2.directory_index_start = next_block; -+ SQUASHFS_I(i)->u.s2.directory_index_offset = -+ next_offset; -+ SQUASHFS_I(i)->u.s2.directory_index_count = -+ inodep->i_count; -+ SQUASHFS_I(i)->u.s2.parent_inode = inodep->parent_inode; -+ -+ TRACE("Long directory inode %x:%x, start_block %x, " -+ "offset %x\n", -+ SQUASHFS_INODE_BLK(inode), offset, -+ inodep->start_block, inodep->offset); -+ break; -+ } -+ case SQUASHFS_SYMLINK_TYPE: { -+ struct squashfs_symlink_inode_header *inodep = -+ &id.symlink; -+ struct squashfs_symlink_inode_header *sinodep = -+ &sid.symlink; -+ -+ if (msblk->swap) { -+ if (!squashfs_get_cached_block(s, (char *) -+ sinodep, block, offset, -+ sizeof(*sinodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ SQUASHFS_SWAP_SYMLINK_INODE_HEADER(inodep, -+ sinodep); -+ } else -+ if (!squashfs_get_cached_block(s, (char *) -+ inodep, block, offset, -+ sizeof(*inodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ if((i = squashfs_new_inode(s, inodeb)) == NULL) -+ goto failed_read1; -+ -+ i->i_nlink = inodep->nlink; -+ i->i_size = inodep->symlink_size; -+ i->i_op = &page_symlink_inode_operations; -+ i->i_data.a_ops = &squashfs_symlink_aops; -+ i->i_mode |= S_IFLNK; -+ SQUASHFS_I(i)->start_block = next_block; -+ SQUASHFS_I(i)->offset = next_offset; -+ -+ TRACE("Symbolic link inode %x:%x, start_block %llx, " -+ "offset %x\n", -+ SQUASHFS_INODE_BLK(inode), offset, -+ next_block, next_offset); -+ break; -+ } -+ case SQUASHFS_BLKDEV_TYPE: -+ case SQUASHFS_CHRDEV_TYPE: { -+ struct squashfs_dev_inode_header *inodep = &id.dev; -+ struct squashfs_dev_inode_header *sinodep = &sid.dev; -+ -+ if (msblk->swap) { -+ if (!squashfs_get_cached_block(s, (char *) -+ sinodep, block, offset, -+ sizeof(*sinodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ SQUASHFS_SWAP_DEV_INODE_HEADER(inodep, sinodep); -+ } else -+ if (!squashfs_get_cached_block(s, (char *) -+ inodep, block, offset, -+ sizeof(*inodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ if ((i = squashfs_new_inode(s, inodeb)) == NULL) -+ goto failed_read1; -+ -+ i->i_nlink = inodep->nlink; -+ i->i_mode |= (inodeb->inode_type == -+ SQUASHFS_CHRDEV_TYPE) ? S_IFCHR : -+ S_IFBLK; -+ init_special_inode(i, i->i_mode, -+ old_decode_dev(inodep->rdev)); -+ -+ TRACE("Device inode %x:%x, rdev %x\n", -+ SQUASHFS_INODE_BLK(inode), offset, -+ inodep->rdev); -+ break; -+ } -+ case SQUASHFS_FIFO_TYPE: -+ case SQUASHFS_SOCKET_TYPE: { -+ struct squashfs_ipc_inode_header *inodep = &id.ipc; -+ struct squashfs_ipc_inode_header *sinodep = &sid.ipc; -+ -+ if (msblk->swap) { -+ if (!squashfs_get_cached_block(s, (char *) -+ sinodep, block, offset, -+ sizeof(*sinodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ SQUASHFS_SWAP_IPC_INODE_HEADER(inodep, sinodep); -+ } else -+ if (!squashfs_get_cached_block(s, (char *) -+ inodep, block, offset, -+ sizeof(*inodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ if ((i = squashfs_new_inode(s, inodeb)) == NULL) -+ goto failed_read1; -+ -+ i->i_nlink = inodep->nlink; -+ i->i_mode |= (inodeb->inode_type == SQUASHFS_FIFO_TYPE) -+ ? S_IFIFO : S_IFSOCK; -+ init_special_inode(i, i->i_mode, 0); -+ break; -+ } -+ default: -+ ERROR("Unknown inode type %d in squashfs_iget!\n", -+ inodeb->inode_type); -+ goto failed_read1; -+ } -+ -+ insert_inode_hash(i); -+ return i; -+ -+failed_read: -+ ERROR("Unable to read inode [%llx:%x]\n", block, offset); -+ -+failed_read1: -+ return NULL; -+} -+ -+ -+static int read_fragment_index_table(struct super_block *s) -+{ -+ struct squashfs_sb_info *msblk = s->s_fs_info; -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ -+ /* Allocate fragment index table */ -+ if (!(msblk->fragment_index = kmalloc(SQUASHFS_FRAGMENT_INDEX_BYTES -+ (sblk->fragments), GFP_KERNEL))) { -+ ERROR("Failed to allocate uid/gid table\n"); -+ return 0; -+ } -+ -+ if (SQUASHFS_FRAGMENT_INDEX_BYTES(sblk->fragments) && -+ !squashfs_read_data(s, (char *) -+ msblk->fragment_index, -+ sblk->fragment_table_start, -+ SQUASHFS_FRAGMENT_INDEX_BYTES -+ (sblk->fragments) | -+ SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) { -+ ERROR("unable to read fragment index table\n"); -+ return 0; -+ } -+ -+ if (msblk->swap) { -+ int i; -+ long long fragment; -+ -+ for (i = 0; i < SQUASHFS_FRAGMENT_INDEXES(sblk->fragments); -+ i++) { -+ SQUASHFS_SWAP_FRAGMENT_INDEXES((&fragment), -+ &msblk->fragment_index[i], 1); -+ msblk->fragment_index[i] = fragment; -+ } -+ } -+ -+ return 1; -+} -+ -+ -+static int supported_squashfs_filesystem(struct squashfs_sb_info *msblk, int silent) -+{ -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ -+ msblk->iget = squashfs_iget; -+ msblk->read_blocklist = read_blocklist; -+ msblk->read_fragment_index_table = read_fragment_index_table; -+ -+ if (sblk->s_major == 1) { -+ if (!squashfs_1_0_supported(msblk)) { -+ SERROR("Major/Minor mismatch, Squashfs 1.0 filesystems " -+ "are unsupported\n"); -+ SERROR("Please recompile with " -+ "Squashfs 1.0 support enabled\n"); -+ return 0; -+ } -+ } else if (sblk->s_major == 2) { -+ if (!squashfs_2_0_supported(msblk)) { -+ SERROR("Major/Minor mismatch, Squashfs 2.0 filesystems " -+ "are unsupported\n"); -+ SERROR("Please recompile with " -+ "Squashfs 2.0 support enabled\n"); -+ return 0; -+ } -+ } else if(sblk->s_major != SQUASHFS_MAJOR || sblk->s_minor > -+ SQUASHFS_MINOR) { -+ SERROR("Major/Minor mismatch, trying to mount newer %d.%d " -+ "filesystem\n", sblk->s_major, sblk->s_minor); -+ SERROR("Please update your kernel\n"); -+ return 0; -+ } -+ -+ return 1; -+} -+ -+ -+static int squashfs_fill_super(struct super_block *s, void *data, int silent) -+{ -+ struct squashfs_sb_info *msblk; -+ struct squashfs_super_block *sblk; -+ int i; -+ char b[BDEVNAME_SIZE]; -+ struct inode *root; -+ -+ TRACE("Entered squashfs_read_superblock\n"); -+ -+ if (!(s->s_fs_info = kmalloc(sizeof(struct squashfs_sb_info), -+ GFP_KERNEL))) { -+ ERROR("Failed to allocate superblock\n"); -+ goto failure; -+ } -+ memset(s->s_fs_info, 0, sizeof(struct squashfs_sb_info)); -+ msblk = s->s_fs_info; -+ sblk = &msblk->sblk; -+ -+ msblk->devblksize = sb_min_blocksize(s, BLOCK_SIZE); -+ msblk->devblksize_log2 = ffz(~msblk->devblksize); -+ -+ init_MUTEX(&msblk->read_data_mutex); -+ init_MUTEX(&msblk->read_page_mutex); -+ init_MUTEX(&msblk->block_cache_mutex); -+ init_MUTEX(&msblk->fragment_mutex); -+ init_MUTEX(&msblk->meta_index_mutex); -+ -+ init_waitqueue_head(&msblk->waitq); -+ init_waitqueue_head(&msblk->fragment_wait_queue); -+ -+ if (!squashfs_read_data(s, (char *) sblk, SQUASHFS_START, -+ sizeof(struct squashfs_super_block) | -+ SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) { -+ SERROR("unable to read superblock\n"); -+ goto failed_mount; -+ } -+ -+ /* Check it is a SQUASHFS superblock */ -+ msblk->swap = 0; -+ if ((s->s_magic = sblk->s_magic) != SQUASHFS_MAGIC) { -+ if (sblk->s_magic == SQUASHFS_MAGIC_SWAP) { -+ struct squashfs_super_block ssblk; -+ -+ WARNING("Mounting a different endian SQUASHFS " -+ "filesystem on %s\n", bdevname(s->s_bdev, b)); -+ -+ SQUASHFS_SWAP_SUPER_BLOCK(&ssblk, sblk); -+ memcpy(sblk, &ssblk, sizeof(struct squashfs_super_block)); -+ msblk->swap = 1; -+ } else { -+ SERROR("Can't find a SQUASHFS superblock on %s\n", -+ bdevname(s->s_bdev, b)); -+ goto failed_mount; -+ } -+ } -+ -+ /* Check the MAJOR & MINOR versions */ -+ if(!supported_squashfs_filesystem(msblk, silent)) -+ goto failed_mount; -+ -+ TRACE("Found valid superblock on %s\n", bdevname(s->s_bdev, b)); -+ TRACE("Inodes are %scompressed\n", -+ SQUASHFS_UNCOMPRESSED_INODES -+ (sblk->flags) ? "un" : ""); -+ TRACE("Data is %scompressed\n", -+ SQUASHFS_UNCOMPRESSED_DATA(sblk->flags) -+ ? "un" : ""); -+ TRACE("Check data is %s present in the filesystem\n", -+ SQUASHFS_CHECK_DATA(sblk->flags) ? -+ "" : "not"); -+ TRACE("Filesystem size %lld bytes\n", sblk->bytes_used); -+ TRACE("Block size %d\n", sblk->block_size); -+ TRACE("Number of inodes %d\n", sblk->inodes); -+ if (sblk->s_major > 1) -+ TRACE("Number of fragments %d\n", sblk->fragments); -+ TRACE("Number of uids %d\n", sblk->no_uids); -+ TRACE("Number of gids %d\n", sblk->no_guids); -+ TRACE("sblk->inode_table_start %llx\n", sblk->inode_table_start); -+ TRACE("sblk->directory_table_start %llx\n", sblk->directory_table_start); -+ if (sblk->s_major > 1) -+ TRACE("sblk->fragment_table_start %llx\n", -+ sblk->fragment_table_start); -+ TRACE("sblk->uid_start %llx\n", sblk->uid_start); -+ -+ s->s_flags |= MS_RDONLY; -+ s->s_op = &squashfs_ops; -+ -+ /* Init inode_table block pointer array */ -+ if (!(msblk->block_cache = kmalloc(sizeof(struct squashfs_cache) * -+ SQUASHFS_CACHED_BLKS, GFP_KERNEL))) { -+ ERROR("Failed to allocate block cache\n"); -+ goto failed_mount; -+ } -+ -+ for (i = 0; i < SQUASHFS_CACHED_BLKS; i++) -+ msblk->block_cache[i].block = SQUASHFS_INVALID_BLK; -+ -+ msblk->next_cache = 0; -+ -+ /* Allocate read_data block */ -+ msblk->read_size = (sblk->block_size < SQUASHFS_METADATA_SIZE) ? -+ SQUASHFS_METADATA_SIZE : -+ sblk->block_size; -+ -+ if (!(msblk->read_data = kmalloc(msblk->read_size, GFP_KERNEL))) { -+ ERROR("Failed to allocate read_data block\n"); -+ goto failed_mount; -+ } -+ -+ /* Allocate read_page block */ -+ if (!(msblk->read_page = kmalloc(sblk->block_size, GFP_KERNEL))) { -+ ERROR("Failed to allocate read_page block\n"); -+ goto failed_mount; -+ } -+ -+ /* Allocate uid and gid tables */ -+ if (!(msblk->uid = kmalloc((sblk->no_uids + sblk->no_guids) * -+ sizeof(unsigned int), GFP_KERNEL))) { -+ ERROR("Failed to allocate uid/gid table\n"); -+ goto failed_mount; -+ } -+ msblk->guid = msblk->uid + sblk->no_uids; -+ -+ if (msblk->swap) { -+ unsigned int suid[sblk->no_uids + sblk->no_guids]; -+ -+ if (!squashfs_read_data(s, (char *) &suid, sblk->uid_start, -+ ((sblk->no_uids + sblk->no_guids) * -+ sizeof(unsigned int)) | -+ SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) { -+ ERROR("unable to read uid/gid table\n"); -+ goto failed_mount; -+ } -+ -+ SQUASHFS_SWAP_DATA(msblk->uid, suid, (sblk->no_uids + -+ sblk->no_guids), (sizeof(unsigned int) * 8)); -+ } else -+ if (!squashfs_read_data(s, (char *) msblk->uid, sblk->uid_start, -+ ((sblk->no_uids + sblk->no_guids) * -+ sizeof(unsigned int)) | -+ SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) { -+ ERROR("unable to read uid/gid table\n"); -+ goto failed_mount; -+ } -+ -+ -+ if (sblk->s_major == 1 && squashfs_1_0_supported(msblk)) -+ goto allocate_root; -+ -+ if (!(msblk->fragment = kmalloc(sizeof(struct squashfs_fragment_cache) * -+ SQUASHFS_CACHED_FRAGMENTS, GFP_KERNEL))) { -+ ERROR("Failed to allocate fragment block cache\n"); -+ goto failed_mount; -+ } -+ -+ for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS; i++) { -+ msblk->fragment[i].locked = 0; -+ msblk->fragment[i].block = SQUASHFS_INVALID_BLK; -+ msblk->fragment[i].data = NULL; -+ } -+ -+ msblk->next_fragment = 0; -+ -+ /* Allocate fragment index table */ -+ if (msblk->read_fragment_index_table(s) == 0) -+ goto failed_mount; -+ -+allocate_root: -+ if ((root = (msblk->iget)(s, sblk->root_inode)) == NULL) -+ goto failed_mount; -+ -+ if ((s->s_root = d_alloc_root(root)) == NULL) { -+ ERROR("Root inode create failed\n"); -+ iput(root); -+ goto failed_mount; -+ } -+ -+ TRACE("Leaving squashfs_read_super\n"); -+ return 0; -+ -+failed_mount: -+ kfree(msblk->fragment_index); -+ kfree(msblk->fragment); -+ kfree(msblk->uid); -+ kfree(msblk->read_page); -+ kfree(msblk->read_data); -+ kfree(msblk->block_cache); -+ kfree(msblk->fragment_index_2); -+ kfree(s->s_fs_info); -+ s->s_fs_info = NULL; -+ return -EINVAL; -+ -+failure: -+ return -ENOMEM; -+} -+ -+ -+static int squashfs_statfs(struct dentry *dentry, struct kstatfs *buf) -+{ -+ struct squashfs_sb_info *msblk = dentry->d_inode->i_sb->s_fs_info; -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ -+ TRACE("Entered squashfs_statfs\n"); -+ -+ buf->f_type = SQUASHFS_MAGIC; -+ buf->f_bsize = sblk->block_size; -+ buf->f_blocks = ((sblk->bytes_used - 1) >> sblk->block_log) + 1; -+ buf->f_bfree = buf->f_bavail = 0; -+ buf->f_files = sblk->inodes; -+ buf->f_ffree = 0; -+ buf->f_namelen = SQUASHFS_NAME_LEN; -+ -+ return 0; -+} -+ -+ -+static int squashfs_symlink_readpage(struct file *file, struct page *page) -+{ -+ struct inode *inode = page->mapping->host; -+ int index = page->index << PAGE_CACHE_SHIFT, length, bytes; -+ long long block = SQUASHFS_I(inode)->start_block; -+ int offset = SQUASHFS_I(inode)->offset; -+ void *pageaddr = kmap(page); -+ -+ TRACE("Entered squashfs_symlink_readpage, page index %ld, start block " -+ "%llx, offset %x\n", page->index, -+ SQUASHFS_I(inode)->start_block, -+ SQUASHFS_I(inode)->offset); -+ -+ for (length = 0; length < index; length += bytes) { -+ if (!(bytes = squashfs_get_cached_block(inode->i_sb, NULL, -+ block, offset, PAGE_CACHE_SIZE, &block, -+ &offset))) { -+ ERROR("Unable to read symbolic link [%llx:%x]\n", block, -+ offset); -+ goto skip_read; -+ } -+ } -+ -+ if (length != index) { -+ ERROR("(squashfs_symlink_readpage) length != index\n"); -+ bytes = 0; -+ goto skip_read; -+ } -+ -+ bytes = (i_size_read(inode) - length) > PAGE_CACHE_SIZE ? PAGE_CACHE_SIZE : -+ i_size_read(inode) - length; -+ -+ if (!(bytes = squashfs_get_cached_block(inode->i_sb, pageaddr, block, -+ offset, bytes, &block, &offset))) -+ ERROR("Unable to read symbolic link [%llx:%x]\n", block, offset); -+ -+skip_read: -+ memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes); -+ kunmap(page); -+ SetPageUptodate(page); -+ unlock_page(page); -+ -+ return 0; -+} -+ -+ -+struct meta_index *locate_meta_index(struct inode *inode, int index, int offset) -+{ -+ struct meta_index *meta = NULL; -+ struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info; -+ int i; -+ -+ down(&msblk->meta_index_mutex); -+ -+ TRACE("locate_meta_index: index %d, offset %d\n", index, offset); -+ -+ if(msblk->meta_index == NULL) -+ goto not_allocated; -+ -+ for (i = 0; i < SQUASHFS_META_NUMBER; i ++) -+ if (msblk->meta_index[i].inode_number == inode->i_ino && -+ msblk->meta_index[i].offset >= offset && -+ msblk->meta_index[i].offset <= index && -+ msblk->meta_index[i].locked == 0) { -+ TRACE("locate_meta_index: entry %d, offset %d\n", i, -+ msblk->meta_index[i].offset); -+ meta = &msblk->meta_index[i]; -+ offset = meta->offset; -+ } -+ -+ if (meta) -+ meta->locked = 1; -+ -+not_allocated: -+ up(&msblk->meta_index_mutex); -+ -+ return meta; -+} -+ -+ -+struct meta_index *empty_meta_index(struct inode *inode, int offset, int skip) -+{ -+ struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info; -+ struct meta_index *meta = NULL; -+ int i; -+ -+ down(&msblk->meta_index_mutex); -+ -+ TRACE("empty_meta_index: offset %d, skip %d\n", offset, skip); -+ -+ if(msblk->meta_index == NULL) { -+ if (!(msblk->meta_index = kmalloc(sizeof(struct meta_index) * -+ SQUASHFS_META_NUMBER, GFP_KERNEL))) { -+ ERROR("Failed to allocate meta_index\n"); -+ goto failed; -+ } -+ for(i = 0; i < SQUASHFS_META_NUMBER; i++) { -+ msblk->meta_index[i].inode_number = 0; -+ msblk->meta_index[i].locked = 0; -+ } -+ msblk->next_meta_index = 0; -+ } -+ -+ for(i = SQUASHFS_META_NUMBER; i && -+ msblk->meta_index[msblk->next_meta_index].locked; i --) -+ msblk->next_meta_index = (msblk->next_meta_index + 1) % -+ SQUASHFS_META_NUMBER; -+ -+ if(i == 0) { -+ TRACE("empty_meta_index: failed!\n"); -+ goto failed; -+ } -+ -+ TRACE("empty_meta_index: returned meta entry %d, %p\n", -+ msblk->next_meta_index, -+ &msblk->meta_index[msblk->next_meta_index]); -+ -+ meta = &msblk->meta_index[msblk->next_meta_index]; -+ msblk->next_meta_index = (msblk->next_meta_index + 1) % -+ SQUASHFS_META_NUMBER; -+ -+ meta->inode_number = inode->i_ino; -+ meta->offset = offset; -+ meta->skip = skip; -+ meta->entries = 0; -+ meta->locked = 1; -+ -+failed: -+ up(&msblk->meta_index_mutex); -+ return meta; -+} -+ -+ -+void release_meta_index(struct inode *inode, struct meta_index *meta) -+{ -+ meta->locked = 0; -+} -+ -+ -+static int read_block_index(struct super_block *s, int blocks, char *block_list, -+ long long *start_block, int *offset) -+{ -+ struct squashfs_sb_info *msblk = s->s_fs_info; -+ unsigned int *block_listp; -+ int block = 0; -+ -+ if (msblk->swap) { -+ char sblock_list[blocks << 2]; -+ -+ if (!squashfs_get_cached_block(s, sblock_list, *start_block, -+ *offset, blocks << 2, start_block, offset)) { -+ ERROR("Unable to read block list [%llx:%x]\n", -+ *start_block, *offset); -+ goto failure; -+ } -+ SQUASHFS_SWAP_INTS(((unsigned int *)block_list), -+ ((unsigned int *)sblock_list), blocks); -+ } else -+ if (!squashfs_get_cached_block(s, block_list, *start_block, -+ *offset, blocks << 2, start_block, offset)) { -+ ERROR("Unable to read block list [%llx:%x]\n", -+ *start_block, *offset); -+ goto failure; -+ } -+ -+ for (block_listp = (unsigned int *) block_list; blocks; -+ block_listp++, blocks --) -+ block += SQUASHFS_COMPRESSED_SIZE_BLOCK(*block_listp); -+ -+ return block; -+ -+failure: -+ return -1; -+} -+ -+ -+#define SIZE 256 -+ -+static inline int calculate_skip(int blocks) { -+ int skip = (blocks - 1) / ((SQUASHFS_SLOTS * SQUASHFS_META_ENTRIES + 1) * SQUASHFS_META_INDEXES); -+ return skip >= 7 ? 7 : skip + 1; -+} -+ -+ -+static int get_meta_index(struct inode *inode, int index, -+ long long *index_block, int *index_offset, -+ long long *data_block, char *block_list) -+{ -+ struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info; -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ int skip = calculate_skip(i_size_read(inode) >> sblk->block_log); -+ int offset = 0; -+ struct meta_index *meta; -+ struct meta_entry *meta_entry; -+ long long cur_index_block = SQUASHFS_I(inode)->u.s1.block_list_start; -+ int cur_offset = SQUASHFS_I(inode)->offset; -+ long long cur_data_block = SQUASHFS_I(inode)->start_block; -+ int i; -+ -+ index /= SQUASHFS_META_INDEXES * skip; -+ -+ while ( offset < index ) { -+ meta = locate_meta_index(inode, index, offset + 1); -+ -+ if (meta == NULL) { -+ if ((meta = empty_meta_index(inode, offset + 1, -+ skip)) == NULL) -+ goto all_done; -+ } else { -+ offset = index < meta->offset + meta->entries ? index : -+ meta->offset + meta->entries - 1; -+ meta_entry = &meta->meta_entry[offset - meta->offset]; -+ cur_index_block = meta_entry->index_block + sblk->inode_table_start; -+ cur_offset = meta_entry->offset; -+ cur_data_block = meta_entry->data_block; -+ TRACE("get_meta_index: offset %d, meta->offset %d, " -+ "meta->entries %d\n", offset, meta->offset, -+ meta->entries); -+ TRACE("get_meta_index: index_block 0x%llx, offset 0x%x" -+ " data_block 0x%llx\n", cur_index_block, -+ cur_offset, cur_data_block); -+ } -+ -+ for (i = meta->offset + meta->entries; i <= index && -+ i < meta->offset + SQUASHFS_META_ENTRIES; i++) { -+ int blocks = skip * SQUASHFS_META_INDEXES; -+ -+ while (blocks) { -+ int block = blocks > (SIZE >> 2) ? (SIZE >> 2) : -+ blocks; -+ int res = read_block_index(inode->i_sb, block, -+ block_list, &cur_index_block, -+ &cur_offset); -+ -+ if (res == -1) -+ goto failed; -+ -+ cur_data_block += res; -+ blocks -= block; -+ } -+ -+ meta_entry = &meta->meta_entry[i - meta->offset]; -+ meta_entry->index_block = cur_index_block - sblk->inode_table_start; -+ meta_entry->offset = cur_offset; -+ meta_entry->data_block = cur_data_block; -+ meta->entries ++; -+ offset ++; -+ } -+ -+ TRACE("get_meta_index: meta->offset %d, meta->entries %d\n", -+ meta->offset, meta->entries); -+ -+ release_meta_index(inode, meta); -+ } -+ -+all_done: -+ *index_block = cur_index_block; -+ *index_offset = cur_offset; -+ *data_block = cur_data_block; -+ -+ return offset * SQUASHFS_META_INDEXES * skip; -+ -+failed: -+ release_meta_index(inode, meta); -+ return -1; -+} -+ -+ -+static long long read_blocklist(struct inode *inode, int index, -+ int readahead_blks, char *block_list, -+ unsigned short **block_p, unsigned int *bsize) -+{ -+ long long block_ptr; -+ int offset; -+ long long block; -+ int res = get_meta_index(inode, index, &block_ptr, &offset, &block, -+ block_list); -+ -+ TRACE("read_blocklist: res %d, index %d, block_ptr 0x%llx, offset" -+ " 0x%x, block 0x%llx\n", res, index, block_ptr, offset, -+ block); -+ -+ if(res == -1) -+ goto failure; -+ -+ index -= res; -+ -+ while ( index ) { -+ int blocks = index > (SIZE >> 2) ? (SIZE >> 2) : index; -+ int res = read_block_index(inode->i_sb, blocks, block_list, -+ &block_ptr, &offset); -+ if (res == -1) -+ goto failure; -+ block += res; -+ index -= blocks; -+ } -+ -+ if (read_block_index(inode->i_sb, 1, block_list, -+ &block_ptr, &offset) == -1) -+ goto failure; -+ *bsize = *((unsigned int *) block_list); -+ -+ return block; -+ -+failure: -+ return 0; -+} -+ -+ -+static int squashfs_readpage(struct file *file, struct page *page) -+{ -+ struct inode *inode = page->mapping->host; -+ struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info; -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ unsigned char block_list[SIZE]; -+ long long block; -+ unsigned int bsize, i = 0, bytes = 0, byte_offset = 0; -+ int index = page->index >> (sblk->block_log - PAGE_CACHE_SHIFT); -+ void *pageaddr; -+ struct squashfs_fragment_cache *fragment = NULL; -+ char *data_ptr = msblk->read_page; -+ -+ int mask = (1 << (sblk->block_log - PAGE_CACHE_SHIFT)) - 1; -+ int start_index = page->index & ~mask; -+ int end_index = start_index | mask; -+ -+ TRACE("Entered squashfs_readpage, page index %lx, start block %llx\n", -+ page->index, -+ SQUASHFS_I(inode)->start_block); -+ -+ if (page->index >= ((i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> -+ PAGE_CACHE_SHIFT)) -+ goto skip_read; -+ -+ if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK -+ || index < (i_size_read(inode) >> -+ sblk->block_log)) { -+ if ((block = (msblk->read_blocklist)(inode, index, 1, -+ block_list, NULL, &bsize)) == 0) -+ goto skip_read; -+ -+ down(&msblk->read_page_mutex); -+ -+ if (!(bytes = squashfs_read_data(inode->i_sb, msblk->read_page, -+ block, bsize, NULL))) { -+ ERROR("Unable to read page, block %llx, size %x\n", block, -+ bsize); -+ up(&msblk->read_page_mutex); -+ goto skip_read; -+ } -+ } else { -+ if ((fragment = get_cached_fragment(inode->i_sb, -+ SQUASHFS_I(inode)-> -+ u.s1.fragment_start_block, -+ SQUASHFS_I(inode)->u.s1.fragment_size)) -+ == NULL) { -+ ERROR("Unable to read page, block %llx, size %x\n", -+ SQUASHFS_I(inode)-> -+ u.s1.fragment_start_block, -+ (int) SQUASHFS_I(inode)-> -+ u.s1.fragment_size); -+ goto skip_read; -+ } -+ bytes = SQUASHFS_I(inode)->u.s1.fragment_offset + -+ (i_size_read(inode) & (sblk->block_size -+ - 1)); -+ byte_offset = SQUASHFS_I(inode)->u.s1.fragment_offset; -+ data_ptr = fragment->data; -+ } -+ -+ for (i = start_index; i <= end_index && byte_offset < bytes; -+ i++, byte_offset += PAGE_CACHE_SIZE) { -+ struct page *push_page; -+ int available_bytes = (bytes - byte_offset) > PAGE_CACHE_SIZE ? -+ PAGE_CACHE_SIZE : bytes - byte_offset; -+ -+ TRACE("bytes %d, i %d, byte_offset %d, available_bytes %d\n", -+ bytes, i, byte_offset, available_bytes); -+ -+ if (i == page->index) { -+ pageaddr = kmap_atomic(page, KM_USER0); -+ memcpy(pageaddr, data_ptr + byte_offset, -+ available_bytes); -+ memset(pageaddr + available_bytes, 0, -+ PAGE_CACHE_SIZE - available_bytes); -+ kunmap_atomic(pageaddr, KM_USER0); -+ flush_dcache_page(page); -+ SetPageUptodate(page); -+ unlock_page(page); -+ } else if ((push_page = -+ grab_cache_page_nowait(page->mapping, i))) { -+ pageaddr = kmap_atomic(push_page, KM_USER0); -+ -+ memcpy(pageaddr, data_ptr + byte_offset, -+ available_bytes); -+ memset(pageaddr + available_bytes, 0, -+ PAGE_CACHE_SIZE - available_bytes); -+ kunmap_atomic(pageaddr, KM_USER0); -+ flush_dcache_page(push_page); -+ SetPageUptodate(push_page); -+ unlock_page(push_page); -+ page_cache_release(push_page); -+ } -+ } -+ -+ if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK -+ || index < (i_size_read(inode) >> -+ sblk->block_log)) -+ up(&msblk->read_page_mutex); -+ else -+ release_cached_fragment(msblk, fragment); -+ -+ return 0; -+ -+skip_read: -+ pageaddr = kmap_atomic(page, KM_USER0); -+ memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes); -+ kunmap_atomic(pageaddr, KM_USER0); -+ flush_dcache_page(page); -+ SetPageUptodate(page); -+ unlock_page(page); -+ -+ return 0; -+} -+ -+ -+static int squashfs_readpage4K(struct file *file, struct page *page) -+{ -+ struct inode *inode = page->mapping->host; -+ struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info; -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ unsigned char block_list[SIZE]; -+ long long block; -+ unsigned int bsize, bytes = 0; -+ void *pageaddr; -+ -+ TRACE("Entered squashfs_readpage4K, page index %lx, start block %llx\n", -+ page->index, -+ SQUASHFS_I(inode)->start_block); -+ -+ if (page->index >= ((i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> -+ PAGE_CACHE_SHIFT)) { -+ pageaddr = kmap_atomic(page, KM_USER0); -+ goto skip_read; -+ } -+ -+ if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK -+ || page->index < (i_size_read(inode) >> -+ sblk->block_log)) { -+ block = (msblk->read_blocklist)(inode, page->index, 1, -+ block_list, NULL, &bsize); -+ -+ down(&msblk->read_page_mutex); -+ bytes = squashfs_read_data(inode->i_sb, msblk->read_page, block, -+ bsize, NULL); -+ pageaddr = kmap_atomic(page, KM_USER0); -+ if (bytes) -+ memcpy(pageaddr, msblk->read_page, bytes); -+ else -+ ERROR("Unable to read page, block %llx, size %x\n", -+ block, bsize); -+ up(&msblk->read_page_mutex); -+ } else { -+ struct squashfs_fragment_cache *fragment = -+ get_cached_fragment(inode->i_sb, -+ SQUASHFS_I(inode)-> -+ u.s1.fragment_start_block, -+ SQUASHFS_I(inode)-> u.s1.fragment_size); -+ pageaddr = kmap_atomic(page, KM_USER0); -+ if (fragment) { -+ bytes = i_size_read(inode) & (sblk->block_size - 1); -+ memcpy(pageaddr, fragment->data + SQUASHFS_I(inode)-> -+ u.s1.fragment_offset, bytes); -+ release_cached_fragment(msblk, fragment); -+ } else -+ ERROR("Unable to read page, block %llx, size %x\n", -+ SQUASHFS_I(inode)-> -+ u.s1.fragment_start_block, (int) -+ SQUASHFS_I(inode)-> u.s1.fragment_size); -+ } -+ -+skip_read: -+ memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes); -+ kunmap_atomic(pageaddr, KM_USER0); -+ flush_dcache_page(page); -+ SetPageUptodate(page); -+ unlock_page(page); -+ -+ return 0; -+} -+ -+ -+static int get_dir_index_using_offset(struct super_block *s, long long -+ *next_block, unsigned int *next_offset, -+ long long index_start, -+ unsigned int index_offset, int i_count, -+ long long f_pos) -+{ -+ struct squashfs_sb_info *msblk = s->s_fs_info; -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ int i, length = 0; -+ struct squashfs_dir_index index; -+ -+ TRACE("Entered get_dir_index_using_offset, i_count %d, f_pos %d\n", -+ i_count, (unsigned int) f_pos); -+ -+ f_pos =- 3; -+ if (f_pos == 0) -+ goto finish; -+ -+ for (i = 0; i < i_count; i++) { -+ if (msblk->swap) { -+ struct squashfs_dir_index sindex; -+ squashfs_get_cached_block(s, (char *) &sindex, -+ index_start, index_offset, -+ sizeof(sindex), &index_start, -+ &index_offset); -+ SQUASHFS_SWAP_DIR_INDEX(&index, &sindex); -+ } else -+ squashfs_get_cached_block(s, (char *) &index, -+ index_start, index_offset, -+ sizeof(index), &index_start, -+ &index_offset); -+ -+ if (index.index > f_pos) -+ break; -+ -+ squashfs_get_cached_block(s, NULL, index_start, index_offset, -+ index.size + 1, &index_start, -+ &index_offset); -+ -+ length = index.index; -+ *next_block = index.start_block + sblk->directory_table_start; -+ } -+ -+ *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE; -+ -+finish: -+ return length + 3; -+} -+ -+ -+static int get_dir_index_using_name(struct super_block *s, long long -+ *next_block, unsigned int *next_offset, -+ long long index_start, -+ unsigned int index_offset, int i_count, -+ const char *name, int size) -+{ -+ struct squashfs_sb_info *msblk = s->s_fs_info; -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ int i, length = 0; -+ char buffer[sizeof(struct squashfs_dir_index) + SQUASHFS_NAME_LEN + 1]; -+ struct squashfs_dir_index *index = (struct squashfs_dir_index *) buffer; -+ char str[SQUASHFS_NAME_LEN + 1]; -+ -+ TRACE("Entered get_dir_index_using_name, i_count %d\n", i_count); -+ -+ strncpy(str, name, size); -+ str[size] = '\0'; -+ -+ for (i = 0; i < i_count; i++) { -+ if (msblk->swap) { -+ struct squashfs_dir_index sindex; -+ squashfs_get_cached_block(s, (char *) &sindex, -+ index_start, index_offset, -+ sizeof(sindex), &index_start, -+ &index_offset); -+ SQUASHFS_SWAP_DIR_INDEX(index, &sindex); -+ } else -+ squashfs_get_cached_block(s, (char *) index, -+ index_start, index_offset, -+ sizeof(struct squashfs_dir_index), -+ &index_start, &index_offset); -+ -+ squashfs_get_cached_block(s, index->name, index_start, -+ index_offset, index->size + 1, -+ &index_start, &index_offset); -+ -+ index->name[index->size + 1] = '\0'; -+ -+ if (strcmp(index->name, str) > 0) -+ break; -+ -+ length = index->index; -+ *next_block = index->start_block + sblk->directory_table_start; -+ } -+ -+ *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE; -+ return length + 3; -+} -+ -+ -+static int squashfs_readdir(struct file *file, void *dirent, filldir_t filldir) -+{ -+ struct inode *i = file->f_dentry->d_inode; -+ struct squashfs_sb_info *msblk = i->i_sb->s_fs_info; -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ long long next_block = SQUASHFS_I(i)->start_block + -+ sblk->directory_table_start; -+ int next_offset = SQUASHFS_I(i)->offset, length = 0, dirs_read = 0, -+ dir_count; -+ struct squashfs_dir_header dirh; -+ char buffer[sizeof(struct squashfs_dir_entry) + SQUASHFS_NAME_LEN + 1]; -+ struct squashfs_dir_entry *dire = (struct squashfs_dir_entry *) buffer; -+ -+ TRACE("Entered squashfs_readdir [%llx:%x]\n", next_block, next_offset); -+ -+ while(file->f_pos < 3) { -+ char *name; -+ int size, i_ino; -+ -+ if(file->f_pos == 0) { -+ name = "."; -+ size = 1; -+ i_ino = i->i_ino; -+ } else { -+ name = ".."; -+ size = 2; -+ i_ino = SQUASHFS_I(i)->u.s2.parent_inode; -+ } -+ TRACE("Calling filldir(%x, %s, %d, %d, %d, %d)\n", -+ (unsigned int) dirent, name, size, (int) -+ file->f_pos, i_ino, -+ squashfs_filetype_table[1]); -+ -+ if (filldir(dirent, name, size, -+ file->f_pos, i_ino, -+ squashfs_filetype_table[1]) < 0) { -+ TRACE("Filldir returned less than 0\n"); -+ goto finish; -+ } -+ file->f_pos += size; -+ dirs_read++; -+ } -+ -+ length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset, -+ SQUASHFS_I(i)->u.s2.directory_index_start, -+ SQUASHFS_I(i)->u.s2.directory_index_offset, -+ SQUASHFS_I(i)->u.s2.directory_index_count, -+ file->f_pos); -+ -+ while (length < i_size_read(i)) { -+ /* read directory header */ -+ if (msblk->swap) { -+ struct squashfs_dir_header sdirh; -+ -+ if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh, -+ next_block, next_offset, sizeof(sdirh), -+ &next_block, &next_offset)) -+ goto failed_read; -+ -+ length += sizeof(sdirh); -+ SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh); -+ } else { -+ if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh, -+ next_block, next_offset, sizeof(dirh), -+ &next_block, &next_offset)) -+ goto failed_read; -+ -+ length += sizeof(dirh); -+ } -+ -+ dir_count = dirh.count + 1; -+ while (dir_count--) { -+ if (msblk->swap) { -+ struct squashfs_dir_entry sdire; -+ if (!squashfs_get_cached_block(i->i_sb, (char *) -+ &sdire, next_block, next_offset, -+ sizeof(sdire), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ length += sizeof(sdire); -+ SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire); -+ } else { -+ if (!squashfs_get_cached_block(i->i_sb, (char *) -+ dire, next_block, next_offset, -+ sizeof(*dire), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ length += sizeof(*dire); -+ } -+ -+ if (!squashfs_get_cached_block(i->i_sb, dire->name, -+ next_block, next_offset, -+ dire->size + 1, &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ length += dire->size + 1; -+ -+ if (file->f_pos >= length) -+ continue; -+ -+ dire->name[dire->size + 1] = '\0'; -+ -+ TRACE("Calling filldir(%x, %s, %d, %d, %x:%x, %d, %d)\n", -+ (unsigned int) dirent, dire->name, -+ dire->size + 1, (int) file->f_pos, -+ dirh.start_block, dire->offset, -+ dirh.inode_number + dire->inode_number, -+ squashfs_filetype_table[dire->type]); -+ -+ if (filldir(dirent, dire->name, dire->size + 1, -+ file->f_pos, -+ dirh.inode_number + dire->inode_number, -+ squashfs_filetype_table[dire->type]) -+ < 0) { -+ TRACE("Filldir returned less than 0\n"); -+ goto finish; -+ } -+ file->f_pos = length; -+ dirs_read++; -+ } -+ } -+ -+finish: -+ return dirs_read; -+ -+failed_read: -+ ERROR("Unable to read directory block [%llx:%x]\n", next_block, -+ next_offset); -+ return 0; -+} -+ -+ -+static struct dentry *squashfs_lookup(struct inode *i, struct dentry *dentry, -+ struct nameidata *nd) -+{ -+ const unsigned char *name = dentry->d_name.name; -+ int len = dentry->d_name.len; -+ struct inode *inode = NULL; -+ struct squashfs_sb_info *msblk = i->i_sb->s_fs_info; -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ long long next_block = SQUASHFS_I(i)->start_block + -+ sblk->directory_table_start; -+ int next_offset = SQUASHFS_I(i)->offset, length = 0, -+ dir_count; -+ struct squashfs_dir_header dirh; -+ char buffer[sizeof(struct squashfs_dir_entry) + SQUASHFS_NAME_LEN]; -+ struct squashfs_dir_entry *dire = (struct squashfs_dir_entry *) buffer; -+ -+ TRACE("Entered squashfs_lookup [%llx:%x]\n", next_block, next_offset); -+ -+ if (len > SQUASHFS_NAME_LEN) -+ goto exit_loop; -+ -+ length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset, -+ SQUASHFS_I(i)->u.s2.directory_index_start, -+ SQUASHFS_I(i)->u.s2.directory_index_offset, -+ SQUASHFS_I(i)->u.s2.directory_index_count, name, -+ len); -+ -+ while (length < i_size_read(i)) { -+ /* read directory header */ -+ if (msblk->swap) { -+ struct squashfs_dir_header sdirh; -+ if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh, -+ next_block, next_offset, sizeof(sdirh), -+ &next_block, &next_offset)) -+ goto failed_read; -+ -+ length += sizeof(sdirh); -+ SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh); -+ } else { -+ if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh, -+ next_block, next_offset, sizeof(dirh), -+ &next_block, &next_offset)) -+ goto failed_read; -+ -+ length += sizeof(dirh); -+ } -+ -+ dir_count = dirh.count + 1; -+ while (dir_count--) { -+ if (msblk->swap) { -+ struct squashfs_dir_entry sdire; -+ if (!squashfs_get_cached_block(i->i_sb, (char *) -+ &sdire, next_block,next_offset, -+ sizeof(sdire), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ length += sizeof(sdire); -+ SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire); -+ } else { -+ if (!squashfs_get_cached_block(i->i_sb, (char *) -+ dire, next_block,next_offset, -+ sizeof(*dire), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ length += sizeof(*dire); -+ } -+ -+ if (!squashfs_get_cached_block(i->i_sb, dire->name, -+ next_block, next_offset, dire->size + 1, -+ &next_block, &next_offset)) -+ goto failed_read; -+ -+ length += dire->size + 1; -+ -+ if (name[0] < dire->name[0]) -+ goto exit_loop; -+ -+ if ((len == dire->size + 1) && !strncmp(name, -+ dire->name, len)) { -+ squashfs_inode_t ino = -+ SQUASHFS_MKINODE(dirh.start_block, -+ dire->offset); -+ -+ TRACE("calling squashfs_iget for directory " -+ "entry %s, inode %x:%x, %d\n", name, -+ dirh.start_block, dire->offset, -+ dirh.inode_number + dire->inode_number); -+ -+ inode = (msblk->iget)(i->i_sb, ino); -+ -+ goto exit_loop; -+ } -+ } -+ } -+ -+exit_loop: -+ d_add(dentry, inode); -+ return ERR_PTR(0); -+ -+failed_read: -+ ERROR("Unable to read directory block [%llx:%x]\n", next_block, -+ next_offset); -+ goto exit_loop; -+} -+ -+ -+static void squashfs_put_super(struct super_block *s) -+{ -+ int i; -+ -+ if (s->s_fs_info) { -+ struct squashfs_sb_info *sbi = s->s_fs_info; -+ if (sbi->block_cache) -+ for (i = 0; i < SQUASHFS_CACHED_BLKS; i++) -+ if (sbi->block_cache[i].block != -+ SQUASHFS_INVALID_BLK) -+ kfree(sbi->block_cache[i].data); -+ if (sbi->fragment) -+ for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS; i++) -+ SQUASHFS_FREE(sbi->fragment[i].data); -+ kfree(sbi->fragment); -+ kfree(sbi->block_cache); -+ kfree(sbi->read_data); -+ kfree(sbi->read_page); -+ kfree(sbi->uid); -+ kfree(sbi->fragment_index); -+ kfree(sbi->fragment_index_2); -+ kfree(sbi->meta_index); -+ kfree(s->s_fs_info); -+ s->s_fs_info = NULL; -+ } -+} -+ -+ -+static int squashfs_get_sb(struct file_system_type *fs_type, -+ int flags, const char *dev_name, void *data, -+ struct vfsmount *mnt) -+{ -+ return get_sb_bdev(fs_type, flags, dev_name, data, squashfs_fill_super, mnt); -+} -+ -+ -+static int __init init_squashfs_fs(void) -+{ -+ int err = init_inodecache(); -+ if (err) -+ goto out; -+ -+ printk(KERN_INFO "squashfs: version 3.0 (2006/03/15) " -+ "Phillip Lougher\n"); -+ -+ if (!(stream.workspace = vmalloc(zlib_inflate_workspacesize()))) { -+ ERROR("Failed to allocate zlib workspace\n"); -+ destroy_inodecache(); -+ err = -ENOMEM; -+ goto out; -+ } -+ -+ if ((err = register_filesystem(&squashfs_fs_type))) { -+ vfree(stream.workspace); -+ destroy_inodecache(); -+ } -+ -+out: -+ return err; -+} -+ -+ -+static void __exit exit_squashfs_fs(void) -+{ -+ vfree(stream.workspace); -+ unregister_filesystem(&squashfs_fs_type); -+ destroy_inodecache(); -+} -+ -+ -+static struct kmem_cache * squashfs_inode_cachep; -+ -+ -+static struct inode *squashfs_alloc_inode(struct super_block *sb) -+{ -+ struct squashfs_inode_info *ei; -+ ei = kmem_cache_alloc(squashfs_inode_cachep, GFP_KERNEL); -+ if (!ei) -+ return NULL; -+ return &ei->vfs_inode; -+} -+ -+ -+static void squashfs_destroy_inode(struct inode *inode) -+{ -+ kmem_cache_free(squashfs_inode_cachep, SQUASHFS_I(inode)); -+} -+ -+ -+static void init_once(void * foo, struct kmem_cache * cachep, unsigned long flags) -+{ -+ struct squashfs_inode_info *ei = foo; -+ -+ if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) == -+ SLAB_CTOR_CONSTRUCTOR) -+ inode_init_once(&ei->vfs_inode); -+} -+ -+ -+static int __init init_inodecache(void) -+{ -+ squashfs_inode_cachep = kmem_cache_create("squashfs_inode_cache", -+ sizeof(struct squashfs_inode_info), -+ 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, -+ init_once, NULL); -+ if (squashfs_inode_cachep == NULL) -+ return -ENOMEM; -+ return 0; -+} -+ -+ -+static void destroy_inodecache(void) -+{ -+ kmem_cache_destroy(squashfs_inode_cachep); -+} -+ -+ -+module_init(init_squashfs_fs); -+module_exit(exit_squashfs_fs); -+MODULE_DESCRIPTION("squashfs, a compressed read-only filesystem"); -+MODULE_AUTHOR("Phillip Lougher "); -+MODULE_LICENSE("GPL"); ---- /dev/null -+++ b/fs/squashfs/Makefile -@@ -0,0 +1,7 @@ -+# -+# Makefile for the linux squashfs routines. -+# -+ -+obj-$(CONFIG_SQUASHFS) += squashfs.o -+squashfs-y += inode.o -+squashfs-y += squashfs2_0.o ---- /dev/null -+++ b/fs/squashfs/squashfs2_0.c -@@ -0,0 +1,758 @@ -+/* -+ * Squashfs - a compressed read only filesystem for Linux -+ * -+ * Copyright (c) 2002, 2003, 2004, 2005, 2006 -+ * Phillip Lougher -+ * -+ * 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, -+ * 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -+ * -+ * squashfs2_0.c -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "squashfs.h" -+static int squashfs_readdir_2(struct file *file, void *dirent, filldir_t filldir); -+static struct dentry *squashfs_lookup_2(struct inode *, struct dentry *, -+ struct nameidata *); -+ -+static struct file_operations squashfs_dir_ops_2 = { -+ .read = generic_read_dir, -+ .readdir = squashfs_readdir_2 -+}; -+ -+static struct inode_operations squashfs_dir_inode_ops_2 = { -+ .lookup = squashfs_lookup_2 -+}; -+ -+static unsigned char squashfs_filetype_table[] = { -+ DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_FIFO, DT_SOCK -+}; -+ -+static int read_fragment_index_table_2(struct super_block *s) -+{ -+ struct squashfs_sb_info *msblk = s->s_fs_info; -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ -+ if (!(msblk->fragment_index_2 = kmalloc(SQUASHFS_FRAGMENT_INDEX_BYTES_2 -+ (sblk->fragments), GFP_KERNEL))) { -+ ERROR("Failed to allocate uid/gid table\n"); -+ return 0; -+ } -+ -+ if (SQUASHFS_FRAGMENT_INDEX_BYTES_2(sblk->fragments) && -+ !squashfs_read_data(s, (char *) -+ msblk->fragment_index_2, -+ sblk->fragment_table_start, -+ SQUASHFS_FRAGMENT_INDEX_BYTES_2 -+ (sblk->fragments) | -+ SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) { -+ ERROR("unable to read fragment index table\n"); -+ return 0; -+ } -+ -+ if (msblk->swap) { -+ int i; -+ unsigned int fragment; -+ -+ for (i = 0; i < SQUASHFS_FRAGMENT_INDEXES_2(sblk->fragments); -+ i++) { -+ SQUASHFS_SWAP_FRAGMENT_INDEXES_2((&fragment), -+ &msblk->fragment_index_2[i], 1); -+ msblk->fragment_index_2[i] = fragment; -+ } -+ } -+ -+ return 1; -+} -+ -+ -+static int get_fragment_location_2(struct super_block *s, unsigned int fragment, -+ long long *fragment_start_block, -+ unsigned int *fragment_size) -+{ -+ struct squashfs_sb_info *msblk = s->s_fs_info; -+ long long start_block = -+ msblk->fragment_index_2[SQUASHFS_FRAGMENT_INDEX_2(fragment)]; -+ int offset = SQUASHFS_FRAGMENT_INDEX_OFFSET_2(fragment); -+ struct squashfs_fragment_entry_2 fragment_entry; -+ -+ if (msblk->swap) { -+ struct squashfs_fragment_entry_2 sfragment_entry; -+ -+ if (!squashfs_get_cached_block(s, (char *) &sfragment_entry, -+ start_block, offset, -+ sizeof(sfragment_entry), &start_block, -+ &offset)) -+ goto out; -+ SQUASHFS_SWAP_FRAGMENT_ENTRY_2(&fragment_entry, &sfragment_entry); -+ } else -+ if (!squashfs_get_cached_block(s, (char *) &fragment_entry, -+ start_block, offset, -+ sizeof(fragment_entry), &start_block, -+ &offset)) -+ goto out; -+ -+ *fragment_start_block = fragment_entry.start_block; -+ *fragment_size = fragment_entry.size; -+ -+ return 1; -+ -+out: -+ return 0; -+} -+ -+ -+static struct inode *squashfs_new_inode(struct super_block *s, -+ struct squashfs_base_inode_header_2 *inodeb, unsigned int ino) -+{ -+ struct squashfs_sb_info *msblk = s->s_fs_info; -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ struct inode *i = new_inode(s); -+ -+ if (i) { -+ i->i_ino = ino; -+ i->i_mtime.tv_sec = sblk->mkfs_time; -+ i->i_atime.tv_sec = sblk->mkfs_time; -+ i->i_ctime.tv_sec = sblk->mkfs_time; -+ i->i_uid = msblk->uid[inodeb->uid]; -+ i->i_mode = inodeb->mode; -+ i->i_nlink = 1; -+ i->i_size = 0; -+ if (inodeb->guid == SQUASHFS_GUIDS) -+ i->i_gid = i->i_uid; -+ else -+ i->i_gid = msblk->guid[inodeb->guid]; -+ } -+ -+ return i; -+} -+ -+ -+static struct inode *squashfs_iget_2(struct super_block *s, squashfs_inode_t inode) -+{ -+ struct inode *i; -+ struct squashfs_sb_info *msblk = s->s_fs_info; -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ unsigned int block = SQUASHFS_INODE_BLK(inode) + -+ sblk->inode_table_start; -+ unsigned int offset = SQUASHFS_INODE_OFFSET(inode); -+ unsigned int ino = SQUASHFS_MK_VFS_INODE(block -+ - sblk->inode_table_start, offset); -+ long long next_block; -+ unsigned int next_offset; -+ union squashfs_inode_header_2 id, sid; -+ struct squashfs_base_inode_header_2 *inodeb = &id.base, -+ *sinodeb = &sid.base; -+ -+ TRACE("Entered squashfs_iget\n"); -+ -+ if (msblk->swap) { -+ if (!squashfs_get_cached_block(s, (char *) sinodeb, block, -+ offset, sizeof(*sinodeb), &next_block, -+ &next_offset)) -+ goto failed_read; -+ SQUASHFS_SWAP_BASE_INODE_HEADER_2(inodeb, sinodeb, -+ sizeof(*sinodeb)); -+ } else -+ if (!squashfs_get_cached_block(s, (char *) inodeb, block, -+ offset, sizeof(*inodeb), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ switch(inodeb->inode_type) { -+ case SQUASHFS_FILE_TYPE: { -+ struct squashfs_reg_inode_header_2 *inodep = &id.reg; -+ struct squashfs_reg_inode_header_2 *sinodep = &sid.reg; -+ long long frag_blk; -+ unsigned int frag_size; -+ -+ if (msblk->swap) { -+ if (!squashfs_get_cached_block(s, (char *) -+ sinodep, block, offset, -+ sizeof(*sinodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ SQUASHFS_SWAP_REG_INODE_HEADER_2(inodep, sinodep); -+ } else -+ if (!squashfs_get_cached_block(s, (char *) -+ inodep, block, offset, -+ sizeof(*inodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ frag_blk = SQUASHFS_INVALID_BLK; -+ if (inodep->fragment != SQUASHFS_INVALID_FRAG && -+ !get_fragment_location_2(s, -+ inodep->fragment, &frag_blk, &frag_size)) -+ goto failed_read; -+ -+ if((i = squashfs_new_inode(s, inodeb, ino)) == NULL) -+ goto failed_read1; -+ -+ i->i_size = inodep->file_size; -+ i->i_fop = &generic_ro_fops; -+ i->i_mode |= S_IFREG; -+ i->i_mtime.tv_sec = inodep->mtime; -+ i->i_atime.tv_sec = inodep->mtime; -+ i->i_ctime.tv_sec = inodep->mtime; -+ i->i_blocks = ((i->i_size - 1) >> 9) + 1; -+ i->i_blksize = PAGE_CACHE_SIZE; -+ SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk; -+ SQUASHFS_I(i)->u.s1.fragment_size = frag_size; -+ SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset; -+ SQUASHFS_I(i)->start_block = inodep->start_block; -+ SQUASHFS_I(i)->u.s1.block_list_start = next_block; -+ SQUASHFS_I(i)->offset = next_offset; -+ if (sblk->block_size > 4096) -+ i->i_data.a_ops = &squashfs_aops; -+ else -+ i->i_data.a_ops = &squashfs_aops_4K; -+ -+ TRACE("File inode %x:%x, start_block %x, " -+ "block_list_start %llx, offset %x\n", -+ SQUASHFS_INODE_BLK(inode), offset, -+ inodep->start_block, next_block, -+ next_offset); -+ break; -+ } -+ case SQUASHFS_DIR_TYPE: { -+ struct squashfs_dir_inode_header_2 *inodep = &id.dir; -+ struct squashfs_dir_inode_header_2 *sinodep = &sid.dir; -+ -+ if (msblk->swap) { -+ if (!squashfs_get_cached_block(s, (char *) -+ sinodep, block, offset, -+ sizeof(*sinodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ SQUASHFS_SWAP_DIR_INODE_HEADER_2(inodep, sinodep); -+ } else -+ if (!squashfs_get_cached_block(s, (char *) -+ inodep, block, offset, -+ sizeof(*inodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ if((i = squashfs_new_inode(s, inodeb, ino)) == NULL) -+ goto failed_read1; -+ -+ i->i_size = inodep->file_size; -+ i->i_op = &squashfs_dir_inode_ops_2; -+ i->i_fop = &squashfs_dir_ops_2; -+ i->i_mode |= S_IFDIR; -+ i->i_mtime.tv_sec = inodep->mtime; -+ i->i_atime.tv_sec = inodep->mtime; -+ i->i_ctime.tv_sec = inodep->mtime; -+ SQUASHFS_I(i)->start_block = inodep->start_block; -+ SQUASHFS_I(i)->offset = inodep->offset; -+ SQUASHFS_I(i)->u.s2.directory_index_count = 0; -+ SQUASHFS_I(i)->u.s2.parent_inode = 0; -+ -+ TRACE("Directory inode %x:%x, start_block %x, offset " -+ "%x\n", SQUASHFS_INODE_BLK(inode), -+ offset, inodep->start_block, -+ inodep->offset); -+ break; -+ } -+ case SQUASHFS_LDIR_TYPE: { -+ struct squashfs_ldir_inode_header_2 *inodep = &id.ldir; -+ struct squashfs_ldir_inode_header_2 *sinodep = &sid.ldir; -+ -+ if (msblk->swap) { -+ if (!squashfs_get_cached_block(s, (char *) -+ sinodep, block, offset, -+ sizeof(*sinodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ SQUASHFS_SWAP_LDIR_INODE_HEADER_2(inodep, -+ sinodep); -+ } else -+ if (!squashfs_get_cached_block(s, (char *) -+ inodep, block, offset, -+ sizeof(*inodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ if((i = squashfs_new_inode(s, inodeb, ino)) == NULL) -+ goto failed_read1; -+ -+ i->i_size = inodep->file_size; -+ i->i_op = &squashfs_dir_inode_ops_2; -+ i->i_fop = &squashfs_dir_ops_2; -+ i->i_mode |= S_IFDIR; -+ i->i_mtime.tv_sec = inodep->mtime; -+ i->i_atime.tv_sec = inodep->mtime; -+ i->i_ctime.tv_sec = inodep->mtime; -+ SQUASHFS_I(i)->start_block = inodep->start_block; -+ SQUASHFS_I(i)->offset = inodep->offset; -+ SQUASHFS_I(i)->u.s2.directory_index_start = next_block; -+ SQUASHFS_I(i)->u.s2.directory_index_offset = -+ next_offset; -+ SQUASHFS_I(i)->u.s2.directory_index_count = -+ inodep->i_count; -+ SQUASHFS_I(i)->u.s2.parent_inode = 0; -+ -+ TRACE("Long directory inode %x:%x, start_block %x, " -+ "offset %x\n", -+ SQUASHFS_INODE_BLK(inode), offset, -+ inodep->start_block, inodep->offset); -+ break; -+ } -+ case SQUASHFS_SYMLINK_TYPE: { -+ struct squashfs_symlink_inode_header_2 *inodep = -+ &id.symlink; -+ struct squashfs_symlink_inode_header_2 *sinodep = -+ &sid.symlink; -+ -+ if (msblk->swap) { -+ if (!squashfs_get_cached_block(s, (char *) -+ sinodep, block, offset, -+ sizeof(*sinodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ SQUASHFS_SWAP_SYMLINK_INODE_HEADER_2(inodep, -+ sinodep); -+ } else -+ if (!squashfs_get_cached_block(s, (char *) -+ inodep, block, offset, -+ sizeof(*inodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ if((i = squashfs_new_inode(s, inodeb, ino)) == NULL) -+ goto failed_read1; -+ -+ i->i_size = inodep->symlink_size; -+ i->i_op = &page_symlink_inode_operations; -+ i->i_data.a_ops = &squashfs_symlink_aops; -+ i->i_mode |= S_IFLNK; -+ SQUASHFS_I(i)->start_block = next_block; -+ SQUASHFS_I(i)->offset = next_offset; -+ -+ TRACE("Symbolic link inode %x:%x, start_block %llx, " -+ "offset %x\n", -+ SQUASHFS_INODE_BLK(inode), offset, -+ next_block, next_offset); -+ break; -+ } -+ case SQUASHFS_BLKDEV_TYPE: -+ case SQUASHFS_CHRDEV_TYPE: { -+ struct squashfs_dev_inode_header_2 *inodep = &id.dev; -+ struct squashfs_dev_inode_header_2 *sinodep = &sid.dev; -+ -+ if (msblk->swap) { -+ if (!squashfs_get_cached_block(s, (char *) -+ sinodep, block, offset, -+ sizeof(*sinodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ SQUASHFS_SWAP_DEV_INODE_HEADER_2(inodep, sinodep); -+ } else -+ if (!squashfs_get_cached_block(s, (char *) -+ inodep, block, offset, -+ sizeof(*inodep), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ if ((i = squashfs_new_inode(s, inodeb, ino)) == NULL) -+ goto failed_read1; -+ -+ i->i_mode |= (inodeb->inode_type == -+ SQUASHFS_CHRDEV_TYPE) ? S_IFCHR : -+ S_IFBLK; -+ init_special_inode(i, i->i_mode, -+ old_decode_dev(inodep->rdev)); -+ -+ TRACE("Device inode %x:%x, rdev %x\n", -+ SQUASHFS_INODE_BLK(inode), offset, -+ inodep->rdev); -+ break; -+ } -+ case SQUASHFS_FIFO_TYPE: -+ case SQUASHFS_SOCKET_TYPE: { -+ if ((i = squashfs_new_inode(s, inodeb, ino)) == NULL) -+ goto failed_read1; -+ -+ i->i_mode |= (inodeb->inode_type == SQUASHFS_FIFO_TYPE) -+ ? S_IFIFO : S_IFSOCK; -+ init_special_inode(i, i->i_mode, 0); -+ break; -+ } -+ default: -+ ERROR("Unknown inode type %d in squashfs_iget!\n", -+ inodeb->inode_type); -+ goto failed_read1; -+ } -+ -+ insert_inode_hash(i); -+ return i; -+ -+failed_read: -+ ERROR("Unable to read inode [%x:%x]\n", block, offset); -+ -+failed_read1: -+ return NULL; -+} -+ -+ -+static int get_dir_index_using_offset(struct super_block *s, long long -+ *next_block, unsigned int *next_offset, -+ long long index_start, -+ unsigned int index_offset, int i_count, -+ long long f_pos) -+{ -+ struct squashfs_sb_info *msblk = s->s_fs_info; -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ int i, length = 0; -+ struct squashfs_dir_index_2 index; -+ -+ TRACE("Entered get_dir_index_using_offset, i_count %d, f_pos %d\n", -+ i_count, (unsigned int) f_pos); -+ -+ if (f_pos == 0) -+ goto finish; -+ -+ for (i = 0; i < i_count; i++) { -+ if (msblk->swap) { -+ struct squashfs_dir_index_2 sindex; -+ squashfs_get_cached_block(s, (char *) &sindex, -+ index_start, index_offset, -+ sizeof(sindex), &index_start, -+ &index_offset); -+ SQUASHFS_SWAP_DIR_INDEX_2(&index, &sindex); -+ } else -+ squashfs_get_cached_block(s, (char *) &index, -+ index_start, index_offset, -+ sizeof(index), &index_start, -+ &index_offset); -+ -+ if (index.index > f_pos) -+ break; -+ -+ squashfs_get_cached_block(s, NULL, index_start, index_offset, -+ index.size + 1, &index_start, -+ &index_offset); -+ -+ length = index.index; -+ *next_block = index.start_block + sblk->directory_table_start; -+ } -+ -+ *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE; -+ -+finish: -+ return length; -+} -+ -+ -+static int get_dir_index_using_name(struct super_block *s, long long -+ *next_block, unsigned int *next_offset, -+ long long index_start, -+ unsigned int index_offset, int i_count, -+ const char *name, int size) -+{ -+ struct squashfs_sb_info *msblk = s->s_fs_info; -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ int i, length = 0; -+ char buffer[sizeof(struct squashfs_dir_index_2) + SQUASHFS_NAME_LEN + 1]; -+ struct squashfs_dir_index_2 *index = (struct squashfs_dir_index_2 *) buffer; -+ char str[SQUASHFS_NAME_LEN + 1]; -+ -+ TRACE("Entered get_dir_index_using_name, i_count %d\n", i_count); -+ -+ strncpy(str, name, size); -+ str[size] = '\0'; -+ -+ for (i = 0; i < i_count; i++) { -+ if (msblk->swap) { -+ struct squashfs_dir_index_2 sindex; -+ squashfs_get_cached_block(s, (char *) &sindex, -+ index_start, index_offset, -+ sizeof(sindex), &index_start, -+ &index_offset); -+ SQUASHFS_SWAP_DIR_INDEX_2(index, &sindex); -+ } else -+ squashfs_get_cached_block(s, (char *) index, -+ index_start, index_offset, -+ sizeof(struct squashfs_dir_index_2), -+ &index_start, &index_offset); -+ -+ squashfs_get_cached_block(s, index->name, index_start, -+ index_offset, index->size + 1, -+ &index_start, &index_offset); -+ -+ index->name[index->size + 1] = '\0'; -+ -+ if (strcmp(index->name, str) > 0) -+ break; -+ -+ length = index->index; -+ *next_block = index->start_block + sblk->directory_table_start; -+ } -+ -+ *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE; -+ return length; -+} -+ -+ -+static int squashfs_readdir_2(struct file *file, void *dirent, filldir_t filldir) -+{ -+ struct inode *i = file->f_dentry->d_inode; -+ struct squashfs_sb_info *msblk = i->i_sb->s_fs_info; -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ long long next_block = SQUASHFS_I(i)->start_block + -+ sblk->directory_table_start; -+ int next_offset = SQUASHFS_I(i)->offset, length = 0, dirs_read = 0, -+ dir_count; -+ struct squashfs_dir_header_2 dirh; -+ char buffer[sizeof(struct squashfs_dir_entry_2) + SQUASHFS_NAME_LEN + 1]; -+ struct squashfs_dir_entry_2 *dire = (struct squashfs_dir_entry_2 *) buffer; -+ -+ TRACE("Entered squashfs_readdir_2 [%llx:%x]\n", next_block, next_offset); -+ -+ length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset, -+ SQUASHFS_I(i)->u.s2.directory_index_start, -+ SQUASHFS_I(i)->u.s2.directory_index_offset, -+ SQUASHFS_I(i)->u.s2.directory_index_count, -+ file->f_pos); -+ -+ while (length < i_size_read(i)) { -+ /* read directory header */ -+ if (msblk->swap) { -+ struct squashfs_dir_header_2 sdirh; -+ -+ if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh, -+ next_block, next_offset, sizeof(sdirh), -+ &next_block, &next_offset)) -+ goto failed_read; -+ -+ length += sizeof(sdirh); -+ SQUASHFS_SWAP_DIR_HEADER_2(&dirh, &sdirh); -+ } else { -+ if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh, -+ next_block, next_offset, sizeof(dirh), -+ &next_block, &next_offset)) -+ goto failed_read; -+ -+ length += sizeof(dirh); -+ } -+ -+ dir_count = dirh.count + 1; -+ while (dir_count--) { -+ if (msblk->swap) { -+ struct squashfs_dir_entry_2 sdire; -+ if (!squashfs_get_cached_block(i->i_sb, (char *) -+ &sdire, next_block, next_offset, -+ sizeof(sdire), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ length += sizeof(sdire); -+ SQUASHFS_SWAP_DIR_ENTRY_2(dire, &sdire); -+ } else { -+ if (!squashfs_get_cached_block(i->i_sb, (char *) -+ dire, next_block, next_offset, -+ sizeof(*dire), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ length += sizeof(*dire); -+ } -+ -+ if (!squashfs_get_cached_block(i->i_sb, dire->name, -+ next_block, next_offset, -+ dire->size + 1, &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ length += dire->size + 1; -+ -+ if (file->f_pos >= length) -+ continue; -+ -+ dire->name[dire->size + 1] = '\0'; -+ -+ TRACE("Calling filldir(%x, %s, %d, %d, %x:%x, %d)\n", -+ (unsigned int) dirent, dire->name, -+ dire->size + 1, (int) file->f_pos, -+ dirh.start_block, dire->offset, -+ squashfs_filetype_table[dire->type]); -+ -+ if (filldir(dirent, dire->name, dire->size + 1, -+ file->f_pos, SQUASHFS_MK_VFS_INODE( -+ dirh.start_block, dire->offset), -+ squashfs_filetype_table[dire->type]) -+ < 0) { -+ TRACE("Filldir returned less than 0\n"); -+ goto finish; -+ } -+ file->f_pos = length; -+ dirs_read++; -+ } -+ } -+ -+finish: -+ return dirs_read; -+ -+failed_read: -+ ERROR("Unable to read directory block [%llx:%x]\n", next_block, -+ next_offset); -+ return 0; -+} -+ -+ -+static struct dentry *squashfs_lookup_2(struct inode *i, struct dentry *dentry, -+ struct nameidata *nd) -+{ -+ const unsigned char *name = dentry->d_name.name; -+ int len = dentry->d_name.len; -+ struct inode *inode = NULL; -+ struct squashfs_sb_info *msblk = i->i_sb->s_fs_info; -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ long long next_block = SQUASHFS_I(i)->start_block + -+ sblk->directory_table_start; -+ int next_offset = SQUASHFS_I(i)->offset, length = 0, -+ dir_count; -+ struct squashfs_dir_header_2 dirh; -+ char buffer[sizeof(struct squashfs_dir_entry_2) + SQUASHFS_NAME_LEN]; -+ struct squashfs_dir_entry_2 *dire = (struct squashfs_dir_entry_2 *) buffer; -+ int sorted = sblk->s_major == 2 && sblk->s_minor >= 1; -+ -+ TRACE("Entered squashfs_lookup [%llx:%x]\n", next_block, next_offset); -+ -+ if (len > SQUASHFS_NAME_LEN) -+ goto exit_loop; -+ -+ length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset, -+ SQUASHFS_I(i)->u.s2.directory_index_start, -+ SQUASHFS_I(i)->u.s2.directory_index_offset, -+ SQUASHFS_I(i)->u.s2.directory_index_count, name, -+ len); -+ -+ while (length < i_size_read(i)) { -+ /* read directory header */ -+ if (msblk->swap) { -+ struct squashfs_dir_header_2 sdirh; -+ if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh, -+ next_block, next_offset, sizeof(sdirh), -+ &next_block, &next_offset)) -+ goto failed_read; -+ -+ length += sizeof(sdirh); -+ SQUASHFS_SWAP_DIR_HEADER_2(&dirh, &sdirh); -+ } else { -+ if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh, -+ next_block, next_offset, sizeof(dirh), -+ &next_block, &next_offset)) -+ goto failed_read; -+ -+ length += sizeof(dirh); -+ } -+ -+ dir_count = dirh.count + 1; -+ while (dir_count--) { -+ if (msblk->swap) { -+ struct squashfs_dir_entry_2 sdire; -+ if (!squashfs_get_cached_block(i->i_sb, (char *) -+ &sdire, next_block,next_offset, -+ sizeof(sdire), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ length += sizeof(sdire); -+ SQUASHFS_SWAP_DIR_ENTRY_2(dire, &sdire); -+ } else { -+ if (!squashfs_get_cached_block(i->i_sb, (char *) -+ dire, next_block,next_offset, -+ sizeof(*dire), &next_block, -+ &next_offset)) -+ goto failed_read; -+ -+ length += sizeof(*dire); -+ } -+ -+ if (!squashfs_get_cached_block(i->i_sb, dire->name, -+ next_block, next_offset, dire->size + 1, -+ &next_block, &next_offset)) -+ goto failed_read; -+ -+ length += dire->size + 1; -+ -+ if (sorted && name[0] < dire->name[0]) -+ goto exit_loop; -+ -+ if ((len == dire->size + 1) && !strncmp(name, -+ dire->name, len)) { -+ squashfs_inode_t ino = -+ SQUASHFS_MKINODE(dirh.start_block, -+ dire->offset); -+ -+ TRACE("calling squashfs_iget for directory " -+ "entry %s, inode %x:%x, %lld\n", name, -+ dirh.start_block, dire->offset, ino); -+ -+ inode = (msblk->iget)(i->i_sb, ino); -+ -+ goto exit_loop; -+ } -+ } -+ } -+ -+exit_loop: -+ d_add(dentry, inode); -+ return ERR_PTR(0); -+ -+failed_read: -+ ERROR("Unable to read directory block [%llx:%x]\n", next_block, -+ next_offset); -+ goto exit_loop; -+} -+ -+ -+int squashfs_2_0_supported(struct squashfs_sb_info *msblk) -+{ -+ struct squashfs_super_block *sblk = &msblk->sblk; -+ -+ msblk->iget = squashfs_iget_2; -+ msblk->read_fragment_index_table = read_fragment_index_table_2; -+ -+ sblk->bytes_used = sblk->bytes_used_2; -+ sblk->uid_start = sblk->uid_start_2; -+ sblk->guid_start = sblk->guid_start_2; -+ sblk->inode_table_start = sblk->inode_table_start_2; -+ sblk->directory_table_start = sblk->directory_table_start_2; -+ sblk->fragment_table_start = sblk->fragment_table_start_2; -+ -+ return 1; -+} ---- /dev/null -+++ b/fs/squashfs/squashfs.h -@@ -0,0 +1,86 @@ -+/* -+ * Squashfs - a compressed read only filesystem for Linux -+ * -+ * Copyright (c) 2002, 2003, 2004, 2005, 2006 -+ * Phillip Lougher -+ * -+ * 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, -+ * 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -+ * -+ * squashfs.h -+ */ -+ -+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY -+#undef CONFIG_SQUASHFS_1_0_COMPATIBILITY -+#endif -+ -+#ifdef SQUASHFS_TRACE -+#define TRACE(s, args...) printk(KERN_NOTICE "SQUASHFS: "s, ## args) -+#else -+#define TRACE(s, args...) {} -+#endif -+ -+#define ERROR(s, args...) printk(KERN_ERR "SQUASHFS error: "s, ## args) -+ -+#define SERROR(s, args...) do { \ -+ if (!silent) \ -+ printk(KERN_ERR "SQUASHFS error: "s, ## args);\ -+ } while(0) -+ -+#define WARNING(s, args...) printk(KERN_WARNING "SQUASHFS: "s, ## args) -+ -+static inline struct squashfs_inode_info *SQUASHFS_I(struct inode *inode) -+{ -+ return list_entry(inode, struct squashfs_inode_info, vfs_inode); -+} -+ -+#if defined(CONFIG_SQUASHFS_1_0_COMPATIBILITY ) || defined(CONFIG_SQUASHFS_2_0_COMPATIBILITY) -+#define SQSH_EXTERN -+extern unsigned int squashfs_read_data(struct super_block *s, char *buffer, -+ long long index, unsigned int length, -+ long long *next_index); -+extern int squashfs_get_cached_block(struct super_block *s, char *buffer, -+ long long block, unsigned int offset, -+ int length, long long *next_block, -+ unsigned int *next_offset); -+extern void release_cached_fragment(struct squashfs_sb_info *msblk, struct -+ squashfs_fragment_cache *fragment); -+extern struct squashfs_fragment_cache *get_cached_fragment(struct super_block -+ *s, long long start_block, -+ int length); -+extern struct address_space_operations squashfs_symlink_aops; -+extern struct address_space_operations squashfs_aops; -+extern struct address_space_operations squashfs_aops_4K; -+extern struct inode_operations squashfs_dir_inode_ops; -+#else -+#define SQSH_EXTERN static -+#endif -+ -+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY -+extern int squashfs_1_0_supported(struct squashfs_sb_info *msblk); -+#else -+static inline int squashfs_1_0_supported(struct squashfs_sb_info *msblk) -+{ -+ return 0; -+} -+#endif -+ -+#ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY -+extern int squashfs_2_0_supported(struct squashfs_sb_info *msblk); -+#else -+static inline int squashfs_2_0_supported(struct squashfs_sb_info *msblk) -+{ -+ return 0; -+} -+#endif ---- /dev/null -+++ b/include/linux/squashfs_fs.h -@@ -0,0 +1,911 @@ -+#ifndef SQUASHFS_FS -+#define SQUASHFS_FS -+ -+/* -+ * Squashfs -+ * -+ * Copyright (c) 2002, 2003, 2004, 2005, 2006 -+ * Phillip Lougher -+ * -+ * 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, -+ * 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -+ * -+ * squashfs_fs.h -+ */ -+ -+#ifndef CONFIG_SQUASHFS_2_0_COMPATIBILITY -+#define CONFIG_SQUASHFS_2_0_COMPATIBILITY -+#endif -+ -+#ifdef CONFIG_SQUASHFS_VMALLOC -+#define SQUASHFS_ALLOC(a) vmalloc(a) -+#define SQUASHFS_FREE(a) vfree(a) -+#else -+#define SQUASHFS_ALLOC(a) kmalloc(a, GFP_KERNEL) -+#define SQUASHFS_FREE(a) kfree(a) -+#endif -+#define SQUASHFS_CACHED_FRAGMENTS CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE -+#define SQUASHFS_MAJOR 3 -+#define SQUASHFS_MINOR 0 -+#define SQUASHFS_MAGIC 0x73717368 -+#define SQUASHFS_MAGIC_SWAP 0x68737173 -+#define SQUASHFS_START 0 -+ -+/* size of metadata (inode and directory) blocks */ -+#define SQUASHFS_METADATA_SIZE 8192 -+#define SQUASHFS_METADATA_LOG 13 -+ -+/* default size of data blocks */ -+#define SQUASHFS_FILE_SIZE 65536 -+#define SQUASHFS_FILE_LOG 16 -+ -+#define SQUASHFS_FILE_MAX_SIZE 65536 -+ -+/* Max number of uids and gids */ -+#define SQUASHFS_UIDS 256 -+#define SQUASHFS_GUIDS 255 -+ -+/* Max length of filename (not 255) */ -+#define SQUASHFS_NAME_LEN 256 -+ -+#define SQUASHFS_INVALID ((long long) 0xffffffffffff) -+#define SQUASHFS_INVALID_FRAG ((unsigned int) 0xffffffff) -+#define SQUASHFS_INVALID_BLK ((long long) -1) -+#define SQUASHFS_USED_BLK ((long long) -2) -+ -+/* Filesystem flags */ -+#define SQUASHFS_NOI 0 -+#define SQUASHFS_NOD 1 -+#define SQUASHFS_CHECK 2 -+#define SQUASHFS_NOF 3 -+#define SQUASHFS_NO_FRAG 4 -+#define SQUASHFS_ALWAYS_FRAG 5 -+#define SQUASHFS_DUPLICATE 6 -+ -+#define SQUASHFS_BIT(flag, bit) ((flag >> bit) & 1) -+ -+#define SQUASHFS_UNCOMPRESSED_INODES(flags) SQUASHFS_BIT(flags, \ -+ SQUASHFS_NOI) -+ -+#define SQUASHFS_UNCOMPRESSED_DATA(flags) SQUASHFS_BIT(flags, \ -+ SQUASHFS_NOD) -+ -+#define SQUASHFS_UNCOMPRESSED_FRAGMENTS(flags) SQUASHFS_BIT(flags, \ -+ SQUASHFS_NOF) -+ -+#define SQUASHFS_NO_FRAGMENTS(flags) SQUASHFS_BIT(flags, \ -+ SQUASHFS_NO_FRAG) -+ -+#define SQUASHFS_ALWAYS_FRAGMENTS(flags) SQUASHFS_BIT(flags, \ -+ SQUASHFS_ALWAYS_FRAG) -+ -+#define SQUASHFS_DUPLICATES(flags) SQUASHFS_BIT(flags, \ -+ SQUASHFS_DUPLICATE) -+ -+#define SQUASHFS_CHECK_DATA(flags) SQUASHFS_BIT(flags, \ -+ SQUASHFS_CHECK) -+ -+#define SQUASHFS_MKFLAGS(noi, nod, check_data, nof, no_frag, always_frag, \ -+ duplicate_checking) (noi | (nod << 1) | (check_data << 2) \ -+ | (nof << 3) | (no_frag << 4) | (always_frag << 5) | \ -+ (duplicate_checking << 6)) -+ -+/* Max number of types and file types */ -+#define SQUASHFS_DIR_TYPE 1 -+#define SQUASHFS_FILE_TYPE 2 -+#define SQUASHFS_SYMLINK_TYPE 3 -+#define SQUASHFS_BLKDEV_TYPE 4 -+#define SQUASHFS_CHRDEV_TYPE 5 -+#define SQUASHFS_FIFO_TYPE 6 -+#define SQUASHFS_SOCKET_TYPE 7 -+#define SQUASHFS_LDIR_TYPE 8 -+#define SQUASHFS_LREG_TYPE 9 -+ -+/* 1.0 filesystem type definitions */ -+#define SQUASHFS_TYPES 5 -+#define SQUASHFS_IPC_TYPE 0 -+ -+/* Flag whether block is compressed or uncompressed, bit is set if block is -+ * uncompressed */ -+#define SQUASHFS_COMPRESSED_BIT (1 << 15) -+ -+#define SQUASHFS_COMPRESSED_SIZE(B) (((B) & ~SQUASHFS_COMPRESSED_BIT) ? \ -+ (B) & ~SQUASHFS_COMPRESSED_BIT : SQUASHFS_COMPRESSED_BIT) -+ -+#define SQUASHFS_COMPRESSED(B) (!((B) & SQUASHFS_COMPRESSED_BIT)) -+ -+#define SQUASHFS_COMPRESSED_BIT_BLOCK (1 << 24) -+ -+#define SQUASHFS_COMPRESSED_SIZE_BLOCK(B) (((B) & \ -+ ~SQUASHFS_COMPRESSED_BIT_BLOCK) ? (B) & \ -+ ~SQUASHFS_COMPRESSED_BIT_BLOCK : SQUASHFS_COMPRESSED_BIT_BLOCK) -+ -+#define SQUASHFS_COMPRESSED_BLOCK(B) (!((B) & SQUASHFS_COMPRESSED_BIT_BLOCK)) -+ -+/* -+ * Inode number ops. Inodes consist of a compressed block number, and an -+ * uncompressed offset within that block -+ */ -+#define SQUASHFS_INODE_BLK(a) ((unsigned int) ((a) >> 16)) -+ -+#define SQUASHFS_INODE_OFFSET(a) ((unsigned int) ((a) & 0xffff)) -+ -+#define SQUASHFS_MKINODE(A, B) ((squashfs_inode_t)(((squashfs_inode_t) (A)\ -+ << 16) + (B))) -+ -+/* Compute 32 bit VFS inode number from squashfs inode number */ -+#define SQUASHFS_MK_VFS_INODE(a, b) ((unsigned int) (((a) << 8) + \ -+ ((b) >> 2) + 1)) -+/* XXX */ -+ -+/* Translate between VFS mode and squashfs mode */ -+#define SQUASHFS_MODE(a) ((a) & 0xfff) -+ -+/* fragment and fragment table defines */ -+#define SQUASHFS_FRAGMENT_BYTES(A) (A * sizeof(struct squashfs_fragment_entry)) -+ -+#define SQUASHFS_FRAGMENT_INDEX(A) (SQUASHFS_FRAGMENT_BYTES(A) / \ -+ SQUASHFS_METADATA_SIZE) -+ -+#define SQUASHFS_FRAGMENT_INDEX_OFFSET(A) (SQUASHFS_FRAGMENT_BYTES(A) % \ -+ SQUASHFS_METADATA_SIZE) -+ -+#define SQUASHFS_FRAGMENT_INDEXES(A) ((SQUASHFS_FRAGMENT_BYTES(A) + \ -+ SQUASHFS_METADATA_SIZE - 1) / \ -+ SQUASHFS_METADATA_SIZE) -+ -+#define SQUASHFS_FRAGMENT_INDEX_BYTES(A) (SQUASHFS_FRAGMENT_INDEXES(A) *\ -+ sizeof(long long)) -+ -+/* cached data constants for filesystem */ -+#define SQUASHFS_CACHED_BLKS 8 -+ -+#define SQUASHFS_MAX_FILE_SIZE_LOG 64 -+ -+#define SQUASHFS_MAX_FILE_SIZE ((long long) 1 << \ -+ (SQUASHFS_MAX_FILE_SIZE_LOG - 2)) -+ -+#define SQUASHFS_MARKER_BYTE 0xff -+ -+/* meta index cache */ -+#define SQUASHFS_META_INDEXES (SQUASHFS_METADATA_SIZE / sizeof(unsigned int)) -+#define SQUASHFS_META_ENTRIES 31 -+#define SQUASHFS_META_NUMBER 8 -+#define SQUASHFS_SLOTS 4 -+ -+struct meta_entry { -+ long long data_block; -+ unsigned int index_block; -+ unsigned short offset; -+ unsigned short pad; -+}; -+ -+struct meta_index { -+ unsigned int inode_number; -+ unsigned int offset; -+ unsigned short entries; -+ unsigned short skip; -+ unsigned short locked; -+ unsigned short pad; -+ struct meta_entry meta_entry[SQUASHFS_META_ENTRIES]; -+}; -+ -+ -+/* -+ * definitions for structures on disk -+ */ -+ -+typedef long long squashfs_block_t; -+typedef long long squashfs_inode_t; -+ -+struct squashfs_super_block { -+ unsigned int s_magic; -+ unsigned int inodes; -+ unsigned int bytes_used_2; -+ unsigned int uid_start_2; -+ unsigned int guid_start_2; -+ unsigned int inode_table_start_2; -+ unsigned int directory_table_start_2; -+ unsigned int s_major:16; -+ unsigned int s_minor:16; -+ unsigned int block_size_1:16; -+ unsigned int block_log:16; -+ unsigned int flags:8; -+ unsigned int no_uids:8; -+ unsigned int no_guids:8; -+ unsigned int mkfs_time /* time of filesystem creation */; -+ squashfs_inode_t root_inode; -+ unsigned int block_size; -+ unsigned int fragments; -+ unsigned int fragment_table_start_2; -+ long long bytes_used; -+ long long uid_start; -+ long long guid_start; -+ long long inode_table_start; -+ long long directory_table_start; -+ long long fragment_table_start; -+ long long unused; -+} __attribute__ ((packed)); -+ -+struct squashfs_dir_index { -+ unsigned int index; -+ unsigned int start_block; -+ unsigned char size; -+ unsigned char name[0]; -+} __attribute__ ((packed)); -+ -+#define SQUASHFS_BASE_INODE_HEADER \ -+ unsigned int inode_type:4; \ -+ unsigned int mode:12; \ -+ unsigned int uid:8; \ -+ unsigned int guid:8; \ -+ unsigned int mtime; \ -+ unsigned int inode_number; -+ -+struct squashfs_base_inode_header { -+ SQUASHFS_BASE_INODE_HEADER; -+} __attribute__ ((packed)); -+ -+struct squashfs_ipc_inode_header { -+ SQUASHFS_BASE_INODE_HEADER; -+ unsigned int nlink; -+} __attribute__ ((packed)); -+ -+struct squashfs_dev_inode_header { -+ SQUASHFS_BASE_INODE_HEADER; -+ unsigned int nlink; -+ unsigned short rdev; -+} __attribute__ ((packed)); -+ -+struct squashfs_symlink_inode_header { -+ SQUASHFS_BASE_INODE_HEADER; -+ unsigned int nlink; -+ unsigned short symlink_size; -+ char symlink[0]; -+} __attribute__ ((packed)); -+ -+struct squashfs_reg_inode_header { -+ SQUASHFS_BASE_INODE_HEADER; -+ squashfs_block_t start_block; -+ unsigned int fragment; -+ unsigned int offset; -+ unsigned int file_size; -+ unsigned short block_list[0]; -+} __attribute__ ((packed)); -+ -+struct squashfs_lreg_inode_header { -+ SQUASHFS_BASE_INODE_HEADER; -+ unsigned int nlink; -+ squashfs_block_t start_block; -+ unsigned int fragment; -+ unsigned int offset; -+ long long file_size; -+ unsigned short block_list[0]; -+} __attribute__ ((packed)); -+ -+struct squashfs_dir_inode_header { -+ SQUASHFS_BASE_INODE_HEADER; -+ unsigned int nlink; -+ unsigned int file_size:19; -+ unsigned int offset:13; -+ unsigned int start_block; -+ unsigned int parent_inode; -+} __attribute__ ((packed)); -+ -+struct squashfs_ldir_inode_header { -+ SQUASHFS_BASE_INODE_HEADER; -+ unsigned int nlink; -+ unsigned int file_size:27; -+ unsigned int offset:13; -+ unsigned int start_block; -+ unsigned int i_count:16; -+ unsigned int parent_inode; -+ struct squashfs_dir_index index[0]; -+} __attribute__ ((packed)); -+ -+union squashfs_inode_header { -+ struct squashfs_base_inode_header base; -+ struct squashfs_dev_inode_header dev; -+ struct squashfs_symlink_inode_header symlink; -+ struct squashfs_reg_inode_header reg; -+ struct squashfs_lreg_inode_header lreg; -+ struct squashfs_dir_inode_header dir; -+ struct squashfs_ldir_inode_header ldir; -+ struct squashfs_ipc_inode_header ipc; -+}; -+ -+struct squashfs_dir_entry { -+ unsigned int offset:13; -+ unsigned int type:3; -+ unsigned int size:8; -+ int inode_number:16; -+ char name[0]; -+} __attribute__ ((packed)); -+ -+struct squashfs_dir_header { -+ unsigned int count:8; -+ unsigned int start_block; -+ unsigned int inode_number; -+} __attribute__ ((packed)); -+ -+struct squashfs_fragment_entry { -+ long long start_block; -+ unsigned int size; -+ unsigned int unused; -+} __attribute__ ((packed)); -+ -+extern int squashfs_uncompress_block(void *d, int dstlen, void *s, int srclen); -+extern int squashfs_uncompress_init(void); -+extern int squashfs_uncompress_exit(void); -+ -+/* -+ * macros to convert each packed bitfield structure from little endian to big -+ * endian and vice versa. These are needed when creating or using a filesystem -+ * on a machine with different byte ordering to the target architecture. -+ * -+ */ -+ -+#define SQUASHFS_SWAP_START \ -+ int bits;\ -+ int b_pos;\ -+ unsigned long long val;\ -+ unsigned char *s;\ -+ unsigned char *d; -+ -+#define SQUASHFS_SWAP_SUPER_BLOCK(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_super_block));\ -+ SQUASHFS_SWAP((s)->s_magic, d, 0, 32);\ -+ SQUASHFS_SWAP((s)->inodes, d, 32, 32);\ -+ SQUASHFS_SWAP((s)->bytes_used_2, d, 64, 32);\ -+ SQUASHFS_SWAP((s)->uid_start_2, d, 96, 32);\ -+ SQUASHFS_SWAP((s)->guid_start_2, d, 128, 32);\ -+ SQUASHFS_SWAP((s)->inode_table_start_2, d, 160, 32);\ -+ SQUASHFS_SWAP((s)->directory_table_start_2, d, 192, 32);\ -+ SQUASHFS_SWAP((s)->s_major, d, 224, 16);\ -+ SQUASHFS_SWAP((s)->s_minor, d, 240, 16);\ -+ SQUASHFS_SWAP((s)->block_size_1, d, 256, 16);\ -+ SQUASHFS_SWAP((s)->block_log, d, 272, 16);\ -+ SQUASHFS_SWAP((s)->flags, d, 288, 8);\ -+ SQUASHFS_SWAP((s)->no_uids, d, 296, 8);\ -+ SQUASHFS_SWAP((s)->no_guids, d, 304, 8);\ -+ SQUASHFS_SWAP((s)->mkfs_time, d, 312, 32);\ -+ SQUASHFS_SWAP((s)->root_inode, d, 344, 64);\ -+ SQUASHFS_SWAP((s)->block_size, d, 408, 32);\ -+ SQUASHFS_SWAP((s)->fragments, d, 440, 32);\ -+ SQUASHFS_SWAP((s)->fragment_table_start_2, d, 472, 32);\ -+ SQUASHFS_SWAP((s)->bytes_used, d, 504, 64);\ -+ SQUASHFS_SWAP((s)->uid_start, d, 568, 64);\ -+ SQUASHFS_SWAP((s)->guid_start, d, 632, 64);\ -+ SQUASHFS_SWAP((s)->inode_table_start, d, 696, 64);\ -+ SQUASHFS_SWAP((s)->directory_table_start, d, 760, 64);\ -+ SQUASHFS_SWAP((s)->fragment_table_start, d, 824, 64);\ -+ SQUASHFS_SWAP((s)->unused, d, 888, 64);\ -+} -+ -+#define SQUASHFS_SWAP_BASE_INODE_CORE(s, d, n)\ -+ SQUASHFS_MEMSET(s, d, n);\ -+ SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\ -+ SQUASHFS_SWAP((s)->mode, d, 4, 12);\ -+ SQUASHFS_SWAP((s)->uid, d, 16, 8);\ -+ SQUASHFS_SWAP((s)->guid, d, 24, 8);\ -+ SQUASHFS_SWAP((s)->mtime, d, 32, 32);\ -+ SQUASHFS_SWAP((s)->inode_number, d, 64, 32); -+ -+#define SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, n) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE(s, d, n)\ -+} -+ -+#define SQUASHFS_SWAP_IPC_INODE_HEADER(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ -+ sizeof(struct squashfs_ipc_inode_header))\ -+ SQUASHFS_SWAP((s)->nlink, d, 96, 32);\ -+} -+ -+#define SQUASHFS_SWAP_DEV_INODE_HEADER(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ -+ sizeof(struct squashfs_dev_inode_header)); \ -+ SQUASHFS_SWAP((s)->nlink, d, 96, 32);\ -+ SQUASHFS_SWAP((s)->rdev, d, 128, 16);\ -+} -+ -+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ -+ sizeof(struct squashfs_symlink_inode_header));\ -+ SQUASHFS_SWAP((s)->nlink, d, 96, 32);\ -+ SQUASHFS_SWAP((s)->symlink_size, d, 128, 16);\ -+} -+ -+#define SQUASHFS_SWAP_REG_INODE_HEADER(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ -+ sizeof(struct squashfs_reg_inode_header));\ -+ SQUASHFS_SWAP((s)->start_block, d, 96, 64);\ -+ SQUASHFS_SWAP((s)->fragment, d, 160, 32);\ -+ SQUASHFS_SWAP((s)->offset, d, 192, 32);\ -+ SQUASHFS_SWAP((s)->file_size, d, 224, 32);\ -+} -+ -+#define SQUASHFS_SWAP_LREG_INODE_HEADER(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ -+ sizeof(struct squashfs_lreg_inode_header));\ -+ SQUASHFS_SWAP((s)->nlink, d, 96, 32);\ -+ SQUASHFS_SWAP((s)->start_block, d, 128, 64);\ -+ SQUASHFS_SWAP((s)->fragment, d, 192, 32);\ -+ SQUASHFS_SWAP((s)->offset, d, 224, 32);\ -+ SQUASHFS_SWAP((s)->file_size, d, 256, 64);\ -+} -+ -+#define SQUASHFS_SWAP_DIR_INODE_HEADER(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ -+ sizeof(struct squashfs_dir_inode_header));\ -+ SQUASHFS_SWAP((s)->nlink, d, 96, 32);\ -+ SQUASHFS_SWAP((s)->file_size, d, 128, 19);\ -+ SQUASHFS_SWAP((s)->offset, d, 147, 13);\ -+ SQUASHFS_SWAP((s)->start_block, d, 160, 32);\ -+ SQUASHFS_SWAP((s)->parent_inode, d, 192, 32);\ -+} -+ -+#define SQUASHFS_SWAP_LDIR_INODE_HEADER(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ -+ sizeof(struct squashfs_ldir_inode_header));\ -+ SQUASHFS_SWAP((s)->nlink, d, 96, 32);\ -+ SQUASHFS_SWAP((s)->file_size, d, 128, 27);\ -+ SQUASHFS_SWAP((s)->offset, d, 155, 13);\ -+ SQUASHFS_SWAP((s)->start_block, d, 168, 32);\ -+ SQUASHFS_SWAP((s)->i_count, d, 200, 16);\ -+ SQUASHFS_SWAP((s)->parent_inode, d, 216, 32);\ -+} -+ -+#define SQUASHFS_SWAP_DIR_INDEX(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index));\ -+ SQUASHFS_SWAP((s)->index, d, 0, 32);\ -+ SQUASHFS_SWAP((s)->start_block, d, 32, 32);\ -+ SQUASHFS_SWAP((s)->size, d, 64, 8);\ -+} -+ -+#define SQUASHFS_SWAP_DIR_HEADER(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header));\ -+ SQUASHFS_SWAP((s)->count, d, 0, 8);\ -+ SQUASHFS_SWAP((s)->start_block, d, 8, 32);\ -+ SQUASHFS_SWAP((s)->inode_number, d, 40, 32);\ -+} -+ -+#define SQUASHFS_SWAP_DIR_ENTRY(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry));\ -+ SQUASHFS_SWAP((s)->offset, d, 0, 13);\ -+ SQUASHFS_SWAP((s)->type, d, 13, 3);\ -+ SQUASHFS_SWAP((s)->size, d, 16, 8);\ -+ SQUASHFS_SWAP((s)->inode_number, d, 24, 16);\ -+} -+ -+#define SQUASHFS_SWAP_FRAGMENT_ENTRY(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry));\ -+ SQUASHFS_SWAP((s)->start_block, d, 0, 64);\ -+ SQUASHFS_SWAP((s)->size, d, 64, 32);\ -+} -+ -+#define SQUASHFS_SWAP_SHORTS(s, d, n) {\ -+ int entry;\ -+ int bit_position;\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_MEMSET(s, d, n * 2);\ -+ for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \ -+ 16)\ -+ SQUASHFS_SWAP(s[entry], d, bit_position, 16);\ -+} -+ -+#define SQUASHFS_SWAP_INTS(s, d, n) {\ -+ int entry;\ -+ int bit_position;\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_MEMSET(s, d, n * 4);\ -+ for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \ -+ 32)\ -+ SQUASHFS_SWAP(s[entry], d, bit_position, 32);\ -+} -+ -+#define SQUASHFS_SWAP_LONG_LONGS(s, d, n) {\ -+ int entry;\ -+ int bit_position;\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_MEMSET(s, d, n * 8);\ -+ for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \ -+ 64)\ -+ SQUASHFS_SWAP(s[entry], d, bit_position, 64);\ -+} -+ -+#define SQUASHFS_SWAP_DATA(s, d, n, bits) {\ -+ int entry;\ -+ int bit_position;\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_MEMSET(s, d, n * bits / 8);\ -+ for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \ -+ bits)\ -+ SQUASHFS_SWAP(s[entry], d, bit_position, bits);\ -+} -+ -+#define SQUASHFS_SWAP_FRAGMENT_INDEXES(s, d, n) SQUASHFS_SWAP_LONG_LONGS(s, d, n) -+ -+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY -+ -+struct squashfs_base_inode_header_1 { -+ unsigned int inode_type:4; -+ unsigned int mode:12; /* protection */ -+ unsigned int uid:4; /* index into uid table */ -+ unsigned int guid:4; /* index into guid table */ -+} __attribute__ ((packed)); -+ -+struct squashfs_ipc_inode_header_1 { -+ unsigned int inode_type:4; -+ unsigned int mode:12; /* protection */ -+ unsigned int uid:4; /* index into uid table */ -+ unsigned int guid:4; /* index into guid table */ -+ unsigned int type:4; -+ unsigned int offset:4; -+} __attribute__ ((packed)); -+ -+struct squashfs_dev_inode_header_1 { -+ unsigned int inode_type:4; -+ unsigned int mode:12; /* protection */ -+ unsigned int uid:4; /* index into uid table */ -+ unsigned int guid:4; /* index into guid table */ -+ unsigned short rdev; -+} __attribute__ ((packed)); -+ -+struct squashfs_symlink_inode_header_1 { -+ unsigned int inode_type:4; -+ unsigned int mode:12; /* protection */ -+ unsigned int uid:4; /* index into uid table */ -+ unsigned int guid:4; /* index into guid table */ -+ unsigned short symlink_size; -+ char symlink[0]; -+} __attribute__ ((packed)); -+ -+struct squashfs_reg_inode_header_1 { -+ unsigned int inode_type:4; -+ unsigned int mode:12; /* protection */ -+ unsigned int uid:4; /* index into uid table */ -+ unsigned int guid:4; /* index into guid table */ -+ unsigned int mtime; -+ unsigned int start_block; -+ unsigned int file_size:32; -+ unsigned short block_list[0]; -+} __attribute__ ((packed)); -+ -+struct squashfs_dir_inode_header_1 { -+ unsigned int inode_type:4; -+ unsigned int mode:12; /* protection */ -+ unsigned int uid:4; /* index into uid table */ -+ unsigned int guid:4; /* index into guid table */ -+ unsigned int file_size:19; -+ unsigned int offset:13; -+ unsigned int mtime; -+ unsigned int start_block:24; -+} __attribute__ ((packed)); -+ -+#define SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, n) \ -+ SQUASHFS_MEMSET(s, d, n);\ -+ SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\ -+ SQUASHFS_SWAP((s)->mode, d, 4, 12);\ -+ SQUASHFS_SWAP((s)->uid, d, 16, 4);\ -+ SQUASHFS_SWAP((s)->guid, d, 20, 4); -+ -+#define SQUASHFS_SWAP_BASE_INODE_HEADER_1(s, d, n) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, n)\ -+} -+ -+#define SQUASHFS_SWAP_IPC_INODE_HEADER_1(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \ -+ sizeof(struct squashfs_ipc_inode_header_1));\ -+ SQUASHFS_SWAP((s)->type, d, 24, 4);\ -+ SQUASHFS_SWAP((s)->offset, d, 28, 4);\ -+} -+ -+#define SQUASHFS_SWAP_DEV_INODE_HEADER_1(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \ -+ sizeof(struct squashfs_dev_inode_header_1));\ -+ SQUASHFS_SWAP((s)->rdev, d, 24, 16);\ -+} -+ -+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER_1(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \ -+ sizeof(struct squashfs_symlink_inode_header_1));\ -+ SQUASHFS_SWAP((s)->symlink_size, d, 24, 16);\ -+} -+ -+#define SQUASHFS_SWAP_REG_INODE_HEADER_1(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \ -+ sizeof(struct squashfs_reg_inode_header_1));\ -+ SQUASHFS_SWAP((s)->mtime, d, 24, 32);\ -+ SQUASHFS_SWAP((s)->start_block, d, 56, 32);\ -+ SQUASHFS_SWAP((s)->file_size, d, 88, 32);\ -+} -+ -+#define SQUASHFS_SWAP_DIR_INODE_HEADER_1(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \ -+ sizeof(struct squashfs_dir_inode_header_1));\ -+ SQUASHFS_SWAP((s)->file_size, d, 24, 19);\ -+ SQUASHFS_SWAP((s)->offset, d, 43, 13);\ -+ SQUASHFS_SWAP((s)->mtime, d, 56, 32);\ -+ SQUASHFS_SWAP((s)->start_block, d, 88, 24);\ -+} -+ -+#endif -+ -+#ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY -+ -+struct squashfs_dir_index_2 { -+ unsigned int index:27; -+ unsigned int start_block:29; -+ unsigned char size; -+ unsigned char name[0]; -+} __attribute__ ((packed)); -+ -+struct squashfs_base_inode_header_2 { -+ unsigned int inode_type:4; -+ unsigned int mode:12; /* protection */ -+ unsigned int uid:8; /* index into uid table */ -+ unsigned int guid:8; /* index into guid table */ -+} __attribute__ ((packed)); -+ -+struct squashfs_ipc_inode_header_2 { -+ unsigned int inode_type:4; -+ unsigned int mode:12; /* protection */ -+ unsigned int uid:8; /* index into uid table */ -+ unsigned int guid:8; /* index into guid table */ -+} __attribute__ ((packed)); -+ -+struct squashfs_dev_inode_header_2 { -+ unsigned int inode_type:4; -+ unsigned int mode:12; /* protection */ -+ unsigned int uid:8; /* index into uid table */ -+ unsigned int guid:8; /* index into guid table */ -+ unsigned short rdev; -+} __attribute__ ((packed)); -+ -+struct squashfs_symlink_inode_header_2 { -+ unsigned int inode_type:4; -+ unsigned int mode:12; /* protection */ -+ unsigned int uid:8; /* index into uid table */ -+ unsigned int guid:8; /* index into guid table */ -+ unsigned short symlink_size; -+ char symlink[0]; -+} __attribute__ ((packed)); -+ -+struct squashfs_reg_inode_header_2 { -+ unsigned int inode_type:4; -+ unsigned int mode:12; /* protection */ -+ unsigned int uid:8; /* index into uid table */ -+ unsigned int guid:8; /* index into guid table */ -+ unsigned int mtime; -+ unsigned int start_block; -+ unsigned int fragment; -+ unsigned int offset; -+ unsigned int file_size:32; -+ unsigned short block_list[0]; -+} __attribute__ ((packed)); -+ -+struct squashfs_dir_inode_header_2 { -+ unsigned int inode_type:4; -+ unsigned int mode:12; /* protection */ -+ unsigned int uid:8; /* index into uid table */ -+ unsigned int guid:8; /* index into guid table */ -+ unsigned int file_size:19; -+ unsigned int offset:13; -+ unsigned int mtime; -+ unsigned int start_block:24; -+} __attribute__ ((packed)); -+ -+struct squashfs_ldir_inode_header_2 { -+ unsigned int inode_type:4; -+ unsigned int mode:12; /* protection */ -+ unsigned int uid:8; /* index into uid table */ -+ unsigned int guid:8; /* index into guid table */ -+ unsigned int file_size:27; -+ unsigned int offset:13; -+ unsigned int mtime; -+ unsigned int start_block:24; -+ unsigned int i_count:16; -+ struct squashfs_dir_index_2 index[0]; -+} __attribute__ ((packed)); -+ -+union squashfs_inode_header_2 { -+ struct squashfs_base_inode_header_2 base; -+ struct squashfs_dev_inode_header_2 dev; -+ struct squashfs_symlink_inode_header_2 symlink; -+ struct squashfs_reg_inode_header_2 reg; -+ struct squashfs_dir_inode_header_2 dir; -+ struct squashfs_ldir_inode_header_2 ldir; -+ struct squashfs_ipc_inode_header_2 ipc; -+}; -+ -+struct squashfs_dir_header_2 { -+ unsigned int count:8; -+ unsigned int start_block:24; -+} __attribute__ ((packed)); -+ -+struct squashfs_dir_entry_2 { -+ unsigned int offset:13; -+ unsigned int type:3; -+ unsigned int size:8; -+ char name[0]; -+} __attribute__ ((packed)); -+ -+struct squashfs_fragment_entry_2 { -+ unsigned int start_block; -+ unsigned int size; -+} __attribute__ ((packed)); -+ -+#define SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, n)\ -+ SQUASHFS_MEMSET(s, d, n);\ -+ SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\ -+ SQUASHFS_SWAP((s)->mode, d, 4, 12);\ -+ SQUASHFS_SWAP((s)->uid, d, 16, 8);\ -+ SQUASHFS_SWAP((s)->guid, d, 24, 8);\ -+ -+#define SQUASHFS_SWAP_BASE_INODE_HEADER_2(s, d, n) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, n)\ -+} -+ -+#define SQUASHFS_SWAP_IPC_INODE_HEADER_2(s, d) \ -+ SQUASHFS_SWAP_BASE_INODE_HEADER_2(s, d, sizeof(struct squashfs_ipc_inode_header_2)) -+ -+#define SQUASHFS_SWAP_DEV_INODE_HEADER_2(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \ -+ sizeof(struct squashfs_dev_inode_header_2)); \ -+ SQUASHFS_SWAP((s)->rdev, d, 32, 16);\ -+} -+ -+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER_2(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \ -+ sizeof(struct squashfs_symlink_inode_header_2));\ -+ SQUASHFS_SWAP((s)->symlink_size, d, 32, 16);\ -+} -+ -+#define SQUASHFS_SWAP_REG_INODE_HEADER_2(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \ -+ sizeof(struct squashfs_reg_inode_header_2));\ -+ SQUASHFS_SWAP((s)->mtime, d, 32, 32);\ -+ SQUASHFS_SWAP((s)->start_block, d, 64, 32);\ -+ SQUASHFS_SWAP((s)->fragment, d, 96, 32);\ -+ SQUASHFS_SWAP((s)->offset, d, 128, 32);\ -+ SQUASHFS_SWAP((s)->file_size, d, 160, 32);\ -+} -+ -+#define SQUASHFS_SWAP_DIR_INODE_HEADER_2(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \ -+ sizeof(struct squashfs_dir_inode_header_2));\ -+ SQUASHFS_SWAP((s)->file_size, d, 32, 19);\ -+ SQUASHFS_SWAP((s)->offset, d, 51, 13);\ -+ SQUASHFS_SWAP((s)->mtime, d, 64, 32);\ -+ SQUASHFS_SWAP((s)->start_block, d, 96, 24);\ -+} -+ -+#define SQUASHFS_SWAP_LDIR_INODE_HEADER_2(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \ -+ sizeof(struct squashfs_ldir_inode_header_2));\ -+ SQUASHFS_SWAP((s)->file_size, d, 32, 27);\ -+ SQUASHFS_SWAP((s)->offset, d, 59, 13);\ -+ SQUASHFS_SWAP((s)->mtime, d, 72, 32);\ -+ SQUASHFS_SWAP((s)->start_block, d, 104, 24);\ -+ SQUASHFS_SWAP((s)->i_count, d, 128, 16);\ -+} -+ -+#define SQUASHFS_SWAP_DIR_INDEX_2(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index_2));\ -+ SQUASHFS_SWAP((s)->index, d, 0, 27);\ -+ SQUASHFS_SWAP((s)->start_block, d, 27, 29);\ -+ SQUASHFS_SWAP((s)->size, d, 56, 8);\ -+} -+#define SQUASHFS_SWAP_DIR_HEADER_2(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header_2));\ -+ SQUASHFS_SWAP((s)->count, d, 0, 8);\ -+ SQUASHFS_SWAP((s)->start_block, d, 8, 24);\ -+} -+ -+#define SQUASHFS_SWAP_DIR_ENTRY_2(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry_2));\ -+ SQUASHFS_SWAP((s)->offset, d, 0, 13);\ -+ SQUASHFS_SWAP((s)->type, d, 13, 3);\ -+ SQUASHFS_SWAP((s)->size, d, 16, 8);\ -+} -+ -+#define SQUASHFS_SWAP_FRAGMENT_ENTRY_2(s, d) {\ -+ SQUASHFS_SWAP_START\ -+ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry_2));\ -+ SQUASHFS_SWAP((s)->start_block, d, 0, 32);\ -+ SQUASHFS_SWAP((s)->size, d, 32, 32);\ -+} -+ -+#define SQUASHFS_SWAP_FRAGMENT_INDEXES_2(s, d, n) SQUASHFS_SWAP_INTS(s, d, n) -+ -+/* fragment and fragment table defines */ -+#define SQUASHFS_FRAGMENT_BYTES_2(A) (A * sizeof(struct squashfs_fragment_entry_2)) -+ -+#define SQUASHFS_FRAGMENT_INDEX_2(A) (SQUASHFS_FRAGMENT_BYTES_2(A) / \ -+ SQUASHFS_METADATA_SIZE) -+ -+#define SQUASHFS_FRAGMENT_INDEX_OFFSET_2(A) (SQUASHFS_FRAGMENT_BYTES_2(A) % \ -+ SQUASHFS_METADATA_SIZE) -+ -+#define SQUASHFS_FRAGMENT_INDEXES_2(A) ((SQUASHFS_FRAGMENT_BYTES_2(A) + \ -+ SQUASHFS_METADATA_SIZE - 1) / \ -+ SQUASHFS_METADATA_SIZE) -+ -+#define SQUASHFS_FRAGMENT_INDEX_BYTES_2(A) (SQUASHFS_FRAGMENT_INDEXES_2(A) *\ -+ sizeof(int)) -+ -+#endif -+ -+#ifdef __KERNEL__ -+ -+/* -+ * macros used to swap each structure entry, taking into account -+ * bitfields and different bitfield placing conventions on differing -+ * architectures -+ */ -+ -+#include -+ -+#ifdef __BIG_ENDIAN -+ /* convert from little endian to big endian */ -+#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, \ -+ tbits, b_pos) -+#else -+ /* convert from big endian to little endian */ -+#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, \ -+ tbits, 64 - tbits - b_pos) -+#endif -+ -+#define _SQUASHFS_SWAP(value, p, pos, tbits, SHIFT) {\ -+ b_pos = pos % 8;\ -+ val = 0;\ -+ s = (unsigned char *)p + (pos / 8);\ -+ d = ((unsigned char *) &val) + 7;\ -+ for(bits = 0; bits < (tbits + b_pos); bits += 8) \ -+ *d-- = *s++;\ -+ value = (val >> (SHIFT))/* & ((1 << tbits) - 1)*/;\ -+} -+ -+#define SQUASHFS_MEMSET(s, d, n) memset(s, 0, n); -+ -+#endif -+#endif ---- /dev/null -+++ b/include/linux/squashfs_fs_i.h -@@ -0,0 +1,45 @@ -+#ifndef SQUASHFS_FS_I -+#define SQUASHFS_FS_I -+/* -+ * Squashfs -+ * -+ * Copyright (c) 2002, 2003, 2004, 2005, 2006 -+ * Phillip Lougher -+ * -+ * 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, -+ * 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -+ * -+ * squashfs_fs_i.h -+ */ -+ -+struct squashfs_inode_info { -+ long long start_block; -+ unsigned int offset; -+ union { -+ struct { -+ long long fragment_start_block; -+ unsigned int fragment_size; -+ unsigned int fragment_offset; -+ long long block_list_start; -+ } s1; -+ struct { -+ long long directory_index_start; -+ unsigned int directory_index_offset; -+ unsigned int directory_index_count; -+ unsigned int parent_inode; -+ } s2; -+ } u; -+ struct inode vfs_inode; -+}; -+#endif ---- /dev/null -+++ b/include/linux/squashfs_fs_sb.h -@@ -0,0 +1,74 @@ -+#ifndef SQUASHFS_FS_SB -+#define SQUASHFS_FS_SB -+/* -+ * Squashfs -+ * -+ * Copyright (c) 2002, 2003, 2004, 2005, 2006 -+ * Phillip Lougher -+ * -+ * 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, -+ * 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -+ * -+ * squashfs_fs_sb.h -+ */ -+ -+#include -+ -+struct squashfs_cache { -+ long long block; -+ int length; -+ long long next_index; -+ char *data; -+}; -+ -+struct squashfs_fragment_cache { -+ long long block; -+ int length; -+ unsigned int locked; -+ char *data; -+}; -+ -+struct squashfs_sb_info { -+ struct squashfs_super_block sblk; -+ int devblksize; -+ int devblksize_log2; -+ int swap; -+ struct squashfs_cache *block_cache; -+ struct squashfs_fragment_cache *fragment; -+ int next_cache; -+ int next_fragment; -+ int next_meta_index; -+ unsigned int *uid; -+ unsigned int *guid; -+ long long *fragment_index; -+ unsigned int *fragment_index_2; -+ unsigned int read_size; -+ char *read_data; -+ char *read_page; -+ struct semaphore read_data_mutex; -+ struct semaphore read_page_mutex; -+ struct semaphore block_cache_mutex; -+ struct semaphore fragment_mutex; -+ struct semaphore meta_index_mutex; -+ wait_queue_head_t waitq; -+ wait_queue_head_t fragment_wait_queue; -+ struct meta_index *meta_index; -+ struct inode *(*iget)(struct super_block *s, squashfs_inode_t \ -+ inode); -+ long long (*read_blocklist)(struct inode *inode, int \ -+ index, int readahead_blks, char *block_list, \ -+ unsigned short **block_p, unsigned int *bsize); -+ int (*read_fragment_index_table)(struct super_block *s); -+}; -+#endif ---- a/init/do_mounts_rd.c -+++ b/init/do_mounts_rd.c -@@ -5,6 +5,7 @@ - #include - #include - #include -+#include - #include - #include - -@@ -39,6 +40,7 @@ static int __init crd_load(int in_fd, in - * numbers could not be found. - * - * We currently check for the following magic numbers: -+ * squashfs - * minix - * ext2 - * romfs -@@ -53,6 +55,7 @@ identify_ramdisk_image(int fd, int start - struct ext2_super_block *ext2sb; - struct romfs_super_block *romfsb; - struct cramfs_super *cramfsb; -+ struct squashfs_super_block *squashfsb; - int nblocks = -1; - unsigned char *buf; - -@@ -64,6 +67,7 @@ identify_ramdisk_image(int fd, int start - ext2sb = (struct ext2_super_block *) buf; - romfsb = (struct romfs_super_block *) buf; - cramfsb = (struct cramfs_super *) buf; -+ squashfsb = (struct squashfs_super_block *) buf; - memset(buf, 0xe5, size); - - /* -@@ -101,6 +105,15 @@ identify_ramdisk_image(int fd, int start - goto done; - } - -+ /* squashfs is at block zero too */ -+ if (squashfsb->s_magic == SQUASHFS_MAGIC) { -+ printk(KERN_NOTICE -+ "RAMDISK: squashfs filesystem found at block %d\n", -+ start_block); -+ nblocks = (squashfsb->bytes_used+BLOCK_SIZE-1)>>BLOCK_SIZE_BITS; -+ goto done; -+ } -+ - /* - * Read block 1 to test for minix and ext2 superblock - */ diff --git a/target/linux/generic-2.6/patches-2.6.21/002-lzma_decompress.patch b/target/linux/generic-2.6/patches-2.6.21/002-lzma_decompress.patch deleted file mode 100644 index 5d4e83fb1..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/002-lzma_decompress.patch +++ /dev/null @@ -1,788 +0,0 @@ ---- /dev/null -+++ b/include/linux/LzmaDecode.h -@@ -0,0 +1,100 @@ -+/* -+ LzmaDecode.h -+ LZMA Decoder interface -+ -+ LZMA SDK 4.05 Copyright (c) 1999-2004 Igor Pavlov (2004-08-25) -+ http://www.7-zip.org/ -+ -+ LZMA SDK is licensed under two licenses: -+ 1) GNU Lesser General Public License (GNU LGPL) -+ 2) Common Public License (CPL) -+ It means that you can select one of these two licenses and -+ follow rules of that license. -+ -+ SPECIAL EXCEPTION: -+ Igor Pavlov, as the author of this code, expressly permits you to -+ statically or dynamically link your code (or bind by name) to the -+ interfaces of this file without subjecting your linked code to the -+ terms of the CPL or GNU LGPL. Any modifications or additions -+ to this file, however, are subject to the LGPL or CPL terms. -+*/ -+ -+#ifndef __LZMADECODE_H -+#define __LZMADECODE_H -+ -+/* #define _LZMA_IN_CB */ -+/* Use callback for input data */ -+ -+/* #define _LZMA_OUT_READ */ -+/* Use read function for output data */ -+ -+/* #define _LZMA_PROB32 */ -+/* It can increase speed on some 32-bit CPUs, -+ but memory usage will be doubled in that case */ -+ -+/* #define _LZMA_LOC_OPT */ -+/* Enable local speed optimizations inside code */ -+ -+#ifndef UInt32 -+#ifdef _LZMA_UINT32_IS_ULONG -+#define UInt32 unsigned long -+#else -+#define UInt32 unsigned int -+#endif -+#endif -+ -+#ifdef _LZMA_PROB32 -+#define CProb UInt32 -+#else -+#define CProb unsigned short -+#endif -+ -+#define LZMA_RESULT_OK 0 -+#define LZMA_RESULT_DATA_ERROR 1 -+#define LZMA_RESULT_NOT_ENOUGH_MEM 2 -+ -+#ifdef _LZMA_IN_CB -+typedef struct _ILzmaInCallback -+{ -+ int (*Read)(void *object, unsigned char **buffer, UInt32 *bufferSize); -+} ILzmaInCallback; -+#endif -+ -+#define LZMA_BASE_SIZE 1846 -+#define LZMA_LIT_SIZE 768 -+ -+/* -+bufferSize = (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << (lc + lp)))* sizeof(CProb) -+bufferSize += 100 in case of _LZMA_OUT_READ -+by default CProb is unsigned short, -+but if specify _LZMA_PROB_32, CProb will be UInt32(unsigned int) -+*/ -+ -+#ifdef _LZMA_OUT_READ -+int LzmaDecoderInit( -+ unsigned char *buffer, UInt32 bufferSize, -+ int lc, int lp, int pb, -+ unsigned char *dictionary, UInt32 dictionarySize, -+ #ifdef _LZMA_IN_CB -+ ILzmaInCallback *inCallback -+ #else -+ unsigned char *inStream, UInt32 inSize -+ #endif -+); -+#endif -+ -+int LzmaDecode( -+ unsigned char *buffer, -+ #ifndef _LZMA_OUT_READ -+ UInt32 bufferSize, -+ int lc, int lp, int pb, -+ #ifdef _LZMA_IN_CB -+ ILzmaInCallback *inCallback, -+ #else -+ unsigned char *inStream, UInt32 inSize, -+ #endif -+ #endif -+ unsigned char *outStream, UInt32 outSize, -+ UInt32 *outSizeProcessed); -+ -+#endif ---- /dev/null -+++ b/lib/LzmaDecode.c -@@ -0,0 +1,663 @@ -+/* -+ LzmaDecode.c -+ LZMA Decoder -+ -+ LZMA SDK 4.05 Copyright (c) 1999-2004 Igor Pavlov (2004-08-25) -+ http://www.7-zip.org/ -+ -+ LZMA SDK is licensed under two licenses: -+ 1) GNU Lesser General Public License (GNU LGPL) -+ 2) Common Public License (CPL) -+ It means that you can select one of these two licenses and -+ follow rules of that license. -+ -+ SPECIAL EXCEPTION: -+ Igor Pavlov, as the author of this code, expressly permits you to -+ statically or dynamically link your code (or bind by name) to the -+ interfaces of this file without subjecting your linked code to the -+ terms of the CPL or GNU LGPL. Any modifications or additions -+ to this file, however, are subject to the LGPL or CPL terms. -+*/ -+ -+#include -+ -+#ifndef Byte -+#define Byte unsigned char -+#endif -+ -+#define kNumTopBits 24 -+#define kTopValue ((UInt32)1 << kNumTopBits) -+ -+#define kNumBitModelTotalBits 11 -+#define kBitModelTotal (1 << kNumBitModelTotalBits) -+#define kNumMoveBits 5 -+ -+typedef struct _CRangeDecoder -+{ -+ Byte *Buffer; -+ Byte *BufferLim; -+ UInt32 Range; -+ UInt32 Code; -+ #ifdef _LZMA_IN_CB -+ ILzmaInCallback *InCallback; -+ int Result; -+ #endif -+ int ExtraBytes; -+} CRangeDecoder; -+ -+Byte RangeDecoderReadByte(CRangeDecoder *rd) -+{ -+ if (rd->Buffer == rd->BufferLim) -+ { -+ #ifdef _LZMA_IN_CB -+ UInt32 size; -+ rd->Result = rd->InCallback->Read(rd->InCallback, &rd->Buffer, &size); -+ rd->BufferLim = rd->Buffer + size; -+ if (size == 0) -+ #endif -+ { -+ rd->ExtraBytes = 1; -+ return 0xFF; -+ } -+ } -+ return (*rd->Buffer++); -+} -+ -+/* #define ReadByte (*rd->Buffer++) */ -+#define ReadByte (RangeDecoderReadByte(rd)) -+ -+void RangeDecoderInit(CRangeDecoder *rd, -+ #ifdef _LZMA_IN_CB -+ ILzmaInCallback *inCallback -+ #else -+ Byte *stream, UInt32 bufferSize -+ #endif -+ ) -+{ -+ int i; -+ #ifdef _LZMA_IN_CB -+ rd->InCallback = inCallback; -+ rd->Buffer = rd->BufferLim = 0; -+ #else -+ rd->Buffer = stream; -+ rd->BufferLim = stream + bufferSize; -+ #endif -+ rd->ExtraBytes = 0; -+ rd->Code = 0; -+ rd->Range = (0xFFFFFFFF); -+ for(i = 0; i < 5; i++) -+ rd->Code = (rd->Code << 8) | ReadByte; -+} -+ -+#define RC_INIT_VAR UInt32 range = rd->Range; UInt32 code = rd->Code; -+#define RC_FLUSH_VAR rd->Range = range; rd->Code = code; -+#define RC_NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | ReadByte; } -+ -+UInt32 RangeDecoderDecodeDirectBits(CRangeDecoder *rd, int numTotalBits) -+{ -+ RC_INIT_VAR -+ UInt32 result = 0; -+ int i; -+ for (i = numTotalBits; i > 0; i--) -+ { -+ /* UInt32 t; */ -+ range >>= 1; -+ -+ result <<= 1; -+ if (code >= range) -+ { -+ code -= range; -+ result |= 1; -+ } -+ /* -+ t = (code - range) >> 31; -+ t &= 1; -+ code -= range & (t - 1); -+ result = (result + result) | (1 - t); -+ */ -+ RC_NORMALIZE -+ } -+ RC_FLUSH_VAR -+ return result; -+} -+ -+int RangeDecoderBitDecode(CProb *prob, CRangeDecoder *rd) -+{ -+ UInt32 bound = (rd->Range >> kNumBitModelTotalBits) * *prob; -+ if (rd->Code < bound) -+ { -+ rd->Range = bound; -+ *prob += (kBitModelTotal - *prob) >> kNumMoveBits; -+ if (rd->Range < kTopValue) -+ { -+ rd->Code = (rd->Code << 8) | ReadByte; -+ rd->Range <<= 8; -+ } -+ return 0; -+ } -+ else -+ { -+ rd->Range -= bound; -+ rd->Code -= bound; -+ *prob -= (*prob) >> kNumMoveBits; -+ if (rd->Range < kTopValue) -+ { -+ rd->Code = (rd->Code << 8) | ReadByte; -+ rd->Range <<= 8; -+ } -+ return 1; -+ } -+} -+ -+#define RC_GET_BIT2(prob, mi, A0, A1) \ -+ UInt32 bound = (range >> kNumBitModelTotalBits) * *prob; \ -+ if (code < bound) \ -+ { A0; range = bound; *prob += (kBitModelTotal - *prob) >> kNumMoveBits; mi <<= 1; } \ -+ else \ -+ { A1; range -= bound; code -= bound; *prob -= (*prob) >> kNumMoveBits; mi = (mi + mi) + 1; } \ -+ RC_NORMALIZE -+ -+#define RC_GET_BIT(prob, mi) RC_GET_BIT2(prob, mi, ; , ;) -+ -+int RangeDecoderBitTreeDecode(CProb *probs, int numLevels, CRangeDecoder *rd) -+{ -+ int mi = 1; -+ int i; -+ #ifdef _LZMA_LOC_OPT -+ RC_INIT_VAR -+ #endif -+ for(i = numLevels; i > 0; i--) -+ { -+ #ifdef _LZMA_LOC_OPT -+ CProb *prob = probs + mi; -+ RC_GET_BIT(prob, mi) -+ #else -+ mi = (mi + mi) + RangeDecoderBitDecode(probs + mi, rd); -+ #endif -+ } -+ #ifdef _LZMA_LOC_OPT -+ RC_FLUSH_VAR -+ #endif -+ return mi - (1 << numLevels); -+} -+ -+int RangeDecoderReverseBitTreeDecode(CProb *probs, int numLevels, CRangeDecoder *rd) -+{ -+ int mi = 1; -+ int i; -+ int symbol = 0; -+ #ifdef _LZMA_LOC_OPT -+ RC_INIT_VAR -+ #endif -+ for(i = 0; i < numLevels; i++) -+ { -+ #ifdef _LZMA_LOC_OPT -+ CProb *prob = probs + mi; -+ RC_GET_BIT2(prob, mi, ; , symbol |= (1 << i)) -+ #else -+ int bit = RangeDecoderBitDecode(probs + mi, rd); -+ mi = mi + mi + bit; -+ symbol |= (bit << i); -+ #endif -+ } -+ #ifdef _LZMA_LOC_OPT -+ RC_FLUSH_VAR -+ #endif -+ return symbol; -+} -+ -+Byte LzmaLiteralDecode(CProb *probs, CRangeDecoder *rd) -+{ -+ int symbol = 1; -+ #ifdef _LZMA_LOC_OPT -+ RC_INIT_VAR -+ #endif -+ do -+ { -+ #ifdef _LZMA_LOC_OPT -+ CProb *prob = probs + symbol; -+ RC_GET_BIT(prob, symbol) -+ #else -+ symbol = (symbol + symbol) | RangeDecoderBitDecode(probs + symbol, rd); -+ #endif -+ } -+ while (symbol < 0x100); -+ #ifdef _LZMA_LOC_OPT -+ RC_FLUSH_VAR -+ #endif -+ return symbol; -+} -+ -+Byte LzmaLiteralDecodeMatch(CProb *probs, CRangeDecoder *rd, Byte matchByte) -+{ -+ int symbol = 1; -+ #ifdef _LZMA_LOC_OPT -+ RC_INIT_VAR -+ #endif -+ do -+ { -+ int bit; -+ int matchBit = (matchByte >> 7) & 1; -+ matchByte <<= 1; -+ #ifdef _LZMA_LOC_OPT -+ { -+ CProb *prob = probs + ((1 + matchBit) << 8) + symbol; -+ RC_GET_BIT2(prob, symbol, bit = 0, bit = 1) -+ } -+ #else -+ bit = RangeDecoderBitDecode(probs + ((1 + matchBit) << 8) + symbol, rd); -+ symbol = (symbol << 1) | bit; -+ #endif -+ if (matchBit != bit) -+ { -+ while (symbol < 0x100) -+ { -+ #ifdef _LZMA_LOC_OPT -+ CProb *prob = probs + symbol; -+ RC_GET_BIT(prob, symbol) -+ #else -+ symbol = (symbol + symbol) | RangeDecoderBitDecode(probs + symbol, rd); -+ #endif -+ } -+ break; -+ } -+ } -+ while (symbol < 0x100); -+ #ifdef _LZMA_LOC_OPT -+ RC_FLUSH_VAR -+ #endif -+ return symbol; -+} -+ -+#define kNumPosBitsMax 4 -+#define kNumPosStatesMax (1 << kNumPosBitsMax) -+ -+#define kLenNumLowBits 3 -+#define kLenNumLowSymbols (1 << kLenNumLowBits) -+#define kLenNumMidBits 3 -+#define kLenNumMidSymbols (1 << kLenNumMidBits) -+#define kLenNumHighBits 8 -+#define kLenNumHighSymbols (1 << kLenNumHighBits) -+ -+#define LenChoice 0 -+#define LenChoice2 (LenChoice + 1) -+#define LenLow (LenChoice2 + 1) -+#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) -+#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) -+#define kNumLenProbs (LenHigh + kLenNumHighSymbols) -+ -+int LzmaLenDecode(CProb *p, CRangeDecoder *rd, int posState) -+{ -+ if(RangeDecoderBitDecode(p + LenChoice, rd) == 0) -+ return RangeDecoderBitTreeDecode(p + LenLow + -+ (posState << kLenNumLowBits), kLenNumLowBits, rd); -+ if(RangeDecoderBitDecode(p + LenChoice2, rd) == 0) -+ return kLenNumLowSymbols + RangeDecoderBitTreeDecode(p + LenMid + -+ (posState << kLenNumMidBits), kLenNumMidBits, rd); -+ return kLenNumLowSymbols + kLenNumMidSymbols + -+ RangeDecoderBitTreeDecode(p + LenHigh, kLenNumHighBits, rd); -+} -+ -+#define kNumStates 12 -+ -+#define kStartPosModelIndex 4 -+#define kEndPosModelIndex 14 -+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) -+ -+#define kNumPosSlotBits 6 -+#define kNumLenToPosStates 4 -+ -+#define kNumAlignBits 4 -+#define kAlignTableSize (1 << kNumAlignBits) -+ -+#define kMatchMinLen 2 -+ -+#define IsMatch 0 -+#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) -+#define IsRepG0 (IsRep + kNumStates) -+#define IsRepG1 (IsRepG0 + kNumStates) -+#define IsRepG2 (IsRepG1 + kNumStates) -+#define IsRep0Long (IsRepG2 + kNumStates) -+#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) -+#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) -+#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) -+#define LenCoder (Align + kAlignTableSize) -+#define RepLenCoder (LenCoder + kNumLenProbs) -+#define Literal (RepLenCoder + kNumLenProbs) -+ -+#if Literal != LZMA_BASE_SIZE -+StopCompilingDueBUG -+#endif -+ -+#ifdef _LZMA_OUT_READ -+ -+typedef struct _LzmaVarState -+{ -+ CRangeDecoder RangeDecoder; -+ Byte *Dictionary; -+ UInt32 DictionarySize; -+ UInt32 DictionaryPos; -+ UInt32 GlobalPos; -+ UInt32 Reps[4]; -+ int lc; -+ int lp; -+ int pb; -+ int State; -+ int PreviousIsMatch; -+ int RemainLen; -+} LzmaVarState; -+ -+int LzmaDecoderInit( -+ unsigned char *buffer, UInt32 bufferSize, -+ int lc, int lp, int pb, -+ unsigned char *dictionary, UInt32 dictionarySize, -+ #ifdef _LZMA_IN_CB -+ ILzmaInCallback *inCallback -+ #else -+ unsigned char *inStream, UInt32 inSize -+ #endif -+ ) -+{ -+ LzmaVarState *vs = (LzmaVarState *)buffer; -+ CProb *p = (CProb *)(buffer + sizeof(LzmaVarState)); -+ UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + lp)); -+ UInt32 i; -+ if (bufferSize < numProbs * sizeof(CProb) + sizeof(LzmaVarState)) -+ return LZMA_RESULT_NOT_ENOUGH_MEM; -+ vs->Dictionary = dictionary; -+ vs->DictionarySize = dictionarySize; -+ vs->DictionaryPos = 0; -+ vs->GlobalPos = 0; -+ vs->Reps[0] = vs->Reps[1] = vs->Reps[2] = vs->Reps[3] = 1; -+ vs->lc = lc; -+ vs->lp = lp; -+ vs->pb = pb; -+ vs->State = 0; -+ vs->PreviousIsMatch = 0; -+ vs->RemainLen = 0; -+ dictionary[dictionarySize - 1] = 0; -+ for (i = 0; i < numProbs; i++) -+ p[i] = kBitModelTotal >> 1; -+ RangeDecoderInit(&vs->RangeDecoder, -+ #ifdef _LZMA_IN_CB -+ inCallback -+ #else -+ inStream, inSize -+ #endif -+ ); -+ return LZMA_RESULT_OK; -+} -+ -+int LzmaDecode(unsigned char *buffer, -+ unsigned char *outStream, UInt32 outSize, -+ UInt32 *outSizeProcessed) -+{ -+ LzmaVarState *vs = (LzmaVarState *)buffer; -+ CProb *p = (CProb *)(buffer + sizeof(LzmaVarState)); -+ CRangeDecoder rd = vs->RangeDecoder; -+ int state = vs->State; -+ int previousIsMatch = vs->PreviousIsMatch; -+ Byte previousByte; -+ UInt32 rep0 = vs->Reps[0], rep1 = vs->Reps[1], rep2 = vs->Reps[2], rep3 = vs->Reps[3]; -+ UInt32 nowPos = 0; -+ UInt32 posStateMask = (1 << (vs->pb)) - 1; -+ UInt32 literalPosMask = (1 << (vs->lp)) - 1; -+ int lc = vs->lc; -+ int len = vs->RemainLen; -+ UInt32 globalPos = vs->GlobalPos; -+ -+ Byte *dictionary = vs->Dictionary; -+ UInt32 dictionarySize = vs->DictionarySize; -+ UInt32 dictionaryPos = vs->DictionaryPos; -+ -+ if (len == -1) -+ { -+ *outSizeProcessed = 0; -+ return LZMA_RESULT_OK; -+ } -+ -+ while(len > 0 && nowPos < outSize) -+ { -+ UInt32 pos = dictionaryPos - rep0; -+ if (pos >= dictionarySize) -+ pos += dictionarySize; -+ outStream[nowPos++] = dictionary[dictionaryPos] = dictionary[pos]; -+ if (++dictionaryPos == dictionarySize) -+ dictionaryPos = 0; -+ len--; -+ } -+ if (dictionaryPos == 0) -+ previousByte = dictionary[dictionarySize - 1]; -+ else -+ previousByte = dictionary[dictionaryPos - 1]; -+#else -+ -+int LzmaDecode( -+ Byte *buffer, UInt32 bufferSize, -+ int lc, int lp, int pb, -+ #ifdef _LZMA_IN_CB -+ ILzmaInCallback *inCallback, -+ #else -+ unsigned char *inStream, UInt32 inSize, -+ #endif -+ unsigned char *outStream, UInt32 outSize, -+ UInt32 *outSizeProcessed) -+{ -+ UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + lp)); -+ CProb *p = (CProb *)buffer; -+ CRangeDecoder rd; -+ UInt32 i; -+ int state = 0; -+ int previousIsMatch = 0; -+ Byte previousByte = 0; -+ UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1; -+ UInt32 nowPos = 0; -+ UInt32 posStateMask = (1 << pb) - 1; -+ UInt32 literalPosMask = (1 << lp) - 1; -+ int len = 0; -+ if (bufferSize < numProbs * sizeof(CProb)) -+ return LZMA_RESULT_NOT_ENOUGH_MEM; -+ for (i = 0; i < numProbs; i++) -+ p[i] = kBitModelTotal >> 1; -+ RangeDecoderInit(&rd, -+ #ifdef _LZMA_IN_CB -+ inCallback -+ #else -+ inStream, inSize -+ #endif -+ ); -+#endif -+ -+ *outSizeProcessed = 0; -+ while(nowPos < outSize) -+ { -+ int posState = (int)( -+ (nowPos -+ #ifdef _LZMA_OUT_READ -+ + globalPos -+ #endif -+ ) -+ & posStateMask); -+ #ifdef _LZMA_IN_CB -+ if (rd.Result != LZMA_RESULT_OK) -+ return rd.Result; -+ #endif -+ if (rd.ExtraBytes != 0) -+ return LZMA_RESULT_DATA_ERROR; -+ if (RangeDecoderBitDecode(p + IsMatch + (state << kNumPosBitsMax) + posState, &rd) == 0) -+ { -+ CProb *probs = p + Literal + (LZMA_LIT_SIZE * -+ ((( -+ (nowPos -+ #ifdef _LZMA_OUT_READ -+ + globalPos -+ #endif -+ ) -+ & literalPosMask) << lc) + (previousByte >> (8 - lc)))); -+ -+ if (state < 4) state = 0; -+ else if (state < 10) state -= 3; -+ else state -= 6; -+ if (previousIsMatch) -+ { -+ Byte matchByte; -+ #ifdef _LZMA_OUT_READ -+ UInt32 pos = dictionaryPos - rep0; -+ if (pos >= dictionarySize) -+ pos += dictionarySize; -+ matchByte = dictionary[pos]; -+ #else -+ matchByte = outStream[nowPos - rep0]; -+ #endif -+ previousByte = LzmaLiteralDecodeMatch(probs, &rd, matchByte); -+ previousIsMatch = 0; -+ } -+ else -+ previousByte = LzmaLiteralDecode(probs, &rd); -+ outStream[nowPos++] = previousByte; -+ #ifdef _LZMA_OUT_READ -+ dictionary[dictionaryPos] = previousByte; -+ if (++dictionaryPos == dictionarySize) -+ dictionaryPos = 0; -+ #endif -+ } -+ else -+ { -+ previousIsMatch = 1; -+ if (RangeDecoderBitDecode(p + IsRep + state, &rd) == 1) -+ { -+ if (RangeDecoderBitDecode(p + IsRepG0 + state, &rd) == 0) -+ { -+ if (RangeDecoderBitDecode(p + IsRep0Long + (state << kNumPosBitsMax) + posState, &rd) == 0) -+ { -+ #ifdef _LZMA_OUT_READ -+ UInt32 pos; -+ #endif -+ if ( -+ (nowPos -+ #ifdef _LZMA_OUT_READ -+ + globalPos -+ #endif -+ ) -+ == 0) -+ return LZMA_RESULT_DATA_ERROR; -+ state = state < 7 ? 9 : 11; -+ #ifdef _LZMA_OUT_READ -+ pos = dictionaryPos - rep0; -+ if (pos >= dictionarySize) -+ pos += dictionarySize; -+ previousByte = dictionary[pos]; -+ dictionary[dictionaryPos] = previousByte; -+ if (++dictionaryPos == dictionarySize) -+ dictionaryPos = 0; -+ #else -+ previousByte = outStream[nowPos - rep0]; -+ #endif -+ outStream[nowPos++] = previousByte; -+ continue; -+ } -+ } -+ else -+ { -+ UInt32 distance; -+ if(RangeDecoderBitDecode(p + IsRepG1 + state, &rd) == 0) -+ distance = rep1; -+ else -+ { -+ if(RangeDecoderBitDecode(p + IsRepG2 + state, &rd) == 0) -+ distance = rep2; -+ else -+ { -+ distance = rep3; -+ rep3 = rep2; -+ } -+ rep2 = rep1; -+ } -+ rep1 = rep0; -+ rep0 = distance; -+ } -+ len = LzmaLenDecode(p + RepLenCoder, &rd, posState); -+ state = state < 7 ? 8 : 11; -+ } -+ else -+ { -+ int posSlot; -+ rep3 = rep2; -+ rep2 = rep1; -+ rep1 = rep0; -+ state = state < 7 ? 7 : 10; -+ len = LzmaLenDecode(p + LenCoder, &rd, posState); -+ posSlot = RangeDecoderBitTreeDecode(p + PosSlot + -+ ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << -+ kNumPosSlotBits), kNumPosSlotBits, &rd); -+ if (posSlot >= kStartPosModelIndex) -+ { -+ int numDirectBits = ((posSlot >> 1) - 1); -+ rep0 = ((2 | ((UInt32)posSlot & 1)) << numDirectBits); -+ if (posSlot < kEndPosModelIndex) -+ { -+ rep0 += RangeDecoderReverseBitTreeDecode( -+ p + SpecPos + rep0 - posSlot - 1, numDirectBits, &rd); -+ } -+ else -+ { -+ rep0 += RangeDecoderDecodeDirectBits(&rd, -+ numDirectBits - kNumAlignBits) << kNumAlignBits; -+ rep0 += RangeDecoderReverseBitTreeDecode(p + Align, kNumAlignBits, &rd); -+ } -+ } -+ else -+ rep0 = posSlot; -+ rep0++; -+ } -+ if (rep0 == (UInt32)(0)) -+ { -+ /* it's for stream version */ -+ len = -1; -+ break; -+ } -+ if (rep0 > nowPos -+ #ifdef _LZMA_OUT_READ -+ + globalPos -+ #endif -+ ) -+ { -+ return LZMA_RESULT_DATA_ERROR; -+ } -+ len += kMatchMinLen; -+ do -+ { -+ #ifdef _LZMA_OUT_READ -+ UInt32 pos = dictionaryPos - rep0; -+ if (pos >= dictionarySize) -+ pos += dictionarySize; -+ previousByte = dictionary[pos]; -+ dictionary[dictionaryPos] = previousByte; -+ if (++dictionaryPos == dictionarySize) -+ dictionaryPos = 0; -+ #else -+ previousByte = outStream[nowPos - rep0]; -+ #endif -+ outStream[nowPos++] = previousByte; -+ len--; -+ } -+ while(len > 0 && nowPos < outSize); -+ } -+ } -+ -+ #ifdef _LZMA_OUT_READ -+ vs->RangeDecoder = rd; -+ vs->DictionaryPos = dictionaryPos; -+ vs->GlobalPos = globalPos + nowPos; -+ vs->Reps[0] = rep0; -+ vs->Reps[1] = rep1; -+ vs->Reps[2] = rep2; -+ vs->Reps[3] = rep3; -+ vs->State = state; -+ vs->PreviousIsMatch = previousIsMatch; -+ vs->RemainLen = len; -+ #endif -+ -+ *outSizeProcessed = nowPos; -+ return LZMA_RESULT_OK; -+} ---- a/lib/Makefile -+++ b/lib/Makefile -@@ -12,7 +12,7 @@ lib-$(CONFIG_SMP) += cpumask.o - - lib-y += kobject.o kref.o kobject_uevent.o klist.o - --obj-y += sort.o parser.o halfmd4.o debug_locks.o random32.o bust_spinlocks.o -+obj-y += sort.o parser.o halfmd4.o debug_locks.o random32.o bust_spinlocks.o LzmaDecode.o - - ifeq ($(CONFIG_DEBUG_KOBJECT),y) - CFLAGS_kobject.o += -DDEBUG -@@ -56,6 +56,7 @@ obj-$(CONFIG_SMP) += percpu_counter.o - obj-$(CONFIG_AUDIT_GENERIC) += audit.o - - obj-$(CONFIG_SWIOTLB) += swiotlb.o -+ - obj-$(CONFIG_FAULT_INJECTION) += fault-inject.o - - lib-$(CONFIG_GENERIC_BUG) += bug.o diff --git a/target/linux/generic-2.6/patches-2.6.21/003-squashfs_lzma.patch b/target/linux/generic-2.6/patches-2.6.21/003-squashfs_lzma.patch deleted file mode 100644 index 9050e370c..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/003-squashfs_lzma.patch +++ /dev/null @@ -1,107 +0,0 @@ ---- a/fs/squashfs/inode.c -+++ b/fs/squashfs/inode.c -@@ -4,6 +4,9 @@ - * Copyright (c) 2002, 2003, 2004, 2005, 2006 - * Phillip Lougher - * -+ * LZMA decompressor support added by Oleg I. Vdovikin -+ * Copyright (c) 2005 Oleg I.Vdovikin -+ * - * 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, -@@ -21,6 +24,7 @@ - * inode.c - */ - -+#define SQUASHFS_LZMA - #include - #include - #include -@@ -44,6 +48,19 @@ - - #include "squashfs.h" - -+#ifdef SQUASHFS_LZMA -+#include -+ -+/* default LZMA settings, should be in sync with mksquashfs */ -+#define LZMA_LC 3 -+#define LZMA_LP 0 -+#define LZMA_PB 2 -+ -+#define LZMA_WORKSPACE_SIZE ((LZMA_BASE_SIZE + \ -+ (LZMA_LIT_SIZE << (LZMA_LC + LZMA_LP))) * sizeof(CProb)) -+ -+#endif -+ - static void squashfs_put_super(struct super_block *); - static int squashfs_statfs(struct dentry *, struct kstatfs *); - static int squashfs_symlink_readpage(struct file *file, struct page *page); -@@ -64,7 +81,11 @@ static int squashfs_get_sb(struct file_s - const char *, void *, struct vfsmount *); - - -+#ifdef SQUASHFS_LZMA -+static unsigned char lzma_workspace[LZMA_WORKSPACE_SIZE]; -+#else - static z_stream stream; -+#endif - - static struct file_system_type squashfs_fs_type = { - .owner = THIS_MODULE, -@@ -249,6 +270,15 @@ SQSH_EXTERN unsigned int squashfs_read_d - if (compressed) { - int zlib_err; - -+#ifdef SQUASHFS_LZMA -+ if ((zlib_err = LzmaDecode(lzma_workspace, -+ LZMA_WORKSPACE_SIZE, LZMA_LC, LZMA_LP, LZMA_PB, -+ c_buffer, c_byte, buffer, msblk->read_size, &bytes)) != LZMA_RESULT_OK) -+ { -+ ERROR("lzma returned unexpected result 0x%x\n", zlib_err); -+ bytes = 0; -+ } -+#else - stream.next_in = c_buffer; - stream.avail_in = c_byte; - stream.next_out = buffer; -@@ -263,7 +293,7 @@ SQSH_EXTERN unsigned int squashfs_read_d - bytes = 0; - } else - bytes = stream.total_out; -- -+#endif - up(&msblk->read_data_mutex); - } - -@@ -2045,15 +2075,19 @@ static int __init init_squashfs_fs(void) - printk(KERN_INFO "squashfs: version 3.0 (2006/03/15) " - "Phillip Lougher\n"); - -+#ifndef SQUASHFS_LZMA - if (!(stream.workspace = vmalloc(zlib_inflate_workspacesize()))) { - ERROR("Failed to allocate zlib workspace\n"); - destroy_inodecache(); - err = -ENOMEM; - goto out; - } -+#endif - - if ((err = register_filesystem(&squashfs_fs_type))) { -+#ifndef SQUASHFS_LZMA - vfree(stream.workspace); -+#endif - destroy_inodecache(); - } - -@@ -2064,7 +2098,9 @@ out: - - static void __exit exit_squashfs_fs(void) - { -+#ifndef SQUASHFS_LZMA - vfree(stream.workspace); -+#endif - unregister_filesystem(&squashfs_fs_type); - destroy_inodecache(); - } diff --git a/target/linux/generic-2.6/patches-2.6.21/004-extra_optimization.patch b/target/linux/generic-2.6/patches-2.6.21/004-extra_optimization.patch deleted file mode 100644 index ead0f83c1..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/004-extra_optimization.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/Makefile -+++ b/Makefile -@@ -507,6 +507,9 @@ CFLAGS += $(call cc-option, -fn - NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include) - CHECKFLAGS += $(NOSTDINC_FLAGS) - -+# improve gcc optimization -+CFLAGS += $(call cc-option,-funit-at-a-time,) -+ - # warn about C99 declaration after statement - CFLAGS += $(call cc-option,-Wdeclaration-after-statement,) - diff --git a/target/linux/generic-2.6/patches-2.6.21/006-gcc4_inline_fix.patch b/target/linux/generic-2.6/patches-2.6.21/006-gcc4_inline_fix.patch deleted file mode 100644 index 4a8cd97ad..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/006-gcc4_inline_fix.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/include/asm-mips/system.h -+++ b/include/asm-mips/system.h -@@ -188,7 +188,7 @@ extern __u64 __xchg_u64_unsupported_on_3 - if something tries to do an invalid xchg(). */ - extern void __xchg_called_with_bad_pointer(void); - --static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size) -+static __always_inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size) - { - switch (size) { - case 4: diff --git a/target/linux/generic-2.6/patches-2.6.21/007-samsung_flash.patch b/target/linux/generic-2.6/patches-2.6.21/007-samsung_flash.patch deleted file mode 100644 index 1d679e009..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/007-samsung_flash.patch +++ /dev/null @@ -1,36 +0,0 @@ ---- a/drivers/mtd/chips/cfi_cmdset_0002.c -+++ b/drivers/mtd/chips/cfi_cmdset_0002.c -@@ -51,6 +51,7 @@ - #define SST49LF040B 0x0050 - #define SST49LF008A 0x005a - #define AT49BV6416 0x00d6 -+#define MANUFACTURER_SAMSUNG 0x00ec - - static int cfi_amdstd_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *); - static int cfi_amdstd_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *); -@@ -294,12 +295,19 @@ struct mtd_info *cfi_cmdset_0002(struct - - if (extp->MajorVersion != '1' || - (extp->MinorVersion < '0' || extp->MinorVersion > '4')) { -- printk(KERN_ERR " Unknown Amd/Fujitsu Extended Query " -- "version %c.%c.\n", extp->MajorVersion, -- extp->MinorVersion); -- kfree(extp); -- kfree(mtd); -- return NULL; -+ if (cfi->mfr == MANUFACTURER_SAMSUNG && -+ (extp->MajorVersion == '3' && extp->MinorVersion == '3')) { -+ printk(KERN_NOTICE " Newer Samsung flash detected, " -+ "should be compatibile with Amd/Fujitsu.\n"); -+ } -+ else { -+ printk(KERN_ERR " Unknown Amd/Fujitsu Extended Query " -+ "version %c.%c.\n", extp->MajorVersion, -+ extp->MinorVersion); -+ kfree(extp); -+ kfree(mtd); -+ return NULL; -+ } - } - - /* Install our own private info structure */ diff --git a/target/linux/generic-2.6/patches-2.6.21/009-revert_intel_flash_breakage.patch b/target/linux/generic-2.6/patches-2.6.21/009-revert_intel_flash_breakage.patch deleted file mode 100644 index 3a6b80b23..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/009-revert_intel_flash_breakage.patch +++ /dev/null @@ -1,169 +0,0 @@ ---- a/drivers/mtd/chips/cfi_cmdset_0001.c -+++ b/drivers/mtd/chips/cfi_cmdset_0001.c -@@ -919,7 +919,7 @@ static void __xipram xip_enable(struct m - - static int __xipram xip_wait_for_operation( - struct map_info *map, struct flchip *chip, -- unsigned long adr, unsigned int chip_op_time ) -+ unsigned long adr, int *chip_op_time ) - { - struct cfi_private *cfi = map->fldrv_priv; - struct cfi_pri_intelext *cfip = cfi->cmdset_priv; -@@ -928,7 +928,7 @@ static int __xipram xip_wait_for_operati - flstate_t oldstate, newstate; - - start = xip_currtime(); -- usec = chip_op_time * 8; -+ usec = *chip_op_time * 8; - if (usec == 0) - usec = 500000; - done = 0; -@@ -1038,8 +1038,8 @@ static int __xipram xip_wait_for_operati - #define XIP_INVAL_CACHED_RANGE(map, from, size) \ - INVALIDATE_CACHED_RANGE(map, from, size) - --#define INVAL_CACHE_AND_WAIT(map, chip, cmd_adr, inval_adr, inval_len, usec) \ -- xip_wait_for_operation(map, chip, cmd_adr, usec) -+#define INVAL_CACHE_AND_WAIT(map, chip, cmd_adr, inval_adr, inval_len, p_usec) \ -+ xip_wait_for_operation(map, chip, cmd_adr, p_usec) - - #else - -@@ -1051,65 +1051,65 @@ static int __xipram xip_wait_for_operati - static int inval_cache_and_wait_for_operation( - struct map_info *map, struct flchip *chip, - unsigned long cmd_adr, unsigned long inval_adr, int inval_len, -- unsigned int chip_op_time) -+ int *chip_op_time ) - { - struct cfi_private *cfi = map->fldrv_priv; - map_word status, status_OK = CMD(0x80); -- int chip_state = chip->state; -- unsigned int timeo, sleep_time; -+ int z, chip_state = chip->state; -+ unsigned long timeo; - - spin_unlock(chip->mutex); - if (inval_len) - INVALIDATE_CACHED_RANGE(map, inval_adr, inval_len); -+ if (*chip_op_time) -+ cfi_udelay(*chip_op_time); - spin_lock(chip->mutex); - -- /* set our timeout to 8 times the expected delay */ -- timeo = chip_op_time * 8; -- if (!timeo) -- timeo = 500000; -- sleep_time = chip_op_time / 2; -+ timeo = *chip_op_time * 8 * HZ / 1000000; -+ if (timeo < HZ/2) -+ timeo = HZ/2; -+ timeo += jiffies; - -+ z = 0; - for (;;) { -+ if (chip->state != chip_state) { -+ /* Someone's suspended the operation: sleep */ -+ DECLARE_WAITQUEUE(wait, current); -+ -+ set_current_state(TASK_UNINTERRUPTIBLE); -+ add_wait_queue(&chip->wq, &wait); -+ spin_unlock(chip->mutex); -+ schedule(); -+ remove_wait_queue(&chip->wq, &wait); -+ timeo = jiffies + (HZ / 2); /* FIXME */ -+ spin_lock(chip->mutex); -+ continue; -+ } -+ - status = map_read(map, cmd_adr); - if (map_word_andequal(map, status, status_OK, status_OK)) - break; - -- if (!timeo) { -+ /* OK Still waiting */ -+ if (time_after(jiffies, timeo)) { - map_write(map, CMD(0x70), cmd_adr); - chip->state = FL_STATUS; - return -ETIME; - } - -- /* OK Still waiting. Drop the lock, wait a while and retry. */ -+ /* Latency issues. Drop the lock, wait a while and retry */ -+ z++; - spin_unlock(chip->mutex); -- if (sleep_time >= 1000000/HZ) { -- /* -- * Half of the normal delay still remaining -- * can be performed with a sleeping delay instead -- * of busy waiting. -- */ -- msleep(sleep_time/1000); -- timeo -= sleep_time; -- sleep_time = 1000000/HZ; -- } else { -- udelay(1); -- cond_resched(); -- timeo--; -- } -+ cfi_udelay(1); - spin_lock(chip->mutex); -- -- while (chip->state != chip_state) { -- /* Someone's suspended the operation: sleep */ -- DECLARE_WAITQUEUE(wait, current); -- set_current_state(TASK_UNINTERRUPTIBLE); -- add_wait_queue(&chip->wq, &wait); -- spin_unlock(chip->mutex); -- schedule(); -- remove_wait_queue(&chip->wq, &wait); -- spin_lock(chip->mutex); -- } - } - -+ if (!z) { -+ if (!--(*chip_op_time)) -+ *chip_op_time = 1; -+ } else if (z > 1) -+ ++(*chip_op_time); -+ - /* Done and happy. */ - chip->state = FL_STATUS; - return 0; -@@ -1118,7 +1118,8 @@ static int inval_cache_and_wait_for_oper - #endif - - #define WAIT_TIMEOUT(map, chip, adr, udelay) \ -- INVAL_CACHE_AND_WAIT(map, chip, adr, 0, 0, udelay); -+ ({ int __udelay = (udelay); \ -+ INVAL_CACHE_AND_WAIT(map, chip, adr, 0, 0, &__udelay); }) - - - static int do_point_onechip (struct map_info *map, struct flchip *chip, loff_t adr, size_t len) -@@ -1342,7 +1343,7 @@ static int __xipram do_write_oneword(str - - ret = INVAL_CACHE_AND_WAIT(map, chip, adr, - adr, map_bankwidth(map), -- chip->word_write_time); -+ &chip->word_write_time); - if (ret) { - xip_enable(map, chip, adr); - printk(KERN_ERR "%s: word write error (status timeout)\n", map->name); -@@ -1579,7 +1580,7 @@ static int __xipram do_write_buffer(stru - - ret = INVAL_CACHE_AND_WAIT(map, chip, cmd_adr, - adr, len, -- chip->buffer_write_time); -+ &chip->buffer_write_time); - if (ret) { - map_write(map, CMD(0x70), cmd_adr); - chip->state = FL_STATUS; -@@ -1714,7 +1715,7 @@ static int __xipram do_erase_oneblock(st - - ret = INVAL_CACHE_AND_WAIT(map, chip, adr, - adr, len, -- chip->erase_time); -+ &chip->erase_time); - if (ret) { - map_write(map, CMD(0x70), adr); - chip->state = FL_STATUS; diff --git a/target/linux/generic-2.6/patches-2.6.21/010-disable_old_squashfs_compatibility.patch b/target/linux/generic-2.6/patches-2.6.21/010-disable_old_squashfs_compatibility.patch deleted file mode 100644 index 01e27573b..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/010-disable_old_squashfs_compatibility.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- a/fs/squashfs/Makefile -+++ b/fs/squashfs/Makefile -@@ -4,4 +4,3 @@ - - obj-$(CONFIG_SQUASHFS) += squashfs.o - squashfs-y += inode.o --squashfs-y += squashfs2_0.o ---- a/fs/squashfs/squashfs.h -+++ b/fs/squashfs/squashfs.h -@@ -24,6 +24,9 @@ - #ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY - #undef CONFIG_SQUASHFS_1_0_COMPATIBILITY - #endif -+#ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY -+#undef CONFIG_SQUASHFS_2_0_COMPATIBILITY -+#endif - - #ifdef SQUASHFS_TRACE - #define TRACE(s, args...) printk(KERN_NOTICE "SQUASHFS: "s, ## args) diff --git a/target/linux/generic-2.6/patches-2.6.21/011-mips_boot.patch b/target/linux/generic-2.6/patches-2.6.21/011-mips_boot.patch deleted file mode 100644 index 6b1caca01..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/011-mips_boot.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- a/arch/mips/kernel/head.S -+++ b/arch/mips/kernel/head.S -@@ -129,11 +129,15 @@ - #endif - .endm - -+ -+ j kernel_entry -+ nop -+ - /* - * Reserved space for exception handlers. - * Necessary for machines which link their kernels at KSEG0. - */ -- .fill 0x400 -+ .align 10 - - EXPORT(stext) # used for profiling - EXPORT(_stext) diff --git a/target/linux/generic-2.6/patches-2.6.21/012-mips_cpu_tlb.patch b/target/linux/generic-2.6/patches-2.6.21/012-mips_cpu_tlb.patch deleted file mode 100644 index b1a07477e..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/012-mips_cpu_tlb.patch +++ /dev/null @@ -1,18 +0,0 @@ ---- a/arch/mips/mm/tlbex.c -+++ b/arch/mips/mm/tlbex.c -@@ -887,7 +887,6 @@ static __init void build_tlb_write_entry - case CPU_R10000: - case CPU_R12000: - case CPU_R14000: -- case CPU_4KC: - case CPU_SB1: - case CPU_SB1A: - case CPU_4KSC: -@@ -915,6 +914,7 @@ static __init void build_tlb_write_entry - tlbw(p); - break; - -+ case CPU_4KC: - case CPU_4KEC: - case CPU_24K: - case CPU_34K: diff --git a/target/linux/generic-2.6/patches-2.6.21/013-mips_generic_gpio_support.patch b/target/linux/generic-2.6/patches-2.6.21/013-mips_generic_gpio_support.patch deleted file mode 100644 index 9236deac9..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/013-mips_generic_gpio_support.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- a/arch/mips/defconfig -+++ b/arch/mips/defconfig -@@ -69,6 +69,7 @@ CONFIG_GENERIC_FIND_NEXT_BIT=y - CONFIG_GENERIC_HWEIGHT=y - CONFIG_GENERIC_CALIBRATE_DELAY=y - CONFIG_GENERIC_TIME=y -+CONFIG_GENERIC_GPIO=n - CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y - # CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ is not set - CONFIG_ARC=y ---- a/arch/mips/Kconfig -+++ b/arch/mips/Kconfig -@@ -869,6 +869,10 @@ config GENERIC_TIME - bool - default y - -+config GENERIC_GPIO -+ bool -+ default n -+ - config SCHED_NO_NO_OMIT_FRAME_POINTER - bool - default y ---- /dev/null -+++ b/include/asm-mips/gpio.h -@@ -0,0 +1,6 @@ -+#ifndef _ASM_MIPS_GPIO_H -+#define _ASM_MIPS_GPIO_H -+ -+#include -+ -+#endif /* _ASM_MIPS_GPIO_H */ diff --git a/target/linux/generic-2.6/patches-2.6.21/024-mips_disable_fpu.patch b/target/linux/generic-2.6/patches-2.6.21/024-mips_disable_fpu.patch deleted file mode 100644 index 3476d158e..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/024-mips_disable_fpu.patch +++ /dev/null @@ -1,150 +0,0 @@ -MIPS: allow disabling the kernel FPU emulator - -This patch allows turning off the in-kernel Algorithmics -FPU emulator support, which allows one to save a couple of -precious blocks on an embedded system. - -Signed-off-by: Florian Fainelli - ---- a/arch/mips/Kconfig -+++ b/arch/mips/Kconfig -@@ -938,6 +938,17 @@ config LIMITED_DMA - config MIPS_BONITO64 - bool - -+config MIPS_FPU_EMU -+ bool "Enable FPU emulation" -+ default y -+ help -+ This option allows building a kernel with or without the Algorithmics -+ FPU emulator enabled. Turning off this option results in a kernel which -+ does not catch floating operations exceptions. Make sure that your toolchain -+ is configured to enable software floating point emulation in that case. -+ -+ If unsure say Y here. -+ - config MIPS_MSC - bool - ---- a/arch/mips/math-emu/Makefile -+++ b/arch/mips/math-emu/Makefile -@@ -1,11 +1,12 @@ - # - # Makefile for the Linux/MIPS kernel FPU emulation. - # -+obj-y := kernel_linkage.o dsemul.o cp1emu.o - --obj-y := cp1emu.o ieee754m.o ieee754d.o ieee754dp.o ieee754sp.o ieee754.o \ -+obj-$(CONFIG_MIPS_FPU_EMU) += ieee754m.o ieee754d.o ieee754dp.o ieee754sp.o ieee754.o \ - ieee754xcpt.o dp_frexp.o dp_modf.o dp_div.o dp_mul.o dp_sub.o \ - dp_add.o dp_fsp.o dp_cmp.o dp_logb.o dp_scalb.o dp_simple.o \ - dp_tint.o dp_fint.o dp_tlong.o dp_flong.o sp_frexp.o sp_modf.o \ - sp_div.o sp_mul.o sp_sub.o sp_add.o sp_fdp.o sp_cmp.o sp_logb.o \ - sp_scalb.o sp_simple.o sp_tint.o sp_fint.o sp_tlong.o sp_flong.o \ -- dp_sqrt.o sp_sqrt.o kernel_linkage.o dsemul.o -+ dp_sqrt.o sp_sqrt.o ---- a/arch/mips/math-emu/cp1emu.c -+++ b/arch/mips/math-emu/cp1emu.c -@@ -56,6 +56,12 @@ - #endif - #define __mips 4 - -+/* Further private data for which no space exists in mips_fpu_struct */ -+ -+struct mips_fpu_emulator_stats fpuemustats; -+ -+#ifdef CONFIG_MIPS_FPU_EMU -+ - /* Function which emulates a floating point instruction. */ - - static int fpu_emu(struct pt_regs *, struct mips_fpu_struct *, -@@ -66,10 +72,6 @@ static int fpux_emu(struct pt_regs *, - struct mips_fpu_struct *, mips_instruction); - #endif - --/* Further private data for which no space exists in mips_fpu_struct */ -- --struct mips_fpu_emulator_stats fpuemustats; -- - /* Control registers */ - - #define FPCREG_RID 0 /* $0 = revision id */ -@@ -1277,3 +1279,10 @@ int fpu_emulator_cop1Handler(struct pt_r - - return sig; - } -+#else -+int fpu_emulator_cop1Handler(struct pt_regs *xcp, struct mips_fpu_struct *ctx, -+ int has_fpu) -+{ -+ return 0; -+} -+#endif /* CONFIG_MIPS_FPU_EMU */ ---- a/arch/mips/math-emu/dsemul.c -+++ b/arch/mips/math-emu/dsemul.c -@@ -112,6 +112,7 @@ int mips_dsemul(struct pt_regs *regs, mi - return SIGILL; /* force out of emulation loop */ - } - -+#ifdef CONFIG_MIPS_FPU_EMU - int do_dsemulret(struct pt_regs *xcp) - { - struct emuframe *fr; -@@ -167,3 +168,9 @@ int do_dsemulret(struct pt_regs *xcp) - - return 1; - } -+#else -+int do_dsemulret(struct pt_regs *xcp) -+{ -+ return 0; -+} -+#endif /* CONFIG_MIPS_FPU_EMU */ ---- a/arch/mips/math-emu/kernel_linkage.c -+++ b/arch/mips/math-emu/kernel_linkage.c -@@ -28,6 +28,7 @@ - - #define SIGNALLING_NAN 0x7ff800007ff80000LL - -+#ifdef CONFIG_MIPS_FPU_EMU - void fpu_emulator_init_fpu(void) - { - static int first = 1; -@@ -111,4 +112,36 @@ int fpu_emulator_restore_context32(struc - - return err; - } --#endif -+#endif /* CONFIG_64BIT */ -+#else -+ -+void fpu_emulator_init_fpu(void) -+{ -+ printk(KERN_INFO "FPU emulator disabled, make sure your toolchain" -+ "was compiled with software floating point support (soft-float)\n"); -+ return; -+} -+ -+int fpu_emulator_save_context(struct sigcontext __user *sc) -+{ -+ return 0; -+} -+ -+int fpu_emulator_restore_context(struct sigcontext __user *sc) -+{ -+ return 0; -+} -+ -+#ifdef CONFIG_64BIT -+int fpu_emulator_save_context32(struct sigcontext32 __user *sc) -+{ -+ return 0; -+} -+ -+int fpu_emulator_restore_context32(struct sigcontext32 __user *sc) -+{ -+ return 0; -+} -+ -+#endif /* CONFIG_64BIT */ -+#endif /* CONFIG_MIPS_FPU_EMU */ diff --git a/target/linux/generic-2.6/patches-2.6.21/060-rootfs_split.patch b/target/linux/generic-2.6/patches-2.6.21/060-rootfs_split.patch deleted file mode 100644 index 3a773847f..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/060-rootfs_split.patch +++ /dev/null @@ -1,488 +0,0 @@ ---- a/drivers/mtd/Kconfig -+++ b/drivers/mtd/Kconfig -@@ -49,6 +49,16 @@ config MTD_PARTITIONS - devices. Partitioning on NFTL 'devices' is a different - that's the - 'normal' form of partitioning used on a block device. - -+config MTD_ROOTFS_ROOT_DEV -+ bool "Automatically set 'rootfs' partition to be root filesystem" -+ depends on MTD_PARTITIONS -+ default y -+ -+config MTD_ROOTFS_SPLIT -+ bool "Automatically split 'rootfs' partition for squashfs" -+ depends on MTD_PARTITIONS -+ default y -+ - config MTD_REDBOOT_PARTS - tristate "RedBoot partition table parsing" - depends on MTD_PARTITIONS ---- a/drivers/mtd/mtdpart.c -+++ b/drivers/mtd/mtdpart.c -@@ -20,6 +20,8 @@ - #include - #include - #include -+#include -+#include - - /* Our partition linked list */ - static LIST_HEAD(mtd_partitions); -@@ -308,6 +310,266 @@ int del_mtd_partitions(struct mtd_info * - return 0; - } - -+static u_int32_t cur_offset = 0; -+static int add_one_partition(struct mtd_info *master, const struct mtd_partition *part, -+ int i, struct mtd_part **slp) -+{ -+ struct mtd_part *slave; -+ -+ /* allocate the partition structure */ -+ slave = kzalloc (sizeof(*slave), GFP_KERNEL); -+ if (!slave) { -+ printk ("memory allocation error while creating partitions for \"%s\"\n", -+ master->name); -+ del_mtd_partitions(master); -+ return -ENOMEM; -+ } -+ list_add(&slave->list, &mtd_partitions); -+ -+ /* set up the MTD object for this partition */ -+ slave->mtd.type = master->type; -+ slave->mtd.flags = master->flags & ~part->mask_flags; -+ slave->mtd.size = part->size; -+ slave->mtd.writesize = master->writesize; -+ slave->mtd.oobsize = master->oobsize; -+ slave->mtd.oobavail = master->oobavail; -+ slave->mtd.subpage_sft = master->subpage_sft; -+ -+ slave->mtd.name = part->name; -+ slave->mtd.bank_size = master->bank_size; -+ slave->mtd.owner = master->owner; -+ -+ slave->mtd.read = part_read; -+ slave->mtd.write = part_write; -+ -+ if(master->point && master->unpoint){ -+ slave->mtd.point = part_point; -+ slave->mtd.unpoint = part_unpoint; -+ } -+ -+ if (master->read_oob) -+ slave->mtd.read_oob = part_read_oob; -+ if (master->write_oob) -+ slave->mtd.write_oob = part_write_oob; -+ if(master->read_user_prot_reg) -+ slave->mtd.read_user_prot_reg = part_read_user_prot_reg; -+ if(master->read_fact_prot_reg) -+ slave->mtd.read_fact_prot_reg = part_read_fact_prot_reg; -+ if(master->write_user_prot_reg) -+ slave->mtd.write_user_prot_reg = part_write_user_prot_reg; -+ if(master->lock_user_prot_reg) -+ slave->mtd.lock_user_prot_reg = part_lock_user_prot_reg; -+ if(master->get_user_prot_info) -+ slave->mtd.get_user_prot_info = part_get_user_prot_info; -+ if(master->get_fact_prot_info) -+ slave->mtd.get_fact_prot_info = part_get_fact_prot_info; -+ if (master->sync) -+ slave->mtd.sync = part_sync; -+ if (!i && master->suspend && master->resume) { -+ slave->mtd.suspend = part_suspend; -+ slave->mtd.resume = part_resume; -+ } -+ if (master->writev) -+ slave->mtd.writev = part_writev; -+ if (master->lock) -+ slave->mtd.lock = part_lock; -+ if (master->unlock) -+ slave->mtd.unlock = part_unlock; -+ if (master->block_isbad) -+ slave->mtd.block_isbad = part_block_isbad; -+ if (master->block_markbad) -+ slave->mtd.block_markbad = part_block_markbad; -+ slave->mtd.erase = part_erase; -+ slave->master = master; -+ slave->offset = part->offset; -+ slave->index = i; -+ -+ if (slave->offset == MTDPART_OFS_APPEND) -+ slave->offset = cur_offset; -+ if (slave->offset == MTDPART_OFS_NXTBLK) { -+ slave->offset = cur_offset; -+ if ((cur_offset % master->erasesize) != 0) { -+ /* Round up to next erasesize */ -+ slave->offset = ((cur_offset / master->erasesize) + 1) * master->erasesize; -+ printk(KERN_NOTICE "Moving partition %d: " -+ "0x%08x -> 0x%08x\n", i, -+ cur_offset, slave->offset); -+ } -+ } -+ if (slave->mtd.size == MTDPART_SIZ_FULL) -+ slave->mtd.size = master->size - slave->offset; -+ cur_offset = slave->offset + slave->mtd.size; -+ -+ printk (KERN_NOTICE "0x%08x-0x%08x : \"%s\"\n", slave->offset, -+ slave->offset + slave->mtd.size, slave->mtd.name); -+ -+ /* let's do some sanity checks */ -+ if (slave->offset >= master->size) { -+ /* let's register it anyway to preserve ordering */ -+ slave->offset = 0; -+ slave->mtd.size = 0; -+ printk ("mtd: partition \"%s\" is out of reach -- disabled\n", -+ part->name); -+ } -+ if (slave->offset + slave->mtd.size > master->size) { -+ slave->mtd.size = master->size - slave->offset; -+ printk ("mtd: partition \"%s\" extends beyond the end of device \"%s\" -- size truncated to %#x\n", -+ part->name, master->name, slave->mtd.size); -+ } -+ if (master->numeraseregions>1) { -+ /* Deal with variable erase size stuff */ -+ int i; -+ struct mtd_erase_region_info *regions = master->eraseregions; -+ -+ /* Find the first erase regions which is part of this partition. */ -+ for (i=0; i < master->numeraseregions && slave->offset >= regions[i].offset; i++) -+ ; -+ -+ for (i--; i < master->numeraseregions && slave->offset + slave->mtd.size > regions[i].offset; i++) { -+ if (slave->mtd.erasesize < regions[i].erasesize) { -+ slave->mtd.erasesize = regions[i].erasesize; -+ } -+ } -+ } else { -+ /* Single erase size */ -+ slave->mtd.erasesize = master->erasesize; -+ } -+ -+ if ((slave->mtd.flags & MTD_WRITEABLE) && -+ (slave->offset % slave->mtd.erasesize)) { -+ /* Doesn't start on a boundary of major erase size */ -+ /* FIXME: Let it be writable if it is on a boundary of _minor_ erase size though */ -+ slave->mtd.flags &= ~MTD_WRITEABLE; -+ printk ("mtd: partition \"%s\" doesn't start on an erase block boundary -- force read-only\n", -+ part->name); -+ } -+ if ((slave->mtd.flags & MTD_WRITEABLE) && -+ (slave->mtd.size % slave->mtd.erasesize)) { -+ slave->mtd.flags &= ~MTD_WRITEABLE; -+ printk ("mtd: partition \"%s\" doesn't end on an erase block -- force read-only\n", -+ part->name); -+ } -+ -+ slave->mtd.ecclayout = master->ecclayout; -+ if (master->block_isbad) { -+ uint32_t offs = 0; -+ -+ while(offs < slave->mtd.size) { -+ if (master->block_isbad(master, -+ offs + slave->offset)) -+ slave->mtd.ecc_stats.badblocks++; -+ offs += slave->mtd.erasesize; -+ } -+ } -+ -+ if(part->mtdp) -+ { /* store the object pointer (caller may or may not register it */ -+ *part->mtdp = &slave->mtd; -+ slave->registered = 0; -+ } -+ else -+ { -+ /* register our partition */ -+ add_mtd_device(&slave->mtd); -+ slave->registered = 1; -+ } -+ -+ if (slp) -+ *slp = slave; -+ -+ return 0; -+} -+ -+#ifdef CONFIG_MTD_ROOTFS_SPLIT -+#define ROOTFS_SPLIT_NAME "rootfs_data" -+static int split_squashfs(struct mtd_info *master, struct mtd_partition *old, -+ struct mtd_partition **new) -+{ -+ struct mtd_partition *part = NULL; -+ int len; -+ char buf[512]; -+ struct squashfs_super_block *sb = (struct squashfs_super_block *) buf; -+ int ret; -+ -+ ret = master->read(master, old->offset, sizeof(*sb), &len, buf); -+ if (ret) { -+ printk(KERN_ALERT "split_squashfs: error occured while reading " -+ "from \"%s\"\n", master->name); -+ goto out; -+ } -+ -+ if (len != sizeof(*sb)) { -+ printk(KERN_ALERT "split_squashfs: unable to read superblock " -+ "from \"%s\"\n", master->name); -+ ret=-1; -+ goto out; -+ } -+ -+ if (*((u32 *) buf) != SQUASHFS_MAGIC) { -+ printk(KERN_ALERT "split_squasfs: no squashfs found in \"%s\"\n", -+ master->name); -+ ret=0; -+ goto out; -+ } -+ -+ if (sb->bytes_used <= 0) { -+ printk(KERN_ALERT "split_squashfs: squashfs is empty in \"%s\"\n", -+ master->name); -+ ret=0; -+ goto out; -+ } -+ -+ part = kmalloc(sizeof(*part)+sizeof(ROOTFS_SPLIT_NAME)+1, GFP_KERNEL); -+ if (part == NULL) { -+ printk(KERN_INFO "split_squashfs: no memory for partition \"%s\"\n", -+ ROOTFS_SPLIT_NAME); -+ ret = -ENOMEM; -+ goto out; -+ } -+ -+ memcpy(part, old, sizeof(*part)); -+ part->name = (unsigned char *)&part[1]; -+ strcpy(part->name, ROOTFS_SPLIT_NAME); -+ -+ len = (u32) sb->bytes_used; -+ len += (part->offset & 0x000fffff); -+ len += (master->erasesize - 1); -+ len &= ~(master->erasesize - 1); -+ len -= (part->offset & 0x000fffff); -+ part->offset += len; -+ part->size -= len; -+ -+ ret = 0; -+ -+out: -+ *new = part; -+ return ret; -+} -+ -+static int split_rootfs_data(struct mtd_info *master, struct mtd_partition *part, -+ int index) -+{ -+ struct mtd_partition *dpart; -+ int ret; -+ -+ ret = split_squashfs(master, part, &dpart); -+ if (ret) -+ return ret; -+ -+ if (dpart == NULL) -+ return 1; -+ -+ printk(KERN_INFO "mtd: partition \"%s\" created automatically, ofs=%X, len=%X \n", -+ ROOTFS_SPLIT_NAME, dpart->offset, dpart->size); -+ -+ ret = add_one_partition(master, dpart, index, NULL); -+ if (ret) -+ kfree(dpart); -+ -+ return ret; -+} -+#endif /* CONFIG_MTD_ROOTFS_SPLIT */ -+ - /* - * This function, given a master MTD object and a partition table, creates - * and registers slave MTD objects which are bound to the master according to -@@ -320,169 +582,31 @@ int add_mtd_partitions(struct mtd_info * - int nbparts) - { - struct mtd_part *slave; -- u_int32_t cur_offset = 0; -- int i; -+ struct mtd_partition *part; -+ int i, j, ret = 0; - - printk (KERN_NOTICE "Creating %d MTD partitions on \"%s\":\n", nbparts, master->name); - -- for (i = 0; i < nbparts; i++) { -- -- /* allocate the partition structure */ -- slave = kzalloc (sizeof(*slave), GFP_KERNEL); -- if (!slave) { -- printk ("memory allocation error while creating partitions for \"%s\"\n", -- master->name); -- del_mtd_partitions(master); -- return -ENOMEM; -- } -- list_add(&slave->list, &mtd_partitions); -- -- /* set up the MTD object for this partition */ -- slave->mtd.type = master->type; -- slave->mtd.flags = master->flags & ~parts[i].mask_flags; -- slave->mtd.size = parts[i].size; -- slave->mtd.writesize = master->writesize; -- slave->mtd.oobsize = master->oobsize; -- slave->mtd.oobavail = master->oobavail; -- slave->mtd.subpage_sft = master->subpage_sft; -- -- slave->mtd.name = parts[i].name; -- slave->mtd.bank_size = master->bank_size; -- slave->mtd.owner = master->owner; -- -- slave->mtd.read = part_read; -- slave->mtd.write = part_write; -- -- if(master->point && master->unpoint){ -- slave->mtd.point = part_point; -- slave->mtd.unpoint = part_unpoint; -- } -- -- if (master->read_oob) -- slave->mtd.read_oob = part_read_oob; -- if (master->write_oob) -- slave->mtd.write_oob = part_write_oob; -- if(master->read_user_prot_reg) -- slave->mtd.read_user_prot_reg = part_read_user_prot_reg; -- if(master->read_fact_prot_reg) -- slave->mtd.read_fact_prot_reg = part_read_fact_prot_reg; -- if(master->write_user_prot_reg) -- slave->mtd.write_user_prot_reg = part_write_user_prot_reg; -- if(master->lock_user_prot_reg) -- slave->mtd.lock_user_prot_reg = part_lock_user_prot_reg; -- if(master->get_user_prot_info) -- slave->mtd.get_user_prot_info = part_get_user_prot_info; -- if(master->get_fact_prot_info) -- slave->mtd.get_fact_prot_info = part_get_fact_prot_info; -- if (master->sync) -- slave->mtd.sync = part_sync; -- if (!i && master->suspend && master->resume) { -- slave->mtd.suspend = part_suspend; -- slave->mtd.resume = part_resume; -- } -- if (master->writev) -- slave->mtd.writev = part_writev; -- if (master->lock) -- slave->mtd.lock = part_lock; -- if (master->unlock) -- slave->mtd.unlock = part_unlock; -- if (master->block_isbad) -- slave->mtd.block_isbad = part_block_isbad; -- if (master->block_markbad) -- slave->mtd.block_markbad = part_block_markbad; -- slave->mtd.erase = part_erase; -- slave->master = master; -- slave->offset = parts[i].offset; -- slave->index = i; -- -- if (slave->offset == MTDPART_OFS_APPEND) -- slave->offset = cur_offset; -- if (slave->offset == MTDPART_OFS_NXTBLK) { -- slave->offset = cur_offset; -- if ((cur_offset % master->erasesize) != 0) { -- /* Round up to next erasesize */ -- slave->offset = ((cur_offset / master->erasesize) + 1) * master->erasesize; -- printk(KERN_NOTICE "Moving partition %d: " -- "0x%08x -> 0x%08x\n", i, -- cur_offset, slave->offset); -- } -- } -- if (slave->mtd.size == MTDPART_SIZ_FULL) -- slave->mtd.size = master->size - slave->offset; -- cur_offset = slave->offset + slave->mtd.size; -- -- printk (KERN_NOTICE "0x%08x-0x%08x : \"%s\"\n", slave->offset, -- slave->offset + slave->mtd.size, slave->mtd.name); -- -- /* let's do some sanity checks */ -- if (slave->offset >= master->size) { -- /* let's register it anyway to preserve ordering */ -- slave->offset = 0; -- slave->mtd.size = 0; -- printk ("mtd: partition \"%s\" is out of reach -- disabled\n", -- parts[i].name); -- } -- if (slave->offset + slave->mtd.size > master->size) { -- slave->mtd.size = master->size - slave->offset; -- printk ("mtd: partition \"%s\" extends beyond the end of device \"%s\" -- size truncated to %#x\n", -- parts[i].name, master->name, slave->mtd.size); -- } -- if (master->numeraseregions>1) { -- /* Deal with variable erase size stuff */ -- int i; -- struct mtd_erase_region_info *regions = master->eraseregions; -- -- /* Find the first erase regions which is part of this partition. */ -- for (i=0; i < master->numeraseregions && slave->offset >= regions[i].offset; i++) -- ; -- -- for (i--; i < master->numeraseregions && slave->offset + slave->mtd.size > regions[i].offset; i++) { -- if (slave->mtd.erasesize < regions[i].erasesize) { -- slave->mtd.erasesize = regions[i].erasesize; -- } -- } -- } else { -- /* Single erase size */ -- slave->mtd.erasesize = master->erasesize; -- } -- -- if ((slave->mtd.flags & MTD_WRITEABLE) && -- (slave->offset % slave->mtd.erasesize)) { -- /* Doesn't start on a boundary of major erase size */ -- /* FIXME: Let it be writable if it is on a boundary of _minor_ erase size though */ -- slave->mtd.flags &= ~MTD_WRITEABLE; -- printk ("mtd: partition \"%s\" doesn't start on an erase block boundary -- force read-only\n", -- parts[i].name); -- } -- if ((slave->mtd.flags & MTD_WRITEABLE) && -- (slave->mtd.size % slave->mtd.erasesize)) { -- slave->mtd.flags &= ~MTD_WRITEABLE; -- printk ("mtd: partition \"%s\" doesn't end on an erase block -- force read-only\n", -- parts[i].name); -- } -- -- slave->mtd.ecclayout = master->ecclayout; -- if (master->block_isbad) { -- uint32_t offs = 0; -- -- while(offs < slave->mtd.size) { -- if (master->block_isbad(master, -- offs + slave->offset)) -- slave->mtd.ecc_stats.badblocks++; -- offs += slave->mtd.erasesize; -+ for (i = 0, j = 0; i < nbparts; i++) { -+ part = (struct mtd_partition *) &parts[i]; -+ ret = add_one_partition(master, part, j, &slave); -+ if (ret) -+ return ret; -+ j++; -+ -+ if (strcmp(part->name, "rootfs") == 0 && slave->registered) { -+#ifdef CONFIG_MTD_ROOTFS_ROOT_DEV -+ if (ROOT_DEV == 0) { -+ printk(KERN_NOTICE "mtd: partition \"rootfs\" " -+ "set to be root filesystem\n"); -+ ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, slave->mtd.index); - } -- } -- -- if(parts[i].mtdp) -- { /* store the object pointer (caller may or may not register it */ -- *parts[i].mtdp = &slave->mtd; -- slave->registered = 0; -- } -- else -- { -- /* register our partition */ -- add_mtd_device(&slave->mtd); -- slave->registered = 1; -+#endif -+#ifdef CONFIG_MTD_ROOTFS_SPLIT -+ ret = split_rootfs_data(master, part, j); -+ if (ret == 0) -+ j++; -+#endif - } - } - diff --git a/target/linux/generic-2.6/patches-2.6.21/065-block2mtd_init.patch b/target/linux/generic-2.6/patches-2.6.21/065-block2mtd_init.patch deleted file mode 100644 index 6c7d11428..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/065-block2mtd_init.patch +++ /dev/null @@ -1,112 +0,0 @@ ---- a/drivers/mtd/devices/block2mtd.c -+++ b/drivers/mtd/devices/block2mtd.c -@@ -16,6 +16,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -288,10 +289,11 @@ static void block2mtd_free_device(struct - - - /* FIXME: ensure that mtd->size % erase_size == 0 */ --static struct block2mtd_dev *add_device(char *devname, int erase_size) -+static struct block2mtd_dev *add_device(char *devname, int erase_size, char *mtdname) - { - struct block_device *bdev; - struct block2mtd_dev *dev; -+ struct mtd_partition *part; - - if (!devname) - return NULL; -@@ -330,14 +332,18 @@ static struct block2mtd_dev *add_device( - - /* Setup the MTD structure */ - /* make the name contain the block device in */ -- dev->mtd.name = kmalloc(sizeof("block2mtd: ") + strlen(devname), -- GFP_KERNEL); -+ -+ if (!mtdname) -+ mtdname = devname; -+ -+ dev->mtd.name = kmalloc(strlen(mtdname) + 1, GFP_KERNEL); -+ - if (!dev->mtd.name) - goto devinit_err; -+ -+ strcpy(dev->mtd.name, mtdname); - -- sprintf(dev->mtd.name, "block2mtd: %s", devname); -- -- dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK; -+ dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK & ~(erase_size - 1); - dev->mtd.erasesize = erase_size; - dev->mtd.writesize = 1; - dev->mtd.type = MTD_RAM; -@@ -349,15 +355,18 @@ static struct block2mtd_dev *add_device( - dev->mtd.read = block2mtd_read; - dev->mtd.priv = dev; - dev->mtd.owner = THIS_MODULE; -- -- if (add_mtd_device(&dev->mtd)) { -+ -+ part = kzalloc(sizeof(struct mtd_partition), GFP_KERNEL); -+ part->name = dev->mtd.name; -+ part->offset = 0; -+ part->size = dev->mtd.size; -+ if (add_mtd_partitions(&dev->mtd, part, 1)) { - /* Device didnt get added, so free the entry */ - goto devinit_err; - } - list_add(&dev->list, &blkmtd_device_list); - INFO("mtd%d: [%s] erase_size = %dKiB [%d]", dev->mtd.index, -- dev->mtd.name + strlen("blkmtd: "), -- dev->mtd.erasesize >> 10, dev->mtd.erasesize); -+ mtdname, dev->mtd.erasesize >> 10, dev->mtd.erasesize); - return dev; - - devinit_err: -@@ -430,9 +439,9 @@ static __initdata char block2mtd_paramli - - static int block2mtd_setup2(const char *val) - { -- char buf[80 + 12]; /* 80 for device, 12 for erase size */ -+ char buf[80 + 12 + 80]; /* 80 for device, 12 for erase size, 80 for name */ - char *str = buf; -- char *token[2]; -+ char *token[3]; - char *name; - size_t erase_size = PAGE_SIZE; - int i, ret; -@@ -443,7 +452,7 @@ static int block2mtd_setup2(const char * - strcpy(str, val); - kill_final_newline(str); - -- for (i = 0; i < 2; i++) -+ for (i = 0; i < 3; i++) - token[i] = strsep(&str, ","); - - if (str) -@@ -463,8 +472,10 @@ static int block2mtd_setup2(const char * - parse_err("illegal erase size"); - } - } -+ if (token[2] && (strlen(token[2]) + 1 > 80)) -+ parse_err("mtd device name too long"); - -- add_device(name, erase_size); -+ add_device(name, erase_size, token[2]); - - return 0; - } -@@ -498,7 +509,7 @@ static int block2mtd_setup(const char *v - - - module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200); --MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=[,]\""); -+MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=[,[,]]\""); - - static int __init block2mtd_init(void) - { diff --git a/target/linux/generic-2.6/patches-2.6.21/100-netfilter_layer7_2.21.patch b/target/linux/generic-2.6/patches-2.6.21/100-netfilter_layer7_2.21.patch deleted file mode 100644 index 403b7d0e4..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/100-netfilter_layer7_2.21.patch +++ /dev/null @@ -1,2106 +0,0 @@ ---- /dev/null -+++ b/include/linux/netfilter/xt_layer7.h -@@ -0,0 +1,13 @@ -+#ifndef _XT_LAYER7_H -+#define _XT_LAYER7_H -+ -+#define MAX_PATTERN_LEN 8192 -+#define MAX_PROTOCOL_LEN 256 -+ -+struct xt_layer7_info { -+ char protocol[MAX_PROTOCOL_LEN]; -+ char invert:1; -+ char pattern[MAX_PATTERN_LEN]; -+}; -+ -+#endif /* _XT_LAYER7_H */ ---- a/include/net/netfilter/nf_conntrack.h -+++ b/include/net/netfilter/nf_conntrack.h -@@ -128,6 +128,22 @@ struct nf_conn - u_int32_t secmark; - #endif - -+#if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || \ -+ defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE) -+ struct { -+ /* -+ * e.g. "http". NULL before decision. "unknown" after decision -+ * if no match. -+ */ -+ char *app_proto; -+ /* -+ * application layer data so far. NULL after match decision. -+ */ -+ char *app_data; -+ unsigned int app_data_len; -+ } layer7; -+#endif -+ - /* Storage reserved for other modules: */ - union nf_conntrack_proto proto; - ---- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c -+++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c -@@ -163,6 +163,12 @@ static int ct_seq_show(struct seq_file * - return -ENOSPC; - #endif - -+#if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE) -+ if(ct->layer7.app_proto) -+ if(seq_printf(s, "l7proto=%s ", ct->layer7.app_proto)) -+ return -ENOSPC; -+#endif -+ - if (seq_printf(s, "use=%u\n", atomic_read(&ct->ct_general.use))) - return -ENOSPC; - ---- a/net/netfilter/Kconfig -+++ b/net/netfilter/Kconfig -@@ -640,6 +640,27 @@ config NETFILTER_XT_MATCH_STATE - - To compile it as a module, choose M here. If unsure, say N. - -+config NETFILTER_XT_MATCH_LAYER7 -+ tristate '"layer7" match support' -+ depends on NETFILTER_XTABLES -+ depends on IP_NF_CONNTRACK || NF_CONNTRACK -+ depends on NF_CT_ACCT -+ help -+ Say Y if you want to be able to classify connections (and their -+ packets) based on regular expression matching of their application -+ layer data. This is one way to classify applications such as -+ peer-to-peer filesharing systems that do not always use the same -+ port. -+ -+ To compile it as a module, choose M here. If unsure, say N. -+ -+config NETFILTER_XT_MATCH_LAYER7_DEBUG -+ bool 'layer7 debugging output' -+ depends on NETFILTER_XT_MATCH_LAYER7 -+ help -+ Say Y to get lots of debugging output. -+ -+ - config NETFILTER_XT_MATCH_STATISTIC - tristate '"statistic" match support' - depends on NETFILTER_XTABLES ---- a/net/netfilter/Makefile -+++ b/net/netfilter/Makefile -@@ -68,6 +68,7 @@ obj-$(CONFIG_NETFILTER_XT_MATCH_QUOTA) + - obj-$(CONFIG_NETFILTER_XT_MATCH_REALM) += xt_realm.o - obj-$(CONFIG_NETFILTER_XT_MATCH_SCTP) += xt_sctp.o - obj-$(CONFIG_NETFILTER_XT_MATCH_STATE) += xt_state.o -+obj-$(CONFIG_NETFILTER_XT_MATCH_LAYER7) += xt_layer7.o - obj-$(CONFIG_NETFILTER_XT_MATCH_STATISTIC) += xt_statistic.o - obj-$(CONFIG_NETFILTER_XT_MATCH_STRING) += xt_string.o - obj-$(CONFIG_NETFILTER_XT_MATCH_TCPMSS) += xt_tcpmss.o ---- a/net/netfilter/nf_conntrack_core.c -+++ b/net/netfilter/nf_conntrack_core.c -@@ -352,6 +352,14 @@ destroy_conntrack(struct nf_conntrack *n - * too. */ - nf_ct_remove_expectations(ct); - -+ #if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE) -+ if(ct->layer7.app_proto) -+ kfree(ct->layer7.app_proto); -+ if(ct->layer7.app_data) -+ kfree(ct->layer7.app_data); -+ #endif -+ -+ - /* We overload first tuple to link into unconfirmed list. */ - if (!nf_ct_is_confirmed(ct)) { - BUG_ON(list_empty(&ct->tuplehash[IP_CT_DIR_ORIGINAL].list)); ---- a/net/netfilter/nf_conntrack_standalone.c -+++ b/net/netfilter/nf_conntrack_standalone.c -@@ -195,6 +195,11 @@ static int ct_seq_show(struct seq_file * - return -ENOSPC; - #endif - -+#if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE) -+ if(conntrack->layer7.app_proto) -+ if(seq_printf(s, "l7proto=%s ",conntrack->layer7.app_proto)) -+ return -ENOSPC; -+#endif - if (seq_printf(s, "use=%u\n", atomic_read(&conntrack->ct_general.use))) - return -ENOSPC; - ---- /dev/null -+++ b/net/netfilter/regexp/regexp.c -@@ -0,0 +1,1197 @@ -+/* -+ * regcomp and regexec -- regsub and regerror are elsewhere -+ * @(#)regexp.c 1.3 of 18 April 87 -+ * -+ * Copyright (c) 1986 by University of Toronto. -+ * Written by Henry Spencer. Not derived from licensed software. -+ * -+ * Permission is granted to anyone to use this software for any -+ * purpose on any computer system, and to redistribute it freely, -+ * subject to the following restrictions: -+ * -+ * 1. The author is not responsible for the consequences of use of -+ * this software, no matter how awful, even if they arise -+ * from defects in it. -+ * -+ * 2. The origin of this software must not be misrepresented, either -+ * by explicit claim or by omission. -+ * -+ * 3. Altered versions must be plainly marked as such, and must not -+ * be misrepresented as being the original software. -+ * -+ * Beware that some of this code is subtly aware of the way operator -+ * precedence is structured in regular expressions. Serious changes in -+ * regular-expression syntax might require a total rethink. -+ * -+ * This code was modified by Ethan Sommer to work within the kernel -+ * (it now uses kmalloc etc..) -+ * -+ * Modified slightly by Matthew Strait to use more modern C. -+ */ -+ -+#include "regexp.h" -+#include "regmagic.h" -+ -+/* added by ethan and matt. Lets it work in both kernel and user space. -+(So iptables can use it, for instance.) Yea, it goes both ways... */ -+#if __KERNEL__ -+ #define malloc(foo) kmalloc(foo,GFP_ATOMIC) -+#else -+ #define printk(format,args...) printf(format,##args) -+#endif -+ -+void regerror(char * s) -+{ -+ printk("<3>Regexp: %s\n", s); -+ /* NOTREACHED */ -+} -+ -+/* -+ * The "internal use only" fields in regexp.h are present to pass info from -+ * compile to execute that permits the execute phase to run lots faster on -+ * simple cases. They are: -+ * -+ * regstart char that must begin a match; '\0' if none obvious -+ * reganch is the match anchored (at beginning-of-line only)? -+ * regmust string (pointer into program) that match must include, or NULL -+ * regmlen length of regmust string -+ * -+ * Regstart and reganch permit very fast decisions on suitable starting points -+ * for a match, cutting down the work a lot. Regmust permits fast rejection -+ * of lines that cannot possibly match. The regmust tests are costly enough -+ * that regcomp() supplies a regmust only if the r.e. contains something -+ * potentially expensive (at present, the only such thing detected is * or + -+ * at the start of the r.e., which can involve a lot of backup). Regmlen is -+ * supplied because the test in regexec() needs it and regcomp() is computing -+ * it anyway. -+ */ -+ -+/* -+ * Structure for regexp "program". This is essentially a linear encoding -+ * of a nondeterministic finite-state machine (aka syntax charts or -+ * "railroad normal form" in parsing technology). Each node is an opcode -+ * plus a "next" pointer, possibly plus an operand. "Next" pointers of -+ * all nodes except BRANCH implement concatenation; a "next" pointer with -+ * a BRANCH on both ends of it is connecting two alternatives. (Here we -+ * have one of the subtle syntax dependencies: an individual BRANCH (as -+ * opposed to a collection of them) is never concatenated with anything -+ * because of operator precedence.) The operand of some types of node is -+ * a literal string; for others, it is a node leading into a sub-FSM. In -+ * particular, the operand of a BRANCH node is the first node of the branch. -+ * (NB this is *not* a tree structure: the tail of the branch connects -+ * to the thing following the set of BRANCHes.) The opcodes are: -+ */ -+ -+/* definition number opnd? meaning */ -+#define END 0 /* no End of program. */ -+#define BOL 1 /* no Match "" at beginning of line. */ -+#define EOL 2 /* no Match "" at end of line. */ -+#define ANY 3 /* no Match any one character. */ -+#define ANYOF 4 /* str Match any character in this string. */ -+#define ANYBUT 5 /* str Match any character not in this string. */ -+#define BRANCH 6 /* node Match this alternative, or the next... */ -+#define BACK 7 /* no Match "", "next" ptr points backward. */ -+#define EXACTLY 8 /* str Match this string. */ -+#define NOTHING 9 /* no Match empty string. */ -+#define STAR 10 /* node Match this (simple) thing 0 or more times. */ -+#define PLUS 11 /* node Match this (simple) thing 1 or more times. */ -+#define OPEN 20 /* no Mark this point in input as start of #n. */ -+ /* OPEN+1 is number 1, etc. */ -+#define CLOSE 30 /* no Analogous to OPEN. */ -+ -+/* -+ * Opcode notes: -+ * -+ * BRANCH The set of branches constituting a single choice are hooked -+ * together with their "next" pointers, since precedence prevents -+ * anything being concatenated to any individual branch. The -+ * "next" pointer of the last BRANCH in a choice points to the -+ * thing following the whole choice. This is also where the -+ * final "next" pointer of each individual branch points; each -+ * branch starts with the operand node of a BRANCH node. -+ * -+ * BACK Normal "next" pointers all implicitly point forward; BACK -+ * exists to make loop structures possible. -+ * -+ * STAR,PLUS '?', and complex '*' and '+', are implemented as circular -+ * BRANCH structures using BACK. Simple cases (one character -+ * per match) are implemented with STAR and PLUS for speed -+ * and to minimize recursive plunges. -+ * -+ * OPEN,CLOSE ...are numbered at compile time. -+ */ -+ -+/* -+ * A node is one char of opcode followed by two chars of "next" pointer. -+ * "Next" pointers are stored as two 8-bit pieces, high order first. The -+ * value is a positive offset from the opcode of the node containing it. -+ * An operand, if any, simply follows the node. (Note that much of the -+ * code generation knows about this implicit relationship.) -+ * -+ * Using two bytes for the "next" pointer is vast overkill for most things, -+ * but allows patterns to get big without disasters. -+ */ -+#define OP(p) (*(p)) -+#define NEXT(p) (((*((p)+1)&0377)<<8) + (*((p)+2)&0377)) -+#define OPERAND(p) ((p) + 3) -+ -+/* -+ * See regmagic.h for one further detail of program structure. -+ */ -+ -+ -+/* -+ * Utility definitions. -+ */ -+#ifndef CHARBITS -+#define UCHARAT(p) ((int)*(unsigned char *)(p)) -+#else -+#define UCHARAT(p) ((int)*(p)&CHARBITS) -+#endif -+ -+#define FAIL(m) { regerror(m); return(NULL); } -+#define ISMULT(c) ((c) == '*' || (c) == '+' || (c) == '?') -+#define META "^$.[()|?+*\\" -+ -+/* -+ * Flags to be passed up and down. -+ */ -+#define HASWIDTH 01 /* Known never to match null string. */ -+#define SIMPLE 02 /* Simple enough to be STAR/PLUS operand. */ -+#define SPSTART 04 /* Starts with * or +. */ -+#define WORST 0 /* Worst case. */ -+ -+/* -+ * Global work variables for regcomp(). -+ */ -+struct match_globals { -+char *reginput; /* String-input pointer. */ -+char *regbol; /* Beginning of input, for ^ check. */ -+char **regstartp; /* Pointer to startp array. */ -+char **regendp; /* Ditto for endp. */ -+char *regparse; /* Input-scan pointer. */ -+int regnpar; /* () count. */ -+char regdummy; -+char *regcode; /* Code-emit pointer; ®dummy = don't. */ -+long regsize; /* Code size. */ -+}; -+ -+/* -+ * Forward declarations for regcomp()'s friends. -+ */ -+#ifndef STATIC -+#define STATIC static -+#endif -+STATIC char *reg(struct match_globals *g, int paren,int *flagp); -+STATIC char *regbranch(struct match_globals *g, int *flagp); -+STATIC char *regpiece(struct match_globals *g, int *flagp); -+STATIC char *regatom(struct match_globals *g, int *flagp); -+STATIC char *regnode(struct match_globals *g, char op); -+STATIC char *regnext(struct match_globals *g, char *p); -+STATIC void regc(struct match_globals *g, char b); -+STATIC void reginsert(struct match_globals *g, char op, char *opnd); -+STATIC void regtail(struct match_globals *g, char *p, char *val); -+STATIC void regoptail(struct match_globals *g, char *p, char *val); -+ -+ -+__kernel_size_t my_strcspn(const char *s1,const char *s2) -+{ -+ char *scan1; -+ char *scan2; -+ int count; -+ -+ count = 0; -+ for (scan1 = (char *)s1; *scan1 != '\0'; scan1++) { -+ for (scan2 = (char *)s2; *scan2 != '\0';) /* ++ moved down. */ -+ if (*scan1 == *scan2++) -+ return(count); -+ count++; -+ } -+ return(count); -+} -+ -+/* -+ - regcomp - compile a regular expression into internal code -+ * -+ * We can't allocate space until we know how big the compiled form will be, -+ * but we can't compile it (and thus know how big it is) until we've got a -+ * place to put the code. So we cheat: we compile it twice, once with code -+ * generation turned off and size counting turned on, and once "for real". -+ * This also means that we don't allocate space until we are sure that the -+ * thing really will compile successfully, and we never have to move the -+ * code and thus invalidate pointers into it. (Note that it has to be in -+ * one piece because free() must be able to free it all.) -+ * -+ * Beware that the optimization-preparation code in here knows about some -+ * of the structure of the compiled regexp. -+ */ -+regexp * -+regcomp(char *exp,int *patternsize) -+{ -+ register regexp *r; -+ register char *scan; -+ register char *longest; -+ register int len; -+ int flags; -+ struct match_globals g; -+ -+ /* commented out by ethan -+ extern char *malloc(); -+ */ -+ -+ if (exp == NULL) -+ FAIL("NULL argument"); -+ -+ /* First pass: determine size, legality. */ -+ g.regparse = exp; -+ g.regnpar = 1; -+ g.regsize = 0L; -+ g.regcode = &g.regdummy; -+ regc(&g, MAGIC); -+ if (reg(&g, 0, &flags) == NULL) -+ return(NULL); -+ -+ /* Small enough for pointer-storage convention? */ -+ if (g.regsize >= 32767L) /* Probably could be 65535L. */ -+ FAIL("regexp too big"); -+ -+ /* Allocate space. */ -+ *patternsize=sizeof(regexp) + (unsigned)g.regsize; -+ r = (regexp *)malloc(sizeof(regexp) + (unsigned)g.regsize); -+ if (r == NULL) -+ FAIL("out of space"); -+ -+ /* Second pass: emit code. */ -+ g.regparse = exp; -+ g.regnpar = 1; -+ g.regcode = r->program; -+ regc(&g, MAGIC); -+ if (reg(&g, 0, &flags) == NULL) -+ return(NULL); -+ -+ /* Dig out information for optimizations. */ -+ r->regstart = '\0'; /* Worst-case defaults. */ -+ r->reganch = 0; -+ r->regmust = NULL; -+ r->regmlen = 0; -+ scan = r->program+1; /* First BRANCH. */ -+ if (OP(regnext(&g, scan)) == END) { /* Only one top-level choice. */ -+ scan = OPERAND(scan); -+ -+ /* Starting-point info. */ -+ if (OP(scan) == EXACTLY) -+ r->regstart = *OPERAND(scan); -+ else if (OP(scan) == BOL) -+ r->reganch++; -+ -+ /* -+ * If there's something expensive in the r.e., find the -+ * longest literal string that must appear and make it the -+ * regmust. Resolve ties in favor of later strings, since -+ * the regstart check works with the beginning of the r.e. -+ * and avoiding duplication strengthens checking. Not a -+ * strong reason, but sufficient in the absence of others. -+ */ -+ if (flags&SPSTART) { -+ longest = NULL; -+ len = 0; -+ for (; scan != NULL; scan = regnext(&g, scan)) -+ if (OP(scan) == EXACTLY && strlen(OPERAND(scan)) >= len) { -+ longest = OPERAND(scan); -+ len = strlen(OPERAND(scan)); -+ } -+ r->regmust = longest; -+ r->regmlen = len; -+ } -+ } -+ -+ return(r); -+} -+ -+/* -+ - reg - regular expression, i.e. main body or parenthesized thing -+ * -+ * Caller must absorb opening parenthesis. -+ * -+ * Combining parenthesis handling with the base level of regular expression -+ * is a trifle forced, but the need to tie the tails of the branches to what -+ * follows makes it hard to avoid. -+ */ -+static char * -+reg(struct match_globals *g, int paren, int *flagp /* Parenthesized? */ ) -+{ -+ register char *ret; -+ register char *br; -+ register char *ender; -+ register int parno = 0; /* 0 makes gcc happy */ -+ int flags; -+ -+ *flagp = HASWIDTH; /* Tentatively. */ -+ -+ /* Make an OPEN node, if parenthesized. */ -+ if (paren) { -+ if (g->regnpar >= NSUBEXP) -+ FAIL("too many ()"); -+ parno = g->regnpar; -+ g->regnpar++; -+ ret = regnode(g, OPEN+parno); -+ } else -+ ret = NULL; -+ -+ /* Pick up the branches, linking them together. */ -+ br = regbranch(g, &flags); -+ if (br == NULL) -+ return(NULL); -+ if (ret != NULL) -+ regtail(g, ret, br); /* OPEN -> first. */ -+ else -+ ret = br; -+ if (!(flags&HASWIDTH)) -+ *flagp &= ~HASWIDTH; -+ *flagp |= flags&SPSTART; -+ while (*g->regparse == '|') { -+ g->regparse++; -+ br = regbranch(g, &flags); -+ if (br == NULL) -+ return(NULL); -+ regtail(g, ret, br); /* BRANCH -> BRANCH. */ -+ if (!(flags&HASWIDTH)) -+ *flagp &= ~HASWIDTH; -+ *flagp |= flags&SPSTART; -+ } -+ -+ /* Make a closing node, and hook it on the end. */ -+ ender = regnode(g, (paren) ? CLOSE+parno : END); -+ regtail(g, ret, ender); -+ -+ /* Hook the tails of the branches to the closing node. */ -+ for (br = ret; br != NULL; br = regnext(g, br)) -+ regoptail(g, br, ender); -+ -+ /* Check for proper termination. */ -+ if (paren && *g->regparse++ != ')') { -+ FAIL("unmatched ()"); -+ } else if (!paren && *g->regparse != '\0') { -+ if (*g->regparse == ')') { -+ FAIL("unmatched ()"); -+ } else -+ FAIL("junk on end"); /* "Can't happen". */ -+ /* NOTREACHED */ -+ } -+ -+ return(ret); -+} -+ -+/* -+ - regbranch - one alternative of an | operator -+ * -+ * Implements the concatenation operator. -+ */ -+static char * -+regbranch(struct match_globals *g, int *flagp) -+{ -+ register char *ret; -+ register char *chain; -+ register char *latest; -+ int flags; -+ -+ *flagp = WORST; /* Tentatively. */ -+ -+ ret = regnode(g, BRANCH); -+ chain = NULL; -+ while (*g->regparse != '\0' && *g->regparse != '|' && *g->regparse != ')') { -+ latest = regpiece(g, &flags); -+ if (latest == NULL) -+ return(NULL); -+ *flagp |= flags&HASWIDTH; -+ if (chain == NULL) /* First piece. */ -+ *flagp |= flags&SPSTART; -+ else -+ regtail(g, chain, latest); -+ chain = latest; -+ } -+ if (chain == NULL) /* Loop ran zero times. */ -+ (void) regnode(g, NOTHING); -+ -+ return(ret); -+} -+ -+/* -+ - regpiece - something followed by possible [*+?] -+ * -+ * Note that the branching code sequences used for ? and the general cases -+ * of * and + are somewhat optimized: they use the same NOTHING node as -+ * both the endmarker for their branch list and the body of the last branch. -+ * It might seem that this node could be dispensed with entirely, but the -+ * endmarker role is not redundant. -+ */ -+static char * -+regpiece(struct match_globals *g, int *flagp) -+{ -+ register char *ret; -+ register char op; -+ register char *next; -+ int flags; -+ -+ ret = regatom(g, &flags); -+ if (ret == NULL) -+ return(NULL); -+ -+ op = *g->regparse; -+ if (!ISMULT(op)) { -+ *flagp = flags; -+ return(ret); -+ } -+ -+ if (!(flags&HASWIDTH) && op != '?') -+ FAIL("*+ operand could be empty"); -+ *flagp = (op != '+') ? (WORST|SPSTART) : (WORST|HASWIDTH); -+ -+ if (op == '*' && (flags&SIMPLE)) -+ reginsert(g, STAR, ret); -+ else if (op == '*') { -+ /* Emit x* as (x&|), where & means "self". */ -+ reginsert(g, BRANCH, ret); /* Either x */ -+ regoptail(g, ret, regnode(g, BACK)); /* and loop */ -+ regoptail(g, ret, ret); /* back */ -+ regtail(g, ret, regnode(g, BRANCH)); /* or */ -+ regtail(g, ret, regnode(g, NOTHING)); /* null. */ -+ } else if (op == '+' && (flags&SIMPLE)) -+ reginsert(g, PLUS, ret); -+ else if (op == '+') { -+ /* Emit x+ as x(&|), where & means "self". */ -+ next = regnode(g, BRANCH); /* Either */ -+ regtail(g, ret, next); -+ regtail(g, regnode(g, BACK), ret); /* loop back */ -+ regtail(g, next, regnode(g, BRANCH)); /* or */ -+ regtail(g, ret, regnode(g, NOTHING)); /* null. */ -+ } else if (op == '?') { -+ /* Emit x? as (x|) */ -+ reginsert(g, BRANCH, ret); /* Either x */ -+ regtail(g, ret, regnode(g, BRANCH)); /* or */ -+ next = regnode(g, NOTHING); /* null. */ -+ regtail(g, ret, next); -+ regoptail(g, ret, next); -+ } -+ g->regparse++; -+ if (ISMULT(*g->regparse)) -+ FAIL("nested *?+"); -+ -+ return(ret); -+} -+ -+/* -+ - regatom - the lowest level -+ * -+ * Optimization: gobbles an entire sequence of ordinary characters so that -+ * it can turn them into a single node, which is smaller to store and -+ * faster to run. Backslashed characters are exceptions, each becoming a -+ * separate node; the code is simpler that way and it's not worth fixing. -+ */ -+static char * -+regatom(struct match_globals *g, int *flagp) -+{ -+ register char *ret; -+ int flags; -+ -+ *flagp = WORST; /* Tentatively. */ -+ -+ switch (*g->regparse++) { -+ case '^': -+ ret = regnode(g, BOL); -+ break; -+ case '$': -+ ret = regnode(g, EOL); -+ break; -+ case '.': -+ ret = regnode(g, ANY); -+ *flagp |= HASWIDTH|SIMPLE; -+ break; -+ case '[': { -+ register int class; -+ register int classend; -+ -+ if (*g->regparse == '^') { /* Complement of range. */ -+ ret = regnode(g, ANYBUT); -+ g->regparse++; -+ } else -+ ret = regnode(g, ANYOF); -+ if (*g->regparse == ']' || *g->regparse == '-') -+ regc(g, *g->regparse++); -+ while (*g->regparse != '\0' && *g->regparse != ']') { -+ if (*g->regparse == '-') { -+ g->regparse++; -+ if (*g->regparse == ']' || *g->regparse == '\0') -+ regc(g, '-'); -+ else { -+ class = UCHARAT(g->regparse-2)+1; -+ classend = UCHARAT(g->regparse); -+ if (class > classend+1) -+ FAIL("invalid [] range"); -+ for (; class <= classend; class++) -+ regc(g, class); -+ g->regparse++; -+ } -+ } else -+ regc(g, *g->regparse++); -+ } -+ regc(g, '\0'); -+ if (*g->regparse != ']') -+ FAIL("unmatched []"); -+ g->regparse++; -+ *flagp |= HASWIDTH|SIMPLE; -+ } -+ break; -+ case '(': -+ ret = reg(g, 1, &flags); -+ if (ret == NULL) -+ return(NULL); -+ *flagp |= flags&(HASWIDTH|SPSTART); -+ break; -+ case '\0': -+ case '|': -+ case ')': -+ FAIL("internal urp"); /* Supposed to be caught earlier. */ -+ break; -+ case '?': -+ case '+': -+ case '*': -+ FAIL("?+* follows nothing"); -+ break; -+ case '\\': -+ if (*g->regparse == '\0') -+ FAIL("trailing \\"); -+ ret = regnode(g, EXACTLY); -+ regc(g, *g->regparse++); -+ regc(g, '\0'); -+ *flagp |= HASWIDTH|SIMPLE; -+ break; -+ default: { -+ register int len; -+ register char ender; -+ -+ g->regparse--; -+ len = my_strcspn((const char *)g->regparse, (const char *)META); -+ if (len <= 0) -+ FAIL("internal disaster"); -+ ender = *(g->regparse+len); -+ if (len > 1 && ISMULT(ender)) -+ len--; /* Back off clear of ?+* operand. */ -+ *flagp |= HASWIDTH; -+ if (len == 1) -+ *flagp |= SIMPLE; -+ ret = regnode(g, EXACTLY); -+ while (len > 0) { -+ regc(g, *g->regparse++); -+ len--; -+ } -+ regc(g, '\0'); -+ } -+ break; -+ } -+ -+ return(ret); -+} -+ -+/* -+ - regnode - emit a node -+ */ -+static char * /* Location. */ -+regnode(struct match_globals *g, char op) -+{ -+ register char *ret; -+ register char *ptr; -+ -+ ret = g->regcode; -+ if (ret == &g->regdummy) { -+ g->regsize += 3; -+ return(ret); -+ } -+ -+ ptr = ret; -+ *ptr++ = op; -+ *ptr++ = '\0'; /* Null "next" pointer. */ -+ *ptr++ = '\0'; -+ g->regcode = ptr; -+ -+ return(ret); -+} -+ -+/* -+ - regc - emit (if appropriate) a byte of code -+ */ -+static void -+regc(struct match_globals *g, char b) -+{ -+ if (g->regcode != &g->regdummy) -+ *g->regcode++ = b; -+ else -+ g->regsize++; -+} -+ -+/* -+ - reginsert - insert an operator in front of already-emitted operand -+ * -+ * Means relocating the operand. -+ */ -+static void -+reginsert(struct match_globals *g, char op, char* opnd) -+{ -+ register char *src; -+ register char *dst; -+ register char *place; -+ -+ if (g->regcode == &g->regdummy) { -+ g->regsize += 3; -+ return; -+ } -+ -+ src = g->regcode; -+ g->regcode += 3; -+ dst = g->regcode; -+ while (src > opnd) -+ *--dst = *--src; -+ -+ place = opnd; /* Op node, where operand used to be. */ -+ *place++ = op; -+ *place++ = '\0'; -+ *place++ = '\0'; -+} -+ -+/* -+ - regtail - set the next-pointer at the end of a node chain -+ */ -+static void -+regtail(struct match_globals *g, char *p, char *val) -+{ -+ register char *scan; -+ register char *temp; -+ register int offset; -+ -+ if (p == &g->regdummy) -+ return; -+ -+ /* Find last node. */ -+ scan = p; -+ for (;;) { -+ temp = regnext(g, scan); -+ if (temp == NULL) -+ break; -+ scan = temp; -+ } -+ -+ if (OP(scan) == BACK) -+ offset = scan - val; -+ else -+ offset = val - scan; -+ *(scan+1) = (offset>>8)&0377; -+ *(scan+2) = offset&0377; -+} -+ -+/* -+ - regoptail - regtail on operand of first argument; nop if operandless -+ */ -+static void -+regoptail(struct match_globals *g, char *p, char *val) -+{ -+ /* "Operandless" and "op != BRANCH" are synonymous in practice. */ -+ if (p == NULL || p == &g->regdummy || OP(p) != BRANCH) -+ return; -+ regtail(g, OPERAND(p), val); -+} -+ -+/* -+ * regexec and friends -+ */ -+ -+ -+/* -+ * Forwards. -+ */ -+STATIC int regtry(struct match_globals *g, regexp *prog, char *string); -+STATIC int regmatch(struct match_globals *g, char *prog); -+STATIC int regrepeat(struct match_globals *g, char *p); -+ -+#ifdef DEBUG -+int regnarrate = 0; -+void regdump(); -+STATIC char *regprop(char *op); -+#endif -+ -+/* -+ - regexec - match a regexp against a string -+ */ -+int -+regexec(regexp *prog, char *string) -+{ -+ register char *s; -+ struct match_globals g; -+ -+ /* Be paranoid... */ -+ if (prog == NULL || string == NULL) { -+ printk("<3>Regexp: NULL parameter\n"); -+ return(0); -+ } -+ -+ /* Check validity of program. */ -+ if (UCHARAT(prog->program) != MAGIC) { -+ printk("<3>Regexp: corrupted program\n"); -+ return(0); -+ } -+ -+ /* If there is a "must appear" string, look for it. */ -+ if (prog->regmust != NULL) { -+ s = string; -+ while ((s = strchr(s, prog->regmust[0])) != NULL) { -+ if (strncmp(s, prog->regmust, prog->regmlen) == 0) -+ break; /* Found it. */ -+ s++; -+ } -+ if (s == NULL) /* Not present. */ -+ return(0); -+ } -+ -+ /* Mark beginning of line for ^ . */ -+ g.regbol = string; -+ -+ /* Simplest case: anchored match need be tried only once. */ -+ if (prog->reganch) -+ return(regtry(&g, prog, string)); -+ -+ /* Messy cases: unanchored match. */ -+ s = string; -+ if (prog->regstart != '\0') -+ /* We know what char it must start with. */ -+ while ((s = strchr(s, prog->regstart)) != NULL) { -+ if (regtry(&g, prog, s)) -+ return(1); -+ s++; -+ } -+ else -+ /* We don't -- general case. */ -+ do { -+ if (regtry(&g, prog, s)) -+ return(1); -+ } while (*s++ != '\0'); -+ -+ /* Failure. */ -+ return(0); -+} -+ -+/* -+ - regtry - try match at specific point -+ */ -+static int /* 0 failure, 1 success */ -+regtry(struct match_globals *g, regexp *prog, char *string) -+{ -+ register int i; -+ register char **sp; -+ register char **ep; -+ -+ g->reginput = string; -+ g->regstartp = prog->startp; -+ g->regendp = prog->endp; -+ -+ sp = prog->startp; -+ ep = prog->endp; -+ for (i = NSUBEXP; i > 0; i--) { -+ *sp++ = NULL; -+ *ep++ = NULL; -+ } -+ if (regmatch(g, prog->program + 1)) { -+ prog->startp[0] = string; -+ prog->endp[0] = g->reginput; -+ return(1); -+ } else -+ return(0); -+} -+ -+/* -+ - regmatch - main matching routine -+ * -+ * Conceptually the strategy is simple: check to see whether the current -+ * node matches, call self recursively to see whether the rest matches, -+ * and then act accordingly. In practice we make some effort to avoid -+ * recursion, in particular by going through "ordinary" nodes (that don't -+ * need to know whether the rest of the match failed) by a loop instead of -+ * by recursion. -+ */ -+static int /* 0 failure, 1 success */ -+regmatch(struct match_globals *g, char *prog) -+{ -+ register char *scan = prog; /* Current node. */ -+ char *next; /* Next node. */ -+ -+#ifdef DEBUG -+ if (scan != NULL && regnarrate) -+ fprintf(stderr, "%s(\n", regprop(scan)); -+#endif -+ while (scan != NULL) { -+#ifdef DEBUG -+ if (regnarrate) -+ fprintf(stderr, "%s...\n", regprop(scan)); -+#endif -+ next = regnext(g, scan); -+ -+ switch (OP(scan)) { -+ case BOL: -+ if (g->reginput != g->regbol) -+ return(0); -+ break; -+ case EOL: -+ if (*g->reginput != '\0') -+ return(0); -+ break; -+ case ANY: -+ if (*g->reginput == '\0') -+ return(0); -+ g->reginput++; -+ break; -+ case EXACTLY: { -+ register int len; -+ register char *opnd; -+ -+ opnd = OPERAND(scan); -+ /* Inline the first character, for speed. */ -+ if (*opnd != *g->reginput) -+ return(0); -+ len = strlen(opnd); -+ if (len > 1 && strncmp(opnd, g->reginput, len) != 0) -+ return(0); -+ g->reginput += len; -+ } -+ break; -+ case ANYOF: -+ if (*g->reginput == '\0' || strchr(OPERAND(scan), *g->reginput) == NULL) -+ return(0); -+ g->reginput++; -+ break; -+ case ANYBUT: -+ if (*g->reginput == '\0' || strchr(OPERAND(scan), *g->reginput) != NULL) -+ return(0); -+ g->reginput++; -+ break; -+ case NOTHING: -+ case BACK: -+ break; -+ case OPEN+1: -+ case OPEN+2: -+ case OPEN+3: -+ case OPEN+4: -+ case OPEN+5: -+ case OPEN+6: -+ case OPEN+7: -+ case OPEN+8: -+ case OPEN+9: { -+ register int no; -+ register char *save; -+ -+ no = OP(scan) - OPEN; -+ save = g->reginput; -+ -+ if (regmatch(g, next)) { -+ /* -+ * Don't set startp if some later -+ * invocation of the same parentheses -+ * already has. -+ */ -+ if (g->regstartp[no] == NULL) -+ g->regstartp[no] = save; -+ return(1); -+ } else -+ return(0); -+ } -+ break; -+ case CLOSE+1: -+ case CLOSE+2: -+ case CLOSE+3: -+ case CLOSE+4: -+ case CLOSE+5: -+ case CLOSE+6: -+ case CLOSE+7: -+ case CLOSE+8: -+ case CLOSE+9: -+ { -+ register int no; -+ register char *save; -+ -+ no = OP(scan) - CLOSE; -+ save = g->reginput; -+ -+ if (regmatch(g, next)) { -+ /* -+ * Don't set endp if some later -+ * invocation of the same parentheses -+ * already has. -+ */ -+ if (g->regendp[no] == NULL) -+ g->regendp[no] = save; -+ return(1); -+ } else -+ return(0); -+ } -+ break; -+ case BRANCH: { -+ register char *save; -+ -+ if (OP(next) != BRANCH) /* No choice. */ -+ next = OPERAND(scan); /* Avoid recursion. */ -+ else { -+ do { -+ save = g->reginput; -+ if (regmatch(g, OPERAND(scan))) -+ return(1); -+ g->reginput = save; -+ scan = regnext(g, scan); -+ } while (scan != NULL && OP(scan) == BRANCH); -+ return(0); -+ /* NOTREACHED */ -+ } -+ } -+ break; -+ case STAR: -+ case PLUS: { -+ register char nextch; -+ register int no; -+ register char *save; -+ register int min; -+ -+ /* -+ * Lookahead to avoid useless match attempts -+ * when we know what character comes next. -+ */ -+ nextch = '\0'; -+ if (OP(next) == EXACTLY) -+ nextch = *OPERAND(next); -+ min = (OP(scan) == STAR) ? 0 : 1; -+ save = g->reginput; -+ no = regrepeat(g, OPERAND(scan)); -+ while (no >= min) { -+ /* If it could work, try it. */ -+ if (nextch == '\0' || *g->reginput == nextch) -+ if (regmatch(g, next)) -+ return(1); -+ /* Couldn't or didn't -- back up. */ -+ no--; -+ g->reginput = save + no; -+ } -+ return(0); -+ } -+ break; -+ case END: -+ return(1); /* Success! */ -+ break; -+ default: -+ printk("<3>Regexp: memory corruption\n"); -+ return(0); -+ break; -+ } -+ -+ scan = next; -+ } -+ -+ /* -+ * We get here only if there's trouble -- normally "case END" is -+ * the terminating point. -+ */ -+ printk("<3>Regexp: corrupted pointers\n"); -+ return(0); -+} -+ -+/* -+ - regrepeat - repeatedly match something simple, report how many -+ */ -+static int -+regrepeat(struct match_globals *g, char *p) -+{ -+ register int count = 0; -+ register char *scan; -+ register char *opnd; -+ -+ scan = g->reginput; -+ opnd = OPERAND(p); -+ switch (OP(p)) { -+ case ANY: -+ count = strlen(scan); -+ scan += count; -+ break; -+ case EXACTLY: -+ while (*opnd == *scan) { -+ count++; -+ scan++; -+ } -+ break; -+ case ANYOF: -+ while (*scan != '\0' && strchr(opnd, *scan) != NULL) { -+ count++; -+ scan++; -+ } -+ break; -+ case ANYBUT: -+ while (*scan != '\0' && strchr(opnd, *scan) == NULL) { -+ count++; -+ scan++; -+ } -+ break; -+ default: /* Oh dear. Called inappropriately. */ -+ printk("<3>Regexp: internal foulup\n"); -+ count = 0; /* Best compromise. */ -+ break; -+ } -+ g->reginput = scan; -+ -+ return(count); -+} -+ -+/* -+ - regnext - dig the "next" pointer out of a node -+ */ -+static char* -+regnext(struct match_globals *g, char *p) -+{ -+ register int offset; -+ -+ if (p == &g->regdummy) -+ return(NULL); -+ -+ offset = NEXT(p); -+ if (offset == 0) -+ return(NULL); -+ -+ if (OP(p) == BACK) -+ return(p-offset); -+ else -+ return(p+offset); -+} -+ -+#ifdef DEBUG -+ -+STATIC char *regprop(); -+ -+/* -+ - regdump - dump a regexp onto stdout in vaguely comprehensible form -+ */ -+void -+regdump(regexp *r) -+{ -+ register char *s; -+ register char op = EXACTLY; /* Arbitrary non-END op. */ -+ register char *next; -+ /* extern char *strchr(); */ -+ -+ -+ s = r->program + 1; -+ while (op != END) { /* While that wasn't END last time... */ -+ op = OP(s); -+ printf("%2d%s", s-r->program, regprop(s)); /* Where, what. */ -+ next = regnext(s); -+ if (next == NULL) /* Next ptr. */ -+ printf("(0)"); -+ else -+ printf("(%d)", (s-r->program)+(next-s)); -+ s += 3; -+ if (op == ANYOF || op == ANYBUT || op == EXACTLY) { -+ /* Literal string, where present. */ -+ while (*s != '\0') { -+ putchar(*s); -+ s++; -+ } -+ s++; -+ } -+ putchar('\n'); -+ } -+ -+ /* Header fields of interest. */ -+ if (r->regstart != '\0') -+ printf("start `%c' ", r->regstart); -+ if (r->reganch) -+ printf("anchored "); -+ if (r->regmust != NULL) -+ printf("must have \"%s\"", r->regmust); -+ printf("\n"); -+} -+ -+/* -+ - regprop - printable representation of opcode -+ */ -+static char * -+regprop(char *op) -+{ -+#define BUFLEN 50 -+ register char *p; -+ static char buf[BUFLEN]; -+ -+ strcpy(buf, ":"); -+ -+ switch (OP(op)) { -+ case BOL: -+ p = "BOL"; -+ break; -+ case EOL: -+ p = "EOL"; -+ break; -+ case ANY: -+ p = "ANY"; -+ break; -+ case ANYOF: -+ p = "ANYOF"; -+ break; -+ case ANYBUT: -+ p = "ANYBUT"; -+ break; -+ case BRANCH: -+ p = "BRANCH"; -+ break; -+ case EXACTLY: -+ p = "EXACTLY"; -+ break; -+ case NOTHING: -+ p = "NOTHING"; -+ break; -+ case BACK: -+ p = "BACK"; -+ break; -+ case END: -+ p = "END"; -+ break; -+ case OPEN+1: -+ case OPEN+2: -+ case OPEN+3: -+ case OPEN+4: -+ case OPEN+5: -+ case OPEN+6: -+ case OPEN+7: -+ case OPEN+8: -+ case OPEN+9: -+ snprintf(buf+strlen(buf),BUFLEN-strlen(buf), "OPEN%d", OP(op)-OPEN); -+ p = NULL; -+ break; -+ case CLOSE+1: -+ case CLOSE+2: -+ case CLOSE+3: -+ case CLOSE+4: -+ case CLOSE+5: -+ case CLOSE+6: -+ case CLOSE+7: -+ case CLOSE+8: -+ case CLOSE+9: -+ snprintf(buf+strlen(buf),BUFLEN-strlen(buf), "CLOSE%d", OP(op)-CLOSE); -+ p = NULL; -+ break; -+ case STAR: -+ p = "STAR"; -+ break; -+ case PLUS: -+ p = "PLUS"; -+ break; -+ default: -+ printk("<3>Regexp: corrupted opcode\n"); -+ break; -+ } -+ if (p != NULL) -+ strncat(buf, p, BUFLEN-strlen(buf)); -+ return(buf); -+} -+#endif -+ -+ ---- /dev/null -+++ b/net/netfilter/regexp/regexp.h -@@ -0,0 +1,41 @@ -+/* -+ * Definitions etc. for regexp(3) routines. -+ * -+ * Caveat: this is V8 regexp(3) [actually, a reimplementation thereof], -+ * not the System V one. -+ */ -+ -+#ifndef REGEXP_H -+#define REGEXP_H -+ -+ -+/* -+http://www.opensource.apple.com/darwinsource/10.3/expect-1/expect/expect.h , -+which contains a version of this library, says: -+ -+ * -+ * NSUBEXP must be at least 10, and no greater than 117 or the parser -+ * will not work properly. -+ * -+ -+However, it looks rather like this library is limited to 10. If you think -+otherwise, let us know. -+*/ -+ -+#define NSUBEXP 10 -+typedef struct regexp { -+ char *startp[NSUBEXP]; -+ char *endp[NSUBEXP]; -+ char regstart; /* Internal use only. */ -+ char reganch; /* Internal use only. */ -+ char *regmust; /* Internal use only. */ -+ int regmlen; /* Internal use only. */ -+ char program[1]; /* Unwarranted chumminess with compiler. */ -+} regexp; -+ -+regexp * regcomp(char *exp, int *patternsize); -+int regexec(regexp *prog, char *string); -+void regsub(regexp *prog, char *source, char *dest); -+void regerror(char *s); -+ -+#endif ---- /dev/null -+++ b/net/netfilter/regexp/regmagic.h -@@ -0,0 +1,5 @@ -+/* -+ * The first byte of the regexp internal "program" is actually this magic -+ * number; the start node begins in the second byte. -+ */ -+#define MAGIC 0234 ---- /dev/null -+++ b/net/netfilter/regexp/regsub.c -@@ -0,0 +1,95 @@ -+/* -+ * regsub -+ * @(#)regsub.c 1.3 of 2 April 86 -+ * -+ * Copyright (c) 1986 by University of Toronto. -+ * Written by Henry Spencer. Not derived from licensed software. -+ * -+ * Permission is granted to anyone to use this software for any -+ * purpose on any computer system, and to redistribute it freely, -+ * subject to the following restrictions: -+ * -+ * 1. The author is not responsible for the consequences of use of -+ * this software, no matter how awful, even if they arise -+ * from defects in it. -+ * -+ * 2. The origin of this software must not be misrepresented, either -+ * by explicit claim or by omission. -+ * -+ * 3. Altered versions must be plainly marked as such, and must not -+ * be misrepresented as being the original software. -+ * -+ * -+ * This code was modified by Ethan Sommer to work within the kernel -+ * (it now uses kmalloc etc..) -+ * -+ */ -+#include "regexp.h" -+#include "regmagic.h" -+#include -+ -+ -+#ifndef CHARBITS -+#define UCHARAT(p) ((int)*(unsigned char *)(p)) -+#else -+#define UCHARAT(p) ((int)*(p)&CHARBITS) -+#endif -+ -+#if 0 -+//void regerror(char * s) -+//{ -+// printk("regexp(3): %s", s); -+// /* NOTREACHED */ -+//} -+#endif -+ -+/* -+ - regsub - perform substitutions after a regexp match -+ */ -+void -+regsub(regexp * prog, char * source, char * dest) -+{ -+ register char *src; -+ register char *dst; -+ register char c; -+ register int no; -+ register int len; -+ -+ /* Not necessary and gcc doesn't like it -MLS */ -+ /*extern char *strncpy();*/ -+ -+ if (prog == NULL || source == NULL || dest == NULL) { -+ regerror("NULL parm to regsub"); -+ return; -+ } -+ if (UCHARAT(prog->program) != MAGIC) { -+ regerror("damaged regexp fed to regsub"); -+ return; -+ } -+ -+ src = source; -+ dst = dest; -+ while ((c = *src++) != '\0') { -+ if (c == '&') -+ no = 0; -+ else if (c == '\\' && '0' <= *src && *src <= '9') -+ no = *src++ - '0'; -+ else -+ no = -1; -+ -+ if (no < 0) { /* Ordinary character. */ -+ if (c == '\\' && (*src == '\\' || *src == '&')) -+ c = *src++; -+ *dst++ = c; -+ } else if (prog->startp[no] != NULL && prog->endp[no] != NULL) { -+ len = prog->endp[no] - prog->startp[no]; -+ (void) strncpy(dst, prog->startp[no], len); -+ dst += len; -+ if (len != 0 && *(dst-1) == '\0') { /* strncpy hit NUL. */ -+ regerror("damaged match string"); -+ return; -+ } -+ } -+ } -+ *dst++ = '\0'; -+} ---- /dev/null -+++ b/net/netfilter/xt_layer7.c -@@ -0,0 +1,626 @@ -+/* -+ Kernel module to match application layer (OSI layer 7) data in connections. -+ -+ http://l7-filter.sf.net -+ -+ (C) 2003, 2004, 2005, 2006, 2007 Matthew Strait and Ethan Sommer. -+ -+ 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. -+ http://www.gnu.org/licenses/gpl.txt -+ -+ Based on ipt_string.c (C) 2000 Emmanuel Roger , -+ xt_helper.c (C) 2002 Harald Welte and cls_layer7.c (C) 2003 Matthew Strait, -+ Ethan Sommer, Justin Levandoski. -+*/ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "regexp/regexp.c" -+ -+MODULE_LICENSE("GPL"); -+MODULE_AUTHOR("Matthew Strait , Ethan Sommer "); -+MODULE_DESCRIPTION("iptables application layer match module"); -+MODULE_ALIAS("ipt_layer7"); -+MODULE_VERSION("2.16.1"); -+ -+static int maxdatalen = 2048; // this is the default -+module_param(maxdatalen, int, 0444); -+MODULE_PARM_DESC(maxdatalen, "maximum bytes of data looked at by l7-filter"); -+#ifdef CONFIG_NETFILTER_XT_MATCH_LAYER7_DEBUG -+ #define DPRINTK(format,args...) printk(format,##args) -+#else -+ #define DPRINTK(format,args...) -+#endif -+ -+#define TOTAL_PACKETS master_conntrack->counters[IP_CT_DIR_ORIGINAL].packets + \ -+ master_conntrack->counters[IP_CT_DIR_REPLY].packets -+ -+/* Number of packets whose data we look at. -+This can be modified through /proc/net/layer7_numpackets */ -+static int num_packets = 10; -+ -+static struct pattern_cache { -+ char * regex_string; -+ regexp * pattern; -+ struct pattern_cache * next; -+} * first_pattern_cache = NULL; -+ -+DEFINE_SPINLOCK(l7_lock); -+ -+#ifdef CONFIG_IP_NF_MATCH_LAYER7_DEBUG -+/* Converts an unfriendly string into a friendly one by -+replacing unprintables with periods and all whitespace with " ". */ -+static char * friendly_print(unsigned char * s) -+{ -+ char * f = kmalloc(strlen(s) + 1, GFP_ATOMIC); -+ int i; -+ -+ if(!f) { -+ if (net_ratelimit()) -+ printk(KERN_ERR "layer7: out of memory in " -+ "friendly_print, bailing.\n"); -+ return NULL; -+ } -+ -+ for(i = 0; i < strlen(s); i++){ -+ if(isprint(s[i]) && s[i] < 128) f[i] = s[i]; -+ else if(isspace(s[i])) f[i] = ' '; -+ else f[i] = '.'; -+ } -+ f[i] = '\0'; -+ return f; -+} -+ -+static char dec2hex(int i) -+{ -+ switch (i) { -+ case 0 ... 9: -+ return (char)(i + '0'); -+ break; -+ case 10 ... 15: -+ return (char)(i - 10 + 'a'); -+ break; -+ default: -+ if (net_ratelimit()) -+ printk("Problem in dec2hex\n"); -+ return '\0'; -+ } -+} -+ -+static char * hex_print(unsigned char * s) -+{ -+ char * g = kmalloc(strlen(s)*3 + 1, GFP_ATOMIC); -+ int i; -+ -+ if(!g) { -+ if (net_ratelimit()) -+ printk(KERN_ERR "layer7: out of memory in hex_print, " -+ "bailing.\n"); -+ return NULL; -+ } -+ -+ for(i = 0; i < strlen(s); i++) { -+ g[i*3 ] = dec2hex(s[i]/16); -+ g[i*3 + 1] = dec2hex(s[i]%16); -+ g[i*3 + 2] = ' '; -+ } -+ g[i*3] = '\0'; -+ -+ return g; -+} -+#endif // DEBUG -+ -+/* Use instead of regcomp. As we expect to be seeing the same regexps over and -+over again, it make sense to cache the results. */ -+static regexp * compile_and_cache(char * regex_string, char * protocol) -+{ -+ struct pattern_cache * node = first_pattern_cache; -+ struct pattern_cache * last_pattern_cache = first_pattern_cache; -+ struct pattern_cache * tmp; -+ unsigned int len; -+ -+ while (node != NULL) { -+ if (!strcmp(node->regex_string, regex_string)) -+ return node->pattern; -+ -+ last_pattern_cache = node;/* points at the last non-NULL node */ -+ node = node->next; -+ } -+ -+ /* If we reach the end of the list, then we have not yet cached -+ the pattern for this regex. Let's do that now. -+ Be paranoid about running out of memory to avoid list corruption. */ -+ tmp = kmalloc(sizeof(struct pattern_cache), GFP_ATOMIC); -+ -+ if(!tmp) { -+ if (net_ratelimit()) -+ printk(KERN_ERR "layer7: out of memory in " -+ "compile_and_cache, bailing.\n"); -+ return NULL; -+ } -+ -+ tmp->regex_string = kmalloc(strlen(regex_string) + 1, GFP_ATOMIC); -+ tmp->pattern = kmalloc(sizeof(struct regexp), GFP_ATOMIC); -+ tmp->next = NULL; -+ -+ if(!tmp->regex_string || !tmp->pattern) { -+ if (net_ratelimit()) -+ printk(KERN_ERR "layer7: out of memory in " -+ "compile_and_cache, bailing.\n"); -+ kfree(tmp->regex_string); -+ kfree(tmp->pattern); -+ kfree(tmp); -+ return NULL; -+ } -+ -+ /* Ok. The new node is all ready now. */ -+ node = tmp; -+ -+ if(first_pattern_cache == NULL) /* list is empty */ -+ first_pattern_cache = node; /* make node the beginning */ -+ else -+ last_pattern_cache->next = node; /* attach node to the end */ -+ -+ /* copy the string and compile the regex */ -+ len = strlen(regex_string); -+ DPRINTK("About to compile this: \"%s\"\n", regex_string); -+ node->pattern = regcomp(regex_string, &len); -+ if ( !node->pattern ) { -+ if (net_ratelimit()) -+ printk(KERN_ERR "layer7: Error compiling regexp " -+ "\"%s\" (%s)\n", -+ regex_string, protocol); -+ /* pattern is now cached as NULL, so we won't try again. */ -+ } -+ -+ strcpy(node->regex_string, regex_string); -+ return node->pattern; -+} -+ -+static int can_handle(const struct sk_buff *skb) -+{ -+ if(!skb->nh.iph) /* not IP */ -+ return 0; -+ if(skb->nh.iph->protocol != IPPROTO_TCP && -+ skb->nh.iph->protocol != IPPROTO_UDP && -+ skb->nh.iph->protocol != IPPROTO_ICMP) -+ return 0; -+ return 1; -+} -+ -+/* Returns offset the into the skb->data that the application data starts */ -+static int app_data_offset(const struct sk_buff *skb) -+{ -+ /* In case we are ported somewhere (ebtables?) where skb->nh.iph -+ isn't set, this can be gotten from 4*(skb->data[0] & 0x0f) as well. */ -+ int ip_hl = 4*skb->nh.iph->ihl; -+ -+ if( skb->nh.iph->protocol == IPPROTO_TCP ) { -+ /* 12 == offset into TCP header for the header length field. -+ Can't get this with skb->h.th->doff because the tcphdr -+ struct doesn't get set when routing (this is confirmed to be -+ true in Netfilter as well as QoS.) */ -+ int tcp_hl = 4*(skb->data[ip_hl + 12] >> 4); -+ -+ return ip_hl + tcp_hl; -+ } else if( skb->nh.iph->protocol == IPPROTO_UDP ) { -+ return ip_hl + 8; /* UDP header is always 8 bytes */ -+ } else if( skb->nh.iph->protocol == IPPROTO_ICMP ) { -+ return ip_hl + 8; /* ICMP header is 8 bytes */ -+ } else { -+ if (net_ratelimit()) -+ printk(KERN_ERR "layer7: tried to handle unknown " -+ "protocol!\n"); -+ return ip_hl + 8; /* something reasonable */ -+ } -+} -+ -+/* handles whether there's a match when we aren't appending data anymore */ -+static int match_no_append(struct nf_conn * conntrack, -+ struct nf_conn * master_conntrack, -+ enum ip_conntrack_info ctinfo, -+ enum ip_conntrack_info master_ctinfo, -+ struct xt_layer7_info * info) -+{ -+ /* If we're in here, throw the app data away */ -+ if(master_conntrack->layer7.app_data != NULL) { -+ -+ #ifdef CONFIG_IP_NF_MATCH_LAYER7_DEBUG -+ if(!master_conntrack->layer7.app_proto) { -+ char * f = -+ friendly_print(master_conntrack->layer7.app_data); -+ char * g = -+ hex_print(master_conntrack->layer7.app_data); -+ DPRINTK("\nl7-filter gave up after %d bytes " -+ "(%d packets):\n%s\n", -+ strlen(f), TOTAL_PACKETS, f); -+ kfree(f); -+ DPRINTK("In hex: %s\n", g); -+ kfree(g); -+ } -+ #endif -+ -+ kfree(master_conntrack->layer7.app_data); -+ master_conntrack->layer7.app_data = NULL; /* don't free again */ -+ } -+ -+ if(master_conntrack->layer7.app_proto){ -+ /* Here child connections set their .app_proto (for /proc) */ -+ if(!conntrack->layer7.app_proto) { -+ conntrack->layer7.app_proto = -+ kmalloc(strlen(master_conntrack->layer7.app_proto)+1, -+ GFP_ATOMIC); -+ if(!conntrack->layer7.app_proto){ -+ if (net_ratelimit()) -+ printk(KERN_ERR "layer7: out of memory " -+ "in match_no_append, " -+ "bailing.\n"); -+ return 1; -+ } -+ strcpy(conntrack->layer7.app_proto, -+ master_conntrack->layer7.app_proto); -+ } -+ -+ return (!strcmp(master_conntrack->layer7.app_proto, -+ info->protocol)); -+ } -+ else { -+ /* If not classified, set to "unknown" to distinguish from -+ connections that are still being tested. */ -+ master_conntrack->layer7.app_proto = -+ kmalloc(strlen("unknown")+1, GFP_ATOMIC); -+ if(!master_conntrack->layer7.app_proto){ -+ if (net_ratelimit()) -+ printk(KERN_ERR "layer7: out of memory in " -+ "match_no_append, bailing.\n"); -+ return 1; -+ } -+ strcpy(master_conntrack->layer7.app_proto, "unknown"); -+ return 0; -+ } -+} -+ -+/* add the new app data to the conntrack. Return number of bytes added. */ -+static int add_data(struct nf_conn * master_conntrack, -+ char * app_data, int appdatalen) -+{ -+ int length = 0, i; -+ int oldlength = master_conntrack->layer7.app_data_len; -+ -+ /* This is a fix for a race condition by Deti Fliegl. However, I'm not -+ clear on whether the race condition exists or whether this really -+ fixes it. I might just be being dense... Anyway, if it's not really -+ a fix, all it does is waste a very small amount of time. */ -+ if(!master_conntrack->layer7.app_data) return 0; -+ -+ /* Strip nulls. Make everything lower case (our regex lib doesn't -+ do case insensitivity). Add it to the end of the current data. */ -+ for(i = 0; i < maxdatalen-oldlength-1 && -+ i < appdatalen; i++) { -+ if(app_data[i] != '\0') { -+ /* the kernel version of tolower mungs 'upper ascii' */ -+ master_conntrack->layer7.app_data[length+oldlength] = -+ isascii(app_data[i])? -+ tolower(app_data[i]) : app_data[i]; -+ length++; -+ } -+ } -+ -+ master_conntrack->layer7.app_data[length+oldlength] = '\0'; -+ master_conntrack->layer7.app_data_len = length + oldlength; -+ -+ return length; -+} -+ -+/* taken from drivers/video/modedb.c */ -+static int my_atoi(const char *s) -+{ -+ int val = 0; -+ -+ for (;; s++) { -+ switch (*s) { -+ case '0'...'9': -+ val = 10*val+(*s-'0'); -+ break; -+ default: -+ return val; -+ } -+ } -+} -+ -+/* write out num_packets to userland. */ -+static int layer7_read_proc(char* page, char ** start, off_t off, int count, -+ int* eof, void * data) -+{ -+ if(num_packets > 99 && net_ratelimit()) -+ printk(KERN_ERR "layer7: NOT REACHED. num_packets too big\n"); -+ -+ page[0] = num_packets/10 + '0'; -+ page[1] = num_packets%10 + '0'; -+ page[2] = '\n'; -+ page[3] = '\0'; -+ -+ *eof=1; -+ -+ return 3; -+} -+ -+/* Read in num_packets from userland */ -+static int layer7_write_proc(struct file* file, const char* buffer, -+ unsigned long count, void *data) -+{ -+ char * foo = kmalloc(count, GFP_ATOMIC); -+ -+ if(!foo){ -+ if (net_ratelimit()) -+ printk(KERN_ERR "layer7: out of memory, bailing. " -+ "num_packets unchanged.\n"); -+ return count; -+ } -+ -+ if(copy_from_user(foo, buffer, count)) { -+ return -EFAULT; -+ } -+ -+ -+ num_packets = my_atoi(foo); -+ kfree (foo); -+ -+ /* This has an arbitrary limit to make the math easier. I'm lazy. -+ But anyway, 99 is a LOT! If you want more, you're doing it wrong! */ -+ if(num_packets > 99) { -+ printk(KERN_WARNING "layer7: num_packets can't be > 99.\n"); -+ num_packets = 99; -+ } else if(num_packets < 1) { -+ printk(KERN_WARNING "layer7: num_packets can't be < 1.\n"); -+ num_packets = 1; -+ } -+ -+ return count; -+} -+ -+static int -+match(const struct sk_buff *skbin, -+ const struct net_device *in, -+ const struct net_device *out, -+ const struct xt_match *match, -+ const void *matchinfo, -+ int offset, -+ unsigned int protoff, -+ int *hotdrop) -+{ -+ /* sidestep const without getting a compiler warning... */ -+ struct sk_buff * skb = (struct sk_buff *)skbin; -+ -+ struct xt_layer7_info * info = (struct xt_layer7_info *)matchinfo; -+ enum ip_conntrack_info master_ctinfo, ctinfo; -+ struct nf_conn *master_conntrack, *conntrack; -+ unsigned char * app_data; -+ unsigned int pattern_result, appdatalen; -+ regexp * comppattern; -+ -+ /* Be paranoid/incompetent - lock the entire match function. */ -+ spin_lock_bh(&l7_lock); -+ -+ if(!can_handle(skb)){ -+ DPRINTK("layer7: This is some protocol I can't handle.\n"); -+ spin_unlock_bh(&l7_lock); -+ return info->invert; -+ } -+ -+ /* Treat parent & all its children together as one connection, except -+ for the purpose of setting conntrack->layer7.app_proto in the actual -+ connection. This makes /proc/net/ip_conntrack more satisfying. */ -+ if(!(conntrack = nf_ct_get((struct sk_buff *)skb, &ctinfo)) || -+ !(master_conntrack=nf_ct_get((struct sk_buff *)skb,&master_ctinfo))){ -+ DPRINTK("layer7: couldn't get conntrack.\n"); -+ spin_unlock_bh(&l7_lock); -+ return info->invert; -+ } -+ -+ /* Try to get a master conntrack (and its master etc) for FTP, etc. */ -+ while (master_ct(master_conntrack) != NULL) -+ master_conntrack = master_ct(master_conntrack); -+ -+ /* if we've classified it or seen too many packets */ -+ if(TOTAL_PACKETS > num_packets || -+ master_conntrack->layer7.app_proto) { -+ -+ pattern_result = match_no_append(conntrack, master_conntrack, -+ ctinfo, master_ctinfo, info); -+ -+ /* skb->cb[0] == seen. Don't do things twice if there are -+ multiple l7 rules. I'm not sure that using cb for this purpose -+ is correct, even though it says "put your private variables -+ there". But it doesn't look like it is being used for anything -+ else in the skbs that make it here. */ -+ skb->cb[0] = 1; /* marking it seen here's probably irrelevant */ -+ -+ spin_unlock_bh(&l7_lock); -+ return (pattern_result ^ info->invert); -+ } -+ -+ if(skb_is_nonlinear(skb)){ -+ if(skb_linearize(skb) != 0){ -+ if (net_ratelimit()) -+ printk(KERN_ERR "layer7: failed to linearize " -+ "packet, bailing.\n"); -+ spin_unlock_bh(&l7_lock); -+ return info->invert; -+ } -+ } -+ -+ /* now that the skb is linearized, it's safe to set these. */ -+ app_data = skb->data + app_data_offset(skb); -+ appdatalen = skb->tail - app_data; -+ -+ /* the return value gets checked later, when we're ready to use it */ -+ comppattern = compile_and_cache(info->pattern, info->protocol); -+ -+ /* On the first packet of a connection, allocate space for app data */ -+ if(TOTAL_PACKETS == 1 && !skb->cb[0] && -+ !master_conntrack->layer7.app_data){ -+ master_conntrack->layer7.app_data = -+ kmalloc(maxdatalen, GFP_ATOMIC); -+ if(!master_conntrack->layer7.app_data){ -+ if (net_ratelimit()) -+ printk(KERN_ERR "layer7: out of memory in " -+ "match, bailing.\n"); -+ spin_unlock_bh(&l7_lock); -+ return info->invert; -+ } -+ -+ master_conntrack->layer7.app_data[0] = '\0'; -+ } -+ -+ /* Can be here, but unallocated, if numpackets is increased near -+ the beginning of a connection */ -+ if(master_conntrack->layer7.app_data == NULL){ -+ spin_unlock_bh(&l7_lock); -+ return (info->invert); /* unmatched */ -+ } -+ -+ if(!skb->cb[0]){ -+ int newbytes; -+ newbytes = add_data(master_conntrack, app_data, appdatalen); -+ -+ if(newbytes == 0) { /* didn't add any data */ -+ skb->cb[0] = 1; -+ /* Didn't match before, not going to match now */ -+ spin_unlock_bh(&l7_lock); -+ return info->invert; -+ } -+ } -+ -+ /* If looking for "unknown", then never match. "Unknown" means that -+ we've given up; we're still trying with these packets. */ -+ if(!strcmp(info->protocol, "unknown")) { -+ pattern_result = 0; -+ /* If looking for "unset", then always match. "Unset" means that we -+ haven't yet classified the connection. */ -+ } else if(!strcmp(info->protocol, "unset")) { -+ pattern_result = 2; -+ DPRINTK("layer7: matched unset: not yet classified " -+ "(%d/%d packets)\n", TOTAL_PACKETS, num_packets); -+ /* If the regexp failed to compile, don't bother running it */ -+ } else if(comppattern && -+ regexec(comppattern, master_conntrack->layer7.app_data)){ -+ DPRINTK("layer7: matched %s\n", info->protocol); -+ pattern_result = 1; -+ } else pattern_result = 0; -+ -+ if(pattern_result == 1) { -+ master_conntrack->layer7.app_proto = -+ kmalloc(strlen(info->protocol)+1, GFP_ATOMIC); -+ if(!master_conntrack->layer7.app_proto){ -+ if (net_ratelimit()) -+ printk(KERN_ERR "layer7: out of memory in " -+ "match, bailing.\n"); -+ spin_unlock_bh(&l7_lock); -+ return (pattern_result ^ info->invert); -+ } -+ strcpy(master_conntrack->layer7.app_proto, info->protocol); -+ } else if(pattern_result > 1) { /* cleanup from "unset" */ -+ pattern_result = 1; -+ } -+ -+ /* mark the packet seen */ -+ skb->cb[0] = 1; -+ -+ spin_unlock_bh(&l7_lock); -+ return (pattern_result ^ info->invert); -+} -+ -+static int check(const char *tablename, -+ const void *inf, -+ const struct xt_match *match, -+ void *matchinfo, -+ unsigned int hook_mask) -+ -+{ -+ // load nf_conntrack_ipv4 -+ if (nf_ct_l3proto_try_module_get(match->family) < 0) { -+ printk(KERN_WARNING "can't load conntrack support for " -+ "proto=%d\n", match->family); -+ return 0; -+ } -+ return 1; -+} -+ -+static void -+destroy(const struct xt_match *match, void *matchinfo) -+{ -+ nf_ct_l3proto_module_put(match->family); -+} -+ -+static struct xt_match xt_layer7_match[] = { -+{ -+ .name = "layer7", -+ .family = AF_INET, -+ .checkentry = check, -+ .match = match, -+ .destroy = destroy, -+ .matchsize = sizeof(struct xt_layer7_info), -+ .me = THIS_MODULE -+} -+}; -+ -+static void layer7_cleanup_proc(void) -+{ -+ remove_proc_entry("layer7_numpackets", proc_net); -+} -+ -+/* register the proc file */ -+static void layer7_init_proc(void) -+{ -+ struct proc_dir_entry* entry; -+ entry = create_proc_entry("layer7_numpackets", 0644, proc_net); -+ entry->read_proc = layer7_read_proc; -+ entry->write_proc = layer7_write_proc; -+} -+ -+static int __init xt_layer7_init(void) -+{ -+ need_conntrack(); -+ -+ layer7_init_proc(); -+ if(maxdatalen < 1) { -+ printk(KERN_WARNING "layer7: maxdatalen can't be < 1, " -+ "using 1\n"); -+ maxdatalen = 1; -+ } -+ /* This is not a hard limit. It's just here to prevent people from -+ bringing their slow machines to a grinding halt. */ -+ else if(maxdatalen > 65536) { -+ printk(KERN_WARNING "layer7: maxdatalen can't be > 65536, " -+ "using 65536\n"); -+ maxdatalen = 65536; -+ } -+ return xt_register_matches(xt_layer7_match, -+ ARRAY_SIZE(xt_layer7_match)); -+} -+ -+static void __exit xt_layer7_fini(void) -+{ -+ layer7_cleanup_proc(); -+ xt_unregister_matches(xt_layer7_match, ARRAY_SIZE(xt_layer7_match)); -+} -+ -+module_init(xt_layer7_init); -+module_exit(xt_layer7_fini); -+ diff --git a/target/linux/generic-2.6/patches-2.6.21/101-netfilter_layer7_pktmatch.patch b/target/linux/generic-2.6/patches-2.6.21/101-netfilter_layer7_pktmatch.patch deleted file mode 100644 index d3129eed7..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/101-netfilter_layer7_pktmatch.patch +++ /dev/null @@ -1,109 +0,0 @@ ---- a/include/linux/netfilter/xt_layer7.h -+++ b/include/linux/netfilter/xt_layer7.h -@@ -8,6 +8,7 @@ struct xt_layer7_info { - char protocol[MAX_PROTOCOL_LEN]; - char invert:1; - char pattern[MAX_PATTERN_LEN]; -+ u_int8_t pkt; - }; - - #endif /* _XT_LAYER7_H */ ---- a/net/netfilter/xt_layer7.c -+++ b/net/netfilter/xt_layer7.c -@@ -296,34 +296,36 @@ static int match_no_append(struct nf_con - } - - /* add the new app data to the conntrack. Return number of bytes added. */ --static int add_data(struct nf_conn * master_conntrack, -- char * app_data, int appdatalen) -+static int add_datastr(char *target, int offset, char *app_data, int len) - { - int length = 0, i; -- int oldlength = master_conntrack->layer7.app_data_len; -- -- /* This is a fix for a race condition by Deti Fliegl. However, I'm not -- clear on whether the race condition exists or whether this really -- fixes it. I might just be being dense... Anyway, if it's not really -- a fix, all it does is waste a very small amount of time. */ -- if(!master_conntrack->layer7.app_data) return 0; -+ -+ if (!target) return 0; - - /* Strip nulls. Make everything lower case (our regex lib doesn't - do case insensitivity). Add it to the end of the current data. */ -- for(i = 0; i < maxdatalen-oldlength-1 && -- i < appdatalen; i++) { -+ for(i = 0; i < maxdatalen-offset-1 && i < len; i++) { - if(app_data[i] != '\0') { - /* the kernel version of tolower mungs 'upper ascii' */ -- master_conntrack->layer7.app_data[length+oldlength] = -+ target[length+offset] = - isascii(app_data[i])? - tolower(app_data[i]) : app_data[i]; - length++; - } - } -+ target[length+offset] = '\0'; -+ -+ return length; -+} - -- master_conntrack->layer7.app_data[length+oldlength] = '\0'; -- master_conntrack->layer7.app_data_len = length + oldlength; -+/* add the new app data to the conntrack. Return number of bytes added. */ -+static int add_data(struct nf_conn * master_conntrack, -+ char * app_data, int appdatalen) -+{ -+ int length; - -+ length = add_datastr(master_conntrack->layer7.app_data, master_conntrack->layer7.app_data_len, app_data, appdatalen); -+ master_conntrack->layer7.app_data_len += length; - return length; - } - -@@ -410,7 +412,7 @@ match(const struct sk_buff *skbin, - struct xt_layer7_info * info = (struct xt_layer7_info *)matchinfo; - enum ip_conntrack_info master_ctinfo, ctinfo; - struct nf_conn *master_conntrack, *conntrack; -- unsigned char * app_data; -+ unsigned char *app_data, *tmp_data; - unsigned int pattern_result, appdatalen; - regexp * comppattern; - -@@ -438,8 +440,8 @@ match(const struct sk_buff *skbin, - master_conntrack = master_ct(master_conntrack); - - /* if we've classified it or seen too many packets */ -- if(TOTAL_PACKETS > num_packets || -- master_conntrack->layer7.app_proto) { -+ if(!info->pkt && (TOTAL_PACKETS > num_packets || -+ master_conntrack->layer7.app_proto)) { - - pattern_result = match_no_append(conntrack, master_conntrack, - ctinfo, master_ctinfo, info); -@@ -472,6 +474,25 @@ match(const struct sk_buff *skbin, - /* the return value gets checked later, when we're ready to use it */ - comppattern = compile_and_cache(info->pattern, info->protocol); - -+ if (info->pkt) { -+ tmp_data = kmalloc(maxdatalen, GFP_ATOMIC); -+ if(!tmp_data){ -+ if (net_ratelimit()) -+ printk(KERN_ERR "layer7: out of memory in match, bailing.\n"); -+ return info->invert; -+ } -+ -+ tmp_data[0] = '\0'; -+ add_datastr(tmp_data, 0, app_data, appdatalen); -+ pattern_result = ((comppattern && regexec(comppattern, tmp_data)) ? 1 : 0); -+ -+ kfree(tmp_data); -+ tmp_data = NULL; -+ spin_unlock_bh(&l7_lock); -+ -+ return (pattern_result ^ info->invert); -+ } -+ - /* On the first packet of a connection, allocate space for app data */ - if(TOTAL_PACKETS == 1 && !skb->cb[0] && - !master_conntrack->layer7.app_data){ diff --git a/target/linux/generic-2.6/patches-2.6.21/120-openswan-2.4.0.kernel-2.6-natt.patch b/target/linux/generic-2.6/patches-2.6.21/120-openswan-2.4.0.kernel-2.6-natt.patch deleted file mode 100644 index 73d87c2f8..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/120-openswan-2.4.0.kernel-2.6-natt.patch +++ /dev/null @@ -1,166 +0,0 @@ ---- /dev/null -+++ b/include/net/xfrmudp.h -@@ -0,0 +1,10 @@ -+/* -+ * pointer to function for type that xfrm4_input wants, to permit -+ * decoupling of XFRM from udp.c -+ */ -+#define HAVE_XFRM4_UDP_REGISTER -+ -+typedef int (*xfrm4_rcv_encap_t)(struct sk_buff *skb, __u16 encap_type); -+extern int udp4_register_esp_rcvencap(xfrm4_rcv_encap_t func -+ , xfrm4_rcv_encap_t *oldfunc); -+extern int udp4_unregister_esp_rcvencap(xfrm4_rcv_encap_t func); ---- a/net/ipv4/Kconfig -+++ b/net/ipv4/Kconfig -@@ -266,6 +266,12 @@ config NET_IPGRE_BROADCAST - Network), but can be distributed all over the Internet. If you want - to do that, say Y here and to "IP multicast routing" below. - -+config IPSEC_NAT_TRAVERSAL -+ bool "IPSEC NAT-Traversal (KLIPS compatible)" -+ depends on INET -+ ---help--- -+ Includes support for RFC3947/RFC3948 NAT-Traversal of ESP over UDP. -+ - config IP_MROUTE - bool "IP: multicast routing" - depends on IP_MULTICAST ---- a/net/ipv4/udp.c -+++ b/net/ipv4/udp.c -@@ -101,12 +101,15 @@ - #include - #include - #include -+#include - #include "udp_impl.h" - - /* - * Snmp MIB for the UDP layer - */ - -+static xfrm4_rcv_encap_t xfrm4_rcv_encap_func; -+ - DEFINE_SNMP_STAT(struct udp_mib, udp_statistics) __read_mostly; - - struct hlist_head udp_hash[UDP_HTABLE_SIZE]; -@@ -915,6 +918,42 @@ int udp_disconnect(struct sock *sk, int - return 0; - } - -+#if defined(CONFIG_XFRM) || defined(CONFIG_IPSEC_NAT_TRAVERSAL) -+ -+/* if XFRM isn't a module, then register it directly. */ -+#if 0 && !defined(CONFIG_XFRM_MODULE) && !defined(CONFIG_IPSEC_NAT_TRAVERSAL) -+static xfrm4_rcv_encap_t xfrm4_rcv_encap_func = xfrm4_rcv_encap; -+#else -+static xfrm4_rcv_encap_t xfrm4_rcv_encap_func = NULL; -+#endif -+ -+int udp4_register_esp_rcvencap(xfrm4_rcv_encap_t func -+ , xfrm4_rcv_encap_t *oldfunc) -+{ -+ if(oldfunc != NULL) { -+ *oldfunc = xfrm4_rcv_encap_func; -+ } -+ -+#if 0 -+ if(xfrm4_rcv_encap_func != NULL) -+ return -1; -+#endif -+ -+ xfrm4_rcv_encap_func = func; -+ return 0; -+} -+ -+int udp4_unregister_esp_rcvencap(xfrm4_rcv_encap_t func) -+{ -+ if(xfrm4_rcv_encap_func != func) -+ return -1; -+ -+ xfrm4_rcv_encap_func = NULL; -+ return 0; -+} -+#endif /* CONFIG_XFRM_MODULE || CONFIG_IPSEC_NAT_TRAVERSAL */ -+ -+ - /* return: - * 1 if the the UDP system should process it - * 0 if we should drop this packet -@@ -922,7 +961,7 @@ int udp_disconnect(struct sock *sk, int - */ - static int udp_encap_rcv(struct sock * sk, struct sk_buff *skb) - { --#ifndef CONFIG_XFRM -+#if !defined(CONFIG_XFRM) && !defined(CONFIG_IPSEC_NAT_TRAVERSAL) - return 1; - #else - struct udp_sock *up = udp_sk(sk); -@@ -937,11 +976,11 @@ static int udp_encap_rcv(struct sock * s - /* if we're overly short, let UDP handle it */ - len = skb->len - sizeof(struct udphdr); - if (len <= 0) -- return 1; -+ return 2; - - /* if this is not encapsulated socket, then just return now */ - if (!encap_type) -- return 1; -+ return 3; - - /* If this is a paged skb, make sure we pull up - * whatever data we need to look at. */ -@@ -964,7 +1003,7 @@ static int udp_encap_rcv(struct sock * s - len = sizeof(struct udphdr); - } else - /* Must be an IKE packet.. pass it through */ -- return 1; -+ return 4; - break; - case UDP_ENCAP_ESPINUDP_NON_IKE: - /* Check if this is a keepalive packet. If so, eat it. */ -@@ -977,7 +1016,7 @@ static int udp_encap_rcv(struct sock * s - len = sizeof(struct udphdr) + 2 * sizeof(u32); - } else - /* Must be an IKE packet.. pass it through */ -- return 1; -+ return 5; - break; - } - -@@ -988,6 +1027,8 @@ static int udp_encap_rcv(struct sock * s - */ - if (skb_cloned(skb) && pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) - return 0; -+ if (skb_cloned(skb) && pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) -+ return 0; - - /* Now we can update and verify the packet length... */ - iph = skb->nh.iph; -@@ -1051,9 +1092,13 @@ int udp_queue_rcv_skb(struct sock * sk, - return 0; - } - if (ret < 0) { -- /* process the ESP packet */ -- ret = xfrm4_rcv_encap(skb, up->encap_type); -- UDP_INC_STATS_BH(UDP_MIB_INDATAGRAMS, up->pcflag); -+ if(xfrm4_rcv_encap_func != NULL) { -+ ret = (*xfrm4_rcv_encap_func)(skb, up->encap_type); -+ UDP_INC_STATS_BH(UDP_MIB_INDATAGRAMS, up->pcflag); -+ } else { -+ UDP_INC_STATS_BH(UDP_MIB_INERRORS, up->pcflag); -+ ret = 1; -+ } - return -ret; - } - /* FALLTHROUGH -- it's a UDP Packet */ -@@ -1733,3 +1778,9 @@ EXPORT_SYMBOL(udp_poll); - EXPORT_SYMBOL(udp_proc_register); - EXPORT_SYMBOL(udp_proc_unregister); - #endif -+ -+#if defined(CONFIG_IPSEC_NAT_TRAVERSAL) -+EXPORT_SYMBOL(udp4_register_esp_rcvencap); -+EXPORT_SYMBOL(udp4_unregister_esp_rcvencap); -+#endif -+ diff --git a/target/linux/generic-2.6/patches-2.6.21/140-netfilter_time.patch b/target/linux/generic-2.6/patches-2.6.21/140-netfilter_time.patch deleted file mode 100644 index 25f51f1ef..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/140-netfilter_time.patch +++ /dev/null @@ -1,237 +0,0 @@ ---- /dev/null -+++ b/include/linux/netfilter_ipv4/ipt_time.h -@@ -0,0 +1,18 @@ -+#ifndef __ipt_time_h_included__ -+#define __ipt_time_h_included__ -+ -+ -+struct ipt_time_info { -+ u_int8_t days_match; /* 1 bit per day. -SMTWTFS */ -+ u_int16_t time_start; /* 0 < time_start < 23*60+59 = 1439 */ -+ u_int16_t time_stop; /* 0:0 < time_stat < 23:59 */ -+ -+ /* FIXME: Keep this one for userspace iptables binary compability: */ -+ u_int8_t kerneltime; /* ignore skb time (and use kerneltime) or not. */ -+ -+ time_t date_start; -+ time_t date_stop; -+}; -+ -+ -+#endif /* __ipt_time_h_included__ */ ---- /dev/null -+++ b/net/ipv4/netfilter/ipt_time.c -@@ -0,0 +1,178 @@ -+/* -+ This is a module which is used for time matching -+ It is using some modified code from dietlibc (localtime() function) -+ that you can find at http://www.fefe.de/dietlibc/ -+ This file is distributed under the terms of the GNU General Public -+ License (GPL). Copies of the GPL can be obtained from: ftp://prep.ai.mit.edu/pub/gnu/GPL -+ 2001-05-04 Fabrice MARIE : initial development. -+ 2001-21-05 Fabrice MARIE : bug fix in the match code, -+ thanks to "Zeng Yu" for bug report. -+ 2001-26-09 Fabrice MARIE : force the match to be in LOCAL_IN or PRE_ROUTING only. -+ 2001-30-11 Fabrice : added the possibility to use the match in FORWARD/OUTPUT with a little hack, -+ added Nguyen Dang Phuoc Dong patch to support timezones. -+ 2004-05-02 Fabrice : added support for date matching, from an idea of Fabien COELHO. -+*/ -+ -+#include -+#include -+#include -+#include -+#include -+ -+MODULE_AUTHOR("Fabrice MARIE "); -+MODULE_DESCRIPTION("Match arrival timestamp/date"); -+MODULE_LICENSE("GPL"); -+ -+struct tm -+{ -+ int tm_sec; /* Seconds. [0-60] (1 leap second) */ -+ int tm_min; /* Minutes. [0-59] */ -+ int tm_hour; /* Hours. [0-23] */ -+ int tm_mday; /* Day. [1-31] */ -+ int tm_mon; /* Month. [0-11] */ -+ int tm_year; /* Year - 1900. */ -+ int tm_wday; /* Day of week. [0-6] */ -+ int tm_yday; /* Days in year.[0-365] */ -+ int tm_isdst; /* DST. [-1/0/1]*/ -+ -+ long int tm_gmtoff; /* we don't care, we count from GMT */ -+ const char *tm_zone; /* we don't care, we count from GMT */ -+}; -+ -+void -+localtime(const u32 time, struct tm *r); -+ -+static int -+match(const struct sk_buff *skb, -+ const struct net_device *in, -+ const struct net_device *out, -+ const struct xt_match *match, -+ const void *matchinfo, -+ int offset, -+ unsigned int protoff, -+ int *hotdrop) -+{ -+ const struct ipt_time_info *info = matchinfo; /* match info for rule */ -+ struct tm currenttime; /* time human readable */ -+ u_int8_t days_of_week[7] = {64, 32, 16, 8, 4, 2, 1}; -+ u_int16_t packet_time; -+ -+ /* We might not have a timestamp, get one */ -+ if (skb->tstamp.off_sec == 0) -+ __net_timestamp((struct sk_buff *)skb); -+ -+ /* First we make sure we are in the date start-stop boundaries */ -+ if ((skb->tstamp.off_sec < info->date_start) || (skb->tstamp.off_sec > info->date_stop)) -+ return 0; /* We are outside the date boundaries */ -+ -+ /* Transform the timestamp of the packet, in a human readable form */ -+ localtime(skb->tstamp.off_sec, ¤ttime); -+ -+ /* check if we match this timestamp, we start by the days... */ -+ if ((days_of_week[currenttime.tm_wday] & info->days_match) != days_of_week[currenttime.tm_wday]) -+ return 0; /* the day doesn't match */ -+ -+ /* ... check the time now */ -+ packet_time = (currenttime.tm_hour * 60) + currenttime.tm_min; -+ if ((packet_time < info->time_start) || (packet_time > info->time_stop)) -+ return 0; -+ -+ /* here we match ! */ -+ return 1; -+} -+ -+static int -+checkentry(const char *tablename, -+ const void *ip, -+ const struct xt_match *match, -+ void *matchinfo, -+ unsigned int hook_mask) -+{ -+ struct ipt_time_info *info = matchinfo; /* match info for rule */ -+ -+ /* First, check that we are in the correct hooks */ -+ if (hook_mask -+ & ~((1 << NF_IP_PRE_ROUTING) | (1 << NF_IP_LOCAL_IN) | (1 << NF_IP_FORWARD) | (1 << NF_IP_LOCAL_OUT))) -+ { -+ printk("ipt_time: error, only valid for PRE_ROUTING, LOCAL_IN, FORWARD and OUTPUT)\n"); -+ return 0; -+ } -+ -+ /* Now check the coherence of the data ... */ -+ if ((info->time_start > 1439) || /* 23*60+59 = 1439*/ -+ (info->time_stop > 1439)) -+ { -+ printk(KERN_WARNING "ipt_time: invalid argument\n"); -+ return 0; -+ } -+ -+ return 1; -+} -+ -+static struct ipt_match time_match = { -+ .name = "time", -+ .match = &match, -+ .matchsize = sizeof(struct ipt_time_info), -+ .checkentry = &checkentry, -+ .me = THIS_MODULE -+}; -+ -+static int __init init(void) -+{ -+ printk("ipt_time loading\n"); -+ return xt_register_match(&time_match); -+} -+ -+static void __exit fini(void) -+{ -+ xt_unregister_match(&time_match); -+ printk("ipt_time unloaded\n"); -+} -+ -+module_init(init); -+module_exit(fini); -+ -+ -+/* The part below is borowed and modified from dietlibc */ -+ -+/* seconds per day */ -+#define SPD 24*60*60 -+ -+void -+localtime(const u32 time, struct tm *r) { -+ u32 i, timep; -+ extern struct timezone sys_tz; -+ const unsigned int __spm[12] = -+ { 0, -+ (31), -+ (31+28), -+ (31+28+31), -+ (31+28+31+30), -+ (31+28+31+30+31), -+ (31+28+31+30+31+30), -+ (31+28+31+30+31+30+31), -+ (31+28+31+30+31+30+31+31), -+ (31+28+31+30+31+30+31+31+30), -+ (31+28+31+30+31+30+31+31+30+31), -+ (31+28+31+30+31+30+31+31+30+31+30), -+ }; -+ register u32 work; -+ -+ timep = time - (sys_tz.tz_minuteswest * 60); -+ work=timep%(SPD); -+ r->tm_sec=work%60; work/=60; -+ r->tm_min=work%60; r->tm_hour=work/60; -+ work=timep/(SPD); -+ r->tm_wday=(4+work)%7; -+ for (i=1970; ; ++i) { -+ register time_t k= (!(i%4) && ((i%100) || !(i%400)))?366:365; -+ if (work>k) -+ work-=k; -+ else -+ break; -+ } -+ r->tm_year=i-1900; -+ for (i=11; i && __spm[i]>work; --i) ; -+ r->tm_mon=i; -+ r->tm_mday=work-__spm[i]+1; -+} ---- a/net/ipv4/netfilter/Kconfig -+++ b/net/ipv4/netfilter/Kconfig -@@ -254,6 +254,22 @@ config IP_NF_MATCH_TOS - - To compile it as a module, choose M here. If unsure, say N. - -+ -+config IP_NF_MATCH_TIME -+ tristate 'TIME match support' -+ depends on IP_NF_IPTABLES -+ help -+ This option adds a `time' match, which allows you -+ to match based on the packet arrival time/date -+ (arrival time/date at the machine which netfilter is running on) or -+ departure time/date (for locally generated packets). -+ -+ If you say Y here, try iptables -m time --help for more information. -+ If you want to compile it as a module, say M here and read -+ -+ Documentation/modules.txt. If unsure, say `N'. -+ -+ - config IP_NF_MATCH_RECENT - tristate "recent match support" - depends on IP_NF_IPTABLES ---- a/net/ipv4/netfilter/Makefile -+++ b/net/ipv4/netfilter/Makefile -@@ -86,6 +86,7 @@ obj-$(CONFIG_IP_NF_RAW) += iptable_raw.o - obj-$(CONFIG_IP_NF_MATCH_IPRANGE) += ipt_iprange.o - obj-$(CONFIG_IP_NF_MATCH_OWNER) += ipt_owner.o - obj-$(CONFIG_IP_NF_MATCH_TOS) += ipt_tos.o -+obj-$(CONFIG_IP_NF_MATCH_TIME) += ipt_time.o - obj-$(CONFIG_IP_NF_MATCH_RECENT) += ipt_recent.o - obj-$(CONFIG_IP_NF_MATCH_ECN) += ipt_ecn.o - obj-$(CONFIG_IP_NF_MATCH_AH) += ipt_ah.o diff --git a/target/linux/generic-2.6/patches-2.6.21/150-netfilter_imq.patch b/target/linux/generic-2.6/patches-2.6.21/150-netfilter_imq.patch deleted file mode 100644 index f57dd5b8f..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/150-netfilter_imq.patch +++ /dev/null @@ -1,872 +0,0 @@ ---- /dev/null -+++ b/drivers/net/imq.c -@@ -0,0 +1,402 @@ -+/* -+ * Pseudo-driver for the intermediate queue device. -+ * -+ * 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. -+ * -+ * Authors: Patrick McHardy, -+ * -+ * The first version was written by Martin Devera, -+ * -+ * Credits: Jan Rafaj -+ * - Update patch to 2.4.21 -+ * Sebastian Strollo -+ * - Fix "Dead-loop on netdevice imq"-issue -+ * Marcel Sebek -+ * - Update to 2.6.2-rc1 -+ * -+ * After some time of inactivity there is a group taking care -+ * of IMQ again: http://www.linuximq.net -+ * -+ * -+ * 2004/06/30 - New version of IMQ patch to kernels <=2.6.7 including -+ * the following changes: -+ * -+ * - Correction of ipv6 support "+"s issue (Hasso Tepper) -+ * - Correction of imq_init_devs() issue that resulted in -+ * kernel OOPS unloading IMQ as module (Norbert Buchmuller) -+ * - Addition of functionality to choose number of IMQ devices -+ * during kernel config (Andre Correa) -+ * - Addition of functionality to choose how IMQ hooks on -+ * PRE and POSTROUTING (after or before NAT) (Andre Correa) -+ * - Cosmetic corrections (Norbert Buchmuller) (Andre Correa) -+ * -+ * -+ * 2005/12/16 - IMQ versions between 2.6.7 and 2.6.13 were -+ * released with almost no problems. 2.6.14-x was released -+ * with some important changes: nfcache was removed; After -+ * some weeks of trouble we figured out that some IMQ fields -+ * in skb were missing in skbuff.c - skb_clone and copy_skb_header. -+ * These functions are correctly patched by this new patch version. -+ * -+ * Thanks for all who helped to figure out all the problems with -+ * 2.6.14.x: Patrick McHardy, Rune Kock, VeNoMouS, Max CtRiX, -+ * Kevin Shanahan, Richard Lucassen, Valery Dachev (hopefully -+ * I didn't forget anybody). I apologize again for my lack of time. -+ * -+ * More info at: http://www.linuximq.net/ (Andre Correa) -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) -+ #include -+#endif -+#include -+#include -+ -+extern int qdisc_restart1(struct net_device *dev); -+ -+static nf_hookfn imq_nf_hook; -+ -+static struct nf_hook_ops imq_ingress_ipv4 = { -+ .hook = imq_nf_hook, -+ .owner = THIS_MODULE, -+ .pf = PF_INET, -+ .hooknum = NF_IP_PRE_ROUTING, -+#if defined(CONFIG_IMQ_BEHAVIOR_BA) || defined(CONFIG_IMQ_BEHAVIOR_BB) -+ .priority = NF_IP_PRI_MANGLE + 1 -+#else -+ .priority = NF_IP_PRI_NAT_DST + 1 -+#endif -+}; -+ -+static struct nf_hook_ops imq_egress_ipv4 = { -+ .hook = imq_nf_hook, -+ .owner = THIS_MODULE, -+ .pf = PF_INET, -+ .hooknum = NF_IP_POST_ROUTING, -+#if defined(CONFIG_IMQ_BEHAVIOR_AA) || defined(CONFIG_IMQ_BEHAVIOR_BA) -+ .priority = NF_IP_PRI_LAST -+#else -+ .priority = NF_IP_PRI_NAT_SRC - 1 -+#endif -+}; -+ -+#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) -+static struct nf_hook_ops imq_ingress_ipv6 = { -+ .hook = imq_nf_hook, -+ .owner = THIS_MODULE, -+ .pf = PF_INET6, -+ .hooknum = NF_IP6_PRE_ROUTING, -+#if defined(CONFIG_IMQ_BEHAVIOR_BA) || defined(CONFIG_IMQ_BEHAVIOR_BB) -+ .priority = NF_IP6_PRI_MANGLE + 1 -+#else -+ .priority = NF_IP6_PRI_NAT_DST + 1 -+#endif -+}; -+ -+static struct nf_hook_ops imq_egress_ipv6 = { -+ .hook = imq_nf_hook, -+ .owner = THIS_MODULE, -+ .pf = PF_INET6, -+ .hooknum = NF_IP6_POST_ROUTING, -+#if defined(CONFIG_IMQ_BEHAVIOR_AA) || defined(CONFIG_IMQ_BEHAVIOR_BA) -+ .priority = NF_IP6_PRI_LAST -+#else -+ .priority = NF_IP6_PRI_NAT_SRC - 1 -+#endif -+}; -+#endif -+ -+#if defined(CONFIG_IMQ_NUM_DEVS) -+static unsigned int numdevs = CONFIG_IMQ_NUM_DEVS; -+#else -+static unsigned int numdevs = 2; -+#endif -+ -+static struct net_device *imq_devs; -+ -+static struct net_device_stats *imq_get_stats(struct net_device *dev) -+{ -+ return (struct net_device_stats *)dev->priv; -+} -+ -+/* called for packets kfree'd in qdiscs at places other than enqueue */ -+static void imq_skb_destructor(struct sk_buff *skb) -+{ -+ struct nf_info *info = skb->nf_info; -+ -+ if (info) { -+ if (info->indev) -+ dev_put(info->indev); -+ if (info->outdev) -+ dev_put(info->outdev); -+ kfree(info); -+ } -+} -+ -+static int imq_dev_xmit(struct sk_buff *skb, struct net_device *dev) -+{ -+ struct net_device_stats *stats = (struct net_device_stats*) dev->priv; -+ -+ stats->tx_bytes += skb->len; -+ stats->tx_packets++; -+ -+ skb->imq_flags = 0; -+ skb->destructor = NULL; -+ -+ dev->trans_start = jiffies; -+ nf_reinject(skb, skb->nf_info, NF_ACCEPT); -+ return 0; -+} -+ -+static int imq_nf_queue(struct sk_buff *skb, struct nf_info *info, unsigned queue_num, void *data) -+{ -+ struct net_device *dev; -+ struct net_device_stats *stats; -+ struct sk_buff *skb2 = NULL; -+ struct Qdisc *q; -+ unsigned int index = skb->imq_flags&IMQ_F_IFMASK; -+ int ret = -1; -+ -+ if (index > numdevs) -+ return -1; -+ -+ dev = imq_devs + index; -+ if (!(dev->flags & IFF_UP)) { -+ skb->imq_flags = 0; -+ nf_reinject(skb, info, NF_ACCEPT); -+ return 0; -+ } -+ dev->last_rx = jiffies; -+ -+ if (skb->destructor) { -+ skb2 = skb; -+ skb = skb_clone(skb, GFP_ATOMIC); -+ if (!skb) -+ return -1; -+ } -+ skb->nf_info = info; -+ -+ stats = (struct net_device_stats *)dev->priv; -+ stats->rx_bytes+= skb->len; -+ stats->rx_packets++; -+ -+ spin_lock_bh(&dev->queue_lock); -+ q = dev->qdisc; -+ if (q->enqueue) { -+ q->enqueue(skb_get(skb), q); -+ if (skb_shared(skb)) { -+ skb->destructor = imq_skb_destructor; -+ kfree_skb(skb); -+ ret = 0; -+ } -+ } -+ if (spin_is_locked(&dev->_xmit_lock)) -+ netif_schedule(dev); -+ else -+ while (!netif_queue_stopped(dev) && qdisc_restart1(dev) < 0) -+ /* NOTHING */; -+ -+ spin_unlock_bh(&dev->queue_lock); -+ -+ if (skb2) -+ kfree_skb(ret ? skb : skb2); -+ -+ return ret; -+} -+ -+static struct nf_queue_handler nfqh = { -+ .name = "imq", -+ .outfn = imq_nf_queue, -+}; -+ -+static unsigned int imq_nf_hook(unsigned int hook, struct sk_buff **pskb, -+ const struct net_device *indev, -+ const struct net_device *outdev, -+ int (*okfn)(struct sk_buff *)) -+{ -+ if ((*pskb)->imq_flags & IMQ_F_ENQUEUE) -+ return NF_QUEUE; -+ -+ return NF_ACCEPT; -+} -+ -+ -+static int __init imq_init_hooks(void) -+{ -+ int err; -+ -+ err = nf_register_queue_handler(PF_INET, &nfqh); -+ if (err > 0) -+ goto err1; -+ if ((err = nf_register_hook(&imq_ingress_ipv4))) -+ goto err2; -+ if ((err = nf_register_hook(&imq_egress_ipv4))) -+ goto err3; -+#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) -+ if ((err = nf_register_queue_handler(PF_INET6, &nfqh))) -+ goto err4; -+ if ((err = nf_register_hook(&imq_ingress_ipv6))) -+ goto err5; -+ if ((err = nf_register_hook(&imq_egress_ipv6))) -+ goto err6; -+#endif -+ -+ return 0; -+ -+#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) -+err6: -+ nf_unregister_hook(&imq_ingress_ipv6); -+err5: -+ nf_unregister_queue_handler(PF_INET6); -+err4: -+ nf_unregister_hook(&imq_egress_ipv4); -+#endif -+err3: -+ nf_unregister_hook(&imq_ingress_ipv4); -+err2: -+ nf_unregister_queue_handler(PF_INET); -+err1: -+ return err; -+} -+ -+static void __exit imq_unhook(void) -+{ -+ nf_unregister_hook(&imq_ingress_ipv4); -+ nf_unregister_hook(&imq_egress_ipv4); -+ nf_unregister_queue_handler(PF_INET); -+#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) -+ nf_unregister_hook(&imq_ingress_ipv6); -+ nf_unregister_hook(&imq_egress_ipv6); -+ nf_unregister_queue_handler(PF_INET6); -+#endif -+} -+ -+static int __init imq_dev_init(struct net_device *dev) -+{ -+ dev->hard_start_xmit = imq_dev_xmit; -+ dev->type = ARPHRD_VOID; -+ dev->mtu = 1500; -+ dev->tx_queue_len = 30; -+ dev->flags = IFF_NOARP; -+ dev->priv = kmalloc(sizeof(struct net_device_stats), GFP_KERNEL); -+ if (dev->priv == NULL) -+ return -ENOMEM; -+ memset(dev->priv, 0, sizeof(struct net_device_stats)); -+ dev->get_stats = imq_get_stats; -+ -+ return 0; -+} -+ -+static void imq_dev_uninit(struct net_device *dev) -+{ -+ kfree(dev->priv); -+} -+ -+static int __init imq_init_devs(void) -+{ -+ struct net_device *dev; -+ int i,j; -+ j = numdevs; -+ -+ if (!numdevs || numdevs > IMQ_MAX_DEVS) { -+ printk(KERN_ERR "IMQ: numdevs has to be betweed 1 and %u\n", -+ IMQ_MAX_DEVS); -+ return -EINVAL; -+ } -+ -+ imq_devs = kmalloc(sizeof(struct net_device) * numdevs, GFP_KERNEL); -+ if (!imq_devs) -+ return -ENOMEM; -+ memset(imq_devs, 0, sizeof(struct net_device) * numdevs); -+ -+ /* we start counting at zero */ -+ numdevs--; -+ -+ for (i = 0, dev = imq_devs; i <= numdevs; i++, dev++) { -+ SET_MODULE_OWNER(dev); -+ strcpy(dev->name, "imq%d"); -+ dev->init = imq_dev_init; -+ dev->uninit = imq_dev_uninit; -+ -+ if (register_netdev(dev) < 0) -+ goto err_register; -+ } -+ printk(KERN_INFO "IMQ starting with %u devices...\n", j); -+ return 0; -+ -+err_register: -+ for (; i; i--) -+ unregister_netdev(--dev); -+ kfree(imq_devs); -+ return -EIO; -+} -+ -+static void imq_cleanup_devs(void) -+{ -+ int i; -+ struct net_device *dev = imq_devs; -+ -+ for (i = 0; i <= numdevs; i++) -+ unregister_netdev(dev++); -+ -+ kfree(imq_devs); -+} -+ -+static int __init imq_init_module(void) -+{ -+ int err; -+ -+ if ((err = imq_init_devs())) { -+ printk(KERN_ERR "IMQ: Error trying imq_init_devs()\n"); -+ return err; -+ } -+ if ((err = imq_init_hooks())) { -+ printk(KERN_ERR "IMQ: Error trying imq_init_hooks()\n"); -+ imq_cleanup_devs(); -+ return err; -+ } -+ -+ printk(KERN_INFO "IMQ driver loaded successfully.\n"); -+ -+#if defined(CONFIG_IMQ_BEHAVIOR_BA) || defined(CONFIG_IMQ_BEHAVIOR_BB) -+ printk(KERN_INFO "\tHooking IMQ before NAT on PREROUTING.\n"); -+#else -+ printk(KERN_INFO "\tHooking IMQ after NAT on PREROUTING.\n"); -+#endif -+#if defined(CONFIG_IMQ_BEHAVIOR_AB) || defined(CONFIG_IMQ_BEHAVIOR_BB) -+ printk(KERN_INFO "\tHooking IMQ before NAT on POSTROUTING.\n"); -+#else -+ printk(KERN_INFO "\tHooking IMQ after NAT on POSTROUTING.\n"); -+#endif -+ -+ return 0; -+} -+ -+static void __exit imq_cleanup_module(void) -+{ -+ imq_unhook(); -+ imq_cleanup_devs(); -+ printk(KERN_INFO "IMQ driver unloaded successfully.\n"); -+} -+ -+ -+module_init(imq_init_module); -+module_exit(imq_cleanup_module); -+ -+module_param(numdevs, int, 0); -+MODULE_PARM_DESC(numdevs, "number of IMQ devices (how many imq* devices will be created)"); -+MODULE_AUTHOR("http://www.linuximq.net"); -+MODULE_DESCRIPTION("Pseudo-driver for the intermediate queue device. See http://www.linuximq.net/ for more information."); -+MODULE_LICENSE("GPL"); ---- a/drivers/net/Kconfig -+++ b/drivers/net/Kconfig -@@ -96,6 +96,129 @@ config EQUALIZER - To compile this driver as a module, choose M here: the module - will be called eql. If unsure, say N. - -+config IMQ -+ tristate "IMQ (intermediate queueing device) support" -+ depends on NETDEVICES && NETFILTER -+ ---help--- -+ The IMQ device(s) is used as placeholder for QoS queueing -+ disciplines. Every packet entering/leaving the IP stack can be -+ directed through the IMQ device where it's enqueued/dequeued to the -+ attached qdisc. This allows you to treat network devices as classes -+ and distribute bandwidth among them. Iptables is used to specify -+ through which IMQ device, if any, packets travel. -+ -+ More information at: http://www.linuximq.net/ -+ -+ To compile this driver as a module, choose M here: the module -+ will be called imq. If unsure, say N. -+ -+choice -+ prompt "IMQ behavior (PRE/POSTROUTING)" -+ depends on IMQ -+ default IMQ_BEHAVIOR_BA -+ help -+ -+ This settings defines how IMQ behaves in respect to its -+ hooking in PREROUTING and POSTROUTING. -+ -+ IMQ can work in any of the following ways: -+ -+ PREROUTING | POSTROUTING -+ -----------------|------------------- -+ #1 After NAT | After NAT -+ #2 After NAT | Before NAT -+ #3 Before NAT | After NAT -+ #4 Before NAT | Before NAT -+ -+ The default behavior is to hook before NAT on PREROUTING -+ and after NAT on POSTROUTING (#3). -+ -+ This settings are specially usefull when trying to use IMQ -+ to shape NATed clients. -+ -+ More information can be found at: www.linuximq.net -+ -+ If not sure leave the default settings alone. -+ -+config IMQ_BEHAVIOR_AA -+ bool "IMQ AA" -+ help -+ This settings defines how IMQ behaves in respect to its -+ hooking in PREROUTING and POSTROUTING. -+ -+ Choosing this option will make IMQ hook like this: -+ -+ PREROUTING: After NAT -+ POSTROUTING: After NAT -+ -+ More information can be found at: www.linuximq.net -+ -+ If not sure leave the default settings alone. -+ -+config IMQ_BEHAVIOR_AB -+ bool "IMQ AB" -+ help -+ This settings defines how IMQ behaves in respect to its -+ hooking in PREROUTING and POSTROUTING. -+ -+ Choosing this option will make IMQ hook like this: -+ -+ PREROUTING: After NAT -+ POSTROUTING: Before NAT -+ -+ More information can be found at: www.linuximq.net -+ -+ If not sure leave the default settings alone. -+ -+config IMQ_BEHAVIOR_BA -+ bool "IMQ BA" -+ help -+ This settings defines how IMQ behaves in respect to its -+ hooking in PREROUTING and POSTROUTING. -+ -+ Choosing this option will make IMQ hook like this: -+ -+ PREROUTING: Before NAT -+ POSTROUTING: After NAT -+ -+ More information can be found at: www.linuximq.net -+ -+ If not sure leave the default settings alone. -+ -+config IMQ_BEHAVIOR_BB -+ bool "IMQ BB" -+ help -+ This settings defines how IMQ behaves in respect to its -+ hooking in PREROUTING and POSTROUTING. -+ -+ Choosing this option will make IMQ hook like this: -+ -+ PREROUTING: Before NAT -+ POSTROUTING: Before NAT -+ -+ More information can be found at: www.linuximq.net -+ -+ If not sure leave the default settings alone. -+ -+endchoice -+ -+config IMQ_NUM_DEVS -+ -+ int "Number of IMQ devices" -+ range 2 8 -+ depends on IMQ -+ default "2" -+ help -+ -+ This settings defines how many IMQ devices will be -+ created. -+ -+ The default value is 2. -+ -+ More information can be found at: www.linuximq.net -+ -+ If not sure leave the default settings alone. -+ - config TUN - tristate "Universal TUN/TAP device driver support" - select CRC32 ---- a/drivers/net/Makefile -+++ b/drivers/net/Makefile -@@ -124,6 +124,7 @@ obj-$(CONFIG_SLIP) += slip.o - obj-$(CONFIG_SLHC) += slhc.o - - obj-$(CONFIG_DUMMY) += dummy.o -+obj-$(CONFIG_IMQ) += imq.o - obj-$(CONFIG_IFB) += ifb.o - obj-$(CONFIG_DE600) += de600.o - obj-$(CONFIG_DE620) += de620.o ---- /dev/null -+++ b/include/linux/imq.h -@@ -0,0 +1,9 @@ -+#ifndef _IMQ_H -+#define _IMQ_H -+ -+#define IMQ_MAX_DEVS 16 -+ -+#define IMQ_F_IFMASK 0x7f -+#define IMQ_F_ENQUEUE 0x80 -+ -+#endif /* _IMQ_H */ ---- /dev/null -+++ b/include/linux/netfilter_ipv4/ipt_IMQ.h -@@ -0,0 +1,8 @@ -+#ifndef _IPT_IMQ_H -+#define _IPT_IMQ_H -+ -+struct ipt_imq_info { -+ unsigned int todev; /* target imq device */ -+}; -+ -+#endif /* _IPT_IMQ_H */ ---- /dev/null -+++ b/include/linux/netfilter_ipv6/ip6t_IMQ.h -@@ -0,0 +1,8 @@ -+#ifndef _IP6T_IMQ_H -+#define _IP6T_IMQ_H -+ -+struct ip6t_imq_info { -+ unsigned int todev; /* target imq device */ -+}; -+ -+#endif /* _IP6T_IMQ_H */ ---- a/include/linux/skbuff.h -+++ b/include/linux/skbuff.h -@@ -294,6 +294,10 @@ struct sk_buff { - #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) - struct sk_buff *nfct_reasm; - #endif -+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE) -+ unsigned char imq_flags; -+ struct nf_info *nf_info; -+#endif - #ifdef CONFIG_BRIDGE_NETFILTER - struct nf_bridge_info *nf_bridge; - #endif ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -94,6 +94,9 @@ - #include - #include - #include -+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE) -+#include -+#endif - #include - #include - #include -@@ -1340,7 +1343,11 @@ static int dev_gso_segment(struct sk_buf - int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) - { - if (likely(!skb->next)) { -- if (netdev_nit) -+ if (netdev_nit -+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE) -+ && !(skb->imq_flags & IMQ_F_ENQUEUE) -+#endif -+ ) - dev_queue_xmit_nit(skb, dev); - - if (netif_needs_gso(dev, skb)) { ---- a/net/core/skbuff.c -+++ b/net/core/skbuff.c -@@ -430,6 +430,10 @@ struct sk_buff *skb_clone(struct sk_buff - C(nfct_reasm); - nf_conntrack_get_reasm(skb->nfct_reasm); - #endif -+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE) -+ C(imq_flags); -+ C(nf_info); -+#endif /*CONFIG_IMQ*/ - #ifdef CONFIG_BRIDGE_NETFILTER - C(nf_bridge); - nf_bridge_get(skb->nf_bridge); -@@ -494,6 +498,10 @@ static void copy_skb_header(struct sk_bu - #if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE) - new->ipvs_property = old->ipvs_property; - #endif -+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE) -+ new->imq_flags = old->imq_flags; -+ new->nf_info = old->nf_info; -+#endif /*CONFIG_IMQ*/ - #ifdef CONFIG_BRIDGE_NETFILTER - new->nf_bridge = old->nf_bridge; - nf_bridge_get(old->nf_bridge); ---- /dev/null -+++ b/net/ipv4/netfilter/ipt_IMQ.c -@@ -0,0 +1,69 @@ -+/* -+ * This target marks packets to be enqueued to an imq device -+ */ -+#include -+#include -+#include -+#include -+#include -+ -+static unsigned int imq_target(struct sk_buff **pskb, -+ const struct net_device *in, -+ const struct net_device *out, -+ unsigned int hooknum, -+ const struct xt_target *target, -+ const void *targinfo) -+{ -+ struct ipt_imq_info *mr = (struct ipt_imq_info*)targinfo; -+ -+ (*pskb)->imq_flags = mr->todev | IMQ_F_ENQUEUE; -+ -+ return XT_CONTINUE; -+} -+ -+static int imq_checkentry(const char *tablename, -+ const void *e, -+ const struct xt_target *target, -+ void *targinfo, -+ unsigned int hook_mask) -+{ -+ struct ipt_imq_info *mr; -+ -+ mr = (struct ipt_imq_info*)targinfo; -+ -+ if (mr->todev > IMQ_MAX_DEVS) { -+ printk(KERN_WARNING -+ "IMQ: invalid device specified, highest is %u\n", -+ IMQ_MAX_DEVS); -+ return 0; -+ } -+ -+ return 1; -+} -+ -+static struct xt_target ipt_imq_reg = { -+ .name = "IMQ", -+ .family = AF_INET, -+ .target = imq_target, -+ .targetsize = sizeof(struct ipt_imq_info), -+ .checkentry = imq_checkentry, -+ .me = THIS_MODULE, -+ .table = "mangle" -+}; -+ -+static int __init init(void) -+{ -+ return xt_register_target(&ipt_imq_reg); -+} -+ -+static void __exit fini(void) -+{ -+ xt_unregister_target(&ipt_imq_reg); -+} -+ -+module_init(init); -+module_exit(fini); -+ -+MODULE_AUTHOR("http://www.linuximq.net"); -+MODULE_DESCRIPTION("Pseudo-driver for the intermediate queue device. See http://www.linuximq.net/ for more information."); -+MODULE_LICENSE("GPL"); ---- a/net/ipv4/netfilter/Kconfig -+++ b/net/ipv4/netfilter/Kconfig -@@ -581,6 +581,17 @@ config IP_NF_MANGLE - - To compile it as a module, choose M here. If unsure, say N. - -+config IP_NF_TARGET_IMQ -+ tristate "IMQ target support" -+ depends on IP_NF_MANGLE -+ help -+ This option adds a `IMQ' target which is used to specify if and -+ to which IMQ device packets should get enqueued/dequeued. -+ -+ For more information visit: http://www.linuximq.net/ -+ -+ To compile it as a module, choose M here. If unsure, say N. -+ - config IP_NF_TARGET_TOS - tristate "TOS target support" - depends on IP_NF_MANGLE ---- a/net/ipv4/netfilter/Makefile -+++ b/net/ipv4/netfilter/Makefile -@@ -97,6 +97,7 @@ obj-$(CONFIG_IP_NF_MATCH_ADDRTYPE) += ip - obj-$(CONFIG_IP_NF_TARGET_REJECT) += ipt_REJECT.o - obj-$(CONFIG_IP_NF_TARGET_TOS) += ipt_TOS.o - obj-$(CONFIG_IP_NF_TARGET_ECN) += ipt_ECN.o -+obj-$(CONFIG_IP_NF_TARGET_IMQ) += ipt_IMQ.o - obj-$(CONFIG_IP_NF_TARGET_MASQUERADE) += ipt_MASQUERADE.o - obj-$(CONFIG_IP_NF_TARGET_REDIRECT) += ipt_REDIRECT.o - obj-$(CONFIG_IP_NF_TARGET_NETMAP) += ipt_NETMAP.o ---- /dev/null -+++ b/net/ipv6/netfilter/ip6t_IMQ.c -@@ -0,0 +1,69 @@ -+/* -+ * This target marks packets to be enqueued to an imq device -+ */ -+#include -+#include -+#include -+#include -+#include -+ -+static unsigned int imq_target(struct sk_buff **pskb, -+ const struct net_device *in, -+ const struct net_device *out, -+ unsigned int hooknum, -+ const struct xt_target *target, -+ const void *targinfo) -+{ -+ struct ip6t_imq_info *mr = (struct ip6t_imq_info*)targinfo; -+ -+ (*pskb)->imq_flags = mr->todev | IMQ_F_ENQUEUE; -+ -+ return XT_CONTINUE; -+} -+ -+static int imq_checkentry(const char *tablename, -+ const void *entry, -+ const struct xt_target *target, -+ void *targinfo, -+ unsigned int hook_mask) -+{ -+ struct ip6t_imq_info *mr; -+ -+ mr = (struct ip6t_imq_info*)targinfo; -+ -+ if (mr->todev > IMQ_MAX_DEVS) { -+ printk(KERN_WARNING -+ "IMQ: invalid device specified, highest is %u\n", -+ IMQ_MAX_DEVS); -+ return 0; -+ } -+ -+ return 1; -+} -+ -+static struct xt_target ip6t_imq_reg = { -+ .name = "IMQ", -+ .family = AF_INET6, -+ .target = imq_target, -+ .targetsize = sizeof(struct ip6t_imq_info), -+ .table = "mangle", -+ .checkentry = imq_checkentry, -+ .me = THIS_MODULE -+}; -+ -+static int __init init(void) -+{ -+ return xt_register_target(&ip6t_imq_reg); -+} -+ -+static void __exit fini(void) -+{ -+ xt_unregister_target(&ip6t_imq_reg); -+} -+ -+module_init(init); -+module_exit(fini); -+ -+MODULE_AUTHOR("http://www.linuximq.net"); -+MODULE_DESCRIPTION("Pseudo-driver for the intermediate queue device. See http://www.linuximq.net/ for more information."); -+MODULE_LICENSE("GPL"); ---- a/net/ipv6/netfilter/Kconfig -+++ b/net/ipv6/netfilter/Kconfig -@@ -173,6 +173,15 @@ config IP6_NF_MANGLE - - To compile it as a module, choose M here. If unsure, say N. - -+config IP6_NF_TARGET_IMQ -+ tristate "IMQ target support" -+ depends on IP6_NF_MANGLE -+ help -+ This option adds a `IMQ' target which is used to specify if and -+ to which imq device packets should get enqueued/dequeued. -+ -+ To compile it as a module, choose M here. If unsure, say N. -+ - config IP6_NF_TARGET_HL - tristate 'HL (hoplimit) target support' - depends on IP6_NF_MANGLE ---- a/net/ipv6/netfilter/Makefile -+++ b/net/ipv6/netfilter/Makefile -@@ -13,6 +13,7 @@ obj-$(CONFIG_IP6_NF_MATCH_EUI64) += ip6t - obj-$(CONFIG_IP6_NF_MATCH_OWNER) += ip6t_owner.o - obj-$(CONFIG_IP6_NF_FILTER) += ip6table_filter.o - obj-$(CONFIG_IP6_NF_MANGLE) += ip6table_mangle.o -+obj-$(CONFIG_IP6_NF_TARGET_IMQ) += ip6t_IMQ.o - obj-$(CONFIG_IP6_NF_TARGET_HL) += ip6t_HL.o - obj-$(CONFIG_IP6_NF_QUEUE) += ip6_queue.o - obj-$(CONFIG_IP6_NF_TARGET_LOG) += ip6t_LOG.o ---- a/net/sched/sch_generic.c -+++ b/net/sched/sch_generic.c -@@ -87,7 +87,6 @@ void qdisc_unlock_tree(struct net_device - - NOTE: Called under dev->queue_lock with locally disabled BH. - */ -- - static inline int qdisc_restart(struct net_device *dev) - { - struct Qdisc *q = dev->qdisc; -@@ -181,6 +180,11 @@ requeue: - return q->q.qlen; - } - -+int qdisc_restart1(struct net_device *dev) -+{ -+ return qdisc_restart(dev); -+} -+ - void __qdisc_run(struct net_device *dev) - { - if (unlikely(dev->qdisc == &noop_qdisc)) -@@ -617,3 +621,4 @@ EXPORT_SYMBOL(qdisc_destroy); - EXPORT_SYMBOL(qdisc_reset); - EXPORT_SYMBOL(qdisc_lock_tree); - EXPORT_SYMBOL(qdisc_unlock_tree); -+EXPORT_SYMBOL(qdisc_restart1); diff --git a/target/linux/generic-2.6/patches-2.6.21/160-netfilter_route.patch b/target/linux/generic-2.6/patches-2.6.21/160-netfilter_route.patch deleted file mode 100644 index 8fcec08fc..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/160-netfilter_route.patch +++ /dev/null @@ -1,947 +0,0 @@ ---- /dev/null -+++ b/include/linux/netfilter_ipv4/ipt_ROUTE.h -@@ -0,0 +1,23 @@ -+/* Header file for iptables ipt_ROUTE target -+ * -+ * (C) 2002 by Cédric de Launois -+ * -+ * This software is distributed under GNU GPL v2, 1991 -+ */ -+#ifndef _IPT_ROUTE_H_target -+#define _IPT_ROUTE_H_target -+ -+#define IPT_ROUTE_IFNAMSIZ 16 -+ -+struct ipt_route_target_info { -+ char oif[IPT_ROUTE_IFNAMSIZ]; /* Output Interface Name */ -+ char iif[IPT_ROUTE_IFNAMSIZ]; /* Input Interface Name */ -+ u_int32_t gw; /* IP address of gateway */ -+ u_int8_t flags; -+}; -+ -+/* Values for "flags" field */ -+#define IPT_ROUTE_CONTINUE 0x01 -+#define IPT_ROUTE_TEE 0x02 -+ -+#endif /*_IPT_ROUTE_H_target*/ ---- /dev/null -+++ b/include/linux/netfilter_ipv6/ip6t_ROUTE.h -@@ -0,0 +1,23 @@ -+/* Header file for iptables ip6t_ROUTE target -+ * -+ * (C) 2003 by Cédric de Launois -+ * -+ * This software is distributed under GNU GPL v2, 1991 -+ */ -+#ifndef _IPT_ROUTE_H_target -+#define _IPT_ROUTE_H_target -+ -+#define IP6T_ROUTE_IFNAMSIZ 16 -+ -+struct ip6t_route_target_info { -+ char oif[IP6T_ROUTE_IFNAMSIZ]; /* Output Interface Name */ -+ char iif[IP6T_ROUTE_IFNAMSIZ]; /* Input Interface Name */ -+ u_int32_t gw[4]; /* IPv6 address of gateway */ -+ u_int8_t flags; -+}; -+ -+/* Values for "flags" field */ -+#define IP6T_ROUTE_CONTINUE 0x01 -+#define IP6T_ROUTE_TEE 0x02 -+ -+#endif /*_IP6T_ROUTE_H_target*/ ---- /dev/null -+++ b/net/ipv4/netfilter/ipt_ROUTE.c -@@ -0,0 +1,483 @@ -+/* -+ * This implements the ROUTE target, which enables you to setup unusual -+ * routes not supported by the standard kernel routing table. -+ * -+ * Copyright (C) 2002 Cedric de Launois -+ * -+ * v 1.11 2004/11/23 -+ * -+ * This software is distributed under GNU GPL v2, 1991 -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#if 0 -+#define DEBUGP printk -+#else -+#define DEBUGP(format, args...) -+#endif -+ -+MODULE_LICENSE("GPL"); -+MODULE_AUTHOR("Cedric de Launois "); -+MODULE_DESCRIPTION("iptables ROUTE target module"); -+ -+/* Try to route the packet according to the routing keys specified in -+ * route_info. Keys are : -+ * - ifindex : -+ * 0 if no oif preferred, -+ * otherwise set to the index of the desired oif -+ * - route_info->gw : -+ * 0 if no gateway specified, -+ * otherwise set to the next host to which the pkt must be routed -+ * If success, skb->dev is the output device to which the packet must -+ * be sent and skb->dst is not NULL -+ * -+ * RETURN: -1 if an error occured -+ * 1 if the packet was succesfully routed to the -+ * destination desired -+ * 0 if the kernel routing table could not route the packet -+ * according to the keys specified -+ */ -+static int route(struct sk_buff *skb, -+ unsigned int ifindex, -+ const struct ipt_route_target_info *route_info) -+{ -+ int err; -+ struct rtable *rt; -+ struct iphdr *iph = skb->nh.iph; -+ struct flowi fl = { -+ .oif = ifindex, -+ .nl_u = { -+ .ip4_u = { -+ .daddr = iph->daddr, -+ .saddr = 0, -+ .tos = RT_TOS(iph->tos), -+ .scope = RT_SCOPE_UNIVERSE, -+ } -+ } -+ }; -+ -+ /* The destination address may be overloaded by the target */ -+ if (route_info->gw) -+ fl.fl4_dst = route_info->gw; -+ -+ /* Trying to route the packet using the standard routing table. */ -+ if ((err = ip_route_output_key(&rt, &fl))) { -+ if (net_ratelimit()) -+ DEBUGP("ipt_ROUTE: couldn't route pkt (err: %i)",err); -+ return -1; -+ } -+ -+ /* Drop old route. */ -+ dst_release(skb->dst); -+ skb->dst = NULL; -+ -+ /* Success if no oif specified or if the oif correspond to the -+ * one desired */ -+ if (!ifindex || rt->u.dst.dev->ifindex == ifindex) { -+ skb->dst = &rt->u.dst; -+ skb->dev = skb->dst->dev; -+ skb->protocol = htons(ETH_P_IP); -+ return 1; -+ } -+ -+ /* The interface selected by the routing table is not the one -+ * specified by the user. This may happen because the dst address -+ * is one of our own addresses. -+ */ -+ if (net_ratelimit()) -+ DEBUGP("ipt_ROUTE: failed to route as desired gw=%u.%u.%u.%u oif=%i (got oif=%i)\n", -+ NIPQUAD(route_info->gw), ifindex, rt->u.dst.dev->ifindex); -+ -+ return 0; -+} -+ -+ -+/* Stolen from ip_finish_output2 -+ * PRE : skb->dev is set to the device we are leaving by -+ * skb->dst is not NULL -+ * POST: the packet is sent with the link layer header pushed -+ * the packet is destroyed -+ */ -+static void ip_direct_send(struct sk_buff *skb) -+{ -+ struct dst_entry *dst = skb->dst; -+ struct hh_cache *hh = dst->hh; -+ struct net_device *dev = dst->dev; -+ int hh_len = LL_RESERVED_SPACE(dev); -+ -+ /* Be paranoid, rather than too clever. */ -+ if (unlikely(skb_headroom(skb) < hh_len && dev->hard_header)) { -+ struct sk_buff *skb2; -+ -+ skb2 = skb_realloc_headroom(skb, LL_RESERVED_SPACE(dev)); -+ if (skb2 == NULL) { -+ kfree_skb(skb); -+ return; -+ } -+ if (skb->sk) -+ skb_set_owner_w(skb2, skb->sk); -+ kfree_skb(skb); -+ skb = skb2; -+ } -+ -+ if (hh) { -+ int hh_alen; -+ -+ read_lock_bh(&hh->hh_lock); -+ hh_alen = HH_DATA_ALIGN(hh->hh_len); -+ memcpy(skb->data - hh_alen, hh->hh_data, hh_alen); -+ read_unlock_bh(&hh->hh_lock); -+ skb_push(skb, hh->hh_len); -+ hh->hh_output(skb); -+ } else if (dst->neighbour) -+ dst->neighbour->output(skb); -+ else { -+ if (net_ratelimit()) -+ DEBUGP(KERN_DEBUG "ipt_ROUTE: no hdr & no neighbour cache!\n"); -+ kfree_skb(skb); -+ } -+} -+ -+ -+/* PRE : skb->dev is set to the device we are leaving by -+ * POST: - the packet is directly sent to the skb->dev device, without -+ * pushing the link layer header. -+ * - the packet is destroyed -+ */ -+static inline int dev_direct_send(struct sk_buff *skb) -+{ -+ return dev_queue_xmit(skb); -+} -+ -+ -+static unsigned int route_oif(const struct ipt_route_target_info *route_info, -+ struct sk_buff *skb) -+{ -+ unsigned int ifindex = 0; -+ struct net_device *dev_out = NULL; -+ -+ /* The user set the interface name to use. -+ * Getting the current interface index. -+ */ -+ if ((dev_out = dev_get_by_name(route_info->oif))) { -+ ifindex = dev_out->ifindex; -+ } else { -+ /* Unknown interface name : packet dropped */ -+ if (net_ratelimit()) -+ DEBUGP("ipt_ROUTE: oif interface %s not found\n", route_info->oif); -+ return NF_DROP; -+ } -+ -+ /* Trying the standard way of routing packets */ -+ switch (route(skb, ifindex, route_info)) { -+ case 1: -+ dev_put(dev_out); -+ if (route_info->flags & IPT_ROUTE_CONTINUE) -+ return IPT_CONTINUE; -+ -+ ip_direct_send(skb); -+ return NF_STOLEN; -+ -+ case 0: -+ /* Failed to send to oif. Trying the hard way */ -+ if (route_info->flags & IPT_ROUTE_CONTINUE) -+ return NF_DROP; -+ -+ if (net_ratelimit()) -+ DEBUGP("ipt_ROUTE: forcing the use of %i\n", -+ ifindex); -+ -+ /* We have to force the use of an interface. -+ * This interface must be a tunnel interface since -+ * otherwise we can't guess the hw address for -+ * the packet. For a tunnel interface, no hw address -+ * is needed. -+ */ -+ if ((dev_out->type != ARPHRD_TUNNEL) -+ && (dev_out->type != ARPHRD_IPGRE)) { -+ if (net_ratelimit()) -+ DEBUGP("ipt_ROUTE: can't guess the hw addr !\n"); -+ dev_put(dev_out); -+ return NF_DROP; -+ } -+ -+ /* Send the packet. This will also free skb -+ * Do not go through the POST_ROUTING hook because -+ * skb->dst is not set and because it will probably -+ * get confused by the destination IP address. -+ */ -+ skb->dev = dev_out; -+ dev_direct_send(skb); -+ dev_put(dev_out); -+ return NF_STOLEN; -+ -+ default: -+ /* Unexpected error */ -+ dev_put(dev_out); -+ return NF_DROP; -+ } -+} -+ -+ -+static unsigned int route_iif(const struct ipt_route_target_info *route_info, -+ struct sk_buff *skb) -+{ -+ struct net_device *dev_in = NULL; -+ -+ /* Getting the current interface index. */ -+ if (!(dev_in = dev_get_by_name(route_info->iif))) { -+ if (net_ratelimit()) -+ DEBUGP("ipt_ROUTE: iif interface %s not found\n", route_info->iif); -+ return NF_DROP; -+ } -+ -+ skb->dev = dev_in; -+ dst_release(skb->dst); -+ skb->dst = NULL; -+ -+ netif_rx(skb); -+ dev_put(dev_in); -+ return NF_STOLEN; -+} -+ -+ -+static unsigned int route_gw(const struct ipt_route_target_info *route_info, -+ struct sk_buff *skb) -+{ -+ if (route(skb, 0, route_info)!=1) -+ return NF_DROP; -+ -+ if (route_info->flags & IPT_ROUTE_CONTINUE) -+ return IPT_CONTINUE; -+ -+ ip_direct_send(skb); -+ return NF_STOLEN; -+} -+ -+ -+/* To detect and deter routed packet loopback when using the --tee option, -+ * we take a page out of the raw.patch book: on the copied skb, we set up -+ * a fake ->nfct entry, pointing to the local &route_tee_track. We skip -+ * routing packets when we see they already have that ->nfct. -+ */ -+ -+static struct ip_conntrack route_tee_track; -+ -+static unsigned int ipt_route_target(struct sk_buff **pskb, -+ const struct net_device *in, -+ const struct net_device *out, -+ unsigned int hooknum, -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17) -+ const struct xt_target *target, -+#endif -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) -+ const void *targinfo, -+ void *userinfo) -+#else -+ const void *targinfo) -+#endif -+{ -+ const struct ipt_route_target_info *route_info = targinfo; -+ struct sk_buff *skb = *pskb; -+ unsigned int res; -+ -+ if (skb->nfct == &route_tee_track.ct_general) { -+ /* Loopback - a packet we already routed, is to be -+ * routed another time. Avoid that, now. -+ */ -+ if (net_ratelimit()) -+ DEBUGP(KERN_DEBUG "ipt_ROUTE: loopback - DROP!\n"); -+ return NF_DROP; -+ } -+ -+ /* If we are at PREROUTING or INPUT hook -+ * the TTL isn't decreased by the IP stack -+ */ -+ if (hooknum == NF_IP_PRE_ROUTING || -+ hooknum == NF_IP_LOCAL_IN) { -+ -+ struct iphdr *iph = skb->nh.iph; -+ -+ if (iph->ttl <= 1) { -+ struct rtable *rt; -+ struct flowi fl = { -+ .oif = 0, -+ .nl_u = { -+ .ip4_u = { -+ .daddr = iph->daddr, -+ .saddr = iph->saddr, -+ .tos = RT_TOS(iph->tos), -+ .scope = ((iph->tos & RTO_ONLINK) ? -+ RT_SCOPE_LINK : -+ RT_SCOPE_UNIVERSE) -+ } -+ } -+ }; -+ -+ if (ip_route_output_key(&rt, &fl)) { -+ return NF_DROP; -+ } -+ -+ if (skb->dev == rt->u.dst.dev) { -+ /* Drop old route. */ -+ dst_release(skb->dst); -+ skb->dst = &rt->u.dst; -+ -+ /* this will traverse normal stack, and -+ * thus call conntrack on the icmp packet */ -+ icmp_send(skb, ICMP_TIME_EXCEEDED, -+ ICMP_EXC_TTL, 0); -+ } -+ -+ return NF_DROP; -+ } -+ -+ /* -+ * If we are at INPUT the checksum must be recalculated since -+ * the length could change as the result of a defragmentation. -+ */ -+ if(hooknum == NF_IP_LOCAL_IN) { -+ iph->ttl = iph->ttl - 1; -+ iph->check = 0; -+ iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); -+ } else { -+ ip_decrease_ttl(iph); -+ } -+ } -+ -+ if ((route_info->flags & IPT_ROUTE_TEE)) { -+ /* -+ * Copy the *pskb, and route the copy. Will later return -+ * IPT_CONTINUE for the original skb, which should continue -+ * on its way as if nothing happened. The copy should be -+ * independantly delivered to the ROUTE --gw. -+ */ -+ skb = skb_copy(*pskb, GFP_ATOMIC); -+ if (!skb) { -+ if (net_ratelimit()) -+ DEBUGP(KERN_DEBUG "ipt_ROUTE: copy failed!\n"); -+ return IPT_CONTINUE; -+ } -+ } -+ -+ /* Tell conntrack to forget this packet since it may get confused -+ * when a packet is leaving with dst address == our address. -+ * Good idea ? Dunno. Need advice. -+ * -+ * NEW: mark the skb with our &route_tee_track, so we avoid looping -+ * on any already routed packet. -+ */ -+ if (!(route_info->flags & IPT_ROUTE_CONTINUE)) { -+ nf_conntrack_put(skb->nfct); -+ skb->nfct = &route_tee_track.ct_general; -+ skb->nfctinfo = IP_CT_NEW; -+ nf_conntrack_get(skb->nfct); -+ } -+ -+ if (route_info->oif[0] != '\0') { -+ res = route_oif(route_info, skb); -+ } else if (route_info->iif[0] != '\0') { -+ res = route_iif(route_info, skb); -+ } else if (route_info->gw) { -+ res = route_gw(route_info, skb); -+ } else { -+ if (net_ratelimit()) -+ DEBUGP(KERN_DEBUG "ipt_ROUTE: no parameter !\n"); -+ res = IPT_CONTINUE; -+ } -+ -+ if ((route_info->flags & IPT_ROUTE_TEE)) -+ res = IPT_CONTINUE; -+ -+ return res; -+} -+ -+ -+static int ipt_route_checkentry(const char *tablename, -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ const void *e, -+#else -+ const struct ipt_ip *ip, -+#endif -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17) -+ const struct xt_target *target, -+#endif -+ void *targinfo, -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) -+ unsigned int targinfosize, -+#endif -+ unsigned int hook_mask) -+{ -+ if (strcmp(tablename, "mangle") != 0) { -+ printk("ipt_ROUTE: bad table `%s', use the `mangle' table.\n", -+ tablename); -+ return 0; -+ } -+ -+ if (hook_mask & ~( (1 << NF_IP_PRE_ROUTING) -+ | (1 << NF_IP_LOCAL_IN) -+ | (1 << NF_IP_FORWARD) -+ | (1 << NF_IP_LOCAL_OUT) -+ | (1 << NF_IP_POST_ROUTING))) { -+ printk("ipt_ROUTE: bad hook\n"); -+ return 0; -+ } -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) -+ if (targinfosize != IPT_ALIGN(sizeof(struct ipt_route_target_info))) { -+ printk(KERN_WARNING "ipt_ROUTE: targinfosize %u != %Zu\n", -+ targinfosize, -+ IPT_ALIGN(sizeof(struct ipt_route_target_info))); -+ return 0; -+ } -+#endif -+ -+ return 1; -+} -+ -+ -+static struct ipt_target ipt_route_reg = { -+ .name = "ROUTE", -+ .target = ipt_route_target, -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17) -+ .targetsize = sizeof(struct ipt_route_target_info), -+#endif -+ .checkentry = ipt_route_checkentry, -+ .me = THIS_MODULE, -+}; -+ -+static int __init init(void) -+{ -+ /* Set up fake conntrack (stolen from raw.patch): -+ - to never be deleted, not in any hashes */ -+ atomic_set(&route_tee_track.ct_general.use, 1); -+ /* - and look it like as a confirmed connection */ -+ set_bit(IPS_CONFIRMED_BIT, &route_tee_track.status); -+ /* Initialize fake conntrack so that NAT will skip it */ -+ route_tee_track.status |= IPS_NAT_DONE_MASK; -+ -+ return xt_register_target(&ipt_route_reg); -+} -+ -+ -+static void __exit fini(void) -+{ -+ xt_unregister_target(&ipt_route_reg); -+} -+ -+module_init(init); -+module_exit(fini); ---- a/net/ipv4/netfilter/Kconfig -+++ b/net/ipv4/netfilter/Kconfig -@@ -684,5 +684,22 @@ config IP_NF_ARP_MANGLE - Allows altering the ARP packet payload: source and destination - hardware and network addresses. - -+config IP_NF_TARGET_ROUTE -+ tristate 'ROUTE target support' -+ depends on IP_NF_MANGLE -+ help -+ This option adds a `ROUTE' target, which enables you to setup unusual -+ routes. For example, the ROUTE lets you route a received packet through -+ an interface or towards a host, even if the regular destination of the -+ packet is the router itself. The ROUTE target is also able to change the -+ incoming interface of a packet. -+ -+ The target can be or not a final target. It has to be used inside the -+ mangle table. -+ -+ If you want to compile it as a module, say M here and read -+ Documentation/modules.txt. The module will be called ipt_ROUTE.o. -+ If unsure, say `N'. -+ - endmenu - ---- a/net/ipv4/netfilter/Makefile -+++ b/net/ipv4/netfilter/Makefile -@@ -100,6 +100,7 @@ obj-$(CONFIG_IP_NF_TARGET_ECN) += ipt_EC - obj-$(CONFIG_IP_NF_TARGET_IMQ) += ipt_IMQ.o - obj-$(CONFIG_IP_NF_TARGET_MASQUERADE) += ipt_MASQUERADE.o - obj-$(CONFIG_IP_NF_TARGET_REDIRECT) += ipt_REDIRECT.o -+obj-$(CONFIG_IP_NF_TARGET_ROUTE) += ipt_ROUTE.o - obj-$(CONFIG_IP_NF_TARGET_NETMAP) += ipt_NETMAP.o - obj-$(CONFIG_IP_NF_TARGET_SAME) += ipt_SAME.o - obj-$(CONFIG_IP_NF_NAT_SNMP_BASIC) += ip_nat_snmp_basic.o ---- a/net/ipv6/ipv6_syms.c -+++ b/net/ipv6/ipv6_syms.c -@@ -10,6 +10,7 @@ EXPORT_SYMBOL(icmpv6_send); - EXPORT_SYMBOL(icmpv6_statistics); - EXPORT_SYMBOL(icmpv6_err_convert); - EXPORT_SYMBOL(ndisc_mc_map); -+EXPORT_SYMBOL(nd_tbl); - EXPORT_SYMBOL(register_inet6addr_notifier); - EXPORT_SYMBOL(unregister_inet6addr_notifier); - EXPORT_SYMBOL(ip6_route_output); ---- /dev/null -+++ b/net/ipv6/netfilter/ip6t_ROUTE.c -@@ -0,0 +1,330 @@ -+/* -+ * This implements the ROUTE v6 target, which enables you to setup unusual -+ * routes not supported by the standard kernel routing table. -+ * -+ * Copyright (C) 2003 Cedric de Launois -+ * -+ * v 1.1 2004/11/23 -+ * -+ * This software is distributed under GNU GPL v2, 1991 -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#if 1 -+#define DEBUGP printk -+#else -+#define DEBUGP(format, args...) -+#endif -+ -+#define NIP6(addr) \ -+ ntohs((addr).s6_addr16[0]), \ -+ ntohs((addr).s6_addr16[1]), \ -+ ntohs((addr).s6_addr16[2]), \ -+ ntohs((addr).s6_addr16[3]), \ -+ ntohs((addr).s6_addr16[4]), \ -+ ntohs((addr).s6_addr16[5]), \ -+ ntohs((addr).s6_addr16[6]), \ -+ ntohs((addr).s6_addr16[7]) -+ -+/* Route the packet according to the routing keys specified in -+ * route_info. Keys are : -+ * - ifindex : -+ * 0 if no oif preferred, -+ * otherwise set to the index of the desired oif -+ * - route_info->gw : -+ * 0 if no gateway specified, -+ * otherwise set to the next host to which the pkt must be routed -+ * If success, skb->dev is the output device to which the packet must -+ * be sent and skb->dst is not NULL -+ * -+ * RETURN: 1 if the packet was succesfully routed to the -+ * destination desired -+ * 0 if the kernel routing table could not route the packet -+ * according to the keys specified -+ */ -+static int -+route6(struct sk_buff *skb, -+ unsigned int ifindex, -+ const struct ip6t_route_target_info *route_info) -+{ -+ struct rt6_info *rt = NULL; -+ struct ipv6hdr *ipv6h = skb->nh.ipv6h; -+ struct in6_addr *gw = (struct in6_addr*)&route_info->gw; -+ -+ DEBUGP("ip6t_ROUTE: called with: "); -+ DEBUGP("DST=%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x ", NIP6(ipv6h->daddr)); -+ DEBUGP("GATEWAY=%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x ", NIP6(*gw)); -+ DEBUGP("OUT=%s\n", route_info->oif); -+ -+ if (ipv6_addr_any(gw)) -+ rt = rt6_lookup(&ipv6h->daddr, &ipv6h->saddr, ifindex, 1); -+ else -+ rt = rt6_lookup(gw, &ipv6h->saddr, ifindex, 1); -+ -+ if (!rt) -+ goto no_route; -+ -+ DEBUGP("ip6t_ROUTE: routing gives: "); -+ DEBUGP("DST=%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x ", NIP6(rt->rt6i_dst.addr)); -+ DEBUGP("GATEWAY=%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x ", NIP6(rt->rt6i_gateway)); -+ DEBUGP("OUT=%s\n", rt->rt6i_dev->name); -+ -+ if (ifindex && rt->rt6i_dev->ifindex!=ifindex) -+ goto wrong_route; -+ -+ if (!rt->rt6i_nexthop) { -+ DEBUGP("ip6t_ROUTE: discovering neighbour\n"); -+ rt->rt6i_nexthop = ndisc_get_neigh(rt->rt6i_dev, &rt->rt6i_dst.addr); -+ } -+ -+ /* Drop old route. */ -+ dst_release(skb->dst); -+ skb->dst = &rt->u.dst; -+ skb->dev = rt->rt6i_dev; -+ return 1; -+ -+ wrong_route: -+ dst_release(&rt->u.dst); -+ no_route: -+ if (!net_ratelimit()) -+ return 0; -+ -+ printk("ip6t_ROUTE: no explicit route found "); -+ if (ifindex) -+ printk("via interface %s ", route_info->oif); -+ if (!ipv6_addr_any(gw)) -+ printk("via gateway %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x", NIP6(*gw)); -+ printk("\n"); -+ return 0; -+} -+ -+ -+/* Stolen from ip6_output_finish -+ * PRE : skb->dev is set to the device we are leaving by -+ * skb->dst is not NULL -+ * POST: the packet is sent with the link layer header pushed -+ * the packet is destroyed -+ */ -+static void ip_direct_send(struct sk_buff *skb) -+{ -+ struct dst_entry *dst = skb->dst; -+ struct hh_cache *hh = dst->hh; -+ -+ if (hh) { -+ read_lock_bh(&hh->hh_lock); -+ memcpy(skb->data - 16, hh->hh_data, 16); -+ read_unlock_bh(&hh->hh_lock); -+ skb_push(skb, hh->hh_len); -+ hh->hh_output(skb); -+ } else if (dst->neighbour) -+ dst->neighbour->output(skb); -+ else { -+ if (net_ratelimit()) -+ DEBUGP(KERN_DEBUG "ip6t_ROUTE: no hdr & no neighbour cache!\n"); -+ kfree_skb(skb); -+ } -+} -+ -+ -+static unsigned int -+route6_oif(const struct ip6t_route_target_info *route_info, -+ struct sk_buff *skb) -+{ -+ unsigned int ifindex = 0; -+ struct net_device *dev_out = NULL; -+ -+ /* The user set the interface name to use. -+ * Getting the current interface index. -+ */ -+ if ((dev_out = dev_get_by_name(route_info->oif))) { -+ ifindex = dev_out->ifindex; -+ } else { -+ /* Unknown interface name : packet dropped */ -+ if (net_ratelimit()) -+ DEBUGP("ip6t_ROUTE: oif interface %s not found\n", route_info->oif); -+ -+ if (route_info->flags & IP6T_ROUTE_CONTINUE) -+ return IP6T_CONTINUE; -+ else -+ return NF_DROP; -+ } -+ -+ /* Trying the standard way of routing packets */ -+ if (route6(skb, ifindex, route_info)) { -+ dev_put(dev_out); -+ if (route_info->flags & IP6T_ROUTE_CONTINUE) -+ return IP6T_CONTINUE; -+ -+ ip_direct_send(skb); -+ return NF_STOLEN; -+ } else -+ return NF_DROP; -+} -+ -+ -+static unsigned int -+route6_gw(const struct ip6t_route_target_info *route_info, -+ struct sk_buff *skb) -+{ -+ if (route6(skb, 0, route_info)) { -+ if (route_info->flags & IP6T_ROUTE_CONTINUE) -+ return IP6T_CONTINUE; -+ -+ ip_direct_send(skb); -+ return NF_STOLEN; -+ } else -+ return NF_DROP; -+} -+ -+ -+static unsigned int -+ip6t_route_target(struct sk_buff **pskb, -+ const struct net_device *in, -+ const struct net_device *out, -+ unsigned int hooknum, -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17) -+ const struct xt_target *target, -+#endif -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) -+ const void *targinfo, -+ void *userinfo) -+#else -+ const void *targinfo) -+#endif -+{ -+ const struct ip6t_route_target_info *route_info = targinfo; -+ struct sk_buff *skb = *pskb; -+ struct in6_addr *gw = (struct in6_addr*)&route_info->gw; -+ unsigned int res; -+ -+ if (route_info->flags & IP6T_ROUTE_CONTINUE) -+ goto do_it; -+ -+ /* If we are at PREROUTING or INPUT hook -+ * the TTL isn't decreased by the IP stack -+ */ -+ if (hooknum == NF_IP6_PRE_ROUTING || -+ hooknum == NF_IP6_LOCAL_IN) { -+ -+ struct ipv6hdr *ipv6h = skb->nh.ipv6h; -+ -+ if (ipv6h->hop_limit <= 1) { -+ /* Force OUTPUT device used as source address */ -+ skb->dev = skb->dst->dev; -+ -+ icmpv6_send(skb, ICMPV6_TIME_EXCEED, -+ ICMPV6_EXC_HOPLIMIT, 0, skb->dev); -+ -+ return NF_DROP; -+ } -+ -+ ipv6h->hop_limit--; -+ } -+ -+ if ((route_info->flags & IP6T_ROUTE_TEE)) { -+ /* -+ * Copy the *pskb, and route the copy. Will later return -+ * IP6T_CONTINUE for the original skb, which should continue -+ * on its way as if nothing happened. The copy should be -+ * independantly delivered to the ROUTE --gw. -+ */ -+ skb = skb_copy(*pskb, GFP_ATOMIC); -+ if (!skb) { -+ if (net_ratelimit()) -+ DEBUGP(KERN_DEBUG "ip6t_ROUTE: copy failed!\n"); -+ return IP6T_CONTINUE; -+ } -+ } -+ -+do_it: -+ if (route_info->oif[0]) { -+ res = route6_oif(route_info, skb); -+ } else if (!ipv6_addr_any(gw)) { -+ res = route6_gw(route_info, skb); -+ } else { -+ if (net_ratelimit()) -+ DEBUGP(KERN_DEBUG "ip6t_ROUTE: no parameter !\n"); -+ res = IP6T_CONTINUE; -+ } -+ -+ if ((route_info->flags & IP6T_ROUTE_TEE)) -+ res = IP6T_CONTINUE; -+ -+ return res; -+} -+ -+ -+static int -+ip6t_route_checkentry(const char *tablename, -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ const void *entry, -+#else -+ const struct ip6t_entry *entry -+#endif -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17) -+ const struct xt_target *target, -+#endif -+ void *targinfo, -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) -+ unsigned int targinfosize, -+#endif -+ unsigned int hook_mask) -+{ -+ if (strcmp(tablename, "mangle") != 0) { -+ printk("ip6t_ROUTE: can only be called from \"mangle\" table.\n"); -+ return 0; -+ } -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) -+ if (targinfosize != IP6T_ALIGN(sizeof(struct ip6t_route_target_info))) { -+ printk(KERN_WARNING "ip6t_ROUTE: targinfosize %u != %Zu\n", -+ targinfosize, -+ IP6T_ALIGN(sizeof(struct ip6t_route_target_info))); -+ return 0; -+ } -+#endif -+ -+ return 1; -+} -+ -+ -+static struct ip6t_target ip6t_route_reg = { -+ .name = "ROUTE", -+ .target = ip6t_route_target, -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17) -+ .targetsize = sizeof(struct ip6t_route_target_info), -+#endif -+ .checkentry = ip6t_route_checkentry, -+ .me = THIS_MODULE -+}; -+ -+ -+static int __init init(void) -+{ -+ printk(KERN_DEBUG "registering ipv6 ROUTE target\n"); -+ if (xt_register_target(&ip6t_route_reg)) -+ return -EINVAL; -+ -+ return 0; -+} -+ -+ -+static void __exit fini(void) -+{ -+ xt_unregister_target(&ip6t_route_reg); -+} -+ -+module_init(init); -+module_exit(fini); -+MODULE_LICENSE("GPL"); ---- a/net/ipv6/netfilter/Kconfig -+++ b/net/ipv6/netfilter/Kconfig -@@ -209,5 +209,18 @@ config IP6_NF_RAW - If you want to compile it as a module, say M here and read - . If unsure, say `N'. - -+config IP6_NF_TARGET_ROUTE -+ tristate 'ROUTE target support' -+ depends on IP6_NF_MANGLE -+ help -+ This option adds a `ROUTE' target, which enables you to setup unusual -+ routes. The ROUTE target is also able to change the incoming interface -+ of a packet. -+ -+ The target can be or not a final target. It has to be used inside the -+ mangle table. -+ -+ Not working as a module. -+ - endmenu - ---- a/net/ipv6/netfilter/Makefile -+++ b/net/ipv6/netfilter/Makefile -@@ -20,6 +20,7 @@ obj-$(CONFIG_IP6_NF_TARGET_LOG) += ip6t_ - obj-$(CONFIG_IP6_NF_RAW) += ip6table_raw.o - obj-$(CONFIG_IP6_NF_MATCH_HL) += ip6t_hl.o - obj-$(CONFIG_IP6_NF_TARGET_REJECT) += ip6t_REJECT.o -+obj-$(CONFIG_IP6_NF_TARGET_ROUTE) += ip6t_ROUTE.o - obj-$(CONFIG_IP6_NF_MATCH_MH) += ip6t_mh.o - - # objects for l3 independent conntrack diff --git a/target/linux/generic-2.6/patches-2.6.21/180-netfilter_depends.patch b/target/linux/generic-2.6/patches-2.6.21/180-netfilter_depends.patch deleted file mode 100644 index 83c2247e2..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/180-netfilter_depends.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/net/netfilter/Kconfig -+++ b/net/netfilter/Kconfig -@@ -165,7 +165,7 @@ config NF_CONNTRACK_FTP - - config NF_CONNTRACK_H323 - tristate "H.323 protocol support (EXPERIMENTAL)" -- depends on EXPERIMENTAL && NF_CONNTRACK && (IPV6 || IPV6=n) -+ depends on EXPERIMENTAL && NF_CONNTRACK - help - H.323 is a VoIP signalling protocol from ITU-T. As one of the most - important VoIP protocols, it is widely used by voice hardware and -@@ -400,7 +400,7 @@ config NETFILTER_XT_TARGET_CONNSECMARK - - config NETFILTER_XT_TARGET_TCPMSS - tristate '"TCPMSS" target support' -- depends on NETFILTER_XTABLES && (IPV6 || IPV6=n) -+ depends on NETFILTER_XTABLES - ---help--- - This option adds a `TCPMSS' target, which allows you to alter the - MSS value of TCP SYN packets, to control the maximum size for that diff --git a/target/linux/generic-2.6/patches-2.6.21/200-sched_esfq.patch b/target/linux/generic-2.6/patches-2.6.21/200-sched_esfq.patch deleted file mode 100644 index 6f65c5193..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/200-sched_esfq.patch +++ /dev/null @@ -1,789 +0,0 @@ ---- a/include/linux/pkt_sched.h -+++ b/include/linux/pkt_sched.h -@@ -146,8 +146,40 @@ struct tc_sfq_qopt - * - * The only reason for this is efficiency, it is possible - * to change these parameters in compile time. -+ * -+ * If you need to play with these values use esfq instead. - */ - -+/* ESFQ section */ -+ -+enum -+{ -+ /* traditional */ -+ TCA_SFQ_HASH_CLASSIC, -+ TCA_SFQ_HASH_DST, -+ TCA_SFQ_HASH_SRC, -+ TCA_SFQ_HASH_FWMARK, -+ /* direct */ -+ TCA_SFQ_HASH_DSTDIR, -+ TCA_SFQ_HASH_SRCDIR, -+ TCA_SFQ_HASH_FWMARKDIR, -+ /* conntrack */ -+ TCA_SFQ_HASH_CTORIGDST, -+ TCA_SFQ_HASH_CTORIGSRC, -+ TCA_SFQ_HASH_CTREPLDST, -+ TCA_SFQ_HASH_CTREPLSRC, -+}; -+ -+struct tc_esfq_qopt -+{ -+ unsigned quantum; /* Bytes per round allocated to flow */ -+ int perturb_period; /* Period of hash perturbation */ -+ __u32 limit; /* Maximal packets in queue */ -+ unsigned divisor; /* Hash divisor */ -+ unsigned flows; /* Maximal number of flows */ -+ unsigned hash_kind; /* Hash function to use for flow identification */ -+}; -+ - /* RED section */ - - enum ---- a/net/sched/Kconfig -+++ b/net/sched/Kconfig -@@ -189,6 +189,26 @@ config NET_SCH_SFQ - To compile this code as a module, choose M here: the - module will be called sch_sfq. - -+config NET_SCH_ESFQ -+ tristate "Enhanced Stochastic Fairness Queueing (ESFQ)" -+ ---help--- -+ Say Y here if you want to use the Enhanced Stochastic Fairness -+ Queueing (ESFQ) packet scheduling algorithm for some of your network -+ devices or as a leaf discipline for a classful qdisc such as HTB or -+ CBQ (see the top of for details and -+ references to the SFQ algorithm). -+ -+ This is an enchanced SFQ version which allows you to control some -+ hardcoded values in the SFQ scheduler. -+ -+ ESFQ also adds control of the hash function used to identify packet -+ flows. The original SFQ discipline hashes by connection; ESFQ add -+ several other hashing methods, such as by src IP or by dst IP, which -+ can be more fair to users in some networking situations. -+ -+ To compile this code as a module, choose M here: the -+ module will be called sch_esfq. -+ - config NET_SCH_TEQL - tristate "True Link Equalizer (TEQL)" - ---help--- ---- a/net/sched/Makefile -+++ b/net/sched/Makefile -@@ -23,6 +23,7 @@ obj-$(CONFIG_NET_SCH_GRED) += sch_gred.o - obj-$(CONFIG_NET_SCH_INGRESS) += sch_ingress.o - obj-$(CONFIG_NET_SCH_DSMARK) += sch_dsmark.o - obj-$(CONFIG_NET_SCH_SFQ) += sch_sfq.o -+obj-$(CONFIG_NET_SCH_ESFQ) += sch_esfq.o - obj-$(CONFIG_NET_SCH_TBF) += sch_tbf.o - obj-$(CONFIG_NET_SCH_TEQL) += sch_teql.o - obj-$(CONFIG_NET_SCH_PRIO) += sch_prio.o ---- /dev/null -+++ b/net/sched/sch_esfq.c -@@ -0,0 +1,704 @@ -+/* -+ * net/sched/sch_esfq.c Extended Stochastic Fairness Queueing discipline. -+ * -+ * 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. -+ * -+ * Authors: Alexey Kuznetsov, -+ * -+ * Changes: Alexander Atanasov, -+ * Added dynamic depth,limit,divisor,hash_kind options. -+ * Added dst and src hashes. -+ * -+ * Alexander Clouter, -+ * Ported ESFQ to Linux 2.6. -+ * -+ * Corey Hickey, -+ * Maintenance of the Linux 2.6 port. -+ * Added fwmark hash (thanks to Robert Kurjata). -+ * Added direct hashing for src, dst, and fwmark. -+ * Added usage of jhash. -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#ifdef CONFIG_NF_CONNTRACK_ENABLED -+#include -+#endif -+ -+/* Stochastic Fairness Queuing algorithm. -+ For more comments look at sch_sfq.c. -+ The difference is that you can change limit, depth, -+ hash table size and choose alternate hash types. -+ -+ classic: same as in sch_sfq.c -+ dst: destination IP address -+ src: source IP address -+ fwmark: netfilter mark value -+ dst_direct: -+ src_direct: -+ fwmark_direct: direct hashing of the above sources -+ ctorigdst: original destination IP address -+ ctorigsrc: original source IP address -+ ctrepldst: reply destination IP address -+ ctreplsrc: reply source IP -+ -+*/ -+ -+ -+/* This type should contain at least SFQ_DEPTH*2 values */ -+typedef unsigned int esfq_index; -+ -+struct esfq_head -+{ -+ esfq_index next; -+ esfq_index prev; -+}; -+ -+struct esfq_sched_data -+{ -+/* Parameters */ -+ int perturb_period; -+ unsigned quantum; /* Allotment per round: MUST BE >= MTU */ -+ int limit; -+ unsigned depth; -+ unsigned hash_divisor; -+ unsigned hash_kind; -+/* Variables */ -+ struct timer_list perturb_timer; -+ int perturbation; -+ esfq_index tail; /* Index of current slot in round */ -+ esfq_index max_depth; /* Maximal depth */ -+ -+ esfq_index *ht; /* Hash table */ -+ esfq_index *next; /* Active slots link */ -+ short *allot; /* Current allotment per slot */ -+ unsigned short *hash; /* Hash value indexed by slots */ -+ struct sk_buff_head *qs; /* Slot queue */ -+ struct esfq_head *dep; /* Linked list of slots, indexed by depth */ -+ unsigned dyn_min; /* For dynamic divisor adjustment; minimum value seen */ -+ unsigned dyn_max; /* maximum value seen */ -+ unsigned dyn_range; /* saved range */ -+}; -+ -+/* This contains the info we will hash. */ -+struct esfq_packet_info -+{ -+ u32 proto; /* protocol or port */ -+ u32 src; /* source from packet header */ -+ u32 dst; /* destination from packet header */ -+ u32 ctorigsrc; /* original source from conntrack */ -+ u32 ctorigdst; /* original destination from conntrack */ -+ u32 ctreplsrc; /* reply source from conntrack */ -+ u32 ctrepldst; /* reply destination from conntrack */ -+ u32 mark; /* netfilter mark (fwmark) */ -+}; -+ -+/* Hash input values directly into the "nearest" slot, taking into account the -+ * range of input values seen. This is most useful when the hash table is at -+ * least as large as the range of possible values. -+ * Note: this functionality was added before the change to using jhash, and may -+ * no longer be useful. */ -+static __inline__ unsigned esfq_hash_direct(struct esfq_sched_data *q, u32 h) -+{ -+ /* adjust minimum and maximum */ -+ if (h < q->dyn_min || h > q->dyn_max) { -+ q->dyn_min = h < q->dyn_min ? h : q->dyn_min; -+ q->dyn_max = h > q->dyn_max ? h : q->dyn_max; -+ -+ /* find new range */ -+ if ((q->dyn_range = q->dyn_max - q->dyn_min) >= q->hash_divisor) -+ printk(KERN_WARNING "ESFQ: (direct hash) Input range %u is larger than hash " -+ "table. See ESFQ README for details.\n", q->dyn_range); -+ } -+ -+ /* hash input values into slot numbers */ -+ if (q->dyn_min == q->dyn_max) -+ return 0; /* only one value seen; avoid division by 0 */ -+ else -+ return (h - q->dyn_min) * (q->hash_divisor - 1) / q->dyn_range; -+} -+ -+static __inline__ unsigned esfq_jhash_1word(struct esfq_sched_data *q,u32 a) -+{ -+ return jhash_1word(a, q->perturbation) & (q->hash_divisor-1); -+} -+ -+static __inline__ unsigned esfq_jhash_2words(struct esfq_sched_data *q, u32 a, u32 b) -+{ -+ return jhash_2words(a, b, q->perturbation) & (q->hash_divisor-1); -+} -+ -+static __inline__ unsigned esfq_jhash_3words(struct esfq_sched_data *q, u32 a, u32 b, u32 c) -+{ -+ return jhash_3words(a, b, c, q->perturbation) & (q->hash_divisor-1); -+} -+ -+ -+static unsigned esfq_hash(struct esfq_sched_data *q, struct sk_buff *skb) -+{ -+ struct esfq_packet_info info; -+#ifdef CONFIG_NF_CONNTRACK_ENABLED -+ enum ip_conntrack_info ctinfo; -+ struct nf_conn *ct = nf_ct_get(skb, &ctinfo); -+#endif -+ -+ switch (skb->protocol) { -+ case __constant_htons(ETH_P_IP): -+ { -+ struct iphdr *iph = skb->nh.iph; -+ info.dst = iph->daddr; -+ info.src = iph->saddr; -+ if (!(iph->frag_off&htons(IP_MF|IP_OFFSET)) && -+ (iph->protocol == IPPROTO_TCP || -+ iph->protocol == IPPROTO_UDP || -+ iph->protocol == IPPROTO_SCTP || -+ iph->protocol == IPPROTO_DCCP || -+ iph->protocol == IPPROTO_ESP)) -+ info.proto = *(((u32*)iph) + iph->ihl); -+ else -+ info.proto = iph->protocol; -+ break; -+ } -+ case __constant_htons(ETH_P_IPV6): -+ { -+ struct ipv6hdr *iph = skb->nh.ipv6h; -+ /* Hash ipv6 addresses into a u32. This isn't ideal, -+ * but the code is simple. */ -+ info.dst = jhash2(iph->daddr.s6_addr32, 4, q->perturbation); -+ info.src = jhash2(iph->saddr.s6_addr32, 4, q->perturbation); -+ if (iph->nexthdr == IPPROTO_TCP || -+ iph->nexthdr == IPPROTO_UDP || -+ iph->nexthdr == IPPROTO_SCTP || -+ iph->nexthdr == IPPROTO_DCCP || -+ iph->nexthdr == IPPROTO_ESP) -+ info.proto = *(u32*)&iph[1]; -+ else -+ info.proto = iph->nexthdr; -+ break; -+ } -+ default: -+ info.dst = (u32)(unsigned long)skb->dst; -+ info.src = (u32)(unsigned long)skb->sk; -+ info.proto = skb->protocol; -+ } -+ -+ info.mark = skb->mark; -+ -+#ifdef CONFIG_NF_CONNTRACK_ENABLED -+ /* defaults if there is no conntrack info */ -+ info.ctorigsrc = info.src; -+ info.ctorigdst = info.dst; -+ info.ctreplsrc = info.dst; -+ info.ctrepldst = info.src; -+ /* collect conntrack info */ -+ if (ct && ct != &nf_conntrack_untracked) { -+ if (skb->protocol == __constant_htons(ETH_P_IP)) { -+ info.ctorigsrc = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip; -+ info.ctorigdst = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip; -+ info.ctreplsrc = ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3.ip; -+ info.ctrepldst = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip; -+ } -+ else if (skb->protocol == __constant_htons(ETH_P_IPV6)) { -+ /* Again, hash ipv6 addresses into a single u32. */ -+ info.ctorigsrc = jhash2(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip6, 4, q->perturbation); -+ info.ctorigdst = jhash2(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip6, 4, q->perturbation); -+ info.ctreplsrc = jhash2(ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3.ip6, 4, q->perturbation); -+ info.ctrepldst = jhash2(ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip6, 4, q->perturbation); -+ } -+ -+ } -+#endif -+ -+ switch(q->hash_kind) -+ { -+ case TCA_SFQ_HASH_CLASSIC: -+ return esfq_jhash_3words(q, info.dst, info.src, info.proto); -+ case TCA_SFQ_HASH_DST: -+ return esfq_jhash_1word(q, info.dst); -+ case TCA_SFQ_HASH_DSTDIR: -+ return esfq_hash_direct(q, ntohl(info.dst)); -+ case TCA_SFQ_HASH_SRC: -+ return esfq_jhash_1word(q, info.src); -+ case TCA_SFQ_HASH_SRCDIR: -+ return esfq_hash_direct(q, ntohl(info.src)); -+ case TCA_SFQ_HASH_FWMARK: -+ return esfq_jhash_1word(q, info.mark); -+ case TCA_SFQ_HASH_FWMARKDIR: -+ return esfq_hash_direct(q, info.mark); -+#ifdef CONFIG_NF_CONNTRACK_ENABLED -+ case TCA_SFQ_HASH_CTORIGDST: -+ return esfq_jhash_1word(q, info.ctorigdst); -+ case TCA_SFQ_HASH_CTORIGSRC: -+ return esfq_jhash_1word(q, info.ctorigsrc); -+ case TCA_SFQ_HASH_CTREPLDST: -+ return esfq_jhash_1word(q, info.ctrepldst); -+ case TCA_SFQ_HASH_CTREPLSRC: -+ return esfq_jhash_1word(q, info.ctreplsrc); -+#endif -+ default: -+ if (net_ratelimit()) -+ printk(KERN_WARNING "ESFQ: Unknown hash method. Falling back to classic.\n"); -+ } -+ return esfq_jhash_3words(q, info.dst, info.src, info.proto); -+} -+ -+static inline void esfq_link(struct esfq_sched_data *q, esfq_index x) -+{ -+ esfq_index p, n; -+ int d = q->qs[x].qlen + q->depth; -+ -+ p = d; -+ n = q->dep[d].next; -+ q->dep[x].next = n; -+ q->dep[x].prev = p; -+ q->dep[p].next = q->dep[n].prev = x; -+} -+ -+static inline void esfq_dec(struct esfq_sched_data *q, esfq_index x) -+{ -+ esfq_index p, n; -+ -+ n = q->dep[x].next; -+ p = q->dep[x].prev; -+ q->dep[p].next = n; -+ q->dep[n].prev = p; -+ -+ if (n == p && q->max_depth == q->qs[x].qlen + 1) -+ q->max_depth--; -+ -+ esfq_link(q, x); -+} -+ -+static inline void esfq_inc(struct esfq_sched_data *q, esfq_index x) -+{ -+ esfq_index p, n; -+ int d; -+ -+ n = q->dep[x].next; -+ p = q->dep[x].prev; -+ q->dep[p].next = n; -+ q->dep[n].prev = p; -+ d = q->qs[x].qlen; -+ if (q->max_depth < d) -+ q->max_depth = d; -+ -+ esfq_link(q, x); -+} -+ -+static unsigned int esfq_drop(struct Qdisc *sch) -+{ -+ struct esfq_sched_data *q = qdisc_priv(sch); -+ esfq_index d = q->max_depth; -+ struct sk_buff *skb; -+ unsigned int len; -+ -+ /* Queue is full! Find the longest slot and -+ drop a packet from it */ -+ -+ if (d > 1) { -+ esfq_index x = q->dep[d+q->depth].next; -+ skb = q->qs[x].prev; -+ len = skb->len; -+ __skb_unlink(skb, &q->qs[x]); -+ kfree_skb(skb); -+ esfq_dec(q, x); -+ sch->q.qlen--; -+ sch->qstats.drops++; -+ sch->qstats.backlog -= len; -+ return len; -+ } -+ -+ if (d == 1) { -+ /* It is difficult to believe, but ALL THE SLOTS HAVE LENGTH 1. */ -+ d = q->next[q->tail]; -+ q->next[q->tail] = q->next[d]; -+ q->allot[q->next[d]] += q->quantum; -+ skb = q->qs[d].prev; -+ len = skb->len; -+ __skb_unlink(skb, &q->qs[d]); -+ kfree_skb(skb); -+ esfq_dec(q, d); -+ sch->q.qlen--; -+ q->ht[q->hash[d]] = q->depth; -+ sch->qstats.drops++; -+ sch->qstats.backlog -= len; -+ return len; -+ } -+ -+ return 0; -+} -+ -+static int -+esfq_enqueue(struct sk_buff *skb, struct Qdisc* sch) -+{ -+ struct esfq_sched_data *q = qdisc_priv(sch); -+ unsigned hash = esfq_hash(q, skb); -+ unsigned depth = q->depth; -+ esfq_index x; -+ -+ x = q->ht[hash]; -+ if (x == depth) { -+ q->ht[hash] = x = q->dep[depth].next; -+ q->hash[x] = hash; -+ } -+ sch->qstats.backlog += skb->len; -+ __skb_queue_tail(&q->qs[x], skb); -+ esfq_inc(q, x); -+ if (q->qs[x].qlen == 1) { /* The flow is new */ -+ if (q->tail == depth) { /* It is the first flow */ -+ q->tail = x; -+ q->next[x] = x; -+ q->allot[x] = q->quantum; -+ } else { -+ q->next[x] = q->next[q->tail]; -+ q->next[q->tail] = x; -+ q->tail = x; -+ } -+ } -+ if (++sch->q.qlen < q->limit-1) { -+ sch->bstats.bytes += skb->len; -+ sch->bstats.packets++; -+ return 0; -+ } -+ -+ esfq_drop(sch); -+ return NET_XMIT_CN; -+} -+ -+static int -+esfq_requeue(struct sk_buff *skb, struct Qdisc* sch) -+{ -+ struct esfq_sched_data *q = qdisc_priv(sch); -+ unsigned hash = esfq_hash(q, skb); -+ unsigned depth = q->depth; -+ esfq_index x; -+ -+ x = q->ht[hash]; -+ if (x == depth) { -+ q->ht[hash] = x = q->dep[depth].next; -+ q->hash[x] = hash; -+ } -+ sch->qstats.backlog += skb->len; -+ __skb_queue_head(&q->qs[x], skb); -+ esfq_inc(q, x); -+ if (q->qs[x].qlen == 1) { /* The flow is new */ -+ if (q->tail == depth) { /* It is the first flow */ -+ q->tail = x; -+ q->next[x] = x; -+ q->allot[x] = q->quantum; -+ } else { -+ q->next[x] = q->next[q->tail]; -+ q->next[q->tail] = x; -+ q->tail = x; -+ } -+ } -+ if (++sch->q.qlen < q->limit - 1) { -+ sch->qstats.requeues++; -+ return 0; -+ } -+ -+ sch->qstats.drops++; -+ esfq_drop(sch); -+ return NET_XMIT_CN; -+} -+ -+ -+ -+ -+static struct sk_buff * -+esfq_dequeue(struct Qdisc* sch) -+{ -+ struct esfq_sched_data *q = qdisc_priv(sch); -+ struct sk_buff *skb; -+ unsigned depth = q->depth; -+ esfq_index a, old_a; -+ -+ /* No active slots */ -+ if (q->tail == depth) -+ return NULL; -+ -+ a = old_a = q->next[q->tail]; -+ -+ /* Grab packet */ -+ skb = __skb_dequeue(&q->qs[a]); -+ esfq_dec(q, a); -+ sch->q.qlen--; -+ sch->qstats.backlog -= skb->len; -+ -+ /* Is the slot empty? */ -+ if (q->qs[a].qlen == 0) { -+ q->ht[q->hash[a]] = depth; -+ a = q->next[a]; -+ if (a == old_a) { -+ q->tail = depth; -+ return skb; -+ } -+ q->next[q->tail] = a; -+ q->allot[a] += q->quantum; -+ } else if ((q->allot[a] -= skb->len) <= 0) { -+ q->tail = a; -+ a = q->next[a]; -+ q->allot[a] += q->quantum; -+ } -+ -+ return skb; -+} -+ -+static void -+esfq_reset(struct Qdisc* sch) -+{ -+ struct sk_buff *skb; -+ -+ while ((skb = esfq_dequeue(sch)) != NULL) -+ kfree_skb(skb); -+} -+ -+static void esfq_perturbation(unsigned long arg) -+{ -+ struct Qdisc *sch = (struct Qdisc*)arg; -+ struct esfq_sched_data *q = qdisc_priv(sch); -+ -+ q->perturbation = net_random()&0x1F; -+ -+ if (q->perturb_period) { -+ q->perturb_timer.expires = jiffies + q->perturb_period; -+ add_timer(&q->perturb_timer); -+ } -+} -+ -+static int esfq_change(struct Qdisc *sch, struct rtattr *opt) -+{ -+ struct esfq_sched_data *q = qdisc_priv(sch); -+ struct tc_esfq_qopt *ctl = RTA_DATA(opt); -+ int old_perturb = q->perturb_period; -+ -+ if (opt->rta_len < RTA_LENGTH(sizeof(*ctl))) -+ return -EINVAL; -+ -+ sch_tree_lock(sch); -+ q->quantum = ctl->quantum ? : psched_mtu(sch->dev); -+ q->perturb_period = ctl->perturb_period*HZ; -+// q->hash_divisor = ctl->divisor; -+// q->tail = q->limit = q->depth = ctl->flows; -+ -+ if (ctl->limit) -+ q->limit = min_t(u32, ctl->limit, q->depth); -+ -+ if (ctl->hash_kind) { -+ q->hash_kind = ctl->hash_kind; -+ if (q->hash_kind != TCA_SFQ_HASH_CLASSIC) -+ q->perturb_period = 0; -+ } -+ -+ // is sch_tree_lock enough to do this ? -+ while (sch->q.qlen >= q->limit-1) -+ esfq_drop(sch); -+ -+ if (old_perturb) -+ del_timer(&q->perturb_timer); -+ if (q->perturb_period) { -+ q->perturb_timer.expires = jiffies + q->perturb_period; -+ add_timer(&q->perturb_timer); -+ } else { -+ q->perturbation = 0; -+ } -+ sch_tree_unlock(sch); -+ return 0; -+} -+ -+static int esfq_init(struct Qdisc *sch, struct rtattr *opt) -+{ -+ struct esfq_sched_data *q = qdisc_priv(sch); -+ struct tc_esfq_qopt *ctl; -+ esfq_index p = ~0U/2; -+ int i; -+ -+ if (opt && opt->rta_len < RTA_LENGTH(sizeof(*ctl))) -+ return -EINVAL; -+ -+ init_timer(&q->perturb_timer); -+ q->perturb_timer.data = (unsigned long)sch; -+ q->perturb_timer.function = esfq_perturbation; -+ q->perturbation = 0; -+ q->hash_kind = TCA_SFQ_HASH_CLASSIC; -+ q->max_depth = 0; -+ q->dyn_min = ~0U; /* maximum value for this type */ -+ q->dyn_max = 0; /* dyn_min/dyn_max will be set properly upon first packet */ -+ if (opt == NULL) { -+ q->quantum = psched_mtu(sch->dev); -+ q->perturb_period = 0; -+ q->hash_divisor = 1024; -+ q->tail = q->limit = q->depth = 128; -+ -+ } else { -+ ctl = RTA_DATA(opt); -+ q->quantum = ctl->quantum ? : psched_mtu(sch->dev); -+ q->perturb_period = ctl->perturb_period*HZ; -+ q->hash_divisor = ctl->divisor ? : 1024; -+ q->tail = q->limit = q->depth = ctl->flows ? : 128; -+ -+ if ( q->depth > p - 1 ) -+ return -EINVAL; -+ -+ if (ctl->limit) -+ q->limit = min_t(u32, ctl->limit, q->depth); -+ -+ if (ctl->hash_kind) { -+ q->hash_kind = ctl->hash_kind; -+ } -+ -+ if (q->perturb_period) { -+ q->perturb_timer.expires = jiffies + q->perturb_period; -+ add_timer(&q->perturb_timer); -+ } -+ } -+ -+ q->ht = kmalloc(q->hash_divisor*sizeof(esfq_index), GFP_KERNEL); -+ if (!q->ht) -+ goto err_case; -+ -+ q->dep = kmalloc((1+q->depth*2)*sizeof(struct esfq_head), GFP_KERNEL); -+ if (!q->dep) -+ goto err_case; -+ q->next = kmalloc(q->depth*sizeof(esfq_index), GFP_KERNEL); -+ if (!q->next) -+ goto err_case; -+ -+ q->allot = kmalloc(q->depth*sizeof(short), GFP_KERNEL); -+ if (!q->allot) -+ goto err_case; -+ q->hash = kmalloc(q->depth*sizeof(unsigned short), GFP_KERNEL); -+ if (!q->hash) -+ goto err_case; -+ q->qs = kmalloc(q->depth*sizeof(struct sk_buff_head), GFP_KERNEL); -+ if (!q->qs) -+ goto err_case; -+ -+ for (i=0; i< q->hash_divisor; i++) -+ q->ht[i] = q->depth; -+ for (i=0; idepth; i++) { -+ skb_queue_head_init(&q->qs[i]); -+ q->dep[i+q->depth].next = i+q->depth; -+ q->dep[i+q->depth].prev = i+q->depth; -+ } -+ -+ for (i=0; idepth; i++) -+ esfq_link(q, i); -+ return 0; -+err_case: -+ del_timer(&q->perturb_timer); -+ if (q->ht) -+ kfree(q->ht); -+ if (q->dep) -+ kfree(q->dep); -+ if (q->next) -+ kfree(q->next); -+ if (q->allot) -+ kfree(q->allot); -+ if (q->hash) -+ kfree(q->hash); -+ if (q->qs) -+ kfree(q->qs); -+ return -ENOBUFS; -+} -+ -+static void esfq_destroy(struct Qdisc *sch) -+{ -+ struct esfq_sched_data *q = qdisc_priv(sch); -+ del_timer(&q->perturb_timer); -+ if(q->ht) -+ kfree(q->ht); -+ if(q->dep) -+ kfree(q->dep); -+ if(q->next) -+ kfree(q->next); -+ if(q->allot) -+ kfree(q->allot); -+ if(q->hash) -+ kfree(q->hash); -+ if(q->qs) -+ kfree(q->qs); -+} -+ -+static int esfq_dump(struct Qdisc *sch, struct sk_buff *skb) -+{ -+ struct esfq_sched_data *q = qdisc_priv(sch); -+ unsigned char *b = skb->tail; -+ struct tc_esfq_qopt opt; -+ -+ opt.quantum = q->quantum; -+ opt.perturb_period = q->perturb_period/HZ; -+ -+ opt.limit = q->limit; -+ opt.divisor = q->hash_divisor; -+ opt.flows = q->depth; -+ opt.hash_kind = q->hash_kind; -+ -+ RTA_PUT(skb, TCA_OPTIONS, sizeof(opt), &opt); -+ -+ return skb->len; -+ -+rtattr_failure: -+ skb_trim(skb, b - skb->data); -+ return -1; -+} -+ -+static struct Qdisc_ops esfq_qdisc_ops = -+{ -+ .next = NULL, -+ .cl_ops = NULL, -+ .id = "esfq", -+ .priv_size = sizeof(struct esfq_sched_data), -+ .enqueue = esfq_enqueue, -+ .dequeue = esfq_dequeue, -+ .requeue = esfq_requeue, -+ .drop = esfq_drop, -+ .init = esfq_init, -+ .reset = esfq_reset, -+ .destroy = esfq_destroy, -+ .change = NULL, /* esfq_change - needs more work */ -+ .dump = esfq_dump, -+ .owner = THIS_MODULE, -+}; -+ -+static int __init esfq_module_init(void) -+{ -+ return register_qdisc(&esfq_qdisc_ops); -+} -+static void __exit esfq_module_exit(void) -+{ -+ unregister_qdisc(&esfq_qdisc_ops); -+} -+module_init(esfq_module_init) -+module_exit(esfq_module_exit) -+MODULE_LICENSE("GPL"); diff --git a/target/linux/generic-2.6/patches-2.6.21/201-multiple_default_gateways.patch b/target/linux/generic-2.6/patches-2.6.21/201-multiple_default_gateways.patch deleted file mode 100644 index 2a4f461ac..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/201-multiple_default_gateways.patch +++ /dev/null @@ -1,352 +0,0 @@ ---- a/include/linux/netfilter_ipv4/ip_nat.h -+++ b/include/linux/netfilter_ipv4/ip_nat.h -@@ -64,6 +64,13 @@ struct ip_nat_info - - struct ip_conntrack; - -+/* Call input routing for SNAT-ed traffic */ -+extern unsigned int ip_nat_route_input(unsigned int hooknum, -+ struct sk_buff **pskb, -+ const struct net_device *in, -+ const struct net_device *out, -+ int (*okfn)(struct sk_buff *)); -+ - /* Set up the info structure to map into this range. */ - extern unsigned int ip_nat_setup_info(struct ip_conntrack *conntrack, - const struct ip_nat_range *range, ---- a/include/linux/rtnetlink.h -+++ b/include/linux/rtnetlink.h -@@ -293,6 +293,8 @@ struct rtnexthop - #define RTNH_F_DEAD 1 /* Nexthop is dead (used by multipath) */ - #define RTNH_F_PERVASIVE 2 /* Do recursive gateway lookup */ - #define RTNH_F_ONLINK 4 /* Gateway is forced on link */ -+#define RTNH_F_SUSPECT 8 /* We don't know the real state */ -+#define RTNH_F_BADSTATE (RTNH_F_DEAD | RTNH_F_SUSPECT) - - /* Macros to handle hexthops */ - ---- a/include/net/flow.h -+++ b/include/net/flow.h -@@ -19,6 +19,8 @@ struct flowi { - struct { - __be32 daddr; - __be32 saddr; -+ __u32 lsrc; -+ __u32 gw; - __u8 tos; - __u8 scope; - } ip4_u; -@@ -43,6 +45,8 @@ struct flowi { - #define fl6_flowlabel nl_u.ip6_u.flowlabel - #define fl4_dst nl_u.ip4_u.daddr - #define fl4_src nl_u.ip4_u.saddr -+#define fl4_lsrc nl_u.ip4_u.lsrc -+#define fl4_gw nl_u.ip4_u.gw - #define fl4_tos nl_u.ip4_u.tos - #define fl4_scope nl_u.ip4_u.scope - ---- a/net/ipv4/route.c -+++ b/net/ipv4/route.c -@@ -1208,6 +1208,7 @@ void ip_rt_redirect(__be32 old_gw, __be3 - - /* Gateway is different ... */ - rt->rt_gateway = new_gw; -+ if (rt->fl.fl4_gw) rt->fl.fl4_gw = new_gw; - - /* Redirect received -> path was valid */ - dst_confirm(&rth->u.dst); -@@ -1643,6 +1644,7 @@ static int ip_route_input_mc(struct sk_b - rth->fl.fl4_tos = tos; - rth->fl.mark = skb->mark; - rth->fl.fl4_src = saddr; -+ rth->fl.fl4_lsrc = 0; - rth->rt_src = saddr; - #ifdef CONFIG_NET_CLS_ROUTE - rth->u.dst.tclassid = itag; -@@ -1653,6 +1655,7 @@ static int ip_route_input_mc(struct sk_b - dev_hold(rth->u.dst.dev); - rth->idev = in_dev_get(rth->u.dst.dev); - rth->fl.oif = 0; -+ rth->fl.fl4_gw = 0; - rth->rt_gateway = daddr; - rth->rt_spec_dst= spec_dst; - rth->rt_type = RTN_MULTICAST; -@@ -1716,7 +1719,7 @@ static void ip_handle_martian_source(str - static inline int __mkroute_input(struct sk_buff *skb, - struct fib_result* res, - struct in_device *in_dev, -- __be32 daddr, __be32 saddr, u32 tos, -+ __be32 daddr, __be32 saddr, u32 tos, u32 lsrc, - struct rtable **result) - { - -@@ -1751,6 +1754,7 @@ static inline int __mkroute_input(struct - flags |= RTCF_DIRECTSRC; - - if (out_dev == in_dev && err && !(flags & (RTCF_NAT | RTCF_MASQ)) && -+ !lsrc && - (IN_DEV_SHARED_MEDIA(out_dev) || - inet_addr_onlink(out_dev, saddr, FIB_RES_GW(*res)))) - flags |= RTCF_DOREDIRECT; -@@ -1788,6 +1792,7 @@ static inline int __mkroute_input(struct - rth->fl.mark = skb->mark; - rth->fl.fl4_src = saddr; - rth->rt_src = saddr; -+ rth->fl.fl4_lsrc = lsrc; - rth->rt_gateway = daddr; - rth->rt_iif = - rth->fl.iif = in_dev->dev->ifindex; -@@ -1795,6 +1800,7 @@ static inline int __mkroute_input(struct - dev_hold(rth->u.dst.dev); - rth->idev = in_dev_get(rth->u.dst.dev); - rth->fl.oif = 0; -+ rth->fl.fl4_gw = 0; - rth->rt_spec_dst= spec_dst; - - rth->u.dst.input = ip_forward; -@@ -1816,19 +1822,21 @@ static inline int ip_mkroute_input_def(s - struct fib_result* res, - const struct flowi *fl, - struct in_device *in_dev, -- __be32 daddr, __be32 saddr, u32 tos) -+ __be32 daddr, __be32 saddr, u32 tos, -+ u32 lsrc) - { - struct rtable* rth = NULL; - int err; - unsigned hash; - -+ fib_select_default(fl, res); - #ifdef CONFIG_IP_ROUTE_MULTIPATH -- if (res->fi && res->fi->fib_nhs > 1 && fl->oif == 0) -+ if (res->fi && res->fi->fib_nhs > 1) - fib_select_multipath(fl, res); - #endif - - /* create a routing cache entry */ -- err = __mkroute_input(skb, res, in_dev, daddr, saddr, tos, &rth); -+ err = __mkroute_input(skb, res, in_dev, daddr, saddr, tos, lsrc, &rth); - if (err) - return err; - -@@ -1841,7 +1849,8 @@ static inline int ip_mkroute_input(struc - struct fib_result* res, - const struct flowi *fl, - struct in_device *in_dev, -- __be32 daddr, __be32 saddr, u32 tos) -+ __be32 daddr, __be32 saddr, u32 tos, -+ u32 lsrc) - { - #ifdef CONFIG_IP_ROUTE_MULTIPATH_CACHED - struct rtable* rth = NULL, *rtres; -@@ -1857,7 +1866,7 @@ static inline int ip_mkroute_input(struc - /* distinguish between multipath and singlepath */ - if (hopcount < 2) - return ip_mkroute_input_def(skb, res, fl, in_dev, daddr, -- saddr, tos); -+ saddr, tos, 0); - - /* add all alternatives to the routing cache */ - for (hop = 0; hop < hopcount; hop++) { -@@ -1869,7 +1878,7 @@ static inline int ip_mkroute_input(struc - - /* create a routing cache entry */ - err = __mkroute_input(skb, res, in_dev, daddr, saddr, tos, -- &rth); -+ 0, &rth); - if (err) - return err; - -@@ -1889,7 +1898,7 @@ static inline int ip_mkroute_input(struc - skb->dst = &rtres->u.dst; - return err; - #else /* CONFIG_IP_ROUTE_MULTIPATH_CACHED */ -- return ip_mkroute_input_def(skb, res, fl, in_dev, daddr, saddr, tos); -+ return ip_mkroute_input_def(skb, res, fl, in_dev, daddr, saddr, tos, lsrc); - #endif /* CONFIG_IP_ROUTE_MULTIPATH_CACHED */ - } - -@@ -1905,18 +1914,18 @@ static inline int ip_mkroute_input(struc - */ - - static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr, -- u8 tos, struct net_device *dev) -+ u8 tos, struct net_device *dev, u32 lsrc) - { - struct fib_result res; - struct in_device *in_dev = in_dev_get(dev); - struct flowi fl = { .nl_u = { .ip4_u = - { .daddr = daddr, -- .saddr = saddr, -+ .saddr = lsrc ? : saddr, - .tos = tos, - .scope = RT_SCOPE_UNIVERSE, - } }, - .mark = skb->mark, -- .iif = dev->ifindex }; -+ .iif = lsrc? loopback_dev.ifindex : dev->ifindex }; - unsigned flags = 0; - u32 itag = 0; - struct rtable * rth; -@@ -1949,6 +1958,12 @@ static int ip_route_input_slow(struct sk - if (BADCLASS(daddr) || ZERONET(daddr) || LOOPBACK(daddr)) - goto martian_destination; - -+ if (lsrc) { -+ if (MULTICAST(lsrc) || BADCLASS(lsrc) || -+ ZERONET(lsrc) || LOOPBACK(lsrc)) -+ goto e_inval; -+ } -+ - /* - * Now we are ready to route packet. - */ -@@ -1958,6 +1973,10 @@ static int ip_route_input_slow(struct sk - goto no_route; - } - free_res = 1; -+ if (lsrc && res.type != RTN_UNICAST && res.type != RTN_NAT) -+ goto e_inval; -+ fl.iif = dev->ifindex; -+ fl.fl4_src = saddr; - - RT_CACHE_STAT_INC(in_slow_tot); - -@@ -1982,7 +2001,7 @@ static int ip_route_input_slow(struct sk - if (res.type != RTN_UNICAST) - goto martian_destination; - -- err = ip_mkroute_input(skb, &res, &fl, in_dev, daddr, saddr, tos); -+ err = ip_mkroute_input(skb, &res, &fl, in_dev, daddr, saddr, tos, lsrc); - if (err == -ENOBUFS) - goto e_nobufs; - if (err == -EINVAL) -@@ -1997,6 +2016,8 @@ out: return err; - brd_input: - if (skb->protocol != htons(ETH_P_IP)) - goto e_inval; -+ if (lsrc) -+ goto e_inval; - - if (ZERONET(saddr)) - spec_dst = inet_select_addr(dev, 0, RT_SCOPE_LINK); -@@ -2037,6 +2058,7 @@ local_input: - rth->u.dst.dev = &loopback_dev; - dev_hold(rth->u.dst.dev); - rth->idev = in_dev_get(rth->u.dst.dev); -+ rth->fl.fl4_gw = 0; - rth->rt_gateway = daddr; - rth->rt_spec_dst= spec_dst; - rth->u.dst.input= ip_local_deliver; -@@ -2086,8 +2108,9 @@ martian_source: - goto e_inval; - } - --int ip_route_input(struct sk_buff *skb, __be32 daddr, __be32 saddr, -- u8 tos, struct net_device *dev) -+static inline int -+ip_route_input_cached(struct sk_buff *skb, __be32 daddr, __be32 saddr, -+ u8 tos, struct net_device *dev, u32 lsrc) - { - struct rtable * rth; - unsigned hash; -@@ -2102,6 +2125,7 @@ int ip_route_input(struct sk_buff *skb, - if (rth->fl.fl4_dst == daddr && - rth->fl.fl4_src == saddr && - rth->fl.iif == iif && -+ rth->fl.fl4_lsrc == lsrc && - rth->fl.oif == 0 && - rth->fl.mark == skb->mark && - rth->fl.fl4_tos == tos) { -@@ -2148,7 +2172,19 @@ int ip_route_input(struct sk_buff *skb, - rcu_read_unlock(); - return -EINVAL; - } -- return ip_route_input_slow(skb, daddr, saddr, tos, dev); -+ return ip_route_input_slow(skb, daddr, saddr, tos, dev, lsrc); -+} -+ -+int ip_route_input(struct sk_buff *skb, u32 daddr, u32 saddr, -+ u8 tos, struct net_device *dev) -+{ -+ return ip_route_input_cached(skb, daddr, saddr, tos, dev, 0); -+} -+ -+int ip_route_input_lookup(struct sk_buff *skb, u32 daddr, u32 saddr, -+ u8 tos, struct net_device *dev, u32 lsrc) -+{ -+ return ip_route_input_cached(skb, daddr, saddr, tos, dev, lsrc); - } - - static inline int __mkroute_output(struct rtable **result, -@@ -2227,6 +2263,7 @@ static inline int __mkroute_output(struc - rth->fl.fl4_tos = tos; - rth->fl.fl4_src = oldflp->fl4_src; - rth->fl.oif = oldflp->oif; -+ rth->fl.fl4_gw = oldflp->fl4_gw; - rth->fl.mark = oldflp->mark; - rth->rt_dst = fl->fl4_dst; - rth->rt_src = fl->fl4_src; -@@ -2367,6 +2404,7 @@ static int ip_route_output_slow(struct r - struct flowi fl = { .nl_u = { .ip4_u = - { .daddr = oldflp->fl4_dst, - .saddr = oldflp->fl4_src, -+ .gw = oldflp->fl4_gw, - .tos = tos & IPTOS_RT_MASK, - .scope = ((tos & RTO_ONLINK) ? - RT_SCOPE_LINK : -@@ -2470,6 +2508,7 @@ static int ip_route_output_slow(struct r - dev_out = &loopback_dev; - dev_hold(dev_out); - fl.oif = loopback_dev.ifindex; -+ fl.fl4_gw = 0; - res.type = RTN_LOCAL; - flags |= RTCF_LOCAL; - goto make_route; -@@ -2477,7 +2516,7 @@ static int ip_route_output_slow(struct r - - if (fib_lookup(&fl, &res)) { - res.fi = NULL; -- if (oldflp->oif) { -+ if (oldflp->oif && dev_out->flags & IFF_UP) { - /* Apparently, routing tables are wrong. Assume, - that the destination is on link. - -@@ -2517,6 +2556,7 @@ static int ip_route_output_slow(struct r - dev_out = &loopback_dev; - dev_hold(dev_out); - fl.oif = dev_out->ifindex; -+ fl.fl4_gw = 0; - if (res.fi) - fib_info_put(res.fi); - res.fi = NULL; -@@ -2524,13 +2564,12 @@ static int ip_route_output_slow(struct r - goto make_route; - } - -+ if (res.type == RTN_UNICAST) -+ fib_select_default(&fl, &res); - #ifdef CONFIG_IP_ROUTE_MULTIPATH -- if (res.fi->fib_nhs > 1 && fl.oif == 0) -+ if (res.fi->fib_nhs > 1) - fib_select_multipath(&fl, &res); -- else - #endif -- if (!res.prefixlen && res.type == RTN_UNICAST && !fl.oif) -- fib_select_default(&fl, &res); - - if (!fl.fl4_src) - fl.fl4_src = FIB_RES_PREFSRC(res); -@@ -2567,6 +2606,7 @@ int __ip_route_output_key(struct rtable - rth->fl.fl4_src == flp->fl4_src && - rth->fl.iif == 0 && - rth->fl.oif == flp->oif && -+ rth->fl.fl4_gw == flp->fl4_gw && - rth->fl.mark == flp->mark && - !((rth->fl.fl4_tos ^ flp->fl4_tos) & - (IPTOS_RT_MASK | RTO_ONLINK))) { -@@ -3199,3 +3239,4 @@ int __init ip_rt_init(void) - EXPORT_SYMBOL(__ip_select_ident); - EXPORT_SYMBOL(ip_route_input); - EXPORT_SYMBOL(ip_route_output_key); -+EXPORT_SYMBOL(ip_route_input_lookup); diff --git a/target/linux/generic-2.6/patches-2.6.21/202-mips-freestanding.patch b/target/linux/generic-2.6/patches-2.6.21/202-mips-freestanding.patch deleted file mode 100644 index bcf249746..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/202-mips-freestanding.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/arch/mips/Makefile -+++ b/arch/mips/Makefile -@@ -605,6 +605,9 @@ core-$(CONFIG_TOSHIBA_RBTX4938) += arch/ - core-$(CONFIG_TOSHIBA_RBTX4938) += arch/mips/tx4938/common/ - load-$(CONFIG_TOSHIBA_RBTX4938) += 0xffffffff80100000 - -+# temporary until string.h is fixed -+cflags-y += -ffreestanding -+ - cflags-y += -Iinclude/asm-mips/mach-generic - drivers-$(CONFIG_PCI) += arch/mips/pci/ - diff --git a/target/linux/generic-2.6/patches-2.6.21/204-jffs2_eofdetect.patch b/target/linux/generic-2.6/patches-2.6.21/204-jffs2_eofdetect.patch deleted file mode 100644 index 5206409a9..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/204-jffs2_eofdetect.patch +++ /dev/null @@ -1,56 +0,0 @@ ---- a/fs/jffs2/build.c -+++ b/fs/jffs2/build.c -@@ -107,6 +107,17 @@ static int jffs2_build_filesystem(struct - dbg_fsbuild("scanned flash completely\n"); - jffs2_dbg_dump_block_lists_nolock(c); - -+ if (c->flags & (1 << 7)) { -+ printk("%s(): unlocking the mtd device... ", __func__); -+ if (c->mtd->unlock) -+ c->mtd->unlock(c->mtd, 0, c->mtd->size); -+ printk("done.\n"); -+ -+ printk("%s(): erasing all blocks after the end marker... ", __func__); -+ jffs2_erase_pending_blocks(c, -1); -+ printk("done.\n"); -+ } -+ - dbg_fsbuild("pass 1 starting\n"); - c->flags |= JFFS2_SB_FLAG_BUILDING; - /* Now scan the directory tree, increasing nlink according to every dirent found. */ ---- a/fs/jffs2/scan.c -+++ b/fs/jffs2/scan.c -@@ -143,9 +143,12 @@ int jffs2_scan_medium(struct jffs2_sb_in - - /* reset summary info for next eraseblock scan */ - jffs2_sum_reset_collected(s); -- -- ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset), -- buf_size, s); -+ -+ if (c->flags & (1 << 7)) -+ ret = BLK_STATE_ALLFF; -+ else -+ ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset), -+ buf_size, s); - - if (ret < 0) - goto out; -@@ -546,6 +549,17 @@ static int jffs2_scan_eraseblock (struct - return err; - } - -+ if ((buf[0] == 0xde) && -+ (buf[1] == 0xad) && -+ (buf[2] == 0xc0) && -+ (buf[3] == 0xde)) { -+ /* end of filesystem. erase everything after this point */ -+ printk("%s(): End of filesystem marker found at 0x%x\n", __func__, jeb->offset); -+ c->flags |= (1 << 7); -+ -+ return BLK_STATE_ALLFF; -+ } -+ - /* We temporarily use 'ofs' as a pointer into the buffer/jeb */ - ofs = 0; - diff --git a/target/linux/generic-2.6/patches-2.6.21/207-powerpc_asm_segment_h.patch b/target/linux/generic-2.6/patches-2.6.21/207-powerpc_asm_segment_h.patch deleted file mode 100644 index 1272e82c7..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/207-powerpc_asm_segment_h.patch +++ /dev/null @@ -1,9 +0,0 @@ ---- /dev/null -+++ b/include/asm-powerpc/segment.h -@@ -0,0 +1,6 @@ -+#ifndef _ASM_SEGMENT_H -+#define _ASM_SEGMENT_H -+ -+/* Only here because we have some old header files that expect it.. */ -+ -+#endif /* _ASM_SEGMENT_H */ diff --git a/target/linux/generic-2.6/patches-2.6.21/208-rtl8110sb_fix.patch b/target/linux/generic-2.6/patches-2.6.21/208-rtl8110sb_fix.patch deleted file mode 100644 index 12b0c8b7f..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/208-rtl8110sb_fix.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- a/drivers/net/r8169.c -+++ b/drivers/net/r8169.c -@@ -494,7 +494,7 @@ static int rtl8169_poll(struct net_devic - #endif - - static const u16 rtl8169_intr_mask = -- SYSErr | LinkChg | RxOverflow | RxFIFOOver | TxErr | TxOK | RxErr | RxOK; -+ LinkChg | RxOverflow | RxFIFOOver | TxErr | TxOK | RxErr | RxOK; - static const u16 rtl8169_napi_event = - RxOK | RxOverflow | RxFIFOOver | TxOK | TxErr; - static const unsigned int rtl8169_rx_config = -@@ -2652,10 +2652,12 @@ rtl8169_interrupt(int irq, void *dev_ins - if (!(status & rtl8169_intr_mask)) - break; - -+#if 0 - if (unlikely(status & SYSErr)) { - rtl8169_pcierr_interrupt(dev); - break; - } -+#endif - - if (status & LinkChg) - rtl8169_check_link_status(dev, tp, ioaddr); diff --git a/target/linux/generic-2.6/patches-2.6.21/209-mini_fo.patch b/target/linux/generic-2.6/patches-2.6.21/209-mini_fo.patch deleted file mode 100644 index 537177950..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/209-mini_fo.patch +++ /dev/null @@ -1,7779 +0,0 @@ ---- a/fs/Kconfig -+++ b/fs/Kconfig -@@ -461,6 +461,9 @@ config OCFS2_DEBUG_MASKLOG - This option will enlarge your kernel, but it allows debugging of - ocfs2 filesystem issues. - -+config MINI_FO -+ tristate "Mini fanout overlay filesystem" -+ - config MINIX_FS - tristate "Minix fs support" - help ---- a/fs/Makefile -+++ b/fs/Makefile -@@ -72,6 +72,7 @@ obj-$(CONFIG_SQUASHFS) += squashfs/ - obj-$(CONFIG_RAMFS) += ramfs/ - obj-$(CONFIG_HUGETLBFS) += hugetlbfs/ - obj-$(CONFIG_CODA_FS) += coda/ -+obj-$(CONFIG_MINI_FO) += mini_fo/ - obj-$(CONFIG_MINIX_FS) += minix/ - obj-$(CONFIG_FAT_FS) += fat/ - obj-$(CONFIG_MSDOS_FS) += msdos/ ---- /dev/null -+++ b/fs/mini_fo/aux.c -@@ -0,0 +1,580 @@ -+/* -+ * Copyright (c) 1997-2003 Erez Zadok -+ * Copyright (c) 2001-2003 Stony Brook University -+ * -+ * For specific licensing information, see the COPYING file distributed with -+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING. -+ * -+ * This Copyright notice must be kept intact and distributed with all -+ * fistgen sources INCLUDING sources generated by fistgen. -+ */ -+/* -+ * Copyright (C) 2004, 2005 Markus Klotzbuecher -+ * -+ * 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. -+ */ -+/* -+ * $Id$ -+ */ -+ -+#ifdef HAVE_CONFIG_H -+# include -+#endif -+ -+#include "fist.h" -+#include "mini_fo.h" -+ -+/* check if file exists in storage */ -+int exists_in_storage(dentry_t *dentry) -+{ -+ check_mini_fo_dentry(dentry); -+ if(dtost(dentry) == MODIFIED || dtost(dentry) == CREATED || dtost(dentry) == DEL_REWRITTEN) -+ return 1; -+ return 0; -+} -+ -+/* check if dentry is in an existing state */ -+int is_mini_fo_existant(dentry_t *dentry) -+{ -+ check_mini_fo_dentry(dentry); -+ -+ if(dtost(dentry) == DELETED || dtost(dentry) == NON_EXISTANT) -+ return 0; -+ else -+ return 1; -+} -+ -+/* -+ * This function will create a negative storage dentry for -+ * dentry, what is required for many create like options. -+ * It will create the storage structure if necessary. -+ */ -+int get_neg_sto_dentry(dentry_t *dentry) -+{ -+ int err = 0; -+ unsigned int len; -+ const unsigned char *name; -+ -+ if(!dentry || -+ !dtopd(dentry) || -+ !(dtost(dentry) == UNMODIFIED || -+ dtost(dentry) == NON_EXISTANT || -+ dtost(dentry) == DELETED)) { -+ printk(KERN_CRIT "mini_fo: get_neg_sto_dentry: invalid dentry passed.\n"); -+ err = -1; -+ goto out; -+ } -+ /* Have we got a neg. dentry already? */ -+ if(dtohd2(dentry)) { -+ err = 0; -+ goto out; -+ } -+ if(dtost(dentry->d_parent) == UNMODIFIED) { -+ /* build sto struct */ -+ err = build_sto_structure(dentry->d_parent->d_parent, dentry->d_parent); -+ if(err || -+ dtost(dentry->d_parent) != MODIFIED) { -+ printk(KERN_CRIT "mini_fo: get_neg_sto_dentry: ERROR building sto structure.\n"); -+ err = -1; -+ goto out; -+ } -+ } -+ -+ len = dentry->d_name.len; -+ name = dentry->d_name.name; -+ -+ dtohd2(dentry) = -+ lookup_one_len(name, dtohd2(dentry->d_parent), len); -+ -+ out: -+ return err; -+} -+ -+int check_mini_fo_dentry(dentry_t *dentry) -+{ -+ ASSERT(dentry != NULL); -+ ASSERT(dtopd(dentry) != NULL); -+ ASSERT((dtohd(dentry) != NULL) || (dtohd2(dentry) != NULL)); -+ -+/* if(dtost(dentry) == MODIFIED) { */ -+/* ASSERT(dentry->d_inode != NULL); */ -+/* ASSERT(dtohd(dentry) != NULL); */ -+/* ASSERT(dtohd(dentry)->d_inode != NULL); */ -+/* ASSERT(dtohd2(dentry) != NULL); */ -+/* ASSERT(dtohd2(dentry)->d_inode != NULL); */ -+/* } */ -+/* else if(dtost(dentry) == UNMODIFIED) { */ -+/* ASSERT(dentry->d_inode != NULL); */ -+/* ASSERT( */ -+/* } */ -+ return 0; -+} -+ -+int check_mini_fo_file(file_t *file) -+{ -+ ASSERT(file != NULL); -+ ASSERT(ftopd(file) != NULL); -+ ASSERT(file->f_dentry != NULL); -+ -+ /* violent checking, check depending of state and type -+ * if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {} -+ */ -+ ASSERT((ftohf(file) != NULL) || (ftohf2(file) != NULL)); -+ return 0; -+} -+ -+int check_mini_fo_inode(inode_t *inode) -+{ -+ ASSERT(inode != NULL); -+ ASSERT(itopd(inode) != NULL); -+ ASSERT((itohi(inode) != NULL) || (itohi2(inode) != NULL)); -+ return 0; -+} -+ -+/* -+ * will walk a base path as provided by get_mini_fo_bpath and return -+ * the (hopefully ;-) ) positive dentry of the renamed base dir. -+ * -+ * This does some work of path_init. -+ */ -+dentry_t *bpath_walk(super_block_t *sb, char *bpath) -+{ -+ int err; -+ struct nameidata nd; -+ -+ /* be paranoid */ -+ if(!bpath || bpath[0] != '/') { -+ printk(KERN_CRIT "mini_fo: bpath_walk: Invalid string.\n"); -+ return NULL; -+ } -+ if(!sb || !stopd(sb)) { -+ printk(KERN_CRIT "mini_fo: bpath_walk: Invalid sb.\n"); -+ return NULL; -+ } -+ -+ /* setup nd as path_init does */ -+ nd.last_type = LAST_ROOT; /* if there are only slashes... */ -+ nd.flags = LOOKUP_FOLLOW; -+ /* fix this: how do I reach this lock? -+ * read_lock(¤t->fs->lock); */ -+ nd.mnt = mntget(stopd(sb)->hidden_mnt); -+ nd.dentry = dget(stopd(sb)->base_dir_dentry); -+ /* read_unlock(¤t->fs->lock); */ -+ -+ err = path_walk(bpath+1, &nd); -+ -+ /* validate */ -+ if (err || !nd.dentry || !nd.dentry->d_inode) { -+ printk(KERN_CRIT "mini_fo: bpath_walk: path_walk failed.\n"); -+ return NULL; -+ } -+ return nd.dentry; -+} -+ -+ -+/* returns the full path of the basefile incl. its name */ -+int get_mini_fo_bpath(dentry_t *dentry, char **bpath, int *bpath_len) -+{ -+ char *buf_walker; -+ int len = 0; -+ dentry_t *sky_walker; -+ -+ if(!dentry || !dtohd(dentry)) { -+ printk(KERN_CRIT "mini_fo: get_mini_fo_bpath: invalid dentry passed.\n"); -+ return -1; -+ } -+ sky_walker = dtohd(dentry); -+ -+ do { -+ len += sky_walker->d_name.len + 1 ; /* 1 for '/' */ -+ sky_walker = sky_walker->d_parent; -+ } while(sky_walker != stopd(dentry->d_inode->i_sb)->base_dir_dentry); -+ -+ /* 1 to oil the loop */ -+ *bpath = (char*) kmalloc(len + 1, GFP_KERNEL); -+ if(!*bpath) { -+ printk(KERN_CRIT "mini_fo: get_mini_fo_bpath: out of mem.\n"); -+ return -1; -+ } -+ buf_walker = *bpath+len; /* put it on last char */ -+ *buf_walker = '\n'; -+ sky_walker = dtohd(dentry); -+ -+ do { -+ buf_walker -= sky_walker->d_name.len; -+ strncpy(buf_walker, -+ sky_walker->d_name.name, -+ sky_walker->d_name.len); -+ *(--buf_walker) = '/'; -+ sky_walker = sky_walker->d_parent; -+ } while(sky_walker != stopd(dentry->d_inode->i_sb)->base_dir_dentry); -+ -+ /* bpath_len doesn't count newline! */ -+ *bpath_len = len; -+ return 0; -+} -+ -+int mini_fo_cp_cont(dentry_t *tgt_dentry, struct vfsmount *tgt_mnt, -+ dentry_t *src_dentry, struct vfsmount *src_mnt) -+{ -+ void *buf; -+ mm_segment_t old_fs; -+ file_t *tgt_file; -+ file_t *src_file; -+ int bytes, len, tmp, err; -+ err = 0; -+ -+ if(!(tgt_dentry->d_inode && src_dentry->d_inode)) { -+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR, neg. dentry passed.\n"); -+ err = -EINVAL; -+ goto out; -+ } -+ -+ dget(tgt_dentry); -+ dget(src_dentry); -+ mntget(tgt_mnt); -+ mntget(src_mnt); -+ -+ /* open file write only */ -+ tgt_file = dentry_open(tgt_dentry, tgt_mnt, 0x1); -+ if(!tgt_file || IS_ERR(tgt_file)) { -+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening target file.\n"); -+ err = PTR_ERR(tgt_file); -+ goto out_err; -+ } -+ -+ /* open file read only */ -+ src_file = dentry_open(src_dentry, src_mnt, 0x0); -+ if(!src_file || IS_ERR(src_file)) { -+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening source file.\n"); -+ err = PTR_ERR(src_file); -+ -+ /* close target file */ -+ fput(tgt_file); -+ goto out_err; -+ } -+ -+ /* check if the filesystem(s) support read respective write */ -+ if(!src_file->f_op->read || !tgt_file->f_op->write) { -+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR, no fs read or write support.\n"); -+ err = -EPERM; -+ goto out_close; -+ } -+ -+ /* allocate a page for transfering the data */ -+ buf = (void *) __get_free_page(GFP_KERNEL); -+ if(!buf) { -+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR, out of kernel mem.\n"); -+ goto out_err; -+ } -+ -+ tgt_file->f_pos = 0; -+ src_file->f_pos = 0; -+ -+ old_fs = get_fs(); -+ set_fs(KERNEL_DS); -+ -+ /* Doing this I assume that a read operation will return a full -+ * buffer while there is still data to read, and a less than -+ * full buffer when all data has been read. -+ */ -+ bytes = len = PAGE_SIZE; -+ while(bytes == len) { -+ bytes = src_file->f_op->read(src_file, buf, len, -+ &src_file->f_pos); -+ tmp = tgt_file->f_op->write(tgt_file, buf, bytes, -+ &tgt_file->f_pos); -+ if(tmp != bytes) { -+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR writing.\n"); -+ goto out_close_unset; -+ } -+ } -+ -+ free_page((unsigned long) buf); -+ set_fs(old_fs); -+ fput(tgt_file); -+ fput(src_file); -+ goto out; -+ -+ out_close_unset: -+ free_page((unsigned long) buf); -+ set_fs(old_fs); -+ -+ out_close: -+ fput(tgt_file); -+ fput(src_file); -+ -+ out_err: -+ dput(tgt_dentry); -+ dput(src_dentry); -+ -+ /* mk: not sure if this need to be done */ -+ mntput(tgt_mnt); -+ mntput(src_mnt); -+ -+ out: -+ return err; -+} -+ -+/* mk: -+ * ndl (no-duplicate list) stuff -+ * This is used in mini_fo_readdir, to save the storage directory contents -+ * and later when reading base, match them against the list in order -+ * to avoid duplicates. -+ */ -+ -+/* add a file specified by name and len to the ndl -+ * Return values: 0 on success, <0 on failure. -+ */ -+int ndl_add_entry(struct readdir_data *rd, const char *name, int len) -+{ -+ struct ndl_entry *tmp_entry; -+ -+ tmp_entry = (struct ndl_entry *) -+ kmalloc(sizeof(struct ndl_entry), GFP_KERNEL); -+ if(!tmp_entry) { -+ printk(KERN_CRIT "mini_fo: ndl_add_entry: out of mem.\n"); -+ return -ENOMEM; -+ } -+ tmp_entry->name = (char*) kmalloc(len, GFP_KERNEL); -+ if(!tmp_entry->name) { -+ printk(KERN_CRIT "mini_fo: ndl_add_entry: out of mem.\n"); -+ return -ENOMEM; -+ } -+ strncpy(tmp_entry->name, name, len); -+ tmp_entry->len = len; -+ -+ list_add(&tmp_entry->list, &rd->ndl_list); -+ rd->ndl_size++; -+ return 0; -+} -+ -+/* delete all list entries and free memory */ -+void ndl_put_list(struct readdir_data *rd) -+{ -+ struct list_head *tmp; -+ struct ndl_entry *tmp_entry; -+ -+ if(rd->ndl_size <= 0) -+ return; -+ while(!list_empty(&rd->ndl_list)) { -+ tmp = rd->ndl_list.next; -+ list_del(tmp); -+ tmp_entry = list_entry(tmp, struct ndl_entry, list); -+ kfree(tmp_entry->name); -+ kfree(tmp_entry); -+ } -+ rd->ndl_size = 0; -+} -+ -+/* Check if a file specified by name and len is in the ndl -+ * Return value: 0 if not in list, 1 if file is found in ndl. -+ */ -+int ndl_check_entry(struct readdir_data *rd, const char *name, int len) -+{ -+ struct list_head *tmp; -+ struct ndl_entry *tmp_entry; -+ -+ if(rd->ndl_size <= 0) -+ return 0; -+ -+ list_for_each(tmp, &rd->ndl_list) { -+ tmp_entry = list_entry(tmp, struct ndl_entry, list); -+ if(tmp_entry->len != len) -+ continue; -+ if(!strncmp(tmp_entry->name, name, len)) -+ return 1; -+ } -+ return 0; -+} -+ -+/* mk: -+ * Recursive function to create corresponding directorys in the storage fs. -+ * The function will build the storage directorys up to dentry. -+ */ -+int build_sto_structure(dentry_t *dir, dentry_t *dentry) -+{ -+ int err; -+ dentry_t *hidden_sto_dentry; -+ dentry_t *hidden_sto_dir_dentry; -+ -+ if(dentry->d_parent != dir) { -+ printk(KERN_CRIT "mini_fo: build_sto_structure: invalid parameter or meta data corruption [1].\n"); -+ return 1; -+ } -+ -+ if(dtost(dir) != MODIFIED) { -+ err = build_sto_structure(dir->d_parent, dentry->d_parent); -+ if(err) -+ return err; -+ } -+ -+ /* ok, coming back again. */ -+ check_mini_fo_dentry(dentry); -+ hidden_sto_dentry = dtohd2(dentry); -+ -+ if(!hidden_sto_dentry) { -+ /* -+ * This is the case after creating the first -+ * hidden_sto_dentry. -+ * After one negative storage_dentry, all pointers to -+ * hidden_storage dentries are set to NULL. We need to -+ * create the negative dentry before we create the storage -+ * file. -+ */ -+ unsigned int len; -+ const unsigned char *name; -+ len = dtohd(dentry)->d_name.len; -+ name = dtohd(dentry)->d_name.name; -+ hidden_sto_dentry = lookup_one_len(name, dtohd2(dir), len); -+ dtohd2(dentry) = hidden_sto_dentry; -+ } -+ -+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */ -+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent); -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ down(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ /* lets be safe */ -+ if(dtohd2(dir) != hidden_sto_dir_dentry) { -+ printk(KERN_CRIT "mini_fo: build_sto_structure: invalid parameter or meta data corruption [2].\n"); -+ return 1; -+ } -+ -+ /* check for errors in lock_parent */ -+ err = PTR_ERR(hidden_sto_dir_dentry); -+ if(IS_ERR(hidden_sto_dir_dentry)) { -+ printk(KERN_CRIT "mini_fo: build_sto_structure: lock_parent failed.\n"); -+ return err; -+ } -+ -+ err = vfs_mkdir(hidden_sto_dir_dentry->d_inode, -+ hidden_sto_dentry, -+ dir->d_inode->i_mode); -+ -+ if(err) { -+ printk(KERN_CRIT "mini_fo: build_sto_structure: failed to create storage dir [1].\n"); -+ /* was: unlock_dir(dir); */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&dir->d_inode->i_mutex); -+#else -+ up(&dir->d_inode->i_sem); -+#endif -+ dput(dir); -+ return err; -+ } -+ -+ /* everything ok! */ -+ if(!dtohd2(dentry)->d_inode) { -+ printk(KERN_CRIT "mini_fo: build_sto_structure: failed to create storage dir [2].\n"); -+ /* was: unlock_dir(dir); */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&dir->d_inode->i_mutex); -+#else -+ up(&dir->d_inode->i_sem); -+#endif -+ dput(dir); -+ return 1; -+ } -+ -+ /* interpose the new inode and set new state */ -+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode); -+ dtopd(dentry)->state = MODIFIED; -+ -+ /* initalize the wol list */ -+ itopd(dentry->d_inode)->deleted_list_size = -1; -+ itopd(dentry->d_inode)->renamed_list_size = -1; -+ meta_build_lists(dentry); -+ -+ fist_copy_attr_all(dentry->d_inode, itohi2(dentry->d_inode)); -+ fist_copy_attr_timesizes(dir->d_inode, -+ hidden_sto_dir_dentry->d_inode); -+ dir->d_inode->i_nlink++; -+ /* was: unlock_dir(hidden_sto_dir_dentry); */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ dput(hidden_sto_dir_dentry); -+ return 0; -+} -+ -+ -+#if 0 /* unused */ -+ -+/* -+ * Read "len" bytes from "filename" into "buf". -+ * "buf" is in kernel space. -+ */ -+int -+mini_fo_read_file(const char *filename, void *buf, int len) -+{ -+ file_t *filp; -+ mm_segment_t oldfs; -+ int bytes; -+ /* Chroot? Maybe NULL isn't right here */ -+ filp = filp_open(filename, O_RDONLY, 0); -+ if (!filp || IS_ERR(filp)) { -+ printk("mini_fo_read_file err %d\n", (int) PTR_ERR(filp)); -+ return -1; /* or do something else */ -+ } -+ -+ if (!filp->f_op->read) -+ return -2; /* file(system) doesn't allow reads */ -+ -+ /* now read len bytes from offset 0 */ -+ filp->f_pos = 0; /* start offset */ -+ oldfs = get_fs(); -+ set_fs(KERNEL_DS); -+ bytes = filp->f_op->read(filp, buf, len, &filp->f_pos); -+ set_fs(oldfs); -+ -+ /* close the file */ -+ fput(filp); -+ -+ return bytes; -+} -+ -+ -+ -+/* -+ * Write "len" bytes from "buf" to "filename" -+ * "buf" is in kernel space. -+ */ -+int -+mini_fo_write_file(const char *filename, void *buf, int len) -+{ -+ file_t *filp; -+ mm_segment_t oldfs; -+ int bytes; -+ /* Chroot? Maybe NULL isn't right here */ -+ filp = filp_open(filename, O_RDWR|O_CREAT, 0640); -+ if (!filp || IS_ERR(filp)) { -+ printk("mini_fo_write_file err %d\n", (int) PTR_ERR(filp)); -+ return -1; /* or do something else */ -+ } -+ -+ if (!filp->f_op->write) -+ return -2; /* file(system) doesn't allow writes */ -+ -+ /* now write len bytes from offset 0 */ -+ filp->f_pos = 0; /* start offset */ -+ oldfs = get_fs(); -+ set_fs(KERNEL_DS); -+ bytes = filp->f_op->write(filp, buf, len, &filp->f_pos); -+ set_fs(oldfs); -+ -+ /* close the file */ -+ fput(filp); -+ -+ return bytes; -+} -+ -+#endif /* unused */ -+ ---- /dev/null -+++ b/fs/mini_fo/ChangeLog -@@ -0,0 +1,281 @@ -+2006-01-24 Markus Klotzbuecher -+ -+ * Add tons of ugly ifdefs to Ed L. Cashin's mutex patch to -+ retain backwards compatibility. -+ -+2006-01-24 Ed L. Cashin -+ -+ * Support for the new mutex infrastructure -+ (7892f2f48d165a34b0b8130c8a195dfd807b8cb6) -+ -+2005-10-15 Markus Klotzbuecher -+ -+ * Bugfix for a serious memory leak in mini_fo_follow_link. -+ -+2005-09-21 Markus Klotzbuecher -+ -+ * new release 0.6.1 -+ -+ * fix of a compiler warning due to changes in 2.6.13 -+ -+2005-09-21 Klaus Wenninger -+ -+ * file.c: readdir: fix for a bug that caused directory entries -+ to show up twice when using storage filesystems such as -+ minixfs or pramfs. -+ -+2005-06-30 Eric Lammerts -+ -+ * fix for an oops when overwriting a binary thats beeing -+ executed. -+ -+2005-06-09 -+ -+ * Renamed overlay to mini_fo-overlay. -+ -+ * Added mini_fo-merge script to allow merging of storage and base -+ after making modifications. -+ -+2005-05-22 root -+ -+ * Added overlay script that allows to easily mount mini_fo ontop -+ of a given base directory -+ -+2005-05-10 -+ -+ * inode.c: xattr functions return -EOPNOSUPP instead of -+ -ENOSUPP, what confuses "ls -l" -+ -+ * Changed license from LGPL to GPL. -+ -+2005-05-08 root -+ -+ * Makefile: clean it up and added make install and make -+ uninstall. -+ -+2005-05-06 -+ -+ * merged devel branch back to main. [v0-6-0-pre3] -+ -+ * removed unused files print.c and fist_ioctl. [devel-0-0-18] -+ -+ * ioctl: removed fist_ioctl stuff, that is not needed for -+ now. -+ -+2005-05-03 -+ -+ * file.c: simplified mini_fo_open and mini_fo_setattr using -+ new state changing functions. [devel-0-0-17] -+ -+ * inode.c: Fixed getattr state bug (see below) in 2.4 function -+ mini_fo_inode revalidate. -+ -+ * inode.c: found an other bug in mini_fo_getattr. States are not -+ reliable in this function, as a file can be opened, unlinked and -+ the getattr function called. This results in a deleted dentry -+ with an inode. Fix is to ignore states and simply use the inode -+ available. -+ -+2005-04-29 -+ -+ * file.c: Bugfix and cleanup in fasync and fsync. [devel-0-0-16] -+ -+ * file.c: do not use mini_fo_lock so the generic version is -+ used (I guess). -+ -+ * inode.c: getattr, never call getattr on lower files, as this -+ will cause the inum to change. -+ -+ * inode.c: rename_reg_file renamed to rename_nondir, as it -+ doesn't matter as long it't not a dir. Removed all -+ rename_dev_file etc. -+ -+ * tagged as devel-0-0-15 -+ -+ * inode.c: added support for chosing support for extended -+ attrs at compile time by XATTR define in mini_fo.h . -+ -+ * inode.c: fixed mini_fo_getattr to use mini_fo inode and not -+ lower again, what avoids inode number changes that confused -+ rm again. This is the proper solution. -+ -+2005-04-24 -+ -+ * all files: updated Copyright notive to 2005. [devel-0-0-14] -+ -+ * inode.c: fixed mini_fo_getattr to not change the inode -+ number, even if lower files change. -+ -+ * super.c: fixed a bug that caused deleted base file to show -+ up suddenly after some time, or after creating a special -+ file. The problem was that after some time or after special -+ file creating sync_sb_inodes is called by the vfs, that -+ called our mini_fo_put_inode. There was (wrongly) called -+ __meta_put_lists, that nuked the lists, although the inode -+ was going to continue its life. Moving __meta_put_lists to -+ mini_fo_clear_inode, where an inode is really destroyed, -+ solved the problem. -+ -+ -+2005-04-23 -+ -+ * state.c, aux.c: more cleaning up and -+ simplifications. [devel-0-0-13] -+ -+ * inode.c: implemented mini_fo_getattr, that was required for -+ 2.6 because inode_revalidate has been remove there, and the -+ old "du" bug returned. -+ -+ -+2005-04-20 -+ -+ * aux.c: get_neg_sto_dentry(): allow to be called for dentries -+ in state UNMODIFIED, NON_EXISTANT _and_ DELETED. -+ -+2005-04-19 -+ -+ * Fixed a bug under 2.6 that caused files deleted via mini_fo -+ not to be deleted properly and therefore the fs filled up -+ untill no memory was left. [devel-0-0-12] -+ -+ * Added basic hard link support. This means that creating -+ hardlinks will work, but existing ones will be treated as -+ individual files. [devel-0-0-11] -+ -+2005-04-17 -+ -+ * Bugfixes -+ -+2005-04-13 root -+ -+ * Added file state.c for the state transition -+ functions. Doesn't work very well yet, though... -+ -+2005-04-12 -+ -+ * Porting to 2.6 started, which is easier than expected, also -+ due to Olivier previous work. -+ -+2005-04-08 -+ -+ * Fixed the bug that caused du to return invalid sizes of -+ directory trees. The problem was that -+ mini_fo_inode_revalidate didn't always copy the attributes -+ from the base inode properly. -+ -+2005-04-01 Markus Klotzbuecher -+ -+ * Merged devel branch back to main trunk and updated the -+ RELEASE notes. This will be 0-6-0-pre1. -+ -+2005-03-31 Markus Klotzbuecher -+ -+ * Fixed some bugs in rename_reg_file, that only showed up in -+ the kernel compile test. Kernel compiles cleanly ontop of -+ mini_fo, now also make mrproper etc. work. Seems pretty stable. -+ -+2005-03-28 Markus Klotzbuecher -+ -+ * Many, many directory renaming bugfixes and a lot of other -+ cleanup. Dir renaming seems to work relatively stable. -+ -+2005-03-22 Markus Klotzbuecher -+ -+ * Finished implementing lightweight directory renaming. Some -+ basic testing indicates it works fine. -+ Next is to implement testcases for the testsuite and confirm -+ everything is really working ok. -+ -+2005-03-18 Markus Klotzbuecher -+ -+ * Finished implementing meta.c stuff required for directory -+ renaming. -+ -+2005-03-17 Markus Klotzbuecher -+ -+ * Fixed all compile warnings + an extremly old bug that -+ somehow crept in while reworking the wol stuff to the META -+ system. Turning on -Werror again... :-) -+ -+ * Fixed some bugs in the new rename_reg_file function. -+ -+ * Rewrote mini_fo rename and split it into several -+ subfunctions, that handle the different types -+ seperately. Rewrote the regular file function aswell, as it -+ was implemented somewhat inefficient. -+ -+2005-03-16 Markus Klotzbuecher -+ -+ * Implemented new META subsystem, removed old WOL stuff in favor -+ if it. -+ -+ * After some basic testing everything seems ok... -+ -+2005-03-11 Markus Klotzbuecher -+ -+ * Renaming a non regular file caused trouble because I always -+ tried to copy the contents. Now I only do this for regular -+ files. mini_fo_rename still isn't implemented properly, renaming -+ of device files, symlinks etc. results in a empty regular file -+ instead of the proper type. -+ -+ * Directory renaming suddenly works! What a surprise! I guess -+ this is because renaming is implemented as making a copy and -+ removing the original. Still this might not work -+ everywhere... -+ -+2005-03-09 Markus Klotzbuecher -+ -+ * Bugfix, when a mini_fo directory that exists in storage -+ (state: MODIFIED, CREATED and DEL_REWRITTEN) is deleted, a -+ possibly existing WOL file contained in it needs to be -+ deleted too. -+ -+ * Starting cleanup: defined state names in order to get rid of -+ the state numbers. -+ -+2005-03-08 Markus Klotzbuecher -+ -+ * Makefile fix, fist_ioctl was built against wrong sources if ARCH=um -+ -+ * Fixed a bug in dentry.c, mini_fo_d_hash. In state 4 = -+ DEL_REWRITTEN the hash was calculated from the base dentry, -+ which was wrong and and caused assertions in -+ __mini_fo_hidden_dentry to fail. -+ -+2005-02-21 -+ -+ * Implemented directory deleting (inode.c) -+ -+ * main.c: made mini_fo_parse_options a little more robust. -+ -+2004-12-22 -+ -+ * Makefile cleanup and uml stuff, removed unneccessary files -+ -+ * Created a new and hopefully more informative README -+ -+ * CHANGELOG: created a new CHANGELOG and added old entries reversely -+ -+ -+2004-10-24 Gleb Natapov -+ -+ * Fix: owner and group where not correctly copied from base to -+ storage. -+ -+ -+2004-10-05 Gleb Natapov -+ -+ * Implementation of fsync, fasync and lock mini_fo functions. -+ -+ -+2004-09-29 Bob Lee -+ -+ * Fix of a serious pointer bug -+ -+ -+2004-09-28 Gleb Natapov -+ -+ * Implementation of mini_fo_mknod and mini_fo_rename, support -+ for device files. -+ ---- /dev/null -+++ b/fs/mini_fo/dentry.c -@@ -0,0 +1,244 @@ -+/* -+ * Copyright (c) 1997-2003 Erez Zadok -+ * Copyright (c) 2001-2003 Stony Brook University -+ * -+ * For specific licensing information, see the COPYING file distributed with -+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING. -+ * -+ * This Copyright notice must be kept intact and distributed with all -+ * fistgen sources INCLUDING sources generated by fistgen. -+ */ -+/* -+ * Copyright (C) 2004, 2005 Markus Klotzbuecher -+ * -+ * 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. -+ */ -+ -+/* -+ * $Id$ -+ */ -+ -+#ifdef HAVE_CONFIG_H -+# include -+#endif -+ -+#include "fist.h" -+#include "mini_fo.h" -+ -+/* -+ * THIS IS A BOOLEAN FUNCTION: returns 1 if valid, 0 otherwise. -+ */ -+STATIC int -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+mini_fo_d_revalidate(dentry_t *dentry, struct nameidata *nd) -+#else -+mini_fo_d_revalidate(dentry_t *dentry, int flags) -+#endif -+{ -+ int err1 = 1; /* valid = 1, invalid = 0 */ -+ int err2 = 1; -+ dentry_t *hidden_dentry; -+ dentry_t *hidden_sto_dentry; -+ -+ -+ check_mini_fo_dentry(dentry); -+ -+ hidden_dentry = dtohd(dentry); -+ hidden_sto_dentry = dtohd2(dentry); -+ -+ if(hidden_dentry && -+ hidden_dentry->d_op && -+ hidden_dentry->d_op->d_revalidate) { -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ err1 = hidden_dentry->d_op->d_revalidate(hidden_dentry, nd); -+#else -+ err1 = hidden_dentry->d_op->d_revalidate(hidden_dentry, flags); -+#endif -+ } -+ if(hidden_sto_dentry && -+ hidden_sto_dentry->d_op && -+ hidden_sto_dentry->d_op->d_revalidate) { -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ err2 = hidden_sto_dentry->d_op->d_revalidate(hidden_sto_dentry, -+ nd); -+#else -+ err2 = hidden_sto_dentry->d_op->d_revalidate(hidden_sto_dentry, -+ flags); -+#endif -+ } -+ -+ /* mk: if one of the lower level dentries are valid, -+ * the mini_fo dentry is too. -+ */ -+ return (err1 || err2); -+} -+ -+ -+STATIC int -+mini_fo_d_hash(dentry_t *dentry, qstr_t *name) -+{ -+ int err = 0; -+ dentry_t *hidden_dentry; -+ dentry_t *hidden_sto_dentry; -+ -+ /* hidden_dentry = mini_fo_hidden_dentry(dentry); -+ * hidden_sto_dentry = mini_fo_hidden_sto_dentry(dentry); */ -+ -+ /* state 1, 3, 4, 5: build the hash for the storage dentry */ -+ if((dtopd(dentry)->state == MODIFIED) || -+ (dtopd(dentry)->state == CREATED) || -+ (dtopd(dentry)->state == DEL_REWRITTEN) || -+ (dtopd(dentry)->state == DELETED)) { -+ hidden_sto_dentry = dtohd2(dentry); -+ if(hidden_sto_dentry && -+ hidden_sto_dentry->d_op && -+ hidden_sto_dentry->d_op->d_hash) { -+ err = hidden_sto_dentry->d_op->d_hash(hidden_sto_dentry, name); -+ } -+ goto out; -+ } -+ /* state 2: build the hash for the base dentry */ -+ if(dtopd(dentry)->state == UNMODIFIED) { -+ hidden_dentry = dtohd(dentry); -+ if(hidden_dentry && -+ hidden_dentry->d_op && -+ hidden_dentry->d_op->d_hash) { -+ err = hidden_dentry->d_op->d_hash(hidden_dentry, name); -+ } -+ goto out; -+ } -+ /* state 6: build hash for the dentry that exists */ -+ if(dtopd(dentry)->state == NON_EXISTANT) { -+ hidden_sto_dentry = dtohd2(dentry); -+ if(hidden_sto_dentry && -+ hidden_sto_dentry->d_op && -+ hidden_sto_dentry->d_op->d_hash) { -+ err = hidden_sto_dentry->d_op->d_hash(hidden_sto_dentry, name); -+ goto out; -+ } -+ hidden_dentry = dtohd(dentry); -+ if(hidden_dentry && -+ hidden_dentry->d_op && -+ hidden_dentry->d_op->d_hash) { -+ err = hidden_dentry->d_op->d_hash(hidden_dentry, name); -+ goto out; -+ } -+ } -+ -+ printk(KERN_CRIT "mini_fo: d_hash: invalid state detected.\n"); -+ -+ out: -+ return err; -+} -+ -+ -+STATIC int -+mini_fo_d_compare(dentry_t *dentry, qstr_t *a, qstr_t *b) -+{ -+ int err; -+ dentry_t *hidden_dentry=NULL; -+ -+ /* hidden_dentry = mini_fo_hidden_dentry(dentry); */ -+ if(dtohd2(dentry)) -+ hidden_dentry = dtohd2(dentry); -+ else if(dtohd(dentry)) -+ hidden_dentry = dtohd(dentry); -+ -+ if (hidden_dentry && hidden_dentry->d_op && hidden_dentry->d_op->d_compare) { -+ err = hidden_dentry->d_op->d_compare(hidden_dentry, a, b); -+ } else { -+ err = ((a->len != b->len) || memcmp(a->name, b->name, b->len)); -+ } -+ -+ return err; -+} -+ -+ -+int -+mini_fo_d_delete(dentry_t *dentry) -+{ -+ dentry_t *hidden_dentry; -+ dentry_t *hidden_sto_dentry; -+ int err = 0; -+ -+ /* this could be a negative dentry, so check first */ -+ if (!dtopd(dentry)) { -+ printk(KERN_CRIT "mini_fo_d_delete: negative dentry passed.\n"); -+ goto out; -+ } -+ hidden_dentry = dtohd(dentry); -+ hidden_sto_dentry = dtohd2(dentry); -+ -+ if(hidden_dentry) { -+ if(hidden_dentry->d_op && -+ hidden_dentry->d_op->d_delete) { -+ err = hidden_dentry->d_op->d_delete(hidden_dentry); -+ } -+ } -+ if(hidden_sto_dentry) { -+ if(hidden_sto_dentry->d_op && -+ hidden_sto_dentry->d_op->d_delete) { -+ err = hidden_sto_dentry->d_op->d_delete(hidden_sto_dentry); -+ } -+ } -+ -+ out: -+ return err; -+} -+ -+ -+void -+mini_fo_d_release(dentry_t *dentry) -+{ -+ dentry_t *hidden_dentry; -+ dentry_t *hidden_sto_dentry; -+ -+ -+ /* this could be a negative dentry, so check first */ -+ if (!dtopd(dentry)) { -+ printk(KERN_CRIT "mini_fo_d_release: no private data.\n"); -+ goto out; -+ } -+ hidden_dentry = dtohd(dentry); -+ hidden_sto_dentry = dtohd2(dentry); -+ -+ if(hidden_dentry) { -+ /* decrement hidden dentry's counter and free its inode */ -+ dput(hidden_dentry); -+ } -+ if(hidden_sto_dentry) { -+ /* decrement hidden dentry's counter and free its inode */ -+ dput(hidden_sto_dentry); -+ } -+ -+ /* free private data (mini_fo_dentry_info) here */ -+ kfree(dtopd(dentry)); -+ __dtopd(dentry) = NULL; /* just to be safe */ -+ out: -+ return; -+} -+ -+ -+/* -+ * we don't really need mini_fo_d_iput, because dentry_iput will call iput() if -+ * mini_fo_d_iput is not defined. We left this implemented for ease of -+ * tracing/debugging. -+ */ -+void -+mini_fo_d_iput(dentry_t *dentry, inode_t *inode) -+{ -+ iput(inode); -+} -+ -+ -+struct dentry_operations mini_fo_dops = { -+ d_revalidate: mini_fo_d_revalidate, -+ d_hash: mini_fo_d_hash, -+ d_compare: mini_fo_d_compare, -+ d_release: mini_fo_d_release, -+ d_delete: mini_fo_d_delete, -+ d_iput: mini_fo_d_iput, -+}; ---- /dev/null -+++ b/fs/mini_fo/file.c -@@ -0,0 +1,713 @@ -+/* -+ * Copyright (c) 1997-2003 Erez Zadok -+ * Copyright (c) 2001-2003 Stony Brook University -+ * -+ * For specific licensing information, see the COPYING file distributed with -+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING. -+ * -+ * This Copyright notice must be kept intact and distributed with all -+ * fistgen sources INCLUDING sources generated by fistgen. -+ */ -+/* -+ * Copyright (C) 2004, 2005 Markus Klotzbuecher -+ * -+ * 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. -+ */ -+ -+/* -+ * $Id$ -+ */ -+ -+#ifdef HAVE_CONFIG_H -+# include -+#endif -+ -+#include "fist.h" -+#include "mini_fo.h" -+#define ROUND_UP(x) (((x)+sizeof(long)-1) & ~(sizeof(long)-1)) -+ -+/******************* -+ * File Operations * -+ *******************/ -+ -+STATIC loff_t -+mini_fo_llseek(file_t *file, loff_t offset, int origin) -+{ -+ loff_t err; -+ file_t *hidden_file = NULL; -+ -+ if(S_ISDIR(file->f_dentry->d_inode->i_mode)) { -+ /* Check if trying to llseek from a directory */ -+ err = -EISDIR; -+ goto out; -+ } -+ if (ftopd(file) != NULL) { -+ if(ftohf2(file)) { -+ hidden_file = ftohf2(file); -+ } else { -+ hidden_file = ftohf(file); -+ } -+ } -+ -+ /* always set hidden position to this one */ -+ hidden_file->f_pos = file->f_pos; -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ memcpy(&(hidden_file->f_ra), -+ &(file->f_ra), -+ sizeof(struct file_ra_state)); -+#else -+ if (file->f_reada) { /* update readahead information if needed */ -+ hidden_file->f_reada = file->f_reada; -+ hidden_file->f_ramax = file->f_ramax; -+ hidden_file->f_raend = file->f_raend; -+ hidden_file->f_ralen = file->f_ralen; -+ hidden_file->f_rawin = file->f_rawin; -+ } -+#endif -+ if (hidden_file->f_op && hidden_file->f_op->llseek) -+ err = hidden_file->f_op->llseek(hidden_file, offset, origin); -+ else -+ err = generic_file_llseek(hidden_file, offset, origin); -+ -+ if (err < 0) -+ goto out; -+ -+ if (err != file->f_pos) { -+ file->f_pos = err; -+ // ION maybe this? -+ // file->f_pos = hidden_file->f_pos; -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -+ file->f_reada = 0; -+#endif -+ file->f_version++; -+ } -+ -+ out: -+ return err; -+} -+ -+ -+/* mk: fanout capable */ -+STATIC ssize_t -+mini_fo_read(file_t *file, char *buf, size_t count, loff_t *ppos) -+{ -+ int err = -EINVAL; -+ file_t *hidden_file = NULL; -+ loff_t pos = *ppos; -+ -+ if(S_ISDIR(file->f_dentry->d_inode->i_mode)) { -+ /* Check if trying to read from a directory */ -+ /* printk(KERN_CRIT "mini_fo_read: ERROR: trying to read data from a directory.\n"); */ -+ err = -EISDIR; -+ goto out; -+ } -+ -+ if (ftopd(file) != NULL) { -+ if(ftohf2(file)) { -+ hidden_file = ftohf2(file); -+ } else { -+ hidden_file = ftohf(file); -+ } -+ } -+ -+ if (!hidden_file->f_op || !hidden_file->f_op->read) -+ goto out; -+ -+ err = hidden_file->f_op->read(hidden_file, buf, count, &pos); -+ *ppos = pos; -+ -+ if (err >= 0) { -+ /* atime should also be updated for reads of size zero or more */ -+ fist_copy_attr_atime(file->f_dentry->d_inode, -+ hidden_file->f_dentry->d_inode); -+ } -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -+ /* -+ * MAJOR HACK -+ * because pread() does not have any way to tell us that it is -+ * our caller, then we don't know for sure if we have to update -+ * the file positions. This hack relies on read() having passed us -+ * the "real" pointer of its struct file's f_pos field. -+ */ -+ if (ppos == &file->f_pos) -+ hidden_file->f_pos = *ppos = pos; -+ if (hidden_file->f_reada) { /* update readahead information if needed */ -+ file->f_reada = hidden_file->f_reada; -+ file->f_ramax = hidden_file->f_ramax; -+ file->f_raend = hidden_file->f_raend; -+ file->f_ralen = hidden_file->f_ralen; -+ file->f_rawin = hidden_file->f_rawin; -+ } -+#else -+ memcpy(&(file->f_ra),&(hidden_file->f_ra),sizeof(struct file_ra_state)); -+#endif -+ -+ out: -+ return err; -+} -+ -+ -+/* this mini_fo_write() does not modify data pages! */ -+STATIC ssize_t -+mini_fo_write(file_t *file, const char *buf, size_t count, loff_t *ppos) -+{ -+ int err = -EINVAL; -+ file_t *hidden_file = NULL; -+ inode_t *inode; -+ inode_t *hidden_inode; -+ loff_t pos = *ppos; -+ -+ /* mk: fan out: */ -+ if (ftopd(file) != NULL) { -+ if(ftohf2(file)) { -+ hidden_file = ftohf2(file); -+ } else { -+ /* This is bad! We have no storage file to write to. This -+ * should never happen because if a file is opened for -+ * writing, a copy should have been made earlier. -+ */ -+ printk(KERN_CRIT "mini_fo: write : ERROR, no storage file to write.\n"); -+ err = -EINVAL; -+ goto out; -+ } -+ } -+ -+ inode = file->f_dentry->d_inode; -+ hidden_inode = itohi2(inode); -+ if(!hidden_inode) { -+ printk(KERN_CRIT "mini_fo: write: no sto inode found, not good.\n"); -+ goto out; -+ } -+ -+ if (!hidden_file->f_op || !hidden_file->f_op->write) -+ goto out; -+ -+ /* adjust for append -- seek to the end of the file */ -+ if (file->f_flags & O_APPEND) -+ pos = inode->i_size; -+ -+ err = hidden_file->f_op->write(hidden_file, buf, count, &pos); -+ -+ /* -+ * copy ctime and mtime from lower layer attributes -+ * atime is unchanged for both layers -+ */ -+ if (err >= 0) -+ fist_copy_attr_times(inode, hidden_inode); -+ -+ *ppos = pos; -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -+ /* -+ * XXX: MAJOR HACK -+ * -+ * because pwrite() does not have any way to tell us that it is -+ * our caller, then we don't know for sure if we have to update -+ * the file positions. This hack relies on write() having passed us -+ * the "real" pointer of its struct file's f_pos field. -+ */ -+ if (ppos == &file->f_pos) -+ hidden_file->f_pos = *ppos = pos; -+#endif -+ /* update this inode's size */ -+ if (pos > inode->i_size) -+ inode->i_size = pos; -+ -+ out: -+ return err; -+} -+ -+/* Global variable to hold a file_t pointer. -+ * This serves to allow mini_fo_filldir function to know which file is -+ * beeing read, which is required for two reasons: -+ * -+ * - be able to call wol functions in order to avoid listing deleted -+ * base files. -+ * - if we're reading a directory which is in state 1, we need to -+ * maintain a list (in mini_fo_filldir) of which files allready -+ * have been copied to userspace,to detect files existing in base -+ * and storage and not list them twice. -+ */ -+filldir_t mini_fo_filldir_orig; -+file_t *mini_fo_filldir_file; -+ -+/* mainly copied from fs/readdir.c */ -+STATIC int -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) -+mini_fo_filldir(void * __buf, const char * name, int namlen, loff_t offset, -+ u64 ino, unsigned int d_type) -+#else -+mini_fo_filldir(void * __buf, const char * name, int namlen, loff_t offset, -+ ino_t ino, unsigned int d_type) -+#endif -+{ -+ struct getdents_callback * buf = (struct getdents_callback *) __buf; -+ file_t* file = mini_fo_filldir_file; -+ -+ /* In theses states we filter meta files in storage (WOL) */ -+ if(file && (dtopd(file->f_dentry)->state == MODIFIED || -+ dtopd(file->f_dentry)->state == CREATED || -+ dtopd(file->f_dentry)->state == DEL_REWRITTEN)) { -+ -+ int tmp = strlen(META_FILENAME); -+ if(tmp == namlen) { -+ if(!strncmp(name, META_FILENAME, namlen)) -+ return 0; -+ } -+ } -+ -+ /* check if we are merging the contents of storage and base */ -+ if(file && dtopd(file->f_dentry)->state == MODIFIED) { -+ /* check if we are still reading storage contents, if -+ * yes, we just save the name of the file for duplicate -+ * checking later. */ -+ -+ if(!ftopd(file)->rd.sto_done) { -+ /* put file into ndl list */ -+ if(ndl_add_entry(&ftopd(file)->rd, name, namlen)) -+ printk(KERN_CRIT "mini_fo_filldir: Error adding to ndl.\n"); -+ } else { -+ /* check if file has been deleted */ -+ if(meta_check_d_entry(file->f_dentry, name, namlen)) -+ return 0; -+ -+ /* do duplicate checking */ -+ if(ndl_check_entry(&ftopd(file)->rd, name, namlen)) -+ return 0; -+ } -+ } -+ -+ return mini_fo_filldir_orig(buf, name, namlen, offset, ino, d_type); -+} -+ -+ -+STATIC int -+mini_fo_readdir(file_t *file, void *dirent, filldir_t filldir) -+{ -+ int err = 0;/* mk: ??? -ENOTDIR; */ -+ file_t *hidden_file = NULL; -+ file_t *hidden_sto_file = NULL; -+ inode_t *inode; -+ struct getdents_callback *buf; -+ int oldcount; -+ -+#if defined(FIST_FILTER_NAME) || defined(FIST_FILTER_SCA) -+ struct mini_fo_getdents_callback buf; -+#endif /* FIST_FILTER_NAME || FIST_FILTER_SCA */ -+ -+ buf = (struct getdents_callback *) dirent; -+ oldcount = buf->count; -+ inode = file->f_dentry->d_inode; -+ mini_fo_filldir_file = file; -+ mini_fo_filldir_orig = filldir; -+ -+ ftopd(file)->rd.sto_done = 0; -+ do { -+ if (ftopd(file) != NULL) { -+ if(ftohf2(file)) { -+ hidden_sto_file = ftohf2(file); -+ err = vfs_readdir(hidden_sto_file, mini_fo_filldir, dirent); -+ file->f_pos = hidden_sto_file->f_pos; -+ if (err > 0) -+ fist_copy_attr_atime(inode, hidden_sto_file->f_dentry->d_inode); -+ /* not finshed yet, we'll be called again */ -+ if (buf->count != oldcount) -+ break; -+ } -+ -+ ftopd(file)->rd.sto_done = 1; -+ -+ if(ftohf(file)) { -+ hidden_file = ftohf(file); -+ err = vfs_readdir(hidden_file, mini_fo_filldir, dirent); -+ file->f_pos = hidden_file->f_pos; -+ if (err > 0) -+ fist_copy_attr_atime(inode, hidden_file->f_dentry->d_inode); -+ } -+ -+ } -+ } while (0); -+ -+ /* mk: -+ * we need to check if all the directory data has been copied to userspace, -+ * or if we will be called again by userspace to complete the operation. -+ */ -+ if(buf->count == oldcount) { -+ ndl_put_list(&ftopd(file)->rd); -+ } -+ -+ /* unset this, safe */ -+ mini_fo_filldir_file = NULL; -+ return err; -+} -+ -+ -+STATIC unsigned int -+mini_fo_poll(file_t *file, poll_table *wait) -+{ -+ unsigned int mask = DEFAULT_POLLMASK; -+ file_t *hidden_file = NULL; -+ -+ if (ftopd(file) != NULL) { -+ if(ftohf2(file)) { -+ hidden_file = ftohf2(file); -+ } else { -+ hidden_file = ftohf(file); -+ } -+ } -+ -+ if (!hidden_file->f_op || !hidden_file->f_op->poll) -+ goto out; -+ -+ mask = hidden_file->f_op->poll(hidden_file, wait); -+ -+ out: -+ return mask; -+} -+ -+/* FIST-LITE special version of mmap */ -+STATIC int -+mini_fo_mmap(file_t *file, vm_area_t *vma) -+{ -+ int err = 0; -+ file_t *hidden_file = NULL; -+ -+ /* fanout capability */ -+ if (ftopd(file) != NULL) { -+ if(ftohf2(file)) { -+ hidden_file = ftohf2(file); -+ } else { -+ hidden_file = ftohf(file); -+ } -+ } -+ -+ ASSERT(hidden_file != NULL); -+ ASSERT(hidden_file->f_op != NULL); -+ ASSERT(hidden_file->f_op->mmap != NULL); -+ -+ vma->vm_file = hidden_file; -+ err = hidden_file->f_op->mmap(hidden_file, vma); -+ get_file(hidden_file); /* make sure it doesn't get freed on us */ -+ fput(file); /* no need to keep extra ref on ours */ -+ -+ return err; -+} -+ -+ -+ -+STATIC int -+mini_fo_open(inode_t *inode, file_t *file) -+{ -+ int err = 0; -+ int hidden_flags; -+ file_t *hidden_file = NULL; -+ dentry_t *hidden_dentry = NULL; -+ -+ /* fanout stuff */ -+ file_t *hidden_sto_file = NULL; -+ dentry_t *hidden_sto_dentry = NULL; -+ -+ __ftopd(file) = -+ kmalloc(sizeof(struct mini_fo_file_info), GFP_KERNEL); -+ if (!ftopd(file)) { -+ err = -ENOMEM; -+ goto out; -+ } -+ -+ /* init the readdir_helper structure */ -+ INIT_LIST_HEAD(&ftopd(file)->rd.ndl_list); -+ ftopd(file)->rd.ndl_size = 0; -+ -+ /* In certain paths this could stay uninitalized and cause trouble */ -+ ftohf(file) = NULL; -+ ftohf2(file) = NULL; -+ hidden_flags = file->f_flags; -+ -+ /* create storage files? */ -+ if(dtost(file->f_dentry) == UNMODIFIED) { -+ if(!IS_WRITE_FLAG(file->f_flags)) { -+ hidden_dentry = dtohd(file->f_dentry); -+ dget(hidden_dentry); -+ /* dentry_open will decrement mnt refcnt if err. -+ * otherwise fput() will do an mntput() for us upon file close. */ -+ mntget(stopd(inode->i_sb)->hidden_mnt); -+ hidden_file = dentry_open(hidden_dentry, -+ stopd(inode->i_sb)->hidden_mnt, -+ hidden_flags); -+ if (IS_ERR(hidden_file)) { -+ err = PTR_ERR(hidden_file); -+ dput(hidden_dentry); -+ goto out; -+ } -+ ftohf(file) = hidden_file; /* link two files */ -+ goto out; -+ } -+ else { -+ if(S_ISDIR(file->f_dentry->d_inode->i_mode)) { -+ err = dir_unmod_to_mod(file->f_dentry); -+ } else -+ err = nondir_unmod_to_mod(file->f_dentry, 1); -+ -+ if (err) { -+ printk("mini_fo_open: ERROR creating storage file.\n"); -+ goto out; -+ } -+ } -+ } -+ hidden_sto_dentry = dtohd2(file->f_dentry); -+ dget(hidden_sto_dentry); -+ -+ if(dtopd(file->f_dentry)->state == MODIFIED) { -+ /* Directorys are special, interpose on both lower level files */ -+ if(S_ISDIR(itohi(inode)->i_mode)) { -+ /* check for invalid file types of lower level files */ -+ if(!(S_ISDIR(itohi(inode)->i_mode) && S_ISDIR(itohi2(inode)->i_mode))) { -+ printk(KERN_CRIT "mini_fo_open: meta data corruption detected.\n"); -+ dput(hidden_sto_dentry); -+ err = -EINVAL; -+ goto out; -+ } -+ -+ /* lower level directorys are ok, open the base file */ -+ hidden_dentry = dtohd(file->f_dentry); -+ dget(hidden_dentry); -+ -+ mntget(stopd(inode->i_sb)->hidden_mnt); -+ hidden_file = dentry_open(hidden_dentry, -+ stopd(inode->i_sb)->hidden_mnt, -+ hidden_flags); -+ if (IS_ERR(hidden_file)) { -+ err = PTR_ERR(hidden_file); -+ dput(hidden_dentry); -+ dput(hidden_sto_dentry); -+ goto out; -+ } -+ ftohf(file) = hidden_file; /* link the two files */ -+ } -+ } -+ -+ if(!exists_in_storage(file->f_dentry)) { -+ printk(KERN_CRIT "mini_fo_open: invalid file state detected.\n"); -+ err = -EINVAL; -+ dput(hidden_sto_dentry); -+ -+ /* If the base file has been opened, we need to close it here */ -+ if(ftohf(file)) { -+ if (hidden_file->f_op && hidden_file->f_op->flush) -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) -+ hidden_file->f_op->flush(hidden_file, NULL); -+#else -+ hidden_file->f_op->flush(hidden_file); -+#endif -+ dput(hidden_dentry); -+ } -+ goto out; -+ } -+ -+ /* ok, now we can safely open the storage file */ -+ mntget(stopd(inode->i_sb)->hidden_mnt2); -+ hidden_sto_file = dentry_open(hidden_sto_dentry, -+ stopd(inode->i_sb)->hidden_mnt2, -+ hidden_flags); -+ -+ /* dentry_open dputs the dentry if it fails */ -+ if (IS_ERR(hidden_sto_file)) { -+ err = PTR_ERR(hidden_sto_file); -+ /* close base file if open */ -+ if(ftohf(file)) { -+ if (hidden_file->f_op && hidden_file->f_op->flush) -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) -+ hidden_file->f_op->flush(hidden_file, NULL); -+#else -+ hidden_file->f_op->flush(hidden_file); -+#endif -+ dput(hidden_dentry); -+ } -+ goto out; -+ } -+ ftohf2(file) = hidden_sto_file; /* link storage file */ -+ -+ out: -+ if (err < 0 && ftopd(file)) { -+ kfree(ftopd(file)); -+ } -+ return err; -+} -+ -+STATIC int -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) -+mini_fo_flush(file_t *file, fl_owner_t id) -+#else -+mini_fo_flush(file_t *file) -+#endif -+{ -+ int err1 = 0; /* assume ok (see open.c:close_fp) */ -+ int err2 = 0; -+ file_t *hidden_file = NULL; -+ -+ check_mini_fo_file(file); -+ -+ /* mk: we don't do any state checking here, as its not worth the time. -+ * Just flush the lower level files if they exist. -+ */ -+ if(ftopd(file) != NULL) { -+ if(ftohf(file) != NULL) { -+ hidden_file = ftohf(file); -+ if (hidden_file->f_op && hidden_file->f_op->flush) -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) -+ err1 = hidden_file->f_op->flush(hidden_file, id); -+#else -+ err1 = hidden_file->f_op->flush(hidden_file); -+#endif -+ } -+ if(ftohf2(file) != NULL) { -+ hidden_file = ftohf2(file); -+ if (hidden_file->f_op && hidden_file->f_op->flush) -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) -+ err2 = hidden_file->f_op->flush(hidden_file, id); -+#else -+ err2 = hidden_file->f_op->flush(hidden_file); -+#endif -+ } -+ } -+ return (err1 | err2); -+} -+ -+ -+STATIC int -+mini_fo_release(inode_t *inode, file_t *file) -+{ -+ int err = 0; -+ file_t *hidden_file = NULL; -+ -+ if (ftopd(file) != NULL) { -+ if(ftohf(file)) { -+ hidden_file = ftohf(file); -+ fput(hidden_file); -+ } -+ if(ftohf2(file)) { -+ hidden_file = ftohf2(file); -+ fput(hidden_file); -+ } -+ kfree(ftopd(file)); -+ } -+ return err; -+} -+ -+STATIC int -+mini_fo_fsync(file_t *file, dentry_t *dentry, int datasync) -+{ -+ int err1 = 0; -+ int err2 = 0; -+ file_t *hidden_file = NULL; -+ dentry_t *hidden_dentry; -+ -+ check_mini_fo_file(file); -+ -+ if ((hidden_file = ftohf(file)) != NULL) { -+ hidden_dentry = dtohd(dentry); -+ if (hidden_file->f_op && hidden_file->f_op->fsync) { -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_dentry->d_inode->i_mutex); -+#else -+ down(&hidden_dentry->d_inode->i_sem); -+#endif -+ err1 = hidden_file->f_op->fsync(hidden_file, hidden_dentry, datasync); -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_dentry->d_inode->i_sem); -+#endif -+ } -+ } -+ -+ if ((hidden_file = ftohf2(file)) != NULL) { -+ hidden_dentry = dtohd2(dentry); -+ if (hidden_file->f_op && hidden_file->f_op->fsync) { -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_dentry->d_inode->i_mutex); -+#else -+ down(&hidden_dentry->d_inode->i_sem); -+#endif -+ err2 = hidden_file->f_op->fsync(hidden_file, hidden_dentry, datasync); -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_dentry->d_inode->i_sem); -+#endif -+ } -+ } -+ else -+ goto err; -+ -+err: -+ return (err1 || err2); -+} -+ -+ -+STATIC int -+mini_fo_fasync(int fd, file_t *file, int flag) -+{ -+ int err1 = 0; -+ int err2 = 0; -+ -+ file_t *hidden_file = NULL; -+ -+ check_mini_fo_file(file); -+ -+ if((hidden_file = ftohf(file)) != NULL) { -+ err1 = hidden_file->f_op->fasync(fd, hidden_file, flag); -+ } -+ if((hidden_file = ftohf2(file)) != NULL) { -+ err2 = hidden_file->f_op->fasync(fd, hidden_file, flag); -+ } -+ -+ return (err1 || err2); -+} -+ -+ -+ -+struct file_operations mini_fo_dir_fops = -+ { -+ read: generic_read_dir, -+ write: mini_fo_write, -+ readdir: mini_fo_readdir, -+ poll: mini_fo_poll, -+ /* ioctl: mini_fo_ioctl, */ -+ mmap: mini_fo_mmap, -+ open: mini_fo_open, -+ flush: mini_fo_flush, -+ release: mini_fo_release, -+ fsync: mini_fo_fsync, -+ fasync: mini_fo_fasync, -+ /* not needed lock: mini_fo_lock, */ -+ /* not needed: readv */ -+ /* not needed: writev */ -+ /* not implemented: sendpage */ -+ /* not implemented: get_unmapped_area */ -+ }; -+ -+struct file_operations mini_fo_main_fops = -+ { -+ llseek: mini_fo_llseek, -+ read: mini_fo_read, -+ write: mini_fo_write, -+ readdir: mini_fo_readdir, -+ poll: mini_fo_poll, -+ /* ioctl: mini_fo_ioctl, */ -+ mmap: mini_fo_mmap, -+ open: mini_fo_open, -+ flush: mini_fo_flush, -+ release: mini_fo_release, -+ fsync: mini_fo_fsync, -+ fasync: mini_fo_fasync, -+ /* not needed: lock: mini_fo_lock, */ -+ /* not needed: readv */ -+ /* not needed: writev */ -+ /* not implemented: sendpage */ -+ /* not implemented: get_unmapped_area */ -+ }; ---- /dev/null -+++ b/fs/mini_fo/fist.h -@@ -0,0 +1,252 @@ -+/* -+ * Copyright (c) 1997-2003 Erez Zadok -+ * Copyright (c) 2001-2003 Stony Brook University -+ * -+ * For specific licensing information, see the COPYING file distributed with -+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING. -+ * -+ * This Copyright notice must be kept intact and distributed with all -+ * fistgen sources INCLUDING sources generated by fistgen. -+ */ -+/* -+ * Copyright (C) 2004, 2005 Markus Klotzbuecher -+ * -+ * 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. -+ */ -+ -+ -+/* -+ * $Id$ -+ */ -+ -+#ifndef __FIST_H_ -+#define __FIST_H_ -+ -+/* -+ * KERNEL ONLY CODE: -+ */ -+#ifdef __KERNEL__ -+#include -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19) -+#include -+#else -+#include -+#endif -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -+#ifdef CONFIG_MODVERSIONS -+# define MODVERSIONS -+# include -+#endif /* CONFIG_MODVERSIONS */ -+#endif /* KERNEL_VERSION < 2.6.0 */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -+#include -+#else -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#endif -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) -+#include -+#endif -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+#include -+#endif -+ -+#include -+ -+#include -+/* #include */ -+#include -+#include -+ -+/* -+ * MACROS: -+ */ -+ -+/* those mapped to ATTR_* were copied from linux/fs.h */ -+#define FA_MODE ATTR_MODE -+#define FA_UID ATTR_UID -+#define FA_GID ATTR_GID -+#define FA_SIZE ATTR_SIZE -+#define FA_ATIME ATTR_ATIME -+#define FA_MTIME ATTR_MTIME -+#define FA_CTIME ATTR_CTIME -+#define FA_ATIME_SET ATTR_ATIME_SET -+#define FA_MTIME_SET ATTR_MTIME_SET -+#define FA_FORCE ATTR_FORCE -+#define FA_ATTR_FLAGS ATTR_ATTR_FLAG -+ -+/* must be greater than all other ATTR_* flags! */ -+#define FA_NLINK 2048 -+#define FA_BLKSIZE 4096 -+#define FA_BLOCKS 8192 -+#define FA_TIMES (FA_ATIME|FA_MTIME|FA_CTIME) -+#define FA_ALL 0 -+ -+/* macros to manage changes between kernels */ -+#define INODE_DATA(i) (&(i)->i_data) -+ -+#define MIN(x,y) ((x < y) ? (x) : (y)) -+#define MAX(x,y) ((x > y) ? (x) : (y)) -+#define MAXPATHLEN PATH_MAX -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5) -+# define lookup_one_len(a,b,c) lookup_one(a,b) -+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5) */ -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,8) -+# define generic_file_llseek default_llseek -+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,4,8) */ -+ -+#ifndef SEEK_SET -+# define SEEK_SET 0 -+#endif /* not SEEK_SET */ -+ -+#ifndef SEEK_CUR -+# define SEEK_CUR 1 -+#endif /* not SEEK_CUR */ -+ -+#ifndef SEEK_END -+# define SEEK_END 2 -+#endif /* not SEEK_END */ -+ -+#ifndef DEFAULT_POLLMASK -+# define DEFAULT_POLLMASK (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM) -+#endif /* not DEFAULT_POLLMASK */ -+ -+/* XXX: fix this so fistgen generates kfree() code directly */ -+#define kfree_s(a,b) kfree(a) -+ -+/* -+ * TYPEDEFS: -+ */ -+typedef struct dentry dentry_t; -+typedef struct file file_t; -+typedef struct inode inode_t; -+typedef inode_t vnode_t; -+typedef struct page page_t; -+typedef struct qstr qstr_t; -+typedef struct super_block super_block_t; -+typedef super_block_t vfs_t; -+typedef struct vm_area_struct vm_area_t; -+ -+ -+/* -+ * EXTERNALS: -+ */ -+ -+#define FPPF(str,page) printk("PPF %s 0x%x/%d: Lck:%d Err:%d Ref:%d Upd:%d Other::%d:%d:%d:%d:\n", \ -+ str, \ -+ (int) page, \ -+ (int) page->index, \ -+ (PageLocked(page) ? 1 : 0), \ -+ (PageError(page) ? 1 : 0), \ -+ (PageReferenced(page) ? 1 : 0), \ -+ (Page_Uptodate(page) ? 1 : 0), \ -+ (PageDecrAfter(page) ? 1 : 0), \ -+ (PageSlab(page) ? 1 : 0), \ -+ (PageSwapCache(page) ? 1 : 0), \ -+ (PageReserved(page) ? 1 : 0) \ -+ ) -+#define EZKDBG printk("EZK %s:%d:%s\n",__FILE__,__LINE__,__FUNCTION__) -+#if 0 -+# define EZKDBG1 printk("EZK %s:%d\n",__FILE__,__LINE__) -+#else -+# define EZKDBG1 -+#endif -+ -+extern int fist_get_debug_value(void); -+extern int fist_set_debug_value(int val); -+#if 0 /* mini_fo doesn't need these */ -+extern void fist_dprint_internal(int level, char *str,...); -+extern void fist_print_dentry(char *str, const dentry_t *dentry); -+extern void fist_print_inode(char *str, const inode_t *inode); -+extern void fist_print_file(char *str, const file_t *file); -+extern void fist_print_buffer_flags(char *str, struct buffer_head *buffer); -+extern void fist_print_page_flags(char *str, page_t *page); -+extern void fist_print_page_bytes(char *str, page_t *page); -+extern void fist_print_pte_flags(char *str, const page_t *page); -+extern void fist_checkinode(inode_t *inode, char *msg); -+extern void fist_print_sb(char *str, const super_block_t *sb); -+ -+/* §$% by mk: special debug functions */ -+extern void fist_mk_print_dentry(char *str, const dentry_t *dentry); -+extern void fist_mk_print_inode(char *str, const inode_t *inode); -+ -+extern char *add_indent(void); -+extern char *del_indent(void); -+#endif/* mini_fo doesn't need these */ -+ -+ -+#define STATIC -+#define ASSERT(EX) \ -+do { \ -+ if (!(EX)) { \ -+ printk(KERN_CRIT "ASSERTION FAILED: %s at %s:%d (%s)\n", #EX, \ -+ __FILE__, __LINE__, __FUNCTION__); \ -+ (*((char *)0))=0; \ -+ } \ -+} while (0) -+/* same ASSERT, but tell me who was the caller of the function */ -+#define ASSERT2(EX) \ -+do { \ -+ if (!(EX)) { \ -+ printk(KERN_CRIT "ASSERTION FAILED (caller): %s at %s:%d (%s)\n", #EX, \ -+ file, line, func); \ -+ (*((char *)0))=0; \ -+ } \ -+} while (0) -+ -+#if 0 /* mini_fo doesn't need these */ -+#define dprintk(format, args...) printk(KERN_DEBUG format, ##args) -+#define fist_dprint(level, str, args...) fist_dprint_internal(level, KERN_DEBUG str, ## args) -+#define print_entry_location() fist_dprint(4, "%sIN: %s %s:%d\n", add_indent(), __FUNCTION__, __FILE__, __LINE__) -+#define print_exit_location() fist_dprint(4, "%s OUT: %s %s:%d\n", del_indent(), __FUNCTION__, __FILE__, __LINE__) -+#define print_exit_status(status) fist_dprint(4, "%s OUT: %s %s:%d, STATUS: %d\n", del_indent(), __FUNCTION__, __FILE__, __LINE__, status) -+#define print_exit_pointer(status) \ -+do { \ -+ if (IS_ERR(status)) \ -+ fist_dprint(4, "%s OUT: %s %s:%d, RESULT: %ld\n", del_indent(), __FUNCTION__, __FILE__, __LINE__, PTR_ERR(status)); \ -+ else \ -+ fist_dprint(4, "%s OUT: %s %s:%d, RESULT: 0x%x\n", del_indent(), __FUNCTION__, __FILE__, __LINE__, PTR_ERR(status)); \ -+} while (0) -+#endif/* mini_fo doesn't need these */ -+ -+#endif /* __KERNEL__ */ -+ -+ -+/* -+ * DEFINITIONS FOR USER AND KERNEL CODE: -+ * (Note: ioctl numbers 1--9 are reserved for fistgen, the rest -+ * are auto-generated automatically based on the user's .fist file.) -+ */ -+# define FIST_IOCTL_GET_DEBUG_VALUE _IOR(0x15, 1, int) -+# define FIST_IOCTL_SET_DEBUG_VALUE _IOW(0x15, 2, int) -+ -+#endif /* not __FIST_H_ */ ---- /dev/null -+++ b/fs/mini_fo/inode.c -@@ -0,0 +1,1564 @@ -+/* -+ * Copyright (c) 1997-2003 Erez Zadok -+ * Copyright (c) 2001-2003 Stony Brook University -+ * -+ * For specific licensing information, see the COPYING file distributed with -+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING. -+ * -+ * This Copyright notice must be kept intact and distributed with all -+ * fistgen sources INCLUDING sources generated by fistgen. -+ */ -+/* -+ * Copyright (C) 2004, 2005 Markus Klotzbuecher -+ * -+ * 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. -+ */ -+ -+/* -+ * $Id$ -+ */ -+ -+#ifdef HAVE_CONFIG_H -+# include -+#endif -+ -+#include "fist.h" -+#include "mini_fo.h" -+ -+STATIC int -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+mini_fo_create(inode_t *dir, dentry_t *dentry, int mode, struct nameidata *nd) -+#else -+mini_fo_create(inode_t *dir, dentry_t *dentry, int mode) -+#endif -+{ -+ int err = 0; -+ -+ check_mini_fo_dentry(dentry); -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ err = create_sto_reg_file(dentry, mode, nd); -+#else -+ err = create_sto_reg_file(dentry, mode); -+#endif -+ check_mini_fo_dentry(dentry); -+ return err; -+} -+ -+ -+STATIC dentry_t * -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+mini_fo_lookup(inode_t *dir, dentry_t *dentry, struct nameidata* nd) -+#else -+mini_fo_lookup(inode_t *dir, dentry_t *dentry) -+#endif -+{ -+ int err = 0; -+ dentry_t *hidden_dir_dentry; -+ dentry_t *hidden_dentry = NULL; -+ -+ dentry_t *hidden_sto_dir_dentry; -+ dentry_t *hidden_sto_dentry = NULL; -+ -+ /* whiteout flag */ -+ int del_flag = 0; -+ char *bpath = NULL; -+ -+ const char *name; -+ unsigned int namelen; -+ -+ /* Don't allow lookups of META-files */ -+ namelen = strlen(META_FILENAME); -+ if(namelen == dentry->d_name.len) { -+ if(!strncmp(dentry->d_name.name, META_FILENAME, namelen)) { -+ err = -ENOENT; -+ goto out; -+ } -+ } -+ -+ hidden_dir_dentry = dtohd(dentry->d_parent); -+ hidden_sto_dir_dentry = dtohd2(dentry->d_parent); -+ -+ name = dentry->d_name.name; -+ namelen = dentry->d_name.len; -+ -+ /* must initialize dentry operations */ -+ dentry->d_op = &mini_fo_dops; -+ -+ /* setup the del_flag */ -+ del_flag = __meta_check_d_entry(dir, name, namelen); -+ bpath = __meta_check_r_entry(dir, name, namelen); -+ -+ /* perform the lookups of base and storage files: -+ * -+ * This caused some serious trouble, as a lookup_one_len passing -+ * a negative dentry oopses. Solution is to only do the lookup -+ * if the dentry is positive, else we set it to NULL -+ * More trouble, who said a *_dir_dentry can't be NULL? -+ */ -+ if(bpath) { -+ /* Cross-Interposing (C), yeah! */ -+ hidden_dentry = bpath_walk(dir->i_sb, bpath); -+ if(!hidden_dentry || !hidden_dentry->d_inode) { -+ printk(KERN_CRIT "mini_fo_lookup: bpath_walk failed.\n"); -+ err= -EINVAL; -+ goto out; -+ } -+ -+ /* this can be set up safely without fear of spaghetti -+ * interposing as it is only used for copying times */ -+ hidden_dir_dentry = hidden_dentry->d_parent; -+ kfree(bpath); -+ } -+ else if(hidden_dir_dentry && hidden_dir_dentry->d_inode) -+ hidden_dentry = -+ lookup_one_len(name, hidden_dir_dentry, namelen); -+ else -+ hidden_dentry = NULL; -+ -+ if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode) -+ hidden_sto_dentry = -+ lookup_one_len(name, hidden_sto_dir_dentry, namelen); -+ else -+ hidden_sto_dentry = NULL; -+ -+ /* catch error in lookup */ -+ if (IS_ERR(hidden_dentry) || IS_ERR(hidden_sto_dentry)) { -+ /* mk: we need to call dput on the dentry, whose -+ * lookup_one_len operation failed, in order to avoid -+ * unmount trouble. -+ */ -+ if(IS_ERR(hidden_dentry)) { -+ printk(KERN_CRIT "mini_fo_lookup: ERR from base dentry, lookup failed.\n"); -+ err = PTR_ERR(hidden_dentry); -+ } else { -+ dput(hidden_dentry); -+ } -+ if(IS_ERR(hidden_sto_dentry)) { -+ printk(KERN_CRIT "mini_fo_lookup: ERR from storage dentry, lookup failed.\n"); -+ err = PTR_ERR(hidden_sto_dentry); -+ } else { -+ dput(hidden_sto_dentry); -+ } -+ goto out; -+ } -+ -+ /* allocate dentry private data */ -+ __dtopd(dentry) = (struct mini_fo_dentry_info *) -+ kmalloc(sizeof(struct mini_fo_dentry_info), GFP_KERNEL); -+ -+ if (!dtopd(dentry)) { -+ err = -ENOMEM; -+ goto out_dput; -+ } -+ -+ /* check for different states of the mini_fo file to be looked up. */ -+ -+ /* state 1, file has been modified */ -+ if(hidden_dentry && hidden_sto_dentry && -+ hidden_dentry->d_inode && hidden_sto_dentry->d_inode && !del_flag) { -+ -+ /* update parent directory's atime */ -+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode); -+ -+ dtopd(dentry)->state = MODIFIED; -+ dtohd(dentry) = hidden_dentry; -+ dtohd2(dentry) = hidden_sto_dentry; -+ -+ err = mini_fo_tri_interpose(hidden_dentry, -+ hidden_sto_dentry, -+ dentry, dir->i_sb, 1); -+ if (err) { -+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state1).\n"); -+ goto out_free; -+ } -+ goto out; -+ } -+ /* state 2, file is unmodified */ -+ if(hidden_dentry && hidden_dentry->d_inode && !del_flag) { -+ -+ fist_copy_attr_atime(dir, hidden_dir_dentry->d_inode); -+ -+ dtopd(dentry)->state = UNMODIFIED; -+ dtohd(dentry) = hidden_dentry; -+ dtohd2(dentry) = hidden_sto_dentry; /* could be negative */ -+ -+ err = mini_fo_tri_interpose(hidden_dentry, -+ hidden_sto_dentry, -+ dentry, dir->i_sb, 1); -+ if (err) { -+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state2).\n"); -+ goto out_free; -+ } -+ goto out; -+ } -+ /* state 3, file has been newly created */ -+ if(hidden_sto_dentry && hidden_sto_dentry->d_inode && !del_flag) { -+ -+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode); -+ dtopd(dentry)->state = CREATED; -+ dtohd(dentry) = hidden_dentry; /* could be negative */ -+ dtohd2(dentry) = hidden_sto_dentry; -+ -+ err = mini_fo_tri_interpose(hidden_dentry, -+ hidden_sto_dentry, -+ dentry, dir->i_sb, 1); -+ if (err) { -+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state3).\n"); -+ goto out_free; -+ } -+ goto out; -+ } -+ -+ /* state 4, file has deleted and created again. */ -+ if(hidden_dentry && hidden_sto_dentry && -+ hidden_dentry->d_inode && -+ hidden_sto_dentry->d_inode && del_flag) { -+ -+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode); -+ dtopd(dentry)->state = DEL_REWRITTEN; -+ dtohd(dentry) = NULL; -+ dtohd2(dentry) = hidden_sto_dentry; -+ -+ err = mini_fo_tri_interpose(NULL, -+ hidden_sto_dentry, -+ dentry, dir->i_sb, 1); -+ if (err) { -+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state4).\n"); -+ goto out_free; -+ } -+ /* We will never need this dentry again, as the file has been -+ * deleted from base */ -+ dput(hidden_dentry); -+ goto out; -+ } -+ /* state 5, file has been deleted in base */ -+ if(hidden_dentry && hidden_sto_dentry && -+ hidden_dentry->d_inode && -+ !hidden_sto_dentry->d_inode && del_flag) { -+ -+ /* check which parents atime we need for updating */ -+ if(hidden_sto_dir_dentry->d_inode) -+ fist_copy_attr_atime(dir, -+ hidden_sto_dir_dentry->d_inode); -+ else -+ fist_copy_attr_atime(dir, -+ hidden_dir_dentry->d_inode); -+ -+ dtopd(dentry)->state = DELETED; -+ dtohd(dentry) = NULL; -+ dtohd2(dentry) = hidden_sto_dentry; -+ -+ /* add negative dentry to dcache to speed up lookups */ -+ d_add(dentry, NULL); -+ dput(hidden_dentry); -+ goto out; -+ } -+ /* state 6, file does not exist */ -+ if(((hidden_dentry && !hidden_dentry->d_inode) || -+ (hidden_sto_dentry && !hidden_sto_dentry->d_inode)) && !del_flag) -+ { -+ /* check which parents atime we need for updating */ -+ if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode) -+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode); -+ else -+ fist_copy_attr_atime(dir, hidden_dir_dentry->d_inode); -+ -+ dtopd(dentry)->state = NON_EXISTANT; -+ dtohd(dentry) = hidden_dentry; -+ dtohd2(dentry) = hidden_sto_dentry; -+ d_add(dentry, NULL); -+ goto out; -+ } -+ -+ /* if we get to here, were in an invalid state. bad. */ -+ printk(KERN_CRIT "mini_fo_lookup: ERROR, meta data corruption detected.\n"); -+ -+ /* end state checking */ -+ out_free: -+ d_drop(dentry); /* so that our bad dentry will get destroyed */ -+ kfree(dtopd(dentry)); -+ __dtopd(dentry) = NULL; /* be safe */ -+ -+ out_dput: -+ if(hidden_dentry) -+ dput(hidden_dentry); -+ if(hidden_sto_dentry) -+ dput(hidden_sto_dentry); /* drops usage count and marks for release */ -+ -+ out: -+ /* initalize wol if file exists and is directory */ -+ if(dentry->d_inode) { -+ if(S_ISDIR(dentry->d_inode->i_mode)) { -+ itopd(dentry->d_inode)->deleted_list_size = -1; -+ itopd(dentry->d_inode)->renamed_list_size = -1; -+ meta_build_lists(dentry); -+ } -+ } -+ return ERR_PTR(err); -+} -+ -+ -+STATIC int -+mini_fo_link(dentry_t *old_dentry, inode_t *dir, dentry_t *new_dentry) -+{ -+ int err; -+ dentry_t *hidden_old_dentry; -+ dentry_t *hidden_new_dentry; -+ dentry_t *hidden_dir_dentry; -+ -+ -+ check_mini_fo_dentry(old_dentry); -+ check_mini_fo_dentry(new_dentry); -+ check_mini_fo_inode(dir); -+ -+ /* no links to directorys and existing targets target allowed */ -+ if(S_ISDIR(old_dentry->d_inode->i_mode) || -+ is_mini_fo_existant(new_dentry)) { -+ err = -EPERM; -+ goto out; -+ } -+ -+ /* bring it directly from unmod to del_rew */ -+ if(dtost(old_dentry) == UNMODIFIED) { -+ err = nondir_unmod_to_mod(old_dentry, 1); -+ if(err) { -+ err = -EINVAL; -+ goto out; -+ } -+ err = meta_add_d_entry(old_dentry->d_parent, -+ old_dentry->d_name.name, -+ old_dentry->d_name.len); -+ if(err) { -+ err = -EINVAL; -+ goto out; -+ } -+ dput(dtohd(old_dentry)); -+ dtohd(old_dentry) = NULL; -+ dtost(old_dentry) = DEL_REWRITTEN; -+ } -+ -+ err = get_neg_sto_dentry(new_dentry); -+ if(err) { -+ err = -EINVAL; -+ goto out; -+ } -+ -+ hidden_old_dentry = dtohd2(old_dentry); -+ hidden_new_dentry = dtohd2(new_dentry); -+ -+ dget(hidden_old_dentry); -+ dget(hidden_new_dentry); -+ -+ /* was: hidden_dir_dentry = lock_parent(hidden_new_dentry); */ -+ hidden_dir_dentry = dget(hidden_new_dentry->d_parent); -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_dir_dentry->d_inode->i_mutex); -+#else -+ down(&hidden_dir_dentry->d_inode->i_sem); -+#endif -+ -+ err = vfs_link(hidden_old_dentry, -+ hidden_dir_dentry->d_inode, -+ hidden_new_dentry); -+ if (err || !hidden_new_dentry->d_inode) -+ goto out_lock; -+ -+ dtost(new_dentry) = CREATED; -+ err = mini_fo_tri_interpose(NULL, hidden_new_dentry, new_dentry, dir->i_sb, 0); -+ if (err) -+ goto out_lock; -+ -+ fist_copy_attr_timesizes(dir, hidden_new_dentry->d_inode); -+ /* propagate number of hard-links */ -+ old_dentry->d_inode->i_nlink = itohi2(old_dentry->d_inode)->i_nlink; -+ -+ out_lock: -+ /* was: unlock_dir(hidden_dir_dentry); */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_dir_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_dir_dentry->d_inode->i_sem); -+#endif -+ dput(hidden_dir_dentry); -+ -+ dput(hidden_new_dentry); -+ dput(hidden_old_dentry); -+ if (!new_dentry->d_inode) -+ d_drop(new_dentry); -+ -+ out: -+ return err; -+} -+ -+ -+STATIC int -+mini_fo_unlink(inode_t *dir, dentry_t *dentry) -+{ -+ int err = 0; -+ -+ dget(dentry); -+ if(dtopd(dentry)->state == MODIFIED) { -+ err = nondir_mod_to_del(dentry); -+ goto out; -+ } -+ else if(dtopd(dentry)->state == UNMODIFIED) { -+ err = nondir_unmod_to_del(dentry); -+ goto out; -+ } -+ else if(dtopd(dentry)->state == CREATED) { -+ err = nondir_creat_to_del(dentry); -+ goto out; -+ } -+ else if(dtopd(dentry)->state == DEL_REWRITTEN) { -+ err = nondir_del_rew_to_del(dentry); -+ goto out; -+ } -+ -+ printk(KERN_CRIT "mini_fo_unlink: ERROR, invalid state detected.\n"); -+ -+ out: -+ fist_copy_attr_times(dir, itohi2(dentry->d_parent->d_inode)); -+ -+ if(!err) { -+ /* is this causing my pain? d_delete(dentry); */ -+ d_drop(dentry); -+ } -+ -+ dput(dentry); -+ return err; -+} -+ -+ -+STATIC int -+mini_fo_symlink(inode_t *dir, dentry_t *dentry, const char *symname) -+{ -+ int err=0; -+ dentry_t *hidden_sto_dentry; -+ dentry_t *hidden_sto_dir_dentry; -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ umode_t mode; -+#endif -+ -+ /* Fail if the symlink file exists */ -+ if(!(dtost(dentry) == DELETED || -+ dtost(dentry) == NON_EXISTANT)) { -+ err = -EEXIST; -+ goto out; -+ } -+ -+ err = get_neg_sto_dentry(dentry); -+ if(err) { -+ err = -EINVAL; -+ goto out; -+ } -+ hidden_sto_dentry = dtohd2(dentry); -+ -+ dget(hidden_sto_dentry); -+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */ -+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent); -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ down(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ mode = S_IALLUGO; -+ err = vfs_symlink(hidden_sto_dir_dentry->d_inode, -+ hidden_sto_dentry, symname, mode); -+#else -+ err = vfs_symlink(hidden_sto_dir_dentry->d_inode, -+ hidden_sto_dentry, -+ symname); -+#endif -+ if (err || !hidden_sto_dentry->d_inode) -+ goto out_lock; -+ -+ if(dtost(dentry) == DELETED) { -+ dtost(dentry) = DEL_REWRITTEN; -+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0); -+ if(err) -+ goto out_lock; -+ } else if(dtost(dentry) == NON_EXISTANT) { -+ dtost(dentry) = CREATED; -+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0); -+ if(err) -+ goto out_lock; -+ } -+ fist_copy_attr_timesizes(dir, hidden_sto_dir_dentry->d_inode); -+ -+ out_lock: -+ /* was: unlock_dir(hidden_sto_dir_dentry); */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ dput(hidden_sto_dir_dentry); -+ -+ dput(hidden_sto_dentry); -+ if (!dentry->d_inode) -+ d_drop(dentry); -+ out: -+ return err; -+} -+ -+STATIC int -+mini_fo_mkdir(inode_t *dir, dentry_t *dentry, int mode) -+{ -+ int err; -+ -+ err = create_sto_dir(dentry, mode); -+ -+ check_mini_fo_dentry(dentry); -+ -+ return err; -+} -+ -+ -+STATIC int -+mini_fo_rmdir(inode_t *dir, dentry_t *dentry) -+{ -+ int err = 0; -+ -+ dentry_t *hidden_sto_dentry; -+ dentry_t *hidden_sto_dir_dentry; -+ dentry_t *meta_dentry; -+ inode_t *hidden_sto_dir = NULL; -+ -+ check_mini_fo_dentry(dentry); -+ check_mini_fo_inode(dir); -+ -+ dget(dentry); -+ if(dtopd(dentry)->state == MODIFIED) { -+ /* XXX: disabled, because it does not bother to check files on -+ * the original filesystem - just a hack, but better than simply -+ * removing it without testing */ -+ err = -EINVAL; -+ goto out; -+ -+ hidden_sto_dir = itohi2(dir); -+ hidden_sto_dentry = dtohd2(dentry); -+ -+ /* was:hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */ -+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent); -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ down(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ -+ /* Delete an old WOL file contained in the storage dir */ -+ meta_dentry = lookup_one_len(META_FILENAME, -+ hidden_sto_dentry, -+ strlen(META_FILENAME)); -+ if(meta_dentry->d_inode) { -+ err = vfs_unlink(hidden_sto_dentry->d_inode, meta_dentry); -+ dput(meta_dentry); -+ if(!err) -+ d_delete(meta_dentry); -+ } -+ -+ err = vfs_rmdir(hidden_sto_dir, hidden_sto_dentry); -+ dput(hidden_sto_dentry); -+ if(!err) -+ d_delete(hidden_sto_dentry); -+ -+ /* propagate number of hard-links */ -+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink; -+ -+ dput(dtohd(dentry)); -+ -+ dtohd(dentry) = NULL; -+ dtopd(dentry)->state = DELETED; -+ -+ /* carefull with R files */ -+ if( __meta_is_r_entry(dir, -+ dentry->d_name.name, -+ dentry->d_name.len) == 1) { -+ err = meta_remove_r_entry(dentry->d_parent, -+ dentry->d_name.name, -+ dentry->d_name.len); -+ if(err) { -+ printk(KERN_CRIT "mini_fo: rmdir: meta_remove_r_entry failed.\n"); -+ goto out; -+ } -+ } -+ else { -+ /* ok, add deleted file to META */ -+ meta_add_d_entry(dentry->d_parent, -+ dentry->d_name.name, -+ dentry->d_name.len); -+ } -+ /* was: unlock_dir(hidden_sto_dir_dentry); */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ dput(hidden_sto_dir_dentry); -+ goto out; -+ } -+ else if(dtopd(dentry)->state == UNMODIFIED) { -+ /* XXX: simply adding it to the delete list here is fscking dangerous! -+ * as a temporary hack, i will disable rmdir on unmodified directories -+ * for now. -+ */ -+ err = -EINVAL; -+ goto out; -+ -+ err = get_neg_sto_dentry(dentry); -+ if(err) { -+ err = -EINVAL; -+ goto out; -+ } -+ -+ /* dput base dentry, this will relase the inode and free the -+ * dentry, as we will never need it again. */ -+ dput(dtohd(dentry)); -+ dtohd(dentry) = NULL; -+ dtopd(dentry)->state = DELETED; -+ -+ /* add deleted file to META-file */ -+ meta_add_d_entry(dentry->d_parent, -+ dentry->d_name.name, -+ dentry->d_name.len); -+ goto out; -+ } -+ else if(dtopd(dentry)->state == CREATED) { -+ hidden_sto_dir = itohi2(dir); -+ hidden_sto_dentry = dtohd2(dentry); -+ -+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry);*/ -+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent); -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ down(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ -+ /* Delete an old WOL file contained in the storage dir */ -+ meta_dentry = lookup_one_len(META_FILENAME, -+ hidden_sto_dentry, -+ strlen(META_FILENAME)); -+ if(meta_dentry->d_inode) { -+ /* is this necessary? dget(meta_dentry); */ -+ err = vfs_unlink(hidden_sto_dentry->d_inode, -+ meta_dentry); -+ dput(meta_dentry); -+ if(!err) -+ d_delete(meta_dentry); -+ } -+ -+ err = vfs_rmdir(hidden_sto_dir, hidden_sto_dentry); -+ dput(hidden_sto_dentry); -+ if(!err) -+ d_delete(hidden_sto_dentry); -+ -+ /* propagate number of hard-links */ -+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink; -+ dtopd(dentry)->state = NON_EXISTANT; -+ -+ /* was: unlock_dir(hidden_sto_dir_dentry); */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ dput(hidden_sto_dir_dentry); -+ -+ goto out; -+ } -+ else if(dtopd(dentry)->state == DEL_REWRITTEN) { -+ hidden_sto_dir = itohi2(dir); -+ hidden_sto_dentry = dtohd2(dentry); -+ -+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry);*/ -+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent); -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ down(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ -+ /* Delete an old WOL file contained in the storage dir */ -+ meta_dentry = lookup_one_len(META_FILENAME, -+ hidden_sto_dentry, -+ strlen(META_FILENAME)); -+ if(meta_dentry->d_inode) { -+ /* is this necessary? dget(meta_dentry); */ -+ err = vfs_unlink(hidden_sto_dentry->d_inode, -+ meta_dentry); -+ dput(meta_dentry); -+ if(!err) -+ d_delete(meta_dentry); -+ } -+ -+ err = vfs_rmdir(hidden_sto_dir, hidden_sto_dentry); -+ dput(hidden_sto_dentry); -+ if(!err) -+ d_delete(hidden_sto_dentry); -+ -+ /* propagate number of hard-links */ -+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink; -+ dtopd(dentry)->state = DELETED; -+ /* was: unlock_dir(hidden_sto_dir_dentry); */ -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ dput(hidden_sto_dir_dentry); -+ goto out; -+ } -+ -+ printk(KERN_CRIT "mini_fo_rmdir: ERROR, invalid state detected.\n"); -+ -+ out: -+ if(!err) { -+ d_drop(dentry); -+ } -+ -+ fist_copy_attr_times(dir, itohi2(dentry->d_parent->d_inode)); -+ dput(dentry); -+ -+ return err; -+} -+ -+ -+STATIC int -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+mini_fo_mknod(inode_t *dir, dentry_t *dentry, int mode, dev_t dev) -+#else -+mini_fo_mknod(inode_t *dir, dentry_t *dentry, int mode, int dev) -+#endif -+{ -+ int err = 0; -+ -+ check_mini_fo_dentry(dentry); -+ -+ err = create_sto_nod(dentry, mode, dev); -+ if(err) { -+ printk(KERN_CRIT "mini_fo_mknod: creating sto nod failed.\n"); -+ err = -EINVAL; -+ } -+ -+ check_mini_fo_dentry(dentry); -+ return err; -+} -+ -+ -+STATIC int -+mini_fo_rename(inode_t *old_dir, dentry_t *old_dentry, -+ inode_t *new_dir, dentry_t *new_dentry) -+{ -+ /* dispatch */ -+ if(S_ISDIR(old_dentry->d_inode->i_mode)) -+ return rename_directory(old_dir, old_dentry, new_dir, new_dentry); -+ return rename_nondir(old_dir, old_dentry, new_dir, new_dentry); -+ -+} -+ -+int rename_directory(inode_t *old_dir, dentry_t *old_dentry, -+ inode_t *new_dir, dentry_t *new_dentry) -+{ -+ int err, bpath_len; -+ char *bpath; -+ -+ dentry_t *hidden_old_dentry; -+ dentry_t *hidden_new_dentry; -+ dentry_t *hidden_old_dir_dentry; -+ dentry_t *hidden_new_dir_dentry; -+ -+ err = 0; -+ bpath = NULL; -+ bpath_len = 0; -+ -+ /* this is a test, chuck out if it works */ -+ if(!(dtopd(new_dentry)->state == DELETED || -+ dtopd(new_dentry)->state == NON_EXISTANT)) { -+ printk(KERN_CRIT "mini_fo: rename_directory: \ -+ uh, ah, new_dentry not negative.\n"); -+ /* return -1; */ -+ } -+ -+ /* state = UNMODIFIED */ -+ if(dtopd(old_dentry)->state == UNMODIFIED) { -+ err = dir_unmod_to_mod(old_dentry); -+ if (err) -+ goto out; -+ } -+ -+ /* state = MODIFIED */ -+ if(dtopd(old_dentry)->state == MODIFIED) { -+ bpath = meta_check_r_entry(old_dentry->d_parent, -+ old_dentry->d_name.name, -+ old_dentry->d_name.len); -+ if(bpath) { -+ err = meta_remove_r_entry(old_dentry->d_parent, -+ old_dentry->d_name.name, -+ old_dentry->d_name.len); -+ if(err) { -+ printk(KERN_CRIT "mini_fo: rename_directory:\ -+ meta_remove_r_entry \ -+ failed.\n"); -+ goto out; -+ } -+ err = meta_add_r_entry(new_dentry->d_parent, -+ bpath, -+ strlen(bpath), -+ new_dentry->d_name.name, -+ new_dentry->d_name.len); -+ kfree(bpath); -+ } -+ else {/* wol it */ -+ err = meta_add_d_entry(old_dentry->d_parent, -+ old_dentry->d_name.name, -+ old_dentry->d_name.len); -+ if (err) -+ goto out; -+ /* put it on rename list */ -+ err = get_mini_fo_bpath(old_dentry, -+ &bpath, -+ &bpath_len); -+ if (err) -+ goto out; -+ err = meta_add_r_entry(new_dentry->d_parent, -+ bpath, bpath_len, -+ new_dentry->d_name.name, -+ new_dentry->d_name.len); -+ if (err) -+ goto out; -+ } -+ /* no state change, MODIFIED stays MODIFIED */ -+ } -+ /* state = CREATED */ -+ if(dtopd(old_dentry)->state == CREATED || -+ dtopd(old_dentry)->state == DEL_REWRITTEN) { -+ if(dtohd(old_dentry)) -+ dput(dtohd(old_dentry)); -+ -+ if(dtopd(new_dentry)->state == DELETED) { -+ dtopd(old_dentry)->state = DEL_REWRITTEN; -+ dtohd(old_dentry) = NULL; -+ } -+ else if(dtopd(new_dentry)->state == NON_EXISTANT) { -+ dtopd(old_dentry)->state = CREATED; -+ /* steal new dentry's neg. base dentry */ -+ dtohd(old_dentry) = dtohd(new_dentry); -+ dtohd(new_dentry) = NULL; -+ } -+ } -+ if(dtopd(new_dentry)->state == UNMODIFIED || -+ dtopd(new_dentry)->state == NON_EXISTANT) { -+ err = get_neg_sto_dentry(new_dentry); -+ if(err) -+ goto out; -+ } -+ -+ /* now move sto file */ -+ hidden_old_dentry = dtohd2(old_dentry); -+ hidden_new_dentry = dtohd2(new_dentry); -+ -+ dget(hidden_old_dentry); -+ dget(hidden_new_dentry); -+ -+ hidden_old_dir_dentry = dget(hidden_old_dentry->d_parent); -+ hidden_new_dir_dentry = dget(hidden_new_dentry->d_parent); -+ double_lock(hidden_old_dir_dentry, hidden_new_dir_dentry); -+ -+ err = vfs_rename(hidden_old_dir_dentry->d_inode, hidden_old_dentry, -+ hidden_new_dir_dentry->d_inode, hidden_new_dentry); -+ if(err) -+ goto out_lock; -+ -+ fist_copy_attr_all(new_dir, hidden_new_dir_dentry->d_inode); -+ if (new_dir != old_dir) -+ fist_copy_attr_all(old_dir, -+ hidden_old_dir_dentry->d_inode); -+ -+ out_lock: -+ /* double_unlock will dput the new/old parent dentries -+ * whose refcnts were incremented via get_parent above. */ -+ double_unlock(hidden_old_dir_dentry, hidden_new_dir_dentry); -+ dput(hidden_new_dentry); -+ dput(hidden_old_dentry); -+ -+ out: -+ return err; -+} -+ -+int rename_nondir(inode_t *old_dir, dentry_t *old_dentry, -+ inode_t *new_dir, dentry_t *new_dentry) -+{ -+ int err=0; -+ -+ check_mini_fo_dentry(old_dentry); -+ check_mini_fo_dentry(new_dentry); -+ check_mini_fo_inode(old_dir); -+ check_mini_fo_inode(new_dir); -+ -+ /* state: UNMODIFIED */ -+ if(dtost(old_dentry) == UNMODIFIED) { -+ err = nondir_unmod_to_mod(old_dentry, 1); -+ if(err) { -+ err = -EINVAL; -+ goto out; -+ } -+ } -+ -+ /* the easy states */ -+ if(exists_in_storage(old_dentry)) { -+ -+ dentry_t *hidden_old_dentry; -+ dentry_t *hidden_new_dentry; -+ dentry_t *hidden_old_dir_dentry; -+ dentry_t *hidden_new_dir_dentry; -+ -+ /* if old file is MODIFIED, add it to the deleted_list */ -+ if(dtopd(old_dentry)->state == MODIFIED) { -+ meta_add_d_entry(old_dentry->d_parent, -+ old_dentry->d_name.name, -+ old_dentry->d_name.len); -+ -+ dput(dtohd(old_dentry)); -+ } -+ /* if old file is CREATED, we only release the base dentry */ -+ if(dtopd(old_dentry)->state == CREATED) { -+ if(dtohd(old_dentry)) -+ dput(dtohd(old_dentry)); -+ } -+ -+ /* now setup the new states (depends on new_dentry state) */ -+ /* new dentry state = MODIFIED */ -+ if(dtopd(new_dentry)->state == MODIFIED) { -+ meta_add_d_entry(new_dentry->d_parent, -+ new_dentry->d_name.name, -+ new_dentry->d_name.len); -+ -+ /* new dentry will be d_put'ed later by the vfs -+ * so don't do it here -+ * dput(dtohd(new_dentry)); -+ */ -+ dtohd(old_dentry) = NULL; -+ dtopd(old_dentry)->state = DEL_REWRITTEN; -+ } -+ /* new dentry state = UNMODIFIED */ -+ else if(dtopd(new_dentry)->state == UNMODIFIED) { -+ if(get_neg_sto_dentry(new_dentry)) -+ return -EINVAL; -+ -+ meta_add_d_entry(new_dentry->d_parent, -+ new_dentry->d_name.name, -+ new_dentry->d_name.len); -+ -+ /* is this right??? */ -+ /*dput(dtohd(new_dentry));*/ -+ dtohd(old_dentry) = NULL; -+ dtopd(old_dentry)->state = DEL_REWRITTEN; -+ } -+ /* new dentry state = CREATED */ -+ else if(dtopd(new_dentry)->state == CREATED) { -+ /* we keep the neg. base dentry (if exists) */ -+ dtohd(old_dentry) = dtohd(new_dentry); -+ /* ...and set it to Null, or we'll get -+ * dcache.c:345 if it gets dput twice... */ -+ dtohd(new_dentry) = NULL; -+ dtopd(old_dentry)->state = CREATED; -+ } -+ /* new dentry state = NON_EXISTANT */ -+ else if(dtopd(new_dentry)->state == NON_EXISTANT) { -+ if(get_neg_sto_dentry(new_dentry)) -+ return -EINVAL; -+ -+ /* we keep the neg. base dentry (if exists) */ -+ dtohd(old_dentry) = dtohd(new_dentry); -+ /* ...and set it to Null, or we'll get -+ * Dr. dcache.c:345 if it gets dput twice... */ -+ dtohd(new_dentry) = NULL; -+ dtopd(old_dentry)->state = CREATED; -+ } -+ /* new dentry state = DEL_REWRITTEN or DELETED */ -+ else if(dtopd(new_dentry)->state == DEL_REWRITTEN || -+ dtopd(new_dentry)->state == DELETED) { -+ dtohd(old_dentry) = NULL; -+ dtopd(old_dentry)->state = DEL_REWRITTEN; -+ } -+ else { /* not possible, uhh, ahh */ -+ printk(KERN_CRIT -+ "mini_fo: rename_reg_file: invalid state detected [1].\n"); -+ return -1; -+ } -+ -+ /* now we definitely have a sto file */ -+ hidden_old_dentry = dtohd2(old_dentry); -+ hidden_new_dentry = dtohd2(new_dentry); -+ -+ dget(hidden_old_dentry); -+ dget(hidden_new_dentry); -+ -+ hidden_old_dir_dentry = dget(hidden_old_dentry->d_parent); -+ hidden_new_dir_dentry = dget(hidden_new_dentry->d_parent); -+ double_lock(hidden_old_dir_dentry, hidden_new_dir_dentry); -+ -+ err = vfs_rename(hidden_old_dir_dentry->d_inode, -+ hidden_old_dentry, -+ hidden_new_dir_dentry->d_inode, -+ hidden_new_dentry); -+ if(err) -+ goto out_lock; -+ -+ fist_copy_attr_all(new_dir, hidden_new_dir_dentry->d_inode); -+ if (new_dir != old_dir) -+ fist_copy_attr_all(old_dir, hidden_old_dir_dentry->d_inode); -+ -+ out_lock: -+ /* double_unlock will dput the new/old parent dentries -+ * whose refcnts were incremented via get_parent above. -+ */ -+ double_unlock(hidden_old_dir_dentry, hidden_new_dir_dentry); -+ dput(hidden_new_dentry); -+ dput(hidden_old_dentry); -+ out: -+ return err; -+ } -+ else { /* invalid state */ -+ printk(KERN_CRIT "mini_fo: rename_reg_file: ERROR: invalid state detected [2].\n"); -+ return -1; -+ } -+} -+ -+ -+STATIC int -+mini_fo_readlink(dentry_t *dentry, char *buf, int bufsiz) -+{ -+ int err=0; -+ dentry_t *hidden_dentry = NULL; -+ -+ if(dtohd2(dentry) && dtohd2(dentry)->d_inode) { -+ hidden_dentry = dtohd2(dentry); -+ } else if(dtohd(dentry) && dtohd(dentry)->d_inode) { -+ hidden_dentry = dtohd(dentry); -+ } else { -+ goto out; -+ } -+ -+ if (!hidden_dentry->d_inode->i_op || -+ !hidden_dentry->d_inode->i_op->readlink) { -+ err = -EINVAL; goto out; -+ } -+ -+ err = hidden_dentry->d_inode->i_op->readlink(hidden_dentry, -+ buf, -+ bufsiz); -+ if (err > 0) -+ fist_copy_attr_atime(dentry->d_inode, hidden_dentry->d_inode); -+ -+ out: -+ return err; -+} -+ -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13) -+static int mini_fo_follow_link(dentry_t *dentry, struct nameidata *nd) -+#else -+static void* mini_fo_follow_link(dentry_t *dentry, struct nameidata *nd) -+#endif -+{ -+ char *buf; -+ int len = PAGE_SIZE, err; -+ mm_segment_t old_fs; -+ -+ /* in 2.6 this is freed by mini_fo_put_link called by __do_follow_link */ -+ buf = kmalloc(len, GFP_KERNEL); -+ if (!buf) { -+ err = -ENOMEM; -+ goto out; -+ } -+ -+ /* read the symlink, and then we will follow it */ -+ old_fs = get_fs(); -+ set_fs(KERNEL_DS); -+ err = dentry->d_inode->i_op->readlink(dentry, buf, len); -+ set_fs(old_fs); -+ if (err < 0) { -+ kfree(buf); -+ buf = NULL; -+ goto out; -+ } -+ buf[err] = 0; -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ nd_set_link(nd, buf); -+ err = 0; -+#else -+ err = vfs_follow_link(nd, buf); -+#endif -+ -+ out: -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -+ kfree(buf); -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13) -+ return err; -+#else -+ return ERR_PTR(err); -+#endif -+} -+ -+STATIC -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13) -+void mini_fo_put_link(struct dentry *dentry, struct nameidata *nd) -+#else -+void mini_fo_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie) -+#endif -+{ -+ char *link; -+ link = nd_get_link(nd); -+ kfree(link); -+} -+#endif -+ -+STATIC int -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+mini_fo_permission(inode_t *inode, int mask, struct nameidata *nd) -+#else -+mini_fo_permission(inode_t *inode, int mask) -+#endif -+{ -+ inode_t *hidden_inode; -+ int mode; -+ int err; -+ -+ if(itohi2(inode)) { -+ hidden_inode = itohi2(inode); -+ } else { -+ hidden_inode = itohi(inode); -+ } -+ mode = inode->i_mode; -+ -+ /* not really needed, as permission handles everything: -+ * err = vfs_permission(inode, mask); -+ * if (err) -+ * goto out; -+ */ -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ err = permission(hidden_inode, mask, nd); -+#else -+ err = permission(hidden_inode, mask); -+#endif -+ -+ /* out: */ -+ return err; -+} -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -+STATIC int -+mini_fo_inode_revalidate(dentry_t *dentry) -+{ -+ int err = 0; -+ dentry_t *hidden_dentry; -+ inode_t *hidden_inode; -+ -+ ASSERT(dentry->d_inode); -+ ASSERT(itopd(dentry->d_inode)); -+ -+ if(itohi2(dentry->d_inode)) { -+ hidden_dentry = dtohd2(dentry); -+ hidden_inode = hidden_dentry->d_inode; -+ } else if(itohi(dentry->d_inode)) { -+ hidden_dentry = dtohd(dentry); -+ hidden_inode = hidden_dentry->d_inode; -+ } else { -+ printk(KERN_CRIT "mini_fo_inode_revalidate: ERROR, invalid state detected.\n"); -+ err = -ENOENT; -+ goto out; -+ } -+ if (hidden_inode && hidden_inode->i_op && hidden_inode->i_op->revalidate){ -+ err = hidden_inode->i_op->revalidate(hidden_dentry); -+ if (err) -+ goto out; -+ } -+ fist_copy_attr_all(dentry->d_inode, hidden_inode); -+ out: -+ return err; -+} -+#endif -+ -+STATIC int -+mini_fo_setattr(dentry_t *dentry, struct iattr *ia) -+{ -+ int err = 0; -+ -+ check_mini_fo_dentry(dentry); -+ -+ if(!is_mini_fo_existant(dentry)) { -+ printk(KERN_CRIT "mini_fo_setattr: ERROR, invalid state detected [1].\n"); -+ goto out; -+ } -+ -+ if(dtost(dentry) == UNMODIFIED) { -+ if(!IS_COPY_FLAG(ia->ia_valid)) -+ goto out; /* we ignore these changes to base */ -+ -+ if(S_ISDIR(dentry->d_inode->i_mode)) { -+ err = dir_unmod_to_mod(dentry); -+ } else { -+ /* we copy contents if file is not beeing truncated */ -+ if(S_ISREG(dentry->d_inode->i_mode) && -+ !(ia->ia_size == 0 && (ia->ia_valid & ATTR_SIZE))) { -+ err = nondir_unmod_to_mod(dentry, 1); -+ } else -+ err = nondir_unmod_to_mod(dentry, 0); -+ } -+ if(err) { -+ err = -EINVAL; -+ printk(KERN_CRIT "mini_fo_setattr: ERROR changing states.\n"); -+ goto out; -+ } -+ } -+ if(!exists_in_storage(dentry)) { -+ printk(KERN_CRIT "mini_fo_setattr: ERROR, invalid state detected [2].\n"); -+ err = -EINVAL; -+ goto out; -+ } -+ ASSERT(dentry->d_inode); -+ ASSERT(dtohd2(dentry)); -+ ASSERT(itopd(dentry->d_inode)); -+ ASSERT(itohi2(dentry->d_inode)); -+ -+ err = notify_change(dtohd2(dentry), ia); -+ fist_copy_attr_all(dentry->d_inode, itohi2(dentry->d_inode)); -+ out: -+ return err; -+} -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+STATIC int -+mini_fo_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) -+{ -+ int err = 0; -+ dentry_t *hidden_dentry; -+ -+ ASSERT(dentry->d_inode); -+ ASSERT(itopd(dentry->d_inode)); -+ -+ if(itohi2(dentry->d_inode)) { -+ hidden_dentry = dtohd2(dentry); -+ } else if(itohi(dentry->d_inode)) { -+ hidden_dentry = dtohd(dentry); -+ } else { -+ printk(KERN_CRIT "mini_fo_getattr: ERROR, invalid state detected.\n"); -+ err = -ENOENT; -+ goto out; -+ } -+ fist_copy_attr_all(dentry->d_inode, hidden_dentry->d_inode); -+ -+ ASSERT(hidden_dentry); -+ ASSERT(hidden_dentry->d_inode); -+ ASSERT(hidden_dentry->d_inode->i_op); -+ -+ generic_fillattr(dentry->d_inode, stat); -+ if (!stat->blksize) { -+ struct super_block *s = hidden_dentry->d_inode->i_sb; -+ unsigned blocks; -+ blocks = (stat->size+s->s_blocksize-1) >> s->s_blocksize_bits; -+ stat->blocks = (s->s_blocksize / 512) * blocks; -+ stat->blksize = s->s_blocksize; -+ } -+ out: -+ return err; -+} -+#endif -+ -+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)) -+#if 0 /* no xattr_alloc() and xattr_free() */ -+/* This is lifted from fs/xattr.c */ -+static void * -+xattr_alloc(size_t size, size_t limit) -+{ -+ void *ptr; -+ -+ if (size > limit) -+ return ERR_PTR(-E2BIG); -+ -+ if (!size) /* size request, no buffer is needed */ -+ return NULL; -+ else if (size <= PAGE_SIZE) -+ ptr = kmalloc((unsigned long) size, GFP_KERNEL); -+ else -+ ptr = vmalloc((unsigned long) size); -+ if (!ptr) -+ return ERR_PTR(-ENOMEM); -+ return ptr; -+} -+ -+static void -+xattr_free(void *ptr, size_t size) -+{ -+ if (!size) /* size request, no buffer was needed */ -+ return; -+ else if (size <= PAGE_SIZE) -+ kfree(ptr); -+ else -+ vfree(ptr); -+} -+#endif /* no xattr_alloc() and xattr_free() */ -+ -+/* BKL held by caller. -+ * dentry->d_inode->i_sem down -+ */ -+STATIC int -+mini_fo_getxattr(struct dentry *dentry, const char *name, void *value, size_t size) { -+ struct dentry *hidden_dentry = NULL; -+ int err = -EOPNOTSUPP; -+ /* Define these anyway so we don't need as much ifdef'ed code. */ -+ char *encoded_name = NULL; -+ char *encoded_value = NULL; -+ -+ check_mini_fo_dentry(dentry); -+ -+ if(exists_in_storage(dentry)) -+ hidden_dentry = dtohd2(dentry); -+ else -+ hidden_dentry = dtohd(dentry); -+ -+ ASSERT(hidden_dentry); -+ ASSERT(hidden_dentry->d_inode); -+ ASSERT(hidden_dentry->d_inode->i_op); -+ -+ if (hidden_dentry->d_inode->i_op->getxattr) { -+ encoded_name = (char *)name; -+ encoded_value = (char *)value; -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_dentry->d_inode->i_mutex); -+#else -+ down(&hidden_dentry->d_inode->i_sem); -+#endif -+ /* lock_kernel() already done by caller. */ -+ err = hidden_dentry->d_inode->i_op->getxattr(hidden_dentry, encoded_name, encoded_value, size); -+ /* unlock_kernel() will be done by caller. */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_dentry->d_inode->i_sem); -+#endif -+ } -+ return err; -+} -+ -+/* BKL held by caller. -+ * dentry->d_inode->i_sem down -+ */ -+STATIC int -+#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,21) \ -+ && LINUX_VERSION_CODE <= KERNEL_VERSION(2,4,23)) \ -+ || LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) -+mini_fo_setxattr(struct dentry *dentry, const char *name, -+ const void *value, size_t size, int flags) -+#else -+mini_fo_setxattr(struct dentry *dentry, const char *name, -+ void *value, size_t size, int flags) -+#endif -+ -+{ -+ struct dentry *hidden_dentry = NULL; -+ int err = -EOPNOTSUPP; -+ -+ /* Define these anyway, so we don't have as much ifdef'ed code. */ -+ char *encoded_value = NULL; -+ char *encoded_name = NULL; -+ -+ check_mini_fo_dentry(dentry); -+ -+ if(exists_in_storage(dentry)) -+ hidden_dentry = dtohd2(dentry); -+ else -+ hidden_dentry = dtohd(dentry); -+ -+ ASSERT(hidden_dentry); -+ ASSERT(hidden_dentry->d_inode); -+ ASSERT(hidden_dentry->d_inode->i_op); -+ -+ if (hidden_dentry->d_inode->i_op->setxattr) { -+ encoded_name = (char *)name; -+ encoded_value = (char *)value; -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_dentry->d_inode->i_mutex); -+#else -+ down(&hidden_dentry->d_inode->i_sem); -+#endif -+ /* lock_kernel() already done by caller. */ -+ err = hidden_dentry->d_inode->i_op->setxattr(hidden_dentry, encoded_name, encoded_value, size, flags); -+ /* unlock_kernel() will be done by caller. */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_dentry->d_inode->i_sem); -+#endif -+ } -+ return err; -+} -+ -+/* BKL held by caller. -+ * dentry->d_inode->i_sem down -+ */ -+STATIC int -+mini_fo_removexattr(struct dentry *dentry, const char *name) { -+ struct dentry *hidden_dentry = NULL; -+ int err = -EOPNOTSUPP; -+ char *encoded_name; -+ -+ check_mini_fo_dentry(dentry); -+ -+ if(exists_in_storage(dentry)) -+ hidden_dentry = dtohd2(dentry); -+ else -+ hidden_dentry = dtohd(dentry); -+ -+ ASSERT(hidden_dentry); -+ ASSERT(hidden_dentry->d_inode); -+ ASSERT(hidden_dentry->d_inode->i_op); -+ -+ if (hidden_dentry->d_inode->i_op->removexattr) { -+ encoded_name = (char *)name; -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_dentry->d_inode->i_mutex); -+#else -+ down(&hidden_dentry->d_inode->i_sem); -+#endif -+ /* lock_kernel() already done by caller. */ -+ err = hidden_dentry->d_inode->i_op->removexattr(hidden_dentry, encoded_name); -+ /* unlock_kernel() will be done by caller. */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_dentry->d_inode->i_sem); -+#endif -+ } -+ return err; -+} -+ -+/* BKL held by caller. -+ * dentry->d_inode->i_sem down -+ */ -+STATIC int -+mini_fo_listxattr(struct dentry *dentry, char *list, size_t size) { -+ struct dentry *hidden_dentry = NULL; -+ int err = -EOPNOTSUPP; -+ char *encoded_list = NULL; -+ -+ check_mini_fo_dentry(dentry); -+ -+ if(exists_in_storage(dentry)) -+ hidden_dentry = dtohd2(dentry); -+ else -+ hidden_dentry = dtohd(dentry); -+ -+ ASSERT(hidden_dentry); -+ ASSERT(hidden_dentry->d_inode); -+ ASSERT(hidden_dentry->d_inode->i_op); -+ -+ if (hidden_dentry->d_inode->i_op->listxattr) { -+ encoded_list = list; -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_dentry->d_inode->i_mutex); -+#else -+ down(&hidden_dentry->d_inode->i_sem); -+#endif -+ /* lock_kernel() already done by caller. */ -+ err = hidden_dentry->d_inode->i_op->listxattr(hidden_dentry, encoded_list, size); -+ /* unlock_kernel() will be done by caller. */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_dentry->d_inode->i_sem); -+#endif -+ } -+ return err; -+} -+# endif /* defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)) */ -+ -+struct inode_operations mini_fo_symlink_iops = -+ { -+ readlink: mini_fo_readlink, -+ follow_link: mini_fo_follow_link, -+ /* mk: permission: mini_fo_permission, */ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -+ revalidate: mini_fo_inode_revalidate, -+#endif -+ setattr: mini_fo_setattr, -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ getattr: mini_fo_getattr, -+ put_link: mini_fo_put_link, -+#endif -+ -+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)) -+ setxattr: mini_fo_setxattr, -+ getxattr: mini_fo_getxattr, -+ listxattr: mini_fo_listxattr, -+ removexattr: mini_fo_removexattr -+# endif /* defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)) */ -+ }; -+ -+struct inode_operations mini_fo_dir_iops = -+ { -+ create: mini_fo_create, -+ lookup: mini_fo_lookup, -+ link: mini_fo_link, -+ unlink: mini_fo_unlink, -+ symlink: mini_fo_symlink, -+ mkdir: mini_fo_mkdir, -+ rmdir: mini_fo_rmdir, -+ mknod: mini_fo_mknod, -+ rename: mini_fo_rename, -+ /* no readlink/follow_link for non-symlinks */ -+ // off because we have setattr -+ // truncate: mini_fo_truncate, -+ /* mk:permission: mini_fo_permission, */ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -+ revalidate: mini_fo_inode_revalidate, -+#endif -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ getattr: mini_fo_getattr, -+#endif -+ setattr: mini_fo_setattr, -+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)) -+ setxattr: mini_fo_setxattr, -+ getxattr: mini_fo_getxattr, -+ listxattr: mini_fo_listxattr, -+ removexattr: mini_fo_removexattr -+# endif /* XATTR && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) */ -+ }; -+ -+struct inode_operations mini_fo_main_iops = -+ { -+ /* permission: mini_fo_permission, */ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -+ revalidate: mini_fo_inode_revalidate, -+#endif -+ setattr: mini_fo_setattr, -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ getattr: mini_fo_getattr, -+#endif -+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)) -+ setxattr: mini_fo_setxattr, -+ getxattr: mini_fo_getxattr, -+ listxattr: mini_fo_listxattr, -+ removexattr: mini_fo_removexattr -+# endif /* XATTR && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) */ -+ }; ---- /dev/null -+++ b/fs/mini_fo/main.c -@@ -0,0 +1,423 @@ -+/* -+ * Copyright (c) 1997-2003 Erez Zadok -+ * Copyright (c) 2001-2003 Stony Brook University -+ * -+ * For specific licensing information, see the COPYING file distributed with -+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING. -+ * -+ * This Copyright notice must be kept intact and distributed with all -+ * fistgen sources INCLUDING sources generated by fistgen. -+ */ -+/* -+ * Copyright (C) 2004, 2005 Markus Klotzbuecher -+ * -+ * 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. -+ */ -+ -+/* -+ * $Id$ -+ */ -+ -+#ifdef HAVE_CONFIG_H -+# include -+#endif -+ -+#include "fist.h" -+#include "mini_fo.h" -+#include -+ -+/* This definition must only appear after we include */ -+#ifndef MODULE_LICENSE -+# define MODULE_LICENSE(bison) -+#endif /* not MODULE_LICENSE */ -+ -+/* -+ * This is the mini_fo tri interpose function, which extends the -+ * functionality of the regular interpose by interposing a higher -+ * level inode on top of two lower level ones: the base filesystem -+ * inode and the storage filesystem inode. -+ * -+ * sb we pass is mini_fo's super_block -+ */ -+int -+mini_fo_tri_interpose(dentry_t *hidden_dentry, -+ dentry_t *hidden_sto_dentry, -+ dentry_t *dentry, super_block_t *sb, int flag) -+{ -+ inode_t *hidden_inode = NULL; -+ inode_t *hidden_sto_inode = NULL; /* store corresponding storage inode */ -+ int err = 0; -+ inode_t *inode; -+ -+ /* Pointer to hidden_sto_inode if exists, else to hidden_inode. -+ * This is used to copy the attributes of the correct inode. */ -+ inode_t *master_inode; -+ -+ if(hidden_dentry) -+ hidden_inode = hidden_dentry->d_inode; -+ if(hidden_sto_dentry) -+ hidden_sto_inode = hidden_sto_dentry->d_inode; -+ -+ ASSERT(dentry->d_inode == NULL); -+ -+ /* mk: One of the inodes associated with the dentrys is likely to -+ * be NULL, so carefull: -+ */ -+ ASSERT((hidden_inode != NULL) || (hidden_sto_inode != NULL)); -+ -+ if(hidden_sto_inode) -+ master_inode = hidden_sto_inode; -+ else -+ master_inode = hidden_inode; -+ -+ /* -+ * We allocate our new inode below, by calling iget. -+ * iget will call our read_inode which will initialize some -+ * of the new inode's fields -+ */ -+ -+ /* -+ * original: inode = iget(sb, hidden_inode->i_ino); -+ */ -+ inode = iget(sb, iunique(sb, 25)); -+ if (!inode) { -+ err = -EACCES; /* should be impossible??? */ -+ goto out; -+ } -+ -+ /* -+ * interpose the inode if not already interposed -+ * this is possible if the inode is being reused -+ * XXX: what happens if we get_empty_inode() but there's another already? -+ * for now, ASSERT() that this can't happen; fix later. -+ */ -+ if (itohi(inode) != NULL) { -+ printk(KERN_CRIT "mini_fo_tri_interpose: itohi(inode) != NULL.\n"); -+ } -+ if (itohi2(inode) != NULL) { -+ printk(KERN_CRIT "mini_fo_tri_interpose: itohi2(inode) != NULL.\n"); -+ } -+ -+ /* mk: Carefull, igrab can't handle NULL inodes (ok, why should it?), so -+ * we need to check here: -+ */ -+ if(hidden_inode) -+ itohi(inode) = igrab(hidden_inode); -+ else -+ itohi(inode) = NULL; -+ -+ if(hidden_sto_inode) -+ itohi2(inode) = igrab(hidden_sto_inode); -+ else -+ itohi2(inode) = NULL; -+ -+ -+ /* Use different set of inode ops for symlinks & directories*/ -+ if (S_ISLNK(master_inode->i_mode)) -+ inode->i_op = &mini_fo_symlink_iops; -+ else if (S_ISDIR(master_inode->i_mode)) -+ inode->i_op = &mini_fo_dir_iops; -+ -+ /* Use different set of file ops for directories */ -+ if (S_ISDIR(master_inode->i_mode)) -+ inode->i_fop = &mini_fo_dir_fops; -+ -+ /* properly initialize special inodes */ -+ if (S_ISBLK(master_inode->i_mode) || S_ISCHR(master_inode->i_mode) || -+ S_ISFIFO(master_inode->i_mode) || S_ISSOCK(master_inode->i_mode)) { -+ init_special_inode(inode, master_inode->i_mode, master_inode->i_rdev); -+ } -+ -+ /* Fix our inode's address operations to that of the lower inode */ -+ if (inode->i_mapping->a_ops != master_inode->i_mapping->a_ops) { -+ inode->i_mapping->a_ops = master_inode->i_mapping->a_ops; -+ } -+ -+ /* only (our) lookup wants to do a d_add */ -+ if (flag) -+ d_add(dentry, inode); -+ else -+ d_instantiate(dentry, inode); -+ -+ ASSERT(dtopd(dentry) != NULL); -+ -+ /* all well, copy inode attributes */ -+ fist_copy_attr_all(inode, master_inode); -+ -+ out: -+ return err; -+} -+ -+/* parse mount options "base=" and "sto=" */ -+dentry_t * -+mini_fo_parse_options(super_block_t *sb, char *options) -+{ -+ dentry_t *hidden_root = ERR_PTR(-EINVAL); -+ dentry_t *hidden_root2 = ERR_PTR(-EINVAL); -+ struct nameidata nd, nd2; -+ char *name, *tmp, *end; -+ int err = 0; -+ -+ /* We don't want to go off the end of our arguments later on. */ -+ for (end = options; *end; end++); -+ -+ while (options < end) { -+ tmp = options; -+ while (*tmp && *tmp != ',') -+ tmp++; -+ *tmp = '\0'; -+ if (!strncmp("base=", options, 5)) { -+ name = options + 5; -+ printk(KERN_INFO "mini_fo: using base directory: %s\n", name); -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -+ if (path_init(name, LOOKUP_FOLLOW, &nd)) -+ err = path_walk(name, &nd); -+#else -+ err = path_lookup(name, LOOKUP_FOLLOW, &nd); -+#endif -+ if (err) { -+ printk(KERN_CRIT "mini_fo: error accessing hidden directory '%s'\n", name); -+ hidden_root = ERR_PTR(err); -+ goto out; -+ } -+ hidden_root = nd.dentry; -+ stopd(sb)->base_dir_dentry = nd.dentry; -+ stopd(sb)->hidden_mnt = nd.mnt; -+ -+ } else if(!strncmp("sto=", options, 4)) { -+ /* parse the storage dir */ -+ name = options + 4; -+ printk(KERN_INFO "mini_fo: using storage directory: %s\n", name); -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -+ if(path_init(name, LOOKUP_FOLLOW, &nd2)) -+ err = path_walk(name, &nd2); -+#else -+ err = path_lookup(name, LOOKUP_FOLLOW, &nd2); -+#endif -+ if(err) { -+ printk(KERN_CRIT "mini_fo: error accessing hidden storage directory '%s'\n", name); -+ -+ hidden_root2 = ERR_PTR(err); -+ goto out; -+ } -+ hidden_root2 = nd2.dentry; -+ stopd(sb)->storage_dir_dentry = nd2.dentry; -+ stopd(sb)->hidden_mnt2 = nd2.mnt; -+ stohs2(sb) = hidden_root2->d_sb; -+ -+ /* validate storage dir, this is done in -+ * mini_fo_read_super for the base directory. -+ */ -+ if (IS_ERR(hidden_root2)) { -+ printk(KERN_WARNING "mini_fo_parse_options: storage dentry lookup failed (err = %ld)\n", PTR_ERR(hidden_root2)); -+ goto out; -+ } -+ if (!hidden_root2->d_inode) { -+ printk(KERN_WARNING "mini_fo_parse_options: no storage dir to interpose on.\n"); -+ goto out; -+ } -+ stohs2(sb) = hidden_root2->d_sb; -+ } else { -+ printk(KERN_WARNING "mini_fo: unrecognized option '%s'\n", options); -+ hidden_root = ERR_PTR(-EINVAL); -+ goto out; -+ } -+ options = tmp + 1; -+ } -+ -+ out: -+ if(IS_ERR(hidden_root2)) -+ return hidden_root2; -+ return hidden_root; -+} -+ -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+static int -+#else -+super_block_t * -+#endif -+mini_fo_read_super(super_block_t *sb, void *raw_data, int silent) -+{ -+ dentry_t *hidden_root; -+ int err = 0; -+ -+ if (!raw_data) { -+ printk(KERN_WARNING "mini_fo_read_super: missing argument\n"); -+ err = -EINVAL; -+ goto out; -+ } -+ /* -+ * Allocate superblock private data -+ */ -+ __stopd(sb) = kmalloc(sizeof(struct mini_fo_sb_info), GFP_KERNEL); -+ if (!stopd(sb)) { -+ printk(KERN_WARNING "%s: out of memory\n", __FUNCTION__); -+ err = -ENOMEM; -+ goto out; -+ } -+ stohs(sb) = NULL; -+ -+ hidden_root = mini_fo_parse_options(sb, raw_data); -+ if (IS_ERR(hidden_root)) { -+ printk(KERN_WARNING "mini_fo_read_super: lookup_dentry failed (err = %ld)\n", PTR_ERR(hidden_root)); -+ err = PTR_ERR(hidden_root); -+ goto out_free; -+ } -+ if (!hidden_root->d_inode) { -+ printk(KERN_WARNING "mini_fo_read_super: no directory to interpose on\n"); -+ goto out_free; -+ } -+ stohs(sb) = hidden_root->d_sb; -+ -+ /* -+ * Linux 2.4.2-ac3 and beyond has code in -+ * mm/filemap.c:generic_file_write() that requires sb->s_maxbytes -+ * to be populated. If not set, all write()s under that sb will -+ * return 0. -+ * -+ * Linux 2.4.4+ automatically sets s_maxbytes to MAX_NON_LFS; -+ * the filesystem should override it only if it supports LFS. -+ */ -+ /* non-SCA code is good to go with LFS */ -+ sb->s_maxbytes = hidden_root->d_sb->s_maxbytes; -+ -+ sb->s_op = &mini_fo_sops; -+ /* -+ * we can't use d_alloc_root if we want to use -+ * our own interpose function unchanged, -+ * so we simply replicate *most* of the code in d_alloc_root here -+ */ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -+ sb->s_root = d_alloc(NULL, &(const struct qstr) { "/", 1, 0 }); -+#else -+ sb->s_root = d_alloc(NULL, &(const struct qstr){hash: 0, name: "/", len : 1}); -+#endif -+ if (IS_ERR(sb->s_root)) { -+ printk(KERN_WARNING "mini_fo_read_super: d_alloc failed\n"); -+ err = -ENOMEM; -+ goto out_dput; -+ } -+ -+ sb->s_root->d_op = &mini_fo_dops; -+ sb->s_root->d_sb = sb; -+ sb->s_root->d_parent = sb->s_root; -+ -+ /* link the upper and lower dentries */ -+ __dtopd(sb->s_root) = (struct mini_fo_dentry_info *) -+ kmalloc(sizeof(struct mini_fo_dentry_info), GFP_KERNEL); -+ if (!dtopd(sb->s_root)) { -+ err = -ENOMEM; -+ goto out_dput2; -+ } -+ dtopd(sb->s_root)->state = MODIFIED; -+ dtohd(sb->s_root) = hidden_root; -+ -+ /* fanout relevant, interpose on storage root dentry too */ -+ dtohd2(sb->s_root) = stopd(sb)->storage_dir_dentry; -+ -+ /* ...and call tri-interpose to interpose root dir inodes -+ * if (mini_fo_interpose(hidden_root, sb->s_root, sb, 0)) -+ */ -+ if(mini_fo_tri_interpose(hidden_root, dtohd2(sb->s_root), sb->s_root, sb, 0)) -+ goto out_dput2; -+ -+ /* initalize the wol list */ -+ itopd(sb->s_root->d_inode)->deleted_list_size = -1; -+ itopd(sb->s_root->d_inode)->renamed_list_size = -1; -+ meta_build_lists(sb->s_root); -+ -+ goto out; -+ -+ out_dput2: -+ dput(sb->s_root); -+ out_dput: -+ dput(hidden_root); -+ dput(dtohd2(sb->s_root)); /* release the hidden_sto_dentry too */ -+ out_free: -+ kfree(stopd(sb)); -+ __stopd(sb) = NULL; -+ out: -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ return err; -+#else -+ if (err) { -+ return ERR_PTR(err); -+ } else { -+ return sb; -+ } -+#endif -+} -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) -+static int mini_fo_get_sb(struct file_system_type *fs_type, -+ int flags, const char *dev_name, -+ void *raw_data, struct vfsmount *mnt) -+{ -+ return get_sb_nodev(fs_type, flags, raw_data, mini_fo_read_super, mnt); -+} -+#else -+static struct super_block *mini_fo_get_sb(struct file_system_type *fs_type, -+ int flags, const char *dev_name, -+ void *raw_data) -+{ -+ return get_sb_nodev(fs_type, flags, raw_data, mini_fo_read_super); -+} -+#endif -+ -+void mini_fo_kill_block_super(struct super_block *sb) -+{ -+ generic_shutdown_super(sb); -+ /* -+ * XXX: BUG: Halcrow: Things get unstable sometime after this point: -+ * lib/rwsem-spinlock.c:127: spin_is_locked on uninitialized -+ * fs/fs-writeback.c:402: spin_lock(fs/super.c:a0381828) already -+ * locked by fs/fs-writeback.c/402 -+ * -+ * Apparently, someone's not releasing a lock on sb_lock... -+ */ -+} -+ -+static struct file_system_type mini_fo_fs_type = { -+ .owner = THIS_MODULE, -+ .name = "mini_fo", -+ .get_sb = mini_fo_get_sb, -+ .kill_sb = mini_fo_kill_block_super, -+ .fs_flags = 0, -+}; -+ -+ -+#else -+static DECLARE_FSTYPE(mini_fo_fs_type, "mini_fo", mini_fo_read_super, 0); -+#endif -+ -+static int __init init_mini_fo_fs(void) -+{ -+ printk("Registering mini_fo version $Id$\n"); -+ return register_filesystem(&mini_fo_fs_type); -+} -+static void __exit exit_mini_fo_fs(void) -+{ -+ printk("Unregistering mini_fo version $Id$\n"); -+ unregister_filesystem(&mini_fo_fs_type); -+} -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -+EXPORT_NO_SYMBOLS; -+#endif -+ -+MODULE_AUTHOR("Erez Zadok "); -+MODULE_DESCRIPTION("FiST-generated mini_fo filesystem"); -+MODULE_LICENSE("GPL"); -+ -+/* MODULE_PARM(fist_debug_var, "i"); */ -+/* MODULE_PARM_DESC(fist_debug_var, "Debug level"); */ -+ -+module_init(init_mini_fo_fs) -+module_exit(exit_mini_fo_fs) ---- /dev/null -+++ b/fs/mini_fo/Makefile -@@ -0,0 +1,17 @@ -+# -+# Makefile for mini_fo 2.4 and 2.6 Linux kernels -+# -+# Copyright (C) 2004, 2005 Markus Klotzbuecher -+# -+# 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. -+# -+ -+obj-$(CONFIG_MINI_FO) := mini_fo.o -+mini_fo-objs := meta.o dentry.o file.o inode.o main.o super.o state.o aux.o -+ -+# dependencies -+${mini_fo-objs}: mini_fo.h fist.h -+ ---- /dev/null -+++ b/fs/mini_fo/meta.c -@@ -0,0 +1,1000 @@ -+/* -+ * Copyright (C) 2004, 2005 Markus Klotzbuecher -+ * -+ * 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. -+ */ -+ -+#ifdef HAVE_CONFIG_H -+# include -+#endif /* HAVE_CONFIG_H */ -+#include "fist.h" -+#include "mini_fo.h" -+ -+int meta_build_lists(dentry_t *dentry) -+{ -+ struct mini_fo_inode_info *inode_info; -+ -+ dentry_t *meta_dentry = 0; -+ file_t *meta_file = 0; -+ mm_segment_t old_fs; -+ void *buf; -+ -+ int bytes, len; -+ struct vfsmount *meta_mnt; -+ char *entry; -+ -+ inode_info = itopd(dentry->d_inode); -+ if(!(inode_info->deleted_list_size == -1 && -+ inode_info->renamed_list_size == -1)) { -+ printk(KERN_CRIT "mini_fo: meta_build_lists: \ -+ Error, list(s) not virgin.\n"); -+ return -1; -+ } -+ -+ /* init our meta lists */ -+ INIT_LIST_HEAD(&inode_info->deleted_list); -+ inode_info->deleted_list_size = 0; -+ -+ INIT_LIST_HEAD(&inode_info->renamed_list); -+ inode_info->renamed_list_size = 0; -+ -+ /* might there be a META-file? */ -+ if(dtohd2(dentry) && dtohd2(dentry)->d_inode) { -+ meta_dentry = lookup_one_len(META_FILENAME, -+ dtohd2(dentry), -+ strlen(META_FILENAME)); -+ if(!meta_dentry->d_inode) { -+ dput(meta_dentry); -+ goto out_ok; -+ } -+ /* $%& err, is this correct? */ -+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2; -+ mntget(meta_mnt); -+ -+ -+ /* open META-file for reading */ -+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x0); -+ if(!meta_file || IS_ERR(meta_file)) { -+ printk(KERN_CRIT "mini_fo: meta_build_lists: \ -+ ERROR opening META file.\n"); -+ goto out_err; -+ } -+ -+ /* check if fs supports reading */ -+ if(!meta_file->f_op->read) { -+ printk(KERN_CRIT "mini_fo: meta_build_lists: \ -+ ERROR, fs does not support reading.\n"); -+ goto out_err_close; -+ } -+ -+ /* allocate a page for transfering the data */ -+ buf = (void *) __get_free_page(GFP_KERNEL); -+ if(!buf) { -+ printk(KERN_CRIT "mini_fo: meta_build_lists: \ -+ ERROR, out of mem.\n"); -+ goto out_err_close; -+ } -+ meta_file->f_pos = 0; -+ old_fs = get_fs(); -+ set_fs(KERNEL_DS); -+ do { -+ char *c; -+ bytes = meta_file->f_op->read(meta_file, buf, PAGE_SIZE, &meta_file->f_pos); -+ if(bytes == PAGE_SIZE) { -+ /* trim a cut off filename and adjust f_pos to get it next time */ -+ for(c = (char*) buf+PAGE_SIZE; -+ *c != '\n'; -+ c--, bytes--, meta_file->f_pos--); -+ } -+ entry = (char *) buf; -+ while(entry < (char *) buf+bytes) { -+ -+ char *old_path; -+ char *dir_name; -+ int old_len, new_len; -+ -+ /* len without '\n'*/ -+ len = (int) (strchr(entry, '\n') - entry); -+ switch (*entry) { -+ case 'D': -+ /* format: "D filename" */ -+ meta_list_add_d_entry(dentry, -+ entry+2, -+ len-2); -+ break; -+ case 'R': -+ /* format: "R path/xy/dir newDir" */ -+ old_path = entry+2; -+ dir_name = strchr(old_path, ' ') + 1; -+ old_len = dir_name - old_path - 1; -+ new_len = ((int) entry) + len - ((int ) dir_name); -+ meta_list_add_r_entry(dentry, -+ old_path, -+ old_len, -+ dir_name, -+ new_len); -+ break; -+ default: -+ /* unknown entry type detected */ -+ break; -+ } -+ entry += len+1; -+ } -+ -+ } while(meta_file->f_pos < meta_dentry->d_inode->i_size); -+ -+ free_page((unsigned long) buf); -+ set_fs(old_fs); -+ fput(meta_file); -+ } -+ goto out_ok; -+ -+ out_err_close: -+ fput(meta_file); -+ out_err: -+ mntput(meta_mnt); -+ dput(meta_dentry); -+ return -1; -+ out_ok: -+ return 1; /* check this!!! inode_info->wol_size; */ -+} -+ -+/* cleanups up all lists and free's the mem by dentry */ -+int meta_put_lists(dentry_t *dentry) -+{ -+ if(!dentry || !dentry->d_inode) { -+ printk("mini_fo: meta_put_lists: invalid dentry passed.\n"); -+ return -1; -+ } -+ return __meta_put_lists(dentry->d_inode); -+} -+ -+/* cleanups up all lists and free's the mem by inode */ -+int __meta_put_lists(inode_t *inode) -+{ -+ int err = 0; -+ if(!inode || !itopd(inode)) { -+ printk("mini_fo: __meta_put_lists: invalid inode passed.\n"); -+ return -1; -+ } -+ err = __meta_put_d_list(inode); -+ err |= __meta_put_r_list(inode); -+ return err; -+} -+ -+int meta_sync_lists(dentry_t *dentry) -+{ -+ int err = 0; -+ if(!dentry || !dentry->d_inode) { -+ printk("mini_fo: meta_sync_lists: \ -+ invalid dentry passed.\n"); -+ return -1; -+ } -+ err = meta_sync_d_list(dentry, 0); -+ err |= meta_sync_r_list(dentry, 1); -+ return err; -+} -+ -+ -+/* remove all D entries from the renamed list and free the mem */ -+int __meta_put_d_list(inode_t *inode) -+{ -+ struct list_head *tmp; -+ struct deleted_entry *del_entry; -+ struct mini_fo_inode_info *inode_info; -+ -+ if(!inode || !itopd(inode)) { -+ printk(KERN_CRIT "mini_fo: __meta_put_d_list: \ -+ invalid inode passed.\n"); -+ return -1; -+ } -+ inode_info = itopd(inode); -+ -+ /* nuke the DELETED-list */ -+ if(inode_info->deleted_list_size <= 0) -+ return 0; -+ -+ while(!list_empty(&inode_info->deleted_list)) { -+ tmp = inode_info->deleted_list.next; -+ list_del(tmp); -+ del_entry = list_entry(tmp, struct deleted_entry, list); -+ kfree(del_entry->name); -+ kfree(del_entry); -+ } -+ inode_info->deleted_list_size = 0; -+ -+ return 0; -+} -+ -+/* remove all R entries from the renamed list and free the mem */ -+int __meta_put_r_list(inode_t *inode) -+{ -+ struct list_head *tmp; -+ struct renamed_entry *ren_entry; -+ struct mini_fo_inode_info *inode_info; -+ -+ if(!inode || !itopd(inode)) { -+ printk(KERN_CRIT "mini_fo: meta_put_r_list: invalid inode.\n"); -+ return -1; -+ } -+ inode_info = itopd(inode); -+ -+ /* nuke the RENAMED-list */ -+ if(inode_info->renamed_list_size <= 0) -+ return 0; -+ -+ while(!list_empty(&inode_info->renamed_list)) { -+ tmp = inode_info->renamed_list.next; -+ list_del(tmp); -+ ren_entry = list_entry(tmp, struct renamed_entry, list); -+ kfree(ren_entry->new_name); -+ kfree(ren_entry->old_name); -+ kfree(ren_entry); -+ } -+ inode_info->renamed_list_size = 0; -+ -+ return 0; -+} -+ -+int meta_add_d_entry(dentry_t *dentry, const char *name, int len) -+{ -+ int err = 0; -+ err = meta_list_add_d_entry(dentry, name, len); -+ err |= meta_write_d_entry(dentry,name,len); -+ return err; -+} -+ -+/* add a D entry to the deleted list */ -+int meta_list_add_d_entry(dentry_t *dentry, const char *name, int len) -+{ -+ struct deleted_entry *del_entry; -+ struct mini_fo_inode_info *inode_info; -+ -+ if(!dentry || !dentry->d_inode) { -+ printk(KERN_CRIT "mini_fo: meta_list_add_d_entry: \ -+ invalid dentry passed.\n"); -+ return -1; -+ } -+ inode_info = itopd(dentry->d_inode); -+ -+ if(inode_info->deleted_list_size < 0) -+ return -1; -+ -+ del_entry = (struct deleted_entry *) -+ kmalloc(sizeof(struct deleted_entry), GFP_KERNEL); -+ del_entry->name = (char*) kmalloc(len, GFP_KERNEL); -+ if(!del_entry || !del_entry->name) { -+ printk(KERN_CRIT "mini_fo: meta_list_add_d_entry: \ -+ out of mem.\n"); -+ kfree(del_entry->name); -+ kfree(del_entry); -+ return -ENOMEM; -+ } -+ -+ strncpy(del_entry->name, name, len); -+ del_entry->len = len; -+ -+ list_add(&del_entry->list, &inode_info->deleted_list); -+ inode_info->deleted_list_size++; -+ return 0; -+} -+ -+int meta_add_r_entry(dentry_t *dentry, -+ const char *old_name, int old_len, -+ const char *new_name, int new_len) -+{ -+ int err = 0; -+ err = meta_list_add_r_entry(dentry, -+ old_name, old_len, -+ new_name, new_len); -+ err |= meta_write_r_entry(dentry, -+ old_name, old_len, -+ new_name, new_len); -+ return err; -+} -+ -+/* add a R entry to the renamed list */ -+int meta_list_add_r_entry(dentry_t *dentry, -+ const char *old_name, int old_len, -+ const char *new_name, int new_len) -+{ -+ struct renamed_entry *ren_entry; -+ struct mini_fo_inode_info *inode_info; -+ -+ if(!dentry || !dentry->d_inode) { -+ printk(KERN_CRIT "mini_fo: meta_list_add_r_entry: \ -+ invalid dentry passed.\n"); -+ return -1; -+ } -+ inode_info = itopd(dentry->d_inode); -+ -+ if(inode_info->renamed_list_size < 0) -+ return -1; -+ -+ ren_entry = (struct renamed_entry *) -+ kmalloc(sizeof(struct renamed_entry), GFP_KERNEL); -+ ren_entry->old_name = (char*) kmalloc(old_len, GFP_KERNEL); -+ ren_entry->new_name = (char*) kmalloc(new_len, GFP_KERNEL); -+ -+ if(!ren_entry || !ren_entry->old_name || !ren_entry->new_name) { -+ printk(KERN_CRIT "mini_fo: meta_list_add_r_entry: \ -+ out of mem.\n"); -+ kfree(ren_entry->new_name); -+ kfree(ren_entry->old_name); -+ kfree(ren_entry); -+ return -ENOMEM; -+ } -+ -+ strncpy(ren_entry->old_name, old_name, old_len); -+ ren_entry->old_len = old_len; -+ strncpy(ren_entry->new_name, new_name, new_len); -+ ren_entry->new_len = new_len; -+ -+ list_add(&ren_entry->list, &inode_info->renamed_list); -+ inode_info->renamed_list_size++; -+ return 0; -+} -+ -+ -+int meta_remove_r_entry(dentry_t *dentry, const char *name, int len) -+{ -+ int err = 0; -+ if(!dentry || !dentry->d_inode) { -+ printk(KERN_CRIT -+ "mini_fo: meta_remove_r_entry: \ -+ invalid dentry passed.\n"); -+ return -1; -+ } -+ -+ err = meta_list_remove_r_entry(dentry, name, len); -+ err |= meta_sync_lists(dentry); -+ return err; -+} -+ -+int meta_list_remove_r_entry(dentry_t *dentry, const char *name, int len) -+{ -+ if(!dentry || !dentry->d_inode) { -+ printk(KERN_CRIT -+ "mini_fo: meta_list_remove_r_entry: \ -+ invalid dentry passed.\n"); -+ return -1; -+ } -+ return __meta_list_remove_r_entry(dentry->d_inode, name, len); -+} -+ -+int __meta_list_remove_r_entry(inode_t *inode, const char *name, int len) -+{ -+ struct list_head *tmp; -+ struct renamed_entry *ren_entry; -+ struct mini_fo_inode_info *inode_info; -+ -+ if(!inode || !itopd(inode)) -+ printk(KERN_CRIT -+ "mini_fo: __meta_list_remove_r_entry: \ -+ invalid inode passed.\n"); -+ inode_info = itopd(inode); -+ -+ if(inode_info->renamed_list_size < 0) -+ return -1; -+ if(inode_info->renamed_list_size == 0) -+ return 1; -+ -+ list_for_each(tmp, &inode_info->renamed_list) { -+ ren_entry = list_entry(tmp, struct renamed_entry, list); -+ if(ren_entry->new_len != len) -+ continue; -+ -+ if(!strncmp(ren_entry->new_name, name, len)) { -+ list_del(tmp); -+ kfree(ren_entry->new_name); -+ kfree(ren_entry->old_name); -+ kfree(ren_entry); -+ inode_info->renamed_list_size--; -+ return 0; -+ } -+ } -+ return 1; -+} -+ -+ -+/* append a single D entry to the meta file */ -+int meta_write_d_entry(dentry_t *dentry, const char *name, int len) -+{ -+ dentry_t *meta_dentry = 0; -+ file_t *meta_file = 0; -+ mm_segment_t old_fs; -+ -+ int bytes, err; -+ struct vfsmount *meta_mnt = 0; -+ char *buf; -+ -+ err = 0; -+ -+ if(itopd(dentry->d_inode)->deleted_list_size < 0) { -+ err = -1; -+ goto out; -+ } -+ -+ if(dtopd(dentry)->state == UNMODIFIED) { -+ err = build_sto_structure(dentry->d_parent, dentry); -+ if(err) { -+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \ -+ build_sto_structure failed.\n"); -+ goto out; -+ } -+ } -+ meta_dentry = lookup_one_len(META_FILENAME, -+ dtohd2(dentry), strlen (META_FILENAME)); -+ -+ /* We need to create a META-file */ -+ if(!meta_dentry->d_inode) { -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ vfs_create(dtohd2(dentry)->d_inode, -+ meta_dentry, -+ S_IRUSR | S_IWUSR, -+ NULL); -+#else -+ vfs_create(dtohd2(dentry)->d_inode, -+ meta_dentry, -+ S_IRUSR | S_IWUSR); -+#endif -+ } -+ /* open META-file for writing */ -+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1); -+ if(!meta_file || IS_ERR(meta_file)) { -+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \ -+ ERROR opening meta file.\n"); -+ mntput(meta_mnt); /* $%& is this necessary? */ -+ dput(meta_dentry); -+ err = -1; -+ goto out; -+ } -+ -+ /* check if fs supports writing */ -+ if(!meta_file->f_op->write) { -+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \ -+ ERROR, fs does not support writing.\n"); -+ goto out_err_close; -+ } -+ -+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */ -+ old_fs = get_fs(); -+ set_fs(KERNEL_DS); -+ -+ /* size: len for name, 1 for \n and 2 for "D " */ -+ buf = (char *) kmalloc(len+3, GFP_KERNEL); -+ if (!buf) { -+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \ -+ out of mem.\n"); -+ return -ENOMEM; -+ } -+ -+ buf[0] = 'D'; -+ buf[1] = ' '; -+ strncpy(buf+2, name, len); -+ buf[len+2] = '\n'; -+ bytes = meta_file->f_op->write(meta_file, buf, len+3, -+ &meta_file->f_pos); -+ if(bytes != len+3) { -+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \ -+ ERROR writing.\n"); -+ err = -1; -+ } -+ kfree(buf); -+ set_fs(old_fs); -+ -+ out_err_close: -+ fput(meta_file); -+ out: -+ return err; -+} -+ -+/* append a single R entry to the meta file */ -+int meta_write_r_entry(dentry_t *dentry, -+ const char *old_name, int old_len, -+ const char *new_name, int new_len) -+{ -+ dentry_t *meta_dentry = 0; -+ file_t *meta_file = 0; -+ mm_segment_t old_fs; -+ -+ int bytes, err, buf_len; -+ struct vfsmount *meta_mnt = 0; -+ char *buf; -+ -+ -+ err = 0; -+ -+ if(itopd(dentry->d_inode)->renamed_list_size < 0) { -+ err = -1; -+ goto out; -+ } -+ -+ /* build the storage structure? */ -+ if(dtopd(dentry)->state == UNMODIFIED) { -+ err = build_sto_structure(dentry->d_parent, dentry); -+ if(err) { -+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: \ -+ build_sto_structure failed.\n"); -+ goto out; -+ } -+ } -+ meta_dentry = lookup_one_len(META_FILENAME, -+ dtohd2(dentry), -+ strlen (META_FILENAME)); -+ if(!meta_dentry->d_inode) { -+ /* We need to create a META-file */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ vfs_create(dtohd2(dentry)->d_inode, -+ meta_dentry, S_IRUSR | S_IWUSR, NULL); -+#else -+ vfs_create(dtohd2(dentry)->d_inode, -+ meta_dentry, S_IRUSR | S_IWUSR); -+#endif -+ } -+ /* open META-file for writing */ -+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1); -+ if(!meta_file || IS_ERR(meta_file)) { -+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: \ -+ ERROR opening meta file.\n"); -+ mntput(meta_mnt); -+ dput(meta_dentry); -+ err = -1; -+ goto out; -+ } -+ -+ /* check if fs supports writing */ -+ if(!meta_file->f_op->write) { -+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: \ -+ ERROR, fs does not support writing.\n"); -+ goto out_err_close; -+ } -+ -+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */ -+ old_fs = get_fs(); -+ set_fs(KERNEL_DS); -+ -+ /* size: 2 for "R ", old_len+new_len for names, 1 blank+1 \n */ -+ buf_len = old_len + new_len + 4; -+ buf = (char *) kmalloc(buf_len, GFP_KERNEL); -+ if (!buf) { -+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: out of mem.\n"); -+ return -ENOMEM; -+ } -+ -+ buf[0] = 'R'; -+ buf[1] = ' '; -+ strncpy(buf + 2, old_name, old_len); -+ buf[old_len + 2] = ' '; -+ strncpy(buf + old_len + 3, new_name, new_len); -+ buf[buf_len -1] = '\n'; -+ bytes = meta_file->f_op->write(meta_file, buf, buf_len, &meta_file->f_pos); -+ if(bytes != buf_len) { -+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: ERROR writing.\n"); -+ err = -1; -+ } -+ -+ kfree(buf); -+ set_fs(old_fs); -+ -+ out_err_close: -+ fput(meta_file); -+ out: -+ return err; -+} -+ -+/* sync D list to disk, append data if app_flag is 1 */ -+/* check the meta_mnt, which seems not to be used (properly) */ -+ -+int meta_sync_d_list(dentry_t *dentry, int app_flag) -+{ -+ dentry_t *meta_dentry; -+ file_t *meta_file; -+ mm_segment_t old_fs; -+ -+ int bytes, err; -+ struct vfsmount *meta_mnt; -+ char *buf; -+ -+ struct list_head *tmp; -+ struct deleted_entry *del_entry; -+ struct mini_fo_inode_info *inode_info; -+ -+ err = 0; -+ meta_file=0; -+ meta_mnt=0; -+ -+ if(!dentry || !dentry->d_inode) { -+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \ -+ invalid inode passed.\n"); -+ err = -1; -+ goto out; -+ } -+ inode_info = itopd(dentry->d_inode); -+ -+ if(inode_info->deleted_list_size < 0) { -+ err = -1; -+ goto out; -+ } -+ -+ /* ok, there is something to sync */ -+ -+ /* build the storage structure? */ -+ if(!dtohd2(dentry) && !itohi2(dentry->d_inode)) { -+ err = build_sto_structure(dentry->d_parent, dentry); -+ if(err) { -+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \ -+ build_sto_structure failed.\n"); -+ goto out; -+ } -+ } -+ meta_dentry = lookup_one_len(META_FILENAME, -+ dtohd2(dentry), -+ strlen(META_FILENAME)); -+ if(!meta_dentry->d_inode) { -+ /* We need to create a META-file */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ vfs_create(dtohd2(dentry)->d_inode, -+ meta_dentry, S_IRUSR | S_IWUSR, NULL); -+#else -+ vfs_create(dtohd2(dentry)->d_inode, -+ meta_dentry, S_IRUSR | S_IWUSR); -+#endif -+ app_flag = 0; -+ } -+ /* need we truncate the meta file? */ -+ if(!app_flag) { -+ struct iattr newattrs; -+ newattrs.ia_size = 0; -+ newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME; -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&meta_dentry->d_inode->i_mutex); -+#else -+ down(&meta_dentry->d_inode->i_sem); -+#endif -+ err = notify_change(meta_dentry, &newattrs); -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&meta_dentry->d_inode->i_mutex); -+#else -+ up(&meta_dentry->d_inode->i_sem); -+#endif -+ -+ if(err || meta_dentry->d_inode->i_size != 0) { -+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \ -+ ERROR truncating meta file.\n"); -+ goto out_err_close; -+ } -+ } -+ -+ /* open META-file for writing */ -+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1); -+ if(!meta_file || IS_ERR(meta_file)) { -+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \ -+ ERROR opening meta file.\n"); -+ /* we don't mntget so we dont't mntput (for now) -+ * mntput(meta_mnt); -+ */ -+ dput(meta_dentry); -+ err = -1; -+ goto out; -+ } -+ -+ /* check if fs supports writing */ -+ if(!meta_file->f_op->write) { -+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \ -+ ERROR, fs does not support writing.\n"); -+ goto out_err_close; -+ } -+ -+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */ -+ old_fs = get_fs(); -+ set_fs(KERNEL_DS); -+ -+ /* here we go... */ -+ list_for_each(tmp, &inode_info->deleted_list) { -+ del_entry = list_entry(tmp, struct deleted_entry, list); -+ -+ /* size: len for name, 1 for \n and 2 for "D " */ -+ buf = (char *) kmalloc(del_entry->len+3, GFP_KERNEL); -+ if (!buf) { -+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \ -+ out of mem.\n"); -+ return -ENOMEM; -+ } -+ -+ buf[0] = 'D'; -+ buf[1] = ' '; -+ strncpy(buf+2, del_entry->name, del_entry->len); -+ buf[del_entry->len+2] = '\n'; -+ bytes = meta_file->f_op->write(meta_file, buf, -+ del_entry->len+3, -+ &meta_file->f_pos); -+ if(bytes != del_entry->len+3) { -+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \ -+ ERROR writing.\n"); -+ err |= -1; -+ } -+ kfree(buf); -+ } -+ set_fs(old_fs); -+ -+ out_err_close: -+ fput(meta_file); -+ out: -+ return err; -+ -+} -+ -+int meta_sync_r_list(dentry_t *dentry, int app_flag) -+{ -+ dentry_t *meta_dentry; -+ file_t *meta_file; -+ mm_segment_t old_fs; -+ -+ int bytes, err, buf_len; -+ struct vfsmount *meta_mnt; -+ char *buf; -+ -+ struct list_head *tmp; -+ struct renamed_entry *ren_entry; -+ struct mini_fo_inode_info *inode_info; -+ -+ err = 0; -+ meta_file=0; -+ meta_mnt=0; -+ -+ if(!dentry || !dentry->d_inode) { -+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \ -+ invalid dentry passed.\n"); -+ err = -1; -+ goto out; -+ } -+ inode_info = itopd(dentry->d_inode); -+ -+ if(inode_info->deleted_list_size < 0) { -+ err = -1; -+ goto out; -+ } -+ -+ /* ok, there is something to sync */ -+ -+ /* build the storage structure? */ -+ if(!dtohd2(dentry) && !itohi2(dentry->d_inode)) { -+ err = build_sto_structure(dentry->d_parent, dentry); -+ if(err) { -+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \ -+ build_sto_structure failed.\n"); -+ goto out; -+ } -+ } -+ meta_dentry = lookup_one_len(META_FILENAME, -+ dtohd2(dentry), -+ strlen(META_FILENAME)); -+ if(!meta_dentry->d_inode) { -+ /* We need to create a META-file */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ vfs_create(dtohd2(dentry)->d_inode, -+ meta_dentry, S_IRUSR | S_IWUSR, NULL); -+#else -+ vfs_create(dtohd2(dentry)->d_inode, -+ meta_dentry, S_IRUSR | S_IWUSR); -+#endif -+ app_flag = 0; -+ } -+ /* need we truncate the meta file? */ -+ if(!app_flag) { -+ struct iattr newattrs; -+ newattrs.ia_size = 0; -+ newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME; -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&meta_dentry->d_inode->i_mutex); -+#else -+ down(&meta_dentry->d_inode->i_sem); -+#endif -+ err = notify_change(meta_dentry, &newattrs); -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&meta_dentry->d_inode->i_mutex); -+#else -+ up(&meta_dentry->d_inode->i_sem); -+#endif -+ if(err || meta_dentry->d_inode->i_size != 0) { -+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \ -+ ERROR truncating meta file.\n"); -+ goto out_err_close; -+ } -+ } -+ -+ /* open META-file for writing */ -+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1); -+ if(!meta_file || IS_ERR(meta_file)) { -+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \ -+ ERROR opening meta file.\n"); -+ /* we don't mntget so we dont't mntput (for now) -+ * mntput(meta_mnt); -+ */ -+ dput(meta_dentry); -+ err = -1; -+ goto out; -+ } -+ -+ /* check if fs supports writing */ -+ if(!meta_file->f_op->write) { -+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \ -+ ERROR, fs does not support writing.\n"); -+ goto out_err_close; -+ } -+ -+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */ -+ old_fs = get_fs(); -+ set_fs(KERNEL_DS); -+ -+ /* here we go... */ -+ list_for_each(tmp, &inode_info->renamed_list) { -+ ren_entry = list_entry(tmp, struct renamed_entry, list); -+ /* size: -+ * 2 for "R ", old_len+new_len for names, 1 blank+1 \n */ -+ buf_len = ren_entry->old_len + ren_entry->new_len + 4; -+ buf = (char *) kmalloc(buf_len, GFP_KERNEL); -+ if (!buf) { -+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \ -+ out of mem.\n"); -+ return -ENOMEM; -+ } -+ buf[0] = 'R'; -+ buf[1] = ' '; -+ strncpy(buf + 2, ren_entry->old_name, ren_entry->old_len); -+ buf[ren_entry->old_len + 2] = ' '; -+ strncpy(buf + ren_entry->old_len + 3, -+ ren_entry->new_name, ren_entry->new_len); -+ buf[buf_len - 1] = '\n'; -+ bytes = meta_file->f_op->write(meta_file, buf, -+ buf_len, &meta_file->f_pos); -+ if(bytes != buf_len) { -+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \ -+ ERROR writing.\n"); -+ err |= -1; -+ } -+ kfree(buf); -+ } -+ set_fs(old_fs); -+ -+ out_err_close: -+ fput(meta_file); -+ out: -+ return err; -+} -+ -+int meta_check_d_entry(dentry_t *dentry, const char *name, int len) -+{ -+ if(!dentry || !dentry->d_inode) -+ printk(KERN_CRIT "mini_fo: meta_check_d_dentry: \ -+ invalid dentry passed.\n"); -+ return __meta_check_d_entry(dentry->d_inode, name, len); -+} -+ -+int __meta_check_d_entry(inode_t *inode, const char *name, int len) -+{ -+ struct list_head *tmp; -+ struct deleted_entry *del_entry; -+ struct mini_fo_inode_info *inode_info; -+ -+ if(!inode || !itopd(inode)) -+ printk(KERN_CRIT "mini_fo: __meta_check_d_dentry: \ -+ invalid inode passed.\n"); -+ -+ inode_info = itopd(inode); -+ -+ if(inode_info->deleted_list_size <= 0) -+ return 0; -+ -+ list_for_each(tmp, &inode_info->deleted_list) { -+ del_entry = list_entry(tmp, struct deleted_entry, list); -+ if(del_entry->len != len) -+ continue; -+ -+ if(!strncmp(del_entry->name, name, len)) -+ return 1; -+ } -+ return 0; -+} -+ -+/* -+ * check if file has been renamed and return path to orig. base dir. -+ * Implements no error return values so far, what of course sucks. -+ * String is null terminated.' -+ */ -+char* meta_check_r_entry(dentry_t *dentry, const char *name, int len) -+{ -+ if(!dentry || !dentry->d_inode) { -+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry: \ -+ invalid dentry passed.\n"); -+ return NULL; -+ } -+ return __meta_check_r_entry(dentry->d_inode, name, len); -+} -+ -+char* __meta_check_r_entry(inode_t *inode, const char *name, int len) -+{ -+ struct list_head *tmp; -+ struct renamed_entry *ren_entry; -+ struct mini_fo_inode_info *inode_info; -+ char *old_path; -+ -+ if(!inode || !itopd(inode)) { -+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry: \ -+ invalid inode passed.\n"); -+ return NULL; -+ } -+ inode_info = itopd(inode); -+ -+ if(inode_info->renamed_list_size <= 0) -+ return NULL; -+ -+ list_for_each(tmp, &inode_info->renamed_list) { -+ ren_entry = list_entry(tmp, struct renamed_entry, list); -+ if(ren_entry->new_len != len) -+ continue; -+ -+ if(!strncmp(ren_entry->new_name, name, len)) { -+ old_path = (char *) -+ kmalloc(ren_entry->old_len+1, GFP_KERNEL); -+ strncpy(old_path, -+ ren_entry->old_name, -+ ren_entry->old_len); -+ old_path[ren_entry->old_len]='\0'; -+ return old_path; -+ } -+ } -+ return NULL; -+} -+ -+/* -+ * This version only checks if entry exists and return: -+ * 1 if exists, -+ * 0 if not, -+ * -1 if error. -+ */ -+int meta_is_r_entry(dentry_t *dentry, const char *name, int len) -+{ -+ if(!dentry || !dentry->d_inode) { -+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry [2]: \ -+ invalid dentry passed.\n"); -+ return -1; -+ } -+ return __meta_is_r_entry(dentry->d_inode, name, len); -+} -+ -+int __meta_is_r_entry(inode_t *inode, const char *name, int len) -+{ -+ struct list_head *tmp; -+ struct renamed_entry *ren_entry; -+ struct mini_fo_inode_info *inode_info; -+ -+ if(!inode || !itopd(inode)) { -+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry [2]: \ -+ invalid inode passed.\n"); -+ return -1; -+ } -+ inode_info = itopd(inode); -+ -+ if(inode_info->renamed_list_size <= 0) -+ return -1; -+ -+ list_for_each(tmp, &inode_info->renamed_list) { -+ ren_entry = list_entry(tmp, struct renamed_entry, list); -+ if(ren_entry->new_len != len) -+ continue; -+ -+ if(!strncmp(ren_entry->new_name, name, len)) -+ return 1; -+ } -+ return 0; -+} -+ ---- /dev/null -+++ b/fs/mini_fo/mini_fo.h -@@ -0,0 +1,510 @@ -+/* -+ * Copyright (c) 1997-2003 Erez Zadok -+ * Copyright (c) 2001-2003 Stony Brook University -+ * -+ * For specific licensing information, see the COPYING file distributed with -+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING. -+ * -+ * This Copyright notice must be kept intact and distributed with all -+ * fistgen sources INCLUDING sources generated by fistgen. -+ */ -+/* -+ * Copyright (C) 2004, 2005 Markus Klotzbuecher -+ * -+ * 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. -+ */ -+ -+/* -+ * $Id$ -+ */ -+ -+#ifndef __MINI_FO_H_ -+#define __MINI_FO_H_ -+ -+#ifdef __KERNEL__ -+ -+/* META stuff */ -+#define META_FILENAME "META_dAfFgHE39ktF3HD2sr" -+ -+/* use xattrs? */ -+#define XATTR -+ -+/* File attributes that when changed, result in a file beeing copied to storage */ -+#define COPY_FLAGS ATTR_MODE | ATTR_UID | ATTR_GID | ATTR_SIZE -+ -+/* -+ * mini_fo filestates -+ */ -+#define MODIFIED 1 -+#define UNMODIFIED 2 -+#define CREATED 3 -+#define DEL_REWRITTEN 4 -+#define DELETED 5 -+#define NON_EXISTANT 6 -+ -+/* fist file systems superblock magic */ -+# define MINI_FO_SUPER_MAGIC 0xf15f -+ -+/* -+ * STRUCTURES: -+ */ -+ -+/* mini_fo inode data in memory */ -+struct mini_fo_inode_info { -+ inode_t *wii_inode; -+ inode_t *wii_inode2; /* pointer to storage inode */ -+ -+ /* META-data lists */ -+ /* deleted list, ex wol */ -+ struct list_head deleted_list; -+ int deleted_list_size; -+ -+ /* renamed list */ -+ struct list_head renamed_list; -+ int renamed_list_size; -+ -+ /* add other lists here ... */ -+}; -+ -+/* mini_fo dentry data in memory */ -+struct mini_fo_dentry_info { -+ dentry_t *wdi_dentry; -+ dentry_t *wdi_dentry2; /* pointer to storage dentry */ -+ unsigned int state; /* state of the mini_fo dentry */ -+}; -+ -+ -+/* mini_fo super-block data in memory */ -+struct mini_fo_sb_info { -+ super_block_t *wsi_sb, *wsi_sb2; /* mk: might point to the same sb */ -+ struct vfsmount *hidden_mnt, *hidden_mnt2; -+ dentry_t *base_dir_dentry; -+ dentry_t *storage_dir_dentry; -+ ; -+}; -+ -+/* readdir_data, readdir helper struct */ -+struct readdir_data { -+ struct list_head ndl_list; /* linked list head ptr */ -+ int ndl_size; /* list size */ -+ int sto_done; /* flag to show that the storage dir entries have -+ * all been read an now follow base entries */ -+}; -+ -+/* file private data. */ -+struct mini_fo_file_info { -+ struct file *wfi_file; -+ struct file *wfi_file2; /* pointer to storage file */ -+ struct readdir_data rd; -+}; -+ -+/* struct ndl_entry */ -+struct ndl_entry { -+ struct list_head list; -+ char *name; -+ int len; -+}; -+ -+/******************************** -+ * META-data structures -+ ********************************/ -+ -+/* deleted entry */ -+struct deleted_entry { -+ struct list_head list; -+ char *name; -+ int len; -+}; -+ -+/* renamed entry */ -+struct renamed_entry { -+ struct list_head list; -+ char *old_name; /* old directory with full path */ -+ int old_len; /* length of above string */ -+ char *new_name; /* new directory name */ -+ int new_len; /* length of above string */ -+}; -+ -+/* attr_change entry */ -+struct attr_change_entry { -+ struct list_head list; -+ char *name; -+ int len; -+}; -+ -+/* link entry */ -+struct link_entry { -+ struct list_head list; -+ int links_moved; -+ int inum_base; -+ int inum_sto; -+ char *weird_name; -+ int weird_name_len; -+}; -+ -+ -+/* Some other stuff required for mini_fo_filldir64, copied from -+ * fs/readdir.c -+ */ -+ -+#define ROUND_UP64(x) (((x)+sizeof(u64)-1) & ~(sizeof(u64)-1)) -+#define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de))) -+ -+ -+struct linux_dirent64 { -+ u64 d_ino; -+ s64 d_off; -+ unsigned short d_reclen; -+ unsigned char d_type; -+ char d_name[0]; -+}; -+ -+ -+struct getdents_callback64 { -+ struct linux_dirent64 * current_dir; -+ struct linux_dirent64 * previous; -+ int count; -+ int error; -+}; -+ -+struct linux_dirent { -+ unsigned long d_ino; -+ unsigned long d_off; -+ unsigned short d_reclen; -+ char d_name[1]; -+}; -+ -+struct getdents_callback { -+ struct linux_dirent * current_dir; -+ struct linux_dirent * previous; -+ int count; -+ int error; -+}; -+ -+ -+/* -+ * MACROS: -+ */ -+ -+/* file TO private_data */ -+# define ftopd(file) ((struct mini_fo_file_info *)((file)->private_data)) -+# define __ftopd(file) ((file)->private_data) -+/* file TO hidden_file */ -+# define ftohf(file) ((ftopd(file))->wfi_file) -+# define ftohf2(file) ((ftopd(file))->wfi_file2) -+ -+/* inode TO private_data */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) -+# define itopd(ino) ((struct mini_fo_inode_info *)(ino)->i_private) -+# define __itopd(ino) ((ino)->i_private) -+#else -+# define itopd(ino) ((struct mini_fo_inode_info *)(ino)->u.generic_ip) -+# define __itopd(ino) ((ino)->u.generic_ip) -+#endif -+/* inode TO hidden_inode */ -+# define itohi(ino) (itopd(ino)->wii_inode) -+# define itohi2(ino) (itopd(ino)->wii_inode2) -+ -+/* superblock TO private_data */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+# define stopd(super) ((struct mini_fo_sb_info *)(super)->s_fs_info) -+# define __stopd(super) ((super)->s_fs_info) -+#else -+# define stopd(super) ((struct mini_fo_sb_info *)(super)->u.generic_sbp) -+# define __stopd(super) ((super)->u.generic_sbp) -+#endif -+ -+/* unused? # define vfs2priv stopd */ -+/* superblock TO hidden_superblock */ -+ -+# define stohs(super) (stopd(super)->wsi_sb) -+# define stohs2(super) (stopd(super)->wsi_sb2) -+ -+/* dentry TO private_data */ -+# define dtopd(dentry) ((struct mini_fo_dentry_info *)(dentry)->d_fsdata) -+# define __dtopd(dentry) ((dentry)->d_fsdata) -+/* dentry TO hidden_dentry */ -+# define dtohd(dent) (dtopd(dent)->wdi_dentry) -+# define dtohd2(dent) (dtopd(dent)->wdi_dentry2) -+ -+/* dentry to state */ -+# define dtost(dent) (dtopd(dent)->state) -+# define sbt(sb) ((sb)->s_type->name) -+ -+#define IS_WRITE_FLAG(flag) (flag & (O_RDWR | O_WRONLY | O_APPEND)) -+#define IS_COPY_FLAG(flag) (flag & (COPY_FLAGS)) -+ -+/* macros to simplify non-SCA code */ -+# define MALLOC_PAGE_POINTERS(hidden_pages, num_hidden_pages) -+# define MALLOC_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages) -+# define FREE_PAGE_POINTERS(hidden_pages, num) -+# define FREE_PAGEDATA_POINTERS(hidden_pages_data, num) -+# define FOR_EACH_PAGE -+# define CURRENT_HIDDEN_PAGE hidden_page -+# define CURRENT_HIDDEN_PAGEDATA hidden_page_data -+# define CURRENT_HIDDEN_PAGEINDEX page->index -+ -+/* -+ * EXTERNALS: -+ */ -+extern struct file_operations mini_fo_main_fops; -+extern struct file_operations mini_fo_dir_fops; -+extern struct inode_operations mini_fo_main_iops; -+extern struct inode_operations mini_fo_dir_iops; -+extern struct inode_operations mini_fo_symlink_iops; -+extern struct super_operations mini_fo_sops; -+extern struct dentry_operations mini_fo_dops; -+extern struct vm_operations_struct mini_fo_shared_vmops; -+extern struct vm_operations_struct mini_fo_private_vmops; -+extern struct address_space_operations mini_fo_aops; -+ -+#if 0 /* unused by mini_fo */ -+extern int mini_fo_interpose(dentry_t *hidden_dentry, dentry_t *this_dentry, super_block_t *sb, int flag); -+#if defined(FIST_FILTER_DATA) || defined(FIST_FILTER_SCA) -+extern page_t *mini_fo_get1page(file_t *file, int index); -+extern int mini_fo_fill_zeros(file_t *file, page_t *page, unsigned from); -+# endif /* FIST_FILTER_DATA || FIST_FILTER_SCA */ -+ -+ -+# define mini_fo_hidden_dentry(d) __mini_fo_hidden_dentry(__FILE__,__FUNCTION__,__LINE__,(d)) -+# define mini_fo_hidden_sto_dentry(d) __mini_fo_hidden_sto_dentry(__FILE__,__FUNCTION__,__LINE__,(d)) -+ -+extern dentry_t *__mini_fo_hidden_dentry(char *file, char *func, int line, dentry_t *this_dentry); -+extern dentry_t *__mini_fo_hidden_sto_dentry(char *file, char *func, int line, dentry_t *this_dentry); -+ -+extern int mini_fo_read_file(const char *filename, void *buf, int len); -+extern int mini_fo_write_file(const char *filename, void *buf, int len); -+extern dentry_t *fist_lookup(dentry_t *dir, const char *name, vnode_t **out, uid_t uid, gid_t gid); -+#endif /* unused by mini_fo */ -+ -+/* state transition functions */ -+extern int nondir_unmod_to_mod(dentry_t *dentry, int cp_flag); -+extern int nondir_del_rew_to_del(dentry_t *dentry); -+extern int nondir_creat_to_del(dentry_t *dentry); -+extern int nondir_mod_to_del(dentry_t *dentry); -+extern int nondir_unmod_to_del(dentry_t *dentry); -+ -+extern int dir_unmod_to_mod(dentry_t *dentry); -+ -+/* rename specials */ -+extern int rename_directory(inode_t *old_dir, dentry_t *old_dentry, inode_t *new_dir, dentry_t *new_dentry); -+extern int rename_nondir(inode_t *old_dir, dentry_t *old_dentry, inode_t *new_dir, dentry_t *new_dentry); -+ -+/* misc stuff */ -+extern int mini_fo_tri_interpose(dentry_t *hidden_dentry, -+ dentry_t *hidden_sto_dentry, -+ dentry_t *dentry, -+ super_block_t *sb, int flag); -+ -+extern int mini_fo_cp_cont(dentry_t *tgt_dentry, struct vfsmount *tgt_mnt, -+ dentry_t *src_dentry, struct vfsmount *src_mnt); -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+extern int mini_fo_create(inode_t *dir, dentry_t *dentry, int mode, struct nameidata *nd); -+ -+extern int create_sto_nod(dentry_t *dentry, int mode, dev_t dev); -+extern int create_sto_reg_file(dentry_t *dentry, int mode, struct nameidata *nd); -+#else -+extern int mini_fo_create(inode_t *dir, dentry_t *dentry, int mode); -+ -+extern int create_sto_nod(dentry_t *dentry, int mode, int dev); -+extern int create_sto_reg_file(dentry_t *dentry, int mode); -+#endif -+ -+extern int create_sto_dir(dentry_t *dentry, int mode); -+ -+extern int exists_in_storage(dentry_t *dentry); -+extern int is_mini_fo_existant(dentry_t *dentry); -+extern int get_neg_sto_dentry(dentry_t *dentry); -+extern int build_sto_structure(dentry_t *dir, dentry_t *dentry); -+extern int get_mini_fo_bpath(dentry_t *dentry, char **bpath, int *bpath_len); -+extern dentry_t *bpath_walk(super_block_t *sb, char *bpath); -+extern int bpath_put(dentry_t *dentry); -+ -+/* check_mini_fo types functions */ -+extern int check_mini_fo_dentry(dentry_t *dentry); -+extern int check_mini_fo_file(file_t *file); -+extern int check_mini_fo_inode(inode_t *inode); -+ -+/* General meta functions, can be called from outside of meta.c */ -+extern int meta_build_lists(dentry_t *dentry); -+extern int meta_put_lists(dentry_t *dentry); -+extern int __meta_put_lists(inode_t *inode); -+ -+extern int meta_add_d_entry(dentry_t *dentry, const char *name, int len); -+extern int meta_add_r_entry(dentry_t *dentry, -+ const char *old_name, int old_len, -+ const char *new_name, int new_len); -+ -+extern int meta_remove_r_entry(dentry_t *dentry, const char *name, int len); -+ -+extern int meta_check_d_entry(dentry_t *dentry, const char *name, int len); -+extern int __meta_check_d_entry(inode_t *inode, const char *name, int len); -+ -+extern char* meta_check_r_entry(dentry_t *dentry, const char *name, int len); -+extern char* __meta_check_r_entry(inode_t *inode, const char *name, int len); -+extern int meta_is_r_entry(dentry_t *dentry, const char *name, int len); -+extern int __meta_is_r_entry(inode_t *inode, const char *name, int len); -+ -+/* Specific meta functions, should be called only inside meta.c */ -+extern int __meta_put_d_list(inode_t *inode); -+extern int __meta_put_r_list(inode_t *inode); -+ -+extern int meta_list_add_d_entry(dentry_t *dentry, -+ const char *name, int len); -+extern int meta_list_add_r_entry(dentry_t *dentry, -+ const char *old_name, int old_len, -+ const char *new_name, int new_len); -+ -+extern int meta_list_remove_r_entry(dentry_t *dentry, -+ const char *name, int len); -+ -+extern int __meta_list_remove_r_entry(inode_t *inode, -+ const char *name, int len); -+ -+extern int meta_write_d_entry(dentry_t *dentry, const char *name, int len); -+extern int meta_write_r_entry(dentry_t *dentry, -+ const char *old_name, int old_len, -+ const char *new_name, int new_len); -+ -+extern int meta_sync_lists(dentry_t *dentry); -+extern int meta_sync_d_list(dentry_t *dentry, int app_flag); -+extern int meta_sync_r_list(dentry_t *dentry, int app_flag); -+ -+/* ndl stuff */ -+extern int ndl_add_entry(struct readdir_data *rd, const char *name, int len); -+extern void ndl_put_list(struct readdir_data *rd); -+extern int ndl_check_entry(struct readdir_data *rd, -+ const char *name, int len); -+ -+ -+# define copy_inode_size(dst, src) \ -+ dst->i_size = src->i_size; \ -+ dst->i_blocks = src->i_blocks; -+ -+static inline void -+fist_copy_attr_atime(inode_t *dest, const inode_t *src) -+{ -+ ASSERT(dest != NULL); -+ ASSERT(src != NULL); -+ dest->i_atime = src->i_atime; -+} -+static inline void -+fist_copy_attr_times(inode_t *dest, const inode_t *src) -+{ -+ ASSERT(dest != NULL); -+ ASSERT(src != NULL); -+ dest->i_atime = src->i_atime; -+ dest->i_mtime = src->i_mtime; -+ dest->i_ctime = src->i_ctime; -+} -+static inline void -+fist_copy_attr_timesizes(inode_t *dest, const inode_t *src) -+{ -+ ASSERT(dest != NULL); -+ ASSERT(src != NULL); -+ dest->i_atime = src->i_atime; -+ dest->i_mtime = src->i_mtime; -+ dest->i_ctime = src->i_ctime; -+ copy_inode_size(dest, src); -+} -+static inline void -+fist_copy_attr_all(inode_t *dest, const inode_t *src) -+{ -+ ASSERT(dest != NULL); -+ ASSERT(src != NULL); -+ dest->i_mode = src->i_mode; -+ dest->i_nlink = src->i_nlink; -+ dest->i_uid = src->i_uid; -+ dest->i_gid = src->i_gid; -+ dest->i_rdev = src->i_rdev; -+ dest->i_atime = src->i_atime; -+ dest->i_mtime = src->i_mtime; -+ dest->i_ctime = src->i_ctime; -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) -+ dest->i_blksize = src->i_blksize; -+#endif -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,12) -+ dest->i_blkbits = src->i_blkbits; -+# endif /* linux 2.4.12 and newer */ -+ copy_inode_size(dest, src); -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -+ dest->i_attr_flags = src->i_attr_flags; -+#else -+ dest->i_flags = src->i_flags; -+#endif -+} -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+/* copied from linux/fs.h */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+static inline void double_lock(struct dentry *d1, struct dentry *d2) -+{ -+ struct mutex *m1 = &d1->d_inode->i_mutex; -+ struct mutex *m2 = &d2->d_inode->i_mutex; -+ if (m1 != m2) { -+ if ((unsigned long) m1 < (unsigned long) m2) { -+ struct mutex *tmp = m2; -+ m2 = m1; m1 = tmp; -+ } -+ mutex_lock(m1); -+ } -+ mutex_lock(m2); -+} -+ -+static inline void double_unlock(struct dentry *d1, struct dentry *d2) -+{ -+ struct mutex *m1 = &d1->d_inode->i_mutex; -+ struct mutex *m2 = &d2->d_inode->i_mutex; -+ mutex_unlock(m1); -+ if (m1 != m2) -+ mutex_unlock(m2); -+ dput(d1); -+ dput(d2); -+} -+ -+#else -+static inline void double_down(struct semaphore *s1, struct semaphore *s2) -+{ -+ if (s1 != s2) { -+ if ((unsigned long) s1 < (unsigned long) s2) { -+ struct semaphore *tmp = s2; -+ s2 = s1; s1 = tmp; -+ } -+ down(s1); -+ } -+ down(s2); -+} -+ -+static inline void double_up(struct semaphore *s1, struct semaphore *s2) -+{ -+ up(s1); -+ if (s1 != s2) -+ up(s2); -+} -+ -+static inline void double_lock(struct dentry *d1, struct dentry *d2) -+{ -+ double_down(&d1->d_inode->i_sem, &d2->d_inode->i_sem); -+} -+ -+static inline void double_unlock(struct dentry *d1, struct dentry *d2) -+{ -+ double_up(&d1->d_inode->i_sem,&d2->d_inode->i_sem); -+ dput(d1); -+ dput(d2); -+} -+#endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) */ -+#endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) */ -+#endif /* __KERNEL__ */ -+ -+/* -+ * Definitions for user and kernel code -+ */ -+ -+/* ioctls */ -+ -+#endif /* not __MINI_FO_H_ */ ---- /dev/null -+++ b/fs/mini_fo/mini_fo-merge -@@ -0,0 +1,180 @@ -+#!/bin/bash -+# -+# Copyright (C) 2005 Markus Klotzbuecher -+# 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. -+# -+ -+BASE= -+STO= -+HELP= -+DRYRUN= -+VERBOSE= -+TMP="/tmp/" -+META_NAME="META_dAfFgHE39ktF3HD2sr" -+SKIP_DEL_LIST="skip-delete-list.mini_fo-merge" -+ -+COMMAND= -+exec_command() -+{ -+ if [ x$DRYRUN == "xset" ]; then -+ echo " would run: $COMMAND" -+ elif ! [ x$DRYRUN == "xset" ]; then -+ if [ x$VERBOSE == "xset" ]; then -+ echo " running: $COMMAND" -+ fi -+ eval $COMMAND -+ fi -+} -+ -+usage() -+{ -+cat < -s -+Version 0.1 -+ -+This script merges the contents of a mini_fo storage file system back -+to the base file system. -+ -+!!! Warning: This will modify the base filesystem and can destroy data -+ if used wrongly. -+ -+Options: -+ -b -+ the directory of the base file system. -+ -+ -s -+ the directory of the storage file system. -+ -+ -d dry run, will not change anything and print the commands that -+ would be executed. -+ -+ -t tmp dir for storing temporary file. default: $TMP -+ -+ -v show what operations are performed. -+ -+ -h displays this message. -+ -+EOF -+} -+ -+# parse parameters -+while getopts hdvt:b:s: OPTS -+ do -+ case $OPTS in -+ h) HELP="set";; -+ d) DRYRUN="set";; -+ v) VERBOSE="set";; -+ b) BASE="$OPTARG";; -+ s) STO="$OPTARG";; -+ t) TMP="$OPTARG";; -+ ?) usage -+ exit 1;; -+ esac -+done -+ -+if [ "x$HELP" == "xset" ]; then -+ usage -+ exit -1 -+fi -+ -+if ! [ -d "$BASE" ] || ! [ -d "$STO" ]; then -+ echo -e "$0:\n Error, -s and/or -b argument missing. type $0 -h for help." -+ exit -1; -+fi -+ -+# get full paths -+pushd $STO; STO=`pwd`; popd -+pushd $BASE; BASE=`pwd`; popd -+TMP=${TMP%/} -+ -+ -+cat< /dev/null -+find . -name $META_NAME -type f -print0 | xargs -0 -e grep -e '^R ' | tr -s ':R' ' ' | while read ENTRY; do -+ echo "entry: $ENTRY" -+ META_FILE=`echo $ENTRY | cut -d ' ' -f 1` -+ OLD_B_DIR=`echo $ENTRY | cut -d ' ' -f 2 | sed -e 's/\///'` -+ NEW_NAME=`echo $ENTRY | cut -d ' ' -f 3` -+ NEW_B_DIR=`echo $META_FILE | sed -e "s/$META_NAME/$NEW_NAME/" | sed -e 's/^\.\///'` -+ echo "META_FILE: $META_FILE" -+ echo "OLD_B_DIR: $OLD_B_DIR" -+ echo "NEW_NAME: $NEW_NAME" -+ echo "NEW_B_DIR: $NEW_B_DIR" -+ -+ pushd $BASE &> /dev/null -+ # remove an existing dir in storage -+ COMMAND="rm -rf $NEW_B_DIR"; exec_command -+ COMMAND="cp -R $OLD_B_DIR $NEW_B_DIR"; exec_command -+ echo "" -+ popd &> /dev/null -+ -+ # remember this dir to exclude it from deleting later -+ echo $NEW_B_DIR >> $TMP/$SKIP_DEL_LIST -+done -+ -+# delete all whiteouted files from base -+echo -e "\nDeleting whiteout'ed files from base file system..." -+find . -name $META_NAME -type f -print0 | xargs -0 -e grep -e '^D ' | sed -e 's/:D//' | while read ENTRY; do -+ META_FILE=`echo $ENTRY | cut -d ' ' -f 1` -+ DEL_NAME=`echo $ENTRY | cut -d ' ' -f 2` -+ DEL_FILE=`echo $META_FILE | sed -e "s/$META_NAME/$DEL_NAME/" | sed -e 's/^\.\///'` -+ grep -x $DEL_FILE $TMP/$SKIP_DEL_LIST &> /dev/null -+ if [ $? -ne 0 ]; then -+ pushd $BASE &> /dev/null -+ COMMAND="rm -rf $DEL_FILE"; exec_command -+ popd &> /dev/null -+ else -+ echo " excluding: $DEL_FILE as in skip-del-list." -+ fi -+done -+ -+# create all dirs and update permissions -+echo -e "\nSetting up directory structures in base file system..." -+find . -type d | sed -e 's/^\.\///' | while read DIR; do -+ PERMS=`stat -c %a $DIR` -+ DIR_UID=`stat -c %u $DIR` -+ DIR_GID=`stat -c %g $DIR` -+ pushd $BASE &> /dev/null -+ if ! [ -d $DIR ]; then -+ COMMAND="mkdir -p $DIR"; exec_command -+ fi -+ COMMAND="chmod $PERMS $DIR"; exec_command -+ COMMAND="chown $DIR_UID:$DIR_GID $DIR"; exec_command -+ popd &> /dev/null -+done -+ -+# merge all non-directory files -+echo -e "\nMerging all non-directory files...." -+for i in b c p f l s; do -+ find . -type $i | sed -e 's/^\.\///' | grep -v "$META_NAME" | while read FILE; do -+ pushd $BASE #&> /dev/null -+ COMMAND="cp -df $STO/$FILE $BASE/$FILE"; exec_command -+ popd &> /dev/null -+ done -+done -+popd &> /dev/null -+ -+#rm $TMP/$SKIP_DEL_LIST -+ -+echo "Done!" ---- /dev/null -+++ b/fs/mini_fo/mini_fo-overlay -@@ -0,0 +1,130 @@ -+#!/bin/bash -+# -+# Copyright (C) 2005 Markus Klotzbuecher -+# 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. -+# -+ -+HELP= -+SUFF= -+MNTP= -+MNT_DIR="/mnt" -+STO= -+STO_DIR="/tmp" -+BASE= -+ -+usage() -+{ -+cat <" in $STO_DIR, -+and mount point "mini_fo-" in $MNT_DIR. -+ -+Options: -+ -s -+ add given suffix to storage directory and the mount -+ point. This is usefull for overlaying one base directory -+ several times and avoiding conflicts with storage directory -+ names and mount points. -+ -+ -d -+ change the directory in which the storage directory will be -+ created (default is currently "$STO_DIR". -+ -+ -m -+ use an alternative directory to create the mini_fo -+ mountpoint (default is currently "$MNT_DIR". -+ -+ -h displays this message. -+ -+EOF -+exit 1; -+} -+ -+while getopts hm:s:d: OPTS -+ do -+ case $OPTS in -+ s) SUFF="$OPTARG";; -+ d) STO_DIR="$OPTARG";; -+ m) MNT_DIR="$OPTARG";; -+ h) HELP="set";; -+ ?) usage -+ exit 1;; -+ esac -+done -+shift $(($OPTIND - 1)) -+ -+BASE="$1" -+ -+if [ "x$HELP" == "xset" ]; then -+ usage -+ exit -1 -+fi -+ -+# fix suffix -+if [ "x$SUFF" != "x" ]; then -+ SUFF="-$SUFF" -+fi -+ -+# kill trailing slashes -+MNT_DIR=${MNT_DIR%/} -+STO_DIR=${STO_DIR%/} -+BASE=${BASE%/} -+ -+ -+if ! [ -d "$BASE" ]; then -+ echo "invalid base dir $BASE, run $0 -h for help." -+ exit -1 -+fi -+ -+# check opts -+if ! [ -d "$MNT_DIR" ]; then -+ echo "invalid mount dir $MNT_DIR, run $0 -h for help." -+ exit -1 -+fi -+ -+if ! [ -d "$STO_DIR" ]; then -+ echo "invalid sto_dir_dir $STO_DIR, run $0 -h for help." -+ exit -1 -+fi -+ -+MNTP="$MNT_DIR/mini_fo-`basename $BASE`$SUFF" -+STO="$STO_DIR/sto-`basename $BASE`$SUFF" -+ -+# create the mount point if it doesn't exist -+mkdir -p $MNTP -+if [ $? -ne 0 ]; then -+ echo "Error, failed to create mount point $MNTP" -+fi -+ -+mkdir -p $STO -+if [ $? -ne 0 ]; then -+ echo "Error, failed to create storage dir $STO" -+fi -+ -+# check if fs is already mounted -+mount | grep mini_fo | grep $MNTP &> /dev/null -+if [ $? -eq 0 ]; then -+ echo "Error, existing mini_fo mount at $MNTP." -+ exit -1 -+fi -+ -+mount | grep mini_fo | grep $STO &> /dev/null -+if [ $? -eq 0 ]; then -+ echo "Error, $STO seems to be used already." -+ exit -1 -+fi -+ -+# mount -+mount -t mini_fo -o base=$BASE,sto=$STO $BASE $MNTP -+ -+if [ $? -ne 0 ]; then -+ echo "Error, mounting failed, maybe no permisson to mount?" -+fi ---- /dev/null -+++ b/fs/mini_fo/mmap.c -@@ -0,0 +1,637 @@ -+/* -+ * Copyright (c) 1997-2003 Erez Zadok -+ * Copyright (c) 2001-2003 Stony Brook University -+ * -+ * For specific licensing information, see the COPYING file distributed with -+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING. -+ * -+ * This Copyright notice must be kept intact and distributed with all -+ * fistgen sources INCLUDING sources generated by fistgen. -+ */ -+/* -+ * Copyright (C) 2004, 2005 Markus Klotzbuecher -+ * -+ * 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. -+ */ -+ -+/* -+ * $Id$ -+ */ -+ -+#ifdef HAVE_CONFIG_H -+# include -+#endif /* HAVE_CONFIG_H */ -+ -+#include "fist.h" -+#include "mini_fo.h" -+ -+ -+#ifdef FIST_COUNT_WRITES -+/* for counting writes in the middle vs. regular writes */ -+unsigned long count_writes = 0, count_writes_middle = 0; -+#endif /* FIST_COUNT_WRITES */ -+ -+/* forward declaration of commit write and prepare write */ -+STATIC int mini_fo_commit_write(file_t *file, page_t *page, unsigned from, unsigned to); -+STATIC int mini_fo_prepare_write(file_t *file, page_t *page, unsigned from, unsigned to); -+ -+ -+/* -+ * Function for handling creation of holes when lseek-ing past the -+ * end of the file and then writing some data. -+ */ -+int -+mini_fo_fill_zeros(file_t* file, page_t *page, unsigned from) -+{ -+ int err = 0; -+ dentry_t *dentry = file->f_dentry; -+ inode_t *inode = dentry->d_inode; -+ page_t *tmp_page; -+ int index; -+ -+ print_entry_location(); -+ -+ for (index = inode->i_size >> PAGE_CACHE_SHIFT; index < page->index; index++) { -+ tmp_page = mini_fo_get1page(file, index); -+ if (IS_ERR(tmp_page)) { -+ err = PTR_ERR(tmp_page); -+ goto out; -+ } -+ -+ /* -+ * zero out rest of the contents of the page between the appropriate -+ * offsets. -+ */ -+ memset((char*)page_address(tmp_page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, PAGE_CACHE_SIZE - (inode->i_size & ~PAGE_CACHE_MASK)); -+ -+ if (! (err = mini_fo_prepare_write(file, tmp_page, 0, PAGE_CACHE_SIZE))) -+ err = mini_fo_commit_write(file, tmp_page, 0, PAGE_CACHE_SIZE); -+ -+ page_cache_release(tmp_page); -+ if (err < 0) -+ goto out; -+ if (current->need_resched) -+ schedule(); -+ } -+ -+ /* zero out appropriate parts of last page */ -+ -+ /* -+ * if the encoding type is block, then adjust the 'from' (where the -+ * zeroing will start) offset appropriately -+ */ -+ from = from & (~(FIST_ENCODING_BLOCKSIZE - 1)); -+ -+ if ((from - (inode->i_size & ~PAGE_CACHE_MASK)) > 0) { -+ -+ memset((char*)page_address(page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, from - (inode->i_size & ~PAGE_CACHE_MASK)); -+ if (! (err = mini_fo_prepare_write(file, page, 0, PAGE_CACHE_SIZE))) -+ err = mini_fo_commit_write(file, page, 0, PAGE_CACHE_SIZE); -+ -+ if (err < 0) -+ goto out; -+ if (current->need_resched) -+ schedule(); -+ } -+ -+ out: -+ print_exit_status(err); -+ return err; -+} -+ -+ -+ -+STATIC int -+mini_fo_writepage(page_t *page) -+{ -+ int err = -EIO; -+ inode_t *inode; -+ inode_t *hidden_inode; -+ page_t *hidden_page; -+ char *kaddr, *hidden_kaddr; -+ -+ print_entry_location(); -+ -+ inode = page->mapping->host; -+ hidden_inode = itohi(inode); -+ -+ /* -+ * writepage is called when shared mmap'ed files need to write -+ * their pages, while prepare/commit_write are called from the -+ * non-paged write() interface. (However, in 2.3 the two interfaces -+ * share the same cache, while in 2.2 they didn't.) -+ * -+ * So we pretty much have to duplicate much of what commit_write does. -+ */ -+ -+ /* find lower page (returns a locked page) */ -+ hidden_page = grab_cache_page(hidden_inode->i_mapping, page->index); -+ if (!hidden_page) -+ goto out; -+ -+ /* get page address, and encode it */ -+ kaddr = (char *) kmap(page); -+ hidden_kaddr = (char*) kmap(hidden_page); -+ mini_fo_encode_block(kaddr, hidden_kaddr, PAGE_CACHE_SIZE, inode, inode->i_sb, page->index); -+ /* if encode_block could fail, then return error */ -+ kunmap(page); -+ kunmap(hidden_page); -+ -+ /* call lower writepage (expects locked page) */ -+ err = hidden_inode->i_mapping->a_ops->writepage(hidden_page); -+ -+ /* -+ * update mtime and ctime of lower level file system -+ * mini_fo' mtime and ctime are updated by generic_file_write -+ */ -+ hidden_inode->i_mtime = hidden_inode->i_ctime = CURRENT_TIME; -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,1) -+ UnlockPage(hidden_page); /* b/c grab_cache_page locked it */ -+# endif /* kernel older than 2.4.1 */ -+ page_cache_release(hidden_page); /* b/c grab_cache_page increased refcnt */ -+ -+ if (err) -+ ClearPageUptodate(page); -+ else -+ SetPageUptodate(page); -+ out: -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,1) -+ UnlockPage(page); -+# endif /* kernel 2.4.1 and newer */ -+ print_exit_status(err); -+ return err; -+} -+ -+ -+/* -+ * get one page from cache or lower f/s, return error otherwise. -+ * returns unlocked, up-to-date page (if ok), with increased refcnt. -+ */ -+page_t * -+mini_fo_get1page(file_t *file, int index) -+{ -+ page_t *page; -+ dentry_t *dentry; -+ inode_t *inode; -+ struct address_space *mapping; -+ int err; -+ -+ print_entry_location(); -+ -+ dentry = file->f_dentry; /* CPW: Moved below print_entry_location */ -+ inode = dentry->d_inode; -+ mapping = inode->i_mapping; -+ -+ fist_dprint(8, "%s: read page index %d pid %d\n", __FUNCTION__, index, current->pid); -+ if (index < 0) { -+ printk("%s BUG: index=%d\n", __FUNCTION__, index); -+ page = ERR_PTR(-EIO); -+ goto out; -+ } -+ page = read_cache_page(mapping, -+ index, -+ (filler_t *) mapping->a_ops->readpage, -+ (void *) file); -+ if (IS_ERR(page)) -+ goto out; -+ wait_on_page(page); -+ if (!Page_Uptodate(page)) { -+ lock_page(page); -+ err = mapping->a_ops->readpage(file, page); -+ if (err) { -+ page = ERR_PTR(err); -+ goto out; -+ } -+ wait_on_page(page); -+ if (!Page_Uptodate(page)) { -+ page = ERR_PTR(-EIO); -+ goto out; -+ } -+ } -+ -+ out: -+ print_exit_pointer(page); -+ return page; -+} -+ -+ -+/* -+ * get one page from cache or lower f/s, return error otherwise. -+ * similar to get1page, but doesn't guarantee that it will return -+ * an unlocked page. -+ */ -+page_t * -+mini_fo_get1page_cached(file_t *file, int index) -+{ -+ page_t *page; -+ dentry_t *dentry; -+ inode_t *inode; -+ struct address_space *mapping; -+ int err; -+ -+ print_entry_location(); -+ -+ dentry = file->f_dentry; /* CPW: Moved below print_entry_location */ -+ inode = dentry->d_inode; -+ mapping = inode->i_mapping; -+ -+ fist_dprint(8, "%s: read page index %d pid %d\n", __FUNCTION__, index, current->pid); -+ if (index < 0) { -+ printk("%s BUG: index=%d\n", __FUNCTION__, index); -+ page = ERR_PTR(-EIO); -+ goto out; -+ } -+ page = read_cache_page(mapping, -+ index, -+ (filler_t *) mapping->a_ops->readpage, -+ (void *) file); -+ if (IS_ERR(page)) -+ goto out; -+ -+ out: -+ print_exit_pointer(page); -+ return page; -+} -+ -+ -+/* -+ * readpage is called from generic_page_read and the fault handler. -+ * If your file system uses generic_page_read for the read op, it -+ * must implement readpage. -+ * -+ * Readpage expects a locked page, and must unlock it. -+ */ -+STATIC int -+mini_fo_do_readpage(file_t *file, page_t *page) -+{ -+ int err = -EIO; -+ dentry_t *dentry; -+ file_t *hidden_file = NULL; -+ dentry_t *hidden_dentry; -+ inode_t *inode; -+ inode_t *hidden_inode; -+ char *page_data; -+ page_t *hidden_page; -+ char *hidden_page_data; -+ int real_size; -+ -+ print_entry_location(); -+ -+ dentry = file->f_dentry; /* CPW: Moved below print_entry_location */ -+ if (ftopd(file) != NULL) -+ hidden_file = ftohf(file); -+ hidden_dentry = dtohd(dentry); -+ inode = dentry->d_inode; -+ hidden_inode = itohi(inode); -+ -+ fist_dprint(7, "%s: requesting page %d from file %s\n", __FUNCTION__, page->index, dentry->d_name.name); -+ -+ MALLOC_PAGE_POINTERS(hidden_pages, num_hidden_pages); -+ MALLOC_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages); -+ FOR_EACH_PAGE -+ CURRENT_HIDDEN_PAGE = NULL; -+ -+ /* find lower page (returns a locked page) */ -+ FOR_EACH_PAGE { -+ fist_dprint(8, "%s: Current page index = %d\n", __FUNCTION__, CURRENT_HIDDEN_PAGEINDEX); -+ CURRENT_HIDDEN_PAGE = read_cache_page(hidden_inode->i_mapping, -+ CURRENT_HIDDEN_PAGEINDEX, -+ (filler_t *) hidden_inode->i_mapping->a_ops->readpage, -+ (void *) hidden_file); -+ if (IS_ERR(CURRENT_HIDDEN_PAGE)) { -+ err = PTR_ERR(CURRENT_HIDDEN_PAGE); -+ CURRENT_HIDDEN_PAGE = NULL; -+ goto out_release; -+ } -+ } -+ -+ /* -+ * wait for the page data to show up -+ * (signaled by readpage as unlocking the page) -+ */ -+ FOR_EACH_PAGE { -+ wait_on_page(CURRENT_HIDDEN_PAGE); -+ if (!Page_Uptodate(CURRENT_HIDDEN_PAGE)) { -+ /* -+ * call readpage() again if we returned from wait_on_page with a -+ * page that's not up-to-date; that can happen when a partial -+ * page has a few buffers which are ok, but not the whole -+ * page. -+ */ -+ lock_page(CURRENT_HIDDEN_PAGE); -+ err = hidden_inode->i_mapping->a_ops->readpage(hidden_file, -+ CURRENT_HIDDEN_PAGE); -+ if (err) { -+ CURRENT_HIDDEN_PAGE = NULL; -+ goto out_release; -+ } -+ wait_on_page(CURRENT_HIDDEN_PAGE); -+ if (!Page_Uptodate(CURRENT_HIDDEN_PAGE)) { -+ err = -EIO; -+ goto out_release; -+ } -+ } -+ } -+ -+ /* map pages, get their addresses */ -+ page_data = (char *) kmap(page); -+ FOR_EACH_PAGE -+ CURRENT_HIDDEN_PAGEDATA = (char *) kmap(CURRENT_HIDDEN_PAGE); -+ -+ /* if decode_block could fail, then return error */ -+ err = 0; -+ real_size = hidden_inode->i_size - (page->index << PAGE_CACHE_SHIFT); -+ if (real_size <= 0) -+ memset(page_data, 0, PAGE_CACHE_SIZE); -+ else if (real_size < PAGE_CACHE_SIZE) { -+ mini_fo_decode_block(hidden_page_data, page_data, real_size, inode, inode->i_sb, page->index); -+ memset(page_data + real_size, 0, PAGE_CACHE_SIZE - real_size); -+ } else -+ mini_fo_decode_block(hidden_page_data, page_data, PAGE_CACHE_SIZE, inode, inode->i_sb, page->index); -+ -+ FOR_EACH_PAGE -+ kunmap(CURRENT_HIDDEN_PAGE); -+ kunmap(page); -+ -+ out_release: -+ FOR_EACH_PAGE -+ if (CURRENT_HIDDEN_PAGE) -+ page_cache_release(CURRENT_HIDDEN_PAGE); /* undo read_cache_page */ -+ -+ FREE_PAGE_POINTERS(hidden_pages, num_hidden_pages); -+ FREE_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages); -+ -+ out: -+ if (err == 0) -+ SetPageUptodate(page); -+ else -+ ClearPageUptodate(page); -+ -+ print_exit_status(err); -+ return err; -+} -+ -+ -+STATIC int -+mini_fo_readpage(file_t *file, page_t *page) -+{ -+ int err; -+ print_entry_location(); -+ -+ err = mini_fo_do_readpage(file, page); -+ -+ /* -+ * we have to unlock our page, b/c we _might_ have gotten a locked page. -+ * but we no longer have to wakeup on our page here, b/c UnlockPage does -+ * it -+ */ -+ UnlockPage(page); -+ -+ print_exit_status(err); -+ return err; -+} -+ -+ -+STATIC int -+mini_fo_prepare_write(file_t *file, page_t *page, unsigned from, unsigned to) -+{ -+ int err = 0; -+ -+ print_entry_location(); -+ -+ /* -+ * we call kmap(page) only here, and do the kunmap -+ * and the actual downcalls, including unlockpage and uncache -+ * in commit_write. -+ */ -+ kmap(page); -+ -+ /* fast path for whole page writes */ -+ if (from == 0 && to == PAGE_CACHE_SIZE) -+ goto out; -+ /* read the page to "revalidate" our data */ -+ /* call the helper function which doesn't unlock the page */ -+ if (!Page_Uptodate(page)) -+ err = mini_fo_do_readpage(file, page); -+ -+ out: -+ print_exit_status(err); -+ return err; -+} -+ -+ -+ -+STATIC int -+mini_fo_commit_write(file_t *file, page_t *page, unsigned from, unsigned to) -+{ -+ int err = -ENOMEM; -+ inode_t *inode; -+ inode_t *hidden_inode; -+ page_t *hidden_page; -+ file_t *hidden_file = NULL; -+ loff_t pos; -+ unsigned bytes = to - from; -+ unsigned hidden_from, hidden_to, hidden_bytes; -+ -+ print_entry_location(); -+ -+ inode = page->mapping->host; /* CPW: Moved below print_entry_location */ -+ hidden_inode = itohi(inode); -+ -+ ASSERT(file != NULL); -+ /* -+ * here we have a kmapped page, with data from the user copied -+ * into it. we need to encode_block it, and then call the lower -+ * commit_write. We also need to simulate same behavior of -+ * generic_file_write, and call prepare_write on the lower f/s first. -+ */ -+#ifdef FIST_COUNT_WRITES -+ count_writes++; -+# endif /* FIST_COUNT_WRITES */ -+ -+ /* this is append and/or extend -- we can't have holes so fill them in */ -+ if (page->index > (hidden_inode->i_size >> PAGE_CACHE_SHIFT)) { -+ page_t *tmp_page; -+ int index; -+ for (index = hidden_inode->i_size >> PAGE_CACHE_SHIFT; index < page->index; index++) { -+ tmp_page = mini_fo_get1page(file, index); -+ if (IS_ERR(tmp_page)) { -+ err = PTR_ERR(tmp_page); -+ goto out; -+ } -+ /* zero out the contents of the page at the appropriate offsets */ -+ memset((char*)page_address(tmp_page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, PAGE_CACHE_SIZE - (inode->i_size & ~PAGE_CACHE_MASK)); -+ if (!(err = mini_fo_prepare_write(file, tmp_page, 0, PAGE_CACHE_SIZE))) -+ err = mini_fo_commit_write(file, tmp_page, 0, PAGE_CACHE_SIZE); -+ page_cache_release(tmp_page); -+ if (err < 0) -+ goto out; -+ if (current->need_resched) -+ schedule(); -+ } -+ } -+ -+ if (ftopd(file) != NULL) -+ hidden_file = ftohf(file); -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_inode->i_mutex); -+#else -+ down(&hidden_inode->i_sem); -+#endif -+ /* find lower page (returns a locked page) */ -+ hidden_page = grab_cache_page(hidden_inode->i_mapping, page->index); -+ if (!hidden_page) -+ goto out; -+ -+#if FIST_ENCODING_BLOCKSIZE > 1 -+# error encoding_blocksize greater than 1 is not yet supported -+# endif /* FIST_ENCODING_BLOCKSIZE > 1 */ -+ -+ hidden_from = from & (~(FIST_ENCODING_BLOCKSIZE - 1)); -+ hidden_to = ((to + FIST_ENCODING_BLOCKSIZE - 1) & (~(FIST_ENCODING_BLOCKSIZE - 1))); -+ if ((page->index << PAGE_CACHE_SHIFT) + to > hidden_inode->i_size) { -+ -+ /* -+ * if this call to commit_write had introduced holes and the code -+ * for handling holes was invoked, then the beginning of this page -+ * must be zeroed out -+ * zero out bytes from 'size_of_file%pagesize' to 'from'. -+ */ -+ if ((hidden_from - (inode->i_size & ~PAGE_CACHE_MASK)) > 0) -+ memset((char*)page_address(page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, hidden_from - (inode->i_size & ~PAGE_CACHE_MASK)); -+ -+ } -+ hidden_bytes = hidden_to - hidden_from; -+ -+ /* call lower prepare_write */ -+ err = -EINVAL; -+ if (hidden_inode->i_mapping && -+ hidden_inode->i_mapping->a_ops && -+ hidden_inode->i_mapping->a_ops->prepare_write) -+ err = hidden_inode->i_mapping->a_ops->prepare_write(hidden_file, -+ hidden_page, -+ hidden_from, -+ hidden_to); -+ if (err) -+ /* don't leave locked pages behind, esp. on an ENOSPC */ -+ goto out_unlock; -+ -+ fist_dprint(8, "%s: encoding %d bytes\n", __FUNCTION__, hidden_bytes); -+ mini_fo_encode_block((char *) page_address(page) + hidden_from, (char*) page_address(hidden_page) + hidden_from, hidden_bytes, inode, inode->i_sb, page->index); -+ /* if encode_block could fail, then goto unlock and return error */ -+ -+ /* call lower commit_write */ -+ err = hidden_inode->i_mapping->a_ops->commit_write(hidden_file, -+ hidden_page, -+ hidden_from, -+ hidden_to); -+ -+ if (err < 0) -+ goto out_unlock; -+ -+ err = bytes; /* convert error to no. of bytes */ -+ -+ inode->i_blocks = hidden_inode->i_blocks; -+ /* we may have to update i_size */ -+ pos = (page->index << PAGE_CACHE_SHIFT) + to; -+ if (pos > inode->i_size) -+ inode->i_size = pos; -+ -+ /* -+ * update mtime and ctime of lower level file system -+ * mini_fo' mtime and ctime are updated by generic_file_write -+ */ -+ hidden_inode->i_mtime = hidden_inode->i_ctime = CURRENT_TIME; -+ -+ mark_inode_dirty_sync(inode); -+ -+ out_unlock: -+ UnlockPage(hidden_page); -+ page_cache_release(hidden_page); -+ kunmap(page); /* kmap was done in prepare_write */ -+ out: -+ /* we must set our page as up-to-date */ -+ if (err < 0) -+ ClearPageUptodate(page); -+ else -+ SetPageUptodate(page); -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_inode->i_mutex); -+#else -+ up(&hidden_inode->i_sem); -+#endif -+ print_exit_status(err); -+ return err; /* assume all is ok */ -+} -+ -+ -+STATIC int -+mini_fo_bmap(struct address_space *mapping, long block) -+{ -+ int err = 0; -+ inode_t *inode; -+ inode_t *hidden_inode; -+ -+ print_entry_location(); -+ -+ inode = (inode_t *) mapping->host; -+ hidden_inode = itohi(inode); -+ -+ if (hidden_inode->i_mapping->a_ops->bmap) -+ err = hidden_inode->i_mapping->a_ops->bmap(hidden_inode->i_mapping, block); -+ print_exit_location(); -+ return err; -+} -+ -+ -+/* -+ * This function is copied verbatim from mm/filemap.c. -+ * XXX: It should be simply moved to some header file instead -- bug Al about it! -+ */ -+static inline int sync_page(struct page *page) -+{ -+ struct address_space *mapping = page->mapping; -+ -+ if (mapping && mapping->a_ops && mapping->a_ops->sync_page) -+ return mapping->a_ops->sync_page(page); -+ return 0; -+} -+ -+ -+/* -+ * XXX: we may not need this function if not FIST_FILTER_DATA. -+ * FIXME: for FIST_FILTER_SCA, get all lower pages and sync them each. -+ */ -+STATIC int -+mini_fo_sync_page(page_t *page) -+{ -+ int err = 0; -+ inode_t *inode; -+ inode_t *hidden_inode; -+ page_t *hidden_page; -+ -+ print_entry_location(); -+ -+ inode = page->mapping->host; /* CPW: Moved below print_entry_location */ -+ hidden_inode = itohi(inode); -+ -+ /* find lower page (returns a locked page) */ -+ hidden_page = grab_cache_page(hidden_inode->i_mapping, page->index); -+ if (!hidden_page) -+ goto out; -+ -+ err = sync_page(hidden_page); -+ -+ UnlockPage(hidden_page); /* b/c grab_cache_page locked it */ -+ page_cache_release(hidden_page); /* b/c grab_cache_page increased refcnt */ -+ -+ out: -+ print_exit_status(err); -+ return err; -+} ---- /dev/null -+++ b/fs/mini_fo/README -@@ -0,0 +1,163 @@ -+README for the mini_fo overlay file system -+========================================= -+ -+ -+WHAT IS MINI_FO? -+---------------- -+ -+mini_fo is a virtual kernel file system that can make read-only -+file systems writable. This is done by redirecting modifying operations -+to a writeable location called "storage directory", and leaving the -+original data in the "base directory" untouched. When reading, the -+file system merges the modifed and original data so that only the -+newest versions will appear. This occurs transparently to the user, -+who can access the data like on any other read-write file system. -+ -+Base and storage directories may be located on the same or on -+different partitions and may be of different file system types. While -+the storage directory obviously needs to be writable, the base may or -+may not be writable, what doesn't matter as it will no be modified -+anyway. -+ -+ -+WHAT IS GOOD FOR? -+----------------- -+ -+The primary purpose of the mini_fo file system is to allow easy -+software updates to embedded systems, that often store their root -+file system in a read-only flash file system, but there are many -+more as for example sandboxing, or for allowing live-cds to -+permanently store information. -+ -+ -+BUILDING -+-------- -+This should be simple. Adjust the Makefile to point to the correct -+kernel headers you want to build the module for. Then: -+ -+ # make -+ -+should build "mini_fo.o" for a 2.4 kernel or "mini_fo.ko" for a 2.6 -+kernel. -+ -+If you are building the module for you current kernel, you can install -+the module (as root): -+ -+ # make install -+ -+or uninstall with -+ -+ # make uninstall -+ -+ -+USING THE FILE SYSTEM -+-------------------- -+ -+the general mount syntax is: -+ -+ mount -t mini_fo -o base=,sto=\ -+ -+ -+Example: -+ -+You have mounted a cdrom to /mnt/cdrom and want to modifiy some files -+on it: -+ -+load the module (as root) -+ -+ # insmod mini_fo.o for a 2.4 kernel or -+ -+ # insmod mini_fo.ko for a 2.6 kernel -+ -+ -+create a storage dir in tmp and a mountpoint for mini_fo: -+ -+ # mkdir /tmp/sto -+ # mkdir /mnt/mini_fo -+ -+and mount the mini_fo file system: -+ -+ # mount -t mini_fo -o base=/mnt/cdrom,sto=/tmp/sto /mnt/cdrom /mnt/mini_fo -+ -+ -+Now the data stored on the cd can be accessed via the mini_fo -+mountpoint just like any read-write file system, files can be modified -+and deleted, new ones can be created and so on. When done unmount the -+file system: -+ -+ # unmount /mnt/mini_fo -+ -+Note that if the file system is mounted again using the same storage -+file system, of course it will appear in the modified state again. If -+you remount it using an new empty storage directory, it will be -+unmodified. Therefore by executing: -+ -+ # cd /tmp/sto -+ # rm -rf * -+ -+you can nuke all the changes you made to the original file system. But -+ remember NEVER do this while the mini_fo file system is mounted! -+ -+ -+Alternatively you can use the mini_fo-overlay bash script, that -+simplifies managing mini_fo mounts. See TOOLS Section. -+ -+ -+TOOLS -+----- -+ -+mini_fo-merge (experimental): -+ -+This is a bash script that will merge changes contained in the storage -+directory back to the base directory. This allows mini_fo to function -+as a cache file system by overlaying a slow (network, ...) file system -+and using a fast (ramdisk, ...) as storage. When done, changes can be -+merged back to the (slow) base with mini_fo-merge. See "mini_fo-merge -+-h" for details. -+ -+It can be usefull for merging changes back after a successfull test -+(patches, software updates...) -+ -+ -+mini_fo-overlay: -+ -+This bash script simplifies managing one or more mini_fo mounts. For -+overlaying a directory called "basedir1", you can just call: -+ -+ # mini_fo-overlay basedir1 -+ -+This will mount mini_fo with "basedir1" as base, "/tmp/sto-basedir1/" -+as storage to "/mnt/mini_fo-basedir1/". It has more options though, -+type "mini_fo-overlay -h" for details. -+ -+ -+DOCUMENTATION, REPORTING BUGS, GETTING HELP -+------------------------------------------- -+ -+Please visit the mini_fo project page at: -+ -+http://www.denx.de/twiki/bin/view/Know/MiniFOHome -+ -+ -+WARNINGS -+-------- -+ -+Never modify the base or the storage directorys while the mini_fo -+file system is mounted, or you might crash you system. Simply accessing -+and reading should not cause any trouble. -+ -+Exporting a mini_fo mount point via NFS has not been tested, and may -+or may not work. -+ -+Check the RELEASE_NOTES for details on bugs and features. -+ -+ -+ -+Copyright (C) 2004, 2005 Markus Klotzbuecher -+ -+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. -+ -+ ---- /dev/null -+++ b/fs/mini_fo/RELEASE_NOTES -@@ -0,0 +1,111 @@ -+Release: mini_fo-0.6.1 (v0-6-1) -+Date: 21.09.2005 -+ -+ -+Changes: -+-------- -+v0-6-1: -+ -+- bugfixes (see ChangeLog) -+ -+- two helper scripts "mini_fo_merge" and "mini_fo_overlay" (see -+ README for details). -+ -+v0-6-0: -+ -+- Support for 2.4 and 2.6 (see Makefile) -+ -+- Partial hard link support (creating works as expected, but already -+ existing links in the base file system will be treated as if they -+ were individual files). -+ -+- Various bugfixes and cleanups. -+ -+ -+v0-6-0-pre1: -+ -+- This is mini_fo-0-6-0-pre1! This release is a complete rewrite of -+ many vital mini_fo parts such as the old whiteout list code which -+ has been replaced by the new META subsystem. -+ -+- Light weight directory renaming implemented. This means if a -+ directory is renamed via the mini_fo filesystem this will no longer -+ result in a complete copy in storage, instead only one empty -+ directory will be created. All base filed contained in the original -+ directory stay there until modified. -+ -+- Special files (creating, renaming, deleting etc.) now working. -+ -+- Many bugfixes and cleanup, mini_fo is now a lot more stable. -+ -+ -+v0-5-10: -+ -+- Final release of the 0-5-* versions. Next will be a complete rewrite -+ of many features. This release contains several bugfixes related to -+ directory renaming. -+ -+ -+v0-5-10-pre6: -+ -+- Lots of cleanup and several bugfixes related to directory deleting -+ -+- Directory renaming suddenly works, what is most likely due to the -+ fact tha that "mv" is smart: if the classic rename doesn't work it -+ will assume that source and target file are on different fs and will -+ copy the directory and try to remove the source directory. Until -+ directory removing wasn't implemented, it would fail to do this and -+ rollback. -+ So, directory renaming works for now, but it doesn't yet do what you -+ would expect from a overlay fs, so use with care. -+ -+ -+v0-5-10-pre5: -+ -+- implemented directory deleting -+- made parsing of mount options more stable -+- New format of mount options! (See README) -+- I can't reproduce the unknown panic with 2.4.25 anymore, so I'll -+ happily assume it never existed! -+ -+ -+Implemented features: -+--------------------- -+ -+- creating hard links (see BUGS on already existing hard links) -+- lightweight directory renaming -+- renaming device files, pipes, sockets, etc. -+- creating, renaming, deleting of special files -+- deleting directorys -+- general directory reading (simple "ls" ) -+- creating files in existing directorys -+- creating directorys -+- renaming files. -+- reading and writing files (involves opening) -+- appending to files (creates copy in storage) -+- deleting files -+- llseek works too, what allows editors to work -+- persistency (a deleted file stay deleted over remounts) -+- use of symbolic links -+- creating of device files -+ -+ -+Not (yet) implemented features: -+------------------------------- -+ -+- full hard link support. -+ -+ -+ -+BUGS: -+----- -+ -+Hard links in the base file system will be treated as individual -+files, not as links to one inode. -+ -+The main problem with hard links isn't allowing to create them, but -+their pure existence. If you modify a base hard link, the changes made -+will only show up on this link, the other link will remain in the -+original state. I hope to fix this someday. Please note that this does -+not effect the special hard links '.' and '..', that are handled -+seperately by the lower fs. ---- /dev/null -+++ b/fs/mini_fo/state.c -@@ -0,0 +1,620 @@ -+/* -+ * Copyright (C) 2005 Markus Klotzbuecher -+ * -+ * 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. -+ */ -+ -+#ifdef HAVE_CONFIG_H -+# include -+#endif /* HAVE_CONFIG_H */ -+ -+#include "fist.h" -+#include "mini_fo.h" -+ -+ -+/* create the storage file, setup new states */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+int create_sto_reg_file(dentry_t *dentry, int mode, struct nameidata *nd) -+#else -+int create_sto_reg_file(dentry_t *dentry, int mode) -+#endif -+{ -+ int err = 0; -+ inode_t *dir; -+ dentry_t *hidden_sto_dentry; -+ dentry_t *hidden_sto_dir_dentry; -+ -+ if(exists_in_storage(dentry)) { -+ printk(KERN_CRIT "mini_fo: create_sto_file: wrong type or state.\n"); -+ err = -EINVAL; -+ goto out; -+ } -+ err = get_neg_sto_dentry(dentry); -+ -+ if (err) { -+ printk(KERN_CRIT "mini_fo: create_sto_file: ERROR getting neg. sto dentry.\n"); -+ goto out; -+ } -+ -+ dir = dentry->d_parent->d_inode; -+ hidden_sto_dentry = dtohd2(dentry); -+ -+ /* lock parent */ -+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent); -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ down(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ -+ err = PTR_ERR(hidden_sto_dir_dentry); -+ if (IS_ERR(hidden_sto_dir_dentry)) -+ goto out; -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ err = vfs_create(hidden_sto_dir_dentry->d_inode, -+ hidden_sto_dentry, -+ mode, nd); -+#else -+ err = vfs_create(hidden_sto_dir_dentry->d_inode, -+ hidden_sto_dentry, -+ mode); -+#endif -+ if(err) { -+ printk(KERN_CRIT "mini_fo: create_sto_file: ERROR creating sto file.\n"); -+ goto out_lock; -+ } -+ -+ if(!dtohd2(dentry)->d_inode) { -+ printk(KERN_CRIT "mini_fo: create_sto_file: ERROR creating sto file [2].\n"); -+ err = -EINVAL; -+ goto out_lock; -+ } -+ -+ /* interpose the new inode */ -+ if(dtost(dentry) == DELETED) { -+ dtost(dentry) = DEL_REWRITTEN; -+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0); -+ if(err) -+ goto out_lock; -+ } -+ else if(dtost(dentry) == NON_EXISTANT) { -+ dtost(dentry) = CREATED; -+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0); -+ if(err) -+ goto out_lock; -+ } -+ else if(dtost(dentry) == UNMODIFIED) { -+ dtost(dentry) = MODIFIED; -+ /* interpose on new inode */ -+ if(itohi2(dentry->d_inode) != NULL) { -+ printk(KERN_CRIT "mini_fo: create_sto_file: invalid inode detected.\n"); -+ err = -EINVAL; -+ goto out_lock; -+ } -+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode); -+ } -+ fist_copy_attr_timesizes(dentry->d_parent->d_inode, -+ hidden_sto_dir_dentry->d_inode); -+ -+ out_lock: -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ dput(hidden_sto_dir_dentry); -+ out: -+ return err; -+} -+ -+/* create the sto dir, setup states */ -+int create_sto_dir(dentry_t *dentry, int mode) -+{ -+ int err = 0; -+ inode_t *dir; -+ dentry_t *hidden_sto_dentry; -+ dentry_t *hidden_sto_dir_dentry; -+ -+ /* had to take the "!S_ISDIR(mode))" check out, because it failed */ -+ if(exists_in_storage(dentry)) { -+ printk(KERN_CRIT "mini_fo: create_sto_dir: wrong type or state.\\ -+n"); -+ err = -EINVAL; -+ goto out; -+ } -+ -+ err = get_neg_sto_dentry(dentry); -+ if(err) { -+ err = -EINVAL; -+ goto out; -+ } -+ -+ dir = dentry->d_parent->d_inode; -+ hidden_sto_dentry = dtohd2(dentry); -+ -+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */ -+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent); -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ down(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ -+ err = PTR_ERR(hidden_sto_dir_dentry); -+ if (IS_ERR(hidden_sto_dir_dentry)) -+ goto out; -+ -+ err = vfs_mkdir(hidden_sto_dir_dentry->d_inode, -+ hidden_sto_dentry, -+ mode); -+ if(err) { -+ printk(KERN_CRIT "mini_fo: create_sto_dir: ERROR creating sto dir.\n"); -+ goto out_lock; -+ } -+ -+ if(!dtohd2(dentry)->d_inode) { -+ printk(KERN_CRIT "mini_fo: create_sto_dir: ERROR creating sto dir [2].\n"); -+ err = -EINVAL; -+ goto out_lock; -+ } -+ -+ /* interpose the new inode */ -+ if(dtost(dentry) == DELETED) { -+ dtost(dentry) = DEL_REWRITTEN; -+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0); -+ if(err) -+ goto out_lock; -+ } -+ else if(dtopd(dentry)->state == NON_EXISTANT) { -+ dtopd(dentry)->state = CREATED; -+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0); -+ if(err) -+ goto out_lock; -+ } -+ else if(dtopd(dentry)->state == UNMODIFIED) { -+ dtopd(dentry)->state = MODIFIED; -+ /* interpose on new inode */ -+ if(itohi2(dentry->d_inode) != NULL) { -+ printk(KERN_CRIT "mini_fo: create_sto_dir: ERROR, invalid inode detected.\n"); -+ err = -EINVAL; -+ goto out_lock; -+ } -+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode); -+ } -+ -+ fist_copy_attr_timesizes(dir, hidden_sto_dir_dentry->d_inode); -+ -+ /* initalize the wol list */ -+ itopd(dentry->d_inode)->deleted_list_size = -1; -+ itopd(dentry->d_inode)->renamed_list_size = -1; -+ meta_build_lists(dentry); -+ -+ -+ out_lock: -+ /* was: unlock_dir(hidden_sto_dir_dentry); */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ dput(hidden_sto_dir_dentry); -+ out: -+ return err; -+} -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+int create_sto_nod(dentry_t *dentry, int mode, dev_t dev) -+#else -+int create_sto_nod(dentry_t *dentry, int mode, int dev) -+#endif -+{ -+ int err = 0; -+ inode_t *dir; -+ dentry_t *hidden_sto_dentry; -+ dentry_t *hidden_sto_dir_dentry; -+ -+ if(exists_in_storage(dentry)) { -+ err = -EEXIST; -+ goto out; -+ } -+ err = get_neg_sto_dentry(dentry); -+ -+ if (err) { -+ printk(KERN_CRIT "mini_fo: create_sto_nod: ERROR getting neg. sto dentry.\n"); -+ goto out; -+ } -+ -+ dir = dentry->d_parent->d_inode; -+ hidden_sto_dentry = dtohd2(dentry); -+ -+ /* lock parent */ -+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent); -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ down(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ -+ err = PTR_ERR(hidden_sto_dir_dentry); -+ if (IS_ERR(hidden_sto_dir_dentry)) -+ goto out; -+ -+ err = vfs_mknod(hidden_sto_dir_dentry->d_inode, hidden_sto_dentry, mode, dev); -+ if(err) -+ goto out_lock; -+ -+ if(!dtohd2(dentry)->d_inode) { -+ printk(KERN_CRIT "mini_fo: create_sto_nod: creating storage inode failed [1].\n"); -+ err = -EINVAL; /* return something indicating failure */ -+ goto out_lock; -+ } -+ -+ /* interpose the new inode */ -+ if(dtost(dentry) == DELETED) { -+ dtost(dentry) = DEL_REWRITTEN; -+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0); -+ if(err) -+ goto out_lock; -+ } -+ else if(dtost(dentry) == NON_EXISTANT) { -+ dtost(dentry) = CREATED; -+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0); -+ if(err) -+ goto out_lock; -+ } -+ else if(dtost(dentry) == UNMODIFIED) { -+ dtost(dentry) = MODIFIED; -+ /* interpose on new inode */ -+ if(itohi2(dentry->d_inode) != NULL) { -+ printk(KERN_CRIT "mini_fo: create_sto_nod: error, invalid inode detected.\n"); -+ err = -EINVAL; -+ goto out_lock; -+ } -+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode); -+ } -+ -+ fist_copy_attr_timesizes(dir, hidden_sto_dir_dentry->d_inode); -+ -+ out_lock: -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ dput(hidden_sto_dir_dentry); -+ out: -+ return err; -+} -+ -+ -+/* unimplemented (and possibly not usefull): -+ -+ nondir-del_to_del_rew -+ nondir-non_exist_to_creat -+ -+ dir-unmod_to_del -+ dir-mod_to_del -+ dir-creat_to_del -+ dir-del_rew_to_del -+ dir-del_to_del_rew -+ dir-non_exist_to_creat -+*/ -+ -+ -+/* bring a file of any type from state UNMODIFIED to MODIFIED */ -+int nondir_unmod_to_mod(dentry_t *dentry, int cp_flag) -+{ -+ int err = 0; -+ struct vfsmount *tgt_mnt; -+ struct vfsmount *src_mnt; -+ dentry_t *tgt_dentry; -+ dentry_t *src_dentry; -+ dentry_t *hidden_sto_dentry; -+ dentry_t *hidden_sto_dir_dentry; -+ -+ check_mini_fo_dentry(dentry); -+ -+ if((dtost(dentry) != UNMODIFIED) || -+ S_ISDIR(dentry->d_inode->i_mode)) { -+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \ -+ wrong type or state.\n"); -+ err = -1; -+ goto out; -+ } -+ err = get_neg_sto_dentry(dentry); -+ -+ if (err) { -+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \ -+ ERROR getting neg. sto dentry.\n"); -+ goto out; -+ } -+ -+ /* create sto file */ -+ hidden_sto_dentry = dtohd2(dentry); -+ -+ /* lock parent */ -+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent); -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ down(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ -+ err = PTR_ERR(hidden_sto_dir_dentry); -+ if (IS_ERR(hidden_sto_dir_dentry)) -+ goto out; -+ -+ /* handle different types of nondirs */ -+ if(S_ISCHR(dentry->d_inode->i_mode) || -+ S_ISBLK(dentry->d_inode->i_mode)) { -+ err = vfs_mknod(hidden_sto_dir_dentry->d_inode, -+ hidden_sto_dentry, -+ dtohd(dentry)->d_inode->i_mode, -+ dtohd(dentry)->d_inode->i_rdev); -+ } -+ -+ else if(S_ISREG(dentry->d_inode->i_mode)) { -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ err = vfs_create(hidden_sto_dir_dentry->d_inode, -+ hidden_sto_dentry, -+ dtohd(dentry)->d_inode->i_mode, NULL); -+#else -+ err = vfs_create(hidden_sto_dir_dentry->d_inode, -+ hidden_sto_dentry, -+ dtohd(dentry)->d_inode->i_mode); -+#endif -+ } -+ if(err) { -+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \ -+ ERROR creating sto file.\n"); -+ goto out_lock; -+ } -+ -+ /* interpose on new inode */ -+ if(itohi2(dentry->d_inode) != NULL) { -+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \ -+ ERROR, invalid inode detected.\n"); -+ err = -EINVAL; -+ goto out_lock; -+ } -+ -+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode); -+ -+ fist_copy_attr_timesizes(dentry->d_parent->d_inode, -+ hidden_sto_dir_dentry->d_inode); -+ dtost(dentry) = MODIFIED; -+ -+ /* copy contents if regular file and cp_flag = 1 */ -+ if((cp_flag == 1) && S_ISREG(dentry->d_inode->i_mode)) { -+ -+ /* unlock first */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ -+ dput(hidden_sto_dir_dentry); -+ -+ tgt_dentry = dtohd2(dentry); -+ tgt_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2; -+ src_dentry = dtohd(dentry); -+ src_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt; -+ -+ err = mini_fo_cp_cont(tgt_dentry, tgt_mnt, -+ src_dentry, src_mnt); -+ if(err) { -+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \ -+ ERROR copying contents.\n"); -+ } -+ goto out; -+ } -+ -+ out_lock: -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ dput(hidden_sto_dir_dentry); -+ out: -+ return err; -+} -+ -+/* this function is currently identical to nondir_creat_to_del */ -+int nondir_del_rew_to_del(dentry_t *dentry) -+{ -+ return nondir_creat_to_del(dentry); -+} -+ -+int nondir_creat_to_del(dentry_t *dentry) -+{ -+ int err = 0; -+ -+ inode_t *hidden_sto_dir_inode; -+ dentry_t *hidden_sto_dir_dentry; -+ dentry_t *hidden_sto_dentry; -+ -+ check_mini_fo_dentry(dentry); -+ -+ /* for now this function serves for both state DEL_REWRITTEN and -+ * CREATED */ -+ if(!(dtost(dentry) == CREATED || (dtost(dentry) == DEL_REWRITTEN)) || -+ S_ISDIR(dentry->d_inode->i_mode)) { -+ printk(KERN_CRIT "mini_fo: nondir_mod_to_del/del_rew_to_del: \ -+ wrong type or state.\n"); -+ err = -1; -+ goto out; -+ } -+ -+ hidden_sto_dir_inode = itohi2(dentry->d_parent->d_inode); -+ hidden_sto_dentry = dtohd2(dentry); -+ -+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry);*/ -+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent); -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ down(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ -+ /* avoid destroying the hidden inode if the file is in use */ -+ dget(hidden_sto_dentry); -+ err = vfs_unlink(hidden_sto_dir_inode, hidden_sto_dentry); -+ dput(hidden_sto_dentry); -+ if(!err) -+ d_delete(hidden_sto_dentry); -+ -+ /* propagate number of hard-links */ -+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink; -+ -+ dtost(dentry) = NON_EXISTANT; -+ -+ /* was: unlock_dir(hidden_sto_dir_dentry); */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ dput(hidden_sto_dir_dentry); -+ -+ out: -+ return err; -+} -+ -+int nondir_mod_to_del(dentry_t *dentry) -+{ -+ int err; -+ dentry_t *hidden_sto_dentry; -+ inode_t *hidden_sto_dir_inode; -+ dentry_t *hidden_sto_dir_dentry; -+ -+ check_mini_fo_dentry(dentry); -+ -+ if(dtost(dentry) != MODIFIED || -+ S_ISDIR(dentry->d_inode->i_mode)) { -+ printk(KERN_CRIT "mini_fo: nondir_mod_to_del: \ -+ wrong type or state.\n"); -+ err = -1; -+ goto out; -+ } -+ -+ hidden_sto_dir_inode = itohi2(dentry->d_parent->d_inode); -+ hidden_sto_dentry = dtohd2(dentry); -+ -+ /* was hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */ -+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent); -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ down(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ -+ /* avoid destroying the hidden inode if the file is in use */ -+ dget(hidden_sto_dentry); -+ err = vfs_unlink(hidden_sto_dir_inode, hidden_sto_dentry); -+ dput(hidden_sto_dentry); -+ if(!err) -+ d_delete(hidden_sto_dentry); -+ -+ /* propagate number of hard-links */ -+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink; -+ -+ /* dput base dentry, this will relase the inode and free the -+ * dentry, as we will never need it again. */ -+ dput(dtohd(dentry)); -+ dtohd(dentry) = NULL; -+ dtost(dentry) = DELETED; -+ -+ /* add deleted file to META-file */ -+ meta_add_d_entry(dentry->d_parent, -+ dentry->d_name.name, -+ dentry->d_name.len); -+ -+ /* was: unlock_dir(hidden_sto_dir_dentry); */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) -+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex); -+#else -+ up(&hidden_sto_dir_dentry->d_inode->i_sem); -+#endif -+ dput(hidden_sto_dir_dentry); -+ -+ out: -+ return err; -+} -+ -+int nondir_unmod_to_del(dentry_t *dentry) -+{ -+ int err = 0; -+ -+ check_mini_fo_dentry(dentry); -+ -+ if(dtost(dentry) != UNMODIFIED || -+ S_ISDIR(dentry->d_inode->i_mode)) { -+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_del: \ -+ wrong type or state.\n"); -+ err = -1; -+ goto out; -+ } -+ -+ /* next we have to get a negative dentry for the storage file */ -+ err = get_neg_sto_dentry(dentry); -+ -+ if(err) -+ goto out; -+ -+ /* add deleted file to META lists */ -+ err = meta_add_d_entry(dentry->d_parent, -+ dentry->d_name.name, -+ dentry->d_name.len); -+ -+ if(err) -+ goto out; -+ -+ /* dput base dentry, this will relase the inode and free the -+ * dentry, as we will never need it again. */ -+ dput(dtohd(dentry)); -+ dtohd(dentry) = NULL; -+ dtost(dentry) = DELETED; -+ -+ out: -+ return err; -+} -+ -+/* bring a dir from state UNMODIFIED to MODIFIED */ -+int dir_unmod_to_mod(dentry_t *dentry) -+{ -+ int err; -+ -+ check_mini_fo_dentry(dentry); -+ -+ if(dtost(dentry) != UNMODIFIED || -+ !S_ISDIR(dentry->d_inode->i_mode)) { -+ printk(KERN_CRIT "mini_fo: dir_unmod_to_mod: \ -+ wrong type or state.\n"); -+ err = -1; -+ goto out; -+ } -+ -+ /* this creates our dir incl. sto. structure */ -+ err = build_sto_structure(dentry->d_parent, dentry); -+ if(err) { -+ printk(KERN_CRIT "mini_fo: dir_unmod_to_mod: \ -+ build_sto_structure failed.\n"); -+ goto out; -+ } -+ out: -+ return err; -+} -+ ---- /dev/null -+++ b/fs/mini_fo/super.c -@@ -0,0 +1,281 @@ -+/* -+ * Copyright (c) 1997-2003 Erez Zadok -+ * Copyright (c) 2001-2003 Stony Brook University -+ * -+ * For specific licensing information, see the COPYING file distributed with -+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING. -+ * -+ * This Copyright notice must be kept intact and distributed with all -+ * fistgen sources INCLUDING sources generated by fistgen. -+ */ -+/* -+ * Copyright (C) 2004, 2005 Markus Klotzbuecher -+ * -+ * 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. -+ */ -+ -+/* -+ * $Id$ -+ */ -+ -+#ifdef HAVE_CONFIG_H -+# include -+#endif -+ -+#include "fist.h" -+#include "mini_fo.h" -+ -+ -+STATIC void -+mini_fo_read_inode(inode_t *inode) -+{ -+ static struct address_space_operations mini_fo_empty_aops; -+ -+ __itopd(inode) = kmalloc(sizeof(struct mini_fo_inode_info), GFP_KERNEL); -+ if (!itopd(inode)) { -+ printk("<0>%s:%s:%d: No kernel memory!\n", __FILE__, __FUNCTION__, __LINE__); -+ ASSERT(NULL); -+ } -+ itohi(inode) = NULL; -+ itohi2(inode) = NULL; -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+ inode->i_version++; -+#else -+ inode->i_version = ++event; /* increment inode version */ -+#endif -+ inode->i_op = &mini_fo_main_iops; -+ inode->i_fop = &mini_fo_main_fops; -+#if 0 -+ /* -+ * XXX: To export a file system via NFS, it has to have the -+ * FS_REQUIRES_DEV flag, so turn it on. But should we inherit it from -+ * the lower file system, or can we allow our file system to be exported -+ * even if the lower one cannot be natively exported. -+ */ -+ inode->i_sb->s_type->fs_flags |= FS_REQUIRES_DEV; -+ /* -+ * OK, the above was a hack, which is now turned off because it may -+ * cause a panic/oops on some systems. The correct way to export a -+ * "nodev" filesystem is via using nfs-utils > 1.0 and the "fsid=" export -+ * parameter, which requires 2.4.20 or later. -+ */ -+#endif -+ /* I don't think ->a_ops is ever allowed to be NULL */ -+ inode->i_mapping->a_ops = &mini_fo_empty_aops; -+} -+ -+ -+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) -+/* -+ * No need to call write_inode() on the lower inode, as it -+ * will have been marked 'dirty' anyway. But we might need -+ * to write some of our own stuff to disk. -+ */ -+STATIC void -+mini_fo_write_inode(inode_t *inode, int sync) -+{ -+ print_entry_location(); -+ print_exit_location(); -+} -+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */ -+ -+ -+STATIC void -+mini_fo_put_inode(inode_t *inode) -+{ -+ /* -+ * This is really funky stuff: -+ * Basically, if i_count == 1, iput will then decrement it and this inode will be destroyed. -+ * It is currently holding a reference to the hidden inode. -+ * Therefore, it needs to release that reference by calling iput on the hidden inode. -+ * iput() _will_ do it for us (by calling our clear_inode), but _only_ if i_nlink == 0. -+ * The problem is, NFS keeps i_nlink == 1 for silly_rename'd files. -+ * So we must for our i_nlink to 0 here to trick iput() into calling our clear_inode. -+ */ -+ if (atomic_read(&inode->i_count) == 1) -+ inode->i_nlink = 0; -+} -+ -+ -+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) -+/* -+ * we now define delete_inode, because there are two VFS paths that may -+ * destroy an inode: one of them calls clear inode before doing everything -+ * else that's needed, and the other is fine. This way we truncate the inode -+ * size (and its pages) and then clear our own inode, which will do an iput -+ * on our and the lower inode. -+ */ -+STATIC void -+mini_fo_delete_inode(inode_t *inode) -+{ -+ print_entry_location(); -+ -+ fist_checkinode(inode, "mini_fo_delete_inode IN"); -+ inode->i_size = 0; /* every f/s seems to do that */ -+ clear_inode(inode); -+ -+ print_exit_location(); -+} -+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */ -+ -+ -+/* final actions when unmounting a file system */ -+STATIC void -+mini_fo_put_super(super_block_t *sb) -+{ -+ if (stopd(sb)) { -+ mntput(stopd(sb)->hidden_mnt); -+ mntput(stopd(sb)->hidden_mnt2); -+ -+ /* mk: no! dput(stopd(sb)->base_dir_dentry); -+ dput(stopd(sb)->storage_dir_dentry); */ -+ -+ kfree(stopd(sb)); -+ __stopd(sb) = NULL; -+ } -+} -+ -+ -+#ifdef NOT_NEEDED -+/* -+ * This is called in do_umount before put_super. -+ * The superblock lock is not held yet. -+ * We probably do not need to define this or call write_super -+ * on the hidden_sb, because sync_supers() will get to hidden_sb -+ * sooner or later. But it is also called from file_fsync()... -+ */ -+STATIC void -+mini_fo_write_super(super_block_t *sb) -+{ -+ return; -+} -+#endif /* NOT_NEEDED */ -+ -+ -+STATIC int -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) -+mini_fo_statfs(struct dentry *d, struct kstatfs *buf) -+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -+mini_fo_statfs(super_block_t *sb, struct kstatfs *buf) -+#else -+mini_fo_statfs(super_block_t *sb, struct statfs *buf) -+#endif -+{ -+ int err = 0; -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) -+ struct dentry *hidden_d; -+ -+ hidden_d = dtohd(d); -+ err = vfs_statfs(hidden_d, buf); -+#else -+ super_block_t *hidden_sb; -+ -+ hidden_sb = stohs(sb); -+ err = vfs_statfs(hidden_sb, buf); -+#endif -+ -+ return err; -+} -+ -+ -+/* -+ * XXX: not implemented. This is not allowed yet. -+ * Should we call this on the hidden_sb? Probably not. -+ */ -+STATIC int -+mini_fo_remount_fs(super_block_t *sb, int *flags, char *data) -+{ -+ //printk(KERN_CRIT "mini_fo_remount_fs: WARNING, this function is umimplemented.\n"); -+ return -ENOSYS; -+} -+ -+ -+/* -+ * Called by iput() when the inode reference count reached zero -+ * and the inode is not hashed anywhere. Used to clear anything -+ * that needs to be, before the inode is completely destroyed and put -+ * on the inode free list. -+ */ -+STATIC void -+mini_fo_clear_inode(inode_t *inode) -+{ -+ /* -+ * Decrement a reference to a hidden_inode, which was incremented -+ * by our read_inode when it was created initially. -+ */ -+ -+ /* release the wol_list */ -+ if(S_ISDIR(inode->i_mode)) { -+ __meta_put_lists(inode); -+ } -+ -+ /* mk: fan out fun */ -+ if(itohi(inode)) -+ iput(itohi(inode)); -+ if(itohi2(inode)) -+ iput(itohi2(inode)); -+ -+ // XXX: why this assertion fails? -+ // because it doesn't like us -+ // ASSERT((inode->i_state & I_DIRTY) == 0); -+ kfree(itopd(inode)); -+ __itopd(inode) = NULL; -+} -+ -+ -+/* -+ * Called in do_umount() if the MNT_FORCE flag was used and this -+ * function is defined. See comment in linux/fs/super.c:do_umount(). -+ * Used only in nfs, to kill any pending RPC tasks, so that subsequent -+ * code can actually succeed and won't leave tasks that need handling. -+ * -+ * PS. I wonder if this is somehow useful to undo damage that was -+ * left in the kernel after a user level file server (such as amd) -+ * dies. -+ */ -+STATIC void -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) -+mini_fo_umount_begin(struct vfsmount *mnt, int flags) -+{ -+ struct vfsmount *hidden_mnt; -+ -+ hidden_mnt = stopd(mnt->mnt_sb)->hidden_mnt; -+ -+ if (hidden_mnt->mnt_sb->s_op->umount_begin) -+ hidden_mnt->mnt_sb->s_op->umount_begin(hidden_mnt, flags); -+ -+} -+#else -+mini_fo_umount_begin(super_block_t *sb) -+{ -+ super_block_t *hidden_sb; -+ -+ hidden_sb = stohs(sb); -+ -+ if (hidden_sb->s_op->umount_begin) -+ hidden_sb->s_op->umount_begin(hidden_sb); -+ -+} -+#endif -+ -+ -+struct super_operations mini_fo_sops = -+{ -+ read_inode: mini_fo_read_inode, -+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) -+ write_inode: mini_fo_write_inode, -+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */ -+ put_inode: mini_fo_put_inode, -+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) -+ delete_inode: mini_fo_delete_inode, -+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */ -+ put_super: mini_fo_put_super, -+ statfs: mini_fo_statfs, -+ remount_fs: mini_fo_remount_fs, -+ clear_inode: mini_fo_clear_inode, -+ umount_begin: mini_fo_umount_begin, -+}; diff --git a/target/linux/generic-2.6/patches-2.6.21/210-d80211_compat.patch b/target/linux/generic-2.6/patches-2.6.21/210-d80211_compat.patch deleted file mode 100644 index 7b3a9ac4b..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/210-d80211_compat.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -532,6 +532,8 @@ struct net_device - struct device dev; - /* space for optional statistics and wireless sysfs groups */ - struct attribute_group *sysfs_groups[3]; -+ -+ void *ieee80211_ptr; - }; - #define to_net_dev(d) container_of(d, struct net_device, dev) - diff --git a/target/linux/generic-2.6/patches-2.6.21/211-no_block2mtd_readahead.patch b/target/linux/generic-2.6/patches-2.6.21/211-no_block2mtd_readahead.patch deleted file mode 100644 index 1126910e6..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/211-no_block2mtd_readahead.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/drivers/mtd/devices/block2mtd.c -+++ b/drivers/mtd/devices/block2mtd.c -@@ -41,7 +41,7 @@ struct block2mtd_dev { - static LIST_HEAD(blkmtd_device_list); - - --#define PAGE_READAHEAD 64 -+#define PAGE_READAHEAD 0 - static void cache_readahead(struct address_space *mapping, int index) - { - filler_t *filler = (filler_t*)mapping->a_ops->readpage; diff --git a/target/linux/generic-2.6/patches-2.6.21/212-block2mtd_erase_scan.patch b/target/linux/generic-2.6/patches-2.6.21/212-block2mtd_erase_scan.patch deleted file mode 100644 index cfd72b610..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/212-block2mtd_erase_scan.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/drivers/mtd/devices/block2mtd.c -+++ b/drivers/mtd/devices/block2mtd.c -@@ -112,7 +112,7 @@ static int _block2mtd_erase(struct block - if (IS_ERR(page)) - return PTR_ERR(page); - -- max = (u_long*)page_address(page) + PAGE_SIZE; -+ max = (u_long*) ((u8 *) page_address(page) + PAGE_SIZE); - for (p=(u_long*)page_address(page); p %s depth %d", - linetype_name[lineval], -@@ -526,7 +526,7 @@ process(void) - * help from skipcomment(). - */ - static Linetype --getline(void) -+get_line(void) - { - const char *cp; - int cursym; diff --git a/target/linux/generic-2.6/patches-2.6.21/31-use_kbuild.h.patch b/target/linux/generic-2.6/patches-2.6.21/31-use_kbuild.h.patch deleted file mode 100644 index 45c753b55..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/31-use_kbuild.h.patch +++ /dev/null @@ -1,21 +0,0 @@ -[MIPS] Fix computation of {PGD,PMD,PTE}_T_LOG2. - -For the generation of asm-offset.h to work these need to be evaulatable -by gcc as a constant expression. This issue did exist for a while but -didn't bite because they're only in asm-offset.h for debugging purposes. - ---- a/include/asm-mips/pgtable.h -+++ b/include/asm-mips/pgtable.h -@@ -168,9 +168,9 @@ static inline void pte_clear(struct mm_s - #define set_pud(pudptr, pudval) do { *(pudptr) = (pudval); } while(0) - #endif - --#define PGD_T_LOG2 ffz(~sizeof(pgd_t)) --#define PMD_T_LOG2 ffz(~sizeof(pmd_t)) --#define PTE_T_LOG2 ffz(~sizeof(pte_t)) -+#define PGD_T_LOG2 (__builtin_ffs(sizeof(pgd_t)) - 1) -+#define PMD_T_LOG2 (__builtin_ffs(sizeof(pmd_t)) - 1) -+#define PTE_T_LOG2 (__builtin_ffs(sizeof(pte_t)) - 1) - - extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; - diff --git a/target/linux/generic-2.6/patches-2.6.21/32-time_fix_timespec_add_ns.patch b/target/linux/generic-2.6/patches-2.6.21/32-time_fix_timespec_add_ns.patch deleted file mode 100644 index 378ee28ed..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/32-time_fix_timespec_add_ns.patch +++ /dev/null @@ -1,17 +0,0 @@ -time: prevent the loop in timespec_add_ns() from being optimised away - -Since some architectures don't support __udivdi3(). - ---- a/include/linux/time.h -+++ b/include/linux/time.h -@@ -170,6 +170,10 @@ static inline void timespec_add_ns(struc - { - ns += a->tv_nsec; - while(unlikely(ns >= NSEC_PER_SEC)) { -+ /* The following asm() prevents the compiler from -+ * optimising this loop into a modulo operation. */ -+ asm("" : "+r"(ns)); -+ - ns -= NSEC_PER_SEC; - a->tv_sec++; - } diff --git a/target/linux/generic-2.6/patches-2.6.21/420-gpiodev.patch b/target/linux/generic-2.6/patches-2.6.21/420-gpiodev.patch deleted file mode 100644 index 8c5ef70da..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/420-gpiodev.patch +++ /dev/null @@ -1,26 +0,0 @@ ---- a/drivers/char/Kconfig -+++ b/drivers/char/Kconfig -@@ -984,6 +984,13 @@ config CS5535_GPIO - - If compiled as a module, it will be called cs5535_gpio. - -+config GPIO_DEVICE -+ tristate "GPIO device support" -+ depends on GENERIC_GPIO -+ help -+ Say Y to enable Linux GPIO device support. This allows control of -+ GPIO pins using a character device -+ - config GPIO_VR41XX - tristate "NEC VR4100 series General-purpose I/O Unit support" - depends on CPU_VR41XX ---- a/drivers/char/Makefile -+++ b/drivers/char/Makefile -@@ -90,6 +90,7 @@ obj-$(CONFIG_SCx200_GPIO) += scx200_gpio - obj-$(CONFIG_PC8736x_GPIO) += pc8736x_gpio.o - obj-$(CONFIG_NSC_GPIO) += nsc_gpio.o - obj-$(CONFIG_CS5535_GPIO) += cs5535_gpio.o -+obj-$(CONFIG_GPIO_DEVICE) += gpio_dev.o - obj-$(CONFIG_GPIO_VR41XX) += vr41xx_giu.o - obj-$(CONFIG_TANBAC_TB0219) += tb0219.o - obj-$(CONFIG_TELCLOCK) += tlclk.o diff --git a/target/linux/generic-2.6/patches-2.6.21/510-yaffs_support.patch b/target/linux/generic-2.6/patches-2.6.21/510-yaffs_support.patch deleted file mode 100644 index 07c58b378..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/510-yaffs_support.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- a/fs/Kconfig -+++ b/fs/Kconfig -@@ -419,6 +419,7 @@ config FS_POSIX_ACL - - source "fs/xfs/Kconfig" - source "fs/gfs2/Kconfig" -+source "fs/yaffs2/Kconfig" - - config OCFS2_FS - tristate "OCFS2 file system support" ---- a/fs/Makefile -+++ b/fs/Makefile -@@ -116,3 +116,4 @@ obj-$(CONFIG_HPPFS) += hppfs/ - obj-$(CONFIG_DEBUG_FS) += debugfs/ - obj-$(CONFIG_OCFS2_FS) += ocfs2/ - obj-$(CONFIG_GFS2_FS) += gfs2/ -+obj-$(CONFIG_YAFFS_FS) += yaffs2/ diff --git a/target/linux/generic-2.6/patches-2.6.21/511-yaffs_reduce_compiler_warnings.patch b/target/linux/generic-2.6/patches-2.6.21/511-yaffs_reduce_compiler_warnings.patch deleted file mode 100644 index 298ad4b73..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/511-yaffs_reduce_compiler_warnings.patch +++ /dev/null @@ -1,80 +0,0 @@ ---- a/fs/yaffs2/yaffs_fs.c -+++ b/fs/yaffs2/yaffs_fs.c -@@ -965,7 +965,7 @@ static int yaffs_readdir(struct file *f, - f->f_version = inode->i_version; - } - -- list_for_each(i, &obj->variant.directoryVariant.children) { -+ list_for_each(i, (struct list_head *)&obj->variant.directoryVariant.children) { - curoffs++; - if (curoffs >= offset) { - l = list_entry(i, yaffs_Object, siblings); -@@ -1269,7 +1269,7 @@ static int yaffs_rename(struct inode *ol - - if (target && - target->variantType == YAFFS_OBJECT_TYPE_DIRECTORY && -- !list_empty(&target->variant.directoryVariant.children)) { -+ !list_empty((struct list_head *)&target->variant.directoryVariant.children)) { - - T(YAFFS_TRACE_OS, (KERN_DEBUG "target is non-empty dir\n")); - -@@ -1503,7 +1503,7 @@ static void yaffs_put_super(struct super - yaffs_GrossUnlock(dev); - - /* we assume this is protected by lock_kernel() in mount/umount */ -- list_del(&dev->devList); -+ list_del((struct list_head *)&dev->devList); - - if(dev->spareBuffer){ - YFREE(dev->spareBuffer); -@@ -1847,7 +1847,7 @@ static struct super_block *yaffs_interna - dev->skipCheckpointWrite = options.skip_checkpoint_write; - - /* we assume this is protected by lock_kernel() in mount/umount */ -- list_add_tail(&dev->devList, &yaffs_dev_list); -+ list_add_tail((struct list_head *)&dev->devList, &yaffs_dev_list); - - init_MUTEX(&dev->grossLock); - ---- a/fs/yaffs2/yaffs_mtdif1.c -+++ b/fs/yaffs2/yaffs_mtdif1.c -@@ -323,7 +323,7 @@ static int nandmtd1_TestPrerequists(stru - * Always returns YAFFS_OK. - */ - int nandmtd1_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, -- yaffs_BlockState * pState, int *pSequenceNumber) -+ yaffs_BlockState * pState, __u32 *pSequenceNumber) - { - struct mtd_info * mtd = dev->genericDevice; - int chunkNo = blockNo * dev->nChunksPerBlock; ---- a/fs/yaffs2/yaffs_mtdif1.h -+++ b/fs/yaffs2/yaffs_mtdif1.h -@@ -23,6 +23,6 @@ int nandmtd1_ReadChunkWithTagsFromNAND(y - int nandmtd1_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo); - - int nandmtd1_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, -- yaffs_BlockState * state, int *sequenceNumber); -+ yaffs_BlockState * state, __u32 *sequenceNumber); - - #endif ---- a/fs/yaffs2/yaffs_mtdif2.c -+++ b/fs/yaffs2/yaffs_mtdif2.c -@@ -188,7 +188,7 @@ int nandmtd2_MarkNANDBlockBad(struct yaf - } - - int nandmtd2_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, -- yaffs_BlockState * state, int *sequenceNumber) -+ yaffs_BlockState * state, __u32 *sequenceNumber) - { - struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); - int retval; ---- a/fs/yaffs2/yaffs_mtdif2.h -+++ b/fs/yaffs2/yaffs_mtdif2.h -@@ -24,6 +24,6 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y - __u8 * data, yaffs_ExtendedTags * tags); - int nandmtd2_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo); - int nandmtd2_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, -- yaffs_BlockState * state, int *sequenceNumber); -+ yaffs_BlockState * state, __u32 *sequenceNumber); - - #endif diff --git a/target/linux/generic-2.6/patches-2.6.21/900-headers_type_and_time.patch b/target/linux/generic-2.6/patches-2.6.21/900-headers_type_and_time.patch deleted file mode 100644 index 8d748598e..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/900-headers_type_and_time.patch +++ /dev/null @@ -1,46 +0,0 @@ ---- a/include/linux/time.h -+++ b/include/linux/time.h -@@ -1,6 +1,10 @@ - #ifndef _LINUX_TIME_H - #define _LINUX_TIME_H - -+#ifndef __KERNEL__ -+#include -+#else -+ - #include - - #ifdef __KERNEL__ -@@ -228,4 +232,6 @@ struct itimerval { - */ - #define TIMER_ABSTIME 0x01 - -+#endif /* __KERNEL__ DEBIAN */ -+ - #endif ---- a/include/linux/types.h -+++ b/include/linux/types.h -@@ -1,6 +1,14 @@ - #ifndef _LINUX_TYPES_H - #define _LINUX_TYPES_H - -+/* Debian: Use userland types instead. */ -+#ifndef __KERNEL__ -+# include -+/* For other kernel headers. */ -+# include -+# include -+#else -+ - #ifdef __KERNEL__ - - #define BITS_TO_LONGS(bits) \ -@@ -162,6 +170,8 @@ typedef unsigned long blkcnt_t; - - #endif /* __KERNEL_STRICT_NAMES */ - -+#endif /* __KERNEL__ DEBIAN */ -+ - /* - * Below are truly Linux-specific types that should never collide with - * any application/library that wants linux/types.h. diff --git a/target/linux/generic-2.6/patches-2.6.21/902-darwin_scripts_include.patch b/target/linux/generic-2.6/patches-2.6.21/902-darwin_scripts_include.patch deleted file mode 100644 index 8c22743d7..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/902-darwin_scripts_include.patch +++ /dev/null @@ -1,138 +0,0 @@ ---- a/scripts/genksyms/parse.c_shipped -+++ b/scripts/genksyms/parse.c_shipped -@@ -144,7 +144,9 @@ - - - #include -+#ifndef __APPLE__ - #include -+#endif - #include "genksyms.h" - - static int is_typedef; ---- a/scripts/genksyms/parse.y -+++ b/scripts/genksyms/parse.y -@@ -24,7 +24,9 @@ - %{ - - #include -+#ifndef __APPLE__ - #include -+#endif - #include "genksyms.h" - - static int is_typedef; ---- a/scripts/kallsyms.c -+++ b/scripts/kallsyms.c -@@ -30,6 +30,35 @@ - #include - #include - #include -+#ifdef __APPLE__ -+/* Darwin has no memmem implementation, this one is ripped of the uClibc-0.9.28 source */ -+void *memmem (const void *haystack, size_t haystack_len, -+ const void *needle, size_t needle_len) -+{ -+ const char *begin; -+ const char *const last_possible -+ = (const char *) haystack + haystack_len - needle_len; -+ -+ if (needle_len == 0) -+ /* The first occurrence of the empty string is deemed to occur at -+ the beginning of the string. */ -+ return (void *) haystack; -+ -+ /* Sanity check, otherwise the loop might search through the whole -+ memory. */ -+ if (__builtin_expect (haystack_len < needle_len, 0)) -+ return NULL; -+ -+ for (begin = (const char *) haystack; begin <= last_possible; ++begin) -+ if (begin[0] == ((const char *) needle)[0] && -+ !memcmp ((const void *) &begin[1], -+ (const void *) ((const char *) needle + 1), -+ needle_len - 1)) -+ return (void *) begin; -+ -+ return NULL; -+} -+#endif - - #define KSYM_NAME_LEN 127 - ---- a/scripts/kconfig/Makefile -+++ b/scripts/kconfig/Makefile -@@ -87,6 +87,9 @@ check-lxdialog := $(srctree)/$(src)/lxd - # we really need to do so. (Do not call gcc as part of make mrproper) - HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags) - HOST_LOADLIBES = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC)) -+ifeq ($(shell uname -s),Darwin) -+HOST_LOADLIBES += -lncurses -+endif - - HOST_EXTRACFLAGS += -DLOCALE - ---- a/scripts/mod/file2alias.c -+++ b/scripts/mod/file2alias.c -@@ -37,7 +37,21 @@ typedef unsigned char __u8; - * even potentially has different endianness and word sizes, since - * we handle those differences explicitly below */ - #include "../../include/linux/mod_devicetable.h" -+#ifndef __APPLE__ - #include "../../include/linux/input.h" -+#else -+#define EV_MAX 0x1f -+#define KEY_MUTE 113 -+#define KEY_MIN_INTERESTING KEY_MUTE -+#define KEY_MAX 0x1ff -+#define REL_MAX 0x0f -+#define ABS_MAX 0x3f -+#define MSC_MAX 0x07 -+#define LED_MAX 0x0f -+#define SND_MAX 0x07 -+#define FF_MAX 0x7f -+#define SW_MAX 0x0f -+#endif - - #define ADD(str, sep, cond, field) \ - do { \ ---- a/scripts/mod/mk_elfconfig.c -+++ b/scripts/mod/mk_elfconfig.c -@@ -1,7 +1,11 @@ - #include - #include - #include -+#ifndef __APPLE__ - #include -+#else -+#include "../../../../../tools/sstrip/include/elf.h" -+#endif - - int - main(int argc, char **argv) ---- a/scripts/mod/modpost.h -+++ b/scripts/mod/modpost.h -@@ -7,7 +7,11 @@ - #include - #include - #include -+#if !(defined(__APPLE__) || defined(__CYGWIN__)) - #include -+#else -+#include "../../../../../tools/sstrip/include/elf.h" -+#endif - - #include "elfconfig.h" - ---- a/scripts/mod/sumversion.c -+++ b/scripts/mod/sumversion.c -@@ -8,6 +8,9 @@ - #include - #include - #include "modpost.h" -+#ifdef __APPLE__ -+#include -+#endif - - /* - * Stolen form Cryptographic API. diff --git a/target/linux/generic-2.6/patches-2.6.21/903-hostap_txpower.patch b/target/linux/generic-2.6/patches-2.6.21/903-hostap_txpower.patch deleted file mode 100644 index e2fd07caf..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/903-hostap_txpower.patch +++ /dev/null @@ -1,154 +0,0 @@ ---- a/drivers/net/wireless/hostap/hostap_ap.c -+++ b/drivers/net/wireless/hostap/hostap_ap.c -@@ -2346,13 +2346,13 @@ int prism2_ap_get_sta_qual(local_info_t - addr[count].sa_family = ARPHRD_ETHER; - memcpy(addr[count].sa_data, sta->addr, ETH_ALEN); - if (sta->last_rx_silence == 0) -- qual[count].qual = sta->last_rx_signal < 27 ? -- 0 : (sta->last_rx_signal - 27) * 92 / 127; -+ qual[count].qual = (sta->last_rx_signal - 156) == 0 ? -+ 0 : (sta->last_rx_signal - 156) * 92 / 64; - else -- qual[count].qual = sta->last_rx_signal - -- sta->last_rx_silence - 35; -- qual[count].level = HFA384X_LEVEL_TO_dBm(sta->last_rx_signal); -- qual[count].noise = HFA384X_LEVEL_TO_dBm(sta->last_rx_silence); -+ qual[count].qual = (sta->last_rx_signal - -+ sta->last_rx_silence) * 92 / 64; -+ qual[count].level = sta->last_rx_signal; -+ qual[count].noise = sta->last_rx_silence; - qual[count].updated = sta->last_rx_updated; - - sta->last_rx_updated = IW_QUAL_DBM; -@@ -2417,13 +2417,13 @@ int prism2_ap_translate_scan(struct net_ - memset(&iwe, 0, sizeof(iwe)); - iwe.cmd = IWEVQUAL; - if (sta->last_rx_silence == 0) -- iwe.u.qual.qual = sta->last_rx_signal < 27 ? -- 0 : (sta->last_rx_signal - 27) * 92 / 127; -+ iwe.u.qual.qual = (sta->last_rx_signal -156) == 0 ? -+ 0 : (sta->last_rx_signal - 156) * 92 / 64; - else -- iwe.u.qual.qual = sta->last_rx_signal - -- sta->last_rx_silence - 35; -- iwe.u.qual.level = HFA384X_LEVEL_TO_dBm(sta->last_rx_signal); -- iwe.u.qual.noise = HFA384X_LEVEL_TO_dBm(sta->last_rx_silence); -+ iwe.u.qual.qual = (sta->last_rx_signal - -+ sta->last_rx_silence) * 92 / 64; -+ iwe.u.qual.level = sta->last_rx_signal; -+ iwe.u.qual.noise = sta->last_rx_silence; - iwe.u.qual.updated = sta->last_rx_updated; - iwe.len = IW_EV_QUAL_LEN; - current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, ---- a/drivers/net/wireless/hostap/hostap_config.h -+++ b/drivers/net/wireless/hostap/hostap_config.h -@@ -47,4 +47,9 @@ - */ - /* #define PRISM2_NO_STATION_MODES */ - -+/* Enable TX power Setting functions -+ * (min att = -128 , max att = 127) -+ */ -+#define RAW_TXPOWER_SETTING -+ - #endif /* HOSTAP_CONFIG_H */ ---- a/drivers/net/wireless/hostap/hostap.h -+++ b/drivers/net/wireless/hostap/hostap.h -@@ -90,6 +90,7 @@ extern const struct iw_handler_def hosta - extern const struct ethtool_ops prism2_ethtool_ops; - - int hostap_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); -+int hostap_restore_power(struct net_device *dev); - - - #endif /* HOSTAP_H */ ---- a/drivers/net/wireless/hostap/hostap_hw.c -+++ b/drivers/net/wireless/hostap/hostap_hw.c -@@ -933,6 +933,7 @@ static int hfa384x_set_rid(struct net_de - prism2_hw_reset(dev); - } - -+ hostap_restore_power(dev); - return res; - } - ---- a/drivers/net/wireless/hostap/hostap_info.c -+++ b/drivers/net/wireless/hostap/hostap_info.c -@@ -428,6 +428,11 @@ static void handle_info_queue_linkstatus - } - - /* Get BSSID if we have a valid AP address */ -+ -+ if ( val == HFA384X_LINKSTATUS_CONNECTED || -+ val == HFA384X_LINKSTATUS_DISCONNECTED ) -+ hostap_restore_power(local->dev); -+ - if (connected) { - netif_carrier_on(local->dev); - netif_carrier_on(local->ddev); ---- a/drivers/net/wireless/hostap/hostap_ioctl.c -+++ b/drivers/net/wireless/hostap/hostap_ioctl.c -@@ -1504,23 +1504,20 @@ static int prism2_txpower_hfa386x_to_dBm - val = 255; - - tmp = val; -- tmp >>= 2; - -- return -12 - tmp; -+ return tmp; - } - - static u16 prism2_txpower_dBm_to_hfa386x(int val) - { - signed char tmp; - -- if (val > 20) -- return 128; -- else if (val < -43) -+ if (val > 127) - return 127; -+ else if (val < -128) -+ return 128; - - tmp = val; -- tmp = -12 - tmp; -- tmp <<= 2; - - return (unsigned char) tmp; - } -@@ -4080,3 +4077,35 @@ int hostap_ioctl(struct net_device *dev, - - return ret; - } -+ -+/* BUG FIX: Restore power setting value when lost due to F/W bug */ -+ -+int hostap_restore_power(struct net_device *dev) -+{ -+ struct hostap_interface *iface = dev->priv; -+ local_info_t *local = iface->local; -+ -+ u16 val; -+ int ret = 0; -+ -+ if (local->txpower_type == PRISM2_TXPOWER_OFF) { -+ val = 0xff; /* use all standby and sleep modes */ -+ ret = local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF, -+ HFA386X_CR_A_D_TEST_MODES2, -+ &val, NULL); -+ } -+ -+#ifdef RAW_TXPOWER_SETTING -+ if (local->txpower_type == PRISM2_TXPOWER_FIXED) { -+ val = HFA384X_TEST_CFG_BIT_ALC; -+ local->func->cmd(dev, HFA384X_CMDCODE_TEST | -+ (HFA384X_TEST_CFG_BITS << 8), 0, &val, NULL); -+ val = prism2_txpower_dBm_to_hfa386x(local->txpower); -+ ret = (local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF, -+ HFA386X_CR_MANUAL_TX_POWER, &val, NULL)); -+ } -+#endif /* RAW_TXPOWER_SETTING */ -+ return (ret ? -EOPNOTSUPP : 0); -+} -+ -+EXPORT_SYMBOL(hostap_restore_power); diff --git a/target/linux/generic-2.6/patches-2.6.21/903-stddef_include.patch b/target/linux/generic-2.6/patches-2.6.21/903-stddef_include.patch deleted file mode 100644 index 7fe248d8d..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/903-stddef_include.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- a/include/linux/stddef.h -+++ b/include/linux/stddef.h -@@ -16,6 +16,7 @@ enum { - false = 0, - true = 1 - }; -+#endif /* __KERNEL__ */ - - #undef offsetof - #ifdef __compiler_offsetof -@@ -23,6 +24,5 @@ enum { - #else - #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) - #endif --#endif /* __KERNEL__ */ - - #endif diff --git a/target/linux/generic-2.6/patches-2.6.21/904-ls_time_locale.patch b/target/linux/generic-2.6/patches-2.6.21/904-ls_time_locale.patch deleted file mode 100644 index 8fc9381a6..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/904-ls_time_locale.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/scripts/gen_initramfs_list.sh -+++ b/scripts/gen_initramfs_list.sh -@@ -125,7 +125,7 @@ parse() { - str="${ftype} ${name} ${location} ${str}" - ;; - "nod") -- local dev=`LC_ALL=C ls -l "${location}"` -+ local dev=`LC_ALL=C ls -l --time-style=locale "${location}"` - local maj=`field 5 ${dev}` - local min=`field 6 ${dev}` - maj=${maj%,} -@@ -135,7 +135,7 @@ parse() { - str="${ftype} ${name} ${str} ${dev} ${maj} ${min}" - ;; - "slink") -- local target=`field 11 $(LC_ALL=C ls -l "${location}")` -+ local target=`field 11 $(LC_ALL=C ls -l --time-style=locale "${location}")` - str="${ftype} ${name} ${target} ${str}" - ;; - *) diff --git a/target/linux/generic-2.6/patches-2.6.21/990-buildfix.patch b/target/linux/generic-2.6/patches-2.6.21/990-buildfix.patch deleted file mode 100644 index 9b3152de0..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/990-buildfix.patch +++ /dev/null @@ -1,7 +0,0 @@ ---- a/scripts/mod/sumversion.c -+++ b/scripts/mod/sumversion.c -@@ -1,3 +1,4 @@ -+#include - #include - #ifdef __sun__ - #include diff --git a/target/linux/generic-2.6/patches-2.6.21/999-backport_ip_hdr_and_friends.patch b/target/linux/generic-2.6/patches-2.6.21/999-backport_ip_hdr_and_friends.patch deleted file mode 100644 index 9ec3b44db..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/999-backport_ip_hdr_and_friends.patch +++ /dev/null @@ -1,52 +0,0 @@ ---- a/include/linux/ip.h -+++ b/include/linux/ip.h -@@ -104,6 +104,16 @@ struct iphdr { - /*The options start here. */ - }; - -+#ifdef __KERNEL__ -+#include -+ -+static inline struct iphdr *ip_hdr(const struct sk_buff *skb) -+{ -+ return (struct iphdr *)skb_network_header(skb); -+} -+ -+#endif -+ - struct ip_auth_hdr { - __u8 nexthdr; - __u8 hdrlen; /* This one is measured in 32 bit units! */ ---- a/include/linux/skbuff.h -+++ b/include/linux/skbuff.h -@@ -966,6 +966,16 @@ static inline void skb_reserve(struct sk - skb->tail += len; - } - -+static inline unsigned char *skb_network_header(const struct sk_buff *skb) -+{ -+ return skb->nh.raw; -+} -+ -+static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb) -+{ -+ return skb->tail; -+} -+ - /* - * CPUs often take a performance hit when accessing unaligned memory - * locations. The actual performance hit varies, it can be small if the ---- a/include/net/ip.h -+++ b/include/net/ip.h -@@ -43,6 +43,11 @@ struct inet_skb_parm - #define IPSKB_REROUTED 16 - }; - -+static inline unsigned int ip_hdrlen(const struct sk_buff *skb) -+{ -+ return ip_hdr(skb)->ihl * 4; -+} -+ - struct ipcm_cookie - { - __be32 addr; diff --git a/target/linux/generic-2.6/patches-2.6.21/999-use_preinit_as_init.patch b/target/linux/generic-2.6/patches-2.6.21/999-use_preinit_as_init.patch deleted file mode 100644 index e38dfacfd..000000000 --- a/target/linux/generic-2.6/patches-2.6.21/999-use_preinit_as_init.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- a/init/main.c -+++ b/init/main.c -@@ -764,10 +764,7 @@ static int noinline init_post(void) - printk(KERN_WARNING "Failed to execute %s. Attempting " - "defaults...\n", execute_command); - } -- run_init_process("/sbin/init"); -- run_init_process("/etc/init"); -- run_init_process("/bin/init"); -- run_init_process("/bin/sh"); -+ run_init_process("/etc/preinit"); - - panic("No init found. Try passing init= option to kernel."); - } From 80f663be7614b223837ccda6767867b4ff32c894 Mon Sep 17 00:00:00 2001 From: kaloz Date: Thu, 11 Feb 2010 08:55:15 +0000 Subject: [PATCH 16/44] re-sort all target and subtarget config files git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19580 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/adm5120/router_be/config-2.6.32 | 26 +- target/linux/adm5120/router_le/config-2.6.32 | 45 +- target/linux/amazon/config-2.6.30 | 12 +- target/linux/amazon/config-2.6.32 | 12 +- target/linux/ar7/config-2.6.32 | 12 +- target/linux/ar71xx/config-2.6.32 | 26 +- target/linux/atheros/config-2.6.32 | 12 +- target/linux/au1000/au1500/config-2.6.32 | 12 +- target/linux/avr32/config-default | 20 +- target/linux/brcm47xx/config-2.6.32 | 20 +- target/linux/ep93xx/config-2.6.30 | 50 +- target/linux/etrax/config-default | 20 +- target/linux/generic-2.6/config-2.6.30 | 9 +- target/linux/generic-2.6/config-2.6.31 | 9 +- target/linux/generic-2.6/config-2.6.32 | 17 +- target/linux/iop32x/config-default | 19 +- target/linux/mpc52xx/config-2.6.30 | 2 +- target/linux/mpc83xx/config-default | 35 +- target/linux/octeon/config-2.6.30 | 48 +- target/linux/omap35xx/config-2.6.32 | 3439 ++++++++---------- target/linux/pxa/config-default | 28 +- target/linux/ramips/rt288x/config-2.6.32 | 12 +- target/linux/ramips/rt305x/config-2.6.32 | 10 +- target/linux/rb532/config-default | 19 +- target/linux/rdc/bifferboard/config-2.6.30 | 2 +- target/linux/rdc/config-2.6.30 | 6 +- target/linux/sibyte/config-default | 26 +- target/linux/ubicom32/config-2.6.30 | 40 +- target/linux/xburst/config-2.6.32 | 72 +- 29 files changed, 1845 insertions(+), 2215 deletions(-) diff --git a/target/linux/adm5120/router_be/config-2.6.32 b/target/linux/adm5120/router_be/config-2.6.32 index 7bba47a6e..2a5e407a3 100644 --- a/target/linux/adm5120/router_be/config-2.6.32 +++ b/target/linux/adm5120/router_be/config-2.6.32 @@ -1,6 +1,5 @@ CONFIG_32BIT=y # CONFIG_64BIT is not set -CONFIG_ADM5120=y CONFIG_ADM5120_ENET=y CONFIG_ADM5120_MACH_5GXI=y CONFIG_ADM5120_MACH_P_334WT=y @@ -15,6 +14,7 @@ CONFIG_ADM5120_OEM_OSBRIDGE=y CONFIG_ADM5120_OEM_ZYXEL=y CONFIG_ADM5120_SOC_BGA=y CONFIG_ADM5120_WDT=y +CONFIG_ADM5120=y # CONFIG_ALCHEMY_GPIO_INDIRECT is not set # CONFIG_AR7 is not set # CONFIG_ARCH_HAS_ILOG2_U32 is not set @@ -33,8 +33,8 @@ CONFIG_BITREVERSE=y # CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set # CONFIG_CAVIUM_OCTEON_SIMULATOR is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y -CONFIG_CEVT_R4K=y CONFIG_CEVT_R4K_LIB=y +CONFIG_CEVT_R4K=y CONFIG_CFG80211_DEFAULT_PS_VALUE=0 CONFIG_CMDLINE="console=ttyS0,115200 rootfstype=squashfs,jffs2" CONFIG_CPU_BIG_ENDIAN=y @@ -43,9 +43,9 @@ CONFIG_CPU_HAS_PREFETCH=y CONFIG_CPU_HAS_SYNC=y # CONFIG_CPU_LITTLE_ENDIAN is not set # CONFIG_CPU_LOONGSON2E is not set -CONFIG_CPU_MIPS32=y CONFIG_CPU_MIPS32_R1=y # CONFIG_CPU_MIPS32_R2 is not set +CONFIG_CPU_MIPS32=y # CONFIG_CPU_MIPS64_R1 is not set # CONFIG_CPU_MIPS64_R2 is not set CONFIG_CPU_MIPSR1=y @@ -67,8 +67,8 @@ CONFIG_CPU_SUPPORTS_HIGHMEM=y # CONFIG_CPU_TX39XX is not set # CONFIG_CPU_TX49XX is not set # CONFIG_CPU_VR41XX is not set -CONFIG_CSRC_R4K=y CONFIG_CSRC_R4K_LIB=y +CONFIG_CSRC_R4K=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DEVPORT=y # CONFIG_DM9000 is not set @@ -79,8 +79,8 @@ CONFIG_ELF_CORE=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_FS_POSIX_ACL=y CONFIG_GENERIC_ACL=y -CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y @@ -101,21 +101,21 @@ CONFIG_HID=m CONFIG_HID_SUPPORT=y CONFIG_HW_HAS_PCI=y CONFIG_HW_RANDOM=y -CONFIG_HZ=250 # CONFIG_HZ_100 is not set +CONFIG_HZ=250 CONFIG_HZ_250=y CONFIG_INITRAMFS_SOURCE="" -CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y -CONFIG_INPUT=m +CONFIG_INOTIFY=y # CONFIG_INPUT_GPIO_BUTTONS is not set +CONFIG_INPUT=m # CONFIG_INPUT_YEALINK is not set CONFIG_IRQ_CPU=y # CONFIG_ISDN is not set CONFIG_LEDS_GPIO=m CONFIG_LEDS_TRIGGER_ADM5120_SWITCH=m -CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 +CONFIG_LEGACY_PTYS=y # CONFIG_MACH_ALCHEMY is not set # CONFIG_MACH_DECSTATION is not set # CONFIG_MACH_JAZZ is not set @@ -125,7 +125,6 @@ CONFIG_LEGACY_PTY_COUNT=256 # CONFIG_MACH_VR41XX is not set CONFIG_MII=m # CONFIG_MIKROTIK_RB532 is not set -CONFIG_MIPS=y # CONFIG_MIPS_COBALT is not set CONFIG_MIPS_L1_CACHE_SHIFT=5 CONFIG_MIPS_MACHINE=y @@ -134,6 +133,7 @@ CONFIG_MIPS_MT_DISABLED=y # CONFIG_MIPS_MT_SMP is not set # CONFIG_MIPS_MT_SMTC is not set # CONFIG_MIPS_SIM is not set +CONFIG_MIPS=y CONFIG_MODULE_FORCE_UNLOAD=y CONFIG_MTD_ADM5120=y CONFIG_MTD_BLOCK2MTD=y @@ -158,18 +158,18 @@ CONFIG_PCI_DOMAINS=y CONFIG_SCHED_OMIT_FRAME_POINTER=y # CONFIG_SCSI_DMA is not set # CONFIG_SERIAL_8250 is not set -CONFIG_SERIAL_AMBA_PL010=y CONFIG_SERIAL_AMBA_PL010_CONSOLE=y CONFIG_SERIAL_AMBA_PL010_NUMPORTS=2 CONFIG_SERIAL_AMBA_PL010_PORTNAME="ttyS" +CONFIG_SERIAL_AMBA_PL010=y # CONFIG_SERIAL_AMBA_PL011 is not set -CONFIG_SERIO=y # CONFIG_SERIO_AMBAKMI is not set # CONFIG_SERIO_I8042 is not set # CONFIG_SERIO_LIBPS2 is not set # CONFIG_SERIO_PCIPS2 is not set # CONFIG_SERIO_RAW is not set CONFIG_SERIO_SERPORT=y +CONFIG_SERIO=y # CONFIG_SGI_IP22 is not set # CONFIG_SGI_IP27 is not set # CONFIG_SGI_IP28 is not set @@ -196,10 +196,10 @@ CONFIG_TMPFS_POSIX_ACL=y CONFIG_TRAD_SIGNALS=y # CONFIG_TREE_PREEMPT_RCU is not set CONFIG_TREE_RCU=y -CONFIG_USB=m CONFIG_USB_ADM5120_HCD=m CONFIG_USB_DEBUG=y CONFIG_USB_EHCI_HCD=m +CONFIG_USB=m # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set CONFIG_USB_OHCI_HCD=m diff --git a/target/linux/adm5120/router_le/config-2.6.32 b/target/linux/adm5120/router_le/config-2.6.32 index fb363b205..18b54db4f 100644 --- a/target/linux/adm5120/router_le/config-2.6.32 +++ b/target/linux/adm5120/router_le/config-2.6.32 @@ -1,10 +1,9 @@ CONFIG_32BIT=y # CONFIG_64BIT is not set -CONFIG_ADM5120=y CONFIG_ADM5120_ENET=y CONFIG_ADM5120_MACH_5GXI=y -CONFIG_ADM5120_MACH_BR_6104K=y CONFIG_ADM5120_MACH_BR_6104KP=y +CONFIG_ADM5120_MACH_BR_6104K=y CONFIG_ADM5120_MACH_BR_61X4WG=y CONFIG_ADM5120_MACH_CAS_771=y CONFIG_ADM5120_MACH_EASY5120P_ATA=y @@ -16,8 +15,8 @@ CONFIG_ADM5120_MACH_NP27G=y CONFIG_ADM5120_MACH_NP28G=y CONFIG_ADM5120_MACH_PMUGW=y CONFIG_ADM5120_MACH_RB_11X=y -CONFIG_ADM5120_MACH_RB_133=y CONFIG_ADM5120_MACH_RB_133C=y +CONFIG_ADM5120_MACH_RB_133=y CONFIG_ADM5120_MACH_RB_150=y CONFIG_ADM5120_MACH_RB_153=y CONFIG_ADM5120_MACH_RB_192=y @@ -32,6 +31,7 @@ CONFIG_ADM5120_OEM_OSBRIDGE=y # CONFIG_ADM5120_OEM_ZYXEL is not set CONFIG_ADM5120_SOC_BGA=y CONFIG_ADM5120_WDT=y +CONFIG_ADM5120=y # CONFIG_ALCHEMY_GPIO_INDIRECT is not set # CONFIG_AR7 is not set # CONFIG_ARCH_HAS_ILOG2_U32 is not set @@ -44,15 +44,14 @@ CONFIG_ARCH_SUPPORTS_OPROFILE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ARM_AMBA=y CONFIG_ATA=m -# CONFIG_ATA_PIIX is not set # CONFIG_BCM47XX is not set # CONFIG_BCM63XX is not set CONFIG_BITREVERSE=y # CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set # CONFIG_CAVIUM_OCTEON_SIMULATOR is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y -CONFIG_CEVT_R4K=y CONFIG_CEVT_R4K_LIB=y +CONFIG_CEVT_R4K=y CONFIG_CFG80211_DEFAULT_PS_VALUE=0 CONFIG_CMDLINE="console=ttyS0,115200 rootfstype=squashfs,yaffs2,jffs2" # CONFIG_CPU_BIG_ENDIAN is not set @@ -61,9 +60,9 @@ CONFIG_CPU_HAS_PREFETCH=y CONFIG_CPU_HAS_SYNC=y CONFIG_CPU_LITTLE_ENDIAN=y # CONFIG_CPU_LOONGSON2E is not set -CONFIG_CPU_MIPS32=y CONFIG_CPU_MIPS32_R1=y # CONFIG_CPU_MIPS32_R2 is not set +CONFIG_CPU_MIPS32=y # CONFIG_CPU_MIPS64_R1 is not set # CONFIG_CPU_MIPS64_R2 is not set CONFIG_CPU_MIPSR1=y @@ -88,18 +87,18 @@ CONFIG_CPU_SUPPORTS_HIGHMEM=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_AES=m CONFIG_CRYPTO_ARC4=m -CONFIG_CRYPTO_BLKCIPHER=m CONFIG_CRYPTO_BLKCIPHER2=y +CONFIG_CRYPTO_BLKCIPHER=m CONFIG_CRYPTO_ECB=m -CONFIG_CRYPTO_HASH=m CONFIG_CRYPTO_HASH2=y -CONFIG_CRYPTO_MANAGER=m +CONFIG_CRYPTO_HASH=m CONFIG_CRYPTO_MANAGER2=y +CONFIG_CRYPTO_MANAGER=m CONFIG_CRYPTO_MICHAEL_MIC=m CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_WORKQUEUE=y -CONFIG_CSRC_R4K=y CONFIG_CSRC_R4K_LIB=y +CONFIG_CSRC_R4K=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DEVPORT=y # CONFIG_DM9000 is not set @@ -110,8 +109,8 @@ CONFIG_ELF_CORE=y CONFIG_FIRMWARE_IN_KERNEL=y CONFIG_FS_POSIX_ACL=y CONFIG_GENERIC_ACL=y -CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y @@ -131,33 +130,33 @@ CONFIG_HAVE_IDE=y CONFIG_HAVE_OPROFILE=y CONFIG_HID=m CONFIG_HID_SUPPORT=y -CONFIG_HOSTAP=m -CONFIG_HOSTAP_FIRMWARE=y # CONFIG_HOSTAP_FIRMWARE_NVRAM is not set +CONFIG_HOSTAP_FIRMWARE=y +CONFIG_HOSTAP=m CONFIG_HOSTAP_PCI=m CONFIG_HW_HAS_PCI=y CONFIG_HW_RANDOM=y -CONFIG_HZ=250 # CONFIG_HZ_100 is not set +CONFIG_HZ=250 CONFIG_HZ_250=y CONFIG_IMAGE_CMDLINE_HACK=y CONFIG_INITRAMFS_SOURCE="" -CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y -CONFIG_INPUT=m +CONFIG_INOTIFY=y # CONFIG_INPUT_GPIO_BUTTONS is not set +CONFIG_INPUT=m # CONFIG_INPUT_YEALINK is not set CONFIG_IRQ_CPU=y # CONFIG_ISDN is not set CONFIG_KEXEC=y CONFIG_LEDS_GPIO=m CONFIG_LEDS_TRIGGER_ADM5120_SWITCH=m -CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 -CONFIG_LIB80211=m +CONFIG_LEGACY_PTYS=y CONFIG_LIB80211_CRYPT_CCMP=m CONFIG_LIB80211_CRYPT_TKIP=m CONFIG_LIB80211_CRYPT_WEP=m +CONFIG_LIB80211=m # CONFIG_MACH_ALCHEMY is not set # CONFIG_MACH_DECSTATION is not set # CONFIG_MACH_JAZZ is not set @@ -167,7 +166,6 @@ CONFIG_LIB80211_CRYPT_WEP=m # CONFIG_MACH_VR41XX is not set CONFIG_MII=m # CONFIG_MIKROTIK_RB532 is not set -CONFIG_MIPS=y # CONFIG_MIPS_COBALT is not set CONFIG_MIPS_L1_CACHE_SHIFT=5 CONFIG_MIPS_MACHINE=y @@ -176,6 +174,7 @@ CONFIG_MIPS_MT_DISABLED=y # CONFIG_MIPS_MT_SMP is not set # CONFIG_MIPS_MT_SMTC is not set # CONFIG_MIPS_SIM is not set +CONFIG_MIPS=y CONFIG_MODULE_FORCE_UNLOAD=y CONFIG_MTD_ADM5120=y CONFIG_MTD_CFI_FIXUP_MACRONIX_BOOTLOC=y @@ -183,8 +182,8 @@ CONFIG_MTD_CFI_FIXUP_MACRONIX_BOOTLOC=y CONFIG_MTD_CMDLINE_PARTS=y CONFIG_MTD_JEDECPROBE=y CONFIG_MTD_MYLOADER_PARTS=y -CONFIG_MTD_NAND=y CONFIG_MTD_NAND_PLATFORM=y +CONFIG_MTD_NAND=y CONFIG_MTD_TRXSPLIT=y CONFIG_NLS=m CONFIG_NO_HZ=y @@ -204,18 +203,18 @@ CONFIG_PCI_DOMAINS=y CONFIG_SCHED_OMIT_FRAME_POINTER=y CONFIG_SCSI=m # CONFIG_SERIAL_8250 is not set -CONFIG_SERIAL_AMBA_PL010=y CONFIG_SERIAL_AMBA_PL010_CONSOLE=y CONFIG_SERIAL_AMBA_PL010_NUMPORTS=2 CONFIG_SERIAL_AMBA_PL010_PORTNAME="ttyS" +CONFIG_SERIAL_AMBA_PL010=y # CONFIG_SERIAL_AMBA_PL011 is not set -CONFIG_SERIO=y # CONFIG_SERIO_AMBAKMI is not set # CONFIG_SERIO_I8042 is not set # CONFIG_SERIO_LIBPS2 is not set # CONFIG_SERIO_PCIPS2 is not set # CONFIG_SERIO_RAW is not set CONFIG_SERIO_SERPORT=y +CONFIG_SERIO=y # CONFIG_SGI_IP22 is not set # CONFIG_SGI_IP27 is not set # CONFIG_SGI_IP28 is not set @@ -243,9 +242,9 @@ CONFIG_TMPFS_POSIX_ACL=y CONFIG_TRAD_SIGNALS=y # CONFIG_TREE_PREEMPT_RCU is not set CONFIG_TREE_RCU=y -CONFIG_USB=m CONFIG_USB_ADM5120_HCD=m CONFIG_USB_EHCI_HCD=m +CONFIG_USB=m # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set CONFIG_USB_OHCI_HCD=m diff --git a/target/linux/amazon/config-2.6.30 b/target/linux/amazon/config-2.6.30 index fa062cee9..644a36c2a 100644 --- a/target/linux/amazon/config-2.6.30 +++ b/target/linux/amazon/config-2.6.30 @@ -1,12 +1,12 @@ CONFIG_32BIT=y # CONFIG_64BIT is not set CONFIG_ADM6996_SUPPORT=y -CONFIG_AMAZON=y CONFIG_AMAZON_ASC_UART=y CONFIG_AMAZON_MTD=y CONFIG_AMAZON_NET_SW=y CONFIG_AMAZON_PCI=y CONFIG_AMAZON_WDT=y +CONFIG_AMAZON=y # CONFIG_ARCH_HAS_ILOG2_U32 is not set # CONFIG_ARCH_HAS_ILOG2_U64 is not set CONFIG_ARCH_POPULATES_NODE_MAP=y @@ -18,8 +18,8 @@ CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_BITREVERSE=y # CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set # CONFIG_CAVIUM_OCTEON_SIMULATOR is not set -CONFIG_CEVT_R4K=y CONFIG_CEVT_R4K_LIB=y +CONFIG_CEVT_R4K=y CONFIG_CMDLINE="console=ttyS0,115200 rootfstype=squashfs,jffs2 init=/bin/sh" CONFIG_CPU_BIG_ENDIAN=y # CONFIG_CPU_CAVIUM_OCTEON is not set @@ -28,9 +28,9 @@ CONFIG_CPU_HAS_PREFETCH=y CONFIG_CPU_HAS_SYNC=y # CONFIG_CPU_LITTLE_ENDIAN is not set # CONFIG_CPU_LOONGSON2 is not set -CONFIG_CPU_MIPS32=y # CONFIG_CPU_MIPS32_R1 is not set CONFIG_CPU_MIPS32_R2=y +CONFIG_CPU_MIPS32=y # CONFIG_CPU_MIPS64_R1 is not set # CONFIG_CPU_MIPS64_R2 is not set CONFIG_CPU_MIPSR2=y @@ -52,16 +52,16 @@ CONFIG_CPU_SUPPORTS_HIGHMEM=y # CONFIG_CPU_TX39XX is not set # CONFIG_CPU_TX49XX is not set # CONFIG_CPU_VR41XX is not set -CONFIG_CSRC_R4K=y CONFIG_CSRC_R4K_LIB=y +CONFIG_CSRC_R4K=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DEVPORT=y # CONFIG_DM9000 is not set CONFIG_DMA_NEED_PCI_MAP_STATE=y CONFIG_DMA_NONCOHERENT=y CONFIG_EARLY_PRINTK=y -CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y @@ -89,7 +89,6 @@ CONFIG_KALLSYMS=y # CONFIG_MACH_TX49XX is not set # CONFIG_MACH_VR41XX is not set # CONFIG_MIKROTIK_RB532 is not set -CONFIG_MIPS=y # CONFIG_MIPS_COBALT is not set CONFIG_MIPS_L1_CACHE_SHIFT=5 # CONFIG_MIPS_MACHINE is not set @@ -98,6 +97,7 @@ CONFIG_MIPS_MT_DISABLED=y # CONFIG_MIPS_MT_SMP is not set # CONFIG_MIPS_MT_SMTC is not set # CONFIG_MIPS_SIM is not set +CONFIG_MIPS=y CONFIG_MTD_AMAZON_BUS_WIDTH_16=y # CONFIG_MTD_AMAZON_BUS_WIDTH_32 is not set # CONFIG_MTD_AMAZON_BUS_WIDTH_8 is not set diff --git a/target/linux/amazon/config-2.6.32 b/target/linux/amazon/config-2.6.32 index d68558c7f..d692217e2 100644 --- a/target/linux/amazon/config-2.6.32 +++ b/target/linux/amazon/config-2.6.32 @@ -2,12 +2,12 @@ CONFIG_32BIT=y # CONFIG_64BIT is not set CONFIG_ADM6996_SUPPORT=y # CONFIG_ALCHEMY_GPIO_INDIRECT is not set -CONFIG_AMAZON=y CONFIG_AMAZON_ASC_UART=y CONFIG_AMAZON_MTD=y CONFIG_AMAZON_NET_SW=y CONFIG_AMAZON_PCI=y CONFIG_AMAZON_WDT=y +CONFIG_AMAZON=y # CONFIG_AR7 is not set # CONFIG_ARCH_HAS_ILOG2_U32 is not set # CONFIG_ARCH_HAS_ILOG2_U64 is not set @@ -21,8 +21,8 @@ CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_BITREVERSE=y # CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set # CONFIG_CAVIUM_OCTEON_SIMULATOR is not set -CONFIG_CEVT_R4K=y CONFIG_CEVT_R4K_LIB=y +CONFIG_CEVT_R4K=y CONFIG_CFG80211_DEFAULT_PS_VALUE=0 CONFIG_CMDLINE="console=ttyS0,115200 rootfstype=squashfs,jffs2 init=/bin/sh" CONFIG_CPU_BIG_ENDIAN=y @@ -31,9 +31,9 @@ CONFIG_CPU_HAS_PREFETCH=y CONFIG_CPU_HAS_SYNC=y # CONFIG_CPU_LITTLE_ENDIAN is not set # CONFIG_CPU_LOONGSON2E is not set -CONFIG_CPU_MIPS32=y # CONFIG_CPU_MIPS32_R1 is not set CONFIG_CPU_MIPS32_R2=y +CONFIG_CPU_MIPS32=y # CONFIG_CPU_MIPS64_R1 is not set # CONFIG_CPU_MIPS64_R2 is not set CONFIG_CPU_MIPSR2=y @@ -55,8 +55,8 @@ CONFIG_CPU_SUPPORTS_HIGHMEM=y # CONFIG_CPU_TX39XX is not set # CONFIG_CPU_TX49XX is not set # CONFIG_CPU_VR41XX is not set -CONFIG_CSRC_R4K=y CONFIG_CSRC_R4K_LIB=y +CONFIG_CSRC_R4K=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DEVPORT=y # CONFIG_DM9000 is not set @@ -64,8 +64,8 @@ CONFIG_DMA_NEED_PCI_MAP_STATE=y CONFIG_DMA_NONCOHERENT=y CONFIG_EARLY_PRINTK=y # CONFIG_FSNOTIFY is not set -CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y @@ -92,7 +92,6 @@ CONFIG_KALLSYMS=y # CONFIG_MACH_TX49XX is not set # CONFIG_MACH_VR41XX is not set # CONFIG_MIKROTIK_RB532 is not set -CONFIG_MIPS=y # CONFIG_MIPS_COBALT is not set CONFIG_MIPS_L1_CACHE_SHIFT=5 # CONFIG_MIPS_MACHINE is not set @@ -101,6 +100,7 @@ CONFIG_MIPS_MT_DISABLED=y # CONFIG_MIPS_MT_SMP is not set # CONFIG_MIPS_MT_SMTC is not set # CONFIG_MIPS_SIM is not set +CONFIG_MIPS=y CONFIG_MTD_AMAZON_BUS_WIDTH_16=y # CONFIG_MTD_AMAZON_BUS_WIDTH_32 is not set # CONFIG_MTD_AMAZON_BUS_WIDTH_8 is not set diff --git a/target/linux/ar7/config-2.6.32 b/target/linux/ar7/config-2.6.32 index 4f0d145e0..e1d56a119 100644 --- a/target/linux/ar7/config-2.6.32 +++ b/target/linux/ar7/config-2.6.32 @@ -1,9 +1,9 @@ CONFIG_32BIT=y # CONFIG_64BIT is not set # CONFIG_ALCHEMY_GPIO_INDIRECT is not set -CONFIG_AR7=y CONFIG_AR7_GPIO=y CONFIG_AR7_WDT=y +CONFIG_AR7=y # CONFIG_ARCH_HAS_ILOG2_U32 is not set # CONFIG_ARCH_HAS_ILOG2_U64 is not set CONFIG_ARCH_HIBERNATION_POSSIBLE=y @@ -17,8 +17,8 @@ CONFIG_BITREVERSE=y CONFIG_BOOT_ELF32=y # CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set # CONFIG_CAVIUM_OCTEON_SIMULATOR is not set -CONFIG_CEVT_R4K=y CONFIG_CEVT_R4K_LIB=y +CONFIG_CEVT_R4K=y CONFIG_CFG80211_DEFAULT_PS_VALUE=0 CONFIG_CMDLINE="rootfstype=squashfs,jffs2" CONFIG_CPMAC=y @@ -28,9 +28,9 @@ CONFIG_CPU_HAS_PREFETCH=y CONFIG_CPU_HAS_SYNC=y CONFIG_CPU_LITTLE_ENDIAN=y # CONFIG_CPU_LOONGSON2E is not set -CONFIG_CPU_MIPS32=y CONFIG_CPU_MIPS32_R1=y # CONFIG_CPU_MIPS32_R2 is not set +CONFIG_CPU_MIPS32=y # CONFIG_CPU_MIPS64_R1 is not set # CONFIG_CPU_MIPS64_R2 is not set CONFIG_CPU_MIPSR1=y @@ -52,8 +52,8 @@ CONFIG_CPU_SUPPORTS_HIGHMEM=y # CONFIG_CPU_TX39XX is not set # CONFIG_CPU_TX49XX is not set # CONFIG_CPU_VR41XX is not set -CONFIG_CSRC_R4K=y CONFIG_CSRC_R4K_LIB=y +CONFIG_CSRC_R4K=y CONFIG_DECOMPRESS_LZMA=y # CONFIG_DM9000 is not set CONFIG_DMA_NEED_PCI_MAP_STATE=y @@ -61,8 +61,8 @@ CONFIG_DMA_NONCOHERENT=y CONFIG_EARLY_PRINTK=y CONFIG_FIXED_PHY=y # CONFIG_FSNOTIFY is not set -CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y @@ -90,7 +90,6 @@ CONFIG_LEDS_GPIO=y # CONFIG_MACH_TX49XX is not set # CONFIG_MACH_VR41XX is not set # CONFIG_MIKROTIK_RB532 is not set -CONFIG_MIPS=y # CONFIG_MIPS_COBALT is not set CONFIG_MIPS_L1_CACHE_SHIFT=5 # CONFIG_MIPS_MACHINE is not set @@ -99,6 +98,7 @@ CONFIG_MIPS_MT_DISABLED=y # CONFIG_MIPS_MT_SMP is not set # CONFIG_MIPS_MT_SMTC is not set # CONFIG_MIPS_SIM is not set +CONFIG_MIPS=y CONFIG_MTD_AR7_PARTS=y CONFIG_MTD_CFI_STAA=y CONFIG_MTD_PHYSMAP=y diff --git a/target/linux/ar71xx/config-2.6.32 b/target/linux/ar71xx/config-2.6.32 index 0defd8672..95138c3b7 100644 --- a/target/linux/ar71xx/config-2.6.32 +++ b/target/linux/ar71xx/config-2.6.32 @@ -1,11 +1,10 @@ CONFIG_32BIT=y # CONFIG_64BIT is not set -CONFIG_AG71XX=y CONFIG_AG71XX_AR8216_SUPPORT=y -# CONFIG_AG71XX_DEBUG is not set # CONFIG_AG71XX_DEBUG_FS is not set +# CONFIG_AG71XX_DEBUG is not set +CONFIG_AG71XX=y # CONFIG_ALCHEMY_GPIO_INDIRECT is not set -# CONFIG_AR7 is not set CONFIG_AR71XX_DEV_AP91_PCI=y CONFIG_AR71XX_DEV_AP94_PCI=y CONFIG_AR71XX_DEV_AR913X_WMAC=y @@ -40,6 +39,7 @@ CONFIG_AR71XX_MACH_WRT400N=y CONFIG_AR71XX_MACH_WZR_HP_G300NH=y CONFIG_AR71XX_NVRAM=y CONFIG_AR71XX_WDT=y +# CONFIG_AR7 is not set # CONFIG_ARCH_HAS_ILOG2_U32 is not set # CONFIG_ARCH_HAS_ILOG2_U64 is not set CONFIG_ARCH_HIBERNATION_POSSIBLE=y @@ -55,8 +55,8 @@ CONFIG_BITREVERSE=y # CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set # CONFIG_CAVIUM_OCTEON_SIMULATOR is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y -CONFIG_CEVT_R4K=y CONFIG_CEVT_R4K_LIB=y +CONFIG_CEVT_R4K=y CONFIG_CFG80211_DEFAULT_PS_VALUE=0 CONFIG_CMDLINE="rootfstype=squashfs,yaffs,jffs2 noinitrd console=ttyS0,115200" CONFIG_CPU_BIG_ENDIAN=y @@ -65,9 +65,9 @@ CONFIG_CPU_HAS_PREFETCH=y CONFIG_CPU_HAS_SYNC=y # CONFIG_CPU_LITTLE_ENDIAN is not set # CONFIG_CPU_LOONGSON2E is not set -CONFIG_CPU_MIPS32=y # CONFIG_CPU_MIPS32_R1 is not set CONFIG_CPU_MIPS32_R2=y +CONFIG_CPU_MIPS32=y # CONFIG_CPU_MIPS64_R1 is not set # CONFIG_CPU_MIPS64_R2 is not set CONFIG_CPU_MIPSR2=y @@ -89,8 +89,8 @@ CONFIG_CPU_SUPPORTS_HIGHMEM=y # CONFIG_CPU_TX39XX is not set # CONFIG_CPU_TX49XX is not set # CONFIG_CPU_VR41XX is not set -CONFIG_CSRC_R4K=y CONFIG_CSRC_R4K_LIB=y +CONFIG_CSRC_R4K=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DEVPORT=y # CONFIG_DM9000 is not set @@ -98,8 +98,8 @@ CONFIG_DMA_NEED_PCI_MAP_STATE=y CONFIG_DMA_NONCOHERENT=y CONFIG_EARLY_PRINTK=y # CONFIG_FSNOTIFY is not set -CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y @@ -119,10 +119,10 @@ CONFIG_HAVE_IDE=y CONFIG_HAVE_OPROFILE=y CONFIG_HW_HAS_PCI=y # CONFIG_HW_RANDOM is not set -CONFIG_I2C=y CONFIG_I2C_ALGOBIT=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_GPIO=y +CONFIG_I2C=y CONFIG_ICPLUS_PHY=y CONFIG_IMAGE_CMDLINE_HACK=y # CONFIG_INITRAMFS_COMPRESSION_LZO is not set @@ -143,7 +143,6 @@ CONFIG_IRQ_CPU=y # CONFIG_MACH_VR41XX is not set CONFIG_MICREL_PHY=y # CONFIG_MIKROTIK_RB532 is not set -CONFIG_MIPS=y # CONFIG_MIPS_COBALT is not set CONFIG_MIPS_L1_CACHE_SHIFT=5 CONFIG_MIPS_MACHINE=y @@ -152,19 +151,19 @@ CONFIG_MIPS_MT_DISABLED=y # CONFIG_MIPS_MT_SMP is not set # CONFIG_MIPS_MT_SMTC is not set # CONFIG_MIPS_SIM is not set +CONFIG_MIPS=y CONFIG_MTD_AR91XX_FLASH=y # CONFIG_MTD_CFI_INTELEXT is not set CONFIG_MTD_CMDLINE_PARTS=y CONFIG_MTD_JEDECPROBE=y CONFIG_MTD_M25P80=y CONFIG_MTD_MYLOADER_PARTS=y -CONFIG_MTD_NAND=y CONFIG_MTD_NAND_RB4XX=y +CONFIG_MTD_NAND=y CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-2 CONFIG_MTD_REDBOOT_PARTS=y CONFIG_MTD_WRT160NL_PARTS=y CONFIG_MYLOADER=y -CONFIG_NET_DSA=y CONFIG_NET_DSA_MV88E6060=y CONFIG_NET_DSA_MV88E6063=y # CONFIG_NET_DSA_MV88E6123_61_65 is not set @@ -174,6 +173,7 @@ CONFIG_NET_DSA_MV88E6063=y # CONFIG_NET_DSA_TAG_DSA is not set # CONFIG_NET_DSA_TAG_EDSA is not set CONFIG_NET_DSA_TAG_TRAILER=y +CONFIG_NET_DSA=y # CONFIG_NO_IOPORT is not set # CONFIG_NXP_STB220 is not set # CONFIG_NXP_STB225 is not set @@ -187,8 +187,8 @@ CONFIG_PHYLIB=y # CONFIG_PNX8550_STB810 is not set # CONFIG_PROBE_INITRD_HEADER is not set CONFIG_RTL8306_PHY=y -CONFIG_RTL8366S_PHY=y CONFIG_RTL8366_SMI=y +CONFIG_RTL8366S_PHY=y CONFIG_SCHED_OMIT_FRAME_POINTER=y # CONFIG_SCSI_DMA is not set # CONFIG_SERIAL_8250_EXTENDED is not set @@ -208,7 +208,6 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=1 # CONFIG_SIBYTE_SWARM is not set # CONFIG_SLAB is not set CONFIG_SLUB=y -CONFIG_SPI=y CONFIG_SPI_AP83=y CONFIG_SPI_AR71XX=y CONFIG_SPI_BITBANG=y @@ -217,6 +216,7 @@ CONFIG_SPI_MASTER=y CONFIG_SPI_PB44=y # CONFIG_SPI_SPIDEV is not set # CONFIG_SPI_VSC7385 is not set +CONFIG_SPI=y CONFIG_SWCONFIG=y CONFIG_SYS_HAS_CPU_MIPS32_R1=y CONFIG_SYS_HAS_CPU_MIPS32_R2=y diff --git a/target/linux/atheros/config-2.6.32 b/target/linux/atheros/config-2.6.32 index 82317436c..a397b9071 100644 --- a/target/linux/atheros/config-2.6.32 +++ b/target/linux/atheros/config-2.6.32 @@ -12,8 +12,8 @@ CONFIG_ARCH_POPULATES_NODE_MAP=y # CONFIG_ARCH_SUPPORTS_MSI is not set CONFIG_ARCH_SUPPORTS_OPROFILE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ATHEROS_AR2315=y CONFIG_ATHEROS_AR2315_PCI=y +CONFIG_ATHEROS_AR2315=y CONFIG_ATHEROS_AR231X=y CONFIG_ATHEROS_AR5312=y CONFIG_ATHEROS_WDT=y @@ -22,8 +22,8 @@ CONFIG_ATHEROS_WDT=y CONFIG_BITREVERSE=y # CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set # CONFIG_CAVIUM_OCTEON_SIMULATOR is not set -CONFIG_CEVT_R4K=y CONFIG_CEVT_R4K_LIB=y +CONFIG_CEVT_R4K=y CONFIG_CFG80211_DEFAULT_PS_VALUE=0 CONFIG_CMDLINE="console=ttyS0,9600 rootfstype=squashfs,jffs2" CONFIG_CPU_BIG_ENDIAN=y @@ -32,9 +32,9 @@ CONFIG_CPU_HAS_PREFETCH=y CONFIG_CPU_HAS_SYNC=y # CONFIG_CPU_LITTLE_ENDIAN is not set # CONFIG_CPU_LOONGSON2E is not set -CONFIG_CPU_MIPS32=y CONFIG_CPU_MIPS32_R1=y # CONFIG_CPU_MIPS32_R2 is not set +CONFIG_CPU_MIPS32=y # CONFIG_CPU_MIPS64_R1 is not set # CONFIG_CPU_MIPS64_R2 is not set CONFIG_CPU_MIPSR1=y @@ -56,16 +56,16 @@ CONFIG_CPU_SUPPORTS_HIGHMEM=y # CONFIG_CPU_TX39XX is not set # CONFIG_CPU_TX49XX is not set # CONFIG_CPU_VR41XX is not set -CONFIG_CSRC_R4K=y CONFIG_CSRC_R4K_LIB=y +CONFIG_CSRC_R4K=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DEVPORT=y # CONFIG_DM9000 is not set CONFIG_DMA_NEED_PCI_MAP_STATE=y CONFIG_DMA_NONCOHERENT=y # CONFIG_FSNOTIFY is not set -CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y @@ -95,7 +95,6 @@ CONFIG_IRQ_CPU=y # CONFIG_MACH_TX49XX is not set # CONFIG_MACH_VR41XX is not set # CONFIG_MIKROTIK_RB532 is not set -CONFIG_MIPS=y # CONFIG_MIPS_COBALT is not set CONFIG_MIPS_L1_CACHE_SHIFT=5 # CONFIG_MIPS_MACHINE is not set @@ -104,6 +103,7 @@ CONFIG_MIPS_MT_DISABLED=y # CONFIG_MIPS_MT_SMP is not set # CONFIG_MIPS_MT_SMTC is not set # CONFIG_MIPS_SIM is not set +CONFIG_MIPS=y CONFIG_MTD_AR2315=y CONFIG_MTD_CFI_ADV_OPTIONS=y # CONFIG_MTD_CFI_GEOMETRY is not set diff --git a/target/linux/au1000/au1500/config-2.6.32 b/target/linux/au1000/au1500/config-2.6.32 index 85924115e..2b81ee000 100644 --- a/target/linux/au1000/au1500/config-2.6.32 +++ b/target/linux/au1000/au1500/config-2.6.32 @@ -26,9 +26,9 @@ CONFIG_CPU_HAS_PREFETCH=y CONFIG_CPU_HAS_SYNC=y CONFIG_CPU_LITTLE_ENDIAN=y # CONFIG_CPU_LOONGSON2E is not set -CONFIG_CPU_MIPS32=y CONFIG_CPU_MIPS32_R1=y # CONFIG_CPU_MIPS32_R2 is not set +CONFIG_CPU_MIPS32=y # CONFIG_CPU_MIPS64_R1 is not set # CONFIG_CPU_MIPS64_R2 is not set CONFIG_CPU_MIPSR1=y @@ -62,8 +62,8 @@ CONFIG_DMA_NONCOHERENT=y CONFIG_DUMMY=m CONFIG_ELF_CORE=y # CONFIG_FSNOTIFY is not set -CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y @@ -81,15 +81,15 @@ CONFIG_HAVE_IDE=y CONFIG_HAVE_OPROFILE=y CONFIG_HW_HAS_PCI=y CONFIG_HW_RANDOM=y -CONFIG_HZ=250 # CONFIG_HZ_100 is not set +CONFIG_HZ=250 CONFIG_HZ_250=y -CONFIG_I2C=m CONFIG_I2C_ALGOBIT=m CONFIG_I2C_ALGOPCA=m CONFIG_I2C_ALGOPCF=m CONFIG_I2C_BOARDINFO=y CONFIG_I2C_CHARDEV=m +CONFIG_I2C=m CONFIG_INITRAMFS_SOURCE="" CONFIG_IRQ_CPU=y CONFIG_KEXEC=y @@ -103,7 +103,6 @@ CONFIG_MACH_ALCHEMY=y # CONFIG_MACH_VR41XX is not set CONFIG_MAGIC_SYSRQ=y # CONFIG_MIKROTIK_RB532 is not set -CONFIG_MIPS=y CONFIG_MIPS_AU1X00_ENET=y # CONFIG_MIPS_BOSPORUS is not set # CONFIG_MIPS_COBALT is not set @@ -116,10 +115,10 @@ CONFIG_MIPS_L1_CACHE_SHIFT=5 # CONFIG_MIPS_MACHINE is not set # CONFIG_MIPS_MALTA is not set # CONFIG_MIPS_MIRAGE is not set -CONFIG_MIPS_MTX1=y CONFIG_MIPS_MT_DISABLED=y # CONFIG_MIPS_MT_SMP is not set # CONFIG_MIPS_MT_SMTC is not set +CONFIG_MIPS_MTX1=y # CONFIG_MIPS_PB1000 is not set # CONFIG_MIPS_PB1100 is not set # CONFIG_MIPS_PB1200 is not set @@ -127,6 +126,7 @@ CONFIG_MIPS_MT_DISABLED=y # CONFIG_MIPS_PB1550 is not set # CONFIG_MIPS_SIM is not set # CONFIG_MIPS_XXS1500 is not set +CONFIG_MIPS=y CONFIG_MODULE_FORCE_UNLOAD=y # CONFIG_MTD_ALCHEMY is not set # CONFIG_MTD_CFI_INTELEXT is not set diff --git a/target/linux/avr32/config-default b/target/linux/avr32/config-default index 2c88e7029..ec6565f85 100644 --- a/target/linux/avr32/config-default +++ b/target/linux/avr32/config-default @@ -12,15 +12,15 @@ CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_AT32AP700X_WDT=m # CONFIG_ATMEL_PWM is not set # CONFIG_ATMEL_SSC is not set -CONFIG_ATMEL_TCB_CLKSRC=y CONFIG_ATMEL_TCB_CLKSRC_BLOCK=0 +CONFIG_ATMEL_TCB_CLKSRC=y CONFIG_ATMEL_TCLIB=y CONFIG_AVR32=y CONFIG_BITREVERSE=y -CONFIG_BOARD_ATNGW100=y CONFIG_BOARD_ATNGW100_ADDON_NONE=y # CONFIG_BOARD_ATNGW100_EVKLCD10X is not set # CONFIG_BOARD_ATNGW100_MRMT is not set +CONFIG_BOARD_ATNGW100=y # CONFIG_BOARD_ATSTK1000 is not set # CONFIG_BOARD_FAVR_32 is not set # CONFIG_BOARD_HAMMERHEAD is not set @@ -36,8 +36,8 @@ CONFIG_ENTRY_ADDRESS=0x90000000 # CONFIG_FSNOTIFY is not set CONFIG_GENERIC_ALLOCATOR=y CONFIG_GENERIC_BUG=y -CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_GPIO=y CONFIG_GPIOLIB=y @@ -51,25 +51,25 @@ CONFIG_HAVE_CLK=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_OPROFILE=y # CONFIG_HW_RANDOM is not set -CONFIG_I2C=m CONFIG_I2C_BOARDINFO=y # CONFIG_I2C_DESIGNWARE is not set +CONFIG_I2C=m CONFIG_INITRAMFS_SOURCE="" CONFIG_LEDS_GPIO=y -CONFIG_LOADER_U_BOOT=y CONFIG_LOAD_ADDRESS=0x10000000 +CONFIG_LOADER_U_BOOT=y CONFIG_MACB=y -CONFIG_MMC=m # CONFIG_MMC_AT91 is not set -CONFIG_MMC_ATMELMCI=m # CONFIG_MMC_ATMELMCI_DMA is not set +CONFIG_MMC_ATMELMCI=m CONFIG_MMC_BLOCK=m +CONFIG_MMC=m # CONFIG_MTD_CFI_INTELEXT is not set CONFIG_MTD_CMDLINE_PARTS=y # CONFIG_MTD_COMPLEX_MAPPINGS is not set -CONFIG_MTD_DATAFLASH=y # CONFIG_MTD_DATAFLASH_OTP is not set # CONFIG_MTD_DATAFLASH_WRITE_VERIFY is not set +CONFIG_MTD_DATAFLASH=y CONFIG_MTD_PHYSMAP=y # CONFIG_NEED_NODE_MEMMAP_SIZE is not set # CONFIG_NET_DMA is not set @@ -90,16 +90,16 @@ CONFIG_SCHED_HRTICK=y # CONFIG_SCSI_DMA is not set # CONFIG_SDIO_UART is not set # CONFIG_SERIAL_8250 is not set -CONFIG_SERIAL_ATMEL=y CONFIG_SERIAL_ATMEL_CONSOLE=y CONFIG_SERIAL_ATMEL_PDC=y # CONFIG_SERIAL_ATMEL_TTYAT is not set -CONFIG_SPI=y +CONFIG_SERIAL_ATMEL=y CONFIG_SPI_ATMEL=y # CONFIG_SPI_BITBANG is not set # CONFIG_SPI_GPIO is not set CONFIG_SPI_MASTER=y # CONFIG_SPI_SPIDEV is not set +CONFIG_SPI=y CONFIG_SUBARCH_AVR32B=y # CONFIG_TREE_PREEMPT_RCU is not set CONFIG_TREE_RCU=y diff --git a/target/linux/brcm47xx/config-2.6.32 b/target/linux/brcm47xx/config-2.6.32 index ca7914753..88d144c9b 100644 --- a/target/linux/brcm47xx/config-2.6.32 +++ b/target/linux/brcm47xx/config-2.6.32 @@ -1,7 +1,11 @@ + CONFIG_32BIT=y # CONFIG_64BIT is not set +# CONFIG_ALCHEMY_GPIO_INDIRECT is not set +# CONFIG_AR7 is not set # CONFIG_ARCH_HAS_ILOG2_U32 is not set # CONFIG_ARCH_HAS_ILOG2_U64 is not set +CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_POPULATES_NODE_MAP=y # CONFIG_ARCH_SUPPORTS_MSI is not set CONFIG_ARCH_SUPPORTS_OPROFILE=y @@ -13,8 +17,6 @@ CONFIG_B44_PCI=y CONFIG_B44=y CONFIG_BCM47XX_WDT=y CONFIG_BCM47XX=y -# CONFIG_ALCHEMY_GPIO_INDIRECT is not set -# CONFIG_AR7 is not set # CONFIG_BCM63XX is not set # CONFIG_BINARY_PRINTF is not set CONFIG_BITREVERSE=y @@ -31,6 +33,7 @@ CONFIG_CPU_HAS_LLSC=y CONFIG_CPU_HAS_PREFETCH=y CONFIG_CPU_HAS_SYNC=y CONFIG_CPU_LITTLE_ENDIAN=y +# CONFIG_CPU_LOONGSON2E is not set # CONFIG_CPU_LOONGSON2 is not set CONFIG_CPU_MIPS32_R1=y # CONFIG_CPU_MIPS32_R2 is not set @@ -69,6 +72,7 @@ CONFIG_DEVPORT=y # CONFIG_DM9000 is not set CONFIG_DMA_NEED_PCI_MAP_STATE=y CONFIG_DMA_NONCOHERENT=y +# CONFIG_FSNOTIFY is not set CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CMOS_UPDATE=y @@ -83,6 +87,7 @@ CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT=y CONFIG_HAVE_ARCH_KGDB=y # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set +CONFIG_HAVE_GENERIC_DMA_COHERENT=y CONFIG_HAVE_IDE=y CONFIG_HAVE_MLOCK=y CONFIG_HAVE_OPROFILE=y @@ -101,6 +106,7 @@ CONFIG_LEDS_GPIO=y # CONFIG_MACH_ALCHEMY is not set # CONFIG_MACH_DECSTATION is not set # CONFIG_MACH_JAZZ is not set +# CONFIG_MACH_LOONGSON is not set # CONFIG_MACH_TX39XX is not set # CONFIG_MACH_TX49XX is not set # CONFIG_MACH_VR41XX is not set @@ -168,16 +174,10 @@ CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y # CONFIG_TC35815 is not set CONFIG_TRACING_SUPPORT=y CONFIG_TRAD_SIGNALS=y +# CONFIG_TREE_PREEMPT_RCU is not set +CONFIG_TREE_RCU=y CONFIG_USB_EHCI_HCD_SSB=y CONFIG_USB_OHCI_HCD_SSB=y CONFIG_USB_SUPPORT=y CONFIG_WATCHDOG_NOWAYOUT=y CONFIG_ZONE_DMA_FLAG=0 -CONFIG_TREE_RCU=y -CONFIG_HAVE_GENERIC_DMA_COHERENT=y -CONFIG_ARCH_HIBERNATION_POSSIBLE=y -# CONFIG_MACH_LOONGSON is not set -# CONFIG_CPU_LOONGSON2E is not set -# CONFIG_TREE_PREEMPT_RCU is not set -# CONFIG_FSNOTIFY is not set - diff --git a/target/linux/ep93xx/config-2.6.30 b/target/linux/ep93xx/config-2.6.30 index 4f96ab5ab..496fd61a3 100644 --- a/target/linux/ep93xx/config-2.6.30 +++ b/target/linux/ep93xx/config-2.6.30 @@ -9,10 +9,10 @@ CONFIG_ARCH_REQUIRE_GPIOLIB=y # CONFIG_ARCH_SPARSEMEM_DEFAULT is not set # CONFIG_ARCH_SUPPORTS_MSI is not set CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARM=y CONFIG_ARM_AMBA=y CONFIG_ARM_THUMB=y CONFIG_ARM_VIC=y +CONFIG_ARM=y # CONFIG_ARPD is not set # CONFIG_BINARY_PRINTF is not set CONFIG_BITREVERSE=y @@ -22,15 +22,15 @@ CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_CMDLINE="console=ttyAM0,57600 init=/etc/preinit" CONFIG_COMMON_CLKDEV=y CONFIG_CONSOLE_TRANSLATIONS=y -CONFIG_CPU_32=y CONFIG_CPU_32v4T=y +CONFIG_CPU_32=y CONFIG_CPU_ABRT_EV4T=y CONFIG_CPU_ARM920T=y CONFIG_CPU_CACHE_V4WT=y CONFIG_CPU_CACHE_VIVT=y CONFIG_CPU_COPY_V4WB=y -CONFIG_CPU_CP15=y CONFIG_CPU_CP15_MMU=y +CONFIG_CPU_CP15=y # CONFIG_CPU_DCACHE_WRITETHROUGH is not set # CONFIG_CPU_ICACHE_DISABLE is not set CONFIG_CPU_PABRT_NOIFAR=y @@ -41,14 +41,14 @@ CONFIG_CRUNCH=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_ARC4=y -CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y +CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_DES=y CONFIG_CRYPTO_ECB=m -CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y -CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_MANAGER2=y +CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MD5=y CONFIG_CRYPTO_MICHAEL_MIC=y CONFIG_CRYPTO_PCBC=y @@ -68,15 +68,14 @@ CONFIG_EP93XX_EARLY_UART1=y # CONFIG_EP93XX_EARLY_UART3 is not set CONFIG_EP93XX_ETH=y CONFIG_EP93XX_WATCHDOG=y -CONFIG_FB=y # CONFIG_FB_ARMCLCD is not set CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_EP93XX=y # CONFIG_FB_EP93XX_MONO is not set +CONFIG_FB_EP93XX=y +CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set -CONFIG_FONTS=y # CONFIG_FONT_10x18 is not set # CONFIG_FONT_6x11 is not set # CONFIG_FONT_7x14 is not set @@ -87,12 +86,13 @@ CONFIG_FONT_8x8=y # CONFIG_FONT_PEARL_8x8 is not set # CONFIG_FONT_SUN12x22 is not set # CONFIG_FONT_SUN8x16 is not set +CONFIG_FONTS=y # CONFIG_FPE_FASTFPE is not set -CONFIG_FPE_NWFPE=y CONFIG_FPE_NWFPE_XP=y -CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FPE_NWFPE=y # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set +CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAME_POINTER=y # CONFIG_FW_LOADER is not set # CONFIG_GENERIC_CLOCKEVENTS is not set @@ -119,47 +119,47 @@ CONFIG_HAVE_MLOCK=y CONFIG_HAVE_OPROFILE=y CONFIG_HW_CONSOLE=y # CONFIG_HW_RANDOM is not set -CONFIG_I2C=y CONFIG_I2C_ALGOBIT=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_EP93XX=y -CONFIG_IKCONFIG=y +CONFIG_I2C=y CONFIG_IKCONFIG_PROC=y -CONFIG_INOTIFY=y +CONFIG_IKCONFIG=y CONFIG_INOTIFY_USER=y -CONFIG_INPUT=y +CONFIG_INOTIFY=y # CONFIG_INPUT_MISC is not set CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_INPUT=y CONFIG_LCD_HD44780=m CONFIG_LCD_LINUX=m -CONFIG_LOGO=y +CONFIG_LOG_BUF_SHIFT=16 CONFIG_LOGO_LINUX_CLUT224=y CONFIG_LOGO_LINUX_MONO=y CONFIG_LOGO_LINUX_VGA16=y -CONFIG_LOG_BUF_SHIFT=16 +CONFIG_LOGO=y # CONFIG_MAC80211_RC_DEFAULT_MINSTREL is not set # CONFIG_MAC80211_RC_DEFAULT_PID is not set # CONFIG_MACH_ADSSPHERE is not set -# CONFIG_MACH_EDB9302 is not set # CONFIG_MACH_EDB9302A is not set -# CONFIG_MACH_EDB9307 is not set +# CONFIG_MACH_EDB9302 is not set # CONFIG_MACH_EDB9307A is not set +# CONFIG_MACH_EDB9307 is not set # CONFIG_MACH_EDB9312 is not set -# CONFIG_MACH_EDB9315 is not set # CONFIG_MACH_EDB9315A is not set +# CONFIG_MACH_EDB9315 is not set # CONFIG_MACH_GESBC9312 is not set -# CONFIG_MACH_MICRO9 is not set # CONFIG_MACH_MICRO9H is not set +# CONFIG_MACH_MICRO9 is not set # CONFIG_MACH_MICRO9L is not set # CONFIG_MACH_MICRO9M is not set CONFIG_MACH_SIM_ONE=y # CONFIG_MACH_TS72XX is not set # CONFIG_MFD_T7L66XB is not set # CONFIG_MISC_DEVICES is not set -CONFIG_MMC=y CONFIG_MMC_BLOCK=y CONFIG_MMC_SPI=y +CONFIG_MMC=y CONFIG_MODULE_FORCE_UNLOAD=y CONFIG_MTD_CFI_ADV_OPTIONS=y # CONFIG_MTD_CFI_GEOMETRY is not set @@ -177,16 +177,16 @@ CONFIG_PREEMPT=y # CONFIG_SCSI_DMA is not set # CONFIG_SDIO_UART is not set # CONFIG_SERIAL_8250 is not set -CONFIG_SERIAL_AMBA_PL010=y CONFIG_SERIAL_AMBA_PL010_CONSOLE=y +CONFIG_SERIAL_AMBA_PL010=y # CONFIG_SERIAL_AMBA_PL011 is not set # CONFIG_SLOW_WORK is not set -CONFIG_SPI=y CONFIG_SPI_BITBANG=y CONFIG_SPI_EP93XX=y # CONFIG_SPI_GPIO is not set CONFIG_SPI_MASTER=y # CONFIG_SPI_SPIDEV is not set +CONFIG_SPI=y CONFIG_SPLIT_PTLOCK_CPUS=4096 CONFIG_SYS_SUPPORTS_APM_EMULATION=y # CONFIG_TCP_CONG_ADVANCED is not set @@ -200,9 +200,9 @@ CONFIG_VECTORS_BASE=0xffff0000 # CONFIG_VGA_CONSOLE is not set CONFIG_VIDEO_OUTPUT_CONTROL=y CONFIG_VM_EVENT_COUNTERS=y -CONFIG_VT=y CONFIG_VT_CONSOLE=y # CONFIG_VT_HW_CONSOLE_BINDING is not set +CONFIG_VT=y CONFIG_ZBOOT_ROM_BSS=0x0 CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZONE_DMA_FLAG=0 diff --git a/target/linux/etrax/config-default b/target/linux/etrax/config-default index e5515a65f..d41db6a3e 100644 --- a/target/linux/etrax/config-default +++ b/target/linux/etrax/config-default @@ -6,12 +6,11 @@ CONFIG_BOUNCE=y # CONFIG_BRIDGE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_CFG80211_DEFAULT_PS_VALUE=0 -CONFIG_CRIS=y # CONFIG_CRIS_MACH_ARTPEC3 is not set +CONFIG_CRIS=y CONFIG_DECOMPRESS_LZMA=y # CONFIG_ETRAX100LX is not set CONFIG_ETRAX100LX_V2=y -# CONFIG_ETRAXFS is not set CONFIG_ETRAX_ARCH_V10=y # CONFIG_ETRAX_ARCH_V32 is not set CONFIG_ETRAX_AXISFLASHMAP=y @@ -37,9 +36,10 @@ CONFIG_ETRAX_ETHERNET=y CONFIG_ETRAX_FAST_TIMER=y CONFIG_ETRAX_FLASH1_SIZE=0 CONFIG_ETRAX_FLASH_BUSWIDTH=2 +# CONFIG_ETRAXFS is not set CONFIG_ETRAX_GPIO=y -# CONFIG_ETRAX_I2C is not set # CONFIG_ETRAX_I2C_GVC is not set +# CONFIG_ETRAX_I2C is not set # CONFIG_ETRAX_KMALLOCED_MODULES is not set CONFIG_ETRAX_LED1G=2 CONFIG_ETRAX_LED1R=2 @@ -101,25 +101,23 @@ CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_ON_NONE=y # CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_ON_PB is not set CONFIG_ETRAX_SER3_RI_ON_PA_BIT=-1 CONFIG_ETRAX_SER3_RI_ON_PB_BIT=-1 -CONFIG_ETRAX_SERIAL=y # CONFIG_ETRAX_SERIAL_FAST_TIMER is not set # CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST is not set -CONFIG_ETRAX_SERIAL_PORT0=y # CONFIG_ETRAX_SERIAL_PORT0_DMA0_OUT is not set # CONFIG_ETRAX_SERIAL_PORT0_DMA1_IN is not set # CONFIG_ETRAX_SERIAL_PORT0_DMA6_OUT is not set # CONFIG_ETRAX_SERIAL_PORT0_DMA7_IN is not set CONFIG_ETRAX_SERIAL_PORT0_NO_DMA_IN=y CONFIG_ETRAX_SERIAL_PORT0_NO_DMA_OUT=y +CONFIG_ETRAX_SERIAL_PORT0=y # CONFIG_ETRAX_SERIAL_PORT1 is not set -CONFIG_ETRAX_SERIAL_PORT2=y CONFIG_ETRAX_SERIAL_PORT2_DMA2_OUT=y CONFIG_ETRAX_SERIAL_PORT2_DMA3_IN=y # CONFIG_ETRAX_SERIAL_PORT2_DMA6_OUT is not set # CONFIG_ETRAX_SERIAL_PORT2_DMA7_IN is not set # CONFIG_ETRAX_SERIAL_PORT2_NO_DMA_IN is not set # CONFIG_ETRAX_SERIAL_PORT2_NO_DMA_OUT is not set -CONFIG_ETRAX_SERIAL_PORT3=y +CONFIG_ETRAX_SERIAL_PORT2=y # CONFIG_ETRAX_SERIAL_PORT3_DMA2_OUT is not set # CONFIG_ETRAX_SERIAL_PORT3_DMA3_IN is not set CONFIG_ETRAX_SERIAL_PORT3_DMA4_OUT=y @@ -128,7 +126,9 @@ CONFIG_ETRAX_SERIAL_PORT3_DMA5_IN=y # CONFIG_ETRAX_SERIAL_PORT3_DMA9_IN is not set # CONFIG_ETRAX_SERIAL_PORT3_NO_DMA_IN is not set # CONFIG_ETRAX_SERIAL_PORT3_NO_DMA_OUT is not set +CONFIG_ETRAX_SERIAL_PORT3=y CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS=5 +CONFIG_ETRAX_SERIAL=y # CONFIG_ETRAX_SOFT_SHUTDOWN is not set # CONFIG_ETRAX_SYNCHRONOUS_SERIAL is not set # CONFIG_ETRAX_USB_HOST is not set @@ -146,12 +146,12 @@ CONFIG_HAS_IOMEM=y # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_HAVE_IDE=y # CONFIG_HW_RANDOM is not set -CONFIG_MTDRAM_ABS_POS=0 -CONFIG_MTDRAM_ERASE_SIZE=128 -CONFIG_MTDRAM_TOTAL_SIZE=0 # CONFIG_MTD_CFI_INTELEXT is not set CONFIG_MTD_CONCAT=y CONFIG_MTD_MTDRAM=y +CONFIG_MTDRAM_ABS_POS=0 +CONFIG_MTDRAM_ERASE_SIZE=128 +CONFIG_MTDRAM_TOTAL_SIZE=0 # CONFIG_NETDEV_1000 is not set CONFIG_NO_IOPORT=y # CONFIG_OOM_REBOOT is not set diff --git a/target/linux/generic-2.6/config-2.6.30 b/target/linux/generic-2.6/config-2.6.30 index db44fd792..bb604056f 100644 --- a/target/linux/generic-2.6/config-2.6.30 +++ b/target/linux/generic-2.6/config-2.6.30 @@ -79,6 +79,7 @@ CONFIG_ASK_IP_FIB_HASH=y # CONFIG_ATALK is not set # CONFIG_ATA_NONSTANDARD is not set # CONFIG_ATA_OVER_ETH is not set +# CONFIG_ATA_PIIX is not set # CONFIG_ATARI_PARTITION is not set CONFIG_ATA_SFF=y # CONFIG_ATH5K is not set @@ -1237,13 +1238,13 @@ CONFIG_NET_CLS_IND=y # CONFIG_NET_CLS_TCINDEX is not set # CONFIG_NET_CLS_U32 is not set CONFIG_NET_CLS=y -# CONFIG_NET_DROP_MONITOR is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETDEBUG is not set # CONFIG_NETDEV_10000 is not set CONFIG_NETDEV_1000=y CONFIG_NETDEVICES_MULTIQUEUE=y CONFIG_NETDEVICES=y +# CONFIG_NET_DROP_MONITOR is not set # CONFIG_NET_DSA is not set # CONFIG_NET_EMATCH_CMP is not set # CONFIG_NET_EMATCH is not set @@ -1707,9 +1708,9 @@ CONFIG_RTC_LIB=y # CONFIG_RTL8180 is not set # CONFIG_RTL8187 is not set # CONFIG_RTL8306_PHY is not set -# CONFIG_RTL8366S_PHY is not set -# CONFIG_RTL8366S_PHY_DEBUG_FS is not set # CONFIG_RTL8366_SMI is not set +# CONFIG_RTL8366S_PHY_DEBUG_FS is not set +# CONFIG_RTL8366S_PHY is not set CONFIG_RT_MUTEXES=y CONFIG_RWSEM_GENERIC_SPINLOCK=y # CONFIG_S2IO is not set @@ -2545,8 +2546,8 @@ CONFIG_VLAN_8021Q=y CONFIG_VMSPLIT_3G=y # CONFIG_VT is not set # CONFIG_VXFS_FS is not set -# CONFIG_W1 is not set # CONFIG_W1_CON is not set +# CONFIG_W1 is not set # CONFIG_W1_MASTER_DS1WM is not set # CONFIG_W1_MASTER_DS2482 is not set # CONFIG_W1_MASTER_DS2490 is not set diff --git a/target/linux/generic-2.6/config-2.6.31 b/target/linux/generic-2.6/config-2.6.31 index 9cebefe7a..04eecf479 100644 --- a/target/linux/generic-2.6/config-2.6.31 +++ b/target/linux/generic-2.6/config-2.6.31 @@ -84,6 +84,7 @@ CONFIG_ASK_IP_FIB_HASH=y # CONFIG_ATALK is not set # CONFIG_ATA_NONSTANDARD is not set # CONFIG_ATA_OVER_ETH is not set +# CONFIG_ATA_PIIX is not set # CONFIG_ATARI_PARTITION is not set CONFIG_ATA_SFF=y # CONFIG_ATH5K is not set @@ -1274,13 +1275,13 @@ CONFIG_NET_CLS_IND=y # CONFIG_NET_CLS_TCINDEX is not set # CONFIG_NET_CLS_U32 is not set CONFIG_NET_CLS=y -# CONFIG_NET_DROP_MONITOR is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETDEBUG is not set # CONFIG_NETDEV_10000 is not set CONFIG_NETDEV_1000=y CONFIG_NETDEVICES_MULTIQUEUE=y CONFIG_NETDEVICES=y +# CONFIG_NET_DROP_MONITOR is not set # CONFIG_NET_DSA is not set # CONFIG_NET_EMATCH_CMP is not set # CONFIG_NET_EMATCH is not set @@ -1760,9 +1761,9 @@ CONFIG_RTC_LIB=y # CONFIG_RTL8187SE is not set # CONFIG_RTL8192SU is not set # CONFIG_RTL8306_PHY is not set -# CONFIG_RTL8366S_PHY is not set -# CONFIG_RTL8366S_PHY_DEBUG_FS is not set # CONFIG_RTL8366_SMI is not set +# CONFIG_RTL8366S_PHY_DEBUG_FS is not set +# CONFIG_RTL8366S_PHY is not set CONFIG_RT_MUTEXES=y CONFIG_RWSEM_GENERIC_SPINLOCK=y # CONFIG_S2IO is not set @@ -2619,8 +2620,8 @@ CONFIG_VMSPLIT_3G=y # CONFIG_VT6655 is not set # CONFIG_VT is not set # CONFIG_VXFS_FS is not set -# CONFIG_W1 is not set # CONFIG_W1_CON is not set +# CONFIG_W1 is not set # CONFIG_W1_MASTER_DS1WM is not set # CONFIG_W1_MASTER_DS2482 is not set # CONFIG_W1_MASTER_DS2490 is not set diff --git a/target/linux/generic-2.6/config-2.6.32 b/target/linux/generic-2.6/config-2.6.32 index ab8f2ffbf..834f5c133 100644 --- a/target/linux/generic-2.6/config-2.6.32 +++ b/target/linux/generic-2.6/config-2.6.32 @@ -86,6 +86,7 @@ CONFIG_ASK_IP_FIB_HASH=y # CONFIG_ATALK is not set # CONFIG_ATA_NONSTANDARD is not set # CONFIG_ATA_OVER_ETH is not set +# CONFIG_ATA_PIIX is not set # CONFIG_ATARI_PARTITION is not set CONFIG_ATA_SFF=y # CONFIG_ATA_VERBOSE_ERROR is not set @@ -508,8 +509,8 @@ CONFIG_EXPERIMENTAL=y # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set # CONFIG_EXT3_FS is not set # CONFIG_EXT3_FS_XATTR is not set -# CONFIG_EXT4DEV_FS is not set # CONFIG_EXT4_DEBUG is not set +# CONFIG_EXT4DEV_FS is not set # CONFIG_EXT4_FS is not set CONFIG_EXTRA_FIRMWARE="" CONFIG_EXTRA_TARGETS="" @@ -1162,11 +1163,11 @@ CONFIG_MINI_FO=y # CONFIG_MIPS_FPU_EMU is not set CONFIG_MISC_DEVICES=y CONFIG_MISC_FILESYSTEMS=y +# CONFIG_MISDN_AVMFRITZ is not set # CONFIG_MISDN_HFCPCI is not set # CONFIG_MISDN_HFCUSB is not set -# CONFIG_MISDN is not set -# CONFIG_MISDN_AVMFRITZ is not set # CONFIG_MISDN_INFINEON is not set +# CONFIG_MISDN is not set # CONFIG_MISDN_NETJET is not set # CONFIG_MISDN_SPEEDFAX is not set # CONFIG_MISDN_W6692 is not set @@ -1802,9 +1803,9 @@ CONFIG_RTC_LIB=y # CONFIG_RTL8192E is not set # CONFIG_RTL8192SU is not set # CONFIG_RTL8306_PHY is not set -# CONFIG_RTL8366S_PHY is not set -# CONFIG_RTL8366S_PHY_DEBUG_FS is not set # CONFIG_RTL8366_SMI is not set +# CONFIG_RTL8366S_PHY_DEBUG_FS is not set +# CONFIG_RTL8366S_PHY is not set CONFIG_RT_MUTEXES=y CONFIG_RWSEM_GENERIC_SPINLOCK=y # CONFIG_S2IO is not set @@ -2025,8 +2026,8 @@ CONFIG_SLAB=y # CONFIG_SLICOSS is not set # CONFIG_SLIP is not set # CONFIG_SLOB is not set -# CONFIG_SLOW_WORK is not set # CONFIG_SLOW_WORK_DEBUG is not set +# CONFIG_SLOW_WORK is not set # CONFIG_SLUB_DEBUG is not set # CONFIG_SLUB is not set # CONFIG_SMARTJOYPLUS_FF is not set @@ -2195,8 +2196,8 @@ CONFIG_SQUASHFS=y # CONFIG_SSB is not set # CONFIG_SSB_PCMCIAHOST is not set CONFIG_SSB_POSSIBLE=y -# CONFIG_SSB_SILENT is not set # CONFIG_SSB_SDIOHOST is not set +# CONFIG_SSB_SILENT is not set # CONFIG_SSFDC is not set # CONFIG_STACK_TRACER is not set CONFIG_STACKTRACE_SUPPORT=y @@ -2674,8 +2675,8 @@ CONFIG_VMSPLIT_3G=y # CONFIG_VT6656 is not set # CONFIG_VT is not set # CONFIG_VXFS_FS is not set -# CONFIG_W1 is not set # CONFIG_W1_CON is not set +# CONFIG_W1 is not set # CONFIG_W1_MASTER_DS1WM is not set # CONFIG_W1_MASTER_DS2482 is not set # CONFIG_W1_MASTER_DS2490 is not set diff --git a/target/linux/iop32x/config-default b/target/linux/iop32x/config-default index 979a4051b..8f6b9e1a1 100644 --- a/target/linux/iop32x/config-default +++ b/target/linux/iop32x/config-default @@ -8,21 +8,20 @@ CONFIG_ARCH_REQUIRE_GPIOLIB=y # CONFIG_ARCH_SPARSEMEM_DEFAULT is not set # CONFIG_ARCH_SUPPORTS_MSI is not set CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARM=y CONFIG_ARM_L1_CACHE_SHIFT=5 # CONFIG_ARM_THUMB is not set +CONFIG_ARM=y # CONFIG_ARPD is not set CONFIG_ATA=m -# CONFIG_ATA_PIIX is not set CONFIG_BITREVERSE=y CONFIG_CFG80211_DEFAULT_PS_VALUE=0 CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=squashfs,jffs2 noinitrd console=ttyS0,115200" -CONFIG_CPU_32=y CONFIG_CPU_32v5=y +CONFIG_CPU_32=y CONFIG_CPU_ABRT_EV5T=y CONFIG_CPU_CACHE_VIVT=y -CONFIG_CPU_CP15=y CONFIG_CPU_CP15_MMU=y +CONFIG_CPU_CP15=y CONFIG_CPU_PABRT_LEGACY=y CONFIG_CPU_TLB_V4WBI=y CONFIG_CPU_XSCALE=y @@ -63,18 +62,18 @@ CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_LATENCYTOP_SUPPORT=y CONFIG_HAVE_OPROFILE=y -CONFIG_HDLC=m CONFIG_HDLC_CISCO=m CONFIG_HDLC_FR=m +CONFIG_HDLC=m CONFIG_HDLC_PPP=m CONFIG_HDLC_RAW=m -CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set +CONFIG_HWMON=y CONFIG_HW_RANDOM=y -CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_CHARDEV=y # CONFIG_I2C_IOP3XX is not set +CONFIG_I2C=y CONFIG_INITRAMFS_SOURCE="" CONFIG_INTEL_IOP_ADMA=y # CONFIG_IOP_WATCHDOG is not set @@ -84,8 +83,8 @@ CONFIG_IP_PIMSM_V2=y # CONFIG_IWMMXT is not set # CONFIG_KERNEL_BZIP2 is not set # CONFIG_LEDS_GPIO is not set -CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 +CONFIG_LEGACY_PTYS=y # CONFIG_MACH_EM7210 is not set # CONFIG_MACH_GLANTANK is not set CONFIG_MACH_N2100=y @@ -96,8 +95,8 @@ CONFIG_NLS=m CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_PAGE_OFFSET=0xC0000000 CONFIG_PLAT_IOP=y -CONFIG_R8169=y CONFIG_R8169_VLAN=y +CONFIG_R8169=y CONFIG_RTC_CLASS=y CONFIG_RTC_DRV_PCF8563=y CONFIG_RTC_DRV_X1205=y @@ -109,8 +108,8 @@ CONFIG_SYS_SUPPORTS_APM_EMULATION=y # CONFIG_TREE_PREEMPT_RCU is not set CONFIG_TREE_RCU=y CONFIG_UID16=y -CONFIG_USB=m CONFIG_USB_EHCI_HCD=m +CONFIG_USB=m # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set CONFIG_USB_OHCI_HCD=m diff --git a/target/linux/mpc52xx/config-2.6.30 b/target/linux/mpc52xx/config-2.6.30 index 9faed93d2..9e5b9c20b 100644 --- a/target/linux/mpc52xx/config-2.6.30 +++ b/target/linux/mpc52xx/config-2.6.30 @@ -155,8 +155,8 @@ CONFIG_OF=y # CONFIG_PACKET_MMAP is not set CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_PAGE_OFFSET=0xc0000000 -# CONFIG_PATA_MPC52xx is not set # CONFIG_PARTITION_ADVANCED is not set +# CONFIG_PATA_MPC52xx is not set CONFIG_PCI_DOMAINS=y # CONFIG_PCIEPORTBUS is not set CONFIG_PCI_LEGACY=y diff --git a/target/linux/mpc83xx/config-default b/target/linux/mpc83xx/config-default index 01bd7f06f..ebb72ac4b 100644 --- a/target/linux/mpc83xx/config-default +++ b/target/linux/mpc83xx/config-default @@ -21,15 +21,14 @@ CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y # CONFIG_ASP834x is not set CONFIG_ATA=y -# CONFIG_ATA_PIIX is not set CONFIG_AUDIT_ARCH=y CONFIG_BITREVERSE=y # CONFIG_BOOTX_TEXT is not set CONFIG_BOUNCE=y # CONFIG_BRIQ_PANEL is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y -CONFIG_CMDLINE="console=ttyS0,115200" CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE="console=ttyS0,115200" CONFIG_DECOMPRESS_LZMA=y CONFIG_DEFAULT_UIMAGE=y CONFIG_DEVPORT=y @@ -48,8 +47,8 @@ CONFIG_FSL_SOC=y # CONFIG_FSNOTIFY is not set CONFIG_GENERIC_ATOMIC64=y CONFIG_GENERIC_BUG=y -CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y @@ -86,16 +85,16 @@ CONFIG_HAVE_PERF_COUNTERS=y # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set # CONFIG_HVC_RTAS is not set CONFIG_HW_RANDOM=y -CONFIG_HZ=250 # CONFIG_HZ_100 is not set +CONFIG_HZ=250 CONFIG_HZ_250=y CONFIG_INITRAMFS_SOURCE="" # CONFIG_IOMMU_HELPER is not set CONFIG_IPIC=y -# CONFIG_IRQSTACKS is not set CONFIG_IRQ_PER_CPU=y -# CONFIG_ISA is not set +# CONFIG_IRQSTACKS is not set CONFIG_ISA_DMA_API=y +# CONFIG_ISA is not set # CONFIG_JFFS2_FS is not set CONFIG_KERNEL_START=0xc0000000 # CONFIG_KMETER1 is not set @@ -116,33 +115,32 @@ CONFIG_MAC80211_DEFAULT_PS_VALUE=0 # CONFIG_MPC837x_MDS is not set CONFIG_MPC837x_RDB=y # CONFIG_MPC8xxx_GPIO is not set -CONFIG_MPIC=y # CONFIG_MPIC_WEIRD is not set -CONFIG_MTD_NAND=y +CONFIG_MPIC=y # CONFIG_MTD_NAND_FSL_ELBC is not set # CONFIG_MTD_NAND_FSL_UPM is not set CONFIG_MTD_NAND_RB_PPC=y -CONFIG_MTD_PHYSMAP_OF=y +CONFIG_MTD_NAND=y CONFIG_MTD_OF_PARTS=y +CONFIG_MTD_PHYSMAP_OF=y # CONFIG_MV643XX_ETH is not set -CONFIG_OF=y CONFIG_OF_DEVICE=y CONFIG_OF_GPIO=y CONFIG_OF_MDIO=y +CONFIG_OF=y CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_PAGE_OFFSET=0xc0000000 CONFIG_PATA_RB_PPC=m -CONFIG_PCIEAER=y -# CONFIG_PCIEAER_INJECT is not set -CONFIG_PCIEPORTBUS=y -# CONFIG_PCIE_ECRC is not set CONFIG_PCI_DISABLE_COMMON_QUIRKS=y CONFIG_PCI_DOMAINS=y +# CONFIG_PCIEAER_INJECT is not set +CONFIG_PCIEAER=y +# CONFIG_PCIE_ECRC is not set +CONFIG_PCIEPORTBUS=y CONFIG_PCSPKR_PLATFORM=y # CONFIG_PERF_COUNTERS is not set CONFIG_PHYLIB=y CONFIG_PHYSICAL_START=0x00000000 -CONFIG_PPC=y CONFIG_PPC32=y # CONFIG_PPC64 is not set # CONFIG_PPC_82xx is not set @@ -151,8 +149,8 @@ CONFIG_PPC_83xx=y # CONFIG_PPC_86xx is not set # CONFIG_PPC_8xx is not set # CONFIG_PPC_970_NAP is not set -CONFIG_PPC_BOOK3S=y CONFIG_PPC_BOOK3S_32=y +CONFIG_PPC_BOOK3S=y # CONFIG_PPC_CELL is not set # CONFIG_PPC_CELL_NATIVE is not set # CONFIG_PPC_CHRP is not set @@ -173,15 +171,16 @@ CONFIG_PPC_MPC106=y CONFIG_PPC_MPC834x=y CONFIG_PPC_MPC837x=y CONFIG_PPC_NATIVE=y -CONFIG_PPC_OF=y CONFIG_PPC_OF_BOOT_TRAMPOLINE=y +CONFIG_PPC_OF=y CONFIG_PPC_PCI_CHOICE=y # CONFIG_PPC_PMAC is not set CONFIG_PPC_RTAS=y -CONFIG_PPC_STD_MMU=y CONFIG_PPC_STD_MMU_32=y +CONFIG_PPC_STD_MMU=y CONFIG_PPC_UDBG_16550=y CONFIG_PPC_WERROR=y +CONFIG_PPC=y # CONFIG_PQ2ADS is not set CONFIG_PRINT_STACK_DEPTH=64 CONFIG_PROC_DEVICETREE=y diff --git a/target/linux/octeon/config-2.6.30 b/target/linux/octeon/config-2.6.30 index 5054d158a..d6d296a93 100644 --- a/target/linux/octeon/config-2.6.30 +++ b/target/linux/octeon/config-2.6.30 @@ -1,9 +1,9 @@ # CONFIG_32BIT is not set -CONFIG_64BIT=y CONFIG_64BIT_PHYS_ADDR=y +CONFIG_64BIT=y # CONFIG_ALTERA_PCIE_CHDMA is not set -# CONFIG_ANDROID is not set # CONFIG_ANDROID_BINDER_IPC is not set +# CONFIG_ANDROID is not set # CONFIG_ANDROID_LOGGER is not set # CONFIG_ANDROID_LOW_MEMORY_KILLER is not set # CONFIG_ANDROID_RAM_CONSOLE is not set @@ -30,22 +30,22 @@ CONFIG_BSD_PROCESS_ACCT_V3=y # CONFIG_CAVIUM_OCTEON_2ND_KERNEL is not set CONFIG_CAVIUM_OCTEON_CVMSEG_SIZE=2 CONFIG_CAVIUM_OCTEON_HW_FIX_UNALIGNED=y -CONFIG_CAVIUM_OCTEON_LOCK_L2=y CONFIG_CAVIUM_OCTEON_LOCK_L2_EXCEPTION=y CONFIG_CAVIUM_OCTEON_LOCK_L2_INTERRUPT=y CONFIG_CAVIUM_OCTEON_LOCK_L2_LOW_LEVEL_INTERRUPT=y CONFIG_CAVIUM_OCTEON_LOCK_L2_MEMCPY=y CONFIG_CAVIUM_OCTEON_LOCK_L2_TLB=y +CONFIG_CAVIUM_OCTEON_LOCK_L2=y CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD=y # CONFIG_CAVIUM_OCTEON_SIMULATOR is not set CONFIG_CAVIUM_OCTEON_SPECIFIC_OPTIONS=y -CONFIG_CEVT_R4K=y CONFIG_CEVT_R4K_LIB=y +CONFIG_CEVT_R4K=y # CONFIG_CGROUP_SCHED is not set CONFIG_CMDLINE="console=ttyS0,115200" # CONFIG_COMEDI is not set -CONFIG_COMPAT=y CONFIG_COMPAT_BRK=y +CONFIG_COMPAT=y CONFIG_CPU_BIG_ENDIAN=y CONFIG_CPU_CAVIUM_OCTEON=y CONFIG_CPU_HAS_PREFETCH=y @@ -83,8 +83,8 @@ CONFIG_DEBUG_INFO=y CONFIG_DEBUG_KERNEL=y # CONFIG_DEBUG_KOBJECT is not set # CONFIG_DEBUG_LIST is not set -# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_DEBUG_OBJECTS is not set @@ -92,8 +92,8 @@ CONFIG_DEBUG_KERNEL=y # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_SHIRQ is not set # CONFIG_DEBUG_SLAB is not set -CONFIG_DEBUG_SPINLOCK=y CONFIG_DEBUG_SPINLOCK_SLEEP=y +CONFIG_DEBUG_SPINLOCK=y # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_WRITECOUNT is not set @@ -116,8 +116,8 @@ CONFIG_FAIR_GROUP_SCHED=y # CONFIG_FLATMEM_MANUAL is not set CONFIG_FRAME_WARN=2048 # CONFIG_FW_LOADER is not set -CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y @@ -132,31 +132,31 @@ CONFIG_HAVE_ARCH_KGDB=y # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_HAVE_IDE=y CONFIG_HAVE_MEMORY_PRESENT=y -CONFIG_HAVE_MLOCK=y CONFIG_HAVE_MLOCKED_PAGE_BIT=y +CONFIG_HAVE_MLOCK=y CONFIG_HAVE_OPROFILE=y CONFIG_HAVE_SYSCALL_WRAPPERS=y # CONFIG_HECI is not set # CONFIG_HIGH_RES_TIMERS is not set CONFIG_HW_HAS_PCI=y -CONFIG_HW_RANDOM=y CONFIG_HW_RANDOM_OCTEON=y -CONFIG_HZ=250 +CONFIG_HW_RANDOM=y # CONFIG_HZ_100 is not set +CONFIG_HZ=250 CONFIG_HZ_250=y CONFIG_INITRAMFS_SOURCE="" -CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y -CONFIG_IRQ_CPU=y +CONFIG_INOTIFY=y CONFIG_IRQ_CPU_OCTEON=y +CONFIG_IRQ_CPU=y CONFIG_IRQ_PER_CPU=y # CONFIG_ISDN is not set -CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set +CONFIG_KALLSYMS=y CONFIG_KEXEC=y # CONFIG_KGDB is not set -CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 +CONFIG_LEGACY_PTYS=y # CONFIG_LEMOTE_FULONG is not set CONFIG_LOCK_KERNEL=y # CONFIG_LOCK_STAT is not set @@ -170,7 +170,6 @@ CONFIG_MAGIC_SYSRQ=y # CONFIG_ME4000 is not set # CONFIG_MEILHAUS is not set # CONFIG_MIKROTIK_RB532 is not set -CONFIG_MIPS=y CONFIG_MIPS32_COMPAT=y CONFIG_MIPS32_N32=y CONFIG_MIPS32_O32=y @@ -182,6 +181,7 @@ CONFIG_MIPS_MT_DISABLED=y # CONFIG_MIPS_MT_SMP is not set # CONFIG_MIPS_MT_SMTC is not set # CONFIG_MIPS_SIM is not set +CONFIG_MIPS=y # CONFIG_MISC_DEVICES is not set # CONFIG_MTD_CFI_INTELEXT is not set # CONFIG_MTD_COMPLEX_MAPPINGS is not set @@ -206,20 +206,20 @@ CONFIG_PHYS_ADDR_T_64BIT=y # CONFIG_PNX8550_JBS is not set # CONFIG_PNX8550_STB810 is not set # CONFIG_POHMELFS is not set -CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y +CONFIG_POSIX_MQUEUE=y # CONFIG_PROBE_INITRD_HEADER is not set CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROVE_LOCKING is not set # CONFIG_RCU_TORTURE_TEST is not set CONFIG_RELAY=y -# CONFIG_RTL8187SE is not set # CONFIG_RT_GROUP_SCHED is not set +# CONFIG_RTL8187SE is not set # CONFIG_RT_MUTEX_TESTER is not set # CONFIG_RUNTIME_DEBUG is not set -# CONFIG_SCHEDSTATS is not set CONFIG_SCHED_DEBUG=y CONFIG_SCHED_OMIT_FRAME_POINTER=y +# CONFIG_SCHEDSTATS is not set # CONFIG_SCSI_DMA is not set CONFIG_SECCOMP=y # CONFIG_SERIAL_8250_EXTENDED is not set @@ -237,16 +237,15 @@ CONFIG_SECCOMP=y # CONFIG_SIBYTE_SWARM is not set # CONFIG_SLOW_WORK is not set CONFIG_SMP=y -CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_MANUAL=y CONFIG_SPARSEMEM_STATIC=y -CONFIG_STAGING=y +CONFIG_SPARSEMEM=y # CONFIG_STAGING_EXCLUDE_BUILD is not set +CONFIG_STAGING=y CONFIG_STOP_MACHINE=y CONFIG_SWAP_IO_SPACE=y -CONFIG_SYSFS_DEPRECATED=y CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_SYSVIPC_COMPAT=y +CONFIG_SYSFS_DEPRECATED=y CONFIG_SYS_HAS_CPU_CAVIUM_OCTEON=y CONFIG_SYS_HAS_EARLY_PRINTK=y CONFIG_SYS_SUPPORTS_64BIT_KERNEL=y @@ -254,13 +253,14 @@ CONFIG_SYS_SUPPORTS_ARBIT_HZ=y CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y CONFIG_SYS_SUPPORTS_HIGHMEM=y CONFIG_SYS_SUPPORTS_SMP=y +CONFIG_SYSVIPC_COMPAT=y # CONFIG_TC35815 is not set # CONFIG_TIMER_STATS is not set CONFIG_TRACING_SUPPORT=y CONFIG_UNEVICTABLE_LRU=y CONFIG_USB_SUPPORT=y -CONFIG_USER_SCHED=y CONFIG_USE_GENERIC_SMP_HELPERS=y +CONFIG_USER_SCHED=y # CONFIG_VLAN_8021Q is not set CONFIG_VM_EVENT_COUNTERS=y CONFIG_WEAK_ORDERING=y diff --git a/target/linux/omap35xx/config-2.6.32 b/target/linux/omap35xx/config-2.6.32 index d08ff8900..2cac84672 100644 --- a/target/linux/omap35xx/config-2.6.32 +++ b/target/linux/omap35xx/config-2.6.32 @@ -1,869 +1,1053 @@ + # +# AC97 GPIO expanders: +# also be needed; see USB_STORAGE Help for more info +# Android +# At least one emulation must be selected +# Audio decoders +# Authenticated Encryption with Associated Data # Automatically generated make config: don't edit -# Linux kernel version: 2.6.32-rc5 -# Thu Dec 10 00:13:17 2009 -# -CONFIG_ARM=y -CONFIG_SYS_SUPPORTS_APM_EMULATION=y -CONFIG_GENERIC_GPIO=y -CONFIG_GENERIC_TIME=y -CONFIG_GENERIC_CLOCKEVENTS=y -CONFIG_GENERIC_HARDIRQS=y -CONFIG_STACKTRACE_SUPPORT=y -CONFIG_HAVE_LATENCYTOP_SUPPORT=y -CONFIG_LOCKDEP_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_HARDIRQS_SW_RESEND=y -CONFIG_GENERIC_IRQ_PROBE=y -CONFIG_RWSEM_GENERIC_SPINLOCK=y -CONFIG_ARCH_HAS_CPUFREQ=y -CONFIG_GENERIC_HWEIGHT=y -CONFIG_GENERIC_CALIBRATE_DELAY=y -CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y -CONFIG_VECTORS_BASE=0xffff0000 -CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" -CONFIG_CONSTRUCTORS=y - -# -# General setup -# -CONFIG_EXPERIMENTAL=y -CONFIG_BROKEN_ON_SMP=y -CONFIG_INIT_ENV_ARG_LIMIT=32 -CONFIG_LOCALVERSION="" -CONFIG_LOCALVERSION_AUTO=y -CONFIG_HAVE_KERNEL_GZIP=y -CONFIG_HAVE_KERNEL_LZMA=y -CONFIG_HAVE_KERNEL_LZO=y -# CONFIG_KERNEL_GZIP is not set -# CONFIG_KERNEL_BZIP2 is not set -CONFIG_KERNEL_LZMA=y -# CONFIG_KERNEL_LZO is not set -CONFIG_SWAP=y -CONFIG_SYSVIPC=y -CONFIG_SYSVIPC_SYSCTL=y -# CONFIG_POSIX_MQUEUE is not set -CONFIG_BSD_PROCESS_ACCT=y -# CONFIG_BSD_PROCESS_ACCT_V3 is not set -# CONFIG_TASKSTATS is not set -# CONFIG_AUDIT is not set - -# -# RCU Subsystem -# -CONFIG_TREE_RCU=y -# CONFIG_TREE_PREEMPT_RCU is not set -# CONFIG_RCU_TRACE is not set -CONFIG_RCU_FANOUT=32 -# CONFIG_RCU_FANOUT_EXACT is not set -# CONFIG_TREE_RCU_TRACE is not set -# CONFIG_IKCONFIG is not set -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_GROUP_SCHED=y -CONFIG_FAIR_GROUP_SCHED=y -# CONFIG_RT_GROUP_SCHED is not set -CONFIG_USER_SCHED=y -# CONFIG_CGROUP_SCHED is not set -# CONFIG_CGROUPS is not set -CONFIG_SYSFS_DEPRECATED=y -CONFIG_SYSFS_DEPRECATED_V2=y -# CONFIG_RELAY is not set -# CONFIG_NAMESPACES is not set -CONFIG_BLK_DEV_INITRD=y -CONFIG_INITRAMFS_SOURCE="" -# CONFIG_RD_GZIP is not set -# CONFIG_RD_BZIP2 is not set -CONFIG_RD_LZMA=y -# CONFIG_RD_LZO is not set -CONFIG_CC_OPTIMIZE_FOR_SIZE=y -CONFIG_SYSCTL=y -CONFIG_ANON_INODES=y -CONFIG_EMBEDDED=y -CONFIG_UID16=y -# CONFIG_SYSCTL_SYSCALL is not set -# CONFIG_KALLSYMS is not set -CONFIG_HOTPLUG=y -CONFIG_PRINTK=y -CONFIG_BUG=y -CONFIG_ELF_CORE=y -CONFIG_BASE_FULL=y -CONFIG_FUTEX=y -CONFIG_EPOLL=y -CONFIG_SIGNALFD=y -CONFIG_TIMERFD=y -CONFIG_EVENTFD=y -CONFIG_SHMEM=y +# Block modes +# Boot options +# Bus support +# Caches +# Camera Sensor Selection +# CBUS support +# CD-ROM/DVD Filesystems +# CFG80211 needs to be enabled for MAC80211 +# Character devices +# Ciphers +# Compression +# CONFIG_AB3100_CORE is not set +# CONFIG_ACCESSIBILITY is not set +# CONFIG_ACORN_PARTITION is not set +# CONFIG_ADFS_FS is not set +CONFIG_AEABI=y +# CONFIG_AFFS_FS is not set +# CONFIG_AF_RXRPC is not set CONFIG_AIO=y - -# -# Kernel Performance Events And Counters -# -CONFIG_VM_EVENT_COUNTERS=y -CONFIG_COMPAT_BRK=y -CONFIG_SLAB=y -# CONFIG_SLUB is not set -# CONFIG_SLOB is not set -# CONFIG_PROFILING is not set -CONFIG_HAVE_OPROFILE=y -CONFIG_HAVE_KPROBES=y -CONFIG_HAVE_KRETPROBES=y -CONFIG_HAVE_CLK=y - -# -# GCOV-based kernel profiling -# -# CONFIG_GCOV_KERNEL is not set -# CONFIG_SLOW_WORK is not set -CONFIG_HAVE_GENERIC_DMA_COHERENT=y -CONFIG_SLABINFO=y -CONFIG_RT_MUTEXES=y -CONFIG_BASE_SMALL=0 -CONFIG_MODULES=y -# CONFIG_MODULE_FORCE_LOAD is not set -CONFIG_MODULE_UNLOAD=y -# CONFIG_MODULE_FORCE_UNLOAD is not set -CONFIG_MODVERSIONS=y -CONFIG_MODULE_SRCVERSION_ALL=y -CONFIG_BLOCK=y -# CONFIG_LBDAF is not set -# CONFIG_BLK_DEV_BSG is not set -# CONFIG_BLK_DEV_INTEGRITY is not set - -# -# IO Schedulers -# -CONFIG_IOSCHED_NOOP=y -CONFIG_IOSCHED_AS=y -CONFIG_IOSCHED_DEADLINE=y -CONFIG_IOSCHED_CFQ=y -CONFIG_DEFAULT_AS=y -# CONFIG_DEFAULT_DEADLINE is not set -# CONFIG_DEFAULT_CFQ is not set -# CONFIG_DEFAULT_NOOP is not set -CONFIG_DEFAULT_IOSCHED="anticipatory" -CONFIG_FREEZER=y - -# -# System Type -# -CONFIG_MMU=y +CONFIG_ALIGNMENT_TRAP=y +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_ANDROID is not set +CONFIG_ANON_INODES=y +# CONFIG_APM_EMULATION is not set # CONFIG_ARCH_AAEC2000 is not set -# CONFIG_ARCH_INTEGRATOR is not set -# CONFIG_ARCH_REALVIEW is not set -# CONFIG_ARCH_VERSATILE is not set # CONFIG_ARCH_AT91 is not set +# CONFIG_ARCH_BCMRING is not set # CONFIG_ARCH_CLPS711X is not set -# CONFIG_ARCH_GEMINI is not set +# CONFIG_ARCH_DAVINCI is not set # CONFIG_ARCH_EBSA110 is not set # CONFIG_ARCH_EP93XX is not set # CONFIG_ARCH_FOOTBRIDGE is not set -# CONFIG_ARCH_MXC is not set -# CONFIG_ARCH_STMP3XXX is not set -# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_GEMINI is not set # CONFIG_ARCH_H720X is not set -# CONFIG_ARCH_NOMADIK is not set +CONFIG_ARCH_HAS_CPUFREQ=y +# CONFIG_ARCH_INTEGRATOR is not set # CONFIG_ARCH_IOP13XX is not set # CONFIG_ARCH_IOP32X is not set # CONFIG_ARCH_IOP33X is not set -# CONFIG_ARCH_IXP23XX is not set # CONFIG_ARCH_IXP2000 is not set +# CONFIG_ARCH_IXP23XX is not set # CONFIG_ARCH_IXP4XX is not set -# CONFIG_ARCH_L7200 is not set # CONFIG_ARCH_KIRKWOOD is not set -# CONFIG_ARCH_LOKI is not set -# CONFIG_ARCH_MV78XX0 is not set -# CONFIG_ARCH_ORION5X is not set -# CONFIG_ARCH_MMP is not set # CONFIG_ARCH_KS8695 is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_LH7A40X is not set +# CONFIG_ARCH_LOKI is not set +# CONFIG_ARCH_MMP is not set +# CONFIG_ARCH_MSM is not set +# CONFIG_ARCH_MV78XX0 is not set +# CONFIG_ARCH_MXC is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_NOMADIK is not set # CONFIG_ARCH_NS9XXX is not set -# CONFIG_ARCH_W90X900 is not set +# CONFIG_ARCH_OMAP1 is not set +# CONFIG_ARCH_OMAP2 is not set +CONFIG_ARCH_OMAP3430=y +CONFIG_ARCH_OMAP34XX=y +CONFIG_ARCH_OMAP3=y +# CONFIG_ARCH_OMAP4 is not set +CONFIG_ARCH_OMAP_OTG=y +CONFIG_ARCH_OMAP=y +# CONFIG_ARCH_ORION5X is not set # CONFIG_ARCH_PNX4008 is not set # CONFIG_ARCH_PXA is not set -# CONFIG_ARCH_MSM is not set +# CONFIG_ARCH_REALVIEW is not set +CONFIG_ARCH_REQUIRE_GPIOLIB=y # CONFIG_ARCH_RPC is not set -# CONFIG_ARCH_SA1100 is not set # CONFIG_ARCH_S3C2410 is not set # CONFIG_ARCH_S3C64XX is not set # CONFIG_ARCH_S5PC1XX is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set # CONFIG_ARCH_SHARK is not set -# CONFIG_ARCH_LH7A40X is not set +# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set +# CONFIG_ARCH_STMP3XXX is not set +# CONFIG_ARCH_SUPPORTS_MSI is not set +CONFIG_ARCH_SUSPEND_POSSIBLE=y # CONFIG_ARCH_U300 is not set -# CONFIG_ARCH_DAVINCI is not set -CONFIG_ARCH_OMAP=y -# CONFIG_ARCH_BCMRING is not set - -# -# TI OMAP Implementations -# -CONFIG_ARCH_OMAP_OTG=y -# CONFIG_ARCH_OMAP1 is not set -# CONFIG_ARCH_OMAP2 is not set -CONFIG_ARCH_OMAP3=y -# CONFIG_ARCH_OMAP4 is not set - -# -# OMAP Feature Selections -# -# CONFIG_OMAP_DEBUG_POWERDOMAIN is not set -# CONFIG_OMAP_DEBUG_CLOCKDOMAIN is not set -# CONFIG_OMAP_RESET_CLOCKS is not set -# CONFIG_OMAP_MUX is not set -CONFIG_OMAP_MCBSP=y -# CONFIG_OMAP_MBOX_FWK is not set -# CONFIG_OMAP_MPU_TIMER is not set -CONFIG_OMAP_32K_TIMER=y -CONFIG_OMAP_32K_TIMER_HZ=128 -CONFIG_OMAP_DM_TIMER=y -# CONFIG_OMAP_LL_DEBUG_UART1 is not set -# CONFIG_OMAP_LL_DEBUG_UART2 is not set -CONFIG_OMAP_LL_DEBUG_UART3=y -# CONFIG_OMAP_PM_NONE is not set -CONFIG_OMAP_PM_NOOP=y -CONFIG_ARCH_OMAP34XX=y -CONFIG_ARCH_OMAP3430=y - -# -# OMAP Board Type -# -CONFIG_MACH_OMAP3_BEAGLE=y -# CONFIG_MACH_OMAP_LDP is not set -# CONFIG_MACH_OVERO is not set -# CONFIG_MACH_OMAP3EVM is not set -# CONFIG_MACH_OMAP3_PANDORA is not set -# CONFIG_MACH_OMAP_3430SDP is not set -# CONFIG_MACH_NOKIA_RX51 is not set -# CONFIG_MACH_OMAP_ZOOM2 is not set - -# -# Processor Type -# -CONFIG_CPU_32=y -CONFIG_CPU_32v6K=y -CONFIG_CPU_V7=y -CONFIG_CPU_32v7=y -CONFIG_CPU_ABRT_EV7=y -CONFIG_CPU_PABRT_V7=y -CONFIG_CPU_CACHE_V7=y -CONFIG_CPU_CACHE_VIPT=y -CONFIG_CPU_COPY_V6=y -CONFIG_CPU_TLB_V7=y -CONFIG_CPU_HAS_ASID=y -CONFIG_CPU_CP15=y -CONFIG_CPU_CP15_MMU=y - -# -# Processor Features -# -CONFIG_ARM_THUMB=y -# CONFIG_ARM_THUMBEE is not set -# CONFIG_CPU_ICACHE_DISABLE is not set -# CONFIG_CPU_DCACHE_DISABLE is not set -# CONFIG_CPU_BPREDICT_DISABLE is not set -CONFIG_HAS_TLS_REG=y -CONFIG_ARM_L1_CACHE_SHIFT=6 +# CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_W90X900 is not set # CONFIG_ARM_ERRATA_430973 is not set # CONFIG_ARM_ERRATA_458693 is not set # CONFIG_ARM_ERRATA_460075 is not set -CONFIG_COMMON_CLKDEV=y - -# -# Bus support -# -# CONFIG_PCI_SYSCALL is not set -# CONFIG_ARCH_SUPPORTS_MSI is not set -# CONFIG_PCCARD is not set - -# -# Kernel Features -# -CONFIG_TICK_ONESHOT=y -CONFIG_NO_HZ=y -CONFIG_HIGH_RES_TIMERS=y -CONFIG_GENERIC_CLOCKEVENTS_BUILD=y -CONFIG_VMSPLIT_3G=y -# CONFIG_VMSPLIT_2G is not set -# CONFIG_VMSPLIT_1G is not set -CONFIG_PAGE_OFFSET=0xC0000000 -CONFIG_PREEMPT_NONE=y -# CONFIG_PREEMPT_VOLUNTARY is not set -# CONFIG_PREEMPT is not set -CONFIG_HZ=128 -# CONFIG_THUMB2_KERNEL is not set -CONFIG_AEABI=y -# CONFIG_OABI_COMPAT is not set -# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set -# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set -# CONFIG_HIGHMEM is not set -CONFIG_SELECT_MEMORY_MODEL=y -CONFIG_FLATMEM_MANUAL=y -# CONFIG_DISCONTIGMEM_MANUAL is not set -# CONFIG_SPARSEMEM_MANUAL is not set -CONFIG_FLATMEM=y -CONFIG_FLAT_NODE_MEM_MAP=y -CONFIG_PAGEFLAGS_EXTENDED=y -CONFIG_SPLIT_PTLOCK_CPUS=4 -# CONFIG_PHYS_ADDR_T_64BIT is not set -CONFIG_ZONE_DMA_FLAG=0 -CONFIG_VIRT_TO_BUS=y -CONFIG_HAVE_MLOCK=y -CONFIG_HAVE_MLOCKED_PAGE_BIT=y -# CONFIG_KSM is not set -CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 -# CONFIG_LEDS is not set -CONFIG_ALIGNMENT_TRAP=y -# CONFIG_UACCESS_WITH_MEMCPY is not set - -# -# Boot options -# -CONFIG_ZBOOT_ROM_TEXT=0x0 -CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_CMDLINE="root=/dev/nfs nfsroot=192.168.0.1:/home/user/buildroot ip=192.168.0.2:192.168.0.1:192.168.0.1:255.255.255.0:tgt:eth0:off rw console=ttyS2,115200n8" -# CONFIG_XIP_KERNEL is not set -# CONFIG_KEXEC is not set - -# -# CPU Power Management -# -# CONFIG_CPU_FREQ is not set -# CONFIG_CPU_IDLE is not set - -# -# Floating point emulation -# - -# -# At least one emulation must be selected -# -CONFIG_VFP=y -CONFIG_VFPv3=y -# CONFIG_NEON is not set - -# -# Userspace binary formats -# -CONFIG_BINFMT_ELF=y -# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set -CONFIG_HAVE_AOUT=y -# CONFIG_BINFMT_AOUT is not set -CONFIG_BINFMT_MISC=y - -# -# Power management options -# -CONFIG_PM=y -# CONFIG_PM_DEBUG is not set -CONFIG_PM_SLEEP=y -CONFIG_SUSPEND=y -CONFIG_SUSPEND_FREEZER=y -# CONFIG_APM_EMULATION is not set -CONFIG_PM_RUNTIME=y -CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_NET=y - -# -# Networking options -# -CONFIG_PACKET=y -# CONFIG_PACKET_MMAP is not set -CONFIG_UNIX=y -CONFIG_XFRM=y -# CONFIG_XFRM_USER is not set -# CONFIG_XFRM_SUB_POLICY is not set -# CONFIG_XFRM_MIGRATE is not set -# CONFIG_XFRM_STATISTICS is not set -CONFIG_NET_KEY=y -# CONFIG_NET_KEY_MIGRATE is not set -CONFIG_INET=y -# CONFIG_IP_MULTICAST is not set -# CONFIG_IP_ADVANCED_ROUTER is not set -CONFIG_IP_FIB_HASH=y -CONFIG_IP_PNP=y -CONFIG_IP_PNP_DHCP=y -CONFIG_IP_PNP_BOOTP=y -CONFIG_IP_PNP_RARP=y -# CONFIG_NET_IPIP is not set -# CONFIG_NET_IPGRE is not set +CONFIG_ARM_L1_CACHE_SHIFT=6 +# CONFIG_ARM_THUMBEE is not set +CONFIG_ARM_THUMB=y +# CONFIG_ARM_UNWIND is not set +CONFIG_ARM=y # CONFIG_ARPD is not set -# CONFIG_SYN_COOKIES is not set -# CONFIG_INET_AH is not set -# CONFIG_INET_ESP is not set -# CONFIG_INET_IPCOMP is not set -# CONFIG_INET_XFRM_TUNNEL is not set -# CONFIG_INET_TUNNEL is not set -CONFIG_INET_XFRM_MODE_TRANSPORT=y -CONFIG_INET_XFRM_MODE_TUNNEL=y -CONFIG_INET_XFRM_MODE_BEET=y -# CONFIG_INET_LRO is not set -CONFIG_INET_DIAG=y -CONFIG_INET_TCP_DIAG=y -# CONFIG_TCP_CONG_ADVANCED is not set -CONFIG_TCP_CONG_CUBIC=y -CONFIG_DEFAULT_TCP_CONG="cubic" -# CONFIG_TCP_MD5SIG is not set -# CONFIG_IPV6 is not set -# CONFIG_NETWORK_SECMARK is not set -# CONFIG_NETFILTER is not set -# CONFIG_IP_DCCP is not set -# CONFIG_IP_SCTP is not set -# CONFIG_RDS is not set -# CONFIG_TIPC is not set -# CONFIG_ATM is not set -# CONFIG_BRIDGE is not set -# CONFIG_NET_DSA is not set -# CONFIG_VLAN_8021Q is not set -# CONFIG_DECNET is not set -# CONFIG_LLC2 is not set -# CONFIG_IPX is not set +# CONFIG_ASUS_OLED is not set +# CONFIG_ATA is not set # CONFIG_ATALK is not set -# CONFIG_X25 is not set -# CONFIG_LAPB is not set -# CONFIG_ECONET is not set -# CONFIG_WAN_ROUTER is not set -# CONFIG_PHONET is not set -# CONFIG_IEEE802154 is not set -# CONFIG_NET_SCHED is not set -# CONFIG_DCB is not set - -# -# Network testing -# -# CONFIG_NET_PKTGEN is not set -# CONFIG_HAMRADIO is not set -# CONFIG_CAN is not set -# CONFIG_IRDA is not set -# CONFIG_BT is not set -# CONFIG_AF_RXRPC is not set -CONFIG_WIRELESS=y -# CONFIG_CFG80211 is not set -CONFIG_CFG80211_DEFAULT_PS_VALUE=0 -CONFIG_WIRELESS_OLD_REGULATORY=y -# CONFIG_WIRELESS_EXT is not set -# CONFIG_LIB80211 is not set -# CONFIG_LIB80211_CRYPT_WEP is not set -# CONFIG_LIB80211_CRYPT_CCMP is not set -# CONFIG_LIB80211_CRYPT_TKIP is not set - -# -# CFG80211 needs to be enabled for MAC80211 -# -# CONFIG_WIMAX is not set -# CONFIG_RFKILL is not set -# CONFIG_NET_9P is not set - -# -# Device Drivers -# - -# -# Generic Driver Options -# -CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -CONFIG_DEVTMPFS=y -CONFIG_DEVTMPFS_MOUNT=y -CONFIG_STANDALONE=y -CONFIG_PREVENT_FIRMWARE_BUILD=y -# CONFIG_FW_LOADER is not set -CONFIG_DEBUG_DRIVER=y -# CONFIG_DEBUG_DEVRES is not set -# CONFIG_SYS_HYPERVISOR is not set -# CONFIG_CONNECTOR is not set -CONFIG_MTD=y -CONFIG_MTD_DEBUG=y -CONFIG_MTD_DEBUG_VERBOSE=2 -# CONFIG_MTD_TESTS is not set -# CONFIG_MTD_CONCAT is not set -CONFIG_MTD_PARTITIONS=y -CONFIG_MTD_ROOTFS_ROOT_DEV=y -CONFIG_MTD_ROOTFS_SPLIT=y -# CONFIG_MTD_REDBOOT_PARTS is not set -# CONFIG_MTD_CMDLINE_PARTS is not set -# CONFIG_MTD_AFS_PARTS is not set -CONFIG_MTD_AR7_PARTS=y - -# -# User Modules And Translation Layers -# -CONFIG_MTD_CHAR=y -CONFIG_MTD_BLKDEVS=y -CONFIG_MTD_BLOCK=y -# CONFIG_FTL is not set -# CONFIG_NFTL is not set -# CONFIG_INFTL is not set -# CONFIG_RFD_FTL is not set -# CONFIG_SSFDC is not set -# CONFIG_MTD_OOPS is not set - -# -# RAM/ROM/Flash chip drivers -# -# CONFIG_MTD_CFI is not set -# CONFIG_MTD_JEDECPROBE is not set -CONFIG_MTD_MAP_BANK_WIDTH_1=y -CONFIG_MTD_MAP_BANK_WIDTH_2=y -CONFIG_MTD_MAP_BANK_WIDTH_4=y -# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set -# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set -# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set -CONFIG_MTD_CFI_I1=y -CONFIG_MTD_CFI_I2=y -# CONFIG_MTD_CFI_I4 is not set -# CONFIG_MTD_CFI_I8 is not set -# CONFIG_MTD_RAM is not set -# CONFIG_MTD_ROM is not set -# CONFIG_MTD_ABSENT is not set - -# -# Mapping drivers for chip access -# -# CONFIG_MTD_COMPLEX_MAPPINGS is not set -# CONFIG_MTD_PLATRAM is not set - -# -# Self-contained MTD device drivers -# -# CONFIG_MTD_DATAFLASH is not set -# CONFIG_MTD_M25P80 is not set -# CONFIG_MTD_SST25L is not set -# CONFIG_MTD_SLRAM is not set -# CONFIG_MTD_PHRAM is not set -# CONFIG_MTD_MTDRAM is not set -CONFIG_MTD_BLOCK2MTD=y - -# -# Disk-On-Chip Device Drivers -# -# CONFIG_MTD_DOC2000 is not set -# CONFIG_MTD_DOC2001 is not set -# CONFIG_MTD_DOC2001PLUS is not set -CONFIG_MTD_NAND=y -# CONFIG_MTD_NAND_VERIFY_WRITE is not set -# CONFIG_MTD_NAND_ECC_SMC is not set -# CONFIG_MTD_NAND_MUSEUM_IDS is not set -CONFIG_MTD_NAND_GPIO=y -CONFIG_MTD_NAND_OMAP2=y -CONFIG_MTD_NAND_OMAP_PREFETCH=y -# CONFIG_MTD_NAND_OMAP_PREFETCH_DMA is not set -CONFIG_MTD_NAND_IDS=y -# CONFIG_MTD_NAND_DISKONCHIP is not set -# CONFIG_MTD_NAND_NANDSIM is not set -CONFIG_MTD_NAND_PLATFORM=y -# CONFIG_MTD_ALAUDA is not set -# CONFIG_MTD_ONENAND is not set - -# -# LPDDR flash memory drivers -# -# CONFIG_MTD_LPDDR is not set - -# -# UBI - Unsorted block images -# -# CONFIG_MTD_UBI is not set -# CONFIG_PARPORT is not set -CONFIG_BLK_DEV=y +# CONFIG_ATA_OVER_ETH is not set +# CONFIG_ATARI_PARTITION is not set +# CONFIG_ATM is not set +# CONFIG_AUDIT is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUXDISPLAY is not set +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_BACKLIGHT_GENERIC=y +CONFIG_BACKLIGHT_LCD_SUPPORT=y +# CONFIG_BACKTRACE_SELF_TEST is not set +CONFIG_BASE_FULL=y +CONFIG_BASE_SMALL=0 +# CONFIG_BATTERY_BQ27x00 is not set +# CONFIG_BATTERY_DS2760 is not set +# CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_MAX17040 is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_BINARY_PRINTF is not set +# CONFIG_BINFMT_AOUT is not set +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_MISC=y +CONFIG_BITREVERSE=y +# CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_COW_COMMON is not set -CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set +CONFIG_BLK_DEV_INITRD=y +# CONFIG_BLK_DEV_INTEGRITY is not set +CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_UB is not set -CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=16384 -# CONFIG_BLK_DEV_XIP is not set -# CONFIG_CDROM_PKTCDVD is not set -# CONFIG_ATA_OVER_ETH is not set -# CONFIG_MG_DISK is not set -# CONFIG_MISC_DEVICES is not set -CONFIG_HAVE_IDE=y -# CONFIG_IDE is not set - -# -# SCSI device support -# -# CONFIG_RAID_ATTRS is not set -CONFIG_SCSI=y -CONFIG_SCSI_DMA=y -# CONFIG_SCSI_TGT is not set -# CONFIG_SCSI_NETLINK is not set -CONFIG_SCSI_PROC_FS=y - -# -# SCSI support type (disk, tape, CD-ROM) -# +CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_SD=y -# CONFIG_CHR_DEV_ST is not set -# CONFIG_CHR_DEV_OSST is not set # CONFIG_BLK_DEV_SR is not set -# CONFIG_CHR_DEV_SG is not set -# CONFIG_CHR_DEV_SCH is not set -# CONFIG_SCSI_MULTI_LUN is not set -# CONFIG_SCSI_CONSTANTS is not set -# CONFIG_SCSI_LOGGING is not set -# CONFIG_SCSI_SCAN_ASYNC is not set -CONFIG_SCSI_WAIT_SCAN=m - -# -# SCSI Transports -# -# CONFIG_SCSI_SPI_ATTRS is not set -# CONFIG_SCSI_FC_ATTRS is not set -# CONFIG_SCSI_ISCSI_ATTRS is not set -# CONFIG_SCSI_SAS_LIBSAS is not set -# CONFIG_SCSI_SRP_ATTRS is not set -CONFIG_SCSI_LOWLEVEL=y -# CONFIG_ISCSI_TCP is not set -# CONFIG_LIBFC is not set -# CONFIG_LIBFCOE is not set -# 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_MD is not set -CONFIG_NETDEVICES=y -# CONFIG_DUMMY is not set +# CONFIG_BLK_DEV_UB is not set +# CONFIG_BLK_DEV_XIP is not set +CONFIG_BLK_DEV=y +CONFIG_BLOCK=y # CONFIG_BONDING is not set -# CONFIG_MACVLAN is not set +# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set +CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 +# CONFIG_BOOT_PRINTK_DELAY is not set +# CONFIG_BRIDGE is not set +CONFIG_BROKEN_ON_SMP=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BT is not set +# CONFIG_BTRFS_FS is not set +CONFIG_BUG=y +# CONFIG_CAN is not set +# CONFIG_CBUS is not set +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +# CONFIG_CDROM_PKTCDVD is not set +CONFIG_CFG80211_DEFAULT_PS_VALUE=0 +# CONFIG_CFG80211 is not set +# CONFIG_CGROUP_SCHED is not set +# CONFIG_CGROUPS is not set +# CONFIG_CHR_DEV_OSST is not set +# CONFIG_CHR_DEV_SCH is not set +# CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_ST is not set +CONFIG_CMDLINE="root=/dev/nfs nfsroot=192.168.0.1:/home/user/buildroot ip=192.168.0.2:192.168.0.1:192.168.0.1:255.255.255.0:tgt:eth0:off rw console=ttyS2,115200n8" +# CONFIG_COMEDI is not set +CONFIG_COMMON_CLKDEV=y +CONFIG_COMPAT_BRK=y +# CONFIG_CONFIGFS_FS is not set +# CONFIG_CONNECTOR is not set +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_CONSTRUCTORS=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_CPU_32v6K=y +CONFIG_CPU_32v7=y +CONFIG_CPU_32=y +CONFIG_CPU_ABRT_EV7=y +# CONFIG_CPU_BPREDICT_DISABLE is not set +CONFIG_CPU_CACHE_V7=y +CONFIG_CPU_CACHE_VIPT=y +CONFIG_CPU_COPY_V6=y +CONFIG_CPU_CP15_MMU=y +CONFIG_CPU_CP15=y +# CONFIG_CPU_DCACHE_DISABLE is not set +# CONFIG_CPU_FREQ is not set +CONFIG_CPU_HAS_ASID=y +# CONFIG_CPU_ICACHE_DISABLE is not set +# CONFIG_CPU_IDLE is not set +CONFIG_CPU_PABRT_V7=y +CONFIG_CPU_TLB_V7=y +CONFIG_CPU_V7=y +# CONFIG_CRAMFS is not set +CONFIG_CRC16=m +CONFIG_CRC32=y +CONFIG_CRC7=y +CONFIG_CRC_CCITT=y +CONFIG_CRC_ITU_T=y +# CONFIG_CRC_T10DIF is not set +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_AEAD=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_ALGAPI=y +# CONFIG_CRYPTO_ANSI_CPRNG is not set +# CONFIG_CRYPTO_ANUBIS is not set +CONFIG_CRYPTO_ARC4=m +# CONFIG_CRYPTO_AUTHENC is not set +CONFIG_CRYPTO_BLKCIPHER2=y +CONFIG_CRYPTO_BLKCIPHER=y +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +CONFIG_CRYPTO_CBC=y +# CONFIG_CRYPTO_CCM is not set +CONFIG_CRYPTO_CRC32C=y +# CONFIG_CRYPTO_CRYPTD is not set +# CONFIG_CRYPTO_CTR is not set +# CONFIG_CRYPTO_CTS is not set +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_DES=y +CONFIG_CRYPTO_ECB=m +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_GF128MUL is not set +# CONFIG_CRYPTO_GHASH is not set +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HMAC=m +CONFIG_CRYPTO_HW=y +# CONFIG_CRYPTO_KHAZAD is not set +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_LZO is not set +CONFIG_CRYPTO_MANAGER2=y +CONFIG_CRYPTO_MANAGER=y +# CONFIG_CRYPTO_MD4 is not set +CONFIG_CRYPTO_MD5=y +# CONFIG_CRYPTO_MICHAEL_MIC is not set +# CONFIG_CRYPTO_NULL is not set +CONFIG_CRYPTO_PCBC=m +CONFIG_CRYPTO_PCOMP=y +# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_RMD160 is not set +# CONFIG_CRYPTO_RMD256 is not set +# CONFIG_CRYPTO_RMD320 is not set +CONFIG_CRYPTO_RNG2=y +# CONFIG_CRYPTO_RNG is not set +# CONFIG_CRYPTO_SALSA20 is not set +# CONFIG_CRYPTO_SEED is not set +# CONFIG_CRYPTO_SEQIV is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SHA1 is not set +# CONFIG_CRYPTO_SHA256 is not set +# CONFIG_CRYPTO_SHA512 is not set +# CONFIG_CRYPTO_TEA is not set +# CONFIG_CRYPTO_TEST is not set +# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_TWOFISH is not set +# CONFIG_CRYPTO_VMAC is not set +CONFIG_CRYPTO_WORKQUEUE=y +# CONFIG_CRYPTO_WP512 is not set +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_XTS is not set +CONFIG_CRYPTO=y +CONFIG_CRYPTO_ZLIB=y +# CONFIG_CUSE is not set +# CONFIG_DAB is not set +# CONFIG_DCB is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set +# CONFIG_DEBUG_BUGVERBOSE is not set +# CONFIG_DEBUG_CREDENTIALS is not set +# CONFIG_DEBUG_DEVRES is not set +CONFIG_DEBUG_DRIVER=y +# CONFIG_DEBUG_ERRORS is not set +# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set +CONFIG_DEBUG_FS=y +# CONFIG_DEBUG_GPIO is not set +CONFIG_DEBUG_INFO=y +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_KMEMLEAK is not set +# CONFIG_DEBUG_KOBJECT is not set +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_LL is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_MEMORY_INIT is not set +CONFIG_DEBUG_MUTEXES=y +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_SHIRQ is not set +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_DEBUG_USER is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_WRITECOUNT is not set +# CONFIG_DECNET is not set +CONFIG_DECOMPRESS_LZMA_NEEDED=y +CONFIG_DECOMPRESS_LZMA=y +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_DEADLINE is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" +CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_TCP_CONG="cubic" +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" +CONFIG_DETECT_HUNG_TASK=y +CONFIG_DETECT_SOFTLOCKUP=y +CONFIG_DEVKMEM=y +# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set +CONFIG_DEVTMPFS_MOUNT=y +CONFIG_DEVTMPFS=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +CONFIG_DISPLAY_SUPPORT=y +# CONFIG_DLM is not set +# CONFIG_DMADEVICES is not set +CONFIG_DNOTIFY=y +# CONFIG_DS1682 is not set +# CONFIG_DST is not set +CONFIG_DUMMY_CONSOLE=y +# CONFIG_DUMMY is not set +# CONFIG_DVB_CORE is not set +# CONFIG_DYNAMIC_DEBUG is not set +# CONFIG_ECHO is not set +# CONFIG_ECONET is not set +# CONFIG_EFI_PARTITION is not set +# CONFIG_EFS_FS is not set +CONFIG_ELF_CORE=y +CONFIG_EMBEDDED=y +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_ENABLE_WARN_DEPRECATED=y +CONFIG_EPOLL=y # CONFIG_EQUALIZER is not set -# CONFIG_TUN is not set -# CONFIG_VETH is not set -# CONFIG_NET_ETHERNET is not set -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set -CONFIG_WLAN=y -# CONFIG_WLAN_PRE80211 is not set -# CONFIG_WLAN_80211 is not set - -# -# Enable WiMAX (Networking options) to see the WiMAX drivers -# - -# -# USB Network Adapters -# -# CONFIG_USB_CATC is not set -# CONFIG_USB_KAWETH is not set -# CONFIG_USB_PEGASUS is not set -# CONFIG_USB_RTL8150 is not set -# CONFIG_USB_USBNET is not set -# CONFIG_WAN is not set -# CONFIG_PPP is not set -# CONFIG_SLIP is not set -# CONFIG_NETCONSOLE is not set -# CONFIG_NETPOLL is not set -# CONFIG_NET_POLL_CONTROLLER is not set -# CONFIG_ISDN is not set -# CONFIG_PHONE is not set - -# -# Input device support -# -CONFIG_INPUT=y -# CONFIG_INPUT_FF_MEMLESS is not set -# CONFIG_INPUT_POLLDEV is not set - -# -# Userland interfaces -# -# CONFIG_INPUT_MOUSEDEV is not set -# CONFIG_INPUT_JOYDEV is not set -CONFIG_INPUT_EVDEV=y +CONFIG_EVENTFD=y +CONFIG_EXPERIMENTAL=y +CONFIG_EXPORTFS=m +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set +CONFIG_EXT2_FS=y +# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set +# CONFIG_EXT3_FS_XATTR is not set +CONFIG_EXT3_FS=y +# CONFIG_EXT4_DEBUG is not set +CONFIG_EXT4_FS=m +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_EXT4_FS_XATTR=y +# CONFIG_EZX_PCAP is not set +CONFIG_FAIR_GROUP_SCHED=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_FAT_FS=y +# CONFIG_FAULT_INJECTION is not set +# CONFIG_FB_BACKLIGHT is not set +# CONFIG_FB_BOOT_VESA_SUPPORT is not set +# CONFIG_FB_BROADSHEET is not set +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set +# CONFIG_FB_DDC is not set +# CONFIG_FB_FOREIGN_ENDIAN is not set +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_MB862XX is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MODE_HELPERS is not set +CONFIG_FB_OMAP2_DEBUG_SUPPORT=y +CONFIG_FB_OMAP2_FORCE_AUTO_UPDATE=y +CONFIG_FB_OMAP2_NUM_FBS=3 +CONFIG_FB_OMAP2=y +# CONFIG_FB_OMAP_BOOTLOADER_INIT is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_SVGALIB is not set +# CONFIG_FB_SYS_COPYAREA is not set +# CONFIG_FB_SYS_FILLRECT is not set +# CONFIG_FB_SYS_FOPS is not set +# CONFIG_FB_SYS_IMAGEBLIT is not set +# CONFIG_FB_TILEBLITTING is not set +# CONFIG_FB_UDL is not set +# CONFIG_FB_VIRTUAL is not set +CONFIG_FB=y +CONFIG_FILE_LOCKING=y +# CONFIG_FIRMWARE_EDID is not set +CONFIG_FLATMEM_MANUAL=y +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_FONT_10x18 is not set +# CONFIG_FONT_6x11 is not set +# CONFIG_FONT_7x14 is not set +CONFIG_FONT_8x16=y +CONFIG_FONT_8x8=y +# CONFIG_FONT_ACORN_8x8 is not set +# CONFIG_FONT_MINI_4x6 is not set +# CONFIG_FONT_PEARL_8x8 is not set +# CONFIG_FONT_SUN12x22 is not set +# CONFIG_FONT_SUN8x16 is not set +CONFIG_FONTS=y +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAME_POINTER=y +CONFIG_FRAME_WARN=1024 +CONFIG_FREEZER=y +# CONFIG_FSCACHE is not set +CONFIG_FS_MBCACHE=m +CONFIG_FSNOTIFY=y +CONFIG_FS_POSIX_ACL=y +# CONFIG_FTL is not set +# CONFIG_FTRACE is not set +CONFIG_FUSE_FS=m +CONFIG_FUTEX=y +# CONFIG_FW_LOADER is not set +# CONFIG_GAMEPORT is not set +# CONFIG_GCOV_KERNEL is not set +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_FIND_LAST_BIT=y +CONFIG_GENERIC_GPIO=y +CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y +CONFIG_GENERIC_HARDIRQS=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_TIME=y +# CONFIG_GPIO_DEVICE is not set +CONFIG_GPIOLIB=y +# CONFIG_GPIO_MAX7301 is not set +# CONFIG_GPIO_MAX732X is not set +# CONFIG_GPIO_MC33880 is not set +# CONFIG_GPIO_MCP23S08 is not set +# CONFIG_GPIO_PCA953X is not set +# CONFIG_GPIO_PCF857X is not set +# CONFIG_GPIO_SYSFS is not set +CONFIG_GPIO_TWL4030=y +CONFIG_GROUP_SCHED=y +# CONFIG_HAMRADIO is not set +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_HAS_DMA=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_TLS_REG=y +CONFIG_HAVE_AOUT=y +CONFIG_HAVE_ARCH_KGDB=y +CONFIG_HAVE_CLK=y +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_GENERIC_DMA_COHERENT=y +CONFIG_HAVE_IDE=y +CONFIG_HAVE_KERNEL_GZIP=y +CONFIG_HAVE_KERNEL_LZMA=y +CONFIG_HAVE_KERNEL_LZO=y +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_LATENCYTOP_SUPPORT=y +CONFIG_HAVE_MLOCKED_PAGE_BIT=y +CONFIG_HAVE_MLOCK=y +CONFIG_HAVE_OPROFILE=y +# CONFIG_HEADERS_CHECK is not set +# CONFIG_HFS_FS is not set +CONFIG_HFSPLUS_FS=m +# CONFIG_HID_A4TECH is not set +# CONFIG_HID_APPLE is not set +# CONFIG_HID_BELKIN is not set +# CONFIG_HID_CHERRY is not set +# CONFIG_HID_CHICONY is not set +# CONFIG_HID_CYPRESS is not set +# CONFIG_HID_DRAGONRISE is not set +# CONFIG_HID_EZKEY is not set +# CONFIG_HID_GREENASIA is not set +# CONFIG_HID_GYRATION is not set +# CONFIG_HID_KENSINGTON is not set +# CONFIG_HID_KYE is not set +# CONFIG_HID_LOGITECH is not set +CONFIG_HID=m +# CONFIG_HID_MICROSOFT is not set +# CONFIG_HID_MONTEREY is not set +# CONFIG_HID_NTRIG is not set +# CONFIG_HID_PANTHERLORD is not set +# CONFIG_HID_PETALYNX is not set +# CONFIG_HID_PID is not set +# CONFIG_HIDRAW is not set +# CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SMARTJOYPLUS is not set +# CONFIG_HID_SONY is not set +# CONFIG_HID_SUNPLUS is not set +CONFIG_HID_SUPPORT=y +# CONFIG_HID_THRUSTMASTER is not set +# CONFIG_HID_TOPSEED is not set +# CONFIG_HID_TWINHAN is not set +# CONFIG_HID_ZEROPLUS is not set +# CONFIG_HIGHMEM is not set +CONFIG_HIGH_RES_TIMERS=y +CONFIG_HOTPLUG=y +# CONFIG_HPFS_FS is not set +# CONFIG_HTC_EGPIO is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_HW_CONSOLE=y +# CONFIG_HWMON_DEBUG_CHIP is not set +# CONFIG_HWMON_VID is not set +CONFIG_HWMON=y +# CONFIG_HW_RANDOM_TIMERIOMEM is not set +CONFIG_HW_RANDOM=y +CONFIG_HZ=128 +CONFIG_I2C_ALGOBIT=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_CHARDEV=y +# CONFIG_I2C_COMPAT is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DESIGNWARE is not set +CONFIG_I2C_GPIO=y +CONFIG_I2C_HELPER_AUTO=y +# CONFIG_I2C_OCORES is not set +CONFIG_I2C_OMAP=y +# CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_PCA_PLATFORM is not set +# CONFIG_I2C_SIMTEC is not set +# CONFIG_I2C_STUB is not set +# CONFIG_I2C_TAOS_EVM is not set +# CONFIG_I2C_TINY_USB is not set +CONFIG_I2C=y +# CONFIG_IDE is not set +# CONFIG_IEEE802154 is not set +# CONFIG_IIO is not set +# CONFIG_IKCONFIG is not set +# CONFIG_INET_AH is not set +CONFIG_INET_DIAG=y +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_LRO is not set +CONFIG_INET_TCP_DIAG=y +# CONFIG_INET_TUNNEL is not set +CONFIG_INET_XFRM_MODE_BEET=y +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y +# CONFIG_INET_XFRM_TUNNEL is not set +CONFIG_INET=y +# CONFIG_INFTL is not set +CONFIG_INIT_ENV_ARG_LIMIT=32 +CONFIG_INITRAMFS_SOURCE="" +CONFIG_INOTIFY_USER=y +CONFIG_INOTIFY=y # CONFIG_INPUT_EVBUG is not set - -# -# Input Device Drivers -# +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_FF_MEMLESS is not set +# CONFIG_INPUT_GPIO is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_JOYSTICK is not set CONFIG_INPUT_KEYBOARD=y +# CONFIG_INPUT_MIMIO is not set +# CONFIG_INPUT_MISC is not set +# CONFIG_INPUT_MOUSEDEV is not set +CONFIG_INPUT_MOUSE=y +# CONFIG_INPUT_POLLDEV is not set +# CONFIG_INPUT_TABLET is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +CONFIG_INPUT=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_CFQ=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_NOOP=y +# CONFIG_IP_ADVANCED_ROUTER is not set +# CONFIG_IP_DCCP is not set +CONFIG_IP_FIB_HASH=y +# CONFIG_IPMI_HANDLER is not set +# CONFIG_IP_MULTICAST is not set +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_RARP=y +CONFIG_IP_PNP=y +# CONFIG_IP_SCTP is not set +# CONFIG_IPV6 is not set +# CONFIG_IPX is not set +# CONFIG_IRDA is not set +# CONFIG_ISCSI_TCP is not set +# CONFIG_ISDN is not set +# CONFIG_ISO9660_FS is not set +# CONFIG_ISP1301_OMAP is not set +# CONFIG_JBD2_DEBUG is not set +CONFIG_JBD2=m +# CONFIG_JBD_DEBUG is not set +CONFIG_JBD=y +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_FS_DEBUG=0 +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set +CONFIG_JFFS2_FS_WRITEBUFFER=y +# CONFIG_JFFS2_FS_XATTR is not set +CONFIG_JFFS2_FS=y +# CONFIG_JFFS2_LZO is not set +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +# CONFIG_JFFS2_SUMMARY is not set +CONFIG_JFFS2_ZLIB=y +# CONFIG_JFS_FS is not set +# CONFIG_KALLSYMS is not set +# CONFIG_KARMA_PARTITION is not set +# CONFIG_KERNEL_BZIP2 is not set +# CONFIG_KERNEL_GZIP is not set +CONFIG_KERNEL_LZMA=y +# CONFIG_KERNEL_LZO is not set +# CONFIG_KEXEC is not set CONFIG_KEYBOARD_ATKBD=y -# CONFIG_KEYBOARD_LKKBD is not set # CONFIG_KEYBOARD_GPIO is not set -# CONFIG_KEYBOARD_MATRIX is not set +# CONFIG_KEYBOARD_LKKBD is not set # CONFIG_KEYBOARD_LM8323 is not set +# CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_TWL4030 is not set # CONFIG_KEYBOARD_XTKBD is not set -CONFIG_INPUT_MOUSE=y -CONFIG_MOUSE_PS2=y -# CONFIG_MOUSE_PS2_ALPS is not set -# CONFIG_MOUSE_PS2_LOGIPS2PP is not set -# CONFIG_MOUSE_PS2_SYNAPTICS is not set -# CONFIG_MOUSE_PS2_TRACKPOINT is not set -# CONFIG_MOUSE_PS2_ELANTECH is not set -# CONFIG_MOUSE_PS2_SENTELIC is not set -# CONFIG_MOUSE_PS2_TOUCHKIT is not set -# CONFIG_MOUSE_SERIAL is not set +# CONFIG_KEYS is not set +# CONFIG_KGDB is not set +# CONFIG_KSM is not set +# CONFIG_LAPB is not set +# CONFIG_LATENCYTOP is not set +# CONFIG_LBDAF is not set +CONFIG_LCD_CLASS_DEVICE=y +# CONFIG_LCD_ILI9320 is not set +# CONFIG_LCD_LMS283GF05 is not set +# CONFIG_LCD_LTV350QV is not set +CONFIG_LCD_PLATFORM=y +# CONFIG_LCD_TDO24M is not set +# CONFIG_LCD_VGG2432A4 is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_LEDS_BD2802 is not set +CONFIG_LEDS_CLASS=y +# CONFIG_LEDS_DAC124S085 is not set +# CONFIG_LEDS_GPIO is not set +# CONFIG_LEDS is not set +# CONFIG_LEDS_LP3944 is not set +# CONFIG_LEDS_PCA9532 is not set +# CONFIG_LEDS_PCA955X is not set +# CONFIG_LEDS_TRIGGERS is not set +# CONFIG_LEGACY_PTYS is not set +# CONFIG_LIB80211_CRYPT_CCMP is not set +# CONFIG_LIB80211_CRYPT_TKIP is not set +# CONFIG_LIB80211_CRYPT_WEP is not set +# CONFIG_LIB80211 is not set +CONFIG_LIBCRC32C=y +# CONFIG_LIBFC is not set +# CONFIG_LIBFCOE is not set +# CONFIG_LINE6_USB is not set +# CONFIG_LLC2 is not set +CONFIG_LOCALVERSION="" +CONFIG_LOCALVERSION_AUTO=y +CONFIG_LOCKDEP_SUPPORT=y +# CONFIG_LOCK_STAT is not set +CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_LOGO is not set +# CONFIG_MACH_NOKIA_RX51 is not set +# CONFIG_MACH_OMAP_3430SDP is not set +CONFIG_MACH_OMAP3_BEAGLE=y +# CONFIG_MACH_OMAP3EVM is not set +# CONFIG_MACH_OMAP3_PANDORA is not set +# CONFIG_MACH_OMAP_LDP is not set +# CONFIG_MACH_OMAP_ZOOM2 is not set +# CONFIG_MACH_OVERO is not set +# CONFIG_MAC_PARTITION is not set +# CONFIG_MACVLAN is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_MD is not set +# CONFIG_MEDIA_ATTACH is not set +CONFIG_MEDIA_SUPPORT=y +# CONFIG_MEDIA_TUNER_CUSTOMISE is not set +CONFIG_MEDIA_TUNER_MC44S803=y +CONFIG_MEDIA_TUNER_MT20XX=y +CONFIG_MEDIA_TUNER_SIMPLE=y +CONFIG_MEDIA_TUNER_TDA8290=y +CONFIG_MEDIA_TUNER_TDA9887=y +CONFIG_MEDIA_TUNER_TEA5761=y +CONFIG_MEDIA_TUNER_TEA5767=y +CONFIG_MEDIA_TUNER_XC2028=y +CONFIG_MEDIA_TUNER_XC5000=y +CONFIG_MEDIA_TUNER=y +# CONFIG_MEMSTICK is not set +# CONFIG_MFD_ASIC3 is not set +# CONFIG_MFD_CORE is not set +# CONFIG_MFD_MC13783 is not set +# CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_T7L66XB is not set +# CONFIG_MFD_TC6387XB is not set +# CONFIG_MFD_TC6393XB is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_MFD_WM831X is not set +# CONFIG_MFD_WM8350_I2C is not set +# CONFIG_MFD_WM8400 is not set +# CONFIG_MG_DISK is not set +CONFIG_MINI_FO=y +# CONFIG_MINIX_FS is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_MISC_DEVICES is not set +CONFIG_MISC_FILESYSTEMS=y +# CONFIG_MMC_AT91 is not set +# CONFIG_MMC_ATMELMCI is not set +CONFIG_MMC_BLOCK_BOUNCE=y +CONFIG_MMC_BLOCK=y +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_OMAP_HS=y +CONFIG_MMC_OMAP=y +# CONFIG_MMC_SDHCI is not set +CONFIG_MMC_SPI=y +# CONFIG_MMC_TEST is not set +# CONFIG_MMC_UNSAFE_RESUME is not set +CONFIG_MMC=y +CONFIG_MMU=y +# CONFIG_MODULE_FORCE_LOAD is not set +# CONFIG_MODULE_FORCE_UNLOAD is not set +CONFIG_MODULE_SRCVERSION_ALL=y +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODVERSIONS=y # CONFIG_MOUSE_APPLETOUCH is not set # CONFIG_MOUSE_BCM5974 is not set -# CONFIG_MOUSE_VSXXXAA is not set # CONFIG_MOUSE_GPIO is not set +# CONFIG_MOUSE_PS2_ALPS is not set +# CONFIG_MOUSE_PS2_ELANTECH is not set +# CONFIG_MOUSE_PS2_LOGIPS2PP is not set +# CONFIG_MOUSE_PS2_SENTELIC is not set +# CONFIG_MOUSE_PS2_SYNAPTICS is not set +# CONFIG_MOUSE_PS2_TOUCHKIT is not set +# CONFIG_MOUSE_PS2_TRACKPOINT is not set +CONFIG_MOUSE_PS2=y +# CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_SYNAPTICS_I2C is not set -# CONFIG_INPUT_JOYSTICK is not set -# CONFIG_INPUT_TABLET is not set -# CONFIG_INPUT_TOUCHSCREEN is not set -# CONFIG_INPUT_MISC is not set - -# -# Hardware I/O ports -# -CONFIG_SERIO=y -CONFIG_SERIO_SERPORT=y -CONFIG_SERIO_LIBPS2=y -# CONFIG_SERIO_RAW is not set -# CONFIG_GAMEPORT is not set - -# -# Character devices -# -CONFIG_VT=y -CONFIG_CONSOLE_TRANSLATIONS=y -CONFIG_VT_CONSOLE=y -CONFIG_HW_CONSOLE=y -# CONFIG_VT_HW_CONSOLE_BINDING is not set -CONFIG_DEVKMEM=y -# CONFIG_SERIAL_NONSTANDARD is not set - -# -# Serial drivers -# -CONFIG_SERIAL_8250=y -CONFIG_SERIAL_8250_CONSOLE=y -CONFIG_SERIAL_8250_NR_UARTS=32 -CONFIG_SERIAL_8250_RUNTIME_UARTS=4 -CONFIG_SERIAL_8250_EXTENDED=y -CONFIG_SERIAL_8250_MANY_PORTS=y -CONFIG_SERIAL_8250_SHARE_IRQ=y -CONFIG_SERIAL_8250_DETECT_IRQ=y -CONFIG_SERIAL_8250_RSA=y - -# -# Non-8250 serial port support -# -# CONFIG_SERIAL_MAX3100 is not set -CONFIG_SERIAL_CORE=y -CONFIG_SERIAL_CORE_CONSOLE=y -CONFIG_UNIX98_PTYS=y -# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set -# CONFIG_LEGACY_PTYS is not set -# CONFIG_IPMI_HANDLER is not set -CONFIG_HW_RANDOM=y -# CONFIG_HW_RANDOM_TIMERIOMEM is not set -# CONFIG_R3964 is not set -# CONFIG_GPIO_DEVICE is not set -# CONFIG_RAW_DRIVER is not set -# CONFIG_TCG_TPM is not set -CONFIG_I2C=y -CONFIG_I2C_BOARDINFO=y -# CONFIG_I2C_COMPAT is not set -CONFIG_I2C_CHARDEV=y -CONFIG_I2C_HELPER_AUTO=y -CONFIG_I2C_ALGOBIT=y - -# -# I2C Hardware Bus support -# - -# -# I2C system bus drivers (mostly embedded / system-on-chip) -# -# CONFIG_I2C_DESIGNWARE is not set -CONFIG_I2C_GPIO=y -# CONFIG_I2C_OCORES is not set -CONFIG_I2C_OMAP=y -# CONFIG_I2C_SIMTEC is not set - -# -# External I2C/SMBus adapter drivers -# -# CONFIG_I2C_PARPORT_LIGHT is not set -# CONFIG_I2C_TAOS_EVM is not set -# CONFIG_I2C_TINY_USB is not set - -# -# Other I2C/SMBus bus drivers -# -# CONFIG_I2C_PCA_PLATFORM is not set -# CONFIG_I2C_STUB is not set - -# -# Miscellaneous I2C Chip support -# -# CONFIG_DS1682 is not set -# CONFIG_SENSORS_TSL2550 is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set -# CONFIG_I2C_DEBUG_CHIP is not set -CONFIG_SPI=y -# CONFIG_SPI_DEBUG is not set -CONFIG_SPI_MASTER=y - -# -# SPI Master Controller Drivers -# -# CONFIG_SPI_BITBANG is not set -# CONFIG_SPI_GPIO is not set -# CONFIG_SPI_GPIO_OLD is not set -CONFIG_SPI_OMAP24XX=y - -# -# SPI Protocol Masters -# -CONFIG_SPI_SPIDEV=y -# CONFIG_SPI_TLE62X0 is not set - -# -# PPS support -# -# CONFIG_PPS is not set -CONFIG_ARCH_REQUIRE_GPIOLIB=y -CONFIG_GPIOLIB=y -# CONFIG_DEBUG_GPIO is not set -# CONFIG_GPIO_SYSFS is not set - -# -# Memory mapped GPIO expanders: -# - -# -# I2C GPIO expanders: -# -# CONFIG_GPIO_MAX732X is not set -# CONFIG_GPIO_PCA953X is not set -# CONFIG_GPIO_PCF857X is not set -CONFIG_GPIO_TWL4030=y - -# -# PCI GPIO expanders: -# - -# -# SPI GPIO expanders: -# -# CONFIG_GPIO_MAX7301 is not set -# CONFIG_GPIO_MCP23S08 is not set -# CONFIG_GPIO_MC33880 is not set - -# -# AC97 GPIO expanders: -# -# CONFIG_W1 is not set -CONFIG_POWER_SUPPLY=y -# CONFIG_POWER_SUPPLY_DEBUG is not set +# CONFIG_MOUSE_VSXXXAA is not set +CONFIG_MSDOS_FS=y +CONFIG_MSDOS_PARTITION=y +# CONFIG_MTD_ABSENT is not set +# CONFIG_MTD_AFS_PARTS is not set +# CONFIG_MTD_ALAUDA is not set +CONFIG_MTD_AR7_PARTS=y +CONFIG_MTD_BLKDEVS=y +CONFIG_MTD_BLOCK2MTD=y +CONFIG_MTD_BLOCK=y +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +# CONFIG_MTD_CFI is not set +CONFIG_MTD_CHAR=y +# CONFIG_MTD_CMDLINE_PARTS is not set +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +# CONFIG_MTD_CONCAT is not set +# CONFIG_MTD_DATAFLASH is not set +CONFIG_MTD_DEBUG_VERBOSE=2 +CONFIG_MTD_DEBUG=y +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +# CONFIG_MTD_JEDECPROBE is not set +# CONFIG_MTD_LPDDR is not set +# CONFIG_MTD_M25P80 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_NAND_DISKONCHIP is not set +# CONFIG_MTD_NAND_ECC_SMC is not set +CONFIG_MTD_NAND_GPIO=y +CONFIG_MTD_NAND_IDS=y +# CONFIG_MTD_NAND_MUSEUM_IDS is not set +# CONFIG_MTD_NAND_NANDSIM is not set +CONFIG_MTD_NAND_OMAP2=y +# CONFIG_MTD_NAND_OMAP_PREFETCH_DMA is not set +CONFIG_MTD_NAND_OMAP_PREFETCH=y +CONFIG_MTD_NAND_PLATFORM=y +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +CONFIG_MTD_NAND=y +# CONFIG_MTD_ONENAND is not set +# CONFIG_MTD_OOPS is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_PLATRAM is not set +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_REDBOOT_PARTS is not set +# CONFIG_MTD_ROM is not set +CONFIG_MTD_ROOTFS_ROOT_DEV=y +CONFIG_MTD_ROOTFS_SPLIT=y +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_SST25L is not set +# CONFIG_MTD_TESTS is not set +# CONFIG_MTD_UBI is not set +CONFIG_MTD=y +# CONFIG_MUSB_PIO_ONLY is not set +# CONFIG_NAMESPACES is not set +# CONFIG_NEON is not set +# CONFIG_NET_9P is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_NETDEV_10000 is not set +# CONFIG_NETDEV_1000 is not set +CONFIG_NETDEVICES=y +# CONFIG_NET_DSA is not set +# CONFIG_NET_ETHERNET is not set +# CONFIG_NETFILTER is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_KEY_MIGRATE is not set +CONFIG_NET_KEY=y +# CONFIG_NET_PKTGEN is not set +# CONFIG_NET_POLL_CONTROLLER is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_SCHED is not set +# CONFIG_NETWORK_FILESYSTEMS is not set +# CONFIG_NETWORK_SECMARK is not set +CONFIG_NET=y +CONFIG_NEW_LEDS=y +# CONFIG_NFTL is not set +# CONFIG_NILFS2_FS is not set +CONFIG_NLATTR=y +# CONFIG_NLS_ASCII is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +CONFIG_NLS_DEFAULT="iso8859-1" +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +CONFIG_NLS_UTF8=m +CONFIG_NLS=y +CONFIG_NO_HZ=y +# CONFIG_NOP_USB_XCEIV is not set +# CONFIG_NTFS_FS is not set +# CONFIG_OABI_COMPAT is not set +# CONFIG_OCF_OCF is not set +# CONFIG_OCFS2_FS is not set +CONFIG_OMAP2_DSS_DEBUG_SUPPORT=y +CONFIG_OMAP2_DSS_DSI=y +CONFIG_OMAP2_DSS_FAKE_VSYNC=y +CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK=0 +CONFIG_OMAP2_DSS_RFBI=y +# CONFIG_OMAP2_DSS_SDI is not set +# CONFIG_OMAP2_DSS_USE_DSI_PLL is not set +CONFIG_OMAP2_DSS_VENC=y +CONFIG_OMAP2_DSS=y +CONFIG_OMAP2_VRAM_SIZE=12 +CONFIG_OMAP2_VRAM=y +CONFIG_OMAP2_VRFB=y +CONFIG_OMAP_32K_TIMER_HZ=128 +CONFIG_OMAP_32K_TIMER=y +# CONFIG_OMAP_DEBUG_CLOCKDOMAIN is not set +# CONFIG_OMAP_DEBUG_POWERDOMAIN is not set +CONFIG_OMAP_DM_TIMER=y +# CONFIG_OMAP_LL_DEBUG_UART1 is not set +# CONFIG_OMAP_LL_DEBUG_UART2 is not set +CONFIG_OMAP_LL_DEBUG_UART3=y +# CONFIG_OMAP_MBOX_FWK is not set +CONFIG_OMAP_MCBSP=y +# CONFIG_OMAP_MPU_TIMER is not set +# CONFIG_OMAP_MUX is not set +# CONFIG_OMAP_PM_NONE is not set +CONFIG_OMAP_PM_NOOP=y +# CONFIG_OMAP_RESET_CLOCKS is not set +CONFIG_OMAP_WATCHDOG=y +# CONFIG_OMFS_FS is not set +# CONFIG_OSF_PARTITION is not set +# CONFIG_PACKET_MMAP is not set +CONFIG_PACKET=y +CONFIG_PAGEFLAGS_EXTENDED=y +CONFIG_PAGE_OFFSET=0xC0000000 +# CONFIG_PAGE_POISONING is not set +CONFIG_PANEL_GENERIC=y +CONFIG_PANEL_SAMSUNG_LTE430WQ_F0C=y +CONFIG_PANEL_SHARP_LS037V7DW01=y +CONFIG_PANEL_TAAL=y +# CONFIG_PARPORT is not set +CONFIG_PARTITION_ADVANCED=y +# CONFIG_PCCARD is not set +# CONFIG_PCI_SYSCALL is not set # CONFIG_PDA_POWER is not set -# CONFIG_BATTERY_DS2760 is not set -# CONFIG_BATTERY_DS2782 is not set -# CONFIG_BATTERY_BQ27x00 is not set -# CONFIG_BATTERY_MAX17040 is not set -CONFIG_HWMON=y -# CONFIG_HWMON_VID is not set -# CONFIG_HWMON_DEBUG_CHIP is not set - -# -# Native drivers -# +# CONFIG_PHONE is not set +# CONFIG_PHONET is not set +# CONFIG_PHYS_ADDR_T_64BIT is not set +# CONFIG_PLAN9AUTH is not set +# CONFIG_PM_DEBUG is not set +# CONFIG_PMIC_DA903X is not set +CONFIG_PM_RUNTIME=y +CONFIG_PM_SLEEP=y +CONFIG_PM=y +# CONFIG_POHMELFS is not set +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_POWER_SUPPLY_DEBUG is not set +CONFIG_POWER_SUPPLY=y +# CONFIG_PPP is not set +# CONFIG_PPS is not set +# CONFIG_PREEMPT is not set +CONFIG_PREEMPT_NONE=y +# CONFIG_PREEMPT_VOLUNTARY is not set +CONFIG_PREVENT_FIRMWARE_BUILD=y +# CONFIG_PRINTK_TIME is not set +CONFIG_PRINTK=y +CONFIG_PROC_FS=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_PROC_SYSCTL=y +# CONFIG_PROFILING is not set +# CONFIG_PROVE_LOCKING is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_QUOTA is not set +# CONFIG_R3964 is not set +# CONFIG_RADIO_ADAPTERS is not set +# CONFIG_RAID_ATTRS is not set +# CONFIG_RAR_REGISTER is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_RCU_CPU_STALL_DETECTOR is not set +CONFIG_RCU_FANOUT=32 +# CONFIG_RCU_FANOUT_EXACT is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_TRACE is not set +# CONFIG_RD_BZIP2 is not set +# CONFIG_RD_GZIP is not set +CONFIG_RD_LZMA=y +# CONFIG_RD_LZO is not set +# CONFIG_RDS is not set +# CONFIG_REGULATOR_BQ24022 is not set +# CONFIG_REGULATOR_DEBUG is not set +# CONFIG_REGULATOR_FIXED_VOLTAGE is not set +# CONFIG_REGULATOR_LP3971 is not set +# CONFIG_REGULATOR_MAX1586 is not set +# CONFIG_REGULATOR_TPS65023 is not set +# CONFIG_REGULATOR_TPS6507X is not set +CONFIG_REGULATOR_TWL4030=y +# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set +# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set +CONFIG_REGULATOR=y +# CONFIG_REISERFS_FS is not set +# CONFIG_RELAY is not set +# CONFIG_RFD_FTL is not set +# CONFIG_RFKILL is not set +# CONFIG_ROMFS_FS is not set +CONFIG_RTC_CLASS=y +# CONFIG_RTC_DEBUG is not set +# CONFIG_RTC_DRV_BQ4802 is not set +# CONFIG_RTC_DRV_CMOS is not set +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1305 is not set +# CONFIG_RTC_DRV_DS1307 is not set +# CONFIG_RTC_DRV_DS1374 is not set +# CONFIG_RTC_DRV_DS1390 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_DS3234 is not set +# CONFIG_RTC_DRV_FM3130 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_M41T80 is not set +# CONFIG_RTC_DRV_M41T94 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_MAX6902 is not set +# CONFIG_RTC_DRV_PCF2123 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set +# CONFIG_RTC_DRV_R9701 is not set +# CONFIG_RTC_DRV_RS5C348 is not set +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_RTC7301 is not set +# CONFIG_RTC_DRV_RX8025 is not set +# CONFIG_RTC_DRV_RX8581 is not set +# CONFIG_RTC_DRV_S35390A is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_TEST is not set +CONFIG_RTC_DRV_TWL4030=y +# CONFIG_RTC_DRV_V3020 is not set +# CONFIG_RTC_DRV_X1205 is not set +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +CONFIG_RTC_HCTOSYS=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +CONFIG_RTC_INTF_DEV=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_LIB=y +# CONFIG_RT_GROUP_SCHED is not set +CONFIG_RT_MUTEXES=y +# CONFIG_RT_MUTEX_TESTER is not set +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_SAMPLES is not set +CONFIG_SCHED_DEBUG=y +# CONFIG_SCHEDSTATS is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_SCSI_DH is not set +CONFIG_SCSI_DMA=y +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_LOGGING is not set +CONFIG_SCSI_LOWLEVEL=y +# CONFIG_SCSI_MULTI_LUN is not set +# CONFIG_SCSI_NETLINK is not set +# CONFIG_SCSI_OSD_INITIATOR is not set +CONFIG_SCSI_PROC_FS=y +# CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SCAN_ASYNC is not set +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +# CONFIG_SCSI_TGT is not set +CONFIG_SCSI_WAIT_SCAN=m +CONFIG_SCSI=y +# CONFIG_SDIO_UART is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set +# CONFIG_SECURITYFS is not set +# CONFIG_SECURITY is not set +CONFIG_SELECT_MEMORY_MODEL=y # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADCXX is not set @@ -873,11 +1057,13 @@ CONFIG_HWMON=y # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM9240 is not set +# CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7473 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_ATXP1 is not set +# CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set @@ -886,6 +1072,7 @@ CONFIG_HWMON=y # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_IT87 is not set +# CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM75 is not set @@ -898,9 +1085,9 @@ CONFIG_HWMON=y # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set +# CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4245 is not set -# CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX6650 is not set @@ -908,380 +1095,81 @@ CONFIG_HWMON=y # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_SENSORS_SHT15 is not set -# CONFIG_SENSORS_DME1737 is not set -# CONFIG_SENSORS_SMSC47M1 is not set -# CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set -# CONFIG_SENSORS_ADS7828 is not set +# CONFIG_SENSORS_SMSC47M192 is not set +# CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set +# CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_VT1211 is not set +# CONFIG_SENSORS_W83627EHF is not set +# CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set -# CONFIG_SENSORS_W83627HF is not set -# CONFIG_SENSORS_W83627EHF is not set -# CONFIG_SENSORS_LIS3_SPI is not set -CONFIG_THERMAL=y -CONFIG_THERMAL_HWMON=y -CONFIG_WATCHDOG=y -# CONFIG_WATCHDOG_NOWAYOUT is not set - -# -# Watchdog Device Drivers -# -# CONFIG_SOFT_WATCHDOG is not set -CONFIG_OMAP_WATCHDOG=y -CONFIG_TWL4030_WATCHDOG=y - -# -# USB-based Watchdog Cards -# -# CONFIG_USBPCWATCHDOG is not set -CONFIG_SSB_POSSIBLE=y - -# -# Sonics Silicon Backplane -# -# CONFIG_SSB is not set - -# -# Multifunction device drivers -# -# CONFIG_MFD_CORE is not set -# CONFIG_MFD_SM501 is not set -# CONFIG_MFD_ASIC3 is not set -# CONFIG_HTC_EGPIO is not set -# CONFIG_HTC_PASIC3 is not set -# CONFIG_TPS65010 is not set -CONFIG_TWL4030_CORE=y -# CONFIG_TWL4030_POWER is not set -# CONFIG_MFD_TMIO is not set -# CONFIG_MFD_T7L66XB is not set -# CONFIG_MFD_TC6387XB is not set -# CONFIG_MFD_TC6393XB is not set -# CONFIG_PMIC_DA903X is not set -# CONFIG_MFD_WM8400 is not set -# CONFIG_MFD_WM831X is not set -# CONFIG_MFD_WM8350_I2C is not set -# CONFIG_MFD_PCF50633 is not set -# CONFIG_MFD_MC13783 is not set -# CONFIG_AB3100_CORE is not set -# CONFIG_EZX_PCAP is not set -CONFIG_REGULATOR=y -# CONFIG_REGULATOR_DEBUG is not set -# CONFIG_REGULATOR_FIXED_VOLTAGE is not set -# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set -# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set -# CONFIG_REGULATOR_BQ24022 is not set -# CONFIG_REGULATOR_MAX1586 is not set -CONFIG_REGULATOR_TWL4030=y -# CONFIG_REGULATOR_LP3971 is not set -# CONFIG_REGULATOR_TPS65023 is not set -# CONFIG_REGULATOR_TPS6507X is not set -CONFIG_MEDIA_SUPPORT=y - -# -# Multimedia core support -# -CONFIG_VIDEO_DEV=y -CONFIG_VIDEO_V4L2_COMMON=y -# CONFIG_VIDEO_ALLOW_V4L1 is not set -CONFIG_VIDEO_V4L1_COMPAT=y -# CONFIG_DVB_CORE is not set -CONFIG_VIDEO_MEDIA=y - -# -# Multimedia drivers -# -# CONFIG_MEDIA_ATTACH is not set -CONFIG_MEDIA_TUNER=y -# CONFIG_MEDIA_TUNER_CUSTOMISE is not set -CONFIG_MEDIA_TUNER_SIMPLE=y -CONFIG_MEDIA_TUNER_TDA8290=y -CONFIG_MEDIA_TUNER_TDA9887=y -CONFIG_MEDIA_TUNER_TEA5761=y -CONFIG_MEDIA_TUNER_TEA5767=y -CONFIG_MEDIA_TUNER_MT20XX=y -CONFIG_MEDIA_TUNER_XC2028=y -CONFIG_MEDIA_TUNER_XC5000=y -CONFIG_MEDIA_TUNER_MC44S803=y -CONFIG_VIDEO_V4L2=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_ADV7180 is not set -# 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_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_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=m -CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y -CONFIG_USB_GSPCA=m -# CONFIG_USB_M5602 is not set -# CONFIG_USB_STV06XX is not set -# CONFIG_USB_GL860 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_JEILINJ 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_ET61X251 is not set -# CONFIG_USB_SN9C102 is not set -# CONFIG_USB_ZC0301 is not set -# CONFIG_USB_PWC_INPUT_EVDEV is not set -# CONFIG_USB_ZR364XX is not set -# CONFIG_USB_STKWEBCAM is not set -# CONFIG_USB_S2255 is not set -# CONFIG_RADIO_ADAPTERS is not set -# CONFIG_DAB is not set - -# -# Graphics support -# -# CONFIG_VGASTATE is not set -# CONFIG_VIDEO_OUTPUT_CONTROL is not set -CONFIG_FB=y -# CONFIG_FIRMWARE_EDID is not set -# CONFIG_FB_DDC is not set -# CONFIG_FB_BOOT_VESA_SUPPORT is not set -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_IMAGEBLIT=y -# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set -# CONFIG_FB_SYS_FILLRECT is not set -# CONFIG_FB_SYS_COPYAREA is not set -# CONFIG_FB_SYS_IMAGEBLIT is not set -# CONFIG_FB_FOREIGN_ENDIAN is not set -# CONFIG_FB_SYS_FOPS is not set -# CONFIG_FB_SVGALIB is not set -# CONFIG_FB_MACMODES is not set -# CONFIG_FB_BACKLIGHT is not set -# CONFIG_FB_MODE_HELPERS is not set -# CONFIG_FB_TILEBLITTING is not set - -# -# Frame buffer hardware drivers -# -# CONFIG_FB_S1D13XXX is not set -# CONFIG_FB_VIRTUAL is not set -# CONFIG_FB_METRONOME is not set -# CONFIG_FB_MB862XX is not set -# CONFIG_FB_BROADSHEET is not set -# CONFIG_FB_OMAP_BOOTLOADER_INIT is not set -CONFIG_OMAP2_VRAM=y -CONFIG_OMAP2_VRFB=y -CONFIG_OMAP2_DSS=y -CONFIG_OMAP2_VRAM_SIZE=12 -CONFIG_OMAP2_DSS_DEBUG_SUPPORT=y -CONFIG_OMAP2_DSS_RFBI=y -CONFIG_OMAP2_DSS_VENC=y -# CONFIG_OMAP2_DSS_SDI is not set -CONFIG_OMAP2_DSS_DSI=y -# CONFIG_OMAP2_DSS_USE_DSI_PLL is not set -CONFIG_OMAP2_DSS_FAKE_VSYNC=y -CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK=0 -CONFIG_FB_OMAP2=y -CONFIG_FB_OMAP2_DEBUG_SUPPORT=y -CONFIG_FB_OMAP2_FORCE_AUTO_UPDATE=y -CONFIG_FB_OMAP2_NUM_FBS=3 - -# -# OMAP2/3 Display Device Drivers -# -CONFIG_PANEL_GENERIC=y -CONFIG_PANEL_SAMSUNG_LTE430WQ_F0C=y -CONFIG_PANEL_SHARP_LS037V7DW01=y -CONFIG_PANEL_TAAL=y -CONFIG_BACKLIGHT_LCD_SUPPORT=y -CONFIG_LCD_CLASS_DEVICE=y -# CONFIG_LCD_LMS283GF05 is not set -# CONFIG_LCD_LTV350QV is not set -# CONFIG_LCD_ILI9320 is not set -# CONFIG_LCD_TDO24M is not set -# CONFIG_LCD_VGG2432A4 is not set -CONFIG_LCD_PLATFORM=y -CONFIG_BACKLIGHT_CLASS_DEVICE=y -CONFIG_BACKLIGHT_GENERIC=y - -# -# Display device support -# -CONFIG_DISPLAY_SUPPORT=y - -# -# Display hardware drivers -# - -# -# Console display driver support -# -# CONFIG_VGA_CONSOLE is not set -CONFIG_DUMMY_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y -CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y -CONFIG_FONTS=y -CONFIG_FONT_8x8=y -CONFIG_FONT_8x16=y -# CONFIG_FONT_6x11 is not set -# CONFIG_FONT_7x14 is not set -# CONFIG_FONT_PEARL_8x8 is not set -# CONFIG_FONT_ACORN_8x8 is not set -# CONFIG_FONT_MINI_4x6 is not set -# CONFIG_FONT_SUN8x16 is not set -# CONFIG_FONT_SUN12x22 is not set -# CONFIG_FONT_10x18 is not set -# CONFIG_LOGO is not set -CONFIG_SOUND=y -CONFIG_SOUND_OSS_CORE=y -CONFIG_SOUND_OSS_CORE_PRECLAIM=y -CONFIG_SND=y -CONFIG_SND_TIMER=y -CONFIG_SND_PCM=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_DETECT_IRQ=y +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_NR_UARTS=32 +CONFIG_SERIAL_8250_RSA=y +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +CONFIG_SERIAL_8250_SHARE_IRQ=y +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_SERIAL_CORE=y +# CONFIG_SERIAL_MAX3100 is not set +# CONFIG_SERIAL_NONSTANDARD is not set +CONFIG_SERIO_LIBPS2=y +# CONFIG_SERIO_RAW is not set +CONFIG_SERIO_SERPORT=y +CONFIG_SERIO=y +# CONFIG_SGI_PARTITION is not set +CONFIG_SHMEM=y +CONFIG_SIGNALFD=y +CONFIG_SLABINFO=y +CONFIG_SLAB=y +# CONFIG_SLIP is not set +# CONFIG_SLOB is not set +# CONFIG_SLOW_WORK is not set +# CONFIG_SLUB is not set +# CONFIG_SND_ARM is not set +# CONFIG_SND_DEBUG is not set +# CONFIG_SND_DRIVERS is not set +# CONFIG_SND_DYNAMIC_MINORS is not set +# CONFIG_SND_EMU10K1_SEQ is not set +# CONFIG_SND_HRTIMER is not set # CONFIG_SND_HWDEP is not set CONFIG_SND_JACK=y -CONFIG_SND_SEQUENCER=y -# CONFIG_SND_SEQ_DUMMY is not set -CONFIG_SND_OSSEMUL=y # CONFIG_SND_MIXER_OSS is not set -# CONFIG_SND_PCM_OSS is not set -CONFIG_SND_SEQUENCER_OSS=y -# CONFIG_SND_HRTIMER is not set -# CONFIG_SND_DYNAMIC_MINORS is not set -# CONFIG_SND_SUPPORT_OLD_API is not set -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 is not set -# CONFIG_SND_ARM is not set -# CONFIG_SND_SPI is not set -CONFIG_SND_USB=y -# CONFIG_SND_USB_AUDIO is not set -# CONFIG_SND_USB_CAIAQ is not set -CONFIG_SND_SOC=y -CONFIG_SND_OMAP_SOC=y CONFIG_SND_OMAP_SOC_MCBSP=y CONFIG_SND_OMAP_SOC_OMAP3_BEAGLE=y -CONFIG_SND_SOC_I2C_AND_SPI=y -CONFIG_SND_SOC_ALL_CODECS=y -CONFIG_SND_SOC_WM_HUBS=y +CONFIG_SND_OMAP_SOC=y +# CONFIG_SND_OPL3_LIB_SEQ is not set +# CONFIG_SND_OPL4_LIB_SEQ is not set +CONFIG_SND_OSSEMUL=y +# CONFIG_SND_PCM_OSS is not set +CONFIG_SND_PCM=y +# CONFIG_SND_RAWMIDI_SEQ is not set +# CONFIG_SND_SBAWE_SEQ is not set +# CONFIG_SND_SEQ_DUMMY is not set +CONFIG_SND_SEQUENCER_OSS=y +CONFIG_SND_SEQUENCER=y CONFIG_SND_SOC_AD1836=y CONFIG_SND_SOC_AD1938=y CONFIG_SND_SOC_AD73311=y CONFIG_SND_SOC_AK4104=y CONFIG_SND_SOC_AK4535=y CONFIG_SND_SOC_AK4642=y +CONFIG_SND_SOC_ALL_CODECS=y CONFIG_SND_SOC_CS4270=y +CONFIG_SND_SOC_I2C_AND_SPI=y CONFIG_SND_SOC_L3=y +CONFIG_SND_SOC_MAX9877=y CONFIG_SND_SOC_PCM3008=y CONFIG_SND_SOC_SPDIF=y CONFIG_SND_SOC_SSM2602=y @@ -1310,173 +1198,264 @@ CONFIG_SND_SOC_WM8988=y CONFIG_SND_SOC_WM8990=y CONFIG_SND_SOC_WM8993=y CONFIG_SND_SOC_WM9081=y -CONFIG_SND_SOC_MAX9877=y +CONFIG_SND_SOC_WM_HUBS=y +CONFIG_SND_SOC=y +# CONFIG_SND_SPI is not set +# CONFIG_SND_SUPPORT_OLD_API is not set +CONFIG_SND_TIMER=y +# CONFIG_SND_USB_AUDIO is not set +# CONFIG_SND_USB_CAIAQ is not set +CONFIG_SND_USB=y +# CONFIG_SND_VERBOSE_PRINTK is not set +CONFIG_SND_VERBOSE_PROCFS=y +CONFIG_SND=y +# CONFIG_SOC_CAMERA is not set +# CONFIG_SOFT_WATCHDOG is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +CONFIG_SOUND_OSS_CORE_PRECLAIM=y +CONFIG_SOUND_OSS_CORE=y # CONFIG_SOUND_PRIME is not set -CONFIG_HID_SUPPORT=y -CONFIG_HID=m -# CONFIG_HIDRAW is not set - -# -# USB Input Devices -# -CONFIG_USB_HID=m -# CONFIG_HID_PID is not set -# CONFIG_USB_HIDDEV is not set - -# -# USB HID Boot Protocol drivers -# -# CONFIG_USB_KBD is not set -# CONFIG_USB_MOUSE is not set - -# -# Special HID drivers -# -# CONFIG_HID_A4TECH is not set -# CONFIG_HID_APPLE is not set -# CONFIG_HID_BELKIN is not set -# CONFIG_HID_CHERRY is not set -# CONFIG_HID_CHICONY is not set -# CONFIG_HID_CYPRESS is not set -# CONFIG_HID_DRAGONRISE is not set -# CONFIG_HID_EZKEY is not set -# CONFIG_HID_KYE is not set -# CONFIG_HID_GYRATION is not set -# CONFIG_HID_TWINHAN is not set -# CONFIG_HID_KENSINGTON is not set -# CONFIG_HID_LOGITECH is not set -# CONFIG_HID_MICROSOFT is not set -# CONFIG_HID_MONTEREY is not set -# CONFIG_HID_NTRIG is not set -# CONFIG_HID_PANTHERLORD is not set -# CONFIG_HID_PETALYNX is not set -# CONFIG_HID_SAMSUNG is not set -# CONFIG_HID_SONY is not set -# CONFIG_HID_SUNPLUS is not set -# CONFIG_HID_GREENASIA is not set -# CONFIG_HID_SMARTJOYPLUS is not set -# CONFIG_HID_TOPSEED is not set -# CONFIG_HID_THRUSTMASTER is not set -# CONFIG_HID_ZEROPLUS is not set -CONFIG_USB_SUPPORT=y +CONFIG_SOUND=y +# CONFIG_SPARSEMEM_MANUAL is not set +# CONFIG_SPI_BITBANG is not set +# CONFIG_SPI_DEBUG is not set +# CONFIG_SPI_GPIO is not set +# CONFIG_SPI_GPIO_OLD is not set +CONFIG_SPI_MASTER=y +CONFIG_SPI_OMAP24XX=y +CONFIG_SPI_SPIDEV=y +# CONFIG_SPI_TLE62X0 is not set +CONFIG_SPI=y +CONFIG_SPLIT_PTLOCK_CPUS=4 +# CONFIG_SQUASHFS_EMBEDDED is not set +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +CONFIG_SQUASHFS_LZMA=y +CONFIG_SQUASHFS=y +# CONFIG_SSB is not set +CONFIG_SSB_POSSIBLE=y +# CONFIG_SSFDC is not set +CONFIG_STACKTRACE_SUPPORT=y +# CONFIG_STAGING_EXCLUDE_BUILD is not set +CONFIG_STAGING=y +CONFIG_STANDALONE=y +CONFIG_STRIP_ASM_SYMS=y +# CONFIG_SUN_PARTITION is not set +CONFIG_SUSPEND_FREEZER=y +CONFIG_SUSPEND=y +CONFIG_SWAP=y +# CONFIG_SYN_COOKIES is not set +# CONFIG_SYSCTL_SYSCALL is not set +CONFIG_SYSCTL=y +CONFIG_SYSFS_DEPRECATED_V2=y +CONFIG_SYSFS_DEPRECATED=y +CONFIG_SYSFS=y +# CONFIG_SYS_HYPERVISOR is not set +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +# CONFIG_SYSV68_PARTITION is not set +# CONFIG_SYSV_FS is not set +CONFIG_SYSVIPC_SYSCTL=y +CONFIG_SYSVIPC=y +# CONFIG_TASKSTATS is not set +# CONFIG_TCG_TPM is not set +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +# CONFIG_TCP_MD5SIG is not set +# CONFIG_TEXTSEARCH_BM is not set +# CONFIG_TEXTSEARCH_FSM is not set +# CONFIG_TEXTSEARCH_KMP is not set +CONFIG_TEXTSEARCH=y +CONFIG_THERMAL_HWMON=y +CONFIG_THERMAL=y +# CONFIG_THUMB2_KERNEL is not set +CONFIG_TICK_ONESHOT=y +CONFIG_TIMERFD=y +# CONFIG_TIMER_STATS is not set +# CONFIG_TIPC is not set +# CONFIG_TMPFS_POSIX_ACL is not set +CONFIG_TMPFS=y +# CONFIG_TPS65010 is not set +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACING_SUPPORT=y +# CONFIG_TRANZPORT is not set +# CONFIG_TREE_PREEMPT_RCU is not set +# CONFIG_TREE_RCU_TRACE is not set +CONFIG_TREE_RCU=y +# CONFIG_TUN is not set +CONFIG_TWL4030_CORE=y +# CONFIG_TWL4030_POWER is not set +CONFIG_TWL4030_USB=y +CONFIG_TWL4030_WATCHDOG=y +# CONFIG_UACCESS_WITH_MEMCPY is not set +# CONFIG_UDF_FS is not set +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +# CONFIG_UFS_FS is not set +CONFIG_UID16=y +# CONFIG_UIO is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_UNION_MOUNT is not set +CONFIG_UNIX98_PTYS=y +# CONFIG_UNIXWARE_DISKLABEL is not set +CONFIG_UNIX=y +# CONFIG_UNUSED_SYMBOLS is not set +# CONFIG_USB_ACM is not set +# CONFIG_USB_ADUTUX is not set +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +# CONFIG_USB_APPLEDISPLAY is not set +CONFIG_USB_ARCH_HAS_EHCI=y CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_OHCI=y -CONFIG_USB_ARCH_HAS_EHCI=y -CONFIG_USB=y -CONFIG_USB_DEBUG=y -CONFIG_USB_ANNOUNCE_NEW_DEVICES=y - -# -# Miscellaneous USB options -# -CONFIG_USB_DEVICEFS=y -CONFIG_USB_DEVICE_CLASS=y -# CONFIG_USB_DYNAMIC_MINORS is not set -CONFIG_USB_SUSPEND=y -# CONFIG_USB_OTG is not set -# CONFIG_USB_OTG_WHITELIST is not set -# CONFIG_USB_OTG_BLACKLIST_HUB is not set -# CONFIG_USB_MON is not set -# CONFIG_USB_WUSB is not set -# CONFIG_USB_WUSB_CBAF is not set - -# -# USB Host Controller Drivers -# +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_BERRY_CHARGE is not set # CONFIG_USB_C67X00_HCD is not set +# CONFIG_USB_CATC is not set +# CONFIG_USB_CDC_COMPOSITE is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +CONFIG_USB_DEBUG=y +CONFIG_USB_DEVICE_CLASS=y +CONFIG_USB_DEVICEFS=y +# CONFIG_USB_DYNAMIC_MINORS is not set CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_ROOT_HUB_TT=y # CONFIG_USB_EHCI_TT_NEWSCHED is not set -# CONFIG_USB_OXU210HP_HCD is not set -# CONFIG_USB_ISP116X_HCD is not set -# CONFIG_USB_ISP1760_HCD is not set -# CONFIG_USB_ISP1362_HCD is not set -CONFIG_USB_OHCI_HCD=m -# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set -# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set -CONFIG_USB_OHCI_LITTLE_ENDIAN=y -# CONFIG_USB_SL811_HCD is not set -# CONFIG_USB_R8A66597_HCD is not set -# CONFIG_USB_HWA_HCD is not set -CONFIG_USB_MUSB_HDRC=y -CONFIG_USB_MUSB_SOC=y - -# -# OMAP 343x high speed USB support -# -# CONFIG_USB_MUSB_HOST is not set -CONFIG_USB_MUSB_PERIPHERAL=y -# CONFIG_USB_MUSB_OTG is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_ET61X251 is not set +# CONFIG_USB_ETH is not set +CONFIG_USB_EZUSB=y +# CONFIG_USB_FILE_STORAGE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_GADGET_AMD5536UDC is not set +# CONFIG_USB_GADGET_AT91 is not set +# CONFIG_USB_GADGET_ATMEL_USBA is not set +# CONFIG_USB_GADGET_CI13XXX is not set +# CONFIG_USB_GADGET_DEBUG_FILES is not set +# CONFIG_USB_GADGET_DEBUG_FS is not set +CONFIG_USB_GADGET_DEBUG=y +CONFIG_USB_GADGET_DUALSPEED=y +# CONFIG_USB_GADGET_DUMMY_HCD is not set +# CONFIG_USB_GADGETFS is not set +# CONFIG_USB_GADGET_FSL_QE is not set +# CONFIG_USB_GADGET_FSL_USB2 is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_IMX is not set +# CONFIG_USB_GADGET_LANGWELL is not set +# CONFIG_USB_GADGET_LH7A40X is not set +# CONFIG_USB_GADGET_M66592 is not set CONFIG_USB_GADGET_MUSB_HDRC=y -# CONFIG_MUSB_PIO_ONLY is not set +# CONFIG_USB_GADGET_NET2280 is not set +# CONFIG_USB_GADGET_OMAP is not set +# CONFIG_USB_GADGET_PXA25X is not set +# CONFIG_USB_GADGET_PXA27X is not set +# CONFIG_USB_GADGET_R8A66597 is not set +# CONFIG_USB_GADGET_S3C2410 is not set +# CONFIG_USB_GADGET_S3C_HSOTG is not set +CONFIG_USB_GADGET_SELECTED=y +CONFIG_USB_GADGET_VBUS_DRAW=500 +CONFIG_USB_GADGET=y +# CONFIG_USB_GL860 is not set +# CONFIG_USB_GPIO_VBUS is not set +# CONFIG_USB_G_PRINTER is not set +CONFIG_USB_G_SERIAL=y +# CONFIG_USB_GSPCA_CONEX is not set +# CONFIG_USB_GSPCA_ETOMS is not set +# CONFIG_USB_GSPCA_FINEPIX is not set +# CONFIG_USB_GSPCA_JEILINJ is not set +CONFIG_USB_GSPCA=m +# 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_SQ905C is not set +# CONFIG_USB_GSPCA_SQ905 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_USB_HIDDEV is not set +CONFIG_USB_HID=m +# CONFIG_USB_HWA_HCD is not set +# CONFIG_USB_IDMOUSE is not set CONFIG_USB_INVENTRA_DMA=y -# CONFIG_USB_TI_CPPI_DMA is not set -# CONFIG_USB_MUSB_DEBUG is not set - -# -# USB Device Class drivers -# -# CONFIG_USB_ACM is not set -# CONFIG_USB_PRINTER is not set -# CONFIG_USB_WDM is not set -# CONFIG_USB_TMC is not set - -# -# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may -# - -# -# also be needed; see USB_STORAGE Help for more info -# -CONFIG_USB_STORAGE=y -# CONFIG_USB_STORAGE_DEBUG is not set -CONFIG_USB_STORAGE_DATAFAB=y -CONFIG_USB_STORAGE_FREECOM=y -# CONFIG_USB_STORAGE_ISD200 is not set -CONFIG_USB_STORAGE_USBAT=y -CONFIG_USB_STORAGE_SDDR09=y -CONFIG_USB_STORAGE_SDDR55=y -CONFIG_USB_STORAGE_JUMPSHOT=y -CONFIG_USB_STORAGE_ALAUDA=y -# CONFIG_USB_STORAGE_ONETOUCH is not set -CONFIG_USB_STORAGE_KARMA=y -# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_IP_COMMON is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_ISP1362_HCD is not set +# CONFIG_USB_ISP1760_HCD is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_KBD is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LIBUSUAL is not set - -# -# USB Imaging devices -# +# CONFIG_USB_M5602 is not set # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set - -# -# USB port drivers -# -CONFIG_USB_SERIAL=y -# CONFIG_USB_SERIAL_CONSOLE is not set -CONFIG_USB_EZUSB=y -CONFIG_USB_SERIAL_GENERIC=y +# CONFIG_USB_MIDI_GADGET is not set +# CONFIG_USB_MON is not set +# CONFIG_USB_MOUSE is not set +# CONFIG_USB_MUSB_DEBUG is not set +CONFIG_USB_MUSB_HDRC=y +# CONFIG_USB_MUSB_HOST is not set +# CONFIG_USB_MUSB_OTG is not set +CONFIG_USB_MUSB_PERIPHERAL=y +CONFIG_USB_MUSB_SOC=y +# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set +# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +# CONFIG_USB_OTG_BLACKLIST_HUB is not set +# CONFIG_USB_OTG is not set +CONFIG_USB_OTG_UTILS=y +# CONFIG_USB_OTG_WHITELIST is not set +# CONFIG_USB_OXU210HP_HCD is not set +# CONFIG_USBPCWATCHDOG is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_PRINTER is not set +# CONFIG_USB_PWC_INPUT_EVDEV is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_S2255 is not set # CONFIG_USB_SERIAL_AIRCABLE is not set # CONFIG_USB_SERIAL_ARK3116 is not set # CONFIG_USB_SERIAL_BELKIN is not set # CONFIG_USB_SERIAL_CH341 is not set -# CONFIG_USB_SERIAL_WHITEHEAT is not set -# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_CONSOLE is not set # CONFIG_USB_SERIAL_CP210X is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_CYPRESS_M8 is not set +# CONFIG_USB_SERIAL_DEBUG is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_EMPEG is not set CONFIG_USB_SERIAL_FTDI_SIO=y # CONFIG_USB_SERIAL_FUNSOFT is not set -# CONFIG_USB_SERIAL_VISOR is not set -# CONFIG_USB_SERIAL_IPAQ is not set -# CONFIG_USB_SERIAL_IR is not set -# CONFIG_USB_SERIAL_EDGEPORT is not set -# CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_GARMIN is not set +CONFIG_USB_SERIAL_GENERIC=y +# CONFIG_USB_SERIAL_HP4X is not set +# CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IPW is not set +# CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_IUU is not set -# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set # CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set # CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_KOBIL_SCT is not set # CONFIG_USB_SERIAL_MCT_U232 is not set @@ -1484,620 +1463,272 @@ CONFIG_USB_SERIAL_FTDI_SIO=y # CONFIG_USB_SERIAL_MOS7840 is not set # CONFIG_USB_SERIAL_MOTOROLA is not set # CONFIG_USB_SERIAL_NAVMAN is not set -CONFIG_USB_SERIAL_PL2303=y +# CONFIG_USB_SERIAL_OMNINET is not set +# CONFIG_USB_SERIAL_OPTICON is not set +# CONFIG_USB_SERIAL_OPTION is not set # CONFIG_USB_SERIAL_OTI6858 is not set +CONFIG_USB_SERIAL_PL2303=y # CONFIG_USB_SERIAL_QUALCOMM is not set -# CONFIG_USB_SERIAL_SPCP8X5 is not set -# CONFIG_USB_SERIAL_HP4X is not set +# CONFIG_USB_SERIAL_QUATECH2 is not set +# CONFIG_USB_SERIAL_QUATECH_USB2 is not set # CONFIG_USB_SERIAL_SAFE is not set # CONFIG_USB_SERIAL_SIEMENS_MPI is not set # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set +# CONFIG_USB_SERIAL_SPCP8X5 is not set # CONFIG_USB_SERIAL_SYMBOL is not set # CONFIG_USB_SERIAL_TI is not set -# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_XIRCOM is not set -# CONFIG_USB_SERIAL_OPTION is not set -# CONFIG_USB_SERIAL_OMNINET is not set -# CONFIG_USB_SERIAL_OPTICON is not set -# CONFIG_USB_SERIAL_DEBUG is not set - -# -# USB Miscellaneous drivers -# -# CONFIG_USB_EMI62 is not set -# CONFIG_USB_EMI26 is not set -# CONFIG_USB_ADUTUX is not set +CONFIG_USB_SERIAL=y # CONFIG_USB_SEVSEG is not set -# CONFIG_USB_RIO500 is not set -# CONFIG_USB_LEGOTOWER is not set -# CONFIG_USB_LCD is not set -# CONFIG_USB_BERRY_CHARGE is not set -# CONFIG_USB_LED is not set -# CONFIG_USB_CYPRESS_CY7C63 is not set -# CONFIG_USB_CYTHERM is not set -# CONFIG_USB_IDMOUSE is not set -# CONFIG_USB_FTDI_ELAN is not set -# CONFIG_USB_APPLEDISPLAY is not set # CONFIG_USB_SISUSBVGA is not set -# CONFIG_USB_LD is not set -# CONFIG_USB_TRANCEVIBRATOR is not set -# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_SN9C102 is not set +# CONFIG_USB_STKWEBCAM is not set +CONFIG_USB_STORAGE_ALAUDA=y +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set +CONFIG_USB_STORAGE_DATAFAB=y +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_FREECOM=y +# CONFIG_USB_STORAGE_ISD200 is not set +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_KARMA=y +# CONFIG_USB_STORAGE_ONETOUCH is not set +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE=y +# CONFIG_USB_STV06XX is not set +CONFIG_USB_SUPPORT=y +CONFIG_USB_SUSPEND=y # CONFIG_USB_TEST is not set -# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_TI_CPPI_DMA is not set +# CONFIG_USB_TMC is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_USBNET is not set +CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y +CONFIG_USB_VIDEO_CLASS=m # CONFIG_USB_VST is not set -CONFIG_USB_GADGET=y -CONFIG_USB_GADGET_DEBUG=y -# CONFIG_USB_GADGET_DEBUG_FILES is not set -# CONFIG_USB_GADGET_DEBUG_FS is not set -CONFIG_USB_GADGET_VBUS_DRAW=500 -CONFIG_USB_GADGET_SELECTED=y -# CONFIG_USB_GADGET_AT91 is not set -# CONFIG_USB_GADGET_ATMEL_USBA is not set -# CONFIG_USB_GADGET_FSL_USB2 is not set -# CONFIG_USB_GADGET_LH7A40X is not set -# CONFIG_USB_GADGET_OMAP is not set -# CONFIG_USB_GADGET_PXA25X is not set -# CONFIG_USB_GADGET_R8A66597 is not set -# CONFIG_USB_GADGET_PXA27X is not set -# CONFIG_USB_GADGET_S3C_HSOTG is not set -# CONFIG_USB_GADGET_IMX is not set -# CONFIG_USB_GADGET_S3C2410 is not set -# CONFIG_USB_GADGET_M66592 is not set -# CONFIG_USB_GADGET_AMD5536UDC is not set -# CONFIG_USB_GADGET_FSL_QE is not set -# CONFIG_USB_GADGET_CI13XXX is not set -# CONFIG_USB_GADGET_NET2280 is not set -# CONFIG_USB_GADGET_GOKU is not set -# CONFIG_USB_GADGET_LANGWELL is not set -# CONFIG_USB_GADGET_DUMMY_HCD is not set -CONFIG_USB_GADGET_DUALSPEED=y +# CONFIG_USB_WDM is not set +# CONFIG_USB_WUSB_CBAF is not set +# CONFIG_USB_WUSB is not set +CONFIG_USB=y +# CONFIG_USB_ZC0301 is not set # CONFIG_USB_ZERO is not set -# CONFIG_USB_AUDIO is not set -# CONFIG_USB_ETH is not set -# CONFIG_USB_GADGETFS is not set -# CONFIG_USB_FILE_STORAGE is not set -CONFIG_USB_G_SERIAL=y -# CONFIG_USB_MIDI_GADGET is not set -# CONFIG_USB_G_PRINTER is not set -# CONFIG_USB_CDC_COMPOSITE is not set - -# -# OTG and related infrastructure -# -CONFIG_USB_OTG_UTILS=y -# CONFIG_USB_GPIO_VBUS is not set -# CONFIG_ISP1301_OMAP is not set -CONFIG_TWL4030_USB=y -# CONFIG_NOP_USB_XCEIV is not set -CONFIG_MMC=y -# CONFIG_MMC_DEBUG is not set -# CONFIG_MMC_UNSAFE_RESUME is not set - -# -# MMC/SD/SDIO Card Drivers -# -CONFIG_MMC_BLOCK=y -CONFIG_MMC_BLOCK_BOUNCE=y -# CONFIG_SDIO_UART is not set -# CONFIG_MMC_TEST is not set - -# -# MMC/SD/SDIO Host Controller Drivers -# -# CONFIG_MMC_SDHCI is not set -CONFIG_MMC_OMAP=y -CONFIG_MMC_OMAP_HS=y -# CONFIG_MMC_AT91 is not set -# CONFIG_MMC_ATMELMCI is not set -CONFIG_MMC_SPI=y -# CONFIG_MEMSTICK is not set -CONFIG_NEW_LEDS=y -CONFIG_LEDS_CLASS=y - -# -# LED drivers -# -# CONFIG_LEDS_PCA9532 is not set -# CONFIG_LEDS_GPIO is not set -# CONFIG_LEDS_LP3944 is not set -# CONFIG_LEDS_PCA955X is not set -# CONFIG_LEDS_DAC124S085 is not set -# CONFIG_LEDS_BD2802 is not set - -# -# LED Triggers -# -# CONFIG_LEDS_TRIGGERS is not set -# CONFIG_ACCESSIBILITY is not set -CONFIG_RTC_LIB=y -CONFIG_RTC_CLASS=y -CONFIG_RTC_HCTOSYS=y -CONFIG_RTC_HCTOSYS_DEVICE="rtc0" -# CONFIG_RTC_DEBUG is not set - -# -# RTC interfaces -# -CONFIG_RTC_INTF_SYSFS=y -CONFIG_RTC_INTF_PROC=y -CONFIG_RTC_INTF_DEV=y -# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set -# CONFIG_RTC_DRV_TEST is not set - -# -# I2C RTC drivers -# -# CONFIG_RTC_DRV_DS1307 is not set -# CONFIG_RTC_DRV_DS1374 is not set -# CONFIG_RTC_DRV_DS1672 is not set -# CONFIG_RTC_DRV_MAX6900 is not set -# CONFIG_RTC_DRV_RS5C372 is not set -# CONFIG_RTC_DRV_ISL1208 is not set -# CONFIG_RTC_DRV_X1205 is not set -# CONFIG_RTC_DRV_PCF8563 is not set -# CONFIG_RTC_DRV_PCF8583 is not set -# CONFIG_RTC_DRV_M41T80 is not set -CONFIG_RTC_DRV_TWL4030=y -# CONFIG_RTC_DRV_S35390A is not set -# CONFIG_RTC_DRV_FM3130 is not set -# CONFIG_RTC_DRV_RX8581 is not set -# CONFIG_RTC_DRV_RX8025 is not set - -# -# SPI RTC drivers -# -# CONFIG_RTC_DRV_M41T94 is not set -# CONFIG_RTC_DRV_DS1305 is not set -# CONFIG_RTC_DRV_DS1390 is not set -# CONFIG_RTC_DRV_MAX6902 is not set -# CONFIG_RTC_DRV_R9701 is not set -# CONFIG_RTC_DRV_RS5C348 is not set -# CONFIG_RTC_DRV_DS3234 is not set -# CONFIG_RTC_DRV_PCF2123 is not set - -# -# Platform RTC drivers -# -# CONFIG_RTC_DRV_CMOS is not set -# CONFIG_RTC_DRV_DS1286 is not set -# CONFIG_RTC_DRV_DS1511 is not set -# CONFIG_RTC_DRV_DS1553 is not set -# CONFIG_RTC_DRV_DS1742 is not set -# CONFIG_RTC_DRV_STK17TA8 is not set -# CONFIG_RTC_DRV_M48T86 is not set -# CONFIG_RTC_DRV_M48T35 is not set -# CONFIG_RTC_DRV_M48T59 is not set -# CONFIG_RTC_DRV_BQ4802 is not set -# CONFIG_RTC_DRV_V3020 is not set -# CONFIG_RTC_DRV_RTC7301 is not set - -# -# on-CPU RTC drivers -# -# CONFIG_DMADEVICES is not set -# CONFIG_AUXDISPLAY is not set -# CONFIG_UIO is not set - -# -# TI VLYNQ -# -CONFIG_STAGING=y -# CONFIG_STAGING_EXCLUDE_BUILD is not set -# CONFIG_USB_IP_COMMON is not set -# CONFIG_ECHO is not set -# CONFIG_COMEDI is not set -# CONFIG_ASUS_OLED is not set -# CONFIG_INPUT_MIMIO is not set -# CONFIG_TRANZPORT is not set - -# -# Android -# -# CONFIG_ANDROID is not set - -# -# Qualcomm MSM Camera And Video -# - -# -# Camera Sensor Selection -# -# CONFIG_INPUT_GPIO is not set -# CONFIG_DST is not set -# CONFIG_POHMELFS is not set -# CONFIG_PLAN9AUTH is not set -# CONFIG_LINE6_USB is not set -# CONFIG_USB_SERIAL_QUATECH2 is not set -# CONFIG_USB_SERIAL_QUATECH_USB2 is not set -# CONFIG_FB_UDL is not set - -# -# RAR Register Driver -# -# CONFIG_RAR_REGISTER is not set -# CONFIG_IIO is not set - -# -# CBUS support -# -# CONFIG_CBUS is not set - -# -# File systems -# -CONFIG_EXT2_FS=y -# CONFIG_EXT2_FS_XATTR is not set -# CONFIG_EXT2_FS_XIP is not set -CONFIG_EXT3_FS=y -# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set -# CONFIG_EXT3_FS_XATTR is not set -CONFIG_EXT4_FS=m -CONFIG_EXT4_FS_XATTR=y -CONFIG_EXT4_FS_POSIX_ACL=y -CONFIG_EXT4_FS_SECURITY=y -# CONFIG_EXT4_DEBUG is not set -CONFIG_JBD=y -# CONFIG_JBD_DEBUG is not set -CONFIG_JBD2=m -# CONFIG_JBD2_DEBUG is not set -CONFIG_FS_MBCACHE=m -# CONFIG_REISERFS_FS is not set -# CONFIG_JFS_FS is not set -CONFIG_FS_POSIX_ACL=y -CONFIG_XFS_FS=m -# CONFIG_XFS_QUOTA is not set -# CONFIG_XFS_POSIX_ACL is not set -# CONFIG_XFS_RT is not set -# CONFIG_XFS_DEBUG is not set -# CONFIG_OCFS2_FS is not set -# CONFIG_BTRFS_FS is not set -# CONFIG_NILFS2_FS is not set -# CONFIG_YAFFS_FS is not set -CONFIG_FILE_LOCKING=y -CONFIG_FSNOTIFY=y -CONFIG_DNOTIFY=y -CONFIG_INOTIFY=y -CONFIG_INOTIFY_USER=y -# CONFIG_QUOTA is not set -# CONFIG_UNION_MOUNT is not set -# CONFIG_AUTOFS_FS is not set -# CONFIG_AUTOFS4_FS is not set -CONFIG_FUSE_FS=m -# CONFIG_CUSE is not set - -# -# Caches -# -# CONFIG_FSCACHE is not set - -# -# CD-ROM/DVD Filesystems -# -# CONFIG_ISO9660_FS is not set -# CONFIG_UDF_FS is not set - -# -# DOS/FAT/NT Filesystems -# -CONFIG_FAT_FS=y -CONFIG_MSDOS_FS=y +# CONFIG_USB_ZR364XX is not set +CONFIG_USER_SCHED=y +CONFIG_V4L_USB_DRIVERS=y +CONFIG_VECTORS_BASE=0xffff0000 +# CONFIG_VETH is not set CONFIG_VFAT_FS=y -CONFIG_FAT_DEFAULT_CODEPAGE=437 -CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" -# CONFIG_NTFS_FS is not set - -# -# Pseudo filesystems -# -CONFIG_PROC_FS=y -CONFIG_PROC_SYSCTL=y -CONFIG_PROC_PAGE_MONITOR=y -CONFIG_SYSFS=y -CONFIG_TMPFS=y -# CONFIG_TMPFS_POSIX_ACL is not set -# CONFIG_HUGETLB_PAGE is not set -# CONFIG_CONFIGFS_FS is not set -CONFIG_MISC_FILESYSTEMS=y -# CONFIG_ADFS_FS is not set -# CONFIG_AFFS_FS is not set -# CONFIG_HFS_FS is not set -CONFIG_HFSPLUS_FS=m -# CONFIG_BEFS_FS is not set -# CONFIG_BFS_FS is not set -# CONFIG_EFS_FS is not set -CONFIG_JFFS2_FS=y -CONFIG_JFFS2_FS_DEBUG=0 -CONFIG_JFFS2_FS_WRITEBUFFER=y -# CONFIG_JFFS2_FS_WBUF_VERIFY is not set -# CONFIG_JFFS2_SUMMARY is not set -# CONFIG_JFFS2_FS_XATTR is not set -# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set -CONFIG_JFFS2_ZLIB=y -# CONFIG_JFFS2_LZO is not set -CONFIG_JFFS2_RTIME=y -# CONFIG_JFFS2_RUBIN is not set -# CONFIG_CRAMFS is not set -CONFIG_SQUASHFS=y -CONFIG_SQUASHFS_LZMA=y -# CONFIG_SQUASHFS_EMBEDDED is not set -CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +CONFIG_VFPv3=y +CONFIG_VFP=y +# CONFIG_VGA_CONSOLE is not set +# CONFIG_VGASTATE is not set +# CONFIG_VIDEO_ADV7170 is not set +# CONFIG_VIDEO_ADV7175 is not set +# CONFIG_VIDEO_ADV7180 is not set +# CONFIG_VIDEO_ADV7343 is not set +# CONFIG_VIDEO_ADV_DEBUG is not set +# CONFIG_VIDEO_ALLOW_V4L1 is not set +# CONFIG_VIDEO_BT819 is not set +# CONFIG_VIDEO_BT856 is not set +# CONFIG_VIDEO_BT866 is not set +CONFIG_VIDEO_CAPTURE_DRIVERS=y +# CONFIG_VIDEO_CS5345 is not set +# CONFIG_VIDEO_CS53L32A is not set +# CONFIG_VIDEO_CX231XX is not set +# CONFIG_VIDEO_CX2341X is not set +# CONFIG_VIDEO_CX25840 is not set +CONFIG_VIDEO_DEV=y +# CONFIG_VIDEO_EM28XX is not set +# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set +# CONFIG_VIDEO_HDPVR is not set +# CONFIG_VIDEO_HELPER_CHIPS_AUTO is not set +# CONFIG_VIDEO_KS0127 is not set +# CONFIG_VIDEO_M52790 is not set +CONFIG_VIDEO_MEDIA=y +# CONFIG_VIDEO_MSP3400 is not set +# CONFIG_VIDEO_MT9V011 is not set +# CONFIG_VIDEO_OUTPUT_CONTROL is not set +# CONFIG_VIDEO_OV7670 is not set +# CONFIG_VIDEO_PVRUSB2 is not set +# CONFIG_VIDEO_SAA5246A is not set +# CONFIG_VIDEO_SAA5249 is not set +# CONFIG_VIDEO_SAA6588 is not set +# CONFIG_VIDEO_SAA7110 is not set +# CONFIG_VIDEO_SAA711X is not set +# CONFIG_VIDEO_SAA7127 is not set +# CONFIG_VIDEO_SAA717X is not set +# CONFIG_VIDEO_SAA7185 is not set +# CONFIG_VIDEO_TCM825X 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_THS7303 is not set +# CONFIG_VIDEO_TLV320AIC23B is not set +# CONFIG_VIDEO_TVAUDIO is not set +# CONFIG_VIDEO_TVP514X is not set +# CONFIG_VIDEO_TVP5150 is not set +# CONFIG_VIDEO_UPD64031A is not set +# CONFIG_VIDEO_UPD64083 is not set +# CONFIG_VIDEO_USBVISION is not set +CONFIG_VIDEO_V4L1_COMPAT=y +CONFIG_VIDEO_V4L2_COMMON=y +CONFIG_VIDEO_V4L2=y +# CONFIG_VIDEO_VIVI is not set +# CONFIG_VIDEO_VP27SMPX is not set +# CONFIG_VIDEO_VPX3220 is not set +# CONFIG_VIDEO_WM8739 is not set +# CONFIG_VIDEO_WM8775 is not set +CONFIG_VIRT_TO_BUS=y +# CONFIG_VLAN_8021Q is not set +CONFIG_VM_EVENT_COUNTERS=y +# CONFIG_VMSPLIT_1G is not set +# CONFIG_VMSPLIT_2G is not set +CONFIG_VMSPLIT_3G=y +CONFIG_VT_CONSOLE=y +# CONFIG_VT_HW_CONSOLE_BINDING is not set +CONFIG_VT=y # CONFIG_VXFS_FS is not set -CONFIG_MINI_FO=y -# CONFIG_MINIX_FS is not set -# CONFIG_OMFS_FS is not set -# CONFIG_HPFS_FS is not set -# CONFIG_QNX4FS_FS is not set -# CONFIG_ROMFS_FS is not set -# CONFIG_SYSV_FS is not set -# CONFIG_UFS_FS is not set -# CONFIG_NETWORK_FILESYSTEMS is not set -CONFIG_EXPORTFS=m - -# -# Partition Types -# -CONFIG_PARTITION_ADVANCED=y -# CONFIG_ACORN_PARTITION is not set -# CONFIG_OSF_PARTITION is not set -# CONFIG_AMIGA_PARTITION is not set -# CONFIG_ATARI_PARTITION is not set -# CONFIG_MAC_PARTITION is not set -CONFIG_MSDOS_PARTITION=y -# CONFIG_BSD_DISKLABEL is not set -# CONFIG_MINIX_SUBPARTITION is not set -# CONFIG_SOLARIS_X86_PARTITION is not set -# CONFIG_UNIXWARE_DISKLABEL is not set -# CONFIG_LDM_PARTITION is not set -# CONFIG_SGI_PARTITION is not set -# CONFIG_ULTRIX_PARTITION is not set -# CONFIG_SUN_PARTITION is not set -# CONFIG_KARMA_PARTITION is not set -# CONFIG_EFI_PARTITION is not set -# CONFIG_SYSV68_PARTITION is not set -CONFIG_NLS=y -CONFIG_NLS_DEFAULT="iso8859-1" -CONFIG_NLS_CODEPAGE_437=y -# CONFIG_NLS_CODEPAGE_737 is not set -# CONFIG_NLS_CODEPAGE_775 is not set -# CONFIG_NLS_CODEPAGE_850 is not set -# CONFIG_NLS_CODEPAGE_852 is not set -# CONFIG_NLS_CODEPAGE_855 is not set -# CONFIG_NLS_CODEPAGE_857 is not set -# CONFIG_NLS_CODEPAGE_860 is not set -# CONFIG_NLS_CODEPAGE_861 is not set -# CONFIG_NLS_CODEPAGE_862 is not set -# CONFIG_NLS_CODEPAGE_863 is not set -# CONFIG_NLS_CODEPAGE_864 is not set -# CONFIG_NLS_CODEPAGE_865 is not set -# CONFIG_NLS_CODEPAGE_866 is not set -# CONFIG_NLS_CODEPAGE_869 is not set -# CONFIG_NLS_CODEPAGE_936 is not set -# CONFIG_NLS_CODEPAGE_950 is not set -# CONFIG_NLS_CODEPAGE_932 is not set -# CONFIG_NLS_CODEPAGE_949 is not set -# CONFIG_NLS_CODEPAGE_874 is not set -# CONFIG_NLS_ISO8859_8 is not set -# CONFIG_NLS_CODEPAGE_1250 is not set -# CONFIG_NLS_CODEPAGE_1251 is not set -# CONFIG_NLS_ASCII is not set -CONFIG_NLS_ISO8859_1=y -# CONFIG_NLS_ISO8859_2 is not set -# CONFIG_NLS_ISO8859_3 is not set -# CONFIG_NLS_ISO8859_4 is not set -# CONFIG_NLS_ISO8859_5 is not set -# CONFIG_NLS_ISO8859_6 is not set -# CONFIG_NLS_ISO8859_7 is not set -# CONFIG_NLS_ISO8859_9 is not set -# CONFIG_NLS_ISO8859_13 is not set -# CONFIG_NLS_ISO8859_14 is not set -# CONFIG_NLS_ISO8859_15 is not set -# CONFIG_NLS_KOI8_R is not set -# CONFIG_NLS_KOI8_U is not set -CONFIG_NLS_UTF8=m -# CONFIG_DLM is not set - -# -# Kernel hacking -# -# CONFIG_PRINTK_TIME is not set -CONFIG_ENABLE_WARN_DEPRECATED=y -CONFIG_ENABLE_MUST_CHECK=y -CONFIG_FRAME_WARN=1024 -CONFIG_MAGIC_SYSRQ=y -CONFIG_STRIP_ASM_SYMS=y -# CONFIG_UNUSED_SYMBOLS is not set -CONFIG_DEBUG_FS=y -# CONFIG_HEADERS_CHECK is not set -CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_SHIRQ is not set -CONFIG_DETECT_SOFTLOCKUP=y -# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 -CONFIG_DETECT_HUNG_TASK=y -# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 -CONFIG_SCHED_DEBUG=y -# CONFIG_SCHEDSTATS is not set -# CONFIG_TIMER_STATS is not set -# CONFIG_DEBUG_OBJECTS is not set -# CONFIG_DEBUG_SLAB is not set -# CONFIG_DEBUG_KMEMLEAK is not set -# CONFIG_DEBUG_RT_MUTEXES is not set -# CONFIG_RT_MUTEX_TESTER is not set -# CONFIG_DEBUG_SPINLOCK is not set -CONFIG_DEBUG_MUTEXES=y -# CONFIG_DEBUG_LOCK_ALLOC is not set -# CONFIG_PROVE_LOCKING is not set -# CONFIG_LOCK_STAT is not set -# CONFIG_DEBUG_SPINLOCK_SLEEP is not set -# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set -# CONFIG_DEBUG_KOBJECT is not set -# CONFIG_DEBUG_BUGVERBOSE is not set -CONFIG_DEBUG_INFO=y -# CONFIG_DEBUG_VM is not set -# CONFIG_DEBUG_WRITECOUNT is not set -# CONFIG_DEBUG_MEMORY_INIT is not set -# CONFIG_DEBUG_LIST is not set -# CONFIG_DEBUG_SG is not set -# CONFIG_DEBUG_NOTIFIERS is not set -# CONFIG_DEBUG_CREDENTIALS is not set -CONFIG_FRAME_POINTER=y -# CONFIG_BOOT_PRINTK_DELAY is not set -# CONFIG_RCU_TORTURE_TEST is not set -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -# CONFIG_BACKTRACE_SELF_TEST is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set -# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set -# CONFIG_FAULT_INJECTION is not set -# CONFIG_LATENCYTOP is not set -# CONFIG_PAGE_POISONING is not set -CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_TRACING_SUPPORT=y -# CONFIG_FTRACE is not set -# CONFIG_DYNAMIC_DEBUG is not set -# CONFIG_SAMPLES is not set -CONFIG_HAVE_ARCH_KGDB=y -# CONFIG_KGDB is not set -# CONFIG_ARM_UNWIND is not set -# CONFIG_DEBUG_USER is not set -# CONFIG_DEBUG_ERRORS is not set -# CONFIG_DEBUG_STACK_USAGE is not set -# CONFIG_DEBUG_LL is not set - -# -# Security options -# -# CONFIG_KEYS is not set -# CONFIG_SECURITY is not set -# CONFIG_SECURITYFS is not set -# CONFIG_SECURITY_FILE_CAPABILITIES is not set -CONFIG_CRYPTO=y - -# -# Crypto core or helper -# -CONFIG_CRYPTO_ALGAPI=y -CONFIG_CRYPTO_ALGAPI2=y -CONFIG_CRYPTO_AEAD=m -CONFIG_CRYPTO_AEAD2=y -CONFIG_CRYPTO_BLKCIPHER=y -CONFIG_CRYPTO_BLKCIPHER2=y -CONFIG_CRYPTO_HASH=y -CONFIG_CRYPTO_HASH2=y -# CONFIG_CRYPTO_RNG is not set -CONFIG_CRYPTO_RNG2=y -CONFIG_CRYPTO_PCOMP=y -CONFIG_CRYPTO_MANAGER=y -CONFIG_CRYPTO_MANAGER2=y -# CONFIG_CRYPTO_GF128MUL is not set -# CONFIG_CRYPTO_NULL is not set -CONFIG_CRYPTO_WORKQUEUE=y -# CONFIG_CRYPTO_CRYPTD is not set -# CONFIG_CRYPTO_AUTHENC is not set -# CONFIG_CRYPTO_TEST is not set - -# -# Authenticated Encryption with Associated Data -# -# CONFIG_CRYPTO_CCM is not set -# CONFIG_CRYPTO_GCM is not set -# CONFIG_CRYPTO_SEQIV is not set - -# -# Block modes -# -CONFIG_CRYPTO_CBC=y -# CONFIG_CRYPTO_CTR is not set -# CONFIG_CRYPTO_CTS is not set -CONFIG_CRYPTO_ECB=m -# CONFIG_CRYPTO_LRW is not set -CONFIG_CRYPTO_PCBC=m -# CONFIG_CRYPTO_XTS is not set - -# -# Hash modes -# -CONFIG_CRYPTO_HMAC=m -# CONFIG_CRYPTO_XCBC is not set -# CONFIG_CRYPTO_VMAC is not set - -# -# Digest -# -CONFIG_CRYPTO_CRC32C=y -# CONFIG_CRYPTO_GHASH is not set -# CONFIG_CRYPTO_MD4 is not set -CONFIG_CRYPTO_MD5=y -# CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_RMD128 is not set -# CONFIG_CRYPTO_RMD160 is not set -# CONFIG_CRYPTO_RMD256 is not set -# CONFIG_CRYPTO_RMD320 is not set -# CONFIG_CRYPTO_SHA1 is not set -# CONFIG_CRYPTO_SHA256 is not set -# CONFIG_CRYPTO_SHA512 is not set -# CONFIG_CRYPTO_TGR192 is not set -# CONFIG_CRYPTO_WP512 is not set - -# -# Ciphers -# -CONFIG_CRYPTO_AES=m -# CONFIG_CRYPTO_ANUBIS is not set -CONFIG_CRYPTO_ARC4=m -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST6 is not set -CONFIG_CRYPTO_DES=y -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_KHAZAD is not set -# CONFIG_CRYPTO_SALSA20 is not set -# CONFIG_CRYPTO_SEED is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_TEA is not set -# CONFIG_CRYPTO_TWOFISH is not set - -# -# Compression -# -CONFIG_CRYPTO_DEFLATE=m -CONFIG_CRYPTO_ZLIB=y -# CONFIG_CRYPTO_LZO is not set - -# -# Random Number Generation -# -# CONFIG_CRYPTO_ANSI_CPRNG is not set - -# -# OCF Configuration -# -# CONFIG_OCF_OCF is not set -CONFIG_CRYPTO_HW=y -# CONFIG_BINARY_PRINTF is not set - -# -# Library routines -# -CONFIG_BITREVERSE=y -CONFIG_GENERIC_FIND_LAST_BIT=y -CONFIG_CRC_CCITT=y -CONFIG_CRC16=m -# CONFIG_CRC_T10DIF is not set -CONFIG_CRC_ITU_T=y -CONFIG_CRC32=y -CONFIG_CRC7=y -CONFIG_LIBCRC32C=y -CONFIG_ZLIB_INFLATE=y +# CONFIG_W1 is not set +# CONFIG_WAN is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_WATCHDOG_NOWAYOUT is not set +CONFIG_WATCHDOG=y +# CONFIG_WIMAX is not set +# CONFIG_WIRELESS_EXT is not set +CONFIG_WIRELESS_OLD_REGULATORY=y +CONFIG_WIRELESS=y +# CONFIG_WLAN_80211 is not set +# CONFIG_WLAN_PRE80211 is not set +CONFIG_WLAN=y +# CONFIG_X25 is not set +# CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_XFRM_USER is not set +CONFIG_XFRM=y +# CONFIG_XFS_DEBUG is not set +CONFIG_XFS_FS=m +# CONFIG_XFS_POSIX_ACL is not set +# CONFIG_XFS_QUOTA is not set +# CONFIG_XFS_RT is not set +# CONFIG_XIP_KERNEL is not set +# CONFIG_YAFFS_FS is not set +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZLIB_DEFLATE=y -CONFIG_DECOMPRESS_LZMA=y -CONFIG_DECOMPRESS_LZMA_NEEDED=y -CONFIG_TEXTSEARCH=y -# CONFIG_TEXTSEARCH_KMP is not set -# CONFIG_TEXTSEARCH_BM is not set -# CONFIG_TEXTSEARCH_FSM is not set -CONFIG_HAS_IOMEM=y -CONFIG_HAS_IOPORT=y -CONFIG_HAS_DMA=y -CONFIG_NLATTR=y +CONFIG_ZLIB_INFLATE=y +CONFIG_ZONE_DMA_FLAG=0 +# Console display driver support +# CPU Power Management +# Crypto core or helper +# Device Drivers +# Digest +# Disk-On-Chip Device Drivers +# Display device support +# Display hardware drivers +# DOS/FAT/NT Filesystems +# Enable WiMAX (Networking options) to see the WiMAX drivers +# Encoders/decoders and other helper chips +# External I2C/SMBus adapter drivers +# File systems +# Floating point emulation +# Frame buffer hardware drivers +# GCOV-based kernel profiling +# General setup +# Generic Driver Options +# Graphics support +# Hardware I/O ports +# Hash modes +# I2C GPIO expanders: +# I2C Hardware Bus support +# I2C RTC drivers +# I2C system bus drivers (mostly embedded / system-on-chip) +# Input Device Drivers +# Input device support +# IO Schedulers +# Kernel Features +# Kernel hacking +# Kernel Performance Events And Counters +# LED drivers +# LED Triggers +# Library routines +# Linux kernel version: 2.6.32-rc5 +# LPDDR flash memory drivers +# Mapping drivers for chip access +# Memory mapped GPIO expanders: +# Miscellaneous I2C Chip support +# Miscellaneous USB options +# MMC/SD/SDIO Card Drivers +# MMC/SD/SDIO Host Controller Drivers +# MPEG video encoders +# Multifunction device drivers +# Multimedia core support +# Multimedia drivers +# Native drivers +# Networking options +# Network testing +# Non-8250 serial port support +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may +# OCF Configuration +# OMAP2/3 Display Device Drivers +# OMAP 343x high speed USB support +# OMAP Board Type +# OMAP Feature Selections +# on-CPU RTC drivers +# OTG and related infrastructure +# Other I2C/SMBus bus drivers +# Partition Types +# PCI GPIO expanders: +# Platform RTC drivers +# Power management options +# PPS support +# Processor Features +# Processor Type +# Pseudo filesystems +# Qualcomm MSM Camera And Video +# RAM/ROM/Flash chip drivers +# Random Number Generation +# RAR Register Driver +# RCU Subsystem +# RDS decoders +# RTC interfaces +# SCSI device support +# SCSI support type (disk, tape, CD-ROM) +# SCSI Transports +# Security options +# Self-contained MTD device drivers +# Serial drivers +# Sonics Silicon Backplane +# Special HID drivers +# SPI GPIO expanders: +# SPI Master Controller Drivers +# SPI Protocol Masters +# SPI RTC drivers +# System Type +# Thu Dec 10 00:13:17 2009 +# TI OMAP Implementations +# TI VLYNQ +# UBI - Unsorted block images +# USB-based Watchdog Cards +# USB Device Class drivers +# USB HID Boot Protocol drivers +# USB Host Controller Drivers +# USB Imaging devices +# USB Input Devices +# USB Miscellaneous drivers +# USB Network Adapters +# USB port drivers +# Userland interfaces +# User Modules And Translation Layers +# Userspace binary formats +# Video and audio decoders +# Video decoders +# Video encoders +# Video improvement chips +# Watchdog Device Drivers diff --git a/target/linux/pxa/config-default b/target/linux/pxa/config-default index 7ddc41685..b1c8ac671 100644 --- a/target/linux/pxa/config-default +++ b/target/linux/pxa/config-default @@ -4,18 +4,18 @@ CONFIG_APM_EMULATION=m CONFIG_ARCH_GUMSTIX=y # CONFIG_ARCH_LUBBOCK is not set CONFIG_ARCH_MTD_XIP=y -CONFIG_ARCH_PXA=y # CONFIG_ARCH_PXA_ESERIES is not set # CONFIG_ARCH_PXA_IDP is not set # CONFIG_ARCH_PXA_PALM is not set +CONFIG_ARCH_PXA=y CONFIG_ARCH_REQUIRE_GPIOLIB=y # CONFIG_ARCH_SELECT_MEMORY_MODEL is not set # CONFIG_ARCH_SPARSEMEM_DEFAULT is not set # CONFIG_ARCH_SUPPORTS_MSI is not set CONFIG_ARCH_SUSPEND_POSSIBLE=y # CONFIG_ARCH_VIPER is not set -CONFIG_ARM=y # CONFIG_ARM_THUMB is not set +CONFIG_ARM=y # CONFIG_ARPD is not set CONFIG_ATA=m CONFIG_BITREVERSE=y @@ -25,12 +25,12 @@ CONFIG_BLK_DEV_IDECS=m # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_CMDLINE="rootfstype=squashfs,jffs2 noinitrd console=ttyS0,115200" CONFIG_COMMON_CLKDEV=y -CONFIG_CPU_32=y CONFIG_CPU_32v5=y +CONFIG_CPU_32=y CONFIG_CPU_ABRT_EV5T=y CONFIG_CPU_CACHE_VIVT=y -CONFIG_CPU_CP15=y CONFIG_CPU_CP15_MMU=y +CONFIG_CPU_CP15=y CONFIG_CPU_PABRT_NOIFAR=y CONFIG_CPU_TLB_V4WBI=y CONFIG_CPU_XSCALE=y @@ -42,8 +42,8 @@ CONFIG_ENABLE_MUST_CHECK=y # CONFIG_FPE_FASTFPE is not set # CONFIG_FPE_NWFPE is not set CONFIG_FRAME_POINTER=y -CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_GPIO=y CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y @@ -67,15 +67,15 @@ CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_LATENCYTOP_SUPPORT=y CONFIG_HAVE_OPROFILE=y # CONFIG_HW_RANDOM is not set -CONFIG_I2C=m CONFIG_I2C_BOARDINFO=y CONFIG_I2C_CHARDEV=m # CONFIG_I2C_DESIGNWARE is not set +CONFIG_I2C=m CONFIG_I2C_PXA=m CONFIG_I2C_PXA_SLAVE=y CONFIG_IDE=m -CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y +CONFIG_INOTIFY=y # CONFIG_ISDN is not set CONFIG_IWMMXT=y # CONFIG_KERNEL_BZIP2 is not set @@ -84,9 +84,9 @@ CONFIG_MAC80211_DEFAULT_PS_VALUE=0 # CONFIG_MACH_ARMCORE is not set # CONFIG_MACH_BALLOON3 is not set # CONFIG_MACH_CM_X300 is not set -# CONFIG_MACH_COLIBRI is not set # CONFIG_MACH_COLIBRI300 is not set # CONFIG_MACH_COLIBRI320 is not set +# CONFIG_MACH_COLIBRI is not set # CONFIG_MACH_CSB726 is not set # CONFIG_MACH_EM_X270 is not set # CONFIG_MACH_EXEDA is not set @@ -110,9 +110,9 @@ CONFIG_MACH_GUMSTIX_VERDEX=y # CONFIG_MACH_ZYLONITE is not set # CONFIG_MFD_T7L66XB is not set CONFIG_MII=m -CONFIG_MMC=y CONFIG_MMC_BLOCK=y CONFIG_MMC_PXA=y +CONFIG_MMC=y CONFIG_MTD_CFI_ADV_OPTIONS=y # CONFIG_MTD_CFI_AMDSTD is not set CONFIG_MTD_CFI_GEOMETRY=y @@ -128,13 +128,13 @@ CONFIG_PAGE_OFFSET=0xC0000000 CONFIG_PATA_PCMCIA=m CONFIG_PCCARD=m # CONFIG_PCI_SYSCALL is not set -CONFIG_PCMCIA=m CONFIG_PCMCIA_LOAD_CIS=y +CONFIG_PCMCIA=m CONFIG_PCMCIA_PXA2XX=m CONFIG_PLAT_PXA=y -CONFIG_PM=y # CONFIG_PM_DEBUG is not set # CONFIG_PM_RUNTIME is not set +CONFIG_PM=y CONFIG_PXA27x=y # CONFIG_PXA_EZX is not set # CONFIG_PXA_SHARPSL is not set @@ -144,15 +144,15 @@ CONFIG_SCSI=m # CONFIG_SCSI_PROC_FS is not set # CONFIG_SDIO_UART is not set # CONFIG_SERIAL_8250 is not set -CONFIG_SERIAL_PXA=y CONFIG_SERIAL_PXA_CONSOLE=y -CONFIG_SERIO=m +CONFIG_SERIAL_PXA=y CONFIG_SERIO_LIBPS2=m +CONFIG_SERIO=m # CONFIG_SERIO_RAW is not set CONFIG_SERIO_SERPORT=m -CONFIG_SMSC911X=y CONFIG_SMC911X=m CONFIG_SMC91X=m +CONFIG_SMSC911X=y CONFIG_SPLIT_PTLOCK_CPUS=4096 # CONFIG_SUSPEND is not set # CONFIG_SYSCTL_SYSCALL is not set diff --git a/target/linux/ramips/rt288x/config-2.6.32 b/target/linux/ramips/rt288x/config-2.6.32 index a89d42229..840231b98 100644 --- a/target/linux/ramips/rt288x/config-2.6.32 +++ b/target/linux/ramips/rt288x/config-2.6.32 @@ -16,8 +16,8 @@ CONFIG_BITREVERSE=y # CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set # CONFIG_CAVIUM_OCTEON_SIMULATOR is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y -CONFIG_CEVT_R4K=y CONFIG_CEVT_R4K_LIB=y +CONFIG_CEVT_R4K=y CONFIG_CFG80211_DEFAULT_PS_VALUE=0 CONFIG_CMDLINE="console=ttyS1,57600 rootfstype=squashfs,jffs2" # CONFIG_CPU_BIG_ENDIAN is not set @@ -26,9 +26,9 @@ CONFIG_CPU_HAS_PREFETCH=y CONFIG_CPU_HAS_SYNC=y CONFIG_CPU_LITTLE_ENDIAN=y # CONFIG_CPU_LOONGSON2E is not set -CONFIG_CPU_MIPS32=y # CONFIG_CPU_MIPS32_R1 is not set CONFIG_CPU_MIPS32_R2=y +CONFIG_CPU_MIPS32=y # CONFIG_CPU_MIPS64_R1 is not set # CONFIG_CPU_MIPS64_R2 is not set CONFIG_CPU_MIPSR2=y @@ -50,8 +50,8 @@ CONFIG_CPU_SUPPORTS_HIGHMEM=y # CONFIG_CPU_TX39XX is not set # CONFIG_CPU_TX49XX is not set # CONFIG_CPU_VR41XX is not set -CONFIG_CSRC_R4K=y CONFIG_CSRC_R4K_LIB=y +CONFIG_CSRC_R4K=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DEVPORT=y # CONFIG_DM9000 is not set @@ -59,8 +59,8 @@ CONFIG_DMA_NEED_PCI_MAP_STATE=y CONFIG_DMA_NONCOHERENT=y CONFIG_EARLY_PRINTK=y # CONFIG_FSNOTIFY is not set -CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y @@ -91,7 +91,6 @@ CONFIG_IRQ_CPU=y # CONFIG_MACH_VR41XX is not set # CONFIG_MII is not set # CONFIG_MIKROTIK_RB532 is not set -CONFIG_MIPS=y # CONFIG_MIPS_COBALT is not set CONFIG_MIPS_L1_CACHE_SHIFT=4 CONFIG_MIPS_MACHINE=y @@ -102,6 +101,7 @@ CONFIG_MIPS_MT_DISABLED=y CONFIG_MIPS_RALINK=y # CONFIG_MIPS_RAMIPS_NET is not set # CONFIG_MIPS_SIM is not set +CONFIG_MIPS=y # CONFIG_MTD_CFI_INTELEXT is not set # CONFIG_MTD_COMPLEX_MAPPINGS is not set CONFIG_MTD_PHYSMAP=y @@ -122,8 +122,8 @@ CONFIG_RALINK_RT288X=y # CONFIG_RALINK_RT305X is not set CONFIG_RT288X_MACH_RT_N15=y CONFIG_RT288X_MACH_WZR_AGL300NH=y -CONFIG_RTL8366S_PHY=y CONFIG_RTL8366_SMI=y +CONFIG_RTL8366S_PHY=y CONFIG_SCHED_OMIT_FRAME_POINTER=y # CONFIG_SCSI_DMA is not set # CONFIG_SERIAL_8250_EXTENDED is not set diff --git a/target/linux/ramips/rt305x/config-2.6.32 b/target/linux/ramips/rt305x/config-2.6.32 index d6e873f42..13c449cf4 100644 --- a/target/linux/ramips/rt305x/config-2.6.32 +++ b/target/linux/ramips/rt305x/config-2.6.32 @@ -16,8 +16,8 @@ CONFIG_BITREVERSE=y # CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set # CONFIG_CAVIUM_OCTEON_SIMULATOR is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y -CONFIG_CEVT_R4K=y CONFIG_CEVT_R4K_LIB=y +CONFIG_CEVT_R4K=y CONFIG_CFG80211_DEFAULT_PS_VALUE=0 CONFIG_CMDLINE="console=ttyS1,57600 rootfstype=squashfs,jffs2" # CONFIG_CPU_BIG_ENDIAN is not set @@ -26,9 +26,9 @@ CONFIG_CPU_HAS_PREFETCH=y CONFIG_CPU_HAS_SYNC=y CONFIG_CPU_LITTLE_ENDIAN=y # CONFIG_CPU_LOONGSON2E is not set -CONFIG_CPU_MIPS32=y # CONFIG_CPU_MIPS32_R1 is not set CONFIG_CPU_MIPS32_R2=y +CONFIG_CPU_MIPS32=y # CONFIG_CPU_MIPS64_R1 is not set # CONFIG_CPU_MIPS64_R2 is not set CONFIG_CPU_MIPSR2=y @@ -50,16 +50,16 @@ CONFIG_CPU_SUPPORTS_HIGHMEM=y # CONFIG_CPU_TX39XX is not set # CONFIG_CPU_TX49XX is not set # CONFIG_CPU_VR41XX is not set -CONFIG_CSRC_R4K=y CONFIG_CSRC_R4K_LIB=y +CONFIG_CSRC_R4K=y CONFIG_DECOMPRESS_LZMA=y # CONFIG_DM9000 is not set CONFIG_DMA_NEED_PCI_MAP_STATE=y CONFIG_DMA_NONCOHERENT=y CONFIG_EARLY_PRINTK=y # CONFIG_FSNOTIFY is not set -CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y @@ -89,7 +89,6 @@ CONFIG_IRQ_CPU=y # CONFIG_MACH_VR41XX is not set # CONFIG_MII is not set # CONFIG_MIKROTIK_RB532 is not set -CONFIG_MIPS=y # CONFIG_MIPS_COBALT is not set CONFIG_MIPS_L1_CACHE_SHIFT=5 CONFIG_MIPS_MACHINE=y @@ -100,6 +99,7 @@ CONFIG_MIPS_MT_DISABLED=y CONFIG_MIPS_RALINK=y CONFIG_MIPS_RAMIPS_NET=y # CONFIG_MIPS_SIM is not set +CONFIG_MIPS=y # CONFIG_MTD_CFI_INTELEXT is not set CONFIG_MTD_PHYSMAP=y # CONFIG_NO_IOPORT is not set diff --git a/target/linux/rb532/config-default b/target/linux/rb532/config-default index 5018a2fae..a363c997b 100644 --- a/target/linux/rb532/config-default +++ b/target/linux/rb532/config-default @@ -11,7 +11,6 @@ CONFIG_ARCH_REQUIRE_GPIOLIB=y CONFIG_ARCH_SUPPORTS_OPROFILE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ATA=y -# CONFIG_ATA_PIIX is not set # CONFIG_BCM47XX is not set # CONFIG_BCM63XX is not set CONFIG_BITREVERSE=y @@ -20,8 +19,8 @@ CONFIG_BOOT_RAW=y # CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set # CONFIG_CAVIUM_OCTEON_SIMULATOR is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y -CONFIG_CEVT_R4K=y CONFIG_CEVT_R4K_LIB=y +CONFIG_CEVT_R4K=y CONFIG_CFG80211_DEFAULT_PS_VALUE=0 # CONFIG_CPU_BIG_ENDIAN is not set # CONFIG_CPU_CAVIUM_OCTEON is not set @@ -29,9 +28,9 @@ CONFIG_CPU_HAS_PREFETCH=y CONFIG_CPU_HAS_SYNC=y CONFIG_CPU_LITTLE_ENDIAN=y # CONFIG_CPU_LOONGSON2E is not set -CONFIG_CPU_MIPS32=y CONFIG_CPU_MIPS32_R1=y # CONFIG_CPU_MIPS32_R2 is not set +CONFIG_CPU_MIPS32=y # CONFIG_CPU_MIPS64_R1 is not set # CONFIG_CPU_MIPS64_R2 is not set CONFIG_CPU_MIPSR1=y @@ -53,8 +52,8 @@ CONFIG_CPU_SUPPORTS_HIGHMEM=y # CONFIG_CPU_TX39XX is not set # CONFIG_CPU_TX49XX is not set # CONFIG_CPU_VR41XX is not set -CONFIG_CSRC_R4K=y CONFIG_CSRC_R4K_LIB=y +CONFIG_CSRC_R4K=y # CONFIG_DEBUG_FS is not set CONFIG_DECOMPRESS_LZMA=y CONFIG_DEVPORT=y @@ -64,8 +63,8 @@ CONFIG_DMA_NONCOHERENT=y # CONFIG_ENABLE_WARN_DEPRECATED is not set CONFIG_EXT2_FS=y # CONFIG_FSNOTIFY is not set -CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y @@ -84,8 +83,8 @@ CONFIG_HAVE_OPROFILE=y # CONFIG_HIGH_RES_TIMERS is not set CONFIG_HW_HAS_PCI=y CONFIG_HW_RANDOM=y -CONFIG_HZ=250 # CONFIG_HZ_100 is not set +CONFIG_HZ=250 CONFIG_HZ_250=y CONFIG_IMAGE_CMDLINE_HACK=y CONFIG_INITRAMFS_SOURCE="" @@ -102,7 +101,6 @@ CONFIG_LEDS_MIKROTIK_RB532=y # CONFIG_MACH_TX49XX is not set # CONFIG_MACH_VR41XX is not set CONFIG_MIKROTIK_RB532=y -CONFIG_MIPS=y # CONFIG_MIPS_COBALT is not set CONFIG_MIPS_L1_CACHE_SHIFT=4 # CONFIG_MIPS_MACHINE is not set @@ -111,15 +109,16 @@ CONFIG_MIPS_MT_DISABLED=y # CONFIG_MIPS_MT_SMP is not set # CONFIG_MIPS_MT_SMTC is not set # CONFIG_MIPS_SIM is not set +CONFIG_MIPS=y CONFIG_MTD_BLOCK2MTD=y CONFIG_MTD_CFI_ADV_OPTIONS=y # CONFIG_MTD_CFI_AMDSTD is not set CONFIG_MTD_CFI_GEOMETRY=y # CONFIG_MTD_CFI_INTELEXT is not set # CONFIG_MTD_COMPLEX_MAPPINGS is not set -CONFIG_MTD_NAND=y CONFIG_MTD_NAND_PLATFORM=y CONFIG_MTD_NAND_VERIFY_WRITE=y +CONFIG_MTD_NAND=y CONFIG_MTD_PHYSMAP=y # CONFIG_MTD_ROOTFS_ROOT_DEV is not set # CONFIG_MTD_ROOTFS_SPLIT is not set @@ -139,10 +138,10 @@ CONFIG_PCSPKR_PLATFORM=y # CONFIG_PROBE_INITRD_HEADER is not set CONFIG_RC32434_WDT=y CONFIG_SCHED_OMIT_FRAME_POINTER=y -CONFIG_SCSI=y # CONFIG_SCSI_LOWLEVEL is not set # CONFIG_SCSI_MULTI_LUN is not set # CONFIG_SCSI_PROC_FS is not set +CONFIG_SCSI=y # CONFIG_SERIAL_8250_EXTENDED is not set # CONFIG_SGI_IP22 is not set # CONFIG_SGI_IP27 is not set @@ -165,8 +164,8 @@ CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y CONFIG_TRAD_SIGNALS=y # CONFIG_TREE_PREEMPT_RCU is not set CONFIG_TREE_RCU=y -CONFIG_VIA_RHINE=y CONFIG_VIA_RHINE_MMIO=y +CONFIG_VIA_RHINE=y CONFIG_YAFFS_9BYTE_TAGS=y # CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED is not set CONFIG_YAFFS_AUTO_YAFFS2=y diff --git a/target/linux/rdc/bifferboard/config-2.6.30 b/target/linux/rdc/bifferboard/config-2.6.30 index e37e74ca0..c97dcdaac 100644 --- a/target/linux/rdc/bifferboard/config-2.6.30 +++ b/target/linux/rdc/bifferboard/config-2.6.30 @@ -1,8 +1,8 @@ CONFIG_CMDLINE="console=ttyS0,115200 rootfstype=squashfs,jffs2" # CONFIG_MTD_PHYSMAP is not set -CONFIG_MTD_RDC3210=y CONFIG_MTD_RDC3210_ALLOW_JFFS2=y CONFIG_MTD_RDC3210_BUSWIDTH=2 # CONFIG_MTD_RDC3210_FACTORY_PRESENT is not set CONFIG_MTD_RDC3210_SIZE=0x800000 # CONFIG_MTD_RDC3210_STATIC_MAP is not set +CONFIG_MTD_RDC3210=y diff --git a/target/linux/rdc/config-2.6.30 b/target/linux/rdc/config-2.6.30 index 52a5d0722..f34da7bfe 100644 --- a/target/linux/rdc/config-2.6.30 +++ b/target/linux/rdc/config-2.6.30 @@ -76,14 +76,13 @@ CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y CONFIG_GENERIC_GPIO=y -CONFIG_GPIOLIB=y -CONFIG_GPIO_SYSFS=y -CONFIG_LEDS_GPIO=y CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y CONFIG_GENERIC_IOMAP=y CONFIG_GENERIC_ISA_DMA=y # CONFIG_GENERIC_TIME_VSYSCALL is not set # CONFIG_GEN_RTC is not set +CONFIG_GPIOLIB=y +CONFIG_GPIO_SYSFS=y # CONFIG_HAMRADIO is not set # CONFIG_HANGCHECK_TIMER is not set CONFIG_HAS_DMA=y @@ -157,6 +156,7 @@ CONFIG_KERNEL_LZMA=y CONFIG_KTIME_SCALAR=y CONFIG_LBD=y # CONFIG_LEDS_ALIX2 is not set +CONFIG_LEDS_GPIO=y # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_LEDS_TRIGGER_TIMER is not set diff --git a/target/linux/sibyte/config-default b/target/linux/sibyte/config-default index 32f6fc9c5..a597d50c6 100644 --- a/target/linux/sibyte/config-default +++ b/target/linux/sibyte/config-default @@ -46,13 +46,13 @@ CONFIG_CPU_HAS_SYNC=y # CONFIG_CPU_R8000 is not set # CONFIG_CPU_RM7000 is not set # CONFIG_CPU_RM9000 is not set -CONFIG_CPU_SB1=y # CONFIG_CPU_SB1_PASS_1 is not set # CONFIG_CPU_SB1_PASS_2_112x is not set # CONFIG_CPU_SB1_PASS_2_1250 is not set # CONFIG_CPU_SB1_PASS_2_2 is not set CONFIG_CPU_SB1_PASS_3=y # CONFIG_CPU_SB1_PASS_4 is not set +CONFIG_CPU_SB1=y CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y CONFIG_CPU_SUPPORTS_64BIT_KERNEL=y CONFIG_CPU_SUPPORTS_HIGHMEM=y @@ -68,8 +68,8 @@ CONFIG_DEVPORT=y CONFIG_DMA_COHERENT=y CONFIG_EARLY_PRINTK=y CONFIG_FW_LOADER=m -CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y @@ -83,18 +83,18 @@ CONFIG_HAVE_IDE=y CONFIG_HAVE_MLOCK=y CONFIG_HAVE_OPROFILE=y CONFIG_HAVE_SYSCALL_WRAPPERS=y -CONFIG_HWMON=y -CONFIG_HWMON_DEBUG_CHIP=y CONFIG_HW_HAS_PCI=y +CONFIG_HWMON_DEBUG_CHIP=y +CONFIG_HWMON=y CONFIG_HW_RANDOM=m -CONFIG_HZ=250 # CONFIG_HZ_100 is not set +CONFIG_HZ=250 CONFIG_HZ_250=y -CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_SIBYTE=y +CONFIG_I2C=y CONFIG_INITRAMFS_ROOT_GID=0 CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_SOURCE="../../root" @@ -113,7 +113,6 @@ CONFIG_LOG_BUF_SHIFT=15 # CONFIG_MACH_VR41XX is not set # CONFIG_MIKROTIK_RB532 is not set CONFIG_MINI_FO=m -CONFIG_MIPS=y CONFIG_MIPS32_COMPAT=y # CONFIG_MIPS32_N32 is not set CONFIG_MIPS32_O32=y @@ -125,13 +124,14 @@ CONFIG_MIPS_MT_DISABLED=y # CONFIG_MIPS_MT_SMP is not set # CONFIG_MIPS_MT_SMTC is not set # CONFIG_MIPS_SIM is not set +CONFIG_MIPS=y # CONFIG_MOXA_INTELLIO is not set # CONFIG_MOXA_SMARTIO is not set CONFIG_MTD_PHYSMAP=y +# CONFIG_N_HDLC is not set # CONFIG_NO_IOPORT is not set # CONFIG_NXP_STB220 is not set # CONFIG_NXP_STB225 is not set -# CONFIG_N_HDLC is not set CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_PCI_DOMAINS=y CONFIG_PHYLIB=y @@ -147,19 +147,19 @@ CONFIG_PHYS_ADDR_T_64BIT=y # CONFIG_ROCKETPORT is not set CONFIG_RTC_CLASS=y # CONFIG_RTC_DRV_CMOS is not set -CONFIG_RTC_DRV_M41T80=y # CONFIG_RTC_DRV_M41T80_WDT is not set +CONFIG_RTC_DRV_M41T80=y CONFIG_SB1250_MAC=y -# CONFIG_SB1XXX_CORELIS is not set # CONFIG_SB1_CERR_STALL is not set # CONFIG_SB1_CEX_ALWAYS_FATAL is not set +# CONFIG_SB1XXX_CORELIS is not set CONFIG_SCHED_OMIT_FRAME_POINTER=y # CONFIG_SCSI_DMA is not set CONFIG_SENSORS_LM90=y # CONFIG_SERIAL_8250 is not set CONFIG_SERIAL_NONSTANDARD=y -CONFIG_SERIAL_SB1250_DUART=y CONFIG_SERIAL_SB1250_DUART_CONSOLE=y +CONFIG_SERIAL_SB1250_DUART=y # CONFIG_SGI_IP22 is not set # CONFIG_SGI_IP27 is not set # CONFIG_SGI_IP28 is not set @@ -187,9 +187,8 @@ CONFIG_SIBYTE_SB1xxx_SOC=y # CONFIG_STALDRV is not set CONFIG_SWAP_IO_SPACE=y # CONFIG_SX is not set -# CONFIG_SYNCLINKMP is not set # CONFIG_SYNCLINK_GT is not set -CONFIG_SYSVIPC_COMPAT=y +# CONFIG_SYNCLINKMP is not set CONFIG_SYS_HAS_CPU_SB1=y CONFIG_SYS_HAS_EARLY_PRINTK=y CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y @@ -197,6 +196,7 @@ CONFIG_SYS_SUPPORTS_64BIT_KERNEL=y CONFIG_SYS_SUPPORTS_ARBIT_HZ=y CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y +CONFIG_SYSVIPC_COMPAT=y # CONFIG_TC35815 is not set CONFIG_TRACING_SUPPORT=y # CONFIG_WATCHDOG is not set diff --git a/target/linux/ubicom32/config-2.6.30 b/target/linux/ubicom32/config-2.6.30 index 8f88523d0..e6367fbdc 100755 --- a/target/linux/ubicom32/config-2.6.30 +++ b/target/linux/ubicom32/config-2.6.30 @@ -10,28 +10,28 @@ CONFIG_BINFMT_FLAT=y # CONFIG_BINFMT_SHARED_FLAT is not set CONFIG_BINFMT_ZFLAT=y CONFIG_BITREVERSE=y -CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_RAM=y # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y -CONFIG_CMDLINE="console=ttyUM0 console=ttyUS0 serdes=0x02004000,61,250000000" CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE="console=ttyUM0 console=ttyUS0 serdes=0x02004000,61,250000000" # CONFIG_CMDLINE_OVERRIDE is not set CONFIG_CPU_BIG_ENDIAN=y CONFIG_CRC_CCITT=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_ARC4=y -CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y +CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_ECB=y -CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HW=y -CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y +CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_RNG2=y # CONFIG_CRYPTO_UBICOM32 is not set CONFIG_CRYPTO_WORKQUEUE=y @@ -53,8 +53,8 @@ CONFIG_FORCE_MAX_ZONEORDER=14 # CONFIG_FPU is not set # CONFIG_FUTEX is not set # CONFIG_FW_LOADER is not set -CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y CONFIG_GENERIC_GPIO=y @@ -66,16 +66,16 @@ CONFIG_HAS_IOMEM=y CONFIG_HAVE_CLK=y # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_HAVE_OPROFILE=y -CONFIG_HW_RANDOM=y CONFIG_HW_RANDOM_UBICOM32=y +CONFIG_HW_RANDOM=y CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y CONFIG_INITRAMFS_ROOT_GID=0 CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_SOURCE="../romfs ../vendors/Ubicom/RouterGateway/initramfs_list" -CONFIG_INPUT=y # CONFIG_INPUT_MISC is not set CONFIG_INPUT_POLLDEV=y +CONFIG_INPUT=y # CONFIG_IOSCHED_DEADLINE is not set # CONFIG_IP5160DEV is not set # CONFIG_IP5160EVAL is not set @@ -83,15 +83,15 @@ CONFIG_INPUT_POLLDEV=y # CONFIG_IP7145DPF is not set # CONFIG_IP7160BRINGUP is not set # CONFIG_IP7160DPF is not set -CONFIG_IP7160RGW=y # CONFIG_IP7160RGWLCD is not set +CONFIG_IP7160RGW=y # CONFIG_IP7500AV is not set # CONFIG_IP7500IAP is not set # CONFIG_IP7500MEDIA is not set # CONFIG_IP7500MODULE is not set # CONFIG_IP7500WSPKR is not set -# CONFIG_IRQSTACKS is not set CONFIG_IRQ_PER_CPU=y +# CONFIG_IRQSTACKS is not set # CONFIG_ISDN is not set # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set # CONFIG_JFFS2_SUMMARY is not set @@ -99,8 +99,8 @@ CONFIG_LDM_DEBUG=y CONFIG_LDM_PARTITION=y CONFIG_LEDS_GPIO=y # CONFIG_LEDS_TRIGGERS is not set -CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 +CONFIG_LEGACY_PTYS=y CONFIG_LIBCRC32C=y # CONFIG_LINKER_RELAXATION is not set CONFIG_MIN_RAMSIZE=0x02000000 @@ -117,10 +117,10 @@ CONFIG_MTD_UBI32_M25P80=y # CONFIG_MTD_UBI32_NAND_SPI_ER is not set # CONFIG_NET_ETHERNET is not set # CONFIG_NOBOARD is not set -CONFIG_NOMMU_INITIAL_TRIM_EXCESS=1 CONFIG_NO_HZ=y CONFIG_NO_IOPORT=y # CONFIG_NO_KERNEL_MSG is not set +CONFIG_NOMMU_INITIAL_TRIM_EXCESS=1 CONFIG_OCM_MODULES_FALLBACK_TO_DDR=y CONFIG_OCM_MODULES_MAY_CONSUME_REMAINING_CODESPACE=y CONFIG_OCM_MODULES_RESERVATION=41 @@ -137,39 +137,39 @@ CONFIG_RAMKERNEL=y CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y # CONFIG_SCSI_DMA is not set # CONFIG_SERIAL_8250 is not set -CONFIG_SERIAL_UBI32_MAILBOX=y CONFIG_SERIAL_UBI32_MAILBOX_CONSOLE=y +CONFIG_SERIAL_UBI32_MAILBOX=y # CONFIG_SERIAL_UBI32_SERDES is not set # CONFIG_SERIAL_UBI32_UARTTIO is not set # CONFIG_SIGNALFD is not set # CONFIG_SLOW_WORK is not set # CONFIG_SND_UBI32 is not set -CONFIG_SPI=y CONFIG_SPI_BITBANG=y # CONFIG_SPI_GPIO is not set CONFIG_SPI_MASTER=y # CONFIG_SPI_SPIDEV is not set CONFIG_SPI_UBICOM32_GPIO=y +CONFIG_SPI=y # CONFIG_STOP_ON_BUG is not set # CONFIG_STOP_ON_TRAP is not set # CONFIG_SYSCTL_SYSCALL_CHECK is not set -CONFIG_SYSFS_DEPRECATED=y CONFIG_SYSFS_DEPRECATED_V2=y -# CONFIG_TIMERFD is not set -CONFIG_TIMER_EXTRA_ALLOC=0 +CONFIG_SYSFS_DEPRECATED=y CONFIG_TIME_LOW_RES=y +CONFIG_TIMER_EXTRA_ALLOC=0 +# CONFIG_TIMERFD is not set CONFIG_TRACING_SUPPORT=y CONFIG_UBI32_WDT=y -CONFIG_UBICOM32=y CONFIG_UBICOM32_GMAC=y CONFIG_UBICOM32_OCM_FOR_SKB=y # CONFIG_UBICOM32_PLIO is not set CONFIG_UBICOM32_V4=y +CONFIG_UBICOM32=y # CONFIG_UBICOM_HID is not set -CONFIG_UBICOM_INPUT=y # CONFIG_UBICOM_INPUT_I2C is not set -CONFIG_UBICOM_SWITCH=y +CONFIG_UBICOM_INPUT=y CONFIG_UBICOM_SWITCH_BCM539X=y +CONFIG_UBICOM_SWITCH=y # CONFIG_UNALIGNED_ACCESS_DISABLED is not set CONFIG_UNALIGNED_ACCESS_ENABLED=y # CONFIG_UNALIGNED_ACCESS_USERSPACE_ONLY is not set diff --git a/target/linux/xburst/config-2.6.32 b/target/linux/xburst/config-2.6.32 index 37d2c420c..7f5ee8164 100644 --- a/target/linux/xburst/config-2.6.32 +++ b/target/linux/xburst/config-2.6.32 @@ -32,9 +32,9 @@ CONFIG_CPU_HAS_PREFETCH=y CONFIG_CPU_HAS_SYNC=y CONFIG_CPU_LITTLE_ENDIAN=y # CONFIG_CPU_LOONGSON2E is not set -CONFIG_CPU_MIPS32=y CONFIG_CPU_MIPS32_R1=y # CONFIG_CPU_MIPS32_R2 is not set +CONFIG_CPU_MIPS32=y # CONFIG_CPU_MIPS64_R1 is not set # CONFIG_CPU_MIPS64_R2 is not set CONFIG_CPU_MIPSR1=y @@ -72,13 +72,12 @@ CONFIG_ENABLE_MUST_CHECK=y CONFIG_EXT2_FS=y CONFIG_EXT3_FS=y CONFIG_FAT_FS=y -CONFIG_FB=y CONFIG_FB_JZ4740=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_IMAGEBLIT=y +CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set -CONFIG_FONTS=y # CONFIG_FONT_10x18 is not set # CONFIG_FONT_6x11 is not set # CONFIG_FONT_7x14 is not set @@ -89,14 +88,15 @@ CONFIG_FONTS=y # CONFIG_FONT_PEARL_8x8 is not set # CONFIG_FONT_SUN12x22 is not set CONFIG_FONT_SUN8x16=y +CONFIG_FONTS=y CONFIG_FORCE_MAX_ZONEORDER=12 -CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set +CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FREEZER=y # CONFIG_FSNOTIFY is not set -CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_GENERIC_FIND_LAST_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y @@ -118,18 +118,18 @@ CONFIG_HW_CONSOLE=y # CONFIG_HW_RANDOM is not set CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y -CONFIG_INPUT=y CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_GPIO_BUTTONS is not set CONFIG_INPUT_KEYBOARD=y +CONFIG_INPUT=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_CFQ=y # CONFIG_IP_ADVANCED_ROUTER is not set # CONFIG_IP_MULTICAST is not set -CONFIG_IP_PNP=y CONFIG_IP_PNP_BOOTP=y CONFIG_IP_PNP_DHCP=y # CONFIG_IP_PNP_RARP is not set +CONFIG_IP_PNP=y CONFIG_IRQ_CPU=y # CONFIG_ISDN is not set CONFIG_JBD=y @@ -155,14 +155,14 @@ CONFIG_LCD_GPM940B0=y # CONFIG_LCD_PLATFORM is not set # CONFIG_LCD_TDO24M is not set # CONFIG_LCD_VGG2432A4 is not set -CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=2 +CONFIG_LEGACY_PTYS=y CONFIG_LOCK_KERNEL=y -CONFIG_LOGO=y # CONFIG_LOGO_LINUX_CLUT224 is not set # CONFIG_LOGO_LINUX_MONO is not set # CONFIG_LOGO_LINUX_VGA16 is not set CONFIG_LOGO_OPENWRT_CLUT224=y +CONFIG_LOGO=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y # CONFIG_MACH_ALCHEMY is not set @@ -175,7 +175,6 @@ CONFIG_MACH_JZ=y # CONFIG_MACH_VR41XX is not set # CONFIG_MIKROTIK_RB532 is not set # CONFIG_MINI_FO is not set -CONFIG_MIPS=y # CONFIG_MIPS_COBALT is not set CONFIG_MIPS_L1_CACHE_SHIFT=5 # CONFIG_MIPS_MACHINE is not set @@ -184,30 +183,30 @@ CONFIG_MIPS_MT_DISABLED=y # CONFIG_MIPS_MT_SMP is not set # CONFIG_MIPS_MT_SMTC is not set # CONFIG_MIPS_SIM is not set -CONFIG_MMC=y +CONFIG_MIPS=y # CONFIG_MMC_AT91 is not set # CONFIG_MMC_ATMELMCI is not set -CONFIG_MMC_BLOCK=y # CONFIG_MMC_BLOCK_BOUNCE is not set +CONFIG_MMC_BLOCK=y CONFIG_MMC_JZ=y CONFIG_MMC_UNSAFE_RESUME=y +CONFIG_MMC=y # CONFIG_MTD_CFI is not set # CONFIG_MTD_COMPLEX_MAPPINGS is not set -CONFIG_MTD_NAND=y CONFIG_MTD_NAND_JZ4740=y CONFIG_MTD_NAND_VERIFY_WRITE=y -CONFIG_MTD_UBI=y +CONFIG_MTD_NAND=y CONFIG_MTD_UBI_BEB_RESERVE=1 # CONFIG_MTD_UBI_DEBUG is not set # CONFIG_MTD_UBI_GLUEBI is not set CONFIG_MTD_UBI_WL_THRESHOLD=4096 +CONFIG_MTD_UBI=y # CONFIG_NETDEV_1000 is not set -# CONFIG_NETFILTER is not set -# CONFIG_NETWORK_FILESYSTEMS is not set # CONFIG_NET_ETHERNET is not set +# CONFIG_NETFILTER is not set # CONFIG_NET_SCHED is not set +# CONFIG_NETWORK_FILESYSTEMS is not set # CONFIG_NEW_LEDS is not set -CONFIG_NLS=y CONFIG_NLS_ASCII=y CONFIG_NLS_CODEPAGE_1250=y CONFIG_NLS_CODEPAGE_1251=y @@ -231,10 +230,10 @@ CONFIG_NLS_CODEPAGE_932=y CONFIG_NLS_CODEPAGE_936=y CONFIG_NLS_CODEPAGE_949=y CONFIG_NLS_CODEPAGE_950=y -CONFIG_NLS_ISO8859_1=y CONFIG_NLS_ISO8859_13=y CONFIG_NLS_ISO8859_14=y CONFIG_NLS_ISO8859_15=y +CONFIG_NLS_ISO8859_1=y CONFIG_NLS_ISO8859_2=y CONFIG_NLS_ISO8859_3=y CONFIG_NLS_ISO8859_4=y @@ -246,26 +245,27 @@ CONFIG_NLS_ISO8859_9=y CONFIG_NLS_KOI8_R=y CONFIG_NLS_KOI8_U=y CONFIG_NLS_UTF8=y +CONFIG_NLS=y # CONFIG_NO_IOPORT is not set # CONFIG_NXP_STB220 is not set # CONFIG_NXP_STB225 is not set # CONFIG_PACKET_MMAP is not set CONFIG_PAGEFLAGS_EXTENDED=y -CONFIG_PCSPKR_PLATFORM=y # CONFIG_PCI is not set +CONFIG_PCSPKR_PLATFORM=y # CONFIG_PDA_POWER is not set -CONFIG_PM=y # CONFIG_PMC_MSP is not set # CONFIG_PMC_YOSEMITE is not set # CONFIG_PM_DEBUG is not set # CONFIG_PM_RUNTIME is not set CONFIG_PM_SLEEP=y +CONFIG_PM=y # CONFIG_PNX8550_JBS is not set # CONFIG_PNX8550_STB810 is not set -CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set -CONFIG_PREEMPT=y +CONFIG_POWER_SUPPLY=y # CONFIG_PREEMPT_NONE is not set +CONFIG_PREEMPT=y CONFIG_PRINTK_TIME=y CONFIG_RELAY=y CONFIG_RTC_CLASS=y @@ -276,11 +276,11 @@ CONFIG_SCHED_OMIT_FRAME_POINTER=y # CONFIG_SDIO_UART is not set CONFIG_SECCOMP=y # CONFIG_SERIAL_8250_EXTENDED is not set -CONFIG_SERIO=y # CONFIG_SERIO_I8042 is not set CONFIG_SERIO_LIBPS2=y # CONFIG_SERIO_RAW is not set CONFIG_SERIO_SERPORT=y +CONFIG_SERIO=y # CONFIG_SGI_IP22 is not set # CONFIG_SGI_IP27 is not set # CONFIG_SGI_IP28 is not set @@ -293,39 +293,39 @@ CONFIG_SERIO_SERPORT=y # CONFIG_SIBYTE_RHONE is not set # CONFIG_SIBYTE_SENTOSA is not set # CONFIG_SIBYTE_SWARM is not set -CONFIG_SND=y # CONFIG_SND_DRIVERS is not set # CONFIG_SND_EMU10K1_SEQ is not set CONFIG_SND_JACK=y -CONFIG_SND_JZ4740_SOC=y CONFIG_SND_JZ4740_SOC_I2S=y # CONFIG_SND_JZ4740_SOC_QI_LB60 is not set +CONFIG_SND_JZ4740_SOC=y CONFIG_SND_MIXER_OSS=y # CONFIG_SND_OPL3_LIB_SEQ is not set # CONFIG_SND_OPL4_LIB_SEQ is not set -CONFIG_SND_PCM=y CONFIG_SND_PCM_OSS=y +CONFIG_SND_PCM=y # CONFIG_SND_RAWMIDI_SEQ is not set # CONFIG_SND_SBAWE_SEQ is not set -CONFIG_SND_SOC=y # CONFIG_SND_SOC_ALL_CODECS is not set CONFIG_SND_SOC_I2C_AND_SPI=y CONFIG_SND_SOC_JZCODEC=y +CONFIG_SND_SOC=y CONFIG_SND_TIMER=y # CONFIG_SND_VERBOSE_PROCFS is not set +CONFIG_SND=y CONFIG_SOC_JZ4740=y -CONFIG_SOUND=y -CONFIG_SOUND_OSS_CORE=y # CONFIG_SOUND_OSS_CORE_PRECLAIM is not set -CONFIG_SPI=y +CONFIG_SOUND_OSS_CORE=y +CONFIG_SOUND=y CONFIG_SPI_BITBANG=y CONFIG_SPI_GPIO=y CONFIG_SPI_MASTER=y # CONFIG_SPI_SPIDEV is not set +CONFIG_SPI=y # CONFIG_SQUASHFS is not set # CONFIG_STAGING is not set -CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y +CONFIG_SUSPEND=y # CONFIG_SYN_COOKIES is not set CONFIG_SYS_HAS_CPU_MIPS32_R1=y CONFIG_SYS_HAS_EARLY_PRINTK=y @@ -337,23 +337,21 @@ CONFIG_TCP_CONG_CUBIC=y CONFIG_TRAD_SIGNALS=y # CONFIG_TREE_PREEMPT_RCU is not set CONFIG_TREE_RCU=y -CONFIG_UBIFS_FS=y CONFIG_UBIFS_FS_ADVANCED_COMPR=y # CONFIG_UBIFS_FS_DEBUG is not set CONFIG_UBIFS_FS_LZO=y # CONFIG_UBIFS_FS_XATTR is not set +CONFIG_UBIFS_FS=y CONFIG_UBIFS_FS_ZLIB=y # CONFIG_USB_ARCH_HAS_EHCI is not set # CONFIG_USB_ARCH_HAS_HCD is not set # CONFIG_USB_ARCH_HAS_OHCI is not set # CONFIG_USB_AUDIO is not set # CONFIG_USB_CDC_COMPOSITE is not set -CONFIG_USB_ETH=y # CONFIG_USB_ETH_EEM is not set CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_ETH=y # CONFIG_USB_FILE_STORAGE is not set -CONFIG_USB_GADGET=y -# CONFIG_USB_GADGETFS is not set # CONFIG_USB_GADGET_AMD5536UDC is not set # CONFIG_USB_GADGET_AT91 is not set # CONFIG_USB_GADGET_ATMEL_USBA is not set @@ -362,6 +360,7 @@ CONFIG_USB_GADGET=y # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_DUALSPEED=y # CONFIG_USB_GADGET_DUMMY_HCD is not set +# CONFIG_USB_GADGETFS is not set # CONFIG_USB_GADGET_FSL_QE is not set # CONFIG_USB_GADGET_FSL_USB2 is not set # CONFIG_USB_GADGET_GOKU is not set @@ -380,6 +379,7 @@ CONFIG_USB_GADGET_JZ4740=y # CONFIG_USB_GADGET_S3C_HSOTG is not set CONFIG_USB_GADGET_SELECTED=y CONFIG_USB_GADGET_VBUS_DRAW=2 +CONFIG_USB_GADGET=y # CONFIG_USB_G_PRINTER is not set # CONFIG_USB_G_SERIAL is not set CONFIG_USB_JZ4740=y @@ -390,9 +390,9 @@ CONFIG_VFAT_FS=y # CONFIG_VGA_CONSOLE is not set # CONFIG_VLAN_8021Q is not set CONFIG_VM_EVENT_COUNTERS=y -CONFIG_VT=y CONFIG_VT_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_VT=y # CONFIG_WATCHDOG is not set # CONFIG_WLAN_80211 is not set CONFIG_ZONE_DMA_FLAG=0 From 0b86ea3caffc89673a65f6e355bc39b4ceba323b Mon Sep 17 00:00:00 2001 From: kaloz Date: Thu, 11 Feb 2010 09:33:16 +0000 Subject: [PATCH 17/44] clean up handling of some kernel symbols git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19581 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/adm5120/router_be/config-2.6.30 | 1 - target/linux/adm5120/router_be/config-2.6.31 | 1 - target/linux/adm5120/router_be/config-2.6.32 | 1 - target/linux/adm5120/router_le/config-2.6.30 | 1 - target/linux/adm5120/router_le/config-2.6.31 | 1 - target/linux/adm5120/router_le/config-2.6.32 | 1 - target/linux/ar7/config-2.6.30 | 1 - target/linux/ar7/config-2.6.32 | 1 - target/linux/ar71xx/config-2.6.32 | 1 - target/linux/atheros/config-2.6.30 | 1 - target/linux/atheros/config-2.6.31 | 1 - target/linux/atheros/config-2.6.32 | 1 - target/linux/brcm47xx/config-2.6.30 | 1 - target/linux/brcm47xx/config-2.6.31 | 1 - target/linux/brcm47xx/config-2.6.32 | 1 - target/linux/brcm63xx/config-2.6.30 | 1 - target/linux/cobalt/config-2.6.30 | 1 - target/linux/generic-2.6/config-2.6.25 | 7 ------- target/linux/generic-2.6/config-2.6.30 | 15 +++++++-------- target/linux/generic-2.6/config-2.6.31 | 13 +++++-------- target/linux/generic-2.6/config-2.6.32 | 13 +++++-------- target/linux/goldfish/config-2.6.30 | 1 - target/linux/iop32x/config-default | 1 - target/linux/ixp4xx/config-2.6.32 | 1 - target/linux/mpc52xx/config-2.6.30 | 4 ---- target/linux/mpc83xx/config-default | 3 --- target/linux/octeon/config-2.6.30 | 1 - target/linux/omap35xx/config-2.6.32 | 4 ---- target/linux/ppc40x/config-default | 3 --- target/linux/ppc44x/config-default | 3 --- target/linux/ps3/config-2.6.30 | 3 --- target/linux/pxa/config-default | 2 -- target/linux/pxcab/config-2.6.30 | 4 ---- target/linux/pxcab/config-2.6.31 | 4 ---- target/linux/ramips/rt288x/config-2.6.32 | 1 - target/linux/ramips/rt305x/config-2.6.32 | 1 - target/linux/rdc/config-2.6.30 | 6 ------ target/linux/s3c24xx/config-2.6.30 | 1 - target/linux/sibyte/config-default | 1 - target/linux/ubicom32/config-2.6.30 | 1 - target/linux/x86/config-2.6.30 | 6 ------ target/linux/x86/config-2.6.31 | 6 ------ target/linux/x86/olpc/config-2.6.30 | 5 ----- target/linux/x86/olpc/config-2.6.31 | 5 ----- target/linux/xburst/config-2.6.32 | 1 - 45 files changed, 17 insertions(+), 116 deletions(-) diff --git a/target/linux/adm5120/router_be/config-2.6.30 b/target/linux/adm5120/router_be/config-2.6.30 index 202c62f35..71703aacb 100644 --- a/target/linux/adm5120/router_be/config-2.6.30 +++ b/target/linux/adm5120/router_be/config-2.6.30 @@ -108,7 +108,6 @@ CONFIG_INOTIFY=y CONFIG_INPUT=m # CONFIG_INPUT_YEALINK is not set CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set CONFIG_LEDS_GPIO=m CONFIG_LEDS_TRIGGER_ADM5120_SWITCH=m CONFIG_LEGACY_PTY_COUNT=256 diff --git a/target/linux/adm5120/router_be/config-2.6.31 b/target/linux/adm5120/router_be/config-2.6.31 index 32a5533fb..3512a7890 100644 --- a/target/linux/adm5120/router_be/config-2.6.31 +++ b/target/linux/adm5120/router_be/config-2.6.31 @@ -110,7 +110,6 @@ CONFIG_INOTIFY=y CONFIG_INPUT=m # CONFIG_INPUT_YEALINK is not set CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set CONFIG_LEDS_GPIO=m CONFIG_LEDS_TRIGGER_ADM5120_SWITCH=m CONFIG_LEGACY_PTY_COUNT=256 diff --git a/target/linux/adm5120/router_be/config-2.6.32 b/target/linux/adm5120/router_be/config-2.6.32 index 2a5e407a3..13ecb910f 100644 --- a/target/linux/adm5120/router_be/config-2.6.32 +++ b/target/linux/adm5120/router_be/config-2.6.32 @@ -111,7 +111,6 @@ CONFIG_INOTIFY=y CONFIG_INPUT=m # CONFIG_INPUT_YEALINK is not set CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set CONFIG_LEDS_GPIO=m CONFIG_LEDS_TRIGGER_ADM5120_SWITCH=m CONFIG_LEGACY_PTY_COUNT=256 diff --git a/target/linux/adm5120/router_le/config-2.6.30 b/target/linux/adm5120/router_le/config-2.6.30 index 6ecb26914..793f96173 100644 --- a/target/linux/adm5120/router_le/config-2.6.30 +++ b/target/linux/adm5120/router_le/config-2.6.30 @@ -144,7 +144,6 @@ CONFIG_INOTIFY=y CONFIG_INPUT=m # CONFIG_INPUT_YEALINK is not set CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set CONFIG_KEXEC=y CONFIG_LEDS_GPIO=m CONFIG_LEDS_TRIGGER_ADM5120_SWITCH=m diff --git a/target/linux/adm5120/router_le/config-2.6.31 b/target/linux/adm5120/router_le/config-2.6.31 index 8507c4814..05add1803 100644 --- a/target/linux/adm5120/router_le/config-2.6.31 +++ b/target/linux/adm5120/router_le/config-2.6.31 @@ -146,7 +146,6 @@ CONFIG_INOTIFY=y CONFIG_INPUT=m # CONFIG_INPUT_YEALINK is not set CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set CONFIG_KEXEC=y CONFIG_LEDS_GPIO=m CONFIG_LEDS_TRIGGER_ADM5120_SWITCH=m diff --git a/target/linux/adm5120/router_le/config-2.6.32 b/target/linux/adm5120/router_le/config-2.6.32 index 18b54db4f..886b149c9 100644 --- a/target/linux/adm5120/router_le/config-2.6.32 +++ b/target/linux/adm5120/router_le/config-2.6.32 @@ -147,7 +147,6 @@ CONFIG_INOTIFY=y CONFIG_INPUT=m # CONFIG_INPUT_YEALINK is not set CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set CONFIG_KEXEC=y CONFIG_LEDS_GPIO=m CONFIG_LEDS_TRIGGER_ADM5120_SWITCH=m diff --git a/target/linux/ar7/config-2.6.30 b/target/linux/ar7/config-2.6.30 index f10105592..e407e85e7 100644 --- a/target/linux/ar7/config-2.6.30 +++ b/target/linux/ar7/config-2.6.30 @@ -78,7 +78,6 @@ CONFIG_HAVE_OPROFILE=y CONFIG_HW_RANDOM=y CONFIG_INITRAMFS_SOURCE="" CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set CONFIG_KALLSYMS=y CONFIG_LEDS_GPIO=y # CONFIG_LEMOTE_FULONG is not set diff --git a/target/linux/ar7/config-2.6.32 b/target/linux/ar7/config-2.6.32 index e1d56a119..72833a43b 100644 --- a/target/linux/ar7/config-2.6.32 +++ b/target/linux/ar7/config-2.6.32 @@ -79,7 +79,6 @@ CONFIG_HAVE_OPROFILE=y CONFIG_HW_RANDOM=y CONFIG_INITRAMFS_SOURCE="" CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set CONFIG_KALLSYMS=y CONFIG_LEDS_GPIO=y # CONFIG_MACH_ALCHEMY is not set diff --git a/target/linux/ar71xx/config-2.6.32 b/target/linux/ar71xx/config-2.6.32 index 95138c3b7..057e9e8ec 100644 --- a/target/linux/ar71xx/config-2.6.32 +++ b/target/linux/ar71xx/config-2.6.32 @@ -130,7 +130,6 @@ CONFIG_INITRAMFS_ROOT_GID=0 CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_SOURCE="../../root" CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set # CONFIG_LEDS_GPIO is not set # CONFIG_LEDS_WNDR3700_USB is not set # CONFIG_M25PXX_USE_FAST_READ is not set diff --git a/target/linux/atheros/config-2.6.30 b/target/linux/atheros/config-2.6.30 index bc5d78928..d962a539b 100644 --- a/target/linux/atheros/config-2.6.30 +++ b/target/linux/atheros/config-2.6.30 @@ -83,7 +83,6 @@ CONFIG_HW_RANDOM=y CONFIG_INITRAMFS_SOURCE="" CONFIG_IP175C_PHY=y CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set # CONFIG_LEDS_GPIO is not set # CONFIG_LEMOTE_FULONG is not set # CONFIG_MACH_ALCHEMY is not set diff --git a/target/linux/atheros/config-2.6.31 b/target/linux/atheros/config-2.6.31 index 9b8b239a1..9b8642548 100644 --- a/target/linux/atheros/config-2.6.31 +++ b/target/linux/atheros/config-2.6.31 @@ -88,7 +88,6 @@ CONFIG_HW_RANDOM=y CONFIG_INITRAMFS_SOURCE="" CONFIG_IP175C_PHY=y CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set # CONFIG_LEDS_GPIO is not set # CONFIG_LEMOTE_FULONG is not set CONFIG_MAC80211_DEFAULT_PS_VALUE=0 diff --git a/target/linux/atheros/config-2.6.32 b/target/linux/atheros/config-2.6.32 index a397b9071..5b56d47de 100644 --- a/target/linux/atheros/config-2.6.32 +++ b/target/linux/atheros/config-2.6.32 @@ -85,7 +85,6 @@ CONFIG_HW_RANDOM=y CONFIG_INITRAMFS_SOURCE="" CONFIG_IP175C_PHY=y CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set # CONFIG_LEDS_GPIO is not set # CONFIG_MACH_ALCHEMY is not set # CONFIG_MACH_DECSTATION is not set diff --git a/target/linux/brcm47xx/config-2.6.30 b/target/linux/brcm47xx/config-2.6.30 index 0c7a25f2d..33e2db027 100644 --- a/target/linux/brcm47xx/config-2.6.30 +++ b/target/linux/brcm47xx/config-2.6.30 @@ -91,7 +91,6 @@ CONFIG_HZ_250=y CONFIG_INITRAMFS_SOURCE="" # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set CONFIG_KALLSYMS=y CONFIG_LEDS_GPIO=y # CONFIG_LEMOTE_FULONG is not set diff --git a/target/linux/brcm47xx/config-2.6.31 b/target/linux/brcm47xx/config-2.6.31 index 5f3754d9e..ee0135a2e 100644 --- a/target/linux/brcm47xx/config-2.6.31 +++ b/target/linux/brcm47xx/config-2.6.31 @@ -91,7 +91,6 @@ CONFIG_HZ_250=y CONFIG_INITRAMFS_SOURCE="" # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set CONFIG_KALLSYMS=y CONFIG_LEDS_GPIO=y # CONFIG_LEMOTE_FULONG is not set diff --git a/target/linux/brcm47xx/config-2.6.32 b/target/linux/brcm47xx/config-2.6.32 index 88d144c9b..a5ea2931f 100644 --- a/target/linux/brcm47xx/config-2.6.32 +++ b/target/linux/brcm47xx/config-2.6.32 @@ -99,7 +99,6 @@ CONFIG_HZ_250=y CONFIG_INITRAMFS_SOURCE="" # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set CONFIG_KALLSYMS=y CONFIG_LEDS_GPIO=y # CONFIG_LEMOTE_FULONG is not set diff --git a/target/linux/brcm63xx/config-2.6.30 b/target/linux/brcm63xx/config-2.6.30 index 2c78dcd9d..853a30f70 100644 --- a/target/linux/brcm63xx/config-2.6.30 +++ b/target/linux/brcm63xx/config-2.6.30 @@ -110,7 +110,6 @@ CONFIG_INOTIFY=y CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set CONFIG_KEXEC=y CONFIG_LBD=y CONFIG_LEDS_GPIO=y diff --git a/target/linux/cobalt/config-2.6.30 b/target/linux/cobalt/config-2.6.30 index b0ecd1405..bf150e816 100644 --- a/target/linux/cobalt/config-2.6.30 +++ b/target/linux/cobalt/config-2.6.30 @@ -116,7 +116,6 @@ CONFIG_INPUT=y # CONFIG_IP_MULTICAST is not set CONFIG_IRQ_CPU=y CONFIG_IRQ_GT641XX=y -# CONFIG_ISDN is not set # CONFIG_JFFS2_FS is not set CONFIG_KEXEC=y CONFIG_LEDS_COBALT_QUBE=y diff --git a/target/linux/generic-2.6/config-2.6.25 b/target/linux/generic-2.6/config-2.6.25 index ba93a3267..b544fe448 100644 --- a/target/linux/generic-2.6/config-2.6.25 +++ b/target/linux/generic-2.6/config-2.6.25 @@ -723,13 +723,6 @@ CONFIG_IPW2200_MONITOR=y # CONFIG_IPX is not set # CONFIG_IRDA is not set # CONFIG_ISCSI_TCP is not set -# CONFIG_ISDN_CAPI_CAPI20 is not set -CONFIG_ISDN_CAPI_CAPIFS_BOOL=y -# CONFIG_ISDN_CAPI_CAPIFS is not set -# CONFIG_ISDN_CAPI is not set -CONFIG_ISDN_CAPI_MIDDLEWARE=y -# CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON is not set -# CONFIG_ISDN_I4L is not set # CONFIG_ISDN is not set # CONFIG_ISO9660_FS is not set # CONFIG_IXGB is not set diff --git a/target/linux/generic-2.6/config-2.6.30 b/target/linux/generic-2.6/config-2.6.30 index bb604056f..9130ce6a5 100644 --- a/target/linux/generic-2.6/config-2.6.30 +++ b/target/linux/generic-2.6/config-2.6.30 @@ -13,6 +13,7 @@ # CONFIG_AFFS_FS is not set # CONFIG_AF_RXRPC is not set # CONFIG_AFS_FS is not set +# CONFIG_AGP is not set CONFIG_AIO=y # CONFIG_AIRO_CS is not set # CONFIG_AIRO is not set @@ -450,6 +451,7 @@ CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" # CONFIG_E1000 is not set # CONFIG_E100 is not set # CONFIG_ECONET is not set +# CONFIG_EDAC is not set # CONFIG_EEPRO100 is not set # CONFIG_EEPROM_93CX6 is not set # CONFIG_EEPROM_AT24 is not set @@ -960,14 +962,7 @@ CONFIG_IPW2200_MONITOR=y # CONFIG_IRDA is not set # CONFIG_IRQSOFF_TRACER is not set # CONFIG_ISCSI_TCP is not set -# CONFIG_ISDN_CAPI_CAPI20 is not set -CONFIG_ISDN_CAPI_CAPIFS_BOOL=y -# CONFIG_ISDN_CAPI_CAPIFS is not set -# CONFIG_ISDN_CAPI is not set -CONFIG_ISDN_CAPI_MIDDLEWARE=y -# CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON is not set -# CONFIG_ISDN_I4L is not set -CONFIG_ISDN=y +# CONFIG_ISDN is not set # CONFIG_ISL29003 is not set # CONFIG_ISO9660_FS is not set # CONFIG_IWL3945 is not set @@ -1005,6 +1000,9 @@ CONFIG_JOLIET=y # CONFIG_KALLSYMS_EXTRA_PASS is not set # CONFIG_KALLSYMS is not set # CONFIG_KARMA_PARTITION is not set +# CONFIG_KERNEL_BZIP2 is not set +# CONFIG_KERNEL_GZIP is not set +CONFIG_KERNEL_LZMA=y # CONFIG_KEXEC is not set # CONFIG_KEYS is not set # CONFIG_KMEMTRACE is not set @@ -1065,6 +1063,7 @@ CONFIG_LOG_BUF_SHIFT=14 # CONFIG_LXT_PHY is not set # CONFIG_MAC80211 is not set # CONFIG_MAC_EMUMOUSEBTN is not set +# CONFIG_MACINTOSH_DRIVERS is not set # CONFIG_MAC_PARTITION is not set # CONFIG_MACVLAN is not set # CONFIG_MAGIC_SYSRQ is not set diff --git a/target/linux/generic-2.6/config-2.6.31 b/target/linux/generic-2.6/config-2.6.31 index 04eecf479..0d75a4673 100644 --- a/target/linux/generic-2.6/config-2.6.31 +++ b/target/linux/generic-2.6/config-2.6.31 @@ -14,6 +14,7 @@ # CONFIG_AFFS_FS is not set # CONFIG_AF_RXRPC is not set # CONFIG_AFS_FS is not set +# CONFIG_AGP is not set CONFIG_AIO=y # CONFIG_AIRO_CS is not set # CONFIG_AIRO is not set @@ -470,6 +471,7 @@ CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" # CONFIG_E100 is not set # CONFIG_ECHO is not set # CONFIG_ECONET is not set +# CONFIG_EDAC is not set # CONFIG_EEPRO100 is not set # CONFIG_EEPROM_93CX6 is not set # CONFIG_EEPROM_AT24 is not set @@ -989,14 +991,7 @@ CONFIG_IPW2200_MONITOR=y # CONFIG_IRDA is not set # CONFIG_IRQSOFF_TRACER is not set # CONFIG_ISCSI_TCP is not set -# CONFIG_ISDN_CAPI_CAPI20 is not set -CONFIG_ISDN_CAPI_CAPIFS_BOOL=y -# CONFIG_ISDN_CAPI_CAPIFS is not set -# CONFIG_ISDN_CAPI is not set -CONFIG_ISDN_CAPI_MIDDLEWARE=y -# CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON is not set -# CONFIG_ISDN_I4L is not set -CONFIG_ISDN=y +# CONFIG_ISDN is not set # CONFIG_ISL29003 is not set # CONFIG_ISO9660_FS is not set # CONFIG_IWL3945 is not set @@ -1034,6 +1029,7 @@ CONFIG_JOLIET=y # CONFIG_KALLSYMS_EXTRA_PASS is not set # CONFIG_KALLSYMS is not set # CONFIG_KARMA_PARTITION is not set +# CONFIG_KERNEL_BZIP2 is not set # CONFIG_KERNEL_GZIP is not set CONFIG_KERNEL_LZMA=y # CONFIG_KERNEL_LZO is not set @@ -1104,6 +1100,7 @@ CONFIG_MAC80211_DEFAULT_PS_VALUE=1 CONFIG_MAC80211_DEFAULT_PS=y # CONFIG_MAC80211 is not set # CONFIG_MAC_EMUMOUSEBTN is not set +# CONFIG_MACINTOSH_DRIVERS is not set # CONFIG_MAC_PARTITION is not set # CONFIG_MACVLAN is not set # CONFIG_MAGIC_SYSRQ is not set diff --git a/target/linux/generic-2.6/config-2.6.32 b/target/linux/generic-2.6/config-2.6.32 index 834f5c133..e6d3c5e70 100644 --- a/target/linux/generic-2.6/config-2.6.32 +++ b/target/linux/generic-2.6/config-2.6.32 @@ -13,6 +13,7 @@ # CONFIG_AFFS_FS is not set # CONFIG_AF_RXRPC is not set # CONFIG_AFS_FS is not set +# CONFIG_AGP is not set CONFIG_AIO=y # CONFIG_AIRO_CS is not set # CONFIG_AIRO is not set @@ -480,6 +481,7 @@ CONFIG_DEVTMPFS=y # CONFIG_E100 is not set # CONFIG_ECHO is not set # CONFIG_ECONET is not set +# CONFIG_EDAC is not set # CONFIG_EEPRO100 is not set # CONFIG_EEPROM_93CX6 is not set # CONFIG_EEPROM_AT24 is not set @@ -1008,14 +1010,7 @@ CONFIG_IPW2200_MONITOR=y # CONFIG_IRDA is not set # CONFIG_IRQSOFF_TRACER is not set # CONFIG_ISCSI_TCP is not set -# CONFIG_ISDN_CAPI_CAPI20 is not set -CONFIG_ISDN_CAPI_CAPIFS_BOOL=y -# CONFIG_ISDN_CAPI_CAPIFS is not set -# CONFIG_ISDN_CAPI is not set -CONFIG_ISDN_CAPI_MIDDLEWARE=y -# CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON is not set -# CONFIG_ISDN_I4L is not set -CONFIG_ISDN=y +# CONFIG_ISDN is not set # CONFIG_ISL29003 is not set # CONFIG_ISO9660_FS is not set # CONFIG_IWL3945 is not set @@ -1053,6 +1048,7 @@ CONFIG_JOLIET=y # CONFIG_KALLSYMS_EXTRA_PASS is not set # CONFIG_KALLSYMS is not set # CONFIG_KARMA_PARTITION is not set +# CONFIG_KERNEL_BZIP2 is not set # CONFIG_KERNEL_GZIP is not set CONFIG_KERNEL_LZMA=y # CONFIG_KERNEL_LZO is not set @@ -1125,6 +1121,7 @@ CONFIG_MAC80211_DEFAULT_PS_VALUE=1 CONFIG_MAC80211_DEFAULT_PS=y # CONFIG_MAC80211 is not set # CONFIG_MAC_EMUMOUSEBTN is not set +# CONFIG_MACINTOSH_DRIVERS is not set # CONFIG_MAC_PARTITION is not set # CONFIG_MACVLAN is not set # CONFIG_MAGIC_SYSRQ is not set diff --git a/target/linux/goldfish/config-2.6.30 b/target/linux/goldfish/config-2.6.30 index 41577f102..80780934a 100644 --- a/target/linux/goldfish/config-2.6.30 +++ b/target/linux/goldfish/config-2.6.30 @@ -127,7 +127,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_MOUSEDEV=y CONFIG_INPUT_TOUCHSCREEN=y CONFIG_INPUT=y -# CONFIG_ISDN is not set # CONFIG_JFFS2_CMODE_PRIORITY is not set CONFIG_JFFS2_CMODE_SIZE=y # CONFIG_KEYBOARD_ATKBD is not set diff --git a/target/linux/iop32x/config-default b/target/linux/iop32x/config-default index 8f6b9e1a1..d3dfe83be 100644 --- a/target/linux/iop32x/config-default +++ b/target/linux/iop32x/config-default @@ -81,7 +81,6 @@ CONFIG_INTEL_IOP_ADMA=y CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y # CONFIG_IWMMXT is not set -# CONFIG_KERNEL_BZIP2 is not set # CONFIG_LEDS_GPIO is not set CONFIG_LEGACY_PTY_COUNT=256 CONFIG_LEGACY_PTYS=y diff --git a/target/linux/ixp4xx/config-2.6.32 b/target/linux/ixp4xx/config-2.6.32 index db9d9f88c..ace714862 100644 --- a/target/linux/ixp4xx/config-2.6.32 +++ b/target/linux/ixp4xx/config-2.6.32 @@ -81,7 +81,6 @@ CONFIG_I2C=y CONFIG_INITRAMFS_SOURCE="" CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y -# CONFIG_ISDN is not set # CONFIG_IWMMXT is not set CONFIG_IXP4XX_ETH=y # CONFIG_IXP4XX_INDIRECT_PCI is not set diff --git a/target/linux/mpc52xx/config-2.6.30 b/target/linux/mpc52xx/config-2.6.30 index 9e5b9c20b..5c8602fbc 100644 --- a/target/linux/mpc52xx/config-2.6.30 +++ b/target/linux/mpc52xx/config-2.6.30 @@ -2,7 +2,6 @@ # CONFIG_44x is not set CONFIG_6xx=y # CONFIG_ADVANCED_OPTIONS is not set -# CONFIG_AGP is not set # CONFIG_ALTIVEC is not set # CONFIG_AMIGAONE is not set CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y @@ -55,7 +54,6 @@ CONFIG_DNOTIFY=y CONFIG_DTC=y # CONFIG_E200 is not set CONFIG_EARLY_PRINTK=y -# CONFIG_EDAC is not set CONFIG_ELF_CORE=y # CONFIG_EMBEDDED6xx is not set CONFIG_ENABLE_MUST_CHECK=y @@ -130,13 +128,11 @@ CONFIG_IP_PNP=y CONFIG_IRQ_PER_CPU=y # CONFIG_IRQSTACKS is not set CONFIG_ISA_DMA_API=y -# CONFIG_ISDN is not set CONFIG_KERNEL_START=0xc0000000 CONFIG_LEGACY_PTY_COUNT=256 CONFIG_LEGACY_PTYS=y CONFIG_LOWMEM_SIZE=0x30000000 CONFIG_LXT_PHY=y -# CONFIG_MACINTOSH_DRIVERS is not set CONFIG_MIGRATION=y # CONFIG_MII is not set # CONFIG_MMIO_NVRAM is not set diff --git a/target/linux/mpc83xx/config-default b/target/linux/mpc83xx/config-default index ebb72ac4b..141966cac 100644 --- a/target/linux/mpc83xx/config-default +++ b/target/linux/mpc83xx/config-default @@ -3,7 +3,6 @@ CONFIG_6xx=y # CONFIG_8xxx_WDT is not set # CONFIG_ADVANCED_OPTIONS is not set -# CONFIG_AGP is not set # CONFIG_ALTIVEC is not set # CONFIG_AMIGAONE is not set CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y @@ -35,7 +34,6 @@ CONFIG_DEVPORT=y CONFIG_DTC=y # CONFIG_E200 is not set CONFIG_EARLY_PRINTK=y -# CONFIG_EDAC is not set # CONFIG_EMBEDDED6xx is not set CONFIG_EXTRA_TARGETS="uImage.fit.mpc8377_wlan" CONFIG_FORCE_MAX_ZONEORDER=11 @@ -101,7 +99,6 @@ CONFIG_KERNEL_START=0xc0000000 # CONFIG_LEDS_GPIO is not set CONFIG_LOWMEM_SIZE=0x30000000 CONFIG_MAC80211_DEFAULT_PS_VALUE=0 -# CONFIG_MACINTOSH_DRIVERS is not set # CONFIG_MMIO_NVRAM is not set # CONFIG_MPC5121_ADS is not set # CONFIG_MPC5121_GENERIC is not set diff --git a/target/linux/octeon/config-2.6.30 b/target/linux/octeon/config-2.6.30 index d6d296a93..d792624bb 100644 --- a/target/linux/octeon/config-2.6.30 +++ b/target/linux/octeon/config-2.6.30 @@ -150,7 +150,6 @@ CONFIG_INOTIFY=y CONFIG_IRQ_CPU_OCTEON=y CONFIG_IRQ_CPU=y CONFIG_IRQ_PER_CPU=y -# CONFIG_ISDN is not set # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS=y CONFIG_KEXEC=y diff --git a/target/linux/omap35xx/config-2.6.32 b/target/linux/omap35xx/config-2.6.32 index 2cac84672..4c17d9b40 100644 --- a/target/linux/omap35xx/config-2.6.32 +++ b/target/linux/omap35xx/config-2.6.32 @@ -583,7 +583,6 @@ CONFIG_IP_PNP=y # CONFIG_IPX is not set # CONFIG_IRDA is not set # CONFIG_ISCSI_TCP is not set -# CONFIG_ISDN is not set # CONFIG_ISO9660_FS is not set # CONFIG_ISP1301_OMAP is not set # CONFIG_JBD2_DEBUG is not set @@ -604,9 +603,6 @@ CONFIG_JFFS2_ZLIB=y # CONFIG_JFS_FS is not set # CONFIG_KALLSYMS is not set # CONFIG_KARMA_PARTITION is not set -# CONFIG_KERNEL_BZIP2 is not set -# CONFIG_KERNEL_GZIP is not set -CONFIG_KERNEL_LZMA=y # CONFIG_KERNEL_LZO is not set # CONFIG_KEXEC is not set CONFIG_KEYBOARD_ATKBD=y diff --git a/target/linux/ppc40x/config-default b/target/linux/ppc40x/config-default index a5a178b96..278387d27 100644 --- a/target/linux/ppc40x/config-default +++ b/target/linux/ppc40x/config-default @@ -7,7 +7,6 @@ CONFIG_4xx=y # CONFIG_6xx is not set # CONFIG_ACADIA is not set # CONFIG_ADVANCED_OPTIONS is not set -# CONFIG_AGP is not set CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y CONFIG_ARCH_HAS_ILOG2_U32=y @@ -41,7 +40,6 @@ CONFIG_DEVPORT=y CONFIG_DTC=y # CONFIG_E200 is not set CONFIG_EARLY_PRINTK=y -# CONFIG_EDAC is not set # CONFIG_EP405 is not set CONFIG_EXTRA_TARGETS="uImage" CONFIG_FORCE_MAX_ZONEORDER=11 @@ -106,7 +104,6 @@ CONFIG_KILAUEA=y # CONFIG_LEDS_GPIO is not set # CONFIG_LEDS_GPIO_OF is not set CONFIG_LOWMEM_SIZE=0x30000000 -# CONFIG_MACINTOSH_DRIVERS is not set CONFIG_MAGICBOX=y # CONFIG_MAKALU is not set # CONFIG_MATH_EMULATION is not set diff --git a/target/linux/ppc44x/config-default b/target/linux/ppc44x/config-default index bff935350..313fd3c7f 100644 --- a/target/linux/ppc44x/config-default +++ b/target/linux/ppc44x/config-default @@ -7,7 +7,6 @@ CONFIG_4xx=y # CONFIG_6xx is not set # CONFIG_8139TOO is not set # CONFIG_ADVANCED_OPTIONS is not set -# CONFIG_AGP is not set CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y # CONFIG_ARCHES is not set @@ -38,7 +37,6 @@ CONFIG_DEVPORT=y # CONFIG_E200 is not set CONFIG_EARLY_PRINTK=y # CONFIG_EBONY is not set -# CONFIG_EDAC is not set CONFIG_EXTRA_TARGETS="uImage" CONFIG_FORCE_MAX_ZONEORDER=11 # CONFIG_FSL_ULI1575 is not set @@ -100,7 +98,6 @@ CONFIG_KERNEL_START=0xc0000000 # CONFIG_LEDS_GPIO is not set # CONFIG_LEDS_GPIO_OF is not set CONFIG_LOWMEM_SIZE=0x30000000 -# CONFIG_MACINTOSH_DRIVERS is not set # CONFIG_MATH_EMULATION is not set # CONFIG_MMIO_NVRAM is not set # CONFIG_MPIC is not set diff --git a/target/linux/ps3/config-2.6.30 b/target/linux/ps3/config-2.6.30 index 565e807a7..333f4fd31 100644 --- a/target/linux/ps3/config-2.6.30 +++ b/target/linux/ps3/config-2.6.30 @@ -48,7 +48,6 @@ CONFIG_DNOTIFY=y CONFIG_DTC=y CONFIG_DUMMY_CONSOLE=y CONFIG_EARLY_PRINTK=y -# CONFIG_EDAC is not set CONFIG_ELF_CORE=y # CONFIG_ENABLE_WARN_DEPRECATED is not set CONFIG_EXT2_FS=y @@ -154,7 +153,6 @@ CONFIG_IOMMU_HELPER=y CONFIG_IRQ_PER_CPU=y # CONFIG_IRQSTACKS is not set CONFIG_ISA_DMA_API=y -# CONFIG_ISDN is not set CONFIG_ISO9660_FS=y CONFIG_JBD2=y CONFIG_JBD=y @@ -185,7 +183,6 @@ CONFIG_KEXEC=y CONFIG_LOCK_KERNEL=y CONFIG_LOG_BUF_SHIFT=15 # CONFIG_LOGO is not set -# CONFIG_MACINTOSH_DRIVERS is not set CONFIG_MEMORY_HOTPLUG_SPARSE=y CONFIG_MEMORY_HOTPLUG=y # CONFIG_MEMORY_HOTREMOVE is not set diff --git a/target/linux/pxa/config-default b/target/linux/pxa/config-default index b1c8ac671..9b351346c 100644 --- a/target/linux/pxa/config-default +++ b/target/linux/pxa/config-default @@ -76,9 +76,7 @@ CONFIG_I2C_PXA_SLAVE=y CONFIG_IDE=m CONFIG_INOTIFY_USER=y CONFIG_INOTIFY=y -# CONFIG_ISDN is not set CONFIG_IWMMXT=y -# CONFIG_KERNEL_BZIP2 is not set # CONFIG_LEDS_GPIO is not set CONFIG_MAC80211_DEFAULT_PS_VALUE=0 # CONFIG_MACH_ARMCORE is not set diff --git a/target/linux/pxcab/config-2.6.30 b/target/linux/pxcab/config-2.6.30 index 0be347861..7c28c27b3 100644 --- a/target/linux/pxcab/config-2.6.30 +++ b/target/linux/pxcab/config-2.6.30 @@ -1,5 +1,4 @@ CONFIG_64BIT=y -# CONFIG_AGP is not set CONFIG_ALTIVEC=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y @@ -104,7 +103,6 @@ CONFIG_DNOTIFY=y CONFIG_DTC=y CONFIG_DUMMY_CONSOLE=y CONFIG_EARLY_PRINTK=y -# CONFIG_EDAC is not set # CONFIG_EEH is not set CONFIG_ELF_CORE=y # CONFIG_ENABLE_WARN_DEPRECATED is not set @@ -220,7 +218,6 @@ CONFIG_IOMMU_HELPER=y CONFIG_IRQ_PER_CPU=y # CONFIG_IRQSTACKS is not set CONFIG_ISA_DMA_API=y -# CONFIG_ISDN is not set CONFIG_ISO9660_FS=y CONFIG_JBD2=y CONFIG_JBD=y @@ -256,7 +253,6 @@ CONFIG_LOCK_KERNEL=y CONFIG_LOG_BUF_SHIFT=15 # CONFIG_LOGO is not set # CONFIG_LPARCFG is not set -# CONFIG_MACINTOSH_DRIVERS is not set CONFIG_MEMORY_HOTPLUG_SPARSE=y CONFIG_MEMORY_HOTPLUG=y # CONFIG_MEMORY_HOTREMOVE is not set diff --git a/target/linux/pxcab/config-2.6.31 b/target/linux/pxcab/config-2.6.31 index cea1d3c83..147fd498f 100644 --- a/target/linux/pxcab/config-2.6.31 +++ b/target/linux/pxcab/config-2.6.31 @@ -1,5 +1,4 @@ CONFIG_64BIT=y -# CONFIG_AGP is not set CONFIG_ALTIVEC=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y @@ -105,7 +104,6 @@ CONFIG_DNOTIFY=y CONFIG_DTC=y CONFIG_DUMMY_CONSOLE=y CONFIG_EARLY_PRINTK=y -# CONFIG_EDAC is not set # CONFIG_EEH is not set CONFIG_ELF_CORE=y # CONFIG_ENABLE_WARN_DEPRECATED is not set @@ -234,7 +232,6 @@ CONFIG_IOMMU_HELPER=y CONFIG_IRQ_PER_CPU=y # CONFIG_IRQSTACKS is not set CONFIG_ISA_DMA_API=y -# CONFIG_ISDN is not set CONFIG_ISO9660_FS=y CONFIG_JBD2=y CONFIG_JBD=y @@ -271,7 +268,6 @@ CONFIG_LOCK_KERNEL=y CONFIG_LOG_BUF_SHIFT=15 # CONFIG_LOGO is not set # CONFIG_LPARCFG is not set -# CONFIG_MACINTOSH_DRIVERS is not set # CONFIG_MEDIA_SUPPORT is not set CONFIG_MEMORY_HOTPLUG_SPARSE=y CONFIG_MEMORY_HOTPLUG=y diff --git a/target/linux/ramips/rt288x/config-2.6.32 b/target/linux/ramips/rt288x/config-2.6.32 index 840231b98..2be3b0d3b 100644 --- a/target/linux/ramips/rt288x/config-2.6.32 +++ b/target/linux/ramips/rt288x/config-2.6.32 @@ -80,7 +80,6 @@ CONFIG_HW_HAS_PCI=y CONFIG_HW_RANDOM=m CONFIG_INITRAMFS_SOURCE="" CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set # CONFIG_LEDS_GPIO is not set # CONFIG_MACH_ALCHEMY is not set # CONFIG_MACH_DECSTATION is not set diff --git a/target/linux/ramips/rt305x/config-2.6.32 b/target/linux/ramips/rt305x/config-2.6.32 index 13c449cf4..db1c3a4e2 100644 --- a/target/linux/ramips/rt305x/config-2.6.32 +++ b/target/linux/ramips/rt305x/config-2.6.32 @@ -78,7 +78,6 @@ CONFIG_HAVE_OPROFILE=y CONFIG_HW_RANDOM=m CONFIG_INITRAMFS_SOURCE="" CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set # CONFIG_LEDS_GPIO is not set # CONFIG_MACH_ALCHEMY is not set # CONFIG_MACH_DECSTATION is not set diff --git a/target/linux/rdc/config-2.6.30 b/target/linux/rdc/config-2.6.30 index f34da7bfe..df7ecef0d 100644 --- a/target/linux/rdc/config-2.6.30 +++ b/target/linux/rdc/config-2.6.30 @@ -3,7 +3,6 @@ # CONFIG_64BIT is not set # CONFIG_ACQUIRE_WDT is not set # CONFIG_ADVANTECH_WDT is not set -# CONFIG_AGP is not set # CONFIG_ALIM1535_WDT is not set CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig" CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y @@ -59,7 +58,6 @@ CONFIG_DEVPORT=y # CONFIG_DMI is not set CONFIG_DOUBLEFAULT=y # CONFIG_EARLY_PRINTK is not set -# CONFIG_EDAC is not set # CONFIG_EDD is not set # CONFIG_EUROTECH_WDT is not set CONFIG_FAST_CMPXCHG_LOCAL=y @@ -150,9 +148,6 @@ CONFIG_ISA_DMA_API=y # CONFIG_IT87_WDT is not set # CONFIG_ITCO_WDT is not set # CONFIG_JFFS2_SUMMARY is not set -# CONFIG_KERNEL_BZIP2 is not set -# CONFIG_KERNEL_GZIP is not set -CONFIG_KERNEL_LZMA=y CONFIG_KTIME_SCALAR=y CONFIG_LBD=y # CONFIG_LEDS_ALIX2 is not set @@ -167,7 +162,6 @@ CONFIG_M486=y # CONFIG_M586TSC is not set # CONFIG_M686 is not set # CONFIG_MACHZ_WDT is not set -# CONFIG_MACINTOSH_DRIVERS is not set CONFIG_MATH_EMULATION=y # CONFIG_MCA is not set # CONFIG_MCORE2 is not set diff --git a/target/linux/s3c24xx/config-2.6.30 b/target/linux/s3c24xx/config-2.6.30 index 94441063b..30cb86d14 100644 --- a/target/linux/s3c24xx/config-2.6.30 +++ b/target/linux/s3c24xx/config-2.6.30 @@ -179,7 +179,6 @@ CONFIG_INPUT=y CONFIG_IP_PNP=y # CONFIG_IP_ROUTE_MULTIPATH is not set # CONFIG_IP_ROUTE_VERBOSE is not set -# CONFIG_ISDN is not set # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set CONFIG_KALLSYMS=y # CONFIG_KEYBOARD_ATKBD is not set diff --git a/target/linux/sibyte/config-default b/target/linux/sibyte/config-default index a597d50c6..7d572d958 100644 --- a/target/linux/sibyte/config-default +++ b/target/linux/sibyte/config-default @@ -101,7 +101,6 @@ CONFIG_INITRAMFS_SOURCE="../../root" CONFIG_INPUT=m # CONFIG_IP_ROUTE_VERBOSE is not set CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set # CONFIG_ISI is not set # CONFIG_LEMOTE_FULONG is not set CONFIG_LOG_BUF_SHIFT=15 diff --git a/target/linux/ubicom32/config-2.6.30 b/target/linux/ubicom32/config-2.6.30 index e6367fbdc..47cb52995 100755 --- a/target/linux/ubicom32/config-2.6.30 +++ b/target/linux/ubicom32/config-2.6.30 @@ -92,7 +92,6 @@ CONFIG_IP7160RGW=y # CONFIG_IP7500WSPKR is not set CONFIG_IRQ_PER_CPU=y # CONFIG_IRQSTACKS is not set -# CONFIG_ISDN is not set # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set # CONFIG_JFFS2_SUMMARY is not set CONFIG_LDM_DEBUG=y diff --git a/target/linux/x86/config-2.6.30 b/target/linux/x86/config-2.6.30 index 5b2f1e64b..e5b324382 100644 --- a/target/linux/x86/config-2.6.30 +++ b/target/linux/x86/config-2.6.30 @@ -5,7 +5,6 @@ CONFIG_4KSTACKS=y # CONFIG_AC3200 is not set # CONFIG_ACQUIRE_WDT is not set # CONFIG_ADVANTECH_WDT is not set -# CONFIG_AGP is not set # CONFIG_ALIM1535_WDT is not set # CONFIG_APRICOT is not set CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig" @@ -83,7 +82,6 @@ CONFIG_DOUBLEFAULT=y CONFIG_DUMMY_CONSOLE=y # CONFIG_EARLY_PRINTK_DBGP is not set CONFIG_EARLY_PRINTK=y -# CONFIG_EDAC is not set # CONFIG_EDD is not set # CONFIG_EISA is not set # CONFIG_EL16 is not set @@ -195,9 +193,6 @@ CONFIG_ISA=y # CONFIG_IT87_WDT is not set # CONFIG_ITCO_WDT is not set CONFIG_KALLSYMS=y -# CONFIG_KERNEL_BZIP2 is not set -CONFIG_KERNEL_GZIP=y -# CONFIG_KERNEL_LZMA is not set CONFIG_KEXEC=y CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_LKKBD is not set @@ -216,7 +211,6 @@ CONFIG_M386=y # CONFIG_M586TSC is not set # CONFIG_M686 is not set # CONFIG_MACHZ_WDT is not set -# CONFIG_MACINTOSH_DRIVERS is not set CONFIG_MATH_EMULATION=y # CONFIG_MCA is not set # CONFIG_MCORE2 is not set diff --git a/target/linux/x86/config-2.6.31 b/target/linux/x86/config-2.6.31 index 31e015aee..4e655e525 100644 --- a/target/linux/x86/config-2.6.31 +++ b/target/linux/x86/config-2.6.31 @@ -25,7 +25,6 @@ CONFIG_ACPI_THERMAL=y CONFIG_ACPI=y # CONFIG_ACQUIRE_WDT is not set # CONFIG_ADVANTECH_WDT is not set -# CONFIG_AGP is not set # CONFIG_ALIM1535_WDT is not set # CONFIG_APRICOT is not set CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig" @@ -106,7 +105,6 @@ CONFIG_DOUBLEFAULT=y CONFIG_DUMMY_CONSOLE=y # CONFIG_EARLY_PRINTK_DBGP is not set CONFIG_EARLY_PRINTK=y -# CONFIG_EDAC is not set # CONFIG_EDD is not set # CONFIG_EEEPC_LAPTOP is not set # CONFIG_EFI is not set @@ -229,9 +227,6 @@ CONFIG_ISA=y # CONFIG_IT87_WDT is not set # CONFIG_ITCO_WDT is not set CONFIG_KALLSYMS=y -# CONFIG_KERNEL_BZIP2 is not set -CONFIG_KERNEL_GZIP=y -# CONFIG_KERNEL_LZMA is not set CONFIG_KEXEC=y CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_LKKBD is not set @@ -251,7 +246,6 @@ CONFIG_M386=y # CONFIG_M686 is not set CONFIG_MAC80211_DEFAULT_PS_VALUE=0 # CONFIG_MACHZ_WDT is not set -# CONFIG_MACINTOSH_DRIVERS is not set CONFIG_MATH_EMULATION=y # CONFIG_MCA is not set # CONFIG_MCORE2 is not set diff --git a/target/linux/x86/olpc/config-2.6.30 b/target/linux/x86/olpc/config-2.6.30 index 808d8ee7b..5926dbe07 100644 --- a/target/linux/x86/olpc/config-2.6.30 +++ b/target/linux/x86/olpc/config-2.6.30 @@ -22,7 +22,6 @@ CONFIG_ACPI_THERMAL=y # CONFIG_ACPI_TOSHIBA is not set # CONFIG_ACPI_WMI is not set CONFIG_ACPI=y -# CONFIG_AGP is not set # CONFIG_APM is not set CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig" CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y @@ -146,7 +145,6 @@ CONFIG_DOUBLEFAULT=y CONFIG_DUMMY_CONSOLE=y # CONFIG_EARLY_PRINTK_DBGP is not set CONFIG_EARLY_PRINTK=y -# CONFIG_EDAC is not set # CONFIG_EDD is not set # CONFIG_EEEPC_LAPTOP is not set # CONFIG_EFI is not set @@ -268,10 +266,8 @@ CONFIG_IO_DELAY_TYPE_UDELAY=2 CONFIG_ISA_DMA_API=y # CONFIG_ISA is not set # CONFIG_ISCSI_IBFT_FIND is not set -# CONFIG_ISDN is not set # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS=y -# CONFIG_KERNEL_BZIP2 is not set CONFIG_KERNEL_GZIP=y # CONFIG_KERNEL_LZMA is not set # CONFIG_KEXEC_JUMP is not set @@ -297,7 +293,6 @@ CONFIG_LCD_CLASS_DEVICE=y # CONFIG_M586MMX is not set # CONFIG_M586TSC is not set # CONFIG_M686 is not set -# CONFIG_MACINTOSH_DRIVERS is not set CONFIG_MARKERS=y # CONFIG_MATH_EMULATION is not set # CONFIG_MCA is not set diff --git a/target/linux/x86/olpc/config-2.6.31 b/target/linux/x86/olpc/config-2.6.31 index 1da61fd9d..1144e9f28 100644 --- a/target/linux/x86/olpc/config-2.6.31 +++ b/target/linux/x86/olpc/config-2.6.31 @@ -22,7 +22,6 @@ CONFIG_ACPI_THERMAL=y # CONFIG_ACPI_TOSHIBA is not set # CONFIG_ACPI_WMI is not set CONFIG_ACPI=y -# CONFIG_AGP is not set # CONFIG_APM is not set CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig" CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y @@ -149,7 +148,6 @@ CONFIG_DOUBLEFAULT=y CONFIG_DUMMY_CONSOLE=y # CONFIG_EARLY_PRINTK_DBGP is not set CONFIG_EARLY_PRINTK=y -# CONFIG_EDAC is not set # CONFIG_EDD is not set # CONFIG_EFI is not set CONFIG_ELF_CORE=y @@ -280,10 +278,8 @@ CONFIG_IO_DELAY_TYPE_UDELAY=2 CONFIG_ISA_DMA_API=y # CONFIG_ISA is not set # CONFIG_ISCSI_IBFT_FIND is not set -# CONFIG_ISDN is not set # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS=y -# CONFIG_KERNEL_BZIP2 is not set CONFIG_KERNEL_GZIP=y # CONFIG_KERNEL_LZMA is not set # CONFIG_KEXEC_JUMP is not set @@ -310,7 +306,6 @@ CONFIG_LCD_CLASS_DEVICE=y # CONFIG_M586TSC is not set # CONFIG_M686 is not set CONFIG_MAC80211_DEFAULT_PS_VALUE=0 -# CONFIG_MACINTOSH_DRIVERS is not set CONFIG_MARKERS=y # CONFIG_MATH_EMULATION is not set # CONFIG_MCA is not set diff --git a/target/linux/xburst/config-2.6.32 b/target/linux/xburst/config-2.6.32 index 7f5ee8164..74df160e0 100644 --- a/target/linux/xburst/config-2.6.32 +++ b/target/linux/xburst/config-2.6.32 @@ -131,7 +131,6 @@ CONFIG_IP_PNP_DHCP=y # CONFIG_IP_PNP_RARP is not set CONFIG_IP_PNP=y CONFIG_IRQ_CPU=y -# CONFIG_ISDN is not set CONFIG_JBD=y CONFIG_JZ4740_ADC=y # CONFIG_JZ4740_N526 is not set From a1ab296cfb8f2646a94205a0b13f7142b652bb9b Mon Sep 17 00:00:00 2001 From: juhosg Date: Thu, 11 Feb 2010 13:07:10 +0000 Subject: [PATCH 18/44] sort Kconfig symbols automatically to make Kaloz happy :p git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19582 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- include/kernel-build.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/include/kernel-build.mk b/include/kernel-build.mk index 7c5d1fbe9..62140588d 100644 --- a/include/kernel-build.mk +++ b/include/kernel-build.mk @@ -106,6 +106,7 @@ define BuildKernel $(_SINGLE)$(MAKE) -C $(LINUX_DIR) $(KERNEL_MAKEOPTS) $$@ $(SCRIPT_DIR)/kconfig.pl '>' $(if $(LINUX_SUBCONFIG),'+' $(GENERIC_LINUX_CONFIG) $(LINUX_CONFIG),$(GENERIC_LINUX_CONFIG)) \ $(LINUX_DIR)/.config > $(if $(LINUX_SUBCONFIG),$(LINUX_SUBCONFIG),$(LINUX_CONFIG)) + LC_ALL='' sort $(if $(LINUX_SUBCONFIG),$(LINUX_SUBCONFIG),$(LINUX_CONFIG)) -o $(if $(LINUX_SUBCONFIG),$(LINUX_SUBCONFIG),$(LINUX_CONFIG)) $(Kernel/Configure) install: $(LINUX_DIR)/.image From 4036e30fb097e01c9a0dd672f15d0c8373905139 Mon Sep 17 00:00:00 2001 From: juhosg Date: Thu, 11 Feb 2010 13:31:40 +0000 Subject: [PATCH 19/44] kernel: 2.6.32: move discarding of SYMTAB entries to the right place. This helps to avoid linker errors on various targets. Also remove the scsi_sd section fix patch, because it is not needed now. git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19583 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../patches-2.6.32/028-module_exports.patch | 18 +++++++++++------- .../270-scci_sd_section_fix.patch | 11 ----------- 2 files changed, 11 insertions(+), 18 deletions(-) delete mode 100644 target/linux/generic-2.6/patches-2.6.32/270-scci_sd_section_fix.patch diff --git a/target/linux/generic-2.6/patches-2.6.32/028-module_exports.patch b/target/linux/generic-2.6/patches-2.6.32/028-module_exports.patch index b06939f48..5d86333c7 100644 --- a/target/linux/generic-2.6/patches-2.6.32/028-module_exports.patch +++ b/target/linux/generic-2.6/patches-2.6.32/028-module_exports.patch @@ -69,21 +69,25 @@ VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .; \ } \ \ -@@ -323,7 +344,13 @@ +@@ -323,7 +344,7 @@ \ /* Kernel symbol table: strings */ \ __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ - *(__ksymtab_strings) \ + SYMTAB_KEEP_STR \ -+ } \ -+ \ -+ /DISCARD/ : { \ -+ SYMTAB_DISCARD \ -+ SYMTAB_DISCARD_GPL \ -+ SYMTAB_DISCARD_STR \ } \ \ /* __*init sections */ \ +@@ -638,6 +659,9 @@ + EXIT_TEXT \ + EXIT_DATA \ + EXIT_CALL \ ++ SYMTAB_DISCARD \ ++ SYMTAB_DISCARD_GPL \ ++ SYMTAB_DISCARD_STR \ + *(.discard) \ + } + --- a/include/linux/module.h +++ b/include/linux/module.h @@ -192,16 +192,24 @@ void *__symbol_get_gpl(const char *symbo diff --git a/target/linux/generic-2.6/patches-2.6.32/270-scci_sd_section_fix.patch b/target/linux/generic-2.6/patches-2.6.32/270-scci_sd_section_fix.patch deleted file mode 100644 index 3389b4b8c..000000000 --- a/target/linux/generic-2.6/patches-2.6.32/270-scci_sd_section_fix.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/drivers/scsi/sd.c -+++ b/drivers/scsi/sd.c -@@ -2394,7 +2394,7 @@ err_out: - * - * Note: this function unregisters this driver from the scsi mid-level. - **/ --static void __exit exit_sd(void) -+static void exit_sd(void) - { - int i; - From 478a8c21733b91d4854a1f559664de1af62be533 Mon Sep 17 00:00:00 2001 From: juhosg Date: Thu, 11 Feb 2010 13:31:44 +0000 Subject: [PATCH 20/44] mpc83xx: fix device registration on the RB600 git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19584 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/mpc83xx/patches/001-rb600.patch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/target/linux/mpc83xx/patches/001-rb600.patch b/target/linux/mpc83xx/patches/001-rb600.patch index 98db9e226..1d2d1a909 100644 --- a/target/linux/mpc83xx/patches/001-rb600.patch +++ b/target/linux/mpc83xx/patches/001-rb600.patch @@ -329,7 +329,7 @@ + int node, size; + + fw_dtb = (const void *)r3; -+ ++ + /* Find the memory range. */ + node = fdt_node_offset_by_prop_value(fw_dtb, -1, "device_type", "memory", sizeof("memory")); + reg = fdt_getprop(fw_dtb, node, "reg", &size); @@ -704,7 +704,7 @@ + + return 0; +} -+device_initcall(rbppc_declare_of_platform_devices); ++machine_device_initcall(rb600, rbppc_declare_of_platform_devices); + +define_machine(rb600) { + .name = "MikroTik RouterBOARD 600 series", From 1519f71815e91ca11abe9a71712eca795b8fe2a3 Mon Sep 17 00:00:00 2001 From: juhosg Date: Thu, 11 Feb 2010 13:31:47 +0000 Subject: [PATCH 21/44] mpc83xx: sync kernel config git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19585 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/mpc83xx/config-default | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/target/linux/mpc83xx/config-default b/target/linux/mpc83xx/config-default index 141966cac..cabe25f2d 100644 --- a/target/linux/mpc83xx/config-default +++ b/target/linux/mpc83xx/config-default @@ -24,7 +24,6 @@ CONFIG_AUDIT_ARCH=y CONFIG_BITREVERSE=y # CONFIG_BOOTX_TEXT is not set CONFIG_BOUNCE=y -# CONFIG_BRIQ_PANEL is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE="console=ttyS0,115200" @@ -81,7 +80,6 @@ CONFIG_HAVE_LMB=y CONFIG_HAVE_OPROFILE=y CONFIG_HAVE_PERF_COUNTERS=y # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set -# CONFIG_HVC_RTAS is not set CONFIG_HW_RANDOM=y # CONFIG_HZ_100 is not set CONFIG_HZ=250 @@ -92,7 +90,6 @@ CONFIG_IPIC=y CONFIG_IRQ_PER_CPU=y # CONFIG_IRQSTACKS is not set CONFIG_ISA_DMA_API=y -# CONFIG_ISA is not set # CONFIG_JFFS2_FS is not set CONFIG_KERNEL_START=0xc0000000 # CONFIG_KMETER1 is not set @@ -112,8 +109,8 @@ CONFIG_MAC80211_DEFAULT_PS_VALUE=0 # CONFIG_MPC837x_MDS is not set CONFIG_MPC837x_RDB=y # CONFIG_MPC8xxx_GPIO is not set +# CONFIG_MPIC is not set # CONFIG_MPIC_WEIRD is not set -CONFIG_MPIC=y # CONFIG_MTD_NAND_FSL_ELBC is not set # CONFIG_MTD_NAND_FSL_UPM is not set CONFIG_MTD_NAND_RB_PPC=y @@ -134,7 +131,6 @@ CONFIG_PCI_DOMAINS=y CONFIG_PCIEAER=y # CONFIG_PCIE_ECRC is not set CONFIG_PCIEPORTBUS=y -CONFIG_PCSPKR_PLATFORM=y # CONFIG_PERF_COUNTERS is not set CONFIG_PHYLIB=y CONFIG_PHYSICAL_START=0x00000000 @@ -158,25 +154,23 @@ CONFIG_PPC_DISABLE_WERROR=y # CONFIG_PPC_EARLY_DEBUG is not set CONFIG_PPC_FPU=y CONFIG_PPC_HAVE_PMU_SUPPORT=y -CONFIG_PPC_I8259=y +# CONFIG_PPC_I8259 is not set # CONFIG_PPC_INDIRECT_IO is not set CONFIG_PPC_INDIRECT_PCI=y CONFIG_PPC_LIB_RHEAP=y # CONFIG_PPC_MM_SLICES is not set -CONFIG_PPC_MPC106=y +# CONFIG_PPC_MPC106 is not set # CONFIG_PPC_MPC52xx is not set CONFIG_PPC_MPC834x=y CONFIG_PPC_MPC837x=y -CONFIG_PPC_NATIVE=y CONFIG_PPC_OF_BOOT_TRAMPOLINE=y CONFIG_PPC_OF=y CONFIG_PPC_PCI_CHOICE=y # CONFIG_PPC_PMAC is not set -CONFIG_PPC_RTAS=y +# CONFIG_PPC_RTAS is not set CONFIG_PPC_STD_MMU_32=y CONFIG_PPC_STD_MMU=y CONFIG_PPC_UDBG_16550=y -CONFIG_PPC_WERROR=y CONFIG_PPC=y # CONFIG_PQ2ADS is not set CONFIG_PRINT_STACK_DEPTH=64 @@ -185,8 +179,6 @@ CONFIG_QE_GPIO=y CONFIG_QUICC_ENGINE=y CONFIG_RB_IOMAP=y CONFIG_RB_PPC=y -# CONFIG_RTAS_ERROR_LOGGING is not set -CONFIG_RTAS_PROC=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y # CONFIG_SATA_FSL is not set # CONFIG_SBC834x is not set @@ -204,8 +196,6 @@ CONFIG_SERIAL_OF_PLATFORM=y CONFIG_TASK_SIZE=0xc0000000 # CONFIG_TAU is not set # CONFIG_UCC_GETH is not set -# CONFIG_UDBG_RTAS_CONSOLE is not set -# CONFIG_WATCHDOG_RTAS is not set CONFIG_WORD_SIZE=32 # CONFIG_YAFFS_9BYTE_TAGS is not set # CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED is not set From 6bf7968462c3babdeb9e124c533b56cb0cd03a66 Mon Sep 17 00:00:00 2001 From: juhosg Date: Thu, 11 Feb 2010 13:31:49 +0000 Subject: [PATCH 22/44] mpc83xx: enable jffs2 git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19586 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/mpc83xx/config-default | 1 - 1 file changed, 1 deletion(-) diff --git a/target/linux/mpc83xx/config-default b/target/linux/mpc83xx/config-default index cabe25f2d..20413ec21 100644 --- a/target/linux/mpc83xx/config-default +++ b/target/linux/mpc83xx/config-default @@ -90,7 +90,6 @@ CONFIG_IPIC=y CONFIG_IRQ_PER_CPU=y # CONFIG_IRQSTACKS is not set CONFIG_ISA_DMA_API=y -# CONFIG_JFFS2_FS is not set CONFIG_KERNEL_START=0xc0000000 # CONFIG_KMETER1 is not set # CONFIG_LEDS_GPIO is not set From 3fc7a0bec9b6220b586248cb6c7e2d552b9c5464 Mon Sep 17 00:00:00 2001 From: juhosg Date: Thu, 11 Feb 2010 13:31:52 +0000 Subject: [PATCH 23/44] mpc83xx: add 2.6.32 support git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19587 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/mpc83xx/config-2.6.32 | 217 ++ .../mpc83xx/patches-2.6.32/001-rb600.patch | 1976 +++++++++++++++++ .../patches-2.6.32/002-powerpc_mkuboot.patch | 30 + .../003-powerpc_create_fit_uImages.patch | 94 + 4 files changed, 2317 insertions(+) create mode 100644 target/linux/mpc83xx/config-2.6.32 create mode 100644 target/linux/mpc83xx/patches-2.6.32/001-rb600.patch create mode 100644 target/linux/mpc83xx/patches-2.6.32/002-powerpc_mkuboot.patch create mode 100644 target/linux/mpc83xx/patches-2.6.32/003-powerpc_create_fit_uImages.patch diff --git a/target/linux/mpc83xx/config-2.6.32 b/target/linux/mpc83xx/config-2.6.32 new file mode 100644 index 000000000..9a30fe0e4 --- /dev/null +++ b/target/linux/mpc83xx/config-2.6.32 @@ -0,0 +1,217 @@ +# CONFIG_40x is not set +# CONFIG_44x is not set +CONFIG_6xx=y +# CONFIG_8xxx_WDT is not set +# CONFIG_ADVANCED_OPTIONS is not set +# CONFIG_ALTIVEC is not set +# CONFIG_AMIGAONE is not set +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y +CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y +CONFIG_ARCH_HAS_ILOG2_U32=y +CONFIG_ARCH_HAS_WALK_MEMORY=y +CONFIG_ARCH_MAY_HAVE_PC_FDC=y +# CONFIG_ARCH_NO_VIRT_TO_BUS is not set +# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set +CONFIG_ARCH_POPULATES_NODE_MAP=y +CONFIG_ARCH_REQUIRE_GPIOLIB=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_MSI=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y +# CONFIG_ASP834x is not set +CONFIG_ATA=y +CONFIG_AUDIT_ARCH=y +CONFIG_BITREVERSE=y +# CONFIG_BOOTX_TEXT is not set +CONFIG_BOUNCE=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_CFG80211_DEFAULT_PS_VALUE=0 +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE="console=ttyS0,115200" +CONFIG_DECOMPRESS_LZMA=y +CONFIG_DEFAULT_UIMAGE=y +CONFIG_DEVPORT=y +# CONFIG_DMA_API_DEBUG is not set +CONFIG_DTC=y +# CONFIG_E200 is not set +CONFIG_EARLY_PRINTK=y +# CONFIG_EMBEDDED6xx is not set +CONFIG_EXTRA_TARGETS="uImage.fit.mpc8377_wlan" +CONFIG_FORCE_MAX_ZONEORDER=11 +# CONFIG_FSL_EMB_PERFMON is not set +CONFIG_FSL_PCI=y +CONFIG_FSL_PQ_MDIO=y +CONFIG_FSL_SOC=y +# CONFIG_FSL_ULI1575 is not set +# CONFIG_FSNOTIFY is not set +CONFIG_GENERIC_ATOMIC64=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CMOS_UPDATE=y +CONFIG_GENERIC_FIND_LAST_BIT=y +CONFIG_GENERIC_FIND_NEXT_BIT=y +CONFIG_GENERIC_GPIO=y +CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y +# CONFIG_GENERIC_IOMAP is not set +CONFIG_GENERIC_ISA_DMA=y +CONFIG_GENERIC_NVRAM=y +# CONFIG_GENERIC_TBSYNC is not set +CONFIG_GENERIC_TIME_VSYSCALL=y +# CONFIG_GEN_RTC is not set +CONFIG_GIANFAR=y +CONFIG_GPIOLIB=y +CONFIG_HAS_DMA=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +# CONFIG_HAS_RAPIDIO is not set +CONFIG_HAVE_ARCH_KGDB=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_DMA_API_DEBUG=y +CONFIG_HAVE_DMA_ATTRS=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y +CONFIG_HAVE_FUNCTION_TRACER=y +# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set +CONFIG_HAVE_IDE=y +CONFIG_HAVE_IOREMAP_PROT=y +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_LATENCYTOP_SUPPORT=y +CONFIG_HAVE_LMB=y +CONFIG_HAVE_OPROFILE=y +CONFIG_HAVE_PERF_EVENTS=y +# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set +CONFIG_HW_RANDOM=y +# CONFIG_HZ_100 is not set +CONFIG_HZ=250 +CONFIG_HZ_250=y +CONFIG_INITRAMFS_SOURCE="" +# CONFIG_IOMMU_HELPER is not set +CONFIG_IPIC=y +CONFIG_IRQ_PER_CPU=y +# CONFIG_IRQSTACKS is not set +CONFIG_ISA_DMA_API=y +CONFIG_KERNEL_START=0xc0000000 +# CONFIG_KMETER1 is not set +# CONFIG_LEDS_GPIO is not set +CONFIG_LOWMEM_SIZE=0x30000000 +CONFIG_MAX_ACTIVE_REGIONS=32 +# CONFIG_MMIO_NVRAM is not set +# CONFIG_MPC5121_ADS is not set +# CONFIG_MPC5121_GENERIC is not set +# CONFIG_MPC831x_RDB is not set +# CONFIG_MPC832x_MDS is not set +# CONFIG_MPC832x_RDB is not set +# CONFIG_MPC834x_ITX is not set +# CONFIG_MPC834x_MDS is not set +# CONFIG_MPC836x_MDS is not set +# CONFIG_MPC836x_RDK is not set +# CONFIG_MPC837x_MDS is not set +CONFIG_MPC837x_RDB=y +# CONFIG_MPC8xxx_GPIO is not set +# CONFIG_MPIC is not set +# CONFIG_MPIC_WEIRD is not set +# CONFIG_MTD_NAND_FSL_ELBC is not set +# CONFIG_MTD_NAND_FSL_UPM is not set +CONFIG_MTD_NAND_RB_PPC=y +CONFIG_MTD_NAND=y +CONFIG_MTD_OF_PARTS=y +CONFIG_MTD_PHYSMAP_OF=y +# CONFIG_MV643XX_ETH is not set +# CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK is not set +CONFIG_OF_DEVICE=y +CONFIG_OF_GPIO=y +CONFIG_OF_MDIO=y +CONFIG_OF=y +CONFIG_PAGEFLAGS_EXTENDED=y +CONFIG_PAGE_OFFSET=0xc0000000 +CONFIG_PATA_RB_PPC=m +CONFIG_PCI_DISABLE_COMMON_QUIRKS=y +CONFIG_PCI_DOMAINS=y +# CONFIG_PCIEAER_INJECT is not set +CONFIG_PCIEAER=y +# CONFIG_PCIE_ECRC is not set +CONFIG_PCIEPORTBUS=y +# CONFIG_PERF_COUNTERS is not set +# CONFIG_PERF_EVENTS is not set +CONFIG_PHYLIB=y +CONFIG_PHYSICAL_START=0x00000000 +CONFIG_PPC32=y +# CONFIG_PPC64 is not set +# CONFIG_PPC_82xx is not set +CONFIG_PPC_83xx=y +# CONFIG_PPC_85xx is not set +# CONFIG_PPC_86xx is not set +# CONFIG_PPC_8xx is not set +# CONFIG_PPC_970_NAP is not set +CONFIG_PPC_BOOK3S_32=y +CONFIG_PPC_BOOK3S=y +# CONFIG_PPC_CELL is not set +# CONFIG_PPC_CELL_NATIVE is not set +# CONFIG_PPC_CHRP is not set +# CONFIG_PPC_CLOCK is not set +# CONFIG_PPC_DCR_MMIO is not set +# CONFIG_PPC_DCR_NATIVE is not set +CONFIG_PPC_DISABLE_WERROR=y +# CONFIG_PPC_EARLY_DEBUG is not set +CONFIG_PPC_FPU=y +CONFIG_PPC_HAVE_PMU_SUPPORT=y +# CONFIG_PPC_I8259 is not set +# CONFIG_PPC_INDIRECT_IO is not set +CONFIG_PPC_INDIRECT_PCI=y +CONFIG_PPC_LIB_RHEAP=y +# CONFIG_PPC_MM_SLICES is not set +# CONFIG_PPC_MPC106 is not set +# CONFIG_PPC_MPC52xx is not set +CONFIG_PPC_MPC834x=y +CONFIG_PPC_MPC837x=y +CONFIG_PPC_OF_BOOT_TRAMPOLINE=y +CONFIG_PPC_OF=y +CONFIG_PPC_PCI_CHOICE=y +# CONFIG_PPC_PMAC is not set +# CONFIG_PPC_RTAS is not set +CONFIG_PPC_STD_MMU_32=y +CONFIG_PPC_STD_MMU=y +CONFIG_PPC_UDBG_16550=y +CONFIG_PPC=y +# CONFIG_PQ2ADS is not set +CONFIG_PRINT_STACK_DEPTH=64 +CONFIG_PROC_DEVICETREE=y +CONFIG_QE_GPIO=y +CONFIG_QUICC_ENGINE=y +CONFIG_RB_IOMAP=y +CONFIG_RB_PPC=y +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +# CONFIG_SATA_FSL is not set +# CONFIG_SBC834x is not set +CONFIG_SCHED_HRTICK=y +CONFIG_SCHED_OMIT_FRAME_POINTER=y +CONFIG_SCSI=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +CONFIG_SERIAL_8250_EXTENDED=y +# CONFIG_SERIAL_8250_MANY_PORTS is not set +# CONFIG_SERIAL_8250_RSA is not set +CONFIG_SERIAL_8250_SHARE_IRQ=y +CONFIG_SERIAL_OF_PLATFORM=y +# CONFIG_SERIAL_QE is not set +# CONFIG_SWIOTLB is not set +CONFIG_TASK_SIZE=0xc0000000 +# CONFIG_TAU is not set +# CONFIG_TREE_PREEMPT_RCU is not set +CONFIG_TREE_RCU=y +# CONFIG_UCC_GETH is not set +CONFIG_WORD_SIZE=32 +# CONFIG_XILINX_EMACLITE is not set +# CONFIG_YAFFS_9BYTE_TAGS is not set +# CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED is not set +CONFIG_YAFFS_AUTO_YAFFS2=y +# CONFIG_YAFFS_DISABLE_LAZY_LOAD is not set +# CONFIG_YAFFS_DISABLE_WIDE_TNODES is not set +# CONFIG_YAFFS_DOES_ECC is not set +CONFIG_YAFFS_FS=y +CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y +CONFIG_YAFFS_YAFFS1=y +CONFIG_YAFFS_YAFFS2=y diff --git a/target/linux/mpc83xx/patches-2.6.32/001-rb600.patch b/target/linux/mpc83xx/patches-2.6.32/001-rb600.patch new file mode 100644 index 000000000..8e1a234c8 --- /dev/null +++ b/target/linux/mpc83xx/patches-2.6.32/001-rb600.patch @@ -0,0 +1,1976 @@ +--- /dev/null ++++ b/arch/powerpc/boot/dts/rb600.dts +@@ -0,0 +1,242 @@ ++/* ++ * RouterBOARD 600 series Device Tree Source ++ * ++ * Copyright 2009 Michael Guntsche ++ * ++ * 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. ++ */ ++ ++/dts-v1/; ++ ++/ { ++ model = "RB600"; ++ compatible = "MPC83xx"; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ++ aliases { ++ ethernet0 = &enet0; ++ ethernet1 = &enet1; ++ }; ++ ++ chosen { ++ linux,stdout-path = "/soc8343@e0000000/serial@4500"; ++ }; ++ ++ cpus { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ PowerPC,8343E@0 { ++ device_type = "cpu"; ++ reg = <0x0>; ++ d-cache-line-size = <0x20>; ++ i-cache-line-size = <0x20>; ++ d-cache-size = <0x8000>; ++ i-cache-size = <0x8000>; ++ timebase-frequency = <0x0000000>; // filled by the bootwrapper from the firmware blob ++ clock-frequency = <0x00000000>; // filled by the bootwrapper from the firmware blob ++ }; ++ }; ++ ++ memory { ++ device_type = "memory"; ++ reg = <0x0 0x0000000>; // filled by the bootwrapper from the firmware blob ++ }; ++ ++ cf@f9200000 { ++ lb-timings = <0x5dc 0x3e8 0x1194 0x5dc 0x2af8>; ++ interrupt-at-level = <0x0>; ++ interrupt-parent = <&ipic>; ++ interrupts = <0x16 0x8>; ++ lbc_extra_divider = <0x1>; ++ reg = <0xf9200000 0x200000>; ++ device_type = "rb,cf"; ++ }; ++ ++ cf@f9000000 { ++ lb-timings = <0x5dc 0x3e8 0x1194 0x5dc 0x2af8>; ++ interrupt-at-level = <0x0>; ++ interrupt-parent = <&ipic>; ++ interrupts = <0x14 0x8>; ++ lbc_extra_divider = <0x1>; ++ reg = <0xf9000000 0x200000>; ++ device_type = "rb,cf"; ++ }; ++ ++ flash { ++ reg = <0xff800000 0x20000>; ++ }; ++ ++ nnand { ++ reg = <0xf0000000 0x1000>; ++ }; ++ ++ nand { ++ ale = <&gpio 0x6>; ++ cle = <&gpio 0x5>; ++ nce = <&gpio 0x4>; ++ rdy = <&gpio 0x3>; ++ reg = <0xf8000000 0x1000>; ++ device_type = "rb,nand"; ++ }; ++ ++ fancon { ++ interrupt-parent = <&ipic>; ++ interrupts = <0x17 0x8>; ++ sense = <&gpio 0x7>; ++ fan_on = <&gpio 0x9>; ++ }; ++ ++ pci0: pci@e0008500 { ++ device_type = "pci"; ++ compatible = "fsl,mpc8349-pci"; ++ reg = <0xe0008500 0x100 0xe0008300 0x8>; ++ #address-cells = <3>; ++ #size-cells = <2>; ++ #interrupt-cells = <1>; ++ ranges = <0x2000000 0x0 0x80000000 0x80000000 0x0 0x20000000 0x1000000 0x0 0x0 0xd0000000 0x0 0x4000000>; ++ bus-range = <0x0 0x0>; ++ interrupt-map = < ++ 0x5800 0x0 0x0 0x1 &ipic 0x15 0x8 ++ 0x6000 0x0 0x0 0x1 &ipic 0x30 0x8 ++ 0x6000 0x0 0x0 0x2 &ipic 0x11 0x8 ++ 0x6800 0x0 0x0 0x1 &ipic 0x11 0x8 ++ 0x6800 0x0 0x0 0x2 &ipic 0x12 0x8 ++ 0x7000 0x0 0x0 0x1 &ipic 0x12 0x8 ++ 0x7000 0x0 0x0 0x2 &ipic 0x13 0x8 ++ 0x7800 0x0 0x0 0x1 &ipic 0x13 0x8 ++ 0x7800 0x0 0x0 0x2 &ipic 0x30 0x8 ++ 0x8000 0x0 0x0 0x1 &ipic 0x30 0x8 ++ 0x8000 0x0 0x0 0x2 &ipic 0x12 0x8 ++ 0x8000 0x0 0x0 0x3 &ipic 0x11 0x8 ++ 0x8000 0x0 0x0 0x4 &ipic 0x13 0x8 ++ 0xa000 0x0 0x0 0x1 &ipic 0x30 0x8 ++ 0xa000 0x0 0x0 0x2 &ipic 0x11 0x8 ++ 0xa000 0x0 0x0 0x3 &ipic 0x12 0x8 ++ 0xa000 0x0 0x0 0x4 &ipic 0x13 0x8 ++ 0xa800 0x0 0x0 0x1 &ipic 0x11 0x8 ++ 0xa800 0x0 0x0 0x2 &ipic 0x12 0x8 ++ 0xa800 0x0 0x0 0x3 &ipic 0x13 0x8 ++ 0xa800 0x0 0x0 0x4 &ipic 0x30 0x8>; ++ interrupt-map-mask = <0xf800 0x0 0x0 0x7>; ++ interrupt-parent = <&ipic>; ++ }; ++ ++ soc8343@e0000000 { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ device_type = "soc"; ++ compatible = "simple-bus"; ++ ranges = <0x0 0xe0000000 0x100000>; ++ reg = <0xe0000000 0x200>; ++ bus-frequency = <0x1>; ++ ++ led { ++ user_led = <0x400 0x8>; ++ }; ++ ++ beeper { ++ reg = <0x500 0x100>; ++ }; ++ ++ gpio: gpio@0 { ++ reg = <0xc08 0x4>; ++ device-id = <0x0>; ++ compatible = "gpio"; ++ device_type = "gpio"; ++ }; ++ ++ enet0: ethernet@25000 { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ cell-index = <0>; ++ phy-handle = <&phy0>; ++ tbi-handle = <&tbi0>; ++ interrupt-parent = <&ipic>; ++ interrupts = <0x23 0x8 0x24 0x8 0x25 0x8>; ++ local-mac-address = [00 00 00 00 00 00]; ++ reg = <0x25000 0x1000>; ++ ranges = <0x0 0x25000 0x1000>; ++ compatible = "gianfar"; ++ model = "TSEC"; ++ device_type = "network"; ++ ++ mdio@520 { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ compatible = "fsl,gianfar-tbi"; ++ reg = <0x520 0x20>; ++ ++ tbi0: tbi-phy@11 { ++ reg = <0x11>; ++ device_type = "tbi-phy"; ++ }; ++ }; ++ }; ++ ++ enet1: ethernet@24000 { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ cell-index = <1>; ++ phy-handle = <&phy1>; ++ tbi-handle = <&tbi1>; ++ interrupt-parent = <&ipic>; ++ interrupts = <0x20 0x8 0x21 0x8 0x22 0x8>; ++ local-mac-address = [00 00 00 00 00 00]; ++ reg = <0x24000 0x1000>; ++ ranges = <0x0 0x24000 0x1000>; ++ compatible = "gianfar"; ++ model = "TSEC"; ++ device_type = "network"; ++ ++ mdio@520 { ++ #size-cells = <0x0>; ++ #address-cells = <0x1>; ++ reg = <0x520 0x20>; ++ compatible = "fsl,gianfar-mdio"; ++ ++ phy0: ethernet-phy@0 { ++ device_type = "ethernet-phy"; ++ reg = <0x0>; ++ }; ++ ++ phy1: ethernet-phy@1 { ++ device_type = "ethernet-phy"; ++ reg = <0x1>; ++ }; ++ ++ tbi1: tbi-phy@11 { ++ reg = <0x11>; ++ device_type = "tbi-phy"; ++ }; ++ }; ++ }; ++ ++ ipic: pic@700 { ++ interrupt-controller; ++ #address-cells = <0>; ++ #interrupt-cells = <2>; ++ reg = <0x700 0x100>; ++ device_type = "ipic"; ++ }; ++ ++ serial@4500 { ++ interrupt-parent = <&ipic>; ++ interrupts = <0x9 0x8>; ++ clock-frequency = <0xfe4f840>; ++ reg = <0x4500 0x100>; ++ compatible = "ns16550"; ++ device_type = "serial"; ++ }; ++ ++ wdt@200 { ++ reg = <0x200 0x100>; ++ compatible = "mpc83xx_wdt"; ++ device_type = "watchdog"; ++ }; ++ }; ++}; +--- a/arch/powerpc/boot/Makefile ++++ b/arch/powerpc/boot/Makefile +@@ -73,7 +73,7 @@ src-plat := of.c cuboot-52xx.c cuboot-82 + cuboot-pq2.c cuboot-sequoia.c treeboot-walnut.c \ + cuboot-bamboo.c cuboot-mpc7448hpc2.c cuboot-taishan.c \ + fixed-head.S ep88xc.c ep405.c cuboot-c2k.c \ +- cuboot-katmai.c cuboot-rainier.c redboot-8xx.c ep8248e.c \ ++ cuboot-katmai.c cuboot-rainier.c redboot-8xx.c ep8248e.c rb600.c \ + cuboot-warp.c cuboot-85xx-cpm2.c cuboot-yosemite.c simpleboot.c \ + virtex405-head.S virtex.c redboot-83xx.c cuboot-sam440ep.c \ + cuboot-acadia.c cuboot-amigaone.c cuboot-kilauea.c +@@ -231,6 +231,7 @@ image-$(CONFIG_MPC834x_ITX) += cuImage. + image-$(CONFIG_MPC834x_MDS) += cuImage.mpc834x_mds + image-$(CONFIG_MPC836x_MDS) += cuImage.mpc836x_mds + image-$(CONFIG_ASP834x) += dtbImage.asp834x-redboot ++image-$(CONFIG_RB_PPC) += dtbImage.rb600 + + # Board ports in arch/powerpc/platform/85xx/Kconfig + image-$(CONFIG_MPC8540_ADS) += cuImage.mpc8540ads +--- /dev/null ++++ b/arch/powerpc/boot/rb600.c +@@ -0,0 +1,80 @@ ++/* ++ * The RouterBOARD platform -- for booting RB600(A) RouterBOARDs. ++ * ++ * Author: Michael Guntsche ++ * ++ * Copyright (c) 2009 Michael Guntsche ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 as published ++ * by the Free Software Foundation. ++ */ ++ ++#include "ops.h" ++#include "types.h" ++#include "io.h" ++#include "stdio.h" ++#include ++ ++BSS_STACK(4*1024); ++ ++u64 memsize64; ++const void *fw_dtb; ++ ++static void rb600_fixups(void) ++{ ++ const u32 *reg, *timebase, *clock; ++ int node, size; ++ void *chosen; ++ const char* bootargs; ++ ++ dt_fixup_memory(0, memsize64); ++ ++ /* Set the MAC addresses. */ ++ node = fdt_path_offset(fw_dtb, "/soc8343@e0000000/ethernet@24000"); ++ reg = fdt_getprop(fw_dtb, node, "mac-address", &size); ++ dt_fixup_mac_address_by_alias("ethernet1", (const u8 *)reg); ++ ++ node = fdt_path_offset(fw_dtb, "/soc8343@e0000000/ethernet@25000"); ++ reg = fdt_getprop(fw_dtb, node, "mac-address", &size); ++ dt_fixup_mac_address_by_alias("ethernet0", (const u8 *)reg); ++ ++ /* Find the CPU timebase and clock frequencies. */ ++ node = fdt_node_offset_by_prop_value(fw_dtb, -1, "device_type", "cpu", sizeof("cpu")); ++ timebase = fdt_getprop(fw_dtb, node, "timebase-frequency", &size); ++ clock = fdt_getprop(fw_dtb, node, "clock-frequency", &size); ++ dt_fixup_cpu_clocks(*clock, *timebase, 0); ++ ++ /* Fixup chosen ++ * The bootloader reads the kernelparm segment and adds the content to ++ * bootargs. This is needed to specify root and other boot flags. ++ */ ++ chosen = finddevice("/chosen"); ++ node = fdt_path_offset(fw_dtb, "/chosen"); ++ bootargs = fdt_getprop(fw_dtb, node, "bootargs", &size); ++ setprop_str(chosen, "bootargs", bootargs); ++} ++ ++void platform_init(unsigned long r3, unsigned long r4, unsigned long r5, ++ unsigned long r6, unsigned long r7) ++{ ++ const u32 *reg; ++ int node, size; ++ ++ fw_dtb = (const void *)r3; ++ ++ /* Find the memory range. */ ++ node = fdt_node_offset_by_prop_value(fw_dtb, -1, "device_type", "memory", sizeof("memory")); ++ reg = fdt_getprop(fw_dtb, node, "reg", &size); ++ memsize64 = reg[1]; ++ ++ /* Now we have the memory size; initialize the heap. */ ++ simple_alloc_init(_end, memsize64 - (unsigned long)_end, 32, 64); ++ ++ /* Prepare the device tree and find the console. */ ++ fdt_init(_dtb_start); ++ serial_console_init(); ++ ++ /* Remaining fixups... */ ++ platform_ops.fixups = rb600_fixups; ++} +--- a/arch/powerpc/boot/wrapper ++++ b/arch/powerpc/boot/wrapper +@@ -202,7 +202,7 @@ ps3) + isection=.kernel:initrd + link_address='' + ;; +-ep88xc|ep405|ep8248e) ++ep88xc|ep405|ep8248e|rb600) + platformo="$object/fixed-head.o $object/$platform.o" + binary=y + ;; +--- a/arch/powerpc/kernel/Makefile ++++ b/arch/powerpc/kernel/Makefile +@@ -104,9 +104,11 @@ obj32-$(CONFIG_PPC_PERF_CTRS) += mpc7450 + + obj-$(CONFIG_8XX_MINIMAL_FPEMU) += softemu8xx.o + ++ifneq ($(CONFIG_RB_IOMAP),y) + ifneq ($(CONFIG_PPC_INDIRECT_IO),y) + obj-y += iomap.o + endif ++endif + + obj-$(CONFIG_PPC64) += $(obj64-y) + obj-$(CONFIG_PPC32) += $(obj32-y) +--- a/arch/powerpc/platforms/83xx/Kconfig ++++ b/arch/powerpc/platforms/83xx/Kconfig +@@ -30,6 +30,15 @@ config MPC832x_RDB + help + This option enables support for the MPC8323 RDB board. + ++config RB_PPC ++ bool "MikroTik RouterBOARD 600 series" ++ select DEFAULT_UIMAGE ++ select QUICC_ENGINE ++ select PPC_MPC834x ++ select RB_IOMAP ++ help ++ This option enables support for MikroTik RouterBOARD 600 series boards. ++ + config MPC834x_MDS + bool "Freescale MPC834x MDS" + select DEFAULT_UIMAGE +--- a/arch/powerpc/platforms/83xx/Makefile ++++ b/arch/powerpc/platforms/83xx/Makefile +@@ -6,6 +6,7 @@ obj-$(CONFIG_SUSPEND) += suspend.o susp + obj-$(CONFIG_MCU_MPC8349EMITX) += mcu_mpc8349emitx.o + obj-$(CONFIG_MPC831x_RDB) += mpc831x_rdb.o + obj-$(CONFIG_MPC832x_RDB) += mpc832x_rdb.o ++obj-$(CONFIG_RB_PPC) += rbppc.o + obj-$(CONFIG_MPC834x_MDS) += mpc834x_mds.o + obj-$(CONFIG_MPC834x_ITX) += mpc834x_itx.o + obj-$(CONFIG_MPC836x_MDS) += mpc836x_mds.o +--- /dev/null ++++ b/arch/powerpc/platforms/83xx/rbppc.c +@@ -0,0 +1,316 @@ ++/* ++ * Copyright (C) 2008-2009 Noah Fontes ++ * Copyright (C) 2009 Michael Guntsche ++ * Copyright (C) Mikrotik 2007 ++ * ++ * 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. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "mpc83xx.h" ++ ++#define SYSCTL 0x100 ++#define SICRL 0x014 ++ ++#define GTCFR2 0x04 ++#define GTMDR4 0x22 ++#define GTRFR4 0x26 ++#define GTCNR4 0x2e ++#define GTVER4 0x36 ++#define GTPSR4 0x3e ++ ++#define GTCFR_BCM 0x40 ++#define GTCFR_STP4 0x20 ++#define GTCFR_RST4 0x10 ++#define GTCFR_STP3 0x02 ++#define GTCFR_RST3 0x01 ++ ++#define GTMDR_ORI 0x10 ++#define GTMDR_FRR 0x08 ++#define GTMDR_ICLK16 0x04 ++ ++extern int par_io_data_set(u8 port, u8 pin, u8 val); ++extern int par_io_config_pin(u8 port, u8 pin, int dir, int open_drain, ++ int assignment, int has_irq); ++ ++static unsigned timer_freq; ++static void *gtm; ++ ++static int beeper_irq; ++static unsigned beeper_gpio_pin[2]; ++ ++irqreturn_t rbppc_timer_irq(int irq, void *ptr) ++{ ++ static int toggle = 0; ++ ++ par_io_data_set(beeper_gpio_pin[0], beeper_gpio_pin[1], toggle); ++ toggle = !toggle; ++ ++ /* ack interrupt */ ++ out_be16(gtm + GTVER4, 3); ++ ++ return IRQ_HANDLED; ++} ++ ++void rbppc_beep(unsigned freq) ++{ ++ unsigned gtmdr; ++ ++ if (freq > 5000) freq = 5000; ++ ++ if (!gtm) ++ return; ++ if (!freq) { ++ out_8(gtm + GTCFR2, GTCFR_STP4 | GTCFR_STP3); ++ return; ++ } ++ ++ out_8(gtm + GTCFR2, GTCFR_RST4 | GTCFR_STP3); ++ out_be16(gtm + GTPSR4, 255); ++ gtmdr = GTMDR_FRR | GTMDR_ICLK16; ++ if (beeper_irq != NO_IRQ) gtmdr |= GTMDR_ORI; ++ out_be16(gtm + GTMDR4, gtmdr); ++ out_be16(gtm + GTVER4, 3); ++ ++ out_be16(gtm + GTRFR4, timer_freq / 16 / 256 / freq / 2); ++ out_be16(gtm + GTCNR4, 0); ++} ++EXPORT_SYMBOL(rbppc_beep); ++ ++static void __init rbppc_setup_arch(void) ++{ ++ struct device_node *np; ++ ++ np = of_find_node_by_type(NULL, "cpu"); ++ if (np) { ++ const unsigned *fp = of_get_property(np, "clock-frequency", NULL); ++ loops_per_jiffy = fp ? *fp / HZ : 0; ++ ++ of_node_put(np); ++ } ++ ++ np = of_find_node_by_name(NULL, "serial"); ++ if (np) { ++ timer_freq = ++ *(unsigned *) of_get_property(np, "clock-frequency", NULL); ++ of_node_put(np); ++ } ++ ++#ifdef CONFIG_PCI ++ np = of_find_node_by_type(NULL, "pci"); ++ if (np) { ++ mpc83xx_add_bridge(np); ++ } ++#endif ++ ++#ifdef CONFIG_QUICC_ENGINE ++ np = of_find_node_by_name(np, "par_io"); ++ if (np) { ++ qe_reset(); ++ par_io_init(np); ++ of_node_put(np); ++ ++ np = NULL; ++ while (1) { ++ np = of_find_node_by_name(np, "ucc"); ++ if (!np) break; ++ ++ par_io_of_config(np); ++ } ++ } ++#endif ++ ++} ++ ++void __init rbppc_init_IRQ(void) ++{ ++ struct device_node *np; ++ ++ np = of_find_node_by_type(NULL, "ipic"); ++ if (np) { ++ ipic_init(np, 0); ++ ipic_set_default_priority(); ++ of_node_put(np); ++ } ++ ++#ifdef CONFIG_QUICC_ENGINE ++ np = of_find_node_by_type(NULL, "qeic"); ++ if (np) { ++ qe_ic_init(np, 0, qe_ic_cascade_low_ipic, qe_ic_cascade_high_ipic); ++ of_node_put(np); ++ } ++#endif ++} ++ ++static int __init rbppc_probe(void) ++{ ++ char *model; ++ ++ model = of_get_flat_dt_prop(of_get_flat_dt_root(), "model", NULL); ++ ++ if (!model) ++ return 0; ++ ++ if (strcmp(model, "RB600") == 0) ++ return 1; ++ ++ return 0; ++} ++ ++static void __init rbppc_beeper_init(struct device_node *beeper) ++{ ++ struct resource res; ++ struct device_node *gpio; ++ const unsigned *pin; ++ const unsigned *gpio_id; ++ ++ if (of_address_to_resource(beeper, 0, &res)) { ++ printk(KERN_ERR "rbppc_beeper_init(%s): Beeper error: No region specified\n", beeper->full_name); ++ return; ++ } ++ ++ pin = of_get_property(beeper, "gpio", NULL); ++ if (pin) { ++ gpio = of_find_node_by_phandle(pin[0]); ++ ++ if (!gpio) { ++ printk(KERN_ERR "rbppc_beeper_init(%s): Beeper error: GPIO handle %x not found\n", beeper->full_name, pin[0]); ++ return; ++ } ++ ++ gpio_id = of_get_property(gpio, "device-id", NULL); ++ if (!gpio_id) { ++ printk(KERN_ERR "rbppc_beeper_init(%s): Beeper error: No device-id specified in GPIO\n", beeper->full_name); ++ return; ++ } ++ ++ beeper_gpio_pin[0] = *gpio_id; ++ beeper_gpio_pin[1] = pin[1]; ++ ++ par_io_config_pin(*gpio_id, pin[1], 1, 0, 0, 0); ++ } else { ++ void *sysctl; ++ ++ sysctl = ioremap_nocache(get_immrbase() + SYSCTL, 0x100); ++ out_be32(sysctl + SICRL, ++ in_be32(sysctl + SICRL) | (1 << (31 - 19))); ++ iounmap(sysctl); ++ } ++ ++ gtm = ioremap_nocache(res.start, res.end - res.start + 1); ++ ++ beeper_irq = irq_of_parse_and_map(beeper, 0); ++ if (beeper_irq != NO_IRQ) { ++ int e = request_irq(beeper_irq, rbppc_timer_irq, 0, "beeper", NULL); ++ if (e) { ++ printk(KERN_ERR "rbppc_beeper_init(%s): Request of beeper irq failed!\n", beeper->full_name); ++ } ++ } ++} ++ ++#define SBIT(x) (0x80000000 >> (x)) ++#define DBIT(x, y) ((y) << (32 - (((x % 16) + 1) * 2))) ++ ++#define SICRL_RB600(x) ((x) + (0x114 >> 2)) ++#define GPIO_DIR_RB600(x) ((x) + (0xc00 >> 2)) ++#define GPIO_DATA_RB600(x) ((x) + (0xc08 >> 2)) ++ ++static void rbppc_restart(char *cmd) ++{ ++ __be32 __iomem *reg; ++ ++ reg = ioremap(get_immrbase(), 0x1000); ++ local_irq_disable(); ++ out_be32(SICRL_RB600(reg), in_be32(SICRL_RB600(reg)) & ~0x00800000); ++ out_be32(GPIO_DIR_RB600(reg), in_be32(GPIO_DIR_RB600(reg)) | SBIT(2)); ++ out_be32(GPIO_DATA_RB600(reg), in_be32(GPIO_DATA_RB600(reg)) & ~SBIT(2)); ++ ++ while (1); ++} ++ ++static void rbppc_halt(void) ++{ ++ while (1); ++} ++ ++static struct of_device_id rbppc_ids[] = { ++ { .type = "soc", }, ++ { .compatible = "soc", }, ++ { .compatible = "simple-bus", }, ++ { .compatible = "gianfar", }, ++ { }, ++}; ++ ++static int __init rbppc_declare_of_platform_devices(void) ++{ ++ struct device_node *np; ++ unsigned idx; ++ ++ of_platform_bus_probe(NULL, rbppc_ids, NULL); ++ ++ np = of_find_node_by_type(NULL, "mdio"); ++ if (np) { ++ unsigned len; ++ unsigned *res; ++ const unsigned *eres; ++ struct device_node *ep; ++ ++ ep = of_find_compatible_node(NULL, "network", "ucc_geth"); ++ if (ep) { ++ eres = of_get_property(ep, "reg", &len); ++ res = (unsigned *) of_get_property(np, "reg", &len); ++ if (res && eres) { ++ res[0] = eres[0] + 0x120; ++ } ++ } ++ } ++ ++ np = of_find_node_by_name(NULL, "nand"); ++ if (np) { ++ of_platform_device_create(np, "nand", NULL); ++ } ++ ++ idx = 0; ++ for_each_node_by_type(np, "rb,cf") { ++ char dev_name[12]; ++ snprintf(dev_name, sizeof(dev_name), "cf.%u", idx); ++ of_platform_device_create(np, dev_name, NULL); ++ ++idx; ++ } ++ ++ np = of_find_node_by_name(NULL, "beeper"); ++ if (np) { ++ rbppc_beeper_init(np); ++ } ++ ++ return 0; ++} ++machine_device_initcall(rb600, rbppc_declare_of_platform_devices); ++ ++define_machine(rb600) { ++ .name = "MikroTik RouterBOARD 600 series", ++ .probe = rbppc_probe, ++ .setup_arch = rbppc_setup_arch, ++ .init_IRQ = rbppc_init_IRQ, ++ .get_irq = ipic_get_irq, ++ .restart = rbppc_restart, ++ .halt = rbppc_halt, ++ .time_init = mpc83xx_time_init, ++ .calibrate_decr = generic_calibrate_decr, ++}; +--- a/arch/powerpc/platforms/Kconfig ++++ b/arch/powerpc/platforms/Kconfig +@@ -142,6 +142,10 @@ config GENERIC_IOMAP + bool + default n + ++config RB_IOMAP ++ bool ++ default y if RB_PPC ++ + source "drivers/cpufreq/Kconfig" + + menu "CPU Frequency drivers" +--- a/arch/powerpc/sysdev/Makefile ++++ b/arch/powerpc/sysdev/Makefile +@@ -56,3 +56,5 @@ obj-$(CONFIG_PPC_MPC52xx) += mpc5xxx_clo + ifeq ($(CONFIG_SUSPEND),y) + obj-$(CONFIG_6xx) += 6xx-suspend.o + endif ++ ++obj-$(CONFIG_RB_IOMAP) += rb_iomap.o +--- /dev/null ++++ b/arch/powerpc/sysdev/rb_iomap.c +@@ -0,0 +1,223 @@ ++#include ++#include ++#include ++#include ++ ++#define LOCALBUS_START 0x40000000 ++#define LOCALBUS_MASK 0x007fffff ++#define LOCALBUS_REGMASK 0x001fffff ++ ++static void __iomem *localbus_base; ++ ++static inline int is_localbus(void __iomem *addr) ++{ ++ return ((unsigned) addr & ~LOCALBUS_MASK) == LOCALBUS_START; ++} ++ ++static inline unsigned localbus_regoff(unsigned reg) { ++ return (reg << 16) | (((reg ^ 8) & 8) << 17); ++} ++ ++static inline void __iomem *localbus_addr(void __iomem *addr) ++{ ++ return localbus_base ++ + ((unsigned) addr & LOCALBUS_MASK & ~LOCALBUS_REGMASK) ++ + localbus_regoff((unsigned) addr & LOCALBUS_REGMASK); ++} ++ ++unsigned int ioread8(void __iomem *addr) ++{ ++ if (is_localbus(addr)) ++ return in_be16(localbus_addr(addr)) >> 8; ++ return readb(addr); ++} ++EXPORT_SYMBOL(ioread8); ++ ++unsigned int ioread16(void __iomem *addr) ++{ ++ if (is_localbus(addr)) ++ return le16_to_cpu(in_be16(localbus_addr(addr))); ++ return readw(addr); ++} ++EXPORT_SYMBOL(ioread16); ++ ++unsigned int ioread16be(void __iomem *addr) ++{ ++ return in_be16(addr); ++} ++EXPORT_SYMBOL(ioread16be); ++ ++unsigned int ioread32(void __iomem *addr) ++{ ++ return readl(addr); ++} ++EXPORT_SYMBOL(ioread32); ++ ++unsigned int ioread32be(void __iomem *addr) ++{ ++ return in_be32(addr); ++} ++EXPORT_SYMBOL(ioread32be); ++ ++void iowrite8(u8 val, void __iomem *addr) ++{ ++ if (is_localbus(addr)) ++ out_be16(localbus_addr(addr), ((u16) val) << 8); ++ else ++ writeb(val, addr); ++} ++EXPORT_SYMBOL(iowrite8); ++ ++void iowrite16(u16 val, void __iomem *addr) ++{ ++ if (is_localbus(addr)) ++ out_be16(localbus_addr(addr), cpu_to_le16(val)); ++ else ++ writew(val, addr); ++} ++EXPORT_SYMBOL(iowrite16); ++ ++void iowrite16be(u16 val, void __iomem *addr) ++{ ++ out_be16(addr, val); ++} ++EXPORT_SYMBOL(iowrite16be); ++ ++void iowrite32(u32 val, void __iomem *addr) ++{ ++ writel(val, addr); ++} ++EXPORT_SYMBOL(iowrite32); ++ ++void iowrite32be(u32 val, void __iomem *addr) ++{ ++ out_be32(addr, val); ++} ++EXPORT_SYMBOL(iowrite32be); ++ ++void ioread8_rep(void __iomem *addr, void *dst, unsigned long count) ++{ ++ if (is_localbus(addr)) { ++ unsigned i; ++ void *laddr = localbus_addr(addr); ++ u8 *buf = dst; ++ ++ for (i = 0; i < count; ++i) { ++ *buf++ = in_be16(laddr) >> 8; ++ } ++ } else { ++ _insb((u8 __iomem *) addr, dst, count); ++ } ++} ++EXPORT_SYMBOL(ioread8_rep); ++ ++void ioread16_rep(void __iomem *addr, void *dst, unsigned long count) ++{ ++ if (is_localbus(addr)) { ++ unsigned i; ++ void *laddr = localbus_addr(addr); ++ u16 *buf = dst; ++ ++ for (i = 0; i < count; ++i) { ++ *buf++ = in_be16(laddr); ++ } ++ } else { ++ _insw_ns((u16 __iomem *) addr, dst, count); ++ } ++} ++EXPORT_SYMBOL(ioread16_rep); ++ ++void ioread32_rep(void __iomem *addr, void *dst, unsigned long count) ++{ ++ _insl_ns((u32 __iomem *) addr, dst, count); ++} ++EXPORT_SYMBOL(ioread32_rep); ++ ++void iowrite8_rep(void __iomem *addr, const void *src, unsigned long count) ++{ ++ if (is_localbus(addr)) { ++ unsigned i; ++ void *laddr = localbus_addr(addr); ++ const u8 *buf = src; ++ ++ for (i = 0; i < count; ++i) { ++ out_be16(laddr, ((u16) *buf++) << 8); ++ } ++ } else { ++ _outsb((u8 __iomem *) addr, src, count); ++ } ++} ++EXPORT_SYMBOL(iowrite8_rep); ++ ++void iowrite16_rep(void __iomem *addr, const void *src, unsigned long count) ++{ ++ if (is_localbus(addr)) { ++ unsigned i; ++ void *laddr = localbus_addr(addr); ++ const u16 *buf = src; ++ ++ for (i = 0; i < count; ++i) { ++ out_be16(laddr, *buf++); ++ } ++ } else { ++ _outsw_ns((u16 __iomem *) addr, src, count); ++ } ++} ++EXPORT_SYMBOL(iowrite16_rep); ++ ++void iowrite32_rep(void __iomem *addr, const void *src, unsigned long count) ++{ ++ _outsl_ns((u32 __iomem *) addr, src, count); ++} ++EXPORT_SYMBOL(iowrite32_rep); ++ ++void __iomem *ioport_map(unsigned long port, unsigned int len) ++{ ++ return (void __iomem *) (port + _IO_BASE); ++} ++EXPORT_SYMBOL(ioport_unmap); ++ ++void ioport_unmap(void __iomem *addr) ++{ ++ /* Nothing to do */ ++} ++EXPORT_SYMBOL(ioport_map); ++ ++void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max) ++{ ++ unsigned long start = pci_resource_start(dev, bar); ++ unsigned long len = pci_resource_len(dev, bar); ++ unsigned long flags = pci_resource_flags(dev, bar); ++ ++ if (!len) ++ return NULL; ++ if (max && len > max) ++ len = max; ++ if (flags & IORESOURCE_IO) ++ return ioport_map(start, len); ++ if (flags & IORESOURCE_MEM) ++ return ioremap(start, len); ++ /* What? */ ++ return NULL; ++} ++EXPORT_SYMBOL(pci_iomap); ++ ++void pci_iounmap(struct pci_dev *dev, void __iomem *addr) ++{ ++ /* Nothing to do */ ++} ++EXPORT_SYMBOL(pci_iounmap); ++ ++void __iomem *localbus_map(unsigned long addr, unsigned int len) ++{ ++ if (!localbus_base) ++ localbus_base = ioremap(addr & ~LOCALBUS_MASK, ++ LOCALBUS_MASK + 1); ++ return (void *) (LOCALBUS_START + (addr & LOCALBUS_MASK)); ++} ++EXPORT_SYMBOL(localbus_map); ++ ++void localbus_unmap(void __iomem *addr) ++{ ++} ++EXPORT_SYMBOL(localbus_unmap); +--- a/drivers/ata/Kconfig ++++ b/drivers/ata/Kconfig +@@ -781,5 +781,12 @@ config PATA_BF54X + + If unsure, say N. + ++config PATA_RB_PPC ++ tristate "MikroTik RB600 PATA support" ++ depends on RB_PPC ++ help ++ This option enables support for PATA devices on MikroTik RouterBOARD ++ 600 series boards. ++ + endif # ATA_SFF + endif # ATA +--- a/drivers/ata/Makefile ++++ b/drivers/ata/Makefile +@@ -77,6 +77,7 @@ obj-$(CONFIG_PATA_PLATFORM) += pata_plat + obj-$(CONFIG_PATA_AT91) += pata_at91.o + obj-$(CONFIG_PATA_OF_PLATFORM) += pata_of_platform.o + obj-$(CONFIG_PATA_ICSIDE) += pata_icside.o ++obj-$(CONFIG_PATA_RB_PPC) += pata_rbppc_cf.o + # Should be last but two libata driver + obj-$(CONFIG_PATA_ACPI) += pata_acpi.o + # Should be last but one libata driver +--- /dev/null ++++ b/drivers/ata/pata_rbppc_cf.c +@@ -0,0 +1,701 @@ ++/* ++ * Copyright (C) 2008-2009 Noah Fontes ++ * Copyright (C) Mikrotik 2007 ++ * ++ * 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. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define DEBUG_UPM 0 ++ ++#define DRV_NAME "pata_rbppc_cf" ++#define DRV_VERSION "0.0.2" ++ ++#define DEV2SEL_OFFSET 0x00100000 ++ ++#define IMMR_LBCFG_OFFSET 0x00005000 ++#define IMMR_LBCFG_SIZE 0x00001000 ++ ++#define LOCAL_BUS_MCMR 0x00000078 ++#define MxMR_OP_MASK 0x30000000 ++#define MxMR_OP_NORMAL 0x00000000 ++#define MxMR_OP_WRITE 0x10000000 ++#define MxMR_OP_READ 0x20000000 ++#define MxMR_OP_RUN 0x30000000 ++#define MxMR_LUPWAIT_LOW 0x08000000 ++#define MxMR_LUPWAIT_HIGH 0x00000000 ++#define MxMR_LUPWAIT_ENABLE 0x00040000 ++#define MxMR_RLF_MASK 0x0003c000 ++#define MxMR_RLF_SHIFT 14 ++#define MxMR_WLF_MASK 0x00003c00 ++#define MxMR_WLF_SHIFT 10 ++#define MxMR_MAD_MASK 0x0000003f ++#define LOCAL_BUS_MDR 0x00000088 ++#define LOCAL_BUS_LCRR 0x000000D4 ++#define LCRR_CLKDIV_MASK 0x0000000f ++ ++#define LOOP_SIZE 4 ++ ++#define UPM_READ_SINGLE_OFFSET 0x00 ++#define UPM_WRITE_SINGLE_OFFSET 0x18 ++#define UPM_DATA_SIZE 0x40 ++ ++#define LBT_CPUIN_MIN 0 ++#define LBT_CPUOUT_MIN 1 ++#define LBT_CPUOUT_MAX 2 ++#define LBT_EXTDEL_MIN 3 ++#define LBT_EXTDEL_MAX 4 ++#define LBT_SIZE 5 ++ ++/* UPM machine configuration bits */ ++#define N_BASE 0x00f00000 ++#define N_CS 0xf0000000 ++#define N_CS_H1 0xc0000000 ++#define N_CS_H2 0x30000000 ++#define N_WE 0x0f000000 ++#define N_WE_H1 0x0c000000 ++#define N_WE_H2 0x03000000 ++#define N_OE 0x00030000 ++#define N_OE_H1 0x00020000 ++#define N_OE_H2 0x00010000 ++#define WAEN 0x00001000 ++#define REDO_2 0x00000100 ++#define REDO_3 0x00000200 ++#define REDO_4 0x00000300 ++#define LOOP 0x00000080 ++#define NA 0x00000008 ++#define UTA 0x00000004 ++#define LAST 0x00000001 ++ ++#define REDO_VAL(mult) (REDO_2 * ((mult) - 1)) ++#define REDO_MAX_MULT 4 ++ ++#define READ_BASE (N_BASE | N_WE) ++#define WRITE_BASE (N_BASE | N_OE) ++#define EMPTY (N_BASE | N_CS | N_OE | N_WE | LAST) ++ ++#define EOF_UPM_SETTINGS 0 ++#define ANOTHER_TIMING 1 ++ ++#define OA_CPUIN_MIN 0x01 ++#define OA_CPUOUT_MAX 0x02 ++#define OD_CPUOUT_MIN 0x04 ++#define OA_CPUOUT_DELTA 0x06 ++#define OA_EXTDEL_MAX 0x08 ++#define OD_EXTDEL_MIN 0x10 ++#define OA_EXTDEL_DELTA 0x18 ++#define O_MIN_CYCLE_TIME 0x20 ++#define O_MINUS_PREV 0x40 ++#define O_HALF_CYCLE 0x80 ++ ++extern void __iomem *localbus_map(unsigned long addr, unsigned int len); ++extern void localbus_unmap(void __iomem *addr); ++ ++struct rbppc_cf_info { ++ unsigned lbcfg_addr; ++ unsigned clk_time_ps; ++ int cur_mode; ++ u32 lb_timings[LBT_SIZE]; ++}; ++static struct rbppc_cf_info *rbinfo = NULL; ++ ++struct upm_setting { ++ unsigned value; ++ unsigned ns[7]; ++ unsigned clk_minus; ++ unsigned group_size; ++ unsigned options; ++}; ++ ++static const struct upm_setting cfUpmReadSingle[] = { ++ { READ_BASE | N_OE, ++ /* t1 - ADDR setup time */ ++ { 70, 50, 30, 30, 25, 15, 10 }, 0, 0, (OA_CPUOUT_DELTA | ++ OA_EXTDEL_MAX) }, ++ { READ_BASE | N_OE_H1, ++ { 0, 0, 0, 0, 0, 0, 0 }, 0, 0, O_HALF_CYCLE }, ++ { READ_BASE, ++ /* t2 - OE0 time */ ++ { 290, 290, 290, 80, 70, 65, 55 }, 0, 2, (OA_CPUOUT_MAX | ++ OA_CPUIN_MIN) }, ++ { READ_BASE | WAEN, ++ { 1, 1, 1, 1, 1, 0, 0 }, 0, 0, 0 }, ++ { READ_BASE | UTA, ++ { 1, 1, 1, 1, 1, 1, 1 }, 0, 0, 0 }, ++ { READ_BASE | N_OE, ++ /* t9 - ADDR hold time */ ++ { 20, 15, 10, 10, 10, 10, 10 }, 0, 0, (OA_CPUOUT_DELTA | ++ OD_EXTDEL_MIN) }, ++ { READ_BASE | N_OE | N_CS_H2, ++ { 0, 0, 0, 0, 0, 0, 0 }, 0, 0, O_HALF_CYCLE }, ++ { READ_BASE | N_OE | N_CS, ++ /* t6Z -IORD data tristate */ ++ { 30, 30, 30, 30, 30, 20, 20 }, 1, 1, O_MINUS_PREV }, ++ { ANOTHER_TIMING, ++ /* t2i -IORD recovery time */ ++ { 0, 0, 0, 70, 25, 25, 20 }, 2, 0, 0 }, ++ { ANOTHER_TIMING, ++ /* CS 0 -> 1 MAX */ ++ { 0, 0, 0, 0, 0, 0, 0 }, 1, 0, (OA_CPUOUT_DELTA | ++ OA_EXTDEL_MAX) }, ++ { READ_BASE | N_OE | N_CS | LAST, ++ { 1, 1, 1, 1, 1, 1, 1 }, 0, 0, 0 }, ++ { EOF_UPM_SETTINGS, ++ /* min total cycle time - includes turnaround and ALE cycle */ ++ { 600, 383, 240, 180, 120, 100, 80 }, 2, 0, O_MIN_CYCLE_TIME }, ++}; ++ ++static const struct upm_setting cfUpmWriteSingle[] = { ++ { WRITE_BASE | N_WE, ++ /* t1 - ADDR setup time */ ++ { 70, 50, 30, 30, 25, 15, 10 }, 0, 0, (OA_CPUOUT_DELTA | ++ OA_EXTDEL_MAX) }, ++ { WRITE_BASE | N_WE_H1, ++ { 0, 0, 0, 0, 0, 0, 0 }, 0, 0, O_HALF_CYCLE }, ++ { WRITE_BASE, ++ /* t2 - WE0 time */ ++ { 290, 290, 290, 80, 70, 65, 55 }, 0, 1, OA_CPUOUT_DELTA }, ++ { WRITE_BASE | WAEN, ++ { 1, 1, 1, 1, 1, 0, 0 }, 0, 0, 0 }, ++ { WRITE_BASE | N_WE, ++ /* t9 - ADDR hold time */ ++ { 20, 15, 10, 10, 10, 10, 10 }, 0, 0, (OA_CPUOUT_DELTA | ++ OD_EXTDEL_MIN) }, ++ { WRITE_BASE | N_WE | N_CS_H2, ++ { 0, 0, 0, 0, 0, 0, 0 }, 0, 0, O_HALF_CYCLE }, ++ { WRITE_BASE | N_WE | N_CS, ++ /* t4 - DATA hold time */ ++ { 30, 20, 15, 10, 10, 10, 10 }, 0, 1, O_MINUS_PREV }, ++ { ANOTHER_TIMING, ++ /* t2i -IOWR recovery time */ ++ { 0, 0, 0, 70, 25, 25, 20 }, 1, 0, 0 }, ++ { ANOTHER_TIMING, ++ /* CS 0 -> 1 MAX */ ++ { 0, 0, 0, 0, 0, 0, 0 }, 0, 0, (OA_CPUOUT_DELTA | ++ OA_EXTDEL_MAX) }, ++ { WRITE_BASE | N_WE | N_CS | UTA | LAST, ++ { 1, 1, 1, 1, 1, 1, 1 }, 0, 0, 0 }, ++ /* min total cycle time - includes ALE cycle */ ++ { EOF_UPM_SETTINGS, ++ { 600, 383, 240, 180, 120, 100, 80 }, 1, 0, O_MIN_CYCLE_TIME }, ++}; ++ ++static u8 rbppc_cf_check_status(struct ata_port *ap) { ++ u8 val = ioread8(ap->ioaddr.status_addr); ++ if (val == 0xF9) ++ val = 0x7F; ++ return val; ++} ++ ++static u8 rbppc_cf_check_altstatus(struct ata_port *ap) { ++ u8 val = ioread8(ap->ioaddr.altstatus_addr); ++ if (val == 0xF9) ++ val = 0x7F; ++ return val; ++} ++ ++static void rbppc_cf_dummy_noret(struct ata_port *ap) { } ++static int rbppc_cf_dummy_ret0(struct ata_port *ap) { return 0; } ++ ++static int ps2clk(int ps, unsigned clk_time_ps) { ++ int psMaxOver; ++ if (ps <= 0) return 0; ++ ++ /* round down if <= 2% over clk border, but no more than 1/4 clk cycle */ ++ psMaxOver = ps * 2 / 100; ++ if (4 * psMaxOver > clk_time_ps) { ++ psMaxOver = clk_time_ps / 4; ++ } ++ return (ps + clk_time_ps - 1 - psMaxOver) / clk_time_ps; ++} ++ ++static int upm_gen_ps_table(const struct upm_setting *upm, ++ int mode, struct rbppc_cf_info *info, ++ int *psFinal) { ++ int uidx; ++ int lastUpmValIdx = 0; ++ int group_start_idx = -1; ++ int group_left_num = -1; ++ int clk_time_ps = info->clk_time_ps; ++ ++ for (uidx = 0; upm[uidx].value != EOF_UPM_SETTINGS; ++uidx) { ++ const struct upm_setting *us = upm + uidx; ++ unsigned opt = us->options; ++ int ps = us->ns[mode] * 1000 - us->clk_minus * clk_time_ps; ++ ++ if (opt & OA_CPUIN_MIN) ps += info->lb_timings[LBT_CPUIN_MIN]; ++ if (opt & OD_CPUOUT_MIN) ps -= info->lb_timings[LBT_CPUOUT_MIN]; ++ if (opt & OA_CPUOUT_MAX) ps += info->lb_timings[LBT_CPUOUT_MAX]; ++ if (opt & OD_EXTDEL_MIN) ps -= info->lb_timings[LBT_EXTDEL_MIN]; ++ if (opt & OA_EXTDEL_MAX) ps += info->lb_timings[LBT_EXTDEL_MAX]; ++ ++ if (us->value == ANOTHER_TIMING) { ++ /* use longest timing from alternatives */ ++ if (psFinal[lastUpmValIdx] < ps) { ++ psFinal[lastUpmValIdx] = ps; ++ } ++ ps = 0; ++ } ++ else { ++ if (us->group_size) { ++ group_start_idx = uidx; ++ group_left_num = us->group_size; ++ } ++ else if (group_left_num > 0) { ++ /* group time is divided on all group members */ ++ int clk = ps2clk(ps, clk_time_ps); ++ psFinal[group_start_idx] -= clk * clk_time_ps; ++ --group_left_num; ++ } ++ if ((opt & O_MINUS_PREV) && lastUpmValIdx > 0) { ++ int clk = ps2clk(psFinal[lastUpmValIdx], ++ clk_time_ps); ++ ps -= clk * clk_time_ps; ++ } ++ lastUpmValIdx = uidx; ++ } ++ psFinal[uidx] = ps; ++ } ++ return uidx; ++} ++ ++static int free_half(int ps, int clk, int clk_time_ps) { ++ if (clk < 2) return 0; ++ return (clk * clk_time_ps - ps) * 2 >= clk_time_ps; ++} ++ ++static void upm_gen_clk_table(const struct upm_setting *upm, ++ int mode, int clk_time_ps, ++ int max_uidx, const int *psFinal, int *clkFinal) { ++ int clk_cycle_time; ++ int clk_total; ++ int uidx; ++ ++ /* convert picoseconds to clocks */ ++ clk_total = 0; ++ for (uidx = 0; uidx < max_uidx; ++uidx) { ++ int clk = ps2clk(psFinal[uidx], clk_time_ps); ++ clkFinal[uidx] = clk; ++ clk_total += clk; ++ } ++ ++ /* check possibility of half cycle usage */ ++ for (uidx = 1; uidx < max_uidx - 1; ++uidx) { ++ if ((upm[uidx].options & O_HALF_CYCLE) && ++ free_half(psFinal[uidx - 1], clkFinal[uidx - 1], ++ clk_time_ps) && ++ free_half(psFinal[uidx + 1], clkFinal[uidx + 1], ++ clk_time_ps)) { ++ ++clkFinal[uidx]; ++ --clkFinal[uidx - 1]; ++ --clkFinal[uidx + 1]; ++ } ++ } ++ ++ if ((upm[max_uidx].options & O_MIN_CYCLE_TIME) == 0) return; ++ ++ /* check cycle time, adjust timings if needed */ ++ clk_cycle_time = (ps2clk(upm[max_uidx].ns[mode] * 1000, clk_time_ps) - ++ upm[max_uidx].clk_minus); ++ uidx = 0; ++ while (clk_total < clk_cycle_time) { ++ /* extend all timings in round-robin to match cycle time */ ++ if (clkFinal[uidx]) { ++#if DEBUG_UPM ++ printk(KERN_INFO "extending %u by 1 clk\n", uidx); ++#endif ++ ++clkFinal[uidx]; ++ ++clk_total; ++ } ++ ++uidx; ++ if (uidx == max_uidx) uidx = 0; ++ } ++} ++ ++static void add_data_val(unsigned val, int *clkLeft, int maxClk, ++ unsigned *data, int *dataIdx) { ++ if (*clkLeft == 0) return; ++ ++ if (maxClk == 0 && *clkLeft >= LOOP_SIZE * 2) { ++ int times; ++ int times1; ++ int times2; ++ ++ times = *clkLeft / LOOP_SIZE; ++ if (times > REDO_MAX_MULT * 2) times = REDO_MAX_MULT * 2; ++ times1 = times / 2; ++ times2 = times - times1; ++ ++ val |= LOOP; ++ data[*dataIdx] = val | REDO_VAL(times1); ++ ++(*dataIdx); ++ data[*dataIdx] = val | REDO_VAL(times2); ++ ++(*dataIdx); ++ ++ *clkLeft -= times * LOOP_SIZE; ++ return; ++ } ++ ++ if (maxClk < 1 || maxClk > REDO_MAX_MULT) maxClk = REDO_MAX_MULT; ++ if (*clkLeft < maxClk) maxClk = *clkLeft; ++ ++ *clkLeft -= maxClk; ++ val |= REDO_VAL(maxClk); ++ ++ data[*dataIdx] = val; ++ ++(*dataIdx); ++} ++ ++static int upm_gen_final_data(const struct upm_setting *upm, ++ int max_uidx, int *clkFinal, unsigned *data) { ++ int dataIdx; ++ int uidx; ++ ++ dataIdx = 0; ++ for (uidx = 0; uidx < max_uidx; ++uidx) { ++ int clk = clkFinal[uidx]; ++ while (clk > 0) { ++ add_data_val(upm[uidx].value, &clk, 0, ++ data, &dataIdx); ++ } ++ } ++ return dataIdx; ++} ++ ++static int conv_upm_table(const struct upm_setting *upm, ++ int mode, struct rbppc_cf_info *info, ++ unsigned *data) { ++#if DEBUG_UPM ++ int uidx; ++#endif ++ int psFinal[32]; ++ int clkFinal[32]; ++ int max_uidx; ++ int data_len; ++ ++ max_uidx = upm_gen_ps_table(upm, mode, info, psFinal); ++ ++ upm_gen_clk_table(upm, mode, info->clk_time_ps, max_uidx, ++ psFinal, clkFinal); ++ ++#if DEBUG_UPM ++ /* dump out debug info */ ++ for (uidx = 0; uidx < max_uidx; ++uidx) { ++ if (clkFinal[uidx]) { ++ printk(KERN_INFO "idx %d val %08x clk %d ps %d\n", ++ uidx, upm[uidx].value, ++ clkFinal[uidx], psFinal[uidx]); ++ } ++ } ++#endif ++ ++ data_len = upm_gen_final_data(upm, max_uidx, clkFinal, data); ++ ++#if DEBUG_UPM ++ for (uidx = 0; uidx < data_len; ++uidx) { ++ printk(KERN_INFO "cf UPM x result: idx %d val %08x\n", ++ uidx, data[uidx]); ++ } ++#endif ++ return 0; ++} ++ ++static int gen_upm_data(int mode, struct rbppc_cf_info *info, unsigned *data) { ++ int i; ++ ++ for (i = 0; i < UPM_DATA_SIZE; ++i) { ++ data[i] = EMPTY; ++ } ++ ++ if (conv_upm_table(cfUpmReadSingle, mode, info, data + UPM_READ_SINGLE_OFFSET)) { ++ return -1; ++ } ++ if (conv_upm_table(cfUpmWriteSingle, mode, info, data + UPM_WRITE_SINGLE_OFFSET)) { ++ return -1; ++ } ++ return 0; ++} ++ ++static void rbppc_cf_program_upm(void *upmMemAddr, volatile void *lbcfg_mxmr, volatile void *lbcfg_mdr, const unsigned *upmData, unsigned offset, unsigned len) { ++ unsigned i; ++ unsigned mxmr; ++ ++ mxmr = in_be32(lbcfg_mxmr); ++ mxmr &= ~(MxMR_OP_MASK | MxMR_MAD_MASK); ++ mxmr |= (MxMR_OP_WRITE | offset); ++ out_be32(lbcfg_mxmr, mxmr); ++ in_be32(lbcfg_mxmr); /* flush MxMR write */ ++ ++ for (i = 0; i < len; ++i) { ++ int to; ++ unsigned data = upmData[i + offset]; ++ out_be32(lbcfg_mdr, data); ++ in_be32(lbcfg_mdr); /* flush MDR write */ ++ ++ iowrite8(1, upmMemAddr); /* dummy write to any CF addr */ ++ ++ /* wait for dummy write to complete */ ++ for (to = 10000; to >= 0; --to) { ++ mxmr = in_be32(lbcfg_mxmr); ++ if (((mxmr ^ (i + 1)) & MxMR_MAD_MASK) == 0) { ++ break; ++ } ++ if (to == 0) { ++ printk(KERN_ERR "rbppc_cf_program_upm: UPMx program error at 0x%x: Timeout\n", i); ++ } ++ } ++ } ++ mxmr &= ~(MxMR_OP_MASK | MxMR_RLF_MASK | MxMR_WLF_MASK); ++ mxmr |= (MxMR_OP_NORMAL | (LOOP_SIZE << MxMR_RLF_SHIFT) | (LOOP_SIZE << MxMR_WLF_SHIFT)); ++ out_be32(lbcfg_mxmr, mxmr); ++} ++ ++static int rbppc_cf_update_piomode(struct ata_port *ap, int mode) { ++ struct rbppc_cf_info *info = (struct rbppc_cf_info *)ap->host->private_data; ++ void *lbcfgBase; ++ unsigned upmData[UPM_DATA_SIZE]; ++ ++ if (gen_upm_data(mode, info, upmData)) { ++ return -1; ++ } ++ ++ lbcfgBase = ioremap_nocache(info->lbcfg_addr, IMMR_LBCFG_SIZE); ++ ++ rbppc_cf_program_upm(ap->ioaddr.cmd_addr, ((char *)lbcfgBase) + LOCAL_BUS_MCMR, ((char *)lbcfgBase) + LOCAL_BUS_MDR, upmData, 0, UPM_DATA_SIZE); ++ iounmap(lbcfgBase); ++ return 0; ++} ++ ++static void rbppc_cf_set_piomode(struct ata_port *ap, struct ata_device *adev) ++{ ++ struct rbppc_cf_info *info = (struct rbppc_cf_info *)ap->host->private_data; ++ int mode = adev->pio_mode - XFER_PIO_0; ++ ++ DPRINTK("rbppc_cf_set_piomode: PIO %d\n", mode); ++ if (mode < 0) mode = 0; ++ if (mode > 6) mode = 6; ++ ++ if (info->cur_mode < 0 || info->cur_mode > mode) { ++ if (rbppc_cf_update_piomode(ap, mode) == 0) { ++ printk(KERN_INFO "rbppc_cf_set_piomode: PIO mode changed to %d\n", mode); ++ info->cur_mode = mode; ++ } ++ } ++} ++ ++static struct scsi_host_template rbppc_cf_sht = { ++ ATA_BASE_SHT(DRV_NAME), ++}; ++ ++static struct ata_port_operations rbppc_cf_port_ops = { ++ .inherits = &ata_bmdma_port_ops, ++ ++ .sff_check_status = rbppc_cf_check_status, ++ .sff_check_altstatus = rbppc_cf_check_altstatus, ++ ++ .set_piomode = rbppc_cf_set_piomode, ++ ++ .port_start = rbppc_cf_dummy_ret0, ++ ++ .sff_irq_clear = rbppc_cf_dummy_noret, ++}; ++ ++static int rbppc_cf_init_info(struct of_device *pdev, struct rbppc_cf_info *info) { ++ struct device_node *np; ++ struct resource res; ++ const u32 *u32ptr; ++ void *lbcfgBase; ++ void *lbcfg_lcrr; ++ unsigned lbc_clk_khz; ++ unsigned lbc_extra_divider = 1; ++ unsigned ccb_freq_hz; ++ unsigned lb_div; ++ ++ u32ptr = of_get_property(pdev->node, "lbc_extra_divider", NULL); ++ if (u32ptr && *u32ptr) { ++ lbc_extra_divider = *u32ptr; ++#if DEBUG_UPM ++ printk(KERN_INFO "rbppc_cf_init_info: LBC extra divider %u\n", ++ lbc_extra_divider); ++#endif ++ } ++ ++ np = of_find_node_by_type(NULL, "serial"); ++ if (!np) { ++ printk(KERN_ERR "rbppc_cf_init_info: No serial node found\n"); ++ return -1; ++ } ++ u32ptr = of_get_property(np, "clock-frequency", NULL); ++ if (u32ptr == 0 || *u32ptr == 0) { ++ printk(KERN_ERR "rbppc_cf_init_info: Serial does not have clock-frequency\n"); ++ of_node_put(np); ++ return -1; ++ } ++ ccb_freq_hz = *u32ptr; ++ of_node_put(np); ++ ++ np = of_find_node_by_type(NULL, "soc"); ++ if (!np) { ++ printk(KERN_ERR "rbppc_cf_init_info: No soc node found\n"); ++ return -1; ++ } ++ if (of_address_to_resource(np, 0, &res)) { ++ printk(KERN_ERR "rbppc_cf_init_info: soc does not have resource\n"); ++ of_node_put(np); ++ return -1; ++ } ++ info->lbcfg_addr = res.start + IMMR_LBCFG_OFFSET; ++ of_node_put(np); ++ ++ lbcfgBase = ioremap_nocache(info->lbcfg_addr, IMMR_LBCFG_SIZE); ++ lbcfg_lcrr = ((char*)lbcfgBase) + LOCAL_BUS_LCRR; ++ lb_div = (in_be32(lbcfg_lcrr) & LCRR_CLKDIV_MASK) * lbc_extra_divider; ++ iounmap(lbcfgBase); ++ ++ lbc_clk_khz = ccb_freq_hz / (1000 * lb_div); ++ info->clk_time_ps = 1000000000 / lbc_clk_khz; ++ printk(KERN_INFO "rbppc_cf_init_info: Using Local-Bus clock %u kHz %u ps\n", ++ lbc_clk_khz, info->clk_time_ps); ++ ++ u32ptr = of_get_property(pdev->node, "lb-timings", NULL); ++ if (u32ptr) { ++ memcpy(info->lb_timings, u32ptr, LBT_SIZE * sizeof(*u32ptr)); ++#if DEBUG_UPM ++ printk(KERN_INFO "rbppc_cf_init_info: Got LB timings <%u %u %u %u %u>\n", ++ u32ptr[0], u32ptr[1], u32ptr[2], u32ptr[3], u32ptr[4]); ++#endif ++ } ++ info->cur_mode = -1; ++ return 0; ++} ++ ++static int rbppc_cf_probe(struct of_device *pdev, ++ const struct of_device_id *match) ++{ ++ struct ata_host *host; ++ struct ata_port *ap; ++ struct rbppc_cf_info *info = NULL; ++ struct resource res; ++ void *baddr; ++ const u32 *u32ptr; ++ int irq_level = 0; ++ int err = -ENOMEM; ++ ++ printk(KERN_INFO "rbppc_cf_probe: MikroTik RouterBOARD 600 series Compact Flash PATA driver, version " DRV_VERSION "\n"); ++ ++ if (rbinfo == NULL) { ++ info = kmalloc(sizeof(*info), GFP_KERNEL); ++ if (info == NULL) { ++ printk(KERN_ERR "rbppc_cf_probe: Out of memory\n"); ++ goto err_info; ++ } ++ memset(info, 0, sizeof(*info)); ++ ++ if (rbppc_cf_init_info(pdev, info)) { ++ goto err_info; ++ } ++ rbinfo = info; ++ } ++ ++ u32ptr = of_get_property(pdev->node, "interrupt-at-level", NULL); ++ if (u32ptr) { ++ irq_level = *u32ptr; ++ printk(KERN_INFO "rbppc_cf_probe: IRQ level %u\n", irq_level); ++ } ++ ++ if (of_address_to_resource(pdev->node, 0, &res)) { ++ printk(KERN_ERR "rbppc_cf_probe: No reg property found\n"); ++ goto err_info; ++ } ++ ++ host = ata_host_alloc(&pdev->dev, 1); ++ if (!host) ++ goto err_info; ++ ++ baddr = localbus_map(res.start, res.end - res.start + 1); ++ host->iomap = baddr; ++ host->private_data = rbinfo; ++ ++ ap = host->ports[0]; ++ ap->ops = &rbppc_cf_port_ops; ++ ap->pio_mask = 0x7F; /* PIO modes 0-6 */ ++ ap->flags = ATA_FLAG_NO_LEGACY; ++ ap->mwdma_mask = 0; ++ ++ ap->ioaddr.cmd_addr = baddr; ++ ata_sff_std_ports(&ap->ioaddr); ++ ap->ioaddr.ctl_addr = ap->ioaddr.cmd_addr + 14; ++ ap->ioaddr.altstatus_addr = ap->ioaddr.ctl_addr; ++ ap->ioaddr.bmdma_addr = 0; ++ ++ err = ata_host_activate( ++ host, ++ irq_of_parse_and_map(pdev->node, 0), ata_sff_interrupt, ++ irq_level ? IRQF_TRIGGER_HIGH : IRQF_TRIGGER_LOW, ++ &rbppc_cf_sht); ++ if (!err) return 0; ++ ++ localbus_unmap(baddr); ++err_info: ++ if (info) { ++ kfree(info); ++ rbinfo = NULL; ++ } ++ return err; ++} ++ ++static int rbppc_cf_remove(struct of_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct ata_host *host = dev_get_drvdata(dev); ++ ++ if (host == NULL) return -1; ++ ++ ata_host_detach(host); ++ return 0; ++} ++ ++static struct of_device_id rbppc_cf_ids[] = { ++ { .name = "cf", }, ++ { }, ++}; ++ ++static struct of_platform_driver rbppc_cf_driver = { ++ .name = "cf", ++ .probe = rbppc_cf_probe, ++ .remove = rbppc_cf_remove, ++ .match_table = rbppc_cf_ids, ++ .driver = { ++ .name = "rbppc-cf", ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++static int __init rbppc_init(void) ++{ ++ return of_register_platform_driver(&rbppc_cf_driver); ++} ++ ++static void __exit rbppc_exit(void) ++{ ++ of_unregister_platform_driver(&rbppc_cf_driver); ++} ++ ++MODULE_AUTHOR("Mikrotikls SIA"); ++MODULE_AUTHOR("Noah Fontes"); ++MODULE_DESCRIPTION("MikroTik RouterBOARD 600 series Compact Flash PATA driver"); ++MODULE_LICENSE("GPL"); ++MODULE_VERSION(DRV_VERSION); ++ ++module_init(rbppc_init); ++module_exit(rbppc_exit); +--- a/drivers/mtd/nand/Kconfig ++++ b/drivers/mtd/nand/Kconfig +@@ -403,6 +403,13 @@ config MTD_NAND_PLATFORM + devices. You will need to provide platform-specific functions + via platform_data. + ++config MTD_NAND_RB_PPC ++ tristate "MikroTik RB600 NAND support" ++ depends on MTD_NAND && MTD_PARTITIONS && RB_PPC ++ help ++ This option enables support for the NAND device on MikroTik ++ RouterBOARD 600 series boards. ++ + config MTD_ALAUDA + tristate "MTD driver for Olympus MAUSB-10 and Fujifilm DPC-R1" + depends on MTD_NAND && USB +--- a/drivers/mtd/nand/Makefile ++++ b/drivers/mtd/nand/Makefile +@@ -31,6 +31,7 @@ obj-$(CONFIG_MTD_NAND_BASLER_EXCITE) += + obj-$(CONFIG_MTD_NAND_PXA3xx) += pxa3xx_nand.o + obj-$(CONFIG_MTD_NAND_TMIO) += tmio_nand.o + obj-$(CONFIG_MTD_NAND_PLATFORM) += plat_nand.o ++obj-$(CONFIG_MTD_NAND_RB_PPC) += rbppc_nand.o + obj-$(CONFIG_MTD_ALAUDA) += alauda.o + obj-$(CONFIG_MTD_NAND_PASEMI) += pasemi_nand.o + obj-$(CONFIG_MTD_NAND_ORION) += orion_nand.o +--- /dev/null ++++ b/drivers/mtd/nand/rbppc_nand.c +@@ -0,0 +1,252 @@ ++/* ++ * Copyright (C) 2008-2009 Noah Fontes ++ * Copyright (C) 2009 Michael Guntsche ++ * Copyright (C) Mikrotik 2007 ++ * ++ * 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. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define DRV_NAME "rbppc_nand" ++#define DRV_VERSION "0.0.2" ++ ++static struct mtd_info rmtd; ++static struct nand_chip rnand; ++ ++struct rbppc_nand_info { ++ void *gpi; ++ void *gpo; ++ void *localbus; ++ ++ unsigned gpio_rdy; ++ unsigned gpio_nce; ++ unsigned gpio_cle; ++ unsigned gpio_ale; ++ unsigned gpio_ctrls; ++}; ++ ++/* We must use the OOB layout from yaffs 1 if we want this to be recognized ++ * properly. Borrowed from the OpenWRT patches for the RB532. ++ * ++ * See for more details. ++ */ ++static struct nand_ecclayout rbppc_nand_oob_16 = { ++ .eccbytes = 6, ++ .eccpos = { 8, 9, 10, 13, 14, 15 }, ++ .oobavail = 9, ++ .oobfree = { { 0, 4 }, { 6, 2 }, { 11, 2 }, { 4, 1 } } ++}; ++ ++static struct mtd_partition rbppc_nand_partition_info[] = { ++ { ++ name: "RouterBOARD NAND Boot", ++ offset: 0, ++ size: 4 * 1024 * 1024, ++ }, ++ { ++ name: "RouterBOARD NAND Main", ++ offset: MTDPART_OFS_NXTBLK, ++ size: MTDPART_SIZ_FULL, ++ }, ++}; ++ ++static int rbppc_nand_dev_ready(struct mtd_info *mtd) { ++ struct nand_chip *chip = mtd->priv; ++ struct rbppc_nand_info *priv = chip->priv; ++ ++ return in_be32(priv->gpi) & priv->gpio_rdy; ++} ++ ++static void rbppc_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) { ++ struct nand_chip *chip = mtd->priv; ++ struct rbppc_nand_info *priv = chip->priv; ++ ++ if (ctrl & NAND_CTRL_CHANGE) { ++ unsigned val = in_be32(priv->gpo); ++ if (!(val & priv->gpio_nce)) { ++ /* make sure Local Bus has done NAND operations */ ++ readb(priv->localbus); ++ } ++ ++ if (ctrl & NAND_CLE) { ++ val |= priv->gpio_cle; ++ } else { ++ val &= ~priv->gpio_cle; ++ } ++ if (ctrl & NAND_ALE) { ++ val |= priv->gpio_ale; ++ } else { ++ val &= ~priv->gpio_ale; ++ } ++ if (!(ctrl & NAND_NCE)) { ++ val |= priv->gpio_nce; ++ } else { ++ val &= ~priv->gpio_nce; ++ } ++ out_be32(priv->gpo, val); ++ ++ /* make sure GPIO output has changed */ ++ val ^= in_be32(priv->gpo); ++ if (val & priv->gpio_ctrls) { ++ printk(KERN_ERR "rbppc_nand_hwcontrol: NAND GPO change failed 0x%08x\n", val); ++ } ++ } ++ ++ if (cmd != NAND_CMD_NONE) writeb(cmd, chip->IO_ADDR_W); ++} ++ ++static void rbppc_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len) ++{ ++ struct nand_chip *chip = mtd->priv; ++ memcpy(buf, chip->IO_ADDR_R, len); ++} ++ ++static unsigned init_ok = 0; ++ ++static int rbppc_nand_probe(struct of_device *pdev, ++ const struct of_device_id *match) ++{ ++ struct device_node *gpio; ++ struct device_node *nnand; ++ struct resource res; ++ struct rbppc_nand_info *info; ++ void *baddr; ++ const unsigned *rdy, *nce, *cle, *ale; ++ ++ printk(KERN_INFO "rbppc_nand_probe: MikroTik RouterBOARD 600 series NAND driver, version " DRV_VERSION "\n"); ++ ++ info = kmalloc(sizeof(*info), GFP_KERNEL); ++ ++ rdy = of_get_property(pdev->node, "rdy", NULL); ++ nce = of_get_property(pdev->node, "nce", NULL); ++ cle = of_get_property(pdev->node, "cle", NULL); ++ ale = of_get_property(pdev->node, "ale", NULL); ++ ++ if (!rdy || !nce || !cle || !ale) { ++ printk(KERN_ERR "rbppc_nand_probe: GPIO properties are missing\n"); ++ goto err; ++ } ++ if (rdy[0] != nce[0] || rdy[0] != cle[0] || rdy[0] != ale[0]) { ++ printk(KERN_ERR "rbppc_nand_probe: Different GPIOs are not supported\n"); ++ goto err; ++ } ++ ++ gpio = of_find_node_by_phandle(rdy[0]); ++ if (!gpio) { ++ printk(KERN_ERR "rbppc_nand_probe: No GPIO<%x> node found\n", *rdy); ++ goto err; ++ } ++ if (of_address_to_resource(gpio, 0, &res)) { ++ printk(KERN_ERR "rbppc_nand_probe: No reg property in GPIO found\n"); ++ goto err; ++ } ++ info->gpo = ioremap_nocache(res.start, res.end - res.start + 1); ++ ++ if (!of_address_to_resource(gpio, 1, &res)) { ++ info->gpi = ioremap_nocache(res.start, res.end - res.start + 1); ++ } else { ++ info->gpi = info->gpo; ++ } ++ of_node_put(gpio); ++ ++ info->gpio_rdy = 1 << (31 - rdy[1]); ++ info->gpio_nce = 1 << (31 - nce[1]); ++ info->gpio_cle = 1 << (31 - cle[1]); ++ info->gpio_ale = 1 << (31 - ale[1]); ++ info->gpio_ctrls = info->gpio_nce | info->gpio_cle | info->gpio_ale; ++ ++ nnand = of_find_node_by_name(NULL, "nnand"); ++ if (!nnand) { ++ printk("rbppc_nand_probe: No nNAND found\n"); ++ goto err; ++ } ++ if (of_address_to_resource(nnand, 0, &res)) { ++ printk("rbppc_nand_probe: No reg property in nNAND found\n"); ++ goto err; ++ } ++ of_node_put(nnand); ++ info->localbus = ioremap_nocache(res.start, res.end - res.start + 1); ++ ++ if (of_address_to_resource(pdev->node, 0, &res)) { ++ printk("rbppc_nand_probe: No reg property found\n"); ++ goto err; ++ } ++ baddr = ioremap_nocache(res.start, res.end - res.start + 1); ++ ++ memset(&rnand, 0, sizeof(rnand)); ++ rnand.cmd_ctrl = rbppc_nand_cmd_ctrl; ++ rnand.dev_ready = rbppc_nand_dev_ready; ++ rnand.read_buf = rbppc_nand_read_buf; ++ rnand.IO_ADDR_W = baddr; ++ rnand.IO_ADDR_R = baddr; ++ rnand.priv = info; ++ ++ memset(&rmtd, 0, sizeof(rmtd)); ++ rnand.ecc.mode = NAND_ECC_SOFT; ++ rnand.ecc.layout = &rbppc_nand_oob_16; ++ rnand.chip_delay = 25; ++ rnand.options |= NAND_NO_AUTOINCR; ++ rmtd.priv = &rnand; ++ rmtd.owner = THIS_MODULE; ++ ++ if (nand_scan(&rmtd, 1) && nand_scan(&rmtd, 1) && nand_scan(&rmtd, 1) && nand_scan(&rmtd, 1)) { ++ printk(KERN_ERR "rbppc_nand_probe: RouterBOARD NAND device not found\n"); ++ return -ENXIO; ++ } ++ ++ add_mtd_partitions(&rmtd, rbppc_nand_partition_info, 2); ++ init_ok = 1; ++ return 0; ++ ++err: ++ kfree(info); ++ return -1; ++} ++ ++static struct of_device_id rbppc_nand_ids[] = { ++ { .name = "nand", }, ++ { }, ++}; ++ ++static struct of_platform_driver rbppc_nand_driver = { ++ .name = "nand", ++ .probe = rbppc_nand_probe, ++ .match_table = rbppc_nand_ids, ++ .driver = { ++ .name = "rbppc-nand", ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++static int __init rbppc_nand_init(void) ++{ ++ return of_register_platform_driver(&rbppc_nand_driver); ++} ++ ++static void __exit rbppc_nand_exit(void) ++{ ++ of_unregister_platform_driver(&rbppc_nand_driver); ++} ++ ++MODULE_AUTHOR("Mikrotikls SIA"); ++MODULE_AUTHOR("Noah Fontes"); ++MODULE_AUTHOR("Michael Guntsche"); ++MODULE_DESCRIPTION("MikroTik RouterBOARD 600 series NAND driver"); ++MODULE_LICENSE("GPL"); ++MODULE_VERSION(DRV_VERSION); ++ ++module_init(rbppc_nand_init); ++module_exit(rbppc_nand_exit); diff --git a/target/linux/mpc83xx/patches-2.6.32/002-powerpc_mkuboot.patch b/target/linux/mpc83xx/patches-2.6.32/002-powerpc_mkuboot.patch new file mode 100644 index 000000000..b13a9969e --- /dev/null +++ b/target/linux/mpc83xx/patches-2.6.32/002-powerpc_mkuboot.patch @@ -0,0 +1,30 @@ +--- a/arch/powerpc/boot/wrapper ++++ b/arch/powerpc/boot/wrapper +@@ -43,6 +43,9 @@ gzip=.gz + # cross-compilation prefix + CROSS= + ++# mkimage wrapper script ++MKIMAGE=$srctree/scripts/mkuboot.sh ++ + # directory for object and other files used by this script + object=arch/powerpc/boot + objbin=$object +@@ -263,7 +266,7 @@ membase=`${CROSS}objdump -p "$kernel" | + case "$platform" in + uboot) + rm -f "$ofile" +- mkimage -A ppc -O linux -T kernel -C gzip -a $membase -e $membase \ ++ ${MKIMAGE} -A ppc -O linux -T kernel -C gzip -a $membase -e $membase \ + $uboot_version -d "$vmz" "$ofile" + if [ -z "$cacheit" ]; then + rm -f "$vmz" +@@ -323,7 +326,7 @@ coff) + ;; + cuboot*) + gzip -f -9 "$ofile" +- mkimage -A ppc -O linux -T kernel -C gzip -a "$base" -e "$entry" \ ++ ${MKIMAGE} -A ppc -O linux -T kernel -C gzip -a "$base" -e "$entry" \ + $uboot_version -d "$ofile".gz "$ofile" + ;; + treeboot*) diff --git a/target/linux/mpc83xx/patches-2.6.32/003-powerpc_create_fit_uImages.patch b/target/linux/mpc83xx/patches-2.6.32/003-powerpc_create_fit_uImages.patch new file mode 100644 index 000000000..52899ce71 --- /dev/null +++ b/target/linux/mpc83xx/patches-2.6.32/003-powerpc_create_fit_uImages.patch @@ -0,0 +1,94 @@ +--- a/arch/powerpc/Makefile ++++ b/arch/powerpc/Makefile +@@ -157,7 +157,8 @@ drivers-$(CONFIG_OPROFILE) += arch/power + # Default to zImage, override when needed + all: zImage + +-BOOT_TARGETS = zImage zImage.initrd uImage zImage% dtbImage% treeImage.% cuImage.% simpleImage.% ++BOOT_TARGETS = zImage zImage.initrd uImage uImage.fit.% zImage% dtbImage% \ ++ treeImage.% cuImage.% simpleImage.% + + PHONY += $(BOOT_TARGETS) + +@@ -184,6 +185,7 @@ define archhelp + @echo '* zImage - Build default images selected by kernel config' + @echo ' zImage.* - Compressed kernel image (arch/$(ARCH)/boot/zImage.*)' + @echo ' uImage - U-Boot native image format' ++ @echo ' uImage.fit.
- U-Boot Flattened Image Tree image format' + @echo ' cuImage.
- Backwards compatible U-Boot image for older' + @echo ' versions which do not support device trees' + @echo ' dtbImage.
- zImage with an embedded device tree blob' +--- a/arch/powerpc/boot/.gitignore ++++ b/arch/powerpc/boot/.gitignore +@@ -19,6 +19,7 @@ kernel-vmlinux.strip.c + kernel-vmlinux.strip.gz + mktree + uImage ++uImage.fit.* + cuImage.* + dtbImage.* + treeImage.* +--- a/arch/powerpc/boot/Makefile ++++ b/arch/powerpc/boot/Makefile +@@ -308,6 +308,9 @@ $(obj)/zImage.iseries: vmlinux + $(obj)/uImage: vmlinux $(wrapperbits) + $(call if_changed,wrap,uboot) + ++$(obj)/uImage.fit.%: vmlinux $(obj)/%.dtb $(wrapperbits) ++ $(call if_changed,wrap,uboot.fit,,$(obj)/$*.dtb) ++ + $(obj)/cuImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits) + $(call if_changed,wrap,cuboot-$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz) + +@@ -347,7 +350,7 @@ install: $(CONFIGURE) $(addprefix $(obj) + + # anything not in $(targets) + clean-files += $(image-) $(initrd-) cuImage.* dtbImage.* treeImage.* \ +- zImage zImage.initrd zImage.chrp zImage.coff zImage.holly \ ++ uImage.* zImage zImage.initrd zImage.chrp zImage.coff zImage.holly \ + zImage.iseries zImage.miboot zImage.pmac zImage.pseries \ + simpleImage.* otheros.bld *.dtb + +--- a/arch/powerpc/boot/wrapper ++++ b/arch/powerpc/boot/wrapper +@@ -46,6 +46,9 @@ CROSS= + # mkimage wrapper script + MKIMAGE=$srctree/scripts/mkuboot.sh + ++# script to generate an .its file for uImage.fit.* images ++MKITS=$srctree/scripts/mkits.sh ++ + # directory for object and other files used by this script + object=arch/powerpc/boot + objbin=$object +@@ -157,7 +160,7 @@ coff) + lds=$object/zImage.coff.lds + link_address='0x500000' + ;; +-miboot|uboot) ++miboot|uboot|uboot.fit) + # miboot and U-boot want just the bare bits, not an ELF binary + ext=bin + objflags="-O binary" +@@ -273,6 +276,21 @@ uboot) + fi + exit 0 + ;; ++uboot.fit) ++ rm -f "$ofile" ++ ${MKITS} -A ppc -C gzip -a $membase -e $membase -v $version \ ++ -d "$srctree/$dtb" -k "$srctree/$vmz" -o "$object/uImage.its" ++ ++ # mkimage calls dtc for FIT images so use kernel dtc if necessary ++ export PATH=$PATH:$srctree/scripts/dtc ++ ++ ${MKIMAGE} -f "$object/uImage.its" "$ofile" ++ rm "$object/uImage.its" ++ if [ -z "$cacheit" ]; then ++ rm -f "$vmz" ++ fi ++ exit 0 ++ ;; + esac + + addsec() { From 8fce8f5924d94f74cd239d0cb416a1d1344a5ef5 Mon Sep 17 00:00:00 2001 From: thepeople Date: Fri, 12 Feb 2010 01:12:11 +0000 Subject: [PATCH 24/44] update kernel from 2.6.32.7 to 2.6.32.8, thanks tripolar git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19591 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- include/kernel-version.mk | 4 ++-- target/linux/ar71xx/Makefile | 2 +- target/linux/avr32/Makefile | 2 +- target/linux/cobalt/Makefile | 2 +- target/linux/etrax/Makefile | 2 +- target/linux/gemini/Makefile | 2 +- target/linux/iop32x/Makefile | 2 +- target/linux/ixp4xx/Makefile | 2 +- target/linux/omap35xx/Makefile | 2 +- target/linux/pxa/Makefile | 2 +- target/linux/ramips/Makefile | 2 +- target/linux/xburst/Makefile | 2 +- 12 files changed, 13 insertions(+), 13 deletions(-) diff --git a/include/kernel-version.mk b/include/kernel-version.mk index b2810ce75..1d259e38d 100644 --- a/include/kernel-version.mk +++ b/include/kernel-version.mk @@ -17,8 +17,8 @@ endif ifeq ($(LINUX_VERSION),2.6.31.12) LINUX_KERNEL_MD5SUM:=517be354b81b780e2f4b2ad614d030de endif -ifeq ($(LINUX_VERSION),2.6.32.7) - LINUX_KERNEL_MD5SUM:=d59aca06609cedabe4d6d161d9f11113 +ifeq ($(LINUX_VERSION),2.6.32.8) + LINUX_KERNEL_MD5SUM:=82023ede52f067fcc55c5e70b02e48ae endif # disable the md5sum check for unknown kernel versions diff --git a/target/linux/ar71xx/Makefile b/target/linux/ar71xx/Makefile index 934055652..fe5af4b62 100644 --- a/target/linux/ar71xx/Makefile +++ b/target/linux/ar71xx/Makefile @@ -12,7 +12,7 @@ BOARDNAME:=Atheros AR71xx/AR7240/AR913x FEATURES:=squashfs jffs2 tgz CFLAGS:=-Os -pipe -mips32r2 -mtune=mips32r2 -funit-at-a-time -LINUX_VERSION:=2.6.32.7 +LINUX_VERSION:=2.6.32.8 include $(INCLUDE_DIR)/target.mk diff --git a/target/linux/avr32/Makefile b/target/linux/avr32/Makefile index caa8928e0..ae67e5457 100644 --- a/target/linux/avr32/Makefile +++ b/target/linux/avr32/Makefile @@ -10,7 +10,7 @@ ARCH:=avr32 BOARD:=avr32 BOARDNAME:=Atmel AVR32 FEATURES:=squashfs -LINUX_VERSION:=2.6.32.7 +LINUX_VERSION:=2.6.32.8 include $(INCLUDE_DIR)/target.mk diff --git a/target/linux/cobalt/Makefile b/target/linux/cobalt/Makefile index d3a57292c..9077622bd 100644 --- a/target/linux/cobalt/Makefile +++ b/target/linux/cobalt/Makefile @@ -12,7 +12,7 @@ BOARDNAME:=Cobalt Microservers FEATURES:=tgz pci ext2 CFLAGS:=-O2 -pipe -mtune=r5000 -funit-at-a-time -LINUX_VERSION:=2.6.32.7 +LINUX_VERSION:=2.6.32.8 include $(INCLUDE_DIR)/target.mk diff --git a/target/linux/etrax/Makefile b/target/linux/etrax/Makefile index 88430c18d..ec93e06f5 100644 --- a/target/linux/etrax/Makefile +++ b/target/linux/etrax/Makefile @@ -10,7 +10,7 @@ ARCH:=cris BOARD:=etrax BOARDNAME:=Foxboard (ETRAX 100LX) FEATURES:=squashfs jffs2 -LINUX_VERSION:=2.6.32.7 +LINUX_VERSION:=2.6.32.8 DEVICE_TYPE= include $(INCLUDE_DIR)/target.mk diff --git a/target/linux/gemini/Makefile b/target/linux/gemini/Makefile index d23322735..45c31805b 100644 --- a/target/linux/gemini/Makefile +++ b/target/linux/gemini/Makefile @@ -12,7 +12,7 @@ BOARDNAME:=Cortina Systems CS351x FEATURES:=squashfs CFLAGS:=-Os -pipe -march=armv4 -mtune=arm9tdmi -funit-at-a-time -LINUX_VERSION:=2.6.32.7 +LINUX_VERSION:=2.6.32.8 include $(INCLUDE_DIR)/target.mk diff --git a/target/linux/iop32x/Makefile b/target/linux/iop32x/Makefile index d5f419e6c..291522b1c 100644 --- a/target/linux/iop32x/Makefile +++ b/target/linux/iop32x/Makefile @@ -11,7 +11,7 @@ BOARD:=iop32x BOARDNAME:=Intel IOP32x FEATURES:=squashfs -LINUX_VERSION:=2.6.32.7 +LINUX_VERSION:=2.6.32.8 include $(INCLUDE_DIR)/target.mk diff --git a/target/linux/ixp4xx/Makefile b/target/linux/ixp4xx/Makefile index 425185069..9b719ec99 100644 --- a/target/linux/ixp4xx/Makefile +++ b/target/linux/ixp4xx/Makefile @@ -12,7 +12,7 @@ BOARDNAME:=Intel IXP4xx FEATURES:=squashfs SUBTARGETS=generic harddisk -LINUX_VERSION:=2.6.32.7 +LINUX_VERSION:=2.6.32.8 include $(INCLUDE_DIR)/target.mk diff --git a/target/linux/omap35xx/Makefile b/target/linux/omap35xx/Makefile index cc95fe68e..adf27a94a 100644 --- a/target/linux/omap35xx/Makefile +++ b/target/linux/omap35xx/Makefile @@ -12,7 +12,7 @@ BOARDNAME:=TI OMAP35xx FEATURES:=broken SUBTARGETS=generic -LINUX_VERSION:=2.6.32.7 +LINUX_VERSION:=2.6.32.8 KERNELNAME:="uImage" DEVICE_TYPE=developerboard diff --git a/target/linux/pxa/Makefile b/target/linux/pxa/Makefile index f63a1f32a..36cb5b778 100644 --- a/target/linux/pxa/Makefile +++ b/target/linux/pxa/Makefile @@ -11,7 +11,7 @@ BOARD:=pxa BOARDNAME:=Marvell/Intel PXA2xx FEATURES:=squashfs -LINUX_VERSION:=2.6.32.7 +LINUX_VERSION:=2.6.32.8 include $(INCLUDE_DIR)/target.mk diff --git a/target/linux/ramips/Makefile b/target/linux/ramips/Makefile index ceef88e58..2e04deb55 100644 --- a/target/linux/ramips/Makefile +++ b/target/linux/ramips/Makefile @@ -13,7 +13,7 @@ SUBTARGETS:=rt288x rt305x CFLAGS:=-Os -pipe -mips32r2 -mtune=mips32r2 -funit-at-a-time FEATURES:=squashfs broken -LINUX_VERSION:=2.6.32.7 +LINUX_VERSION:=2.6.32.8 include $(INCLUDE_DIR)/target.mk DEFAULT_PACKAGES+=kmod-leds-gpio diff --git a/target/linux/xburst/Makefile b/target/linux/xburst/Makefile index 51fe564f0..7707c7604 100644 --- a/target/linux/xburst/Makefile +++ b/target/linux/xburst/Makefile @@ -11,7 +11,7 @@ BOARD:=xburst BOARDNAME:=XBurst JZ47x0 FEATURES:=jffs2 tgz ubifs -LINUX_VERSION:=2.6.32.7 +LINUX_VERSION:=2.6.32.8 DEVICE_TYPE=other From a0fa134a9e0b11b1d8877f60a731c68c390601a3 Mon Sep 17 00:00:00 2001 From: thepeople Date: Fri, 12 Feb 2010 01:14:56 +0000 Subject: [PATCH 25/44] update brcm47xx to .32, thanks tripolar git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19592 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/brcm47xx/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/linux/brcm47xx/Makefile b/target/linux/brcm47xx/Makefile index b6666f769..9066868bf 100644 --- a/target/linux/brcm47xx/Makefile +++ b/target/linux/brcm47xx/Makefile @@ -11,7 +11,7 @@ BOARD:=brcm47xx BOARDNAME:=Broadcom BCM947xx/953xx FEATURES:=squashfs usb -LINUX_VERSION:=2.6.30.10 +LINUX_VERSION:=2.6.32.8 include $(INCLUDE_DIR)/target.mk DEFAULT_PACKAGES += wpad-mini kmod-switch kmod-diag nvram From bf0aeede47c20f8da9afbc1d17165eb11a79d38e Mon Sep 17 00:00:00 2001 From: thepeople Date: Fri, 12 Feb 2010 01:18:50 +0000 Subject: [PATCH 26/44] disable devtmpfs in 2.6.32 because its not used, thanks tripolar git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19594 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic-2.6/config-2.6.32 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/target/linux/generic-2.6/config-2.6.32 b/target/linux/generic-2.6/config-2.6.32 index e6d3c5e70..0493d7602 100644 --- a/target/linux/generic-2.6/config-2.6.32 +++ b/target/linux/generic-2.6/config-2.6.32 @@ -453,8 +453,8 @@ CONFIG_DEFAULT_WESTWOOD=y CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" # CONFIG_DEVKMEM is not set # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set -CONFIG_DEVTMPFS_MOUNT=y -CONFIG_DEVTMPFS=y +# CONFIG_DEVTMPFS_MOUNT is not set +# CONFIG_DEVTMPFS is not set # CONFIG_DGRS is not set # CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_DISPLAY_SUPPORT is not set From accff9a4a72195bc2be35d0edfcd1f4f51954971 Mon Sep 17 00:00:00 2001 From: thepeople Date: Fri, 12 Feb 2010 01:37:02 +0000 Subject: [PATCH 27/44] Here is LVM support for OpenWRT. It introduces 3 new packages: - kmod-dm for the device mapper kernel module. - kmod-libdevmapper for the device-mapper library. - kmod-lvm2 for the lvm tool. Note that it currently does not create the symlinks for all the lvm tools, so you have to use lvm pvs rather than just pvs. Thanks Stefan Monnier git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19595 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../files/etc/hotplug2-common.rules | 6 ++++ package/kernel/modules/block.mk | 29 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/package/base-files/files/etc/hotplug2-common.rules b/package/base-files/files/etc/hotplug2-common.rules index d6dd6e8a9..a7aba35a9 100644 --- a/package/base-files/files/etc/hotplug2-common.rules +++ b/package/base-files/files/etc/hotplug2-common.rules @@ -34,6 +34,12 @@ DEVPATH is set, SUBSYSTEM ~~ (input) { makedev /dev/input/%DEVICENAME% 0644 } +DEVICENAME == device-mapper { + nothrottle + makedev /dev/mapper/control 0600 +} + + DEVPATH is set { nothrottle makedev /dev/%DEVICENAME% 0644 diff --git a/package/kernel/modules/block.mk b/package/kernel/modules/block.mk index b1804337c..34c6f9927 100644 --- a/package/kernel/modules/block.mk +++ b/package/kernel/modules/block.mk @@ -360,6 +360,35 @@ endef $(eval $(call KernelPackage,nbd)) +define KernelPackage/dm + SUBMENU:=$(BLOCK_MENU) + TITLE:=Device Mapper + # All the "=n" are unnecessary, they're only there + # to stop the config from asking the question. + # MIRROR is M because I've needed it for pvmove. + KCONFIG:= \ + CONFIG_BLK_DEV_MD=n \ + CONFIG_DM_DEBUG=n \ + CONFIG_DM_CRYPT=n \ + CONFIG_DM_UEVENT=n \ + CONFIG_DM_DELAY=n \ + CONFIG_DM_MULTIPATH=n \ + CONFIG_DM_ZERO=n \ + CONFIG_DM_SNAPSHOT=n \ + CONFIG_MD=y \ + CONFIG_BLK_DEV_DM \ + CONFIG_DM_MIRROR + FILES:=$(LINUX_DIR)/drivers/md/dm-*.$(LINUX_KMOD_SUFFIX) + AUTOLOAD:=$(call AutoLoad,30,dm-mod dm-region-hash dm-mirror dm-log) +endef + +define KernelPackage/dm/description + Kernel module necessary for LVM2 support +endef + +$(eval $(call KernelPackage,dm)) + + define KernelPackage/pata-rb153-cf $(call KernelPackage/ata/Depends,@TARGET_adm5120_router_le) TITLE:=RouterBOARD 153 CF Slot support From d5df4c3d39c6c0bce96225fca6ff5a2b4d6db521 Mon Sep 17 00:00:00 2001 From: thepeople Date: Fri, 12 Feb 2010 01:40:57 +0000 Subject: [PATCH 28/44] [tools/wrt350nv2-builder] Update to v2.1 Stays closer to the stock firmware by using wrt350n.bin for the created image. Adds the possibility to create the image in two separate steps (-b / -z). Makefiles now support the possibility to include a u-boot image for a 100%-stock-like image. Signed off by: Matthias Buecher git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19596 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/orion/image/Makefile | 18 +- tools/wrt350nv2-builder/Makefile | 10 +- .../wrt350nv2-builder/src/wrt350nv2-builder.c | 206 ++++++++++-------- 3 files changed, 130 insertions(+), 104 deletions(-) diff --git a/target/linux/orion/image/Makefile b/target/linux/orion/image/Makefile index c6c790ffb..9577cd9a9 100644 --- a/target/linux/orion/image/Makefile +++ b/target/linux/orion/image/Makefile @@ -1,5 +1,5 @@ # -# Copyright (C) 2008-2009 OpenWrt.org +# Copyright (C) 2008-2010 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -61,14 +61,18 @@ define Image/Build/Linksys # create parameter file echo ":kernel $5 ${BIN_DIR}/openwrt-$2-uImage" >"${TMP_DIR}/$2_webupgrade/$2.par" echo ":rootfs 0 ${KDIR}/root.$1" >>"${TMP_DIR}/$2_webupgrade/$2.par" -# create webupgrade image + [ ! -f "$(STAGING_DIR_HOST)/share/wrt350nv2-builder/u-boot.bin" ] || ( \ + echo ":u-boot 0 $(STAGING_DIR_HOST)/share/wrt350nv2-builder/u-boot.bin" >>"${TMP_DIR}/$2_webupgrade/$2.par"; ) +# create bin file for recovery and webupgrade image ( cd "${TMP_DIR}/$2_webupgrade"; \ "${STAGING_DIR_HOST}/bin/$2-builder" \ - -v "${TMP_DIR}/$2_webupgrade/$2.par" \ - "${BIN_DIR}/openwrt-$2-$1-webupgrade.img"; \ + -v -b "${TMP_DIR}/$2_webupgrade/$2.par"; \ ) # copy bin file as recovery image - $(CP) "${TMP_DIR}/$2_webupgrade/openwrt-$2-$1-webupgrade.bin" "$(BIN_DIR)/openwrt-$2-$1-recovery.bin" + $(CP) "${TMP_DIR}/$2_webupgrade/wrt350n.bin" "$(BIN_DIR)/openwrt-$2-$1-recovery.bin" +# create webupgrade image for stock firmware update mechanism + zip "${TMP_DIR}/$2_webupgrade/wrt350n.zip" "${TMP_DIR}/$2_webupgrade/wrt350n.bin" + "${STAGING_DIR_HOST}/bin/$2-builder" -v -z "${TMP_DIR}/$2_webupgrade/wrt350n.zip" "${BIN_DIR}/openwrt-$2-$1-webupgrade.img" rm -rf "${TMP_DIR}/$2_webupgrade" endef @@ -85,8 +89,10 @@ endef define Image/Build $(call Image/Build/$(1),$(1)) $(call Image/Build/Netgear,$(1),wnr854t,NG_WNR854T,$(1)) - $(call Image/Build/Linksys,$(1),wrt350nv2,WNR350Nv2,$(1),1048576) # 5th parameter is kernel mtd size 0x00100000 = 1048576 / 0x001A0000 = 1703936 $(call Image/Build/Freecom,$(1),dt2,DT,$(1)) +# Leave WRT350Nv2 at last position due to webimage dependency for zip +# 5th parameter is kernel mtd size, e.g. 0x00100000 = 1048576 or 0x001A0000 = 1703936 + $(call Image/Build/Linksys,$(1),wrt350nv2,WNR350Nv2,$(1),1048576) endef define Image/Build/squashfs diff --git a/tools/wrt350nv2-builder/Makefile b/tools/wrt350nv2-builder/Makefile index 648dd84db..b07f511f0 100644 --- a/tools/wrt350nv2-builder/Makefile +++ b/tools/wrt350nv2-builder/Makefile @@ -1,5 +1,5 @@ # -# Copyright (C) 2006-2009 OpenWrt.org +# Copyright (C) 2006-2010 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=wrt350nv2-builder -PKG_VERSION:=2.0 +PKG_VERSION:=2.1 HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/${PKG_NAME}-$(PKG_VERSION) @@ -24,10 +24,16 @@ endef define Host/Install $(INSTALL_DIR) $(STAGING_DIR_HOST)/bin $(INSTALL_BIN) $(HOST_BUILD_DIR)/wrt350nv2-builder $(STAGING_DIR_HOST)/bin/ +# optionally the builder can add a u-boot binary to create a complete webupgrade image, but this is not mandatory +# u-boot images from stock firmware are available at ftp://ftp.maddes.net/openwrt/kamikaze/orion/stock/binaries/ + [ ! -f "files/u-boot.bin" ] || ( \ + $(INSTALL_DIR) $(STAGING_DIR_HOST)/share/wrt350nv2-builder; \ + $(CP) files/u-boot.bin $(STAGING_DIR_HOST)/share/wrt350nv2-builder/; ) endef define Host/Clean rm -f $(STAGING_DIR_HOST)/bin/wrt350nv2-builder + rm -f $(STAGING_DIR_HOST)/share/wrt350nv2-builder endef $(eval $(call HostBuild)) diff --git a/tools/wrt350nv2-builder/src/wrt350nv2-builder.c b/tools/wrt350nv2-builder/src/wrt350nv2-builder.c index 36932863a..68001188b 100644 --- a/tools/wrt350nv2-builder/src/wrt350nv2-builder.c +++ b/tools/wrt350nv2-builder/src/wrt350nv2-builder.c @@ -1,8 +1,8 @@ /* - WRT350Nv2-Builder 2.0 (previously called buildimg) + WRT350Nv2-Builder 2.1 (previously called buildimg) Copyright (C) 2008-2009 Dirk Teurlings - Copyright (C) 2009 Matthias Buecher (http://www.maddes.net/) + Copyright (C) 2009-2010 Matthias Buecher (http://www.maddes.net/) 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 @@ -36,18 +36,19 @@ 1 wrt350nv2.par parameter file describing the image layout 2 wrt350nv2.img output file for linksys style image - An u-boot image inside the bin file is not necessary. + A u-boot image inside the bin file is not necessary. The version is not important. - The name of the bin file is not important. + The name of the bin file is not important, but still "wrt350n.bin" is used to + keep as close as possible to the stock firmware. Linksys assumes that no mtd will be used to its maximum, so the last 16 bytes of the mtd are abused to define the length of the next mtd content (4 bytes for size + 12 pad bytes). - At the end of "rootfs" additional 16 bytes are abused for some data and an + At the end of "rootfs" additional 16 bytes are abused for some data and a highly important eRcOmM identifier, so the last 32 bytes of "rootfs" are abused. - At the end of "u-boot" 128 bytes are abused for some data, a checksum and an + At the end of "u-boot" 128 bytes are abused for some data, a checksum and a highly important sErCoMm identifier. @@ -82,7 +83,7 @@ // version info -#define VERSION "2.0" +#define VERSION "2.1" char program_info[] = "WRT350Nv2-Builder v%s by Dirk Teurlings and Matthias Buecher (http://www.maddes.net/)\n"; // verbosity @@ -105,7 +106,8 @@ mtd_info mtd_rootfs = { "rootfs", 0, 0, NULL, 0L, { 0, 0 } }; mtd_info mtd_uboot = { "u-boot", 0, 0, NULL, 0L, { 0, 0 } }; #define ROOTFS_END_OFFSET 0x00760000 -#define ROOTFS_MIN_OFFSET 0x00700000 // should be filled up to here, to make sure that the zip file is big enough to pass the size check of the stock firmware +#define ROOTFS_MIN_OFFSET 0x00640000 // should be filled up to here, to make sure that the zip file is big enough to pass the size check of the stock firmware + // 2.0.17: filled up to 0x00640000, 2.0.19: filled up to 0x0670000 // rootfs statics via: hexdump -v -e '1/1 "0x%02X, "' -s 0x0075FFE0 -n 16 "wrt350n.bin" ; echo -en "\n" unsigned char product_id[] = { 0x00, 0x03 }; // seems to be a fixed value @@ -203,17 +205,17 @@ int parse_par_file(FILE *f_par) { // read next line into memory do { // allocate memory for input line - if (buffer == NULL) { + if (!buffer) { buffer = malloc(buffer_size); } - if (buffer == NULL) { + if (!buffer) { exitcode = 1; printf("parse_par_file: can not allocate %i bytes\n", (int) buffer_size); break; } line = fgets(buffer, buffer_size, f_par); - if (line == NULL) { + if (!line) { exitcode = ferror(f_par); if (exitcode) { printf("parse_par_file: %s\n", strerror(exitcode)); @@ -243,7 +245,7 @@ int parse_par_file(FILE *f_par) { buffer_size *= 2; lprintf(DEBUG_LVL2, " extending buffer to %i bytes\n", buffer_size); } while (1); - if (line == NULL || exitcode) { + if ((!line) || (exitcode)) { break; } @@ -262,17 +264,17 @@ int parse_par_file(FILE *f_par) { printf("line %i does not meet defined format (: )\n", lineno); } else { // populate mtd_info if supported mtd names - if (strcmp(string1, mtd_kernel.name) == 0) { + if (!strcmp(string1, mtd_kernel.name)) { mtd = &mtd_kernel; - } else if (strcmp(string1, mtd_rootfs.name) == 0) { + } else if (!strcmp(string1, mtd_rootfs.name)) { mtd = &mtd_rootfs; - } else if (strcmp(string1, mtd_uboot.name) == 0) { + } else if (!strcmp(string1, mtd_uboot.name)) { mtd = &mtd_uboot; } - if (mtd == NULL) { + if (!mtd) { printf("unknown mtd %s in line %i\n", string1, lineno); - } else if (mtd->filename != NULL) { + } else if (mtd->filename) { f_exitcode = 1; printf("mtd %s in line %i multiple definitions\n", string1, lineno); } else { @@ -281,7 +283,7 @@ int parse_par_file(FILE *f_par) { // Get file size f_in = fopen(mtd->filename, "rb"); - if (f_in == NULL) { + if (!f_in) { f_exitcode = errno; printf("input file %s: %s\n", mtd->filename, strerror(f_exitcode)); } else { @@ -320,7 +322,7 @@ int parse_par_file(FILE *f_par) { if (count != 2) { printf("line %i does not meet defined format (: \n", lineno); } else { - if (strcmp(string1, "version") == 0) { + if (!strcmp(string1, "version")) { // changing version fw_version[0] = 0x000000FF & ( value >> 8 ); fw_version[1] = 0x000000FF & value; @@ -337,9 +339,8 @@ int parse_par_file(FILE *f_par) { printf("line %i does not meet defined format (: )\n", lineno); } else { /* - if (strcmp(string1, "something") == 0) { - something = string2; - string2 = NULL; // do not free + if (!strcmp(string1, "something")) { + something = strdup(string2); } else { */ printf("unknown string variable %s in line %i\n", string1, lineno); @@ -382,7 +383,7 @@ int create_bin_file(char *bin_filename) { // allocate memory for bin file buffer = malloc(KERNEL_CODE_OFFSET + FLASH_SIZE); - if (buffer == NULL) { + if (!buffer) { exitcode = 1; printf("create_bin_file: can not allocate %i bytes\n", FLASH_SIZE); } else { @@ -415,10 +416,10 @@ int create_bin_file(char *bin_filename) { printf("create_bin_file: unknown mtd %i\n", i); break; } - if (mtd == NULL) { + if (!mtd) { break; } - if (mtd->filename == NULL) { + if (!mtd->filename) { continue; } @@ -434,7 +435,7 @@ int create_bin_file(char *bin_filename) { // adding file content f_in = fopen(mtd->filename, "rb"); - if (f_in == NULL) { + if (!f_in) { exitcode = errno; printf("input file %s: %s\n", mtd->filename, strerror(exitcode)); } else { @@ -461,7 +462,7 @@ int create_bin_file(char *bin_filename) { lprintf(DEBUG, " padding offset 0x%08X length 0x%08X\n", addsize, padsize); f_in = fopen(rand_filename, "rb"); - if (f_in == NULL) { + if (!f_in) { exitcode = errno; printf("input file %s: %s\n", rand_filename, strerror(exitcode)); } else { @@ -514,7 +515,7 @@ int create_bin_file(char *bin_filename) { if (!exitcode) { lprintf(DEBUG, "writing file %s\n", bin_filename); f_out = fopen(bin_filename, "wb"); - if (f_out == NULL) { + if (!f_out) { exitcode = errno; printf("output file %s: %s\n", bin_filename, strerror(exitcode)); } else { @@ -547,18 +548,18 @@ int create_zip_file(char *zip_filename, char *bin_filename) { buffer = NULL; do { // allocate memory for command line - if (buffer == NULL) { + if (!buffer) { buffer = malloc(buffer_size); } - if (buffer == NULL) { + if (!buffer) { exitcode = 1; printf("create_zip_file: can not allocate %i bytes\n", (int) buffer_size); break; } // if buffer was not completely filled, then line fit in completely - count = snprintf(buffer, buffer_size, "zip %s %s", zip_filename, bin_filename); - if (count > -1 && count < buffer_size) { + count = snprintf(buffer, buffer_size, "zip \"%s\" \"%s\"", zip_filename, bin_filename); + if ((count > -1) && (count < buffer_size)) { break; } @@ -577,7 +578,7 @@ int create_zip_file(char *zip_filename, char *bin_filename) { // zipping binfile lprintf(DEBUG, "%s\n", buffer); count = system(buffer); - if (count < 0 || WEXITSTATUS(count)) { + if ((count < 0) || (WEXITSTATUS(count))) { exitcode = 1; printf("create_zip_file: can not execute %s bytes\n", buffer); } @@ -624,7 +625,7 @@ int create_img_file(FILE *f_out, char *out_filename, char *zip_filename) { if (!exitcode) { lprintf(DEBUG_LVL2, " adding zip file\n"); f_in = fopen(zip_filename, "rb"); - if (f_in == NULL) { + if (!f_in) { exitcode = errno; printf("input file %s: %s\n", zip_filename, strerror(exitcode)); } else { @@ -696,16 +697,17 @@ int main(int argc, char *argv[]) { int exitcode = 0; int help; + int onlybin; int havezip; char option; char *par_filename = NULL; - char *out_filename = NULL; + char *img_filename = NULL; char *base_filename = NULL; char *bin_filename = NULL; char *zip_filename = NULL; - FILE *f_par; - FILE *f_out; + FILE *f_par = NULL; + FILE *f_img = NULL; int i; mtd_info *mtd; @@ -722,19 +724,23 @@ int main(int argc, char *argv[]) { // command line processing // options help = 0; + onlybin = 0; havezip = 0; - while ((option = getopt(argc, argv, ":hzf:v")) != -1) { + while ((option = getopt(argc, argv, ":hbzf:v")) != -1) { switch(option) { case 'h': help = 1; break; + case 'b': + onlybin = 1; + break; case 'z': havezip = 1; break; case 'f': sizecheck = sscanf(optarg, "%i", &i); if (sizecheck != 1) { - printf("firmware version of -f option not a valid integer\n"); + printf("Firmware version of -f option not a valid integer\n"); exitcode = 1; } else { fw_version[0] = 0x000000FF & ( i >> 8 ); @@ -757,7 +763,7 @@ int main(int argc, char *argv[]) { // files for ( ; optind < argc; optind++) { - if (par_filename == NULL) { + if (!par_filename) { par_filename = argv[optind]; if (access(par_filename, R_OK)) { @@ -772,12 +778,12 @@ int main(int argc, char *argv[]) { continue; } - if (out_filename == NULL) { - out_filename = argv[optind]; + if ((!onlybin) && (!img_filename)) { + img_filename = argv[optind]; - if (!access(out_filename, F_OK)) { // if file already exists then check write access - if (access(out_filename, W_OK)) { - printf("No write access to output file %s\n", out_filename); + if (!access(img_filename, F_OK)) { // if file already exists then check write access + if (access(img_filename, W_OK)) { + printf("No write access to image file %s\n", img_filename); exitcode = 1; } } @@ -791,7 +797,7 @@ int main(int argc, char *argv[]) { } // file name checks - if (par_filename == NULL) { + if (!par_filename) { if (havezip) { printf("Zip file not stated\n"); } else { @@ -800,7 +806,7 @@ int main(int argc, char *argv[]) { exitcode = 1; } else { base_filename = basename(par_filename); - if (base_filename == NULL) { + if (!base_filename) { if (havezip) { printf("Zip file is a directory\n"); } else { @@ -810,33 +816,35 @@ int main(int argc, char *argv[]) { } } - if (out_filename == NULL) { - printf("Output file not stated\n"); - exitcode = 1; - } else { - base_filename = basename(out_filename); - if (base_filename == NULL) { - printf("Output file is a directory\n"); + if (!onlybin) { + if (!img_filename) { + printf("Image file not stated\n"); exitcode = 1; } else { - base_filename = strdup(base_filename); - zip_filename = strrchr(base_filename, '.'); - if (zip_filename != NULL) { - zip_filename[0] = 0; - zip_filename = NULL; // clean up + base_filename = basename(img_filename); + if (!base_filename) { + printf("Image file is a directory\n"); + exitcode = 1; } } } - // react on parameter problems or help request, and exit - if ((exitcode != 0) || help) { + // check for mutually exclusive options + if ((onlybin) && (havezip)) { + printf("Option -b and -z are mutually exclusive\n"); + exitcode = 1; + } + + // react on option problems or help request, then exit + if ((exitcode) || (help)) { if (help) { printf("This program creates Linksys style images for the WRT350Nv2 router.\n"); } printf(" Usage:\n\ - %s [-h] [-z] [-f ] [-v] \n\n\ + %s [-h] [-b] [-z] [-f ] [-v] []\n\n\ Options:\n\ -h - Show this help\n\ + -b - Create only bin file, no img or zip file is created\n\ -z - Have zip file, the img file will be directly created from it\n\ -f - Wanted firmware version to use with -z\n\ Default firmware version is 0x2019 = 2.00.19.\n\ @@ -853,29 +861,37 @@ int main(int argc, char *argv[]) { par_filename = NULL; } - lprintf(DEBUG_LVL2, " verbosity: %i\n", verbosity); - lprintf(DEBUG_LVL2, " program: %s\n", argv[0]); + lprintf(DEBUG_LVL2, " Verbosity: %i\n", verbosity); + lprintf(DEBUG_LVL2, " Program: %s\n", argv[0]); - lprintf(DEBUG, "Parameter file: %s\n", par_filename); - lprintf(DEBUG, "Output file: %s\n", out_filename); - lprintf(DEBUG_LVL2, " basename: %s (%i)\n", base_filename, strlen(base_filename)); + if (par_filename) { + lprintf(DEBUG, "Parameter file: %s\n", par_filename); + } + if (zip_filename) { + lprintf(DEBUG, "Zip file: %s\n", zip_filename); + } + if (img_filename) { + lprintf(DEBUG, "Image file: %s\n", img_filename); + } // open files from command line - // parameter file - if (par_filename != NULL) { - f_par = fopen(par_filename, "r"); - if (f_par == NULL) { + // parameter/zip file + if (par_filename) { + f_par = fopen(par_filename, "rt"); + if (!f_par) { exitcode = errno; - printf("input file %s: %s\n", par_filename, strerror(exitcode)); + printf("Input file %s: %s\n", par_filename, strerror(exitcode)); } } - // output file - f_out = fopen(out_filename, "w"); - if (f_out == NULL) { - exitcode = errno; - printf("Output file %s: %s\n", out_filename, strerror(exitcode)); + // image file + if (img_filename) { + f_img = fopen(img_filename, "wb"); + if (!f_img) { + exitcode = errno; + printf("Output file %s: %s\n", img_filename, strerror(exitcode)); + } } if (exitcode) { @@ -884,20 +900,20 @@ int main(int argc, char *argv[]) { // parameter file processing - if (!exitcode && par_filename != NULL) { + if ((!exitcode) && (f_par)) { lprintf(DEBUG, "parsing parameter file...\n"); exitcode = parse_par_file(f_par); lprintf(DEBUG, "...done parsing file\n"); } - if (par_filename != NULL) { + if (f_par) { fclose(f_par); } // check all input data - if (!exitcode && par_filename != NULL) { + if ((!exitcode) && (par_filename)) { lprintf(DEBUG, "checking mtd data...\n"); for (i = 1; i <= 3; i++) { @@ -936,20 +952,20 @@ int main(int argc, char *argv[]) { printf("unknown mtd check %i\n", i); break; } - if (mtd == NULL) { + if (!mtd) { break; } lprintf(DEBUG_LVL2, " checking mtd %s\n", mtd->name); // general checks - if (mandatory && mtd->filename == NULL) { + if ((mandatory) && (!mtd->filename)) { exitcode = 1; printf("mtd %s not specified correctly or at all in parameter file\n", mtd->name); } // end checks if no file data present - if (mtd->filename == NULL) { + if (!mtd->filename) { continue; } @@ -960,7 +976,7 @@ int main(int argc, char *argv[]) { // general magic number check if (magic[0]) { - if (mtd->magic[0] != magic[0] || mtd->magic[1] != magic[1]) { + if ((mtd->magic[0] != magic[0]) || (mtd->magic[1] != magic[1])) { exitcode = 1; printf("mtd %s input file %s has wrong magic number (0x%02X%02X)\n", mtd->name, mtd->filename, mtd->magic[0], mtd->magic[1]); } @@ -992,10 +1008,8 @@ int main(int argc, char *argv[]) { // bin creation in memory - if (!exitcode && par_filename != NULL) { - // create bin name from basename - bin_filename = malloc(strlen(base_filename)+10); - sprintf(bin_filename, "%s.bin", base_filename); + if ((!exitcode) && (par_filename)) { + bin_filename = "wrt350n.bin"; lprintf(DEBUG, "creating bin file %s...\n", bin_filename); @@ -1004,12 +1018,9 @@ int main(int argc, char *argv[]) { lprintf(DEBUG, "...done creating bin file\n"); } - // zip file creation - if (!exitcode && zip_filename == NULL) { - // create zip name from basename - zip_filename = malloc(strlen(base_filename)+10); - sprintf(zip_filename, "%s.zip", base_filename); + if ((!exitcode) && (!onlybin) && (!zip_filename)) { + zip_filename = "wrt350n.zip"; lprintf(DEBUG, "creating zip file %s...\n", zip_filename); @@ -1020,15 +1031,18 @@ int main(int argc, char *argv[]) { // img file creation - if (!exitcode) { + if ((!exitcode) && (f_img)) { lprintf(DEBUG, "creating img file...\n"); - exitcode = create_img_file(f_out, out_filename, zip_filename); + exitcode = create_img_file(f_img, img_filename, zip_filename); lprintf(DEBUG, "...done creating img file\n"); } - fclose(f_out); +// clean up + if (f_img) { + fclose(f_img); + } // end program return exitcode; From ef34750d84e32dd7fea46134ce353e4a73993229 Mon Sep 17 00:00:00 2001 From: jow Date: Fri, 12 Feb 2010 02:06:57 +0000 Subject: [PATCH 29/44] [package] base-files: revert dhcp state information on ifdown and restore pre-r19530 behaviour in udhcp default.script git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19597 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/base-files/Makefile | 2 +- package/base-files/files/lib/network/config.sh | 5 +++++ package/base-files/files/usr/share/udhcpc/default.script | 3 +-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/package/base-files/Makefile b/package/base-files/Makefile index fa0711fe2..5cd87a66f 100644 --- a/package/base-files/Makefile +++ b/package/base-files/Makefile @@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=base-files -PKG_RELEASE:=38 +PKG_RELEASE:=39 PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/ diff --git a/package/base-files/files/lib/network/config.sh b/package/base-files/files/lib/network/config.sh index 12b08a29f..b7d7b259a 100755 --- a/package/base-files/files/lib/network/config.sh +++ b/package/base-files/files/lib/network/config.sh @@ -327,6 +327,11 @@ setup_interface() { } } +stop_interface_dhcp() { + local config="$1" + uci -P /var/state revert "network.$config" +} + unbridge() { local dev="$1" local brdev diff --git a/package/base-files/files/usr/share/udhcpc/default.script b/package/base-files/files/usr/share/udhcpc/default.script index f704a7bf2..b32b2c9f2 100755 --- a/package/base-files/files/usr/share/udhcpc/default.script +++ b/package/base-files/files/usr/share/udhcpc/default.script @@ -31,8 +31,7 @@ setup_interface () { config_get old_subnet "$ifc" netmask } - [ "$1" = "ifup" ] \ - || [ "$ip" != "$old_ip" ] \ + [ "$ip" != "$old_ip" ] \ || [ "${broadcast:-+}" != "$old_broadcast" ] \ || [ "${subnet:-255.255.255.0}" != "$old_subnet" ] && { echo "udhcpc: ifconfig $interface $ip netmask ${subnet:-255.255.255.0} broadcast ${broadcast:-+}" From 825dd1f572bbac2d364f2522988bab6489f1a3b4 Mon Sep 17 00:00:00 2001 From: kaloz Date: Fri, 12 Feb 2010 09:39:51 +0000 Subject: [PATCH 30/44] remove 850-if_no_generic_time.patch -- breaks compilation and 2.6.32.8 already includes a fix for this.. git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19598 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../850-if_no_generic_time.patch | 22 ------------------- 1 file changed, 22 deletions(-) delete mode 100644 target/linux/generic-2.6/patches-2.6.32/850-if_no_generic_time.patch diff --git a/target/linux/generic-2.6/patches-2.6.32/850-if_no_generic_time.patch b/target/linux/generic-2.6/patches-2.6.32/850-if_no_generic_time.patch deleted file mode 100644 index 69370d065..000000000 --- a/target/linux/generic-2.6/patches-2.6.32/850-if_no_generic_time.patch +++ /dev/null @@ -1,22 +0,0 @@ -Provide a dummy implementation of clocksource_max_deferment() for such -platforms. - -Signed-off-by: Aaro Koskinen iki.fi> ---- - kernel/time/clocksource.c | 5 +++++ - 1 files changed, 5 insertions(+), 0 deletions(-) - ---- a/kernel/time/clocksource.c -+++ b/kernel/time/clocksource.c -@@ -502,6 +502,11 @@ static void clocksource_select(void) - - #else /* CONFIG_GENERIC_TIME */ - -+static inline u64 clocksource_max_deferment(struct clocksource *cs) -+{ -+ return 0; -+} -+ - static inline void clocksource_select(void) { } - - #endif From 3abdc13b68b44631def95b57d2c978aad201d945 Mon Sep 17 00:00:00 2001 From: jow Date: Fri, 12 Feb 2010 18:57:01 +0000 Subject: [PATCH 31/44] [package] base-files: add /dev/hvcX to hotplug common rules git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19608 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/base-files/files/etc/hotplug2-common.rules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/base-files/files/etc/hotplug2-common.rules b/package/base-files/files/etc/hotplug2-common.rules index a7aba35a9..6bc53dffe 100644 --- a/package/base-files/files/etc/hotplug2-common.rules +++ b/package/base-files/files/etc/hotplug2-common.rules @@ -1,5 +1,5 @@ -DEVICENAME ~~ (null|full|ptmx|tty|zero|gpio) { +DEVICENAME ~~ (null|full|ptmx|tty|zero|gpio|hvc) { nothrottle makedev /dev/%DEVICENAME% 0666 next From 9da43c2d735cc1c1e3402ac7a5f040869ddfd5d7 Mon Sep 17 00:00:00 2001 From: jow Date: Fri, 12 Feb 2010 18:57:47 +0000 Subject: [PATCH 32/44] [generic-2.6] add some missing symbols git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19609 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic-2.6/config-2.6.31 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/target/linux/generic-2.6/config-2.6.31 b/target/linux/generic-2.6/config-2.6.31 index 0d75a4673..6678ecc01 100644 --- a/target/linux/generic-2.6/config-2.6.31 +++ b/target/linux/generic-2.6/config-2.6.31 @@ -531,15 +531,18 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FB_FOREIGN_ENDIAN is not set # CONFIG_FB_GEODE is not set # CONFIG_FB_GOLDFISH is not set +# CONFIG_FB_HGA is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB is not set # CONFIG_FB_KYRO is not set +# CONFIG_FB_LE80578 is not set # CONFIG_FB_MACMODES is not set # CONFIG_FB_MATROX is not set # CONFIG_FB_MB862XX is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_N411 is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_NVIDIA is not set # CONFIG_FB_OF is not set @@ -579,6 +582,7 @@ CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y # CONFIG_FORCEDETH is not set CONFIG_FRAME_WARN=1024 +# CONFIG_FRAMEBUFFER_CONSOLE is not set # CONFIG_FREEZER is not set # CONFIG_FSCACHE is not set CONFIG_FSNOTIFY=y @@ -1093,6 +1097,7 @@ CONFIG_LOCKD_V4=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_LOGIRUMBLEPAD2_FF is not set # CONFIG_LOGITECH_FF is not set +# CONFIG_LOGO is not set # CONFIG_LSF is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_LXT_PHY is not set From 11b3d2a843fcc1a37b3c0b57f66b9637a38d7483 Mon Sep 17 00:00:00 2001 From: jow Date: Fri, 12 Feb 2010 19:01:10 +0000 Subject: [PATCH 33/44] [x86] add Xen DomU subtarget git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19610 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/x86/Makefile | 2 +- .../linux/x86/xen_domu/base-files/etc/inittab | 5 ++ target/linux/x86/xen_domu/config-2.6.31 | 84 +++++++++++++++++++ target/linux/x86/xen_domu/target.mk | 2 + 4 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 target/linux/x86/xen_domu/base-files/etc/inittab create mode 100644 target/linux/x86/xen_domu/config-2.6.31 create mode 100644 target/linux/x86/xen_domu/target.mk diff --git a/target/linux/x86/Makefile b/target/linux/x86/Makefile index 7389530a7..41b348341 100644 --- a/target/linux/x86/Makefile +++ b/target/linux/x86/Makefile @@ -10,7 +10,7 @@ ARCH:=i386 BOARD:=x86 BOARDNAME:=x86 FEATURES:=squashfs jffs2 ext2 vdi vmdk pcmcia tgz -SUBTARGETS=generic olpc +SUBTARGETS=generic olpc xen_domu LINUX_VERSION:=2.6.31.12 diff --git a/target/linux/x86/xen_domu/base-files/etc/inittab b/target/linux/x86/xen_domu/base-files/etc/inittab new file mode 100644 index 000000000..469b8a9a9 --- /dev/null +++ b/target/linux/x86/xen_domu/base-files/etc/inittab @@ -0,0 +1,5 @@ +::sysinit:/etc/init.d/rcS S boot +::shutdown:/etc/init.d/rcS K stop +tts/0::askfirst:/bin/ash --login +hvc0::askfirst:/bin/ash --login +tty1::askfirst:/bin/ash --login diff --git a/target/linux/x86/xen_domu/config-2.6.31 b/target/linux/x86/xen_domu/config-2.6.31 new file mode 100644 index 000000000..3d24d1673 --- /dev/null +++ b/target/linux/x86/xen_domu/config-2.6.31 @@ -0,0 +1,84 @@ +# CONFIG_ACPI_CUSTOM_DSDT is not set +# CONFIG_APM is not set +# CONFIG_DEBUG_BUGVERBOSE is not set +# CONFIG_KERNEL_LZMA is not set +# CONFIG_KVM_CLOCK is not set +# CONFIG_KVM_GUEST is not set +# CONFIG_LGUEST_GUEST is not set +# CONFIG_M386 is not set +# CONFIG_NETWORK_FILESYSTEMS is not set +# CONFIG_PARAVIRT_SPINLOCKS is not set +# CONFIG_PERF_COUNTERS is not set +# CONFIG_RWSEM_GENERIC_SPINLOCK is not set +# CONFIG_SCHED_SMT is not set +# CONFIG_VMI is not set +# CONFIG_X86_BIGSMP is not set +# CONFIG_X86_DS is not set +# CONFIG_X86_EXTENDED_PLATFORM is not set +# CONFIG_X86_PLATFORM_DEVICES is not set +# CONFIG_XENFS is not set +# CONFIG_XEN_DEBUG_FS is not set +# CONFIG_XEN_DEV_EVTCHN is not set +# CONFIG_XEN_NETDEV_FRONTEND is not set +CONFIG_ACPI_CONTAINER=y +CONFIG_ACPI_HOTPLUG_CPU=y +CONFIG_ARCH_PHYS_ADDR_T_64BIT=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_FREEZER=y +CONFIG_GENERIC_PENDING_IRQ=y +CONFIG_HAVE_KERNEL_LZO=y +CONFIG_HAVE_PERF_COUNTERS=y +CONFIG_HOTPLUG_CPU=y +CONFIG_HPET_EMULATE_RTC=y +CONFIG_HPET_TIMER=y +CONFIG_HVC_DRIVER=y +CONFIG_HVC_IRQ=y +CONFIG_HVC_XEN=y +CONFIG_KERNEL_GZIP=y +CONFIG_LOCK_KERNEL=y +CONFIG_MARKERS=y +CONFIG_MPENTIUM4=y +CONFIG_NR_CPUS=2 +CONFIG_PARAVIRT=y +CONFIG_PARAVIRT_CLOCK=y +CONFIG_PARAVIRT_GUEST=y +CONFIG_PCI_MMCONFIG=y +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +CONFIG_PNPACPI=y +CONFIG_POWER_SUPPLY=y +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_SCHED_MC=y +CONFIG_SMP=y +CONFIG_SPARSE_IRQ=y +CONFIG_STOP_MACHINE=y +CONFIG_SYS_HYPERVISOR=y +CONFIG_THERMAL=y +CONFIG_TRACEPOINTS=y +CONFIG_USE_GENERIC_SMP_HELPERS=y +CONFIG_X86_32_SMP=y +CONFIG_X86_BSWAP=y +CONFIG_X86_CMOV=y +CONFIG_X86_CMPXCHG64=y +CONFIG_X86_CMPXCHG=y +CONFIG_X86_DEBUGCTLMSR=y +CONFIG_X86_HT=y +CONFIG_X86_INVLPG=y +CONFIG_X86_L1_CACHE_SHIFT=7 +CONFIG_X86_MINIMUM_CPU_FAMILY=4 +CONFIG_X86_PAE=y +CONFIG_X86_POPAD_OK=y +CONFIG_X86_TRAMPOLINE=y +CONFIG_X86_TSC=y +CONFIG_X86_USE_PPRO_CHECKSUM=y +CONFIG_X86_WP_WORKS_OK=y +CONFIG_X86_XADD=y +CONFIG_XEN=y +CONFIG_XEN_BALLOON=y +CONFIG_XEN_BLKDEV_FRONTEND=y +CONFIG_XEN_MAX_DOMAIN_MEMORY=8 +CONFIG_XEN_SAVE_RESTORE=y +CONFIG_XEN_SCRUB_PAGES=y +CONFIG_XEN_SYS_HYPERVISOR=y diff --git a/target/linux/x86/xen_domu/target.mk b/target/linux/x86/xen_domu/target.mk new file mode 100644 index 000000000..bed064783 --- /dev/null +++ b/target/linux/x86/xen_domu/target.mk @@ -0,0 +1,2 @@ +BOARDNAME:=Xen Paravirt Guest +DEFAULT_PACKAGES += kmod-xen-fs kmod-xen-evtchn kmod-xen-netdev kmod-xen-kbddev From 3d5255904357dd10d58ad4e68f550de3674749e9 Mon Sep 17 00:00:00 2001 From: jow Date: Fri, 12 Feb 2010 19:01:45 +0000 Subject: [PATCH 34/44] [package] kernel: add xen kmods git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19611 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/kernel/modules/xen.mk | 110 ++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 package/kernel/modules/xen.mk diff --git a/package/kernel/modules/xen.mk b/package/kernel/modules/xen.mk new file mode 100644 index 000000000..e5f62ae42 --- /dev/null +++ b/package/kernel/modules/xen.mk @@ -0,0 +1,110 @@ +# +# Copyright (C) 2010 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +XEN_MENU:=Xen paravirtualized guest support + +define KernelPackage/xen-fs + SUBMENU:=$(XEN_MENU) + TITLE:=Xen filesystem + DEPENDS:=@TARGET_x86_xen_domu + KCONFIG:= \ + CONFIG_XENFS \ + CONFIG_XEN_COMPAT_XENFS=y + FILES:=$(LINUX_DIR)/drivers/xen/xenfs/xenfs.$(LINUX_KMOD_SUFFIX) + AUTOLOAD:=$(call AutoLoad,05,xenfs) +endef + +define KernelPackage/xen-fs/description + Kernel module for the Xen filesystem +endef + +$(eval $(call KernelPackage,xen-fs)) + + +define KernelPackage/xen-evtchn + SUBMENU:=$(XEN_MENU) + TITLE:=Xen event channels + DEPENDS:=@TARGET_x86_xen_domu + KCONFIG:=CONFIG_XEN_DEV_EVTCHN + FILES:=$(LINUX_DIR)/drivers/xen/evtchn.$(LINUX_KMOD_SUFFIX) + AUTOLOAD:=$(call AutoLoad,06,evtchn) +endef + +define KernelPackage/xen-evtchn/description + Kernel module for the /dev/xen/evtchn device +endef + +$(eval $(call KernelPackage,xen-evtchn)) + +# FIXME: the FB support should be moved to a separate kmod +define KernelPackage/xen-fbdev + SUBMENU:=$(XEN_MENU) + TITLE:=Xen virtual frame buffer + DEPENDS:=@TARGET_x86_xen_domu + KCONFIG:= \ + CONFIG_XEN_FBDEV_FRONTEND \ + CONFIG_FB \ + CONFIG_FB_DEFERRED_IO=y \ + CONFIG_FB_SYS_COPYAREA \ + CONFIG_FB_SYS_FILLRECT \ + CONFIG_FB_SYS_FOPS \ + CONFIG_FB_SYS_IMAGEBLIT \ + CONFIG_FIRMWARE_EDID=n + FILES:= \ + $(LINUX_DIR)/drivers/video/xen-fbfront.$(LINUX_KMOD_SUFFIX) \ + $(LINUX_DIR)/drivers/video/fb.$(LINUX_KMOD_SUFFIX) \ + $(LINUX_DIR)/drivers/video/syscopyarea.$(LINUX_KMOD_SUFFIX) \ + $(LINUX_DIR)/drivers/video/sysfillrect.$(LINUX_KMOD_SUFFIX) \ + $(LINUX_DIR)/drivers/video/fb_sys_fops.$(LINUX_KMOD_SUFFIX) \ + $(LINUX_DIR)/drivers/video/sysimgblt.$(LINUX_KMOD_SUFFIX) + AUTOLOAD:=$(call AutoLoad,07, \ + fb \ + syscopyarea \ + sysfillrect \ + fb_sys_fops \ + sysimgblt \ + xen-fbfront \ + ) +endef + +define KernelPackage/xen-fs/description + Kernel module for the Xen virtual frame buffer +endef + +$(eval $(call KernelPackage,xen-fbdev)) + + +define KernelPackage/xen-kbddev + SUBMENU:=$(XEN_MENU) + TITLE:=Xen virtual keyboard and mouse + DEPENDS:=@TARGET_x86_xen_domu + KCONFIG:=CONFIG_XEN_KBDDEV_FRONTEND + FILES:=$(LINUX_DIR)/drivers/input/xen-kbdfront.$(LINUX_KMOD_SUFFIX) + AUTOLOAD:=$(call AutoLoad,08,xen-kbdfront) +endef + +define KernelPackage/xen-kbddev/description + Kernel module for the Xen virtual keyboard and mouse +endef + +$(eval $(call KernelPackage,xen-kbddev)) + + +define KernelPackage/xen-netdev + SUBMENU:=$(XEN_MENU) + TITLE:=Xen network device frontend + DEPENDS:=@TARGET_x86_xen_domu + KCONFIG:=CONFIG_XEN_NETDEV_FRONTEND + FILES:=$(LINUX_DIR)/drivers/net/xen-netfront.$(LINUX_KMOD_SUFFIX) + AUTOLOAD:=$(call AutoLoad,09,xen-netfront) +endef + +define KernelPackage/xen-netdev/description + Kernel module for the Xen network device frontend +endef + +$(eval $(call KernelPackage,xen-netdev)) From 9ac055aef2eedfe1e0f988f9c247a6d024450622 Mon Sep 17 00:00:00 2001 From: jow Date: Fri, 12 Feb 2010 19:04:12 +0000 Subject: [PATCH 35/44] [x86] make console port editable through menuconfig, gzip ext2 images, add suitable defaults for Xen git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19612 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/x86/image/Config.in | 15 ++++++++++++--- target/linux/x86/image/Makefile | 13 ++++++++++--- target/linux/x86/image/menu.lst | 4 ++-- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/target/linux/x86/image/Config.in b/target/linux/x86/image/Config.in index e5a82da79..d52ae0c07 100644 --- a/target/linux/x86/image/Config.in +++ b/target/linux/x86/image/Config.in @@ -9,6 +9,13 @@ config X86_GRUB_IMAGES_PAD bool "Pad GRUB images to filesystem size (for JFFS2)" depends X86_GRUB_IMAGES +config X86_GRUB_CONSOLE + string + prompt "Serial port device" + depends X86_GRUB_IMAGES + default "hvc0" if TARGET_x86_xen_domu + default "ttyS0" if ! TARGET_x86_xen_domu + config X86_GRUB_BAUDRATE int "Serial port baud rate" depends X86_GRUB_IMAGES @@ -22,15 +29,17 @@ config X86_GRUB_KERNELPART config X86_GRUB_ROOTPART string prompt "Root partition on target device" if X86_GRUB_IMAGES - default "/dev/sda2" + default "/dev/xvda2" if TARGET_x86_xen_domu + default "/dev/sda2" if ! TARGET_x86_xen_domu help The root partition on the final device. If you don't know, - you probably want the default (/dev/hda2). + you probably want the default (/dev/sda2). config X86_GRUB_BOOTOPTS string prompt "Extra kernel boot options" if X86_GRUB_IMAGES - default "" + default "xencons=hvc" if TARGET_x86_xen_domu + default "" if ! TARGET_x86_xen_domu help If you don't know, just leave it blank. diff --git a/target/linux/x86/image/Makefile b/target/linux/x86/image/Makefile index 51490fa79..13712cf0e 100644 --- a/target/linux/x86/image/Makefile +++ b/target/linux/x86/image/Makefile @@ -1,5 +1,5 @@ # -# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2006-2010 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -20,6 +20,9 @@ ROOTPART=$(strip $(subst ",, $(CONFIG_OLPC_BOOTSCRIPT_ROOTPART))) endif #"))")) # fix vim's broken syntax highlighting +CONSOLE=$(strip $(subst ",, $(CONFIG_X86_GRUB_CONSOLE))) + + ifeq ($(CONFIG_X86_GRUB_IMAGES),y) ifneq ($(HOST_OS),Darwin) define Image/cmdline/squashfs @@ -47,6 +50,7 @@ ifneq ($(HOST_OS),Darwin) $(CP) $(KDIR)/bzImage $(KDIR)/root.grub/boot/vmlinuz sed \ -e 's#@CMDLINE@#$(strip $(call Image/cmdline/$(1))) $(BOOTOPTS)#g' \ + -e 's#@CONSOLE@#$(CONSOLE)#g' \ -e 's#@BAUDRATE@#$(CONFIG_X86_GRUB_BAUDRATE)#g' \ ./menu.lst > $(KDIR)/root.grub/boot/grub/menu.lst PADDING="$(CONFIG_X86_GRUB_IMAGES_PAD)" PATH="$(TARGET_PATH)" ./gen_image_x86.sh $(BIN_DIR)/openwrt-$(BOARD)-$(1).image $(CONFIG_X86_GRUB_KERNELPART) $(KDIR)/root.grub $(CONFIG_TARGET_ROOTFS_FSPART) $(KDIR)/root.$(1) @@ -153,13 +157,16 @@ endef define Image/Build $(call Image/Build/$(1)) $(call Image/Build/bootscript,$(1)) -ifneq ($(1),iso) + ifneq ($(1),iso) $(call Image/Build/grub,$(1)) $(call Image/Build/vdi,$(1)) $(call Image/Build/vmdk,$(1)) -endif + endif $(CP) $(KDIR)/root.$(1) $(BIN_DIR)/openwrt-$(BOARD)-$(1).fs $(CP) $(KDIR)/bzImage $(BIN_DIR)/openwrt-$(BOARD)-vmlinuz + ifeq ($(1),ext2) + gzip -f9 $(BIN_DIR)/openwrt-$(BOARD)-$(1).image + endif endef $(eval $(call BuildImage)) diff --git a/target/linux/x86/image/menu.lst b/target/linux/x86/image/menu.lst index cb306cc44..e09177c96 100644 --- a/target/linux/x86/image/menu.lst +++ b/target/linux/x86/image/menu.lst @@ -6,10 +6,10 @@ timeout 5 title OpenWrt root (hd0,0) -kernel /boot/vmlinuz @CMDLINE@ noinitrd console=tty0 console=ttyS0,@BAUDRATE@n8 reboot=bios +kernel /boot/vmlinuz @CMDLINE@ noinitrd console=tty0 console=@CONSOLE@,@BAUDRATE@n8 reboot=bios boot title OpenWrt (failsafe) root (hd0,0) -kernel /boot/vmlinuz failsafe=true @CMDLINE@ noinitrd console=tty0 console=ttyS0,@BAUDRATE@n8 reboot=bios +kernel /boot/vmlinuz failsafe=true @CMDLINE@ noinitrd console=tty0 console=@CONSOLE@,@BAUDRATE@n8 reboot=bios boot From 68ea568ac868272c4bf4412bd4c9fbe171e35e9c Mon Sep 17 00:00:00 2001 From: jow Date: Fri, 12 Feb 2010 22:37:17 +0000 Subject: [PATCH 36/44] [x86] add preinit xenfs mount handler git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19616 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../xen_domu/base-files/lib/preinit/45_mount_xenfs | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 target/linux/x86/xen_domu/base-files/lib/preinit/45_mount_xenfs diff --git a/target/linux/x86/xen_domu/base-files/lib/preinit/45_mount_xenfs b/target/linux/x86/xen_domu/base-files/lib/preinit/45_mount_xenfs new file mode 100644 index 000000000..7eb8bf795 --- /dev/null +++ b/target/linux/x86/xen_domu/base-files/lib/preinit/45_mount_xenfs @@ -0,0 +1,11 @@ +#!/bin/sh +# Copyright (C) 2010 OpenWrt.org + +do_mount_xenfs() { + [ -f /etc/modules.d/??-xenfs ] && { + insmod $(cat /etc/modules.d/??-xenfs) + mount none /proc/xen -t xenfs + } +} + +boot_hook_add preinit_mount_root do_mount_xenfs From 7c695d1132a225132ea98aa690aaccf86d9faa3a Mon Sep 17 00:00:00 2001 From: jow Date: Sat, 13 Feb 2010 00:37:11 +0000 Subject: [PATCH 37/44] [x86] prepare kernel 2.6.32 support git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19617 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic-2.6/config-2.6.32 | 5 + .../221-binfmt_elf_gcc4.1.patch | 2 +- .../240-packet_socket_type.patch | 22 +- .../patches-2.6.32/980-vm_exports.patch | 26 +- .../999-use_preinit_as_init.patch | 2 +- target/linux/x86/config-2.6.32 | 459 ++++++++++++++++++ .../patches-2.6.32/300-block2mtd_init.patch | 213 ++++++++ target/linux/x86/xen_domu/config-2.6.32 | 74 +++ 8 files changed, 777 insertions(+), 26 deletions(-) create mode 100644 target/linux/x86/config-2.6.32 create mode 100644 target/linux/x86/patches-2.6.32/300-block2mtd_init.patch create mode 100644 target/linux/x86/xen_domu/config-2.6.32 diff --git a/target/linux/generic-2.6/config-2.6.32 b/target/linux/generic-2.6/config-2.6.32 index 0493d7602..42666817b 100644 --- a/target/linux/generic-2.6/config-2.6.32 +++ b/target/linux/generic-2.6/config-2.6.32 @@ -542,15 +542,18 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FB_FOREIGN_ENDIAN is not set # CONFIG_FB_GEODE is not set # CONFIG_FB_GOLDFISH is not set +# CONFIG_FB_HGA is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB is not set # CONFIG_FB_KYRO is not set +# CONFIG_FB_LE80578 is not set # CONFIG_FB_MACMODES is not set # CONFIG_FB_MATROX is not set # CONFIG_FB_MB862XX is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_N411 is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_NVIDIA is not set # CONFIG_FB_OF is not set @@ -590,6 +593,7 @@ CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y # CONFIG_FORCEDETH is not set CONFIG_FRAME_WARN=1024 +# CONFIG_FRAMEBUFFER_CONSOLE is not set # CONFIG_FREEZER is not set # CONFIG_FSCACHE is not set CONFIG_FSNOTIFY=y @@ -1114,6 +1118,7 @@ CONFIG_LOCKD_V4=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_LOGIRUMBLEPAD2_FF is not set # CONFIG_LOGITECH_FF is not set +# CONFIG_LOGO is not set # CONFIG_LSF is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_LXT_PHY is not set diff --git a/target/linux/generic-2.6/patches-2.6.32/221-binfmt_elf_gcc4.1.patch b/target/linux/generic-2.6/patches-2.6.32/221-binfmt_elf_gcc4.1.patch index fa891e0f3..64f28d80f 100644 --- a/target/linux/generic-2.6/patches-2.6.32/221-binfmt_elf_gcc4.1.patch +++ b/target/linux/generic-2.6/patches-2.6.32/221-binfmt_elf_gcc4.1.patch @@ -1,6 +1,6 @@ --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c -@@ -1193,7 +1193,7 @@ static unsigned long vma_dump_size(struc +@@ -1170,7 +1170,7 @@ if (FILTER(ELF_HEADERS) && vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) { u32 __user *header = (u32 __user *) vma->vm_start; diff --git a/target/linux/generic-2.6/patches-2.6.32/240-packet_socket_type.patch b/target/linux/generic-2.6/patches-2.6.32/240-packet_socket_type.patch index 71827643e..a03d69957 100644 --- a/target/linux/generic-2.6/patches-2.6.32/240-packet_socket_type.patch +++ b/target/linux/generic-2.6/patches-2.6.32/240-packet_socket_type.patch @@ -7,7 +7,7 @@ Signed-off-by: Felix Fietkau --- a/include/linux/if_packet.h +++ b/include/linux/if_packet.h -@@ -31,6 +31,8 @@ struct sockaddr_ll +@@ -31,6 +31,8 @@ /* These ones are invisible by user level */ #define PACKET_LOOPBACK 5 /* MC/BRD frame looped back */ #define PACKET_FASTROUTE 6 /* Fastrouted frame */ @@ -16,7 +16,7 @@ Signed-off-by: Felix Fietkau /* Packet socket options */ -@@ -48,6 +50,7 @@ struct sockaddr_ll +@@ -48,6 +50,7 @@ #define PACKET_RESERVE 12 #define PACKET_TX_RING 13 #define PACKET_LOSS 14 @@ -26,7 +26,7 @@ Signed-off-by: Felix Fietkau { --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c -@@ -204,6 +204,7 @@ struct packet_sock { +@@ -204,6 +204,7 @@ unsigned int tp_reserve; unsigned int tp_loss:1; #endif @@ -34,7 +34,7 @@ Signed-off-by: Felix Fietkau }; struct packet_skb_cb { -@@ -342,6 +343,7 @@ static int packet_rcv_spkt(struct sk_buf +@@ -342,6 +343,7 @@ { struct sock *sk; struct sockaddr_pkt *spkt; @@ -42,7 +42,7 @@ Signed-off-by: Felix Fietkau /* * When we registered the protocol we saved the socket in the data -@@ -349,6 +351,7 @@ static int packet_rcv_spkt(struct sk_buf +@@ -349,6 +351,7 @@ */ sk = pt->af_packet_priv; @@ -50,7 +50,7 @@ Signed-off-by: Felix Fietkau /* * Yank back the headers [hope the device set this -@@ -361,7 +364,7 @@ static int packet_rcv_spkt(struct sk_buf +@@ -361,7 +364,7 @@ * so that this procedure is noop. */ @@ -59,7 +59,7 @@ Signed-off-by: Felix Fietkau goto out; if (dev_net(dev) != sock_net(sk)) -@@ -545,12 +548,12 @@ static int packet_rcv(struct sk_buff *sk +@@ -545,12 +548,12 @@ int skb_len = skb->len; unsigned int snaplen, res; @@ -75,7 +75,7 @@ Signed-off-by: Felix Fietkau if (dev_net(dev) != sock_net(sk)) goto drop; -@@ -667,12 +670,12 @@ static int tpacket_rcv(struct sk_buff *s +@@ -667,12 +670,12 @@ struct timeval tv; struct timespec ts; @@ -91,7 +91,7 @@ Signed-off-by: Felix Fietkau if (dev_net(dev) != sock_net(sk)) goto drop; -@@ -1381,6 +1384,7 @@ static int packet_create(struct net *net +@@ -1390,6 +1393,7 @@ spin_lock_init(&po->bind_lock); mutex_init(&po->pg_vec_lock); po->prot_hook.func = packet_rcv; @@ -99,7 +99,7 @@ Signed-off-by: Felix Fietkau if (sock->type == SOCK_PACKET) po->prot_hook.func = packet_rcv_spkt; -@@ -1728,6 +1732,16 @@ packet_setsockopt(struct socket *sock, i +@@ -1737,6 +1741,16 @@ ret = packet_mc_drop(sk, &mreq); return ret; } @@ -116,7 +116,7 @@ Signed-off-by: Felix Fietkau #ifdef CONFIG_PACKET_MMAP case PACKET_RX_RING: -@@ -1873,6 +1887,13 @@ static int packet_getsockopt(struct sock +@@ -1882,6 +1896,13 @@ data = &val; break; diff --git a/target/linux/generic-2.6/patches-2.6.32/980-vm_exports.patch b/target/linux/generic-2.6/patches-2.6.32/980-vm_exports.patch index 1c60dbc50..ca70efe0e 100644 --- a/target/linux/generic-2.6/patches-2.6.32/980-vm_exports.patch +++ b/target/linux/generic-2.6/patches-2.6.32/980-vm_exports.patch @@ -1,6 +1,6 @@ --- a/mm/shmem.c +++ b/mm/shmem.c -@@ -2608,6 +2608,16 @@ int shmem_lock(struct file *file, int lo +@@ -2608,6 +2608,16 @@ /* common code */ @@ -17,7 +17,7 @@ /** * shmem_file_setup - get an unlinked file living in tmpfs * @name: name for dentry (to be seen in /proc//maps -@@ -2687,9 +2697,6 @@ int shmem_zero_setup(struct vm_area_stru +@@ -2687,9 +2697,6 @@ if (IS_ERR(file)) return PTR_ERR(file); @@ -30,7 +30,7 @@ } --- a/fs/file.c +++ b/fs/file.c -@@ -271,6 +271,7 @@ int expand_files(struct files_struct *fi +@@ -271,6 +271,7 @@ /* All good, so we try */ return expand_fdtable(files, nr); } @@ -40,7 +40,7 @@ { --- a/kernel/exit.c +++ b/kernel/exit.c -@@ -507,6 +507,7 @@ struct files_struct *get_files_struct(st +@@ -507,6 +507,7 @@ return files; } @@ -48,7 +48,7 @@ void put_files_struct(struct files_struct *files) { -@@ -526,6 +527,7 @@ void put_files_struct(struct files_struc +@@ -526,6 +527,7 @@ free_fdtable(fdt); } } @@ -58,7 +58,7 @@ { --- a/kernel/fork.c +++ b/kernel/fork.c -@@ -168,6 +168,7 @@ void __put_task_struct(struct task_struc +@@ -168,6 +168,7 @@ if (!profile_handoff_task(tsk)) free_task(tsk); } @@ -68,7 +68,7 @@ * macro override instead of weak attribute alias, to workaround --- a/kernel/sched.c +++ b/kernel/sched.c -@@ -6093,6 +6093,7 @@ int can_nice(const struct task_struct *p +@@ -6093,6 +6093,7 @@ return (nice_rlim <= p->signal->rlim[RLIMIT_NICE].rlim_cur || capable(CAP_SYS_NICE)); } @@ -78,7 +78,7 @@ --- a/mm/memory.c +++ b/mm/memory.c -@@ -1100,6 +1100,7 @@ unsigned long zap_page_range(struct vm_a +@@ -1100,6 +1100,7 @@ tlb_finish_mmu(tlb, address, end); return end; } @@ -86,7 +86,7 @@ /** * zap_vma_ptes - remove ptes mapping the vma -@@ -2486,6 +2487,7 @@ int vmtruncate_range(struct inode *inode +@@ -2486,6 +2487,7 @@ return 0; } @@ -96,7 +96,7 @@ * We enter with non-exclusive mmap_sem (to exclude vma changes, --- a/mm/vmalloc.c +++ b/mm/vmalloc.c -@@ -1111,6 +1111,7 @@ void unmap_kernel_range(unsigned long ad +@@ -1172,6 +1172,7 @@ vunmap_page_range(addr, end); flush_tlb_kernel_range(addr, end); } @@ -104,7 +104,7 @@ int map_vm_area(struct vm_struct *area, pgprot_t prot, struct page ***pages) { -@@ -1226,6 +1227,7 @@ struct vm_struct *get_vm_area(unsigned l +@@ -1287,6 +1288,7 @@ return __get_vm_area_node(size, 1, flags, VMALLOC_START, VMALLOC_END, -1, GFP_KERNEL, __builtin_return_address(0)); } @@ -114,7 +114,7 @@ void *caller) --- a/include/linux/mm.h +++ b/include/linux/mm.h -@@ -713,6 +713,7 @@ extern void show_free_areas(void); +@@ -713,6 +713,7 @@ int shmem_lock(struct file *file, int lock, struct user_struct *user); struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags); @@ -124,7 +124,7 @@ #ifndef CONFIG_MMU --- a/kernel/signal.c +++ b/kernel/signal.c -@@ -1070,6 +1070,7 @@ struct sighand_struct *lock_task_sighand +@@ -1070,6 +1070,7 @@ return sighand; } diff --git a/target/linux/generic-2.6/patches-2.6.32/999-use_preinit_as_init.patch b/target/linux/generic-2.6/patches-2.6.32/999-use_preinit_as_init.patch index 0a52a87e8..33943fe2d 100644 --- a/target/linux/generic-2.6/patches-2.6.32/999-use_preinit_as_init.patch +++ b/target/linux/generic-2.6/patches-2.6.32/999-use_preinit_as_init.patch @@ -1,6 +1,6 @@ --- a/init/main.c +++ b/init/main.c -@@ -836,10 +836,7 @@ static noinline int init_post(void) +@@ -836,10 +836,7 @@ printk(KERN_WARNING "Failed to execute %s. Attempting " "defaults...\n", execute_command); } diff --git a/target/linux/x86/config-2.6.32 b/target/linux/x86/config-2.6.32 new file mode 100644 index 000000000..398c0668e --- /dev/null +++ b/target/linux/x86/config-2.6.32 @@ -0,0 +1,459 @@ +# CONFIG_3C515 is not set +# CONFIG_60XX_WDT is not set +# CONFIG_64BIT is not set +# CONFIG_AC3200 is not set +# CONFIG_ACPI_AC is not set +# CONFIG_ACPI_ASUS is not set +# CONFIG_ACPI_BATTERY is not set +# CONFIG_ACPI_BUTTON is not set +# CONFIG_ACPI_CONTAINER is not set +# CONFIG_ACPI_CUSTOM_DSDT is not set +# CONFIG_ACPI_DEBUG is not set +# CONFIG_ACPI_DOCK is not set +# CONFIG_ACPI_FAN is not set +# CONFIG_ACPI_PCI_SLOT is not set +# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set +# CONFIG_ACPI_PROCFS is not set +# CONFIG_ACPI_PROCFS_POWER is not set +# CONFIG_ACPI_PROC_EVENT is not set +# CONFIG_ACPI_SBS is not set +# CONFIG_ACPI_TOSHIBA is not set +# CONFIG_ACPI_WMI is not set +# CONFIG_ACQUIRE_WDT is not set +# CONFIG_ADVANTECH_WDT is not set +# CONFIG_ALIM1535_WDT is not set +# CONFIG_APRICOT is not set +# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set +# CONFIG_ASUS_LAPTOP is not set +# CONFIG_AT1700 is not set +# CONFIG_AUDIT_ARCH is not set +# CONFIG_BLK_DEV_XD is not set +# CONFIG_CC_STACKPROTECTOR is not set +# CONFIG_CMDLINE_BOOL is not set +# CONFIG_CPU5_WDT is not set +# CONFIG_CPU_FREQ_DEBUG is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set +# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_GOV_USERSPACE is not set +# CONFIG_CS5535_GPIO is not set +# CONFIG_CS89x0 is not set +# CONFIG_DCDBAS is not set +# CONFIG_DELL_RBU is not set +# CONFIG_DEPCA is not set +# CONFIG_DMAR is not set +# CONFIG_DMA_API_DEBUG is not set +# CONFIG_DMIID is not set +# CONFIG_EARLY_PRINTK_DBGP is not set +# CONFIG_EDD is not set +# CONFIG_EFI is not set +# CONFIG_EISA is not set +# CONFIG_EL1 is not set +# CONFIG_EL16 is not set +# CONFIG_EL2 is not set +# CONFIG_EL3 is not set +# CONFIG_ELPLUS is not set +# CONFIG_EUROTECH_WDT is not set +# CONFIG_FRAME_POINTER is not set +# CONFIG_GENERIC_CPU is not set +# CONFIG_GENERIC_TIME_VSYSCALL is not set +# CONFIG_HANGCHECK_TIMER is not set +# CONFIG_HAVE_CPUMASK_OF_CPU_MAP is not set +# CONFIG_HIBERNATION is not set +# CONFIG_HIGHMEM4G is not set +# CONFIG_HIGHMEM64G is not set +# CONFIG_HIGH_RES_TIMERS is not set +# CONFIG_HPET_TIMER is not set +# CONFIG_HP_WATCHDOG is not set +# CONFIG_HUGETLBFS is not set +# CONFIG_I6300ESB_WDT is not set +# CONFIG_I8K is not set +# CONFIG_IB700_WDT is not set +# CONFIG_IBMASR is not set +# CONFIG_IMA is not set +# CONFIG_INPUT_YEALINK is not set +# CONFIG_INTEL_MENLOW is not set +# CONFIG_IOMMU_API is not set +# CONFIG_IOMMU_HELPER is not set +# CONFIG_IOMMU_STRESS is not set +# CONFIG_IO_DELAY_0XED is not set +# CONFIG_IO_DELAY_NONE is not set +# CONFIG_IO_DELAY_UDELAY is not set +# CONFIG_ISCSI_IBFT_FIND is not set +# CONFIG_IT8712F_WDT is not set +# CONFIG_IT87_WDT is not set +# CONFIG_ITCO_WDT is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_LANCE is not set +# CONFIG_LEDS_ALIX2 is not set +# CONFIG_LEDS_CLEVO_MAIL is not set +# CONFIG_M486 is not set +# CONFIG_M586 is not set +# CONFIG_M586MMX is not set +# CONFIG_M586TSC is not set +# CONFIG_M686 is not set +# CONFIG_MACHZ_WDT is not set +# CONFIG_MATOM is not set +# CONFIG_MCA is not set +# CONFIG_MCORE2 is not set +# CONFIG_MCRUSOE is not set +# CONFIG_MCYRIXIII is not set +# CONFIG_MDA_CONSOLE is not set +# CONFIG_MEFFICEON is not set +# CONFIG_MEMTEST is not set +# CONFIG_MGEODEGX1 is not set +# CONFIG_MGEODE_LX is not set +# CONFIG_MICROCODE_AMD is not set +# CONFIG_MIXCOMWD is not set +# CONFIG_MK6 is not set +# CONFIG_MK7 is not set +# CONFIG_MK8 is not set +# CONFIG_MOUSE_BCM5974 is not set +# CONFIG_MOUSE_PS2_ELANTECH is not set +# CONFIG_MOUSE_PS2_TOUCHKIT is not set +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_VSXXXAA is not set +# CONFIG_MPENTIUM4 is not set +# CONFIG_MPENTIUMII is not set +# CONFIG_MPENTIUMIII is not set +# CONFIG_MPENTIUMM is not set +# CONFIG_MPSC is not set +# CONFIG_MTD_CFI is not set +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +# CONFIG_MTD_TS5500 is not set +# CONFIG_MTRR_SANITIZER is not set +# CONFIG_MVIAC3_2 is not set +# CONFIG_MVIAC7 is not set +# CONFIG_MWINCHIP3D is not set +# CONFIG_MWINCHIPC6 is not set +# CONFIG_NET_NS is not set +# CONFIG_NET_VENDOR_RACAL is not set +# CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NSC_GPIO is not set +# CONFIG_OLPC is not set +# CONFIG_OPTIMIZE_INLINING is not set +# CONFIG_PARAVIRT_GUEST is not set +# CONFIG_PC8736x_GPIO is not set +# CONFIG_PC87413_WDT is not set +# CONFIG_PCIEPORTBUS is not set +# CONFIG_PCI_GOBIOS is not set +# CONFIG_PCI_GODIRECT is not set +# CONFIG_PCI_GOMMCONFIG is not set +# CONFIG_PCI_GOOLPC is not set +# CONFIG_PCWATCHDOG is not set +# CONFIG_PDA_POWER is not set +# CONFIG_PM_DEBUG is not set +# CONFIG_PM_RUNTIME is not set +# CONFIG_PNPBIOS is not set +# CONFIG_POWER_SUPPLY_DEBUG is not set +# CONFIG_PROCESSOR_SELECT is not set +# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set +# CONFIG_RELOCATABLE is not set +# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set +# CONFIG_SBC7240_WDT is not set +# CONFIG_SBC8360_WDT is not set +# CONFIG_SBC_EPX_C3_WATCHDOG is not set +# CONFIG_SC1200_WDT is not set +# CONFIG_SC520_WDT is not set +# CONFIG_SCHED_HRTICK is not set +# CONFIG_SCSI_LOWLEVEL is not set +# CONFIG_SCx200_GPIO is not set +# CONFIG_SCx200_WDT is not set +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set +# CONFIG_SERIO_RAW is not set +# CONFIG_SLAB is not set +# CONFIG_SLUB_DEBUG_ON is not set +# CONFIG_SLUB_STATS is not set +# CONFIG_SMSC37B787_WDT is not set +# CONFIG_SMSC_SCH311X_WDT is not set +# CONFIG_SPARSE_IRQ is not set +# CONFIG_SUSPEND is not set +# CONFIG_TC1100_WMI is not set +# CONFIG_TELCLOCK is not set +# CONFIG_THINKPAD_ACPI is not set +# CONFIG_TOPSTAR_LAPTOP is not set +# CONFIG_TOSHIBA is not set +# CONFIG_TREE_PREEMPT_RCU is not set +# CONFIG_TYPHOON is not set +# CONFIG_USER_NS is not set +# CONFIG_VGACON_SOFT_SCROLLBACK is not set +# CONFIG_VORTEX is not set +# CONFIG_VT_HW_CONSOLE_BINDING is not set +# CONFIG_W83697UG_WDT is not set +# CONFIG_WAFER_WDT is not set +# CONFIG_WDT is not set +# CONFIG_X86_64 is not set +# CONFIG_X86_ACPI_CPUFREQ is not set +# CONFIG_X86_ANCIENT_MCE is not set +# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set +# CONFIG_X86_CMPXCHG is not set +# CONFIG_X86_CPUFREQ_NFORCE2 is not set +# CONFIG_X86_CPUID is not set +# CONFIG_X86_ELAN is not set +# CONFIG_X86_E_POWERSAVER is not set +# CONFIG_X86_GX_SUSPMOD is not set +# CONFIG_X86_LONGHAUL is not set +# CONFIG_X86_LONGRUN is not set +# CONFIG_X86_MCE_INJECT is not set +# CONFIG_X86_MRST is not set +# CONFIG_X86_MSR is not set +# CONFIG_X86_P4_CLOCKMOD is not set +# CONFIG_X86_PAE is not set +# CONFIG_X86_POWERNOW_K6 is not set +# CONFIG_X86_POWERNOW_K7 is not set +# CONFIG_X86_POWERNOW_K8 is not set +# CONFIG_X86_RDC321X is not set +# CONFIG_X86_REBOOTFIXUPS is not set +# CONFIG_X86_SPEEDSTEP_CENTRINO is not set +# CONFIG_X86_SPEEDSTEP_ICH is not set +# CONFIG_X86_SPEEDSTEP_LIB is not set +# CONFIG_X86_SPEEDSTEP_SMI is not set +# CONFIG_ZONE_DMA32 is not set +CONFIG_4KSTACKS=y +CONFIG_ACPI=y +CONFIG_ACPI_BLACKLIST_YEAR=0 +CONFIG_ACPI_PROCESSOR=y +CONFIG_ACPI_SYSFS_POWER=y +CONFIG_ACPI_THERMAL=y +CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig" +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y +CONFIG_ARCH_HAS_CPU_RELAX=y +CONFIG_ARCH_HAS_DEFAULT_IDLE=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_MAY_HAVE_PC_FDC=y +CONFIG_ARCH_POPULATES_NODE_MAP=y +CONFIG_ARCH_SELECT_MEMORY_MODEL=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y +CONFIG_ARCH_SUPPORTS_MSI=y +CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARCH_USES_PG_UNCACHED=y +CONFIG_ARCH_WANT_FRAME_POINTERS=y +CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y +CONFIG_ATA=y +CONFIG_ATA_GENERIC=y +CONFIG_ATA_PIIX=y +CONFIG_BINFMT_MISC=y +CONFIG_BITREVERSE=y +CONFIG_BLK_DEV_SD=y +CONFIG_BOUNCE=y +CONFIG_CFG80211_DEFAULT_PS_VALUE=0 +CONFIG_CLOCKSOURCE_WATCHDOG=y +CONFIG_COMPAT_VDSO=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_STAT=y +CONFIG_CPU_FREQ_STAT_DETAILS=y +CONFIG_CPU_FREQ_TABLE=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_CPU_SUP_AMD=y +CONFIG_CPU_SUP_CENTAUR=y +CONFIG_CPU_SUP_CYRIX_32=y +CONFIG_CPU_SUP_INTEL=y +CONFIG_CPU_SUP_TRANSMETA_32=y +CONFIG_CPU_SUP_UMC_32=y +CONFIG_DEBUG_MEMORY_INIT=y +CONFIG_DECOMPRESS_BZIP2=y +CONFIG_DECOMPRESS_GZIP=y +CONFIG_DECOMPRESS_LZMA=y +CONFIG_DEFAULT_IO_DELAY_TYPE=0 +CONFIG_DEVPORT=y +CONFIG_DMI=y +CONFIG_DNOTIFY=y +CONFIG_DOUBLEFAULT=y +CONFIG_DUMMY_CONSOLE=y +CONFIG_EARLY_PRINTK=y +CONFIG_ELF_CORE=y +CONFIG_EXT2_FS=y +CONFIG_FIRMWARE_IN_KERNEL=y +CONFIG_FIRMWARE_MEMMAP=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CMOS_UPDATE=y +CONFIG_GENERIC_FIND_FIRST_BIT=y +CONFIG_GENERIC_FIND_LAST_BIT=y +CONFIG_GENERIC_FIND_NEXT_BIT=y +CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y +CONFIG_GENERIC_IOMAP=y +CONFIG_GENERIC_ISA_DMA=y +CONFIG_HAS_DMA=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAVE_AOUT=y +CONFIG_HAVE_ARCH_KGDB=y +CONFIG_HAVE_ARCH_KMEMCHECK=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_ATOMIC_IOMAP=y +CONFIG_HAVE_DMA_API_DEBUG=y +CONFIG_HAVE_DMA_ATTRS=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y +CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y +CONFIG_HAVE_GENERIC_DMA_COHERENT=y +CONFIG_HAVE_IDE=y +CONFIG_HAVE_IOREMAP_PROT=y +CONFIG_HAVE_KERNEL_BZIP2=y +CONFIG_HAVE_KERNEL_GZIP=y +CONFIG_HAVE_KERNEL_LZMA=y +CONFIG_HAVE_KERNEL_LZO=y +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_KVM=y +CONFIG_HAVE_LATENCYTOP_SUPPORT=y +CONFIG_HAVE_MMIOTRACE_SUPPORT=y +CONFIG_HAVE_OPROFILE=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y +CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y +CONFIG_HID=y +CONFIG_HID_SUPPORT=y +CONFIG_HPET=y +CONFIG_HPET_MMAP=y +CONFIG_HT_IRQ=y +CONFIG_HW_CONSOLE=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_GEODE=y +CONFIG_HW_RANDOM_VIA=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_INPUT=y +CONFIG_INPUT_KEYBOARD=y +CONFIG_INPUT_MOUSE=y +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_IO_DELAY_0X80=y +CONFIG_IO_DELAY_TYPE_0X80=0 +CONFIG_IO_DELAY_TYPE_0XED=1 +CONFIG_IO_DELAY_TYPE_NONE=3 +CONFIG_IO_DELAY_TYPE_UDELAY=2 +CONFIG_ISA=y +CONFIG_ISAPNP=y +CONFIG_ISA_DMA_API=y +CONFIG_KALLSYMS=y +CONFIG_KEXEC=y +CONFIG_KEYBOARD_ATKBD=y +CONFIG_KTIME_SCALAR=y +CONFIG_M386=y +CONFIG_MATH_EMULATION=y +CONFIG_MICROCODE=y +CONFIG_MICROCODE_INTEL=y +CONFIG_MICROCODE_OLD_INTERFACE=y +CONFIG_MOUSE_PS2=y +CONFIG_MOUSE_PS2_ALPS=y +CONFIG_MOUSE_PS2_LIFEBOOK=y +CONFIG_MOUSE_PS2_LOGIPS2PP=y +CONFIG_MOUSE_PS2_SYNAPTICS=y +CONFIG_MOUSE_PS2_TRACKPOINT=y +CONFIG_MTD_BLOCK2MTD=y +CONFIG_MTRR=y +CONFIG_NAMESPACES=y +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_NET_VENDOR_3COM=y +CONFIG_NOHIGHMEM=y +CONFIG_NR_CPUS=1 +CONFIG_NVRAM=y +CONFIG_OUTPUT_FORMAT="elf32-i386" +CONFIG_PAGEFLAGS_EXTENDED=y +CONFIG_PAGE_OFFSET=0xC0000000 +CONFIG_PATA_AMD=y +CONFIG_PATA_MPIIX=y +CONFIG_PATA_OLDPIIX=y +CONFIG_PATA_SC1200=y +CONFIG_PATA_VIA=y +CONFIG_PCI_BIOS=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_GOANY=y +CONFIG_PCI_MMCONFIG=y +CONFIG_PCI_MSI=y +CONFIG_PCSPKR_PLATFORM=y +CONFIG_PHYSICAL_ALIGN=0x100000 +CONFIG_PHYSICAL_START=0x1000000 +CONFIG_PM=y +CONFIG_PNP=y +CONFIG_PNPACPI=y +CONFIG_PNP_DEBUG_MESSAGES=y +CONFIG_POWER_SUPPLY=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_RD_BZIP2=y +CONFIG_RD_GZIP=y +CONFIG_RTC=y +CONFIG_SCHED_OMIT_FRAME_POINTER=y +CONFIG_SCSI=y +CONFIG_SCx200=y +CONFIG_SCx200HR_TIMER=y +CONFIG_SERIAL_8250_PCI=y +CONFIG_SERIAL_8250_PNP=y +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +CONFIG_SERIO_LIBPS2=y +CONFIG_SERIO_SERPORT=y +CONFIG_SLUB=y +CONFIG_SLUB_DEBUG=y +CONFIG_SPARSEMEM_STATIC=y +CONFIG_STRICT_DEVMEM=y +CONFIG_THERMAL=y +CONFIG_TREE_RCU=y +CONFIG_UID16=y +CONFIG_USB_SUPPORT=y +CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_VGA_CONSOLE=y +CONFIG_VM86=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_X86=y +CONFIG_X86_32=y +CONFIG_X86_32_LAZY_GS=y +CONFIG_X86_CPU=y +CONFIG_X86_EXTENDED_PLATFORM=y +CONFIG_X86_F00F_BUG=y +CONFIG_X86_GENERIC=y +CONFIG_X86_INTEL_USERCOPY=y +CONFIG_X86_INTERNODE_CACHE_BYTES=64 +CONFIG_X86_IO_APIC=y +CONFIG_X86_L1_CACHE_BYTES=64 +CONFIG_X86_L1_CACHE_SHIFT=4 +CONFIG_X86_LOCAL_APIC=y +CONFIG_X86_MCE=y +CONFIG_X86_MCE_AMD=y +CONFIG_X86_MCE_INTEL=y +CONFIG_X86_MCE_THRESHOLD=y +CONFIG_X86_MINIMUM_CPU_FAMILY=3 +CONFIG_X86_MPPARSE=y +CONFIG_X86_PAT=y +CONFIG_X86_PLATFORM_DEVICES=y +CONFIG_X86_PM_TIMER=y +CONFIG_X86_PPRO_FENCE=y +CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y +CONFIG_X86_RESERVE_LOW_64K=y +CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y +CONFIG_X86_THERMAL_VECTOR=y +CONFIG_X86_UP_APIC=y +CONFIG_X86_UP_IOAPIC=y +CONFIG_X86_VERBOSE_BOOTUP=y diff --git a/target/linux/x86/patches-2.6.32/300-block2mtd_init.patch b/target/linux/x86/patches-2.6.32/300-block2mtd_init.patch new file mode 100644 index 000000000..1ac85a332 --- /dev/null +++ b/target/linux/x86/patches-2.6.32/300-block2mtd_init.patch @@ -0,0 +1,213 @@ +--- a/drivers/mtd/devices/block2mtd.c ++++ b/drivers/mtd/devices/block2mtd.c +@@ -18,10 +18,18 @@ + #include + #include + #include ++#include ++#include + + #define ERROR(fmt, args...) printk(KERN_ERR "block2mtd: " fmt "\n" , ## args) + #define INFO(fmt, args...) printk(KERN_INFO "block2mtd: " fmt "\n" , ## args) + ++struct retry { ++ struct list_head list; ++ const char *val; ++}; ++ ++static LIST_HEAD(retry_list); + + /* Info for the block device */ + struct block2mtd_dev { +@@ -33,10 +41,34 @@ + char devname[0]; + }; + ++static int block2mtd_setup2(const char *val); + + /* Static info about the MTD, used in cleanup_module */ + static LIST_HEAD(blkmtd_device_list); + ++static int add_retry(const char *val) { ++ struct retry *r = kmalloc(sizeof(struct retry), GFP_KERNEL); ++ ++ INIT_LIST_HEAD(&r->list); ++ r->val = val; ++ list_add(&r->list, &retry_list); ++ ++ return 0; ++} ++ ++static int __init process_retries(void) { ++ struct list_head *p, *tmp; ++ ++ list_for_each_safe(p, tmp, &retry_list) { ++ struct retry *r = list_entry(p, struct retry, list); ++ block2mtd_setup2(r->val); ++ msleep(100); ++ list_del(p); ++ kfree(r); ++ } ++ return 0; ++} ++rootfs_initcall(process_retries); + + static struct page *page_read(struct address_space *mapping, int index) + { +@@ -511,7 +543,9 @@ + if (token[2] && (strlen(token[2]) + 1 > 80)) + parse_err("mtd device name too long"); + +- add_device(name, erase_size, token[2]); ++ if (add_device(name, erase_size, token[2]) == NULL) { ++ add_retry(val); ++ } + + return 0; + } +--- a/include/asm-generic/vmlinux.lds.h ++++ b/include/asm-generic/vmlinux.lds.h +@@ -614,17 +614,24 @@ + *(.initcall4s.init) \ + *(.initcall5.init) \ + *(.initcall5s.init) \ +- *(.initcallrootfs.init) \ + *(.initcall6.init) \ + *(.initcall6s.init) \ + *(.initcall7.init) \ + *(.initcall7s.init) + ++#define INITCALLS_ROOT \ ++ *(.initcallrootfs.init) ++ + #define INIT_CALLS \ + VMLINUX_SYMBOL(__initcall_start) = .; \ + INITCALLS \ + VMLINUX_SYMBOL(__initcall_end) = .; + ++#define INIT_CALLS_ROOT \ ++ VMLINUX_SYMBOL(__root_initcall_start) = .; \ ++ INITCALLS_ROOT \ ++ VMLINUX_SYMBOL(__root_initcall_end) = .; ++ + #define CON_INITCALL \ + VMLINUX_SYMBOL(__con_initcall_start) = .; \ + *(.con_initcall.init) \ +@@ -766,6 +773,7 @@ + INIT_DATA \ + INIT_SETUP(initsetup_align) \ + INIT_CALLS \ ++ INIT_CALLS_ROOT \ + CON_INITCALL \ + SECURITY_INITCALL \ + INIT_RAM_FS \ +--- a/init/do_mounts.c ++++ b/init/do_mounts.c +@@ -176,16 +176,8 @@ + return 1; + } + +-static unsigned int __initdata root_delay; +-static int __init root_delay_setup(char *str) +-{ +- root_delay = simple_strtoul(str, NULL, 0); +- return 1; +-} +- + __setup("rootflags=", root_data_setup); + __setup("rootfstype=", fs_names_setup); +-__setup("rootdelay=", root_delay_setup); + + static void __init get_fs_names(char *page) + { +@@ -366,23 +358,6 @@ + { + int is_floppy; + +- if (root_delay) { +- printk(KERN_INFO "Waiting %dsec before mounting root device...\n", +- root_delay); +- ssleep(root_delay); +- } +- +- /* +- * wait for the known devices to complete their probing +- * +- * Note: this is a potential source of long boot delays. +- * For example, it is not atypical to wait 5 seconds here +- * for the touchpad of a laptop to initialize. +- */ +- wait_for_device_probe(); +- +- md_run_setup(); +- + if (saved_root_name[0]) { + root_device_name = saved_root_name; + if (!strncmp(root_device_name, "mtd", 3) || +--- a/init/main.c ++++ b/init/main.c +@@ -80,6 +80,7 @@ + #ifdef CONFIG_X86_LOCAL_APIC + #include + #endif ++#include "do_mounts.h" + + static int kernel_init(void *); + +@@ -752,12 +753,13 @@ + + + extern initcall_t __initcall_start[], __initcall_end[], __early_initcall_end[]; ++extern initcall_t __root_initcall_start[], __root_initcall_end[]; + +-static void __init do_initcalls(void) ++static void __init do_initcalls(initcall_t *start, initcall_t *end) + { + initcall_t *call; + +- for (call = __early_initcall_end; call < __initcall_end; call++) ++ for (call = start; call < end; call++) + do_one_initcall(*call); + + /* Make sure there is no pending stuff from the initcall sequence */ +@@ -780,7 +782,7 @@ + driver_init(); + init_irq_proc(); + do_ctors(); +- do_initcalls(); ++ do_initcalls(__early_initcall_end, __initcall_end); + } + + static void __init do_pre_smp_initcalls(void) +@@ -841,6 +843,13 @@ + panic("No init found. Try passing init= option to kernel."); + } + ++static unsigned int __initdata root_delay; ++static int __init root_delay_setup(char *str) ++{ ++ root_delay = simple_strtoul(str, NULL, 0); ++ return 1; ++} ++__setup("rootdelay=", root_delay_setup); + static int __init kernel_init(void * unused) + { + lock_kernel(); +@@ -885,7 +894,16 @@ + + if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) { + ramdisk_execute_command = NULL; +- prepare_namespace(); ++ if (root_delay) { ++ printk(KERN_INFO "Waiting %desc before mounting root device...\n", ++ root_delay); ++ ssleep(root_delay); ++ } ++ while (driver_probe_done() != 0) ++ msleep(100); ++ do_initcalls(__root_initcall_start, __root_initcall_end); ++ md_run_setup(); ++ prepare_namespace(); + } + + /* diff --git a/target/linux/x86/xen_domu/config-2.6.32 b/target/linux/x86/xen_domu/config-2.6.32 new file mode 100644 index 000000000..322d57269 --- /dev/null +++ b/target/linux/x86/xen_domu/config-2.6.32 @@ -0,0 +1,74 @@ +# CONFIG_APM is not set +# CONFIG_KERNEL_LZMA is not set +# CONFIG_KVM_CLOCK is not set +# CONFIG_KVM_GUEST is not set +# CONFIG_LGUEST_GUEST is not set +# CONFIG_M386 is not set +# CONFIG_NETWORK_FILESYSTEMS is not set +# CONFIG_PARAVIRT_SPINLOCKS is not set +# CONFIG_PERF_COUNTERS is not set +# CONFIG_PERF_EVENTS is not set +# CONFIG_RWSEM_GENERIC_SPINLOCK is not set +# CONFIG_SCHED_SMT is not set +# CONFIG_VMI is not set +# CONFIG_X86_BIGSMP is not set +# CONFIG_X86_DS is not set +# CONFIG_X86_EXTENDED_PLATFORM is not set +# CONFIG_X86_PLATFORM_DEVICES is not set +# CONFIG_XENFS is not set +# CONFIG_XEN_DEBUG_FS is not set +# CONFIG_XEN_DEV_EVTCHN is not set +# CONFIG_XEN_NETDEV_FRONTEND is not set +CONFIG_ACPI_CONTAINER=y +CONFIG_ACPI_HOTPLUG_CPU=y +CONFIG_ARCH_PHYS_ADDR_T_64BIT=y +CONFIG_FREEZER=y +CONFIG_GENERIC_PENDING_IRQ=y +CONFIG_HAVE_PERF_EVENTS=y +CONFIG_HOTPLUG_CPU=y +CONFIG_HPET_EMULATE_RTC=y +CONFIG_HPET_TIMER=y +CONFIG_HVC_DRIVER=y +CONFIG_HVC_IRQ=y +CONFIG_HVC_XEN=y +CONFIG_KERNEL_GZIP=y +CONFIG_LOCK_KERNEL=y +CONFIG_MPENTIUM4=y +CONFIG_NR_CPUS=2 +CONFIG_PARAVIRT=y +CONFIG_PARAVIRT_CLOCK=y +CONFIG_PARAVIRT_GUEST=y +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_SCHED_MC=y +CONFIG_SMP=y +CONFIG_SPARSE_IRQ=y +CONFIG_STOP_MACHINE=y +CONFIG_SYS_HYPERVISOR=y +CONFIG_USE_GENERIC_SMP_HELPERS=y +CONFIG_X86_32_SMP=y +CONFIG_X86_BSWAP=y +CONFIG_X86_CMOV=y +CONFIG_X86_CMPXCHG64=y +CONFIG_X86_CMPXCHG=y +CONFIG_X86_DEBUGCTLMSR=y +CONFIG_X86_HT=y +CONFIG_X86_INVLPG=y +CONFIG_X86_L1_CACHE_SHIFT=7 +CONFIG_X86_MINIMUM_CPU_FAMILY=5 +CONFIG_X86_PAE=y +CONFIG_X86_POPAD_OK=y +CONFIG_X86_TRAMPOLINE=y +CONFIG_X86_TSC=y +CONFIG_X86_USE_PPRO_CHECKSUM=y +CONFIG_X86_WP_WORKS_OK=y +CONFIG_X86_XADD=y +CONFIG_XEN=y +CONFIG_XEN_BALLOON=y +CONFIG_XEN_BLKDEV_FRONTEND=y +CONFIG_XEN_MAX_DOMAIN_MEMORY=8 +CONFIG_XEN_SAVE_RESTORE=y +CONFIG_XEN_SCRUB_PAGES=y +CONFIG_XEN_SYS_HYPERVISOR=y From ce4e4e59e61a096f3ccfec3d77c771816f24c6b1 Mon Sep 17 00:00:00 2001 From: lars Date: Sat, 13 Feb 2010 00:45:34 +0000 Subject: [PATCH 38/44] [kernel] Add some missing debug symbols to the generic 2.6.32 config. git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19618 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic-2.6/config-2.6.32 | 39 ++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/target/linux/generic-2.6/config-2.6.32 b/target/linux/generic-2.6/config-2.6.32 index 42666817b..615430f53 100644 --- a/target/linux/generic-2.6/config-2.6.32 +++ b/target/linux/generic-2.6/config-2.6.32 @@ -133,6 +133,7 @@ CONFIG_ATM_CLIP_NO_ICMP=y # CONFIG_B43LEGACY is not set # CONFIG_B44 is not set # CONFIG_BACKLIGHT_LCD_SUPPORT is not set +# CONFIG_BACKTRACE_SELF_TEST is not set CONFIG_BASE_FULL=y CONFIG_BASE_SMALL=0 # CONFIG_BASLER_EXCITE is not set @@ -240,6 +241,7 @@ CONFIG_BLK_DEV=y CONFIG_BLOCK=y # CONFIG_BNX2 is not set # CONFIG_BONDING is not set +# CONFIG_BOOT_PRINTK_DELAY is not set # CONFIG_BOOT_TRACER is not set # CONFIG_BPQETHER is not set # CONFIG_BRIDGE_EBT_802_3 is not set @@ -431,10 +433,34 @@ CONFIG_CRYPTO_ZLIB=y # CONFIG_DAB is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_DCB is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_DEBUG_BUGVERBOSE is not set +# CONFIG_DEBUG_CREDENTIALS is not set +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set CONFIG_DEBUG_FS=y +# CONFIG_DEBUG_GPIO is not set # CONFIG_DEBUG_KERNEL is not set +# CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_KOBJECT is not set +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_DEBUG_MEMORY_INIT is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_SHIRQ is not set +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_DEBUG_PREEMPT is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_WRITECOUNT is not set # CONFIG_DECNET is not set CONFIG_DECOMPRESS_LZMA_NEEDED=y # CONFIG_DEFAULT_AS is not set @@ -451,6 +477,8 @@ CONFIG_DEFAULT_TCP_CONG="westwood" # CONFIG_DEFAULT_VEGAS is not set CONFIG_DEFAULT_WESTWOOD=y CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" +# CONFIG_DETECT_HUNG_TASK is not set +# CONFIG_DETECT_SOFTLOCKUP is not set # CONFIG_DEVKMEM is not set # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set # CONFIG_DEVTMPFS_MOUNT is not set @@ -518,6 +546,7 @@ CONFIG_EXTRA_FIRMWARE="" CONFIG_EXTRA_TARGETS="" # CONFIG_EZX_PCAP is not set # CONFIG_FAIR_GROUP_SCHED is not set +# CONFIG_FAULT_INJECTION is not set CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_FS is not set @@ -1062,6 +1091,7 @@ CONFIG_KERNEL_LZMA=y # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYS is not set +# CONFIG_KGDB is not set # CONFIG_KMEMTRACE is not set CONFIG_KMOD=y # CONFIG_KPROBES is not set @@ -1115,6 +1145,7 @@ CONFIG_LOCALVERSION="" CONFIG_LOCKDEP_SUPPORT=y # CONFIG_LOCKD is not set CONFIG_LOCKD_V4=y +# CONFIG_LOCK_STAT is not set CONFIG_LOG_BUF_SHIFT=14 # CONFIG_LOGIRUMBLEPAD2_FF is not set # CONFIG_LOGITECH_FF is not set @@ -1552,6 +1583,7 @@ CONFIG_NLS_DEFAULT="iso8859-1" # CONFIG_P54_COMMON is not set CONFIG_PACKET_MMAP=y CONFIG_PACKET=y +# CONFIG_PAGE_POISONING is not set # CONFIG_PAGE_SIZE_16KB is not set # CONFIG_PAGE_SIZE_32KB is not set CONFIG_PAGE_SIZE_4KB=y @@ -1692,6 +1724,7 @@ CONFIG_PROC_KCORE=y # CONFIG_PROC_PAGE_MONITOR is not set CONFIG_PROC_SYSCTL=y # CONFIG_PROFILING is not set +# CONFIG_PROVE_LOCKING is not set # CONFIG_QEMU is not set # CONFIG_QLA3XXX is not set # CONFIG_QNX4FS_FS is not set @@ -1723,6 +1756,7 @@ CONFIG_RAMFS=y # CONFIG_RCU_CPU_STALL_DETECTOR is not set CONFIG_RCU_FANOUT=32 # CONFIG_RCU_FANOUT_EXACT is not set +# CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_TRACE is not set # CONFIG_RD_BZIP2 is not set # CONFIG_RDC_17F3101X is not set @@ -1809,6 +1843,8 @@ CONFIG_RTC_LIB=y # CONFIG_RTL8366S_PHY_DEBUG_FS is not set # CONFIG_RTL8366S_PHY is not set CONFIG_RT_MUTEXES=y +# CONFIG_RT_MUTEX_TESTER is not set +# CONFIG_RUNTIME_DEBUG is not set CONFIG_RWSEM_GENERIC_SPINLOCK=y # CONFIG_S2IO is not set # CONFIG_SAMPLES is not set @@ -1832,6 +1868,8 @@ CONFIG_RWSEM_GENERIC_SPINLOCK=y # CONFIG_SCC is not set # CONFIG_SCHED_BFS is not set CONFIG_SCHED_CFS=y +# CONFIG_SCHED_DEBUG is not set +# CONFIG_SCHEDSTATS is not set # CONFIG_SCHED_TRACER is not set # CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_7000FASST is not set @@ -2359,6 +2397,7 @@ CONFIG_USB_EHCI_ROOT_HUB_TT=y CONFIG_USB_EZUSB=y # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_GADGET is not set +# CONFIG_USB_GADGET_DEBUG is not set # CONFIG_USB_GL860 is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_GSPCA_CONEX is not set From 669c4ccdd194cad02b46a2ce7d8f02986e3b89e1 Mon Sep 17 00:00:00 2001 From: thepeople Date: Sat, 13 Feb 2010 00:53:21 +0000 Subject: [PATCH 39/44] sync kernel config, closes #6675 git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19619 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/brcm47xx/config-2.6.32 | 1 + 1 file changed, 1 insertion(+) diff --git a/target/linux/brcm47xx/config-2.6.32 b/target/linux/brcm47xx/config-2.6.32 index a5ea2931f..e6022fdef 100644 --- a/target/linux/brcm47xx/config-2.6.32 +++ b/target/linux/brcm47xx/config-2.6.32 @@ -69,6 +69,7 @@ CONFIG_CSRC_R4K_LIB=y CONFIG_CSRC_R4K=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DEVPORT=y +DM_LOG_USERSPACE=n # CONFIG_DM9000 is not set CONFIG_DMA_NEED_PCI_MAP_STATE=y CONFIG_DMA_NONCOHERENT=y From aa5799156ed74e7ef9b8cf9975b2be00cc486df0 Mon Sep 17 00:00:00 2001 From: thepeople Date: Sat, 13 Feb 2010 01:05:31 +0000 Subject: [PATCH 40/44] fix mistake, thanks xMff git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19620 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/brcm47xx/config-2.6.32 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/linux/brcm47xx/config-2.6.32 b/target/linux/brcm47xx/config-2.6.32 index e6022fdef..5780b9df7 100644 --- a/target/linux/brcm47xx/config-2.6.32 +++ b/target/linux/brcm47xx/config-2.6.32 @@ -69,7 +69,7 @@ CONFIG_CSRC_R4K_LIB=y CONFIG_CSRC_R4K=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DEVPORT=y -DM_LOG_USERSPACE=n +CONFIG_DM_LOG_USERSPACE=n # CONFIG_DM9000 is not set CONFIG_DMA_NEED_PCI_MAP_STATE=y CONFIG_DMA_NONCOHERENT=y From ea0f6ae1f0416811d6ce319cb43962c70a6b17fe Mon Sep 17 00:00:00 2001 From: thepeople Date: Sat, 13 Feb 2010 01:07:44 +0000 Subject: [PATCH 41/44] add geodns addresses for the kernel, closes #6574 git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19621 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- scripts/download.pl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/download.pl b/scripts/download.pl index 560694696..fe27df5e8 100755 --- a/scripts/download.pl +++ b/scripts/download.pl @@ -135,6 +135,8 @@ foreach my $mirror (@ARGV) { push @mirrors, "ftp://ftp.leo.org/pub/comp/os/unix/gnu/$1"; push @mirrors, "ftp://ftp.digex.net/pub/gnu/$1"; } elsif ($mirror =~ /^\@KERNEL\/(.+)$/) { + push @mirrors, "ftp://ftp.geo.kernel.org/pub/$1"; + push @mirrors, "http://ftp.geo.kernel.org/pub/$1"; push @mirrors, "ftp://ftp.all.kernel.org/pub/$1"; push @mirrors, "http://ftp.all.kernel.org/pub/$1"; push @mirrors, "ftp://ftp.de.kernel.org/pub/$1"; From 7c22456d9dfdfc05b6925c933615bc9186f8098a Mon Sep 17 00:00:00 2001 From: jow Date: Sat, 13 Feb 2010 01:56:48 +0000 Subject: [PATCH 42/44] [imagebuilder] fix custom package selection git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19623 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/imagebuilder/files/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/imagebuilder/files/Makefile b/target/imagebuilder/files/Makefile index fe503118b..f73642b6a 100644 --- a/target/imagebuilder/files/Makefile +++ b/target/imagebuilder/files/Makefile @@ -81,7 +81,7 @@ $(TOPDIR)/tmp/ipkg.conf: FORCE @echo 'dest root /' > $@ @echo 'src packages file:$(PACKAGE_DIR)' >> $@ -BUILD_PACKAGES:=$(sort $(DEFAULT_PACKAGES) $($(PROFILE)_PACKAGES) kernel) +BUILD_PACKAGES:=$(sort $(DEFAULT_PACKAGES) $(PACKAGES) $($(PROFILE)_PACKAGES) kernel) # "-pkgname" in the package list means remove "pkgname" from the package list BUILD_PACKAGES:=$(filter-out $(filter -%,$(BUILD_PACKAGES)) $(patsubst -%,%,$(filter -%,$(BUILD_PACKAGES))),$(BUILD_PACKAGES)) From dfdd7a1581089661da6bad641317f33349619b61 Mon Sep 17 00:00:00 2001 From: lars Date: Sat, 13 Feb 2010 14:56:52 +0000 Subject: [PATCH 43/44] [kernel] More missing debug config symbols for the generic 2.6.32 config git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19624 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic-2.6/config-2.6.32 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/target/linux/generic-2.6/config-2.6.32 b/target/linux/generic-2.6/config-2.6.32 index 615430f53..19f706115 100644 --- a/target/linux/generic-2.6/config-2.6.32 +++ b/target/linux/generic-2.6/config-2.6.32 @@ -438,13 +438,16 @@ CONFIG_CRYPTO_ZLIB=y # CONFIG_DEBUG_CREDENTIALS is not set # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set +# CONFIG_DEBUG_ERRORS is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set CONFIG_DEBUG_FS=y # CONFIG_DEBUG_GPIO is not set # CONFIG_DEBUG_KERNEL is not set +# CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_KOBJECT is not set # CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_LL is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_DEBUG_NOTIFIERS is not set @@ -1646,6 +1649,7 @@ CONFIG_PARTITION_ADVANCED=y # CONFIG_PCF8575 is not set # CONFIG_PCI200SYN is not set # CONFIG_PCI_ATMEL is not set +# CONFIG_PCI_DEBUG is not set # CONFIG_PCI_DISABLE_COMMON_QUIRKS is not set # CONFIG_PCIEASPM is not set # CONFIG_PCI_HERMES is not set From 13590610e37cc346f38f98223c0cb23ea88f8f90 Mon Sep 17 00:00:00 2001 From: jow Date: Sat, 13 Feb 2010 20:15:05 +0000 Subject: [PATCH 44/44] [x86] move kernel config symbols from the Xen subtarget to the platform config git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19625 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/x86/config-2.6.32 | 72 ++++++++++++++++++++++--- target/linux/x86/xen_domu/config-2.6.32 | 37 +------------ 2 files changed, 65 insertions(+), 44 deletions(-) diff --git a/target/linux/x86/config-2.6.32 b/target/linux/x86/config-2.6.32 index 398c0668e..e05e9f798 100644 --- a/target/linux/x86/config-2.6.32 +++ b/target/linux/x86/config-2.6.32 @@ -22,6 +22,7 @@ # CONFIG_ACQUIRE_WDT is not set # CONFIG_ADVANTECH_WDT is not set # CONFIG_ALIM1535_WDT is not set +# CONFIG_APM is not set # CONFIG_APRICOT is not set # CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set # CONFIG_ASUS_LAPTOP is not set @@ -59,17 +60,23 @@ # CONFIG_ELPLUS is not set # CONFIG_EUROTECH_WDT is not set # CONFIG_FRAME_POINTER is not set +# CONFIG_FREEZER is not # CONFIG_GENERIC_CPU is not set +# CONFIG_GENERIC_PENDING_IRQ is not set # CONFIG_GENERIC_TIME_VSYSCALL is not set # CONFIG_HANGCHECK_TIMER is not set # CONFIG_HAVE_CPUMASK_OF_CPU_MAP is not set +# CONFIG_HAVE_PERF_EVENTS is not set # CONFIG_HIBERNATION is not set # CONFIG_HIGHMEM4G is not set # CONFIG_HIGHMEM64G is not set # CONFIG_HIGH_RES_TIMERS is not set -# CONFIG_HPET_TIMER is not set +# CONFIG_HOTPLUG_CPU is not set # CONFIG_HP_WATCHDOG is not set # CONFIG_HUGETLBFS is not set +# CONFIG_HVC_DRIVER is not set +# CONFIG_HVC_IRQ is not set +# CONFIG_HVC_XEN is not set # CONFIG_I6300ESB_WDT is not set # CONFIG_I8K is not set # CONFIG_IB700_WDT is not set @@ -92,9 +99,14 @@ # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KVM_CLOCK is not set +# CONFIG_KVM_GUEST is not set # CONFIG_LANCE is not set # CONFIG_LEDS_ALIX2 is not set # CONFIG_LEDS_CLEVO_MAIL is not set +# CONFIG_LGUEST_GUEST is not set +# CONFIG_LOCK_KERNEL is not set +# CONFIG_M386 is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586MMX is not set @@ -137,10 +149,14 @@ # CONFIG_NET_NS is not set # CONFIG_NET_VENDOR_RACAL is not set # CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NR_CPUS is not set # CONFIG_NSC_GPIO is not set # CONFIG_OLPC is not set # CONFIG_OPTIMIZE_INLINING is not set +# CONFIG_PARAVIRT is not set +# CONFIG_PARAVIRT_CLOCK is not set # CONFIG_PARAVIRT_GUEST is not set +# CONFIG_PARAVIRT_SPINLOCKS is not set # CONFIG_PC8736x_GPIO is not set # CONFIG_PC87413_WDT is not set # CONFIG_PCIEPORTBUS is not set @@ -150,20 +166,27 @@ # CONFIG_PCI_GOOLPC is not set # CONFIG_PCWATCHDOG is not set # CONFIG_PDA_POWER is not set +# CONFIG_PERF_COUNTERS is not set +# CONFIG_PERF_EVENTS is not set +# CONFIG_PHYS_ADDR_T_64BIT is not set # CONFIG_PM_DEBUG is not set # CONFIG_PM_RUNTIME is not set +# CONFIG_PM_SLEEP is not set +# CONFIG_PM_SLEEP_SMP is not set # CONFIG_PNPBIOS is not set # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PROCESSOR_SELECT is not set # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set # CONFIG_RELOCATABLE is not set -# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set +# CONFIG_RWSEM_GENERIC_SPINLOCK is not set # CONFIG_SBC7240_WDT is not set # CONFIG_SBC8360_WDT is not set # CONFIG_SBC_EPX_C3_WATCHDOG is not set # CONFIG_SC1200_WDT is not set # CONFIG_SC520_WDT is not set # CONFIG_SCHED_HRTICK is not set +# CONFIG_SCHED_MC is not set +# CONFIG_SCHED_SMT is not set # CONFIG_SCSI_LOWLEVEL is not set # CONFIG_SCx200_GPIO is not set # CONFIG_SCx200_WDT is not set @@ -174,10 +197,13 @@ # CONFIG_SLAB is not set # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_SLUB_STATS is not set +# CONFIG_SMP is not set # CONFIG_SMSC37B787_WDT is not set # CONFIG_SMSC_SCH311X_WDT is not set # CONFIG_SPARSE_IRQ is not set +# CONFIG_STOP_MACHINE is not set # CONFIG_SUSPEND is not set +# CONFIG_SYS_HYPERVISOR is not set # CONFIG_TC1100_WMI is not set # CONFIG_TELCLOCK is not set # CONFIG_THINKPAD_ACPI is not set @@ -186,22 +212,31 @@ # CONFIG_TREE_PREEMPT_RCU is not set # CONFIG_TYPHOON is not set # CONFIG_USER_NS is not set +# CONFIG_USE_GENERIC_SMP_HELPERS is not set # CONFIG_VGACON_SOFT_SCROLLBACK is not set +# CONFIG_VMI is not set # CONFIG_VORTEX is not set # CONFIG_VT_HW_CONSOLE_BINDING is not set # CONFIG_W83697UG_WDT is not set # CONFIG_WAFER_WDT is not set # CONFIG_WDT is not set +# CONFIG_X86_32_SMP is not set # CONFIG_X86_64 is not set # CONFIG_X86_ACPI_CPUFREQ is not set # CONFIG_X86_ANCIENT_MCE is not set +# CONFIG_X86_BIGSMP is not set # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set -# CONFIG_X86_CMPXCHG is not set +# CONFIG_X86_CMOV is not set +# CONFIG_X86_CMPXCHG64 is not set # CONFIG_X86_CPUFREQ_NFORCE2 is not set # CONFIG_X86_CPUID is not set +# CONFIG_X86_DEBUGCTLMSR is not set +# CONFIG_X86_DS is not set # CONFIG_X86_ELAN is not set +# CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_E_POWERSAVER is not set # CONFIG_X86_GX_SUSPMOD is not set +# CONFIG_X86_HT is not set # CONFIG_X86_LONGHAUL is not set # CONFIG_X86_LONGRUN is not set # CONFIG_X86_MCE_INJECT is not set @@ -218,6 +253,20 @@ # CONFIG_X86_SPEEDSTEP_ICH is not set # CONFIG_X86_SPEEDSTEP_LIB is not set # CONFIG_X86_SPEEDSTEP_SMI is not set +# CONFIG_X86_TRAMPOLINE is not set +# CONFIG_X86_TSC is not set +# CONFIG_X86_USE_PPRO_CHECKSUM is not set +# CONFIG_XEN is not set +# CONFIG_XENFS is not set +# CONFIG_XEN_BALLOON is not set +# CONFIG_XEN_BLKDEV_FRONTEND is not set +# CONFIG_XEN_DEBUG_FS is not set +# CONFIG_XEN_DEV_EVTCHN is not set +# CONFIG_XEN_MAX_DOMAIN_MEMORY is not set +# CONFIG_XEN_NETDEV_FRONTEND is not set +# CONFIG_XEN_SAVE_RESTORE is not set +# CONFIG_XEN_SCRUB_PAGES is not set +# CONFIG_XEN_SYS_HYPERVISOR is not set # CONFIG_ZONE_DMA32 is not set CONFIG_4KSTACKS=y CONFIG_ACPI=y @@ -331,7 +380,9 @@ CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y CONFIG_HID=y CONFIG_HID_SUPPORT=y CONFIG_HPET=y +CONFIG_HPET_EMULATE_RTC=y CONFIG_HPET_MMAP=y +CONFIG_HPET_TIMER=y CONFIG_HT_IRQ=y CONFIG_HW_CONSOLE=y CONFIG_HW_RANDOM=y @@ -357,7 +408,6 @@ CONFIG_KALLSYMS=y CONFIG_KEXEC=y CONFIG_KEYBOARD_ATKBD=y CONFIG_KTIME_SCALAR=y -CONFIG_M386=y CONFIG_MATH_EMULATION=y CONFIG_MICROCODE=y CONFIG_MICROCODE_INTEL=y @@ -373,9 +423,9 @@ CONFIG_MTRR=y CONFIG_NAMESPACES=y CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NET_VENDOR_3COM=y CONFIG_NOHIGHMEM=y -CONFIG_NR_CPUS=1 CONFIG_NVRAM=y CONFIG_OUTPUT_FORMAT="elf32-i386" CONFIG_PAGEFLAGS_EXTENDED=y @@ -403,6 +453,7 @@ CONFIG_PROC_PAGE_MONITOR=y CONFIG_RD_BZIP2=y CONFIG_RD_GZIP=y CONFIG_RTC=y +CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_SCHED_OMIT_FRAME_POINTER=y CONFIG_SCSI=y CONFIG_SCx200=y @@ -430,25 +481,28 @@ CONFIG_VT_CONSOLE=y CONFIG_X86=y CONFIG_X86_32=y CONFIG_X86_32_LAZY_GS=y +CONFIG_X86_BSWAP=y +CONFIG_X86_CMPXCHG=y CONFIG_X86_CPU=y -CONFIG_X86_EXTENDED_PLATFORM=y CONFIG_X86_F00F_BUG=y CONFIG_X86_GENERIC=y CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_INTERNODE_CACHE_BYTES=64 +CONFIG_X86_INVLPG=y CONFIG_X86_IO_APIC=y CONFIG_X86_L1_CACHE_BYTES=64 -CONFIG_X86_L1_CACHE_SHIFT=4 +CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_LOCAL_APIC=y CONFIG_X86_MCE=y CONFIG_X86_MCE_AMD=y CONFIG_X86_MCE_INTEL=y CONFIG_X86_MCE_THRESHOLD=y -CONFIG_X86_MINIMUM_CPU_FAMILY=3 +CONFIG_X86_MINIMUM_CPU_FAMILY=4 CONFIG_X86_MPPARSE=y CONFIG_X86_PAT=y CONFIG_X86_PLATFORM_DEVICES=y CONFIG_X86_PM_TIMER=y +CONFIG_X86_POPAD_OK=y CONFIG_X86_PPRO_FENCE=y CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y CONFIG_X86_RESERVE_LOW_64K=y @@ -457,3 +511,5 @@ CONFIG_X86_THERMAL_VECTOR=y CONFIG_X86_UP_APIC=y CONFIG_X86_UP_IOAPIC=y CONFIG_X86_VERBOSE_BOOTUP=y +CONFIG_X86_WP_WORKS_OK=y +CONFIG_X86_XADD=y diff --git a/target/linux/x86/xen_domu/config-2.6.32 b/target/linux/x86/xen_domu/config-2.6.32 index 322d57269..0e8a382f0 100644 --- a/target/linux/x86/xen_domu/config-2.6.32 +++ b/target/linux/x86/xen_domu/config-2.6.32 @@ -1,47 +1,18 @@ -# CONFIG_APM is not set # CONFIG_KERNEL_LZMA is not set -# CONFIG_KVM_CLOCK is not set -# CONFIG_KVM_GUEST is not set -# CONFIG_LGUEST_GUEST is not set -# CONFIG_M386 is not set -# CONFIG_NETWORK_FILESYSTEMS is not set -# CONFIG_PARAVIRT_SPINLOCKS is not set -# CONFIG_PERF_COUNTERS is not set -# CONFIG_PERF_EVENTS is not set -# CONFIG_RWSEM_GENERIC_SPINLOCK is not set -# CONFIG_SCHED_SMT is not set -# CONFIG_VMI is not set -# CONFIG_X86_BIGSMP is not set -# CONFIG_X86_DS is not set -# CONFIG_X86_EXTENDED_PLATFORM is not set -# CONFIG_X86_PLATFORM_DEVICES is not set -# CONFIG_XENFS is not set -# CONFIG_XEN_DEBUG_FS is not set -# CONFIG_XEN_DEV_EVTCHN is not set -# CONFIG_XEN_NETDEV_FRONTEND is not set -CONFIG_ACPI_CONTAINER=y -CONFIG_ACPI_HOTPLUG_CPU=y CONFIG_ARCH_PHYS_ADDR_T_64BIT=y CONFIG_FREEZER=y CONFIG_GENERIC_PENDING_IRQ=y -CONFIG_HAVE_PERF_EVENTS=y -CONFIG_HOTPLUG_CPU=y -CONFIG_HPET_EMULATE_RTC=y -CONFIG_HPET_TIMER=y CONFIG_HVC_DRIVER=y CONFIG_HVC_IRQ=y CONFIG_HVC_XEN=y CONFIG_KERNEL_GZIP=y CONFIG_LOCK_KERNEL=y CONFIG_MPENTIUM4=y -CONFIG_NR_CPUS=2 +CONFIG_NR_CPUS=4 CONFIG_PARAVIRT=y CONFIG_PARAVIRT_CLOCK=y CONFIG_PARAVIRT_GUEST=y CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_PM_SLEEP=y -CONFIG_PM_SLEEP_SMP=y -CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_SCHED_MC=y CONFIG_SMP=y CONFIG_SPARSE_IRQ=y @@ -49,22 +20,16 @@ CONFIG_STOP_MACHINE=y CONFIG_SYS_HYPERVISOR=y CONFIG_USE_GENERIC_SMP_HELPERS=y CONFIG_X86_32_SMP=y -CONFIG_X86_BSWAP=y CONFIG_X86_CMOV=y CONFIG_X86_CMPXCHG64=y -CONFIG_X86_CMPXCHG=y CONFIG_X86_DEBUGCTLMSR=y CONFIG_X86_HT=y -CONFIG_X86_INVLPG=y CONFIG_X86_L1_CACHE_SHIFT=7 CONFIG_X86_MINIMUM_CPU_FAMILY=5 CONFIG_X86_PAE=y -CONFIG_X86_POPAD_OK=y CONFIG_X86_TRAMPOLINE=y CONFIG_X86_TSC=y CONFIG_X86_USE_PPRO_CHECKSUM=y -CONFIG_X86_WP_WORKS_OK=y -CONFIG_X86_XADD=y CONFIG_XEN=y CONFIG_XEN_BALLOON=y CONFIG_XEN_BLKDEV_FRONTEND=y