summaryrefslogtreecommitdiffstats
path: root/freed-ora
diff options
context:
space:
mode:
authorAlexandre Oliva <lxoliva@fsfla.org>2011-05-17 03:34:23 +0000
committerAlexandre Oliva <lxoliva@fsfla.org>2011-05-17 03:34:23 +0000
commit0d06479e5e35e790c3ffb84cf40c5ee7436a61e7 (patch)
tree8b441982a2b2936bf32622443a9d0fd5029abe5c /freed-ora
parentbc77b11d05b9d80632d8d5e90b2158de02a5378b (diff)
downloadlinux-libre-raptor-0d06479e5e35e790c3ffb84cf40c5ee7436a61e7.tar.gz
linux-libre-raptor-0d06479e5e35e790c3ffb84cf40c5ee7436a61e7.zip
tag 2.6.38.6-27.fc15
Diffstat (limited to 'freed-ora')
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/.gitignore6
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/Makefile315
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/Makefile.config105
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/README.txt67
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/TODO61
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/acpi-ec-add-delay-before-write.patch51
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/acpi_reboot.patch102
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/add-appleir-usb-driver.patch702
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/apple_backlight.patch688
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/bonding-incorrect-tx-queue-offset.patch54
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/config-arm137
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/config-debug101
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/config-generic4500
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/config-i686-PAE9
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/config-ia64-generic208
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/config-local2
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/config-nodebug101
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/config-powerpc-generic343
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/config-powerpc32-generic186
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/config-powerpc32-smp4
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/config-powerpc64186
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/config-rhel-generic203
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/config-s390x235
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/config-sparc64-generic209
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/config-x86-generic546
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/config-x86_64-generic451
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/cx88-Fix-HVR4000-IR-keymap.patch55
-rwxr-xr-xfreed-ora/tags/f15/2.6.38.6-27.fc15/deblob-2.6.382398
-rwxr-xr-xfreed-ora/tags/f15/2.6.38.6-27.fc15/deblob-check5442
-rwxr-xr-xfreed-ora/tags/f15/2.6.38.6-27.fc15/deblob-main243
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/die-floppy-die.patch30
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/disable-i8042-check-on-apple-mac.patch59
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/dmar-disable-when-ricoh-multifunction.patch33
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/drm-i915-fix-pipelined-fencing.patch80
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-big-hammer.patch21
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-edp-fixes.patch44
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-eeebox-eb1007-quirk.patch36
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-make-lvds-work.patch23
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-next.patch1
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-restore-mode.patch128
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/drm-nouveau-fixes.patch168
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/drm-nouveau-updates.patch5912
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/drm-radeon-fix-regression-on-atom-cards-with-hardcoded-EDID-record.patch56
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/drm-radeon-update.patch4829
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/drm-ttm-move-notify.patch40
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/drm-vblank-events-fix-hangs.patch60
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/efifb_update.patch217
-rwxr-xr-xfreed-ora/tags/f15/2.6.38.6-27.fc15/find-provides44
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/fix_xen_guest_on_old_EC2.patch34
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/freedo.patch14673
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/genkey7
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/git-linus.diff0
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/hda_intel-prealloc-4mb-dmabuffer.patch47
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/ima-allow-it-to-be-completely-disabled-and-default-off.patch145
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/ips-use-interruptible-waits-in-ips-monitor.patch30
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/iwlwifi-add-_ack_plpc_check-module-parameters.patch96
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/kernel.spec2714
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-32bit-mmap-exec-randomization.patch216
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-acpi-debug-infinite-loop.patch24
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-acpi-video-dos.patch17
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-compile-fixes.patch6
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-crash-driver.patch381
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-debug-always-inline-kzalloc.patch25
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-debug-sizeof-structs.patch33
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-debug-taint-vm.patch65
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-debug-vm-would-have-oomkilled.patch69
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-defaults-acpi-video.patch13
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-defaults-aspm.patch12
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-defaults-pci_no_msi.patch110
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-defaults-pci_use_crs.patch29
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-e1000-ich9-montevina.patch30
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-enable-more-pci-autosuspend.patch452
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-firewire-git-pending.patch4
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-firewire-git-update.patch3682
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-hotfixes.patch15
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-i386-nx-emulation.patch615
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-input-kill-stupid-messages.patch32
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-intel-iommu-igfx.patch78
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-makefile-after_link.patch98
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-netconsole-deadlock.patch56
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-selinux-mprotect-checks.patch124
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-serial-460800.patch70
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-silence-acpi-blacklist.patch25
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-silence-fbcon-logo.patch42
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-silence-noise.patch72
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-sparc-selinux-mprotect-checks.patch35
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-tracehook.patch129
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-upstream-reverts.patch1
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-usb-pci-autosuspend.patch22
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-utrace-ptrace.patch2028
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-utrace-revert-make-ptrace-functions-static.patch47
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-utrace.patch4166
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-v4l-dvb-experimental.patch1326
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-v4l-dvb-fixes.patch0
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-v4l-dvb-update.patch7730
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.29-sparc-IOC_TYPECHECK.patch21
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.30-no-pcspkr-modalias.patch11
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.38-libre.tar.bz2.sign7
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.38-libre.xdelta.bz2bin0 -> 69904 bytes
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.38-libre.xdelta.bz2.sign7
-rwxr-xr-xfreed-ora/tags/f15/2.6.38.6-27.fc15/merge.pl66
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/neuter_intel_microcode_load.patch24
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/pci-enable-aspm-state-clearing-regardless-of-policy.patch29
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/pci-pcie-links-may-not-get-configured-for-aspm-under-powersave-mode.patch112
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/printk-do-not-mangle-valid-userspace-syslog-prefixes.patch214
-rwxr-xr-xfreed-ora/tags/f15/2.6.38.6-27.fc15/scripts/bumpspecfile.py71
-rwxr-xr-xfreed-ora/tags/f15/2.6.38.6-27.fc15/scripts/check-TODO.sh27
-rwxr-xr-xfreed-ora/tags/f15/2.6.38.6-27.fc15/scripts/combine.sh34
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/configcommon.pl82
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/configdiff.pl76
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-amd64.sh3
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-i586.sh3
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-i686.sh3
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ia64.sh2
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-iseries.sh3
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ppc.sh3
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ppc64.sh3
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ppc8260.sh3
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ppc8560.sh3
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-pseries.sh3
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-s390.sh2
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-s390x.sh2
-rwxr-xr-xfreed-ora/tags/f15/2.6.38.6-27.fc15/scripts/get-snapshot.sh35
-rwxr-xr-xfreed-ora/tags/f15/2.6.38.6-27.fc15/scripts/grab-logs.sh16
-rwxr-xr-xfreed-ora/tags/f15/2.6.38.6-27.fc15/scripts/newpatch.sh21
-rwxr-xr-xfreed-ora/tags/f15/2.6.38.6-27.fc15/scripts/pull-upstreams.sh12
-rwxr-xr-xfreed-ora/tags/f15/2.6.38.6-27.fc15/scripts/rebase.sh179
-rwxr-xr-xfreed-ora/tags/f15/2.6.38.6-27.fc15/scripts/reconfig.sh26
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/rediffall.pl64
-rwxr-xr-xfreed-ora/tags/f15/2.6.38.6-27.fc15/scripts/sort-config222
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/scsi-sd-downgrade-caching-printk-from-error-to-notice.patch27
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/scsi_dh_hp_sw-fix-deadlock-in-start_stop_endio.patch32
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/sources2
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/x86-dumpstack-correct-stack-dump-info-when-frame-pointer-is-available.patch352
-rw-r--r--freed-ora/tags/f15/2.6.38.6-27.fc15/x86-pci-preserve-existing-pci-bfsort-whitelist-for-dell-systems.patch55
135 files changed, 70973 insertions, 0 deletions
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/.gitignore b/freed-ora/tags/f15/2.6.38.6-27.fc15/.gitignore
new file mode 100644
index 000000000..bab15b175
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/.gitignore
@@ -0,0 +1,6 @@
+.svn
+linux-*.tar.bz2
+patch-*.bz2
+clog
+*.rpm
+kernel-2.6.*/
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/Makefile b/freed-ora/tags/f15/2.6.38.6-27.fc15/Makefile
new file mode 100644
index 000000000..705670ff1
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/Makefile
@@ -0,0 +1,315 @@
+# Makefile for source rpm: kernel
+SPECFILE := kernel.spec
+
+# use noarch for make prep instead of the current CPU
+# noarch creates and checks all config files not just the current one,
+# in addition "i386" isn't a valid kernel target
+PREPARCH = noarch
+
+# we only check the .sign signatures
+UPSTREAM_CHECKS = sign
+
+.PHONY: help
+help:
+%:
+ @echo "Try fedpkg $@ or something like that"
+ @exit 1
+
+include Makefile.config
+
+ifndef KVERSION
+KVERSION := $(shell awk '$$1 == "%define" && $$2 == "base_sublevel" { \
+ print "2.6." $$3 \
+ }' $(SPECFILE))
+endif
+
+prep:
+ fedpkg -v prep --arch=$(PREPARCH)
+
+extremedebug:
+ @perl -pi -e 's/# CONFIG_DEBUG_PAGEALLOC is not set/CONFIG_DEBUG_PAGEALLOC=y/' config-nodebug
+
+debug:
+ @perl -pi -e 's/# CONFIG_SLUB_DEBUG_ON is not set/CONFIG_SLUB_DEBUG_ON=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_LOCK_STAT is not set/CONFIG_LOCK_STAT=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_STACK_USAGE is not set/CONFIG_DEBUG_STACK_USAGE=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_SLAB is not set/CONFIG_DEBUG_SLAB=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_MUTEXES is not set/CONFIG_DEBUG_MUTEXES=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_RT_MUTEXES is not set/CONFIG_DEBUG_RT_MUTEXES=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_RWSEMS is not set/CONFIG_DEBUG_RWSEMS=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_LOCK_ALLOC is not set/CONFIG_DEBUG_LOCK_ALLOC=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_PROVE_LOCKING is not set/CONFIG_PROVE_LOCKING=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_PROVE_RCU is not set/CONFIG_PROVE_RCU=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_SPINLOCK is not set/CONFIG_DEBUG_SPINLOCK=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_VM is not set/CONFIG_DEBUG_VM=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_SLEEP_IN_IRQ is not set/CONFIG_DEBUG_SLEEP_IN_IRQ=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_FAULT_INJECTION is not set/CONFIG_FAULT_INJECTION=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_FAILSLAB is not set/CONFIG_FAILSLAB=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_FAIL_PAGE_ALLOC is not set/CONFIG_FAIL_PAGE_ALLOC=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_FAIL_IO_TIMEOUT is not set/CONFIG_FAIL_IO_TIMEOUT=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_FAIL_MAKE_REQUEST is not set/CONFIG_FAIL_MAKE_REQUEST=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_FAULT_INJECTION_DEBUG_FS is not set/CONFIG_FAULT_INJECTION_DEBUG_FS=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_FAULT_INJECTION_STACKTRACE_FILTER is not set/CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_SG is not set/CONFIG_DEBUG_SG=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_WRITECOUNT is not set/CONFIG_DEBUG_WRITECOUNT=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_OBJECTS is not set/CONFIG_DEBUG_OBJECTS=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_OBJECTS_FREE is not set/CONFIG_DEBUG_OBJECTS_FREE=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_OBJECTS_TIMERS is not set/CONFIG_DEBUG_OBJECTS_TIMERS=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_X86_PTDUMP is not set/CONFIG_X86_PTDUMP=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_CAN_DEBUG_DEVICES is not set/CONFIG_CAN_DEBUG_DEVICES=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_MODULE_FORCE_UNLOAD is not set/CONFIG_MODULE_FORCE_UNLOAD=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_SYSCTL_SYSCALL_CHECK is not set/CONFIG_SYSCTL_SYSCALL_CHECK=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_NOTIFIERS is not set/CONFIG_DEBUG_NOTIFIERS=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DMA_API_DEBUG is not set/CONFIG_DMA_API_DEBUG=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_PM_TEST_SUSPEND is not set/CONFIG_PM_TEST_SUSPEND=y/' config-generic
+ @perl -pi -e 's/# CONFIG_PM_ADVANCED_DEBUG is not set/CONFIG_PM_ADVANCED_DEBUG=y/' config-generic
+ @perl -pi -e 's/# CONFIG_BOOT_TRACER is not set/CONFIG_BOOT_TRACER=y/' config-generic
+ @perl -pi -e 's/# CONFIG_B43_DEBUG is not set/CONFIG_B43_DEBUG=y/' config-generic
+ @perl -pi -e 's/# CONFIG_B43LEGACY_DEBUG is not set/CONFIG_B43LEGACY_DEBUG=y/' config-generic
+ @perl -pi -e 's/# CONFIG_MMIOTRACE is not set/CONFIG_MMIOTRACE=y/' config-nodebug
+ @perl -pi -e 's/CONFIG_STRIP_ASM_SYMS=y/# CONFIG_STRIP_ASM_SYMS is not set/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_CREDENTIALS is not set/CONFIG_DEBUG_CREDENTIALS=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set/CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_ACPI_DEBUG is not set/CONFIG_ACPI_DEBUG=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_EXT4_DEBUG is not set/CONFIG_EXT4_DEBUG=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_PERF_USE_VMALLOC is not set/CONFIG_DEBUG_PERF_USE_VMALLOC=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_JBD2_DEBUG is not set/CONFIG_JBD2_DEBUG=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_CFQ_IOSCHED is not set/CONFIG_DEBUG_CFQ_IOSCHED=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DRBD_FAULT_INJECTION is not set/CONFIG_DRBD_FAULT_INJECTION=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_ATH_DEBUG is not set/CONFIG_ATH_DEBUG=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_CARL9170_DEBUGFS is not set/CONFIG_CARL9170_DEBUGFS=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_IWLWIFI_DEVICE_TRACING is not set/CONFIG_IWLWIFI_DEVICE_TRACING=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_OBJECTS_WORK is not set/CONFIG_DEBUG_OBJECTS_WORK=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set/CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DMADEVICES_DEBUG is not set/CONFIG_DMADEVICES_DEBUG=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DMADEVICES_VDEBUG is not set/CONFIG_DMADEVICES_VDEBUG=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_CEPH_LIB_PRETTYDEBUG is not set/CONFIG_CEPH_LIB_PRETTYDEBUG=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_QUOTA_DEBUG is not set/CONFIG_QUOTA_DEBUG=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_KGDB_KDB is not set/CONFIG_KGDB_KDB=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_KDB_KEYBOARD is not set/CONFIG_KDB_KEYBOARD=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_CPU_NOTIFIER_ERROR_INJECT is not set/CONFIG_CPU_NOTIFIER_ERROR_INJECT=m/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_PER_CPU_MAPS is not set/CONFIG_DEBUG_PER_CPU_MAPS=y/' config-nodebug
+ @perl -pi -e 's/CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y/# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set/' config-nodebug
+ #@perl -pi -e 's/# CONFIG_PCI_DEFAULT_USE_CRS is not set/CONFIG_PCI_DEFAULT_USE_CRS=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER is not set/CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y/' config-nodebug
+ @perl -pi -e 's/# CONFIG_TEST_LIST_SORT is not set/CONFIG_TEST_LIST_SORT=y/' config-nodebug
+
+ @perl -pi -e 's/# CONFIG_DEBUG_SET_MODULE_RONX is not set/CONFIG_DEBUG_SET_MODULE_RONX=y/' config-nodebug
+
+ @# just in case we're going from extremedebug -> debug
+ @perl -pi -e 's/CONFIG_DEBUG_PAGEALLOC=y/# CONFIG_DEBUG_PAGEALLOC is not set/' config-nodebug
+
+ @perl -pi -e 's/CONFIG_NR_CPUS=256/CONFIG_NR_CPUS=512/' config-x86_64-generic
+
+ @perl -pi -e 's/^%define debugbuildsenabled 1/%define debugbuildsenabled 0/' kernel.spec
+ @perl -pi -e 's/^%define rawhide_skip_docs 0/%define rawhide_skip_docs 1/' kernel.spec
+
+nodebuginfo:
+ @perl -pi -e 's/^%define with_debuginfo %\{\?_without_debuginfo: 0\} %\{\?\!_without_debuginfo: 1\}/%define with_debuginfo %\{\?_without_debuginfo: 0\} %\{\?\!_without_debuginfo: 0\}/' kernel.spec
+nodebug: release
+ @perl -pi -e 's/^%define debugbuildsenabled 1/%define debugbuildsenabled 0/' kernel.spec
+release:
+ @perl -pi -e 's/CONFIG_SLUB_DEBUG_ON=y/# CONFIG_SLUB_DEBUG_ON is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_LOCK_STAT=y/# CONFIG_LOCK_STAT is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_STACK_USAGE=y/# CONFIG_DEBUG_STACK_USAGE is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_SLAB=y/# CONFIG_DEBUG_SLAB is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_MUTEXES=y/# CONFIG_DEBUG_MUTEXES is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_RT_MUTEXES=y/# CONFIG_DEBUG_RT_MUTEXES is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_RWSEMS=y/# CONFIG_DEBUG_RWSEMS is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_LOCK_ALLOC=y/# CONFIG_DEBUG_LOCK_ALLOC is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_PROVE_LOCKING=y/# CONFIG_PROVE_LOCKING is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_PROVE_RCU=y/# CONFIG_PROVE_RCU is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_SPINLOCK=y/# CONFIG_DEBUG_SPINLOCK is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_VM=y/# CONFIG_DEBUG_VM is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_SLEEP_IN_IRQ=y/# CONFIG_DEBUG_SLEEP_IN_IRQ is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_FAULT_INJECTION=y/# CONFIG_FAULT_INJECTION is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_FAILSLAB=y/# CONFIG_FAILSLAB is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_FAIL_PAGE_ALLOC=y/# CONFIG_FAIL_PAGE_ALLOC is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_FAIL_IO_TIMEOUT=y/# CONFIG_FAIL_IO_TIMEOUT is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_FAIL_MAKE_REQUEST=y/# CONFIG_FAIL_MAKE_REQUEST is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_FAULT_INJECTION_DEBUG_FS=y/# CONFIG_FAULT_INJECTION_DEBUG_FS is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y/# CONFIG_FAULT_INJECTION_STACKTRACE_FILTER is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_SG=y/# CONFIG_DEBUG_SG is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_WRITECOUNT=y/# CONFIG_DEBUG_WRITECOUNT is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_OBJECTS=y/# CONFIG_DEBUG_OBJECTS is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_OBJECTS_FREE=y/# CONFIG_DEBUG_OBJECTS_FREE is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_OBJECTS_TIMERS=y/# CONFIG_DEBUG_OBJECTS_TIMERS is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_X86_PTDUMP=y/# CONFIG_X86_PTDUMP is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_CAN_DEBUG_DEVICES=y/# CONFIG_CAN_DEBUG_DEVICES is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_MODULE_FORCE_UNLOAD=y/# CONFIG_MODULE_FORCE_UNLOAD is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_SYSCTL_SYSCALL_CHECK=y/# CONFIG_SYSCTL_SYSCALL_CHECK is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_NOTIFIERS=y/# CONFIG_DEBUG_NOTIFIERS is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DMA_API_DEBUG=y/# CONFIG_DMA_API_DEBUG is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_PM_TEST_SUSPEND=y/#\ CONFIG_PM_TEST_SUSPEND\ is\ not\ set/' config-generic
+ @perl -pi -e 's/CONFIG_PM_ADVANCED_DEBUG=y/#\ CONFIG_PM_ADVANCED_DEBUG\ is\ not\ set/' config-generic
+ @perl -pi -e 's/CONFIG_BOOT_TRACER=y/#\ CONFIG_BOOT_TRACER\ is\ not\ set/' config-generic
+ @perl -pi -e 's/CONFIG_B43_DEBUG=y/# CONFIG_B43_DEBUG is not set/' config-generic
+ @perl -pi -e 's/CONFIG_B43LEGACY_DEBUG=y/# CONFIG_B43LEGACY_DEBUG is not set/' config-generic
+ @perl -pi -e 's/CONFIG_MMIOTRACE=y/# CONFIG_MMIOTRACE is not set/' config-nodebug
+ @perl -pi -e 's/# CONFIG_STRIP_ASM_SYMS is not set/CONFIG_STRIP_ASM_SYMS=y/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_CREDENTIALS=y/# CONFIG_DEBUG_CREDENTIALS is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y/# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_ACPI_DEBUG=y/# CONFIG_ACPI_DEBUG is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_EXT4_DEBUG=y/# CONFIG_EXT4_DEBUG is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_PERF_USE_VMALLOC=y/# CONFIG_DEBUG_PERF_USE_VMALLOC is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_JBD2_DEBUG=y/# CONFIG_JBD2_DEBUG is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_CFQ_IOSCHED=y/# CONFIG_DEBUG_CFQ_IOSCHED is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DRBD_FAULT_INJECTION=y/# CONFIG_DRBD_FAULT_INJECTION is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_ATH_DEBUG=y/# CONFIG_ATH_DEBUG is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_CARL9170_DEBUGFS=y/# CONFIG_CARL9170_DEBUGFS is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_IWLWIFI_DEVICE_TRACING=y/# CONFIG_IWLWIFI_DEVICE_TRACING is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_OBJECTS_WORK=y/# CONFIG_DEBUG_OBJECTS_WORK is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y/# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DMADEVICES_DEBUG=y/# CONFIG_DMADEVICES_DEBUG is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DMADEVICES_VDEBUG=y/# CONFIG_DMADEVICES_VDEBUG is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_CEPH_LIB_PRETTYDEBUG=y/# CONFIG_CEPH_LIB_PRETTYDEBUG is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_QUOTA_DEBUG=y/# CONFIG_QUOTA_DEBUG is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_CPU_NOTIFIER_ERROR_INJECT=m/# CONFIG_CPU_NOTIFIER_ERROR_INJECT is not set/' config-nodebug
+ #@perl -pi -e 's/CONFIG_KGDB_KDB=y/# CONFIG_KGDB_KDB is not set/' config-nodebug
+ #@perl -pi -e 's/CONFIG_KDB_KEYBOARD=y/# CONFIG_KDB_KEYBOARD is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_PER_CPU_MAPS=y/# CONFIG_DEBUG_PER_CPU_MAPS is not set/' config-nodebug
+ @perl -pi -e 's/# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set/CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y/' config-nodebug
+ #@perl -pi -e 's/CONFIG_PCI_DEFAULT_USE_CRS=y/# CONFIG_PCI_DEFAULT_USE_CRS is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y/# CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER is not set/' config-nodebug
+ @perl -pi -e 's/CONFIG_TEST_LIST_SORT=y/# CONFIG_TEST_LIST_SORT is not set/' config-nodebug
+
+ @perl -pi -e 's/CONFIG_DEBUG_SET_MODULE_RONX=y/# CONFIG_DEBUG_SET_MODULE_RONX is not set/' config-nodebug
+
+ @perl -pi -e 's/CONFIG_DEBUG_PAGEALLOC=y/# CONFIG_DEBUG_PAGEALLOC is not set/' config-debug
+ @perl -pi -e 's/CONFIG_DEBUG_PAGEALLOC=y/# CONFIG_DEBUG_PAGEALLOC is not set/' config-nodebug
+
+ @perl -pi -e 's/CONFIG_NR_CPUS=512/CONFIG_NR_CPUS=256/' config-x86_64-generic
+
+ @perl -pi -e 's/^%define debugbuildsenabled 0/%define debugbuildsenabled 1/' kernel.spec
+ @perl -pi -e 's/^%define rawhide_skip_docs 1/%define rawhide_skip_docs 0/' kernel.spec
+
+reconfig:
+ @rm -f kernel-*-config
+ @VERSION=$(KVERSION) make -f Makefile.config configs
+ @scripts/reconfig.sh
+
+unused-kernel-patches:
+ @for f in *.patch; do if [ -e $$f ]; then (egrep -q "^Patch[[:digit:]]+:[[:space:]]+$$f" $(SPECFILE) || echo "Unused: $$f") && egrep -q "^ApplyPatch[[:space:]]+$$f|^ApplyOptionalPatch[[:space:]]+$$f" $(SPECFILE) || echo "Unapplied: $$f"; fi; done
+
+# since i386 isn't a target...
+compile compile-short: DIST_DEFINES += --target $(shell uname -m)
+
+# 'make local' also needs to build the noarch firmware package
+local: noarch
+
+#
+# Hacks for building vanilla (unpatched) kernel rpms.
+# Use "make vanilla-TARGET" like "make TARGET" (make vanilla-scratch-build).
+#
+vanilla-%: $(SPECFILE:.spec=-vanilla.spec)
+ @$(MAKE) $* SPECFILE=$<
+
+$(SPECFILE:.spec=-vanilla.spec): $(SPECFILE)
+ @rm -f $@
+ (echo %define nopatches 1; cat $<) > $@
+
+#scratch-build: NAME = $(shell rpm $(RPM_DEFINES) $(DIST_DEFINES) -q --qf "%{NAME}\n" --specfile $(SPECFILE)| head -1)
+#scratch-build: test-srpm
+# $(BUILD_CLIENT) build $(BUILD_FLAGS) --scratch $(TARGET) \
+# $(SRCRPMDIR)/$(NAME)-$(VERSION)-$(RELEASE).src.rpm
+
+# Dismal kludge for building via brew from cvs after "make vanilla-tag".
+ifdef BEEHIVE_SRPM_BUILD
+export CHECKOUT_TAG ?= $(shell sed s/^.// CVS/Tag)
+tag-pattern = $(TAG_NAME)-$(TAG_VERSION)-0_%_$(TAG_RELEASE)
+ifeq (,$(filter-out $(tag-pattern),$(CHECKOUT_TAG)))
+variant := $(patsubst $(tag-pattern),%,$(CHECKOUT_TAG))
+srpm: SPECFILE := $(wildcard $(SPECFILE:.spec=-$(variant).spec) \
+ $(SPECFILE:.spec=.t.$(variant).spec))
+srpm beehive-sprm: RELEASE := 0.$(variant).$(RELEASE)
+endif
+endif
+
+#
+# Hacks for building kernel rpms from upstream code plus local GIT branches.
+# Use "make git/BRANCH/TARGET" like "make TARGET".
+# Use "make git/BRANCH-fedora/TARGET" to include Fedora patches on top.
+#
+ifndef GIT_SPEC
+git/%:
+ @$(MAKE) GIT_SPEC=$(subst /,-,$(*D)) git-$(*F)
+else
+git-%: $(SPECFILE:.spec=.t.$(GIT_SPEC).spec)
+ @$(MAKE) GIT_SPEC= $* SPECFILE=$<
+endif
+
+#
+# Your git-branches.mk file can define GIT_DIR, e.g.:
+# GIT_DIR = ${HOME}/kernel/.git
+# Make sure GIT_AUTHOR_NAME and GIT_AUTHOR_EMAIL are also set
+# or your rpm changelogs will look like crap.
+#
+# For each branch it can define a variable branch-BRANCH or tag-BRANCH
+# giving the parent of BRANCH to diff against in a separate patch. If
+# the parent is unknown, it will use $(branch-upstream) defaulting to
+# "refs/remotes/upstream/master".
+#
+# Defining tag-BRANCH means the tag corresponds to an upstream patch in
+# the sources file, so that is used instead of generating a patch with
+# git. If there is no tag-upstream defined, it will figure out a vNNN
+# tag or vNNN-gitN pseudo-tag from the last patch in the sources file.
+# For example:
+# tag-some-hacks = v2.6.21-rc5
+# branch-more-hacks = some-hacks
+# Leads to patches:
+# git diff v2.6.21-rc5..more-hacks > linux-2.6.21-rc5-some-hacks.patch
+# git diff some-hacks..more-hacks > linux-2.6.21-rc5-more-hacks.patch
+# Whereas having no git-branches.mk at all but doing
+# "make GIT_DIR=... git/mybranch/test-srpm" does:
+# id=`cat patch-2.6.21-rc5-git4.id` # auto-fetched via upstream file
+# git diff $id..upstream > linux-2.6.21-rc5-git4-upstream.patch
+# git diff upstream..mybranch > linux-2.6.21-rc5-git4-mybranch.patch
+# If the upstream patch (or any branch patch) is empty it's left out.
+#
+git-branches.mk:;
+-include git-branches.mk
+
+branch-upstream ?= refs/remotes/upstream/master
+
+ifdef GIT_DIR
+export GIT_DIR
+export GIT_AUTHOR_NAME
+export GIT_AUTHOR_EMAIL
+gen-patches ?= gen-patches
+
+ifndef havespec
+$(SPECFILE:.spec=.t.%-fedora.spec): $(SPECFILE) $(gen-patches) FORCE
+ ./$(gen-patches) --fedora < $< > $@ $(gen-patches-args)
+$(SPECFILE:.spec=.t.%.spec): $(SPECFILE) $(gen-patches) FORCE
+ ./$(gen-patches) < $< > $@ $(gen-patches-args)
+.PRECIOUS: $(SPECFILE:.spec=.t.%.spec) $(SPECFILE:.spec=.t.%-fedora.spec)
+endif
+
+spec-%: $(SPECFILE:.spec=.t.%.spec) ;
+$(SPECFILE):;
+FORCE:;
+
+branch-of-* = $(firstword $(head-$*) $*)
+gen-patches-args = --name $* v$(KVERSION) $(call heads,$(branch-of-*))
+define heads
+$(if $(tag-$1),$(filter-out v$(KVERSION),$(tag-$1)),\
+ $(call heads,$(firstword $(branch-$1) $(branch-upstream)))) $1
+endef
+
+files-%-fedora:
+ @echo $(SPECFILE:.spec=.t.$*-fedora.spec)
+ @$(call list-patches,$(branch-of-*))
+files-%:
+ @echo $(SPECFILE:.spec=.t.$*.spec)
+ @$(call list-patches,$(branch-of-*))
+define list-patches
+$(if $(tag-$1),version=$(patsubst v%,%,$(tag-$1)),\
+ $(call list-patches,$(firstword $(branch-$1) $(branch-upstream)))); \
+echo linux-$${version}-$(patsubst refs/remotes/%/master,%,$1).patch
+endef
+
+ifndef tag-$(branch-upstream)
+tag-$(branch-upstream) := $(shell \
+ sed -n 's/^.* *//;s/\.bz2$$//;s/patch-/v/;/^v/h;$${g;p}' sources)
+endif
+endif
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/Makefile.config b/freed-ora/tags/f15/2.6.38.6-27.fc15/Makefile.config
new file mode 100644
index 000000000..53812fa9b
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/Makefile.config
@@ -0,0 +1,105 @@
+# Make rules for configuration files.
+#
+# $Id$
+
+CFG = kernel-$(VERSION)
+
+CONFIGFILES = \
+ $(CFG)-i686.config $(CFG)-i686-debug.config \
+ $(CFG)-i686-PAE.config $(CFG)-i686-PAEdebug.config \
+ $(CFG)-x86_64.config $(CFG)-x86_64-debug.config \
+ $(CFG)-s390x.config $(CFG)-arm.config \
+ $(CFG)-ppc.config $(CFG)-ppc-smp.config \
+ $(CFG)-sparc64.config \
+ $(CFG)-ppc64.config $(CFG)-ppc64-debug.config \
+ $(CFG)-ia64.config
+
+PLATFORMS = x86 x86_64 powerpc powerpc32 powerpc64 s390x ia64 sparc64
+TEMPFILES = $(addprefix temp-, $(addsuffix -generic, $(PLATFORMS)))
+
+configs: $(CONFIGFILES)
+ @rm -f kernel-*-config
+ @rm -f $(TEMPFILES)
+ @rm -f temp-generic temp-*-generic temp-*-generic-tmp
+
+# Augment the clean target to clean up our own cruft
+clean ::
+ @rm -fv $(CONFIGFILES) $(TEMPFILES) temp-generic kernel-$(VERSION)*config
+
+temp-generic: config-generic
+ cat config-generic config-nodebug > temp-generic
+
+temp-debug-generic: config-generic
+ cat config-generic config-debug > temp-debug-generic
+
+temp-x86-generic: config-x86-generic temp-generic
+ perl merge.pl $^ > $@
+
+temp-x86-debug-generic: config-x86-generic temp-debug-generic
+ perl merge.pl $^ > $@
+
+temp-x86_64-generic: config-x86_64-generic temp-generic
+ perl merge.pl $^ > $@
+
+temp-x86_64-debug-generic: config-x86_64-generic temp-debug-generic
+ perl merge.pl $^ > $@
+
+temp-sparc64-generic: config-sparc64-generic temp-generic
+ perl merge.pl $^ > $@
+
+temp-powerpc-generic: config-powerpc-generic temp-generic
+ perl merge.pl $^ > $@
+
+temp-powerpc-debug-generic: config-powerpc-generic temp-debug-generic
+ perl merge.pl $^ > $@
+
+temp-powerpc32-generic: config-powerpc32-generic temp-powerpc-generic
+ perl merge.pl $^ > $@
+
+temp-s390-generic: config-s390x temp-generic
+ perl merge.pl $^ > $@
+
+temp-ia64-generic: config-ia64-generic temp-generic
+ perl merge.pl $^ > $@
+
+kernel-$(VERSION)-i686-PAE.config: config-i686-PAE temp-x86-generic
+ perl merge.pl $^ i386 > $@
+
+kernel-$(VERSION)-i686-PAEdebug.config: config-i686-PAE temp-x86-debug-generic
+ perl merge.pl $^ i386 > $@
+
+kernel-$(VERSION)-i686.config: /dev/null temp-x86-generic
+ perl merge.pl $^ i386 > $@
+
+kernel-$(VERSION)-i686-debug.config: /dev/null temp-x86-debug-generic
+ perl merge.pl $^ i386 > $@
+
+kernel-$(VERSION)-x86_64.config: /dev/null temp-x86_64-generic
+ perl merge.pl $^ x86_64 > $@
+
+kernel-$(VERSION)-x86_64-debug.config: /dev/null temp-x86_64-debug-generic
+ perl merge.pl $^ x86_64 > $@
+
+kernel-$(VERSION)-sparc64.config: /dev/null temp-sparc64-generic
+ perl merge.pl $^ sparc64 > $@
+
+kernel-$(VERSION)-ppc64.config: config-powerpc64 temp-powerpc-generic
+ perl merge.pl $^ powerpc > $@
+
+kernel-$(VERSION)-ppc64-debug.config: config-powerpc64 temp-powerpc-debug-generic
+ perl merge.pl $^ powerpc > $@
+
+kernel-$(VERSION)-s390x.config: config-s390x temp-s390-generic
+ perl merge.pl $^ s390 > $@
+
+kernel-$(VERSION)-arm.config: config-arm temp-generic
+ perl merge.pl $^ arm > $@
+
+kernel-$(VERSION)-ppc.config: /dev/null temp-powerpc32-generic
+ perl merge.pl $^ powerpc > $@
+
+kernel-$(VERSION)-ppc-smp.config: config-powerpc32-smp temp-powerpc32-generic
+ perl merge.pl $^ powerpc > $@
+
+kernel-$(VERSION)-ia64.config: /dev/null temp-ia64-generic
+ perl merge.pl $^ ia64 > $@
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/README.txt b/freed-ora/tags/f15/2.6.38.6-27.fc15/README.txt
new file mode 100644
index 000000000..482f8ea5b
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/README.txt
@@ -0,0 +1,67 @@
+
+ Kernel package tips & tricks.
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The kernel is one of the more complicated packages in the distro, and
+for the newcomer, some of the voodoo in the spec file can be somewhat scary.
+This file attempts to document some of the magic.
+
+
+Speeding up make prep
+---------------------
+The kernel is nearly 500MB of source code, and as such, 'make prep'
+takes a while. The spec file employs some trickery so that repeated
+invocations of make prep don't take as long. Ordinarily the %prep
+phase of a package will delete the tree it is about to untar/patch.
+The kernel %prep keeps around an unpatched version of the tree,
+and makes a symlink tree clone of that clean tree and than applies
+the patches listed in the spec to the symlink tree.
+This makes a huge difference if you're doing multiple make preps a day.
+As an added bonus, doing a diff between the clean tree and the symlink
+tree is slightly faster than it would be doing two proper copies of the tree.
+
+
+build logs.
+-----------
+There's a convenience helper script in scripts/grab-logs.sh
+that will grab the build logs from koji for the kernel version reported
+by make verrel
+
+
+config heirarchy.
+-----------------
+Instead of having to maintain a config file for every arch variant we build on,
+the kernel spec uses a nested system of configs. At the top level, is
+config-generic. Add options here that should be present in every possible
+config on all architectures.
+Beneath this are per-arch overrides. For example config-x86-generic add
+additional x86 specific options, and also _override_ any options that were
+set in config-generic.
+There exist two additional overrides, config-debug, and config-nodebug,
+which override -generic, and the per-arch overrides. It is documented
+further below.
+
+debug options.
+--------------
+This is a little complicated, as the purpose & meaning of this changes
+depending on where we are in the release cycle.
+If we are building for a current stable release, 'make release' has
+typically been run already, which sets up the following..
+- Two builds occur, a 'kernel' and a 'kernel-debug' flavor.
+- kernel-debug will get various heavyweight debugging options like
+ lockdep etc turned on.
+
+If we are building for rawhide, 'make debug' has been run, which changes
+the status quo to:
+- We only build one kernel 'kernel'
+- The debug options from 'config-debug' are always turned on.
+This is done to increase coverage testing, as not many people actually
+run kernel-debug.
+
+To add new debug options, add an option to _both_ config-debug and config-nodebug,
+and also new stanzas to the Makefile 'debug' and 'release' targets.
+
+Sometimes debug options get added to config-generic, or per-arch overrides
+instead of config-[no]debug. In this instance, the options should have no
+discernable performance impact, otherwise they belong in the debug files.
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/TODO b/freed-ora/tags/f15/2.6.38.6-27.fc15/TODO
new file mode 100644
index 000000000..abaefae05
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/TODO
@@ -0,0 +1,61 @@
+# Put stuff likely to go upstream (in decreasing likelyhood) at the top.
+#
+
+* linux-2.6-firewire-git-update.patch
+ perpetual updates from git trees.
+
+* linux-2.6-compile-fixes.patch
+* linux-2.6-hotfixes.patch
+ Empty
+
+* linux-2.6-build-nonintconfig.patch
+* linux-2.6-debug-nmi-timeout.patch
+* linux-2.6-debug-spinlock-taint.patch
+* linux-2.6-debug-taint-vm.patch
+* linux-2.6-debug-vm-would-have-oomkilled.patch
+ TODO: Push upstream
+
+* linux-2.6-acpi-video-dos.patch
+* linux-2.6-defaults-acpi-video.patch
+ Fedora policy decisions
+ Turn into CONFIG_ options and upstream ?
+
+* linux-2.6-crash-driver.patch
+ Unlikely to go upstream.
+ https://bugzilla.redhat.com/show_bug.cgi?id=492803
+
+* linux-2.6-debug-always-inline-kzalloc.patch
+ Sent upstream Sep 25 2008
+
+* linux-2.6-debug-sizeof-structs.patch
+ Fedora local debug stuff.
+
+* linux-2.6-utrace.patch
+ utrace
+
+* linux-2.6-defaults-pci_no_msi.patch
+ Fedora local choices uninteresting to upstream
+
+* linux-2.6-input-kill-stupid-messages.patch
+* linux-2.6-silence-acpi-blacklist.patch
+* linux-2.6-silence-fbcon-logo.patch
+* linux-2.6-silence-noise.patch
+ Fedora local 'hush' patches. (Some will go upstream next time)
+
+* linux-2.6-execshield.patch
+ Not interesting to upstream.
+
+* lirc-2.6.33.patch
+* hdpvr-ir-enable.patch
+ jarod working on upstreaming
+
+* linux-2.6-selinux-mprotect-checks.patch
+* linux-2.6-sparc-selinux-mprotect-checks.patch
+ Newer version might go upstream at some point.
+
+* linux-2.6-serial-460800.patch
+ Probably not upstreamable.
+ http://marc.theaimsgroup.com/?l=linux-kernel&m=112687270832687&w=2
+ https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=126403
+ http://lkml.org/lkml/2006/8/2/208
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/acpi-ec-add-delay-before-write.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/acpi-ec-add-delay-before-write.patch
new file mode 100644
index 000000000..f1cb50817
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/acpi-ec-add-delay-before-write.patch
@@ -0,0 +1,51 @@
+https://bugzilla.kernel.org/show_bug.cgi?id=14733#c41
+
+diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
+index 27e0b92..09fbb69 100644
+--- a/drivers/acpi/ec.c
++++ b/drivers/acpi/ec.c
+@@ -226,6 +226,7 @@ static int ec_poll(struct acpi_ec *ec)
+ if (ec_transaction_done(ec))
+ return 0;
+ } else {
++ msleep(1);
+ if (wait_event_timeout(ec->wait,
+ ec_transaction_done(ec),
+ msecs_to_jiffies(1)))
+@@ -233,8 +234,8 @@ static int ec_poll(struct acpi_ec *ec)
+ }
+ advance_transaction(ec, acpi_ec_read_status(ec));
+ } while (time_before(jiffies, delay));
+- if (acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF)
+- break;
++// if (acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF)
++// break;
+ pr_debug(PREFIX "controller reset, restart transaction\n");
+ spin_lock_irqsave(&ec->curr_lock, flags);
+ start_transaction(ec);
+@@ -271,15 +272,24 @@ static int ec_check_ibf0(struct acpi_ec *ec)
+ return (status & ACPI_EC_FLAG_IBF) == 0;
+ }
+
++/* try to clean input buffer with burst_disable transaction */
++static int acpi_ec_clean_buffer(struct acpi_ec *ec)
++{
++ struct transaction t = {.command = ACPI_EC_BURST_DISABLE,
++ .wdata = NULL, .rdata = NULL,
++ .wlen = 0, .rlen = 0};
++ return acpi_ec_transaction_unlocked(ec, &t);
++}
++
+ static int ec_wait_ibf0(struct acpi_ec *ec)
+ {
+ unsigned long delay = jiffies + msecs_to_jiffies(ec_delay);
+ /* interrupt wait manually if GPE mode is not active */
+ while (time_before(jiffies, delay))
+ if (wait_event_timeout(ec->wait, ec_check_ibf0(ec),
+ msecs_to_jiffies(1)))
+ return 0;
+- return -ETIME;
++ return acpi_ec_clean_buffer(ec);
+ }
+
+ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/acpi_reboot.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/acpi_reboot.patch
new file mode 100644
index 000000000..a980b31f7
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/acpi_reboot.patch
@@ -0,0 +1,102 @@
+Improve our reboot handling for compatibility with Windows. Upstream in .38?
+
+diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
+index c495aa8..c770e66 100644
+--- a/arch/x86/kernel/reboot.c
++++ b/arch/x86/kernel/reboot.c
+@@ -34,7 +34,7 @@ EXPORT_SYMBOL(pm_power_off);
+
+ static const struct desc_ptr no_idt = {};
+ static int reboot_mode;
+-enum reboot_type reboot_type = BOOT_KBD;
++enum reboot_type reboot_type = BOOT_ACPI;
+ int reboot_force;
+
+ #if defined(CONFIG_X86_32) && defined(CONFIG_SMP)
+@@ -538,9 +538,23 @@ void __attribute__((weak)) mach_reboot_fixups(void)
+ {
+ }
+
++/*
++ * Windows does the following on reboot:
++ * 1) If the FADT has the ACPI reboot register flag set, try it
++ * 2) If still alive, write to the keyboard controller
++ * 3) If still alive, write to the ACPI reboot register again
++ * 4) Ig still alive, write to the keyboard controller again
++ *
++ * If the machine is still alive at this stage, it gives up. We default to
++ * following the same pattern, except that if we're still alive after (4) we'll
++ * try to force a triple fault and then cycle between hitting the keyboard
++ * controller and doing that
++ */
+ static void native_machine_emergency_restart(void)
+ {
+ int i;
++ int attempt = 0;
++ int orig_reboot_type = reboot_type;
+
+ if (reboot_emergency)
+ emergency_vmx_disable_all();
+@@ -562,6 +576,13 @@ static void native_machine_emergency_restart(void)
+ outb(0xfe, 0x64); /* pulse reset low */
+ udelay(50);
+ }
++ if (attempt == 0 && orig_reboot_type == BOOT_ACPI) {
++ attempt = 1;
++ reboot_type = BOOT_ACPI;
++ } else {
++ reboot_type = BOOT_TRIPLE;
++ }
++ break;
+
+ case BOOT_TRIPLE:
+ load_idt(&no_idt);
+diff --git a/drivers/acpi/acpica/hwxface.c b/drivers/acpi/acpica/hwxface.c
+index 50cc3be..c6a4e63 100644
+--- a/drivers/acpi/acpica/hwxface.c
++++ b/drivers/acpi/acpica/hwxface.c
+@@ -82,12 +82,11 @@ acpi_status acpi_reset(void)
+ /*
+ * For I/O space, write directly to the OSL. This bypasses the port
+ * validation mechanism, which may block a valid write to the reset
+- * register.
++ * register. Spec section 4.7.3.6 requires register width to be 8.
+ */
+ status =
+ acpi_os_write_port((acpi_io_address) reset_reg->address,
+- acpi_gbl_FADT.reset_value,
+- reset_reg->bit_width);
++ acpi_gbl_FADT.reset_value, 8);
+ } else {
+ /* Write the reset value to the reset register */
+
+diff --git a/drivers/acpi/reboot.c b/drivers/acpi/reboot.c
+index 93f9114..a6c77e8b 100644
+--- a/drivers/acpi/reboot.c
++++ b/drivers/acpi/reboot.c
+@@ -15,9 +15,15 @@ void acpi_reboot(void)
+
+ rr = &acpi_gbl_FADT.reset_register;
+
+- /* Is the reset register supported? */
+- if (!(acpi_gbl_FADT.flags & ACPI_FADT_RESET_REGISTER) ||
+- rr->bit_width != 8 || rr->bit_offset != 0)
++ /* ACPI reset register was only introduced with v2 of the FADT */
++
++ if (acpi_gbl_FADT.header.revision < 2)
++ return;
++
++ /* Is the reset register supported? The spec says we should be
++ * checking the bit width and bit offset, but Windows ignores
++ * these fields */
++ if (!(acpi_gbl_FADT.flags & ACPI_FADT_RESET_REGISTER))
+ return;
+
+ reset_value = acpi_gbl_FADT.reset_value;
+@@ -45,6 +51,4 @@ void acpi_reboot(void)
+ acpi_reset();
+ break;
+ }
+- /* Wait ten seconds */
+- acpi_os_stall(10000000);
+ }
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/add-appleir-usb-driver.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/add-appleir-usb-driver.patch
new file mode 100644
index 000000000..af4f968f6
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/add-appleir-usb-driver.patch
@@ -0,0 +1,702 @@
+From e11e9e78799a7641fe0dc5289f35f2604a4b71a3 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Sun, 17 Jan 2010 00:40:15 +0000
+Subject: [PATCH] Input: add appleir USB driver
+
+This driver was originally written by James McKenzie, updated by
+Greg Kroah-Hartman, further updated by myself, with suspend support
+added.
+
+More recent versions of the IR receiver are also supported through
+a patch by Alex Karpenko. The patch also adds support for the 2nd
+and 5th generation of the controller, and the menu key on newer
+brushed metal remotes.
+
+Tested on a MacbookAir1,1
+
+Signed-off-by: Bastien Nocera <hadess@hadess.net>
+---
+ Documentation/input/appleir.txt | 46 ++++
+ drivers/hid/hid-apple.c | 4 -
+ drivers/hid/hid-core.c | 7 +-
+ drivers/hid/hid-ids.h | 5 +-
+ drivers/input/misc/Kconfig | 13 +
+ drivers/input/misc/Makefile | 1 +
+ drivers/input/misc/appleir.c | 519 +++++++++++++++++++++++++++++++++++++++
+ 7 files changed, 588 insertions(+), 7 deletions(-)
+ create mode 100644 Documentation/input/appleir.txt
+ create mode 100644 drivers/input/misc/appleir.c
+
+diff --git a/Documentation/input/appleir.txt b/Documentation/input/appleir.txt
+new file mode 100644
+index 0000000..db637fb
+--- /dev/null
++++ b/Documentation/input/appleir.txt
+@@ -0,0 +1,46 @@
++Apple IR receiver Driver (appleir)
++----------------------------------
++ Copyright (C) 2009 Bastien Nocera <hadess@hadess.net>
++
++The appleir driver is a kernel input driver to handle Apple's IR
++receivers (and associated remotes) in the kernel.
++
++The driver is an input driver which only handles "official" remotes
++as built and sold by Apple.
++
++Authors
++-------
++
++James McKenzie (original driver)
++Alex Karpenko (05ac:8242 support)
++Greg Kroah-Hartman (cleanups and original submission)
++Bastien Nocera (further cleanups, brushed metal "enter"
++button support and suspend support)
++
++Supported hardware
++------------------
++
++- All Apple laptops and desktops from 2005 onwards, except:
++ - the unibody Macbook (2009)
++ - Mac Pro (all versions)
++- Apple TV (all revisions prior to September 2010)
++
++The remote will only support the 6 (old white) or 7 (brushed metal) buttons
++of the remotes as sold by Apple. See the next section if you want to use
++other remotes or want to use lirc with the device instead of the kernel driver.
++
++Using lirc (native) instead of the kernel driver
++------------------------------------------------
++
++First, you will need to disable the kernel driver for the receiver.
++
++This can be achieved by passing quirks to the usbhid driver.
++The quirk line would be:
++usbhid.quirks=0x05ac:0x8242:0x40000010
++
++With 0x05ac being the vendor ID (Apple, you shouldn't need to change this)
++With 0x8242 being the product ID (check the output of lsusb for your hardware)
++And 0x10 being "HID_QUIRK_HIDDEV_FORCE" and 0x40000000 being "HID_QUIRK_NO_IGNORE"
++
++This should force the creation of a hiddev device for the receiver, and
++make it usable under lirc.
+diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c
+index bba05d0..0059d5a 100644
+--- a/drivers/hid/hid-apple.c
++++ b/drivers/hid/hid-apple.c
+@@ -361,10 +361,6 @@ static void apple_remove(struct hid_device *hdev)
+ }
+
+ static const struct hid_device_id apple_devices[] = {
+- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL),
+- .driver_data = APPLE_HIDDEV | APPLE_IGNORE_HIDINPUT },
+- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4),
+- .driver_data = APPLE_HIDDEV | APPLE_IGNORE_HIDINPUT },
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE),
+ .driver_data = APPLE_MIGHTYMOUSE | APPLE_INVERT_HWHEEL },
+
+diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
+index baa25ad..abc5bd7 100644
+--- a/drivers/hid/hid-core.c
++++ b/drivers/hid/hid-core.c
+@@ -1244,8 +1244,6 @@ static const struct hid_device_id hid_blacklist[] = {
+ { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_RP_649) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802) },
+- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
+- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) },
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICMOUSE) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI) },
+@@ -1577,6 +1575,11 @@ static const struct hid_device_id hid_ignore_list[] = {
+ { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_24) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_AIRCABLE, USB_DEVICE_ID_AIRCABLE1) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232) },
++ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL) },
++ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL2) },
++ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL3) },
++ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
++ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL5) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_LCM)},
+ { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_LCM2)},
+ { HID_USB_DEVICE(USB_VENDOR_ID_AVERMEDIA, USB_DEVICE_ID_AVER_FM_MR800) },
+diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
+index 11af537..360a5ca 100644
+--- a/drivers/hid/hid-ids.h
++++ b/drivers/hid/hid-ids.h
+@@ -100,8 +100,11 @@
+ #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b
+ #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a
+ #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b
+-#define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241
++#define USB_DEVICE_ID_APPLE_IRCONTROL 0x8240
++#define USB_DEVICE_ID_APPLE_IRCONTROL2 0x1440
++#define USB_DEVICE_ID_APPLE_IRCONTROL3 0x8241
+ #define USB_DEVICE_ID_APPLE_IRCONTROL4 0x8242
++#define USB_DEVICE_ID_APPLE_IRCONTROL5 0x8243
+
+ #define USB_VENDOR_ID_ASUS 0x0486
+ #define USB_DEVICE_ID_ASUS_T91MT 0x0185
+diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
+index 60de906..2f2f2e7 100644
+--- a/drivers/input/misc/Kconfig
++++ b/drivers/input/misc/Kconfig
+@@ -209,6 +209,19 @@ config INPUT_KEYSPAN_REMOTE
+ To compile this driver as a module, choose M here: the module will
+ be called keyspan_remote.
+
++config INPUT_APPLEIR
++ tristate "Apple infrared receiver (built in)"
++ depends on USB_ARCH_HAS_HCD
++ select USB
++ help
++ Say Y here if you want to use a Apple infrared remote control. All
++ the Apple computers from 2005 onwards include such a port, except
++ the unibody Macbook (2009), and Mac Pros. This receiver is also
++ used in the Apple TV set-top box prior to the 2010 model.
++
++ To compile this driver as a module, choose M here: the module will
++ be called appleir.
++
+ config INPUT_POWERMATE
+ tristate "Griffin PowerMate and Contour Jog support"
+ depends on USB_ARCH_HAS_HCD
+diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
+index 1fe1f6c..d5ef2b9 100644
+--- a/drivers/input/misc/Makefile
++++ b/drivers/input/misc/Makefile
+@@ -13,6 +13,7 @@ obj-$(CONFIG_INPUT_ADXL34X) += adxl34x.o
+ obj-$(CONFIG_INPUT_ADXL34X_I2C) += adxl34x-i2c.o
+ obj-$(CONFIG_INPUT_ADXL34X_SPI) += adxl34x-spi.o
+ obj-$(CONFIG_INPUT_APANEL) += apanel.o
++obj-$(CONFIG_INPUT_APPLEIR) += appleir.o
+ obj-$(CONFIG_INPUT_ATI_REMOTE) += ati_remote.o
+ obj-$(CONFIG_INPUT_ATI_REMOTE2) += ati_remote2.o
+ obj-$(CONFIG_INPUT_ATLAS_BTNS) += atlas_btns.o
+diff --git a/drivers/input/misc/appleir.c b/drivers/input/misc/appleir.c
+new file mode 100644
+index 0000000..3817a3c
+--- /dev/null
++++ b/drivers/input/misc/appleir.c
+@@ -0,0 +1,519 @@
++/*
++ * appleir: USB driver for the apple ir device
++ *
++ * Original driver written by James McKenzie
++ * Ported to recent 2.6 kernel versions by Greg Kroah-Hartman <gregkh@suse.de>
++ *
++ * Copyright (C) 2006 James McKenzie
++ * Copyright (C) 2008 Greg Kroah-Hartman <greg@kroah.com>
++ * Copyright (C) 2008 Novell Inc.
++ *
++ * 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, version 2.
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/slab.h>
++#include <linux/input.h>
++#include <linux/usb/input.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/usb.h>
++#include <linux/usb/input.h>
++#include <asm/unaligned.h>
++#include <asm/byteorder.h>
++
++#define DRIVER_VERSION "v1.2"
++#define DRIVER_AUTHOR "James McKenzie"
++#define DRIVER_DESC "Apple infrared receiver driver"
++#define DRIVER_LICENSE "GPL"
++
++MODULE_AUTHOR(DRIVER_AUTHOR);
++MODULE_DESCRIPTION(DRIVER_DESC);
++MODULE_LICENSE(DRIVER_LICENSE);
++
++#define USB_VENDOR_ID_APPLE 0x05ac
++#define USB_DEVICE_ID_APPLE_IRCONTROL 0x8240
++#define USB_DEVICE_ID_APPLE_IRCONTROL2 0x1440
++#define USB_DEVICE_ID_APPLE_IRCONTROL3 0x8241
++#define USB_DEVICE_ID_APPLE_IRCONTROL4 0x8242
++#define USB_DEVICE_ID_APPLE_IRCONTROL5 0x8243
++
++#define URB_SIZE 32
++
++#define MAX_KEYS 9
++#define MAX_KEYS_MASK (MAX_KEYS - 1)
++
++#define dbginfo(dev, format, arg...) do { if (debug) dev_info(dev , format , ## arg); } while (0)
++
++static int debug;
++module_param(debug, int, 0644);
++MODULE_PARM_DESC(debug, "Enable extra debug messages and information");
++
++/* I have two devices both of which report the following */
++/* 25 87 ee 83 0a + */
++/* 25 87 ee 83 0c - */
++/* 25 87 ee 83 09 << */
++/* 25 87 ee 83 06 >> */
++/* 25 87 ee 83 05 >" */
++/* 25 87 ee 83 03 menu */
++/* 26 00 00 00 00 for key repeat*/
++
++/* Thomas Glanzmann reports the following responses */
++/* 25 87 ee ca 0b + */
++/* 25 87 ee ca 0d - */
++/* 25 87 ee ca 08 << */
++/* 25 87 ee ca 07 >> */
++/* 25 87 ee ca 04 >" */
++/* 25 87 ee ca 02 menu */
++/* 26 00 00 00 00 for key repeat*/
++/* He also observes the following event sometimes */
++/* sent after a key is release, which I interpret */
++/* as a flat battery message */
++/* 25 87 e0 ca 06 flat battery */
++
++/* Alexandre Karpenko reports the following responses for Device ID 0x8242 */
++/* 25 87 ee 47 0b + */
++/* 25 87 ee 47 0d - */
++/* 25 87 ee 47 08 << */
++/* 25 87 ee 47 07 >> */
++/* 25 87 ee 47 04 >" */
++/* 25 87 ee 47 02 menu */
++/* 26 87 ee 47 ** for key repeat (** is the code of the key being held) */
++
++/* Bastien Nocera's "new" remote */
++/* 25 87 ee 91 5f followed by
++ * 25 87 ee 91 05 gives you >"
++ *
++ * 25 87 ee 91 5c followed by
++ * 25 87 ee 91 05 gives you the middle button */
++
++static const unsigned short appleir_key_table[] = {
++ KEY_RESERVED,
++ KEY_MENU,
++ KEY_PLAYPAUSE,
++ KEY_FORWARD,
++ KEY_BACK,
++ KEY_VOLUMEUP,
++ KEY_VOLUMEDOWN,
++ KEY_ENTER,
++ KEY_RESERVED,
++};
++
++struct appleir {
++ struct input_dev *input_dev;
++ unsigned short keymap[ARRAY_SIZE(appleir_key_table)];
++ u8 *data;
++ dma_addr_t dma_buf;
++ struct usb_device *usbdev;
++ unsigned int flags;
++ struct urb *urb;
++ struct timer_list key_up_timer;
++ int current_key;
++ int prev_key_idx;
++ char phys[32];
++};
++
++static DEFINE_MUTEX(appleir_mutex);
++
++enum {
++ APPLEIR_OPENED = 0x1,
++ APPLEIR_SUSPENDED = 0x2,
++};
++
++static struct usb_device_id appleir_ids[] = {
++ { USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL) },
++ { USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL2) },
++ { USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL3) },
++ { USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
++ { USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL5) },
++ {}
++};
++MODULE_DEVICE_TABLE(usb, appleir_ids);
++
++static void dump_packet(struct appleir *appleir, char *msg, u8 *data, int len)
++{
++ int i;
++
++ printk(KERN_ERR "appleir: %s (%d bytes)", msg, len);
++
++ for (i = 0; i < len; ++i)
++ printk(" %02x", data[i]);
++ printk(" (should be command %d)\n", (data[4] >> 1) & MAX_KEYS_MASK);
++}
++
++static int get_key(int data)
++{
++ switch (data) {
++ case 0x02:
++ case 0x03:
++ /* menu */
++ return 1;
++ case 0x04:
++ case 0x05:
++ /* >" */
++ return 2;
++ case 0x06:
++ case 0x07:
++ /* >> */
++ return 3;
++ case 0x08:
++ case 0x09:
++ /* << */
++ return 4;
++ case 0x0a:
++ case 0x0b:
++ /* + */
++ return 5;
++ case 0x0c:
++ case 0x0d:
++ /* - */
++ return 6;
++ case 0x5c:
++ /* Middle button, on newer remotes,
++ * part of a 2 packet-command */
++ return -7;
++ default:
++ return -1;
++ }
++}
++
++static void key_up(struct appleir *appleir, int key)
++{
++ dbginfo(&appleir->input_dev->dev, "key %d up\n", key);
++ input_report_key(appleir->input_dev, key, 0);
++ input_sync(appleir->input_dev);
++}
++
++static void key_down(struct appleir *appleir, int key)
++{
++ dbginfo(&appleir->input_dev->dev, "key %d down\n", key);
++ input_report_key(appleir->input_dev, key, 1);
++ input_sync(appleir->input_dev);
++}
++
++static void battery_flat(struct appleir *appleir)
++{
++ dev_err(&appleir->input_dev->dev, "possible flat battery?\n");
++}
++
++static void key_up_tick(unsigned long data)
++{
++ struct appleir *appleir = (struct appleir *)data;
++
++ if (appleir->current_key) {
++ key_up(appleir, appleir->current_key);
++ appleir->current_key = 0;
++ }
++}
++
++static void new_data(struct appleir *appleir, u8 *data, int len)
++{
++ static const u8 keydown[] = { 0x25, 0x87, 0xee };
++ static const u8 keyrepeat[] = { 0x26, };
++ static const u8 flatbattery[] = { 0x25, 0x87, 0xe0 };
++
++ if (debug)
++ dump_packet(appleir, "received", data, len);
++
++ if (len != 5)
++ return;
++
++ if (!memcmp(data, keydown, sizeof(keydown))) {
++ int index;
++
++ /* If we already have a key down, take it up before marking
++ this one down */
++ if (appleir->current_key)
++ key_up(appleir, appleir->current_key);
++
++ /* Handle dual packet commands */
++ if (appleir->prev_key_idx > 0)
++ index = appleir->prev_key_idx;
++ else
++ index = get_key(data[4]);
++
++ if (index > 0) {
++ appleir->current_key = appleir->keymap[index];
++
++ key_down(appleir, appleir->current_key);
++ /* Remote doesn't do key up, either pull them up, in the test
++ above, or here set a timer which pulls them up after 1/8 s */
++ mod_timer(&appleir->key_up_timer, jiffies + HZ / 8);
++ appleir->prev_key_idx = 0;
++ return;
++ } else if (index == -7) {
++ /* Remember key for next packet */
++ appleir->prev_key_idx = 0 - index;
++ return;
++ }
++ }
++
++ appleir->prev_key_idx = 0;
++
++ if (!memcmp(data, keyrepeat, sizeof(keyrepeat))) {
++ key_down(appleir, appleir->current_key);
++ /* Remote doesn't do key up, either pull them up, in the test
++ above, or here set a timer which pulls them up after 1/8 s */
++ mod_timer(&appleir->key_up_timer, jiffies + HZ / 8);
++ return;
++ }
++
++ if (!memcmp(data, flatbattery, sizeof(flatbattery))) {
++ battery_flat(appleir);
++ /* Fall through */
++ }
++
++ dump_packet(appleir, "unknown packet", data, len);
++}
++
++static void appleir_urb(struct urb *urb)
++{
++ struct appleir *appleir = urb->context;
++ int status = urb->status;
++ int retval;
++
++ switch (status) {
++ case 0:
++ new_data(appleir, urb->transfer_buffer, urb->actual_length);
++ break;
++ case -ECONNRESET:
++ case -ENOENT:
++ case -ESHUTDOWN:
++ /* This urb is terminated, clean up */
++ dbginfo(&appleir->input_dev->dev, "%s - urb shutting down with status: %d", __func__,
++ urb->status);
++ return;
++ default:
++ dbginfo(&appleir->input_dev->dev, "%s - nonzero urb status received: %d", __func__,
++ urb->status);
++ }
++
++ retval = usb_submit_urb(urb, GFP_ATOMIC);
++ if (retval)
++ err("%s - usb_submit_urb failed with result %d", __func__,
++ retval);
++}
++
++static int appleir_open(struct input_dev *dev)
++{
++ struct appleir *appleir = input_get_drvdata(dev);
++ struct usb_interface *intf = usb_ifnum_to_if(appleir->usbdev, 0);
++ int r;
++
++ r = usb_autopm_get_interface(intf);
++ if (r) {
++ dev_err(&intf->dev,
++ "%s(): usb_autopm_get_interface() = %d\n", __func__, r);
++ return r;
++ }
++
++ mutex_lock(&appleir_mutex);
++
++ if (usb_submit_urb(appleir->urb, GFP_ATOMIC)) {
++ r = -EIO;
++ goto fail;
++ }
++
++ appleir->flags |= APPLEIR_OPENED;
++
++ mutex_unlock(&appleir_mutex);
++
++ usb_autopm_put_interface(intf);
++
++ return 0;
++fail:
++ mutex_unlock(&appleir_mutex);
++ usb_autopm_put_interface(intf);
++ return r;
++}
++
++static void appleir_close(struct input_dev *dev)
++{
++ struct appleir *appleir = input_get_drvdata(dev);
++
++ mutex_lock(&appleir_mutex);
++
++ if (!(appleir->flags & APPLEIR_SUSPENDED)) {
++ usb_kill_urb(appleir->urb);
++ del_timer_sync(&appleir->key_up_timer);
++ }
++
++ appleir->flags &= ~APPLEIR_OPENED;
++
++ mutex_unlock(&appleir_mutex);
++}
++
++static int appleir_probe(struct usb_interface *intf,
++ const struct usb_device_id *id)
++{
++ struct usb_device *dev = interface_to_usbdev(intf);
++ struct usb_endpoint_descriptor *endpoint;
++ struct appleir *appleir = NULL;
++ struct input_dev *input_dev;
++ int retval = -ENOMEM;
++ int i;
++
++ appleir = kzalloc(sizeof(struct appleir), GFP_KERNEL);
++ if (!appleir)
++ goto allocfail;
++
++ appleir->data = usb_alloc_coherent(dev, URB_SIZE, GFP_KERNEL,
++ &appleir->dma_buf);
++ if (!appleir->data)
++ goto usbfail;
++
++ appleir->urb = usb_alloc_urb(0, GFP_KERNEL);
++ if (!appleir->urb)
++ goto urbfail;
++
++ appleir->usbdev = dev;
++
++ input_dev = input_allocate_device();
++ if (!input_dev)
++ goto inputfail;
++
++ appleir->input_dev = input_dev;
++
++ usb_make_path(dev, appleir->phys, sizeof(appleir->phys));
++ strlcpy(appleir->phys, "/input0", sizeof(appleir->phys));
++
++ input_dev->name = "Apple Infrared Remote Controller";
++ input_dev->phys = appleir->phys;
++ usb_to_input_id(dev, &input_dev->id);
++ input_dev->dev.parent = &intf->dev;
++ input_dev->keycode = appleir->keymap;
++ input_dev->keycodesize = sizeof(unsigned short);
++ input_dev->keycodemax = ARRAY_SIZE(appleir->keymap);
++
++ input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
++
++ memcpy(appleir->keymap, appleir_key_table, sizeof(appleir->keymap));
++ for (i = 0; i < ARRAY_SIZE(appleir_key_table); i++)
++ set_bit(appleir->keymap[i], input_dev->keybit);
++ clear_bit(KEY_RESERVED, input_dev->keybit);
++
++ input_set_drvdata(input_dev, appleir);
++ input_dev->open = appleir_open;
++ input_dev->close = appleir_close;
++
++ endpoint = &intf->cur_altsetting->endpoint[0].desc;
++
++ usb_fill_int_urb(appleir->urb, dev,
++ usb_rcvintpipe(dev, endpoint->bEndpointAddress),
++ appleir->data, 8,
++ appleir_urb, appleir, endpoint->bInterval);
++
++ appleir->urb->transfer_dma = appleir->dma_buf;
++ appleir->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
++
++ setup_timer(&appleir->key_up_timer,
++ key_up_tick, (unsigned long) appleir);
++
++ retval = input_register_device(appleir->input_dev);
++ if (retval)
++ goto inputfail;
++
++ usb_set_intfdata(intf, appleir);
++
++ return 0;
++
++inputfail:
++ input_free_device(appleir->input_dev);
++
++urbfail:
++ usb_free_urb(appleir->urb);
++
++usbfail:
++ usb_free_coherent(dev, URB_SIZE, appleir->data,
++ appleir->dma_buf);
++
++allocfail:
++ kfree(appleir);
++
++ return retval;
++}
++
++static void appleir_disconnect(struct usb_interface *intf)
++{
++ struct appleir *appleir = usb_get_intfdata(intf);
++
++ usb_set_intfdata(intf, NULL);
++ input_unregister_device(appleir->input_dev);
++ usb_free_urb(appleir->urb);
++ usb_free_coherent(interface_to_usbdev(intf), URB_SIZE,
++ appleir->data, appleir->dma_buf);
++ kfree(appleir);
++}
++
++static int appleir_suspend(struct usb_interface *interface,
++ pm_message_t message)
++{
++ struct appleir *appleir = usb_get_intfdata(interface);
++
++ mutex_lock(&appleir_mutex);
++ if (appleir->flags & APPLEIR_OPENED)
++ usb_kill_urb(appleir->urb);
++
++ appleir->flags |= APPLEIR_SUSPENDED;
++
++ mutex_unlock(&appleir_mutex);
++
++ return 0;
++}
++
++static int appleir_resume(struct usb_interface *interface)
++{
++ struct appleir *appleir;
++ int r = 0;
++
++ appleir = usb_get_intfdata(interface);
++
++ mutex_lock(&appleir_mutex);
++ if (appleir->flags & APPLEIR_OPENED) {
++ struct usb_endpoint_descriptor *endpoint;
++
++ endpoint = &interface->cur_altsetting->endpoint[0].desc;
++ usb_fill_int_urb(appleir->urb, appleir->usbdev,
++ usb_rcvintpipe(appleir->usbdev, endpoint->bEndpointAddress),
++ appleir->data, 8,
++ appleir_urb, appleir, endpoint->bInterval);
++ appleir->urb->transfer_dma = appleir->dma_buf;
++ appleir->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
++
++ /* And reset the USB device */
++ if (usb_submit_urb(appleir->urb, GFP_ATOMIC))
++ r = -EIO;
++ }
++
++ appleir->flags &= ~APPLEIR_SUSPENDED;
++
++ mutex_unlock(&appleir_mutex);
++
++ return r;
++}
++
++static struct usb_driver appleir_driver = {
++ .name = "appleir",
++ .probe = appleir_probe,
++ .disconnect = appleir_disconnect,
++ .suspend = appleir_suspend,
++ .resume = appleir_resume,
++ .reset_resume = appleir_resume,
++ .id_table = appleir_ids,
++};
++
++static int __init appleir_init(void)
++{
++ return usb_register(&appleir_driver);
++}
++
++static void __exit appleir_exit(void)
++{
++ usb_deregister(&appleir_driver);
++}
++
++module_init(appleir_init);
++module_exit(appleir_exit);
+--
+1.7.2.2
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/apple_backlight.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/apple_backlight.patch
new file mode 100644
index 000000000..c7d5a8191
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/apple_backlight.patch
@@ -0,0 +1,688 @@
+Various fixes to the Apple backlight driver. Upstream in .38?
+
+diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
+index e54a337..fb5df46 100644
+--- a/drivers/video/backlight/Kconfig
++++ b/drivers/video/backlight/Kconfig
+@@ -236,12 +236,12 @@ config BACKLIGHT_MAX8925
+ If you have a LCD backlight connected to the WLED output of MAX8925
+ WLED output, say Y here to enable this driver.
+
+-config BACKLIGHT_MBP_NVIDIA
+- tristate "MacBook Pro Nvidia Backlight Driver"
++config BACKLIGHT_APPLE
++ tristate "Apple Backlight Driver"
+ depends on X86
+ help
+- If you have an Apple Macbook Pro with Nvidia graphics hardware say Y
+- to enable a driver for its backlight
++ If you have an Intel-based Apple say Y to enable a driver for its
++ backlight
+
+ config BACKLIGHT_TOSA
+ tristate "Sharp SL-6000 Backlight Driver"
+diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
+index 44c0f81..ebaecc0 100644
+--- a/drivers/video/backlight/Makefile
++++ b/drivers/video/backlight/Makefile
+@@ -26,7 +26,7 @@ obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH) += cr_bllcd.o
+ obj-$(CONFIG_BACKLIGHT_PWM) += pwm_bl.o
+ obj-$(CONFIG_BACKLIGHT_DA903X) += da903x_bl.o
+ obj-$(CONFIG_BACKLIGHT_MAX8925) += max8925_bl.o
+-obj-$(CONFIG_BACKLIGHT_MBP_NVIDIA) += mbp_nvidia_bl.o
++obj-$(CONFIG_BACKLIGHT_APPLE) += apple_bl.o
+ obj-$(CONFIG_BACKLIGHT_TOSA) += tosa_bl.o
+ obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o
+ obj-$(CONFIG_BACKLIGHT_WM831X) += wm831x_bl.o
+diff --git a/drivers/video/backlight/apple_bl.c b/drivers/video/backlight/apple_bl.c
+new file mode 100644
+index 0000000..8f808c7
+--- /dev/null
++++ b/drivers/video/backlight/apple_bl.c
+@@ -0,0 +1,240 @@
++/*
++ * Backlight Driver for Intel-based Apples
++ *
++ * Copyright (c) Red Hat <mjg@redhat.com>
++ * Based on code from Pommed:
++ * Copyright (C) 2006 Nicolas Boichat <nicolas @boichat.ch>
++ * Copyright (C) 2006 Felipe Alfaro Solana <felipe_alfaro @linuxmail.org>
++ * Copyright (C) 2007 Julien BLACHE <jb@jblache.org>
++ *
++ * 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.
++ *
++ * This driver triggers SMIs which cause the firmware to change the
++ * backlight brightness. This is icky in many ways, but it's impractical to
++ * get at the firmware code in order to figure out what it's actually doing.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/backlight.h>
++#include <linux/err.h>
++#include <linux/io.h>
++#include <linux/pci.h>
++#include <linux/acpi.h>
++
++static struct backlight_device *apple_backlight_device;
++
++struct hw_data {
++ /* I/O resource to allocate. */
++ unsigned long iostart;
++ unsigned long iolen;
++ /* Backlight operations structure. */
++ const struct backlight_ops backlight_ops;
++ void (*set_brightness)(int);
++};
++
++static const struct hw_data *hw_data;
++
++#define DRIVER "apple_backlight: "
++
++/* Module parameters. */
++static int debug;
++module_param_named(debug, debug, int, 0644);
++MODULE_PARM_DESC(debug, "Set to one to enable debugging messages.");
++
++/*
++ * Implementation for machines with Intel chipset.
++ */
++static void intel_chipset_set_brightness(int intensity)
++{
++ outb(0x04 | (intensity << 4), 0xb3);
++ outb(0xbf, 0xb2);
++}
++
++static int intel_chipset_send_intensity(struct backlight_device *bd)
++{
++ int intensity = bd->props.brightness;
++
++ if (debug)
++ printk(KERN_DEBUG DRIVER "setting brightness to %d\n",
++ intensity);
++
++ intel_chipset_set_brightness(intensity);
++ return 0;
++}
++
++static int intel_chipset_get_intensity(struct backlight_device *bd)
++{
++ int intensity;
++
++ outb(0x03, 0xb3);
++ outb(0xbf, 0xb2);
++ intensity = inb(0xb3) >> 4;
++
++ if (debug)
++ printk(KERN_DEBUG DRIVER "read brightness of %d\n",
++ intensity);
++
++ return intensity;
++}
++
++static const struct hw_data intel_chipset_data = {
++ .iostart = 0xb2,
++ .iolen = 2,
++ .backlight_ops = {
++ .options = BL_CORE_SUSPENDRESUME,
++ .get_brightness = intel_chipset_get_intensity,
++ .update_status = intel_chipset_send_intensity,
++ },
++ .set_brightness = intel_chipset_set_brightness,
++};
++
++/*
++ * Implementation for machines with Nvidia chipset.
++ */
++static void nvidia_chipset_set_brightness(int intensity)
++{
++ outb(0x04 | (intensity << 4), 0x52f);
++ outb(0xbf, 0x52e);
++}
++
++static int nvidia_chipset_send_intensity(struct backlight_device *bd)
++{
++ int intensity = bd->props.brightness;
++
++ if (debug)
++ printk(KERN_DEBUG DRIVER "setting brightness to %d\n",
++ intensity);
++
++ nvidia_chipset_set_brightness(intensity);
++ return 0;
++}
++
++static int nvidia_chipset_get_intensity(struct backlight_device *bd)
++{
++ int intensity;
++
++ outb(0x03, 0x52f);
++ outb(0xbf, 0x52e);
++ intensity = inb(0x52f) >> 4;
++
++ if (debug)
++ printk(KERN_DEBUG DRIVER "read brightness of %d\n",
++ intensity);
++
++ return intensity;
++}
++
++static const struct hw_data nvidia_chipset_data = {
++ .iostart = 0x52e,
++ .iolen = 2,
++ .backlight_ops = {
++ .options = BL_CORE_SUSPENDRESUME,
++ .get_brightness = nvidia_chipset_get_intensity,
++ .update_status = nvidia_chipset_send_intensity
++ },
++ .set_brightness = nvidia_chipset_set_brightness,
++};
++
++static int __devinit apple_bl_add(struct acpi_device *dev)
++{
++ struct backlight_properties props;
++ struct pci_dev *host;
++ int intensity;
++
++ host = pci_get_bus_and_slot(0, 0);
++
++ if (!host) {
++ printk(KERN_ERR DRIVER "unable to find PCI host\n");
++ return -ENODEV;
++ }
++
++ if (host->vendor == PCI_VENDOR_ID_INTEL)
++ hw_data = &intel_chipset_data;
++ else if (host->vendor == PCI_VENDOR_ID_NVIDIA)
++ hw_data = &nvidia_chipset_data;
++
++ pci_dev_put(host);
++
++ if (!hw_data) {
++ printk(KERN_ERR DRIVER "unknown hardware\n");
++ return -ENODEV;
++ }
++
++ /* Check that the hardware responds - this may not work under EFI */
++
++ intensity = hw_data->backlight_ops.get_brightness(NULL);
++
++ if (!intensity) {
++ hw_data->set_brightness(1);
++ if (!hw_data->backlight_ops.get_brightness(NULL))
++ return -ENODEV;
++
++ hw_data->set_brightness(0);
++ }
++
++ if (!request_region(hw_data->iostart, hw_data->iolen,
++ "Apple backlight"))
++ return -ENXIO;
++
++ memset(&props, 0, sizeof(struct backlight_properties));
++ props.max_brightness = 15;
++ apple_backlight_device = backlight_device_register("apple_backlight",
++ NULL, NULL, &hw_data->backlight_ops, &props);
++
++ if (IS_ERR(apple_backlight_device)) {
++ release_region(hw_data->iostart, hw_data->iolen);
++ return PTR_ERR(apple_backlight_device);
++ }
++
++ apple_backlight_device->props.brightness =
++ hw_data->backlight_ops.get_brightness(apple_backlight_device);
++ backlight_update_status(apple_backlight_device);
++
++ return 0;
++}
++
++static int __devexit apple_bl_remove(struct acpi_device *dev, int type)
++{
++ backlight_device_unregister(apple_backlight_device);
++
++ release_region(hw_data->iostart, hw_data->iolen);
++ hw_data = NULL;
++ return 0;
++}
++
++static const struct acpi_device_id apple_bl_ids[] = {
++ {"APP0002", 0},
++ {"", 0},
++};
++
++static struct acpi_driver apple_bl_driver = {
++ .name = "Apple backlight",
++ .ids = apple_bl_ids,
++ .ops = {
++ .add = apple_bl_add,
++ .remove = apple_bl_remove,
++ },
++};
++
++static int __init apple_bl_init(void)
++{
++ return acpi_bus_register_driver(&apple_bl_driver);
++}
++
++static void __exit apple_bl_exit(void)
++{
++ acpi_bus_unregister_driver(&apple_bl_driver);
++}
++
++module_init(apple_bl_init);
++module_exit(apple_bl_exit);
++
++MODULE_AUTHOR("Matthew Garrett <mjg@redhat.com>");
++MODULE_DESCRIPTION("Apple Backlight Driver");
++MODULE_LICENSE("GPL");
++MODULE_DEVICE_TABLE(acpi, apple_bl_ids);
++MODULE_ALIAS("mbp_nvidia_bl");
+diff --git a/drivers/video/backlight/mbp_nvidia_bl.c b/drivers/video/backlight/mbp_nvidia_bl.c
+deleted file mode 100644
+index 1485f73..0000000
+--- a/drivers/video/backlight/mbp_nvidia_bl.c
++++ /dev/null
+@@ -1,400 +0,0 @@
+-/*
+- * Backlight Driver for Nvidia 8600 in Macbook Pro
+- *
+- * Copyright (c) Red Hat <mjg@redhat.com>
+- * Based on code from Pommed:
+- * Copyright (C) 2006 Nicolas Boichat <nicolas @boichat.ch>
+- * Copyright (C) 2006 Felipe Alfaro Solana <felipe_alfaro @linuxmail.org>
+- * Copyright (C) 2007 Julien BLACHE <jb@jblache.org>
+- *
+- * 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.
+- *
+- * This driver triggers SMIs which cause the firmware to change the
+- * backlight brightness. This is icky in many ways, but it's impractical to
+- * get at the firmware code in order to figure out what it's actually doing.
+- */
+-
+-#include <linux/module.h>
+-#include <linux/kernel.h>
+-#include <linux/init.h>
+-#include <linux/platform_device.h>
+-#include <linux/backlight.h>
+-#include <linux/err.h>
+-#include <linux/dmi.h>
+-#include <linux/io.h>
+-
+-static struct backlight_device *mbp_backlight_device;
+-
+-/* Structure to be passed to the DMI_MATCH function. */
+-struct dmi_match_data {
+- /* I/O resource to allocate. */
+- unsigned long iostart;
+- unsigned long iolen;
+- /* Backlight operations structure. */
+- const struct backlight_ops backlight_ops;
+-};
+-
+-/* Module parameters. */
+-static int debug;
+-module_param_named(debug, debug, int, 0644);
+-MODULE_PARM_DESC(debug, "Set to one to enable debugging messages.");
+-
+-/*
+- * Implementation for MacBooks with Intel chipset.
+- */
+-static int intel_chipset_send_intensity(struct backlight_device *bd)
+-{
+- int intensity = bd->props.brightness;
+-
+- if (debug)
+- printk(KERN_DEBUG "mbp_nvidia_bl: setting brightness to %d\n",
+- intensity);
+-
+- outb(0x04 | (intensity << 4), 0xb3);
+- outb(0xbf, 0xb2);
+- return 0;
+-}
+-
+-static int intel_chipset_get_intensity(struct backlight_device *bd)
+-{
+- int intensity;
+-
+- outb(0x03, 0xb3);
+- outb(0xbf, 0xb2);
+- intensity = inb(0xb3) >> 4;
+-
+- if (debug)
+- printk(KERN_DEBUG "mbp_nvidia_bl: read brightness of %d\n",
+- intensity);
+-
+- return intensity;
+-}
+-
+-static const struct dmi_match_data intel_chipset_data = {
+- .iostart = 0xb2,
+- .iolen = 2,
+- .backlight_ops = {
+- .options = BL_CORE_SUSPENDRESUME,
+- .get_brightness = intel_chipset_get_intensity,
+- .update_status = intel_chipset_send_intensity,
+- }
+-};
+-
+-/*
+- * Implementation for MacBooks with Nvidia chipset.
+- */
+-static int nvidia_chipset_send_intensity(struct backlight_device *bd)
+-{
+- int intensity = bd->props.brightness;
+-
+- if (debug)
+- printk(KERN_DEBUG "mbp_nvidia_bl: setting brightness to %d\n",
+- intensity);
+-
+- outb(0x04 | (intensity << 4), 0x52f);
+- outb(0xbf, 0x52e);
+- return 0;
+-}
+-
+-static int nvidia_chipset_get_intensity(struct backlight_device *bd)
+-{
+- int intensity;
+-
+- outb(0x03, 0x52f);
+- outb(0xbf, 0x52e);
+- intensity = inb(0x52f) >> 4;
+-
+- if (debug)
+- printk(KERN_DEBUG "mbp_nvidia_bl: read brightness of %d\n",
+- intensity);
+-
+- return intensity;
+-}
+-
+-static const struct dmi_match_data nvidia_chipset_data = {
+- .iostart = 0x52e,
+- .iolen = 2,
+- .backlight_ops = {
+- .options = BL_CORE_SUSPENDRESUME,
+- .get_brightness = nvidia_chipset_get_intensity,
+- .update_status = nvidia_chipset_send_intensity
+- }
+-};
+-
+-/*
+- * DMI matching.
+- */
+-static /* const */ struct dmi_match_data *driver_data;
+-
+-static int mbp_dmi_match(const struct dmi_system_id *id)
+-{
+- driver_data = id->driver_data;
+-
+- printk(KERN_INFO "mbp_nvidia_bl: %s detected\n", id->ident);
+- return 1;
+-}
+-
+-static const struct dmi_system_id __initdata mbp_device_table[] = {
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBook 1,1",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"),
+- },
+- .driver_data = (void *)&intel_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBook 2,1",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook2,1"),
+- },
+- .driver_data = (void *)&intel_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBook 3,1",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook3,1"),
+- },
+- .driver_data = (void *)&intel_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBook 4,1",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook4,1"),
+- },
+- .driver_data = (void *)&intel_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBook 4,2",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook4,2"),
+- },
+- .driver_data = (void *)&intel_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBookPro 1,1",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro1,1"),
+- },
+- .driver_data = (void *)&intel_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBookPro 1,2",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro1,2"),
+- },
+- .driver_data = (void *)&intel_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBookPro 2,1",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,1"),
+- },
+- .driver_data = (void *)&intel_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBookPro 2,2",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,2"),
+- },
+- .driver_data = (void *)&intel_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBookPro 3,1",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,1"),
+- },
+- .driver_data = (void *)&intel_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBookPro 3,2",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,2"),
+- },
+- .driver_data = (void *)&intel_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBookPro 4,1",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro4,1"),
+- },
+- .driver_data = (void *)&intel_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBookAir 1,1",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir1,1"),
+- },
+- .driver_data = (void *)&intel_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBook 5,1",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5,1"),
+- },
+- .driver_data = (void *)&nvidia_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBook 5,2",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5,2"),
+- },
+- .driver_data = (void *)&nvidia_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBook 6,1",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook6,1"),
+- },
+- .driver_data = (void *)&nvidia_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBookAir 2,1",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir2,1"),
+- },
+- .driver_data = (void *)&nvidia_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBookPro 5,1",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,1"),
+- },
+- .driver_data = (void *)&nvidia_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBookPro 5,2",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,2"),
+- },
+- .driver_data = (void *)&nvidia_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBookPro 5,3",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,3"),
+- },
+- .driver_data = (void *)&nvidia_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBookPro 5,4",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,4"),
+- },
+- .driver_data = (void *)&nvidia_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBookPro 5,5",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,5"),
+- },
+- .driver_data = (void *)&nvidia_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBookAir 3,1",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir3,1"),
+- },
+- .driver_data = (void *)&nvidia_chipset_data,
+- },
+- {
+- .callback = mbp_dmi_match,
+- .ident = "MacBookAir 3,2",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir3,2"),
+- },
+- .driver_data = (void *)&nvidia_chipset_data,
+- },
+- { }
+-};
+-
+-static int __init mbp_init(void)
+-{
+- struct backlight_properties props;
+- if (!dmi_check_system(mbp_device_table))
+- return -ENODEV;
+-
+- if (!request_region(driver_data->iostart, driver_data->iolen,
+- "Macbook Pro backlight"))
+- return -ENXIO;
+-
+- memset(&props, 0, sizeof(struct backlight_properties));
+- props.max_brightness = 15;
+- mbp_backlight_device = backlight_device_register("mbp_backlight", NULL,
+- NULL,
+- &driver_data->backlight_ops,
+- &props);
+- if (IS_ERR(mbp_backlight_device)) {
+- release_region(driver_data->iostart, driver_data->iolen);
+- return PTR_ERR(mbp_backlight_device);
+- }
+-
+- mbp_backlight_device->props.brightness =
+- driver_data->backlight_ops.get_brightness(mbp_backlight_device);
+- backlight_update_status(mbp_backlight_device);
+-
+- return 0;
+-}
+-
+-static void __exit mbp_exit(void)
+-{
+- backlight_device_unregister(mbp_backlight_device);
+-
+- release_region(driver_data->iostart, driver_data->iolen);
+-}
+-
+-module_init(mbp_init);
+-module_exit(mbp_exit);
+-
+-MODULE_AUTHOR("Matthew Garrett <mjg@redhat.com>");
+-MODULE_DESCRIPTION("Nvidia-based Macbook Pro Backlight Driver");
+-MODULE_LICENSE("GPL");
+-MODULE_DEVICE_TABLE(dmi, mbp_device_table);
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/bonding-incorrect-tx-queue-offset.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/bonding-incorrect-tx-queue-offset.patch
new file mode 100644
index 000000000..ebc33de4f
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/bonding-incorrect-tx-queue-offset.patch
@@ -0,0 +1,54 @@
+From: Phil Oester <kernel@linuxace.com>
+Date: Mon, 14 Mar 2011 06:22:04 +0000 (+0000)
+Subject: bonding: Incorrect TX queue offset
+X-Git-Tag: v2.6.39-rc1~468^2~15
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=fd0e435b0fe85622f167b84432552885a4856ac8
+
+bonding: Incorrect TX queue offset
+
+When packets come in from a device with >= 16 receive queues
+headed out a bonding interface, syslog gets filled with this:
+
+ kernel: bond0 selects TX queue 16, but real number of TX queues is 16
+
+because queue_mapping is offset by 1. Adjust return value
+to account for the offset.
+
+This is a revision of my earlier patch (which did not use the
+skb_rx_queue_* helpers - thanks to Ben for the suggestion).
+Andy submitted a similar patch which emits a pr_warning on
+invalid queue selection, but I believe the log spew is
+not useful. We can revisit that question in the future,
+but in the interim I believe fixing the core problem is
+worthwhile.
+
+Signed-off-by: Phil Oester <kernel@linuxace.com>
+Signed-off-by: Andy Gospodarek <andy@greyhouse.net>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+
+diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
+index 3ad4f50..a93d941 100644
+--- a/drivers/net/bonding/bond_main.c
++++ b/drivers/net/bonding/bond_main.c
+@@ -4341,11 +4341,18 @@ static u16 bond_select_queue(struct net_device *dev, struct sk_buff *skb)
+ {
+ /*
+ * This helper function exists to help dev_pick_tx get the correct
+- * destination queue. Using a helper function skips the a call to
++ * destination queue. Using a helper function skips a call to
+ * skb_tx_hash and will put the skbs in the queue we expect on their
+ * way down to the bonding driver.
+ */
+- return skb->queue_mapping;
++ u16 txq = skb_rx_queue_recorded(skb) ? skb_get_rx_queue(skb) : 0;
++
++ if (unlikely(txq >= dev->real_num_tx_queues)) {
++ do
++ txq -= dev->real_num_tx_queues;
++ while (txq >= dev->real_num_tx_queues);
++ }
++ return txq;
+ }
+
+ static netdev_tx_t bond_start_xmit(struct sk_buff *skb, struct net_device *dev)
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/config-arm b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-arm
new file mode 100644
index 000000000..47a024d9f
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-arm
@@ -0,0 +1,137 @@
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+# CONFIG_SMP is not set
+
+# CONFIG_CMDLINE_FORCE is not set
+
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+
+CONFIG_ARCH_VERSATILE=y
+CONFIG_ARCH_VERSATILE_PB=y
+CONFIG_MACH_VERSATILE_AB=y
+
+CONFIG_HIGHMEM=y
+# CONFIG_HIGHPTE is not set
+
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
+
+CONFIG_ZBOOT_ROM_TEXT=0
+CONFIG_ZBOOT_ROM_BSS=0
+
+# CONFIG_XIP_KERNEL is not set
+
+CONFIG_ATAGS_PROC=y
+
+# CONFIG_FPE_NWFPE is not set
+CONFIG_FPE_FASTFPE=y
+CONFIG_VFP=y
+
+CONFIG_PM=y
+# CONFIG_PM_DEBUG is not set
+# CONFIG_PM_TRACE is not set
+CONFIG_SUSPEND=y
+# CONFIG_PM_TEST_SUSPEND is not set
+CONFIG_APM_EMULATION=y
+
+CONFIG_ARM_THUMB=y
+
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+
+# CONFIG_UACCESS_WITH_MEMCPY is not set
+
+CONFIG_CMDLINE="console=ttyAM0,115200 root=/dev/sda1 rootdelay=20"
+
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+
+# CONFIG_CPU_IDLE is not set
+
+CONFIG_LEDS=y
+CONFIG_LEDS_CPU=y
+
+CONFIG_MTD_AFS_PARTS=y
+CONFIG_MTD_ARM_INTEGRATOR=y
+CONFIG_MTD_IMPA7=y
+
+CONFIG_AX88796=m
+CONFIG_AX88796_93CX6=y
+CONFIG_SMC91X=m
+CONFIG_DM9000=m
+CONFIG_DM9000_DEBUGLEVEL=4
+# CONFIG_DM9000_FORCE_SIMPLE_PHY_POLL is not set
+CONFIG_SMC911X=m
+CONFIG_SMSC911X=m
+
+CONFIG_SERIO_AMBAKMI=m
+
+CONFIG_SERIAL_AMBA_PL011=y
+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
+
+CONFIG_I2C_VERSATILE=y
+
+CONFIG_THERMAL=y
+
+# CONFIG_MFD_T7L66XB is not set
+# CONFIG_MFD_TC6387XB is not set
+
+CONFIG_FB_ARMCLCD=m
+
+CONFIG_SND_ARM=y
+CONFIG_SND_ARMAACI=m
+
+CONFIG_USB_MUSB_HDRC=y
+# CONFIG_MUSB_PIO_ONLY is not set
+CONFIG_USB_TUSB6010=y
+# CONFIG_USB_MUSB_DEBUG is not set
+
+CONFIG_MMC_ARMMMCI=m
+CONFIG_MMC_DW=m
+# CONFIG_MMC_DW_IDMAC is not set
+
+CONFIG_RTC_DRV_PL030=m
+CONFIG_RTC_DRV_PL031=m
+
+# CONFIG_SGI_IOC4 is not set
+
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_ERRORS is not set
+# CONFIG_DEBUG_LL is not set
+
+CONFIG_ARM_UNWIND=y
+
+CONFIG_RCU_FANOUT=32
+
+# CONFIG_USB_ULPI is not set
+# CONFIG_OC_ETM is not set
+
+# CONFIG_MTD_PISMO is not set
+
+CONFIG_PERF_EVENTS=y
+CONFIG_PERF_COUNTERS=y
+
+# CONFIG_MG_DISK is not set
+# CONFIG_GPIO_PL061 is not set
+
+CONFIG_CC_STACKPROTECTOR=y
+
+CONFIG_AUTO_ZRELADDR=y
+
+# CONFIG_ARM_CHARLCD is not set
+# CONFIG_DEPRECATED_PARAM_STRUCT is not set
+
+# CONFIG_ARM_SP805_WATCHDOG is not set
+
+CONFIG_PM_OPP=y
+
+CONFIG_SECCOMP=y
+CONFIG_STRICT_DEVMEM=y
+
+# CONFIG_AMBA_PL08X is not set
+
+# CONFIG_HVC_DCC is not set
+
+CONFIG_SPARSE_IRQ=y
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/config-debug b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-debug
new file mode 100644
index 000000000..86aa2cc04
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-debug
@@ -0,0 +1,101 @@
+CONFIG_SND_VERBOSE_PRINTK=y
+CONFIG_SND_DEBUG=y
+CONFIG_SND_PCM_XRUN_DEBUG=y
+
+CONFIG_DEBUG_MUTEXES=y
+CONFIG_DEBUG_RT_MUTEXES=y
+CONFIG_DEBUG_LOCK_ALLOC=y
+CONFIG_PROVE_LOCKING=y
+CONFIG_DEBUG_VM=y
+CONFIG_DEBUG_SPINLOCK=y
+CONFIG_PROVE_RCU=y
+# CONFIG_PROVE_RCU_REPEATEDLY is not set
+CONFIG_DEBUG_PER_CPU_MAPS=y
+CONFIG_CPUMASK_OFFSTACK=y
+
+CONFIG_CPU_NOTIFIER_ERROR_INJECT=m
+
+CONFIG_FAULT_INJECTION=y
+CONFIG_FAILSLAB=y
+CONFIG_FAIL_PAGE_ALLOC=y
+CONFIG_FAIL_MAKE_REQUEST=y
+CONFIG_FAULT_INJECTION_DEBUG_FS=y
+CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y
+CONFIG_FAIL_IO_TIMEOUT=y
+
+CONFIG_SLUB_DEBUG_ON=y
+
+CONFIG_LOCK_STAT=y
+
+CONFIG_DEBUG_STACK_USAGE=y
+
+CONFIG_ACPI_DEBUG=y
+# CONFIG_ACPI_DEBUG_FUNC_TRACE is not set
+
+CONFIG_DEBUG_SG=y
+
+# CONFIG_DEBUG_PAGEALLOC is not set
+
+CONFIG_DEBUG_WRITECOUNT=y
+CONFIG_DEBUG_OBJECTS=y
+# CONFIG_DEBUG_OBJECTS_SELFTEST is not set
+CONFIG_DEBUG_OBJECTS_FREE=y
+CONFIG_DEBUG_OBJECTS_TIMERS=y
+CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
+
+CONFIG_X86_PTDUMP=y
+
+CONFIG_CAN_DEBUG_DEVICES=y
+
+CONFIG_MODULE_FORCE_UNLOAD=y
+
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+
+CONFIG_DEBUG_NOTIFIERS=y
+
+CONFIG_DMA_API_DEBUG=y
+
+CONFIG_MMIOTRACE=y
+
+CONFIG_DEBUG_CREDENTIALS=y
+
+CONFIG_EXT4_DEBUG=y
+
+CONFIG_DEBUG_PERF_USE_VMALLOC=y
+
+# off in both production debug and nodebug builds,
+# on in rawhide nodebug builds
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+
+CONFIG_JBD2_DEBUG=y
+
+CONFIG_DEBUG_CFQ_IOSCHED=y
+
+CONFIG_DRBD_FAULT_INJECTION=y
+
+CONFIG_ATH_DEBUG=y
+CONFIG_CARL9170_DEBUGFS=y
+CONFIG_IWLWIFI_DEVICE_TRACING=y
+
+CONFIG_DEBUG_OBJECTS_WORK=y
+# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
+
+CONFIG_DMADEVICES_DEBUG=y
+CONFIG_DMADEVICES_VDEBUG=y
+
+CONFIG_PM_ADVANCED_DEBUG=y
+
+CONFIG_CEPH_LIB_PRETTYDEBUG=y
+CONFIG_QUOTA_DEBUG=y
+
+# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
+
+CONFIG_PCI_DEFAULT_USE_CRS=y
+
+CONFIG_KGDB_KDB=y
+CONFIG_KDB_KEYBOARD=y
+
+CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y
+CONFIG_TEST_LIST_SORT=y
+
+CONFIG_DEBUG_SET_MODULE_RONX=y
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/config-generic b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-generic
new file mode 100644
index 000000000..33d7edcf3
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-generic
@@ -0,0 +1,4500 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_MMU=y
+CONFIG_SMP=y
+CONFIG_HOTPLUG_CPU=y
+CONFIG_LOCALVERSION=""
+CONFIG_CROSS_COMPILE=""
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_HOTPLUG=y
+CONFIG_UEVENT_HELPER_PATH=""
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+
+CONFIG_BUILD_DOCSRC=y
+
+#
+# General setup
+#
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_KERNEL_GZIP=y
+# CONFIG_KERNEL_BZIP2 is not set
+# CONFIG_KERNEL_LZO is not set
+# CONFIG_KERNEL_LZMA is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+CONFIG_TASKSTATS=y
+CONFIG_TASK_DELAY_ACCT=y
+CONFIG_TASK_XACCT=y
+CONFIG_TASK_IO_ACCOUNTING=y
+CONFIG_SYSCTL=y
+CONFIG_LOG_BUF_SHIFT=17
+# CONFIG_IKCONFIG is not set
+# CONFIG_EMBEDDED is not set
+# CONFIG_EXPERT is not set
+CONFIG_KALLSYMS=y
+CONFIG_KALLSYMS_ALL=y
+CONFIG_KALLSYMS_EXTRA_PASS=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_CFQ_GROUP_IOSCHED=y
+CONFIG_DEFAULT_CFQ=y
+CONFIG_USER_NS=y
+CONFIG_PID_NS=y
+CONFIG_UTS_NS=y
+CONFIG_IPC_NS=y
+CONFIG_NET_NS=y
+
+CONFIG_POSIX_MQUEUE=y
+# CONFIG_PREEMPT_NONE is not set
+CONFIG_PREEMPT_VOLUNTARY=y
+# CONFIG_PREEMPT is not set
+
+CONFIG_SLUB=y
+# CONFIG_SLUB_STATS is not set
+
+CONFIG_MISC_DEVICES=y
+# CONFIG_AD525X_DPOT is not set
+CONFIG_IWMC3200TOP=m
+# CONFIG_IWMC3200TOP_DEBUG is not set
+CONFIG_IWMC3200TOP_DEBUGFS=y
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+# -- MODULE_FORCE_UNLOAD is controlled by config-debug/nodebug
+# CONFIG_MODVERSIONS is not set
+CONFIG_MODULE_SRCVERSION_ALL=y
+
+#
+# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
+#
+CONFIG_PCI=y
+# CONFIG_PCI_DEBUG is not set
+CONFIG_PCI_STUB=y
+CONFIG_PCI_IOV=y
+CONFIG_HT_IRQ=y
+CONFIG_PCI_MSI=y
+CONFIG_PCI_MSI_DEFAULT_ON=y
+CONFIG_PCIEPORTBUS=y
+CONFIG_PCIEAER=y
+CONFIG_PCIEASPM=y
+# CONFIG_PCIEASPM_DEBUG is not set
+CONFIG_PCIE_ECRC=y
+CONFIG_PCIEAER_INJECT=m
+CONFIG_HOTPLUG_PCI_PCIE=y
+CONFIG_HOTPLUG_PCI_FAKE=m
+CONFIG_PCI_LEGACY=y
+
+CONFIG_ISA=y
+# CONFIG_EISA is not set
+# CONFIG_MCA is not set
+# CONFIG_SCx200 is not set
+
+#
+# PCMCIA/CardBus support
+#
+CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+# CONFIG_PCMCIA_DEBUG is not set
+CONFIG_YENTA=m
+CONFIG_CARDBUS=y
+CONFIG_I82092=m
+CONFIG_PD6729=m
+CONFIG_PCMCIA_IOCTL=y
+
+CONFIG_PCCARD=y
+CONFIG_MMC=m
+CONFIG_SDIO_UART=m
+# CONFIG_MMC_TEST is not set
+# CONFIG_MMC_DEBUG is not set
+# CONFIG_MMC_UNSAFE_RESUME is not set
+# CONFIG_MMC_CLKGATE is not set
+CONFIG_MMC_BLOCK=m
+CONFIG_MMC_BLOCK_MINORS=8
+CONFIG_MMC_BLOCK_BOUNCE=y
+CONFIG_MMC_SDHCI=m
+CONFIG_MMC_SDHCI_PCI=m
+CONFIG_MMC_SDRICOH_CS=m
+CONFIG_MMC_TIFM_SD=m
+CONFIG_MMC_WBSD=m
+CONFIG_MMC_VIA_SDMMC=m
+CONFIG_MMC_SDHCI_PLTFM=m
+CONFIG_MMC_CB710=m
+CONFIG_MMC_RICOH_MMC=y
+CONFIG_MMC_USHC=m
+
+CONFIG_CB710_CORE=m
+# CONFIG_CB710_DEBUG is not set
+
+CONFIG_INFINIBAND=m
+CONFIG_INFINIBAND_MTHCA=m
+# CONFIG_INFINIBAND_MTHCA_DEBUG is not set
+CONFIG_INFINIBAND_IPOIB=m
+CONFIG_INFINIBAND_IPOIB_DEBUG=y
+CONFIG_INFINIBAND_IPOIB_DEBUG_DATA=y
+CONFIG_INFINIBAND_IPOIB_CM=y
+CONFIG_INFINIBAND_SRP=m
+CONFIG_INFINIBAND_USER_MAD=m
+CONFIG_INFINIBAND_USER_ACCESS=m
+CONFIG_INFINIBAND_IPATH=m
+CONFIG_INFINIBAND_ISER=m
+CONFIG_INFINIBAND_AMSO1100=m
+# CONFIG_INFINIBAND_AMSO1100_DEBUG is not set
+CONFIG_INFINIBAND_CXGB3=m
+CONFIG_INFINIBAND_CXGB4=m
+CONFIG_SCSI_CXGB4_ISCSI=m
+# CONFIG_INFINIBAND_CXGB3_DEBUG is not set
+CONFIG_MLX4_INFINIBAND=m
+CONFIG_INFINIBAND_NES=m
+# CONFIG_INFINIBAND_NES_DEBUG is not set
+CONFIG_INFINIBAND_QIB=m
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=y
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_FW_LOADER=y
+# CONFIG_FIRMWARE_IN_KERNEL is not set
+CONFIG_EXTRA_FIRMWARE=""
+
+# CONFIG_SPI is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=m
+# CONFIG_MTD_DEBUG is not set
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_AR7_PARTS=m
+CONFIG_MTD_CONCAT=m
+CONFIG_MTD_CMDLINE_PARTS=y
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLOCK=m
+CONFIG_MTD_BLOCK_RO=m
+CONFIG_MTD_BLOCK2MTD=m
+
+CONFIG_MTD_OOPS=m
+# CONFIG_MTD_INTEL_VR_NOR is not set
+CONFIG_MTD_ALAUDA=m
+
+CONFIG_FTL=m
+CONFIG_NFTL=m
+CONFIG_NFTL_RW=y
+CONFIG_INFTL=m
+CONFIG_RFD_FTL=m
+CONFIG_SSFDC=m
+# CONFIG_SM_FTL is not set
+
+CONFIG_MTD_UBI=m
+CONFIG_MTD_UBI_WL_THRESHOLD=4096
+CONFIG_MTD_UBI_BEB_RESERVE=1
+# CONFIG_MTD_UBI_GLUEBI is not set
+# CONFIG_MTD_UBI_DEBUG is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=m
+CONFIG_MTD_JEDECPROBE=m
+CONFIG_MTD_GEN_PROBE=m
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_CFI_INTELEXT=m
+CONFIG_MTD_CFI_AMDSTD=m
+CONFIG_MTD_CFI_STAA=m
+CONFIG_MTD_RAM=m
+CONFIG_MTD_ROM=m
+CONFIG_MTD_ABSENT=m
+
+#
+# Mapping drivers for chip access
+#
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+# CONFIG_MTD_PHYSMAP is not set
+CONFIG_MTD_SC520CDP=m
+CONFIG_MTD_NETSC520=m
+# CONFIG_MTD_SBC_GXX is not set
+# CONFIG_MTD_SCx200_DOCFLASH is not set
+# CONFIG_MTD_AMD76XROM is not set
+CONFIG_MTD_SCB2_FLASH=m
+# CONFIG_MTD_NETtel is not set
+# CONFIG_MTD_DILNETPC is not set
+# CONFIG_MTD_L440GX is not set
+CONFIG_MTD_PCI=m
+CONFIG_MTD_TS5500=m
+# CONFIG_MTD_GPIO_ADDR is not set
+# CONFIG_MTD_PCMCIA is not set
+
+#
+# Self-contained MTD device drivers
+#
+CONFIG_MTD_PMC551=m
+# CONFIG_MTD_PMC551_BUGFIX is not set
+# CONFIG_MTD_PMC551_DEBUG is not set
+# CONFIG_MTD_SLRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=4096
+CONFIG_MTDRAM_ERASE_SIZE=128
+
+#
+# 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_DOCPROBE is not set
+# CONFIG_MTD_DOCPROBE_ADVANCED is not set
+# CONFIG_MTD_DOCPROBE_ADDRESS is not set
+
+#
+# NAND Flash Device Drivers
+#
+CONFIG_MTD_NAND=m
+# CONFIG_MTD_NAND_MUSEUM_IDS is not set
+# CONFIG_MTD_NAND_PLATFORM is not set
+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
+# CONFIG_MTD_NAND_CAFE is not set
+CONFIG_MTD_NAND_IDS=m
+CONFIG_MTD_NAND_NANDSIM=m
+# CONFIG_MTD_ONENAND is not set
+CONFIG_MTD_NAND_ECC_SMC=y
+CONFIG_MTD_NAND_CS553X=m
+# CONFIG_MTD_NAND_DENALI is not set
+CONFIG_MTD_NAND_DENALI_SCRATCH_REG_ADDR=0xFF108018
+# CONFIG_MTD_NAND_GPIO is not set
+CONFIG_MTD_NAND_RICOH=m
+
+CONFIG_MTD_REDBOOT_PARTS=m
+# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
+# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
+CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
+# CONFIG_MTD_XIP is not set
+# CONFIG_MTD_ICHXROM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_NAND_DISKONCHIP=m
+# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set
+CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0
+# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set
+# CONFIG_MTD_PLATRAM is not set
+
+# CONFIG_MTD_TESTS is not set
+CONFIG_MTD_LPDDR=m
+CONFIG_MTD_QINFO_PROBE=m
+
+#
+# Parallel port support
+#
+CONFIG_PARPORT=m
+CONFIG_PARPORT_PC=m
+CONFIG_PARPORT_SERIAL=m
+# CONFIG_PARPORT_PC_FIFO is not set
+# CONFIG_PARPORT_PC_SUPERIO is not set
+CONFIG_PARPORT_PC_PCMCIA=m
+CONFIG_PARPORT_1284=y
+# CONFIG_PARPORT_AX88796 is not set
+
+#
+# Plug and Play support
+#
+CONFIG_PNP=y
+# CONFIG_PNP_DEBUG is not set
+# CONFIG_PNP_DEBUG_MESSAGES is not set
+
+#
+# Protocols
+#
+CONFIG_ISAPNP=y
+# CONFIG_PNPBIOS is not set
+
+CONFIG_ACPI_PCI_SLOT=y
+CONFIG_HOTPLUG_PCI_ACPI=y
+CONFIG_HOTPLUG_PCI_ACPI_IBM=m
+
+#
+# Block devices
+#
+CONFIG_BLK_DEV=y
+CONFIG_BLK_DEV_FD=m
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE is not set
+
+CONFIG_BLK_CPQ_DA=m
+CONFIG_BLK_CPQ_CISS_DA=m
+CONFIG_CISS_SCSI_TAPE=y
+CONFIG_BLK_DEV_DAC960=m
+CONFIG_BLK_DEV_UMEM=m
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_CRYPTOLOOP=m
+CONFIG_BLK_DEV_NBD=m
+CONFIG_BLK_DEV_OSD=m
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=16384
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_BLK_DEV_ATIIXP=y
+CONFIG_LBD=y
+CONFIG_BLK_DEV_IO_TRACE=y
+
+CONFIG_BLK_DEV_DELKIN=m
+# CONFIG_BLK_DEV_IT8213 is not set
+# CONFIG_BLK_DEV_TC86C001 is not set
+CONFIG_LBDAF=y
+CONFIG_BLK_DEV_BSG=y
+CONFIG_BLK_DEV_INTEGRITY=y
+CONFIG_BLK_DEV_THROTTLING=y
+
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+CONFIG_BLK_DEV_IDECS=m
+CONFIG_BLK_DEV_IDECD=m
+# CONFIG_BLK_DEV_IDETAPE is not set
+CONFIG_IDE_TASK_IOCTL=y
+# CONFIG_BLK_DEV_IDE_SATA is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_BLK_DEV_CMD640=y
+CONFIG_BLK_DEV_CMD640_ENHANCED=y
+CONFIG_BLK_DEV_IDEPNP=y
+CONFIG_BLK_DEV_IDEPCI=y
+# CONFIG_BLK_DEV_OFFBOARD is not set
+CONFIG_BLK_DEV_GENERIC=y
+# CONFIG_BLK_DEV_OPTI621 is not set
+CONFIG_BLK_DEV_RZ1000=y
+CONFIG_BLK_DEV_IDEDMA_PCI=y
+CONFIG_BLK_DEV_AEC62XX=y
+CONFIG_BLK_DEV_ALI15X3=y
+# CONFIG_BLK_DEV_AMD74XX is not set
+CONFIG_BLK_DEV_CMD64X=y
+CONFIG_BLK_DEV_TRIFLEX=y
+# CONFIG_BLK_DEV_CY82C693 is not set
+CONFIG_BLK_DEV_CS5520=y
+CONFIG_BLK_DEV_CS5530=y
+CONFIG_BLK_DEV_CS5535=y
+CONFIG_BLK_DEV_HPT366=y
+CONFIG_BLK_DEV_IT821X=y
+CONFIG_BLK_DEV_JMICRON=y
+# CONFIG_BLK_DEV_SC1200 is not set
+CONFIG_BLK_DEV_PIIX=y
+# CONFIG_BLK_DEV_NS87415 is not set
+CONFIG_BLK_DEV_PDC202XX_OLD=y
+CONFIG_BLK_DEV_PDC202XX_NEW=y
+CONFIG_BLK_DEV_SVWKS=y
+CONFIG_BLK_DEV_SIIMAGE=y
+CONFIG_BLK_DEV_SIS5513=y
+# CONFIG_BLK_DEV_SLC90E66 is not set
+# CONFIG_BLK_DEV_TRM290 is not set
+CONFIG_BLK_DEV_VIA82CXXX=y
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_BLK_DEV_HD is not set
+
+CONFIG_VIRTIO_BLK=m
+CONFIG_VIRTIO_PCI=y
+CONFIG_VIRTIO_BALLOON=m
+CONFIG_VIRTIO_NET=m
+CONFIG_VMXNET3=m
+CONFIG_HW_RANDOM_VIRTIO=m
+CONFIG_VIRTIO_CONSOLE=y
+CONFIG_VHOST_NET=m
+
+#
+# SCSI device support
+#
+CONFIG_SCSI=y
+
+CONFIG_SCSI_ENCLOSURE=m
+CONFIG_SCSI_PROC_FS=y
+CONFIG_SCSI_SCAN_ASYNC=y
+CONFIG_SCSI_SRP=m
+CONFIG_SCSI_SRP_ATTRS=m
+CONFIG_SCSI_TGT=m
+
+CONFIG_SCSI_DH=y
+CONFIG_SCSI_DH_RDAC=m
+CONFIG_SCSI_DH_HP_SW=m
+CONFIG_SCSI_DH_EMC=m
+CONFIG_SCSI_DH_ALUA=m
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+CONFIG_CHR_DEV_ST=m
+CONFIG_CHR_DEV_OSST=m
+CONFIG_BLK_DEV_SR=y
+CONFIG_BLK_DEV_SR_VENDOR=y
+CONFIG_CHR_DEV_SG=y
+CONFIG_CHR_DEV_SCH=m
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_SCSI_CONSTANTS=y
+CONFIG_SCSI_LOGGING=y
+CONFIG_SCSI_SPI_ATTRS=m
+CONFIG_SCSI_FC_ATTRS=m
+CONFIG_SCSI_FC_TGT_ATTRS=y
+CONFIG_SCSI_ISCSI_ATTRS=m
+CONFIG_SCSI_SAS_ATTRS=m
+CONFIG_SCSI_SRP_TGT_ATTRS=y
+CONFIG_SCSI_SAS_LIBSAS=m
+CONFIG_SCSI_SAS_ATA=y
+# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set
+CONFIG_SCSI_SAS_HOST_SMP=y
+CONFIG_RAID_ATTRS=m
+
+CONFIG_ISCSI_TCP=m
+CONFIG_ISCSI_BOOT_SYSFS=m
+
+#
+# SCSI low-level drivers
+#
+CONFIG_SCSI_LOWLEVEL=y
+CONFIG_BLK_DEV_3W_XXXX_RAID=m
+CONFIG_SCSI_3W_9XXX=m
+# CONFIG_SCSI_7000FASST is not set
+CONFIG_SCSI_ACARD=m
+CONFIG_SCSI_AACRAID=m
+CONFIG_SCSI_AIC7XXX=m
+CONFIG_SCSI_AIC94XX=m
+# CONFIG_AIC94XX_DEBUG is not set
+CONFIG_AIC7XXX_CMDS_PER_DEVICE=4
+CONFIG_AIC7XXX_RESET_DELAY_MS=15000
+# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set
+# CONFIG_AIC7XXX_DEBUG_ENABLE is not set
+CONFIG_AIC7XXX_DEBUG_MASK=0
+# CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set
+CONFIG_SCSI_AIC7XXX_OLD=m
+CONFIG_SCSI_AIC79XX=m
+CONFIG_AIC79XX_CMDS_PER_DEVICE=4
+CONFIG_AIC79XX_RESET_DELAY_MS=15000
+# CONFIG_AIC79XX_BUILD_FIRMWARE is not set
+# CONFIG_AIC79XX_DEBUG_ENABLE is not set
+CONFIG_AIC79XX_DEBUG_MASK=0
+# CONFIG_AIC79XX_REG_PRETTY_PRINT is not set
+# CONFIG_SCSI_ADVANSYS is not set
+CONFIG_SCSI_BFA_FC=m
+CONFIG_MEGARAID_NEWGEN=y
+CONFIG_MEGARAID_MM=m
+CONFIG_MEGARAID_MAILBOX=m
+CONFIG_MEGARAID_LEGACY=m
+CONFIG_MEGARAID_SAS=m
+CONFIG_SCSI_MVSAS=m
+# CONFIG_SCSI_MVSAS_DEBUG is not set
+CONFIG_SCSI_MPT2SAS=m
+CONFIG_SCSI_MPT2SAS_MAX_SGE=128
+CONFIG_SCSI_MPT2SAS_LOGGING=y
+
+CONFIG_SCSI_OSD_INITIATOR=m
+CONFIG_SCSI_OSD_ULD=m
+CONFIG_SCSI_OSD_DPRINT_SENSE=1
+# CONFIG_SCSI_OSD_DEBUG is not set
+
+CONFIG_SCSI_BNX2_ISCSI=m
+CONFIG_BE2ISCSI=m
+CONFIG_SCSI_PMCRAID=m
+
+CONFIG_SCSI_HPSA=m
+CONFIG_SCSI_3W_SAS=m
+CONFIG_SCSI_PM8001=m
+CONFIG_VMWARE_PVSCSI=m
+CONFIG_VMWARE_BALLOON=m
+
+CONFIG_ATA=y
+CONFIG_ATA_BMDMA=y
+CONFIG_ATA_VERBOSE_ERROR=y
+CONFIG_ATA_SFF=y
+CONFIG_ATA_PIIX=y
+CONFIG_ATA_ACPI=y
+CONFIG_BLK_DEV_SX8=m
+CONFIG_PDC_ADMA=m
+CONFIG_SATA_AHCI=y
+CONFIG_SATA_AHCI_PLATFORM=m
+CONFIG_SATA_INIC162X=m
+CONFIG_SATA_MV=m
+CONFIG_SATA_NV=m
+CONFIG_SATA_PMP=y
+CONFIG_SATA_PROMISE=m
+CONFIG_SATA_QSTOR=m
+CONFIG_SATA_SIL=m
+CONFIG_SATA_SIL24=m
+CONFIG_SATA_SIS=m
+CONFIG_SATA_SVW=m
+CONFIG_SATA_SX4=m
+CONFIG_SATA_ULI=m
+CONFIG_SATA_VIA=m
+CONFIG_SATA_VITESSE=m
+CONFIG_SATA_ACARD_AHCI=m
+
+CONFIG_PATA_ACPI=m
+CONFIG_PATA_ALI=m
+CONFIG_PATA_AMD=m
+CONFIG_PATA_ARTOP=m
+CONFIG_PATA_ATIIXP=m
+CONFIG_PATA_CMD640_PCI=m
+CONFIG_PATA_CMD64X=m
+CONFIG_PATA_CS5520=m
+CONFIG_PATA_CS5530=m
+CONFIG_PATA_CS5535=m
+CONFIG_PATA_CS5536=m
+CONFIG_PATA_CYPRESS=m
+CONFIG_PATA_EFAR=m
+CONFIG_ATA_GENERIC=m
+CONFIG_PATA_HPT366=m
+CONFIG_PATA_HPT37X=m
+CONFIG_PATA_HPT3X2N=m
+CONFIG_PATA_HPT3X3=m
+# CONFIG_PATA_HPT3X3_DMA is not set
+# CONFIG_PATA_ISAPNP is not set
+CONFIG_PATA_IT821X=m
+CONFIG_PATA_IT8213=m
+CONFIG_PATA_JMICRON=m
+# CONFIG_PATA_LEGACY is not set
+CONFIG_PATA_NINJA32=m
+CONFIG_PATA_MARVELL=m
+# CONFIG_PATA_WINBOND_VLB is not set
+CONFIG_PATA_MPIIX=m
+CONFIG_PATA_NETCELL=m
+CONFIG_PATA_NS87410=m
+CONFIG_PATA_NS87415=m
+CONFIG_PATA_OLDPIIX=m
+CONFIG_PATA_OPTI=m
+CONFIG_PATA_OPTIDMA=m
+CONFIG_PATA_PCMCIA=m
+CONFIG_PATA_PDC_OLD=m
+CONFIG_PATA_QDI=m
+# CONFIG_PATA_RADISYS is not set
+CONFIG_PATA_RDC=m
+# CONFIG_PATA_RZ1000 is not set
+# CONFIG_PATA_SC1200 is not set
+CONFIG_PATA_SERVERWORKS=m
+CONFIG_PATA_PDC2027X=m
+CONFIG_PATA_SCH=m
+CONFIG_PATA_SIL680=m
+CONFIG_PATA_SIS=m
+CONFIG_PATA_TOSHIBA=m
+CONFIG_PATA_TRIFLEX=m
+CONFIG_PATA_VIA=m
+CONFIG_PATA_WINBOND=m
+CONFIG_PATA_ATP867X=m
+
+CONFIG_SCSI_BUSLOGIC=m
+CONFIG_SCSI_INITIO=m
+CONFIG_SCSI_FLASHPOINT=y
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_EATA_PIO is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+CONFIG_SCSI_GDTH=m
+CONFIG_SCSI_HPTIOP=m
+CONFIG_SCSI_IPS=m
+CONFIG_SCSI_INIA100=m
+CONFIG_SCSI_PPA=m
+CONFIG_SCSI_IMM=m
+# CONFIG_SCSI_IZIP_EPP16 is not set
+# CONFIG_SCSI_IZIP_SLOW_CTR is not set
+CONFIG_SCSI_STEX=m
+CONFIG_SCSI_SYM53C8XX_2=m
+CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
+CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
+CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
+CONFIG_SCSI_SYM53C8XX_MMIO=y
+CONFIG_SCSI_QLOGIC_1280=m
+CONFIG_SCSI_DC395x=m
+# CONFIG_SCSI_NSP32 is not set
+CONFIG_SCSI_DEBUG=m
+CONFIG_SCSI_DC390T=m
+CONFIG_SCSI_QLA_FC=m
+CONFIG_SCSI_QLA_ISCSI=m
+# CONFIG_SCSI_IPR is not set
+# CONFIG_SCSI_DPT_I2O is not set
+CONFIG_SCSI_LPFC=m
+
+#
+# PCMCIA SCSI adapter support
+#
+CONFIG_SCSI_LOWLEVEL_PCMCIA=y
+CONFIG_PCMCIA_AHA152X=m
+# CONFIG_PCMCIA_FDOMAIN is not set
+CONFIG_PCMCIA_NINJA_SCSI=m
+CONFIG_PCMCIA_QLOGIC=m
+CONFIG_PCMCIA_SYM53C500=m
+
+
+#
+# Multi-device support (RAID and LVM)
+#
+CONFIG_MD=y
+CONFIG_BLK_DEV_MD=y
+CONFIG_MD_AUTODETECT=y
+CONFIG_MD_FAULTY=m
+CONFIG_MD_LINEAR=m
+CONFIG_MD_MULTIPATH=m
+CONFIG_MD_RAID0=m
+CONFIG_MD_RAID1=m
+CONFIG_MD_RAID10=m
+CONFIG_MD_RAID456=m
+# CONFIG_MULTICORE_RAID456 is not set
+CONFIG_ASYNC_RAID6_TEST=m
+CONFIG_BLK_DEV_DM=y
+CONFIG_DM_CRYPT=m
+CONFIG_DM_DEBUG=y
+# CONFIG_DM_DELAY is not set
+CONFIG_DM_MIRROR=y
+CONFIG_DM_MULTIPATH=m
+CONFIG_DM_SNAPSHOT=y
+CONFIG_DM_UEVENT=y
+CONFIG_DM_ZERO=y
+CONFIG_DM_LOG_USERSPACE=m
+CONFIG_DM_MULTIPATH_QL=m
+CONFIG_DM_MULTIPATH_ST=m
+CONFIG_DM_RAID=m
+
+#
+# Fusion MPT device support
+#
+CONFIG_FUSION=y
+CONFIG_FUSION_SPI=m
+CONFIG_FUSION_FC=m
+CONFIG_FUSION_MAX_SGE=40
+CONFIG_FUSION_CTL=m
+CONFIG_FUSION_LAN=m
+CONFIG_FUSION_SAS=m
+CONFIG_FUSION_LOGGING=y
+
+#
+# IEEE 1394 (FireWire) support (JUJU alternative stack)
+#
+CONFIG_FIREWIRE=m
+CONFIG_FIREWIRE_OHCI=m
+CONFIG_FIREWIRE_SBP2=m
+CONFIG_FIREWIRE_NET=m
+CONFIG_FIREWIRE_OHCI_DEBUG=y
+CONFIG_FIREWIRE_NOSY=m
+# CONFIG_FIREWIRE_OHCI_REMOTE_DMA is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+# CONFIG_I2O_LCT_NOTIFY_ON_CHANGES is not set
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+CONFIG_TCP_CONG_ADVANCED=y
+CONFIG_TCP_CONG_BIC=m
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_TCP_CONG_HTCP=m
+CONFIG_TCP_CONG_HSTCP=m
+CONFIG_TCP_CONG_HYBLA=m
+CONFIG_TCP_CONG_ILLINOIS=m
+CONFIG_TCP_CONG_LP=m
+CONFIG_TCP_CONG_SCALABLE=m
+CONFIG_TCP_CONG_VEGAS=m
+CONFIG_TCP_CONG_VENO=m
+CONFIG_TCP_CONG_WESTWOOD=m
+CONFIG_TCP_CONG_YEAH=m
+
+CONFIG_TCP_MD5SIG=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_NET_KEY=m
+CONFIG_NET_KEY_MIGRATE=y
+CONFIG_INET=y
+CONFIG_INET_LRO=y
+CONFIG_INET_TUNNEL=m
+CONFIG_INET_DIAG=m
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_ROUTE_MULTIPATH=y
+CONFIG_IP_ROUTE_VERBOSE=y
+CONFIG_IP_NF_SECURITY=m
+# CONFIG_IP_PNP is not set
+CONFIG_NET_IPIP=m
+CONFIG_NET_IPGRE_DEMUX=m
+CONFIG_NET_IPGRE=m
+CONFIG_NET_IPGRE_BROADCAST=y
+CONFIG_IP_MROUTE=y
+CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
+CONFIG_IP_PIMSM_V1=y
+CONFIG_IP_PIMSM_V2=y
+CONFIG_ARPD=y
+CONFIG_SYN_COOKIES=y
+CONFIG_INET_AH=m
+CONFIG_INET_ESP=m
+CONFIG_INET_IPCOMP=m
+CONFIG_NETCONSOLE=m
+CONFIG_NETCONSOLE_DYNAMIC=y
+CONFIG_NETPOLL_TRAP=y
+CONFIG_NET_POLL_CONTROLLER=y
+
+#
+# IP: Virtual Server Configuration
+#
+CONFIG_IP_VS=m
+# CONFIG_IP_VS_DEBUG is not set
+CONFIG_IP_VS_TAB_BITS=12
+CONFIG_IP_VS_PROTO_TCP=y
+CONFIG_IP_VS_PROTO_UDP=y
+CONFIG_IP_VS_PROTO_ESP=y
+CONFIG_IP_VS_PROTO_AH=y
+CONFIG_IP_VS_PROTO_SCTP=y
+CONFIG_IP_VS_RR=m
+CONFIG_IP_VS_WRR=m
+CONFIG_IP_VS_LC=m
+CONFIG_IP_VS_WLC=m
+CONFIG_IP_VS_LBLC=m
+CONFIG_IP_VS_LBLCR=m
+CONFIG_IP_VS_DH=m
+CONFIG_IP_VS_SH=m
+CONFIG_IP_VS_SED=m
+CONFIG_IP_VS_NQ=m
+CONFIG_IP_VS_FTP=m
+CONFIG_IP_VS_PE_SIP=m
+
+CONFIG_IPV6=m
+CONFIG_IPV6_PRIVACY=y
+CONFIG_IPV6_ROUTER_PREF=y
+CONFIG_IPV6_ROUTE_INFO=y
+CONFIG_IPV6_OPTIMISTIC_DAD=y
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_IPV6_MIP6=y
+CONFIG_IPV6_SIT=m
+CONFIG_IPV6_SIT_6RD=y
+CONFIG_IPV6_TUNNEL=m
+CONFIG_IPV6_SUBTREES=y
+CONFIG_IPV6_MULTIPLE_TABLES=y
+CONFIG_IPV6_MROUTE=y
+CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y
+CONFIG_IPV6_PIMSM_V2=y
+
+CONFIG_RDS=m
+# CONFIG_RDS_DEBUG is not set
+CONFIG_RDS_RDMA=m
+CONFIG_RDS_TCP=m
+
+CONFIG_NET_9P=m
+CONFIG_NET_9P_VIRTIO=m
+# CONFIG_NET_9P_DEBUG is not set
+CONFIG_NET_9P_RDMA=m
+
+CONFIG_DECNET=m
+CONFIG_DECNET_ROUTER=y
+# CONFIG_DECNET_NF_GRABULATOR is not set
+CONFIG_BRIDGE=m
+CONFIG_BRIDGE_IGMP_SNOOPING=y
+# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
+CONFIG_NETFILTER=y
+CONFIG_NETFILTER_ADVANCED=y
+CONFIG_NF_CONNTRACK=y
+CONFIG_NETFILTER_NETLINK=m
+CONFIG_NETFILTER_NETLINK_QUEUE=m
+CONFIG_NETFILTER_NETLINK_LOG=m
+CONFIG_NETFILTER_XTABLES=y
+CONFIG_NETFILTER_XT_MARK=m
+CONFIG_NETFILTER_XT_CONNMARK=m
+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
+CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
+CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
+CONFIG_NETFILTER_XT_TARGET_DSCP=m
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+CONFIG_NETFILTER_XT_TARGET_NFLOG=m
+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
+CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
+CONFIG_NETFILTER_XT_TARGET_RATEEST=m
+CONFIG_NETFILTER_XT_TARGET_SECMARK=m
+CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
+CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
+CONFIG_NETFILTER_XT_TARGET_TRACE=m
+CONFIG_NETFILTER_XT_TARGET_TEE=m
+CONFIG_NETFILTER_XT_TARGET_LED=m
+CONFIG_NETFILTER_XT_TARGET_CT=m
+CONFIG_NETFILTER_XT_MATCH_COMMENT=m
+CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
+CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
+CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
+CONFIG_NETFILTER_XT_MATCH_DCCP=m
+CONFIG_NETFILTER_XT_MATCH_DSCP=m
+CONFIG_NETFILTER_XT_MATCH_ESP=m
+CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
+CONFIG_NETFILTER_XT_MATCH_HELPER=m
+CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
+CONFIG_NETFILTER_XT_MATCH_OWNER=m
+CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
+CONFIG_NETFILTER_XT_MATCH_POLICY=m
+CONFIG_NETFILTER_XT_MATCH_QUOTA=m
+CONFIG_NETFILTER_XT_MATCH_RATEEST=m
+CONFIG_NETFILTER_XT_MATCH_REALM=m
+CONFIG_NETFILTER_XT_MATCH_SCTP=m
+CONFIG_NETFILTER_XT_MATCH_STATE=y
+CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
+CONFIG_NETFILTER_XT_MATCH_STRING=m
+CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
+CONFIG_NETFILTER_XT_MATCH_TIME=m
+CONFIG_NETFILTER_XT_MATCH_U32=m
+CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
+CONFIG_NETFILTER_XT_MATCH_HL=m
+CONFIG_NETFILTER_XT_MATCH_OSF=m
+CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
+CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
+CONFIG_NETFILTER_XT_MATCH_CPU=m
+CONFIG_NETFILTER_XT_MATCH_IPVS=m
+
+# CONFIG_NETFILTER_DEBUG is not set
+CONFIG_BRIDGE_NETFILTER=y
+
+#
+# IP: Netfilter Configuration
+#
+
+CONFIG_NF_CT_ACCT=y
+CONFIG_NF_CONNTRACK_MARK=y
+CONFIG_NF_CONNTRACK_SECMARK=y
+CONFIG_NF_CONNTRACK_EVENTS=y
+CONFIG_NF_CONNTRACK_ZONES=y
+# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set
+CONFIG_NF_CONNTRACK_AMANDA=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_NETBIOS_NS=m
+CONFIG_NF_CONNTRACK_PPTP=m
+CONFIG_NF_CONNTRACK_SANE=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_TFTP=m
+CONFIG_NF_CONNTRACK_IPV4=y
+CONFIG_NF_CONNTRACK_IPV6=y
+CONFIG_NF_NAT=m
+CONFIG_NF_NAT_SNMP_BASIC=m
+CONFIG_NF_CT_PROTO_DCCP=m
+CONFIG_NF_CT_PROTO_SCTP=m
+CONFIG_NF_CT_NETLINK=m
+CONFIG_NF_CT_PROTO_UDPLITE=m
+
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_TARGET_CLUSTERIP=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_TARGET_REJECT=y
+CONFIG_IP_NF_TARGET_TTL=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+CONFIG_IP_NF_QUEUE=m
+CONFIG_IP_NF_RAW=m
+
+CONFIG_IP_NF_IPTABLES=y
+CONFIG_IP_NF_FILTER=y
+
+#
+# IPv6: Netfilter Configuration
+#
+CONFIG_IP6_NF_FILTER=m
+CONFIG_IP6_NF_IPTABLES=m
+CONFIG_IP6_NF_MANGLE=m
+CONFIG_IP6_NF_MATCH_AH=m
+CONFIG_IP6_NF_MATCH_EUI64=m
+CONFIG_IP6_NF_MATCH_FRAG=m
+CONFIG_IP6_NF_MATCH_HL=m
+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+CONFIG_IP6_NF_MATCH_MH=m
+CONFIG_IP6_NF_MATCH_OPTS=m
+CONFIG_IP6_NF_MATCH_RT=m
+CONFIG_IP6_NF_QUEUE=m
+CONFIG_IP6_NF_RAW=m
+CONFIG_IP6_NF_SECURITY=m
+CONFIG_IP6_NF_TARGET_LOG=m
+CONFIG_IP6_NF_TARGET_REJECT=m
+CONFIG_IP6_NF_TARGET_HL=m
+
+#
+# Bridge: Netfilter Configuration
+#
+CONFIG_BRIDGE_NF_EBTABLES=m
+CONFIG_BRIDGE_EBT_802_3=m
+CONFIG_BRIDGE_EBT_AMONG=m
+CONFIG_BRIDGE_EBT_ARP=m
+CONFIG_BRIDGE_EBT_ARPREPLY=m
+CONFIG_BRIDGE_EBT_BROUTE=m
+CONFIG_BRIDGE_EBT_DNAT=m
+CONFIG_BRIDGE_EBT_IP=m
+CONFIG_BRIDGE_EBT_IP6=m
+CONFIG_BRIDGE_EBT_LIMIT=m
+CONFIG_BRIDGE_EBT_LOG=m
+CONFIG_BRIDGE_EBT_MARK=m
+CONFIG_BRIDGE_EBT_MARK_T=m
+CONFIG_BRIDGE_EBT_NFLOG=m
+CONFIG_BRIDGE_EBT_PKTTYPE=m
+CONFIG_BRIDGE_EBT_REDIRECT=m
+CONFIG_BRIDGE_EBT_SNAT=m
+CONFIG_BRIDGE_EBT_STP=m
+CONFIG_BRIDGE_EBT_T_FILTER=m
+CONFIG_BRIDGE_EBT_T_NAT=m
+CONFIG_BRIDGE_EBT_ULOG=m
+CONFIG_BRIDGE_EBT_VLAN=m
+CONFIG_XFRM=y
+CONFIG_XFRM_MIGRATE=y
+CONFIG_XFRM_SUB_POLICY=y
+CONFIG_XFRM_STATISTICS=y
+CONFIG_XFRM_USER=y
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+CONFIG_IP_SCTP=m
+CONFIG_NET_SCTPPROBE=m
+# CONFIG_SCTP_DBG_MSG is not set
+# CONFIG_SCTP_DBG_OBJCNT is not set
+# CONFIG_SCTP_HMAC_NONE is not set
+CONFIG_SCTP_HMAC_SHA1=y
+# CONFIG_SCTP_HMAC_MD5 is not set
+CONFIG_ATM=m
+CONFIG_VLAN_8021Q=m
+CONFIG_VLAN_8021Q_GVRP=y
+CONFIG_LLC=m
+# CONFIG_LLC2 is not set
+CONFIG_IPX=m
+# CONFIG_IPX_INTERN is not set
+CONFIG_ATALK=m
+CONFIG_DEV_APPLETALK=y
+CONFIG_IPDDP=m
+CONFIG_IPDDP_ENCAP=y
+CONFIG_IPDDP_DECAP=y
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+CONFIG_WAN_ROUTER=m
+CONFIG_IP_DCCP=m
+CONFIG_IP_DCCP_CCID2=m
+# CONFIG_IP_DCCP_CCID2_DEBUG is not set
+CONFIG_IP_DCCP_CCID3=y
+# CONFIG_IP_DCCP_CCID3_DEBUG is not set
+CONFIG_IP_DCCP_CCID3_RTO=100
+# CONFIG_IP_DCCP_DEBUG is not set
+CONFIG_NET_DCCPPROBE=m
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC is not set
+# CONFIG_TIPC_ADVANCED is not set
+# CONFIG_TIPC_DEBUG is not set
+
+CONFIG_NETLABEL=y
+
+#
+# QoS and/or fair queueing
+#
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_CBQ=m
+CONFIG_NET_SCH_DSMARK=m
+CONFIG_NET_SCH_DRR=m
+CONFIG_NET_SCH_GRED=m
+CONFIG_NET_SCH_HFSC=m
+CONFIG_NET_SCH_HTB=m
+CONFIG_NET_SCH_INGRESS=m
+CONFIG_NET_SCH_NETEM=m
+CONFIG_NET_SCH_PRIO=m
+CONFIG_NET_SCH_RED=m
+CONFIG_NET_SCH_SFQ=m
+CONFIG_NET_SCH_TBF=m
+CONFIG_NET_SCH_TEQL=m
+CONFIG_NET_CLS=y
+CONFIG_NET_CLS_ACT=y
+CONFIG_NET_CLS_BASIC=m
+CONFIG_NET_CLS_CGROUP=y
+CONFIG_NET_CLS_FLOW=m
+CONFIG_NET_CLS_FW=m
+CONFIG_NET_CLS_IND=y
+CONFIG_NET_CLS_ROUTE4=m
+CONFIG_NET_CLS_ROUTE=y
+CONFIG_NET_CLS_RSVP=m
+CONFIG_NET_CLS_RSVP6=m
+CONFIG_NET_CLS_TCINDEX=m
+CONFIG_NET_CLS_U32=m
+CONFIG_CLS_U32_MARK=y
+CONFIG_CLS_U32_PERF=y
+CONFIG_NET_EMATCH=y
+CONFIG_NET_EMATCH_CMP=m
+CONFIG_NET_EMATCH_META=m
+CONFIG_NET_EMATCH_NBYTE=m
+CONFIG_NET_EMATCH_STACK=32
+CONFIG_NET_EMATCH_TEXT=m
+CONFIG_NET_EMATCH_U32=m
+
+CONFIG_NET_ACT_GACT=m
+CONFIG_GACT_PROB=y
+CONFIG_NET_ACT_IPT=m
+CONFIG_NET_ACT_MIRRED=m
+CONFIG_NET_ACT_NAT=m
+CONFIG_NET_ACT_PEDIT=m
+CONFIG_NET_ACT_POLICE=m
+CONFIG_NET_ACT_SIMP=m
+CONFIG_NET_ACT_CSUM=m
+
+CONFIG_DCB=y
+
+#
+# Network testing
+#
+CONFIG_NET_PKTGEN=m
+# CONFIG_NET_TCPPROBE is not set
+CONFIG_NET_DROP_MONITOR=y
+CONFIG_NETDEVICES=y
+
+# disable later --kyle
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+CONFIG_IFB=m
+CONFIG_DUMMY=m
+CONFIG_BONDING=m
+CONFIG_MACVLAN=m
+CONFIG_MACVTAP=m
+CONFIG_EQUALIZER=m
+CONFIG_TUN=m
+CONFIG_VETH=m
+CONFIG_NET_SB1000=m
+
+#
+# ATM
+#
+CONFIG_ATM_DRIVERS=y
+# CONFIG_ATM_DUMMY is not set
+CONFIG_ATM_CLIP=m
+CONFIG_ATM_LANE=m
+CONFIG_ATM_BR2684=m
+CONFIG_NET_SCH_ATM=m
+CONFIG_ATM_TCP=m
+# CONFIG_ATM_LANAI is not set
+CONFIG_ATM_ENI=m
+CONFIG_ATM_FIRESTREAM=m
+# CONFIG_ATM_ZATM is not set
+# CONFIG_ATM_IDT77252 is not set
+# CONFIG_ATM_AMBASSADOR is not set
+# CONFIG_ATM_HORIZON is not set
+# CONFIG_ATM_FORE200E is not set
+# CONFIG_ATM_FORE200E_USE_TASKLET is not set
+CONFIG_ATM_FORE200E_TX_RETRY=16
+CONFIG_ATM_FORE200E_DEBUG=0
+
+CONFIG_ATM_HE=m
+CONFIG_PPTP=m
+CONFIG_PPPOATM=m
+CONFIG_PPPOL2TP=m
+CONFIG_ATM_NICSTAR=m
+# CONFIG_ATM_IA is not set
+# CONFIG_ATM_CLIP_NO_ICMP is not set
+# CONFIG_ATM_MPOA is not set
+# CONFIG_ATM_BR2684_IPFILTER is not set
+# CONFIG_ATM_ENI_DEBUG is not set
+# CONFIG_ATM_ENI_TUNE_BURST is not set
+# CONFIG_ATM_ZATM_DEBUG is not set
+# CONFIG_ATM_IDT77252_DEBUG is not set
+# CONFIG_ATM_IDT77252_RCV_ALL is not set
+# CONFIG_ATM_AMBASSADOR_DEBUG is not set
+# CONFIG_ATM_HORIZON_DEBUG is not set
+# CONFIG_ATM_HE_USE_SUNI is not set
+# CONFIG_ATM_NICSTAR_USE_SUNI is not set
+# CONFIG_ATM_NICSTAR_USE_IDT77105 is not set
+# CONFIG_ATM_IA_DEBUG is not set
+CONFIG_ATM_SOLOS=m
+
+CONFIG_L2TP=m
+CONFIG_L2TP_DEBUGFS=m
+CONFIG_L2TP_V3=y
+CONFIG_L2TP_IP=m
+CONFIG_L2TP_ETH=m
+
+# CONFIG_CAIF is not set
+
+CONFIG_RFKILL=m
+CONFIG_RFKILL_INPUT=y
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NETDEV_1000=y
+CONFIG_NETDEV_10000=y
+CONFIG_NET_ETHERNET=y
+CONFIG_PHYLIB=m
+CONFIG_BROADCOM_PHY=m
+CONFIG_CICADA_PHY=m
+CONFIG_DAVICOM_PHY=m
+CONFIG_FIXED_PHY=y
+CONFIG_MDIO_BITBANG=m
+CONFIG_NATIONAL_PHY=m
+CONFIG_ICPLUS_PHY=m
+CONFIG_BCM63XX_PHY=m
+CONFIG_LSI_ET1011C_PHY=m
+CONFIG_LXT_PHY=m
+CONFIG_MARVELL_PHY=m
+CONFIG_QSEMI_PHY=m
+CONFIG_REALTEK_PHY=m
+CONFIG_SMSC_PHY=m
+CONFIG_STE10XP=m
+CONFIG_VITESSE_PHY=m
+CONFIG_MICREL_PHY=m
+
+CONFIG_MII=m
+CONFIG_HAPPYMEAL=m
+CONFIG_SUNGEM=m
+CONFIG_NET_VENDOR_3COM=y
+CONFIG_VORTEX=m
+CONFIG_TYPHOON=m
+CONFIG_DNET=m
+CONFIG_STMMAC_ETH=m
+# CONFIG_STMMAC_DA is not set
+# CONFIG_STMMAC_DUAL_MAC is not set
+# CONFIG_STMMAC_TIMER is not set
+
+# CONFIG_PCH_GBE is not set
+
+#
+# Tulip family network device support
+#
+CONFIG_NET_TULIP=y
+CONFIG_DE2104X=m
+CONFIG_DE2104X_DSL=0
+CONFIG_TULIP=m
+# CONFIG_TULIP_NAPI is not set
+# CONFIG_TULIP_MWI is not set
+CONFIG_TULIP_MMIO=y
+# CONFIG_NI5010 is not set
+CONFIG_DE4X5=m
+CONFIG_WINBOND_840=m
+CONFIG_DM9102=m
+CONFIG_PCMCIA_XIRCOM=m
+CONFIG_ULI526X=m
+# CONFIG_HP100 is not set
+CONFIG_LNE390=m
+CONFIG_NE3210=m
+CONFIG_ES3210=m
+CONFIG_NET_PCI=y
+CONFIG_PCNET32=m
+CONFIG_AMD8111_ETH=m
+CONFIG_ADAPTEC_STARFIRE=m
+CONFIG_KSZ884X_PCI=m
+CONFIG_B44=m
+CONFIG_B44_PCI=y
+CONFIG_BNX2=m
+CONFIG_CNIC=m
+CONFIG_QLA3XXX=m
+CONFIG_ATL1=m
+CONFIG_ATL1C=m
+CONFIG_ATL2=m
+CONFIG_ATL1E=m
+CONFIG_E100=m
+CONFIG_FEALNX=m
+CONFIG_FORCEDETH=m
+CONFIG_FORCEDETH_NAPI=y
+CONFIG_NATSEMI=m
+CONFIG_NE2K_PCI=m
+CONFIG_8139CP=m
+CONFIG_8139TOO=m
+# CONFIG_8139TOO_PIO is not set
+# CONFIG_8139TOO_TUNE_TWISTER is not set
+CONFIG_8139TOO_8129=y
+# CONFIG_8139_OLD_RX_RESET is not set
+CONFIG_SIS900=m
+CONFIG_SIS190=m
+CONFIG_EPIC100=m
+CONFIG_SC92031=m
+CONFIG_SMSC9420=m
+CONFIG_SUNDANCE=m
+# CONFIG_SUNDANCE_MMIO is not set
+CONFIG_TLAN=m
+CONFIG_VIA_RHINE=m
+CONFIG_VIA_RHINE_MMIO=y
+CONFIG_VIA_VELOCITY=m
+CONFIG_NET_POCKET=y
+CONFIG_ATP=m
+CONFIG_DE600=m
+CONFIG_DE620=m
+CONFIG_CASSINI=m
+CONFIG_ETHOC=m
+# CONFIG_KS8842 is not set
+# CONFIG_KS8851_MLL is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+CONFIG_ACENIC=m
+# CONFIG_ACENIC_OMIT_TIGON_I is not set
+CONFIG_DL2K=m
+CONFIG_E1000=m
+CONFIG_E1000E=m
+CONFIG_IGB=m
+CONFIG_IGB_DCA=y
+CONFIG_IGBVF=m
+CONFIG_NS83820=m
+CONFIG_HAMACHI=m
+CONFIG_YELLOWFIN=m
+CONFIG_R8169=m
+CONFIG_R8169_VLAN=y
+CONFIG_SKGE=m
+# CONFIG_SKGE_DEBUG is not set
+CONFIG_TIGON3=m
+CONFIG_SKY2=m
+# CONFIG_SKY2_DEBUG is not set
+CONFIG_JME=m
+
+#
+# Ethernet (10000 Mbit)
+#
+CONFIG_CHELSIO_T1=m
+CONFIG_CHELSIO_T1_1G=y
+CONFIG_CHELSIO_T3=m
+CONFIG_CHELSIO_T4=m
+CONFIG_CHELSIO_T4VF=m
+CONFIG_IP1000=m
+CONFIG_IXGB=m
+CONFIG_IXGBEVF=m
+CONFIG_IXGBE=m
+CONFIG_IXGBE_DCA=y
+CONFIG_IXGBE_DCB=y
+CONFIG_MYRI10GE=m
+CONFIG_MYRI10GE_DCA=y
+CONFIG_NETXEN_NIC=m
+CONFIG_NIU=m
+CONFIG_S2IO=m
+CONFIG_VXGE=m
+# CONFIG_VXGE_DEBUG_TRACE_ALL is not set
+CONFIG_TEHUTI=m
+CONFIG_ENIC=m
+CONFIG_MLX4_EN=m
+# CONFIG_MLX4_DEBUG is not set
+CONFIG_QLCNIC=m
+CONFIG_QLGE=m
+CONFIG_BNA=m
+CONFIG_SFC=m
+CONFIG_SFC_MTD=y
+CONFIG_BE2NET=m
+
+CONFIG_FDDI=y
+# CONFIG_DEFXX is not set
+CONFIG_SKFP=m
+# CONFIG_HIPPI is not set
+CONFIG_PLIP=m
+CONFIG_PPP=m
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_IPPP_FILTER=y
+# CONFIG_PPP_BSDCOMP is not set
+CONFIG_PPPOE=m
+CONFIG_PPP_MPPE=m
+CONFIG_SLIP=m
+CONFIG_SLIP_COMPRESSED=y
+CONFIG_SLIP_SMART=y
+# CONFIG_SLIP_MODE_SLIP6 is not set
+
+#
+# Wireless LAN
+#
+#
+CONFIG_WLAN=y
+# CONFIG_STRIP is not set
+# CONFIG_ARLAN is not set
+CONFIG_PCMCIA_WAVELAN=m
+CONFIG_PCMCIA_NETWAVE=m
+# CONFIG_PCMCIA_RAYCS is not set
+
+CONFIG_WIRELESS=y
+CONFIG_CFG80211=m
+CONFIG_CFG80211_WEXT=y
+# CONFIG_CFG80211_REG_DEBUG is not set
+CONFIG_CFG80211_DEBUGFS=y
+# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
+CONFIG_CFG80211_DEFAULT_PS=y
+CONFIG_NL80211=y
+# CONFIG_NL80211_TESTMODE is not set
+# CONFIG_WIRELESS_OLD_REGULATORY is not set
+CONFIG_WIRELESS_EXT=y
+CONFIG_WIRELESS_EXT_SYSFS=y
+CONFIG_LIB80211=m
+CONFIG_LIB80211_CRYPT_WEP=m
+CONFIG_LIB80211_CRYPT_CCMP=m
+CONFIG_LIB80211_CRYPT_TKIP=m
+# CONFIG_LIB80211_DEBUG is not set
+
+CONFIG_MAC80211=m
+CONFIG_MAC80211_RC_MINSTREL=y
+# CONFIG_MAC80211_RC_DEFAULT_PID is not set
+CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
+CONFIG_MAC80211_RC_DEFAULT="minstrel"
+CONFIG_MAC80211_MESH=y
+CONFIG_MAC80211_LEDS=y
+CONFIG_MAC80211_DEBUGFS=y
+# CONFIG_MAC80211_DEBUG_MENU is not set
+
+CONFIG_WIMAX=m
+CONFIG_WIMAX_DEBUG_LEVEL=8
+CONFIG_WIMAX_I2400M_USB=m
+CONFIG_WIMAX_I2400M_SDIO=m
+CONFIG_WIMAX_I2400M_DEBUG_LEVEL=8
+CONFIG_WIMAX_IWMC3200_SDIO=y
+
+CONFIG_ADM8211=m
+CONFIG_ATH_COMMON=m
+CONFIG_ATH5K=m
+CONFIG_ATH5K_DEBUG=y
+CONFIG_ATH9K=m
+# CONFIG_ATH9K_DEBUG is not set
+CONFIG_ATH9K_DEBUGFS=y
+CONFIG_ATH9K_HTC=m
+# CONFIG_ATH9K_HTC_DEBUGFS is not set
+CONFIG_ATH9K_RATE_CONTROL=y
+CONFIG_CARL9170=m
+CONFIG_CARL9170_LEDS=y
+CONFIG_AT76C50X_USB=m
+CONFIG_AIRO=m
+CONFIG_AIRO_CS=m
+CONFIG_ATMEL=m
+CONFIG_B43=m
+CONFIG_B43_PCMCIA=y
+CONFIG_B43_SDIO=y
+# CONFIG_B43_DEBUG is not set
+CONFIG_B43_PHY_LP=y
+CONFIG_B43_PHY_N=y
+# CONFIG_B43_FORCE_PIO is not set
+CONFIG_B43LEGACY=m
+# CONFIG_B43LEGACY_DEBUG is not set
+CONFIG_B43LEGACY_DMA=y
+CONFIG_B43LEGACY_PIO=y
+CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y
+# CONFIG_B43LEGACY_DMA_MODE is not set
+# CONFIG_B43LEGACY_PIO_MODE is not set
+CONFIG_HERMES=m
+CONFIG_HERMES_CACHE_FW_ON_INIT=y
+# CONFIG_HERMES_PRISM is not set
+CONFIG_NORTEL_HERMES=m
+CONFIG_PCI_HERMES=m
+CONFIG_PLX_HERMES=m
+CONFIG_PCMCIA_HERMES=m
+CONFIG_ORINOCO_USB=m
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_PCI=m
+CONFIG_HOSTAP_PLX=m
+CONFIG_HOSTAP_FIRMWARE=y
+CONFIG_HOSTAP_FIRMWARE_NVRAM=y
+CONFIG_HOSTAP_CS=m
+# CONFIG_IPW2100 is not set
+# CONFIG_IPW2200 is not set
+# CONFIG_IPW2100_DEBUG is not set
+# CONFIG_IPW2200_DEBUG is not set
+# CONFIG_LIBIPW_DEBUG is not set
+CONFIG_LIBERTAS=m
+CONFIG_LIBERTAS_USB=m
+CONFIG_LIBERTAS_CS=m
+CONFIG_LIBERTAS_SDIO=m
+# CONFIG_LIBERTAS_DEBUG is not set
+CONFIG_LIBERTAS_THINFIRM=m
+CONFIG_LIBERTAS_THINFIRM_USB=m
+# CONFIG_LIBERTAS_THINFIRM_DEBUG is not set
+CONFIG_LIBERTAS_MESH=y
+CONFIG_IWLWIFI=m
+CONFIG_IWLWIFI_DEBUG=y
+CONFIG_IWLWIFI_DEBUGFS=y
+CONFIG_IWLWIFI_SPECTRUM_MEASUREMENT=y
+CONFIG_IWLAGN=m
+CONFIG_IWL4965=y
+CONFIG_IWL5000=y
+CONFIG_IWL3945=m
+CONFIG_IWL3945_SPECTRUM_MEASUREMENT=y
+# CONFIG_IWLWIFI_DEBUG_EXPERIMENTAL_UCODE is not set
+CONFIG_IWM=m
+# CONFIG_IWM_DEBUG is not set
+# CONFIG_IWM_TRACING is not set
+CONFIG_MAC80211_HWSIM=m
+CONFIG_P54_COMMON=m
+CONFIG_P54_USB=m
+CONFIG_P54_PCI=m
+CONFIG_PCI_ATMEL=m
+CONFIG_MWL8K=m
+# CONFIG_PRISM54 is not set
+CONFIG_PCMCIA_SPECTRUM=m
+CONFIG_PCMCIA_ATMEL=m
+CONFIG_PCMCIA_WL3501=m
+CONFIG_RT2X00=m
+CONFIG_RT2X00_LIB_DEBUGFS=y
+# CONFIG_RT2X00_DEBUG is not set
+CONFIG_RT2400PCI=m
+CONFIG_RT2500PCI=m
+CONFIG_RT61PCI=m
+CONFIG_RT2500USB=m
+CONFIG_RT2800USB=m
+CONFIG_RT2800USB_RT33XX=y
+CONFIG_RT2800USB_RT35XX=y
+CONFIG_RT2800USB_UNKNOWN=y
+CONFIG_RT2800PCI=m
+CONFIG_RT2800PCI_RT33XX=y
+CONFIG_RT2800PCI_RT35XX=y
+CONFIG_RT73USB=m
+CONFIG_RTL8180=m
+CONFIG_RTL8187=m
+CONFIG_TMD_HERMES=m
+CONFIG_USB_ZD1201=m
+CONFIG_USB_NET_RNDIS_WLAN=m
+CONFIG_USB_NET_SMSC75XX=m
+CONFIG_ZD1211RW=m
+# CONFIG_ZD1211RW_DEBUG is not set
+CONFIG_AR9170_USB=m
+
+CONFIG_WL12XX_MENU=m
+CONFIG_WL12XX=m
+# CONFIG_WL12XX_HT is not set
+CONFIG_WL12XX_SPI=m
+CONFIG_WL12XX_SDIO=m
+# CONFIG_WL12XX_SDIO_TEST is not set
+
+CONFIG_WL1251=m
+CONFIG_WL1251_SPI=m
+CONFIG_WL1251_SDIO=m
+CONFIG_WL1271=m
+CONFIG_WL1271_SDIO=m
+CONFIG_WL1271_SPI=m
+
+CONFIG_RTL8192CE=m
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+# CONFIG_IBMOL is not set
+# CONFIG_3C359 is not set
+# Broken with gcc4.1
+# CONFIG_TMS380TR is not set
+# CONFIG_TMSPCI is not set
+# CONFIG_ABYSS is not set
+# CONFIG_IBMLS is not set
+# CONFIG_PCMCIA_IBMTR is not set
+
+
+CONFIG_NET_FC=y
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=m
+CONFIG_PCMCIA_3C574=m
+CONFIG_PCMCIA_FMVJ18X=m
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PCMCIA_NMCLAN=m
+CONFIG_PCMCIA_SMC91C92=m
+CONFIG_PCMCIA_XIRC2PS=m
+CONFIG_PCMCIA_AXNET=m
+
+#
+# Amateur Radio support
+#
+CONFIG_HAMRADIO=y
+CONFIG_AX25=m
+CONFIG_AX25_DAMA_SLAVE=y
+CONFIG_CAN=m
+CONFIG_CAN_RAW=m
+CONFIG_CAN_BCM=m
+CONFIG_CAN_VCAN=m
+CONFIG_CAN_DEV=m
+CONFIG_CAN_CALC_BITTIMING=y
+CONFIG_CAN_SJA1000=m
+CONFIG_CAN_SJA1000_ISA=m
+CONFIG_CAN_SJA1000_PLATFORM=m
+CONFIG_CAN_EMS_PCI=m
+CONFIG_CAN_EMS_USB=m
+CONFIG_CAN_ESD_USB2=m
+CONFIG_CAN_KVASER_PCI=m
+CONFIG_CAN_PLX_PCI=m
+CONFIG_CAN_TSCAN1=m
+CONFIG_CAN_SLCAN=m
+CONFIG_CAN_SOFTING=m
+CONFIG_CAN_SOFTING_CS=m
+# CONFIG_PCH_CAN is not set
+CONFIG_NETROM=m
+CONFIG_ROSE=m
+CONFIG_MKISS=m
+CONFIG_6PACK=m
+CONFIG_BPQETHER=m
+CONFIG_SCC=m
+CONFIG_DMASCC=m
+# CONFIG_SCC_DELAY is not set
+CONFIG_SCC_TRXECHO=y
+CONFIG_BAYCOM_SER_FDX=m
+CONFIG_BAYCOM_SER_HDX=m
+CONFIG_BAYCOM_PAR=m
+CONFIG_BAYCOM_EPP=m
+CONFIG_YAM=m
+
+#
+# IrDA (infrared) support
+#
+CONFIG_IRDA=m
+# CONFIG_IRDA_DEBUG is not set
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+CONFIG_IRCOMM=m
+# CONFIG_IRDA_ULTRA is not set
+CONFIG_IRDA_CACHE_LAST_LSAP=y
+CONFIG_IRDA_FAST_RR=y
+CONFIG_IRTTY_SIR=m
+CONFIG_DONGLE=y
+CONFIG_ACTISYS_DONGLE=m
+CONFIG_ACT200L_DONGLE=m
+CONFIG_ESI_DONGLE=m
+CONFIG_GIRBIL_DONGLE=m
+CONFIG_KINGSUN_DONGLE=m
+CONFIG_KSDAZZLE_DONGLE=m
+CONFIG_KS959_DONGLE=m
+CONFIG_LITELINK_DONGLE=m
+CONFIG_MA600_DONGLE=m
+CONFIG_MCP2120_DONGLE=m
+CONFIG_OLD_BELKIN_DONGLE=m
+CONFIG_TEKRAM_DONGLE=m
+CONFIG_TOIM3232_DONGLE=m
+
+CONFIG_ALI_FIR=m
+CONFIG_MCS_FIR=m
+CONFIG_NSC_FIR=m
+CONFIG_SIGMATEL_FIR=m
+CONFIG_SMC_IRCC_FIR=m
+# CONFIG_TOSHIBA_FIR is not set
+CONFIG_USB_IRDA=m
+CONFIG_VLSI_FIR=m
+CONFIG_VIA_FIR=m
+CONFIG_WINBOND_FIR=m
+
+#
+# Bluetooth support
+#
+CONFIG_BT=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_L2CAP_EXT_FEATURES=y
+CONFIG_BT_SCO=m
+CONFIG_BT_CMTP=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_HCIBTUSB=m
+# Disable the BT_HCIUSB driver.
+# It sucks more power than BT_HCIBTUSB which has the same functionality.
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_ATH3K=y
+CONFIG_BT_HCIDTL1=m
+CONFIG_BT_HCIBT3C=m
+CONFIG_BT_HCIBLUECARD=m
+CONFIG_BT_HCIBTUART=m
+CONFIG_BT_HCIVHCI=m
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBFUSB=m
+CONFIG_BT_HCIBPA10X=m
+CONFIG_BT_HCIBTSDIO=m
+CONFIG_BT_HCIUART_LL=y
+CONFIG_BT_MRVL=m
+CONFIG_BT_MRVL_SDIO=m
+CONFIG_BT_ATH3K=m
+
+#
+# ISDN subsystem
+#
+CONFIG_ISDN=y
+CONFIG_MISDN=m
+CONFIG_MISDN_DSP=m
+CONFIG_MISDN_L1OIP=m
+CONFIG_MISDN_AVMFRITZ=m
+CONFIG_MISDN_SPEEDFAX=m
+CONFIG_MISDN_INFINEON=m
+CONFIG_MISDN_W6692=m
+CONFIG_MISDN_NETJET=m
+
+#
+# mISDN hardware drivers
+#
+CONFIG_MISDN_HFCPCI=m
+CONFIG_MISDN_HFCMULTI=m
+CONFIG_ISDN_I4L=m
+CONFIG_ISDN_DRV_AVMB1_B1PCI=m
+CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m
+CONFIG_ISDN_DRV_AVMB1_T1PCI=m
+CONFIG_ISDN_DRV_AVMB1_C4=m
+
+CONFIG_MISDN_HFCUSB=m
+
+CONFIG_ISDN_PPP=y
+CONFIG_ISDN_PPP_VJ=y
+CONFIG_ISDN_MPP=y
+# CONFIG_ISDN_PPP_BSDCOMP is not set
+CONFIG_ISDN_TTY_FAX=y
+CONFIG_DE_AOC=y
+
+CONFIG_ISDN_AUDIO=y
+
+CONFIG_ISDN_DRV_HISAX=m
+CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y
+CONFIG_ISDN_DRV_AVMB1_AVM_CS=m
+
+CONFIG_ISDN_CAPI_CAPIDRV=m
+CONFIG_ISDN_DIVERSION=m
+
+CONFIG_HISAX_EURO=y
+CONFIG_HISAX_1TR6=y
+CONFIG_HISAX_NI1=y
+CONFIG_HISAX_MAX_CARDS=8
+CONFIG_HISAX_16_3=y
+CONFIG_HISAX_TELESPCI=y
+CONFIG_HISAX_S0BOX=y
+CONFIG_HISAX_FRITZPCI=y
+CONFIG_HISAX_AVM_A1_PCMCIA=y
+CONFIG_HISAX_ELSA=y
+CONFIG_HISAX_DIEHLDIVA=y
+CONFIG_HISAX_SEDLBAUER=y
+CONFIG_HISAX_NETJET=y
+CONFIG_HISAX_NETJET_U=y
+CONFIG_HISAX_NICCY=y
+CONFIG_HISAX_BKM_A4T=y
+CONFIG_HISAX_SCT_QUADRO=y
+CONFIG_HISAX_GAZEL=y
+CONFIG_HISAX_HFC_PCI=y
+CONFIG_HISAX_W6692=y
+CONFIG_HISAX_HFC_SX=y
+CONFIG_HISAX_ENTERNOW_PCI=y
+# CONFIG_HISAX_DEBUG is not set
+CONFIG_HISAX_AVM_A1_CS=m
+CONFIG_HISAX_ST5481=m
+# CONFIG_HISAX_HFCUSB is not set
+CONFIG_HISAX_FRITZ_PCIPNP=m
+CONFIG_HISAX_NO_SENDCOMPLETE=y
+CONFIG_HISAX_NO_LLC=y
+CONFIG_HISAX_NO_KEYPAD=y
+CONFIG_HISAX_SEDLBAUER_CS=m
+CONFIG_HISAX_ELSA_CS=m
+CONFIG_HISAX_TELES_CS=m
+CONFIG_HISAX_HFC4S8S=m
+
+CONFIG_ISDN_DRV_LOOP=m
+CONFIG_HYSDN=m
+CONFIG_HYSDN_CAPI=y
+
+
+#
+# CAPI subsystem
+#
+CONFIG_ISDN_CAPI=m
+# CONFIG_CAPI_TRACE is not set
+CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y
+CONFIG_ISDN_CAPI_MIDDLEWARE=y
+CONFIG_ISDN_CAPI_CAPI20=m
+CONFIG_ISDN_CAPI_CAPIFS_BOOL=y
+CONFIG_ISDN_CAPI_CAPIFS=m
+
+#
+# CAPI hardware drivers
+#
+
+#
+# Active AVM cards
+#
+CONFIG_CAPI_AVM=y
+
+#
+# Active Eicon DIVA Server cards
+#
+# CONFIG_CAPI_EICON is not set
+CONFIG_ISDN_DIVAS=m
+CONFIG_ISDN_DIVAS_BRIPCI=y
+CONFIG_ISDN_DIVAS_PRIPCI=y
+CONFIG_ISDN_DIVAS_DIVACAPI=m
+CONFIG_ISDN_DIVAS_USERIDI=m
+CONFIG_ISDN_DIVAS_MAINT=m
+
+CONFIG_ISDN_DRV_GIGASET=m
+CONFIG_GIGASET_CAPI=y
+CONFIG_GIGASET_BASE=m
+CONFIG_GIGASET_M101=m
+CONFIG_GIGASET_M105=m
+# CONFIG_GIGASET_DEBUG is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_FF_MEMLESS=m
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+CONFIG_INPUT_JOYDEV=m
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+CONFIG_INPUT_TABLET=y
+CONFIG_TABLET_USB_ACECAD=m
+CONFIG_TABLET_USB_AIPTEK=m
+CONFIG_TABLET_USB_GTCO=m
+CONFIG_TABLET_USB_HANWANG=m
+CONFIG_TABLET_USB_KBTAB=m
+CONFIG_TABLET_USB_WACOM=m
+
+CONFIG_INPUT_POWERMATE=m
+CONFIG_INPUT_YEALINK=m
+CONFIG_INPUT_CM109=m
+CONFIG_INPUT_POLLDEV=m
+CONFIG_INPUT_SPARSEKMAP=m
+# CONFIG_INPUT_ADXL34X is not set
+CONFIG_INPUT_CMA3000=m
+CONFIG_INPUT_CMA3000_I2C=m
+
+#
+# Input I/O drivers
+#
+CONFIG_GAMEPORT=m
+CONFIG_GAMEPORT_NS558=m
+CONFIG_GAMEPORT_L4=m
+CONFIG_GAMEPORT_EMU10K1=m
+CONFIG_GAMEPORT_FM801=m
+CONFIG_SERIO=y
+CONFIG_SERIO_I8042=y
+CONFIG_SERIO_SERPORT=y
+CONFIG_SERIO_RAW=m
+CONFIG_SERIO_ALTERA_PS2=m
+# CONFIG_SERIO_PS2MULT is not set
+
+# CONFIG_SERIO_CT82C710 is not set
+# CONFIG_SERIO_PARKBD is not set
+# CONFIG_SERIO_PCIPS2 is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_MATRIX is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_LM8323 is not set
+# FIXME: Do we really need these keyboards enabled ?
+CONFIG_KEYBOARD_ADP5588=m
+CONFIG_KEYBOARD_MAX7359=m
+# CONFIG_KEYBOARD_MCS is not set
+CONFIG_KEYBOARD_OPENCORES=m
+CONFIG_KEYBOARD_QT2160=m
+# CONFIG_KEYBOARD_TCA6416 is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
+CONFIG_MOUSE_PS2_ELANTECH=y
+CONFIG_MOUSE_PS2_SENTELIC=y
+CONFIG_MOUSE_SERIAL=m
+CONFIG_MOUSE_VSXXXAA=m
+CONFIG_MOUSE_APPLETOUCH=m
+CONFIG_MOUSE_BCM5974=m
+CONFIG_MOUSE_SYNAPTICS_I2C=m
+CONFIG_INPUT_JOYSTICK=y
+CONFIG_JOYSTICK_ANALOG=m
+CONFIG_JOYSTICK_A3D=m
+CONFIG_JOYSTICK_ADI=m
+CONFIG_JOYSTICK_COBRA=m
+CONFIG_JOYSTICK_GF2K=m
+CONFIG_JOYSTICK_GRIP=m
+CONFIG_JOYSTICK_GRIP_MP=m
+CONFIG_JOYSTICK_GUILLEMOT=m
+CONFIG_JOYSTICK_INTERACT=m
+CONFIG_JOYSTICK_SIDEWINDER=m
+CONFIG_JOYSTICK_TMDC=m
+CONFIG_JOYSTICK_IFORCE=m
+CONFIG_JOYSTICK_IFORCE_USB=y
+CONFIG_JOYSTICK_IFORCE_232=y
+CONFIG_JOYSTICK_WARRIOR=m
+CONFIG_JOYSTICK_MAGELLAN=m
+CONFIG_JOYSTICK_SPACEORB=m
+CONFIG_JOYSTICK_SPACEBALL=m
+CONFIG_JOYSTICK_STINGER=m
+CONFIG_JOYSTICK_DB9=m
+CONFIG_JOYSTICK_GAMECON=m
+CONFIG_JOYSTICK_TURBOGRAFX=m
+CONFIG_JOYSTICK_JOYDUMP=m
+CONFIG_JOYSTICK_TWIDJOY=m
+CONFIG_JOYSTICK_WALKERA0701=m
+CONFIG_JOYSTICK_XPAD=m
+CONFIG_JOYSTICK_XPAD_FF=y
+CONFIG_JOYSTICK_XPAD_LEDS=y
+CONFIG_JOYSTICK_ZHENHUA=m
+# CONFIG_JOYSTICK_AS5011 is not set
+
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_AD7879 is not set
+CONFIG_TOUCHSCREEN_AD7879_I2C=m
+# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
+CONFIG_TOUCHSCREEN_DYNAPRO=m
+CONFIG_TOUCHSCREEN_EETI=m
+CONFIG_TOUCHSCREEN_ELO=m
+CONFIG_TOUCHSCREEN_FUJITSU=m
+CONFIG_TOUCHSCREEN_GUNZE=m
+# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set
+CONFIG_TOUCHSCREEN_HTCPEN=m
+CONFIG_TOUCHSCREEN_INEXIO=m
+CONFIG_TOUCHSCREEN_MTOUCH=m
+CONFIG_TOUCHSCREEN_MCS5000=m
+CONFIG_TOUCHSCREEN_MK712=m
+# CONFIG_TOUCHSCREEN_QT602240 is not set
+CONFIG_TOUCHSCREEN_PENMOUNT=m
+# CONFIG_TOUCHSCREEN_TPS6507X is not set
+CONFIG_TOUCHSCREEN_TSC2007=m
+CONFIG_TOUCHSCREEN_TOUCHIT213=m
+CONFIG_TOUCHSCREEN_TOUCHRIGHT=m
+CONFIG_TOUCHSCREEN_TOUCHWIN=m
+CONFIG_TOUCHSCREEN_UCB1400=m
+CONFIG_TOUCHSCREEN_WACOM_W8001=m
+CONFIG_TOUCHSCREEN_USB_E2I=y
+CONFIG_TOUCHSCREEN_USB_COMPOSITE=m
+# CONFIG_TOUCHSCREEN_WM97XX is not set
+CONFIG_TOUCHSCREEN_W90X900=m
+# CONFIG_TOUCHSCREEN_BU21013 is not set
+CONFIG_TOUCHSCREEN_ST1232=m
+
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_PCSPKR=m
+CONFIG_INPUT_UINPUT=m
+CONFIG_INPUT_WISTRON_BTNS=m
+CONFIG_INPUT_ATLAS_BTNS=m
+
+CONFIG_INPUT_ATI_REMOTE=m
+CONFIG_INPUT_ATI_REMOTE2=m
+CONFIG_INPUT_KEYSPAN_REMOTE=m
+
+CONFIG_MAC_EMUMOUSEBTN=y
+
+CONFIG_INPUT_WM831X_ON=m
+
+CONFIG_INPUT_APPLEIR=m
+
+# CONFIG_INPUT_AD714X is not set
+# CONFIG_INPUT_PCF8574 is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+CONFIG_VT_HW_CONSOLE_BINDING=y
+CONFIG_SERIAL_NONSTANDARD=y
+CONFIG_ROCKETPORT=m
+CONFIG_SYNCLINK=m
+CONFIG_SYNCLINKMP=m
+CONFIG_SYNCLINK_GT=m
+CONFIG_N_HDLC=m
+CONFIG_N_GSM=m
+# CONFIG_STALDRV is not set
+# CONFIG_IBM_ASM is not set
+CONFIG_TIFM_CORE=m
+CONFIG_TIFM_7XX1=m
+CONFIG_TCG_TPM=m
+CONFIG_TCG_TIS=m
+CONFIG_TCG_NSC=m
+CONFIG_TCG_ATMEL=m
+# CONFIG_TCG_INFINEON is not set
+CONFIG_TELCLOCK=m
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_CS=m
+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 is not set
+CONFIG_SERIAL_8250_RSA=y
+# CONFIG_COMPUTONE is not set
+CONFIG_CYCLADES=m
+# CONFIG_CYZ_INTR is not set
+# CONFIG_DIGIEPCA is not set
+# CONFIG_MOXA_INTELLIO is not set
+# CONFIG_MOXA_SMARTIO is not set
+# CONFIG_ISI is not set
+# CONFIG_RISCOM8 is not set
+# CONFIG_SPECIALIX is not set
+# CONFIG_SX is not set
+# CONFIG_RIO is not set
+# CONFIG_STALLION is not set
+# CONFIG_ISTALLION is not set
+CONFIG_SERIAL_JSM=m
+# CONFIG_SERIAL_MFD_HSU is not set
+
+# CONFIG_SERIAL_ALTERA_JTAGUART is not set
+# CONFIG_SERIAL_ALTERA_UART is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_TIMBERDALE is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_PRINTER=m
+CONFIG_LP_CONSOLE=y
+CONFIG_PPDEV=m
+
+#
+# I2C support
+#
+CONFIG_I2C=m
+CONFIG_I2C_COMPAT=y
+CONFIG_I2C_CHARDEV=m
+# CONFIG_I2C_MUX is not set
+# CONFIG_I2C_MUX_PCA954x is not set
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_DEBUG_ALGO is not set
+CONFIG_I2C_HELPER_AUTO=y
+CONFIG_I2C_ALGOBIT=m
+CONFIG_I2C_ALGOPCF=m
+
+#
+# I2C Hardware Bus support
+#
+
+CONFIG_I2C_ALGOPCA=m
+# 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_AMD756_S4882 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+# CONFIG_I2C_DEBUG_CHIP is not set
+# CONFIG_I2C_ELEKTOR is not set
+# CONFIG_I2C_I801 is not set
+# CONFIG_I2C_ISCH is not set
+# CONFIG_I2C_NFORCE2_S4985 is not set
+# CONFIG_I2C_INTEL_MID is not set
+# CONFIG_I2C_EG20T is not set
+
+CONFIG_EEPROM_AT24=m
+CONFIG_EEPROM_LEGACY=m
+CONFIG_EEPROM_93CX6=m
+CONFIG_EEPROM_MAX6875=m
+
+CONFIG_I2C_NFORCE2=m
+# CONFIG_I2C_OCORES is not set
+CONFIG_I2C_PARPORT=m
+CONFIG_I2C_PARPORT_LIGHT=m
+CONFIG_I2C_PASEMI=m
+CONFIG_I2C_PCA_ISA=m
+CONFIG_I2C_PCA_PLATFORM=m
+# CONFIG_I2C_PIIX4 is not set
+# CONFIG_SCx200_ACB is not set
+# CONFIG_I2C_SIS5595 is not set
+# CONFIG_I2C_SIS630 is not set
+# CONFIG_I2C_SIS96X is not set
+CONFIG_I2C_SIMTEC=m
+CONFIG_I2C_STUB=m
+CONFIG_I2C_TINY_USB=m
+# CONFIG_I2C_TAOS_EVM is not set
+# CONFIG_I2C_VIA is not set
+# CONFIG_I2C_VIAPRO is not set
+# CONFIG_I2C_DESIGNWARE is not set
+# CONFIG_I2C_XILINX is not set
+
+#
+# I2C Hardware Sensors Chip support
+#
+CONFIG_SENSORS_ATK0110=m
+CONFIG_SENSORS_ABITUGURU=m
+CONFIG_SENSORS_ABITUGURU3=m
+CONFIG_SENSORS_AD7414=m
+CONFIG_SENSORS_AD7418=m
+CONFIG_SENSORS_ADM1021=m
+CONFIG_SENSORS_ADM1025=m
+CONFIG_SENSORS_ADM1026=m
+CONFIG_SENSORS_ADM1029=m
+CONFIG_SENSORS_ADM1031=m
+CONFIG_SENSORS_ADM9240=m
+CONFIG_SENSORS_ADS7828=m
+CONFIG_SENSORS_ADT7462=m
+CONFIG_SENSORS_ADT7470=m
+CONFIG_SENSORS_ADT7473=m
+CONFIG_SENSORS_ADT7475=m
+CONFIG_SENSORS_APPLESMC=m
+CONFIG_SENSORS_ASB100=m
+CONFIG_SENSORS_ATXP1=m
+CONFIG_SENSORS_CORETEMP=m
+CONFIG_SENSORS_DME1737=m
+CONFIG_SENSORS_DS1621=m
+# CONFIG_DS1682 is not set
+CONFIG_SENSORS_F71805F=m
+CONFIG_SENSORS_F71882FG=m
+CONFIG_SENSORS_F75375S=m
+CONFIG_SENSORS_FSCHMD=m
+CONFIG_SENSORS_G760A=m
+CONFIG_SENSORS_GL518SM=m
+CONFIG_SENSORS_GL520SM=m
+CONFIG_SENSORS_HDAPS=m
+# CONFIG_SENSORS_I5K_AMB is not set
+# FIXME: IBMAEM x86 only?
+CONFIG_SENSORS_IBMAEM=m
+CONFIG_SENSORS_IBMPEX=m
+CONFIG_SENSORS_IT87=m
+CONFIG_SENSORS_K8TEMP=m
+CONFIG_SENSORS_K10TEMP=m
+CONFIG_SENSORS_LIS3LV02D=m
+CONFIG_SENSORS_LIS3_I2C=m
+CONFIG_SENSORS_LM63=m
+CONFIG_SENSORS_LM75=m
+CONFIG_SENSORS_LM77=m
+CONFIG_SENSORS_LM78=m
+CONFIG_SENSORS_LM80=m
+CONFIG_SENSORS_LM83=m
+CONFIG_SENSORS_LM85=m
+CONFIG_SENSORS_LM87=m
+CONFIG_SENSORS_LM90=m
+CONFIG_SENSORS_LM92=m
+CONFIG_SENSORS_LM93=m
+CONFIG_SENSORS_LTC4245=m
+CONFIG_SENSORS_MAX1619=m
+CONFIG_SENSORS_MAX6650=m
+CONFIG_SENSORS_PC87360=m
+CONFIG_SENSORS_PC87427=m
+CONFIG_SENSORS_PCF8591=m
+CONFIG_SENSORS_SHT15=m
+CONFIG_SENSORS_SIS5595=m
+CONFIG_SENSORS_SMSC47M1=m
+CONFIG_SENSORS_SMSC47M192=m
+CONFIG_SENSORS_SMSC47B397=m
+CONFIG_SENSORS_THMC50=m
+CONFIG_SENSORS_TMP401=m
+CONFIG_APDS9802ALS=m
+CONFIG_ISL29020=m
+CONFIG_ISL29003=m
+CONFIG_SENSORS_BH1770=m
+CONFIG_SENSORS_APDS990X=m
+CONFIG_SENSORS_TSL2550=m
+CONFIG_SENSORS_VIA686A=m
+CONFIG_SENSORS_VIA_CPUTEMP=m
+CONFIG_SENSORS_VT1211=m
+CONFIG_SENSORS_VT8231=m
+CONFIG_SENSORS_W83627HF=m
+CONFIG_SENSORS_W83781D=m
+CONFIG_SENSORS_W83L785TS=m
+CONFIG_SENSORS_W83L786NG=m
+CONFIG_SENSORS_W83627EHF=m
+CONFIG_SENSORS_W83791D=m
+CONFIG_SENSORS_W83792D=m
+CONFIG_SENSORS_W83793=m
+CONFIG_SENSORS_LTC4215=m
+CONFIG_SENSORS_LM95241=m
+CONFIG_SENSORS_TMP421=m
+CONFIG_SENSORS_WM8350=m
+CONFIG_SENSORS_WM831X=m
+CONFIG_SENSORS_LM73=m
+CONFIG_SENSORS_AMC6821=m
+CONFIG_SENSORS_ADT7411=m
+CONFIG_SENSORS_ASC7621=m
+CONFIG_SENSORS_EMC1403=m
+CONFIG_SENSORS_TMP102=m
+CONFIG_SENSORS_LTC4261=m
+# CONFIG_SENSORS_BH1780 is not set
+# CONFIG_SENSORS_JC42 is not set
+# CONFIG_SENSORS_SMM665 is not set
+# CONFIG_SENSORS_EMC2103 is not set
+# CONFIG_SENSORS_GPIO_FAN is not set
+CONFIG_SENSORS_W83795=m
+# CONFIG_SENSORS_W83795_FANCTRL is not set
+CONFIG_SENSORS_DS620=m
+CONFIG_SENSORS_SHT21=m
+
+# CONFIG_HMC6352 is not set
+# CONFIG_BMP085 is not set
+# CONFIG_PCH_PHUB is not set
+# CONFIG_SERIAL_PCH_UART is not set
+
+CONFIG_W1=m
+CONFIG_W1_CON=y
+# This is busted.
+# If we enable it, it steals Matrox cards, and the
+# framebuffer drivers stop working.
+# CONFIG_W1_MASTER_MATROX is not set
+CONFIG_W1_MASTER_DS2482=m
+CONFIG_W1_MASTER_DS2490=m
+CONFIG_W1_MASTER_DS1WM=m
+CONFIG_W1_SLAVE_THERM=m
+CONFIG_W1_SLAVE_SMEM=m
+CONFIG_W1_SLAVE_DS2431=m
+CONFIG_W1_SLAVE_DS2433=m
+CONFIG_W1_SLAVE_DS2433_CRC=y
+CONFIG_W1_SLAVE_DS2760=m
+CONFIG_W1_SLAVE_DS2423=m
+
+#
+# Mice
+#
+
+#
+# IPMI
+#
+CONFIG_IPMI_HANDLER=m
+# CONFIG_IPMI_PANIC_EVENT is not set
+CONFIG_IPMI_DEVICE_INTERFACE=m
+CONFIG_IPMI_WATCHDOG=m
+CONFIG_IPMI_SI=m
+CONFIG_IPMI_POWEROFF=m
+
+#
+# Watchdog Cards
+#
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+CONFIG_SOFT_WATCHDOG=m
+CONFIG_WDTPCI=m
+# CONFIG_ACQUIRE_WDT is not set
+# CONFIG_ADVANTECH_WDT is not set
+# CONFIG_EUROTECH_WDT is not set
+CONFIG_IB700_WDT=m
+# CONFIG_MIXCOMWD is not set
+# CONFIG_SCx200_WDT is not set
+# CONFIG_60XX_WDT is not set
+CONFIG_W83877F_WDT=m
+CONFIG_W83627HF_WDT=m
+CONFIG_MACHZ_WDT=m
+# CONFIG_SC520_WDT is not set
+CONFIG_ALIM7101_WDT=m
+CONFIG_ALIM1535_WDT=m
+CONFIG_ITCO_WDT=m
+CONFIG_ITCO_VENDOR_SUPPORT=y
+# CONFIG_SC1200_WDT is not set
+# CONFIG_PC87413_WDT is not set
+# CONFIG_WAFER_WDT is not set
+# CONFIG_CPU5_WDT is not set
+CONFIG_I6300ESB_WDT=m
+CONFIG_IT8712F_WDT=m
+# CONFIG_SBC8360_WDT is not set
+# CONFIG_SBC7240_WDT is not set
+CONFIG_SMSC_SCH311X_WDT=m
+CONFIG_W83977F_WDT=m
+CONFIG_PCIPCWATCHDOG=m
+CONFIG_USBPCWATCHDOG=m
+# CONFIG_SBC_EPX_C3_WATCHDOG is not set
+CONFIG_WM8350_WATCHDOG=m
+CONFIG_WM831X_WATCHDOG=m
+# CONFIG_MAX63XX_WATCHDOG is not set
+
+CONFIG_HW_RANDOM=y
+CONFIG_HW_RANDOM_TIMERIOMEM=m
+# CONFIG_NVRAM is not set
+# CONFIG_RTC is not set
+# CONFIG_RTC_DEBUG is not set
+# CONFIG_GEN_RTC is not set
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+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_CMOS=y
+CONFIG_RTC_DRV_DS1307=m
+CONFIG_RTC_DRV_DS1553=m
+CONFIG_RTC_DRV_DS1672=m
+CONFIG_RTC_DRV_DS1742=m
+CONFIG_RTC_DRV_DS1374=m
+# CONFIG_RTC_DRV_EP93XX is not set
+CONFIG_RTC_DRV_FM3130=m
+CONFIG_RTC_DRV_ISL1208=m
+CONFIG_RTC_DRV_M41T80=m
+CONFIG_RTC_DRV_M41T80_WDT=y
+CONFIG_RTC_DRV_M48T59=m
+CONFIG_RTC_DRV_MAX6900=m
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_PCF8563=m
+CONFIG_RTC_DRV_PCF8583=m
+CONFIG_RTC_DRV_RS5C372=m
+# CONFIG_RTC_DRV_SA1100 is not set
+# CONFIG_RTC_DRV_TEST is not set
+CONFIG_RTC_DRV_X1205=m
+CONFIG_RTC_DRV_V3020=m
+CONFIG_RTC_DRV_STK17TA8=m
+# CONFIG_RTC_DRV_S35390A is not set
+CONFIG_RTC_DRV_RX8581=m
+CONFIG_RTC_DRV_RX8025=m
+CONFIG_RTC_DRV_DS1286=m
+CONFIG_RTC_DRV_M48T35=m
+CONFIG_RTC_DRV_BQ4802=m
+CONFIG_RTC_DRV_WM8350=m
+# CONFIG_RTC_DRV_AB3100 is not set
+CONFIG_RTC_DRV_WM831X=m
+CONFIG_RTC_DRV_BQ32K=m
+CONFIG_RTC_DRV_MSM6242=m
+CONFIG_RTC_DRV_RP5C01=m
+
+CONFIG_DTLK=m
+CONFIG_R3964=m
+# CONFIG_APPLICOM is not set
+# CONFIG_SONYPI is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+CONFIG_AGP=y
+CONFIG_AGP_ALI=y
+CONFIG_AGP_ATI=y
+CONFIG_AGP_AMD=y
+CONFIG_AGP_AMD64=y
+CONFIG_AGP_INTEL=y
+CONFIG_AGP_NVIDIA=y
+CONFIG_AGP_SIS=y
+CONFIG_AGP_SWORKS=y
+CONFIG_AGP_VIA=y
+CONFIG_AGP_EFFICEON=y
+CONFIG_VGA_ARB=y
+CONFIG_VGA_ARB_MAX_GPUS=16
+CONFIG_STUB_POULSBO=m
+CONFIG_DRM=m
+CONFIG_DRM_TDFX=m
+CONFIG_DRM_R128=m
+CONFIG_DRM_RADEON=m
+CONFIG_DRM_RADEON_KMS=y
+CONFIG_DRM_I810=m
+# CONFIG_DRM_I830 is not set
+CONFIG_DRM_MGA=m
+CONFIG_DRM_SIS=m
+CONFIG_DRM_SAVAGE=m
+CONFIG_DRM_I915=m
+CONFIG_DRM_I915_KMS=y
+CONFIG_DRM_VIA=m
+CONFIG_DRM_NOUVEAU=m
+CONFIG_DRM_NOUVEAU_BACKLIGHT=y
+CONFIG_DRM_NOUVEAU_DEBUG=y
+CONFIG_DRM_I2C_CH7006=m
+CONFIG_DRM_I2C_SIL164=m
+CONFIG_DRM_VMWGFX=m
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+
+CONFIG_CARDMAN_4000=m
+CONFIG_CARDMAN_4040=m
+
+CONFIG_MWAVE=m
+CONFIG_RAW_DRIVER=y
+CONFIG_MAX_RAW_DEVS=8192
+CONFIG_HANGCHECK_TIMER=m
+
+#
+# Multimedia devices
+#
+CONFIG_MEDIA_SUPPORT=m
+CONFIG_VIDEO_DEV=m
+# CONFIG_VIDEO_ADV_DEBUG is not set
+CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
+CONFIG_VIDEO_ALLOW_V4L1=y
+CONFIG_VIDEO_V4L1_COMPAT=y
+CONFIG_VIDEO_V4L2=y
+# CONFIG_VIDEO_VIVI is not set
+
+#
+# Video For Linux
+#
+
+#
+# Video Adapters
+#
+CONFIG_V4L_USB_DRIVERS=y
+CONFIG_VIDEO_CAPTURE_DRIVERS=y
+CONFIG_VIDEO_AU0828=m
+CONFIG_VIDEO_BT848=m
+CONFIG_VIDEO_BT848_DVB=y
+CONFIG_VIDEO_BWQCAM=m
+CONFIG_VIDEO_SR030PC30=m
+CONFIG_VIDEO_CAFE_CCIC=m
+# CONFIG_VIDEO_CPIA is not set
+CONFIG_VIDEO_CPIA2=m
+CONFIG_VIDEO_CQCAM=m
+CONFIG_VIDEO_CX23885=m
+CONFIG_VIDEO_CX18=m
+CONFIG_VIDEO_CX18_ALSA=m
+CONFIG_VIDEO_CX88=m
+CONFIG_VIDEO_CX88_DVB=m
+CONFIG_VIDEO_CX88_ALSA=m
+CONFIG_VIDEO_CX88_BLACKBIRD=m
+CONFIG_VIDEO_CX88_VP3054=m
+CONFIG_VIDEO_EM28XX=m
+CONFIG_VIDEO_EM28XX_ALSA=m
+CONFIG_VIDEO_EM28XX_DVB=m
+CONFIG_VIDEO_CX231XX=m
+CONFIG_VIDEO_CX231XX_ALSA=m
+CONFIG_VIDEO_CX231XX_DVB=m
+CONFIG_VIDEO_CX231XX_RC=y
+CONFIG_VIDEO_HEXIUM_ORION=m
+CONFIG_VIDEO_HEXIUM_GEMINI=m
+CONFIG_VIDEO_IVTV=m
+CONFIG_VIDEO_MEYE=m
+CONFIG_VIDEO_MXB=m
+# CONFIG_VIDEO_OVCAMCHIP is not set
+CONFIG_VIDEO_PVRUSB2_DVB=y
+CONFIG_VIDEO_HDPVR=m
+CONFIG_VIDEO_SAA5246A=m
+CONFIG_VIDEO_SAA5249=m
+CONFIG_VIDEO_SAA6588=m
+CONFIG_VIDEO_SAA7134=m
+CONFIG_VIDEO_SAA7134_ALSA=m
+CONFIG_VIDEO_SAA7134_DVB=m
+CONFIG_VIDEO_SAA7134_RC=y
+CONFIG_VIDEO_STRADIS=m
+CONFIG_VIDEO_USBVISION=m
+CONFIG_VIDEO_W9966=m
+CONFIG_VIDEO_ZORAN=m
+CONFIG_VIDEO_ZORAN_AVS6EYES=m
+CONFIG_VIDEO_ZORAN_BUZ=m
+CONFIG_VIDEO_ZORAN_DC10=m
+CONFIG_VIDEO_ZORAN_DC30=m
+CONFIG_VIDEO_ZORAN_LML33=m
+CONFIG_VIDEO_ZORAN_LML33R10=m
+CONFIG_VIDEO_ZORAN_ZR36060=m
+CONFIG_VIDEO_FB_IVTV=m
+CONFIG_VIDEO_SAA7164=m
+CONFIG_VIDEO_TLG2300=m
+# CONFIG_VIDEO_TIMBERDALE is not set
+
+CONFIG_USB_VIDEO_CLASS=m
+CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
+
+#
+# Radio Adapters
+#
+CONFIG_RADIO_GEMTEK_PCI=m
+CONFIG_RADIO_MAXIRADIO=m
+CONFIG_RADIO_MAESTRO=m
+CONFIG_RADIO_WL1273=m
+
+CONFIG_MEDIA_ATTACH=y
+CONFIG_MEDIA_TUNER_CUSTOMISE=y
+CONFIG_MEDIA_TUNER_SIMPLE=m
+CONFIG_MEDIA_TUNER_TDA8290=m
+CONFIG_MEDIA_TUNER_TEA5761=m
+CONFIG_MEDIA_TUNER_TEA5767=m
+CONFIG_MEDIA_TUNER_MT20XX=m
+CONFIG_MEDIA_TUNER_MT2060=m
+CONFIG_MEDIA_TUNER_MT2266=m
+CONFIG_MEDIA_TUNER_MT2131=m
+CONFIG_MEDIA_TUNER_QT1010=m
+CONFIG_MEDIA_TUNER_XC2028=m
+CONFIG_MEDIA_TUNER_XC5000=m
+CONFIG_MEDIA_TUNER_MXL5005S=m
+CONFIG_MEDIA_TUNER_MXL5007T=m
+CONFIG_MEDIA_TUNER_MC44S803=m
+CONFIG_MEDIA_TUNER_MAX2165=m
+CONFIG_MEDIA_TUNER_TDA18218=m
+
+#
+# Digital Video Broadcasting Devices
+#
+CONFIG_DVB_CAPTURE_DRIVERS=y
+CONFIG_DVB_CORE=m
+CONFIG_DVB_MAX_ADAPTERS=8
+CONFIG_DVB_DYNAMIC_MINORS=y
+
+CONFIG_DVB_FE_CUSTOMISE=y
+CONFIG_DVB_STB0899=m
+CONFIG_DVB_STB6100=m
+CONFIG_DVB_STV090x=m
+CONFIG_DVB_STV6110x=m
+CONFIG_DVB_CX24110=m
+CONFIG_DVB_CX24123=m
+CONFIG_DVB_MT312=m
+CONFIG_DVB_ZL10036=m
+CONFIG_DVB_ZL10039=m
+CONFIG_DVB_S5H1420=m
+CONFIG_DVB_STV0288=m
+CONFIG_DVB_STB6000=m
+CONFIG_DVB_STV6110=m
+CONFIG_DVB_STV0900=m
+CONFIG_DVB_TDA8083=m
+CONFIG_DVB_TDA10086=m
+CONFIG_DVB_TDA8261=m
+CONFIG_DVB_VES1X93=m
+CONFIG_DVB_TUNER_ITD1000=m
+CONFIG_DVB_TUNER_CX24113=m
+CONFIG_DVB_TDA826X=m
+CONFIG_DVB_TUA6100=m
+CONFIG_DVB_CX24116=m
+CONFIG_DVB_SI21XX=m
+CONFIG_DVB_DS3000=m
+CONFIG_DVB_SP8870=m
+CONFIG_DVB_SP887X=m
+CONFIG_DVB_CX22700=m
+CONFIG_DVB_CX22702=m
+CONFIG_DVB_S5H1432=m
+CONFIG_DVB_IX2505V=m
+CONFIG_DVB_L64781=m
+CONFIG_DVB_NXT6000=m
+CONFIG_DVB_MT352=m
+CONFIG_DVB_DIB7000M=m
+CONFIG_DVB_DIB7000P=m
+CONFIG_DVB_TDA10048=m
+CONFIG_DVB_VES1820=m
+CONFIG_DVB_TDA10021=m
+CONFIG_DVB_TDA10023=m
+CONFIG_DVB_STV0297=m
+CONFIG_DVB_NXT200X=m
+CONFIG_DVB_OR51211=m
+CONFIG_DVB_OR51132=m
+CONFIG_DVB_BCM3510=m
+CONFIG_DVB_LGDT330X=m
+CONFIG_DVB_LGDT3305=m
+CONFIG_DVB_S5H1409=m
+CONFIG_DVB_AU8522=m
+CONFIG_DVB_S5H1411=m
+CONFIG_DVB_DIB8000=m
+CONFIG_DVB_TUNER_DIB0070=m
+CONFIG_DVB_TUNER_DIB0090=m
+CONFIG_DVB_LNBP21=m
+CONFIG_DVB_ISL6421=m
+CONFIG_DVB_ISL6423=m
+CONFIG_DVB_LGS8GXX=m
+CONFIG_DVB_ATBM8830=m
+CONFIG_DVB_TDA665x=m
+CONFIG_DVB_STV0299=m
+CONFIG_DVB_MB86A16=m
+
+#
+# Supported Frontend Modules
+#
+CONFIG_DVB_BT8XX=m
+CONFIG_DVB_BUDGET_CORE=m
+CONFIG_DVB_PLUTO2=m
+CONFIG_SMS_SIANO_MDTV=m
+CONFIG_SMS_USB_DRV=m
+CONFIG_SMS_SDIO_DRV=m
+CONFIG_DVB_TTUSB_DEC=m
+CONFIG_DVB_USB_DTV5100=m
+CONFIG_DVB_USB_AF9015=m
+CONFIG_DVB_USB_ANYSEE=m
+CONFIG_DVB_USB_DW2102=m
+CONFIG_DVB_USB_FRIIO=m
+CONFIG_DVB_USB_EC168=m
+CONFIG_DVB_DM1105=m
+CONFIG_DVB_DRX397XD=m
+CONFIG_DVB_LGDT3304=m
+CONFIG_DVB_S921=m
+CONFIG_DVB_ISL6405=m
+CONFIG_DVB_LGS8GL5=m
+CONFIG_DVB_DUMMY_FE=m
+CONFIG_DVB_FIREDTV=m
+CONFIG_DVB_NGENE=m
+CONFIG_DVB_MB86A20S=m
+
+#
+# Supported SAA7146 based PCI Adapters
+#
+CONFIG_DVB_AV7110=m
+CONFIG_DVB_AV7110_OSD=y
+CONFIG_DVB_BUDGET=m
+CONFIG_DVB_BUDGET_CI=m
+CONFIG_DVB_BUDGET_AV=m
+CONFIG_DVB_BUDGET_PATCH=m
+
+#
+# Supported USB Adapters
+#
+CONFIG_DVB_TTUSB_BUDGET=m
+
+#
+# Supported FlexCopII (B2C2) Adapters
+#
+CONFIG_DVB_USB_CINERGY_T2=m
+CONFIG_DVB_B2C2_FLEXCOP=m
+CONFIG_DVB_B2C2_FLEXCOP_PCI=m
+CONFIG_DVB_B2C2_FLEXCOP_USB=m
+# CONFIG_DVB_B2C2_FLEXCOP_DEBUG is not set
+CONFIG_DVB_USB=m
+# CONFIG_DVB_USB_DEBUG is not set
+CONFIG_DVB_USB_A800=m
+CONFIG_DVB_USB_AF9005=m
+CONFIG_DVB_USB_AF9005_REMOTE=m
+CONFIG_DVB_USB_AU6610=m
+CONFIG_DVB_USB_CXUSB=m
+CONFIG_DVB_USB_DIBUSB_MB=m
+# CONFIG_DVB_USB_DIBUSB_MB_FAULTY is not set
+CONFIG_DVB_USB_DIBUSB_MC=m
+CONFIG_DVB_USB_DIB0700=m
+CONFIG_DVB_USB_DIGITV=m
+CONFIG_DVB_USB_DTT200U=m
+CONFIG_DVB_USB_GL861=m
+CONFIG_DVB_USB_GP8PSK=m
+CONFIG_DVB_USB_M920X=m
+CONFIG_DVB_USB_NOVA_T_USB2=m
+CONFIG_DVB_USB_CE6230=m
+CONFIG_DVB_USB_OPERA1=m
+CONFIG_DVB_USB_TTUSB2=m
+CONFIG_DVB_USB_UMT_010=m
+CONFIG_DVB_USB_VP702X=m
+CONFIG_DVB_USB_VP7045=m
+CONFIG_DVB_USB_AZ6027=m
+CONFIG_DVB_USB_LME2510=m
+
+CONFIG_DVB_PT1=m
+
+CONFIG_MANTIS_CORE=m
+CONFIG_DVB_MANTIS=m
+CONFIG_DVB_HOPPER=m
+
+CONFIG_VIDEO_SAA7146=m
+CONFIG_VIDEO_SAA7146_VV=m
+CONFIG_VIDEO_TUNER=m
+CONFIG_VIDEO_BTCX=m
+CONFIG_VIDEO_PVRUSB2=m
+CONFIG_VIDEO_PVRUSB2_SYSFS=y
+# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set
+
+CONFIG_RC_CORE=m
+CONFIG_RC_LOOPBACK=m
+CONFIG_RC_MAP=m
+CONFIG_IR_NEC_DECODER=m
+CONFIG_IR_RC5_DECODER=m
+CONFIG_IR_RC6_DECODER=m
+CONFIG_IR_JVC_DECODER=m
+CONFIG_IR_SONY_DECODER=m
+CONFIG_IR_RC5_SZ_DECODER=m
+CONFIG_IR_LIRC_CODEC=m
+
+CONFIG_V4L_MEM2MEM_DRIVERS=y
+# CONFIG_VIDEO_MEM2MEM_TESTDEV is not set
+
+#
+# Broadcom Crystal HD video decoder driver
+#
+CONFIG_CRYSTALHD=m
+
+#
+# Graphics support
+#
+
+CONFIG_DISPLAY_SUPPORT=m
+CONFIG_VIDEO_OUTPUT_CONTROL=m
+
+CONFIG_FB=y
+# CONFIG_FB_FOREIGN_ENDIAN is not set
+CONFIG_FB_3DFX=m
+CONFIG_FB_3DFX_ACCEL=y
+CONFIG_FB_3DFX_I2C=y
+# CONFIG_FB_ARC is not set
+# CONFIG_FB_ARK is not set
+CONFIG_FB_ATY128=m
+CONFIG_FB_ATY=m
+CONFIG_FB_ATY_CT=y
+CONFIG_FB_ATY_GX=y
+CONFIG_FB_ATY_GENERIC_LCD=y
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_CARMINE is not set
+CONFIG_FB_CIRRUS=m
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_GEODE is not set
+# CONFIG_FB_HECUBA is not set
+# CONFIG_FB_HGA is not set
+CONFIG_FB_I810=m
+CONFIG_FB_I810_GTF=y
+CONFIG_FB_I810_I2C=y
+# CONFIG_FB_IMSTT is not set
+# CONFIG_FB_INTEL is not set
+# CONFIG_FB_INTEL_DEBUG is not set
+# CONFIG_FB_INTEL_I2C is not set
+CONFIG_FB_KYRO=m
+# CONFIG_FB_LE80578 is not set
+CONFIG_FB_MATROX=m
+CONFIG_FB_MATROX_MILLENIUM=y
+CONFIG_FB_MATROX_MYSTIQUE=y
+CONFIG_FB_MATROX_G=y
+CONFIG_FB_MATROX_I2C=m
+CONFIG_FB_MATROX_MAVEN=m
+CONFIG_FB_NEOMAGIC=m
+CONFIG_FB_NVIDIA=m
+# CONFIG_FB_NVIDIA_DEBUG is not set
+CONFIG_FB_NVIDIA_I2C=y
+# CONFIG_FB_PM2 is not set
+# CONFIG_FB_PM2_FIFO_DISCONNECT is not set
+# CONFIG_FB_PM3 is not set
+CONFIG_FB_RADEON=m
+# CONFIG_FB_RADEON_DEBUG is not set
+CONFIG_FB_RADEON_I2C=y
+CONFIG_FB_RIVA=m
+# CONFIG_FB_RIVA_DEBUG is not set
+# CONFIG_FB_RIVA_I2C is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_S3=m
+CONFIG_FB_SAVAGE=m
+CONFIG_FB_SAVAGE_I2C=y
+CONFIG_FB_SAVAGE_ACCEL=y
+# CONFIG_FB_SIS is not set
+CONFIG_FB_SIS_300=y
+CONFIG_FB_SIS_315=y
+CONFIG_FB_SM501=m
+CONFIG_FB_TILEBLITTING=y
+CONFIG_FB_TRIDENT=m
+# CONFIG_FB_UVESA is not set
+CONFIG_FB_VESA=y
+CONFIG_FB_VGA16=m
+CONFIG_FB_VIRTUAL=m
+CONFIG_FB_VOODOO1=m
+# CONFIG_FB_VT8623 is not set
+CONFIG_FB_EFI=y
+CONFIG_FB_VIA=m
+# CONFIG_FB_VIA_DIRECT_PROCFS is not set
+CONFIG_FB_METRONOME=m
+CONFIG_FB_MB862XX=m
+CONFIG_FB_MB862XX_PCI_GDC=y
+CONFIG_FB_MB862XX_LIME=y
+# CONFIG_FB_PRE_INIT_FB is not set
+# CONFIG_FB_TMIO is not set
+# CONFIG_FB_BROADSHEET is not set
+
+# CONFIG_FIRMWARE_EDID is not set
+
+#
+# Console display driver support
+#
+CONFIG_VGA_CONSOLE=y
+CONFIG_VGACON_SOFT_SCROLLBACK=y
+CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
+# CONFIG_FONTS is not set
+
+#
+# Logo configuration
+#
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+# CONFIG_LOGO_LINUX_CLUT224 is not set
+CONFIG_LOGO_LIBRE_CLUT224=y
+
+#
+# Sound
+#
+CONFIG_SOUND=m
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=y
+CONFIG_SOUND_OSS_CORE_PRECLAIM=y
+# CONFIG_SND_DEBUG_VERBOSE is not set
+CONFIG_SND_VERBOSE_PROCFS=y
+CONFIG_SND_SEQUENCER=y
+CONFIG_SND_HRTIMER=y
+CONFIG_SND_SEQ_HRTIMER_DEFAULT=y
+CONFIG_SND_SEQ_DUMMY=m
+CONFIG_SND_SEQUENCER_OSS=y
+CONFIG_SND_SEQ_RTCTIMER_DEFAULT=y
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=y
+CONFIG_SND_PCM_OSS=y
+CONFIG_SND_PCM_OSS_PLUGINS=y
+CONFIG_SND_RTCTIMER=y
+CONFIG_SND_DYNAMIC_MINORS=y
+# CONFIG_SND_SUPPORT_OLD_API is not set
+
+#
+# Generic devices
+#
+CONFIG_SND_DUMMY=m
+CONFIG_SND_ALOOP=m
+CONFIG_SND_VIRMIDI=m
+CONFIG_SND_MTPAV=m
+CONFIG_SND_MTS64=m
+CONFIG_SND_SERIAL_U16550=m
+CONFIG_SND_MPU401=m
+CONFIG_SND_PORTMAN2X4=m
+CONFIG_SND_AC97_POWER_SAVE=y
+CONFIG_SND_AC97_POWER_SAVE_DEFAULT=0
+
+CONFIG_SND_DRIVERS=y
+
+#
+# ISA devices
+#
+CONFIG_SND_AD1889=m
+# CONFIG_SND_WAVEFRONT is not set
+# CONFIG_SND_MSND_PINNACLE is not set
+# CONFIG_SND_MSND_CLASSIC is not set
+# CONFIG_SND_AZT1605 is not set
+# CONFIG_SND_AZT2316 is not set
+
+#
+# PCI devices
+#
+CONFIG_SND_PCI=y
+CONFIG_SND_ADLIB=m
+CONFIG_SND_ALI5451=m
+CONFIG_SND_ALS300=m
+CONFIG_SND_ALS4000=m
+CONFIG_SND_ATIIXP=m
+CONFIG_SND_ATIIXP_MODEM=m
+CONFIG_SND_AU8810=m
+CONFIG_SND_AU8820=m
+CONFIG_SND_AU8830=m
+# CONFIG_SND_AW2 is not set
+CONFIG_SND_AZT3328=m
+CONFIG_SND_BT87X=m
+# CONFIG_SND_BT87X_OVERCLOCK is not set
+CONFIG_SND_CA0106=m
+CONFIG_SND_CMIPCI=m
+CONFIG_SND_CS46XX=m
+CONFIG_SND_CS46XX_NEW_DSP=y
+CONFIG_SND_CS4281=m
+CONFIG_SND_CS5530=m
+CONFIG_SND_CS5535AUDIO=m
+CONFIG_SND_EMU10K1=m
+CONFIG_SND_EMU10K1X=m
+CONFIG_SND_ENS1370=m
+CONFIG_SND_ENS1371=m
+CONFIG_SND_ES1938=m
+CONFIG_SND_ES1968=m
+CONFIG_SND_ES1968_INPUT=y
+CONFIG_SND_FM801=m
+CONFIG_SND_FM801_TEA575X_BOOL=y
+CONFIG_SND_CTXFI=m
+CONFIG_SND_LX6464ES=m
+CONFIG_SND_HDA_INTEL=y
+CONFIG_SND_HDA_INPUT_BEEP=y
+CONFIG_SND_HDA_INPUT_BEEP_MODE=0
+CONFIG_SND_HDA_INPUT_JACK=y
+CONFIG_SND_HDA_PATCH_LOADER=y
+CONFIG_SND_HDA_HWDEP=y
+CONFIG_SND_HDA_CODEC_REALTEK=y
+CONFIG_SND_HDA_CODEC_CA0110=y
+CONFIG_SND_HDA_CODEC_ANALOG=y
+CONFIG_SND_HDA_CODEC_SIGMATEL=y
+CONFIG_SND_HDA_CODEC_VIA=y
+CONFIG_SND_HDA_CODEC_ATIHDMI=y
+CONFIG_SND_HDA_CODEC_CIRRUS=y
+CONFIG_SND_HDA_CODEC_CONEXANT=y
+CONFIG_SND_HDA_CODEC_CMEDIA=y
+CONFIG_SND_HDA_CODEC_INTELHDMI=y
+CONFIG_SND_HDA_CODEC_SI3054=y
+CONFIG_SND_HDA_CODEC_NVHDMI=y
+CONFIG_SND_HDA_CODEC_HDMI=y
+CONFIG_SND_HDA_GENERIC=y
+CONFIG_SND_HDA_POWER_SAVE=y
+CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0
+CONFIG_SND_HDA_RECONFIG=y
+CONFIG_SND_HDSPM=m
+CONFIG_SND_HIFIER=m
+CONFIG_SND_ICE1712=m
+CONFIG_SND_ICE1724=m
+CONFIG_SND_INTEL8X0=y
+CONFIG_SND_INTEL8X0M=m
+CONFIG_SND_KORG1212=m
+CONFIG_SND_MAESTRO3=m
+CONFIG_SND_MAESTRO3_INPUT=y
+CONFIG_SND_MIRO=m
+CONFIG_SND_MIXART=m
+CONFIG_SND_NM256=m
+CONFIG_SND_OXYGEN=m
+CONFIG_SND_RME32=m
+CONFIG_SND_PCSP=m
+CONFIG_SND_PCXHR=m
+CONFIG_SND_RIPTIDE=m
+CONFIG_SND_RME96=m
+CONFIG_SND_RME9652=m
+CONFIG_SND_SC6000=m
+CONFIG_SND_SIS7019=m
+CONFIG_SND_SONICVIBES=m
+CONFIG_SND_HDSP=m
+CONFIG_SND_TRIDENT=m
+CONFIG_SND_VIA82XX=m
+CONFIG_SND_VIA82XX_MODEM=m
+CONFIG_SND_VIRTUOSO=m
+CONFIG_SND_VX222=m
+CONFIG_SND_YMFPCI=m
+CONFIG_SND_ASIHPI=m
+
+#
+# ALSA USB devices
+#
+CONFIG_SND_USB=y
+CONFIG_SND_USB_AUDIO=m
+CONFIG_SND_USB_CAIAQ=m
+CONFIG_SND_USB_CAIAQ_INPUT=y
+CONFIG_SND_USB_USX2Y=m
+CONFIG_SND_USB_US122L=m
+CONFIG_SND_USB_UA101=m
+
+#
+# PCMCIA devices
+#
+CONFIG_SND_PCMCIA=y
+CONFIG_SND_VXPOCKET=m
+CONFIG_SND_PDAUDIOCF=m
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# USB support
+#
+CONFIG_USB=y
+CONFIG_USB_SUPPORT=y
+# CONFIG_USB_DEBUG is not set
+
+# DEPRECATED: See bug 362221. Fix udev.
+# CONFIG_USB_DEVICE_CLASS is not set
+
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_DYNAMIC_MINORS is not set
+CONFIG_USB_SUSPEND=y
+
+#
+# USB Host Controller Drivers
+#
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_EHCI_TT_NEWSCHED=y
+CONFIG_USB_OHCI_HCD=y
+# CONFIG_USB_OHCI_HCD_SSB is not set
+CONFIG_USB_UHCI_HCD=y
+# CONFIG_USB_SL811_CS is not set
+# CONFIG_USB_R8A66597_HCD is not set
+CONFIG_USB_XHCI_HCD=m
+# CONFIG_USB_XHCI_HCD_DEBUGGING is not set
+CONFIG_USB_ISP1362_HCD=m
+
+#
+# USB Device Class drivers
+#
+
+#
+# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem
+#
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+CONFIG_USB_WDM=m
+CONFIG_USB_TMC=m
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_USB_STORAGE=m
+# CONFIG_USB_STORAGE_DEBUG is not set
+CONFIG_USB_STORAGE_CYPRESS_ATACB=y
+CONFIG_USB_STORAGE_DATAFAB=y
+CONFIG_USB_STORAGE_FREECOM=y
+CONFIG_USB_STORAGE_ISD200=y
+CONFIG_USB_STORAGE_SDDR09=y
+CONFIG_USB_STORAGE_SDDR55=y
+CONFIG_USB_STORAGE_JUMPSHOT=y
+CONFIG_USB_STORAGE_USBAT=y
+CONFIG_USB_STORAGE_ONETOUCH=y
+CONFIG_USB_STORAGE_ALAUDA=y
+CONFIG_USB_STORAGE_KARMA=y
+# CONFIG_USB_LIBUSUAL is not set
+CONFIG_USB_UAS=m
+
+
+#
+# USB Human Interface Devices (HID)
+#
+CONFIG_USB_HID=y
+
+CONFIG_HID_SUPPORT=y
+
+CONFIG_HID=m
+# debugging default is y upstream now
+CONFIG_HIDRAW=y
+CONFIG_HID_PID=y
+CONFIG_LOGITECH_FF=y
+CONFIG_LOGIWII_FF=y
+CONFIG_LOGIRUMBLEPAD2_FF=y
+CONFIG_PANTHERLORD_FF=y
+CONFIG_THRUSTMASTER_FF=y
+CONFIG_HID_WACOM=m
+CONFIG_HID_WACOM_POWER_SUPPLY=y
+CONFIG_ZEROPLUS_FF=y
+CONFIG_USB_HIDDEV=y
+CONFIG_USB_IDMOUSE=m
+CONFIG_DRAGONRISE_FF=y
+CONFIG_GREENASIA_FF=y
+CONFIG_SMARTJOYPLUS_FF=y
+CONFIG_HID_3M_PCT=y
+CONFIG_LOGIG940_FF=y
+CONFIG_HID_MAGICMOUSE=y
+CONFIG_HID_MOSART=y
+CONFIG_HID_MULTITOUCH=m
+CONFIG_HID_NTRIG=y
+CONFIG_HID_QUANTA=y
+CONFIG_HID_STANTUM=y
+CONFIG_HID_CANDO=m
+CONFIG_HID_PRODIKEYS=m
+CONFIG_HID_DRAGONRISE=m
+CONFIG_HID_EGALAX=m
+CONFIG_HID_GYRATION=m
+CONFIG_HID_TWINHAN=m
+CONFIG_HID_ORTEK=m
+CONFIG_HID_PANTHERLORD=m
+CONFIG_HID_PETALYNX=m
+CONFIG_HID_PICOLCD=m
+CONFIG_HID_ROCCAT=m
+CONFIG_HID_ROCCAT_KONE=m
+CONFIG_HID_SAMSUNG=m
+CONFIG_HID_SONY=m
+CONFIG_HID_SUNPLUS=m
+CONFIG_HID_GREENASIA=m
+CONFIG_HID_SMARTJOYPLUS=m
+CONFIG_HID_TIVO_SLIDE=m
+CONFIG_HID_TOPSEED=m
+CONFIG_HID_THRUSTMASTER=m
+CONFIG_HID_ZEROPLUS=m
+CONFIG_HID_ZYDACRON=m
+CONFIG_HID_ACRUX=m
+CONFIG_HID_ACRUX_FF=m
+CONFIG_HID_EMS_FF=m
+CONFIG_HID_ELECOM=m
+CONFIG_HID_UCLOGIC=m
+CONFIG_HID_WALTOP=m
+CONFIG_HID_ROCCAT_PYRA=m
+CONFIG_HID_ROCCAT_KONEPLUS=m
+
+#
+# USB Imaging devices
+#
+CONFIG_USB_MDC800=m
+CONFIG_USB_MICROTEK=m
+
+#
+# USB Multimedia devices
+#
+CONFIG_DAB=y
+CONFIG_USB_DABUSB=m
+
+CONFIG_USB_VICAM=m
+CONFIG_USB_DSBR=m
+# CONFIG_USB_ET61X251 is not set
+CONFIG_USB_M5602=m
+CONFIG_USB_STV06XX=m
+CONFIG_USB_GSPCA=m
+CONFIG_USB_GSPCA_MR97310A=m
+CONFIG_USB_GSPCA_BENQ=m
+CONFIG_USB_GSPCA_CONEX=m
+CONFIG_USB_GSPCA_CPIA1=m
+CONFIG_USB_GSPCA_ETOMS=m
+CONFIG_USB_GSPCA_FINEPIX=m
+CONFIG_USB_GSPCA_MARS=m
+CONFIG_USB_GSPCA_OV519=m
+CONFIG_USB_GSPCA_OV534=m
+CONFIG_USB_GSPCA_OV534_9=m
+CONFIG_USB_GSPCA_PAC207=m
+CONFIG_USB_GSPCA_PAC7311=m
+CONFIG_USB_GSPCA_SN9C2028=m
+CONFIG_USB_GSPCA_SN9C20X=m
+CONFIG_USB_GSPCA_SN9C20X_EVDEV=y
+CONFIG_USB_GSPCA_SONIXB=m
+CONFIG_USB_GSPCA_SONIXJ=m
+CONFIG_USB_GSPCA_SPCA500=m
+CONFIG_USB_GSPCA_SPCA501=m
+CONFIG_USB_GSPCA_SPCA505=m
+CONFIG_USB_GSPCA_SPCA506=m
+CONFIG_USB_GSPCA_SPCA508=m
+CONFIG_USB_GSPCA_SPCA561=m
+CONFIG_USB_GSPCA_STK014=m
+CONFIG_USB_GSPCA_SUNPLUS=m
+CONFIG_USB_GSPCA_T613=m
+CONFIG_USB_GSPCA_TV8532=m
+CONFIG_USB_GSPCA_VC032X=m
+CONFIG_USB_GSPCA_ZC3XX=m
+CONFIG_USB_GSPCA_SQ905=m
+CONFIG_USB_GSPCA_SQ905C=m
+CONFIG_USB_GSPCA_PAC7302=m
+CONFIG_USB_GSPCA_STV0680=m
+CONFIG_USB_GL860=m
+CONFIG_USB_GSPCA_JEILINJ=m
+CONFIG_USB_GSPCA_KONICA=m
+CONFIG_USB_GSPCA_XIRLINK_CIT=m
+CONFIG_USB_GSPCA_SPCA1528=m
+CONFIG_USB_GSPCA_SQ930X=m
+
+CONFIG_USB_IBMCAM=m
+CONFIG_USB_KONICAWC=m
+# CONFIG_USB_OV511 is not set
+CONFIG_USB_S2255=m
+CONFIG_USB_SE401=m
+# CONFIG_VIDEO_SH_MOBILE_CEU is not set
+# CONFIG_VIDEO_SH_MOBILE_CSI2 is not set
+# CONFIG_USB_STV680 is not set
+# CONFIG_USB_SN9C102 is not set
+CONFIG_USB_ZR364XX=m
+CONFIG_SOC_CAMERA=m
+CONFIG_SOC_CAMERA_MT9M001=m
+CONFIG_SOC_CAMERA_MT9V022=m
+CONFIG_SOC_CAMERA_PLATFORM=m
+CONFIG_SOC_CAMERA_MT9M111=m
+CONFIG_SOC_CAMERA_MT9T031=m
+CONFIG_SOC_CAMERA_TW9910=m
+CONFIG_SOC_CAMERA_OV772X=m
+CONFIG_SOC_CAMERA_MT9T112=m
+CONFIG_SOC_CAMERA_RJ54N1=m
+CONFIG_SOC_CAMERA_OV9640=m
+CONFIG_SOC_CAMERA_OV6650=m
+CONFIG_SOC_CAMERA_IMX074=m
+CONFIG_SOC_CAMERA_OV2640=m
+
+#
+# USB Network adaptors
+#
+CONFIG_USB_CATC=m
+CONFIG_USB_HSO=m
+CONFIG_USB_KAWETH=m
+CONFIG_USB_PEGASUS=m
+CONFIG_USB_RTL8150=m
+CONFIG_USB_USBNET=m
+CONFIG_USB_SPEEDTOUCH=m
+CONFIG_USB_NET_AX8817X=m
+CONFIG_USB_NET_DM9601=m
+CONFIG_USB_NET_SMSC95XX=m
+CONFIG_USB_NET_GL620A=m
+CONFIG_USB_NET_NET1080=m
+CONFIG_USB_NET_PLUSB=m
+CONFIG_USB_NET_MCS7830=m
+CONFIG_USB_NET_RNDIS_HOST=m
+CONFIG_USB_NET_CDC_SUBSET=m
+CONFIG_USB_NET_CDC_EEM=m
+CONFIG_USB_NET_CDC_NCM=m
+CONFIG_USB_NET_ZAURUS=m
+CONFIG_USB_NET_CX82310_ETH=m
+CONFIG_USB_NET_INT51X1=m
+CONFIG_USB_CDC_PHONET=m
+CONFIG_USB_IPHETH=m
+CONFIG_USB_SIERRA_NET=m
+
+#
+# USB Host-to-Host Cables
+#
+CONFIG_USB_AN2720=y
+CONFIG_USB_BELKIN=y
+
+#
+# Intelligent USB Devices/Gadgets
+#
+CONFIG_USB_ARMLINUX=y
+CONFIG_USB_EPSON2888=y
+CONFIG_USB_KC2190=y
+
+# CONFIG_USB_MUSB_HDRC is not set
+
+#
+# USB port drivers
+#
+CONFIG_USB_USS720=m
+
+#
+# USB Serial Converter support
+#
+CONFIG_USB_SERIAL=m
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_AIRCABLE=m
+CONFIG_USB_SERIAL_ARK3116=m
+CONFIG_USB_SERIAL_BELKIN=m
+CONFIG_USB_SERIAL_CH341=m
+CONFIG_USB_SERIAL_CYPRESS_M8=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+CONFIG_USB_SERIAL_CP210X=m
+CONFIG_USB_SERIAL_QUALCOMM=m
+CONFIG_USB_SERIAL_SYMBOL=m
+CONFIG_USB_SERIAL_EDGEPORT=m
+CONFIG_USB_SERIAL_EDGEPORT_TI=m
+CONFIG_USB_SERIAL_EMPEG=m
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_FUNSOFT=m
+CONFIG_USB_SERIAL_GARMIN=m
+CONFIG_USB_SERIAL_HP4X=m
+CONFIG_USB_SERIAL_IPAQ=m
+CONFIG_USB_SERIAL_IPW=m
+CONFIG_USB_SERIAL_IR=m
+CONFIG_USB_SERIAL_IUU=m
+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
+CONFIG_USB_SERIAL_KEYSPAN=m
+CONFIG_USB_SERIAL_KEYSPAN_MPR=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19=y
+CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
+CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
+CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_MOS7720=m
+CONFIG_USB_SERIAL_MOS7715_PARPORT=y
+# CONFIG_USB_SERIAL_ZIO is not set
+CONFIG_USB_SERIAL_MOS7840=m
+CONFIG_USB_SERIAL_MOTOROLA=m
+CONFIG_USB_SERIAL_NAVMAN=m
+CONFIG_USB_SERIAL_OPTION=y
+CONFIG_USB_SERIAL_OTI6858=m
+CONFIG_USB_SERIAL_OPTICON=m
+CONFIG_USB_SERIAL_OMNINET=m
+CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_SAFE=m
+CONFIG_USB_SERIAL_SAFE_PADDED=y
+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
+CONFIG_USB_SERIAL_SIEMENS_MPI=m
+CONFIG_USB_SERIAL_SPCP8X5=m
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_VISOR=m
+CONFIG_USB_SERIAL_WHITEHEAT=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_QCAUX=m
+CONFIG_USB_SERIAL_VIVOPAY_SERIAL=m
+CONFIG_USB_SERIAL_DEBUG=m
+CONFIG_USB_SERIAL_SSU100=m
+CONFIG_USB_SERIAL_SAMBA=m
+
+CONFIG_USB_EZUSB=y
+CONFIG_USB_EMI62=m
+CONFIG_USB_LED=m
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+CONFIG_USB_G_SERIAL=m
+
+#
+# USB Miscellaneous drivers
+#
+
+CONFIG_USB_ADUTUX=m
+CONFIG_USB_SEVSEG=m
+CONFIG_USB_ALI_M5632=y
+CONFIG_USB_APPLEDISPLAY=m
+CONFIG_USB_ATM=m
+CONFIG_USB_BERRY_CHARGE=m
+CONFIG_USB_CXACRU=m
+# CONFIG_USB_C67X00_HCD is not set
+# CONFIG_USB_CYTHERM is not set
+CONFIG_USB_EMI26=m
+CONFIG_USB_ETH=m
+CONFIG_USB_FTDI_ELAN=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+# CONFIG_USB_GADGET is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGETFS is not set
+# CONFIG_USB_ISP116X_HCD is not set
+# CONFIG_USB_ISP1760_HCD is not set
+# CONFIG_USB_OXU210HP_HCD is not set
+CONFIG_USB_IOWARRIOR=m
+CONFIG_USB_ISIGHTFW=m
+CONFIG_USB_YUREX=m
+CONFIG_USB_VST=m
+CONFIG_USB_LCD=m
+CONFIG_USB_LD=m
+CONFIG_USB_LEGOTOWER=m
+CONFIG_USB_MON=y
+CONFIG_USB_PWC=m
+CONFIG_USB_PWC_INPUT_EVDEV=y
+# CONFIG_USB_PWC_DEBUG is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_QUICKCAM_MESSENGER is not set
+CONFIG_USB_SL811_HCD=m
+CONFIG_USB_SISUSBVGA=m
+CONFIG_USB_SISUSBVGA_CON=y
+CONFIG_RADIO_SI470X=y
+CONFIG_USB_SI470X=m
+CONFIG_I2C_SI470X=m
+CONFIG_RADIO_SI4713=m
+# CONFIG_RADIO_TEF6862 is not set
+CONFIG_USB_MR800=m
+CONFIG_USB_STKWEBCAM=m
+# CONFIG_USB_TEST is not set
+CONFIG_USB_TRANCEVIBRATOR=m
+CONFIG_USB_U132_HCD=m
+CONFIG_USB_UEAGLEATM=m
+CONFIG_USB_XUSBATM=m
+# CONFIG_USB_ZC0301 is not set
+CONFIG_USB_ZERO=m
+
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+
+# CONFIG_USB_OTG is not set
+
+#
+# Sonics Silicon Backplane
+#
+CONFIG_SSB=m
+CONFIG_SSB_PCIHOST=y
+CONFIG_SSB_SDIOHOST=y
+CONFIG_SSB_PCMCIAHOST=y
+# CONFIG_SSB_SILENT is not set
+# CONFIG_SSB_DEBUG is not set
+CONFIG_SSB_DRIVER_PCICORE=y
+
+# Multifunction USB devices
+# CONFIG_MFD_PCF50633 is not set
+CONFIG_PCF50633_ADC=m
+CONFIG_PCF50633_GPIO=m
+# CONFIG_AB3100_CORE is not set
+CONFIG_INPUT_PCF50633_PMU=m
+CONFIG_INPUT_GPIO_ROTARY_ENCODER=m
+CONFIG_CHARGER_PCF50633=m
+CONFIG_RTC_DRV_PCF50633=m
+CONFIG_RTC_DRV_DS3232=m
+CONFIG_RTC_DRV_ISL12022=m
+
+CONFIG_MFD_SUPPORT=y
+CONFIG_MFD_VX855=m
+CONFIG_MFD_SM501=m
+CONFIG_MFD_SM501_GPIO=y
+# CONFIG_MFD_TC6393XB is not set
+CONFIG_MFD_WM8400=m
+# CONFIG_MFD_WM8350_I2C is not set
+# CONFIG_MFD_WM8350 is not set
+# CONFIG_MFD_WM831X is not set
+# CONFIG_AB3100_OTP is not set
+# CONFIG_MFD_TIMBERDALE is not set
+# CONFIG_MFD_WM8994 is not set
+# CONFIG_MFD_88PM860X is not set
+# CONFIG_LPC_SCH is not set
+# CONFIG_HTC_I2CPLD is not set
+# CONFIG_MFD_MAX8925 is not set
+# CONFIG_MFD_ASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_TPS6507X is not set
+# CONFIG_ABX500_CORE is not set
+# CONFIG_MFD_RDC321X is not set
+# CONFIG_MFD_JANZ_CMODIO is not set
+# CONFIG_MFD_WM831X_I2C is not set
+CONFIG_MFD_CS5535=m
+
+#
+# File systems
+#
+CONFIG_MISC_FILESYSTEMS=y
+
+CONFIG_EXT2_FS=m
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+CONFIG_EXT2_FS_SECURITY=y
+CONFIG_EXT2_FS_XIP=y
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_DEFAULTS_TO_ORDERED=y
+CONFIG_EXT3_FS_XATTR=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+CONFIG_EXT3_FS_SECURITY=y
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_FS_XATTR=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXT4_FS_SECURITY=y
+CONFIG_JBD2=y
+CONFIG_FS_MBCACHE=y
+CONFIG_REISERFS_FS=m
+# CONFIG_REISERFS_CHECK is not set
+CONFIG_REISERFS_PROC_INFO=y
+CONFIG_REISERFS_FS_XATTR=y
+CONFIG_REISERFS_FS_POSIX_ACL=y
+CONFIG_REISERFS_FS_SECURITY=y
+CONFIG_JFS_FS=m
+# CONFIG_JFS_DEBUG is not set
+# CONFIG_JFS_STATISTICS is not set
+CONFIG_JFS_POSIX_ACL=y
+CONFIG_JFS_SECURITY=y
+CONFIG_XFS_FS=m
+# CONFIG_XFS_DEBUG is not set
+# CONFIG_XFS_RT is not set
+CONFIG_XFS_QUOTA=y
+CONFIG_XFS_POSIX_ACL=y
+CONFIG_MINIX_FS=m
+CONFIG_ROMFS_FS=m
+CONFIG_QUOTA=y
+CONFIG_QUOTA_NETLINK_INTERFACE=y
+# CONFIG_PRINT_QUOTA_WARNING is not set
+# CONFIG_QFMT_V1 is not set
+CONFIG_QFMT_V2=y
+CONFIG_QUOTACTL=y
+CONFIG_DNOTIFY=y
+# Autofsv3 is obsolete.
+# CONFIG_AUTOFS_FS is not set
+# systemd is dependant upon AUTOFS, so build it in.
+CONFIG_AUTOFS4_FS=y
+CONFIG_EXOFS_FS=m
+# CONFIG_EXOFS_DEBUG is not set
+CONFIG_NILFS2_FS=m
+CONFIG_LOGFS=m
+CONFIG_CEPH_FS=m
+CONFIG_BLK_DEV_RBD=m
+CONFIG_CEPH_LIB=m
+
+CONFIG_FSCACHE=m
+CONFIG_FSCACHE_STATS=y
+# CONFIG_FSCACHE_HISTOGRAM is not set
+# CONFIG_FSCACHE_DEBUG is not set
+CONFIG_FSCACHE_OBJECT_LIST=y
+
+CONFIG_CACHEFILES=m
+# CONFIG_CACHEFILES_DEBUG is not set
+# CONFIG_CACHEFILES_HISTOGRAM is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_UDF_FS=m
+
+#
+# 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="ascii"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_VMCORE=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_HUGETLBFS=y
+CONFIG_HUGETLB_PAGE=y
+CONFIG_DEBUG_FS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+CONFIG_AFFS_FS=m
+CONFIG_ECRYPT_FS=m
+CONFIG_HFS_FS=m
+CONFIG_HFSPLUS_FS=m
+CONFIG_BEFS_FS=m
+# CONFIG_BEFS_DEBUG is not set
+CONFIG_BFS_FS=m
+CONFIG_EFS_FS=m
+CONFIG_JFFS2_FS=m
+CONFIG_JFFS2_FS_DEBUG=0
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
+CONFIG_JFFS2_SUMMARY=y
+CONFIG_JFFS2_FS_XATTR=y
+CONFIG_JFFS2_FS_POSIX_ACL=y
+CONFIG_JFFS2_FS_SECURITY=y
+CONFIG_CRAMFS=m
+CONFIG_SQUASHFS=m
+CONFIG_SQUASHFS_XATTR=y
+CONFIG_SQUASHFS_LZO=y
+CONFIG_SQUASHFS_XZ=y
+# CONFIG_SQUASHFS_EMBEDDED is not set
+CONFIG_VXFS_FS=m
+# CONFIG_HPFS_FS is not set
+CONFIG_QNX4FS_FS=m
+CONFIG_SYSV_FS=m
+CONFIG_UFS_FS=m
+# CONFIG_UFS_FS_WRITE is not set
+# CONFIG_UFS_DEBUG is not set
+CONFIG_9P_FS=m
+CONFIG_9P_FSCACHE=y
+CONFIG_9P_FS_POSIX_ACL=y
+CONFIG_FUSE_FS=m
+CONFIG_OMFS_FS=m
+CONFIG_CUSE=m
+
+#
+# Network File Systems
+#
+CONFIG_NETWORK_FILESYSTEMS=y
+CONFIG_NFS_FS=m
+CONFIG_NFS_V3=y
+CONFIG_NFS_V3_ACL=y
+CONFIG_NFS_V4=y
+CONFIG_NFS_V4_1=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V3=y
+CONFIG_NFSD_V3_ACL=y
+CONFIG_NFSD_V4=y
+CONFIG_NFS_FSCACHE=y
+# CONFIG_NFS_USE_LEGACY_DNS is not set
+# CONFIG_NFS_USE_NEW_IDMAPPER is not set
+# CONFIG_NFSD_DEPRECATED is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=m
+CONFIG_SUNRPC=m
+CONFIG_SUNRPC_GSS=m
+CONFIG_SUNRPC_XPRT_RDMA=m
+CONFIG_RPCSEC_GSS_KRB5=m
+CONFIG_RPCSEC_GSS_SPKM3=m
+# CONFIG_SMB_FS is not set
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+CONFIG_CIFS_STATS=y
+# CONFIG_CIFS_STATS2 is not set
+CONFIG_CIFS_EXPERIMENTAL=y
+CONFIG_CIFS_UPCALL=y
+CONFIG_CIFS_XATTR=y
+CONFIG_CIFS_POSIX=y
+CONFIG_CIFS_FSCACHE=y
+CONFIG_CIFS_ACL=y
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_DEBUG2 is not set
+CONFIG_CIFS_DFS_UPCALL=y
+CONFIG_NCP_FS=m
+CONFIG_NCPFS_PACKET_SIGNING=y
+CONFIG_NCPFS_IOCTL_LOCKING=y
+CONFIG_NCPFS_STRONG=y
+CONFIG_NCPFS_NFS_NS=y
+CONFIG_NCPFS_OS2_NS=y
+CONFIG_NCPFS_SMALLDOS=y
+CONFIG_NCPFS_NLS=y
+CONFIG_NCPFS_EXTRAS=y
+CONFIG_CODA_FS=m
+# CONFIG_AFS_FS is not set
+# CONFIG_AF_RXRPC is not set
+
+CONFIG_OCFS2_FS=m
+# CONFIG_OCFS2_DEBUG_FS is not set
+# CONFIG_OCFS2_DEBUG_MASKLOG is not set
+CONFIG_OCFS2_FS_O2CB=m
+CONFIG_OCFS2_FS_USERSPACE_CLUSTER=m
+# CONFIG_OCFS2_FS_STATS is not set
+
+CONFIG_BTRFS_FS=m
+CONFIG_BTRFS_FS_POSIX_ACL=y
+
+CONFIG_CONFIGFS_FS=m
+
+CONFIG_DLM=m
+CONFIG_DLM_DEBUG=y
+CONFIG_GFS2_FS=m
+CONFIG_GFS2_FS_LOCKING_DLM=y
+
+CONFIG_UBIFS_FS=m
+CONFIG_UBIFS_FS_XATTR=y
+# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
+# CONFIG_UBIFS_FS_DEBUG is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+CONFIG_AMIGA_PARTITION=y
+# CONFIG_ATARI_PARTITION is not set
+CONFIG_BSD_DISKLABEL=y
+CONFIG_EFI_PARTITION=y
+CONFIG_KARMA_PARTITION=y
+# CONFIG_LDM_PARTITION is not set
+CONFIG_MAC_PARTITION=y
+CONFIG_MSDOS_PARTITION=y
+CONFIG_MINIX_SUBPARTITION=y
+CONFIG_OSF_PARTITION=y
+CONFIG_SGI_PARTITION=y
+CONFIG_SOLARIS_X86_PARTITION=y
+CONFIG_SUN_PARTITION=y
+# CONFIG_SYSV68_PARTITION is not set
+CONFIG_UNIXWARE_DISKLABEL=y
+# CONFIG_ULTRIX_PARTITION is not set
+
+CONFIG_NLS=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+CONFIG_NLS_CODEPAGE_855=m
+CONFIG_NLS_CODEPAGE_857=m
+CONFIG_NLS_CODEPAGE_860=m
+CONFIG_NLS_CODEPAGE_861=m
+CONFIG_NLS_CODEPAGE_862=m
+CONFIG_NLS_CODEPAGE_863=m
+CONFIG_NLS_CODEPAGE_864=m
+CONFIG_NLS_CODEPAGE_865=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_869=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_932=m
+CONFIG_NLS_CODEPAGE_949=m
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ISO8859_1=m
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_NLS_UTF8=m
+CONFIG_NLS_ASCII=y
+
+#
+# Profiling support
+#
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
+CONFIG_OPROFILE_EVENT_MULTIPLEX=y
+
+#
+# Kernel hacking
+#
+CONFIG_DEBUG_KERNEL=y
+CONFIG_FRAME_WARN=1024
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_INFO=y
+CONFIG_FRAME_POINTER=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+# CONFIG_DEBUG_DRIVER is not set
+CONFIG_HEADERS_CHECK=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_RCU_TRACE is not set
+# CONFIG_LKDTM is not set
+
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_LOCKDEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+
+CONFIG_KGDB=y
+CONFIG_KGDB_SERIAL_CONSOLE=y
+CONFIG_KGDB_TESTS=y
+CONFIG_KGDB_LOW_LEVEL_TRAP=y
+# CONFIG_KGDB_TESTS_ON_BOOT is not set
+
+#
+# Security options
+#
+CONFIG_SECURITY=y
+# CONFIG_SECURITY_DMESG_RESTRICT is not set
+CONFIG_SECURITY_NETWORK=y
+CONFIG_SECURITY_NETWORK_XFRM=y
+# CONFIG_SECURITY_PATH is not set
+CONFIG_SECURITY_SELINUX=y
+CONFIG_SECURITY_SELINUX_BOOTPARAM=y
+CONFIG_SECURITY_SELINUX_DISABLE=y
+CONFIG_SECURITY_SELINUX_DEVELOP=y
+CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1
+CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
+CONFIG_SECURITY_SELINUX_AVC_STATS=y
+# CONFIG_SECURITY_SMACK is not set
+# CONFIG_SECURITY_TOMOYO is not set
+# CONFIG_SECURITY_APPARMOR is not set
+CONFIG_AUDIT=y
+CONFIG_AUDITSYSCALL=y
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_FIPS=y
+CONFIG_CRYPTO_USER_API_HASH=y
+CONFIG_CRYPTO_USER_API_SKCIPHER=y
+CONFIG_CRYPTO_MANAGER_TESTS=y
+CONFIG_CRYPTO_HW=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_CRYPTD is not set
+CONFIG_CRYPTO_AES=y
+CONFIG_CRYPTO_ARC4=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_AUTHENC=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_CAMELLIA=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_CCM=m
+CONFIG_CRYPTO_CRC32C=y
+CONFIG_CRYPTO_CTR=y
+CONFIG_CRYPTO_CTS=m
+CONFIG_CRYPTO_DEFLATE=m
+CONFIG_CRYPTO_DES=m
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_FCRYPT=m
+CONFIG_CRYPTO_GCM=m
+CONFIG_CRYPTO_GF128MUL=m
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_LRW=m
+CONFIG_CRYPTO_LZO=m
+CONFIG_CRYPTO_MD4=m
+CONFIG_CRYPTO_MD5=m
+CONFIG_CRYPTO_MICHAEL_MIC=m
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_PCBC=m
+CONFIG_CRYPTO_RMD128=m
+CONFIG_CRYPTO_RMD160=m
+CONFIG_CRYPTO_RMD256=m
+CONFIG_CRYPTO_RMD320=m
+CONFIG_CRYPTO_SALSA20=m
+CONFIG_CRYPTO_SALSA20_586=m
+CONFIG_CRYPTO_SEED=m
+CONFIG_CRYPTO_SEQIV=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_SHA1=y
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_TGR192=m
+CONFIG_CRYPTO_TWOFISH=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_XCBC=m
+CONFIG_CRYPTO_VMAC=m
+CONFIG_CRYPTO_XTS=m
+CONFIG_CRYPTO_TEST=m
+CONFIG_LIBCRC32C=m
+CONFIG_CRYPTO_CRC32C_INTEL=m
+CONFIG_CRYPTO_GHASH=m
+CONFIG_CRYPTO_ANSI_CPRNG=m
+CONFIG_CRYPTO_DEV_HIFN_795X=m
+CONFIG_CRYPTO_DEV_HIFN_795X_RNG=y
+CONFIG_CRYPTO_PCRYPT=m
+
+# Random number generation
+
+#
+# Library routines
+#
+CONFIG_CRC16=y
+CONFIG_CRC32=m
+CONFIG_CRC_CCITT=m
+CONFIG_CRC_ITU_T=m
+CONFIG_CRC_T10DIF=m
+
+CONFIG_CRYPTO_ZLIB=m
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=m
+
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_KEYS=y
+CONFIG_TRUSTED_KEYS=m
+CONFIG_ENCRYPTED_KEYS=m
+CONFIG_KEYS_DEBUG_PROC_KEYS=y
+CONFIG_CDROM_PKTCDVD=m
+CONFIG_CDROM_PKTCDVD_BUFFERS=8
+# CONFIG_CDROM_PKTCDVD_WCACHE is not set
+
+CONFIG_ATA_OVER_ETH=m
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=m
+# CONFIG_BACKLIGHT_GENERIC is not set
+CONFIG_BACKLIGHT_PROGEAR=m
+# CONFIG_BACKLIGHT_ADP8860 is not set
+CONFIG_FB_NVIDIA_BACKLIGHT=y
+CONFIG_FB_RIVA_BACKLIGHT=y
+CONFIG_FB_RADEON_BACKLIGHT=y
+CONFIG_FB_ATY128_BACKLIGHT=y
+CONFIG_FB_ATY_BACKLIGHT=y
+# CONFIG_BACKLIGHT_SAHARA is not set
+CONFIG_BACKLIGHT_WM831X=m
+
+CONFIG_LCD_CLASS_DEVICE=m
+CONFIG_LCD_PLATFORM=m
+
+CONFIG_SCHEDSTATS=y
+CONFIG_SCHED_DEBUG=y
+CONFIG_FAIR_GROUP_SCHED=y
+CONFIG_SCHED_OMIT_FRAME_POINTER=y
+CONFIG_GROUP_SCHED=y
+CONFIG_RT_GROUP_SCHED=y
+CONFIG_SCHED_AUTOGROUP=y
+
+CONFIG_CPUSETS=y
+CONFIG_PROC_PID_CPUSET=y
+
+CONFIG_CGROUPS=y
+# CONFIG_CGROUP_DEBUG is not set
+CONFIG_CGROUP_NS=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_CGROUP_MEM_RES_CTLR=y
+CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y # XXX disabled by default, pass 'swapaccount'
+# CONFIG_CGROUP_MEM_RES_CTLR_SWAP_ENABLED is not set
+CONFIG_BLK_CGROUP=y
+# CONFIG_DEBUG_BLK_CGROUP is not set
+
+# CONFIG_SYSFS_DEPRECATED is not set
+# CONFIG_SYSFS_DEPRECATED_V2 is not set
+
+CONFIG_RELAY=y
+CONFIG_PRINTK_TIME=y
+
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_ENABLE_WARN_DEPRECATED is not set
+
+CONFIG_KEXEC=y
+
+CONFIG_HWMON=y
+# CONFIG_HWMON_DEBUG_CHIP is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+
+CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
+
+CONFIG_IBMASR=m
+
+CONFIG_PM_DEBUG=y
+CONFIG_PM_TRACE=y
+# CONFIG_PM_VERBOSE is not set
+# CONFIG_PM_TEST_SUSPEND is not set
+CONFIG_PM_RUNTIME=y
+
+## BEGIN ISA Junk.
+
+CONFIG_I82365=m
+# CONFIG_TCIC is not set
+# CONFIG_PCMCIA_PROBE is not set
+# CONFIG_LTPC is not set
+# CONFIG_COPS is not set
+
+CONFIG_SCSI_AHA152X=m
+CONFIG_SCSI_AHA1542=m
+# CONFIG_SCSI_IN2000 is not set
+CONFIG_SCSI_ARCMSR=m
+CONFIG_SCSI_ARCMSR_AER=y
+# CONFIG_SCSI_DTC3280 is not set
+# CONFIG_SCSI_GENERIC_NCR5380 is not set
+# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
+# CONFIG_SCSI_NCR53C406A is not set
+# CONFIG_SCSI_PAS16 is not set
+# CONFIG_SCSI_QLOGIC_FAS is not set
+# CONFIG_SCSI_SYM53C416 is not set
+# CONFIG_SCSI_T128 is not set
+# CONFIG_SCSI_U14_34F is not set
+# CONFIG_SCSI_ULTRASTOR is not set
+
+# CONFIG_EL1 is not set
+# CONFIG_EL2 is not set
+# CONFIG_ELPLUS is not set
+# CONFIG_EL16 is not set
+CONFIG_EL3=m
+# CONFIG_3C515 is not set
+# CONFIG_LANCE is not set
+CONFIG_NET_VENDOR_SMC=y
+# CONFIG_WD80x3 is not set
+CONFIG_ULTRA=m
+# CONFIG_SMC9194 is not set
+# CONFIG_NET_VENDOR_RACAL is not set
+# CONFIG_NI52 is not set
+# CONFIG_NI65 is not set
+# CONFIG_AT1700 is not set
+# CONFIG_DEPCA is not set
+CONFIG_NET_ISA=y
+CONFIG_NE2000=m
+# CONFIG_E2100 is not set
+CONFIG_EWRK3=m
+# CONFIG_EEXPRESS is not set
+# CONFIG_EEXPRESS_PRO is not set
+# CONFIG_HPLAN_PLUS is not set
+# CONFIG_HPLAN is not set
+# CONFIG_LP486E is not set
+# CONFIG_ETH16I is not set
+# CONFIG_ZNET is not set
+# CONFIG_SEEQ8005 is not set
+# CONFIG_AC3200 is not set
+# CONFIG_APRICOT is not set
+# CONFIG_CS89x0 is not set
+# CONFIG_IBMTR is not set
+# CONFIG_SKISA is not set
+# CONFIG_PROTEON is not set
+# CONFIG_SMCTR is not set
+# CONFIG_WAVELAN is not set
+# CONFIG_HISAX_16_0 is not set
+# CONFIG_HISAX_AVM_A1 is not set
+# CONFIG_HISAX_IX1MICROR2 is not set
+# CONFIG_HISAX_ASUSCOM is not set
+# CONFIG_HISAX_TELEINT is not set
+# CONFIG_HISAX_HFCS is not set
+# CONFIG_HISAX_SPORTSTER is not set
+# CONFIG_HISAX_MIC is not set
+# CONFIG_HISAX_ISURF is not set
+# CONFIG_HISAX_HSTSAPHIR is not set
+# CONFIG_ISDN_DRV_ICN is not set
+# CONFIG_ISDN_DRV_PCBIT is not set
+# CONFIG_ISDN_DRV_SC is not set
+# CONFIG_ISDN_DRV_ACT2000 is not set
+# CONFIG_ISDN_DRV_AVMB1_B1ISA is not set
+# CONFIG_ISDN_DRV_AVMB1_T1ISA is not set
+
+# CONFIG_MOUSE_INPORT is not set
+# CONFIG_MOUSE_ATIXL is not set
+# CONFIG_MOUSE_LOGIBM is not set
+# CONFIG_MOUSE_PC110PAD is not set
+
+# CONFIG_SERIAL_8250_FOURPORT is not set
+# CONFIG_SERIAL_8250_ACCENT is not set
+# CONFIG_SERIAL_8250_BOCA is not set
+# CONFIG_SERIAL_8250_HUB6 is not set
+# CONFIG_SERIAL_8250_EXAR_ST16C554 is not set
+
+# CONFIG_PCWATCHDOG is not set
+# CONFIG_WDT is not set
+
+# CONFIG_VIDEO_PMS is not set
+CONFIG_RADIO_ADAPTERS=y
+# CONFIG_RADIO_CADET is not set
+# CONFIG_RADIO_RTRACK is not set
+# CONFIG_RADIO_RTRACK2 is not set
+# CONFIG_RADIO_AZTECH is not set
+# CONFIG_RADIO_GEMTEK 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_TEA5764 is not set
+# CONFIG_RADIO_TYPHOON is not set
+# CONFIG_RADIO_ZOLTRIX is not set
+# CONFIG_RADIO_SAA7706H is not set
+
+# CONFIG_SND_OPL4_LIB is not set
+# CONFIG_SND_AD1816A is not set
+# CONFIG_SND_AD1848 is not set
+# CONFIG_SND_CS4231 is not set
+CONFIG_SND_CS4236=m
+# CONFIG_SND_ES968 is not set
+# CONFIG_SND_ES1688 is not set
+# CONFIG_SND_ES18XX is not set
+# CONFIG_SND_GUSCLASSIC is not set
+# CONFIG_SND_GUSEXTREME is not set
+# CONFIG_SND_GUSMAX is not set
+# CONFIG_SND_INTERWAVE is not set
+# CONFIG_SND_JAZZ16 is not set
+# CONFIG_SND_INTERWAVE_STB 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_SB8 is not set
+CONFIG_SND_SB16=m
+CONFIG_SND_SBAWE=m
+# CONFIG_SND_SB16_CSP is not set
+# CONFIG_SND_ALS100 is not set
+# CONFIG_SND_AZT2320 is not set
+# CONFIG_SND_CMI8330 is not set
+# CONFIG_SND_DT019X is not set
+CONFIG_SND_OPL3SA2=m
+# CONFIG_SND_SGALAXY is not set
+# CONFIG_SND_SSCAPE is not set
+CONFIG_SND_DARLA20=m
+CONFIG_SND_GINA20=m
+CONFIG_SND_LAYLA20=m
+CONFIG_SND_DARLA24=m
+CONFIG_SND_GINA24=m
+CONFIG_SND_LAYLA24=m
+CONFIG_SND_MONA=m
+CONFIG_SND_MIA=m
+CONFIG_SND_ECHO3G=m
+CONFIG_SND_INDIGO=m
+CONFIG_SND_INDIGOIO=m
+CONFIG_SND_INDIGODJ=m
+CONFIG_SND_INDIGOIOX=m
+CONFIG_SND_INDIGODJX=m
+# CONFIG_SND_SOC is not set
+
+## END of ISA options.
+
+CONFIG_COMPACTION=y
+CONFIG_MIGRATION=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+# CONFIG_LEDS_AMS_DELTA is not set
+# CONFIG_LEDS_LOCOMO is not set
+# CONFIG_LEDS_NET48XX is not set
+# CONFIG_LEDS_PCA9532 is not set
+# CONFIG_LEDS_PCA955X is not set
+# CONFIG_LEDS_BD2802 is not set
+# CONFIG_LEDS_S3C24XX is not set
+CONFIG_LEDS_DELL_NETBOOKS=m
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=m
+CONFIG_LEDS_TRIGGER_IDE_DISK=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=m
+CONFIG_LEDS_TRIGGER_BACKLIGHT=m
+CONFIG_LEDS_TRIGGER_DEFAULT_ON=m
+CONFIG_LEDS_ALIX2=m
+CONFIG_LEDS_WM8350=m
+CONFIG_LEDS_LP3944=m
+CONFIG_LEDS_WM831X_STATUS=m
+CONFIG_LEDS_REGULATOR=m
+CONFIG_LEDS_LT3593=m
+CONFIG_LEDS_TRIGGER_GPIO=m
+CONFIG_LEDS_INTEL_SS4200=m
+CONFIG_LEDS_LP5521=m
+CONFIG_LEDS_LP5523=m
+
+CONFIG_DMADEVICES=y
+CONFIG_DMA_ENGINE=y
+# CONFIG_TIMB_DMA is not set
+CONFIG_NET_DMA=y
+# CONFIG_DMATEST is not set
+CONFIG_ASYNC_TX_DMA=y
+
+CONFIG_UNUSED_SYMBOLS=y
+
+CONFIG_UTRACE=y
+
+CONFIG_FTRACE=y
+CONFIG_DYNAMIC_FTRACE=y
+# CONFIG_IRQSOFF_TRACER is not set
+CONFIG_SCHED_TRACER=y
+CONFIG_CONTEXT_SWITCH_TRACER=y
+CONFIG_WORKQUEUE_TRACER=y
+CONFIG_FTRACE_SYSCALLS=y
+CONFIG_KMEMTRACE=y
+CONFIG_FTRACE_MCOUNT_RECORD=y
+# CONFIG_FTRACE_STARTUP_TEST is not set
+# CONFIG_TRACE_BRANCH_PROFILING is not set
+CONFIG_FUNCTION_PROFILER=y
+CONFIG_RING_BUFFER_BENCHMARK=m
+CONFIG_FUNCTION_TRACER=y
+CONFIG_STACK_TRACER=y
+
+CONFIG_KPROBES=y
+CONFIG_OPTPROBES=y
+
+# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set
+
+CONFIG_HZ_1000=y
+
+CONFIG_TIMER_STATS=y
+
+# Auxillary displays
+CONFIG_KS0108=m
+CONFIG_KS0108_PORT=0x378
+CONFIG_KS0108_DELAY=2
+CONFIG_CFAG12864B=y
+CONFIG_CFAG12864B_RATE=20
+
+# CONFIG_PHANTOM is not set
+
+CONFIG_POWER_SUPPLY=m
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+# CONFIG_TEST_POWER is not set
+CONFIG_APM_POWER=m
+# CONFIG_WM831X_POWER is not set
+# CONFIG_BATTERY_DS2760 is not set
+# CONFIG_BATTERY_DS2782 is not set
+# CONFIG_BATTERY_BQ20Z75 is not set
+# CONFIG_CHARGER_ISP1704 is not set
+CONFIG_BATTERY_PMU=m
+# CONFIG_BATTERY_BQ27x00 is not set
+# CONFIG_BATTERY_MAX17040 is not set
+# CONFIG_PDA_POWER is not set
+# CONFIG_CHARGER_GPIO is not set
+# CONFIG_BATTERY_MAX17042 is not set
+
+CONFIG_AUXDISPLAY=y
+
+CONFIG_UIO=m
+CONFIG_UIO_CIF=m
+CONFIG_UIO_SMX=m
+# CONFIG_UIO_PDRV is not set
+# CONFIG_UIO_PDRV_GENIRQ is not set
+CONFIG_UIO_AEC=m
+CONFIG_UIO_SERCOS3=m
+CONFIG_UIO_PCI_GENERIC=m
+# CONFIG_UIO_NETX is not set
+
+# CONFIG_CRC7 is not set
+
+
+# LIRC
+CONFIG_LIRC_STAGING=y
+CONFIG_LIRC_BT829=m
+CONFIG_LIRC_ENE0100=m
+CONFIG_LIRC_I2C=m
+CONFIG_LIRC_IGORPLUGUSB=m
+CONFIG_LIRC_IMON=m
+CONFIG_LIRC_IT87=m
+CONFIG_LIRC_ITE8709=m
+CONFIG_LIRC_MCEUSB=m
+CONFIG_LIRC_ZILOG=m
+CONFIG_LIRC_PARALLEL=m
+CONFIG_LIRC_SERIAL=m
+CONFIG_LIRC_SERIAL_TRANSMITTER=y
+CONFIG_LIRC_SASEM=m
+CONFIG_LIRC_SIR=m
+CONFIG_LIRC_STREAMZAP=m
+CONFIG_LIRC_TTUSBIR=m
+
+# CONFIG_SAMPLES is not set
+
+# CONFIG_DEVKMEM is not set
+
+CONFIG_PM_TRACE_RTC=y
+CONFIG_R6040=m
+
+CONFIG_BNX2X=m
+CONFIG_NOZOMI=m
+# CONFIG_TPS65010 is not set
+# CONFIG_DEBUG_SECTION_MISMATCH is not set
+# CONFIG_KPROBES_SANITY_TEST is not set
+# CONFIG_BACKTRACE_SELF_TEST is not set
+CONFIG_LATENCYTOP=y
+CONFIG_RESOURCE_COUNTERS=y
+# CONFIG_COMPAT_BRK is not set
+
+
+#FIXME: x86 generic?
+CONFIG_LEDS_CLEVO_MAIL=m
+CONFIG_I8K=m
+CONFIG_INPUT_APANEL=m
+
+# CONFIG_INTEL_MENLOW is not set
+CONFIG_ENCLOSURE_SERVICES=m
+CONFIG_IPWIRELESS=m
+CONFIG_RTC_DRV_DS1511=m
+
+# CONFIG_BLK_DEV_XIP is not set
+CONFIG_MEMSTICK=m
+# CONFIG_MEMSTICK_DEBUG is not set
+# CONFIG_MEMSTICK_UNSAFE_RESUME is not set
+CONFIG_MSPRO_BLOCK=m
+CONFIG_MEMSTICK_TIFM_MS=m
+CONFIG_MEMSTICK_JMICRON_38X=m
+
+CONFIG_ACCESSIBILITY=y
+CONFIG_A11Y_BRAILLE_CONSOLE=y
+
+# CONFIG_HTC_PASIC3 is not set
+
+# MT9V022_PCA9536_SWITCH is not set
+
+CONFIG_THERMAL_HWMON=y
+
+CONFIG_OPTIMIZE_INLINING=y
+
+# FIXME: This should be x86/ia64 only
+# CONFIG_HP_ILO is not set
+
+# CONFIG_GPIOLIB is not set
+
+
+CONFIG_NETFILTER_TPROXY=m
+CONFIG_NETFILTER_XT_TARGET_TPROXY=m
+CONFIG_NETFILTER_XT_MATCH_RECENT=m
+# CONFIG_NETFILTER_XT_MATCH_RECENT_PROC_COMPAT is not set
+CONFIG_NETFILTER_XT_MATCH_SOCKET=m
+
+# CONFIG_IP_VS_IPV6 is not set
+
+CONFIG_NET_DSA=y
+CONFIG_NET_DSA_MV88E6060=y
+CONFIG_NET_DSA_MV88E6131=y
+CONFIG_NET_DSA_MV88E6123_61_65=y
+
+CONFIG_NET_SCH_MULTIQ=m
+CONFIG_NET_ACT_SKBEDIT=m
+
+CONFIG_PHONET=m
+# CONFIG_PHONET_PIPECTRLR is not set
+
+CONFIG_ICS932S401=m
+# CONFIG_C2PORT is not set
+CONFIG_W1_SLAVE_BQ27000=m
+
+
+CONFIG_IT87_WDT=m
+CONFIG_W83697UG_WDT=m
+
+# CONFIG_REGULATOR is not set
+# CONFIG_REGULATOR_DEBUG is not set
+
+CONFIG_WM8350_POWER=m
+
+# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
+
+CONFIG_USB_WUSB=m
+CONFIG_USB_WUSB_CBAF=m
+# CONFIG_USB_WUSB_CBAF_DEBUG is not set
+CONFIG_USB_WHCI_HCD=m
+CONFIG_USB_HWA_HCD=m
+
+CONFIG_UWB=m
+CONFIG_UWB_HWA=m
+CONFIG_UWB_WHCI=m
+CONFIG_UWB_WLP=m
+CONFIG_UWB_I1480U=m
+CONFIG_UWB_I1480U_WLP=m
+
+CONFIG_STAGING=y
+# CONFIG_STAGING_EXCLUDE_BUILD is not set
+# CONFIG_ET131X is not set
+# CONFIG_SLICOSS is not set
+# CONFIG_VIDEO_TM6000 is not set
+# CONFIG_WLAGS49_H2 is not set
+# CONFIG_WLAGS49_H25 is not set
+# CONFIG_VIDEO_DT3155 is not set
+# CONFIG_TI_ST is not set
+# CONFIG_ST_BT is not set
+# CONFIG_FB_XGI is not set
+# CONFIG_VIDEO_GO7007 is not set
+# CONFIG_USB_IP_COMMON is not set
+# CONFIG_DT3155 is not set
+# CONFIG_W35UND is not set
+# CONFIG_PRISM2_USB is not set
+# CONFIG_ECHO is not set
+CONFIG_USB_ATMEL=m
+# CONFIG_POCH is not set
+# CONFIG_OTUS is not set
+# CONFIG_RT2860 is not set
+# CONFIG_RT2870 is not set
+# CONFIG_COMEDI is not set
+# CONFIG_ASUS_OLED is not set
+# CONFIG_PANEL is not set
+# CONFIG_ALTERA_PCIE_CHDMA is not set
+# CONFIG_INPUT_MIMIO is not set
+# CONFIG_TRANZPORT is not set
+# CONFIG_POHMELFS is not set
+# CONFIG_B3DFG is not set
+# CONFIG_IDE_PHISON is not set
+# CONFIG_PLAN9AUTH is not set
+# CONFIG_LINE6_USB is not set
+# CONFIG_RTL8192SU is not set
+# CONFIG_IIO is not set
+# CONFIG_VME_BUS is not set
+# CONFIG_RAR_REGISTER is not set
+# CONFIG_VT6656 is not set
+# CONFIG_USB_SERIAL_QUATECH_USB2 is not set
+# CONFIG_RTL8192E is not set
+# CONFIG_INPUT_GPIO is not set
+# CONFIG_VIDEO_CX25821 is not set
+# CONFIG_HYPERV is not set
+# CONFIG_R8187SE is not set
+# CONFIG_RTL8192U is not set
+# CONFIG_RAMZSWAP is not set
+# CONFIG_BATMAN_ADV is not set
+# CONFIG_FB_SM7XX is not set
+# CONFIG_SPECTRA is not set
+# CONFIG_ZRAM is not set
+# CONFIG_EASYCAP is not set
+# CONFIG_SOLO6X10 is not set
+# CONFIG_ACPI_QUICKSTART is not set
+# CONFIG_BRCM80211 is not set
+# CONFIG_R8712U is not set
+# CONFIG_ATH6K_LEGACY is not set
+# CONFIG_USB_ENESTORAGE is not set
+# CONFIG_BCM_WIMAX is not set
+# CONFIG_FT1000 is not set
+# CONFIG_SPEAKUP is not set
+# CONFIG_DX_SEP is not set
+# CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4 is not set
+# CONFIG_TOUCHSCREEN_CLEARPAD_TM1217 is not set
+
+#
+# Android
+#
+
+# CONFIG_DEBUG_VIRTUAL is not set
+# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+# CONFIG_FUNCTION_GRAPH_TRACER is not set
+# CONFIG_BOOT_TRACER is not set
+CONFIG_EARLY_PRINTK_DBGP=y
+
+CONFIG_SECURITYFS=y
+
+CONFIG_SCSI_CXGB3_ISCSI=m
+CONFIG_LIBFC=m
+CONFIG_LIBFCOE=m
+CONFIG_FCOE=m
+CONFIG_FCOE_FNIC=m
+# CONFIG_SCSI_LPFC_DEBUG_FS is not set
+
+CONFIG_NOP_USB_XCEIV=m
+
+CONFIG_IMA=y
+CONFIG_IMA_MEASURE_PCR_IDX=10
+CONFIG_IMA_AUDIT=y
+CONFIG_IMA_LSM_RULES=y
+
+CONFIG_LSM_MMAP_MIN_ADDR=65536
+
+# CONFIG_PAGE_POISONING is not set
+
+CONFIG_SLOW_WORK=y
+CONFIG_SLOW_WORK_DEBUG=y
+
+# CONFIG_CRASH_DUMP is not set
+# CONFIG_CRASH is not set
+
+CONFIG_STRIP_ASM_SYMS=y
+
+# CONFIG_RCU_FANOUT_EXACT is not set
+CONFIG_RCU_FAST_NO_HZ=y
+CONFIG_SRCU_SYNCHRONIZE_DELAY=10
+
+CONFIG_KSM=y
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+
+CONFIG_FSNOTIFY=y
+CONFIG_FANOTIFY=y
+CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
+
+CONFIG_IEEE802154=m
+CONFIG_IEEE802154_DRIVERS=m
+CONFIG_IEEE802154_FAKEHARD=m
+
+# CONFIG_GCOV_KERNEL is not set
+
+CONFIG_PPS=m
+# CONFIG_PPS_CLIENT_KTIMER is not set
+CONFIG_PPS_CLIENT_LDISC=m
+# CONFIG_PPS_DEBUG is not set
+CONFIG_PPS_CLIENT_PARPORT=m
+CONFIG_PPS_GENERATOR_PARPORT=m
+CONFIG_NTP_PPS=y
+
+# CONFIG_USB_SERIAL_QUATECH2 is not set
+# CONFIG_VT6655 is not set
+CONFIG_FB_UDL=m
+
+# DEBUG options that don't get enabled/disabled with 'make debug/release'
+#
+# Kmemleak still produces a lot of false positives.
+# CONFIG_DEBUG_KMEMLEAK is not set
+#
+# This generates a huge amount of dmesg spew
+# CONFIG_DEBUG_KOBJECT is not set
+#
+#
+# These debug options are deliberatly left on (even in 'make release' kernels).
+# They aren't that much of a performance impact, and the value
+# from getting useful bug-reports makes it worth leaving them on.
+CONFIG_DYNAMIC_DEBUG=y
+CONFIG_DEBUG_HIGHMEM=y
+CONFIG_DEBUG_SPINLOCK_SLEEP=y
+CONFIG_BOOT_PRINTK_DELAY=y
+CONFIG_DEBUG_LIST=y
+CONFIG_DEBUG_SHIRQ=y
+CONFIG_DEBUG_DEVRES=y
+CONFIG_DEBUG_RODATA_TEST=y
+CONFIG_DEBUG_NX_TEST=m
+CONFIG_DEBUG_BOOT_PARAMS=y
+CONFIG_DETECT_SOFTLOCKUP=y
+CONFIG_LOCKUP_DETECTOR=y
+# CONFIG_DEBUG_INFO_REDUCED is not set
+# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+# CONFIG_DETECT_HUNG_TASK is not set
+# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
+CONFIG_ATOMIC64_SELFTEST=y
+
+CONFIG_MEMORY_FAILURE=y
+CONFIG_HWPOISON_INJECT=m
+
+CONFIG_BLK_DEV_DRBD=m
+
+# CONFIG_MDIO_GPIO is not set
+# CONFIG_KEYBOARD_GPIO is not set
+# CONFIG_KEYBOARD_GPIO_POLLED is not set
+# CONFIG_MOUSE_GPIO is not set
+# CONFIG_I2C_GPIO is not set
+# CONFIG_DEBUG_GPIO is not set
+# CONFIG_W1_MASTER_GPIO is not set
+# CONFIG_LEDS_GPIO is not set
+CONFIG_GPIO_SYSFS=y
+# CONFIG_GPIO_MAX732X is not set
+# CONFIG_GPIO_PCA953X is not set
+# CONFIG_GPIO_PCF857X is not set
+# CONFIG_GPIO_CS5535 is not set
+# CONFIG_GPIO_ADP5588 is not set
+# CONFIG_GPIO_IT8761E is not set
+# CONFIG_GPIO_MAX7300 is not set
+# CONFIG_UCB1400_CORE is not set
+# CONFIG_RADIO_MIROPCM20 is not set
+# CONFIG_USB_GPIO_VBUS is not set
+# CONFIG_GPIO_SCH is not set
+# CONFIG_GPIO_LANGWELL is not set
+# CONFIG_GPIO_RDC321X is not set
+# CONFIG_GPIO_BASIC_MMIO is not set
+# CONFIG_GPIO_VX855 is not set
+# CONFIG_GPIO_PCH is not set
+# CONFIG_GPIO_ML_IOH is not set
+
+CONFIG_KSYM_TRACER=y
+CONFIG_PROFILE_KSYM_TRACER=y
+CONFIG_KPROBE_EVENT=y
+
+# CONFIG_RAMOOPS is not set
+
+CONFIG_IR_CORE=m
+CONFIG_IR_ENE=m
+CONFIG_IR_STREAMZAP=m
+CONFIG_IR_WINBOND_CIR=m
+CONFIG_IR_IMON=m
+CONFIG_IR_MCEUSB=m
+CONFIG_IR_NUVOTON=m
+CONFIG_IR_ITE_CIR=m
+
+# CONFIG_GPIO_SX150X is not set
+# CONFIG_MFD_STMPE is not set
+# CONFIG_MFD_MAX8998 is not set
+# CONFIG_MFD_TPS6586X is not set
+# CONFIG_MFD_TC3589X is not set
+
+CONFIG_SPARSE_RCU_POINTER=y
+
+# CONFIG_PM_OPP is not set
+
+CONFIG_BKL=y
+
+CONFIG_EVENT_POWER_TRACING_DEPRECATED=y
+
+# CONFIG_XZ_DEC_TEST is not set
+
+CONFIG_NFC_DEVICES=y
+CONFIG_PN544_NFC=m
+
+CONFIG_TARGET_CORE=m
+CONFIG_TCM_IBLOCK=m
+CONFIG_TCM_FILEIO=m
+CONFIG_TCM_PSCSI=m
+
+CONFIG_TEST_KSTRTOX=m
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/config-i686-PAE b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-i686-PAE
new file mode 100644
index 000000000..fdc8a8bd4
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-i686-PAE
@@ -0,0 +1,9 @@
+# CONFIG_HIGHMEM4G is not set
+CONFIG_HIGHMEM64G=y
+# CONFIG_OLPC_OPENFIRMWARE is not set
+
+CONFIG_XEN_DEV_EVTCHN=m
+CONFIG_XEN_SYS_HYPERVISOR=y
+
+# I2O only works on non-PAE 32-bit x86
+# CONFIG_I2O is not set
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/config-ia64-generic b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-ia64-generic
new file mode 100644
index 000000000..5c864b3d0
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-ia64-generic
@@ -0,0 +1,208 @@
+#
+# Automatically generated make config: don't edit
+#
+
+#
+# Processor type and features
+#
+CONFIG_IA64=y
+CONFIG_64BIT=y
+# CONFIG_XEN is not set
+CONFIG_MMU=y
+CONFIG_EFI=y
+# CONFIG_ITANIUM is not set
+CONFIG_MCKINLEY=y
+CONFIG_IA64_GENERIC=y
+# CONFIG_IA64_DIG is not set
+# CONFIG_IA64_HP_ZX1 is not set
+# CONFIG_IA64_SGI_SN2 is not set
+CONFIG_IA64_ESI=y
+CONFIG_IA64_HP_AML_NFW=y
+CONFIG_MSPEC=y
+# CONFIG_IA64_HP_SIM is not set
+# CONFIG_IA64_PAGE_SIZE_4KB is not set
+# CONFIG_IA64_PAGE_SIZE_8KB is not set
+CONFIG_IA64_PAGE_SIZE_16KB=y
+# CONFIG_IA64_PAGE_SIZE_64KB is not set
+CONFIG_IA64_L1_CACHE_SHIFT=7
+CONFIG_NUMA=y
+# CONFIG_VIRTUAL_MEM_MAP is not set
+CONFIG_SPARSEMEM_MANUAL=y
+CONFIG_SPARSEMEM=y
+CONFIG_MEMORY_HOTPLUG=y
+CONFIG_MEMORY_HOTREMOVE=y
+CONFIG_IA64_MCA_RECOVERY=m
+CONFIG_IA64_CYCLONE=y
+CONFIG_MMTIMER=y
+CONFIG_IOSAPIC=y
+CONFIG_FORCE_MAX_ZONEORDER=18
+CONFIG_NR_CPUS=1024
+# CONFIG_IA32_SUPPORT is not set
+# CONFIG_COMPAT is not set
+CONFIG_PERFMON=y
+CONFIG_IA64_PALINFO=y
+CONFIG_EFI_VARS=y
+CONFIG_SERIAL_8250_RUNTIME_UARTS=16
+CONFIG_EFI_PCDP=y
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_BLK_DEV_SGIIOC4=y
+
+#
+# Character devices
+#
+CONFIG_TCG_INFINEON=m
+
+#
+# Watchdog Cards
+#
+# CONFIG_HW_RANDOM is not set
+# CONFIG_GEN_RTC is not set
+CONFIG_EFI_RTC=y
+CONFIG_RTC_DRV_EFI=y
+
+
+#
+# AGP
+#
+CONFIG_AGP_I460=y
+CONFIG_AGP_HP_ZX1=y
+CONFIG_AGP_SGI_TIOCA=y
+
+#
+# HP Simulator drivers
+#
+# CONFIG_HP_SIMETH is not set
+# CONFIG_HP_SIMSERIAL is not set
+# CONFIG_HP_SIMSCSI is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_IA64_PRINT_HAZARDS is not set
+# CONFIG_DISABLE_VHPT is not set
+# CONFIG_IA64_DEBUG_CMPXCHG is not set
+# CONFIG_IA64_DEBUG_IRQ is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# SGI
+#
+CONFIG_SGI_SNSC=y
+CONFIG_SGI_TIOCX=y
+CONFIG_SGI_MBCS=m
+CONFIG_SGI_IOC3=m
+CONFIG_SGI_IOC4=y
+CONFIG_SGI_XP=m
+CONFIG_SGI_GRU=m
+# CONFIG_SGI_GRU_DEBUG is not set
+CONFIG_SERIAL_SGI_L1_CONSOLE=y
+CONFIG_SERIAL_SGI_IOC3=m
+CONFIG_SERIAL_SGI_IOC4=m
+
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_SCSI_BUSLOGIC is not set
+
+#
+CONFIG_ACPI=y
+CONFIG_ACPI_AC=y
+# CONFIG_ACPI_ASUS is not set
+CONFIG_ACPI_PROCFS_POWER=y
+CONFIG_ACPI_SYSFS_POWER=y
+# CONFIG_ACPI_BATTERY is not set
+CONFIG_ACPI_BLACKLIST_YEAR=0
+CONFIG_ACPI_BUTTON=y
+# CONFIG_ACPI_DOCK is not set
+CONFIG_ACPI_FAN=y
+CONFIG_ACPI_HOTPLUG_MEMORY=y
+CONFIG_ACPI_NUMA=y
+CONFIG_ACPI_POWER=y
+CONFIG_ACPI_PROCESSOR=y
+CONFIG_ACPI_PROCFS=y
+CONFIG_ACPI_SLEEP=y
+CONFIG_ACPI_THERMAL=y
+# CONFIG_ACPI_TOSHIBA is not set
+CONFIG_ACPI_VIDEO=m
+# CONFIG_ACPI_PROC_EVENT is not set
+CONFIG_ACPI_HED=m
+CONFIG_ACPI_EC_DEBUGFS=m
+CONFIG_ACPI_IPMI=m
+
+CONFIG_PM=y
+CONFIG_HOTPLUG_PCI=y
+# CONFIG_HPET is not set
+# CONFIG_HOTPLUG_PCI_CPCI is not set
+CONFIG_HOTPLUG_PCI_SHPC=m
+CONFIG_HOTPLUG_PCI_SGI=m
+CONFIG_PNPACPI=y
+
+CONFIG_SCHED_SMT=y
+
+CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
+
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_STAT=m
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+
+CONFIG_IA64_ACPI_CPUFREQ=m
+
+# CONFIG_PERMIT_BSP_REMOVE is not set
+# CONFIG_FORCE_CPEI_RETARGET is not set
+
+CONFIG_NODES_SHIFT=10
+
+
+CONFIG_HW_RANDOM_INTEL=m
+
+CONFIG_CRASH_DUMP=y
+CONFIG_PROC_VMCORE=y
+
+# drivers/media/video/usbvision/usbvision-i2c.c:64:39: error: macro "outb" passed 4 arguments, but takes just 2
+# CONFIG_VIDEO_USBVISION is not set
+
+# CONFIG_IA64_MC_ERR_INJECT is not set
+
+CONFIG_DMIID=y
+
+CONFIG_SENSORS_I5K_AMB=m
+
+CONFIG_SPARSEMEM_VMEMMAP=y
+
+CONFIG_FRAME_WARN=2048
+
+CONFIG_VIRT_CPU_ACCOUNTING=y
+CONFIG_VIRTUALIZATION=y
+CONFIG_KVM=m
+CONFIG_KVM_INTEL=m
+
+CONFIG_HP_ILO=m
+
+CONFIG_PARAVIRT_GUEST=y
+CONFIG_PARAVIRT=y
+
+CONFIG_DMAR_DEFAULT_ON=y
+
+CONFIG_RCU_FANOUT=64
+
+CONFIG_ACPI_POWER_METER=m
+CONFIG_I2C_SCMI=m
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/config-local b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-local
new file mode 100644
index 000000000..8c32be5be
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-local
@@ -0,0 +1,2 @@
+# This file is intentionally left empty in the stock kernel. Its a nicety
+# added for those wanting to do custom rebuilds with altered config opts.
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/config-nodebug b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-nodebug
new file mode 100644
index 000000000..c81b03b85
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-nodebug
@@ -0,0 +1,101 @@
+CONFIG_SND_VERBOSE_PRINTK=y
+CONFIG_SND_DEBUG=y
+CONFIG_SND_PCM_XRUN_DEBUG=y
+
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_PROVE_RCU is not set
+# CONFIG_PROVE_RCU_REPEATEDLY is not set
+# CONFIG_DEBUG_PER_CPU_MAPS is not set
+CONFIG_CPUMASK_OFFSTACK=y
+
+# CONFIG_CPU_NOTIFIER_ERROR_INJECT is not set
+
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_FAILSLAB is not set
+# CONFIG_FAIL_PAGE_ALLOC is not set
+# CONFIG_FAIL_MAKE_REQUEST is not set
+# CONFIG_FAULT_INJECTION_DEBUG_FS is not set
+# CONFIG_FAULT_INJECTION_STACKTRACE_FILTER is not set
+# CONFIG_FAIL_IO_TIMEOUT is not set
+
+# CONFIG_SLUB_DEBUG_ON is not set
+
+# CONFIG_LOCK_STAT is not set
+
+# CONFIG_DEBUG_STACK_USAGE is not set
+
+# CONFIG_ACPI_DEBUG is not set
+# CONFIG_ACPI_DEBUG_FUNC_TRACE is not set
+
+# CONFIG_DEBUG_SG is not set
+
+# CONFIG_DEBUG_PAGEALLOC is not set
+
+# CONFIG_DEBUG_WRITECOUNT is not set
+# CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_DEBUG_OBJECTS_SELFTEST is not set
+# CONFIG_DEBUG_OBJECTS_FREE is not set
+# CONFIG_DEBUG_OBJECTS_TIMERS is not set
+CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
+
+# CONFIG_X86_PTDUMP is not set
+
+# CONFIG_CAN_DEBUG_DEVICES is not set
+
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+
+# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+
+# CONFIG_DEBUG_NOTIFIERS is not set
+
+# CONFIG_DMA_API_DEBUG is not set
+
+# CONFIG_MMIOTRACE is not set
+
+# CONFIG_DEBUG_CREDENTIALS is not set
+
+# off in both production debug and nodebug builds,
+# on in rawhide nodebug builds
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+
+# CONFIG_EXT4_DEBUG is not set
+
+# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
+
+# CONFIG_JBD2_DEBUG is not set
+
+# CONFIG_DEBUG_CFQ_IOSCHED is not set
+
+# CONFIG_DRBD_FAULT_INJECTION is not set
+
+# CONFIG_ATH_DEBUG is not set
+# CONFIG_CARL9170_DEBUGFS is not set
+# CONFIG_IWLWIFI_DEVICE_TRACING is not set
+
+# CONFIG_DEBUG_OBJECTS_WORK is not set
+# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
+
+# CONFIG_DMADEVICES_DEBUG is not set
+# CONFIG_DMADEVICES_VDEBUG is not set
+
+CONFIG_PM_ADVANCED_DEBUG=y
+
+# CONFIG_CEPH_LIB_PRETTYDEBUG is not set
+# CONFIG_QUOTA_DEBUG is not set
+
+CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
+
+CONFIG_PCI_DEFAULT_USE_CRS=y
+
+CONFIG_KGDB_KDB=y
+CONFIG_KDB_KEYBOARD=y
+
+# CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER is not set
+# CONFIG_TEST_LIST_SORT is not set
+
+# CONFIG_DEBUG_SET_MODULE_RONX is not set
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/config-powerpc-generic b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-powerpc-generic
new file mode 100644
index 000000000..3c8d8f058
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-powerpc-generic
@@ -0,0 +1,343 @@
+# Most PowerPC kernels we build are SMP
+CONFIG_SMP=y
+CONFIG_IRQ_ALL_CPUS=y
+CONFIG_PPC=y
+CONFIG_WATCHDOG_RTAS=m
+CONFIG_DEBUGGER=y
+CONFIG_GENERIC_NVRAM=y
+CONFIG_ALTIVEC=y
+
+CONFIG_TAU=y
+# CONFIG_TAU_INT is not set
+CONFIG_TAU_AVERAGE=y
+
+CONFIG_SECCOMP=y
+
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_DEBUG=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_STAT=m
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+
+CONFIG_PM=y
+
+CONFIG_PM_STD_PARTITION=""
+
+CONFIG_SUSPEND=y
+CONFIG_HIBERNATION=y
+# CONFIG_RTC is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_GEN_RTC_X is not set
+CONFIG_RTC_DRV_GENERIC=y
+CONFIG_PROC_DEVICETREE=y
+# CONFIG_CMDLINE_BOOL is not set
+
+CONFIG_ADB=y
+CONFIG_ADB_PMU=y
+CONFIG_WINDFARM=y
+CONFIG_WINDFARM_PM112=y
+CONFIG_I2C_POWERMAC=y
+CONFIG_APPLE_AIRPORT=m
+CONFIG_SERIAL_PMACZILOG=m
+# CONFIG_SERIAL_PMACZILOG_TTYS is not set
+CONFIG_AGP_UNINORTH=y
+CONFIG_FB_OF=y
+# CONFIG_FB_CONTROL is not set
+CONFIG_FB_IBM_GXT4500=y
+CONFIG_FB_RADEON=y
+CONFIG_FB_MATROX=y
+CONFIG_FB_NVIDIA=m
+# CONFIG_FB_VGA16 is not set
+CONFIG_FB_ATY128_BACKLIGHT=y
+CONFIG_FB_ATY_BACKLIGHT=y
+CONFIG_FB_RADEON_BACKLIGHT=y
+CONFIG_FB_RIVA_BACKLIGHT=y
+CONFIG_FB_NVIDIA_BACKLIGHT=y
+
+CONFIG_SND_POWERMAC=m
+CONFIG_SND_POWERMAC_AUTO_DRC=y
+CONFIG_SND_AOA=m
+CONFIG_SND_AOA_SOUNDBUS=m
+CONFIG_SND_AOA_FABRIC_LAYOUT=m
+CONFIG_SND_AOA_ONYX=m
+CONFIG_SND_AOA_TAS=m
+CONFIG_SND_AOA_TOONIE=m
+CONFIG_SND_AOA_SOUNDBUS_I2S=m
+
+CONFIG_XMON=y
+# CONFIG_XMON_DEFAULT is not set
+CONFIG_XMON_DISASSEMBLY=y
+
+CONFIG_BOOTX_TEXT=y
+CONFIG_MAC_EMUMOUSEBTN=y
+CONFIG_CAPI_EICON=y
+
+CONFIG_NVRAM=y
+
+# CONFIG_PCMCIA_M8XX is not set
+# CONFIG_SCSI_AHA1542 is not set
+# CONFIG_SCSI_IN2000 is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_NI52 is not set
+# CONFIG_NI65 is not set
+# CONFIG_LANCE is not set
+# CONFIG_3C515 is not set
+# CONFIG_ELPLUS is not set
+
+CONFIG_MEMORY_HOTPLUG=y
+
+# Stuff which wants bus_to_virt() or virt_to_bus()
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_VIDEO_STRADIS is not set
+# CONFIG_VIDEO_ZORAN is not set
+# CONFIG_ATM_HORIZON is not set
+# CONFIG_ATM_FIRESTREAM is not set
+# CONFIG_ATM_AMBASSADOR is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+
+
+# CONFIG_PPC_EARLY_DEBUG is not set
+
+# CONFIG_PMAC_BACKLIGHT_LEGACY is not set
+CONFIG_LEDS_TRIGGER_TIMER=m
+CONFIG_LEDS_TRIGGER_HEARTBEAT=m
+CONFIG_LEDS_TRIGGER_GPIO=m
+
+# FIXME: Should depend on IA64/x86
+# CONFIG_SGI_IOC4 is not set
+
+CONFIG_PPC_EFIKA=y
+CONFIG_PPC_MEDIA5200=y
+
+# CONFIG_PPC_LITE5200 is not set
+CONFIG_PPC_BESTCOMM=y
+CONFIG_PMAC_RACKMETER=m
+CONFIG_USB_OHCI_HCD_PPC_SOC=y
+CONFIG_USB_OHCI_HCD_PCI=y
+CONFIG_USB_OHCI_HCD_PPC_OF=y
+CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
+CONFIG_USB_OHCI_HCD_PPC_OF_LE=y
+
+CONFIG_SERIAL_UARTLITE=m
+CONFIG_SERIAL_UARTLITE_CONSOLE=y
+
+CONFIG_SENSORS_AMS=m
+CONFIG_SENSORS_AMS_PMU=y
+CONFIG_SENSORS_AMS_I2C=y
+
+CONFIG_IDE=y
+CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_IDE_SATA is not set
+# CONFIG_BLK_DEV_IDECS is not set
+CONFIG_BLK_DEV_IDECD=m
+# CONFIG_BLK_DEV_IDETAPE is not set
+CONFIG_IDE_TASK_IOCTL=y
+#
+# IDE chipset support/bugfixes
+#
+# CONFIG_IDE_GENERIC is not set
+# CONFIG_BLK_DEV_IDEPNP is not set
+# CONFIG_BLK_DEV_IDEPCI 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_CMD64X is not set
+# CONFIG_BLK_DEV_TRIFLEX is not set
+# CONFIG_BLK_DEV_CY82C693 is not set
+# CONFIG_BLK_DEV_CS5520 is not set
+# CONFIG_BLK_DEV_CS5530 is not set
+# CONFIG_BLK_DEV_HPT366 is not set
+# CONFIG_BLK_DEV_JMICRON is not set
+# CONFIG_BLK_DEV_SC1200 is not set
+# CONFIG_BLK_DEV_PIIX is not set
+# CONFIG_BLK_DEV_IT821X is not set
+# CONFIG_BLK_DEV_NS87415 is not set
+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
+# CONFIG_BLK_DEV_SVWKS is not set
+# CONFIG_BLK_DEV_SIIMAGE is not set
+# CONFIG_BLK_DEV_SL82C105 is not set
+# CONFIG_BLK_DEV_SLC90E66 is not set
+# CONFIG_BLK_DEV_TRM290 is not set
+# CONFIG_BLK_DEV_VIA82CXXX is not set
+CONFIG_BLK_DEV_IDE_PMAC=y
+CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_BLK_DEV_HD is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+CONFIG_MTD_PHYSMAP_OF=m
+CONFIG_IDE_PROC_FS=y
+CONFIG_MACINTOSH_DRIVERS=y
+
+CONFIG_PPC_PASEMI_MDIO=m
+CONFIG_SPU_FS_64K_LS=y
+CONFIG_PPC_PASEMI_CPUFREQ=y
+CONFIG_PMAC_APM_EMU=m
+CONFIG_HW_RANDOM_PASEMI=m
+
+CONFIG_EDAC=y
+# CONFIG_EDAC_DEBUG is not set
+CONFIG_EDAC_MM_EDAC=m
+CONFIG_EDAC_PASEMI=m
+CONFIG_EDAC_AMD8131=m
+CONFIG_EDAC_AMD8111=m
+
+CONFIG_AXON_RAM=m
+CONFIG_OPROFILE_CELL=y
+
+CONFIG_SUSPEND_FREEZER=y
+# CONFIG_IDEPCI_PCIBUS_ORDER is not set
+CONFIG_PATA_PLATFORM=m
+CONFIG_PATA_OF_PLATFORM=m
+CONFIG_USB_EHCI_HCD_PPC_OF=y
+
+# CONFIG_MPC5121_ADS is not set
+# CONFIG_MPC5121_GENERIC is not set
+CONFIG_MTD_OF_PARTS=m
+# CONFIG_MTD_NAND_FSL_ELBC is not set
+CONFIG_THERMAL=y
+
+# CONFIG_MEMORY_HOTREMOVE is not set
+
+CONFIG_DMADEVICES=y
+# CONFIG_FSL_DMA is not set
+
+CONFIG_SND_PPC=y
+
+CONFIG_PPC_82xx=y
+CONFIG_PPC_83xx=y
+CONFIG_PPC_86xx=y
+CONFIG_EXTRA_TARGETS=""
+# CONFIG_CODE_PATCHING_SELFTEST is not set
+# CONFIG_FTR_FIXUP_SELFTEST is not set
+
+# CONFIG_MATH_EMULATION is not set
+# CONFIG_RAPIDIO is not set
+# CONFIG_FS_ENET is not set
+# CONFIG_UCC_GETH is not set
+# CONFIG_KEYBOARD_MATRIX is not set
+# CONFIG_SERIAL_CPM is not set
+# CONFIG_SERIAL_QE is not set
+# CONFIG_I2C_CPM is not set
+
+
+CONFIG_SERIO_XILINX_XPS_PS2=m
+
+# CONFIG_PPC_SMLPAR is not set
+
+CONFIG_MGCOGE=y
+CONFIG_GEF_SBC610=y
+CONFIG_GEF_PPC9A=y
+CONFIG_GEF_SBC310=y
+
+CONFIG_QUICC_ENGINE=y
+CONFIG_QE_GPIO=y
+CONFIG_MPC8xxx_GPIO=y
+
+CONFIG_IDE_GD=y
+CONFIG_IDE_GD_ATA=y
+CONFIG_IDE_GD_ATAPI=y
+
+CONFIG_MCU_MPC8349EMITX=m
+
+CONFIG_GPIO_XILINX=y
+
+CONFIG_PMIC_DA903X=y
+CONFIG_BACKLIGHT_DA903X=m
+CONFIG_LEDS_DA903X=m
+
+CONFIG_MSI_BITMAP_SELFTEST=y
+
+CONFIG_RELOCATABLE=y
+
+# CONFIG_HVC_UDBG is not set
+CONFIG_PRINT_STACK_DEPTH=64
+
+CONFIG_BATTERY_DA9030=m
+# CONFIG_TWL4030_CORE is not set
+
+CONFIG_BLK_DEV_IT8172=m
+CONFIG_TOUCHSCREEN_DA9034=m
+
+CONFIG_SIMPLE_GPIO=y
+
+CONFIG_FSL_PQ_MDIO=m
+
+CONFIG_PS3_VRAM=m
+CONFIG_MDIO_GPIO=m
+CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL=m
+# CONFIG_DEBUG_GPIO is not set
+CONFIG_GPIO_PCA953X=m
+CONFIG_GPIO_PCF857X=m
+
+# CONFIG_USB_FHCI_HCD is not set
+# CONFIG_FHCI_DEBUG is not set
+
+# CONFIG_DRM_RADEON_KMS is not set
+
+# CONFIG_AMIGAONE is not set
+
+CONFIG_PPC_OF_BOOT_TRAMPOLINE=y
+
+CONFIG_DTL=y
+
+CONFIG_MMC_SDHCI_OF=m
+
+# CONFIG_CONSISTENT_SIZE_BOOL is not set
+
+CONFIG_CAN_SJA1000_OF_PLATFORM=m
+
+CONFIG_PPC_EMULATED_STATS=y
+
+CONFIG_SWIOTLB=y
+
+# CONFIG_RDS is not set
+
+CONFIG_PPC_DISABLE_WERROR=y
+
+CONFIG_XILINX_LL_TEMAC=m
+CONFIG_XILINX_EMACLITE=m
+
+CONFIG_GPIO_WM831X=m
+# CONFIG_GPIO_LANGWELL is not set
+# CONFIG_GPIO_UCB1400 is not set
+CONFIG_EDAC_MPC85XX=m
+
+CONFIG_NR_IRQS=512
+CONFIG_SPARSE_IRQ=y
+
+CONFIG_PPC_MPC5200_LPBFIFO=m
+CONFIG_CAN_MSCAN=m
+CONFIG_CAN_MPC5XXX=m
+CONFIG_PATA_MACIO=m
+CONFIG_SERIAL_GRLIB_GAISLER_APBUART=m
+# CONFIG_PMIC_ADP5520 is not set
+# CONFIG_MFD_88PM8607 is not set
+# CONFIG_XPS_USB_HCD_XILINX is not set
+# CONFIG_MMC_SDHCI_OF_ESDHC is not set
+# CONFIG_MMC_SDHCI_OF_HLWD is not set
+
+# CONFIG_MFD_TC35892 is not set
+
+# CONFIG_GPIO_SCH is not set
+
+# CONFIG_PPC_MPC512x is not set
+
+CONFIG_MPC512X_DMA=m
+
+CONFIG_KVM_GUEST=y
+
+# CONFIG_IMA is not set
+# CONFIG_TCG_TPM is not set
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/config-powerpc32-generic b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-powerpc32-generic
new file mode 100644
index 000000000..daa06ab57
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-powerpc32-generic
@@ -0,0 +1,186 @@
+# CONFIG_SMP is not set
+CONFIG_PPC32=y
+# CONFIG_PPC64 is not set
+# CONFIG_RTAS_PROC is not set
+# CONFIG_PCMCIA_M8XX is not set
+# CONFIG_HOTPLUG_PCI is not set
+CONFIG_CPU_FREQ_PMAC=y
+CONFIG_PPC_CHRP=y
+CONFIG_PPC_PMAC=y
+CONFIG_PPC_MPC52xx=y
+CONFIG_PPC_PREP=y
+
+# CONFIG_PPC_MPC5200_SIMPLE is not set
+CONFIG_SATA_FSL=m
+# CONFIG_SATA_NV is not set
+
+# busted in .28git1
+# ERROR: "cacheable_memzero" [drivers/net/gianfar_driver.ko] undefined!
+# CONFIG_GIANFAR is not set
+CONFIG_USB_EHCI_FSL=y
+
+CONFIG_PMAC_APM_EMU=y
+CONFIG_PMAC_BACKLIGHT=y
+
+CONFIG_HIGHMEM=y
+# CONFIG_HIGHMEM_START_BOOL is not set
+# CONFIG_LOWMEM_SIZE_BOOL is not set
+# CONFIG_TASK_SIZE_BOOL is not set
+# CONFIG_KERNEL_START_BOOL is not set
+# CONFIG_PPC601_SYNC_FIX is not set
+CONFIG_ADVANCED_OPTIONS=y
+CONFIG_SCSI_MESH=m
+CONFIG_SCSI_MESH_SYNC_RATE=5
+CONFIG_SCSI_MESH_RESET_DELAY_MS=4000
+
+CONFIG_SCSI_MAC53C94=m
+CONFIG_ADB_CUDA=y
+CONFIG_ADB_MACIO=y
+CONFIG_INPUT_ADBHID=y
+CONFIG_ADB_PMU_LED=y
+CONFIG_ADB_PMU_LED_IDE=y
+
+CONFIG_PMAC_MEDIABAY=y
+CONFIG_BMAC=m
+CONFIG_MACE=m
+# CONFIG_MACE_AAUI_PORT is not set
+CONFIG_MV643XX_ETH=m
+CONFIG_I2C_HYDRA=m
+CONFIG_I2C_MPC=m
+CONFIG_THERM_WINDTUNNEL=m
+CONFIG_THERM_ADT746X=m
+# CONFIG_ANSLCD is not set
+
+CONFIG_FB_PLATINUM=y
+CONFIG_FB_VALKYRIE=y
+CONFIG_FB_CT65550=y
+# CONFIG_BDI_SWITCH is not set
+
+CONFIG_MAC_FLOPPY=m
+# CONFIG_BLK_DEV_FD is not set
+
+CONFIG_FB_ATY128=y
+CONFIG_FB_ATY=y
+CONFIG_FB_MATROX=y
+# CONFIG_KEXEC is not set
+
+# CONFIG_HVC_RTAS is not set
+
+# CONFIG_UDBG_RTAS_CONSOLE is not set
+CONFIG_BRIQ_PANEL=m
+
+# CONFIG_ATA_PIIX is not set
+# CONFIG_PATA_AMD is not set
+# CONFIG_PATA_ATIIXP is not set
+CONFIG_PATA_MPC52xx=m
+# CONFIG_PATA_MPIIX is not set
+# CONFIG_PATA_OLDPIIX is not set
+# CONFIG_PATA_OPTI is not set
+# CONFIG_PATA_SERVERWORKS is not set
+
+CONFIG_SERIAL_MPC52xx=y
+CONFIG_SERIAL_MPC52xx_CONSOLE=y
+CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=115200
+# CONFIG_MPC5200_WDT is not set
+CONFIG_8xxx_WDT=m
+CONFIG_GEF_WDT=m
+
+CONFIG_PPC_MPC5200_BUGFIX=y
+CONFIG_FEC_MPC52xx=m
+#CHECK: This may later become a tristate.
+CONFIG_FEC_MPC52xx_MDIO=y
+CONFIG_PPC_MPC5200_GPIO=y
+CONFIG_MDIO_GPIO=m
+
+CONFIG_SERIAL_OF_PLATFORM=y
+CONFIG_DEBUG_STACKOVERFLOW=y
+
+# CONFIG_EMBEDDED6xx is not set
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+
+# CONFIG_BLK_DEV_PLATFORM is not set
+# CONFIG_BLK_DEV_4DRIVES is not set
+# CONFIG_BLK_DEV_ALI14XX is not set
+# CONFIG_BLK_DEV_DTC2278 is not set
+# CONFIG_BLK_DEV_HT6560B is not set
+# CONFIG_BLK_DEV_QD65XX is not set
+# CONFIG_BLK_DEV_UMC8672 is not set
+
+# CONFIG_VIRQ_DEBUG is not set
+
+CONFIG_PPC_BESTCOMM_ATA=m
+CONFIG_PPC_BESTCOMM_FEC=m
+CONFIG_PPC_BESTCOMM_GEN_BD=m
+
+CONFIG_FORCE_MAX_ZONEORDER=11
+# CONFIG_PAGE_OFFSET_BOOL is not set
+# CONFIG_FB_FSL_DIU is not set
+CONFIG_IRQSTACKS=y
+CONFIG_VIRTUALIZATION=y
+
+# CONFIG_DEBUG_GPIO is not set
+# CONFIG_GPIO_PCA953X is not set
+# CONFIG_GPIO_PCF857X is not set
+# CONFIG_HTC_EGPIO is not set
+
+# CONFIG_TIFM_CORE is not set
+
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_CISS_SCSI_TAPE is not set
+
+# CONFIG_I2C_NFORCE2 is not set
+
+# CONFIG_SND_INTEL8X0 is not set
+# CONFIG_SND_INTEL8X0M is not set
+
+# CONFIG_MEMSTICK is not set
+
+# CONFIG_IPMI_HANDLER is not set
+
+# PPC gets sad with debug alloc (bz 448598)
+# CONFIG_DEBUG_PAGEALLOC is not set
+
+CONFIG_SND_ISA=y
+CONFIG_CRYPTO_DEV_TALITOS=m
+
+CONFIG_FSL_EMB_PERFMON=y
+CONFIG_MPC8272_ADS=y
+CONFIG_PQ2FADS=y
+CONFIG_EP8248E=y
+CONFIG_MPC830x_RDB=y
+CONFIG_MPC831x_RDB=y
+CONFIG_MPC832x_MDS=y
+CONFIG_MPC832x_RDB=y
+CONFIG_MPC834x_MDS=y
+CONFIG_MPC834x_ITX=y
+CONFIG_MPC836x_MDS=y
+CONFIG_MPC836x_RDK=y
+CONFIG_MPC837x_MDS=y
+CONFIG_MPC837x_RDB=y
+CONFIG_SBC834x=y
+CONFIG_ASP834x=y
+CONFIG_KMETER1=y
+CONFIG_MPC8641_HPCN=y
+CONFIG_SBC8641D=y
+CONFIG_MPC8610_HPCD=y
+
+# CONFIG_USB_MUSB_HDRC is not set
+
+# busted in 2.6.27
+# drivers/mtd/maps/sbc8240.c: In function 'init_sbc8240_mtd':
+# drivers/mtd/maps/sbc8240.c:172: warning: passing argument 1 of 'simple_map_init' from incompatible pointer type
+# drivers/mtd/maps/sbc8240.c:177: error: 'struct mtd_info' has no member named 'module'
+
+CONFIG_MTD_NAND_FSL_UPM=m
+
+CONFIG_RCU_FANOUT=32
+
+CONFIG_PERF_COUNTERS=y
+CONFIG_PERF_EVENTS=y
+CONFIG_EVENT_PROFILE=y
+
+CONFIG_KVM_BOOK3S_32=m
+
+### needs non-existant readq/writeq
+# CONFIG_SCSI_QLA_ISCSI is not set
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/config-powerpc32-smp b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-powerpc32-smp
new file mode 100644
index 000000000..e60f59cdf
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-powerpc32-smp
@@ -0,0 +1,4 @@
+CONFIG_SMP=y
+# CONFIG_HOTPLUG_CPU is not set
+CONFIG_NR_CPUS=4
+# CONFIG_BATTERY_PMU is not set
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/config-powerpc64 b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-powerpc64
new file mode 100644
index 000000000..2946a0686
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-powerpc64
@@ -0,0 +1,186 @@
+CONFIG_WINDFARM_PM81=y
+CONFIG_WINDFARM_PM91=y
+CONFIG_WINDFARM_PM121=y
+CONFIG_PPC_PMAC64=y
+CONFIG_PPC_MAPLE=y
+CONFIG_PPC_CELL=y
+CONFIG_PPC_IBM_CELL_BLADE=y
+CONFIG_PPC_ISERIES=y
+CONFIG_PPC_PSERIES=y
+CONFIG_PPC_PMAC=y
+CONFIG_PPC_PASEMI=y
+# CONFIG_PPC_PASEMI_IOMMU_DMA_FORCE is not set
+CONFIG_PPC_PS3=y
+CONFIG_PPC_CELLEB=y
+CONFIG_PPC_CELL_QPACE=y
+CONFIG_PS3_HTAB_SIZE=20
+# CONFIG_PS3_DYNAMIC_DMA is not set
+CONFIG_PS3_ADVANCED=y
+CONFIG_PS3_HTAB_SIZE=20
+# CONFIG_PS3_DYNAMIC_DMA is not set
+CONFIG_PS3_VUART=y
+CONFIG_PS3_PS3AV=y
+CONFIG_PS3_STORAGE=m
+CONFIG_PS3_DISK=m
+CONFIG_PS3_ROM=m
+CONFIG_PS3_FLASH=m
+CONFIG_PS3_LPM=y
+CONFIG_SND_PS3=m
+CONFIG_SND_PS3_DEFAULT_START_DELAY=1000
+CONFIG_GELIC_NET=m
+CONFIG_GELIC_WIRELESS=y
+CONFIG_GELIC_WIRELESS_OLD_PSK_INTERFACE=y
+CONFIG_CBE_THERM=m
+CONFIG_CBE_CPUFREQ=m
+CONFIG_CBE_CPUFREQ_PMI=m
+CONFIG_CBE_CPUFREQ_PMI_ENABLE=y
+CONFIG_PMAC_RACKMETER=m
+CONFIG_IBMEBUS=y
+CONFIG_SPU_FS=m
+CONFIG_RTAS_FLASH=y
+CONFIG_PPC_SPLPAR=y
+CONFIG_SCANLOG=y
+CONFIG_LPARCFG=y
+CONFIG_SERIAL_ICOM=m
+CONFIG_HVCS=m
+CONFIG_HVC_CONSOLE=y
+CONFIG_HOTPLUG_PCI=y
+CONFIG_THERM_PM72=y
+CONFIG_IBMVETH=m
+CONFIG_SCSI_IBMVSCSI=m
+# CONFIG_HOTPLUG_PCI_CPCI is not set
+CONFIG_HOTPLUG_PCI_SHPC=m
+CONFIG_HOTPLUG_PCI_RPA=m
+CONFIG_HOTPLUG_PCI_RPA_DLPAR=y
+CONFIG_ADB_PMU_LED=y
+CONFIG_ADB_PMU_LED_IDE=y
+CONFIG_PMAC_SMU=y
+CONFIG_CPU_FREQ_PMAC64=y
+CONFIG_SCSI_IPR=m
+CONFIG_SCSI_IPR_TRACE=y
+CONFIG_SCSI_IPR_DUMP=y
+CONFIG_SPIDER_NET=m
+CONFIG_HVC_RTAS=y
+CONFIG_HVC_ISERIES=y
+CONFIG_CBE_RAS=y
+
+# iSeries device drivers
+#
+CONFIG_ISERIES_VETH=m
+CONFIG_VIODASD=m
+CONFIG_VIOCD=m
+CONFIG_VIOTAPE=m
+
+CONFIG_PASEMI_MAC=m
+CONFIG_SERIAL_OF_PLATFORM=m
+
+CONFIG_PPC_PASEMI_IOMMU=y
+CONFIG_SERIAL_TXX9=y
+CONFIG_SERIAL_TXX9_NR_UARTS=6
+CONFIG_SERIAL_TXX9_CONSOLE=y
+
+CONFIG_HVC_BEAT=y
+
+CONFIG_FB_PS3=y
+CONFIG_FB_PS3_DEFAULT_SIZE_M=18
+
+CONFIG_PPC_PMI=m
+CONFIG_PS3_SYS_MANAGER=y
+# CONFIG_BLK_DEV_CELLEB is not set
+
+CONFIG_PATA_SCC=m
+
+CONFIG_APM_EMULATION=m
+
+CONFIG_PPC64=y
+CONFIG_VIRT_CPU_ACCOUNTING=y
+CONFIG_NR_CPUS=128
+# CONFIG_FB_PLATINUM is not set
+# CONFIG_FB_VALKYRIE is not set
+# CONFIG_FB_CT65550 is not set
+# CONFIG_FB_VGA16 is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_ATY is not set
+
+# CONFIG_POWER4_ONLY is not set
+
+CONFIG_RTAS_PROC=y
+CONFIG_IOMMU_VMERGE=y
+CONFIG_NUMA=y
+# CONFIG_PPC_64K_PAGES is not set
+CONFIG_SCHED_SMT=y
+
+# CONFIG_MV643XX_ETH is not set
+CONFIG_IRQSTACKS=y
+CONFIG_DEBUG_STACKOVERFLOW=y
+# CONFIG_INPUT_PCSPKR is not set
+
+CONFIG_EHEA=m
+CONFIG_INFINIBAND_EHCA=m
+
+CONFIG_HCALL_STATS=y
+
+CONFIG_XMON_DISASSEMBLY=y
+
+CONFIG_SCSI_IBMVSCSIS=m
+
+CONFIG_SECCOMP=y
+
+# CONFIG_TUNE_CELL is not set
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+# CONFIG_BLK_DEV_PLATFORM is not set
+CONFIG_IBM_NEW_EMAC=m
+CONFIG_IBM_NEW_EMAC_RXB=128
+CONFIG_IBM_NEW_EMAC_TXB=64
+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
+
+# CONFIG_VIRQ_DEBUG is not set
+CONFIG_ELECTRA_CF=m
+
+CONFIG_MTD_NAND_PASEMI=m
+CONFIG_EDAC_CELL=m
+CONFIG_EDAC_CPC925=m
+CONFIG_FRAME_WARN=2048
+
+CONFIG_PHYP_DUMP=y
+CONFIG_FORCE_MAX_ZONEORDER=13
+CONFIG_VIRTUALIZATION=y
+
+CONFIG_VSX=y
+
+CONFIG_SCSI_IBMVFC=m
+# CONFIG_SCSI_IBMVFC_TRACE is not set
+CONFIG_IBM_BSR=m
+
+CONFIG_SERIO_XILINX_XPS_PS2=m
+
+CONFIG_PPC_IBM_CELL_RESETBUTTON=y
+CONFIG_PPC_IBM_CELL_POWERBUTTON=m
+CONFIG_CBE_CPUFREQ_SPU_GOVERNOR=m
+
+CONFIG_RTC_DRV_PS3=y
+
+CONFIG_CRASH_DUMP=y
+CONFIG_RELOCATABLE=y
+
+CONFIG_RCU_FANOUT=64
+
+CONFIG_PERF_COUNTERS=y
+CONFIG_PERF_EVENTS=y
+CONFIG_EVENT_PROFILE=y
+
+CONFIG_KVM_BOOK3S_64=m
+# CONFIG_KVM_EXIT_TIMING is not set
+
+#-- bz#607175
+#-- active memory sharing
+CONFIG_PPC_SMLPAR=y
+CONFIG_CMM=y
+#-- DLPAR memory remove
+# CONFIG_SPARSEMEM_VMEMMAP is not set
+
+CONFIG_PSERIES_ENERGY=m
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/config-rhel-generic b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-rhel-generic
new file mode 100644
index 000000000..e8ee6e6ac
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-rhel-generic
@@ -0,0 +1,203 @@
+# CONFIG_ISA is not set
+# CONFIG_ISAPNP is not set
+# CONFIG_I2C_PCA_ISA is not set
+
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_AHA1542 is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_IN2000 is not set
+# CONFIG_SCSI_QLOGIC_FAS is not set
+# CONFIG_SCSI_DC390T is not set
+
+# CONFIG_ATALK is not set
+# CONFIG_DEV_APPLETALK is not set
+# CONFIG_LTPC is not set
+# CONFIG_COPS is not set
+# CONFIG_IPX is not set
+# CONFIG_IPDDP is not set
+# CONFIG_DECNET is not set
+# CONFIG_PLIP is not set
+
+# CONFIG_PCMCIA_AHA152X is not set
+# CONFIG_PCMCIA_NINJA_SCSI is not set
+# CONFIG_PCMCIA_QLOGIC is not set
+# CONFIG_PCMCIA_SYM53C500 is not set
+
+# CONFIG_EL2 is not set
+# CONFIG_ELPLUS is not set
+# CONFIG_WD80x3 is not set
+# CONFIG_I82092 is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_SUNDANCE is not set
+# CONFIG_ULTRA is not set
+# CONFIG_SKFP is not set
+# CONFIG_DE600 is not set
+# CONFIG_DE620 is not set
+# CONFIG_CS89x0 is not set
+# CONFIG_AC3200 is not set
+# CONFIG_NI52 is not set
+# CONFIG_NI65 is not set
+# CONFIG_LANCE is not set
+# CONFIG_EL16 is not set
+# CONFIG_EL3 is not set
+# CONFIG_3C515 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_HP100 is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_NET_SB1000 is not set
+# CONFIG_DEPCA is not set
+# CONFIG_ATP is not set
+
+# CONFIG_TR is not set
+
+# CONFIG_GAMEPORT is not set
+
+# CONFIG_SND_AD1816A is not set
+# CONFIG_SND_AD1848 is not set
+# CONFIG_SND_CS4231 is not set
+# CONFIG_SND_CS4236 is not set
+# CONFIG_SND_ES968 is not set
+# CONFIG_SND_ES1688 is not set
+# CONFIG_SND_ES18XX is not set
+# CONFIG_SND_GUSCLASSIC is not set
+# CONFIG_SND_GUSEXTREME is not set
+# CONFIG_SND_GUSMAX is not set
+# CONFIG_SND_INTERWAVE is not set
+# CONFIG_SND_INTERWAVE_STB 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_MIRO is not set
+# CONFIG_SND_SB8 is not set
+# CONFIG_SND_SB16 is not set
+# CONFIG_SND_SBAWE is not set
+# CONFIG_SND_SB16_CSP is not set
+# CONFIG_SND_WAVEFRONT is not set
+# CONFIG_SND_ALS100 is not set
+# CONFIG_SND_AZT2320 is not set
+# CONFIG_SND_CMI8330 is not set
+# CONFIG_SND_DT019X is not set
+# CONFIG_SND_OPL3SA2 is not set
+# CONFIG_SND_SGALAXY is not set
+# CONFIG_SND_SSCAPE is not set
+
+# CONFIG_WAN_ROUTER is not set
+
+# CONFIG_BINFMT_AOUT is not set
+
+# CONFIG_DRM_TDFX is not set
+# CONFIG_DRM_SIS is not set
+
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+
+# CONFIG_I2O is not set
+
+# CONFIG_MWAVE is not set
+
+# CONFIG_ROCKETPORT is not set
+# CONFIG_R3964 is not set
+
+# CONFIG_JOYSTICK_ANALOG is not set
+# CONFIG_JOYSTICK_A3D is not set
+# CONFIG_JOYSTICK_ADI is not set
+# CONFIG_JOYSTICK_COBRA is not set
+# CONFIG_JOYSTICK_GF2K is not set
+# CONFIG_JOYSTICK_GRIP is not set
+# CONFIG_JOYSTICK_GRIP_MP is not set
+# CONFIG_JOYSTICK_GUILLEMOT is not set
+# CONFIG_JOYSTICK_INTERACT is not set
+# CONFIG_JOYSTICK_SIDEWINDER is not set
+# CONFIG_JOYSTICK_TMDC is not set
+# CONFIG_JOYSTICK_IFORCE is not set
+# CONFIG_JOYSTICK_WARRIOR is not set
+# CONFIG_JOYSTICK_MAGELLAN is not set
+# CONFIG_JOYSTICK_SPACEORB is not set
+# CONFIG_JOYSTICK_SPACEBALL is not set
+# CONFIG_JOYSTICK_STINGER is not set
+# CONFIG_JOYSTICK_DB9 is not set
+# CONFIG_JOYSTICK_GAMECON is not set
+# CONFIG_JOYSTICK_TURBOGRAFX is not set
+
+# CONFIG_RADIO_CADET is not set
+# CONFIG_RADIO_RTRACK is not set
+# CONFIG_RADIO_RTRACK2 is not set
+# CONFIG_RADIO_AZTECH is not set
+# CONFIG_RADIO_GEMTEK is not set
+# CONFIG_RADIO_GEMTEK_PCI is not set
+# CONFIG_RADIO_MAXIRADIO is not set
+# CONFIG_RADIO_MAESTRO is not set
+# CONFIG_RADIO_MIROPCM20 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_VIDEO_PMS is not set
+# CONFIG_VIDEO_BWQCAM is not set
+# CONFIG_VIDEO_CQCAM is not set
+# CONFIG_VIDEO_W9966 is not set
+# CONFIG_VIDEO_CPIA is not set
+# CONFIG_VIDEO_CPIA_PP is not set
+# CONFIG_VIDEO_CPIA_USB is not set
+# CONFIG_VIDEO_SAA5249 is not set
+# CONFIG_VIDEO_STRADIS is not set
+# CONFIG_VIDEO_ZORAN is not set
+# CONFIG_VIDEO_ZORAN_BUZ is not set
+# CONFIG_VIDEO_ZORAN_DC10 is not set
+# CONFIG_VIDEO_ZORAN_DC30 is not set
+# CONFIG_VIDEO_ZORAN_LML33 is not set
+# CONFIG_VIDEO_ZORAN_LML33R10 is not set
+# CONFIG_VIDEO_MEYE is not set
+# CONFIG_VIDEO_SAA7134 is not set
+# CONFIG_VIDEO_MXB is not set
+# CONFIG_VIDEO_HEXIUM_ORION is not set
+# CONFIG_VIDEO_HEXIUM_GEMINI is not set
+# CONFIG_VIDEO_CX88 is not set
+# CONFIG_VIDEO_SAA5246A is not set
+
+# CONFIG_INFTL is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PCI is not set
+
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_HGA is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_HGA_ACCEL is not set
+# CONFIG_FB_3DFX_ACCEL is not set
+
+# CONFIG_JFS_FS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_9P_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/config-s390x b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-s390x
new file mode 100644
index 000000000..780fc9146
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-s390x
@@ -0,0 +1,235 @@
+CONFIG_64BIT=y
+# CONFIG_MARCH_G5 is not set
+# CONFIG_MARCH_Z900 is not set
+CONFIG_MARCH_Z9_109=y
+# CONFIG_MARCH_Z990 is not set
+
+CONFIG_NR_CPUS=64
+CONFIG_COMPAT=y
+
+# See bug 496596
+CONFIG_HZ_100=y
+# CONFIG_HZ_1000 is not set
+# See bug 496605
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+
+CONFIG_MMU=y
+
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_NO_IDLE_HZ=y
+
+CONFIG_SMP=y
+
+#
+# I/O subsystem configuration
+#
+CONFIG_QDIO=m
+
+#
+# Misc
+#
+CONFIG_IPL=y
+# CONFIG_IPL_TAPE is not set
+CONFIG_IPL_VM=y
+# CONFIG_PROCESS_DEBUG is not set
+CONFIG_PFAULT=y
+CONFIG_SHARED_KERNEL=y
+CONFIG_CMM=m
+CONFIG_CMM_PROC=y
+# CONFIG_NETIUCV is not set
+CONFIG_SMSGIUCV=m
+
+#
+# SCSI low-level drivers
+#
+CONFIG_ZFCP=m
+CONFIG_ZFCPDUMP=y
+CONFIG_CCW=y
+
+#
+# S/390 block device drivers
+#
+CONFIG_DCSSBLK=m
+CONFIG_BLK_DEV_XPRAM=m
+CONFIG_DASD=m
+CONFIG_DASD_PROFILE=y
+CONFIG_DASD_ECKD=m
+CONFIG_DASD_FBA=m
+CONFIG_DASD_DIAG=m
+CONFIG_DASD_EER=y
+
+#
+# S/390 character device drivers
+#
+CONFIG_TN3270=y
+CONFIG_TN3270_CONSOLE=y
+CONFIG_TN3215=y
+CONFIG_TN3215_CONSOLE=y
+CONFIG_CCW_CONSOLE=y
+CONFIG_SCLP_TTY=y
+CONFIG_SCLP_CONSOLE=y
+CONFIG_SCLP_VT220_TTY=y
+CONFIG_SCLP_VT220_CONSOLE=y
+CONFIG_SCLP_CPI=m
+CONFIG_SCLP_ASYNC=m
+CONFIG_S390_TAPE=m
+CONFIG_S390_TAPE_3590=m
+
+CONFIG_APPLDATA_BASE=y
+CONFIG_APPLDATA_MEM=m
+CONFIG_APPLDATA_OS=m
+CONFIG_APPLDATA_NET_SUM=m
+CONFIG_TN3270_TTY=y
+CONFIG_TN3270_FS=m
+
+
+#
+# S/390 tape interface support
+#
+CONFIG_S390_TAPE_BLOCK=y
+
+#
+# S/390 tape hardware support
+#
+CONFIG_S390_TAPE_34XX=m
+
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+
+#
+# Token Ring devices
+#
+CONFIG_TR=y
+CONFIG_NETCONSOLE=m
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# S/390 network device drivers
+#
+CONFIG_LCS=m
+CONFIG_CTC=m
+CONFIG_IUCV=m
+CONFIG_QETH=m
+CONFIG_QETH_IPV6=y
+CONFIG_CCWGROUP=m
+
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_MAC80211 is not set
+# CONFIG_B44 is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_OSF_PARTITION is not set
+CONFIG_IBM_PARTITION=y
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+
+
+#
+# S390 crypto hw
+#
+CONFIG_CRYPTO_SHA1_S390=m
+CONFIG_CRYPTO_SHA256_S390=m
+CONFIG_CRYPTO_DES_S390=m
+CONFIG_CRYPTO_AES_S390=m
+
+#
+# Kernel hacking
+#
+
+#
+# S390 specific stack options; needs gcc 3.5 so off for now
+#
+CONFIG_PACK_STACK=y
+CONFIG_CHECK_STACK=y
+# CONFIG_WARN_STACK is not set
+# CONFIG_SMALL_STACK is not set
+
+CONFIG_ZVM_WATCHDOG=m
+CONFIG_VMLOGRDR=m
+CONFIG_MONREADER=m
+
+CONFIG_VIRT_CPU_ACCOUNTING=y
+
+# CONFIG_CLAW is not set
+
+# CONFIG_ATMEL is not set
+
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_MII is not set
+
+
+CONFIG_STACK_GUARD=256
+CONFIG_CMM_IUCV=y
+
+# CONFIG_DETECT_SOFTLOCKUP is not set
+
+CONFIG_S390_HYPFS_FS=y
+
+CONFIG_MONWRITER=m
+CONFIG_ZCRYPT=m
+CONFIG_ZCRYPT_MONOLITHIC=y
+
+CONFIG_S390_EXEC_PROTECT=y
+CONFIG_AFIUCV=m
+CONFIG_S390_PRNG=m
+
+CONFIG_S390_VMUR=m
+
+# CONFIG_THERMAL is not set
+
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_CTCM=m
+CONFIG_QETH_L2=m
+CONFIG_QETH_L3=m
+CONFIG_CRYPTO_SHA512_S390=m
+CONFIG_VIRTUALIZATION=y
+CONFIG_KVM=m
+CONFIG_S390_GUEST=y
+
+
+CONFIG_MEMORY_HOTPLUG=y
+CONFIG_MEMORY_HOTREMOVE=y
+CONFIG_CHSC_SCH=m
+
+# drivers/isdn/hardware/mISDN/hfcmulti.c:5255:2: error: #error "not running on big endian machines now"
+# CONFIG_MISDN_HFCMULTI is not set
+
+CONFIG_HVC_IUCV=y
+
+CONFIG_RCU_FANOUT=64
+
+CONFIG_SECCOMP=y
+
+CONFIG_PM=y
+CONFIG_HIBERNATION=y
+CONFIG_PM_STD_PARTITION="/dev/jokes"
+
+CONFIG_PERF_COUNTERS=y
+CONFIG_PERF_EVENTS=y
+CONFIG_EVENT_PROFILE=y
+
+CONFIG_SMSGIUCV_EVENT=m
+
+# CONFIG_PREEMPT_TRACER is not set
+
+CONFIG_VMCP=y
+
+CONFIG_ZFCP_DIF=y
+
+CONFIG_SCHED_MC=y
+CONFIG_SCHED_BOOK=y
+
+CONFIG_STRICT_DEVMEM=y
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/config-sparc64-generic b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-sparc64-generic
new file mode 100644
index 000000000..dac8a644f
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-sparc64-generic
@@ -0,0 +1,209 @@
+CONFIG_SMP=y
+CONFIG_SPARC=y
+CONFIG_SPARC64=y
+CONFIG_SECCOMP=y
+CONFIG_HZ_100=y
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=100
+
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=m
+CONFIG_CPU_FREQ_DEBUG=y
+# CONFIG_CPU_FREQ_STAT is not set
+# CONFIG_CPU_FREQ_STAT_DETAILS is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_US3_FREQ=m
+CONFIG_US2E_FREQ=m
+
+CONFIG_SUN_LDOMS=y
+CONFIG_SCHED_SMT=y
+CONFIG_SCHED_MC=y
+CONFIG_64BIT=y
+# CONFIG_BBC_I2C is not set
+CONFIG_HUGETLB_PAGE_SIZE_4MB=y
+# CONFIG_HUGETLB_PAGE_SIZE_512K is not set
+# CONFIG_HUGETLB_PAGE_SIZE_64K is not set
+CONFIG_NR_CPUS=256
+CONFIG_US3_FREQ=m
+CONFIG_US2E_FREQ=m
+CONFIG_SUN_OPENPROMFS=m
+CONFIG_COMPAT=y
+CONFIG_UID16=y
+CONFIG_BINFMT_ELF32=y
+CONFIG_ENVCTRL=m
+CONFIG_DISPLAY7SEG=m
+CONFIG_WATCHDOG_CP1XXX=m
+CONFIG_WATCHDOG_RIO=m
+# CONFIG_CMDLINE_BOOL is not set
+# CONFIG_PREVENT_FIRMWARE_BUILD is not set
+# CONFIG_PARPORT is not set
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_LIRC_PARALLEL is not set
+# CONFIG_I2C_NFORCE2 is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_SIMTEC is not set
+CONFIG_I2C_ALI1535=m
+# CONFIG_VGASTATE is not set
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_BW2 is not set
+CONFIG_FB_CG3=y
+CONFIG_FB_CG6=y
+# CONFIG_FB_RIVA is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_RADEON is not set
+CONFIG_FB_ATY=y
+# CONFIG_FB_S3 is not set
+# CONFIG_FB_SAVAGE is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_TRIDENT is not set
+CONFIG_FB_SBUS=y
+CONFIG_FB_FFB=y
+# CONFIG_FB_TCX is not set
+# CONFIG_FB_CG14 is not set
+CONFIG_FB_PM2=y
+CONFIG_FB_P9100=y
+# CONFIG_FB_LEO is not set
+CONFIG_FB_XVR500=y
+CONFIG_FB_XVR2500=y
+# CONFIG_VGASTATE is not set
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_CIRRUS is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_KYRO is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM_NOUVEAU is not set
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_10x18 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_SUN8x16=y
+CONFIG_FONT_SUN12x22=y
+# CONFIG_LOGO_LINUX_CLUT224 is not set
+# CONFIG_SERIAL_8250 is not set
+CONFIG_SERIAL_SUNZILOG=y
+CONFIG_SERIAL_SUNZILOG_CONSOLE=y
+CONFIG_SERIAL_SUNSU=y
+CONFIG_SERIAL_SUNSU_CONSOLE=y
+CONFIG_SERIAL_SUNSAB=y
+CONFIG_SERIAL_SUNSAB_CONSOLE=y
+CONFIG_SERIAL_SUNHV=y
+CONFIG_SUN_OPENPROMIO=y
+CONFIG_OBP_FLASH=m
+# CONFIG_SERIO_SERPORT is not set
+CONFIG_BLK_DEV_FD=y
+CONFIG_SUNVDC=m
+CONFIG_SUNVNET=m
+# CONFIG_BLK_DEV_AEC62XX is not set
+# CONFIG_BLK_DEV_HPT366 is not set
+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
+# CONFIG_BLK_DEV_SIIMAGE is not set
+# CONFIG_BLK_DEV_SLC90E66 is not set
+# CONFIG_BLK_DEV_VIA82CXXX is not set
+# CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+CONFIG_SCSI_QLOGICPTI=m
+CONFIG_SCSI_SUNESP=m
+CONFIG_SUNLANCE=m
+CONFIG_SUNBMAC=m
+CONFIG_SUNQE=m
+# CONFIG_DM9102 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_R8169 is not set
+CONFIG_ATM_FORE200E_USE_TASKLET=y
+CONFIG_ATM_FORE200E_DEBUG=0
+CONFIG_ATM_FORE200E_TX_RETRY=16
+# CONFIG_DRM_TDFX is not set
+CONFIG_KEYBOARD_ATKBD=y
+CONFIG_KEYBOARD_SUNKBD=y
+# CONFIG_INPUT_PCSPKR is not set
+CONFIG_INPUT_SPARCSPKR=m
+# CONFIG_SOUND_PRIME is not set
+# CONFIG_SND_SUN_AMD7930 is not set
+CONFIG_SND_SUN_CS4231=m
+# CONFIG_SND_SUN_DBRI is not set
+CONFIG_PARPORT_SUNBPP=m
+CONFIG_LOGO_SUN_CLUT224=y
+CONFIG_MTD_SUN_UFLASH=m
+CONFIG_MYRI_SBUS=m
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_VIDEO_ZORAN is not set
+# CONFIG_VIDEO_STRADIS is not set
+# CONFIG_IEEE1394_SBP2 is not set
+# CONFIG_USB_NET2280 is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_DCFLUSH is not set
+# CONFIG_DEBUG_BOOTMEM is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT is not set
+# CONFIG_LOCKDEP is not set
+# CONFIG_STACK_DEBUG is not set
+
+CONFIG_SPARSEMEM_VMEMMAP=y
+
+# CONFIG_THERMAL is not set
+
+CONFIG_FRAME_WARN=2048
+
+CONFIG_NUMA=y
+
+CONFIG_SND_SPARC=y
+
+CONFIG_HW_RANDOM_N2RNG=m
+
+# drivers/isdn/hardware/mISDN/hfcmulti.c:5255:2: error: #error "not running on big endian machines now"
+# CONFIG_MISDN_HFCMULTI is not set
+
+CONFIG_US3_MC=y
+CONFIG_SENSORS_ULTRA45=m
+CONFIG_LEDS_SUNFIRE=m
+CONFIG_TADPOLE_TS102_UCTRL=m
+
+CONFIG_RCU_FANOUT=64
+
+CONFIG_LIRC_ENE0100=m
+# CONFIG_BATTERY_DS2782 is not set
+CONFIG_USB_GSPCA_SN9C20X=m
+CONFIG_USB_GSPCA_SN9C20X_EVDEV=y
+CONFIG_LSM_MMAP_MIN_ADDR=65536
+
+CONFIG_PERF_COUNTERS=y
+CONFIG_PERF_EVENTS=y
+CONFIG_EVENT_PROFILE=y
+
+CONFIG_EARLYFB=y
+CONFIG_SERIAL_GRLIB_GAISLER_APBUART=m
+
+CONFIG_GRETH=m
+CONFIG_FB_XVR1000=y
+
+CONFIG_CRYPTO_DEV_NIAGARA2=y
+
+CONFIG_JUMP_LABEL=y
+
+# CONFIG_MTD_OF_PARTS is not set
+# CONFIG_MTD_PHYSMAP_OF is not set
+# CONFIG_MMC_SDHCI_OF is not set
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/config-x86-generic b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-x86-generic
new file mode 100644
index 000000000..d6feae847
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-x86-generic
@@ -0,0 +1,546 @@
+CONFIG_UID16=y
+# CONFIG_64BIT is not set
+# CONFIG_KERNEL_LZMA is not set
+
+#
+# Processor type and features
+#
+#
+# Enable summit and co via the generic arch
+#
+CONFIG_X86_EXTENDED_PLATFORM=y
+CONFIG_X86_32_NON_STANDARD=y
+
+# CONFIG_X86_ELAN is not set
+# CONFIG_X86_NUMAQ is not set
+# CONFIG_X86_SUMMIT is not set
+CONFIG_X86_BIGSMP=y
+# CONFIG_X86_VISWS is not set
+# CONFIG_X86_RDC321X is not set
+# CONFIG_X86_ES7000 is not set
+# CONFIG_M386 is not set
+# CONFIG_M486 is not set
+# CONFIG_M586 is not set
+# CONFIG_M586TSC is not set
+# CONFIG_M586MMX is not set
+CONFIG_M686=y
+# CONFIG_MPENTIUMII is not set
+# CONFIG_MPENTIUMIII is not set
+# CONFIG_MPENTIUMM is not set
+# CONFIG_MPENTIUM4 is not set
+# CONFIG_MK6 is not set
+# CONFIG_MK7 is not set
+# CONFIG_MK8 is not set
+# CONFIG_MCRUSOE is not set
+# CONFIG_MWINCHIPC6 is not set
+# CONFIG_MWINCHIP3D is not set
+# CONFIG_MCYRIXIII is not set
+# CONFIG_MVIAC3_2 is not set
+CONFIG_SMP=y
+CONFIG_NR_CPUS=64
+CONFIG_X86_GENERIC=y
+# CONFIG_X86_PPRO_FENCE is not set
+CONFIG_HPET=y
+CONFIG_HPET_TIMER=y
+# CONFIG_HPET_MMAP is not set
+CONFIG_X86_MCE=y
+CONFIG_TOSHIBA=m
+CONFIG_I8K=m
+CONFIG_SONYPI=m
+CONFIG_SONYPI_COMPAT=y
+CONFIG_MICROCODE=m
+CONFIG_X86_MSR=y
+CONFIG_X86_CPUID=y
+CONFIG_EDD=m
+# CONFIG_EDD_OFF is not set
+# CONFIG_NUMA is not set
+
+# CONFIG_NOHIGHMEM is not set
+CONFIG_HIGHMEM4G=y
+# CONFIG_HIGHMEM64G is not set
+CONFIG_HIGHMEM=y
+CONFIG_HIGHPTE=y
+
+# CONFIG_MATH_EMULATION is not set
+CONFIG_MTRR=y
+CONFIG_X86_PAT=y
+CONFIG_X86_PM_TIMER=y
+
+CONFIG_EFI=y
+CONFIG_EFI_VARS=y
+CONFIG_EFI_PCDP=y
+CONFIG_FB_EFI=y
+# CONFIG_FB_N411 is not set
+
+CONFIG_DMAR=y
+CONFIG_DMAR_BROKEN_GFX_WA=y
+CONFIG_DMAR_FLOPPY_WA=y
+CONFIG_DMAR_DEFAULT_ON=y
+
+CONFIG_FB_GEODE=y
+CONFIG_FB_GEODE_LX=y
+CONFIG_FB_GEODE_GX=y
+# CONFIG_FB_GEODE_GX1 is not set
+
+# CONFIG_PCI_GOBIOS is not set
+# CONFIG_PCI_GODIRECT is not set
+# CONFIG_PCI_GOMMCONFIG is not set
+CONFIG_PCI_GOANY=y
+
+#
+# x86 specific drivers
+#
+CONFIG_PCMCIA_FDOMAIN=m
+CONFIG_SCSI_FUTURE_DOMAIN=m
+CONFIG_SCSI_ADVANSYS=m
+
+CONFIG_CC_STACKPROTECTOR=y
+
+CONFIG_SECCOMP=y
+
+CONFIG_CAPI_EICON=y
+
+# I2O enabled only for 32-bit x86, disabled for PAE kernel
+CONFIG_I2O=m
+CONFIG_I2O_BLOCK=m
+CONFIG_I2O_SCSI=m
+CONFIG_I2O_PROC=m
+CONFIG_I2O_CONFIG=y
+CONFIG_I2O_EXT_ADAPTEC=y
+CONFIG_I2O_CONFIG_OLD_IOCTL=y
+CONFIG_I2O_BUS=m
+
+#
+# APM (Advanced Power Management) BIOS Support
+#
+CONFIG_APM=y
+# CONFIG_APM_IGNORE_USER_SUSPEND is not set
+# CONFIG_APM_DO_ENABLE is not set
+CONFIG_APM_CPU_IDLE=y
+# CONFIG_APM_DISPLAY_BLANK is not set
+# CONFIG_APM_ALLOW_INTS is not set
+
+#
+# Kernel debugging
+#
+CONFIG_X86_MPPARSE=y
+
+CONFIG_ACPI=y
+CONFIG_ACPI_AC=y
+# CONFIG_ACPI_ASUS is not set
+CONFIG_ACPI_PROCFS_POWER=y
+CONFIG_ACPI_SYSFS_POWER=y
+CONFIG_ACPI_BATTERY=y
+CONFIG_ACPI_BLACKLIST_YEAR=1999
+CONFIG_ACPI_BUTTON=y
+CONFIG_ACPI_CONTAINER=m
+CONFIG_ACPI_DOCK=y
+CONFIG_ACPI_FAN=y
+CONFIG_ACPI_NUMA=y
+CONFIG_ACPI_PROCESSOR=y
+CONFIG_ACPI_POWER=y
+CONFIG_ACPI_PROCFS=y
+CONFIG_ACPI_SBS=m
+CONFIG_ACPI_SLEEP=y
+CONFIG_ACPI_THERMAL=y
+CONFIG_TOPSTAR_LAPTOP=m
+CONFIG_ACPI_TOSHIBA=m
+CONFIG_ACPI_VIDEO=m
+# CONFIG_ACPI_PROC_EVENT is not set
+CONFIG_PNPACPI=y
+CONFIG_ACPI_POWER_METER=m
+CONFIG_ACPI_PROCESSOR_AGGREGATOR=m
+CONFIG_ACPI_HED=m
+CONFIG_ACPI_APEI=y
+CONFIG_ACPI_APEI_GHES=m
+# CONFIG_ACPI_APEI_EINJ is not set
+CONFIG_ACPI_IPMI=m
+
+#
+# CPUFreq processor drivers
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_DEBUG=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_STAT=m
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+
+CONFIG_X86_ACPI_CPUFREQ=m
+CONFIG_X86_PCC_CPUFREQ=m
+# CONFIG_X86_POWERNOW_K6 is not set
+CONFIG_X86_POWERNOW_K7=y
+CONFIG_X86_POWERNOW_K8=m
+# CONFIG_X86_GX_SUSPMOD is not set
+# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
+CONFIG_X86_SPEEDSTEP_ICH=y
+CONFIG_X86_SPEEDSTEP_SMI=y
+CONFIG_X86_SPEEDSTEP_LIB=y
+# CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK is not set
+CONFIG_X86_P4_CLOCKMOD=m
+CONFIG_X86_LONGRUN=y
+# CONFIG_X86_LONGHAUL is not set
+# CONFIG_X86_CPUFREQ_NFORCE2 is not set
+# e_powersaver is dangerous
+# CONFIG_X86_E_POWERSAVER is not set
+
+CONFIG_X86_HT=y
+CONFIG_X86_TRAMPOLINE=y
+
+#
+# various x86 specific drivers
+#
+CONFIG_NVRAM=y
+CONFIG_IBM_ASM=m
+CONFIG_CRYPTO_AES_586=m
+CONFIG_CRYPTO_TWOFISH_586=m
+CONFIG_CRYPTO_DEV_PADLOCK=m
+CONFIG_CRYPTO_DEV_PADLOCK_AES=m
+CONFIG_CRYPTO_DEV_PADLOCK_SHA=m
+
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_SCHED_SMT=y
+CONFIG_SUSPEND=y
+CONFIG_HIBERNATION=y
+CONFIG_PM_STD_PARTITION=""
+
+CONFIG_DEBUG_RODATA=y
+CONFIG_DEBUG_STACKOVERFLOW=y
+# CONFIG_4KSTACKS is not set
+CONFIG_DEBUG_NMI_TIMEOUT=5
+
+CONFIG_PCI_DIRECT=y
+CONFIG_PCI_MMCONFIG=y
+CONFIG_PCI_BIOS=y
+
+CONFIG_HOTPLUG_PCI=y
+CONFIG_HOTPLUG_PCI_COMPAQ=m
+# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set
+CONFIG_HOTPLUG_PCI_IBM=m
+# CONFIG_HOTPLUG_PCI_CPCI is not set
+# SHPC has half-arsed PCI probing, which makes it load on too many systems
+# CONFIG_HOTPLUG_PCI_SHPC is not set
+CONFIG_PM=y
+
+CONFIG_IPW2100=m
+CONFIG_IPW2100_MONITOR=y
+CONFIG_IPW2200=m
+CONFIG_IPW2200_MONITOR=y
+CONFIG_IPW2200_RADIOTAP=y
+CONFIG_IPW2200_PROMISCUOUS=y
+CONFIG_IPW2200_QOS=y
+
+CONFIG_BLK_DEV_AMD74XX=y
+
+CONFIG_I2C_ALI1535=m
+CONFIG_I2C_ALI15X3=m
+CONFIG_I2C_ALI1563=m
+CONFIG_I2C_AMD756=m
+CONFIG_I2C_AMD756_S4882=m
+CONFIG_I2C_AMD8111=m
+CONFIG_I2C_I801=m
+CONFIG_I2C_ISCH=m
+CONFIG_I2C_NFORCE2=m
+CONFIG_I2C_NFORCE2_S4985=m
+CONFIG_I2C_PIIX4=m
+CONFIG_I2C_SIS5595=m
+CONFIG_I2C_SIS630=m
+CONFIG_I2C_SIS96X=m
+
+CONFIG_I2C_VIA=m
+CONFIG_I2C_VIAPRO=m
+
+CONFIG_SCx200_ACB=m
+
+# CONFIG_X86_REBOOTFIXUPS is not set
+
+CONFIG_DELL_RBU=m
+CONFIG_DCDBAS=m
+
+CONFIG_GPIO_SCH=m
+CONFIG_PC8736x_GPIO=m
+# CONFIG_NSC_GPIO is not set
+CONFIG_CS5535_GPIO=m
+
+CONFIG_EDAC=y
+# CONFIG_EDAC_DEBUG is not set
+CONFIG_EDAC_MM_EDAC=m
+CONFIG_EDAC_AMD76X=m
+CONFIG_EDAC_E7XXX=m
+CONFIG_EDAC_E752X=m
+CONFIG_EDAC_I82860=m
+CONFIG_EDAC_I82875P=m
+CONFIG_EDAC_I82975X=m
+CONFIG_EDAC_I3000=m
+CONFIG_EDAC_I5000=m
+CONFIG_EDAC_I5100=m
+CONFIG_EDAC_I5400=m
+CONFIG_EDAC_R82600=m
+CONFIG_EDAC_AMD8131=m
+CONFIG_EDAC_AMD8111=m
+CONFIG_EDAC_I7CORE=m
+CONFIG_EDAC_I3000=m
+CONFIG_EDAC_I7300=m
+CONFIG_EDAC_X38=m
+
+CONFIG_SCHED_MC=y
+
+CONFIG_SND_ISA=y
+CONFIG_SND_ES18XX=m
+
+CONFIG_TCG_INFINEON=m
+
+CONFIG_HW_RANDOM_INTEL=m
+CONFIG_HW_RANDOM_AMD=m
+CONFIG_HW_RANDOM_GEODE=m
+CONFIG_HW_RANDOM_VIA=m
+
+
+# CONFIG_COMPAT_VDSO is not set
+
+# CONFIG_SGI_IOC4 is not set
+
+CONFIG_X86_PLATFORM_DEVICES=y
+CONFIG_ASUS_LAPTOP=m
+CONFIG_COMPAL_LAPTOP=m
+CONFIG_EEEPC_LAPTOP=m
+CONFIG_EEEPC_WMI=m
+CONFIG_FUJITSU_LAPTOP=m
+# CONFIG_FUJITSU_LAPTOP_DEBUG is not set
+CONFIG_IDEAPAD_LAPTOP=m
+CONFIG_MSI_LAPTOP=m
+CONFIG_SONY_LAPTOP=m
+CONFIG_DELL_LAPTOP=m
+CONFIG_ACPI_WMI=m
+CONFIG_ACER_WMI=m
+CONFIG_ACERHDF=m
+CONFIG_TC1100_WMI=m
+CONFIG_HP_WMI=m
+# CONFIG_INTEL_SCU_IPC is not set
+CONFIG_DELL_WMI=m
+
+# CONFIG_TOUCHSCREEN_INTEL_MID is not set
+
+# CONFIG_SMSC37B787_WDT is not set
+CONFIG_W83697HF_WDT=m
+CONFIG_IB700_WDT=m
+
+CONFIG_RELOCATABLE=y
+CONFIG_PHYSICAL_ALIGN=0x400000
+CONFIG_PHYSICAL_START=0x400000
+CONFIG_CRASH_DUMP=y
+# CONFIG_KEXEC_JUMP is not set
+CONFIG_PROC_VMCORE=y
+CONFIG_CRASH=m
+
+CONFIG_CRYPTO_DEV_GEODE=m
+
+CONFIG_VIDEO_CAFE_CCIC=m
+
+CONFIG_VIRTUALIZATION=y
+CONFIG_KVM=m
+CONFIG_KVM_INTEL=m
+CONFIG_KVM_AMD=m
+CONFIG_LGUEST=m
+
+CONFIG_PARAVIRT_GUEST=y
+CONFIG_PARAVIRT=y
+# CONFIG_PARAVIRT_DEBUG is not set
+
+# PARAVIRT_SPINLOCKS has a 5% perf hit
+# CONFIG_PARAVIRT_SPINLOCKS is not set
+CONFIG_KVM_CLOCK=y
+CONFIG_KVM_GUEST=y
+CONFIG_KVM_MMU_AUDIT=y # default $x would be nice...
+CONFIG_LGUEST_GUEST=y
+CONFIG_VMI=y
+
+CONFIG_XEN=y
+CONFIG_XEN_MAX_DOMAIN_MEMORY=8
+CONFIG_XEN_BALLOON=y
+CONFIG_XEN_SCRUB_PAGES=y
+CONFIG_XEN_SAVE_RESTORE=y
+CONFIG_HVC_XEN=y
+CONFIG_XEN_FBDEV_FRONTEND=y
+CONFIG_XEN_KBDDEV_FRONTEND=y
+CONFIG_XEN_BLKDEV_FRONTEND=m
+CONFIG_XEN_NETDEV_FRONTEND=m
+CONFIG_XEN_PCIDEV_FRONTEND=m
+CONFIG_XENFS=m
+CONFIG_XEN_COMPAT_XENFS=y
+CONFIG_XEN_BACKEND=y
+CONFIG_XEN_DEBUG_FS=y
+CONFIG_XEN_PLATFORM_PCI=m
+CONFIG_XEN_GNTDEV=m
+
+CONFIG_MTD_ESB2ROM=m
+CONFIG_MTD_CK804XROM=m
+CONFIG_MTD_NAND_CAFE=m
+
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_CPU_IDLE=y
+# CONFIG_CPU_IDLE_GOV_LADDER is not set
+CONFIG_CPU_IDLE_GOV_MENU=y
+
+CONFIG_THINKPAD_ACPI=m
+# CONFIG_THINKPAD_ACPI_DEBUG is not set
+# CONFIG_THINKPAD_ACPI_DEBUGFACILITIES is not set
+CONFIG_THINKPAD_ACPI_HOTKEY_POLL=y
+CONFIG_THINKPAD_ACPI_VIDEO=y
+CONFIG_THINKPAD_ACPI_ALSA_SUPPORT=y
+# CONFIG_THINKPAD_ACPI_UNSAFE_LEDS is not set
+
+CONFIG_MACINTOSH_DRIVERS=y
+
+CONFIG_DMIID=y
+CONFIG_ISCSI_IBFT_FIND=y
+CONFIG_ISCSI_IBFT=m
+
+CONFIG_DMADEVICES=y
+CONFIG_INTEL_IOATDMA=m
+
+CONFIG_SENSORS_I5K_AMB=m
+
+# CONFIG_CPA_DEBUG is not set
+# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
+
+CONFIG_HP_WATCHDOG=m
+CONFIG_NV_TCO=m
+CONFIG_SP5100_TCO=m
+
+CONFIG_OLPC=y
+CONFIG_OLPC_OPENFIRMWARE=y
+CONFIG_BATTERY_OLPC=y
+CONFIG_MOUSE_PS2_OLPC=y
+
+CONFIG_STRICT_DEVMEM=y
+
+# CONFIG_NO_BOOTMEM is not set
+
+# CONFIG_MEMTEST is not set
+# CONFIG_MAXSMP is not set
+CONFIG_MTRR_SANITIZER=y
+CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=1
+CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
+CONFIG_SYSPROF_TRACER=y
+
+# CONFIG_X86_VERBOSE_BOOTUP is not set
+# CONFIG_MMIOTRACE_TEST is not set
+
+# CONFIG_DEBUG_PER_CPU_MAPS is not set
+
+CONFIG_HP_ILO=m
+
+CONFIG_BACKLIGHT_APPLE=m
+
+CONFIG_OPROFILE_IBS=y
+CONFIG_MICROCODE_INTEL=y
+CONFIG_MICROCODE_AMD=y
+
+# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set
+CONFIG_X86_RESERVE_LOW_64K=y
+
+# CONFIG_CMDLINE_BOOL is not set
+
+CONFIG_PANASONIC_LAPTOP=m
+
+CONFIG_X86_PTRACE_BTS=y
+
+CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
+
+CONFIG_POWER_TRACER=y
+CONFIG_HW_BRANCH_TRACER=y
+
+# CONFIG_SPARSE_IRQ is not set
+
+CONFIG_RCU_FANOUT=32
+
+# CONFIG_IOMMU_STRESS is not set
+
+CONFIG_PERF_COUNTERS=y
+CONFIG_PERF_EVENTS=y
+CONFIG_EVENT_PROFILE=y
+
+CONFIG_X86_MCE_INTEL=y
+CONFIG_X86_MCE_AMD=y
+# CONFIG_X86_ANCIENT_MCE is not set
+# CONFIG_X86_MCE_INJECT is not set
+
+# CONFIG_X86_MRST is not set
+CONFIG_SFI=y
+
+CONFIG_INPUT_WINBOND_CIR=m
+CONFIG_I2C_SCMI=m
+CONFIG_SBC_FITPC2_WATCHDOG=m
+CONFIG_EDAC_I3200=m
+CONFIG_EDAC_DECODE_MCE=m
+
+# CONFIG_GPIO_LANGWELL is not set
+
+# CONFIG_INTEL_TXT is not set
+
+CONFIG_CS5535_MFGPT=m
+CONFIG_GEODE_WDT=m
+CONFIG_CS5535_CLOCK_EVENT_SRC=m
+
+CONFIG_LEDS_INTEL_SS4200=m
+
+CONFIG_X86_DECODER_SELFTEST=y
+
+CONFIG_ACPI_CMPC=m
+CONFIG_MSI_WMI=m
+CONFIG_TOSHIBA_BT_RFKILL=m
+# CONFIG_SAMSUNG_LAPTOP is not set
+
+CONFIG_VGA_SWITCHEROO=y
+CONFIG_LPC_SCH=m
+
+CONFIG_PCI_CNB20LE_QUIRK=y
+
+CONFIG_ACPI_EC_DEBUGFS=m
+# CONFIG_ACPI_APEI_ERST_DEBUG is not set
+CONFIG_INTEL_IDLE=y
+# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
+CONFIG_SENSORS_PKGTEMP=m
+CONFIG_F71808E_WDT=m
+CONFIG_HPWDT_NMI_DECODING=y
+# CONFIG_MFD_TPS6586X is not set
+# CONFIG_INTEL_MID_DMAC is not set
+CONFIG_PCH_DMA=m
+# CONFIG_ACPI_QUICKSTART is not set
+CONFIG_IDEAPAD_ACPI=m
+CONFIG_INTEL_IPS=m
+# CONFIG_IBM_RTL is not set
+
+CONFIG_OLPC_XO1=m
+CONFIG_XO1_RFKILL=m
+CONFIG_VIDEO_VIA_CAMERA=m
+
+CONFIG_EDAC_MCE_INJ=m
+CONFIG_IRQ_TIME_ACCOUNTING=y
+CONFIG_X86_RESERVE_LOW=64
+
+CONFIG_PCH_GBE=m
+CONFIG_PCH_PHUB=m
+
+CONFIG_JUMP_LABEL=y
+
+CONFIG_X86_32_IRIS=m
+
+CONFIG_TRANSPARENT_HUGEPAGE=y
+
+CONFIG_CRYPTO_AES_NI_INTEL=m
+
+CONFIG_MTD_OF_PARTS=m
+CONFIG_MTD_PHYSMAP_OF=m
+CONFIG_PROC_DEVICETREE=y
+CONFIG_SERIAL_OF_PLATFORM=m
+CONFIG_SERIAL_GRLIB_GAISLER_APBUART=m
+# CONFIG_MMC_SDHCI_OF is not set
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/config-x86_64-generic b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-x86_64-generic
new file mode 100644
index 000000000..0154cf1b0
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/config-x86_64-generic
@@ -0,0 +1,451 @@
+CONFIG_64BIT=y
+CONFIG_UID16=y
+# CONFIG_KERNEL_LZMA is not set
+
+# CONFIG_MK8 is not set
+# CONFIG_MPSC is not set
+CONFIG_GENERIC_CPU=y
+CONFIG_X86_EXTENDED_PLATFORM=y
+# CONFIG_X86_VSMP is not set
+# CONFIG_X86_UV is not set
+CONFIG_X86_MSR=y
+CONFIG_X86_CPUID=y
+CONFIG_MTRR=y
+CONFIG_NUMA=y
+CONFIG_K8_NUMA=y
+CONFIG_AMD_NUMA=y
+CONFIG_X86_64_ACPI_NUMA=y
+# CONFIG_NUMA_EMU is not set
+CONFIG_NR_CPUS=256
+CONFIG_X86_POWERNOW_K8=m
+CONFIG_X86_P4_CLOCKMOD=m
+CONFIG_IA32_EMULATION=y
+# CONFIG_IA32_AOUT is not set
+# CONFIG_IOMMU_DEBUG is not set
+CONFIG_DEBUG_RODATA=y
+CONFIG_MICROCODE=m
+CONFIG_SWIOTLB=y
+CONFIG_CALGARY_IOMMU=y
+CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT=y
+CONFIG_X86_PM_TIMER=y
+CONFIG_EDD=m
+# CONFIG_EDD_OFF is not set
+CONFIG_PCI_BIOS=y
+CONFIG_PCI_MMCONFIG=y
+CONFIG_DMAR=y
+CONFIG_DMAR_BROKEN_GFX_WA=y
+CONFIG_DMAR_FLOPPY_WA=y
+CONFIG_DMAR_DEFAULT_ON=y
+
+CONFIG_KEXEC_JUMP=y
+
+CONFIG_EFI=y
+CONFIG_EFI_VARS=y
+CONFIG_EFI_PCDP=y
+CONFIG_FB_EFI=y
+
+CONFIG_SCSI_ADVANSYS=m
+
+CONFIG_SECCOMP=y
+
+CONFIG_CAPI_EICON=y
+
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_SCHED_SMT=y
+CONFIG_SUSPEND=y
+CONFIG_HIBERNATION=y
+CONFIG_PM_STD_PARTITION=""
+
+CONFIG_CPU_FREQ=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
+CONFIG_X86_PCC_CPUFREQ=m
+CONFIG_X86_ACPI_CPUFREQ=m
+CONFIG_CPU_FREQ_STAT=m
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+
+CONFIG_ACPI=y
+CONFIG_ACPI_AC=y
+# CONFIG_ACPI_ASUS is not set
+CONFIG_ACPI_PROCFS_POWER=y
+CONFIG_ACPI_SYSFS_POWER=y
+CONFIG_ACPI_BATTERY=y
+CONFIG_ACPI_BLACKLIST_YEAR=0
+CONFIG_ACPI_BUTTON=y
+CONFIG_ACPI_CONTAINER=m
+CONFIG_ACPI_DOCK=y
+CONFIG_ACPI_FAN=y
+CONFIG_ACPI_HOTPLUG_MEMORY=m
+CONFIG_ACPI_NUMA=y
+CONFIG_ACPI_PROCESSOR=y
+CONFIG_ACPI_PROCFS=y
+CONFIG_ACPI_SBS=m
+CONFIG_ACPI_SLEEP=y
+CONFIG_ACPI_THERMAL=y
+CONFIG_ACPI_TOSHIBA=m
+CONFIG_ACPI_POWER=y
+CONFIG_ACPI_VIDEO=m
+# CONFIG_ACPI_PROC_EVENT is not set
+CONFIG_ACPI_POWER_METER=m
+CONFIG_ACPI_PROCESSOR_AGGREGATOR=m
+CONFIG_ACPI_HED=m
+CONFIG_ACPI_APEI=y
+CONFIG_ACPI_APEI_GHES=m
+# CONFIG_ACPI_APEI_EINJ is not set
+CONFIG_ACPI_IPMI=m
+
+CONFIG_X86_PLATFORM_DEVICES=y
+CONFIG_ASUS_LAPTOP=m
+CONFIG_COMPAL_LAPTOP=m
+CONFIG_FUJITSU_LAPTOP=m
+# CONFIG_FUJITSU_LAPTOP_DEBUG is not set
+CONFIG_MSI_LAPTOP=m
+CONFIG_SONY_LAPTOP=m
+CONFIG_SONYPI_COMPAT=y
+CONFIG_EEEPC_LAPTOP=m
+CONFIG_EEEPC_WMI=m
+CONFIG_DELL_LAPTOP=m
+CONFIG_ACPI_WMI=m
+CONFIG_ACER_WMI=m
+CONFIG_ACERHDF=m
+CONFIG_HP_WMI=m
+CONFIG_DELL_WMI=m
+# CONFIG_INTEL_SCU_IPC is not set
+
+# CONFIG_TOUCHSCREEN_INTEL_MID is not set
+
+CONFIG_THINKPAD_ACPI=m
+# CONFIG_THINKPAD_ACPI_DEBUG is not set
+# CONFIG_THINKPAD_ACPI_DEBUGFACILITIES is not set
+CONFIG_THINKPAD_ACPI_HOTKEY_POLL=y
+CONFIG_THINKPAD_ACPI_VIDEO=y
+CONFIG_THINKPAD_ACPI_ALSA_SUPPORT=y
+# CONFIG_THINKPAD_ACPI_UNSAFE_LEDS is not set
+
+CONFIG_HOTPLUG_PCI=y
+CONFIG_HOTPLUG_PCI_COMPAQ=m
+# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set
+CONFIG_HOTPLUG_PCI_IBM=m
+# CONFIG_HOTPLUG_PCI_CPCI is not set
+# SHPC has half-arsed PCI probing, which makes it load on too many systems
+CONFIG_HOTPLUG_PCI_SHPC=m
+
+CONFIG_HPET=y
+# CONFIG_HPET_MMAP is not set
+CONFIG_PM=y
+
+CONFIG_IPW2100=m
+CONFIG_IPW2100_MONITOR=y
+CONFIG_IPW2200=m
+CONFIG_IPW2200_MONITOR=y
+CONFIG_IPW2200_RADIOTAP=y
+CONFIG_IPW2200_PROMISCUOUS=y
+CONFIG_IPW2200_QOS=y
+
+CONFIG_PNP=y
+CONFIG_PNPACPI=y
+
+CONFIG_BLK_DEV_AMD74XX=y
+CONFIG_CRYPTO_DEV_PADLOCK=m
+CONFIG_CRYPTO_DEV_PADLOCK_AES=m
+CONFIG_CRYPTO_DEV_PADLOCK_SHA=m
+
+CONFIG_CRYPTO_AES_X86_64=y
+CONFIG_CRYPTO_AES_NI_INTEL=y
+CONFIG_CRYPTO_TWOFISH_X86_64=m
+CONFIG_CRYPTO_SALSA20_X86_64=m
+
+CONFIG_X86_MCE=y
+CONFIG_X86_MCE_INTEL=y
+CONFIG_X86_MCE_AMD=y
+
+# CONFIG_I2C_ALI1535 is not set
+# CONFIG_I2C_ALI1563 is not set
+# CONFIG_I2C_ALI15X3 is not set
+CONFIG_I2C_AMD756=m
+CONFIG_I2C_AMD756_S4882=m
+CONFIG_I2C_AMD8111=m
+CONFIG_I2C_I801=m
+CONFIG_I2C_ISCH=m
+CONFIG_I2C_NFORCE2_S4985=m
+CONFIG_I2C_PIIX4=m
+# CONFIG_I2C_SIS5595 is not set
+# CONFIG_I2C_SIS630 is not set
+
+CONFIG_I2C_SIS96X=m
+CONFIG_I2C_VIA=m
+CONFIG_I2C_VIAPRO=m
+
+CONFIG_DELL_RBU=m
+CONFIG_DCDBAS=m
+
+CONFIG_NVRAM=y
+
+CONFIG_EDAC=y
+# CONFIG_EDAC_DEBUG is not set
+CONFIG_EDAC_MM_EDAC=m
+CONFIG_EDAC_AMD76X=m
+CONFIG_EDAC_E7XXX=m
+CONFIG_EDAC_E752X=m
+CONFIG_EDAC_I5000=m
+CONFIG_EDAC_I5100=m
+CONFIG_EDAC_I5400=m
+CONFIG_EDAC_I82875P=m
+CONFIG_EDAC_I82860=m
+CONFIG_EDAC_I82975X=m
+CONFIG_EDAC_R82600=m
+CONFIG_EDAC_AMD8131=m
+CONFIG_EDAC_AMD8111=m
+CONFIG_EDAC_AMD64=m
+# CONFIG_EDAC_AMD64_ERROR_INJECTION is not set
+CONFIG_EDAC_DECODE_MCE=m
+CONFIG_EDAC_I7CORE=m
+CONFIG_EDAC_I3000=m
+CONFIG_EDAC_I7300=m
+CONFIG_EDAC_X38=m
+
+CONFIG_SCHED_MC=y
+
+CONFIG_TCG_INFINEON=m
+
+CONFIG_HW_RANDOM_INTEL=m
+CONFIG_HW_RANDOM_AMD=m
+CONFIG_HW_RANDOM_VIA=m
+
+# CONFIG_HW_RANDOM_GEODE is not set
+
+
+CONFIG_DEBUG_STACKOVERFLOW=y
+CONFIG_DEBUG_NMI_TIMEOUT=5
+
+CONFIG_GPIO_SCH=m
+# CONFIG_PC8736x_GPIO is not set
+
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+CONFIG_SPARSEMEM_MANUAL=y
+CONFIG_SPARSEMEM=y
+CONFIG_HAVE_MEMORY_PRESENT=y
+CONFIG_SPARSEMEM_EXTREME=y
+CONFIG_SPARSEMEM_VMEMMAP=y
+CONFIG_MEMORY_HOTPLUG=y
+CONFIG_MEMORY_HOTREMOVE=y
+
+# CONFIG_BLK_DEV_CMD640 is not set
+# CONFIG_BLK_DEV_RZ1000 is not set
+# CONFIG_BLK_DEV_TRIFLEX 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_CC_STACKPROTECTOR=y
+
+CONFIG_SGI_IOC4=m
+CONFIG_SGI_XP=m
+CONFIG_SGI_GRU=m
+# CONFIG_SGI_GRU_DEBUG is not set
+
+# CONFIG_SMSC37B787_WDT is not set
+CONFIG_W83697HF_WDT=m
+
+# CONFIG_VIDEO_CAFE_CCIC is not set
+
+CONFIG_MTD_ESB2ROM=m
+CONFIG_MTD_CK804XROM=m
+
+CONFIG_RELOCATABLE=y
+CONFIG_MACINTOSH_DRIVERS=y
+
+CONFIG_CRASH_DUMP=y
+CONFIG_PHYSICAL_START=0x1000000
+CONFIG_PROC_VMCORE=y
+CONFIG_CRASH=m
+
+CONFIG_DMIID=y
+CONFIG_ISCSI_IBFT_FIND=y
+CONFIG_ISCSI_IBFT=m
+
+
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_CPU_IDLE=y
+# CONFIG_CPU_IDLE_GOV_LADDER is not set
+CONFIG_CPU_IDLE_GOV_MENU=y
+
+CONFIG_VIRTUALIZATION=y
+CONFIG_KVM=m
+CONFIG_KVM_INTEL=m
+CONFIG_KVM_AMD=m
+
+CONFIG_PARAVIRT_GUEST=y
+CONFIG_PARAVIRT=y
+# CONFIG_PARAVIRT_DEBUG is not set
+# PARAVIRT_SPINLOCKS has a 5% perf hit
+# CONFIG_PARAVIRT_SPINLOCKS is not set
+CONFIG_KVM_CLOCK=y
+CONFIG_KVM_GUEST=y
+CONFIG_KVM_MMU_AUDIT=y
+
+CONFIG_XEN=y
+CONFIG_XEN_MAX_DOMAIN_MEMORY=32
+CONFIG_XEN_BALLOON=y
+CONFIG_XEN_SCRUB_PAGES=y
+CONFIG_XEN_SAVE_RESTORE=y
+CONFIG_HVC_XEN=y
+CONFIG_XEN_FBDEV_FRONTEND=y
+CONFIG_XEN_KBDDEV_FRONTEND=y
+CONFIG_XEN_BLKDEV_FRONTEND=m
+CONFIG_XEN_NETDEV_FRONTEND=m
+CONFIG_XEN_PCIDEV_FRONTEND=m
+CONFIG_XENFS=m
+CONFIG_XEN_COMPAT_XENFS=y
+CONFIG_XEN_DEV_EVTCHN=m
+CONFIG_XEN_SYS_HYPERVISOR=y
+CONFIG_XEN_BACKEND=y
+CONFIG_XEN_GNTDEV=m
+CONFIG_XEN_DEBUG_FS=y
+CONFIG_XEN_PLATFORM_PCI=m
+
+CONFIG_DMADEVICES=y
+CONFIG_INTEL_IOATDMA=m
+
+CONFIG_SENSORS_I5K_AMB=m
+
+# CONFIG_COMPAT_VDSO is not set
+CONFIG_PROVIDE_OHCI1394_DMA_INIT=y
+# CONFIG_DEBUG_PER_CPU_MAPS is not set
+# CONFIG_CPA_DEBUG is not set
+
+CONFIG_HP_WATCHDOG=m
+CONFIG_NV_TCO=m
+CONFIG_SP5100_TCO=m
+
+CONFIG_FRAME_WARN=2048
+
+CONFIG_NODES_SHIFT=9
+CONFIG_X86_PAT=y
+# FIXME: These should be 32bit only
+# CONFIG_FB_N411 is not set
+CONFIG_STRICT_DEVMEM=y
+
+CONFIG_DIRECT_GBPAGES=y
+
+# CONFIG_NO_BOOTMEM is not set
+
+# CONFIG_MEMTEST is not set
+CONFIG_AMD_IOMMU=y
+CONFIG_AMD_IOMMU_STATS=y
+# CONFIG_MAXSMP is not set
+CONFIG_MTRR_SANITIZER=y
+CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=1
+CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
+CONFIG_SYSPROF_TRACER=y
+# CONFIG_X86_VERBOSE_BOOTUP is not set
+# CONFIG_MMIOTRACE_TEST is not set
+
+CONFIG_X86_MPPARSE=y
+
+CONFIG_BACKLIGHT_APPLE=m
+
+CONFIG_OPROFILE_IBS=y
+CONFIG_MICROCODE_INTEL=y
+CONFIG_MICROCODE_AMD=y
+
+# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set
+CONFIG_X86_RESERVE_LOW_64K=y
+
+# CONFIG_CMDLINE_BOOL is not set
+
+CONFIG_PANASONIC_LAPTOP=m
+
+CONFIG_X86_PTRACE_BTS=y
+
+CONFIG_I7300_IDLE=m
+CONFIG_INTR_REMAP=y
+
+CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
+
+CONFIG_POWER_TRACER=y
+CONFIG_HW_BRANCH_TRACER=y
+
+CONFIG_X86_X2APIC=y
+CONFIG_SPARSE_IRQ=y
+
+CONFIG_RCU_FANOUT=64
+
+# CONFIG_IOMMU_STRESS is not set
+
+CONFIG_PERF_COUNTERS=y
+CONFIG_PERF_EVENTS=y
+CONFIG_EVENT_PROFILE=y
+
+# CONFIG_X86_MCE_INJECT is not set
+
+CONFIG_SFI=y
+CONFIG_INPUT_WINBOND_CIR=m
+CONFIG_I2C_SCMI=m
+CONFIG_SBC_FITPC2_WATCHDOG=m
+CONFIG_EDAC_I3200=m
+CONFIG_TOPSTAR_LAPTOP=m
+CONFIG_INTEL_TXT=y
+CONFIG_GPIO_LANGWELL=y
+
+CONFIG_FUNCTION_GRAPH_TRACER=y
+
+CONFIG_ACPI_CMPC=m
+CONFIG_MSI_WMI=m
+CONFIG_TOSHIBA_BT_RFKILL=m
+# CONFIG_SAMSUNG_LAPTOP is not set
+
+CONFIG_CS5535_MFGPT=m
+CONFIG_GEODE_WDT=m
+CONFIG_CS5535_CLOCK_EVENT_SRC=m
+
+CONFIG_X86_DECODER_SELFTEST=y
+
+CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m
+
+CONFIG_VGA_SWITCHEROO=y
+CONFIG_LPC_SCH=m
+
+CONFIG_I7300_IDLE=m
+
+CONFIG_PCI_CNB20LE_QUIRK=y
+
+CONFIG_ACPI_EC_DEBUGFS=m
+# CONFIG_ACPI_APEI_ERST_DEBUG is not set
+CONFIG_INTEL_IDLE=y
+# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
+CONFIG_SENSORS_PKGTEMP=m
+CONFIG_F71808E_WDT=m
+CONFIG_HPWDT_NMI_DECODING=y
+# CONFIG_MFD_TPS6586X is not set
+# CONFIG_INTEL_MID_DMAC is not set
+CONFIG_PCH_DMA=m
+# CONFIG_ACPI_QUICKSTART is not set
+CONFIG_IDEAPAD_ACPI=m
+CONFIG_INTEL_IPS=m
+CONFIG_IDEAPAD_LAPTOP=m
+# CONFIG_IBM_RTL is not set
+
+CONFIG_EDAC_MCE_INJ=m
+CONFIG_IRQ_TIME_ACCOUNTING=y
+CONFIG_X86_RESERVE_LOW=64
+
+CONFIG_PCH_GBE=m
+CONFIG_PCH_PHUB=m
+
+CONFIG_VIDEO_VIA_CAMERA=m
+
+CONFIG_JUMP_LABEL=y
+
+CONFIG_HP_ILO=m
+
+CONFIG_TRANSPARENT_HUGEPAGE=y
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/cx88-Fix-HVR4000-IR-keymap.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/cx88-Fix-HVR4000-IR-keymap.patch
new file mode 100644
index 000000000..b145cd29c
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/cx88-Fix-HVR4000-IR-keymap.patch
@@ -0,0 +1,55 @@
+From linux-kernel-owner@vger.kernel.org Thu May 5 20:14:44 2011
+Date: Thu, 05 May 2011 17:11:08 -0700
+From: Greg KH <gregkh@suse.de>
+To: linux-kernel@vger.kernel.org, stable@kernel.org,
+ Greg KH <greg@kroah.com>
+Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
+ akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
+ Jarod Wilson <jarod@wilsonet.com>,
+ Lawrence Rust <lawrence@softsystem.co.uk>,
+ Linux Media Mailing List <linux-media@vger.kernel.org>,
+ Lawrence Rust <lvr@softsystem.dot.uk>,
+ Mauro Carvalho Chehab <mchehab@redhat.com>
+Subject: [patch 36/38] [media] cx88: Fix HVR4000 IR keymap
+In-Reply-To: <20110506001225.GA10547@kroah.com>
+X-Mailing-List: linux-kernel@vger.kernel.org
+
+2.6.38-stable review patch. If anyone has any objections, please let us know.
+
+------------------
+
+From: Lawrence Rust <lvr@softsystem.dot.uk>
+
+[fixed in .39 in a much different way that is too big to backport to
+.38 - gregkh]
+
+Fixes the RC key input for Nova-S plus, HVR1100, HVR3000 and HVR4000 in
+the 2.6.38 kernel.
+
+Signed-off-by: Lawrence Rust <lvr@softsystem.dot.uk>
+Acked-by: Jarod Wilson <jarod@wilsonet.com>
+Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+---
+ drivers/media/video/cx88/cx88-input.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/media/video/cx88/cx88-input.c
++++ b/drivers/media/video/cx88/cx88-input.c
+@@ -283,7 +283,7 @@ int cx88_ir_init(struct cx88_core *core,
+ case CX88_BOARD_PCHDTV_HD3000:
+ case CX88_BOARD_PCHDTV_HD5500:
+ case CX88_BOARD_HAUPPAUGE_IRONLY:
+- ir_codes = RC_MAP_HAUPPAUGE_NEW;
++ ir_codes = RC_MAP_RC5_HAUPPAUGE_NEW;
+ ir->sampling = 1;
+ break;
+ case CX88_BOARD_WINFAST_DTV2000H:
+
+
+--
+To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
+the body of a message to majordomo@vger.kernel.org
+More majordomo info at http://vger.kernel.org/majordomo-info.html
+Please read the FAQ at http://www.tux.org/lkml/
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/deblob-2.6.38 b/freed-ora/tags/f15/2.6.38.6-27.fc15/deblob-2.6.38
new file mode 100755
index 000000000..9132ddc8c
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/deblob-2.6.38
@@ -0,0 +1,2398 @@
+#!/bin/sh
+
+# Copyright (C) 2008, 2009, 2010, 2011 Alexandre Oliva <lxoliva@fsfla.org>
+# Copyright (C) 2008 Jeff Moe
+# Copyright (C) 2009 Rubén Rodríguez <ruben@gnu.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+# deblob - remove non-free blobs from the vanilla linux kernel
+
+# http://www.fsfla.org/svn/fsfla/software/linux-libre
+
+
+# This script, suited for the kernel version named below, in kver,
+# attempts to remove only non-Free Software bits, without removing
+# Free Software that happens to be in the same file.
+
+# Drivers that currently require non-Free firmware are retained, but
+# firmware included in GPLed sources is replaced with /*(DEBLOBBED)*/
+# if the deblob-check script, that knows how to do this, is present.
+# -lxoliva
+
+
+# See also:
+# http://wiki.debian.org/KernelFirmwareLicensing
+# svn://svn.debian.org/kernel/dists/trunk/linux-2.6/debian/patches/debian/dfsg/files-1
+# http://wiki.gnewsense.org/Builder gen-kernel
+
+# Thanks to Brian Brazil @ gnewsense
+
+
+# For each kver release, start extra with an empty string, then count
+# from 1 if changes are needed that require rebuilding the tarball.
+kver=2.6.38 extra=
+
+case $1 in
+--force)
+ echo "WARNING: Using the force, ignored errors will be" >&2
+ die () {
+ echo ERROR: "$@" >&2
+ errors=:
+ }
+ forced=: errors=false
+ shift
+ ;;
+*)
+ die () {
+ echo ERROR: "$@" >&2
+ echo Use --force to ignore
+ exit 1
+ }
+ forced=false errors=false
+ ;;
+esac
+
+check=`echo "$0" | sed 's,[^/]*$,,;s,^$,.,;s,/*$,,'`/deblob-check
+if [ ! -f $check ] ; then
+ if $forced; then
+ die deblob-check script missing, will remove entire files
+ else
+ die deblob-check script missing
+ fi
+ have_check=false
+else
+ have_check=:
+fi
+
+filetest () {
+ if [ ! -f $1 ]; then
+ die $1 does not exist, something is wrong && return 1
+ fi
+}
+
+announce () {
+ echo
+ echo "$@"
+}
+
+clean_file () {
+ #$1 = filename
+ filetest $1 || return
+ rm $1
+ echo $1: removed
+}
+
+check_changed () {
+ #$1 = filename
+ if cmp $1.deblob $1 > /dev/null; then
+ rm $1.deblob
+ die $1 did not change, something is wrong && return 1
+ fi
+ mv $1.deblob $1
+}
+
+clean_blob () {
+ #$1 = filename
+ filetest $1 || return
+ if $have_check; then
+ name=$1
+ set fnord "$@" -d
+ shift 2
+ $check "$@" -i linux-$kver $name > $name.deblob
+ check_changed $name && echo $name: removed blobs
+ else
+ clean_file $1
+ fi
+}
+
+dummy_blob () {
+ #$1 = filename
+ if test -f $1; then
+ die $1 exists, something is wrong && return
+ elif test ! -f firmware/Makefile; then
+ die firmware/Makefile does not exist, something is wrong && return
+ fi
+
+ clean_sed "s,`echo $1 | sed s,^firmware/,,`,\$(DEBLOBBED),g" \
+ firmware/Makefile "dropped $1"
+}
+
+clean_fw () {
+ #$1 = firmware text input, $2 = firmware output
+ filetest $1 || return
+ if test -f $2; then
+ die $2 exists, something is wrong && return
+ fi
+ clean_blob $1 -s 4
+ dummy_blob $2
+}
+
+drop_fw_file () {
+ #$1 = firmware text input, $2 = firmware output
+ filetest $1 || return
+ if test -f $2; then
+ die $2 exists, something is wrong && return
+ fi
+ clean_file $1
+ dummy_blob $2
+}
+
+clean_kconfig () {
+ #$1 = filename $2 = things to remove
+ case $1 in
+ -f)
+ shift
+ ;;
+ *)
+ if $have_check; then
+ return
+ fi
+ ;;
+ esac
+ filetest $1 || return
+ sed "/^config \\($2\\)\$/{p;i\
+ depends on NONFREE
+d;}" $1 > $1.deblob
+ check_changed $1 && echo $1: marked config $2 as depending on NONFREE
+}
+
+clean_mk () {
+ #$1 = config $2 = Makefile name
+ # We don't clean up Makefiles any more --lxoliva
+ # sed -i "/\\($1\\)/d" $2
+ # echo $2: removed $1 support
+ # check_changed $2
+ filetest $2 || return
+ if sed -n "/\\($1\\)/p" $2 | grep . > /dev/null; then
+ :
+ else
+ die $2 does not contain matches for $1
+ fi
+}
+
+clean_sed () {
+ #$1 = sed-script $2 = file $3 = comment
+ filetest $2 || return
+ sed -e "$1" "$2" > "$2".deblob || {
+ die $2: failed: ${3-applied sed script $1} && return 1; }
+ check_changed $2 && echo $2: ${3-applied sed script $1}
+}
+
+reject_firmware () {
+ #$1 = file $2 = pre sed pattern
+ filetest $1 || return
+ clean_sed "$2"'
+s,request\(_ihex\)\?_firmware\(_nowait\)\?,reject_firmware\2,g
+' "$1" 'disabled non-Free firmware-loading machinery'
+}
+
+maybe_reject_firmware () {
+ #$1 = file $2 = pre sed pattern
+ filetest $1 || return
+ clean_sed "$2"'
+s,request_firmware\(_nowait\)\?,maybe_reject_firmware\1,g
+' "$1" 'retain Free firmware-loading machinery, disabling non-Free one'
+}
+
+undefine_macro () {
+ #$1 - macro name
+ #$2 - substitution
+ #$3 - message
+ #rest - file names
+ macro=$1 repl=$2 msg=$3; shift 3
+ for f in "$@"; do
+ clean_sed "
+s,^#define $macro .*\$,/*(DEBLOBBED)*/,;
+s,$macro,$repl,g;
+" "$f" "$msg"
+ done
+}
+
+undefault_firmware () {
+ #$1 - pattern such that $1_DEFAULT_FIRMWARE is #defined to non-Free firmware
+ #$@ other than $1 - file names
+ macro="$1"_DEFAULT_FIRMWARE; shift
+ undefine_macro "$macro" "\"/*(DEBLOBBED)*/\"" \
+ "disabled non-Free firmware" "$@"
+}
+
+# First, check that files that contain firmwares and their
+# corresponding sources are present.
+
+for f in \
+ drivers/char/ser_a2232fw.h \
+ drivers/char/ser_a2232fw.ax \
+ drivers/net/ixp2000/ixp2400_rx.ucode \
+ drivers/net/ixp2000/ixp2400_rx.uc \
+ drivers/net/ixp2000/ixp2400_tx.ucode \
+ drivers/net/ixp2000/ixp2400_rx.uc \
+ drivers/net/wan/wanxlfw.inc_shipped \
+ drivers/net/wan/wanxlfw.S \
+ drivers/net/wireless/atmel.c \
+ drivers/net/wireless/atmel.c \
+ drivers/scsi/53c700_d.h_shipped \
+ drivers/scsi/53c700.scr \
+ drivers/scsi/aic7xxx/aic79xx_seq.h_shipped \
+ drivers/scsi/aic7xxx/aic79xx.seq \
+ drivers/scsi/aic7xxx/aic7xxx_seq.h_shipped \
+ drivers/scsi/aic7xxx/aic7xxx.seq \
+ drivers/scsi/aic7xxx_old/aic7xxx_seq.c \
+ drivers/scsi/aic7xxx_old/aic7xxx.seq \
+ drivers/scsi/53c7xx_d.h_shipped \
+ drivers/scsi/53c7xx.scr \
+ drivers/scsi/sym53c8xx_2/sym_fw1.h \
+ drivers/scsi/sym53c8xx_2/sym_fw1.h \
+ drivers/scsi/sym53c8xx_2/sym_fw2.h \
+ drivers/scsi/sym53c8xx_2/sym_fw2.h \
+ firmware/dsp56k/bootstrap.bin.ihex \
+ firmware/dsp56k/bootstrap.asm \
+ firmware/keyspan_pda/keyspan_pda.HEX \
+ firmware/keyspan_pda/keyspan_pda.S \
+ firmware/keyspan_pda/xircom_pgs.HEX \
+ firmware/keyspan_pda/xircom_pgs.S \
+ sound/pci/cs46xx/imgs/cwcdma.h \
+ sound/pci/cs46xx/imgs/cwcdma.asp \
+; do
+ if test ! $f; then
+ die $f is not present, something is amiss && return
+ fi
+done
+
+# Identify the tarball.
+grep -q 'EXTRAVERSION.*-libre' Makefile ||
+clean_sed "s,^EXTRAVERSION.*,&-libre$extra,
+" Makefile 'added -libre to EXTRAVERSION'
+
+grep -q Linux-libre README ||
+clean_sed '
+1,3 s,Linux kernel release.*kernel\.org.*,Linux-libre <http://linux-libre.fsfla.org>,
+2,5 s,Linux version 2.6,Linux-libre,
+1,20 s,\(operating system \)\?Unix,Unix kernel,
+/WHAT IS LINUX/i\
+WHAT IS Linux-libre?\
+\
+ Linux-libre is a Free version of the kernel Linux (see below),\
+ suitable for use with the GNU Operating System in 100% Free\
+ GNU/Linux-libre System Distributions.\
+ http://www.gnu.org/distros/\
+\
+ It removes non-Free components from Linux, that are disguised as\
+ source code or distributed in separate files. It also disables\
+ run-time requests for non-Free components, shipped separately or as\
+ part of Linux, and documentation pointing to them, so as to avoid\
+ (Free-)baiting users into the trap of non-Free Software.\
+ http://www.fsfla.org/anuncio/2010-11-Linux-2.6.36-libre-debait\
+\
+ Linux-libre started within the gNewSense GNU/Linux distribution.\
+ It was later adopted by Jeff Moe, who coined its name, and in 2008\
+ it became a project maintained by FSF Latin America.\
+\
+ The Linux-libre project takes a minimal-changes approach to cleaning\
+ up Linux, making no effort to substitute components that need to be\
+ removed with functionally equivalent Free ones. Nevertheless, we\
+ encourage and support efforts towards doing so.\
+ http://libreplanet.org/wiki/LinuxLibre:Devices_that_require_non-free_firmware\
+\
+ Our mascot is Freedo, a light-blue penguin that has just come out\
+ of the the shower. Although we like penguins, GNU is a much\
+ greater contribution to the entire system, so its mascot deserves\
+ more promotion. See our web page for their images.\
+ http://linux-libre.fsfla.org/\
+
+' README 'added blurb about Linux-libre'
+
+# Add reject_firmware and maybe_reject_firmware
+grep -q _LINUX_LIBRE_FIRMWARE_H include/linux/firmware.h ||
+clean_sed '$i\
+#ifndef _LINUX_LIBRE_FIRMWARE_H\
+#define _LINUX_LIBRE_FIRMWARE_H\
+\
+#include <linux/device.h>\
+\
+#define NONFREE_FIRMWARE "/*(DEBLOBBED)*/"\
+\
+static inline int\
+report_missing_free_firmware(const char *name, const char *what)\
+{\
+ printk(KERN_ERR "%s: Missing Free %s\\n", name,\
+ what ? what : "firmware");\
+ return -EINVAL;\
+}\
+static inline int\
+reject_firmware(const struct firmware **fw,\
+ const char *name, struct device *device)\
+{\
+ const struct firmware *xfw = NULL;\
+ int retval;\
+ report_missing_free_firmware(dev_name(device), NULL);\
+ retval = request_firmware(&xfw, NONFREE_FIRMWARE, device);\
+ if (!retval)\
+ release_firmware(xfw);\
+ return -EINVAL;\
+}\
+static inline int\
+maybe_reject_firmware(const struct firmware **fw,\
+ const char *name, struct device *device)\
+{\
+ if (strstr (name, NONFREE_FIRMWARE))\
+ return reject_firmware(fw, name, device);\
+ else\
+ return request_firmware(fw, name, device);\
+}\
+static inline void\
+discard_rejected_firmware(const struct firmware *fw, void *context)\
+{\
+ release_firmware(fw);\
+}\
+static inline int\
+reject_firmware_nowait(struct module *module, int uevent,\
+ const char *name, struct device *device,\
+ gfp_t gfp, void *context,\
+ void (*cont)(const struct firmware *fw,\
+ void *context))\
+{\
+ int retval;\
+ report_missing_free_firmware(dev_name(device), NULL);\
+ retval = request_firmware_nowait(module, uevent, NONFREE_FIRMWARE,\
+ device, gfp, NULL,\
+ discard_rejected_firmware);\
+ if (retval)\
+ return retval;\
+ return -EINVAL;\
+}\
+static inline int\
+maybe_reject_firmware_nowait(struct module *module, int uevent,\
+ const char *name, struct device *device,\
+ gfp_t gfp, void *context,\
+ void (*cont)(const struct firmware *fw,\
+ void *context))\
+{\
+ if (strstr (name, NONFREE_FIRMWARE))\
+ return reject_firmware_nowait(module, uevent, name,\
+ device, gfp, context, cont);\
+ else\
+ return request_firmware_nowait(module, uevent, name,\
+ device, gfp, context, cont);\
+}\
+\
+#endif /* _LINUX_LIBRE_FIRMWARE_H */\
+' include/linux/firmware.h 'added non-Free firmware notification support'
+
+########
+# Arch #
+########
+
+# x86
+
+announce MICROCODE_AMD - "AMD microcode patch loading support"
+reject_firmware arch/x86/kernel/microcode_amd.c
+clean_blob arch/x86/kernel/microcode_amd.c
+clean_kconfig arch/x86/Kconfig 'MICROCODE_AMD'
+clean_mk CONFIG_MICROCODE_AMD arch/x86/kernel/Makefile
+
+announce MICROCODE_INTEL - "Intel microcode patch loading support"
+reject_firmware arch/x86/kernel/microcode_intel.c
+clean_blob arch/x86/kernel/microcode_intel.c
+clean_kconfig arch/x86/Kconfig 'MICROCODE_INTEL'
+clean_mk CONFIG_MICROCODE_INTEL arch/x86/kernel/Makefile
+
+# arm
+
+announce IXP4XX_NPE - "IXP4xx Network Processor Engine support"
+reject_firmware arch/arm/mach-ixp4xx/ixp4xx_npe.c
+clean_blob Documentation/arm/IXP4xx
+
+announce ARCH_NETX - "Hilscher NetX based"
+clean_sed '
+s,\([" ]\)request_firmware(,\1reject_firmware(,
+' arch/arm/mach-netx/xc.c 'disabled non-Free firmware-loading machinery'
+clean_blob arch/arm/mach-netx/xc.c
+clean_blob drivers/net/netx-eth.c
+clean_kconfig arch/arm/Kconfig 'ARCH_NETX'
+clean_mk CONFIG_ARCH_NETX arch/arm/Makefile
+
+announce WESTBRIDGE_DEVICE_DRIVER - "West Bridge Device Driver"
+reject_firmware drivers/staging/westbridge/astoria/device/cyasdevice.c
+clean_blob drivers/staging/westbridge/astoria/device/cyasdevice.c
+clean_kconfig drivers/staging/westbridge/astoria/device/Kconfig 'WESTBRIDGE_DEVICE_DRIVER'
+clean_mk 'CONFIG_WESTBRIDGE_DEVICE_DRIVER' drivers/staging/westbridge/astoria/device/Makefile
+
+#######
+# ATM #
+#######
+
+announce ATM_AMBASSADOR - "Madge Ambassador, Collage PCI 155 Server"
+reject_firmware drivers/atm/ambassador.c
+clean_blob drivers/atm/ambassador.c
+clean_fw firmware/atmsar11.HEX firmware/atmsar11.fw
+clean_kconfig drivers/atm/Kconfig 'ATM_AMBASSADOR'
+clean_mk CONFIG_ATM_AMBASSADOR drivers/atm/Makefile
+
+announce ATM_FORE200E - "FORE Systems 200E-series"
+reject_firmware drivers/atm/fore200e.c
+clean_blob drivers/atm/fore200e.c
+clean_blob Documentation/networking/fore200e.txt
+clean_blob drivers/atm/.gitignore
+clean_blob Documentation/dontdiff
+clean_kconfig drivers/atm/Kconfig 'ATM_FORE200E'
+clean_mk CONFIG_ATM_FORE200E drivers/atm/Makefile
+
+announce ATM_SOLOS - "Solos ADSL2+ PCI Multiport card driver"
+reject_firmware drivers/atm/solos-pci.c
+clean_blob drivers/atm/solos-pci.c
+clean_kconfig drivers/atm/Kconfig 'ATM_SOLOS'
+clean_mk CONFIG_ATM_SOLOS drivers/atm/Makefile
+
+########
+# char #
+########
+
+announce COMPUTONE - "Computone IntelliPort Plus serial"
+drop_fw_file firmware/intelliport2.bin.ihex firmware/intelliport2.bin
+reject_firmware drivers/char/ip2/ip2main.c
+clean_blob drivers/char/ip2/ip2main.c
+clean_kconfig drivers/char/Kconfig 'COMPUTONE'
+clean_mk CONFIG_COMPUTONE drivers/char/Makefile
+
+announce CYCLADES - "Cyclades async mux support"
+reject_firmware drivers/char/cyclades.c
+clean_blob drivers/char/cyclades.c
+clean_kconfig drivers/char/Kconfig 'CYCLADES'
+clean_mk CONFIG_CYCLADES drivers/char/Makefile
+
+announce ISI - "Multi-Tech multiport card support"
+reject_firmware drivers/char/isicom.c
+clean_blob drivers/char/isicom.c
+clean_kconfig drivers/char/Kconfig 'ISI'
+clean_mk CONFIG_ISI drivers/char/Makefile
+
+announce MOXA_INTELLIO - "Moxa Intellio support"
+reject_firmware drivers/char/moxa.c
+clean_blob drivers/char/moxa.c
+clean_kconfig drivers/char/Kconfig 'MOXA_INTELLIO'
+clean_mk CONFIG_MOXA_INTELLIO drivers/char/Makefile
+
+# gpu drm
+
+announce DRM_NOUVEAU - "Nouveau (nVidia) cards"
+reject_firmware drivers/gpu/drm/nouveau/nvc0_graph.c
+clean_blob drivers/gpu/drm/nouveau/nvc0_graph.c
+clean_kconfig drivers/gpu/drm/nouveau/Kconfig 'DRM_NOUVEAU'
+clean_mk CONFIG_DRM_NOUVEAU drivers/gpu/drm/nouveau/Makefile
+
+announce DRM_MGA - "Matrox g200/g400"
+drop_fw_file firmware/matrox/g200_warp.H16 firmware/matrox/g200_warp.fw
+drop_fw_file firmware/matrox/g400_warp.H16 firmware/matrox/g400_warp.fw
+reject_firmware drivers/gpu/drm/mga/mga_warp.c
+clean_blob drivers/gpu/drm/mga/mga_warp.c
+clean_kconfig drivers/gpu/drm/Kconfig 'DRM_MGA'
+clean_mk CONFIG_DRM_MGA drivers/gpu/drm/Makefile
+
+announce DRM_R128 - "ATI Rage 128"
+drop_fw_file firmware/r128/r128_cce.bin.ihex firmware/r128/r128_cce.bin
+reject_firmware drivers/gpu/drm/r128/r128_cce.c
+clean_blob drivers/gpu/drm/r128/r128_cce.c
+clean_kconfig drivers/gpu/drm/Kconfig 'DRM_R128'
+clean_mk CONFIG_DRM_R128 drivers/gpu/drm/Makefile
+
+announce DRM_RADEON - "ATI Radeon"
+drop_fw_file firmware/radeon/R100_cp.bin.ihex firmware/radeon/R100_cp.bin
+drop_fw_file firmware/radeon/R200_cp.bin.ihex firmware/radeon/R200_cp.bin
+drop_fw_file firmware/radeon/R300_cp.bin.ihex firmware/radeon/R300_cp.bin
+drop_fw_file firmware/radeon/R420_cp.bin.ihex firmware/radeon/R420_cp.bin
+drop_fw_file firmware/radeon/R520_cp.bin.ihex firmware/radeon/R520_cp.bin
+drop_fw_file firmware/radeon/R600_me.bin.ihex firmware/radeon/R600_me.bin
+drop_fw_file firmware/radeon/R600_pfp.bin.ihex firmware/radeon/R600_pfp.bin
+drop_fw_file firmware/radeon/RS600_cp.bin.ihex firmware/radeon/RS600_cp.bin
+drop_fw_file firmware/radeon/RS690_cp.bin.ihex firmware/radeon/RS690_cp.bin
+drop_fw_file firmware/radeon/RS780_me.bin.ihex firmware/radeon/RS780_me.bin
+drop_fw_file firmware/radeon/RS780_pfp.bin.ihex firmware/radeon/RS780_pfp.bin
+drop_fw_file firmware/radeon/RV610_me.bin.ihex firmware/radeon/RV610_me.bin
+drop_fw_file firmware/radeon/RV610_pfp.bin.ihex firmware/radeon/RV610_pfp.bin
+drop_fw_file firmware/radeon/RV620_me.bin.ihex firmware/radeon/RV620_me.bin
+drop_fw_file firmware/radeon/RV620_pfp.bin.ihex firmware/radeon/RV620_pfp.bin
+drop_fw_file firmware/radeon/RV630_me.bin.ihex firmware/radeon/RV630_me.bin
+drop_fw_file firmware/radeon/RV630_pfp.bin.ihex firmware/radeon/RV630_pfp.bin
+drop_fw_file firmware/radeon/RV635_me.bin.ihex firmware/radeon/RV635_me.bin
+drop_fw_file firmware/radeon/RV635_pfp.bin.ihex firmware/radeon/RV635_pfp.bin
+drop_fw_file firmware/radeon/RV670_me.bin.ihex firmware/radeon/RV670_me.bin
+drop_fw_file firmware/radeon/RV670_pfp.bin.ihex firmware/radeon/RV670_pfp.bin
+drop_fw_file firmware/radeon/RV710_me.bin.ihex firmware/radeon/RV710_me.bin
+drop_fw_file firmware/radeon/RV710_pfp.bin.ihex firmware/radeon/RV710_pfp.bin
+drop_fw_file firmware/radeon/RV730_me.bin.ihex firmware/radeon/RV730_me.bin
+drop_fw_file firmware/radeon/RV730_pfp.bin.ihex firmware/radeon/RV730_pfp.bin
+drop_fw_file firmware/radeon/RV770_me.bin.ihex firmware/radeon/RV770_me.bin
+drop_fw_file firmware/radeon/RV770_pfp.bin.ihex firmware/radeon/RV770_pfp.bin
+reject_firmware drivers/gpu/drm/radeon/radeon_cp.c
+clean_blob drivers/gpu/drm/radeon/radeon_cp.c
+reject_firmware drivers/gpu/drm/radeon/r100.c
+clean_blob drivers/gpu/drm/radeon/r100.c
+reject_firmware drivers/gpu/drm/radeon/r600.c
+clean_blob drivers/gpu/drm/radeon/r600.c
+reject_firmware drivers/gpu/drm/radeon/r600_cp.c
+clean_blob drivers/gpu/drm/radeon/r600_cp.c
+reject_firmware drivers/gpu/drm/radeon/ni.c
+clean_blob drivers/gpu/drm/radeon/ni.c
+clean_kconfig drivers/gpu/drm/Kconfig 'DRM_RADEON'
+clean_mk CONFIG_DRM_RADEON drivers/gpu/drm/Makefile
+
+#######
+# dma #
+#######
+
+announce IMX_SDMA - "i.MX SDMA support"
+reject_firmware drivers/dma/imx-sdma.c
+clean_blob drivers/dma/imx-sdma.c
+clean_kconfig drivers/dma/Kconfig 'IMX_SDMA'
+clean_mk CONFIG_IMX_SDMA drivers/dma/Makefile
+
+#########
+# Media #
+#########
+
+# media/tuner
+
+announce MEDIA_TUNER_XC2028 - "XCeive xc2028/xc3028 tuners"
+undefault_firmware 'XC\(2028\|3028L\)' \
+ drivers/media/common/tuners/tuner-xc2028.h \
+ drivers/media/video/saa7134/saa7134-cards.c \
+ drivers/media/video/ivtv/ivtv-driver.c \
+ drivers/media/video/cx18/cx18-driver.c \
+ drivers/media/video/cx18/cx18-dvb.c \
+ drivers/media/video/cx23885/cx23885-dvb.c \
+ drivers/media/video/cx23885/cx23885-video.c \
+ drivers/media/video/cx88/cx88-dvb.c \
+ drivers/media/video/cx88/cx88-cards.c \
+ drivers/media/video/em28xx/em28xx-cards.c \
+ drivers/media/dvb/dvb-usb/dib0700_devices.c \
+ drivers/media/dvb/dvb-usb/cxusb.c
+reject_firmware drivers/media/common/tuners/tuner-xc2028.c
+clean_kconfig drivers/media/common/tuners/Kconfig 'MEDIA_TUNER_XC2028'
+clean_mk CONFIG_MEDIA_TUNER_XC2028 drivers/media/common/tuners/Makefile
+
+announce VIDEO_TM6000_DVB - "DVB Support for tm6000 based TV cards"
+clean_blob drivers/staging/tm6000/tm6000-cards.c
+clean_kconfig drivers/staging/tm6000/Kconfig 'VIDEO_TM6000_DVB'
+clean_mk CONFIG_VIDEO_TM6000_DVB drivers/staging/tm6000/Makefile
+
+announce MEDIA_TUNER_XC5000 - "Xceive XC5000 silicon tuner"
+undefine_macro 'XC5000_DEFAULT_FIRMWARE_SIZE' 0 \
+ 'removed non-Free firmware size' drivers/media/common/tuners/xc5000.c
+undefault_firmware 'XC5000' \
+ drivers/media/common/tuners/xc5000.c \
+ drivers/media/video/cx231xx/cx231xx-cards.c
+reject_firmware drivers/media/common/tuners/xc5000.c
+clean_kconfig drivers/media/common/tuners/Kconfig 'MEDIA_TUNER_XC5000'
+clean_mk CONFIG_MEDIA_TUNER_XC5000 drivers/media/common/tuners/Makefile
+
+announce DVB_USB - "Support for various USB DVB devices"
+reject_firmware drivers/media/dvb/dvb-usb/dvb-usb-firmware.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB'
+clean_mk CONFIG_DVB_USB drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_AF9005 - "Afatech AF9005 DVB-T USB1.1"
+clean_file drivers/media/dvb/dvb-usb/af9005-script.h
+clean_sed '
+s,^ deb_info("load init script\\n");$, {\n err("Missing Free init script\\n");\n return scriptlen = ret = -EINVAL;\n ,;
+' drivers/media/dvb/dvb-usb/af9005-fe.c 'report missing Free init script'
+clean_blob drivers/media/dvb/dvb-usb/af9005-fe.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_AF9005'
+clean_mk CONFIG_DVB_USB_AF9005 drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_B2C2_FLEXCOP - "Technisat/B2C2 FlexCopII(b) and FlexCopIII adapters"
+reject_firmware drivers/media/dvb/b2c2/flexcop-fe-tuner.c
+
+announce DVB_BT8XX - "BT8xx based PCI cards"
+reject_firmware drivers/media/dvb/bt8xx/dvb-bt8xx.c
+
+announce DVB_USB_A800 - "AVerMedia AverTV DVB-T USB 2.0 (A800)"
+clean_blob drivers/media/dvb/dvb-usb/a800.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_A800'
+clean_mk CONFIG_DVB_USB_A800 drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_AF9005 - "Afatech AF9005 DVB-T USB1.1 support"
+clean_blob drivers/media/dvb/dvb-usb/af9005.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_AF9005'
+clean_mk CONFIG_DVB_USB_AF9005 drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_AF9015 - "Afatech AF9015 DVB-T USB2.0 support"
+clean_blob drivers/media/dvb/dvb-usb/af9015.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_AF9015'
+clean_mk CONFIG_DVB_USB_AF9015 drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_AZ6027 - "Azurewave DVB-S/S2 USB2.0 AZ6027 support"
+clean_blob drivers/media/dvb/dvb-usb/az6027.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_AZ6027'
+clean_mk CONFIG_DVB_USB_AZ6027 drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_CXUSB - "Conexant USB2.0 hybrid reference design support"
+clean_blob drivers/media/dvb/dvb-usb/cxusb.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_CXUSB'
+clean_mk CONFIG_DVB_USB_CXUSB drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_DIB0700 - "DiBcom DiB0700 USB DVB devices"
+clean_blob drivers/media/dvb/dvb-usb/dib0700_devices.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_DIB0700'
+clean_mk CONFIG_DVB_USB_DIB0700 drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_DIBUSB_MB - "DiBcom USB DVB-T devices (based on the DiB3000M-B)"
+clean_blob drivers/media/dvb/dvb-usb/dibusb-mb.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_DIBUSB_MB'
+clean_mk CONFIG_DVB_USB_DIBUSB_MB drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_DIBUSB_MC - "DiBcom USB DVB-T devices (based on the DiB3000M-C/P)"
+clean_blob drivers/media/dvb/dvb-usb/dibusb-mc.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_DIBUSB_MC'
+clean_mk CONFIG_DVB_USB_DIBUSB_MC drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_DIGITV - "Nebula Electronics uDigiTV DVB-T USB2.0 support"
+clean_blob drivers/media/dvb/dvb-usb/digitv.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_DIGITV'
+clean_mk CONFIG_DVB_USB_DIGITV drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_DTT200U - "WideView WT-200U and WT-220U (pen) DVB-T USB2.0 support (Yakumo/Hama/Typhoon/Yuan)"
+clean_blob drivers/media/dvb/dvb-usb/dtt200u.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_DTT200U'
+clean_mk CONFIG_DVB_USB_DTT200U drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_DW2102 - "DvbWorld DVB-S/S2 USB2.0 support"
+reject_firmware drivers/media/dvb/dvb-usb/dw2102.c
+clean_blob drivers/media/dvb/dvb-usb/dw2102.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_DW2102'
+clean_mk CONFIG_DVB_USB_DW2102 drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_EC168 - "E3C EC168 DVB-T USB2.0 support"
+clean_blob drivers/media/dvb/dvb-usb/ec168.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_EC168'
+clean_mk CONFIG_DVB_USB_EC168 drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_GP8PSK - "GENPIX 8PSK->USB module support"
+reject_firmware drivers/media/dvb/dvb-usb/gp8psk.c
+clean_blob drivers/media/dvb/dvb-usb/gp8psk.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_GP8PSK'
+clean_mk CONFIG_DVB_USB_GP8PSK drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_LME2510 - "LME DM04/QQBOX DVB-S USB2.0 support"
+reject_firmware drivers/media/dvb/dvb-usb/lmedm04.c
+clean_blob drivers/media/dvb/dvb-usb/lmedm04.c
+clean_file Documentation/dvb/lmedm04.txt
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_LME2510'
+clean_mk CONFIG_DVB_USB_LME2510 drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_M920X - "Uli m920x DVB-T USB2.0 support"
+reject_firmware drivers/media/dvb/dvb-usb/m920x.c
+clean_blob drivers/media/dvb/dvb-usb/m920x.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_M920X'
+clean_mk CONFIG_DVB_USB_M920X drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_NOVA_T_USB2 - "Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 support"
+clean_blob drivers/media/dvb/dvb-usb/nova-t-usb2.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_NOVA_T_USB2'
+clean_mk CONFIG_DVB_USB_NOVA_T_USB2 drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_OPERA1 - "Opera1 DVB-S USB2.0 receiver"
+reject_firmware drivers/media/dvb/dvb-usb/opera1.c
+clean_blob drivers/media/dvb/dvb-usb/opera1.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_OPERA1'
+clean_mk CONFIG_DVB_USB_OPERA1 drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_TTUSB2 - "Pinnacle 400e DVB-S USB2.0 support"
+clean_blob drivers/media/dvb/dvb-usb/ttusb2.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_TTUSB2'
+clean_mk CONFIG_DVB_USB_TTUSB2 drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_UMT_010 - "HanfTek UMT-010 DVB-T USB2.0 support"
+clean_blob drivers/media/dvb/dvb-usb/umt-010.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_UMT_010'
+clean_mk CONFIG_DVB_USB_UMT_010 drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_VP702X - "TwinhanDTV StarBox and clones DVB-S USB2.0 support"
+clean_blob drivers/media/dvb/dvb-usb/vp702x.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_VP702X'
+clean_mk CONFIG_DVB_USB_VP702X drivers/media/dvb/dvb-usb/Makefile
+
+announce DVB_USB_VP7045 - "TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle USB2.0 support"
+clean_blob drivers/media/dvb/dvb-usb/vp7045.c
+clean_kconfig drivers/media/dvb/dvb-usb/Kconfig 'DVB_USB_VP7045'
+clean_mk CONFIG_DVB_USB_VP7045 drivers/media/dvb/dvb-usb/Makefile
+
+# dvb/frontends
+
+announce DVB_AF9013 - "Afatech AF9013 demodulator"
+undefault_firmware 'AF9013' \
+ drivers/media/dvb/frontends/af9013.c \
+ drivers/media/dvb/frontends/af9013_priv.h
+reject_firmware drivers/media/dvb/frontends/af9013.c
+clean_kconfig drivers/media/dvb/frontends/Kconfig 'DVB_AF9013'
+clean_mk CONFIG_DVB_AF9013 drivers/media/dvb/frontends/Makefile
+
+announce DVB_BCM3510 - "Broadcom BCM3510"
+undefault_firmware 'BCM3510' drivers/media/dvb/frontends/bcm3510.c
+reject_firmware drivers/media/dvb/frontends/bcm3510.c
+reject_firmware drivers/media/dvb/frontends/bcm3510.h
+clean_sed '
+/You.ll need a firmware/,/dvb-fe-bcm/d;
+' drivers/media/dvb/frontends/bcm3510.c \
+ "removed non-Free firmware notes"
+clean_kconfig drivers/media/dvb/frontends/Kconfig 'DVB_BCM3510'
+clean_mk CONFIG_DVB_BCM3510 drivers/media/dvb/frontends/Makefile
+
+announce DVB_DS3000 - "Montage Tehnology DS3000 based"
+undefault_firmware 'DS3000' \
+ drivers/media/dvb/frontends/ds3000.c
+reject_firmware drivers/media/dvb/frontends/ds3000.c
+clean_blob drivers/media/dvb/frontends/ds3000.c
+clean_kconfig drivers/media/dvb/frontends/Kconfig 'DVB_DS3000'
+clean_mk CONFIG_DVB_DS3000 drivers/media/dvb/frontends/Makefile
+
+announce DVB_LGS8GXX - "Legend Silicon LGS8913/LGS8GL5/LGS8GXX DMB-TH demodulator"
+reject_firmware drivers/media/dvb/frontends/lgs8gxx.c
+clean_blob drivers/media/dvb/frontends/lgs8gxx.c
+clean_kconfig drivers/media/dvb/frontends/Kconfig 'DVB_LGS8GXX'
+clean_mk CONFIG_DVB_LGS8GXX drivers/media/dvb/frontends/Makefile
+
+announce DVB_NXT200X - "NxtWave Communications NXT2002/NXT2004 based"
+undefault_firmware 'NXT200[24]' drivers/media/dvb/frontends/nxt200x.c
+reject_firmware drivers/media/dvb/frontends/nxt200x.c
+clean_blob drivers/media/dvb/frontends/nxt200x.c
+clean_kconfig drivers/media/dvb/frontends/Kconfig 'DVB_NXT200X'
+clean_mk CONFIG_DVB_NXT200X drivers/media/dvb/frontends/Makefile
+
+announce DVB_OR51132 - "Oren OR51132 based"
+reject_firmware drivers/media/dvb/frontends/or51132.c
+clean_blob drivers/media/dvb/frontends/or51132.c
+clean_kconfig drivers/media/dvb/frontends/Kconfig 'DVB_OR51132'
+clean_mk CONFIG_DVB_OR51132 drivers/media/dvb/frontends/Makefile
+
+announce DVB_OR51211 - "Oren OR51211 based"
+undefault_firmware 'OR51211' drivers/media/dvb/frontends/or51211.c
+reject_firmware drivers/media/dvb/frontends/or51211.c
+reject_firmware drivers/media/dvb/frontends/or51211.h
+clean_blob drivers/media/dvb/frontends/or51211.c
+clean_kconfig drivers/media/dvb/frontends/Kconfig 'DVB_OR51211'
+clean_mk CONFIG_DVB_OR51211 drivers/media/dvb/frontends/Makefile
+
+announce DVB_SP8870 - "Spase sp8870"
+undefault_firmware 'SP8870' drivers/media/dvb/frontends/sp8870.c
+reject_firmware drivers/media/dvb/frontends/sp8870.c
+reject_firmware drivers/media/dvb/frontends/sp8870.h
+clean_blob drivers/media/dvb/frontends/sp8870.c
+clean_kconfig drivers/media/dvb/frontends 'DVB_SP8870'
+clean_mk CONFIG_DVB_SP8870 drivers/media/dvb/frontends/Makefile
+
+announce DVB_CX24116 - "Conexant CX24116 based"
+undefault_firmware CX24116 drivers/media/dvb/frontends/cx24116.c
+reject_firmware drivers/media/dvb/frontends/cx24116.c
+clean_kconfig drivers/media/dvb/frontends/Kconfig 'DVB_CX24116'
+clean_mk CONFIG_DVB_CX24116 drivers/media/dvb/frontends/Makefile
+
+announce DVB_SP887X - "Spase sp887x based"
+undefault_firmware 'SP887X' drivers/media/dvb/frontends/sp887x.c
+reject_firmware drivers/media/dvb/frontends/sp887x.c
+reject_firmware drivers/media/dvb/frontends/sp887x.h
+clean_blob drivers/media/dvb/frontends/sp887x.c
+clean_kconfig drivers/media/dvb/frontends/Kconfig 'DVB_SP887X'
+clean_mk CONFIG_DVB_SP887X drivers/media/dvb/frontends/Makefile
+
+announce DVB_TDA10048 - "Philips TDA10048HN based"
+undefine_macro 'TDA10048_DEFAULT_FIRMWARE_SIZE' 0 \
+ 'removed non-Free firmware size' drivers/media/dvb/frontends/tda10048.c
+undefault_firmware 'TDA10048' drivers/media/dvb/frontends/tda10048.c
+reject_firmware drivers/media/dvb/frontends/tda10048.c
+clean_kconfig drivers/media/dvb/frontends/Kconfig 'DVB_TDA10048'
+clean_mk CONFIG_DVB_TDA10048 drivers/media/dvb/frontends/Makefile
+
+announce DVB_TDA1004X - "Philips TDA10045H/TDA10046H"
+undefault_firmware 'TDA1004[56]' drivers/media/dvb/frontends/tda1004x.c
+reject_firmware drivers/media/dvb/frontends/tda1004x.c
+reject_firmware drivers/media/dvb/frontends/tda1004x.h
+clean_blob drivers/media/dvb/frontends/tda1004x.c
+clean_kconfig drivers/media/dvb/frontends 'DVB_TDA1004X'
+clean_mk CONFIG_DVB_TDA1004X drivers/media/dvb/frontends/Makefile
+
+# dvb
+
+announce DVB_AV7110 - "AV7110 cards"
+reject_firmware drivers/media/dvb/ttpci/av7110.c
+clean_blob drivers/media/dvb/ttpci/av7110.c
+clean_kconfig drivers/media/dvb/ttpci/Kconfig 'DVB_AV7110'
+clean_mk CONFIG_DVB_AV7110 drivers/media/dvb/ttpci/Makefile
+
+announce DVB_BUDGET - "Budget cards"
+reject_firmware drivers/media/dvb/ttpci/budget.c
+reject_firmware drivers/media/dvb/frontends/tdhd1.h
+
+announce DVB_BUDGET_AV - "Budget cards with analog video inputs"
+reject_firmware drivers/media/dvb/ttpci/budget-av.c
+
+announce DVB_BUDGET_CI - "Budget cards with onboard CI connector"
+reject_firmware drivers/media/dvb/ttpci/budget-ci.c
+
+announce DVB_DRX397XD - "Micronas DRX3975D/DRX3977D based"
+reject_firmware drivers/media/dvb/frontends/drx397xD.c
+clean_blob drivers/media/dvb/frontends/drx397xD_fw.h
+clean_kconfig drivers/media/dvb/frontends/Kconfig 'DVB_DRX397XD'
+clean_mk CONFIG_DVB_DRX397XD drivers/media/dvb/frontends/Makefile
+
+announce DVB_NGENE - "Micronas nGene support"
+reject_firmware drivers/media/dvb/ngene/ngene-core.c
+clean_blob drivers/media/dvb/ngene/ngene-core.c
+clean_kconfig drivers/media/dvb/ngene/Kconfig 'DVB_NGENE'
+clean_mk CONFIG_DVB_NGENE drivers/media/dvb/ngene/Makefile
+
+announce DVB_PLUTO2 - "Pluto2 cards"
+reject_firmware drivers/media/dvb/pluto2/pluto2.c
+
+announce SMS_SIANO_MDTV - "Siano SMS1xxx based MDTV receiver"
+reject_firmware drivers/media/dvb/siano/smscoreapi.c
+clean_blob drivers/media/dvb/siano/smscoreapi.c
+clean_blob drivers/media/dvb/siano/sms-cards.c
+clean_kconfig drivers/media/dvb/siano/Kconfig 'SMS_SIANO_MDTV'
+clean_mk CONFIG_SMS_SIANO_MDTV drivers/media/dvb/siano/Makefile
+
+announce SMS_USB_DRV - "Siano's USB interface support"
+reject_firmware drivers/media/dvb/siano/smsusb.c
+clean_blob drivers/media/dvb/siano/smsusb.c
+clean_kconfig drivers/media/dvb/siano/Kconfig 'SMS_USB_DRV'
+clean_mk CONFIG_SMS_USB_DRV drivers/media/dvb/siano/Makefile
+
+announce DVB_TTUSB_BUDGET - "Technotrend/Hauppauge Nova-USB devices"
+drop_fw_file firmware/ttusb-budget/dspbootcode.bin.ihex firmware/ttusb-budget/dspbootcode.bin
+reject_firmware drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
+clean_blob drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
+clean_kconfig drivers/media/dvb/ttusb-budget/Kconfig 'DVB_TTUSB_BUDGET'
+clean_mk CONFIG_DVB_TTUSB_BUDGET drivers/media/dvb/ttusb-budget/Makefile
+
+announce DVB_TTUSB_DEC - "Technotrend/Hauppauge USB DEC devices"
+reject_firmware drivers/media/dvb/ttusb-dec/ttusb_dec.c
+clean_blob drivers/media/dvb/ttusb-dec/ttusb_dec.c
+clean_kconfig drivers/media/dvb/ttusb-dec/Kconfig 'DVB_TTUSB_DEC'
+clean_mk CONFIG_DVB_TTUSB_DEC drivers/media/dvb/ttusb-dec/Makefile
+
+# video
+
+announce VIDEO_BT848 - "BT848 Video For Linux"
+reject_firmware drivers/media/video/bt8xx/bttv-cards.c
+clean_kconfig drivers/media/video/bt8xx/Kconfig 'VIDEO_BT848'
+clean_mk CONFIG_VIDEO_BT848 drivers/media/video/bt8xx/Makefile
+
+announce VIDEO_CPIA2 - "CPiA2 Video For Linux"
+clean_fw firmware/cpia2/stv0672_vp4.bin.ihex firmware/cpia2/stv0672_vp4.bin
+reject_firmware drivers/media/video/cpia2/cpia2_core.c
+clean_blob drivers/media/video/cpia2/cpia2_core.c
+clean_kconfig drivers/media/video/cpia2/Kconfig 'VIDEO_CPIA2'
+clean_mk CONFIG_VIDEO_CPIA2 drivers/media/video/cpia2/Makefile
+
+announce VIDEO_CX18 - "Conexant cx23418 MPEG encoder support"
+reject_firmware drivers/media/video/cx18/cx18-av-firmware.c
+reject_firmware drivers/media/video/cx18/cx18-dvb.c
+reject_firmware drivers/media/video/cx18/cx18-firmware.c
+clean_blob drivers/media/video/cx18/cx18-av-firmware.c
+clean_blob drivers/media/video/cx18/cx18-dvb.c
+clean_blob drivers/media/video/cx18/cx18-firmware.c
+clean_kconfig drivers/media/video/cx18/Kconfig 'VIDEO_CX18'
+clean_mk CONFIG_VIDEO_CX18 drivers/media/video/cx18/Makefile
+
+announce VIDEO_CX231XX - "Conexant cx231xx USB video capture support"
+reject_firmware drivers/media/video/cx231xx/cx231xx-417.c
+clean_blob drivers/media/video/cx231xx/cx231xx-417.c
+clean_kconfig drivers/media/video/cx231xx/Kconfig 'VIDEO_CX231XX'
+clean_mk CONFIG_VIDEO_CX231XX drivers/media/video/cx231xx/Makefile
+
+announce VIDEO_CX23885 - "Conexant cx23885 (2388x successor) support"
+reject_firmware drivers/media/video/cx23885/cx23885-417.c
+clean_blob drivers/media/video/cx23885/cx23885-417.c
+clean_kconfig drivers/media/video/cx23885/Kconfig 'VIDEO_CX23885'
+clean_mk CONFIG_VIDEO_CX23885 drivers/media/video/cx23885/Makefile
+
+announce VIDEO_CX25840 - "Conexant CX2584x audio/video decoders"
+reject_firmware drivers/media/video/cx25840/cx25840-firmware.c
+clean_blob drivers/media/video/cx25840/cx25840-firmware.c
+clean_kconfig drivers/media/video/cx25840/Kconfig 'VIDEO_CX25840'
+clean_mk CONFIG_VIDEO_CX25840 drivers/media/video/cx25840/Makefile
+
+announce VIDEO_CX88_BLACKBIRD - "Blackbird MPEG encoder support (cx2388x + cx23416)"
+reject_firmware drivers/media/video/cx88/cx88-blackbird.c
+clean_kconfig drivers/media/video/cx88/Kconfig 'VIDEO_CX88_BLACKBIRD'
+clean_mk CONFIG_VIDEO_CX88_BLACKBIRD drivers/media/video/cx88/Makefile
+
+announce VIDEO_IVTV - "Conexant cx23416/cx23415 MPEG encoder/decoder support"
+reject_firmware drivers/media/video/ivtv/ivtv-firmware.c
+clean_blob drivers/media/video/ivtv/ivtv-firmware.c
+clean_kconfig drivers/media/video/ivtv/Kconfig 'VIDEO_IVTV'
+clean_mk CONFIG_VIDEO_IVTV drivers/media/video/ivtv/Makefile
+
+announce VIDEO_PVRUSB2 - "Hauppauge WinTV-PVR USB2 support"
+reject_firmware drivers/media/video/pvrusb2/pvrusb2-hdw.c
+clean_blob drivers/media/video/pvrusb2/pvrusb2-devattr.c
+clean_kconfig drivers/media/video/pvrusb2/Kconfig 'VIDEO_PVRUSB2'
+clean_mk CONFIG_VIDEO_PVRUSB2 drivers/media/video/pvrusb2/Makefile
+
+announce "VIDEO_CX23885, VIDEO_CX88_BLACKBIRD, VIDEO_IVTV, VIDEO_PVRUSB2" - "See above"
+clean_blob include/media/cx2341x.h
+
+announce VIDEO_GO7007 - "Go 7007 support"
+reject_firmware drivers/staging/go7007/go7007-driver.c
+clean_blob drivers/staging/go7007/go7007-driver.c
+reject_firmware drivers/staging/go7007/go7007-fw.c
+clean_blob drivers/staging/go7007/go7007-usb.c
+clean_blob drivers/staging/go7007/saa7134-go7007.c
+clean_kconfig drivers/staging/go7007/Kconfig 'VIDEO_GO7007'
+clean_mk CONFIG_VIDEO_GO7007 drivers/staging/go7007/Makefile
+
+announce VIDEO_GO7007_USB_S2250_BOARD - "Sensoray 2250/2251 support"
+reject_firmware drivers/staging/go7007/s2250-loader.c
+clean_blob drivers/staging/go7007/s2250-loader.c
+clean_kconfig drivers/staging/go7007/Kconfig 'VIDEO_GO7007_USB_S2250_BOARD'
+clean_mk CONFIG_VIDEO_GO7007_USB_S2250_BOARD drivers/staging/go7007/Makefile
+
+announce VIDEO_SAA7134_DVB - "DVB/ATSC Support for saa7134 based TV cards"
+reject_firmware drivers/media/video/saa7134/saa7134-dvb.c
+clean_kconfig drivers/media/video/saa7134/Kconfig 'VIDEO_SAA7134_DVB'
+clean_mk CONFIG_VIDEO_SAA7134_DVB drivers/media/video/saa7134/Makefile
+
+announce VIDEO_SAA7164 - "NXP SAA7164 support"
+reject_firmware drivers/media/video/saa7164/saa7164-fw.c
+clean_blob drivers/media/video/saa7164/saa7164-fw.c
+clean_kconfig drivers/media/video/saa7164/Kconfig 'VIDEO_SAA7164'
+clean_mk CONFIG_VIDEO_SAA7164 drivers/media/video/saa7164/Makefile
+
+announce VIDEO_TLG2300 - "Telegent TLG2300 USB video capture support"
+reject_firmware drivers/media/video/tlg2300/pd-main.c
+clean_blob drivers/media/video/tlg2300/pd-main.c
+clean_kconfig drivers/media/video/tlg2300/Kconfig 'VIDEO_TLG2300'
+clean_mk CONFIG_VIDEO_TLG2300 drivers/media/video/tlg2300/Makefile
+
+announce USB_DABUSB - "DABUSB driver"
+clean_fw firmware/dabusb/bitstream.bin.ihex firmware/dabusb/bitstream.bin
+clean_fw firmware/dabusb/firmware.HEX firmware/dabusb/firmware.fw
+reject_firmware drivers/staging/dabusb/dabusb.c
+clean_blob drivers/staging/dabusb/dabusb.c
+clean_kconfig drivers/staging/dabusb/Kconfig 'USB_DABUSB'
+clean_mk CONFIG_USB_DABUSB drivers/staging/dabusb/Makefile
+
+announce USB_S2255 - "USB Sensoray 2255 video capture device"
+reject_firmware drivers/media/video/s2255drv.c
+clean_blob drivers/media/video/s2255drv.c
+clean_kconfig drivers/media/video/Kconfig 'USB_S2255'
+clean_mk CONFIG_USB_S2255 drivers/media/video/Makefile
+
+announce USB_VICAM - "USB 3com HomeConnect, AKA vicam"
+drop_fw_file firmware/vicam/firmware.H16 firmware/vicam/firmware.fw
+reject_firmware drivers/staging/usbvideo/vicam.c
+clean_blob drivers/staging/usbvideo/vicam.c
+clean_kconfig drivers/staging/usbvideo/Kconfig 'USB_VICAM'
+clean_mk CONFIG_USB_VICAM drivers/staging/usbvideo/Makefile
+
+# radio
+
+announce RADIO_WL1273 - "Texas Instruments WL1273 I2C FM Radio"
+reject_firmware drivers/media/radio/radio-wl1273.c
+clean_blob drivers/media/radio/radio-wl1273.c
+clean_kconfig drivers/media/radio/Kconfig 'RADIO_WL1273'
+clean_mk CONFIG_RADIO_WL1273 drivers/media/radio/Makefile
+
+#######
+# net #
+#######
+
+announce ACENIC - "Alteon AceNIC/3Com 3C985/NetGear GA620 Gigabit"
+drop_fw_file firmware/acenic/tg1.bin.ihex firmware/acenic/tg1.bin
+drop_fw_file firmware/acenic/tg2.bin.ihex firmware/acenic/tg2.bin
+reject_firmware drivers/net/acenic.c
+clean_blob drivers/net/acenic.c
+clean_kconfig drivers/net/Kconfig 'ACENIC'
+clean_mk CONFIG_ACENIC drivers/net/Makefile
+
+announce ADAPTEC_STARFIRE - "Adaptec Starfire/DuraLAN support"
+clean_fw firmware/adaptec/starfire_rx.bin.ihex firmware/adaptec/starfire_rx.bin
+clean_fw firmware/adaptec/starfire_tx.bin.ihex firmware/adaptec/starfire_tx.bin
+reject_firmware drivers/net/starfire.c
+clean_blob drivers/net/starfire.c
+clean_kconfig drivers/net/Kconfig 'ADAPTEC_STARFIRE'
+clean_mk CONFIG_ADAPTEC_STARFIRE drivers/net/Makefile
+
+announce CONFIG_BNA - "Brocade 1010/1020 10Gb Ethernet Driver support"
+clean_blob drivers/net/bna/bnad.c
+clean_blob drivers/net/bna/cna.h
+reject_firmware drivers/net/bna/cna_fwimg.c
+clean_kconfig drivers/net/Kconfig 'BNA'
+clean_mk CONFIG_BNA drivers/net/bna/Makefile
+
+announce BNX2 - "Broadcom NetXtremeII"
+drop_fw_file firmware/bnx2/bnx2-mips-09-6.2.1.fw.ihex firmware/bnx2/bnx2-mips-09-6.2.1.fw
+drop_fw_file firmware/bnx2/bnx2-rv2p-09-6.0.17.fw.ihex firmware/bnx2/bnx2-rv2p-09-6.0.17.fw
+drop_fw_file firmware/bnx2/bnx2-rv2p-09ax-6.0.17.fw.ihex firmware/bnx2/bnx2-rv2p-09ax-6.0.17.fw
+drop_fw_file firmware/bnx2/bnx2-mips-06-6.2.1.fw.ihex firmware/bnx2/bnx2-mips-06-6.2.1.fw
+drop_fw_file firmware/bnx2/bnx2-rv2p-06-6.0.15.fw.ihex firmware/bnx2/bnx2-rv2p-06-6.0.15.fw
+reject_firmware drivers/net/bnx2.c
+clean_blob drivers/net/bnx2.c
+clean_kconfig drivers/net/Kconfig 'BNX2'
+clean_mk CONFIG_BNX2 drivers/net/Makefile
+
+announce BNX2X - "Broadcom NetXtremeII 10Gb support"
+drop_fw_file firmware/bnx2x/bnx2x-e1-6.2.5.0.fw.ihex firmware/bnx2x/bnx2x-e1-6.2.5.0.fw
+drop_fw_file firmware/bnx2x/bnx2x-e1h-6.2.5.0.fw.ihex firmware/bnx2x/bnx2x-e1h-6.2.5.0.fw
+drop_fw_file firmware/bnx2x/bnx2x-e2-6.2.5.0.fw.ihex firmware/bnx2x/bnx2x-e2-6.2.5.0.fw
+reject_firmware drivers/net/bnx2x/bnx2x_main.c
+clean_sed '
+/^#include "bnx2x_init\.h"/,/^$/{
+ /^$/i\
+#define bnx2x_init_block(bp, start, end) \\\
+ return (printk(KERN_ERR "%s: Missing Free firmware\\n", bp->dev->name),\\\
+ -EINVAL)
+}' drivers/net/bnx2x/bnx2x_main.c 'report missing Free firmware'
+clean_blob drivers/net/bnx2x/bnx2x_main.c
+clean_blob drivers/net/bnx2x/bnx2x_hsi.h
+clean_blob drivers/net/bnx2x/bnx2x_init_ops.h
+clean_kconfig drivers/net/Kconfig 'BNX2X'
+clean_mk CONFIG_BNX2X drivers/net/Makefile
+
+announce CASSINI - "Sun Cassini"
+drop_fw_file firmware/sun/cassini.bin.ihex firmware/sun/cassini.bin
+reject_firmware drivers/net/cassini.c
+clean_blob drivers/net/cassini.c
+clean_kconfig drivers/net/Kconfig 'CASSINI'
+clean_mk CONFIG_CASSINI drivers/net/Makefile
+
+announce CHELSIO_T3 - "Chelsio AEL 2005 support"
+drop_fw_file firmware/cxgb3/t3b_psram-1.1.0.bin.ihex firmware/cxgb3/t3b_psram-1.1.0.bin
+drop_fw_file firmware/cxgb3/t3c_psram-1.1.0.bin.ihex firmware/cxgb3/t3c_psram-1.1.0.bin
+drop_fw_file firmware/cxgb3/t3fw-7.10.0.bin.ihex firmware/cxgb3/t3fw-7.10.0.bin
+drop_fw_file firmware/cxgb3/ael2005_opt_edc.bin.ihex firmware/cxgb3/ael2005_opt_edc.bin
+drop_fw_file firmware/cxgb3/ael2005_twx_edc.bin.ihex firmware/cxgb3/ael2005_twx_edc.bin
+drop_fw_file firmware/cxgb3/ael2020_twx_edc.bin.ihex firmware/cxgb3/ael2020_twx_edc.bin
+reject_firmware drivers/net/cxgb3/cxgb3_main.c
+clean_blob drivers/net/cxgb3/cxgb3_main.c
+clean_kconfig drivers/net/Kconfig 'CHELSIO_T3'
+clean_mk CONFIG_CHELSIO_T3 drivers/net/cxgb3/Makefile
+
+announce CHELSIO_T4 - "Chelsio Communications T4 Ethernet support"
+reject_firmware drivers/net/cxgb4/cxgb4_main.c
+clean_blob drivers/net/cxgb4/cxgb4_main.c
+clean_kconfig drivers/net/Kconfig 'CHELSIO_T4'
+clean_mk CONFIG_CHELSIO_T4 drivers/net/cxgb4/Makefile
+
+announce E100 - "Intel PRO/100+"
+drop_fw_file firmware/e100/d101m_ucode.bin.ihex firmware/e100/d101m_ucode.bin
+drop_fw_file firmware/e100/d101s_ucode.bin.ihex firmware/e100/d101s_ucode.bin
+drop_fw_file firmware/e100/d102e_ucode.bin.ihex firmware/e100/d102e_ucode.bin
+reject_firmware drivers/net/e100.c
+clean_sed '
+/^static const struct firmware \*e100_\(reject\|request\)_firmware(/,/^}$/{
+ s:^\(.*\)return ERR_PTR(err);$:\1netif_err(nic, probe, nic->netdev, "Proceeding without firmware\\n");\n\1return NULL;:
+}' drivers/net/e100.c 'proceed without firmware'
+clean_blob drivers/net/e100.c
+clean_kconfig drivers/net/Kconfig 'E100'
+clean_mk CONFIG_E100 drivers/net/Makefile
+
+announce FT1000_PCMCIA - "Driver for ft1000 pcmcia device."
+clean_file drivers/staging/ft1000/ft1000-pcmcia/ft1000.img
+reject_firmware drivers/staging/ft1000/TODO
+clean_blob drivers/staging/ft1000/ft1000-pcmcia/boot.h
+clean_sed '
+/^static int ft1000_reset_card/,/^}$/ {
+ /card_bootload/i\
+ return /*(DEBLOBBED)*/ FALSE;
+}
+' drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c \
+ 'disabled non-Free firmware-loading machinery'
+reject_firmware drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
+clean_blob drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
+clean_kconfig drivers/staging/ft1000/Kconfig 'FT1000_PCMCIA'
+clean_mk CONFIG_FT1000_PCMCIA drivers/staging/ft1000/Makefile
+
+announce FT1000_USB - "Driver for ft1000 USB devices."
+clean_file drivers/staging/ft1000/ft1000-usb/ft3000.img
+reject_firmware drivers/staging/ft1000/ft1000-usb/ft1000_usb.c
+clean_blob drivers/staging/ft1000/ft1000-usb/ft1000_usb.c
+clean_kconfig drivers/staging/ft1000/Kconfig 'FT1000_USB'
+clean_mk CONFIG_FT1000_USB drivers/staging/ft1000/Makefile
+
+announce MYRI_SBUS - "MyriCOM Gigabit Ethernet"
+drop_fw_file firmware/myricom/lanai.bin.ihex firmware/myricom/lanai.bin
+reject_firmware drivers/net/myri_sbus.c
+clean_blob drivers/net/myri_sbus.c
+clean_kconfig drivers/net/Kconfig 'MYRI_SBUS'
+clean_mk CONFIG_MYRI_SBUS drivers/net/Makefile
+
+announce MYRI10GE - "Myricom Myri-10G Ethernet support"
+reject_firmware drivers/net/myri10ge/myri10ge.c
+clean_blob drivers/net/myri10ge/myri10ge.c
+clean_kconfig drivers/net/Kconfig 'MYRI10GE'
+clean_mk CONFIG_MYRI10GE drivers/net/myri10ge/Makefile
+
+announce NETXEN_NIC - "NetXen Multi port (1/10) Gigabit Ethernet NIC"
+reject_firmware drivers/net/netxen/netxen_nic.h
+reject_firmware drivers/net/netxen/netxen_nic_main.c
+reject_firmware drivers/net/netxen/netxen_nic_init.c
+clean_blob drivers/net/netxen/netxen_nic.h
+clean_blob drivers/net/netxen/netxen_nic_main.c
+clean_kconfig drivers/net/Kconfig 'NETXEN_NIC'
+clean_mk CONFIG_NETXEN_NIC drivers/net/Makefile
+
+announce QLCNIC - "QLOGIC QLCNIC 1/10Gb Converged Ethernet NIC Support"
+reject_firmware drivers/net/qlcnic/qlcnic.h
+reject_firmware drivers/net/qlcnic/qlcnic_init.c
+reject_firmware drivers/net/qlcnic/qlcnic_main.c
+clean_blob drivers/net/qlcnic/qlcnic.h
+clean_blob drivers/net/qlcnic/qlcnic_main.c
+clean_kconfig drivers/net/Kconfig 'QLCNIC'
+clean_mk CONFIG_QLCNIC drivers/net/qlcnic/Makefile
+
+announce R8169 - "Realtek 8169 gigabit ethernet support"
+reject_firmware drivers/net/r8169.c
+clean_blob drivers/net/r8169.c
+clean_kconfig drivers/net/Kconfig R8169
+clean_mk CONFIG_R8169 drivers/net/Makefile
+
+announce SLICOSS - "Alacritech Gigabit IS-NIC cards"
+reject_firmware drivers/staging/slicoss/slicoss.c
+clean_blob drivers/staging/slicoss/slicoss.c
+clean_kconfig drivers/staging/slicoss/Kconfig 'SLICOSS'
+clean_mk CONFIG_SLICOSS drivers/staging/slicoss/Makefile
+
+announce SPIDER_NET - "Spider Gigabit Ethernet driver"
+reject_firmware drivers/net/spider_net.c
+clean_sed 's,spider_fw\.bin,DEBLOBBED.bin,g' \
+ drivers/net/spider_net.c 'removed non-Free firmware notes'
+clean_blob drivers/net/spider_net.c
+clean_blob drivers/net/spider_net.h
+clean_kconfig drivers/net/Kconfig 'SPIDER_NET'
+clean_mk CONFIG_SPIDER_NET drivers/net/Makefile
+
+announce TEHUTI - "Tehuti Networks 10G Ethernet"
+drop_fw_file firmware/tehuti/bdx.bin.ihex firmware/tehuti/bdx.bin
+reject_firmware drivers/net/tehuti.c
+clean_blob drivers/net/tehuti.c
+clean_kconfig drivers/net/Kconfig 'TEHUTI'
+clean_mk CONFIG_TEHUTI drivers/net/Makefile
+
+announce TIGON3 - "Broadcom Tigon3"
+drop_fw_file firmware/tigon/tg3.bin.ihex firmware/tigon/tg3.bin
+drop_fw_file firmware/tigon/tg3_tso.bin.ihex firmware/tigon/tg3_tso.bin
+drop_fw_file firmware/tigon/tg3_tso5.bin.ihex firmware/tigon/tg3_tso5.bin
+reject_firmware drivers/net/tg3.c
+clean_blob drivers/net/tg3.c
+clean_kconfig drivers/net/Kconfig 'TIGON3'
+clean_mk CONFIG_TIGON3 drivers/net/Makefile
+
+announce TYPHOON - "3cr990 series Typhoon"
+drop_fw_file firmware/3com/typhoon.bin.ihex firmware/3com/typhoon.bin
+reject_firmware drivers/net/typhoon.c
+clean_blob drivers/net/typhoon.c
+clean_kconfig drivers/net/Kconfig 'TYPHOON'
+clean_mk CONFIG_TYPHOON drivers/net/Makefile
+
+announce VXGE - "Exar X3100 Series 10GbE PCIe Server Adapter"
+reject_firmware drivers/net/vxge/vxge-main.c
+clean_blob drivers/net/vxge/vxge-main.c
+clean_kconfig drivers/net/Kconfig 'VXGE'
+clean_mk CONFIG_VXGE drivers/net/vxge/Makefile
+
+# appletalk
+
+announce COPS - "COPS LocalTalk PC"
+clean_sed '
+/sizeof(\(ff\|lt\)drv_code)/{
+ i\
+ printk(KERN_INFO "%s: Missing Free firmware.\\n", dev->name);\
+ return;
+}
+/\(ff\|lt\)drv_code/d;
+' drivers/net/appletalk/cops.c 'report missing Free firmware'
+clean_blob drivers/net/appletalk/cops.c
+clean_file drivers/net/appletalk/cops_ffdrv.h
+clean_file drivers/net/appletalk/cops_ltdrv.h
+clean_kconfig drivers/net/appletalk/Kconfig 'COPS'
+clean_mk CONFIG_COPS drivers/net/appletalk/Makefile
+
+# hamradio
+
+announce YAM - "YAM driver for AX.25"
+drop_fw_file firmware/yam/1200.bin.ihex firmware/yam/1200.bin
+drop_fw_file firmware/yam/9600.bin.ihex firmware/yam/9600.bin
+reject_firmware drivers/net/hamradio/yam.c
+clean_blob drivers/net/hamradio/yam.c
+clean_kconfig drivers/net/hamradio/Kconfig 'YAM'
+clean_mk CONFIG_YAM drivers/net/hamradio/Makefile
+
+# irda
+
+announce USB_IRDA - "IrDA USB dongles"
+reject_firmware drivers/net/irda/irda-usb.c
+clean_blob drivers/net/irda/irda-usb.c
+clean_kconfig drivers/net/irda/Kconfig 'USB_IRDA'
+clean_mk CONFIG_USB_IRDA drivers/net/irda/Makefile
+
+# pcmcia
+
+announce PCMCIA_SMC91C92 - "SMC 91Cxx PCMCIA"
+drop_fw_file firmware/ositech/Xilinx7OD.bin.ihex firmware/ositech/Xilinx7OD.bin
+reject_firmware drivers/net/pcmcia/smc91c92_cs.c
+clean_blob drivers/net/pcmcia/smc91c92_cs.c
+clean_kconfig drivers/net/pcmcia/Kconfig 'PCMCIA_SMC91C92'
+clean_mk CONFIG_PCMCIA_SMC91C92 drivers/net/pcmcia/Makefile
+
+# CIS files are not software.
+# announce PCCARD - "PCCard (PCMCIA/CardBus) support"
+# reject_firmware drivers/pcmcia/ds.c
+# clean_kconfig drivers/pcmcia/Kconfig 'PCCARD'
+# clean_mk CONFIG_PCCARD drivers/pcmcia/Makefile
+
+announce PCMCIA_3C574 - "3Com 3c574 PCMCIA support"
+# This is not software; it's Free, but GPLed without in-tree sources.
+drop_fw_file firmware/cis/3CCFEM556.cis.ihex firmware/cis/3CCFEM556.cis
+# clean_blob drivers/net/pcmcia/3c574_cs.c
+# clean_kconfig drivers/net/pcmcia/Kconfig 'PCMCIA_3C574'
+# clean_mk CONFIG_PCMCIA_3C574 drivers/net/pcmcia/Makefile
+
+announce PCMCIA_3C589 - "3Com 3c589 PCMCIA support"
+# This is not software; it's Free, but GPLed without in-tree sources.
+drop_fw_file firmware/cis/3CXEM556.cis.ihex firmware/cis/3CXEM556.cis
+# clean_blob drivers/net/pcmcia/3c589_cs.c
+# clean_kconfig drivers/net/pcmcia/Kconfig 'PCMCIA_3C589'
+# clean_mk CONFIG_PCMCIA_3C589 drivers/net/pcmcia/Makefile
+
+announce PCMCIA_PCNET - "NE2000 compatible PCMCIA support"
+# These are not software; they're Free, but GPLed without in-tree sources.
+drop_fw_file firmware/cis/LA-PCM.cis.ihex firmware/cis/LA-PCM.cis
+drop_fw_file firmware/cis/PCMLM28.cis.ihex firmware/cis/PCMLM28.cis
+drop_fw_file firmware/cis/DP83903.cis.ihex firmware/cis/DP83903.cis
+drop_fw_file firmware/cis/NE2K.cis.ihex firmware/cis/NE2K.cis
+drop_fw_file firmware/cis/tamarack.cis.ihex firmware/cis/tamarack.cis
+drop_fw_file firmware/cis/PE-200.cis.ihex firmware/cis/PE-200.cis
+drop_fw_file firmware/cis/PE520.cis.ihex firmware/cis/PE520.cis
+# clean_blob drivers/net/pcmcia/pcnet_cs.c
+# clean_kconfig drivers/net/pcmcia/Kconfig 'PCMCIA_PCNET'
+# clean_mk CONFIG_PCMCIA_PCNET drivers/net/pcmcia/Makefile
+
+# tokenring
+
+announce 3C359 - "3Com 3C359 Token Link Velocity XL adapter"
+drop_fw_file firmware/3com/3C359.bin.ihex firmware/3com/3C359.bin
+reject_firmware drivers/net/tokenring/3c359.c
+clean_blob drivers/net/tokenring/3c359.c
+clean_kconfig drivers/net/tokenring/Kconfig '3C359'
+clean_mk CONFIG_3C359 drivers/net/tokenring/Makefile
+
+announce SMCTR - "SMC ISA/MCA adapter"
+drop_fw_file firmware/tr_smctr.bin.ihex firmware/tr_smctr.bin
+reject_firmware drivers/net/tokenring/smctr.c
+clean_blob drivers/net/tokenring/smctr.c
+clean_kconfig drivers/net/tokenring/Kconfig 'SMCTR'
+clean_mk CONFIG_SMCTR drivers/net/tokenring/Makefile
+
+announce TMS380TR - "Generic TMS380 Token Ring ISA/PCI adapter support"
+reject_firmware drivers/net/tokenring/tms380tr.c
+clean_blob drivers/net/tokenring/tms380tr.c
+clean_kconfig drivers/net/tokenring/Kconfig 'TMS380TR'
+clean_mk CONFIG_TMS380TR drivers/net/tokenring/Makefile
+
+# usb
+
+announce USB_KAWETH - "USB KLSI KL5USB101-based ethernet device support"
+drop_fw_file firmware/kaweth/new_code.bin.ihex firmware/kaweth/new_code.bin
+drop_fw_file firmware/kaweth/new_code_fix.bin.ihex firmware/kaweth/new_code_fix.bin
+drop_fw_file firmware/kaweth/trigger_code.bin.ihex firmware/kaweth/trigger_code.bin
+drop_fw_file firmware/kaweth/trigger_code_fix.bin.ihex firmware/kaweth/trigger_code_fix.bin
+reject_firmware drivers/net/usb/kaweth.c
+clean_blob drivers/net/usb/kaweth.c
+clean_kconfig drivers/net/usb/Kconfig 'USB_KAWETH'
+clean_mk CONFIG_USB_KAWETH drivers/net/usb/Makefile
+
+# wireless
+
+announce ATMEL "Atmel at76c50x chipset 802.11b support"
+reject_firmware drivers/net/wireless/atmel.c
+clean_blob drivers/net/wireless/atmel.c
+clean_kconfig drivers/net/wireless/Kconfig 'ATMEL'
+clean_mk CONFIG_ATMEL drivers/net/wireless/Makefile
+
+announce AT76C50X_USB - "Atmel at76c503/at76c505/at76c505a USB cards"
+reject_firmware drivers/net/wireless/at76c50x-usb.c
+clean_blob drivers/net/wireless/at76c50x-usb.c
+clean_kconfig drivers/net/wireless/Kconfig 'AT76C50X_USB'
+clean_mk CONFIG_AT76C50X_USB drivers/net/wireless/Makefile
+
+announce B43 - "Broadcom 43xx wireless support (mac80211 stack)"
+maybe_reject_firmware drivers/net/wireless/b43/main.c
+clean_sed '
+/^static int b43_upload_microcode(/,/^}$/{
+ / if (dev->fw\.opensource) {$/i\
+ if (!dev->fw.opensource) {\
+ b43err(dev->wl, "Rejected non-Free firmware\\n");\
+ err = -EOPNOTSUPP;\
+ goto error;\
+ }
+}' drivers/net/wireless/b43/main.c 'double-check and reject non-Free firmware'
+# Major portions of firmware filenames not deblobbed.
+clean_blob drivers/net/wireless/b43/main.c
+clean_kconfig drivers/net/wireless/b43/Kconfig 'B43'
+clean_mk CONFIG_B43 drivers/net/wireless/b43/Makefile
+
+announce B43LEGACY - "Broadcom 43xx-legacy wireless support (mac80211 stack)"
+reject_firmware drivers/net/wireless/b43legacy/main.c
+# Major portions of firwmare filenames not deblobbed.
+clean_blob drivers/net/wireless/b43legacy/main.c
+clean_kconfig drivers/net/wireless/b43legacy/Kconfig 'B43LEGACY'
+clean_mk CONFIG_B43LEGACY drivers/net/wireless/b43legacy/Makefile
+
+announce BRCM80211_PCI - "Broadcom IEEE802.11n PCIe SoftMAC WLAN driver"
+clean_blob drivers/staging/brcm80211/README
+reject_firmware drivers/staging/brcm80211/sys/wl_mac80211.c
+clean_blob drivers/staging/brcm80211/sys/wl_mac80211.c
+clean_kconfig drivers/staging/brcm80211/Kconfig 'BRCM80211_PCI'
+clean_mk CONFIG_BRCM80211_PCI drivers/staging/brcm80211/Makefile
+
+announce BRCMFMAC - "Broadcom IEEE802.11n embedded FullMAC WLAN driver"
+clean_blob drivers/staging/brcm80211/brcmfmac/README
+reject_firmware drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c
+clean_blob drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c
+clean_kconfig drivers/staging/brcm80211/Kconfig 'BRCMFMAC'
+clean_mk CONFIG_BRCMFMAC drivers/staging/brcm80211/Makefile
+
+announce HERMES - "Hermes chipset 802.11b support (Orinoco/Prism2/Symbol)"
+reject_firmware drivers/net/wireless/orinoco/fw.c
+clean_blob drivers/net/wireless/orinoco/fw.c
+clean_kconfig drivers/net/wireless/orinoco/Kconfig 'HERMES'
+clean_mk CONFIG_HERMES drivers/net/wireless/orinoco/Makefile
+
+announce ORINOCO_USB - "Agere Orinoco USB support"
+reject_firmware drivers/net/wireless/orinoco/orinoco_usb.c
+clean_blob drivers/net/wireless/orinoco/orinoco_usb.c
+clean_kconfig drivers/net/wireless/orinoco/Kconfig 'ORINOCO_USB'
+clean_mk CONFIG_ORINOCO_USB drivers/net/wireless/orinoco/Makefile
+
+announce WLAGS49_H2 - 'Agere Systems HERMES II Wireless PC Card Model 0110'
+# Some pieces of the firmware images are most definitely data, but
+# others seem to be code.
+clean_file drivers/staging/wlags49_h2/ap_h2.c
+clean_file drivers/staging/wlags49_h2/sta_h2.c
+clean_blob drivers/staging/wlags49_h2/wl_profile.c
+clean_kconfig drivers/staging/wlags49_h2/Kconfig 'WLAGS49_H2'
+clean_mk CONFIG_WLAGS49_H2 drivers/staging/Makefile
+
+announce WLAGS49_H25 - 'Linksys Systems HERMES II.5 Wireless-G_CompactFlash_Card'
+clean_file drivers/staging/wlags49_h2/ap_h25.c
+clean_file drivers/staging/wlags49_h2/sta_h25.c
+clean_kconfig drivers/staging/wlags49_h25/Kconfig 'WLAGS49_H25'
+clean_mk CONFIG_WLAGS49_H25 drivers/staging/Makefile
+
+announce IPW2100 - "Intel PRO/Wireless 2100 Network Connection"
+reject_firmware drivers/net/wireless/ipw2x00/ipw2100.c
+clean_blob drivers/net/wireless/ipw2x00/ipw2100.c
+clean_kconfig drivers/net/wireless/Kconfig 'IPW2100'
+clean_mk CONFIG_IPW2100 drivers/net/wireless/ipw2x00/Makefile
+
+announce IPW2200 - "Intel PRO/Wireless 2200BG and 2915ABG Network Connection"
+reject_firmware drivers/net/wireless/ipw2x00/ipw2200.c
+clean_blob drivers/net/wireless/ipw2x00/ipw2200.c
+clean_kconfig drivers/net/wireless/Kconfig 'IPW2200'
+clean_mk CONFIG_IPW2200 drivers/net/wireless/ipw2x00/Makefile
+
+announce IWL3945 - "Intel PRO/Wireless 3945ABG/BG Network Connection"
+reject_firmware drivers/net/wireless/iwlwifi/iwl3945-base.c
+clean_blob drivers/net/wireless/iwlwifi/iwl3945-base.c
+clean_blob drivers/net/wireless/iwlwifi/iwl-3945.h
+clean_kconfig drivers/net/wireless/iwlwifi/Kconfig 'IWL3945'
+clean_mk CONFIG_IWL3945 drivers/net/wireless/iwlwifi/Makefile
+
+announce IWLAGN - "Intel Wireless WiFi Next Gen AGN"
+reject_firmware drivers/net/wireless/iwlwifi/iwl-agn.c
+clean_blob drivers/net/wireless/iwlwifi/iwl-agn.c
+clean_kconfig drivers/net/wireless/iwlwifi/Kconfig 'IWLAGN'
+clean_mk CONFIG_IWLAGN drivers/net/wireless/iwlwifi/Makefile
+
+announce IWL4965 - "Intel Wireless WiFi 4965AGN"
+clean_blob drivers/net/wireless/iwlwifi/iwl-4965.c
+clean_kconfig drivers/net/wireless/iwlwifi/Kconfig 'IWL4965'
+clean_mk CONFIG_IWL4965 drivers/net/wireless/iwlwifi/Makefile
+
+announce IWL5000 - "Intel Wireless WiFi 5000AGN"
+clean_blob drivers/net/wireless/iwlwifi/iwl-5000.c
+clean_blob drivers/net/wireless/iwlwifi/iwl-6000.c
+clean_blob drivers/net/wireless/iwlwifi/iwl-1000.c
+clean_kconfig drivers/net/wireless/iwlwifi/Kconfig 'IWL5000'
+clean_mk CONFIG_IWL5000 drivers/net/wireless/iwlwifi/Makefile
+
+announce IWM - "Intel Wireless Multicomm 3200 WiFi driver"
+reject_firmware drivers/net/wireless/iwmc3200wifi/fw.c
+clean_blob drivers/net/wireless/iwmc3200wifi/sdio.c
+clean_kconfig drivers/net/wireless/iwmc3200wifi/Kconfig 'IWM'
+clean_mk CONFIG_IWM drivers/net/wireless/iwmc3200wifi/Makefile
+
+announce IWMC3200TOP - "Intel Wireless MultiCom Top Driver"
+reject_firmware drivers/misc/iwmc3200top/fw-download.c
+undefine_macro '_FW_NAME(api)' '"/*(DEBLOBBED)*/"' \
+ 'removed non-Free firmware name' drivers/misc/iwmc3200top/iwmc3200top.h
+clean_blob drivers/misc/iwmc3200top/main.c
+clean_kconfig drivers/misc/iwmc3200top/Kconfig 'IWMC3200TOP'
+clean_mk CONFIG_IWMC3200TOP drivers/misc/iwmc3200top/Makefile
+
+announce LIBERTAS - "Marvell 8xxx Libertas WLAN driver support"
+reject_firmware drivers/net/wireless/libertas/main.c '
+/Try user-specified firmware first/{
+ :end1
+ /request_firmware(helper, user_helper/! {N; b end1;};
+ :end2
+ /request_firmware(helper, user_helper.*request_firmware(mainfw, user_mainfw/! {N; b end2;};
+ /request_firmware(helper, user_helper.*request_firmware(mainfw, user_mainfw/{
+ /request_firmware.*request_firmware.*request_firmware/!{p; d;};
+ }
+}
+'
+clean_kconfig drivers/net/wireless/Kconfig 'LIBERTAS'
+clean_mk CONFIG_LIBERTAS drivers/net/wireless/libertas/Makefile
+
+announce LIBERTAS_CS - "Marvell Libertas 8385 CompactFlash 802.11b/g cards"
+clean_blob drivers/net/wireless/libertas/if_cs.c
+clean_kconfig drivers/net/wireless/Kconfig 'LIBERTAS_CS'
+clean_mk CONFIG_LIBERTAS_CS drivers/net/wireless/libertas/Makefile
+
+announce LIBERTAS_SDIO - "Marvell Libertas 8385 and 8686 SDIO 802.11b/g cards"
+clean_blob drivers/net/wireless/libertas/if_sdio.c
+clean_kconfig drivers/net/wireless/Kconfig 'LIBERTAS_SDIO'
+clean_mk CONFIG_LIBERTAS_SDIO drivers/net/wireless/libertas/Makefile
+
+announce LIBERTAS_SPI - "Marvell Libertas 8686 SPI 802.11b/g cards"
+clean_blob drivers/net/wireless/libertas/if_spi.c
+clean_kconfig drivers/net/wireless/Kconfig 'LIBERTAS_SPI'
+clean_mk CONFIG_LIBERTAS_SPI drivers/net/wireless/libertas/Makefile
+
+announce LIBERTAS_USB - "Marvell Libertas 8388 USB 802.11b/g cards"
+reject_firmware drivers/net/wireless/libertas/if_usb.c '
+/Try user-specified firmware first/{
+ /request_firmware/!N;
+ /request_firmware/!N;
+ /request_firmware/{p; d;};
+}
+'
+clean_blob drivers/net/wireless/libertas/if_usb.c
+clean_blob drivers/net/wireless/libertas/README
+clean_kconfig drivers/net/wireless/Kconfig 'LIBERTAS_USB'
+clean_mk CONFIG_LIBERTAS_USB drivers/net/wireless/libertas/Makefile
+
+announce LIBERTAS_THINFIRM_USB - "Marvell Libertas 8388 USB 802.11b/g cards with thin firmware"
+reject_firmware drivers/net/wireless/libertas_tf/if_usb.c
+clean_blob drivers/net/wireless/libertas_tf/if_usb.c
+clean_kconfig drivers/net/wireless/Kconfig 'LIBERTAS_THINFIRM_USB'
+clean_mk CONFIG_LIBERTAS_THINFIRM_USB drivers/net/wireless/libertas_tf/Makefile
+
+announce MWL8K - 'Marvell 88W8xxx PCI/PCIe Wireless support'
+reject_firmware drivers/net/wireless/mwl8k.c
+clean_blob drivers/net/wireless/mwl8k.c
+clean_kconfig drivers/net/wireless/Kconfig 'MWL8K'
+clean_mk CONFIG_MWL8K drivers/net/wireless/Makefile
+
+announce ATH6K_LEGACY - "Atheros AR6003 support (non mac80211)"
+reject_firmware drivers/staging/ath6kl/os/linux/ar6000_android.c
+reject_firmware drivers/staging/ath6kl/os/linux/include/osapi_linux.h
+clean_sed '
+/\*firmware_p = firmware = kzalloc/ i\
+ return -1;
+' drivers/staging/ath6kl/os/linux/ar6000_android.c \
+ 'disabled non-Free firmware loading machinery'
+clean_blob drivers/staging/ath6kl/os/linux/include/ar6000_drv.h
+clean_kconfig drivers/staging/ath6kl/Kconfig 'ATH6K_LEGACY'
+clean_mk CONFIG_ATH6K_LEGACY drivers/staging/ath6kl/Makefile
+
+announce ATH9K_HTC - "Atheros HTC based wireless cards support"
+reject_firmware drivers/net/wireless/ath/ath9k/hif_usb.c
+clean_blob drivers/net/wireless/ath/ath9k/hif_usb.c
+clean_kconfig drivers/net/wireless/ath/ath9k/Kconfig 'ATH9K_HTC'
+clean_mk CONFIG_ATH9K_HTC drivers/net/wireless/ath/ath9k/Makefile
+
+announce PRISM2_USB - "Prism2.5/3 USB driver"
+reject_firmware drivers/staging/wlan-ng/prism2fw.c
+clean_blob drivers/staging/wlan-ng/prism2fw.c
+clean_kconfig drivers/staging/wlan-ng/Kconfig PRISM2_USB
+clean_mk CONFIG_PRISM2_USB drivers/staging/wlan-ng/Makefile
+
+announce P54_PCI - "Prism54 PCI support"
+reject_firmware drivers/net/wireless/p54/p54pci.c
+clean_blob drivers/net/wireless/p54/p54pci.c
+clean_kconfig drivers/net/wireless/p54/Kconfig 'P54_PCI'
+clean_mk CONFIG_P54_PCI drivers/net/wireless/p54/Makefile
+
+announce P54_SPI - "Prism54 SPI (stlc45xx) support"
+# There's support for loading custom 3826.eeprom here, with a default
+# eeprom that is clearly pure data. Without Free 3826.arm, there's
+# little point in trying to retain the ability to load 3826.eeprom, so
+# we drop it altogether.
+reject_firmware drivers/net/wireless/p54/p54spi.c
+clean_blob drivers/net/wireless/p54/p54spi.c
+clean_kconfig drivers/net/wireless/p54/Kconfig 'P54_SPI'
+clean_mk CONFIG_P54_SPI drivers/net/wireless/p54/Makefile
+
+announce P54_USB - "Prism54 USB support"
+reject_firmware drivers/net/wireless/p54/p54usb.c
+clean_blob drivers/net/wireless/p54/p54usb.c
+clean_blob drivers/net/wireless/p54/p54usb.h
+clean_kconfig drivers/net/wireless/p54/Kconfig 'P54_USB'
+clean_mk CONFIG_P54_USB drivers/net/wireless/p54/Makefile
+
+announce PRISM54 - 'Intersil Prism GT/Duette/Indigo PCI/Cardbus'
+reject_firmware drivers/net/wireless/prism54/islpci_dev.c
+clean_blob drivers/net/wireless/prism54/islpci_dev.c
+clean_kconfig drivers/net/wireless/Kconfig 'PRISM54'
+clean_mk CONFIG_PRISM54 drivers/net/wireless/prism54/Makefile
+
+announce RT2X00_LIB_FIRMWARE - "Ralink driver firmware support"
+reject_firmware drivers/net/wireless/rt2x00/rt2x00firmware.c
+clean_kconfig drivers/net/wireless/rt2x00/Kconfig 'RT2X00_LIB_FIRMWARE'
+clean_mk CONFIG_RT2X00_LIB_FIRMWARE drivers/net/wireless/rt2x00/Makefile
+
+announce RT61PCI - "Ralink rt2501/rt61 (PCI/PCMCIA) support"
+clean_blob drivers/net/wireless/rt2x00/rt61pci.h
+clean_blob drivers/net/wireless/rt2x00/rt61pci.c
+clean_kconfig drivers/net/wireless/rt2x00/Kconfig 'RT61PCI'
+clean_mk CONFIG_RT61PCI drivers/net/wireless/rt2x00/Makefile
+
+announce RT73USB - "Ralink rt2501/rt73 (USB) support"
+clean_blob drivers/net/wireless/rt2x00/rt73usb.h
+clean_blob drivers/net/wireless/rt2x00/rt73usb.c
+clean_kconfig drivers/net/wireless/rt2x00/Kconfig 'RT73USB'
+clean_mk CONFIG_RT73USB drivers/net/wireless/rt2x00/Makefile
+
+announce RT2800PCI - "Ralink rt2800 (PCI/PCMCIA) support"
+clean_blob drivers/net/wireless/rt2x00/rt2800pci.h
+clean_blob drivers/net/wireless/rt2x00/rt2800pci.c
+clean_kconfig drivers/net/wireless/rt2x00/Kconfig RT2800PCI
+clean_mk CONFIG_RT2800PCI drivers/net/wireless/rt2x00/Makefile
+
+announce RT2800USB - "Ralink rt2800 (USB) support"
+clean_blob drivers/net/wireless/rt2x00/rt2800usb.h
+clean_blob drivers/net/wireless/rt2x00/rt2800usb.c
+clean_kconfig drivers/net/wireless/rt2x00/Kconfig RT2800USB
+clean_mk CONFIG_RT2800USB drivers/net/wireless/rt2x00/Makefile
+
+announce RT2860 - "Ralink 2860/3090 wireless support"
+reject_firmware drivers/staging/rt2860/common/rtmp_mcu.c
+clean_blob drivers/staging/rt2860/common/rtmp_mcu.c
+clean_blob drivers/staging/rt2860/rtmp_def.h
+clean_blob drivers/staging/rt2860/common/ee_efuse.c
+clean_kconfig drivers/staging/rt2860/Kconfig RT2860
+clean_mk CONFIG_RT2860 drivers/staging/rt2860/Makefile
+
+announce RT2870 - "Ralink 2870/3070 wireless support"
+clean_kconfig drivers/staging/rt2870/Kconfig RT2870
+clean_mk CONFIG_RT2870 drivers/staging/rt2870/Makefile
+
+announce RTL8192CE - "Realtek RTL8192CE/RTL8188SE Wireless Network Adapter"
+reject_firmware drivers/net/wireless/rtlwifi/rtl8192ce/fw.c
+clean_blob drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
+clean_kconfig drivers/net/wireless/rtlwifi RTL8192CE
+clean_mk CONFIG_RTL8192CE drivers/net/wireless/rtlwifi/rtl8192ce/Makefile
+
+announce RTL8192E - "RealTek RTL8192E Wireless LAN NIC driver"
+reject_firmware drivers/staging/rtl8192e/r819xE_firmware.c
+clean_blob drivers/staging/rtl8192e/r819xE_firmware.c
+clean_kconfig drivers/staging/rtl8192e/Kconfig RTL8192E
+clean_mk CONFIG_RTL8192E drivers/staging/rtl8192e/Makefile
+
+announce RTL8192U - "RealTek RTL8192U Wireless LAN NIC driver"
+reject_firmware drivers/staging/rtl8192u/r819xU_firmware.c
+clean_blob drivers/staging/rtl8192u/r819xU_firmware.c
+clean_blob drivers/staging/rtl8192u/r819xU_firmware_img.c
+clean_kconfig drivers/staging/rtl8192u/Kconfig 'RTL8192U'
+clean_mk CONFIG_RTL8192U drivers/staging/rtl8192u/Makefile
+
+announce R8712U - "RealTek RTL8712U (RTL8192SU) Wireless LAN NIC driver"
+clean_blob drivers/staging/rtl8712/farray.h
+clean_sed '
+/^static u32 rtl871x_open_fw(/i\
+#define rtl871x_open_fw(a,b,c) 0
+' drivers/staging/rtl8712/hal_init.c \
+ 'disabling non-Free firmware loading machinery'
+clean_blob drivers/staging/rtl8712/hal_init.c
+clean_kconfig drivers/staging/rtl8712/Kconfig 'R8712U'
+clean_mk CONFIG_R8712U drivers/staging/rtl8712/Makefile
+
+announce VT6656 - "VIA Technologies VT6656 support"
+clean_sed '
+/^FIRMWAREbDownload($/,/^}$/ {
+ /PBYTE.*pBuffer/ i\
+ PBYTE abyFirmware[1] = { 0 };
+ /-->Download firmware/ i\
+ printk("vt6656: missing Free firmware\\n");\
+ return (FALSE);
+}' drivers/staging/vt6656/firmware.c 'report missing Free firmware'
+clean_blob drivers/staging/vt6656/firmware.c
+clean_kconfig drivers/staging/vt6656/Kconfig 'VT6656'
+clean_mk CONFIG_VT6656 drivers/staging/vt6656/Makefile
+
+announce WL1251 - "TI wl1251 support"
+reject_firmware drivers/net/wireless/wl1251/main.c
+clean_blob drivers/net/wireless/wl1251/main.c
+clean_blob drivers/net/wireless/wl1251/wl1251.h
+clean_kconfig drivers/net/wireless/wl1251/Kconfig 'WL1251'
+clean_mk CONFIG_WL1251 drivers/net/wireless/wl1251/Makefile
+
+announce WL12XX - "TI wl12xx support"
+reject_firmware drivers/net/wireless/wl12xx/main.c
+clean_blob drivers/net/wireless/wl12xx/wl12xx.h
+clean_kconfig drivers/net/wireless/wl12xx/Kconfig 'WL12XX'
+clean_mk CONFIG_WL12XX drivers/net/wireless/wl12xx/Makefile
+
+announce WL12XX_SDIO - "TI wl12xx SDIO support"
+clean_blob drivers/net/wireless/wl12xx/sdio.c
+clean_kconfig drivers/net/wireless/wl12xx/Kconfig 'WL12XX_SDIO'
+clean_mk CONFIG_WL12XX_SDIO drivers/net/wireless/wl12xx/Makefile
+
+announce WL12XX_SDIO_TEST - "TI wl12xx SDIO testing support"
+reject_firmware drivers/net/wireless/wl12xx/sdio_test.c
+clean_kconfig drivers/net/wireless/wl12xx/Kconfig 'WL12XX_SDIO_TEST'
+clean_mk CONFIG_WL12XX_SDIO_TEST drivers/net/wireless/wl12xx/Makefile
+
+announce WL12XX_SPI - "TI wl12xx SPI support"
+clean_blob drivers/net/wireless/wl12xx/spi.c
+clean_kconfig drivers/net/wireless/wl12xx/Kconfig 'WL12XX_SPI'
+clean_mk CONFIG_WL12XX_SPI drivers/net/wireless/wl12xx/Makefile
+
+announce USB_ZD1201 - "USB ZD1201 based Wireless device support"
+reject_firmware drivers/net/wireless/zd1201.c
+clean_blob drivers/net/wireless/zd1201.c
+clean_kconfig drivers/net/wireless/Kconfig 'USB_ZD1201'
+clean_mk CONFIG_USB_ZD1201 drivers/net/wireless/Makefile
+
+announce ZD1211RW - "ZyDAS ZD1211/ZD1211B USB-wireless support"
+reject_firmware drivers/net/wireless/zd1211rw/zd_usb.c
+clean_blob drivers/net/wireless/zd1211rw/zd_usb.c
+clean_kconfig drivers/net/wireless/zd1211rw/Kconfig 'ZD1211RW'
+clean_mk CONFIG_ZD1211RW drivers/net/wireless/zd1211rw/Makefile
+
+# bluetooth
+
+announce BT_ATH3K - "Atheros firmware download driver"
+reject_firmware drivers/bluetooth/ath3k.c
+clean_blob drivers/bluetooth/ath3k.c
+clean_kconfig drivers/bluetooth/Kconfig 'BT_ATH3K'
+clean_mk CONFIG_BT_ATH3K drivers/bluetooth/Makefile
+
+announce BT_HCIBCM203X - "HCI BCM203x USB driver"
+reject_firmware drivers/bluetooth/bcm203x.c
+clean_blob drivers/bluetooth/bcm203x.c
+clean_kconfig drivers/bluetooth/Kconfig 'BT_HCIBCM203X'
+clean_mk CONFIG_BT_HCIBCM203X drivers/bluetooth/Makefile
+
+announce BT_HCIBFUSB - "HCI BlueFRITZ! USB driver"
+reject_firmware drivers/bluetooth/bfusb.c
+clean_blob drivers/bluetooth/bfusb.c
+clean_kconfig drivers/bluetooth/Kconfig 'BT_HCIBFUSB'
+clean_mk CONFIG_BT_HCIBFUSB drivers/bluetooth/Makefile
+
+announce BT_HCIBT3C - "HCI BT3C (PC Card) driver"
+reject_firmware drivers/bluetooth/bt3c_cs.c
+clean_blob drivers/bluetooth/bt3c_cs.c
+clean_kconfig drivers/bluetooth/Kconfig 'BT_HCIBT3C'
+clean_mk CONFIG_BT_HCIBT3C drivers/bluetooth/Makefile
+
+announce BT_MRVL_SDIO - "Marvell BT-over-SDIO driver"
+reject_firmware drivers/bluetooth/btmrvl_sdio.c
+clean_blob drivers/bluetooth/btmrvl_sdio.c
+clean_blob Documentation/btmrvl.txt
+clean_kconfig drivers/bluetooth/Kconfig 'BT_MRVL_SDIO'
+clean_mk CONFIG_BT_MRVL_SDIO drivers/bluetooth/Makefile
+
+announce TI_ST - "Texas Instruments shared transport line discipline"
+reject_firmware drivers/misc/ti-st/st_kim.c
+clean_blob drivers/misc/ti-st/st_kim.c
+clean_kconfig drivers/misc/ti-st/Kconfig 'TI_ST'
+clean_mk CONFIG_TI_ST drivers/misc/ti-st/Makefile
+
+# wimax
+
+announce WIMAX_I2400M - "Intel Wireless WiMAX Connection 2400"
+reject_firmware drivers/net/wimax/i2400m/fw.c
+clean_blob drivers/net/wimax/i2400m/sdio.c
+clean_blob drivers/net/wimax/i2400m/usb.c
+clean_blob Documentation/wimax/README.i2400m
+clean_kconfig drivers/net/wimax/i2400m/Kconfig 'WIMAX_I2400M'
+clean_mk CONFIG_WIMAX_I2400M drivers/net/wimax/i2400m/Makefile
+
+announce BCM_WIMAX - "Beceem BCS200/BCS220-3 and BCSM250 wimax support"
+clean_blob drivers/staging/bcm/Macros.h
+# This disables loading of the .cfg file as well, but it's useless without
+# the firmware proper.
+clean_sed '
+/^static \(inline \)\?struct file \*open_firmware_file/,/^}$/ {
+ /oldfs=get_fs();/i\
+ return /*(DEBLOBBED)*/ NULL;
+}' drivers/staging/bcm/Misc.c 'disabled non-Free firmware loading machinery'
+clean_kconfig drivers/staging/bcm/Kconfig 'BCM_WIMAX'
+clean_mk CONFIG_BCM_WIMAX drivers/staging/bcm/Makefile
+
+# infiniband
+
+announce INFINIBAND_QIB - "QLogic PCIe HCA support"
+drop_fw_file firmware/qlogic/sd7220.fw.ihex firmware/qlogic/sd7220.fw
+reject_firmware drivers/infiniband/hw/qib/qib_sd7220.c
+clean_blob drivers/infiniband/hw/qib/qib_sd7220.c
+clean_kconfig drivers/infiniband/hw/qib/Kconfig 'INFINIBAND_QIB'
+clean_mk CONFIG_INFINIBAND_QIB drivers/infiniband/hw/qib/Makefile
+
+# CAN
+
+announce CAN_SOFTING - "Softing Gmbh CAN generic support"
+reject_firmware drivers/net/can/softing/softing_fw.c
+clean_kconfig drivers/net/can/softing/Kconfig 'CAN_SOFTING'
+clean_mk CONFIG_CAN_SOFTING drivers/net/can/softing/Makefile
+
+announce CAN_SOFTING_CS - "Softing Gmbh CAN pcmcia cards"
+clean_blob drivers/net/can/softing/softing_cs.c
+clean_blob drivers/net/can/softing/softing_platform.h
+clean_sed '
+/^config CAN_SOFTING_CS$/,${
+ /You need firmware/i\
+ /*(DEBLOBBED)*/
+ /You need firmware/,/softing-fw.*tar\.gz/d
+}' drivers/net/can/softing/Kconfig 'removed firmware notes'
+clean_kconfig drivers/net/can/softing/Kconfig 'CAN_SOFTING_CS'
+clean_mk CONFIG_CAN_SOFTING_CS drivers/net/can/softing/Makefile
+
+########
+# ISDN #
+########
+
+announce ISDN_DIVAS - "Support Eicon DIVA Server cards"
+clean_blob drivers/isdn/hardware/eicon/cardtype.h
+clean_blob drivers/isdn/hardware/eicon/dsp_defs.h
+clean_kconfig drivers/isdn/hardware/eicon/Kconfig 'ISDN_DIVAS'
+clean_mk CONFIG_ISDN_DIVAS drivers/isdn/hardware/eicon/Makefile
+
+announce MISDN_SPEEDFAX - "Support for Sedlbauer Speedfax+"
+reject_firmware drivers/isdn/hardware/mISDN/speedfax.c
+clean_blob drivers/isdn/hardware/mISDN/speedfax.c
+clean_kconfig drivers/isdn/hardware/mISDN/Kconfig 'MISDN_SPEEDFAX'
+clean_mk CONFIG_MISDN_SPEEDFAX drivers/isdn/hardware/mISDN/Makefile
+
+##########
+# Serial #
+##########
+
+announce SERIAL_8250_CS - "8250/16550 PCMCIA device support"
+# These are not software; they're Free, but GPLed without in-tree sources.
+drop_fw_file firmware/cis/MT5634ZLX.cis.ihex firmware/cis/MT5634ZLX.cis
+drop_fw_file firmware/cis/RS-COM-2P.cis.ihex firmware/cis/RS-COM-2P.cis
+drop_fw_file firmware/cis/COMpad2.cis.ihex firmware/cis/COMpad2.cis
+drop_fw_file firmware/cis/COMpad4.cis.ihex firmware/cis/COMpad4.cis
+# These are not software; they're Free, but GPLed without textual sources.
+# It could be assumed that these binaries *are* sources, since they
+# can be trivially converted back to a textual form, without loss,
+# but we're better off safe than sorry, so remove them from our tree.
+drop_fw_file firmware/cis/SW_555_SER.cis.ihex firmware/cis/SW_555_SER.cis
+drop_fw_file firmware/cis/SW_7xx_SER.cis.ihex firmware/cis/SW_7xx_SER.cis
+drop_fw_file firmware/cis/SW_8xx_SER.cis.ihex firmware/cis/SW_8xx_SER.cis
+# clean_blob drivers/tty/serial/serial_cs.c
+# clean_kconfig drivers/tty/serial/Kconfig 'SERIAL_8250_CS'
+# clean_mk CONFIG_SERIAL_8250_CS drivers/tty/serial/Makefile
+
+announce SERIAL_ICOM - "IBM Multiport Serial Adapter"
+reject_firmware drivers/tty/serial/icom.c
+clean_blob drivers/tty/serial/icom.c
+clean_kconfig drivers/tty/serial/Kconfig 'SERIAL_ICOM'
+clean_mk CONFIG_SERIAL_ICOM drivers/tty/serial/Makefile
+
+announce SERIAL_QE - "Freescale QUICC Engine serial port support"
+reject_firmware drivers/tty/serial/ucc_uart.c
+clean_blob drivers/tty/serial/ucc_uart.c
+clean_kconfig drivers/tty/serial/Kconfig 'SERIAL_QE'
+clean_mk CONFIG_SERIAL_QE drivers/tty/serial/Makefile
+
+#########
+# input #
+#########
+
+announce TOUCHSCREEN_QT602240 - "QT602240 I2C Touchscreen"
+reject_firmware drivers/input/touchscreen/qt602240_ts.c
+clean_blob drivers/input/touchscreen/qt602240_ts.c
+clean_kconfig drivers/net/Kconfig 'TOUCHSCREEN_QT602240'
+clean_mk CONFIG_TOUCHSCREEN_QT602240 drivers/input/touchscreen/Makefile
+
+announce LIRC_ZILOG - "Zilog/Hauppauge IR Transmitter"
+reject_firmware drivers/staging/lirc/lirc_zilog.c
+clean_blob drivers/staging/lirc/lirc_zilog.c
+clean_kconfig drivers/staging/lirc/Kconfig 'LIRC_ZILOG'
+clean_mk CONFIG_LIRC_ZILOG drivers/staging/lirc/Makefile
+
+####################
+# Data acquisition #
+####################
+
+announce COMEDI_PCI_DRIVERS - "Data acquisition support Comedi PCI drivers"
+reject_firmware drivers/staging/comedi/drivers/jr3_pci.c
+clean_blob drivers/staging/comedi/drivers/jr3_pci.c
+clean_kconfig drivers/staging/comedi/Kconfig 'COMEDI_PCI_DRIVERS'
+clean_mk CONFIG_COMEDI_PCI_DRIVERS drivers/staging/comedi/drivers/Makefile
+
+announce COMEDI_USBDUX - "ITL USBDUX support"
+reject_firmware drivers/staging/comedi/drivers/usbdux.c
+clean_blob drivers/staging/comedi/drivers/usbdux.c
+clean_kconfig drivers/staging/comedi/Kconfig 'COMEDI_USBDUX'
+clean_mk CONFIG_COMEDI_USBDUX drivers/staging/comedi/drivers/Makefile
+
+announce COMEDI_USBDUXFAST - "ITL USB-DUXfast support"
+reject_firmware drivers/staging/comedi/drivers/usbduxfast.c
+clean_blob drivers/staging/comedi/drivers/usbduxfast.c
+clean_kconfig drivers/staging/comedi/Kconfig 'COMEDI_USBDUXFAST'
+clean_mk CONFIG_COMEDI_USBDUXFAST drivers/staging/comedi/drivers/Makefile
+
+
+########
+# SCSI #
+########
+
+announce SCSI_QLOGICPTI - "PTI Qlogic, ISP Driver"
+drop_fw_file firmware/qlogic/isp1000.bin.ihex firmware/qlogic/isp1000.bin
+reject_firmware drivers/scsi/qlogicpti.c
+clean_blob drivers/scsi/qlogicpti.c
+clean_kconfig drivers/scsi/Kconfig 'SCSI_QLOGICPTI'
+clean_mk CONFIG_SCSI_QLOGICPTI drivers/scsi/Makefile
+
+announce SCSI_ADVANSYS - "AdvanSys SCSI"
+drop_fw_file firmware/advansys/mcode.bin.ihex firmware/advansys/mcode.bin
+drop_fw_file firmware/advansys/3550.bin.ihex firmware/advansys/3550.bin
+drop_fw_file firmware/advansys/38C0800.bin.ihex firmware/advansys/38C0800.bin
+drop_fw_file firmware/advansys/38C1600.bin.ihex firmware/advansys/38C1600.bin
+reject_firmware drivers/scsi/advansys.c
+clean_blob drivers/scsi/advansys.c
+clean_kconfig drivers/scsi/Kconfig 'SCSI_ADVANSYS'
+clean_mk CONFIG_SCSI_ADVANSYS drivers/scsi/Makefile
+
+announce SCSI_QLOGIC_1280 - "Qlogic QLA 1240/1x80/1x160 SCSI"
+drop_fw_file firmware/qlogic/1040.bin.ihex firmware/qlogic/1040.bin
+drop_fw_file firmware/qlogic/1280.bin.ihex firmware/qlogic/1280.bin
+drop_fw_file firmware/qlogic/12160.bin.ihex firmware/qlogic/12160.bin
+reject_firmware drivers/scsi/qla1280.c
+clean_blob drivers/scsi/qla1280.c
+clean_kconfig drivers/scsi/Kconfig 'SCSI_QLOGIC_1280'
+clean_mk CONFIG_SCSI_QLOGIC_1280 drivers/scsi/Makefile
+
+announce SCSI_AIC94XX - "Adaptec AIC94xx SAS/SATA support"
+reject_firmware drivers/scsi/aic94xx/aic94xx_seq.c
+clean_blob drivers/scsi/aic94xx/aic94xx_seq.c
+clean_blob drivers/scsi/aic94xx/aic94xx_seq.h
+clean_kconfig drivers/scsi/aic94xx/Kconfig 'SCSI_AIC94XX'
+clean_mk CONFIG_SCSI_AIC94XX drivers/scsi/aic94xx/Makefile
+
+announce SCSI_BFA_FC - "Brocade BFA Fibre Channel Support"
+clean_blob drivers/scsi/bfa/bfad_im.h
+reject_firmware drivers/scsi/bfa/bfad.c
+clean_blob drivers/scsi/bfa/bfad.c
+clean_kconfig drivers/scsi/Kconfig 'SCSI_BFA_FC'
+clean_mk CONFIG_SCSI_BFA_FC drivers/scsi/bfa/Makefile
+
+announce SCSI_QLA_FC - "QLogic QLA2XXX Fibre Channel Support"
+reject_firmware drivers/scsi/qla2xxx/qla_gbl.h
+reject_firmware drivers/scsi/qla2xxx/qla_init.c
+reject_firmware drivers/scsi/qla2xxx/qla_os.c
+reject_firmware drivers/scsi/qla2xxx/qla_nx.c
+clean_sed '
+/^config SCSI_QLA_FC$/,/^config /{
+ /^ By default, firmware/i\
+ /*(DEBLOBBED)*/
+ /^ By default, firmware/,/ftp:[/][/].*firmware[/]/d
+}' drivers/scsi/qla2xxx/Kconfig 'removed firmware notes'
+clean_blob drivers/scsi/qla2xxx/qla_os.c
+clean_kconfig drivers/scsi/qla2xxx/Kconfig 'SCSI_QLA_FC'
+clean_mk CONFIG_SCSI_QLA_FC drivers/scsi/qla2xxx/Makefile
+
+
+#######
+# USB #
+#######
+
+# atm
+
+announce USB_CXACRU - "Conexant AccessRunner USB support"
+reject_firmware drivers/usb/atm/cxacru.c
+clean_blob drivers/usb/atm/cxacru.c
+clean_kconfig drivers/usb/atm/Kconfig 'USB_CXACRU'
+clean_mk CONFIG_USB_CXACRU drivers/usb/atm/Makefile
+
+announce USB_SPEEDTOUCH - "Speedtouch USB support"
+reject_firmware drivers/usb/atm/speedtch.c
+clean_blob drivers/usb/atm/speedtch.c
+clean_kconfig drivers/usb/atm/Kconfig 'USB_SPEEDTOUCH'
+clean_mk CONFIG_USB_SPEEDTOUCH drivers/usb/atm/Makefile
+
+announce USB_UEAGLEATM - "ADI 930 and eagle USB DSL modem"
+reject_firmware drivers/usb/atm/ueagle-atm.c
+clean_blob drivers/usb/atm/ueagle-atm.c
+clean_kconfig drivers/usb/atm/Kconfig 'USB_UEAGLEATM'
+clean_mk CONFIG_USB_UEAGLEATM drivers/usb/atm/Makefile
+
+# misc
+
+announce USB_EMI26 - "EMI 2|6 USB Audio interface"
+# These files are not under the GPL, better remove them all.
+drop_fw_file firmware/emi26/bitstream.HEX firmware/emi26/bitstream.fw
+drop_fw_file firmware/emi26/firmware.HEX firmware/emi26/firmware.fw
+drop_fw_file firmware/emi26/loader.HEX firmware/emi26/loader.fw
+reject_firmware drivers/usb/misc/emi26.c
+clean_blob drivers/usb/misc/emi26.c
+clean_kconfig drivers/usb/misc/Kconfig 'USB_EMI26'
+clean_mk CONFIG_USB_EMI26 drivers/usb/misc/Makefile
+
+announce USB_EMI62 - "EMI 6|2m USB Audio interface"
+# These files are probably not under the GPL, better remove them all.
+drop_fw_file firmware/emi62/bitstream.HEX firmware/emi62/bitstream.fw
+drop_fw_file firmware/emi62/loader.HEX firmware/emi62/loader.fw
+drop_fw_file firmware/emi62/midi.HEX firmware/emi62/midi.fw
+drop_fw_file firmware/emi62/spdif.HEX firmware/emi62/spdif.fw
+reject_firmware drivers/usb/misc/emi62.c
+clean_blob drivers/usb/misc/emi62.c
+clean_kconfig drivers/usb/misc/Kconfig 'USB_EMI62'
+clean_mk CONFIG_USB_EMI62 drivers/usb/misc/Makefile
+
+announce USB_ISIGHTFW - "iSight firmware loading support"
+reject_firmware drivers/usb/misc/isight_firmware.c
+clean_blob drivers/usb/misc/isight_firmware.c
+clean_kconfig drivers/usb/misc/Kconfig 'USB_ISIGHTFW'
+clean_mk CONFIG_USB_ISIGHTFW drivers/usb/misc/Makefile
+
+# storage
+
+announce USB_ENESTORAGE - "USB ENE card reader support"
+clean_blob drivers/staging/keucr/init.h
+clean_sed '
+/^int ENE_LoadBinCode(/,/^}$/ {
+ /kmalloc/i\
+ return /*(DEBLOBBED)*/ USB_STOR_TRANSPORT_ERROR;
+}
+' drivers/staging/keucr/init.c 'disable non-Free firmware loading machinery'
+clean_kconfig drivers/staging/keucr/Kconfig 'USB_ENESTORAGE'
+clean_mk 'CONFIG_USB_ENESTORAGE' drivers/staging/keucr/Makefile
+
+# serial
+
+announce USB_SERIAL_KEYSPAN - "USB Keyspan USA-xxx Serial Driver"
+drop_fw_file firmware/keyspan/mpr.HEX firmware/keyspan/mpr.fw
+clean_kconfig drivers/usb/serial/Kconfig 'USB_SERIAL_KEYSPAN_MPR'
+drop_fw_file firmware/keyspan/usa18x.HEX firmware/keyspan/usa18x.fw
+clean_kconfig drivers/usb/serial/Kconfig 'USB_SERIAL_KEYSPAN_USA18X'
+drop_fw_file firmware/keyspan/usa19.HEX firmware/keyspan/usa19.fw
+clean_kconfig drivers/usb/serial/Kconfig 'USB_SERIAL_KEYSPAN_USA19'
+drop_fw_file firmware/keyspan/usa19qi.HEX firmware/keyspan/usa19qi.fw
+clean_kconfig drivers/usb/serial/Kconfig 'USB_SERIAL_KEYSPAN_USA19QI'
+drop_fw_file firmware/keyspan/usa19qw.HEX firmware/keyspan/usa19qw.fw
+clean_kconfig drivers/usb/serial/Kconfig 'USB_SERIAL_KEYSPAN_USA19QW'
+drop_fw_file firmware/keyspan/usa19w.HEX firmware/keyspan/usa19w.fw
+clean_kconfig drivers/usb/serial/Kconfig 'USB_SERIAL_KEYSPAN_USA19W'
+drop_fw_file firmware/keyspan/usa28.HEX firmware/keyspan/usa28.fw
+clean_kconfig drivers/usb/serial/Kconfig 'USB_SERIAL_KEYSPAN_USA28'
+drop_fw_file firmware/keyspan/usa28xa.HEX firmware/keyspan/usa28xa.fw
+clean_kconfig drivers/usb/serial/Kconfig 'USB_SERIAL_KEYSPAN_USA28XA'
+drop_fw_file firmware/keyspan/usa28xb.HEX firmware/keyspan/usa28xb.fw
+clean_kconfig drivers/usb/serial/Kconfig 'USB_SERIAL_KEYSPAN_USA28XB'
+drop_fw_file firmware/keyspan/usa28x.HEX firmware/keyspan/usa28x.fw
+clean_kconfig drivers/usb/serial/Kconfig 'USB_SERIAL_KEYSPAN_USA28X'
+drop_fw_file firmware/keyspan/usa49w.HEX firmware/keyspan/usa49w.fw
+clean_kconfig drivers/usb/serial/Kconfig 'USB_SERIAL_KEYSPAN_USA49W'
+drop_fw_file firmware/keyspan/usa49wlc.HEX firmware/keyspan/usa49wlc.fw
+clean_kconfig drivers/usb/serial/Kconfig 'USB_SERIAL_KEYSPAN_USA49WLC'
+reject_firmware drivers/usb/serial/keyspan.c
+clean_blob drivers/usb/serial/keyspan.c
+clean_kconfig drivers/usb/serial/Kconfig 'USB_SERIAL_KEYSPAN'
+clean_mk CONFIG_USB_SERIAL_KEYSPAN drivers/usb/serial/Makefile
+
+announce USB_SERIAL_KEYSPAN_PDA - "USB Keyspan PDA Single Port Serial Driver"
+clean_sed '
+s,request_ihex_firmware,/*KEYSPAN_PDA*/&,
+' drivers/usb/serial/keyspan_pda.c 'accept Free firmware'
+
+announce USB_SERIAL_EDGEPORT - "USB Inside Out Edgeport Serial Driver"
+clean_fw firmware/edgeport/boot.H16 firmware/edgeport/boot.fw
+clean_fw firmware/edgeport/boot2.H16 firmware/edgeport/boot2.fw
+clean_fw firmware/edgeport/down.H16 firmware/edgeport/down.fw
+clean_fw firmware/edgeport/down2.H16 firmware/edgeport/down2.fw
+reject_firmware drivers/usb/serial/io_edgeport.c
+clean_blob drivers/usb/serial/io_edgeport.c
+clean_kconfig drivers/usb/serial/Kconfig 'USB_SERIAL_EDGEPORT'
+clean_mk CONFIG_USB_SERIAL_EDGEPORT drivers/usb/serial/Makefile
+
+announce USB_SERIAL_EDGEPORT_TI - "USB Inside Out Edgeport Serial Driver (TI devices)"
+clean_fw firmware/edgeport/down3.bin.ihex firmware/edgeport/down3.bin
+reject_firmware drivers/usb/serial/io_ti.c
+clean_blob drivers/usb/serial/io_ti.c
+clean_kconfig drivers/usb/serial/Kconfig 'USB_SERIAL_EDGEPORT_TI'
+clean_mk CONFIG_USB_SERIAL_EDGEPORT_TI drivers/usb/serial/Makefile
+
+announce USB_SERIAL_TI - "USB TI 3410/5052 Serial Driver"
+drop_fw_file firmware/ti_3410.fw.ihex firmware/ti_3410.fw
+drop_fw_file firmware/ti_5052.fw.ihex firmware/ti_5052.fw
+drop_fw_file firmware/mts_cdma.fw.ihex firmware/mts_cdma.fw
+drop_fw_file firmware/mts_gsm.fw.ihex firmware/mts_gsm.fw
+drop_fw_file firmware/mts_edge.fw.ihex firmware/mts_edge.fw
+reject_firmware drivers/usb/serial/ti_usb_3410_5052.c
+clean_blob drivers/usb/serial/ti_usb_3410_5052.c
+clean_kconfig drivers/usb/serial/Kconfig 'USB_SERIAL_TI'
+clean_mk CONFIG_USB_SERIAL_TI drivers/usb/serial/Makefile
+
+announce USB_SERIAL_WHITEHEAT - "USB ConnectTech WhiteHEAT Serial Driver"
+clean_fw firmware/whiteheat.HEX firmware/whiteheat.fw
+clean_fw firmware/whiteheat_loader.HEX firmware/whiteheat_loader.fw
+clean_fw firmware/whiteheat_loader_debug.HEX firmware/whiteheat_loader_debug.fw
+reject_firmware drivers/usb/serial/whiteheat.c
+clean_blob drivers/usb/serial/whiteheat.c
+clean_kconfig drivers/usb/serial/Kconfig 'USB_SERIAL_WHITEHEAT'
+clean_mk CONFIG_USB_SERIAL_WHITEHEAT drivers/usb/serial/Makefile
+
+# uwb
+
+announce UWB_I1480U - Support for Intel Wireless UWB Link 1480 HWA
+reject_firmware drivers/uwb/i1480/dfu/i1480-dfu.h
+reject_firmware drivers/uwb/i1480/dfu/mac.c
+reject_firmware drivers/uwb/i1480/dfu/phy.c
+clean_blob drivers/uwb/i1480/dfu/usb.c
+clean_kconfig drivers/uwb/Kconfig 'UWB_I1480U'
+clean_mk CONFIG_UWB_I1480U drivers/uwb/i1480/dfu/Makefile
+
+
+
+#########
+# Sound #
+#########
+
+announce SND_ASIHPI - "AudioScience ASIxxxx"
+reject_firmware sound/pci/asihpi/hpidspcd.c
+clean_blob sound/pci/asihpi/hpidspcd.c
+clean_blob sound/pci/asihpi/hpioctl.c
+clean_kconfig sound/pci/Kconfig 'SND_ASIHPI'
+clean_mk CONFIG_SND_ASIHPI sound/pci/asihpi/Makefile
+
+announce SND_CS46XX - "Cirrus Logic (Sound Fusion) CS4280/CS461x/CS462x/CS463x"
+# This appears to have been extracted from some non-Free driver
+clean_file sound/pci/cs46xx/cs46xx_image.h
+# The following blobs are definitely extracted from non-Free drivers.
+clean_file sound/pci/cs46xx/imgs/cwc4630.h
+clean_file sound/pci/cs46xx/imgs/cwcasync.h
+clean_file sound/pci/cs46xx/imgs/cwcsnoop.h
+clean_sed '
+/^\(int \)\?snd_cs46xx_download_image([^;]*$/,/^}$/{
+ /for.*BA1_MEMORY_COUNT/i\
+#if 0
+ /^}$/{
+ i\
+#else\
+ snd_printk(KERN_ERR "cs46xx: Missing Free firmware\\n");\
+ return -EINVAL;\
+#endif
+ }
+}
+s/cs46xx_dsp_load_module(chip, [&]cwc\(4630\|async\|snoop\)_module)/(snd_printk(KERN_ERR "cs46xx: Missing Free firmware\\n"),-EINVAL)/
+' sound/pci/cs46xx/cs46xx_lib.c 'report missing Free firmware'
+clean_blob sound/pci/cs46xx/cs46xx_lib.c
+clean_kconfig sound/pci/Kconfig 'SND_CS46XX'
+clean_mk 'CONFIG_SND_CS46XX' sound/pci/cs46xx/Makefile
+
+announce SND_INTEL_SST - "Intel SST (LPE) Driver"
+reject_firmware drivers/staging/intel_sst/intel_sst_drv_interface.c
+clean_blob drivers/staging/intel_sst/intel_sst_drv_interface.c
+reject_firmware drivers/staging/intel_sst/intel_sst_dsp.c
+clean_kconfig drivers/staging/intel_sst/Kconfig 'SND_INTEL_SST'
+clean_mk 'CONFIG_SND_INTEL_SST' drivers/staging/intel_sst/Makefile
+
+announce SND_KORG1212 - "Korg 1212 IO"
+drop_fw_file firmware/korg/k1212.dsp.ihex firmware/korg/k1212.dsp
+reject_firmware sound/pci/korg1212/korg1212.c
+clean_blob sound/pci/korg1212/korg1212.c
+clean_kconfig sound/pci/Kconfig 'SND_KORG1212'
+clean_mk 'CONFIG_SND_KORG1212' sound/pci/korg1212/Makefile
+
+announce SND_MAESTRO3 - "ESS Allegro/Maestro3"
+drop_fw_file firmware/ess/maestro3_assp_kernel.fw.ihex firmware/ess/maestro3_assp_kernel.fw
+drop_fw_file firmware/ess/maestro3_assp_minisrc.fw.ihex firmware/ess/maestro3_assp_minisrc.fw
+reject_firmware sound/pci/maestro3.c
+clean_blob sound/pci/maestro3.c
+clean_kconfig sound/pci/Kconfig 'SND_MAESTRO3'
+clean_mk 'CONFIG_SND_MAESTRO3' sound/pci/Makefile
+
+announce SND_YMFPCI - "Yamaha YMF724/740/744/754"
+drop_fw_file firmware/yamaha/ds1_ctrl.fw.ihex firmware/yamaha/ds1_ctrl.fw
+drop_fw_file firmware/yamaha/ds1_dsp.fw.ihex firmware/yamaha/ds1_dsp.fw
+drop_fw_file firmware/yamaha/ds1e_ctrl.fw.ihex firmware/yamaha/ds1e_ctrl.fw
+reject_firmware sound/pci/ymfpci/ymfpci_main.c
+clean_blob sound/pci/ymfpci/ymfpci_main.c
+clean_kconfig sound/pci/Kconfig 'SND_YMFPCI'
+clean_mk 'CONFIG_SND_YMFPCI' sound/pci/ymfpci/Makefile
+
+announce SND_SB16_CSP - "SB16 Advanced Signal Processor"
+drop_fw_file firmware/sb16/alaw_main.csp.ihex firmware/sb16/alaw_main.csp
+drop_fw_file firmware/sb16/mulaw_main.csp.ihex firmware/sb16/mulaw_main.csp
+drop_fw_file firmware/sb16/ima_adpcm_init.csp.ihex firmware/sb16/ima_adpcm_init.csp
+drop_fw_file firmware/sb16/ima_adpcm_capture.csp.ihex firmware/sb16/ima_adpcm_capture.csp
+drop_fw_file firmware/sb16/ima_adpcm_playback.csp.ihex firmware/sb16/ima_adpcm_playback.csp
+reject_firmware sound/isa/sb/sb16_csp.c
+clean_blob sound/isa/sb/sb16_csp.c
+clean_kconfig sound/isa/Kconfig 'SND_SB16_CSP'
+clean_mk 'CONFIG_SND_SB16_CSP' sound/isa/sb/Makefile
+
+announce SND_WAVEFRONT - "Turtle Beach Maui,Tropez,Tropez+ (Wavefront)"
+drop_fw_file firmware/yamaha/yss225_registers.bin.ihex firmware/yamaha/yss225_registers.bin
+reject_firmware sound/isa/wavefront/wavefront_fx.c
+clean_blob sound/isa/wavefront/wavefront_fx.c
+reject_firmware sound/isa/wavefront/wavefront_synth.c
+clean_blob sound/isa/wavefront/wavefront_synth.c
+clean_kconfig sound/isa/Kconfig 'SND_WAVEFRONT'
+clean_mk 'CONFIG_SND_WAVEFRONT' sound/isa/wavefront/Makefile
+
+announce SND_VX_LIB - Digigram VX soundcards
+reject_firmware sound/drivers/vx/vx_hwdep.c
+clean_blob sound/drivers/vx/vx_hwdep.c
+clean_kconfig sound/drivers/Kconfig 'SND_VX_LIB'
+clean_mk CONFIG_SND_VX_LIB sound/drivers/vx/Makefile
+
+announce SND_DARLA20 - "(Echoaudio) Darla20"
+clean_blob sound/pci/echoaudio/darla20.c
+clean_kconfig sound/pci/Kconfig 'SND_DARLA20'
+clean_mk CONFIG_SND_DARLA20 sound/pci/echoaudio/Makefile
+
+announce SND_DARLA24 - "(Echoaudio) Darla24"
+clean_blob sound/pci/echoaudio/darla24.c
+clean_kconfig sound/pci/Kconfig 'SND_DARLA24'
+clean_mk CONFIG_SND_DARLA24 sound/pci/echoaudio/Makefile
+
+announce SND_ECHO3G - "(Echoaudio) 3G cards"
+clean_blob sound/pci/echoaudio/echo3g.c
+clean_kconfig sound/pci/Kconfig 'SND_ECHO3G'
+clean_mk CONFIG_SND_ECHO3G sound/pci/echoaudio/Makefile
+
+announce SND_GINA20 - "(Echoaudio) Gina20"
+clean_blob sound/pci/echoaudio/gina20.c
+clean_kconfig sound/pci/Kconfig 'SND_GINA20'
+clean_mk CONFIG_SND_GINA20 sound/pci/echoaudio/Makefile
+
+announce SND_GINA24 - "(Echoaudio) Gina24"
+clean_blob sound/pci/echoaudio/gina24.c
+clean_kconfig sound/pci/Kconfig 'SND_GINA24'
+clean_mk CONFIG_SND_GINA24 sound/pci/echoaudio/Makefile
+
+announce SND_INDIGO - "(Echoaudio) Indigo"
+clean_blob sound/pci/echoaudio/indigo.c
+clean_kconfig sound/pci/Kconfig 'SND_INDIGO'
+clean_mk CONFIG_SND_INDIGO sound/pci/echoaudio/Makefile
+
+announce SND_INDIGODJ - "(Echoaudio) Indigo DJ"
+clean_blob sound/pci/echoaudio/indigodj.c
+clean_kconfig sound/pci/Kconfig 'SND_INDIGODJ'
+clean_mk CONFIG_SND_INDIGODJ sound/pci/echoaudio/Makefile
+
+announce SND_INDIGODJX - "(Echoaudio) Indigo DJx"
+clean_blob sound/pci/echoaudio/indigodjx.c
+clean_kconfig sound/pci/Kconfig 'SND_INDIGODJX'
+clean_mk CONFIG_SND_INDIGODJX sound/pci/echoaudio/Makefile
+
+announce SND_INDIGOIO - "(Echoaudio) Indigo IO"
+clean_blob sound/pci/echoaudio/indigoio.c
+clean_kconfig sound/pci/Kconfig 'SND_INDIGOIO'
+clean_mk CONFIG_SND_INDIGOIO sound/pci/echoaudio/Makefile
+
+announce SND_INDIGOIOX - "(Echoaudio) Indigo IOx"
+clean_blob sound/pci/echoaudio/indigoiox.c
+clean_kconfig sound/pci/Kconfig 'SND_INDIGOIOX'
+clean_mk CONFIG_SND_INDIGOIOX sound/pci/echoaudio/Makefile
+
+announce SND_LAYLA20 - "(Echoaudio) Layla20"
+clean_blob sound/pci/echoaudio/layla20.c
+clean_kconfig sound/pci/Kconfig 'SND_LAYLA20'
+clean_mk CONFIG_SND_LAYLA20 sound/pci/echoaudio/Makefile
+
+announce SND_LAYLA24 - "(Echoaudio) Layla24"
+clean_blob sound/pci/echoaudio/layla24.c
+clean_kconfig sound/pci/Kconfig 'SND_LAYLA24'
+clean_mk CONFIG_SND_LAYLA24 sound/pci/echoaudio/Makefile
+
+announce SND_MIA - "(Echoaudio) Mia"
+clean_blob sound/pci/echoaudio/mia.c
+clean_kconfig sound/pci/Kconfig 'SND_MIA'
+clean_mk CONFIG_SND_MIA sound/pci/echoaudio/Makefile
+
+announce SND_MONA - "(Echoaudio) Mona"
+clean_blob sound/pci/echoaudio/mona.c
+clean_kconfig sound/pci/Kconfig 'SND_MONA'
+clean_mk CONFIG_SND_MONA sound/pci/echoaudio/Makefile
+
+announce SND_'<(Echoaudio)>' - "(Echoaudio) all of the above "
+reject_firmware sound/pci/echoaudio/echoaudio.c
+clean_blob sound/pci/echoaudio/echoaudio.c
+
+announce SND_EMU10K1 - "Emu10k1 (SB Live!, Audigy, E-mu APS)"
+reject_firmware sound/pci/emu10k1/emu10k1_main.c
+clean_blob sound/pci/emu10k1/emu10k1_main.c
+clean_kconfig sound/pci/Kconfig 'SND_EMU10K1'
+clean_mk CONFIG_SND_EMU10K1 sound/pci/emu10k1/Makefile
+
+announce SND_MIXART - "Digigram miXart"
+reject_firmware sound/pci/mixart/mixart_hwdep.c
+clean_blob sound/pci/mixart/mixart_hwdep.c
+clean_kconfig sound/pci/Kconfig 'SND_MIXART'
+clean_mk CONFIG_SND_MIXART sound/pci/mixart/Makefile
+
+announce SND_PCXHR - "Digigram PCXHR"
+reject_firmware sound/pci/pcxhr/pcxhr_hwdep.c
+clean_blob sound/pci/pcxhr/pcxhr_hwdep.c
+clean_kconfig sound/pci/Kconfig 'SND_PCXHR'
+clean_mk CONFIG_SND_PCXHR sound/pci/pcxhr/Makefile
+
+announce SND_RIPTIDE - "Conexant Riptide"
+reject_firmware sound/pci/riptide/riptide.c
+clean_blob sound/pci/riptide/riptide.c
+clean_kconfig sound/pci/Kconfig 'SND_RIPTIDE'
+clean_mk CONFIG_SND_RIPTIDE sound/pci/riptide/Makefile
+
+# This is ok, patch filenames are supplied as module parameters, and
+# they are text files with patch instructions.
+#announce SND_HDA_PATCH_LOADER - "Support initialization patch loading for HD-audio"
+#reject_firmware sound/pci/hda/hda_hwdep.c
+#clean_kconfig sound/pci/hda/Kconfig 'SND_HDA_PATCH_LOADER'
+
+announce SND_HDSP - "RME Hammerfall DSP Audio"
+reject_firmware sound/pci/rme9652/hdsp.c
+clean_blob sound/pci/rme9652/hdsp.c
+clean_kconfig sound/pci/Kconfig 'SND_HDSP'
+clean_mk CONFIG_SND_HDSP sound/pci/rme9652/Makefile
+
+announce SND_AICA - "Dreamcast Yamaha AICA sound"
+reject_firmware sound/sh/aica.c
+clean_blob sound/sh/aica.c
+clean_kconfig sound/sh/Kconfig 'SND_AICA'
+clean_mk CONFIG_SND_AICA sound/sh/Makefile
+
+announce SND_MSND_PINNACLE - "Support for Turtle Beach MultiSound Pinnacle"
+clean_blob sound/isa/msnd/msnd_pinnacle.h
+reject_firmware sound/isa/msnd/msnd_pinnacle.c
+clean_blob sound/isa/msnd/msnd_pinnacle.c
+clean_kconfig sound/isa/Kconfig 'SND_MSND_PINNACLE'
+clean_mk CONFIG_SND_MSND_PINNACLE sound/isa/msnd/Makefile
+
+announce SND_MSND_CLASSIC - "Support for Turtle Beach MultiSound Classic, Tahiti, Monterey"
+clean_blob sound/isa/msnd/msnd_classic.h
+clean_kconfig sound/isa/Kconfig 'SND_MSND_CLASSIC'
+clean_mk CONFIG_SND_MSND_CLASSIC sound/isa/msnd/Makefile
+
+announce SOUND_MSNDCLAS - "Support for Turtle Beach MultiSound Classic, Tahiti, Monterey (oss)"
+clean_blob sound/oss/msnd_classic.h
+clean_kconfig sound/oss/Kconfig 'SOUND_MSNDCLAS'
+clean_sed '
+/^config MSNDCLAS_INIT_FILE$/, /^config / {
+ /^ default.*msndinit\.bin/ s,".*","/*(DEBLOBBED)*/",;
+}
+/^config MSNDCLAS_PERM_FILE$/, /^config / {
+ /^ default.*msndperm\.bin/ s,".*","/*(DEBLOBBED)*/",;
+}' sound/oss/Kconfig 'removed default firmware'
+clean_mk CONFIG_SOUND_MSNDCLAS sound/oss/Makefile
+
+announce SOUND_MSNDPIN - "Support for Turtle Beach MultiSound Pinnacle (oss)"
+clean_blob sound/oss/msnd_pinnacle.h
+clean_kconfig sound/oss/Kconfig 'SOUND_MSNDPIN'
+clean_sed '
+/^config MSNDPIN_INIT_FILE$/, /^config / {
+ /^ default.*pndspini\.bin/ s,".*","/*(DEBLOBBED)*/",;
+}
+/^config MSNDPIN_PERM_FILE$/, /^config / {
+ /^ default.*pndsperm\.bin/ s,".*","/*(DEBLOBBED)*/",;
+}' sound/oss/Kconfig 'removed default firmware'
+clean_mk CONFIG_SOUND_MSNDPIN sound/oss/Makefile
+
+announce SND_SSCAPE - "Ensoniq SoundScape driver"
+reject_firmware sound/isa/sscape.c
+clean_blob sound/isa/sscape.c
+clean_sed '
+/^config SND_SSCAPE$/, /^config / {
+ s,"\(scope\|sndscape\)\.co[d?]","/*(DEBLOBBED)*/",g;
+}' sound/isa/Kconfig 'removed firmware names'
+clean_kconfig sound/isa/Kconfig 'SND_SSCAPE'
+clean_mk CONFIG_SND_SSCAPE sound/isa/Makefile
+
+# It's not clear that wm2000_anc.bin is pure data.
+# Check with developer, clean up for now.
+announce SND_SOC_WM2000 - "WM2000 ALSA Soc Audio driver"
+reject_firmware sound/soc/codecs/wm2000.c
+clean_blob sound/soc/codecs/wm2000.c
+clean_kconfig sound/soc/codecs/Kconfig 'SND_SOC_WM2000'
+clean_mk CONFIG_SND_SOC_WM2000 sound/soc/codecs/Makefile
+
+announce SND_SOC_SH4_SIU - "ALSA SoC driver for Renesas SH7343, SH7722 SIU peripheral"
+reject_firmware sound/soc/sh/siu_dai.c
+clean_blob sound/soc/sh/siu_dai.c
+clean_kconfig sound/soc/sh/Kconfig 'SND_SOC_SH4_SIU'
+clean_mk CONFIG_SND_SOC_SH4_SIU sound/soc/sh/Makefile
+
+announce SOUND_TRIX - "MediaTrix AudioTrix Pro support"
+clean_blob sound/oss/trix.c
+clean_kconfig sound/oss/Kconfig 'SOUND_TRIX'
+clean_sed '
+/^config TRIX_BOOT_FILE$/, /^config / {
+ /^ default.*trxpro\.hex/ s,".*","/*(DEBLOBBED)*/",;
+}' sound/oss/Kconfig 'removed default firmware'
+clean_mk CONFIG_SOUND_TRIX sound/oss/Makefile
+
+announce SOUND_TRIX - "See above,"
+announce SOUND_PAS - "ProAudioSpectrum 16 support,"
+announce SOUND_SB - "100% Sound Blaster compatibles (SB16/32/64, ESS, Jazz16) support"
+clean_blob sound/oss/sb_common.c
+clean_kconfig sound/oss/Kconfig 'SOUND_PAS'
+clean_kconfig sound/oss/Kconfig 'SOUND_SB'
+clean_mk CONFIG_SOUND_PAS sound/oss/Makefile
+clean_mk CONFIG_SOUND_SB sound/oss/Makefile
+
+announce SOUND_PSS - "PSS (AD1848, ADSP-2115, ESC614) support"
+clean_sed 's,^\( [*] .*synth"\)\.$,\1/*.,' sound/oss/pss.c 'avoid nested comments'
+clean_blob sound/oss/pss.c
+clean_kconfig sound/oss/Kconfig 'SOUND_PSS'
+clean_sed '
+/^config PSS_BOOT_FILE$/, /^config / {
+ /^ default.*dsp001\.ld/ s,".*","/*(DEBLOBBED)*/",;
+}' sound/oss/Kconfig 'removed default firmware'
+clean_mk CONFIG_SOUND_PSS sound/oss/Makefile
+
+##########
+# Crypto #
+##########
+
+announce DX_SEP - "Discretix SEP driver"
+reject_firmware drivers/staging/sep/sep_driver.c
+clean_blob drivers/staging/sep/sep_driver.c
+clean_kconfig drivers/staging/sep/Kconfig 'DX_SEP'
+clean_mk CONFIG_DX_SEP drivers/staging/sep/Makefile
+
+#################
+# Documentation #
+#################
+
+announce Documentation - "non-Free firmware scripts and documentation"
+clean_blob Documentation/dvb/avermedia.txt
+clean_blob Documentation/dvb/opera-firmware.txt
+clean_blob Documentation/dvb/ttusb-dec.txt
+clean_blob Documentation/sound/alsa/ALSA-Configuration.txt
+clean_blob Documentation/sound/oss/MultiSound
+clean_blob Documentation/sound/oss/PSS
+clean_blob Documentation/sound/oss/PSS-updates
+clean_blob Documentation/sound/oss/README.OSS
+clean_file Documentation/dvb/get_dvb_firmware
+clean_file Documentation/video4linux/extract_xc3028.pl
+clean_sed s,usb8388,whatever,g drivers/base/Kconfig 'removed blob name'
+clean_blob firmware/README.AddingFirmware
+clean_blob firmware/WHENCE
+
+if $errors; then
+ echo errors above were ignored because of --force >&2
+fi
+
+exit 0
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/deblob-check b/freed-ora/tags/f15/2.6.38.6-27.fc15/deblob-check
new file mode 100755
index 000000000..139f1e435
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/deblob-check
@@ -0,0 +1,5442 @@
+#! /bin/sh
+
+# deblob-check version 2011-05-04
+# Inspired in gNewSense's find-firmware script.
+# Written by Alexandre Oliva <lxoliva@fsfla.org>
+
+# Check http://www.fsfla.org/svn/fsfla/software/linux-libre for newer
+# versions.
+
+# Copyright 2008, 2009, 2010, 2011 Alexandre Oliva <lxoliva@fsfla.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+# USA
+
+
+# usage: deblob-check [-S] [-v] [-v] [-s S] [--reverse-patch] \
+# [--use-...|--gen-flex] [-lDdBbCcXxPpFftVh?H] \
+# *.tar* patch-* [-i prefix/] *.patch *.diff...
+
+# Look for and report too-long undocumented sequences of numbers
+# (generally blobs in disguise) in source files, as well as requests
+# for loading non-Free firmware.
+
+# The order of command line flags is significant. Flags given out of
+# the order above won't be handled correctly, sorry.
+
+# -s --sensitivity: Specifies the number of consecutive integral or
+# character constants that trigger the blob detector.
+# Must be followed by a blank and a number.
+
+# --reverse-patch: Test the removed parts of a patch, rather than
+# the added ones.
+
+# --use-awk: Choose the internal GNU awk script for the bulk of the
+# work. This is the default option, if GNU awk is found.
+# The awk interpreter is named gawk, unless AWK is set.
+
+# --use-sed: Choose the internal GNU sed script for the bulk of the
+# work. This is the default option, if GNU awk is not
+# found.
+
+# --use-python: Choose the internal python script. This is not
+# recommended, because the regular expressions we use
+# invoke exponential behavior in the python engine.
+
+# --use-perl: Choose the internal perl script. This is not
+# recommended, because our regular expressions exceed
+# some limits hard-coded into perl.
+
+# --save-script-input: Save the input that would have been fed to
+# any of the engines above.
+
+# --gen-flex: Generate a flex input file with all known blob and
+# false positive patterns. It would have been a fast
+# regular expression processor if only the flex program
+# completed in reasonable time.
+
+
+# The default sensitivity is 32 constants.
+
+# The sensitivity, if present, must be the first option. The action
+# selection, if present, must be the first argument, except for the
+# sensitivity and verbosity.
+
+# The default can be overridden with one of:
+
+# -l --list-blobs: list files that contain sequences that match the
+# blob detector test and that are not known to be false
+# positives. This is the default option.
+
+# -d --deblob --mark-blobs: print the processed input, replacing
+# sequences that match the blob detector test and that
+# are NOT known to be false positives with
+# /*(DEBLOBBED)*/.
+
+# -D --cat: print the processed input, as it would have been fed to
+# the blob detector script. Use -S to save the sed
+# script used to process it, and search for `sedcat:' in
+# comments to locate the relevant adaptation points.
+
+# -b --print-marked-blobs: like -d, but print only the matching
+# sequences.
+
+# -B --print-blobs: like -b, but do not deblob the sequences.
+
+# -c --print-marked-blobs-with-context: like -b, but try to maximize
+# the context around the blobs. This maximization will
+# sometimes disregard known false positives, if they
+# happen to be contained within the extended match.
+# This is probably an indication that the false positive
+# matching rule could be improved.
+
+# -C --print-blobs-with-context: like -B, but try to maximize the
+# context around the blobs.
+
+# -X --print-all-matches: print all blobs, be they known false
+# positives or actual blobs.
+
+# -x --list-all-matches: list files that contain sequences that appear
+# to be blobs, be they known false positives or not.
+
+# -p --mark-false-positives: print the processed input, replacing
+# sequences that match the blob detector test, even those
+# known to be false positives, with /*(DEBLOBBED)*/.
+
+# -P --list-false-positives: list files that contain false positives.
+
+# -f --print-marked-false-positives: like -p, but print only the
+# matching sequences.
+
+# -F --print-false-positives: like -f, but do not deblob the sequences.
+
+# -t --test: run (very minimal) self-test.
+
+# -V --version: print a version number
+
+# -h -? -H --help: print short or long help message
+
+
+# debugging options:
+
+# -S --save-scripts: save scripts and temporary files.
+
+# -v --verbose: increase verbosity level, for internal debugging. May
+# be given at most twice.
+
+
+# file options:
+
+# --: Don't process command-line options any further. All following
+# arguments are taken as filenames.
+
+# -i --implied-prefix --prefix: prepend the given prefix to each filename
+# listed after this option, when configuring false positives
+# and negatives.
+
+# *.tar*: iterate over all files in the named tar file.
+
+# *.patch, patch-*, *.diff: Look for blobs in the [ +] parts of the
+# *patch, unless --reverse-patch is given, in which case
+# the [ -] parts will be used.
+
+# Anything else is assumed to be a source file.
+
+# *.gz | *.bz2: Decompress automatically.
+
+
+# The exit status is only significant for the --list options: it will
+# be true if nothing was found, and false otherwise.
+
+: # Mark the end of the help message.
+
+# TODO:
+
+# - Improve handling of command-line arguments, so as to not make the
+# order relevant.
+
+# - Add an option for the user to feed their own false positive
+# patterns.
+
+# - Add support to recognize known blobs (or other non-Free
+# signatures, really), to speed up the scanning of files containing
+# blobs, and to avoid attempts to disguise blobs.
+
+# - Factor out the code in the various print_* and list_* parts of the
+# sed script, at least in the shell sources. Make sure they're all
+# included and expanded in a saved --cat script though.
+
+# - Add support for file name tagging in patterns, such that blobs or
+# false positives are recognized only when handling the specific
+# filename, be it stand-alone, as part of a patch or a tarball. This
+# should help avoid recognition of actual blobs as false positives
+# just because there's a symbol with a different name elsewhere.
+
+# It is convenient that the patterns provided by the user to
+# recognize file names can be empty (for backward compatibility), but
+# this should ideally be phased out in favor of more precise matches.
+# It's important that files can be recognized with leading tarball or
+# patch names, that the filename used within the tarball contain
+# leading garbage, and even that a partial pathname be recognizable
+# (say recognize drivers/net/whatever.c when the input file is named
+# ../net/whatever.c).
+
+# Rather than using regular expressions to recognize multiple files
+# it's convenient (but not quite essential) that filename patterns be
+# specifiable as regular expressions, rather than simple filenames,
+# but there are other ways around this.
+
+# Maintaining begin/end markers in a stack-like fashion as part of
+# the processed stream, and using the names in them as (optional) part
+# of the recognition patterns, would enable us to do it.
+
+# Introducing annotations next to the false positives (and recognized
+# blobs) as an early part of the process may speed things up and
+# enable fast processing, but how to introduce the annotations quickly
+# in the first place? Given patterns such as
+
+# \(\(file1\)\(.*\)\(pat1\)\|\(file2\)\(.*\)\(pat2\)\|...\)
+
+# how do we get sed to introduce a marker that contains file2 right
+# before or right after pat2, without turning a big efficient regexp
+# into a slowish sequence of s/// commands?
+
+# - Re-check and narrow false-positive patterns to make sure they
+# apply only to the relevant content.
+
+# - Scripting abilities, so as to be able to automate the removal of
+# source files or of blobs from source files in a tarball without
+# having to extract the entire tarball (as in tar --update/--delete)
+# would be nice. Carrying over removed files automatically into
+# patches would also be great, and this sort of script would be
+# perfect to document what has been done to a tarball plus a set of
+# patches. Something like deblob.script:
+#
+# tarball linux-2.6.24.tar.bz2
+# delete net/wireloss/freedom.c drivers/me/crazy.c
+# deblob include/linux/slab-blob-kfree.h
+# deconfig drivers/char/drm DRM_IS_BAD
+#
+# patch patch-2.6.25-rc7.bz2
+# delete arch/power/over/you.c
+
+# such that the deletes from an earlier file would carry over into the
+# subsequent ones, and new tarballs and patch files would be generated
+# with the libre- prefix in their basename, and the xdeltas between
+# the original files and the modified files would be minimal, and
+# redundant with this script and the input script while at that.
+
+# - Improve documentation of the code.
+
+# - Write a decent testsuite.
+
+# - Insert your idea here. :-)
+
+# Yeah, lots of stuff to do. Want to help?
+
+# This makes it much faster, and mostly immune to non-ASCII stuff, as
+# long as a 8-bit-safe sed is used. Probably a safe assumption these
+# days.
+case ${LANG+set} in set) LANG=C; export LANG;; esac
+
+rm="rm -f"
+
+for echo in 'echo' 'printf %s\n'; do
+ case `$echo '\nx'` in
+ '\nx') break;;
+ esac
+done
+case `$echo '\nx'` in
+'\nx') ;; *) echo Cannot find out what echo to use >&2; exit 1;;
+esac
+
+for echo_n in "echo -n" "printf %s"; do
+ case `$echo_n '\na'; $echo_n '\nb'` in
+ '\na\nb') break;;
+ esac
+done
+case `$echo_n a; $echo_n b` in
+'ab') ;; *) echo Cannot find out an echo -n equivalent to use >&2; exit 1;;
+esac
+
+case $1 in
+--save-scripts | -S)
+ shift
+ rm="echo preserving"
+ ;;
+esac
+
+# Choose verbosity level for sed script debugging and performance
+# analysis.
+case $1 in
+--verbose | -v)
+ shift
+ case $1 in
+ --verbose | -v)
+ shift
+ v="i\\
+:
+p
+i\\
+"
+ vp="2"
+ ;;
+ *)
+ v="P;i\\
+"
+ vp="1"
+ ;;
+ esac
+ ;;
+*)
+ v="# "
+ vp="0"
+ ;;
+esac
+
+sens=31 # 32 - 1
+case $1 in
+--sensitivity | -s)
+ sens=$2;
+ shift 2 || exit 1
+
+ if test "$sens" -gt 0 2>/dev/null; then
+ :
+ else
+ echo invalid sensitivity: $sens >&2
+ exit 1
+ fi
+
+ sens=`expr $sens - 1`
+ ;;
+esac
+
+reverse_patch=false
+case $1 in
+--reverse-patch)
+ reverse_patch=:
+ shift;
+ ;;
+esac
+
+prefix=/
+case $1 in
+--implied-prefix | --prefix| -i)
+ prefix=$2
+ case $prefix in
+ /*/) ;;
+ */) prefix=/$prefix ;;
+ /*) prefix=$prefix/ ;;
+ *) prefix=/$prefix/ ;;
+ esac
+ shift 2 || exit 1
+ ;;
+esac
+
+test_mode=false
+
+name=deblob-check
+
+set_eqscript_main () {
+ $set_main_cmd "$@"
+}
+
+set_eqscript_cmd () {
+ set_eqscript_main "list_blob"
+}
+
+set_sed_cmd () {
+ set_sed_main "
+i\\
+$file\\
+/*(DEBLOB-\\
+ERROR)*/
+q 1"
+}
+
+set_flex_cmd () {
+ set_flex_main
+}
+
+set_save_script_input_cmd () {
+ set_save_script_input_main
+}
+
+set_cmd=set_eqscript_cmd
+if (${PYTHON-python} --version) > /dev/null 2>&1; then
+ # Python will exhibit exponential behavior processing some regular
+ # expressions, but we may have already fixed them all. (see
+ # http://swtch.com/~rsc/regexp/regexp1.html for details)
+ set_main_cmd=set_python_main
+elif (${AWK-gawk} --re-interval --version) > /dev/null 2>&1; then
+ # GNU awk works fine, but it requires --re-interval to accept regexp
+ # ranges, which we rely on to match blobs. We could expand the blob
+ # on our own, but, yuck.
+ set_main_cmd=set_awk_main
+elif (${PERL-false} --version) > /dev/null 2>&1; then
+ # Don't choose perl by default. Besides the potential for
+ # exponential behavior, we exceed some internal recursion limits.
+ set_main_cmd=set_perl_main
+else
+ # Sed takes GBs of RAM to compile all the huge regexps in the sed
+ # script we generate with all known false positives and blobs in
+ # Linux. However, it is somewhat faster than GNU awk and even
+ # python for long runs.
+ # Try it: deblob-check --use-sed linux-2.6.32.tar.bz2
+ set_cmd=set_sed_cmd
+fi
+
+case $1 in
+--use-python)
+ shift;
+ set_cmd=set_eqscript_cmd;
+ set_main_cmd=set_python_main;
+ ;;
+
+--use-perl)
+ shift;
+ set_cmd=set_eqscript_cmd;
+ set_main_cmd=set_perl_main;
+ ;;
+
+--use-awk)
+ shift;
+ set_cmd=set_eqscript_cmd;
+ set_main_cmd=set_awk_main;
+ ;;
+
+--use-sed)
+ shift;
+ set_cmd=set_sed_cmd;
+ ;;
+
+--gen-flex)
+ shift;
+ set_cmd=set_flex_cmd;
+ ;;
+
+--save-script-input)
+ shift;
+ set_cmd=set_save_script_input_cmd;
+ ;;
+esac
+
+case $1 in
+--version | -V)
+ ${SED-sed} -e '/^# '$name' version /,/^# Written by/ { s/^# //; p; }; d' < $0
+ exit 0
+ ;;
+
+-\? | -h)
+ ${SED-sed} -n -e '/^# usage:/,/# -h/ { /^# -/,/^$/{s/^# \(-.*\):.*/\1/p; d; }; s/^\(# \?\)\?//p; }' < $0 &&
+ echo
+ echo "run \`$name --help | more' for full usage"
+ exit 0
+ ;;
+
+--help | -H)
+ ${SED-sed} -n -e '/^# '$name' version /,/^[^#]/ s/^\(# \?\)\?//p' < $0
+ exit 0
+ ;;
+
+--test | -t)
+ test_mode=:
+ ;;
+
+--mark-false-positives | -p)
+ shift;
+ set_sed_cmd () {
+ set_sed_main "b list_both" "p" "b list_matches"
+ }
+ set_eqscript_cmd () {
+ set_eqscript_main "replace_blob = print_blob = without_falsepos"
+ }
+ ;;
+
+--print-marked-false-positives | -f)
+ shift;
+ set_sed_cmd () {
+ set_sed_main "b print_marked_matches" "" "b print_marked_matches"
+ }
+ set_eqscript_cmd () {
+ set_eqscript_main "replace_falsepos = print_falsepos"
+ }
+ ;;
+
+--print-false-positives | -F)
+ shift;
+ set_sed_cmd () {
+ set_sed_main "b print_matches" "" "b print_matches"
+ }
+ set_eqscript_cmd () {
+ set_eqscript_main "print_falsepos"
+ }
+ ;;
+
+--deblob | --mark-blobs | -d)
+ shift;
+ set_sed_cmd () {
+ set_sed_main "b list_blobs" "p" "p"
+ }
+ set_eqscript_cmd () {
+ set_eqscript_main "replace_blob = print_blob = print_falsepos = print_nomatch"
+ }
+ ;;
+
+--cat | -D)
+ shift;
+ set_sed_cmd () {
+ set_sed_main \
+ "# sedcat: Actual blob detected, but there may be false positives." \
+ "# sedcat: No blob whatsoever found." \
+ "# sedcat: False positives found." \
+ "p
+d
+# sedcat: Just print stuff, remove this line to run the actual script."
+ }
+ set_eqscript_cmd () {
+ set_eqscript_main "print_blob = print_falsepos = print_nomatch"
+ }
+ ;;
+
+--print-marked-blobs | -b)
+ shift;
+ set_sed_cmd () {
+ set_sed_main "b print_marked_blobs"
+ }
+ set_eqscript_cmd () {
+ set_eqscript_main "replace_blob = print_blob"
+ }
+ ;;
+
+--print-blobs | -B)
+ shift;
+ set_sed_cmd () {
+ set_sed_main "b print_blobs"
+ }
+ set_eqscript_cmd () {
+ set_eqscript_main "print_blob"
+ }
+ ;;
+
+--print-marked-blobs-with-context | -c)
+ shift;
+ set_sed_cmd () {
+ set_sed_main "b print_marked_cblobs"
+ }
+ set_eqscript_cmd () {
+ set_eqscript_main "with_context = replace_blob = print_blob"
+ }
+ ;;
+
+--print-blobs-with-context | -C)
+ shift;
+ set_sed_cmd () {
+ set_sed_main "b print_cblobs"
+ }
+ set_eqscript_cmd () {
+ set_eqscript_main "with_context = print_blob"
+ }
+ ;;
+
+--list-false-positives | -P)
+ shift;
+ set_sed_cmd () {
+ set_sed_main "" "" "
+i\\
+$file\\
+/*(DEBLOB-\\
+ERROR)*/
+q 1"
+ }
+ set_eqscript_cmd () {
+ set_eqscript_main "list_falsepos"
+ }
+ ;;
+
+--list-all-matches | -x)
+ shift;
+ set_sed_cmd () {
+ set_sed_main "
+i\\
+$file\\
+/*(DEBLOB-\\
+ERROR)*/
+q 1" "" "
+i\\
+$file\\
+/*(DEBLOB-\\
+ERROR)*/
+q 1"
+ }
+ set_eqscript_cmd () {
+ set_eqscript_main "list_blob = list_falsepos"
+ }
+ ;;
+
+--print-all-matches | -X)
+ shift;
+ set_sed_cmd () {
+ set_sed_main "b print_both" "" "b print_matches"
+ }
+ set_eqscript_cmd () {
+ set_eqscript_main "print_blob = print_falsepos"
+ }
+ ;;
+
+*)
+ case $1 in
+ --list-blobs | -l) shift;;
+ esac
+ case $1 in
+ -- | --implied-prefix | --prefix | -i) ;;
+ -*)
+ if test ! -f "$1"; then
+ echo "$name: \`$1' given too late or out of the proper sequence." >&2
+ echo "$name: The order of arguments is significant, see the usage." >&2
+ exit 1
+ fi
+ ;;
+ esac
+ ;;
+
+esac
+
+case $1 in
+--)
+ sawdashdash=t
+ shift;;
+esac
+
+if $test_mode; then
+ allpass=:
+ for tool in awk perl python sed; do
+ echo testing $tool...
+
+ targs="-s 4 -i /deblob-check-testsuite/ --use-$tool"
+
+ pass=:
+
+
+ # Exercise some nasty inputs to see that we
+ # recognize them as blobs with full context.
+ test="positive context"
+ for string in \
+ "1,2,3,4" \
+ "= {
+1, 0x2, 03, L'\x4'
+}" \
+ "=
+{
+ '\\x1', '\\002'
+ ,
+ {
+ { \"\\x3\", },
+ \"\\004\"
+ },
+};" \
+ ".long 1,2
+ .long \$3,\$4" \
+ "#define X { 1, 2, \\
+ 3, 4, /* comment */ \\
+ }" \
+ "= {
+/*
+ * multi-line
+ * comment
+ */
+ {
+ 0x4c00c000, 0x00000000, 0x00060000, 0x00000000,
+ },
+}" \
+ "= {
+blob(
+)
+accept(
+)
+1, 2, 3, 4
+}" \
+ ; do
+ case `echo "$string" | $0 $targs -C` in
+ "::: - :::
+$string") ;;
+ *) echo "failed $test test for:
+$string" >&2
+ pass=false;;
+ esac
+ done
+
+ # Make sure we do not recognize these as blobs.
+ test=negative
+ for string in \
+ "#define X { 1, 2 }
+#define Y { 3, 4 }" \
+ " 0x00, 0x00, 0x00 " \
+ "accept(1, 2, 3,
+4, 5, 6)" \
+ ; do
+ case `echo "$string" | $0 $targs` in
+ "") ;;
+ *) echo "failed $test test for:
+$string" >&2
+ pass=false;;
+ esac
+ done
+
+ # Make sure we print only the lines with blobs.
+ test="only blob"
+ odd=:
+ for string in \
+ "= {
+1, 0x2, 03, L'\x4'
+}" \
+ "1, 0x2, 03, L'\x4'" \
+\
+ "=
+{
+ '\\x1', '\\002'
+ ,
+ {
+ { \"\\x3\", },
+ \"\\004\"
+ },
+};" \
+ " '\\x1', '\\002'
+ ,
+ {
+ { \"\\x3\", },
+ \"\\004\"" \
+\
+ ".long 1,2
+ .long \$3,\$4" \
+ ".long 1,2
+ .long \$3,\$4" \
+\
+ "#define X { 1, 2, \\
+ 3, 4, /* comment */ \\
+ }" \
+ "#define X { 1, 2, \\
+ 3, 4, /* comment */ \\" \
+\
+ "= {
+/*
+ * multi-line
+ * comment
+ */
+ {
+ 0x4c00c000, 0x00000000, 0x00060000, 0x00000000,
+ },
+}" \
+ " 0x4c00c000, 0x00000000, 0x00060000, 0x00000000," \
+\
+ "MODULE_FIRMWARE(x);
+MODULE_FIRMWARE(y);
+1, 2, 3, 4; 5, 6, 7, 8;
+9, 10, 11" \
+ "MODULE_FIRMWARE(x);
+MODULE_FIRMWARE(y);
+::: - :::
+1, 2, 3, 4; 5, 6, 7, 8;" \
+\
+ "= {
+blob()
+accept()
+1, 2, 3, 4
+}" \
+ "blob()
+::: - :::
+1, 2, 3, 4" \
+\
+ "a blobeol y
+x" \
+ "a blobeol y
+x" \
+\
+ ; do
+ if $odd; then
+ input=$string odd=false
+ continue
+ fi
+ case `echo "$input" | $0 $targs -B` in
+ "::: - :::
+$string") ;;
+ *)
+ echo "failed $test test for:
+$input" >&2
+ pass=false
+ ;;
+ esac
+ odd=:
+ done
+ $odd || { echo "internal testsuite failure in $test" >&2; }
+
+ # Make sure we deblob only the blobs.
+ test="deblobs"
+ odd=:
+ for string in \
+ "= { 1, 0x2, 03, L'\x4' }" \
+ "= { /*(DEBLOBBED)*/' }" \
+\
+ "=
+{
+ '\\x1', '\\002'
+ ,
+ {
+ { \"\\x3\", },
+ \"\\004\"
+ },
+};" \
+ " '\\x/*(DEBLOBBED)*/\"" \
+\
+ ".long 1,2
+ .long \$3,\$4" \
+ ".long /*(DEBLOBBED)*/" \
+\
+ "#define X { 1, 2, \\
+ 3, 4, /* comment */ \\
+ }" \
+ "#define X { /*(DEBLOBBED)*/, /* comment */ \\" \
+\
+ "= {
+/*
+ * multi-line
+ * comment
+ */
+ {
+ 0x4c00c000, 0x00000000, 0x00060000, 0x00000000,
+ },
+}" \
+ " /*(DEBLOBBED)*/," \
+\
+ "MODULE_FIRMWARE(x);
+MODULE_FIRMWARE(y);
+1, 2, 3, 4; 5, 6; 7, 8, 9, 10;
+9, 10, 11" \
+ "/*(DEBLOBBED)*/
+::: - :::
+/*(DEBLOBBED)*/; 5, 6; /*(DEBLOBBED)*/;" \
+\
+ "= {
+accept() blob() x blob(
+) y
+}" \
+ "accept() /*(DEBLOBBED)*/ x /*(DEBLOBBED)*/ y" \
+\
+ "= {
+accept() blob() x blob(
+w) y
+}" \
+ "accept() /*(DEBLOBBED)*/ x /*(DEBLOBBED)*/ y" \
+\
+ "a blobeol y
+x" \
+ "a /*(DEBLOBBED)*/x" \
+\
+ ; do
+ if $odd; then
+ input=$string odd=false
+ continue
+ fi
+ case `echo "$input" | $0 $targs -b` in
+ "::: - :::
+$string") ;;
+ *)
+ echo "failed $test test for:
+$input" >&2
+ pass=false
+ ;;
+ esac
+ odd=:
+ done
+ $odd || { echo "internal testsuite failure in $test" >&2; }
+
+ # How did we do?
+ if $pass; then
+ echo success for $tool
+ else
+ allpass=$pass
+ fi
+ done
+ $allpass
+ exit
+fi
+
+# Call addx as needed to set up more patterns to be recognized as
+# false positives. Takes the input filename in $1.
+
+set_except () {
+ blob "$blobseq"
+ # We leave out the initial and final letters of request_firmware so
+ # that deblobbing turns them into r/*DEBLOBBED*/e, a syntax error.
+ blobna 'equest_firmwar'
+ blobna 'equest_ihex_firmwar'
+ blobna 'MODULE_FIRMWARE[ ]*[(][^\n;]*[)][ ]*[;]\([ \n]*MODULE_FIRMWARE[ ]*[(][^\n;]*[)][ ]*[;]\)*'
+ blobna 'DEFAULT_FIRMWARE'
+ blobna '\([.]\|->\)firmware[ \n]*=[^=]'
+ blobna 'mod_firmware_load' # sound/
+ blobname '[.]\(fw\|bin[0-9]*\|hex\|frm\|co[dx]\|dat\|elf\|xlx\|rfb\|ucode\|img\|sbcf\|ctx\(prog\|vals\)\|z77\)["]'
+ # Ideally we'd whitelist URLs that don't recommend non-Free
+ # Software, but there are just too many URLs in Linux, and most are
+ # fine, so we just blacklist when we find undesirable URLs.
+ # Please report if you find any inappropriate URL in Linux-libre
+ # deblobbed documentation, sources or run-time log messages.
+ # blobna '\(f\|ht\)tp:[/]\([/]\+[^/ \n ]\+\)\+'
+
+ case $prefix$1 in
+ */*linux*.tar* | */*kernel*.tar* | */*linux-*.*.*/*)
+ # false alarms, contain source
+ # drivers/net/wan/wanxlfw.inc_shipped -> wanxlfw.S
+ accept 'static[ ]u8[ ]firmware\[\]=[{][\n]0x60,\(0x00,\)*0x16,\(0x00,\)*\([\n]\(0x[0-9A-F][0-9A-F],\)*\)*[\n]0x23,0xFC,0x00,0x00,0x00,0x01,0xFF,0xF9,0x00,0xD4,0x61,0x00,0x06,0x74,0x33,0xFC,\([\n]\(0x[0-9A-F][0-9A-F],\)*\)*0x00[\n][}][;]'
+ # drivers/usb/serial/xircom_pgs_fw.h -> xircom_pgs.S
+ initnc 'static[ ]const[ ]struct[ ]ezusb_hex_record[ ]xircom_pgs_firmware\[\][ ]='
+ # drivers/usb/serial/keyspan_pda_fw_h -> keyspan_pda.S
+ initnc 'static[ ]const[ ]struct[ ]ezusb_hex_record[ ]keyspan_pda_firmware\[\][ ]='
+ # arch/m68k/ifpsp060/*.sa -> src/*.s
+ accept '[ ]\.long[ ]0x60ff0000,0x02360000,0x60ff0000,0x16260000[\n]'"$sepx$blobpat*"
+ accept '[ ]\.long[ ]0x60ff0000,0x17400000,0x60ff0000,0x15f40000[\n]'"$sepx$blobpat*"
+ # arch/powerpc/platforms/cell/spufs/spu_save_dump.h_shipped -> spu_save.c
+ initnc 'static[ ]unsigned[ ]int[ ]spu_save_code\[\][ ][ ]__attribute__[(][(]__aligned__[(]128[)][)][)][ ]='
+ # arch/powerpc/platforms/cell/spufs/spu_restore_dump.h_shipped -> spu_restore.c
+ initnc 'static[ ]unsigned[ ]int[ ]spu_restore_code\[\][ ][ ]__attribute__[(][(]__aligned__[(]128[)][)][)][ ]='
+ # drivers/net/ixp2000/ixp2400_tx.ucode -> ixp2400_tx.uc
+ initnc '[ ]\.initial_reg_values[ ]=[ ][(]struct[ ]ixp2000_reg_value[ ]\[\][)][ ][{]'
+ # drivers/net/ixp2000/ixp2400_rx.ucode -> ixp2400_rx.uc
+ initnc '[ ]\.initial_reg_values[ ]=[ ][(]struct[ ]ixp2000_reg_value[ ]\[\][)][ ][{]'
+
+
+ # checked:
+
+ accept '[ ][$]3[ ]=[ ][{][{]pge[ ]=[ ][{][{]ste[ ]=[ ][{]\(\([0-9][0-9a-fx{},\n ]*\|\(pge\|ste\)[ ]=\|<repeats[ ][0-9]\+[ ]times>\)[{},\n ]*\)*<repeats[ ]11[ ]times>[}]$'
+ accept '__clz_tab:[\n][ ]\.byte[ ]0\(,[0-5]\)\+'"$sepx$blobpat*" arch/sparc/lib/divdi3.S
+ accept 'PITBL:[\n][ ][ ]\.long[ ][ ]0xC0040000,0xC90FDAA2,'"$blobpat*" arch/sparc/lib/divdi3.S
+ accept '\(0x[0F][0F],\)\+\\[\n]\(\(0x[0F][0F],\)\+\\[\n]\)*\(0x[0F][0F],\)\+0x00' arch/m68k/mac/mac_penguin.S
+ accept '\.lowcase:[\n][ ]\.byte[ ]0x00\(,0x0[1-7]\)\+'"$sepx$blobpat*"'$' arch/s390/kernel/head.S
+ accept '_zb_findmap:[\n][ ][ ][ ][ ][ ][ ][ ][ ][ ]\.byte[ ][ ]0\(,[123],0\)\+,4'"$sepx$blobpat*"'$' arch/s390/kernel/bitmap.S
+ accept '_sb_findmap:[\n][ ][ ][ ][ ][ ][ ][ ][ ][ ]\.byte[ ][ ]8\(,0,[123]\)\+,0'"$sepx$blobpat*"'$' arch/s390/kernel/bitmap.S
+ accept '[ ]\.section[ ]__ex_table,["]a["]'"$sepx$blobpat*" arch/powerpc/lib/copyuser_64.S
+ accept '[ ]memcpy[(]src,[ ]["]\\x01\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00["].*PROGxxxx' arch/powerpc/platforms/iseries/mf.c
+ initnc 'static[ ]const[ ]unsigned[ ]int[ ]cpu_745x\[2\]\[16\][ ]=' arch/ppc/platforms/ev64260.c
+ initnc 'const[ ]unsigned[ ]char[ ]__flsm1_tab\[256\][ ]=' arch/alpha/lib/fls.c
+ accept '#define[ ]_MAP_0_32_ASCII_SEG7_NON_PRINTABLE[ ]\\[\n][ ]\(0,\)\+$' 'drivers/input/misc/map_to_7segment\.h\|include/linux/map_to_7segment\.h'
+ initc '[ ]static[ ]int[ ][ ][ ][ ][ ][ ]init_values_b\[\][ ]=' sound/oss/ad1848.c
+ initnc 'static[ ]unsigned[ ]char[ ]atkbd_set2_keycode\[512\][ ]=' drivers/input/keyboard/atkbd.c
+ accept 'desc_config1:[\n][ ]\.byte[ ]0x09,[ ]0x02'"$sepx$blobpat*" 'drivers/usb/serial/\(keyspan_pda\|xircom_pgs\).S'
+ accept 'string_mfg:[\n]\?\([;]\?[ ]\.byte[^\n]*[\n]\)\+string_mfg_end:' 'drivers/usb/serial/\(keyspan_pda\|xircom_pgs\).S'
+ accept 'string_product:[\n]\?\([;]\?[ ]\.byte[^\n]*[\n]\)\+string_product_end:' 'drivers/usb/serial/\(keyspan_pda\|xircom_pgs\).S'
+ accept '[ ][ ][ ][/][*][ ]\(SQCIF\|QSIF\|QCIF\|SIF\|CIF\|VGA\)[ ][*][/][\n][ ][ ][ ][{][\n][ ][ ][ ][ ][ ][ ][{]'"$blobpat*" drivers/media/video/pwc/pwc-nala.h
+ accept 'P[13]\([\n]#[^\n]*\)*[\n]*\([\n][0-9 ]*\)\+' drivers/video/logo/*.ppm
+ accept 'for[ ]i[ ]in[ ][ 0-9\\\n]*[\n]do' 'Documentation/specialix\.txt|Documentation/serial/specialix\.txt'
+ accept '[ ][ ][ ][ ][ ][ ][ ][ ][ ]:[ ][ ][ ]3600000[ ][ ][ ]3400000[ ][ ][ ]3200000[ ][ ][ ]3000000[ ][ ][ ]2800000[ ]' Documentation/cpu-freq/cpufreq-stats.txt
+ accept '00[ ]00[\n]64[ ]01[\n]8e[ ]0b[\n][\n][0-9a-f \n]*fe[ ]fe' 'Documentation/scsi/\(sym\|ncr\)53c8xx_2.txt'
+ accept '0f[ ]00[ ]08[ ]08[ ]64[ ]00[ ]0a[ ]00[ ]-[ ]id[ ]0[\n]'"$blobpat*" 'Documentation/scsi/\(sym\|ncr\)53c8xx_2.txt'
+ accept 'default[ ]nvram[ ]data:'"$sepx$blobpat*" 'Documentation/scsi/\(sym\|ncr\)53c8xx_2.txt'
+ accept '0x0458[ ][ ][ ][ ][ ]0x7025[\n]'"$blobpat*" Documentation/video4linux/sn9c102.txt
+ accept '0x102c[ ][ ][ ][ ][ ]0x6151[\n]'"$blobpat*" Documentation/video4linux/et61x251.txt
+ accept '0x041e[ ][ ][ ][ ][ ]0x4017[\n]'"$blobpat*" Documentation/video4linux/zc0301.txt
+ accept '[ ][ ][(]gdb[)][ ]x[/]100x[ ][$]25[\n][ ][ ]0x507d2434:[ ][ ][ ][ ][ ]0x507d2434[ ][ ][ ][ ][ ][ ]0x00000000[ ][ ][ ][ ][ ][ ]0x08048000[ ][ ][ ][ ][ ][ ]0x080a4f8c'"$sepx$blobpat*" Documentation/uml/UserModeLinux-HOWTO.txt
+ accept '[ ][ ][ ][ ][ ][ ]1[ ][ ]0[ ][ ]0[ ][ ]0[ ][ ]0x308'"$sepx$blobpat*" Documentation/isdn/README.inc
+ accept 'domain<N>[ ]<cpumask>[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]10[ ]11[ ]12[ ]13[ ]14[ ]15[ ]16[ ]17[ ]18[ ]19[ ]20[ ]21[ ]22[ ]23[ ]24[ ]25[ ]26[ ]27[ ]28[ ]29[ ]30[ ]31[ ]32[ ]33[ ]34[ ]35[ ]36$' Documentation/sched-stats.txt
+ accept '[ * ]*0[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]1[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]2[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]3[\n][ * ]*0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]0[ ]1' 'net/\(netfilter\|ipv4\)/ipvs/ip_vs_sync.c|net/sctp/sm_make_chunk.c|include/linux/scpt.h'
+ accept '[ ][*][ ][ ]1[ ]1[ ]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' arch/x86/lguest/boot.c
+ ocomment '[ ][/][*][ ]Configure[ ]the[ ]PCI[ ]bus[ ]bursts[ ]and[ ]FIFO[ ]thresholds.' drivers/net/fealnx.c
+ ocomment '[/][*][ ]the[ ]original[ ]LUT[ ]values[ ]from[ ]Alex[ ]van[ ]Kaam[ ]<darkside@chello\.nl>' drivers/hwmon/via686a.c
+ initc 'static[ ]const[ ]unsigned[ ]char[ ]init\[\][ ]=[ ][{][^;]*MODE=0[ ][;].*SAA_7114_NTSC_HSYNC_START' drivers/media/video/saa7114.c
+
+ defsnc 'static[ ]struct[ ]cipher_testvec[ ]\(aes\|anubis\|bf\|camellia\|cts_mode\|des3_ede\|cast6\|salsa20_stream\|serpent\|tf\|tnepres\|xeta\|x\?tea\)\(_\(cbc\|ctr\(_rfc3686\)\?\|xts\)\)\?_\(enc\|dec\)_tv_template\[\][ ]=' 'crypto/\(tcrypt\|testmgr\).h'
+ defsnc 'static[ ]struct[ ]comp_testvec[ ]\(deflate\|lzo\)_\(de\)\?comp_tv_template\[\][ ]=' 'crypto/\(tcrypt\|testmgr\).h'
+ defsnc 'static[ ]struct[ ]hash_testvec[ ]\(aes_xcbc128\|crc32c\|hmac_sha2\(24\|56\)\|\(sha\|wp\)\(256\|384\|512\)\)_tv_template\[\][ ]=' 'crypto/\(tcrypt\|testmgr\).h'
+ # initnc '[ ]*\.\(digest\|entries\|input\|key\|output\|plaintext\|result\)[ \n ]*=[ ][{"]' 'crypto/\(tcrypt\|testmgr\).h'
+
+ defsnc 'static[ ]\(const[ ]\)\?RegInitializer[ ]initData\[\][ ]__initdata[ ]=' 'drivers/ide/ali14xx\.c\|drivers/ide/legacy/ali14xx\.c'
+ defsnc 'static[ ]const[ ]u8[ ]setup\[\][ ]=' 'drivers/ide/delkin_cb\.c\|drivers/ide/pci/delkin_cb\.c'
+ defsnc 'static[ ]u8[ ]cvs_time_value\[\]\[XFER_UDMA_6[ ]-[ ]XFER_UDMA_0[ ][+][ ]1\][ ]=' 'drivers/ide/sis5513\.c\|drivers/ide/pci/sis5513\.c'
+ defsnc 'static[ ]u8[ ]\(act\|ini\|rco\)_time_value\[\]\[8\][ ]=' 'drivers/ide/sis5513\.c\|drivers/ide/pci/sis5513\.c'
+ defsnc 'static[ ]const[ ]u8[ ]speedtab[ ]\[3\]\[12\][ ]=' 'drivers/ide/umc8672\.c\|drivers/ide/legacy/umc8672\.c'
+ defsnc 'static[ ]const[ ]s8[ ]\(b43\(legacy\)\?\|bcm43xx\)_tssi2dbm_[bg]_table\[\][ ]=' net/wireless/b43/phy.c
+ defsnc 'static[ ]const[ ]char[ ]zr360[56]0_dht\[0x1a4\][ ]=' 'drivers/media/video/zr36060\.c\|drivers/media/video/zoran/zr36060\.c'
+ defsnc 'static[ ]const[ ]char[ ]zr360[56]0_dqt\[0x86\][ ]=' 'drivers/media/video/zr36060\.c\|drivers/media/video/zoran/zr36060\.c'
+ defsnc 'static[ ]u8[ ]tas3004_treble_table\[\][ ]=' sound/aoa/codecs/tas-basstreble.h
+
+ # This file contains firmwares that we deblob with high
+ # sensitivity, so make sure the sequences of numbers that are not
+ # blobs are not deblobbed. FIXME: we should have patterns to
+ # recognize the blobs instead.
+ defsnc '[ ]static[ ]const[ ]u32[ ]test_pat\[4\]\[6\][ ]=' drivers/net/tg3.c
+ accept "[ ][}]\\(,\\?[ ]mem_tbl_5\\(70x\\|705\\|755\\|906\\)\\[\\][ ]=[ ][{]$sepx$blobpat*$sepx[}]\\)*[;]" drivers/net/tg3.c
+
+ # end of generic checked expressions.
+ # version-specific checked bits start here
+
+ # removed in 2.6.28
+ defsnc 'static[ ]unsigned[ ]char[ ]irq_xlate\[32\][ ]=' arch/sparc/kernel/sun4m_irq.c
+ defsnc 'static[ ]int[ ]logitech_expanded_keymap\[LOGITECH_EXPANDED_KEYMAP_SIZE\][ ]=' drivers/hid/hid-input.c
+ defsnc '[ ]static[ ]const[ ]\(__\)\?u8[ ]\(read_indexs\|n\(set\)\?[0-9]*\(_other\)\?\|missing\)\[[0-9x]*\][ ]=' drivers/media/video/gspca/t613.c
+ defsnc 'static[ ]const[ ]u_char[ ]nand_ecc_precalc_table\[\][ ]=' drivers/mtd/nand/nand_ecc.c
+ oprepline '#define[ ]AR5K_RATES_\(11[ABG]\|TURBO\|XR\)[ ]' drivers/net/wireless/ath5k/ath5k.h
+ defsnc 'static[ ]const[ ]struct[ ]ath_hal[ ]ar5416hal[ ]=' drivers/net/wireless/ath9k/hw.c
+ defsnc 'const[ ]unsigned[ ]char[ ]INIT_2\[127\][ ]=' drivers/video/omap/lcd_sx1.c
+
+ # removed in 2.6.24
+ accept "[ ]Psize[ ][ ][ ][ ]Ipps[ ][ ][ ][ ][ ][ ][ ]Tput[ ][ ][ ][ ][ ]Rxint[ ][ ][ ][ ][ ]Txint[ ][ ][ ][ ]Done[ ][ ][ ][ ][ ]Ndone[\\n][ ]---------------------------------------------------------------\\([\\n][ 0-9]\\+\\)\\+"'$'
+ initnc 'static[ ]u_short[ ]ataplain_map\[NR_KEYS\][ ]__initdata[ ]='
+ initnc '[ ]static[ ]const[ ]unsigned[ ]char[ ]invert5\[\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]alpa2target\[\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]target2alpa\[\][ ]='
+ oprepline '#define[ ]INIT_THREAD[ ][{0},]\+[ ]*\\[\n][ ]*[{0},]\+'
+ initnc 'static[ ]uint[ ]tas300\(1c\|4\)_\(master\|mixer\|treble\|bass\)_tab\[\]='
+ initnc 'static[ ]short[ ]dmasound_[au]law2dma16\[\][ ]='
+ initnc 'static[ ]const[ ]unsigned[ ]short[ ]DACVolTable\[101\][ ]='
+
+ # removed in 2.6.23
+ initnc 'static[ ]const[ ]UQItype[ ]__clz_tab\[\][ ]=' arch/arm26/lib/udivdi3.c
+ initnc '[ ]static[ ]unsigned[ ]char[ ]scale\[101\][ ]=' sound/oss/opl3sa2.c
+ initnc '[}][ ]syncs\[\][ ]=' drivers/scsi/53c7xx.c
+ initnc 'genoa_md:'"$sepx$blobpat*"'[\n][ ]\.ascii[ ]["]Genoa["]' arch/i386/boot/video.S
+
+ # removed in 2.6.22
+ initnc 'Vendor[ ]ID[ ][ ]Product[ ]ID[\n]-\+[ ][ ]-\+[\n]'"$blobpat*" Documentation/video4linux/sn9c102.txt
+ defsnc 'static[ ]short[ ][au]law2dma16\[\]' arch/ppc/8xx_io/cs4218_tdm.c
+ defsnc '[ ]static[ ]const[ ]char[ ]minimal_ascii_table\[\]' drivers/ieee1394/csr1212.c
+ defsnc 'static[ ]u16[ ]key_map[ ]\[256\][ ]=' drivers/media/dvb/ttpci/av7110_ir.c
+ defsnc 'static[ ]unsigned[ ]char[ ]gf64_inv\[64\][ ]=' drivers/mtd/nand/cafe_ecc.c
+ defsnc 'static[ ]unsigned[ ]short[ ]err_pos_lut\[4096\][ ]=' drivers/mtd/nand/cafe_ecc.c
+ defsnc 'static[ ]unsigned[ ]char[ ]testdata\[TESTDATA_LEN\][ ]=' fs/jffs2/comprtest.c
+
+ # added in 2.6.25
+ accept "%canned_values[ ]=[ ][(][\\n][ ]\\([0-9]\\+[ ]=>[ ]\\[[ \\n]\\+\\(\\([0-9]\\+\\|\\'0x[0-9a-f]\\+\\'\\),[ \\n]*\\)*\\]\\(,[ ]\\|[\\n]\\)\\)*[)][;]"
+
+ # from 2.6.25-rc* patches
+ initnc '[ ]int[ ]bcomm_irq\[3[*]16\][ ]='
+ initnc '[ ]static[ ]const[ ]int8[ ]countLeadingZerosHigh\[\][ ]='
+ initnc 'static[ ]struct[ ]nic_qp_map[ ]nic_qp_mapping_[01]\[\][ ]='
+ initnc 'static[ ]struct[ ]regval[ ]ov_initvals\[\][ ]='
+ initnc 'static[ ]struct[ ]regval[ ]stk1125_initvals\[\][ ]='
+ initnc 'static[ ]u8[ ]bnx2x_stats_len_arr\[BNX2X_NUM_STATS\][ ]='
+ defsnc 'static[ ]const[ ]struct[ ]arb_line[ ]read_arb_data\[NUM_RD_Q\]\[MAX_RD_ORD[ ][+][ ]1\][ ]=' drivers/net/bnx2x/bnx2x_init_opts.h
+ defsnc 'static[ ]const[ ]struct[ ]arb_line[ ]write_arb_data\[NUM_WR_Q\]\[MAX_WR_ORD[ ][+][ ]1\][ ]=' drivers/net/bnx2x/bnx2x_init_opts.h
+ initnc '[ ][ ][}][ ]blinkrates\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]ath5k_ini[ ]ar5212_ini\[\][ ]='
+ defsnc 'static[ ]const[ ]struct[ ]ath5k_ini_mode[ ]rf5413_ini_mode_end\[\][ ]=' drivers/net/wireless/ath/ath5k/initvals.c
+ defsnc 'static[ ]const[ ]struct[ ]ath5k_ini_rf[ ]rfregs_5111\[\][ ]=' drivers/net/wireless/ath/ath5k/rfbuffer.h
+ defsnc 'static[ ]const[ ]struct[ ]ath5k_ini_rf[ ]rfregs_5112\[\][ ]=' drivers/net/wireless/ath/ath5k/rfbuffer.h
+ defsnc 'static[ ]const[ ]struct[ ]ath5k_ini_rf[ ]rfregs_5112a\[\][ ]=' drivers/net/wireless/ath/ath5k/rfbuffer.h
+ defsnc 'static[ ]const[ ]struct[ ]ath5k_ini_rf[ ]rfregs_5413\[\][ ]=' drivers/net/wireless/ath/ath5k/rfbuffer.h
+ defsnc '\(static[ ]\)\?const[ ]u\(8\|16\|32\)[ ]b43_ntab_\(\(adjustpower\|estimatepowerlt\|gainctl\|iqlt\|loftlt\|noisevar1\|tdi[24]0a\)[01]\|channelest\|frame\(lookup\|struct\)\|mcs\|pilot\|tdtrn\|tmap\)\[\][ ]=' drivers/net/wireless/b43/tables_nphy.c
+
+ # new in 2.6.26
+ initnc 'static[ ]u64[ ]vec2off\[68\][ ]=' arch/ia64/kvm/process.c
+ initnc "[ ][ ][ ]interrupts[ ]=[ ]<\\(0x\\)\\?3[ ]\\(0x\\)\\?0[ ]\\(0x\\)\\?0[ ][ ]$blobpat*>[;]" 'arch/powerpc/boot/dts/\(cm5200\|lite5200b\?\|kuroboxHG\|pcm030\|tqm5200\).dts'
+ initnc 'static[ ]const[ ]u32[ ]crctab32\[\][ ]=' arch/x86/boot/tools/build.c
+ defsnc 'static[ ]struct[ ]mse2snr_tab[ ]\(vsb\|qam\(64\|256\)\)_mse2snr_tab\[\][ ]=' drivers/media/dvb/frontends/au8522.c
+ defsnc '[}][ ]\(VSB\|QAM\(64\|256\)\?\)_mod_tab\[\][ ]=' 'drivers/media/dvb/frontends/au8522\(_dig\)\?\.c'
+ initnc '[}][ ]itd1000_\(lpf_pga\|fre_values\)\[\][ ]=' drivers/media/dvb/frontends/itd1000.c
+ initnc '[}][ ]\(vsb\|qam\(64\|256\)\)_snr_tab\[\][ ]=' drivers/media/dvb/frontends/s5h1411.c
+ initnc '[}][ ]snr_tab\[\][ ]=' drivers/media/dvb/frontends/tda10048.c
+ initnc 'static[ ]u32[ ]reg_init_initialize\[\][ ]=' drivers/media/video/saa717x.c
+ initnc 'static[ ]const[ ]u32[ ]\(main\|gear\)_seedset\[BACKOFF_SEEDSET_ROWS\]\[BACKOFF_SEEDSET_LFSRS\][ ]=' drivers/net/forcedeth.c
+ initnc 'static[ ]const[ ]struct[ ]ath5k_ini_mode[ ]rf24\(13\|25\)_ini_mode_end\[\][ ]=' drivers/net/wireless/ath5k/initvals.c
+ initnc 'static[ ]const[ ]u16[ ]wm9713_reg\[\][ ]=' sound/soc/codecs/wm9713.c
+
+ # new in 2.6.27
+ accept '[ ]\.section[ ]__ex_table,["]a["]'"$sepx$blobpat*" 'arch/x86/lib/copy_user_\(nocache_\)\?64.S'
+ accept 'desc_config1:[\n][ ]\.byte[ ]0x09,[ ]0x02'"$sepx$blobpat*" 'firmware/keyspan_pda/\(keyspan_pda\|xircom_pgs\).S'
+ accept 'string_mfg:[\n]\?\([;]\?[ ]\.byte[^\n]*[\n]\)\+string_mfg_end:' 'firmware/keyspan_pda/\(keyspan_pda\|xircom_pgs\).S'
+ accept 'string_product:[\n]\?\([;]\?[ ]\.byte[^\n]*[\n]\)\+string_product_end:' 'firmware/keyspan_pda/\(keyspan_pda\|xircom_pgs\).S'
+ accept ':03000000020200F9[\n]:040023000205\(9B0037\|5F0073\)[\n]\(:050030000000000000CB[\n]\|:0400430002010000B6[\n]\)*'"$sepx$blobpat*"'[\n]:\(0E06E0006400670065007400060334003700F4\|0606A000060334003700E0\)[\n]:00000001FF' 'firmware/keyspan_pda/\(keyspan_pda\|xircom_pgs\).HEX'
+ accept ':100000000C004000000000000000000000000000A4[\n]'"$sepx$blobpat*"'[\n][/][*][ ]DSP56001[ ]bootstrap[ ]code[ ][*][/]' firmware/dsp56k/bootstrap.bin.ihex
+ initnc 'static[ ]const[ ]u16[ ]uda1380_reg\[UDA1380_CACHEREGNUM\][ ]=' sound/soc/codecs/uda1380.c
+ initnc 'static[ ]const[ ]u16[ ]wm8510_reg\[WM8510_CACHEREGNUM\][ ]=' sound/soc/codecs/wm8510.c
+ initnc 'static[ ]const[ ]unsigned[ ]short[ ]atkbd_unxlate_table\[128\][ ]=' drivers/input/keyboard/atkbd.c
+ initnc 'static[ ]const[ ]unsigned[ ]char[ ]usb_kbd_keycode\[256\][ ]=' drivers/hid/usbhid/usbkbd.c
+ initnc '[ ][ ]u8[ ]buf,[ ]bufs\[\][ ]=' drivers/media/dvb/dvb-usb/cxusb.c
+ initnc 'static[ ]struct[ ]dvb_pll_desc[ ][^\n]*[ ]=' drivers/media/dvb/frontends/dvb-pll.c
+ initnc '[ ]static[ ]int[ ]sysdiv_to_div_x_2\[\][ ]=' arch/powerpc/platforms/512x/clock.c
+ defsnc 'static[ ]const[ ]__u8[ ]cx_inits_\(176\|320\|352\|640\)\[\][ ]=' drivers/media/video/gspca/conex.c
+ defsnc 'static[ ]const[ ]__u8[ ]cx_jpeg_init\[\]\[8\][ ]=' drivers/media/video/gspca/conex.c
+ defsnc 'static[ ]const[ ]__u8[ ]cxjpeg_\(640\|352\|320\|176\|qtable\)\[\]\[8\][ ]=' drivers/media/video/gspca/conex.c
+ defsnc 'static[ ]const[ ]unsigned[ ]char[ ]quant\[\]\[0x88\][ ]=' drivers/media/video/gspca/jpeg.h
+ defsnc 'static[ ]unsigned[ ]char[ ]huffman\[\][ ]=' drivers/media/video/gspca/jpeg.h
+ initc '[ ]\?static[ ]const[ ]struct[ ]ov_i2c_regvals[ ]norm_76[1247]0\[\][ ]=' drivers/media/video/gspca/ov519.c
+ initnc 'static[ ]const[ ]__u8[ ]pac207_sensor_init\[\]\[8\][ ]=' drivers/media/video/gspca/pac207.c
+ initnc 'static[ ]const[ ]__u8[ ]pac7311_jpeg_header\[\][ ]=' drivers/media/video/gspca/pac7311.c
+ defsnc 'static[ ]const[ ]__u8[ ]\(start\|page[34]\)_73\(02\|11\)\[\][ ]=' 'drivers/media/video/gspca/pac73\(02\|11\)\.c'
+ initnc 'static[ ]const[ ]__u8[ ]init\(Hv7131\|Ov\(6650\|7630\(_3\)\?\)\|Pas\(106\|202\)\|Tas51[13]0\)\[\][ ]=' drivers/media/video/gspca/sonixb.c
+ initnc 'static[ ]const[ ]__u8[ ]\(hv7131\|ov\(6650\|7630\(_3\)\?\)\|pas\(106\|202\)\|tas51[13]0\)_sensor_init\(_com\)\?\[\]\[8\][ ]=' drivers/media/video/gspca/sonixb.c
+ defsnc 'static[ ]\(const[ ]\)\?\(__\)\?u8[ ]\(mt9v111\|sp80708\|hv7131[rd]\|mi0360b\?\|mo4000\|ov76\([36]0\|48\)\|om6802\|po1030\)_sensor_\(init\|param1\)\[\]\[8\][ ]=' drivers/media/video/gspca/sonixj.c
+ initnc 'static[ ]const[ ]__u8[ ]qtable4\[\][ ]=' drivers/media/video/gspca/sonixj.c
+ initnc 'static[ ]const[ ]__u16[ ]\(spca500_visual\|Clicksmart510\)_defaults\[\]\[3\][ ]=' drivers/media/video/gspca/spca500.c
+ initnc 'static[ ]const[ ]__u8[ ]qtable_\(creative_pccam\|kodak_ez200\|pocketdv\)\[2\]\[64\][ ]=' drivers/media/video/gspca/spca500.c
+ initnc 'static[ ]const[ ]__u16[ ]spca501c\?_\(\(3com\|arowana\|mysterious\)_\)\?\(init\|open\)_data\[\]\[3\][ ]=' drivers/media/video/gspca/spca501.c
+ defsnc 'static[ ]const[ ]\(__u16\|u8\)[ ]spca505b\?_\(init\|open\)_data\(_ccd\)\?\[\]\[3\][ ]=' drivers/media/video/gspca/spca505.c
+ defsnc 'static[ ]const[ ]\(__\)\?u16[ ]spca508\(cs110\|_sightcam2\?\|_vista\)\?_init_data\[\]\[[23]\][ ]=' drivers/media/video/gspca/spca508.c
+ initnc 'static[ ]const[ ]__u16[ ]\(spca561\|rev72a\)_init_data3\?\[\]\[2\][ ]=' drivers/media/video/gspca/spca561.c
+ defsnc 'static[ ]const[ ]\(__u16\|struct[ ]cmd\)[ ]spca504\(_pccam600\|A_clicksmart420\)_\(init\|open\)_data\[\]\(\[3\]\)\?[ ]=' drivers/media/video/gspca/sunplus.c
+ defsnc 'static[ ]const[ ]\(__\)\?u8[ ]qtable_\(creative_pccam\|spca504_default\)\[2\]\[64\][ ]=' drivers/media/video/gspca/sunplus.c
+ initnc 'static[ ]const[ ]__u8[ ]\(effects\|gamma\)_table\[\(MAX_[A-Z]*\|[A-Z]*_MAX\)\]\[[0-9]*\][ ]=' drivers/media/video/gspca/t631.c
+ initnc 'static[ ]const[ ]\(__\)\?u8[ ]tas5130a_sensor_init\[\]\[8\][ ]=' drivers/media/video/gspca/t613.c
+ defsnc 'static[ ]const[ ]struct[ ]usb_action[ ]\(cs2102\|hdcs2020xx\|icm105a\(xx\)\?\|ov7630c\|mt9v111_[13]\|pb0330\([3x]x\)\?\|mi0360soc\)_Initial\(Scale\)\?\[\][ ]=' drivers/media/video/gspca/zc3xx.c
+ initnc 'static[ ]const[ ]u8[ ]rtl8225z2_\(agc\|ofdm\|power_cck\(_ch14\)\?\)\[\][ ]=' drivers/net/wireless/rtl8187_rtl8225.c
+ initnc 'static[ ]const[ ]__u16[ ]t10_dif_crc_table\[256\][ ]=' lib/crc-t10dif.c
+ initnc 'static[ ]crb_128M_2M_block_map_t[ ]crb_128M_2M_map\[64\][ ]=' drivers/net/netxen/netxen_hw.c
+ initnc 'static[ ]const[ ]__u16[ ]crc10_table\[256\][ ]=' drivers/usb/serial/safe_serial.c
+ accept '[ ]*\([ ]*0\)*\([ ]*1\)*[\n][ ]*0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]0[ ]1[ ]*2[ ]3[ ]4[ ]5[ ]6[ ]7' Documentation/bt8xxgpio.txt
+ initnc '[ ]static[ ]int[ ]exp_lut\[256\][ ]=' drivers/isdn/mISDN/dsp_audio.c
+ initnc 'static[ ]const[ ]u32[ ]bf_pbox\[16[ ][+][ ]2\][ ]=' drivers/isdn/mISDN/dsp_blowfish.c
+ initnc 'static[ ]const[ ]u32[ ]bf_sbox\[256[ ][*][ ]4\][ ]=' drivers/isdn/mISDN/dsp_blowfish.c
+ initnc 'static[ ]u8[ ]sample_\(german_\(all\|old\)\|american_\(dialtone\|ringing\|busy\)\|special[123]\|silence\)\[\][ ]=' drivers/isdn/mISDN/dsp_tones.c
+ initnc 'struct[ ]pattern[ ][{][^}]*int[ ]tone[;][^}]*[}][ ]pattern\[\][ ]=' drivers/isdn/mISDN/dsp_tones.c
+ initnc 'static[ ]u8[ ]\([au]\|_4\)law_to_\([ua]law\|4bit\)\[256\][ ]=' drivers/isdn/mISDN/l1oip_codec.c
+ initnc 'static[ ]unsigned[ ]char[ ]banner_table\[\][ ]=' arch/sh/boards/mach-microdev/led.c
+ defsnc '[ ]static[ ]const[ ]int[ ]desc_idx_table\[\][ ]=' arch/arm/include/asm/hardware/iop3xx-adma.h
+ defsnc 'static[ ]\(const[ ]\)\?u32[ ]ar\(5416\|9280\)\(Modes\(_fast_clock\)\?\|Common\|BB_RfGain\|Bank6\(TPC\)\?\|Addac\)\(_91[06]0\(_\?1_1\)\?\|_9280\(_2\)\?\)\?\[\]\[[236]\][ ]=' 'drivers/net/wireless/ath9k/\(ar\(5008\|9001\)_\)\?initvals\.h'
+
+ # new in 2.6.28
+ accept '\(static[ ]\)\?const[ ]char[ ]\(inv\)\?parity\[256\][ ]=[ ][{][ \n01,]*[}][;]' 'Documentation/mtd/nand_ecc\.txt\|drivers/mtd/nand/nand_ecc\.c'
+ defsnc 'static[ ]const[ ]char[ ]\(bitsperbyte\|addressbits\)\[256\][ ]=' drivers/mtd/nand/nand_ecc.c
+ defsnc 'static[ ]struct[ ]pinmux_cfg_reg[ ]pinmux_config_regs\[\][ ]=' 'arch/sh/kernel/cpu/sh2a/pinmux-sh7203\.c\|arch/arm/mach-shmobile/pfc-sh73[67]7\.c'
+ defsnc '[ ]static[ ]const[ ]u8[ ]e_keymap\[\][ ]=' drivers/hid/hid-lg.c
+ defsnc 'DEFINE_DEFAULT_PDR[(]0x0161,[ ]256,' drivers/net/wireless/hermes_dld.c
+ defsnc 'static[ ]const[ ]int[ ]isink_cur\[\][ ]=' drivers/regulator/wm8350-regulator.c
+ defsnc 'static[ ]const[ ]s16[ ]\(converge_speed_ipb\?\|LAMBDA_table\[4\]\)\[101\][ ]=' drivers/staging/go7007/go7007-fw.c
+ defsnc 'static[ ]const[ ]u32[ ]addrinctab\[33\]\[2\][ ]=' drivers/staging/go7007/go7007-fw.c
+ defsnc 'static[ ]const[ ]u8[ ]\(default_intra_quant_table\|\(val\|bits\)_[ad]c_\(lu\|chro\)minance\)\[\][ ]=' drivers/staging/go7007/go7007-fw.c
+ defsnc 'static[ ]const[ ]int[ ]zz\[64\][ ]=' drivers/staging/go7007/go7007-fw.c
+ defsnc '[ ]u16[ ]pack\[\][ ]=' drivers/staging/go7007/go7007-fw.c
+ defsnc 'static[ ]u8[ ]\(initial\|channel\)_registers\[\][ ]=' 'drivers/staging/go7007/wis-\(ov7640\|saa7113\|tw2804\).c'
+ defsnc 'u16[ ]MTO_One_Exchange_Time_Tbl_[ls]\[MTO_MAX_FRAG_TH_LEVELS\]\[MTO_MAX_DATA_RATE_LEVELS\][ ]=' drivers/staging/winbond/mto.c
+ defsnc 'u32[ ]\(al2230_txvga_data\|w89rf242_txvga_old_mapping\)\[\]\[2\][ ]=' drivers/staging/winbond/reg.c
+ defsnc 'static[ ]const[ ]UINT16[ ]crc16tab\[256\][ ]=' drivers/staging/wlan-ng/hfa384x.c
+ defsnc 'static[ ]const[ ]\(UINT32\|u32\)[ ]wep_crc32_table\[256\][ ]=' drivers/staging/wlan-ng/p80211wep.c
+ defsnc 'static[ ]const[ ]unsigned[ ]char[ ]wm_vol\[256\][ ]=' 'sound/pci/ice1712/\(phase\|aureon\)\.c'
+ defsnc 'static[ ]const[ ]u16[ ]wm8900_reg_defaults\[WM8900_MAXREG\][ ]=' sound/soc/wm8900.c
+ defsnc '[}][ ]\(clk_sys_ratios\|bclk_divs\)\[\][ ]=' 'sound/soc/wm890[34]\.c'
+ defsnc 'static[ ]u8[ ]af9015_ir_table_\(leadtek\|twinhan\|a_link\|msi\|mygictv\|kworld\)\[\][ ]=' drivers/media/dvb/dvb-usb/af9015.h
+ defsnc 'static[ ]struct[ ]snr_table[ ]\(qpsk\|qam\(16\|64\)\)_snr_table\[\][ ]=' drivers/media/dvb/frontends/af9013_priv.h
+ defsnc 'static[ ]struct[ ]regdesc[ ]\(ofsm_init\|tuner_init_\(env77h11d5\|mt2060\(_2\)\?\|mxl500\(3d\|5\)\|qt1010\|mc44s803\|unknown\|tda18271\)\)\[\][ ]=' drivers/media/dvb/frontends/af9013_priv.h
+ defsnc 'static[ ]u8[ ]stv0288_earda_inittab\[\][ ]=' drivers/media/dvb/frontends/eds1547.h
+ defsnc 'static[ ]u8[ ]serit_sp1511lhb_inittab\[\][ ]=' drivers/media/dvb/frontends/si21xx.c
+ defsnc 'static[ ]u8[ ]stv0288_inittab\[\][ ]=' drivers/media/dvb/frontends/stv0288.c
+ defsnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_b\[\][ ]=' drivers/net/wireless/rt2x00/rt2400pci.c
+
+ # request_firmware matches for 2.6.28
+ accept 'D:[ ]Firmware[ ]loader[ ][(]request_firmware[)]' CREDITS
+ accept 'FIRMWARE[ ]LOADER[ ][(]request_firmware[)]' MAINTAINERS
+ accept '[ ]-[ ]request_firmware[(][)][ ]hotplug[ ]interface[ ]info.' Documentation/00-INDEX
+ accept 'This[ ]driver[ ]requires[ ]a[ ]patch[ ]for[ ]firmware_class[^\n]*[\n]request_firmware_nowait[ ]function\.' Documentation/dell_rbu.txt
+ accept '\([ ]request_firmware[(][)][ ]hotplug[ ]interface:[\n][ ]--*[\n].*[ ]\)\?-[ ]request_firmware_nowait[(][)][ ]is[ ]also[ ]provided[ ]for[ ]convenience' Documentation/firmware_class/README
+ accept 'Still,[ ]there[ ]are[ ]kernel[ ]threads[ ]that[ ]may[ ]want.*For[ ]example,[ ]if[ ]request_.*_firmware[(][)][ ]will[ ]fail[ ]regardless' Documentation/power/freezing-of-tasks.txt
+ accept 'Also,[ ]there[ ]may[ ]be[ ]some[ ]operations,.*calling[ ]request_firmware[(][)][ ]from[ ]their[ ].resume[(][)][ ]routines' Documentation/power/notifiers.txt
+ accept 'There[ ]is[ ]an[ ]USB[ ]interface[ ]for[ ]downloading[/]uploading.*request_firmware[ ]interface\.' Documentation/video4linux/si470x.txt
+ accept '[ ]-[ ]move[ ]firmware[ ]loading[ ]to[ ]request_firmware[(][)]' drivers/staging/slicoss/README
+ accept 'config[ ]FIRMWARE_IN_KERNEL.*let[ ]firmware[ ]be[ ]loaded[ ]from[ ]userspace\.' drivers/base/Kconfig
+ accept '[ ]*and[ ]request_firmware[(][)][ ]in[ ]the[ ]source' drivers/base/Kconfig
+ accept '\(static[ ]int[\n ]\)\?_request_firmware[(]const[ ]struct[ ]firmware[ ][*][*]firmware_p,[^{]*[\n][{]\([\n]\+[^\n}][^\n]*\)*[^\n]*[\n]\+[}][\n]' drivers/base/firmware_class.c
+ accept 'static[ ]int[\n ]request_firmware_work_func[(]void[ ][*]arg[)][\n][{]\([\n]\+[^\n}][^\n]*\)*ret[ ]=[ ]_request_firmware[(][^\n]*\([\n]\+[^\n}][^\n]*\)*[\n]\+[}][\n]' drivers/base/firmware_class.c
+ accept '[/][*][*][\n][ ][*][ ]request_firmware:[ ]-[ ]send[ ]firmware[ ][^{]*[\n][{]\([\n]\+[^\n}][^\n]*\)*[^\n]*[\n]\+[}][\n]' drivers/base/firmware_class.c
+ accept '[/][*][*][\n][ ][*][ ]request_firmware_nowait\(:\|[ ]-\)[ ]asynchronous[ ]version[^{]*[\n][{]\([\n]\+[^\n}][^\n]*\)*[^\n]*[\n]\+[}][\n]' drivers/base/firmware_class.c
+ accept 'EXPORT_SYMBOL[(]request_firmware\(_nowait\)\?[)][;]' drivers/base/firmware_class.c
+ accept 'int[ ]request_firmware\(_nowait\)\?[(][^;]*[)][;]' include/linux/firmware.h
+ accept 'static[ ]inline[ ]int[ ]request_firmware\(_nowait\)\?[(][^{]*[)][\n][{][\n][ ]return[ ]-EINVAL[;][\n][}]' include/linux/firmware.h
+ accept 'static[ ]inline[ ]int[\n]\(maybe_\)\?reject_firmware\(_nowait\)\?[(][^{;]*[)][\n][{]\([\n]\+[^\n}][^\n]*\)*[^\n]*[\n]\+[}]' include/linux/firmware.h
+
+ accept 'static[ ]inline[ ]int[ ]request_ihex_firmware\?[(][^{]*[)][\n][{]\([\n]\+[^\n}][^\n]*\)*[^\n]*[\n]\+[}][\n]' include/linux/ihex.h
+ ocomment '[/][*][ ]Optional[ ]firmware\([^\n]*[\n][ ][*]\)*[^\n]*[ ]MODULE_FIRMWARE[(][)]'
+ oprepline '#define[ ]MODULE_FIRMWARE[(]_firmware[)]' include/linux/module.h
+ accept '[ ][*][ ]Sample[ ]code[ ]on[ ]how[ ]to[ ]use[ ]request_firmware[(][)][ ]from[ ]drivers\.' samples/firmware_class/firmware_sample_driver.c
+ accept '[ ]\(retval\|error\)[ ]=[ ]request_firmware\(_nowait\)\?[(][^;]*["]sample_driver_fw["],[^;]*[)][;]' samples/firmware_class/firmware_sample_driver.c
+ ocomment '[ ][/][*][ ]request_firmware[ ]blocks[ ]until[ ]userspace[ ]finished' samples/firmware_class/firmware_sample_driver.c
+ accept '[ ][ ][ ]*["][ ]request_firmware_nowait[ ]failed' samples/firmware_class/firmware_sample_driver.c
+
+ # We used to remove these in early versions of Linux-libre.
+ # They're now believed to be mere initialization data, rather than
+ # code disguised as such, and they're not long enough so as to
+ # render the software non-Free.
+ defsnc 'static[ ]u8[ ]tda10021_inittab\[0x40\]=' drivers/media/dvb/frontends/tda10021.c
+ defsnc 'static[ ]u8[ ]tda8083_init_tab[ ]\[\][ ]=' drivers/media/dvb/frontends/tda8083.c
+ defsnc 'static[ ]u8[ ]ves1820_inittab\[\][ ]=' drivers/media/dvb/frontends/ves1820.c
+ defsnc 'static[ ]u8[ ]init_1[89]93_w\?tab[ ]\?\[\][ ]=' drivers/media/dvb/frontends/ves1x93.c
+ defsnc 'static[ ]const[ ]u8[ ]saa7113_tab\[\][ ]=' drivers/media/dvb/ttpci/budget-av.c
+ defsnc 'static[ ]u8[ ]philips_sd1878_inittab\[\][ ]=' drivers/media/dvb/ttpci/budget-av.c
+ defsnc 'const[ ]struct[ ]Kiara_table_entry[ ]Kiara_table\[PSZ_MAX\]\[6\]\[4\][ ]=' drivers/media/video/pwc/pwc-kiara.c
+ defsnc 'const[ ]unsigned[ ]int[ ]KiaraRomTable[ ]\[8\]\[2\]\[16\]\[8\][ ]=' drivers/media/video/pwc/pwc-kiara.c
+ defsnc 'const[ ]struct[ ]Timon_table_entry[ ]Timon_table\[PSZ_MAX\]\[PWC_FPS_MAX_TIMON\]\[4\][ ]=' drivers/media/video/pwc/pwc-timon.c
+ defsnc 'const[ ]unsigned[ ]int[ ]TimonRomTable[ ]\[16\]\[2\]\[16\]\[8\][ ]=' drivers/media/video/pwc/pwc-timon.c
+ defsnc '[ ]static[ ]const[ ]struct[ ]struct_initData[ ]initData\[\][ ]=' drivers/media/video/usbvideo/ibmcam.c
+ defsnc 'static[ ]const[ ]u8[ ]rtl8187b_reg_table\[\]\[3\][ ]=' drivers/net/wireless/rtl8187_dev.c
+ defsnc 'unsigned[ ]char[ ]\(IDX_ACTIVATE_\(READ\|WRITE\)\|\(CM\|ULP\)_\(ENABLE\|SETUP\)\|DM_ACT\|IPA_PDU_HEADER\|\(READ\|WRITE\)_CCW\)\[\][ ]=' drivers/net/qeth_core_mpc.c
+ defsnc 'static[ ]unsigned[ ]char[ ]camera_ncm03j_magic\[\][ ]=' 'arch/sh/boards/\(board-ap325rxa\.c\|mach-ap325rxa/setup\.c\)'
+ defsnc 'static[ ]const[ ]unsigned[ ]short[ ]\(sync\|magic[0-3]\)_data\[\][ ]=' arch/sh/boards/mach-migor/lcd_qvga.c
+ defsnc 'static[ ]unsigned[ ]char[ ]camera_ov772x_magic\[\][ ]=' arch/sh/boards/mach-migor/setup.c
+ defsnc 'static[ ]struct[ ]chips_init_reg[ ]chips_init_[sgacfx]r\[\][ ]=' 'drivers/video/\(asiliant\|chips\)fb.c'
+
+ # This one is quite suspicious, but it's small enough (64 bytes
+ # total) that it's believable that it could be actual source code.
+ defsnc 'static[ ]const[ ]__u8[ ]cx11646_fw1\[\]\[3\][ ]=' drivers/media/video/gspca/conex.c
+
+ # Hunting down non-Free firmware-loading code and instructions.
+ # Firmware names are to be caught anywhere.
+
+ # 2.6.26 but not later
+
+ blobname 'atmsar1[12]\.\(x\|start\|regions\|data\|bin[12]\?\)' 'drivers/atm/\(Makefile\|ambassador\.c\)'
+ blob '#\(define\|include\)[ ]UCODE2\?[(][^\n]*' drivers/atm/ambassador.c
+ blob 'static[ ]\(u32\|region\)[ ]__devinitdata[ ]ucode_\(start\|\(regions\|data\)\[\]\)[ ]=[^;]*[;]' drivers/atm/ambassador.c
+ blob '\(#\(ifdef[ ]AMB_NEW_MICROCODE\|else\|endif\)[\n]#\(define\|include\)[ ]UCODE2\?[(][^\n]*[\n]\)\+\([\n]*static[ ]\(u32\|region\)[ ]__devinitdata[ ]ucode_\(start\|\(regions\|data\)\[\]\)[ ]=[^;]*[;]\)*' drivers/atm/ambassador.c
+
+ blobname '\(pca\|sba\)200e\(_ecd\)\?\.\(data\|bin[12]\?\)' 'drivers/atm/\(Makefile\|fore200e\(_mkfirm\)\?\.c\)'
+ blobna '[/][*][^*]*\([*]\+[^/*][^*]*\)*[*]*PCA-200E[ ]firmware[ ][*][/]' drivers/atm/fore200e_mkfirm.c
+ blobna '_fore200e_\(pca\|sba\)_fw_\(data\|size\)' drivers/atm/fore200e.c
+ blob '#ifdef[ ]CONFIG_ATM_FORE200E_\(PCA\|SBA\)\([\n]extern[ ]const[ ]unsigned[ ]\(char\|int\)[ ]*_fore200e_\(pca\|sba\)_fw_\(data\[\]\|size\)[;]\)\+[\n]#endif\([\n]\+#ifdef[ ]CONFIG_ATM_FORE200E_\(PCA\|SBA\)\([\n]extern[ ]const[ ]unsigned[ ]\(char\|int\)[ ]*_fore200e_\(pca\|sba\)_fw_\(data\[\]\|size\)[;]\)\+[\n]#endif\)*' drivers/atm/fore200e.c
+
+ # 2.6.27 but not later
+
+ blob 'cas_saturn_patch_t[ ]cas_saturn_patch\[\][ ]=[ ][{][^;]*[}][;]' drivers/net/cassini.h
+ accept '[ ][ ][ ]firmware[ ]files[ ]--[ ]the[ ]same[ ]names[ ]which[ ]appear[ ]in[ ]MODULE_FIRMWARE[(][)]' drivers/base/Kconfig
+
+ # 2.6.28 or earlier
+
+ blobname 'atmsar11\.fw' drivers/atm/ambassador.c
+
+ blob '\(#ifdef[ ]__\(LITTLE\|BIG\)_ENDIAN[\n]\)\?#define[ ]FW_EXT[ ]["]\(_ecd\)\?\.bin2\?["]\([\n]#else[\n]#define[ ]FW_EXT[ ]["]\(_ecd\)\?\.bin2\?["]\)*\([\n]#endif\)\?' drivers/atm/fore200e.c
+ blobna 'sprintf[(][^;]*fore200[^;]*FW_EXT[^;]*[)][;]' drivers/atm/fore200e.c
+ blobname '\(pc\|sb\)a200e\(_ecd\)\?\.bin[12]\?' drivers/atm/fore200e.c
+ blobna 'The[ ]supplied[ ]firmware[ ]images.*http:[/][/][^\n]*\(fore\|FORE_Systems\).*Rebuild[ ]and[ ]re-install[^.]*\.' Documentation/networking/fore200e.txt
+
+ blobname 'intelliport2\.bin' drivers/char/ip2/ip2main.c
+
+ blob 'static[ ]unsigned[ ]char[ ]warp_g[24]00_t2\?gzs\?a\?f\?\[\][ ]=[ ][{][^{};]*[}][;]\([\n][\n]*static[ ]unsigned[ ]char[ ]warp_g[24]00_t2\?gzs\?a\?f\?\[\][ ]=[ ][{][^{};]*[}][;]\)*' drivers/gpu/drm/mga/mga_ucode.h
+ blob '\(#define[ ]WARP_UCODE_\(SIZE\|INSTALL\)[(][ ]*which\([^\n]*\\[ ]*[\n]\)*[^\n]*\|static[ ]const[ ]unsigned[ ]int[ ]mga_warp_g[24]00_microcode_size[ ]=[^;]*[;]\|static[ ]int[ ]mga_warp_install_g[24]00_microcode[(][^{]*[)][\n][{]\([\n]\+[^\n}][^\n]*\)*[^\n]*[\n]\+[}]\)\([\n][\n]*\(#define[ ]WARP_UCODE_\(SIZE\|INSTALL\)[(][ ]*which\([^\n]*\\[ ]*[\n]\)*[^\n]*\|static[ ]const[ ]unsigned[ ]int[ ]mga_warp_g[24]00_microcode_size[ ]=[^;]*[;]\|static[ ]int[ ]mga_warp_install_g[24]00_microcode[(][^{]*[)][\n][{]\([\n]\+[^\n}][^\n]*\)*[^\n]*[\n]\+[}]\)\)*' drivers/gpu/drm/mga/mga_warp.c
+ blobna '\(case[ ]MGA_CARD_TYPE_G[^:]*:[ \n]*\)\+return[ ][^;]*mga_warp[^;]*microcode[^;]*[;]\([ \n]*\(case[ ]MGA_CARD_TYPE_G[^:]*:[ \n]*\)\+return[ ][^;]*mga_warp[^;]*microcode[^;]*[;][ ]*\)*' drivers/gpu/drm/mga/mga_warp.c
+
+ blob 'static[ ]u32[ ]r128_cce_microcode\[\][ ]=[ ][{][^;]*[}][;]' drivers/gpu/drm/r128/r128_cce.c
+ blob 'static[ ]void[ ]r128_cce_load_microcode[(][^{]*[)][\n][{]\([\n]\+[^\n}][^\n]*\)*[^\n]*[\n]\+[}]' drivers/gpu/drm/r128/r128_cce.c
+ # blobna 'R128_WRITE[(]R128_PM4_MICROCODE_DATA[HL],[\n ]*r128_cce_microcode\[i[ ][*][ ]2\([ ][+][ ]1\)\?\][)]\([;][\n ]*R128_WRITE[(]R128_PM4_MICROCODE_DATA[HL],[\n ]*r128_cce_microcode\[i[ ][*][ ]2\([ ][+][ ]1\)\?\][)]\)*' drivers/gpu/drm/r128/r128_cce.c
+
+ blob 'static[ ]const[ ]u32[ ]R[SV0-9]*[05]_\(c\|pf\)p_microcode\[\]\(\[[23]\]\)\?[ ]=[ ][{][^;]*[}][;]\([\n][\n]*static[ ]const[ ]u32[ ]R[SV0-9]*[05]_\(c\|pf\)p_microcode\[\]\(\[[23]\]\)\?[ ]=[ ][{][^;]*[}][;]\)*' 'drivers/gpu/drm/radeon/\(radeon\|r600\)_microcode\.h'
+ blob 'static[ ]void[ ]r\(adeon\|[167]00\)_cp_load_microcode[(][^{]*[)][\n][{]\([\n]\+[^\n}][^\n]*\)*cp_microcode[^\n]*\([\n]\+[^\n}][^\n]*\)*[\n]\+[}]' 'drivers/gpu/drm/radeon/r\(\(adeon\|600\)_cp\|100\)\.c'
+ # blobna 'RADEON_WRITE[(]R\(ADEON\|600\)_CP_\(ME_RAM\|PFP_UCODE\)_DATA[HL]\?,[\n ]*R[SV0-9]*[05]_\(c\|pf\)p_microcode\[i\]\(\[[012]\]\)\?[)]\([;][\n ]*RADEON_WRITE[(]R\(ADEON\|600\)_CP_\(ME_RAM\|PFP_UCODE\)_DATA[HL]\?,[\n ]*R[SV0-9]*[05]_\(c\|pf\)p_microcode\[i\]\(\[[012]\]\)\?[)]\)*' 'drivers/gpu/drm/radeon/\(radeon\|r600\)_cp\.c'
+
+ blob 'sub[ ]\(sp887[0x]\|tda1004\(5\|6\(lifeview\)\?\)\|av7110\|dec\(2\(00\|54\)0t\|3000s\)\|opera1\|vp7041\|dibusb\|nxt200[24]\|cx\(23\(1xx\|885\)\|18\)\|pvrusb2\|or51\(211\|132_\(qam\|vsb\)\)\|bluebird\|mpc718\|af9015\|ngene\)[ ]*[{]\([\n]\+[^\n}][^\n]*\)*[\n]\+[}]\([\n]\+sub[ ]\(sp887[0x]\|tda1004\(5\|6\(lifeview\)\?\)\|av7110\|dec\(2\(00\|54\)0t\|3000s\)\|opera1\|vp7041\|dibusb\|nxt200[24]\|cx\(23\(1xx\|885\)\|18\)\|pvrusb2\|or51\(211\|132_\(qam\|vsb\)\)\|bluebird\|mpc718\|af9015\|ngene\)[ ]*[{]\([\n]\+[^\n}][^\n]*\)*[\n]\+[}]\)*' Documentation/dvb/get_dvb_firmware
+ blobna 'Please[ ]use[^\n]*firmware[^\n]*sp887x[^\n]*\([\n][^\n]\+\)\+' Documentation/dvb/avermedia.txt
+ blob 'To[ ]extract[ ]the[ ]firmware[^\n]*Opera[ ]DVB-S1[ ]USB-Box.*[/]lib[/]firmware[/][ ]\.' Documentation/dvb/opera-firmware.txt
+ blobname '\(dvb-usb-opera[^\n]*\.fw\|2830S[^\n]*2\.sys\)' Documentation/dvb/opera-firmware.txt
+ blob 'Getting[ ]the[ ]Firmware\([\n][^\n]\+\)*' Documentation/dvb/ttusb-dec.txt
+
+ blob '[/][*][\n ]*File[ ]automatically[ ]generated[ ]by[ ]createinit\.py[ ]using[ ]data[\n ]*extracted[ ]from[ ]AF05BDA\.sys.*[}][;]' drivers/media/dvb/dvb-usb/af9005-script.h
+ blob '#include[ ]["]af9005-script\.h["]' drivers/media/dvb/dvb-usb/af9005-fe.c
+ blobna '[\n][ ]scriptlen[ ]=[ ]sizeof[(]script[)][^;]*[;][\n][ ]for[^{]*scriptlen[^{]*[{][^}]*[^\n }]' drivers/media/dvb/dvb-usb/af9005-fe.c
+
+ accept 'struct[ ]\(sp8870\|tda1004x\)_config[\n][{][^}]*[(][*]request_firmware[)][^}]*[\n][}][;]' 'drivers/media/dvb/frontends/\(sp8870\|tda1004x\)\.h'
+ blob '[/][*][^*]*\([*]\+[^/*][^*]*\)*[*]*get_dvb_firmware[^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]\([\n]\(#define[ ]\(\([^\n ]*_DEFAULT\|NONFREE\)_FIRMWARE\|["][^"]*["]\)[ ]\([^\n]\|[\\][\n]\)*\|[/][*][(]DEBLOBBED[)][*][/]\)\)*' 'drivers/media/dvb/frontends/\(nxt200x\|or51211\|sp887[0x]\|tda1004[8x]\)\.c'
+ blobname 'dvb-fe-sp8870\.fw' drivers/media/dvb/frontends/sp8870.c
+ blobname 'dvb-fe-tda1004[56]\.fw' drivers/media/dvb/frontends/tda1004x.c
+
+ # This bootcode is actually Free Software under GPLv2, but since it's
+ # being distributed without source code, we're taking it out.
+ blob 'static[ ]u8[ ]bootcode\[\][ ]=[ ][{][^}]*[}][;]' drivers/media/dvb/ttpci/av7110_hw.c
+ blobname 'dvb-ttpci-01\.fw' drivers/media/dvb/ttpci/av7110.c
+ defsnc 'static[ ]u8[ ]nexusca_stv0297_inittab\[\][ ]=' drivers/media/dvb/ttpci/av7110.c
+
+ defsnc 'static[ ]u8[ ]philips_su1278_tt_inittab\[\][ ]=' drivers/media/dvb/ttpci/budget-ci.c
+ defsnc 'static[ ]u8[ ]dvbc_philips_tdm1316l_inittab\[\][ ]=' drivers/media/dvb/ttpci/budget-ci.c
+
+ blobname 'ttusb-budget[/]dspbootcode\.bin' drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
+
+ blobname 'cpia2[/]stv0672_vp4\.bin' drivers/media/video/cpia2/cpia2_core.c
+
+ blobname 'dabusb[/]\(firmware\.fw\|bitstream\.bin\)' drivers/media/video/dabusb.c
+
+ blob 'static[ ]u32[ ]tigon2\?Fw\(Text\|Rodata\|Data\)\[[(]MAX_\(TEXT\|RODATA\|DATA\)_LEN[/]4[)][ ][+][ ]1\][ ]__devinitdata[ ]=[ ][{][^}]*[}][;]\([\n]static[ ]u32[ ]tigon2\?Fw\(Text\|Rodata\|Data\)\[[(]MAX_\(TEXT\|RODATA\|DATA\)_LEN[/]4[)][ ][+][ ]1\][ ]__devinitdata[ ]=[ ][{][^}]*[}][;]\)*' drivers/net/acenic_firwmare.h
+ blob '#define[ ]tigon2\?Fw[^ ]*\(Addr\|Len\)[ ]0x[^\n]*\([\n]#define[ ]tigon2\?Fw[^ ]*\(Addr\|Len\)[ ]0x[^\n]*\)\+' drivers/net/acenic_firmware.h
+ blob '\([/][*][^*]*\([*]\+[^/*][^*]*\)*[*]*Do[ ]not[ ]try[ ]to[ ]clear[^*]*\([*]\+[^/*][^*]*\)*[*]\+[/][\n][ ]\)\?ace_clear[^;]*[;][\n]\([^}]*[{][^}]*ace_copy[^}]*tigon2\?Fw[^}]*[}]\)*[\n]\+[ ]return[ ]0[;][\n][}]' drivers/net/acenic.c
+ blob 'if[ ][(]\(ACE_IS_TIGON_I[(]ap[)]\|ap->version[ ]==[ ]2\)[)][\n][ ][ ]writel[(]tigon2\?FwStartAddr,[ ][&]regs->Pc[)][;]\([\n][ ]if[ ][(]\(ACE_IS_TIGON_I[(]ap[)]\|ap->version[ ]==[ ]2\)[)][\n][ ][ ]writel[(]tigon2\?FwStartAddr,[ ][&]regs->Pc[)][;]\)*' drivers/net/acenic.c
+
+ blob '#include[ ]["]starfire_firmware\.h["]' drivers/net/starfire.c
+ blob '[/][*][^*]*\([*]\+[^/*][^*]*\)*[*]*Load[ ]Rx[/]Tx[ ]firmware[^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]\([\n][ ]for[ ][(][^)]*FIRMWARE_[RT]X_SIZE[^)]*[)][\n][ ][ ]writel[^;]*firmware_[rt]x[^;]*[;]\)\+' drivers/net/starfire.c
+
+ blob 'static[ ]\(u8\|const[ ]u32\|struct[ ]fw_info\)[ ]bnx2_\(\(COM\|CP\|[RT]XP\|TPAT\)_b0[69]Fw\(Text\|Data\|Rodata\)\|\(xi_\)\?rv2p_proc[12]\|\(com\|cp\|[rt]xp\|tpat\)_fw_0[69]\)\(\[[^]};]*\]\)*[ ]=[ ][{][^}]*[}][;]\([\n][\n]*static[ ]\(u8\|const[ ]u32\|struct[ ]fw_info\)[ ]bnx2_\(\(COM\|CP\|[RT]XP\|TPAT\)_b0[69]Fw\(Text\|Data\|Rodata\)\|\(xi_\)\?rv2p_proc[12]\|\(com\|cp\|[rt]xp\|tpat\)_fw_0[69]\)\(\[[^]};]*\]\)*[ ]=[ ][{][^}]*[}][;]\)*' 'drivers/net/bnx2_fw2\?.h'
+ blob '#include[ ]["]bnx2_fw\.h["][\n][\n]*#include[ ]["]bnx2_fw2\.h["]' drivers/net/bnx2.c
+ blob 'static[ ]void[\n]load_rv2p_fw[(][^{]*[)][\n][{]\([\n]\+[^\n}][^\n]*\)*[^\n]*[\n]\+[}]' drivers/net/bnx2.c
+ blob 'static[ ]int[\n]bnx2_init_cpus[(][^{]*[)][\n][{]\([\n]\+[^\n}][^\n]*\)*[^\n]*[\n]\+[}]' drivers/net/bnx2.c
+
+ # init_data_e1h? might actually be just data, but it doesn't
+ # really matter.
+ blob 'static[ ]const[ ]u32[ ]\(init\?\|[tucx]sem_\(int_table\|pram\)\)_data_e1h\?\[\][ ]=[ ][{][^}]*[}][;]\([\n][\n]*static[ ]const[ ]u32[ ]\(init\?\|[tucx]sem_\(int_table\|pram\)\)_data_e1h\?\[\][ ]=[ ][{][^}]*[}][;]\)*' drivers/net/bnx2x_init_values.h
+ blob 'static[ ]\(void[ ]\|const[ ]u32[ ][*]\)bnx2x_\(sel_blob\|init_wr_wb\|init_block\)[(][^{]*[)][\n][{]\([\n]\+[^\n}][^\n]*\)*[^\n]*[\n]\+[}]\([\n][\n]*static[ ]\(void[ ]\|const[ ]u32[ ][*]\)bnx2x_\(sel_blob\|init_wr_wb\|init_block\)[(][^{]*[)][\n][{]\([\n]\+[^\n}][^\n]*\)*[^\n]*[\n]\+[}]\)*' 'drivers/net/bnx2x_init\(_ops\)\?\.h'
+
+ blobname 'sun[/]cassini\.bin' drivers/net/cassini.c
+
+ blobna 'static[ ]u16[ ]\(sr\|twinax\)_edc\[\][ ]=[ ][{][^;]*[}][;]' drivers/net/cxgb3/ael1002.c
+ blobna 'for[ ][(][^\n]*ARRAY_SIZE[(]\(sr\|twinax\)_edc[)][^\n]*[)][\n][^;]*mdio_write[^;]*[;]' drivers/net/cxgb3/ael1002.c
+ blobname '\(cxgb3[/]\)\?t3\(fw\|\(%c\|.\)_p\(rotocol_\)\?sram\)-\(%d\|[0-9]*\)\.\(%d\|[0-9]*\)\.\(%d\|[0-9]*\)\.bin' drivers/net/cxgb3/cxgb3_main.c
+
+ blob '\([/][*][*]\+[/][\n]*\)*\([/][*][^*]*\([*]\+[^/*][^*]*\)*[*]*Micro[ ]code[^*]*\([*]\+[^/*][^*]*\)*[*]*8086:[^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]\([\n]*[/][*][^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]\)*\|#define[ ][ ]*D10\(1M\(_B\)\?\|1S\|2_E\)_\(CPUSAVER_\(TIMER\|BUNDLE\|MIN_SIZE\)_DWORD\|RCVBUNDLE_UCODE\)[ ][^\n]*\([\\][\n][^\n]*\)*\)\([\n]*[/][*][^*]*\([*]\+\([^/*]\|[/][\n]*[/][*]\+\)[^*]*\)*[*]*Micro[ ]code[^*]*\([*]\+[^/*][^*]*\)*[*]*8086:[^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]\([\n]*[/][*][^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]\)*\|[\n][\n]*#define[ ][ ]*D10\(1M\(_B\)\?\|1S\|2_E\)_\(CPUSAVER_\(TIMER\|BUNDLE\|MIN_SIZE\)_DWORD\|RCVBUNDLE_UCODE\)[ ]\(\\[\n]\|[^\n]\)*\)*' drivers/net/e100.c
+ blobna '\([/][*][^*]*\([*]\+[^/*][^*]*\)*[*]\+[/][\n]*[ ][ ]\)\(ucode\[opts->\(timer\|bundle\|min_size\)_dword\][ ].=[ ][^;]*[;][\n][\n]*[ ][ ]\)*[^}]*UCODE_SIZE[^}]*cb_ucode[^}]*return[;][\n][ ][}]' drivers/net/e100.c
+
+ blob 'static[ ]unsigned[ ]char[ ]__devinitdata[ ]lanai4_\(code\|data\)\[[0-9]*\][ ]=[ ][{][^;]*[}][;]' drivers/net/myri_code.h
+ blob '#include[ ]["]myri_code\.h["]' drivers/net/myri_sbus.c
+ blobna '\([/][*][^*]*\([*]\+[^/*][^*]*\)*[*]\+[/][\n ]*\)\?for[ ][(][^\n]*sizeof[(]lanai4_\(code\|data\)[^\n]*[)][\n][^\n]*sbus_writeb[^;]*lanai4_\(code\|data\)[^;]*lanai4_code_off[^;]*[;]\([\n ]*\([/][*][^*]*\([*]\+[^/*][^*]*\)*[*]\+[/][\n ]*\)\?for[ ][(][^\n]*sizeof[(]lanai4_\(code\|data\)[^\n]*[)][\n][^\n]*sbus_writeb[^;]*lanai4_\(code\|data\)[^;]*lanai4_\(code\|data\)_off[^;]*[;]\)*' drivers/net/myri_sbus.c
+
+ blob 'static[ ]u32[ ]s_firmLoad\[\][ ]=[ ][{][^;]*[}][;]' drivers/net/tehuti_fw.h
+ blobna 'bdx_tx_push_desc_safe[^;]*s_firmLoad[^;]*[;]' drivers/net/tehuti.c
+ blobna 'for[ ][(][^\n]*ARRAY_SIZE[(]s_firmLoad[)][^\n]*[)][\n ]*s_firmLoad[^;]*=[^;]*s_firmLoad[^;]*[;]' drivers/net/tehuti.c
+
+ blob '[ ][*][ ]Firmware[ ]is:[\n][ ][*][ ]Derived[ ]from[ ]proprietary[^/]*notice[ ]is[ ]accompanying[ ]it\.[\n][ ][*][/]' drivers/net/tg3.c
+ blobna 'Derived[ ]from[ ]proprietary[ ]unpublished[ ]source[ ]code' drivers/net/tg3.c
+ blob '\(static[ ]const[ ]\)\?u32[ ]tg3\(Tso5\?\)\?Fw\(Text\|Rodata\|Data\)\[[^{]*\][ ]=[ ][{][^}]*[}][;]\([\n][\n]*\(static[ ]const[ ]u32[ ]tg3\(Tso5\?\)\?Fw\(Text\|Rodata\|Data\)\[[^{]*\][ ]=[ ][{][^}]*[}][;]\|#if[ ]0\([ ][/][*][^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]\)\?[\n]\(static[ ]const[ ]\)\?u32[ ]tg3\(Tso5\?\)\?Fw\(Text\|Rodata\|Data\)\[[^{]*\][ ]=[ ][{][^}]*[}][;][\n]#endif\)\)*' drivers/net/tg3.c
+
+ blob 'static[ ]const[ ]u8[ ]typhoon_firmware_image\[\][ ]=[ ][{][^}]*[}][;]' drivers/net/typhoon-firmware.h
+
+ blobna 'licensed[^\n]*strictly[ ]for[ ]use[^\n]*[\n]*[^\n]*COPS[ ]LocalTalk' 'drivers/net/appletalk/cops_\(ff\|lt\)drv\.h'
+ blob 'static[ ]const[ ]unsigned[ ]char[ ]ffdrv_code\[\][ ]=[ ][{][^}]*[}][;]' drivers/net/appletalk/cops_ffdrv.h
+ blob 'static[ ]const[ ]unsgined[ ]char[ ]ltdrv_code\[\][ ]=[ ][{][^}]*[}][;]' drivers/net/appletalk/cops_ltdrv.h
+ blob '#include[ ]["]cops_\(lt\|ff\)drv\.h["][ ]*\([/][*][^*]*\([*]\+[^/*][^*]*\)*[*]*Firmware[^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]\)\?\([\n][\n]*#include[ ]["]cops_\(lt\|ff\)drv\.h["][ ]*\([/][*][^*]*\([*]\+[^/*][^*]*\)*[*]*Firmware[^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]\)\?\)*' drivers/net/appletalk/cops.c
+
+ blob 'static[ ]unsigned[ ]char[ ]bits_1200\[\][ ]*=[ ][{][^}]*[}][;]' drivers/net/hamradio/yam1200.h
+ blob 'static[ ]unsigned[ ]char[ ]bits_9600\[\][ ]*=[ ][{][^}]*[}][;]' drivers/net/hamradio/yam9600.h
+ blob '#include[ ]["]yam\(96\|12\)00\.h["]\([\n][\n]*#include[ ]["]yam\(96\|12\)00\.h["]\)*' drivers/net/hamradio/yam.c
+
+ blobna 'static[ ]const[ ]u_char[ ]__Xilinx7OD\[\][ ]=[ ][{][^}]*[}][;]' drivers/net/pcmcia/ositech.h
+ blob '#include[ ]["]ositech\.h["]' drivers/net/pcmcia/smc91c92_cs.c
+ blobna '\([/][*][ ]Download[ ]the[ ]Seven[ ]of[ ]Diamonds[ ]firmware[^/]*[*][/][\n ]*\)\?for[ ]*[(][^\n]*__Xilinx7OD[^{}]*[{][\n][ ]*outb[ ]*[(]__Xilinx7OD[^}]*[}]' drivers/net/pcmcia/smc91c92_cs.c
+
+ blob 'static[ ]const[ ]u8[ ]microcode\[\][ ]=[ ][{][^}]*[}][ ]*[;]' drivers/net/tokenring/3c359_microcode.h
+ blob '#include[ ]["]3c359_microcode\.h["]' drivers/net/tokenring/3c359.c
+ blobna 'start[ ]=[ ][(]0xFFFF[ ]-[ ][(]mc_size[)][^;]*[;][\n ]*[/][*][^*]*\([*]\+[^/*][^*]*\)*[*]\+[/][\n ]*printk[(]KERN_INFO[ ]["]3C359:[ ]Uploading[ ]Microcode:[ ]["][)][;][\n ]*for[ ][(][^{]*\(mc_size[^{]*[)][ ][{][^}]*writeb[(]microcode\[\|[)][ ][{][^}]*writeb[(]microcode\[mc_size\)[^}]*[}]\([\n][ ]*printk[^\n]*[;][\n ]*for[ ][(][^{]*\(mc_size[^{]*[)][ ][{][^}]*writeb[(]microcode\[\|[)][ ][{][^}]*writeb[(]microcode\[mc_size\)[^}]*[}]\)*' drivers/net/tokenring/3c359.c
+
+ blobname 'tr_smctr\.bin' drivers/net/tokenring/smctr.c
+
+ blobname 'kaweth[/]\(new\|trigger\)_code\(_fix\)\?\.bin' drivers/net/usb/kaweth.c
+
+
+ blobname '\(agere\|prism\)_\(sta\|ap\)_fw\.bin' 'drivers/net/wireless/\(orinico/\)\?\(orinoco\|fw\)\.c'
+ blobname 'symbol_sp24t_\(prim\|sec\)_fw' 'drivers/net/wireless/\(\(orinico/\)\?orinoco\.c\|spectrum_cs\.c\)'
+
+ blob 'unsigned[ ]short[ ]sbus_risc_code01\[\][ ]__devinitdata[ ]=[ ][{][^}]*[}][;]' drivers/scsi/qlogicpti_asm.c
+ blob '#include[ ]["]qlogicpti_asm\.c["]' drivers/scsi/qlogicpti.c
+
+ blob '\([/][*][ ]Microcode[^*]*\([*]\+[^/*][^*]*\)*[*]\+[/][\n]*\)\?static[ ]\(u\(nsigned[ ]\)\?char\|unsigned[ ]short\|ADV_DCNT\)[ ]_\(asc_mcode\|adv_asc3\(550\|8C\(08\|16\)00\)\)_\(buf\[\][ ]=[ ][{][^}]*[}]\|size[ ]=[ ]sizeof[^;]*\|chksum[ ]=[ ]0x[^;]*\)[;]\([ ]*[/][*][^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]\)\?\([\n][\n]*\([/][*][ ]Microcode[^*]*\([*]\+[^/*][^*]*\)*[*]\+[/][\n]*\)\?static[ ]\(u\(nsigned[ ]\)\?char\|unsigned[ ]short\|ADV_DCNT\)[ ]_\(asc_mcode\|adv_asc3\(550\|8C\(08\|16\)00\)\)_\(buf\[\][ ]=[ ][{][^}]*[}]\|size[ ]=[ ]sizeof[^;]*\|chksum[ ]=[ ]0x[^;]*\)[;]\([ ]*[/][*][^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]\)\?\)*' drivers/scsi/advansys.c
+
+ blob '\(#ifdef[ ]UNIQUE_FW_NAME[\n]\)\?static[ ]unsigned[ ]short[ ]\(risc\|fw12\(80e\|160\)i\)_code01\[\][ ]=[ ][{]\([\n]#else[\n]static[ ]unsigned[ ]short[ ]risc_code01\[\][ ]=[ ][{][\n]#endif[\n]\)\?[^}]*[}][;]\([\n][\n]*\(#ifdef[ ]UNIQUE_FW_NAME[\n]\)\?static[ ]unsigned[ ]short[ ]\(risc_code\|fw12\(80e\|160\)i\)_length01[ ]=[ ][^;]*[;]\([\n]#else[\n]static[ ]unsigned[ ]short[ ]risc_code_length01[ ]=[ ][^;]*[;][\n]#endif\)\?\)\?' 'drivers/scsi/ql1\(04\|2\(8\|16\)\)0_fw\.h'
+
+ blobname 'emi26[/]\(bitstream\|firmware\|loader\)\.fw' drivers/usb/misc/emi26.c
+
+ blobname 'emi62[/]\(bitstream\|midi\|spdif\|loader\)\.fw' drivers/usb/misc/emi62.c
+
+ blobname 'keyspan[/]\(mpr\|usa\(18x\|19\(q[iw]\|w\)\?\|28\(x\(a\|b\)\?\)\?\|49w\(lc\)\?\)\)\.fw' drivers/usb/serial/keyspan.c
+
+ accept '[ ][ ]fw_name[ ]=[ ]["]keyspan_pda[/]\(keyspan_pda\|xircom_pgs\)\.fw["][;]' drivers/usb/serial/keyspan_pda.c
+ blobna 'fw_name[ ]=[ ][^\n]*\([\n]\+[^\n}][^\n]*\)*\([/][*]KEYSPAN_PDA[*][/]\)\?request_ihex_firmware' drivers/usb/serial/keyspan_pda.c
+ accept '[ ]if[ ][(][/][*]KEYSPAN_PDA[*][/]request_ihex_firmware' drivers/usb/serial/keyspan_pda.c
+
+ blobname 'edgeport[/]\(boot\|down\)2\?\.fw' drivers/usb/serial/io_edgeport.c
+ blobname 'edgeport[/]down3\.bin' drivers/usb/serial/io_ti.c
+
+ blobname 'ti_\(usb-\)\?\(%d\|3410\|5052\)\.\(fw\|bin\)' drivers/usb/serial/ti_usb_3410_5052.c
+
+ blobname 'whiteheat\(_loader\(_debug\)\?\)\?\.fw' drivers/usb/serial/whiteheat.c
+
+ blob 'static[ ]struct[ ]BA1struct[ ]BA1Struct[ ]=[ ][{][^;]*[}][;]' sound/pci/cs46xx/cs46xx_image.h
+
+ blob 'static[ ]u32[ ]cwc\(4630\|async\|snoop\)_\(code\|parameter\)\[\][ ]=[ ][{][^;]*[}][;]' 'sound/pci/cs46xx/imgs/cwc\(4630\|async\|snoop\)\.h'
+ # cwcbinhack appears to have been created by hand.
+ # cwcdma has sources (not verified) in cwcdma.asp.
+ accept 'static[ ]u32[ ]cwc\(binhack\|dma\)_code\[\][ ]=[ ][{][^;]*[}][;]' 'sound/pci/cs46xx/imgs/cwc\(binhack\|dma\)\.h'
+ blob '#include[ ]["]\(cs46xx_image\|imgs[/]cwc\(4630\|async\|snoop\)\)\.h["]\([\n][\n]*#include[ ]["]\(cs46xx_image\|imgs[/]cwc\(4630\|async\|snoop\)\)\.h["]\)*' sound/pci/cs46xx/cs46xx_lib.c
+
+ blobname 'korg[/]k1212\.dsp' sound/pci/korg1212/korg1212.c
+
+ blobname 'ess[/]maestro3_assp_\(kernel\|minisrc\)\.fw' sound/pci/maestro3.c
+
+ blobname 'yamaha[/]ds1e\?_\(ctrl\|dsp\)\.fw' sound/pci/ymfpci/ymfpci_main.c
+
+ blobname 'sb16[/]\(\(a\|mu\)law_main\|ima_adpcm_\(init\|capture\|playback\)\)\.csp' sound/isa/sb/sb16_dsp.c
+
+ blob 'static[ ]const[ ]struct[ ][{][^}]*[}][ ]yss225_registers\[\][ ]__devinitdata[ ]=[ ][{][^;]*[}][;]' sound/isa/wavefront/yss225.c
+ blobname 'yamaha[/]yss225_registers\.bin' sound/isa/wavefront/wavefront_fx.c
+ blobna 'firmware[ ]=[ ][&]yss225_registers_firmware[;]' sound/isa/wavefront/wavefront_fx.c
+ blob 'static[ ]const[ ]struct[ ]firmware[ ]yss225_registers_firmware[ ]=[ ][{][^;]*[}][;]' sound/isa/wavefront/wavefront_fx.c
+ blobna '\(ospath[ ]*-[ ]Pathname[^\n]*ICS2115[^-]*wavefront\.os\|Note:[ ]the[ ]firmware[ ]file[ ]["]wavefront\.os["]\)[^-]*[/]lib[/]firmware\.\([^.]*after[ ]upgrading[ ]the[ ]kernel\)\?' Documentation/sound/alsa/ALSA-Configuration.txt
+ blobname 'wavefront\.os' sound/isa/wavefront/wavefront_synth.c
+
+ blobna 'and[\n]require[ ]the[ ]use[ ]of[^\n]*propr\?ietary[^:]*' Documentation/arm/IXP4xx
+ blob 'If[ ]you[ ]need[ ]to[ ]use[ ]any[ ]of[ ]the[ ]above[^\n]*download[^:]*:[\n ]*http:[^\n]*ixp4[^\n]*' Documentation/arm/IXP4xx
+
+ blobname 'xc\(%d\|[0-9]*\)\.bin' arch/arm/mach-netx/include/mach/xc.h
+ accept 'int[ ]xc_request_firmware[(]struct[ ]xc[ ]*[*][ ]*x[)][;]' arch/arm/mach-netx/include/mach/xc.h
+ accept 'int[ ]xc_request_firmware[(]struct[ ]xc[ ]*[*][ ]*x[)][\n][{]' arch/arm/mach-netx/xc.c
+ accept '[ ][ ]dev_err[(]x->dev,[ ]["]request_firmware[ ]failed\\n["][)][;]' arch/arm/mach-netx/xc.c
+ accept 'EXPORT_SYMBOL[(]xc_request_firmware[)][;]' arch/arm/mach-netx/xc.c
+ accept '[ ][ ]if[ ][(]xc_request_firmware[(]priv->xc[)][)][ ][{]' drivers/net/netx-eth.c
+
+ blobname 'iop_fw_load_[sm]pu' arch/cris/arch-v32/drivers/iop_fw_load.c
+ accept 'int[ ]iop_fw_load_[sm]pu[(]' arch/cris/arch-v32/drivers/iop_fw_load.c
+ accept '[ ]retval[ ]=[ ]request_firmware[^;]*[&]iop_[sm]pu_device' arch/cris/arch-v32/drivers/iop_fw_load.c
+ accept 'EXPORT_SYMBOL[(]iop_fw_load_[sm]pu[)][;]' arch/cris/arch-v32/drivers/iop_fw_load.c
+
+ accept '[/][*][ ]fake[ ]device[ ]for[ ]request_firmware[ ][*][/]' arch/x86/kernel/microcode_core.c
+
+ blobname 'amd-ucode[/]microcode_amd\.bin' arch/x86/kernel/microcode_amd.c
+
+ blobname 'intel-ucode[/]\([0-9a-f][0-9a-f]\|%02x\)-\([0-9a-f][0-9a-f]\|%02x\)-\([0-9a-f][0-9a-f]\|%02x\)' 'arch/x86/kernel/microcode\(_intel\)\?\.c'
+
+ blobname 'BCM2033-\(MD\.hex\|FW\.bin\)' drivers/bluetooth/bcm203x.c
+
+ blobname 'bfubase\.frm' drivers/bluetooth/bfusb.c
+
+ blobname 'BT3CPCC\.bin' drivers/bluetooth/bt3c_cs.c
+
+ blobname 'cyzfirm\.bin' drivers/char/cyclades.c
+
+ accept 'MODULE_FIRMWARE[(]["]dsp56k[/]bootstrap\.bin["][)][;]' drivers/char/dsp56k.c
+ blobna 'const[ ]char[ ]fw_name\[\][ ]=[ ]["]dsp56k[/]bootstrap\.bin["][;][^\n]*\([\n]\+[^\n}][^\n]*\)*request_firmware[^\n]*\([\n]\+[^\n}][^\n]*\)*[\n]\+[ ]err[ ]=[ ]request_firmware[(][&]fw,[ ]fw_name,[ ]' drivers/char/dsp56k.c
+ accept '[ ]const[ ]char[ ]fw_name\[\][ ]=[ ]["]dsp56k[/]bootstrap\.bin["][;][^\n]*\([\n]\+[^\n}][^\n]*\)*[\n]\+[ ]err[ ]=[ ]request_firmware[(][&]fw,[ ]fw_name,[ ]' drivers/char/dsp56k.c
+
+ blobname 'isi\(6\(08\|\(08\|16\)em\)\|46\(08\|16\)\)\.bin' drivers/char/isicom.c
+
+ blobname 'c\(218t\|p204\|320t\)unx\.cod' drivers/char/moxa.c
+ accept '[ ][ ]printk[(]KERN_ERR[ ]["]MOXA:[ ]request_firmware[ ]failed' drivers/char/moxa.c
+
+ # This driver enables the user to update the non-Free BIOS, but it
+ # only issues a firmware request if specifically told to. It
+ # doesn't require any non-Free firwmare to function, and it
+ # doesn't actually recommend users to perform updates, so I'm
+ # leaving it in.
+ accept '[ ][ ][ ]req_firm_rc[ ]=[ ]request_firmware_nowait[(][^;]*,[ ]["]dell_rbu["],' drivers/firmware/dell_rbu.c
+ accept '[ ]*["]dell_rbu:%s[ ]request_firmware_nowait["]' drivers/firmware/dell_rbu.c
+
+ blobname 'xc3028-v27\.fw' drivers/media/common/tuners/tuner-xc2028.h
+ blobname 'xc3028L-v36\.fw' drivers/media/common/tuners/tuner-xc2028.h
+
+ blobname 'dvb-fe-xc5000-1\.1\.fw' drivers/media/common/tuners/xc5000.c
+
+ blobname '4210\(100[12]\|%4X\)\.sb' drivers/net/irda/irda-usb.c
+ blobna '[/][*][ \n*]*[ ]Known[ ]firmware[^*]*\([*]\+[^/*][^*]*\)*[*]*\(STIR421x\|4210\(100[12]\|%4X\)\.sb\)[^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]' drivers/net/irda/irda-usb.c
+
+ blobname 'myri10ge_\(rss_\)\?ethp\?_z8e\.dat' drivers/net/myri10ge.c
+ blobna 'If[ ]the[ ]driver[ ]can[ ]neither[ ]enable[ ]ECRC[^*]*\([*]\+[^/*][^*]*\)*[*]*myri10ge_\(rss_\)\?ethp\?_z8e\.dat[^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]' drivers/net/myri10ge.c
+
+ blobname 'spider_fw\.bin' drivers/net/spider_net.h
+
+ blobname 'tms380tr\.bin' drivers/net/tokenring/tms380tr.c
+
+ blobname 'atmel_at76c50\(2\([de]\|_3com\)\?\|4a\?\(_2958\)\?\|6\)\(\.bin\)\?' drivers/net/wireless/atmel.c
+ accept '[ ]*priv->firmware[ ]=[ ]\(NULL\|new_firmware\)[;]' drivers/net/wireless/atmel.c
+
+ blobname 'b43\(legacy\)\?\(%s\)\?[/]\(%s\|ucode\([2459]\|1[1345]\)\|pcm5\|[abn]0g[01]initvals\(5\|1[13]\)\)\.fw' 'drivers/net/wireless/b43\(legacy\)\?/main.c'
+ blobname 'pcm5\.fw' drivers/net/wireless/b43/main.c
+ blobna 'b43legacyerr[(][^;]*must[ ]go[ ]to[ ]http[^;]*b43#devicefirmware[^;]*[)][;]' drivers/net/wireless/b43legacy/main.c
+ blobna 'You[ ]must[ ]go[ ]to[^;]*b43#devicefirmware[^;]*[^";)]' drivers/net/wireless/b43/main.c
+ blobna 'http:[/][/]wireless[^ ";)]*b43#devicefirmware' drivers/net/wireless/b43/main.c
+
+ blob '#define[ ]IPW2100_FW_\(\(\(MAJOR\|MINOR\)_VERSION\|\(MAJOR\|MINOR\)[(]x[)]\)\|VERSION\)\([^\n]*\\[\n]\)*[^\n]*\([\n][\n]*#define[ ]IPW2100_FW_\(\(\(MAJOR\|MINOR\)_VERSION\|\(MAJOR\|MINOR\)[(]x[)]\)\|VERSION\)\([^\n]*\\[\n]\)*[^\n]*\)*' 'drivers/net/wireless/\(ipw2x00/\)\?ipw2100\.c'
+ blobname 'ipw2100-\(["]\([^"\n]\|[\\][\n]\)*["]\([^"]\|[\\]["]\)*\)\+' 'drivers/net/wireless/\(ipw2x00/\)\?ipw2100\.c'
+ blobname '__stringify[(]IPW2100_FW_MINOR_VERSION[)]' 'drivers/net/wireless/\(ipw2x00/\)\?ipw2100\.c'
+ accept '[ ]*Portions[ ]of[ ]ipw2100_\(do_\)\?mod_firmware_load[, ]*\(ipw2100_\(do_\)\?mod_firmware_load[, and\n]*\)*' 'drivers/net/wireless/\(ipw2x00/\)\?ipw2100\.c'
+ accept '[ ]ipw2100_mod_firmware_load[(]fw[)][;]' 'drivers/net/wireless/\(ipw2x00/\)\?ipw2100\.c'
+ accept 'static[ ]int[ ]ipw2100_mod_firmware_load[(]' 'drivers/net/wireless/\(ipw2x00/\)\?ipw2100\.c'
+ blobna 'if[ ][(]IPW2100_FW_MAJOR[^{]*[{][^}]*[ ][}]' 'drivers/net/wireless/\(ipw2x00/\)\?ipw2100\.c'
+ blobname '["]["][ ]x[ ]["]\.fw["]' 'drivers/net/wireless/\(ipw2x00/\)\?ipw2100\.c'
+
+ accept '[/][*][ ]Call[ ]this[ ]function[ ]from[ ]process[ ]context[^*]*\([*]\+[^/*][^*]*\)*[*]*request_firmware' 'drivers/net/wireless/\(ipw2x00/\)\?ipw2200.c'
+ blobname 'ipw2200-\(i\?bss\|sniffer\)\.fw' 'drivers/net/wireless/\(ipw2x00/\)\?ipw2200.c'
+ accept '[ ][ ]IPW_ERROR[(]["]%s[ ]request_firmware[ ]failed' 'drivers/net/wireless/\(ipw2x00/\)\?ipw2200.c'
+
+ blobname 'iwlwifi-\(3945\|4965\|[156]000\(G2[AB]\)\?\|1[03]0\|6050\)["][ ]IWL\(3945\|4965\|[156]000\(G2[AB]\)\?\|1[03]0\|6050\)_UCODE_API[ ]["]\.ucode' 'drivers/net/iwlwifi/iwl\(3945-base\|-\(3945\|4965\|[156]000\)\)\.[ch]'
+ blobname 'iwlwifi-3945-' drivers/net/iwlwifi/iwl-3945.h
+ blobname '#api[ ]["]\.ucode["]' 'drivers/net/iwlwifi/iwl-\(3945.h\|\(4965\|[156]000\)\.c\)'
+ accept '#define\([ ]_\?IWL3945_MODULE_FIRMWARE[(]api[)]\)\+' drivers/net/iwlwifi/iwl-3945.h
+ accept '[ ][ ][*][ ]request_firmware[(][)][ ]is[ ]synchronous' 'drivers/net/iwlwifi/iwl\(3945-base\|-agn\)\.c'
+ blobname 'iwlwifi-4965-' drivers/net/iwlwifi/iwl-4965.c
+ blobname 'iwlwifi-5\(00\|15\)0-' drivers/net/iwlwifi/iwl-5000.c
+ blobname '%s%[dus]%s["],[\n ]*name_pre,[ ]\(\(priv->fw_\)\?index\|tag\),[ ]["]\.ucode' 'drivers/net/iwlwifi/iwl\(3945-base\|-agn\).c'
+
+ blobname 'libertas_cs\(_helper\)\?\.fw' drivers/net/wireless/libertas/if_cs.c
+ blobname 'sd\(8385\|868[68]\)\(_helper\)\?\.bin\(["],[\n][ ]*\.firmware[ ]=[ ]["]sd\(8385\|868[68]\)\.bin\)\?' 'drivers/\(net/wireless/libertas/if_sdio\.c\|bluetooth/btmrvl_sdio\.c\)'
+ blobname 'sd\(8385\|868[68]\)\(_helper\)\?\.bin' 'drivers/\(net/wireless/libertas/if_sdio\.c\|bluetooth/btmrvl_sdio\.c\)'
+ accept '[ ]*card->firmware[ ]=[ ]\(if_sdio\|lbs_fw\|fw_name\)' drivers/net/wireless/libertas/if_sdio.c
+ blobname 'usb8388\(-5\.126\.0\.p5\)\?\.bin' drivers/net/wireless/libertas/if_usb.c
+ blob '[/][*][^*]*\([*]\+[^/*][^*]*\)*[*]*usb8388\(-5\.126\.0\.p5\)\?\.bin[^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]' drivers/net/wireless/libertas/if_usb.c
+ accept '[ ][ ]lbs_pr_err[(]["]request_firmware\([(][)]\)\?[ ]failed' 'drivers/net/wireless/if_\(spi\|usb\)\.c'
+ blobna 'o\.[ ]Copy[ ]the[ ]firmware[ ]image[^\n]*usb8388\([^\n]\|[\n][ ]*[^ \n]\)*' drivers/net/wireless/libertas/README
+ blobna '\[fw_name=usb8388[^]]*\]' drivers/net/wireless/libertas/README
+
+ blobname 'usb8388\.bin' drivers/base/Kconfig
+ accept '[ ][ ][ ]So,[ ]for[ ]example,[ ]you[ ]might[ ]set[ ]CONFIG_EXTRA_FIRMWARE=["]whatever\.bin["]' drivers/base/Kconfig
+ accept '[ ][ ][ ]kernel\.[ ]Then[ ]any[ ]request_firmware[(]\(["]whatever\.bin["]\)[)]' drivers/base/Kconfig
+
+ blobname 'lbtf_usb\.bin' drivers/net/wireless/libertas_tf/if_usb.c
+
+ blobname 'isl38\(86\|87\|90\)\(pci\|usb\(_bare\)\?\)\?' 'drivers/net/wireless/p54/p54\(pci\.c\|usb\.[ch]\)'
+ blob '[/][*][ ]for[ ]isl3886[ ]register[ ]definitions[^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]' drivers/net/wireless/p54/p54usb.h
+ blobna 'If[ ]you[ ]enable[ ]this\([^\n]\|[\n][ ]*[^ \n]\)*isl3890\([^\n]\|[\n][ ]*[^ \n]\)*' drivers/net/wireless/Kconfig
+
+ blobname 'isl38\(77\|86\|90\)' drivers/net/wireless/prism54/islpci_dev.c
+
+ blobname 'rt2[56]61s\?\.bin' drivers/net/wireless/rt2x00/rt61pci.h
+ blobname 'rt73\.bin' drivers/net/wireless/rt2x00/rt73usb.h
+
+ blobname 'zd1201\(-ap\)\?\.fw' drivers/net/wireless/zd1201.c
+
+ blobname 'zd1211[/]zd1211b\?_\(u\([rb]\|phr\)\?\)\?' drivers/net/wireless/zd1211/zd_usb.c
+
+ # ??? gotta introduce some means to match false-positives
+ # including post context containing blobs, so that the macro name
+ # is not flagged or deblobbed, but the blob name is.
+ # blobna 'PCMCIA_\([PM]FC_\)\?DEVICE_CIS_\(MANF_CARD\|PROD_ID[1-4]*\)'
+ # accept '[ ] PCMCIA_\([PM]FC_\)\?DEVICE_CIS_\(MANF_CARD\|PROD_ID[1-4]*\)[(][^)]*, ["][/][*][(]DEBLOBBED[)][*][/]["][)]'
+ # accept '#define PCMCIA_\([PM]FC_\)\?DEVICE_CIS_\(MANF_CARD\|PROD_ID[1-4]*\)[(]' include/pcmcia/device_id.h
+
+ # These are not software; they're Free, but GPLed without in-tree sources.
+ # blobname '\(cis[/]\)\?3CCFEM556\.cis' drivers/net/pcmcia/3c574_cs.c
+ # blobname '\(cis[/]\)\?3CXEM556\.cis' drivers/net/pcmcia/3c589_cs.c
+ # blobname '\(cis[/]\)\?\(PCMLM28\|DP83903\|LA-PCM\|PE520\|NE2K\|PE-200\|tamarack\)\.cis' drivers/net/pcmcia/pcnet_cs.c
+ # blobname '\(cis[/]\)\?\(PCMLM28\|DP83903\|3C\(CF\|X\)EM556\|MT5634ZLX\|COMpad[24]\|RS-COM-2P\|GLOBETROTTER\)\.cis' drivers/serial/serial_cs.c
+ # These are not software; they're Free, but GPLed without textual sources.
+ # It is safe to assume that these binaries *are* sources, since they
+ # can be trivially converted back to a textual form, without loss.
+ # blobname '\(cis[/]\)\?SW_\([78]xx\|555\)_SER\.cis' drivers/serial/serial_cs.c
+
+ accept '[ ]\(ds_\)\?\(dev_\)\?dbg[(]\(1[,][ ]\)\?\([&]dev->dev,[ ]\)\?["]trying[ ]to[ ]load[ ]\(CIS[ ]file\|firmware\)[ ]%s[\\]n["],[ ]filename[)][;][\n]*[ ]if[ ][(]\(strlen[(]filename[)][^\n]*\([{][^}]*[ ][}]\|[)][\n][ ]*return[^\n]*[;]\)[\n]*[ ]snprintf[(]path,[ ]\(20\|sizeof[(]path[)]\),[^\n]*,[ ]filename[)][;][\n]*[ ]if[ ][(]request_firmware[(][&]fw,[ ]path\|request_firmware[(][&]fw,[ ]filename\),[ ][&]dev->dev[)][^\n]*[)][ ][{][\n][ ]*if[ ][(]fw->size[ ]>=[ ]CISTPL_MAX_CIS_SIZE[)]' drivers/pcmcia/ds.c
+ accept 'MODULE_FIRMWARE[(]["]\(cis[/]\)\?\(PCMLM28\|DP83903\|3C\(CF\|X\)EM556\|MT5634ZLX\|COMpad[24]\|RS-COM-2P\|GLOBETROTTER\|SW_\([78]xx\|555\)_SER\)\.cis["][)][;]\([\n]MODULE_FIRMWARE[(]["]\(cis[/]\)\?\(PCMLM28\|DP83903\|3C\(CF\|X\)EM556\|MT5634ZLX\|COMpad[24]\|RS-COM-2P\|GLOBETROTTER\|SW_\([78]xx\|555\)_SER\)\.cis["][)][;]\)*' drivers/serial/serial_cs.c
+ accept 'MODULE_FIRMWARE[(]["]\(cis[/]\)\?\(PCMLM28\|DP83903\|LA-PCM\|PE520\|NE2K\|PE-200\|tamarack\)\.cis["][)][;]\([\n]MODULE_FIRMWARE[(]["]\(cis[/]\)\?\(PCMLM28\|DP83903\|LA-PCM\|PE520\|NE2K\|PE-200\|tamarack\)\.cis["][)][;]\)*' drivers/net/pcnet_cs.c
+
+ # This enables but does not encourage firmware updates.
+ accept '[ ]err[ ]=[ ]request_firmware[(][&]asd_ha->bios_image,[\n ]*filename_ptr,[\n ]*[&]asd_ha->pcidev->dev[)][;]' drivers/scsi/aic94xx/aic94xx_init.c
+ blobname 'aic94xx-seq\.fw' drivers/scsi/aic94xx/aic94xx_seq.h
+
+ # This enables but does not encourage firmware updates.
+ accept '[ ]if[(]request_firmware[(]&fw_entry,[ ]fname,[ ]&ioa_cfg->pdev->dev[)][)]' drivers/scsi/ipr.c
+
+ accept '[ ]res[ ]=[ ]request_firmware[(]&fw,[ ]["]sas_addr["],[ ]&shost->shost_gendev[)][;]' drivers/scsi/libsas/sas_scsi_host.c
+
+ blobname 'ql\(2\([12345]00\|322\)\|8[12]00\)_fw\.bin' drivers/scsi/qla2xxx/qla_os.c
+ blobna 'By[ ]default,[ ]firmware[ ]for[ ]the[ ]ISP[ ]parts\([^\n]\|[\n]*[ ]\)*ql2[12345]00_fw\.bin\([^\n]\|[\n]*[ ]\)*ftp:[/][/][^\n]*firmware[/]' drivers/scsi/qla2xxx/Kconfig
+
+ blobname 'icom_\(asc\|res_dce\|call_setup\)\.bin' drivers/serial/icom.c
+
+ blobname 'fsl_qe_ucode_uart_\(%u\|[0-9]*\)_\(%u\|[0-9]*\)\(%u\|[0-9]*\)\.bin' drivers/serial/ucc_uart.c
+
+ blobname 'atmel_at76c50\(3-\(i386[13]\|rfmd\(-acc\)\?\)\|5\(a\(mx\)\?\)\?-rfmd\(2958\)\?\)\.bin' 'drivers/\(\(staging\|net/wireless\)/at76_usb/at76_usb\.c\|at76c50x-usb\.c\)'
+
+ accept 'static[ ]struct[ ]go7007_usb_board[ ]board_\(matrix_\(ii\|reload\|revolution\)\|star_trek\|px_tv402u\|xmen\|lifeview_lr192\|endura\|adlink_mpg24\|sensoray_2250\)[ ]=[ ][{][\n]\([ ]\.flags[ ]*=[ ][^",]*,[\n]*\)*[ ]\.main_info[ ]*=[ ][{][\n][ ][ ]\.firmware[ ]*=[ ]' drivers/staging/go7007/go7007-usb.c
+ accept 'static[ ]struct[ ]go7007_board_info[ ]board_voyager[ ]=[ ][{][\n][ ]\.firmware[ ]*=[ ]' drivers/staging/go7007/saa7134-go7007.c
+ blobname 'go7007\(fw\|tv\)\.bin' 'drivers/staging/go7007/\(go7007-\(driver\|usb\)\|saa7134-go7007\)\.c'
+
+ blobname 'cxacru-\(%s\|fw\|bp\|cf\)\.bin' drivers/usb/atm/cxacru.c
+
+ blobname 'speedtch-\(%d\|[0-9]*\)\.bin\(\.\(%x\|\(0x\)\?[0-9a-fA-F]*\)\(\.\(%02x\|[0-9a-fA-F][0-9a-fA-F]\)\)\?\)\?' drivers/usb/atm/speedtch.c
+
+ blobname 'ueagle-atm[/]' drivers/usb/atm/ueagle-atm.c
+ blobname '\(adi930\|eagle\(I*\|IV\)\)\.fw' drivers/usb/atm/ueagle-atm.c
+ blobname 'DSP[49e][ip]\.bin' drivers/usb/atm/ueagle-atm.c
+ blobname '930-fpga\.bin' drivers/usb/atm/ueagle-atm.c
+ blobname 'CMV[x9ae][yip]\.bin\(\.v2\)\?' drivers/usb/atm/ueagle-atm.c
+
+ blobname 'isight\.fw' drivers/usb/misc/isight_firwmare.c
+
+ blobname '\(i1480-\(pre-phy\|usb\|phy\)\|ptc\)-0\.0\.bin' drivers/uwb/i1480/dfu/usb.c
+
+ accept '[ ]retval[ ]=[ ]request_firmware[(][&]fw_entry,[ ]["]metronome\.wbf["],[ ][&]dev->dev[)][;]' drivers/video/metronomefb.c
+
+ blobname '\(vx[/]\)\?\(bx_1_v\(xp\|p4\)\.b56\|x1_\(1_v\(x[2p]\|p4\)\|2_v22\)\.xlx\|bd56\(002\|3v2\|3s3\)\.boot\|l_1_v\(x[2p]\|p4\|22\)\.d56\)' sound/drivers/vx/vx_hwdep.c
+
+ blobname '\(ea[/]\)\?darla20_dsp\.fw' sound/pci/echoaudio/darla20.c
+ blobname '\(ea[/]\)\?darla24_dsp\.fw' sound/pci/echoaudio/darla24.c
+ blobname '\(ea[/]\)\?\(\(loader\|echo3g\)_dsp\|3g_asic\)\.fw' sound/pci/echoaudio/echo3g.c
+ blobname '\(ea[/]\)\?gina20_dsp\.fw' sound/pci/echoaudio/gina20.c
+ blobname '\(ea[/]\)\?\(\(loader\|gina24_3[06]1\)_dsp\|gina24_3[06]1_asic\)\.fw' sound/pci/echoaudio/gina24.c
+ blobname '\(ea[/]\)\?\(loader\|indigo\)_dsp\.fw' sound/pci/echoaudio/indigo.c
+ blobname '\(ea[/]\)\?\(loader\|indigo_dj\)_dsp\.fw' sound/pci/echoaudio/indigodj.c
+ blobname '\(ea[/]\)\?\(loader\|indigo_io\)_dsp\.fw' sound/pci/echoaudio/indigoio.c
+ blobname '\(ea[/]\)\?layla20_\(dsp\|asic\)\.fw' sound/pci/echoaudio/layla20.c
+ blobname '\(ea[/]\)\?\(\(loader\|layla24\)_dsp\|layla24_\(1\|2[AS]\)_asic\)\.fw' sound/pci/echoaudio/layla24.c
+ blobname '\(ea[/]\)\?\(loader\|mia\)_dsp\.fw' sound/pci/echoaudio/mia.c
+ blobname '\(ea[/]\)\?\(\(loader\|mona_3[06]1\)_dsp\|mona_3[06]1\(_1\)\?_asic_\(48\|96\)\|mona_2_asic\)\.fw' sound/pci/echoaudio/gina24.mona
+ blobname 'ea[/]%s' sound/pci/echoaudio/echoaudio.c
+
+ blobname 'emu[/]\(hana\|\(audio\|micro\)_dock\|emu\(0404\|1010\(b\|_notebook\)\)\)\.fw' sound/pci/emu10k1/emu10k1_main.c
+
+ blobname '\(mixart[/]\)\?miXart8\(AES\)\?\.\(xlx\|elf\)' sound/pci/mixart/mixart_hwdep.c
+
+ blobname '\(pcxhr[/]\)\?\(x[ic]_1_882\|[ebd]321_512\|xlxint\|\(xlxc\|dsp[ebd]\)\(882\|1\?222\|924\)\(e\|hr\)\?\)\(\.dat\|\.[ebd]56\)' sound/pci/pcxhr/pcxhr_hwdep.c
+
+ blobna 'You[ ]need[ ]to[ ]install[\n]*riptide\.hex[\n]\.[\n]' Documentation/sound/alsa/ALSA-Configuration.txt
+ blobname 'riptide\.hex' sound/pci/riptide/riptide.c
+ defsnc 'static[ ]union[ ]firmware_version[ ]firmware_versions\[\][ ]=' sound/pci/riptide/riptide.c
+ blobna 'chip->firmware[ ]=[ ]firmware[;]' sound/pci/riptide/riptide.c
+
+ blobname '\(multi\|digi\)face_firmware\(_rev11\)\?\.bin' sound/pci/rme9652/hdsp.c
+
+ blobname 'aica_firmware\.bin' sound/sh/aica.c
+
+ accept '[ ][*][^*]*\([*]\+[^/*][^*]*\)*[*]*Caution:[ ]This[ ]API[^*]*\([*]\+[^/*][^*]*\)*[*]*request_firmware.' sound/sound_firmware.c
+ accept 'static[ ]int[ ]do_mod_firmware_load[(]' sound/sound_firmware.c
+ accept 'int[ ]mod_firmware_load[(]' sound/sound_firmware.c
+ accept '[ ]r[ ]=[ ]do_mod_firmware_load[(]' sound/sound_firmware.c
+ accept 'EXPORT_SYMBOL[(]mod_firmware_load[)][;]' sound/sound_firmware.c
+ accept 'extern[ ]int[ ]mod_firmware_load[(]' sound/oss/sound_firmware.h
+
+ accept '[ ]INITCODESIZE[ ]=[ ]mod_firmware_load[(]INITCODEFILE,[ ][&]INITCODE[)][;]' sound/oss/msnd_pinnacle.c
+ accept '[ ]PERMCODESIZE[ ]=[ ]mod_firmware_load[(]PERMCODEFILE,[ ][&]PERMCODE[)][;]' sound/oss/msnd_pinnacle.c
+ blobname '\([/]etc[/]sound[/]\|turtlebeach[/]\)\?pndsp\(ini\|erm\)\.bin' '\(sound/oss/msnd_pinnacle.h\|Documentation/sound/alsa/ALSA-Configuration.txt\)'
+ blobname '\([/]etc[/]sound[/]\|turtlebeach[/]\)\?msnd\(init\|perm\)\.bin' '\(sound/oss/msnd_classic.h\|Documentation/sound/alsa/ALSA-Configuration.txt\)'
+ blobna '\(Important[ ]Notes[ ]-[ ]Read[ ]Before[ ]Using\|Obtaining[ ]and[ ]Creating[ ]Firmware[ ]Files\)[\n]#[ ][ ]~*\([^\n]\|[\n]#[ ]*\([\n]#[ ]*\([\n]#[ ]*For[ ]the[^\n]*[\n]#[ ]*~*[\n]\)\?\)\?[^\n ]\)*\.' Documentation/sound/oss/MultiSound
+
+ accept '[ ]len[ ]=[ ]mod_firmware_load[(]fn,[ ][&]data[)][;][\n][ ]if[ ][^{]*[ ][{][\n][ ][ ]*printk[(]KERN_ERR[ ]["]sscape:' sound/oss/sscape.c
+ blobname '[/]sndscape[/]\(scope\.cod\|sndscape\.co\([?dx01234]\|%d\)\)' sound/oss/sscape.c
+
+ accept '[ ][ ]trix_boot_len[ ]=[ ]mod_firmware_load[(]' sound/oss/trix.c
+ blobname '\([/]etc[/]sound[/]\)\?trxpro\.bin' sound/oss/trix.c
+
+ accept '[ ][ ]smw_ucodeLen[ ]=[ ]mod_firmware_load[(]' sound/oss/sb_common.c
+ blobname '\([/]etc[/]sound[/]\)\?midi0001\.bin' sound/oss/sb_common.c
+ blobname '\([/]etc[/]sound[/]\|turtlebeach[/]\)\?msnd\(init\|perm\)\.bin' sound/oss/Kconfig
+
+ blob 'When[ ]the[ ]module[ ]is[ ]loaded[^\n]*\([\n][^\n]*\)*[/]pss_synth[^\n]*\([\n][^\n]*\)*' Documentation/sound/oss/PSS
+ blob 'pss_firmware[ \n ]*This[ ]parameter[^\n]*\([\n][^\n]*\)*[/]pss_synth[^\n]*\([\n][^\n]\+\)*' Documentation/sound/oss/PSS-updates
+ accept '[ ][ ]pss_synthLen[ ]=[ ]mod_firmware_load[(]pss_firmware,[ ][(]void[ ][*][)][ ][&]pss_synth[)][;]' sound/oss/pss.c
+ accept '[ ]*if[ ]\?[(]\(!\|fw_load[ ][&][&][ ]\)\?pss_synth' sound/oss/pss.c
+ accept '[ ]*if[ ][(]!pss_download_boot[(]devc,[ ]pss_synth,[ ]pss_synthLen,' sound/oss/pss.c
+ accept '[ ]*vfree[(]pss_synth[)][;]' sound/oss/pss.c
+ blobna 'to[ ]allow[ ]the[ ]user[ ][^/"]*fir[em]ware[ ]file[^/"]*["][^"*]*["]' sound/oss/pss.c
+ blobname '\([/]etc[/]sound[/]\)\?pss_synth' sound/oss/pss.c
+ accept '[ ][$][(]obj[)][/]bin2hex[ ]pss_synth' sound/oss/Makefile
+ accept '[ ][ ]*echo[ ][\'"'"']static[ ]\(unsigned[ ]char[ ][*][ ]*\|int[ ]\)pss_synth\(Len\)\?[ ]=[ ]\(NULL\|0\)[;]' sound/oss/Makefile
+
+ accept '[ ]\.request_firmware[ ]=[ ]NULL,' drivers/media/dvb/dvb-usb/m920x.c
+
+ accept '[ ]*["]request_firmware[ ]\(fatal[ ]error\|unable[ ]to[ ]locate\|:[ ]Failed[ ]to[ ]find\)' drivers/media/video/pvrusb2/pvrusb2-hdw.c
+ accept '[ ][*][ ]NOTE[ ]:[ ]the[ ]pointer[ ]to[ ]the[ ]firmware[ ]data[ ]given[ ]by[ ]request_firmware[(][)]' drivers/media/video/pvrusb2-hdw.c
+
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]\(dw\(210[24]\|3101\)\|s6[3x]0\)_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/dw2102.c
+ blobname 'dvb-usb-\(dw\(210[124]\|3101\)\|s630\)\.fw' drivers/media/dvb/dvb-usb/dw2102.c
+
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]gp8psk_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/gp8psk.c
+ blobname 'dvb-usb-gp8psk-0[12]\.fw' drivers/media/dvb/dvb-usb/gp8psk.c
+
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]opera1_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/nova-t-usb2.c
+ blobname 'dvb-usb-opera-\(fpga-\)\?-01\.fw' drivers/media/dvb/dvb-usb/opera1.c
+
+ blobname 'dvb-fe-af9013\.fw' drivers/media/dvb/frontends/af9013_priv.h
+
+ blobname 'dvb-fe-bcm3510-01\.fw' drivers/media/dvb/frontends/bcm3510.c
+
+ blobname 'dvb-fe-cx24116\.fw' drivers/media/dvb/frontends/cx24116.c
+
+ blobname 'dvb-fe-nxt2002\.fw' drivers/media/dvb/frontends/nxt200x.c
+
+ blob '[/][*][\n][ ][*][ ]This[ ]driver[ ]needs[ ]two[ ]external[ ]firmware[ ]files[^*]*\([*]\+[^/*][^*]*\)*[*]*dvb-fe-or51132-\(vsb\|qam\)\.fw[^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]' drivers/media/dvb/frontends/or51132.c
+ blobname 'dvb-fe-or51132-\(vsb\|qam\)\.fw' drivers/media/dvb/frontends/or51132.c
+
+ blobname 'dvb-fe-or51211\.fw' drivers/media/dvb/frontends/or51211.c
+
+ blobname 'dvb-fe-sp887x\.fw' drivers/media/dvb/frontends/sp887x.c
+
+ blobname 'dvb-fe-tda10048-1\.0\.fw' drivers/media/dvb/frontends/tda10048.c
+
+ blobname '\(\(dvb\|tdmb\|isdbt\)_nova\|cmmb_vega\)_12mhz\(_b0\)\?\.inp' drivers/media/dvb/siano/smscoreapi.c
+
+ blobname '\(dvb[th]\(_bda\)\?\|tdmb\)_stellar_usb\.inp' drivers/media/dvb/siano/smsusb.c
+
+ blobname 'dvb-ttusb-dec-\(2000t\|2540t\|3000s\)\.fw' drivers/media/dvb/ttusb-dec/ttusb_dec.c
+
+ blobname 'hcwamc\.rfb' drivers/media/video/bt8xx/bttv-cards.c
+
+ blobname 'v4l-cx23418-dig\.fw' drivers/media/video/cx18/cx18-av-firmware.c
+ blobname 'v4l-cx23418-[ac]pu\.fw' drivers/media/video/cx18/cx18-firwmare.c
+
+ blobname 'v4l-cx23885-enc\.fw' 'drivers/media/video/cx23\(1xx\|885\)/cx23885-417.c'
+
+ blobname 'v4l-\(cx23\(885\|1xx\)-avcore-01\|cx25840\)\.fw' drivers/media/video/cx25840/cx25840-firmware.c
+
+ blobname 'v4l-cx2341x-\(enc\|dec\)\.fw' include/media/cr2341x.h
+
+ blobname 'v4l-cx2341x-init\.mpg' drivers/media/video/ivtv/ivtv-firwmare.c
+
+ blobname 'v4l-pvrusb2-\(2[49]\|73\)xxx-01\.fw' drivers/media/video/pvrusb2/pvrusb2-devattr.c
+
+ blobname 'f2255usb\.bin' drivers/media/video/s2255drv.c
+
+ blobname 'drx397xD\.\(A2\|B1\)\.fw' drivers/media/dvb/frontends/drx397xD_fw.h
+
+ accept '#define[ ]DIB0700_DEFAULT_DEVICE_PROPERTIES[ ]\\[\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^\n",]*,[ ]\\[\n]\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/dib0700_devices.c
+ blobname 'dvb-usb-dib0700-1\.[12]0\.fw' drivers/media/dvb/dvb-usb/dib0700_devices.c
+
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]nova_t_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/nova-t-usb2.c
+ blobname 'dvb-usb-nova-t-usb2-02\.fw' drivers/media/dvb/dvb-usb/nova-t-usb2.c
+
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]umt_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/umt-010.c
+ blobname 'dvb-usb-umt-010-02\.fw' drivers/media/dvb/dvb-usb/umt-010.c
+
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]ttusb2_properties\(_s2400\)\?[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/ttusb2.c
+ blobname 'dvb-usb-\(pctv-400e\|tt-s2400\)-01\.fw' drivers/media/dvb/dvb-usb/ttusb2.c
+
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]cxusb_bluebird_\(lgh064f\|dee1601\|lgz201\|dtt7579\|nano2_needsfirmware\)_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/cxusb.c
+ blobname 'dvb-usb-bluebird-0[12]\.fw' drivers/media/dvb/dvb-usb/cxusb.c
+
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]\(dtt200u\|wt220u\(_\(fc\|zl0353\|miglia\)\)\?\)_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/dtt200u.c
+ blobname 'dvb-usb-\(dtt200u-01\|wt220u-\(02\|fc03\|\(zl0353\|miglia\)-01\)\)\.fw' drivers/media/dvb/dvb-usb/dtt200u.c
+
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]vp7045_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/vp7045.c
+ blobname 'dvb-usb-vp7045-01\.fw' drivers/media/dvb/dvb-usb/vp7045.c
+
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]\(dibusb\(1_1\(_an2235\)\?\|2_0b\)\|artec_t1_usb2\)_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/dibusb-mb.c
+ blobname 'dvb-usb-\(dibusb-\(5\.0\.0\.11\|an2235-01\|6\.0\.0\.8\)\|adstech-usb2-02\)\.fw' drivers/media/dvb/dvb-usb/dibusb-mb.c
+
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]a800_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]=[ ]' drivers/media/dvb/dvb-usb/a800.c
+ blobname 'dvb-usb-avertv-a800-02\.fw' drivers/media/dvb/dvb-usb/a800.c
+
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]af9005_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]=[ ]' drivers/media/dvb/dvb-usb/af9005.c
+ blobname 'af9005\.fw' drivers/media/dvb/dvb-usb/af9005.c
+
+ accept '[ ][ ]\.download_firmware[ ]=[ ]af9015_download_firmware,[\n][ ][ ]\.firmware[ ]=[ ]' drivers/media/dvb/dvb-usb/af9015.c
+ blobname 'dvb-usb-af9015\.fw' drivers/media/dvb/dvb-usb/af9015.c
+
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]dibusb_mc_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/dibusb-mc.c
+ blobname 'dvb-usb-dibusb-6\.0\.0\.8\.fw' drivers/media/dvb/dvb-usb/dibusb-mc.c
+
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]\(megasky\|digivox_mini_ii\|tvwalkertwin\|dposh\)_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/m920x.c
+ blobname 'dvb-usb-\(\(megasky\|digivox\)-02\|tvwalkert\|dposh-01\)\.fw' drivers/media/dvb/dvb-usb/m920x.c
+
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]vp702x_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/vp702x.c
+ blobname 'dvb-usb-vp702x-02\.fw' drivers/media/dvb/dvb-usb/vp702x.c
+
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]digitv_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/digitv.c
+ blobname 'dvb-usb-digitv-02\.fw' drivers/media/dvb/dvb-usb/digitv.c
+
+ blob 'Driver:[ ]\(acenic\|ADAPTEC_STARFIRE\|cxgb3\|e100\|tigon3\|korg1212\|maestro3\|ymfpci\|smctr\|kaweth\|ttusb-budget\|keyspan\|emi26\|emi62\|t[iu]_usb_3410_5052\|whiteheat\|ip2\|CPiA2\|DABUSB\|USB_VICAM\|USB_SERIAL_EDGEPORT\(_TI\)\?\|SND_SB16_CSP\|CASSINI\|ambassador\|SCSI_\(ADVANSYS\|QLOGIC\(_1280\|PTI\)\)\|TEHUTI\|TYPHOON\|YAM\|3C359\|PCMCIA_\(PCNET\|SMC91C92\|3C5\(89\|74\)\)\|MYRI_SBUS\|BNX2\|bnx2x\|wavefront\|SERIAL_8250_CS\|mga\|r128\|radeon\|ib_qib\)\([ ]--*\|:\)[ ]\([^\n]\|[\n]*[^\n\-]\)*\([\n][\n]--*[\n][\n]\?Driver:[ ]\(acenic\|ADAPTEC_STARFIRE\|cxgb3\|e100\|tigon3\|korg1212\|maestro3\|ymfpci\|smctr\|kaweth\|ttusb-budget\|keyspan\|emi26\|emi62\|t[iu]_usb_3410_5052\|whiteheat\|ip2\|CPiA2\|DABUSB\|USB_VICAM\|USB_SERIAL_EDGEPORT\(_TI\)\?\|SND_SB16_CSP\|CASSINI\|ambassador\|SCSI_\(ADVANSYS\|QLOGIC\(_1280\|PTI\)\)\|TEHUTI\|TYPHOON\|YAM\|3C359\|PCMCIA_\(PCNET\|SMC91C92\|3C5\(89\|74\)\)\|MYRI_SBUS\|BNX2\|bnx2x\|wavefront\|SERIAL_8250_CS\|mga\|r128\|radeon\|ib_qib\)\([ ]--*\|:\)[ ]\([^\n]\|[\n]*[^\n\-]\)*\)*' firmware/WHENCE
+
+ blobname 'sms1xxx-\(stellar\|nova-[ab]\|hcw-55xxx\)-dvbt-0[12]\.fw' drivers/media/dvb/siano/sms-cards.c
+
+ accept '[ ][ ][ ][ ]mv[ ]["][$]ofile["][ ]["][$]ofile\.elf["]' arch/powerpc/boot/wrapper
+ accept '[ ][ ][ ][ ][$]objbin[/]mktree[ ]["][$]ofile\.elf["]' arch/powerpc/boot/wrapper
+ accept '[ ]rm[ ]-f[ ]["][$]ofile\.elf["]' arch/powerpc/boot/wrapper
+ accept '[ ][ ][ ][ ][$][{]CROSS[}]objcopy[ ]-O[ ]binary[ ]["][$]ofile["][ ]["][$]ofile\.bin["]' arch/powerpc/boot/wrapper
+ accept '[ ][ ][ ][ ]dd[ ]if=["][$]ofile\.bin["][ ]of=["][$]ofile\.bin["]' arch/powerpc/boot/wrapper
+ accept '[ ][ ][ ][ ]odir=["][$][(]dirname[ ]["][$]ofile\.bin["][)]["]' arch/powerpc/boot/wrapper
+ accept '[ ][ ][ ][ ]gzip[ ]--force[ ]-9[ ]--stdout[ ]["][$]ofile\.bin["][ ]>[ ]["][$]odir[/]otheros\.bld["]' arch/powerpc/boot/wrapper
+ accept '[ ]\.incbin[ ]["]arch[/]x86[/]kernel[/]acpi[/]realmode[/]wakeup\.bin["]' arch/x86/kernel/acpi/wakeup_rm.S
+ accept '[;]set[ ]executable[ ]["]2232\.bin["]' drivers/char/ser_a2232fw.ax
+
+ blobname 'di\(\(dn\|pr\)load\|diva\(pp\)\?\|hscx\|v110\|modem\|fax\|_etsi\|_\(1tr6\|belg\|franc\|atel\|ni\|5ess\|japan\|swed\)\|dspdld\)\.\(bin\|s[xyqm]\|p\)' drivers/isdn/hardware/eicon/cardtype.h
+ blobname 'dsp\(dload\|dqsig\|dvmdm\|dvfax\)\.bin' drivers/isdn/hardware/eicon/dsp_defs.h
+
+ blobname 'vicam[/]firmware\.fw' drivers/media/video/usbvideo/vicam.c
+
+ accept '#include[ ]["]ixp2400_[rt]x\.ucode["]' drivers/net/ixp2000/ixpdev.c
+
+ # New in 2.6.29
+ blobname 'acenic[/]tg[12]\.bin' drivers/net/acenic.c
+ blobname 'adaptec[/]starfire_[rt]x\.bin' drivers/net/starfire.c
+ blobname 'e100[/]d10\(1[ms]\|2e\)_ucode\.bin' drivers/net/e100.c
+ blobname 'tigon[/]tg3\(_tso5\?\)\?\.bin' drivers/net/tg3.c
+ blobname '\(ti_usb-v\(%04x\|[0-9a-f]*\)-p\(%04x\|[0-9a-f]*\)\|mts_\(cdma\|gsm\|edge\)\)\.\(bin\|fw\)' drivers/usb/serial/ti_usb_3410_5052.c
+ blobname 'iw\?\(2400\|6050\)m\?-fw-\(sdio\|usb\)-\(\(["][ ]I2400M_FW_VERSION[ ]["]\|[0-9.]*\)\.sbcf\|[^". \n]*\)' 'drivers/net/wimax/i2400m/\(sdio\|usb\)\.c'
+ blob '3\.[ ]Installing[ ]the[ ]firmware[^\n]*\([\n][\n]*[ ][ ][ ][^\n]*\)*[\n]*[$][^\n]*i2400m-fw[^\n]*\([\n][\n]*[ ][ ][ ][^\n]*\)*' Documentation/wimax/README.i2400m
+ blob '6\.1\.[ ]Driver[ ]complains[^\n]*i2400m-fw[^\n]*\([\n][\n]*\([ ][ ][ ]\|i2400m_usb\)[^\n]*\)*' Documentation/wimax/README.i2400m
+ accept '[ ][ ]ranges[ ]=[ ]<'"$blobpat*"'>[;]' 'arch/powerpc/boot/dts/\(mpc8572ds\|p2020ds\|katmai\)\.dts'
+ accept '\(div_table_\(clz\|inv\|ix\)\|zero_l\):\([\n][ ]\.\(byte[ ]-\?[0-9]*\|long[ ]0x[0-9A-F]*\)\)*' arch/sh/lib/udivsi3_i4i.S
+ defsnc 'const[ ]u32[ ]crypto_[fi][tl]_tab\[4\]\[256\][ ]=' crypto/aes_generic.c
+ accept '[ ][ ][ ]every[ ]driver[ ]which[ ]uses[ ]request_firmware[(][)][ ]and[ ]ships[ ]its' drivers/base/Kconfig
+ defsnc 'static[ ]const[ ]u32[ ]filter_table\[\][ ]=' drivers/gpu/drm/i915/intel_tv.c
+ defsnc 'static[ ]u8[ ]af9015_ir_table_\(avermedia\(_ks\)\?\|digittrade\|trekstor\)\[\][ ]=' drivers/media/dvb/dvb-usb/af9015.h
+ defsnc '[ ]static[ ]__u8[ ]lgdt3304_\(vsb8\|qam\(64\|256\)\)_data\[\][ ]=' drivers/media/dvb/frontends/lgdt3304.c
+ defsnc 'static[ ]u8[ ]\(init\|c\)_table\[\]=' drivers/media/dvb/frontends/s921_core.c
+ defsnc 'static[ ]\(const[ ]\)\?struct[ ]stb0899_tab[ ]stb0899_\(cn\|dvbs2\?rf\|quant\|est\)_tab\[\][ ]=' drivers/media/dvb/frontends/stb0899_drv.c
+ defsnc 'static[ ]const[ ]struct[ ]stb6100_lkup[ ]lkup\[\][ ]=' drivers/media/dvb/frontends/stb6100.c
+ initnc 'static[ ]const[ ]__u8[ ]ov\(534\|772x\)_reg_initdata\[\]\[2\][ ]=' drivers/media/video/gspca/ov534.c
+ defsc 'static[ ]const[ ]\(__\)\?u8[ ]\(mi\(0360\|13[12]0\)\|po\(1200\|3130\)\|hv7131r\|ov76[67]0\)_\(\(soc\)\?_\?[iI]nit\(Q\?V\|SX\)GA\(_\(JPG\|data\)\)\?\|rundata\)\[\]\[4\][ ]=' drivers/media/video/gspca/vc032x.c
+ defsnc 'static[ ]\(const[ ]\)\?u\(32\|_int32_t\)[ ]ar928[05]\(Common\|Modes\(_\(fast_clock\|backoff_[12]3db_rxgain\|\(original\|high_power\)_[tr]x_\?gain\)\)\?\)_928\(0_2\|5\(_1_2\)\?\)\[\]\[[236]\][ ]=' 'drivers/net/wireless/ath9k/\(ar9002_\)\?initvals\.h'
+ defsnc 'static[ ]u32[ ]channel_tbl\[15\]\[9\][ ]=' drivers/staging/agnx/rf.c
+ defsnc 'static[ ]const[ ]u32[\n]gain_table\[\][ ]=' drivers/staging/agnx/rf.c
+ accept '<[frs]:[0-9]*x[0-9]*>[\n][01 \n]*' 'drivers/staging/asus_oled/\(linux\(_fr\?\)\?\|tux\(_r2\?\)\?\|zig\).txt'
+ defsnc 'static[ ]unsigned[ ]char[ ]\(aud\|vid\)_regs\[\][ ]=' drivers/staging/go7007/s2250-board.c
+ defsnc 'static[ ]u16[ ]vid_regs_fp\[\][ ]=' drivers/staging/go7007/s2250-board.c
+ blobname 's2250\(_loader\)\?\.fw' drivers/staging/go7007/s2250-loader.c
+ blobna 'me_xilinx_download' 'drivers/staging/meilhaus/.*'
+ accept 'int[ ]me_xilinx_download[(]' 'drivers/staging/meilhaus/mefirmware\.[ch]'
+ blobname 'me46[01]0\(_bosch\)\?\.bin' drivers/staging/meilhaus/me4600_device.c
+ accept '\([ ]if[ ][(]me4600_device->base\.info\.pci\.device_id[ ]==[ ]PCI_DEVICE_ID_MEILHAUS_ME4610[)][ ][{][ ][/][/]Jekyll[ ]<=>[ ]me4610\|#ifdef[ ]BOSCH\|#else[ ][/][/]~BOSCH\)[\n][ ][ ]err[ ]=[\n][ ][ ][ ][ ][ ][ ]me_xilinx_download[(]me4600_device' drivers/staging/meilhaus/me4600_device.c
+ blobname 'me6000\.bin' drivers/staging/meilhaus/me6000_device.c
+ accept '[ ][/][*][ ]Download[ ]the[ ]xilinx[ ]firmware[ ][*][/][\n][ ]err[ ]=[ ]me_xilinx_download[(]me6000_device' drivers/staging/meilhaus/me6000_device.c
+ defsnc '[ ][}][ ]grtpkts\[\][ ]=' drivers/staging/mimio/mimio.c
+ defsnc 'u16_t[ ]zgTkipSbox\(Lower\|Upper\)\[256\][ ]=' drivers/staging/otus/80211core/ctkip.c
+ accept '[ ]*[/][*][ ]*0\([ ]*[123]\)*[ ]*[*][/][\n][ ]*[/][*][ ]0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9\([ ][0-9]\)*[ ][*][/]' drivers/staging/otus/80211core/ctxrx.c
+ defsnc 'u32_t[ ]crc32_tab\[\][ ]=' drivers/staging/otus/80211core/cwep.c
+ blob 'const[ ]u32_t[ ]zc\(DK\|P2\)\?Fw\(Buf\)\?Image\(SPI\)\?\(\[\][ ]*=[ ]*[{][^;]*[}]\|Size[ ]*=[ ]*[0-9]*\)[;]\([\n][\n]*const[ ]u32_t[ ]zc\(DK\|P2\)\?Fw\(Buf\)\?Image\(SPI\)\?\(\[\][ ]*=[ ]*[{][^;]*[}]\|Size[ ]*=[ ]*[0-9]*\)[;]\)*' 'drivers/staging/otus/hal/hp.*fwu.*\.c'
+ blob 'extern[ ]const[ ]u32_t[ ]zc\(DK\|P2\)\?Fw\(Buf\)\?Image\(SPI\)\?\(\[\]\|Size\)[;]\([\n]extern[ ]const[ ]u32_t[ ]zc\(DK\|P2\)\?Fw\(Buf\)\?Image\(SPI\)\?\(\[\]\|Size\)[;]\)*' drivers/staging/otus/hal/hpmain.c
+ defsnc '[ ][ ][ ][ ]u32_t[ ]eepromBoardData\[15\]\[6\][ ]=' drivers/staging/otus/hal/hpmain.c
+ defsnc 'static[ ]const[ ]u32_t[ ]channel_frequency_11A\[\][ ]=' drivers/staging/otus/ioctl.c
+ defsnc 'static[ ]const[ ]u32_t[ ]\(ar5416Modes\|otusBank\)\[\]\[[36]\][ ]=' drivers/staging/otus/hal/otus.ini
+ defsnc '[ ][ ][ ][ ]static[ ]UINT32[ ]MD5Table\[64\][ ]=' 'drivers/staging/rt28[67]0/common/md5\.c'
+ defsnc 'static[ ]uint32[ ][FR]Sb\[256\][ ]=' 'drivers/staging/rt28[67]0/common/\(md5\|cmm_aes\)\.c'
+ defsnc '\(UCHAR\|u8\)[ ]RateSwitchTable\(11B\?G\?\(N[123]S\(ForABand\)\?\)\?\)\?\[\][ ]=' 'drivers/staging/rt28[67]0/common/mlme\.c'
+ defsnc '\(UCHAR\|u8\)[ ]*ZeroSsid\[32\][ ]=' 'drivers/staging/rt28[67]0/common/mlme\.c'
+ defsnc '\(RTMP_RF_REGS\|struct[ ]rt_rtmp_rf_regs\)[ ]RF2850RegTable\[\][ ]=' 'drivers/staging/rt28[67]0/common/\(mlme\.c\|cmm_asic\.c\)'
+ defsnc '\(FREQUENCY_ITEM\|struct[ ]rt_frequency_item\)[ ]FreqItems3020\[\][ ]=' 'drivers/staging/rt28[67]0/common/\(mlme\.c\|cmm_asic\.c\)'
+ blob '\(UCHAR\|u8\)[ ]FirmwareImage\(_\(2870\|30[79]0\)\)\?[ ]\[\][ ]=[ ][{][^;]*[}][ ][;]' 'drivers/staging/rt\(28[67]\|30[79]\)0/common/firmware\(_3070\)\?\.h'
+ defsnc 'ULONG[ ][ ]*BIT32\[\][ ]=' 'drivers/staging/rt28[67]0/common/rtmp_init\.c'
+ defsnc 'const[ ]unsigned[ ]short[ ]ccitt_16Table\[\][ ]=' 'drivers/staging/rt\(28[67]0\|3090\)/common/rtmp_init\.c'
+ blobna '\(pFirmwareImage[ ]=\([ ]FirmwareImage\(_\(28[67]\|30[79]\)0\)\?\|[\n ]*[(]\(PUCHAR\|u8[ ][*]\)[)][&][\n ]*FirmwareImage\(_\(28\|30\)70\)\?\[FIRMWAREIMAGE\(V[12]\)\?_LENGTH\]\)\|File[lL]ength[ ]=[ ]\(sizeof[(]FirmwareImage[)]\|FIRMWAREIMAGE\(V[12]\|_MAX\)\?_LENGTH\)\)[;]\([\n ]*\(pFirmwareImage[ ]=\([ ]FirmwareImage\(_\(28[67]\|30[79]\)0\)\?\|[\n ]*[(]\(PUCHAR\|u8[ ][*]\)[)][&][\n ]*FirmwareImage\(_\(28\|30\)70\)\?\[FIRMWAREIMAGE\(V[12]\)\?_LENGTH\]\)\|File[lL]ength[ ]=[ ]\(sizeof[(]FirmwareImage[)]\|FIRMWAREIMAGE\(V[12]\|_MAX\)\?_LENGTH\)\)[;]\)*' 'drivers/staging/rt\(28[67]0\|30[79]0\)/common/rtmp_init\.c'
+ blobname 'rate\.bin' drivers/staging/rt2870/rtmp_init.c
+ defsnc '\(U\(INT\|CHAR\)\|u\(32\|8\)\)[ ]\(Tkip_Sbox_\(Lower\|Upper\)\|SboxTable\)\[256\][ ]=' 'drivers/staging/rt\(28[67]0\|3070\)/common/\(rtmp\|cmm\)_tkip\.c'
+ defsnc '\(UINT\|u32\)[ ]FCSTAB_32\[256\][ ]=' 'drivers/staging/rt\(28[67]0\|3070\)/common/\(rtmp\|cmm\)_wep\.c'
+ accept '[ ]*#[ ]*define[ ]\(STA_PROFILE\|CARD_INFO\)_PATH[ ]*["][/]etc[/]Wireless[/]RT\(28[67]\|307\)0STA[/]RT\(28[67]\|307\)0STA\(Card\)\?\.dat["]' 'drivers/staging/rt\(28[67]0\|3070\)/rt_linux\.h'
+ blobname '\([/]etc[/]Wireless[/]\)\?\(RT\(28[67]\|307\)0STA[/]\)\?\(RT\(28[67]\|307\)0STA\|rt28[67]0\)\.bin' 'drivers/staging/rt\(28[67]0\|3070\)/rt_linux\.h'
+ blobname '\([/]etc[/]Wireless[/]\)\?\(RT28[67]0STA[/]\)\?e2p\.bin' 'drivers/staging/rt\(28[67]0\|3070\)/rt_ate\.[hc]'
+ defsnc '\([ ][ ][ ][ ]\|[ ]\)u_int32_t[ ]ralinkrate\[256\][ ]=' 'drivers/staging/rt\(28[67]0\|3070\)/rt_linux\.c'
+ defsnc 'unsigned[ ]char[ ]\(QUALITY\|STRENGTH\)_MAP\[\][ ]=' drivers/staging/rtl8187se/r8180_core.c
+ defsnc 'u\(8\|16\|32\)[ ]rtl8225\(\(a\|bcd\?\)_rxgain\|agc\|tx_\(gain_cck\|power\)_ofdm\|tx_power_cck\(_ch14\)\?\)\[\]=' drivers/staging/rtl8187se/r8180_rtl8225.c
+ defsnc '\(static[ ]const[ ]\)\?u\(8\|16\|32\)[ ]\(rtl8225\(z2\)\?_\(threshold\|gain_\(a\|bg\)\|chan\|rxgain\|agc\|tx_\(gain_cck\|power\)_ofdm\|tx_power_cck\(_ch14\)\?\)\|ZEBRA2_CCK_OFDM_GAIN_SETTING\)\[\][ ]\?=' drivers/staging/rtl8187se/r8180_rtl8225z2.c
+ defsnc 'static[ ]short[ ]rtl8255_agc\[\]=' drivers/staging/rtl8187se/r8180_rtl8255.c
+ defsnc '[ ]\?static[ ]u\(8\|32\)[ ]\(MAC_REG_TABLE\[\]\[2\]\|[ ]*ZEBRA_\(AGC\|RF_RX_GAIN_TABLE\)\[\]\|OFDM_CONFIG\[\]\)=' drivers/staging/rtl8187se/r8185b_init.c
+ accept '[ ]-[ ]move[ ]firmware[ ]loading[ ]to[ ]request_firmware[(][)]' drivers/staging/slicoss/README
+ blobname '\(\(oasis\|gb\)_rcv\|slic_\(oasis\|mojave\)\)\.bin' drivers/staging/slicoss/slicoss.c
+
+ blob 'static[ ]unsigned[ ]char[ ]xilinx_firm\(_4610\)\?\[\][ ]=[ ][{]'"$sepx$blobpat*$sepx"'[}][;]' 'drivers/staging/me4000/me4\(00\|61\)0_firmware\.h'
+ blob 'static[ ]struct[ ]PHY_UCODE[ ]PhyUcode\[\][ ]=[^;]*[;]' drivers/staging/sxg/sxgphycode.h
+ blob 'static[ ]unsigned[ ]char[ ]SaharaUCode\[2\]\[57972\][ ]=[^;]*[;]' drivers/staging/sxg/saharadbgdownload.h
+ blob '#include[ ]["]\(sxgphycode\(-1\.2\)\?\|saharadbgdownload\)\.h["]\([\n][\n]*#include[ ]["]\(sxgphycode\(-1\.2\)\?\|saharadbgdownload\)\.h["]\)*' drivers/staging/sxg/sxg.c
+ blob 'static[ ]u8[ ]\(Mojave\|Oasis\)UCode\[2\]\[65536\][ ]=[^;]*[;]' 'drivers/staging/slicoss/\(gb\|oasis\(dbg\)\?\)download\.h'
+ blob 'static[ ]u8[ ]\(GB\|Oasis\)RcvUCode\[2560\][ ]=[^;]*[;]' 'drivers/staging/slicoss/\(gb\|oasis\)rcvucode\.h'
+ blob '#include[ ]["]\(gb\|oasis\)\(dbg\)\?\(download\|rcvucode\)\.h["]\([\n][\n]*#include[ ]["]\(gb\|oasis\)\(dbg\)\?\(download\|rcvucode\)\.h["]\)*' drivers/staging/slicoss/slicoss.c
+ blobna 'instruction[ ]=[ ][^;]*\(Oasis\|GB\|Mojave\)\(Rcv\)\?UCode[^:}]*[;]' drivers/staging/slicoss/slicoss.c
+ blobna 'seq_printf[(]seq[,][ ]["][^"]*%s[ ]%s[^"]*["][,][ \n]*\(GB_RCV\|MOJAVE_\)UCODE_VERS_STRING[,][ ]\(GB_RCV\|MOJAVE_\)UCODE_VERS_DATE[)][;]\([ \n]*seq_printf[(]seq[,][ ]["][^"]*%s[ ]%s[^"]*["][,][ \n]*\(GB_RCV\|MOJAVE_\)UCODE_VERS_STRING[,][ ]\(GB_RCV\|MOJAVE_\)UCODE_VERS_DATE[)][;]\)*' drivers/staging/slicoss/slicoss.c
+ blobna 'numsects[ ]=[ ][OM]NumSections[;][\n][ ]*for[ ][(][^;]*[;][^;]*[;][^;{]*[)][ ][{][\n][^}]*[\n][ ][ ][}]' drivers/staging/slicoss/slicoss.c
+
+ # post 2.6.29 patches
+ defsnc 'static[ ]int[ ]atom_dst_to_src\[8\]\[4\][ ]=' drivers/gpu/drm/radeon/atom.c
+ defsnc 'const[ ]unsigned[ ]char[ ]map_table\[\][ ]=' drivers/input/lirc/lirc_ttusbir.c
+ defsnc '\(static[ ]\)\?\(const[ ]\)\?struct[ ]au8522_register_config[ ]lpfilter_coef\[\][ ]=' drivers/media/dvb/frontends/au8522_decoder.c
+ defsnc 'static[ ]const[ ]u8[ ]jpeg_head\[\][ ]=' drivers/media/video/gspca/jpeg.h
+ defsnc 'static[ ]const[ ]u8[ ]\(bridge\|sensor\)_init_ov\(7[27]2x\|965x\(_2\)\?\)\[\]\[2\][ ]=' drivers/media/video/gspca/ov534.c
+ defsnc '[ ]static[ ]const[ ]u8[ ]probe_tb\[\]\[4\]\[8\][ ]=' drivers/media/video/gspca/sonixj.c
+ defsnc 'static[ ]const[ ]u8[ ]eeprom_data\[\]\[3\][ ]=' drivers/media/gspca/tv8532.c
+ defsnc '\(static[ ]uint32_t\|[}]\)[ ]nv04_graph_ctx_regs[ ]\?\[\][ ]=' drivers/char/drm/nv04_graph.c
+ defsnc 'static[ ]int[ ]nv10_graph_ctx_regs[ ]\?\[\][ ]=' drivers/char/drm/nv10_graph.c
+
+ # This looks suspicious, but it pretty much just sets stuff to zero.
+ initnc 'static[ ]__u8[ ]mode8420\(pro\|con\)\[\][ ]=' drivers/media/video/cs8420.h
+
+ # quite suspicious
+ # arch/parisc/kernel/perf_images.h
+ initc 'static[ ]uint32_t[ ]onyx_images\[\]\[PCXU_IMAGE_SIZE[/]sizeof[(]uint32_t[)]\][ ]__read_mostly[ ]='
+ initc 'static[ ]uint32_t[ ]cuda_images\[\]\[PCXW_IMAGE_SIZE[/]sizeof[(]uint32_t[)]\][ ]__read_mostly[ ]='
+
+ # These are regarded as ok
+ initnc 'static[ ]const[ ]u8[ ]SN9C102_\(Y\|UV\)_QTABLE[01]\[64\][ ]=[ ][{]'
+ initnc '[ ]static[ ]\(const[ ]\)\?u8[ ]jpeg_header\[589\][ ]=[ ][{]' media/video/sn9c102/sn9c102_core.c
+ accept '[ ][ ]\?err[ ]=[ ]sn9c102_write_const_regs[(]cam\(,[ \n]\+[{]0x[0-9a-fA-F][0-9a-fA-F],[ ]0x[0-9a-fA-F][0-9a-fA-F][}]\)*[)][;]'
+
+ # too lax?
+ defsnc 'static[ ]yyconst[ ]\(flex_int\(16\|32\)_t\|\(\(short[ ]\)\?int\)\)[ ]yy_[^[]*\[[][0-9]*\][ ]='
+ defsnc 'static[ ]const[ ]\(yytype_u\?int\(8\|16\)\|\(unsigned[ ]\)\?\(short\([ ]int\)\?\|char\)\)[ ]yy[^[]*\[\][ ]='
+ defsnc '\([ ]\)\?static[ ]\(const[ ]\)\?\(unsigned[ ]\(short\|char\)\|struct[ ]SiS_[^ ]*\)[ ]SiS[^[]*\(\[[][ *0-9]*\]\)\+[ ]*='
+
+ initnc 'static[ ]const[ ]a3d_Hrtf_t[ ]A3dHrirZeros[ ]=[ ][{]'
+ initnc 'static[ ]const[ ]a3d_Hrtf_t[ ]A3dHrirImpulse[ ]=[ ][{]'
+ initnc 'static[ ]const[ ]a3d_Hrtf_t[ ]A3dHrirOnes[ ]=[ ][{]'
+ initnc 'static[ ]const[ ]a3d_Hrtf_t[ ]A3dHrirSatTest[ ]=[ ][{]'
+ initnc 'static[ ]const[ ]a3d_Hrtf_t[ ]A3dHrirDImpulse[ ]=[ ][{]'
+ initnc 'static[ ]const[ ]a3d_ItdDline_t[ ]A3dItdDlineZeros[ ]=[ ][{]'
+ initnc 'static[ ]auxxEqCoeffSet_t[ ]asEqCoefsNormal[ ]=[ ][{]'
+ initnc 'static[ ]xtalk_dline_t[ ]const[ ]alXtalkDlineTest[ ]=[ ][{]'
+ initnc 'static[ ]struct[ ]nand_ecclayout[ ]rtc_from4_nand_oobinfo[ ]=[ ][{]'
+ initnc 'static[ ]const[ ]s16[ ]tempLUT\[\][ ]='
+ initnc 'static[ ]const[ ]u8[ ]viaLUT\[\][ ]='
+ initnc 'static[ ]struct[ ][{][ ]int[ ]xres,[ ]yres,[ ]left,[ ]right,[ ]upper,[ ]lower,[ ]hslen,[ ]vslen,[ ]vfreq[;][ ][}][ ]timmings\[\][ ]__initdata[ ]=[ ][{]'
+ initnc 'static[ ]struct[ ]platinum_regvals[ ]platinum_reg_init_[0-9]*[ ]=[ ][{]'
+ initnc '[}][ ]sisfb_ddc[sf]modes\[\][ ]__devinitdata[ ]='
+ initnc 'static[ ]struct[ ]dvb_pll_desc[ ][^\n]*[ ]=[ ][{]'
+ initnc 'static[ ]u32[ ]LABELPATCHES\[\][ ]__attribute[(][(]unused[)][)][ ]='
+
+ initnc 'static[ ]dbdev_tab_t[ ]dbdev_tab\[\][ ]='
+ accept '\(EXP\|LOG\|ATAN\)TBL:'"$sepx$blobpat*"
+ initnc 'static[ ]char[ ]fm_volume_table\[128\][ ]='
+ initnc 'unsigned[ ]int[ ]snd_gf1_scale_table\[SNDRV_GF1_SCALE_TABLE_SIZE\][ ]='
+ # remaining after original deblob_2_6_24, not fully checked
+
+ oprepline '#define[ ]OV51[18]_\(Y\|UV\)QUANTABLE[ ][{]'
+ initnc '[ ][ ]static[ ]unsigned[ ]char[ ]const[ ]data_bit\[64\][ ]='
+ initnc '[ ][ ]static[ ]const[ ]u8[ ]data_sbit\[32\][ ]='
+ initnc '[ ]\.RightCoefs[ ]='
+ initnc '[ ]#define[ ]WakeupSeq[ ][ ][ ][ ][{]'
+ initnc '[ ]SetRate44100\[\][ ]='
+ initnc '[ ]const[ ]short[ ]period\[32\][ ]='
+ defsnc '[ ]\(const[ ]static\|static[ ]const\)[ ]int[ ]desc_idx_table\[\][ ]=' 'arch/arm/include/asm/hardware/iop3xx-adma.h|include/asm-arm/hardware/iop3xx-adma.h'
+ initnc '[ ]int[ ]prop_bcomm_irq\[3[*]16\][ ]='
+ initnc '[ ]static[ ]char[ ]logSlopeTable\[128\][ ]='
+ initnc '[ ]static[ ]const[ ]int[ ]uc_\(dup\|word\)_table\[\]\[2\][ ]='
+ initnc '[ ]static[ ]const[ ]struct[ ]mc7_timing_params[ ]mc7_timings\[\][ ]='
+ initnc '[ ]static[ ]const[ ]u8[ ]biphase_tbl\[\][ ]='
+ initnc '[ ]static[ ]const[ ]u8[ ]cs170\[7[ ][*][ ]8\][ ]='
+ initnc '[ ]static[ ]const[ ]u8[ ]cs3[13]a\[8[ ][*][ ]4\][ ]='
+ initnc '[ ]static[ ]const[ ]u8[ ]dramsr13\[12[ ][*][ ]5\][ ]='
+ defsnc '[ ]static[ ]const[ ]u8[ ]log10\[\][ ]=' drivers/net/wireless/zd1211rw/zd_chip.c
+ initnc '[ ]static[ ]const[ ]u8[ ]mpeg_hdr_data\[\][ ]='
+ initnc '[ ]static[ ]const[ ]u8[ ]sdramtype\[13\]\[5\][ ]='
+ initnc '[ ]static[ ]const[ ]u8[ ]t\[\][ ]='
+ initnc '[ ]static[ ]const[ ]unsigned[ ]int[ ]avg_pkts\[NCCTRL_WIN\][ ]='
+ initnc '[ ]static[ ]const[ ]unsigned[ ]short[ ]ac97_defaults\[\][ ]='
+ initnc '[ ]static[ ]int[ ]exp_lut\[256\][ ]='
+ initnc '[ ]static[ ]u16[ ]jpeg_tables\[\]\[70\][ ]='
+ initnc '[ ]static[ ]u16[ ]tables\[\][ ]='
+ initnc '[ ]static[ ]u32[ ]logMagTable\[128\][ ]='
+ initnc '[ ]static[ ]u8[ ]init_bufs\[13\]\[5\][ ]='
+ initnc '[ ]static[ ]u8[ ]sine[ ]\[\][ ]='
+ initnc '[ ]static[ ]u_short[ ]geometry_table\[\]\[[45]\][ ]='
+ initnc '[ ]static[ ]unsigned[ ]char[ ]CRCTable1\[\][ ]='
+ initnc '[ ]static[ ]unsigned[ ]char[ ]CRCTable2\[\][ ]='
+ initnc '[ ]static[ ]unsigned[ ]char[ ]default_colors\[\][ ]='
+ initnc '[ ]static[ ]unsigned[ ]char[ ]iso_regs\[8\]\[4\][ ]='
+ initnc '[ ]static[ ]unsigned[ ]char[ ]log_scale\[101\][ ]=' sound/oss/pss.c
+ initnc '[ ]static[ ]unsigned[ ]char[ ]msg\[\][ ]='
+ initnc '[ ]static[ ]unsigned[ ]char[ ]static_pad\[\][ ]='
+ initnc '[ ]static[ ]unsigned[ ]char[ ]table_alaw2ulaw\[\][ ]='
+ initnc '[ ]static[ ]unsigned[ ]char[ ]table_ulaw2alaw\[\][ ]='
+ defsnc '[ ]\(static[ ]const[ ]\)\?u32[ ]reg_boundaries\[\][ ]=' drivers/net/bnx2.c
+ initnc '[ ]u8[ ]b\[\][ ]='
+ initnc '[ ]uint8_t[ ]tx\[\][ ]='
+ initnc '[ ]unsigned[ ]char[ ]saa7111_regs\[\][ ]='
+ initnc '[ ]unsigned[ ]char[ ]sas_pcd_m_pg\[\][ ]='
+ initnc '[ ][}][ ]modedb\[5\][ ]='
+ defsnc '[ ][}][ ]reg_tbl\[\][ ]=' drivers/net/bnx2.c
+ initnc '[ ][}][ ]vals\[\][ ]='
+ initnc '[ ][}][ ]vm_devices\[\][ ]='
+ initnc '[ ][ ][ ][ ]static[ ]const[ ]code[ ]distfix\[32\][ ]='
+ initnc '[ ][ ][ ][ ]static[ ]const[ ]code[ ]lenfix\[512\][ ]='
+ defsnc '[ ][ ]int[ ]poly\[\]=' drivers/net/pcmcia/nmclan_cs.c
+ defsnc '[ ][ ]static[ ]const[ ]unsigned[ ]char[ ]asso_values\[\][ ]=' scripts/genksyms/keywords.c_shipped
+ defsnc '[ ][ ]static[ ]unsigned[ ]char[ ]asso_values\[\][ ]=' scripts/kconfig/zconf.hash.c_shipped
+ initnc '[ ][ ][}][ ]cards_ds\[\][ ]='
+ initnc '[ ][ ][ ][ ]static[ ]const[ ]int8[ ]countLeadingZerosHigh\[\][ ]='
+ initnc '[ ][ ][ ][ ]static[ ]const[ ]unsigned[ ]short[ ]d\(base\|ext\)\[32\][ ]='
+ initnc '#define[ ]OV511_QUANTABLESIZE[ ]64'
+ initnc 'BYTE[ ]BtCard::SRAMTable_\(NTSC\|PAL\)\[\][ ]='
+ initnc 'BYTE[ ]SRAMTable\[\]\[[ ]60[ ]\][ ]='
+ accept 'irq_prio_\([hdl]\|l[cd]\):'"$sepx$blobpat*" 'arch/arm/inlcude/asm/hardware/entry-macro-iomd.S|include/asm-arm/hardware/entry-macro-iomd.S'
+ initc '__u8[ ]_ascebc\[256\][ ]='
+ initc '__u8[ ]_ebc_tolower\[256\][ ]='
+ initc '__u8[ ]_ebc_toupper\[256\][ ]='
+ initnc 'adapter_tag_info_t[ ]aic7[9x]xx_tag_info\[\][ ]='
+ initnc 'char[ ]dmasound_alaw2dma8\[\][ ]='
+ initnc 'char[ ]dmasound_ulaw2dma8\[\][ ]='
+ initnc 'const[ ]struct[ ]aper_size_info_16[ ]agp3_generic_sizes\[AGP_GENERIC_SIZES_ENTRIES\][ ]='
+ initnc 'const[ ]u16[ ]crc_itu_t_table\[256\][ ]='
+ initnc 'const[ ]u8[ ]byte_rev_table\[256\][ ]='
+ initnc 'const[ ]u8[ ]crc7_syndrome_table\[256\][ ]='
+ initnc 'int[ ]snd_sf_vol_table\[128\][ ]='
+ initnc 'static[ ]u_char[ ]irq_to_siubit\[\][ ]='
+ initnc 'static[ ]u_char[ ]irq_to_siureg\[\][ ]='
+ initnc 'static[ ]Byte_t[ ]RData\[RDATASIZE\][ ]='
+ initnc 'static[ ]__const__[ ]__u16[ ]gx_coeff\[256\][ ]='
+ initnc 'static[ ]__u8[ ]init7121ntsc\[\][ ]='
+ initnc 'static[ ]__u8[ ]init7121pal\[\][ ]='
+ initnc 'static[ ]byte[ ]capidtmf_leading_zeroes_table\[0x100\][ ]='
+ defsnc 'static[ ]char[ ]channel_map_madi_[sdq]s\[HDSPM_MAX_CHANNELS\][ ]=' sound/pci/rme9652/hdspm.c
+ initnc 'static[ ]char[ ]coefficients\[NM_TOTAL_COEFF_COUNT[ ][*][ ]4\][ ]='
+ initnc 'static[ ]char[ ]ecc_syndrome_table\[\][ ]='
+ initnc 'static[ ]char[ ]isdn_audio_alaw_to_ulaw\[\][ ]='
+ initnc 'static[ ]char[ ]isdn_audio_ulaw_to_alaw\[\][ ]='
+ initnc 'static[ ]char[ ]mix_cvt\[101\][ ]='
+ initnc 'static[ ]char[ ]opl3_volume_table\[128\][ ]='
+ initnc 'static[ ]const[ ]__u16[ ]crc10_table\[256\][ ]='
+ initnc 'static[ ]const[ ]__u32[ ]crc_c\[256\][ ]='
+ initnc 'static[ ]const[ ]fixp_t[ ]cos_table\[46\][ ]='
+ initnc 'static[ ]const[ ]int[ ]init_seq\[\][ ]='
+ initnc 'static[ ]const[ ]int[ ]mobile_vid_table\[32\][ ]='
+ initnc 'static[ ]const[ ]s16[ ]snd_opl4_pitch_map\[0x600\][ ]='
+ initnc 'static[ ]const[ ]s8[ ]budtab\[256\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]aper_size_info_8[ ]via_generic_sizes\[9\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]color[ ]clut_vga16\[16\][ ]='
+ defsnc 'static[ ]const[ ]struct[ ]gain_entry[ ]gain_table\[2\]\[108\][ ]=' drivers/net/wireless/iwl-4965.c
+ defsnc 'static[ ]const[ ]struct[ ]mV_pos[ ]__\(cpu\)\?initdata[ ]mobilevrm_mV\[32\][ ]=' arch/x86/kernel/cpu/cpufreq/longhaul.h
+ defsnc 'static[ ]const[ ]struct[ ]mV_pos[ ]__\(cpu\)\?initdata[ ]vrm85_mV\[32\][ ]=' arch/x86/kernel/cpu/cpufreq/longhaul.h
+ initnc 'static[ ]const[ ]struct[ ]menelaus_vtg_value[ ]vcore_values\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]opl4_region[ ]regions_[0-9a-frums]*\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]regval[ ]regval_table\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_5222\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_5225_2527\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_5226\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_bg\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_bg_2522\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_bg_2523\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_bg_2524\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_bg_2525\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_bg_2525e\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_bg_2528\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_noseq\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_seq\[\][ ]='
+ defsnc 'static[ ]const[ ]u16[ ]Sbox\[256\][ ]=' # 'drivers/staging/rtl8192u/r819xU_firmware.c' and elsewhere
+ initnc 'static[ ]const[ ]u16[ ]count_lut\[\][ ]=' drivers/misc/tsl2550.c
+ defsnc 'static[ ]const[ ]u16[ ]e1000_igp_2_cable_length_table\[\][ ]=' drivers/net/e1000e/phy.c
+ defsnc 'static[ ]const[ ]u16[ ]rtl8225\(bcd\|z2\)_rxgain\[\][ ]=' 'drivers/net/wireless/rtl818x/rtl818[07]/rtl8225\.c'
+ defsnc 'static[ ]const[ ]u16[ ]stufftab\[5[ ][*][ ]256\][ ]=' drivers/isdn/gigaset/isocdata.c
+ initnc 'static[ ]const[ ]u16[ ]tkip_sbox\[256\][ ]='
+ defsnc 'static[ ]const[ ]u16[ ]wm8753_reg\[\][ ]=' sound/soc/codecs/wm8753.c
+ initnc 'static[ ]const[ ]u32[ ]SS[0-3]\[256\][ ]='
+ initnc 'static[ ]const[ ]u32[ ]S[1-8]\[64\][ ]='
+ initnc 'static[ ]const[ ]u32[ ]T[0-5]\[256\][ ]='
+ initnc 'static[ ]const[ ]u32[ ]Tm\[24\]\[8\][ ]='
+ initnc 'static[ ]const[ ]u32[ ]bass_table\[41\]\[5\][ ]='
+ initnc 'static[ ]const[ ]u32[ ]bf_sbox\[256[ ][*][ ]4\][ ]='
+ defsnc 'static[ ]const[ ]u32[ ]camellia_sp0222\[256\][ ]=' crypto/camellia.c
+ defsnc 'static[ ]const[ ]u32[ ]camellia_sp1110\[256\][ ]=' crypto/camellia.c
+ defsnc 'static[ ]const[ ]u32[ ]camellia_sp3033\[256\][ ]=' crypto/camellia.c
+ defsnc 'static[ ]const[ ]u32[ ]camellia_sp4404\[256\][ ]=' crypto/camellia.c
+ initnc 'static[ ]const[ ]u32[ ]crc32c_table\[256\][ ]='
+ initnc 'static[ ]const[ ]u32[ ]db_table\[101\][ ]='
+ initnc 'static[ ]const[ ]u32[ ]m8xx_size_to_gray\[M8XX_SIZES_NO\][ ]='
+ initnc 'static[ ]const[ ]u32[ ]mds\[4\]\[256\][ ]='
+ initnc 'static[ ]const[ ]u32[ ]pc2\[1024\][ ]='
+ initnc 'static[ ]const[ ]u32[ ]s[1-7]\[256\][ ]='
+ initnc 'static[ ]const[ ]u32[ ]sb8\[256\][ ]='
+ initnc 'static[ ]const[ ]u32[ ]tfrc_calc_x_lookup\[TFRC_CALC_X_ARRSIZE\]\[2\][ ]='
+ initnc 'static[ ]const[ ]u32[ ]treble_table\[41\]\[5\][ ]='
+ initnc 'static[ ]const[ ]u64[ ][CT][0-7]\[256\][ ]='
+ initnc 'static[ ]const[ ]u64[ ]sbox[1-4]\[256\][ ]='
+ initnc 'static[ ]const[ ]u64[ ]sha512_K\[80\][ ]=' 'crypto/sha512\(_generic\)\?.c'
+ initnc 'static[ ]const[ ]u8[ ]Tr\[4\]\[8\][ ]='
+ initnc 'static[ ]const[ ]u8[ ]aes_sbox\[256\][ ]='
+ initnc 'static[ ]const[ ]u8[ ]calc_sb_tbl\[512\][ ]='
+ initnc 'static[ ]const[ ]u8[ ]exp_to_poly\[492\][ ]='
+ initnc 'static[ ]const[ ]u8[ ]legal_ansi_char_array\[0x40\][ ]='
+ initnc 'static[ ]const[ ]u8[ ]parity\[\][ ]='
+ initnc 'static[ ]const[ ]u8[ ]pc1\[256\][ ]='
+ initnc 'static[ ]const[ ]u8[ ]poly_to_exp\[255\][ ]='
+ initnc 'static[ ]const[ ]u8[ ]q[01]\[256\][ ]='
+ defsnc 'static[ ]const[ ]u8[ ]ratio_lut\[\][ ]=' drivers/misc/tsl2550.c
+ initnc 'static[ ]const[ ]u8[ ]rs\[256\][ ]='
+ defsnc 'static[ ]const[ ]u8[ ]rtl8225_\(agc\|tx_\(power\|gain\)_cck\(_ch14\|_ofdm\)\?\)\[\][ ]=' 'drivers/net/wireless/rtl818x/rtl818[07]/rtl8225\.c'
+ initnc 'static[ ]const[ ]u_char[ ]irq_to_siubit\[\][ ]='
+ initnc 'static[ ]const[ ]u_char[ ]irq_to_siureg\[\][ ]='
+ initnc 'static[ ]const[ ]uint8_t[ ]parity\[256\][ ]='
+ initnc 'static[ ]const[ ]unsigned[ ]char[ ]\(UV\|Y\)_QUANTABLE\[64\][ ]='
+ defsnc 'static[ ]const[ ]unsigned[ ]char[ ]__\(cpu\)\?initdata[ ]mV_mobilevrm\[32\][ ]=' arch/x86/kernel/cpu/cpufreq/longhaul.h
+ defsnc 'static[ ]const[ ]unsigned[ ]char[ ]__\(cpu\)\?initdata[ ]mV_vrm85\[32\][ ]=' arch/x86/kernel/cpu/cpufreq/longhaul.h
+ initnc 'static[ ]const[ ]unsigned[ ]char[ ]barco_p1\[2\]\[9\]\[7\]\[3\][ ]='
+ initnc 'static[ ]const[ ]unsigned[ ]char[ ]bitcounts\[256\][ ]='
+ initnc 'static[ ]const[ ]unsigned[ ]char[ ]blue\[256\][ ]='
+ initnc 'static[ ]const[ ]unsigned[ ]char[ ]chktab[hl]\[256\][ ]='
+ initnc 'static[ ]const[ ]unsigned[ ]char[ ]comet_miireg2offset\[32\][ ]='
+ initnc 'static[ ]\(const[ ]\)\?unsigned[ ]char[ ]euc2sjisibm_g3upper_map\[\]\[2\][ ]='
+ initnc 'static[ ]const[ ]unsigned[ ]char[ ]green\[256\][ ]='
+ initnc 'static[ ]const[ ]unsigned[ ]char[ ]hash_table_ops\[64[*]4\][ ]='
+ defsnc 'static[ ]const[ ]unsigned[ ]char[ ]hid_keyboard\[256\][ ]=' drivers/hid/hid-input.c
+ initnc 'static[ ]const[ ]unsigned[ ]char[ ]mts_direction\[256[/]8\][ ]='
+ initnc 'static[ ]const[ ]unsigned[ ]char[ ]red\[256\][ ]='
+ initnc 'static[ ]\(const[ ]\)\?unsigned[ ]char[ ]sjisibm2euc_map\[\]\[2\][ ]='
+ initnc 'static[ ]const[ ]unsigned[ ]char[ ]vol_cvt_datt\[128\][ ]='
+ initnc 'static[ ]const[ ]unsigned[ ]int[ ]MulIdx\[16\]\[16\][ ]='
+ initnc 'static[ ]const[ ]unsigned[ ]int[ ]crctab32\[\][ ]='
+ initnc 'static[ ]const[ ]unsigned[ ]short[ ]crc_flex_table\[\][ ]='
+ initnc 'static[ ]const[ ]unsigned[ ]short[ ]logtable\[256\][ ]='
+ initnc 'static[ ]const[ ]unsigned[ ]short[ ]wd7000_iobase\[\][ ]='
+ defsnc 'static[ ]const[ ]unsigned[ ]short[ ]x86_keycodes\[256\][ ]=' drivers/tty/vt/keyboard.c
+ initnc 'static[ ]const[ ]unsigned[ ]table\[\][ ]='
+ initnc 'static[ ]int[ ]MV300_reg_8bit\[256\][ ]\?=' drivers/video/atafb.c
+ defsnc 'static[ ]int[ ]fifo_map\[\]\[MAX_TX_FIFOS\][ ]=' drivers/net/s2io.h
+ initnc 'static[ ]int[ ]initial_lfsr\[\][ ]='
+ initnc 'static[ ]int[ ]log_tbl\[129\][ ]='
+ initnc 'static[ ]int[ ]miro_fmtuner\[\][ ][ ]=' drivers/media/video/bt8xx/bt-cards.c
+ initnc 'static[ ]int[ ]miro_tunermap\[\][ ]=' drivers/media/video/bt8xx/bt-cards.c
+ initnc 'static[ ]int[ ]register_size\[\][ ]='
+ initnc 'static[ ]int[ ]reserve_list\[MAX_RES_ARGS\][ ]='
+ initnc 'static[ ]int[ ]reverse6\[64\][ ]='
+ initnc 'static[ ]short[ ]attack_time_tbl\[128\][ ]='
+ defsnc 'static[ ]short[ ]beep_wform\[256\][ ]=' 'sound/ppc/beep.c|sound/oss/dmasound/dmasound_awacs.c|arch/ppc/8xx_io/cs4218_tdm.c'
+ initnc 'static[ ]short[ ]decay_time_tbl\[128\][ ]='
+ initnc 'static[ ]short[ ]isdn_audio_[ua]law_to_s16\[\][ ]='
+ initnc 'static[ ]struct[ ]iwl\(3945\)\?_tx_power[ ]power_gain_table\[2\]\[IWL_MAX_GAIN_ENTRIES\][ ]='
+ initnc 'static[ ]struct[ ]ovcamchip_regvals[ ]regvals_init_\(76be\|7[16]20\|7x10\)\[\][ ]='
+ initnc 'static[ ]struct[ ]regval_list[ ]ov7670_default_regs\[\][ ]='
+ initnc 'static[ ]struct[ ]s_c2[ ]SetRate48000\[\][ ]='
+ initnc 'static[ ]struct[ ]tea6420_multiplex[ ]TEA6420_line\[MXB_AUDIOS[+]1\]\[2\][ ]='
+ initnc 'static[ ]struct[ ]wm_info[ ]i810_wm_16_100\[\][ ]='
+ initnc 'static[ ]struct[ ]wm_info[ ]i810_wm_16_133\[\][ ]='
+ initnc 'static[ ]struct[ ]wm_info[ ]i810_wm_24_100\[\][ ]='
+ initnc 'static[ ]struct[ ]wm_info[ ]i810_wm_24_133\[\][ ]='
+ initnc 'static[ ]struct[ ]wm_info[ ]i810_wm_8_100\[\][ ]='
+ initnc 'static[ ]struct[ ]wm_info[ ]i810_wm_8_133\[\][ ]='
+ initnc 'static[ ]struct[ ][{][ ]struct[ ]fb_bitfield[ ]red,[ ]green,[ ]blue,[ ]transp[;][ ]int[ ]bits_per_pixel[;][ ][}][ ]colors\[\][ ]='
+ initnc 'static[ ]u16[ ]asEqCoefsPipes\[64\][ ]='
+ initnc 'static[ ]u16[ ]asEqCoefsZeros\[50\][ ]='
+ initnc 'static[ ]u16[ ]asEqOutStateZeros\[48\][ ]='
+ initnc 'static[ ]u16[ ]default_key_map[ ]\[256\][ ]='
+ initnc 'static[ ]u16[ ]eq_levels\[64\][ ]='
+ initnc 'static[ ]u32[ ][ ]crc32tab\[\][ ]__attribute__[ ][(][(]aligned[(]8[)][)][)][ ]='
+ initnc 'static[ ]u32[ ]ac3_frames\[3\]\[32\][ ]='
+ initnc 'static[ ]u32[ ]adwDecim8\[33\][ ]='
+ initnc 'static[ ]u32[ ]h_prescale\[64\][ ]='
+ initnc 'static[ ]u32[ ]v_gain\[64\][ ]='
+ initnc 'static[ ]u8[ ]SRAM_Table\[\]\[60\][ ]='
+ initnc 'static[ ]u8[ ]alps_tdee4_stv0297_inittab\[\][ ]='
+ defsnc 'static[ ]u8[ ]bnx2_570[68]_stats_len_arr\[BNX2_NUM_STATS\][ ]=' drivers/net/bnx2.c
+ initnc 'static[ ]u8[ ]flit_desc_map\[\][ ]='
+ defsnc 'static[ ]\(const[ ]\)\?u8[ ]init_tab[ ]\?\[\][ ]=' 'drivers/media/dvb/frontends/cx2270\(0\|2\)\.c'
+ defsnc 'static[ ]u8[ ]mac_reader\[\][ ]=' drivers/net/wireless/atmel.c
+ initnc 'static[ ]u8[ ]mt2131_config1\[\][ ]=' drivers/media/dvb/frontends/mt2131.c # <= 2.6.25
+ initnc 'static[ ]u8[ ]mt2131_config1\[\][ ]=' drivers/media/common/tuners/mt2131.c # >= 2.6.26
+ initnc 'static[ ]u8[ ]mt2266_init2\[\][ ]=' drivers/media/dvb/frontends/mt2266.c # <= 2.6.25
+ initnc 'static[ ]u8[ ]mt2266_init2\[\][ ]=' drivers/media/common/tuners/mt2266.c # >= 2.6.26
+ initnc 'static[ ]u8[ ]opera1_inittab\[\][ ]='
+ initnc 'static[ ]u8[ ]saa7113_init_regs\[\][ ]='
+ initnc 'static[ ]u8[ ]samsung_tbmu24112_inittab\[\][ ]='
+ initnc 'static[ ]u8[ ]w1_crc8_table\[\][ ]='
+ initnc 'static[ ]u_char[ ]const[ ]data_sizes_32\[32\][ ]='
+ initnc 'static[ ]u_long[ ]ident_map\[32\][ ]='
+ initnc 'static[ ]u_short[ ]alt_map\[NR_KEYS\][ ]='
+ initnc 'static[ ]u_short[ ]altgr_map\[NR_KEYS\][ ]='
+ initnc 'static[ ]u_short[ ]ctrl_alt_map\[NR_KEYS\][ ]='
+ initnc 'static[ ]u_short[ ]ctrl_map\[NR_KEYS\][ ]*='
+ initnc 'static[ ]u_short[ ]shift_ctrl_map\[NR_KEYS\][ ]='
+ initnc 'static[ ]u_short[ ]shift_map\[NR_KEYS\][ ]*='
+ initnc 'static[ ]uchar[ ]perm1\[56\][ ]='
+ initnc 'static[ ]uchar[ ]perm2\[48\][ ]='
+ initnc 'static[ ]uchar[ ]perm3\[64\][ ]='
+ initnc 'static[ ]uchar[ ]perm4\[48\][ ]='
+ initnc 'static[ ]uchar[ ]perm5\[32\][ ]='
+ initnc 'static[ ]uchar[ ]perm6\[64\][ ]='
+ initnc 'static[ ]uchar[ ]sbox\[8\]\[4\]\[16\][ ]='
+ initnc 'static[ ]uint16_t[ ]crc_table\[256\][ ]='
+ initnc 'static[ ]uint8_t[ ]lpfcAlpaArray\[\][ ]='
+ initnc 'static[ ]\(const[ ]\)\?uint8_t[ ]seqprog\[\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]V110_OffMatrix_9600\[\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]V110_OnMatrix_9600\[\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]a2232_65EC02code\[\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]atkbd_set3_keycode\[512\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]atkbd_unxlate_table\[128\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]banner_table\[\][ ]=' arch/sh/boards/superh/microdev/led.c
+ initnc 'static[ ]unsigned[ ]char[ ]bootlogo_bits\[\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]bus2core_8260\[\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]bus2core_8280\[\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]caseorder\[256\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]crystal_key\[\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]dsp_ulaw\[\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]expressiontab\[128\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]header2\[\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]hidp_keycode\[256\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]nkbd_keycode\[128\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]pan_volumes\[256\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]parm_block\[32\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]raw3270_ebcgraf\[64\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]rfcomm_crc_table\[256\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]rwa_unlock\[\][ ]__initdata[ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]seqprog\[\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]snd_opl4_volume_table\[128\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]splash_bits\[\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]sunkbd_keycode\[128\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]ufs_fragtable_8fpb\[\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]ufs_fragtable_other\[\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]ulaw_dsp\[\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]usb_kbd_keycode\[256\][ ]='
+ defsnc 'static[ ]unsigned[ ]char[ ]vga_font\[cmapsz\][ ]\(BTDATA[ ]\)\?=' arch/sparc/kernel/btext.c
+ initnc 'static[ ]unsigned[ ]char[ ]voltab[12]\[128\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]vpd89_data\[\][ ]='
+ initnc 'static[ ]unsigned[ ]char[ ]xtkbd_keycode\[256\][ ]='
+ initnc 'static[ ]unsigned[ ]int[ ]ac3_bitrates\[32\][ ]='
+ initnc 'static[ ]unsigned[ ]int[ ]bass_volume_table\[\][ ]='
+ initnc 'static[ ]unsigned[ ]int[ ]bitrates\[3\]\[16\][ ]='
+ initnc 'static[ ]unsigned[ ]int[ ]isa_dma_port\[8\]\[7\][ ]='
+ initnc 'static[ ]unsigned[ ]int[ ]master_volume_table\[\][ ]='
+ initnc 'static[ ]unsigned[ ]int[ ]mixer_volume_table\[\][ ]='
+ initnc 'static[ ]unsigned[ ]int[ ]pan_table\[63\][ ]='
+ initnc 'static[ ]unsigned[ ]int[ ]snapper_bass_volume_table\[\][ ]='
+ initnc 'static[ ]unsigned[ ]int[ ]snapper_treble_volume_table\[\][ ]='
+ initnc 'static[ ]unsigned[ ]int[ ]treble_volume_table\[\][ ]='
+ initnc 'static[ ]unsigned[ ]int[ ]valid_mem\[\][ ]='
+ initnc 'static[ ]unsigned[ ]long[ ]arthur_to_linux_signals\[32\][ ]='
+ initnc 'static[ ]unsigned[ ]long[ ]shmedia_opcode_table\[64\][ ]='
+ initnc 'static[ ]unsigned[ ]nv\([34]\|10\)TableP\(FIFO\|GRAPH\|RAMIN\)\[\]\[2\][ ]='
+ initnc 'static[ ]unsigned[ ]short[ ]fcstab\[256\][ ]='
+ initnc 'static[ ]unsigned[ ]short[ ]init[1234]\[128\][ ][/][*]__devinitdata[*][/][ ]='
+ initnc 'static[ ]unsigned[ ]short[ ]log_table\[LOG_TABLE_SIZE[*]2\][ ]='
+ initnc 'static[ ]unsigned[ ]short[ ]rc_ioport\[\][ ]='
+ defsnc 'static[ ]unsigned[ ]short[ ]translations\[\]\[256\][ ]=' drivers/tty/vt/consolemap.c
+ initnc 'static[ ]unsigned[ ]short[ ]treble_parm\[12\]\[9\][ ]='
+ initnc 'struct[ ]RGBColors[ ]TextCLUT\[256\][ ]='
+ initnc 'struct[ ]VgaRegs[ ]GenVgaTextRegs\[NREGS[+]1\][ ]='
+ defsnc 'struct[ ]battery_thresh[ ][ ]*\(spitz\|sharpsl\)_battery_levels_\(noac\|acin\)\[\][ ]=' arch/arm/mach-pxa/sharpsl_pm.c
+ initnc 'struct[ ]fb_bitfield[ ]rgb_bitfields\[\]\[4\][ ]='
+ initnc 'struct[ ]mode_registers[ ]std_modes\[\][ ]='
+ initnc 'struct[ ]vmode_attr[ ]vmode_attrs\[VMODE_MAX\][ ]='
+ initnc 'u16[ ]const[ ]crc16_table\[256\][ ]='
+ initnc 'u16[ ]const[ ]crc_ccitt_table\[256\][ ]='
+ initnc 'u16[ ]hfsplus_compose_table\[\][ ]='
+ initnc 'u16[ ]hfsplus_decompose_table\[\][ ]='
+ initnc 'u_char[ ]const[ ]data_sizes_16\[32\][ ]='
+ defsnc 'u_short[ ]\(plain\|shift\(_ctrl\)\?\|alt\(gr\)\?\|ctrl\(_alt\)\?\)_map\[NR_KEYS\][ ]*=' drivers/tty/vt/defkeymap.c_shipped
+ initnc '\(uint16_t\|u16\)[ ]e1000_igp_cable_length_table\[IGP01E1000_AGC_LENGTH_TABLE_SIZE\][ ]=' drivers/net/e1000/e1000_hw.c # u16 on 2.6.26
+ initnc '\(uint16_t\|u16\)[ ]e1000_igp_2_cable_length_table\[IGP02E1000_AGC_LENGTH_TABLE_SIZE\][ ]=' drivers/net/e1000/e1000_hw.c # u16 on 2.6.26
+ initnc '[}][ ]euc2sjisibm_jisx0212_map\[\][ ]='
+ initnc '[}][ ]freq\[\][ ]='
+ initnc '[}][ ]hps_h_coeff_tab[ ]\[\][ ]='
+ initnc '[}][ ]hps_v_coeff_tab[ ]\[\][ ]='
+ initnc '[}][ ]init_tab\[\][ ]='
+ initnc '[}][ ]maven_gamma\[\][ ]='
+ initnc '[}][ ]mem_table\[\][ ]='
+ initnc '[}][ ]mxb_saa7740_init\[\][ ]='
+ initnc '[}][ ]pll_table\[\][ ]=' drivers/video/geode/lxfb_ops.c
+ initnc '[}][ ]qam256_snr_tab\[\][ ]='
+ initnc '[}][ ]qam64_snr_tab\[\][ ]='
+ initnc '[}][ ]sil_port\[\][ ]='
+ initnc '[}][ ]vsb_snr_tab\[\][ ]='
+
+ # new in 2.6.30
+ defsnc 'static[ ]const[ ]unsigned[ ]char[ ]sync\[\][ ]=' Documentation/networking/timestamping/timestamping.c
+ blob 'The[ ]driver[ ]requires[ ]firmware[ ]files[ ]["]turtlebeach\([^\n]*[^\n.][\n]\)*directory.' Documentation/sound/alsa/ALSA-Configuration.txt
+ defsnc 'static[ ]int[ ]sdp3430_batt_table\[\][ ]=' arch/arm/mach-omap2/board-3430sdp.c
+ defsnc 'const[ ]char[ ]_[zs]b_findmap\[\][ ]=' arch/s390/kernel/bitmap.c
+ initnc '[ ][{][ ]CnINT2MSKR0,[ ]CnINT2MSKCR0[ ],[ ]32,' arch/sh/kernel/cpu/sh4a/setup-sh7786.c
+ blobname 'solos-\(\(db-\)\?FPGA\|Firmware\)\.bin' drivers/atm/solos-pci.c
+ defsnc 'static[ ]u16[ ]__initdata[ ]i2c_clk_div\[50\]\[2\][ ]=' drivers/i2c/busses/i2c-imx.c
+ defsnc 'static[ ]const[ ]struct[ ]mpc_i2c_divider[ ]mpc_i2c_dividers_\(52xx\|8xxx\)\[\][ ]\(__devinitconst[ ]\)\?=' drivers/i2c/busses/i2c-mpc.c
+ accept '[ ]const[ ]char[ ]\*fw_name[ ]=[ ]["]av7110[/]bootcode\.bin["][;]' drivers/media/dvb/ttpci/av7110_hw.c
+ accept '[ ]ret[ ]=[ ]request_firmware[(][^;]*[)][;][\n][ ]if[ ][(]ret[)][ ][{][^}]*[}][\n][\n][ ]mwdebi[(]av7110,[ ]DEBISWAB,[ ]DPRAM_BASE' drivers/media/dvb/ttpci/av7110_fw.c
+ accept 'MODULE_FIRMWARE[(]["]av7110[/]bootcode\.bin["][)][;]' drivers/media/dvb/ttpci/av7110_fw.c
+ defsnc 'static[ ]const[ ]u8[ ]jpeg_head\[\][ ]=' drivers/media/video/gspca/jpeg.h
+ defsnc 'static[ ]struct[ ]nand_ecclayout[ ]nand_oob_128[ ]=' drivers/mtd/nand/nand_base.c
+ blobname 'bnx2[/]bnx2-\(mips\|rv2p\)-[-0-9a-z.]*\.fw' drivers/net/bnx2.c
+ accept 'static[ ]void[\n]load_rv2p_fw[(][^{)]*const[ ]struct[ ]bnx2_mips_fw_file_entry' drivers/net/bnx2.c
+ accept 'static[ ]int[\n]bnx2_init_cpus[(][^{]*[)][\n][{][\n][ ]const[ ]struct[ ]bnx2_mips_fw_file'
+ blobname 'yam[/]\(12\|96\)00\.bin' drivers/net/hamradio/yam.c
+ blobname 'myricom[/]lanai\.bin' drivers/net/myri_sbus.c
+ blobname '3com[/]3C359\.bin' drivers/net/tokenring/3c359.c
+ blobname '3com[/]typhoon\.bin' drivers/net/typhoon.c
+ defsnc 'static[ ]struct[ ]ar9170_phy_init[ ]ar5416_phy_init\[\][ ]=' drivers/net/wireless/ar9170/phy.c
+ defsnc 'static[ ]struct[ ]ar9170_rf_init[ ]ar9170_rf_init\[\][ ]=' drivers/net/wireless/ar9170/phy.c
+ defsnc 'static[ ]const[ ]struct[ ]ar9170_phy_freq_entry[ ]ar9170_phy_freq_params\[\][ ]=' drivers/net/wireless/ar9170/phy.c
+ accept 'static[ ]int[ ]ar9170_usb_request_firmware[(]' drivers/net/wireless/ar9170/usb.c
+ accept '[ ]\(err[ ]=\|return\)[ ]request_firmware\(_nowait\)\?[(][^\n]*["]ar9170\(-[12]\)\?\.fw["],' drivers/net/wireless/ar9170/usb.c
+ accept '[ ]err[ ]=[ ]ar9170_usb_request_firmware[(]' drivers/net/wireless/ar9170/usb.c
+ accept 'MODULE_FIRMWARE[(]["]ar9170\(-[12]\)\?\.fw["][)][;]\([\n]MODULE_FIRMWARE[(]["]ar9170\(-[12]\)\?\.fw["][)][;]\)*' drivers/net/wireless/ar9170/usb.c
+ blobname 'slicoss[/]\(oasis\|gb\)\(rcvucode\|download\)\.sys' drivers/staging/slicoss/slicoss.c
+ blobname 'sxg[/]sahara\(dbg\)\?downloadB\.sys' drivers/staging/sxg/sxg.c
+ blobname 'qlogic[/]isp1000\.bin' drivers/scsi/qlogicpti.c
+ blobname 'advansys[/]\(3550\|38C\(08\|16\)00\|mcode\)\.bin' drivers/scsi/advansys.c
+ blobname 'qlogic[/]\(1040\|1280\|12160\)\.bin' drivers/scsi/qla1280.c
+ blobname 'yamaha[/]yss225_registers\.bin' sound/isa/wavefront/wavefront_fx.c
+ defsnc 'static[ ]const[ ]struct[ ]ath5k_ini[ ]rf\([52]413\|2425\)_ini_common_end\[\][ ]=' drivers/net/wireless/ath5k/initvals.c
+ defsnc 'static[ ]const[ ]struct[ ]ath5k_ini_rfbuffer[ ]rfb_\(511[12]a\?\|5413\|231[67]\|24\(1[37]\|25\)\)\[\][ ]=' drivers/net/wireless/ath5k/rfbuffer.h
+ accept '#define\([ ]_\?IWL\(4965\|[156]000\(G2[AB]\)\?\|1[03]0\|5150\|6050\)_MODULE_FIRMWARE[(]api[)]\)\+' 'drivers/net/iwlwifi/iwl-\([156]000\|4965\)\.c'
+ blobname 'iwlwifi-1000-' drivers/net/iwlwifi/iwl-1000.c
+ blobname 'iwlwifi-60[05]0-' drivers/net/iwlwifi/iwl-6000.c
+ blobname 'libertas[/]gspi\(%d\|[0-9]\+\)\(_hlp\)\?\.bin' drivers/net/wireless/libertas/if_spi.c
+ blobname 'mwl8k[/]\(helper\|fmimage\)_\(%u\|[0-9]\+\)\.fw' drivers/net/wireless/mwl8k.c
+ blobname '3826\.arm' 'drivers/\(net/wireless/p54/p54spi\|staging/stlc45xx/stlc45xx\)\.c'
+ defsnc 'static[ ]unsigned[ ]char[ ]p54spi_eeprom\[\][ ]=' drivers/net/wireless/p54/p54spi_eeprom.h
+ blobname '\(comedi[/]\)\?jr3pci\.idm' drivers/staging/comedi/drivers/jr3_pci.c
+ blobname 'usbdux\(fast\)\?_firmware\.\(hex\|bin\)' 'drivers/staging/comedi/drivers/usbdux\(fast\)\?\.c'
+ blobname 'RT30xxEEPROM\.bin' drivers/staging/rt3070/common/eeprom.c
+ defsnc 'static[ ]const[ ]u8[ ]default_cal_\(channels\|rssi\)\[\][ ]=' drivers/staging/stlc45xx/stlc45xx.c
+ accept '[ ][ ]stlc45xx_error[(]["]request_firmware[(][)][ ]failed' drivers/staging/stlc45xx/stlc45xx.c
+ blob 'static[ ]struct[ ]phy_ucode[ ]PhyUcode\[\][ ]=[^;]*[;]' drivers/staging/sxg/sxgphycode-1.2.h
+ accept 'device[ ]drivers[ ]which[ ]predate[ ]the[ ]common[ ]use[ ]of[ ]request_firmware[(][)]' firmware/README.AddingFirmware
+ accept 'As[ ]we[ ]update[ ]those[ ]drivers[ ]to[ ]use[ ]request_firmware[(][)]' firmware/README.AddingFirmware
+ blob 'This[ ]directory[ ]is[ ]_NOT_[ ]for[ ]adding[ ]arbitrary[ ]new[ ]firmware[ ]images.*git[ ]pull[ ]request[ ]to:[\n][^\n]*infradead\.org>' firmware/README.AddingFirmware
+ blobna 'linux-firmware\.git' firmware/README.AddingFirmware
+ blobname '\(ea[/]\)\?\(loader\|indigo_djx\)_dsp\.fw' sound/pci/echoaudio/indigodjx.c
+ blobname '\(ea[/]\)\?\(loader\|indigo_iox\)_dsp\.fw' sound/pci/echoaudio/indigoiox.c
+ # blobname 'cis[/]LA-PCM\.cis' drivers/net/pcmcia/pcnet_cs.c
+ blobname 'ositech[/]Xilinx7OD\.bin' drivers/net/pcmcia/smc91c92_cs.c
+ blobname 'tehuti[/]\(firmware\|bdx\)\.bin' drivers/net/tehuti.c
+ accept '[ ]*["]b43-open%s[/]%s\.fw["]' drivers/net/wireless/b43/main.c
+ blobname '\(nx\(romimg\|3fw\(ct\|mn\)\)\|phanfw\)\.bin' 'drivers/net/netxen/netxen_nic\(_\(hw\|init\)\.c\|\.h\)'
+
+ # New in 2.6.31
+ accept '[ ][*][ ]page[ ]tables[ ]as[ ]follows:[\n][ ][*][\n][ ][*][ ][ ][ ]3[ ]3[ ]2[ ]2[ ]2[ ]2[ ]2[ ]2[ ]2[ ]2[ ]2[ ]2[ ]1[ ]1[ ]1[ ]1[ ]1[ ]1[ ]1[ ]1[ ]1[ ]1[\n][ ][*][ ][ ][ ]1[ ]0[ ]9[ ]8[ ]7[ ]6[ ]5[ ]4[ ]3[ ]2[ ]1[ ]0[ ]9[ ]8[ ]7[ ]6[ ]5[ ]4[ ]3[ ]2[ ]1[ ]0[ ]9[ ]8[ ]7[ ]6[ ]5[ ]4[ ]3[ ]2[ ]1[ ]0' arch/arm/include/asm/pgtable.h
+ defsnc '\([ ]static[ ]const[ ]u8[ ]snum_init\[\][ ]=[ ][{]\|static[ ]void[ ]qe_snums_init[(]void[)]\)[\n][ ][ ]0x04,[ ]0x05,' arch/powerpc/sysdev/qe_lib/qe.c
+ accept '[.]LgoS4:[\n][ ][.]word[ ][.]LmtoS4-\.LgoS4\([\n][ ]\.\(long\|word\|byte\)[ ][01]\(,0\)*\)*' arch/s390/kernel/sclp.S
+ defsnc 'static[ ]int[ ]sh_clk_div6_divisors\[64\][ ]=' '\(arch/sh/kernel/cpu/clock-\|drivers/sh/clk/\)cpg\.c'
+ accept '[ ][*][ ]*1[ ]1\([ ]0\)*[ ]1\([ ]0\)*' arch/x86/lguest/boot.c
+ defsnc 'struct[ ]scrubrate[ ]scrubrates\[\][ ]=' drivers/edac/amd64_edac.c
+ defsnc 'static[ ]const[ ]unsigned[ ]r\([35]\|s6\)00_reg_safe_bm\[[0-9]*\][ ]=' 'drivers/gpu/drm/radeon/r\(300\|v515\|s600\)\.c'
+ defsnc 'static[ ]struct[ ]keyboard_layout_map_t[ ]keyboard_layout_maps\[\][ ]=' drivers/media/dvb/siano/smsir.c
+ blobname 'dvb-cx18-mpc718-mt352\.fw' drivers/media/video/cx18/cx18-dvb.c
+ defsnc '[ ]const[ ]unsigned[ ]char[ ]\(y\|uv\)QuanTable51[18]\[\][ ]=' 'drivers/media/video/\(ov511\|gspca/ov519\)\.c'
+ defsnc 'static[ ]const[ ]u8[ ]bridge_start_ov965x_\(\([qs]\?v\|x\)ga\|cif\)\[\]\[2\][ ]=' drivers/media/video/gspca/ov534.c
+ defsnc 'static[ ]const[ ]\(int\|s16\)[ ]hsv_\(red\|green\|blue\)_[xy]\[\][ ]=' drivers/media/video/gspca/sn9c20x.c
+ defsnc 'static[ ]\(u16\|struct[ ]i2c_reg_u16\)[ ]\(bridge\|mt9\(v\(11[12]\|011\)\|m001\)\)_init\[\]\(\[2\]\)\?[ ]=' drivers/media/video/gspca/sn9c20x.c
+ defsnc 'static[ ]\(u8\|struct[ ]i2c_reg_u8\)[ ]\(soi968\|ov\(76[67]0\|965[05]\)\|hv7131r\)_init\[\]\(\[2\]\)\?[ ]=' drivers/media/video/gspca/sn9c20x.c
+ defsnc 'static[ ]struct[ ]nand_ecclayout[ ]onenand_oob_128[ ]=' drivers/mtd/onenand/onenand_base.c
+ blob '#define[ ]BCM_5710_FW_\(\(MAJOR\|MINOR\|REVISION\|ENGINEERING\)_VERSION\|COMPILE_FLAGS\)[ ]*[0-9]\+\([\n]#define[ ]BCM_5710_FW_\(\(MAJOR\|MINOR\|REVISION\|ENGINEERING\)_VERSION\|COMPILE_FLAGS\)[ ]*[0-9]\+\)*' 'drivers/net/\(bnx2x[/]\)\?bnx2x_hsi\.h'
+ blob 'static[ ]int[ ]\(__devinit[ ]\)\?bnx2x_check_firmware[(]struct[ ]bnx2x[ ][*]bp[)][\n][{][^\n]*\([\n]\+[^\n}][^\n]*\)*[\n]\+[}]' 'drivers/net/\(bnx2x[/]\)\?bnx2x_main\.c'
+ blobna 'if[ ][(][(]fw_ver\[[0-3]\][ ]!=[ ]BCM_5710_FW_\(MAJOR\|MINOR\|REVISION\|ENGINEERING\)_VERSION[)]\([ ][|][|][\n][ ]*[(]fw_ver\[[0-3]\][ ]!=[ ]BCM_5710_FW_\(MAJOR\|MINOR\|REVISION\|ENGINEERING\)_VERSION[)]\)*[)][ ][{][^{}]*[}]' 'drivers/net/\(bnx2x[/]\)\?bnx2x_main\.c'
+ blobna 'sprintf[(]fw_file_name[ ][+][ ]offset,[ ]["]%d[.]%d[.]%d[.]%d[.]fw["]\(,[\n][ ]*BCM_5710_FW_\(MAJOR\|MINOR\|REVISION\|ENGINEERING\)_VERSION\)*[)][;]' 'drivers/net/\(bnx2x[/]\)\?bnx2x_main\.c'
+ blobna 'rc[ ]=[ ]bnx2x_check_firmware[(]bp[)][;]' 'drivers/net/\(bnx2x[/]\)\?bnx2x_main\.c'
+ defsnc 'crb_128M_2M_map\[64\][ ]__cacheline_aligned_in_smp[ ]=' 'drivers/net/\(netxen/netxen_nic_hw.c\|qlcnic/qlcnic_hw.c\)'
+ defsnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals\(_3070\)\?\[\][ ]=' 'drivers/net/wireless/\(prism54/islpci_dev\.c\|rt2x00/rt2800usb\.c\)'
+ blobname 'wl1251-\(fw\|nvs\)\.bin' 'drivers/net/wireless/wl12\(51\|xx\)/wl1251.h'
+ blobname 'iwmc3200wifi-\([ul]mac\|calib\)-sdio\.bin' drivers/net/wireless/iwmc3200wifi/sdio.c
+ defsnc 'u16[ ]MCS_DATA_RATE\[2\]\[2\]\[77\][ ]=' 'drivers/staging/\(rtl8192su/ieee80211/rtl819x_HTProc\.c\|rtl8192u/r819xU_firmware\.c\)'
+ blob 'u8[ ]Rtl8192SUFw\(Img\|Main\|Data\)Array\[\(Img\|Main\|Data\)ArrayLength\][ ]=[ ][{]'"$sepx$blobpat*$sepx"'[}][;]\([\n][\n]*u8[ ]Rtl8192SUFw\(Img\|Main\|Data\)Array\[\(Img\|Main\|Data\)ArrayLength\][ ]=[ ][{]'"$sepx$blobpat*$sepx"'[}][;]\)*' drivers/staging/rtl8192su/r8192SU_HWImg.c
+ blobname 'RTL8192SU[/]\(rtl8192sfw\.bin\|\(boot\|main\|data\)\.img\)' drivers/staging/rtl8192su/r8192S_firmware.c
+ blobna 'case[ ]FW_SOURCE_HEADER_FILE:[\n]#if[ ]1[\n]#define[^#]*[\n]#endif[\n][ ][ ][ ]break[;]' drivers/staging/rtl8192su/r8192S_firmware.c
+ defsnc 'u32[ ]Rtl8192SU\(PHY_\(REG\|ChangeTo\)_\([12]T[12]R\)\?\|Radio[AB]_\(\(\(to\)\?[12]T\|GM\)_\)\?\|MAC\(PHY\|_[12]T\)_\|AGCTAB_\)Array\(_PG\)\?\[\(PHY_\(REG\|ChangeTo\)_\([12]T[12]R\)\?\|Radio[AB]_\(\(\(to\)\?[12]T\|GM\)_\)\?\|MAC\(PHY\|_[12]T\)_\|AGCTAB_\)Array\(_PG\)\?Length\][ ]=' drivers/staging/rtl8192su/rtl92SU_HWImg.c
+ blob 'u8[ ]Rtl8192PciEFw\(Boot\|Main\|Data\)ArrayDTM\[\(Boot\|Main\|Data\)ArrayLengthDTM\][ ]=[ ][{][^}]*[}][;]' drivers/staging/rtl8192su/r8192S_FwImgDTM.h
+ defsnc '\(static[ ]\)\?u32[ ]Rtl8192PciE\(PHY_REG\(_1T2R\)\?\|\(Radio[ABCD]\|MACPHY\|AGCTAB\)_\)Array\(_PG\)\?\(DTM\)\?\[\(\(PHY_REG\(_1T2R\)\?\|\(Radio[ABCD]\|MACPHY\|AGCTAB\)_\)Array\(_PG\)\?Length\(DTM\)\?\)\?\][ ]=' drivers/staging/rtl8192su/rtl8192S_FwImgDTM.h
+ blobna '\([&]\|sizeof[(]\)rtl8190_fw\(boot\|main\|data\)_array\(\[0\]\|[)]\)\(,[ \n]*\([&]\|sizeof[(]\)rtl8190_fw\(boot\|main\|data\)_array\(\[0\]\|[)]\)\)*' 'drivers/staging/rtl8192su/r819\(2S\|xU\)_firmware\.c'
+ blobname 'RTL8192U[/]\(boot\|main\|data\)\.img' 'drivers/staging/rtl8192s\?u/r819xU_firmware\.c'
+ blob 'u8[ ]rtl8190_fw\(boot\|main\|data\)_array\[\][ ]=[ ]\?[{][^}]*[}][;]' 'drivers/staging/rtl8192s\?u/r8192xU_firmware_img\.c'
+ defsnc 'u32[ ]Rtl8192Usb\(PHY_REG\(_1T2R\)\?\|\(Radio[ABCD]\|MACPHY\|AGCTAB\)_\)Array\(_PG\)\?\[\][ ]=' drivers/staging/rtl8192su/rtl819xU_firmware_img.c
+ defsnc 'BYTE[ ]\(sbox\|dot[23]\)_table\[256\][ ]=' drivers/staging/vt6655/aes_ccmp.c
+ defsnc '\(BYTE\|unsigned[ ]char\)[ ]byVT3253\(InitTab\|B0\(_AGC4\?\)\?\)_\(RFMD\(2959\)\?\|AIROHA2230\|UW2451\|AGC\)\[CB_VT3253\(B0\(_AGC4\?\)\?\)\?\(\(_INIT\)\?_FOR_\(RFMD\(2959\)\?\|AIROHA2230\|UW2451\|AGC\)\)\?\]\[2\][ ]=' drivers/staging/vt6655/baseband.c
+ defsnc 'SCountryTable[ ]ChannelRuleTab\[CCODE_MAX[+]1\][ ]=' drivers/staging/vt6655/card.c
+ defsnc 'static[ ]const[ ]long[ ]frequency_list\[\][ ]=' drivers/staging/vt6655/iwctl.c
+ accept '#define[ ]CONFIG_PATH[ ]*["][/]etc[/]vntconfiguration[.]dat["]' drivers/staging/vt6655/device_cfg.h
+ defsnc 'static[ ]const[ ]\(DWORD\|unsigned[ ]long\)[ ]s_adwCrc32Table\[256\][ ]=' drivers/staging/vt6655/tcrc.c
+ defsnc 'const[ ]\(BYTE\|unsigned[ ]char\)[ ]TKIP_Sbox_\(Lower\|Upper\)\[256\][ ]=' drivers/staging/vt6655/tkip.c
+ blobname 'prism2_ru\.\(hex\|fw\)' drivers/staging/wlan-ng/prism2fw.c
+ defsnc 'static[ ]const[ ]u16[ ]wm8960_reg\[WM8960_CACHEREGNUM\][ ]=' sound/soc/codecs/wm8960.c
+ blob '#include[ ]["]me4\(00\|61\)0_firmware\.h["]\([\n][\n]*#include[ ]["]me4\(00\|61\)0_firmware\.h["]\)*' drivers/staging/me4000/me4000.c
+ blobna 'firm[ ]=[ ][^;]*xilinx_firm[^;]*[;]' drivers/staging/me4000/me4000.c
+ # end of new in 2.6.31
+ accept '[ ]*ramdisk[ ]=[ ]["][/]boot[/][^ ]*initrd[^ ]*\.img["]' Documentation/ia64/xen.txt
+
+ # in drm-*.patch, post-2.6.31
+ blobname 'matrox[/]g[24]00_warp\.fw' drivers/gpu/drm/mga/mga_warp.c
+ blobname 'r128[/]r128_cce\.bin' drivers/gpu/drm/r128/r128_cce.c
+ blobname 'radeon[/]R\([123]0\|[45]2\|S6[09]\)0_cp\.bin' drivers/gpu/drm/radeon/r100.c
+ blobname 'radeon[/]\(R\([67]0\|V6[1237]\|S7[1378]\)[05]\|CEDAR\|REDWOOD\|JUNIPER\|CYPRESS\|%s\)_\(pfp\|rlc\|me\)\.bin' drivers/gpu/drm/radeon/r600.c
+ defsnc 'const[ ]u32[ ]r[67]xx_default_state\[\][ ]=' drivers/gpu/drm/radeon/r600_blit_shaders.c
+ defsnc 'struct[ ]nv17_tv_norm_params[ ]nv17_tv_norms\[NUM_TV_NORMS\][ ]=' drivers/gpu/drm/nouveau/nv17_tv_modes.c
+
+ # New in or modified for 2.6.32
+ blobname '\(cxgb3[/]\)\?ael20\(05_\(opt\|twx\)\|20_twx\)_edc\.bin' drivers/net/cxgb3/cxgb3_main.c
+ blobname 'wl1271-\(fw\|nvs\)\.bin' drivers/net/wireless/wl12xx/wl1271.h
+ defsnc 'static[ ]const[ ]struct[ ]aper_size_info_32[ ]u3_sizes\[8\?\][ ]=' drivers/char/agp/uninorth-agp.c
+ defsnc 'static[ ]const[ ]unsigned[ ]short[ ]atkbd_set[23]_keycode\[\(512\|ATKBD_KEYMAP_SIZE\)\][ ]=' drivers/input/keyboard/atkbd.c
+ defsnc '[ ][}][ ]common_modes\[17\][ ]=' drivers/gpu/drm/radeon/radeon_connectors.c
+ defsnc '[ ][ ]*\(static[ ]\)\?\(const[ ]\)\?struct[ ]phy_reg[ ]phy_reg_init\(_0\)\?\[\][ ]=' drivers/net/r8169.c
+ accept '[ ][ ]*struct[ ]phy_reg[ ]phy_reg_init_1\[\][ ]=[ ][{][^;]*0x8300[^;]*[}][;]' drivers/net/r8169.c
+ blob 'static[ ]void[ ]rtl8168d_[12]_hw_phy_config[(]void[ ]__iomem[ ][*]ioaddr[)][\n][{]\([\n]\+[^\n}][^\n]*\)*[^\n]*[\n]\+[}]' drivers/net/r8169.c
+ blobna 'rtl8168d_[12]_hw_phy_config[(]ioaddr[)][;]' drivers/net/r8169.c
+ blobna 'static[ ]\(const[ ]\)\?struct[ ]phy_reg_init_[12]\[\][ ]=[ ][{][\n {}0-9a-fx]*0x06,[ ]0xf8f9[\n {}0-9a-fx]*[}][;]' drivers/net/r8169.c
+ # This loads firmware to be flashed from filename provided through ethtool.
+ accept 'int[ ]be_load_fw[(][^\n;{]*[)][ \n][{][^\n]*\([\n]\+[^\n}][^\n]*\)*ETHTOOL_FLASH_MAX_FILENAME[^\n]*\([\n]\+[^\n}][^\n]*\)*request_firmware[^\n]*\([\n]\+[^\n}][^\n]*\)*[\n]\+[}]' drivers/net/benet/be_main.c
+ defsnc '[ ]u8[ ]init_hash_seed\[\][ ]=' drivers/net/qlge/qlge_main.c
+ defsnc 'static[ ]const[ ]u_int32_t[ ]ar9287\(Common\|Modes\(_\([tr]x_gain\)\)\?\)_9287_1_[01]\[\]\[[236]\][ ]=' drivers/net/wireless/ath9k/initvals.h
+ defsnc 'static[ ]const[ ]u_int32_t[ ]ar9271\(Common\|Modes\)_9271\(_1_0\)\?\[\]\[[26]\][ ]=' drivers/net/wireless/ath9k/initvals.h
+ defsnc 'static[ ]const[ ]u8[ ]lpphy_min_sig_sq_table\[\][ ]=' drivers/net/wireless/b43/tables_lpphy.c
+ defsnc 'static[ ]const[ ]u16[ ]lpphy_\(rev\(01\|2plus\)_noise_scale\|crs_gain_nft\|iqlo_cal\|rev[01]_ofdm_cck_gain\|\(a0_\)\?gain\|sw_control\)_table\[\][ ]=' drivers/net/wireless/b43/tables_lpphy.c
+ defsnc 'static[ ]const[ ]u32[ ]lpphy_\(\(rev01_ps\|tx_power\)_control\|\(a0_\)\?gain_\(idx\|value\)\|papd_\(eps\|mult\)\)_table\[\][ ]=' drivers/net/wireless/b43/tables_lpphy.c
+ blobname 'v4l-saa7164-1\.0\.[23]\.fw' drivers/media/video/saa7164/saa7164-fw.c
+ defsnc 'static[ ]const[ ]u8[ ]n4_\(om6802\|other\|tas5130a\)\[\][ ]=' drivers/media/video/gspca/t613.c
+ defsnc '[ ][ ]\(static[ ]\)\?const[ ]struct[ ]sensor_w_data[ ]\(cif\|vga\)_sensor[01]_init_data\[\][ ]=' drivers/media/video/gspca/mr97310a.c
+ defsnc '[ ]struct[ ]jlj_command[ ]start_commands\[\][ ]=' drivers/media/video/gspca/jeilinj.c
+ defsnc 'static[ ]u8[ ]init_code\[\]\[2\][ ]=' drivers/media/dvb/dvb-usb/friio-fe.c
+ defsnc 'static[ ]const[ ]u8[ ]va1j5jf8007[ts]_\(2[05]mhz_\)\?prepare_bufs\[\]\[2\][ ]=' 'drivers/media/dvb/pt1/va1j5jf8007[st]\.c'
+ accept '[ ]\+request_firmware[(][)][ ]will[ ]hit[ ]an[ ]OOPS' drivers/media/dvb/frontends/dib7000p.c
+ defsnc 'static[ ]long[ ]limiter_times\[\][ ]=' drivers/media/radio/si4713-i2c.c
+ blobname 'c[tb]fw\(_\(fc\|cna\)\)\?\.bin' drivers/scsi/bfa/bfad_fwimg.c
+ defsnc 'static[ ]const[ ]u16[ ]\(VDCDC[1x]\|LDO[12]\)_VSEL_table\[\][ ]=' 'drivers/regulator/tps650\(23\|7x\)-regulator\.c'
+ defsnc 'static[ ]struct[ ]lms283gf05_seq[ ]disp_\(init\|pwdn\)seq\[\][ ]=' drivers/video/backlight/lms283gf05.c
+ defsnc '[}][ ]csc_table\[\][ ]=' drivers/video/msm/mdp_csc_table.h
+ defsnc '\(static[ ]\)\?struct[ ]mdp_table_entry[ ]mdp_\(\(upscale\|gaussian_blur\)_table\|downscale_[xy]_table_PT[2468]TO\(PT[468]\|1\)\)\[\][ ]=' drivers/video/msm/mdp_scale_tables.c
+ accept '[ ][ ]card->firmware[ ]=[ ]data->firmware[;]' drivers/bluetooth/btmrvl_sdio.c
+ accept '[ ]isar->firmware[ ]=[ ][&]load_firmware[;]' drivers/isdn/hardware/mISDN/mISDNisar.c
+ blobname 'isdn[/]ISAR\.BIN' drivers/isdn/hardware/mISDN/speedfax.c
+ blobname '\(sep[/]\)\?\(cache\|resident\)\.image\.bin' drivers/staging/sep/sep_driver.c
+ blobname 'RTL8192E[/]\(boot\|main\|data\)\.img' drivers/staging/rtl8192e/r819xE_firmware.c
+ defsnc '\(static[ ]\)\?u32[ ]Rtl8190PciE\?\(AGCTAB_\|PHY_REG\(_1T2R\)\?\|Radio[ABCD]_\)Array\[\(AGCTAB_\|PHY_REG\(_1T2R\)\?\|Radio[ABCD]_\)ArrayLength\][ ]=' 'drivers/staging/\(rtl8192e/r819xE_phy\.c\|rtl8192u/r819xU_firmware_img.c\)'
+ accept '[ ][*][ ]File:[ ]main_usb\.c\([\n][ ][*]\([^\n/]*\|[^*\n/][/]*\)*\)*[\n][ ][*][/]\([\n][\n]*#\(undef[ ][^\n]*\|include[ ]["][^\n]*["]\)\)*[\n][\n]*#include[ ]["]firmware\.h["]' drivers/staging/vt6656/main_usb.c
+ blob 'const[ ]BYTE[ ]abyFirmware\[\][ ]=[ ][{][^;]*[}][;]' drivers/staging/vt6656/firmware.c
+ defsnc '[}][ ]*ChannelRuleTab\[\][ ]=' drivers/staging/vt6656/channel.c
+ defsnc '\(static[ ]\)\?struct[ ]register_address_value_pair[\n]\(preview_snapshot_mode\|noise_reduction\)_reg_settings_array\[\][ ]=' drivers/staging/dream/camera/mt9d112_reg.c
+ blobname '\([/]tmp[/]\)\?RT30xxEEPROM\.bin' 'drivers/staging/rt3090/\(common/ee_efuse\.c\|rtmp_def\.h\)'
+ defsnc 'static[ ]UINT8[ ]WPS_DH_\([PRX]\|RRModP\)_VALUE\[1\(9[23]\|84\)\][ ]=' drivers/staging/rt3090/common/crypt_biginteger.c
+ defsnc '\(CH_FREQ_MAP\|struct[ ]rt_ch_freq_map\)[ ]CH_HZ_ID_MAP\[\][ ]\?=' 'drivers/staging/\(rt2860\|rt3090\)/common/rt_channel\.c'
+ defsnc 'static[ ]const[ ]UINT32[ ]SHA256_K\[64\][ ]=' drivers/staging/rt3090/common/crpt_sha2.c
+ defsnc '\(DOT11_REGULATORY_INFORMATION\|struct[ ]rt_dot11_regulatory_information\)[ ]\(USA\|Europe\|Japan\)RegulatoryInfo\[\][ ]=' 'drivers/staging/\(rt3090\|rt2860\)/common/spectrum\.c'
+ defsnc 'static[ ]const[ ]USHORT[ ]Sbox\[256\][ ]=' drivers/staging/rt3090/sta/rtmp_ckipmic.c
+ blob '#include[ ]*["]\(\.\.[/]\(\.\.[/]rt\(28[67]\|30[79]\)0[/]\(common[/]\)\?\)\?\)\?firmware\(_\(28[67]\|30[79]\)0\)\?\.h["]\([\n][\n]*#include[ ]*["]\(\.\.[/]\(\.\.[/]rt\(28[67]\|30[79]\)0[/]\(common[/]\)\?\)\?\)\?firmware\(_\(28[67]\|30[79]\)0\)\?\.h["]\)' 'drivers/staging/rt\(28[67]\|309\)0/common/rtmp_\(init\|mcu\)\.c'
+ blobna 'FIRMWAREIMAGE_LENGTH[ ]==' drivers/staging/rt3090/common/rtmp_mcu.c
+ defsnc 'int[ ]wm831x_isinkv_values\[WM831X_ISINK_MAX_ISEL[ ][+][ ][1]\][ ]=' drivers/mfd/wm831x-core.c
+ defsnc 'static[ ]struct[ ]nand_ecclayout[ ]hwecc4_2048[ ]__initconst[ ]=' drivers/mtd/nand/davinci_nand.c
+ defsnc 'static[ ]const[ ]u16[ ]wm8974_reg\[WM8974_CACHEREGNUM\][ ]=' sound/soc/codecs/wm8974.c
+ defsnc 'static[ ]const[ ]u16[ ]ak4642_reg\[AK4642_CACHEREGNUM\][ ]=' sound/soc/codecs/ak4642.c
+ accept 'int[ ]snd_hda_load_patch[(][^\n;{]*[)][ \n][{][^\n]*\([\n]\+[^\n}][^\n]*\)*hda_codec[^\n]*\([\n]\+[^\n}][^\n]*\)*request_firmware[^\n]*\([\n]\+[^\n}][^\n]*\)*[\n]\+[}]' sound/pci/hda/hda_hwdep.c
+ accept '[ ][ ][ ]Bit[ 0-7]*' Documentation/input/sentelic.txt
+ accept 'The[ ]hd-audio[ ]driver[ ]reads[ ]the[ ]file[ ]via[ ]request_firmware[(][)]\.' Documentation/sound/alsa/HD-Audio.txt
+ blob 'SD8688[ ]firmware:[\n]*\([/]lib[/]firmware[^\n]*[\n]*\)*The[ ]images[^:]*:[\n]*[^\n]*[/]linux-firmware[^\n]*' Documentation/btmrvl.txt
+ defsnc 'static[ ]u8[ ]ibm405ex_fbdv_multi_bits\[\][ ]=' arch/powerpc/boot/4xx.c
+ defsnc 'static[ ]int[ ]zoom2_batt_table\[\][ ]=' arch/arm/mach-omap2/board-zoom2.c
+ defsnc 'static[ ]struct[ ]ad714x_platf\(or\|ro\)m_data[ ]ad714[27]_\(\(spi\|i2c\)_\)\?platf\(or\|ro\)m_data[ ]=' arch/blackfin/mach-bf537/boards/stamp.c
+ blob 'static[ ]const[ ]u8[ ]lgs8g75_initdat\[\][ ]=[ ][{][^;]*[}][;]' drivers/media/dvb/frontends/lgs8gxx.c
+ blob 'static[ ]int[ ]lgs8g75_init_data[(][^\n;{]*[)][ \n][{][^\n]*\([\n]\+[^\n}][^\n]*\)*lgs8g75_initdat[^\n]*\([\n]\+[^\n}][^\n]*\)*[\n]\+[}]' drivers/media/dvb/frontends/lgs8gxx.c
+ defsc 'static[ ]struct[ ]idxdata[ ]tbl_common\(_[a-e]\|5\|_\?3B\?\)\[\][ ]=' 'drivers/media/video/gspca/gl860/gl860-\(mi2020\|mi1320\|ov9655\|ov2640\)\.c'
+ defsnc 'static[ ]struct[ ]validx[ ]tbl_\(commm\?on\|init_\(at_startup\|post_alt\)\|sensor_settings_common\(_[ab]\|1\)\|big\(_[abc]\|[123]\)\|640\|800\)\[\][ ]=' 'drivers/media/video/gspca/gl860/gl860-\(mi2020\|mi1320\|ov9655\|ov2640\).c'
+ defsnc 'static[ ]u8[ ][*]tbl_\(640\|800\|1280\)\[\][ ]=' 'drivers/media/video/gspca/gl860/gl860-\(mi1320\|ov9655\).c'
+ accept '[<][<]\([/]Subtype[/]Type1\)\?[/]BaseFont[^ ]*[/]FontDescriptor[ ][0-9][0-9]*[ ]0[ ]R\([/]Type[/]Font\)\?[\n]\?[/]FirstChar[ ][0-9][0-9]*[/]LastChar[ ][0-9][0-9]*[/]Widths\[[\n][0-9 \n]*\]' 'Documentation/DocBook/v4l/.*\.pdf'
+
+ # New in 2.6.33
+ accept '[ ]*just[ ]run[ ]["]cat[ ][/]sys[/]firmware[/]acpi[/]tables[/]DSDT[ ]>[ ][/]tmp[/]dsdt[.]dat["]' Documentation/acpi/method-customizing.txt
+ accept '[ ]*b[)][ ]disassemble[ ]the[ ]table[ ]by[ ]running[ ]["]iasl[ ]-d[ ]dsdt[.]dat["][.]' Documentation/acpi/method-customizing.txt
+ accept '[ ]*x=["]7999\([ ][0-9]\+\)\+["]' Documentation/blockdev/drbd/DRBD-8.3-data-packets.svg
+ defsnc 'static[ ]int[ ]zoom_batt_table\[\][ ]=' arch/arm/mach-omap2/board-zoom-peripherals.c
+ defsnc 'static[ ]u16[ ]x[48]_vectors\[\][ ]=' drivers/edac/amd64_edac.c
+ defsnc 'static[ ]const[ ]u16[ ]\(y\|uv\)_static_hcoeffs\[N_HORIZ_\(Y\|UV\)_TAPS[ ][*][ ]N_PHASES\][ ]=' drivers/gpu/drm/i915/intel_overlay.c
+ accept '[ ]\.download_firmware[ ]=[ ]ec168_download_firmware,[\n][ ]\.firmware[ ]=[ ]' drivers/media/dvb/dvb-usb/ec168.c
+ blobname 'dvb-usb-ec168\.fw' drivers/media/dvb/dvb-usb/ec168.c
+ defsnc 'static[ ]const[ ]u16[ ]dib0090_defaults\[\][ ]=' drivers/media/dvb/frontends/dib0090.c
+ defsnc 'static[ ]const[ ]struct[ ]dib0090_pll[ ]dib0090_pll_table\[\][ ]=' drivers/media/dvb/frontends/dib0090.c
+ blobname 'dvb-fe-ds3000\.fw' drivers/media/dvb/frontends/ds3000.c
+ blob '[/][*][ ]\(as[ ]of[ ][^\n]*[ ]current[ ]DS3000[ ]firmware\|DS3000[ ]FW\)[^/]*[*][/]\([\n][/][*]\([ ]\(as[ ]of[ ][^\n]*[ ]current[ ]DS3000[ ]firmware\|DS3000[ ]FW\)[^/]*\|[(]DEBLOBBED[)]\)[*][/]\)*' drivers/media/dvb/frontends/ds3000.c
+ defsnc 'static[ ]u8[ ]ds3000_dvbs2\?_init_tab\[\][ ]=' drivers/media/dvb/frontends/ds3000.c
+ defsnc '[ ]static[ ]const[ ]u16[ ]dvbs2_snr_tab\[\][ ]=' drivers/media/dvb/frontends/ds3000.c
+ defsnc 'static[ ]const[ ]struct[ ]cnr[ ]cnr_tab\[\][ ]=' drivers/media/dvb/frontends/mb86a16.c
+ defsnc 'u8[ ]lgtdqcs001f_inittab\[\][ ]=' drivers/media/dvb/mantis/mantis_vp1033.c
+ defsnc 'static[ ]const[ ]struct[ ]ov9640_reg[ ]ov9640_regs_dflt\[\][ ]=' drivers/media/video/ov9640.c
+ defsnc '\(const[ ]static\|static[ ]const\)[ ]struct[ ]rj54n1_reg_val[ ]bank_[4578]\[\][ ]=' drivers/media/video/rj54n1cb0c.c
+ blob '#define[ ]_FW_NAME[(]api[)][ ]DRV_NAME[ ]["][.]["][ ]#api[ ]["]\.fw["]' drivers/media/video/iwmc3200top.h
+ defsnc 'static[ ]struct[ ]nand_ecclayout[ ]nandv2_hw_eccoob_largepage[ ]=' drivers/mtd/nand/mxc_nand.c
+ blob '#define[ ]FW_FILE_VERSION\([ ]*[\\][\n][ ]__stringify[(]BCM_5710_FW_\(MAJOR\|MINOR\|REVISION\|ENGINEERING\)_VERSION[)]\([ ]["][.]["]\)\?\)\+' 'drivers/net/\(bnx2x/\)\?bnx2x_main\.c'
+ blobname '\(bnx2x[/]\)\?bnx2x-e[12]h\?-["][ ]FW_FILE_VERSION[ ]["]\.fw' 'drivers/net/\(bnx2x/\)\?bnx2x_main\.c'
+ blobname '\(bnx2x[/]\)\?bnx2x-e[12]h\?-\([0-9.%d]*\.fw\)\?' 'drivers/net/\(bnx2x/\)\?bnx2x_main\.c'
+ blob '#define[ ]FW_VERSION\([ ]__stringify[(]FW_VERSION_\(MAJOR\|MINOR\|MICRO\)[)]\([ ]["][.]["]\)\?\([ ]*[\\][\n]\)\?\)\+' drivers/net/cxgb3/cxgb3_main.c
+ blobname 'cxgb3[/]t3fw-["][ ]FW_VERSION[ ]["]\.bin' drivers/net/cxgb3/cxgb3_main.c
+ blob '#define[ ]TPSRAM_VERSION\([ ]__stringify[(]TP_VERSION_\(MAJOR\|MINOR\|MICRO\)[)]\([ ]["][.]["]\)\?\([ ]*[\\][\n]\)\?\)\+' drivers/net/cxgb3/cxgb3_main.c
+ blobname 'cxgb3[/]t3\(%c\|[bc]\)_psram-["][ ]TPSRAM_VERSION[ ]["]\.bin' drivers/net/cxgb3/cxgb3_main.c
+ defsnc '[ ]static[ ]const[ ]u8[ ]rsshash\[40\][ ]=' drivers/net/igb/igb_main.c
+ defsnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_3\(02\)\?x\[\][ ]=' drivers/net/wireless/rt2x00/rt2800lib.c
+ defsnc 'static[ ]struct[ ]conf_drv_settings[ ]default_conf[ ]=' drivers/net/wireless/wl12xx/wl1271_main.c
+ defsnc 'static[ ]\(const[ ]\)\?u16[ ]bios_to_linux_keycode\[256\][ ]\(__initconst[ ]\)\?=' drivers/platform/x86/dell-wmi.c
+ accept '[ ]err[ ]=[ ]request_firmware[(][&]pm8001_ha->fw_image,' drivers/scsi/pm8001/pm8001_ctl.c
+ defsnc 'static[ ]unsigned[ ]char[ ]vpdb0_data\[\][ ]=' drivers/scsi/scsi_debug.c
+ defsnc 'static[ ]struct[ ]vesa_mode_table[ ]vesa_mode\[\][ ]=' drivers/staging/sm7xx/smtcfb.c
+ defsnc 'struct[ ]ModeInit[ ]VGAMode\[\][ ]=' drivers/staging/sm7xx/smtcfb.h
+ blob 'static[ ]const[ ]hcf_8[ ]fw_image_[1234]_data\[\][ ]=[^;]*[;]\([ ]*[/][*][ ]fw_image_[1234]_data[ ][*][/]\)\?' 'drivers/staging/wlags49_h2/\(ap\|sta\)_h25\?\.c'
+ blobname '[/]etc[/]agere[/]fw\.bin' drivers/staging/wlags49_h2/wl_profile.c
+ defsnc 'static[ ]const[ ]long[ ]chan_freq_list\[\]\[MAX_CHAN_FREQ_MAP_ENTRIES\][ ]=' drivers/staging/wlags49_h2/wl_util.c
+ blob 'The[ ]ssinit[ ]program.*nsoniq.*sndscape.*sound[ ]weird\.' Documentation/sound/oss/README.OSS
+ blobname 'scope\.cod' 'sound/isa/\(Kconfig\|sscape\.c\)'
+ blobname '\(sndscape\|soundscape\)\.co\([?dx01234]\|%d\)' 'sound/isa/\(Kconfig\|sscape\.c\)\|Documentation/sound/oss/README\.OSS'
+ defsnc 'static[ ]const[ ]u8[ ]\(adcm1700\|om6802\|po1030\)_sensor_\(init\|param1\)\[\]\[8\][ ]=' drivers/media/video/gspca/sonixj.c
+ blobname 'ath3k-1\.fw' drivers/bluetooth/ath3k.c
+ blobname 'nouveau[/]nv\([0-9a-f][0-9a-f]\|%02x\)\.ctx\(prog\|vals\)' 'drivers/gpu/drm/nouveau/\(nv50_graph\|nouveau_grctx\)\.c'
+
+ # New in 2.6.34
+ blobname 'mts_mt9234\(mu\|zba\)\.fw' drivers/usb/serial/ti_usb_3410_5052.c
+ blobname 'cxgb4[/]t4fw\.bin' drivers/net/cxgb4/cxgb4_main.c
+ defsnc '[ ]static[ ]const[ ]unsigned[ ]int[ ]reg_ranges\[\][ ]=' drivers/net/cxgb4/cxgb4_main.c
+ defsnc '[ ]static[ ]const[ ]unsigned[ ]int[ ]avg_pkts\[NCCTRL_WIN\][ ]=' drivers/net/cxgb4/t4_hw.c
+ # above in -rc5
+ defsnc 'static[ ]u32[ ]epll_div\[\]\[5\][ ]=' arch/arm/mach-s5p6440/clock.c
+ accept '[ ]aru->firmware[ ]=[ ]fw[;]' drivers/net/wireless/ath/ar9170/usb.c
+ accept '[ ]err[ ]=[ ]request_firmware[(][&]fw_entry,[ ]["]broadsheet\.wbf["],[ ]dev[)][;]' drivers/video/broadsheetfb.c
+ # above in -rc2, below in -rc1
+ accept '\(#[ ]\)\?\(Usage:[ ]cxacru-cf\.py[ ][<]\|Warning:\|Note:[ ]support[ ]for\)[ ]cxacru-cf\.bin' 'Documentation/networking/cxacru\(-cf\.py\|\.txt\)'
+ defsnc 'static[ ]struct[ ]cdce_reg[ ]cdce_y1_27000\[\][ ]=' arch/arm/mach-davinci/cdce949.c
+ defsnc '[ ]u16[ ]map\[\][ ]=' drivers/hwmon/asc7621.c
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]az6027_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/az6027.c
+ blobname 'dvb-usb-az6027-03\.fw' drivers/media/dvb/dvb-usb/az6027.c
+ accept '[ ]p7500->firmware[ ]=' drivers/media/dvb/dvb-usb/dw2102.c
+ blobname 'dvb-usb-p7500\.fw' drivers/media/dvb/dvb-usb/dw2102.c
+ defsnc 'static[ ]u8[ ]ITUDecoderSetup\[4\]\[16\][ ]=' drivers/media/dvb/ngene/ngene-core.c
+ blobname 'ngene_1[567]\.fw' drivers/media/dvb/ngene/ngene-core.c
+ blobname 'sms1xxx-hcw-55xxx-i\?sdbt-02\.fw' drivers/media/dvb/siano/sms-cards.c
+ defsnc 'static[ ]\(const[ ]\)\?u8[ ]samsung_smt_7020_inittab\[\][ ]=' drivers/media/video/cx88/cx88-dvb.c
+ defsnc 'static[ ]const[ ]u8[ ]\(bridge\|sensor\)_init\(_2\)\?\[\]\[2\][ ]=' drivers/media/video/gspca/ov534_9.c
+ defsnc 'static[ ]const[ ]u8[ ]bridge_start_\([qs]\?v\|x\)ga\[\]\[2\][ ]=' drivers/media/video/gspca/ov534_9.c
+ defsnc '[ ]struct[ ]init_command[ ]\(spy\|cif\|ms350\|genius\|vivitar\)_start_commands\[\][ ]=' drivers/media/video/gspca/sn9c2028.c
+ defsnc 'static[ ]const[ ]u8[ ]n4_lt168g\[\][ ]=' drivers/media/video/gspca/t613.c
+ initc 'static[ ]const[ ]\(__\)\?u8[ ]\(mi\(0360\|13[12]0\)\|po\(1200\|3130\)\|hv7131r\|ov76[67]0\)_\(\(soc\)\?_\?[iI]nit\(Q\?V\|SX\)GA\(_\(JPG\|data\)\)\?\|rundata\)\[\]\[4\][ ]=\([ ][{][*][/][;]\)\?' drivers/media/video/gspca/vc032x.c
+ defsnc '[ ]static[ ]const[ ]u8[ ]gamma_tb\[6\]\[16\][ ]=' drivers/media/video/gspca/zc3xx.c
+ blobname 'tlg2300_firmware\.bin' drivers/media/video/tlg2300/pd-main.c
+ defsnc '[ ]u8[ ]pattern\[42\][ ]=' drivers/net/ksz884x.c
+ defsnc '\(static[ ]\)\?const[ ]u8[ ]b43_ntab_framelookup\[\][ ]=' drivers/net/wireless/b43/tables_nphy.c
+ defsnc 'const[ ]u32[ ]\(b43_ntab_tx_gain_rev\(0_1_2\|3plus_2ghz\|\([34]\|5plus\)_5ghz\)\|txpwrctrl_tx_gain_ipa\(_\(rev\)\?[56]g\?\)\?\)\[\][ ]=' drivers/net/wireless/b43/tables_nphy.c
+ defsnc 'const[ ]u16[ ]tbl_iqcal_gainparams\[2\]\[9\]\[8\][ ]=' drivers/net/wireless/b43/tables_nphy.c
+ defsnc 'const[ ]struct[ ]nphy_txiqcal_ladder[ ]ladder_\(lo\|iq\)\[\][ ]=' drivers/net/wireless/b43/tables_nphy.c
+ defsnc 'const[ ]u16[ ]loscale\[\][ ]=' drivers/net/wireless/b43/tables_nphy.c
+ blobname 'isl38\(86\|87\|90\)\(pci\|usb\(_bare\)\?\)\?' 'drivers/net/wireless/p54/p54\(pci\.c\|usb\.[ch]\)'
+ defsnc 'static[ ]struct[ ]conf_drv_settings[ ]default_conf[ ]=[ ][{][*][/][;]' drivers/net/wireless/wl12xx/wl1271_main.c
+ defsnc '[ ][}][ ]grtpkts\[\][ ]=' drivers/staging/mimio/mimio.c
+ blobname 'rt\(28[67]0\|30[79][01]\)\.bin' drivers/staging/rt2860/common/rtmp_mcu.c
+ accept '[ ]adapter->firmware[ ]=[ ]fw[;]' drivers/staging/rt2860/common/rtmp_mcu.c
+ blobna '[/][*][^*]*\([*]\+[^/*][^*]*\)*[*]*RTL8192SU[/]rtl8192sfw\.bin[^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]' drivers/staging/rtl8192su/r8192S_firmware.c
+ accept 'MODULE_FIRMWARE[(]["]keyspan_pda[/]\(keyspan_pda\|xircom_pgs\)\.fw["][)][;]' drivers/usb/serial/keyspan_pda.c
+ # It's not clear that wm2000_anc.bin is pure data.
+ # Check with developer, clean up for now.
+ blobname 'wm2000_anc\.bin' sound/soc/codecs/wm2000.c
+ blob '[ ][*][ ]The[ ]download[ ]image[ ]for[ ]the[ ]WM2000[^*]*\([*]\+[^/*][^*]*\)*[*]*[<][ ]file[^*\n]*[\n][ ][*][/]' sound/soc/codecs/wm2000.c
+ # accept '[ ][*][ ].wm2000_anc\.bin.[ ]by[ ]default' sound/soc/codecs/wm2000.c
+ # accept '[ ][*][ ]*[<][ ]file[ ]\+[>]wm2000_anc\.bin' sound/soc/codecs/wm2000.c
+ # accept '[ ]filename[ ]=[ ]["]wm2000_anc\.bin["][;]' sound/soc/codecs/wm2000.c
+ defsnc '[}][ ]\(clk_sys_ratios\|bclk_divs\)\[\][ ]=' 'sound/soc/wm890[34]\.c'
+ defsnc '[}][ ]clock_cfgs\[\][ ]=' sound/soc/codecs/wm8955.c
+ blobname 'siu_spb\.bin' sound/soc/sh/siu_dai.c
+ defsnc 'static[ ]const[ ]u8[ ]poxxxx_\(init\(_common\|Q\?VGA\|_end_1\|_start_3\)\|gamma\)\[\]\[4\][ ]=' drivers/media/video/gspca/vc032x.c
+ defsnc 'crb_128M_2M_map\[64\][ ]__cacheline_aligned_in_smp[ ]=' 'drivers/net/\(netxen/netxen_nic_hw.c\|qlcnic/qlcnic_hw.c\)'
+
+ # New in 2.6.35
+ defsnc 'static[ ]const[ ]u8[ ]gsm_fcs8\[256\][ ]=' drivers/char/n_gsm.c
+ defsnc 'static[ ]u8[ ]\(reset_atetm\|atetm_[12]port\|portsel_\(port[12]\|2port\)\)\[BIT2BYTE[(]LEN_\(ETM\|PORT_SEL\)[)]\][ ]=' drivers/infiniband/hw/qib/qib_iba7322.c
+ blobname 'qlogic[/]sd7220[.]fw' drivers/infiniband/hw/qib/qib_sd7220.c
+ defsnc '[}][ ]est3_modes\[\][ ]=' drivers/gpu/drm/drm_edid.c
+ defsnc 'static[ ]struct[ ]v_table[ ]v_table\[\][ ]=' drivers/gpu/drm/i915/i915_dma.c
+ blobname 'orinoco_ezusb_fw' drivers/net/wireless/orinoco/orinoco_usb.c
+ defsc 'static[ ]const[ ]struct[ ]ar9300_eeprom[ ]ar9300_default[ ]=' drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
+ blobname 'ar9271[.]fw' drivers/net/wireless/ath/ath9k/hif_usb.c
+ accept '[ ]hif_dev->firmware[ ]=[ ]NULL[;]' drivers/net/wireless/ath/ath9k/hif_usb.c
+ defsnc 'static[ ]const[ ]u32[ ]ar9300_2p[02]_\(radio\|mac\|baseband\)_postamble\[\]\[5\][ ]=' 'drivers/net/wireless/ath/ath9k/ar9003_\(2p[02]_\)\?initvals\.h'
+ defsnc 'static[ ]const[ ]u32[ ]ar9300Modes_\(\(low\(est\)\?\|high\)_ob_db\|high_power\)_tx_gain_table_2p[02]\[\]\[5\][ ]=' 'drivers/net/wireless/ath/ath9k/ar9003_\(2p[02]_\)\?initvals\.h'
+ defsnc 'static[ ]const[ ]u32[ ]ar9\(300\|200_merlin\)_2p[02]_\(radio\|mac\|baseband\)_core\[\]\[2\][ ]=' 'drivers/net/wireless/ath/ath9k/ar9003_\(2p[02]_\)\?initvals\.h'
+ defsnc 'static[ ]const[ ]u32[ ]ar9300Common_\(wo_xlna_\)\?rx_gain_table_\(merlin_\)\?2p[02]\[\]\[2\][ ]=' 'drivers/net/wireless/ath/ath9k/ar9003_\(2p[02]_\)\?initvals\.h'
+ defsnc 'static[ ]const[ ]u32[ ]ar928\(5Modes_XE2\|7Modes_9287_1\)_0_\(normal\|high\)_power\[\]\[6\][ ]=' drivers/net/wireless/ath/ath9k/ar9002_initvals.h
+ defsnc 'static[ ]const[ ]u32[ ]ar92\(87Common_9287_1_[01]\|71Common_9271\)\[\]\[2\][ ]=' drivers/net/wireless/ath/ath9k/ar9002_initvals.h
+ defsnc 'static[ ]const[ ]u32[ ]ar92\(87\|71\)Modes_\(\(normal\|high\)_power_\)\?\([tr]x_gain_\)\?92\(87_1_[01]\|71\(_ANI_reg\)\?\)\[\]\[6\][ ]=' drivers/net/wireless/ath/ath9k/ar9002_initvals.h
+ defsnc 'static[ ]int[ ]ath_max_4ms_framelen\[4\]\[32\][ ]=' drivers/net/wireless/ath/ath9k/xmit.c
+ defsnc 'static[ ]const[ ]u8[ ]\(gc0307\|po2030n\|soi768\)_sensor_\(init\|param1\)\[\]\[8\][ ]=' drivers/media/video/gspca/sonixj.c
+ defsnc '\(static[ ]\)\?struct[ ]crb_128M_2M_block_map[ ]crb_128M_2M_map\[64\][ ]=' 'drivers/scsi/\(qla2xxx/qla_nx\.c\|qla4xxx/ql4_nx\.c\)'
+ defsnc 'static[ ]const[ ]unsigned[ ]int[ ]BUCK[123]_\(suspend_\)\?table\[\][ ]=' drivers/regulator/88pm8607.c
+ defsnc '[ ]*static[ ]const[ ]char[ ]sha256_zero\[SHA256_DIGEST_SIZE\][ ]=' drivers/crypto/n2_core.c
+ defsnc '[}][ ]XGI\(fb_vrate\|_TV_filter\)\[\][ ]=' drivers/staging/xgifb/XGI_main.h
+ defsnc '\(static[ ]\)\?\(USHORT\|unsigned[ ]short\)[ ]XGINew_\(MD\|[CEV]G\)A_DAC\[\][ ]*=' drivers/staging/xgifb/vb_setmode.c
+ defsnc '\(static[ ]\)\?\(struct[ ]\)\?XGI_[ME]CLKDataStruct[ ]XGI\(3[34]0\|27\)\(New\)\?_[ME]CLKData\[\][ ]*=' drivers/staging/xgifb/vb_table.h
+ defsnc '\(static[ ]\)\?\(UCHAR\|unsigned[ ]char\)[ ]XGI340_CR6[BE]\[8\]\[4\][ ]*=' drivers/staging/xgifb/vb_table.h
+ defsnc '\(static[ ]\)\?\(UCHAR\|unsigned[ ]char\)[ ]XGI340_CR6F\[8\]\[32\][ ]*=' drivers/staging/xgifb/vb_table.h
+ defsnc '\(static[ ]\)\?\(UCHAR\|unsigned[ ]char\)[ ]XGI330\(New\)\?_SR15\(_1\)\?\[8\]\[8\][ ]*=' drivers/staging/xgifb/vb_table.h
+ defsnc '\(static[ ]\)\?\(UCHAR\|unsigned[ ]char\)[ ]XGI330_cr40_1\[15\]\[8\][ ]*=' drivers/staging/xgifb/vb_table.h
+ defsnc '\(static[ ]\)\?\(struct[ ]\)\?XGI_StStruct[ ]XGI330_SModeIDTable\[\][ ]*=' drivers/staging/xgifb/vb_table.h
+ defsnc '\(static[ ]\)\?\(struct[ ]\)\?XGI_ExtStruct[ ][ ]XGI330_EModeIDTable\[\][ ]*=' drivers/staging/xgifb/vb_table.h
+ defsnc '\(static[ ]\)\?\(struct[ ]\)\?XGI_StandTableStruct[ ]XGI330_StandTable\[\][ ]*=' drivers/staging/xgifb/vb_table.h
+ defsnc '\([/][*]\)\?\(static[ ]\)\?\(struct[ ]\)\?XGI330_LCDDataStruct[ ][ ]XGI_\(\(St2\?\|Ext\)LCD\(1024x768\|1280x1024\)\|NoScaling\)Data\[\][ ]*=' drivers/staging/xgifb/vb_table.h
+ defsnc '\(static[ ]\)\?\(struct[ ]\)\?XGI330_TVDataStruct[ ][ ]XGI_\(St\|Ext\)\(PAL\|NTSC\|YPbPr\(525[ip]\|750p\)\)Data\[\][ ]*=' drivers/staging/xgifb/vb_table.h
+ defsnc '\(static[ ]\)\?\(UCHAR\|unsigned[ ]char\)[ ]XGI330_\(NTSC\|PAL\|HiTV\(Ext\|St[12]\|Text\)\|YPbPr\(750p\|525[ip]\)\)Timing\[\][ ][ ]*=' drivers/staging/xgifb/vb_table.h
+ defsnc '\(static[ ]\)\?\(UCHAR\|unsigned[ ]char\)[ ]XGI330_HiTVGroup3\(Data\|Simu\|Text\)\[\][ ]*=' drivers/staging/xgifb/vb_table.h
+ defsnc '\(static[ ]\)\?\(UCHAR\|unsigned[ ]char\)[ ]XGI330_Ren\(525\|750\)pGroup3\[\][ ]*=' drivers/staging/xgifb/vb_table.h
+ defsnc '\(static[ ]\)\?\(struct[ ]\)\?XGI_PanelDelayTblStruct[ ]XGI330_PanelDelayTbl\[\]' drivers/staging/xgifb/vb_table.h
+ defsnc '\(static[ ]\)\?\(struct[ ]\)\?XGI330_LVDSDataStruct[ ][ ]XGI\(330\)\?_LVDS\(320x480\|800x600\|1024x768\|1280x\(1024\|768[NS]\?\)\|1400x1050\|640x480\)Data_[12]\[\][ ]*=' drivers/staging/xgifb/vb_table.h
+ defsnc '\(static[ ]\)\?\(struct[ ]\)\?XGI_LVDSCRT1DataStruct[ ][ ]XGI_CHTVCRT1[UO]\(NTSC\|PAL\)\[\][ ]*=' drivers/staging/xgifb/vb_table.h
+ defsnc '\(static[ ]\)\?\(struct[ ]\)\?XGI_ModeResInfoStruct[ ]XGI330_ModeResInfo\[\][ ]*=' drivers/staging/xgifb/vb_table.h
+ defsnc '\(static[ ]\)\?\(USHORT\|unsigned[ ]short\)[ ]XGINew_DRAMType\[17\]\[5\][ ]*=' 'drivers/staging/xgifb/\(vb_table\.h\|vb_init\.c\)'
+ defsnc '\(static[ ]\)\?\(USHORT\|unsigned[ ]short\)[ ]XGINew_SDRDRAM_TYPE\[13\]\[5\][ ]*=' 'drivers/staging/xgifb/\(vb_table\.h\|vb_init\.c\)'
+ defsnc '\(static[ ]\)\?\(USHORT\|unsigned[ ]short\)[ ]XGINew_DDRDRAM_TYPE20\[12\]\[5\][ ]*=' 'drivers/staging/xgifb/\(vb_table\.h\|vb_init\.c\)'
+ blobname 'TIInit_\(\(%d\|[0-9]\+\)[.]\)\+bts' drivers/staging/ti-st/st_kim.c
+ defsnc 'static[ ]int16[ ]mdp_scale_\(pixel_repeat\|0p[2468]_to_[08]p[0468]\)_C[0123]\[MDP_SCALE_COEFF_NUM\][ ]=' drivers/staging/msm/mdp_ppp_v31.c
+ # qseed_table2 is kind of suspicious, but there's some regularity
+ # to it that makes me think it's just data.
+ defsnc 'static[ ]uint32[ ]vg_qseed_table2\[\][ ]=' drivers/staging/msm/mdp4_util.c
+ defsnc 'char[ ]gc_lut\[\][ ]=' drivers/staging/msm/mdp4_util.c
+ defsnc 'uint32[ ]igc_\(video\|rgb\)_lut\[\][ ]=' drivers/staging/msm/mdp4_util.c
+ defsnc 'static[ ]word[ ]convert_8_to_16_tbl\[256\][ ]=' drivers/staging/msm/ebi2_tmd20.c
+ defsnc 'static[ ]struct[ ]sharp_spi_data[ ]init_sequence\[\][ ]=' drivers/staging/msm/lcdc_sharp_wvga_pt.c
+ blobname 'xc3028L\?-v[0-9]\+\.fw' drivers/staging/tm6000/tm6000-cards.c
+ defsnc 'static[ ]const[ ]struct[ ]chs_entry[ ]chs_table\[\][ ]=' drivers/mtd/sm_ftl.c
+ blobname 'asihpi[/]dsp\(%04x\|[0-9a-f][0-9a-f][0-9a-f][0-9a-f]\)\.bin' sound/pci/asihpi/hpidspcd.c
+ defsnc 'static[ ]unsigned[ ]long[ ]ident_map\[32\][ ]=' kernel/exec_domain.c
+ defsnc 'static[ ]uint[ ]patch_2000\[\][ ]__initdata[ ]=' arch/powerpc/sysdev/micropatch
+ # Are these ucode patches really data?!? They were taken as such
+ # since gNewSense started cleaning up Linux, but they look awfully
+ # suspicious to me.
+ defsnc '\(static[ ]\)\?uint[ ]patch_2[0ef]00\[\][ ]\(__initdata[ ]\)\?=' arch/powerpc/sysdev/micropatch.c
+ defsnc 'static[ ]u32[ ]epll_div\[\]\[4\][ ]=' arch/arm/mach-s5pc100/clock.c
+ blobname 'iwlwifi-6000g2[ab]-' drivers/net/iwlwifi/iwl-6000.c
+ blobna '[/][*][^*]*\([*]\+[^/*][^*]*\)*[*]*[(]f2255usb\.bin[)][^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]' drivers/media/video/s2255drv.c
+
+ # New in 2.6.36:
+ defsnc 'static[ ]struct[ ]clk_pll_table[ ]tegra_pll_[apxm]_table\[\][ ]=' arch/arm/mach-tegra/tegra2_clocks.c
+ defsnc 'static[ ]struct[ ]nand_ecclayout[ ]qi_lb60_ecclayout_[12]gb[ ]=' arch/mips/jz4740/board-qi_lb60.c
+ blobname 'qt602240\.fw' drivers/input/touchscreen/qt602240_ts.c
+ blobname 'lgs8g75\.fw' drivers/media/dvb/frontends/lgs8gxx.c
+ defsnc 'static[ ]const[ ]struct[ ]ucbus_write_cmd[ ]\(icx098bq\|lz24bp\)_start_[012]\[\][ ]=' drivers/media/video/gspca/sq930x.c
+ defsnc '[}][ ]capconfig\[4\]\[2\][ ]=' drivers/media/video/gspca/sq930x.c
+ blobname 'ar7010\(_1_1\)\?[.]fw' drivers/net/wireless/ath/ath9k/hif_usb.c
+ defsnc 'static[ ]u8[ ]sa2400_rf_rssi_map\[\][ ]=' drivers/net/wireless/rtl818x/rtl8180_sa2400.c
+ defsnc 'static[ ]const[ ]unsigned[ ]char[ ]pwm_lookup_table\[256\][ ]=' drivers/platform/x86/compal-laptop.c
+ defsnc 'static[ ]int[ ]tps6586x_\(ldo4\|sm2\|dvm\)_voltages\[\][ ]=' drivers/regulator/tps6586x-regulator.c
+ defsnc 'static[ ]const[ ]unsigned[ ]int[ ]muxonechan\[\][ ]=' drivers/staging/comedi/drivers/adv_pci1710.c
+ defsnc 'const[ ]struct[ ]\(stk1160\|saa7113\)config[ ][{][^}]*[}][ ]\(stk1160\|saa7113\)config\[256\][ ]=' drivers/staging/easycap/easycap_low.c
+ defsnc 'int[ ]tones\[2048\][ ]=' drivers/staging/easycap/easycap_testcard.c
+ defsnc 'const[ ]unsigned[ ]char[ ]map_table\[\][ ]=' drivers/staging/lirc/lirc_ttusbir.c
+ defsnc 'static[ ]unsigned[ ]char[ ]jpeg_header\[\][ ]=' drivers/staging/solo6x10/solo6010-jpeg.h
+ defsc 'static[ ]const[ ]unsigned[ ]int[ ]solo_osd_font\[\][ ]=' drivers/staging/solo6x10/solo6010-osd-font.h
+ defsnc '[ ]unsigned[ ]char[ ]regs\[128\][ ]=' drivers/staging/solo6x10/solo6010-tw28.c
+ defsnc 'static[ ]unsigned[ ]char[ ]vid_vop_header\[\][ ]=' drivers/staging/solo6x10/solo6010-v4l2-enc.c
+ defsnc 'static[ ]const[ ]u16[ ]rop_\(map1\|action\|info\)\[\][ ]=' drivers/staging/tidspbridge/dynload/reloc_table_c6000.c
+ defsnc 'static[ ]const[ ]u16[ ]tramp_\(map\|action\|info\)\[\][ ]=' drivers/staging/tidspbridge/dynload/tramp_table_c6000.c
+ defsnc 'unsigned[ ]char[ ]\(sbox\|dot[23]\)_table\[256\][ ]=' drivers/staging/vt6655/aes_ccmp.c
+ defsnc 'static[ ]struct[ ]pll_map[ ]pll_value\[\][ ]=' drivers/video/via/hw.c
+ defsnc '[ ][ ]degrade_factor\[CPU_LOAD_IDX_MAX\]\[DEGRADE_SHIFT[ ][+][ ]1\][ ]=' kernel/sched.c
+ defsnc 'static[ ]const[ ]unsigned[ ]char[ ]expected_result\[FIFO_SIZE\][ ]=' samples/kfifo/bytestream-example.c
+ defsnc 'static[ ]const[ ]int[ ]expected_result\[FIFO_SIZE\][ ]=' samples/kfifo/inttype-example.c
+ blobname 'haup-ir-blaster\.bin' drivers/input/lirc/lirc_zilog.c
+
+ # New in 2.6.37, up to -rc5.
+ defsnc 'static[ ]u32[ ]epll_div\[\]\[6\][ ]=' arch/arm/mach-s5pv210/clock.c
+ defsnc 'static[ ]struct[ ]titan_gpio_cfg[ ]titan_gpio_table\[\][ ]=' arch/mips/ar7/gpio.c
+ blobname 'sdma-%s-to%d\.bin' drivers/dma/imx-sdma.c
+ defsnc '[ ]static[ ]u8[ ]def_regs\[\][ ]=' drivers/media/common/tuners/tda18218.c
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]lme2510c\?_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*\([ ]\.download_firmware[ ]=[ ]lme2510_download_firmware,[\n]\)\?[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/lmedm04.c
+ blobname 'dvb-usb-lme2510c\?-\(lg\|s7395\)\.fw' drivers/media/dvb/dvb-usb/lmedm04.c
+ defsnc 'static[ ]u8[ ]s7395_inittab\[\][ ]=' drivers/media/dvb/dvb-usb/lmedm04.h
+ defsnc 'static[ ]const[ ]u16[ ]rca_initdata\[\]\[3\][ ]=' drivers/media/video/gspca/xirlink_cit.c
+ blobname 'NXP7164-2010-03-10\.1\.fw' drivers/media/video/saa7164/saa7164-fw.c
+ defsnc 'static[ ]struct[ ]nand_ecclayout[ ]fsmc_ecc4_lp_layout[ ]=' drivers/mtd/nand/fsmc_nand.c
+ defsnc 'static[ ]struct[ ]pxa3xx_nand_timing[ ]timing\[\][ ]=' drivers/mtd/nand/pxa3xx_nand.c
+ blobname 'ctfw_cna\.bin' drivers/net/bna/cna.h
+ accept '[#]define[ ]CARL9170FW_NAME[ ]\+["]carl9170-1\.fw["]' drivers/net/wireless/ath/carl9170/carl9170.h
+ defsnc 'static[ ]struct[ ]carl9170_phy_init[ ]ar5416_phy_init\[\][ ]=' drivers/net/wireless/carl9170/phy.c
+ defsnc 'static[ ]struct[ ]carl9170_rf_initvals[ ]carl9170_rf_initval\[\][ ]=' drivers/net/wireless/carl9170/phy.c
+ defsnc 'static[ ]const[ ]struct[ ]carl9170_phy_freq_entry[ ]carl9170_phy_freq_params\[\][ ]=' drivers/net/wireless/carl9170/phy.c
+ accept 'MODULE_FIRMWARE[(]CARL9170FW_NAME[)][;]' drivers/net/wireless/carl9170/usb.c
+ accept '[ ]return[ ]request_firmware_nowait[(][^\n]*,[ ]CARL9170FW_NAME,' drivers/net/wireless/carl9170/usb.c
+ blobname 'iwlwifi-100-' drivers/net/iwlwifi/iwl-1000.c
+ blobname 'iwlwifi-130-' drivers/net/iwlwifi/iwl-6000.c
+ blobname 'libertas[/]cf83\(05\|8[15]\)\(_helper\)\?\.bin' drivers/net/wireless/libertas/if_cs.c
+ blobname 'libertas[/]sd\(8385\|8686\(_v[89]\)\|8688\)\(_helper\)\?\.bin' drivers/net/wireless/libertas/if_sdio.c
+ blobname 'libertas[/]gspi\(8385\|8686\(_v9\)\?\|8688\)\(_helper\|_hlp\)\?\.bin' drivers/net/wireless/libertas/if_spi.c
+ blobname 'libertas[/]usb\(8388\(_v[59]\)\?\|8682\)\.bin' drivers/net/wireless/libertas/if_usb.c
+ accept '[ ][/][*][ ]Try[ ]user-specified[ ]firmware[ ]first[ ][*][/][\n][ ]if[ ][(]fwname[)][\n][ ][ ]return[ ]request_firmware' drivers/net/wireless/libertas/if_usb.c
+ accept '[ ][ ]ret[ ]=[ ]request_firmware[(]\(helper,[ ]user_helper\|mainfw,[ ]user_mainfw\)' drivers/net/wireless/libertas/main.c
+ defsnc 'static[ ]const[ ]int[ ]\(ldo5\|buck1\)_voltage_map\[\][ ]=' drivers/regulator/lp3972.c
+ accept '\([ ][*][ ]\(format\|information\)[^\n]*\|[#]define[ ]REG_DATA_FILE_A\?G[ ]*\)["]\([.][/]\)\?regulatoryData_A\?G\.bin["]' drivers/staging/ath6kl/include/common/regulatory/reg_dbschema.h
+ blobname 'ath6k[/]AR6003[/]hw[12]\.0[/]\(otp\|athwlan\)\.bin\.z77' drivers/staging/ath6kl/os/linux/include/ar6000_drv.h
+ blobname 'ath6k[/]AR6003[/]hw[12]\.0[/]\(athtcmd_ram\|device\|data\.patch\|endpointping\|bdata\.\(SD3[12]\|WB31\|CUSTOM\)\)\.bin' drivers/staging/ath6kl/os/linux/include/ar6000_drv.h
+ defsnc 'static[ ]const[ ]A_INT32[ ]wmi_rateTable\[\]\[2\][ ]=' drivers/staging/ath6kl/wmi/wmi.c
+ defsnc 'static[ ]DDR_SET_NODE[ ]asT3\(LP\)\?B\?_DDRSetting\(80\|100\|133\|160\)MHz\[\][ ]\?=' drivers/staging/bcm/DDRInit.c
+ blobname '\([/]lib[/]firmware[/]\)\?macxvi200\.bin' drivers/staging/bcm/Macros.h
+ accept '-[ ]On-chip[ ]firmware[ ]loaded[ ]using[ ]standard[ ]request_firmware[(][)]' 'drivers/staging/brcm80211\(/brcmfmac\)\?/README'
+ blobname 'brcm[/]bcm43xx\(_hdr\)-0[-0-9]*\.fw' drivers/staging/brcm80211/README
+ blobname 'brcm[/]bcm4329-fullmac-4[-0-9]*\.bin' drivers/staging/brcm80211/brcmfmac/README
+ blob 'Firmware[ ]installation[\n]=\+\([\n]\+[^\n=][^\n]*\)\+\([/]lib[/]firmware[/]brcm\|\.fw\)[^\n]*\([\n][^\n=][^\n]*\)*\([\n][\n][^=\n][^\n]*[\n][^=\n][^\n]*\([\n][^\n=][^\n]*\)*\)*' 'drivers/staging/brcm80211\(/brcmfmac\)\?/README'
+ defsnc '[ ]u16[ ]nrate_list\[4\]\[8\][ ]=' drivers/staging/brcm80211/brcmfmac/wl_iw.c
+ defsnc 'static[ ]chan_info_basic_t[ ]chan_info_all\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_cmn.c
+ defsnc 'u16[ ]ltrn_list\[PHY_LTRN_LIST_LEN\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_cmn.c
+ defsnc 's8[ ]lcnphy_gain_index_offset_for_pkt_rssi\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_cmn.c
+ defsnc 'lcnphy_rx_iqcomp_t[ ]lcnphy_rx_iqcomp_table_rev0\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_lcn.c
+ defsnc 'static[ ]const[ ]u32[ ]lcnphy_23bitgaincode_table\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_lcn.c
+ defsnc 'static[ ]const[ ]s8[ ]lcnphy_gain_table\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_lcn.c
+ defsnc 'static[ ]const[ ]s8[ ]lcnphy_gain_index_offset_for_rssi\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_lcn.c
+ defsnc 'static[ ]chan_info_2064_lcnphy_t[ ]chan_info_2064_lcnphy\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_lcn.c
+ defsnc 'lcnphy_radio_regs_t[ ]lcnphy_radio_regs_2064\[\][ ]=' defsnc 's8[ ]lcnphy_gain_index_offset_for_pkt_rssi\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_lcm.c
+ defsnc 'u16[ \n]*LCNPHY_txdigfiltcoeffs_\(cck\|ofdm\)\[LCNPHY_NUM_TX_DIG_FILTERS_\(CCK\|OFDM\)\][ \n]*\[LCNPHY_NUM_DIG_FILT_COEFFS[ ][+][ ]1\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_lcn.c
+ defsnc 'nphy_ipa_txrxgain_t[ ]nphy_ipa_rxcal_gaintbl_2GHz\(_rev7\)\?\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_n.c
+ defsnc 'static[ ]chan_info_nphy_\(radio\)\?205[5x7]\(_rev5\)\?_t[ ]chan_info_nphy\(rev[3-9]\(n6\)\?\)\?_205[5-7]\(_A1\|v\([5-8]\|11\)\|_rev[4-8]\(v1\)\?\)\?\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_n.c
+ defsnc 'radio_\(20xx_\)\?regs_t[ ]regs_\(SYN_\|[RT]X_\)\?205[5-7]\(_A1\|_rev\([4-8]\|11\)\(v1\)\?\)\?\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_n.c
+ defsnc 'static[ ]const[ ]u16[ ]tbl_iqcal_gainparams_nphy\[2\]\[NPHY_IQCAL_NUMGAINS\]\[8\][ ]=' drivers/staging/mrcm80211/phy/wlc_phy_n.c
+ defsnc 'static[ ]\(const[ ]\)\?u32[ ]nphy_tpc_\(5GHz_\)\?txgain\(_[ei]pa\)\?\(\(_[25]g\)\?\(_\(2057\)\?\(rev\([3-7]\|4n6\)\?\)\?\)\?\|_HiPwrEPA\)\?\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_n.c
+ defsnc 'static[ ]const[ ]u16[ ]nphy_tpc_loscale\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_n.c
+ defsnc 'static[ ]u8[ ]pad_all_gain_codes_2057\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_n.c
+ defsnc 'static[ ]u32[ ]nphy_papd_scaltbl\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_n.c
+ defsnc '[ ]s32[ ]poll_results\[8\]\[4\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_n.c
+ defsnc '[ ]nphy_txiqcal_ladder_t[ ]ladder_\(lo\|iq\)\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_n.c
+ defsnc 'const[ ]u32[ ]dot11lcn_gain_\(idx_\|val_\)\?tbl_\(rev[01]\|\(extlna_\)\?2G\|5G\)\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]u16[ ]dot11lcn_aux_gain_idx_tbl_\(rev0\|\(extlna_\)\?2G\)\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]u32[ ]dot11lcn_aux_gain_idx_tbl_5G\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]u8[ ]dot11lcn_gain_val_tbl_\(rev0\|\(extlna_\)\?2G\)\[\][ ]=' drivers/stagingg/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]u16[ ]dot11lcn_\(min_sig_sq\|noise_scale\)_tbl_rev0\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]u16[ ]dot11lcn_sw_ctrl_tbl_\(4313_\)\?\(bt_\)\?\(epa_\)\?\(p250_\)\?rev0\(_combo\)\?\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]u8[ ]dot11lcn_spur_tbl_rev0\[\][ ]=' drivers/stagingg/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]u16[ ]dot11lcn_\(unsup_mcs\|iq_local\)_tbl_rev0\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]lcnphy_tx_gain_tbl_entry[ ]dot11lcnphy_[25]GHz_\(extPA_\)\?gaintable_rev0\[128\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]u32[ ]dot11lcn_papd_compdelta_tbl_rev0\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]u32[ ]frame_struct_rev[03]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u8[ ]frame_lut_rev[03]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u32[ ]\(tmap\|tdtrn\)_tbl_rev[037]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u16[ ]pilot_tbl_rev[03]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u32[ ]tdi_tbl[24]0_ant[01]_rev[03]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u32[ ]chanest_tbl_rev[03]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u8[ ]mcs_tbl_rev0\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u32[ ]noise_var_tbl[01]\?_rev[037]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u8[ ]\(est\|adj\)_pwr_lut_core[01]_rev[03]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u32[ ]\(gainctrl\|iq\)_lut_core[01]_rev[03]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u16[ ]loft_lut_core[01]_rev[03]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u16[ ]ant_swctrl_tbl_rev3\(_[1-3]\)\?\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u16[ ]mcs_tbl_rev3\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u16[ ]papd_comp_rfpwr_tbl_core[01]_rev3\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u32[ ]papd_\(comp_epsilon\|cal_scalars\)_tbl_core[01]_rev[37]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ blobname 'brcm[/]bcm43xx' drivers/staging/brcm80211/sys/wl_mac80211.c
+ blobname '%s\(_hdr\)\?-%d\.fw' drivers/staging/brcm80211/sys/wl_mac80211.c
+ defsnc 'static[ ]const[ ]u8[ ]crc8_table\[256\][ ]=' drivers/staging/brcm80211/util/bcmutils.c
+ defsnc 'static[ ]const[ ]u16[ ]crc16_table\[256\][ ]=' drivers/staging/brcm80211/util/bcmutils.c
+ defsnc 'static[ ]const[ ]u32[ ]crc32_table\[256\][ ]=' drivers/staging/brcm80211/util/bcmutils.c
+ defsnc 'static[ ]const[ ]pmu0_xtaltab0_t[ ]pmu0_xtaltab0\[\][ ]=' drivers/staging/brcm80211/util/hndpmu.c
+ defsnc 'static[ ]const[ ]pmu1_xtaltab0_t[ ]pmu1_xtaltab0\(_880\(_4329\)\?\|_1760\|_1440\|_960\)\[\][ ]=' drivers/staging/brcm80211/util/hndpmu.c
+ defsnc 'static[ ]const[ ]s16[ ]log_table\[\][ ]=' drivers/staging/brcm80211/util/qmath.c
+ blobname 'ft[12]000\.img' drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
+ blobname 'ft3000\.img' drivers/staging/ft1000/ft1000-usb/ft1000_usb.c
+ defsnc '[ ][ ][ ][ ]u8[ ]ConnectionMsg\[\][ ]=' drivers/staging/ft1000/ft1000-usb/ft1000_chdev.c
+ blobname 'fw_sst_0\(80a\|82f\)\.bin' drivers/staging/intel_sst/intel_sst_common.h
+ # This appends a .bin extension, but without loading the firmware
+ # above, it will never arise, so leave it alone for now.
+ accept '[ ]len[ ][+]=[ ]snprintf[(]buf[ ][+][ ]len[,][ ]sizeof[(]buf[)][ ]-[ ]len,[ ]["][.]bin["][)][;]' drivers/staging/intel_sst/intel_sst_dsp.c
+ defsnc '[ ]struct[ ]sc_reg_access[ ]\(sc_acces[,][ ]\)\?sc_access\[\][ ]=' 'drivers/staging/intel_sst/intelmid_v[012]_control\.c'
+ defsnc '[ ]BYTE[ ]data_ptr\[36\][ ]=' 'drivers/staging/keucr/\(ms\|s[dm]\)scsi\.c'
+ defsnc 'static[ ]BYTE[ ]ecctable\[256\][ ]=' drivers/staging/keucr/smilecc.c
+ defsnc 'static[ ]u8[ ]MAC_REG_TABLE\[\]\[2\][ ]=' drivers/staging/rtl8187se/r8185b_init.c
+ defsnc 'static[ ]u8[ ][ ]*ZEBRA_AGC\[\][ ]=' drivers/staging/rtl8187se/r8185b_init.c
+ defsnc 'static[ ]u32[ ]ZEBRA_RF_RX_GAIN_TABLE\[\][ ]=' drivers/staging/rtl8187se/r8185b_init.c
+ blob 'static[ ]const[ ]unsigned[ ]char[ ]f_array\[122328\][ ]=[ ][{]'"$sepx$blobpat*"',[\n][}][;]' drivers/staging/rtl8712/farray.h
+ blob 'static[ ]u32[ ]rtl871x_open_fw[(][^)]*[)][\n][{]\([\n]\+[^\n}][^\n]*\)*[^\n]*f_array[^\n]*\([\n]\+[^\n}][^\n]*\)*[^\n]*[\n]\+[}]' drivers/staging/rtl8712/hal_init.c
+ defsnc 'static[ ]const[ ]long[ ]frequency_list\[\][ ]=' drivers/staging/rtl8712/rtl871x_ioctl_linux.c
+ defsnc 'static[ ]const[ ]unsigned[ ]short[ ]Sbox1\[2\]\[256\][ ]=' drivers/staging/rtl8712/rtl871x_security.c
+ defsnc 'static[ ]const[ ]u8[ ]sbox_table\[256\][ ]=' drivers/staging/rtl8712/rtl871x_security.c
+ accept '[ ]119,[ ]62,[ ]6,[\n][ ]0,[ ]16,[ ]20,[ ]17,[ ]32,[ ]48,[ ]0,\([\n][ ][0-9]\+,\([ ][0-9]\+,\)*\)*[\n][ ]0,[ ]119' drivers/staging/speakup/speakupmap.h
+ defsnc 'static[ ]u32[ ]\(h_prescale\|v_gain\)\[64\][ ]=' drivers/staging/stradis/stradis.c
+ accept '[/][*][ ]*\([ 1-4][0-9][ ][ ]\)*\(5[0-6][ ][ ]\)*[*][/]' drivers/staging/vt6656/channel.c
+ blobname 'west[ ]bridge[ ]fw' drivers/staging/westbridge/astoria/device/cyasdevice.c
+ defsnc 'static[ ]const[ ]u8[ ]gsm_fcs8\[256\][ ]=' drivers/tty/n_gsm.c
+ defsnc '[ ]static[ ]const[ ]struct[ ]dispc_v_coef[ ]coef_v\(up\|down\)_3tap\[8\][ ]=' drivers/video/omap2/dss/dispc.c
+ blobname 'c[bt]fw_\(fc\|cna\)\.bin' drivers/scsi/bfa/bfad_im.h
+
+ # New in 2.6.38
+ blobname '%s%04x%s["][,][ ]["]fw_sst_["][,][ \n]*sst_drv_ctx->pci_id[,][ ]["]\.bin' drivers/staging/intel_sst/intel_sst_common.h
+ accept '[*][ ]*0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]0[ ]1' arch/x86/crypto/aesni-intel_asm.S
+ defsnc 'static[ ]struct[ ]aead_testvec[ ]\(aes_gcm_rfc4106\)_\(enc\|dec\)_tv_template\[\][ ]=' 'crypto/testmgr.h'
+ defsnc 'const[ ]struct[ ]\(stk1160\|saa7113\)config[ ]\([{][^}]*[}][ ]\)\?\(stk1160\|saa7113\)config\(PAL\|NTSC\)\[256\][ ]=' drivers/staging/easycap/easycap_low.c
+ blobname '\(sep[/]\)\?\extapp\.image\.bin' drivers/staging/sep/sep_driver.c
+ blobname 'radeon[/]\(BARTS\|BTC\|TURKS\|CAICOS\|%s\)_\(pfp\|rlc\|m[ec]\)\.bin' drivers/gpu/drm/radeon/ni.c
+ defsnc 'static[ ]const[ ]u32[ ]\(barts\|turks\|caicos\)_io_mc_regs\[BTC_IO_MC_REGS_SIZE\]\[2\][ ]=' drivers/gpu/drm/radeon/ni.c
+ defsnc 'static[ ]int[ ]types\[0x80\][ ]=' drivers/gpu/drm/nouveau/nv50_vram.c
+ blobname '\(nouveau[/]\)\?fuc4\(09\|1a\)[cd]' drivers/gpu/drm/nouveau/nvc0_graph.c
+ defsnc '[ ][}][ ]v_table\[\][ ]=' drivers/gpu/drm/i915/i915_dma.c
+ defsnc '[}][ ]nec_8048_init_seq\[\][ ]=' drivers/video/omap2/displays/panel-nec-nl8048hl11-01b.c
+ defsnc 'static[ ]const[ ]int[ ]mc13892_sw1\?\[\][ ]=' drivers/regulator/mc13892-regulator.c
+ defsnc 'static[ ]const[ ]int[ ]dcdc[12]_voltages\[\][ ]=' drivers/regulator/tps6524x-regulator.c
+ defsnc '[ ]\(static[ ]const[ ]\)\?u8[ ]init_hash_seed\[\][ ]=' drivers/net/qlge/qlge_main.c
+ blobname 'vxge[/]X3fw\(-pxe\)\.ncf' drivers/net/vxge/vxge-main.c
+ defsnc '[ ][ ]\(static[ ]const[ ]\)\?int[ ]poly\[\]=' drivers/net/pcmcia/nmclan_cs.c
+ defsnc 'static[ ]\(const[ ]\)\?int[ ]fifo_map\[\]\[MAX_TX_FIFOS\][ ]=' drivers/net/s2io.h
+ defsnc 'static[ ]const[ ]struct[ ]efuse_map[ ]RTL8712_SDIO_EFUSE_TABLE\[\][ ]=' drivers/net/wireless/rtlwifi/efuse.c
+ defsnc 'static[ ]const[ ]u32[ ]ofdmswing_table\[OFDM_TABLE_SIZE\][ ]=' drivers/net/wireless/rtlwifi/rtl8192ce/dm.c
+ defsnc 'static[ ]const[ ]u8[ ]cckswing_table_ch\(1ch13\|14\)\[CCK_TABLE_SIZE\]\[8\][ ]=' drivers/net/wireless/rtlwifi/rtl8192ce/dm.c
+ blobname 'rtlwifi[/]rtl8192cfw\.bin' drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
+ # This looks like pure data.
+ defsnc 'static[ ]u8[ ]reserved_page_packet\[TOTAL_RESERVED_PKT_LEN\][ ]=' drivers/net/wireless/rtlwifi/rtl8192ce/fw.c
+ defsnc 'u32[ ]RTL8192CE\(PHY_REG\|_\?RADIO[AB]\|MAC\|AGCTAB\)_\([21]T_\?ARRAY\|ARRAY_PG\)\[\(PHY_REG\|RADIO[AB]\|MAC\|AGCTAB\)_\([21]T_\?ARRAY_\?\|ARRAY_PG\)LENGTH\][ ]=' drivers/net/wireless/rtlwifi/rtl8192ce/table.c
+ defsc 'static[ ]const[ ]struct[ ]ar9300_eeprom[ ]ar9300_[hx]11[236][ ]=' drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
+ defsnc 'static[ ]const[ ]u32[ ]ar9485_1_0_\(mac\|baseband\)_postamble\[\]\[5\][ ]=' drivers/net/wireless/ath/ath9k/ar9485_initvals.h
+ defsnc 'static[ ]const[ ]u32[ ]ar9485\(Common_\(wo_xlna_\)\?rx_gain\)\?_1_0\(_\(radio\|baseband\|mac\)_core\)\?\[\]\[2\][ ]=' drivers/net/wireless/ath/ath9k/ar9485_initvals.h
+ defsnc 'static[ ]const[ ]u32[ ]ar9485Modes_\(high\|low\)\(est\)\?_\(power\|ob_db\)_tx_gain_1_0\[\]\[5\][ ]=' drivers/net/wireless/ath/ath9k/ar9485_initvals.h
+ defsnc 'static[ ]const[ ]struct[ ]b43_nphy_channeltab_entry_rev3[ ]b43_nphy_channeltab_rev\([34568]\|7_9\)\[\][ ]=' drivers/net/wireless/b43/radio_2056.c
+ blobname '["]softing-4[.]6[/]["]' drivers/net/can/softing/softing_platform.h
+ blobname '\(softing-4[.]6[/]\)\?\(\(b\|ld\)card2\?\|can\(card\|sja\|crd2\)\)\.bin' drivers/net/can/softing/softing_cs.c
+ blobna 'which[ ]you[ ]can[ ]get[ ]at[\n][ ][ ][ ]http:[/][/][^\n]*[/]socketcan[/][\n][^-]*firmware[ ]version' drivers/net/can/softing/Kconfig
+ defsnc 'static[ ]struct[ ]regdata[ ]mb86a20s_init\[\][ ]=' drivers/media/dvb/frontends/mb86a20s.c
+ defsnc 'static[ ]struct[ ]regdata[ ]s921_init\[\][ ]=' drivers/media/dvb/frontends/s921.c
+ defsnc 'static[ ]const[ ]struct[ ]regval_list[ ]ov2640_init_regs\[\][ ]=' drivers/media/video/ov2640.c
+ defsnc 'static[ ]const[ ]struct[ ]ov_i2c_regvals[ ]norm_7660\[\][ ]=' drivers/media/video/ov519.c
+ defsnc '[ ]static[ ]const[ ]struct[ ]ov_regvals[ ]bridge_ov7660\[2\]\[10\][ ]=' drivers/media/video/gspca/ov519.c
+ defsnc '[ ]static[ ]const[ ]u8[ ]fr_tb\[2\]\[6\]\[3\][ ]=' drivers/media/video/gspca/ov519.c
+ defsnc '[ ]static[ ]const[ ]struct[ ]ov_i2c_regvals[ ]\(brit\|contrast\|colors\)_7660\[\]\[\(6\|7\|31\)\][ ]=' drivers/media/video/gspca/ov519.c
+ blobname 'radio-wl1273-fw\.bin' drivers/media/radio/radio-wl1273.c
+ defsnc '[}][ ]scrubrates\[\][ ]=' drivers/edac/amd64_edac.c
+ defsnc '[ ]static[ ]const[ ]uint8_t[ ]branch_table\[32\][ ]=' lib/xz/xz_dec_bcj.c
+ defsnc 'static[ ]const[ ]struct[ ]_pll_div[ ]codec_master_pll_div\[\][ ]=' sound/soc/codecs/alc5623.c
+ defsnc '[}][ ]coeff_div\[\][ ]=' sound/soc/codecs/wm8737.c
+ blobname 'rpm_firmware\(_rev11\)\?\.bin' sound/pci/rme9652/hdsp.c
+ blobname 'mwl8k[/]fmimage_8366_ap-["][ ][#]api[ ]["]\.fw' drivers/net/wireless/mwl8k.c
+ blobname 'rtl_nic[/]rtl8168d-[12]\.fw' drivers/net/r8169.c
+ # New in 2.6.38.4
+ defsnc '[ ]static[ ]DEFINE_TEST_\(OK\|FAIL\)[(][^)]*[)][ ]=' lib/test-kstrtox.c
+ ;;
+
+ */*freedo*.patch | */*logo*.patch)
+ accept 'P[13]\([\n]#[^\n]*\)*[\n]*\([\n][0-9 ]*\)\+' drivers/video/logo/logo_libre_clut224.ppm
+ ;;
+
+ */rtl8180*.patch)
+ defsnc 'static[ ]u8[ ]sa2400_rf_rssi_map\[\][ ]=' drivers/net/wireless/rtl818x/rtl8180_sa2400.c
+ ;;
+
+ */patch*-2.6.38-rc*)
+ # New in 2.6.38
+ blobname '%s%04x%s["][,][ ]["]fw_sst_["][,][ \n]*sst_drv_ctx->pci_id[,][ ]["]\.bin' drivers/staging/intel_sst/intel_sst_common.h
+ accept '[*][ ]*0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]0[ ]1' arch/x86/crypto/aesni-intel_asm.S
+ defsnc 'static[ ]struct[ ]aead_testvec[ ]\(aes_gcm_rfc4106\)_\(enc\|dec\)_tv_template\[\][ ]=' 'crypto/testmgr.h'
+ defsnc 'const[ ]struct[ ]\(stk1160\|saa7113\)config[ ]\([{][^}]*[}][ ]\)\?\(stk1160\|saa7113\)config\(PAL\|NTSC\)\?\[256\][ ]=' drivers/staging/easycap/easycap_low.c
+ blobname '\(sep[/]\)\?\extapp\.image\.bin' drivers/staging/sep/sep_driver.c
+ blobname 'radeon[/]\(BARTS\|BTC\|TURKS\|CAICOS\|%s\)_\(pfp\|rlc\|m[ec]\)\.bin' drivers/gpu/drm/radeon/ni.c
+ defsnc 'static[ ]const[ ]u32[ ]\(barts\|turks\|caicos\)_io_mc_regs\[BTC_IO_MC_REGS_SIZE\]\[2\][ ]=' drivers/gpu/drm/radeon/ni.c
+ defsnc 'static[ ]int[ ]types\[0x80\][ ]=' drivers/gpu/drm/nouveau/nv50_vram.c
+ blobname '\(nouveau[/]\)\?fuc4\(09\|1a\)[cd]' drivers/gpu/drm/nouveau/nvc0_graph.c
+ defsnc '[ ][}][ ]v_table\[\][ ]=' drivers/gpu/drm/i915/i915_dma.c
+ defsnc '[}][ ]nec_8048_init_seq\[\][ ]=' drivers/video/omap2/displays/panel-nec-nl8048hl11-01b.c
+ defsnc 'static[ ]const[ ]int[ ]mc13892_sw1\?\[\][ ]=' drivers/regulator/mc13892-regulator.c
+ defsnc 'static[ ]const[ ]int[ ]dcdc[12]_voltages\[\][ ]=' drivers/regulator/tps6524x-regulator.c
+ defsnc '[ ]\(static[ ]const[ ]\)\?u8[ ]init_hash_seed\[\][ ]=' drivers/net/qlge/qlge_main.c
+ blobname 'vxge[/]X3fw\(-pxe\)\.ncf' drivers/net/vxge/vxge-main.c
+ defsnc '[ ][ ]\(static[ ]const[ ]\)\?int[ ]poly\[\]=' drivers/net/pcmcia/nmclan_cs.c
+ defsnc 'static[ ]\(const[ ]\)\?int[ ]fifo_map\[\]\[MAX_TX_FIFOS\][ ]=' drivers/net/s2io.h
+ defsnc 'static[ ]const[ ]struct[ ]efuse_map[ ]RTL8712_SDIO_EFUSE_TABLE\[\][ ]=' drivers/net/wireless/rtlwifi/efuse.c
+ defsnc 'static[ ]const[ ]u32[ ]ofdmswing_table\[OFDM_TABLE_SIZE\][ ]=' drivers/net/wireless/rtlwifi/rtl8192ce/dm.c
+ defsnc 'static[ ]const[ ]u8[ ]cckswing_table_ch\(1ch13\|14\)\[CCK_TABLE_SIZE\]\[8\][ ]=' drivers/net/wireless/rtlwifi/rtl8192ce/dm.c
+ blobname 'rtlwifi[/]rtl8192cfw\.bin' drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
+ # This looks like pure data.
+ defsnc 'static[ ]u8[ ]reserved_page_packet\[TOTAL_RESERVED_PKT_LEN\][ ]=' drivers/net/wireless/rtlwifi/rtl8192ce/fw.c
+ defsnc 'u32[ ]RTL8192CE\(PHY_REG\|_\?RADIO[AB]\|MAC\|AGCTAB\)_\([21]T_\?ARRAY\|ARRAY_PG\)\[\(PHY_REG\|RADIO[AB]\|MAC\|AGCTAB\)_\([21]T_\?ARRAY_\?\|ARRAY_PG\)LENGTH\][ ]=' drivers/net/wireless/rtlwifi/rtl8192ce/table.c
+ defsc 'static[ ]const[ ]struct[ ]ar9300_eeprom[ ]ar9300_[hx]11[236][ ]=' drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
+ defsnc 'static[ ]const[ ]u32[ ]ar9485_1_0_\(mac\|baseband\)_postamble\[\]\[5\][ ]=' drivers/net/wireless/ath/ath9k/ar9485_initvals.h
+ defsnc 'static[ ]const[ ]u32[ ]ar9485\(Common_\(wo_xlna_\)\?rx_gain\)\?_1_0\(_\(radio\|baseband\|mac\)_core\)\?\[\]\[2\][ ]=' drivers/net/wireless/ath/ath9k/ar9485_initvals.h
+ defsnc 'static[ ]const[ ]u32[ ]ar9485Modes_\(high\|low\)\(est\)\?_\(power\|ob_db\)_tx_gain_1_0\[\]\[5\][ ]=' drivers/net/wireless/ath/ath9k/ar9485_initvals.h
+ defsnc 'static[ ]const[ ]struct[ ]b43_nphy_channeltab_entry_rev3[ ]b43_nphy_channeltab_rev\([34568]\|7_9\)\[\][ ]=' drivers/net/wireless/b43/radio_2056.c
+ blobname '["]softing-4[.]6[/]["]' drivers/net/can/softing/softing_platform.h
+ blobname '\(softing-4[.]6[/]\)\?\(\(b\|ld\)card2\?\|can\(card\|sja\|crd2\)\)\.bin' drivers/net/can/softing/softing_cs.c
+ blobna 'which[ ]you[ ]can[ ]get[ ]at[\n][ ][ ][ ]http:[/][/][^\n]*[/]socketcan[/][\n][^-]*firmware[ ]version' drivers/net/can/softing/Kconfig
+ defsnc 'static[ ]struct[ ]regdata[ ]mb86a20s_init\[\][ ]=' drivers/media/dvb/frontends/mb86a20s.c
+ defsnc 'static[ ]struct[ ]regdata[ ]s921_init\[\][ ]=' drivers/media/dvb/frontends/s921.c
+ defsnc 'static[ ]const[ ]struct[ ]regval_list[ ]ov2640_init_regs\[\][ ]=' drivers/media/video/ov2640.c
+ defsnc 'static[ ]const[ ]struct[ ]ov_i2c_regvals[ ]norm_7660\[\][ ]=' drivers/media/video/ov519.c
+ defsnc '[ ]static[ ]const[ ]struct[ ]ov_regvals[ ]bridge_ov7660\[2\]\[10\][ ]=' drivers/media/video/gspca/ov519.c
+ defsnc '[ ]static[ ]const[ ]u8[ ]fr_tb\[2\]\[6\]\[3\][ ]=' drivers/media/video/gspca/ov519.c
+ defsnc '[ ]static[ ]const[ ]struct[ ]ov_i2c_regvals[ ]\(brit\|contrast\|colors\)_7660\[\]\[\(6\|7\|31\)\][ ]=' drivers/media/video/gspca/ov519.c
+ blobname 'radio-wl1273-fw\.bin' drivers/media/radio/radio-wl1273.c
+ defsnc '[}][ ]scrubrates\[\][ ]=' drivers/edac/amd64_edac.c
+ defsnc '[ ]static[ ]const[ ]uint8_t[ ]branch_table\[32\][ ]=' lib/xz/xz_dec_bcj.c
+ defsnc 'static[ ]const[ ]struct[ ]_pll_div[ ]codec_master_pll_div\[\][ ]=' sound/soc/codecs/alc5623.c
+ defsnc '[}][ ]coeff_div\[\][ ]=' sound/soc/codecs/wm8737.c
+ blobname 'rpm_firmware\(_rev11\)\?\.bin' sound/pci/rme9652/hdsp.c
+ blobname 'mwl8k[/]fmimage_8366_ap-["][ ][#]api[ ]["]\.fw' drivers/net/wireless/mwl8k.c
+ blobname 'rtl_nic[/]rtl8168d-[12]\.fw' drivers/net/r8169.c
+ # Above is for patterns new in 2.6.38, below is for older patterns.
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]__u8[ ]pac207_sensor_init\[\]\[8\(\][ ]=[ ][{]\)\?\([*][/][;]\)\?' drivers/media/video/gspca/pac207.c
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]__u8[ ]pas202_sensor_init\[\]\[8\(\][ ]=[ ][{]\)\?\([*][/][;]\)\?' drivers/media/video/gspca/sonixb.c
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]u32[ ]ar9300Modes_\(\(low\(est\)\?\|high\)_ob_db\|high_power\)_tx_gain_table_2p[02]\[\]\[5\][ ]=\([ ][{][*][/][;]\)\?' 'drivers/net/wireless/ath/ath9k/ar9003_\(2p[02]_\)\?initvals\.h'
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]u32[ ]ar9300_2p[02]_\(radio\|mac\|baseband\)_postamble\[\]\[5\][ ]=\([ ][{][*][/][;]\)\?' 'drivers/net/wireless/ath/ath9k/ar9003_\(2p[02]_\)\?initvals\.h'
+ initc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]struct[ ]ar9300_eeprom[ ]ar9300_default[ ]=\([ ][{][*][/][;]\)\?' drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?\(static[ ]\)\?const[ ]u32[ ]b43_ntab_framestruct\[\][ ]=\([ ][{][*][/][;]\)\?' drivers/net/wireless/b43/tables_nphy.c
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?int[ ]tones\[2048\][ ]=\([ ][{][*][/][;]\)\?' drivers/staging/easycap/easycap_testcard.c
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]\(yy\)\?const[ ]\(yytype\|flex\)_u\?int\(8\|16\|32\)\(_t\)\?[ ]yy[^\n []*\[[0-9]*\][ ]=\([*][/][;]\)\?' '.*\.tab\.c_shipped'
+ initnc "[ ][ ][ ]interrupts[ ]=[ ]<\\(0x\\)\\?3[ ]\\(0x\\)\\?0[ ]\\(0x\\)\\?0[ ][ ]$blobpat*>[;]" 'arch/powerpc/boot/dts/\(cm5200\|lite5200b\?\|kuroboxHG\|pcm030\|tqm5200\).dts'
+ accept '[ ]p7500->firmware[ ]=' drivers/media/dvb/dvb-usb/dw2102.c
+ defsnc 'static[ ]\(const[ ]\)\?\(__\)\?u8[ ]\(mt9v111\|sp80708\|hv7131[rd]\|mi0360b\?\|mo4000\|ov76\([36]0\|48\)\|om6802\)_sensor_\(init\|param1\)\[\]\[8\][ ]=' drivers/media/video/gspca/sonixj.c
+ initnc '\(uint16_t\|u16\)[ ]e1000_igp_2_cable_length_table\[IGP02E1000_AGC_LENGTH_TABLE_SIZE\][ ]=' drivers/net/e1000/e1000_hw.c # u16 on 2.6.26
+ defsnc 'static[ ]const[ ]u16[ ]e1000_igp_2_cable_length_table\[\][ ]=' drivers/net/e1000e/phy.c
+ initnc 'static[ ]const[ ]u32[ ]\(main\|gear\)_seedset\[BACKOFF_SEEDSET_ROWS\]\[BACKOFF_SEEDSET_LFSRS\][ ]=' drivers/net/forcedeth.c
+ defsnc '[ ][ ]*\(static[ ]\)\?\(const[ ]\)\?struct[ ]phy_reg[ ]phy_reg_init\(_0\)\?\[\][ ]=' drivers/net/r8169.c
+ defsnc 'static[ ]const[ ]struct[ ]ath5k_ini_mode[ ]rf5413_ini_mode_end\[\][ ]=' drivers/net/wireless/ath/ath5k/initvals.c
+ defsnc 'static[ ]const[ ]struct[ ]ath5k_ini_rfbuffer[ ]rfb_\(511[12]a\?\|5413\|231[67]\|24\(1[37]\|25\)\)\[\][ ]=' drivers/net/wireless/ath5k/rfbuffer.h
+ accept '[ ]hif_dev->firmware[ ]=[ ]NULL[;]' drivers/net/wireless/ath/ath9k/hif_usb.c
+ defsnc '\(static[ ]\)\?const[ ]u\(8\|16\|32\)[ ]b43_ntab_\(\(adjustpower\|estimatepowerlt\|gainctl\|iqlt\|loftlt\|noisevar1\|tdi[24]0a\)[01]\|channelest\|frame\(lookup\|struct\)\|mcs\|pilot\|tdtrn\|tmap\)\[\][ ]=' drivers/net/wireless/b43/tables_nphy.c
+ defsnc 'static[ ]const[ ]u8[ ]rtl8225\(z2\)\?_\(agc\|ofdm\|\(tx_\)\?\(power\|gain\)_cck\(_ch14\|_ofdm\)\?\)\[\][ ]=' 'drivers/net/wireless/rtl818x/rtl818[07]/rtl8225\.c'
+ defsnc 'static[ ]const[ ]u16[ ]rtl8225\(bcd\|z2\)_rxgain\[\][ ]=' 'drivers/net/wireless/rtl818x/rtl818[07]/rtl8225\.c'
+ defsnc 'static[ ]u8[ ]sa2400_rf_rssi_map\[\][ ]=' drivers/net/wireless/rtl818x/rtl8180_sa2400.c
+ defsnc 'static[ ]const[ ]u8[ ]rtl8187b_reg_table\[\]\[3\][ ]=' drivers/net/wireless/rtl8187_dev.c
+ defsnc '[ ][ ][ ][ ]u8[ ]ConnectionMsg\[\][ ]=' drivers/staging/ft1000/ft1000-usb/ft1000_chdev.c
+ accept '[ ]len[ ][+]=[ ]snprintf[(]buf[ ][+][ ]len[,][ ]sizeof[(]buf[)][ ]-[ ]len,[ ]["][.]bin["][)][;]' drivers/staging/intel_sst/intel_sst_dsp.c
+ defsnc 'static[ ]unsigned[ ]char[ ]vid_vop_header\[\][ ]=' drivers/staging/solo6x10/solo6010-v4l2-enc.c
+ accept 'MODULE_FIRMWARE[(]["]\(cis[/]\)\?\(PCMLM28\|DP83903\|3C\(CF\|X\)EM556\|MT5634ZLX\|COMpad[24]\|RS-COM-2P\|GLOBETROTTER\|SW_\([78]xx\|555\)_SER\)\.cis["][)][;]\([\n]MODULE_FIRMWARE[(]["]\(cis[/]\)\?\(PCMLM28\|DP83903\|3C\(CF\|X\)EM556\|MT5634ZLX\|COMpad[24]\|RS-COM-2P\|GLOBETROTTER\|SW_\([78]xx\|555\)_SER\)\.cis["][)][;]\)*' drivers/serial/serial_cs.c
+ defsnc 'static[ ]struct[ ]v_table[ ]v_table\[\][ ]=' drivers/gpu/drm/i915/i915_dma.c
+ defsnc 'static[ ]u8[ ]\(init\|c\)_table\[\]=' drivers/media/dvb/frontends/s921_core.c
+ defsnc 'static[ ]\(u16\|struct[ ]i2c_reg_u16\)[ ]\(bridge\|mt9\(v\(11[12]\|011\)\|m001\)\)_init\[\]\(\[2\]\)\?[ ]=' drivers/media/video/gspca/sn9c20x.c
+ defsnc '[ ]static[ ]const[ ]struct[ ]struct_initData[ ]initData\[\][ ]=' drivers/media/video/usbvideo/ibmcam.c
+ defsnc '[ ]\(static[ ]const[ ]\)\?u32[ ]reg_boundaries\[\][ ]=' drivers/net/bnx2.c
+ initnc 'static[ ]const[ ]struct[ ]ath5k_ini_mode[ ]rf\(5413\|24\(13\|25\)\)_ini_mode_end\[\][ ]=' drivers/net/wireless/ath5k/initvals.c
+ defsnc 'static[ ]u32[ ]\(h_prescale\|v_gain\)\[64\][ ]=' drivers/staging/stradis/stradis.c
+ ;;
+
+ */patch*-2.6.38*)
+ # New in 2.6.38.4
+ defsnc '[ ]static[ ]DEFINE_TEST_\(OK\|FAIL\)[(][^)]*[)][ ]=' lib/test-kstrtox.c
+ ;;
+
+ */patch*-2.6.37-rc*) # up to -rc8-git3
+ defsnc 'static[ ]u32[ ]epll_div\[\]\[6\][ ]=' arch/arm/mach-s5pv210/clock.c
+ defsnc 'static[ ]struct[ ]titan_gpio_cfg[ ]titan_gpio_table\[\][ ]=' arch/mips/ar7/gpio.c
+ blobname 'sdma-%s-to%d\.bin' drivers/dma/imx-sdma.c
+ defsnc '[ ]static[ ]u8[ ]def_regs\[\][ ]=' drivers/media/common/tuners/tda18218.c
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]lme2510c\?_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*\([ ]\.download_firmware[ ]=[ ]lme2510_download_firmware,[\n]\)\?[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/lmedm04.c
+ blobname 'dvb-usb-lme2510c\?-\(lg\|s7395\)\.fw' drivers/media/dvb/dvb-usb/lmedm04.c
+ defsnc 'static[ ]u8[ ]s7395_inittab\[\][ ]=' drivers/media/dvb/dvb-usb/lmedm04.h
+ defsnc 'static[ ]const[ ]u16[ ]rca_initdata\[\]\[3\][ ]=' drivers/media/video/gspca/xirlink_cit.c
+ blobname 'NXP7164-2010-03-10\.1\.fw' drivers/media/video/saa7164/saa7164-fw.c
+ defsnc 'static[ ]struct[ ]nand_ecclayout[ ]fsmc_ecc4_lp_layout[ ]=' drivers/mtd/nand/fsmc_nand.c
+ defsnc 'static[ ]struct[ ]pxa3xx_nand_timing[ ]timing\[\][ ]=' drivers/mtd/nand/pxa3xx_nand.c
+ blobname 'ctfw_cna\.bin' drivers/net/bna/cna.h
+ accept '[#]define[ ]CARL9170FW_NAME[ ]\+["]carl9170-1\.fw["]' drivers/net/wireless/ath/carl9170/carl9170.h
+ defsnc 'static[ ]struct[ ]carl9170_phy_init[ ]ar5416_phy_init\[\][ ]=' drivers/net/wireless/carl9170/phy.c
+ defsnc 'static[ ]struct[ ]carl9170_rf_initvals[ ]carl9170_rf_initval\[\][ ]=' drivers/net/wireless/carl9170/phy.c
+ defsnc 'static[ ]const[ ]struct[ ]carl9170_phy_freq_entry[ ]carl9170_phy_freq_params\[\][ ]=' drivers/net/wireless/carl9170/phy.c
+ accept 'MODULE_FIRMWARE[(]CARL9170FW_NAME[)][;]' drivers/net/wireless/carl9170/usb.c
+ accept '[ ]return[ ]request_firmware_nowait[(][^\n]*,[ ]CARL9170FW_NAME,' drivers/net/wireless/carl9170/usb.c
+ blobname 'iwlwifi-100-' drivers/net/iwlwifi/iwl-1000.c
+ blobname 'iwlwifi-130-' drivers/net/iwlwifi/iwl-6000.c
+ blobname 'libertas[/]cf83\(05\|8[15]\)\(_helper\)\?\.bin' drivers/net/wireless/libertas/if_cs.c
+ blobname 'libertas[/]sd\(8385\|8686\(_v[89]\)\|8688\)\(_helper\)\?\.bin' drivers/net/wireless/libertas/if_sdio.c
+ blobname 'libertas[/]gspi\(8385\|8686\(_v9\)\?\|8688\)\(_helper\|_hlp\)\?\.bin' drivers/net/wireless/libertas/if_spi.c
+ blobname 'libertas[/]usb\(8388\(_v[59]\)\?\|8682\)\.bin' drivers/net/wireless/libertas/if_usb.c
+ accept '[ ][/][*][ ]Try[ ]user-specified[ ]firmware[ ]first[ ][*][/][\n][ ]if[ ][(]fwname[)][\n][ ][ ]return[ ]request_firmware' drivers/net/wireless/libertas/if_usb.c
+ accept '[ ][ ]ret[ ]=[ ]request_firmware[(]\(helper,[ ]user_helper\|mainfw,[ ]user_mainfw\)' drivers/net/wireless/libertas/main.c
+ defsnc 'static[ ]const[ ]int[ ]\(ldo5\|buck1\)_voltage_map\[\][ ]=' drivers/regulator/lp3972.c
+ accept '\([ ][*][ ]\(format\|information\)[^\n]*\|[#]define[ ]REG_DATA_FILE_A\?G[ ]*\)["]\([.][/]\)\?regulatoryData_A\?G\.bin["]' drivers/staging/ath6kl/include/common/regulatory/reg_dbschema.h
+ blobname 'ath6k[/]AR6003[/]hw[12]\.0[/]\(otp\|athwlan\)\.bin\.z77' drivers/staging/ath6kl/os/linux/include/ar6000_drv.h
+ blobname 'ath6k[/]AR6003[/]hw[12]\.0[/]\(athtcmd_ram\|device\|data\.patch\|endpointping\|bdata\.\(SD3[12]\|WB31\|CUSTOM\)\)\.bin' drivers/staging/ath6kl/os/linux/include/ar6000_drv.h
+ defsnc 'static[ ]const[ ]A_INT32[ ]wmi_rateTable\[\]\[2\][ ]=' drivers/staging/ath6kl/wmi/wmi.c
+ defsnc 'static[ ]DDR_SET_NODE[ ]asT3\(LP\)\?B\?_DDRSetting\(80\|100\|133\|160\)MHz\[\][ ]\?=' drivers/staging/bcm/DDRInit.c
+ blobname '\([/]lib[/]firmware[/]\)\?macxvi200\.bin' drivers/staging/bcm/Macros.h
+ accept '-[ ]On-chip[ ]firmware[ ]loaded[ ]using[ ]standard[ ]request_firmware[(][)]' 'drivers/staging/brcm80211\(/brcmfmac\)\?/README'
+ blobname 'brcm[/]bcm43xx\(_hdr\)-0[-0-9]*\.fw' drivers/staging/brcm80211/README
+ blobname 'brcm[/]bcm4329-fullmac-4[-0-9]*\.bin' drivers/staging/brcm80211/brcmfmac/README
+ blob 'Firmware[ ]installation[\n]=\+\([\n]\+[^\n=][^\n]*\)\+\([/]lib[/]firmware[/]brcm\|\.fw\)[^\n]*\([\n][^\n=][^\n]*\)*\([\n][\n][^=\n][^\n]*[\n][^=\n][^\n]*\([\n][^\n=][^\n]*\)*\)*' 'drivers/staging/brcm80211\(/brcmfmac\)\?/README'
+ defsnc '[ ]u16[ ]nrate_list\[4\]\[8\][ ]=' drivers/staging/brcm80211/brcmfmac/wl_iw.c
+ defsnc 'static[ ]chan_info_basic_t[ ]chan_info_all\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_cmn.c
+ defsnc 'u16[ ]ltrn_list\[PHY_LTRN_LIST_LEN\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_cmn.c
+ defsnc 's8[ ]lcnphy_gain_index_offset_for_pkt_rssi\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_cmn.c
+ defsnc 'lcnphy_rx_iqcomp_t[ ]lcnphy_rx_iqcomp_table_rev0\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_lcn.c
+ defsnc 'static[ ]const[ ]u32[ ]lcnphy_23bitgaincode_table\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_lcn.c
+ defsnc 'static[ ]const[ ]s8[ ]lcnphy_gain_table\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_lcn.c
+ defsnc 'static[ ]const[ ]s8[ ]lcnphy_gain_index_offset_for_rssi\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_lcn.c
+ defsnc 'static[ ]chan_info_2064_lcnphy_t[ ]chan_info_2064_lcnphy\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_lcn.c
+ defsnc 'lcnphy_radio_regs_t[ ]lcnphy_radio_regs_2064\[\][ ]=' defsnc 's8[ ]lcnphy_gain_index_offset_for_pkt_rssi\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_lcm.c
+ defsnc 'u16[ \n]*LCNPHY_txdigfiltcoeffs_\(cck\|ofdm\)\[LCNPHY_NUM_TX_DIG_FILTERS_\(CCK\|OFDM\)\][ \n]*\[LCNPHY_NUM_DIG_FILT_COEFFS[ ][+][ ]1\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_lcn.c
+ defsnc 'nphy_ipa_txrxgain_t[ ]nphy_ipa_rxcal_gaintbl_2GHz\(_rev7\)\?\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_n.c
+ defsnc 'static[ ]chan_info_nphy_\(radio\)\?205[5x7]\(_rev5\)\?_t[ ]chan_info_nphy\(rev[3-9]\(n6\)\?\)\?_205[5-7]\(_A1\|v\([5-8]\|11\)\|_rev[4-8]\(v1\)\?\)\?\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_n.c
+ defsnc 'radio_\(20xx_\)\?regs_t[ ]regs_\(SYN_\|[RT]X_\)\?205[5-7]\(_A1\|_rev\([4-8]\|11\)\(v1\)\?\)\?\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_n.c
+ defsnc 'static[ ]const[ ]u16[ ]tbl_iqcal_gainparams_nphy\[2\]\[NPHY_IQCAL_NUMGAINS\]\[8\][ ]=' drivers/staging/mrcm80211/phy/wlc_phy_n.c
+ defsnc 'static[ ]\(const[ ]\)\?u32[ ]nphy_tpc_\(5GHz_\)\?txgain\(_[ei]pa\)\?\(\(_[25]g\)\?\(_\(2057\)\?\(rev\([3-7]\|4n6\)\?\)\?\)\?\|_HiPwrEPA\)\?\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_n.c
+ defsnc 'static[ ]const[ ]u16[ ]nphy_tpc_loscale\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_n.c
+ defsnc 'static[ ]u8[ ]pad_all_gain_codes_2057\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_n.c
+ defsnc 'static[ ]u32[ ]nphy_papd_scaltbl\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_n.c
+ defsnc '[ ]s32[ ]poll_results\[8\]\[4\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_n.c
+ defsnc '[ ]nphy_txiqcal_ladder_t[ ]ladder_\(lo\|iq\)\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phy_n.c
+ defsnc 'const[ ]u32[ ]dot11lcn_gain_\(idx_\|val_\)\?tbl_\(rev[01]\|\(extlna_\)\?2G\|5G\)\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]u16[ ]dot11lcn_aux_gain_idx_tbl_\(rev0\|\(extlna_\)\?2G\)\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]u32[ ]dot11lcn_aux_gain_idx_tbl_5G\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]u8[ ]dot11lcn_gain_val_tbl_\(rev0\|\(extlna_\)\?2G\)\[\][ ]=' drivers/stagingg/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]u16[ ]dot11lcn_\(min_sig_sq\|noise_scale\)_tbl_rev0\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]u16[ ]dot11lcn_sw_ctrl_tbl_\(4313_\)\?\(bt_\)\?\(epa_\)\?\(p250_\)\?rev0\(_combo\)\?\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]u8[ ]dot11lcn_spur_tbl_rev0\[\][ ]=' drivers/stagingg/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]u16[ ]dot11lcn_\(unsup_mcs\|iq_local\)_tbl_rev0\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]lcnphy_tx_gain_tbl_entry[ ]dot11lcnphy_[25]GHz_\(extPA_\)\?gaintable_rev0\[128\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]u32[ ]dot11lcn_papd_compdelta_tbl_rev0\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_lcn.c
+ defsnc 'const[ ]u32[ ]frame_struct_rev[03]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u8[ ]frame_lut_rev[03]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u32[ ]\(tmap\|tdtrn\)_tbl_rev[037]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u16[ ]pilot_tbl_rev[03]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u32[ ]tdi_tbl[24]0_ant[01]_rev[03]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u32[ ]chanest_tbl_rev[03]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u8[ ]mcs_tbl_rev0\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u32[ ]noise_var_tbl[01]\?_rev[037]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u8[ ]\(est\|adj\)_pwr_lut_core[01]_rev[03]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u32[ ]\(gainctrl\|iq\)_lut_core[01]_rev[03]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u16[ ]loft_lut_core[01]_rev[03]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u16[ ]ant_swctrl_tbl_rev3\(_[1-3]\)\?\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u16[ ]mcs_tbl_rev3\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u16[ ]papd_comp_rfpwr_tbl_core[01]_rev3\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ defsnc 'const[ ]u32[ ]papd_\(comp_epsilon\|cal_scalars\)_tbl_core[01]_rev[37]\[\][ ]=' drivers/staging/brcm80211/phy/wlc_phytbl_n.c
+ blobname 'brcm[/]bcm43xx' drivers/staging/brcm80211/sys/wl_mac80211.c
+ blobname '%s\(_hdr\)\?-%d\.fw' drivers/staging/brcm80211/sys/wl_mac80211.c
+ defsnc 'static[ ]const[ ]u8[ ]crc8_table\[256\][ ]=' drivers/staging/brcm80211/util/bcmutils.c
+ defsnc 'static[ ]const[ ]u16[ ]crc16_table\[256\][ ]=' drivers/staging/brcm80211/util/bcmutils.c
+ defsnc 'static[ ]const[ ]u32[ ]crc32_table\[256\][ ]=' drivers/staging/brcm80211/util/bcmutils.c
+ defsnc 'static[ ]const[ ]pmu0_xtaltab0_t[ ]pmu0_xtaltab0\[\][ ]=' drivers/staging/brcm80211/util/hndpmu.c
+ defsnc 'static[ ]const[ ]pmu1_xtaltab0_t[ ]pmu1_xtaltab0\(_880\(_4329\)\?\|_1760\|_1440\|_960\)\[\][ ]=' drivers/staging/brcm80211/util/hndpmu.c
+ defsnc 'static[ ]const[ ]s16[ ]log_table\[\][ ]=' drivers/staging/brcm80211/util/qmath.c
+ blobname 'ft[12]000\.img' drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
+ blobname 'ft3000\.img' drivers/staging/ft1000/ft1000-usb/ft1000_hw.c
+ defsnc '[ ][ ][ ][ ]u8[ ]ConnectionMsg\[\][ ]=' drivers/staging/ft1000/ft1000-usb/ft1000_chdev.c
+ blobname 'fw_sst_0\(80a\|82f\)\.bin' drivers/staging/intel_sst/intel_sst_common.h
+ # This appends a .bin extension, but without loading the firmware
+ # above, it will never arise, so leave it alone for now.
+ accept '[ ]len[ ][+]=[ ]snprintf[(]buf[ ][+][ ]len[,][ ]sizeof[(]buf[)][ ]-[ ]len,[ ]["][.]bin["][)][;]' drivers/staging/intel_sst/intel_sst_dsp.c
+ defsnc '[ ]struct[ ]sc_reg_access[ ]\(sc_acces[,][ ]\)\?sc_access\[\][ ]=' 'drivers/staging/intel_sst/intelmid_v[012]_control\.c'
+ defsnc '[ ]BYTE[ ]data_ptr\[36\][ ]=' 'drivers/staging/keucr/\(ms\|s[dm]\)scsi\.c'
+ defsnc 'static[ ]BYTE[ ]ecctable\[256\][ ]=' drivers/staging/keucr/smilecc.c
+ defsnc 'static[ ]u8[ ]MAC_REG_TABLE\[\]\[2\][ ]=' drivers/staging/rtl8187se/r8185b_init.c
+ defsnc 'static[ ]u8[ ][ ]*ZEBRA_AGC\[\][ ]=' drivers/staging/rtl8187se/r8185b_init.c
+ defsnc 'static[ ]u32[ ]ZEBRA_RF_RX_GAIN_TABLE\[\][ ]=' drivers/staging/rtl8187se/r8185b_init.c
+ blob 'static[ ]const[ ]unsigned[ ]char[ ]f_array\[122328\][ ]=[ ][{]'"$sepx$blobpat*"',[\n][}][;]' drivers/staging/rtl8712/farray.h
+ blob 'static[ ]u32[ ]rtl871x_open_fw[(][^)]*[)][\n][{]\([\n]\+[^\n}][^\n]*\)*[^\n]*f_array\([\n]\+[^\n}][^\n]*\)*[^\n]*[\n]\+[}]' drivers/staging/rtl8712/hal_init.c
+ defsnc 'static[ ]const[ ]long[ ]frequency_list\[\][ ]=' drivers/staging/rtl8712/rtl871x_ioctl_linux.c
+ defsnc 'static[ ]const[ ]unsigned[ ]short[ ]Sbox1\[2\]\[256\][ ]=' drivers/staging/rtl8712/rtl871x_security.c
+ defsnc 'static[ ]const[ ]u8[ ]sbox_table\[256\][ ]=' drivers/staging/rtl8712/rtl871x_security.c
+ accept '[ ]119,[ ]62,[ ]6,[\n][ ]0,[ ]16,[ ]20,[ ]17,[ ]32,[ ]48,[ ]0,\([\n][ ][0-9]\+,\([ ][0-9]\+,\)*\)*[\n][ ]0,[ ]119' drivers/staging/speakup/speakupmap.h
+ defsnc 'static[ ]u32[ ]\(h_prescale\|v_gain\)\[64\][ ]=' drivers/staging/stradis/stradis.c
+ accept '[/][*][ ]*\([ 1-4][0-9][ ][ ]\)*\(5[0-6][ ][ ]\)*[*][/]' drivers/staging/vt6656/channel.c
+ blobname 'west[ ]bridge[ ]fw' drivers/staging/westbridge/astoria/device/cyasdevice.c
+ defsnc 'static[ ]const[ ]u8[ ]gsm_fcs8\[256\][ ]=' drivers/tty/n_gsm.c
+ defsnc '[ ]static[ ]const[ ]struct[ ]dispc_v_coef[ ]coef_v\(up\|down\)_3tap\[8\][ ]=' drivers/video/omap2/dss/dispc.c
+ blobname 'c[bt]fw_\(fc\|cna\)\.bin' drivers/scsi/bfa/bfad_im.h
+ # Above is for patterns new in 2.6.37, below is for older patterns.
+ defsnc 'static[ ]u32[ ]epll_div\[\]\[5\][ ]=' arch/arm/mach-s5p6440/clock.c
+ defsnc 'static[ ]struct[ ]clk_pll_table[ ]tegra_pll_[pxm]_table\[\][ ]=' arch/arm/mach-tegra/tegra2_clocks.c
+ blobname '\(bnx2x[/]\)\?bnx2x-e[12]h\?-["][ ]FW_FILE_VERSION[ ]["]\.fw' 'drivers/net/\(bnx2x/\)\?bnx2x_main\.c'
+ blobname '\(bnx2x[/]\)\?bnx2x-e[12]h\?-\([0-9.%d]*\.fw\)\?' 'drivers/net/\(bnx2x/\)\?bnx2x_main\.c'
+ blobname 'v4l-cx23885-enc\.fw' 'drivers/media/video/cx23\(1xx\|885\)/cx23885-417.c'
+ defsnc 'static[ ]const[ ]u8[ ]\(adcm1700\|om6802\|po1030\)_sensor_\(init\|param1\)\[\]\[8\][ ]=' drivers/media/video/gspca/sonixj.c
+ defsnc 'static[ ]\(const[ ]\)\?\(__\)\?u8[ ]\(mt9v111\|sp80708\|hv7131r\|mi0360b\?\|mo4000\|ov76\([36]0\|48\)\|om6802\|po1030\)_sensor_\(init\|param1\)\[\]\[8\][ ]=' drivers/media/video/gspca/sonixj.c
+ accept '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]int[ ]be_load_fw[(][^\n;{]*[)][*][/][;][\n][^\n]*\([\n]\+[^\n}][^\n]*\)*request_firmware' drivers/net/benet/be_main.c
+ accept 'MODULE_FIRMWARE[(]["]ar9170\(-[12]\)\?\.fw["][)][;]\([\n]MODULE_FIRMWARE[(]["]ar9170\(-[12]\)\?\.fw["][)][;]\)*' drivers/net/wireless/ar9170/usb.c
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]u32[ ]ar9300Modes_\(\(low\(est\)\?\|high\)_ob_db\|high_power\)_tx_gain_table_2p[02]\[\]\[5\][ ]=\([ ][{][*][/][;]\)\?' 'drivers/net/wireless/ath/ath9k/ar9003_\(2p[02]_\)\?initvals\.h'
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]u32[ ]ar9300_2p[02]_\(radio\|mac\|baseband\)_postamble\[\]\[5\][ ]=\([ ][{][*][/][;]\)\?' 'drivers/net/wireless/ath/ath9k/ar9003_\(2p[02]_\)\?initvals\.h'
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]u32[ ]ar9\(300\|200_merlin\)_2p[02]_\(radio\|mac\|baseband\)_core\[\]\[2\][ ]=\([ ][{][*][/][;]\)\?' 'drivers/net/wireless/ath/ath9k/ar9003_\(2p[02]_\)\?initvals\.h'
+ accept '#define\([ ]_\?IWL\(4965\|[156]000\(G2[AB]\)\?\|1[03]0\|5150\|6050\)_MODULE_FIRMWARE[(]api[)]\)\+' 'drivers/net/iwlwifi/iwl-\([156]000\|4965\)\.c'
+ blobname 'iwlwifi-\(3945\|4965\|[156]000\(G2[AB]\)\?\|1[03]0\|6050\)["][ ]IWL\(3945\|4965\|[156]000\(G2[AB]\)\?\|1[03]0\|6050\)_UCODE_API[ ]["]\.ucode' 'drivers/net/iwlwifi/iwl\(3945-base\|-\(3945\|4965\|[156]000\)\)\.[ch]'
+ blobname '%s%[dus]%s["],[\n ]*name_pre,[ ]\(\(priv->fw_\)\?index\|tag\),[ ]["]\.ucode' 'drivers/net/iwlwifi/iwl\(3945-base\|-agn\).c'
+ blobname 'libertas_cs\(_helper\)\?\.fw' drivers/net/wireless/libertas/if_cs.c
+ blobname 'sd\(8385\|868[68]\)\(_helper\)\?\.bin\(["],[\n][ ]*\.firmware[ ]=[ ]["]sd\(8385\|868[68]\)\.bin\)\?' 'drivers/\(net/wireless/libertas/if_sdio\.c\|bluetooth/btmrvl_sdio\.c\)'
+ blobname 'wl1251-\(fw\|nvs\)\.bin' 'drivers/net/wireless/wl12\(51\|xx\)/wl1251.h'
+ defsnc 'static[ ]int[ ]sh_clk_div6_divisors\[64\][ ]=' '\(arch/sh/kernel/cpu/clock-\|drivers/sh/clk/\)cpg\.c'
+ defsnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?\(static[ ]\)\?\(UCHAR\|unsigned[ ]char\)[ ]XGI340_CR6F\[8\]\[32\][ ]*=\([ ][{][*][/][;]\)\?' drivers/staging/xgifb/vb_table.h
+ defsnc 'static[ ]unsigned[ ]short[ ]translations\[\]\[256\][ ]=' drivers/tty/vt/consolemap.c
+ defsnc 'u_short[ ]\(plain\|shift\(_ctrl\)\?\|alt\(gr\)\?\|ctrl\(_alt\)\?\)_map\[NR_KEYS\][ ]*=' drivers/tty/vt/defkeymap.c_shipped
+ defsnc 'static[ ]const[ ]unsigned[ ]short[ ]x86_keycodes\[256\][ ]=' drivers/tty/vt/keyboard.c
+ defsnc '\([ ]\)\?static[ ]\(const[ ]\)\?\(unsigned[ ]\(short\|char\)\|struct[ ]SiS_[^ ]*\)[ ]SiS[^[]*\(\[[][ *0-9]*\]\)\+[ ]*='
+ defsnc '[ ][ ]static[ ]unsigned[ ]char[ ]asso_values\[\][ ]=' scripts/kconfig/zconf.hash.c_shipped
+ defsnc 'static[ ]const[ ]yytype_u\?int\(8\|16\)[ ]yy[^\n []*\[\][ ]=' '.*\.lex\.c_shipped'
+ initnc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]const[ ]yytype_u\?int\(8\|16\)[ ]yy[^\n []*\[\][ ]=[*][/][;]' '.*\.tab\.c_shipped'
+ blobname 'TIInit_\(\(%d\|[0-9]\+\)[.]\)\+bts' drivers/staging/ti-st/st_kim.c
+ blob '#define[ ]BCM_5710_FW_\(\(MAJOR\|MINOR\|REVISION\|ENGINEERING\)_VERSION\|COMPILE_FLAGS\)[ ]*[0-9]\+\([\n]#define[ ]BCM_5710_FW_\(\(MAJOR\|MINOR\|REVISION\|ENGINEERING\)_VERSION\|COMPILE_FLAGS\)[ ]*[0-9]\+\)*' 'drivers/net/\(bnx2x[/]\)\?bnx2x_hsi\.h'
+ blob 'static[ ]int[ ]\(__devinit[ ]\)\?bnx2x_check_firmware[(]struct[ ]bnx2x[ ][*]bp[)][\n][{][^\n]*\([\n]\+[^\n}][^\n]*\)*[\n]\+[}]' 'drivers/net/\(bnx2x[/]\)\?bnx2x_main\.c'
+ blobna 'rc[ ]=[ ]bnx2x_check_firmware[(]bp[)][;]' 'drivers/net/\(bnx2x[/]\)\?bnx2x_main\.c'
+ defsnc 'static[ ]u8[ ]af9015_ir_table_\(leadtek\|twinhan\|a_link\|msi\|mygictv\|kworld\)\[\][ ]=' drivers/media/dvb/dvb-usb/af9015.h
+ defsnc 'static[ ]u8[ ]af9015_ir_table_\(avermedia\(_ks\)\?\|digittrade\|trekstor\)\[\][ ]=' drivers/media/dvb/dvb-usb/af9015.h
+ defsnc '[ ]static[ ]__u8[ ]lgdt3304_\(vsb8\|qam\(64\|256\)\)_data\[\][ ]=' drivers/media/dvb/frontends/lgdt3304.c
+ defsnc 'static[ ]const[ ]u32[ ]ar9300Common_\(wo_xlna_\)\?rx_gain_table_\(merlin_\)\?2p[02]\[\]\[2\][ ]=' 'drivers/net/wireless/ath/ath9k/ar9003_\(2p[02]_\)\?initvals\.h'
+ accept '[ ]*card->firmware[ ]=[ ]\(if_sdio\|lbs_fw\|fw_name\)' drivers/net/wireless/libertas/if_sdio.c
+ defsnc '\(preview_snapshot_mode\|noise_reduction\)_reg_settings_array\[\][ ]=' drivers/staging/dream/camera/mt9d112_reg.c
+ defsnc 'u16_t[ ]zgTkipSbox\(Lower\|Upper\)\[256\][ ]=' drivers/staging/otus/80211core/ctkip.c
+ accept '[ ]*[/][*][ ]*0\([ ]*[123]\)*[ ]*[*][/][\n][ ]*[/][*][ ]0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9\([ ][0-9]\)*[ ][*][/]' drivers/staging/otus/80211core/ctxrx.c
+ defsnc 'u32_t[ ]crc32_tab\[\][ ]=' drivers/staging/otus/80211core/cwep.c
+ blob 'extern[ ]const[ ]u32_t[ ]zc\(DK\|P2\)\?Fw\(Buf\)\?Image\(SPI\)\?\(\[\]\|Size\)[;]\([\n]extern[ ]const[ ]u32_t[ ]zc\(DK\|P2\)\?Fw\(Buf\)\?Image\(SPI\)\?\(\[\]\|Size\)[;]\)*' drivers/staging/otus/hal/hpmain.c
+ defsnc '[ ][ ][ ][ ]u32_t[ ]eepromBoardData\[15\]\[6\][ ]=' drivers/staging/otus/hal/hpmain.c
+ defsnc 'static[ ]const[ ]u32_t[ ]\(ar5416Modes\|otusBank\)\[\]\[[36]\][ ]=' drivers/staging/otus/hal/otus.ini
+ defsnc 'static[ ]const[ ]u32_t[ ]channel_frequency_11A\[\][ ]=' drivers/staging/otus/ioctl.c
+ defsnc '[ ]\?static[ ]u\(8\|32\)[ ]\(MAC_REG_TABLE\[\]\[2\]\|[ ]*ZEBRA_\(AGC\|RF_RX_GAIN_TABLE\)\[\]\|OFDM_CONFIG\[\]\)=' drivers/staging/rtl8187se/r8185b_init.c
+ defsnc 'static[ ]const[ ]u16[ ]Sbox\[256\][ ]=' drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt_tkip.c
+ defsnc 'u16[ ]MCS_DATA_RATE\[2\]\[2\]\[77\][ ]=' 'drivers/staging/\(rtl8192su/ieee80211/rtl819x_HTProc\.c\|rtl8192u/r819xU_firmware\.c\)'
+ defsnc 'u32[ ]Rtl8192SU\(PHY_\(REG\|ChangeTo\)_\([12]T[12]R\)\?\|Radio[AB]_\(\(\(to\)\?[12]T\|GM\)_\)\?\|MAC\(PHY\|_[12]T\)_\|AGCTAB_\)Array\(_PG\)\?\[\(PHY_\(REG\|ChangeTo\)_\([12]T[12]R\)\?\|Radio[AB]_\(\(\(to\)\?[12]T\|GM\)_\)\?\|MAC\(PHY\|_[12]T\)_\|AGCTAB_\)Array\(_PG\)\?Length\][ ]=' drivers/staging/rtl8192su/rtl92SU_HWImg.c
+ blob '[/][*][^*]*\([*]\+[^/*][^*]*\)*[*]*RTL8192SU[/]rtl1892swf\.bin[^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]' drivers/staging/rtl8192su/r8192S_firmware.c
+ blob 'u8[ ]Rtl8192SUFw\(Img\|Main\|Data\)Array\[\(Img\|Main\|Data\)ArrayLength\][ ]=[ ][{]'"$sepx$blobpat*$sepx"'[}][;]\([\n][\n]*u8[ ]Rtl8192SUFw\(Img\|Main\|Data\)Array\[\(Img\|Main\|Data\)ArrayLength\][ ]=[ ][{]'"$sepx$blobpat*$sepx"'[}][;]\)*' drivers/staging/rtl8192su/r8192SU_HWImg.c
+ blobname 'RTL8192SU[/]\(rtl8192sfw\.bin\|\(boot\|main\|data\)\.img\)' drivers/staging/rtl8192su/r8192S_firmware.c
+ blobna 'case[ ]FW_SOURCE_HEADER_FILE:[\n]#if[ ]1[\n]#define[^#]*[\n]#endif[\n][ ][ ][ ]break[;]' drivers/staging/rtl8192su/r8192S_firmware.c
+ blobna '\([&]\|sizeof[(]\)rtl8190_fw\(boot\|main\|data\)_array\(\[0\]\|[)]\)\(,[ \n]*\([&]\|sizeof[(]\)rtl8190_fw\(boot\|main\|data\)_array\(\[0\]\|[)]\)\)*' 'drivers/staging/rtl8192su/r819\(2S\|xU\)_firmware\.c'
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]u8[ ]\(gc0307\|po2030n\)_sensor_\(init\|param1\)\[\]\[8\][ ]\(=[ ][{]\)\?\([*][/][;]\)\?' drivers/media/video/gspca/sonixj.c
+ accept '[*][ ]drivers[/]staging[/]ft1000[/]ft1000-\(pcmcia\|usb\)[/]ft[13]000\.img:[ ]Removed\.' 'patch-libre.*'
+ initc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]struct[ ]ar9300_eeprom[ ]ar9300_default[ ]=\([ ][{][*][/][;]\)\?' drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
+ defsnc 'static[ ]const[ ]u16[ ]wm8753_reg\[\][ ]=' sound/soc/codecs/wm8753.c
+ ;;
+
+ */patch*-2.6.36.*)
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]u32[ ]ar9300_2p[02]_\(radio\|mac\|baseband\)_postamble\[\]\[5\][ ]=\([ ][{][*][/][;]\)\?' 'drivers/net/wireless/ath/ath9k/ar9003_\(2p[02]_\)\?initvals\.h'
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]u32[ ]ar9300Modes_\(\(low\(est\)\?\|high\)_ob_db\|high_power\)_tx_gain_table_2p[02]\[\]\[5\][ ]=\([ ][{][*][/][;]\)\?' 'drivers/net/wireless/ath/ath9k/ar9003_\(2p[02]_\)\?initvals\.h'
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]u32[ ]ar9\(300\|200_merlin\)_2p[02]_\(radio\|mac\|baseband\)_core\[\]\[2\][ ]=\([ ][{][*][/][;]\)\?' 'drivers/net/wireless/ath/ath9k/ar9003_\(2p[02]_\)\?initvals\.h'
+ ;;
+
+ */patch*-2.6.36-rc*)
+ accept 'FIRMWARE[ ]LOADER[ ][(]request_firmware[)]' MAINTAINERS
+ defsnc 'static[ ]const[ ]unsigned[ ]char[ ]__\(cpu\)\?initdata[ ]mV_vrm85\[32\][ ]=' arch/x86/kernel/cpu/cpufreq/longhaul.h
+ accept '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?\(static[ ]int[\n ]\)\?_request_firmware[(]const[ ]struct[ ]firmware[ ][*][*]firmware_p,' drivers/base/firmware_class.c
+ accept 'static[ ]int[\n ]request_firmware_work_func[(]void[ ][*]arg[)][\n][{]\([\n]\+[^\n}][^\n]*\)*ret[ ]=[ ]_request_firmware[(][^\n]*\([\n]\+[^\n}][^\n]*\)*[\n]\+[}][\n]' drivers/base/firmware_class.c
+ accept '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?request_firmware_nowait[(]' drivers/base/firmware_class.c
+ accept '[ ]task[ ]=[ ]kthread_run[(]request_firmware_work_func' drivers/base/firmware_class.c
+ defsnc '[ ]*static[ ]const[ ]char[ ]sha256_zero\[SHA256_DIGEST_SIZE\][ ]=' drivers/crypto/n2_core.c
+ defsnc '[}][ ]est3_modes\[\][ ]=' drivers/gpu/drm/drm_edid.c
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?const[ ]u32[ ]r[67]xx_default_state\[\][ ]=\([*][/][;]\)\?' drivers/gpu/drm/radeon/r600_blit_shaders.c
+ blobname 'dvb-usb-p7500\.fw' drivers/media/dvb/dvb-usb/dw2102.c
+ blobname 'dvb-usb-\(\(megasky\|digivox\)-02\|tvwalkert\|dposh-01\)\.fw' drivers/media/dvb/dvb-usb/m920x.c
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]struct[ ]regdesc[ ]\(ofsm_init\|tuner_init_\(env77h11d5\|mt2060\(_2\)\?\|mxl500\(3d\|5\)\|qt1010\|mc44s803\|unknown\|tda18271\)\)\[\][ ]=\([ ][{][*][/][;]\)\?' drivers/media/dvb/frontends/af9013_priv.h
+ blobname 'sms1xxx-hcw-55xxx-i\?sdbt-02\.fw' drivers/media/dvb/siano/sms-cards.c
+ blobname 'sms1xxx-\(stellar\|nova-[ab]\|hcw-55xxx\)-dvbt-0[12]\.fw' drivers/media/dvb/siano/sms-cards.c
+ initc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]struct[ ]idxdata[ ]tbl_common\(_[a-e]\|5\|_\?3B\?\)\[\][ ]=\([ ][{][*][/][;]\)\?' 'drivers/media/video/gspca/gl860/gl860-\(mi2020\|mi1320\|ov9655\|ov2640\)\.c'
+ blobname 'bnx2[/]bnx2-\(mips\|rv2p\)-[-0-9a-z.]*\.fw' drivers/net/bnx2.c
+ defsnc 'static[ ]const[ ]struct[ ]arb_line[ ]read_arb_data\[NUM_RD_Q\]\[MAX_RD_ORD[ ][+][ ]1\][ ]=' drivers/net/bnx2x/bnx2x_init_opts.h
+ defsnc 'static[ ]const[ ]struct[ ]arb_line[ ]write_arb_data\[NUM_WR_Q\]\[MAX_WR_ORD[ ][+][ ]1\][ ]=' drivers/net/bnx2x/bnx2x_init_opts.h
+ blob '#define[ ]FW_FILE_VERSION\([ ]*[\\][\n][ ]__stringify[(]BCM_5710_FW_\(MAJOR\|MINOR\|REVISION\|ENGINEERING\)_VERSION[)]\([ ]["][.]["]\)\?\)\+' 'drivers/net/\(bnx2x/\)\?bnx2x_main\.c'
+ blobname 'bnx2x-e1h\?-["][ ]FW_FILE_VERSION[ ]["]\.fw' 'drivers/net/\(bnx2x/\)\?bnx2x_main\.c'
+ blobname 'bnx2x-e1h\?-\([0-9.%d]*\.fw\)\?' 'drivers/net/\(bnx2x/\)\?bnx2x_main\.c'
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]void[ ]get_regs[(]struct[ ]net_device[ ][*]dev,\([^\n]*[*][/][;]\)\?' drivers/net/cxgb4/cxgb4_main.c
+ defsnc 'static[ ]\(const[ ]\)\?u32[ ]ar\(5416\|9280\)\(Modes\(_fast_clock\)\?\|Common\|BB_RfGain\|Bank6\(TPC\)\?\|Addac\)\(_91[06]0\(_\?1_1\)\?\|_9280\(_2\)\?\)\?\[\]\[[236]\][ ]=' 'drivers/net/wireless/ath9k/\(ar\(5008\|9001\)_\)\?initvals\.h'
+ defsnc 'static[ ]\(const[ ]\)\?u\(32\|_int32_t\)[ ]ar928[05]\(Common\|Modes\(_\(fast_clock\|backoff_[12]3db_rxgain\|\(original\|high_power\)_[tr]x_\?gain\)\)\?\)_928\(0_2\|5\(_1_2\)\?\)\[\]\[[236]\][ ]=' 'drivers/net/wireless/ath9k/\(ar9002_\)\?initvals\.h'
+ defsnc 'static[ ]const[ ]u32[ ]ar928\(5Modes_XE2\|7Modes_9287_1\)_0_\(normal\|high\)_power\[\]\[6\][ ]=' drivers/net/wireless/ath/ath9k/ar9002_initvals.h
+ defsnc 'static[ ]const[ ]u32[ ]ar92\(87Common_9287_1_[01]\|71Common_9271\)\[\]\[2\][ ]=' drivers/net/wireless/ath/ath9k/ar9002_initvals.h
+ defsnc 'static[ ]const[ ]u32[ ]ar92\(87\|71\)Modes_\(\(normal\|high\)_power_\)\?\([tr]x_gain_\)\?92\(87_1_[01]\|71\(_ANI_reg\)\?\)\[\]\[6\][ ]=' drivers/net/wireless/ath/ath9k/ar9002_initvals.h
+ defsnc 'static[ ]const[ ]u32[ ]ar9300_2p[02]_\(radio\|mac\|baseband\)_postamble\[\]\[5\][ ]=' 'drivers/net/wireless/ath/ath9k/ar9003_\(2p[02]_\)\?initvals\.h'
+ defsnc 'static[ ]const[ ]u32[ ]ar9300Modes_\(\(low\(est\)\?\|high\)_ob_db\|high_power\)_tx_gain_table_2p[02]\[\]\[5\][ ]=' 'drivers/net/wireless/ath/ath9k/ar9003_\(2p[02]_\)\?initvals\.h'
+ defsnc 'static[ ]const[ ]u32[ ]ar9\(300\|200_merlin\)_2p[02]_\(radio\|mac\|baseband\)_core\[\]\[2\][ ]=' 'drivers/net/wireless/ath/ath9k/ar9003_\(2p[02]_\)\?initvals\.h'
+ defsnc 'static[ ]const[ ]u32[ ]ar9300Common_\(wo_xlna_\)\?rx_gain_table_\(merlin_\)\?2p[02]\[\]\[2\][ ]=' 'drivers/net/wireless/ath/ath9k/ar9003_\(2p[02]_\)\?initvals\.h'
+ blobname 'ar9271[.]fw' drivers/net/wireless/ath/ath9k/hif_usb.c
+ accept 'static[ ]int[ ]ipw2100_mod_firmware_load[(]' 'drivers/net/wireless/\(ipw2x00/\)\?ipw2100\.c'
+ accept '[ ]*card->firmware[ ]=[ ]\(if_sdio\|lbs_fw\|fw_name\)' drivers/net/wireless/libertas/if_sdio.c
+ blobname 'rt\(28[67]0\|30[79][01]\)\.bin' drivers/staging/rt2860/common/rtmp_mcu.c
+ blob '#define[ ]BCM_5710_FW_\(\(MAJOR\|MINOR\|REVISION\|ENGINEERING\)_VERSION\|COMPILE_FLAGS\)[ ]*[0-9]\+\([\n]#define[ ]BCM_5710_FW_\(\(MAJOR\|MINOR\|REVISION\|ENGINEERING\)_VERSION\|COMPILE_FLAGS\)[ ]*[0-9]\+\)*' 'drivers/net/\(bnx2x[/]\)\?bnx2x_hsi\.h'
+ blob 'static[ ]int[ ]__devinit[ ]bnx2x_check_firmware[(]struct[ ]bnx2x[ ][*]bp[)][\n][{][^\n]*\([\n]\+[^\n}][^\n]*\)*[\n]\+[}]' 'drivers/net/\(bnx2x[/]\)\?bnx2x_main\.c'
+ blobna 'if[ ][(][(]fw_ver\[[0-3]\][ ]!=[ ]BCM_5710_FW_\(MAJOR\|MINOR\|REVISION\|ENGINEERING\)_VERSION[)]\([ ][|][|][\n][ ]*[(]fw_ver\[[0-3]\][ ]!=[ ]BCM_5710_FW_\(MAJOR\|MINOR\|REVISION\|ENGINEERING\)_VERSION[)]\)*[)][ ][{][^{}]*[}]' 'drivers/net/\(bnx2x[/]\)\?bnx2x_main\.c'
+ blobna 'sprintf[(]fw_file_name[ ][+][ ]offset,[ ]["]%d[.]%d[.]%d[.]%d[.]fw["]\(,[\n][ ]*BCM_5710_FW_\(MAJOR\|MINOR\|REVISION\|ENGINEERING\)_VERSION\)*[)][;]' 'drivers/net/\(bnx2x[/]\)\?bnx2x_main\.c'
+ blobna 'rc[ ]=[ ]bnx2x_check_firmware[(]bp[)][;]' 'drivers/net/\(bnx2x[/]\)\?bnx2x_main\.c'
+ defsnc '\(static[ ]\)\?struct[ ]crb_128M_2M_block_map[ ]crb_128M_2M_map\[64\][ ]=' 'drivers/scsi/\(qla2xxx/qla_nx\.c\|qla4xxx/ql4_nx\.c\)'
+ defsnc 'u16[ ]MCS_DATA_RATE\[2\]\[2\]\[77\][ ]=' 'drivers/staging/\(rtl8192su/ieee80211/rtl819x_HTProc\.c\|rtl8192u/r819xU_firmware\.c\)'
+ defsnc 'u32[ ]Rtl8192SU\(PHY_\(REG\|ChangeTo\)_\([12]T[12]R\)\?\|Radio[AB]_\(\(\(to\)\?[12]T\|GM\)_\)\?\|MAC\(PHY\|_[12]T\)_\|AGCTAB_\)Array\(_PG\)\?\[\(PHY_\(REG\|ChangeTo\)_\([12]T[12]R\)\?\|Radio[AB]_\(\(\(to\)\?[12]T\|GM\)_\)\?\|MAC\(PHY\|_[12]T\)_\|AGCTAB_\)Array\(_PG\)\?Length\][ ]=' drivers/staging/rtl8192su/rtl92SU_HWImg.c
+ defsnc '[}][ ]*ChannelRuleTab\[\][ ]=' drivers/staging/vt6656/channel.c
+ defsnc '\(USHORT\|unsigned[ ]short\)[ ]XGINew_DRAMType\[17\]\[5\][ ]*=' 'drivers/staging/xgifb/\(vb_table\.h\|vb_init\.c\)'
+ defsnc '\(USHORT\|unsigned[ ]short\)[ ]XGINew_SDRDRAM_TYPE\[13\]\[5\][ ]*=' 'drivers/staging/xgifb/\(vb_table\.h\|vb_init\.c\)'
+ defsnc '\(USHORT\|unsigned[ ]short\)[ ]XGINew_DDRDRAM_TYPE20\[12\]\[5\][ ]*=' 'drivers/staging/xgifb/\(vb_table\.h\|vb_init\.c\)'
+ defsnc '\(USHORT\|unsigned[ ]short\)[ ]XGINew_\(MD\|[CEV]G\)A_DAC\[\][ ]*=' drivers/staging/xgifb/vb_setmode.c
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?\(UCHAR\|unsigned[ ]char\)[ ]XGI340_CR6F\[8\]\[32\][ ]*=\([{][*][/][;]\)\?' drivers/staging/xgifb/vb_table.h
+ blobname 'sd\(8385\|868[68]\)\(_helper\)\?\.bin' 'drivers/\(net/wireless/libertas/if_sdio\.c\|bluetooth/btmrvl_sdio\.c\)'
+ accept '[ ]p7500->firmware[ ]=' drivers/media/dvb/dvb-usb/dw2102.c
+ blobname 'dvb-usb-p7500\.fw' drivers/media/dvb/dvb-usb/dw2102.c
+ accept '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]struct[ ]dvb_usb_device_properties[ ]\(megasky\|digivox_mini_ii\|tvwalkertwin\|dposh\)_properties[ ]=[ ][{]\([*][/][;]\)\?[\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/m920x.c
+ blobname 'dvb-usb-\(\(megasky\|digivox\)-02\|tvwalkert\|dposh-01\)\.fw' drivers/media/dvb/dvb-usb/m920x.c
+ defsnc 'static[ ]const[ ]struct[ ]usb_action[ ]\(cs2102\|hdcs2020xx\|icm105a\(xx\)\?\|ov7630c\|mt9v111_[13]\|pb0330\([3x]x\)\?\|mi0360soc\)_Initial\(Scale\)\?\[\][ ]=' drivers/media/video/gspca/zc3xx.c
+ blobname 'myri10ge_\(rss_\)\?ethp\?_z8e\.dat' drivers/net/myri10ge.c
+ blobname 'iwlwifi-6000g2[ab]-' drivers/net/iwlwifi/iwl-6000.c
+ blobname '#api[ ]["]\.ucode["]' 'drivers/net/iwlwifi/iwl-\(3945.h\|\(4965\|[156]000\)\.c\)'
+ blobname 'c[tb]fw\(_\(fc\|cna\)\)\?\.bin' drivers/scsi/bfa/bfad_fwimg.c
+ blobna 'seq_printf[(]seq[,][ ]["][^"]*%s[ ]%s[^"]*["][,][ \n]*\(GB_RCV\|MOJAVE_\)UCODE_VERS_STRING[,][ ]\(GB_RCV\|MOJAVE_\)UCODE_VERS_DATE[)][;]\([ \n]*seq_printf[(]seq[,][ ]["][^"]*%s[ ]%s[^"]*["][,][ \n]*\(GB_RCV\|MOJAVE_\)UCODE_VERS_STRING[,][ ]\(GB_RCV\|MOJAVE_\)UCODE_VERS_DATE[)][;]\)*' drivers/staging/slicoss/slicoss.c
+ blobname 'slicoss[/]\(oasis\|gb\)\(rcvucode\|download\)\.sys' drivers/staging/slicoss/slicoss.c
+ blobname 'CMV[x9ae][yip]\.bin\(\.v2\)\?' drivers/usb/atm/ueagle-atm.c
+ blobname 'v4l-cx2341x-\(enc\|dec\)\.fw' include/media/cr2341x.h
+ blobname 'yam[/]\(12\|96\)00\.bin' drivers/net/hamradio/yam.c
+ blob 'If[ ]you[ ]need[ ]to[ ]use[ ]any[ ]of[ ]the[ ]above[^\n]*download[^:]*:[\n ]*http:[^\n]*ixp4[^\n]*' Documentation/arm/IXP4xx
+ # New in 2.6.36-rc3:
+ defsnc 'static[ ]struct[ ]clk_pll_table[ ]tegra_pll_[px]_table\[\][ ]=' arch/arm/mach-tegra/tegra2_clocks.c
+ defsnc 'static[ ]struct[ ]nand_ecclayout[ ]qi_lb60_ecclayout_[12]gb[ ]=' arch/mips/jz4740/board-qi_lb60.c
+ blobname 'qt602240\.fw' drivers/input/touchscreen/qt602240_ts.c
+ blobname 'lgs8g75\.fw' drivers/media/dvb/frontends/lgs8gxx.c
+ defsnc 'static[ ]const[ ]struct[ ]ucbus_write_cmd[ ]\(icx098bq\|lz24bp\)_start_[012]\[\][ ]=' drivers/media/video/gspca/sq930x.c
+ defsnc '[}][ ]capconfig\[4\]\[2\][ ]=' drivers/media/video/gspca/sq930x.c
+ blobname 'ar7010\(_1_1\)\?[.]fw' drivers/net/wireless/ath/ath9k/hif_usb.c
+ defsnc 'static[ ]u8[ ]sa2400_rf_rssi_map\[\][ ]=' drivers/net/wireless/rtl818x/rtl8180_sa2400.c
+ defsnc 'static[ ]const[ ]unsigned[ ]char[ ]pwm_lookup_table\[256\][ ]=' drivers/platform/x86/compal-laptop.c
+ defsnc 'static[ ]int[ ]tps6586x_\(ldo4\|sm2\|dvm\)_voltages\[\][ ]=' drivers/regulator/tps6586x-regulator.c
+ defsnc 'static[ ]const[ ]unsigned[ ]int[ ]muxonechan\[\][ ]=' drivers/staging/comedi/drivers/adv_pci1710.c
+ defsnc 'const[ ]struct[ ]\(stk1160\|saa7113\)config[ ][{][^}]*[}][ ]\(stk1160\|saa7113\)config\[256\][ ]=' drivers/staging/easycap/easycap_low.c
+ defsnc 'int[ ]tones\[2048\][ ]=' drivers/staging/easycap/easycap_testcard.c
+ defsnc 'const[ ]unsigned[ ]char[ ]map_table\[\][ ]=' drivers/staging/lirc/lirc_ttusbir.c
+ defsnc 'static[ ]unsigned[ ]char[ ]jpeg_header\[\][ ]=' drivers/staging/solo6x10/solo6010-jpeg.h
+ defsc 'static[ ]const[ ]unsigned[ ]int[ ]solo_osd_font\[\][ ]=' drivers/staging/solo6x10/solo6010-osd-font.h
+ defsnc '[ ]unsigned[ ]char[ ]regs\[128\][ ]=' drivers/staging/solo6x10/solo6010-tw28.c
+ defsnc 'static[ ]unsigned[ ]char[ ]vid_vop_header\[\][ ]=' drivers/staging/solo6x10/solo6010-v4l2-enc.c
+ defsnc 'static[ ]const[ ]u16[ ]rop_\(map1\|action\|info\)\[\][ ]=' drivers/staging/tidspbridge/dynload/reloc_table_c6000.c
+ defsnc 'static[ ]const[ ]u16[ ]tramp_\(map\|action\|info\)\[\][ ]=' drivers/staging/tidspbridge/dynload/tramp_table_c6000.c
+ defsnc 'unsigned[ ]char[ ]\(sbox\|dot[23]\)_table\[256\][ ]=' drivers/staging/vt6655/aes_ccmp.c
+ defsnc 'static[ ]struct[ ]pll_map[ ]pll_value\[\][ ]=' drivers/video/via/hw.c
+ defsnc '[ ][ ]degrade_factor\[CPU_LOAD_IDX_MAX\]\[DEGRADE_SHIFT[ ][+][ ]1\][ ]=' kernel/sched.c
+ defsnc 'static[ ]const[ ]unsigned[ ]char[ ]expected_result\[FIFO_SIZE\][ ]=' samples/kfifo/bytestream-example.c
+ defsnc 'static[ ]const[ ]int[ ]expected_result\[FIFO_SIZE\][ ]=' samples/kfifo/inttype-example.c
+ blobname 'haup-ir-blaster\.bin' drivers/input/lirc/lirc_zilog.c
+ ;;
+
+ */hid-support*.patch)
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]unsigned[ ]char[ ]hid_keyboard\[256\][ ]=\([ ][{][*][/][;]\)\?' drivers/hid/hid-input.c
+ ;;
+
+ */sched*)
+ accept 'CPU[ ]\+before[ ]\+after[\n]\([\n][01][0-9][ ]\+:[ ][0-9]\+[ ]\+:[ ][67]\)*'
+ defsnc '[ ][ ]degrade_factor\[CPU_LOAD_IDX_MAX\]\[DEGRADE_SHIFT[ ][+][ ]1\][ ]=' kernel/sched.c
+ accept '\(All[ ]CPUS[ ]idle[ ]for[ ]10[ ]seconds[ ][(]HZ=1000[)]\|One[ ]CPU[ ]busy[ ]rest[ ]idle[ ]for[ ]10[ ]seconds\|All[ ]CPUs[ ]busy[ ]for[ ]10[ ]seconds\)[\n][0-9 \n]*'
+ accept 'domainstats:[ ]*domain0[\n][ ]*cpu[ ]*cnt[ ]*bln[ ]*fld[ ]*imb[ ]*gain[ ]*hgain[ ]*nobusyq[ ]*nobusyg[\n 0-9:]*'
+ ;;
+
+ */*-loongson.patch)
+ defsnc 'static[ ]const[ ]u16[ ]Sbox\[256\][ ]=' drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt_tkip.c
+ defsnc 'u16[ ]rtl8225bcd_rxgain\[\]=' drivers/net/wireless/rtl8187b/r8180_rtl8225.c
+ defsnc 'u8[ ]rtl8225_tx_power_cck\(_ch14\)\?\[\]=' drivers/net/wireless/rtl8187b/r8180_rtl8225.c
+ defsnc 'u8[ ]rtl8225_agc\[\]=' drivers/net/wireless/rtl8187b/r8180_rtl8225.c
+ defsnc 'static[ ]u32[ ]MAC_REG_TABLE\[\]\[3\]=' drivers/net/wireless/rtl8187b/r8180_rtl8225z2.c
+ defsnc 'static[ ]u8[ ][ ]*ZEBRA_AGC\[\]=' drivers/net/wireless/rtl8187b/r8180_rtl8225z2.c
+ defsnc 'static[ ]u32[ ]ZEBRA_RF_RX_GAIN_TABLE\[\]=' drivers/net/wireless/rtl8187b/r8180_rtl8225z2.c
+ defsnc 'u8[ ]ZEBRA2_CCK_OFDM_GAIN_SETTING\[\]=' drivers/net/wireless/rtl8187b/r8180_rtl8225z2.c
+ defsnc 'u16[ ]rtl8225z2_rxgain\[\]=' drivers/net/wireless/rtl8187b/r8180_rtl8225z2.c
+ defsnc 'u8[ ]rtl8225z2_tx_power_cck\(_ch14\)\?\[\]=' drivers/net/wireless/rtl8187b/r8180_rtl8225z2.c
+ defsnc 'static[ ]struct[ ]vesa_mode_table[ ]vesa_mode\[\][ ]=' drivers/staging/sm7xx/smtcfb.c
+ defsnc 'struct[ ]ModeInit[ ]VGAMode\[\][ ]=' drivers/staging/sm7xx/smtcfb.h
+ ;;
+
+ */patch*-2.6.34-rc*)
+ # New in 2.6.34, should be duplicated in the main pattern set.
+ blobname 'cxgb4[/]t4fw\.bin' drivers/net/cxgb4/cxgb4_main.c
+ defsnc '[ ]static[ ]const[ ]unsigned[ ]int[ ]reg_ranges\[\][ ]=' drivers/net/cxgb4/cxgb4_main.c
+ defsnc '[ ]static[ ]const[ ]unsigned[ ]int[ ]avg_pkts\[NCCTRL_WIN\][ ]=' drivers/net/cxgb4/t4_hw.c
+ # above in -rc5
+ defsnc 'static[ ]u32[ ]epll_div\[\]\[5\][ ]=' arch/arm/mach-s5p6440/clock.c
+ accept '[ ]aru->firmware[ ]=[ ]fw[;]' drivers/net/wireless/ath/ar9170/usb.c
+ accept '[ ]err[ ]=[ ]request_firmware[(][&]fw_entry,[ ]["]broadsheet\.wbf["],[ ]dev[)][;]' drivers/video/broadsheetfb.c
+ # above in -rc2, below in -rc1
+ accept '#[ ]\(Usage:[ ]cxacru-cf\.py[ ][<]\|Warning:\|Note:[ ]support[ ]for\)[ ]cxacru-cf\.bin' 'Documentation/networking/cxacru\(-cf\.py\|\.txt\)'
+ defsnc 'static[ ]struct[ ]cdce_reg[ ]cdce_y1_27000\[\][ ]=' arch/arm/mach-davinci/cdce949.c
+ defsnc '[ ]u16[ ]map\[\][ ]=' drivers/hwmon/asc7621.c
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]az6027_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/az6027.c
+ blobname 'dvb-usb-az6027-03\.fw' drivers/media/dvb/dvb-usb/az6027.c
+ accept '[ ]p7500->firmware[ ]=' drivers/media/dvb/dvb-usb/dw2102.c
+ blobname 'dvb-usb-p7500\.fw' drivers/media/dvb/dvb-usb/dw2102.c
+ defsnc 'static[ ]u8[ ]ITUDecoderSetup\[4\]\[16\][ ]=' drivers/media/dvb/ngene/ngene-core.c
+ blobname 'ngene_1[5678]\.fw' drivers/media/dvb/ngene/ngene-core.c
+ blobname 'sms1xxx-hcw-55xxx-i\?sdbt-02\.fw' drivers/media/dvb/siano/sms-cards.c
+ defsnc 'static[ ]u8[ ]samsung_smt_7020_inittab\[\][ ]=' drivers/media/video/cx88/cx88-dvb.c
+ defsnc 'static[ ]const[ ]u8[ ]\(bridge\|sensor\)_init\(_2\)\?\[\]\[2\][ ]=' drivers/media/video/gspca/ov534_9.c
+ defsnc 'static[ ]const[ ]u8[ ]bridge_start_\([qs]\?v\|x\)ga\[\]\[2\][ ]=' drivers/media/video/gspca/ov534_9.c
+ defsnc '[ ]struct[ ]init_command[ ]\(spy\|cif\|ms350\|genius\|vivitar\)_start_commands\[\][ ]=' drivers/media/video/gspca/sn9c2028.c
+ defsnc 'static[ ]const[ ]u8[ ]n4_lt168g\[\][ ]=' drivers/media/video/gspca/t613.c
+ initc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]\(__\)\?u8[ ]\(mi\(0360\|13[12]0\)\|po\(1200\|3130\)\|hv7131r\|ov76[67]0\)_\(\(soc\)\?_\?[iI]nit\(Q\?V\|SX\)GA\(_\(JPG\|data\)\)\?\|rundata\)\[\]\[4\][ ]=\([ ][{][*][/][;]\)\?' drivers/media/video/gspca/vc032x.c
+ defsnc '[ ]static[ ]const[ ]u8[ ]gamma_tb\[6\]\[16\][ ]=' drivers/media/video/gspca/zc3xx.c
+ blobname 'tlg2300_firmware\.bin' drivers/media/video/tlg2300/pd-main.c
+ defsnc '[ ]u8[ ]pattern\[42\][ ]=' drivers/net/ksz884x.c
+ defsnc '\(static[ ]\)\?const[ ]u8[ ]b43_ntab_framelookup\[\][ ]=' drivers/net/wireless/b43/tables_nphy.c
+ defsnc 'const[ ]u32[ ]\(b43_ntab_tx_gain_rev\(0_1_2\|3plus_2ghz\|\([34]\|5plus\)_5ghz\)\|txpwrctrl_tx_gain_ipa\(_\(rev\)\?[56]g\?\)\?\)\[\][ ]=' drivers/net/wireless/b43/tables_nphy.c
+ defsnc 'const[ ]u16[ ]tbl_iqcal_gainparams\[2\]\[9\]\[8\][ ]=' drivers/net/wireless/b43/tables_nphy.c
+ defsnc 'const[ ]struct[ ]nphy_txiqcal_ladder[ ]ladder_\(lo\|iq\)\[\][ ]=' drivers/net/wireless/b43/tables_nphy.c
+ defsnc 'const[ ]u16[ ]loscale\[\][ ]=' drivers/net/wireless/b43/tables_nphy.c
+ blobname 'isl38\(86\|87\|90\)\(pci\|usb\(_bare\)\?\)\?' 'drivers/net/wireless/p54/p54\(pci\.c\|usb\.[ch]\)'
+ defsnc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]struct[ ]conf_drv_settings[ ]default_conf[ ]=[ ][{][*][/][;]' drivers/net/wireless/wl12xx/wl1271_main.c
+ defsnc '[ ][}][ ]grtpkts\[\][ ]=' drivers/staging/mimio/mimio.c
+ blobname 'rt\(28[67]0\|30[79][01]\)\.bin' drivers/staging/rt2860/common/rtmp_mcu.c
+ accept '[ ]adapter->firmware[ ]=[ ]fw[;]' drivers/staging/rt2860/common/rtmp_mcu.c
+ blob '[/][*][^*]*\([*]\+[^/*][^*]*\)*[*]*RTL8192SU[/]rtl1892swf\.bin[^*]*\([*]\+[^/*][^*]*\)*[*]\+[/]' drivers/staging/rtl8192su/r8192S_firmware.c
+ accept 'MODULE_FIRMWARE[(]["]keyspan_pda[/]\(keyspan_pda\|xircom_pgs\)\.fw["][)][;]' drivers/usb/serial/keyspan_pda.c
+ # It's not clear that wm2000_anc.bin is pure data.
+ # Check with developer, clean up for now.
+ blobname 'wm2000_anc\.bin' sound/soc/codecs/wm2000.c
+ blob '[ ][*][ ]The[ ]download[ ]image[ ]for[ ]the[ ]WM2000[^*]*\([*]\+[^/*][^*]*\)*[*]*[<][ ]file[^*\n]*[\n][ ][*][/]' sound/soc/codecs/wm2000.c
+ # accept '[ ][*][ ].wm2000_anc\.bin.[ ]by[ ]default' sound/soc/codecs/wm2000.c
+ # accept '[ ][*][ ]*[<][ ]file[ ]\+[>]wm2000_anc\.bin' sound/soc/codecs/wm2000.c
+ # accept '[ ]filename[ ]=[ ]["]wm2000_anc\.bin["][;]' sound/soc/codecs/wm2000.c
+ defsnc '[}][ ]\(clk_sys_ratios\|bclk_divs\)\[\][ ]=' 'sound/soc/wm890[34]\.c'
+ defsnc '[}][ ]clock_cfgs\[\][ ]=' sound/soc/codecs/wm8955.c
+ blobname 'siu_spb\.bin' sound/soc/sh/siu_dai.c
+ defsnc 'static[ ]const[ ]u8[ ]poxxxx_init\(_common\|Q\?VGA\|_end_1\)\[\]\[4\][ ]=' drivers/media/video/gspca/vc032x.c
+ defsnc 'crb_128M_2M_map\[64\][ ]__cacheline_aligned_in_smp[ ]=' 'drivers/net/\(netxen/netxen_nic_hw.c\|qlcnic/qlcnic_hw.c\)'
+ # Pattern present prior to 2.6.34, or already adjusted for 2.6.34 in
+ # the main pattern set.
+ accept '[ ][ ][ ]Bit[ 0-7]*' Documentation/input/sentelic.txt
+ accept 'The[ ]hd-audio[ ]driver[ ]reads[ ]the[ ]file[ ]via[ ]request_firmware[(][)]\.' Documentation/sound/alsa/HD-Audio.txt
+ accept '[ ]\.section[ ]__ex_table,["]a["]'"$sepx$blobpat*" arch/powerpc/lib/copyuser_64.S
+ defsnc 'static[ ]const[ ]u32[ ]camellia_sp0222\[256\][ ]=' crypto/camellia.c
+ defsnc 'static[ ]const[ ]u32[ ]camellia_sp1110\[256\][ ]=' crypto/camellia.c
+ defsnc 'static[ ]const[ ]u32[ ]camellia_sp3033\[256\][ ]=' crypto/camellia.c
+ defsnc 'static[ ]const[ ]u32[ ]camellia_sp4404\[256\][ ]=' crypto/camellia.c
+ defsnc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]const[ ]__u8[ ]\(start\|page3\)_7302\[\][ ]=[ ][{][*][/][;]' drivers/media/video/gspca/pac7302.c
+ defsnc 'static[ ]const[ ]__u8[ ]pas202_sensor_init\[\]\[8\][ ]=' drivers/media/video/gspca/sonixb.c
+ defsnc 'static[ ]const[ ]u8[ ]\(adcm1700\|om6802\|po1030\)_sensor_\(init\|param1\)\[\]\[8\][ ]=' drivers/media/video/gspca/sonixj.c
+ blob 'sub[ ]\(sp887[0x]\|tda1004\(5\|6\(lifeview\)\?\)\|av7110\|dec\(2\(00\|54\)0t\|3000s\)\|opera1\|vp7041\|dibusb\|nxt200[24]\|cx\(23\(1xx\|885\)\|18\)\|pvrusb2\|or51\(211\|132_\(qam\|vsb\)\)\|bluebird\|mpc718\|af9015\|ngene\)[ ]*[{]\([\n]\+[^\n}][^\n]*\)*[\n]\+[}]\([\n]\+sub[ ]\(sp887[0x]\|tda1004\(5\|6\(lifeview\)\?\)\|av7110\|dec\(2\(00\|54\)0t\|3000s\)\|opera1\|vp7041\|dibusb\|nxt200[24]\|cx\(23\(1xx\|885\)\|18\)\|pvrusb2\|or51\(211\|132_\(qam\|vsb\)\)\|bluebird\|mpc718\|af9015\|ngene\)[ ]*[{]\([\n]\+[^\n}][^\n]*\)*[\n]\+[}]\)*' Documentation/dvb/get_dvb_firmware
+ accept '\([/][*][*][\n]\)\?[ ][*][ ]request_firmware_nowait\(:\|[ ]-\)[ ]asynchronous[ ]version[ ]of[ ]request_firmware' drivers/base/firmware_class.c
+ blobname 'b43\(legacy\)\?\(%s\)\?[/]\(%s\|ucode\([2459]\|1[1345]\)\|pcm5\|[abn]0g[01]initvals\(5\|1[13]\)\)\.fw' 'drivers/net/wireless/b43\(legacy\)\?/main.c'
+ blobname '\(sep[/]\)\?\(cache\|resident\)\.image\.bin' drivers/staging/sep/sep_driver.c
+ defsnc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]const[ ]u8[ ]\(mi1320\|po3130\)_initVGA_data\[\]\[4\][ ]=[ ][{][*][/][;]' drivers/media/video/gspca/sonixj.c
+ accept '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]request_firmware_work_func' drivers/base/firmware_class.c
+ defsnc 'static[ ]const[ ]u8[ ]\(bridge\|sensor\)_init_ov965x\(_2\)\?\[\]\[2\][ ]=' drivers/media/video/gspca/ov534.c
+ defsnc 'static[ ]const[ ]u8[ ]bridge_start_ov965x_\(\([qs]\?v\|x\)ga\|cif\)\[\]\[2\][ ]=' drivers/media/video/gspca/ov534.c
+ defsnc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]const[ ]\(__u16\|struct[ ]cmd\)[ ]spca504\(_pccam600\|A_clicksmart420\)_\(init\|open\)_data\[\]\(\[3\]\)\?[ ]=[ ][{][*][/][;]' drivers/media/video/gspca/sunplus.c
+ # above is in -rc1, below in -rc2
+ defsnc 'static[ ]struct[ ]pinmux_cfg_reg[ ]pinmux_config_regs\[\][ ]=' 'arch/sh/kernel/cpu/sh2a/pinmux-sh7203\.c\|arch/arm/mach-shmobile/pfc-sh73[67]7\.c'
+ defsnc 'static[ ]const[ ]u8[ ]ratio_lut\[\][ ]=' drivers/misc/tsl2550.c
+ initnc 'static[ ]const[ ]u16[ ]count_lut\[\][ ]=' drivers/misc/tsl2550.c
+ accept 'static[ ]int[ ]ar9170_usb_request_firmware[(]' drivers/net/wireless/ar9170/usb.c
+ accept '[ ]\(err[ ]=\|return\)[ ]request_firmware\(_nowait\)\?[(][^\n]*["]ar9170\(-[12]\)\?\.fw["],' drivers/net/wireless/ar9170/usb.c
+ accept '[ ]err[ ]=[ ]ar9170_usb_request_firmware[(]' drivers/net/wireless/ar9170/usb.c
+ blobname '%s%[du]%s["],[\n ]*name_pre,[ ]\(priv->fw_\)\?index,[ ]["]\.ucode' 'drivers/net/iwlwifi/iwl\(3945-base\|-agn\).c'
+ accept '#include[ ]["]ixp2400_[rt]x\.ucode["]' drivers/net/ixp2000/ixpdev.c
+ ;;
+
+ */patch*-2.6.33-rc*)
+ accept 'static[ ]inline[ ]int[\n]\(maybe_\)\?reject_firmware\(_nowait\)\?[(][^{;]*[)][\n][{]\([\n]\+[^\n}][^\n]*\)*[^\n]*\([\n]\+[}]\)\?' include/linux/firmware.h
+ accept '[ ][ ]ranges[ ]=[ ]<'"$blobpat*"'>[;]' 'arch/powerpc/boot/dts/\(mpc8572ds\|p2020ds\|katmai\)\.dts'
+ defsnc 'static[ ]unsigned[ ]char[ ]camera_ncm03j_magic\[\][ ]=' 'arch/sh/boards/\(board-ap325rxa\.c\|mach-ap325rxa/setup\.c\)'
+ defsnc 'static[ ]unsigned[ ]char[ ]vga_font\[cmapsz\][ ]\(BTDATA[ ]\)\?=' arch/sparc/kernel/btext.c
+ accept '[ ][ ][ ]req_firm_rc[ ]=[ ]request_firmware_nowait[(][^;]*,[ ]["]dell_rbu["],' drivers/firmware/dell_rbu.c
+ defsnc 'struct[ ]nv17_tv_norm_params[ ]nv17_tv_norms\[NUM_TV_NORMS\][ ]=' drivers/gpu/drm/nouveau/nv17_tv_modes.c
+ defsnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]u16[ ]stufftab\[5[ ][*][ ]256\][ ]=[ ][{]\([*][/][;]\)\?[\n]' drivers/isdn/gigaset/isocdata.c
+ defsnc 'static[ ]const[ ]__u8[ ]\(start\|page[34]\)_73\(02\|11\)\[\][ ]=' 'drivers/media/video/gspca/pac73\(02\|11\)\.c'
+ defsnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals\(_3070\)\?\[\][ ]=' drivers/net/wireless/prism54/islpci_dev.c
+ defsnc 'static[ ]uint32[ ][FR]Sb\[256\][ ]=' 'drivers/staging/rt28[67]0/common/\(md5\|cmm_aes\)\.c'
+ defsnc 'static[ ]const[ ]u16[ ]Sbox\[256\][ ]=' # 'drivers/staging/rtl8192u/r819xU_firmware.c' and elsewhere
+ defsnc 'u16[ ]MCS_DATA_RATE\[2\]\[2\]\[77\][ ]=' 'drivers/staging/\(rtl8192su/ieee80211/rtl819x_HTProc\.c\|rtl8192u/r819xU_firmware\.c\)'
+ defsnc '\(static[ ]\)\?u32[ ]Rtl8190PciE\?\(AGCTAB_\|PHY_REG\(_1T2R\)\?\|Radio[ABCD]_\)Array\[\(AGCTAB_\|PHY_REG\(_1T2R\)\?\|Radio[ABCD]_\)ArrayLength\][ ]=' 'drivers/staging/\(rtl8192e/r819xE_phy\.c\|rtl8192u/r819xU_firmware_img.c\)'
+ defsnc 'u32[ ]Rtl8192Usb\(PHY_REG\(_1T2R\)\?\|\(Radio[ABCD]\|MACPHY\|AGCTAB\)_\)Array\(_PG\)\?\[\][ ]=' drivers/staging/rtl8192su/rtl819xU_firmware_img.c
+ defsnc '[ ][ ]static[ ]const[ ]unsigned[ ]char[ ]asso_values\[\][ ]=' scripts/genksyms/keywords.c_shipped
+ accept '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]request_firmware_work_func[(]void[ ][*]arg[)][*][/][;][\n]\([^\n]*[\n]\)\+\([ ]ret[ ]=[ ]_request_firmware[(]\|request_firmware_nowait[(]\)\?' drivers/base/firmware_class.c
+ accept '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]struct[ ]dvb_usb_device_properties[ ]af9015_properties\(\[\]\)\?[ ]=[ ][{][*][/][;][\n][ ][ ]\.firmware[ ]=[ ]' drivers/media/dvb/dvb-usb/af9015.c
+ defsnc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]const[ ]u8[ ]bridge_start_ov965x\[\]\[2\][ ]=[ ][{][*][/][;][\n]' drivers/media/video/gspca/ov534.c
+ defsnc 'static[ ]const[ ]u8[ ]bridge_start_ov965x_\(\([qs]\?v\|x\)ga\|cif\)\[\]\[2\][ ]=' drivers/media/video/gspca/ov534.c
+ defsnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]\(const[ ]\)\?\(__\)\?u8[ ]\(mt9v111\|sp80708\|hv7131r\|mi0360\|mo4000\|ov76\([36]0\|48\)\|om6802\|po1030\)_sensor_init\[\]\[8\][ ]=[ ][{]\([*][/][;]\)\?[\n]' drivers/media/video/gspca/sonixj.c
+ defsnc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]\(const[ ]\)\?u32[ ]ar\(5416\|9280\)\(Modes\(_fast_clock\)\?\|Common\|BB_RfGain\|Bank6\(TPC\)\?\|Addac\)\(_91[06]0\(1_1\)\?\|_9280\(_2\)\?\)\?\[\]\[[236]\][ ]=[ ][{][*][/][;][\n]' drivers/net/wireless/ath9k/initvals.h
+ defsnc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]const[ ]u_int32_t[ ]ar9271\(Common\|Modes\)_9271_1_0\[\]\[[26]\][ ]=[ ][{][*][/][;][\n]' drivers/net/wireless/ath9k/initvals.h
+ defsnc '\(U\(INT\|CHAR\)\|u\(32\|8\)\)[ ]\(Tkip_Sbox_\(Lower\|Upper\)\|SboxTable\)\[256\][ ]=' 'drivers/staging/rt\(28[67]0\|3070\)/common/\(rtmp\|cmm\)_tkip\.c'
+ defsnc '\(RTMP_RF_REGS\|struct[ ]rt_rtmp_rf_regs\)[ ]RF2850RegTable\[\][ ]=' 'drivers/staging/rt28[67]0/common/\(mlme\.c\|cmm_asic\.c\)'
+ defsnc '\(FREQUENCY_ITEM\|struct[ ]rt_frequency_item\)[ ]FreqItems3020\[\][ ]=' 'drivers/staging/rt28[67]0/common/\(mlme\.c\|cmm_asic\.c\)'
+ defsnc '\(UINT\|u32\)[ ]FCSTAB_32\[256\][ ]=' 'drivers/staging/rt\(28[67]0\|3070\)/common/\(rtmp\|cmm\)_wep\.c'
+ defsnc '\(UCHAR\|u8\)[ ]RateSwitchTable\(11B\?G\?\(N[123]S\(ForABand\)\?\)\?\)\?\[\][ ]=' 'drivers/staging/rt28[67]0/common/mlme\.c'
+ defsnc '\(UCHAR\|u8\)[ ]*ZeroSsid\[32\][ ]=' 'drivers/staging/rt28[67]0/common/mlme\.c'
+ defsnc '\(CH_FREQ_MAP\|struct[ ]rt_ch_freq_map\)[ ]CH_HZ_ID_MAP\[\][ ]\?=' 'drivers/staging/\(rt2860\|rt3090\)/common/rt_channel\.c'
+ defsnc '\(DOT11_REGULATORY_INFORMATION\|struct[ ]rt_dot11_regulatory_information\)[ ]\(USA\|Europe\|Japan\)RegulatoryInfo\[\][ ]=' 'drivers/staging/\(rt3090\|rt2860\)/common/spectrum\.c'
+ defsnc '\([ ][ ][ ][ ]\|[ ]\)u_int32_t[ ]ralinkrate\[256\][ ]=' 'drivers/staging/rt\(28[67]0\|3070\)/rt_linux\.c'
+ defsnc '\(static[ ]uint32_t\|[}]\)[ ]nv04_graph_ctx_regs[ ]\?\[\][ ]=' drivers/char/drm/nv04_graph.c
+ defsnc 'static[ ]int[ ]nv10_graph_ctx_regs[ ]\?\[\][ ]=' drivers/char/drm/nv10_graph.c
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]\(dw\(210[24]\|3101\)\|s6[3x]0\)_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/dw2102.c
+ defsnc 'static[ ]int[ ]zoom2_batt_table\[\][ ]=' arch/arm/mach-omap2/board-zoom2.c
+ defsnc 'static[ ]u8[ ]af9015_ir_table_\(leadtek\|twinhan\|a_link\|msi\|mygictv\|kworld\)\[\][ ]=' drivers/media/dvb/dvb-usb/af9015.h
+ defsnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]struct[ ]usb_action[ ]\(cs2102\|hdcs2020xx\|icm105axx\|ov7630c\|pb0330[3x]x\)_Initial\(Scale\)\?\[\][ ]=[ ][{]\([*][/][;]\)\?[\n]' drivers/media/video/gspca/zc3xx.c
+ defsnc '[ ]static[ ]const[ ]u8[ ]log10\[\][ ]=' drivers/net/wireless/zd1211rw/zd_chip.c
+ defsnc '[ ][ ][ ][ ]static[ ]UINT32[ ]MD5Table\[64\][ ]=' 'drivers/staging/rt28[67]0/common/md5\.c'
+ defsnc 'ULONG[ ][ ]*BIT32\[\][ ]=' 'drivers/staging/rt28[67]0/common/rtmp_init\.c'
+ defsnc 'static[ ]UINT8[ ]WPS_DH_\([PRX]\|RRModP\)_VALUE\[1\(9[23]\|84\)\][ ]=' drivers/staging/rt3090/common/crypt_biginteger.c
+ defsnc 'static[ ]const[ ]UINT32[ ]SHA256_K\[64\][ ]=' drivers/staging/rt3090/common/crpt_sha2.c
+ accept '[ * ]*0[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]1[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]2[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]3[\n][ * ]*0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]0[ ]1' 'net/\(netfilter\|ipv4\)/ipvs/ip_vs_sync\.c\|net/sctp/sm_make_chunk\.c\|include/linux/scpt\.h\|drivers/staging/rt3090/common/igmp_snoop\.c'
+ defsnc 'const[ ]unsigned[ ]short[ ]ccitt_16Table\[\][ ]=' 'drivers/staging/rt\(28[67]0\|3090\)/common/rtmp_init\.c'
+ defsnc 'static[ ]const[ ]USHORT[ ]Sbox\[256\][ ]=' drivers/staging/rt3090/sta/rtmp_ckipmic.c
+ accept '[ ]len[ ]=[ ]mod_firmware_load[(]fn,[ ][&]data[)][;][\n][ ]if[ ][^{]*[ ][{][\n][ ][ ]*printk[(]KERN_ERR[ ]["]sscape:' sound/oss/sscape.c
+ defsnc 'static[ ]const[ ]unsigned[ ]char[ ]wm_vol\[256\][ ]=' 'sound/pci/ice1712/\(phase\|aureon\)\.c'
+ accept '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?\(static[ ]inline[ ]\)\?int[ ]request_firmware\(_nowait\)\?[(]\(const[ ]struct[ ]firmware[ ][*][*]\|[\n][ ]struct[ ]module[ ][*]\)' include/linux/firmware.h
+ blobname 'isl38\(77\|86\|90\)' drivers/net/wireless/prism54/islpci_dev.c
+ accept '[ ]*#[ ]*define[ ]\(STA_PROFILE\|CARD_INFO\)_PATH[ ]*["][/]etc[/]Wireless[/]RT\(28[67]\|307\)0STA[/]RT\(28[67]\|307\)0STA\(Card\)\?\.dat["]' 'drivers/staging/rt\(28[67]0\|3070\)/rt_linux\.h'
+ accept '#include[ ]["]rf\.h["][\n]#include[ ]["]firmware\.h["]' drivers/staging/vt6656/main_usb.c
+ blob '#include[ ]*["]\(\.\.[/]\(\.\.[/]rt30[79]0[/]\)\?\)\?firmware\.h["]' 'drivers/staging/rt\(28[67]\|309\)0/common/rtmp_\(init\|mcu\)\.c'
+ blobna 'Derived[ ]from[ ]proprietary[ ]unpublished[ ]source[ ]code' drivers/net/tg3.c
+ blobname 'atmel_at76c50\(2\([de]\|_3com\)\?\|4a\?\(_2958\)\?\|6\)\(\.bin\)\?' drivers/net/wireless/atmel.c
+ blobna '\(pFirmwareImage[ ]=\([ ]FirmwareImage\(_\(28[67]\|30[79]\)0\)\?\|[\n ]*[(]\(PUCHAR\|u8[ ][*]\)[)][&][\n ]*FirmwareImage\(_\(28\|30\)70\)\?\[FIRMWAREIMAGE\(V[12]\)\?_LENGTH\]\)\|File[lL]ength[ ]=[ ]\(sizeof[(]FirmwareImage[)]\|FIRMWAREIMAGE\(V[12]\|_MAX\)\?_LENGTH\)\)[;]\([\n ]*\(pFirmwareImage[ ]=\([ ]FirmwareImage\(_\(28[67]\|30[79]\)0\)\?\|[\n ]*[(]\(PUCHAR\|u8[ ][*]\)[)][&][\n ]*FirmwareImage\(_\(28\|30\)70\)\?\[FIRMWAREIMAGE\(V[12]\)\?_LENGTH\]\)\|File[lL]ength[ ]=[ ]\(sizeof[(]FirmwareImage[)]\|FIRMWAREIMAGE\(V[12]\|_MAX\)\?_LENGTH\)\)[;]\)*' 'drivers/staging/rt\(28[67]0\|30[79]0\)/common/rtmp_init\.c'
+ blobname '\(nx\(romimg\|3fw\(ct\|mn\)\)\|phanfw\)\.bin' 'drivers/net/netxen/netxen_nic\(_\(hw\|init\)\.c\|\.h\)'
+ # The above are covered by the main Linux patterns. The patterns
+ # below are to be kept in sync in the 2.6.33 block within the main
+ # Linux patterns, until 2.6.33 is released.
+ accept '[ ]*just[ ]run[ ]["]cat[ ][/]sys[/]firmware[/]acpi[/]tables[/]DSDT[ ]>[ ][/]tmp[/]dsdt[.]dat["]' Documentation/acpi/method-customizing.txt
+ accept '[ ]*b[)][ ]disassemble[ ]the[ ]table[ ]by[ ]running[ ]["]iasl[ ]-d[ ]dsdt[.]dat["][.]' Documentation/acpi/method-customizing.txt
+ accept '[ ]*x=["]7999\([ ][0-9]\+\)\+["]' Documentation/blockdev/drbd/DRBD-8.3-data-packets.svg
+ defsnc 'static[ ]int[ ]zoom_batt_table\[\][ ]=' arch/arm/mach-omap2/board-zoom-peripherals.c
+ defsnc 'static[ ]u16[ ]x[48]_vectors\[\][ ]=' drivers/edac/amd64_edac.c
+ defsnc 'static[ ]const[ ]u16[ ]\(y\|uv\)_static_hcoeffs\[N_HORIZ_\(Y\|UV\)_TAPS[ ][*][ ]N_PHASES\][ ]=' drivers/gpu/drm/i915/intel_overlay.c
+ accept '[ ]\.download_firmware[ ]=[ ]ec168_download_firmware,[\n][ ]\.firmware[ ]=[ ]' drivers/media/dvb/dvb-usb/ec168.c
+ blobname 'dvb-usb-ec168\.fw' drivers/media/dvb/dvb-usb/ec168.c
+ defsnc 'static[ ]const[ ]u16[ ]dib0090_defaults\[\][ ]=' drivers/media/dvb/frontends/dib0090.c
+ defsnc 'static[ ]const[ ]struct[ ]dib0090_pll[ ]dib0090_pll_table\[\][ ]=' drivers/media/dvb/frontends/dib0090.c
+ blobname 'dvb-fe-ds3000\.fw' drivers/media/dvb/frontends/ds3000.c
+ blob '[/][*][ ]\(as[ ]of[ ][^\n]*[ ]current[ ]DS3000[ ]firmware\|DS3000[ ]FW\)[^/]*[*][/]\([\n][/][*]\([ ]\(as[ ]of[ ][^\n]*[ ]current[ ]DS3000[ ]firmware\|DS3000[ ]FW\)[^/]*\|[(]DEBLOBBED[)]\)[*][/]\)*' drivers/media/dvb/frontends/ds3000.c
+ defsnc 'static[ ]u8[ ]ds3000_dvbs2\?_init_tab\[\][ ]=' drivers/media/dvb/frontends/ds3000.c
+ defsnc '[ ]static[ ]const[ ]u16[ ]dvbs2_snr_tab\[\][ ]=' drivers/media/dvb/frontends/ds3000.c
+ defsnc 'static[ ]const[ ]struct[ ]cnr[ ]cnr_tab\[\][ ]=' drivers/media/dvb/frontends/mb86a16.c
+ defsnc 'u8[ ]lgtdqcs001f_inittab\[\][ ]=' drivers/media/dvb/mantis/mantis_vp1033.c
+ defsnc 'static[ ]const[ ]struct[ ]ov9640_reg[ ]ov9640_regs_dflt\[\][ ]=' drivers/media/video/ov9640.c
+ defsnc 'const[ ]static[ ]struct[ ]rj54n1_reg_val[ ]bank_[4578]\[\][ ]=' drivers/media/video/rj54n1cb0c.c
+ blob '#define[ ]_FW_NAME[(]api[)][ ]DRV_NAME[ ]["][.]["][ ]#api[ ]["]\.fw["]' drivers/media/video/iwmc3200top.h
+ defsnc 'static[ ]struct[ ]nand_ecclayout[ ]nandv2_hw_eccoob_largepage[ ]=' drivers/mtd/nand/mxc_nand.c
+ blob '#define[ ]FW_FILE_VERSION\([ ]*[\\][\n][ ]__stringify[(]BCM_5710_FW_\(MAJOR\|MINOR\|REVISION\|ENGINEERING\)_VERSION[)]\([ ]["][.]["]\)\?\)\+' drivers/net/bnx2x_main.c
+ blobname 'bnx2x-e1h\?-["][ ]FW_FILE_VERSION[ ]["]\.fw' drivers/net/bnx2x_main.c
+ blob '#define[ ]FW_VERSION\([ ]__stringify[(]FW_VERSION_\(MAJOR\|MINOR\|MICRO\)[)]\([ ]["][.]["]\)\?\([ ]*[\\][\n]\)\?\)\+' drivers/net/cxgb3/cxgb3_main.c
+ blobname 'cxgb3[/]t3fw-["][ ]FW_VERSION[ ]["]\.bin' drivers/net/cxgb3/cxgb3_main.c
+ blob '#define[ ]TPSRAM_VERSION\([ ]__stringify[(]TP_VERSION_\(MAJOR\|MINOR\|MICRO\)[)]\([ ]["][.]["]\)\?\([ ]*[\\][\n]\)\?\)\+' drivers/net/cxgb3/cxgb3_main.c
+ blobname 'cxgb3[/]t3\(%c\|[bc]\)_psram-["][ ]TPSRAM_VERSION[ ]["]\.bin' drivers/net/cxgb3/cxgb3_main.c
+ defsnc '[ ]static[ ]const[ ]u8[ ]rsshash\[40\][ ]=' drivers/net/igb/igb_main.c
+ defsnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_302x\[\][ ]=' drivers/net/wireless/rt2x00/rt2800lib.c
+ defsnc 'static[ ]struct[ ]conf_drv_settings[ ]default_conf[ ]=' drivers/net/wireless/wl12xx/wl1271_main.c
+ defsnc 'static[ ]u16[ ]bios_to_linux_keycode\[256\][ ]=' drivers/platform/x86/dell-wmi.c
+ accept '[ ]err[ ]=[ ]request_firmware[(][&]pm8001_ha->fw_image,' drivers/scsi/pm8001/pm8001_ctl.c
+ defsnc 'static[ ]unsigned[ ]char[ ]vpdb0_data\[\][ ]=' drivers/scsi/scsi_debug.c
+ defsnc 'static[ ]struct[ ]vesa_mode_table[ ]vesa_mode\[\][ ]=' drivers/staging/sm7xx/smtcfb.c
+ defsnc 'struct[ ]ModeInit[ ]VGAMode\[\][ ]=' drivers/staging/sm7xx/smtcfb.h
+ blob 'static[ ]const[ ]hcf_8[ ]fw_image_[1234]_data\[\][ ]=[^;]*[;]\([ ]*[/][*][ ]fw_image_[1234]_data[ ][*][/]\)\?' 'drivers/staging/wlags49_h2/\(ap\|sta\)_h25\?\.c'
+ blobname '[/]etc[/]agere[/]fw\.bin' drivers/staging/wlags49_h2/wl_profile.c
+ defsnc 'static[ ]const[ ]long[ ]chan_freq_list\[\]\[MAX_CHAN_FREQ_MAP_ENTRIES\][ ]=' drivers/staging/wlags49_h2/wl_util.c
+ blobname 'scope\.cod' 'sound/isa/\(Kconfig\|sscape\.c\)'
+ blobname 'sndscape\.co\([?dx01234]\|%d\)' 'sound/\(isa/\(Kconfig\|sscape\.c\)\|oss/README\.OSS\)'
+ defsnc 'static[ ]const[ ]u8[ ]\(adcm1700\|om6802\|po1030\)_sensor_\(init\|param1\)\[\]\[8\][ ]=' drivers/media/video/gspca/sonixj.c
+ blobname 'ath3k-1\.fw' drivers/bluetooth/ath3k.c
+ ;;
+
+ */patch*-2.6.27*|*/patch*-2.6.31.*)
+ accept '[ ]request_firmware[(][)][ ]will[ ]hit[ ]an[ ]OOPS' drivers/media/dvb/frontends/dib7000p.c
+ ;;
+
+ */patch*-2.6.30*)
+ initnc '[}][ ]bclk_divs\[\][ ]=[ ][{]' sound/soc/codecs/wm8903.c
+ ;;
+
+ */patch*-2.6.28-rc*)
+ # new in 2.6.28
+ accept '\(static[ ]\)\?const[ ]char[ ]\(inv\)\?parity\[256\][ ]=[ ][{][ \n01,]*[}][;]' 'Documentation/mtd/nand_ecc\.txt\|drivers/mtd/nand/nand_ecc\.c'
+ defsnc 'static[ ]const[ ]char[ ]\(bitsperbyte\|addressbits\)\[256\][ ]=' drivers/mtd/nand/nand_ecc.c
+ defsnc 'static[ ]struct[ ]pinmux_cfg_reg[ ]pinmux_config_regs\[\][ ]=' arch/sh/kernel/cpu/sh2a/pinmux-sh7203.c
+ defsnc '[ ]static[ ]const[ ]u8[ ]e_keymap\[\][ ]=' drivers/hid/hid-lg.c
+ defsnc '[ ][ ]*struct[ ]phy_reg[ ]phy_reg_init_[01]\[\][ ]=' drivers/net/r8169.c
+ defsnc 'DEFINE_DEFAULT_PDR[(]0x0161,[ ]256,' drivers/net/wireless/hermes_dld.c
+ defsnc 'static[ ]const[ ]int[ ]isink_cur\[\][ ]=' drivers/regulator/wm8350-regulator.c
+ defsnc 'static[ ]const[ ]s16[ ]\(converge_speed_ipb\?\|LAMBDA_table\[4\]\)\[101\][ ]=' drivers/staging/go7007/go7007-fw.c
+ defsnc 'static[ ]const[ ]u32[ ]addrinctab\[33\]\[2\][ ]=' drivers/staging/go7007/go7007-fw.c
+ defsnc 'static[ ]const[ ]u8[ ]\(default_intra_quant_table\|\(val\|bits\)_[ad]c_\(lu\|chro\)minance\)\[\][ ]=' drivers/staging/go7007/go7007-fw.c
+ defsnc 'static[ ]const[ ]int[ ]zz\[64\][ ]=' drivers/staging/go7007/go7007-fw.c
+ defsnc '[ ]u16[ ]pack\[\][ ]=' drivers/staging/go7007/go7007-fw.c
+ defsnc 'static[ ]u8[ ]\(initial\|channel\)_registers\[\][ ]=' 'drivers/staging/go7007/wis-\(ov7640\|saa7113\|tw2804\).c'
+ defsnc 'u16[ ]MTO_One_Exchange_Time_Tbl_[ls]\[MTO_MAX_FRAG_TH_LEVELS\]\[MTO_MAX_DATA_RATE_LEVELS\][ ]=' drivers/staging/winbond/mto.c
+ defsnc 'u32[ ]\(al2230_txvga_data\|w89rf242_txvga_old_mapping\)\[\]\[2\][ ]=' drivers/staging/winbond/reg.c
+ defsnc 'static[ ]const[ ]UINT16[ ]crc16tab\[256\][ ]=' drivers/staging/wlan-ng/hfa384x.c
+ defsnc 'static[ ]const[ ]UINT32[ ]wep_crc32_table\[256\][ ]=' drivers/staging/wlan-ng/p80211wep.c
+ defsnc 'static[ ]const[ ]unsigned[ ]char[ ]wm_vol\[256\][ ]=' sound/pci/ice1712/phase.c
+ defsnc 'static[ ]const[ ]u16[ ]wm8900_reg_defaults\[WM8900_MAXREG\][ ]=' sound/soc/wm8900.c
+ defsnc '[}][ ]\(clk_sys_ratios\|bclk_divs\)\[\][ ]=' sound/soc/wm8903.c
+ defsnc 'static[ ]u8[ ]af9015_ir_table_\(leadtek\|twinhan\|a_link\|msi\|mygictv\|kworld\)\[\][ ]=' drivers/media/dvb/dvb-usb/af9015.h
+ defsnc 'static[ ]struct[ ]snr_table[ ]\(qpsk\|qam\(16\|64\)\)_snr_table\[\][ ]=' drivers/media/dvb/frontends/af9013_priv.h
+ defsnc 'static[ ]struct[ ]regdesc[ ]\(ofsm_init\|tuner_init_\(env77h11d5\|mt2060\(_2\)\?\|mxl500\(3d\|5\)\|qt1010\|mc44s803\|unknown\|tda18271\)\)\[\][ ]=' drivers/media/dvb/frontends/af9013_priv.h
+ defsnc 'static[ ]u8[ ]stv0288_earda_inittab\[\][ ]=' drivers/media/dvb/frontends/eds1547.h
+ defsnc 'static[ ]u8[ ]serit_sp1511lhb_inittab\[\][ ]=' drivers/media/dvb/frontends/si21xx.c
+ defsnc 'static[ ]u8[ ]stv0288_inittab\[\][ ]=' drivers/media/dvb/frontends/stv0288.c
+
+ blobname 'haup-ir-blaster\.bin' drivers/input/lirc/lirc_zilog.c
+
+ # Non-Free license in entire file.
+ blob 'static[ ]unsigned[ ]char[ ]xilinx_firm\(_4610\)\?\[\][ ]=[ ][{]'"$sepx$blobpat*$sepx"'[}][;]' 'drivers/staging/me4000/me4\(00\|61\)0_firmware\.h'
+ blob 'static[ ]struct[ ]PHY_UCODE[ ]PhyUcode\[\][ ]=[^;]*[;]' drivers/staging/sxg/sxgphycode.h
+ blob 'static[ ]unsigned[ ]char[ ]SaharaUCode\[2\]\[57972\][ ]=[^;]*[;]' drivers/staging/sxg/saharadbgdownload.h
+ blob '#include[ ]["]saharadbgdownload\.h["]' drivers/staging/sxg/sxg.c
+ blob 'static[ ]u8[ ]\(Mojave\|Oasis\)UCode\[2\]\[65536\][ ]=[^;]*[;]' 'drivers/staging/slicoss/\(gb\|oasis\(dbg\)\?\)download\.h'
+ blob 'static[ ]u8[ ]\(GB\|Oasis\)RcvUCode\[2560\][ ]=[^;]*[;]' 'drivers/staging/slicoss/\(gb\|oasis\)rcvucode\.h'
+
+ # ok from earlier releases
+ accept 'for[ ]i[ ]in[ ][ 0-9\\\n]*[\n]do' 'Documentation/specialix.txt|Documentation/serial/specialix.txt'
+ defsnc 'static[ ]yyconst[ ]flex_int\(16\|32\)_t[ ]yy_[^[]*\[[0-9]*\][ ]=' '.*\.lex\.c_shipped'
+ defsnc 'static[ ]const[ ]yytype_u\?int\(8\|16\)[ ]yy[^\n []*\[\][ ]=' '.*\.lex\.c_shipped'
+ initnc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]const[ ]yytype_u\?int\(8\|16\)[ ]yy[^\n []*\[\][ ]=[*][/][;]' '.*\.tab\.c_shipped'
+ defsnc 'static[ ]struct[ ]cipher_testvec[ ]\(aes\|anubis\|bf\|camellia\|cts_mode\|des3_ede\|cast6\|salsa20_stream\|serpent\|tf\|tnepres\|xeta\|x\?tea\)\(_\(cbc\|ctr\|xts\)\)\?_\(enc\|dec\)_tv_template\[\][ ]=' 'crypto/\(tcrypt\|testmgr\).h'
+ defsnc 'static[ ]struct[ ]comp_testvec[ ]\(deflate\|lzo\)_\(de\)\?comp_tv_template\[\][ ]=' 'crypto/\(tcrypt\|testmgr\).h'
+ defsnc 'static[ ]struct[ ]hash_testvec[ ]\(aes_xcbc128\|crc32c\|hmac_sha2\(24\|56\)\|\(sha\|wp\)\(256\|384\|512\)\)_tv_template\[\][ ]=' 'crypto/\(tcrypt\|testmgr\).h'
+ defsnc 'static[ ]\(const[ ]\)\?RegInitializer[ ]initData\[\][ ]__initdata[ ]=' 'drivers/ide/ali14xx\.c\|drivers/ide/legacy/ali14xx\.c'
+ defsnc 'static[ ]const[ ]u8[ ]setup\[\][ ]=' 'drivers/ide/pci/delkin_cb\.c\|drivers/ide/delkin_cb\.c'
+ defsnc 'static[ ]u8[ ]cvs_time_value\[\]\[XFER_UDMA_6[ ]-[ ]XFER_UDMA_0[ ][+][ ]1\][ ]=' 'drivers/ide/sis5513\.c\|drivers/ide/pci/sis5513\.c'
+ defsnc 'static[ ]u8[ ]\(act\|ini\|rco\)_time_value\[\]\[8\][ ]=' 'drivers/ide/sis5513\.c\|drivers/ide/pci/sis5513\.c'
+ defsnc 'static[ ]const[ ]u8[ ]speedtab[ ]\[3\]\[12\][ ]=' 'drivers/ide/umc8672\.c\|drivers/ide/legacy/umc8672\.c'
+ initnc 'static[ ]const[ ]__u8[ ]\(effects\|gamma\)_table\[\(MAX_[A-Z]*\|[A-Z]*_MAX\)\]\[[0-9]*\][ ]=' drivers/media/video/gspca/t631.c
+ defsnc 'static[ ]const[ ]s8[ ]\(b43\(legacy\)\?\|bcm43xx\)_tssi2dbm_[bg]_table\[\][ ]=' net/wireless/b43/phy.c
+ accept '#define[ ]_MAP_0_32_ASCII_SEG7_NON_PRINTABLE[ ]\\[\n][ ]\(0,\)\+$' 'drivers/input/misc/map_to_7segment\.h\|include/linux/map_to_7segment\.h'
+ accept '[ * ]*0[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]1[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]2[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]3[\n][ * ]*0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]0[ ]1' 'net/\(netfilter\|ipv4\)/ipvs/ip_vs_sync\.c\|net/sctp/sm_make_chunk\.c\|include/linux/scpt\.h\|drivers/staging/rt3090/common/igmp_snoop\.c'
+ defsnc 'static[ ]const[ ]unsigned[ ]char[ ]wm_vol\[256\][ ]=' sound/pci/ice1712/phase.c
+ defsnc 'static[ ]const[ ]char[ ]zr360[56]0_dht\[0x1a4\][ ]=' 'drivers/media/video/zr36060\.c\|drivers/media/video/zoran/zr36060\.c'
+ defsnc 'static[ ]const[ ]char[ ]zr360[56]0_dqt\[0x86\][ ]=' 'drivers/media/video/zr36060\.c\|drivers/media/video/zoran/zr36060\.c'
+
+ # These are removed in 2.6.28, they're here so --reverse-patch tests pass.
+ defsnc 'static[ ]unsigned[ ]char[ ]irq_xlate\[32\][ ]=' arch/sparc/kernel/sun4m_irq.c
+ defsnc 'static[ ]int[ ]logitech_expanded_keymap\[LOGITECH_EXPANDED_KEYMAP_SIZE\][ ]=' drivers/hid/hid-input.c
+ initc '[ ]static[ ]const[ ]__u8[ ]\(read_indexs\|n\(set\)\?[0-9]*\|missing\)\[[0-9x]*\][ ]=' drivers/media/video/gspca/t613.c
+ defsnc 'static[ ]const[ ]u_char[ ]nand_ecc_precalc_table\[\][ ]=' drivers/mtd/nand/nand_ecc.c
+ oprepline '#define[ ]AR5K_RATES_\(11[ABG]\|TURBO\|XR\)[ ]' drivers/net/wireless/ath5k/ath5k.h
+ defsnc 'static[ ]const[ ]struct[ ]ath_hal[ ]ar5416hal[ ]=' drivers/net/wireless/ath9k/hw.c
+ defsnc 'const[ ]unsigned[ ]char[ ]INIT_2\[127\][ ]=' drivers/video/omap/lcd_sx1.c
+
+ initc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]const[ ]__u8[ ]ov7630_sensor_init\[\]\[8\][ ]=[ ][{][*][/][;]' drivers/media/video/gspca/sonixj.c
+ ;;
+
+ */patch*-2.6.27-rc* | */patch*-2.6.26-git* | */git-linus.diff)
+ accept '[ ]\.section[ ]__ex_table,["]a["]'"$sepx$blobpat*" 'arch/x86/lib/copy_user_\(nocache_\)\?64.S'
+ initnc 'static[ ]struct[ ]cipher_testvec[ ]des3_ede_cbc_\(enc\|dec\)_tv_template\[\][ ]=' crypto/tcrypt.h
+ accept 'desc_config1:[\n][ ]\.byte[ ]0x09,[ ]0x02'"$sepx$blobpat*" 'firmware/keyspan_pda/\(keyspan_pda\|xircom_pgs\).S'
+ accept 'string_mfg:[\n]\?\([;]\?[ ]\.byte[^\n]*[\n]\)\+string_mfg_end:' 'firmware/keyspan_pda/\(keyspan_pda\|xircom_pgs\).S'
+ accept 'string_product:[\n]\?\([;]\?[ ]\.byte[^\n]*[\n]\)\+string_product_end:' 'firmware/keyspan_pda/\(keyspan_pda\|xircom_pgs\).S'
+ accept ':03000000020200F9[\n]:040023000205\(9B0037\|5F0073\)[\n]\(:050030000000000000CB[\n]\|:0400430002010000B6[\n]\)*'"$sepx$blobpat*"'[\n]:\(0E06E0006400670065007400060334003700F4\|0606A000060334003700E0\)[\n]:00000001FF[\n]' 'firmware/keyspan_pda/\(keyspan_pda\|xircom_pgs\).HEX'
+ accept ':100000000C004000000000000000000000000000A4[\n]'"$sepx$blobpat*"'[\n][/][*][ ]DSP56001[ ]bootstrap[ ]code[ ][*][/]' firmware/dsp56k/bootstrap.bin.ihex
+ initnc 'static[ ]const[ ]u16[ ]uda1380_reg\[UDA1380_CACHEREGNUM\][ ]=' sound/soc/codecs/uda1380.c
+ initnc 'static[ ]const[ ]u16[ ]wm8510_reg\[WM8510_CACHEREGNUM\][ ]=' sound/soc/codecs/wm8510.c
+ initnc 'static[ ]const[ ]unsigned[ ]short[ ]atkbd_set[23]_keycode\[512\][ ]=' drivers/input/keyboard/atkbd.c
+ initnc 'static[ ]const[ ]unsigned[ ]short[ ]atkbd_unxlate_table\[128\][ ]=' drivers/input/keyboard/atkbd.c
+ initnc 'static[ ]const[ ]unsigned[ ]char[ ]usb_kbd_keycode\[256\][ ]=' drivers/hid/usbhid/usbkbd.c
+ initnc '[ ][ ]u8[ ]buf,[ ]bufs\[\][ ]=' drivers/media/dvb/dvb-usb/cxusb.c
+ initnc 'static[ ]struct[ ]dvb_pll_desc[ ][^\n]*[ ]=' drivers/media/dvb/frontends/dvb-pll.c
+ initnc '[ ]static[ ]int[ ]sysdiv_to_div_x_2\[\][ ]=' arch/powerpc/platforms/512x/clock.c
+ defsnc 'static[ ]const[ ]__u8[ ]cx_inits_\(176\|320\|352\|640\)\[\][ ]=' drivers/media/video/gspca/conex.c
+ defsnc 'static[ ]const[ ]__u8[ ]cx_jpeg_init\[\]\[8\][ ]=' drivers/media/video/gspca/conex.c
+ defsnc 'static[ ]const[ ]__u8[ ]cxjpeg_\(640\|352\|320\|176\|qtable\)\[\]\[8\][ ]=' drivers/media/video/gspca/conex.c
+ initnc 'static[ ]const[ ]unsigned[ ]char[ ]quant\[\]\[0x88\][ ]=' drivers/media/video/gspca/jpeg.h
+ initnc 'static[ ]unsigned[ ]char[ ]huffman\[\][ ]=' drivers/media/video/gspca/jpeg.h
+ initc '[ ]\?static[ ]const[ ]struct[ ]ov_i2c_regvals[ ]norm_76[1247]0\[\][ ]=' drivers/media/video/gspca/ov519.c
+ initnc 'static[ ]const[ ]__u8[ ]pac207_sensor_init\[\]\[8\][ ]=' drivers/media/video/gspca/pac207.c
+ initnc 'static[ ]const[ ]__u8[ ]pac7311_jpeg_header\[\][ ]=' drivers/media/video/gspca/pac7311.c
+ defsnc 'static[ ]const[ ]__u8[ ]\(start\|page[34]\)_73\(02\|11\)\[\][ ]=' drivers/media/video/gspca/pac7311.c
+ initnc 'static[ ]const[ ]__u8[ ]init\(Hv7131\|Ov\(6650\|7630\(_3\)\?\)\|Pas\(106\|202\)\|Tas51[13]0\)\[\][ ]=' drivers/media/video/gspca/sonixb.c
+ initnc 'static[ ]const[ ]__u8[ ]\(hv7131\|ov\(6650\|7630\(_3\)\?\)\|pas\(106\|202\)\|tas51[13]0\)_sensor_init\(_com\)\?\[\]\[8\][ ]=' drivers/media/video/gspca/sonixb.c
+ defsnc 'static[ ]\(const[ ]\)\?__u8[ ]\(hv7131r\|mi0360\|mo4000\|ov76\([36]0\|48\)\|om6802\)_sensor_init\[\]\[8\][ ]=' drivers/media/video/gspca/sonixj.c
+ initnc 'static[ ]const[ ]__u8[ ]qtable4\[\][ ]=' drivers/media/video/gspca/sonixj.c
+ initnc 'static[ ]const[ ]__u16[ ]\(spca500_visual\|Clicksmart510\)_defaults\[\]\[3\][ ]=' drivers/media/video/gspca/spca500.c
+ initnc 'static[ ]const[ ]__u8[ ]qtable_\(creative_pccam\|kodak_ez200\|pocketdv\)\[2\]\[64\][ ]=' drivers/media/video/gspca/spca500.c
+ initnc 'static[ ]const[ ]__u16[ ]spca501c\?_\(\(3com\|arowana\|mysterious\)_\)\?\(init\|open\)_data\[\]\[3\][ ]=' drivers/media/video/gspca/spca501.c
+ defsnc 'static[ ]const[ ]\(__u16\|u8\)[ ]spca505b\?_\(init\|open\)_data\(_ccd\)\?\[\]\[3\][ ]=' drivers/media/video/gspca/spca505.c
+ initnc 'static[ ]const[ ]__u16[ ]spca508\(cs110\|_sightcam2\?\|_vista\)\?_init_data\[\]\[3\][ ]=' drivers/media/video/gspca/spca508.c
+ initnc 'static[ ]const[ ]__u16[ ]spca561_init_data\[\]\[2\][ ]=' drivers/media/video/gspca/spca561.c
+ initnc 'static[ ]const[ ]__u16[ ]spca504\(_pccam600\|A_clicksmart420\)_\(init\|open\)_data\[\]\[3\][ ]=' drivers/media/video/gspca/sunplus.c
+ initnc 'static[ ]const[ ]__u8[ ]qtable_\(creative_pccam\|spca504_default\)\[2\]\[64\][ ]=' drivers/media/video/gspca/sunplus.c
+ initnc 'static[ ]const[ ]__u8[ ]\(effects\|gamma\)_table\[MAX_[A-Z]*\]\[[0-9]*\][ ]=' drivers/media/video/gspca/t631.c
+ initnc 'static[ ]const[ ]__u8[ ]tas5130a_sensor_init\[\]\[8\][ ]=' drivers/media/video/gspca/t613.c
+ defsnc '[ ]static[ ]const[ ]\(__\)\?u8[ ]\(read_indexs\|n\(set\)\?[0-9]*\(_other\)\?\|missing\)\[[0-9x]*\][ ]=' drivers/media/video/gspca/t613.c
+ defsnc 'static[ ]const[ ]__u8[ ]\(mi13[12]0\|po3130\|hv7131r\|ov76[67]0\)_\(\(soc\)\?initQ\?VGA_\(JPG\|data\)\|rundata\)\[\]\[4\][ ]=' drivers/media/video/gspca/vc032x.c
+ initnc 'static[ ]const[ ]struct[ ]usb_action[ ]\(cs2102\|hdcs2020xx\|icm105axx\|ov7630c\|pb0330[3x]x\)_Initial\(Scale\)\?\[\][ ]=' drivers/media/video/gspca/zc3xx.c
+ initnc 'static[ ]const[ ]u8[ ]rtl8225z2_agc\[\][ ]=' drivers/net/wireless/rtl8187_rtl8225.c
+ initnc 'static[ ]const[ ]u8[ ]rtl8225z2_ofdm\[\][ ]=' drivers/net/wireless/rtl8187_rtl8225.c
+ initnc 'static[ ]const[ ]u8[ ]rtl8225z2_tx_power_cck\[\][ ]=' drivers/net/wireless/rtl8187_rtl8225.c
+ initnc 'static[ ]const[ ]u8[ ]rtl8225z2_tx_power_cck_ch14\[\][ ]=' drivers/net/wireless/rtl8187_rtl8225.c
+ initnc 'static[ ]const[ ]__u16[ ]t10_dif_crc_table\[256\][ ]=' lib/crc-t10dif.c
+ initnc 'static[ ]crb_128M_2M_block_map_t[ ]crb_128M_2M_map\[64\][ ]=' drivers/net/netxen/netxen_hw.c
+ initnc 'static[ ]const[ ]__u16[ ]crc10_table\[256\][ ]=' drivers/usb/serial/safe_serial.c
+ accept '[ ]*\([ ]*0\)*\([ ]*1\)*[\n][ ]*0[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]0[ ]1[ ]*2[ ]3[ ]4[ ]5[ ]6[ ]7' 'Documentation/bt8xxgpio.txt'
+ initnc '[ ]static[ ]int[ ]exp_lut\[256\][ ]=' drivers/isdn/mISDN/dsp_audio.c
+ initnc 'static[ ]const[ ]u32[ ]bf_pbox\[16[ ][+][ ]2\][ ]=' drivers/isdn/mISDN/dsp_blowfish.c
+ initnc 'static[ ]const[ ]u32[ ]bf_sbox\[256[ ][*][ ]4\][ ]=' drivers/isdn/mISDN/dsp_blowfish.c
+ initnc 'static[ ]u8[ ]sample_\(german_\(all\|old\)\|american_\(dialtone\|ringing\|busy\)\|special[123]\|silence\)\[\][ ]=' drivers/isdn/mISDN/dsp_tones.c
+ initnc 'struct[ ]pattern[ ][{][^}]*int[ ]tone[;][^}]*[}][ ]pattern\[\][ ]=' drivers/isdn/mISDN/dsp_tones.c
+ initnc 'static[ ]u8[ ]\([au]\|_4\)law_to_\([ua]law\|4bit\)\[256\][ ]=' drivers/isdn/mISDN/l1oip_codec.c
+ initnc 'static[ ]unsigned[ ]char[ ]banner_table\[\][ ]=' arch/sh/boards/mach-microdev/led.c
+ initnc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]const[ ]\(yytype_u\?int\(8\|16\)\|\(unsigned[ ]\)\?\(short\([ ]int\)\?\|char\)\)[ ]yy[^[]*\[\][ ]=[*][/][;]' scripts/genksyms/parse.c_shipped
+ accept 'irq_prio_\([hdl]\|l[cd]\):'"$sepx$blobpat*" arch/arm/inlcude/asm/hardware/entry-macro-iomd.S
+ defsnc '[ ]static[ ]const[ ]int[ ]desc_idx_table\[\][ ]=' arch/arm/include/asm/hardware/iop3xx-adma.h
+ defsnc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]const[ ]__u8[ ]\(hv7131r\|mi0360\|mo4000\|ov76\(60\|48\)\)_sensor_init\[\]\[8\][ ]=[ ][{][*][/][;]' drivers/media/video/gspca/sonixj.c
+ defsnc 'static[ ]const[ ]struct[ ]ath_hal[ ]ar5416hal[ ]=' drivers/net/wireless/ath9k/hw.c
+ defsnc 'static[ ]\(const[ ]\)\?u32[ ]ar\(5416\|9280\)\(Modes\(_fast_clock\)\?\|Common\|BB_RfGain\|Bank6\(TPC\)\?\|Addac\)\(_91[06]0\(1_1\)\?\|_9280\(_2\)\?\)\?\[\]\[[236]\][ ]=' drivers/net/wireless/ath9k/initvals.h
+ ;;
+
+ */linux-2.6-gspca-git.patch)
+ # Probably for 2.6.28 or .29.
+ initnc 'static[ ]const[ ]__u8[ ]ov\(534\|772x\)_reg_initdata\[\]\[2\][ ]=' drivers/media/video/gspca/ov534.c
+ defsc 'static[ ]const[ ]\(__\)\?u8[ ]\(mi\(0360\|13[12]0\)\|po\(1200\|3130\)\|hv7131r\|ov76[67]0\)_\(\(soc\)\?_\?[iI]nit\(Q\?V\|SX\)GA\(_\(JPG\|data\)\)\?\|rundata\)\[\]\[4\][ ]=' drivers/media/video/gspca/vc032x.c
+ # Already in 2.6.27.
+ initnc 'static[ ]const[ ]__u8[ ]initOv6650\[\][ ]=' drivers/media/video/gspca/sonixb.c
+ initnc '[ ][/][*][ ]Some[ ]more[ ]unknown[ ]stuff[ ][*][/]' drivers/media/video/gspca/sonixb.c
+ defsnc 'static[ ]const[ ]__u8[ ]ov7648_sensor_init\[\]\[8\][ ]=' drivers/media/video/gspca/sonixj.c
+ # No merge needed
+ defsnc '#if[ ]0[\n][ ][{]0x30,[ ]0x0154,[ ]0x0008[}],' drivers/media/video/gspca/sunplus.c
+ ;;
+
+ */linux*alsa*.patch)
+ defsnc 'static[ ]u8[ ]tas3004_treble_table\[\][ ]=' sound/aoa/codecs/tas-basstreble.h
+ defsnc 'static[ ]const[ ]unsigned[ ]char[ ]wm_vol\[256\][ ]=' sound/pci/ice1712/phase.c
+ defsnc 'static[ ]const[ ]u16[ ]wm8900_reg_defaults\[WM8900_MAXREG\][ ]=' sound/soc/wm8900.c
+ defsnc '[}][ ]\(clk_sys_ratios\|bclk_divs\)\[\][ ]=' sound/soc/wm8903.c
+ ;;
+
+ */patch*-2.6.26-rc*)
+ initnc 'static[ ]u64[ ]vec2off\[68\][ ]=' arch/ia64/kvm/process.c
+ initnc "[ ][ ][ ]interrupts[ ]=[ ]<\\(0x\\)\\?3[ ]\\(0x\\)\\?0[ ]\\(0x\\)\\?0[ ][ ]$blobpat*>[;]" 'arch/powerpc/boot/dts/\(cm5200\|lite5200b\?\|kuroboxHG\|pcm030\|tqm5200\).dts'
+ initnc 'static[ ]const[ ]u32[ ]crctab32\[\][ ]=' arch/x86/boot/tools/build.c
+ initnc 'static[ ]const[ ]u64[ ]sha512_K\[80\][ ]=' 'crypto/sha512\(_generic\)\?.c'
+ initnc 'static[ ]struct[ ]hash_testvec[ ]\(hmac_sha\(224\|256\)\|aes_xcbc128\|crc32c\)_tv_template\[\][ ]=' crypto/tcrypt.h
+ initnc 'static[ ]struct[ ]cipher_testvec[ ]\(bf_cbc\|serpent\|tnepres\|aes\(_\(cbc\|ctr\|xts\)\)\?\|x\?tea\|anubis\(_cbc\)\?\|xeta\|camellia_cbc\|cts_mode\)_\(enc\|dec\)_tv_template\[\][ ]=' crypto/tcrypt.h
+ initnc '[ ][ ]\.\(digest\|entries\|input\|key\|output\|plaintext\|result\)[ ]*=[ ][{"]' crypto/tcrypt.h
+ initnc 'static[ ]const[ ]u8[ ]speedtab[ ]\[3\]\[12\][ ]=' drivers/ide/legacy/umc8672.c
+ initnc 'static[ ]u8[ ]cvs_time_value\[\]\[XFER_UDMA_6[ ]-[ ]XFER_UDMA_0[ ][+][ ]1\][ ]=' drivers/ide/pci/sis5513.c
+ initnc 'static[ ]u8[ ]\(ini\|act\|rco\)_time_value\[\]\[8\][ ]=' drivers/ide/pci/sis5513.c
+ initnc 'static[ ]u8[ ]mt2131_config1\[\][ ]=' drivers/media/common/tuners/mt2131.c
+ initnc 'static[ ]u8[ ]mt2266_init2\[\][ ]=' drivers/media/common/tuners/mt2266.c
+ initnc 'u16[ ]e1000_igp_cable_length_table\[IGP01E1000_AGC_LENGTH_TABLE_SIZE\][ ]=' drivers/net/e1000/e1000_hw.c
+ initnc '\(uint16_t\|u16\)[ ]e1000_igp_2_cable_length_table\[IGP02E1000_AGC_LENGTH_TABLE_SIZE\][ ]=' drivers/net/e1000/e1000_hw.c # u16 on 2.6.26
+ oprepline '#define[ ]AR5K_RATES_11[ABG][ ]' drivers/net/wireless/ath5k/ath5k.h
+ oprepline '[ ][{][ ]1,[ ]MODULATION_XR,[ ]1000,[ ]2,[ ]139,[ ]1[ ][}],[ ]' drivers/net/wireless/ath5k/ath5k.h
+ initnc 'static[ ]const[ ]struct[ ]ath5k_ini_mode[ ]rf\(5413\|24\(13\|25\)\)_ini_mode_end\[\][ ]=' drivers/net/wireless/ath5k/initvals.c
+ initnc 'static[ ]yyconst[ ]flex_int\(16\|32\)_t[ ]yy_[^[]*\[[0-9]*\][ ]=' '.*\.lex\.c_shipped'
+ initnc 'static[ ]const[ ]yytype_u\?int\(8\|16\)[ ]yy[^\n []*\[\][ ]=' '.*\.lex\.c_shipped'
+ # new in 2.6.26
+ defsnc 'static[ ]struct[ ]mse2snr_tab[ ]\(vsb\|qam\(64\|256\)\)_mse2snr_tab\[\][ ]=' drivers/media/dvb/frontends/au8522.c
+ defsnc '[}][ ]\(VSB\|QAM\)_mod_tab\[\][ ]=' drivers/media/dvb/frontends/au8522.c
+ initnc '[}][ ]itd1000_\(lpf_pga\|fre_values\)\[\][ ]=' drivers/media/dvb/frontends/itd1000.c
+ initnc '[}][ ]\(vsb\|qam\(64\|256\)\)_snr_tab\[\][ ]=' drivers/media/dvb/frontends/s5h1411.c
+ initnc '[}][ ]snr_tab\[\][ ]=' drivers/media/dvb/frontends/tda10048.c
+ initnc '[ ]static[ ]const[ ]u8[ ]biphase_tbl\[\][ ]=' drivers/media/video/cx18/cx18-av-vbi.c
+ initnc '[ ]static[ ]const[ ]u8[ ]mpeg_hdr_data\[\][ ]=' drivers/media/video/cx18/cx18-vbi.c
+ initnc 'static[ ]u32[ ]reg_init_initialize\[\][ ]=' drivers/media/video/saa717x.c
+ initnc '[ ][}][ ]vals\[\][ ]=' drivers/media/video/saa717x.c
+ initnc 'static[ ]const[ ]u32[ ]\(main\|gear\)_seedset\[BACKOFF_SEEDSET_ROWS\]\[BACKOFF_SEEDSET_LFSRS\][ ]=' drivers/net/forcedeth.c
+ blob 'unsigned[ ]char[ ]\(IDX_ACTIVATE_\(READ\|WRITE\)\|\(CM\|ULP\)_\(ENABLE\|SETUP\)\|DM_ACT\)[ ]=[ ]'"$sepx$blobpat*$sepx[;]" drivers/s390/net/qeth_core_mpc.c # from drivers/s390/net/qeth_mpc.c in 2.6.25
+ initnc '[}][ ]pll_table\[\][ ]=' drivers/video/geode/lxfb_ops.c
+ accept "[ ][ ][{][ ]0x00014284,[ ][ ]19688[ ][}],[\n][ ][ ][{][ ]0x00011104,[ ][ ]20400[ ][}],[\n][ ][ ][{][ ]$blobpat*[ ][}]," drivers/video/geode/lxfb_ops.c # won't be necessary in rc3
+ initnc 'static[ ]const[ ]u16[ ]wm9713_reg\[\][ ]=' sound/soc/codecs/wm9713.c
+ accept 'P[13]\([\n]#[^\n]*\)*[\n]*\([\n][0-9 ]*\)\+' drivers/video/logo/logo_blackfin_clut224.ppm
+ ;;
+ */patch*-2.6.25-rc*)
+ initnc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]uchar[ ]sbox\[8\]\[4\]\[16\][ ]=[ ][{][*][/][;]'
+ accept '[ ][$]3[ ]=[ ][{][{]pge[ ]=[ ][{][{]ste[ ]=[ ][{]\(\([0-9][0-9a-fx{},\n ]*\|\(pge\|ste\)[ ]=\|<repeats[ ][0-9]\+[ ]times>\)[{},\n ]*\)*<repeats[ ]11[ ]times>[}]$'
+ initnc 'static[ ]yyconst[ ]flex_int\(16\|32\)_t[ ]yy_[^[]*\[[0-9]*\][ ]='
+ initnc 'static[ ]const[ ]yytype_u\?int\(8\|16\)[ ]yy[^[]*\[\][ ]='
+ initnc '[ ]int[ ]bcomm_irq\[3[*]16\][ ]='
+ initnc '[ ]static[ ]const[ ]int8[ ]countLeadingZerosHigh\[\][ ]='
+ initnc 'static[ ]unsigned[ ]long[ ]shmedia_opcode_table\[64\][ ]='
+ initnc 'u_char[ ]const[ ]data_sizes_16\[32\][ ]='
+ initnc 'static[ ]u_char[ ]const[ ]data_sizes_32\[32\][ ]='
+ initnc '[ ][ ]\.\(digest\|entries\|input\|key\|output\|plaintext\|result\)[ ]*=[ ][{]'
+ initnc 'static[ ]struct[ ][^\n]*_testvec[ ][^\n]*_tv_template\[\][ ]='
+ initnc 'static[ ]struct[ ]nic_qp_map[ ]nic_qp_mapping_[01]\[\][ ]='
+ initnc 'static[ ]u8[ ]mt2266_init2\[\][ ]='
+ initnc 'static[ ]struct[ ]regval[ ]ov_initvals\[\][ ]='
+ initnc 'static[ ]struct[ ]regval[ ]stk1125_initvals\[\][ ]='
+ initnc 'static[ ]u8[ ]bnx2x_stats_len_arr\[BNX2X_NUM_STATS\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]arb_line[ ]read_arb_data\[NUM_RD_Q\]\[MAX_RD_ORD[ ][+][ ]1\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]arb_line[ ]write_arb_data\[NUM_WR_Q\]\[MAX_WR_ORD[ ][+][ ]1\][ ]='
+ initnc 'uint16_t[ ]e1000_igp_cable_length_table\[IGP01E1000_AGC_LENGTH_TABLE_SIZE\][ ]='
+ initnc 'uint16_t[ ]e1000_igp_2_cable_length_table\[IGP02E1000_AGC_LENGTH_TABLE_SIZE\][ ]='
+ oprepline '#define[ ]AR5K_RATES_11\([ABG]\|TURBO\|XR\)[ ]' drivers/net/wireless/ath5k/ath5k.h
+ initnc '[ ][ ][}][ ]blinkrates\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]ath5k_ini[ ]ar5212_ini\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]ath5k_ini_rf[ ]rfregs_5111\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]ath5k_ini_rf[ ]rfregs_5112\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]ath5k_ini_rf[ ]rfregs_5112a\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]ath5k_ini_rf[ ]rfregs_5413\[\][ ]='
+ initnc 'static[ ]const[ ]u16[ ]rtl8225bcd_rxgain\[\][ ]='
+ initnc 'static[ ]const[ ]u8[ ]rtl8225_agc\[\][ ]='
+ initnc 'static[ ]const[ ]u8[ ]rtl8225_tx_power_cck\[\][ ]='
+ initnc 'static[ ]const[ ]u8[ ]rtl8225_tx_power_cck_ch14\[\][ ]='
+ initnc 'static[ ]const[ ]u16[ ]rtl8225z2_rxgain\[\][ ]='
+ accept '[ ][ ][ ][ ][ ]\([ ]49,\)*[\n]\([ 0-9,]*[\n]\)*[ ][ ][ ][ ][ ]\([ ]49,\)*$'
+ initnc 'static[ ]const[ ]unsigned[ ]char[ ]wm_vol\[256\][ ]='
+ accept 'domain<N>[ ]<cpumask>[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9[ ]10[ ]11[ ]12[ ]13[ ]14[ ]15[ ]16[ ]17[ ]18[ ]19[ ]20[ ]21[ ]22[ ]23[ ]24[ ]25[ ]26[ ]27[ ]28[ ]29[ ]30[ ]31[ ]32[ ]33[ ]34[ ]35[ ]36$'
+ defsnc 'static[ ]const[ ]u16[ ]e1000_igp_2_cable_length_table\[\][ ]=' drivers/net/e1000e/phy.c
+ accept '[ ]24[ ]=>[ ]\[[\n]\([^\n]*[\n]\)*[ ]\]\(,[ ][0-9]\+[ ]=>[ ]\[\)\?$'
+ accept '[ ][ ]'"[']"'0x[^\n]*[\n]\([^\n]*[\n]\)*[ ]\]\([,][ ][0-9]\+[ ]=>[ ]\[\)\?$'
+ initnc 'const[ ]u\(8\|16\|32\)[ ]b43_ntab_\(\(adjustpower\|estimatepowerlt\|gainctl\|iqlt\|loftlt\|noisevar1\|tdi[24]0a\)[01]\|channelest\|frame\(lookup\|struct\)\|mcs\|pilot\|tdtrn\|tmap\)\[\][ ]='
+ ;;
+ */*drm*.patch)
+ defsnc 'static[ ]const[ ]u32[ ]cayman_io_mc_regs\[BTC_IO_MC_REGS_SIZE\]\[2\][ ]=' drivers/gpu/drm/radeon/ni.c
+ defsnc 'static[ ]struct[ ]v_table[ ]v_table\[\][ ]=' drivers/gpu/drm/i915/i915_dma.c
+ defsnc '[}][ ]est3_modes\[\][ ]=' drivers/gpu/drm/drm_edid.c
+ defsnc 'const[ ]u32[ ]r[67]xx_default_state\[\][ ]=' drivers/gpu/drm/radeon/r600_blit_shaders.c
+ defsnc 'struct[ ]nv17_tv_norm_params[ ]nv17_tv_norms\[NUM_TV_NORMS\][ ]=' drivers/gpu/drm/nouveau/nv17_tv_modes.c
+ defsnc 'static[ ]int[ ]atom_dst_to_src\[8\]\[4\][ ]=' drivers/gpu/drm/radeon/atom.c
+ blobname 'matrox[/]g[24]00_warp\.fw' drivers/gpu/drm/mga/mga_warp.c
+ blobname 'r128[/]r128_cce\.bin' drivers/gpu/drm/r128/r128_cce.c
+ blobname 'radeon[/]R\([123]0\|[45]2\|S6[09]\)0_cp\.bin' drivers/gpu/drm/radeon/r100.c
+ blobname 'radeon[/]\(R\(60\|V6[1237]\|S7[1378]\)[05]\|%s\)_\(pfp\|me\)\.bin' drivers/gpu/drm/radeon/r600.c
+
+ # linux-2.6-drm-i915-modeset.patch, nouveau-drm*.patch,
+ # drm-fedora9-rollup.patch
+ initnc 'static[ ]const[ ]u32[ ]filter_table\[\][ ]=' drivers/char/drm/intel_tv.c
+ defsnc '\(static[ ]uint32_t\|[}]\)[ ]nv04_graph_ctx_regs[ ]\?\[\][ ]=' drivers/char/drm/nv04_graph.c
+ defsnc 'static[ ]int[ ]nv1[07]_graph_ctx_regs[ ]\?\[\][ ]=' drivers/char/drm/nv10_graph.c
+ defsnc '[ ][}][ ]common_modes\[17\][ ]=' drivers/gpu/drm/radeon/radeon_connectors.c
+ defsnc 'static[ ]const[ ]u8[ ]types\[256\][ ]=' drivers/gpu/drm/nouveau/nvc0_vram.c
+
+ # drm-upgrayedd.patch
+ defsnc 'static[ ]const[ ]u16[ ]\(y\|uv\)_static_hcoeffs\[N_HORIZ_\(Y\|UV\)_TAPS[ ][*][ ]N_PHASES\][ ]=' drivers/gpu/drm/i915/intel_overlay.c
+
+ # Although the developers of the drivers are not trying to stop
+ # anyone from modifying it or understanding it, they acknowledge
+ # these are bits of code, obtained through mmio interactions.
+ # This means these blobs are not source code, AND original authors
+ # of the blobs have power to stop others from modifying them.
+ # Non-Free Software, for sure.
+
+ # initnc 'static[ ]uint32_t[ ]nv\(4[013467ace]\|49_4b\|8[46]\)_ctx_\(voodoo\|prog\)\[\][ ]=' 'drivers/char/drm/nv40_graph.c|.*'
+ ;;
+ */linux-2.6*-lirc.patch | */lirc-*.patch)
+ defsnc 'const[ ]unsigned[ ]char[ ]map_table\[\][ ]=' drivers/input/lirc/lirc_ttusbir.c
+ blobname 'haup-ir-blaster\.bin' drivers/input/lirc/lirc_zilog.c
+ ;;
+ */linux-2.6*-at76.patch)
+ blobname 'atmel_at76c50\(3-\(i386[13]\|rfmd\(-acc\)\?\)\|5\(a\(mx\)\?\)\?-rfmd\(2958\)\?\)\.bin' drivers/net/wireless/at76_usb/at76_usb.c
+ ;;
+ */v4l1*.patch)
+ accept '[(]at[ ]which[ ]point[ ]it[ ]should[ ]use[ ]request_firmware'
+ ;;
+ */linux-2.6-v4l-dvb*.patch)
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]unsigned[ ]char[ ]hid_keyboard\[256\][ ]=\([ ][{][*][/][;]\)\?' drivers/hid/hid-input.c
+ # post 2.6.37 fixes start here
+ defsnc 'static[ ]const[ ]struct[ ]dib0090_pll[ ]dib0090_p1g_pll_table\[\][ ]=' drivers/media/dvb/frontends/dib0090.c
+ defsnc '[ ]static[ ]u8[ ]sine\[\][ ]=' drivers/media/dvb/frontends/dib7000p.c
+ defsnc 'u32[ ]fe_info\[44\][ ]=' drivers/media/dvb/frontends/dib9000.c
+ defsnc 'static[ ]const[ ]struct[ ]regval_list[ ]ov2640_init_regs\[\][ ]=' drivers/media/video/ov2640.c
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]technisat_usb2_devices[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*\([ ]\.identify_state[ ]*=[ ]technisat_usb2_identify_state,[\n]\)\?[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/technisat-usb2.c
+ # present in 2.6.37
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]lme2510c\?_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*\([ ]\.download_firmware[ ]=[ ]lme2510_download_firmware,[\n]\)\?[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/lmedm04.c
+ accept '[ ]\+request_firmware[(][)][ ]will[ ]hit[ ]an[ ]OOPS' drivers/media/dvb/frontends/dib7000p.c
+ # post 2.6.35 fixes start here
+ defsnc '[ ]static[ ]u8[ ]def_regs\[\][ ]=' drivers/media/common/tuners/tda18218.c
+ accept '[ ]p7500->firmware[ ]=' drivers/media/dvb/dvb-usb/dw2102.c
+ accept 'static[ ]struct[ ]dvb_usb_device_properties[ ]lme2510c\?_properties[ ]=[ ][{][\n]\([ ]\.\(caps\|usb_ctrl\)[ ]*=[ ][^",]*,[\n]*\)*\([ ]\.download_firmware[ ]=[ ]lme2510_download_firmware,[\n]\)\?[ ]\.firmware[ ]*=[ ]' drivers/media/dvb/dvb-usb/lmedm04.c
+ blobname 'dvb-usb-lme2510c\?-\(lg\|s7395\)\.fw' drivers/media/dvb/dvb-usb/lmedm04.c
+ defsnc 'static[ ]u8[ ]s7395_inittab\[\][ ]=' drivers/media/dvb/dvb-usb/lmedm04.h
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]struct[ ]regdesc[ ]\(ofsm_init\|tuner_init_\(env77h11d5\|mt2060\(_2\)\?\|mxl500\(3d\|5\)\|qt1010\|mc44s803\|unknown\|tda18271\)\)\[\][ ]=\([ ][{][*][/][;]\)\?' drivers/media/dvb/frontends/af9013_priv.h
+ blobname 'lgs8g75\.fw' drivers/media/dvb/frontends/lgs8gxxx.c
+ defsnc 'static[ ]struct[ ]regdata[ ]mb86a20s_init\[\][ ]=' drivers/media/dvb/frontends/mb86a20s.c
+ accept '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]struct[ ]dvb_usb_device_properties[ ][*][/][;][\n][ ]\.firmware[ ]*=[ ]["][/][*][(]DEBLOBBED[)][*][/]["],[\n][ ]\.download_firmware[ ]=[ ]m920x_firmware_download' drivers/media/dvb/dvb-usb/m920x.c
+ defsnc 'static[ ]struct[ ]regdata[ ]s921_init\[\][ ]=' drivers/media/dvb/frontends/s921.c
+ blobname 'v4l-cx23885-enc\.fw' drivers/media/video/cx23885/cx23885-417.c
+ initc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]struct[ ]idxdata[ ]tbl_common\(_[a-e]\|5\|_\?3B\?\)\[\][ ]=\([ ][{][*][/][;]\)\?' 'drivers/media/video/gspca/gl860/gl860-\(mi2020\|mi1320\|ov9655\|ov2640\)\.c'
+ initc '[ ]\?static[ ]const[ ]struct[ ]ov_i2c_regvals[ ]norm_7660\[\][ ]=' drivers/media/video/gspca/ov519.c
+ defsnc '[ ]static[ ]const[ ]struct[ ]ov_regvals[ ]bridge_ov7660\[2\]\[10\][ ]=' drivers/media/video/gspca/ov519.c
+ defsnc '[ ]static[ ]const[ ]u8[ ]fr_tb\[2\]\[6\]\[3\][ ]=' drivers/media/video/gspca/ov519.c
+ defsnc '[ ]static[ ]const[ ]struct[ ]ov_i2c_regvals[ ]brit_7660\[\]\[7\][ ]=' drivers/media/video/gspca/ov519.c
+ defsnc '[ ]static[ ]const[ ]struct[ ]ov_i2c_regvals[ ]contrast_7660\[\]\[31\][ ]=' drivers/media/video/gspca/ov519.c
+ defsnc '[ ]static[ ]const[ ]struct[ ]ov_i2c_regvals[ ]colors_7660\[\]\[6\][ ]=' drivers/media/video/gspca/ov519.c
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]__u8[ ]pac207_sensor_init\[\]\[8\(\][ ]=[ ][{]\)\?\([*][/][;]\)\?' drivers/media/video/gspca/pac207.c
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]__u8[ ]pas202_sensor_init\[\]\[8\(\][ ]=[ ][{]\)\?\([*][/][;]\)\?' drivers/media/video/gspca/sonixb.c
+ defsnc 'static[ ]\(const[ ]\)\?\(__\)\?u8[ ]\(mt9v111\|sp80708\|hv7131[rd]\|mi0360b\?\|mo4000\|ov76\([36]0\|48\)\|om6802\)_sensor_\(init\|param1\)\[\]\[8\][ ]=' drivers/media/video/gspca/sonixj.c
+ defsnc 'static[ ]const[ ]struct[ ]ucbus_write_cmd[ ]\(icx098bq\|lz24bp\)_start_[012]\[\][ ]=' drivers/media/video/gspca/sq930x.c
+ defsnc '[}][ ]capconfig\[4\]\[2\][ ]=' drivers/media/video/gspca/sq930x.c
+ defsnc 'static[ ]const[ ]u16[ ]rca_initdata\[\]\[3\][ ]=' drivers/media/video/gspca/xirlink_cit.c
+ defsnc 'static[ ]const[ ]struct[ ]usb_action[ ]\(cs2102\|hdcs2020xx\|icm105a\(xx\)\?\|ov7630c\|mt9v111_[13]\|pb0330\([3x]x\)\?\|mi0360soc\)_Initial\(Scale\)\?\[\][ ]=' drivers/media/video/gspca/zc3xx.c
+ blobname 'NXP7164-2010-03-10\.1\.fw' drivers/media/video/saa7164/saa7164-fw.c
+ defsnc 'const[ ]unsigned[ ]char[ ]map_table\[\][ ]=' drivers/input/lirc/lirc_ttusbir.c
+ blobname 'haup-ir-blaster\.bin' drivers/input/lirc/lirc_zilog.c
+ # removed bits
+ defsnc 'static[ ]u8[ ]af9015_ir_table_\(leadtek\|twinhan\|a_link\|msi\|mygictv\|kworld\)\[\][ ]=' drivers/media/dvb/dvb-usb/af9015.h
+ defsnc 'static[ ]u8[ ]af9015_ir_table_\(avermedia\(_ks\)\?\|digittrade\|trekstor\)\[\][ ]=' drivers/media/dvb/dvb-usb/af9015.h
+ defsnc 'static[ ]struct[ ]keyboard_layout_map_t[ ]keyboard_layout_maps\[\][ ]=' drivers/media/dvb/siano/smsir.c
+ defsnc 'static[ ]\(u16\|struct[ ]i2c_reg_u16\)[ ]\(bridge\|mt9\(v\(11[12]\|011\)\|m001\)\)_init\[\]\(\[2\]\)\?[ ]=' drivers/media/video/gspca/sn9c20x.c
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]u8[ ]\(gc0307\|po2030n\)_sensor_\(init\|param1\)\[\]\[8\][ ]\(=[ ][{]\)\?\([*][/][;]\)\?' drivers/media/video/gspca/sonixj.c
+ initnc '\([;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]\)\?static[ ]const[ ]u8[ ]poxxxx_init\(_common\|Q\?VGA\|_end_1\)\[\]\[4\][ ]\(=[ ][{]\)\?\([*][/][;]\)\?' drivers/media/video/gspca/vc032x.c
+ # post 2.6.33 fixes start here
+ defsnc 'static[ ]struct[ ]i2c_reg_u8[ ]ov9655_init\[\][ ]=' drivers/media/video/gspca/sn9c20x.c
+ defsnc 'static[ ]const[ ]u8[ ]\(gc0307\|po2030n\)_sensor_\(init\|param1\)\[\]\[8\][ ]=' drivers/media/video/gspca/sonixj.c
+ # rebase-gspca-to-latest 2.6.33ish starts here
+ defsnc 'static[ ]const[ ]u8[ ]\(bridge\|sensor\)_init\(_2\)\?\[\]\[2\][ ]=' drivers/media/video/gspca/ov534_9.c
+ defsnc 'static[ ]const[ ]u8[ ]bridge_start_\([qs]\?v\|x\)ga\[\]\[2\][ ]=' drivers/media/video/gspca/ov534_9.c
+ defsnc 'static[ ]const[ ]__u8[ ]\(start\|page3\)_7302\[\][ ]=' drivers/media/video/gspca/pac7302.c
+ defsnc '[ ]struct[ ]init_command[ ]\(spy\|cif\|ms350\|genius\|vivitar\)_start_commands\[\][ ]=' drivers/media/video/gspca/sn9c2028.c
+ defsnc 'static[ ]const[ ]__u8[ ]initOv6650\[\][ ]=' drivers/media/video/gspca/sonixb.c
+ defsnc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]const[ ]__u8[ ]ov6650_sensor_init\[\]\[8\][ ]=[*][/][;]' drivers/media/video/gspca/sonixb.c
+ defsnc 'static[ ]const[ ]__u8[ ]pas202_sensor_init\[\]\[8\][ ]=' drivers/media/video/gspca/sonixb.c
+ defsnc 'static[ ]const[ ]u8[ ]\(adcm1700\|om6802\|po1030\)_sensor_\(init\|param1\)\[\]\[8\][ ]=' drivers/media/video/gspca/sonixj.c
+ defsnc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]const[ ]u8[ ]hv7131r_sensor_init\[\]\[8\][ ]=[ ][{][*][/][;]' drivers/media/video/gspca/sonixj.c
+ defsnc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]const[ ]u8[ ]po1030_sensor_param1\[\]\[8\][ ]=[ ][{][*][/][;]' drivers/media/video/gspca/sonixj.c
+ defsnc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]const[ ]u8[ ]\(mi1320\|po3130\)_initVGA_data\[\]\[4\][ ]=[ ][{][*][/][;]' drivers/media/video/gspca/sonixj.c
+ defsnc 'static[ ]const[ ]u8[ ]poxxxx_init\(_common\|Q\?VGA\|_end_1\)\[\]\[4\][ ]=' drivers/media/video/gspca/vc032x.c
+ defsnc '[ ]static[ ]const[ ]u8[ ]gamma_tb\[6\]\[16\][ ]=' drivers/media/video/gspca/zc3xx.c
+ # rebase-gspca-to-latest ends here
+ defsnc 'static[ ]u8[ ]af9015_ir_table_\(avermedia\(_ks\)\?\|digittrade\)\[\][ ]=' drivers/media/dvb/dvb-usb/af9015.h
+ defsnc 'struct[ ]au8522_register_config[ ]lpfilter_coef\[\][ ]=' drivers/media/dvb/frontends/au8522_decoder.c
+ defsnc 'static[ ]struct[ ]mse2snr_tab[ ]\(vsb\|qam\(64\|256\)\)_mse2snr_tab\[\][ ]=' drivers/media/dvb/frontends/au8522.c
+ defsnc '[}][ ]\(VSB\|QAM\)_mod_tab\[\][ ]=' drivers/media/dvb/frontends/au8522.c
+ initc 'static[ ]const[ ]u8[ ]jpeg_head\[\][ ]=' drivers/media/video/gspca/jpeg.h
+ defsnc 'static[ ]const[ ]u8[ ]\(bridge\|sensor\)_init_ov965x\(_2\)\?\[\]\[2\][ ]=' drivers/media/video/gspca/ov534.c
+ defsnc '[ ]static[ ]const[ ]u8[ ]probe_tb\[\]\[4\]\[8\][ ]=' drivers/media/video/gspca/sonixj.c
+ defsnc 'static[ ]const[ ]\(__u16\|u8\)[ ]spca505b\?_\(init\|open\)_data\(_ccd\)\?\[\]\[3\][ ]=' drivers/media/video/gspca/spca505.c
+ defsnc 'static[ ]const[ ]u8[ ]n4_lt168g\[\][ ]=' drivers/media/video/gspca/t613.c
+ defsnc '[ ]static[ ]const[ ]\(__\)\?u8[ ]\(read_indexs\|n\(set\)\?[0-9]*\(_other\)\?\|missing\)\[[0-9x]*\][ ]=' drivers/media/video/gspca/t613.c
+ defsnc 'static[ ]const[ ]u8[ ]eeprom_data\[\]\[3\][ ]=' drivers/media/gspca/tv8532.c
+ initnc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]const[ ]__u16[ ]spca508_vista_init_data\[\]\[3\][ ]=[ ][{][*][/][;]' drivers/media/video/gspca/spca508.c
+ defsc '[;][/][*]@@[ ]-[0-9]*,[0-9]*[ ][+][0-9]*,[0-9]*[ ]@@[ ]static[ ]const[ ]__u8[ ]mi1310_socinitVGA_JPG\[\]\[4\][ ]=[ ][{][*][/][;]' drivers/media/video/gspca/vc032x.c
+ initc 'static[ ]const[ ]\(__\)\?u8[ ]\(mi\(0360\|13[12]0\)\|po\(1200\|3130\)\|hv7131r\|ov76[67]0\)_\(\(soc\)\?_\?[iI]nit\(Q\?V\|SX\)GA\(_\(JPG\|data\)\)\?\|rundata\)\[\]\[4\][ ]=' drivers/media/video/gspca/vc032x.c
+ ;;
+ */linux-2.6-modsign-mpilib.patch)
+ initnc 'const[ ]unsigned[ ]char[ ]__clz_tab\[\][ ]='
+ ;;
+ */linux-2.6-netdev*.patch | \
+ */linux-2.6.27-net-r8169-2.6.28.patch)
+ defsnc '[ ][ ]*struct[ ]phy_reg[ ]phy_reg_init_[01]\[\][ ]=' drivers/net/r8169.c
+ ;;
+ */linux-2.6-wireless*.patch | */linux-2.6-ath5k.patch | \
+ */git-wireless-dev.patch | */linux-2.6-zd1211rw-mac80211.patch)
+ initnc 'const[ ]u\(8\|16\|32\)[ ]b43_ntab_\(\(adjustpower\|estimatepowerlt\|gainctl\|iqlt\|loftlt\|noisevar1\|tdi[24]0a\)[01]\|channelest\|frame\(lookup\|struct\)\|mcs\|pilot\|tdtrn\|tmap\)\[\][ ]='
+ initnc 'static[ ]const[ ]s8[ ]\(b43\(legacy\)\?\|bcm43xx\)_tssi2dbm_[bg]_table\[\][ ]='
+ initnc 'static[ ]struct[ ]iwl\(3945\)\?_tx_power[ ]power_gain_table\[2\]\[IWL_MAX_GAIN_ENTRIES\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]gain_entry[ ]gain_table\[2\]\[108\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_5222\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_5225_2527\[\][ ]=' drivers/net/wireless/rt2x00/rt73usb.c
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_5226\[\][ ]=' drivers/net/wireless/rt2x00/rt73usb.c
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_bg\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_bg_2522\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_bg_2523\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_bg_2524\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_bg_2525\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_bg_2525e\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_bg_2528\[\][ ]=' drivers/net/wireless/rt2x00/rt73usb.c
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_noseq\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]rf_channel[ ]rf_vals_seq\[\][ ]='
+ initnc '[ ]static[ ]const[ ]u8[ ]t\[\][ ]='
+ initnc 'static[ ]const[ ]u16[ ]rtl8225bcd_rxgain\[\][ ]='
+ initnc 'static[ ]const[ ]u8[ ]rtl8225_agc\[\][ ]='
+ initnc 'static[ ]const[ ]u8[ ]rtl8225_tx_power_cck\[\][ ]='
+ initnc 'static[ ]const[ ]u8[ ]rtl8225_tx_power_cck_ch14\[\][ ]='
+ initnc 'static[ ]const[ ]u16[ ]rtl8225z2_rxgain\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]ath5k_ini_rf[ ]rfregs_5111\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]ath5k_ini_rf[ ]rfregs_5112\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]ath5k_ini_rf[ ]rfregs_5112a\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]ath5k_ini_rf[ ]rfregs_5413\[\][ ]='
+ oprepline '#define[ ]AR5K_RATES_11A[ ]'
+ oprepline '#define[ ]AR5K_RATES_11B[ ]'
+ oprepline '#define[ ]AR5K_RATES_11G[ ]'
+ oprepline '#define[ ]AR5K_RATES_TURBO[ ]'
+ oprepline '#define[ ]AR5K_RATES_XR[ ]'
+ initnc 'static[ ]const[ ]struct[ ]ath5k_ini[ ]ar5212_ini\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]ath5k_ini_mode[ ]rf\(5413\|24\(13\|25\)\)_ini_mode_end\[\][ ]=' drivers/net/wireless/ath5k/initvals.c # ?
+ initnc '[ ][ ][}][ ]blinkrates\[\][ ]='
+
+ initnc 'static[ ]const[ ]u8[ ]rtl8225z2_agc\[\][ ]=' drivers/net/wireless/rtl8187_rtl8225.c
+ initnc 'static[ ]const[ ]u8[ ]rtl8225z2_ofdm\[\][ ]=' drivers/net/wireless/rtl8187_rtl8225.c
+ initnc 'static[ ]const[ ]u8[ ]rtl8225z2_tx_power_cck\[\][ ]=' drivers/net/wireless/rtl8187_rtl8225.c
+ initnc 'static[ ]const[ ]u8[ ]rtl8225z2_tx_power_cck_ch14\[\][ ]=' drivers/net/wireless/rtl8187_rtl8225.c
+
+ # git logs
+ accept '[ ][ ][ ]sudo[ ]modprobe[ ]ath5k[ ]debug=0x00000400[\n][ ]*[\n]\([ ]*Band[^\n]*[\n]\([ ]*\(\(channels\|rates\):\|[- 0-9a-f]*\|\[\.\.\.[ ]etc[ ]\]\)[\n]\)\+\)\+[ ][ ][ ][ ][ ][ ][ ]540[ ]000c[ ]0000[ ]0000'
+ oprepline '[ ][{][ ]1,[ ]MODULATION_XR,[ ]3000,[ ]1,[ ]150,[ ]3[ ][}],'
+
+ # Fedora 8ish kernel-xen builds
+ initnc 'const[ ]u16[ ]crc_itu_t_table\[256\][ ]='
+ initnc 'static[ ]const[ ]u16[ ]tkip_sbox\[256\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]ath5k_ini_mode[ ]ar5211_ini_mode\[\][ ]='
+ initnc 'static[ ]const[ ]struct[ ]ath5k_ini_mode[ ]ar5212_rf511[12]_ini_mode\[\][ ]='
+ initnc '[ ]static[ ]const[ ]u8[ ]log10\[\][ ]='
+ initnc 'static[ ]const[ ]u8[ ]rtl8225z2_tx_gain_cck_ofdm\[\][ ]='
+ initnc 'static[ ]const[ ]u32[ ]rf_vals_abg_5222\[\][ ]='
+ ;;
+
+ */linux-2.6-netdev-e1000e*.patch)
+ initnc 'static[ ]const[ ]u16[ ]e1000_igp_2_cable_length_table\[\][ ]=' drivers/net/e1000e/phy.c
+ ;;
+
+ */deblob-check-testsuite/*)
+ accept 'accept[(][^)]*[)]'
+ blobname 'blob[(][^)]*[)]'
+ blobname 'blobeol[^\n]*[\n]'
+ ;;
+ esac
+}
+
+# Regular expression that matches a literal constant.
+constx="[0-9][0-9a-fA-FxX]*"
+# Regular expression that matches a separator between consecutive
+# literal constants.
+sepx="\\([ \\n]*\\(\\([ \\n]\\|[,:{}LlUu\"\'\\\\][,:{} \\nLlUu\"\'\\\\]*\\)[xX\$]\\?\\|[.][a-zA-Z][a-zA-Z0-9]*[ ][ ]*[\$]\\?\\)\\)"
+
+# Regular expression that matches a continuation of a blob, after an
+# initial constant. *, \+ and \? can be safely appended to it without
+# \(\)s.
+blobcont="\\($sepx$constx\\)"
+
+# Regular expression that matches the initial constant of a blob plus
+# its continuation. *, \+ and \? can be safely appended to it without
+# \(\)s.
+blobpat="$constx$blobcont"
+
+# Regular expression that matches a blob with at least the number of
+# constants specified as sensitivity.
+blobseq="$blobpat\\{$sens,\\}"
+
+# Regular expression that matches the beginning of the pattern or a
+# line break. It must be \(\)ed, such that it can be named in
+# replacement patterns.
+bol="\\(^\\|[\\n]\\)"
+
+# Regular expression that matches the end of the pattern or a line
+# break. It must be \(\)ed, such that it can be named in replacement
+# patterns.
+eol="\\([\\n]\\|\$\\)"
+
+# Regular expression that matches a C-style comment.
+comment="\\([/][*][^*]*\\([*]\\+[^*/][^*]*\\)*[*]\\+[/]\\|[/][/][^\\n]*[\\n]\\)"
+
+# Regular expression that matches comments typically used in assembly.
+asmcomment="\\($comment\\|[;#][^\\n]*[\\n]\\)"
+
+# Regular expression that matches a braced initializer containing at
+# least one blob.
+initblob="[^\\n=]*=\\([ \\n\\\\]\\|$comment\\)*[{]\\([^;]\\|$comment\\)*$blobseq\\([^;]\\|$comment\\)*[}]\\?\\([ \\n\\\\]*\\|$comment\\)[;]\\?"
+
+# Regular expression that matches a C (possibly multi-line) #define
+# that contains a blob.
+defineblob='[ ]*#[ ]*define[ ][^\n]*\([\\][\n][^\n]*\)*'"$blobseq"'\([^\n]*\\[\n]\)*'
+
+# Regular expression that matches an assembly label followed by a blob
+# without any intervening label.
+asmblob="[a-zA-Z_.][^\\n:;#/ ]*:\\([^:{}]\\|$asmcomment\\)*$blobseq\\([^:]*\\|$asmcomment\\)*"
+
+# Set up the sed script that will go through the (processed) input,
+# looking for sequences of blobs and printing whatever was requested.
+# It accepts 3 arguments.
+
+# $1 is the action in case blobs were found in the input.
+
+# $2 is the action in case no blobs were found, not even false positives.
+
+# $3 is the action in case false positives were located.
+
+# $4 is the action for every complete input pattern.
+
+set_sed_main () {
+ falsepos=`${SED-sed} -n 's,^[+]\^*,,p' < "$regex_name" |
+ ${SED-sed} -n -e 's,[$]$,\\\\([\\\\n]\\\\|$\\\\),' \
+ -e '1h; 1!H; ${g;s,[\n],\\\\|,g;s,^\(..*\)$,\\\\(\1\\\\),;p;}'`
+ blobs=`${SED-sed} -n 's,^[-],,p' < "$regex_name" |
+ ${SED-sed} -n -e 's,[$]$,\\\\([\\\\n]\\\\|$\\\\),' \
+ -e '1h; 1!H; ${g;s,[\n],\\\\|,g;s,^\(..*\)$,\\\\(\1\\\\),;p;}'`
+
+ # Regular expression that matches one or more blobs without
+ # intervening line breaks.
+ sblobctx="\\(\\([^\\n]\\|[/][*](DEBLOB-\\nBED)[*][/]\\)*$blobs\\)\\+"
+
+ # Regular expression that matches the context for a long blob match.
+ lblobctx="\\($initblob\\|$defineblob\\|$asmblob\\|$sblobctx\\)"
+
+ if test "X$falsepos" != X; then
+ check_false_positives="$v:???falsepos
+/$bol$falsepos/!b blob
+$v:+++falsepos
+h
+s/$bol$falsepos/\\1;\/**\/;/g
+# See if, after removing all matches, we end up without any blobs.
+$v:???blobs
+/$blobs/!{
+ g
+ b falsepos
+}
+g
+"
+ else
+ falsepos="$.^"
+ check_false_positives=
+ fi
+
+ $echo "#! /bin/sed -nf
+
+/^$/N
+/^[\\n]\\?;[/][*]\\(end .*\\)\\?[*][/];$/{
+ $4
+ d
+}
+# /^;[/][*]begin /!{
+# : internal_error
+# $v:internal_error
+# s,.*,Internal error at\\n&[\\n]/*(DEBLOB-\\nERROR)*/,;
+# q 2
+# }
+$v:reading file in
+h
+n
+: read_more
+/^;[/][*]end [^\\n]*[*][/];$/! {
+ H
+ n
+ b read_more
+}
+H
+g
+$4
+$v:read all
+s/^\\(;[/][*]begin [^\\n]*[\\n]\\)*//
+s/\\($bol[\n]\?;[/][*]\\(end [^\\n]*\\)\\?[*][/];\\)*$//
+$v:???!blobs
+/$blobs/!b clean
+$check_false_positives
+# Fall through.
+: blob
+$v:blob
+$1
+d
+: clean
+$v:clean
+$2
+d
+: falsepos
+$v:falsepos
+$3
+d
+
+: print_matches
+$v:print_matches
+/^$falsepos/! {
+ $v:delete unmatching lines
+ h
+ s/[\\n]$falsepos.*//
+ : print_matches_nomatch_loop
+ /[\\n]/ {
+ s/^[^\\n]*[\\n]//
+ x
+ s/^[^\\n]*[\\n]//
+ x
+ b print_matches_nomatch_loop
+ }
+ x
+ b print_matches_delete_to_eol
+}
+h
+s/^\\($falsepos[^\\n]*\\)\\([\\n].*\\)\\?$/\\1/
+$v:narrowed to match
+/$blobs/ {
+ i\\
+::: $file :::
+ p
+}
+g
+s/^\\($falsepos[^\\n]*\\)//
+: print_matches_delete_to_eol
+$v:delete to eol
+s/^[^\\n]*//
+/^$/d
+s/^[\\n]//
+b print_matches
+
+: print_marked_matches
+$v:print_marked_matches
+/^$falsepos/! {
+ h
+ s/[\\n]$falsepos.*//
+ : print_marked_matches_nomatch_loop
+ /[\\n]/ {
+ s/^[^\\n]*[\\n]//
+ x
+ s/^[^\\n]*[\\n]//
+ x
+ b print_marked_matches_nomatch_loop
+ }
+ x
+ b print_marked_matches_delete_to_eol
+}
+h
+s/^\\($falsepos[^\\n]*\\)\\([\\n].*\\)\\?$/\\1/
+$v:narrowed to match
+/$blobs/{
+ i\\
+::: $file :::
+ # s/{\\($sepx\\)\\?$blobseq\\($sepx\\)\\?}[ ]*;/{\/*(DEBLOBBED)*\/};/g
+ s/$blobs/\/*(DEBLOBBED)*\//g
+ p
+}
+g
+s/^\\($falsepos[^\\n]*\\)//
+: print_marked_matches_delete_to_eol
+$v:delete to eol
+s/^[^\\n]*//
+/^$/d
+s/^[\\n]//
+b print_marked_matches
+
+: print_blobs
+$v:print_blobs
+/^$falsepos/ {
+ $v:delete false positive
+ # This is tricky. We don't want to print the false positive.
+ /^$falsepos[^\\n]*$blobs/ {
+ $v:delete false positive immediately followed by blob
+ s/^\\($falsepos\\)/\\1\/*(DEBLOB-\\nBED)*\//
+ h
+ s/^\\($falsepos\\).*/\\1/
+ $v:matched false positive
+ : print_blobs_match_loop
+ /[\\n]/ {
+ s/^[^\\n]*[\\n]//
+ x
+ s/^[^\\n]*[\\n]//
+ x
+ b print_blobs_match_loop
+ }
+ G
+ b print_blobs_delete_to_eol
+ }
+ /^$falsepos[/][*](DEBLOB-\\nBED)[*][/]/! {
+ s/^$falsepos//
+ b print_blobs_delete_to_eol
+ }
+}
+/^\([^\\n]\|[/][*](DEBLOB-\\nBED)[*][/]\)*$blobs/! {
+ $v:delete non-blob header
+ h
+ s/[\\n]\\($falsepos\\|[^\\n]*$blobs\\).*//
+ $v:matched non-blob header
+ : print_blobs_nomatch_loop
+ /[\\n]/ {
+ s/^[^\\n]*[\\n]//
+ x
+ s/^[^\\n]*[\\n]//
+ x
+ b print_blobs_nomatch_loop
+ }
+ x
+ b print_blobs_delete_to_eol
+}
+i\\
+::: $file :::
+: print_blobs_output_false_positive
+/[^\\n]*[/][*](DEBLOB-[\\n]BED)[*][/]/ {
+ P
+ s,^[^\\n]*[\\n],,
+ b print_blobs_output_false_positive
+}
+h
+s/\\($blobs\\([^\\n]*$blobs\\)*[^\\n]*\\)\\([\\n].*\\)\\?$/\\1/
+$v:narrowed to blob
+p
+g
+s/\\(\\($blobs[^\\n]*\\)\\+\\)//
+: print_blobs_delete_to_eol
+$v:delete to eol
+s/^[^\\n]*//
+/^$/d
+s/^[\\n]//
+b print_blobs
+
+: print_marked_blobs
+$v:print_marked_blobs
+/^$falsepos/ {
+ $v:delete false positive
+ # This is tricky. We don't want to print the false positive.
+ /^$falsepos[^\\n]*$blobs/ {
+ $v:delete false positive immediately followed by blob
+ s/^\\($falsepos\\)/\\1\/*(DEBLOB-\\nBED)*\//
+ h
+ s/^\\($falsepos\\).*/\\1/
+ $v:matched false positive
+ : print_marked_blobs_match_loop
+ /[\\n]/ {
+ s/^[^\\n]*[\\n]//
+ x
+ s/^[^\\n]*[\\n]//
+ x
+ b print_marked_blobs_match_loop
+ }
+ G
+ b print_marked_blobs_delete_to_eol
+ }
+ /^$falsepos[/][*](DEBLOB-\\nBED)[*][/]/! {
+ s/^falsepos//
+ b print_marked_blobs_delete_to_eol
+ }
+}
+/^\([^\\n]\|[/][*](DEBLOB-\\nBED)[*][/]\)*$blobs/! {
+ $v:delete non-blob header
+ h
+ s/[\\n]\\($falsepos\\|[^\\n]*$blobs\\).*//
+ $v:matched non-blob header
+ : print_marked_blobs_nomatch_loop
+ /[\\n]/ {
+ s/^[^\\n]*[\\n]//
+ x
+ s/^[^\\n]*[\\n]//
+ x
+ b print_marked_blobs_nomatch_loop
+ }
+ x
+ b print_marked_blobs_delete_to_eol
+}
+i\\
+::: $file :::
+: print_marked_blobs_output_false_positive
+/[^\\n]*[/][*](DEBLOB-[\\n]BED)[*][/]/ {
+ P
+ s,^[^\\n]*[\\n],,
+ b print_marked_blobs_output_false_positive
+}
+h
+s/\\($blobs\\([^\\n]*$blobs\\)*[^\\n]*\\)\\([\\n].*\\)\\?$/\\1/
+$v:narrowed to blob
+# s/{\\($sepx\\)\\?$blobseq\\($sepx\\)\\?}[ ]*;/{\/*(DEBLOBBED)*\/};/g
+s/$blobs/\/*(DEBLOBBED)*\//g
+p
+g
+s/\\(\\($blobs[^\\n]*\\)\\+\\)//
+: print_marked_blobs_delete_to_eol
+$v:delete to eol
+s/^[^\\n]*//
+/^$/d
+s/^[\\n]//
+b print_marked_blobs
+
+: print_cblobs
+$v:print_cblobs
+/^$falsepos/ {
+ $v:delete false positive
+ # This is tricky. We don't want to print the false positive.
+ /^$falsepos[^\\n]*$blobs/ {
+ $v:delete false positive immediately followed by blob
+ s/^\\($falsepos\\)/\\1\/*(DEBLOB-\\nBED)*\//
+ h
+ s/^\\($falsepos\\).*/\\1/
+ $v:matched false positive
+ : print_cblobs_match_loop
+ /[\\n]/ {
+ s/^[^\\n]*[\\n]//
+ x
+ s/^[^\\n]*[\\n]//
+ x
+ b print_cblobs_match_loop
+ }
+ G
+ b print_cblobs_delete_to_eol
+ }
+ /^$falsepos[/][*](DEBLOB-\\nBED)[*][/]/! {
+ s/^$falsepos//
+ b print_cblobs_delete_to_eol
+ }
+}
+/^$lblobctx/! {
+ $v:delete non-blob header
+ h
+ s/[\\n]\\($falsepos\\|$lblobctx\\).*//
+ $v:matched non-blob header
+ : print_cblobs_nomatch_loop
+ /[\\n]/ {
+ s/^[^\\n]*[\\n]//
+ x
+ s/^[^\\n]*[\\n]//
+ x
+ b print_cblobs_nomatch_loop
+ }
+ x
+ b print_cblobs_delete_to_eol
+}
+i\\
+::: $file :::
+: print_cblobs_output_false_positive
+/[^\\n]*[/][*](DEBLOB-[\\n]BED)[*][/]/ {
+ P
+ s,^[^\\n]*[\\n],,
+ b print_cblobs_output_false_positive
+}
+h
+s/^\\($lblobctx\\([^\\n]*$blobs\\)*[^\\n]*\\)\\([\\n].*\\)\\?$/\\1/
+$v:narrowed to blob
+p
+g
+s/^\\($lblobctx[^\\n]*\\($blobs[^\\n]*\\)*\\)//
+: print_cblobs_delete_to_eol
+$v:delete to eol
+s/^[^\\n]*//
+/^$/d
+s/^[\\n]//
+b print_cblobs
+
+: print_marked_cblobs
+$v:print_marked_cblobs
+/^$falsepos/ {
+ $v:delete false positive
+ # This is tricky. We don't want to print the false positive.
+ /^$falsepos[^\\n]*$blobs/ {
+ $v:delete false positive immediately followed by blob
+ s/^\\($falsepos\\)/\\1\/*(DEBLOB-\\nBED)*\//
+ h
+ s/^\\($falsepos\\).*/\\1/
+ $v:matched false positive
+ : print_marked_cblobs_match_loop
+ /[\\n]/ {
+ s/^[^\\n]*[\\n]//
+ x
+ s/^[^\\n]*[\\n]//
+ x
+ b print_marked_cblobs_match_loop
+ }
+ G
+ b print_marked_cblobs_delete_to_eol
+ }
+ /^$falsepos[/][*](DEBLOB-\\nBED)[*][/]/! {
+ s/^$falsepos//
+ b print_marked_cblobs_delete_to_eol
+ }
+}
+/^$lblobctx/! {
+ $v:delete non-blob header
+ h
+ s/[\\n]\\($falsepos\\|$lblobctx\\).*//
+ $v:matched non-blob header
+ : print_marked_cblobs_nomatch_loop
+ /[\\n]/ {
+ s/^[^\\n]*[\\n]//
+ x
+ s/^[^\\n]*[\\n]//
+ x
+ b print_marked_cblobs_nomatch_loop
+ }
+ x
+ b print_marked_cblobs_delete_to_eol
+}
+i\\
+::: $file :::
+: print_marked_cblobs_output_false_positive
+/[^\\n]*[/][*](DEBLOB-[\\n]BED)[*][/]/ {
+ P
+ s,^[^\\n]*[\\n],,
+ b print_marked_cblobs_output_false_positive
+}
+h
+s/^\\($lblobctx\\([^\\n]*$blobs\\)*[^\\n]*\\)\\([\\n].*\\)\\?$/\\1/
+$v:narrowed to blob
+# s/{\\($sepx\\)\\?$blobseq\\($sepx\\)\\?}[ ]*;/{\/*(DEBLOBBED)*\/};/g
+s/$blobs/\/*(DEBLOBBED)*\//g
+p
+g
+s/^\\($lblobctx[^\\n]*\\($blobs[^\\n]*\\)*\\)//
+: print_marked_cblobs_delete_to_eol
+$v:delete to eol
+s/^[^\\n]*//
+/^$/d
+s/^[\\n]//
+b print_marked_cblobs
+
+: print_both
+$v:print_both
+/^\\($falsepos\\|[^\\n]*$blobs\\)/! {
+ $v:delete non-blob header
+ h
+ s/[\\n]\\($falsepos\\|[^\\n]*$blobs\\).*//
+ $v:matched non-blob header
+ : print_both_nomatch_loop
+ /[\\n]/ {
+ s/^[^\\n]*[\\n]//
+ x
+ s/^[^\\n]*[\\n]//
+ x
+ b print_both_nomatch_loop
+ }
+ x
+ b print_both_delete_to_eol
+}
+h
+i\\
+::: $file :::
+s/^\\(\\($falsepos\\|[^\\n]*$blobs\\)\\([^\\n]*$blobs\\)*[^\\n]*\\)\\([\\n].*\\)\\?$/\\1/
+$v:narrowed to blob
+p
+g
+s/^\\(\\($falsepos[^\\n]*\\|[^\\n]*$blobs[^\\n]*\\)\\($blobs[^\\n]*\\)*\\)//
+: print_both_delete_to_eol
+$v:delete to eol
+s/^[^\\n]*//
+/^$/d
+s/^[\\n]//
+b print_both
+
+: list_matches
+$v:list_matches
+/^$falsepos/! {
+ $v:print unmatching lines
+ h
+ s/[\\n]$falsepos.*//
+ p
+ : list_matches_nomatch_loop
+ /[\\n]/ {
+ s/^[^\\n]*[\\n]//
+ x
+ s/^[^\\n]*[\\n]//
+ x
+ b list_matches_nomatch_loop
+ }
+ x
+ b list_matches_delete_to_eol
+}
+h
+s/^\\($falsepos[^\\n]*\\)\\([\\n].*\\)\\?$/\\1/
+$v:narrowed to match
+/$blobs/{
+ # s/{\\($sepx\\)\\?$blobseq\\($sepx\\)\\?}[ ]*;/{\/*(DEBLOBBED)*\/};/g
+ s/$blobs/\/*(DEBLOBBED)*\//g
+}
+p
+g
+s/^\\($falsepos[^\\n]*\\)//
+: list_matches_delete_to_eol
+$v:delete to eol
+s/^[^\\n]*//
+/^$/d
+s/^[\\n]//
+b list_matches
+
+: list_blobs
+$v:list_blobs
+/^$falsepos/ {
+ $v:print false positive
+ # This is tricky. We don't want to deblob the false positive.
+ /^$falsepos[^\\n]*$blobs/ {
+ $v:print false positive immediately followed by blob
+ s/^\\($falsepos\\)/\\1\/*(DEBLOB-\\nBED)*\//
+ h
+ s/^\\($falsepos\\).*/\\1\\n/
+ : list_blobs_match_loop
+ /[\\n]/ {
+ s/^[^\\n]*[\\n]//
+ x
+ P
+ s/^[^\\n]*[\\n]//
+ x
+ b list_blobs_match_loop
+ }
+ G
+ b list_blobs_delete_to_eol
+ }
+ h
+ s/^\\($falsepos[^\\n]*\\)[\\n].*/\\1/
+ p
+ g
+ s/^\\($falsepos[^\\n]*\\)//
+ b list_blobs_delete_to_eol
+}
+/^[^\\n]*$blobs/! {
+ $v:print non-blob header
+ h
+ s/[\\n]\\($falsepos\\|[^\\n]*$blobs\\).*//
+ p
+ : list_blobs_nomatch_loop
+ /[\\n]/ {
+ s/^[^\\n]*[\\n]//
+ x
+ s/^[^\\n]*[\\n]//
+ x
+ b list_blobs_nomatch_loop
+ }
+ x
+ b list_blobs_delete_to_eol
+}
+h
+s/\\($blobs\\([^\\n]*$blobs\\)*[^\\n]*\\)\\([\\n].*\\)\\?$/\\1/
+$v:narrowed to blob
+# s/{\\($sepx\\)\\?$blobseq\\($sepx\\)\\?}[ ]*;/{\/*(DEBLOBBED)*\/};/g
+s/$blobs/\/*(DEBLOBBED)*\//g
+p
+g
+s/\\(\\($blobs[^\\n]*\\)\\+\\)//
+: list_blobs_delete_to_eol
+$v:delete to eol
+s/^[^\\n]*//
+/^$/d
+s/^[\\n]//
+b list_blobs
+
+: list_both
+$v:list_both
+/^\\($falsepos\\|[^\\n]*$blobs\\)/! {
+ $v:print non-blob header
+ h
+ s/[\\n]\\($falsepos\\|[^\\n]*$blobs\\).*//
+ p
+ : list_both_nomatch_loop
+ /[\\n]/ {
+ s/^[^\\n]*[\\n]//
+ x
+ s/^[^\\n]*[\\n]//
+ x
+ b list_both_nomatch_loop
+ }
+ x
+ b list_both_delete_to_eol
+}
+h
+s/^\\(\\($falsepos\\|[^\\n]*$blobs\\)\\([^\\n]*$blobs\\)*[^\\n]*\\)\\([\\n].*\\)\\?$/\\1/
+$v:narrowed to blob
+# s/{\\($sepx\\)\\?$blobseq\\($sepx\\)\\?}[ ]*;/{\/*(DEBLOBBED)*\/};/g
+s/$blobs/\/*(DEBLOBBED)*\//g
+p
+g
+s/^\\(\\($falsepos[^\\n]*\\|[^\\n]*$blobs[^\\n]*\\)\\($blobs[^\\n]*\\)*\\)//
+: list_both_delete_to_eol
+$v:delete to eol
+s/^[^\\n]*//
+/^$/d
+s/^[\\n]//
+b list_both
+
+" > "$scriptname"
+
+ scriptcmd='${SED-sed} -n -f "$scriptname"'
+
+ case $vp in
+ [01]) xv= ;;
+ 2) xv='# ';;
+ esac
+
+ sedunbreak='
+: restart
+/[/][*](DEBLOB-$/ {
+ N
+ /[/][*](DEBLOB-[\n]ERROR)[*][/]/{q 1;}'"
+$xv"'s,[/][*](DEBLOB-[\n]BED)[*][/],,
+ b restart
+}
+p
+'
+ scriptcmd2='${SED-sed} -n -e "$sedunbreak"'
+}
+
+set_flex_main () {
+ adjust_rx='
+s,\\\([{(|)}?+]\),\1,g
+s,^\([-+]\)\(\^\?\)\(.*\)\(\$\?\)$,\2(?s:\3)\4\1,g
+s,[+]$, { falsepos (); },
+s,[-]$, { blob (); },
+'
+
+ echo '%%' > "$scriptname"
+ ${SED-sed} "$adjust_rx" < "$regex_name" >> "$scriptname"
+ echo '\n|. { unmatched (); }
+%%
+int falsepos () {}
+int blob () {}
+int unmatched () {}
+' >> "$scriptname"
+
+ scriptcmd=false
+}
+
+set_python_main () {
+ adjust_rx='
+s,\\(,\\(?:,g;
+s,\\\([{(|)}?+]\),\1,g;
+'
+
+ cat >> "$scriptname" <<EOF
+#! /usr/bin/python
+
+import sys
+import re
+
+# Should we replace blobs and false positives with replacement?
+replace_blob = 0
+replace_falsepos = 0
+replacement = '/*(DEBLOBBED)*/'
+
+# Should we print lines containing blobs, false positives, and neither?
+print_blob = 0
+with_context = 0
+print_falsepos = 0
+print_nomatch = 0
+
+# Should we print the input stack if we find blobs or false positives?
+list_blob = 0
+list_falsepos = 0
+
+# Should we forget everything we know about false positives?
+falsepos = None
+no_falsepos = 0
+
+verbose = $vp
+
+# Which of the defaults above should we override?
+$@ = 1
+
+EOF
+
+ if test "X$DEBLOB_CHECK_PYTHON_REGEX" = Xdebug; then
+ ${SED-sed} -e 's,^[+-],,' -e "$adjust_rx" \
+ -e "s,.*,re.compile (r'&'),g" \
+ < "$regex_name" >> "$scriptname"
+ fi
+
+ ${SED-sed} -n 's,^[+],,p' < "$regex_name" |
+ ${SED-sed} -n -e "$adjust_rx" -e 's,\^,,' \
+ -e '1h; 1!H; $ { g; s,[\n],|,g; '"\
+s,^\\(.*\\)\$,falsepos = r'(?P<falsepos>\\1)',;\
+"' p;}' >> "$scriptname"
+
+ ${SED-sed} -n 's,^[-],,p' < "$regex_name" |
+ ${SED-sed} -n -e "$adjust_rx" \
+ -e '1h; 1!H; $ { g; s,[\n],|,g; '"\
+s,^\\(.*\\)\$,blob = r'(?P<blob>\\1)',;\
+"' p;}' >> "$scriptname"
+
+ echo "\\($initblob\\|$defineblob\\|$asmblob\\)" |
+ ${SED-sed} -e "$adjust_rx" \
+ -e "s,^\\(.*\\)\$,cblob = r'(?P<cblob>\\1)'," >> "$scriptname"
+
+ cat >> "$scriptname" <<\EOF
+
+if no_falsepos or falsepos is None:
+ falsepos = r'(?!)'
+
+rx = '^%s|%s' % (falsepos, blob)
+
+if with_context:
+ rx += '|^' + cblob
+
+rxc = re.compile('(?<=.)(?:%s)' % rx, re.M | re.S)
+
+filenames = None
+
+s = '\n'
+
+for line in sys.stdin:
+ # Read into s all lines between begin and end. An empty line, without
+ # even the '\n', flags the end of the input.
+ if line[:3] == ';/*' and line[-4:] == '*/;\n':
+ if line[3:9] == 'begin ':
+ nextfilenames = (line[9:-4], filenames)
+ if s == '\n':
+ filenames = nextfilenames
+ del nextfilenames
+ continue
+ elif line[3:7] == 'end ':
+ #if print_blob and not print_nomatch:
+ # from time import time
+ # sys.stderr.write('%i %i %s\n' % (time(), len(s), filenames[0]))
+ assert line[7:-4] == filenames[0]
+ nextfilenames = filenames[1]
+ else:
+ assert filenames != None
+ s += line
+ continue
+ else:
+ assert filenames != None
+ s += line
+ continue
+
+ if verbose:
+ print 'looking for matches'
+ sfilenames = filenames
+ while filenames != None:
+ if filenames[1] is None:
+ print filenames[0]
+ else:
+ print filenames[0] + ' within'
+ filenames = filenames[1]
+ filenames = sfilenames
+
+ if s[-1] == '\n':
+ s = s[:-1]
+
+ pp = 1
+ p = pend = 0
+ match = rxc.search (s, p)
+ while match != None:
+ firstmatch = match
+ blobs = falses = 0
+ while 1:
+ if verbose:
+ print 'found match'
+ what = match.lastgroup
+
+ if what == 'cblob':
+ if verbose: print 'match is a blob context'
+ pend = s.find ('\n', match.end()) + 1
+ if pend == 0:
+ pend = len(s)
+ p = match.start() + 1
+ blob_p = 2
+ else:
+ blob_p = what == 'blob'
+ assert blob_p or what == 'falsepos'
+
+ if blob_p:
+ if verbose: print 'match is a blob'
+ blobs += 1
+ else:
+ if verbose: print 'match is a false positive'
+ falses += 1
+
+ if blob_p and replace_blob or not blob_p and replace_falsepos:
+ s = s[:match.start(what)] + replacement + s[match.end(what):]
+ p = match.start(what) + len(replacement)
+ if pend > match.start(what):
+ pend += p - match.end(what)
+ else:
+ p = match.end(what)
+
+ if p > pend:
+ pend = s.find ('\n', p) + 1
+ if (pend == 0):
+ pend = len(s)
+
+ match = rxc.search (s, p)
+ if match is None or match.start () >= pend or \
+ (blob_p and not print_blob and not falses) or \
+ (not blob_p and not print_falsepos and not blobs):
+ break
+
+ if print_nomatch:
+ sys.stdout.write (s[pp:firstmatch.start() + 1])
+ pp = firstmatch.start() + 1
+ else:
+ pp = s.rfind ('\n', 0, firstmatch.start () + 1) + 1
+
+ if print_blob and blobs or print_falsepos and falses:
+ if not print_nomatch:
+ sfilenames = filenames
+ while filenames != None:
+ print '::: ' + filenames[0] + ' :::'
+ filenames = filenames[1]
+ filenames = sfilenames
+ sys.stdout.write (s[pp:pend])
+ pp = pend
+
+ if list_blob and blobs or list_falsepos and falses:
+ while filenames != None:
+ if filenames[1] is None:
+ print filenames[0]
+ else:
+ print filenames[0] + ' within'
+ filenames = filenames[1]
+ exit (1)
+
+ if print_nomatch:
+ sys.stdout.write(s[pp:])
+
+ if verbose:
+ print 'no further matches'
+
+ s = '\n'
+ filenames = nextfilenames
+ del nextfilenames
+
+assert filenames is None
+
+exit (0)
+EOF
+
+ scriptcmd="${PYTHON-python} "'"$scriptname"'
+}
+
+set_perl_main () {
+ adjust_rx='
+s,\\(,\\(?:,g;
+s,\\\([{(|)}?+]\),\1,g;
+'
+
+ # Add $ before arguments
+ set `echo "$@" | sed 's,\(^\|= *\),&$,g'`
+
+ cat >> "$scriptname" <<\EOF
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+# Should we replace blobs and false positives with replacement?
+my $replace_blob = 0;
+my $replace_falsepos = 0;
+my $replacement = '/*(DEBLOBBED)*/';
+
+# Should we print lines containing blobs, false positives, and neither?
+my $print_blob = 0;
+my $with_context = 0;
+my $print_falsepos = 0;
+my $print_nomatch = 0;
+
+# Should we print the input stack and exit if we find blobs or false positives?
+my $list_blob = 0;
+my $list_falsepos = 0;
+
+# Should we forget everything we know about false positives?
+my $falsepos;
+my $no_falsepos = 0;
+
+EOF
+
+ cat >> "$scriptname" <<EOF
+my \$verbose = $vp;
+
+# Which of the defaults above should we override?
+$@ = 1;
+
+EOF
+
+ ${SED-sed} -n 's,^[+],,p' < "$regex_name" |
+ ${SED-sed} -n -e "$adjust_rx" -e 's,\^,,' \
+ -e '1h; 1!H; $ { g; s,[\n],|,g; '"\
+s,^\\(.*\\)\$,\$falsepos = qr'(?<falsepos>\\1)'ms;,;\
+"' p;}' >> "$scriptname"
+
+ ${SED-sed} -n 's,^[-],,p' < "$regex_name" |
+ ${SED-sed} -n -e "$adjust_rx" \
+ -e '1h; 1!H; $ { g; s,[\n],|,g; '"\
+s,^\\(.*\\)\$,my \$blob = qr'(?<blob>\\1)'ms;,;\
+"' p;}' >> "$scriptname"
+
+ echo "\\($initblob\\|$defineblob\\|$asmblob\\)" |
+ ${SED-sed} -e "$adjust_rx" \
+ -e "s,^\\(.*\\)\$,my \$cblob = qr'(?<cblob>\\1)'ms if \$with_context;," >> "$scriptname"
+
+ cat >> "$scriptname" <<\EOF
+
+$falsepos = qr/(?<falsepos>(?!))/ if $no_falsepos || ! defined $falsepos;
+
+my $rx = qr/^$falsepos|$blob/ms;
+
+$rx = qr/$rx|^$cblob/ms if $with_context;
+
+my @filenames;
+my $nfilenames = 0;
+my $nextnfilenames;
+
+my $s = '';
+
+while (<STDIN>) {
+ # Read into s all lines between begin and end. An empty line, without
+ # even the '\n', flags the end of the input.
+ if (m:^[;][/][*](begin|end) (.*)[*][/][;]$:) {
+ if ($1 eq 'begin') {
+ print "entering $2\n" if $verbose;
+ $filenames[$nfilenames] = $2;
+ $nextnfilenames = $nfilenames + 1;
+ if ($s eq '') {
+ $nfilenames = $nextnfilenames;
+ next;
+ }
+ } else {
+ $nextnfilenames = $nfilenames - 1;
+ print "processing $filenames[$nextnfilenames]\n" if $verbose;
+ }
+ } else {
+ $s .= $_;
+ next;
+ }
+
+ if ($verbose) {
+ print "looking for matches in\n";
+ for (my $i = $nfilenames; --$i > 0; ) {
+ print $filenames[$i], " within\n";
+ }
+ print $filenames[0], "\n";
+ }
+
+ $s =~ s/[\n]$//;
+
+ my $pp = my $p = 0;
+
+ my $matchfound = substr ($s, $p) =~ /$rx/o;
+ while ($matchfound) {
+ print "found first match\n" if $verbose;
+ my $firstmatchstart = $-[0] + $p;
+ my $blobs = my $falses = 0;
+ my $matchstart = $-[0] + $p;
+ my $pend = -1;
+ my $blob_p;
+ do {{
+ my $matchend = $+[0] + $p;
+ print "found match $matchstart..$matchend\n" if $verbose;
+ print "$&" if $verbose > 1;
+
+ if (defined $+{'cblob'}) {
+ print "match is a blob context\n" if ($verbose);
+ $pend = index ($s, "\n", $matchend) + 1;
+ $pend = length $s if !$pend;
+ }
+
+ if (defined $+{'falsepos'}) {
+ print "match is a false positive\n" if ($verbose);
+ # $matchend -= $+[0] - $+[1];
+ $blob_p = 0;
+ $falses++;
+ } elsif (defined $+{'blob'}) {
+ $blob_p = 1;
+ $blobs++;
+ print "match is a blob at $matchstart\n" if ($verbose);
+ } else {
+ $blob_p = 2;
+ $p = $matchstart;
+ print "searching up to $pend\n" if $verbose;
+ next;
+ }
+
+ if ($blob_p ? $replace_blob : $replace_falsepos) {
+ substr ($s, $matchstart, $matchend - $matchstart,
+ $replacement);
+ $p = $matchstart + length $replacement;
+ $pend += $p - $matchend if $pend >= $matchstart;
+ } else {
+ $p = $matchend;
+ }
+
+ $pend = index ($s, "\n", $p) + 1 if $p >= $pend;
+ $pend = length $s if !$pend;
+ print "searching up to $pend\n" if $verbose;
+ $p--;
+ }} while (($matchfound = (substr ($s, $p) =~ /(?<=.)$rx/mso))
+ && ($matchstart = $-[0] + $p) < $pend
+ && !($blob_p
+ ? (!$print_blob && !$falses)
+ : (!$print_falsepos && !$blobs)));
+
+ print "last match before $pend\n" if $verbose;
+
+ if ($print_nomatch) {
+ print substr ($s, $pp, $firstmatchstart - $pp);
+ $pp = $firstmatchstart;
+ } elsif (($print_blob || $print_falsepos) && $firstmatchstart > 0) {
+ $pp = rindex ($s, "\n", $firstmatchstart - 1) + 1;
+ }
+
+ if (($print_blob && $blobs) || ($print_falsepos && $falses)) {
+ if (!$print_nomatch) {
+ for (my $i = $nfilenames; $i-- > 0;) {
+ print "::: ", $filenames[$i], " :::\n";
+ }
+ }
+
+ print substr ($s, $pp, $pend - $pp);
+ $pp = $pend;
+ }
+
+ if (($list_blob && $blobs) || ($list_falsepos && $falses)) {
+ for (my $i = $nfilenames; --$i > 0;) {
+ print $filenames[$i], " within ";
+ }
+ print $filenames[0], "\n";
+ exit (1);
+ }
+ }
+
+ print substr ($s, $pp) if $print_nomatch;
+
+ print "no further matches\n" if $verbose;
+
+ $s = '';
+ $nfilenames = $nextnfilenames;
+}
+
+exit (0);
+EOF
+
+ scriptcmd="${PERL-perl} "'"$scriptname"'
+}
+
+set_awk_main () {
+ adjust_rx='
+s,[$]$,([\\n]|$),;
+s,\[^\],[^\\],g;
+s,\\\([{(|)}?+]\),\1,g;
+'
+
+ case " = $@ = " in
+ *" = no_falsepos = "*) falsepos='$.^';;
+ *) falsepos=`
+ ${SED-sed} -n 's,^[+],,p' < "$regex_name" |
+ ${SED-sed} -n -e "$adjust_rx" -e 's,\^,,' \
+ -e '1h; 1!H; $ { g; s,[\n],|,g; p;}'
+ `
+ case $falsepos in "") falsepos='$.^';; esac;;
+ esac
+
+ blob=`
+ ${SED-sed} -n 's,^[-],,p' < "$regex_name" |
+ ${SED-sed} -n -e "$adjust_rx" \
+ -e '1h; 1!H; $ { g; s,[\n],|,g; p;}'`
+
+ case " = $@ = " in
+ *" = with_context = "*) cblob=`
+ $echo "\\($initblob\\|$defineblob\\|$asmblob\\)" |
+ ${SED-sed} -e "$adjust_rx"
+ `;;
+ *) cblob='$.^';;
+ esac
+
+ xrs= nrs="# " eor="RT" eormatch='RT ~ ' eornl='[\n]' eornlsz=1
+ # Uncomment the line below to disable the use of a regular
+ # expression for the awk Record Separator, a GNU awk extension.
+ # Using this extension appears to save a lot of memory for long
+ # deblob-check runs.
+ # xrs="# " nrs= eor='$0' eormatch='' eornl= eornlsz=0
+
+ cat >> "$scriptname" <<EOF
+#! /bin/gawk --re-interval -f
+
+BEGIN {
+ # Should we replace blobs and false positives with replacement?
+ replace_blob = 0;
+ replace_falsepos = 0;
+ replacement = "/*(DEBLOBBED)*/";
+
+ # Should we print lines containing blobs, false positives, and neither?
+ print_blob = 0;
+ with_context = 0;
+ print_falsepos = 0;
+ print_nomatch = 0;
+
+ # Should we print the input stack and exit if we find blobs or
+ # false positives?
+ list_blob = 0;
+ list_falsepos = 0;
+
+ # Should we forget everything we know about false positives?
+ no_falsepos = 0;
+
+ verbose = $vp;
+
+ nfilenames = 0;
+ s = "\n";
+
+ # Which of the defaults above should we override?
+ $@ = 1;
+
+ # requires GNU awk RS extension:
+$xrs RS = "[;][/][*](begin|end) [^\n]*[*][/][;][\n]";
+}
+# requires GNU awk RS extension:
+$xrs { s = s \$0; }
+# does not require GNU awk RS extension:
+$nrs !/^[;][/][*].*[*][/][;]$/ {
+$nrs s = s \$0 "\n";
+$nrs next;
+$nrs }
+$eormatch /^[;][/][*]begin .*[*][/][;]$eornl$/ {
+ filenames[nfilenames] = substr($eor, 10, length ($eor) - 12 - $eornlsz);
+ if (verbose) print "entering " nfilenames ": " filenames[nfilenames];
+ nextnfilenames = nfilenames + 1;
+ if (s == "\n") {
+ nfilenames = nextnfilenames;
+ next;
+ }
+}
+$eormatch /^[;][/][*]end .*[*][/][;]$eornl$/ {
+ nextnfilenames = nfilenames - 1;
+ if (verbose)
+ print "got to the end of " nextnfilenames ": " filenames[nextnfilenames];
+}
+{
+ if (verbose) {
+ print "looking for matches";
+ for (i = nfilenames; --i > 0;)
+ print filenames[i] " within";
+ print filenames[0]
+ }
+
+ s = substr (s, 1, length (s) - 1)
+
+ pp = 2;
+ p = pend = 1;
+ if (verbose > 1) print "searching starting at", substr (s, p, 10)
+ matchfound = match (substr (s, p),
+ /[\n]($falsepos)|[\n]($cblob)|.($blob)/);
+ while (matchfound) {
+ blobs = falses = 0;
+ firstmatchstart = RSTART + p;
+ for (;;) {
+ matchstart = RSTART + p - 1;
+ matchlen = RLENGTH;
+ if (verbose) {
+ print "found match", matchstart, matchlen;
+ if (verbose > 1)
+ print substr (s, matchstart + 1, matchlen - 1);
+ }
+
+ if (match (substr (s, matchstart, matchlen), /^[\n]($falsepos)/) == 1) {
+ matchlen = RLENGTH;
+ if (verbose) print "match is a false positive of length", matchlen;
+ blob_p = 0;
+ falses++;
+ } else if (match (substr (s, matchstart, matchlen), /^.($blob)/) == 1) {
+ matchlen = RLENGTH;
+ if (verbose) print "match is a blob of length", matchlen;
+ blob_p = 1;
+ blobs++;
+ } else if (match (substr (s, matchstart, matchlen), /^[\n]($cblob)$/) == 1) {
+ if (verbose) print "match is a blob context";
+ pend = index (substr (s, matchstart + matchlen), "\n");
+ if (pend)
+ pend += matchstart + matchlen;
+ else
+ pend = length (s);
+ p = matchstart + 1;
+ blob_p = 2;
+ if (verbose > 1) print "range is:", substr (s, p, pend - p);
+ }
+
+ if (blob_p < 2) {
+ if (blob_p ? replace_blob : replace_falsepos) {
+ s = substr (s, 1, matchstart) \\
+ replacement \\
+ substr (s, matchstart + matchlen);
+ p = matchstart + length (replacement) - 1;
+ pend += (p + 1 - matchstart - matchlen);
+ } else
+ p = matchstart + matchlen - 1;
+
+ if (p >= pend) {
+ i = index (substr (s, p + 1), "\n");
+ if (i)
+ pend = p + 1 + i;
+ else
+ pend = length (s)
+ }
+ }
+
+ if (verbose) print "search until", pend;
+
+ if (!(matchfound = match (substr (s, p),
+ /[\n]($falsepos)|[\n]($cblob)|.($blob)/)) ||
+ p + RSTART >= pend ||
+ (blob_p ?
+ (!print_blob && !falses) :
+ (!print_falsepos && !blobs)))
+ break;
+ }
+
+ if (print_nomatch)
+ printf "%s", substr (s, pp, firstmatchstart - pp);
+ else if (print_blob || print_falsepos) {
+ lastline = substr (s, pp, firstmatchstart - pp);
+ sub (/.*[\n]/, "", lastline);
+ if (verbose) print "lastline: " lastline "\\\\n"
+ firstmatchstart -= length (lastline);
+ }
+ pp = firstmatchstart;
+
+ if (verbose) print "match set range:", pp, pend
+
+ if ((print_blob && blobs) || (print_falsepos && falses)) {
+ if (!print_nomatch)
+ for (i = nfilenames; i-- > 0;)
+ print "::: " filenames[i] " :::";
+ printf "%s", substr (s, pp, pend - pp);
+ pp = pend;
+ }
+
+ if ((list_blob && blobs) || (list_falsepos && falses)) {
+ for (i = nfilenames; --i > 0;)
+ print filenames[i] " within";
+ print filenames[0];
+ exit (1);
+ }
+ }
+
+ if (print_nomatch)
+ printf "%s", substr (s, pp)
+
+ if (verbose)
+ print "no further matches";
+
+ s = "\n";
+ nfilenames = nextnfilenames;
+ next;
+}
+EOF
+
+ scriptcmd="${AWK-gawk} --re-interval -f "'"$scriptname"'
+}
+
+set_flex_main () {
+ adjust_rx='
+s,\\\([{(|)}?+]\),\1,g
+s,^\([-+]\)\(\^\?\)\(.*\)\(\$\?\)$,\2(?s:\3)\4\1,g
+s,[+]$, { falsepos (); },
+s,[-]$, { blob (); },
+'
+
+ echo '%%' > "$scriptname"
+ ${SED-sed} "$adjust_rx" < "$regex_name" >> "$scriptname"
+ echo '\n|. { unmatched (); }
+%%
+int falsepos () {}
+int blob () {}
+int unmatched () {}
+' >> "$scriptname"
+
+ scriptcmd=false
+}
+
+set_save_script_input_main () {
+ savename=`mktemp -t deblob-check-input-XXXXXX`
+ scriptcmd="{ echo saving input in $savename && cat > $savename && echo done; }"
+}
+
+# Process an input file named in $1 and run it through the blob
+# recognizer. Functions set_except and set_sed_cmd provide additional
+# arguments on a per-file and per-action basis.
+
+check () {
+ case "$#" in 1) ;; *) echo ICE >&2; exit 1;; esac
+
+ input=$1
+
+ # Add $1 to falsepos. Its usage makes it implicitly anchored to the
+ # beginning of the line. $2, if present, will some day narrow the
+ # falsepos matches to files that match it.
+ addx () {
+ $echo "+^$1" >> $regex_name
+ }
+
+ # Add $1 to falseneg. Unlike addx, it is NOT implicitly anchored to
+ # the beginning of the line. $2, if present, will some day narrow
+ # the falseneg matches to files that match it.
+ badx () {
+ $echo "-$1" >> $regex_name
+ }
+
+ # Look for a multi-line definition starting with a line that matches
+ # $1 (implicitly anchored to the beginning of the line), and ending
+ # at the first ';'. $2 may optionally name the files in which this
+ # match is to be disregarded as a potential blob.
+ initnc () {
+ addx "$1[^;]*[;]\\?" $2
+ }
+
+ # Same as initnc, but require the terminating semicolon.
+ defsnc () {
+ addx "$1[^;]*[;]" $2
+ }
+
+ # Look for a multi-line definition starting with a line that matches
+ # $1 (implicitly anchored to the beginning of the line), and ending
+ # at the first ';' that's not within comments.
+ initc () {
+ addx "$1\\([^;/]\\+\\($comment\\|[/][^/*;]\\)\\+\\)*[^;/]*[;]\\?" $2
+ }
+
+ # Same as initc, but require the terminating semicolon.
+ defsc () {
+ addx "$1\\([^;/]\\+\\($comment\\|[/][^/*;]\\)\\+\\)*[^;/]*[;]" $2
+ }
+
+ # Accept as a non-blob an expression $1 that would have otherwise
+ # triggered blob detection. The expression must end in a way that
+ # would trigger the blob detection machinery.
+ accept () {
+ addx "$1" $2
+ }
+
+ # Match up to the end a comment started in $1.
+ ocomment () {
+ addx "$1[/]*\\([*]*[^*/][/]*\\)*[*]\+[/]" $2
+ }
+
+ # Match $1 followed by backslash-terminated lines and a last
+ # non-backslash-terminated line.
+ oprepline () {
+ addx "$1\\([^\\\\\\n]*[\\\\][\\n]\\)*[^\\\\\\n]*$" $2
+ }
+
+ # Match $1 in $2 as a blob. Not anchored.
+ blobna () {
+ badx "$1" $2
+ }
+
+ # Match $1 as a blob anywhere. $2 is just for documentation purposes.
+ blobname () {
+ badx "$1"
+ }
+
+ # Match $1 in $2 as a blob. The expectation is a match in the
+ # beginning of line, but we don't do anchoring of blob patterns ATM.
+ blob () {
+ badx "$1" $2
+ }
+
+ regex_name=`mktemp -t deblob-check-regex-XXXXXX`
+ tempfiles="$regex_name"
+
+ set_except "$input"
+
+ # Check that all regular expressions match our requirements.
+ ${SED-sed} -n '
+s,^\(-\^\?\|[+]\^\),,
+h
+s,[$]$,,
+s,\([^\\]\|^\)\(\(\\\\\)*\)\(\[^\?[]]\?[^]]\+\]\([*]\|\\[+?]\)\?\(\\\\\)*\)\+,\1\2,g
+/\([^\\]\|^\)\(\\\\\)*\([{(|)}?+^$"'"'"'; ]\)\|^$/{
+ g
+ i\
+BAD regular expression:
+ p
+ q 1
+}' $regex_name >&2 || exit 1
+
+ scriptname=`mktemp -t deblob-check-script-XXXXXX`
+ tempfiles="$tempfiles $scriptname"
+
+ scriptcmd=false
+ scriptcmd2=
+
+ $set_cmd "$input"
+
+ for f in $tempfiles; do
+ case $f in "$scriptname") ;;
+ *) rm -f "$f" ;;
+ esac
+ done
+ tempfiles="$scriptname"
+
+ # Choose the input source...
+ case $input in
+ -) in= ;;
+ *) in='< "$input"' ;;
+ esac
+
+ set fnord # shifted out below
+
+ # Decompress as needed...
+ case $input in
+ *.bz2) cmd='bunzip2' ;;
+ *.gz) cmd='gunzip' ;;
+ *) cmd= ;;
+ esac
+ if test -n "$cmd"; then
+ set "$@" "$cmd"
+ fi
+
+ # Extract or otherwise munge...
+ case /$input in
+ *.tar*)
+ cmd="tar -xf - --to-command='echo \";/*begin \$TAR_FILENAME*/;\"; cat; echo; echo \";/*end \$TAR_FILENAME*/;\"'"
+ ;;
+ *.patch | *.patch.*z* | */patch-* | *.diff | *.diff.*z*)
+ if $reverse_patch; then
+ s=- r=+
+ else
+ s=+ r=-
+ fi
+ sedpatch="
+ /^[$r]/b testlastline;
+ # /^[*!]/ {
+ # s,^,context diffs are not properly supported\\n,;
+ # W /dev/stderr
+ # d;
+ # }
+ /^\\(@@ \\|$s$s$s \\|[^$s @]\\|$\\)/ {
+ x;
+ /^@@ /{
+ s,^,;/*end ,;
+ s,\\([\\n]\\|$\\),*/;&,;
+ i\\
+;/**/;
+
+ P;
+ s,^[^\\n]*\\([\\n]\\|$\\),,;
+ }
+ x;
+ }
+ /^\\($s$s$s \\|[^$s @]\\|$\\)/ {
+ x;
+ /^$s$s$s /{
+ s,^$s$s$s,;/*end,;
+ s,\\([\\n]\\|$\\),*/;&,;
+ i\\
+
+ P;
+ s,^[^\\n]*\\([\\n]\\|$\\),,;
+ }
+ x;
+ }
+ /^$s$s$s / {
+ H;
+ x;
+ s,^[\\n],,;
+ s,^\\(.*\\)[\\n]\\([^\\n]*\\)$,\\2\\n\\1,;
+ x;
+ s,^$s$s$s \\(.*\\)$,;/*begin \\1*/;,;
+ p;
+ d;
+ }
+ /^@@ / {
+ H;
+ x;
+ s,^[\\n],,;
+ s,^\\(.*\\)[\\n]\\([^\\n]*\\)$,\\2\\n\\1,;
+ x;
+ # A number of patterns for patches depend on the ;/*@@ lines for
+ # context.
+ s,^.*$,;/*begin &*/;\\n;/*&*/;,;
+ p;
+ d;
+ }
+ s,^[ !$s],,
+ p;
+ :testlastline
+ $ {
+ x;
+ /^@@ /{
+ s,^,;/*end ,;
+ s,\\([\\n]\\|$\\),*/;&,;
+ i\\
+;/**/;
+
+ P;
+ s,^[^\\n]*\\([\\n]\\|$\\),,;
+ }
+ /^$s$s$s /{
+ s,^$s$s$s,;/*end,;
+ s,\\([\\n]\\|$\\),*/;&,;
+ i\\
+
+ P;
+ s,^[^\\n]*\\([\\n]\\|$\\),,;
+ }
+ x;
+ }
+ d;"
+ cmd='${SED-sed} "$sedpatch"'
+ ;;
+ *)
+ cmd='cat'
+ ;;
+ esac
+ cmd="{ echo \";/*begin $input*/;\"; $cmd; echo; echo \";/*end $input*/;\"; }"
+ set "$@" "$cmd"
+
+ case $input in
+ *.tar*)
+ cmd="{ cat; cat > /dev/null; }"
+ set "$@" "$cmd"
+ ;;
+ esac
+
+ # Then run through the selected action.
+ set "$@" "$scriptcmd"
+
+ case $scriptcmd2 in "" | cat) ;;
+ *) set "$@" "$scriptcmd2"
+ esac
+
+ # test $# = 1 || set "$@" "cat"
+
+ shift # fnord goes out here
+
+ pipe=
+ for cmd
+ do
+ if test -z "$pipe"; then
+ pipe="$cmd $in"
+ else
+ pipe="$pipe | $cmd"
+ fi
+ done
+
+ eval "$pipe"
+ status=$?
+
+ $rm $tempfiles
+ tempfiles=
+
+ (exit $status)
+}
+
+# If no input given, use stdin.
+case $# in
+0)
+ test -t 0 && echo reading from standard input >&2
+ set fnord -
+ shift
+ ;;
+esac
+
+# The lines below commented out out #list: can be used to get a list
+# of matching inputs. ATM this is useless, so we just use a shell
+# boolean.
+
+#list: n=$#
+pass=:
+
+tempfiles=
+trap "status=$?; test -z \"$tempfiles\" || rm -f $tempfiles; (exit $status); exit" 0 1 2 15
+
+process_arg=
+
+# Go through each of the input files in the command line.
+for file
+do
+ case $process_arg in
+ "") ;;
+ --implied-prefix | --prefix | -i)
+ prefix=$file
+ case $prefix in
+ /*/) ;;
+ */) prefix=/$prefix ;;
+ /*) prefix=$prefix/ ;;
+ *) prefix=/$prefix/ ;;
+ esac
+ process_arg=
+ continue
+ ;;
+ *)
+ echo Internal error with process_arg=$process_arg >&2
+ exit 1
+ ;;
+ esac
+
+ case $sawdashdash$file in
+ --implied-prefix | --prefix | -i)
+ process_arg=$file
+ continue
+ ;;
+ esac
+
+ # If we print anything whatsoever (even a blank line) while
+ # processing it, we've failed.
+ if check "$file"; then
+ :
+ else
+ pass=false
+ #list: set fnord "$@" "$file"
+ #list: shift
+ fi
+done
+
+case $process_arg in
+"") ;;
+*)
+ echo Missing argument to $process_arg >&2
+ exit 1
+ ;;
+esac
+
+#list: shift $n
+
+#list: exec test $# = 0
+$pass
+exit
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/deblob-main b/freed-ora/tags/f15/2.6.38.6-27.fc15/deblob-main
new file mode 100755
index 000000000..7d8a29cd5
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/deblob-main
@@ -0,0 +1,243 @@
+#! /bin/sh
+
+# Copyright (C) 2008, 2009, 2010 Alexandre Oliva <lxoliva@fsfla.org>
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+# USA
+
+# deblob.sh - prepare a linux-libre tarball out of a non-libre Linux
+# tarball. It expects the Linux release (mver, say 2.6.25) as the
+# first argument, the libre sub-release (extra) as the second optional
+# argument, and the patch release (sver, say .13) as an optional third
+# argument. mver and sver are pasted together to form kver.
+
+# linux-$kver.tar.bz2 and deblob-$mver must exist in the current
+# directory, and the line that sets kver and extra in deblob-$mver
+# must match mver and extra.
+
+# The resulting tarball is put in linux-$kver-libre$extra.tar.bz2, and
+# an uncompressed xdelta that produces linux-$kver-libre$extra.tar out
+# of linux-$kver.tar is created as linux-$kver-libre$extra.xdelta.
+# This xdelta can be distributed to enable third parties to easily
+# reconstruct the binary tarball starting out of sources downloaded
+# from kernel.org, but without distributing non-Free Software
+# yourself, because xdelta (unlike patches) is not reversible: the
+# removed bits are not present in it at all.
+
+# To enable you to check the differences between the tarballs, a patch
+# file is generated in linux-$kver-libre$extra.patch. This patch file
+# contains the non-Free blobs, even though in reversed form, so its
+# distribution is discouraged.
+
+# At the end, the script attempts to generate a digital signature for
+# the newly-created tarball. This is the last thing the script does,
+# so interrupting it at that point to skip the signing won't fail to
+# do anything else.
+
+# It is safe to interrupt the script at any other point. When it gets
+# a ^C (other than during signing), it starts cleaning up all of its
+# temporary and output files. If you insist, it may leave junk
+# behind, and then it will refuse to run again before you clean it up
+# by hand. It takes extra care to avoid overwriting useful files.
+
+# If deblob-$mver finds any unexpected situation, it will error out,
+# and then deblob-main will quit. Pass --force to deblob-main, before
+# any other argument, for deblob-main to ignore any such situations.
+
+case $1 in
+--force) force=--force; shift;;
+*) force=;;
+esac
+
+mver=$1 extra=$2 sver=$3
+kver=$mver$sver libre=libre$extra
+deblob= dir=`echo "$0" | sed 's,[^/]*$,,;s,^$,.,;s,/*$,,'`
+
+if test ! -f linux-$kver.tar.bz2; then
+ echo linux-$kver.tar.bz2 does not exist >&2
+ exit 1
+fi
+
+if test -f deblob-$mver; then
+ deblob=deblob-$mver
+elif test -f deblob; then
+ deblob=deblob
+elif test -f $dir/deblob-$mver; then
+ cp $dir/deblob-$mver deblob
+ deblob=deblob
+else
+ echo deblob does not exist >&2
+ exit 1
+fi
+
+x1="kver=$mver extra=$extra"
+x2=`grep "^kver=[^ ]* extra=" $deblob`
+if test "$x1" = "$x2"; then
+ :
+else
+ echo deblob script does not match command-line arguments >&2
+ echo expected: $x1 >&2
+ echo found : $x2 >&2
+ exit 1
+fi
+
+cleanup=
+
+for f in \
+ linux-$kver-$libre.tar.bz2 \
+ linux-$kver-$libre.tar.bz2.asc \
+ linux-$kver-$libre.tar.bz2.sign \
+ linux-$kver-$libre.tar.lz \
+ linux-$kver-$libre.tar.lz.asc \
+ linux-$kver-$libre.tar.lz.sign \
+ linux-$kver.tar \
+ linux-$kver-$libre.tar \
+ linux-$kver-$libre.patch \
+ linux-$kver-$libre.log \
+ linux-$kver-$libre.xdelta \
+ linux-$kver-$libre.xdelta.asc \
+ linux-$kver-$libre.xdelta.sign \
+; do
+ if test -f $f; then
+ echo $f already exists >&2
+ exit 1
+ fi
+ cleanup="$cleanup $f"
+done
+
+for d in \
+ linux-$kver \
+ linux-$kver-$libre \
+ orig-linux-$kver \
+; do
+ if test -d $d; then
+ echo $d already exists >&2
+ exit 1
+ fi
+ cleanup="$cleanup $d"
+done
+
+if test -f $dir/deblob-$kver; then
+ if cmp $dir/deblob-$kver $deblob; then
+ :
+ else
+ echo $dir/deblob-$kver and $deblob are different >&2
+ exit 1
+ fi
+fi
+
+if test ! -f deblob-check; then
+ if test -f $dir/deblob-check; then
+ cp $dir/deblob-check deblob-check
+ fi
+else
+ if test -f $dir/deblob-check; then
+ if cmp $dir/deblob-check deblob-check; then
+ :
+ else
+ echo $dir/deblob-check and deblob-check are different >&2
+ exit 1
+ fi
+ fi
+fi
+
+trap "status=$?; echo cleaning up...; rm -rf $cleanup; (exit $status); exit" 0 1 2 15
+
+set -e
+
+echo Uncompressing linux-$kver.tar.bz2 into linux-$kver.tar
+rm -rf linux-$kver linux-$kver.tar
+bunzip2 < linux-$kver.tar.bz2 > linux-$kver.tar
+
+echo Extracting linux-$kver.tar into linux-$kver
+tar -xf linux-$kver.tar
+rm -rf linux-$kver-$libre linux-$kver-$libre.tar
+
+echo Copying linux-$kver to linux-$kver-$libre
+cp linux-$kver.tar linux-$kver-$libre.tar
+cp -lR linux-$kver/. linux-$kver-$libre
+
+rm -f linux-$kver-$libre.log linux-$kver-$libre.log.tmp
+echo Deblobbing within linux-$kver-$libre, saving output to linux-$kver-$libre.log
+# We can't just pipe deblob into tee, for then we fail to detect
+# error conditions. Use file renaming to tell whether we succeeded.
+if (cd linux-$kver-$libre && /bin/sh ../$deblob $force) 2>&1; then
+ mv linux-$kver-$libre.log.tmp linux-$kver-$libre.log
+fi | tee linux-$kver-$libre.log.tmp
+if test ! -f linux-$kver-$libre.log; then
+ mv linux-$kver-$libre.log.tmp linux-$kver-$libre.log
+ echo $deblob failed, aborting >&2
+ exit 1
+fi
+rm -f linux-$kver-$libre.patch
+
+# Do not copy these scripts for now, deblob-check regards itself as a blob.
+# cp -p $0 $deblob deblob-check linux-$kver-$libre
+
+echo Generating linux-$kver-$libre.patch
+diff -druN linux-$kver linux-$kver-$libre > linux-$kver-$libre.patch || :
+
+echo Removing removed or modified files from linux-$kver-$libre.tar
+diff -rq linux-$kver linux-$kver-$libre |
+sed -n "
+ s,^Only in \\(linux-$kver\\(/.*\\)\\?\\): \\(.*\\),\1/\3,p;
+ s,^Files \\(linux-$kver\\)/\\(.*\\) and \\1-$libre/\\2 differ,\\1/\\2,p;
+" |
+xargs tar --delete -f linux-$kver-$libre.tar
+
+echo Adding modified or added files to linux-$kver-$libre.tar
+rm -rf orig-linux-$kver
+mv linux-$kver orig-linux-$kver
+mv linux-$kver-$libre linux-$kver
+diff -rq orig-linux-$kver linux-$kver |
+sed -n "
+ s,^Files orig-\\(linux-$kver/.*\\) and \\1 differ,\\1,p;
+ s,^Only in \\(linux-$kver\\(/.*\\)\\?\\): \\(.*\\),\\1/\\3,p;
+" |
+xargs tar --append -f linux-$kver-$libre.tar
+
+echo Wiping out extracted trees
+rm -rf linux-$kver orig-linux-$kver
+
+echo Creating xdelta between linux-$kver.tar and linux-$kver-$libre.tar
+xdelta delta -0 linux-$kver.tar linux-$kver-$libre.tar linux-$kver-$libre.xdelta || : # xdelta returns nonzero on success
+
+echo Compressing linux-$kver-$libre.tar and linux-$kver-$libre.xdelta
+rm -f linux-$kver.tar
+lzip -k9 linux-$kver-$libre.tar
+bzip2 -9 linux-$kver-$libre.tar
+if test -f linux-$kver-$libre.xdelta; then
+ lzip -k9 linux-$kver-$libre.xdelta
+ bzip2 -9 linux-$kver-$libre.xdelta
+fi
+
+trap "status=$?; (exit $status); exit" 0 1 2 15
+
+echo Done except for signing, feel free to interrupt
+for f in \
+ linux-$kver-$libre.tar.bz2 \
+ linux-$kver-$libre.tar.lz \
+ linux-$kver-$libre.xdelta.bz2 \
+ linux-$kver-$libre.xdelta.lz \
+; do
+ if test -f $f; then
+ gpg -a --detach-sign $f
+ mv $f.asc $f.sign
+ fi
+done
+
+echo All set, please review linux-$kver-$libre.patch
+
+exit 0
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/die-floppy-die.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/die-floppy-die.patch
new file mode 100644
index 000000000..76db31218
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/die-floppy-die.patch
@@ -0,0 +1,30 @@
+From 4ff58b642f80dedb20533978123d89b5ac9b1ed5 Mon Sep 17 00:00:00 2001
+From: Kyle McMartin <kyle@phobos.i.jkkm.org>
+Date: Tue, 30 Mar 2010 00:04:29 -0400
+Subject: die-floppy-die
+
+Kill the floppy.ko pnp modalias. We were surviving just fine without
+autoloading floppy drivers, tyvm.
+
+Please feel free to register all complaints in the wastepaper bin.
+---
+ drivers/block/floppy.c | 3 +--
+ 1 files changed, 1 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
+index 90c4038..f4a0b90 100644
+--- a/drivers/block/floppy.c
++++ b/drivers/block/floppy.c
+@@ -4619,8 +4619,7 @@ static const struct pnp_device_id floppy_pnpids[] = {
+ {"PNP0700", 0},
+ {}
+ };
+-
+-MODULE_DEVICE_TABLE(pnp, floppy_pnpids);
++/* MODULE_DEVICE_TABLE(pnp, floppy_pnpids); */
+
+ #else
+
+--
+1.7.0.1
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/disable-i8042-check-on-apple-mac.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/disable-i8042-check-on-apple-mac.patch
new file mode 100644
index 000000000..f99d0f900
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/disable-i8042-check-on-apple-mac.patch
@@ -0,0 +1,59 @@
+From 2a79554c864ac58fa2ad982f0fcee2cc2aa33eb5 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Thu, 20 May 2010 10:30:31 -0400
+Subject: Disable i8042 checks on Intel Apple Macs
+
+As those computers never had any i8042 controllers, and the
+current lookup code could potentially lock up/hang/wait for
+timeout for long periods of time.
+
+Fixes intermittent hangs on boot on a MacbookAir1,1
+
+Signed-off-by: Bastien Nocera <hadess@hadess.net>
+---
+ drivers/input/serio/i8042.c | 22 ++++++++++++++++++++++
+ 1 files changed, 22 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
+index 6440a8f..4d7cf98 100644
+--- a/drivers/input/serio/i8042.c
++++ b/drivers/input/serio/i8042.c
+@@ -1451,6 +1451,22 @@ static struct platform_driver i8042_driver = {
+ .shutdown = i8042_shutdown,
+ };
+
++#ifdef CONFIG_DMI
++static struct dmi_system_id __initdata dmi_system_table[] = {
++ {
++ .matches = {
++ DMI_MATCH(DMI_BIOS_VENDOR, "Apple Computer, Inc.")
++ },
++ },
++ {
++ .matches = {
++ DMI_MATCH(DMI_BIOS_VENDOR, "Apple Inc.")
++ },
++ },
++ {}
++};
++#endif /*CONFIG_DMI*/
++
+ static int __init i8042_init(void)
+ {
+ struct platform_device *pdev;
+@@ -1458,6 +1474,12 @@ static int __init i8042_init(void)
+
+ dbg_init();
+
++#ifdef CONFIG_DMI
++ /* Intel Apple Macs never have an i8042 controller */
++ if (dmi_check_system(dmi_system_table) > 0)
++ return -ENODEV;
++#endif /*CONFIG_DMI*/
++
+ err = i8042_platform_init();
+ if (err)
+ return err;
+--
+1.7.0.1
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/dmar-disable-when-ricoh-multifunction.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/dmar-disable-when-ricoh-multifunction.patch
new file mode 100644
index 000000000..120730f9e
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/dmar-disable-when-ricoh-multifunction.patch
@@ -0,0 +1,33 @@
+From da7662784dcced04a5b7a3a5b2bbb8276d699522 Mon Sep 17 00:00:00 2001
+From: Kyle McMartin <kyle@mcmartin.ca>
+Date: Sun, 17 Oct 2010 15:55:32 -0400
+Subject: [PATCH] dmar: disable if ricoh multifunction detected
+
+---
+ drivers/pci/intel-iommu.c | 10 ++++++++++
+ 1 files changed, 10 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
+index 4789f8e..5923914 100644
+--- a/drivers/pci/intel-iommu.c
++++ b/drivers/pci/intel-iommu.c
+@@ -3784,6 +3784,16 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0044, quirk_calpella_no_shadow_g
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0062, quirk_calpella_no_shadow_gtt);
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x006a, quirk_calpella_no_shadow_gtt);
+
++/* https://bugzilla.redhat.com/show_bug.cgi?id=605888 */
++static void __devinit quirk_ricoh_multifunction(struct pci_dev *dev)
++{
++ dmar_disabled = 1;
++}
++DECLARE_PCI_FIXUP_HEADER(0x1180, 0xe822, quirk_ricoh_multifunction);
++DECLARE_PCI_FIXUP_HEADER(0x1180, 0xe230, quirk_ricoh_multifunction);
++DECLARE_PCI_FIXUP_HEADER(0x1180, 0xe832, quirk_ricoh_multifunction);
++DECLARE_PCI_FIXUP_HEADER(0x1180, 0xe476, quirk_ricoh_multifunction);
++
+ /* On Tylersburg chipsets, some BIOSes have been known to enable the
+ ISOCH DMAR unit for the Azalia sound device, but not give it any
+ TLB entries, which causes it to deadlock. Check for that. We do
+--
+1.7.3.1
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-i915-fix-pipelined-fencing.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-i915-fix-pipelined-fencing.patch
new file mode 100644
index 000000000..b6c016c54
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-i915-fix-pipelined-fencing.patch
@@ -0,0 +1,80 @@
+From 3b936797f5e4623ae1b80a5f0c4df30a17360bf5 Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Thu, 17 Mar 2011 15:23:22 +0000
+Subject: [PATCH] drm/i915: Fix pipelined fencing
+
+Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=34584
+Cc: Andy Whitcroft <apw@canonical.com>
+Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
+Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+---
+ drivers/gpu/drm/i915/i915_gem.c | 46 ++++++++++++++++----------------------
+ 1 files changed, 19 insertions(+), 27 deletions(-)
+
+diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
+index 36e66cc..10378a3 100644
+--- a/drivers/gpu/drm/i915/i915_gem.c
++++ b/drivers/gpu/drm/i915/i915_gem.c
+@@ -2544,8 +2544,25 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj,
+ reg = &dev_priv->fence_regs[obj->fence_reg];
+ list_move_tail(&reg->lru_list, &dev_priv->mm.fence_list);
+
+- if (!obj->fenced_gpu_access && !obj->last_fenced_seqno)
+- pipelined = NULL;
++ if (obj->tiling_changed) {
++ ret = i915_gem_object_flush_fence(obj,
++ pipelined,
++ interruptible);
++ if (ret)
++ return ret;
++
++ if (!obj->fenced_gpu_access && !obj->last_fenced_seqno)
++ pipelined = NULL;
++
++ if (pipelined) {
++ reg->setup_seqno =
++ i915_gem_next_request_seqno(dev, pipelined);
++ obj->last_fenced_seqno = reg->setup_seqno;
++ obj->last_fenced_ring = pipelined;
++ }
++
++ goto update;
++ }
+
+ if (!pipelined) {
+ if (reg->setup_seqno) {
+@@ -2568,31 +2585,6 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj,
+ interruptible);
+ if (ret)
+ return ret;
+- } else if (obj->tiling_changed) {
+- if (obj->fenced_gpu_access) {
+- if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) {
+- ret = i915_gem_flush_ring(obj->base.dev, obj->ring,
+- 0, obj->base.write_domain);
+- if (ret)
+- return ret;
+- }
+-
+- obj->fenced_gpu_access = false;
+- }
+- }
+-
+- if (!obj->fenced_gpu_access && !obj->last_fenced_seqno)
+- pipelined = NULL;
+- BUG_ON(!pipelined && reg->setup_seqno);
+-
+- if (obj->tiling_changed) {
+- if (pipelined) {
+- reg->setup_seqno =
+- i915_gem_next_request_seqno(dev, pipelined);
+- obj->last_fenced_seqno = reg->setup_seqno;
+- obj->last_fenced_ring = pipelined;
+- }
+- goto update;
+ }
+
+ return 0;
+--
+1.5.6.5
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-big-hammer.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-big-hammer.patch
new file mode 100644
index 000000000..bf152af3b
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-big-hammer.patch
@@ -0,0 +1,21 @@
+omgwtfbbqchainsaw?
+---
+ drivers/gpu/drm/i915/i915_gem_execbuffer.c | 5 +++++
+ 1 files changed, 5 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+index e698343..21e601d1 100644
+--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
++++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+@@ -1090,6 +1090,11 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
+ if (ret)
+ goto pre_mutex_err;
+
++ /* We don't get the flushing right for these chipsets, use the
++ * big hammer for now to avoid random crashiness. */
++ if (IS_I85X(dev) || IS_I865G(dev))
++ wbinvd();
++
+ if (dev_priv->mm.suspended) {
+ mutex_unlock(&dev->struct_mutex);
+ ret = -EBUSY;
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-edp-fixes.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-edp-fixes.patch
new file mode 100644
index 000000000..c77ef116c
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-edp-fixes.patch
@@ -0,0 +1,44 @@
+diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
+index f737960..b1f8164 100644
+--- a/drivers/gpu/drm/i915/i915_drv.c
++++ b/drivers/gpu/drm/i915/i915_drv.c
+@@ -509,6 +509,8 @@ i915_pci_remove(struct pci_dev *pdev)
+ {
+ struct drm_device *dev = pci_get_drvdata(pdev);
+
++ pci_disable_device(pdev); /* core did previous enable */
++
+ drm_put_dev(dev);
+ }
+
+diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
+index 300f64b..2e3db37 100644
+--- a/drivers/gpu/drm/i915/intel_dp.c
++++ b/drivers/gpu/drm/i915/intel_dp.c
+@@ -795,7 +795,8 @@ static bool ironlake_edp_panel_on (struct intel_dp *intel_dp)
+ {
+ struct drm_device *dev = intel_dp->base.base.dev;
+ struct drm_i915_private *dev_priv = dev->dev_private;
+- u32 pp, idle_on_mask = PP_ON | PP_SEQUENCE_STATE_ON_IDLE;
++ u32 pp, idle_on = PP_ON | PP_SEQUENCE_STATE_ON_IDLE;
++ u32 idle_on_mask = PP_ON | PP_SEQUENCE_STATE_MASK;
+
+ if (I915_READ(PCH_PP_STATUS) & PP_ON)
+ return true;
+@@ -816,7 +817,7 @@ static bool ironlake_edp_panel_on (struct intel_dp *intel_dp)
+ */
+ msleep(300);
+
+- if (wait_for((I915_READ(PCH_PP_STATUS) & idle_on_mask) == idle_on_mask,
++ if (wait_for((I915_READ(PCH_PP_STATUS) & idle_on_mask) == idle_on,
+ 5000))
+ DRM_ERROR("panel on wait timed out: 0x%08x\n",
+ I915_READ(PCH_PP_STATUS));
+@@ -922,6 +923,7 @@ static void intel_dp_prepare(struct drm_encoder *encoder)
+
+ if (is_edp(intel_dp)) {
+ ironlake_edp_backlight_off(dev);
++ ironlake_edp_panel_off(dev);
+ ironlake_edp_panel_on(intel_dp);
+ if (!is_pch_edp(intel_dp))
+ ironlake_edp_pll_on(encoder);
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-eeebox-eb1007-quirk.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-eeebox-eb1007-quirk.patch
new file mode 100644
index 000000000..9ae3604e7
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-eeebox-eb1007-quirk.patch
@@ -0,0 +1,36 @@
+From ab737b006568d01204cc51368c7e2067eecb2cff Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede@redhat.com>
+Date: Thu, 7 Apr 2011 13:31:57 +0200
+Subject: [PATCH] drm/i915: Add a no lvds quirk for the Asus EeeBox PC EB1007
+
+I found this while figuring out why gnome-shell would not run on my
+Asus EeeBox PC EB1007. As a standalone "pc" this device cleary does not have
+an internal panel, yet it claims it does. Add a quirk to fix this.
+
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+---
+ drivers/gpu/drm/i915/intel_lvds.c | 8 ++++++++
+ 1 files changed, 8 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
+index a562bd2..954822a 100644
+--- a/drivers/gpu/drm/i915/intel_lvds.c
++++ b/drivers/gpu/drm/i915/intel_lvds.c
+@@ -724,6 +724,14 @@ static const struct dmi_system_id intel_no_lvds[] = {
+ DMI_MATCH(DMI_PRODUCT_NAME, "U800"),
+ },
+ },
++ {
++ .callback = intel_no_lvds_dmi_callback,
++ .ident = "Asus EeeBox PC EB1007",
++ .matches = {
++ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer INC."),
++ DMI_MATCH(DMI_PRODUCT_NAME, "EB1007"),
++ },
++ },
+
+ { } /* terminating entry */
+ };
+--
+1.7.4.2
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-make-lvds-work.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-make-lvds-work.patch
new file mode 100644
index 000000000..209deb295
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-make-lvds-work.patch
@@ -0,0 +1,23 @@
+ drivers/gpu/drm/i915/intel_display.c | 2 --
+ 1 files changed, 0 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
+index 990f065..171a797 100644
+--- a/drivers/gpu/drm/i915/intel_display.c
++++ b/drivers/gpu/drm/i915/intel_display.c
+@@ -4568,7 +4568,6 @@ void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder,
+ struct drm_connector *connector, int dpms_mode)
+ {
+ struct drm_encoder *encoder = &intel_encoder->base;
+- struct drm_device *dev = encoder->dev;
+ struct drm_crtc *crtc = encoder->crtc;
+ struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
+ struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
+@@ -4578,7 +4577,6 @@ void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder,
+ connector->encoder = NULL;
+ intel_encoder->load_detect_temp = false;
+ crtc->enabled = drm_helper_crtc_in_use(crtc);
+- drm_helper_disable_unused_functions(dev);
+ }
+
+ /* Switch crtc and encoder back off if necessary */
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-next.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-next.patch
new file mode 100644
index 000000000..c6cac6926
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-next.patch
@@ -0,0 +1 @@
+empty
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-restore-mode.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-restore-mode.patch
new file mode 100644
index 000000000..b394ca00d
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-intel-restore-mode.patch
@@ -0,0 +1,128 @@
+From e8e7a2b8ccfdae0d4cb6bd25824bbedcd42da316 Mon Sep 17 00:00:00 2001
+From: Dave Airlie <airlied@redhat.com>
+Date: Thu, 21 Apr 2011 22:18:32 +0100
+Subject: [PATCH] drm/i915: restore only the mode of this driver on lastclose (v2)
+
+i915 calls the panic handler function on last close to reset the modes,
+however this is a really bad idea for multi-gpu machines, esp shareable
+gpus machines. So add a new entry point for the driver to just restore
+its own fbcon mode.
+
+v2: move code into fb helper, fix panic code to block mode change on
+powered off GPUs.
+
+[airlied: this hits drm core and I wrote it and it was reviewed on intel-gfx
+ so really I signed it off twice ;-).]
+Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+Signed-off-by: Dave Airlie <airlied@redhat.com>
+---
+ drivers/gpu/drm/drm_fb_helper.c | 27 ++++++++++++++++++++-------
+ drivers/gpu/drm/i915/i915_dma.c | 2 +-
+ drivers/gpu/drm/i915/intel_drv.h | 1 +
+ drivers/gpu/drm/i915/intel_fb.c | 10 ++++++++++
+ include/drm/drm_fb_helper.h | 1 +
+ 5 files changed, 33 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
+index 9507204..11d7a72 100644
+--- a/drivers/gpu/drm/drm_fb_helper.c
++++ b/drivers/gpu/drm/drm_fb_helper.c
+@@ -342,9 +342,22 @@ int drm_fb_helper_debug_leave(struct fb_info *info)
+ }
+ EXPORT_SYMBOL(drm_fb_helper_debug_leave);
+
++bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper)
++{
++ bool error = false;
++ int i, ret;
++ for (i = 0; i < fb_helper->crtc_count; i++) {
++ struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set;
++ ret = drm_crtc_helper_set_config(mode_set);
++ if (ret)
++ error = true;
++ }
++ return error;
++}
++EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode);
++
+ bool drm_fb_helper_force_kernel_mode(void)
+ {
+- int i = 0;
+ bool ret, error = false;
+ struct drm_fb_helper *helper;
+
+@@ -352,12 +365,12 @@ bool drm_fb_helper_force_kernel_mode(void)
+ return false;
+
+ list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) {
+- for (i = 0; i < helper->crtc_count; i++) {
+- struct drm_mode_set *mode_set = &helper->crtc_info[i].mode_set;
+- ret = drm_crtc_helper_set_config(mode_set);
+- if (ret)
+- error = true;
+- }
++ if (helper->dev->switch_power_state == DRM_SWITCH_POWER_OFF)
++ continue;
++
++ ret = drm_fb_helper_restore_fbdev_mode(helper);
++ if (ret)
++ error = true;
+ }
+ return error;
+ }
+diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
+index 7273037..12876f2 100644
+--- a/drivers/gpu/drm/i915/i915_dma.c
++++ b/drivers/gpu/drm/i915/i915_dma.c
+@@ -2207,7 +2207,7 @@ void i915_driver_lastclose(struct drm_device * dev)
+ drm_i915_private_t *dev_priv = dev->dev_private;
+
+ if (!dev_priv || drm_core_check_feature(dev, DRIVER_MODESET)) {
+- drm_fb_helper_restore();
++ intel_fb_restore_mode(dev);
+ vga_switcheroo_process_delayed_switch();
+ return;
+ }
+diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
+index f5b0d83..1d20712 100644
+--- a/drivers/gpu/drm/i915/intel_drv.h
++++ b/drivers/gpu/drm/i915/intel_drv.h
+@@ -338,4 +338,5 @@ extern int intel_overlay_attrs(struct drm_device *dev, void *data,
+ struct drm_file *file_priv);
+
+ extern void intel_fb_output_poll_changed(struct drm_device *dev);
++extern void intel_fb_restore_mode(struct drm_device *dev);
+ #endif /* __INTEL_DRV_H__ */
+diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c
+index 5127827..ec49bae 100644
+--- a/drivers/gpu/drm/i915/intel_fb.c
++++ b/drivers/gpu/drm/i915/intel_fb.c
+@@ -264,3 +264,13 @@ void intel_fb_output_poll_changed(struct drm_device *dev)
+ drm_i915_private_t *dev_priv = dev->dev_private;
+ drm_fb_helper_hotplug_event(&dev_priv->fbdev->helper);
+ }
++
++void intel_fb_restore_mode(struct drm_device *dev)
++{
++ int ret;
++ drm_i915_private_t *dev_priv = dev->dev_private;
++
++ ret = drm_fb_helper_restore_fbdev_mode(&dev_priv->fbdev->helper);
++ if (ret)
++ DRM_DEBUG("failed to restore crtc mode\n");
++}
+diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h
+index f22e7fe..ade09d7 100644
+--- a/include/drm/drm_fb_helper.h
++++ b/include/drm/drm_fb_helper.h
+@@ -118,6 +118,7 @@ int drm_fb_helper_setcolreg(unsigned regno,
+ unsigned transp,
+ struct fb_info *info);
+
++bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper);
+ void drm_fb_helper_restore(void);
+ void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper,
+ uint32_t fb_width, uint32_t fb_height);
+--
+1.7.1
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-nouveau-fixes.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-nouveau-fixes.patch
new file mode 100644
index 000000000..d74feb7d2
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-nouveau-fixes.patch
@@ -0,0 +1,168 @@
+diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
+index 982d70b..c01e43f 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
++++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
+@@ -681,6 +681,9 @@ struct drm_nouveau_private {
+ /* For PFIFO and PGRAPH. */
+ spinlock_t context_switch_lock;
+
++ /* VM/PRAMIN flush, legacy PRAMIN aperture */
++ spinlock_t vm_lock;
++
+ /* RAMIN configuration, RAMFC, RAMHT and RAMRO offsets */
+ struct nouveau_ramht *ramht;
+ struct nouveau_gpuobj *ramfc;
+diff --git a/drivers/gpu/drm/nouveau/nouveau_object.c b/drivers/gpu/drm/nouveau/nouveau_object.c
+index 30b6544..2002a43 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_object.c
++++ b/drivers/gpu/drm/nouveau/nouveau_object.c
+@@ -1013,19 +1013,20 @@ nv_ro32(struct nouveau_gpuobj *gpuobj, u32 offset)
+ {
+ struct drm_nouveau_private *dev_priv = gpuobj->dev->dev_private;
+ struct drm_device *dev = gpuobj->dev;
++ unsigned long flags;
+
+ if (gpuobj->pinst == ~0 || !dev_priv->ramin_available) {
+ u64 ptr = gpuobj->vinst + offset;
+ u32 base = ptr >> 16;
+ u32 val;
+
+- spin_lock(&dev_priv->ramin_lock);
++ spin_lock_irqsave(&dev_priv->vm_lock, flags);
+ if (dev_priv->ramin_base != base) {
+ dev_priv->ramin_base = base;
+ nv_wr32(dev, 0x001700, dev_priv->ramin_base);
+ }
+ val = nv_rd32(dev, 0x700000 + (ptr & 0xffff));
+- spin_unlock(&dev_priv->ramin_lock);
++ spin_unlock_irqrestore(&dev_priv->vm_lock, flags);
+ return val;
+ }
+
+@@ -1037,18 +1038,19 @@ nv_wo32(struct nouveau_gpuobj *gpuobj, u32 offset, u32 val)
+ {
+ struct drm_nouveau_private *dev_priv = gpuobj->dev->dev_private;
+ struct drm_device *dev = gpuobj->dev;
++ unsigned long flags;
+
+ if (gpuobj->pinst == ~0 || !dev_priv->ramin_available) {
+ u64 ptr = gpuobj->vinst + offset;
+ u32 base = ptr >> 16;
+
+- spin_lock(&dev_priv->ramin_lock);
++ spin_lock_irqsave(&dev_priv->vm_lock, flags);
+ if (dev_priv->ramin_base != base) {
+ dev_priv->ramin_base = base;
+ nv_wr32(dev, 0x001700, dev_priv->ramin_base);
+ }
+ nv_wr32(dev, 0x700000 + (ptr & 0xffff), val);
+- spin_unlock(&dev_priv->ramin_lock);
++ spin_unlock_irqrestore(&dev_priv->vm_lock, flags);
+ return;
+ }
+
+diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
+index a54fc43..a358dc5 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_state.c
++++ b/drivers/gpu/drm/nouveau/nouveau_state.c
+@@ -646,6 +646,7 @@ nouveau_card_init(struct drm_device *dev)
+ spin_lock_init(&dev_priv->channels.lock);
+ spin_lock_init(&dev_priv->tile.lock);
+ spin_lock_init(&dev_priv->context_switch_lock);
++ spin_lock_init(&dev_priv->vm_lock);
+
+ /* Make the CRTCs and I2C buses accessible */
+ ret = engine->display.early_init(dev);
+diff --git a/drivers/gpu/drm/nouveau/nv50_instmem.c b/drivers/gpu/drm/nouveau/nv50_instmem.c
+index e57caa2..53a4b40 100644
+--- a/drivers/gpu/drm/nouveau/nv50_instmem.c
++++ b/drivers/gpu/drm/nouveau/nv50_instmem.c
+@@ -404,23 +404,25 @@ void
+ nv50_instmem_flush(struct drm_device *dev)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
++ unsigned long flags;
+
+- spin_lock(&dev_priv->ramin_lock);
++ spin_lock_irqsave(&dev_priv->vm_lock, flags);
+ nv_wr32(dev, 0x00330c, 0x00000001);
+ if (!nv_wait(dev, 0x00330c, 0x00000002, 0x00000000))
+ NV_ERROR(dev, "PRAMIN flush timeout\n");
+- spin_unlock(&dev_priv->ramin_lock);
++ spin_unlock_irqrestore(&dev_priv->vm_lock, flags);
+ }
+
+ void
+ nv84_instmem_flush(struct drm_device *dev)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
++ unsigned long flags;
+
+- spin_lock(&dev_priv->ramin_lock);
++ spin_lock_irqsave(&dev_priv->vm_lock, flags);
+ nv_wr32(dev, 0x070000, 0x00000001);
+ if (!nv_wait(dev, 0x070000, 0x00000002, 0x00000000))
+ NV_ERROR(dev, "PRAMIN flush timeout\n");
+- spin_unlock(&dev_priv->ramin_lock);
++ spin_unlock_irqrestore(&dev_priv->vm_lock, flags);
+ }
+
+diff --git a/drivers/gpu/drm/nouveau/nv50_vm.c b/drivers/gpu/drm/nouveau/nv50_vm.c
+index 6144156..248496f 100644
+--- a/drivers/gpu/drm/nouveau/nv50_vm.c
++++ b/drivers/gpu/drm/nouveau/nv50_vm.c
+@@ -170,10 +170,11 @@ void
+ nv50_vm_flush_engine(struct drm_device *dev, int engine)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
++ unsigned long flags;
+
+- spin_lock(&dev_priv->ramin_lock);
++ spin_lock_irqsave(&dev_priv->vm_lock, flags);
+ nv_wr32(dev, 0x100c80, (engine << 16) | 1);
+ if (!nv_wait(dev, 0x100c80, 0x00000001, 0x00000000))
+ NV_ERROR(dev, "vm flush timeout: engine %d\n", engine);
+- spin_unlock(&dev_priv->ramin_lock);
++ spin_unlock_irqrestore(&dev_priv->vm_lock, flags);
+ }
+diff --git a/drivers/gpu/drm/nouveau/nvc0_vm.c b/drivers/gpu/drm/nouveau/nvc0_vm.c
+index e4e83c2..10a5a99 100644
+--- a/drivers/gpu/drm/nouveau/nvc0_vm.c
++++ b/drivers/gpu/drm/nouveau/nvc0_vm.c
+@@ -104,20 +104,27 @@ nvc0_vm_flush(struct nouveau_vm *vm)
+ struct nouveau_instmem_engine *pinstmem = &dev_priv->engine.instmem;
+ struct drm_device *dev = vm->dev;
+ struct nouveau_vm_pgd *vpgd;
+- u32 r100c80, engine;
++ unsigned long flags;
++ u32 engine = (dev_priv->chan_vm == vm) ? 1 : 5;
+
+ pinstmem->flush(vm->dev);
+
+- if (vm == dev_priv->chan_vm)
+- engine = 1;
+- else
+- engine = 5;
+-
++ spin_lock_irqsave(&dev_priv->vm_lock, flags);
+ list_for_each_entry(vpgd, &vm->pgd_list, head) {
+- r100c80 = nv_rd32(dev, 0x100c80);
++ /* looks like maybe a "free flush slots" counter, the
++ * faster you write to 0x100cbc to more it decreases
++ */
++ if (!nv_wait_ne(dev, 0x100c80, 0x00ff0000, 0x00000000)) {
++ NV_ERROR(dev, "vm timeout 0: 0x%08x %d\n",
++ nv_rd32(dev, 0x100c80), engine);
++ }
+ nv_wr32(dev, 0x100cb8, vpgd->obj->vinst >> 8);
+ nv_wr32(dev, 0x100cbc, 0x80000000 | engine);
+- if (!nv_wait(dev, 0x100c80, 0xffffffff, r100c80))
+- NV_ERROR(dev, "vm flush timeout eng %d\n", engine);
++ /* wait for flush to be queued? */
++ if (!nv_wait(dev, 0x100c80, 0x00008000, 0x00008000)) {
++ NV_ERROR(dev, "vm timeout 1: 0x%08x %d\n",
++ nv_rd32(dev, 0x100c80), engine);
++ }
+ }
++ spin_unlock_irqrestore(&dev_priv->vm_lock, flags);
+ }
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-nouveau-updates.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-nouveau-updates.patch
new file mode 100644
index 000000000..60f8d4d64
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-nouveau-updates.patch
@@ -0,0 +1,5912 @@
+diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.c b/drivers/gpu/drm/nouveau/nouveau_bios.c
+index 6bdab89..90aef64 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_bios.c
++++ b/drivers/gpu/drm/nouveau/nouveau_bios.c
+@@ -269,7 +269,7 @@ struct init_tbl_entry {
+ int (*handler)(struct nvbios *, uint16_t, struct init_exec *);
+ };
+
+-static int parse_init_table(struct nvbios *, unsigned int, struct init_exec *);
++static int parse_init_table(struct nvbios *, uint16_t, struct init_exec *);
+
+ #define MACRO_INDEX_SIZE 2
+ #define MACRO_SIZE 8
+@@ -282,7 +282,7 @@ static void still_alive(void)
+ {
+ #if 0
+ sync();
+- msleep(2);
++ mdelay(2);
+ #endif
+ }
+
+@@ -1904,7 +1904,7 @@ init_condition_time(struct nvbios *bios, uint16_t offset,
+ BIOSLOG(bios, "0x%04X: "
+ "Condition not met, sleeping for 20ms\n",
+ offset);
+- msleep(20);
++ mdelay(20);
+ }
+ }
+
+@@ -1938,7 +1938,7 @@ init_ltime(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
+ BIOSLOG(bios, "0x%04X: Sleeping for 0x%04X milliseconds\n",
+ offset, time);
+
+- msleep(time);
++ mdelay(time);
+
+ return 3;
+ }
+@@ -2011,6 +2011,27 @@ init_sub_direct(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
+ }
+
+ static int
++init_jump(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
++{
++ /*
++ * INIT_JUMP opcode: 0x5C ('\')
++ *
++ * offset (8 bit): opcode
++ * offset + 1 (16 bit): offset (in bios)
++ *
++ * Continue execution of init table from 'offset'
++ */
++
++ uint16_t jmp_offset = ROM16(bios->data[offset + 1]);
++
++ if (!iexec->execute)
++ return 3;
++
++ BIOSLOG(bios, "0x%04X: Jump to 0x%04X\n", offset, jmp_offset);
++ return jmp_offset - offset;
++}
++
++static int
+ init_i2c_if(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
+ {
+ /*
+@@ -2962,7 +2983,7 @@ init_time(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
+ if (time < 1000)
+ udelay(time);
+ else
+- msleep((time + 900) / 1000);
++ mdelay((time + 900) / 1000);
+
+ return 3;
+ }
+@@ -3659,6 +3680,7 @@ static struct init_tbl_entry itbl_entry[] = {
+ { "INIT_ZM_REG_SEQUENCE" , 0x58, init_zm_reg_sequence },
+ /* INIT_INDIRECT_REG (0x5A, 7, 0, 0) removed due to no example of use */
+ { "INIT_SUB_DIRECT" , 0x5B, init_sub_direct },
++ { "INIT_JUMP" , 0x5C, init_jump },
+ { "INIT_I2C_IF" , 0x5E, init_i2c_if },
+ { "INIT_COPY_NV_REG" , 0x5F, init_copy_nv_reg },
+ { "INIT_ZM_INDEX_IO" , 0x62, init_zm_index_io },
+@@ -3700,8 +3722,7 @@ static struct init_tbl_entry itbl_entry[] = {
+ #define MAX_TABLE_OPS 1000
+
+ static int
+-parse_init_table(struct nvbios *bios, unsigned int offset,
+- struct init_exec *iexec)
++parse_init_table(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
+ {
+ /*
+ * Parses all commands in an init table.
+@@ -3856,7 +3877,7 @@ static int call_lvds_manufacturer_script(struct drm_device *dev, struct dcb_entr
+
+ if (script == LVDS_PANEL_OFF) {
+ /* off-on delay in ms */
+- msleep(ROM16(bios->data[bios->fp.xlated_entry + 7]));
++ mdelay(ROM16(bios->data[bios->fp.xlated_entry + 7]));
+ }
+ #ifdef __powerpc__
+ /* Powerbook specific quirks */
+@@ -5950,6 +5971,11 @@ apply_dcb_connector_quirks(struct nvbios *bios, int idx)
+ }
+ }
+
++static const u8 hpd_gpio[16] = {
++ 0xff, 0x07, 0x08, 0xff, 0xff, 0x51, 0x52, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0x5e, 0x5f, 0x60,
++};
++
+ static void
+ parse_dcb_connector_table(struct nvbios *bios)
+ {
+@@ -5986,23 +6012,9 @@ parse_dcb_connector_table(struct nvbios *bios)
+
+ cte->type = (cte->entry & 0x000000ff) >> 0;
+ cte->index2 = (cte->entry & 0x00000f00) >> 8;
+- switch (cte->entry & 0x00033000) {
+- case 0x00001000:
+- cte->gpio_tag = 0x07;
+- break;
+- case 0x00002000:
+- cte->gpio_tag = 0x08;
+- break;
+- case 0x00010000:
+- cte->gpio_tag = 0x51;
+- break;
+- case 0x00020000:
+- cte->gpio_tag = 0x52;
+- break;
+- default:
+- cte->gpio_tag = 0xff;
+- break;
+- }
++
++ cte->gpio_tag = ffs((cte->entry & 0x07033000) >> 12);
++ cte->gpio_tag = hpd_gpio[cte->gpio_tag];
+
+ if (cte->type == 0xff)
+ continue;
+@@ -6342,6 +6354,32 @@ apply_dcb_encoder_quirks(struct drm_device *dev, int idx, u32 *conn, u32 *conf)
+ }
+ }
+
++ /* XFX GT-240X-YA
++ *
++ * So many things wrong here, replace the entire encoder table..
++ */
++ if (nv_match_device(dev, 0x0ca3, 0x1682, 0x3003)) {
++ if (idx == 0) {
++ *conn = 0x02001300; /* VGA, connector 1 */
++ *conf = 0x00000028;
++ } else
++ if (idx == 1) {
++ *conn = 0x01010312; /* DVI, connector 0 */
++ *conf = 0x00020030;
++ } else
++ if (idx == 2) {
++ *conn = 0x01010310; /* VGA, connector 0 */
++ *conf = 0x00000028;
++ } else
++ if (idx == 3) {
++ *conn = 0x02022362; /* HDMI, connector 2 */
++ *conf = 0x00020010;
++ } else {
++ *conn = 0x0000000e; /* EOL */
++ *conf = 0x00000000;
++ }
++ }
++
+ return true;
+ }
+
+@@ -6702,11 +6740,11 @@ nouveau_bios_run_init_table(struct drm_device *dev, uint16_t table,
+ struct nvbios *bios = &dev_priv->vbios;
+ struct init_exec iexec = { true, false };
+
+- mutex_lock(&bios->lock);
++ spin_lock_bh(&bios->lock);
+ bios->display.output = dcbent;
+ parse_init_table(bios, table, &iexec);
+ bios->display.output = NULL;
+- mutex_unlock(&bios->lock);
++ spin_unlock_bh(&bios->lock);
+ }
+
+ static bool NVInitVBIOS(struct drm_device *dev)
+@@ -6715,7 +6753,7 @@ static bool NVInitVBIOS(struct drm_device *dev)
+ struct nvbios *bios = &dev_priv->vbios;
+
+ memset(bios, 0, sizeof(struct nvbios));
+- mutex_init(&bios->lock);
++ spin_lock_init(&bios->lock);
+ bios->dev = dev;
+
+ if (!NVShadowVBIOS(dev, bios->data))
+diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.h b/drivers/gpu/drm/nouveau/nouveau_bios.h
+index 50a648e..8a54fa7 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_bios.h
++++ b/drivers/gpu/drm/nouveau/nouveau_bios.h
+@@ -251,7 +251,7 @@ struct nvbios {
+ uint8_t digital_min_front_porch;
+ bool fp_no_ddc;
+
+- struct mutex lock;
++ spinlock_t lock;
+
+ uint8_t data[NV_PROM_SIZE];
+ unsigned int length;
+diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
+index a521840..2ad49cb 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
++++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
+@@ -57,8 +57,8 @@ nouveau_bo_del_ttm(struct ttm_buffer_object *bo)
+ }
+
+ static void
+-nouveau_bo_fixup_align(struct nouveau_bo *nvbo, int *align, int *size,
+- int *page_shift)
++nouveau_bo_fixup_align(struct nouveau_bo *nvbo, u32 flags,
++ int *align, int *size, int *page_shift)
+ {
+ struct drm_nouveau_private *dev_priv = nouveau_bdev(nvbo->bo.bdev);
+
+@@ -83,7 +83,7 @@ nouveau_bo_fixup_align(struct nouveau_bo *nvbo, int *align, int *size,
+ }
+ } else {
+ if (likely(dev_priv->chan_vm)) {
+- if (*size > 256 * 1024)
++ if (!(flags & TTM_PL_FLAG_TT) && *size > 256 * 1024)
+ *page_shift = dev_priv->chan_vm->lpg_shift;
+ else
+ *page_shift = dev_priv->chan_vm->spg_shift;
+@@ -101,8 +101,7 @@ nouveau_bo_fixup_align(struct nouveau_bo *nvbo, int *align, int *size,
+ int
+ nouveau_bo_new(struct drm_device *dev, struct nouveau_channel *chan,
+ int size, int align, uint32_t flags, uint32_t tile_mode,
+- uint32_t tile_flags, bool no_vm, bool mappable,
+- struct nouveau_bo **pnvbo)
++ uint32_t tile_flags, struct nouveau_bo **pnvbo)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+ struct nouveau_bo *nvbo;
+@@ -113,16 +112,14 @@ nouveau_bo_new(struct drm_device *dev, struct nouveau_channel *chan,
+ return -ENOMEM;
+ INIT_LIST_HEAD(&nvbo->head);
+ INIT_LIST_HEAD(&nvbo->entry);
+- nvbo->mappable = mappable;
+- nvbo->no_vm = no_vm;
+ nvbo->tile_mode = tile_mode;
+ nvbo->tile_flags = tile_flags;
+ nvbo->bo.bdev = &dev_priv->ttm.bdev;
+
+- nouveau_bo_fixup_align(nvbo, &align, &size, &page_shift);
++ nouveau_bo_fixup_align(nvbo, flags, &align, &size, &page_shift);
+ align >>= PAGE_SHIFT;
+
+- if (!nvbo->no_vm && dev_priv->chan_vm) {
++ if (dev_priv->chan_vm) {
+ ret = nouveau_vm_get(dev_priv->chan_vm, size, page_shift,
+ NV_MEM_ACCESS_RW, &nvbo->vma);
+ if (ret) {
+@@ -144,11 +141,8 @@ nouveau_bo_new(struct drm_device *dev, struct nouveau_channel *chan,
+ }
+ nvbo->channel = NULL;
+
+- if (nvbo->vma.node) {
+- if (nvbo->bo.mem.mem_type == TTM_PL_VRAM)
+- nvbo->bo.offset = nvbo->vma.offset;
+- }
+-
++ if (nvbo->vma.node)
++ nvbo->bo.offset = nvbo->vma.offset;
+ *pnvbo = nvbo;
+ return 0;
+ }
+@@ -318,11 +312,8 @@ nouveau_bo_validate(struct nouveau_bo *nvbo, bool interruptible,
+ if (ret)
+ return ret;
+
+- if (nvbo->vma.node) {
+- if (nvbo->bo.mem.mem_type == TTM_PL_VRAM)
+- nvbo->bo.offset = nvbo->vma.offset;
+- }
+-
++ if (nvbo->vma.node)
++ nvbo->bo.offset = nvbo->vma.offset;
+ return 0;
+ }
+
+@@ -385,7 +376,8 @@ nouveau_bo_create_ttm_backend_entry(struct ttm_bo_device *bdev)
+ case NOUVEAU_GART_AGP:
+ return ttm_agp_backend_init(bdev, dev->agp->bridge);
+ #endif
+- case NOUVEAU_GART_SGDMA:
++ case NOUVEAU_GART_PDMA:
++ case NOUVEAU_GART_HW:
+ return nouveau_sgdma_init_ttm(dev);
+ default:
+ NV_ERROR(dev, "Unknown GART type %d\n",
+@@ -431,7 +423,10 @@ nouveau_bo_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
+ man->default_caching = TTM_PL_FLAG_WC;
+ break;
+ case TTM_PL_TT:
+- man->func = &ttm_bo_manager_func;
++ if (dev_priv->card_type >= NV_50)
++ man->func = &nouveau_gart_manager;
++ else
++ man->func = &ttm_bo_manager_func;
+ switch (dev_priv->gart_info.type) {
+ case NOUVEAU_GART_AGP:
+ man->flags = TTM_MEMTYPE_FLAG_MAPPABLE;
+@@ -439,7 +434,8 @@ nouveau_bo_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
+ TTM_PL_FLAG_WC;
+ man->default_caching = TTM_PL_FLAG_WC;
+ break;
+- case NOUVEAU_GART_SGDMA:
++ case NOUVEAU_GART_PDMA:
++ case NOUVEAU_GART_HW:
+ man->flags = TTM_MEMTYPE_FLAG_MAPPABLE |
+ TTM_MEMTYPE_FLAG_CMA;
+ man->available_caching = TTM_PL_MASK_CACHING;
+@@ -501,45 +497,22 @@ nouveau_bo_move_accel_cleanup(struct nouveau_channel *chan,
+ return ret;
+ }
+
+-static inline uint32_t
+-nouveau_bo_mem_ctxdma(struct ttm_buffer_object *bo,
+- struct nouveau_channel *chan, struct ttm_mem_reg *mem)
+-{
+- struct nouveau_bo *nvbo = nouveau_bo(bo);
+-
+- if (nvbo->no_vm) {
+- if (mem->mem_type == TTM_PL_TT)
+- return NvDmaGART;
+- return NvDmaVRAM;
+- }
+-
+- if (mem->mem_type == TTM_PL_TT)
+- return chan->gart_handle;
+- return chan->vram_handle;
+-}
+-
+ static int
+ nvc0_bo_move_m2mf(struct nouveau_channel *chan, struct ttm_buffer_object *bo,
+ struct ttm_mem_reg *old_mem, struct ttm_mem_reg *new_mem)
+ {
+- struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
++ struct nouveau_mem *old_node = old_mem->mm_node;
++ struct nouveau_mem *new_node = new_mem->mm_node;
+ struct nouveau_bo *nvbo = nouveau_bo(bo);
+- u64 src_offset = old_mem->start << PAGE_SHIFT;
+- u64 dst_offset = new_mem->start << PAGE_SHIFT;
+ u32 page_count = new_mem->num_pages;
++ u64 src_offset, dst_offset;
+ int ret;
+
+- if (!nvbo->no_vm) {
+- if (old_mem->mem_type == TTM_PL_VRAM)
+- src_offset = nvbo->vma.offset;
+- else
+- src_offset += dev_priv->gart_info.aper_base;
+-
+- if (new_mem->mem_type == TTM_PL_VRAM)
+- dst_offset = nvbo->vma.offset;
+- else
+- dst_offset += dev_priv->gart_info.aper_base;
+- }
++ src_offset = old_node->tmp_vma.offset;
++ if (new_node->tmp_vma.node)
++ dst_offset = new_node->tmp_vma.offset;
++ else
++ dst_offset = nvbo->vma.offset;
+
+ page_count = new_mem->num_pages;
+ while (page_count) {
+@@ -574,33 +547,18 @@ static int
+ nv50_bo_move_m2mf(struct nouveau_channel *chan, struct ttm_buffer_object *bo,
+ struct ttm_mem_reg *old_mem, struct ttm_mem_reg *new_mem)
+ {
+- struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
++ struct nouveau_mem *old_node = old_mem->mm_node;
++ struct nouveau_mem *new_node = new_mem->mm_node;
+ struct nouveau_bo *nvbo = nouveau_bo(bo);
+ u64 length = (new_mem->num_pages << PAGE_SHIFT);
+ u64 src_offset, dst_offset;
+ int ret;
+
+- src_offset = old_mem->start << PAGE_SHIFT;
+- dst_offset = new_mem->start << PAGE_SHIFT;
+- if (!nvbo->no_vm) {
+- if (old_mem->mem_type == TTM_PL_VRAM)
+- src_offset = nvbo->vma.offset;
+- else
+- src_offset += dev_priv->gart_info.aper_base;
+-
+- if (new_mem->mem_type == TTM_PL_VRAM)
+- dst_offset = nvbo->vma.offset;
+- else
+- dst_offset += dev_priv->gart_info.aper_base;
+- }
+-
+- ret = RING_SPACE(chan, 3);
+- if (ret)
+- return ret;
+-
+- BEGIN_RING(chan, NvSubM2MF, 0x0184, 2);
+- OUT_RING (chan, nouveau_bo_mem_ctxdma(bo, chan, old_mem));
+- OUT_RING (chan, nouveau_bo_mem_ctxdma(bo, chan, new_mem));
++ src_offset = old_node->tmp_vma.offset;
++ if (new_node->tmp_vma.node)
++ dst_offset = new_node->tmp_vma.offset;
++ else
++ dst_offset = nvbo->vma.offset;
+
+ while (length) {
+ u32 amount, stride, height;
+@@ -681,6 +639,15 @@ nv50_bo_move_m2mf(struct nouveau_channel *chan, struct ttm_buffer_object *bo,
+ return 0;
+ }
+
++static inline uint32_t
++nouveau_bo_mem_ctxdma(struct ttm_buffer_object *bo,
++ struct nouveau_channel *chan, struct ttm_mem_reg *mem)
++{
++ if (mem->mem_type == TTM_PL_TT)
++ return chan->gart_handle;
++ return chan->vram_handle;
++}
++
+ static int
+ nv04_bo_move_m2mf(struct nouveau_channel *chan, struct ttm_buffer_object *bo,
+ struct ttm_mem_reg *old_mem, struct ttm_mem_reg *new_mem)
+@@ -734,15 +701,43 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr,
+ {
+ struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
+ struct nouveau_bo *nvbo = nouveau_bo(bo);
++ struct ttm_mem_reg *old_mem = &bo->mem;
+ struct nouveau_channel *chan;
+ int ret;
+
+ chan = nvbo->channel;
+- if (!chan || nvbo->no_vm) {
++ if (!chan) {
+ chan = dev_priv->channel;
+ mutex_lock_nested(&chan->mutex, NOUVEAU_KCHANNEL_MUTEX);
+ }
+
++ /* create temporary vma for old memory, this will get cleaned
++ * up after ttm destroys the ttm_mem_reg
++ */
++ if (dev_priv->card_type >= NV_50) {
++ struct nouveau_mem *node = old_mem->mm_node;
++ if (!node->tmp_vma.node) {
++ u32 page_shift = nvbo->vma.node->type;
++ if (old_mem->mem_type == TTM_PL_TT)
++ page_shift = nvbo->vma.vm->spg_shift;
++
++ ret = nouveau_vm_get(chan->vm,
++ old_mem->num_pages << PAGE_SHIFT,
++ page_shift, NV_MEM_ACCESS_RO,
++ &node->tmp_vma);
++ if (ret)
++ goto out;
++ }
++
++ if (old_mem->mem_type == TTM_PL_VRAM)
++ nouveau_vm_map(&node->tmp_vma, node);
++ else {
++ nouveau_vm_map_sg(&node->tmp_vma, 0,
++ old_mem->num_pages << PAGE_SHIFT,
++ node, node->pages);
++ }
++ }
++
+ if (dev_priv->card_type < NV_50)
+ ret = nv04_bo_move_m2mf(chan, bo, &bo->mem, new_mem);
+ else
+@@ -756,6 +751,7 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr,
+ no_wait_gpu, new_mem);
+ }
+
++out:
+ if (chan == dev_priv->channel)
+ mutex_unlock(&chan->mutex);
+ return ret;
+@@ -766,6 +762,7 @@ nouveau_bo_move_flipd(struct ttm_buffer_object *bo, bool evict, bool intr,
+ bool no_wait_reserve, bool no_wait_gpu,
+ struct ttm_mem_reg *new_mem)
+ {
++ struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
+ u32 placement_memtype = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING;
+ struct ttm_placement placement;
+ struct ttm_mem_reg tmp_mem;
+@@ -785,7 +782,23 @@ nouveau_bo_move_flipd(struct ttm_buffer_object *bo, bool evict, bool intr,
+ if (ret)
+ goto out;
+
++ if (dev_priv->card_type >= NV_50) {
++ struct nouveau_bo *nvbo = nouveau_bo(bo);
++ struct nouveau_mem *node = tmp_mem.mm_node;
++ struct nouveau_vma *vma = &nvbo->vma;
++ if (vma->node->type != vma->vm->spg_shift)
++ vma = &node->tmp_vma;
++ nouveau_vm_map_sg(vma, 0, tmp_mem.num_pages << PAGE_SHIFT,
++ node, node->pages);
++ }
++
+ ret = nouveau_bo_move_m2mf(bo, true, intr, no_wait_reserve, no_wait_gpu, &tmp_mem);
++
++ if (dev_priv->card_type >= NV_50) {
++ struct nouveau_bo *nvbo = nouveau_bo(bo);
++ nouveau_vm_unmap(&nvbo->vma);
++ }
++
+ if (ret)
+ goto out;
+
+@@ -828,6 +841,36 @@ out:
+ return ret;
+ }
+
++static void
++nouveau_bo_move_ntfy(struct ttm_buffer_object *bo, struct ttm_mem_reg *new_mem)
++{
++ struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
++ struct nouveau_mem *node = new_mem->mm_node;
++ struct nouveau_bo *nvbo = nouveau_bo(bo);
++ struct nouveau_vma *vma = &nvbo->vma;
++ struct nouveau_vm *vm = vma->vm;
++
++ if (dev_priv->card_type < NV_50)
++ return;
++
++ switch (new_mem->mem_type) {
++ case TTM_PL_VRAM:
++ nouveau_vm_map(vma, node);
++ break;
++ case TTM_PL_TT:
++ if (vma->node->type != vm->spg_shift) {
++ nouveau_vm_unmap(vma);
++ vma = &node->tmp_vma;
++ }
++ nouveau_vm_map_sg(vma, 0, new_mem->num_pages << PAGE_SHIFT,
++ node, node->pages);
++ break;
++ default:
++ nouveau_vm_unmap(&nvbo->vma);
++ break;
++ }
++}
++
+ static int
+ nouveau_bo_vm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *new_mem,
+ struct nouveau_tile_reg **new_tile)
+@@ -835,19 +878,13 @@ nouveau_bo_vm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *new_mem,
+ struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
+ struct drm_device *dev = dev_priv->dev;
+ struct nouveau_bo *nvbo = nouveau_bo(bo);
+- uint64_t offset;
++ u64 offset = new_mem->start << PAGE_SHIFT;
+
+- if (nvbo->no_vm || new_mem->mem_type != TTM_PL_VRAM) {
+- /* Nothing to do. */
+- *new_tile = NULL;
++ *new_tile = NULL;
++ if (new_mem->mem_type != TTM_PL_VRAM)
+ return 0;
+- }
+-
+- offset = new_mem->start << PAGE_SHIFT;
+
+- if (dev_priv->chan_vm) {
+- nouveau_vm_map(&nvbo->vma, new_mem->mm_node);
+- } else if (dev_priv->card_type >= NV_10) {
++ if (dev_priv->card_type >= NV_10) {
+ *new_tile = nv10_mem_set_tiling(dev, offset, new_mem->size,
+ nvbo->tile_mode,
+ nvbo->tile_flags);
+@@ -864,11 +901,8 @@ nouveau_bo_vm_cleanup(struct ttm_buffer_object *bo,
+ struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
+ struct drm_device *dev = dev_priv->dev;
+
+- if (dev_priv->card_type >= NV_10 &&
+- dev_priv->card_type < NV_50) {
+- nv10_mem_put_tile_region(dev, *old_tile, bo->sync_obj);
+- *old_tile = new_tile;
+- }
++ nv10_mem_put_tile_region(dev, *old_tile, bo->sync_obj);
++ *old_tile = new_tile;
+ }
+
+ static int
+@@ -882,9 +916,11 @@ nouveau_bo_move(struct ttm_buffer_object *bo, bool evict, bool intr,
+ struct nouveau_tile_reg *new_tile = NULL;
+ int ret = 0;
+
+- ret = nouveau_bo_vm_bind(bo, new_mem, &new_tile);
+- if (ret)
+- return ret;
++ if (dev_priv->card_type < NV_50) {
++ ret = nouveau_bo_vm_bind(bo, new_mem, &new_tile);
++ if (ret)
++ return ret;
++ }
+
+ /* Fake bo copy. */
+ if (old_mem->mem_type == TTM_PL_SYSTEM && !bo->ttm) {
+@@ -915,10 +951,12 @@ nouveau_bo_move(struct ttm_buffer_object *bo, bool evict, bool intr,
+ ret = ttm_bo_move_memcpy(bo, evict, no_wait_reserve, no_wait_gpu, new_mem);
+
+ out:
+- if (ret)
+- nouveau_bo_vm_cleanup(bo, NULL, &new_tile);
+- else
+- nouveau_bo_vm_cleanup(bo, new_tile, &nvbo->tile);
++ if (dev_priv->card_type < NV_50) {
++ if (ret)
++ nouveau_bo_vm_cleanup(bo, NULL, &new_tile);
++ else
++ nouveau_bo_vm_cleanup(bo, new_tile, &nvbo->tile);
++ }
+
+ return ret;
+ }
+@@ -959,7 +997,7 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
+ break;
+ case TTM_PL_VRAM:
+ {
+- struct nouveau_vram *vram = mem->mm_node;
++ struct nouveau_mem *node = mem->mm_node;
+ u8 page_shift;
+
+ if (!dev_priv->bar1_vm) {
+@@ -970,23 +1008,23 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
+ }
+
+ if (dev_priv->card_type == NV_C0)
+- page_shift = vram->page_shift;
++ page_shift = node->page_shift;
+ else
+ page_shift = 12;
+
+ ret = nouveau_vm_get(dev_priv->bar1_vm, mem->bus.size,
+ page_shift, NV_MEM_ACCESS_RW,
+- &vram->bar_vma);
++ &node->bar_vma);
+ if (ret)
+ return ret;
+
+- nouveau_vm_map(&vram->bar_vma, vram);
++ nouveau_vm_map(&node->bar_vma, node);
+ if (ret) {
+- nouveau_vm_put(&vram->bar_vma);
++ nouveau_vm_put(&node->bar_vma);
+ return ret;
+ }
+
+- mem->bus.offset = vram->bar_vma.offset;
++ mem->bus.offset = node->bar_vma.offset;
+ if (dev_priv->card_type == NV_50) /*XXX*/
+ mem->bus.offset -= 0x0020000000ULL;
+ mem->bus.base = pci_resource_start(dev->pdev, 1);
+@@ -1003,16 +1041,16 @@ static void
+ nouveau_ttm_io_mem_free(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
+ {
+ struct drm_nouveau_private *dev_priv = nouveau_bdev(bdev);
+- struct nouveau_vram *vram = mem->mm_node;
++ struct nouveau_mem *node = mem->mm_node;
+
+ if (!dev_priv->bar1_vm || mem->mem_type != TTM_PL_VRAM)
+ return;
+
+- if (!vram->bar_vma.node)
++ if (!node->bar_vma.node)
+ return;
+
+- nouveau_vm_unmap(&vram->bar_vma);
+- nouveau_vm_put(&vram->bar_vma);
++ nouveau_vm_unmap(&node->bar_vma);
++ nouveau_vm_put(&node->bar_vma);
+ }
+
+ static int
+@@ -1062,6 +1100,7 @@ struct ttm_bo_driver nouveau_bo_driver = {
+ .invalidate_caches = nouveau_bo_invalidate_caches,
+ .init_mem_type = nouveau_bo_init_mem_type,
+ .evict_flags = nouveau_bo_evict_flags,
++ .move_notify = nouveau_bo_move_ntfy,
+ .move = nouveau_bo_move,
+ .verify_access = nouveau_bo_verify_access,
+ .sync_obj_signaled = __nouveau_fence_signalled,
+diff --git a/drivers/gpu/drm/nouveau/nouveau_channel.c b/drivers/gpu/drm/nouveau/nouveau_channel.c
+index 3960d66..3837090 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_channel.c
++++ b/drivers/gpu/drm/nouveau/nouveau_channel.c
+@@ -35,7 +35,7 @@ nouveau_channel_pushbuf_ctxdma_init(struct nouveau_channel *chan)
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+ struct nouveau_bo *pb = chan->pushbuf_bo;
+ struct nouveau_gpuobj *pushbuf = NULL;
+- int ret;
++ int ret = 0;
+
+ if (dev_priv->card_type >= NV_50) {
+ if (dev_priv->card_type < NV_C0) {
+@@ -90,8 +90,7 @@ nouveau_channel_user_pushbuf_alloc(struct drm_device *dev)
+ else
+ location = TTM_PL_FLAG_TT;
+
+- ret = nouveau_bo_new(dev, NULL, 65536, 0, location, 0, 0x0000, false,
+- true, &pushbuf);
++ ret = nouveau_bo_new(dev, NULL, 65536, 0, location, 0, 0x0000, &pushbuf);
+ if (ret) {
+ NV_ERROR(dev, "error allocating DMA push buffer: %d\n", ret);
+ return NULL;
+diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
+index 505c6bf..764c15d 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_display.c
++++ b/drivers/gpu/drm/nouveau/nouveau_display.c
+@@ -32,6 +32,7 @@
+ #include "nouveau_hw.h"
+ #include "nouveau_crtc.h"
+ #include "nouveau_dma.h"
++#include "nv50_display.h"
+
+ static void
+ nouveau_user_framebuffer_destroy(struct drm_framebuffer *drm_fb)
+@@ -61,18 +62,59 @@ static const struct drm_framebuffer_funcs nouveau_framebuffer_funcs = {
+ };
+
+ int
+-nouveau_framebuffer_init(struct drm_device *dev, struct nouveau_framebuffer *nouveau_fb,
+- struct drm_mode_fb_cmd *mode_cmd, struct nouveau_bo *nvbo)
++nouveau_framebuffer_init(struct drm_device *dev,
++ struct nouveau_framebuffer *nv_fb,
++ struct drm_mode_fb_cmd *mode_cmd,
++ struct nouveau_bo *nvbo)
+ {
++ struct drm_nouveau_private *dev_priv = dev->dev_private;
++ struct drm_framebuffer *fb = &nv_fb->base;
+ int ret;
+
+- ret = drm_framebuffer_init(dev, &nouveau_fb->base, &nouveau_framebuffer_funcs);
++ ret = drm_framebuffer_init(dev, fb, &nouveau_framebuffer_funcs);
+ if (ret) {
+ return ret;
+ }
+
+- drm_helper_mode_fill_fb_struct(&nouveau_fb->base, mode_cmd);
+- nouveau_fb->nvbo = nvbo;
++ drm_helper_mode_fill_fb_struct(fb, mode_cmd);
++ nv_fb->nvbo = nvbo;
++
++ if (dev_priv->card_type >= NV_50) {
++ u32 tile_flags = nouveau_bo_tile_layout(nvbo);
++ if (tile_flags == 0x7a00 ||
++ tile_flags == 0xfe00)
++ nv_fb->r_dma = NvEvoFB32;
++ else
++ if (tile_flags == 0x7000)
++ nv_fb->r_dma = NvEvoFB16;
++ else
++ nv_fb->r_dma = NvEvoVRAM_LP;
++
++ switch (fb->depth) {
++ case 8: nv_fb->r_format = NV50_EVO_CRTC_FB_DEPTH_8; break;
++ case 15: nv_fb->r_format = NV50_EVO_CRTC_FB_DEPTH_15; break;
++ case 16: nv_fb->r_format = NV50_EVO_CRTC_FB_DEPTH_16; break;
++ case 24:
++ case 32: nv_fb->r_format = NV50_EVO_CRTC_FB_DEPTH_24; break;
++ case 30: nv_fb->r_format = NV50_EVO_CRTC_FB_DEPTH_30; break;
++ default:
++ NV_ERROR(dev, "unknown depth %d\n", fb->depth);
++ return -EINVAL;
++ }
++
++ if (dev_priv->chipset == 0x50)
++ nv_fb->r_format |= (tile_flags << 8);
++
++ if (!tile_flags)
++ nv_fb->r_pitch = 0x00100000 | fb->pitch;
++ else {
++ u32 mode = nvbo->tile_mode;
++ if (dev_priv->card_type >= NV_C0)
++ mode >>= 4;
++ nv_fb->r_pitch = ((fb->pitch / 4) << 4) | mode;
++ }
++ }
++
+ return 0;
+ }
+
+@@ -182,6 +224,7 @@ nouveau_page_flip_emit(struct nouveau_channel *chan,
+ struct nouveau_page_flip_state *s,
+ struct nouveau_fence **pfence)
+ {
++ struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
+ struct drm_device *dev = chan->dev;
+ unsigned long flags;
+ int ret;
+@@ -201,9 +244,12 @@ nouveau_page_flip_emit(struct nouveau_channel *chan,
+ if (ret)
+ goto fail;
+
+- BEGIN_RING(chan, NvSubSw, NV_SW_PAGE_FLIP, 1);
+- OUT_RING(chan, 0);
+- FIRE_RING(chan);
++ if (dev_priv->card_type < NV_C0)
++ BEGIN_RING(chan, NvSubSw, NV_SW_PAGE_FLIP, 1);
++ else
++ BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0500, 1);
++ OUT_RING (chan, 0);
++ FIRE_RING (chan);
+
+ ret = nouveau_fence_new(chan, pfence, true);
+ if (ret)
+@@ -244,7 +290,7 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
+
+ /* Initialize a page flip struct */
+ *s = (struct nouveau_page_flip_state)
+- { { }, s->event, nouveau_crtc(crtc)->index,
++ { { }, event, nouveau_crtc(crtc)->index,
+ fb->bits_per_pixel, fb->pitch, crtc->x, crtc->y,
+ new_bo->bo.offset };
+
+@@ -255,6 +301,14 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
+ mutex_lock(&chan->mutex);
+
+ /* Emit a page flip */
++ if (dev_priv->card_type >= NV_50) {
++ ret = nv50_display_flip_next(crtc, fb, chan);
++ if (ret) {
++ nouveau_channel_put(&chan);
++ goto fail_unreserve;
++ }
++ }
++
+ ret = nouveau_page_flip_emit(chan, old_bo, new_bo, s, &fence);
+ nouveau_channel_put(&chan);
+ if (ret)
+@@ -305,7 +359,8 @@ nouveau_finish_page_flip(struct nouveau_channel *chan,
+ }
+
+ list_del(&s->head);
+- *ps = *s;
++ if (ps)
++ *ps = *s;
+ kfree(s);
+
+ spin_unlock_irqrestore(&dev->event_lock, flags);
+diff --git a/drivers/gpu/drm/nouveau/nouveau_dma.c b/drivers/gpu/drm/nouveau/nouveau_dma.c
+index b368ed7..ce38e97 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_dma.c
++++ b/drivers/gpu/drm/nouveau/nouveau_dma.c
+@@ -97,13 +97,15 @@ nouveau_dma_init(struct nouveau_channel *chan)
+ OUT_RING(chan, 0);
+
+ /* Initialise NV_MEMORY_TO_MEMORY_FORMAT */
+- ret = RING_SPACE(chan, 4);
++ ret = RING_SPACE(chan, 6);
+ if (ret)
+ return ret;
+ BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_NAME, 1);
+- OUT_RING(chan, NvM2MF);
+- BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 1);
+- OUT_RING(chan, NvNotify0);
++ OUT_RING (chan, NvM2MF);
++ BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 3);
++ OUT_RING (chan, NvNotify0);
++ OUT_RING (chan, chan->vram_handle);
++ OUT_RING (chan, chan->gart_handle);
+
+ /* Sit back and pray the channel works.. */
+ FIRE_RING(chan);
+diff --git a/drivers/gpu/drm/nouveau/nouveau_dma.h b/drivers/gpu/drm/nouveau/nouveau_dma.h
+index c36f176..23d4edf 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_dma.h
++++ b/drivers/gpu/drm/nouveau/nouveau_dma.h
+@@ -61,8 +61,6 @@ enum {
+ NvM2MF = 0x80000001,
+ NvDmaFB = 0x80000002,
+ NvDmaTT = 0x80000003,
+- NvDmaVRAM = 0x80000004,
+- NvDmaGART = 0x80000005,
+ NvNotify0 = 0x80000006,
+ Nv2D = 0x80000007,
+ NvCtxSurf2D = 0x80000008,
+@@ -73,12 +71,15 @@ enum {
+ NvImageBlit = 0x8000000d,
+ NvSw = 0x8000000e,
+ NvSema = 0x8000000f,
++ NvEvoSema0 = 0x80000010,
++ NvEvoSema1 = 0x80000011,
+
+ /* G80+ display objects */
+ NvEvoVRAM = 0x01000000,
+ NvEvoFB16 = 0x01000001,
+ NvEvoFB32 = 0x01000002,
+- NvEvoVRAM_LP = 0x01000003
++ NvEvoVRAM_LP = 0x01000003,
++ NvEvoSync = 0xcafe0000
+ };
+
+ #define NV_MEMORY_TO_MEMORY_FORMAT 0x00000039
+diff --git a/drivers/gpu/drm/nouveau/nouveau_dp.c b/drivers/gpu/drm/nouveau/nouveau_dp.c
+index 38d5995..7beb82a 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_dp.c
++++ b/drivers/gpu/drm/nouveau/nouveau_dp.c
+@@ -175,7 +175,6 @@ nouveau_dp_link_train_adjust(struct drm_encoder *encoder, uint8_t *config)
+ {
+ struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
+ struct drm_device *dev = encoder->dev;
+- struct bit_displayport_encoder_table_entry *dpse;
+ struct bit_displayport_encoder_table *dpe;
+ int ret, i, dpe_headerlen, vs = 0, pre = 0;
+ uint8_t request[2];
+@@ -183,7 +182,6 @@ nouveau_dp_link_train_adjust(struct drm_encoder *encoder, uint8_t *config)
+ dpe = nouveau_bios_dp_table(dev, nv_encoder->dcb, &dpe_headerlen);
+ if (!dpe)
+ return false;
+- dpse = (void *)((char *)dpe + dpe_headerlen);
+
+ ret = auxch_rd(encoder, DP_ADJUST_REQUEST_LANE0_1, request, 2);
+ if (ret)
+diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
+index 982d70b..e172d72 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
++++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
+@@ -57,7 +57,7 @@ struct nouveau_fpriv {
+ #include "nouveau_util.h"
+
+ struct nouveau_grctx;
+-struct nouveau_vram;
++struct nouveau_mem;
+ #include "nouveau_vm.h"
+
+ #define MAX_NUM_DCB_ENTRIES 16
+@@ -65,13 +65,16 @@ struct nouveau_vram;
+ #define NOUVEAU_MAX_CHANNEL_NR 128
+ #define NOUVEAU_MAX_TILE_NR 15
+
+-struct nouveau_vram {
++struct nouveau_mem {
+ struct drm_device *dev;
+
+ struct nouveau_vma bar_vma;
++ struct nouveau_vma tmp_vma;
+ u8 page_shift;
+
++ struct drm_mm_node *tag;
+ struct list_head regions;
++ dma_addr_t *pages;
+ u32 memtype;
+ u64 offset;
+ u64 size;
+@@ -90,6 +93,7 @@ struct nouveau_tile_reg {
+ struct nouveau_bo {
+ struct ttm_buffer_object bo;
+ struct ttm_placement placement;
++ u32 valid_domains;
+ u32 placements[3];
+ u32 busy_placements[3];
+ struct ttm_bo_kmap_obj kmap;
+@@ -104,8 +108,6 @@ struct nouveau_bo {
+ struct nouveau_channel *channel;
+
+ struct nouveau_vma vma;
+- bool mappable;
+- bool no_vm;
+
+ uint32_t tile_mode;
+ uint32_t tile_flags;
+@@ -387,6 +389,7 @@ struct nouveau_pgraph_engine {
+ };
+
+ struct nouveau_display_engine {
++ void *priv;
+ int (*early_init)(struct drm_device *);
+ void (*late_takedown)(struct drm_device *);
+ int (*create)(struct drm_device *);
+@@ -463,6 +466,7 @@ struct nouveau_pm_memtiming {
+ u32 reg_100234;
+ u32 reg_100238;
+ u32 reg_10023c;
++ u32 reg_100240;
+ };
+
+ struct nouveau_pm_memtimings {
+@@ -509,8 +513,8 @@ struct nouveau_crypt_engine {
+ struct nouveau_vram_engine {
+ int (*init)(struct drm_device *);
+ int (*get)(struct drm_device *, u64, u32 align, u32 size_nc,
+- u32 type, struct nouveau_vram **);
+- void (*put)(struct drm_device *, struct nouveau_vram **);
++ u32 type, struct nouveau_mem **);
++ void (*put)(struct drm_device *, struct nouveau_mem **);
+
+ bool (*flags_valid)(struct drm_device *, u32 tile_flags);
+ };
+@@ -634,6 +638,7 @@ struct drm_nouveau_private {
+ enum nouveau_card_type card_type;
+ /* exact chipset, derived from NV_PMC_BOOT_0 */
+ int chipset;
++ int stepping;
+ int flags;
+
+ void __iomem *mmio;
+@@ -652,8 +657,6 @@ struct drm_nouveau_private {
+ /* interrupt handling */
+ void (*irq_handler[32])(struct drm_device *);
+ bool msi_enabled;
+- struct workqueue_struct *wq;
+- struct work_struct irq_work;
+
+ struct list_head vbl_waiting;
+
+@@ -691,15 +694,22 @@ struct drm_nouveau_private {
+ struct {
+ enum {
+ NOUVEAU_GART_NONE = 0,
+- NOUVEAU_GART_AGP,
+- NOUVEAU_GART_SGDMA
++ NOUVEAU_GART_AGP, /* AGP */
++ NOUVEAU_GART_PDMA, /* paged dma object */
++ NOUVEAU_GART_HW /* on-chip gart/vm */
+ } type;
+ uint64_t aper_base;
+ uint64_t aper_size;
+ uint64_t aper_free;
+
++ struct ttm_backend_func *func;
++
++ struct {
++ struct page *page;
++ dma_addr_t addr;
++ } dummy;
++
+ struct nouveau_gpuobj *sg_ctxdma;
+- struct nouveau_vma vma;
+ } gart_info;
+
+ /* nv10-nv40 tiling regions */
+@@ -740,14 +750,6 @@ struct drm_nouveau_private {
+
+ struct backlight_device *backlight;
+
+- struct nouveau_channel *evo;
+- u32 evo_alloc;
+- struct {
+- struct dcb_entry *dcb;
+- u16 script;
+- u32 pclk;
+- } evo_irq;
+-
+ struct {
+ struct dentry *channel_root;
+ } debugfs;
+@@ -847,6 +849,7 @@ extern void nv10_mem_put_tile_region(struct drm_device *dev,
+ struct nouveau_tile_reg *tile,
+ struct nouveau_fence *fence);
+ extern const struct ttm_mem_type_manager_func nouveau_vram_manager;
++extern const struct ttm_mem_type_manager_func nouveau_gart_manager;
+
+ /* nouveau_notifier.c */
+ extern int nouveau_notifier_init_channel(struct nouveau_channel *);
+@@ -879,17 +882,17 @@ extern void nouveau_channel_ref(struct nouveau_channel *chan,
+ extern void nouveau_channel_idle(struct nouveau_channel *chan);
+
+ /* nouveau_object.c */
+-#define NVOBJ_CLASS(d,c,e) do { \
++#define NVOBJ_CLASS(d, c, e) do { \
+ int ret = nouveau_gpuobj_class_new((d), (c), NVOBJ_ENGINE_##e); \
+ if (ret) \
+ return ret; \
+-} while(0)
++} while (0)
+
+-#define NVOBJ_MTHD(d,c,m,e) do { \
++#define NVOBJ_MTHD(d, c, m, e) do { \
+ int ret = nouveau_gpuobj_mthd_new((d), (c), (m), (e)); \
+ if (ret) \
+ return ret; \
+-} while(0)
++} while (0)
+
+ extern int nouveau_gpuobj_early_init(struct drm_device *);
+ extern int nouveau_gpuobj_init(struct drm_device *);
+@@ -899,7 +902,7 @@ extern void nouveau_gpuobj_resume(struct drm_device *dev);
+ extern int nouveau_gpuobj_class_new(struct drm_device *, u32 class, u32 eng);
+ extern int nouveau_gpuobj_mthd_new(struct drm_device *, u32 class, u32 mthd,
+ int (*exec)(struct nouveau_channel *,
+- u32 class, u32 mthd, u32 data));
++ u32 class, u32 mthd, u32 data));
+ extern int nouveau_gpuobj_mthd_call(struct nouveau_channel *, u32, u32, u32);
+ extern int nouveau_gpuobj_mthd_call2(struct drm_device *, int, u32, u32, u32);
+ extern int nouveau_gpuobj_channel_init(struct nouveau_channel *,
+@@ -1076,7 +1079,7 @@ extern void nv40_fb_set_tile_region(struct drm_device *dev, int i);
+ /* nv50_fb.c */
+ extern int nv50_fb_init(struct drm_device *);
+ extern void nv50_fb_takedown(struct drm_device *);
+-extern void nv50_fb_vm_trap(struct drm_device *, int display, const char *);
++extern void nv50_fb_vm_trap(struct drm_device *, int display);
+
+ /* nvc0_fb.c */
+ extern int nvc0_fb_init(struct drm_device *);
+@@ -1189,7 +1192,7 @@ extern int nv50_graph_load_context(struct nouveau_channel *);
+ extern int nv50_graph_unload_context(struct drm_device *);
+ extern int nv50_grctx_init(struct nouveau_grctx *);
+ extern void nv50_graph_tlb_flush(struct drm_device *dev);
+-extern void nv86_graph_tlb_flush(struct drm_device *dev);
++extern void nv84_graph_tlb_flush(struct drm_device *dev);
+ extern struct nouveau_enum nv50_data_error_names[];
+
+ /* nvc0_graph.c */
+@@ -1295,7 +1298,7 @@ extern struct ttm_bo_driver nouveau_bo_driver;
+ extern int nouveau_bo_new(struct drm_device *, struct nouveau_channel *,
+ int size, int align, uint32_t flags,
+ uint32_t tile_mode, uint32_t tile_flags,
+- bool no_vm, bool mappable, struct nouveau_bo **);
++ struct nouveau_bo **);
+ extern int nouveau_bo_pin(struct nouveau_bo *, uint32_t flags);
+ extern int nouveau_bo_unpin(struct nouveau_bo *);
+ extern int nouveau_bo_map(struct nouveau_bo *);
+@@ -1356,9 +1359,9 @@ static inline struct nouveau_fence *nouveau_fence_ref(struct nouveau_fence *obj)
+
+ /* nouveau_gem.c */
+ extern int nouveau_gem_new(struct drm_device *, struct nouveau_channel *,
+- int size, int align, uint32_t flags,
++ int size, int align, uint32_t domain,
+ uint32_t tile_mode, uint32_t tile_flags,
+- bool no_vm, bool mappable, struct nouveau_bo **);
++ struct nouveau_bo **);
+ extern int nouveau_gem_object_new(struct drm_gem_object *);
+ extern void nouveau_gem_object_del(struct drm_gem_object *);
+ extern int nouveau_gem_ioctl_new(struct drm_device *, void *,
+diff --git a/drivers/gpu/drm/nouveau/nouveau_fb.h b/drivers/gpu/drm/nouveau/nouveau_fb.h
+index d432134..a3a88ad 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_fb.h
++++ b/drivers/gpu/drm/nouveau/nouveau_fb.h
+@@ -30,6 +30,9 @@
+ struct nouveau_framebuffer {
+ struct drm_framebuffer base;
+ struct nouveau_bo *nvbo;
++ u32 r_dma;
++ u32 r_format;
++ u32 r_pitch;
+ };
+
+ static inline struct nouveau_framebuffer *
+diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
+index 60769d2..889c445 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c
++++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
+@@ -296,8 +296,8 @@ nouveau_fbcon_create(struct nouveau_fbdev *nfbdev,
+ size = mode_cmd.pitch * mode_cmd.height;
+ size = roundup(size, PAGE_SIZE);
+
+- ret = nouveau_gem_new(dev, dev_priv->channel, size, 0, TTM_PL_FLAG_VRAM,
+- 0, 0x0000, false, true, &nvbo);
++ ret = nouveau_gem_new(dev, dev_priv->channel, size, 0,
++ NOUVEAU_GEM_DOMAIN_VRAM, 0, 0x0000, &nvbo);
+ if (ret) {
+ NV_ERROR(dev, "failed to allocate framebuffer\n");
+ goto out;
+diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c
+index 221b846..4b9f449 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_fence.c
++++ b/drivers/gpu/drm/nouveau/nouveau_fence.c
+@@ -27,13 +27,15 @@
+ #include "drmP.h"
+ #include "drm.h"
+
++#include <linux/ktime.h>
++#include <linux/hrtimer.h>
++
+ #include "nouveau_drv.h"
+ #include "nouveau_ramht.h"
+ #include "nouveau_dma.h"
+
+ #define USE_REFCNT(dev) (nouveau_private(dev)->chipset >= 0x10)
+-#define USE_SEMA(dev) (nouveau_private(dev)->chipset >= 0x17 && \
+- nouveau_private(dev)->card_type < NV_C0)
++#define USE_SEMA(dev) (nouveau_private(dev)->chipset >= 0x17)
+
+ struct nouveau_fence {
+ struct nouveau_channel *channel;
+@@ -230,7 +232,8 @@ int
+ __nouveau_fence_wait(void *sync_obj, void *sync_arg, bool lazy, bool intr)
+ {
+ unsigned long timeout = jiffies + (3 * DRM_HZ);
+- unsigned long sleep_time = jiffies + 1;
++ unsigned long sleep_time = NSEC_PER_MSEC / 1000;
++ ktime_t t;
+ int ret = 0;
+
+ while (1) {
+@@ -244,8 +247,13 @@ __nouveau_fence_wait(void *sync_obj, void *sync_arg, bool lazy, bool intr)
+
+ __set_current_state(intr ? TASK_INTERRUPTIBLE
+ : TASK_UNINTERRUPTIBLE);
+- if (lazy && time_after_eq(jiffies, sleep_time))
+- schedule_timeout(1);
++ if (lazy) {
++ t = ktime_set(0, sleep_time);
++ schedule_hrtimeout(&t, HRTIMER_MODE_REL);
++ sleep_time *= 2;
++ if (sleep_time > NSEC_PER_MSEC)
++ sleep_time = NSEC_PER_MSEC;
++ }
+
+ if (intr && signal_pending(current)) {
+ ret = -ERESTARTSYS;
+@@ -259,11 +267,12 @@ __nouveau_fence_wait(void *sync_obj, void *sync_arg, bool lazy, bool intr)
+ }
+
+ static struct nouveau_semaphore *
+-alloc_semaphore(struct drm_device *dev)
++semaphore_alloc(struct drm_device *dev)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+ struct nouveau_semaphore *sema;
+- int ret;
++ int size = (dev_priv->chipset < 0x84) ? 4 : 16;
++ int ret, i;
+
+ if (!USE_SEMA(dev))
+ return NULL;
+@@ -277,9 +286,9 @@ alloc_semaphore(struct drm_device *dev)
+ goto fail;
+
+ spin_lock(&dev_priv->fence.lock);
+- sema->mem = drm_mm_search_free(&dev_priv->fence.heap, 4, 0, 0);
++ sema->mem = drm_mm_search_free(&dev_priv->fence.heap, size, 0, 0);
+ if (sema->mem)
+- sema->mem = drm_mm_get_block_atomic(sema->mem, 4, 0);
++ sema->mem = drm_mm_get_block_atomic(sema->mem, size, 0);
+ spin_unlock(&dev_priv->fence.lock);
+
+ if (!sema->mem)
+@@ -287,7 +296,8 @@ alloc_semaphore(struct drm_device *dev)
+
+ kref_init(&sema->ref);
+ sema->dev = dev;
+- nouveau_bo_wr32(dev_priv->fence.bo, sema->mem->start / 4, 0);
++ for (i = sema->mem->start; i < sema->mem->start + size; i += 4)
++ nouveau_bo_wr32(dev_priv->fence.bo, i / 4, 0);
+
+ return sema;
+ fail:
+@@ -296,7 +306,7 @@ fail:
+ }
+
+ static void
+-free_semaphore(struct kref *ref)
++semaphore_free(struct kref *ref)
+ {
+ struct nouveau_semaphore *sema =
+ container_of(ref, struct nouveau_semaphore, ref);
+@@ -318,61 +328,107 @@ semaphore_work(void *priv, bool signalled)
+ if (unlikely(!signalled))
+ nouveau_bo_wr32(dev_priv->fence.bo, sema->mem->start / 4, 1);
+
+- kref_put(&sema->ref, free_semaphore);
++ kref_put(&sema->ref, semaphore_free);
+ }
+
+ static int
+-emit_semaphore(struct nouveau_channel *chan, int method,
+- struct nouveau_semaphore *sema)
++semaphore_acquire(struct nouveau_channel *chan, struct nouveau_semaphore *sema)
+ {
+- struct drm_nouveau_private *dev_priv = sema->dev->dev_private;
+- struct nouveau_fence *fence;
+- bool smart = (dev_priv->card_type >= NV_50);
++ struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
++ struct nouveau_fence *fence = NULL;
+ int ret;
+
+- ret = RING_SPACE(chan, smart ? 8 : 4);
++ if (dev_priv->chipset < 0x84) {
++ ret = RING_SPACE(chan, 3);
++ if (ret)
++ return ret;
++
++ BEGIN_RING(chan, NvSubSw, NV_SW_SEMAPHORE_OFFSET, 2);
++ OUT_RING (chan, sema->mem->start);
++ OUT_RING (chan, 1);
++ } else
++ if (dev_priv->chipset < 0xc0) {
++ struct nouveau_vma *vma = &dev_priv->fence.bo->vma;
++ u64 offset = vma->offset + sema->mem->start;
++
++ ret = RING_SPACE(chan, 5);
++ if (ret)
++ return ret;
++
++ BEGIN_RING(chan, NvSubSw, 0x0010, 4);
++ OUT_RING (chan, upper_32_bits(offset));
++ OUT_RING (chan, lower_32_bits(offset));
++ OUT_RING (chan, 1);
++ OUT_RING (chan, 1); /* ACQUIRE_EQ */
++ } else {
++ struct nouveau_vma *vma = &dev_priv->fence.bo->vma;
++ u64 offset = vma->offset + sema->mem->start;
++
++ ret = RING_SPACE(chan, 5);
++ if (ret)
++ return ret;
++
++ BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0010, 4);
++ OUT_RING (chan, upper_32_bits(offset));
++ OUT_RING (chan, lower_32_bits(offset));
++ OUT_RING (chan, 1);
++ OUT_RING (chan, 0x1001); /* ACQUIRE_EQ */
++ }
++
++ /* Delay semaphore destruction until its work is done */
++ ret = nouveau_fence_new(chan, &fence, true);
+ if (ret)
+ return ret;
+
+- if (smart) {
+- BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 1);
+- OUT_RING(chan, NvSema);
+- }
+- BEGIN_RING(chan, NvSubSw, NV_SW_SEMAPHORE_OFFSET, 1);
+- OUT_RING(chan, sema->mem->start);
+-
+- if (smart && method == NV_SW_SEMAPHORE_ACQUIRE) {
+- /*
+- * NV50 tries to be too smart and context-switch
+- * between semaphores instead of doing a "first come,
+- * first served" strategy like previous cards
+- * do.
+- *
+- * That's bad because the ACQUIRE latency can get as
+- * large as the PFIFO context time slice in the
+- * typical DRI2 case where you have several
+- * outstanding semaphores at the same moment.
+- *
+- * If we're going to ACQUIRE, force the card to
+- * context switch before, just in case the matching
+- * RELEASE is already scheduled to be executed in
+- * another channel.
+- */
+- BEGIN_RING(chan, NvSubSw, NV_SW_YIELD, 1);
+- OUT_RING(chan, 0);
+- }
++ kref_get(&sema->ref);
++ nouveau_fence_work(fence, semaphore_work, sema);
++ nouveau_fence_unref(&fence);
++ return 0;
++}
++
++static int
++semaphore_release(struct nouveau_channel *chan, struct nouveau_semaphore *sema)
++{
++ struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
++ struct nouveau_fence *fence = NULL;
++ int ret;
++
++ if (dev_priv->chipset < 0x84) {
++ ret = RING_SPACE(chan, 4);
++ if (ret)
++ return ret;
++
++ BEGIN_RING(chan, NvSubSw, NV_SW_SEMAPHORE_OFFSET, 1);
++ OUT_RING (chan, sema->mem->start);
++ BEGIN_RING(chan, NvSubSw, NV_SW_SEMAPHORE_RELEASE, 1);
++ OUT_RING (chan, 1);
++ } else
++ if (dev_priv->chipset < 0xc0) {
++ struct nouveau_vma *vma = &dev_priv->fence.bo->vma;
++ u64 offset = vma->offset + sema->mem->start;
++
++ ret = RING_SPACE(chan, 5);
++ if (ret)
++ return ret;
++
++ BEGIN_RING(chan, NvSubSw, 0x0010, 4);
++ OUT_RING (chan, upper_32_bits(offset));
++ OUT_RING (chan, lower_32_bits(offset));
++ OUT_RING (chan, 1);
++ OUT_RING (chan, 2); /* RELEASE */
++ } else {
++ struct nouveau_vma *vma = &dev_priv->fence.bo->vma;
++ u64 offset = vma->offset + sema->mem->start;
+
+- BEGIN_RING(chan, NvSubSw, method, 1);
+- OUT_RING(chan, 1);
+-
+- if (smart && method == NV_SW_SEMAPHORE_RELEASE) {
+- /*
+- * Force the card to context switch, there may be
+- * another channel waiting for the semaphore we just
+- * released.
+- */
+- BEGIN_RING(chan, NvSubSw, NV_SW_YIELD, 1);
+- OUT_RING(chan, 0);
++ ret = RING_SPACE(chan, 5);
++ if (ret)
++ return ret;
++
++ BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0010, 4);
++ OUT_RING (chan, upper_32_bits(offset));
++ OUT_RING (chan, lower_32_bits(offset));
++ OUT_RING (chan, 1);
++ OUT_RING (chan, 0x1002); /* RELEASE */
+ }
+
+ /* Delay semaphore destruction until its work is done */
+@@ -383,7 +439,6 @@ emit_semaphore(struct nouveau_channel *chan, int method,
+ kref_get(&sema->ref);
+ nouveau_fence_work(fence, semaphore_work, sema);
+ nouveau_fence_unref(&fence);
+-
+ return 0;
+ }
+
+@@ -400,7 +455,7 @@ nouveau_fence_sync(struct nouveau_fence *fence,
+ nouveau_fence_signalled(fence)))
+ goto out;
+
+- sema = alloc_semaphore(dev);
++ sema = semaphore_alloc(dev);
+ if (!sema) {
+ /* Early card or broken userspace, fall back to
+ * software sync. */
+@@ -418,17 +473,17 @@ nouveau_fence_sync(struct nouveau_fence *fence,
+ }
+
+ /* Make wchan wait until it gets signalled */
+- ret = emit_semaphore(wchan, NV_SW_SEMAPHORE_ACQUIRE, sema);
++ ret = semaphore_acquire(wchan, sema);
+ if (ret)
+ goto out_unlock;
+
+ /* Signal the semaphore from chan */
+- ret = emit_semaphore(chan, NV_SW_SEMAPHORE_RELEASE, sema);
++ ret = semaphore_release(chan, sema);
+
+ out_unlock:
+ mutex_unlock(&chan->mutex);
+ out_unref:
+- kref_put(&sema->ref, free_semaphore);
++ kref_put(&sema->ref, semaphore_free);
+ out:
+ if (chan)
+ nouveau_channel_put_unlocked(&chan);
+@@ -449,22 +504,23 @@ nouveau_fence_channel_init(struct nouveau_channel *chan)
+ struct nouveau_gpuobj *obj = NULL;
+ int ret;
+
++ if (dev_priv->card_type >= NV_C0)
++ goto out_initialised;
++
+ /* Create an NV_SW object for various sync purposes */
+ ret = nouveau_gpuobj_gr_new(chan, NvSw, NV_SW);
+ if (ret)
+ return ret;
+
+ /* we leave subchannel empty for nvc0 */
+- if (dev_priv->card_type < NV_C0) {
+- ret = RING_SPACE(chan, 2);
+- if (ret)
+- return ret;
+- BEGIN_RING(chan, NvSubSw, 0, 1);
+- OUT_RING(chan, NvSw);
+- }
++ ret = RING_SPACE(chan, 2);
++ if (ret)
++ return ret;
++ BEGIN_RING(chan, NvSubSw, 0, 1);
++ OUT_RING(chan, NvSw);
+
+ /* Create a DMA object for the shared cross-channel sync area. */
+- if (USE_SEMA(dev)) {
++ if (USE_SEMA(dev) && dev_priv->chipset < 0x84) {
+ struct ttm_mem_reg *mem = &dev_priv->fence.bo->bo.mem;
+
+ ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY,
+@@ -484,14 +540,20 @@ nouveau_fence_channel_init(struct nouveau_channel *chan)
+ return ret;
+ BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 1);
+ OUT_RING(chan, NvSema);
++ } else {
++ ret = RING_SPACE(chan, 2);
++ if (ret)
++ return ret;
++ BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 1);
++ OUT_RING (chan, chan->vram_handle); /* whole VM */
+ }
+
+ FIRE_RING(chan);
+
++out_initialised:
+ INIT_LIST_HEAD(&chan->fence.pending);
+ spin_lock_init(&chan->fence.lock);
+ atomic_set(&chan->fence.last_sequence_irq, 0);
+-
+ return 0;
+ }
+
+@@ -519,12 +581,13 @@ int
+ nouveau_fence_init(struct drm_device *dev)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
++ int size = (dev_priv->chipset < 0x84) ? 4096 : 16384;
+ int ret;
+
+ /* Create a shared VRAM heap for cross-channel sync. */
+ if (USE_SEMA(dev)) {
+- ret = nouveau_bo_new(dev, NULL, 4096, 0, TTM_PL_FLAG_VRAM,
+- 0, 0, false, true, &dev_priv->fence.bo);
++ ret = nouveau_bo_new(dev, NULL, size, 0, TTM_PL_FLAG_VRAM,
++ 0, 0, &dev_priv->fence.bo);
+ if (ret)
+ return ret;
+
+diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
+index 506c508..e8b04f4 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
++++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
+@@ -61,19 +61,36 @@ nouveau_gem_object_del(struct drm_gem_object *gem)
+
+ int
+ nouveau_gem_new(struct drm_device *dev, struct nouveau_channel *chan,
+- int size, int align, uint32_t flags, uint32_t tile_mode,
+- uint32_t tile_flags, bool no_vm, bool mappable,
+- struct nouveau_bo **pnvbo)
++ int size, int align, uint32_t domain, uint32_t tile_mode,
++ uint32_t tile_flags, struct nouveau_bo **pnvbo)
+ {
++ struct drm_nouveau_private *dev_priv = dev->dev_private;
+ struct nouveau_bo *nvbo;
++ u32 flags = 0;
+ int ret;
+
++ if (domain & NOUVEAU_GEM_DOMAIN_VRAM)
++ flags |= TTM_PL_FLAG_VRAM;
++ if (domain & NOUVEAU_GEM_DOMAIN_GART)
++ flags |= TTM_PL_FLAG_TT;
++ if (!flags || domain & NOUVEAU_GEM_DOMAIN_CPU)
++ flags |= TTM_PL_FLAG_SYSTEM;
++
+ ret = nouveau_bo_new(dev, chan, size, align, flags, tile_mode,
+- tile_flags, no_vm, mappable, pnvbo);
++ tile_flags, pnvbo);
+ if (ret)
+ return ret;
+ nvbo = *pnvbo;
+
++ /* we restrict allowed domains on nv50+ to only the types
++ * that were requested at creation time. not possibly on
++ * earlier chips without busting the ABI.
++ */
++ nvbo->valid_domains = NOUVEAU_GEM_DOMAIN_VRAM |
++ NOUVEAU_GEM_DOMAIN_GART;
++ if (dev_priv->card_type >= NV_50)
++ nvbo->valid_domains &= domain;
++
+ nvbo->gem = drm_gem_object_alloc(dev, nvbo->bo.mem.size);
+ if (!nvbo->gem) {
+ nouveau_bo_ref(NULL, pnvbo);
+@@ -97,7 +114,7 @@ nouveau_gem_info(struct drm_gem_object *gem, struct drm_nouveau_gem_info *rep)
+
+ rep->size = nvbo->bo.mem.num_pages << PAGE_SHIFT;
+ rep->offset = nvbo->bo.offset;
+- rep->map_handle = nvbo->mappable ? nvbo->bo.addr_space_offset : 0;
++ rep->map_handle = nvbo->bo.addr_space_offset;
+ rep->tile_mode = nvbo->tile_mode;
+ rep->tile_flags = nvbo->tile_flags;
+ return 0;
+@@ -111,19 +128,11 @@ nouveau_gem_ioctl_new(struct drm_device *dev, void *data,
+ struct drm_nouveau_gem_new *req = data;
+ struct nouveau_bo *nvbo = NULL;
+ struct nouveau_channel *chan = NULL;
+- uint32_t flags = 0;
+ int ret = 0;
+
+ if (unlikely(dev_priv->ttm.bdev.dev_mapping == NULL))
+ dev_priv->ttm.bdev.dev_mapping = dev_priv->dev->dev_mapping;
+
+- if (req->info.domain & NOUVEAU_GEM_DOMAIN_VRAM)
+- flags |= TTM_PL_FLAG_VRAM;
+- if (req->info.domain & NOUVEAU_GEM_DOMAIN_GART)
+- flags |= TTM_PL_FLAG_TT;
+- if (!flags || req->info.domain & NOUVEAU_GEM_DOMAIN_CPU)
+- flags |= TTM_PL_FLAG_SYSTEM;
+-
+ if (!dev_priv->engine.vram.flags_valid(dev, req->info.tile_flags)) {
+ NV_ERROR(dev, "bad page flags: 0x%08x\n", req->info.tile_flags);
+ return -EINVAL;
+@@ -135,10 +144,9 @@ nouveau_gem_ioctl_new(struct drm_device *dev, void *data,
+ return PTR_ERR(chan);
+ }
+
+- ret = nouveau_gem_new(dev, chan, req->info.size, req->align, flags,
+- req->info.tile_mode, req->info.tile_flags, false,
+- (req->info.domain & NOUVEAU_GEM_DOMAIN_MAPPABLE),
+- &nvbo);
++ ret = nouveau_gem_new(dev, chan, req->info.size, req->align,
++ req->info.domain, req->info.tile_mode,
++ req->info.tile_flags, &nvbo);
+ if (chan)
+ nouveau_channel_put(&chan);
+ if (ret)
+@@ -161,7 +169,7 @@ nouveau_gem_set_domain(struct drm_gem_object *gem, uint32_t read_domains,
+ {
+ struct nouveau_bo *nvbo = gem->driver_private;
+ struct ttm_buffer_object *bo = &nvbo->bo;
+- uint32_t domains = valid_domains &
++ uint32_t domains = valid_domains & nvbo->valid_domains &
+ (write_domains ? write_domains : read_domains);
+ uint32_t pref_flags = 0, valid_flags = 0;
+
+@@ -592,7 +600,7 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data,
+ if (push[i].bo_index >= req->nr_buffers) {
+ NV_ERROR(dev, "push %d buffer not in list\n", i);
+ ret = -EINVAL;
+- goto out;
++ goto out_prevalid;
+ }
+
+ bo[push[i].bo_index].read_domains |= (1 << 31);
+@@ -604,7 +612,7 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data,
+ if (ret) {
+ if (ret != -ERESTARTSYS)
+ NV_ERROR(dev, "validate: %d\n", ret);
+- goto out;
++ goto out_prevalid;
+ }
+
+ /* Apply any relocations that are required */
+@@ -697,6 +705,8 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data,
+ out:
+ validate_fini(&op, fence);
+ nouveau_fence_unref(&fence);
++
++out_prevalid:
+ kfree(bo);
+ kfree(push);
+
+diff --git a/drivers/gpu/drm/nouveau/nouveau_grctx.h b/drivers/gpu/drm/nouveau/nouveau_grctx.h
+index 4a8ad13..86c2e37 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_grctx.h
++++ b/drivers/gpu/drm/nouveau/nouveau_grctx.h
+@@ -87,10 +87,10 @@ _cp_bra(struct nouveau_grctx *ctx, u32 mod, int flag, int state, int name)
+ cp_out(ctx, CP_BRA | (mod << 18) | ip | flag |
+ (state ? 0 : CP_BRA_IF_CLEAR));
+ }
+-#define cp_bra(c,f,s,n) _cp_bra((c), 0, CP_FLAG_##f, CP_FLAG_##f##_##s, n)
++#define cp_bra(c, f, s, n) _cp_bra((c), 0, CP_FLAG_##f, CP_FLAG_##f##_##s, n)
+ #ifdef CP_BRA_MOD
+-#define cp_cal(c,f,s,n) _cp_bra((c), 1, CP_FLAG_##f, CP_FLAG_##f##_##s, n)
+-#define cp_ret(c,f,s) _cp_bra((c), 2, CP_FLAG_##f, CP_FLAG_##f##_##s, 0)
++#define cp_cal(c, f, s, n) _cp_bra((c), 1, CP_FLAG_##f, CP_FLAG_##f##_##s, n)
++#define cp_ret(c, f, s) _cp_bra((c), 2, CP_FLAG_##f, CP_FLAG_##f##_##s, 0)
+ #endif
+
+ static inline void
+@@ -98,14 +98,14 @@ _cp_wait(struct nouveau_grctx *ctx, int flag, int state)
+ {
+ cp_out(ctx, CP_WAIT | flag | (state ? CP_WAIT_SET : 0));
+ }
+-#define cp_wait(c,f,s) _cp_wait((c), CP_FLAG_##f, CP_FLAG_##f##_##s)
++#define cp_wait(c, f, s) _cp_wait((c), CP_FLAG_##f, CP_FLAG_##f##_##s)
+
+ static inline void
+ _cp_set(struct nouveau_grctx *ctx, int flag, int state)
+ {
+ cp_out(ctx, CP_SET | flag | (state ? CP_SET_1 : 0));
+ }
+-#define cp_set(c,f,s) _cp_set((c), CP_FLAG_##f, CP_FLAG_##f##_##s)
++#define cp_set(c, f, s) _cp_set((c), CP_FLAG_##f, CP_FLAG_##f##_##s)
+
+ static inline void
+ cp_pos(struct nouveau_grctx *ctx, int offset)
+diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c
+index b0fb9bd..f017997 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_mem.c
++++ b/drivers/gpu/drm/nouveau/nouveau_mem.c
+@@ -152,7 +152,6 @@ nouveau_mem_vram_fini(struct drm_device *dev)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+
+- nouveau_bo_unpin(dev_priv->vga_ram);
+ nouveau_bo_ref(NULL, &dev_priv->vga_ram);
+
+ ttm_bo_device_release(&dev_priv->ttm.bdev);
+@@ -393,11 +392,17 @@ nouveau_mem_vram_init(struct drm_device *dev)
+ struct ttm_bo_device *bdev = &dev_priv->ttm.bdev;
+ int ret, dma_bits;
+
+- if (dev_priv->card_type >= NV_50 &&
+- pci_dma_supported(dev->pdev, DMA_BIT_MASK(40)))
+- dma_bits = 40;
+- else
+- dma_bits = 32;
++ dma_bits = 32;
++ if (dev_priv->card_type >= NV_50) {
++ if (pci_dma_supported(dev->pdev, DMA_BIT_MASK(40)))
++ dma_bits = 40;
++ } else
++ if (0 && drm_device_is_pcie(dev) &&
++ dev_priv->chipset > 0x40 &&
++ dev_priv->chipset != 0x45) {
++ if (pci_dma_supported(dev->pdev, DMA_BIT_MASK(39)))
++ dma_bits = 39;
++ }
+
+ ret = pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(dma_bits));
+ if (ret)
+@@ -419,14 +424,32 @@ nouveau_mem_vram_init(struct drm_device *dev)
+ }
+
+ /* reserve space at end of VRAM for PRAMIN */
+- if (dev_priv->chipset == 0x40 || dev_priv->chipset == 0x47 ||
+- dev_priv->chipset == 0x49 || dev_priv->chipset == 0x4b)
+- dev_priv->ramin_rsvd_vram = (2 * 1024 * 1024);
+- else
+- if (dev_priv->card_type >= NV_40)
+- dev_priv->ramin_rsvd_vram = (1 * 1024 * 1024);
+- else
+- dev_priv->ramin_rsvd_vram = (512 * 1024);
++ if (dev_priv->card_type >= NV_50) {
++ dev_priv->ramin_rsvd_vram = 1 * 1024 * 1024;
++ } else
++ if (dev_priv->card_type >= NV_40) {
++ u32 vs = hweight8((nv_rd32(dev, 0x001540) & 0x0000ff00) >> 8);
++ u32 rsvd;
++
++ /* estimate grctx size, the magics come from nv40_grctx.c */
++ if (dev_priv->chipset == 0x40) rsvd = 0x6aa0 * vs;
++ else if (dev_priv->chipset < 0x43) rsvd = 0x4f00 * vs;
++ else if (nv44_graph_class(dev)) rsvd = 0x4980 * vs;
++ else rsvd = 0x4a40 * vs;
++ rsvd += 16 * 1024;
++ rsvd *= dev_priv->engine.fifo.channels;
++
++ /* pciegart table */
++ if (drm_device_is_pcie(dev))
++ rsvd += 512 * 1024;
++
++ /* object storage */
++ rsvd += 512 * 1024;
++
++ dev_priv->ramin_rsvd_vram = round_up(rsvd, 4096);
++ } else {
++ dev_priv->ramin_rsvd_vram = 512 * 1024;
++ }
+
+ ret = dev_priv->engine.vram.init(dev);
+ if (ret)
+@@ -455,13 +478,17 @@ nouveau_mem_vram_init(struct drm_device *dev)
+ return ret;
+ }
+
+- ret = nouveau_bo_new(dev, NULL, 256*1024, 0, TTM_PL_FLAG_VRAM,
+- 0, 0, true, true, &dev_priv->vga_ram);
+- if (ret == 0)
+- ret = nouveau_bo_pin(dev_priv->vga_ram, TTM_PL_FLAG_VRAM);
+- if (ret) {
+- NV_WARN(dev, "failed to reserve VGA memory\n");
+- nouveau_bo_ref(NULL, &dev_priv->vga_ram);
++ if (dev_priv->card_type < NV_50) {
++ ret = nouveau_bo_new(dev, NULL, 256*1024, 0, TTM_PL_FLAG_VRAM,
++ 0, 0, &dev_priv->vga_ram);
++ if (ret == 0)
++ ret = nouveau_bo_pin(dev_priv->vga_ram,
++ TTM_PL_FLAG_VRAM);
++
++ if (ret) {
++ NV_WARN(dev, "failed to reserve VGA memory\n");
++ nouveau_bo_ref(NULL, &dev_priv->vga_ram);
++ }
+ }
+
+ dev_priv->fb_mtrr = drm_mtrr_add(pci_resource_start(dev->pdev, 1),
+@@ -525,6 +552,7 @@ nouveau_mem_timing_init(struct drm_device *dev)
+ u8 tRC; /* Byte 9 */
+ u8 tUNK_10, tUNK_11, tUNK_12, tUNK_13, tUNK_14;
+ u8 tUNK_18, tUNK_19, tUNK_20, tUNK_21;
++ u8 magic_number = 0; /* Yeah... sorry*/
+ u8 *mem = NULL, *entry;
+ int i, recordlen, entries;
+
+@@ -569,6 +597,12 @@ nouveau_mem_timing_init(struct drm_device *dev)
+ if (!memtimings->timing)
+ return;
+
++ /* Get "some number" from the timing reg for NV_40 and NV_50
++ * Used in calculations later */
++ if (dev_priv->card_type >= NV_40 && dev_priv->chipset < 0x98) {
++ magic_number = (nv_rd32(dev, 0x100228) & 0x0f000000) >> 24;
++ }
++
+ entry = mem + mem[1];
+ for (i = 0; i < entries; i++, entry += recordlen) {
+ struct nouveau_pm_memtiming *timing = &pm->memtimings.timing[i];
+@@ -608,36 +642,67 @@ nouveau_mem_timing_init(struct drm_device *dev)
+
+ /* XXX: I don't trust the -1's and +1's... they must come
+ * from somewhere! */
+- timing->reg_100224 = ((tUNK_0 + tUNK_19 + 1) << 24 |
+- tUNK_18 << 16 |
+- (tUNK_1 + tUNK_19 + 1) << 8 |
+- (tUNK_2 - 1));
++ timing->reg_100224 = (tUNK_0 + tUNK_19 + 1 + magic_number) << 24 |
++ max(tUNK_18, (u8) 1) << 16 |
++ (tUNK_1 + tUNK_19 + 1 + magic_number) << 8;
++ if (dev_priv->chipset == 0xa8) {
++ timing->reg_100224 |= (tUNK_2 - 1);
++ } else {
++ timing->reg_100224 |= (tUNK_2 + 2 - magic_number);
++ }
+
+ timing->reg_100228 = (tUNK_12 << 16 | tUNK_11 << 8 | tUNK_10);
+- if(recordlen > 19) {
+- timing->reg_100228 += (tUNK_19 - 1) << 24;
+- }/* I cannot back-up this else-statement right now
+- else {
+- timing->reg_100228 += tUNK_12 << 24;
+- }*/
+-
+- /* XXX: reg_10022c */
+- timing->reg_10022c = tUNK_2 - 1;
+-
+- timing->reg_100230 = (tUNK_20 << 24 | tUNK_21 << 16 |
+- tUNK_13 << 8 | tUNK_13);
+-
+- /* XXX: +6? */
+- timing->reg_100234 = (tRAS << 24 | (tUNK_19 + 6) << 8 | tRC);
+- timing->reg_100234 += max(tUNK_10,tUNK_11) << 16;
+-
+- /* XXX; reg_100238, reg_10023c
+- * reg: 0x00??????
+- * reg_10023c:
+- * 0 for pre-NV50 cards
+- * 0x????0202 for NV50+ cards (empirical evidence) */
+- if(dev_priv->card_type >= NV_50) {
++ if (dev_priv->chipset >= 0xa3 && dev_priv->chipset < 0xaa)
++ timing->reg_100228 |= (tUNK_19 - 1) << 24;
++ else
++ timing->reg_100228 |= magic_number << 24;
++
++ if (dev_priv->card_type == NV_40) {
++ /* NV40: don't know what the rest of the regs are..
++ * And don't need to know either */
++ timing->reg_100228 |= 0x20200000;
++ } else if (dev_priv->card_type >= NV_50) {
++ if (dev_priv->chipset < 0x98 ||
++ (dev_priv->chipset == 0x98 &&
++ dev_priv->stepping <= 0xa1)) {
++ timing->reg_10022c = (0x14 + tUNK_2) << 24 |
++ 0x16 << 16 |
++ (tUNK_2 - 1) << 8 |
++ (tUNK_2 - 1);
++ } else {
++ /* XXX: reg_10022c for recentish cards */
++ timing->reg_10022c = tUNK_2 - 1;
++ }
++
++ timing->reg_100230 = (tUNK_20 << 24 | tUNK_21 << 16 |
++ tUNK_13 << 8 | tUNK_13);
++
++ timing->reg_100234 = (tRAS << 24 | tRC);
++ timing->reg_100234 += max(tUNK_10, tUNK_11) << 16;
++
++ if (dev_priv->chipset < 0x98 ||
++ (dev_priv->chipset == 0x98 &&
++ dev_priv->stepping <= 0xa1)) {
++ timing->reg_100234 |= (tUNK_2 + 2) << 8;
++ } else {
++ /* XXX: +6? */
++ timing->reg_100234 |= (tUNK_19 + 6) << 8;
++ }
++
++ /* XXX; reg_100238
++ * reg_100238: 0x00?????? */
+ timing->reg_10023c = 0x202;
++ if (dev_priv->chipset < 0x98 ||
++ (dev_priv->chipset == 0x98 &&
++ dev_priv->stepping <= 0xa1)) {
++ timing->reg_10023c |= 0x4000000 | (tUNK_2 - 1) << 16;
++ } else {
++ /* XXX: reg_10023c
++ * currently unknown
++ * 10023c seen as 06xxxxxx, 0bxxxxxx or 0fxxxxxx */
++ }
++
++ /* XXX: reg_100240? */
+ }
+
+ NV_DEBUG(dev, "Entry %d: 220: %08x %08x %08x %08x\n", i,
+@@ -646,9 +711,10 @@ nouveau_mem_timing_init(struct drm_device *dev)
+ NV_DEBUG(dev, " 230: %08x %08x %08x %08x\n",
+ timing->reg_100230, timing->reg_100234,
+ timing->reg_100238, timing->reg_10023c);
++ NV_DEBUG(dev, " 240: %08x\n", timing->reg_100240);
+ }
+
+- memtimings->nr_timing = entries;
++ memtimings->nr_timing = entries;
+ memtimings->supported = true;
+ }
+
+@@ -666,13 +732,14 @@ nouveau_vram_manager_init(struct ttm_mem_type_manager *man, unsigned long p_size
+ {
+ struct drm_nouveau_private *dev_priv = nouveau_bdev(man->bdev);
+ struct nouveau_mm *mm;
+- u32 b_size;
++ u64 size, block, rsvd;
+ int ret;
+
+- p_size = (p_size << PAGE_SHIFT) >> 12;
+- b_size = dev_priv->vram_rblock_size >> 12;
++ rsvd = (256 * 1024); /* vga memory */
++ size = (p_size << PAGE_SHIFT) - rsvd;
++ block = dev_priv->vram_rblock_size;
+
+- ret = nouveau_mm_init(&mm, 0, p_size, b_size);
++ ret = nouveau_mm_init(&mm, rsvd >> 12, size >> 12, block >> 12);
+ if (ret)
+ return ret;
+
+@@ -700,9 +767,15 @@ nouveau_vram_manager_del(struct ttm_mem_type_manager *man,
+ {
+ struct drm_nouveau_private *dev_priv = nouveau_bdev(man->bdev);
+ struct nouveau_vram_engine *vram = &dev_priv->engine.vram;
++ struct nouveau_mem *node = mem->mm_node;
+ struct drm_device *dev = dev_priv->dev;
+
+- vram->put(dev, (struct nouveau_vram **)&mem->mm_node);
++ if (node->tmp_vma.node) {
++ nouveau_vm_unmap(&node->tmp_vma);
++ nouveau_vm_put(&node->tmp_vma);
++ }
++
++ vram->put(dev, (struct nouveau_mem **)&mem->mm_node);
+ }
+
+ static int
+@@ -715,7 +788,7 @@ nouveau_vram_manager_new(struct ttm_mem_type_manager *man,
+ struct nouveau_vram_engine *vram = &dev_priv->engine.vram;
+ struct drm_device *dev = dev_priv->dev;
+ struct nouveau_bo *nvbo = nouveau_bo(bo);
+- struct nouveau_vram *node;
++ struct nouveau_mem *node;
+ u32 size_nc = 0;
+ int ret;
+
+@@ -724,7 +797,7 @@ nouveau_vram_manager_new(struct ttm_mem_type_manager *man,
+
+ ret = vram->get(dev, mem->num_pages << PAGE_SHIFT,
+ mem->page_alignment << PAGE_SHIFT, size_nc,
+- (nvbo->tile_flags >> 8) & 0xff, &node);
++ (nvbo->tile_flags >> 8) & 0x3ff, &node);
+ if (ret) {
+ mem->mm_node = NULL;
+ return (ret == -ENOSPC) ? 0 : ret;
+@@ -771,3 +844,84 @@ const struct ttm_mem_type_manager_func nouveau_vram_manager = {
+ nouveau_vram_manager_del,
+ nouveau_vram_manager_debug
+ };
++
++static int
++nouveau_gart_manager_init(struct ttm_mem_type_manager *man, unsigned long psize)
++{
++ return 0;
++}
++
++static int
++nouveau_gart_manager_fini(struct ttm_mem_type_manager *man)
++{
++ return 0;
++}
++
++static void
++nouveau_gart_manager_del(struct ttm_mem_type_manager *man,
++ struct ttm_mem_reg *mem)
++{
++ struct nouveau_mem *node = mem->mm_node;
++
++ if (node->tmp_vma.node) {
++ nouveau_vm_unmap(&node->tmp_vma);
++ nouveau_vm_put(&node->tmp_vma);
++ }
++ mem->mm_node = NULL;
++}
++
++static int
++nouveau_gart_manager_new(struct ttm_mem_type_manager *man,
++ struct ttm_buffer_object *bo,
++ struct ttm_placement *placement,
++ struct ttm_mem_reg *mem)
++{
++ struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
++ struct nouveau_bo *nvbo = nouveau_bo(bo);
++ struct nouveau_vma *vma = &nvbo->vma;
++ struct nouveau_vm *vm = vma->vm;
++ struct nouveau_mem *node;
++ int ret;
++
++ if (unlikely((mem->num_pages << PAGE_SHIFT) >=
++ dev_priv->gart_info.aper_size))
++ return -ENOMEM;
++
++ node = kzalloc(sizeof(*node), GFP_KERNEL);
++ if (!node)
++ return -ENOMEM;
++
++ /* This node must be for evicting large-paged VRAM
++ * to system memory. Due to a nv50 limitation of
++ * not being able to mix large/small pages within
++ * the same PDE, we need to create a temporary
++ * small-paged VMA for the eviction.
++ */
++ if (vma->node->type != vm->spg_shift) {
++ ret = nouveau_vm_get(vm, (u64)vma->node->length << 12,
++ vm->spg_shift, NV_MEM_ACCESS_RW,
++ &node->tmp_vma);
++ if (ret) {
++ kfree(node);
++ return ret;
++ }
++ }
++
++ node->page_shift = nvbo->vma.node->type;
++ mem->mm_node = node;
++ mem->start = 0;
++ return 0;
++}
++
++void
++nouveau_gart_manager_debug(struct ttm_mem_type_manager *man, const char *prefix)
++{
++}
++
++const struct ttm_mem_type_manager_func nouveau_gart_manager = {
++ nouveau_gart_manager_init,
++ nouveau_gart_manager_fini,
++ nouveau_gart_manager_new,
++ nouveau_gart_manager_del,
++ nouveau_gart_manager_debug
++};
+diff --git a/drivers/gpu/drm/nouveau/nouveau_mm.h b/drivers/gpu/drm/nouveau/nouveau_mm.h
+index 798eaf3..1f7483a 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_mm.h
++++ b/drivers/gpu/drm/nouveau/nouveau_mm.h
+@@ -53,13 +53,13 @@ void nouveau_mm_put(struct nouveau_mm *, struct nouveau_mm_node *);
+
+ int nv50_vram_init(struct drm_device *);
+ int nv50_vram_new(struct drm_device *, u64 size, u32 align, u32 size_nc,
+- u32 memtype, struct nouveau_vram **);
+-void nv50_vram_del(struct drm_device *, struct nouveau_vram **);
++ u32 memtype, struct nouveau_mem **);
++void nv50_vram_del(struct drm_device *, struct nouveau_mem **);
+ bool nv50_vram_flags_valid(struct drm_device *, u32 tile_flags);
+
+ int nvc0_vram_init(struct drm_device *);
+ int nvc0_vram_new(struct drm_device *, u64 size, u32 align, u32 ncmin,
+- u32 memtype, struct nouveau_vram **);
++ u32 memtype, struct nouveau_mem **);
+ bool nvc0_vram_flags_valid(struct drm_device *, u32 tile_flags);
+
+ #endif
+diff --git a/drivers/gpu/drm/nouveau/nouveau_notifier.c b/drivers/gpu/drm/nouveau/nouveau_notifier.c
+index 5ea1676..7ba3fc0 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_notifier.c
++++ b/drivers/gpu/drm/nouveau/nouveau_notifier.c
+@@ -39,12 +39,11 @@ nouveau_notifier_init_channel(struct nouveau_channel *chan)
+ int ret;
+
+ if (nouveau_vram_notify)
+- flags = TTM_PL_FLAG_VRAM;
++ flags = NOUVEAU_GEM_DOMAIN_VRAM;
+ else
+- flags = TTM_PL_FLAG_TT;
++ flags = NOUVEAU_GEM_DOMAIN_GART;
+
+- ret = nouveau_gem_new(dev, NULL, PAGE_SIZE, 0, flags,
+- 0, 0x0000, false, true, &ntfy);
++ ret = nouveau_gem_new(dev, NULL, PAGE_SIZE, 0, flags, 0, 0, &ntfy);
+ if (ret)
+ return ret;
+
+@@ -100,6 +99,7 @@ nouveau_notifier_alloc(struct nouveau_channel *chan, uint32_t handle,
+ uint32_t *b_offset)
+ {
+ struct drm_device *dev = chan->dev;
++ struct drm_nouveau_private *dev_priv = dev->dev_private;
+ struct nouveau_gpuobj *nobj = NULL;
+ struct drm_mm_node *mem;
+ uint32_t offset;
+@@ -114,11 +114,16 @@ nouveau_notifier_alloc(struct nouveau_channel *chan, uint32_t handle,
+ return -ENOMEM;
+ }
+
+- if (chan->notifier_bo->bo.mem.mem_type == TTM_PL_VRAM)
+- target = NV_MEM_TARGET_VRAM;
+- else
+- target = NV_MEM_TARGET_GART;
+- offset = chan->notifier_bo->bo.mem.start << PAGE_SHIFT;
++ if (dev_priv->card_type < NV_50) {
++ if (chan->notifier_bo->bo.mem.mem_type == TTM_PL_VRAM)
++ target = NV_MEM_TARGET_VRAM;
++ else
++ target = NV_MEM_TARGET_GART;
++ offset = chan->notifier_bo->bo.mem.start << PAGE_SHIFT;
++ } else {
++ target = NV_MEM_TARGET_VM;
++ offset = chan->notifier_bo->vma.offset;
++ }
+ offset += mem->start;
+
+ ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY, offset,
+diff --git a/drivers/gpu/drm/nouveau/nouveau_object.c b/drivers/gpu/drm/nouveau/nouveau_object.c
+index 30b6544..823800d 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_object.c
++++ b/drivers/gpu/drm/nouveau/nouveau_object.c
+@@ -36,6 +36,7 @@
+ #include "nouveau_drm.h"
+ #include "nouveau_ramht.h"
+ #include "nouveau_vm.h"
++#include "nv50_display.h"
+
+ struct nouveau_gpuobj_method {
+ struct list_head head;
+@@ -490,16 +491,22 @@ nouveau_gpuobj_dma_new(struct nouveau_channel *chan, int class, u64 base,
+ }
+
+ if (target == NV_MEM_TARGET_GART) {
+- if (dev_priv->gart_info.type == NOUVEAU_GART_AGP) {
+- target = NV_MEM_TARGET_PCI_NOSNOOP;
+- base += dev_priv->gart_info.aper_base;
+- } else
+- if (base != 0) {
+- base = nouveau_sgdma_get_physical(dev, base);
++ struct nouveau_gpuobj *gart = dev_priv->gart_info.sg_ctxdma;
++
++ if (dev_priv->gart_info.type == NOUVEAU_GART_PDMA) {
++ if (base == 0) {
++ nouveau_gpuobj_ref(gart, pobj);
++ return 0;
++ }
++
++ base = nouveau_sgdma_get_physical(dev, base);
+ target = NV_MEM_TARGET_PCI;
+ } else {
+- nouveau_gpuobj_ref(dev_priv->gart_info.sg_ctxdma, pobj);
+- return 0;
++ base += dev_priv->gart_info.aper_base;
++ if (dev_priv->gart_info.type == NOUVEAU_GART_AGP)
++ target = NV_MEM_TARGET_PCI_NOSNOOP;
++ else
++ target = NV_MEM_TARGET_PCI;
+ }
+ }
+
+@@ -776,7 +783,7 @@ nouveau_gpuobj_channel_init(struct nouveau_channel *chan,
+ struct drm_device *dev = chan->dev;
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+ struct nouveau_gpuobj *vram = NULL, *tt = NULL;
+- int ret;
++ int ret, i;
+
+ NV_DEBUG(dev, "ch%d vram=0x%08x tt=0x%08x\n", chan->id, vram_h, tt_h);
+
+@@ -841,6 +848,25 @@ nouveau_gpuobj_channel_init(struct nouveau_channel *chan,
+ nouveau_gpuobj_ref(NULL, &ramht);
+ if (ret)
+ return ret;
++
++ /* dma objects for display sync channel semaphore blocks */
++ for (i = 0; i < 2; i++) {
++ struct nouveau_gpuobj *sem = NULL;
++ struct nv50_display_crtc *dispc =
++ &nv50_display(dev)->crtc[i];
++ u64 offset = dispc->sem.bo->bo.mem.start << PAGE_SHIFT;
++
++ ret = nouveau_gpuobj_dma_new(chan, 0x3d, offset, 0xfff,
++ NV_MEM_ACCESS_RW,
++ NV_MEM_TARGET_VRAM, &sem);
++ if (ret)
++ return ret;
++
++ ret = nouveau_ramht_insert(chan, NvEvoSema0 + i, sem);
++ nouveau_gpuobj_ref(NULL, &sem);
++ if (ret)
++ return ret;
++ }
+ }
+
+ /* VRAM ctxdma */
+diff --git a/drivers/gpu/drm/nouveau/nouveau_perf.c b/drivers/gpu/drm/nouveau/nouveau_perf.c
+index ac62a1b..670e3cb 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_perf.c
++++ b/drivers/gpu/drm/nouveau/nouveau_perf.c
+@@ -134,7 +134,7 @@ nouveau_perf_init(struct drm_device *dev)
+ case 0x13:
+ case 0x15:
+ perflvl->fanspeed = entry[55];
+- perflvl->voltage = entry[56];
++ perflvl->voltage = (recordlen > 56) ? entry[56] : 0;
+ perflvl->core = ROM32(entry[1]) * 10;
+ perflvl->memory = ROM32(entry[5]) * 20;
+ break;
+diff --git a/drivers/gpu/drm/nouveau/nouveau_pm.c b/drivers/gpu/drm/nouveau/nouveau_pm.c
+index 4399e2f..0b1caeb 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_pm.c
++++ b/drivers/gpu/drm/nouveau/nouveau_pm.c
+@@ -490,6 +490,7 @@ nouveau_pm_init(struct drm_device *dev)
+ /* determine current ("boot") performance level */
+ ret = nouveau_pm_perflvl_get(dev, &pm->boot);
+ if (ret == 0) {
++ strncpy(pm->boot.name, "boot", 4);
+ pm->cur = &pm->boot;
+
+ nouveau_pm_perflvl_info(&pm->boot, info, sizeof(info));
+diff --git a/drivers/gpu/drm/nouveau/nouveau_ramht.c b/drivers/gpu/drm/nouveau/nouveau_ramht.c
+index bef3e69..a24a81f 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_ramht.c
++++ b/drivers/gpu/drm/nouveau/nouveau_ramht.c
+@@ -114,7 +114,9 @@ nouveau_ramht_insert(struct nouveau_channel *chan, u32 handle,
+ (gpuobj->engine << NV40_RAMHT_CONTEXT_ENGINE_SHIFT);
+ } else {
+ if (gpuobj->engine == NVOBJ_ENGINE_DISPLAY) {
+- ctx = (gpuobj->cinst << 10) | chan->id;
++ ctx = (gpuobj->cinst << 10) |
++ (chan->id << 28) |
++ chan->id; /* HASH_TAG */
+ } else {
+ ctx = (gpuobj->cinst >> 4) |
+ ((gpuobj->engine <<
+diff --git a/drivers/gpu/drm/nouveau/nouveau_reg.h b/drivers/gpu/drm/nouveau/nouveau_reg.h
+index 04e8fb7..f18cdfc 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_reg.h
++++ b/drivers/gpu/drm/nouveau/nouveau_reg.h
+@@ -639,9 +639,9 @@
+ # define NV50_PCONNECTOR_I2C_PORT_4 0x0000e240
+ # define NV50_PCONNECTOR_I2C_PORT_5 0x0000e258
+
+-#define NV50_AUXCH_DATA_OUT(i,n) ((n) * 4 + (i) * 0x50 + 0x0000e4c0)
++#define NV50_AUXCH_DATA_OUT(i, n) ((n) * 4 + (i) * 0x50 + 0x0000e4c0)
+ #define NV50_AUXCH_DATA_OUT__SIZE 4
+-#define NV50_AUXCH_DATA_IN(i,n) ((n) * 4 + (i) * 0x50 + 0x0000e4d0)
++#define NV50_AUXCH_DATA_IN(i, n) ((n) * 4 + (i) * 0x50 + 0x0000e4d0)
+ #define NV50_AUXCH_DATA_IN__SIZE 4
+ #define NV50_AUXCH_ADDR(i) ((i) * 0x50 + 0x0000e4e0)
+ #define NV50_AUXCH_CTRL(i) ((i) * 0x50 + 0x0000e4e4)
+@@ -829,7 +829,7 @@
+ #define NV50_PDISPLAY_SOR_BACKLIGHT 0x0061c084
+ #define NV50_PDISPLAY_SOR_BACKLIGHT_ENABLE 0x80000000
+ #define NV50_PDISPLAY_SOR_BACKLIGHT_LEVEL 0x00000fff
+-#define NV50_SOR_DP_CTRL(i,l) (0x0061c10c + (i) * 0x800 + (l) * 0x80)
++#define NV50_SOR_DP_CTRL(i, l) (0x0061c10c + (i) * 0x800 + (l) * 0x80)
+ #define NV50_SOR_DP_CTRL_ENABLED 0x00000001
+ #define NV50_SOR_DP_CTRL_ENHANCED_FRAME_ENABLED 0x00004000
+ #define NV50_SOR_DP_CTRL_LANE_MASK 0x001f0000
+@@ -841,10 +841,10 @@
+ #define NV50_SOR_DP_CTRL_TRAINING_PATTERN_DISABLED 0x00000000
+ #define NV50_SOR_DP_CTRL_TRAINING_PATTERN_1 0x01000000
+ #define NV50_SOR_DP_CTRL_TRAINING_PATTERN_2 0x02000000
+-#define NV50_SOR_DP_UNK118(i,l) (0x0061c118 + (i) * 0x800 + (l) * 0x80)
+-#define NV50_SOR_DP_UNK120(i,l) (0x0061c120 + (i) * 0x800 + (l) * 0x80)
+-#define NV50_SOR_DP_UNK128(i,l) (0x0061c128 + (i) * 0x800 + (l) * 0x80)
+-#define NV50_SOR_DP_UNK130(i,l) (0x0061c130 + (i) * 0x800 + (l) * 0x80)
++#define NV50_SOR_DP_UNK118(i, l) (0x0061c118 + (i) * 0x800 + (l) * 0x80)
++#define NV50_SOR_DP_UNK120(i, l) (0x0061c120 + (i) * 0x800 + (l) * 0x80)
++#define NV50_SOR_DP_UNK128(i, l) (0x0061c128 + (i) * 0x800 + (l) * 0x80)
++#define NV50_SOR_DP_UNK130(i, l) (0x0061c130 + (i) * 0x800 + (l) * 0x80)
+
+ #define NV50_PDISPLAY_USER(i) ((i) * 0x1000 + 0x00640000)
+ #define NV50_PDISPLAY_USER_PUT(i) ((i) * 0x1000 + 0x00640000)
+diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
+index 9a250eb..2bf9686 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c
++++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
+@@ -74,8 +74,24 @@ nouveau_sgdma_clear(struct ttm_backend *be)
+ }
+ }
+
++static void
++nouveau_sgdma_destroy(struct ttm_backend *be)
++{
++ struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
++
++ if (be) {
++ NV_DEBUG(nvbe->dev, "\n");
++
++ if (nvbe) {
++ if (nvbe->pages)
++ be->func->clear(be);
++ kfree(nvbe);
++ }
++ }
++}
++
+ static int
+-nouveau_sgdma_bind(struct ttm_backend *be, struct ttm_mem_reg *mem)
++nv04_sgdma_bind(struct ttm_backend *be, struct ttm_mem_reg *mem)
+ {
+ struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
+ struct drm_device *dev = nvbe->dev;
+@@ -102,7 +118,7 @@ nouveau_sgdma_bind(struct ttm_backend *be, struct ttm_mem_reg *mem)
+ }
+
+ static int
+-nouveau_sgdma_unbind(struct ttm_backend *be)
++nv04_sgdma_unbind(struct ttm_backend *be)
+ {
+ struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
+ struct drm_device *dev = nvbe->dev;
+@@ -125,59 +141,245 @@ nouveau_sgdma_unbind(struct ttm_backend *be)
+ return 0;
+ }
+
++static struct ttm_backend_func nv04_sgdma_backend = {
++ .populate = nouveau_sgdma_populate,
++ .clear = nouveau_sgdma_clear,
++ .bind = nv04_sgdma_bind,
++ .unbind = nv04_sgdma_unbind,
++ .destroy = nouveau_sgdma_destroy
++};
++
+ static void
+-nouveau_sgdma_destroy(struct ttm_backend *be)
++nv41_sgdma_flush(struct nouveau_sgdma_be *nvbe)
++{
++ struct drm_device *dev = nvbe->dev;
++
++ nv_wr32(dev, 0x100810, 0x00000022);
++ if (!nv_wait(dev, 0x100810, 0x00000100, 0x00000100))
++ NV_ERROR(dev, "vm flush timeout: 0x%08x\n",
++ nv_rd32(dev, 0x100810));
++ nv_wr32(dev, 0x100810, 0x00000000);
++}
++
++static int
++nv41_sgdma_bind(struct ttm_backend *be, struct ttm_mem_reg *mem)
+ {
+ struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
++ struct drm_nouveau_private *dev_priv = nvbe->dev->dev_private;
++ struct nouveau_gpuobj *pgt = dev_priv->gart_info.sg_ctxdma;
++ dma_addr_t *list = nvbe->pages;
++ u32 pte = mem->start << 2;
++ u32 cnt = nvbe->nr_pages;
+
+- if (be) {
+- NV_DEBUG(nvbe->dev, "\n");
++ nvbe->offset = mem->start << PAGE_SHIFT;
+
+- if (nvbe) {
+- if (nvbe->pages)
+- be->func->clear(be);
+- kfree(nvbe);
++ while (cnt--) {
++ nv_wo32(pgt, pte, (*list++ >> 7) | 1);
++ pte += 4;
++ }
++
++ nv41_sgdma_flush(nvbe);
++ nvbe->bound = true;
++ return 0;
++}
++
++static int
++nv41_sgdma_unbind(struct ttm_backend *be)
++{
++ struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
++ struct drm_nouveau_private *dev_priv = nvbe->dev->dev_private;
++ struct nouveau_gpuobj *pgt = dev_priv->gart_info.sg_ctxdma;
++ u32 pte = (nvbe->offset >> 12) << 2;
++ u32 cnt = nvbe->nr_pages;
++
++ while (cnt--) {
++ nv_wo32(pgt, pte, 0x00000000);
++ pte += 4;
++ }
++
++ nv41_sgdma_flush(nvbe);
++ nvbe->bound = false;
++ return 0;
++}
++
++static struct ttm_backend_func nv41_sgdma_backend = {
++ .populate = nouveau_sgdma_populate,
++ .clear = nouveau_sgdma_clear,
++ .bind = nv41_sgdma_bind,
++ .unbind = nv41_sgdma_unbind,
++ .destroy = nouveau_sgdma_destroy
++};
++
++static void
++nv44_sgdma_flush(struct nouveau_sgdma_be *nvbe)
++{
++ struct drm_device *dev = nvbe->dev;
++
++ nv_wr32(dev, 0x100814, (nvbe->nr_pages - 1) << 12);
++ nv_wr32(dev, 0x100808, nvbe->offset | 0x20);
++ if (!nv_wait(dev, 0x100808, 0x00000001, 0x00000001))
++ NV_ERROR(dev, "gart flush timeout: 0x%08x\n",
++ nv_rd32(dev, 0x100808));
++ nv_wr32(dev, 0x100808, 0x00000000);
++}
++
++static void
++nv44_sgdma_fill(struct nouveau_gpuobj *pgt, dma_addr_t *list, u32 base, u32 cnt)
++{
++ struct drm_nouveau_private *dev_priv = pgt->dev->dev_private;
++ dma_addr_t dummy = dev_priv->gart_info.dummy.addr;
++ u32 pte, tmp[4];
++
++ pte = base >> 2;
++ base &= ~0x0000000f;
++
++ tmp[0] = nv_ro32(pgt, base + 0x0);
++ tmp[1] = nv_ro32(pgt, base + 0x4);
++ tmp[2] = nv_ro32(pgt, base + 0x8);
++ tmp[3] = nv_ro32(pgt, base + 0xc);
++ while (cnt--) {
++ u32 addr = list ? (*list++ >> 12) : (dummy >> 12);
++ switch (pte++ & 0x3) {
++ case 0:
++ tmp[0] &= ~0x07ffffff;
++ tmp[0] |= addr;
++ break;
++ case 1:
++ tmp[0] &= ~0xf8000000;
++ tmp[0] |= addr << 27;
++ tmp[1] &= ~0x003fffff;
++ tmp[1] |= addr >> 5;
++ break;
++ case 2:
++ tmp[1] &= ~0xffc00000;
++ tmp[1] |= addr << 22;
++ tmp[2] &= ~0x0001ffff;
++ tmp[2] |= addr >> 10;
++ break;
++ case 3:
++ tmp[2] &= ~0xfffe0000;
++ tmp[2] |= addr << 17;
++ tmp[3] &= ~0x00000fff;
++ tmp[3] |= addr >> 15;
++ break;
+ }
+ }
++
++ tmp[3] |= 0x40000000;
++
++ nv_wo32(pgt, base + 0x0, tmp[0]);
++ nv_wo32(pgt, base + 0x4, tmp[1]);
++ nv_wo32(pgt, base + 0x8, tmp[2]);
++ nv_wo32(pgt, base + 0xc, tmp[3]);
+ }
+
+ static int
+-nv50_sgdma_bind(struct ttm_backend *be, struct ttm_mem_reg *mem)
++nv44_sgdma_bind(struct ttm_backend *be, struct ttm_mem_reg *mem)
+ {
+ struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
+ struct drm_nouveau_private *dev_priv = nvbe->dev->dev_private;
++ struct nouveau_gpuobj *pgt = dev_priv->gart_info.sg_ctxdma;
++ dma_addr_t *list = nvbe->pages;
++ u32 pte = mem->start << 2, tmp[4];
++ u32 cnt = nvbe->nr_pages;
++ int i;
+
+ nvbe->offset = mem->start << PAGE_SHIFT;
+
+- nouveau_vm_map_sg(&dev_priv->gart_info.vma, nvbe->offset,
+- nvbe->nr_pages << PAGE_SHIFT, nvbe->pages);
++ if (pte & 0x0000000c) {
++ u32 max = 4 - ((pte >> 2) & 0x3);
++ u32 part = (cnt > max) ? max : cnt;
++ nv44_sgdma_fill(pgt, list, pte, part);
++ pte += (part << 2);
++ list += part;
++ cnt -= part;
++ }
++
++ while (cnt >= 4) {
++ for (i = 0; i < 4; i++)
++ tmp[i] = *list++ >> 12;
++ nv_wo32(pgt, pte + 0x0, tmp[0] >> 0 | tmp[1] << 27);
++ nv_wo32(pgt, pte + 0x4, tmp[1] >> 5 | tmp[2] << 22);
++ nv_wo32(pgt, pte + 0x8, tmp[2] >> 10 | tmp[3] << 17);
++ nv_wo32(pgt, pte + 0xc, tmp[3] >> 15 | 0x40000000);
++ pte += 0x10;
++ cnt -= 4;
++ }
++
++ if (cnt)
++ nv44_sgdma_fill(pgt, list, pte, cnt);
++
++ nv44_sgdma_flush(nvbe);
+ nvbe->bound = true;
+ return 0;
+ }
+
+ static int
+-nv50_sgdma_unbind(struct ttm_backend *be)
++nv44_sgdma_unbind(struct ttm_backend *be)
+ {
+ struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
+ struct drm_nouveau_private *dev_priv = nvbe->dev->dev_private;
++ struct nouveau_gpuobj *pgt = dev_priv->gart_info.sg_ctxdma;
++ u32 pte = (nvbe->offset >> 12) << 2;
++ u32 cnt = nvbe->nr_pages;
++
++ if (pte & 0x0000000c) {
++ u32 max = 4 - ((pte >> 2) & 0x3);
++ u32 part = (cnt > max) ? max : cnt;
++ nv44_sgdma_fill(pgt, NULL, pte, part);
++ pte += (part << 2);
++ cnt -= part;
++ }
+
+- if (!nvbe->bound)
+- return 0;
++ while (cnt >= 4) {
++ nv_wo32(pgt, pte + 0x0, 0x00000000);
++ nv_wo32(pgt, pte + 0x4, 0x00000000);
++ nv_wo32(pgt, pte + 0x8, 0x00000000);
++ nv_wo32(pgt, pte + 0xc, 0x00000000);
++ pte += 0x10;
++ cnt -= 4;
++ }
+
+- nouveau_vm_unmap_at(&dev_priv->gart_info.vma, nvbe->offset,
+- nvbe->nr_pages << PAGE_SHIFT);
++ if (cnt)
++ nv44_sgdma_fill(pgt, NULL, pte, cnt);
++
++ nv44_sgdma_flush(nvbe);
+ nvbe->bound = false;
+ return 0;
+ }
+
+-static struct ttm_backend_func nouveau_sgdma_backend = {
++static struct ttm_backend_func nv44_sgdma_backend = {
+ .populate = nouveau_sgdma_populate,
+ .clear = nouveau_sgdma_clear,
+- .bind = nouveau_sgdma_bind,
+- .unbind = nouveau_sgdma_unbind,
++ .bind = nv44_sgdma_bind,
++ .unbind = nv44_sgdma_unbind,
+ .destroy = nouveau_sgdma_destroy
+ };
+
++static int
++nv50_sgdma_bind(struct ttm_backend *be, struct ttm_mem_reg *mem)
++{
++ struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
++ struct nouveau_mem *node = mem->mm_node;
++ /* noop: bound in move_notify() */
++ node->pages = nvbe->pages;
++ nvbe->pages = (dma_addr_t *)node;
++ nvbe->bound = true;
++ return 0;
++}
++
++static int
++nv50_sgdma_unbind(struct ttm_backend *be)
++{
++ struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
++ struct nouveau_mem *node = (struct nouveau_mem *)nvbe->pages;
++ /* noop: unbound in move_notify() */
++ nvbe->pages = node->pages;
++ node->pages = NULL;
++ nvbe->bound = false;
++ return 0;
++}
++
+ static struct ttm_backend_func nv50_sgdma_backend = {
+ .populate = nouveau_sgdma_populate,
+ .clear = nouveau_sgdma_clear,
+@@ -198,10 +400,7 @@ nouveau_sgdma_init_ttm(struct drm_device *dev)
+
+ nvbe->dev = dev;
+
+- if (dev_priv->card_type < NV_50)
+- nvbe->backend.func = &nouveau_sgdma_backend;
+- else
+- nvbe->backend.func = &nv50_sgdma_backend;
++ nvbe->backend.func = dev_priv->gart_info.func;
+ return &nvbe->backend;
+ }
+
+@@ -210,21 +409,64 @@ nouveau_sgdma_init(struct drm_device *dev)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+ struct nouveau_gpuobj *gpuobj = NULL;
+- uint32_t aper_size, obj_size;
+- int i, ret;
++ u32 aper_size, align;
++ int ret;
+
+- if (dev_priv->card_type < NV_50) {
+- if(dev_priv->ramin_rsvd_vram < 2 * 1024 * 1024)
+- aper_size = 64 * 1024 * 1024;
+- else
+- aper_size = 512 * 1024 * 1024;
++ if (dev_priv->card_type >= NV_40 && drm_device_is_pcie(dev))
++ aper_size = 512 * 1024 * 1024;
++ else
++ aper_size = 64 * 1024 * 1024;
++
++ /* Dear NVIDIA, NV44+ would like proper present bits in PTEs for
++ * christmas. The cards before it have them, the cards after
++ * it have them, why is NV44 so unloved?
++ */
++ dev_priv->gart_info.dummy.page = alloc_page(GFP_DMA32 | GFP_KERNEL);
++ if (!dev_priv->gart_info.dummy.page)
++ return -ENOMEM;
+
+- obj_size = (aper_size >> NV_CTXDMA_PAGE_SHIFT) * 4;
+- obj_size += 8; /* ctxdma header */
++ dev_priv->gart_info.dummy.addr =
++ pci_map_page(dev->pdev, dev_priv->gart_info.dummy.page,
++ 0, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
++ if (pci_dma_mapping_error(dev->pdev, dev_priv->gart_info.dummy.addr)) {
++ NV_ERROR(dev, "error mapping dummy page\n");
++ __free_page(dev_priv->gart_info.dummy.page);
++ dev_priv->gart_info.dummy.page = NULL;
++ return -ENOMEM;
++ }
+
+- ret = nouveau_gpuobj_new(dev, NULL, obj_size, 16,
+- NVOBJ_FLAG_ZERO_ALLOC |
+- NVOBJ_FLAG_ZERO_FREE, &gpuobj);
++ if (dev_priv->card_type >= NV_50) {
++ dev_priv->gart_info.aper_base = 0;
++ dev_priv->gart_info.aper_size = aper_size;
++ dev_priv->gart_info.type = NOUVEAU_GART_HW;
++ dev_priv->gart_info.func = &nv50_sgdma_backend;
++ } else
++ if (0 && drm_device_is_pcie(dev) &&
++ dev_priv->chipset > 0x40 && dev_priv->chipset != 0x45) {
++ if (nv44_graph_class(dev)) {
++ dev_priv->gart_info.func = &nv44_sgdma_backend;
++ align = 512 * 1024;
++ } else {
++ dev_priv->gart_info.func = &nv41_sgdma_backend;
++ align = 16;
++ }
++
++ ret = nouveau_gpuobj_new(dev, NULL, aper_size / 1024, align,
++ NVOBJ_FLAG_ZERO_ALLOC |
++ NVOBJ_FLAG_ZERO_FREE, &gpuobj);
++ if (ret) {
++ NV_ERROR(dev, "Error creating sgdma object: %d\n", ret);
++ return ret;
++ }
++
++ dev_priv->gart_info.sg_ctxdma = gpuobj;
++ dev_priv->gart_info.aper_base = 0;
++ dev_priv->gart_info.aper_size = aper_size;
++ dev_priv->gart_info.type = NOUVEAU_GART_HW;
++ } else {
++ ret = nouveau_gpuobj_new(dev, NULL, (aper_size / 1024) + 8, 16,
++ NVOBJ_FLAG_ZERO_ALLOC |
++ NVOBJ_FLAG_ZERO_FREE, &gpuobj);
+ if (ret) {
+ NV_ERROR(dev, "Error creating sgdma object: %d\n", ret);
+ return ret;
+@@ -236,25 +478,14 @@ nouveau_sgdma_init(struct drm_device *dev)
+ (0 << 14) /* RW */ |
+ (2 << 16) /* PCI */);
+ nv_wo32(gpuobj, 4, aper_size - 1);
+- for (i = 2; i < 2 + (aper_size >> 12); i++)
+- nv_wo32(gpuobj, i * 4, 0x00000000);
+
+ dev_priv->gart_info.sg_ctxdma = gpuobj;
+ dev_priv->gart_info.aper_base = 0;
+ dev_priv->gart_info.aper_size = aper_size;
+- } else
+- if (dev_priv->chan_vm) {
+- ret = nouveau_vm_get(dev_priv->chan_vm, 512 * 1024 * 1024,
+- 12, NV_MEM_ACCESS_RW,
+- &dev_priv->gart_info.vma);
+- if (ret)
+- return ret;
+-
+- dev_priv->gart_info.aper_base = dev_priv->gart_info.vma.offset;
+- dev_priv->gart_info.aper_size = 512 * 1024 * 1024;
++ dev_priv->gart_info.type = NOUVEAU_GART_PDMA;
++ dev_priv->gart_info.func = &nv04_sgdma_backend;
+ }
+
+- dev_priv->gart_info.type = NOUVEAU_GART_SGDMA;
+ return 0;
+ }
+
+@@ -264,7 +495,13 @@ nouveau_sgdma_takedown(struct drm_device *dev)
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+
+ nouveau_gpuobj_ref(NULL, &dev_priv->gart_info.sg_ctxdma);
+- nouveau_vm_put(&dev_priv->gart_info.vma);
++
++ if (dev_priv->gart_info.dummy.page) {
++ pci_unmap_page(dev->pdev, dev_priv->gart_info.dummy.addr,
++ PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
++ __free_page(dev_priv->gart_info.dummy.page);
++ dev_priv->gart_info.dummy.page = NULL;
++ }
+ }
+
+ uint32_t
+diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
+index a54fc43..eb4f09e 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_state.c
++++ b/drivers/gpu/drm/nouveau/nouveau_state.c
+@@ -376,15 +376,11 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
+ engine->graph.destroy_context = nv50_graph_destroy_context;
+ engine->graph.load_context = nv50_graph_load_context;
+ engine->graph.unload_context = nv50_graph_unload_context;
+- if (dev_priv->chipset != 0x86)
++ if (dev_priv->chipset == 0x50 ||
++ dev_priv->chipset == 0xac)
+ engine->graph.tlb_flush = nv50_graph_tlb_flush;
+- else {
+- /* from what i can see nvidia do this on every
+- * pre-NVA3 board except NVAC, but, we've only
+- * ever seen problems on NV86
+- */
+- engine->graph.tlb_flush = nv86_graph_tlb_flush;
+- }
++ else
++ engine->graph.tlb_flush = nv84_graph_tlb_flush;
+ engine->fifo.channels = 128;
+ engine->fifo.init = nv50_fifo_init;
+ engine->fifo.takedown = nv50_fifo_takedown;
+@@ -544,7 +540,6 @@ static int
+ nouveau_card_init_channel(struct drm_device *dev)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+- struct nouveau_gpuobj *gpuobj = NULL;
+ int ret;
+
+ ret = nouveau_channel_alloc(dev, &dev_priv->channel,
+@@ -552,41 +547,8 @@ nouveau_card_init_channel(struct drm_device *dev)
+ if (ret)
+ return ret;
+
+- /* no dma objects on fermi... */
+- if (dev_priv->card_type >= NV_C0)
+- goto out_done;
+-
+- ret = nouveau_gpuobj_dma_new(dev_priv->channel, NV_CLASS_DMA_IN_MEMORY,
+- 0, dev_priv->vram_size,
+- NV_MEM_ACCESS_RW, NV_MEM_TARGET_VRAM,
+- &gpuobj);
+- if (ret)
+- goto out_err;
+-
+- ret = nouveau_ramht_insert(dev_priv->channel, NvDmaVRAM, gpuobj);
+- nouveau_gpuobj_ref(NULL, &gpuobj);
+- if (ret)
+- goto out_err;
+-
+- ret = nouveau_gpuobj_dma_new(dev_priv->channel, NV_CLASS_DMA_IN_MEMORY,
+- 0, dev_priv->gart_info.aper_size,
+- NV_MEM_ACCESS_RW, NV_MEM_TARGET_GART,
+- &gpuobj);
+- if (ret)
+- goto out_err;
+-
+- ret = nouveau_ramht_insert(dev_priv->channel, NvDmaGART, gpuobj);
+- nouveau_gpuobj_ref(NULL, &gpuobj);
+- if (ret)
+- goto out_err;
+-
+-out_done:
+ mutex_unlock(&dev_priv->channel->mutex);
+ return 0;
+-
+-out_err:
+- nouveau_channel_put(&dev_priv->channel);
+- return ret;
+ }
+
+ static void nouveau_switcheroo_set_state(struct pci_dev *pdev,
+@@ -904,7 +866,7 @@ static int nouveau_remove_conflicting_drivers(struct drm_device *dev)
+ #ifdef CONFIG_X86
+ primary = dev->pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
+ #endif
+-
++
+ remove_conflicting_framebuffers(dev_priv->apertures, "nouveaufb", primary);
+ return 0;
+ }
+@@ -929,12 +891,6 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
+ NV_DEBUG(dev, "vendor: 0x%X device: 0x%X class: 0x%X\n",
+ dev->pci_vendor, dev->pci_device, dev->pdev->class);
+
+- dev_priv->wq = create_workqueue("nouveau");
+- if (!dev_priv->wq) {
+- ret = -EINVAL;
+- goto err_priv;
+- }
+-
+ /* resource 0 is mmio regs */
+ /* resource 1 is linear FB */
+ /* resource 2 is RAMIN (mmio regs + 0x1000000) */
+@@ -947,7 +903,7 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
+ NV_ERROR(dev, "Unable to initialize the mmio mapping. "
+ "Please report your setup to " DRIVER_EMAIL "\n");
+ ret = -EINVAL;
+- goto err_wq;
++ goto err_priv;
+ }
+ NV_DEBUG(dev, "regs mapped ok at 0x%llx\n",
+ (unsigned long long)mmio_start_offs);
+@@ -962,11 +918,13 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
+
+ /* Time to determine the card architecture */
+ reg0 = nv_rd32(dev, NV03_PMC_BOOT_0);
++ dev_priv->stepping = 0; /* XXX: add stepping for pre-NV10? */
+
+ /* We're dealing with >=NV10 */
+ if ((reg0 & 0x0f000000) > 0) {
+ /* Bit 27-20 contain the architecture in hex */
+ dev_priv->chipset = (reg0 & 0xff00000) >> 20;
++ dev_priv->stepping = (reg0 & 0xff);
+ /* NV04 or NV05 */
+ } else if ((reg0 & 0xff00fff0) == 0x20004000) {
+ if (reg0 & 0x00f00000)
+@@ -1054,8 +1012,6 @@ err_ramin:
+ iounmap(dev_priv->ramin);
+ err_mmio:
+ iounmap(dev_priv->mmio);
+-err_wq:
+- destroy_workqueue(dev_priv->wq);
+ err_priv:
+ kfree(dev_priv);
+ dev->dev_private = NULL;
+@@ -1126,7 +1082,7 @@ int nouveau_ioctl_getparam(struct drm_device *dev, void *data,
+ getparam->value = 1;
+ break;
+ case NOUVEAU_GETPARAM_HAS_PAGEFLIP:
+- getparam->value = (dev_priv->card_type < NV_50);
++ getparam->value = 1;
+ break;
+ case NOUVEAU_GETPARAM_GRAPH_UNITS:
+ /* NV40 and NV50 versions are quite different, but register
+diff --git a/drivers/gpu/drm/nouveau/nouveau_temp.c b/drivers/gpu/drm/nouveau/nouveau_temp.c
+index 8d9968e..649b041 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_temp.c
++++ b/drivers/gpu/drm/nouveau/nouveau_temp.c
+@@ -239,11 +239,9 @@ static bool
+ probe_monitoring_device(struct nouveau_i2c_chan *i2c,
+ struct i2c_board_info *info)
+ {
+- char modalias[16] = "i2c:";
+ struct i2c_client *client;
+
+- strlcat(modalias, info->type, sizeof(modalias));
+- request_module(modalias);
++ request_module("%s%s", I2C_MODULE_PREFIX, info->type);
+
+ client = i2c_new_device(&i2c->adapter, info);
+ if (!client)
+diff --git a/drivers/gpu/drm/nouveau/nouveau_util.c b/drivers/gpu/drm/nouveau/nouveau_util.c
+index fbe0fb1..e51b515 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_util.c
++++ b/drivers/gpu/drm/nouveau/nouveau_util.c
+@@ -47,18 +47,27 @@ nouveau_bitfield_print(const struct nouveau_bitfield *bf, u32 value)
+ printk(" (unknown bits 0x%08x)", value);
+ }
+
+-void
+-nouveau_enum_print(const struct nouveau_enum *en, u32 value)
++const struct nouveau_enum *
++nouveau_enum_find(const struct nouveau_enum *en, u32 value)
+ {
+ while (en->name) {
+- if (value == en->value) {
+- printk("%s", en->name);
+- return;
+- }
+-
++ if (en->value == value)
++ return en;
+ en++;
+ }
+
++ return NULL;
++}
++
++void
++nouveau_enum_print(const struct nouveau_enum *en, u32 value)
++{
++ en = nouveau_enum_find(en, value);
++ if (en) {
++ printk("%s", en->name);
++ return;
++ }
++
+ printk("(unknown enum 0x%08x)", value);
+ }
+
+diff --git a/drivers/gpu/drm/nouveau/nouveau_util.h b/drivers/gpu/drm/nouveau/nouveau_util.h
+index d9ceaea..b97719f 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_util.h
++++ b/drivers/gpu/drm/nouveau/nouveau_util.h
+@@ -36,10 +36,14 @@ struct nouveau_bitfield {
+ struct nouveau_enum {
+ u32 value;
+ const char *name;
++ void *data;
+ };
+
+ void nouveau_bitfield_print(const struct nouveau_bitfield *, u32 value);
+ void nouveau_enum_print(const struct nouveau_enum *, u32 value);
++const struct nouveau_enum *
++nouveau_enum_find(const struct nouveau_enum *, u32 value);
++
+ int nouveau_ratelimit(void);
+
+ #endif
+diff --git a/drivers/gpu/drm/nouveau/nouveau_vm.c b/drivers/gpu/drm/nouveau/nouveau_vm.c
+index 97d82ae..0059e6f 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_vm.c
++++ b/drivers/gpu/drm/nouveau/nouveau_vm.c
+@@ -28,7 +28,7 @@
+ #include "nouveau_vm.h"
+
+ void
+-nouveau_vm_map_at(struct nouveau_vma *vma, u64 delta, struct nouveau_vram *vram)
++nouveau_vm_map_at(struct nouveau_vma *vma, u64 delta, struct nouveau_mem *node)
+ {
+ struct nouveau_vm *vm = vma->vm;
+ struct nouveau_mm_node *r;
+@@ -40,7 +40,8 @@ nouveau_vm_map_at(struct nouveau_vma *vma, u64 delta, struct nouveau_vram *vram)
+ u32 max = 1 << (vm->pgt_bits - bits);
+ u32 end, len;
+
+- list_for_each_entry(r, &vram->regions, rl_entry) {
++ delta = 0;
++ list_for_each_entry(r, &node->regions, rl_entry) {
+ u64 phys = (u64)r->offset << 12;
+ u32 num = r->length >> bits;
+
+@@ -52,7 +53,7 @@ nouveau_vm_map_at(struct nouveau_vma *vma, u64 delta, struct nouveau_vram *vram)
+ end = max;
+ len = end - pte;
+
+- vm->map(vma, pgt, vram, pte, len, phys);
++ vm->map(vma, pgt, node, pte, len, phys, delta);
+
+ num -= len;
+ pte += len;
+@@ -60,6 +61,8 @@ nouveau_vm_map_at(struct nouveau_vma *vma, u64 delta, struct nouveau_vram *vram)
+ pde++;
+ pte = 0;
+ }
++
++ delta += (u64)len << vma->node->type;
+ }
+ }
+
+@@ -67,14 +70,14 @@ nouveau_vm_map_at(struct nouveau_vma *vma, u64 delta, struct nouveau_vram *vram)
+ }
+
+ void
+-nouveau_vm_map(struct nouveau_vma *vma, struct nouveau_vram *vram)
++nouveau_vm_map(struct nouveau_vma *vma, struct nouveau_mem *node)
+ {
+- nouveau_vm_map_at(vma, 0, vram);
++ nouveau_vm_map_at(vma, 0, node);
+ }
+
+ void
+ nouveau_vm_map_sg(struct nouveau_vma *vma, u64 delta, u64 length,
+- dma_addr_t *list)
++ struct nouveau_mem *mem, dma_addr_t *list)
+ {
+ struct nouveau_vm *vm = vma->vm;
+ int big = vma->node->type != vm->spg_shift;
+@@ -94,7 +97,7 @@ nouveau_vm_map_sg(struct nouveau_vma *vma, u64 delta, u64 length,
+ end = max;
+ len = end - pte;
+
+- vm->map_sg(vma, pgt, pte, list, len);
++ vm->map_sg(vma, pgt, mem, pte, len, list);
+
+ num -= len;
+ pte += len;
+@@ -311,18 +314,7 @@ nouveau_vm_new(struct drm_device *dev, u64 offset, u64 length, u64 mm_offset,
+ vm->spg_shift = 12;
+ vm->lpg_shift = 17;
+ pgt_bits = 27;
+-
+- /* Should be 4096 everywhere, this is a hack that's
+- * currently necessary to avoid an elusive bug that
+- * causes corruption when mixing small/large pages
+- */
+- if (length < (1ULL << 40))
+- block = 4096;
+- else {
+- block = (1 << pgt_bits);
+- if (length < block)
+- block = length;
+- }
++ block = 4096;
+ } else {
+ kfree(vm);
+ return -ENOSYS;
+diff --git a/drivers/gpu/drm/nouveau/nouveau_vm.h b/drivers/gpu/drm/nouveau/nouveau_vm.h
+index e119351..2e06b55 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_vm.h
++++ b/drivers/gpu/drm/nouveau/nouveau_vm.h
+@@ -67,9 +67,10 @@ struct nouveau_vm {
+ void (*map_pgt)(struct nouveau_gpuobj *pgd, u32 pde,
+ struct nouveau_gpuobj *pgt[2]);
+ void (*map)(struct nouveau_vma *, struct nouveau_gpuobj *,
+- struct nouveau_vram *, u32 pte, u32 cnt, u64 phys);
++ struct nouveau_mem *, u32 pte, u32 cnt,
++ u64 phys, u64 delta);
+ void (*map_sg)(struct nouveau_vma *, struct nouveau_gpuobj *,
+- u32 pte, dma_addr_t *, u32 cnt);
++ struct nouveau_mem *, u32 pte, u32 cnt, dma_addr_t *);
+ void (*unmap)(struct nouveau_gpuobj *pgt, u32 pte, u32 cnt);
+ void (*flush)(struct nouveau_vm *);
+ };
+@@ -82,20 +83,20 @@ int nouveau_vm_ref(struct nouveau_vm *, struct nouveau_vm **,
+ int nouveau_vm_get(struct nouveau_vm *, u64 size, u32 page_shift,
+ u32 access, struct nouveau_vma *);
+ void nouveau_vm_put(struct nouveau_vma *);
+-void nouveau_vm_map(struct nouveau_vma *, struct nouveau_vram *);
+-void nouveau_vm_map_at(struct nouveau_vma *, u64 offset, struct nouveau_vram *);
++void nouveau_vm_map(struct nouveau_vma *, struct nouveau_mem *);
++void nouveau_vm_map_at(struct nouveau_vma *, u64 offset, struct nouveau_mem *);
+ void nouveau_vm_unmap(struct nouveau_vma *);
+ void nouveau_vm_unmap_at(struct nouveau_vma *, u64 offset, u64 length);
+ void nouveau_vm_map_sg(struct nouveau_vma *, u64 offset, u64 length,
+- dma_addr_t *);
++ struct nouveau_mem *, dma_addr_t *);
+
+ /* nv50_vm.c */
+ void nv50_vm_map_pgt(struct nouveau_gpuobj *pgd, u32 pde,
+ struct nouveau_gpuobj *pgt[2]);
+ void nv50_vm_map(struct nouveau_vma *, struct nouveau_gpuobj *,
+- struct nouveau_vram *, u32 pte, u32 cnt, u64 phys);
++ struct nouveau_mem *, u32 pte, u32 cnt, u64 phys, u64 delta);
+ void nv50_vm_map_sg(struct nouveau_vma *, struct nouveau_gpuobj *,
+- u32 pte, dma_addr_t *, u32 cnt);
++ struct nouveau_mem *, u32 pte, u32 cnt, dma_addr_t *);
+ void nv50_vm_unmap(struct nouveau_gpuobj *, u32 pte, u32 cnt);
+ void nv50_vm_flush(struct nouveau_vm *);
+ void nv50_vm_flush_engine(struct drm_device *, int engine);
+@@ -104,9 +105,9 @@ void nv50_vm_flush_engine(struct drm_device *, int engine);
+ void nvc0_vm_map_pgt(struct nouveau_gpuobj *pgd, u32 pde,
+ struct nouveau_gpuobj *pgt[2]);
+ void nvc0_vm_map(struct nouveau_vma *, struct nouveau_gpuobj *,
+- struct nouveau_vram *, u32 pte, u32 cnt, u64 phys);
++ struct nouveau_mem *, u32 pte, u32 cnt, u64 phys, u64 delta);
+ void nvc0_vm_map_sg(struct nouveau_vma *, struct nouveau_gpuobj *,
+- u32 pte, dma_addr_t *, u32 cnt);
++ struct nouveau_mem *, u32 pte, u32 cnt, dma_addr_t *);
+ void nvc0_vm_unmap(struct nouveau_gpuobj *, u32 pte, u32 cnt);
+ void nvc0_vm_flush(struct nouveau_vm *);
+
+diff --git a/drivers/gpu/drm/nouveau/nouveau_volt.c b/drivers/gpu/drm/nouveau/nouveau_volt.c
+index 04fdc00..75e87274 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_volt.c
++++ b/drivers/gpu/drm/nouveau/nouveau_volt.c
+@@ -159,8 +159,16 @@ nouveau_volt_init(struct drm_device *dev)
+ headerlen = volt[1];
+ recordlen = volt[2];
+ entries = volt[3];
+- vidshift = hweight8(volt[5]);
+ vidmask = volt[4];
++ /* no longer certain what volt[5] is, if it's related to
++ * the vid shift then it's definitely not a function of
++ * how many bits are set.
++ *
++ * after looking at a number of nva3+ vbios images, they
++ * all seem likely to have a static shift of 2.. lets
++ * go with that for now until proven otherwise.
++ */
++ vidshift = 2;
+ break;
+ default:
+ NV_WARN(dev, "voltage table 0x%02x unknown\n", volt[0]);
+diff --git a/drivers/gpu/drm/nouveau/nv04_crtc.c b/drivers/gpu/drm/nouveau/nv04_crtc.c
+index 297505e..5ffc5ba 100644
+--- a/drivers/gpu/drm/nouveau/nv04_crtc.c
++++ b/drivers/gpu/drm/nouveau/nv04_crtc.c
+@@ -790,8 +790,7 @@ nv04_crtc_do_mode_set_base(struct drm_crtc *crtc,
+ if (atomic) {
+ drm_fb = passed_fb;
+ fb = nouveau_framebuffer(passed_fb);
+- }
+- else {
++ } else {
+ /* If not atomic, we can go ahead and pin, and unpin the
+ * old fb we were passed.
+ */
+@@ -1031,7 +1030,7 @@ nv04_crtc_create(struct drm_device *dev, int crtc_num)
+ drm_mode_crtc_set_gamma_size(&nv_crtc->base, 256);
+
+ ret = nouveau_bo_new(dev, NULL, 64*64*4, 0x100, TTM_PL_FLAG_VRAM,
+- 0, 0x0000, false, true, &nv_crtc->cursor.nvbo);
++ 0, 0x0000, &nv_crtc->cursor.nvbo);
+ if (!ret) {
+ ret = nouveau_bo_pin(nv_crtc->cursor.nvbo, TTM_PL_FLAG_VRAM);
+ if (!ret)
+diff --git a/drivers/gpu/drm/nouveau/nv04_dfp.c b/drivers/gpu/drm/nouveau/nv04_dfp.c
+index c82db37..12098bf 100644
+--- a/drivers/gpu/drm/nouveau/nv04_dfp.c
++++ b/drivers/gpu/drm/nouveau/nv04_dfp.c
+@@ -581,12 +581,13 @@ static void nv04_dfp_restore(struct drm_encoder *encoder)
+ int head = nv_encoder->restore.head;
+
+ if (nv_encoder->dcb->type == OUTPUT_LVDS) {
+- struct drm_display_mode *native_mode = nouveau_encoder_connector_get(nv_encoder)->native_mode;
+- if (native_mode)
+- call_lvds_script(dev, nv_encoder->dcb, head, LVDS_PANEL_ON,
+- native_mode->clock);
+- else
+- NV_ERROR(dev, "Not restoring LVDS without native mode\n");
++ struct nouveau_connector *connector =
++ nouveau_encoder_connector_get(nv_encoder);
++
++ if (connector && connector->native_mode)
++ call_lvds_script(dev, nv_encoder->dcb, head,
++ LVDS_PANEL_ON,
++ connector->native_mode->clock);
+
+ } else if (nv_encoder->dcb->type == OUTPUT_TMDS) {
+ int clock = nouveau_hw_pllvals_to_clk
+diff --git a/drivers/gpu/drm/nouveau/nv04_fifo.c b/drivers/gpu/drm/nouveau/nv04_fifo.c
+index f89d104..db465a3 100644
+--- a/drivers/gpu/drm/nouveau/nv04_fifo.c
++++ b/drivers/gpu/drm/nouveau/nv04_fifo.c
+@@ -379,6 +379,15 @@ out:
+ return handled;
+ }
+
++static const char *nv_dma_state_err(u32 state)
++{
++ static const char * const desc[] = {
++ "NONE", "CALL_SUBR_ACTIVE", "INVALID_MTHD", "RET_SUBR_INACTIVE",
++ "INVALID_CMD", "IB_EMPTY"/* NV50+ */, "MEM_FAULT", "UNK"
++ };
++ return desc[(state >> 29) & 0x7];
++}
++
+ void
+ nv04_fifo_isr(struct drm_device *dev)
+ {
+@@ -460,9 +469,10 @@ nv04_fifo_isr(struct drm_device *dev)
+ if (nouveau_ratelimit())
+ NV_INFO(dev, "PFIFO_DMA_PUSHER - Ch %d Get 0x%02x%08x "
+ "Put 0x%02x%08x IbGet 0x%08x IbPut 0x%08x "
+- "State 0x%08x Push 0x%08x\n",
++ "State 0x%08x (err: %s) Push 0x%08x\n",
+ chid, ho_get, dma_get, ho_put,
+ dma_put, ib_get, ib_put, state,
++ nv_dma_state_err(state),
+ push);
+
+ /* METHOD_COUNT, in DMA_STATE on earlier chipsets */
+@@ -476,8 +486,9 @@ nv04_fifo_isr(struct drm_device *dev)
+ }
+ } else {
+ NV_INFO(dev, "PFIFO_DMA_PUSHER - Ch %d Get 0x%08x "
+- "Put 0x%08x State 0x%08x Push 0x%08x\n",
+- chid, dma_get, dma_put, state, push);
++ "Put 0x%08x State 0x%08x (err: %s) Push 0x%08x\n",
++ chid, dma_get, dma_put, state,
++ nv_dma_state_err(state), push);
+
+ if (dma_get != dma_put)
+ nv_wr32(dev, 0x003244, dma_put);
+@@ -505,7 +516,7 @@ nv04_fifo_isr(struct drm_device *dev)
+
+ if (dev_priv->card_type == NV_50) {
+ if (status & 0x00000010) {
+- nv50_fb_vm_trap(dev, 1, "PFIFO_BAR_FAULT");
++ nv50_fb_vm_trap(dev, nouveau_ratelimit());
+ status &= ~0x00000010;
+ nv_wr32(dev, 0x002100, 0x00000010);
+ }
+diff --git a/drivers/gpu/drm/nouveau/nv04_graph.c b/drivers/gpu/drm/nouveau/nv04_graph.c
+index af75015..055677a 100644
+--- a/drivers/gpu/drm/nouveau/nv04_graph.c
++++ b/drivers/gpu/drm/nouveau/nv04_graph.c
+@@ -507,7 +507,7 @@ int nv04_graph_init(struct drm_device *dev)
+ nv_wr32(dev, NV04_PGRAPH_DEBUG_0, 0x001FFFFF);*/
+ nv_wr32(dev, NV04_PGRAPH_DEBUG_0, 0x1231c000);
+ /*1231C000 blob, 001 haiku*/
+- //*V_WRITE(NV04_PGRAPH_DEBUG_1, 0xf2d91100);*/
++ /*V_WRITE(NV04_PGRAPH_DEBUG_1, 0xf2d91100);*/
+ nv_wr32(dev, NV04_PGRAPH_DEBUG_1, 0x72111100);
+ /*0x72111100 blob , 01 haiku*/
+ /*nv_wr32(dev, NV04_PGRAPH_DEBUG_2, 0x11d5f870);*/
+@@ -1232,8 +1232,7 @@ static struct nouveau_bitfield nv04_graph_intr[] = {
+ {}
+ };
+
+-static struct nouveau_bitfield nv04_graph_nstatus[] =
+-{
++static struct nouveau_bitfield nv04_graph_nstatus[] = {
+ { NV04_PGRAPH_NSTATUS_STATE_IN_USE, "STATE_IN_USE" },
+ { NV04_PGRAPH_NSTATUS_INVALID_STATE, "INVALID_STATE" },
+ { NV04_PGRAPH_NSTATUS_BAD_ARGUMENT, "BAD_ARGUMENT" },
+@@ -1241,8 +1240,7 @@ static struct nouveau_bitfield nv04_graph_nstatus[] =
+ {}
+ };
+
+-struct nouveau_bitfield nv04_graph_nsource[] =
+-{
++struct nouveau_bitfield nv04_graph_nsource[] = {
+ { NV03_PGRAPH_NSOURCE_NOTIFICATION, "NOTIFICATION" },
+ { NV03_PGRAPH_NSOURCE_DATA_ERROR, "DATA_ERROR" },
+ { NV03_PGRAPH_NSOURCE_PROTECTION_ERROR, "PROTECTION_ERROR" },
+diff --git a/drivers/gpu/drm/nouveau/nv10_graph.c b/drivers/gpu/drm/nouveau/nv10_graph.c
+index 8c92edb..531d7ba 100644
+--- a/drivers/gpu/drm/nouveau/nv10_graph.c
++++ b/drivers/gpu/drm/nouveau/nv10_graph.c
+@@ -1117,8 +1117,7 @@ struct nouveau_bitfield nv10_graph_intr[] = {
+ {}
+ };
+
+-struct nouveau_bitfield nv10_graph_nstatus[] =
+-{
++struct nouveau_bitfield nv10_graph_nstatus[] = {
+ { NV10_PGRAPH_NSTATUS_STATE_IN_USE, "STATE_IN_USE" },
+ { NV10_PGRAPH_NSTATUS_INVALID_STATE, "INVALID_STATE" },
+ { NV10_PGRAPH_NSTATUS_BAD_ARGUMENT, "BAD_ARGUMENT" },
+diff --git a/drivers/gpu/drm/nouveau/nv40_fb.c b/drivers/gpu/drm/nouveau/nv40_fb.c
+index f3d9c05..f0ac2a7 100644
+--- a/drivers/gpu/drm/nouveau/nv40_fb.c
++++ b/drivers/gpu/drm/nouveau/nv40_fb.c
+@@ -24,6 +24,53 @@ nv40_fb_set_tile_region(struct drm_device *dev, int i)
+ }
+ }
+
++static void
++nv40_fb_init_gart(struct drm_device *dev)
++{
++ struct drm_nouveau_private *dev_priv = dev->dev_private;
++ struct nouveau_gpuobj *gart = dev_priv->gart_info.sg_ctxdma;
++
++ if (dev_priv->gart_info.type != NOUVEAU_GART_HW) {
++ nv_wr32(dev, 0x100800, 0x00000001);
++ return;
++ }
++
++ nv_wr32(dev, 0x100800, gart->pinst | 0x00000002);
++ nv_mask(dev, 0x10008c, 0x00000100, 0x00000100);
++ nv_wr32(dev, 0x100820, 0x00000000);
++}
++
++static void
++nv44_fb_init_gart(struct drm_device *dev)
++{
++ struct drm_nouveau_private *dev_priv = dev->dev_private;
++ struct nouveau_gpuobj *gart = dev_priv->gart_info.sg_ctxdma;
++ u32 vinst;
++
++ if (dev_priv->gart_info.type != NOUVEAU_GART_HW) {
++ nv_wr32(dev, 0x100850, 0x80000000);
++ nv_wr32(dev, 0x100800, 0x00000001);
++ return;
++ }
++
++ /* calculate vram address of this PRAMIN block, object
++ * must be allocated on 512KiB alignment, and not exceed
++ * a total size of 512KiB for this to work correctly
++ */
++ vinst = nv_rd32(dev, 0x10020c);
++ vinst -= ((gart->pinst >> 19) + 1) << 19;
++
++ nv_wr32(dev, 0x100850, 0x80000000);
++ nv_wr32(dev, 0x100818, dev_priv->gart_info.dummy.addr);
++
++ nv_wr32(dev, 0x100804, dev_priv->gart_info.aper_size);
++ nv_wr32(dev, 0x100850, 0x00008000);
++ nv_mask(dev, 0x10008c, 0x00000200, 0x00000200);
++ nv_wr32(dev, 0x100820, 0x00000000);
++ nv_wr32(dev, 0x10082c, 0x00000001);
++ nv_wr32(dev, 0x100800, vinst | 0x00000010);
++}
++
+ int
+ nv40_fb_init(struct drm_device *dev)
+ {
+@@ -32,12 +79,12 @@ nv40_fb_init(struct drm_device *dev)
+ uint32_t tmp;
+ int i;
+
+- /* This is strictly a NV4x register (don't know about NV5x). */
+- /* The blob sets these to all kinds of values, and they mess up our setup. */
+- /* I got value 0x52802 instead. For some cards the blob even sets it back to 0x1. */
+- /* Note: the blob doesn't read this value, so i'm pretty sure this is safe for all cards. */
+- /* Any idea what this is? */
+- nv_wr32(dev, NV40_PFB_UNK_800, 0x1);
++ if (dev_priv->chipset != 0x40 && dev_priv->chipset != 0x45) {
++ if (nv44_graph_class(dev))
++ nv44_fb_init_gart(dev);
++ else
++ nv40_fb_init_gart(dev);
++ }
+
+ switch (dev_priv->chipset) {
+ case 0x40:
+diff --git a/drivers/gpu/drm/nouveau/nv50_crtc.c b/drivers/gpu/drm/nouveau/nv50_crtc.c
+index 9023c4d..e900a51 100644
+--- a/drivers/gpu/drm/nouveau/nv50_crtc.c
++++ b/drivers/gpu/drm/nouveau/nv50_crtc.c
+@@ -65,7 +65,7 @@ nv50_crtc_blank(struct nouveau_crtc *nv_crtc, bool blanked)
+ {
+ struct drm_device *dev = nv_crtc->base.dev;
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+- struct nouveau_channel *evo = dev_priv->evo;
++ struct nouveau_channel *evo = nv50_display(dev)->master;
+ int index = nv_crtc->index, ret;
+
+ NV_DEBUG_KMS(dev, "index %d\n", nv_crtc->index);
+@@ -135,8 +135,7 @@ static int
+ nv50_crtc_set_dither(struct nouveau_crtc *nv_crtc, bool on, bool update)
+ {
+ struct drm_device *dev = nv_crtc->base.dev;
+- struct drm_nouveau_private *dev_priv = dev->dev_private;
+- struct nouveau_channel *evo = dev_priv->evo;
++ struct nouveau_channel *evo = nv50_display(dev)->master;
+ int ret;
+
+ NV_DEBUG_KMS(dev, "\n");
+@@ -186,8 +185,7 @@ nv50_crtc_set_scale(struct nouveau_crtc *nv_crtc, int scaling_mode, bool update)
+ struct nouveau_connector *nv_connector =
+ nouveau_crtc_connector_get(nv_crtc);
+ struct drm_device *dev = nv_crtc->base.dev;
+- struct drm_nouveau_private *dev_priv = dev->dev_private;
+- struct nouveau_channel *evo = dev_priv->evo;
++ struct nouveau_channel *evo = nv50_display(dev)->master;
+ struct drm_display_mode *native_mode = NULL;
+ struct drm_display_mode *mode = &nv_crtc->base.mode;
+ uint32_t outX, outY, horiz, vert;
+@@ -445,6 +443,39 @@ nv50_crtc_dpms(struct drm_crtc *crtc, int mode)
+ {
+ }
+
++static int
++nv50_crtc_wait_complete(struct drm_crtc *crtc)
++{
++ struct drm_device *dev = crtc->dev;
++ struct drm_nouveau_private *dev_priv = dev->dev_private;
++ struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer;
++ struct nv50_display *disp = nv50_display(dev);
++ struct nouveau_channel *evo = disp->master;
++ u64 start;
++ int ret;
++
++ ret = RING_SPACE(evo, 6);
++ if (ret)
++ return ret;
++ BEGIN_RING(evo, 0, 0x0084, 1);
++ OUT_RING (evo, 0x80000000);
++ BEGIN_RING(evo, 0, 0x0080, 1);
++ OUT_RING (evo, 0);
++ BEGIN_RING(evo, 0, 0x0084, 1);
++ OUT_RING (evo, 0x00000000);
++
++ nv_wo32(disp->ntfy, 0x000, 0x00000000);
++ FIRE_RING (evo);
++
++ start = ptimer->read(dev);
++ do {
++ if (nv_ro32(disp->ntfy, 0x000))
++ return 0;
++ } while (ptimer->read(dev) - start < 2000000000ULL);
++
++ return -EBUSY;
++}
++
+ static void
+ nv50_crtc_prepare(struct drm_crtc *crtc)
+ {
+@@ -453,6 +484,7 @@ nv50_crtc_prepare(struct drm_crtc *crtc)
+
+ NV_DEBUG_KMS(dev, "index %d\n", nv_crtc->index);
+
++ nv50_display_flip_stop(crtc);
+ drm_vblank_pre_modeset(dev, nv_crtc->index);
+ nv50_crtc_blank(nv_crtc, true);
+ }
+@@ -461,24 +493,14 @@ static void
+ nv50_crtc_commit(struct drm_crtc *crtc)
+ {
+ struct drm_device *dev = crtc->dev;
+- struct drm_nouveau_private *dev_priv = dev->dev_private;
+- struct nouveau_channel *evo = dev_priv->evo;
+ struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
+- int ret;
+
+ NV_DEBUG_KMS(dev, "index %d\n", nv_crtc->index);
+
+ nv50_crtc_blank(nv_crtc, false);
+ drm_vblank_post_modeset(dev, nv_crtc->index);
+-
+- ret = RING_SPACE(evo, 2);
+- if (ret) {
+- NV_ERROR(dev, "no space while committing crtc\n");
+- return;
+- }
+- BEGIN_RING(evo, 0, NV50_EVO_UPDATE, 1);
+- OUT_RING (evo, 0);
+- FIRE_RING (evo);
++ nv50_crtc_wait_complete(crtc);
++ nv50_display_flip_next(crtc, crtc->fb, NULL);
+ }
+
+ static bool
+@@ -491,15 +513,15 @@ nv50_crtc_mode_fixup(struct drm_crtc *crtc, struct drm_display_mode *mode,
+ static int
+ nv50_crtc_do_mode_set_base(struct drm_crtc *crtc,
+ struct drm_framebuffer *passed_fb,
+- int x, int y, bool update, bool atomic)
++ int x, int y, bool atomic)
+ {
+ struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
+ struct drm_device *dev = nv_crtc->base.dev;
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+- struct nouveau_channel *evo = dev_priv->evo;
++ struct nouveau_channel *evo = nv50_display(dev)->master;
+ struct drm_framebuffer *drm_fb = nv_crtc->base.fb;
+ struct nouveau_framebuffer *fb = nouveau_framebuffer(drm_fb);
+- int ret, format;
++ int ret;
+
+ NV_DEBUG_KMS(dev, "index %d\n", nv_crtc->index);
+
+@@ -510,8 +532,7 @@ nv50_crtc_do_mode_set_base(struct drm_crtc *crtc,
+ if (atomic) {
+ drm_fb = passed_fb;
+ fb = nouveau_framebuffer(passed_fb);
+- }
+- else {
++ } else {
+ /* If not atomic, we can go ahead and pin, and unpin the
+ * old fb we were passed.
+ */
+@@ -525,28 +546,6 @@ nv50_crtc_do_mode_set_base(struct drm_crtc *crtc,
+ }
+ }
+
+- switch (drm_fb->depth) {
+- case 8:
+- format = NV50_EVO_CRTC_FB_DEPTH_8;
+- break;
+- case 15:
+- format = NV50_EVO_CRTC_FB_DEPTH_15;
+- break;
+- case 16:
+- format = NV50_EVO_CRTC_FB_DEPTH_16;
+- break;
+- case 24:
+- case 32:
+- format = NV50_EVO_CRTC_FB_DEPTH_24;
+- break;
+- case 30:
+- format = NV50_EVO_CRTC_FB_DEPTH_30;
+- break;
+- default:
+- NV_ERROR(dev, "unknown depth %d\n", drm_fb->depth);
+- return -EINVAL;
+- }
+-
+ nv_crtc->fb.offset = fb->nvbo->bo.mem.start << PAGE_SHIFT;
+ nv_crtc->fb.tile_flags = nouveau_bo_tile_layout(fb->nvbo);
+ nv_crtc->fb.cpp = drm_fb->bits_per_pixel / 8;
+@@ -556,14 +555,7 @@ nv50_crtc_do_mode_set_base(struct drm_crtc *crtc,
+ return ret;
+
+ BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, FB_DMA), 1);
+- if (nv_crtc->fb.tile_flags == 0x7a00 ||
+- nv_crtc->fb.tile_flags == 0xfe00)
+- OUT_RING(evo, NvEvoFB32);
+- else
+- if (nv_crtc->fb.tile_flags == 0x7000)
+- OUT_RING(evo, NvEvoFB16);
+- else
+- OUT_RING(evo, NvEvoVRAM_LP);
++ OUT_RING (evo, fb->r_dma);
+ }
+
+ ret = RING_SPACE(evo, 12);
+@@ -571,45 +563,26 @@ nv50_crtc_do_mode_set_base(struct drm_crtc *crtc,
+ return ret;
+
+ BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, FB_OFFSET), 5);
+- OUT_RING(evo, nv_crtc->fb.offset >> 8);
+- OUT_RING(evo, 0);
+- OUT_RING(evo, (drm_fb->height << 16) | drm_fb->width);
+- if (!nv_crtc->fb.tile_flags) {
+- OUT_RING(evo, drm_fb->pitch | (1 << 20));
+- } else {
+- u32 tile_mode = fb->nvbo->tile_mode;
+- if (dev_priv->card_type >= NV_C0)
+- tile_mode >>= 4;
+- OUT_RING(evo, ((drm_fb->pitch / 4) << 4) | tile_mode);
+- }
+- if (dev_priv->chipset == 0x50)
+- OUT_RING(evo, (nv_crtc->fb.tile_flags << 8) | format);
+- else
+- OUT_RING(evo, format);
++ OUT_RING (evo, nv_crtc->fb.offset >> 8);
++ OUT_RING (evo, 0);
++ OUT_RING (evo, (drm_fb->height << 16) | drm_fb->width);
++ OUT_RING (evo, fb->r_pitch);
++ OUT_RING (evo, fb->r_format);
+
+ BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, CLUT_MODE), 1);
+- OUT_RING(evo, fb->base.depth == 8 ?
+- NV50_EVO_CRTC_CLUT_MODE_OFF : NV50_EVO_CRTC_CLUT_MODE_ON);
++ OUT_RING (evo, fb->base.depth == 8 ?
++ NV50_EVO_CRTC_CLUT_MODE_OFF : NV50_EVO_CRTC_CLUT_MODE_ON);
+
+ BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, COLOR_CTRL), 1);
+- OUT_RING(evo, NV50_EVO_CRTC_COLOR_CTRL_COLOR);
++ OUT_RING (evo, NV50_EVO_CRTC_COLOR_CTRL_COLOR);
+ BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, FB_POS), 1);
+- OUT_RING(evo, (y << 16) | x);
++ OUT_RING (evo, (y << 16) | x);
+
+ if (nv_crtc->lut.depth != fb->base.depth) {
+ nv_crtc->lut.depth = fb->base.depth;
+ nv50_crtc_lut_load(crtc);
+ }
+
+- if (update) {
+- ret = RING_SPACE(evo, 2);
+- if (ret)
+- return ret;
+- BEGIN_RING(evo, 0, NV50_EVO_UPDATE, 1);
+- OUT_RING(evo, 0);
+- FIRE_RING(evo);
+- }
+-
+ return 0;
+ }
+
+@@ -619,8 +592,7 @@ nv50_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode,
+ struct drm_framebuffer *old_fb)
+ {
+ struct drm_device *dev = crtc->dev;
+- struct drm_nouveau_private *dev_priv = dev->dev_private;
+- struct nouveau_channel *evo = dev_priv->evo;
++ struct nouveau_channel *evo = nv50_display(dev)->master;
+ struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
+ struct nouveau_connector *nv_connector = NULL;
+ uint32_t hsync_dur, vsync_dur, hsync_start_to_end, vsync_start_to_end;
+@@ -700,14 +672,25 @@ nv50_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode,
+ nv_crtc->set_dither(nv_crtc, nv_connector->use_dithering, false);
+ nv_crtc->set_scale(nv_crtc, nv_connector->scaling_mode, false);
+
+- return nv50_crtc_do_mode_set_base(crtc, old_fb, x, y, false, false);
++ return nv50_crtc_do_mode_set_base(crtc, old_fb, x, y, false);
+ }
+
+ static int
+ nv50_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
+ struct drm_framebuffer *old_fb)
+ {
+- return nv50_crtc_do_mode_set_base(crtc, old_fb, x, y, true, false);
++ int ret;
++
++ nv50_display_flip_stop(crtc);
++ ret = nv50_crtc_do_mode_set_base(crtc, old_fb, x, y, false);
++ if (ret)
++ return ret;
++
++ ret = nv50_crtc_wait_complete(crtc);
++ if (ret)
++ return ret;
++
++ return nv50_display_flip_next(crtc, crtc->fb, NULL);
+ }
+
+ static int
+@@ -715,7 +698,14 @@ nv50_crtc_mode_set_base_atomic(struct drm_crtc *crtc,
+ struct drm_framebuffer *fb,
+ int x, int y, enum mode_set_atomic state)
+ {
+- return nv50_crtc_do_mode_set_base(crtc, fb, x, y, true, true);
++ int ret;
++
++ nv50_display_flip_stop(crtc);
++ ret = nv50_crtc_do_mode_set_base(crtc, fb, x, y, true);
++ if (ret)
++ return ret;
++
++ return nv50_crtc_wait_complete(crtc);
+ }
+
+ static const struct drm_crtc_helper_funcs nv50_crtc_helper_funcs = {
+@@ -758,7 +748,7 @@ nv50_crtc_create(struct drm_device *dev, int index)
+ nv_crtc->lut.depth = 0;
+
+ ret = nouveau_bo_new(dev, NULL, 4096, 0x100, TTM_PL_FLAG_VRAM,
+- 0, 0x0000, false, true, &nv_crtc->lut.nvbo);
++ 0, 0x0000, &nv_crtc->lut.nvbo);
+ if (!ret) {
+ ret = nouveau_bo_pin(nv_crtc->lut.nvbo, TTM_PL_FLAG_VRAM);
+ if (!ret)
+@@ -784,7 +774,7 @@ nv50_crtc_create(struct drm_device *dev, int index)
+ drm_mode_crtc_set_gamma_size(&nv_crtc->base, 256);
+
+ ret = nouveau_bo_new(dev, NULL, 64*64*4, 0x100, TTM_PL_FLAG_VRAM,
+- 0, 0x0000, false, true, &nv_crtc->cursor.nvbo);
++ 0, 0x0000, &nv_crtc->cursor.nvbo);
+ if (!ret) {
+ ret = nouveau_bo_pin(nv_crtc->cursor.nvbo, TTM_PL_FLAG_VRAM);
+ if (!ret)
+diff --git a/drivers/gpu/drm/nouveau/nv50_cursor.c b/drivers/gpu/drm/nouveau/nv50_cursor.c
+index 1b9ce30..9752c35 100644
+--- a/drivers/gpu/drm/nouveau/nv50_cursor.c
++++ b/drivers/gpu/drm/nouveau/nv50_cursor.c
+@@ -36,9 +36,9 @@
+ static void
+ nv50_cursor_show(struct nouveau_crtc *nv_crtc, bool update)
+ {
+- struct drm_nouveau_private *dev_priv = nv_crtc->base.dev->dev_private;
+- struct nouveau_channel *evo = dev_priv->evo;
+ struct drm_device *dev = nv_crtc->base.dev;
++ struct drm_nouveau_private *dev_priv = dev->dev_private;
++ struct nouveau_channel *evo = nv50_display(dev)->master;
+ int ret;
+
+ NV_DEBUG_KMS(dev, "\n");
+@@ -71,9 +71,9 @@ nv50_cursor_show(struct nouveau_crtc *nv_crtc, bool update)
+ static void
+ nv50_cursor_hide(struct nouveau_crtc *nv_crtc, bool update)
+ {
+- struct drm_nouveau_private *dev_priv = nv_crtc->base.dev->dev_private;
+- struct nouveau_channel *evo = dev_priv->evo;
+ struct drm_device *dev = nv_crtc->base.dev;
++ struct drm_nouveau_private *dev_priv = dev->dev_private;
++ struct nouveau_channel *evo = nv50_display(dev)->master;
+ int ret;
+
+ NV_DEBUG_KMS(dev, "\n");
+diff --git a/drivers/gpu/drm/nouveau/nv50_dac.c b/drivers/gpu/drm/nouveau/nv50_dac.c
+index 875414b..808f3ec 100644
+--- a/drivers/gpu/drm/nouveau/nv50_dac.c
++++ b/drivers/gpu/drm/nouveau/nv50_dac.c
+@@ -41,8 +41,7 @@ nv50_dac_disconnect(struct drm_encoder *encoder)
+ {
+ struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
+ struct drm_device *dev = encoder->dev;
+- struct drm_nouveau_private *dev_priv = dev->dev_private;
+- struct nouveau_channel *evo = dev_priv->evo;
++ struct nouveau_channel *evo = nv50_display(dev)->master;
+ int ret;
+
+ if (!nv_encoder->crtc)
+@@ -216,8 +215,7 @@ nv50_dac_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
+ {
+ struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
+ struct drm_device *dev = encoder->dev;
+- struct drm_nouveau_private *dev_priv = dev->dev_private;
+- struct nouveau_channel *evo = dev_priv->evo;
++ struct nouveau_channel *evo = nv50_display(dev)->master;
+ struct nouveau_crtc *crtc = nouveau_crtc(encoder->crtc);
+ uint32_t mode_ctl = 0, mode_ctl2 = 0;
+ int ret;
+diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c
+index 7cc94ed..75a376c 100644
+--- a/drivers/gpu/drm/nouveau/nv50_display.c
++++ b/drivers/gpu/drm/nouveau/nv50_display.c
+@@ -24,6 +24,7 @@
+ *
+ */
+
++#define NOUVEAU_DMA_DEBUG (nouveau_reg_debug & NOUVEAU_REG_DEBUG_EVO)
+ #include "nv50_display.h"
+ #include "nouveau_crtc.h"
+ #include "nouveau_encoder.h"
+@@ -34,6 +35,7 @@
+ #include "drm_crtc_helper.h"
+
+ static void nv50_display_isr(struct drm_device *);
++static void nv50_display_bh(unsigned long);
+
+ static inline int
+ nv50_sor_nr(struct drm_device *dev)
+@@ -172,16 +174,16 @@ nv50_display_init(struct drm_device *dev)
+ ret = nv50_evo_init(dev);
+ if (ret)
+ return ret;
+- evo = dev_priv->evo;
++ evo = nv50_display(dev)->master;
+
+ nv_wr32(dev, NV50_PDISPLAY_OBJECTS, (evo->ramin->vinst >> 8) | 9);
+
+- ret = RING_SPACE(evo, 11);
++ ret = RING_SPACE(evo, 15);
+ if (ret)
+ return ret;
+ BEGIN_RING(evo, 0, NV50_EVO_UNK84, 2);
+ OUT_RING(evo, NV50_EVO_UNK84_NOTIFY_DISABLED);
+- OUT_RING(evo, NV50_EVO_DMA_NOTIFY_HANDLE_NONE);
++ OUT_RING(evo, NvEvoSync);
+ BEGIN_RING(evo, 0, NV50_EVO_CRTC(0, FB_DMA), 1);
+ OUT_RING(evo, NV50_EVO_CRTC_FB_DMA_HANDLE_NONE);
+ BEGIN_RING(evo, 0, NV50_EVO_CRTC(0, UNK0800), 1);
+@@ -190,6 +192,11 @@ nv50_display_init(struct drm_device *dev)
+ OUT_RING(evo, 0);
+ BEGIN_RING(evo, 0, NV50_EVO_CRTC(0, UNK082C), 1);
+ OUT_RING(evo, 0);
++ /* required to make display sync channels not hate life */
++ BEGIN_RING(evo, 0, NV50_EVO_CRTC(0, UNK900), 1);
++ OUT_RING (evo, 0x00000311);
++ BEGIN_RING(evo, 0, NV50_EVO_CRTC(1, UNK900), 1);
++ OUT_RING (evo, 0x00000311);
+ FIRE_RING(evo);
+ if (!nv_wait(dev, 0x640004, 0xffffffff, evo->dma.put << 2))
+ NV_ERROR(dev, "evo pushbuf stalled\n");
+@@ -201,6 +208,8 @@ nv50_display_init(struct drm_device *dev)
+ static int nv50_display_disable(struct drm_device *dev)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
++ struct nv50_display *disp = nv50_display(dev);
++ struct nouveau_channel *evo = disp->master;
+ struct drm_crtc *drm_crtc;
+ int ret, i;
+
+@@ -212,12 +221,12 @@ static int nv50_display_disable(struct drm_device *dev)
+ nv50_crtc_blank(crtc, true);
+ }
+
+- ret = RING_SPACE(dev_priv->evo, 2);
++ ret = RING_SPACE(evo, 2);
+ if (ret == 0) {
+- BEGIN_RING(dev_priv->evo, 0, NV50_EVO_UPDATE, 1);
+- OUT_RING(dev_priv->evo, 0);
++ BEGIN_RING(evo, 0, NV50_EVO_UPDATE, 1);
++ OUT_RING(evo, 0);
+ }
+- FIRE_RING(dev_priv->evo);
++ FIRE_RING(evo);
+
+ /* Almost like ack'ing a vblank interrupt, maybe in the spirit of
+ * cleaning up?
+@@ -267,10 +276,16 @@ int nv50_display_create(struct drm_device *dev)
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+ struct dcb_table *dcb = &dev_priv->vbios.dcb;
+ struct drm_connector *connector, *ct;
++ struct nv50_display *priv;
+ int ret, i;
+
+ NV_DEBUG_KMS(dev, "\n");
+
++ priv = kzalloc(sizeof(*priv), GFP_KERNEL);
++ if (!priv)
++ return -ENOMEM;
++ dev_priv->engine.display.priv = priv;
++
+ /* init basic kernel modesetting */
+ drm_mode_config_init(dev);
+
+@@ -330,7 +345,7 @@ int nv50_display_create(struct drm_device *dev)
+ }
+ }
+
+- INIT_WORK(&dev_priv->irq_work, nv50_display_irq_handler_bh);
++ tasklet_init(&priv->tasklet, nv50_display_bh, (unsigned long)dev);
+ nouveau_irq_register(dev, 26, nv50_display_isr);
+
+ ret = nv50_display_init(dev);
+@@ -345,12 +360,131 @@ int nv50_display_create(struct drm_device *dev)
+ void
+ nv50_display_destroy(struct drm_device *dev)
+ {
++ struct nv50_display *disp = nv50_display(dev);
++
+ NV_DEBUG_KMS(dev, "\n");
+
+ drm_mode_config_cleanup(dev);
+
+ nv50_display_disable(dev);
+ nouveau_irq_unregister(dev, 26);
++ kfree(disp);
++}
++
++void
++nv50_display_flip_stop(struct drm_crtc *crtc)
++{
++ struct nv50_display *disp = nv50_display(crtc->dev);
++ struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
++ struct nv50_display_crtc *dispc = &disp->crtc[nv_crtc->index];
++ struct nouveau_channel *evo = dispc->sync;
++ int ret;
++
++ ret = RING_SPACE(evo, 8);
++ if (ret) {
++ WARN_ON(1);
++ return;
++ }
++
++ BEGIN_RING(evo, 0, 0x0084, 1);
++ OUT_RING (evo, 0x00000000);
++ BEGIN_RING(evo, 0, 0x0094, 1);
++ OUT_RING (evo, 0x00000000);
++ BEGIN_RING(evo, 0, 0x00c0, 1);
++ OUT_RING (evo, 0x00000000);
++ BEGIN_RING(evo, 0, 0x0080, 1);
++ OUT_RING (evo, 0x00000000);
++ FIRE_RING (evo);
++}
++
++int
++nv50_display_flip_next(struct drm_crtc *crtc, struct drm_framebuffer *fb,
++ struct nouveau_channel *chan)
++{
++ struct drm_nouveau_private *dev_priv = crtc->dev->dev_private;
++ struct nouveau_framebuffer *nv_fb = nouveau_framebuffer(fb);
++ struct nv50_display *disp = nv50_display(crtc->dev);
++ struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
++ struct nv50_display_crtc *dispc = &disp->crtc[nv_crtc->index];
++ struct nouveau_channel *evo = dispc->sync;
++ int ret;
++
++ ret = RING_SPACE(evo, 24);
++ if (unlikely(ret))
++ return ret;
++
++ /* synchronise with the rendering channel, if necessary */
++ if (likely(chan)) {
++ u64 offset = dispc->sem.bo->vma.offset + dispc->sem.offset;
++
++ ret = RING_SPACE(chan, 10);
++ if (ret) {
++ WIND_RING(evo);
++ return ret;
++ }
++
++ if (dev_priv->chipset < 0xc0) {
++ BEGIN_RING(chan, NvSubSw, 0x0060, 2);
++ OUT_RING (chan, NvEvoSema0 + nv_crtc->index);
++ OUT_RING (chan, dispc->sem.offset);
++ BEGIN_RING(chan, NvSubSw, 0x006c, 1);
++ OUT_RING (chan, 0xf00d0000 | dispc->sem.value);
++ BEGIN_RING(chan, NvSubSw, 0x0064, 2);
++ OUT_RING (chan, dispc->sem.offset ^ 0x10);
++ OUT_RING (chan, 0x74b1e000);
++ BEGIN_RING(chan, NvSubSw, 0x0060, 1);
++ if (dev_priv->chipset < 0x84)
++ OUT_RING (chan, NvSema);
++ else
++ OUT_RING (chan, chan->vram_handle);
++ } else {
++ BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0010, 4);
++ OUT_RING (chan, upper_32_bits(offset));
++ OUT_RING (chan, lower_32_bits(offset));
++ OUT_RING (chan, 0xf00d0000 | dispc->sem.value);
++ OUT_RING (chan, 0x1002);
++ BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0010, 4);
++ OUT_RING (chan, upper_32_bits(offset));
++ OUT_RING (chan, lower_32_bits(offset ^ 0x10));
++ OUT_RING (chan, 0x74b1e000);
++ OUT_RING (chan, 0x1001);
++ }
++ FIRE_RING (chan);
++ } else {
++ nouveau_bo_wr32(dispc->sem.bo, dispc->sem.offset / 4,
++ 0xf00d0000 | dispc->sem.value);
++ }
++
++ /* queue the flip on the crtc's "display sync" channel */
++ BEGIN_RING(evo, 0, 0x0100, 1);
++ OUT_RING (evo, 0xfffe0000);
++ BEGIN_RING(evo, 0, 0x0084, 5);
++ OUT_RING (evo, chan ? 0x00000100 : 0x00000010);
++ OUT_RING (evo, dispc->sem.offset);
++ OUT_RING (evo, 0xf00d0000 | dispc->sem.value);
++ OUT_RING (evo, 0x74b1e000);
++ OUT_RING (evo, NvEvoSync);
++ BEGIN_RING(evo, 0, 0x00a0, 2);
++ OUT_RING (evo, 0x00000000);
++ OUT_RING (evo, 0x00000000);
++ BEGIN_RING(evo, 0, 0x00c0, 1);
++ OUT_RING (evo, nv_fb->r_dma);
++ BEGIN_RING(evo, 0, 0x0110, 2);
++ OUT_RING (evo, 0x00000000);
++ OUT_RING (evo, 0x00000000);
++ BEGIN_RING(evo, 0, 0x0800, 5);
++ OUT_RING (evo, (nv_fb->nvbo->bo.mem.start << PAGE_SHIFT) >> 8);
++ OUT_RING (evo, 0);
++ OUT_RING (evo, (fb->height << 16) | fb->width);
++ OUT_RING (evo, nv_fb->r_pitch);
++ OUT_RING (evo, nv_fb->r_format);
++ BEGIN_RING(evo, 0, 0x0080, 1);
++ OUT_RING (evo, 0x00000000);
++ FIRE_RING (evo);
++
++ dispc->sem.offset ^= 0x10;
++ dispc->sem.value++;
++ return 0;
+ }
+
+ static u16
+@@ -466,11 +600,12 @@ static void
+ nv50_display_unk10_handler(struct drm_device *dev)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
++ struct nv50_display *disp = nv50_display(dev);
+ u32 unk30 = nv_rd32(dev, 0x610030), mc;
+ int i, crtc, or, type = OUTPUT_ANY;
+
+ NV_DEBUG_KMS(dev, "0x610030: 0x%08x\n", unk30);
+- dev_priv->evo_irq.dcb = NULL;
++ disp->irq.dcb = NULL;
+
+ nv_wr32(dev, 0x619494, nv_rd32(dev, 0x619494) & ~8);
+
+@@ -541,7 +676,7 @@ nv50_display_unk10_handler(struct drm_device *dev)
+
+ if (dcb->type == type && (dcb->or & (1 << or))) {
+ nouveau_bios_run_display_table(dev, dcb, 0, -1);
+- dev_priv->evo_irq.dcb = dcb;
++ disp->irq.dcb = dcb;
+ goto ack;
+ }
+ }
+@@ -587,15 +722,16 @@ static void
+ nv50_display_unk20_handler(struct drm_device *dev)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+- u32 unk30 = nv_rd32(dev, 0x610030), tmp, pclk, script, mc;
++ struct nv50_display *disp = nv50_display(dev);
++ u32 unk30 = nv_rd32(dev, 0x610030), tmp, pclk, script, mc = 0;
+ struct dcb_entry *dcb;
+ int i, crtc, or, type = OUTPUT_ANY;
+
+ NV_DEBUG_KMS(dev, "0x610030: 0x%08x\n", unk30);
+- dcb = dev_priv->evo_irq.dcb;
++ dcb = disp->irq.dcb;
+ if (dcb) {
+ nouveau_bios_run_display_table(dev, dcb, 0, -2);
+- dev_priv->evo_irq.dcb = NULL;
++ disp->irq.dcb = NULL;
+ }
+
+ /* CRTC clock change requested? */
+@@ -692,9 +828,9 @@ nv50_display_unk20_handler(struct drm_device *dev)
+ nv_wr32(dev, NV50_PDISPLAY_DAC_CLK_CTRL2(or), 0);
+ }
+
+- dev_priv->evo_irq.dcb = dcb;
+- dev_priv->evo_irq.pclk = pclk;
+- dev_priv->evo_irq.script = script;
++ disp->irq.dcb = dcb;
++ disp->irq.pclk = pclk;
++ disp->irq.script = script;
+
+ ack:
+ nv_wr32(dev, NV50_PDISPLAY_INTR_1, NV50_PDISPLAY_INTR_1_CLK_UNK20);
+@@ -735,13 +871,13 @@ nv50_display_unk40_dp_set_tmds(struct drm_device *dev, struct dcb_entry *dcb)
+ static void
+ nv50_display_unk40_handler(struct drm_device *dev)
+ {
+- struct drm_nouveau_private *dev_priv = dev->dev_private;
+- struct dcb_entry *dcb = dev_priv->evo_irq.dcb;
+- u16 script = dev_priv->evo_irq.script;
+- u32 unk30 = nv_rd32(dev, 0x610030), pclk = dev_priv->evo_irq.pclk;
++ struct nv50_display *disp = nv50_display(dev);
++ struct dcb_entry *dcb = disp->irq.dcb;
++ u16 script = disp->irq.script;
++ u32 unk30 = nv_rd32(dev, 0x610030), pclk = disp->irq.pclk;
+
+ NV_DEBUG_KMS(dev, "0x610030: 0x%08x\n", unk30);
+- dev_priv->evo_irq.dcb = NULL;
++ disp->irq.dcb = NULL;
+ if (!dcb)
+ goto ack;
+
+@@ -754,12 +890,10 @@ ack:
+ nv_wr32(dev, 0x619494, nv_rd32(dev, 0x619494) | 8);
+ }
+
+-void
+-nv50_display_irq_handler_bh(struct work_struct *work)
++static void
++nv50_display_bh(unsigned long data)
+ {
+- struct drm_nouveau_private *dev_priv =
+- container_of(work, struct drm_nouveau_private, irq_work);
+- struct drm_device *dev = dev_priv->dev;
++ struct drm_device *dev = (struct drm_device *)data;
+
+ for (;;) {
+ uint32_t intr0 = nv_rd32(dev, NV50_PDISPLAY_INTR_0);
+@@ -807,7 +941,7 @@ nv50_display_error_handler(struct drm_device *dev)
+ static void
+ nv50_display_isr(struct drm_device *dev)
+ {
+- struct drm_nouveau_private *dev_priv = dev->dev_private;
++ struct nv50_display *disp = nv50_display(dev);
+ uint32_t delayed = 0;
+
+ while (nv_rd32(dev, NV50_PMC_INTR_0) & NV50_PMC_INTR_0_DISPLAY) {
+@@ -835,8 +969,7 @@ nv50_display_isr(struct drm_device *dev)
+ NV50_PDISPLAY_INTR_1_CLK_UNK40));
+ if (clock) {
+ nv_wr32(dev, NV03_PMC_INTR_EN_0, 0);
+- if (!work_pending(&dev_priv->irq_work))
+- queue_work(dev_priv->wq, &dev_priv->irq_work);
++ tasklet_schedule(&disp->tasklet);
+ delayed |= clock;
+ intr1 &= ~clock;
+ }
+diff --git a/drivers/gpu/drm/nouveau/nv50_display.h b/drivers/gpu/drm/nouveau/nv50_display.h
+index f0e30b78..c2da503 100644
+--- a/drivers/gpu/drm/nouveau/nv50_display.h
++++ b/drivers/gpu/drm/nouveau/nv50_display.h
+@@ -35,7 +35,36 @@
+ #include "nouveau_crtc.h"
+ #include "nv50_evo.h"
+
+-void nv50_display_irq_handler_bh(struct work_struct *work);
++struct nv50_display_crtc {
++ struct nouveau_channel *sync;
++ struct {
++ struct nouveau_bo *bo;
++ u32 offset;
++ u16 value;
++ } sem;
++};
++
++struct nv50_display {
++ struct nouveau_channel *master;
++ struct nouveau_gpuobj *ntfy;
++
++ struct nv50_display_crtc crtc[2];
++
++ struct tasklet_struct tasklet;
++ struct {
++ struct dcb_entry *dcb;
++ u16 script;
++ u32 pclk;
++ } irq;
++};
++
++static inline struct nv50_display *
++nv50_display(struct drm_device *dev)
++{
++ struct drm_nouveau_private *dev_priv = dev->dev_private;
++ return dev_priv->engine.display.priv;
++}
++
+ int nv50_display_early_init(struct drm_device *dev);
+ void nv50_display_late_takedown(struct drm_device *dev);
+ int nv50_display_create(struct drm_device *dev);
+@@ -44,4 +73,15 @@ void nv50_display_destroy(struct drm_device *dev);
+ int nv50_crtc_blank(struct nouveau_crtc *, bool blank);
+ int nv50_crtc_set_clock(struct drm_device *, int head, int pclk);
+
++int nv50_display_flip_next(struct drm_crtc *, struct drm_framebuffer *,
++ struct nouveau_channel *chan);
++void nv50_display_flip_stop(struct drm_crtc *);
++
++int nv50_evo_init(struct drm_device *dev);
++void nv50_evo_fini(struct drm_device *dev);
++void nv50_evo_dmaobj_init(struct nouveau_gpuobj *, u32 memtype, u64 base,
++ u64 size);
++int nv50_evo_dmaobj_new(struct nouveau_channel *, u32 handle, u32 memtype,
++ u64 base, u64 size, struct nouveau_gpuobj **);
++
+ #endif /* __NV50_DISPLAY_H__ */
+diff --git a/drivers/gpu/drm/nouveau/nv50_evo.c b/drivers/gpu/drm/nouveau/nv50_evo.c
+index 0ea090f..c8e83c1 100644
+--- a/drivers/gpu/drm/nouveau/nv50_evo.c
++++ b/drivers/gpu/drm/nouveau/nv50_evo.c
+@@ -27,20 +27,17 @@
+ #include "nouveau_drv.h"
+ #include "nouveau_dma.h"
+ #include "nouveau_ramht.h"
++#include "nv50_display.h"
+
+ static void
+ nv50_evo_channel_del(struct nouveau_channel **pevo)
+ {
+- struct drm_nouveau_private *dev_priv;
+ struct nouveau_channel *evo = *pevo;
+
+ if (!evo)
+ return;
+ *pevo = NULL;
+
+- dev_priv = evo->dev->dev_private;
+- dev_priv->evo_alloc &= ~(1 << evo->id);
+-
+ nouveau_gpuobj_channel_takedown(evo);
+ nouveau_bo_unmap(evo->pushbuf_bo);
+ nouveau_bo_ref(NULL, &evo->pushbuf_bo);
+@@ -51,42 +48,61 @@ nv50_evo_channel_del(struct nouveau_channel **pevo)
+ kfree(evo);
+ }
+
++void
++nv50_evo_dmaobj_init(struct nouveau_gpuobj *obj, u32 memtype, u64 base, u64 size)
++{
++ struct drm_nouveau_private *dev_priv = obj->dev->dev_private;
++ u32 flags5;
++
++ if (dev_priv->chipset < 0xc0) {
++ /* not supported on 0x50, specified in format mthd */
++ if (dev_priv->chipset == 0x50)
++ memtype = 0;
++ flags5 = 0x00010000;
++ } else {
++ if (memtype & 0x80000000)
++ flags5 = 0x00000000; /* large pages */
++ else
++ flags5 = 0x00020000;
++ }
++
++ nv50_gpuobj_dma_init(obj, 0, 0x3d, base, size, NV_MEM_TARGET_VRAM,
++ NV_MEM_ACCESS_RW, (memtype >> 8) & 0xff, 0);
++ nv_wo32(obj, 0x14, flags5);
++ dev_priv->engine.instmem.flush(obj->dev);
++}
++
+ int
+-nv50_evo_dmaobj_new(struct nouveau_channel *evo, u32 class, u32 name,
+- u32 tile_flags, u32 magic_flags, u32 offset, u32 limit,
+- u32 flags5)
++nv50_evo_dmaobj_new(struct nouveau_channel *evo, u32 handle, u32 memtype,
++ u64 base, u64 size, struct nouveau_gpuobj **pobj)
+ {
+- struct drm_nouveau_private *dev_priv = evo->dev->dev_private;
+- struct drm_device *dev = evo->dev;
++ struct nv50_display *disp = nv50_display(evo->dev);
+ struct nouveau_gpuobj *obj = NULL;
+ int ret;
+
+- ret = nouveau_gpuobj_new(dev, dev_priv->evo, 6*4, 32, 0, &obj);
++ ret = nouveau_gpuobj_new(evo->dev, disp->master, 6*4, 32, 0, &obj);
+ if (ret)
+ return ret;
+ obj->engine = NVOBJ_ENGINE_DISPLAY;
+
+- nv_wo32(obj, 0, (tile_flags << 22) | (magic_flags << 16) | class);
+- nv_wo32(obj, 4, limit);
+- nv_wo32(obj, 8, offset);
+- nv_wo32(obj, 12, 0x00000000);
+- nv_wo32(obj, 16, 0x00000000);
+- nv_wo32(obj, 20, flags5);
+- dev_priv->engine.instmem.flush(dev);
++ nv50_evo_dmaobj_init(obj, memtype, base, size);
+
+- ret = nouveau_ramht_insert(evo, name, obj);
+- nouveau_gpuobj_ref(NULL, &obj);
+- if (ret) {
+- return ret;
+- }
++ ret = nouveau_ramht_insert(evo, handle, obj);
++ if (ret)
++ goto out;
+
+- return 0;
++ if (pobj)
++ nouveau_gpuobj_ref(obj, pobj);
++out:
++ nouveau_gpuobj_ref(NULL, &obj);
++ return ret;
+ }
+
+ static int
+-nv50_evo_channel_new(struct drm_device *dev, struct nouveau_channel **pevo)
++nv50_evo_channel_new(struct drm_device *dev, int chid,
++ struct nouveau_channel **pevo)
+ {
+- struct drm_nouveau_private *dev_priv = dev->dev_private;
++ struct nv50_display *disp = nv50_display(dev);
+ struct nouveau_channel *evo;
+ int ret;
+
+@@ -95,25 +111,13 @@ nv50_evo_channel_new(struct drm_device *dev, struct nouveau_channel **pevo)
+ return -ENOMEM;
+ *pevo = evo;
+
+- for (evo->id = 0; evo->id < 5; evo->id++) {
+- if (dev_priv->evo_alloc & (1 << evo->id))
+- continue;
+-
+- dev_priv->evo_alloc |= (1 << evo->id);
+- break;
+- }
+-
+- if (evo->id == 5) {
+- kfree(evo);
+- return -ENODEV;
+- }
+-
++ evo->id = chid;
+ evo->dev = dev;
+ evo->user_get = 4;
+ evo->user_put = 0;
+
+ ret = nouveau_bo_new(dev, NULL, 4096, 0, TTM_PL_FLAG_VRAM, 0, 0,
+- false, true, &evo->pushbuf_bo);
++ &evo->pushbuf_bo);
+ if (ret == 0)
+ ret = nouveau_bo_pin(evo->pushbuf_bo, TTM_PL_FLAG_VRAM);
+ if (ret) {
+@@ -138,8 +142,8 @@ nv50_evo_channel_new(struct drm_device *dev, struct nouveau_channel **pevo)
+ }
+
+ /* bind primary evo channel's ramht to the channel */
+- if (dev_priv->evo && evo != dev_priv->evo)
+- nouveau_ramht_ref(dev_priv->evo->ramht, &evo->ramht, NULL);
++ if (disp->master && evo != disp->master)
++ nouveau_ramht_ref(disp->master->ramht, &evo->ramht, NULL);
+
+ return 0;
+ }
+@@ -182,6 +186,7 @@ nv50_evo_channel_init(struct nouveau_channel *evo)
+ nv_mask(dev, 0x610028, 0x00000000, 0x00010001 << id);
+
+ evo->dma.max = (4096/4) - 2;
++ evo->dma.max &= ~7;
+ evo->dma.put = 0;
+ evo->dma.cur = evo->dma.put;
+ evo->dma.free = evo->dma.max - evo->dma.cur;
+@@ -212,21 +217,39 @@ nv50_evo_channel_fini(struct nouveau_channel *evo)
+ }
+ }
+
++static void
++nv50_evo_destroy(struct drm_device *dev)
++{
++ struct nv50_display *disp = nv50_display(dev);
++ int i;
++
++ for (i = 0; i < 2; i++) {
++ if (disp->crtc[i].sem.bo) {
++ nouveau_bo_unmap(disp->crtc[i].sem.bo);
++ nouveau_bo_ref(NULL, &disp->crtc[i].sem.bo);
++ }
++ nv50_evo_channel_del(&disp->crtc[i].sync);
++ }
++ nouveau_gpuobj_ref(NULL, &disp->ntfy);
++ nv50_evo_channel_del(&disp->master);
++}
++
+ static int
+ nv50_evo_create(struct drm_device *dev)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
++ struct nv50_display *disp = nv50_display(dev);
+ struct nouveau_gpuobj *ramht = NULL;
+ struct nouveau_channel *evo;
+- int ret;
++ int ret, i, j;
+
+ /* create primary evo channel, the one we use for modesetting
+ * purporses
+ */
+- ret = nv50_evo_channel_new(dev, &dev_priv->evo);
++ ret = nv50_evo_channel_new(dev, 0, &disp->master);
+ if (ret)
+ return ret;
+- evo = dev_priv->evo;
++ evo = disp->master;
+
+ /* setup object management on it, any other evo channel will
+ * use this also as there's no per-channel support on the
+@@ -236,109 +259,167 @@ nv50_evo_create(struct drm_device *dev)
+ NVOBJ_FLAG_ZERO_ALLOC, &evo->ramin);
+ if (ret) {
+ NV_ERROR(dev, "Error allocating EVO channel memory: %d\n", ret);
+- nv50_evo_channel_del(&dev_priv->evo);
+- return ret;
++ goto err;
+ }
+
+ ret = drm_mm_init(&evo->ramin_heap, 0, 32768);
+ if (ret) {
+ NV_ERROR(dev, "Error initialising EVO PRAMIN heap: %d\n", ret);
+- nv50_evo_channel_del(&dev_priv->evo);
+- return ret;
++ goto err;
+ }
+
+ ret = nouveau_gpuobj_new(dev, evo, 4096, 16, 0, &ramht);
+ if (ret) {
+ NV_ERROR(dev, "Unable to allocate EVO RAMHT: %d\n", ret);
+- nv50_evo_channel_del(&dev_priv->evo);
+- return ret;
++ goto err;
+ }
+
+ ret = nouveau_ramht_new(dev, ramht, &evo->ramht);
+ nouveau_gpuobj_ref(NULL, &ramht);
+- if (ret) {
+- nv50_evo_channel_del(&dev_priv->evo);
+- return ret;
+- }
++ if (ret)
++ goto err;
++
++ /* not sure exactly what this is..
++ *
++ * the first dword of the structure is used by nvidia to wait on
++ * full completion of an EVO "update" command.
++ *
++ * method 0x8c on the master evo channel will fill a lot more of
++ * this structure with some undefined info
++ */
++ ret = nouveau_gpuobj_new(dev, disp->master, 0x1000, 0,
++ NVOBJ_FLAG_ZERO_ALLOC, &disp->ntfy);
++ if (ret)
++ goto err;
++
++ ret = nv50_evo_dmaobj_new(disp->master, NvEvoSync, 0x0000,
++ disp->ntfy->vinst, disp->ntfy->size, NULL);
++ if (ret)
++ goto err;
+
+ /* create some default objects for the scanout memtypes we support */
+- if (dev_priv->card_type >= NV_C0) {
+- ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoFB32, 0xfe, 0x19,
+- 0, 0xffffffff, 0x00000000);
+- if (ret) {
+- nv50_evo_channel_del(&dev_priv->evo);
+- return ret;
+- }
++ ret = nv50_evo_dmaobj_new(disp->master, NvEvoVRAM, 0x0000,
++ 0, dev_priv->vram_size, NULL);
++ if (ret)
++ goto err;
+
+- ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoVRAM, 0, 0x19,
+- 0, dev_priv->vram_size, 0x00020000);
+- if (ret) {
+- nv50_evo_channel_del(&dev_priv->evo);
+- return ret;
+- }
++ ret = nv50_evo_dmaobj_new(disp->master, NvEvoVRAM_LP, 0x80000000,
++ 0, dev_priv->vram_size, NULL);
++ if (ret)
++ goto err;
+
+- ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoVRAM_LP, 0, 0x19,
+- 0, dev_priv->vram_size, 0x00000000);
+- if (ret) {
+- nv50_evo_channel_del(&dev_priv->evo);
+- return ret;
+- }
+- } else {
+- ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoFB16, 0x70, 0x19,
+- 0, 0xffffffff, 0x00010000);
+- if (ret) {
+- nv50_evo_channel_del(&dev_priv->evo);
+- return ret;
+- }
++ ret = nv50_evo_dmaobj_new(disp->master, NvEvoFB32, 0x80000000 |
++ (dev_priv->chipset < 0xc0 ? 0x7a00 : 0xfe00),
++ 0, dev_priv->vram_size, NULL);
++ if (ret)
++ goto err;
+
++ ret = nv50_evo_dmaobj_new(disp->master, NvEvoFB16, 0x80000000 |
++ (dev_priv->chipset < 0xc0 ? 0x7000 : 0xfe00),
++ 0, dev_priv->vram_size, NULL);
++ if (ret)
++ goto err;
+
+- ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoFB32, 0x7a, 0x19,
+- 0, 0xffffffff, 0x00010000);
+- if (ret) {
+- nv50_evo_channel_del(&dev_priv->evo);
+- return ret;
+- }
++ /* create "display sync" channels and other structures we need
++ * to implement page flipping
++ */
++ for (i = 0; i < 2; i++) {
++ struct nv50_display_crtc *dispc = &disp->crtc[i];
++ u64 offset;
+
+- ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoVRAM, 0, 0x19,
+- 0, dev_priv->vram_size, 0x00010000);
+- if (ret) {
+- nv50_evo_channel_del(&dev_priv->evo);
+- return ret;
++ ret = nv50_evo_channel_new(dev, 1 + i, &dispc->sync);
++ if (ret)
++ goto err;
++
++ ret = nouveau_bo_new(dev, NULL, 4096, 0x1000, TTM_PL_FLAG_VRAM,
++ 0, 0x0000, &dispc->sem.bo);
++ if (!ret) {
++ offset = dispc->sem.bo->bo.mem.start << PAGE_SHIFT;
++
++ ret = nouveau_bo_pin(dispc->sem.bo, TTM_PL_FLAG_VRAM);
++ if (!ret)
++ ret = nouveau_bo_map(dispc->sem.bo);
++ if (ret)
++ nouveau_bo_ref(NULL, &dispc->sem.bo);
+ }
+
+- ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoVRAM_LP, 0, 0x19,
+- 0, dev_priv->vram_size, 0x00010000);
+- if (ret) {
+- nv50_evo_channel_del(&dev_priv->evo);
+- return ret;
+- }
++ if (ret)
++ goto err;
++
++ ret = nv50_evo_dmaobj_new(dispc->sync, NvEvoSync, 0x0000,
++ offset, 4096, NULL);
++ if (ret)
++ goto err;
++
++ ret = nv50_evo_dmaobj_new(dispc->sync, NvEvoVRAM_LP, 0x80000000,
++ 0, dev_priv->vram_size, NULL);
++ if (ret)
++ goto err;
++
++ ret = nv50_evo_dmaobj_new(dispc->sync, NvEvoFB32, 0x80000000 |
++ (dev_priv->chipset < 0xc0 ?
++ 0x7a00 : 0xfe00),
++ 0, dev_priv->vram_size, NULL);
++ if (ret)
++ goto err;
++
++ ret = nv50_evo_dmaobj_new(dispc->sync, NvEvoFB16, 0x80000000 |
++ (dev_priv->chipset < 0xc0 ?
++ 0x7000 : 0xfe00),
++ 0, dev_priv->vram_size, NULL);
++ if (ret)
++ goto err;
++
++ for (j = 0; j < 4096; j += 4)
++ nouveau_bo_wr32(dispc->sem.bo, j / 4, 0x74b1e000);
++ dispc->sem.offset = 0;
+ }
+
+ return 0;
++
++err:
++ nv50_evo_destroy(dev);
++ return ret;
+ }
+
+ int
+ nv50_evo_init(struct drm_device *dev)
+ {
+- struct drm_nouveau_private *dev_priv = dev->dev_private;
+- int ret;
++ struct nv50_display *disp = nv50_display(dev);
++ int ret, i;
+
+- if (!dev_priv->evo) {
++ if (!disp->master) {
+ ret = nv50_evo_create(dev);
+ if (ret)
+ return ret;
+ }
+
+- return nv50_evo_channel_init(dev_priv->evo);
++ ret = nv50_evo_channel_init(disp->master);
++ if (ret)
++ return ret;
++
++ for (i = 0; i < 2; i++) {
++ ret = nv50_evo_channel_init(disp->crtc[i].sync);
++ if (ret)
++ return ret;
++ }
++
++ return 0;
+ }
+
+ void
+ nv50_evo_fini(struct drm_device *dev)
+ {
+- struct drm_nouveau_private *dev_priv = dev->dev_private;
++ struct nv50_display *disp = nv50_display(dev);
++ int i;
+
+- if (dev_priv->evo) {
+- nv50_evo_channel_fini(dev_priv->evo);
+- nv50_evo_channel_del(&dev_priv->evo);
++ for (i = 0; i < 2; i++) {
++ if (disp->crtc[i].sync)
++ nv50_evo_channel_fini(disp->crtc[i].sync);
+ }
++
++ if (disp->master)
++ nv50_evo_channel_fini(disp->master);
++
++ nv50_evo_destroy(dev);
+ }
+diff --git a/drivers/gpu/drm/nouveau/nv50_evo.h b/drivers/gpu/drm/nouveau/nv50_evo.h
+index aa4f0d3..3860ca6 100644
+--- a/drivers/gpu/drm/nouveau/nv50_evo.h
++++ b/drivers/gpu/drm/nouveau/nv50_evo.h
+@@ -27,12 +27,6 @@
+ #ifndef __NV50_EVO_H__
+ #define __NV50_EVO_H__
+
+-int nv50_evo_init(struct drm_device *dev);
+-void nv50_evo_fini(struct drm_device *dev);
+-int nv50_evo_dmaobj_new(struct nouveau_channel *, u32 class, u32 name,
+- u32 tile_flags, u32 magic_flags,
+- u32 offset, u32 limit);
+-
+ #define NV50_EVO_UPDATE 0x00000080
+ #define NV50_EVO_UNK84 0x00000084
+ #define NV50_EVO_UNK84_NOTIFY 0x40000000
+@@ -119,5 +113,7 @@ int nv50_evo_dmaobj_new(struct nouveau_channel *, u32 class, u32 name,
+ /* Both of these are needed, otherwise nothing happens. */
+ #define NV50_EVO_CRTC_SCALE_RES1 0x000008d8
+ #define NV50_EVO_CRTC_SCALE_RES2 0x000008dc
++#define NV50_EVO_CRTC_UNK900 0x00000900
++#define NV50_EVO_CRTC_UNK904 0x00000904
+
+ #endif
+diff --git a/drivers/gpu/drm/nouveau/nv50_fb.c b/drivers/gpu/drm/nouveau/nv50_fb.c
+index 50290de..ddebd71 100644
+--- a/drivers/gpu/drm/nouveau/nv50_fb.c
++++ b/drivers/gpu/drm/nouveau/nv50_fb.c
+@@ -8,31 +8,61 @@ struct nv50_fb_priv {
+ dma_addr_t r100c08;
+ };
+
++static void
++nv50_fb_destroy(struct drm_device *dev)
++{
++ struct drm_nouveau_private *dev_priv = dev->dev_private;
++ struct nouveau_fb_engine *pfb = &dev_priv->engine.fb;
++ struct nv50_fb_priv *priv = pfb->priv;
++
++ if (pfb->tag_heap.free_stack.next)
++ drm_mm_takedown(&pfb->tag_heap);
++
++ if (priv->r100c08_page) {
++ pci_unmap_page(dev->pdev, priv->r100c08, PAGE_SIZE,
++ PCI_DMA_BIDIRECTIONAL);
++ __free_page(priv->r100c08_page);
++ }
++
++ kfree(priv);
++ pfb->priv = NULL;
++}
++
+ static int
+ nv50_fb_create(struct drm_device *dev)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
++ struct nouveau_fb_engine *pfb = &dev_priv->engine.fb;
+ struct nv50_fb_priv *priv;
++ u32 tagmem;
++ int ret;
+
+ priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+ if (!priv)
+ return -ENOMEM;
++ pfb->priv = priv;
+
+ priv->r100c08_page = alloc_page(GFP_KERNEL | __GFP_ZERO);
+ if (!priv->r100c08_page) {
+- kfree(priv);
++ nv50_fb_destroy(dev);
+ return -ENOMEM;
+ }
+
+ priv->r100c08 = pci_map_page(dev->pdev, priv->r100c08_page, 0,
+ PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
+ if (pci_dma_mapping_error(dev->pdev, priv->r100c08)) {
+- __free_page(priv->r100c08_page);
+- kfree(priv);
++ nv50_fb_destroy(dev);
+ return -EFAULT;
+ }
+
+- dev_priv->engine.fb.priv = priv;
++ tagmem = nv_rd32(dev, 0x100320);
++ NV_DEBUG(dev, "%d tags available\n", tagmem);
++ ret = drm_mm_init(&pfb->tag_heap, 0, tagmem);
++ if (ret) {
++ nv50_fb_destroy(dev);
++ return ret;
++ }
++
+ return 0;
+ }
+
+@@ -81,26 +111,112 @@ nv50_fb_init(struct drm_device *dev)
+ void
+ nv50_fb_takedown(struct drm_device *dev)
+ {
+- struct drm_nouveau_private *dev_priv = dev->dev_private;
+- struct nv50_fb_priv *priv;
++ nv50_fb_destroy(dev);
++}
+
+- priv = dev_priv->engine.fb.priv;
+- if (!priv)
+- return;
+- dev_priv->engine.fb.priv = NULL;
++static struct nouveau_enum vm_dispatch_subclients[] = {
++ { 0x00000000, "GRCTX", NULL },
++ { 0x00000001, "NOTIFY", NULL },
++ { 0x00000002, "QUERY", NULL },
++ { 0x00000003, "COND", NULL },
++ { 0x00000004, "M2M_IN", NULL },
++ { 0x00000005, "M2M_OUT", NULL },
++ { 0x00000006, "M2M_NOTIFY", NULL },
++ {}
++};
+
+- pci_unmap_page(dev->pdev, priv->r100c08, PAGE_SIZE,
+- PCI_DMA_BIDIRECTIONAL);
+- __free_page(priv->r100c08_page);
+- kfree(priv);
+-}
++static struct nouveau_enum vm_ccache_subclients[] = {
++ { 0x00000000, "CB", NULL },
++ { 0x00000001, "TIC", NULL },
++ { 0x00000002, "TSC", NULL },
++ {}
++};
++
++static struct nouveau_enum vm_prop_subclients[] = {
++ { 0x00000000, "RT0", NULL },
++ { 0x00000001, "RT1", NULL },
++ { 0x00000002, "RT2", NULL },
++ { 0x00000003, "RT3", NULL },
++ { 0x00000004, "RT4", NULL },
++ { 0x00000005, "RT5", NULL },
++ { 0x00000006, "RT6", NULL },
++ { 0x00000007, "RT7", NULL },
++ { 0x00000008, "ZETA", NULL },
++ { 0x00000009, "LOCAL", NULL },
++ { 0x0000000a, "GLOBAL", NULL },
++ { 0x0000000b, "STACK", NULL },
++ { 0x0000000c, "DST2D", NULL },
++ {}
++};
++
++static struct nouveau_enum vm_pfifo_subclients[] = {
++ { 0x00000000, "PUSHBUF", NULL },
++ { 0x00000001, "SEMAPHORE", NULL },
++ {}
++};
++
++static struct nouveau_enum vm_bar_subclients[] = {
++ { 0x00000000, "FB", NULL },
++ { 0x00000001, "IN", NULL },
++ {}
++};
++
++static struct nouveau_enum vm_client[] = {
++ { 0x00000000, "STRMOUT", NULL },
++ { 0x00000003, "DISPATCH", vm_dispatch_subclients },
++ { 0x00000004, "PFIFO_WRITE", NULL },
++ { 0x00000005, "CCACHE", vm_ccache_subclients },
++ { 0x00000006, "PPPP", NULL },
++ { 0x00000007, "CLIPID", NULL },
++ { 0x00000008, "PFIFO_READ", NULL },
++ { 0x00000009, "VFETCH", NULL },
++ { 0x0000000a, "TEXTURE", NULL },
++ { 0x0000000b, "PROP", vm_prop_subclients },
++ { 0x0000000c, "PVP", NULL },
++ { 0x0000000d, "PBSP", NULL },
++ { 0x0000000e, "PCRYPT", NULL },
++ { 0x0000000f, "PCOUNTER", NULL },
++ { 0x00000011, "PDAEMON", NULL },
++ {}
++};
++
++static struct nouveau_enum vm_engine[] = {
++ { 0x00000000, "PGRAPH", NULL },
++ { 0x00000001, "PVP", NULL },
++ { 0x00000004, "PEEPHOLE", NULL },
++ { 0x00000005, "PFIFO", vm_pfifo_subclients },
++ { 0x00000006, "BAR", vm_bar_subclients },
++ { 0x00000008, "PPPP", NULL },
++ { 0x00000009, "PBSP", NULL },
++ { 0x0000000a, "PCRYPT", NULL },
++ { 0x0000000b, "PCOUNTER", NULL },
++ { 0x0000000c, "SEMAPHORE_BG", NULL },
++ { 0x0000000d, "PCOPY", NULL },
++ { 0x0000000e, "PDAEMON", NULL },
++ {}
++};
++
++static struct nouveau_enum vm_fault[] = {
++ { 0x00000000, "PT_NOT_PRESENT", NULL },
++ { 0x00000001, "PT_TOO_SHORT", NULL },
++ { 0x00000002, "PAGE_NOT_PRESENT", NULL },
++ { 0x00000003, "PAGE_SYSTEM_ONLY", NULL },
++ { 0x00000004, "PAGE_READ_ONLY", NULL },
++ { 0x00000006, "NULL_DMAOBJ", NULL },
++ { 0x00000007, "WRONG_MEMTYPE", NULL },
++ { 0x0000000b, "VRAM_LIMIT", NULL },
++ { 0x0000000f, "DMAOBJ_LIMIT", NULL },
++ {}
++};
+
+ void
+-nv50_fb_vm_trap(struct drm_device *dev, int display, const char *name)
++nv50_fb_vm_trap(struct drm_device *dev, int display)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
++ const struct nouveau_enum *en, *cl;
+ unsigned long flags;
+ u32 trap[6], idx, chinst;
++ u8 st0, st1, st2, st3;
+ int i, ch;
+
+ idx = nv_rd32(dev, 0x100c90);
+@@ -117,8 +233,8 @@ nv50_fb_vm_trap(struct drm_device *dev, int display, const char *name)
+ if (!display)
+ return;
+
++ /* lookup channel id */
+ chinst = (trap[2] << 16) | trap[1];
+-
+ spin_lock_irqsave(&dev_priv->channels.lock, flags);
+ for (ch = 0; ch < dev_priv->engine.fifo.channels; ch++) {
+ struct nouveau_channel *chan = dev_priv->channels.ptr[ch];
+@@ -131,9 +247,48 @@ nv50_fb_vm_trap(struct drm_device *dev, int display, const char *name)
+ }
+ spin_unlock_irqrestore(&dev_priv->channels.lock, flags);
+
+- NV_INFO(dev, "%s - VM: Trapped %s at %02x%04x%04x status %08x "
+- "channel %d (0x%08x)\n",
+- name, (trap[5] & 0x100 ? "read" : "write"),
+- trap[5] & 0xff, trap[4] & 0xffff, trap[3] & 0xffff,
+- trap[0], ch, chinst);
++ /* decode status bits into something more useful */
++ if (dev_priv->chipset < 0xa3 ||
++ dev_priv->chipset == 0xaa || dev_priv->chipset == 0xac) {
++ st0 = (trap[0] & 0x0000000f) >> 0;
++ st1 = (trap[0] & 0x000000f0) >> 4;
++ st2 = (trap[0] & 0x00000f00) >> 8;
++ st3 = (trap[0] & 0x0000f000) >> 12;
++ } else {
++ st0 = (trap[0] & 0x000000ff) >> 0;
++ st1 = (trap[0] & 0x0000ff00) >> 8;
++ st2 = (trap[0] & 0x00ff0000) >> 16;
++ st3 = (trap[0] & 0xff000000) >> 24;
++ }
++
++ NV_INFO(dev, "VM: trapped %s at 0x%02x%04x%04x on ch %d [0x%08x] ",
++ (trap[5] & 0x00000100) ? "read" : "write",
++ trap[5] & 0xff, trap[4] & 0xffff, trap[3] & 0xffff, ch, chinst);
++
++ en = nouveau_enum_find(vm_engine, st0);
++ if (en)
++ printk("%s/", en->name);
++ else
++ printk("%02x/", st0);
++
++ cl = nouveau_enum_find(vm_client, st2);
++ if (cl)
++ printk("%s/", cl->name);
++ else
++ printk("%02x/", st2);
++
++ if (cl && cl->data) cl = nouveau_enum_find(cl->data, st3);
++ else if (en && en->data) cl = nouveau_enum_find(en->data, st3);
++ else cl = NULL;
++ if (cl)
++ printk("%s", cl->name);
++ else
++ printk("%02x", st3);
++
++ printk(" reason: ");
++ en = nouveau_enum_find(vm_fault, st1);
++ if (en)
++ printk("%s\n", en->name);
++ else
++ printk("0x%08x\n", st1);
+ }
+diff --git a/drivers/gpu/drm/nouveau/nv50_fifo.c b/drivers/gpu/drm/nouveau/nv50_fifo.c
+index 8dd04c5..c34a074 100644
+--- a/drivers/gpu/drm/nouveau/nv50_fifo.c
++++ b/drivers/gpu/drm/nouveau/nv50_fifo.c
+@@ -149,6 +149,7 @@ nv50_fifo_init_regs(struct drm_device *dev)
+ nv_wr32(dev, 0x3204, 0);
+ nv_wr32(dev, 0x3210, 0);
+ nv_wr32(dev, 0x3270, 0);
++ nv_wr32(dev, 0x2044, 0x01003fff);
+
+ /* Enable dummy channels setup by nv50_instmem.c */
+ nv50_fifo_channel_enable(dev, 0);
+@@ -273,7 +274,7 @@ nv50_fifo_create_context(struct nouveau_channel *chan)
+ nv_wo32(ramfc, 0x80, ((chan->ramht->bits - 9) << 27) |
+ (4 << 24) /* SEARCH_FULL */ |
+ (chan->ramht->gpuobj->cinst >> 4));
+- nv_wo32(ramfc, 0x44, 0x2101ffff);
++ nv_wo32(ramfc, 0x44, 0x01003fff);
+ nv_wo32(ramfc, 0x60, 0x7fffffff);
+ nv_wo32(ramfc, 0x40, 0x00000000);
+ nv_wo32(ramfc, 0x7c, 0x30000001);
+diff --git a/drivers/gpu/drm/nouveau/nv50_gpio.c b/drivers/gpu/drm/nouveau/nv50_gpio.c
+index 6b149c0..d4f4206 100644
+--- a/drivers/gpu/drm/nouveau/nv50_gpio.c
++++ b/drivers/gpu/drm/nouveau/nv50_gpio.c
+@@ -137,6 +137,7 @@ nv50_gpio_irq_unregister(struct drm_device *dev, enum dcb_gpio_tag tag,
+ struct nv50_gpio_priv *priv = pgpio->priv;
+ struct nv50_gpio_handler *gpioh, *tmp;
+ struct dcb_gpio_entry *gpio;
++ LIST_HEAD(tofree);
+ unsigned long flags;
+
+ gpio = nouveau_bios_gpio_entry(dev, tag);
+@@ -149,10 +150,14 @@ nv50_gpio_irq_unregister(struct drm_device *dev, enum dcb_gpio_tag tag,
+ gpioh->handler != handler ||
+ gpioh->data != data)
+ continue;
+- list_del(&gpioh->head);
+- kfree(gpioh);
++ list_move(&gpioh->head, &tofree);
+ }
+ spin_unlock_irqrestore(&priv->lock, flags);
++
++ list_for_each_entry_safe(gpioh, tmp, &tofree, head) {
++ flush_work_sync(&gpioh->work);
++ kfree(gpioh);
++ }
+ }
+
+ bool
+@@ -205,7 +210,6 @@ nv50_gpio_init(struct drm_device *dev)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+ struct nouveau_gpio_engine *pgpio = &dev_priv->engine.gpio;
+- struct nv50_gpio_priv *priv;
+ int ret;
+
+ if (!pgpio->priv) {
+@@ -213,7 +217,6 @@ nv50_gpio_init(struct drm_device *dev)
+ if (ret)
+ return ret;
+ }
+- priv = pgpio->priv;
+
+ /* disable, and ack any pending gpio interrupts */
+ nv_wr32(dev, 0xe050, 0x00000000);
+@@ -293,7 +296,7 @@ nv50_gpio_isr(struct drm_device *dev)
+ continue;
+ gpioh->inhibit = true;
+
+- queue_work(dev_priv->wq, &gpioh->work);
++ schedule_work(&gpioh->work);
+ }
+ spin_unlock(&priv->lock);
+ }
+diff --git a/drivers/gpu/drm/nouveau/nv50_graph.c b/drivers/gpu/drm/nouveau/nv50_graph.c
+index 37e21d2..7950bac 100644
+--- a/drivers/gpu/drm/nouveau/nv50_graph.c
++++ b/drivers/gpu/drm/nouveau/nv50_graph.c
+@@ -95,13 +95,41 @@ nv50_graph_init_regs__nv(struct drm_device *dev)
+ }
+
+ static void
+-nv50_graph_init_regs(struct drm_device *dev)
++nv50_graph_init_zcull(struct drm_device *dev)
+ {
++ struct drm_nouveau_private *dev_priv = dev->dev_private;
++ int i;
++
+ NV_DEBUG(dev, "\n");
+
+- nv_wr32(dev, NV04_PGRAPH_DEBUG_3,
+- (1 << 2) /* HW_CONTEXT_SWITCH_ENABLED */);
+- nv_wr32(dev, 0x402ca8, 0x800);
++ switch (dev_priv->chipset & 0xf0) {
++ case 0x50:
++ case 0x80:
++ case 0x90:
++ nv_wr32(dev, 0x402ca8, 0x00000800);
++ break;
++ case 0xa0:
++ default:
++ nv_wr32(dev, 0x402cc0, 0x00000000);
++ if (dev_priv->chipset == 0xa0 ||
++ dev_priv->chipset == 0xaa ||
++ dev_priv->chipset == 0xac) {
++ nv_wr32(dev, 0x402ca8, 0x00000802);
++ } else {
++ nv_wr32(dev, 0x402cc0, 0x00000000);
++ nv_wr32(dev, 0x402ca8, 0x00000002);
++ }
++
++ break;
++ }
++
++ /* zero out zcull regions */
++ for (i = 0; i < 8; i++) {
++ nv_wr32(dev, 0x402c20 + (i * 8), 0x00000000);
++ nv_wr32(dev, 0x402c24 + (i * 8), 0x00000000);
++ nv_wr32(dev, 0x402c28 + (i * 8), 0x00000000);
++ nv_wr32(dev, 0x402c2c + (i * 8), 0x00000000);
++ }
+ }
+
+ static int
+@@ -136,6 +164,7 @@ nv50_graph_init_ctxctl(struct drm_device *dev)
+ }
+ kfree(cp);
+
++ nv_wr32(dev, 0x40008c, 0x00000004); /* HW_CTX_SWITCH_ENABLED */
+ nv_wr32(dev, 0x400320, 4);
+ nv_wr32(dev, NV40_PGRAPH_CTXCTL_CUR, 0);
+ nv_wr32(dev, NV20_PGRAPH_CHANNEL_CTX_POINTER, 0);
+@@ -151,7 +180,7 @@ nv50_graph_init(struct drm_device *dev)
+
+ nv50_graph_init_reset(dev);
+ nv50_graph_init_regs__nv(dev);
+- nv50_graph_init_regs(dev);
++ nv50_graph_init_zcull(dev);
+
+ ret = nv50_graph_init_ctxctl(dev);
+ if (ret)
+@@ -409,12 +438,7 @@ static int
+ nv50_graph_nvsw_mthd_page_flip(struct nouveau_channel *chan,
+ u32 class, u32 mthd, u32 data)
+ {
+- struct nouveau_page_flip_state s;
+-
+- if (!nouveau_finish_page_flip(chan, &s)) {
+- /* XXX - Do something here */
+- }
+-
++ nouveau_finish_page_flip(chan, NULL);
+ return 0;
+ }
+
+@@ -479,7 +503,7 @@ nv50_graph_tlb_flush(struct drm_device *dev)
+ }
+
+ void
+-nv86_graph_tlb_flush(struct drm_device *dev)
++nv84_graph_tlb_flush(struct drm_device *dev)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+ struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer;
+@@ -524,13 +548,12 @@ nv86_graph_tlb_flush(struct drm_device *dev)
+ spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
+ }
+
+-static struct nouveau_enum nv50_mp_exec_error_names[] =
+-{
+- { 3, "STACK_UNDERFLOW" },
+- { 4, "QUADON_ACTIVE" },
+- { 8, "TIMEOUT" },
+- { 0x10, "INVALID_OPCODE" },
+- { 0x40, "BREAKPOINT" },
++static struct nouveau_enum nv50_mp_exec_error_names[] = {
++ { 3, "STACK_UNDERFLOW", NULL },
++ { 4, "QUADON_ACTIVE", NULL },
++ { 8, "TIMEOUT", NULL },
++ { 0x10, "INVALID_OPCODE", NULL },
++ { 0x40, "BREAKPOINT", NULL },
+ {}
+ };
+
+@@ -558,47 +581,47 @@ static struct nouveau_bitfield nv50_graph_trap_ccache[] = {
+
+ /* There must be a *lot* of these. Will take some time to gather them up. */
+ struct nouveau_enum nv50_data_error_names[] = {
+- { 0x00000003, "INVALID_QUERY_OR_TEXTURE" },
+- { 0x00000004, "INVALID_VALUE" },
+- { 0x00000005, "INVALID_ENUM" },
+- { 0x00000008, "INVALID_OBJECT" },
+- { 0x00000009, "READ_ONLY_OBJECT" },
+- { 0x0000000a, "SUPERVISOR_OBJECT" },
+- { 0x0000000b, "INVALID_ADDRESS_ALIGNMENT" },
+- { 0x0000000c, "INVALID_BITFIELD" },
+- { 0x0000000d, "BEGIN_END_ACTIVE" },
+- { 0x0000000e, "SEMANTIC_COLOR_BACK_OVER_LIMIT" },
+- { 0x0000000f, "VIEWPORT_ID_NEEDS_GP" },
+- { 0x00000010, "RT_DOUBLE_BIND" },
+- { 0x00000011, "RT_TYPES_MISMATCH" },
+- { 0x00000012, "RT_LINEAR_WITH_ZETA" },
+- { 0x00000015, "FP_TOO_FEW_REGS" },
+- { 0x00000016, "ZETA_FORMAT_CSAA_MISMATCH" },
+- { 0x00000017, "RT_LINEAR_WITH_MSAA" },
+- { 0x00000018, "FP_INTERPOLANT_START_OVER_LIMIT" },
+- { 0x00000019, "SEMANTIC_LAYER_OVER_LIMIT" },
+- { 0x0000001a, "RT_INVALID_ALIGNMENT" },
+- { 0x0000001b, "SAMPLER_OVER_LIMIT" },
+- { 0x0000001c, "TEXTURE_OVER_LIMIT" },
+- { 0x0000001e, "GP_TOO_MANY_OUTPUTS" },
+- { 0x0000001f, "RT_BPP128_WITH_MS8" },
+- { 0x00000021, "Z_OUT_OF_BOUNDS" },
+- { 0x00000023, "XY_OUT_OF_BOUNDS" },
+- { 0x00000027, "CP_MORE_PARAMS_THAN_SHARED" },
+- { 0x00000028, "CP_NO_REG_SPACE_STRIPED" },
+- { 0x00000029, "CP_NO_REG_SPACE_PACKED" },
+- { 0x0000002a, "CP_NOT_ENOUGH_WARPS" },
+- { 0x0000002b, "CP_BLOCK_SIZE_MISMATCH" },
+- { 0x0000002c, "CP_NOT_ENOUGH_LOCAL_WARPS" },
+- { 0x0000002d, "CP_NOT_ENOUGH_STACK_WARPS" },
+- { 0x0000002e, "CP_NO_BLOCKDIM_LATCH" },
+- { 0x00000031, "ENG2D_FORMAT_MISMATCH" },
+- { 0x0000003f, "PRIMITIVE_ID_NEEDS_GP" },
+- { 0x00000044, "SEMANTIC_VIEWPORT_OVER_LIMIT" },
+- { 0x00000045, "SEMANTIC_COLOR_FRONT_OVER_LIMIT" },
+- { 0x00000046, "LAYER_ID_NEEDS_GP" },
+- { 0x00000047, "SEMANTIC_CLIP_OVER_LIMIT" },
+- { 0x00000048, "SEMANTIC_PTSZ_OVER_LIMIT" },
++ { 0x00000003, "INVALID_QUERY_OR_TEXTURE", NULL },
++ { 0x00000004, "INVALID_VALUE", NULL },
++ { 0x00000005, "INVALID_ENUM", NULL },
++ { 0x00000008, "INVALID_OBJECT", NULL },
++ { 0x00000009, "READ_ONLY_OBJECT", NULL },
++ { 0x0000000a, "SUPERVISOR_OBJECT", NULL },
++ { 0x0000000b, "INVALID_ADDRESS_ALIGNMENT", NULL },
++ { 0x0000000c, "INVALID_BITFIELD", NULL },
++ { 0x0000000d, "BEGIN_END_ACTIVE", NULL },
++ { 0x0000000e, "SEMANTIC_COLOR_BACK_OVER_LIMIT", NULL },
++ { 0x0000000f, "VIEWPORT_ID_NEEDS_GP", NULL },
++ { 0x00000010, "RT_DOUBLE_BIND", NULL },
++ { 0x00000011, "RT_TYPES_MISMATCH", NULL },
++ { 0x00000012, "RT_LINEAR_WITH_ZETA", NULL },
++ { 0x00000015, "FP_TOO_FEW_REGS", NULL },
++ { 0x00000016, "ZETA_FORMAT_CSAA_MISMATCH", NULL },
++ { 0x00000017, "RT_LINEAR_WITH_MSAA", NULL },
++ { 0x00000018, "FP_INTERPOLANT_START_OVER_LIMIT", NULL },
++ { 0x00000019, "SEMANTIC_LAYER_OVER_LIMIT", NULL },
++ { 0x0000001a, "RT_INVALID_ALIGNMENT", NULL },
++ { 0x0000001b, "SAMPLER_OVER_LIMIT", NULL },
++ { 0x0000001c, "TEXTURE_OVER_LIMIT", NULL },
++ { 0x0000001e, "GP_TOO_MANY_OUTPUTS", NULL },
++ { 0x0000001f, "RT_BPP128_WITH_MS8", NULL },
++ { 0x00000021, "Z_OUT_OF_BOUNDS", NULL },
++ { 0x00000023, "XY_OUT_OF_BOUNDS", NULL },
++ { 0x00000027, "CP_MORE_PARAMS_THAN_SHARED", NULL },
++ { 0x00000028, "CP_NO_REG_SPACE_STRIPED", NULL },
++ { 0x00000029, "CP_NO_REG_SPACE_PACKED", NULL },
++ { 0x0000002a, "CP_NOT_ENOUGH_WARPS", NULL },
++ { 0x0000002b, "CP_BLOCK_SIZE_MISMATCH", NULL },
++ { 0x0000002c, "CP_NOT_ENOUGH_LOCAL_WARPS", NULL },
++ { 0x0000002d, "CP_NOT_ENOUGH_STACK_WARPS", NULL },
++ { 0x0000002e, "CP_NO_BLOCKDIM_LATCH", NULL },
++ { 0x00000031, "ENG2D_FORMAT_MISMATCH", NULL },
++ { 0x0000003f, "PRIMITIVE_ID_NEEDS_GP", NULL },
++ { 0x00000044, "SEMANTIC_VIEWPORT_OVER_LIMIT", NULL },
++ { 0x00000045, "SEMANTIC_COLOR_FRONT_OVER_LIMIT", NULL },
++ { 0x00000046, "LAYER_ID_NEEDS_GP", NULL },
++ { 0x00000047, "SEMANTIC_CLIP_OVER_LIMIT", NULL },
++ { 0x00000048, "SEMANTIC_PTSZ_OVER_LIMIT", NULL },
+ {}
+ };
+
+@@ -639,7 +662,7 @@ nv50_pgraph_mp_trap(struct drm_device *dev, int tpid, int display)
+ nv_rd32(dev, addr + 0x20);
+ pc = nv_rd32(dev, addr + 0x24);
+ oplow = nv_rd32(dev, addr + 0x70);
+- ophigh= nv_rd32(dev, addr + 0x74);
++ ophigh = nv_rd32(dev, addr + 0x74);
+ NV_INFO(dev, "PGRAPH_TRAP_MP_EXEC - "
+ "TP %d MP %d: ", tpid, i);
+ nouveau_enum_print(nv50_mp_exec_error_names, status);
+@@ -678,7 +701,6 @@ nv50_pgraph_tp_trap(struct drm_device *dev, int type, uint32_t ustatus_old,
+ tps++;
+ switch (type) {
+ case 6: /* texture error... unknown for now */
+- nv50_fb_vm_trap(dev, display, name);
+ if (display) {
+ NV_ERROR(dev, "magic set %d:\n", i);
+ for (r = ustatus_addr + 4; r <= ustatus_addr + 0x10; r += 4)
+@@ -701,7 +723,6 @@ nv50_pgraph_tp_trap(struct drm_device *dev, int type, uint32_t ustatus_old,
+ uint32_t e1c = nv_rd32(dev, ustatus_addr + 0x14);
+ uint32_t e20 = nv_rd32(dev, ustatus_addr + 0x18);
+ uint32_t e24 = nv_rd32(dev, ustatus_addr + 0x1c);
+- nv50_fb_vm_trap(dev, display, name);
+ /* 2d engine destination */
+ if (ustatus & 0x00000010) {
+ if (display) {
+@@ -912,10 +933,10 @@ nv50_pgraph_trap_handler(struct drm_device *dev, u32 display, u64 inst, u32 chid
+ printk("\n");
+ NV_INFO(dev, "PGRAPH - TRAP_CCACHE %08x %08x %08x %08x"
+ " %08x %08x %08x\n",
+- nv_rd32(dev, 0x405800), nv_rd32(dev, 0x405804),
+- nv_rd32(dev, 0x405808), nv_rd32(dev, 0x40580c),
+- nv_rd32(dev, 0x405810), nv_rd32(dev, 0x405814),
+- nv_rd32(dev, 0x40581c));
++ nv_rd32(dev, 0x405000), nv_rd32(dev, 0x405004),
++ nv_rd32(dev, 0x405008), nv_rd32(dev, 0x40500c),
++ nv_rd32(dev, 0x405010), nv_rd32(dev, 0x405014),
++ nv_rd32(dev, 0x40501c));
+
+ }
+
+@@ -1044,6 +1065,7 @@ nv50_graph_isr(struct drm_device *dev)
+ NV_INFO(dev, "PGRAPH - ch %d (0x%010llx) subc %d "
+ "class 0x%04x mthd 0x%04x data 0x%08x\n",
+ chid, inst, subc, class, mthd, data);
++ nv50_fb_vm_trap(dev, 1);
+ }
+ }
+
+diff --git a/drivers/gpu/drm/nouveau/nv50_grctx.c b/drivers/gpu/drm/nouveau/nv50_grctx.c
+index 336aab2..de9abff 100644
+--- a/drivers/gpu/drm/nouveau/nv50_grctx.c
++++ b/drivers/gpu/drm/nouveau/nv50_grctx.c
+@@ -747,7 +747,7 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
+ gr_def(ctx, offset + 0x64, 0x0000001f);
+ gr_def(ctx, offset + 0x68, 0x0000000f);
+ gr_def(ctx, offset + 0x6c, 0x0000000f);
+- } else if(dev_priv->chipset < 0xa0) {
++ } else if (dev_priv->chipset < 0xa0) {
+ cp_ctx(ctx, offset + 0x50, 1);
+ cp_ctx(ctx, offset + 0x70, 1);
+ } else {
+@@ -924,7 +924,7 @@ nv50_graph_construct_mmio_ddata(struct nouveau_grctx *ctx)
+ dd_emit(ctx, 1, 0); /* 0000007f MULTISAMPLE_SAMPLES_LOG2 */
+ } else {
+ dd_emit(ctx, 1, 0); /* 0000000f MULTISAMPLE_SAMPLES_LOG2 */
+- }
++ }
+ dd_emit(ctx, 1, 0xc); /* 000000ff SEMANTIC_COLOR.BFC0_ID */
+ if (dev_priv->chipset != 0x50)
+ dd_emit(ctx, 1, 0); /* 00000001 SEMANTIC_COLOR.CLMP_EN */
+@@ -1803,9 +1803,7 @@ nv50_graph_construct_gene_unk24xx(struct nouveau_grctx *ctx)
+ xf_emit(ctx, 1, 0); /* 1ff */
+ xf_emit(ctx, 8, 0); /* 0? */
+ xf_emit(ctx, 9, 0); /* ffffffff, 7ff */
+- }
+- else
+- {
++ } else {
+ xf_emit(ctx, 0xc, 0); /* RO */
+ /* SEEK */
+ xf_emit(ctx, 0xe10, 0); /* 190 * 9: 8*ffffffff, 7ff */
+@@ -2836,7 +2834,7 @@ nv50_graph_construct_xfer_tprop(struct nouveau_grctx *ctx)
+ xf_emit(ctx, 1, 1); /* 00000001 DST_LINEAR */
+ if (IS_NVA3F(dev_priv->chipset))
+ xf_emit(ctx, 1, 1); /* 0000001f tesla UNK169C */
+- if(dev_priv->chipset == 0x50)
++ if (dev_priv->chipset == 0x50)
+ xf_emit(ctx, 1, 0); /* ff */
+ else
+ xf_emit(ctx, 3, 0); /* 1, 7, 3ff */
+diff --git a/drivers/gpu/drm/nouveau/nv50_instmem.c b/drivers/gpu/drm/nouveau/nv50_instmem.c
+index e57caa2..fa94973 100644
+--- a/drivers/gpu/drm/nouveau/nv50_instmem.c
++++ b/drivers/gpu/drm/nouveau/nv50_instmem.c
+@@ -300,7 +300,7 @@ nv50_instmem_resume(struct drm_device *dev)
+ }
+
+ struct nv50_gpuobj_node {
+- struct nouveau_vram *vram;
++ struct nouveau_mem *vram;
+ struct nouveau_vma chan_vma;
+ u32 align;
+ };
+diff --git a/drivers/gpu/drm/nouveau/nv50_sor.c b/drivers/gpu/drm/nouveau/nv50_sor.c
+index b4a5ecb..c25c593 100644
+--- a/drivers/gpu/drm/nouveau/nv50_sor.c
++++ b/drivers/gpu/drm/nouveau/nv50_sor.c
+@@ -41,8 +41,7 @@ nv50_sor_disconnect(struct drm_encoder *encoder)
+ {
+ struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
+ struct drm_device *dev = encoder->dev;
+- struct drm_nouveau_private *dev_priv = dev->dev_private;
+- struct nouveau_channel *evo = dev_priv->evo;
++ struct nouveau_channel *evo = nv50_display(dev)->master;
+ int ret;
+
+ if (!nv_encoder->crtc)
+@@ -184,8 +183,7 @@ static void
+ nv50_sor_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
+ struct drm_display_mode *adjusted_mode)
+ {
+- struct drm_nouveau_private *dev_priv = encoder->dev->dev_private;
+- struct nouveau_channel *evo = dev_priv->evo;
++ struct nouveau_channel *evo = nv50_display(encoder->dev)->master;
+ struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
+ struct drm_device *dev = encoder->dev;
+ struct nouveau_crtc *crtc = nouveau_crtc(encoder->crtc);
+diff --git a/drivers/gpu/drm/nouveau/nv50_vm.c b/drivers/gpu/drm/nouveau/nv50_vm.c
+index 6144156..4fd3432 100644
+--- a/drivers/gpu/drm/nouveau/nv50_vm.c
++++ b/drivers/gpu/drm/nouveau/nv50_vm.c
+@@ -31,7 +31,6 @@ void
+ nv50_vm_map_pgt(struct nouveau_gpuobj *pgd, u32 pde,
+ struct nouveau_gpuobj *pgt[2])
+ {
+- struct drm_nouveau_private *dev_priv = pgd->dev->dev_private;
+ u64 phys = 0xdeadcafe00000000ULL;
+ u32 coverage = 0;
+
+@@ -58,10 +57,9 @@ nv50_vm_map_pgt(struct nouveau_gpuobj *pgd, u32 pde,
+ }
+
+ static inline u64
+-nv50_vm_addr(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
+- u64 phys, u32 memtype, u32 target)
++nv50_vm_addr(struct nouveau_vma *vma, u64 phys, u32 memtype, u32 target)
+ {
+- struct drm_nouveau_private *dev_priv = pgt->dev->dev_private;
++ struct drm_nouveau_private *dev_priv = vma->vm->dev->dev_private;
+
+ phys |= 1; /* present */
+ phys |= (u64)memtype << 40;
+@@ -85,12 +83,13 @@ nv50_vm_addr(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
+
+ void
+ nv50_vm_map(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
+- struct nouveau_vram *mem, u32 pte, u32 cnt, u64 phys)
++ struct nouveau_mem *mem, u32 pte, u32 cnt, u64 phys, u64 delta)
+ {
++ u32 comp = (mem->memtype & 0x180) >> 7;
+ u32 block;
+ int i;
+
+- phys = nv50_vm_addr(vma, pgt, phys, mem->memtype, 0);
++ phys = nv50_vm_addr(vma, phys, mem->memtype, 0);
+ pte <<= 3;
+ cnt <<= 3;
+
+@@ -107,6 +106,11 @@ nv50_vm_map(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
+
+ phys += block << (vma->node->type - 3);
+ cnt -= block;
++ if (comp) {
++ u32 tag = mem->tag->start + ((delta >> 16) * comp);
++ offset_h |= (tag << 17);
++ delta += block << (vma->node->type - 3);
++ }
+
+ while (block) {
+ nv_wo32(pgt, pte + 0, offset_l);
+@@ -119,11 +123,11 @@ nv50_vm_map(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
+
+ void
+ nv50_vm_map_sg(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
+- u32 pte, dma_addr_t *list, u32 cnt)
++ struct nouveau_mem *mem, u32 pte, u32 cnt, dma_addr_t *list)
+ {
+ pte <<= 3;
+ while (cnt--) {
+- u64 phys = nv50_vm_addr(vma, pgt, (u64)*list++, 0, 2);
++ u64 phys = nv50_vm_addr(vma, (u64)*list++, mem->memtype, 2);
+ nv_wo32(pgt, pte + 0, lower_32_bits(phys));
+ nv_wo32(pgt, pte + 4, upper_32_bits(phys));
+ pte += 8;
+diff --git a/drivers/gpu/drm/nouveau/nv50_vram.c b/drivers/gpu/drm/nouveau/nv50_vram.c
+index 58e98ad..ffbc3d8 100644
+--- a/drivers/gpu/drm/nouveau/nv50_vram.c
++++ b/drivers/gpu/drm/nouveau/nv50_vram.c
+@@ -48,42 +48,49 @@ nv50_vram_flags_valid(struct drm_device *dev, u32 tile_flags)
+ }
+
+ void
+-nv50_vram_del(struct drm_device *dev, struct nouveau_vram **pvram)
++nv50_vram_del(struct drm_device *dev, struct nouveau_mem **pmem)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+ struct ttm_bo_device *bdev = &dev_priv->ttm.bdev;
+ struct ttm_mem_type_manager *man = &bdev->man[TTM_PL_VRAM];
+ struct nouveau_mm *mm = man->priv;
+ struct nouveau_mm_node *this;
+- struct nouveau_vram *vram;
++ struct nouveau_mem *mem;
+
+- vram = *pvram;
+- *pvram = NULL;
+- if (unlikely(vram == NULL))
++ mem = *pmem;
++ *pmem = NULL;
++ if (unlikely(mem == NULL))
+ return;
+
+ mutex_lock(&mm->mutex);
+- while (!list_empty(&vram->regions)) {
+- this = list_first_entry(&vram->regions, struct nouveau_mm_node, rl_entry);
++ while (!list_empty(&mem->regions)) {
++ this = list_first_entry(&mem->regions, struct nouveau_mm_node, rl_entry);
+
+ list_del(&this->rl_entry);
+ nouveau_mm_put(mm, this);
+ }
++
++ if (mem->tag) {
++ drm_mm_put_block(mem->tag);
++ mem->tag = NULL;
++ }
+ mutex_unlock(&mm->mutex);
+
+- kfree(vram);
++ kfree(mem);
+ }
+
+ int
+ nv50_vram_new(struct drm_device *dev, u64 size, u32 align, u32 size_nc,
+- u32 type, struct nouveau_vram **pvram)
++ u32 memtype, struct nouveau_mem **pmem)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+ struct ttm_bo_device *bdev = &dev_priv->ttm.bdev;
+ struct ttm_mem_type_manager *man = &bdev->man[TTM_PL_VRAM];
+ struct nouveau_mm *mm = man->priv;
+ struct nouveau_mm_node *r;
+- struct nouveau_vram *vram;
++ struct nouveau_mem *mem;
++ int comp = (memtype & 0x300) >> 8;
++ int type = (memtype & 0x07f);
+ int ret;
+
+ if (!types[type])
+@@ -92,32 +99,46 @@ nv50_vram_new(struct drm_device *dev, u64 size, u32 align, u32 size_nc,
+ align >>= 12;
+ size_nc >>= 12;
+
+- vram = kzalloc(sizeof(*vram), GFP_KERNEL);
+- if (!vram)
++ mem = kzalloc(sizeof(*mem), GFP_KERNEL);
++ if (!mem)
+ return -ENOMEM;
+
+- INIT_LIST_HEAD(&vram->regions);
+- vram->dev = dev_priv->dev;
+- vram->memtype = type;
+- vram->size = size;
+-
+ mutex_lock(&mm->mutex);
++ if (comp) {
++ if (align == 16) {
++ struct nouveau_fb_engine *pfb = &dev_priv->engine.fb;
++ int n = (size >> 4) * comp;
++
++ mem->tag = drm_mm_search_free(&pfb->tag_heap, n, 0, 0);
++ if (mem->tag)
++ mem->tag = drm_mm_get_block(mem->tag, n, 0);
++ }
++
++ if (unlikely(!mem->tag))
++ comp = 0;
++ }
++
++ INIT_LIST_HEAD(&mem->regions);
++ mem->dev = dev_priv->dev;
++ mem->memtype = (comp << 7) | type;
++ mem->size = size;
++
+ do {
+ ret = nouveau_mm_get(mm, types[type], size, size_nc, align, &r);
+ if (ret) {
+ mutex_unlock(&mm->mutex);
+- nv50_vram_del(dev, &vram);
++ nv50_vram_del(dev, &mem);
+ return ret;
+ }
+
+- list_add_tail(&r->rl_entry, &vram->regions);
++ list_add_tail(&r->rl_entry, &mem->regions);
+ size -= r->length;
+ } while (size);
+ mutex_unlock(&mm->mutex);
+
+- r = list_first_entry(&vram->regions, struct nouveau_mm_node, rl_entry);
+- vram->offset = (u64)r->offset << 12;
+- *pvram = vram;
++ r = list_first_entry(&mem->regions, struct nouveau_mm_node, rl_entry);
++ mem->offset = (u64)r->offset << 12;
++ *pmem = mem;
+ return 0;
+ }
+
+diff --git a/drivers/gpu/drm/nouveau/nv84_crypt.c b/drivers/gpu/drm/nouveau/nv84_crypt.c
+index ec18ae1..fabc7fd 100644
+--- a/drivers/gpu/drm/nouveau/nv84_crypt.c
++++ b/drivers/gpu/drm/nouveau/nv84_crypt.c
+@@ -136,5 +136,5 @@ nv84_crypt_isr(struct drm_device *dev)
+ nv_wr32(dev, 0x102130, stat);
+ nv_wr32(dev, 0x10200c, 0x10);
+
+- nv50_fb_vm_trap(dev, show, "PCRYPT");
++ nv50_fb_vm_trap(dev, show);
+ }
+diff --git a/drivers/gpu/drm/nouveau/nvc0_fifo.c b/drivers/gpu/drm/nouveau/nvc0_fifo.c
+index e6f92c5..55a4245 100644
+--- a/drivers/gpu/drm/nouveau/nvc0_fifo.c
++++ b/drivers/gpu/drm/nouveau/nvc0_fifo.c
+@@ -116,7 +116,7 @@ nvc0_fifo_create_context(struct nouveau_channel *chan)
+
+ /* allocate vram for control regs, map into polling area */
+ ret = nouveau_bo_new(dev, NULL, 0x1000, 0, TTM_PL_FLAG_VRAM,
+- 0, 0, true, true, &fifoch->user);
++ 0, 0, &fifoch->user);
+ if (ret)
+ goto error;
+
+@@ -355,19 +355,57 @@ nvc0_fifo_init(struct drm_device *dev)
+ }
+
+ struct nouveau_enum nvc0_fifo_fault_unit[] = {
+- { 0, "PGRAPH" },
+- { 3, "PEEPHOLE" },
+- { 4, "BAR1" },
+- { 5, "BAR3" },
+- { 7, "PFIFO" },
++ { 0x00, "PGRAPH" },
++ { 0x03, "PEEPHOLE" },
++ { 0x04, "BAR1" },
++ { 0x05, "BAR3" },
++ { 0x07, "PFIFO" },
++ { 0x10, "PBSP" },
++ { 0x11, "PPPP" },
++ { 0x13, "PCOUNTER" },
++ { 0x14, "PVP" },
++ { 0x15, "PCOPY0" },
++ { 0x16, "PCOPY1" },
++ { 0x17, "PDAEMON" },
+ {}
+ };
+
+ struct nouveau_enum nvc0_fifo_fault_reason[] = {
+- { 0, "PT_NOT_PRESENT" },
+- { 1, "PT_TOO_SHORT" },
+- { 2, "PAGE_NOT_PRESENT" },
+- { 3, "VM_LIMIT_EXCEEDED" },
++ { 0x00, "PT_NOT_PRESENT" },
++ { 0x01, "PT_TOO_SHORT" },
++ { 0x02, "PAGE_NOT_PRESENT" },
++ { 0x03, "VM_LIMIT_EXCEEDED" },
++ { 0x04, "NO_CHANNEL" },
++ { 0x05, "PAGE_SYSTEM_ONLY" },
++ { 0x06, "PAGE_READ_ONLY" },
++ { 0x0a, "COMPRESSED_SYSRAM" },
++ { 0x0c, "INVALID_STORAGE_TYPE" },
++ {}
++};
++
++struct nouveau_enum nvc0_fifo_fault_hubclient[] = {
++ { 0x01, "PCOPY0" },
++ { 0x02, "PCOPY1" },
++ { 0x04, "DISPATCH" },
++ { 0x05, "CTXCTL" },
++ { 0x06, "PFIFO" },
++ { 0x07, "BAR_READ" },
++ { 0x08, "BAR_WRITE" },
++ { 0x0b, "PVP" },
++ { 0x0c, "PPPP" },
++ { 0x0d, "PBSP" },
++ { 0x11, "PCOUNTER" },
++ { 0x12, "PDAEMON" },
++ { 0x14, "CCACHE" },
++ { 0x15, "CCACHE_POST" },
++ {}
++};
++
++struct nouveau_enum nvc0_fifo_fault_gpcclient[] = {
++ { 0x01, "TEX" },
++ { 0x0c, "ESETUP" },
++ { 0x0e, "CTXCTL" },
++ { 0x0f, "PROP" },
+ {}
+ };
+
+@@ -385,12 +423,20 @@ nvc0_fifo_isr_vm_fault(struct drm_device *dev, int unit)
+ u32 valo = nv_rd32(dev, 0x2804 + (unit * 0x10));
+ u32 vahi = nv_rd32(dev, 0x2808 + (unit * 0x10));
+ u32 stat = nv_rd32(dev, 0x280c + (unit * 0x10));
++ u32 client = (stat & 0x00001f00) >> 8;
+
+ NV_INFO(dev, "PFIFO: %s fault at 0x%010llx [",
+ (stat & 0x00000080) ? "write" : "read", (u64)vahi << 32 | valo);
+ nouveau_enum_print(nvc0_fifo_fault_reason, stat & 0x0000000f);
+ printk("] from ");
+ nouveau_enum_print(nvc0_fifo_fault_unit, unit);
++ if (stat & 0x00000040) {
++ printk("/");
++ nouveau_enum_print(nvc0_fifo_fault_hubclient, client);
++ } else {
++ printk("/GPC%d/", (stat & 0x1f000000) >> 24);
++ nouveau_enum_print(nvc0_fifo_fault_gpcclient, client);
++ }
+ printk(" on channel 0x%010llx\n", (u64)inst << 12);
+ }
+
+@@ -418,6 +464,12 @@ nvc0_fifo_isr(struct drm_device *dev)
+ {
+ u32 stat = nv_rd32(dev, 0x002100);
+
++ if (stat & 0x00000100) {
++ NV_INFO(dev, "PFIFO: unknown status 0x00000100\n");
++ nv_wr32(dev, 0x002100, 0x00000100);
++ stat &= ~0x00000100;
++ }
++
+ if (stat & 0x10000000) {
+ u32 units = nv_rd32(dev, 0x00259c);
+ u32 u = units;
+@@ -446,10 +498,15 @@ nvc0_fifo_isr(struct drm_device *dev)
+ stat &= ~0x20000000;
+ }
+
++ if (stat & 0x40000000) {
++ NV_INFO(dev, "PFIFO: unknown status 0x40000000\n");
++ nv_mask(dev, 0x002a00, 0x00000000, 0x00000000);
++ stat &= ~0x40000000;
++ }
++
+ if (stat) {
+ NV_INFO(dev, "PFIFO: unhandled status 0x%08x\n", stat);
+ nv_wr32(dev, 0x002100, stat);
++ nv_wr32(dev, 0x002140, 0);
+ }
+-
+- nv_wr32(dev, 0x2140, 0);
+ }
+diff --git a/drivers/gpu/drm/nouveau/nvc0_graph.c b/drivers/gpu/drm/nouveau/nvc0_graph.c
+index eb18a7e..68f5c3f 100644
+--- a/drivers/gpu/drm/nouveau/nvc0_graph.c
++++ b/drivers/gpu/drm/nouveau/nvc0_graph.c
+@@ -200,15 +200,15 @@ nvc0_graph_create_context(struct nouveau_channel *chan)
+ for (i = 0; i < priv->grctx_size; i += 4)
+ nv_wo32(grctx, i, priv->grctx_vals[i / 4]);
+
+- nv_wo32(grctx, 0xf4, 0);
+- nv_wo32(grctx, 0xf8, 0);
+- nv_wo32(grctx, 0x10, grch->mmio_nr);
+- nv_wo32(grctx, 0x14, lower_32_bits(grch->mmio->vinst));
+- nv_wo32(grctx, 0x18, upper_32_bits(grch->mmio->vinst));
+- nv_wo32(grctx, 0x1c, 1);
+- nv_wo32(grctx, 0x20, 0);
+- nv_wo32(grctx, 0x28, 0);
+- nv_wo32(grctx, 0x2c, 0);
++ nv_wo32(grctx, 0xf4, 0);
++ nv_wo32(grctx, 0xf8, 0);
++ nv_wo32(grctx, 0x10, grch->mmio_nr);
++ nv_wo32(grctx, 0x14, lower_32_bits(grch->mmio->vinst));
++ nv_wo32(grctx, 0x18, upper_32_bits(grch->mmio->vinst));
++ nv_wo32(grctx, 0x1c, 1);
++ nv_wo32(grctx, 0x20, 0);
++ nv_wo32(grctx, 0x28, 0);
++ nv_wo32(grctx, 0x2c, 0);
+ pinstmem->flush(dev);
+ return 0;
+
+@@ -299,6 +299,14 @@ nvc0_graph_takedown(struct drm_device *dev)
+ }
+
+ static int
++nvc0_graph_mthd_page_flip(struct nouveau_channel *chan,
++ u32 class, u32 mthd, u32 data)
++{
++ nouveau_finish_page_flip(chan, NULL);
++ return 0;
++}
++
++static int
+ nvc0_graph_create(struct drm_device *dev)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+@@ -395,6 +403,7 @@ nvc0_graph_create(struct drm_device *dev)
+ nouveau_irq_register(dev, 25, nvc0_runk140_isr);
+ NVOBJ_CLASS(dev, 0x902d, GR); /* 2D */
+ NVOBJ_CLASS(dev, 0x9039, GR); /* M2MF */
++ NVOBJ_MTHD (dev, 0x9039, 0x0500, nvc0_graph_mthd_page_flip);
+ NVOBJ_CLASS(dev, 0x9097, GR); /* 3D */
+ NVOBJ_CLASS(dev, 0x90c0, GR); /* COMPUTE */
+ return 0;
+@@ -443,28 +452,30 @@ nvc0_graph_init_gpc_0(struct drm_device *dev)
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+ struct nvc0_graph_priv *priv = dev_priv->engine.graph.priv;
+ int gpc;
+-
+- // TP ROP UNKVAL(magic_not_rop_nr)
+- // 450: 4/0/0/0 2 3
+- // 460: 3/4/0/0 4 1
+- // 465: 3/4/4/0 4 7
+- // 470: 3/3/4/4 5 5
+- // 480: 3/4/4/4 6 6
+-
+- // magicgpc918
+- // 450: 00200000 00000000001000000000000000000000
+- // 460: 00124925 00000000000100100100100100100101
+- // 465: 000ba2e9 00000000000010111010001011101001
+- // 470: 00092493 00000000000010010010010010010011
+- // 480: 00088889 00000000000010001000100010001001
+-
+- /* filled values up to tp_total, remainder 0 */
+- // 450: 00003210 00000000 00000000 00000000
+- // 460: 02321100 00000000 00000000 00000000
+- // 465: 22111000 00000233 00000000 00000000
+- // 470: 11110000 00233222 00000000 00000000
+- // 480: 11110000 03332222 00000000 00000000
+-
++
++ /*
++ * TP ROP UNKVAL(magic_not_rop_nr)
++ * 450: 4/0/0/0 2 3
++ * 460: 3/4/0/0 4 1
++ * 465: 3/4/4/0 4 7
++ * 470: 3/3/4/4 5 5
++ * 480: 3/4/4/4 6 6
++
++ * magicgpc918
++ * 450: 00200000 00000000001000000000000000000000
++ * 460: 00124925 00000000000100100100100100100101
++ * 465: 000ba2e9 00000000000010111010001011101001
++ * 470: 00092493 00000000000010010010010010010011
++ * 480: 00088889 00000000000010001000100010001001
++
++ * filled values up to tp_total, remainder 0
++ * 450: 00003210 00000000 00000000 00000000
++ * 460: 02321100 00000000 00000000 00000000
++ * 465: 22111000 00000233 00000000 00000000
++ * 470: 11110000 00233222 00000000 00000000
++ * 480: 11110000 03332222 00000000 00000000
++ */
++
+ nv_wr32(dev, GPC_BCAST(0x0980), priv->magicgpc980[0]);
+ nv_wr32(dev, GPC_BCAST(0x0984), priv->magicgpc980[1]);
+ nv_wr32(dev, GPC_BCAST(0x0988), priv->magicgpc980[2]);
+@@ -640,7 +651,6 @@ nvc0_graph_init(struct drm_device *dev)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+ struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
+- struct nvc0_graph_priv *priv;
+ int ret;
+
+ dev_priv->engine.graph.accel_blocked = true;
+@@ -665,13 +675,12 @@ nvc0_graph_init(struct drm_device *dev)
+ if (ret)
+ return ret;
+ }
+- priv = pgraph->priv;
+
+ nvc0_graph_init_obj418880(dev);
+ nvc0_graph_init_regs(dev);
+- //nvc0_graph_init_unitplemented_magics(dev);
++ /*nvc0_graph_init_unitplemented_magics(dev);*/
+ nvc0_graph_init_gpc_0(dev);
+- //nvc0_graph_init_unitplemented_c242(dev);
++ /*nvc0_graph_init_unitplemented_c242(dev);*/
+
+ nv_wr32(dev, 0x400500, 0x00010001);
+ nv_wr32(dev, 0x400100, 0xffffffff);
+@@ -730,9 +739,12 @@ nvc0_graph_isr(struct drm_device *dev)
+ u32 class = nv_rd32(dev, 0x404200 + (subc * 4));
+
+ if (stat & 0x00000010) {
+- NV_INFO(dev, "PGRAPH: ILLEGAL_MTHD ch %d [0x%010llx] subc %d "
+- "class 0x%04x mthd 0x%04x data 0x%08x\n",
+- chid, inst, subc, class, mthd, data);
++ if (nouveau_gpuobj_mthd_call2(dev, chid, class, mthd, data)) {
++ NV_INFO(dev, "PGRAPH: ILLEGAL_MTHD ch %d [0x%010llx] "
++ "subc %d class 0x%04x mthd 0x%04x "
++ "data 0x%08x\n",
++ chid, inst, subc, class, mthd, data);
++ }
+ nv_wr32(dev, 0x400100, 0x00000010);
+ stat &= ~0x00000010;
+ }
+diff --git a/drivers/gpu/drm/nouveau/nvc0_graph.h b/drivers/gpu/drm/nouveau/nvc0_graph.h
+index 40e26f9..d32b385 100644
+--- a/drivers/gpu/drm/nouveau/nvc0_graph.h
++++ b/drivers/gpu/drm/nouveau/nvc0_graph.h
+@@ -28,11 +28,11 @@
+ #define GPC_MAX 4
+ #define TP_MAX 32
+
+-#define ROP_BCAST(r) (0x408800 + (r))
+-#define ROP_UNIT(u,r) (0x410000 + (u) * 0x400 + (r))
+-#define GPC_BCAST(r) (0x418000 + (r))
+-#define GPC_UNIT(t,r) (0x500000 + (t) * 0x8000 + (r))
+-#define TP_UNIT(t,m,r) (0x504000 + (t) * 0x8000 + (m) * 0x800 + (r))
++#define ROP_BCAST(r) (0x408800 + (r))
++#define ROP_UNIT(u, r) (0x410000 + (u) * 0x400 + (r))
++#define GPC_BCAST(r) (0x418000 + (r))
++#define GPC_UNIT(t, r) (0x500000 + (t) * 0x8000 + (r))
++#define TP_UNIT(t, m, r) (0x504000 + (t) * 0x8000 + (m) * 0x800 + (r))
+
+ struct nvc0_graph_priv {
+ u8 gpc_nr;
+@@ -52,9 +52,9 @@ struct nvc0_graph_priv {
+
+ struct nvc0_graph_chan {
+ struct nouveau_gpuobj *grctx;
+- struct nouveau_gpuobj *unk408004; // 0x418810 too
+- struct nouveau_gpuobj *unk40800c; // 0x419004 too
+- struct nouveau_gpuobj *unk418810; // 0x419848 too
++ struct nouveau_gpuobj *unk408004; /* 0x418810 too */
++ struct nouveau_gpuobj *unk40800c; /* 0x419004 too */
++ struct nouveau_gpuobj *unk418810; /* 0x419848 too */
+ struct nouveau_gpuobj *mmio;
+ int mmio_nr;
+ };
+diff --git a/drivers/gpu/drm/nouveau/nvc0_grctx.c b/drivers/gpu/drm/nouveau/nvc0_grctx.c
+index f880ff7..6cede9f 100644
+--- a/drivers/gpu/drm/nouveau/nvc0_grctx.c
++++ b/drivers/gpu/drm/nouveau/nvc0_grctx.c
+@@ -1623,7 +1623,7 @@ nvc0_grctx_generate_rop(struct drm_device *dev)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+
+- // ROPC_BROADCAST
++ /* ROPC_BROADCAST */
+ nv_wr32(dev, 0x408800, 0x02802a3c);
+ nv_wr32(dev, 0x408804, 0x00000040);
+ nv_wr32(dev, 0x408808, 0x0003e00d);
+@@ -1647,7 +1647,7 @@ nvc0_grctx_generate_gpc(struct drm_device *dev)
+ {
+ int i;
+
+- // GPC_BROADCAST
++ /* GPC_BROADCAST */
+ nv_wr32(dev, 0x418380, 0x00000016);
+ nv_wr32(dev, 0x418400, 0x38004e00);
+ nv_wr32(dev, 0x418404, 0x71e0ffff);
+@@ -1728,7 +1728,7 @@ nvc0_grctx_generate_tp(struct drm_device *dev)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+
+- // GPC_BROADCAST.TP_BROADCAST
++ /* GPC_BROADCAST.TP_BROADCAST */
+ nv_wr32(dev, 0x419848, 0x00000000);
+ nv_wr32(dev, 0x419864, 0x0000012a);
+ nv_wr32(dev, 0x419888, 0x00000000);
+@@ -1741,7 +1741,7 @@ nvc0_grctx_generate_tp(struct drm_device *dev)
+ nv_wr32(dev, 0x419a1c, 0x00000000);
+ nv_wr32(dev, 0x419a20, 0x00000800);
+ if (dev_priv->chipset != 0xc0)
+- nv_wr32(dev, 0x00419ac4, 0x0007f440); // 0xc3
++ nv_wr32(dev, 0x00419ac4, 0x0007f440); /* 0xc3 */
+ nv_wr32(dev, 0x419b00, 0x0a418820);
+ nv_wr32(dev, 0x419b04, 0x062080e6);
+ nv_wr32(dev, 0x419b08, 0x020398a4);
+@@ -1912,13 +1912,13 @@ nvc0_grctx_generate(struct nouveau_channel *chan)
+ for (i = 1; i < 7; i++)
+ data2[1] |= ((1 << (i + 5)) % ntpcv) << ((i - 1) * 5);
+
+- // GPC_BROADCAST
++ /* GPC_BROADCAST */
+ nv_wr32(dev, 0x418bb8, (priv->tp_total << 8) |
+ priv->magic_not_rop_nr);
+ for (i = 0; i < 6; i++)
+ nv_wr32(dev, 0x418b08 + (i * 4), data[i]);
+
+- // GPC_BROADCAST.TP_BROADCAST
++ /* GPC_BROADCAST.TP_BROADCAST */
+ nv_wr32(dev, 0x419bd0, (priv->tp_total << 8) |
+ priv->magic_not_rop_nr |
+ data2[0]);
+@@ -1926,7 +1926,7 @@ nvc0_grctx_generate(struct nouveau_channel *chan)
+ for (i = 0; i < 6; i++)
+ nv_wr32(dev, 0x419b00 + (i * 4), data[i]);
+
+- // UNK78xx
++ /* UNK78xx */
+ nv_wr32(dev, 0x4078bc, (priv->tp_total << 8) |
+ priv->magic_not_rop_nr);
+ for (i = 0; i < 6; i++)
+@@ -1944,7 +1944,7 @@ nvc0_grctx_generate(struct nouveau_channel *chan)
+ gpc = -1;
+ for (i = 0, gpc = -1; i < 32; i++) {
+ int ltp = i * (priv->tp_total - 1) / 32;
+-
++
+ do {
+ gpc = (gpc + 1) % priv->gpc_nr;
+ } while (!tpnr[gpc]);
+diff --git a/drivers/gpu/drm/nouveau/nvc0_vm.c b/drivers/gpu/drm/nouveau/nvc0_vm.c
+index e4e83c2..69af0ba 100644
+--- a/drivers/gpu/drm/nouveau/nvc0_vm.c
++++ b/drivers/gpu/drm/nouveau/nvc0_vm.c
+@@ -59,7 +59,7 @@ nvc0_vm_addr(struct nouveau_vma *vma, u64 phys, u32 memtype, u32 target)
+
+ void
+ nvc0_vm_map(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
+- struct nouveau_vram *mem, u32 pte, u32 cnt, u64 phys)
++ struct nouveau_mem *mem, u32 pte, u32 cnt, u64 phys, u64 delta)
+ {
+ u32 next = 1 << (vma->node->type - 8);
+
+@@ -75,11 +75,11 @@ nvc0_vm_map(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
+
+ void
+ nvc0_vm_map_sg(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
+- u32 pte, dma_addr_t *list, u32 cnt)
++ struct nouveau_mem *mem, u32 pte, u32 cnt, dma_addr_t *list)
+ {
+ pte <<= 3;
+ while (cnt--) {
+- u64 phys = nvc0_vm_addr(vma, *list++, 0, 5);
++ u64 phys = nvc0_vm_addr(vma, *list++, mem->memtype, 5);
+ nv_wo32(pgt, pte + 0, lower_32_bits(phys));
+ nv_wo32(pgt, pte + 4, upper_32_bits(phys));
+ pte += 8;
+diff --git a/drivers/gpu/drm/nouveau/nvc0_vram.c b/drivers/gpu/drm/nouveau/nvc0_vram.c
+index 858eda5..67c6ec6 100644
+--- a/drivers/gpu/drm/nouveau/nvc0_vram.c
++++ b/drivers/gpu/drm/nouveau/nvc0_vram.c
+@@ -26,64 +26,78 @@
+ #include "nouveau_drv.h"
+ #include "nouveau_mm.h"
+
++/* 0 = unsupported
++ * 1 = non-compressed
++ * 3 = compressed
++ */
++static const u8 types[256] = {
++ 1, 1, 3, 3, 3, 3, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0,
++ 0, 1, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3,
++ 3, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 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, 1, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 1, 1, 1, 1, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 3, 3, 3, 3, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3,
++ 3, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 3, 0, 3,
++ 3, 0, 3, 3, 3, 3, 3, 0, 0, 3, 0, 3, 0, 3, 3, 0,
++ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 1, 1, 0
++};
++
+ bool
+ nvc0_vram_flags_valid(struct drm_device *dev, u32 tile_flags)
+ {
+- switch (tile_flags & NOUVEAU_GEM_TILE_LAYOUT_MASK) {
+- case 0x0000:
+- case 0xfe00:
+- case 0xdb00:
+- case 0x1100:
+- return true;
+- default:
+- break;
+- }
+-
+- return false;
++ u8 memtype = (tile_flags & NOUVEAU_GEM_TILE_LAYOUT_MASK) >> 8;
++ return likely((types[memtype] == 1));
+ }
+
+ int
+ nvc0_vram_new(struct drm_device *dev, u64 size, u32 align, u32 ncmin,
+- u32 type, struct nouveau_vram **pvram)
++ u32 type, struct nouveau_mem **pmem)
+ {
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+ struct ttm_bo_device *bdev = &dev_priv->ttm.bdev;
+ struct ttm_mem_type_manager *man = &bdev->man[TTM_PL_VRAM];
+ struct nouveau_mm *mm = man->priv;
+ struct nouveau_mm_node *r;
+- struct nouveau_vram *vram;
++ struct nouveau_mem *mem;
+ int ret;
+
+ size >>= 12;
+ align >>= 12;
+ ncmin >>= 12;
+
+- vram = kzalloc(sizeof(*vram), GFP_KERNEL);
+- if (!vram)
++ mem = kzalloc(sizeof(*mem), GFP_KERNEL);
++ if (!mem)
+ return -ENOMEM;
+
+- INIT_LIST_HEAD(&vram->regions);
+- vram->dev = dev_priv->dev;
+- vram->memtype = type;
+- vram->size = size;
++ INIT_LIST_HEAD(&mem->regions);
++ mem->dev = dev_priv->dev;
++ mem->memtype = (type & 0xff);
++ mem->size = size;
+
+ mutex_lock(&mm->mutex);
+ do {
+ ret = nouveau_mm_get(mm, 1, size, ncmin, align, &r);
+ if (ret) {
+ mutex_unlock(&mm->mutex);
+- nv50_vram_del(dev, &vram);
++ nv50_vram_del(dev, &mem);
+ return ret;
+ }
+
+- list_add_tail(&r->rl_entry, &vram->regions);
++ list_add_tail(&r->rl_entry, &mem->regions);
+ size -= r->length;
+ } while (size);
+ mutex_unlock(&mm->mutex);
+
+- r = list_first_entry(&vram->regions, struct nouveau_mm_node, rl_entry);
+- vram->offset = (u64)r->offset << 12;
+- *pvram = vram;
++ r = list_first_entry(&mem->regions, struct nouveau_mm_node, rl_entry);
++ mem->offset = (u64)r->offset << 12;
++ *pmem = mem;
+ return 0;
+ }
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-radeon-fix-regression-on-atom-cards-with-hardcoded-EDID-record.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-radeon-fix-regression-on-atom-cards-with-hardcoded-EDID-record.patch
new file mode 100644
index 000000000..217e29d76
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-radeon-fix-regression-on-atom-cards-with-hardcoded-EDID-record.patch
@@ -0,0 +1,56 @@
+From linux-kernel-owner@vger.kernel.org Thu May 5 20:17:19 2011
+Date: Thu, 05 May 2011 17:10:51 -0700
+From: Greg KH <gregkh@suse.de>
+To: linux-kernel@vger.kernel.org, stable@kernel.org
+Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
+ akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
+ Dave Airlie <airlied@redhat.com>
+Subject: [patch 19/38] drm/radeon: fix regression on atom cards with hardcoded EDID record.
+In-Reply-To: <20110506001225.GA10547@kroah.com>
+X-Mailing-List: linux-kernel@vger.kernel.org
+
+2.6.38-stable review patch. If anyone has any objections, please let us know.
+
+------------------
+
+From: Dave Airlie <airlied@redhat.com>
+
+commit eaa4f5e1d0b816291a59a47917e569c0384f2b6f upstream.
+
+Since fafcf94e2b5732d1e13b440291c53115d2b172e9 introduced an edid size, it seems to have broken this path.
+
+This manifest as oops on T500 Lenovo laptops with dual graphics primarily.
+
+Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=33812
+
+Reviewed-by: Alex Deucher <alexdeucher@gmail.com>
+Signed-off-by: Dave Airlie <airlied@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/gpu/drm/radeon/radeon_atombios.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+--- a/drivers/gpu/drm/radeon/radeon_atombios.c
++++ b/drivers/gpu/drm/radeon/radeon_atombios.c
+@@ -1599,9 +1599,10 @@ struct radeon_encoder_atom_dig *radeon_a
+ memcpy((u8 *)edid, (u8 *)&fake_edid_record->ucFakeEDIDString[0],
+ fake_edid_record->ucFakeEDIDLength);
+
+- if (drm_edid_is_valid(edid))
++ if (drm_edid_is_valid(edid)) {
+ rdev->mode_info.bios_hardcoded_edid = edid;
+- else
++ rdev->mode_info.bios_hardcoded_edid_size = edid_size;
++ } else
+ kfree(edid);
+ }
+ }
+
+
+--
+To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
+the body of a message to majordomo@vger.kernel.org
+More majordomo info at http://vger.kernel.org/majordomo-info.html
+Please read the FAQ at http://www.tux.org/lkml/
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-radeon-update.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-radeon-update.patch
new file mode 100644
index 000000000..c516e6680
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-radeon-update.patch
@@ -0,0 +1,4829 @@
+Deblobbed.
+
+* drivers/gpu/drm/radeon/ni.c: Deblobbed. Adjusted.
+* drivers/gpu/drm/radeon/r600.c: Adjusted.
+
+commit 6d7f810bacd0fc2cf3966ec5d756a23735cb781e
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Tue May 3 19:28:02 2011 -0400
+
+ drm/radeon/kms: fix gart setup on fusion parts (v2)
+
+ Out of the entire GART/VM subsystem, the hw designers changed
+ the location of 3 regs.
+
+ v2: airlied: add parameter for userspace to work from.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Jerome Glisse <jglisse@redhat.com>
+ Cc: stable@kernel.org
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 00a99cbeca8ffb6d6165f388230ad49786a1a64e
+Author: Dave Airlie <airlied@redhat.com>
+Date: Sun May 1 20:16:30 2011 +1000
+
+ drm/radeon: fix regression on atom cards with hardcoded EDID record.
+
+ Since fafcf94e2b5732d1e13b440291c53115d2b172e9 introduced an edid size, it seems to have broken this path.
+
+ This manifest as oops on T500 Lenovo laptops with dual graphics primarily.
+
+ Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=33812
+
+ cc: stable@kernel.org
+ Reviewed-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit ea9254cde5e773424d3af177012ab8019a9a1664
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Tue Apr 26 13:27:43 2011 -0400
+
+ drm/radeon/kms: add info query for tile pipes
+
+ needed by mesa for htile setup.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 5ac5da9419c4b51efa17ef222b0ac82d1af63af8
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Tue Apr 26 13:10:20 2011 -0400
+
+ drm/radeon/kms: add missing safe regs for 6xx/7xx
+
+ needed for HiS in mesa.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 7ad87e13c92ac772cc1eced43df0555ec4a71bbc
+Author: Cédric Cano <ccano@interfaceconcept.com>
+Date: Tue Apr 19 11:07:13 2011 -0400
+
+ drm/radeon/kms: fix IH writeback on r6xx+ on big endian machines
+
+ agd5f: fix commit message.
+
+ Signed-off-by: Cedric Cano <ccano@interfaceconcept.com>
+ Reviewed-by: Michel Dänzer <michel@daenzer.net>
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 10045c9e73dfa9e53fb429c6d5b1a2261da0ad51
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Thu Apr 14 19:07:34 2011 -0400
+
+ drm/radeon/kms: adjust evergreen display watermark setup
+
+ This patch fixes two issues:
+ - A disabled crtc does not use any lb, so return 0 for
+ lb size. This makes the display priority calculation
+ more exact.
+ - Only use 1/2 and whole lb partitions. Using smaller
+ partitions can cause underflow to one of the displays
+ if you have multiple large displays on the same lb.
+
+ Fixes:
+ https://bugs.freedesktop.org/show_bug.cgi?id=34534
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit ea7537dfbe693d8a0d9a3f8dc040fea8d74db625
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Tue Apr 12 14:49:24 2011 -0400
+
+ drm/radeon/kms: properly program vddci on evergreen+
+
+ Change vddci as well as vddc when changing power modes
+ on evergreen/ni. Also, properly set vddci on boot up
+ for ni cards. The vbios only sets the limited clocks
+ and voltages on boot until the mc ucode is loaded. This
+ should fix stability problems on some btc cards.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit d45b8c22db23566ec99d330afe69ca0eb99877e3
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Tue Apr 12 14:49:23 2011 -0400
+
+ drm/radeon/kms: add voltage type to atom set voltage function
+
+ This is needed for setting voltages other than vddc.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit ced08b02a89170bfcb0a7cff2b89000fce712efa
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Tue Apr 12 13:40:18 2011 -0400
+
+ drm/radeon/kms: fix pcie_p callbacks on btc and cayman
+
+ btc and cayman asics use the same callback for
+ pcie port registers.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 7e2f10779d1b11b9dc086d95dada8f2d441fcb7c
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Sat Apr 2 09:15:50 2011 -0400
+
+ drm/radeon/kms: pageflipping cleanup for avivo+
+
+ Avoid touching the flip setup regs while
+ acceleration is running. Set them at modeset
+ rather than during pageflip. Touching these
+ regs while acceleration is active caused hangs
+ on pre-avivo chips. These chips do not seem
+ to be affected, but better safe than sorry,
+ plus it avoids repeatedly reprogramming the
+ regs every flip.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit c079101fc0747d6924edf6b476793267c8707731
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Sat Apr 2 09:09:08 2011 -0400
+
+ drm/radeon/kms: Add support for tv-out dongle on G5 9600
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 80b359eb082c7e84c9ee970a98578dd409211f52
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Wed Mar 2 10:21:05 2011 -0500
+
+ drm/radeon/kms: allow max clock of 340 Mhz on hdmi 1.3+
+
+ hdmi 1.3 raises the max clock from 165 Mhz to 340 Mhz.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 4b77fd7824c73fd19a06b3942f498eb23740826d
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Wed Mar 2 20:07:40 2011 -0500
+
+ drm/radeon/kms: cayman/evergreen cs checker updates
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 8f62b708e5f4a3e7b617fa7e5ddd9e9becf85920
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Wed Mar 2 20:07:39 2011 -0500
+
+ drm/radeon/kms/cayman: always set certain VGT regs at CP init
+
+ These should be handled by the clear_state setup, but set them
+ directly as well just to be sure.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 25bfa1ee008f6d8871dd71c529ba25f6492e6b27
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Wed Mar 2 20:07:38 2011 -0500
+
+ drm/radeon/kms: additional default context regs for cayman
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 65a9c7094637d67ffec51dc7373c53f1e4836b79
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Wed Mar 2 20:07:37 2011 -0500
+
+ drm/radeon/kms: add cayman CS check support
+
+ Added to existing evergreen CS checker.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 4655de2aadf3ef4d885600214f8bf989e35087fb
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Wed Mar 2 20:07:36 2011 -0500
+
+ drm/radeon/kms: add radeon_asic entry for cayman
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 6110f1c930fa057a0380cbf786350dbd01e9dab9
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Wed Mar 2 20:07:35 2011 -0500
+
+ drm/radeon/kms: add cayman safe regs
+
+ For the CS checker.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit f0c8c61d41e93b1b616b5eb5d29b1bdccb50b6ec
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Wed Mar 2 20:07:34 2011 -0500
+
+ drm/radeon/kms/cayman: add asic init/startup/fini/suspend/resume functions
+
+ Cayman is different enough from evergreen to warrant it's own functions.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit f772bd94e036bf8809359b4e37c1aa2ec2dcf4f3
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Wed Mar 2 20:07:33 2011 -0500
+
+ drm/radeon/kms: add cayman asic reset support
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit f83146d1532f80351e8b08ae6063d5792e56914f
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Wed Mar 2 20:07:32 2011 -0500
+
+ drm/radeon/kms: add support for cayman irqs
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 004e9f16d1a0dbf2a8787f64b70e8bb3b86abe21
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Wed Mar 2 20:07:31 2011 -0500
+
+ drm/radeon/kms: add support for CP setup on cayman asics
+
+ Cayman asics have 3 ring buffers:
+ ring 0 supports both gfx and compute
+ rings 1 and 2 are compute only
+
+ At the moment we only support ring 0.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 5ca642f168996cd6f1dda99ffb17855cc65e493e
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Wed Mar 2 20:07:30 2011 -0500
+
+ drm/radeon/kms: add support for cayman gart setup
+
+ This patch sets up the gart in legacy mode. We
+ probably want to switch to full VM mode at some point.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 8e72474ace85f7a13c88dc360cbfc28dc2fe67e5
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Wed Mar 2 20:07:29 2011 -0500
+
+ drm/radeon/kms: add gpu_init function for cayman
+
+ This may some work to get accel going.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 5b22a85481f452a23dd625e9a389d8f5c0f9b269
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Wed Mar 2 20:07:28 2011 -0500
+
+ drm/radeon/kms: add ucode loader for cayman
+
+ The MC ucode is no longer loaded by the vbios
+ tables as on previous asics. It now must be loaded
+ by the driver.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 11fa70b2e7022d25933fc1d17518aeb054752dc9
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Wed Mar 2 20:07:27 2011 -0500
+
+ drm/radeon/kms: add cayman chip family
+
+ Cayman is DCE5 display plus a new 4-way shader block.
+ 3D state programming is similar to evergreen.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit fe4608d030a121d61dfbc7a80c57706b89fbdabd
+Author: Dave Airlie <airlied@redhat.com>
+Date: Tue Mar 1 14:32:27 2011 +1000
+
+ drm/radeon: add new getparam for number of backends.
+
+ This allows userspace to work out how many DBs there are
+ for conditional rendering to work.
+
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit cd3e8f6393bce904aad911b8c261e14d5201d347
+Author: Dave Airlie <airlied@redhat.com>
+Date: Tue Mar 1 12:10:43 2011 +1000
+
+ drm/radeon: bump version to 2.9
+
+ This lets r600g enable texture formats and some more extensions.
+
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 7855f7a2d8095e04916a097d14cad09c85ebf08a
+Author: Dave Airlie <airlied@redhat.com>
+Date: Mon Feb 28 16:11:48 2011 +1000
+
+ drm/r600: parse the set predication command. (v2)
+
+ This is required for NV_conditional_render and EXT_transform_feedback.
+
+ v2: add evergreen support.
+
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 85d824cf58fec0921e4e559cd91dbea50cb7bc20
+Author: Dave Airlie <airlied@redhat.com>
+Date: Mon Feb 28 14:27:03 2011 +1000
+
+ drm/radeon: make sure ib reads are in-order.
+
+ have to read values from the IB in order as we could cross
+ a page boundary at any time and won't be able to go backwards.
+
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit a3f1872b53f046631f48faf19e932f6c9b020446
+Author: Dan Carpenter <error27@gmail.com>
+Date: Sat Feb 26 04:48:18 2011 +0300
+
+ drm/radeon/r600_cs: off by one errors
+
+ There are a bunch of off by one errors in the sanity checks here.
+
+ Signed-off-by: Dan Carpenter <error27@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 6c23a39f630acd5c792b731372f5fa227009c7ee
+Author: Dave Airlie <airlied@redhat.com>
+Date: Fri Feb 18 05:51:58 2011 +0000
+
+ drm/radeon: overhaul texture checking. (v3)
+
+ the texture checking code didn't work for block formats like s3tc,
+ this overhauls it to work for all types.
+
+ v2: add texture array support.
+ v3: add subsampled formats
+
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+diff --git a/drivers/gpu/drm/radeon/Makefile b/drivers/gpu/drm/radeon/Makefile
+index e47eecf..3896ef8 100644
+--- a/drivers/gpu/drm/radeon/Makefile
++++ b/drivers/gpu/drm/radeon/Makefile
+@@ -36,6 +36,9 @@ $(obj)/r600_reg_safe.h: $(src)/reg_srcs/r600 $(obj)/mkregtable
+ $(obj)/evergreen_reg_safe.h: $(src)/reg_srcs/evergreen $(obj)/mkregtable
+ $(call if_changed,mkregtable)
+
++$(obj)/cayman_reg_safe.h: $(src)/reg_srcs/cayman $(obj)/mkregtable
++ $(call if_changed,mkregtable)
++
+ $(obj)/r100.o: $(obj)/r100_reg_safe.h $(obj)/rn50_reg_safe.h
+
+ $(obj)/r200.o: $(obj)/r200_reg_safe.h
+@@ -50,7 +53,7 @@ $(obj)/rs600.o: $(obj)/rs600_reg_safe.h
+
+ $(obj)/r600_cs.o: $(obj)/r600_reg_safe.h
+
+-$(obj)/evergreen_cs.o: $(obj)/evergreen_reg_safe.h
++$(obj)/evergreen_cs.o: $(obj)/evergreen_reg_safe.h $(obj)/cayman_reg_safe.h
+
+ radeon-y := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o \
+ radeon_irq.o r300_cmdbuf.o r600_cp.o
+@@ -66,7 +69,7 @@ radeon-y += radeon_device.o radeon_asic.o radeon_kms.o \
+ r200.o radeon_legacy_tv.o r600_cs.o r600_blit.o r600_blit_shaders.o \
+ r600_blit_kms.o radeon_pm.o atombios_dp.o r600_audio.o r600_hdmi.o \
+ evergreen.o evergreen_cs.o evergreen_blit_shaders.o evergreen_blit_kms.o \
+- radeon_trace_points.o ni.o
++ radeon_trace_points.o ni.o cayman_blit_shaders.o
+
+ radeon-$(CONFIG_COMPAT) += radeon_ioc32.o
+ radeon-$(CONFIG_VGA_SWITCHEROO) += radeon_atpx_handler.o
+diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
+index bede31c..2bab32f 100644
+--- a/drivers/gpu/drm/radeon/atombios_crtc.c
++++ b/drivers/gpu/drm/radeon/atombios_crtc.c
+@@ -1011,6 +1011,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
+ uint64_t fb_location;
+ uint32_t fb_format, fb_pitch_pixels, tiling_flags;
+ u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE);
++ u32 tmp;
+ int r;
+
+ /* no fb bound */
+@@ -1139,6 +1140,15 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
+ WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset,
+ (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay);
+
++ /* pageflip setup */
++ /* make sure flip is at vb rather than hb */
++ tmp = RREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset);
++ tmp &= ~EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN;
++ WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
++
++ /* set pageflip to happen anywhere in vblank interval */
++ WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0);
++
+ if (!atomic && fb && fb != crtc->fb) {
+ radeon_fb = to_radeon_framebuffer(fb);
+ rbo = radeon_fb->obj->driver_private;
+@@ -1169,6 +1179,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
+ uint64_t fb_location;
+ uint32_t fb_format, fb_pitch_pixels, tiling_flags;
+ u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE;
++ u32 tmp;
+ int r;
+
+ /* no fb bound */
+@@ -1296,6 +1307,15 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
+ WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset,
+ (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay);
+
++ /* pageflip setup */
++ /* make sure flip is at vb rather than hb */
++ tmp = RREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset);
++ tmp &= ~AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN;
++ WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
++
++ /* set pageflip to happen anywhere in vblank interval */
++ WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0);
++
+ if (!atomic && fb && fb != crtc->fb) {
+ radeon_fb = to_radeon_framebuffer(fb);
+ rbo = radeon_fb->obj->driver_private;
+diff --git a/drivers/gpu/drm/radeon/cayman_blit_shaders.c b/drivers/gpu/drm/radeon/cayman_blit_shaders.c
+new file mode 100644
+index 0000000..e148ab0
+--- /dev/null
++++ b/drivers/gpu/drm/radeon/cayman_blit_shaders.c
+@@ -0,0 +1,55 @@
++/*
++ * Copyright 2010 Advanced Micro Devices, Inc.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice (including the next
++ * paragraph) shall be included in all copies or substantial portions of the
++ * Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE COPYRIGHT HOLDER(S) AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
++ * DEALINGS IN THE SOFTWARE.
++ *
++ * Authors:
++ * Alex Deucher <alexander.deucher@amd.com>
++ */
++
++#include <linux/types.h>
++#include <linux/kernel.h>
++
++/*
++ * evergreen cards need to use the 3D engine to blit data which requires
++ * quite a bit of hw state setup. Rather than pull the whole 3D driver
++ * (which normally generates the 3D state) into the DRM, we opt to use
++ * statically generated state tables. The regsiter state and shaders
++ * were hand generated to support blitting functionality. See the 3D
++ * driver or documentation for descriptions of the registers and
++ * shader instructions.
++ */
++
++const u32 cayman_default_state[] =
++{
++ /* XXX fill in additional blit state */
++
++ 0xc0026900,
++ 0x00000316,
++ 0x0000000e, /* VGT_VERTEX_REUSE_BLOCK_CNTL */
++ 0x00000010, /* */
++
++ 0xc0026900,
++ 0x000000d9,
++ 0x00000000, /* CP_RINGID */
++ 0x00000000, /* CP_VMID */
++};
++
++const u32 cayman_default_size = ARRAY_SIZE(cayman_default_state);
+diff --git a/drivers/gpu/drm/radeon/cayman_blit_shaders.h b/drivers/gpu/drm/radeon/cayman_blit_shaders.h
+new file mode 100644
+index 0000000..33b75e5
+--- /dev/null
++++ b/drivers/gpu/drm/radeon/cayman_blit_shaders.h
+@@ -0,0 +1,32 @@
++/*
++ * Copyright 2010 Advanced Micro Devices, Inc.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice (including the next
++ * paragraph) shall be included in all copies or substantial portions of the
++ * Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE COPYRIGHT HOLDER(S) AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
++ * DEALINGS IN THE SOFTWARE.
++ *
++ */
++
++#ifndef CAYMAN_BLIT_SHADERS_H
++#define CAYMAN_BLIT_SHADERS_H
++
++extern const u32 cayman_default_state[];
++
++extern const u32 cayman_default_size;
++
++#endif
+diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
+index 6140ea1..f7e0376 100644
+--- a/drivers/gpu/drm/radeon/evergreen.c
++++ b/drivers/gpu/drm/radeon/evergreen.c
+@@ -43,17 +43,6 @@ static void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
+
+ void evergreen_pre_page_flip(struct radeon_device *rdev, int crtc)
+ {
+- struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc];
+- u32 tmp;
+-
+- /* make sure flip is at vb rather than hb */
+- tmp = RREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset);
+- tmp &= ~EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN;
+- WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
+-
+- /* set pageflip to happen anywhere in vblank interval */
+- WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0);
+-
+ /* enable the pflip int */
+ radeon_irq_kms_pflip_irq_get(rdev, crtc);
+ }
+@@ -131,11 +120,16 @@ void evergreen_pm_misc(struct radeon_device *rdev)
+ struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx];
+ struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
+
+- if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
+- if (voltage->voltage != rdev->pm.current_vddc) {
+- radeon_atom_set_voltage(rdev, voltage->voltage);
++ if (voltage->type == VOLTAGE_SW) {
++ if (voltage->voltage && (voltage->voltage != rdev->pm.current_vddc)) {
++ radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
+ rdev->pm.current_vddc = voltage->voltage;
+- DRM_DEBUG("Setting: v: %d\n", voltage->voltage);
++ DRM_DEBUG("Setting: vddc: %d\n", voltage->voltage);
++ }
++ if (voltage->vddci && (voltage->vddci != rdev->pm.current_vddci)) {
++ radeon_atom_set_voltage(rdev, voltage->vddci, SET_VOLTAGE_TYPE_ASIC_VDDCI);
++ rdev->pm.current_vddci = voltage->vddci;
++ DRM_DEBUG("Setting: vddci: %d\n", voltage->vddci);
+ }
+ }
+ }
+@@ -359,7 +353,7 @@ static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev,
+ struct drm_display_mode *mode,
+ struct drm_display_mode *other_mode)
+ {
+- u32 tmp = 0;
++ u32 tmp;
+ /*
+ * Line Buffer Setup
+ * There are 3 line buffers, each one shared by 2 display controllers.
+@@ -369,64 +363,63 @@ static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev,
+ * first display controller
+ * 0 - first half of lb (3840 * 2)
+ * 1 - first 3/4 of lb (5760 * 2)
+- * 2 - whole lb (7680 * 2)
++ * 2 - whole lb (7680 * 2), other crtc must be disabled
+ * 3 - first 1/4 of lb (1920 * 2)
+ * second display controller
+ * 4 - second half of lb (3840 * 2)
+ * 5 - second 3/4 of lb (5760 * 2)
+- * 6 - whole lb (7680 * 2)
++ * 6 - whole lb (7680 * 2), other crtc must be disabled
+ * 7 - last 1/4 of lb (1920 * 2)
+ */
+- if (mode && other_mode) {
+- if (mode->hdisplay > other_mode->hdisplay) {
+- if (mode->hdisplay > 2560)
+- tmp = 1; /* 3/4 */
+- else
+- tmp = 0; /* 1/2 */
+- } else if (other_mode->hdisplay > mode->hdisplay) {
+- if (other_mode->hdisplay > 2560)
+- tmp = 3; /* 1/4 */
+- else
+- tmp = 0; /* 1/2 */
+- } else
++ /* this can get tricky if we have two large displays on a paired group
++ * of crtcs. Ideally for multiple large displays we'd assign them to
++ * non-linked crtcs for maximum line buffer allocation.
++ */
++ if (radeon_crtc->base.enabled && mode) {
++ if (other_mode)
+ tmp = 0; /* 1/2 */
+- } else if (mode)
+- tmp = 2; /* whole */
+- else if (other_mode)
+- tmp = 3; /* 1/4 */
++ else
++ tmp = 2; /* whole */
++ } else
++ tmp = 0;
+
+ /* second controller of the pair uses second half of the lb */
+ if (radeon_crtc->crtc_id % 2)
+ tmp += 4;
+ WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, tmp);
+
+- switch (tmp) {
+- case 0:
+- case 4:
+- default:
+- if (ASIC_IS_DCE5(rdev))
+- return 4096 * 2;
+- else
+- return 3840 * 2;
+- case 1:
+- case 5:
+- if (ASIC_IS_DCE5(rdev))
+- return 6144 * 2;
+- else
+- return 5760 * 2;
+- case 2:
+- case 6:
+- if (ASIC_IS_DCE5(rdev))
+- return 8192 * 2;
+- else
+- return 7680 * 2;
+- case 3:
+- case 7:
+- if (ASIC_IS_DCE5(rdev))
+- return 2048 * 2;
+- else
+- return 1920 * 2;
++ if (radeon_crtc->base.enabled && mode) {
++ switch (tmp) {
++ case 0:
++ case 4:
++ default:
++ if (ASIC_IS_DCE5(rdev))
++ return 4096 * 2;
++ else
++ return 3840 * 2;
++ case 1:
++ case 5:
++ if (ASIC_IS_DCE5(rdev))
++ return 6144 * 2;
++ else
++ return 5760 * 2;
++ case 2:
++ case 6:
++ if (ASIC_IS_DCE5(rdev))
++ return 8192 * 2;
++ else
++ return 7680 * 2;
++ case 3:
++ case 7:
++ if (ASIC_IS_DCE5(rdev))
++ return 2048 * 2;
++ else
++ return 1920 * 2;
++ }
+ }
++
++ /* controller not enabled, so no lb used */
++ return 0;
+ }
+
+ static u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev)
+@@ -804,7 +797,7 @@ void evergreen_bandwidth_update(struct radeon_device *rdev)
+ }
+ }
+
+-static int evergreen_mc_wait_for_idle(struct radeon_device *rdev)
++int evergreen_mc_wait_for_idle(struct radeon_device *rdev)
+ {
+ unsigned i;
+ u32 tmp;
+@@ -869,9 +862,15 @@ int evergreen_pcie_gart_enable(struct radeon_device *rdev)
+ SYSTEM_ACCESS_MODE_NOT_IN_SYS |
+ SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
+ EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
+- WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
+- WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
+- WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
++ if (rdev->flags & RADEON_IS_IGP) {
++ WREG32(FUS_MC_VM_MD_L1_TLB0_CNTL, tmp);
++ WREG32(FUS_MC_VM_MD_L1_TLB1_CNTL, tmp);
++ WREG32(FUS_MC_VM_MD_L1_TLB2_CNTL, tmp);
++ } else {
++ WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
++ WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
++ WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
++ }
+ WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
+ WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
+ WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
+@@ -957,7 +956,7 @@ void evergreen_agp_enable(struct radeon_device *rdev)
+ WREG32(VM_CONTEXT1_CNTL, 0);
+ }
+
+-static void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save)
++void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save)
+ {
+ save->vga_control[0] = RREG32(D1VGA_CONTROL);
+ save->vga_control[1] = RREG32(D2VGA_CONTROL);
+@@ -1011,7 +1010,7 @@ static void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_sa
+ WREG32(EVERGREEN_D6VGA_CONTROL, 0);
+ }
+
+-static void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save)
++void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save)
+ {
+ WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC0_REGISTER_OFFSET,
+ upper_32_bits(rdev->mc.vram_start));
+@@ -1108,7 +1107,7 @@ static void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_
+ WREG32(VGA_RENDER_CONTROL, save->vga_render_control);
+ }
+
+-static void evergreen_mc_program(struct radeon_device *rdev)
++void evergreen_mc_program(struct radeon_device *rdev)
+ {
+ struct evergreen_mc_save save;
+ u32 tmp;
+@@ -2576,7 +2575,7 @@ void evergreen_irq_disable(struct radeon_device *rdev)
+ evergreen_disable_interrupt_state(rdev);
+ }
+
+-static void evergreen_irq_suspend(struct radeon_device *rdev)
++void evergreen_irq_suspend(struct radeon_device *rdev)
+ {
+ evergreen_irq_disable(rdev);
+ r600_rlc_stop(rdev);
+@@ -2587,7 +2586,7 @@ static inline u32 evergreen_get_ih_wptr(struct radeon_device *rdev)
+ u32 wptr, tmp;
+
+ if (rdev->wb.enabled)
+- wptr = rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4];
++ wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);
+ else
+ wptr = RREG32(IH_RB_WPTR);
+
+@@ -2899,7 +2898,7 @@ static int evergreen_startup(struct radeon_device *rdev)
+ return r;
+ }
+ }
+- r = btc_mc_load_microcode(rdev);
++ r = ni_mc_load_microcode(rdev);
+ if (r) {
+ DRM_ERROR("Failed to load MC firmware!\n");
+ return r;
+@@ -2930,11 +2929,6 @@ static int evergreen_startup(struct radeon_device *rdev)
+ rdev->asic->copy = NULL;
+ dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
+ }
+- /* XXX: ontario has problems blitting to gart at the moment */
+- if (rdev->family == CHIP_PALM) {
+- rdev->asic->copy = NULL;
+- radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
+- }
+
+ /* allocate wb buffer */
+ r = radeon_wb_init(rdev);
+@@ -2981,7 +2975,7 @@ int evergreen_resume(struct radeon_device *rdev)
+
+ r = evergreen_startup(rdev);
+ if (r) {
+- DRM_ERROR("r600 startup failed on resume\n");
++ DRM_ERROR("evergreen startup failed on resume\n");
+ return r;
+ }
+
+@@ -3061,7 +3055,7 @@ int evergreen_init(struct radeon_device *rdev)
+ }
+ /* Must be an ATOMBIOS */
+ if (!rdev->is_atom_bios) {
+- dev_err(rdev->dev, "Expecting atombios for R600 GPU\n");
++ dev_err(rdev->dev, "Expecting atombios for evergreen GPU\n");
+ return -EINVAL;
+ }
+ r = radeon_atombios_init(rdev);
+diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c
+index 345a75a..5e4f9f8 100644
+--- a/drivers/gpu/drm/radeon/evergreen_cs.c
++++ b/drivers/gpu/drm/radeon/evergreen_cs.c
+@@ -29,6 +29,7 @@
+ #include "radeon.h"
+ #include "evergreend.h"
+ #include "evergreen_reg_safe.h"
++#include "cayman_reg_safe.h"
+
+ static int evergreen_cs_packet_next_reloc(struct radeon_cs_parser *p,
+ struct radeon_cs_reloc **cs_reloc);
+@@ -425,18 +426,28 @@ static inline int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u3
+ {
+ struct evergreen_cs_track *track = (struct evergreen_cs_track *)p->track;
+ struct radeon_cs_reloc *reloc;
+- u32 last_reg = ARRAY_SIZE(evergreen_reg_safe_bm);
++ u32 last_reg;
+ u32 m, i, tmp, *ib;
+ int r;
+
++ if (p->rdev->family >= CHIP_CAYMAN)
++ last_reg = ARRAY_SIZE(cayman_reg_safe_bm);
++ else
++ last_reg = ARRAY_SIZE(evergreen_reg_safe_bm);
++
+ i = (reg >> 7);
+ if (i > last_reg) {
+ dev_warn(p->dev, "forbidden register 0x%08x at %d\n", reg, idx);
+ return -EINVAL;
+ }
+ m = 1 << ((reg >> 2) & 31);
+- if (!(evergreen_reg_safe_bm[i] & m))
+- return 0;
++ if (p->rdev->family >= CHIP_CAYMAN) {
++ if (!(cayman_reg_safe_bm[i] & m))
++ return 0;
++ } else {
++ if (!(evergreen_reg_safe_bm[i] & m))
++ return 0;
++ }
+ ib = p->ib->ptr;
+ switch (reg) {
+ /* force following reg to 0 in an attemp to disable out buffer
+@@ -468,12 +479,42 @@ static inline int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u3
+ case SQ_VSTMP_RING_ITEMSIZE:
+ case VGT_TF_RING_SIZE:
+ /* get value to populate the IB don't remove */
+- tmp =radeon_get_ib_value(p, idx);
+- ib[idx] = 0;
++ /*tmp =radeon_get_ib_value(p, idx);
++ ib[idx] = 0;*/
++ break;
++ case SQ_ESGS_RING_BASE:
++ case SQ_GSVS_RING_BASE:
++ case SQ_ESTMP_RING_BASE:
++ case SQ_GSTMP_RING_BASE:
++ case SQ_HSTMP_RING_BASE:
++ case SQ_LSTMP_RING_BASE:
++ case SQ_PSTMP_RING_BASE:
++ case SQ_VSTMP_RING_BASE:
++ r = evergreen_cs_packet_next_reloc(p, &reloc);
++ if (r) {
++ dev_warn(p->dev, "bad SET_CONTEXT_REG "
++ "0x%04X\n", reg);
++ return -EINVAL;
++ }
++ ib[idx] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);
+ break;
+ case DB_DEPTH_CONTROL:
+ track->db_depth_control = radeon_get_ib_value(p, idx);
+ break;
++ case CAYMAN_DB_EQAA:
++ if (p->rdev->family < CHIP_CAYMAN) {
++ dev_warn(p->dev, "bad SET_CONTEXT_REG "
++ "0x%04X\n", reg);
++ return -EINVAL;
++ }
++ break;
++ case CAYMAN_DB_DEPTH_INFO:
++ if (p->rdev->family < CHIP_CAYMAN) {
++ dev_warn(p->dev, "bad SET_CONTEXT_REG "
++ "0x%04X\n", reg);
++ return -EINVAL;
++ }
++ break;
+ case DB_Z_INFO:
+ r = evergreen_cs_packet_next_reloc(p, &reloc);
+ if (r) {
+@@ -559,9 +600,23 @@ static inline int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u3
+ track->cb_shader_mask = radeon_get_ib_value(p, idx);
+ break;
+ case PA_SC_AA_CONFIG:
++ if (p->rdev->family >= CHIP_CAYMAN) {
++ dev_warn(p->dev, "bad SET_CONTEXT_REG "
++ "0x%04X\n", reg);
++ return -EINVAL;
++ }
+ tmp = radeon_get_ib_value(p, idx) & MSAA_NUM_SAMPLES_MASK;
+ track->nsamples = 1 << tmp;
+ break;
++ case CAYMAN_PA_SC_AA_CONFIG:
++ if (p->rdev->family < CHIP_CAYMAN) {
++ dev_warn(p->dev, "bad SET_CONTEXT_REG "
++ "0x%04X\n", reg);
++ return -EINVAL;
++ }
++ tmp = radeon_get_ib_value(p, idx) & CAYMAN_MSAA_NUM_SAMPLES_MASK;
++ track->nsamples = 1 << tmp;
++ break;
+ case CB_COLOR0_VIEW:
+ case CB_COLOR1_VIEW:
+ case CB_COLOR2_VIEW:
+@@ -942,6 +997,37 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
+ idx_value = radeon_get_ib_value(p, idx);
+
+ switch (pkt->opcode) {
++ case PACKET3_SET_PREDICATION:
++ {
++ int pred_op;
++ int tmp;
++ if (pkt->count != 1) {
++ DRM_ERROR("bad SET PREDICATION\n");
++ return -EINVAL;
++ }
++
++ tmp = radeon_get_ib_value(p, idx + 1);
++ pred_op = (tmp >> 16) & 0x7;
++
++ /* for the clear predicate operation */
++ if (pred_op == 0)
++ return 0;
++
++ if (pred_op > 2) {
++ DRM_ERROR("bad SET PREDICATION operation %d\n", pred_op);
++ return -EINVAL;
++ }
++
++ r = evergreen_cs_packet_next_reloc(p, &reloc);
++ if (r) {
++ DRM_ERROR("bad SET PREDICATION\n");
++ return -EINVAL;
++ }
++
++ ib[idx + 0] = idx_value + (u32)(reloc->lobj.gpu_offset & 0xffffffff);
++ ib[idx + 1] = tmp + (upper_32_bits(reloc->lobj.gpu_offset) & 0xff);
++ }
++ break;
+ case PACKET3_CONTEXT_CONTROL:
+ if (pkt->count != 1) {
+ DRM_ERROR("bad CONTEXT_CONTROL\n");
+@@ -956,6 +1042,16 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
+ return -EINVAL;
+ }
+ break;
++ case CAYMAN_PACKET3_DEALLOC_STATE:
++ if (p->rdev->family < CHIP_CAYMAN) {
++ DRM_ERROR("bad PACKET3_DEALLOC_STATE\n");
++ return -EINVAL;
++ }
++ if (pkt->count) {
++ DRM_ERROR("bad INDEX_TYPE/NUM_INSTANCES/CLEAR_STATE\n");
++ return -EINVAL;
++ }
++ break;
+ case PACKET3_INDEX_BASE:
+ if (pkt->count != 1) {
+ DRM_ERROR("bad INDEX_BASE\n");
+diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h
+index eb4acf4..9453384 100644
+--- a/drivers/gpu/drm/radeon/evergreend.h
++++ b/drivers/gpu/drm/radeon/evergreend.h
+@@ -221,6 +221,11 @@
+ #define MC_VM_MD_L1_TLB0_CNTL 0x2654
+ #define MC_VM_MD_L1_TLB1_CNTL 0x2658
+ #define MC_VM_MD_L1_TLB2_CNTL 0x265C
++
++#define FUS_MC_VM_MD_L1_TLB0_CNTL 0x265C
++#define FUS_MC_VM_MD_L1_TLB1_CNTL 0x2660
++#define FUS_MC_VM_MD_L1_TLB2_CNTL 0x2664
++
+ #define MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR 0x203C
+ #define MC_VM_SYSTEM_APERTURE_HIGH_ADDR 0x2038
+ #define MC_VM_SYSTEM_APERTURE_LOW_ADDR 0x2034
+@@ -755,13 +760,21 @@
+
+ #define SQ_CONST_MEM_BASE 0x8df8
+
++#define SQ_ESGS_RING_BASE 0x8c40
+ #define SQ_ESGS_RING_SIZE 0x8c44
++#define SQ_GSVS_RING_BASE 0x8c48
+ #define SQ_GSVS_RING_SIZE 0x8c4c
++#define SQ_ESTMP_RING_BASE 0x8c50
+ #define SQ_ESTMP_RING_SIZE 0x8c54
++#define SQ_GSTMP_RING_BASE 0x8c58
+ #define SQ_GSTMP_RING_SIZE 0x8c5c
++#define SQ_VSTMP_RING_BASE 0x8c60
+ #define SQ_VSTMP_RING_SIZE 0x8c64
++#define SQ_PSTMP_RING_BASE 0x8c68
+ #define SQ_PSTMP_RING_SIZE 0x8c6c
++#define SQ_LSTMP_RING_BASE 0x8e10
+ #define SQ_LSTMP_RING_SIZE 0x8e14
++#define SQ_HSTMP_RING_BASE 0x8e18
+ #define SQ_HSTMP_RING_SIZE 0x8e1c
+ #define VGT_TF_RING_SIZE 0x8988
+
+@@ -1093,5 +1106,14 @@
+ #define SQ_TEX_RESOURCE_WORD6_0 0x30018
+ #define SQ_TEX_RESOURCE_WORD7_0 0x3001c
+
++/* cayman 3D regs */
++#define CAYMAN_VGT_OFFCHIP_LDS_BASE 0x89B0
++#define CAYMAN_DB_EQAA 0x28804
++#define CAYMAN_DB_DEPTH_INFO 0x2803C
++#define CAYMAN_PA_SC_AA_CONFIG 0x28BE0
++#define CAYMAN_MSAA_NUM_SAMPLES_SHIFT 0
++#define CAYMAN_MSAA_NUM_SAMPLES_MASK 0x7
++/* cayman packet3 addition */
++#define CAYMAN_PACKET3_DEALLOC_STATE 0x14
+
+ #endif
+diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
+index 5e0bef8..8c199c4 100644
+--- a/drivers/gpu/drm/radeon/ni.c
++++ b/drivers/gpu/drm/radeon/ni.c
+@@ -31,12 +31,25 @@
+ #include "nid.h"
+ #include "atom.h"
+ #include "ni_reg.h"
++#include "cayman_blit_shaders.h"
++
++extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
++extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
++extern int evergreen_mc_wait_for_idle(struct radeon_device *rdev);
++extern void evergreen_mc_program(struct radeon_device *rdev);
++extern void evergreen_irq_suspend(struct radeon_device *rdev);
++extern int evergreen_mc_init(struct radeon_device *rdev);
+
+ #define EVERGREEN_PFP_UCODE_SIZE 1120
+ #define EVERGREEN_PM4_UCODE_SIZE 1376
+ #define EVERGREEN_RLC_UCODE_SIZE 768
+ #define BTC_MC_UCODE_SIZE 6024
+
++#define CAYMAN_PFP_UCODE_SIZE 2176
++#define CAYMAN_PM4_UCODE_SIZE 2176
++#define CAYMAN_RLC_UCODE_SIZE 1024
++#define CAYMAN_MC_UCODE_SIZE 6037
++
+ /* Firmware Names */
+ /*(DEBLOBBED)*/
+
+@@ -147,12 +164,44 @@ static const u32 caicos_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
+ {0x0000009f, 0x00916a00}
+ };
+
+-int btc_mc_load_microcode(struct radeon_device *rdev)
++static const u32 cayman_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
++ {0x00000077, 0xff010100},
++ {0x00000078, 0x00000000},
++ {0x00000079, 0x00001434},
++ {0x0000007a, 0xcc08ec08},
++ {0x0000007b, 0x00040000},
++ {0x0000007c, 0x000080c0},
++ {0x0000007d, 0x09000000},
++ {0x0000007e, 0x00210404},
++ {0x00000081, 0x08a8e800},
++ {0x00000082, 0x00030444},
++ {0x00000083, 0x00000000},
++ {0x00000085, 0x00000001},
++ {0x00000086, 0x00000002},
++ {0x00000087, 0x48490000},
++ {0x00000088, 0x20244647},
++ {0x00000089, 0x00000005},
++ {0x0000008b, 0x66030000},
++ {0x0000008c, 0x00006603},
++ {0x0000008d, 0x00000100},
++ {0x0000008f, 0x00001c0a},
++ {0x00000090, 0xff000001},
++ {0x00000094, 0x00101101},
++ {0x00000095, 0x00000fff},
++ {0x00000096, 0x00116fff},
++ {0x00000097, 0x60010000},
++ {0x00000098, 0x10010000},
++ {0x00000099, 0x00006000},
++ {0x0000009a, 0x00001000},
++ {0x0000009f, 0x00976b00}
++};
++
++int ni_mc_load_microcode(struct radeon_device *rdev)
+ {
+ const __be32 *fw_data;
+ u32 mem_type, running, blackout = 0;
+ u32 *io_mc_regs;
+- int i;
++ int i, ucode_size, regs_size;
+
+ if (!rdev->mc_fw)
+ return -EINVAL;
+@@ -160,13 +209,24 @@ int btc_mc_load_microcode(struct radeon_device *rdev)
+ switch (rdev->family) {
+ case CHIP_BARTS:
+ io_mc_regs = (u32 *)&barts_io_mc_regs;
++ ucode_size = BTC_MC_UCODE_SIZE;
++ regs_size = BTC_IO_MC_REGS_SIZE;
+ break;
+ case CHIP_TURKS:
+ io_mc_regs = (u32 *)&turks_io_mc_regs;
++ ucode_size = BTC_MC_UCODE_SIZE;
++ regs_size = BTC_IO_MC_REGS_SIZE;
+ break;
+ case CHIP_CAICOS:
+ default:
+ io_mc_regs = (u32 *)&caicos_io_mc_regs;
++ ucode_size = BTC_MC_UCODE_SIZE;
++ regs_size = BTC_IO_MC_REGS_SIZE;
++ break;
++ case CHIP_CAYMAN:
++ io_mc_regs = (u32 *)&cayman_io_mc_regs;
++ ucode_size = CAYMAN_MC_UCODE_SIZE;
++ regs_size = BTC_IO_MC_REGS_SIZE;
+ break;
+ }
+
+@@ -184,13 +244,13 @@ int btc_mc_load_microcode(struct radeon_device *rdev)
+ WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
+
+ /* load mc io regs */
+- for (i = 0; i < BTC_IO_MC_REGS_SIZE; i++) {
++ for (i = 0; i < regs_size; i++) {
+ WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
+ WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
+ }
+ /* load the MC ucode */
+ fw_data = (const __be32 *)rdev->mc_fw->data;
+- for (i = 0; i < BTC_MC_UCODE_SIZE; i++)
++ for (i = 0; i < ucode_size; i++)
+ WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
+
+ /* put the engine back into the active state */
+@@ -231,23 +291,38 @@ int ni_init_microcode(struct radeon_device *rdev)
+ case CHIP_BARTS:
+ chip_name = "BARTS";
+ rlc_chip_name = "BTC";
++ pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
++ me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
++ rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
++ mc_req_size = BTC_MC_UCODE_SIZE * 4;
+ break;
+ case CHIP_TURKS:
+ chip_name = "TURKS";
+ rlc_chip_name = "BTC";
++ pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
++ me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
++ rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
++ mc_req_size = BTC_MC_UCODE_SIZE * 4;
+ break;
+ case CHIP_CAICOS:
+ chip_name = "CAICOS";
+ rlc_chip_name = "BTC";
++ pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
++ me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
++ rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
++ mc_req_size = BTC_MC_UCODE_SIZE * 4;
++ break;
++ case CHIP_CAYMAN:
++ chip_name = "CAYMAN";
++ rlc_chip_name = "CAYMAN";
++ pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
++ me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
++ rlc_req_size = CAYMAN_RLC_UCODE_SIZE * 4;
++ mc_req_size = CAYMAN_MC_UCODE_SIZE * 4;
+ break;
+ default: BUG();
+ }
+
+- pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
+- me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
+- rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
+- mc_req_size = BTC_MC_UCODE_SIZE * 4;
+-
+ DRM_INFO("Loading %s Microcode\n", chip_name);
+
+ snprintf(fw_name, sizeof(fw_name), "/*(DEBLOBBED)*/", chip_name);
+@@ -314,3 +389,1204 @@ out:
+ return err;
+ }
+
++/*
++ * Core functions
++ */
++static u32 cayman_get_tile_pipe_to_backend_map(struct radeon_device *rdev,
++ u32 num_tile_pipes,
++ u32 num_backends_per_asic,
++ u32 *backend_disable_mask_per_asic,
++ u32 num_shader_engines)
++{
++ u32 backend_map = 0;
++ u32 enabled_backends_mask = 0;
++ u32 enabled_backends_count = 0;
++ u32 num_backends_per_se;
++ u32 cur_pipe;
++ u32 swizzle_pipe[CAYMAN_MAX_PIPES];
++ u32 cur_backend = 0;
++ u32 i;
++ bool force_no_swizzle;
++
++ /* force legal values */
++ if (num_tile_pipes < 1)
++ num_tile_pipes = 1;
++ if (num_tile_pipes > rdev->config.cayman.max_tile_pipes)
++ num_tile_pipes = rdev->config.cayman.max_tile_pipes;
++ if (num_shader_engines < 1)
++ num_shader_engines = 1;
++ if (num_shader_engines > rdev->config.cayman.max_shader_engines)
++ num_shader_engines = rdev->config.cayman.max_shader_engines;
++ if (num_backends_per_asic > num_shader_engines)
++ num_backends_per_asic = num_shader_engines;
++ if (num_backends_per_asic > (rdev->config.cayman.max_backends_per_se * num_shader_engines))
++ num_backends_per_asic = rdev->config.cayman.max_backends_per_se * num_shader_engines;
++
++ /* make sure we have the same number of backends per se */
++ num_backends_per_asic = ALIGN(num_backends_per_asic, num_shader_engines);
++ /* set up the number of backends per se */
++ num_backends_per_se = num_backends_per_asic / num_shader_engines;
++ if (num_backends_per_se > rdev->config.cayman.max_backends_per_se) {
++ num_backends_per_se = rdev->config.cayman.max_backends_per_se;
++ num_backends_per_asic = num_backends_per_se * num_shader_engines;
++ }
++
++ /* create enable mask and count for enabled backends */
++ for (i = 0; i < CAYMAN_MAX_BACKENDS; ++i) {
++ if (((*backend_disable_mask_per_asic >> i) & 1) == 0) {
++ enabled_backends_mask |= (1 << i);
++ ++enabled_backends_count;
++ }
++ if (enabled_backends_count == num_backends_per_asic)
++ break;
++ }
++
++ /* force the backends mask to match the current number of backends */
++ if (enabled_backends_count != num_backends_per_asic) {
++ u32 this_backend_enabled;
++ u32 shader_engine;
++ u32 backend_per_se;
++
++ enabled_backends_mask = 0;
++ enabled_backends_count = 0;
++ *backend_disable_mask_per_asic = CAYMAN_MAX_BACKENDS_MASK;
++ for (i = 0; i < CAYMAN_MAX_BACKENDS; ++i) {
++ /* calc the current se */
++ shader_engine = i / rdev->config.cayman.max_backends_per_se;
++ /* calc the backend per se */
++ backend_per_se = i % rdev->config.cayman.max_backends_per_se;
++ /* default to not enabled */
++ this_backend_enabled = 0;
++ if ((shader_engine < num_shader_engines) &&
++ (backend_per_se < num_backends_per_se))
++ this_backend_enabled = 1;
++ if (this_backend_enabled) {
++ enabled_backends_mask |= (1 << i);
++ *backend_disable_mask_per_asic &= ~(1 << i);
++ ++enabled_backends_count;
++ }
++ }
++ }
++
++
++ memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * CAYMAN_MAX_PIPES);
++ switch (rdev->family) {
++ case CHIP_CAYMAN:
++ force_no_swizzle = true;
++ break;
++ default:
++ force_no_swizzle = false;
++ break;
++ }
++ if (force_no_swizzle) {
++ bool last_backend_enabled = false;
++
++ force_no_swizzle = false;
++ for (i = 0; i < CAYMAN_MAX_BACKENDS; ++i) {
++ if (((enabled_backends_mask >> i) & 1) == 1) {
++ if (last_backend_enabled)
++ force_no_swizzle = true;
++ last_backend_enabled = true;
++ } else
++ last_backend_enabled = false;
++ }
++ }
++
++ switch (num_tile_pipes) {
++ case 1:
++ case 3:
++ case 5:
++ case 7:
++ DRM_ERROR("odd number of pipes!\n");
++ break;
++ case 2:
++ swizzle_pipe[0] = 0;
++ swizzle_pipe[1] = 1;
++ break;
++ case 4:
++ if (force_no_swizzle) {
++ swizzle_pipe[0] = 0;
++ swizzle_pipe[1] = 1;
++ swizzle_pipe[2] = 2;
++ swizzle_pipe[3] = 3;
++ } else {
++ swizzle_pipe[0] = 0;
++ swizzle_pipe[1] = 2;
++ swizzle_pipe[2] = 1;
++ swizzle_pipe[3] = 3;
++ }
++ break;
++ case 6:
++ if (force_no_swizzle) {
++ swizzle_pipe[0] = 0;
++ swizzle_pipe[1] = 1;
++ swizzle_pipe[2] = 2;
++ swizzle_pipe[3] = 3;
++ swizzle_pipe[4] = 4;
++ swizzle_pipe[5] = 5;
++ } else {
++ swizzle_pipe[0] = 0;
++ swizzle_pipe[1] = 2;
++ swizzle_pipe[2] = 4;
++ swizzle_pipe[3] = 1;
++ swizzle_pipe[4] = 3;
++ swizzle_pipe[5] = 5;
++ }
++ break;
++ case 8:
++ if (force_no_swizzle) {
++ swizzle_pipe[0] = 0;
++ swizzle_pipe[1] = 1;
++ swizzle_pipe[2] = 2;
++ swizzle_pipe[3] = 3;
++ swizzle_pipe[4] = 4;
++ swizzle_pipe[5] = 5;
++ swizzle_pipe[6] = 6;
++ swizzle_pipe[7] = 7;
++ } else {
++ swizzle_pipe[0] = 0;
++ swizzle_pipe[1] = 2;
++ swizzle_pipe[2] = 4;
++ swizzle_pipe[3] = 6;
++ swizzle_pipe[4] = 1;
++ swizzle_pipe[5] = 3;
++ swizzle_pipe[6] = 5;
++ swizzle_pipe[7] = 7;
++ }
++ break;
++ }
++
++ for (cur_pipe = 0; cur_pipe < num_tile_pipes; ++cur_pipe) {
++ while (((1 << cur_backend) & enabled_backends_mask) == 0)
++ cur_backend = (cur_backend + 1) % CAYMAN_MAX_BACKENDS;
++
++ backend_map |= (((cur_backend & 0xf) << (swizzle_pipe[cur_pipe] * 4)));
++
++ cur_backend = (cur_backend + 1) % CAYMAN_MAX_BACKENDS;
++ }
++
++ return backend_map;
++}
++
++static void cayman_program_channel_remap(struct radeon_device *rdev)
++{
++ u32 tcp_chan_steer_lo, tcp_chan_steer_hi, mc_shared_chremap, tmp;
++
++ tmp = RREG32(MC_SHARED_CHMAP);
++ switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
++ case 0:
++ case 1:
++ case 2:
++ case 3:
++ default:
++ /* default mapping */
++ mc_shared_chremap = 0x00fac688;
++ break;
++ }
++
++ switch (rdev->family) {
++ case CHIP_CAYMAN:
++ default:
++ //tcp_chan_steer_lo = 0x54763210
++ tcp_chan_steer_lo = 0x76543210;
++ tcp_chan_steer_hi = 0x0000ba98;
++ break;
++ }
++
++ WREG32(TCP_CHAN_STEER_LO, tcp_chan_steer_lo);
++ WREG32(TCP_CHAN_STEER_HI, tcp_chan_steer_hi);
++ WREG32(MC_SHARED_CHREMAP, mc_shared_chremap);
++}
++
++static u32 cayman_get_disable_mask_per_asic(struct radeon_device *rdev,
++ u32 disable_mask_per_se,
++ u32 max_disable_mask_per_se,
++ u32 num_shader_engines)
++{
++ u32 disable_field_width_per_se = r600_count_pipe_bits(disable_mask_per_se);
++ u32 disable_mask_per_asic = disable_mask_per_se & max_disable_mask_per_se;
++
++ if (num_shader_engines == 1)
++ return disable_mask_per_asic;
++ else if (num_shader_engines == 2)
++ return disable_mask_per_asic | (disable_mask_per_asic << disable_field_width_per_se);
++ else
++ return 0xffffffff;
++}
++
++static void cayman_gpu_init(struct radeon_device *rdev)
++{
++ u32 cc_rb_backend_disable = 0;
++ u32 cc_gc_shader_pipe_config;
++ u32 gb_addr_config = 0;
++ u32 mc_shared_chmap, mc_arb_ramcfg;
++ u32 gb_backend_map;
++ u32 cgts_tcc_disable;
++ u32 sx_debug_1;
++ u32 smx_dc_ctl0;
++ u32 gc_user_shader_pipe_config;
++ u32 gc_user_rb_backend_disable;
++ u32 cgts_user_tcc_disable;
++ u32 cgts_sm_ctrl_reg;
++ u32 hdp_host_path_cntl;
++ u32 tmp;
++ int i, j;
++
++ switch (rdev->family) {
++ case CHIP_CAYMAN:
++ default:
++ rdev->config.cayman.max_shader_engines = 2;
++ rdev->config.cayman.max_pipes_per_simd = 4;
++ rdev->config.cayman.max_tile_pipes = 8;
++ rdev->config.cayman.max_simds_per_se = 12;
++ rdev->config.cayman.max_backends_per_se = 4;
++ rdev->config.cayman.max_texture_channel_caches = 8;
++ rdev->config.cayman.max_gprs = 256;
++ rdev->config.cayman.max_threads = 256;
++ rdev->config.cayman.max_gs_threads = 32;
++ rdev->config.cayman.max_stack_entries = 512;
++ rdev->config.cayman.sx_num_of_sets = 8;
++ rdev->config.cayman.sx_max_export_size = 256;
++ rdev->config.cayman.sx_max_export_pos_size = 64;
++ rdev->config.cayman.sx_max_export_smx_size = 192;
++ rdev->config.cayman.max_hw_contexts = 8;
++ rdev->config.cayman.sq_num_cf_insts = 2;
++
++ rdev->config.cayman.sc_prim_fifo_size = 0x100;
++ rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
++ rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
++ break;
++ }
++
++ /* Initialize HDP */
++ for (i = 0, j = 0; i < 32; i++, j += 0x18) {
++ WREG32((0x2c14 + j), 0x00000000);
++ WREG32((0x2c18 + j), 0x00000000);
++ WREG32((0x2c1c + j), 0x00000000);
++ WREG32((0x2c20 + j), 0x00000000);
++ WREG32((0x2c24 + j), 0x00000000);
++ }
++
++ WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
++
++ mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
++ mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
++
++ cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE);
++ cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG);
++ cgts_tcc_disable = RREG32(CGTS_TCC_DISABLE);
++ gc_user_rb_backend_disable = RREG32(GC_USER_RB_BACKEND_DISABLE);
++ gc_user_shader_pipe_config = RREG32(GC_USER_SHADER_PIPE_CONFIG);
++ cgts_user_tcc_disable = RREG32(CGTS_USER_TCC_DISABLE);
++
++ rdev->config.cayman.num_shader_engines = rdev->config.cayman.max_shader_engines;
++ tmp = ((~gc_user_shader_pipe_config) & INACTIVE_QD_PIPES_MASK) >> INACTIVE_QD_PIPES_SHIFT;
++ rdev->config.cayman.num_shader_pipes_per_simd = r600_count_pipe_bits(tmp);
++ rdev->config.cayman.num_tile_pipes = rdev->config.cayman.max_tile_pipes;
++ tmp = ((~gc_user_shader_pipe_config) & INACTIVE_SIMDS_MASK) >> INACTIVE_SIMDS_SHIFT;
++ rdev->config.cayman.num_simds_per_se = r600_count_pipe_bits(tmp);
++ tmp = ((~gc_user_rb_backend_disable) & BACKEND_DISABLE_MASK) >> BACKEND_DISABLE_SHIFT;
++ rdev->config.cayman.num_backends_per_se = r600_count_pipe_bits(tmp);
++ tmp = (gc_user_rb_backend_disable & BACKEND_DISABLE_MASK) >> BACKEND_DISABLE_SHIFT;
++ rdev->config.cayman.backend_disable_mask_per_asic =
++ cayman_get_disable_mask_per_asic(rdev, tmp, CAYMAN_MAX_BACKENDS_PER_SE_MASK,
++ rdev->config.cayman.num_shader_engines);
++ rdev->config.cayman.backend_map =
++ cayman_get_tile_pipe_to_backend_map(rdev, rdev->config.cayman.num_tile_pipes,
++ rdev->config.cayman.num_backends_per_se *
++ rdev->config.cayman.num_shader_engines,
++ &rdev->config.cayman.backend_disable_mask_per_asic,
++ rdev->config.cayman.num_shader_engines);
++ tmp = ((~cgts_user_tcc_disable) & TCC_DISABLE_MASK) >> TCC_DISABLE_SHIFT;
++ rdev->config.cayman.num_texture_channel_caches = r600_count_pipe_bits(tmp);
++ tmp = (mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT;
++ rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256;
++ if (rdev->config.cayman.mem_max_burst_length_bytes > 512)
++ rdev->config.cayman.mem_max_burst_length_bytes = 512;
++ tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
++ rdev->config.cayman.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
++ if (rdev->config.cayman.mem_row_size_in_kb > 4)
++ rdev->config.cayman.mem_row_size_in_kb = 4;
++ /* XXX use MC settings? */
++ rdev->config.cayman.shader_engine_tile_size = 32;
++ rdev->config.cayman.num_gpus = 1;
++ rdev->config.cayman.multi_gpu_tile_size = 64;
++
++ //gb_addr_config = 0x02011003
++#if 0
++ gb_addr_config = RREG32(GB_ADDR_CONFIG);
++#else
++ gb_addr_config = 0;
++ switch (rdev->config.cayman.num_tile_pipes) {
++ case 1:
++ default:
++ gb_addr_config |= NUM_PIPES(0);
++ break;
++ case 2:
++ gb_addr_config |= NUM_PIPES(1);
++ break;
++ case 4:
++ gb_addr_config |= NUM_PIPES(2);
++ break;
++ case 8:
++ gb_addr_config |= NUM_PIPES(3);
++ break;
++ }
++
++ tmp = (rdev->config.cayman.mem_max_burst_length_bytes / 256) - 1;
++ gb_addr_config |= PIPE_INTERLEAVE_SIZE(tmp);
++ gb_addr_config |= NUM_SHADER_ENGINES(rdev->config.cayman.num_shader_engines - 1);
++ tmp = (rdev->config.cayman.shader_engine_tile_size / 16) - 1;
++ gb_addr_config |= SHADER_ENGINE_TILE_SIZE(tmp);
++ switch (rdev->config.cayman.num_gpus) {
++ case 1:
++ default:
++ gb_addr_config |= NUM_GPUS(0);
++ break;
++ case 2:
++ gb_addr_config |= NUM_GPUS(1);
++ break;
++ case 4:
++ gb_addr_config |= NUM_GPUS(2);
++ break;
++ }
++ switch (rdev->config.cayman.multi_gpu_tile_size) {
++ case 16:
++ gb_addr_config |= MULTI_GPU_TILE_SIZE(0);
++ break;
++ case 32:
++ default:
++ gb_addr_config |= MULTI_GPU_TILE_SIZE(1);
++ break;
++ case 64:
++ gb_addr_config |= MULTI_GPU_TILE_SIZE(2);
++ break;
++ case 128:
++ gb_addr_config |= MULTI_GPU_TILE_SIZE(3);
++ break;
++ }
++ switch (rdev->config.cayman.mem_row_size_in_kb) {
++ case 1:
++ default:
++ gb_addr_config |= ROW_SIZE(0);
++ break;
++ case 2:
++ gb_addr_config |= ROW_SIZE(1);
++ break;
++ case 4:
++ gb_addr_config |= ROW_SIZE(2);
++ break;
++ }
++#endif
++
++ tmp = (gb_addr_config & NUM_PIPES_MASK) >> NUM_PIPES_SHIFT;
++ rdev->config.cayman.num_tile_pipes = (1 << tmp);
++ tmp = (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT;
++ rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256;
++ tmp = (gb_addr_config & NUM_SHADER_ENGINES_MASK) >> NUM_SHADER_ENGINES_SHIFT;
++ rdev->config.cayman.num_shader_engines = tmp + 1;
++ tmp = (gb_addr_config & NUM_GPUS_MASK) >> NUM_GPUS_SHIFT;
++ rdev->config.cayman.num_gpus = tmp + 1;
++ tmp = (gb_addr_config & MULTI_GPU_TILE_SIZE_MASK) >> MULTI_GPU_TILE_SIZE_SHIFT;
++ rdev->config.cayman.multi_gpu_tile_size = 1 << tmp;
++ tmp = (gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT;
++ rdev->config.cayman.mem_row_size_in_kb = 1 << tmp;
++
++ //gb_backend_map = 0x76541032;
++#if 0
++ gb_backend_map = RREG32(GB_BACKEND_MAP);
++#else
++ gb_backend_map =
++ cayman_get_tile_pipe_to_backend_map(rdev, rdev->config.cayman.num_tile_pipes,
++ rdev->config.cayman.num_backends_per_se *
++ rdev->config.cayman.num_shader_engines,
++ &rdev->config.cayman.backend_disable_mask_per_asic,
++ rdev->config.cayman.num_shader_engines);
++#endif
++ /* setup tiling info dword. gb_addr_config is not adequate since it does
++ * not have bank info, so create a custom tiling dword.
++ * bits 3:0 num_pipes
++ * bits 7:4 num_banks
++ * bits 11:8 group_size
++ * bits 15:12 row_size
++ */
++ rdev->config.cayman.tile_config = 0;
++ switch (rdev->config.cayman.num_tile_pipes) {
++ case 1:
++ default:
++ rdev->config.cayman.tile_config |= (0 << 0);
++ break;
++ case 2:
++ rdev->config.cayman.tile_config |= (1 << 0);
++ break;
++ case 4:
++ rdev->config.cayman.tile_config |= (2 << 0);
++ break;
++ case 8:
++ rdev->config.cayman.tile_config |= (3 << 0);
++ break;
++ }
++ rdev->config.cayman.tile_config |=
++ ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4;
++ rdev->config.cayman.tile_config |=
++ (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT;
++ rdev->config.cayman.tile_config |=
++ ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
++
++ WREG32(GB_BACKEND_MAP, gb_backend_map);
++ WREG32(GB_ADDR_CONFIG, gb_addr_config);
++ WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
++ WREG32(HDP_ADDR_CONFIG, gb_addr_config);
++
++ cayman_program_channel_remap(rdev);
++
++ /* primary versions */
++ WREG32(CC_RB_BACKEND_DISABLE, cc_rb_backend_disable);
++ WREG32(CC_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable);
++ WREG32(CC_GC_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
++
++ WREG32(CGTS_TCC_DISABLE, cgts_tcc_disable);
++ WREG32(CGTS_SYS_TCC_DISABLE, cgts_tcc_disable);
++
++ /* user versions */
++ WREG32(GC_USER_RB_BACKEND_DISABLE, cc_rb_backend_disable);
++ WREG32(GC_USER_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable);
++ WREG32(GC_USER_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
++
++ WREG32(CGTS_USER_SYS_TCC_DISABLE, cgts_tcc_disable);
++ WREG32(CGTS_USER_TCC_DISABLE, cgts_tcc_disable);
++
++ /* reprogram the shader complex */
++ cgts_sm_ctrl_reg = RREG32(CGTS_SM_CTRL_REG);
++ for (i = 0; i < 16; i++)
++ WREG32(CGTS_SM_CTRL_REG, OVERRIDE);
++ WREG32(CGTS_SM_CTRL_REG, cgts_sm_ctrl_reg);
++
++ /* set HW defaults for 3D engine */
++ WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
++
++ sx_debug_1 = RREG32(SX_DEBUG_1);
++ sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
++ WREG32(SX_DEBUG_1, sx_debug_1);
++
++ smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
++ smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff);
++ smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.evergreen.sx_num_of_sets);
++ WREG32(SMX_DC_CTL0, smx_dc_ctl0);
++
++ WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4) | CRC_SIMD_ID_WADDR_DISABLE);
++
++ /* need to be explicitly zero-ed */
++ WREG32(VGT_OFFCHIP_LDS_BASE, 0);
++ WREG32(SQ_LSTMP_RING_BASE, 0);
++ WREG32(SQ_HSTMP_RING_BASE, 0);
++ WREG32(SQ_ESTMP_RING_BASE, 0);
++ WREG32(SQ_GSTMP_RING_BASE, 0);
++ WREG32(SQ_VSTMP_RING_BASE, 0);
++ WREG32(SQ_PSTMP_RING_BASE, 0);
++
++ WREG32(TA_CNTL_AUX, DISABLE_CUBE_ANISO);
++
++ WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_size / 4) - 1) |
++ POSITION_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_pos_size / 4) - 1) |
++ SMX_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_smx_size / 4) - 1)));
++
++ WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.evergreen.sc_prim_fifo_size) |
++ SC_HIZ_TILE_FIFO_SIZE(rdev->config.evergreen.sc_hiz_tile_fifo_size) |
++ SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.evergreen.sc_earlyz_tile_fifo_size)));
++
++
++ WREG32(VGT_NUM_INSTANCES, 1);
++
++ WREG32(CP_PERFMON_CNTL, 0);
++
++ WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.evergreen.sq_num_cf_insts) |
++ FETCH_FIFO_HIWATER(0x4) |
++ DONE_FIFO_HIWATER(0xe0) |
++ ALU_UPDATE_FIFO_HIWATER(0x8)));
++
++ WREG32(SQ_GPR_RESOURCE_MGMT_1, NUM_CLAUSE_TEMP_GPRS(4));
++ WREG32(SQ_CONFIG, (VC_ENABLE |
++ EXPORT_SRC_C |
++ GFX_PRIO(0) |
++ CS1_PRIO(0) |
++ CS2_PRIO(1)));
++ WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, DYN_GPR_ENABLE);
++
++ WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
++ FORCE_EOV_MAX_REZ_CNT(255)));
++
++ WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
++ AUTO_INVLD_EN(ES_AND_GS_AUTO));
++
++ WREG32(VGT_GS_VERTEX_REUSE, 16);
++ WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
++
++ WREG32(CB_PERF_CTR0_SEL_0, 0);
++ WREG32(CB_PERF_CTR0_SEL_1, 0);
++ WREG32(CB_PERF_CTR1_SEL_0, 0);
++ WREG32(CB_PERF_CTR1_SEL_1, 0);
++ WREG32(CB_PERF_CTR2_SEL_0, 0);
++ WREG32(CB_PERF_CTR2_SEL_1, 0);
++ WREG32(CB_PERF_CTR3_SEL_0, 0);
++ WREG32(CB_PERF_CTR3_SEL_1, 0);
++
++ hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
++ WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
++
++ WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
++
++ udelay(50);
++}
++
++/*
++ * GART
++ */
++void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev)
++{
++ /* flush hdp cache */
++ WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
++
++ /* bits 0-7 are the VM contexts0-7 */
++ WREG32(VM_INVALIDATE_REQUEST, 1);
++}
++
++int cayman_pcie_gart_enable(struct radeon_device *rdev)
++{
++ int r;
++
++ if (rdev->gart.table.vram.robj == NULL) {
++ dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
++ return -EINVAL;
++ }
++ r = radeon_gart_table_vram_pin(rdev);
++ if (r)
++ return r;
++ radeon_gart_restore(rdev);
++ /* Setup TLB control */
++ WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_TLB |
++ ENABLE_L1_FRAGMENT_PROCESSING |
++ SYSTEM_ACCESS_MODE_NOT_IN_SYS |
++ SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
++ /* Setup L2 cache */
++ WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
++ ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
++ ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
++ EFFECTIVE_L2_QUEUE_SIZE(7) |
++ CONTEXT1_IDENTITY_ACCESS_MODE(1));
++ WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
++ WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
++ L2_CACHE_BIGK_FRAGMENT_SIZE(6));
++ /* setup context0 */
++ WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
++ WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
++ WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
++ WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
++ (u32)(rdev->dummy_page.addr >> 12));
++ WREG32(VM_CONTEXT0_CNTL2, 0);
++ WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
++ RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
++ /* disable context1-7 */
++ WREG32(VM_CONTEXT1_CNTL2, 0);
++ WREG32(VM_CONTEXT1_CNTL, 0);
++
++ cayman_pcie_gart_tlb_flush(rdev);
++ rdev->gart.ready = true;
++ return 0;
++}
++
++void cayman_pcie_gart_disable(struct radeon_device *rdev)
++{
++ int r;
++
++ /* Disable all tables */
++ WREG32(VM_CONTEXT0_CNTL, 0);
++ WREG32(VM_CONTEXT1_CNTL, 0);
++ /* Setup TLB control */
++ WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING |
++ SYSTEM_ACCESS_MODE_NOT_IN_SYS |
++ SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
++ /* Setup L2 cache */
++ WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
++ ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
++ EFFECTIVE_L2_QUEUE_SIZE(7) |
++ CONTEXT1_IDENTITY_ACCESS_MODE(1));
++ WREG32(VM_L2_CNTL2, 0);
++ WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
++ L2_CACHE_BIGK_FRAGMENT_SIZE(6));
++ if (rdev->gart.table.vram.robj) {
++ r = radeon_bo_reserve(rdev->gart.table.vram.robj, false);
++ if (likely(r == 0)) {
++ radeon_bo_kunmap(rdev->gart.table.vram.robj);
++ radeon_bo_unpin(rdev->gart.table.vram.robj);
++ radeon_bo_unreserve(rdev->gart.table.vram.robj);
++ }
++ }
++}
++
++void cayman_pcie_gart_fini(struct radeon_device *rdev)
++{
++ cayman_pcie_gart_disable(rdev);
++ radeon_gart_table_vram_free(rdev);
++ radeon_gart_fini(rdev);
++}
++
++/*
++ * CP.
++ */
++static void cayman_cp_enable(struct radeon_device *rdev, bool enable)
++{
++ if (enable)
++ WREG32(CP_ME_CNTL, 0);
++ else {
++ radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
++ WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
++ WREG32(SCRATCH_UMSK, 0);
++ }
++}
++
++static int cayman_cp_load_microcode(struct radeon_device *rdev)
++{
++ const __be32 *fw_data;
++ int i;
++
++ if (!rdev->me_fw || !rdev->pfp_fw)
++ return -EINVAL;
++
++ cayman_cp_enable(rdev, false);
++
++ fw_data = (const __be32 *)rdev->pfp_fw->data;
++ WREG32(CP_PFP_UCODE_ADDR, 0);
++ for (i = 0; i < CAYMAN_PFP_UCODE_SIZE; i++)
++ WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
++ WREG32(CP_PFP_UCODE_ADDR, 0);
++
++ fw_data = (const __be32 *)rdev->me_fw->data;
++ WREG32(CP_ME_RAM_WADDR, 0);
++ for (i = 0; i < CAYMAN_PM4_UCODE_SIZE; i++)
++ WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
++
++ WREG32(CP_PFP_UCODE_ADDR, 0);
++ WREG32(CP_ME_RAM_WADDR, 0);
++ WREG32(CP_ME_RAM_RADDR, 0);
++ return 0;
++}
++
++static int cayman_cp_start(struct radeon_device *rdev)
++{
++ int r, i;
++
++ r = radeon_ring_lock(rdev, 7);
++ if (r) {
++ DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
++ return r;
++ }
++ radeon_ring_write(rdev, PACKET3(PACKET3_ME_INITIALIZE, 5));
++ radeon_ring_write(rdev, 0x1);
++ radeon_ring_write(rdev, 0x0);
++ radeon_ring_write(rdev, rdev->config.cayman.max_hw_contexts - 1);
++ radeon_ring_write(rdev, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
++ radeon_ring_write(rdev, 0);
++ radeon_ring_write(rdev, 0);
++ radeon_ring_unlock_commit(rdev);
++
++ cayman_cp_enable(rdev, true);
++
++ r = radeon_ring_lock(rdev, cayman_default_size + 19);
++ if (r) {
++ DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
++ return r;
++ }
++
++ /* setup clear context state */
++ radeon_ring_write(rdev, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
++ radeon_ring_write(rdev, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
++
++ for (i = 0; i < cayman_default_size; i++)
++ radeon_ring_write(rdev, cayman_default_state[i]);
++
++ radeon_ring_write(rdev, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
++ radeon_ring_write(rdev, PACKET3_PREAMBLE_END_CLEAR_STATE);
++
++ /* set clear context state */
++ radeon_ring_write(rdev, PACKET3(PACKET3_CLEAR_STATE, 0));
++ radeon_ring_write(rdev, 0);
++
++ /* SQ_VTX_BASE_VTX_LOC */
++ radeon_ring_write(rdev, 0xc0026f00);
++ radeon_ring_write(rdev, 0x00000000);
++ radeon_ring_write(rdev, 0x00000000);
++ radeon_ring_write(rdev, 0x00000000);
++
++ /* Clear consts */
++ radeon_ring_write(rdev, 0xc0036f00);
++ radeon_ring_write(rdev, 0x00000bc4);
++ radeon_ring_write(rdev, 0xffffffff);
++ radeon_ring_write(rdev, 0xffffffff);
++ radeon_ring_write(rdev, 0xffffffff);
++
++ radeon_ring_write(rdev, 0xc0026900);
++ radeon_ring_write(rdev, 0x00000316);
++ radeon_ring_write(rdev, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
++ radeon_ring_write(rdev, 0x00000010); /* */
++
++ radeon_ring_unlock_commit(rdev);
++
++ /* XXX init other rings */
++
++ return 0;
++}
++
++static void cayman_cp_fini(struct radeon_device *rdev)
++{
++ cayman_cp_enable(rdev, false);
++ radeon_ring_fini(rdev);
++}
++
++int cayman_cp_resume(struct radeon_device *rdev)
++{
++ u32 tmp;
++ u32 rb_bufsz;
++ int r;
++
++ /* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
++ WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP |
++ SOFT_RESET_PA |
++ SOFT_RESET_SH |
++ SOFT_RESET_VGT |
++ SOFT_RESET_SX));
++ RREG32(GRBM_SOFT_RESET);
++ mdelay(15);
++ WREG32(GRBM_SOFT_RESET, 0);
++ RREG32(GRBM_SOFT_RESET);
++
++ WREG32(CP_SEM_WAIT_TIMER, 0x4);
++
++ /* Set the write pointer delay */
++ WREG32(CP_RB_WPTR_DELAY, 0);
++
++ WREG32(CP_DEBUG, (1 << 27));
++
++ /* ring 0 - compute and gfx */
++ /* Set ring buffer size */
++ rb_bufsz = drm_order(rdev->cp.ring_size / 8);
++ tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
++#ifdef __BIG_ENDIAN
++ tmp |= BUF_SWAP_32BIT;
++#endif
++ WREG32(CP_RB0_CNTL, tmp);
++
++ /* Initialize the ring buffer's read and write pointers */
++ WREG32(CP_RB0_CNTL, tmp | RB_RPTR_WR_ENA);
++ WREG32(CP_RB0_WPTR, 0);
++
++ /* set the wb address wether it's enabled or not */
++ WREG32(CP_RB0_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC);
++ WREG32(CP_RB0_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
++ WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
++
++ if (rdev->wb.enabled)
++ WREG32(SCRATCH_UMSK, 0xff);
++ else {
++ tmp |= RB_NO_UPDATE;
++ WREG32(SCRATCH_UMSK, 0);
++ }
++
++ mdelay(1);
++ WREG32(CP_RB0_CNTL, tmp);
++
++ WREG32(CP_RB0_BASE, rdev->cp.gpu_addr >> 8);
++
++ rdev->cp.rptr = RREG32(CP_RB0_RPTR);
++ rdev->cp.wptr = RREG32(CP_RB0_WPTR);
++
++ /* ring1 - compute only */
++ /* Set ring buffer size */
++ rb_bufsz = drm_order(rdev->cp1.ring_size / 8);
++ tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
++#ifdef __BIG_ENDIAN
++ tmp |= BUF_SWAP_32BIT;
++#endif
++ WREG32(CP_RB1_CNTL, tmp);
++
++ /* Initialize the ring buffer's read and write pointers */
++ WREG32(CP_RB1_CNTL, tmp | RB_RPTR_WR_ENA);
++ WREG32(CP_RB1_WPTR, 0);
++
++ /* set the wb address wether it's enabled or not */
++ WREG32(CP_RB1_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET) & 0xFFFFFFFC);
++ WREG32(CP_RB1_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET) & 0xFF);
++
++ mdelay(1);
++ WREG32(CP_RB1_CNTL, tmp);
++
++ WREG32(CP_RB1_BASE, rdev->cp1.gpu_addr >> 8);
++
++ rdev->cp1.rptr = RREG32(CP_RB1_RPTR);
++ rdev->cp1.wptr = RREG32(CP_RB1_WPTR);
++
++ /* ring2 - compute only */
++ /* Set ring buffer size */
++ rb_bufsz = drm_order(rdev->cp2.ring_size / 8);
++ tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
++#ifdef __BIG_ENDIAN
++ tmp |= BUF_SWAP_32BIT;
++#endif
++ WREG32(CP_RB2_CNTL, tmp);
++
++ /* Initialize the ring buffer's read and write pointers */
++ WREG32(CP_RB2_CNTL, tmp | RB_RPTR_WR_ENA);
++ WREG32(CP_RB2_WPTR, 0);
++
++ /* set the wb address wether it's enabled or not */
++ WREG32(CP_RB2_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET) & 0xFFFFFFFC);
++ WREG32(CP_RB2_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET) & 0xFF);
++
++ mdelay(1);
++ WREG32(CP_RB2_CNTL, tmp);
++
++ WREG32(CP_RB2_BASE, rdev->cp2.gpu_addr >> 8);
++
++ rdev->cp2.rptr = RREG32(CP_RB2_RPTR);
++ rdev->cp2.wptr = RREG32(CP_RB2_WPTR);
++
++ /* start the rings */
++ cayman_cp_start(rdev);
++ rdev->cp.ready = true;
++ rdev->cp1.ready = true;
++ rdev->cp2.ready = true;
++ /* this only test cp0 */
++ r = radeon_ring_test(rdev);
++ if (r) {
++ rdev->cp.ready = false;
++ rdev->cp1.ready = false;
++ rdev->cp2.ready = false;
++ return r;
++ }
++
++ return 0;
++}
++
++bool cayman_gpu_is_lockup(struct radeon_device *rdev)
++{
++ u32 srbm_status;
++ u32 grbm_status;
++ u32 grbm_status_se0, grbm_status_se1;
++ struct r100_gpu_lockup *lockup = &rdev->config.cayman.lockup;
++ int r;
++
++ srbm_status = RREG32(SRBM_STATUS);
++ grbm_status = RREG32(GRBM_STATUS);
++ grbm_status_se0 = RREG32(GRBM_STATUS_SE0);
++ grbm_status_se1 = RREG32(GRBM_STATUS_SE1);
++ if (!(grbm_status & GUI_ACTIVE)) {
++ r100_gpu_lockup_update(lockup, &rdev->cp);
++ return false;
++ }
++ /* force CP activities */
++ r = radeon_ring_lock(rdev, 2);
++ if (!r) {
++ /* PACKET2 NOP */
++ radeon_ring_write(rdev, 0x80000000);
++ radeon_ring_write(rdev, 0x80000000);
++ radeon_ring_unlock_commit(rdev);
++ }
++ /* XXX deal with CP0,1,2 */
++ rdev->cp.rptr = RREG32(CP_RB0_RPTR);
++ return r100_gpu_cp_is_lockup(rdev, lockup, &rdev->cp);
++}
++
++static int cayman_gpu_soft_reset(struct radeon_device *rdev)
++{
++ struct evergreen_mc_save save;
++ u32 grbm_reset = 0;
++
++ if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
++ return 0;
++
++ dev_info(rdev->dev, "GPU softreset \n");
++ dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
++ RREG32(GRBM_STATUS));
++ dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
++ RREG32(GRBM_STATUS_SE0));
++ dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
++ RREG32(GRBM_STATUS_SE1));
++ dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
++ RREG32(SRBM_STATUS));
++ evergreen_mc_stop(rdev, &save);
++ if (evergreen_mc_wait_for_idle(rdev)) {
++ dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
++ }
++ /* Disable CP parsing/prefetching */
++ WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
++
++ /* reset all the gfx blocks */
++ grbm_reset = (SOFT_RESET_CP |
++ SOFT_RESET_CB |
++ SOFT_RESET_DB |
++ SOFT_RESET_GDS |
++ SOFT_RESET_PA |
++ SOFT_RESET_SC |
++ SOFT_RESET_SPI |
++ SOFT_RESET_SH |
++ SOFT_RESET_SX |
++ SOFT_RESET_TC |
++ SOFT_RESET_TA |
++ SOFT_RESET_VGT |
++ SOFT_RESET_IA);
++
++ dev_info(rdev->dev, " GRBM_SOFT_RESET=0x%08X\n", grbm_reset);
++ WREG32(GRBM_SOFT_RESET, grbm_reset);
++ (void)RREG32(GRBM_SOFT_RESET);
++ udelay(50);
++ WREG32(GRBM_SOFT_RESET, 0);
++ (void)RREG32(GRBM_SOFT_RESET);
++ /* Wait a little for things to settle down */
++ udelay(50);
++ dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
++ RREG32(GRBM_STATUS));
++ dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
++ RREG32(GRBM_STATUS_SE0));
++ dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
++ RREG32(GRBM_STATUS_SE1));
++ dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
++ RREG32(SRBM_STATUS));
++ evergreen_mc_resume(rdev, &save);
++ return 0;
++}
++
++int cayman_asic_reset(struct radeon_device *rdev)
++{
++ return cayman_gpu_soft_reset(rdev);
++}
++
++static int cayman_startup(struct radeon_device *rdev)
++{
++ int r;
++
++ if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
++ r = ni_init_microcode(rdev);
++ if (r) {
++ DRM_ERROR("Failed to load firmware!\n");
++ return r;
++ }
++ }
++ r = ni_mc_load_microcode(rdev);
++ if (r) {
++ DRM_ERROR("Failed to load MC firmware!\n");
++ return r;
++ }
++
++ evergreen_mc_program(rdev);
++ r = cayman_pcie_gart_enable(rdev);
++ if (r)
++ return r;
++ cayman_gpu_init(rdev);
++
++#if 0
++ r = cayman_blit_init(rdev);
++ if (r) {
++ cayman_blit_fini(rdev);
++ rdev->asic->copy = NULL;
++ dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
++ }
++#endif
++
++ /* allocate wb buffer */
++ r = radeon_wb_init(rdev);
++ if (r)
++ return r;
++
++ /* Enable IRQ */
++ r = r600_irq_init(rdev);
++ if (r) {
++ DRM_ERROR("radeon: IH init failed (%d).\n", r);
++ radeon_irq_kms_fini(rdev);
++ return r;
++ }
++ evergreen_irq_set(rdev);
++
++ r = radeon_ring_init(rdev, rdev->cp.ring_size);
++ if (r)
++ return r;
++ r = cayman_cp_load_microcode(rdev);
++ if (r)
++ return r;
++ r = cayman_cp_resume(rdev);
++ if (r)
++ return r;
++
++ return 0;
++}
++
++int cayman_resume(struct radeon_device *rdev)
++{
++ int r;
++
++ /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
++ * posting will perform necessary task to bring back GPU into good
++ * shape.
++ */
++ /* post card */
++ atom_asic_init(rdev->mode_info.atom_context);
++
++ r = cayman_startup(rdev);
++ if (r) {
++ DRM_ERROR("cayman startup failed on resume\n");
++ return r;
++ }
++
++ r = r600_ib_test(rdev);
++ if (r) {
++ DRM_ERROR("radeon: failled testing IB (%d).\n", r);
++ return r;
++ }
++
++ return r;
++
++}
++
++int cayman_suspend(struct radeon_device *rdev)
++{
++ /* int r; */
++
++ /* FIXME: we should wait for ring to be empty */
++ cayman_cp_enable(rdev, false);
++ rdev->cp.ready = false;
++ evergreen_irq_suspend(rdev);
++ radeon_wb_disable(rdev);
++ cayman_pcie_gart_disable(rdev);
++
++#if 0
++ /* unpin shaders bo */
++ r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false);
++ if (likely(r == 0)) {
++ radeon_bo_unpin(rdev->r600_blit.shader_obj);
++ radeon_bo_unreserve(rdev->r600_blit.shader_obj);
++ }
++#endif
++ return 0;
++}
++
++/* Plan is to move initialization in that function and use
++ * helper function so that radeon_device_init pretty much
++ * do nothing more than calling asic specific function. This
++ * should also allow to remove a bunch of callback function
++ * like vram_info.
++ */
++int cayman_init(struct radeon_device *rdev)
++{
++ int r;
++
++ /* This don't do much */
++ r = radeon_gem_init(rdev);
++ if (r)
++ return r;
++ /* Read BIOS */
++ if (!radeon_get_bios(rdev)) {
++ if (ASIC_IS_AVIVO(rdev))
++ return -EINVAL;
++ }
++ /* Must be an ATOMBIOS */
++ if (!rdev->is_atom_bios) {
++ dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
++ return -EINVAL;
++ }
++ r = radeon_atombios_init(rdev);
++ if (r)
++ return r;
++
++ /* Post card if necessary */
++ if (!radeon_card_posted(rdev)) {
++ if (!rdev->bios) {
++ dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
++ return -EINVAL;
++ }
++ DRM_INFO("GPU not posted. posting now...\n");
++ atom_asic_init(rdev->mode_info.atom_context);
++ }
++ /* Initialize scratch registers */
++ r600_scratch_init(rdev);
++ /* Initialize surface registers */
++ radeon_surface_init(rdev);
++ /* Initialize clocks */
++ radeon_get_clock_info(rdev->ddev);
++ /* Fence driver */
++ r = radeon_fence_driver_init(rdev);
++ if (r)
++ return r;
++ /* initialize memory controller */
++ r = evergreen_mc_init(rdev);
++ if (r)
++ return r;
++ /* Memory manager */
++ r = radeon_bo_init(rdev);
++ if (r)
++ return r;
++
++ r = radeon_irq_kms_init(rdev);
++ if (r)
++ return r;
++
++ rdev->cp.ring_obj = NULL;
++ r600_ring_init(rdev, 1024 * 1024);
++
++ rdev->ih.ring_obj = NULL;
++ r600_ih_ring_init(rdev, 64 * 1024);
++
++ r = r600_pcie_gart_init(rdev);
++ if (r)
++ return r;
++
++ rdev->accel_working = true;
++ r = cayman_startup(rdev);
++ if (r) {
++ dev_err(rdev->dev, "disabling GPU acceleration\n");
++ cayman_cp_fini(rdev);
++ r600_irq_fini(rdev);
++ radeon_wb_fini(rdev);
++ radeon_irq_kms_fini(rdev);
++ cayman_pcie_gart_fini(rdev);
++ rdev->accel_working = false;
++ }
++ if (rdev->accel_working) {
++ r = radeon_ib_pool_init(rdev);
++ if (r) {
++ DRM_ERROR("radeon: failed initializing IB pool (%d).\n", r);
++ rdev->accel_working = false;
++ }
++ r = r600_ib_test(rdev);
++ if (r) {
++ DRM_ERROR("radeon: failed testing IB (%d).\n", r);
++ rdev->accel_working = false;
++ }
++ }
++
++ /* Don't start up if the MC ucode is missing.
++ * The default clocks and voltages before the MC ucode
++ * is loaded are not suffient for advanced operations.
++ */
++ if (!rdev->mc_fw) {
++ DRM_ERROR("radeon: MC ucode required for NI+.\n");
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++void cayman_fini(struct radeon_device *rdev)
++{
++ /* cayman_blit_fini(rdev); */
++ cayman_cp_fini(rdev);
++ r600_irq_fini(rdev);
++ radeon_wb_fini(rdev);
++ radeon_irq_kms_fini(rdev);
++ cayman_pcie_gart_fini(rdev);
++ radeon_gem_fini(rdev);
++ radeon_fence_driver_fini(rdev);
++ radeon_bo_fini(rdev);
++ radeon_atombios_fini(rdev);
++ kfree(rdev->bios);
++ rdev->bios = NULL;
++}
++
+diff --git a/drivers/gpu/drm/radeon/nid.h b/drivers/gpu/drm/radeon/nid.h
+index f7b4453..0f9a08b 100644
+--- a/drivers/gpu/drm/radeon/nid.h
++++ b/drivers/gpu/drm/radeon/nid.h
+@@ -24,7 +24,101 @@
+ #ifndef NI_H
+ #define NI_H
+
++#define CAYMAN_MAX_SH_GPRS 256
++#define CAYMAN_MAX_TEMP_GPRS 16
++#define CAYMAN_MAX_SH_THREADS 256
++#define CAYMAN_MAX_SH_STACK_ENTRIES 4096
++#define CAYMAN_MAX_FRC_EOV_CNT 16384
++#define CAYMAN_MAX_BACKENDS 8
++#define CAYMAN_MAX_BACKENDS_MASK 0xFF
++#define CAYMAN_MAX_BACKENDS_PER_SE_MASK 0xF
++#define CAYMAN_MAX_SIMDS 16
++#define CAYMAN_MAX_SIMDS_MASK 0xFFFF
++#define CAYMAN_MAX_SIMDS_PER_SE_MASK 0xFFF
++#define CAYMAN_MAX_PIPES 8
++#define CAYMAN_MAX_PIPES_MASK 0xFF
++#define CAYMAN_MAX_LDS_NUM 0xFFFF
++#define CAYMAN_MAX_TCC 16
++#define CAYMAN_MAX_TCC_MASK 0xFF
++
++#define DMIF_ADDR_CONFIG 0xBD4
++#define SRBM_STATUS 0x0E50
++
++#define VM_CONTEXT0_REQUEST_RESPONSE 0x1470
++#define REQUEST_TYPE(x) (((x) & 0xf) << 0)
++#define RESPONSE_TYPE_MASK 0x000000F0
++#define RESPONSE_TYPE_SHIFT 4
++#define VM_L2_CNTL 0x1400
++#define ENABLE_L2_CACHE (1 << 0)
++#define ENABLE_L2_FRAGMENT_PROCESSING (1 << 1)
++#define ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE (1 << 9)
++#define ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE (1 << 10)
++#define EFFECTIVE_L2_QUEUE_SIZE(x) (((x) & 7) << 14)
++#define CONTEXT1_IDENTITY_ACCESS_MODE(x) (((x) & 3) << 18)
++/* CONTEXT1_IDENTITY_ACCESS_MODE
++ * 0 physical = logical
++ * 1 logical via context1 page table
++ * 2 inside identity aperture use translation, outside physical = logical
++ * 3 inside identity aperture physical = logical, outside use translation
++ */
++#define VM_L2_CNTL2 0x1404
++#define INVALIDATE_ALL_L1_TLBS (1 << 0)
++#define INVALIDATE_L2_CACHE (1 << 1)
++#define VM_L2_CNTL3 0x1408
++#define BANK_SELECT(x) ((x) << 0)
++#define CACHE_UPDATE_MODE(x) ((x) << 6)
++#define L2_CACHE_BIGK_ASSOCIATIVITY (1 << 20)
++#define L2_CACHE_BIGK_FRAGMENT_SIZE(x) ((x) << 15)
++#define VM_L2_STATUS 0x140C
++#define L2_BUSY (1 << 0)
++#define VM_CONTEXT0_CNTL 0x1410
++#define ENABLE_CONTEXT (1 << 0)
++#define PAGE_TABLE_DEPTH(x) (((x) & 3) << 1)
++#define RANGE_PROTECTION_FAULT_ENABLE_DEFAULT (1 << 4)
++#define VM_CONTEXT1_CNTL 0x1414
++#define VM_CONTEXT0_CNTL2 0x1430
++#define VM_CONTEXT1_CNTL2 0x1434
++#define VM_INVALIDATE_REQUEST 0x1478
++#define VM_INVALIDATE_RESPONSE 0x147c
++#define VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR 0x1518
++#define VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR 0x151c
++#define VM_CONTEXT0_PAGE_TABLE_BASE_ADDR 0x153C
++#define VM_CONTEXT0_PAGE_TABLE_START_ADDR 0x155C
++#define VM_CONTEXT0_PAGE_TABLE_END_ADDR 0x157C
++
++#define MC_SHARED_CHMAP 0x2004
++#define NOOFCHAN_SHIFT 12
++#define NOOFCHAN_MASK 0x00003000
++#define MC_SHARED_CHREMAP 0x2008
++
++#define MC_VM_SYSTEM_APERTURE_LOW_ADDR 0x2034
++#define MC_VM_SYSTEM_APERTURE_HIGH_ADDR 0x2038
++#define MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR 0x203C
++#define MC_VM_MX_L1_TLB_CNTL 0x2064
++#define ENABLE_L1_TLB (1 << 0)
++#define ENABLE_L1_FRAGMENT_PROCESSING (1 << 1)
++#define SYSTEM_ACCESS_MODE_PA_ONLY (0 << 3)
++#define SYSTEM_ACCESS_MODE_USE_SYS_MAP (1 << 3)
++#define SYSTEM_ACCESS_MODE_IN_SYS (2 << 3)
++#define SYSTEM_ACCESS_MODE_NOT_IN_SYS (3 << 3)
++#define SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU (0 << 5)
++#define ENABLE_ADVANCED_DRIVER_MODEL (1 << 6)
++
+ #define MC_SHARED_BLACKOUT_CNTL 0x20ac
++#define MC_ARB_RAMCFG 0x2760
++#define NOOFBANK_SHIFT 0
++#define NOOFBANK_MASK 0x00000003
++#define NOOFRANK_SHIFT 2
++#define NOOFRANK_MASK 0x00000004
++#define NOOFROWS_SHIFT 3
++#define NOOFROWS_MASK 0x00000038
++#define NOOFCOLS_SHIFT 6
++#define NOOFCOLS_MASK 0x000000C0
++#define CHANSIZE_SHIFT 8
++#define CHANSIZE_MASK 0x00000100
++#define BURSTLENGTH_SHIFT 9
++#define BURSTLENGTH_MASK 0x00000200
++#define CHANSIZE_OVERRIDE (1 << 11)
+ #define MC_SEQ_SUP_CNTL 0x28c8
+ #define RUN_MASK (1 << 0)
+ #define MC_SEQ_SUP_PGM 0x28cc
+@@ -37,5 +131,406 @@
+ #define MC_SEQ_IO_DEBUG_INDEX 0x2a44
+ #define MC_SEQ_IO_DEBUG_DATA 0x2a48
+
++#define HDP_HOST_PATH_CNTL 0x2C00
++#define HDP_NONSURFACE_BASE 0x2C04
++#define HDP_NONSURFACE_INFO 0x2C08
++#define HDP_NONSURFACE_SIZE 0x2C0C
++#define HDP_ADDR_CONFIG 0x2F48
++
++#define CC_SYS_RB_BACKEND_DISABLE 0x3F88
++#define GC_USER_SYS_RB_BACKEND_DISABLE 0x3F8C
++#define CGTS_SYS_TCC_DISABLE 0x3F90
++#define CGTS_USER_SYS_TCC_DISABLE 0x3F94
++
++#define CONFIG_MEMSIZE 0x5428
++
++#define HDP_MEM_COHERENCY_FLUSH_CNTL 0x5480
++#define HDP_REG_COHERENCY_FLUSH_CNTL 0x54A0
++
++#define GRBM_CNTL 0x8000
++#define GRBM_READ_TIMEOUT(x) ((x) << 0)
++#define GRBM_STATUS 0x8010
++#define CMDFIFO_AVAIL_MASK 0x0000000F
++#define RING2_RQ_PENDING (1 << 4)
++#define SRBM_RQ_PENDING (1 << 5)
++#define RING1_RQ_PENDING (1 << 6)
++#define CF_RQ_PENDING (1 << 7)
++#define PF_RQ_PENDING (1 << 8)
++#define GDS_DMA_RQ_PENDING (1 << 9)
++#define GRBM_EE_BUSY (1 << 10)
++#define SX_CLEAN (1 << 11)
++#define DB_CLEAN (1 << 12)
++#define CB_CLEAN (1 << 13)
++#define TA_BUSY (1 << 14)
++#define GDS_BUSY (1 << 15)
++#define VGT_BUSY_NO_DMA (1 << 16)
++#define VGT_BUSY (1 << 17)
++#define IA_BUSY_NO_DMA (1 << 18)
++#define IA_BUSY (1 << 19)
++#define SX_BUSY (1 << 20)
++#define SH_BUSY (1 << 21)
++#define SPI_BUSY (1 << 22)
++#define SC_BUSY (1 << 24)
++#define PA_BUSY (1 << 25)
++#define DB_BUSY (1 << 26)
++#define CP_COHERENCY_BUSY (1 << 28)
++#define CP_BUSY (1 << 29)
++#define CB_BUSY (1 << 30)
++#define GUI_ACTIVE (1 << 31)
++#define GRBM_STATUS_SE0 0x8014
++#define GRBM_STATUS_SE1 0x8018
++#define SE_SX_CLEAN (1 << 0)
++#define SE_DB_CLEAN (1 << 1)
++#define SE_CB_CLEAN (1 << 2)
++#define SE_VGT_BUSY (1 << 23)
++#define SE_PA_BUSY (1 << 24)
++#define SE_TA_BUSY (1 << 25)
++#define SE_SX_BUSY (1 << 26)
++#define SE_SPI_BUSY (1 << 27)
++#define SE_SH_BUSY (1 << 28)
++#define SE_SC_BUSY (1 << 29)
++#define SE_DB_BUSY (1 << 30)
++#define SE_CB_BUSY (1 << 31)
++#define GRBM_SOFT_RESET 0x8020
++#define SOFT_RESET_CP (1 << 0)
++#define SOFT_RESET_CB (1 << 1)
++#define SOFT_RESET_DB (1 << 3)
++#define SOFT_RESET_GDS (1 << 4)
++#define SOFT_RESET_PA (1 << 5)
++#define SOFT_RESET_SC (1 << 6)
++#define SOFT_RESET_SPI (1 << 8)
++#define SOFT_RESET_SH (1 << 9)
++#define SOFT_RESET_SX (1 << 10)
++#define SOFT_RESET_TC (1 << 11)
++#define SOFT_RESET_TA (1 << 12)
++#define SOFT_RESET_VGT (1 << 14)
++#define SOFT_RESET_IA (1 << 15)
++
++#define SCRATCH_REG0 0x8500
++#define SCRATCH_REG1 0x8504
++#define SCRATCH_REG2 0x8508
++#define SCRATCH_REG3 0x850C
++#define SCRATCH_REG4 0x8510
++#define SCRATCH_REG5 0x8514
++#define SCRATCH_REG6 0x8518
++#define SCRATCH_REG7 0x851C
++#define SCRATCH_UMSK 0x8540
++#define SCRATCH_ADDR 0x8544
++#define CP_SEM_WAIT_TIMER 0x85BC
++#define CP_ME_CNTL 0x86D8
++#define CP_ME_HALT (1 << 28)
++#define CP_PFP_HALT (1 << 26)
++#define CP_RB2_RPTR 0x86f8
++#define CP_RB1_RPTR 0x86fc
++#define CP_RB0_RPTR 0x8700
++#define CP_RB_WPTR_DELAY 0x8704
++#define CP_MEQ_THRESHOLDS 0x8764
++#define MEQ1_START(x) ((x) << 0)
++#define MEQ2_START(x) ((x) << 8)
++#define CP_PERFMON_CNTL 0x87FC
++
++#define VGT_CACHE_INVALIDATION 0x88C4
++#define CACHE_INVALIDATION(x) ((x) << 0)
++#define VC_ONLY 0
++#define TC_ONLY 1
++#define VC_AND_TC 2
++#define AUTO_INVLD_EN(x) ((x) << 6)
++#define NO_AUTO 0
++#define ES_AUTO 1
++#define GS_AUTO 2
++#define ES_AND_GS_AUTO 3
++#define VGT_GS_VERTEX_REUSE 0x88D4
++
++#define CC_GC_SHADER_PIPE_CONFIG 0x8950
++#define GC_USER_SHADER_PIPE_CONFIG 0x8954
++#define INACTIVE_QD_PIPES(x) ((x) << 8)
++#define INACTIVE_QD_PIPES_MASK 0x0000FF00
++#define INACTIVE_QD_PIPES_SHIFT 8
++#define INACTIVE_SIMDS(x) ((x) << 16)
++#define INACTIVE_SIMDS_MASK 0xFFFF0000
++#define INACTIVE_SIMDS_SHIFT 16
++
++#define VGT_PRIMITIVE_TYPE 0x8958
++#define VGT_NUM_INSTANCES 0x8974
++#define VGT_TF_RING_SIZE 0x8988
++#define VGT_OFFCHIP_LDS_BASE 0x89b4
++
++#define PA_SC_LINE_STIPPLE_STATE 0x8B10
++#define PA_CL_ENHANCE 0x8A14
++#define CLIP_VTX_REORDER_ENA (1 << 0)
++#define NUM_CLIP_SEQ(x) ((x) << 1)
++#define PA_SC_FIFO_SIZE 0x8BCC
++#define SC_PRIM_FIFO_SIZE(x) ((x) << 0)
++#define SC_HIZ_TILE_FIFO_SIZE(x) ((x) << 12)
++#define SC_EARLYZ_TILE_FIFO_SIZE(x) ((x) << 20)
++#define PA_SC_FORCE_EOV_MAX_CNTS 0x8B24
++#define FORCE_EOV_MAX_CLK_CNT(x) ((x) << 0)
++#define FORCE_EOV_MAX_REZ_CNT(x) ((x) << 16)
++
++#define SQ_CONFIG 0x8C00
++#define VC_ENABLE (1 << 0)
++#define EXPORT_SRC_C (1 << 1)
++#define GFX_PRIO(x) ((x) << 2)
++#define CS1_PRIO(x) ((x) << 4)
++#define CS2_PRIO(x) ((x) << 6)
++#define SQ_GPR_RESOURCE_MGMT_1 0x8C04
++#define NUM_PS_GPRS(x) ((x) << 0)
++#define NUM_VS_GPRS(x) ((x) << 16)
++#define NUM_CLAUSE_TEMP_GPRS(x) ((x) << 28)
++#define SQ_ESGS_RING_SIZE 0x8c44
++#define SQ_GSVS_RING_SIZE 0x8c4c
++#define SQ_ESTMP_RING_BASE 0x8c50
++#define SQ_ESTMP_RING_SIZE 0x8c54
++#define SQ_GSTMP_RING_BASE 0x8c58
++#define SQ_GSTMP_RING_SIZE 0x8c5c
++#define SQ_VSTMP_RING_BASE 0x8c60
++#define SQ_VSTMP_RING_SIZE 0x8c64
++#define SQ_PSTMP_RING_BASE 0x8c68
++#define SQ_PSTMP_RING_SIZE 0x8c6c
++#define SQ_MS_FIFO_SIZES 0x8CF0
++#define CACHE_FIFO_SIZE(x) ((x) << 0)
++#define FETCH_FIFO_HIWATER(x) ((x) << 8)
++#define DONE_FIFO_HIWATER(x) ((x) << 16)
++#define ALU_UPDATE_FIFO_HIWATER(x) ((x) << 24)
++#define SQ_LSTMP_RING_BASE 0x8e10
++#define SQ_LSTMP_RING_SIZE 0x8e14
++#define SQ_HSTMP_RING_BASE 0x8e18
++#define SQ_HSTMP_RING_SIZE 0x8e1c
++#define SQ_DYN_GPR_CNTL_PS_FLUSH_REQ 0x8D8C
++#define DYN_GPR_ENABLE (1 << 8)
++#define SQ_CONST_MEM_BASE 0x8df8
++
++#define SX_EXPORT_BUFFER_SIZES 0x900C
++#define COLOR_BUFFER_SIZE(x) ((x) << 0)
++#define POSITION_BUFFER_SIZE(x) ((x) << 8)
++#define SMX_BUFFER_SIZE(x) ((x) << 16)
++#define SX_DEBUG_1 0x9058
++#define ENABLE_NEW_SMX_ADDRESS (1 << 16)
++
++#define SPI_CONFIG_CNTL 0x9100
++#define GPR_WRITE_PRIORITY(x) ((x) << 0)
++#define SPI_CONFIG_CNTL_1 0x913C
++#define VTX_DONE_DELAY(x) ((x) << 0)
++#define INTERP_ONE_PRIM_PER_ROW (1 << 4)
++#define CRC_SIMD_ID_WADDR_DISABLE (1 << 8)
++
++#define CGTS_TCC_DISABLE 0x9148
++#define CGTS_USER_TCC_DISABLE 0x914C
++#define TCC_DISABLE_MASK 0xFFFF0000
++#define TCC_DISABLE_SHIFT 16
++#define CGTS_SM_CTRL_REG 0x915C
++#define OVERRIDE (1 << 21)
++
++#define TA_CNTL_AUX 0x9508
++#define DISABLE_CUBE_WRAP (1 << 0)
++#define DISABLE_CUBE_ANISO (1 << 1)
++
++#define TCP_CHAN_STEER_LO 0x960c
++#define TCP_CHAN_STEER_HI 0x9610
++
++#define CC_RB_BACKEND_DISABLE 0x98F4
++#define BACKEND_DISABLE(x) ((x) << 16)
++#define GB_ADDR_CONFIG 0x98F8
++#define NUM_PIPES(x) ((x) << 0)
++#define NUM_PIPES_MASK 0x00000007
++#define NUM_PIPES_SHIFT 0
++#define PIPE_INTERLEAVE_SIZE(x) ((x) << 4)
++#define PIPE_INTERLEAVE_SIZE_MASK 0x00000070
++#define PIPE_INTERLEAVE_SIZE_SHIFT 4
++#define BANK_INTERLEAVE_SIZE(x) ((x) << 8)
++#define NUM_SHADER_ENGINES(x) ((x) << 12)
++#define NUM_SHADER_ENGINES_MASK 0x00003000
++#define NUM_SHADER_ENGINES_SHIFT 12
++#define SHADER_ENGINE_TILE_SIZE(x) ((x) << 16)
++#define SHADER_ENGINE_TILE_SIZE_MASK 0x00070000
++#define SHADER_ENGINE_TILE_SIZE_SHIFT 16
++#define NUM_GPUS(x) ((x) << 20)
++#define NUM_GPUS_MASK 0x00700000
++#define NUM_GPUS_SHIFT 20
++#define MULTI_GPU_TILE_SIZE(x) ((x) << 24)
++#define MULTI_GPU_TILE_SIZE_MASK 0x03000000
++#define MULTI_GPU_TILE_SIZE_SHIFT 24
++#define ROW_SIZE(x) ((x) << 28)
++#define ROW_SIZE_MASK 0x30000007
++#define ROW_SIZE_SHIFT 28
++#define NUM_LOWER_PIPES(x) ((x) << 30)
++#define NUM_LOWER_PIPES_MASK 0x40000000
++#define NUM_LOWER_PIPES_SHIFT 30
++#define GB_BACKEND_MAP 0x98FC
++
++#define CB_PERF_CTR0_SEL_0 0x9A20
++#define CB_PERF_CTR0_SEL_1 0x9A24
++#define CB_PERF_CTR1_SEL_0 0x9A28
++#define CB_PERF_CTR1_SEL_1 0x9A2C
++#define CB_PERF_CTR2_SEL_0 0x9A30
++#define CB_PERF_CTR2_SEL_1 0x9A34
++#define CB_PERF_CTR3_SEL_0 0x9A38
++#define CB_PERF_CTR3_SEL_1 0x9A3C
++
++#define GC_USER_RB_BACKEND_DISABLE 0x9B7C
++#define BACKEND_DISABLE_MASK 0x00FF0000
++#define BACKEND_DISABLE_SHIFT 16
++
++#define SMX_DC_CTL0 0xA020
++#define USE_HASH_FUNCTION (1 << 0)
++#define NUMBER_OF_SETS(x) ((x) << 1)
++#define FLUSH_ALL_ON_EVENT (1 << 10)
++#define STALL_ON_EVENT (1 << 11)
++#define SMX_EVENT_CTL 0xA02C
++#define ES_FLUSH_CTL(x) ((x) << 0)
++#define GS_FLUSH_CTL(x) ((x) << 3)
++#define ACK_FLUSH_CTL(x) ((x) << 6)
++#define SYNC_FLUSH_CTL (1 << 8)
++
++#define CP_RB0_BASE 0xC100
++#define CP_RB0_CNTL 0xC104
++#define RB_BUFSZ(x) ((x) << 0)
++#define RB_BLKSZ(x) ((x) << 8)
++#define RB_NO_UPDATE (1 << 27)
++#define RB_RPTR_WR_ENA (1 << 31)
++#define BUF_SWAP_32BIT (2 << 16)
++#define CP_RB0_RPTR_ADDR 0xC10C
++#define CP_RB0_RPTR_ADDR_HI 0xC110
++#define CP_RB0_WPTR 0xC114
++#define CP_RB1_BASE 0xC180
++#define CP_RB1_CNTL 0xC184
++#define CP_RB1_RPTR_ADDR 0xC188
++#define CP_RB1_RPTR_ADDR_HI 0xC18C
++#define CP_RB1_WPTR 0xC190
++#define CP_RB2_BASE 0xC194
++#define CP_RB2_CNTL 0xC198
++#define CP_RB2_RPTR_ADDR 0xC19C
++#define CP_RB2_RPTR_ADDR_HI 0xC1A0
++#define CP_RB2_WPTR 0xC1A4
++#define CP_PFP_UCODE_ADDR 0xC150
++#define CP_PFP_UCODE_DATA 0xC154
++#define CP_ME_RAM_RADDR 0xC158
++#define CP_ME_RAM_WADDR 0xC15C
++#define CP_ME_RAM_DATA 0xC160
++#define CP_DEBUG 0xC1FC
++
++/*
++ * PM4
++ */
++#define PACKET_TYPE0 0
++#define PACKET_TYPE1 1
++#define PACKET_TYPE2 2
++#define PACKET_TYPE3 3
++
++#define CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3)
++#define CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF)
++#define CP_PACKET0_GET_REG(h) (((h) & 0xFFFF) << 2)
++#define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF)
++#define PACKET0(reg, n) ((PACKET_TYPE0 << 30) | \
++ (((reg) >> 2) & 0xFFFF) | \
++ ((n) & 0x3FFF) << 16)
++#define CP_PACKET2 0x80000000
++#define PACKET2_PAD_SHIFT 0
++#define PACKET2_PAD_MASK (0x3fffffff << 0)
++
++#define PACKET2(v) (CP_PACKET2 | REG_SET(PACKET2_PAD, (v)))
++
++#define PACKET3(op, n) ((PACKET_TYPE3 << 30) | \
++ (((op) & 0xFF) << 8) | \
++ ((n) & 0x3FFF) << 16)
++
++/* Packet 3 types */
++#define PACKET3_NOP 0x10
++#define PACKET3_SET_BASE 0x11
++#define PACKET3_CLEAR_STATE 0x12
++#define PACKET3_INDEX_BUFFER_SIZE 0x13
++#define PACKET3_DEALLOC_STATE 0x14
++#define PACKET3_DISPATCH_DIRECT 0x15
++#define PACKET3_DISPATCH_INDIRECT 0x16
++#define PACKET3_INDIRECT_BUFFER_END 0x17
++#define PACKET3_SET_PREDICATION 0x20
++#define PACKET3_REG_RMW 0x21
++#define PACKET3_COND_EXEC 0x22
++#define PACKET3_PRED_EXEC 0x23
++#define PACKET3_DRAW_INDIRECT 0x24
++#define PACKET3_DRAW_INDEX_INDIRECT 0x25
++#define PACKET3_INDEX_BASE 0x26
++#define PACKET3_DRAW_INDEX_2 0x27
++#define PACKET3_CONTEXT_CONTROL 0x28
++#define PACKET3_DRAW_INDEX_OFFSET 0x29
++#define PACKET3_INDEX_TYPE 0x2A
++#define PACKET3_DRAW_INDEX 0x2B
++#define PACKET3_DRAW_INDEX_AUTO 0x2D
++#define PACKET3_DRAW_INDEX_IMMD 0x2E
++#define PACKET3_NUM_INSTANCES 0x2F
++#define PACKET3_DRAW_INDEX_MULTI_AUTO 0x30
++#define PACKET3_INDIRECT_BUFFER 0x32
++#define PACKET3_STRMOUT_BUFFER_UPDATE 0x34
++#define PACKET3_DRAW_INDEX_OFFSET_2 0x35
++#define PACKET3_DRAW_INDEX_MULTI_ELEMENT 0x36
++#define PACKET3_WRITE_DATA 0x37
++#define PACKET3_MEM_SEMAPHORE 0x39
++#define PACKET3_MPEG_INDEX 0x3A
++#define PACKET3_WAIT_REG_MEM 0x3C
++#define PACKET3_MEM_WRITE 0x3D
++#define PACKET3_SURFACE_SYNC 0x43
++# define PACKET3_CB0_DEST_BASE_ENA (1 << 6)
++# define PACKET3_CB1_DEST_BASE_ENA (1 << 7)
++# define PACKET3_CB2_DEST_BASE_ENA (1 << 8)
++# define PACKET3_CB3_DEST_BASE_ENA (1 << 9)
++# define PACKET3_CB4_DEST_BASE_ENA (1 << 10)
++# define PACKET3_CB5_DEST_BASE_ENA (1 << 11)
++# define PACKET3_CB6_DEST_BASE_ENA (1 << 12)
++# define PACKET3_CB7_DEST_BASE_ENA (1 << 13)
++# define PACKET3_DB_DEST_BASE_ENA (1 << 14)
++# define PACKET3_CB8_DEST_BASE_ENA (1 << 15)
++# define PACKET3_CB9_DEST_BASE_ENA (1 << 16)
++# define PACKET3_CB10_DEST_BASE_ENA (1 << 17)
++# define PACKET3_CB11_DEST_BASE_ENA (1 << 18)
++# define PACKET3_FULL_CACHE_ENA (1 << 20)
++# define PACKET3_TC_ACTION_ENA (1 << 23)
++# define PACKET3_CB_ACTION_ENA (1 << 25)
++# define PACKET3_DB_ACTION_ENA (1 << 26)
++# define PACKET3_SH_ACTION_ENA (1 << 27)
++# define PACKET3_SX_ACTION_ENA (1 << 28)
++#define PACKET3_ME_INITIALIZE 0x44
++#define PACKET3_ME_INITIALIZE_DEVICE_ID(x) ((x) << 16)
++#define PACKET3_COND_WRITE 0x45
++#define PACKET3_EVENT_WRITE 0x46
++#define PACKET3_EVENT_WRITE_EOP 0x47
++#define PACKET3_EVENT_WRITE_EOS 0x48
++#define PACKET3_PREAMBLE_CNTL 0x4A
++# define PACKET3_PREAMBLE_BEGIN_CLEAR_STATE (2 << 28)
++# define PACKET3_PREAMBLE_END_CLEAR_STATE (3 << 28)
++#define PACKET3_ALU_PS_CONST_BUFFER_COPY 0x4C
++#define PACKET3_ALU_VS_CONST_BUFFER_COPY 0x4D
++#define PACKET3_ALU_PS_CONST_UPDATE 0x4E
++#define PACKET3_ALU_VS_CONST_UPDATE 0x4F
++#define PACKET3_ONE_REG_WRITE 0x57
++#define PACKET3_SET_CONFIG_REG 0x68
++#define PACKET3_SET_CONFIG_REG_START 0x00008000
++#define PACKET3_SET_CONFIG_REG_END 0x0000ac00
++#define PACKET3_SET_CONTEXT_REG 0x69
++#define PACKET3_SET_CONTEXT_REG_START 0x00028000
++#define PACKET3_SET_CONTEXT_REG_END 0x00029000
++#define PACKET3_SET_ALU_CONST 0x6A
++/* alu const buffers only; no reg file */
++#define PACKET3_SET_BOOL_CONST 0x6B
++#define PACKET3_SET_BOOL_CONST_START 0x0003a500
++#define PACKET3_SET_BOOL_CONST_END 0x0003a518
++#define PACKET3_SET_LOOP_CONST 0x6C
++#define PACKET3_SET_LOOP_CONST_START 0x0003a200
++#define PACKET3_SET_LOOP_CONST_END 0x0003a500
++#define PACKET3_SET_RESOURCE 0x6D
++#define PACKET3_SET_RESOURCE_START 0x00030000
++#define PACKET3_SET_RESOURCE_END 0x00038000
++#define PACKET3_SET_SAMPLER 0x6E
++#define PACKET3_SET_SAMPLER_START 0x0003c000
++#define PACKET3_SET_SAMPLER_END 0x0003c600
++#define PACKET3_SET_CTL_CONST 0x6F
++#define PACKET3_SET_CTL_CONST_START 0x0003cff0
++#define PACKET3_SET_CTL_CONST_END 0x0003ff0c
++#define PACKET3_SET_RESOURCE_OFFSET 0x70
++#define PACKET3_SET_ALU_CONST_VS 0x71
++#define PACKET3_SET_ALU_CONST_DI 0x72
++#define PACKET3_SET_CONTEXT_REG_INDIRECT 0x73
++#define PACKET3_SET_RESOURCE_INDIRECT 0x74
++#define PACKET3_SET_APPEND_CNT 0x75
++
+ #endif
+
+diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
+index 9b3fad2..70e9fb0 100644
+--- a/drivers/gpu/drm/radeon/r600.c
++++ b/drivers/gpu/drm/radeon/r600.c
+@@ -47,6 +47,7 @@
+ #define EVERGREEN_PFP_UCODE_SIZE 1120
+ #define EVERGREEN_PM4_UCODE_SIZE 1376
+ #define EVERGREEN_RLC_UCODE_SIZE 768
++#define CAYMAN_RLC_UCODE_SIZE 1024
+
+ /* Firmware Names */
+ /*(DEBLOBBED)*/
+@@ -586,7 +587,7 @@ void r600_pm_misc(struct radeon_device *rdev)
+
+ if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
+ if (voltage->voltage != rdev->pm.current_vddc) {
+- radeon_atom_set_voltage(rdev, voltage->voltage);
++ radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
+ rdev->pm.current_vddc = voltage->voltage;
+ DRM_DEBUG_DRIVER("Setting: v: %d\n", voltage->voltage);
+ }
+@@ -2820,13 +2821,20 @@ static int r600_rlc_init(struct radeon_device *rdev)
+ WREG32(RLC_HB_CNTL, 0);
+ WREG32(RLC_HB_RPTR, 0);
+ WREG32(RLC_HB_WPTR, 0);
+- WREG32(RLC_HB_WPTR_LSB_ADDR, 0);
+- WREG32(RLC_HB_WPTR_MSB_ADDR, 0);
++ if (rdev->family <= CHIP_CAICOS) {
++ WREG32(RLC_HB_WPTR_LSB_ADDR, 0);
++ WREG32(RLC_HB_WPTR_MSB_ADDR, 0);
++ }
+ WREG32(RLC_MC_CNTL, 0);
+ WREG32(RLC_UCODE_CNTL, 0);
+
+ fw_data = (const __be32 *)rdev->rlc_fw->data;
+- if (rdev->family >= CHIP_CEDAR) {
++ if (rdev->family >= CHIP_CAYMAN) {
++ for (i = 0; i < CAYMAN_RLC_UCODE_SIZE; i++) {
++ WREG32(RLC_UCODE_ADDR, i);
++ WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
++ }
++ } else if (rdev->family >= CHIP_CEDAR) {
+ for (i = 0; i < EVERGREEN_RLC_UCODE_SIZE; i++) {
+ WREG32(RLC_UCODE_ADDR, i);
+ WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
+@@ -3227,7 +3235,7 @@ static inline u32 r600_get_ih_wptr(struct radeon_device *rdev)
+ u32 wptr, tmp;
+
+ if (rdev->wb.enabled)
+- wptr = rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4];
++ wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);
+ else
+ wptr = RREG32(IH_RB_WPTR);
+
+diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c
+index 153095f..0a0848f 100644
+--- a/drivers/gpu/drm/radeon/r600_cs.c
++++ b/drivers/gpu/drm/radeon/r600_cs.c
+@@ -71,75 +71,167 @@ struct r600_cs_track {
+ u64 db_bo_mc;
+ };
+
++#define FMT_8_BIT(fmt, vc) [fmt] = { 1, 1, 1, vc }
++#define FMT_16_BIT(fmt, vc) [fmt] = { 1, 1, 2, vc }
++#define FMT_24_BIT(fmt) [fmt] = { 1, 1, 3, 0 }
++#define FMT_32_BIT(fmt, vc) [fmt] = { 1, 1, 4, vc }
++#define FMT_48_BIT(fmt) [fmt] = { 1, 1, 6, 0 }
++#define FMT_64_BIT(fmt, vc) [fmt] = { 1, 1, 8, vc }
++#define FMT_96_BIT(fmt) [fmt] = { 1, 1, 12, 0 }
++#define FMT_128_BIT(fmt, vc) [fmt] = { 1, 1, 16, vc }
++
++struct gpu_formats {
++ unsigned blockwidth;
++ unsigned blockheight;
++ unsigned blocksize;
++ unsigned valid_color;
++};
++
++static const struct gpu_formats color_formats_table[] = {
++ /* 8 bit */
++ FMT_8_BIT(V_038004_COLOR_8, 1),
++ FMT_8_BIT(V_038004_COLOR_4_4, 1),
++ FMT_8_BIT(V_038004_COLOR_3_3_2, 1),
++ FMT_8_BIT(V_038004_FMT_1, 0),
++
++ /* 16-bit */
++ FMT_16_BIT(V_038004_COLOR_16, 1),
++ FMT_16_BIT(V_038004_COLOR_16_FLOAT, 1),
++ FMT_16_BIT(V_038004_COLOR_8_8, 1),
++ FMT_16_BIT(V_038004_COLOR_5_6_5, 1),
++ FMT_16_BIT(V_038004_COLOR_6_5_5, 1),
++ FMT_16_BIT(V_038004_COLOR_1_5_5_5, 1),
++ FMT_16_BIT(V_038004_COLOR_4_4_4_4, 1),
++ FMT_16_BIT(V_038004_COLOR_5_5_5_1, 1),
++
++ /* 24-bit */
++ FMT_24_BIT(V_038004_FMT_8_8_8),
++
++ /* 32-bit */
++ FMT_32_BIT(V_038004_COLOR_32, 1),
++ FMT_32_BIT(V_038004_COLOR_32_FLOAT, 1),
++ FMT_32_BIT(V_038004_COLOR_16_16, 1),
++ FMT_32_BIT(V_038004_COLOR_16_16_FLOAT, 1),
++ FMT_32_BIT(V_038004_COLOR_8_24, 1),
++ FMT_32_BIT(V_038004_COLOR_8_24_FLOAT, 1),
++ FMT_32_BIT(V_038004_COLOR_24_8, 1),
++ FMT_32_BIT(V_038004_COLOR_24_8_FLOAT, 1),
++ FMT_32_BIT(V_038004_COLOR_10_11_11, 1),
++ FMT_32_BIT(V_038004_COLOR_10_11_11_FLOAT, 1),
++ FMT_32_BIT(V_038004_COLOR_11_11_10, 1),
++ FMT_32_BIT(V_038004_COLOR_11_11_10_FLOAT, 1),
++ FMT_32_BIT(V_038004_COLOR_2_10_10_10, 1),
++ FMT_32_BIT(V_038004_COLOR_8_8_8_8, 1),
++ FMT_32_BIT(V_038004_COLOR_10_10_10_2, 1),
++ FMT_32_BIT(V_038004_FMT_5_9_9_9_SHAREDEXP, 0),
++ FMT_32_BIT(V_038004_FMT_32_AS_8, 0),
++ FMT_32_BIT(V_038004_FMT_32_AS_8_8, 0),
++
++ /* 48-bit */
++ FMT_48_BIT(V_038004_FMT_16_16_16),
++ FMT_48_BIT(V_038004_FMT_16_16_16_FLOAT),
++
++ /* 64-bit */
++ FMT_64_BIT(V_038004_COLOR_X24_8_32_FLOAT, 1),
++ FMT_64_BIT(V_038004_COLOR_32_32, 1),
++ FMT_64_BIT(V_038004_COLOR_32_32_FLOAT, 1),
++ FMT_64_BIT(V_038004_COLOR_16_16_16_16, 1),
++ FMT_64_BIT(V_038004_COLOR_16_16_16_16_FLOAT, 1),
++
++ FMT_96_BIT(V_038004_FMT_32_32_32),
++ FMT_96_BIT(V_038004_FMT_32_32_32_FLOAT),
++
++ /* 128-bit */
++ FMT_128_BIT(V_038004_COLOR_32_32_32_32, 1),
++ FMT_128_BIT(V_038004_COLOR_32_32_32_32_FLOAT, 1),
++
++ [V_038004_FMT_GB_GR] = { 2, 1, 4, 0 },
++ [V_038004_FMT_BG_RG] = { 2, 1, 4, 0 },
++
++ /* block compressed formats */
++ [V_038004_FMT_BC1] = { 4, 4, 8, 0 },
++ [V_038004_FMT_BC2] = { 4, 4, 16, 0 },
++ [V_038004_FMT_BC3] = { 4, 4, 16, 0 },
++ [V_038004_FMT_BC4] = { 4, 4, 8, 0 },
++ [V_038004_FMT_BC5] = { 4, 4, 16, 0},
++
++};
++
++static inline bool fmt_is_valid_color(u32 format)
++{
++ if (format >= ARRAY_SIZE(color_formats_table))
++ return false;
++
++ if (color_formats_table[format].valid_color)
++ return true;
++
++ return false;
++}
++
++static inline bool fmt_is_valid_texture(u32 format)
++{
++ if (format >= ARRAY_SIZE(color_formats_table))
++ return false;
++
++ if (color_formats_table[format].blockwidth > 0)
++ return true;
++
++ return false;
++}
++
++static inline int fmt_get_blocksize(u32 format)
++{
++ if (format >= ARRAY_SIZE(color_formats_table))
++ return 0;
++
++ return color_formats_table[format].blocksize;
++}
++
++static inline int fmt_get_nblocksx(u32 format, u32 w)
++{
++ unsigned bw;
++
++ if (format >= ARRAY_SIZE(color_formats_table))
++ return 0;
++
++ bw = color_formats_table[format].blockwidth;
++ if (bw == 0)
++ return 0;
++
++ return (w + bw - 1) / bw;
++}
++
++static inline int fmt_get_nblocksy(u32 format, u32 h)
++{
++ unsigned bh;
++
++ if (format >= ARRAY_SIZE(color_formats_table))
++ return 0;
++
++ bh = color_formats_table[format].blockheight;
++ if (bh == 0)
++ return 0;
++
++ return (h + bh - 1) / bh;
++}
++
+ static inline int r600_bpe_from_format(u32 *bpe, u32 format)
+ {
+- switch (format) {
+- case V_038004_COLOR_8:
+- case V_038004_COLOR_4_4:
+- case V_038004_COLOR_3_3_2:
+- case V_038004_FMT_1:
+- *bpe = 1;
+- break;
+- case V_038004_COLOR_16:
+- case V_038004_COLOR_16_FLOAT:
+- case V_038004_COLOR_8_8:
+- case V_038004_COLOR_5_6_5:
+- case V_038004_COLOR_6_5_5:
+- case V_038004_COLOR_1_5_5_5:
+- case V_038004_COLOR_4_4_4_4:
+- case V_038004_COLOR_5_5_5_1:
+- *bpe = 2;
+- break;
+- case V_038004_FMT_8_8_8:
+- *bpe = 3;
+- break;
+- case V_038004_COLOR_32:
+- case V_038004_COLOR_32_FLOAT:
+- case V_038004_COLOR_16_16:
+- case V_038004_COLOR_16_16_FLOAT:
+- case V_038004_COLOR_8_24:
+- case V_038004_COLOR_8_24_FLOAT:
+- case V_038004_COLOR_24_8:
+- case V_038004_COLOR_24_8_FLOAT:
+- case V_038004_COLOR_10_11_11:
+- case V_038004_COLOR_10_11_11_FLOAT:
+- case V_038004_COLOR_11_11_10:
+- case V_038004_COLOR_11_11_10_FLOAT:
+- case V_038004_COLOR_2_10_10_10:
+- case V_038004_COLOR_8_8_8_8:
+- case V_038004_COLOR_10_10_10_2:
+- case V_038004_FMT_5_9_9_9_SHAREDEXP:
+- case V_038004_FMT_32_AS_8:
+- case V_038004_FMT_32_AS_8_8:
+- *bpe = 4;
+- break;
+- case V_038004_COLOR_X24_8_32_FLOAT:
+- case V_038004_COLOR_32_32:
+- case V_038004_COLOR_32_32_FLOAT:
+- case V_038004_COLOR_16_16_16_16:
+- case V_038004_COLOR_16_16_16_16_FLOAT:
+- *bpe = 8;
+- break;
+- case V_038004_FMT_16_16_16:
+- case V_038004_FMT_16_16_16_FLOAT:
+- *bpe = 6;
+- break;
+- case V_038004_FMT_32_32_32:
+- case V_038004_FMT_32_32_32_FLOAT:
+- *bpe = 12;
+- break;
+- case V_038004_COLOR_32_32_32_32:
+- case V_038004_COLOR_32_32_32_32_FLOAT:
+- *bpe = 16;
+- break;
+- case V_038004_FMT_GB_GR:
+- case V_038004_FMT_BG_RG:
+- case V_038004_COLOR_INVALID:
+- default:
+- *bpe = 16;
+- return -EINVAL;
+- }
++ unsigned res;
++
++ if (format >= ARRAY_SIZE(color_formats_table))
++ goto fail;
++
++ res = color_formats_table[format].blocksize;
++ if (res == 0)
++ goto fail;
++
++ *bpe = res;
+ return 0;
++
++fail:
++ *bpe = 16;
++ return -EINVAL;
+ }
+
+ struct array_mode_checker {
+@@ -148,7 +240,7 @@ struct array_mode_checker {
+ u32 nbanks;
+ u32 npipes;
+ u32 nsamples;
+- u32 bpe;
++ u32 blocksize;
+ };
+
+ /* returns alignment in pixels for pitch/height/depth and bytes for base */
+@@ -162,7 +254,7 @@ static inline int r600_get_array_mode_alignment(struct array_mode_checker *value
+ u32 tile_height = 8;
+ u32 macro_tile_width = values->nbanks;
+ u32 macro_tile_height = values->npipes;
+- u32 tile_bytes = tile_width * tile_height * values->bpe * values->nsamples;
++ u32 tile_bytes = tile_width * tile_height * values->blocksize * values->nsamples;
+ u32 macro_tile_bytes = macro_tile_width * macro_tile_height * tile_bytes;
+
+ switch (values->array_mode) {
+@@ -174,7 +266,7 @@ static inline int r600_get_array_mode_alignment(struct array_mode_checker *value
+ *base_align = 1;
+ break;
+ case ARRAY_LINEAR_ALIGNED:
+- *pitch_align = max((u32)64, (u32)(values->group_size / values->bpe));
++ *pitch_align = max((u32)64, (u32)(values->group_size / values->blocksize));
+ *height_align = tile_height;
+ *depth_align = 1;
+ *base_align = values->group_size;
+@@ -182,7 +274,7 @@ static inline int r600_get_array_mode_alignment(struct array_mode_checker *value
+ case ARRAY_1D_TILED_THIN1:
+ *pitch_align = max((u32)tile_width,
+ (u32)(values->group_size /
+- (tile_height * values->bpe * values->nsamples)));
++ (tile_height * values->blocksize * values->nsamples)));
+ *height_align = tile_height;
+ *depth_align = 1;
+ *base_align = values->group_size;
+@@ -190,12 +282,12 @@ static inline int r600_get_array_mode_alignment(struct array_mode_checker *value
+ case ARRAY_2D_TILED_THIN1:
+ *pitch_align = max((u32)macro_tile_width,
+ (u32)(((values->group_size / tile_height) /
+- (values->bpe * values->nsamples)) *
++ (values->blocksize * values->nsamples)) *
+ values->nbanks)) * tile_width;
+ *height_align = macro_tile_height * tile_height;
+ *depth_align = 1;
+ *base_align = max(macro_tile_bytes,
+- (*pitch_align) * values->bpe * (*height_align) * values->nsamples);
++ (*pitch_align) * values->blocksize * (*height_align) * values->nsamples);
+ break;
+ default:
+ return -EINVAL;
+@@ -234,21 +326,22 @@ static void r600_cs_track_init(struct r600_cs_track *track)
+ static inline int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i)
+ {
+ struct r600_cs_track *track = p->track;
+- u32 bpe = 0, slice_tile_max, size, tmp;
++ u32 slice_tile_max, size, tmp;
+ u32 height, height_align, pitch, pitch_align, depth_align;
+ u64 base_offset, base_align;
+ struct array_mode_checker array_check;
+ volatile u32 *ib = p->ib->ptr;
+ unsigned array_mode;
+-
++ u32 format;
+ if (G_0280A0_TILE_MODE(track->cb_color_info[i])) {
+ dev_warn(p->dev, "FMASK or CMASK buffer are not supported by this kernel\n");
+ return -EINVAL;
+ }
+ size = radeon_bo_size(track->cb_color_bo[i]) - track->cb_color_bo_offset[i];
+- if (r600_bpe_from_format(&bpe, G_0280A0_FORMAT(track->cb_color_info[i]))) {
++ format = G_0280A0_FORMAT(track->cb_color_info[i]);
++ if (!fmt_is_valid_color(format)) {
+ dev_warn(p->dev, "%s:%d cb invalid format %d for %d (0x%08X)\n",
+- __func__, __LINE__, G_0280A0_FORMAT(track->cb_color_info[i]),
++ __func__, __LINE__, format,
+ i, track->cb_color_info[i]);
+ return -EINVAL;
+ }
+@@ -267,7 +360,7 @@ static inline int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i)
+ array_check.nbanks = track->nbanks;
+ array_check.npipes = track->npipes;
+ array_check.nsamples = track->nsamples;
+- array_check.bpe = bpe;
++ array_check.blocksize = fmt_get_blocksize(format);
+ if (r600_get_array_mode_alignment(&array_check,
+ &pitch_align, &height_align, &depth_align, &base_align)) {
+ dev_warn(p->dev, "%s invalid tiling %d for %d (0x%08X)\n", __func__,
+@@ -311,7 +404,7 @@ static inline int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i)
+ }
+
+ /* check offset */
+- tmp = height * pitch * bpe;
++ tmp = fmt_get_nblocksy(format, height) * fmt_get_nblocksx(format, pitch) * fmt_get_blocksize(format);
+ if ((tmp + track->cb_color_bo_offset[i]) > radeon_bo_size(track->cb_color_bo[i])) {
+ if (array_mode == V_0280A0_ARRAY_LINEAR_GENERAL) {
+ /* the initial DDX does bad things with the CB size occasionally */
+@@ -436,7 +529,7 @@ static int r600_cs_track_check(struct radeon_cs_parser *p)
+ array_check.nbanks = track->nbanks;
+ array_check.npipes = track->npipes;
+ array_check.nsamples = track->nsamples;
+- array_check.bpe = bpe;
++ array_check.blocksize = bpe;
+ if (r600_get_array_mode_alignment(&array_check,
+ &pitch_align, &height_align, &depth_align, &base_align)) {
+ dev_warn(p->dev, "%s invalid tiling %d (0x%08X)\n", __func__,
+@@ -1113,39 +1206,61 @@ static inline int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx
+ return 0;
+ }
+
+-static inline unsigned minify(unsigned size, unsigned levels)
++static inline unsigned mip_minify(unsigned size, unsigned level)
+ {
+- size = size >> levels;
+- if (size < 1)
+- size = 1;
+- return size;
++ unsigned val;
++
++ val = max(1U, size >> level);
++ if (level > 0)
++ val = roundup_pow_of_two(val);
++ return val;
+ }
+
+-static void r600_texture_size(unsigned nfaces, unsigned blevel, unsigned nlevels,
+- unsigned w0, unsigned h0, unsigned d0, unsigned bpe,
+- unsigned pitch_align,
++static void r600_texture_size(unsigned nfaces, unsigned blevel, unsigned llevel,
++ unsigned w0, unsigned h0, unsigned d0, unsigned format,
++ unsigned block_align, unsigned height_align, unsigned base_align,
+ unsigned *l0_size, unsigned *mipmap_size)
+ {
+- unsigned offset, i, level, face;
+- unsigned width, height, depth, rowstride, size;
+-
+- w0 = minify(w0, 0);
+- h0 = minify(h0, 0);
+- d0 = minify(d0, 0);
++ unsigned offset, i, level;
++ unsigned width, height, depth, size;
++ unsigned blocksize;
++ unsigned nbx, nby;
++ unsigned nlevels = llevel - blevel + 1;
++
++ *l0_size = -1;
++ blocksize = fmt_get_blocksize(format);
++
++ w0 = mip_minify(w0, 0);
++ h0 = mip_minify(h0, 0);
++ d0 = mip_minify(d0, 0);
+ for(i = 0, offset = 0, level = blevel; i < nlevels; i++, level++) {
+- width = minify(w0, i);
+- height = minify(h0, i);
+- depth = minify(d0, i);
+- for(face = 0; face < nfaces; face++) {
+- rowstride = ALIGN((width * bpe), pitch_align);
+- size = height * rowstride * depth;
+- offset += size;
+- offset = (offset + 0x1f) & ~0x1f;
+- }
++ width = mip_minify(w0, i);
++ nbx = fmt_get_nblocksx(format, width);
++
++ nbx = round_up(nbx, block_align);
++
++ height = mip_minify(h0, i);
++ nby = fmt_get_nblocksy(format, height);
++ nby = round_up(nby, height_align);
++
++ depth = mip_minify(d0, i);
++
++ size = nbx * nby * blocksize;
++ if (nfaces)
++ size *= nfaces;
++ else
++ size *= depth;
++
++ if (i == 0)
++ *l0_size = size;
++
++ if (i == 0 || i == 1)
++ offset = round_up(offset, base_align);
++
++ offset += size;
+ }
+- *l0_size = ALIGN((w0 * bpe), pitch_align) * h0 * d0;
+ *mipmap_size = offset;
+- if (!nlevels)
++ if (llevel == 0)
+ *mipmap_size = *l0_size;
+ if (!blevel)
+ *mipmap_size -= *l0_size;
+@@ -1169,11 +1284,13 @@ static inline int r600_check_texture_resource(struct radeon_cs_parser *p, u32 i
+ u32 tiling_flags)
+ {
+ struct r600_cs_track *track = p->track;
+- u32 nfaces, nlevels, blevel, w0, h0, d0, bpe = 0;
+- u32 word0, word1, l0_size, mipmap_size;
++ u32 nfaces, llevel, blevel, w0, h0, d0;
++ u32 word0, word1, l0_size, mipmap_size, word2, word3;
+ u32 height_align, pitch, pitch_align, depth_align;
++ u32 array, barray, larray;
+ u64 base_align;
+ struct array_mode_checker array_check;
++ u32 format;
+
+ /* on legacy kernel we don't perform advanced check */
+ if (p->rdev == NULL)
+@@ -1199,19 +1316,25 @@ static inline int r600_check_texture_resource(struct radeon_cs_parser *p, u32 i
+ case V_038000_SQ_TEX_DIM_3D:
+ break;
+ case V_038000_SQ_TEX_DIM_CUBEMAP:
+- nfaces = 6;
++ if (p->family >= CHIP_RV770)
++ nfaces = 8;
++ else
++ nfaces = 6;
+ break;
+ case V_038000_SQ_TEX_DIM_1D_ARRAY:
+ case V_038000_SQ_TEX_DIM_2D_ARRAY:
++ array = 1;
++ break;
+ case V_038000_SQ_TEX_DIM_2D_MSAA:
+ case V_038000_SQ_TEX_DIM_2D_ARRAY_MSAA:
+ default:
+ dev_warn(p->dev, "this kernel doesn't support %d texture dim\n", G_038000_DIM(word0));
+ return -EINVAL;
+ }
+- if (r600_bpe_from_format(&bpe, G_038004_DATA_FORMAT(word1))) {
++ format = G_038004_DATA_FORMAT(word1);
++ if (!fmt_is_valid_texture(format)) {
+ dev_warn(p->dev, "%s:%d texture invalid format %d\n",
+- __func__, __LINE__, G_038004_DATA_FORMAT(word1));
++ __func__, __LINE__, format);
+ return -EINVAL;
+ }
+
+@@ -1222,7 +1345,7 @@ static inline int r600_check_texture_resource(struct radeon_cs_parser *p, u32 i
+ array_check.nbanks = track->nbanks;
+ array_check.npipes = track->npipes;
+ array_check.nsamples = 1;
+- array_check.bpe = bpe;
++ array_check.blocksize = fmt_get_blocksize(format);
+ if (r600_get_array_mode_alignment(&array_check,
+ &pitch_align, &height_align, &depth_align, &base_align)) {
+ dev_warn(p->dev, "%s:%d tex array mode (%d) invalid\n",
+@@ -1248,25 +1371,34 @@ static inline int r600_check_texture_resource(struct radeon_cs_parser *p, u32 i
+ return -EINVAL;
+ }
+
++ word2 = radeon_get_ib_value(p, idx + 2) << 8;
++ word3 = radeon_get_ib_value(p, idx + 3) << 8;
++
+ word0 = radeon_get_ib_value(p, idx + 4);
+ word1 = radeon_get_ib_value(p, idx + 5);
+ blevel = G_038010_BASE_LEVEL(word0);
+- nlevels = G_038014_LAST_LEVEL(word1);
+- r600_texture_size(nfaces, blevel, nlevels, w0, h0, d0, bpe,
+- (pitch_align * bpe),
++ llevel = G_038014_LAST_LEVEL(word1);
++ if (array == 1) {
++ barray = G_038014_BASE_ARRAY(word1);
++ larray = G_038014_LAST_ARRAY(word1);
++
++ nfaces = larray - barray + 1;
++ }
++ r600_texture_size(nfaces, blevel, llevel, w0, h0, d0, format,
++ pitch_align, height_align, base_align,
+ &l0_size, &mipmap_size);
+ /* using get ib will give us the offset into the texture bo */
+- word0 = radeon_get_ib_value(p, idx + 2) << 8;
+- if ((l0_size + word0) > radeon_bo_size(texture)) {
++ if ((l0_size + word2) > radeon_bo_size(texture)) {
+ dev_warn(p->dev, "texture bo too small (%d %d %d %d -> %d have %ld)\n",
+- w0, h0, bpe, word0, l0_size, radeon_bo_size(texture));
++ w0, h0, format, word2, l0_size, radeon_bo_size(texture));
++ dev_warn(p->dev, "alignments %d %d %d %lld\n", pitch, pitch_align, height_align, base_align);
+ return -EINVAL;
+ }
+ /* using get ib will give us the offset into the mipmap bo */
+- word0 = radeon_get_ib_value(p, idx + 3) << 8;
+- if ((mipmap_size + word0) > radeon_bo_size(mipmap)) {
++ word3 = radeon_get_ib_value(p, idx + 3) << 8;
++ if ((mipmap_size + word3) > radeon_bo_size(mipmap)) {
+ /*dev_warn(p->dev, "mipmap bo too small (%d %d %d %d %d %d -> %d have %ld)\n",
+- w0, h0, bpe, blevel, nlevels, word0, mipmap_size, radeon_bo_size(texture));*/
++ w0, h0, format, blevel, nlevels, word3, mipmap_size, radeon_bo_size(texture));*/
+ }
+ return 0;
+ }
+@@ -1289,6 +1421,38 @@ static int r600_packet3_check(struct radeon_cs_parser *p,
+ idx_value = radeon_get_ib_value(p, idx);
+
+ switch (pkt->opcode) {
++ case PACKET3_SET_PREDICATION:
++ {
++ int pred_op;
++ int tmp;
++ if (pkt->count != 1) {
++ DRM_ERROR("bad SET PREDICATION\n");
++ return -EINVAL;
++ }
++
++ tmp = radeon_get_ib_value(p, idx + 1);
++ pred_op = (tmp >> 16) & 0x7;
++
++ /* for the clear predicate operation */
++ if (pred_op == 0)
++ return 0;
++
++ if (pred_op > 2) {
++ DRM_ERROR("bad SET PREDICATION operation %d\n", pred_op);
++ return -EINVAL;
++ }
++
++ r = r600_cs_packet_next_reloc(p, &reloc);
++ if (r) {
++ DRM_ERROR("bad SET PREDICATION\n");
++ return -EINVAL;
++ }
++
++ ib[idx + 0] = idx_value + (u32)(reloc->lobj.gpu_offset & 0xffffffff);
++ ib[idx + 1] = tmp + (upper_32_bits(reloc->lobj.gpu_offset) & 0xff);
++ }
++ break;
++
+ case PACKET3_START_3D_CMDBUF:
+ if (p->family >= CHIP_RV770 || pkt->count) {
+ DRM_ERROR("bad START_3D\n");
+diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h
+index 04bac0b..b2b944b 100644
+--- a/drivers/gpu/drm/radeon/r600d.h
++++ b/drivers/gpu/drm/radeon/r600d.h
+@@ -1304,6 +1304,11 @@
+ #define V_038004_FMT_16_16_16_FLOAT 0x0000002E
+ #define V_038004_FMT_32_32_32 0x0000002F
+ #define V_038004_FMT_32_32_32_FLOAT 0x00000030
++#define V_038004_FMT_BC1 0x00000031
++#define V_038004_FMT_BC2 0x00000032
++#define V_038004_FMT_BC3 0x00000033
++#define V_038004_FMT_BC4 0x00000034
++#define V_038004_FMT_BC5 0x00000035
+ #define R_038010_SQ_TEX_RESOURCE_WORD4_0 0x038010
+ #define S_038010_FORMAT_COMP_X(x) (((x) & 0x3) << 0)
+ #define G_038010_FORMAT_COMP_X(x) (((x) >> 0) & 0x3)
+diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
+index 6b34294..27df931 100644
+--- a/drivers/gpu/drm/radeon/radeon.h
++++ b/drivers/gpu/drm/radeon/radeon.h
+@@ -177,7 +177,7 @@ void radeon_pm_suspend(struct radeon_device *rdev);
+ void radeon_pm_resume(struct radeon_device *rdev);
+ void radeon_combios_get_power_modes(struct radeon_device *rdev);
+ void radeon_atombios_get_power_modes(struct radeon_device *rdev);
+-void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level);
++void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type);
+ void rs690_pm_info(struct radeon_device *rdev);
+ extern int rv6xx_get_temp(struct radeon_device *rdev);
+ extern int rv770_get_temp(struct radeon_device *rdev);
+@@ -651,6 +651,8 @@ struct radeon_wb {
+
+ #define RADEON_WB_SCRATCH_OFFSET 0
+ #define RADEON_WB_CP_RPTR_OFFSET 1024
++#define RADEON_WB_CP1_RPTR_OFFSET 1280
++#define RADEON_WB_CP2_RPTR_OFFSET 1536
+ #define R600_WB_IH_WPTR_OFFSET 2048
+ #define R600_WB_EVENT_OFFSET 3072
+
+@@ -753,7 +755,9 @@ struct radeon_voltage {
+ u8 vddci_id; /* index into vddci voltage table */
+ bool vddci_enabled;
+ /* r6xx+ sw */
+- u32 voltage;
++ u16 voltage;
++ /* evergreen+ vddci */
++ u16 vddci;
+ };
+
+ /* clock mode flags */
+@@ -821,10 +825,12 @@ struct radeon_pm {
+ int default_power_state_index;
+ u32 current_sclk;
+ u32 current_mclk;
+- u32 current_vddc;
++ u16 current_vddc;
++ u16 current_vddci;
+ u32 default_sclk;
+ u32 default_mclk;
+- u32 default_vddc;
++ u16 default_vddc;
++ u16 default_vddci;
+ struct radeon_i2c_chan *i2c_bus;
+ /* selected pm method */
+ enum radeon_pm_method pm_method;
+@@ -1037,12 +1043,52 @@ struct evergreen_asic {
+ struct r100_gpu_lockup lockup;
+ };
+
++struct cayman_asic {
++ unsigned max_shader_engines;
++ unsigned max_pipes_per_simd;
++ unsigned max_tile_pipes;
++ unsigned max_simds_per_se;
++ unsigned max_backends_per_se;
++ unsigned max_texture_channel_caches;
++ unsigned max_gprs;
++ unsigned max_threads;
++ unsigned max_gs_threads;
++ unsigned max_stack_entries;
++ unsigned sx_num_of_sets;
++ unsigned sx_max_export_size;
++ unsigned sx_max_export_pos_size;
++ unsigned sx_max_export_smx_size;
++ unsigned max_hw_contexts;
++ unsigned sq_num_cf_insts;
++ unsigned sc_prim_fifo_size;
++ unsigned sc_hiz_tile_fifo_size;
++ unsigned sc_earlyz_tile_fifo_size;
++
++ unsigned num_shader_engines;
++ unsigned num_shader_pipes_per_simd;
++ unsigned num_tile_pipes;
++ unsigned num_simds_per_se;
++ unsigned num_backends_per_se;
++ unsigned backend_disable_mask_per_asic;
++ unsigned backend_map;
++ unsigned num_texture_channel_caches;
++ unsigned mem_max_burst_length_bytes;
++ unsigned mem_row_size_in_kb;
++ unsigned shader_engine_tile_size;
++ unsigned num_gpus;
++ unsigned multi_gpu_tile_size;
++
++ unsigned tile_config;
++ struct r100_gpu_lockup lockup;
++};
++
+ union radeon_asic_config {
+ struct r300_asic r300;
+ struct r100_asic r100;
+ struct r600_asic r600;
+ struct rv770_asic rv770;
+ struct evergreen_asic evergreen;
++ struct cayman_asic cayman;
+ };
+
+ /*
+@@ -1133,6 +1179,9 @@ struct radeon_device {
+ struct radeon_mman mman;
+ struct radeon_fence_driver fence_drv;
+ struct radeon_cp cp;
++ /* cayman compute rings */
++ struct radeon_cp cp1;
++ struct radeon_cp cp2;
+ struct radeon_ib_pool ib_pool;
+ struct radeon_irq irq;
+ struct radeon_asic *asic;
+@@ -1504,7 +1553,7 @@ extern int evergreen_blit_init(struct radeon_device *rdev);
+ extern void evergreen_blit_fini(struct radeon_device *rdev);
+
+ extern int ni_init_microcode(struct radeon_device *rdev);
+-extern int btc_mc_load_microcode(struct radeon_device *rdev);
++extern int ni_mc_load_microcode(struct radeon_device *rdev);
+
+ /* radeon_acpi.c */
+ #if defined(CONFIG_ACPI)
+diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c
+index 793c5e6..ca57619 100644
+--- a/drivers/gpu/drm/radeon/radeon_asic.c
++++ b/drivers/gpu/drm/radeon/radeon_asic.c
+@@ -94,7 +94,7 @@ static void radeon_register_accessor_init(struct radeon_device *rdev)
+ rdev->mc_rreg = &rs600_mc_rreg;
+ rdev->mc_wreg = &rs600_mc_wreg;
+ }
+- if ((rdev->family >= CHIP_R600) && (rdev->family <= CHIP_HEMLOCK)) {
++ if (rdev->family >= CHIP_R600) {
+ rdev->pciep_rreg = &r600_pciep_rreg;
+ rdev->pciep_wreg = &r600_pciep_wreg;
+ }
+@@ -885,6 +885,52 @@ static struct radeon_asic btc_asic = {
+ .post_page_flip = &evergreen_post_page_flip,
+ };
+
++static struct radeon_asic cayman_asic = {
++ .init = &cayman_init,
++ .fini = &cayman_fini,
++ .suspend = &cayman_suspend,
++ .resume = &cayman_resume,
++ .cp_commit = &r600_cp_commit,
++ .gpu_is_lockup = &cayman_gpu_is_lockup,
++ .asic_reset = &cayman_asic_reset,
++ .vga_set_state = &r600_vga_set_state,
++ .gart_tlb_flush = &cayman_pcie_gart_tlb_flush,
++ .gart_set_page = &rs600_gart_set_page,
++ .ring_test = &r600_ring_test,
++ .ring_ib_execute = &evergreen_ring_ib_execute,
++ .irq_set = &evergreen_irq_set,
++ .irq_process = &evergreen_irq_process,
++ .get_vblank_counter = &evergreen_get_vblank_counter,
++ .fence_ring_emit = &r600_fence_ring_emit,
++ .cs_parse = &evergreen_cs_parse,
++ .copy_blit = NULL,
++ .copy_dma = NULL,
++ .copy = NULL,
++ .get_engine_clock = &radeon_atom_get_engine_clock,
++ .set_engine_clock = &radeon_atom_set_engine_clock,
++ .get_memory_clock = &radeon_atom_get_memory_clock,
++ .set_memory_clock = &radeon_atom_set_memory_clock,
++ .get_pcie_lanes = NULL,
++ .set_pcie_lanes = NULL,
++ .set_clock_gating = NULL,
++ .set_surface_reg = r600_set_surface_reg,
++ .clear_surface_reg = r600_clear_surface_reg,
++ .bandwidth_update = &evergreen_bandwidth_update,
++ .hpd_init = &evergreen_hpd_init,
++ .hpd_fini = &evergreen_hpd_fini,
++ .hpd_sense = &evergreen_hpd_sense,
++ .hpd_set_polarity = &evergreen_hpd_set_polarity,
++ .gui_idle = &r600_gui_idle,
++ .pm_misc = &evergreen_pm_misc,
++ .pm_prepare = &evergreen_pm_prepare,
++ .pm_finish = &evergreen_pm_finish,
++ .pm_init_profile = &r600_pm_init_profile,
++ .pm_get_dynpm_state = &r600_pm_get_dynpm_state,
++ .pre_page_flip = &evergreen_pre_page_flip,
++ .page_flip = &evergreen_page_flip,
++ .post_page_flip = &evergreen_post_page_flip,
++};
++
+ int radeon_asic_init(struct radeon_device *rdev)
+ {
+ radeon_register_accessor_init(rdev);
+@@ -977,6 +1023,9 @@ int radeon_asic_init(struct radeon_device *rdev)
+ case CHIP_CAICOS:
+ rdev->asic = &btc_asic;
+ break;
++ case CHIP_CAYMAN:
++ rdev->asic = &cayman_asic;
++ break;
+ default:
+ /* FIXME: not supported yet */
+ return -EINVAL;
+diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
+index c59bd98..82c4bc2 100644
+--- a/drivers/gpu/drm/radeon/radeon_asic.h
++++ b/drivers/gpu/drm/radeon/radeon_asic.h
+@@ -375,4 +375,15 @@ extern void evergreen_pre_page_flip(struct radeon_device *rdev, int crtc);
+ extern u32 evergreen_page_flip(struct radeon_device *rdev, int crtc, u64 crtc_base);
+ extern void evergreen_post_page_flip(struct radeon_device *rdev, int crtc);
+
++/*
++ * cayman
++ */
++void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev);
++int cayman_init(struct radeon_device *rdev);
++void cayman_fini(struct radeon_device *rdev);
++int cayman_suspend(struct radeon_device *rdev);
++int cayman_resume(struct radeon_device *rdev);
++bool cayman_gpu_is_lockup(struct radeon_device *rdev);
++int cayman_asic_reset(struct radeon_device *rdev);
++
+ #endif
+diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
+index 99768d9..f116516 100644
+--- a/drivers/gpu/drm/radeon/radeon_atombios.c
++++ b/drivers/gpu/drm/radeon/radeon_atombios.c
+@@ -1599,9 +1599,10 @@ struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct
+ memcpy((u8 *)edid, (u8 *)&fake_edid_record->ucFakeEDIDString[0],
+ fake_edid_record->ucFakeEDIDLength);
+
+- if (drm_edid_is_valid(edid))
++ if (drm_edid_is_valid(edid)) {
+ rdev->mode_info.bios_hardcoded_edid = edid;
+- else
++ rdev->mode_info.bios_hardcoded_edid_size = edid_size;
++ } else
+ kfree(edid);
+ }
+ }
+@@ -2176,24 +2177,27 @@ static void radeon_atombios_add_pplib_thermal_controller(struct radeon_device *r
+ }
+ }
+
+-static u16 radeon_atombios_get_default_vddc(struct radeon_device *rdev)
++static void radeon_atombios_get_default_voltages(struct radeon_device *rdev,
++ u16 *vddc, u16 *vddci)
+ {
+ struct radeon_mode_info *mode_info = &rdev->mode_info;
+ int index = GetIndexIntoMasterTable(DATA, FirmwareInfo);
+ u8 frev, crev;
+ u16 data_offset;
+ union firmware_info *firmware_info;
+- u16 vddc = 0;
++
++ *vddc = 0;
++ *vddci = 0;
+
+ if (atom_parse_data_header(mode_info->atom_context, index, NULL,
+ &frev, &crev, &data_offset)) {
+ firmware_info =
+ (union firmware_info *)(mode_info->atom_context->bios +
+ data_offset);
+- vddc = le16_to_cpu(firmware_info->info_14.usBootUpVDDCVoltage);
++ *vddc = le16_to_cpu(firmware_info->info_14.usBootUpVDDCVoltage);
++ if ((frev == 2) && (crev >= 2))
++ *vddci = le16_to_cpu(firmware_info->info_22.usBootUpVDDCIVoltage);
+ }
+-
+- return vddc;
+ }
+
+ static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rdev,
+@@ -2203,7 +2207,9 @@ static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rde
+ int j;
+ u32 misc = le32_to_cpu(non_clock_info->ulCapsAndSettings);
+ u32 misc2 = le16_to_cpu(non_clock_info->usClassification);
+- u16 vddc = radeon_atombios_get_default_vddc(rdev);
++ u16 vddc, vddci;
++
++ radeon_atombios_get_default_voltages(rdev, &vddc, &vddci);
+
+ rdev->pm.power_state[state_index].misc = misc;
+ rdev->pm.power_state[state_index].misc2 = misc2;
+@@ -2244,6 +2250,7 @@ static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rde
+ rdev->pm.default_sclk = rdev->pm.power_state[state_index].clock_info[0].sclk;
+ rdev->pm.default_mclk = rdev->pm.power_state[state_index].clock_info[0].mclk;
+ rdev->pm.default_vddc = rdev->pm.power_state[state_index].clock_info[0].voltage.voltage;
++ rdev->pm.default_vddci = rdev->pm.power_state[state_index].clock_info[0].voltage.vddci;
+ } else {
+ /* patch the table values with the default slck/mclk from firmware info */
+ for (j = 0; j < mode_index; j++) {
+@@ -2286,6 +2293,8 @@ static bool radeon_atombios_parse_pplib_clock_info(struct radeon_device *rdev,
+ VOLTAGE_SW;
+ rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
+ le16_to_cpu(clock_info->evergreen.usVDDC);
++ rdev->pm.power_state[state_index].clock_info[mode_index].voltage.vddci =
++ le16_to_cpu(clock_info->evergreen.usVDDCI);
+ } else {
+ sclk = le16_to_cpu(clock_info->r600.usEngineClockLow);
+ sclk |= clock_info->r600.ucEngineClockHigh << 16;
+@@ -2577,25 +2586,25 @@ union set_voltage {
+ struct _SET_VOLTAGE_PARAMETERS_V2 v2;
+ };
+
+-void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level)
++void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type)
+ {
+ union set_voltage args;
+ int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
+- u8 frev, crev, volt_index = level;
++ u8 frev, crev, volt_index = voltage_level;
+
+ if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
+ return;
+
+ switch (crev) {
+ case 1:
+- args.v1.ucVoltageType = SET_VOLTAGE_TYPE_ASIC_VDDC;
++ args.v1.ucVoltageType = voltage_type;
+ args.v1.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE;
+ args.v1.ucVoltageIndex = volt_index;
+ break;
+ case 2:
+- args.v2.ucVoltageType = SET_VOLTAGE_TYPE_ASIC_VDDC;
++ args.v2.ucVoltageType = voltage_type;
+ args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE;
+- args.v2.usVoltageLevel = cpu_to_le16(level);
++ args.v2.usVoltageLevel = cpu_to_le16(voltage_level);
+ break;
+ default:
+ DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
+diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c
+index cf602e2..8caf546 100644
+--- a/drivers/gpu/drm/radeon/radeon_combios.c
++++ b/drivers/gpu/drm/radeon/radeon_combios.c
+@@ -2079,6 +2079,19 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
+ DRM_MODE_CONNECTOR_DVII, &ddc_i2c,
+ CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I,
+ &hpd);
++ /* TV - TV DAC */
++ ddc_i2c.valid = false;
++ hpd.hpd = RADEON_HPD_NONE;
++ radeon_add_legacy_encoder(dev,
++ radeon_get_encoder_enum(dev,
++ ATOM_DEVICE_TV1_SUPPORT,
++ 2),
++ ATOM_DEVICE_TV1_SUPPORT);
++ radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT,
++ DRM_MODE_CONNECTOR_SVIDEO,
++ &ddc_i2c,
++ CONNECTOR_OBJECT_ID_SVIDEO,
++ &hpd);
+ break;
+ default:
+ DRM_INFO("Connector table: %d (invalid)\n",
+diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
+index d83338b..a186673 100644
+--- a/drivers/gpu/drm/radeon/radeon_connectors.c
++++ b/drivers/gpu/drm/radeon/radeon_connectors.c
+@@ -998,7 +998,16 @@ static int radeon_dvi_mode_valid(struct drm_connector *connector,
+ (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) ||
+ (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B))
+ return MODE_OK;
+- else
++ else if (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_A) {
++ if (ASIC_IS_DCE3(rdev)) {
++ /* HDMI 1.3+ supports max clock of 340 Mhz */
++ if (mode->clock > 340000)
++ return MODE_CLOCK_HIGH;
++ else
++ return MODE_OK;
++ } else
++ return MODE_CLOCK_HIGH;
++ } else
+ return MODE_CLOCK_HIGH;
+ }
+ return MODE_OK;
+diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
+index 4954e2d..207d43f 100644
+--- a/drivers/gpu/drm/radeon/radeon_device.c
++++ b/drivers/gpu/drm/radeon/radeon_device.c
+@@ -85,6 +85,7 @@ static const char radeon_family_name[][16] = {
+ "BARTS",
+ "TURKS",
+ "CAICOS",
++ "CAYMAN",
+ "LAST",
+ };
+
+diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
+index 275b26a..0444911 100644
+--- a/drivers/gpu/drm/radeon/radeon_drv.c
++++ b/drivers/gpu/drm/radeon/radeon_drv.c
+@@ -49,9 +49,10 @@
+ * - 2.6.0 - add tiling config query (r6xx+), add initial HiZ support (r300->r500)
+ * 2.7.0 - fixups for r600 2D tiling support. (no external ABI change), add eg dyn gpr regs
+ * 2.8.0 - pageflip support, r500 US_FORMAT regs. r500 ARGB2101010 colorbuf, r300->r500 CMASK, clock crystal query
++ * 2.9.0 - r600 tiling (s3tc,rgtc) working, SET_PREDICATION packet 3 on r600 + eg, backend query
+ */
+ #define KMS_DRIVER_MAJOR 2
+-#define KMS_DRIVER_MINOR 8
++#define KMS_DRIVER_MINOR 9
+ #define KMS_DRIVER_PATCHLEVEL 0
+ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
+ int radeon_driver_unload_kms(struct drm_device *dev);
+diff --git a/drivers/gpu/drm/radeon/radeon_family.h b/drivers/gpu/drm/radeon/radeon_family.h
+index 1ca55eb..6f1d9e5 100644
+--- a/drivers/gpu/drm/radeon/radeon_family.h
++++ b/drivers/gpu/drm/radeon/radeon_family.h
+@@ -84,6 +84,7 @@ enum radeon_family {
+ CHIP_BARTS,
+ CHIP_TURKS,
+ CHIP_CAICOS,
++ CHIP_CAYMAN,
+ CHIP_LAST,
+ };
+
+diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
+index 8387d32..d36fe3f 100644
+--- a/drivers/gpu/drm/radeon/radeon_kms.c
++++ b/drivers/gpu/drm/radeon/radeon_kms.c
+@@ -169,7 +169,9 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
+ value = rdev->accel_working;
+ break;
+ case RADEON_INFO_TILING_CONFIG:
+- if (rdev->family >= CHIP_CEDAR)
++ if (rdev->family >= CHIP_CAYMAN)
++ value = rdev->config.cayman.tile_config;
++ else if (rdev->family >= CHIP_CEDAR)
+ value = rdev->config.evergreen.tile_config;
+ else if (rdev->family >= CHIP_RV770)
+ value = rdev->config.rv770.tile_config;
+@@ -205,6 +207,36 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
+ /* return clock value in KHz */
+ value = rdev->clock.spll.reference_freq * 10;
+ break;
++ case RADEON_INFO_NUM_BACKENDS:
++ if (rdev->family >= CHIP_CAYMAN)
++ value = rdev->config.cayman.max_backends_per_se *
++ rdev->config.cayman.max_shader_engines;
++ else if (rdev->family >= CHIP_CEDAR)
++ value = rdev->config.evergreen.max_backends;
++ else if (rdev->family >= CHIP_RV770)
++ value = rdev->config.rv770.max_backends;
++ else if (rdev->family >= CHIP_R600)
++ value = rdev->config.r600.max_backends;
++ else {
++ return -EINVAL;
++ }
++ break;
++ case RADEON_INFO_NUM_TILE_PIPES:
++ if (rdev->family >= CHIP_CAYMAN)
++ value = rdev->config.cayman.max_tile_pipes;
++ else if (rdev->family >= CHIP_CEDAR)
++ value = rdev->config.evergreen.max_tile_pipes;
++ else if (rdev->family >= CHIP_RV770)
++ value = rdev->config.rv770.max_tile_pipes;
++ else if (rdev->family >= CHIP_R600)
++ value = rdev->config.r600.max_tile_pipes;
++ else {
++ return -EINVAL;
++ }
++ break;
++ case RADEON_INFO_FUSION_GART_WORKING:
++ value = 1;
++ break;
+ default:
+ DRM_DEBUG_KMS("Invalid request %d\n", info->request);
+ return -EINVAL;
+diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
+index 2aed03b..320ddc3 100644
+--- a/drivers/gpu/drm/radeon/radeon_pm.c
++++ b/drivers/gpu/drm/radeon/radeon_pm.c
+@@ -23,6 +23,7 @@
+ #include "drmP.h"
+ #include "radeon.h"
+ #include "avivod.h"
++#include "atom.h"
+ #ifdef CONFIG_ACPI
+ #include <linux/acpi.h>
+ #endif
+@@ -533,7 +534,11 @@ void radeon_pm_resume(struct radeon_device *rdev)
+ /* set up the default clocks if the MC ucode is loaded */
+ if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) {
+ if (rdev->pm.default_vddc)
+- radeon_atom_set_voltage(rdev, rdev->pm.default_vddc);
++ radeon_atom_set_voltage(rdev, rdev->pm.default_vddc,
++ SET_VOLTAGE_TYPE_ASIC_VDDC);
++ if (rdev->pm.default_vddci)
++ radeon_atom_set_voltage(rdev, rdev->pm.default_vddci,
++ SET_VOLTAGE_TYPE_ASIC_VDDCI);
+ if (rdev->pm.default_sclk)
+ radeon_set_engine_clock(rdev, rdev->pm.default_sclk);
+ if (rdev->pm.default_mclk)
+@@ -546,6 +551,7 @@ void radeon_pm_resume(struct radeon_device *rdev)
+ rdev->pm.current_sclk = rdev->pm.default_sclk;
+ rdev->pm.current_mclk = rdev->pm.default_mclk;
+ rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage;
++ rdev->pm.current_vddci = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.vddci;
+ if (rdev->pm.pm_method == PM_METHOD_DYNPM
+ && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) {
+ rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE;
+@@ -583,7 +589,8 @@ int radeon_pm_init(struct radeon_device *rdev)
+ /* set up the default clocks if the MC ucode is loaded */
+ if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) {
+ if (rdev->pm.default_vddc)
+- radeon_atom_set_voltage(rdev, rdev->pm.default_vddc);
++ radeon_atom_set_voltage(rdev, rdev->pm.default_vddc,
++ SET_VOLTAGE_TYPE_ASIC_VDDC);
+ if (rdev->pm.default_sclk)
+ radeon_set_engine_clock(rdev, rdev->pm.default_sclk);
+ if (rdev->pm.default_mclk)
+diff --git a/drivers/gpu/drm/radeon/reg_srcs/cayman b/drivers/gpu/drm/radeon/reg_srcs/cayman
+new file mode 100644
+index 0000000..6334f8a
+--- /dev/null
++++ b/drivers/gpu/drm/radeon/reg_srcs/cayman
+@@ -0,0 +1,619 @@
++cayman 0x9400
++0x0000802C GRBM_GFX_INDEX
++0x000088B0 VGT_VTX_VECT_EJECT_REG
++0x000088C4 VGT_CACHE_INVALIDATION
++0x000088D4 VGT_GS_VERTEX_REUSE
++0x00008958 VGT_PRIMITIVE_TYPE
++0x0000895C VGT_INDEX_TYPE
++0x00008970 VGT_NUM_INDICES
++0x00008974 VGT_NUM_INSTANCES
++0x00008990 VGT_COMPUTE_DIM_X
++0x00008994 VGT_COMPUTE_DIM_Y
++0x00008998 VGT_COMPUTE_DIM_Z
++0x0000899C VGT_COMPUTE_START_X
++0x000089A0 VGT_COMPUTE_START_Y
++0x000089A4 VGT_COMPUTE_START_Z
++0x000089A8 VGT_COMPUTE_INDEX
++0x000089AC VGT_COMPUTE_THREAD_GOURP_SIZE
++0x000089B0 VGT_HS_OFFCHIP_PARAM
++0x00008A14 PA_CL_ENHANCE
++0x00008A60 PA_SC_LINE_STIPPLE_VALUE
++0x00008B10 PA_SC_LINE_STIPPLE_STATE
++0x00008BF0 PA_SC_ENHANCE
++0x00008D8C SQ_DYN_GPR_CNTL_PS_FLUSH_REQ
++0x00008D94 SQ_DYN_GPR_SIMD_LOCK_EN
++0x00008C00 SQ_CONFIG
++0x00008C04 SQ_GPR_RESOURCE_MGMT_1
++0x00008C10 SQ_GLOBAL_GPR_RESOURCE_MGMT_1
++0x00008C14 SQ_GLOBAL_GPR_RESOURCE_MGMT_2
++0x00008DF8 SQ_CONST_MEM_BASE
++0x00008E20 SQ_STATIC_THREAD_MGMT_1
++0x00008E24 SQ_STATIC_THREAD_MGMT_2
++0x00008E28 SQ_STATIC_THREAD_MGMT_3
++0x00008E48 SQ_EX_ALLOC_TABLE_SLOTS
++0x00009100 SPI_CONFIG_CNTL
++0x0000913C SPI_CONFIG_CNTL_1
++0x00009830 DB_DEBUG
++0x00009834 DB_DEBUG2
++0x00009838 DB_DEBUG3
++0x0000983C DB_DEBUG4
++0x00009854 DB_WATERMARKS
++0x0000A400 TD_PS_BORDER_COLOR_INDEX
++0x0000A404 TD_PS_BORDER_COLOR_RED
++0x0000A408 TD_PS_BORDER_COLOR_GREEN
++0x0000A40C TD_PS_BORDER_COLOR_BLUE
++0x0000A410 TD_PS_BORDER_COLOR_ALPHA
++0x0000A414 TD_VS_BORDER_COLOR_INDEX
++0x0000A418 TD_VS_BORDER_COLOR_RED
++0x0000A41C TD_VS_BORDER_COLOR_GREEN
++0x0000A420 TD_VS_BORDER_COLOR_BLUE
++0x0000A424 TD_VS_BORDER_COLOR_ALPHA
++0x0000A428 TD_GS_BORDER_COLOR_INDEX
++0x0000A42C TD_GS_BORDER_COLOR_RED
++0x0000A430 TD_GS_BORDER_COLOR_GREEN
++0x0000A434 TD_GS_BORDER_COLOR_BLUE
++0x0000A438 TD_GS_BORDER_COLOR_ALPHA
++0x0000A43C TD_HS_BORDER_COLOR_INDEX
++0x0000A440 TD_HS_BORDER_COLOR_RED
++0x0000A444 TD_HS_BORDER_COLOR_GREEN
++0x0000A448 TD_HS_BORDER_COLOR_BLUE
++0x0000A44C TD_HS_BORDER_COLOR_ALPHA
++0x0000A450 TD_LS_BORDER_COLOR_INDEX
++0x0000A454 TD_LS_BORDER_COLOR_RED
++0x0000A458 TD_LS_BORDER_COLOR_GREEN
++0x0000A45C TD_LS_BORDER_COLOR_BLUE
++0x0000A460 TD_LS_BORDER_COLOR_ALPHA
++0x0000A464 TD_CS_BORDER_COLOR_INDEX
++0x0000A468 TD_CS_BORDER_COLOR_RED
++0x0000A46C TD_CS_BORDER_COLOR_GREEN
++0x0000A470 TD_CS_BORDER_COLOR_BLUE
++0x0000A474 TD_CS_BORDER_COLOR_ALPHA
++0x00028000 DB_RENDER_CONTROL
++0x00028004 DB_COUNT_CONTROL
++0x0002800C DB_RENDER_OVERRIDE
++0x00028010 DB_RENDER_OVERRIDE2
++0x00028028 DB_STENCIL_CLEAR
++0x0002802C DB_DEPTH_CLEAR
++0x00028030 PA_SC_SCREEN_SCISSOR_TL
++0x00028034 PA_SC_SCREEN_SCISSOR_BR
++0x0002805C DB_DEPTH_SLICE
++0x00028140 SQ_ALU_CONST_BUFFER_SIZE_PS_0
++0x00028144 SQ_ALU_CONST_BUFFER_SIZE_PS_1
++0x00028148 SQ_ALU_CONST_BUFFER_SIZE_PS_2
++0x0002814C SQ_ALU_CONST_BUFFER_SIZE_PS_3
++0x00028150 SQ_ALU_CONST_BUFFER_SIZE_PS_4
++0x00028154 SQ_ALU_CONST_BUFFER_SIZE_PS_5
++0x00028158 SQ_ALU_CONST_BUFFER_SIZE_PS_6
++0x0002815C SQ_ALU_CONST_BUFFER_SIZE_PS_7
++0x00028160 SQ_ALU_CONST_BUFFER_SIZE_PS_8
++0x00028164 SQ_ALU_CONST_BUFFER_SIZE_PS_9
++0x00028168 SQ_ALU_CONST_BUFFER_SIZE_PS_10
++0x0002816C SQ_ALU_CONST_BUFFER_SIZE_PS_11
++0x00028170 SQ_ALU_CONST_BUFFER_SIZE_PS_12
++0x00028174 SQ_ALU_CONST_BUFFER_SIZE_PS_13
++0x00028178 SQ_ALU_CONST_BUFFER_SIZE_PS_14
++0x0002817C SQ_ALU_CONST_BUFFER_SIZE_PS_15
++0x00028180 SQ_ALU_CONST_BUFFER_SIZE_VS_0
++0x00028184 SQ_ALU_CONST_BUFFER_SIZE_VS_1
++0x00028188 SQ_ALU_CONST_BUFFER_SIZE_VS_2
++0x0002818C SQ_ALU_CONST_BUFFER_SIZE_VS_3
++0x00028190 SQ_ALU_CONST_BUFFER_SIZE_VS_4
++0x00028194 SQ_ALU_CONST_BUFFER_SIZE_VS_5
++0x00028198 SQ_ALU_CONST_BUFFER_SIZE_VS_6
++0x0002819C SQ_ALU_CONST_BUFFER_SIZE_VS_7
++0x000281A0 SQ_ALU_CONST_BUFFER_SIZE_VS_8
++0x000281A4 SQ_ALU_CONST_BUFFER_SIZE_VS_9
++0x000281A8 SQ_ALU_CONST_BUFFER_SIZE_VS_10
++0x000281AC SQ_ALU_CONST_BUFFER_SIZE_VS_11
++0x000281B0 SQ_ALU_CONST_BUFFER_SIZE_VS_12
++0x000281B4 SQ_ALU_CONST_BUFFER_SIZE_VS_13
++0x000281B8 SQ_ALU_CONST_BUFFER_SIZE_VS_14
++0x000281BC SQ_ALU_CONST_BUFFER_SIZE_VS_15
++0x000281C0 SQ_ALU_CONST_BUFFER_SIZE_GS_0
++0x000281C4 SQ_ALU_CONST_BUFFER_SIZE_GS_1
++0x000281C8 SQ_ALU_CONST_BUFFER_SIZE_GS_2
++0x000281CC SQ_ALU_CONST_BUFFER_SIZE_GS_3
++0x000281D0 SQ_ALU_CONST_BUFFER_SIZE_GS_4
++0x000281D4 SQ_ALU_CONST_BUFFER_SIZE_GS_5
++0x000281D8 SQ_ALU_CONST_BUFFER_SIZE_GS_6
++0x000281DC SQ_ALU_CONST_BUFFER_SIZE_GS_7
++0x000281E0 SQ_ALU_CONST_BUFFER_SIZE_GS_8
++0x000281E4 SQ_ALU_CONST_BUFFER_SIZE_GS_9
++0x000281E8 SQ_ALU_CONST_BUFFER_SIZE_GS_10
++0x000281EC SQ_ALU_CONST_BUFFER_SIZE_GS_11
++0x000281F0 SQ_ALU_CONST_BUFFER_SIZE_GS_12
++0x000281F4 SQ_ALU_CONST_BUFFER_SIZE_GS_13
++0x000281F8 SQ_ALU_CONST_BUFFER_SIZE_GS_14
++0x000281FC SQ_ALU_CONST_BUFFER_SIZE_GS_15
++0x00028200 PA_SC_WINDOW_OFFSET
++0x00028204 PA_SC_WINDOW_SCISSOR_TL
++0x00028208 PA_SC_WINDOW_SCISSOR_BR
++0x0002820C PA_SC_CLIPRECT_RULE
++0x00028210 PA_SC_CLIPRECT_0_TL
++0x00028214 PA_SC_CLIPRECT_0_BR
++0x00028218 PA_SC_CLIPRECT_1_TL
++0x0002821C PA_SC_CLIPRECT_1_BR
++0x00028220 PA_SC_CLIPRECT_2_TL
++0x00028224 PA_SC_CLIPRECT_2_BR
++0x00028228 PA_SC_CLIPRECT_3_TL
++0x0002822C PA_SC_CLIPRECT_3_BR
++0x00028230 PA_SC_EDGERULE
++0x00028234 PA_SU_HARDWARE_SCREEN_OFFSET
++0x00028240 PA_SC_GENERIC_SCISSOR_TL
++0x00028244 PA_SC_GENERIC_SCISSOR_BR
++0x00028250 PA_SC_VPORT_SCISSOR_0_TL
++0x00028254 PA_SC_VPORT_SCISSOR_0_BR
++0x00028258 PA_SC_VPORT_SCISSOR_1_TL
++0x0002825C PA_SC_VPORT_SCISSOR_1_BR
++0x00028260 PA_SC_VPORT_SCISSOR_2_TL
++0x00028264 PA_SC_VPORT_SCISSOR_2_BR
++0x00028268 PA_SC_VPORT_SCISSOR_3_TL
++0x0002826C PA_SC_VPORT_SCISSOR_3_BR
++0x00028270 PA_SC_VPORT_SCISSOR_4_TL
++0x00028274 PA_SC_VPORT_SCISSOR_4_BR
++0x00028278 PA_SC_VPORT_SCISSOR_5_TL
++0x0002827C PA_SC_VPORT_SCISSOR_5_BR
++0x00028280 PA_SC_VPORT_SCISSOR_6_TL
++0x00028284 PA_SC_VPORT_SCISSOR_6_BR
++0x00028288 PA_SC_VPORT_SCISSOR_7_TL
++0x0002828C PA_SC_VPORT_SCISSOR_7_BR
++0x00028290 PA_SC_VPORT_SCISSOR_8_TL
++0x00028294 PA_SC_VPORT_SCISSOR_8_BR
++0x00028298 PA_SC_VPORT_SCISSOR_9_TL
++0x0002829C PA_SC_VPORT_SCISSOR_9_BR
++0x000282A0 PA_SC_VPORT_SCISSOR_10_TL
++0x000282A4 PA_SC_VPORT_SCISSOR_10_BR
++0x000282A8 PA_SC_VPORT_SCISSOR_11_TL
++0x000282AC PA_SC_VPORT_SCISSOR_11_BR
++0x000282B0 PA_SC_VPORT_SCISSOR_12_TL
++0x000282B4 PA_SC_VPORT_SCISSOR_12_BR
++0x000282B8 PA_SC_VPORT_SCISSOR_13_TL
++0x000282BC PA_SC_VPORT_SCISSOR_13_BR
++0x000282C0 PA_SC_VPORT_SCISSOR_14_TL
++0x000282C4 PA_SC_VPORT_SCISSOR_14_BR
++0x000282C8 PA_SC_VPORT_SCISSOR_15_TL
++0x000282CC PA_SC_VPORT_SCISSOR_15_BR
++0x000282D0 PA_SC_VPORT_ZMIN_0
++0x000282D4 PA_SC_VPORT_ZMAX_0
++0x000282D8 PA_SC_VPORT_ZMIN_1
++0x000282DC PA_SC_VPORT_ZMAX_1
++0x000282E0 PA_SC_VPORT_ZMIN_2
++0x000282E4 PA_SC_VPORT_ZMAX_2
++0x000282E8 PA_SC_VPORT_ZMIN_3
++0x000282EC PA_SC_VPORT_ZMAX_3
++0x000282F0 PA_SC_VPORT_ZMIN_4
++0x000282F4 PA_SC_VPORT_ZMAX_4
++0x000282F8 PA_SC_VPORT_ZMIN_5
++0x000282FC PA_SC_VPORT_ZMAX_5
++0x00028300 PA_SC_VPORT_ZMIN_6
++0x00028304 PA_SC_VPORT_ZMAX_6
++0x00028308 PA_SC_VPORT_ZMIN_7
++0x0002830C PA_SC_VPORT_ZMAX_7
++0x00028310 PA_SC_VPORT_ZMIN_8
++0x00028314 PA_SC_VPORT_ZMAX_8
++0x00028318 PA_SC_VPORT_ZMIN_9
++0x0002831C PA_SC_VPORT_ZMAX_9
++0x00028320 PA_SC_VPORT_ZMIN_10
++0x00028324 PA_SC_VPORT_ZMAX_10
++0x00028328 PA_SC_VPORT_ZMIN_11
++0x0002832C PA_SC_VPORT_ZMAX_11
++0x00028330 PA_SC_VPORT_ZMIN_12
++0x00028334 PA_SC_VPORT_ZMAX_12
++0x00028338 PA_SC_VPORT_ZMIN_13
++0x0002833C PA_SC_VPORT_ZMAX_13
++0x00028340 PA_SC_VPORT_ZMIN_14
++0x00028344 PA_SC_VPORT_ZMAX_14
++0x00028348 PA_SC_VPORT_ZMIN_15
++0x0002834C PA_SC_VPORT_ZMAX_15
++0x00028350 SX_MISC
++0x00028354 SX_SURFACE_SYNC
++0x00028380 SQ_VTX_SEMANTIC_0
++0x00028384 SQ_VTX_SEMANTIC_1
++0x00028388 SQ_VTX_SEMANTIC_2
++0x0002838C SQ_VTX_SEMANTIC_3
++0x00028390 SQ_VTX_SEMANTIC_4
++0x00028394 SQ_VTX_SEMANTIC_5
++0x00028398 SQ_VTX_SEMANTIC_6
++0x0002839C SQ_VTX_SEMANTIC_7
++0x000283A0 SQ_VTX_SEMANTIC_8
++0x000283A4 SQ_VTX_SEMANTIC_9
++0x000283A8 SQ_VTX_SEMANTIC_10
++0x000283AC SQ_VTX_SEMANTIC_11
++0x000283B0 SQ_VTX_SEMANTIC_12
++0x000283B4 SQ_VTX_SEMANTIC_13
++0x000283B8 SQ_VTX_SEMANTIC_14
++0x000283BC SQ_VTX_SEMANTIC_15
++0x000283C0 SQ_VTX_SEMANTIC_16
++0x000283C4 SQ_VTX_SEMANTIC_17
++0x000283C8 SQ_VTX_SEMANTIC_18
++0x000283CC SQ_VTX_SEMANTIC_19
++0x000283D0 SQ_VTX_SEMANTIC_20
++0x000283D4 SQ_VTX_SEMANTIC_21
++0x000283D8 SQ_VTX_SEMANTIC_22
++0x000283DC SQ_VTX_SEMANTIC_23
++0x000283E0 SQ_VTX_SEMANTIC_24
++0x000283E4 SQ_VTX_SEMANTIC_25
++0x000283E8 SQ_VTX_SEMANTIC_26
++0x000283EC SQ_VTX_SEMANTIC_27
++0x000283F0 SQ_VTX_SEMANTIC_28
++0x000283F4 SQ_VTX_SEMANTIC_29
++0x000283F8 SQ_VTX_SEMANTIC_30
++0x000283FC SQ_VTX_SEMANTIC_31
++0x00028400 VGT_MAX_VTX_INDX
++0x00028404 VGT_MIN_VTX_INDX
++0x00028408 VGT_INDX_OFFSET
++0x0002840C VGT_MULTI_PRIM_IB_RESET_INDX
++0x00028410 SX_ALPHA_TEST_CONTROL
++0x00028414 CB_BLEND_RED
++0x00028418 CB_BLEND_GREEN
++0x0002841C CB_BLEND_BLUE
++0x00028420 CB_BLEND_ALPHA
++0x00028430 DB_STENCILREFMASK
++0x00028434 DB_STENCILREFMASK_BF
++0x00028438 SX_ALPHA_REF
++0x0002843C PA_CL_VPORT_XSCALE_0
++0x00028440 PA_CL_VPORT_XOFFSET_0
++0x00028444 PA_CL_VPORT_YSCALE_0
++0x00028448 PA_CL_VPORT_YOFFSET_0
++0x0002844C PA_CL_VPORT_ZSCALE_0
++0x00028450 PA_CL_VPORT_ZOFFSET_0
++0x00028454 PA_CL_VPORT_XSCALE_1
++0x00028458 PA_CL_VPORT_XOFFSET_1
++0x0002845C PA_CL_VPORT_YSCALE_1
++0x00028460 PA_CL_VPORT_YOFFSET_1
++0x00028464 PA_CL_VPORT_ZSCALE_1
++0x00028468 PA_CL_VPORT_ZOFFSET_1
++0x0002846C PA_CL_VPORT_XSCALE_2
++0x00028470 PA_CL_VPORT_XOFFSET_2
++0x00028474 PA_CL_VPORT_YSCALE_2
++0x00028478 PA_CL_VPORT_YOFFSET_2
++0x0002847C PA_CL_VPORT_ZSCALE_2
++0x00028480 PA_CL_VPORT_ZOFFSET_2
++0x00028484 PA_CL_VPORT_XSCALE_3
++0x00028488 PA_CL_VPORT_XOFFSET_3
++0x0002848C PA_CL_VPORT_YSCALE_3
++0x00028490 PA_CL_VPORT_YOFFSET_3
++0x00028494 PA_CL_VPORT_ZSCALE_3
++0x00028498 PA_CL_VPORT_ZOFFSET_3
++0x0002849C PA_CL_VPORT_XSCALE_4
++0x000284A0 PA_CL_VPORT_XOFFSET_4
++0x000284A4 PA_CL_VPORT_YSCALE_4
++0x000284A8 PA_CL_VPORT_YOFFSET_4
++0x000284AC PA_CL_VPORT_ZSCALE_4
++0x000284B0 PA_CL_VPORT_ZOFFSET_4
++0x000284B4 PA_CL_VPORT_XSCALE_5
++0x000284B8 PA_CL_VPORT_XOFFSET_5
++0x000284BC PA_CL_VPORT_YSCALE_5
++0x000284C0 PA_CL_VPORT_YOFFSET_5
++0x000284C4 PA_CL_VPORT_ZSCALE_5
++0x000284C8 PA_CL_VPORT_ZOFFSET_5
++0x000284CC PA_CL_VPORT_XSCALE_6
++0x000284D0 PA_CL_VPORT_XOFFSET_6
++0x000284D4 PA_CL_VPORT_YSCALE_6
++0x000284D8 PA_CL_VPORT_YOFFSET_6
++0x000284DC PA_CL_VPORT_ZSCALE_6
++0x000284E0 PA_CL_VPORT_ZOFFSET_6
++0x000284E4 PA_CL_VPORT_XSCALE_7
++0x000284E8 PA_CL_VPORT_XOFFSET_7
++0x000284EC PA_CL_VPORT_YSCALE_7
++0x000284F0 PA_CL_VPORT_YOFFSET_7
++0x000284F4 PA_CL_VPORT_ZSCALE_7
++0x000284F8 PA_CL_VPORT_ZOFFSET_7
++0x000284FC PA_CL_VPORT_XSCALE_8
++0x00028500 PA_CL_VPORT_XOFFSET_8
++0x00028504 PA_CL_VPORT_YSCALE_8
++0x00028508 PA_CL_VPORT_YOFFSET_8
++0x0002850C PA_CL_VPORT_ZSCALE_8
++0x00028510 PA_CL_VPORT_ZOFFSET_8
++0x00028514 PA_CL_VPORT_XSCALE_9
++0x00028518 PA_CL_VPORT_XOFFSET_9
++0x0002851C PA_CL_VPORT_YSCALE_9
++0x00028520 PA_CL_VPORT_YOFFSET_9
++0x00028524 PA_CL_VPORT_ZSCALE_9
++0x00028528 PA_CL_VPORT_ZOFFSET_9
++0x0002852C PA_CL_VPORT_XSCALE_10
++0x00028530 PA_CL_VPORT_XOFFSET_10
++0x00028534 PA_CL_VPORT_YSCALE_10
++0x00028538 PA_CL_VPORT_YOFFSET_10
++0x0002853C PA_CL_VPORT_ZSCALE_10
++0x00028540 PA_CL_VPORT_ZOFFSET_10
++0x00028544 PA_CL_VPORT_XSCALE_11
++0x00028548 PA_CL_VPORT_XOFFSET_11
++0x0002854C PA_CL_VPORT_YSCALE_11
++0x00028550 PA_CL_VPORT_YOFFSET_11
++0x00028554 PA_CL_VPORT_ZSCALE_11
++0x00028558 PA_CL_VPORT_ZOFFSET_11
++0x0002855C PA_CL_VPORT_XSCALE_12
++0x00028560 PA_CL_VPORT_XOFFSET_12
++0x00028564 PA_CL_VPORT_YSCALE_12
++0x00028568 PA_CL_VPORT_YOFFSET_12
++0x0002856C PA_CL_VPORT_ZSCALE_12
++0x00028570 PA_CL_VPORT_ZOFFSET_12
++0x00028574 PA_CL_VPORT_XSCALE_13
++0x00028578 PA_CL_VPORT_XOFFSET_13
++0x0002857C PA_CL_VPORT_YSCALE_13
++0x00028580 PA_CL_VPORT_YOFFSET_13
++0x00028584 PA_CL_VPORT_ZSCALE_13
++0x00028588 PA_CL_VPORT_ZOFFSET_13
++0x0002858C PA_CL_VPORT_XSCALE_14
++0x00028590 PA_CL_VPORT_XOFFSET_14
++0x00028594 PA_CL_VPORT_YSCALE_14
++0x00028598 PA_CL_VPORT_YOFFSET_14
++0x0002859C PA_CL_VPORT_ZSCALE_14
++0x000285A0 PA_CL_VPORT_ZOFFSET_14
++0x000285A4 PA_CL_VPORT_XSCALE_15
++0x000285A8 PA_CL_VPORT_XOFFSET_15
++0x000285AC PA_CL_VPORT_YSCALE_15
++0x000285B0 PA_CL_VPORT_YOFFSET_15
++0x000285B4 PA_CL_VPORT_ZSCALE_15
++0x000285B8 PA_CL_VPORT_ZOFFSET_15
++0x000285BC PA_CL_UCP_0_X
++0x000285C0 PA_CL_UCP_0_Y
++0x000285C4 PA_CL_UCP_0_Z
++0x000285C8 PA_CL_UCP_0_W
++0x000285CC PA_CL_UCP_1_X
++0x000285D0 PA_CL_UCP_1_Y
++0x000285D4 PA_CL_UCP_1_Z
++0x000285D8 PA_CL_UCP_1_W
++0x000285DC PA_CL_UCP_2_X
++0x000285E0 PA_CL_UCP_2_Y
++0x000285E4 PA_CL_UCP_2_Z
++0x000285E8 PA_CL_UCP_2_W
++0x000285EC PA_CL_UCP_3_X
++0x000285F0 PA_CL_UCP_3_Y
++0x000285F4 PA_CL_UCP_3_Z
++0x000285F8 PA_CL_UCP_3_W
++0x000285FC PA_CL_UCP_4_X
++0x00028600 PA_CL_UCP_4_Y
++0x00028604 PA_CL_UCP_4_Z
++0x00028608 PA_CL_UCP_4_W
++0x0002860C PA_CL_UCP_5_X
++0x00028610 PA_CL_UCP_5_Y
++0x00028614 PA_CL_UCP_5_Z
++0x00028618 PA_CL_UCP_5_W
++0x0002861C SPI_VS_OUT_ID_0
++0x00028620 SPI_VS_OUT_ID_1
++0x00028624 SPI_VS_OUT_ID_2
++0x00028628 SPI_VS_OUT_ID_3
++0x0002862C SPI_VS_OUT_ID_4
++0x00028630 SPI_VS_OUT_ID_5
++0x00028634 SPI_VS_OUT_ID_6
++0x00028638 SPI_VS_OUT_ID_7
++0x0002863C SPI_VS_OUT_ID_8
++0x00028640 SPI_VS_OUT_ID_9
++0x00028644 SPI_PS_INPUT_CNTL_0
++0x00028648 SPI_PS_INPUT_CNTL_1
++0x0002864C SPI_PS_INPUT_CNTL_2
++0x00028650 SPI_PS_INPUT_CNTL_3
++0x00028654 SPI_PS_INPUT_CNTL_4
++0x00028658 SPI_PS_INPUT_CNTL_5
++0x0002865C SPI_PS_INPUT_CNTL_6
++0x00028660 SPI_PS_INPUT_CNTL_7
++0x00028664 SPI_PS_INPUT_CNTL_8
++0x00028668 SPI_PS_INPUT_CNTL_9
++0x0002866C SPI_PS_INPUT_CNTL_10
++0x00028670 SPI_PS_INPUT_CNTL_11
++0x00028674 SPI_PS_INPUT_CNTL_12
++0x00028678 SPI_PS_INPUT_CNTL_13
++0x0002867C SPI_PS_INPUT_CNTL_14
++0x00028680 SPI_PS_INPUT_CNTL_15
++0x00028684 SPI_PS_INPUT_CNTL_16
++0x00028688 SPI_PS_INPUT_CNTL_17
++0x0002868C SPI_PS_INPUT_CNTL_18
++0x00028690 SPI_PS_INPUT_CNTL_19
++0x00028694 SPI_PS_INPUT_CNTL_20
++0x00028698 SPI_PS_INPUT_CNTL_21
++0x0002869C SPI_PS_INPUT_CNTL_22
++0x000286A0 SPI_PS_INPUT_CNTL_23
++0x000286A4 SPI_PS_INPUT_CNTL_24
++0x000286A8 SPI_PS_INPUT_CNTL_25
++0x000286AC SPI_PS_INPUT_CNTL_26
++0x000286B0 SPI_PS_INPUT_CNTL_27
++0x000286B4 SPI_PS_INPUT_CNTL_28
++0x000286B8 SPI_PS_INPUT_CNTL_29
++0x000286BC SPI_PS_INPUT_CNTL_30
++0x000286C0 SPI_PS_INPUT_CNTL_31
++0x000286C4 SPI_VS_OUT_CONFIG
++0x000286C8 SPI_THREAD_GROUPING
++0x000286CC SPI_PS_IN_CONTROL_0
++0x000286D0 SPI_PS_IN_CONTROL_1
++0x000286D4 SPI_INTERP_CONTROL_0
++0x000286D8 SPI_INPUT_Z
++0x000286DC SPI_FOG_CNTL
++0x000286E0 SPI_BARYC_CNTL
++0x000286E4 SPI_PS_IN_CONTROL_2
++0x000286E8 SPI_COMPUTE_INPUT_CNTL
++0x000286EC SPI_COMPUTE_NUM_THREAD_X
++0x000286F0 SPI_COMPUTE_NUM_THREAD_Y
++0x000286F4 SPI_COMPUTE_NUM_THREAD_Z
++0x000286F8 SPI_GPR_MGMT
++0x000286FC SPI_LDS_MGMT
++0x00028700 SPI_STACK_MGMT
++0x00028704 SPI_WAVE_MGMT_1
++0x00028708 SPI_WAVE_MGMT_2
++0x00028724 GDS_ADDR_SIZE
++0x00028780 CB_BLEND0_CONTROL
++0x00028784 CB_BLEND1_CONTROL
++0x00028788 CB_BLEND2_CONTROL
++0x0002878C CB_BLEND3_CONTROL
++0x00028790 CB_BLEND4_CONTROL
++0x00028794 CB_BLEND5_CONTROL
++0x00028798 CB_BLEND6_CONTROL
++0x0002879C CB_BLEND7_CONTROL
++0x000287CC CS_COPY_STATE
++0x000287D0 GFX_COPY_STATE
++0x000287D4 PA_CL_POINT_X_RAD
++0x000287D8 PA_CL_POINT_Y_RAD
++0x000287DC PA_CL_POINT_SIZE
++0x000287E0 PA_CL_POINT_CULL_RAD
++0x00028808 CB_COLOR_CONTROL
++0x0002880C DB_SHADER_CONTROL
++0x00028810 PA_CL_CLIP_CNTL
++0x00028814 PA_SU_SC_MODE_CNTL
++0x00028818 PA_CL_VTE_CNTL
++0x0002881C PA_CL_VS_OUT_CNTL
++0x00028820 PA_CL_NANINF_CNTL
++0x00028824 PA_SU_LINE_STIPPLE_CNTL
++0x00028828 PA_SU_LINE_STIPPLE_SCALE
++0x0002882C PA_SU_PRIM_FILTER_CNTL
++0x00028844 SQ_PGM_RESOURCES_PS
++0x00028848 SQ_PGM_RESOURCES_2_PS
++0x0002884C SQ_PGM_EXPORTS_PS
++0x00028860 SQ_PGM_RESOURCES_VS
++0x00028864 SQ_PGM_RESOURCES_2_VS
++0x00028878 SQ_PGM_RESOURCES_GS
++0x0002887C SQ_PGM_RESOURCES_2_GS
++0x00028890 SQ_PGM_RESOURCES_ES
++0x00028894 SQ_PGM_RESOURCES_2_ES
++0x000288A8 SQ_PGM_RESOURCES_FS
++0x000288BC SQ_PGM_RESOURCES_HS
++0x000288C0 SQ_PGM_RESOURCES_2_HS
++0x000288D4 SQ_PGM_RESOURCES_LS
++0x000288D8 SQ_PGM_RESOURCES_2_LS
++0x000288E8 SQ_LDS_ALLOC
++0x000288EC SQ_LDS_ALLOC_PS
++0x000288F0 SQ_VTX_SEMANTIC_CLEAR
++0x00028A00 PA_SU_POINT_SIZE
++0x00028A04 PA_SU_POINT_MINMAX
++0x00028A08 PA_SU_LINE_CNTL
++0x00028A0C PA_SC_LINE_STIPPLE
++0x00028A10 VGT_OUTPUT_PATH_CNTL
++0x00028A14 VGT_HOS_CNTL
++0x00028A18 VGT_HOS_MAX_TESS_LEVEL
++0x00028A1C VGT_HOS_MIN_TESS_LEVEL
++0x00028A20 VGT_HOS_REUSE_DEPTH
++0x00028A24 VGT_GROUP_PRIM_TYPE
++0x00028A28 VGT_GROUP_FIRST_DECR
++0x00028A2C VGT_GROUP_DECR
++0x00028A30 VGT_GROUP_VECT_0_CNTL
++0x00028A34 VGT_GROUP_VECT_1_CNTL
++0x00028A38 VGT_GROUP_VECT_0_FMT_CNTL
++0x00028A3C VGT_GROUP_VECT_1_FMT_CNTL
++0x00028A40 VGT_GS_MODE
++0x00028A48 PA_SC_MODE_CNTL_0
++0x00028A4C PA_SC_MODE_CNTL_1
++0x00028A50 VGT_ENHANCE
++0x00028A54 VGT_GS_PER_ES
++0x00028A58 VGT_ES_PER_GS
++0x00028A5C VGT_GS_PER_VS
++0x00028A6C VGT_GS_OUT_PRIM_TYPE
++0x00028A70 IA_ENHANCE
++0x00028A84 VGT_PRIMITIVEID_EN
++0x00028A94 VGT_MULTI_PRIM_IB_RESET_EN
++0x00028AA0 VGT_INSTANCE_STEP_RATE_0
++0x00028AA4 VGT_INSTANCE_STEP_RATE_1
++0x00028AA8 IA_MULTI_VGT_PARAM
++0x00028AB4 VGT_REUSE_OFF
++0x00028AB8 VGT_VTX_CNT_EN
++0x00028ABC DB_HTILE_SURFACE
++0x00028AC0 DB_SRESULTS_COMPARE_STATE0
++0x00028AC4 DB_SRESULTS_COMPARE_STATE1
++0x00028AC8 DB_PRELOAD_CONTROL
++0x00028B38 VGT_GS_MAX_VERT_OUT
++0x00028B54 VGT_SHADER_STAGES_EN
++0x00028B58 VGT_LS_HS_CONFIG
++0x00028B6C VGT_TF_PARAM
++0x00028B70 DB_ALPHA_TO_MASK
++0x00028B74 VGT_DISPATCH_INITIATOR
++0x00028B78 PA_SU_POLY_OFFSET_DB_FMT_CNTL
++0x00028B7C PA_SU_POLY_OFFSET_CLAMP
++0x00028B80 PA_SU_POLY_OFFSET_FRONT_SCALE
++0x00028B84 PA_SU_POLY_OFFSET_FRONT_OFFSET
++0x00028B88 PA_SU_POLY_OFFSET_BACK_SCALE
++0x00028B8C PA_SU_POLY_OFFSET_BACK_OFFSET
++0x00028B74 VGT_GS_INSTANCE_CNT
++0x00028BD4 PA_SC_CENTROID_PRIORITY_0
++0x00028BD8 PA_SC_CENTROID_PRIORITY_1
++0x00028BDC PA_SC_LINE_CNTL
++0x00028BE4 PA_SU_VTX_CNTL
++0x00028BE8 PA_CL_GB_VERT_CLIP_ADJ
++0x00028BEC PA_CL_GB_VERT_DISC_ADJ
++0x00028BF0 PA_CL_GB_HORZ_CLIP_ADJ
++0x00028BF4 PA_CL_GB_HORZ_DISC_ADJ
++0x00028BF8 PA_SC_AA_SAMPLE_LOCS_PIXEL_X0_Y0_0
++0x00028BFC PA_SC_AA_SAMPLE_LOCS_PIXEL_X0_Y0_1
++0x00028C00 PA_SC_AA_SAMPLE_LOCS_PIXEL_X0_Y0_2
++0x00028C04 PA_SC_AA_SAMPLE_LOCS_PIXEL_X0_Y0_3
++0x00028C08 PA_SC_AA_SAMPLE_LOCS_PIXEL_X1_Y0_0
++0x00028C0C PA_SC_AA_SAMPLE_LOCS_PIXEL_X1_Y0_1
++0x00028C10 PA_SC_AA_SAMPLE_LOCS_PIXEL_X1_Y0_2
++0x00028C14 PA_SC_AA_SAMPLE_LOCS_PIXEL_X1_Y0_3
++0x00028C18 PA_SC_AA_SAMPLE_LOCS_PIXEL_X0_Y1_0
++0x00028C1C PA_SC_AA_SAMPLE_LOCS_PIXEL_X0_Y1_1
++0x00028C20 PA_SC_AA_SAMPLE_LOCS_PIXEL_X0_Y1_2
++0x00028C24 PA_SC_AA_SAMPLE_LOCS_PIXEL_X0_Y1_3
++0x00028C28 PA_SC_AA_SAMPLE_LOCS_PIXEL_X1_Y1_0
++0x00028C2C PA_SC_AA_SAMPLE_LOCS_PIXEL_X1_Y1_1
++0x00028C30 PA_SC_AA_SAMPLE_LOCS_PIXEL_X1_Y1_2
++0x00028C34 PA_SC_AA_SAMPLE_LOCS_PIXEL_X1_Y1_3
++0x00028C38 PA_SC_AA_MASK_X0_Y0_X1_Y0
++0x00028C3C PA_SC_AA_MASK_X0_Y1_X1_Y1
++0x00028C8C CB_COLOR0_CLEAR_WORD0
++0x00028C90 CB_COLOR0_CLEAR_WORD1
++0x00028C94 CB_COLOR0_CLEAR_WORD2
++0x00028C98 CB_COLOR0_CLEAR_WORD3
++0x00028CC8 CB_COLOR1_CLEAR_WORD0
++0x00028CCC CB_COLOR1_CLEAR_WORD1
++0x00028CD0 CB_COLOR1_CLEAR_WORD2
++0x00028CD4 CB_COLOR1_CLEAR_WORD3
++0x00028D04 CB_COLOR2_CLEAR_WORD0
++0x00028D08 CB_COLOR2_CLEAR_WORD1
++0x00028D0C CB_COLOR2_CLEAR_WORD2
++0x00028D10 CB_COLOR2_CLEAR_WORD3
++0x00028D40 CB_COLOR3_CLEAR_WORD0
++0x00028D44 CB_COLOR3_CLEAR_WORD1
++0x00028D48 CB_COLOR3_CLEAR_WORD2
++0x00028D4C CB_COLOR3_CLEAR_WORD3
++0x00028D7C CB_COLOR4_CLEAR_WORD0
++0x00028D80 CB_COLOR4_CLEAR_WORD1
++0x00028D84 CB_COLOR4_CLEAR_WORD2
++0x00028D88 CB_COLOR4_CLEAR_WORD3
++0x00028DB8 CB_COLOR5_CLEAR_WORD0
++0x00028DBC CB_COLOR5_CLEAR_WORD1
++0x00028DC0 CB_COLOR5_CLEAR_WORD2
++0x00028DC4 CB_COLOR5_CLEAR_WORD3
++0x00028DF4 CB_COLOR6_CLEAR_WORD0
++0x00028DF8 CB_COLOR6_CLEAR_WORD1
++0x00028DFC CB_COLOR6_CLEAR_WORD2
++0x00028E00 CB_COLOR6_CLEAR_WORD3
++0x00028E30 CB_COLOR7_CLEAR_WORD0
++0x00028E34 CB_COLOR7_CLEAR_WORD1
++0x00028E38 CB_COLOR7_CLEAR_WORD2
++0x00028E3C CB_COLOR7_CLEAR_WORD3
++0x00028F80 SQ_ALU_CONST_BUFFER_SIZE_HS_0
++0x00028F84 SQ_ALU_CONST_BUFFER_SIZE_HS_1
++0x00028F88 SQ_ALU_CONST_BUFFER_SIZE_HS_2
++0x00028F8C SQ_ALU_CONST_BUFFER_SIZE_HS_3
++0x00028F90 SQ_ALU_CONST_BUFFER_SIZE_HS_4
++0x00028F94 SQ_ALU_CONST_BUFFER_SIZE_HS_5
++0x00028F98 SQ_ALU_CONST_BUFFER_SIZE_HS_6
++0x00028F9C SQ_ALU_CONST_BUFFER_SIZE_HS_7
++0x00028FA0 SQ_ALU_CONST_BUFFER_SIZE_HS_8
++0x00028FA4 SQ_ALU_CONST_BUFFER_SIZE_HS_9
++0x00028FA8 SQ_ALU_CONST_BUFFER_SIZE_HS_10
++0x00028FAC SQ_ALU_CONST_BUFFER_SIZE_HS_11
++0x00028FB0 SQ_ALU_CONST_BUFFER_SIZE_HS_12
++0x00028FB4 SQ_ALU_CONST_BUFFER_SIZE_HS_13
++0x00028FB8 SQ_ALU_CONST_BUFFER_SIZE_HS_14
++0x00028FBC SQ_ALU_CONST_BUFFER_SIZE_HS_15
++0x00028FC0 SQ_ALU_CONST_BUFFER_SIZE_LS_0
++0x00028FC4 SQ_ALU_CONST_BUFFER_SIZE_LS_1
++0x00028FC8 SQ_ALU_CONST_BUFFER_SIZE_LS_2
++0x00028FCC SQ_ALU_CONST_BUFFER_SIZE_LS_3
++0x00028FD0 SQ_ALU_CONST_BUFFER_SIZE_LS_4
++0x00028FD4 SQ_ALU_CONST_BUFFER_SIZE_LS_5
++0x00028FD8 SQ_ALU_CONST_BUFFER_SIZE_LS_6
++0x00028FDC SQ_ALU_CONST_BUFFER_SIZE_LS_7
++0x00028FE0 SQ_ALU_CONST_BUFFER_SIZE_LS_8
++0x00028FE4 SQ_ALU_CONST_BUFFER_SIZE_LS_9
++0x00028FE8 SQ_ALU_CONST_BUFFER_SIZE_LS_10
++0x00028FEC SQ_ALU_CONST_BUFFER_SIZE_LS_11
++0x00028FF0 SQ_ALU_CONST_BUFFER_SIZE_LS_12
++0x00028FF4 SQ_ALU_CONST_BUFFER_SIZE_LS_13
++0x00028FF8 SQ_ALU_CONST_BUFFER_SIZE_LS_14
++0x00028FFC SQ_ALU_CONST_BUFFER_SIZE_LS_15
++0x0003CFF0 SQ_VTX_BASE_VTX_LOC
++0x0003CFF4 SQ_VTX_START_INST_LOC
++0x0003FF00 SQ_TEX_SAMPLER_CLEAR
++0x0003FF04 SQ_TEX_RESOURCE_CLEAR
++0x0003FF08 SQ_LOOP_BOOL_CLEAR
+diff --git a/drivers/gpu/drm/radeon/reg_srcs/evergreen b/drivers/gpu/drm/radeon/reg_srcs/evergreen
+index 9177f91..7e16371 100644
+--- a/drivers/gpu/drm/radeon/reg_srcs/evergreen
++++ b/drivers/gpu/drm/radeon/reg_srcs/evergreen
+@@ -1,4 +1,5 @@
+ evergreen 0x9400
++0x0000802C GRBM_GFX_INDEX
+ 0x00008040 WAIT_UNTIL
+ 0x00008044 WAIT_UNTIL_POLL_CNTL
+ 0x00008048 WAIT_UNTIL_POLL_MASK
+@@ -220,6 +221,7 @@ evergreen 0x9400
+ 0x00028348 PA_SC_VPORT_ZMIN_15
+ 0x0002834C PA_SC_VPORT_ZMAX_15
+ 0x00028350 SX_MISC
++0x00028354 SX_SURFACE_SYNC
+ 0x00028380 SQ_VTX_SEMANTIC_0
+ 0x00028384 SQ_VTX_SEMANTIC_1
+ 0x00028388 SQ_VTX_SEMANTIC_2
+diff --git a/drivers/gpu/drm/radeon/reg_srcs/r600 b/drivers/gpu/drm/radeon/reg_srcs/r600
+index af0da4a..92f1900 100644
+--- a/drivers/gpu/drm/radeon/reg_srcs/r600
++++ b/drivers/gpu/drm/radeon/reg_srcs/r600
+@@ -708,6 +708,7 @@ r600 0x9400
+ 0x00028D0C DB_RENDER_CONTROL
+ 0x00028D10 DB_RENDER_OVERRIDE
+ 0x0002880C DB_SHADER_CONTROL
++0x00028D28 DB_SRESULTS_COMPARE_STATE0
+ 0x00028D2C DB_SRESULTS_COMPARE_STATE1
+ 0x00028430 DB_STENCILREFMASK
+ 0x00028434 DB_STENCILREFMASK_BF
+diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
+index 8af4679..c55cf2a 100644
+--- a/drivers/gpu/drm/radeon/rs600.c
++++ b/drivers/gpu/drm/radeon/rs600.c
+@@ -48,17 +48,6 @@ int rs600_mc_wait_for_idle(struct radeon_device *rdev);
+
+ void rs600_pre_page_flip(struct radeon_device *rdev, int crtc)
+ {
+- struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc];
+- u32 tmp;
+-
+- /* make sure flip is at vb rather than hb */
+- tmp = RREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset);
+- tmp &= ~AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN;
+- WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
+-
+- /* set pageflip to happen anywhere in vblank interval */
+- WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0);
+-
+ /* enable the pflip int */
+ radeon_irq_kms_pflip_irq_get(rdev, crtc);
+ }
+@@ -125,7 +114,7 @@ void rs600_pm_misc(struct radeon_device *rdev)
+ udelay(voltage->delay);
+ }
+ } else if (voltage->type == VOLTAGE_VDDC)
+- radeon_atom_set_voltage(rdev, voltage->vddc_id);
++ radeon_atom_set_voltage(rdev, voltage->vddc_id, SET_VOLTAGE_TYPE_ASIC_VDDC);
+
+ dyn_pwrmgt_sclk_length = RREG32_PLL(DYN_PWRMGT_SCLK_LENGTH);
+ dyn_pwrmgt_sclk_length &= ~REDUCED_POWER_SCLK_HILEN(0xf);
+diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
+index 714ad45..114e5cc 100644
+--- a/drivers/gpu/drm/radeon/rv770.c
++++ b/drivers/gpu/drm/radeon/rv770.c
+@@ -106,7 +106,7 @@ void rv770_pm_misc(struct radeon_device *rdev)
+
+ if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
+ if (voltage->voltage != rdev->pm.current_vddc) {
+- radeon_atom_set_voltage(rdev, voltage->voltage);
++ radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
+ rdev->pm.current_vddc = voltage->voltage;
+ DRM_DEBUG("Setting: v: %d\n", voltage->voltage);
+ }
+diff --git a/include/drm/radeon_drm.h b/include/drm/radeon_drm.h
+index e5c607a..32c8e1c 100644
+--- a/include/drm/radeon_drm.h
++++ b/include/drm/radeon_drm.h
+@@ -908,6 +908,9 @@ struct drm_radeon_cs {
+ #define RADEON_INFO_WANT_HYPERZ 0x07
+ #define RADEON_INFO_WANT_CMASK 0x08 /* get access to CMASK on r300 */
+ #define RADEON_INFO_CLOCK_CRYSTAL_FREQ 0x09 /* clock crystal frequency */
++#define RADEON_INFO_NUM_BACKENDS 0x0a /* DB/backends for r600+ - need for OQ */
++#define RADEON_INFO_NUM_TILE_PIPES 0x0b /* tile pipes for r600+ */
++#define RADEON_INFO_FUSION_GART_WORKING 0x0c /* fusion writes to GTT were broken before this */
+
+ struct drm_radeon_info {
+ uint32_t request;
+diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h
+index 6724bf3..816e30c 100644
+--- a/include/drm/drm_pciids.h
++++ b/include/drm/drm_pciids.h
+@@ -141,6 +141,20 @@
+ {0x1002, 0x5e4c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \
+ {0x1002, 0x5e4d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \
+ {0x1002, 0x5e4f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \
++ {0x1002, 0x6700, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \
++ {0x1002, 0x6701, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \
++ {0x1002, 0x6702, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \
++ {0x1002, 0x6703, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \
++ {0x1002, 0x6704, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \
++ {0x1002, 0x6705, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \
++ {0x1002, 0x6706, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \
++ {0x1002, 0x6707, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \
++ {0x1002, 0x6708, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \
++ {0x1002, 0x6709, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \
++ {0x1002, 0x6718, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \
++ {0x1002, 0x6719, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \
++ {0x1002, 0x671c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \
++ {0x1002, 0x671d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \
+ {0x1002, 0x6720, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
+ {0x1002, 0x6721, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
+ {0x1002, 0x6722, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \
+--
+1.7.1
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-ttm-move-notify.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-ttm-move-notify.patch
new file mode 100644
index 000000000..4d4206fdc
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-ttm-move-notify.patch
@@ -0,0 +1,40 @@
+From e40ec45d67d32ce900dd6f2242675979593db18c Mon Sep 17 00:00:00 2001
+From: Ben Skeggs <bskeggs@redhat.com>
+Date: Tue, 18 Jan 2011 11:04:03 +1000
+Subject: [PATCH] drm/ttm: call driver move_notify() when doing system->tt bo moves
+
+Nouveau doesn't have enough information at ttm_backend_func.bind() time
+to implement things like tiled GART, or to keep a buffer at a constant
+address in the GPU virtual address space no matter where in physical
+memory it's placed.
+
+To resolve this, nouveau will handle binding of all buffers to the GPU
+itself from the move_notify() hook. This commit ensures it's called
+for all buffer moves.
+
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ drivers/gpu/drm/ttm/ttm_bo.c | 3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
+index af61fc2..0b6a55a 100644
+--- a/drivers/gpu/drm/ttm/ttm_bo.c
++++ b/drivers/gpu/drm/ttm/ttm_bo.c
+@@ -406,11 +406,12 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,
+ }
+
+ if (bo->mem.mem_type == TTM_PL_SYSTEM) {
++ if (bdev->driver->move_notify)
++ bdev->driver->move_notify(bo, mem);
+ bo->mem = *mem;
+ mem->mm_node = NULL;
+ goto moved;
+ }
+-
+ }
+
+ if (bdev->driver->move_notify)
+--
+1.7.4.2
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-vblank-events-fix-hangs.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-vblank-events-fix-hangs.patch
new file mode 100644
index 000000000..1148f4e3c
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/drm-vblank-events-fix-hangs.patch
@@ -0,0 +1,60 @@
+From 498548ec69c6897fe4376b2ca90758762fa0b817 Mon Sep 17 00:00:00 2001
+From: Christopher James Halse Rogers <christopher.halse.rogers@canonical.com>
+Date: Wed, 27 Apr 2011 16:10:57 +1000
+Subject: [PATCH 3/4] drm: Send pending vblank events before disabling vblank.
+
+This is the least-bad behaviour. It means that we signal the
+vblank event before it actually happens, but since we're disabling
+vblanks there's no guarantee that it will *ever* happen otherwise.
+
+This prevents GL applications which use WaitMSC from hanging
+indefinitely.
+
+Signed-off-by: Christopher James Halse Rogers <christopher.halse.rogers@canonical.com>
+Signed-off-by: Dave Airlie <airlied@redhat.com>
+---
+ drivers/gpu/drm/drm_irq.c | 23 +++++++++++++++++++++++
+ 1 files changed, 23 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
+index 741457b..a1f12cb 100644
+--- a/drivers/gpu/drm/drm_irq.c
++++ b/drivers/gpu/drm/drm_irq.c
+@@ -932,11 +932,34 @@ EXPORT_SYMBOL(drm_vblank_put);
+
+ void drm_vblank_off(struct drm_device *dev, int crtc)
+ {
++ struct drm_pending_vblank_event *e, *t;
++ struct timeval now;
+ unsigned long irqflags;
++ unsigned int seq;
+
+ spin_lock_irqsave(&dev->vbl_lock, irqflags);
+ vblank_disable_and_save(dev, crtc);
+ DRM_WAKEUP(&dev->vbl_queue[crtc]);
++
++ /* Send any queued vblank events, lest the natives grow disquiet */
++ seq = drm_vblank_count_and_time(dev, crtc, &now);
++ list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) {
++ if (e->pipe != crtc)
++ continue;
++ DRM_DEBUG("Sending premature vblank event on disable: \
++ wanted %d, current %d\n",
++ e->event.sequence, seq);
++
++ e->event.sequence = seq;
++ e->event.tv_sec = now.tv_sec;
++ e->event.tv_usec = now.tv_usec;
++ drm_vblank_put(dev, e->pipe);
++ list_move_tail(&e->base.link, &e->base.file_priv->event_list);
++ wake_up_interruptible(&e->base.file_priv->event_wait);
++ trace_drm_vblank_event_delivered(e->base.pid, e->pipe,
++ e->event.sequence);
++ }
++
+ spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
+ }
+ EXPORT_SYMBOL(drm_vblank_off);
+--
+1.7.1
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/efifb_update.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/efifb_update.patch
new file mode 100644
index 000000000..7058ba610
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/efifb_update.patch
@@ -0,0 +1,217 @@
+Fix up efifb so it works properly on the 11" Macbook Air. Upstream in .38?
+
+diff --git a/drivers/video/efifb.c b/drivers/video/efifb.c
+index 70477c2..476ffb1 100644
+--- a/drivers/video/efifb.c
++++ b/drivers/video/efifb.c
+@@ -53,6 +53,7 @@ enum {
+ M_MB_7_1, /* MacBook, 7th rev. */
+ M_MB_SR, /* MacBook, 2nd gen, (Santa Rosa) */
+ M_MBA, /* MacBook Air */
++ M_MBA_3, /* Macbook Air, 3rd rev */
+ M_MBP, /* MacBook Pro */
+ M_MBP_2, /* MacBook Pro 2nd gen */
+ M_MBP_2_2, /* MacBook Pro 2,2nd gen */
+@@ -67,40 +68,49 @@ enum {
+ M_UNKNOWN /* placeholder */
+ };
+
++#define OVERRIDE_NONE 0x0
++#define OVERRIDE_BASE 0x1
++#define OVERRIDE_STRIDE 0x2
++#define OVERRIDE_HEIGHT 0x4
++#define OVERRIDE_WIDTH 0x8
++
+ static struct efifb_dmi_info {
+ char *optname;
+ unsigned long base;
+ int stride;
+ int width;
+ int height;
++ int flags;
+ } dmi_list[] __initdata = {
+- [M_I17] = { "i17", 0x80010000, 1472 * 4, 1440, 900 },
+- [M_I20] = { "i20", 0x80010000, 1728 * 4, 1680, 1050 }, /* guess */
+- [M_I20_SR] = { "imac7", 0x40010000, 1728 * 4, 1680, 1050 },
+- [M_I24] = { "i24", 0x80010000, 2048 * 4, 1920, 1200 }, /* guess */
+- [M_I24_8_1] = { "imac8", 0xc0060000, 2048 * 4, 1920, 1200 },
+- [M_I24_10_1] = { "imac10", 0xc0010000, 2048 * 4, 1920, 1080 },
+- [M_I27_11_1] = { "imac11", 0xc0010000, 2560 * 4, 2560, 1440 },
+- [M_MINI]= { "mini", 0x80000000, 2048 * 4, 1024, 768 },
+- [M_MINI_3_1] = { "mini31", 0x40010000, 1024 * 4, 1024, 768 },
+- [M_MINI_4_1] = { "mini41", 0xc0010000, 2048 * 4, 1920, 1200 },
+- [M_MB] = { "macbook", 0x80000000, 2048 * 4, 1280, 800 },
+- [M_MB_5_1] = { "macbook51", 0x80010000, 2048 * 4, 1280, 800 },
+- [M_MB_6_1] = { "macbook61", 0x80010000, 2048 * 4, 1280, 800 },
+- [M_MB_7_1] = { "macbook71", 0x80010000, 2048 * 4, 1280, 800 },
+- [M_MBA] = { "mba", 0x80000000, 2048 * 4, 1280, 800 },
+- [M_MBP] = { "mbp", 0x80010000, 1472 * 4, 1440, 900 },
+- [M_MBP_2] = { "mbp2", 0, 0, 0, 0 }, /* placeholder */
+- [M_MBP_2_2] = { "mbp22", 0x80010000, 1472 * 4, 1440, 900 },
+- [M_MBP_SR] = { "mbp3", 0x80030000, 2048 * 4, 1440, 900 },
+- [M_MBP_4] = { "mbp4", 0xc0060000, 2048 * 4, 1920, 1200 },
+- [M_MBP_5_1] = { "mbp51", 0xc0010000, 2048 * 4, 1440, 900 },
+- [M_MBP_5_2] = { "mbp52", 0xc0010000, 2048 * 4, 1920, 1200 },
+- [M_MBP_5_3] = { "mbp53", 0xd0010000, 2048 * 4, 1440, 900 },
+- [M_MBP_6_1] = { "mbp61", 0x90030000, 2048 * 4, 1920, 1200 },
+- [M_MBP_6_2] = { "mbp62", 0x90030000, 2048 * 4, 1680, 1050 },
+- [M_MBP_7_1] = { "mbp71", 0xc0010000, 2048 * 4, 1280, 800 },
+- [M_UNKNOWN] = { NULL, 0, 0, 0, 0 }
++ [M_I17] = { "i17", 0x80010000, 1472 * 4, 1440, 900, OVERRIDE_NONE },
++ [M_I20] = { "i20", 0x80010000, 1728 * 4, 1680, 1050, OVERRIDE_NONE }, /* guess */
++ [M_I20_SR] = { "imac7", 0x40010000, 1728 * 4, 1680, 1050, OVERRIDE_NONE },
++ [M_I24] = { "i24", 0x80010000, 2048 * 4, 1920, 1200, OVERRIDE_NONE }, /* guess */
++ [M_I24_8_1] = { "imac8", 0xc0060000, 2048 * 4, 1920, 1200, OVERRIDE_NONE },
++ [M_I24_10_1] = { "imac10", 0xc0010000, 2048 * 4, 1920, 1080, OVERRIDE_NONE },
++ [M_I27_11_1] = { "imac11", 0xc0010000, 2560 * 4, 2560, 1440, OVERRIDE_NONE },
++ [M_MINI]= { "mini", 0x80000000, 2048 * 4, 1024, 768, OVERRIDE_NONE },
++ [M_MINI_3_1] = { "mini31", 0x40010000, 1024 * 4, 1024, 768, OVERRIDE_NONE },
++ [M_MINI_4_1] = { "mini41", 0xc0010000, 2048 * 4, 1920, 1200, OVERRIDE_NONE },
++ [M_MB] = { "macbook", 0x80000000, 2048 * 4, 1280, 800, OVERRIDE_NONE },
++ [M_MB_5_1] = { "macbook51", 0x80010000, 2048 * 4, 1280, 800, OVERRIDE_NONE },
++ [M_MB_6_1] = { "macbook61", 0x80010000, 2048 * 4, 1280, 800, OVERRIDE_NONE },
++ [M_MB_7_1] = { "macbook71", 0x80010000, 2048 * 4, 1280, 800, OVERRIDE_NONE },
++ [M_MBA] = { "mba", 0x80000000, 2048 * 4, 1280, 800, OVERRIDE_NONE },
++ /* 11" Macbook Air 3,1 passes the wrong stride */
++ [M_MBA_3] = { "mba3", 0, 2048 * 4, 0, 0, OVERRIDE_STRIDE },
++ [M_MBP] = { "mbp", 0x80010000, 1472 * 4, 1440, 900, OVERRIDE_NONE },
++ [M_MBP_2] = { "mbp2", 0, 0, 0, 0, OVERRIDE_NONE }, /* placeholder */
++ [M_MBP_2_2] = { "mbp22", 0x80010000, 1472 * 4, 1440, 900, OVERRIDE_NONE },
++ [M_MBP_SR] = { "mbp3", 0x80030000, 2048 * 4, 1440, 900, OVERRIDE_NONE },
++ [M_MBP_4] = { "mbp4", 0xc0060000, 2048 * 4, 1920, 1200, OVERRIDE_NONE },
++ [M_MBP_5_1] = { "mbp51", 0xc0010000, 2048 * 4, 1440, 900, OVERRIDE_NONE },
++ [M_MBP_5_2] = { "mbp52", 0xc0010000, 2048 * 4, 1920, 1200, OVERRIDE_NONE },
++ [M_MBP_5_3] = { "mbp53", 0xd0010000, 2048 * 4, 1440, 900, OVERRIDE_NONE },
++ [M_MBP_6_1] = { "mbp61", 0x90030000, 2048 * 4, 1920, 1200, OVERRIDE_NONE },
++ [M_MBP_6_2] = { "mbp62", 0x90030000, 2048 * 4, 1680, 1050, OVERRIDE_NONE },
++ [M_MBP_7_1] = { "mbp71", 0xc0010000, 2048 * 4, 1280, 800, OVERRIDE_NONE },
++ [M_UNKNOWN] = { NULL, 0, 0, 0, 0, OVERRIDE_NONE }
+ };
+
+ static int set_system(const struct dmi_system_id *id);
+@@ -138,6 +148,7 @@ static const struct dmi_system_id dmi_system_table[] __initconst = {
+ EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook6,1", M_MB_6_1),
+ EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook7,1", M_MB_7_1),
+ EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookAir1,1", M_MBA),
++ EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookAir3,1", M_MBA_3),
+ EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro1,1", M_MBP),
+ EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro2,1", M_MBP_2),
+ EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro2,2", M_MBP_2_2),
+@@ -154,16 +165,22 @@ static const struct dmi_system_id dmi_system_table[] __initconst = {
+ {},
+ };
+
++#define choose_value(dmivalue, fwvalue, field, flags) ({ \
++ typeof(fwvalue) _ret_ = fwvalue; \
++ if ((flags) & (field)) \
++ _ret_ = dmivalue; \
++ else if ((fwvalue) == 0) \
++ _ret_ = dmivalue; \
++ _ret_; \
++ })
++
+ static int set_system(const struct dmi_system_id *id)
+ {
+ struct efifb_dmi_info *info = id->driver_data;
+- if (info->base == 0)
+- return 0;
+
+- printk(KERN_INFO "efifb: dmi detected %s - framebuffer at %p "
+- "(%dx%d, stride %d)\n", id->ident,
+- (void *)info->base, info->width, info->height,
+- info->stride);
++ if (info->base == 0 && info->height == 0 && info->width == 0
++ && info->stride == 0)
++ return 0;
+
+ /* Trust the bootloader over the DMI tables */
+ if (screen_info.lfb_base == 0) {
+@@ -171,40 +188,47 @@ static int set_system(const struct dmi_system_id *id)
+ struct pci_dev *dev = NULL;
+ int found_bar = 0;
+ #endif
+- screen_info.lfb_base = info->base;
++ if (info->base) {
++ screen_info.lfb_base = choose_value(info->base,
++ screen_info.lfb_base, OVERRIDE_BASE,
++ info->flags);
+
+ #if defined(CONFIG_PCI)
+- /* make sure that the address in the table is actually on a
+- * VGA device's PCI BAR */
+-
+- for_each_pci_dev(dev) {
+- int i;
+- if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
+- continue;
+- for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
+- resource_size_t start, end;
+-
+- start = pci_resource_start(dev, i);
+- if (start == 0)
+- break;
+- end = pci_resource_end(dev, i);
+- if (screen_info.lfb_base >= start &&
+- screen_info.lfb_base < end) {
+- found_bar = 1;
++ /* make sure that the address in the table is actually
++ * on a VGA device's PCI BAR */
++
++ for_each_pci_dev(dev) {
++ int i;
++ if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
++ continue;
++ for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
++ resource_size_t start, end;
++
++ start = pci_resource_start(dev, i);
++ if (start == 0)
++ break;
++ end = pci_resource_end(dev, i);
++ if (screen_info.lfb_base >= start &&
++ screen_info.lfb_base < end) {
++ found_bar = 1;
++ }
+ }
+ }
+- }
+- if (!found_bar)
+- screen_info.lfb_base = 0;
++ if (!found_bar)
++ screen_info.lfb_base = 0;
+ #endif
++ }
+ }
+ if (screen_info.lfb_base) {
+- if (screen_info.lfb_linelength == 0)
+- screen_info.lfb_linelength = info->stride;
+- if (screen_info.lfb_width == 0)
+- screen_info.lfb_width = info->width;
+- if (screen_info.lfb_height == 0)
+- screen_info.lfb_height = info->height;
++ screen_info.lfb_linelength = choose_value(info->stride,
++ screen_info.lfb_linelength, OVERRIDE_STRIDE,
++ info->flags);
++ screen_info.lfb_width = choose_value(info->width,
++ screen_info.lfb_width, OVERRIDE_WIDTH,
++ info->flags);
++ screen_info.lfb_height = choose_value(info->height,
++ screen_info.lfb_height, OVERRIDE_HEIGHT,
++ info->flags);
+ if (screen_info.orig_video_isVGA == 0)
+ screen_info.orig_video_isVGA = VIDEO_TYPE_EFI;
+ } else {
+@@ -214,6 +238,13 @@ static int set_system(const struct dmi_system_id *id)
+ screen_info.orig_video_isVGA = 0;
+ return 0;
+ }
++
++ printk(KERN_INFO "efifb: dmi detected %s - framebuffer at %p "
++ "(%dx%d, stride %d)\n", id->ident,
++ (void *)screen_info.lfb_base, screen_info.lfb_width,
++ screen_info.lfb_height, screen_info.lfb_linelength);
++
++
+ return 1;
+ }
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/find-provides b/freed-ora/tags/f15/2.6.38.6-27.fc15/find-provides
new file mode 100755
index 000000000..b28d1028f
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/find-provides
@@ -0,0 +1,44 @@
+#!/usr/bin/python
+#
+# find-provides: munge the provides dependencies from the kabideps file
+#
+# This software may be freely redistributed under the terms of the GNU
+# General Public License (GPL).
+#
+# Takes a directory prefix, then outputs the kabideps file contents.
+
+__author__ = "Jon Masters <jcm@redhat.com>"
+__version__ = "1.0"
+__date__ = "Tue 25 Jul 2006 04:00 GMT"
+__copyright__ = "Copyright (C) 2006 Red Hat, Inc"
+__license__ = "GPL"
+
+import os
+import re
+import string
+import sys
+
+false = 0
+true = 1
+
+kabideps=""
+
+p = re.compile('^(.*)/symvers-(.*).gz$')
+while true:
+ foo = sys.stdin.readline()
+ if foo == "":
+ break
+ string.split(foo)
+ m = p.match(foo)
+ if m:
+ kabideps=sys.argv[1] + "/kernel-" + m.group(2) + "-kabideps"
+
+if kabideps == "":
+ sys.exit(0)
+
+if not (os.path.isfile(kabideps)):
+ sys.stderr.write(sys.argv[0] + ": cannot locate kabideps file: " + kabideps + "\n")
+ sys.exit(1)
+
+sys.stderr.write(sys.argv[0] + ": processing kABI: " + kabideps)
+os.system("cat " + kabideps)
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/fix_xen_guest_on_old_EC2.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/fix_xen_guest_on_old_EC2.patch
new file mode 100644
index 000000000..e86200295
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/fix_xen_guest_on_old_EC2.patch
@@ -0,0 +1,34 @@
+
+Legacy hypervisors (RHEL 5.0 and RHEL 5.1) do not handle guest writes to
+cr4 gracefully. If a guest attempts to write a bit of cr4 that is
+unsupported, then the HV is so offended it crashes the domain. While
+later guest kernels (such as RHEL6) don't assume the HV supports all
+features, they do expect nicer responses. That assumption introduced
+code that probes whether or not xsave is supported early in the boot. So
+now when attempting to boot a RHEL6 guest on RHEL5.0 or RHEL5.1 an early
+crash will occur.
+
+This patch is quite obviously an undesirable hack. The real fix for this
+problem should be in the HV, and is, in later HVs. However, to support
+running on old HVs, RHEL6 can take this small change. No impact will
+occur for running on any RHEL HV (not even RHEL 5.5 supports xsave).
+There is only potential for guest performance loss on upstream Xen.
+
+---
+ arch/x86/xen/enlighten.c | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
+index 52f8e19..6db3d67 100644
+--- a/arch/x86/xen/enlighten.c
++++ b/arch/x86/xen/enlighten.c
+@@ -802,6 +802,7 @@ static void xen_write_cr4(unsigned long cr4)
+ {
+ cr4 &= ~X86_CR4_PGE;
+ cr4 &= ~X86_CR4_PSE;
++ cr4 &= ~X86_CR4_OSXSAVE;
+
+ native_write_cr4(cr4);
+ }
+--
+1.6.6.1
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/freedo.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/freedo.patch
new file mode 100644
index 000000000..83a7489ab
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/freedo.patch
@@ -0,0 +1,14673 @@
+By Alexandre Oliva, based on Ali Gündüz's
+http://www.aligunduz.org/gNewSense/librelogo-2.6.29-fshoppe1.patch
+
+Updated for 2.6.32 and modified to use this image:
+http://fsfla.org/selibre/linux-libre/100gnu+freedo.png
+
+Image converted using the following commands:
+convert -background black -flatten 100gnu+freedo.png 100gnu+freedo.ppm &&
+ppmquant -fs 223 < 100gnu+freedo.ppm |
+pnmtoplainpnm > drivers/video/logo/logo_libre_clut224.ppm
+
+Index: drivers/video/logo/Kconfig
+===================================================================
+--- linux-2.6.32/drivers/video/logo/Kconfig.orig 2010-01-06 23:07:45.000000000 +0000
++++ linux-2.6.32/drivers/video/logo/Kconfig 2010-01-09 11:30:39.000000000 +0000
+@@ -42,6 +42,10 @@
+ depends on MACH_DECSTATION || ALPHA
+ default y
+
++config LOGO_LIBRE_CLUT224
++ bool "224-color Linux-libre logo"
++ default y
++
+ config LOGO_MAC_CLUT224
+ bool "224-color Macintosh Linux logo"
+ depends on MAC
+Index: drivers/video/logo/logo.c
+===================================================================
+--- linux-2.6.32/drivers/video/logo/logo.c.orig 2010-01-06 23:07:45.000000000 +0000
++++ linux-2.6.32/drivers/video/logo/logo.c 2010-01-09 11:30:39.000000000 +0000
+@@ -75,6 +75,10 @@
+ /* DEC Linux logo on MIPS/MIPS64 or ALPHA */
+ logo = &logo_dec_clut224;
+ #endif
++#ifdef CONFIG_LOGO_LIBRE_CLUT224
++ /* Linux-libre logo */
++ logo = &logo_libre_clut224;
++#endif
+ #ifdef CONFIG_LOGO_MAC_CLUT224
+ /* Macintosh Linux logo on m68k */
+ if (MACH_IS_MAC)
+Index: drivers/video/logo/logo_libre_clut224.ppm
+===================================================================
+--- linux-2.6.32//dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.32/drivers/video/logo/logo_libre_clut224.ppm 2010-01-09 15:31:10.000000000 +0000
+@@ -0,0 +1,14603 @@
++P3
++360 200
++65535
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 1028 1028 1028 8455 8455 8455
++16762 16762 16762 18711 18711 18711 18711 18711 18711 18517 18517 18517 17965 17965 17965
++17553 17553 17553 17553 17553 17553 16762 16762 16762 16762 16762 16762 16136 16136 16136
++16762 16762 16762 16136 16136 16136 17553 17553 17553 16762 16762 16762 17553 17553 17553
++17553 17553 17553 17965 17965 17965 16762 16762 16762 11370 11370 11370 4480 4480 4480
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 385 385 334 4874 3558 1459 5943 4354 1886
++1264 929 361 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 1264 929 361 5943 4354 1886
++4874 3558 1459 385 385 334 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 6810 6810 6810 2701 2701 2701
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 5911 5911 5911
++18995 18995 18995 19317 19131 18746 18995 18995 18995 17965 17965 17965 10459 10459 10459
++1799 1799 1799 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++0 0 0 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 1413 1670 1799 6427 6427 6427 14506 14506 14506
++18711 18711 18711 18995 18995 18995 18517 18517 18517 5911 5911 5911 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1799 1799 1799 9814 9814 9814 16762 16762 16762 18517 18517 18517 18336 18336 18336
++17965 17965 17965 17965 17965 17965 17965 17965 17965 17553 17553 17553 16762 16762 16762
++16762 16762 16762 17553 17553 17553 18336 18336 18336 15440 15440 15440 3857 3857 3857
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 17750 12880 5633 36240 26320 11215 36240 26320 11215 36240 26320 11215
++36240 26320 11215 36240 26320 11215 15792 11440 4871 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 8095 5986 2531 27882 20284 8738
++43194 31354 13386 59002 43055 18866 63236 45897 19634 63736 46260 19789 63736 46260 19789
++63736 46260 19789 60487 44116 19189 45225 33169 15226 28744 20827 9121 9123 6640 2832
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 12071 8729 3764
++30933 22555 9803 46996 34589 15727 60487 44116 19189 63486 46079 19711 63736 46260 19789
++63736 46260 19789 63236 45897 19634 59002 43055 18866 41427 30069 13197 25195 18262 7789
++4874 3558 1459 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 514 514 514
++21838 21794 21532 44589 44631 44888 43356 43080 42463 40984 40984 40984 38406 38021 37650
++42507 42507 42507 21292 21292 21292 26472 20262 11291 40410 29471 12985 50159 36373 15650
++54363 39457 16879 51340 37280 15909 37303 27193 11910 30042 21792 9253 21142 18577 13954
++38406 38021 37650 44589 44631 44888 46260 45809 45103 38978 38978 38978 26342 26738 26738
++1799 1799 1799 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 15792 11440 4871
++36240 26320 11215 36240 26320 11215 36240 26320 11215 36240 26320 11215 36240 26320 11215
++22224 16071 6824 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1028 1028 1028 16762 16762 16762 22881 22881 22881 24991 24991 24991 15440 15440 15440
++514 514 514 128 128 128 3857 3857 3857 20778 20778 20542 26055 26184 25186
++30840 30197 30069 35838 35838 35838 39900 39413 38599 45746 46260 46746 50115 50774 49729
++52685 52685 52685 55126 54741 54484 55531 55531 55531 56026 55897 55897 56026 55897 55897
++52685 52685 52685 50115 50774 49729 47056 47056 47056 44589 44631 44888 40833 41475 42019
++38978 38978 38978 35838 35838 35838 33681 33681 33681 26342 26738 26738 7197 7197 7197
++0 0 0 128 128 128 514 514 514 14506 14506 14506 20263 20263 20263
++11370 11370 11370 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 4480 4480 4480 17965 17965 17965 17965 17965 17965 18336 18336 18336
++16762 16762 16762 7197 7197 7197 514 514 514 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++0 0 0 0 0 0 1028 1285 1542 3079 3079 3079 15440 15440 15440
++20778 20778 20542 16762 16762 16762 17553 17553 17553 8455 8455 8455 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 2402 1799 684
++37303 27193 11910 63736 46260 19789 63359 45859 19672 63486 46079 19711 63359 45859 19672
++63486 46079 19711 63236 45897 19634 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 5943 4354 1886 37303 27193 11910 63236 45897 19634 63486 46079 19711
++63236 45897 19634 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19455 63112 45588 19556 63736 46260 19789 62986 45716 19556
++40410 29471 12985 5943 4354 1886 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 10498 7619 3259 45225 33169 15226 63736 46260 19789
++63736 46260 19789 63112 45588 19556 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63486 46079 19455 63236 45897 19634 63486 46079 19711
++61861 44933 19292 30933 22555 9803 3038 2204 899 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 1028 1028 1028 35838 35838 35838
++44589 44631 44888 24991 24991 24991 40984 40984 40984 44589 44631 44888 42507 42507 42507
++46260 45809 45103 52942 51360 49402 54209 48830 40477 62486 45353 19401 63486 46079 19711
++63736 46260 19789 63486 46335 19711 63112 45588 19556 54760 46836 33773 52942 51360 49402
++49304 49177 49053 46260 45809 45103 42507 42507 42507 33681 33681 33681 38406 38021 37650
++40833 41475 42019 2701 2701 2701 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 3038 2204 899 57142 41714 18588
++63486 46079 19711 63359 45859 19672 63486 46079 19711 63486 46079 19711 62340 45076 19410
++9123 6640 2832 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 4480 4480 4480 18995 18995 18995
++17965 17965 17965 3079 3079 3079 0 0 0 4480 4480 4480 24991 24991 24991
++38406 38021 37650 50115 50774 49729 60933 60933 60933 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65278 65278 65278 65535 65535 65535 63607 63607 63607
++55126 54741 54484 44589 44631 44888 26055 26184 25186 2701 2701 2701 0 0 0
++8455 8455 8455 20263 20263 20263 9814 9814 9814 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 1028 1285 1542 18517 18517 18517
++20263 20263 20263 13752 13752 13752 642 642 899 1799 1927 2184 22881 22881 22881
++35502 34869 34383 38978 38978 38978 44589 44631 44888 49304 49177 49053 55126 54741 54484
++57470 57470 57470 56283 56283 56283 55126 55126 55126 53256 53199 52942 52119 52119 51914
++50115 50774 49729 47056 47056 47056 40984 40984 40984 35838 35838 35838 28239 28239 28239
++20263 20263 20263 6810 6810 6810 0 0 0 8455 8455 8455 17553 17553 17553
++17553 17553 17553 17553 17553 17553 8455 8455 8455 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 13872 10127 4336 55635 40828 18345
++63486 46079 19455 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++17750 12880 5633 60487 44116 19189 63486 46079 19455 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++62986 45716 19556 61861 44933 19292 17750 12880 5633 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 28744 20827 9121 62986 45716 19556 63112 45588 19556 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63486 46079 19711 63736 46260 19789 57142 41714 18588 9123 6640 2832 128 128 128
++0 0 0 0 0 0 0 0 0 26342 26738 26738 47056 47056 47056
++18336 18336 18336 46260 45809 45103 20263 20263 20263 1772 1533 1155 30933 22555 9803
++64250 47031 20303 63486 46079 19455 63483 46207 20056 62859 46189 20912 63864 46774 20174
++63486 46079 19711 63736 46260 19789 63736 46260 19789 63864 46774 20174 62859 46189 20912
++62859 46189 20912 57142 41714 18588 13905 12704 8095 31875 31875 31875 35838 35838 35838
++35502 34869 34383 30583 30843 31357 385 385 334 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 37303 27193 11910 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 30042 21792 9253
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 11370 11370 11370 19317 19131 18746 14506 14506 14506 0 0 0
++2701 2701 2701 30840 30197 30069 49304 49177 49053 61309 61309 61309 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65278 65278 65278 57470 57470 57470 31875 31875 31875
++11370 11370 11370 0 0 0 9814 9814 9814 20263 20263 20263 3079 3079 3079
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 514 514 514 17553 17553 17553 18995 18995 18995 1028 1028 1028
++5911 5911 5911 26055 26184 25186 44589 44631 44888 58889 58889 58889 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65278 65278 65278 65535 65535 65535 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 63607 63607 63607 55126 55126 55126 42507 42507 42507 26055 26184 25186
++6810 6810 6810 128 128 128 10459 10459 10459 18995 18995 18995 13752 13752 13752
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 1264 929 361 34164 24785 10813 63236 45897 19634 63112 45588 19556
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63359 45859 19672 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 19371 14059 6014
++62486 45353 19401 62986 45716 19556 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63236 45897 19634 62737 45569 19692 19371 14059 6014 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++30933 22555 9803 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 62486 45353 19401 59002 43055 18866 10498 7619 3259
++0 0 0 0 0 0 1772 1533 1155 45746 46260 46746 24991 24991 24991
++40984 40984 40984 20263 20263 20263 0 0 0 20895 15087 6460 63359 45859 19672
++61241 45992 22579 56411 51914 44332 59162 58263 57054 52119 52119 51914 50976 48701 42982
++57302 45835 26989 54760 46836 33773 52942 51360 49402 56026 55897 55897 56411 51914 44332
++59969 46214 26008 63112 45588 19556 51340 37280 15909 2402 1799 684 40833 41475 42019
++16762 16762 16762 53256 53199 52942 7197 7197 7197 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 15792 11440 4871 63486 46079 19711 63736 46260 19789
++63736 46260 19789 63736 46260 19789 62986 45716 19556 51340 37280 15909 385 385 334
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 15440 15440 15440
++20263 20263 20263 8455 8455 8455 0 0 0 9814 9814 9814 38406 38021 37650
++57470 57470 57470 65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 63222 63222 63222 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 57470 57470 57470 42507 42507 42507 35502 34869 34383
++44589 44631 44888 55531 55531 55531 64507 64507 64507 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++62065 62065 62065 33681 33681 33681 6427 6427 6427 257 257 257 17553 17553 17553
++16762 16762 16762 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++12931 12931 12931 21292 21292 21292 3079 3079 3079 8455 8455 8455 31875 31875 31875
++58889 58889 58889 65278 65278 65278 65535 65535 65535 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 65535 65535 65535
++62708 62708 62708 47697 47615 47488 28239 28239 28239 11370 11370 11370 4480 4480 4480
++20263 20263 20263 17553 17553 17553 1799 1799 1799 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++10498 7619 3259 53070 38550 16467 63236 45897 19634 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 12071 8729 3764 62340 45076 19410
++63236 45897 19634 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63236 45897 19634 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 62986 45716 19556 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63236 45897 19634 62986 45716 19556 12071 8729 3764
++257 257 257 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 23177 16932 7265
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 62986 45716 19556 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63236 45897 19634 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 62986 45716 19556 57142 41714 18588
++4874 3558 1459 0 0 0 16762 16762 16762 61680 61680 61680 12931 12931 12931
++42507 42507 42507 642 642 899 2402 1799 684 57142 41714 18588 61113 45548 20995
++56411 51914 44332 35838 35838 35838 11370 11370 11370 257 257 257 20263 20263 20263
++47056 47056 47056 40984 40984 40984 38406 38021 37650 10459 10459 10459 24991 24991 24991
++52942 51360 49402 62859 46189 20912 63864 46774 20174 27882 20284 8738 28239 28239 28239
++21292 21292 21292 55531 55531 55531 18995 18995 18995 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 2402 1799 684 55635 40828 18345 63112 45588 19556 63736 46260 19789
++63736 46260 19789 63736 46260 19789 62486 45353 19401 10498 7619 3259 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 257 257 257 8455 8455 8455 21292 21292 21292 5911 5911 5911
++0 0 0 16762 16762 16762 42507 42507 42507 62065 62065 62065 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++61309 61309 61309 40984 40984 40984 8455 8455 8455 17965 17965 17965 31875 31875 31875
++44589 44631 44888 55126 55126 55126 64507 64507 64507 64124 64124 64124 52119 52119 51914
++38406 38021 37650 20778 20778 20542 1028 1028 1028 128 128 128 0 0 0
++0 0 0 0 0 0 12931 12931 12931 30840 30197 30069 38978 38978 38978
++45746 46260 46746 53256 53199 52942 59538 59538 59538 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 57470 57470 57470 28239 28239 28239 1799 1799 1799
++4480 4480 4480 21838 21794 21532 8455 8455 8455 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 3857 3857 3857 22359 22625 23010
++9814 9814 9814 4480 4480 4480 33681 33681 33681 60652 60652 60652 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 58889 58889 58889 50115 50774 49729 60266 60266 60266
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 62065 62065 62065 38406 38021 37650
++14506 14506 14506 1028 1285 1542 17553 17553 17553 20263 20263 20263 6427 6427 6427
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 128 128 128 30042 21792 9253
++62486 45353 19401 62986 45716 19556 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63359 45859 19672 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 0 0 0 50159 36373 15650 62986 45716 19556
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63236 45897 19634
++63236 45897 19634 53070 38550 16467 30933 22555 9803 25195 18262 7789 25195 18262 7789
++30933 22555 9803 48838 36002 16378 63736 46260 19789 62986 45716 19556 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 62986 45716 19556 51340 37280 15909
++385 385 334 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 4874 3558 1459 59002 43055 18866
++63236 45897 19634 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63093 45874 19660 63112 45588 19556 46996 34589 15727 30933 22555 9803 23177 16932 7265
++25195 18262 7789 34164 24785 10813 54363 39457 16879 63736 46260 19789 63236 45897 19634
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19455
++37303 27193 11910 0 0 0 16762 16762 16762 63607 63607 63607 11370 11370 11370
++40984 40984 40984 128 128 128 23177 16932 7265 63483 46207 20056 50629 49986 46941
++31875 31875 31875 0 0 0 0 0 0 0 0 0 385 385 334
++30840 30197 30069 60266 60266 60266 56283 56283 56283 26342 26738 26738 0 0 0
++17553 17553 17553 56411 51914 44332 62856 45897 20023 55635 40828 18345 24991 24991 24991
++24991 24991 24991 55531 55531 55531 21838 21794 21532 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 36240 26320 11215 63486 46079 19455 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 30933 22555 9803 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++2701 2701 2701 21292 21292 21292 12931 12931 12931 0 0 0 8455 8455 8455
++38978 38978 38978 64507 64507 64507 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 63607 63607 63607 44589 44631 44888
++12931 12931 12931 0 0 0 0 0 0 128 128 128 0 0 0
++0 0 0 0 0 0 12931 12931 12931 12931 12931 12931 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 1799 1799 1799 12931 12931 12931 26342 26738 26738
++50115 50774 49729 65535 65535 65535 65535 65535 65535 65278 65278 65278 52119 52119 51914
++20263 20263 20263 128 128 128 13752 13752 13752 20778 20778 20542 5911 5911 5911
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 12931 12931 12931 11370 11370 11370 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 16762 16762 16762 18995 18995 18995 257 257 257
++22881 22881 22881 55531 55531 55531 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 62708 62708 62708 55531 55531 55531 47697 47615 47488
++35838 35838 35838 22881 22881 22881 3079 3079 3079 128 128 128 4480 4480 4480
++30840 30197 30069 44589 44631 44888 60266 60266 60266 65535 65535 65535 65535 65535 65535
++64764 64764 64764 55531 55531 55531 44589 44631 44888 33681 33681 33681 47056 47056 47056
++64764 64764 64764 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++64124 64124 64124 44589 44631 44888 20263 20263 20263 0 0 0 13752 13752 13752
++14506 14506 14506 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 8373 6077 2600 48838 36002 16378 63486 46079 19455
++63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 25195 18262 7789 63236 45897 19634 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 62986 45716 19556 57142 41714 18588
++15792 11440 4871 0 0 0 128 128 128 128 128 128 0 0 0
++0 0 0 0 0 0 13872 10127 4336 54363 39457 16879 63486 46079 19711
++63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711
++25195 18262 7789 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 37303 27193 11910 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711
++51340 37280 15909 9123 6640 2832 0 0 0 0 0 0 128 128 128
++128 128 128 0 0 0 0 0 0 20895 15087 6460 61451 44536 19168
++62986 45716 19556 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63486 46079 19711 12071 8729 3764 11370 11370 11370 60933 60933 60933 20263 20263 20263
++44589 44631 44888 11370 11370 11370 48838 36002 16378 50629 49986 46941 30840 30197 30069
++17553 17553 17553 28239 28239 28239 38978 38978 38978 44589 44631 44888 53256 53199 52942
++58889 58889 58889 56026 55897 55897 55126 55126 55126 56283 56283 56283 33681 33681 33681
++24991 24991 24991 28239 28239 28239 56411 51914 44332 62859 46189 20912 38406 38021 37650
++20778 20778 20542 58889 58889 58889 22881 22881 22881 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++13872 10127 4336 63093 45874 19660 63736 46260 19789 63736 46260 19789 63736 46260 19789
++62986 45716 19556 53070 38550 16467 1264 929 361 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 17553 17553 17553
++18995 18995 18995 514 514 514 1799 1799 1799 28239 28239 28239 58889 58889 58889
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 52119 52119 51914 42507 42507 42507 44589 44631 44888 47056 47056 47056
++49621 49621 49607 52119 52119 51914 47056 47056 47056 18711 18711 18711 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 26055 26184 25186 4480 4480 4480
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 15440 15440 15440 11370 11370 11370 0 0 0 257 257 257
++1028 1285 1542 42507 42507 42507 65021 65021 65021 65535 65535 65535 65278 65278 65278
++64764 64764 64764 44589 44631 44888 12931 12931 12931 257 257 257 14506 14506 14506
++20263 20263 20263 15440 15440 15440 2313 2313 2313 4480 4480 4480 14506 14506 14506
++18995 18995 18995 20778 20778 20542 11370 11370 11370 15440 15440 15440 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 1413 1670 1799 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++7197 7197 7197 22881 22881 22881 5911 5911 5911 16136 16136 16136 47697 47615 47488
++65278 65278 65278 65535 65535 65535 65535 65535 65535 62065 62065 62065 39900 39413 38599
++31875 31875 31875 21838 21794 21532 6810 6810 6810 0 0 0 128 128 128
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 4480 4480 4480 28239 28239 28239 31875 31875 31875
++14506 14506 14506 128 128 128 0 0 0 0 0 0 128 128 128
++24991 24991 24991 55126 54741 54484 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65021 65021 65021 45746 46260 46746 8455 8455 8455
++6427 6427 6427 21292 21292 21292 1799 1799 1799 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 36240 26320 11215 63486 46079 19455 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711 63736 46260 19789
++43194 31354 13386 63236 45897 19634 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63359 45859 19672 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 54363 39457 16879 63359 45859 19672 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63486 46079 19711 61451 44536 19168 10498 7619 3259
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 8095 5986 2531 60487 44116 19189
++63236 45897 19634 63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19455
++55635 40828 18345 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 4874 3558 1459 63236 45897 19634 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711 54363 39457 16879
++3038 2204 899 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 17750 12880 5633
++63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711
++63486 46079 19455 41427 30069 13197 2701 2701 2701 50115 50774 49729 31875 31875 31875
++22881 22881 22881 50115 50774 49729 46260 45809 45103 20263 20263 20263 44589 44631 44888
++65278 65278 65278 62708 62708 62708 39900 39413 38599 44589 44631 44888 65535 65535 65535
++51400 51400 51400 61309 61309 61309 55126 55126 55126 44589 44631 44888 55126 54741 54484
++65021 65021 65021 30583 30843 31357 24991 24991 24991 52942 51360 49402 35838 35838 35838
++13752 13752 13752 52685 52685 52685 9814 9814 9814 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 1264 929 361
++54363 39457 16879 63359 45859 19672 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63093 45874 19660 12071 8729 3764 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 3079 3079 3079 21838 21794 21532 4480 4480 4480
++0 0 0 17553 17553 17553 49304 49177 49053 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++61680 61680 61680 14506 14506 14506 128 128 128 0 0 0 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8455 8455 8455 45746 46260 46746 65021 65021 65021 56283 56283 56283
++28239 28239 28239 0 0 0 0 0 0 0 0 0 18995 18995 18995
++46260 45809 45103 63222 63222 63222 63222 63222 63222 49304 49177 49053 31875 31875 31875
++8455 8455 8455 0 0 0 30583 30843 31357 62065 62065 62065 65535 65535 65535
++65535 65535 65535 65535 65535 65535 62708 62708 62708 42507 42507 42507 12931 12931 12931
++0 0 0 3079 3079 3079 20263 20263 20263 14506 14506 14506 4480 4480 4480
++0 0 0 10459 10459 10459 8455 8455 8455 10459 10459 10459 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 8455 8455 8455 30840 30197 30069 10459 10459 10459
++257 257 257 0 0 0 0 0 0 7197 7197 7197 26055 26184 25186
++17965 17965 17965 10459 10459 10459 43356 43080 42463 62708 62708 62708 65535 65535 65535
++65535 65535 65535 65535 65535 65535 58889 58889 58889 22359 22625 23010 128 128 128
++0 0 0 4480 4480 4480 2313 2313 2313 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 3079 3079 3079 9814 9814 9814
++0 0 0 0 0 0 0 0 0 128 128 128 257 257 257
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 2313 2313 2313 35838 35838 35838 58889 58889 58889 59538 59538 59538
++57470 57470 57470 55126 54741 54484 51400 51400 51400 57470 57470 57470 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 57069 56684 56283
++24991 24991 24991 642 642 899 28239 28239 28239 14506 14506 14506 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 36240 26320 11215 63486 46079 19711 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63236 45897 19634 61861 44933 19292 25195 18262 7789
++128 128 128 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 13872 10127 4336 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 25195 18262 7789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 13872 10127 4336 257 257 257 0 0 0 0 0 0
++0 0 0 0 0 0 27882 20284 8738 63486 46079 19711 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 13872 10127 4336
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++40410 29471 12985 62986 45716 19556 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 61861 44933 19292 3038 2204 899 30840 30197 30069 48486 48538 48538
++8455 8455 8455 6427 6427 6427 7197 7197 7197 39900 39413 38599 65278 65278 65278
++65278 65278 65278 52685 52685 52685 57470 57470 57470 62708 62708 62708 57470 57470 57470
++57069 56684 56283 56283 56283 56283 65535 65535 65535 44589 44631 44888 55531 55531 55531
++65535 65535 65535 64124 64124 64124 13752 13752 13752 2701 2701 2701 5911 5911 5911
++44589 44631 44888 31875 31875 31875 257 257 257 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 34164 24785 10813
++63093 45874 19660 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++34164 24785 10813 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 8455 8455 8455 20263 20263 20263 128 128 128 2313 2313 2313
++35838 35838 35838 64124 64124 64124 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++38978 38978 38978 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 31875 31875 31875 33681 33681 33681 30583 30843 31357
++26342 26738 26738 26055 26184 25186 28239 28239 28239 33681 33681 33681 38978 38978 38978
++44589 44631 44888 57470 57470 57470 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65021 65021 65021 48486 48538 48538 28239 28239 28239 47697 47615 47488 64124 64124 64124
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++61680 61680 61680 45746 46260 46746 30840 30197 30069 22881 22881 22881 56283 56283 56283
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 63222 63222 63222
++52685 52685 52685 39900 39413 38599 33681 33681 33681 38406 38021 37650 40984 40984 40984
++50115 50774 49729 33681 33681 33681 16136 16136 16136 3857 3857 3857 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 0 0 0 18995 18995 18995 8455 8455 8455
++17965 17965 17965 17965 17965 17965 24991 24991 24991 16762 16762 16762 4480 4480 4480
++38406 38021 37650 60266 60266 60266 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 55531 55531 55531 16136 16136 16136 385 385 334 22359 22625 23010
++43356 43080 42463 59538 59538 59538 55126 54741 54484 30840 30197 30069 1028 1028 1028
++0 0 0 0 0 0 20263 20263 20263 53256 53199 52942 57069 56684 56283
++24991 24991 24991 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 1799 1799 1799 514 514 514
++0 0 0 0 0 0 0 0 0 22881 22881 22881 64124 64124 64124
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++64507 64507 64507 38978 38978 38978 1028 1028 1028 18995 18995 18995 16136 16136 16136
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 36240 26320 11215 63236 45897 19634 63736 46260 19789
++63736 46260 19789 63736 46260 19789 51340 37280 15909 9123 6640 2832 0 0 0
++0 0 0 62486 45353 19401 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63359 45859 19672 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 36240 26320 11215 63236 45897 19634 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 59002 43055 18866 2402 1799 684 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 2402 1799 684
++59002 43055 18866 63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63486 46079 19711 37303 27193 11910 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 50159 36373 15650 62986 45716 19556 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63112 45588 19556 48838 36002 16378 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++10498 7619 3259 63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63486 46079 19711 63864 46774 20174 23177 16932 7265 3079 3079 3079 43356 43080 42463
++50115 50774 49729 30583 30843 31357 17965 17965 17965 63607 63607 63607 65535 65535 65535
++65535 65535 65535 60933 60933 60933 65535 65535 65535 47056 47056 47056 22881 22881 22881
++56283 56283 56283 63222 63222 63222 65278 65278 65278 42507 42507 42507 26342 26738 26738
++64507 64507 64507 65278 65278 65278 38978 38978 38978 30840 30197 30069 51400 51400 51400
++45746 46260 46746 4480 4480 4480 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 12071 8729 3764 62737 45569 19692
++63736 46260 19789 63736 46260 19789 63736 46260 19789 62986 45716 19556 54363 39457 16879
++1413 1028 514 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++14506 14506 14506 14506 14506 14506 0 0 0 8455 8455 8455 49621 49621 49607
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 55531 55531 55531
++3857 3857 3857 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 31875 31875 31875 64764 64764 64764 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 60266 60266 60266 49304 49177 49053
++59538 59538 59538 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++43356 43080 42463 642 642 899 20263 20263 20263 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18995 18995 18995 9814 9814 9814
++22881 22881 22881 3857 3857 3857 16762 16762 16762 33681 33681 33681 57470 57470 57470
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++52119 52119 51914 21292 21292 21292 35838 35838 35838 55126 54741 54484 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 52685 52685 52685
++28239 28239 28239 39900 39413 38599 63222 63222 63222 65535 65535 65535 65535 65535 65535
++63607 63607 63607 44589 44631 44888 35838 35838 35838 31875 31875 31875 24991 24991 24991
++20263 20263 20263 24991 24991 24991 28239 28239 28239 31875 31875 31875 5911 5911 5911
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 47056 47056 47056
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 44589 44631 44888 3079 3079 3079 6810 6810 6810
++21292 21292 21292 514 514 514 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 36240 26320 11215 63736 46260 19789 62986 45716 19556
++63486 46079 19711 34164 24785 10813 1264 929 361 128 128 128 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 59002 43055 18866 63486 46079 19455 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63236 45897 19634 37303 27193 11910 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++34164 24785 10813 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 59002 43055 18866 257 257 257 0 0 0 0 0 0
++0 0 0 8095 5986 2531 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 25195 18262 7789 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 50159 36373 15650 62986 45716 19556 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63112 45588 19556 45225 33169 15226 128 128 128 7197 7197 7197
++35502 34869 34383 49621 49621 49607 46260 45809 45103 65535 65535 65535 65535 65535 65535
++65535 65535 65535 52119 52119 51914 65535 65535 65535 61309 61309 61309 58889 58889 58889
++62065 62065 62065 65535 65535 65535 65535 65535 65535 58889 58889 58889 48486 48538 48538
++63607 63607 63607 65535 65535 65535 64124 64124 64124 43356 43080 42463 49644 44138 34157
++3079 3079 3079 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 875 620 271 51340 37280 15909 63486 46079 19711
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711 13872 10127 4336
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 20778 20778 20542
++8455 8455 8455 0 0 0 20263 20263 20263 57470 57470 57470 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 26342 26738 26738
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++21292 21292 21292 61680 61680 61680 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 47056 47056 47056
++7197 7197 7197 7197 7197 7197 13752 13752 13752 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18711 18711 18711 3079 3079 3079
++44589 44631 44888 62065 62065 62065 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 58889 58889 58889
++49621 49621 49607 63222 63222 63222 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65278 65278 65278 44589 44631 44888
++257 257 257 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 15440 15440 15440
++62065 62065 62065 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 49621 49621 49607 6427 6427 6427
++1799 1799 1799 21838 21794 21532 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 36240 26320 11215 63736 46260 19789 57142 41714 18588
++15792 11440 4871 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63359 45859 19672 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 22224 16071 6824 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++19371 14059 6014 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 8373 6077 2600 0 0 0 0 0 0
++0 0 0 20895 15087 6460 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 8095 5986 2531 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++385 385 334 30933 22555 9803 63486 46079 19711 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 59002 43055 18866 0 0 0 0 0 0
++642 642 899 37343 28956 15254 50629 49986 46941 65535 65535 65535 65535 65535 65535
++61680 61680 61680 42507 42507 42507 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 52119 52119 51914
++50976 48701 42982 52942 51360 49402 64124 64124 64124 54998 53713 52556 57302 45835 26989
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 30933 22555 9803 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63486 46079 19711 36240 26320 11215 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 20778 20778 20542 3857 3857 3857
++257 257 257 33681 33681 33681 62065 62065 62065 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 50115 51271 50886 42507 42507 42507
++35838 35838 35838 31875 31875 31875 26342 26738 26738 16136 16136 16136 257 257 257
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 11370 11370 11370
++57470 57470 57470 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 64124 64124 64124
++56026 55897 55897 45746 46260 46746 40984 40984 40984 39900 39413 38599 38978 38978 38978
++35838 35838 35838 35838 35838 35838 38406 38021 37650 44589 44631 44888 51400 51400 51400
++58889 58889 58889 64124 64124 64124 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 56283 56283 56283 28239 28239 28239 1413 1670 1799
++4480 4480 4480 20263 20263 20263 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 257 257 257 22359 22625 23010
++5911 5911 5911 55531 55531 55531 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++33681 33681 33681 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++42507 42507 42507 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 50115 51271 50886
++5911 5911 5911 3079 3079 3079 20263 20263 20263 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 36240 26320 11215 43194 31354 13386 4874 3558 1459
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++17750 12880 5633 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 5943 4354 1886 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++3038 2204 899 63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 20895 15087 6460 0 0 0 0 0 0
++0 0 0 30933 22555 9803 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 57142 41714 18588 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 17750 12880 5633 63486 46079 19711 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 5943 4354 1886 128 128 128
++0 0 0 33304 29072 24800 62708 62708 62708 65021 65021 65021 55531 55531 55531
++47697 47615 47488 62708 62708 62708 64507 64507 64507 65535 65535 65535 65535 65535 65535
++55126 54741 54484 49304 49177 49053 53256 53199 52942 57470 57470 57470 64124 64124 64124
++46384 44975 41762 54760 46836 33773 49644 44138 34157 56972 46962 30007 61241 45992 22579
++3038 2204 899 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 10498 7619 3259 62340 45076 19410 63736 46260 19789 63736 46260 19789
++63736 46260 19789 62986 45716 19556 55635 40828 18345 2402 1799 684 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 16762 16762 16762 8455 8455 8455 128 128 128
++38406 38021 37650 65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 55126 54741 54484 2313 2313 2313 0 0 0
++385 385 334 128 128 128 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 44589 44631 44888 52119 52119 51914
++53256 53199 52942 53256 53199 52942 53256 53199 52942 55126 54741 54484 58889 58889 58889
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++60266 60266 60266 45746 46260 46746 38406 38021 37650 26342 26738 26738 10459 10459 10459
++257 257 257 128 128 128 128 128 128 128 128 128 0 0 0
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++642 642 899 8455 8455 8455 24991 24991 24991 31875 31875 31875 40984 40984 40984
++51400 51400 51400 59538 59538 59538 64124 64124 64124 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 64507 64507 64507 59538 59538 59538 49621 49621 49607
++39900 39413 38599 28239 28239 28239 3857 3857 3857 0 0 0 13752 13752 13752
++18995 18995 18995 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 6810 6810 6810
++16762 16762 16762 15440 15440 15440 47056 47056 47056 63607 63607 63607 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 64507 64507 64507 58889 58889 58889
++53256 53199 52942 49304 49177 49053 44589 44631 44888 40984 40984 40984 35838 35838 35838
++35502 34869 34383 38978 38978 38978 44589 44631 44888 49621 49621 49607 59538 59538 59538
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++60933 60933 60933 20778 20778 20542 1028 1285 1542 514 514 514 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++2313 2313 2313 17553 17553 17553 28239 28239 28239 33681 33681 33681 38978 38978 38978
++48486 48538 48538 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++49621 49621 49607 4480 4480 4480 4480 4480 4480 18336 18336 18336 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 8373 6077 2600 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63359 45859 19672 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++30042 21792 9253 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 60487 44116 19189 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++257 257 257 57142 41714 18588 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 30933 22555 9803 0 0 0 0 0 0
++128 128 128 43194 31354 13386 62986 45716 19556 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19455 45225 33169 15226 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 5943 4354 1886 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 17750 12880 5633 0 0 0
++3857 3857 3857 46384 44975 41762 54998 53713 52556 46384 44975 41762 49644 44138 34157
++52119 52119 51914 65535 65535 65535 65535 65535 65535 63222 63222 63222 65535 65535 65535
++47056 47056 47056 50115 51271 50886 47056 47056 47056 60933 60933 60933 60933 60933 60933
++65021 65021 65021 57069 56684 56283 58276 44060 22272 62856 45897 20023 63486 46079 19711
++2402 1799 684 0 0 0 0 0 0 0 0 0 0 0 0
++385 385 334 50159 36373 15650 63236 45897 19634 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19455 15792 11440 4871 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 12931 12931 12931 14506 14506 14506 0 0 0 31875 31875 31875
++65021 65021 65021 65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 64507 64507 64507 24991 24991 24991 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 18336 18336 18336 64124 64124 64124 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++65535 65535 65535 65535 65535 65535 63607 63607 63607 49621 49621 49607 30583 30843 31357
++4480 4480 4480 128 128 128 0 0 0 3079 3079 3079 20778 20778 20542
++24991 24991 24991 21292 21292 21292 18336 18336 18336 18517 18517 18517 18517 18517 18517
++18517 18517 18517 17553 17553 17553 16762 16762 16762 17553 17553 17553 18336 18336 18336
++17965 17965 17965 8455 8455 8455 0 0 0 0 0 0 128 128 128
++0 0 0 642 642 899 6810 6810 6810 13752 13752 13752 19317 19131 18746
++15440 15440 15440 11370 11370 11370 6427 6427 6427 1799 1799 1799 0 0 0
++128 128 128 12931 12931 12931 18336 18336 18336 18995 18995 18995 8455 8455 8455
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++11370 11370 11370 28239 28239 28239 3857 3857 3857 17553 17553 17553 43356 43080 42463
++55126 54741 54484 56026 55897 55897 59538 59538 59538 62708 62708 62708 64764 64764 64764
++62065 62065 62065 58889 58889 58889 56283 56283 56283 52685 52685 52685 49621 49621 49607
++43356 43080 42463 35838 35838 35838 26342 26738 26738 12931 12931 12931 1028 1028 1028
++128 128 128 514 514 514 6427 6427 6427 14506 14506 14506 20263 20263 20263
++18995 18995 18995 10459 10459 10459 128 128 128 0 0 0 2313 2313 2313
++22881 22881 22881 38406 38021 37650 57470 57470 57470 65535 65535 65535 65535 65535 65535
++65535 65535 65535 62065 62065 62065 58889 58889 58889 58889 58889 58889 57470 57470 57470
++57470 57470 57470 55531 55531 55531 6427 6427 6427 0 0 0 0 0 0
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++2313 2313 2313 55126 54741 54484 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 49304 49177 49053 3079 3079 3079 7197 7197 7197 16136 16136 16136
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++40410 29471 12985 62486 45353 19401 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 53070 38550 16467 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 50159 36373 15650 63486 46079 19455 63736 46260 19789 63736 46260 19789
++63736 46260 19789 62986 45716 19556 43194 31354 13386 257 257 257 0 0 0
++0 0 0 54363 39457 16879 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 62986 45716 19556 37303 27193 11910 385 385 334 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 875 620 271 62486 45353 19401 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 30042 21792 9253 0 0 0
++11370 11370 11370 31875 31875 31875 51153 41368 24286 48838 36002 16378 59969 46214 26008
++46384 44975 41762 65535 65535 65535 65535 65535 65535 62708 62708 62708 60933 60933 60933
++64124 64124 64124 64124 64124 64124 60266 60266 60266 61309 61309 61309 65535 65535 65535
++65535 65535 65535 50976 48701 42982 61241 45992 22579 64250 47031 20303 63112 45588 19556
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++27882 20284 8738 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63486 46079 19711 37303 27193 11910 128 128 128 0 0 0 0 0 0
++0 0 0 8373 6077 2600 19371 14059 6014 25195 18262 7789 23177 16932 7265
++17750 12880 5633 4874 3558 1459 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 257 257 257
++8455 8455 8455 16762 16762 16762 0 0 0 26342 26738 26738 63222 63222 63222
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 47056 47056 47056 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 43356 43080 42463 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++55126 55126 55126 38406 38021 37650 13752 13752 13752 0 0 0 0 0 0
++15440 15440 15440 26342 26738 26738 24991 24991 24991 15440 15440 15440 2701 2701 2701
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++385 385 334 10459 10459 10459 17553 17553 17553 17553 17553 17553 17553 17553 17553
++18517 18517 18517 18336 18336 18336 18336 18336 18336 17553 17553 17553 16136 16136 16136
++17965 17965 17965 17553 17553 17553 16762 16762 16762 16762 16762 16762 16762 16762 16762
++16762 16762 16762 6427 6427 6427 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 385 385 334 16762 16762 16762 20263 20263 20263 12931 12931 12931
++1799 1927 2184 257 257 257 1028 1028 1028 5911 5911 5911 8455 8455 8455
++5911 5911 5911 1028 1285 1542 0 0 0 0 0 0 128 128 128
++2701 2701 2701 14506 14506 14506 22359 22625 23010 22881 22881 22881 20778 20778 20542
++18711 18711 18711 17553 17553 17553 12931 12931 12931 4480 4480 4480 0 0 0
++257 257 257 8455 8455 8455 18711 18711 18711 20263 20263 20263 24991 24991 24991
++21838 21794 21532 1028 1285 1542 3079 3079 3079 31875 31875 31875 53256 53199 52942
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 35502 34869 34383 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 28239 28239 28239 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 47697 47615 47488 2313 2313 2313 9814 9814 9814
++13752 13752 13752 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63359 45859 19672 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++45225 33169 15226 63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63236 45897 19634 43194 31354 13386 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 40410 29471 12985 62737 45569 19692 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19711 50159 36373 15650 0 0 0 0 0 0
++0 0 0 60487 44116 19189 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 30933 22555 9803 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 55635 40828 18345 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 62986 45716 19556 36240 26320 11215 0 0 0
++128 128 128 28744 20827 9121 58279 45589 26504 48838 36002 16378 63486 46079 19455
++46384 44975 41762 65535 65535 65535 65535 65535 65535 65278 65278 65278 62065 62065 62065
++53256 53199 52942 65535 65535 65535 65535 65535 65535 65535 65535 65535 64124 64124 64124
++48486 48538 48538 58276 44060 22272 63736 46260 19789 63486 46079 19455 60487 44116 19189
++0 0 0 0 0 0 0 0 0 128 128 128 8373 6077 2600
++61861 44933 19292 63486 46079 19711 63736 46260 19789 63736 46260 19789 62986 45716 19556
++57142 41714 18588 3038 2204 899 128 128 128 1413 1028 514 27882 20284 8738
++55635 40828 18345 63736 46260 19789 63736 46260 19789 63486 46079 19711 63736 46260 19789
++63736 46260 19789 63112 45588 19556 48838 36002 16378 17750 12880 5633 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 3079 3079 3079
++18711 18711 18711 128 128 128 21838 21794 21532 60933 60933 60933 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++60652 60652 60652 12931 12931 12931 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 9814 9814 9814 61680 61680 61680 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 56283 56283 56283 30840 30197 30069
++642 642 899 128 128 128 5911 5911 5911 21838 21794 21532 20263 20263 20263
++5911 5911 5911 257 257 257 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 1028 1028 1028 2313 2313 2313
++0 0 0 0 0 0 128 128 128 0 0 0 128 128 128
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 5911 5911 5911
++15440 15440 15440 16762 16762 16762 17553 17553 17553 18517 18517 18517 18517 18517 18517
++18517 18517 18517 18517 18517 18517 18517 18517 18517 18517 18517 18517 18336 18336 18336
++14506 14506 14506 3857 3857 3857 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++2313 2313 2313 20263 20263 20263 24991 24991 24991 8455 8455 8455 1028 1028 1028
++26342 26738 26738 56283 56283 56283 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 53256 53199 52942 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 514 514 514 50115 50774 49729 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 43356 43080 42463 1799 1927 2184
++11370 11370 11370 11370 11370 11370 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++50159 36373 15650 63486 46079 19455 63736 46260 19789 63736 46260 19789 63736 46260 19789
++62986 45716 19556 37303 27193 11910 875 620 271 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 37303 27193 11910 62986 45716 19556 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 53070 38550 16467 0 0 0 0 0 0
++0 0 0 62986 45716 19556 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 25195 18262 7789 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 51340 37280 15909 63486 46079 19455 63736 46260 19789
++63736 46260 19789 63736 46260 19789 62737 45569 19692 37303 27193 11910 257 257 257
++0 0 0 22224 16071 6824 63864 46774 20174 51153 41368 24286 61113 45548 20995
++51153 41368 24286 46260 45809 45103 65535 65535 65535 65535 65535 65535 65535 65535 65535
++48486 48538 48538 58889 58889 58889 65535 65535 65535 64124 64124 64124 59538 59538 59538
++56026 55897 55897 49644 44138 34157 62486 45353 19401 64250 47031 20303 53070 38550 16467
++0 0 0 0 0 0 0 0 0 128 128 128 46996 34589 15727
++63486 46079 19455 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++17750 12880 5633 128 128 128 5943 4354 1886 53070 38550 16467 63736 46260 19789
++63486 46079 19455 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63112 45588 19556 63486 46079 19455 37303 27193 11910
++0 0 0 128 128 128 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 20778 20778 20542
++128 128 128 15440 15440 15440 58889 58889 58889 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 63607 63607 63607
++35502 34869 34383 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 38978 38978 38978 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 61309 61309 61309 38406 38021 37650 3857 3857 3857 0 0 0
++13752 13752 13752 18995 18995 18995 13752 13752 13752 0 0 0 0 0 0
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 11370 11370 11370 19317 19131 18746
++14506 14506 14506 7197 7197 7197 46260 45809 45103 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 22881 22881 22881 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 21292 21292 21292 64124 64124 64124 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 35502 34869 34383
++128 128 128 20778 20778 20542 642 642 899 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63359 45859 19672 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++53070 38550 16467 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63236 45897 19634 37303 27193 11910 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 34164 24785 10813 63486 46079 19711 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 55635 40828 18345 0 0 0 128 128 128
++1413 1028 514 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19711 23177 16932 7265 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 48838 36002 16378 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 62986 45716 19556 41427 30069 13197 0 0 0
++0 0 0 10498 7619 3259 61113 45548 20995 51153 41368 24286 64250 47031 20303
++61451 44536 19168 49644 44138 34157 64507 64507 64507 65535 65535 65535 65535 65535 65535
++65278 65278 65278 55126 54741 54484 49621 49621 49607 49621 49621 49607 52942 51360 49402
++43356 43080 42463 63486 46079 19711 63736 46260 19789 62486 45353 19401 40410 29471 12985
++0 0 0 0 0 0 128 128 128 25195 18262 7789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63236 45897 19634 40410 29471 12985
++0 0 0 3855 2930 1607 54363 39457 16879 63236 45897 19634 63736 46260 19789
++63736 46260 19789 63736 46260 19789 59002 43055 18866 46996 34589 15727 51340 37280 15909
++62986 45716 19556 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++36240 26320 11215 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 10459 10459 10459 10459 10459 10459
++1028 1285 1542 51400 51400 51400 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 63222 63222 63222 46260 45809 45103 17553 17553 17553
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 2701 2701 2701 28239 28239 28239
++44589 44631 44888 61680 61680 61680 65278 65278 65278 65535 65535 65535 65535 65535 65535
++55126 55126 55126 17553 17553 17553 0 0 0 3857 3857 3857 21292 21292 21292
++7197 7197 7197 257 257 257 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++8455 8455 8455 21292 21292 21292 3857 3857 3857 24991 24991 24991 58889 58889 58889
++65535 65535 65535 65535 65535 65535 65535 65535 65535 47697 47615 47488 3857 3857 3857
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 38406 38021 37650 61309 61309 61309
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 64764 64764 64764
++18336 18336 18336 1799 1799 1799 19317 19131 18746 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++55635 40828 18345 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63486 46079 19711 34164 24785 10813 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 34164 24785 10813 62986 45716 19556 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 59002 43055 18866 128 128 128 0 0 0
++4874 3558 1459 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 20895 15087 6460 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 45225 33169 15226 63486 46079 19455 63736 46260 19789
++63736 46260 19789 63736 46260 19789 62986 45716 19556 45225 33169 15226 0 0 0
++0 0 0 257 257 257 61861 44933 19292 51153 41368 24286 58276 44060 22272
++62856 45897 20023 51153 41368 24286 35502 34869 34383 59538 59538 59538 65535 65535 65535
++65535 65535 65535 64124 64124 64124 52685 52685 52685 43356 43080 42463 46260 45809 45103
++54760 46836 33773 63236 45897 19634 63864 46774 20174 63736 46260 19789 27882 20284 8738
++0 0 0 0 0 0 7209 5285 2184 61451 44536 19168 63486 46079 19711
++63736 46260 19789 63736 46260 19789 63236 45897 19634 59002 43055 18866 3855 2930 1607
++0 0 0 36240 26320 11215 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 37343 28956 15254 30583 30843 31357 36810 46686 56154 33153 41891 50372
++26055 26184 25186 51150 38050 17516 63486 46079 19711 63736 46260 19789 63736 46260 19789
++63486 46079 19711 15792 11440 4871 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 385 385 334 20778 20778 20542 128 128 128
++35502 34869 34383 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 56026 55897 55897 17553 17553 17553 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1028 1028 1028 24991 24991 24991 43356 43080 42463 58889 58889 58889 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 47056 47056 47056
++6810 6810 6810 128 128 128 15440 15440 15440 17553 17553 17553 128 128 128
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 17553 17553 17553 11370 11370 11370 13752 13752 13752
++52119 52119 51914 65535 65535 65535 65535 65535 65535 65535 65535 65535 58889 58889 58889
++42507 42507 42507 20778 20778 20542 257 257 257 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 13752 13752 13752
++43356 43080 42463 63607 63607 63607 65535 65535 65535 65535 65535 65535 65535 65535 65535
++52685 52685 52685 3857 3857 3857 12931 12931 12931 8455 8455 8455 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63359 45859 19672 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++59002 43055 18866 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63236 45897 19634 34164 24785 10813 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 30042 21792 9253 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 61861 44933 19292 0 0 0 0 0 0
++8095 5986 2531 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 19371 14059 6014 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 257 257 257 43194 31354 13386 62986 45716 19556 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63486 46079 19455 46996 34589 15727 0 0 0
++0 0 0 257 257 257 41427 30069 13197 63486 46079 19455 49644 44138 34157
++63864 46774 20174 63736 46260 19789 51153 41368 24286 38406 38021 37650 44589 44631 44888
++64507 64507 64507 62708 62708 62708 51400 51400 51400 43356 43080 42463 62859 46189 20912
++63483 46207 20056 63736 46260 19789 63736 46260 19789 63486 46079 19711 8373 6077 2600
++0 0 0 128 128 128 45225 33169 15226 63093 45874 19660 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 17750 12880 5633 8095 5986 2531
++15792 11440 4871 43194 31354 13386 63736 46260 19789 63486 46079 19711 63864 46774 20174
++46996 34589 15727 33153 41891 50372 26085 33024 39578 40349 51271 61680 23901 28398 32639
++42533 53970 64764 30583 30843 31357 57142 41714 18588 61861 44933 19292 63736 46260 19789
++63112 45588 19556 48838 36002 16378 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 18517 18517 18517 3079 3079 3079 12931 12931 12931
++60266 60266 60266 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 46260 45809 45103 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++20263 20263 20263 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 44589 44631 44888 514 514 514
++6427 6427 6427 21292 21292 21292 5911 5911 5911 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 11370 11370 11370 16136 16136 16136
++3079 3079 3079 46260 45809 45103 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65278 65278 65278 65021 65021 65021 52685 52685 52685 22881 22881 22881 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 43356 43080 42463 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 35838 35838 35838 0 0 0 20263 20263 20263 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++60487 44116 19189 63486 46079 19455 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 30933 22555 9803 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 28744 20827 9121 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 62486 45353 19401 0 0 0 0 0 0
++9123 6640 2832 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 17750 12880 5633 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 43194 31354 13386 62986 45716 19556 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 50159 36373 15650 0 0 0
++0 0 0 0 0 0 17750 12880 5633 63736 46260 19789 63486 46079 19455
++56972 46962 30007 63486 46079 19711 55635 40828 18345 26342 26738 26738 16136 16136 16136
++64507 64507 64507 65535 65535 65535 59538 59538 59538 52942 51360 49402 58276 44060 22272
++64250 47031 20303 63486 46079 19455 63093 45874 19660 48838 36002 16378 0 0 0
++0 0 0 23177 16932 7265 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19711 26472 20262 11291 26342 26738 26738 28239 28239 28239
++31142 24711 14520 30933 22555 9803 54363 39457 16879 63864 46774 20174 63486 46079 19711
++25709 25195 22046 43818 54098 63479 23007 25957 28667 40349 51271 61680 23901 28398 32639
++42919 54484 65535 42533 53970 64764 23116 21317 18761 30840 30197 30069 42654 31649 16191
++62859 46189 20912 63486 46079 19455 10498 7619 3259 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 4480 4480 4480 17553 17553 17553 514 514 514 48486 48538 48538
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 38978 38978 38978 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++28239 28239 28239 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 46260 45809 45103 642 642 899 15440 15440 15440
++15440 15440 15440 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 8455 8455 8455
++20263 20263 20263 3857 3857 3857 51400 51400 51400 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 38978 38978 38978 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 35838 35838 35838 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 63222 63222 63222 16136 16136 16136 3079 3079 3079 16762 16762 16762
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63359 45859 19672 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++57142 41714 18588 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 34164 24785 10813 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 30933 22555 9803 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19711 60487 44116 19189 0 0 0 0 0 0
++5943 4354 1886 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19711 20895 15087 6460 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 45225 33169 15226 63236 45897 19634 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63486 46079 19455 45225 33169 15226 0 0 0
++0 0 0 0 0 0 875 620 271 51340 37280 15909 63359 45859 19672
++62859 46189 20912 64250 47031 20303 61113 45548 20995 58276 44060 22272 33304 29072 24800
++28239 28239 28239 52119 52119 51914 17965 17965 17965 51153 41368 24286 63864 46774 20174
++63736 46260 19789 63736 46260 19789 63736 46260 19789 17750 12880 5633 0 0 0
++5943 4354 1886 60487 44116 19189 63486 46079 19711 63736 46260 19789 63736 46260 19789
++63486 46079 19455 59002 43055 18866 24991 24991 24991 50115 51271 50886 49621 49621 49607
++25709 25195 22046 34164 24785 10813 36240 26320 11215 63736 46260 19789 60373 44510 19999
++30583 30843 31357 36810 46686 56154 25709 25195 22046 31142 24711 14520 30968 32639 33656
++42919 54484 65535 42919 54484 65535 24991 24991 24991 62708 62708 62708 20778 20778 20542
++51150 38050 17516 63736 46260 19789 30933 22555 9803 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 21292 21292 21292 0 0 0 26342 26738 26738 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 31875 31875 31875 385 385 334 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++31875 31875 31875 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 47697 47615 47488 1413 1670 1799 15440 15440 15440 12931 12931 12931
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++9814 9814 9814 17553 17553 17553 11370 11370 11370 57069 56684 56283 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 42507 42507 42507 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 30840 30197 30069 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 52119 52119 51914 1799 1927 2184 14506 14506 14506
++5911 5911 5911 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++54363 39457 16879 63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63236 45897 19634 36240 26320 11215 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 34164 24785 10813 63486 46079 19711 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 57142 41714 18588 0 0 0 0 0 0
++3038 2204 899 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 22224 16071 6824 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 46996 34589 15727 63486 46079 19455 63736 46260 19789
++63736 46260 19789 63736 46260 19789 62986 45716 19556 43194 31354 13386 0 0 0
++0 0 0 0 0 0 0 0 0 12071 8729 3764 63486 46079 19711
++63486 46079 19455 63483 46207 20056 63736 46260 19789 56972 46962 30007 58276 44060 22272
++16762 16762 16762 23116 21317 18761 128 128 128 13905 12704 8095 49644 44138 34157
++63486 46079 19455 63736 46260 19789 40410 29471 12985 128 128 128 0 0 0
++43194 31354 13386 63359 45859 19672 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 22224 16071 6824 18995 18995 18995 58889 58889 58889 43356 43080 42463
++30840 30197 30069 34164 24785 10813 34164 24785 10813 64250 47031 20303 45225 33169 15226
++36810 46686 56154 25709 25195 22046 64250 47031 20303 63864 46774 20174 37343 28956 15254
++42533 53970 64764 42919 54484 65535 30968 32639 33656 60266 60266 60266 26085 33024 39578
++23901 28398 32639 57142 41714 18588 45225 33169 15226 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++4480 4480 4480 15440 15440 15440 6810 6810 6810 57470 57470 57470 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 24991 24991 24991 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 257 257 257
++35838 35838 35838 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++56283 56283 56283 6810 6810 6810 16136 16136 16136 12931 12931 12931 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 2313 2313 2313 8455 8455 8455 12931 12931 12931 15440 15440 15440
++11370 11370 11370 9814 9814 9814 6427 6427 6427 3079 3079 3079 642 642 899
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 14506 14506 14506 11370 11370 11370 20778 20778 20542 62065 62065 62065
++65535 65535 65535 65535 65535 65535 65535 65535 65535 47056 47056 47056 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 21292 21292 21292 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 33681 33681 33681 0 0 0
++20263 20263 20263 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63359 45859 19672 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++50159 36373 15650 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63236 45897 19634 37303 27193 11910 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 36240 26320 11215 63236 45897 19634 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19711 54363 39457 16879 0 0 0 0 0 0
++128 128 128 63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19711 25195 18262 7789 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 51340 37280 15909 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 62486 45353 19401 40410 29471 12985 0 0 0
++0 0 0 0 0 0 128 128 128 0 0 0 22224 16071 6824
++62986 45716 19556 63236 45897 19634 63486 46079 19711 63112 45588 19556 61241 45992 22579
++51153 41368 24286 23116 21317 18761 33304 29072 24800 23116 21317 18761 57302 45835 26989
++63486 46079 19455 48838 36002 16378 3038 2204 899 0 0 0 20895 15087 6460
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711
++43194 31354 13386 385 385 334 7197 7197 7197 56026 55897 55897 38978 38978 38978
++23116 21317 18761 46996 34589 15727 43194 31354 13386 64250 47031 20303 23116 21317 18761
++43818 54098 63479 33304 29072 24800 63486 46079 19455 59002 43055 18866 24991 24991 24991
++42919 54484 65535 43304 54355 65021 26085 33024 39578 65535 65535 65535 23901 28398 32639
++43818 54098 63479 25709 25195 22046 57142 41714 18588 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++19317 19131 18746 128 128 128 28239 28239 28239 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65021 65021 65021 10459 10459 10459 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++40984 40984 40984 65278 65278 65278 65535 65535 65535 65535 65535 65535 63607 63607 63607
++22881 22881 22881 5911 5911 5911 18711 18711 18711 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 7197 7197 7197 17553 17553 17553 16762 16762 16762 16762 16762 16762
++16762 16762 16762 14506 14506 14506 9814 9814 9814 4480 4480 4480 3079 3079 3079
++5911 5911 5911 8455 8455 8455 12931 12931 12931 16762 16762 16762 21292 21292 21292
++22881 22881 22881 20263 20263 20263 17553 17553 17553 2701 2701 2701 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 6427 6427 6427
++18995 18995 18995 18995 18995 18995 18711 18711 18711 18995 18995 18995 20263 20263 20263
++22881 22881 22881 24991 24991 24991 21838 21794 21532 18995 18995 18995 16762 16762 16762
++17965 17965 17965 18336 18336 18336 8455 8455 8455 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 22359 22625 23010 3857 3857 3857 30583 30843 31357
++65021 65021 65021 65535 65535 65535 65535 65535 65535 51400 51400 51400 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 7197 7197 7197 64124 64124 64124 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 60933 60933 60933 12931 12931 12931
++10459 10459 10459 8455 8455 8455 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++46996 34589 15727 63486 46079 19455 63736 46260 19789 63736 46260 19789 63736 46260 19789
++62986 45716 19556 41427 30069 13197 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 41427 30069 13197 62986 45716 19556 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 50159 36373 15650 0 0 0 0 0 0
++0 0 0 61451 44536 19168 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 54363 39457 16879 63864 46774 20174 63486 46079 19711
++63736 46260 19789 63736 46260 19789 63359 45859 19672 36240 26320 11215 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++17750 12880 5633 54363 39457 16879 63736 46260 19789 63486 46079 19711 63736 46260 19789
++63736 46260 19789 64250 47031 20303 62486 45353 19401 63736 46260 19789 62340 45076 19410
++34164 24785 10813 3038 2204 899 0 0 0 4874 3558 1459 59002 43055 18866
++63236 45897 19634 63736 46260 19789 63736 46260 19789 63236 45897 19634 60487 44116 19189
++5943 4354 1886 128 128 128 128 128 128 9814 9814 9814 13752 13752 13752
++34164 24785 10813 40410 29471 12985 46996 34589 15727 25709 25195 22046 23901 28398 32639
++42919 54484 65535 26055 26184 25186 33304 29072 24800 30583 30843 31357 42533 53970 64764
++42533 53970 64764 42919 54484 65535 33153 41891 50372 50115 50774 49729 45746 46260 46746
++26085 33024 39578 40349 51271 61680 31142 24711 14520 3038 2204 899 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 1028 1028 1028
++18711 18711 18711 2701 2701 2701 55531 55531 55531 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++59538 59538 59538 1028 1028 1028 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 1028 1285 1542
++48486 48538 48538 65535 65535 65535 65535 65535 65535 65535 65535 65535 39900 39413 38599
++0 0 0 24991 24991 24991 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 2701 2701 2701 18336 18336 18336
++18517 18517 18517 9814 9814 9814 0 0 0 3079 3079 3079 15440 15440 15440
++22359 22625 23010 26342 26738 26738 30840 30197 30069 35838 35838 35838 38978 38978 38978
++38978 38978 38978 35838 35838 35838 33681 33681 33681 31875 31875 31875 28239 28239 28239
++18336 18336 18336 128 128 128 1799 1799 1799 16762 16762 16762 19317 19131 18746
++18711 18711 18711 2701 2701 2701 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 11370 11370 11370 20263 20263 20263 11370 11370 11370
++0 0 0 7197 7197 7197 22881 22881 22881 35838 35838 35838 38978 38978 38978
++38406 38021 37650 38406 38021 37650 35838 35838 35838 35502 34869 34383 26342 26738 26738
++15440 15440 15440 3079 3079 3079 11370 11370 11370 19317 19131 18746 18517 18517 18517
++3857 3857 3857 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 30840 30197 30069 385 385 334
++42507 42507 42507 65535 65535 65535 65535 65535 65535 55126 55126 55126 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 0 0 0 58889 58889 58889 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 40833 41475 42019
++257 257 257 20263 20263 20263 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63359 45859 19672 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 257 257 257
++41427 30069 13197 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63486 46079 19711 50159 36373 15650 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 50159 36373 15650 63486 46079 19711 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19455 45225 33169 15226 0 0 0 0 0 0
++0 0 0 57142 41714 18588 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63236 45897 19634 36240 26320 11215 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 875 620 271 62986 45716 19556 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 30933 22555 9803 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 875 620 271 20895 15087 6460 37303 27193 11910 46996 34589 15727
++53070 38550 16467 51340 37280 15909 43194 31354 13386 28744 20827 9121 8095 5986 2531
++257 257 257 0 0 0 0 0 0 40410 29471 12985 63486 46079 19455
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 23177 16932 7265
++0 0 0 0 0 0 0 0 0 128 128 128 22224 16071 6824
++21142 18577 13954 57142 41714 18588 26342 26738 26738 26085 33024 39578 40349 51271 61680
++42533 53970 64764 36810 46686 56154 26085 33024 39578 33667 36494 42587 36810 46686 56154
++42919 54484 65535 42919 54484 65535 33153 41891 50372 48486 48538 48538 38406 38021 37650
++24991 24991 24991 40349 51271 61680 33667 36494 42587 3855 2930 1607 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 16762 16762 16762
++2313 2313 2313 24991 24991 24991 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 61309 61309 61309
++28239 28239 28239 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 8455 8455 8455 49304 49177 49053
++65535 65535 65535 65535 65535 65535 65535 65535 65535 57069 56684 56283 4615 5268 6322
++18517 18517 18517 4480 4480 4480 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 6810 6810 6810 21292 21292 21292 19317 19131 18746 642 642 899
++14506 14506 14506 35838 35838 35838 50115 50774 49729 60266 60266 60266 65535 65535 65535
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++64764 64764 64764 53256 53199 52942 38406 38021 37650 16762 16762 16762 514 514 514
++642 642 899 18995 18995 18995 20263 20263 20263 1028 1285 1542 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++9814 9814 9814 20263 20263 20263 8455 8455 8455 6810 6810 6810 31875 31875 31875
++49621 49621 49607 63607 63607 63607 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 58889 58889 58889 38978 38978 38978 22881 22881 22881 6810 6810 6810
++15440 15440 15440 20778 20778 20542 5911 5911 5911 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 2313 2313 2313 26342 26738 26738
++7197 7197 7197 59538 59538 59538 65535 65535 65535 65278 65278 65278 43356 43080 42463
++1799 1927 2184 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 40984 40984 40984 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 60266 60266 60266
++7197 7197 7197 20263 20263 20263 1413 1670 1799 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++30933 22555 9803 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 59002 43055 18866 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 59002 43055 18866 63486 46079 19455 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19711 34164 24785 10813 0 0 0 0 0 0
++0 0 0 45225 33169 15226 63112 45588 19556 63736 46260 19789 63736 46260 19789
++63736 46260 19789 62986 45716 19556 43194 31354 13386 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8095 5986 2531 63486 46079 19711 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 20895 15087 6460 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 128 128 128 0 0 0
++0 0 0 0 0 0 19371 14059 6014 63486 46079 19711 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63236 45897 19634 45225 33169 15226 875 620 271
++0 0 0 0 0 0 0 0 0 0 0 0 16136 16136 16136
++23901 28398 32639 31142 24711 14520 23116 21317 18761 21292 21292 21292 42533 53970 64764
++30968 32639 33656 45746 46260 46746 60933 60933 60933 60266 60266 60266 40833 41475 42019
++26085 33024 39578 43304 54355 65021 40349 51271 61680 40833 41475 42019 57470 57470 57470
++60266 60266 60266 23007 25957 28667 23901 28398 32639 9123 6640 2832 0 0 0
++
++0 0 0 0 0 0 0 0 0 257 257 257 19317 19131 18746
++514 514 514 50115 51271 50886 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 57470 57470 57470 21292 21292 21292
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 20263 20263 20263 56026 55897 55897 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 33681 33681 33681 2701 2701 2701
++16762 16762 16762 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++17965 17965 17965 14506 14506 14506 2056 2313 2822 30840 30197 30069 48486 48538 48538
++64124 64124 64124 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 64764 64764 64764 53256 53199 52942
++30583 30843 31357 4480 4480 4480 1772 1533 1155 20263 20263 20263 15440 15440 15440
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 642 642 899 18711 18711 18711
++11370 11370 11370 3079 3079 3079 33681 33681 33681 58889 58889 58889 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 59538 59538 59538
++35838 35838 35838 12931 12931 12931 15440 15440 15440 21292 21292 21292 3079 3079 3079
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 15440 15440 15440
++6810 6810 6810 38406 38021 37650 65535 65535 65535 65535 65535 65535 65535 65535 65535
++49304 49177 49053 6427 6427 6427 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 257 257 257 39900 39413 38599 65021 65021 65021
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++35838 35838 35838 1799 1927 2184 18711 18711 18711 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63359 45859 19672 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++20895 15087 6460 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19455 2402 1799 684 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++3855 2930 1607 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 20895 15087 6460 0 0 0 0 0 0
++0 0 0 34164 24785 10813 63486 46079 19711 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 53070 38550 16467 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 17750 12880 5633 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 7209 5285 2184 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 3038 2204 899 57142 41714 18588 63236 45897 19634 63736 46260 19789
++63736 46260 19789 62986 45716 19556 61451 44536 19168 7209 5285 2184 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 21142 18577 13954
++26342 26738 26738 18517 18517 18517 34164 24785 10813 26085 33024 39578 33667 36494 42587
++55126 55126 55126 65278 65278 65278 65278 65278 65278 65535 65535 65535 65021 65021 65021
++48486 48538 48538 33153 41891 50372 42533 53970 64764 33667 35337 36808 55531 55531 55531
++65278 65278 65278 24991 24991 24991 42654 31649 16191 10498 7619 3259 0 0 0
++
++0 0 0 0 0 0 0 0 0 11370 11370 11370 7197 7197 7197
++20263 20263 20263 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 57470 57470 57470 15440 15440 15440 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 24991 24991 24991 61680 61680 61680 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 55126 55126 55126 3079 3079 3079 18995 18995 18995
++642 642 899 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 5911 5911 5911 21292 21292 21292
++3857 3857 3857 16762 16762 16762 52119 52119 51914 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 55126 54741 54484 22881 22881 22881 257 257 257 7197 7197 7197
++22881 22881 22881 2313 2313 2313 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 9814 9814 9814 20778 20778 20542 1413 1670 1799
++21838 21794 21532 55126 55126 55126 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 62708 62708 62708 40833 41475 42019 9814 9814 9814 22881 22881 22881
++13752 13752 13752 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++22881 22881 22881 7197 7197 7197 59538 59538 59538 65535 65535 65535 65535 65535 65535
++65535 65535 65535 53256 53199 52942 10459 10459 10459 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 38406 38021 37650
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++55126 55126 55126 385 385 334 26342 26738 26738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++8373 6077 2600 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 17750 12880 5633 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++19371 14059 6014 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 9123 6640 2832 0 0 0 0 0 0
++0 0 0 22224 16071 6824 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 3855 2930 1607 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 34164 24785 10813 62986 45716 19556 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 60487 44116 19189 0 0 0 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 37303 27193 11910 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 25195 18262 7789 385 385 334 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 27882 20284 8738
++62986 45716 19556 36240 26320 11215 37343 28956 15254 36810 46686 56154 33667 35337 36808
++65021 65021 65021 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 30968 32639 33656 42533 53970 64764 26085 33024 39578 60933 60933 60933
++52685 52685 52685 53256 53199 52942 48838 36002 16378 8095 5986 2531 257 257 257
++
++0 0 0 0 0 0 128 128 128 17965 17965 17965 0 0 0
++46260 45809 45103 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 58889 58889 58889 3079 3079 3079 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++257 257 257 26342 26738 26738 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 26342 26738 26738 3857 3857 3857 16136 16136 16136
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 13752 13752 13752 15440 15440 15440 642 642 899
++33681 33681 33681 61309 61309 61309 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 65278 65278 65278 44589 44631 44888 11370 11370 11370
++514 514 514 22881 22881 22881 10459 10459 10459 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 18517 18517 18517 11370 11370 11370 128 128 128 35502 34869 34383
++62065 62065 62065 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 57470 57470 57470 24991 24991 24991
++14506 14506 14506 21292 21292 21292 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++11370 11370 11370 8455 8455 8455 40984 40984 40984 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65021 65021 65021 12931 12931 12931 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 24991 24991 24991
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65021 65021 65021 17553 17553 17553 22881 22881 22881 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63359 45859 19672 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++257 257 257 60487 44116 19189 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63236 45897 19634 34164 24785 10813 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++36240 26320 11215 63236 45897 19634 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63486 46079 19455 60487 44116 19189 128 128 128 0 0 0 0 0 0
++0 0 0 10498 7619 3259 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 19371 14059 6014 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 50159 36373 15650 63359 45859 19672 63736 46260 19789 63736 46260 19789
++63486 46079 19711 63486 46079 19455 45225 33169 15226 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 257 257 257
++15792 11440 4871 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63486 46079 19455 46996 34589 15727 385 385 334 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 23177 16932 7265
++63736 46260 19789 37303 27193 11910 31142 24711 14520 33153 41891 50372 48486 48538 48538
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65021 65021 65021 38978 38978 38978 40349 51271 61680 26085 33024 39578 64507 64507 64507
++33681 33681 33681 65278 65278 65278 37343 28956 15254 4874 3558 1459 0 0 0
++
++0 0 0 0 0 0 0 0 0 18336 18336 18336 4480 4480 4480
++60652 60652 60652 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 21838 21794 21532 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 7197 7197 7197 62708 62708 62708 65535 65535 65535 65535 65535 65535
++65535 65535 65535 55126 54741 54484 1799 1927 2184 20263 20263 20263 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 15440 15440 15440 9814 9814 9814 8455 8455 8455 44589 44631 44888
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 57470 57470 57470 53256 53199 52942 47697 47615 47488
++43356 43080 42463 38978 38978 38978 40984 40984 40984 46260 45809 45103 49621 49621 49607
++55126 54741 54484 59538 59538 59538 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 61309 61309 61309
++33681 33681 33681 1028 1028 1028 14506 14506 14506 18995 18995 18995 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++20778 20778 20542 6810 6810 6810 4480 4480 4480 46260 45809 45103 65021 65021 65021
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 64124 64124 64124 55126 54741 54484 50115 51271 50886
++47056 47056 47056 44589 44631 44888 49621 49621 49607 57470 57470 57470 63607 63607 63607
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 63222 63222 63222
++38978 38978 38978 4480 4480 4480 21838 21794 21532 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 18995 18995 18995 18517 18517 18517 64764 64764 64764 65535 65535 65535
++65535 65535 65535 56283 56283 56283 257 257 257 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 35838 35838 35838
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 35838 35838 35838 8455 8455 8455 11370 11370 11370 385 385 334
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 40410 29471 12985 62986 45716 19556 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19711 54363 39457 16879 875 620 271 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 1264 929 361
++57142 41714 18588 63486 46079 19455 63736 46260 19789 63736 46260 19789 63736 46260 19789
++62986 45716 19556 40410 29471 12985 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 54363 39457 16879 63236 45897 19634 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63236 45897 19634 41427 30069 13197 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++8373 6077 2600 63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 25195 18262 7789 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 2402 1799 684
++55635 40828 18345 63486 46079 19455 63736 46260 19789 63736 46260 19789 63486 46079 19711
++61861 44933 19292 9123 6640 2832 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 20895 15087 6460
++63486 46079 19711 57142 41714 18588 21142 18577 13954 33153 41891 50372 53256 53199 52942
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 52119 52119 51914 33153 41891 50372 36810 46686 56154 44589 44631 44888
++39900 39413 38599 33304 29072 24800 42654 31649 16191 642 642 899 0 0 0
++
++0 0 0 0 0 0 3079 3079 3079 15440 15440 15440 24991 24991 24991
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 35838 35838 35838 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 52119 52119 51914 65535 65535 65535 65535 65535 65535
++65278 65278 65278 30840 30197 30069 4480 4480 4480 15440 15440 15440 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++15440 15440 15440 9814 9814 9814 8455 8455 8455 50115 50774 49729 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 63607 63607 63607 51400 51400 51400
++38406 38021 37650 18995 18995 18995 514 514 514 0 0 0 128 128 128
++128 128 128 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 2313 2313 2313 24991 24991 24991 42507 42507 42507 56283 56283 56283
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 47056 47056 47056 3079 3079 3079 4480 4480 4480 22881 22881 22881
++3857 3857 3857 0 0 0 0 0 0 2313 2313 2313 22881 22881 22881
++3857 3857 3857 1028 1028 1028 45746 46260 46746 63222 63222 63222 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65021 65021 65021
++55126 54741 54484 38406 38021 37650 15440 15440 15440 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 7197 7197 7197
++30583 30843 31357 48486 48538 48538 62708 62708 62708 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 44589 44631 44888 3857 3857 3857 22359 22625 23010 257 257 257
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 17965 17965 17965 1028 1028 1028 52119 52119 51914 65535 65535 65535
++65278 65278 65278 46260 45809 45103 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 47056 47056 47056
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 51400 51400 51400 128 128 128 19317 19131 18746 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63359 45859 19672 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 17750 12880 5633 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63864 46774 20174 19371 14059 6014 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 23177 16932 7265
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 15792 11440 4871 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 30933 22555 9803 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63093 45874 19660 7209 5285 2184
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++36240 26320 11215 63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 62486 45353 19401 3855 2930 1607 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 36240 26320 11215
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711
++28744 20827 9121 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 10498 7619 3259
++63486 46079 19455 64250 47031 20303 37343 28956 15254 33667 36494 42587 57069 56684 56283
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 48486 48538 48538 36810 46686 56154 42533 53970 64764 22359 22625 23010
++33304 29072 24800 62986 45716 19556 54363 39457 16879 0 0 0 0 0 0
++
++0 0 0 0 0 0 16136 16136 16136 2313 2313 2313 38406 38021 37650
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 47056 47056 47056 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 40984 40984 40984 65278 65278 65278 65535 65535 65535
++56283 56283 56283 1413 1670 1799 20263 20263 20263 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 15440 15440 15440
++8455 8455 8455 8455 8455 8455 49304 49177 49053 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 59538 59538 59538 38978 38978 38978 12931 12931 12931 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 1413 1670 1799
++26055 26184 25186 55126 55126 55126 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 50115 51271 50886 7197 7197 7197 128 128 128
++18995 18995 18995 11370 11370 11370 6810 6810 6810 24991 24991 24991 514 514 514
++128 128 128 0 0 0 128 128 128 11370 11370 11370 33681 33681 33681
++48486 48538 48538 64124 64124 64124 64507 64507 64507 44589 44631 44888 21838 21794 21532
++642 642 899 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++0 0 0 0 0 0 10459 10459 10459 38978 38978 38978 61309 61309 61309
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 42507 42507 42507 3079 3079 3079 22881 22881 22881
++514 514 514 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 3079 3079 3079 15440 15440 15440 33681 33681 33681 65535 65535 65535
++65535 65535 65535 33681 33681 33681 257 257 257 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 642 642 899 57470 57470 57470
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 62708 62708 62708 5911 5911 5911 18995 18995 18995 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 257 257 257 57142 41714 18588 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63236 45897 19634 54363 39457 16879 3038 2204 899
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 3855 2930 1607 57142 41714 18588
++63112 45588 19556 63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711
++57142 41714 18588 875 620 271 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 8095 5986 2531 63359 45859 19672 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711 43194 31354 13386
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 12071 8729 3764
++62340 45076 19410 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++62986 45716 19556 43194 31354 13386 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 13872 10127 4336 63736 46260 19789
++63486 46079 19711 63736 46260 19789 63736 46260 19789 62986 45716 19556 50159 36373 15650
++385 385 334 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 1264 929 361
++62340 45076 19410 63736 46260 19789 48838 36002 16378 26085 33024 39578 55126 54741 54484
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 44589 44631 44888 36810 46686 56154 42919 54484 65535 26055 26184 25186
++42654 31649 16191 62340 45076 19410 41427 30069 13197 128 128 128 0 0 0
++
++0 0 0 0 0 0 20263 20263 20263 0 0 0 50115 51271 50886
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 57470 57470 57470 1413 1670 1799
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 385 385 334 28239 28239 28239 65535 65535 65535 65535 65535 65535
++40984 40984 40984 0 0 0 18517 18517 18517 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 15440 15440 15440 9814 9814 9814
++7197 7197 7197 49304 49177 49053 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 57470 57470 57470
++38406 38021 37650 7197 7197 7197 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++257 257 257 4480 4480 4480 42507 42507 42507 64124 64124 64124 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65021 65021 65021 55126 54741 54484 11370 11370 11370
++257 257 257 11370 11370 11370 18711 18711 18711 0 0 0 0 0 0
++10459 10459 10459 8455 8455 8455 0 0 0 0 0 0 0 0 0
++257 257 257 18995 18995 18995 49304 49177 49053 56026 55897 55897 21838 21794 21532
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 11370 11370 11370
++43356 43080 42463 62708 62708 62708 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 40984 40984 40984 3079 3079 3079
++22881 22881 22881 514 514 514 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 18517 18517 18517 20263 20263 20263 65535 65535 65535
++65535 65535 65535 22881 22881 22881 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 15440 15440 15440 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 20263 20263 20263 18995 18995 18995 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63359 45859 19672 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 30042 21792 9253 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19455 45225 33169 15226
++3038 2204 899 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 3038 2204 899 46996 34589 15727 63486 46079 19455
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19455
++28744 20827 9121 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 43194 31354 13386 63236 45897 19634
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63359 45859 19672
++34164 24785 10813 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 8373 6077 2600 55635 40828 18345
++62986 45716 19556 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63486 46079 19711 15792 11440 4871 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 1772 1533 1155 54363 39457 16879 62986 45716 19556
++63736 46260 19789 63736 46260 19789 63486 46079 19711 62486 45353 19401 10498 7619 3259
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++50159 36373 15650 62340 45076 19410 59002 43055 18866 23901 28398 32639 38978 38978 38978
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 33667 35337 36808 42533 53970 64764 40349 51271 61680 31142 24711 14520
++63736 46260 19789 63486 46079 19711 27882 20284 8738 0 0 0 0 0 0
++
++0 0 0 0 0 0 24991 24991 24991 5911 5911 5911 61309 61309 61309
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 57470 57470 57470 5911 5911 5911
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 42507 42507 42507 65535 65535 65535 65535 65535 65535
++22881 22881 22881 14506 14506 14506 5911 5911 5911 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 15440 15440 15440 8455 8455 8455 7197 7197 7197
++49304 49177 49053 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 62708 62708 62708 39900 39413 38599 5911 5911 5911
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 0 0 0 24991 24991 24991 60266 60266 60266
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 57069 56684 56283
++15440 15440 15440 128 128 128 0 0 0 0 0 0 0 0 0
++1413 1670 1799 38978 38978 38978 50115 51271 50886 35838 35838 35838 11370 11370 11370
++0 0 0 128 128 128 0 0 0 26055 26184 25186 53256 53199 52942
++40984 40984 40984 3079 3079 3079 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++128 128 128 18995 18995 18995 53256 53199 52942 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 38406 38021 37650
++2313 2313 2313 20778 20778 20542 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 18995 18995 18995 4480 4480 4480 61680 61680 61680
++65535 65535 65535 39900 39413 38599 257 257 257 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 13752 13752 13752 60266 60266 60266
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 28239 28239 28239 17553 17553 17553 1028 1028 1028
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 28744 20827 9121 41427 30069 13197 41427 30069 13197 41427 30069 13197
++41427 30069 13197 41427 30069 13197 41427 30069 13197 41427 30069 13197 41427 30069 13197
++41427 30069 13197 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 51340 37280 15909 41427 30069 13197 41427 30069 13197
++41427 30069 13197 41427 30069 13197 41427 30069 13197 41427 30069 13197 41427 30069 13197
++41427 30069 13197 28744 20827 9121 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 1264 929 361 54363 39457 16879 63359 45859 19672
++63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19455
++54363 39457 16879 27882 20284 8738 5943 4354 1886 385 385 334 128 128 128
++7209 5285 2184 27882 20284 8738 55635 40828 18345 63486 46079 19455 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 62986 45716 19556 53070 38550 16467
++1264 929 361 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 8095 5986 2531 62340 45076 19410
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63486 46079 19711 50159 36373 15650 22224 16071 6824 3855 2930 1607 128 128 128
++875 620 271 10498 7619 3259 34164 24785 10813 60487 44116 19189 63486 46079 19455
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63236 45897 19634
++40410 29471 12985 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 34164 24785 10813 63486 46079 19455 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 30042 21792 9253 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++25195 18262 7789 63864 46774 20174 43194 31354 13386 23116 21317 18761 30968 32639 33656
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++61309 61309 61309 26085 33024 39578 36810 46686 56154 18336 18336 18336 53070 38550 16467
++63483 46207 20056 62486 45353 19401 4874 3558 1459 0 0 0 0 0 0
++
++0 0 0 0 0 0 22359 22625 23010 24991 24991 24991 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 60652 60652 60652 20263 20263 20263 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 18995 18995 18995 62708 62708 62708 65535 65535 65535 56283 56283 56283
++1028 1285 1542 22881 22881 22881 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++257 257 257 13752 13752 13752 9814 9814 9814 6427 6427 6427 48486 48538 48538
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 55126 54741 54484 21292 21292 21292 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 18995 18995 18995
++58889 58889 58889 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++55126 55126 55126 8455 8455 8455 0 0 0 0 0 0 3079 3079 3079
++0 0 0 385 385 334 11370 11370 11370 47056 47056 47056 60266 60266 60266
++38978 38978 38978 5911 5911 5911 0 0 0 128 128 128 1028 1028 1028
++38978 38978 38978 53256 53199 52942 18517 18517 18517 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 2701 2701 2701 39900 39413 38599 62708 62708 62708
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++30840 30197 30069 5911 5911 5911 16762 16762 16762 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 13752 13752 13752 4480 4480 4480 53256 53199 52942
++65535 65535 65535 61309 61309 61309 12931 12931 12931 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 28239 28239 28239
++64124 64124 64124 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 33681 33681 33681 8455 8455 8455 10459 10459 10459
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 45225 33169 15226 63736 46260 19789 62986 45716 19556 62986 45716 19556
++62986 45716 19556 62986 45716 19556 62986 45716 19556 62986 45716 19556 62986 45716 19556
++62986 45716 19556 62986 45716 19556 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19711 62486 45353 19401 62986 45716 19556 62986 45716 19556
++62986 45716 19556 62986 45716 19556 62986 45716 19556 62986 45716 19556 62986 45716 19556
++63486 46079 19711 43194 31354 13386 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 19371 14059 6014 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63486 46079 19711 63736 46260 19789 63736 46260 19789 62486 45353 19401 62486 45353 19401
++63736 46260 19789 63736 46260 19789 63236 45897 19634 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 15792 11440 4871
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 257 257 257 30933 22555 9803
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 62737 45569 19692 63736 46260 19789 63736 46260 19789 61861 44933 19292
++63486 46079 19711 63486 46079 19711 63486 46079 19455 63486 46079 19711 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63236 45897 19634 60487 44116 19189
++5943 4354 1886 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++257 257 257 12071 8729 3764 62986 45716 19556 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63236 45897 19634 51340 37280 15909 1264 929 361 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++3855 2930 1607 43194 31354 13386 25195 18262 7789 61451 44536 19168 23116 21317 18761
++30583 30843 31357 53256 53199 52942 65535 65535 65535 65021 65021 65021 62065 62065 62065
++30583 30843 31357 26342 26738 26738 33304 29072 24800 62465 45547 19595 30042 21792 9253
++45225 33169 15226 41427 30069 13197 0 0 0 0 0 0 0 0 0
++
++0 0 0 3857 3857 3857 15440 15440 15440 31875 31875 31875 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 63607 63607 63607 28239 28239 28239 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1028 1028 1028 51400 51400 51400 65535 65535 65535 65535 65535 65535 40984 40984 40984
++128 128 128 19317 19131 18746 257 257 257 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++11370 11370 11370 11370 11370 11370 4480 4480 4480 48486 48538 48538 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 64124 64124 64124
++42507 42507 42507 4480 4480 4480 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++16136 16136 16136 57069 56684 56283 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 52685 52685 52685 48486 48538 48538 55531 55531 55531 61680 61680 61680
++55126 54741 54484 38978 38978 38978 4480 4480 4480 128 128 128 35838 35838 35838
++65278 65278 65278 57470 57470 57470 33681 33681 33681 2313 2313 2313 0 0 0
++0 0 0 26342 26738 26738 57470 57470 57470 28239 28239 28239 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 20263 20263 20263
++56026 55897 55897 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++63222 63222 63222 20778 20778 20542 10459 10459 10459 12931 12931 12931 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 2313 2313 2313 17965 17965 17965 44589 44631 44888
++65278 65278 65278 65535 65535 65535 44589 44631 44888 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++39900 39413 38599 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 40984 40984 40984 0 0 0 18711 18711 18711
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 43194 31354 13386 63236 45897 19634 63486 46079 19711 63736 46260 19789
++63486 46079 19711 63736 46260 19789 63486 46079 19711 63736 46260 19789 63486 46079 19711
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711
++63736 46260 19789 63486 46079 19711 63736 46260 19789 63486 46079 19711 63736 46260 19789
++62986 45716 19556 43194 31354 13386 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 30933 22555 9803
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 27882 20284 8738 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 1264 929 361
++43194 31354 13386 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63236 45897 19634 61861 44933 19292 15792 11440 4871
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1264 929 361 53070 38550 16467 62986 45716 19556 63736 46260 19789 63736 46260 19789
++63736 46260 19789 62737 45569 19692 12071 8729 3764 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 27882 20284 8738 37303 27193 11910 43194 31354 13386 59002 43055 18866
++53070 38550 16467 20895 15087 6460 23116 21317 18761 21142 18577 13954 23116 21317 18761
++25195 18262 7789 57142 41714 18588 61451 44536 19168 55635 40828 18345 28744 20827 9121
++55635 40828 18345 7209 5285 2184 0 0 0 0 0 0 0 0 0
++
++257 257 257 8455 8455 8455 9814 9814 9814 35838 35838 35838 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65021 65021 65021 35502 34869 34383 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++31875 31875 31875 65278 65278 65278 65535 65535 65535 65535 65535 65535 33681 33681 33681
++4480 4480 4480 11370 11370 11370 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 9814 9814 9814
++14506 14506 14506 2313 2313 2313 45746 46260 46746 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 56283 56283 56283 24991 24991 24991
++0 0 0 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 12931 12931 12931 55126 55126 55126 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 55126 54741 54484 9814 9814 9814 0 0 0
++40984 40984 40984 65535 65535 65535 65535 65535 65535 55126 54741 54484 28239 28239 28239
++514 514 514 0 0 0 14506 14506 14506 53256 53199 52942 33681 33681 33681
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++11370 11370 11370 53256 53199 52942 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 60266 60266 60266 12931 12931 12931 14506 14506 14506 8455 8455 8455
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 514 514 514 22881 22881 22881 35838 35838 35838
++65535 65535 65535 65535 65535 65535 64124 64124 64124 21292 21292 21292 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1413 1670 1799 48486 48538 48538 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 48486 48538 48538 0 0 0 18711 18711 18711
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 45225 33169 15226 62986 45716 19556 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++62986 45716 19556 43194 31354 13386 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++30933 22555 9803 63736 46260 19789 63236 45897 19634 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63236 45897 19634 63736 46260 19789 28744 20827 9121 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1413 1028 514 43194 31354 13386 63736 46260 19789 63486 46079 19711 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19711 61861 44933 19292 17750 12880 5633 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++30933 22555 9803 63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19455
++64250 47031 20303 30933 22555 9803 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 875 620 271 43194 31354 13386 43194 31354 13386 23177 16932 7265
++34164 24785 10813 61985 45298 20071 63736 46260 19789 64250 47031 20303 63736 46260 19789
++60373 44510 19999 30933 22555 9803 28744 20827 9121 37303 27193 11910 46996 34589 15727
++23177 16932 7265 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 14506 14506 14506 3857 3857 3857 40984 40984 40984 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++47056 47056 47056 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 8455 8455 8455
++57470 57470 57470 65535 65535 65535 65535 65535 65535 65535 65535 65535 28239 28239 28239
++14506 14506 14506 4480 4480 4480 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 6427 6427 6427 17553 17553 17553
++128 128 128 42507 42507 42507 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 52685 52685 52685 8455 8455 8455 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 9814 9814 9814 52685 52685 52685 65535 65535 65535
++56026 55897 55897 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 51400 51400 51400 4480 4480 4480
++3079 3079 3079 55531 55531 55531 65535 65535 65535 65535 65535 65535 65535 65535 65535
++44589 44631 44888 3079 3079 3079 128 128 128 8455 8455 8455 55126 55126 55126
++33681 33681 33681 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 7197 7197 7197 51400 51400 51400 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 53256 53199 52942 8455 8455 8455 18995 18995 18995
++3079 3079 3079 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 26055 26184 25186 30583 30843 31357
++65535 65535 65535 65535 65535 65535 65535 65535 65535 49621 49621 49607 642 642 899
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 26342 26738 26738 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 56283 56283 56283 1799 1799 1799 18517 18517 18517
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 43194 31354 13386 63486 46079 19455 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63236 45897 19634 43194 31354 13386 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 20895 15087 6460 57142 41714 18588 63486 46079 19455 63359 45859 19672
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63236 45897 19634 63736 46260 19789
++54363 39457 16879 19371 14059 6014 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 1413 1028 514 28744 20827 9121 60487 44116 19189 63486 46079 19455
++63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 62986 45716 19556
++63736 46260 19789 46996 34589 15727 12071 8729 3764 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 10498 7619 3259
++62986 45716 19556 63736 46260 19789 63736 46260 19789 63736 46260 19789 62986 45716 19556
++53070 38550 16467 2402 1799 684 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 2402 1799 684 43194 31354 13386 57142 41714 18588
++63486 46079 19455 63736 46260 19789 63736 46260 19789 63486 46079 19711 63736 46260 19789
++63736 46260 19789 63736 46260 19789 51340 37280 15909 62486 45353 19401 23177 16932 7265
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 18336 18336 18336 0 0 0 44589 44631 44888 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++60652 60652 60652 16762 16762 16762 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 33681 33681 33681
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 20263 20263 20263
++21292 21292 21292 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 3857 3857 3857 20263 20263 20263 385 385 334
++35838 35838 35838 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 52685 52685 52685 7197 7197 7197 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 7197 7197 7197 46260 45809 45103
++38978 38978 38978 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 47056 47056 47056
++257 257 257 31875 31875 31875 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 50115 50774 49729 9814 9814 9814 0 0 0 14506 14506 14506
++57470 57470 57470 22881 22881 22881 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 3857 3857 3857 48486 48538 48538 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 44589 44631 44888 1028 1285 1542
++21838 21794 21532 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 26342 26738 26738 28239 28239 28239
++65535 65535 65535 65535 65535 65535 65278 65278 65278 55126 54741 54484 1028 1028 1028
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++5911 5911 5911 55126 54741 54484 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 61309 61309 61309 4480 4480 4480 18336 18336 18336
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 45225 33169 15226 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 43194 31354 13386 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 2402 1799 684 30042 21792 9253 53070 38550 16467
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 50159 36373 15650 27882 20284 8738
++1413 1028 514 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 5943 4354 1886 36240 26320 11215
++55635 40828 18345 63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711
++63736 46260 19789 63736 46260 19789 63486 46079 19711 63112 45588 19556 45225 33169 15226
++20895 15087 6460 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 875 620 271 51340 37280 15909
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63093 45874 19660
++13872 10127 4336 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 20895 15087 6460
++50159 36373 15650 63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63486 46079 19455 60487 44116 19189 40410 29471 12985 7209 5285 2184 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 18517 18517 18517 0 0 0 48486 48538 48538 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 53256 53199 52942 5911 5911 5911 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 5911 5911 5911
++57470 57470 57470 65535 65535 65535 65535 65535 65535 64764 64764 64764 8455 8455 8455
++21292 21292 21292 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 1799 1799 1799 22881 22881 22881 0 0 0 30840 30197 30069
++64124 64124 64124 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++51400 51400 51400 6810 6810 6810 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++45746 46260 46746 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65021 65021 65021
++21292 21292 21292 18711 18711 18711 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 53256 53199 52942 4480 4480 4480 128 128 128
++21292 21292 21292 57069 56684 56283 5911 5911 5911 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 2701 2701 2701 50115 51271 50886
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 33681 33681 33681
++4480 4480 4480 17553 17553 17553 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 26342 26738 26738 24991 24991 24991
++65278 65278 65278 65535 65535 65535 65535 65535 65535 30583 30843 31357 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++43356 43080 42463 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 64124 64124 64124 7197 7197 7197 17965 17965 17965
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 20895 15087 6460 27882 20284 8738 34164 24785 10813 34164 24785 10813
++25195 18262 7789 20895 15087 6460 5943 4354 1886 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 10498 7619 3259 23177 16932 7265 28744 20827 9121 34164 24785 10813
++30933 22555 9803 25195 18262 7789 17750 12880 5633 3038 2204 899 128 128 128
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 4874 3558 1459 13872 10127 4336 20895 15087 6460 17750 12880 5633
++12071 8729 3764 257 257 257 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 18517 18517 18517 0 0 0 52685 52685 52685 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 44589 44631 44888 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++35838 35838 35838 65535 65535 65535 65535 65535 65535 62708 62708 62708 4480 4480 4480
++18995 18995 18995 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++642 642 899 22881 22881 22881 642 642 899 22881 22881 22881 62065 62065 62065
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 51400 51400 51400
++6427 6427 6427 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 257 257 257
++53256 53199 52942 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++42507 42507 42507 4480 4480 4480 62065 62065 62065 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 40833 41475 42019 0 0 0
++128 128 128 46260 45809 45103 30583 30843 31357 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 257 257 257 10459 10459 10459
++57470 57470 57470 65535 65535 65535 65535 65535 65535 65535 65535 65535 62708 62708 62708
++18995 18995 18995 12931 12931 12931 9814 9814 9814 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 28239 28239 28239 18995 18995 18995
++65535 65535 65535 65535 65535 65535 55126 55126 55126 1799 1799 1799 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 26342 26738 26738
++64124 64124 64124 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 10459 10459 10459 17553 17553 17553
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++257 257 257 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 0 0 0 0 0 0 0 0 0
++128 128 128 128 128 128 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 18517 18517 18517 0 0 0 55126 54741 54484 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65278 65278 65278 31875 31875 31875 385 385 334
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++3079 3079 3079 55531 55531 55531 65535 65535 65535 63607 63607 63607 5911 5911 5911
++17553 17553 17553 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++22359 22625 23010 2313 2313 2313 16136 16136 16136 59538 59538 59538 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 50115 51271 50886 5911 5911 5911
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++51400 51400 51400 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++46260 45809 45103 0 0 0 57069 56684 56283 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 64124 64124 64124 21838 21794 21532
++128 128 128 33681 33681 33681 48486 48538 48538 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++21292 21292 21292 62065 62065 62065 65535 65535 65535 65535 65535 65535 65535 65535 65535
++56283 56283 56283 7197 7197 7197 20263 20263 20263 2313 2313 2313 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 24991 24991 24991 21292 21292 21292
++65535 65535 65535 65535 65535 65535 31875 31875 31875 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 2701 2701 2701 56283 56283 56283
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 12931 12931 12931 17553 17553 17553
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 5943 4354 1886
++59002 43055 18866 60373 44510 19999 59002 43055 18866 59002 43055 18866 8095 5986 2531
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 18517 18517 18517 0 0 0 51400 51400 51400 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 64764 64764 64764 40833 41475 42019 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 31875 31875 31875 65535 65535 65535 64764 64764 64764 6810 6810 6810
++17553 17553 17553 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 20263 20263 20263
++4480 4480 4480 10459 10459 10459 56283 56283 56283 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 55126 55126 55126 8455 8455 8455 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++47697 47615 47488 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++44589 44631 44888 514 514 514 59538 59538 59538 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 44589 44631 44888
++0 0 0 20263 20263 20263 58889 58889 58889 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 33681 33681 33681 65021 65021 65021 65535 65535 65535 65535 65535 65535
++65535 65535 65535 47056 47056 47056 1413 1670 1799 21838 21794 21532 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 22881 22881 22881 24991 24991 24991
++65535 65535 65535 59538 59538 59538 3857 3857 3857 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 22881 22881 22881
++58889 58889 58889 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 17553 17553 17553 16762 16762 16762
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++3855 2930 1607 40410 29471 12985 41427 30069 13197 41427 30069 13197 41427 30069 13197
++41427 30069 13197 41427 30069 13197 41427 30069 13197 41427 30069 13197 41427 30069 13197
++41427 30069 13197 41427 30069 13197 41427 30069 13197 41427 30069 13197 41427 30069 13197
++41427 30069 13197 41427 30069 13197 41427 30069 13197 40410 29471 12985 12071 8729 3764
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 7209 5285 2184
++62859 46189 20912 48573 52299 53199 47031 52942 56540 63483 46207 20056 8373 6077 2600
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 18517 18517 18517 0 0 0 47697 47615 47488 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 61309 61309 61309 30583 30843 31357 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 20778 20778 20542 64507 64507 64507 65535 65535 65535 8455 8455 8455
++16762 16762 16762 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 17553 17553 17553 8455 8455 8455
++4480 4480 4480 52685 52685 52685 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 58889 58889 58889 14506 14506 14506 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++43356 43080 42463 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++43356 43080 42463 6427 6427 6427 63607 63607 63607 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 55126 55126 55126
++0 0 0 1799 1799 1799 56283 56283 56283 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 43356 43080 42463 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 35502 34869 34383 5911 5911 5911 16762 16762 16762
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 21292 21292 21292 26342 26738 26738
++65535 65535 65535 65535 65535 65535 28239 28239 28239 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++15440 15440 15440 55126 55126 55126 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 20263 20263 20263 16136 16136 16136
++514 514 514 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63736 46260 19789 54209 48830 40477 50976 48701 42982 56411 51914 44332
++50976 48701 42982 56411 51914 44332 50976 48701 42982 56411 51914 44332 50976 48701 42982
++56411 51914 44332 50976 48701 42982 56411 51914 44332 50976 48701 42982 56411 51914 44332
++50976 48701 42982 56411 51914 44332 50976 48701 42982 62859 46189 20912 19371 14059 6014
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 7209 5285 2184
++63736 46260 19789 42919 54484 65535 42919 54484 65535 63236 45897 19634 9123 6640 2832
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 18517 18517 18517 0 0 0 44589 44631 44888 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++55531 55531 55531 18336 18336 18336 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++257 257 257 50115 50774 49729 65535 65535 65535 65278 65278 65278 9814 9814 9814
++16762 16762 16762 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 13752 13752 13752 11370 11370 11370 1413 1670 1799
++48486 48538 48538 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++61680 61680 61680 21838 21794 21532 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++40984 40984 40984 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++48486 48538 48538 7197 7197 7197 62065 62065 62065 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 55126 55126 55126
++257 257 257 7197 7197 7197 57470 57470 57470 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 3079 3079 3079 51400 51400 51400 65535 65535 65535
++65535 65535 65535 65535 65535 65535 62065 62065 62065 18995 18995 18995 14506 14506 14506
++8455 8455 8455 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 2701 2701 2701 16762 16762 16762 30840 30197 30069
++65535 65535 65535 65535 65535 65535 53256 53199 52942 1413 1670 1799 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 21292 21292 21292 63607 63607 63607 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 21838 21794 21532 12931 12931 12931
++3079 3079 3079 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63483 46207 20056 43304 54355 65021 42919 54484 65535 42533 53970 64764
++42919 54484 65535 42533 53970 64764 42919 54484 65535 42533 53970 64764 42919 54484 65535
++42533 53970 64764 42919 54484 65535 42533 53970 64764 42919 54484 65535 42533 53970 64764
++42919 54484 65535 42533 53970 64764 42919 54484 65535 58276 44060 22272 19371 14059 6014
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 7209 5285 2184
++63736 46260 19789 43304 54355 65021 42919 54484 65535 63483 46207 20056 8373 6077 2600
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 18517 18517 18517 0 0 0 40984 40984 40984 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++47697 47615 47488 4480 4480 4480 257 257 257 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++28239 28239 28239 65535 65535 65535 65535 65535 65535 65535 65535 65535 15440 15440 15440
++15440 15440 15440 1413 1670 1799 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 10459 10459 10459 15440 15440 15440 385 385 334 43356 43080 42463
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 64124 64124 64124
++30840 30197 30069 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++35838 35838 35838 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++63222 63222 63222 24991 24991 24991 38406 38021 37650 65021 65021 65021 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 45746 46260 46746
++128 128 128 30840 30197 30069 44589 44631 44888 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 12931 12931 12931 58889 58889 58889
++65535 65535 65535 65535 65535 65535 65535 65535 65535 55126 55126 55126 6810 6810 6810
++21838 21794 21532 1413 1670 1799 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 10459 10459 10459 8455 8455 8455 38406 38021 37650
++65535 65535 65535 65535 65535 65535 65535 65535 65535 31875 31875 31875 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++18995 18995 18995 57470 57470 57470 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 18995 18995 18995 15440 15440 15440
++1028 1285 1542 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63486 46079 19711 43304 54355 65021 42919 54484 65535 56972 46962 30007
++61985 45298 20071 61113 45548 20995 61113 45548 20995 61113 45548 20995 61113 45548 20995
++61113 45548 20995 61113 45548 20995 61113 45548 20995 61113 45548 20995 61113 45548 20995
++61113 45548 20995 61113 45548 20995 61113 45548 20995 63483 46207 20056 19371 14059 6014
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 7209 5285 2184
++63486 46079 19711 43304 54355 65021 42919 54484 65535 63093 45874 19660 9123 6640 2832
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 18336 18336 18336 128 128 128 38406 38021 37650 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 53256 53199 52942 12931 12931 12931 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 3079 3079 3079
++55531 55531 55531 65535 65535 65535 65535 65535 65535 65535 65535 65535 28239 28239 28239
++5911 5911 5911 11370 11370 11370 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++7197 7197 7197 18995 18995 18995 385 385 334 35838 35838 35838 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 35838 35838 35838
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 1028 1028 1028 13752 13752 13752 7197 7197 7197
++31875 31875 31875 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 60933 60933 60933 38978 38978 38978 39900 39413 38599 64507 64507 64507
++65535 65535 65535 65535 65535 65535 65535 65535 65535 61680 61680 61680 14506 14506 14506
++6810 6810 6810 55531 55531 55531 17553 17553 17553 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 26055 26184 25186
++64124 64124 64124 65535 65535 65535 65535 65535 65535 65535 65535 65535 46260 45809 45103
++1413 1670 1799 22881 22881 22881 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 17553 17553 17553 642 642 899 47697 47615 47488
++65535 65535 65535 65535 65535 65535 65278 65278 65278 55126 54741 54484 1028 1285 1542
++0 0 0 0 0 0 0 0 0 128 128 128 24991 24991 24991
++60652 60652 60652 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 15440 15440 15440 16762 16762 16762
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63736 46260 19789 43304 54355 65021 42533 53970 64764 58279 45589 26504
++27882 20284 8738 12071 8729 3764 12071 8729 3764 12071 8729 3764 12071 8729 3764
++12071 8729 3764 12071 8729 3764 12071 8729 3764 12071 8729 3764 12071 8729 3764
++12071 8729 3764 12071 8729 3764 12071 8729 3764 12071 8729 3764 3038 2204 899
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 7209 5285 2184
++63736 46260 19789 43304 54355 65021 42919 54484 65535 63483 46207 20056 8373 6077 2600
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 18336 18336 18336 0 0 0 35838 35838 35838 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 58889 58889 58889 22881 22881 22881 514 514 514
++0 0 0 0 0 0 0 0 0 0 0 0 28239 28239 28239
++65021 65021 65021 65278 65278 65278 65535 65535 65535 65535 65535 65535 35838 35838 35838
++0 0 0 18995 18995 18995 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 4480 4480 4480
++22881 22881 22881 128 128 128 30840 30197 30069 63607 63607 63607 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 43356 43080 42463 1028 1028 1028
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 3857 3857 3857 31875 31875 31875
++42507 42507 42507 50115 51271 50886 58889 58889 58889 65278 65278 65278 35838 35838 35838
++21292 21292 21292 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 40833 41475 42019 51400 51400 51400
++65535 65535 65535 65535 65535 65535 65535 65535 65535 38406 38021 37650 4480 4480 4480
++51400 51400 51400 40984 40984 40984 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++39900 39413 38599 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++38406 38021 37650 5911 5911 5911 18336 18336 18336 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 18995 18995 18995 128 128 128 55531 55531 55531
++65535 65535 65535 65535 65535 65535 55126 55126 55126 21292 21292 21292 128 128 128
++0 0 0 0 0 0 0 0 0 30583 30843 31357 62708 62708 62708
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 11370 11370 11370 16762 16762 16762
++257 257 257 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63486 46079 19711 43304 54355 65021 42919 54484 65535 58276 44060 22272
++19371 14059 6014 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 4874 3558 1459 15792 11440 4871
++17750 12880 5633 8373 6077 2600 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++8095 5986 2531 17750 12880 5633 15792 11440 4871 10498 7619 3259 2402 1799 684
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 2402 1799 684
++10498 7619 3259 19371 14059 6014 13872 10127 4336 9123 6640 2832 0 0 0
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 3855 2930 1607 13872 10127 4336 19371 14059 6014
++13872 10127 4336 8373 6077 2600 0 0 0 0 0 0 7209 5285 2184
++63486 46079 19711 43304 54355 65021 42919 54484 65535 63093 45874 19660 9123 6640 2832
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 5943 4354 1886 15792 11440 4871
++17750 12880 5633 17750 12880 5633 13872 10127 4336 2402 1799 684 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 3038 2204 899
++12071 8729 3764 19371 14059 6014 13872 10127 4336 5943 4354 1886 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++4874 3558 1459 13872 10127 4336 17750 12880 5633 9123 6640 2832 875 620 271
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 16136 16136 16136 2701 2701 2701 31875 31875 31875 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 62708 62708 62708 35502 34869 34383
++0 0 0 0 0 0 0 0 0 128 128 128 128 128 128
++26055 26184 25186 56026 55897 55897 65535 65535 65535 65535 65535 65535 45746 46260 46746
++0 0 0 22881 22881 22881 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 1799 1927 2184 26055 26184 25186
++0 0 0 22359 22625 23010 61309 61309 61309 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 49304 49177 49053 1799 1927 2184 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++257 257 257 8455 8455 8455 38406 38021 37650 57470 57470 57470 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 49304 49177 49053
++1028 1028 1028 56026 55897 55897 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65278 65278 65278 62708 62708 62708 60933 60933 60933
++65535 65535 65535 65278 65278 65278 49304 49177 49053 5911 5911 5911 49304 49177 49053
++49304 49177 49053 9814 9814 9814 4480 4480 4480 1799 1799 1799 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1413 1670 1799 50115 50774 49729 65535 65535 65535 65535 65535 65535 65535 65535 65535
++63222 63222 63222 28239 28239 28239 12931 12931 12931 12931 12931 12931 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 257 257 257 19317 19131 18746 13752 13752 13752 64764 64764 64764
++65278 65278 65278 44589 44631 44888 5911 5911 5911 0 0 0 0 0 0
++0 0 0 0 0 0 875 620 271 44589 44631 44888 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 64507 64507 64507 6810 6810 6810 17553 17553 17553
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63736 46260 19789 43304 54355 65021 42919 54484 65535 58279 45589 26504
++19371 14059 6014 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 4874 3558 1459 62340 45076 19410 62737 45569 19692 61985 45298 20071
++61861 44933 19292 2402 1799 684 40410 29471 12985 62856 45897 20023 61241 45992 22579
++58276 44060 22272 59002 43055 18866 0 0 0 0 0 0 0 0 0
++0 0 0 1413 1028 514 23177 16932 7265 51150 38050 17516 61985 45298 20071
++62986 45716 19556 58279 45589 26504 58276 44060 22272 62859 46189 20912 62465 45547 19595
++42654 31649 16191 12071 8729 3764 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 5943 4354 1886 34164 24785 10813 57142 41714 18588 63483 46207 20056
++61985 45298 20071 58279 45589 26504 61241 45992 22579 62856 45897 20023 59002 43055 18866
++34164 24785 10813 3855 2930 1607 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++8095 5986 2531 45225 33169 15226 62856 45897 20023 61113 45548 20995 57302 45835 26989
++61241 45992 22579 62856 45897 20023 55635 40828 18345 27882 20284 8738 7209 5285 2184
++63736 46260 19789 43304 54355 65021 42919 54484 65535 63483 46207 20056 8373 6077 2600
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++1413 1028 514 28744 20827 9121 55635 40828 18345 62859 46189 20912 60373 44510 19999
++59969 46214 26008 58276 44060 22272 61113 45548 20995 62737 45569 19692 51150 38050 17516
++19371 14059 6014 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 36240 26320 11215 62486 45353 19401 62986 45716 19556
++62486 45353 19401 30042 21792 9253 5943 4354 1886 40410 29471 12985 62737 45569 19692
++62340 45076 19410 60487 44116 19189 61451 44536 19168 63486 46079 19455 46996 34589 15727
++12071 8729 3764 0 0 0 128 128 128 13872 10127 4336 48838 36002 16378
++63736 46260 19789 61861 44933 19292 60487 44116 19189 62737 45569 19692 62986 45716 19556
++37303 27193 11910 2402 1799 684 0 0 0 0 0 0 0 0 0
++
++0 0 0 8455 8455 8455 9814 9814 9814 28239 28239 28239 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 64124 64124 64124 33681 33681 33681
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 6427 6427 6427 43356 43080 42463 65535 65535 65535 60933 60933 60933
++6427 6427 6427 17553 17553 17553 4480 4480 4480 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 514 514 514 28239 28239 28239 514 514 514
++15440 15440 15440 58889 58889 58889 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 53256 53199 52942 6427 6427 6427 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 3857 3857 3857 16762 16762 16762 21838 21794 21532 12931 12931 12931
++4480 4480 4480 642 642 899 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 514 514 514 21838 21794 21532
++44589 44631 44888 61309 61309 61309 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 61680 61680 61680
++7197 7197 7197 40833 41475 42019 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++63607 63607 63607 38978 38978 38978 8455 8455 8455 49304 49177 49053 65278 65278 65278
++65535 65535 65535 64764 64764 64764 62065 62065 62065 59538 59538 59538 57470 57470 57470
++55126 55126 55126 52685 52685 52685 22881 22881 22881 514 514 514 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 9814 9814 9814 57470 57470 57470 65535 65535 65535 65535 65535 65535
++65535 65535 65535 60933 60933 60933 18995 18995 18995 18995 18995 18995 5911 5911 5911
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 5911 5911 5911 13752 13752 13752 38406 38021 37650 65278 65278 65278
++65535 65535 65535 18995 18995 18995 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 1413 1670 1799 45746 46260 46746
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 62065 62065 62065 3857 3857 3857 17553 17553 17553
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63486 46079 19711 43304 54355 65021 42919 54484 65535 58276 44060 22272
++19371 14059 6014 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 2402 1799 684 63486 46079 19711 48573 52299 53199 47031 52942 56540
++63486 46079 19455 45225 33169 15226 57302 45835 26989 45746 53327 59238 42919 54484 65535
++47031 52942 56540 59002 43055 18866 257 257 257 0 0 0 0 0 0
++7209 5285 2184 51150 38050 17516 61241 45992 22579 50629 49986 46941 47031 52942 56540
++43304 54355 65021 43304 54355 65021 42919 54484 65535 42919 54484 65535 47031 52942 56540
++54209 48830 40477 61985 45298 20071 30933 22555 9803 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++17750 12880 5633 60373 44510 19999 56972 46962 30007 48573 52299 53199 45746 53327 59238
++42919 54484 65535 42533 53970 64764 42919 54484 65535 43304 54355 65021 48573 52299 53199
++56972 46962 30007 59002 43055 18866 15792 11440 4871 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 15792 11440 4871
++61985 45298 20071 56278 47802 34950 45746 53327 59238 42919 54484 65535 42533 53970 64764
++42919 54484 65535 43818 54098 63479 50115 50774 49729 61241 45992 22579 46996 34589 15727
++63864 46774 20174 43304 54355 65021 42919 54484 65535 63093 45874 19660 9123 6640 2832
++0 0 0 0 0 0 0 0 0 0 0 0 9123 6640 2832
++57142 41714 18588 58279 45589 26504 50115 50774 49729 44846 53841 61423 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 45746 53327 59238 50976 48701 42982
++61241 45992 22579 45225 33169 15226 1413 1028 514 128 128 128 0 0 0
++0 0 0 0 0 0 34164 24785 10813 63236 45897 19634 63736 46260 19789
++62986 45716 19556 41427 30069 13197 55635 40828 18345 62340 45076 19410 63486 46079 19455
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63112 45588 19556
++60487 44116 19189 10498 7619 3259 23177 16932 7265 62486 45353 19401 63236 45897 19634
++63486 46079 19455 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++61451 44536 19168 55635 40828 18345 2402 1799 684 0 0 0 0 0 0
++
++128 128 128 1028 1285 1542 17553 17553 17553 22881 22881 22881 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 63607 63607 63607 31875 31875 31875 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 24991 24991 24991 65535 65535 65535 65535 65535 65535
++31875 31875 31875 0 0 0 26342 26738 26738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 0 0 0 28239 28239 28239 1799 1927 2184 9814 9814 9814
++55126 55126 55126 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++57470 57470 57470 12931 12931 12931 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 385 385 334 17965 17965 17965 35502 34869 34383 48486 48538 48538
++56026 55897 55897 62065 62065 62065 65535 65535 65535 65535 65535 65535 65535 65535 65535
++62065 62065 62065 57470 57470 57470 48486 48538 48538 40984 40984 40984 33681 33681 33681
++38406 38021 37650 44589 44631 44888 50115 51271 50886 57470 57470 57470 65021 65021 65021
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++31875 31875 31875 6427 6427 6427 52685 52685 52685 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 59538 59538 59538
++26055 26184 25186 16136 16136 16136 55126 54741 54484 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 40984 40984 40984 0 0 0 0 0 0
++0 0 0 1799 1799 1799 22359 22625 23010 6810 6810 6810 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 20778 20778 20542 61309 61309 61309 65535 65535 65535
++65535 65535 65535 65535 65535 65535 57470 57470 57470 11370 11370 11370 22881 22881 22881
++1028 1285 1542 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 19317 19131 18746 1413 1670 1799 56283 56283 56283 65535 65535 65535
++65535 65535 65535 26342 26738 26738 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 1799 1799 1799
++47697 47615 47488 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 60266 60266 60266 385 385 334 18336 18336 18336
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63736 46260 19789 43304 54355 65021 42919 54484 65535 58279 45589 26504
++19371 14059 6014 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 63736 46260 19789 44846 53841 61423 43818 54098 63479
++63483 46207 20056 61985 45298 20071 44846 53841 61423 47031 52942 56540 50629 49986 46941
++54209 48830 40477 59002 43055 18866 0 0 0 0 0 0 3038 2204 899
++55635 40828 18345 54760 46836 33773 43304 54355 65021 43818 54098 63479 54209 48830 40477
++59969 46214 26008 62986 45716 19556 61241 45992 22579 57302 45835 26989 50115 51271 50886
++42919 54484 65535 47031 52942 56540 61241 45992 22579 30042 21792 9253 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 15792 11440 4871
++62859 46189 20912 50629 49986 46941 42919 54484 65535 47031 52942 56540 54760 46836 33773
++61241 45992 22579 63486 46079 19455 59969 46214 26008 56972 46962 30007 45746 53327 59238
++42919 54484 65535 50629 49986 46941 60373 44510 19999 12071 8729 3764 0 0 0
++0 0 0 0 0 0 128 128 128 4874 3558 1459 60487 44116 19189
++50629 49986 46941 42919 54484 65535 43818 54098 63479 56278 47802 34950 58276 44060 22272
++63864 46774 20174 58276 44060 22272 56972 46962 30007 47031 52942 56540 61241 45992 22579
++63486 46079 19455 43304 54355 65021 42919 54484 65535 63483 46207 20056 8373 6077 2600
++0 0 0 0 0 0 257 257 257 5943 4354 1886 60373 44510 19999
++54209 48830 40477 43304 54355 65021 43818 54098 63479 54209 48830 40477 58279 45589 26504
++62856 45897 20023 61113 45548 20995 57302 45835 26989 50629 49986 46941 42919 54484 65535
++43818 54098 63479 57302 45835 26989 46996 34589 15727 0 0 0 0 0 0
++0 0 0 875 620 271 30933 22555 9803 62486 45353 19401 63736 46260 19789
++63736 46260 19789 63736 46260 19789 62486 45353 19401 63736 46260 19789 61451 44536 19168
++61861 44933 19292 60487 44116 19189 62986 45716 19556 63736 46260 19789 63736 46260 19789
++62986 45716 19556 53070 38550 16467 62486 45353 19401 63736 46260 19789 63112 45588 19556
++60487 44116 19189 61861 44933 19292 60487 44116 19189 63736 46260 19789 63736 46260 19789
++63736 46260 19789 61451 44536 19168 27882 20284 8738 0 0 0 0 0 0
++
++0 0 0 0 0 0 18711 18711 18711 15440 15440 15440 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 63222 63222 63222 30840 30197 30069 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 30840 30197 30069 65021 65021 65021 65535 65535 65535
++57069 56684 56283 6810 6810 6810 9814 9814 9814 12931 12931 12931 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++257 257 257 26342 26738 26738 3079 3079 3079 5911 5911 5911 51400 51400 51400
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 58889 58889 58889
++17553 17553 17553 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 4480 4480 4480 28239 28239 28239
++40833 41475 42019 56026 55897 55897 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 65535 65535 65535 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++58889 58889 58889 11370 11370 11370 9814 9814 9814 55126 54741 54484 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 56283 56283 56283 15440 15440 15440
++22359 22625 23010 59538 59538 59538 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 53256 53199 52942 128 128 128 0 0 0
++21292 21292 21292 55126 54741 54484 65535 65535 65535 61680 61680 61680 52685 52685 52685
++42507 42507 42507 30840 30197 30069 6427 6427 6427 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 26342 26738 26738 63607 63607 63607
++65535 65535 65535 65535 65535 65535 65535 65535 65535 53256 53199 52942 6427 6427 6427
++22881 22881 22881 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++4480 4480 4480 20778 20778 20542 24991 24991 24991 65535 65535 65535 65535 65535 65535
++65535 65535 65535 31875 31875 31875 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++3079 3079 3079 49304 49177 49053 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 56026 55897 55897 0 0 0 18517 18517 18517
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63486 46079 19711 43304 54355 65021 42919 54484 65535 58276 44060 22272
++19371 14059 6014 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 62737 45569 19692 45746 53327 59238 43304 54355 65021
++63736 46260 19789 56278 47802 34950 57302 45835 26989 61985 45298 20071 48838 36002 16378
++46996 34589 15727 48838 36002 16378 128 128 128 0 0 0 40410 29471 12985
++56972 46962 30007 43304 54355 65021 44846 53841 61423 61241 45992 22579 51150 38050 17516
++19371 14059 6014 8373 6077 2600 13872 10127 4336 27882 20284 8738 60373 44510 19999
++56278 47802 34950 42919 54484 65535 47031 52942 56540 61985 45298 20071 9123 6640 2832
++128 128 128 0 0 0 0 0 0 2402 1799 684 59002 43055 18866
++50629 49986 46941 43304 54355 65021 50115 51271 50886 62856 45897 20023 37303 27193 11910
++15792 11440 4871 8095 5986 2531 17750 12880 5633 37303 27193 11910 62859 46189 20912
++50115 50774 49729 42919 54484 65535 54209 48830 40477 53705 39676 18339 0 0 0
++128 128 128 0 0 0 0 0 0 37303 27193 11910 54760 46836 33773
++43304 54355 65021 44846 53841 61423 59969 46214 26008 46996 34589 15727 19371 14059 6014
++10498 7619 3259 19371 14059 6014 37303 27193 11910 61985 45298 20071 54209 48830 40477
++63864 46774 20174 43818 54098 63479 42919 54484 65535 63093 45874 19660 9123 6640 2832
++0 0 0 0 0 0 0 0 0 46996 34589 15727 56278 47802 34950
++42919 54484 65535 45746 53327 59238 59969 46214 26008 48838 36002 16378 20895 15087 6460
++9123 6640 2832 13872 10127 4336 25195 18262 7789 59002 43055 18866 54760 46836 33773
++43818 54098 63479 43818 54098 63479 61241 45992 22579 23177 16932 7265 128 128 128
++0 0 0 0 0 0 30933 22555 9803 62340 45076 19410 63486 46335 19711
++63736 46260 19789 62486 45353 19401 62340 45076 19410 55635 40828 18345 27882 20284 8738
++15792 11440 4871 23177 16932 7265 55635 40828 18345 61861 44933 19292 63736 46260 19789
++63736 46260 19789 63486 46079 19711 63236 45897 19634 61861 44933 19292 46996 34589 15727
++25195 18262 7789 15792 11440 4871 27882 20284 8738 61451 44536 19168 63486 46079 19711
++63736 46260 19789 63736 46260 19789 57142 41714 18588 128 128 128 0 0 0
++
++0 0 0 0 0 0 18995 18995 18995 3857 3857 3857 62708 62708 62708
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++62065 62065 62065 28239 28239 28239 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 35502 34869 34383 65535 65535 65535 65535 65535 65535
++65535 65535 65535 43356 43080 42463 0 0 0 22359 22625 23010 2701 2701 2701
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 385 385 334
++26342 26738 26738 2701 2701 2701 5911 5911 5911 50115 50774 49729 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 59538 59538 59538 18995 18995 18995
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 6810 6810 6810 21838 21794 21532 26342 26738 26738
++30583 30843 31357 35838 35838 35838 48486 48538 48538 61680 61680 61680 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 63607 63607 63607 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 55531 55531 55531 16762 16762 16762 4480 4480 4480 38978 38978 38978
++62065 62065 62065 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 26055 26184 25186 17553 17553 17553
++59538 59538 59538 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 62708 62708 62708 5911 5911 5911 7197 7197 7197
++57470 57470 57470 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 61680 61680 61680 47697 47615 47488 30840 30197 30069
++1028 1028 1028 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 33681 33681 33681
++65021 65021 65021 65535 65535 65535 65535 65535 65535 65278 65278 65278 48486 48538 48538
++8455 8455 8455 20778 20778 20542 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++28239 28239 28239 1413 1670 1799 51400 51400 51400 65535 65535 65535 65535 65535 65535
++65535 65535 65535 35838 35838 35838 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++9814 9814 9814 35838 35838 35838 62708 62708 62708 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 48486 48538 48538 0 0 0 18711 18711 18711
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63736 46260 19789 43304 54355 65021 42919 54484 65535 58279 45589 26504
++19371 14059 6014 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 62737 45569 19692 45746 53327 59238 42919 54484 65535
++62859 46189 20912 61241 45992 22579 48838 36002 16378 2402 1799 684 128 128 128
++128 128 128 0 0 0 0 0 0 7209 5285 2184 61985 45298 20071
++45746 53327 59238 42919 54484 65535 56972 46962 30007 43194 31354 13386 0 0 0
++0 0 0 128 128 128 128 128 128 0 0 0 5943 4354 1886
++60373 44510 19999 50115 51271 50886 43304 54355 65021 54209 48830 40477 43194 31354 13386
++0 0 0 0 0 0 0 0 0 27882 20284 8738 58279 45589 26504
++42919 54484 65535 45746 53327 59238 61113 45548 20995 20895 15087 6460 128 128 128
++0 0 0 0 0 0 0 0 0 257 257 257 22224 16071 6824
++61113 45548 20995 43818 54098 63479 42533 53970 64764 61241 45992 22579 19371 14059 6014
++0 0 0 128 128 128 1772 1533 1155 62465 45547 19595 47031 52942 56540
++43304 54355 65021 54209 48830 40477 46996 34589 15727 875 620 271 0 0 0
++128 128 128 0 0 0 385 385 334 23177 16932 7265 61113 45548 20995
++43818 54098 63479 42919 54484 65535 42919 54484 65535 63483 46207 20056 8373 6077 2600
++0 0 0 0 0 0 12071 8729 3764 62859 46189 20912 44846 53841 61423
++42919 54484 65535 56972 46962 30007 40410 29471 12985 875 620 271 0 0 0
++0 0 0 0 0 0 0 0 0 4874 3558 1459 57142 41714 18588
++50115 50774 49729 42919 54484 65535 50629 49986 46941 53705 39676 18339 0 0 0
++0 0 0 0 0 0 30933 22555 9803 61861 44933 19292 63736 46260 19789
++63486 46079 19711 63864 46774 20174 54363 39457 16879 4874 3558 1459 0 0 0
++128 128 128 0 0 0 9123 6640 2832 62986 45716 19556 63736 46260 19789
++63736 46260 19789 63736 46260 19789 61861 44933 19292 40410 29471 12985 128 128 128
++0 0 0 128 128 128 0 0 0 23177 16932 7265 61451 44536 19168
++63736 46260 19789 63736 46260 19789 63736 46260 19789 3038 2204 899 0 0 0
++
++0 0 0 0 0 0 18711 18711 18711 128 128 128 56026 55897 55897
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++49304 49177 49053 13752 13752 13752 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 38978 38978 38978 65535 65535 65535 65535 65535 65535
++65535 65535 65535 64507 64507 64507 24991 24991 24991 128 128 128 22359 22625 23010
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 257 257 257 26342 26738 26738
++2313 2313 2313 5911 5911 5911 50115 50774 49729 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 59538 59538 59538 20263 20263 20263 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 11370 11370 11370 40984 40984 40984
++49304 49177 49053 57069 56684 56283 63607 63607 63607 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65021 65021 65021 48486 48538 48538 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 60266 60266 60266 35838 35838 35838 5911 5911 5911
++14506 14506 14506 39900 39413 38599 56283 56283 56283 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 61680 61680 61680 2701 2701 2701 49621 49621 49607
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 21838 21794 21532 12931 12931 12931
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++52119 52119 51914 24991 24991 24991 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++40984 40984 40984 65021 65021 65021 65535 65535 65535 65535 65535 65535 65535 65535 65535
++43356 43080 42463 5911 5911 5911 22881 22881 22881 1413 1670 1799 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 18995 18995 18995
++8455 8455 8455 35838 35838 35838 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 40984 40984 40984 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 10459 10459 10459 33681 33681 33681 48486 48538 48538
++62065 62065 62065 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 40984 40984 40984 0 0 0 18711 18711 18711
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63486 46079 19711 43304 54355 65021 42919 54484 65535 58276 44060 22272
++19371 14059 6014 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 62465 45547 19595 45746 53327 59238 43304 54355 65021
++45746 53327 59238 62465 45547 19595 3855 2930 1607 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 30933 22555 9803 56972 46962 30007
++42919 54484 65535 48573 52299 53199 60373 44510 19999 3855 2930 1607 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++25195 18262 7789 59969 46214 26008 42533 53970 64764 47031 52942 56540 61451 44536 19168
++1772 1533 1155 0 0 0 0 0 0 55635 40828 18345 50115 50774 49729
++43304 54355 65021 54209 48830 40477 41427 30069 13197 385 385 334 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++48838 36002 16378 54209 48830 40477 42919 54484 65535 54209 48830 40477 43194 31354 13386
++257 257 257 0 0 0 19371 14059 6014 58276 44060 22272 42919 54484 65535
++43304 54355 65021 61113 45548 20995 17750 12880 5633 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 257 257 257 55635 40828 18345
++50115 50774 49729 43304 54355 65021 42919 54484 65535 63093 45874 19660 9123 6640 2832
++0 0 0 0 0 0 34164 24785 10813 56278 47802 34950 42919 54484 65535
++47031 52942 56540 61113 45548 20995 5943 4354 1886 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 27882 20284 8738
++58279 45589 26504 42919 54484 65535 43818 54098 63479 62859 46189 20912 10498 7619 3259
++257 257 257 0 0 0 30933 22555 9803 61861 44933 19292 63736 46260 19789
++63736 46260 19789 61861 44933 19292 22224 16071 6824 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 55635 40828 18345 63486 46079 19455
++63736 46260 19789 63736 46260 19789 62737 45569 19692 5943 4354 1886 128 128 128
++0 0 0 0 0 0 0 0 0 2402 1799 684 63736 46260 19789
++63736 46260 19789 63736 46260 19789 62340 45076 19410 10498 7619 3259 0 0 0
++
++0 0 0 0 0 0 18711 18711 18711 0 0 0 49304 49177 49053
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 63607 63607 63607 52685 52685 52685 38978 38978 38978 22881 22881 22881
++1799 1927 2184 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 257 257 257 44589 44631 44888 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 56026 55897 55897 5911 5911 5911 5911 5911 5911
++22359 22625 23010 1028 1028 1028 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 3857 3857 3857 26342 26738 26738 1799 1799 1799
++5911 5911 5911 50115 51271 50886 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 60652 60652 60652 21838 21794 21532 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 12931 12931 12931 42507 42507 42507 61309 61309 61309 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 40984 40984 40984 26342 26738 26738 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65278 65278 65278 65535 65535 65535 58889 58889 58889
++38978 38978 38978 8455 8455 8455 1413 1670 1799 24991 24991 24991 43356 43080 42463
++60266 60266 60266 65535 65535 65535 62065 62065 62065 5911 5911 5911 46260 45809 45103
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 31875 31875 31875 5911 5911 5911
++62065 62065 62065 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 64764 64764 64764 46260 45809 45103 3857 3857 3857 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++642 642 899 43356 43080 42463 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 45746 46260 46746 5911 5911 5911 22881 22881 22881 4480 4480 4480
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 16762 16762 16762 19317 19131 18746
++16762 16762 16762 62065 62065 62065 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 46260 45809 45103 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 44589 44631 44888 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 31875 31875 31875 1028 1028 1028 18995 18995 18995
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63736 46260 19789 43304 54355 65021 42919 54484 65535 58279 45589 26504
++60373 44510 19999 60373 44510 19999 59002 43055 18866 60373 44510 19999 59002 43055 18866
++60373 44510 19999 59002 43055 18866 60373 44510 19999 59002 43055 18866 60373 44510 19999
++59002 43055 18866 60373 44510 19999 59002 43055 18866 51150 38050 17516 0 0 0
++0 0 0 128 128 128 62737 45569 19692 45746 53327 59238 42919 54484 65535
++54209 48830 40477 45225 33169 15226 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 51150 38050 17516 50629 49986 46941
++42919 54484 65535 50976 48701 42982 42654 31649 16191 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++5943 4354 1886 63486 46079 19711 44846 53841 61423 42919 54484 65535 61113 45548 20995
++13872 10127 4336 0 0 0 4874 3558 1459 63486 46079 19711 44846 53841 61423
++42533 53970 64764 58279 45589 26504 20895 15087 6460 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 875 620 271
++25195 18262 7789 56972 46962 30007 42919 54484 65535 48573 52299 53199 57142 41714 18588
++0 0 0 128 128 128 30933 22555 9803 56278 47802 34950 42919 54484 65535
++48573 52299 53199 60373 44510 19999 385 385 334 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 28744 20827 9121
++56972 46962 30007 42919 54484 65535 42919 54484 65535 63483 46207 20056 8373 6077 2600
++0 0 0 128 128 128 51150 38050 17516 50115 50774 49729 42919 54484 65535
++54209 48830 40477 43194 31354 13386 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 3855 2930 1607
++63483 46207 20056 45746 53327 59238 42919 54484 65535 57302 45835 26989 25195 18262 7789
++0 0 0 0 0 0 30933 22555 9803 61861 44933 19292 63736 46260 19789
++63736 46260 19789 62986 45716 19556 875 620 271 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 50159 36373 15650 63736 46260 19789
++63736 46260 19789 63736 46260 19789 51340 37280 15909 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 62340 45076 19410
++63736 46260 19789 63736 46260 19789 60487 44116 19189 17750 12880 5633 0 0 0
++
++0 0 0 0 0 0 18995 18995 18995 0 0 0 42507 42507 42507
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++48486 48538 48538 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 50115 50774 49729 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 48486 48538 48538 6427 6427 6427
++1772 1533 1155 22359 22625 23010 3857 3857 3857 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 15440 15440 15440 21292 21292 21292 257 257 257 5911 5911 5911
++50115 50774 49729 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++56026 55897 55897 17965 17965 17965 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 14506 14506 14506
++43356 43080 42463 62708 62708 62708 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++58889 58889 58889 31875 31875 31875 0 0 0 26342 26738 26738 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 60652 60652 60652 46260 45809 45103 30840 30197 30069 3857 3857 3857
++4480 4480 4480 35838 35838 35838 61309 61309 61309 38406 38021 37650 11370 11370 11370
++51400 51400 51400 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 50115 50774 49729 0 0 0
++42507 42507 42507 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 52119 52119 51914 12931 12931 12931
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 1028 1028 1028 40833 41475 42019 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 48486 48538 48538 8455 8455 8455 15440 15440 15440
++19317 19131 18746 4615 5268 6322 0 0 0 0 0 0 0 0 0
++0 0 0 1028 1285 1542 21838 21794 21532 8455 8455 8455 11370 11370 11370
++52685 52685 52685 65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535
++59538 59538 59538 40984 40984 40984 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 4480 4480 4480 55126 55126 55126 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 22881 22881 22881 12931 12931 12931 7197 7197 7197
++257 257 257 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63486 46079 19711 43304 54355 65021 42919 54484 65535 47031 52942 56540
++48573 52299 53199 48573 52299 53199 48573 52299 53199 48573 52299 53199 48573 52299 53199
++48573 52299 53199 48573 52299 53199 48573 52299 53199 48573 52299 53199 48573 52299 53199
++48573 52299 53199 48573 52299 53199 50629 49986 46941 57142 41714 18588 128 128 128
++0 0 0 0 0 0 62465 45547 19595 45746 53327 59238 42919 54484 65535
++54760 46836 33773 28744 20827 9121 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 60373 44510 19999 47031 52942 56540
++42919 54484 65535 54760 46836 33773 43194 31354 13386 25195 18262 7789 23177 16932 7265
++25195 18262 7789 23177 16932 7265 25195 18262 7789 23177 16932 7265 25195 18262 7789
++23177 16932 7265 61985 45298 20071 48573 52299 53199 42919 54484 65535 58279 45589 26504
++20895 15087 6460 0 0 0 17750 12880 5633 58276 44060 22272 42919 54484 65535
++43304 54355 65021 63093 45874 19660 30042 21792 9253 23177 16932 7265 25195 18262 7789
++23177 16932 7265 25195 18262 7789 23177 16932 7265 25195 18262 7789 23177 16932 7265
++34164 24785 10813 61985 45298 20071 42919 54484 65535 45746 53327 59238 63483 46207 20056
++385 385 334 0 0 0 43194 31354 13386 50976 48701 42982 43304 54355 65021
++50115 51271 50886 53705 39676 18339 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 19371 14059 6014
++58279 45589 26504 42533 53970 64764 42919 54484 65535 63093 45874 19660 9123 6640 2832
++0 0 0 0 0 0 60373 44510 19999 47031 52942 56540 42919 54484 65535
++56278 47802 34950 34164 24785 10813 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++60373 44510 19999 47031 52942 56540 42919 54484 65535 54209 48830 40477 36240 26320 11215
++0 0 0 0 0 0 30933 22555 9803 61861 44933 19292 63736 46260 19789
++63736 46260 19789 57142 41714 18588 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 45225 33169 15226 63486 46079 19455
++63736 46260 19789 63736 46260 19789 41427 30069 13197 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 59002 43055 18866
++63736 46260 19789 63736 46260 19789 61451 44536 19168 20895 15087 6460 0 0 0
++
++0 0 0 0 0 0 11370 11370 11370 5911 5911 5911 28239 28239 28239
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 57470 57470 57470
++10459 10459 10459 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 385 385 334 53256 53199 52942 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 55126 54741 54484
++13752 13752 13752 0 0 0 18711 18711 18711 18336 18336 18336 2701 2701 2701
++0 0 0 0 0 0 0 0 0 0 0 0 7197 7197 7197
++21838 21794 21532 6427 6427 6427 0 0 0 21838 21794 21532 52685 52685 52685
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 49621 49621 49607
++9814 9814 9814 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 7197 7197 7197 43356 43080 42463 62708 62708 62708
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 64124 64124 64124 38406 38021 37650 22359 22625 23010
++3079 3079 3079 0 0 0 0 0 0 30840 30197 30069 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 49304 49177 49053 49621 49621 49607 65021 65021 65021 65535 65535 65535
++65278 65278 65278 57470 57470 57470 63607 63607 63607 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 60652 60652 60652
++45746 46260 46746 17965 17965 17965 16762 16762 16762 55126 55126 55126 42507 42507 42507
++3857 3857 3857 40833 41475 42019 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65278 65278 65278 65535 65535 65535 22881 22881 22881
++9814 9814 9814 55126 54741 54484 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 55126 55126 55126
++8455 8455 8455 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 38978 38978 38978 64764 64764 64764
++65535 65535 65535 65535 65535 65535 65278 65278 65278 53256 53199 52942 18995 18995 18995
++128 128 128 17553 17553 17553 24991 24991 24991 18517 18517 18517 16136 16136 16136
++17553 17553 17553 20263 20263 20263 1799 1799 1799 30583 30843 31357 59538 59538 59538
++65535 65535 65535 65278 65278 65278 58889 58889 58889 38978 38978 38978 24991 24991 24991
++3079 3079 3079 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 20263 20263 20263 62708 62708 62708
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 63607 63607 63607 6810 6810 6810 20263 20263 20263 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63736 46260 19789 43304 54355 65021 42919 54484 65535 45746 53327 59238
++45746 53327 59238 45746 53327 59238 45746 53327 59238 45746 53327 59238 45746 53327 59238
++45746 53327 59238 45746 53327 59238 45746 53327 59238 45746 53327 59238 45746 53327 59238
++45746 53327 59238 47031 52942 56540 50115 50774 49729 57142 41714 18588 0 0 0
++0 0 0 128 128 128 62737 45569 19692 45746 53327 59238 42919 54484 65535
++57302 45835 26989 23177 16932 7265 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 1413 1028 514 63736 46260 19789 44846 53841 61423
++42919 54484 65535 56278 47802 34950 57302 45835 26989 57302 45835 26989 56972 46962 30007
++57302 45835 26989 56972 46962 30007 57302 45835 26989 56972 46962 30007 57302 45835 26989
++56972 46962 30007 57302 45835 26989 50115 51271 50886 42919 54484 65535 56972 46962 30007
++27882 20284 8738 0 0 0 23177 16932 7265 57302 45835 26989 42919 54484 65535
++45746 53327 59238 56972 46962 30007 57302 45835 26989 56972 46962 30007 57302 45835 26989
++56972 46962 30007 57302 45835 26989 56972 46962 30007 57302 45835 26989 56972 46962 30007
++57302 45835 26989 56972 46962 30007 44846 53841 61423 43818 54098 63479 63736 46260 19789
++5943 4354 1886 128 128 128 48838 36002 16378 50629 49986 46941 42919 54484 65535
++50629 49986 46941 46996 34589 15727 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 13872 10127 4336
++61113 45548 20995 42919 54484 65535 42919 54484 65535 63483 46207 20056 8373 6077 2600
++0 0 0 2402 1799 684 63736 46260 19789 44846 53841 61423 42919 54484 65535
++56972 46962 30007 25195 18262 7789 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 257 257 257
++53705 39676 18339 50115 51271 50886 43304 54355 65021 50976 48701 42982 41427 30069 13197
++0 0 0 0 0 0 30933 22555 9803 61861 44933 19292 63736 46260 19789
++63736 46260 19789 50159 36373 15650 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 45225 33169 15226 63736 46260 19789
++63736 46260 19789 62486 45353 19401 34164 24785 10813 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 59002 43055 18866
++63736 46260 19789 63736 46260 19789 60487 44116 19189 20895 15087 6460 0 0 0
++
++0 0 0 0 0 0 0 0 0 17553 17553 17553 5911 5911 5911
++60652 60652 60652 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 63222 63222 63222 22881 22881 22881
++257 257 257 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 3079 3079 3079 22881 22881 22881 35838 35838 35838
++48486 48538 48538 60266 60266 60266 65535 65535 65535 65535 65535 65535 65278 65278 65278
++57470 57470 57470 22881 22881 22881 257 257 257 1799 1799 1799 20263 20263 20263
++24991 24991 24991 22359 22625 23010 18995 18995 18995 18995 18995 18995 12931 12931 12931
++0 0 0 8455 8455 8455 42507 42507 42507 64124 64124 64124 65535 65535 65535
++65535 65535 65535 65535 65535 65535 63607 63607 63607 42507 42507 42507 2313 2313 2313
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 24991 24991 24991 56283 56283 56283 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 59538 59538 59538 55126 54741 54484
++49621 49621 49607 50115 50774 49729 35838 35838 35838 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 40984 40984 40984 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 46260 45809 45103 257 257 257 20263 20263 20263 38406 38021 37650
++38406 38021 37650 10459 10459 10459 50115 51271 50886 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 63222 63222 63222 38978 38978 38978 18336 18336 18336 60933 60933 60933
++47056 47056 47056 1799 1799 1799 52119 52119 51914 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 63607 63607 63607
++60266 60266 60266 57470 57470 57470 64124 64124 64124 65535 65535 65535 56283 56283 56283
++16136 16136 16136 10459 10459 10459 55126 54741 54484 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++49621 49621 49607 1799 1927 2184 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 33681 33681 33681
++60266 60266 60266 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++49621 49621 49607 26342 26738 26738 1028 1028 1028 0 0 0 257 257 257
++1413 1670 1799 17553 17553 17553 44589 44631 44888 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 40984 40984 40984 0 0 0 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 38406 38021 37650
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 52685 52685 52685 0 0 0 18995 18995 18995 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63486 46079 19711 43304 54355 65021 42919 54484 65535 59969 46214 26008
++62465 45547 19595 62737 45569 19692 62737 45569 19692 62737 45569 19692 62737 45569 19692
++62737 45569 19692 62737 45569 19692 62737 45569 19692 62737 45569 19692 62737 45569 19692
++62737 45569 19692 61985 45298 20071 62856 45897 20023 53705 39676 18339 0 0 0
++0 0 0 0 0 0 62465 45547 19595 45746 53327 59238 43304 54355 65021
++58279 45589 26504 17750 12880 5633 257 257 257 0 0 0 0 0 0
++0 0 0 0 0 0 5943 4354 1886 63486 46079 19711 43818 54098 63479
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764
++42919 54484 65535 42533 53970 64764 42919 54484 65535 42533 53970 64764 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 54209 48830 40477
++34164 24785 10813 128 128 128 25195 18262 7789 56972 46962 30007 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764 42919 54484 65535
++42533 53970 64764 42919 54484 65535 42533 53970 64764 42919 54484 65535 42533 53970 64764
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 61113 45548 20995
++13872 10127 4336 0 0 0 51150 38050 17516 50115 50774 49729 43304 54355 65021
++50976 48701 42982 43194 31354 13386 257 257 257 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 8095 5986 2531
++63483 46207 20056 42919 54484 65535 42919 54484 65535 63093 45874 19660 9123 6640 2832
++0 0 0 5943 4354 1886 63736 46260 19789 43818 54098 63479 42919 54484 65535
++58279 45589 26504 20895 15087 6460 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++48838 36002 16378 50115 50774 49729 43304 54355 65021 50629 49986 46941 45225 33169 15226
++128 128 128 0 0 0 30933 22555 9803 61861 44933 19292 63736 46260 19789
++63736 46260 19789 50159 36373 15650 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 45225 33169 15226 63486 46079 19455
++63736 46260 19789 62486 45353 19401 30933 22555 9803 875 620 271 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 59002 43055 18866
++63736 46260 19789 63736 46260 19789 61451 44536 19168 20895 15087 6460 0 0 0
++
++0 0 0 0 0 0 0 0 0 17965 17965 17965 0 0 0
++47697 47615 47488 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65021 65021 65021 38406 38021 37650 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++0 0 0 18336 18336 18336 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 63222 63222 63222 46260 45809 45103 30583 30843 31357 7197 7197 7197
++0 0 0 0 0 0 385 385 334 9814 9814 9814 22881 22881 22881
++33681 33681 33681 58889 58889 58889 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 51400 51400 51400 21292 21292 21292 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 4480 4480 4480
++40833 41475 42019 64124 64124 64124 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 45746 46260 46746 6810 6810 6810 0 0 0
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 51400 51400 51400 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 61680 61680 61680 15440 15440 15440 0 0 0 0 0 0
++0 0 0 128 128 128 35502 34869 34383 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 64124 64124 64124 22359 22625 23010 44589 44631 44888
++64124 64124 64124 9814 9814 9814 44589 44631 44888 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65021 65021 65021 44589 44631 44888 12931 12931 12931
++2701 2701 2701 128 128 128 28239 28239 28239 64764 64764 64764 65278 65278 65278
++59538 59538 59538 22881 22881 22881 10459 10459 10459 56283 56283 56283 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 42507 42507 42507 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++11370 11370 11370 45746 46260 46746 64764 64764 64764 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 56283 56283 56283 53256 53199 52942 52685 52685 52685
++58889 58889 58889 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 30583 30843 31357 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 2701 2701 2701 16762 16762 16762
++56283 56283 56283 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 33681 33681 33681 0 0 0 20778 20778 20542 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63736 46260 19789 43304 54355 65021 42533 53970 64764 58279 45589 26504
++19371 14059 6014 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 62737 45569 19692 45746 53327 59238 42919 54484 65535
++58276 44060 22272 17750 12880 5633 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 4874 3558 1459 63736 46260 19789 43818 54098 63479
++43304 54355 65021 59969 46214 26008 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19455
++40410 29471 12985 257 257 257 25195 18262 7789 56972 46962 30007 42919 54484 65535
++47031 52942 56540 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++17750 12880 5633 257 257 257 51150 38050 17516 50629 49986 46941 42533 53970 64764
++56411 51914 44332 42654 31649 16191 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 10498 7619 3259
++61113 45548 20995 42919 54484 65535 42919 54484 65535 63483 46207 20056 8373 6077 2600
++0 0 0 5943 4354 1886 63736 46260 19789 43818 54098 63479 43304 54355 65021
++57302 45835 26989 22224 16071 6824 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++51150 38050 17516 50629 49986 46941 43304 54355 65021 50976 48701 42982 42654 31649 16191
++0 0 0 0 0 0 30933 22555 9803 61861 44933 19292 63736 46260 19789
++63236 45897 19634 50159 36373 15650 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 45225 33169 15226 63736 46260 19789
++63736 46260 19789 62340 45076 19410 34164 24785 10813 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 59002 43055 18866
++63736 46260 19789 63736 46260 19789 60487 44116 19189 20895 15087 6460 0 0 0
++
++0 0 0 0 0 0 0 0 0 16762 16762 16762 1028 1285 1542
++31875 31875 31875 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 47697 47615 47488 514 514 514 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 1799 1799 1799 59538 59538 59538 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 62708 62708 62708
++50115 50774 49729 51400 51400 51400 58889 58889 58889 64124 64124 64124 65535 65535 65535
++65535 65535 65535 65278 65278 65278 65535 65535 65535 65535 65535 65535 57069 56684 56283
++30583 30843 31357 1028 1028 1028 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 19317 19131 18746 55126 54741 54484
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 47697 47615 47488 875 620 271 0 0 0 19317 19131 18746
++38978 38978 38978 28239 28239 28239 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 7197 7197 7197 62065 62065 62065 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 61309 61309 61309 44589 44631 44888 14506 14506 14506
++128 128 128 0 0 0 13752 13752 13752 64124 64124 64124 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 30840 30197 30069 44589 44631 44888
++58889 58889 58889 3857 3857 3857 51400 51400 51400 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 40984 40984 40984 0 0 0 0 0 0
++0 0 0 0 0 0 1799 1799 1799 59538 59538 59538 65535 65535 65535
++65535 65535 65535 60652 60652 60652 13752 13752 13752 26342 26738 26738 64507 64507 64507
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 64507 64507 64507 31875 31875 31875 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++257 257 257 128 128 128 26055 26184 25186 52119 52119 51914 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 20263 20263 20263 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 35502 34869 34383 51400 51400 51400 58889 58889 58889 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++63222 63222 63222 10459 10459 10459 12931 12931 12931 7197 7197 7197 257 257 257
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63486 46079 19711 43304 54355 65021 42919 54484 65535 58276 44060 22272
++19371 14059 6014 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 62465 45547 19595 45746 53327 59238 43304 54355 65021
++59969 46214 26008 17750 12880 5633 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 875 620 271 63736 46260 19789 45746 53327 59238
++42919 54484 65535 57302 45835 26989 28744 20827 9121 8095 5986 2531 8095 5986 2531
++8095 5986 2531 8095 5986 2531 8095 5986 2531 8095 5986 2531 8095 5986 2531
++8095 5986 2531 8095 5986 2531 8095 5986 2531 8095 5986 2531 8095 5986 2531
++3855 2930 1607 0 0 0 22224 16071 6824 57302 45835 26989 42919 54484 65535
++44846 53841 61423 63736 46260 19789 10498 7619 3259 8095 5986 2531 8095 5986 2531
++8095 5986 2531 8095 5986 2531 8095 5986 2531 8095 5986 2531 8095 5986 2531
++8095 5986 2531 8095 5986 2531 8095 5986 2531 8095 5986 2531 8095 5986 2531
++2402 1799 684 0 0 0 48838 36002 16378 50629 49986 46941 42919 54484 65535
++50629 49986 46941 48838 36002 16378 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 17750 12880 5633
++58276 44060 22272 42919 54484 65535 42919 54484 65535 63093 45874 19660 9123 6640 2832
++0 0 0 1264 929 361 63736 46260 19789 45746 53327 59238 42919 54484 65535
++56972 46962 30007 27882 20284 8738 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++55635 40828 18345 48573 52299 53199 42919 54484 65535 54209 48830 40477 40410 29471 12985
++0 0 0 0 0 0 30933 22555 9803 61861 44933 19292 63736 46260 19789
++63736 46260 19789 50159 36373 15650 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 45225 33169 15226 63486 46079 19455
++63736 46260 19789 62486 45353 19401 30933 22555 9803 385 385 334 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 59002 43055 18866
++63736 46260 19789 63736 46260 19789 61451 44536 19168 20895 15087 6460 0 0 0
++
++0 0 0 0 0 0 128 128 128 3079 3079 3079 17553 17553 17553
++11370 11370 11370 63607 63607 63607 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 55126 55126 55126 44589 44631 44888 38406 38021 37650
++30840 30197 30069 18995 18995 18995 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 50115 50774 49729 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 61680 61680 61680 38978 38978 38978 5911 5911 5911
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 33681 33681 33681 62065 62065 62065 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++57470 57470 57470 7197 7197 7197 128 128 128 21838 21794 21532 63607 63607 63607
++65535 65535 65535 38406 38021 37650 0 0 0 0 0 0 0 0 0
++0 0 0 257 257 257 35838 35838 35838 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 56026 55897 55897
++26342 26738 26738 26342 26738 26738 12931 12931 12931 51400 51400 51400 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++64124 64124 64124 55126 54741 54484 38978 38978 38978 26055 26184 25186 58889 58889 58889
++26055 26184 25186 20263 20263 20263 64507 64507 64507 65535 65535 65535 65535 65535 65535
++65535 65535 65535 56026 55897 55897 2313 2313 2313 0 0 0 0 0 0
++0 0 0 0 0 0 30840 30197 30069 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65278 65278 65278 48486 48538 48538 875 620 271 44589 44631 44888
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 61680 61680 61680 20778 20778 20542 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 514 514 514 24991 24991 24991
++49621 49621 49607 65021 65021 65021 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 60652 60652 60652 3857 3857 3857 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 20263 20263 20263 64124 64124 64124 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++46260 45809 45103 0 0 0 20263 20263 20263 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63736 46260 19789 43304 54355 65021 42919 54484 65535 58279 45589 26504
++19371 14059 6014 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 62737 45569 19692 45746 53327 59238 42919 54484 65535
++58276 44060 22272 17750 12880 5633 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 59002 43055 18866 47031 52942 56540
++42919 54484 65535 56278 47802 34950 30933 22555 9803 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 0 0 0 13872 10127 4336 61113 45548 20995 42919 54484 65535
++42919 54484 65535 62856 45897 20023 10498 7619 3259 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 42654 31649 16191 54209 48830 40477 42919 54484 65535
++50115 51271 50886 53705 39676 18339 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 22224 16071 6824
++57302 45835 26989 42919 54484 65535 42919 54484 65535 63483 46207 20056 8373 6077 2600
++0 0 0 0 0 0 60373 44510 19999 47031 52942 56540 42919 54484 65535
++54209 48830 40477 36240 26320 11215 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++60373 44510 19999 47031 52942 56540 42919 54484 65535 56278 47802 34950 30933 22555 9803
++0 0 0 0 0 0 30933 22555 9803 61861 44933 19292 63736 46260 19789
++63236 45897 19634 50159 36373 15650 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 45225 33169 15226 63736 46260 19789
++63736 46260 19789 62340 45076 19410 34164 24785 10813 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 59002 43055 18866
++63736 46260 19789 63736 46260 19789 60487 44116 19189 20895 15087 6460 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 18995 18995 18995
++0 0 0 51400 51400 51400 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++65278 65278 65278 40984 40984 40984 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 40984 40984 40984 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++64764 64764 64764 45746 46260 46746 14506 14506 14506 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 28239 28239 28239 63222 63222 63222 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 64507 64507 64507
++28239 28239 28239 0 0 0 2313 2313 2313 52685 52685 52685 65535 65535 65535
++65535 65535 65535 31875 31875 31875 128 128 128 0 0 0 0 0 0
++0 0 0 7197 7197 7197 58889 58889 58889 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 47056 47056 47056 35502 34869 34383 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++52119 52119 51914 16136 16136 16136 514 514 514 20778 20778 20542 22359 22625 23010
++31875 31875 31875 58889 58889 58889 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 35838 35838 35838 128 128 128 0 0 0 0 0 0
++0 0 0 31875 31875 31875 63607 63607 63607 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 30840 30197 30069 14506 14506 14506
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 56026 55897 55897 7197 7197 7197
++257 257 257 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 38978 38978 38978 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 59538 59538 59538 30583 30843 31357 31875 31875 31875 38406 38021 37650
++42507 42507 42507 43356 43080 42463 257 257 257 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 45746 46260 46746 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++22881 22881 22881 1799 1927 2184 17965 17965 17965 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63486 46079 19711 43304 54355 65021 42919 54484 65535 58276 44060 22272
++19371 14059 6014 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 62465 45547 19595 45746 53327 59238 43304 54355 65021
++59969 46214 26008 17750 12880 5633 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 45225 33169 15226 50629 49986 46941
++43304 54355 65021 50976 48701 42982 48838 36002 16378 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 7209 5285 2184 2402 1799 684 0 0 0 0 0 0
++0 0 0 0 0 0 1772 1533 1155 62856 45897 20023 45746 53327 59238
++42919 54484 65535 58279 45589 26504 25195 18262 7789 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8373 6077 2600 257 257 257 0 0 0 0 0 0
++0 0 0 0 0 0 30933 22555 9803 54760 46836 33773 42919 54484 65535
++47031 52942 56540 61985 45298 20071 1772 1533 1155 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 40410 29471 12985
++56278 47802 34950 42919 54484 65535 42919 54484 65535 63093 45874 19660 9123 6640 2832
++0 0 0 0 0 0 48838 36002 16378 50629 49986 46941 43304 54355 65021
++50976 48701 42982 48838 36002 16378 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 8095 5986 2531
++63483 46207 20056 43818 54098 63479 42919 54484 65535 58276 44060 22272 20895 15087 6460
++0 0 0 0 0 0 30933 22555 9803 61861 44933 19292 63736 46260 19789
++63736 46260 19789 50159 36373 15650 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 45225 33169 15226 63486 46079 19455
++63736 46260 19789 62486 45353 19401 30933 22555 9803 385 385 334 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 59002 43055 18866
++63736 46260 19789 63736 46260 19789 61451 44536 19168 20895 15087 6460 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 20263 20263 20263
++128 128 128 33681 33681 33681 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++58889 58889 58889 7197 7197 7197 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 30583 30843 31357 65535 65535 65535 65535 65535 65535
++62708 62708 62708 57470 57470 57470 53256 53199 52942 64124 64124 64124 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 57069 56684 56283
++24991 24991 24991 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++20263 20263 20263 60933 60933 60933 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 49621 49621 49607
++0 0 0 128 128 128 35838 35838 35838 65535 65535 65535 65535 65535 65535
++65535 65535 65535 30583 30843 31357 0 0 0 0 0 0 0 0 0
++257 257 257 39900 39413 38599 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 64124 64124 64124 22881 22881 22881 58889 58889 58889
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 64507 64507 64507 55126 54741 54484 57470 57470 57470 65278 65278 65278
++65535 65535 65535 65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535
++60266 60266 60266 7197 7197 7197 0 0 0 0 0 0 0 0 0
++9814 9814 9814 60266 60266 60266 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65278 65278 65278 48486 48538 48538 2701 2701 2701
++61309 61309 61309 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 45746 46260 46746
++514 514 514 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 0 0 0 42507 42507 42507 65535 65535 65535 65535 65535 65535
++63607 63607 63607 26055 26184 25186 0 0 0 0 0 0 0 0 0
++128 128 128 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 16136 16136 16136 63222 63222 63222 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 51400 51400 51400
++3857 3857 3857 17553 17553 17553 1799 1799 1799 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63736 46260 19789 43304 54355 65021 42919 54484 65535 58279 45589 26504
++19371 14059 6014 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 62737 45569 19692 45746 53327 59238 42919 54484 65535
++58276 44060 22272 17750 12880 5633 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 27882 20284 8738 58279 45589 26504
++42919 54484 65535 44846 53841 61423 61985 45298 20071 9123 6640 2832 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1413 1028 514 55635 40828 18345 61985 45298 20071 46996 34589 15727 27882 20284 8738
++4874 3558 1459 0 0 0 0 0 0 51150 38050 17516 50629 49986 46941
++42919 54484 65535 50629 49986 46941 53705 39676 18339 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++13872 10127 4336 63483 46207 20056 59002 43055 18866 40410 29471 12985 20895 15087 6460
++0 0 0 128 128 128 17750 12880 5633 61241 45992 22579 42919 54484 65535
++42919 54484 65535 61241 45992 22579 20895 15087 6460 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 3855 2930 1607 62465 45547 19595
++47031 52942 56540 42919 54484 65535 42919 54484 65535 63483 46207 20056 8373 6077 2600
++0 0 0 128 128 128 30042 21792 9253 56972 46962 30007 42919 54484 65535
++44846 53841 61423 61985 45298 20071 10498 7619 3259 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 37303 27193 11910
++54760 46836 33773 43304 54355 65021 45746 53327 59238 62859 46189 20912 4874 3558 1459
++0 0 0 0 0 0 30933 22555 9803 61861 44933 19292 63736 46260 19789
++63236 45897 19634 50159 36373 15650 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 45225 33169 15226 63736 46260 19789
++63736 46260 19789 62340 45076 19410 34164 24785 10813 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 59002 43055 18866
++63736 46260 19789 63736 46260 19789 60487 44116 19189 20895 15087 6460 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 4480 4480 4480
++16136 16136 16136 3857 3857 3857 57069 56684 56283 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++33681 33681 33681 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 8455 8455 8455 24991 24991 24991 13752 13752 13752
++3857 3857 3857 257 257 257 0 0 0 35838 35838 35838 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 57069 56684 56283 15440 15440 15440
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 13752 13752 13752
++57470 57470 57470 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 38978 38978 38978
++128 128 128 0 0 0 55126 54741 54484 65535 65535 65535 65535 65535 65535
++65535 65535 65535 30840 30197 30069 0 0 0 0 0 0 0 0 0
++22881 22881 22881 61309 61309 61309 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 44589 44631 44888 38978 38978 38978
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++48486 48538 48538 257 257 257 0 0 0 0 0 0 0 0 0
++40833 41475 42019 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 55126 54741 54484 0 0 0
++56026 55897 55897 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++31875 31875 31875 385 385 334 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 514 514 514 44589 44631 44888 65535 65535 65535
++38406 38021 37650 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 43356 43080 42463 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 24991 24991 24991
++0 0 0 19317 19131 18746 257 257 257 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63486 46079 19711 43304 54355 65021 42919 54484 65535 58276 44060 22272
++19371 14059 6014 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 62465 45547 19595 45746 53327 59238 43304 54355 65021
++59969 46214 26008 17750 12880 5633 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 3855 2930 1607 62856 45897 20023
++47031 52942 56540 43304 54355 65021 56278 47802 34950 53705 39676 18339 5943 4354 1886
++257 257 257 0 0 0 0 0 0 0 0 0 875 620 271
++40410 29471 12985 59969 46214 26008 47031 52942 56540 56278 47802 34950 60373 44510 19999
++4874 3558 1459 0 0 0 0 0 0 23177 16932 7265 61241 45992 22579
++43304 54355 65021 43818 54098 63479 61241 45992 22579 37303 27193 11910 514 514 514
++0 0 0 0 0 0 0 0 0 0 0 0 8095 5986 2531
++55635 40828 18345 54209 48830 40477 48573 52299 53199 59969 46214 26008 45225 33169 15226
++0 0 0 0 0 0 2402 1799 684 61985 45298 20071 47031 52942 56540
++43304 54355 65021 54209 48830 40477 53705 39676 18339 4874 3558 1459 0 0 0
++0 0 0 0 0 0 2402 1799 684 43194 31354 13386 57302 45835 26989
++50115 51271 50886 43304 54355 65021 42919 54484 65535 63093 45874 19660 9123 6640 2832
++0 0 0 0 0 0 5943 4354 1886 61985 45298 20071 47031 52942 56540
++42919 54484 65535 56278 47802 34950 46996 34589 15727 3855 2930 1607 0 0 0
++0 0 0 0 0 0 0 0 0 13872 10127 4336 61985 45298 20071
++47031 52942 56540 43304 54355 65021 54209 48830 40477 43194 31354 13386 514 514 514
++0 0 0 0 0 0 30933 22555 9803 61861 44933 19292 63736 46260 19789
++63736 46260 19789 50159 36373 15650 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 45225 33169 15226 63486 46079 19455
++63736 46260 19789 62486 45353 19401 30933 22555 9803 385 385 334 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 59002 43055 18866
++63736 46260 19789 63736 46260 19789 61451 44536 19168 20895 15087 6460 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 257 257 257
++21292 21292 21292 128 128 128 31875 31875 31875 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 53256 53199 52942
++1799 1799 1799 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 385 385 334 40833 41475 42019
++65535 65535 65535 65535 65535 65535 56283 56283 56283 14506 14506 14506 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 5911 5911 5911 53256 53199 52942
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 60933 60933 60933 35838 35838 35838 1799 1799 1799
++0 0 0 9814 9814 9814 63222 63222 63222 65535 65535 65535 65535 65535 65535
++65278 65278 65278 28239 28239 28239 0 0 0 0 0 0 33681 33681 33681
++62708 62708 62708 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 57069 56684 56283 47697 47615 47488
++38978 38978 38978 30840 30197 30069 28239 28239 28239 28239 28239 28239 26342 26738 26738
++49621 49621 49607 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65278 65278 65278 63222 63222 63222 22881 22881 22881
++61309 61309 61309 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++40984 40984 40984 0 0 0 0 0 0 0 0 0 1028 1028 1028
++28239 28239 28239 31875 31875 31875 31875 31875 31875 47056 47056 47056 64124 64124 64124
++65535 65535 65535 65535 65535 65535 65535 65535 65535 60933 60933 60933 2313 2313 2313
++49621 49621 49607 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++58889 58889 58889 9814 9814 9814 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 1799 1799 1799 35838 35838 35838
++642 642 899 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 28239 28239 28239
++38406 38021 37650 38406 38021 37650 38406 38021 37650 43356 43080 42463 65021 65021 65021
++65535 65535 65535 65535 65535 65535 65535 65535 65535 47056 47056 47056 1799 1799 1799
++16762 16762 16762 3857 3857 3857 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63736 46260 19789 43304 54355 65021 42919 54484 65535 58279 45589 26504
++19371 14059 6014 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 62737 45569 19692 45746 53327 59238 42919 54484 65535
++58276 44060 22272 17750 12880 5633 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 385 385 334 30933 22555 9803
++58279 45589 26504 43818 54098 63479 42919 54484 65535 56278 47802 34950 60373 44510 19999
++37303 27193 11910 25195 18262 7789 22224 16071 6824 30933 22555 9803 59002 43055 18866
++58279 45589 26504 45746 53327 59238 43818 54098 63479 58279 45589 26504 30933 22555 9803
++0 0 0 0 0 0 0 0 0 1772 1533 1155 51150 38050 17516
++54209 48830 40477 42919 54484 65535 45746 53327 59238 59969 46214 26008 51150 38050 17516
++34164 24785 10813 20895 15087 6460 25195 18262 7789 40410 29471 12985 61113 45548 20995
++56278 47802 34950 43304 54355 65021 47031 52942 56540 62856 45897 20023 9123 6640 2832
++0 0 0 0 0 0 257 257 257 37303 27193 11910 54760 46836 33773
++42919 54484 65535 43304 54355 65021 54760 46836 33773 57142 41714 18588 37303 27193 11910
++27882 20284 8738 36240 26320 11215 55635 40828 18345 56972 46962 30007 50976 48701 42982
++63486 46335 19711 44846 53841 61423 42919 54484 65535 62856 45897 20023 9123 6640 2832
++0 0 0 0 0 0 0 0 0 37303 27193 11910 57302 45835 26989
++43304 54355 65021 44846 53841 61423 56972 46962 30007 55635 40828 18345 28744 20827 9121
++19371 14059 6014 25195 18262 7789 36240 26320 11215 62859 46189 20912 50976 48701 42982
++43304 54355 65021 47031 52942 56540 61985 45298 20071 10498 7619 3259 0 0 0
++0 0 0 0 0 0 30933 22555 9803 61861 44933 19292 63736 46260 19789
++63236 45897 19634 50159 36373 15650 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 45225 33169 15226 63736 46260 19789
++63736 46260 19789 62340 45076 19410 34164 24785 10813 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 59002 43055 18866
++63736 46260 19789 63736 46260 19789 60487 44116 19189 20895 15087 6460 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++5911 5911 5911 15440 15440 15440 3857 3857 3857 57069 56684 56283 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65021 65021 65021 24991 24991 24991
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 1772 1533 1155
++47056 47056 47056 55531 55531 55531 13752 13752 13752 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 38978 38978 38978 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 28239 28239 28239 0 0 0 0 0 0
++21838 21794 21532 51400 51400 51400 65535 65535 65535 65535 65535 65535 65535 65535 65535
++62065 62065 62065 14506 14506 14506 3079 3079 3079 43356 43080 42463 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++64507 64507 64507 50115 50774 49729 28239 28239 28239 20263 20263 20263 31875 31875 31875
++38406 38021 37650 43356 43080 42463 43356 43080 42463 38406 38021 37650 31875 31875 31875
++3079 3079 3079 49621 49621 49607 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 42507 42507 42507
++42507 42507 42507 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++31875 31875 31875 257 257 257 0 0 0 0 0 0 13752 13752 13752
++49621 49621 49607 55531 55531 55531 57470 57470 57470 45746 46260 46746 47697 47615 47488
++65535 65535 65535 65535 65535 65535 65535 65535 65535 62708 62708 62708 4480 4480 4480
++49621 49621 49607 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 43356 43080 42463 385 385 334 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 14506 14506 14506
++61680 61680 61680 65278 65278 65278 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 21292 21292 21292 1028 1028 1028
++18995 18995 18995 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 63486 46079 19711 43304 54355 65021 42919 54484 65535 58276 44060 22272
++19371 14059 6014 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 62465 45547 19595 45746 53327 59238 43304 54355 65021
++59969 46214 26008 17750 12880 5633 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 1264 929 361
++48838 36002 16378 57302 45835 26989 45746 53327 59238 42919 54484 65535 50115 51271 50886
++54209 48830 40477 57302 45835 26989 57302 45835 26989 54760 46836 33773 50115 50774 49729
++43304 54355 65021 44846 53841 61423 57302 45835 26989 48838 36002 16378 1413 1028 514
++128 128 128 0 0 0 0 0 0 0 0 0 10498 7619 3259
++60373 44510 19999 54209 48830 40477 43304 54355 65021 44846 53841 61423 50629 49986 46941
++56278 47802 34950 57302 45835 26989 56972 46962 30007 56278 47802 34950 47031 52942 56540
++42919 54484 65535 48573 52299 53199 61113 45548 20995 27882 20284 8738 257 257 257
++0 0 0 0 0 0 0 0 0 5943 4354 1886 60487 44116 19189
++50976 48701 42982 42919 54484 65535 43304 54355 65021 50115 50774 49729 54209 48830 40477
++56972 46962 30007 54209 48830 40477 50629 49986 46941 47031 52942 56540 62859 46189 20912
++63483 46207 20056 45746 53327 59238 42919 54484 65535 61985 45298 20071 10498 7619 3259
++0 0 0 0 0 0 0 0 0 1413 1028 514 51150 38050 17516
++56972 46962 30007 44846 53841 61423 42919 54484 65535 50629 49986 46941 54760 46836 33773
++58279 45589 26504 57302 45835 26989 54209 48830 40477 47031 52942 56540 42919 54484 65535
++48573 52299 53199 61985 45298 20071 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 30933 22555 9803 61861 44933 19292 63736 46260 19789
++63736 46260 19789 50159 36373 15650 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 45225 33169 15226 63486 46079 19455
++63736 46260 19789 62486 45353 19401 30933 22555 9803 385 385 334 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 59002 43055 18866
++63736 46260 19789 63736 46260 19789 61451 44536 19168 20895 15087 6460 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 21292 21292 21292 257 257 257 28239 28239 28239 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 62065 62065 62065 49621 49621 49607
++50115 50774 49729 50115 51271 50886 51400 51400 51400 49621 49621 49607 3857 3857 3857
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++4480 4480 4480 11370 11370 11370 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 14506 14506 14506 61680 61680 61680 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 53256 53199 52942 385 385 334 1028 1028 1028 42507 42507 42507
++64507 64507 64507 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++45746 46260 46746 35838 35838 35838 55126 55126 55126 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 49621 49621 49607
++35838 35838 35838 38406 38021 37650 53256 53199 52942 64764 64764 64764 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++35502 34869 34383 24991 24991 24991 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 61309 61309 61309
++17553 17553 17553 52685 52685 52685 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++22881 22881 22881 0 0 0 0 0 0 257 257 257 35838 35838 35838
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 62065 62065 62065
++61680 61680 61680 65535 65535 65535 65535 65535 65535 62065 62065 62065 2701 2701 2701
++52685 52685 52685 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 64124 64124 64124 21292 21292 21292 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++38978 38978 38978 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 43356 43080 42463 1028 1028 1028 18995 18995 18995
++1799 1799 1799 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++5943 4354 1886 63864 46774 20174 50115 50774 49729 48573 52299 53199 61241 45992 22579
++19371 14059 6014 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 63093 45874 19660 50629 49986 46941 50115 51271 50886
++61113 45548 20995 17750 12880 5633 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++1264 929 361 42654 31649 16191 62465 45547 19595 54209 48830 40477 48573 52299 53199
++44846 53841 61423 43304 54355 65021 43304 54355 65021 47031 52942 56540 48573 52299 53199
++56278 47802 34950 63483 46207 20056 42654 31649 16191 2402 1799 684 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++10498 7619 3259 53705 39676 18339 61241 45992 22579 50629 49986 46941 47031 52942 56540
++43818 54098 63479 42919 54484 65535 44846 53841 61423 47031 52942 56540 50115 50774 49729
++57302 45835 26989 61985 45298 20071 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 12071 8729 3764
++60373 44510 19999 56972 46962 30007 48573 52299 53199 44846 53841 61423 43304 54355 65021
++43818 54098 63479 47031 52942 56540 54209 48830 40477 61985 45298 20071 28744 20827 9121
++61985 45298 20071 50629 49986 46941 50115 51271 50886 62859 46189 20912 12071 8729 3764
++0 0 0 0 0 0 128 128 128 0 0 0 3855 2930 1607
++45225 33169 15226 61113 45548 20995 54209 48830 40477 48573 52299 53199 44846 53841 61423
++42919 54484 65535 43818 54098 63479 45746 53327 59238 50115 50774 49729 56972 46962 30007
++61985 45298 20071 23177 16932 7265 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 30933 22555 9803 62486 45353 19401 63736 46260 19789
++63236 45897 19634 50159 36373 15650 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 45225 33169 15226 63736 46260 19789
++63736 46260 19789 62486 45353 19401 34164 24785 10813 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 59002 43055 18866
++63736 46260 19789 63736 46260 19789 61451 44536 19168 20895 15087 6460 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 6427 6427 6427 14506 14506 14506 3857 3857 3857 52685 52685 52685
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65021 65021 65021 28239 28239 28239 385 385 334
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 128 128 128 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 47056 47056 47056 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 38406 38021 37650 1028 1285 1542 43356 43080 42463 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 63222 63222 63222
++63222 63222 63222 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 60933 60933 60933 53256 53199 52942 50115 51271 50886
++64124 64124 64124 65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++53256 53199 52942 642 642 899 53256 53199 52942 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++35502 34869 34383 10459 10459 10459 57470 57470 57470 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++21838 21794 21532 128 128 128 0 0 0 0 0 0 49621 49621 49607
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 59538 59538 59538 514 514 514
++55531 55531 55531 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 43356 43080 42463 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 11370 11370 11370 18517 18517 18517 6427 6427 6427 257 257 257
++3857 3857 3857 55126 55126 55126 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 64124 64124 64124 18336 18336 18336 3079 3079 3079 18336 18336 18336
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++5943 4354 1886 53070 38550 16467 53705 39676 18339 53705 39676 18339 53705 39676 18339
++15792 11440 4871 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 51150 38050 17516 53705 39676 18339 55635 40828 18345
++53705 39676 18339 13872 10127 4336 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 13872 10127 4336 40410 29471 12985 59002 43055 18866
++63483 46207 20056 63483 46207 20056 63486 46079 19455 61985 45298 20071 55635 40828 18345
++41427 30069 13197 10498 7619 3259 385 385 334 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 875 620 271 23177 16932 7265 46996 34589 15727 62856 45897 20023
++63486 46079 19711 63483 46207 20056 63486 46079 19711 60373 44510 19999 53705 39676 18339
++30933 22555 9803 3855 2930 1607 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++3855 2930 1607 36240 26320 11215 57142 41714 18588 63483 46207 20056 63483 46207 20056
++63486 46079 19711 61985 45298 20071 42654 31649 16191 15792 11440 4871 0 0 0
++45225 33169 15226 53705 39676 18339 55635 40828 18345 53705 39676 18339 12071 8729 3764
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 15792 11440 4871 45225 33169 15226 60373 44510 19999 63483 46207 20056
++63483 46207 20056 63736 46260 19789 63486 46079 19711 53705 39676 18339 30933 22555 9803
++4874 3558 1459 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 25195 18262 7789 54363 39457 16879 54363 39457 16879
++54363 39457 16879 40410 29471 12985 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 36240 26320 11215 54363 39457 16879
++54363 39457 16879 54363 39457 16879 25195 18262 7789 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 46996 34589 15727
++54363 39457 16879 54363 39457 16879 54363 39457 16879 15792 11440 4871 257 257 257
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 21292 21292 21292 128 128 128 22881 22881 22881
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 47056 47056 47056 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 24991 24991 24991 64764 64764 64764 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++53256 53199 52942 12931 12931 12931 44589 44631 44888 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65021 65021 65021 60933 60933 60933 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++63222 63222 63222 6427 6427 6427 35838 35838 35838 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++47056 47056 47056 0 0 0 40984 40984 40984 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65021 65021 65021
++24991 24991 24991 0 0 0 257 257 257 33681 33681 33681 63607 63607 63607
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 43356 43080 42463 5911 5911 5911
++59538 59538 59538 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 57470 57470 57470 1799 1927 2184 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++257 257 257 24991 24991 24991 65535 65535 65535 63607 63607 63607 57470 57470 57470
++52119 52119 51914 55126 55126 55126 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 35838 35838 35838 0 0 0 21292 21292 21292 514 514 514
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 257 257 257 257 257 257 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 257 257 257
++2402 1799 684 8095 5986 2531 5943 4354 1886 128 128 128 128 128 128
++128 128 128 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 257 257 257 0 0 0
++4874 3558 1459 8373 6077 2600 3038 2204 899 0 0 0 0 0 0
++0 0 0 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 257 257 257 3038 2204 899 8373 6077 2600
++4874 3558 1459 257 257 257 0 0 0 0 0 0 0 0 0
++128 128 128 128 128 128 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 3038 2204 899
++8373 6077 2600 5943 4354 1886 875 620 271 0 0 0 257 257 257
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 257 257 257
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++128 128 128 128 128 128 257 257 257 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++128 128 128 128 128 128 0 0 0 128 128 128 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 3857 3857 3857 16762 16762 16762 257 257 257
++38978 38978 38978 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 58889 58889 58889 9814 9814 9814 2701 2701 2701 11370 11370 11370
++21838 21794 21532 28239 28239 28239 11370 11370 11370 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1799 1927 2184 53256 53199 52942 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 52119 52119 51914
++30840 30197 30069 55126 54741 54484 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 14506 14506 14506 26055 26184 25186 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++59538 59538 59538 3079 3079 3079 30840 30197 30069 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++26055 26184 25186 128 128 128 26342 26738 26738 65278 65278 65278 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 60266 60266 60266 12931 12931 12931 40833 41475 42019
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 24991 24991 24991 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 1413 1670 1799 2701 2701 2701
++0 0 0 7197 7197 7197 62065 62065 62065 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++55531 55531 55531 5911 5911 5911 11370 11370 11370 9814 9814 9814 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 12931 12931 12931 8455 8455 8455
++6427 6427 6427 55126 54741 54484 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 57470 57470 57470 55531 55531 55531 60266 60266 60266 65021 65021 65021
++65535 65535 65535 63607 63607 63607 9814 9814 9814 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++35502 34869 34383 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 64507 64507 64507 55126 54741 54484 48486 48538 48538
++64124 64124 64124 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 22359 22625 23010 10459 10459 10459 64764 64764 64764 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 26342 26738 26738 11370 11370 11370 64124 64124 64124 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++28239 28239 28239 0 0 0 35838 35838 35838 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 64507 64507 64507 30840 30197 30069 30840 30197 30069 63607 63607 63607
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 40833 41475 42019 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 16762 16762 16762 49621 49621 49607
++6810 6810 6810 0 0 0 52685 52685 52685 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 64507 64507 64507
++21838 21794 21532 1799 1927 2184 20263 20263 20263 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 20263 20263 20263
++642 642 899 18995 18995 18995 63607 63607 63607 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 53256 53199 52942 128 128 128 0 0 0 0 0 0
++3857 3857 3857 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 4480 4480 4480
++58889 58889 58889 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 60266 60266 60266 64124 64124 64124 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 59538 59538 59538 49621 49621 49607
++44589 44631 44888 45746 46260 46746 49304 49177 49053 49304 49177 49053 40833 41475 42019
++33681 33681 33681 8455 8455 8455 514 514 514 57470 57470 57470 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 55126 55126 55126 4480 4480 4480 55126 55126 55126 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++35502 34869 34383 0 0 0 38406 38021 37650 65021 65021 65021 62708 62708 62708
++47056 47056 47056 38406 38021 37650 26342 26738 26738 13752 13752 13752 12931 12931 12931
++17965 17965 17965 18995 18995 18995 10459 10459 10459 56283 56283 56283 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 58889 58889 58889 1799 1927 2184
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 2313 2313 2313
++4480 4480 4480 257 257 257 0 0 0 30840 30197 30069 65535 65535 65535
++52685 52685 52685 11370 11370 11370 42507 42507 42507 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 43356 43080 42463
++257 257 257 21838 21794 21532 642 642 899 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 1413 1670 1799
++20263 20263 20263 257 257 257 35838 35838 35838 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 42507 42507 42507 257 257 257 2313 2313 2313 44589 44631 44888
++33681 33681 33681 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 33681 33681 33681
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++63607 63607 63607 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 57470 57470 57470 45746 46260 46746
++38978 38978 38978 33681 33681 33681 22359 22625 23010 3857 3857 3857 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 31875 31875 31875 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 40984 40984 40984 44589 44631 44888 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++44589 44631 44888 0 0 0 33681 33681 33681 35502 34869 34383 9814 9814 9814
++0 0 0 0 0 0 128 128 128 0 0 0 128 128 128
++0 0 0 0 0 0 0 0 0 5911 5911 5911 44589 44631 44888
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 26342 26738 26738
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 21838 21794 21532
++40984 40984 40984 0 0 0 257 257 257 39900 39413 38599 65535 65535 65535
++65535 65535 65535 56026 55897 55897 44589 44631 44888 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 55126 54741 54484 6427 6427 6427
++12931 12931 12931 9814 9814 9814 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++9814 9814 9814 12931 12931 12931 2701 2701 2701 52119 52119 51914 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 30840 30197 30069 10459 10459 10459 51400 51400 51400 65278 65278 65278
++43356 43080 42463 128 128 128 0 0 0 0 0 0 4480 4480 4480
++257 257 257 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 514 514 514 53256 53199 52942
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++57470 57470 57470 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 55126 55126 55126 35502 34869 34383 4480 4480 4480 0 0 0
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 1413 1670 1799
++10459 10459 10459 22359 22625 23010 18517 18517 18517 8455 8455 8455 50115 50774 49729
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 62708 62708 62708 42507 42507 42507 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++53256 53199 52942 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++45746 46260 46746 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 44589 44631 44888
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++28239 28239 28239 0 0 0 0 0 0 0 0 0 35838 35838 35838
++60652 60652 60652 11370 11370 11370 0 0 0 49304 49177 49053 65535 65535 65535
++65535 65535 65535 65535 65535 65535 62065 62065 62065 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 58889 58889 58889 13752 13752 13752 2701 2701 2701
++20263 20263 20263 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 18995 18995 18995 3079 3079 3079 10459 10459 10459 56283 56283 56283
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++64764 64764 64764 30583 30843 31357 57069 56684 56283 65535 65535 65535 65535 65535 65535
++53256 53199 52942 0 0 0 0 0 0 128 128 128 49304 49177 49053
++4480 4480 4480 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 24991 24991 24991 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++48486 48538 48538 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 26342 26738 26738 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 385 385 334 33681 33681 33681
++64124 64124 64124 65535 65535 65535 65535 65535 65535 62065 62065 62065 53256 53199 52942
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 52685 52685 52685 55126 55126 55126
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++62708 62708 62708 5911 5911 5911 0 0 0 22881 22881 22881 48486 48538 48538
++57470 57470 57470 28239 28239 28239 0 0 0 0 0 0 0 0 0
++0 0 0 257 257 257 0 0 0 0 0 0 128 128 128
++17965 17965 17965 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 60266 60266 60266
++9814 9814 9814 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 22881 22881 22881 16762 16762 16762 0 0 0 0 0 0
++51400 51400 51400 21838 21794 21532 0 0 0 0 0 0 47697 47615 47488
++65278 65278 65278 44589 44631 44888 1028 1028 1028 58889 58889 58889 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 61680 61680 61680 21838 21794 21532 1028 1028 1028 22881 22881 22881
++257 257 257 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 257 257 257 7598 8369 9034
++23901 28398 32639 26085 33024 39578 33153 41891 50372 36810 46686 56154 36810 46686 56154
++33153 41891 50372 23901 28398 32639 16576 19275 21848 6627 7270 8103 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 22359 22625 23010 875 620 271 14506 14506 14506
++57470 57470 57470 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++62065 62065 62065 61680 61680 61680 65535 65535 65535 65535 65535 65535 65535 65535 65535
++62708 62708 62708 7197 7197 7197 128 128 128 26342 26738 26738 65021 65021 65021
++24991 24991 24991 0 0 0 0 0 0 0 0 0 5911 5911 5911
++15440 15440 15440 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 47056 47056 47056 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 60933 60933 60933
++38406 38021 37650 65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 26055 26184 25186 128 128 128 0 0 0 0 0 0
++17553 17553 17553 28239 28239 28239 35838 35838 35838 8455 8455 8455 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++40984 40984 40984 65021 65021 65021 65535 65535 65535 65535 65535 65535 63607 63607 63607
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 57470 57470 57470
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 38406 38021 37650 0 0 0 28239 28239 28239 64764 64764 64764
++50115 50774 49729 257 257 257 0 0 0 0 0 0 0 0 0
++0 0 0 1413 1670 1799 53256 53199 52942 43356 43080 42463 1799 1927 2184
++1799 1799 1799 59538 59538 59538 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++44589 44631 44888 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 9814 9814 9814 53256 53199 52942 1028 1028 1028 0 0 0
++49304 49177 49053 56026 55897 55897 7197 7197 7197 1028 1028 1028 57470 57470 57470
++65535 65535 65535 63222 63222 63222 31875 31875 31875 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++64124 64124 64124 30840 30197 30069 0 0 0 22881 22881 22881 2313 2313 2313
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 385 385 334 12444 14392 17344 33153 41891 50372 42533 53970 64764
++42919 54484 65535 42919 54484 65535 42533 53970 64764 42533 53970 64764 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764 26085 33024 39578
++7829 9894 11719 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 1028 1028 1028 22359 22625 23010 257 257 257
++18336 18336 18336 58889 58889 58889 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 26342 26738 26738 3079 3079 3079 55126 55126 55126 65535 65535 65535
++38406 38021 37650 0 0 0 0 0 0 514 514 514 47056 47056 47056
++24991 24991 24991 0 0 0 0 0 0 13752 13752 13752 16762 16762 16762
++0 0 0 0 0 0 14506 14506 14506 63222 63222 63222 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 53256 53199 52942
++38406 38021 37650 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 28239 28239 28239 0 0 0 5911 5911 5911 42507 42507 42507
++64507 64507 64507 65535 65535 65535 65535 65535 65535 10459 10459 10459 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++22881 22881 22881 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 62065 62065 62065
++64124 64124 64124 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 63222 63222 63222 21838 21794 21532 0 0 0 47056 47056 47056
++38978 38978 38978 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 55126 54741 54484 65535 65535 65535 42507 42507 42507
++1799 1927 2184 57470 57470 57470 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++64124 64124 64124 21838 21794 21532 0 0 0 0 0 0 0 0 0
++0 0 0 257 257 257 57470 57470 57470 33681 33681 33681 0 0 0
++48486 48538 48538 65535 65535 65535 47056 47056 47056 18711 18711 18711 65535 65535 65535
++65535 65535 65535 65278 65278 65278 58889 58889 58889 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 64124 64124 64124
++35838 35838 35838 128 128 128 24991 24991 24991 4480 4480 4480 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++12444 14392 17344 36810 46686 56154 42919 54484 65535 42533 53970 64764 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42533 53970 64764 33667 36494 42587 7829 9894 11719 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 2313 2313 2313 21838 21794 21532
++128 128 128 21292 21292 21292 60266 60266 60266 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 38406 38021 37650 38406 38021 37650 65535 65535 65535 65535 65535 65535
++50115 50774 49729 128 128 128 0 0 0 38406 38021 37650 65278 65278 65278
++24991 24991 24991 0 0 0 1028 1285 1542 52119 52119 51914 5911 5911 5911
++0 0 0 0 0 0 40984 40984 40984 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 44589 44631 44888
++42507 42507 42507 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 35502 34869 34383 0 0 0 47697 47615 47488 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 17553 17553 17553 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++11370 11370 11370 65278 65278 65278 65535 65535 65535 65535 65535 65535 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 57069 56684 56283 8455 8455 8455 10459 10459 10459
++35502 34869 34383 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 50115 51271 50886 65535 65535 65535 65535 65535 65535
++58889 58889 58889 62708 62708 62708 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 52685 52685 52685 1413 1670 1799 0 0 0 0 0 0
++0 0 0 0 0 0 49304 49177 49053 60266 60266 60266 11370 11370 11370
++48486 48538 48538 65278 65278 65278 65535 65535 65535 53256 53199 52942 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 61309 61309 61309 28239 28239 28239
++385 385 334 21838 21794 21532 8455 8455 8455 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 20214 22616 25648
++42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 40349 51271 61680 16576 19275 21848 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 3857 3857 3857
++21838 21794 21532 0 0 0 24991 24991 24991 61309 61309 61309 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 52685 52685 52685 61309 61309 61309 65535 65535 65535 65535 65535 65535
++61680 61680 61680 6427 6427 6427 24991 24991 24991 63607 63607 63607 65535 65535 65535
++22881 22881 22881 0 0 0 35838 35838 35838 52685 52685 52685 0 0 0
++257 257 257 4480 4480 4480 58889 58889 58889 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 38406 38021 37650
++47056 47056 47056 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 58889 58889 58889 12931 12931 12931 16136 16136 16136 60266 60266 60266
++65535 65535 65535 65535 65535 65535 65278 65278 65278 38406 38021 37650 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++30840 30197 30069 65535 65535 65535 65535 65535 65535 65535 65535 65535 62708 62708 62708
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 47056 47056 47056 514 514 514
++1799 1927 2184 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 16762 16762 16762 63607 63607 63607 65535 65535 65535 65535 65535 65535
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 35838 35838 35838 0 0 0 0 0 0
++0 0 0 0 0 0 40984 40984 40984 65535 65535 65535 47697 47615 47488
++47056 47056 47056 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 57470 57470 57470 18995 18995 18995 514 514 514
++19317 19131 18746 8455 8455 8455 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 1799 1927 2184 26085 33024 39578 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764 23901 28398 32639
++257 257 257 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++5911 5911 5911 22881 22881 22881 128 128 128 20263 20263 20263 55126 54741 54484
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 38406 38021 37650 59538 59538 59538 65535 65535 65535 65535 65535 65535
++21292 21292 21292 17965 17965 17965 61309 61309 61309 40833 41475 42019 128 128 128
++0 0 0 33681 33681 33681 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 26342 26738 26738
++51400 51400 51400 65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 53256 53199 52942 6427 6427 6427 26342 26738 26738
++60933 60933 60933 65535 65535 65535 65535 65535 65535 63222 63222 63222 26055 26184 25186
++128 128 128 0 0 0 0 0 0 0 0 0 17553 17553 17553
++55126 55126 55126 65535 65535 65535 65535 65535 65535 65535 65535 65535 57470 57470 57470
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 35502 34869 34383
++0 0 0 642 642 899 1028 1285 1542 0 0 0 0 0 0
++17553 17553 17553 49304 49177 49053 65535 65535 65535 64507 64507 64507 57470 57470 57470
++49621 49621 49607 62065 62065 62065 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 62065 62065 62065 17553 17553 17553 128 128 128
++0 0 0 0 0 0 28239 28239 28239 65535 65535 65535 65278 65278 65278
++58889 58889 58889 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 48486 48538 48538 9814 9814 9814 2313 2313 2313 21838 21794 21532
++3079 3079 3079 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 1028 1028 1028 33153 41891 50372 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++26085 33024 39578 1413 1670 1799 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++257 257 257 7197 7197 7197 24991 24991 24991 0 0 0 4480 4480 4480
++43356 43080 42463 64507 64507 64507 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 63222 63222 63222 65535 65535 65535 65535 65535 65535 65535 65535 65535
++22881 22881 22881 52685 52685 52685 65535 65535 65535 30583 30843 31357 0 0 0
++0 0 0 49304 49177 49053 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65278 65278 65278 60266 60266 60266 4480 4480 4480
++55126 55126 55126 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 49621 49621 49607 13752 13752 13752
++15440 15440 15440 52685 52685 52685 65535 65535 65535 65535 65535 65535 60652 60652 60652
++43356 43080 42463 35838 35838 35838 31875 31875 31875 47056 47056 47056 63607 63607 63607
++65535 65535 65535 65535 65535 65535 65535 65535 65535 51400 51400 51400 52685 52685 52685
++65535 65535 65535 65021 65021 65021 62708 62708 62708 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 61680 61680 61680
++18995 18995 18995 1028 1028 1028 51400 51400 51400 55126 54741 54484 52685 52685 52685
++64124 64124 64124 65535 65535 65535 49621 49621 49607 18995 18995 18995 3079 3079 3079
++48486 48538 48538 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 53256 53199 52942 3857 3857 3857
++0 0 0 0 0 0 9814 9814 9814 63222 63222 63222 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 53256 53199 52942
++24991 24991 24991 1028 1028 1028 7197 7197 7197 20263 20263 20263 257 257 257
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 875 620 271
++875 620 271 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 23901 28398 32639 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 33153 41891 50372 12444 14392 17344 20214 22616 25648
++40349 51271 61680 42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764
++23901 28398 32639 10999 12122 13073 26085 33024 39578 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 23901 28398 32639 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 4480 4480 4480 22881 22881 22881 4480 4480 4480
++128 128 128 28239 28239 28239 57470 57470 57470 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++50115 50774 49729 65535 65535 65535 65021 65021 65021 14506 14506 14506 0 0 0
++8455 8455 8455 62708 62708 62708 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 46260 45809 45103 1028 1028 1028
++59538 59538 59538 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 61309 61309 61309
++38406 38021 37650 5911 5911 5911 30840 30197 30069 47056 47056 47056 62065 62065 62065
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 48486 48538 48538 40984 40984 40984 65278 65278 65278
++65535 65535 65535 56283 56283 56283 61309 61309 61309 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++55126 54741 54484 5911 5911 5911 21838 21794 21532 57470 57470 57470 50115 50774 49729
++43356 43080 42463 28239 28239 28239 0 0 0 128 128 128 44589 44631 44888
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 40833 41475 42019
++128 128 128 0 0 0 0 0 0 51400 51400 51400 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 55126 54741 54484 28239 28239 28239 3857 3857 3857
++3079 3079 3079 21292 21292 21292 13752 13752 13752 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 1264 929 361
++3855 2930 1607 2402 1799 684 0 0 0 0 0 0 15792 11440 4871
++53070 38550 16467 25195 18262 7789 385 385 334 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7829 9894 11719 40349 51271 61680 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42533 53970 64764 4615 5268 6322 385 385 334 0 0 0
++23007 25957 28667 42533 53970 64764 42919 54484 65535 42919 54484 65535 26085 33024 39578
++1028 1285 1542 0 0 0 0 0 0 36810 46686 56154 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 16576 19275 21848 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 257 257 257 128 128 128 18995 18995 18995
++12931 12931 12931 0 0 0 10459 10459 10459 44589 44631 44888 62708 62708 62708
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++64507 64507 64507 65535 65535 65535 57069 56684 56283 514 514 514 0 0 0
++31875 31875 31875 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65278 65278 65278 30583 30843 31357 10459 10459 10459
++64764 64764 64764 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 56026 55897 55897 40984 40984 40984 26342 26738 26738 14506 14506 14506
++31875 31875 31875 35838 35838 35838 38406 38021 37650 40984 40984 40984 43356 43080 42463
++40984 40984 40984 28239 28239 28239 35838 35838 35838 61680 61680 61680 65535 65535 65535
++65278 65278 65278 46260 45809 45103 62708 62708 62708 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 42507 42507 42507 128 128 128 642 642 899 128 128 128
++0 0 0 0 0 0 15440 15440 15440 21838 21794 21532 38406 38021 37650
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 64507 64507 64507
++31875 31875 31875 0 0 0 0 0 0 28239 28239 28239 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 58889 58889 58889
++42507 42507 42507 20778 20778 20542 1799 1799 1799 514 514 514 18517 18517 18517
++17965 17965 17965 385 385 334 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 4874 3558 1459 13872 10127 4336
++37303 27193 11910 61451 44536 19168 34164 24785 10813 3855 2930 1607 0 0 0
++15792 11440 4871 61861 44933 19292 36240 26320 11215 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 642 642 899
++33153 41891 50372 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 26085 33024 39578 0 0 0 0 0 0 257 257 257
++20214 22616 25648 42919 54484 65535 42919 54484 65535 42919 54484 65535 12444 14392 17344
++0 0 0 0 0 0 0 0 0 36810 46686 56154 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 40349 51271 61680 10999 12122 13073 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++9814 9814 9814 21838 21794 21532 1028 1028 1028 0 0 0 11370 11370 11370
++35838 35838 35838 57470 57470 57470 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 45746 46260 46746 128 128 128 0 0 0
++45746 46260 46746 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 60933 60933 60933 7197 7197 7197 24991 24991 24991
++65021 65021 65021 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 60266 60266 60266
++50115 50774 49729 46260 45809 45103 40984 40984 40984 35838 35838 35838 40833 41475 42019
++51400 51400 51400 58889 58889 58889 65535 65535 65535 65535 65535 65535 65535 65535 65535
++64764 64764 64764 38406 38021 37650 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 64124 64124 64124 22881 22881 22881 257 257 257 5911 5911 5911
++26055 26184 25186 38406 38021 37650 59538 59538 59538 44589 44631 44888 15440 15440 15440
++64124 64124 64124 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++62708 62708 62708 24991 24991 24991 128 128 128 257 257 257 50115 51271 50886
++51400 51400 51400 42507 42507 42507 33681 33681 33681 22881 22881 22881 2701 2701 2701
++0 0 0 8455 8455 8455 19317 19131 18746 18995 18995 18995 2313 2313 2313
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 10498 7619 3259 46996 34589 15727 54363 39457 16879 5943 4354 1886
++0 0 0 22224 16071 6824 63736 46260 19789 30042 21792 9253 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 16576 19275 21848
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 20214 22616 25648 2827 3598 4240 42507 42507 42507 0 0 0
++26085 33024 39578 42919 54484 65535 42919 54484 65535 42533 53970 64764 0 0 0
++24991 24991 24991 16762 16762 16762 2056 2313 2822 42533 53970 64764 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 36810 46686 56154 2827 3598 4240
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 1413 1670 1799 21292 21292 21292 16136 16136 16136 514 514 514
++128 128 128 3079 3079 3079 28239 28239 28239 50115 51271 50886 64507 64507 64507
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 35838 35838 35838 0 0 0 4480 4480 4480
++60652 60652 60652 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 47697 47615 47488 128 128 128 30583 30843 31357
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++49304 49177 49053 35838 35838 35838 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 55126 55126 55126 4480 4480 4480 35838 35838 35838
++65535 65535 65535 65535 65535 65535 65535 65535 65535 57470 57470 57470 1413 1670 1799
++51400 51400 51400 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 59538 59538 59538 16136 16136 16136 128 128 128 0 0 0
++0 0 0 0 0 0 257 257 257 8455 8455 8455 18995 18995 18995
++20263 20263 20263 10459 10459 10459 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++6810 6810 6810 17553 17553 17553 26342 26738 26738 38406 38021 37650 35838 35838 35838
++5911 5911 5911 0 0 0 875 620 271 46996 34589 15727 51340 37280 15909
++2402 1799 684 0 0 0 43194 31354 13386 62340 45076 19410 12071 8729 3764
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 33153 41891 50372
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42533 53970 64764 16576 19275 21848 5911 5911 5911 26342 26738 26738 0 0 0
++36810 46686 56154 42919 54484 65535 42919 54484 65535 40349 51271 61680 0 0 0
++28239 28239 28239 9814 9814 9814 12444 14392 17344 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 23901 28398 32639
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++1799 1799 1799 8455 8455 8455 257 257 257 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 3857 3857 3857 18995 18995 18995
++20263 20263 20263 5911 5911 5911 0 0 0 128 128 128 15440 15440 15440
++31875 31875 31875 40984 40984 40984 49621 49621 49607 58889 58889 58889 65278 65278 65278
++65535 65535 65535 65535 65535 65535 22881 22881 22881 128 128 128 28239 28239 28239
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 31875 31875 31875 257 257 257 38406 38021 37650
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 48486 48538 48538
++24991 24991 24991 56026 55897 55897 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 40984 40984 40984 1028 1028 1028
++50115 51271 50886 65535 65535 65535 65535 65535 65535 65535 65535 65535 21838 21794 21532
++35838 35838 35838 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 55126 54741 54484 3079 3079 3079 2701 2701 2701
++22881 22881 22881 20263 20263 20263 17965 17965 17965 10459 10459 10459 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 16136 16136 16136 18711 18711 18711 30840 30197 30069 57470 57470 57470
++60652 60652 60652 55126 54741 54484 43356 43080 42463 33681 33681 33681 30840 30197 30069
++28239 28239 28239 11370 11370 11370 0 0 0 7209 5285 2184 60487 44116 19189
++36240 26320 11215 0 0 0 10498 7619 3259 63236 45897 19634 46996 34589 15727
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 4615 5268 6322 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 12444 14392 17344 642 642 899 0 0 0 2827 3598 4240
++42533 53970 64764 42919 54484 65535 42919 54484 65535 40349 51271 61680 0 0 0
++0 0 0 0 0 0 23007 25957 28667 42533 53970 64764 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 40349 51271 61680
++4615 5268 6322 0 0 0 0 0 0 0 0 0 20263 20263 20263
++60266 60266 60266 65535 65535 65535 55126 54741 54484 9814 9814 9814 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 13752 13752 13752 20263 20263 20263 14506 14506 14506 128 128 128
++0 0 0 0 0 0 128 128 128 1799 1927 2184 16136 16136 16136
++31875 31875 31875 40833 41475 42019 3857 3857 3857 0 0 0 44589 44631 44888
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 55531 55531 55531 3079 3079 3079 0 0 0 44589 44631 44888
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 64764 64764 64764 56026 55897 55897 47056 47056 47056
++63607 63607 63607 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 63222 63222 63222 21292 21292 21292
++17553 17553 17553 62708 62708 62708 65535 65535 65535 65535 65535 65535 38406 38021 37650
++12931 12931 12931 60652 60652 60652 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65278 65278 65278 24991 24991 24991 3857 3857 3857
++14506 14506 14506 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++30840 30197 30069 60652 60652 60652 60652 60652 60652 38978 38978 38978 26342 26738 26738
++30840 30197 30069 35838 35838 35838 45746 46260 46746 57470 57470 57470 60266 60266 60266
++60652 60652 60652 59538 59538 59538 9814 9814 9814 0 0 0 25195 18262 7789
++61861 44933 19292 7209 5285 2184 0 0 0 41427 30069 13197 63736 46260 19789
++22224 16071 6824 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 23007 25957 28667 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 33667 36494 42587 0 0 0 642 642 899 23901 28398 32639
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764 12444 14392 17344
++0 0 0 4615 5268 6322 36810 46686 56154 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764
++26085 33024 39578 0 0 0 0 0 0 3079 3079 3079 58889 58889 58889
++65535 65535 65535 65535 65535 65535 65535 65535 65535 57470 57470 57470 2313 2313 2313
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 0 0 0 5911 5911 5911 18517 18517 18517
++18711 18711 18711 18995 18995 18995 17965 17965 17965 5911 5911 5911 0 0 0
++0 0 0 0 0 0 0 0 0 2313 2313 2313 57470 57470 57470
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 31875 31875 31875 0 0 0 0 0 0 49621 49621 49607
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 53256 53199 52942
++3079 3079 3079 39900 39413 38599 65535 65535 65535 65535 65535 65535 52119 52119 51914
++0 0 0 11370 11370 11370 42507 42507 42507 62708 62708 62708 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 38406 38021 37650 0 0 0
++17965 17965 17965 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++53256 53199 52942 60652 60652 60652 60652 60652 60652 60933 60933 60933 30840 30197 30069
++56026 55897 55897 60652 60652 60652 60652 60652 60652 57069 56684 56283 45746 46260 46746
++35502 34869 34383 28239 28239 28239 22359 22625 23010 385 385 334 0 0 0
++45225 33169 15226 36240 26320 11215 128 128 128 15792 11440 4871 63736 46260 19789
++51340 37280 15909 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 33153 41891 50372 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42533 53970 64764 36810 46686 56154 36810 46686 56154 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764
++33153 41891 50372 40349 51271 61680 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42533 53970 64764 1799 1927 2184 128 128 128 33681 33681 33681 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 33681 33681 33681
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 1028 1028 1028 13752 13752 13752 18995 18995 18995
++26055 26184 25186 17553 17553 17553 128 128 128 24991 24991 24991 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++55126 54741 54484 1799 1799 1799 0 0 0 128 128 128 57069 56684 56283
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++38978 38978 38978 3857 3857 3857 55126 55126 55126 65535 65535 65535 63607 63607 63607
++10459 10459 10459 2313 2313 2313 0 0 0 15440 15440 15440 46260 45809 45103
++64124 64124 64124 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 48486 48538 48538 0 0 0
++20263 20263 20263 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 8455 8455 8455
++60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 55126 55126 55126
++24991 24991 24991 30840 30197 30069 28239 28239 28239 33681 33681 33681 43356 43080 42463
++53256 53199 52942 60652 60652 60652 60266 60266 60266 30840 30197 30069 128 128 128
++12071 8729 3764 57142 41714 18588 0 0 0 2402 1799 684 62340 45076 19410
++63486 46079 19711 10498 7619 3259 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 2827 3598 4240 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 40349 51271 61680 33153 41891 50372 26085 33024 39578
++23901 28398 32639 23007 25957 28667 23901 28398 32639 33667 36494 42587 36810 46686 56154
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++40349 51271 61680 642 642 899 128 128 128 57470 57470 57470 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 63222 63222 63222
++7197 7197 7197 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 18336 18336 18336 0 0 0 33681 33681 33681 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++30840 30197 30069 0 0 0 0 0 0 1799 1927 2184 59538 59538 59538
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++62065 62065 62065 12931 12931 12931 24991 24991 24991 64124 64124 64124 65535 65535 65535
++31875 31875 31875 24991 24991 24991 24991 24991 24991 9814 9814 9814 128 128 128
++26342 26738 26738 57470 57470 57470 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 57069 56684 56283 514 514 514
++20263 20263 20263 257 257 257 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 11370 11370 11370
++60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652
++30840 30197 30069 57470 57470 57470 60933 60933 60933 60266 60266 60266 60652 60652 60652
++60933 60933 60933 60266 60266 60266 52119 52119 51914 38978 38978 38978 2313 2313 2313
++0 0 0 54363 39457 16879 8095 5986 2531 0 0 0 48838 36002 16378
++63486 46079 19455 34164 24785 10813 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 12444 14392 17344 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++26085 33024 39578 12444 14392 17344 514 514 514 0 0 0 0 0 0
++257 257 257 257 257 257 257 257 257 257 257 257 128 128 128
++7829 9894 11719 33667 36494 42587 42533 53970 64764 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++33667 36494 42587 257 257 257 12931 12931 12931 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 64764 64764 64764 40984 40984 40984
++21838 21794 21532 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 18336 18336 18336 0 0 0 38406 38021 37650 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 52685 52685 52685
++642 642 899 0 0 0 257 257 257 0 0 0 56283 56283 56283
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 40833 41475 42019 0 0 0 47056 47056 47056 65535 65535 65535
++47056 47056 47056 7197 7197 7197 11370 11370 11370 12931 12931 12931 20778 20778 20542
++1772 1533 1155 9814 9814 9814 48486 48538 48538 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 63607 63607 63607 10459 10459 10459
++2701 2701 2701 16762 16762 16762 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 11370 11370 11370
++60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652
++49621 49621 49607 38406 38021 37650 45746 46260 46746 35502 34869 34383 30840 30197 30069
++28239 28239 28239 30840 30197 30069 38406 38021 37650 49304 49177 49053 20263 20263 20263
++128 128 128 30933 22555 9803 23177 16932 7265 0 0 0 34164 24785 10813
++63736 46260 19789 54363 39457 16879 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 257 257 257 23007 25957 28667 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42533 53970 64764 42533 53970 64764 16576 19275 21848
++128 128 128 0 0 0 2402 1799 684 19371 14059 6014 27882 20284 8738
++34164 24785 10813 37303 27193 11910 30933 22555 9803 20895 15087 6460 8373 6077 2600
++0 0 0 0 0 0 7829 9894 11719 36810 46686 56154 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++23901 28398 32639 0 0 0 28239 28239 28239 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 20778 20778 20542 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 18517 18517 18517 0 0 0 38406 38021 37650 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 63222 63222 63222 22881 22881 22881
++257 257 257 26055 26184 25186 22881 22881 22881 0 0 0 52119 52119 51914
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 60652 60652 60652 9814 9814 9814 16762 16762 16762 63222 63222 63222
++61680 61680 61680 5911 5911 5911 18995 18995 18995 128 128 128 385 385 334
++18995 18995 18995 10459 10459 10459 128 128 128 28239 28239 28239 57069 56684 56283
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 38978 38978 38978
++257 257 257 15440 15440 15440 17965 17965 17965 16136 16136 16136 18995 18995 18995
++3079 3079 3079 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 11370 11370 11370
++60266 60266 60266 60933 60933 60933 60652 60652 60652 60652 60652 60652 60652 60652 60652
++60652 60652 60652 22359 22625 23010 43356 43080 42463 55531 55531 55531 60266 60266 60266
++60933 60933 60933 60652 60652 60652 60652 60652 60652 60652 60652 60652 38978 38978 38978
++0 0 0 15792 11440 4871 40410 29471 12985 0 0 0 17750 12880 5633
++63736 46260 19789 63359 45859 19672 3038 2204 899 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 26085 33024 39578 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42533 53970 64764 10999 12122 13073 642 642 899
++3855 2930 1607 43194 31354 13386 61861 44933 19292 63736 46260 19789 59002 43055 18866
++46996 34589 15727 51340 37280 15909 55635 40828 18345 63736 46260 19789 63736 46260 19789
++43194 31354 13386 12071 8729 3764 0 0 0 12444 14392 17344 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++20214 22616 25648 642 642 899 33681 33681 33681 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 61309 61309 61309 128 128 128 1028 1028 1028
++20214 22616 25648 4615 5268 6322 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 18711 18711 18711 0 0 0 38978 38978 38978 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 35838 35838 35838 257 257 257
++8455 8455 8455 57470 57470 57470 43356 43080 42463 0 0 0 48486 48538 48538
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 38978 38978 38978 0 0 0 44589 44631 44888
++65021 65021 65021 24991 24991 24991 18995 18995 18995 0 0 0 0 0 0
++0 0 0 10459 10459 10459 18995 18995 18995 642 642 899 5911 5911 5911
++33681 33681 33681 57470 57470 57470 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 62708 62708 62708
++19317 19131 18746 0 0 0 2313 2313 2313 1799 1927 2184 514 514 514
++22881 22881 22881 2701 2701 2701 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 4480 4480 4480
++60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652
++60652 60652 60652 30840 30197 30069 60652 60652 60652 60652 60652 60652 60652 60652 60652
++57069 56684 56283 44589 44631 44888 33681 33681 33681 30840 30197 30069 22881 22881 22881
++0 0 0 5943 4354 1886 54363 39457 16879 128 128 128 3038 2204 899
++63093 45874 19660 63486 46079 19711 15792 11440 4871 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 1028 1028 1028 36810 46686 56154 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42533 53970 64764 23901 28398 32639 257 257 257 9123 6640 2832
++54363 39457 16879 63486 46079 19711 63736 46260 19789 63736 46260 19789 50159 36373 15650
++41427 30069 13197 37303 27193 11910 55635 40828 18345 63736 46260 19789 63486 46079 19711
++63736 46260 19789 60487 44116 19189 5943 4354 1886 0 0 0 33153 41891 50372
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++16576 19275 21848 0 0 0 40984 40984 40984 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 48486 48538 48538 257 257 257 7829 9894 11719
++42919 54484 65535 40349 51271 61680 23901 28398 32639 2827 3598 4240 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 24991 24991 24991 0 0 0 38978 38978 38978 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 47697 47615 47488 1028 1028 1028 385 385 334
++47697 47615 47488 65535 65535 65535 59538 59538 59538 4480 4480 4480 44589 44631 44888
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 59538 59538 59538 7197 7197 7197 14506 14506 14506
++61680 61680 61680 31875 31875 31875 16762 16762 16762 1799 1799 1799 0 0 0
++0 0 0 0 0 0 1413 1670 1799 20263 20263 20263 11370 11370 11370
++257 257 257 1799 1799 1799 21838 21794 21532 42507 42507 42507 59538 59538 59538
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++62065 62065 62065 38978 38978 38978 30583 30843 31357 28239 28239 28239 6810 6810 6810
++1799 1927 2184 17553 17553 17553 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++55531 55531 55531 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652
++60652 60652 60652 40833 41475 42019 30583 30843 31357 30840 30197 30069 28239 28239 28239
++33681 33681 33681 44589 44631 44888 56283 56283 56283 60266 60266 60266 59538 59538 59538
++642 642 899 0 0 0 59002 43055 18866 5943 4354 1886 128 128 128
++53070 38550 16467 63736 46260 19789 25195 18262 7789 385 385 334 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 2827 3598 4240 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 36810 46686 56154 1028 1285 1542 385 385 334 51340 37280 15909
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 37303 27193 11910 0 0 0 7829 9894 11719
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++12444 14392 17344 0 0 0 45746 46260 46746 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 38406 38021 37650 128 128 128 16576 19275 21848
++42919 54484 65535 42919 54484 65535 42919 54484 65535 40349 51271 61680 16576 19275 21848
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++5911 5911 5911 16136 16136 16136 0 0 0 40984 40984 40984 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 55531 55531 55531 8455 8455 8455 257 257 257 31875 31875 31875
++65535 65535 65535 65535 65535 65535 65535 65535 65535 30583 30843 31357 30840 30197 30069
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 38978 38978 38978 0 0 0
++42507 42507 42507 35838 35838 35838 10459 10459 10459 7197 7197 7197 0 0 0
++0 0 0 0 0 0 0 0 0 257 257 257 8455 8455 8455
++21292 21292 21292 11370 11370 11370 128 128 128 0 0 0 3079 3079 3079
++26342 26738 26738 47056 47056 47056 62708 62708 62708 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 60652 60652 60652 6427 6427 6427
++8455 8455 8455 10459 10459 10459 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++46260 45809 45103 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652
++60652 60652 60652 52119 52119 51914 38406 38021 37650 60266 60266 60266 60933 60933 60933
++60652 60652 60652 60652 60652 60652 60266 60266 60266 50115 50774 49729 35838 35838 35838
++3079 3079 3079 0 0 0 55635 40828 18345 7209 5285 2184 128 128 128
++54363 39457 16879 63736 46260 19789 28744 20827 9121 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 16576 19275 21848 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 12444 14392 17344 0 0 0 28744 20827 9121 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 62986 45716 19556 3038 2204 899 128 128 128
++40349 51271 61680 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++7829 9894 11719 0 0 0 52119 52119 51914 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 44589 44631 44888 257 257 257 12444 14392 17344
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 40349 51271 61680
++16576 19275 21848 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++28239 28239 28239 0 0 0 0 0 0 49621 49621 49607 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++61680 61680 61680 20263 20263 20263 0 0 0 14506 14506 14506 60652 60652 60652
++65535 65535 65535 65535 65535 65535 65535 65535 65535 49304 49177 49053 3857 3857 3857
++59538 59538 59538 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 59538 59538 59538 8455 8455 8455
++11370 11370 11370 40984 40984 40984 4480 4480 4480 13752 13752 13752 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 9814 9814 9814 18995 18995 18995 20263 20263 20263 17553 17553 17553
++1799 1799 1799 0 0 0 12931 12931 12931 38978 38978 38978 57470 57470 57470
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 63607 63607 63607 31875 31875 31875 0 0 0
++20263 20263 20263 0 0 0 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++33681 33681 33681 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652
++60652 60652 60652 59538 59538 59538 30583 30843 31357 57069 56684 56283 43356 43080 42463
++30583 30843 31357 28239 28239 28239 30840 30197 30069 38978 38978 38978 53256 53199 52942
++5911 5911 5911 0 0 0 54363 39457 16879 3038 2204 899 0 0 0
++57142 41714 18588 63736 46260 19789 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 26085 33024 39578 42919 54484 65535 42919 54484 65535 42919 54484 65535
++40349 51271 61680 642 642 899 3038 2204 899 60487 44116 19189 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 1413 1028 514 642 642 899
++42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++7829 9894 11719 0 0 0 50115 51271 50886 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 53256 53199 52942 128 128 128 6627 7270 8103
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42533 53970 64764 12444 14392 17344 1028 1285 1542 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 12931 12931 12931
++10459 10459 10459 0 0 0 13752 13752 13752 60652 60652 60652 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 63607 63607 63607
++30583 30843 31357 0 0 0 1799 1927 2184 51400 51400 51400 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65278 65278 65278 64507 64507 64507 22881 22881 22881
++43356 43080 42463 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 64124 64124 64124
++53256 53199 52942 40984 40984 40984 30583 30843 31357 28239 28239 28239 30840 30197 30069
++30583 30843 31357 33681 33681 33681 44589 44631 44888 55126 55126 55126 64124 64124 64124
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 40984 40984 40984
++0 0 0 7197 7197 7197 0 0 0 18517 18517 18517 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 1799 1927 2184
++17965 17965 17965 19317 19131 18746 11370 11370 11370 0 0 0 2701 2701 2701
++28239 28239 28239 47697 47615 47488 57470 57470 57470 58889 58889 58889 59538 59538 59538
++60266 60266 60266 61309 61309 61309 62708 62708 62708 63607 63607 63607 65278 65278 65278
++53256 53199 52942 40984 40984 40984 20263 20263 20263 128 128 128 11370 11370 11370
++11370 11370 11370 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++14506 14506 14506 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652 60652
++60652 60652 60652 60652 60652 60652 21838 21794 21532 30968 32639 33656 46260 45809 45103
++58889 58889 58889 60652 60652 60652 60266 60266 60266 60933 60933 60933 53256 53199 52942
++3079 3079 3079 0 0 0 55635 40828 18345 0 0 0 0 0 0
++61451 44536 19168 63486 46079 19711 25195 18262 7789 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++1028 1285 1542 42533 53970 64764 42919 54484 65535 42919 54484 65535 42533 53970 64764
++33153 41891 50372 257 257 257 15792 11440 4871 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 61451 44536 19168 0 0 0 4615 5268 6322
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++12444 14392 17344 257 257 257 39900 39413 38599 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 63222 63222 63222 257 257 257 257 257 257
++42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 12444 14392 17344 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 7197 7197 7197 15440 15440 15440
++128 128 128 4480 4480 4480 53256 53199 52942 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 62708 62708 62708 30840 30197 30069
++128 128 128 0 0 0 39900 39413 38599 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 53256 53199 52942
++26342 26738 26738 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 62065 62065 62065 44589 44631 44888 16136 16136 16136
++257 257 257 0 0 0 0 0 0 257 257 257 1028 1028 1028
++1772 1533 1155 128 128 128 0 0 0 0 0 0 11370 11370 11370
++30840 30197 30069 52685 52685 52685 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 60933 60933 60933
++11370 11370 11370 128 128 128 0 0 0 18517 18517 18517 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 7197 7197 7197 18995 18995 18995 16136 16136 16136
++1028 1028 1028 0 0 0 0 0 0 0 0 0 1799 1799 1799
++3079 3079 3079 4480 4480 4480 6810 6810 6810 8455 8455 8455 8455 8455 8455
++1028 1028 1028 0 0 0 2313 2313 2313 20263 20263 20263 11370 11370 11370
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1028 1028 1028 56026 55897 55897 60652 60652 60652 60652 60652 60652 60652 60652 60652
++60652 60652 60652 60652 60652 60652 30840 30197 30069 60652 60652 60652 60652 60652 60652
++55126 55126 55126 38978 38978 38978 30840 30197 30069 30840 30197 30069 35838 35838 35838
++3079 3079 3079 0 0 0 53070 38550 16467 0 0 0 875 620 271
++63736 46260 19789 63736 46260 19789 13872 10127 4336 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++12444 14392 17344 42919 54484 65535 42533 53970 64764 42919 54484 65535 42919 54484 65535
++23901 28398 32639 257 257 257 30933 22555 9803 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 36240 26320 11215 0 0 0 10999 12122 13073
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++23901 28398 32639 0 0 0 30840 30197 30069 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 7197 7197 7197 128 128 128
++33667 36494 42587 42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42533 53970 64764 10999 12122 13073 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 257 257 257 21838 21794 21532 0 0 0
++514 514 514 44589 44631 44888 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 61680 61680 61680 28239 28239 28239 0 0 0
++642 642 899 39900 39413 38599 64764 64764 64764 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++38406 38021 37650 55126 55126 55126 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 52119 52119 51914 15440 15440 15440 0 0 0 0 0 0
++18336 18336 18336 40833 41475 42019 47697 47615 47488 53256 53199 52942 57470 57470 57470
++59538 59538 59538 55126 55126 55126 52119 52119 51914 39900 39413 38599 24991 24991 24991
++2701 2701 2701 3079 3079 3079 38978 38978 38978 62708 62708 62708 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++51400 51400 51400 4480 4480 4480 128 128 128 20263 20263 20263 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 1799 1799 1799
++17553 17553 17553 18517 18517 18517 18517 18517 18517 18711 18711 18711 18517 18517 18517
++18517 18517 18517 18517 18517 18517 18517 18517 18517 18517 18517 18517 18517 18517 18517
++18517 18517 18517 17553 17553 17553 15440 15440 15440 642 642 899 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 38406 38021 37650 60652 60652 60652 60652 60652 60652 60652 60652 60652
++60652 60652 60652 60933 60933 60933 24991 24991 24991 30840 30197 30069 28239 28239 28239
++35502 34869 34383 50115 51271 50886 60652 60652 60652 60266 60266 60266 44589 44631 44888
++0 0 0 3038 2204 899 59002 43055 18866 1264 929 361 5943 4354 1886
++63486 46079 19455 55635 40828 18345 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++26085 33024 39578 42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764
++16576 19275 21848 257 257 257 43194 31354 13386 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 57142 41714 18588 3038 2204 899 0 0 0 33153 41891 50372
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++26085 33024 39578 0 0 0 18517 18517 18517 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 33681 33681 33681 257 257 257
++6627 7270 8103 42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 36810 46686 56154 4615 5268 6322
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 12931 12931 12931 8455 8455 8455 257 257 257
++31875 31875 31875 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 61309 61309 61309 24991 24991 24991 0 0 0 1799 1799 1799
++44589 44631 44888 65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++60266 60266 60266 40833 41475 42019 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++49621 49621 49607 3079 3079 3079 0 0 0 22881 22881 22881 48486 48538 48538
++64124 64124 64124 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++55126 54741 54484 21838 21794 21532 128 128 128 18995 18995 18995 52119 52119 51914
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 47697 47615 47488 1799 1799 1799 3079 3079 3079 21838 21794 21532
++0 0 0 0 0 0 0 0 0 0 0 0 257 257 257
++11370 11370 11370 18995 18995 18995 16762 16762 16762 514 514 514 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 11370 11370 11370 60266 60266 60266 60652 60652 60652 60652 60652 60652
++60652 60652 60652 60652 60652 60652 28239 28239 28239 60266 60266 60266 60652 60652 60652
++60266 60266 60266 45746 46260 46746 30840 30197 30069 28239 28239 28239 26342 26738 26738
++128 128 128 13872 10127 4336 63486 46079 19455 46996 34589 15727 51340 37280 15909
++63736 46260 19789 34164 24785 10813 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 385 385 334
++40349 51271 61680 42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535
++7829 9894 11719 257 257 257 53070 38550 16467 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++61861 44933 19292 17750 12880 5633 257 257 257 16576 19275 21848 42533 53970 64764
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++33153 41891 50372 1028 1285 1542 7197 7197 7197 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 63222 63222 63222 7197 7197 7197
++128 128 128 26085 33024 39578 42533 53970 64764 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 33153 41891 50372
++257 257 257 257 257 257 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 18336 18336 18336 128 128 128 1028 1028 1028
++57069 56684 56283 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++58889 58889 58889 22359 22625 23010 128 128 128 3857 3857 3857 47697 47615 47488
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 52685 52685 52685 55126 55126 55126 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 59538 59538 59538
++11370 11370 11370 128 128 128 28239 28239 28239 64124 64124 64124 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 63222 63222 63222 39900 39413 38599 3079 3079 3079 2056 2313 2822
++38406 38021 37650 61680 61680 61680 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 44589 44631 44888 1799 1799 1799 3079 3079 3079
++19317 19131 18746 18517 18517 18517 18517 18517 18517 17553 17553 17553 16762 16762 16762
++5911 5911 5911 0 0 0 2701 2701 2701 20263 20263 20263 13752 13752 13752
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 40833 41475 42019 60652 60652 60652 60652 60652 60652
++60933 60933 60933 60266 60266 60266 30840 30197 30069 42507 42507 42507 28239 28239 28239
++30840 30197 30069 43356 43080 42463 58889 58889 58889 47056 47056 47056 16136 16136 16136
++0 0 0 23177 16932 7265 63736 46260 19789 63486 46079 19455 63736 46260 19789
++46996 34589 15727 2402 1799 684 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 257 257 257 10999 12122 13073
++42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++12444 14392 17344 257 257 257 45225 33169 15226 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 59002 43055 18866
++13872 10127 4336 514 514 514 2827 3598 4240 40349 51271 61680 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++40349 51271 61680 128 128 128 257 257 257 62708 62708 62708 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 42507 42507 42507
++0 0 0 2827 3598 4240 40349 51271 61680 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764
++26085 33024 39578 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 18336 18336 18336 0 0 0 22359 22625 23010
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 48486 48538 48538
++10459 10459 10459 128 128 128 7197 7197 7197 50115 50774 49729 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 57069 56684 56283 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 46260 45809 45103
++128 128 128 15440 15440 15440 59538 59538 59538 65535 65535 65535 57470 57470 57470
++46260 45809 45103 47697 47615 47488 53256 53199 52942 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 52685 52685 52685 17553 17553 17553
++0 0 0 15440 15440 15440 49304 49177 49053 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 50115 50774 49729 16136 16136 16136
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++11370 11370 11370 22359 22625 23010 8455 8455 8455 385 385 334 9814 9814 9814
++20778 20778 20542 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 11370 11370 11370 59538 59538 59538 60652 60652 60652
++60652 60652 60652 60266 60266 60266 21838 21794 21532 48486 48538 48538 60266 60266 60266
++56283 56283 56283 35502 34869 34383 10459 10459 10459 0 0 0 0 0 0
++385 385 334 45225 33169 15226 63736 46260 19789 63736 46260 19789 48838 36002 16378
++2402 1799 684 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 26085 33024 39578
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++20214 22616 25648 642 642 899 37303 27193 11910 64250 47031 20303 63486 46079 19455
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 54363 39457 16879 10498 7619 3259
++0 0 0 6627 7270 8103 36810 46686 56154 42533 53970 64764 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 7829 9894 11719 0 0 0 44589 44631 44888 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65021 65021 65021
++13752 13752 13752 0 0 0 20214 22616 25648 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42533 53970 64764 16576 19275 21848 257 257 257 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 385 385 334 22881 22881 22881 0 0 0 40984 40984 40984
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 60266 60266 60266 31875 31875 31875 385 385 334
++257 257 257 10459 10459 10459 53256 53199 52942 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 64764 64764 64764 63222 63222 63222 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 33681 33681 33681
++0 0 0 40984 40984 40984 60652 60652 60652 31875 31875 31875 3079 3079 3079
++128 128 128 0 0 0 642 642 899 24991 24991 24991 53256 53199 52942
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 62708 62708 62708
++43356 43080 42463 11370 11370 11370 514 514 514 30583 30843 31357 57470 57470 57470
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 61680 61680 61680
++42507 42507 42507 33681 33681 33681 30840 30197 30069 38978 38978 38978 52119 52119 51914
++64124 64124 64124 65535 65535 65535 62065 62065 62065 43356 43080 42463 1799 1927 2184
++5911 5911 5911 16762 16762 16762 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 21838 21794 21532 60266 60266 60266
++60652 60652 60652 49621 49621 49607 40984 40984 40984 45746 46260 46746 21838 21794 21532
++1799 1799 1799 0 0 0 0 0 0 2402 1799 684 27882 20284 8738
++53070 38550 16467 63736 46260 19789 63736 46260 19789 63486 46079 19455 9123 6640 2832
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 2056 2313 2822 40349 51271 61680
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++23901 28398 32639 0 0 0 30933 22555 9803 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 59002 43055 18866 27882 20284 8738 875 620 271 642 642 899
++7829 9894 11719 40349 51271 61680 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 23007 25957 28667 0 0 0 24991 24991 24991 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++49621 49621 49607 128 128 128 1799 1927 2184 36810 46686 56154 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 40349 51271 61680 6627 7270 8103 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 7197 7197 7197 14506 14506 14506 0 0 0 52685 52685 52685
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++64124 64124 64124 47056 47056 47056 13752 13752 13752 128 128 128 128 128 128
++0 0 0 33681 33681 33681 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 18336 18336 18336
++0 0 0 45746 46260 46746 30840 30197 30069 257 257 257 1799 1799 1799
++31875 31875 31875 49304 49177 49053 53256 53199 52942 47056 47056 47056 38406 38021 37650
++64124 64124 64124 65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 60933 60933 60933 40984 40984 40984 7197 7197 7197 8455 8455 8455
++45746 46260 46746 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 42507 42507 42507
++642 642 899 18995 18995 18995 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 20263 20263 20263
++42507 42507 42507 17553 17553 17553 8455 8455 8455 385 385 334 0 0 0
++128 128 128 0 0 0 0 0 0 13872 10127 4336 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 8095 5986 2531
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 20214 22616 25648 42533 53970 64764
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++26085 33024 39578 642 642 899 22224 16071 6824 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 54363 39457 16879
++30933 22555 9803 4874 3558 1459 0 0 0 1413 1670 1799 23007 25957 28667
++40349 51271 61680 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 33153 41891 50372 642 642 899 3857 3857 3857 64507 64507 64507
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 20778 20778 20542 0 0 0 16576 19275 21848 42533 53970 64764
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 33153 41891 50372 0 0 0 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++257 257 257 28239 28239 28239 0 0 0 10459 10459 10459 63222 63222 63222
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 64507 64507 64507 47056 47056 47056
++20263 20263 20263 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 35838 35838 35838 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 61309 61309 61309 2313 2313 2313
++0 0 0 33681 33681 33681 0 0 0 0 0 0 46260 45809 45103
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 63607 63607 63607
++59538 59538 59538 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 65535 65535 65535 57069 56684 56283 24991 24991 24991
++1028 1028 1028 38978 38978 38978 64507 64507 64507 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++16762 16762 16762 17965 17965 17965 642 642 899 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 875 620 271 59002 43055 18866
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711 27882 20284 8738
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 257 257 257 33153 41891 50372 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++33153 41891 50372 0 0 0 3855 2930 1607 27882 20284 8738 45225 33169 15226
++41427 30069 13197 37303 27193 11910 30042 21792 9253 10498 7619 3259 0 0 0
++128 128 128 0 0 0 16576 19275 21848 36810 46686 56154 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 6627 7270 8103 0 0 0 48486 48538 48538
++65535 65535 65535 65535 65535 65535 38406 38021 37650 14506 14506 14506 61309 61309 61309
++65535 65535 65535 56283 56283 56283 1028 1028 1028 0 0 0 33153 41891 50372
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42533 53970 64764 20214 22616 25648 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 1799 1799 1799
++21838 21794 21532 3857 3857 3857 0 0 0 30840 30197 30069 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 59538 59538 59538 43356 43080 42463 20263 20263 20263 0 0 0
++0 0 0 1028 1285 1542 19317 19131 18746 24991 24991 24991 0 0 0
++0 0 0 35838 35838 35838 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 64764 64764 64764 8455 8455 8455
++257 257 257 0 0 0 0 0 0 4480 4480 4480 62065 62065 62065
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 63607 63607 63607
++40984 40984 40984 1799 1927 2184 30583 30843 31357 62065 62065 62065 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++26342 26738 26738 6810 6810 6810 11370 11370 11370 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 40410 29471 12985
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 45225 33169 15226
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7598 8369 9034 257 257 257 7829 9894 11719 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42533 53970 64764 12444 14392 17344 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 4615 5268 6322
++20214 22616 25648 33153 41891 50372 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 20214 22616 25648 642 642 899 26342 26738 26738
++65535 65535 65535 65535 65535 65535 22881 22881 22881 0 0 0 40833 41475 42019
++65535 65535 65535 65535 65535 65535 28239 28239 28239 257 257 257 10999 12122 13073
++42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 40349 51271 61680 6627 7270 8103
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 5911 5911 5911 20778 20778 20542
++514 514 514 0 0 0 5911 5911 5911 49621 49621 49607 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 64124 64124 64124 53256 53199 52942 44589 44631 44888
++28239 28239 28239 3857 3857 3857 128 128 128 0 0 0 385 385 334
++16136 16136 16136 18336 18336 18336 1413 1670 1799 17965 17965 17965 0 0 0
++128 128 128 38406 38021 37650 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 22881 22881 22881
++0 0 0 0 0 0 128 128 128 12931 12931 12931 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 58889 58889 58889
++52685 52685 52685 49621 49621 49607 51400 51400 51400 62708 62708 62708 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 51400 51400 51400 14506 14506 14506 21838 21794 21532 58889 58889 58889
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++38978 38978 38978 128 128 128 17553 17553 17553 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 22224 16071 6824
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 62486 45353 19401
++3038 2204 899 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 1028 1285 1542 16576 19275 21848 33153 41891 50372
++7829 9894 11719 0 0 0 26085 33024 39578 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42533 53970 64764 36810 46686 56154 23901 28398 32639 16576 19275 21848
++16576 19275 21848 20214 22616 25648 23901 28398 32639 33153 41891 50372 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 33153 41891 50372 0 0 0 6427 6427 6427
++65278 65278 65278 65535 65535 65535 38978 38978 38978 128 128 128 26055 26184 25186
++65535 65535 65535 65535 65535 65535 61309 61309 61309 3857 3857 3857 1028 1285 1542
++26085 33024 39578 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764 33153 41891 50372
++257 257 257 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 12931 12931 12931 16136 16136 16136 257 257 257
++0 0 0 16762 16762 16762 55126 54741 54484 65021 65021 65021 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 63607 63607 63607 51400 51400 51400
++40984 40984 40984 28239 28239 28239 10459 10459 10459 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 14506 14506 14506 18995 18995 18995
++3079 3079 3079 0 0 0 0 0 0 17553 17553 17553 0 0 0
++0 0 0 35838 35838 35838 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 40833 41475 42019
++128 128 128 3857 3857 3857 2701 2701 2701 28239 28239 28239 65535 65535 65535
++65535 65535 65535 65535 65535 65535 64507 64507 64507 35838 35838 35838 1799 1927 2184
++0 0 0 0 0 0 128 128 128 7197 7197 7197 28239 28239 28239
++46260 45809 45103 65021 65021 65021 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 60933 60933 60933 38406 38021 37650 16762 16762 16762
++55126 54741 54484 65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++49621 49621 49607 128 128 128 17553 17553 17553 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 3855 2930 1607
++63236 45897 19634 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++20895 15087 6460 0 0 0 0 0 0 0 0 0 0 0 0
++10999 12122 13073 26085 33024 39578 40349 51271 61680 42533 53970 64764 33153 41891 50372
++514 514 514 1799 1927 2184 40349 51271 61680 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42533 53970 64764 1413 1670 1799 0 0 0
++57470 57470 57470 65535 65535 65535 55126 55126 55126 0 0 0 9814 9814 9814
++65535 65535 65535 65535 65535 65535 65535 65535 65535 35838 35838 35838 128 128 128
++6627 7270 8103 42533 53970 64764 42533 53970 64764 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764
++16576 19275 21848 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 12931 12931 12931 11370 11370 11370 128 128 128 385 385 334
++33681 33681 33681 61309 61309 61309 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 53256 53199 52942 35502 34869 34383 11370 11370 11370 0 0 0
++0 0 0 128 128 128 0 0 0 0 0 0 1799 1927 2184
++16136 16136 16136 18995 18995 18995 20263 20263 20263 4480 4480 4480 0 0 0
++0 0 0 0 0 0 0 0 0 14506 14506 14506 2701 2701 2701
++385 385 334 26342 26738 26738 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 59538 59538 59538
++5911 5911 5911 13752 13752 13752 57069 56684 56283 51400 51400 51400 65535 65535 65535
++65535 65535 65535 65535 65535 65535 50115 50774 49729 0 0 0 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 30840 30197 30069 59538 59538 59538 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 55126 54741 54484
++30583 30843 31357 31875 31875 31875 44589 44631 44888 57069 56684 56283 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++51400 51400 51400 0 0 0 16762 16762 16762 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++48838 36002 16378 63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19455
++40410 29471 12985 0 0 0 2827 3598 4240 23901 28398 32639 36810 46686 56154
++42919 54484 65535 42533 53970 64764 42919 54484 65535 42919 54484 65535 16576 19275 21848
++0 0 0 20214 22616 25648 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 36810 46686 56154 0 0 0 3857 3857 3857
++64764 64764 64764 65535 65535 65535 65535 65535 65535 9814 9814 9814 0 0 0
++45746 46260 46746 65535 65535 65535 65535 65535 65535 64124 64124 64124 9814 9814 9814
++0 0 0 23901 28398 32639 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++36810 46686 56154 642 642 899 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++3857 3857 3857 18336 18336 18336 128 128 128 1028 1285 1542 42507 42507 42507
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 61680 61680 61680
++38406 38021 37650 2056 2313 2822 0 0 0 128 128 128 0 0 0
++0 0 0 10459 10459 10459 19317 19131 18746 20263 20263 20263 16762 16762 16762
++3857 3857 3857 0 0 0 0 0 0 0 0 0 128 128 128
++0 0 0 0 0 0 0 0 0 3857 3857 3857 14506 14506 14506
++0 0 0 11370 11370 11370 65021 65021 65021 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++44589 44631 44888 10459 10459 10459 65021 65021 65021 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 45746 46260 46746 0 0 0 0 0 0
++0 0 0 0 0 0 12931 12931 12931 26055 26184 25186 11370 11370 11370
++0 0 0 0 0 0 18517 18517 18517 61309 61309 61309 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65021 65021 65021 56283 56283 56283 55126 55126 55126 62708 62708 62708 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++52119 52119 51914 0 0 0 16762 16762 16762 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++19371 14059 6014 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++57142 41714 18588 875 620 271 642 642 899 40349 51271 61680 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 40349 51271 61680 1028 1285 1542
++257 257 257 33153 41891 50372 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 40349 51271 61680 36810 46686 56154
++36810 46686 56154 42533 53970 64764 42533 53970 64764 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 26085 33024 39578 0 0 0 20263 20263 20263
++65535 65535 65535 65535 65535 65535 65535 65535 65535 40984 40984 40984 257 257 257
++11370 11370 11370 64507 64507 64507 65535 65535 65535 65535 65535 65535 45746 46260 46746
++0 0 0 642 642 899 33153 41891 50372 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 20214 22616 25648 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++17553 17553 17553 128 128 128 1772 1533 1155 40984 40984 40984 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 56026 55897 55897 18517 18517 18517
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 18517 18517 18517 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 17965 17965 17965
++0 0 0 642 642 899 57470 57470 57470 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65021 65021 65021 58889 58889 58889 52119 52119 51914
++52685 52685 52685 57470 57470 57470 62708 62708 62708 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++64764 64764 64764 30583 30843 31357 55126 54741 54484 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 52119 52119 51914 1028 1028 1028 0 0 0
++0 0 0 0 0 0 5911 5911 5911 59538 59538 59538 62065 62065 62065
++35838 35838 35838 1028 1028 1028 257 257 257 31875 31875 31875 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++49621 49621 49607 0 0 0 16762 16762 16762 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++2402 1799 684 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 13872 10127 4336 128 128 128 33667 36494 42587 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 23901 28398 32639 0 0 0
++12444 14392 17344 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 40349 51271 61680 33153 41891 50372 23007 25957 28667
++10999 12122 13073 2827 3598 4240 385 385 334 128 128 128 642 642 899
++0 0 0 385 385 334 4615 5268 6322 12444 14392 17344 20214 22616 25648
++33153 41891 50372 42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42533 53970 64764 23007 25957 28667 128 128 128 31875 31875 31875
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65021 65021 65021 11370 11370 11370
++128 128 128 33681 33681 33681 65535 65535 65535 65535 65535 65535 65278 65278 65278
++24991 24991 24991 642 642 899 7829 9894 11719 42533 53970 64764 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 36810 46686 56154 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++17553 17553 17553 128 128 128 28239 28239 28239 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 50115 51271 50886 9814 9814 9814 128 128 128
++0 0 0 14506 14506 14506 18711 18711 18711 24991 24991 24991 128 128 128
++0 0 0 18517 18517 18517 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 18336 18336 18336
++0 0 0 0 0 0 49304 49177 49053 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 33681 33681 33681 2701 2701 2701 18995 18995 18995
++35502 34869 34383 47056 47056 47056 58889 58889 58889 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 63222 63222 63222 55126 55126 55126 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 31875 31875 31875 257 257 257
++0 0 0 0 0 0 1799 1799 1799 57470 57470 57470 65278 65278 65278
++65535 65535 65535 48486 48538 48538 11370 11370 11370 0 0 0 44589 44631 44888
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++45746 46260 46746 128 128 128 20778 20778 20542 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 7598 8369 9034 26085 33024 39578 1028 1285 1542
++0 0 0 50159 36373 15650 63359 45859 19672 63736 46260 19789 63736 46260 19789
++63736 46260 19789 34164 24785 10813 0 0 0 16576 19275 21848 42533 53970 64764
++42919 54484 65535 42919 54484 65535 42533 53970 64764 6627 7270 8103 0 0 0
++26085 33024 39578 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++36810 46686 56154 23007 25957 28667 1028 1285 1542 0 0 0 0 0 0
++642 642 899 0 0 0 0 0 0 1028 1028 1028 4480 4480 4480
++5911 5911 5911 0 0 0 128 128 128 0 0 0 0 0 0
++0 0 0 4615 5268 6322 23901 28398 32639 36810 46686 56154 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 20214 22616 25648 642 642 899 31875 31875 31875
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 52685 52685 52685
++1028 1028 1028 1413 1670 1799 55126 54741 54484 65535 65535 65535 65535 65535 65535
++61309 61309 61309 6427 6427 6427 0 0 0 23901 28398 32639 42533 53970 64764
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 33667 36494 42587 642 642 899 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 1799 1927 2184
++15440 15440 15440 0 0 0 55126 54741 54484 65535 65535 65535 65535 65535 65535
++61680 61680 61680 49621 49621 49607 38406 38021 37650 35838 35838 35838 49304 49177 49053
++49304 49177 49053 30840 30197 30069 3079 3079 3079 0 0 0 0 0 0
++18995 18995 18995 4480 4480 4480 0 0 0 17965 17965 17965 0 0 0
++0 0 0 18517 18517 18517 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 18336 18336 18336
++0 0 0 0 0 0 42507 42507 42507 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 60933 60933 60933 2827 3598 4240 35502 34869 34383 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 63222 63222 63222 43356 43080 42463
++24991 24991 24991 30840 30197 30069 46260 45809 45103 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 57470 57470 57470 11370 11370 11370 10459 10459 10459
++62065 62065 62065 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++38978 38978 38978 0 0 0 20263 20263 20263 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 7598 8369 9034 36810 46686 56154 42919 54484 65535 12444 14392 17344
++0 0 0 20895 15087 6460 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 51340 37280 15909 257 257 257 2827 3598 4240 42919 54484 65535
++42919 54484 65535 42533 53970 64764 33667 36494 42587 0 0 0 4615 5268 6322
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 40349 51271 61680 20214 22616 25648
++642 642 899 128 128 128 0 0 0 12931 12931 12931 28239 28239 28239
++43356 43080 42463 57470 57470 57470 63222 63222 63222 65535 65535 65535 65535 65535 65535
++65535 65535 65535 62708 62708 62708 53256 53199 52942 44589 44631 44888 30840 30197 30069
++7197 7197 7197 0 0 0 128 128 128 2056 2313 2822 26085 33024 39578
++42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42533 53970 64764 26085 33024 39578 0 0 0 17553 17553 17553
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++30583 30843 31357 0 0 0 28239 28239 28239 65535 65535 65535 65535 65535 65535
++65535 65535 65535 45746 46260 46746 257 257 257 128 128 128 36810 46686 56154
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 20214 22616 25648 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 16136 16136 16136
++1028 1028 1028 1028 1028 1028 60266 60266 60266 57069 56684 56283 33681 33681 33681
++4480 4480 4480 257 257 257 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 18336 18336 18336
++5911 5911 5911 0 0 0 0 0 0 17965 17965 17965 0 0 0
++0 0 0 18517 18517 18517 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 18517 18517 18517
++0 0 0 0 0 0 38406 38021 37650 65021 65021 65021 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 60933 60933 60933 13752 13752 13752 52119 52119 51914 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 47697 47615 47488 642 642 899
++46260 45809 45103 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++20263 20263 20263 0 0 0 18995 18995 18995 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 33153 41891 50372 42919 54484 65535 42919 54484 65535 20214 22616 25648
++642 642 899 257 257 257 4874 3558 1459 10498 7619 3259 41427 30069 13197
++63736 46260 19789 63736 46260 19789 7209 5285 2184 128 128 128 33153 41891 50372
++42919 54484 65535 42919 54484 65535 12444 14392 17344 385 385 334 23901 28398 32639
++42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 33153 41891 50372 7598 8369 9034 128 128 128
++257 257 257 20778 20778 20542 50115 51271 50886 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65021 65021 65021 48486 48538 48538 18711 18711 18711 0 0 0 0 0 0
++10999 12122 13073 36810 46686 56154 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 40349 51271 61680 128 128 128 642 642 899
++56026 55897 55897 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++64124 64124 64124 35838 35838 35838 55531 55531 55531 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 22881 22881 22881 257 257 257 7829 9894 11719
++42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 7829 9894 11719 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 18517 18517 18517
++0 0 0 4480 4480 4480 35838 35838 35838 4480 4480 4480 0 0 0
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 17553 17553 17553 7197 7197 7197
++0 0 0 0 0 0 0 0 0 17965 17965 17965 0 0 0
++0 0 0 18517 18517 18517 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 18517 18517 18517
++0 0 0 0 0 0 40984 40984 40984 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 64764 64764 64764 59538 59538 59538 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 33681 33681 33681
++24991 24991 24991 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 51400 51400 51400
++385 385 334 2313 2313 2313 16762 16762 16762 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 257 257 257
++10999 12122 13073 42919 54484 65535 42919 54484 65535 26085 33024 39578 257 257 257
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++22224 16071 6824 64250 47031 20303 25195 18262 7789 257 257 257 23007 25957 28667
++42533 53970 64764 26085 33024 39578 128 128 128 642 642 899 36810 46686 56154
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 26085 33024 39578 1028 1285 1542 0 0 0 11370 11370 11370
++53256 53199 52942 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 42507 42507 42507 5911 5911 5911
++0 0 0 4615 5268 6322 33153 41891 50372 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 16576 19275 21848 385 385 334
++28239 28239 28239 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 61680 61680 61680 4480 4480 4480 0 0 0
++23901 28398 32639 42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764
++36810 46686 56154 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 11370 11370 11370
++9814 9814 9814 0 0 0 128 128 128 0 0 0 13752 13752 13752
++20263 20263 20263 18517 18517 18517 17965 17965 17965 17553 17553 17553 16762 16762 16762
++18517 18517 18517 18517 18517 18517 20263 20263 20263 7197 7197 7197 257 257 257
++0 0 0 0 0 0 0 0 0 18336 18336 18336 0 0 0
++0 0 0 18517 18517 18517 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 18517 18517 18517
++0 0 0 0 0 0 44589 44631 44888 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 62708 62708 62708 53256 53199 52942 49304 49177 49053
++57470 57470 57470 65021 65021 65021 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++62065 62065 62065 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 60266 60266 60266
++13752 13752 13752 58889 58889 58889 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 57470 57470 57470 10459 10459 10459
++0 0 0 19317 19131 18746 1413 1670 1799 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++23901 28398 32639 42919 54484 65535 42919 54484 65535 33153 41891 50372 7829 9894 11719
++23007 25957 28667 36810 46686 56154 36810 46686 56154 26085 33024 39578 642 642 899
++514 514 514 46996 34589 15727 45225 33169 15226 0 0 0 1028 1285 1542
++642 642 899 385 385 334 128 128 128 10999 12122 13073 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++33667 36494 42587 1028 1285 1542 0 0 0 26342 26738 26738 63222 63222 63222
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 60933 60933 60933
++16762 16762 16762 0 0 0 2827 3598 4240 33153 41891 50372 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 33153 41891 50372 128 128 128
++3857 3857 3857 62065 62065 62065 65535 65535 65535 65535 65535 65535 65535 65535 65535
++64124 64124 64124 18336 18336 18336 31875 31875 31875 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 45746 46260 46746 0 0 0
++642 642 899 33153 41891 50372 42919 54484 65535 42919 54484 65535 40349 51271 61680
++7829 9894 11719 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++18711 18711 18711 18711 18711 18711 17965 17965 17965 18995 18995 18995 5911 5911 5911
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18336 18336 18336 0 0 0
++0 0 0 18336 18336 18336 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 18517 18517 18517
++0 0 0 0 0 0 49304 49177 49053 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 64764 64764 64764 50115 50774 49729
++26342 26738 26738 24991 24991 24991 60266 60266 60266 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 64764 64764 64764 51400 51400 51400
++61309 61309 61309 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++35838 35838 35838 53256 53199 52942 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 60652 60652 60652 16136 16136 16136 0 0 0
++3079 3079 3079 17553 17553 17553 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 642 642 899
++20214 22616 25648 42919 54484 65535 42919 54484 65535 42533 53970 64764 42919 54484 65535
++42533 53970 64764 42533 53970 64764 42919 54484 65535 42533 53970 64764 23007 25957 28667
++0 0 0 19371 14059 6014 61861 44933 19292 3038 2204 899 128 128 128
++0 0 0 0 0 0 642 642 899 23901 28398 32639 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764 33153 41891 50372
++1028 1285 1542 0 0 0 30840 30197 30069 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++63222 63222 63222 17553 17553 17553 128 128 128 2827 3598 4240 36810 46686 56154
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 10999 12122 13073
++0 0 0 35838 35838 35838 65535 65535 65535 65535 65535 65535 65535 65535 65535
++61309 61309 61309 0 0 0 6427 6427 6427 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 18711 18711 18711
++642 642 899 7829 9894 11719 42533 53970 64764 42919 54484 65535 16576 19275 21848
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 257 257 257 0 0 0 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18336 18336 18336 0 0 0
++0 0 0 18517 18517 18517 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 18517 18517 18517
++0 0 0 0 0 0 45746 46260 46746 65278 65278 65278 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65021 65021 65021 28239 28239 28239 21838 21794 21532 63222 63222 63222 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 43356 43080 42463 53256 53199 52942
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++50115 51271 50886 49304 49177 49053 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 63222 63222 63222 22359 22625 23010 0 0 0 1028 1285 1542
++22881 22881 22881 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++10999 12122 13073 42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 26085 33024 39578
++1028 1285 1542 17750 12880 5633 63736 46260 19789 19371 14059 6014 0 0 0
++0 0 0 0 0 0 0 0 0 36810 46686 56154 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 40349 51271 61680 2827 3598 4240
++128 128 128 26342 26738 26738 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 63607 63607 63607 16762 16762 16762 0 0 0 7829 9894 11719
++42919 54484 65535 42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 33667 36494 42587
++642 642 899 6427 6427 6427 64124 64124 64124 65535 65535 65535 65535 65535 65535
++65535 65535 65535 5911 5911 5911 0 0 0 62065 62065 62065 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 61309 61309 61309
++642 642 899 0 0 0 23901 28398 32639 26085 33024 39578 0 0 0
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18336 18336 18336 0 0 0
++0 0 0 18517 18517 18517 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 18517 18517 18517
++0 0 0 0 0 0 33681 33681 33681 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 57470 57470 57470 9814 9814 9814 38978 38978 38978 65535 65535 65535
++65535 65535 65535 65535 65535 65535 57470 57470 57470 35502 34869 34383 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++63222 63222 63222 50115 51271 50886 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++61680 61680 61680 28239 28239 28239 0 0 0 1028 1028 1028 24991 24991 24991
++1028 1285 1542 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++642 642 899 23007 25957 28667 42533 53970 64764 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42533 53970 64764 36810 46686 56154 10999 12122 13073
++0 0 0 25195 18262 7789 63236 45897 19634 40410 29471 12985 0 0 0
++0 0 0 0 0 0 7829 9894 11719 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 16576 19275 21848 0 0 0
++14506 14506 14506 64764 64764 64764 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 60266 60266 60266 5911 5911 5911 642 642 899
++23007 25957 28667 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764
++7598 8369 9034 0 0 0 40984 40984 40984 65535 65535 65535 65535 65535 65535
++65535 65535 65535 18711 18711 18711 0 0 0 56283 56283 56283 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++22359 22625 23010 128 128 128 257 257 257 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18517 18517 18517 0 0 0
++0 0 0 18517 18517 18517 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 17965 17965 17965
++514 514 514 0 0 0 10459 10459 10459 53256 53199 52942 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 46260 45809 45103 2056 2313 2822 55126 54741 54484
++65278 65278 65278 65535 65535 65535 42507 42507 42507 48486 48538 48538 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 58889 58889 58889 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 55531 55531 55531
++18995 18995 18995 0 0 0 2701 2701 2701 22881 22881 22881 1799 1799 1799
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 2056 2313 2822 12444 14392 17344 20214 22616 25648
++16576 19275 21848 7829 9894 11719 2056 2313 2822 0 0 0 0 0 0
++7209 5285 2184 54363 39457 16879 63864 46774 20174 57142 41714 18588 128 128 128
++0 0 0 0 0 0 23007 25957 28667 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 33153 41891 50372 0 0 0 1799 1927 2184
++55126 54741 54484 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 47697 47615 47488 128 128 128
++642 642 899 33153 41891 50372 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++26085 33024 39578 128 128 128 11370 11370 11370 65535 65535 65535 65535 65535 65535
++65535 65535 65535 57470 57470 57470 46260 45809 45103 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++55126 54741 54484 0 0 0 128 128 128 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18517 18517 18517 0 0 0
++0 0 0 18517 18517 18517 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 7197 7197 7197
++13752 13752 13752 0 0 0 0 0 0 1799 1799 1799 33681 33681 33681
++64764 64764 64764 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 64764 64764 64764 28239 28239 28239 26342 26738 26738
++65021 65021 65021 65535 65535 65535 31875 31875 31875 61680 61680 61680 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 64124 64124 64124 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 47056 47056 47056 7197 7197 7197
++128 128 128 4480 4480 4480 22359 22625 23010 514 514 514 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 642 642 899
++257 257 257 128 128 128 0 0 0 385 385 334 19371 14059 6014
++59002 43055 18866 63736 46260 19789 63736 46260 19789 63486 46079 19455 13872 10127 4336
++0 0 0 642 642 899 33153 41891 50372 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42533 53970 64764 12444 14392 17344 128 128 128 31875 31875 31875
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 26342 26738 26738
++257 257 257 12444 14392 17344 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++40349 51271 61680 0 0 0 257 257 257 64124 64124 64124 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 11370 11370 11370 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18336 18336 18336 0 0 0
++0 0 0 18517 18517 18517 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++11370 11370 11370 21292 21292 21292 9814 9814 9814 0 0 0 0 0 0
++53256 53199 52942 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 53256 53199 52942 1799 1927 2184
++47697 47615 47488 60933 60933 60933 28239 28239 28239 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 56026 55897 55897 31875 31875 31875 1028 1028 1028 0 0 0
++9814 9814 9814 19317 19131 18746 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 385 385 334 59002 43055 18866
++63486 46079 19455 63736 46260 19789 63736 46260 19789 63736 46260 19789 30042 21792 9253
++0 0 0 642 642 899 42533 53970 64764 42919 54484 65535 42919 54484 65535
++42919 54484 65535 36810 46686 56154 642 642 899 514 514 514 59538 59538 59538
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 59538 59538 59538
++1799 1799 1799 128 128 128 33153 41891 50372 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 2827 3598 4240 128 128 128 56283 56283 56283 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 33681 33681 33681 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18517 18517 18517 0 0 0
++0 0 0 18517 18517 18517 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++128 128 128 0 0 0 20263 20263 20263 0 0 0 0 0 0
++51400 51400 51400 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 30583 30843 31357
++16762 16762 16762 49621 49621 49607 35502 34869 34383 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 58889 58889 58889
++35838 35838 35838 3857 3857 3857 128 128 128 0 0 0 18336 18336 18336
++11370 11370 11370 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 40410 29471 12985
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 37303 27193 11910
++514 514 514 7829 9894 11719 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 23901 28398 32639 0 0 0 18995 18995 18995 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++28239 28239 28239 257 257 257 12444 14392 17344 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 7829 9894 11719 0 0 0 48486 48538 48538 65535 65535 65535
++65535 65535 65535 65535 65535 65535 55126 54741 54484 20263 20263 20263 55126 54741 54484
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 51400 51400 51400 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18517 18517 18517 0 0 0
++0 0 0 18517 18517 18517 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 18995 18995 18995 0 0 0 0 0 0
++48486 48538 48538 65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 55126 55126 55126
++2313 2313 2313 11370 11370 11370 44589 44631 44888 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 60266 60266 60266 38978 38978 38978 6427 6427 6427
++0 0 0 0 0 0 5911 5911 5911 21838 21794 21532 3079 3079 3079
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 22224 16071 6824
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 34164 24785 10813
++0 0 0 20214 22616 25648 42533 53970 64764 42919 54484 65535 42919 54484 65535
++42919 54484 65535 6627 7270 8103 128 128 128 43356 43080 42463 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++58889 58889 58889 1413 1670 1799 257 257 257 40349 51271 61680 42533 53970 64764
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 16576 19275 21848 0 0 0 40984 40984 40984 65278 65278 65278
++65535 65535 65535 65535 65535 65535 31875 31875 31875 0 0 0 30840 30197 30069
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 64124 64124 64124 2313 2313 2313 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18517 18517 18517 0 0 0
++0 0 0 18517 18517 18517 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 18336 18336 18336 514 514 514 0 0 0
++45746 46260 46746 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++33681 33681 33681 257 257 257 51400 51400 51400 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 64507 64507 64507
++51400 51400 51400 35838 35838 35838 9814 9814 9814 0 0 0 257 257 257
++3079 3079 3079 0 0 0 17965 17965 17965 4480 4480 4480 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 3855 2930 1607
++62737 45569 19692 63736 46260 19789 63736 46260 19789 63736 46260 19789 19371 14059 6014
++0 0 0 26085 33024 39578 42919 54484 65535 42919 54484 65535 42533 53970 64764
++33153 41891 50372 0 0 0 4480 4480 4480 64124 64124 64124 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 16762 16762 16762 514 514 514 26085 33024 39578 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 20214 22616 25648 0 0 0 33681 33681 33681 65535 65535 65535
++65535 65535 65535 65278 65278 65278 33681 33681 33681 128 128 128 26342 26738 26738
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 16136 16136 16136 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18517 18517 18517 0 0 0
++0 0 0 18517 18517 18517 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 10459 10459 10459 8455 8455 8455 0 0 0
++40984 40984 40984 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++56026 55897 55897 3079 3079 3079 26055 26184 25186 65021 65021 65021 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 58889 58889 58889 53256 53199 52942 44589 44631 44888
++38406 38021 37650 42507 42507 42507 48486 48538 48538 53256 53199 52942 58889 58889 58889
++57069 56684 56283 9814 9814 9814 0 0 0 21292 21292 21292 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++46996 34589 15727 63736 46260 19789 63736 46260 19789 63736 46260 19789 7209 5285 2184
++128 128 128 33153 41891 50372 42919 54484 65535 42919 54484 65535 42919 54484 65535
++16576 19275 21848 514 514 514 26342 26738 26738 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 35502 34869 34383 0 0 0 16576 19275 21848 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 23007 25957 28667 642 642 899 31875 31875 31875 65535 65535 65535
++65535 65535 65535 65535 65535 65535 35502 34869 34383 128 128 128 24991 24991 24991
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 31875 31875 31875 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 16762 16762 16762 0 0 0
++0 0 0 18517 18517 18517 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 1028 1028 1028 17553 17553 17553 128 128 128
++35838 35838 35838 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 35502 34869 34383 128 128 128 46260 45809 45103 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 48486 48538 48538 1028 1028 1028 6427 6427 6427 21292 21292 21292
++257 257 257 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++30042 21792 9253 63736 46260 19789 63736 46260 19789 62486 45353 19401 128 128 128
++0 0 0 42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535
++4615 5268 6322 0 0 0 52685 52685 52685 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 52119 52119 51914 257 257 257 4615 5268 6322 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42533 53970 64764 20214 22616 25648 0 0 0 38406 38021 37650 65535 65535 65535
++65535 65535 65535 65535 65535 65535 40984 40984 40984 0 0 0 14506 14506 14506
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 47056 47056 47056 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 16762 16762 16762 128 128 128
++0 0 0 18517 18517 18517 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18995 18995 18995 0 0 0
++30840 30197 30069 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 57470 57470 57470 3857 3857 3857 10459 10459 10459 59538 59538 59538
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 38978 38978 38978 1413 1670 1799 2701 2701 2701
++22881 22881 22881 3857 3857 3857 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++10498 7619 3259 63736 46260 19789 63736 46260 19789 55635 40828 18345 128 128 128
++2827 3598 4240 42533 53970 64764 42919 54484 65535 42919 54484 65535 40349 51271 61680
++0 0 0 1799 1799 1799 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65021 65021 65021 4480 4480 4480 0 0 0 36810 46686 56154
++42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 16576 19275 21848 0 0 0 42507 42507 42507 65278 65278 65278
++65535 65535 65535 65535 65535 65535 58889 58889 58889 257 257 257 0 0 0
++57470 57470 57470 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 49304 49177 49053 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 17553 17553 17553 0 0 0
++0 0 0 18517 18517 18517 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18995 18995 18995 128 128 128
++9814 9814 9814 57470 57470 57470 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 35838 35838 35838 385 385 334 31875 31875 31875
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 51400 51400 51400 14506 14506 14506
++128 128 128 20263 20263 20263 5911 5911 5911 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 55635 40828 18345 63486 46079 19455 50159 36373 15650 0 0 0
++7829 9894 11719 42919 54484 65535 42919 54484 65535 42919 54484 65535 33153 41891 50372
++128 128 128 10459 10459 10459 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 21838 21794 21532 642 642 899 23901 28398 32639
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42533 53970 64764 12444 14392 17344 0 0 0 47056 47056 47056 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 14506 14506 14506 0 0 0
++31875 31875 31875 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 43356 43080 42463 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 17553 17553 17553 0 0 0
++0 0 0 18711 18711 18711 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18995 18995 18995 0 0 0
++0 0 0 6810 6810 6810 26055 26184 25186 31875 31875 31875 42507 42507 42507
++64507 64507 64507 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 57470 57470 57470 7197 7197 7197 1028 1028 1028
++49621 49621 49607 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 59538 59538 59538
++21838 21794 21532 257 257 257 20778 20778 20542 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 36240 26320 11215 63736 46260 19789 43194 31354 13386 0 0 0
++12444 14392 17344 42919 54484 65535 42919 54484 65535 42919 54484 65535 33667 36494 42587
++128 128 128 20263 20263 20263 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 38978 38978 38978 128 128 128 12444 14392 17344
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 7829 9894 11719 257 257 257 49304 49177 49053 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 38978 38978 38978 0 0 0
++1799 1799 1799 55126 55126 55126 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 35838 35838 35838 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 17553 17553 17553 257 257 257
++0 0 0 18711 18711 18711 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18995 18995 18995 0 0 0
++0 0 0 0 0 0 128 128 128 0 0 0 0 0 0
++38406 38021 37650 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 44589 44631 44888 0 0 0
++16136 16136 16136 61680 61680 61680 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++49304 49177 49053 0 0 0 14506 14506 14506 4480 4480 4480 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 17750 12880 5633 57142 41714 18588 28744 20827 9121 642 642 899
++16576 19275 21848 42919 54484 65535 42919 54484 65535 42533 53970 64764 23901 28398 32639
++257 257 257 28239 28239 28239 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 57470 57470 57470 0 0 0 2056 2313 2822
++42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42533 53970 64764 16576 19275 21848 0 0 0 38978 38978 38978 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65021 65021 65021 13752 13752 13752
++128 128 128 14506 14506 14506 64124 64124 64124 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 30840 30197 30069 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 10459 10459 10459 6810 6810 6810
++0 0 0 17553 17553 17553 1028 1285 1542 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 3079 3079 3079 21838 21794 21532
++18517 18517 18517 18711 18711 18711 8455 8455 8455 0 0 0 0 0 0
++642 642 899 55126 54741 54484 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 64764 64764 64764 28239 28239 28239
++128 128 128 35502 34869 34383 64764 64764 64764 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++55531 55531 55531 0 0 0 8455 8455 8455 9814 9814 9814 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 0 0 0
++20214 22616 25648 42533 53970 64764 42919 54484 65535 42919 54484 65535 16576 19275 21848
++642 642 899 38978 38978 38978 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 3079 3079 3079 0 0 0
++40349 51271 61680 42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 23901 28398 32639 128 128 128 24991 24991 24991 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 55126 54741 54484
++2701 2701 2701 257 257 257 18711 18711 18711 56026 55897 55897 65535 65535 65535
++65535 65535 65535 65535 65535 65535 22881 22881 22881 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 3079 3079 3079 15440 15440 15440
++0 0 0 7197 7197 7197 11370 11370 11370 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 11370 11370 11370 21292 21292 21292 0 0 0
++0 0 0 44589 44631 44888 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 58889 58889 58889
++10459 10459 10459 0 0 0 40833 41475 42019 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++38978 38978 38978 0 0 0 16136 16136 16136 3079 3079 3079 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++16576 19275 21848 42919 54484 65535 42919 54484 65535 42919 54484 65535 10999 12122 13073
++0 0 0 47697 47615 47488 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 6810 6810 6810 0 0 0
++36810 46686 56154 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 33153 41891 50372 128 128 128 1799 1799 1799 57470 57470 57470
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++49304 49177 49053 2701 2701 2701 0 0 0 642 642 899 24991 24991 24991
++56026 55897 55897 65535 65535 65535 24991 24991 24991 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 17965 17965 17965
++0 0 0 0 0 0 18711 18711 18711 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18711 18711 18711 0 0 0
++0 0 0 38406 38021 37650 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++48486 48538 48538 2313 2313 2313 1772 1533 1155 47056 47056 47056 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 62708 62708 62708 38978 38978 38978
++2701 2701 2701 0 0 0 20778 20778 20542 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++12444 14392 17344 42919 54484 65535 42919 54484 65535 42919 54484 65535 4615 5268 6322
++0 0 0 56283 56283 56283 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 9814 9814 9814 0 0 0
++33153 41891 50372 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 16576 19275 21848 128 128 128 22881 22881 22881
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 46260 45809 45103 0 0 0 0 0 0 0 0 0
++0 0 0 7197 7197 7197 8455 8455 8455 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 17553 17553 17553
++0 0 0 0 0 0 18517 18517 18517 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 10459 10459 10459 8455 8455 8455
++0 0 0 8455 8455 8455 40833 41475 42019 49621 49621 49607 57470 57470 57470
++64507 64507 64507 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 44589 44631 44888 385 385 334 4480 4480 4480 43356 43080 42463
++64124 64124 64124 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 62065 62065 62065
++57470 57470 57470 52685 52685 52685 48486 48538 48538 44589 44631 44888 46260 45809 45103
++47697 47615 47488 50115 50774 49729 51400 51400 51400 55126 54741 54484 56026 55897 55897
++50115 50774 49729 42507 42507 42507 33681 33681 33681 12931 12931 12931 0 0 0
++128 128 128 16136 16136 16136 8455 8455 8455 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++12444 14392 17344 42919 54484 65535 42919 54484 65535 42919 54484 65535 2056 2313 2822
++257 257 257 57470 57470 57470 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65278 65278 65278 13752 13752 13752 0 0 0
++33153 41891 50372 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 36810 46686 56154 1028 1285 1542 385 385 334
++42507 42507 42507 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 52685 52685 52685 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 17553 17553 17553
++0 0 0 0 0 0 18336 18336 18336 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 1028 1028 1028 20263 20263 20263
++0 0 0 0 0 0 128 128 128 0 0 0 642 642 899
++11370 11370 11370 55126 54741 54484 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 39900 39413 38599 642 642 899 0 0 0
++24991 24991 24991 55126 54741 54484 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 60933 60933 60933
++50115 50774 49729 38978 38978 38978 28239 28239 28239 13752 13752 13752 4480 4480 4480
++514 514 514 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 0 0 0 0 0 0
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++18995 18995 18995 11370 11370 11370 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7829 9894 11719 42919 54484 65535 42919 54484 65535 42919 54484 65535 2827 3598 4240
++257 257 257 56283 56283 56283 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 16762 16762 16762 0 0 0
++33667 36494 42587 42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 23901 28398 32639 257 257 257
++1028 1285 1542 49304 49177 49053 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 44589 44631 44888 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 6810 6810 6810
++11370 11370 11370 128 128 128 8455 8455 8455 9814 9814 9814 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 16136 16136 16136
++18995 18995 18995 15440 15440 15440 3079 3079 3079 0 0 0 0 0 0
++128 128 128 26055 26184 25186 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 46260 45809 45103 4480 4480 4480
++0 0 0 4615 5268 6322 30840 30197 30069 38978 38978 38978 49304 49177 49053
++58889 58889 58889 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++58889 58889 58889 48486 48538 48538 38406 38021 37650 24991 24991 24991 4480 4480 4480
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 13752 13752 13752 20778 20778 20542
++3857 3857 3857 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7829 9894 11719 42919 54484 65535 42919 54484 65535 42919 54484 65535 4615 5268 6322
++0 0 0 55126 54741 54484 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 20263 20263 20263 642 642 899
++26085 33024 39578 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764 20214 22616 25648
++0 0 0 3857 3857 3857 55126 54741 54484 65535 65535 65535 65535 65535 65535
++65535 65535 65535 35838 35838 35838 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++18336 18336 18336 0 0 0 0 0 0 18336 18336 18336 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 2313 2313 2313 16136 16136 16136 28239 28239 28239 385 385 334
++0 0 0 22881 22881 22881 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 52685 52685 52685
++24991 24991 24991 257 257 257 0 0 0 0 0 0 128 128 128
++1799 1799 1799 17553 17553 17553 31875 31875 31875 35838 35838 35838 35838 35838 35838
++38406 38021 37650 38406 38021 37650 33681 33681 33681 26055 26184 25186 13752 13752 13752
++2313 2313 2313 128 128 128 0 0 0 0 0 0 128 128 128
++1799 1927 2184 16762 16762 16762 28239 28239 28239 28239 28239 28239 26342 26738 26738
++26342 26738 26738 26342 26738 26738 26055 26184 25186 21292 21292 21292 10459 10459 10459
++2313 2313 2313 0 0 0 0 0 0 0 0 0 0 0 0
++2313 2313 2313 18336 18336 18336 19317 19131 18746 5911 5911 5911 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++4615 5268 6322 42919 54484 65535 42919 54484 65535 42919 54484 65535 6627 7270 8103
++128 128 128 52685 52685 52685 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 22881 22881 22881 0 0 0
++26085 33024 39578 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764
++12444 14392 17344 257 257 257 7197 7197 7197 59538 59538 59538 65535 65535 65535
++65535 65535 65535 28239 28239 28239 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++18995 18995 18995 0 0 0 0 0 0 17965 17965 17965 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 18995 18995 18995 3079 3079 3079
++0 0 0 38978 38978 38978 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++65278 65278 65278 51400 51400 51400 33681 33681 33681 13752 13752 13752 257 257 257
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++0 0 0 0 0 0 0 0 0 128 128 128 0 0 0
++4480 4480 4480 21292 21292 21292 31875 31875 31875 40833 41475 42019 50115 50774 49729
++58889 58889 58889 65278 65278 65278 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 64764 64764 64764
++60266 60266 60266 55531 55531 55531 50115 51271 50886 38406 38021 37650 128 128 128
++22881 22881 22881 1028 1028 1028 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++2827 3598 4240 42919 54484 65535 42919 54484 65535 42919 54484 65535 7598 8369 9034
++128 128 128 50115 51271 50886 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 26342 26738 26738 257 257 257
++23901 28398 32639 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++40349 51271 61680 4615 5268 6322 0 0 0 20778 20778 20542 65535 65535 65535
++65278 65278 65278 12931 12931 12931 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++14506 14506 14506 4480 4480 4480 0 0 0 17965 17965 17965 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 17553 17553 17553 8455 8455 8455 0 0 0
++16762 16762 16762 61680 61680 61680 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65278 65278 65278 64507 64507 64507 55126 54741 54484
++44589 44631 44888 40984 40984 40984 38406 38021 37650 31875 31875 31875 30840 30197 30069
++24991 24991 24991 30840 30197 30069 38978 38978 38978 45746 46260 46746 55126 54741 54484
++62065 62065 62065 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 55126 54741 54484 0 0 0
++18336 18336 18336 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1028 1028 1028 42919 54484 65535 42919 54484 65535 42919 54484 65535 7829 9894 11719
++257 257 257 48486 48538 48538 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 24991 24991 24991 0 0 0
++26085 33024 39578 42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 12444 14392 17344 642 642 899 0 0 0 44589 44631 44888
++55126 55126 55126 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1028 1028 1028 18995 18995 18995 0 0 0 9814 9814 9814 8455 8455 8455
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 9814 9814 9814 10459 10459 10459 128 128 128 3079 3079 3079
++55126 54741 54484 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 61680 61680 61680 3857 3857 3857
++11370 11370 11370 4480 4480 4480 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1028 1028 1028 36810 46686 56154 42919 54484 65535 42919 54484 65535 10999 12122 13073
++0 0 0 47056 47056 47056 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 14506 14506 14506 642 642 899
++33667 36494 42587 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 10999 12122 13073 0 0 0 128 128 128 6427 6427 6427
++24991 24991 24991 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 20263 20263 20263 0 0 0 0 0 0 18995 18995 18995
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 11370 11370 11370 6810 6810 6810 0 0 0 24991 24991 24991
++65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 18711 18711 18711
++3857 3857 3857 12931 12931 12931 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 33667 36494 42587 42919 54484 65535 42919 54484 65535 12444 14392 17344
++0 0 0 44589 44631 44888 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 5911 5911 5911 0 0 0
++36810 46686 56154 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 6627 7270 8103 128 128 128 0 0 0 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 10459 10459 10459 8455 8455 8455 0 0 0 17553 17553 17553
++1799 1927 2184 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 8455 8455 8455 9814 9814 9814 128 128 128 30583 30843 31357
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 24991 24991 24991
++3857 3857 3857 12931 12931 12931 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 23901 28398 32639 42919 54484 65535 42533 53970 64764 20214 22616 25648
++0 0 0 35502 34869 34383 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 61309 61309 61309 0 0 0 642 642 899
++42533 53970 64764 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42533 53970 64764 642 642 899 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 19317 19131 18746 128 128 128 1028 1028 1028
++18711 18711 18711 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 5911 5911 5911 12931 12931 12931 0 0 0 16762 16762 16762
++64764 64764 64764 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 11370 11370 11370
++9814 9814 9814 7197 7197 7197 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 12444 14392 17344 42919 54484 65535 42919 54484 65535 26085 33024 39578
++0 0 0 22881 22881 22881 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 51400 51400 51400 0 0 0 7598 8369 9034
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++33153 41891 50372 1028 1028 1028 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 13752 13752 13752 5911 5911 5911 128 128 128
++20263 20263 20263 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 642 642 899 18517 18517 18517 0 0 0 128 128 128
++38978 38978 38978 65021 65021 65021 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 59538 59538 59538 1028 1028 1028
++15440 15440 15440 2313 2313 2313 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 4615 5268 6322 42919 54484 65535 42533 53970 64764 33153 41891 50372
++0 0 0 12931 12931 12931 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 40984 40984 40984 514 514 514 12444 14392 17344
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764
++23901 28398 32639 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 19317 19131 18746 128 128 128
++6810 6810 6810 13752 13752 13752 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 18995 18995 18995 0 0 0 0 0 0
++128 128 128 31875 31875 31875 56283 56283 56283 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 52685 52685 52685 0 0 0
++18995 18995 18995 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 36810 46686 56154 42919 54484 65535 40349 51271 61680
++0 0 0 1799 1799 1799 64764 64764 64764 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 31875 31875 31875 0 0 0 20214 22616 25648
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++7829 9894 11719 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 16136 16136 16136 3857 3857 3857
++0 0 0 21292 21292 21292 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 3857 3857 3857 22359 22625 23010 0 0 0
++0 0 0 0 0 0 2313 2313 2313 28239 28239 28239 38406 38021 37650
++47056 47056 47056 57470 57470 57470 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 42507 42507 42507 0 0 0
++20263 20263 20263 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 642 642 899 33667 36494 42587 42919 54484 65535 42533 53970 64764
++4615 5268 6322 0 0 0 56026 55897 55897 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 21838 21794 21532 0 0 0 26085 33024 39578
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764 33153 41891 50372
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 19317 19131 18746
++128 128 128 15440 15440 15440 5911 5911 5911 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 7197 7197 7197 18711 18711 18711
++18336 18336 18336 3857 3857 3857 128 128 128 0 0 0 128 128 128
++0 0 0 1028 1028 1028 17965 17965 17965 47697 47615 47488 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 60652 60652 60652 21838 21794 21532 257 257 257
++20263 20263 20263 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 20214 22616 25648 42533 53970 64764 42919 54484 65535
++12444 14392 17344 0 0 0 44589 44631 44888 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 64764 64764 64764 6427 6427 6427 0 0 0 33153 41891 50372
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 7829 9894 11719
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 17965 17965 17965
++1799 1927 2184 0 0 0 21838 21794 21532 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++514 514 514 13752 13752 13752 20778 20778 20542 18995 18995 18995 0 0 0
++0 0 0 0 0 0 0 0 0 642 642 899 38978 38978 38978
++64507 64507 64507 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 63607 63607 63607 58889 58889 58889 55126 55126 55126 50115 51271 50886
++47056 47056 47056 42507 42507 42507 38406 38021 37650 33681 33681 33681 30840 30197 30069
++24991 24991 24991 16762 16762 16762 20263 20263 20263 26342 26738 26738 30583 30843 31357
++30840 30197 30069 28239 28239 28239 13752 13752 13752 0 0 0 16762 16762 16762
++3079 3079 3079 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 257 257 257 1413 1670 1799 40349 51271 61680 42919 54484 65535
++20214 22616 25648 0 0 0 33681 33681 33681 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 47056 47056 47056 128 128 128 6627 7270 8103 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 26085 33024 39578 385 385 334
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 1028 1028 1028
++20263 20263 20263 0 0 0 15440 15440 15440 5911 5911 5911 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 18995 18995 18995 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++40984 40984 40984 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 64124 64124 64124
++57470 57470 57470 49621 49621 49607 40833 41475 42019 33681 33681 33681 24991 24991 24991
++16136 16136 16136 7197 7197 7197 1799 1927 2184 0 0 0 128 128 128
++0 0 0 0 0 0 128 128 128 0 0 0 0 0 0
++0 0 0 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 1028 1028 1028 13752 13752 13752 14506 14506 14506
++257 257 257 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 23901 28398 32639 42533 53970 64764
++26085 33024 39578 642 642 899 18711 18711 18711 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 21838 21794 21532 128 128 128 23901 28398 32639 42533 53970 64764
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 33153 41891 50372 1413 1670 1799 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++10459 10459 10459 11370 11370 11370 128 128 128 20778 20778 20542 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18517 18517 18517 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1799 1799 1799 50115 51271 50886 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65021 65021 65021
++56283 56283 56283 44589 44631 44888 33681 33681 33681 26055 26184 25186 9814 9814 9814
++514 514 514 0 0 0 128 128 128 0 0 0 128 128 128
++128 128 128 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 257 257 257
++7197 7197 7197 20778 20778 20542 19317 19131 18746 18517 18517 18517 18517 18517 18517
++18517 18517 18517 18336 18336 18336 16762 16762 16762 5911 5911 5911 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 642 642 899 2056 2313 2822 40349 51271 61680
++36810 46686 56154 128 128 128 1799 1799 1799 62708 62708 62708 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++61309 61309 61309 2313 2313 2313 257 257 257 36810 46686 56154 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 36810 46686 56154 4480 4480 4480 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 19317 19131 18746 2313 2313 2313 4480 4480 4480 16136 16136 16136
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 10459 10459 10459 20778 20778 20542
++12931 12931 12931 4480 4480 4480 1028 1028 1028 0 0 0 0 0 0
++0 0 0 22881 22881 22881 64507 64507 64507 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 58889 58889 58889 38406 38021 37650 16136 16136 16136
++642 642 899 0 0 0 257 257 257 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18711 18711 18711 20263 20263 20263
++11370 11370 11370 1028 1285 1542 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 7209 5285 2184 10498 7619 3259 9123 6640 2832 10498 7619 3259
++9123 6640 2832 10498 7619 3259 8095 5986 2531 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 10999 12122 13073
++42919 54484 65535 7829 9894 11719 514 514 514 43356 43080 42463 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++38978 38978 38978 0 0 0 12444 14392 17344 42533 53970 64764 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535 42919 54484 65535
++40349 51271 61680 7829 9894 11719 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 642 642 899 21292 21292 21292 128 128 128 15440 15440 15440
++5911 5911 5911 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++5911 5911 5911 13752 13752 13752 18336 18336 18336 20263 20263 20263 642 642 899
++0 0 0 0 0 0 57470 57470 57470 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++59538 59538 59538 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 63222 63222 63222 47056 47056 47056 38406 38021 37650 30583 30843 31357
++21838 21794 21532 257 257 257 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 18336 18336 18336
++24991 24991 24991 16762 16762 16762 3079 3079 3079 0 0 0 0 0 0
++0 0 0 257 257 257 8455 8455 8455 11370 11370 11370 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 3038 2204 899
++19371 14059 6014 27882 20284 8738 30933 22555 9803 34164 24785 10813 27882 20284 8738
++22224 16071 6824 15792 11440 4871 1413 1028 514 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 875 620 271 15792 11440 4871 15792 11440 4871 15792 11440 4871
++15792 11440 4871 3038 2204 899 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 9123 6640 2832 15792 11440 4871 15792 11440 4871 15792 11440 4871
++875 620 271 0 0 0 0 0 0 3038 2204 899 15792 11440 4871
++15792 11440 4871 15792 11440 4871 12071 8729 3764 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 12071 8729 3764 15792 11440 4871
++15792 11440 4871 15792 11440 4871 3038 2204 899 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++10498 7619 3259 62465 45547 19595 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 28744 20827 9121 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 642 642 899
++23901 28398 32639 23901 28398 32639 257 257 257 22881 22881 22881 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++14506 14506 14506 0 0 0 26085 33024 39578 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 42533 53970 64764 42533 53970 64764
++12444 14392 17344 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 8455 8455 8455 13752 13752 13752 0 0 0
++20778 20778 20542 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 4480 4480 4480 16136 16136 16136
++0 0 0 0 0 0 53256 53199 52942 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 56026 55897 55897
++33681 33681 33681 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 65535 65535 65535
++65278 65278 65278 47697 47615 47488 14506 14506 14506 0 0 0 0 0 0
++0 0 0 1799 1927 2184 28239 28239 28239 49304 49177 49053 64507 64507 64507
++65535 65535 65535 65535 65535 65535 60652 60652 60652 49621 49621 49607 5911 5911 5911
++0 0 0 1028 1028 1028 18995 18995 18995 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 13872 10127 4336 48838 36002 16378 62486 45353 19401
++61451 44536 19168 60487 44116 19189 62486 45353 19401 63236 45897 19634 61451 44536 19168
++60487 44116 19189 61451 44536 19168 60487 44116 19189 37303 27193 11910 9123 6640 2832
++257 257 257 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 3038 2204 899 63736 46260 19789 61451 44536 19168 60487 44116 19189
++61861 44933 19292 40410 29471 12985 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 37303 27193 11910 62486 45353 19401 60487 44116 19189 63736 46260 19789
++4874 3558 1459 0 0 0 0 0 0 12071 8729 3764 63486 46079 19711
++60487 44116 19189 61861 44933 19292 51340 37280 15909 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 48838 36002 16378 61861 44933 19292
++60487 44116 19189 63112 45588 19556 13872 10127 4336 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 875 620 271
++51340 37280 15909 63093 45874 19660 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63486 46335 19711 50159 36373 15650 1264 929 361 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8095 5986 2531 30933 22555 9803 36240 26320 11215 0 0 0
++642 642 899 26085 33024 39578 0 0 0 3857 3857 3857 64124 64124 64124
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 56026 55897 55897
++0 0 0 2056 2313 2822 40349 51271 61680 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 42919 54484 65535 36810 46686 56154 7829 9894 11719
++385 385 334 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 17965 17965 17965 4480 4480 4480
++4480 4480 4480 16136 16136 16136 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 15440 15440 15440 7197 7197 7197
++0 0 0 9814 9814 9814 63222 63222 63222 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 57470 57470 57470 15440 15440 15440
++24991 24991 24991 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 62065 62065 62065 47056 47056 47056 33681 33681 33681
++40984 40984 40984 57470 57470 57470 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 60652 60652 60652 1799 1799 1799
++0 0 0 18995 18995 18995 1028 1028 1028 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++2402 1799 684 43194 31354 13386 62340 45076 19410 62986 45716 19556 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 61861 44933 19292 62340 45076 19410
++22224 16071 6824 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 3038 2204 899 63736 46260 19789 63486 46079 19711 63736 46260 19789
++63736 46260 19789 61861 44933 19292 15792 11440 4871 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++875 620 271 37303 27193 11910 63736 46260 19789 63736 46260 19789 63486 46079 19711
++4874 3558 1459 0 0 0 0 0 0 13872 10127 4336 61861 44933 19292
++63736 46260 19789 63736 46260 19789 51340 37280 15909 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 50159 36373 15650 63736 46260 19789
++63486 46079 19711 61861 44933 19292 12071 8729 3764 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 30042 21792 9253
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++62486 45353 19401 10498 7619 3259 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 7209 5285 2184
++37303 27193 11910 62486 45353 19401 63864 46774 20174 63486 46079 19711 27882 20284 8738
++0 0 0 1028 1285 1542 4480 4480 4480 128 128 128 47697 47615 47488
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65021 65021 65021 24991 24991 24991
++257 257 257 16576 19275 21848 42919 54484 65535 42919 54484 65535 42919 54484 65535
++42919 54484 65535 42919 54484 65535 26085 33024 39578 2056 2313 2822 257 257 257
++7209 5285 2184 40410 29471 12985 25195 18262 7789 1413 1028 514 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 22359 22625 23010
++0 0 0 15440 15440 15440 5911 5911 5911 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 4480 4480 4480 17553 17553 17553 0 0 0
++0 0 0 31875 31875 31875 65278 65278 65278 65535 65535 65535 65535 65535 65535
++65535 65535 65535 64764 64764 64764 48486 48538 48538 16762 16762 16762 0 0 0
++24991 24991 24991 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 55126 55126 55126 128 128 128
++0 0 0 17965 17965 17965 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 3038 2204 899
++53070 38550 16467 61451 44536 19168 63736 46260 19789 63736 46260 19789 63112 45588 19556
++61451 44536 19168 63486 46335 19711 61451 44536 19168 59002 43055 18866 63736 46260 19789
++63093 45874 19660 61861 44933 19292 63736 46260 19789 63736 46260 19789 63736 46260 19789
++62486 45353 19401 25195 18262 7789 128 128 128 0 0 0 0 0 0
++0 0 0 3038 2204 899 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19455 55635 40828 18345 1264 929 361 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 37303 27193 11910 64250 47031 20303 63486 46079 19455 63736 46260 19789
++4874 3558 1459 0 0 0 0 0 0 12071 8729 3764 62340 45076 19410
++63736 46260 19789 63736 46260 19789 51340 37280 15909 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 50159 36373 15650 63486 46079 19711
++63736 46260 19789 61451 44536 19168 13872 10127 4336 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 10498 7619 3259 62486 45353 19401
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++30933 22555 9803 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 3855 2930 1607 36240 26320 11215 61861 44933 19292
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 62486 45353 19401
++23177 16932 7265 0 0 0 257 257 257 0 0 0 26342 26738 26738
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 49621 49621 49607 0 0 0
++1413 1670 1799 36810 46686 56154 42919 54484 65535 42919 54484 65535 42919 54484 65535
++40349 51271 61680 16576 19275 21848 128 128 128 0 0 0 20895 15087 6460
++60487 44116 19189 64250 47031 20303 64250 47031 20303 57142 41714 18588 23177 16932 7265
++385 385 334 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 5911 5911 5911
++18336 18336 18336 128 128 128 21838 21794 21532 514 514 514 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 1799 1799 1799 21838 21794 21532 0 0 0 0 0 0
++0 0 0 47056 47056 47056 65535 65535 65535 65535 65535 65535 65535 65535 65535
++52685 52685 52685 22881 22881 22881 0 0 0 0 0 0 0 0 0
++28239 28239 28239 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 57470 57470 57470 128 128 128
++128 128 128 18995 18995 18995 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 43194 31354 13386
++61861 44933 19292 63736 46260 19789 63736 46260 19789 61451 44536 19168 55635 40828 18345
++19371 14059 6014 3038 2204 899 0 0 0 0 0 0 1264 929 361
++10498 7619 3259 34164 24785 10813 61451 44536 19168 62986 45716 19556 63736 46260 19789
++63736 46260 19789 62340 45076 19410 7209 5285 2184 0 0 0 0 0 0
++128 128 128 3038 2204 899 63736 46260 19789 63736 46260 19789 62486 45353 19401
++62465 45547 19595 63486 46079 19455 61861 44933 19292 30933 22555 9803 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++875 620 271 37303 27193 11910 63736 46260 19789 63736 46260 19789 63486 46079 19711
++4874 3558 1459 0 0 0 0 0 0 13872 10127 4336 61861 44933 19292
++63486 46079 19711 63864 46774 20174 51340 37280 15909 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 50159 36373 15650 63736 46260 19789
++63486 46079 19711 61861 44933 19292 12071 8729 3764 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 875 620 271 51340 37280 15909 62986 45716 19556
++63736 46260 19789 63736 46260 19789 63486 46079 19711 63359 45859 19672 51340 37280 15909
++875 620 271 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 15792 11440 4871 55635 40828 18345 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63359 45859 19672 27882 20284 8738 0 0 0 0 0 0 4480 4480 4480
++44589 44631 44888 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 64124 64124 64124 11370 11370 11370 0 0 0
++23901 28398 32639 42919 54484 65535 42533 53970 64764 40349 51271 61680 23901 28398 32639
++4615 5268 6322 128 128 128 1413 1028 514 40410 29471 12985 64250 47031 20303
++64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303 63864 46774 20174
++53070 38550 16467 17750 12880 5633 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++9814 9814 9814 16136 16136 16136 2313 2313 2313 22881 22881 22881 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 21292 21292 21292 385 385 334 0 0 0 0 0 0
++10459 10459 10459 62065 62065 62065 65535 65535 65535 65535 65535 65535 49621 49621 49607
++2701 2701 2701 0 0 0 0 0 0 0 0 0 0 0 0
++30840 30197 30069 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 62708 62708 62708 10459 10459 10459
++128 128 128 22359 22625 23010 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 19371 14059 6014 61861 44933 19292
++63736 46260 19789 63736 46260 19789 62340 45076 19410 40410 29471 12985 2402 1799 684
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 8373 6077 2600 57142 41714 18588 63486 46079 19455
++63736 46260 19789 62986 45716 19556 45225 33169 15226 128 128 128 0 0 0
++0 0 0 3038 2204 899 63736 46260 19789 63736 46260 19789 61861 44933 19292
++63486 46335 19711 63736 46260 19789 63736 46260 19789 62737 45569 19692 9123 6640 2832
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 37303 27193 11910 64250 47031 20303 63486 46079 19455 63736 46260 19789
++4874 3558 1459 0 0 0 0 0 0 12071 8729 3764 62340 45076 19410
++63736 46260 19789 63736 46260 19789 51340 37280 15909 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 50159 36373 15650 63486 46079 19711
++63736 46260 19789 61451 44536 19168 13872 10127 4336 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 30042 21792 9253 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 62986 45716 19556 12071 8729 3764
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 5943 4354 1886 30933 22555 9803 53070 38550 16467 62486 45353 19401
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 30933 22555 9803 128 128 128 0 0 0
++0 0 0 21838 21794 21532 51400 51400 51400 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 24991 24991 24991 128 128 128 6627 7270 8103
++42533 53970 64764 36810 46686 56154 16576 19275 21848 2056 2313 2822 0 0 0
++0 0 0 12071 8729 3764 54363 39457 16879 63864 46774 20174 64250 47031 20303
++64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303
++64250 47031 20303 63864 46774 20174 43194 31354 13386 3038 2204 899 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 10459 10459 10459 15440 15440 15440 4480 4480 4480 20263 20263 20263
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++8455 8455 8455 11370 11370 11370 0 0 0 0 0 0 0 0 0
++38406 38021 37650 65535 65535 65535 65535 65535 65535 65278 65278 65278 28239 28239 28239
++0 0 0 0 0 0 0 0 0 0 0 0 257 257 257
++26342 26738 26738 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++64124 64124 64124 60266 60266 60266 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65278 65278 65278 46260 45809 45103
++257 257 257 7197 7197 7197 12931 12931 12931 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 50159 36373 15650 63486 46079 19711
++63736 46260 19789 63112 45588 19556 50159 36373 15650 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 15792 11440 4871 63236 45897 19634
++62986 45716 19556 50159 36373 15650 28744 20827 9121 1264 929 361 0 0 0
++128 128 128 3038 2204 899 63736 46260 19789 63736 46260 19789 63112 45588 19556
++59002 43055 18866 61451 44536 19168 63736 46260 19789 62486 45353 19401 50159 36373 15650
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++875 620 271 37303 27193 11910 63736 46260 19789 63736 46260 19789 63486 46079 19711
++4874 3558 1459 0 0 0 0 0 0 13872 10127 4336 61861 44933 19292
++63486 46079 19711 63864 46774 20174 51340 37280 15909 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 50159 36373 15650 63736 46260 19789
++63486 46079 19711 61861 44933 19292 12071 8729 3764 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 10498 7619 3259 62486 45353 19401 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19711 63864 46774 20174 30933 22555 9803 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 128 128 128 0 0 0 0 0 0
++3038 2204 899 34164 24785 10813 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 50159 36373 15650 9123 6640 2832
++0 0 0 0 0 0 0 0 0 12931 12931 12931 31875 31875 31875
++47697 47615 47488 61309 61309 61309 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 35502 34869 34383 0 0 0 2056 2313 2822 20214 22616 25648
++12444 14392 17344 0 0 0 514 514 514 0 0 0 17750 12880 5633
++45225 33169 15226 63864 46774 20174 64250 47031 20303 64250 47031 20303 64250 47031 20303
++64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303
++64250 47031 20303 64250 47031 20303 63864 46774 20174 40410 29471 12985 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 11370 11370 11370 13752 13752 13752 8455 8455 8455
++16136 16136 16136 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++18336 18336 18336 0 0 0 0 0 0 0 0 0 0 0 0
++51400 51400 51400 65535 65535 65535 65535 65535 65535 65535 65535 65535 22881 22881 22881
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++385 385 334 35502 34869 34383 49621 49621 49607 47697 47615 47488 38406 38021 37650
++31875 31875 31875 60933 60933 60933 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65021 65021 65021
++28239 28239 28239 257 257 257 19317 19131 18746 128 128 128 0 0 0
++0 0 0 0 0 0 5943 4354 1886 63359 45859 19672 63736 46260 19789
++63736 46260 19789 62737 45569 19692 13872 10127 4336 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 13872 10127 4336
++3038 2204 899 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 3038 2204 899 63736 46260 19789 63736 46260 19789 63736 46260 19789
++37303 27193 11910 54363 39457 16879 63112 45588 19556 63736 46260 19789 61861 44933 19292
++23177 16932 7265 257 257 257 0 0 0 0 0 0 0 0 0
++0 0 0 37303 27193 11910 64250 47031 20303 63486 46079 19455 63736 46260 19789
++4874 3558 1459 0 0 0 0 0 0 12071 8729 3764 62340 45076 19410
++63736 46260 19789 63736 46260 19789 51340 37280 15909 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 50159 36373 15650 63486 46079 19711
++63736 46260 19789 61451 44536 19168 13872 10127 4336 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++875 620 271 51340 37280 15909 62737 45569 19692 63736 46260 19789 63736 46260 19789
++63736 46260 19789 62986 45716 19556 53070 38550 16467 1413 1028 514 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 19371 14059 6014 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++41427 30069 13197 8095 5986 2531 128 128 128 0 0 0 257 257 257
++0 0 0 257 257 257 10459 10459 10459 24991 24991 24991 39900 39413 38599
++55126 54741 54484 61309 61309 61309 64507 64507 64507 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 57470 57470 57470 47697 47615 47488 38406 38021 37650 28239 28239 28239
++17965 17965 17965 128 128 128 0 0 0 0 0 0 257 257 257
++128 128 128 1413 1028 514 25195 18262 7789 53070 38550 16467 64250 47031 20303
++64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303
++64250 47031 20303 64250 47031 20303 64250 47031 20303 40410 29471 12985 20895 15087 6460
++19371 14059 6014 13872 10127 4336 7209 5285 2184 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 12931 12931 12931 12931 12931 12931
++11370 11370 11370 12931 12931 12931 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++9814 9814 9814 9814 9814 9814 0 0 0 0 0 0 0 0 0
++42507 42507 42507 65535 65535 65535 65535 65535 65535 65535 65535 65535 17965 17965 17965
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 0 0 0 0 0 0 257 257 257
++49621 49621 49607 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++55126 54741 54484 1799 1927 2184 9814 9814 9814 10459 10459 10459 0 0 0
++0 0 0 0 0 0 22224 16071 6824 60487 44116 19189 63736 46260 19789
++63736 46260 19789 51340 37280 15909 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 3038 2204 899 63736 46260 19789 63736 46260 19789 63236 45897 19634
++40410 29471 12985 12071 8729 3764 62486 45353 19401 63736 46260 19789 63736 46260 19789
++61451 44536 19168 4874 3558 1459 0 0 0 0 0 0 0 0 0
++875 620 271 37303 27193 11910 63736 46260 19789 63736 46260 19789 63486 46079 19711
++4874 3558 1459 0 0 0 0 0 0 13872 10127 4336 61861 44933 19292
++63486 46079 19711 63864 46774 20174 51340 37280 15909 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 50159 36373 15650 63736 46260 19789
++63486 46079 19711 61861 44933 19292 12071 8729 3764 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++30042 21792 9253 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19711 12071 8729 3764 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 43194 31354 13386 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 59002 43055 18866 30042 21792 9253 12071 8729 3764
++2402 1799 684 0 0 0 128 128 128 128 128 128 128 128 128
++0 0 0 0 0 0 0 0 0 1799 1927 2184 4480 4480 4480
++8455 8455 8455 11370 11370 11370 14506 14506 14506 17553 17553 17553 11370 11370 11370
++2313 2313 2313 0 0 0 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 257 257 257 4874 3558 1459 23177 16932 7265
++37303 27193 11910 59002 43055 18866 64250 47031 20303 64250 47031 20303 64250 47031 20303
++64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303
++64250 47031 20303 64250 47031 20303 63864 46774 20174 875 620 271 128 128 128
++0 0 0 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 13752 13752 13752
++11370 11370 11370 15440 15440 15440 9814 9814 9814 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 20263 20263 20263 514 514 514 0 0 0 0 0 0
++5911 5911 5911 55126 54741 54484 65278 65278 65278 65535 65535 65535 22881 22881 22881
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 20263 20263 20263
++64764 64764 64764 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 64124 64124 64124 64124 64124 64124 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 30840 30197 30069 0 0 0 18995 18995 18995 0 0 0
++0 0 0 0 0 0 34164 24785 10813 63359 45859 19672 63736 46260 19789
++63736 46260 19789 37303 27193 11910 385 385 334 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 3038 2204 899 63736 46260 19789 63736 46260 19789 63736 46260 19789
++40410 29471 12985 0 0 0 36240 26320 11215 61861 44933 19292 63736 46260 19789
++61861 44933 19292 43194 31354 13386 0 0 0 0 0 0 0 0 0
++0 0 0 37303 27193 11910 64250 47031 20303 63486 46079 19455 63736 46260 19789
++4874 3558 1459 0 0 0 0 0 0 12071 8729 3764 62340 45076 19410
++63736 46260 19789 63736 46260 19789 51340 37280 15909 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 50159 36373 15650 63486 46079 19711
++63736 46260 19789 61451 44536 19168 13872 10127 4336 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 10498 7619 3259
++62340 45076 19410 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63486 46335 19711 34164 24785 10813 0 0 0 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 62986 45716 19556 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 36240 26320 11215 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 13872 10127 4336 63483 46207 20056
++64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303
++64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303
++64250 47031 20303 64250 47031 20303 64250 47031 20303 20895 15087 6460 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++14506 14506 14506 9814 9814 9814 18995 18995 18995 5911 5911 5911 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 2313 2313 2313 18995 18995 18995 0 0 0 0 0 0
++0 0 0 9814 9814 9814 49621 49621 49607 65535 65535 65535 31875 31875 31875
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 38978 38978 38978
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 61309 61309 61309 56283 56283 56283 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 38978 38978 38978 0 0 0 18711 18711 18711 0 0 0
++0 0 0 0 0 0 41427 30069 13197 63736 46260 19789 63736 46260 19789
++61451 44536 19168 30042 21792 9253 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 3038 2204 899 63486 46079 19711 63864 46774 20174 63112 45588 19556
++40410 29471 12985 128 128 128 2402 1799 684 59002 43055 18866 63736 46260 19789
++63736 46260 19789 61861 44933 19292 17750 12880 5633 0 0 0 0 0 0
++875 620 271 37303 27193 11910 63736 46260 19789 63736 46260 19789 63486 46079 19711
++4874 3558 1459 0 0 0 0 0 0 13872 10127 4336 61861 44933 19292
++63486 46079 19711 63864 46774 20174 51340 37280 15909 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 50159 36373 15650 63736 46260 19789
++63486 46079 19711 61861 44933 19292 12071 8729 3764 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 875 620 271 50159 36373 15650
++62986 45716 19556 63736 46260 19789 63736 46260 19789 63736 46260 19789 62986 45716 19556
++54363 39457 16879 1413 1028 514 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++20895 15087 6460 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 62986 45716 19556 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++37303 27193 11910 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 43194 31354 13386
++64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303
++64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303
++64250 47031 20303 64250 47031 20303 64250 47031 20303 51340 37280 15909 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 15440 15440 15440 9814 9814 9814 21838 21794 21532 3857 3857 3857
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 12931 12931 12931 15440 15440 15440 0 0 0
++0 0 0 0 0 0 2701 2701 2701 42507 42507 42507 40984 40984 40984
++257 257 257 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 38978 38978 38978
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 58889 58889 58889 45746 46260 46746 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 40984 40984 40984 0 0 0 18995 18995 18995 0 0 0
++0 0 0 0 0 0 45225 33169 15226 63486 46079 19455 63736 46260 19789
++60487 44116 19189 22224 16071 6824 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 36240 26320 11215 53070 38550 16467
++53070 38550 16467 53070 38550 16467 53070 38550 16467 53070 38550 16467 53070 38550 16467
++53070 38550 16467 53070 38550 16467 51340 37280 15909 15792 11440 4871 0 0 0
++0 0 0 3038 2204 899 63736 46260 19789 63736 46260 19789 63736 46260 19789
++40410 29471 12985 0 0 0 0 0 0 19371 14059 6014 61861 44933 19292
++63736 46260 19789 63736 46260 19789 57142 41714 18588 2402 1799 684 0 0 0
++0 0 0 37303 27193 11910 64250 47031 20303 63486 46079 19455 63736 46260 19789
++4874 3558 1459 0 0 0 0 0 0 12071 8729 3764 62340 45076 19410
++63736 46260 19789 63736 46260 19789 51340 37280 15909 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 50159 36373 15650 63486 46079 19711
++63736 46260 19789 61451 44536 19168 13872 10127 4336 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 30042 21792 9253 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711
++13872 10127 4336 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++10498 7619 3259 34164 24785 10813 34164 24785 10813 30042 21792 9253 17750 12880 5633
++7209 5285 2184 2402 1799 684 45225 33169 15226 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 36240 26320 11215
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 8095 5986 2531
++61985 45298 20071 64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303
++64250 47031 20303 64250 47031 20303 50159 36373 15650 34164 24785 10813 53070 38550 16467
++64250 47031 20303 64250 47031 20303 64250 47031 20303 64250 47031 20303 13872 10127 4336
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 12931 12931 12931 14506 14506 14506 24991 24991 24991
++3079 3079 3079 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 9814 9814 9814 18995 18995 18995
++0 0 0 0 0 0 0 0 0 0 0 0 15440 15440 15440
++0 0 0 0 0 0 2701 2701 2701 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 385 385 334 35838 35838 35838
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 51400 51400 51400 35838 35838 35838 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65278 65278 65278 33681 33681 33681 0 0 0 18517 18517 18517 0 0 0
++0 0 0 0 0 0 43194 31354 13386 63736 46260 19789 63736 46260 19789
++60487 44116 19189 27882 20284 8738 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 46996 34589 15727 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 61861 44933 19292 19371 14059 6014 0 0 0
++128 128 128 3038 2204 899 63486 46079 19711 63864 46774 20174 63112 45588 19556
++40410 29471 12985 0 0 0 0 0 0 0 0 0 45225 33169 15226
++62340 45076 19410 63736 46260 19789 61451 44536 19168 34164 24785 10813 0 0 0
++875 620 271 37303 27193 11910 63736 46260 19789 63736 46260 19789 63486 46079 19711
++4874 3558 1459 0 0 0 0 0 0 13872 10127 4336 61861 44933 19292
++63486 46079 19711 63864 46774 20174 51340 37280 15909 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 50159 36373 15650 63736 46260 19789
++63486 46079 19711 61861 44933 19292 12071 8729 3764 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 10498 7619 3259 61861 44933 19292 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63093 45874 19660 36240 26320 11215
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++0 0 0 0 0 0 40410 29471 12985 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19455 64250 47031 20303 30933 22555 9803 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++19371 14059 6014 63483 46207 20056 64250 47031 20303 64250 47031 20303 64250 47031 20303
++64250 47031 20303 64250 47031 20303 12071 8729 3764 0 0 0 385 385 334
++15792 11440 4871 43194 31354 13386 59002 43055 18866 63864 46774 20174 9123 6640 2832
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 8455 8455 8455 18995 18995 18995
++24991 24991 24991 2313 2313 2313 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 3857 3857 3857
++21838 21794 21532 1799 1799 1799 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 11370 11370 11370 31875 31875 31875 514 514 514
++128 128 128 0 0 0 0 0 0 0 0 0 14506 14506 14506
++63607 63607 63607 65278 65278 65278 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 42507 42507 42507 30840 30197 30069 65021 65021 65021
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++52685 52685 52685 2313 2313 2313 1028 1028 1028 18517 18517 18517 0 0 0
++0 0 0 0 0 0 37303 27193 11910 63486 46079 19711 63736 46260 19789
++63359 45859 19672 37303 27193 11910 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 46996 34589 15727 63486 46079 19455
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 60487 44116 19189 19371 14059 6014 0 0 0
++0 0 0 3038 2204 899 63736 46260 19789 63736 46260 19789 63736 46260 19789
++40410 29471 12985 0 0 0 0 0 0 0 0 0 5943 4354 1886
++61451 44536 19168 63736 46260 19789 63736 46260 19789 62465 45547 19595 12071 8729 3764
++0 0 0 37303 27193 11910 64250 47031 20303 63486 46079 19455 63736 46260 19789
++4874 3558 1459 0 0 0 0 0 0 12071 8729 3764 62340 45076 19410
++63736 46260 19789 63736 46260 19789 51340 37280 15909 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 50159 36373 15650 63486 46079 19711
++63736 46260 19789 61451 44536 19168 13872 10127 4336 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 385 385 334 50159 36373 15650 62986 45716 19556 63736 46260 19789
++63736 46260 19789 63736 46260 19789 62986 45716 19556 55635 40828 18345 1413 1028 514
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 257 257 257 57142 41714 18588 63736 46260 19789 63736 46260 19789
++63736 46260 19789 54363 39457 16879 15792 11440 4871 875 620 271 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 22224 16071 6824 63864 46774 20174 64250 47031 20303 64250 47031 20303
++64250 47031 20303 63093 45874 19660 1413 1028 514 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 2402 1799 684 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 3857 3857 3857
++22881 22881 22881 26342 26738 26738 1799 1927 2184 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1028 1028 1028 20263 20263 20263 9814 9814 9814 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 22881 22881 22881 22881 22881 22881
++3079 3079 3079 0 0 0 0 0 0 0 0 0 0 0 0
++47056 47056 47056 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 64764 64764 64764 22881 22881 22881 35838 35838 35838 65535 65535 65535
++65535 65535 65535 61680 61680 61680 65535 65535 65535 65535 65535 65535 52119 52119 51914
++9814 9814 9814 0 0 0 17553 17553 17553 2701 2701 2701 0 0 0
++0 0 0 128 128 128 25195 18262 7789 61451 44536 19168 63736 46260 19789
++63236 45897 19634 50159 36373 15650 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 30933 22555 9803 46996 34589 15727
++46996 34589 15727 46996 34589 15727 46996 34589 15727 46996 34589 15727 54363 39457 16879
++61861 44933 19292 63736 46260 19789 60487 44116 19189 19371 14059 6014 0 0 0
++128 128 128 3038 2204 899 63486 46079 19711 63864 46774 20174 63112 45588 19556
++40410 29471 12985 0 0 0 0 0 0 0 0 0 875 620 271
++25195 18262 7789 61451 44536 19168 63736 46260 19789 63093 45874 19660 51340 37280 15909
++1264 929 361 37303 27193 11910 63736 46260 19789 63736 46260 19789 63486 46079 19711
++4874 3558 1459 0 0 0 257 257 257 12071 8729 3764 62340 45076 19410
++63736 46260 19789 63486 46079 19711 54363 39457 16879 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 53070 38550 16467 63736 46260 19789
++63736 46260 19789 61451 44536 19168 12071 8729 3764 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 28744 20827 9121 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63486 46079 19455 15792 11440 4871 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 15792 11440 4871 63736 46260 19789 63736 46260 19789 61861 44933 19292
++34164 24785 10813 2402 1799 684 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 25195 18262 7789 64250 47031 20303 64250 47031 20303
++64250 47031 20303 53070 38550 16467 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++514 514 514 21838 21794 21532 30840 30197 30069 1413 1670 1799 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 12931 12931 12931 18711 18711 18711 128 128 128
++0 0 0 0 0 0 0 0 0 9814 9814 9814 11370 11370 11370
++20778 20778 20542 6427 6427 6427 0 0 0 0 0 0 0 0 0
++11370 11370 11370 55126 55126 55126 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 47056 47056 47056 128 128 128 44589 44631 44888 65535 65535 65535
++57470 57470 57470 38406 38021 37650 65021 65021 65021 47697 47615 47488 7197 7197 7197
++128 128 128 7197 7197 7197 14506 14506 14506 0 0 0 0 0 0
++0 0 0 0 0 0 10498 7619 3259 62486 45353 19401 63736 46260 19789
++63736 46260 19789 62465 45547 19595 7209 5285 2184 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 25195 18262 7789
++61861 44933 19292 63486 46079 19711 61451 44536 19168 19371 14059 6014 0 0 0
++0 0 0 3038 2204 899 63736 46260 19789 63736 46260 19789 63736 46260 19789
++40410 29471 12985 0 0 0 0 0 0 0 0 0 0 0 0
++875 620 271 51340 37280 15909 63359 45859 19672 63486 46079 19711 61861 44933 19292
++25195 18262 7789 37303 27193 11910 63864 46774 20174 63486 46079 19711 63736 46260 19789
++4874 3558 1459 0 0 0 0 0 0 8095 5986 2531 63359 45859 19672
++63736 46260 19789 63736 46260 19789 61451 44536 19168 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 61861 44933 19292 63736 46260 19789
++63736 46260 19789 63486 46079 19711 7209 5285 2184 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++9123 6640 2832 62486 45353 19401 63486 46335 19711 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19711 36240 26320 11215 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 20895 15087 6460 61451 44536 19168 43194 31354 13386 12071 8729 3764
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 22224 16071 6824 57142 41714 18588
++63864 46774 20174 30933 22555 9803 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 17553 17553 17553 35838 35838 35838 1028 1285 1542
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 3079 3079 3079 21292 21292 21292
++6810 6810 6810 0 0 0 0 0 0 128 128 128 18995 18995 18995
++0 0 0 21292 21292 21292 0 0 0 0 0 0 0 0 0
++257 257 257 11370 11370 11370 55126 55126 55126 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++51400 51400 51400 7197 7197 7197 1028 1285 1542 55126 54741 54484 65535 65535 65535
++28239 28239 28239 24991 24991 24991 42507 42507 42507 3079 3079 3079 128 128 128
++11370 11370 11370 16762 16762 16762 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 57142 41714 18588 63736 46260 19789
++63736 46260 19789 61861 44933 19292 40410 29471 12985 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 27882 20284 8738
++61451 44536 19168 63736 46260 19789 60487 44116 19189 19371 14059 6014 0 0 0
++128 128 128 3038 2204 899 63486 46079 19711 63864 46774 20174 63112 45588 19556
++40410 29471 12985 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 12071 8729 3764 62486 45353 19401 63736 46260 19789 63736 46260 19789
++61451 44536 19168 43194 31354 13386 63736 46260 19789 63736 46260 19789 63486 46079 19711
++4874 3558 1459 0 0 0 0 0 0 1413 1028 514 63112 45588 19556
++63736 46260 19789 63736 46260 19789 63736 46260 19789 5943 4354 1886 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 8373 6077 2600 63486 46079 19711 63736 46260 19789
++63736 46260 19789 62737 45569 19692 1413 1028 514 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 385 385 334
++50159 36373 15650 62986 45716 19556 63736 46260 19789 63736 46260 19789 63736 46260 19789
++62486 45353 19401 57142 41714 18588 3038 2204 899 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 3038 2204 899 23177 16932 7265 25195 18262 7789 23177 16932 7265
++15792 11440 4871 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 3038 2204 899 3038 2204 899 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 1413 1028 514
++27882 20284 8738 3038 2204 899 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 385 385 334 23177 16932 7265 25195 18262 7789
++23177 16932 7265 17750 12880 5633 0 0 0 128 128 128 5943 4354 1886
++23177 16932 7265 25195 18262 7789 23177 16932 7265 13872 10127 4336 0 0 0
++128 128 128 10498 7619 3259 23177 16932 7265 25195 18262 7789 23177 16932 7265
++8095 5986 2531 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 12931 12931 12931 35838 35838 35838
++1772 1533 1155 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++15440 15440 15440 11370 11370 11370 257 257 257 0 0 0 13752 13752 13752
++5911 5911 5911 8455 8455 8455 12931 12931 12931 0 0 0 0 0 0
++0 0 0 128 128 128 8455 8455 8455 46260 45809 45103 65278 65278 65278
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 48486 48538 48538
++5911 5911 5911 0 0 0 24991 24991 24991 61680 61680 61680 33681 33681 33681
++257 257 257 4480 4480 4480 642 642 899 1028 1285 1542 20263 20263 20263
++8455 8455 8455 257 257 257 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 27882 20284 8738 61861 44933 19292
++63736 46260 19789 63736 46260 19789 62486 45353 19401 17750 12880 5633 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 30933 22555 9803
++61861 44933 19292 63486 46079 19711 61451 44536 19168 19371 14059 6014 0 0 0
++0 0 0 3038 2204 899 63736 46260 19789 63736 46260 19789 63736 46260 19789
++40410 29471 12985 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 34164 24785 10813 61861 44933 19292 63486 46079 19711
++62340 45076 19410 62986 45716 19556 63112 45588 19556 63736 46260 19789 63736 46260 19789
++4874 3558 1459 0 0 0 0 0 0 0 0 0 50159 36373 15650
++63736 46260 19789 63736 46260 19789 61451 44536 19168 36240 26320 11215 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 43194 31354 13386 62340 45076 19410 63486 46335 19711
++63736 46260 19789 46996 34589 15727 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 28744 20827 9121
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 15792 11440 4871 128 128 128 0 0 0 0 0 0
++9123 6640 2832 15792 11440 4871 15792 11440 4871 15792 11440 4871 5943 4354 1886
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8373 6077 2600 63736 46260 19789 57302 45835 26989 59969 46214 26008
++45225 33169 15226 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 875 620 271 63736 46260 19789 57302 45835 26989
++59969 46214 26008 51150 38050 17516 0 0 0 0 0 0 17750 12880 5633
++61985 45298 20071 57302 45835 26989 61241 45992 22579 34164 24785 10813 0 0 0
++0 0 0 28744 20827 9121 61241 45992 22579 57302 45835 26989 61113 45548 20995
++20895 15087 6460 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 6810 6810 6810
++28239 28239 28239 642 642 899 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 16762 16762 16762 4480 4480 4480 0 0 0 0 0 0
++18995 18995 18995 128 128 128 20778 20778 20542 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 30840 30197 30069
++55126 55126 55126 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65278 65278 65278 56283 56283 56283 28239 28239 28239 514 514 514
++0 0 0 0 0 0 42507 42507 42507 17553 17553 17553 0 0 0
++0 0 0 0 0 0 9814 9814 9814 20263 20263 20263 1028 1028 1028
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 2402 1799 684 57142 41714 18588
++63236 45897 19634 63736 46260 19789 63736 46260 19789 61861 44933 19292 34164 24785 10813
++875 620 271 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 7209 5285 2184 37303 27193 11910 62737 45569 19692
++63736 46260 19789 63736 46260 19789 61451 44536 19168 19371 14059 6014 0 0 0
++128 128 128 3038 2204 899 63486 46079 19711 63864 46774 20174 63112 45588 19556
++40410 29471 12985 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 2402 1799 684 57142 41714 18588 63736 46260 19789
++63736 46260 19789 62340 45076 19410 61861 44933 19292 63736 46260 19789 63486 46079 19711
++4874 3558 1459 0 0 0 0 0 0 0 0 0 25195 18262 7789
++61451 44536 19168 63736 46260 19789 63736 46260 19789 61861 44933 19292 23177 16932 7265
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1413 1028 514 30933 22555 9803 62340 45076 19410 63736 46260 19789 63736 46260 19789
++61861 44933 19292 19371 14059 6014 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 9123 6640 2832 61861 44933 19292
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711 63736 46260 19789
++37303 27193 11910 128 128 128 0 0 0 0 0 0 0 0 0
++40410 29471 12985 61241 45992 22579 58276 44060 22272 61985 45298 20071 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8373 6077 2600 63483 46207 20056 43304 54355 65021 50629 49986 46941
++45225 33169 15226 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 1264 929 361 63483 46207 20056 44846 53841 61423
++50115 50774 49729 51150 38050 17516 0 0 0 0 0 0 17750 12880 5633
++58276 44060 22272 42919 54484 65535 54209 48830 40477 34164 24785 10813 0 0 0
++128 128 128 28744 20827 9121 54760 46836 33773 42919 54484 65535 58279 45589 26504
++20895 15087 6460 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1799 1799 1799 2313 2313 2313 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 18995 18995 18995 128 128 128 0 0 0
++17553 17553 17553 0 0 0 4480 4480 4480 17553 17553 17553 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1413 1670 1799 30840 30197 30069 53256 53199 52942 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
++60266 60266 60266 35838 35838 35838 3857 3857 3857 0 0 0 128 128 128
++0 0 0 0 0 0 3079 3079 3079 128 128 128 0 0 0
++0 0 0 17965 17965 17965 11370 11370 11370 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 12071 8729 3764
++61861 44933 19292 63486 46079 19711 63736 46260 19789 63736 46260 19789 61451 44536 19168
++55635 40828 18345 34164 24785 10813 25195 18262 7789 20895 15087 6460 27882 20284 8738
++34164 24785 10813 51340 37280 15909 63359 45859 19672 62340 45076 19410 63736 46260 19789
++63736 46260 19789 61861 44933 19292 57142 41714 18588 7209 5285 2184 0 0 0
++0 0 0 3038 2204 899 63736 46260 19789 63736 46260 19789 63736 46260 19789
++40410 29471 12985 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 17750 12880 5633 61861 44933 19292
++63736 46260 19789 63736 46260 19789 62986 45716 19556 63736 46260 19789 63736 46260 19789
++4874 3558 1459 0 0 0 0 0 0 0 0 0 385 385 334
++54363 39457 16879 62737 45569 19692 63736 46260 19789 63736 46260 19789 61451 44536 19168
++51340 37280 15909 34164 24785 10813 23177 16932 7265 25195 18262 7789 36240 26320 11215
++57142 41714 18588 61861 44933 19292 63736 46260 19789 63736 46260 19789 61861 44933 19292
++48838 36002 16378 0 0 0 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 54363 39457 16879 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 59002 43055 18866
++3855 2930 1607 0 0 0 0 0 0 0 0 0 0 0 0
++40410 29471 12985 54209 48830 40477 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8373 6077 2600 63736 46260 19789 58279 45589 26504 61241 45992 22579
++45225 33169 15226 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 875 620 271 63736 46260 19789 44846 53841 61423
++50115 50774 49729 51150 38050 17516 128 128 128 0 0 0 17750 12880 5633
++62856 45897 20023 58279 45589 26504 61113 45548 20995 34164 24785 10813 257 257 257
++0 0 0 28744 20827 9121 54760 46836 33773 42919 54484 65535 58279 45589 26504
++20895 15087 6460 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 11370 11370 11370 9814 9814 9814 0 0 0 0 0 0
++17553 17553 17553 0 0 0 0 0 0 12931 12931 12931 13752 13752 13752
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 31875 31875 31875 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 65535 65535 65535 64124 64124 64124 44589 44631 44888
++10459 10459 10459 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 0 0 0 128 128 128
++17553 17553 17553 3857 3857 3857 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++15792 11440 4871 60487 44116 19189 62737 45569 19692 63736 46260 19789 63736 46260 19789
++63736 46260 19789 62986 45716 19556 60487 44116 19189 61451 44536 19168 60487 44116 19189
++62486 45353 19401 63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46335 19711
++62340 45076 19410 46996 34589 15727 4874 3558 1459 0 0 0 0 0 0
++128 128 128 3038 2204 899 63486 46079 19711 63864 46774 20174 63112 45588 19556
++40410 29471 12985 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 43194 31354 13386
++61861 44933 19292 63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711
++4874 3558 1459 0 0 0 0 0 0 0 0 0 0 0 0
++8095 5986 2531 59002 43055 18866 62340 45076 19410 63736 46260 19789 63736 46260 19789
++63736 46260 19789 61861 44933 19292 60487 44116 19189 61451 44536 19168 63112 45588 19556
++63736 46260 19789 63736 46260 19789 63486 46335 19711 62340 45076 19410 54363 39457 16879
++3855 2930 1607 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 25195 18262 7789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++41427 30069 13197 50976 48701 42982 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 2402 1799 684 17750 12880 5633 17750 12880 5633 17750 12880 5633
++12071 8729 3764 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 1264 929 361 63483 46207 20056 44846 53841 61423
++50115 50774 49729 51150 38050 17516 0 0 0 0 0 0 4874 3558 1459
++17750 12880 5633 17750 12880 5633 17750 12880 5633 10498 7619 3259 0 0 0
++128 128 128 28744 20827 9121 54760 46836 33773 42533 53970 64764 58279 45589 26504
++20895 15087 6460 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++14506 14506 14506 15440 15440 15440 0 0 0 0 0 0 0 0 0
++18995 18995 18995 128 128 128 0 0 0 0 0 0 11370 11370 11370
++14506 14506 14506 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 31875 31875 31875 65535 65535 65535 65535 65535 65535
++65535 65535 65535 65535 65535 65535 52685 52685 52685 21838 21794 21532 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++18995 18995 18995 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8373 6077 2600 45225 33169 15226 62340 45076 19410 62340 45076 19410
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 62340 45076 19410 62340 45076 19410 54363 39457 16879
++19371 14059 6014 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 3038 2204 899 63736 46260 19789 63736 46260 19789 63736 46260 19789
++40410 29471 12985 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 4874 3558 1459
++61451 44536 19168 63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789
++4874 3558 1459 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 5943 4354 1886 40410 29471 12985 62486 45353 19401 62465 45547 19595
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63486 46079 19711 63736 46260 19789
++63736 46260 19789 62340 45076 19410 63112 45588 19556 41427 30069 13197 3038 2204 899
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 5943 4354 1886 59002 43055 18866 63486 46079 19455 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63486 46079 19711 37303 27193 11910 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++40410 29471 12985 54209 48830 40477 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 875 620 271 63736 46260 19789 44846 53841 61423
++50115 50774 49729 51150 38050 17516 128 128 128 0 0 0 0 0 0
++0 0 0 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 28744 20827 9121 54760 46836 33773 42919 54484 65535 58279 45589 26504
++20895 15087 6460 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 11370 11370 11370 20263 20263 20263
++3857 3857 3857 0 0 0 0 0 0 128 128 128 14506 14506 14506
++5911 5911 5911 0 0 0 0 0 0 0 0 0 385 385 334
++11370 11370 11370 15440 15440 15440 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 33681 33681 33681 65535 65535 65535 65535 65535 65535
++65535 65535 65535 56026 55897 55897 9814 9814 9814 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++14506 14506 14506 4480 4480 4480 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 385 385 334 12071 8729 3764 34164 24785 10813
++53070 38550 16467 61861 44933 19292 63736 46260 19789 63736 46260 19789 63112 45588 19556
++60487 44116 19189 53070 38550 16467 34164 24785 10813 13872 10127 4336 514 514 514
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 2402 1799 684 54363 39457 16879 54363 39457 16879 54363 39457 16879
++30933 22555 9803 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++23177 16932 7265 54363 39457 16879 54363 39457 16879 54363 39457 16879 53070 38550 16467
++3038 2204 899 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 0 0 0 257 257 257 9123 6640 2832 40410 29471 12985
++51340 37280 15909 60487 44116 19189 63486 46079 19711 63736 46260 19789 57142 41714 18588
++50159 36373 15650 34164 24785 10813 10498 7619 3259 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++385 385 334 43194 31354 13386 63236 45897 19634 63736 46260 19789 63736 46260 19789
++63736 46260 19789 62986 45716 19556 57142 41714 18588 3038 2204 899 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++41427 30069 13197 50976 48701 42982 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 3855 2930 1607 25195 18262 7789 25195 18262 7789 25195 18262 7789
++17750 12880 5633 0 0 0 0 0 0 10498 7619 3259 25195 18262 7789
++25195 18262 7789 25195 18262 7789 5943 4354 1886 0 0 0 13872 10127 4336
++34164 24785 10813 41427 30069 13197 41427 30069 13197 30933 22555 9803 19371 14059 6014
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++12071 8729 3764 25195 18262 7789 25195 18262 7789 25195 18262 7789 9123 6640 2832
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++7209 5285 2184 25195 18262 7789 25195 18262 7789 25195 18262 7789 12071 8729 3764
++7209 5285 2184 25195 18262 7789 25195 18262 7789 25195 18262 7789 25195 18262 7789
++2402 1799 684 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 20895 15087 6460 25195 18262 7789 25195 18262 7789
++25195 18262 7789 13872 10127 4336 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 1264 929 361 63483 46207 20056 44846 53841 61423
++50115 50774 49729 51150 38050 17516 0 0 0 0 0 0 7209 5285 2184
++25195 18262 7789 25195 18262 7789 25195 18262 7789 13872 10127 4336 0 0 0
++128 128 128 28744 20827 9121 54760 46836 33773 42533 53970 64764 58279 45589 26504
++20895 15087 6460 2402 1799 684 22224 16071 6824 37303 27193 11910 42654 31649 16191
++36240 26320 11215 23177 16932 7265 9123 6640 2832 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 13872 10127 4336 25195 18262 7789
++25195 18262 7789 25195 18262 7789 2402 1799 684 12071 8729 3764 34164 24785 10813
++42654 31649 16191 37303 27193 11910 4874 3558 1459 0 0 0 0 0 0
++0 0 0 0 0 0 8095 5986 2531 23177 16932 7265 34164 24785 10813
++42654 31649 16191 40410 29471 12985 34164 24785 10813 13872 10127 4336 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 16762 16762 16762 8455 8455 8455 128 128 128
++0 0 0 0 0 0 0 0 0 17553 17553 17553 11370 11370 11370
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++1413 1670 1799 21838 21794 21532 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 33681 33681 33681 65535 65535 65535 65535 65535 65535
++62065 62065 62065 18995 18995 18995 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 21838 21794 21532 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 0 0 0
++0 0 0 0 0 0 1413 1028 514 4874 3558 1459 385 385 334
++0 0 0 0 0 0 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 257 257 257
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 128 128 128 128 128 128 128 128 128
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 3038 2204 899 1413 1028 514 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++22224 16071 6824 63864 46774 20174 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 17750 12880 5633 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++40410 29471 12985 54209 48830 40477 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8373 6077 2600 63736 46260 19789 56972 46962 30007 59969 46214 26008
++45225 33169 15226 0 0 0 0 0 0 20895 15087 6460 61113 45548 20995
++56972 46962 30007 61113 45548 20995 23177 16932 7265 48838 36002 16378 61113 45548 20995
++56278 47802 34950 50976 48701 42982 56411 51914 44332 54760 46836 33773 61241 45992 22579
++48838 36002 16378 8095 5986 2531 0 0 0 0 0 0 0 0 0
++30042 21792 9253 61241 45992 22579 56972 46962 30007 61113 45548 20995 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++17750 12880 5633 62856 45897 20023 56972 46962 30007 61241 45992 22579 30933 22555 9803
++875 620 271 46996 34589 15727 62859 46189 20912 56972 46962 30007 61241 45992 22579
++34164 24785 10813 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 13872 10127 4336 61985 45298 20071 56972 46962 30007 59969 46214 26008
++61451 44536 19168 8095 5986 2531 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 875 620 271 63736 46260 19789 44846 53841 61423
++50115 50774 49729 51150 38050 17516 128 128 128 0 0 0 17750 12880 5633
++61985 45298 20071 56972 46962 30007 61241 45992 22579 34164 24785 10813 128 128 128
++0 0 0 28744 20827 9121 54760 46836 33773 42919 54484 65535 58279 45589 26504
++34164 24785 10813 59002 43055 18866 58279 45589 26504 54209 48830 40477 50629 49986 46941
++54209 48830 40477 57302 45835 26989 62856 45897 20023 28744 20827 9121 257 257 257
++0 0 0 0 0 0 0 0 0 34164 24785 10813 61241 45992 22579
++56972 46962 30007 63483 46207 20056 30933 22555 9803 61985 45298 20071 56278 47802 34950
++50629 49986 46941 62856 45897 20023 12071 8729 3764 0 0 0 0 0 0
++1413 1028 514 30933 22555 9803 61985 45298 20071 57302 45835 26989 56278 47802 34950
++50629 49986 46941 54209 48830 40477 56278 47802 34950 61113 45548 20995 53705 39676 18339
++15792 11440 4871 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 1799 1799 1799 17553 17553 17553 128 128 128 0 0 0
++12931 12931 12931 18995 18995 18995 20778 20778 20542 4480 4480 4480 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++21292 21292 21292 1028 1028 1028 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 30840 30197 30069 65535 65535 65535 65535 65535 65535
++50115 50774 49729 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8455 8455 8455 15440 15440 15440 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 5943 4354 1886
++60487 44116 19189 63236 45897 19634 63736 46260 19789 63736 46260 19789 63486 46079 19711
++63736 46260 19789 37303 27193 11910 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++41427 30069 13197 50976 48701 42982 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8373 6077 2600 62856 45897 20023 43304 54355 65021 50629 49986 46941
++45225 33169 15226 0 0 0 385 385 334 17750 12880 5633 58279 45589 26504
++42919 54484 65535 57302 45835 26989 61451 44536 19168 56972 46962 30007 50115 50774 49729
++54209 48830 40477 54209 48830 40477 50629 49986 46941 44846 53841 61423 43818 54098 63479
++56278 47802 34950 46996 34589 15727 0 0 0 0 0 0 0 0 0
++30042 21792 9253 54760 46836 33773 42533 53970 64764 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++17750 12880 5633 58279 45589 26504 42533 53970 64764 54209 48830 40477 30933 22555 9803
++0 0 0 7209 5285 2184 60373 44510 19999 50115 51271 50886 47031 52942 56540
++62856 45897 20023 12071 8729 3764 0 0 0 0 0 0 128 128 128
++875 620 271 55635 40828 18345 50976 48701 42982 44846 53841 61423 61113 45548 20995
++23177 16932 7265 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 1264 929 361 63483 46207 20056 44846 53841 61423
++50115 50774 49729 51150 38050 17516 0 0 0 0 0 0 17750 12880 5633
++58276 44060 22272 42533 53970 64764 54209 48830 40477 34164 24785 10813 0 0 0
++128 128 128 28744 20827 9121 54760 46836 33773 42533 53970 64764 58279 45589 26504
++64250 47031 20303 50976 48701 42982 50115 50774 49729 54209 48830 40477 54209 48830 40477
++50115 50774 49729 43818 54098 63479 47031 52942 56540 61241 45992 22579 37303 27193 11910
++0 0 0 0 0 0 0 0 0 30933 22555 9803 54760 46836 33773
++42919 54484 65535 61113 45548 20995 63486 46079 19455 47031 52942 56540 44846 53841 61423
++47031 52942 56540 61113 45548 20995 12071 8729 3764 128 128 128 2402 1799 684
++55635 40828 18345 58279 45589 26504 47031 52942 56540 47031 52942 56540 54209 48830 40477
++56972 46962 30007 54209 48830 40477 50115 50774 49729 43304 54355 65021 50976 48701 42982
++61985 45298 20071 15792 11440 4871 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 11370 11370 11370 7197 7197 7197 0 0 0 22881 22881 22881
++6427 6427 6427 128 128 128 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 14506 14506 14506
++7197 7197 7197 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 12931 12931 12931 64764 64764 64764 65535 65535 65535
++40984 40984 40984 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 13752 13752 13752 12931 12931 12931 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 43194 31354 13386
++63359 45859 19672 63486 46079 19711 63736 46260 19789 63736 46260 19789 63236 45897 19634
++57142 41714 18588 3855 2930 1607 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++40410 29471 12985 54209 48830 40477 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8373 6077 2600 63736 46260 19789 42919 54484 65535 50976 48701 42982
++46996 34589 15727 0 0 0 0 0 0 17750 12880 5633 58276 44060 22272
++42919 54484 65535 56972 46962 30007 61241 45992 22579 56972 46962 30007 59002 43055 18866
++40410 29471 12985 34164 24785 10813 48838 36002 16378 61241 45992 22579 47031 52942 56540
++44846 53841 61423 62859 46189 20912 13872 10127 4336 0 0 0 0 0 0
++28744 20827 9121 54760 46836 33773 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++17750 12880 5633 58276 44060 22272 42919 54484 65535 56278 47802 34950 30933 22555 9803
++875 620 271 0 0 0 22224 16071 6824 61113 45548 20995 44846 53841 61423
++54209 48830 40477 53705 39676 18339 257 257 257 128 128 128 0 0 0
++30933 22555 9803 58279 45589 26504 43304 54355 65021 54760 46836 33773 45225 33169 15226
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 875 620 271 63736 46260 19789 44846 53841 61423
++50115 50774 49729 51150 38050 17516 128 128 128 0 0 0 17750 12880 5633
++58276 44060 22272 42919 54484 65535 54209 48830 40477 34164 24785 10813 257 257 257
++0 0 0 28744 20827 9121 54760 46836 33773 42919 54484 65535 58279 45589 26504
++56972 46962 30007 59969 46214 26008 55635 40828 18345 40410 29471 12985 37303 27193 11910
++55635 40828 18345 58279 45589 26504 44846 53841 61423 45746 53327 59238 61985 45298 20071
++7209 5285 2184 128 128 128 0 0 0 30042 21792 9253 54760 46836 33773
++42919 54484 65535 61113 45548 20995 56972 46962 30007 58279 45589 26504 62856 45897 20023
++59002 43055 18866 62737 45569 19692 12071 8729 3764 0 0 0 36240 26320 11215
++56972 46962 30007 43304 54355 65021 54209 48830 40477 61985 45298 20071 40410 29471 12985
++27882 20284 8738 34164 24785 10813 55635 40828 18345 57302 45835 26989 44846 53841 61423
++50629 49986 46941 59002 43055 18866 642 642 899 128 128 128 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 7197 7197 7197 11370 11370 11370 5911 5911 5911 13752 13752 13752
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 1028 1028 1028 20778 20778 20542
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 257 257 257 51400 51400 51400 65021 65021 65021
++44589 44631 44888 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 257 257 257 11370 11370 11370 16136 16136 16136
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 22224 16071 6824 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++17750 12880 5633 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++41427 30069 13197 50976 48701 42982 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8373 6077 2600 63483 46207 20056 43304 54355 65021 50629 49986 46941
++45225 33169 15226 0 0 0 385 385 334 15792 11440 4871 58279 45589 26504
++42919 54484 65535 50115 51271 50886 59969 46214 26008 45225 33169 15226 2402 1799 684
++128 128 128 0 0 0 128 128 128 40410 29471 12985 56278 47802 34950
++43304 54355 65021 54760 46836 33773 30042 21792 9253 0 0 0 0 0 0
++30042 21792 9253 54760 46836 33773 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++17750 12880 5633 59969 46214 26008 42533 53970 64764 54209 48830 40477 30933 22555 9803
++0 0 0 0 0 0 0 0 0 42654 31649 16191 56972 46962 30007
++43818 54098 63479 58279 45589 26504 30042 21792 9253 0 0 0 9123 6640 2832
++61985 45298 20071 47031 52942 56540 50115 50774 49729 59002 43055 18866 4874 3558 1459
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 1264 929 361 63483 46207 20056 44846 53841 61423
++50115 50774 49729 51150 38050 17516 0 0 0 257 257 257 15792 11440 4871
++59969 46214 26008 43304 54355 65021 54209 48830 40477 34164 24785 10813 0 0 0
++128 128 128 28744 20827 9121 54760 46836 33773 42919 54484 65535 48573 52299 53199
++59969 46214 26008 40410 29471 12985 642 642 899 128 128 128 128 128 128
++1413 1028 514 45225 33169 15226 56278 47802 34950 43304 54355 65021 54760 46836 33773
++34164 24785 10813 0 0 0 0 0 0 28744 20827 9121 54760 46836 33773
++43304 54355 65021 59969 46214 26008 62856 45897 20023 45225 33169 15226 4874 3558 1459
++128 128 128 1264 929 361 1264 929 361 10498 7619 3259 61985 45298 20071
++47031 52942 56540 50115 51271 50886 60373 44510 19999 9123 6640 2832 0 0 0
++128 128 128 128 128 128 1772 1533 1155 45225 33169 15226 56278 47802 34950
++42919 54484 65535 58276 44060 22272 22224 16071 6824 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 20263 20263 20263 3079 3079 3079 14506 14506 14506
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18995 18995 18995 1799 1799 1799
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 24991 24991 24991 65278 65278 65278
++57470 57470 57470 2313 2313 2313 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 6427 6427 6427
++21292 21292 21292 18336 18336 18336 11370 11370 11370 10459 10459 10459 18995 18995 18995
++22881 22881 22881 0 0 0 0 0 0 0 0 0 20778 20778 20542
++3857 3857 3857 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 5943 4354 1886 59002 43055 18866 63486 46079 19455
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63236 45897 19634 40410 29471 12985
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++40410 29471 12985 54209 48830 40477 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8373 6077 2600 63483 46207 20056 42919 54484 65535 50976 48701 42982
++46996 34589 15727 0 0 0 0 0 0 15792 11440 4871 58276 44060 22272
++42919 54484 65535 47031 52942 56540 61985 45298 20071 5943 4354 1886 128 128 128
++0 0 0 0 0 0 0 0 0 15792 11440 4871 58276 44060 22272
++42919 54484 65535 54209 48830 40477 37303 27193 11910 0 0 0 0 0 0
++28744 20827 9121 54760 46836 33773 43304 54355 65021 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++17750 12880 5633 58276 44060 22272 42919 54484 65535 56278 47802 34950 30933 22555 9803
++875 620 271 0 0 0 0 0 0 3855 2930 1607 59002 43055 18866
++50629 49986 46941 48573 52299 53199 61113 45548 20995 8373 6077 2600 48838 36002 16378
++54209 48830 40477 45746 53327 59238 61985 45298 20071 17750 12880 5633 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 875 620 271 63736 46260 19789 44846 53841 61423
++50115 50774 49729 51150 38050 17516 128 128 128 0 0 0 17750 12880 5633
++58276 44060 22272 42919 54484 65535 54209 48830 40477 34164 24785 10813 257 257 257
++0 0 0 28744 20827 9121 54760 46836 33773 42919 54484 65535 47031 52942 56540
++61985 45298 20071 3038 2204 899 128 128 128 0 0 0 0 0 0
++0 0 0 12071 8729 3764 61113 45548 20995 43304 54355 65021 48573 52299 53199
++59002 43055 18866 128 128 128 0 0 0 27882 20284 8738 54760 46836 33773
++42919 54484 65535 47031 52942 56540 60373 44510 19999 1413 1028 514 128 128 128
++0 0 0 0 0 0 0 0 0 40410 29471 12985 54209 48830 40477
++43304 54355 65021 57302 45835 26989 25195 18262 7789 875 620 271 0 0 0
++0 0 0 0 0 0 0 0 0 8095 5986 2531 62859 46189 20912
++44846 53841 61423 50629 49986 46941 51150 38050 17516 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 9814 9814 9814 12931 12931 12931 20778 20778 20542
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 18711 18711 18711 0 0 0
++0 0 0 0 0 0 18517 18517 18517 11370 11370 11370 0 0 0
++0 0 0 0 0 0 0 0 0 385 385 334 38406 38021 37650
++65021 65021 65021 28239 28239 28239 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 642 642 899 6427 6427 6427 8455 8455 8455 1028 1028 1028
++16762 16762 16762 0 0 0 642 642 899 21292 21292 21292 26342 26738 26738
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 43194 31354 13386 63359 45859 19672 63736 46260 19789
++63736 46260 19789 63736 46260 19789 62986 45716 19556 59002 43055 18866 3855 2930 1607
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++41427 30069 13197 50976 48701 42982 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8373 6077 2600 63483 46207 20056 43304 54355 65021 50629 49986 46941
++45225 33169 15226 0 0 0 385 385 334 15792 11440 4871 58279 45589 26504
++42919 54484 65535 50629 49986 46941 48838 36002 16378 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 10498 7619 3259 62859 46189 20912
++43304 54355 65021 50629 49986 46941 45225 33169 15226 0 0 0 0 0 0
++30042 21792 9253 54760 46836 33773 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++17750 12880 5633 59969 46214 26008 42533 53970 64764 54209 48830 40477 30933 22555 9803
++0 0 0 0 0 0 0 0 0 0 0 0 17750 12880 5633
++61985 45298 20071 45746 53327 59238 54209 48830 40477 57142 41714 18588 61241 45992 22579
++43818 54098 63479 57302 45835 26989 37303 27193 11910 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 1264 929 361 63483 46207 20056 44846 53841 61423
++50115 50774 49729 51150 38050 17516 0 0 0 257 257 257 15792 11440 4871
++59969 46214 26008 43304 54355 65021 54209 48830 40477 34164 24785 10813 0 0 0
++128 128 128 28744 20827 9121 54760 46836 33773 43304 54355 65021 50976 48701 42982
++41427 30069 13197 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 58276 44060 22272 48573 52299 53199 44846 53841 61423
++62856 45897 20023 875 620 271 0 0 0 27882 20284 8738 54760 46836 33773
++42919 54484 65535 54209 48830 40477 40410 29471 12985 128 128 128 0 0 0
++0 0 0 0 0 0 257 257 257 55635 40828 18345 50115 51271 50886
++43818 54098 63479 63483 46207 20056 7209 5285 2184 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 53705 39676 18339
++50115 51271 50886 45746 53327 59238 63483 46207 20056 875 620 271 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 13752 13752 13752 22359 22625 23010
++12931 12931 12931 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 11370 11370 11370 5911 5911 5911 0 0 0
++4480 4480 4480 21292 21292 21292 21292 21292 21292 1799 1799 1799 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++33681 33681 33681 53256 53199 52942 1799 1927 2184 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 18336 18336 18336
++1028 1285 1542 7197 7197 7197 22881 22881 22881 16762 16762 16762 5911 5911 5911
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 22224 16071 6824 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 19371 14059 6014 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++40410 29471 12985 54209 48830 40477 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8373 6077 2600 63483 46207 20056 42919 54484 65535 50976 48701 42982
++46996 34589 15727 0 0 0 0 0 0 15792 11440 4871 58276 44060 22272
++42919 54484 65535 54209 48830 40477 37303 27193 11910 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 5943 4354 1886 63483 46207 20056
++42919 54484 65535 50629 49986 46941 48838 36002 16378 128 128 128 0 0 0
++28744 20827 9121 54760 46836 33773 43304 54355 65021 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++17750 12880 5633 58276 44060 22272 42919 54484 65535 56278 47802 34950 30933 22555 9803
++875 620 271 0 0 0 0 0 0 0 0 0 0 0 0
++37303 27193 11910 57302 45835 26989 44846 53841 61423 59969 46214 26008 48573 52299 53199
++50976 48701 42982 57142 41714 18588 1772 1533 1155 257 257 257 0 0 0
++0 0 0 0 0 0 34164 24785 10813 37303 27193 11910 40410 29471 12985
++37303 27193 11910 40410 29471 12985 37303 27193 11910 40410 29471 12985 37303 27193 11910
++25195 18262 7789 0 0 0 875 620 271 63736 46260 19789 44846 53841 61423
++50115 50774 49729 51150 38050 17516 128 128 128 0 0 0 17750 12880 5633
++58276 44060 22272 42919 54484 65535 54209 48830 40477 34164 24785 10813 257 257 257
++0 0 0 28744 20827 9121 54760 46836 33773 42919 54484 65535 56278 47802 34950
++30933 22555 9803 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 53705 39676 18339 50115 51271 50886 43304 54355 65021
++63486 46079 19711 5943 4354 1886 128 128 128 27882 20284 8738 54760 46836 33773
++43304 54355 65021 54760 46836 33773 28744 20827 9121 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 62856 45897 20023 45746 53327 59238
++47031 52942 56540 63486 46079 19455 55635 40828 18345 57142 41714 18588 55635 40828 18345
++57142 41714 18588 55635 40828 18345 57142 41714 18588 55635 40828 18345 61113 45548 20995
++54209 48830 40477 42919 54484 65535 63483 46207 20056 7209 5285 2184 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 257 257 257 10459 10459 10459
++38406 38021 37650 1028 1285 1542 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 16136 16136 16136 385 385 334 0 0 0
++21838 21794 21532 0 0 0 17553 17553 17553 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 17553 17553 17553 15440 15440 15440 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 12931 12931 12931 24991 24991 24991
++19317 19131 18746 11370 11370 11370 4480 4480 4480 17965 17965 17965 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++5943 4354 1886 59002 43055 18866 63236 45897 19634 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19455 41427 30069 13197 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++41427 30069 13197 50976 48701 42982 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8373 6077 2600 63483 46207 20056 43304 54355 65021 50629 49986 46941
++45225 33169 15226 0 0 0 385 385 334 15792 11440 4871 58279 45589 26504
++42919 54484 65535 56278 47802 34950 34164 24785 10813 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 7209 5285 2184 63483 46207 20056
++43304 54355 65021 50629 49986 46941 46996 34589 15727 0 0 0 0 0 0
++30042 21792 9253 54760 46836 33773 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++17750 12880 5633 59969 46214 26008 42533 53970 64764 54209 48830 40477 30933 22555 9803
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++2402 1799 684 53705 39676 18339 54209 48830 40477 45746 53327 59238 47031 52942 56540
++61985 45298 20071 13872 10127 4336 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 60373 44510 19999 56278 47802 34950 54209 48830 40477
++54209 48830 40477 54209 48830 40477 54209 48830 40477 54209 48830 40477 56972 46962 30007
++42654 31649 16191 0 0 0 1264 929 361 63483 46207 20056 44846 53841 61423
++50115 50774 49729 51150 38050 17516 0 0 0 257 257 257 15792 11440 4871
++59969 46214 26008 43304 54355 65021 54209 48830 40477 34164 24785 10813 0 0 0
++128 128 128 28744 20827 9121 54760 46836 33773 42533 53970 64764 54760 46836 33773
++25195 18262 7789 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 48838 36002 16378 50629 49986 46941 42919 54484 65535
++61113 45548 20995 13872 10127 4336 0 0 0 27882 20284 8738 54760 46836 33773
++42919 54484 65535 57302 45835 26989 23177 16932 7265 0 0 0 0 0 0
++0 0 0 0 0 0 3038 2204 899 63736 46260 19789 43818 54098 63479
++44846 53841 61423 48573 52299 53199 48573 52299 53199 48573 52299 53199 48573 52299 53199
++48573 52299 53199 48573 52299 53199 48573 52299 53199 48573 52299 53199 48573 52299 53199
++47031 52942 56540 42919 54484 65535 61113 45548 20995 13872 10127 4336 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++7197 7197 7197 11370 11370 11370 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 10459 10459 10459 7197 7197 7197 642 642 899
++17965 17965 17965 0 0 0 9814 9814 9814 10459 10459 10459 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 257 257 257 24991 24991 24991 5911 5911 5911
++0 0 0 4480 4480 4480 20263 20263 20263 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++43194 31354 13386 63486 46079 19455 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63236 45897 19634 59002 43055 18866 4874 3558 1459 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++40410 29471 12985 54209 48830 40477 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8373 6077 2600 63483 46207 20056 42919 54484 65535 50976 48701 42982
++46996 34589 15727 0 0 0 0 0 0 15792 11440 4871 58276 44060 22272
++42919 54484 65535 54209 48830 40477 34164 24785 10813 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 5943 4354 1886 63483 46207 20056
++42919 54484 65535 50629 49986 46941 48838 36002 16378 128 128 128 0 0 0
++28744 20827 9121 54760 46836 33773 43304 54355 65021 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++17750 12880 5633 58276 44060 22272 42919 54484 65535 56278 47802 34950 30933 22555 9803
++875 620 271 0 0 0 0 0 0 0 0 0 0 0 0
++2402 1799 684 57142 41714 18588 50976 48701 42982 44846 53841 61423 45746 53327 59238
++61985 45298 20071 15792 11440 4871 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 59002 43055 18866 50115 50774 49729 47031 52942 56540
++47031 52942 56540 47031 52942 56540 47031 52942 56540 47031 52942 56540 54209 48830 40477
++43194 31354 13386 257 257 257 875 620 271 63736 46260 19789 44846 53841 61423
++50115 50774 49729 51150 38050 17516 128 128 128 0 0 0 17750 12880 5633
++58276 44060 22272 42919 54484 65535 54209 48830 40477 34164 24785 10813 257 257 257
++0 0 0 28744 20827 9121 54760 46836 33773 42919 54484 65535 57302 45835 26989
++22224 16071 6824 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 46996 34589 15727 50629 49986 46941 43304 54355 65021
++61241 45992 22579 13872 10127 4336 0 0 0 27882 20284 8738 54760 46836 33773
++42533 53970 64764 57302 45835 26989 22224 16071 6824 0 0 0 0 0 0
++0 0 0 0 0 0 2402 1799 684 63736 46260 19789 43818 54098 63479
++48573 52299 53199 57302 45835 26989 57302 45835 26989 57302 45835 26989 57302 45835 26989
++57302 45835 26989 57302 45835 26989 57302 45835 26989 57302 45835 26989 57302 45835 26989
++57302 45835 26989 57302 45835 26989 61985 45298 20071 19371 14059 6014 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 257 257 257 19317 19131 18746 1799 1799 1799
++16762 16762 16762 0 0 0 0 0 0 17553 17553 17553 3857 3857 3857
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 0 0 0 0 0 0
++3857 3857 3857 21292 21292 21292 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 22224 16071 6824
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63486 46079 19711 22224 16071 6824 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++41427 30069 13197 50976 48701 42982 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8373 6077 2600 63483 46207 20056 43304 54355 65021 50629 49986 46941
++45225 33169 15226 0 0 0 385 385 334 15792 11440 4871 58279 45589 26504
++42919 54484 65535 56278 47802 34950 34164 24785 10813 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 7209 5285 2184 63483 46207 20056
++43304 54355 65021 50629 49986 46941 46996 34589 15727 0 0 0 0 0 0
++30042 21792 9253 54760 46836 33773 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++19371 14059 6014 58279 45589 26504 42533 53970 64764 54209 48830 40477 30933 22555 9803
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++40410 29471 12985 57302 45835 26989 43818 54098 63479 59969 46214 26008 48573 52299 53199
++50629 49986 46941 57142 41714 18588 3038 2204 899 0 0 0 0 0 0
++0 0 0 0 0 0 53705 39676 18339 60373 44510 19999 59002 43055 18866
++60373 44510 19999 59002 43055 18866 60373 44510 19999 59002 43055 18866 60373 44510 19999
++37303 27193 11910 0 0 0 1264 929 361 63483 46207 20056 44846 53841 61423
++50115 50774 49729 51150 38050 17516 0 0 0 257 257 257 15792 11440 4871
++59969 46214 26008 43304 54355 65021 54209 48830 40477 34164 24785 10813 0 0 0
++128 128 128 28744 20827 9121 54760 46836 33773 42533 53970 64764 54760 46836 33773
++27882 20284 8738 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 257 257 257 51150 38050 17516 50115 50774 49729 42919 54484 65535
++62856 45897 20023 8373 6077 2600 0 0 0 27882 20284 8738 54760 46836 33773
++42919 54484 65535 57302 45835 26989 22224 16071 6824 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 60373 44510 19999 47031 52942 56540
++47031 52942 56540 60373 44510 19999 20895 15087 6460 19371 14059 6014 20895 15087 6460
++19371 14059 6014 20895 15087 6460 19371 14059 6014 20895 15087 6460 19371 14059 6014
++20895 15087 6460 19371 14059 6014 20895 15087 6460 5943 4354 1886 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 10459 10459 10459 9814 9814 9814
++18995 18995 18995 257 257 257 0 0 0 0 0 0 20778 20778 20542
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 3079 3079 3079
++22359 22625 23010 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 5943 4354 1886 59002 43055 18866
++63236 45897 19634 63736 46260 19789 63736 46260 19789 63736 46260 19789 62986 45716 19556
++43194 31354 13386 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++40410 29471 12985 54209 48830 40477 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8373 6077 2600 63483 46207 20056 42919 54484 65535 50976 48701 42982
++46996 34589 15727 0 0 0 0 0 0 15792 11440 4871 58276 44060 22272
++42919 54484 65535 54209 48830 40477 34164 24785 10813 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 5943 4354 1886 63483 46207 20056
++42919 54484 65535 50629 49986 46941 48838 36002 16378 128 128 128 0 0 0
++28744 20827 9121 54760 46836 33773 43304 54355 65021 56972 46962 30007 22224 16071 6824
++385 385 334 0 0 0 0 0 0 0 0 0 0 0 0
++25195 18262 7789 56972 46962 30007 42919 54484 65535 56278 47802 34950 30933 22555 9803
++875 620 271 0 0 0 0 0 0 0 0 0 17750 12880 5633
++61985 45298 20071 45746 53327 59238 54209 48830 40477 59002 43055 18866 59969 46214 26008
++43818 54098 63479 56972 46962 30007 42654 31649 16191 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++128 128 128 128 128 128 128 128 128 128 128 128 128 128 128
++128 128 128 128 128 128 875 620 271 63736 46260 19789 44846 53841 61423
++50115 50774 49729 51150 38050 17516 128 128 128 0 0 0 17750 12880 5633
++58276 44060 22272 42919 54484 65535 54209 48830 40477 34164 24785 10813 257 257 257
++0 0 0 28744 20827 9121 54760 46836 33773 42919 54484 65535 54209 48830 40477
++34164 24785 10813 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 57142 41714 18588 48573 52299 53199 44846 53841 61423
++63483 46207 20056 1413 1028 514 128 128 128 27882 20284 8738 54760 46836 33773
++42533 53970 64764 57302 45835 26989 20895 15087 6460 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 51150 38050 17516 50115 51271 50886
++44846 53841 61423 63483 46207 20056 1264 929 361 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 20263 20263 20263
++18336 18336 18336 8455 8455 8455 0 0 0 128 128 128 3079 3079 3079
++17965 17965 17965 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 22359 22625 23010
++8455 8455 8455 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 9814 9814 9814 20778 20778 20542
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 43194 31354 13386 63359 45859 19672
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63236 45897 19634 60487 44116 19189
++5943 4354 1886 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++41427 30069 13197 50976 48701 42982 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8373 6077 2600 63483 46207 20056 43304 54355 65021 50629 49986 46941
++45225 33169 15226 0 0 0 385 385 334 15792 11440 4871 58279 45589 26504
++42919 54484 65535 56278 47802 34950 34164 24785 10813 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 7209 5285 2184 63483 46207 20056
++43304 54355 65021 50629 49986 46941 46996 34589 15727 0 0 0 128 128 128
++23177 16932 7265 56972 46962 30007 42919 54484 65535 54760 46836 33773 27882 20284 8738
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++40410 29471 12985 54209 48830 40477 42533 53970 64764 54209 48830 40477 30933 22555 9803
++0 0 0 0 0 0 257 257 257 3855 2930 1607 60373 44510 19999
++50629 49986 46941 47031 52942 56540 62465 45547 19595 10498 7619 3259 51340 37280 15909
++54209 48830 40477 44846 53841 61423 61113 45548 20995 20895 15087 6460 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 1264 929 361 63483 46207 20056 44846 53841 61423
++50115 50774 49729 51150 38050 17516 0 0 0 257 257 257 15792 11440 4871
++59969 46214 26008 43304 54355 65021 54209 48830 40477 34164 24785 10813 0 0 0
++128 128 128 28744 20827 9121 54760 46836 33773 43304 54355 65021 50629 49986 46941
++51150 38050 17516 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 4874 3558 1459 62737 45569 19692 44846 53841 61423 47031 52942 56540
++60373 44510 19999 0 0 0 0 0 0 27882 20284 8738 54760 46836 33773
++42919 54484 65535 57302 45835 26989 22224 16071 6824 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 45225 33169 15226 50976 48701 42982
++42533 53970 64764 61241 45992 22579 20895 15087 6460 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 15792 11440 4871
++23177 16932 7265 4874 3558 1459 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++16136 16136 16136 30583 30843 31357 0 0 0 0 0 0 0 0 0
++9814 9814 9814 17965 17965 17965 128 128 128 0 0 0 0 0 0
++0 0 0 17553 17553 17553 4480 4480 4480 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 18995 18995 18995
++13752 13752 13752 20263 20263 20263 1413 1670 1799 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 17553 17553 17553 12931 12931 12931 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 20895 15087 6460 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789 23177 16932 7265
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++40410 29471 12985 54209 48830 40477 42919 54484 65535 57302 45835 26989 22224 16071 6824
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 8373 6077 2600 63483 46207 20056 42919 54484 65535 50976 48701 42982
++46996 34589 15727 0 0 0 0 0 0 15792 11440 4871 58276 44060 22272
++42919 54484 65535 54209 48830 40477 34164 24785 10813 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 5943 4354 1886 63483 46207 20056
++42919 54484 65535 50629 49986 46941 48838 36002 16378 128 128 128 0 0 0
++15792 11440 4871 58276 44060 22272 42919 54484 65535 54209 48830 40477 42654 31649 16191
++128 128 128 0 0 0 0 0 0 0 0 0 9123 6640 2832
++61985 45298 20071 47031 52942 56540 43304 54355 65021 56278 47802 34950 30933 22555 9803
++875 620 271 0 0 0 0 0 0 45225 33169 15226 56972 46962 30007
++43304 54355 65021 61241 45992 22579 28744 20827 9121 257 257 257 9123 6640 2832
++61985 45298 20071 47031 52942 56540 50115 51271 50886 60373 44510 19999 5943 4354 1886
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 875 620 271 63736 46260 19789 44846 53841 61423
++50115 50774 49729 51150 38050 17516 128 128 128 0 0 0 17750 12880 5633
++58276 44060 22272 42919 54484 65535 54209 48830 40477 34164 24785 10813 257 257 257
++0 0 0 28744 20827 9121 54760 46836 33773 42919 54484 65535 50115 50774 49729
++62856 45897 20023 12071 8729 3764 385 385 334 0 0 0 0 0 0
++0 0 0 28744 20827 9121 57302 45835 26989 42919 54484 65535 54209 48830 40477
++43194 31354 13386 128 128 128 0 0 0 27882 20284 8738 54760 46836 33773
++42533 53970 64764 57302 45835 26989 20895 15087 6460 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 20895 15087 6460 61241 45992 22579
++43818 54098 63479 50976 48701 42982 51150 38050 17516 2402 1799 684 0 0 0
++0 0 0 0 0 0 0 0 0 9123 6640 2832 60373 44510 19999
++58279 45589 26504 63093 45874 19660 48838 36002 16378 1264 929 361 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 13752 13752 13752 9814 9814 9814 0 0 0 0 0 0
++0 0 0 6810 6810 6810 21292 21292 21292 0 0 0 0 0 0
++0 0 0 10459 10459 10459 24991 24991 24991 15440 15440 15440 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 1799 1927 2184
++19317 19131 18746 1028 1028 1028 20778 20778 20542 15440 15440 15440 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++14506 14506 14506 28239 28239 28239 5911 5911 5911 0 0 0 0 0 0
++0 0 0 4480 4480 4480 4480 4480 4480 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 4874 3558 1459 59002 43055 18866 63236 45897 19634 63736 46260 19789
++63736 46260 19789 63736 46260 19789 63112 45588 19556 45225 33169 15226 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++41427 30069 13197 50976 48701 42982 42919 54484 65535 57302 45835 26989 48838 36002 16378
++41427 30069 13197 41427 30069 13197 41427 30069 13197 41427 30069 13197 41427 30069 13197
++41427 30069 13197 41427 30069 13197 41427 30069 13197 41427 30069 13197 37303 27193 11910
++0 0 0 8373 6077 2600 63483 46207 20056 43304 54355 65021 50629 49986 46941
++45225 33169 15226 0 0 0 385 385 334 15792 11440 4871 58279 45589 26504
++42919 54484 65535 56278 47802 34950 34164 24785 10813 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 7209 5285 2184 63483 46207 20056
++43304 54355 65021 50629 49986 46941 46996 34589 15727 0 0 0 0 0 0
++8373 6077 2600 62859 46189 20912 44846 53841 61423 45746 53327 59238 62737 45569 19692
++27882 20284 8738 9123 6640 2832 10498 7619 3259 25195 18262 7789 60373 44510 19999
++59969 46214 26008 62859 46189 20912 42533 53970 64764 54209 48830 40477 30933 22555 9803
++0 0 0 0 0 0 23177 16932 7265 61113 45548 20995 44846 53841 61423
++54209 48830 40477 51150 38050 17516 875 620 271 0 0 0 257 257 257
++30042 21792 9253 59969 46214 26008 42533 53970 64764 56278 47802 34950 46996 34589 15727
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 1264 929 361 63483 46207 20056 44846 53841 61423
++50115 50774 49729 51150 38050 17516 0 0 0 257 257 257 15792 11440 4871
++59969 46214 26008 43304 54355 65021 54209 48830 40477 34164 24785 10813 0 0 0
++0 0 0 30042 21792 9253 54760 46836 33773 42919 54484 65535 56972 46962 30007
++56972 46962 30007 60373 44510 19999 20895 15087 6460 5943 4354 1886 4874 3558 1459
++25195 18262 7789 61113 45548 20995 50115 51271 50886 43818 54098 63479 61985 45298 20071
++13872 10127 4336 0 0 0 0 0 0 27882 20284 8738 54760 46836 33773
++42919 54484 65535 57302 45835 26989 22224 16071 6824 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 0 0 0 53705 39676 18339
++50976 48701 42982 43818 54098 63479 57302 45835 26989 51150 38050 17516 17750 12880 5633
++4874 3558 1459 4874 3558 1459 20895 15087 6460 55635 40828 18345 54209 48830 40477
++42919 54484 65535 56972 46962 30007 36240 26320 11215 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 3857 3857 3857 22881 22881 22881 1028 1285 1542
++0 0 0 0 0 0 21838 21794 21532 5911 5911 5911 21292 21292 21292
++10459 10459 10459 128 128 128 0 0 0 0 0 0 0 0 0
++10459 10459 10459 16762 16762 16762 0 0 0 4480 4480 4480 20263 20263 20263
++14506 14506 14506 257 257 257 0 0 0 0 0 0 0 0 0
++5911 5911 5911 11370 11370 11370 17965 17965 17965 18336 18336 18336 20263 20263 20263
++33681 33681 33681 33681 33681 33681 8455 8455 8455 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 43194 31354 13386 63236 45897 19634 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19711 60487 44116 19189 7209 5285 2184 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++40410 29471 12985 54209 48830 40477 42919 54484 65535 50629 49986 46941 56411 51914 44332
++50976 48701 42982 56411 51914 44332 50976 48701 42982 56411 51914 44332 50976 48701 42982
++56411 51914 44332 50976 48701 42982 56411 51914 44332 54209 48830 40477 60487 44116 19189
++128 128 128 8373 6077 2600 63483 46207 20056 42919 54484 65535 50976 48701 42982
++46996 34589 15727 0 0 0 0 0 0 15792 11440 4871 58276 44060 22272
++42919 54484 65535 54209 48830 40477 34164 24785 10813 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 5943 4354 1886 63483 46207 20056
++42919 54484 65535 50629 49986 46941 48838 36002 16378 128 128 128 0 0 0
++0 0 0 45225 33169 15226 56278 47802 34950 42919 54484 65535 48573 52299 53199
++58279 45589 26504 61985 45298 20071 62859 46189 20912 57302 45835 26989 50976 48701 42982
++62859 46189 20912 62859 46189 20912 42919 54484 65535 54209 48830 40477 34164 24785 10813
++0 0 0 7209 5285 2184 60373 44510 19999 50115 51271 50886 47031 52942 56540
++62486 45353 19401 10498 7619 3259 0 0 0 0 0 0 0 0 0
++875 620 271 53705 39676 18339 54209 48830 40477 43818 54098 63479 61241 45992 22579
++27882 20284 8738 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 875 620 271 63736 46260 19789 44846 53841 61423
++50115 50774 49729 51150 38050 17516 128 128 128 0 0 0 17750 12880 5633
++58276 44060 22272 42919 54484 65535 54209 48830 40477 34164 24785 10813 257 257 257
++0 0 0 30933 22555 9803 56278 47802 34950 42919 54484 65535 58276 44060 22272
++61241 45992 22579 50976 48701 42982 61241 45992 22579 62856 45897 20023 63736 46260 19789
++59969 46214 26008 50115 51271 50886 43304 54355 65021 54760 46836 33773 51150 38050 17516
++257 257 257 0 0 0 0 0 0 27882 20284 8738 54760 46836 33773
++42533 53970 64764 57302 45835 26989 20895 15087 6460 257 257 257 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 17750 12880 5633
++61985 45298 20071 50629 49986 46941 43818 54098 63479 54209 48830 40477 58276 44060 22272
++64250 47031 20303 63359 45859 19672 58276 44060 22272 50629 49986 46941 43818 54098 63479
++54209 48830 40477 57142 41714 18588 4874 3558 1459 128 128 128 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 1772 1533 1155 20263 20263 20263
++14506 14506 14506 0 0 0 5911 5911 5911 21838 21794 21532 2313 2313 2313
++8455 8455 8455 18995 18995 18995 20263 20263 20263 9814 9814 9814 257 257 257
++128 128 128 4480 4480 4480 20263 20263 20263 11370 11370 11370 0 0 0
++4480 4480 4480 18995 18995 18995 18995 18995 18995 18711 18711 18711 17965 17965 17965
++18336 18336 18336 18711 18711 18711 18711 18711 18711 18995 18995 18995 17553 17553 17553
++4480 4480 4480 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++20895 15087 6460 63486 46079 19711 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 63486 46079 19711 25195 18262 7789 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++41427 30069 13197 56278 47802 34950 48573 52299 53199 50115 51271 50886 50115 51271 50886
++50115 51271 50886 50115 51271 50886 50115 51271 50886 50115 51271 50886 50115 51271 50886
++50115 51271 50886 50115 51271 50886 50115 50774 49729 50629 49986 46941 60373 44510 19999
++0 0 0 8373 6077 2600 63486 46335 19711 50115 51271 50886 54209 48830 40477
++45225 33169 15226 0 0 0 385 385 334 15792 11440 4871 61241 45992 22579
++50115 51271 50886 56972 46962 30007 34164 24785 10813 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 7209 5285 2184 63486 46335 19711
++50115 51271 50886 54209 48830 40477 46996 34589 15727 0 0 0 0 0 0
++0 0 0 10498 7619 3259 60373 44510 19999 54760 46836 33773 48573 52299 53199
++45746 53327 59238 43304 54355 65021 47031 52942 56540 50976 48701 42982 61113 45548 20995
++40410 29471 12985 63486 46335 19711 50115 51271 50886 56278 47802 34950 36240 26320 11215
++0 0 0 48838 36002 16378 59969 46214 26008 50115 51271 50886 59969 46214 26008
++30933 22555 9803 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 12071 8729 3764 62856 45897 20023 50115 50774 49729 54209 48830 40477
++61985 45298 20071 10498 7619 3259 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 875 620 271 63736 46260 19789 50115 50774 49729
++54209 48830 40477 51150 38050 17516 0 0 0 257 257 257 15792 11440 4871
++61241 45992 22579 48573 52299 53199 56972 46962 30007 34164 24785 10813 0 0 0
++385 385 334 30933 22555 9803 56972 46962 30007 50115 51271 50886 61241 45992 22579
++48838 36002 16378 61241 45992 22579 50629 49986 46941 47031 52942 56540 44846 53841 61423
++47031 52942 56540 50115 50774 49729 57302 45835 26989 51150 38050 17516 4874 3558 1459
++0 0 0 0 0 0 0 0 0 27882 20284 8738 56972 46962 30007
++50115 51271 50886 59969 46214 26008 22224 16071 6824 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++13872 10127 4336 57142 41714 18588 56972 46962 30007 50629 49986 46941 47031 52942 56540
++44846 53841 61423 45746 53327 59238 47031 52942 56540 50629 49986 46941 58276 44060 22272
++55635 40828 18345 8373 6077 2600 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++3857 3857 3857 18517 18517 18517 16136 16136 16136 5911 5911 5911 22359 22625 23010
++22881 22881 22881 5911 5911 5911 0 0 0 9814 9814 9814 18711 18711 18711
++18995 18995 18995 19317 19131 18746 20263 20263 20263 28239 28239 28239 38978 38978 38978
++13752 13752 13752 128 128 128 0 0 0 0 0 0 0 0 0
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 4874 3558 1459
++57142 41714 18588 63736 46260 19789 63736 46260 19789 63736 46260 19789 63736 46260 19789
++63736 46260 19789 46996 34589 15727 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++30933 22555 9803 55635 40828 18345 53705 39676 18339 53705 39676 18339 53705 39676 18339
++53705 39676 18339 53705 39676 18339 53705 39676 18339 53705 39676 18339 53705 39676 18339
++53705 39676 18339 53705 39676 18339 53705 39676 18339 55635 40828 18345 46996 34589 15727
++385 385 334 5943 4354 1886 53705 39676 18339 53705 39676 18339 55635 40828 18345
++36240 26320 11215 128 128 128 0 0 0 13872 10127 4336 53705 39676 18339
++53705 39676 18339 53705 39676 18339 27882 20284 8738 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 4874 3558 1459 53705 39676 18339
++53705 39676 18339 55635 40828 18345 37303 27193 11910 257 257 257 0 0 0
++0 0 0 0 0 0 4874 3558 1459 40410 29471 12985 57142 41714 18588
++62859 46189 20912 63486 46079 19455 61113 45548 20995 48838 36002 16378 19371 14059 6014
++385 385 334 53070 38550 16467 53705 39676 18339 55635 40828 18345 30933 22555 9803
++19371 14059 6014 53070 38550 16467 53705 39676 18339 53705 39676 18339 45225 33169 15226
++875 620 271 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 30933 22555 9803 53705 39676 18339 55635 40828 18345
++53705 39676 18339 40410 29471 12985 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 875 620 271 53070 38550 16467 53705 39676 18339
++55635 40828 18345 40410 29471 12985 128 128 128 0 0 0 13872 10127 4336
++53705 39676 18339 53705 39676 18339 55635 40828 18345 27882 20284 8738 128 128 128
++0 0 0 28744 20827 9121 53705 39676 18339 53705 39676 18339 53705 39676 18339
++7209 5285 2184 22224 16071 6824 51150 38050 17516 61985 45298 20071 63736 46260 19789
++61113 45548 20995 51150 38050 17516 34164 24785 10813 642 642 899 0 0 0
++0 0 0 0 0 0 0 0 0 23177 16932 7265 53705 39676 18339
++53705 39676 18339 53705 39676 18339 17750 12880 5633 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 3038 2204 899 34164 24785 10813 48838 36002 16378 59002 43055 18866
++63736 46260 19789 63483 46207 20056 59002 43055 18866 51150 38050 17516 22224 16071 6824
++1028 1028 1028 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 2313 2313 2313 11370 11370 11370 12931 12931 12931
++14506 14506 14506 8455 8455 8455 0 0 0 0 0 0 0 0 0
++128 128 128 128 128 128 0 0 0 0 0 0 0 0 0
++257 257 257 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++128 128 128 128 128 128 257 257 257 257 257 257 257 257 257
++257 257 257 257 257 257 257 257 257 257 257 257 257 257 257
++257 257 257 257 257 257 257 257 257 128 128 128 128 128 128
++0 0 0 0 0 0 0 0 0 128 128 128 128 128 128
++128 128 128 0 0 0 0 0 0 0 0 0 0 0 0
++257 257 257 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 128 128 128
++1264 929 361 3855 2930 1607 0 0 0 0 0 0 128 128 128
++0 0 0 257 257 257 128 128 128 128 128 128 0 0 0
++0 0 0 128 128 128 257 257 257 257 257 257 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 128 128 128 128 128 128
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 128 128 128
++128 128 128 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 128 128 128 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 257 257 257 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 128 128 128 3855 2930 1607
++875 620 271 128 128 128 0 0 0 128 128 128 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 128 128 128
++257 257 257 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 128 128 128 128 128 128 257 257 257
++3038 2204 899 1264 929 361 128 128 128 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++128 128 128 128 128 128 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
++
+Index: drivers/video/logo/Makefile
+===================================================================
+--- linux-2.6.32/drivers/video/logo/Makefile.orig 2010-01-06 23:07:45.000000000 +0000
++++ linux-2.6.32/drivers/video/logo/Makefile 2010-01-09 11:30:40.000000000 +0000
+@@ -7,6 +7,7 @@
+ obj-$(CONFIG_LOGO_BLACKFIN_CLUT224) += logo_blackfin_clut224.o
+ obj-$(CONFIG_LOGO_BLACKFIN_VGA16) += logo_blackfin_vga16.o
+ obj-$(CONFIG_LOGO_DEC_CLUT224) += logo_dec_clut224.o
++obj-$(CONFIG_LOGO_LIBRE_CLUT224) += logo_libre_clut224.o
+ obj-$(CONFIG_LOGO_MAC_CLUT224) += logo_mac_clut224.o
+ obj-$(CONFIG_LOGO_PARISC_CLUT224) += logo_parisc_clut224.o
+ obj-$(CONFIG_LOGO_SGI_CLUT224) += logo_sgi_clut224.o
+Index: include/linux/linux_logo.h
+===================================================================
+--- linux-2.6.32/include/linux/linux_logo.h.orig 2010-01-06 23:07:45.000000000 +0000
++++ linux-2.6.32/include/linux/linux_logo.h 2010-01-09 11:30:40.000000000 +0000
+@@ -38,6 +38,7 @@
+ extern const struct linux_logo logo_blackfin_vga16;
+ extern const struct linux_logo logo_blackfin_clut224;
+ extern const struct linux_logo logo_dec_clut224;
++extern const struct linux_logo logo_libre_clut224;
+ extern const struct linux_logo logo_mac_clut224;
+ extern const struct linux_logo logo_parisc_clut224;
+ extern const struct linux_logo logo_sgi_clut224;
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/genkey b/freed-ora/tags/f15/2.6.38.6-27.fc15/genkey
new file mode 100644
index 000000000..49c6ce8be
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/genkey
@@ -0,0 +1,7 @@
+%pubring kernel.pub
+%secring kernel.sec
+Key-Type: DSA
+Key-Length: 512
+Name-Real: Red Hat, Inc.
+Name-Comment: Kernel Module GPG key
+%commit
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/git-linus.diff b/freed-ora/tags/f15/2.6.38.6-27.fc15/git-linus.diff
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/git-linus.diff
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/hda_intel-prealloc-4mb-dmabuffer.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/hda_intel-prealloc-4mb-dmabuffer.patch
new file mode 100644
index 000000000..36e6aca4f
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/hda_intel-prealloc-4mb-dmabuffer.patch
@@ -0,0 +1,47 @@
+From c69fcbd1f60b0842f7c1ad2c95692ffd19c4932b Mon Sep 17 00:00:00 2001
+From: Kyle McMartin <kyle@phobos.i.jkkm.org>
+Date: Mon, 29 Mar 2010 23:56:08 -0400
+Subject: hda_intel-prealloc-4mb-dmabuffer
+
+---
+ sound/pci/hda/hda_intel.c | 14 +++++++++++++-
+ 1 files changed, 13 insertions(+), 1 deletions(-)
+
+diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
+index 4bb9067..37db515 100644
+--- a/sound/pci/hda/hda_intel.c
++++ b/sound/pci/hda/hda_intel.c
+@@ -1986,6 +1986,7 @@ azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
+ struct azx_pcm *apcm;
+ int pcm_dev = cpcm->device;
+ int s, err;
++ size_t prealloc_min = 64*1024; /* 64KB */
+
+ if (pcm_dev >= HDA_MAX_PCMS) {
+ snd_printk(KERN_ERR SFX "Invalid PCM device number %d\n",
+@@ -2019,10 +2020,21 @@ azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
+ if (cpcm->stream[s].substreams)
+ snd_pcm_set_ops(pcm, s, &azx_pcm_ops);
+ }
++
+ /* buffer pre-allocation */
++
++ /* subtle, don't allocate a big buffer for modems...
++ * also, don't just test 32BIT_MASK, since azx supports
++ * 64-bit DMA in some cases.
++ */
++ /* lennart wants a 2.2MB buffer for 2sec of 48khz */
++ if (pcm->dev_class == SNDRV_PCM_CLASS_GENERIC &&
++ chip->pci->dma_mask >= DMA_32BIT_MASK)
++ prealloc_min = 4 * 1024 * 1024; /* 4MB */
++
+ snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
+ snd_dma_pci_data(chip->pci),
+- 1024 * 64, 32 * 1024 * 1024);
++ prealloc_min, 32 * 1024 * 1024);
+ return 0;
+ }
+
+--
+1.7.0.1
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/ima-allow-it-to-be-completely-disabled-and-default-off.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/ima-allow-it-to-be-completely-disabled-and-default-off.patch
new file mode 100644
index 000000000..4f8f1f180
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/ima-allow-it-to-be-completely-disabled-and-default-off.patch
@@ -0,0 +1,145 @@
+From 785465d9cffd65b5a69dd2f465d2f7c917713220 Mon Sep 17 00:00:00 2001
+From: Kyle McMartin <kyle@mcmartin.ca>
+Date: Mon, 18 Oct 2010 13:30:39 -0400
+Subject: [PATCH] ima: provide a toggle to disable it entirely
+
+Signed-off-by: Kyle McMartin <kyle@redhat.com>
+---
+ security/integrity/ima/ima.h | 1 +
+ security/integrity/ima/ima_iint.c | 9 +++++++++
+ security/integrity/ima/ima_main.c | 24 +++++++++++++++++++++---
+ 3 files changed, 31 insertions(+), 3 deletions(-)
+
+diff --git a/security/integrity/ima/ima.h b/security/integrity/ima/ima.h
+index 3fbcd1d..65c3977 100644
+--- a/security/integrity/ima/ima.h
++++ b/security/integrity/ima/ima.h
+@@ -37,6 +37,7 @@ enum tpm_pcrs { TPM_PCR0 = 0, TPM_PCR8 = 8 };
+ /* set during initialization */
+ extern int iint_initialized;
+ extern int ima_initialized;
++extern int ima_enabled;
+ extern int ima_used_chip;
+ extern char *ima_hash;
+
+diff --git a/security/integrity/ima/ima_iint.c b/security/integrity/ima/ima_iint.c
+index afba4ae..3d191ef 100644
+--- a/security/integrity/ima/ima_iint.c
++++ b/security/integrity/ima/ima_iint.c
+@@ -54,6 +54,9 @@ int ima_inode_alloc(struct inode *inode)
+ struct ima_iint_cache *iint = NULL;
+ int rc = 0;
+
++ if (!ima_enabled)
++ return 0;
++
+ iint = kmem_cache_alloc(iint_cache, GFP_NOFS);
+ if (!iint)
+ return -ENOMEM;
+@@ -116,6 +119,9 @@ void ima_inode_free(struct inode *inode)
+ {
+ struct ima_iint_cache *iint;
+
++ if (!ima_enabled)
++ return;
++
+ spin_lock(&ima_iint_lock);
+ iint = radix_tree_delete(&ima_iint_store, (unsigned long)inode);
+ spin_unlock(&ima_iint_lock);
+@@ -139,6 +145,9 @@ static void init_once(void *foo)
+
+ static int __init ima_iintcache_init(void)
+ {
++ if (!ima_enabled)
++ return 0;
++
+ iint_cache =
+ kmem_cache_create("iint_cache", sizeof(struct ima_iint_cache), 0,
+ SLAB_PANIC, init_once);
+diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c
+index e662b89..6e91905 100644
+--- a/security/integrity/ima/ima_main.c
++++ b/security/integrity/ima/ima_main.c
+@@ -26,6 +26,7 @@
+ #include "ima.h"
+
+ int ima_initialized;
++int ima_enabled;
+
+ char *ima_hash = "sha1";
+ static int __init hash_setup(char *str)
+@@ -36,6 +37,14 @@ static int __init hash_setup(char *str)
+ }
+ __setup("ima_hash=", hash_setup);
+
++static int __init ima_enable(char *str)
++{
++ if (strncmp(str, "on", 2) == 0)
++ ima_enabled = 1;
++ return 1;
++}
++__setup("ima=", ima_enable);
++
+ struct ima_imbalance {
+ struct hlist_node node;
+ unsigned long fsmagic;
+@@ -148,7 +157,7 @@ void ima_counts_get(struct file *file)
+ struct ima_iint_cache *iint;
+ int rc;
+
+- if (!iint_initialized || !S_ISREG(inode->i_mode))
++ if (!ima_enabled || !iint_initialized || !S_ISREG(inode->i_mode))
+ return;
+ iint = ima_iint_find_get(inode);
+ if (!iint)
+@@ -215,7 +224,7 @@ void ima_file_free(struct file *file)
+ struct inode *inode = file->f_dentry->d_inode;
+ struct ima_iint_cache *iint;
+
+- if (!iint_initialized || !S_ISREG(inode->i_mode))
++ if (!ima_enabled || !iint_initialized || !S_ISREG(inode->i_mode))
+ return;
+ iint = ima_iint_find_get(inode);
+ if (!iint)
+@@ -269,7 +278,7 @@ int ima_file_mmap(struct file *file, unsigned long prot)
+ {
+ int rc;
+
+- if (!file)
++ if (!ima_enabled || !file)
+ return 0;
+ if (prot & PROT_EXEC)
+ rc = process_measurement(file, file->f_dentry->d_name.name,
+@@ -294,6 +303,9 @@ int ima_bprm_check(struct linux_binprm *bprm)
+ {
+ int rc;
+
++ if (!ima_enabled)
++ return 0;
++
+ rc = process_measurement(bprm->file, bprm->filename,
+ MAY_EXEC, BPRM_CHECK);
+ return 0;
+@@ -313,6 +325,9 @@ int ima_file_check(struct file *file, int mask)
+ {
+ int rc;
+
++ if (!ima_enabled)
++ return 0;
++
+ rc = process_measurement(file, file->f_dentry->d_name.name,
+ mask & (MAY_READ | MAY_WRITE | MAY_EXEC),
+ FILE_CHECK);
+@@ -324,6 +339,9 @@ static int __init init_ima(void)
+ {
+ int error;
+
++ if (!ima_enabled)
++ return 0;
++
+ error = ima_init();
+ ima_initialized = 1;
+ return error;
+--
+1.7.3.1
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/ips-use-interruptible-waits-in-ips-monitor.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/ips-use-interruptible-waits-in-ips-monitor.patch
new file mode 100644
index 000000000..dbea1a1a0
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/ips-use-interruptible-waits-in-ips-monitor.patch
@@ -0,0 +1,30 @@
+From: Jesse Barnes <jbarnes@virtuousgeek.org>
+Date: Mon, 28 Mar 2011 10:36:30 +0000 (-0400)
+Subject: ips: use interruptible waits in ips-monitor
+X-Git-Tag: v2.6.39-rc1~20^2^2~1
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=a3424216e4935221fdaa5ca3c26e024f11297164
+
+ips: use interruptible waits in ips-monitor
+
+This is what I intended to do since:
+ 1) the driver handles variable waits just fine, and
+ 2) interruptible waits aren't reported as load in the load avg.
+
+Reported-and-tested-by: Andreas Hartmann <andihartmann@freenet.de>
+Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
+Signed-off-by: Matthew Garrett <mjg@redhat.com>
+---
+
+diff --git a/drivers/platform/x86/intel_ips.c b/drivers/platform/x86/intel_ips.c
+index 1294a39..85c8ad4 100644
+--- a/drivers/platform/x86/intel_ips.c
++++ b/drivers/platform/x86/intel_ips.c
+@@ -1111,7 +1111,7 @@ static int ips_monitor(void *data)
+ last_msecs = jiffies_to_msecs(jiffies);
+ expire = jiffies + msecs_to_jiffies(IPS_SAMPLE_PERIOD);
+
+- __set_current_state(TASK_UNINTERRUPTIBLE);
++ __set_current_state(TASK_INTERRUPTIBLE);
+ mod_timer(&timer, expire);
+ schedule();
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/iwlwifi-add-_ack_plpc_check-module-parameters.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/iwlwifi-add-_ack_plpc_check-module-parameters.patch
new file mode 100644
index 000000000..a6211b51e
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/iwlwifi-add-_ack_plpc_check-module-parameters.patch
@@ -0,0 +1,96 @@
+From sgruszka@redhat.com Mon May 9 15:27:33 2011
+From: Stanislaw Gruszka <sgruszka@redhat.com>
+To: kernel@lists.fedoraproject.org, stable@kernel.org
+Cc: Kyle McMartin <kmcmartin@redhat.com>,
+ Stanislaw Gruszka <sgruszka@redhat.com>
+Subject: [PATCH 2.6.38] iwlwifi: add {ack,plpc}_check module parameters
+Date: Mon, 9 May 2011 21:27:30 +0200
+Message-Id: <1304969250-27725-1-git-send-email-sgruszka@redhat.com>
+
+commit b7977ffaab5187ad75edaf04ac854615cea93828 upstream.
+
+Add module ack_check, and plcp_check parameters. Ack_check is disabled
+by default since is proved that check ack health can cause troubles.
+Plcp_check is enabled by default.
+
+This prevent connection hangs with "low ack count detected" messages.
+
+Resolves:
+https://bugzilla.redhat.com/show_bug.cgi?id=666646
+
+Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
+---
+ drivers/net/wireless/iwlwifi/iwl-agn-lib.c | 1 +
+ drivers/net/wireless/iwlwifi/iwl-agn.c | 6 ++++++
+ drivers/net/wireless/iwlwifi/iwl-core.h | 2 ++
+ drivers/net/wireless/iwlwifi/iwl-rx.c | 8 ++++++--
+ 4 files changed, 15 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
+index 3dee87e..d9c87b3 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
++++ b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
+@@ -604,6 +604,7 @@ const u8 *iwlagn_eeprom_query_addr(const struct iwl_priv *priv,
+ struct iwl_mod_params iwlagn_mod_params = {
+ .amsdu_size_8K = 1,
+ .restart_fw = 1,
++ .plcp_check = true,
+ /* the rest are 0 by default */
+ };
+
+diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
+index 35239f0..be07643 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
++++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
+@@ -4586,3 +4586,9 @@ MODULE_PARM_DESC(antenna_coupling,
+ module_param_named(bt_ch_inhibition, iwlagn_bt_ch_announce, bool, S_IRUGO);
+ MODULE_PARM_DESC(bt_ch_inhibition,
+ "Disable BT channel inhibition (default: enable)");
++
++module_param_named(plcp_check, iwlagn_mod_params.plcp_check, bool, S_IRUGO);
++MODULE_PARM_DESC(plcp_check, "Check plcp health (default: 1 [enabled])");
++
++module_param_named(ack_check, iwlagn_mod_params.ack_check, bool, S_IRUGO);
++MODULE_PARM_DESC(ack_check, "Check ack health (default: 0 [disabled])");
+diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
+index a347437..5c0d5f7 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-core.h
++++ b/drivers/net/wireless/iwlwifi/iwl-core.h
+@@ -263,6 +263,8 @@ struct iwl_mod_params {
+ int amsdu_size_8K; /* def: 1 = enable 8K amsdu size */
+ int antenna; /* def: 0 = both antennas (use diversity) */
+ int restart_fw; /* def: 1 = restart firmware */
++ bool plcp_check; /* def: true = enable plcp health check */
++ bool ack_check; /* def: false = disable ack health check */
+ };
+
+ /*
+diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c
+index 87a6fd8..b707617 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-rx.c
++++ b/drivers/net/wireless/iwlwifi/iwl-rx.c
+@@ -234,10 +234,13 @@ EXPORT_SYMBOL(iwl_rx_spectrum_measure_notif);
+ void iwl_recover_from_statistics(struct iwl_priv *priv,
+ struct iwl_rx_packet *pkt)
+ {
++ const struct iwl_mod_params *mod_params = priv->cfg->mod_params;
++
+ if (test_bit(STATUS_EXIT_PENDING, &priv->status))
+ return;
+ if (iwl_is_any_associated(priv)) {
+- if (priv->cfg->ops->lib->check_ack_health) {
++ if (mod_params->ack_check &&
++ priv->cfg->ops->lib->check_ack_health) {
+ if (!priv->cfg->ops->lib->check_ack_health(
+ priv, pkt)) {
+ /*
+@@ -250,7 +253,8 @@ void iwl_recover_from_statistics(struct iwl_priv *priv,
+ return;
+ }
+ }
+- if (priv->cfg->ops->lib->check_plcp_health) {
++ if (mod_params->plcp_check &&
++ priv->cfg->ops->lib->check_plcp_health) {
+ if (!priv->cfg->ops->lib->check_plcp_health(
+ priv, pkt)) {
+ /*
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/kernel.spec b/freed-ora/tags/f15/2.6.38.6-27.fc15/kernel.spec
new file mode 100644
index 000000000..c8613cc38
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/kernel.spec
@@ -0,0 +1,2714 @@
+# We have to override the new %%install behavior because, well... the kernel is special.
+%global __spec_install_pre %{___build_pre}
+
+Summary: The Linux kernel
+
+# For a stable, released kernel, released_kernel should be 1. For rawhide
+# and/or a kernel built from an rc or git snapshot, released_kernel should
+# be 0.
+%global released_kernel 1
+
+# Save original buildid for later if it's defined
+%if 0%{?buildid:1}
+%global orig_buildid %{buildid}
+%undefine buildid
+%endif
+
+###################################################################
+# Polite request for people who spin their own kernel rpms:
+# please modify the "buildid" define in a way that identifies
+# that the kernel isn't the stock distribution kernel, for example,
+# by setting the define to ".local" or ".bz123456". This will be
+# appended to the full kernel version.
+#
+# (Uncomment the '#' and both spaces below to set the buildid.)
+#
+# % define buildid .local
+###################################################################
+
+# The buildid can also be specified on the rpmbuild command line
+# by adding --define="buildid .whatever". If both the specfile and
+# the environment define a buildid they will be concatenated together.
+%if 0%{?orig_buildid:1}
+%if 0%{?buildid:1}
+%global srpm_buildid %{buildid}
+%define buildid %{srpm_buildid}%{orig_buildid}
+%else
+%define buildid %{orig_buildid}
+%endif
+%endif
+
+# baserelease defines which build revision of this kernel version we're
+# building. We used to call this fedora_build, but the magical name
+# baserelease is matched by the rpmdev-bumpspec tool, which you should use.
+#
+# We used to have some extra magic weirdness to bump this automatically,
+# but now we don't. Just use: rpmdev-bumpspec -c 'comment for changelog'
+# When changing base_sublevel below or going from rc to a final kernel,
+# reset this by hand to 1 (or to 0 and then use rpmdev-bumpspec).
+# scripts/rebase.sh should be made to do that for you, actually.
+#
+# For non-released -rc kernels, this will be prepended with "0.", so
+# for example a 3 here will become 0.3
+#
+%global baserelease 27
+%global fedora_build %{baserelease}
+
+# base_sublevel is the kernel version we're starting with and patching
+# on top of -- for example, 2.6.22-rc7-git1 starts with a 2.6.21 base,
+# which yields a base_sublevel of 21.
+%define base_sublevel 38
+
+# librev starts empty, then 1, etc, as the linux-libre tarball
+# changes. This is only used to determine which tarball to use.
+#define librev
+
+# To be inserted between "patch" and "-2.6.".
+#define stablelibre -libre
+#define rcrevlibre -libre
+#define gitrevlibre -libre
+
+# libres (s for suffix) may be bumped for rebuilds in which patches
+# change but fedora_build doesn't. Make sure it starts with a dot.
+# It is appended after dist.
+#define libres .
+
+## If this is a released kernel ##
+%if 0%{?released_kernel}
+
+# Do we have a -stable update to apply?
+%define stable_update 6
+# Is it a -stable RC?
+%define stable_rc 0
+# Set rpm version accordingly
+%if 0%{?stable_update}
+%define stablerev .%{stable_update}
+%define stable_base %{stable_update}
+%if 0%{?stable_rc}
+# stable RCs are incremental patches, so we need the previous stable patch
+%define stable_base %(echo $((%{stable_update} - 1)))
+%endif
+%endif
+%define rpmversion 2.6.%{base_sublevel}%{?stablerev}
+
+## The not-released-kernel case ##
+%else
+# The next upstream release sublevel (base_sublevel+1)
+%define upstream_sublevel %(echo $((%{base_sublevel} + 1)))
+# The rc snapshot level
+%define rcrev 0
+# The git snapshot level
+%define gitrev 0
+# Set rpm version accordingly
+%define rpmversion 2.6.%{upstream_sublevel}
+%endif
+# Nb: The above rcrev and gitrev values automagically define Patch00 and Patch01 below.
+
+# What parts do we want to build? We must build at least one kernel.
+# These are the kernels that are built IF the architecture allows it.
+# All should default to 1 (enabled) and be flipped to 0 (disabled)
+# by later arch-specific checks.
+
+# The following build options are enabled by default.
+# Use either --without <opt> in your rpmbuild command or force values
+# to 0 in here to disable them.
+#
+# standard kernel
+%define with_up %{?_without_up: 0} %{?!_without_up: 1}
+# kernel-smp (only valid for ppc 32-bit)
+%define with_smp %{?_without_smp: 0} %{?!_without_smp: 1}
+# kernel-PAE (only valid for i686)
+%define with_pae %{?_without_pae: 0} %{?!_without_pae: 1}
+# kernel-debug
+%define with_debug %{?_without_debug: 0} %{?!_without_debug: 1}
+# kernel-doc
+%define with_doc %{?_without_doc: 0} %{?!_without_doc: 1}
+# kernel-headers
+%define with_headers %{?_without_headers: 0} %{?!_without_headers: 1}
+# kernel-firmware
+%define with_firmware %{?_with_firmware: 1} %{?!_with_firmware: 0}
+# tools/perf
+%define with_perf %{?_without_perf: 0} %{?!_without_perf: 1}
+# kernel-debuginfo
+%define with_debuginfo %{?_without_debuginfo: 0} %{?!_without_debuginfo: 1}
+# kernel-bootwrapper (for creating zImages from kernel + initrd)
+%define with_bootwrapper %{?_without_bootwrapper: 0} %{?!_without_bootwrapper: 1}
+# Want to build a the vsdo directories installed
+%define with_vdso_install %{?_without_vdso_install: 0} %{?!_without_vdso_install: 1}
+
+# Build the kernel-doc package, but don't fail the build if it botches.
+# Here "true" means "continue" and "false" means "fail the build".
+%if 0%{?released_kernel}
+%define doc_build_fail false
+%else
+%define doc_build_fail true
+%endif
+
+%define rawhide_skip_docs 0
+%if 0%{?rawhide_skip_docs}
+%define with_doc 0
+%define doc_build_fail true
+%endif
+
+# Additional options for user-friendly one-off kernel building:
+#
+# Only build the base kernel (--with baseonly):
+%define with_baseonly %{?_with_baseonly: 1} %{?!_with_baseonly: 0}
+# Only build the smp kernel (--with smponly):
+%define with_smponly %{?_with_smponly: 1} %{?!_with_smponly: 0}
+# Only build the pae kernel (--with paeonly):
+%define with_paeonly %{?_with_paeonly: 1} %{?!_with_paeonly: 0}
+# Only build the debug kernel (--with dbgonly):
+%define with_dbgonly %{?_with_dbgonly: 1} %{?!_with_dbgonly: 0}
+
+# should we do C=1 builds with sparse
+%define with_sparse %{?_with_sparse: 1} %{?!_with_sparse: 0}
+
+# Set debugbuildsenabled to 1 for production (build separate debug kernels)
+# and 0 for rawhide (all kernels are debug kernels).
+# See also 'make debug' and 'make release'.
+%define debugbuildsenabled 1
+
+# Want to build a vanilla kernel build without any non-upstream patches?
+%define with_vanilla %{?_with_vanilla: 1} %{?!_with_vanilla: 0}
+
+# pkg_release is what we'll fill in for the rpm Release: field
+%if 0%{?released_kernel}
+
+%if 0%{?stable_rc}
+%define stable_rctag .rc%{stable_rc}
+%endif
+%define pkg_release %{fedora_build}%{?stable_rctag}%{?buildid}%{?dist}%{?libres}
+
+%else
+
+# non-released_kernel
+%if 0%{?rcrev}
+%define rctag .rc%rcrev
+%else
+%define rctag .rc0
+%endif
+%if 0%{?gitrev}
+%define gittag .git%gitrev
+%else
+%define gittag .git0
+%endif
+%define pkg_release 0%{?rctag}%{?gittag}.%{fedora_build}%{?buildid}%{?dist}%{?libres}
+
+%endif
+
+# The kernel tarball/base version
+%define kversion 2.6.%{base_sublevel}
+
+%define make_target bzImage
+
+%define KVERREL %{version}-libre.%{release}.%{_target_cpu}
+%define hdrarch %_target_cpu
+%define asmarch %_target_cpu
+
+%if 0%{!?nopatches:1}
+%define nopatches 0
+%endif
+
+%if %{with_vanilla}
+%define nopatches 1
+%endif
+
+%if %{nopatches}
+%define with_bootwrapper 0
+%define variant -vanilla
+%else
+%define variant -libre
+%define variant_fedora -libre-fedora
+%endif
+
+%define using_upstream_branch 0
+%if 0%{?upstream_branch:1}
+%define stable_update 0
+%define using_upstream_branch 1
+%define variant -%{upstream_branch}%{?variant_fedora}
+%define pkg_release 0.%{fedora_build}%{upstream_branch_tag}%{?buildid}%{?dist}%{?libres}
+%endif
+
+%if !%{debugbuildsenabled}
+%define with_debug 0
+%endif
+
+%if !%{with_debuginfo}
+%define _enable_debug_packages 0
+%endif
+%define debuginfodir /usr/lib/debug
+
+# kernel-PAE is only built on i686.
+%ifnarch i686
+%define with_pae 0
+%endif
+
+# if requested, only build base kernel
+%if %{with_baseonly}
+%define with_smp 0
+%define with_pae 0
+%define with_debug 0
+%endif
+
+# if requested, only build smp kernel
+%if %{with_smponly}
+%define with_up 0
+%define with_pae 0
+%define with_debug 0
+%endif
+
+# if requested, only build pae kernel
+%if %{with_paeonly}
+%define with_up 0
+%define with_smp 0
+%define with_debug 0
+%endif
+
+# if requested, only build debug kernel
+%if %{with_dbgonly}
+%if %{debugbuildsenabled}
+%define with_up 0
+%define with_pae 0
+%endif
+%define with_smp 0
+%define with_pae 0
+%define with_perf 0
+%endif
+
+%define all_x86 i386 i686
+
+%if %{with_vdso_install}
+# These arches install vdso/ directories.
+%define vdso_arches %{all_x86} x86_64 ppc ppc64
+%endif
+
+# Overrides for generic default options
+
+# only ppc and alphav56 need separate smp kernels
+%ifnarch ppc alphaev56
+%define with_smp 0
+%endif
+
+# don't do debug builds on anything but i686 and x86_64
+%ifnarch i686 x86_64
+%define with_debug 0
+%endif
+
+# only package docs noarch
+%ifnarch noarch
+%define with_doc 0
+%endif
+
+# don't build noarch kernels or headers (duh)
+%ifarch noarch
+%define with_up 0
+%define with_headers 0
+%define with_perf 0
+%define all_arch_configs kernel-%{version}-*.config
+%define with_firmware %{?_without_firmware: 0} %{?!_without_firmware: 1}
+%endif
+
+# bootwrapper is only on ppc
+%ifnarch ppc ppc64
+%define with_bootwrapper 0
+%endif
+
+# sparse blows up on ppc64 alpha and sparc64
+%ifarch ppc64 ppc alpha sparc64
+%define with_sparse 0
+%endif
+
+# Per-arch tweaks
+
+%ifarch %{all_x86}
+%define asmarch x86
+%define hdrarch i386
+%define all_arch_configs kernel-%{version}-i?86*.config
+%define image_install_path boot
+%define kernel_image arch/x86/boot/bzImage
+%endif
+
+%ifarch x86_64
+%define asmarch x86
+%define all_arch_configs kernel-%{version}-x86_64*.config
+%define image_install_path boot
+%define kernel_image arch/x86/boot/bzImage
+%endif
+
+%ifarch ppc64
+%define asmarch powerpc
+%define hdrarch powerpc
+%define all_arch_configs kernel-%{version}-ppc64*.config
+%define image_install_path boot
+%define make_target vmlinux
+%define kernel_image vmlinux
+%define kernel_image_elf 1
+%endif
+
+%ifarch s390x
+%define asmarch s390
+%define hdrarch s390
+%define all_arch_configs kernel-%{version}-s390x.config
+%define image_install_path boot
+%define make_target image
+%define kernel_image arch/s390/boot/image
+%define with_perf 0
+%endif
+
+%ifarch sparc64
+%define asmarch sparc
+%define all_arch_configs kernel-%{version}-sparc64*.config
+%define make_target image
+%define kernel_image vmlinux
+%define image_install_path boot
+%define with_perf 0
+%endif
+
+%ifarch sparcv9
+%define hdrarch sparc
+%endif
+
+%ifarch ppc
+%define asmarch powerpc
+%define hdrarch powerpc
+%define all_arch_configs kernel-%{version}-ppc{-,.}*config
+%define image_install_path boot
+%define make_target vmlinux
+%define kernel_image vmlinux
+%define kernel_image_elf 1
+%endif
+
+%ifarch ia64
+%define all_arch_configs kernel-%{version}-ia64*.config
+%define image_install_path boot/efi/EFI/redhat
+%define make_target compressed
+%define kernel_image vmlinux.gz
+%endif
+
+%ifarch alpha alphaev56
+%define all_arch_configs kernel-%{version}-alpha*.config
+%define image_install_path boot
+%define make_target vmlinux
+%define kernel_image vmlinux
+%endif
+
+%ifarch %{arm}
+%define all_arch_configs kernel-%{version}-arm*.config
+%define image_install_path boot
+%define hdrarch arm
+%define make_target vmlinux
+%define kernel_image vmlinux
+%endif
+
+%if %{nopatches}
+# XXX temporary until last vdso patches are upstream
+%define vdso_arches ppc ppc64
+%endif
+
+# Should make listnewconfig fail if there's config options
+# printed out?
+%if %{nopatches}%{using_upstream_branch}
+%define listnewconfig_fail 0
+%else
+%define listnewconfig_fail 1
+%endif
+
+# To temporarily exclude an architecture from being built, add it to
+# %%nobuildarches. Do _NOT_ use the ExclusiveArch: line, because if we
+# don't build kernel-headers then the new build system will no longer let
+# us use the previous build of that package -- it'll just be completely AWOL.
+# Which is a BadThing(tm).
+
+# We only build kernel-headers on the following...
+%define nobuildarches i386 s390 sparc sparcv9 %{arm}
+
+%ifarch %nobuildarches
+%define with_up 0
+%define with_smp 0
+%define with_pae 0
+%define with_debuginfo 0
+%define with_perf 0
+%define _enable_debug_packages 0
+%endif
+
+%define with_pae_debug 0
+%if %{with_pae}
+%define with_pae_debug %{with_debug}
+%endif
+
+#
+# Three sets of minimum package version requirements in the form of Conflicts:
+# to versions below the minimum
+#
+
+#
+# First the general kernel 2.6 required versions as per
+# Documentation/Changes
+#
+%define kernel_dot_org_conflicts ppp < 2.4.3-3, isdn4k-utils < 3.2-32, nfs-utils < 1.0.7-12, e2fsprogs < 1.37-4, util-linux < 2.12, jfsutils < 1.1.7-2, reiserfs-utils < 3.6.19-2, xfsprogs < 2.6.13-4, procps < 3.2.5-6.3, oprofile < 0.9.1-2
+
+#
+# Then a series of requirements that are distribution specific, either
+# because we add patches for something, or the older versions have
+# problems with the newer kernel or lack certain things that make
+# integration in the distro harder than needed.
+#
+%define package_conflicts initscripts < 7.23, udev < 063-6, iptables < 1.3.2-1, ipw2200-firmware < 2.4, iwl4965-firmware < 228.57.2, selinux-policy-targeted < 1.25.3-14, squashfs-tools < 4.0, wireless-tools < 29-3
+
+# We moved the drm include files into kernel-headers, make sure there's
+# a recent enough libdrm-devel on the system that doesn't have those.
+%define kernel_headers_conflicts libdrm-devel < 2.4.0-0.15
+
+#
+# Packages that need to be installed before the kernel is, because the %%post
+# scripts use them.
+#
+%define kernel_prereq fileutils, module-init-tools, initscripts >= 8.11.1-1, grubby >= 7.0.10-1
+%define initrd_prereq dracut >= 001-7
+
+#
+# This macro does requires, provides, conflicts, obsoletes for a kernel package.
+# %%kernel_reqprovconf <subpackage>
+# It uses any kernel_<subpackage>_conflicts and kernel_<subpackage>_obsoletes
+# macros defined above.
+#
+%define kernel_reqprovconf \
+Provides: kernel = %{rpmversion}-%{pkg_release}\
+Provides: kernel-libre = %{rpmversion}-%{pkg_release}\
+Provides: kernel-%{_target_cpu} = %{rpmversion}-%{pkg_release}%{?1:.%{1}}\
+Provides: kernel-libre-%{_target_cpu} = %{rpmversion}-%{pkg_release}%{?1:.%{1}}\
+Provides: kernel-drm = 4.3.0\
+Provides: kernel-drm-nouveau = 16\
+Provides: kernel-modeset = 1\
+Provides: kernel-uname-r = %{KVERREL}%{?1:.%{1}}\
+Provides: kernel-libre-uname-r = %{KVERREL}%{?1:.%{1}}\
+Requires(pre): %{kernel_prereq}\
+Requires(pre): %{initrd_prereq}\
+%if %{with_firmware}\
+Requires(pre): kernel-libre-firmware >= %{rpmversion}-%{pkg_release}\
+%endif\
+Requires(post): /sbin/new-kernel-pkg\
+Requires(preun): /sbin/new-kernel-pkg\
+Conflicts: %{kernel_dot_org_conflicts}\
+Conflicts: %{package_conflicts}\
+%{expand:%%{?kernel%{?1:_%{1}}_conflicts:Conflicts: %%{kernel%{?1:_%{1}}_conflicts}}}\
+%{expand:%%{?kernel%{?1:_%{1}}_obsoletes:Obsoletes: %%{kernel%{?1:_%{1}}_obsoletes}}}\
+%{expand:%%{?kernel%{?1:_%{1}}_provides:Provides: %%{kernel%{?1:_%{1}}_provides}}}\
+# We can't let RPM do the dependencies automatic because it'll then pick up\
+# a correct but undesirable perl dependency from the module headers which\
+# isn't required for the kernel proper to function\
+AutoReq: no\
+AutoProv: yes\
+%{nil}
+
+Name: kernel%{?variant}
+Group: System Environment/Kernel
+License: GPLv2
+URL: http://linux-libre.fsfla.org/
+Version: %{rpmversion}
+Release: %{pkg_release}
+# DO NOT CHANGE THE 'ExclusiveArch' LINE TO TEMPORARILY EXCLUDE AN ARCHITECTURE BUILD.
+# SET %%nobuildarches (ABOVE) INSTEAD
+ExclusiveArch: noarch %{all_x86} x86_64 ppc ppc64 ia64 %{sparc} s390 s390x alpha alphaev56 %{arm}
+ExclusiveOS: Linux
+
+%kernel_reqprovconf
+
+#
+# List the packages used during the kernel build
+#
+BuildRequires: module-init-tools, patch >= 2.5.4, bash >= 2.03, sh-utils, tar
+BuildRequires: bzip2, findutils, gzip, m4, perl, make >= 3.78, diffutils, gawk
+BuildRequires: gcc >= 3.4.2, binutils >= 2.12, redhat-rpm-config
+BuildRequires: net-tools
+BuildRequires: xmlto, asciidoc
+%if %{with_sparse}
+BuildRequires: sparse >= 0.4.1
+%endif
+%if %{with_perf}
+BuildRequires: elfutils-devel zlib-devel binutils-devel newt-devel python-devel perl(ExtUtils::Embed)
+%endif
+BuildConflicts: rhbuildsys(DiskFree) < 500Mb
+
+%define fancy_debuginfo 0
+%if %{with_debuginfo}
+%if 0%{?fedora} >= 8 || 0%{?rhel} >= 6
+%define fancy_debuginfo 1
+%endif
+%endif
+
+%if %{fancy_debuginfo}
+# Fancy new debuginfo generation introduced in Fedora 8.
+BuildRequires: rpm-build >= 4.4.2.1-4
+%define debuginfo_args --strict-build-id
+%endif
+
+Source0: http://linux-libre.fsfla.org/pub/linux-libre/freed-ora/src/linux-%{kversion}-libre%{?librev}.tar.bz2
+
+# For documentation purposes only.
+Source3: deblob-main
+Source4: deblob-%{kversion}
+Source5: deblob-check
+
+Source11: genkey
+Source14: find-provides
+Source15: merge.pl
+
+Source20: Makefile.config
+Source21: config-debug
+Source22: config-nodebug
+Source23: config-generic
+Source24: config-rhel-generic
+
+Source30: config-x86-generic
+Source31: config-i686-PAE
+
+Source40: config-x86_64-generic
+
+Source50: config-powerpc-generic
+Source51: config-powerpc32-generic
+Source52: config-powerpc32-smp
+Source53: config-powerpc64
+
+Source60: config-ia64-generic
+
+Source70: config-s390x
+
+Source90: config-sparc64-generic
+
+Source100: config-arm
+
+# This file is intentionally left empty in the stock kernel. Its a nicety
+# added for those wanting to do custom rebuilds with altered config opts.
+Source1000: config-local
+
+# Here should be only the patches up to the upstream canonical Linus tree.
+
+# For a stable release kernel
+%if 0%{?stable_update}
+%if 0%{?stable_base}
+%define stable_patch_00 patch%{?stablelibre}-2.6.%{base_sublevel}.%{stable_base}.bz2
+Patch00: %{stable_patch_00}
+%endif
+%if 0%{?stable_rc}
+%define stable_patch_01 patch%{?rcrevlibre}-2.6.%{base_sublevel}.%{stable_update}-rc%{stable_rc}.bz2
+Patch01: %{stable_patch_01}
+%endif
+
+# non-released_kernel case
+# These are automagically defined by the rcrev and gitrev values set up
+# near the top of this spec file.
+%else
+%if 0%{?rcrev}
+Patch00: patch%{?rcrevlibre}-2.6.%{upstream_sublevel}-rc%{rcrev}.bz2
+%if 0%{?gitrev}
+Patch01: patch%{?gitrevlibre}-2.6.%{upstream_sublevel}-rc%{rcrev}-git%{gitrev}.bz2
+%endif
+%else
+# pre-{base_sublevel+1}-rc1 case
+%if 0%{?gitrev}
+Patch00: patch%{?gitrevlibre}-2.6.%{base_sublevel}-git%{gitrev}.bz2
+%endif
+%endif
+%endif
+
+%if %{using_upstream_branch}
+### BRANCH PATCH ###
+%endif
+
+Patch02: git-linus.diff
+
+# we also need compile fixes for -vanilla
+Patch04: linux-2.6-compile-fixes.patch
+
+# build tweak for build ID magic, even for -vanilla
+Patch05: linux-2.6-makefile-after_link.patch
+
+Patch07: freedo.patch
+
+%if !%{nopatches}
+
+
+# revert upstream patches we get via other methods
+Patch09: linux-2.6-upstream-reverts.patch
+# Git trees.
+
+# Standalone patches
+Patch20: linux-2.6-hotfixes.patch
+
+Patch29: linux-2.6-utrace-revert-make-ptrace-functions-static.patch
+Patch30: linux-2.6-tracehook.patch
+Patch31: linux-2.6-utrace.patch
+Patch32: linux-2.6-utrace-ptrace.patch
+
+Patch150: linux-2.6.29-sparc-IOC_TYPECHECK.patch
+
+Patch160: linux-2.6-32bit-mmap-exec-randomization.patch
+Patch161: linux-2.6-i386-nx-emulation.patch
+
+Patch200: linux-2.6-debug-sizeof-structs.patch
+Patch202: linux-2.6-debug-taint-vm.patch
+Patch203: linux-2.6-debug-vm-would-have-oomkilled.patch
+Patch204: linux-2.6-debug-always-inline-kzalloc.patch
+
+Patch380: linux-2.6-defaults-pci_no_msi.patch
+Patch381: linux-2.6-defaults-pci_use_crs.patch
+
+# ASPM: enable powersave by default
+Patch383: linux-2.6-defaults-aspm.patch
+Patch384: pci-pcie-links-may-not-get-configured-for-aspm-under-powersave-mode.patch
+Patch385: pci-enable-aspm-state-clearing-regardless-of-policy.patch
+
+Patch389: ima-allow-it-to-be-completely-disabled-and-default-off.patch
+
+Patch390: linux-2.6-defaults-acpi-video.patch
+Patch391: linux-2.6-acpi-video-dos.patch
+Patch393: acpi-ec-add-delay-before-write.patch
+Patch394: linux-2.6-acpi-debug-infinite-loop.patch
+
+Patch450: linux-2.6-input-kill-stupid-messages.patch
+Patch452: linux-2.6.30-no-pcspkr-modalias.patch
+
+Patch460: linux-2.6-serial-460800.patch
+
+Patch470: die-floppy-die.patch
+
+Patch510: linux-2.6-silence-noise.patch
+Patch530: linux-2.6-silence-fbcon-logo.patch
+Patch570: linux-2.6-selinux-mprotect-checks.patch
+Patch580: linux-2.6-sparc-selinux-mprotect-checks.patch
+
+Patch610: hda_intel-prealloc-4mb-dmabuffer.patch
+
+Patch700: linux-2.6-e1000-ich9-montevina.patch
+
+Patch800: linux-2.6-crash-driver.patch
+
+# crypto/
+
+# virt + ksm patches
+Patch1555: fix_xen_guest_on_old_EC2.patch
+
+# DRM
+Patch1800: drm-vblank-events-fix-hangs.patch
+
+# nouveau + drm fixes
+Patch1809: drm-nouveau-fixes.patch
+Patch1810: drm-nouveau-updates.patch
+Patch1811: drm-ttm-move-notify.patch
+Patch1819: drm-intel-big-hammer.patch
+# intel drm is all merged upstream
+# fix for 945G corruption will hit stable eventually
+Patch1821: drm-i915-fix-pipelined-fencing.patch
+Patch1824: drm-intel-next.patch
+# make sure the lvds comes back on lid open
+Patch1825: drm-intel-make-lvds-work.patch
+Patch1826: drm-intel-edp-fixes.patch
+Patch1828: drm-intel-eeebox-eb1007-quirk.patch
+Patch1829: drm-intel-restore-mode.patch
+# radeon - new hw + fixes for fusion and t500 regression
+Patch1839: drm-radeon-fix-regression-on-atom-cards-with-hardcoded-EDID-record.patch
+Patch1840: drm-radeon-update.patch
+
+Patch1900: linux-2.6-intel-iommu-igfx.patch
+
+# linux1394 git patches
+Patch2200: linux-2.6-firewire-git-update.patch
+Patch2201: linux-2.6-firewire-git-pending.patch
+
+# Quiet boot fixes
+# silence the ACPI blacklist code
+Patch2802: linux-2.6-silence-acpi-blacklist.patch
+
+# media patches
+Patch2898: cx88-Fix-HVR4000-IR-keymap.patch
+Patch2899: linux-2.6-v4l-dvb-fixes.patch
+Patch2900: linux-2.6-v4l-dvb-update.patch
+Patch2901: linux-2.6-v4l-dvb-experimental.patch
+
+# fs fixes
+
+# NFSv4
+
+# patches headed upstream
+
+Patch12010: add-appleir-usb-driver.patch
+
+Patch12016: disable-i8042-check-on-apple-mac.patch
+
+Patch12018: neuter_intel_microcode_load.patch
+
+Patch12101: apple_backlight.patch
+Patch12102: efifb_update.patch
+Patch12200: acpi_reboot.patch
+
+# Runtime power management
+Patch12203: linux-2.6-usb-pci-autosuspend.patch
+Patch12204: linux-2.6-enable-more-pci-autosuspend.patch
+
+Patch12303: dmar-disable-when-ricoh-multifunction.patch
+
+Patch12305: printk-do-not-mangle-valid-userspace-syslog-prefixes.patch
+Patch12306: scsi-sd-downgrade-caching-printk-from-error-to-notice.patch
+
+#netconsole fixes
+Patch12400: linux-2.6-netconsole-deadlock.patch
+
+# CVE-2011-1581
+Patch12402: bonding-incorrect-tx-queue-offset.patch
+
+# Restore reliable stack backtraces, and hopefully fix RHBZ #700718
+Patch12403: x86-dumpstack-correct-stack-dump-info-when-frame-pointer-is-available.patch
+
+# Fix breakage of PCI network adapter names on older Dell systems
+Patch12404: x86-pci-preserve-existing-pci-bfsort-whitelist-for-dell-systems.patch
+
+# iwlwifi: add {ack,plpc}_check module parameters (#666646)
+Patch12405: iwlwifi-add-_ack_plpc_check-module-parameters.patch
+
+# intel_ips driver bug (#703511) causes cooling fan to run
+Patch12406: ips-use-interruptible-waits-in-ips-monitor.patch
+
+Patch12407: scsi_dh_hp_sw-fix-deadlock-in-start_stop_endio.patch
+
+%endif
+
+BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root
+
+%description
+The kernel package contains the Linux kernel (vmlinuz), the core of any
+GNU/Linux operating system. The kernel handles the basic functions
+of the operating system: memory allocation, process allocation, device
+input and output, etc.
+
+The kernel-libre package is the upstream kernel without the non-Free
+blobs it includes by default.
+
+%package doc
+Summary: Various documentation bits found in the kernel source
+Group: Documentation
+Provides: kernel-doc = %{rpmversion}-%{pkg_release}
+%description doc
+This package contains documentation files from the kernel
+source. Various bits of information about the Linux kernel and the
+device drivers shipped with it are documented in these files.
+
+You'll want to install this package if you need a reference to the
+options that can be passed to Linux kernel modules at load time.
+
+
+%package headers
+Summary: Header files for the Linux kernel for use by glibc
+Group: Development/System
+Obsoletes: glibc-kernheaders < 3.0-46
+Provides: glibc-kernheaders = 3.0-46
+Provides: kernel-headers = %{rpmversion}-%{pkg_release}
+%description headers
+Kernel-headers includes the C header files that specify the interface
+between the Linux kernel and userspace libraries and programs. The
+header files define structures and constants that are needed for
+building most standard programs and are also needed for rebuilding the
+glibc package.
+
+%package firmware
+Summary: Firmware files used by the Linux kernel
+Group: Development/System
+License: GPLv2+
+Provides: kernel-firmware = %{rpmversion}-%{pkg_release}
+%description firmware
+Kernel-firmware includes firmware files required for some devices to
+operate.
+
+%package bootwrapper
+Summary: Boot wrapper files for generating combined kernel + initrd images
+Group: Development/System
+Requires: gzip
+%description bootwrapper
+Kernel-bootwrapper contains the wrapper code which makes bootable "zImage"
+files combining both kernel and initial ramdisk.
+
+%package debuginfo-common-%{_target_cpu}
+Summary: Kernel source files used by %{name}-debuginfo packages
+Group: Development/Debug
+%description debuginfo-common-%{_target_cpu}
+This package is required by %{name}-debuginfo subpackages.
+It provides the kernel source files common to all builds.
+
+%if %{with_perf}
+%package -n perf-libre
+Provides: perf = %{rpmversion}-%{pkg_release}
+Summary: Performance monitoring for the Linux kernel
+Group: Development/System
+License: GPLv2
+%description -n perf-libre
+This package provides the perf tool and the supporting documentation.
+
+%package -n perf-libre-debuginfo
+Summary: Debug information for package perf
+Group: Development/Debug
+Requires: %{name}-debuginfo-common-%{_target_cpu} = %{version}-%{release}
+AutoReqProv: no
+%description -n perf-libre-debuginfo
+This package provides debug information for package perf.
+
+# Note that this pattern only works right to match the .build-id
+# symlinks because of the trailing nonmatching alternation and
+# the leading .*, because of find-debuginfo.sh's buggy handling
+# of matching the pattern against the symlinks file.
+%{expand:%%global debuginfo_args %{?debuginfo_args} -p '.*%%{_bindir}/perf(\.debug)?|.*%%{_libexecdir}/perf-core/.*|XXX' -o perf-debuginfo.list}
+%endif
+
+
+#
+# This macro creates a kernel-<subpackage>-debuginfo package.
+# %%kernel_debuginfo_package <subpackage>
+#
+%define kernel_debuginfo_package() \
+%package %{?1:%{1}-}debuginfo\
+Summary: Debug information for package %{name}%{?1:-%{1}}\
+Group: Development/Debug\
+Requires: %{name}-debuginfo-common-%{_target_cpu} = %{version}-%{release}\
+Provides: %{name}%{?1:-%{1}}-debuginfo-%{_target_cpu} = %{version}-%{release}\
+AutoReqProv: no\
+%description -n %{name}%{?1:-%{1}}-debuginfo\
+This package provides debug information for package %{name}%{?1:-%{1}}.\
+This is required to use SystemTap with %{name}%{?1:-%{1}}-%{KVERREL}.\
+%{expand:%%global debuginfo_args %{?debuginfo_args} -p '/.*/%%{KVERREL}%{?1:\.%{1}}/.*|/.*%%{KVERREL}%{?1:\.%{1}}(\.debug)?' -o debuginfo%{?1}.list}\
+%{nil}
+
+#
+# This macro creates a kernel-<subpackage>-devel package.
+# %%kernel_devel_package <subpackage> <pretty-name>
+#
+%define kernel_devel_package() \
+%package %{?1:%{1}-}devel\
+Summary: Development package for building kernel modules to match the %{?2:%{2} }kernel\
+Group: System Environment/Kernel\
+Provides: kernel%{?1:-%{1}}-devel-%{_target_cpu} = %{version}-%{release}\
+Provides: kernel-libre%{?1:-%{1}}-devel-%{_target_cpu} = %{version}-%{release}\
+Provides: kernel-devel-%{_target_cpu} = %{version}-%{release}%{?1:.%{1}}\
+Provides: kernel-libre-devel-%{_target_cpu} = %{version}-%{release}%{?1:.%{1}}\
+Provides: kernel-devel = %{version}-%{release}%{?1:.%{1}}\
+Provides: kernel-libre-devel = %{version}-%{release}%{?1:.%{1}}\
+Provides: kernel-devel-uname-r = %{KVERREL}%{?1:.%{1}}\
+Provides: kernel-libre-devel-uname-r = %{KVERREL}%{?1:.%{1}}\
+AutoReqProv: no\
+Requires(pre): /usr/bin/find\
+Requires: perl\
+%description -n kernel%{?variant}%{?1:-%{1}}-devel\
+This package provides kernel headers and makefiles sufficient to build modules\
+against the %{?2:%{2} }kernel package.\
+%{nil}
+
+#
+# This macro creates a kernel-<subpackage> and its -devel and -debuginfo too.
+# %%define variant_summary The Linux kernel compiled for <configuration>
+# %%kernel_variant_package [-n <pretty-name>] <subpackage>
+#
+%define kernel_variant_package(n:) \
+%package %1\
+Summary: %{variant_summary}\
+Group: System Environment/Kernel\
+%kernel_reqprovconf\
+%{expand:%%kernel_devel_package %1 %{!?-n:%1}%{?-n:%{-n*}}}\
+%{expand:%%kernel_debuginfo_package %1}\
+%{nil}
+
+
+# First the auxiliary packages of the main kernel package.
+%kernel_devel_package
+%kernel_debuginfo_package
+
+
+# Now, each variant package.
+
+%define variant_summary The Linux kernel compiled for SMP machines
+%kernel_variant_package -n SMP smp
+%description smp
+This package includes a SMP version of the Linux kernel. It is
+required only on machines with two or more CPUs as well as machines with
+hyperthreading technology.
+
+The kernel-libre-smp package is the upstream kernel without the
+non-Free blobs it includes by default.
+
+Install the kernel-libre-smp package if your machine uses two or more
+CPUs.
+
+
+%define variant_summary The Linux kernel compiled for PAE capable machines
+%kernel_variant_package PAE
+%description PAE
+This package includes a version of the Linux kernel with support for up to
+64GB of high memory. It requires a CPU with Physical Address Extensions (PAE).
+The non-PAE kernel can only address up to 4GB of memory.
+Install the kernel-PAE package if your machine has more than 4GB of memory.
+
+The kernel-libre-PAE package is the upstream kernel without the
+non-Free blobs it includes by default.
+
+
+
+%define variant_summary The Linux kernel compiled with extra debugging enabled for PAE capable machines
+%kernel_variant_package PAEdebug
+Obsoletes: kernel-PAE-debug
+%description PAEdebug
+This package includes a version of the Linux kernel with support for up to
+64GB of high memory. It requires a CPU with Physical Address Extensions (PAE).
+The non-PAE kernel can only address up to 4GB of memory.
+Install the kernel-PAE package if your machine has more than 4GB of memory.
+
+This variant of the kernel has numerous debugging options enabled.
+It should only be installed when trying to gather additional information
+on kernel bugs, as some of these options impact performance noticably.
+
+The kernel-libre-PAEdebug package is the upstream kernel without the
+non-Free blobs it includes by default.
+
+
+%define variant_summary The Linux kernel compiled with extra debugging enabled
+%kernel_variant_package debug
+%description debug
+The kernel package contains the Linux kernel (vmlinuz), the core of any
+GNU/Linux operating system. The kernel handles the basic functions
+of the operating system: memory allocation, process allocation, device
+input and output, etc.
+
+This variant of the kernel has numerous debugging options enabled.
+It should only be installed when trying to gather additional information
+on kernel bugs, as some of these options impact performance noticably.
+
+The kernel-libre-debug package is the upstream kernel without the
+non-Free blobs it includes by default.
+
+
+%prep
+# do a few sanity-checks for --with *only builds
+%if %{with_baseonly}
+%if !%{with_up}%{with_pae}
+echo "Cannot build --with baseonly, up build is disabled"
+exit 1
+%endif
+%endif
+
+%if %{with_smponly}
+%if !%{with_smp}
+echo "Cannot build --with smponly, smp build is disabled"
+exit 1
+%endif
+%endif
+
+# more sanity checking; do it quietly
+if [ "%{patches}" != "%%{patches}" ] ; then
+ for patch in %{patches} ; do
+ if [ ! -f $patch ] ; then
+ echo "ERROR: Patch ${patch##/*/} listed in specfile but is missing"
+ exit 1
+ fi
+ done
+fi 2>/dev/null
+
+patch_command='patch -p1 -F1 -s'
+ApplyPatch()
+{
+ local patch=$1
+ shift
+ if [ ! -f $RPM_SOURCE_DIR/$patch ]; then
+ exit 1
+ fi
+%if !%{using_upstream_branch}
+ if ! grep -E "^Patch[0-9]+: $patch\$" %{_specdir}/${RPM_PACKAGE_NAME%%%%%{?variant}}.spec ; then
+ if [ "${patch:0:10}" != "patch-2.6." ] &&
+ [ "${patch:0:16}" != "patch-libre-2.6." ] ; then
+ echo "ERROR: Patch $patch not listed as a source patch in specfile"
+ exit 1
+ fi
+ fi 2>/dev/null
+ $RPM_SOURCE_DIR/deblob-check $RPM_SOURCE_DIR/$patch || exit 1
+%endif
+ case "$patch" in
+ *.bz2) bunzip2 < "$RPM_SOURCE_DIR/$patch" | $patch_command ${1+"$@"} ;;
+ *.gz) gunzip < "$RPM_SOURCE_DIR/$patch" | $patch_command ${1+"$@"} ;;
+ *) $patch_command ${1+"$@"} < "$RPM_SOURCE_DIR/$patch" ;;
+ esac
+}
+
+# don't apply patch if it's empty
+ApplyOptionalPatch()
+{
+ local patch=$1
+ shift
+ if [ ! -f $RPM_SOURCE_DIR/$patch ]; then
+ exit 1
+ fi
+ local C=$(wc -l $RPM_SOURCE_DIR/$patch | awk '{print $1}')
+ if [ "$C" -gt 9 ]; then
+ ApplyPatch $patch ${1+"$@"}
+ fi
+}
+
+# we don't want a .config file when building firmware: it just confuses the build system
+%define build_firmware \
+ mv .config .config.firmware_save \
+ make INSTALL_FW_PATH=$RPM_BUILD_ROOT/lib/firmware firmware_install \
+ mv .config.firmware_save .config
+
+# First we unpack the kernel tarball.
+# If this isn't the first make prep, we use links to the existing clean tarball
+# which speeds things up quite a bit.
+
+# Update to latest upstream.
+%if 0%{?released_kernel}
+%define vanillaversion 2.6.%{base_sublevel}
+# non-released_kernel case
+%else
+%if 0%{?rcrev}
+%define vanillaversion 2.6.%{upstream_sublevel}-rc%{rcrev}
+%if 0%{?gitrev}
+%define vanillaversion 2.6.%{upstream_sublevel}-rc%{rcrev}-git%{gitrev}
+%endif
+%else
+# pre-{base_sublevel+1}-rc1 case
+%if 0%{?gitrev}
+%define vanillaversion 2.6.%{base_sublevel}-git%{gitrev}
+%else
+%define vanillaversion 2.6.%{base_sublevel}
+%endif
+%endif
+%endif
+
+# %%{vanillaversion} : the full version name, e.g. 2.6.35-rc6-git3
+# %%{kversion} : the base version, e.g. 2.6.34
+
+# Use kernel-%%{kversion}%%{?dist} as the top-level directory name
+# so we can prep different trees within a single git directory.
+
+# Build a list of the other top-level kernel tree directories.
+# This will be used to hardlink identical vanilla subdirs.
+sharedirs=$(find "$PWD" -maxdepth 1 -type d -name 'kernel-2.6.*' \
+ | grep -x -v "$PWD"/kernel-%{kversion}%{?dist}) ||:
+
+if [ ! -d kernel-%{kversion}%{?dist}/vanilla-%{vanillaversion} ]; then
+
+ if [ -d kernel-%{kversion}%{?dist}/vanilla-%{kversion} ]; then
+
+ # The base vanilla version already exists.
+ cd kernel-%{kversion}%{?dist}
+
+ # Any vanilla-* directories other than the base one are stale.
+ for dir in vanilla-*; do
+ [ "$dir" = vanilla-%{kversion} ] || rm -rf $dir &
+ done
+
+ else
+
+ rm -f pax_global_header
+ # Look for an identical base vanilla dir that can be hardlinked.
+ for sharedir in $sharedirs ; do
+ if [[ ! -z $sharedir && -d $sharedir/vanilla-%{kversion} ]] ; then
+ break
+ fi
+ done
+ if [[ ! -z $sharedir && -d $sharedir/vanilla-%{kversion} ]] ; then
+%setup -q -n kernel-%{kversion}%{?dist} -c -T
+ cp -rl $sharedir/vanilla-%{kversion} .
+ else
+%setup -q -n kernel-%{kversion}%{?dist} -c
+ mv linux-%{kversion} vanilla-%{kversion}
+ fi
+
+ fi
+
+perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION =%{?stablelibre:-libre%{?librev}}/" vanilla-%{kversion}/Makefile
+
+%if "%{kversion}" != "%{vanillaversion}"
+
+ for sharedir in $sharedirs ; do
+ if [[ ! -z $sharedir && -d $sharedir/vanilla-%{vanillaversion} ]] ; then
+ break
+ fi
+ done
+ if [[ ! -z $sharedir && -d $sharedir/vanilla-%{vanillaversion} ]] ; then
+
+ cp -rl $sharedir/vanilla-%{vanillaversion} .
+
+ else
+
+ # Need to apply patches to the base vanilla version.
+ cp -rl vanilla-%{kversion} vanilla-%{vanillaversion}
+ cd vanilla-%{vanillaversion}
+
+# Update vanilla to the latest upstream.
+# (non-released_kernel case only)
+%if 0%{?rcrev}
+%if "%{?stablelibre}" != "%{?rcrevlibre}"
+ perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION =%{?rcrevlibre:-libre%{?librev}}/" Makefile
+%endif
+ ApplyPatch patch%{?rcrevlibre}-2.6.%{upstream_sublevel}-rc%{rcrev}.bz2
+%if 0%{?gitrev}
+ perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION = -rc%{rcrev}%{?gitrevlibre:-libre%{?librev}}/" Makefile
+ ApplyPatch patch%{?gitrevlibre}-2.6.%{upstream_sublevel}-rc%{rcrev}-git%{gitrev}.bz2
+%endif
+%else
+# pre-{base_sublevel+1}-rc1 case
+%if "%{?stablelibre}" != "%{?gitrevlibre}"
+ perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION =%{?rcrevlibre:-libre%{?librev}}/" Makefile
+%endif
+ ApplyPatch patch%{?gitrevlibre}-2.6.%{base_sublevel}-git%{gitrev}.bz2
+%endif
+
+ cd ..
+
+ fi
+
+%endif
+
+else
+
+ # We already have all vanilla dirs, just change to the top-level directory.
+ cd kernel-%{kversion}%{?dist}
+
+fi
+
+# Now build the fedora kernel tree.
+if [ -d linux-%{kversion}.%{_target_cpu} ]; then
+ # Just in case we ctrl-c'd a prep already
+ rm -rf deleteme.%{_target_cpu}
+ # Move away the stale away, and delete in background.
+ mv linux-%{kversion}.%{_target_cpu} deleteme.%{_target_cpu}
+ rm -rf deleteme.%{_target_cpu} &
+fi
+
+cp -rl vanilla-%{vanillaversion} linux-%{kversion}.%{_target_cpu}
+
+cd linux-%{kversion}.%{_target_cpu}
+
+# released_kernel with possible stable updates
+%if 0%{?stable_base}
+ApplyPatch %{stable_patch_00}
+%endif
+%if 0%{?stable_rc}
+ApplyPatch %{stable_patch_01}
+%endif
+
+%if %{using_upstream_branch}
+### BRANCH APPLY ###
+%endif
+
+# Drop some necessary files from the source dir into the buildroot
+cp $RPM_SOURCE_DIR/config-* .
+cp %{SOURCE15} .
+
+# Dynamically generate kernel .config files from config-* files
+make -f %{SOURCE20} VERSION=%{version} configs
+
+%if %{?all_arch_configs:1}%{!?all_arch_configs:0}
+#if a rhel kernel, apply the rhel config options
+%if 0%{?rhel}
+ for i in %{all_arch_configs}
+ do
+ mv $i $i.tmp
+ ./merge.pl config-rhel-generic $i.tmp > $i
+ rm $i.tmp
+ done
+%endif
+
+# Merge in any user-provided local config option changes
+for i in %{all_arch_configs}
+do
+ mv $i $i.tmp
+ ./merge.pl %{SOURCE1000} $i.tmp > $i
+ rm $i.tmp
+done
+%endif
+
+ApplyOptionalPatch git-linus.diff
+
+ApplyPatch linux-2.6-makefile-after_link.patch
+
+#
+# misc small stuff to make things compile
+#
+ApplyOptionalPatch linux-2.6-compile-fixes.patch
+
+# Freedo logo.
+ApplyPatch freedo.patch
+
+%if !%{nopatches}
+
+# revert patches from upstream that conflict or that we get via other means
+ApplyOptionalPatch linux-2.6-upstream-reverts.patch -R
+
+ApplyPatch linux-2.6-hotfixes.patch
+
+# Roland's utrace ptrace replacement.
+ApplyPatch linux-2.6-utrace-revert-make-ptrace-functions-static.patch
+ApplyPatch linux-2.6-tracehook.patch
+ApplyPatch linux-2.6-utrace.patch
+ApplyPatch linux-2.6-utrace-ptrace.patch
+
+# Architecture patches
+# x86(-64)
+# Restore reliable stack backtraces, and hopefully
+# fix RHBZ #700718
+ApplyPatch x86-dumpstack-correct-stack-dump-info-when-frame-pointer-is-available.patch
+
+#
+# Intel IOMMU
+#
+
+#
+# PowerPC
+#
+
+#
+# SPARC64
+#
+ApplyPatch linux-2.6.29-sparc-IOC_TYPECHECK.patch
+
+#
+# Exec shield
+#
+ApplyPatch linux-2.6-i386-nx-emulation.patch
+ApplyPatch linux-2.6-32bit-mmap-exec-randomization.patch
+
+#
+# bugfixes to drivers and filesystems
+#
+
+# ext4
+
+# xfs
+
+# btrfs
+
+
+# eCryptfs
+
+# NFSv4
+
+# USB
+
+# WMI
+
+# ACPI
+ApplyPatch linux-2.6-defaults-acpi-video.patch
+ApplyPatch linux-2.6-acpi-video-dos.patch
+ApplyPatch acpi-ec-add-delay-before-write.patch
+ApplyPatch linux-2.6-acpi-debug-infinite-loop.patch
+
+# Various low-impact patches to aid debugging.
+ApplyPatch linux-2.6-debug-sizeof-structs.patch
+ApplyPatch linux-2.6-debug-taint-vm.patch
+ApplyPatch linux-2.6-debug-vm-would-have-oomkilled.patch
+ApplyPatch linux-2.6-debug-always-inline-kzalloc.patch
+
+#
+# PCI
+#
+# make default state of PCI MSI a config option
+ApplyPatch linux-2.6-defaults-pci_no_msi.patch
+ApplyPatch linux-2.6-defaults-pci_use_crs.patch
+# enable ASPM by default on hardware we expect to work
+ApplyPatch linux-2.6-defaults-aspm.patch
+# fixes for ASPM powersave mode
+ApplyPatch pci-pcie-links-may-not-get-configured-for-aspm-under-powersave-mode.patch
+ApplyPatch pci-enable-aspm-state-clearing-regardless-of-policy.patch
+# Fix breakage of PCI network adapter names on older Dell systems
+ApplyPatch x86-pci-preserve-existing-pci-bfsort-whitelist-for-dell-systems.patch
+
+#ApplyPatch ima-allow-it-to-be-completely-disabled-and-default-off.patch
+
+#
+# SCSI Bits.
+#
+
+# ACPI
+
+# ALSA
+ApplyPatch hda_intel-prealloc-4mb-dmabuffer.patch
+
+# Networking
+
+# Misc fixes
+# The input layer spews crap no-one cares about.
+ApplyPatch linux-2.6-input-kill-stupid-messages.patch
+
+# stop floppy.ko from autoloading during udev...
+ApplyPatch die-floppy-die.patch
+
+ApplyPatch linux-2.6.30-no-pcspkr-modalias.patch
+
+# Allow to use 480600 baud on 16C950 UARTs
+ApplyPatch linux-2.6-serial-460800.patch
+
+# Silence some useless messages that still get printed with 'quiet'
+ApplyPatch linux-2.6-silence-noise.patch
+
+# Make fbcon not show the penguins with 'quiet'
+ApplyPatch linux-2.6-silence-fbcon-logo.patch
+
+# Fix the SELinux mprotect checks on executable mappings
+#ApplyPatch linux-2.6-selinux-mprotect-checks.patch
+# Fix SELinux for sparc
+# FIXME: Can we drop this now? See updated linux-2.6-selinux-mprotect-checks.patch
+#ApplyPatch linux-2.6-sparc-selinux-mprotect-checks.patch
+
+# Changes to upstream defaults.
+
+
+# /dev/crash driver.
+ApplyPatch linux-2.6-crash-driver.patch
+
+# Hack e1000e to work on Montevina SDV
+ApplyPatch linux-2.6-e1000-ich9-montevina.patch
+
+# crypto/
+
+# Assorted Virt Fixes
+ApplyPatch fix_xen_guest_on_old_EC2.patch
+
+# DRM core
+ApplyPatch drm-vblank-events-fix-hangs.patch
+
+# Nouveau DRM
+ApplyPatch drm-ttm-move-notify.patch
+ApplyOptionalPatch drm-nouveau-fixes.patch
+ApplyOptionalPatch drm-nouveau-updates.patch
+
+# Intel DRM
+ApplyOptionalPatch drm-intel-next.patch
+ApplyPatch drm-intel-big-hammer.patch
+ApplyPatch drm-intel-make-lvds-work.patch
+ApplyPatch linux-2.6-intel-iommu-igfx.patch
+ApplyPatch drm-intel-edp-fixes.patch
+ApplyPatch drm-i915-fix-pipelined-fencing.patch
+ApplyPatch drm-intel-eeebox-eb1007-quirk.patch
+ApplyPatch drm-intel-restore-mode.patch
+
+# radeon DRM (add cayman support)
+ApplyPatch drm-radeon-fix-regression-on-atom-cards-with-hardcoded-EDID-record.patch -R
+ApplyPatch drm-radeon-update.patch
+
+# linux1394 git patches
+#ApplyPatch linux-2.6-firewire-git-update.patch
+#ApplyOptionalPatch linux-2.6-firewire-git-pending.patch
+
+# silence the ACPI blacklist code
+ApplyPatch linux-2.6-silence-acpi-blacklist.patch
+
+# V4L/DVB updates/fixes/experimental drivers
+# apply if non-empty
+ApplyPatch cx88-Fix-HVR4000-IR-keymap.patch -R
+ApplyOptionalPatch linux-2.6-v4l-dvb-fixes.patch
+ApplyOptionalPatch linux-2.6-v4l-dvb-update.patch
+ApplyOptionalPatch linux-2.6-v4l-dvb-experimental.patch
+
+# Patches headed upstream
+
+ApplyPatch disable-i8042-check-on-apple-mac.patch
+
+ApplyPatch add-appleir-usb-driver.patch
+
+ApplyPatch neuter_intel_microcode_load.patch
+
+# various fixes for Apple and EFI
+ApplyPatch apple_backlight.patch
+ApplyPatch efifb_update.patch
+ApplyPatch acpi_reboot.patch
+
+# Runtime PM
+#ApplyPatch linux-2.6-usb-pci-autosuspend.patch
+### Broken by implicit notify support & ACPICA rebase
+###ApplyPatch linux-2.6-enable-more-pci-autosuspend.patch
+
+# rhbz#605888
+ApplyPatch dmar-disable-when-ricoh-multifunction.patch
+
+# rhbz#691888
+ApplyPatch printk-do-not-mangle-valid-userspace-syslog-prefixes.patch
+
+ApplyPatch scsi-sd-downgrade-caching-printk-from-error-to-notice.patch
+
+#rhbz 668231
+ApplyPatch linux-2.6-netconsole-deadlock.patch
+
+# CVE-2011-1581
+ApplyPatch bonding-incorrect-tx-queue-offset.patch
+
+# iwlwifi: add {ack,plpc}_check module parameters (#666646) queued for stable
+ApplyPatch iwlwifi-add-_ack_plpc_check-module-parameters.patch
+
+# intel_ips driver bug (#703511) causes cooling fan to run
+ApplyPatch ips-use-interruptible-waits-in-ips-monitor.patch
+
+ApplyPatch scsi_dh_hp_sw-fix-deadlock-in-start_stop_endio.patch
+
+# END OF PATCH APPLICATIONS
+
+%endif
+
+# Any further pre-build tree manipulations happen here.
+
+chmod +x scripts/checkpatch.pl
+
+touch .scmversion
+
+# only deal with configs if we are going to build for the arch
+%ifnarch %nobuildarches
+
+mkdir configs
+
+# Remove configs not for the buildarch
+for cfg in kernel-%{version}-*.config; do
+ if [ `echo %{all_arch_configs} | grep -c $cfg` -eq 0 ]; then
+ rm -f $cfg
+ fi
+done
+
+%if !%{debugbuildsenabled}
+rm -f kernel-%{version}-*debug.config
+%endif
+
+# now run oldconfig over all the config files
+for i in *.config
+do
+ mv $i .config
+ Arch=`head -1 .config | cut -b 3-`
+ make ARCH=$Arch listnewconfig | grep -E '^CONFIG_' >.newoptions || true
+%if %{listnewconfig_fail}
+ if [ -s .newoptions ]; then
+ cat .newoptions
+ exit 1
+ fi
+%endif
+ rm -f .newoptions
+ make ARCH=$Arch oldnoconfig
+ echo "# $Arch" > configs/$i
+ cat .config >> configs/$i
+done
+# end of kernel config
+%endif
+
+# get rid of unwanted files resulting from patch fuzz
+find . \( -name "*.orig" -o -name "*~" \) -exec rm -f {} \; >/dev/null
+
+# remove unnecessary SCM files
+find . -name .gitignore -exec rm -f {} \; >/dev/null
+
+cd ..
+
+###
+### build
+###
+%build
+
+%if %{with_sparse}
+%define sparse_mflags C=1
+%endif
+
+%if %{fancy_debuginfo}
+# This override tweaks the kernel makefiles so that we run debugedit on an
+# object before embedding it. When we later run find-debuginfo.sh, it will
+# run debugedit again. The edits it does change the build ID bits embedded
+# in the stripped object, but repeating debugedit is a no-op. We do it
+# beforehand to get the proper final build ID bits into the embedded image.
+# This affects the vDSO images in vmlinux, and the vmlinux image in bzImage.
+export AFTER_LINK=\
+'sh -xc "/usr/lib/rpm/debugedit -b $$RPM_BUILD_DIR -d /usr/src/debug \
+ -i $@ > $@.id"'
+%endif
+
+cp_vmlinux()
+{
+ eu-strip --remove-comment -o "$2" "$1"
+}
+
+BuildKernel() {
+ MakeTarget=$1
+ KernelImage=$2
+ Flavour=$3
+ InstallName=${4:-vmlinuz}
+
+ # Pick the right config file for the kernel we're building
+ Config=kernel-%{version}-%{_target_cpu}${Flavour:+-${Flavour}}.config
+ DevelDir=/usr/src/kernels/%{KVERREL}${Flavour:+.${Flavour}}
+
+ # When the bootable image is just the ELF kernel, strip it.
+ # We already copy the unstripped file into the debuginfo package.
+ if [ "$KernelImage" = vmlinux ]; then
+ CopyKernel=cp_vmlinux
+ else
+ CopyKernel=cp
+ fi
+
+ KernelVer=%{version}-libre.%{release}.%{_target_cpu}${Flavour:+.${Flavour}}
+ echo BUILDING A KERNEL FOR ${Flavour} %{_target_cpu}...
+
+ # make sure EXTRAVERSION says what we want it to say
+ perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION = %{?stablerev}-libre.%{release}.%{_target_cpu}${Flavour:+.${Flavour}}/" Makefile
+
+ # if pre-rc1 devel kernel, must fix up SUBLEVEL for our versioning scheme
+ %if !0%{?rcrev}
+ %if 0%{?gitrev}
+ perl -p -i -e 's/^SUBLEVEL.*/SUBLEVEL = %{upstream_sublevel}/' Makefile
+ %endif
+ %endif
+
+ # and now to start the build process
+
+ make -s mrproper
+ cp configs/$Config .config
+
+ Arch=`head -1 .config | cut -b 3-`
+ echo USING ARCH=$Arch
+
+ make -s ARCH=$Arch oldnoconfig >/dev/null
+ make -s ARCH=$Arch V=1 %{?_smp_mflags} $MakeTarget %{?sparse_mflags}
+ make -s ARCH=$Arch V=1 %{?_smp_mflags} modules %{?sparse_mflags} || exit 1
+
+ # Start installing the results
+%if %{with_debuginfo}
+ mkdir -p $RPM_BUILD_ROOT%{debuginfodir}/boot
+ mkdir -p $RPM_BUILD_ROOT%{debuginfodir}/%{image_install_path}
+%endif
+ mkdir -p $RPM_BUILD_ROOT/%{image_install_path}
+ install -m 644 .config $RPM_BUILD_ROOT/boot/config-$KernelVer
+ install -m 644 System.map $RPM_BUILD_ROOT/boot/System.map-$KernelVer
+
+ # We estimate the size of the initramfs because rpm needs to take this size
+ # into consideration when performing disk space calculations. (See bz #530778)
+ dd if=/dev/zero of=$RPM_BUILD_ROOT/boot/initramfs-$KernelVer.img bs=1M count=20
+
+ if [ -f arch/$Arch/boot/zImage.stub ]; then
+ cp arch/$Arch/boot/zImage.stub $RPM_BUILD_ROOT/%{image_install_path}/zImage.stub-$KernelVer || :
+ fi
+ $CopyKernel $KernelImage \
+ $RPM_BUILD_ROOT/%{image_install_path}/$InstallName-$KernelVer
+ chmod 755 $RPM_BUILD_ROOT/%{image_install_path}/$InstallName-$KernelVer
+
+ mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer
+ # Override $(mod-fw) because we don't want it to install any firmware
+ # We'll do that ourselves with 'make firmware_install'
+ make -s ARCH=$Arch INSTALL_MOD_PATH=$RPM_BUILD_ROOT modules_install KERNELRELEASE=$KernelVer mod-fw=
+%ifarch %{vdso_arches}
+ make -s ARCH=$Arch INSTALL_MOD_PATH=$RPM_BUILD_ROOT vdso_install KERNELRELEASE=$KernelVer
+ if [ ! -s ldconfig-kernel.conf ]; then
+ echo > ldconfig-kernel.conf "\
+# Placeholder file, no vDSO hwcap entries used in this kernel."
+ fi
+ %{__install} -D -m 444 ldconfig-kernel.conf \
+ $RPM_BUILD_ROOT/etc/ld.so.conf.d/kernel-$KernelVer.conf
+%endif
+
+ # And save the headers/makefiles etc for building modules against
+ #
+ # This all looks scary, but the end result is supposed to be:
+ # * all arch relevant include/ files
+ # * all Makefile/Kconfig files
+ # * all script/ files
+
+ rm -f $RPM_BUILD_ROOT/lib/modules/$KernelVer/build
+ rm -f $RPM_BUILD_ROOT/lib/modules/$KernelVer/source
+ mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer/build
+ (cd $RPM_BUILD_ROOT/lib/modules/$KernelVer ; ln -s build source)
+ # dirs for additional modules per module-init-tools, kbuild/modules.txt
+ mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer/extra
+ mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer/updates
+ # first copy everything
+ cp --parents `find -type f -name "Makefile*" -o -name "Kconfig*"` $RPM_BUILD_ROOT/lib/modules/$KernelVer/build
+ cp Module.symvers $RPM_BUILD_ROOT/lib/modules/$KernelVer/build
+ cp System.map $RPM_BUILD_ROOT/lib/modules/$KernelVer/build
+ if [ -s Module.markers ]; then
+ cp Module.markers $RPM_BUILD_ROOT/lib/modules/$KernelVer/build
+ fi
+ # then drop all but the needed Makefiles/Kconfig files
+ rm -rf $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/Documentation
+ rm -rf $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/scripts
+ rm -rf $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/include
+ cp .config $RPM_BUILD_ROOT/lib/modules/$KernelVer/build
+ cp -a scripts $RPM_BUILD_ROOT/lib/modules/$KernelVer/build
+ if [ -d arch/$Arch/scripts ]; then
+ cp -a arch/$Arch/scripts $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/arch/%{_arch} || :
+ fi
+ if [ -f arch/$Arch/*lds ]; then
+ cp -a arch/$Arch/*lds $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/arch/%{_arch}/ || :
+ fi
+ rm -f $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/scripts/*.o
+ rm -f $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/scripts/*/*.o
+%ifarch ppc
+ cp -a --parents arch/powerpc/lib/crtsavres.[So] $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/
+%endif
+ if [ -d arch/%{asmarch}/include ]; then
+ cp -a --parents arch/%{asmarch}/include $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/
+ fi
+ cp -a include $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/include
+
+ # Make sure the Makefile and version.h have a matching timestamp so that
+ # external modules can be built
+ touch -r $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/Makefile $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/include/linux/version.h
+ touch -r $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/.config $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/include/linux/autoconf.h
+ # Copy .config to include/config/auto.conf so "make prepare" is unnecessary.
+ cp $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/.config $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/include/config/auto.conf
+
+%if %{fancy_debuginfo}
+ if test -s vmlinux.id; then
+ cp vmlinux.id $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/vmlinux.id
+ else
+ echo >&2 "*** ERROR *** no vmlinux build ID! ***"
+ exit 1
+ fi
+%endif
+
+ #
+ # save the vmlinux file for kernel debugging into the kernel-debuginfo rpm
+ #
+%if %{with_debuginfo}
+ mkdir -p $RPM_BUILD_ROOT%{debuginfodir}/lib/modules/$KernelVer
+ cp vmlinux $RPM_BUILD_ROOT%{debuginfodir}/lib/modules/$KernelVer
+%endif
+
+ find $RPM_BUILD_ROOT/lib/modules/$KernelVer -name "*.ko" -type f >modnames
+
+ # mark modules executable so that strip-to-file can strip them
+ xargs --no-run-if-empty chmod u+x < modnames
+
+ # Generate a list of modules for block and networking.
+
+ grep -F /drivers/ modnames | xargs --no-run-if-empty nm -upA |
+ sed -n 's,^.*/\([^/]*\.ko\): *U \(.*\)$,\1 \2,p' > drivers.undef
+
+ collect_modules_list()
+ {
+ sed -r -n -e "s/^([^ ]+) \\.?($2)\$/\\1/p" drivers.undef |
+ LC_ALL=C sort -u > $RPM_BUILD_ROOT/lib/modules/$KernelVer/modules.$1
+ }
+
+ collect_modules_list networking \
+ 'register_netdev|ieee80211_register_hw|usbnet_probe|phy_driver_register'
+ collect_modules_list block \
+ 'ata_scsi_ioctl|scsi_add_host|scsi_add_host_with_dma|blk_init_queue|register_mtd_blktrans|scsi_esp_register|scsi_register_device_handler'
+ collect_modules_list drm \
+ 'drm_open|drm_init'
+ collect_modules_list modesetting \
+ 'drm_crtc_init'
+
+ # detect missing or incorrect license tags
+ rm -f modinfo
+ while read i
+ do
+ echo -n "${i#$RPM_BUILD_ROOT/lib/modules/$KernelVer/} " >> modinfo
+ /sbin/modinfo -l $i >> modinfo
+ done < modnames
+
+ grep -E -v \
+ 'GPL( v2)?$|Dual BSD/GPL$|Dual MPL/GPL$|GPL and additional rights$' \
+ modinfo && exit 1
+
+ rm -f modinfo modnames
+
+ # remove files that will be auto generated by depmod at rpm -i time
+ for i in alias alias.bin builtin.bin ccwmap dep dep.bin ieee1394map inputmap isapnpmap ofmap pcimap seriomap symbols symbols.bin usbmap
+ do
+ rm -f $RPM_BUILD_ROOT/lib/modules/$KernelVer/modules.$i
+ done
+
+ # Move the devel headers out of the root file system
+ mkdir -p $RPM_BUILD_ROOT/usr/src/kernels
+ mv $RPM_BUILD_ROOT/lib/modules/$KernelVer/build $RPM_BUILD_ROOT/$DevelDir
+ ln -sf ../../..$DevelDir $RPM_BUILD_ROOT/lib/modules/$KernelVer/build
+
+ # prune junk from kernel-devel
+ find $RPM_BUILD_ROOT/usr/src/kernels -name ".*.cmd" -exec rm -f {} \;
+}
+
+###
+# DO it...
+###
+
+# prepare directories
+rm -rf $RPM_BUILD_ROOT
+mkdir -p $RPM_BUILD_ROOT/boot
+mkdir -p $RPM_BUILD_ROOT%{_libexecdir}
+
+cd linux-%{kversion}.%{_target_cpu}
+
+%if %{with_debug}
+BuildKernel %make_target %kernel_image debug
+%endif
+
+%if %{with_pae_debug}
+BuildKernel %make_target %kernel_image PAEdebug
+%endif
+
+%if %{with_pae}
+BuildKernel %make_target %kernel_image PAE
+%endif
+
+%if %{with_up}
+BuildKernel %make_target %kernel_image
+%endif
+
+%if %{with_smp}
+BuildKernel %make_target %kernel_image smp
+%endif
+
+%global perf_make \
+ make %{?_smp_mflags} -C tools/perf -s V=1 HAVE_CPLUS_DEMANGLE=1 prefix=%{_prefix}
+%if %{with_perf}
+%{perf_make} all
+%{perf_make} man || %{doc_build_fail}
+%endif
+
+%if %{with_doc}
+# Make the HTML and man pages.
+make htmldocs mandocs || %{doc_build_fail}
+
+# sometimes non-world-readable files sneak into the kernel source tree
+chmod -R a=rX Documentation
+find Documentation -type d | xargs chmod u+w
+%endif
+
+###
+### Special hacks for debuginfo subpackages.
+###
+
+# This macro is used by %%install, so we must redefine it before that.
+%define debug_package %{nil}
+
+%if %{fancy_debuginfo}
+%define __debug_install_post \
+ /usr/lib/rpm/find-debuginfo.sh %{debuginfo_args} %{_builddir}/%{?buildsubdir}\
+%{nil}
+%endif
+
+%if %{with_debuginfo}
+%ifnarch noarch
+%global __debug_package 1
+%files -f debugfiles.list debuginfo-common-%{_target_cpu}
+%defattr(-,root,root)
+%endif
+%endif
+
+###
+### install
+###
+
+%install
+
+cd linux-%{kversion}.%{_target_cpu}
+
+%if %{with_doc}
+docdir=$RPM_BUILD_ROOT%{_datadir}/doc/kernel-doc-%{rpmversion}
+man9dir=$RPM_BUILD_ROOT%{_datadir}/man/man9
+
+# copy the source over
+mkdir -p $docdir
+tar -f - --exclude=man --exclude='.*' -c Documentation | tar xf - -C $docdir
+
+# Install man pages for the kernel API.
+mkdir -p $man9dir
+find Documentation/DocBook/man -name '*.9.gz' -print0 |
+xargs -0 --no-run-if-empty %{__install} -m 444 -t $man9dir $m
+ls $man9dir | grep -q '' || > $man9dir/BROKEN
+%endif # with_doc
+
+%if %{with_perf}
+# perf tool binary and supporting scripts/binaries
+%{perf_make} DESTDIR=$RPM_BUILD_ROOT install
+
+# perf man pages (note: implicit rpm magic compresses them later)
+%{perf_make} DESTDIR=$RPM_BUILD_ROOT install-man || %{doc_build_fail}
+%endif
+
+%if %{with_headers}
+# Install kernel headers
+make ARCH=%{hdrarch} INSTALL_HDR_PATH=$RPM_BUILD_ROOT/usr headers_install
+
+# Do headers_check but don't die if it fails.
+make ARCH=%{hdrarch} INSTALL_HDR_PATH=$RPM_BUILD_ROOT/usr headers_check \
+ > hdrwarnings.txt || :
+if grep -q exist hdrwarnings.txt; then
+ sed s:^$RPM_BUILD_ROOT/usr/include/:: hdrwarnings.txt
+ # Temporarily cause a build failure if header inconsistencies.
+ # exit 1
+fi
+
+find $RPM_BUILD_ROOT/usr/include \
+ \( -name .install -o -name .check -o \
+ -name ..install.cmd -o -name ..check.cmd \) | xargs rm -f
+
+# glibc provides scsi headers for itself, for now
+rm -rf $RPM_BUILD_ROOT/usr/include/scsi
+rm -f $RPM_BUILD_ROOT/usr/include/asm*/atomic.h
+rm -f $RPM_BUILD_ROOT/usr/include/asm*/io.h
+rm -f $RPM_BUILD_ROOT/usr/include/asm*/irq.h
+%endif
+
+%if %{with_firmware}
+%{build_firmware}
+%endif
+
+%if %{with_bootwrapper}
+make DESTDIR=$RPM_BUILD_ROOT bootwrapper_install WRAPPER_OBJDIR=%{_libdir}/kernel-wrapper WRAPPER_DTSDIR=%{_libdir}/kernel-wrapper/dts
+%endif
+
+
+###
+### clean
+###
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+###
+### scripts
+###
+
+#
+# This macro defines a %%post script for a kernel*-devel package.
+# %%kernel_devel_post [<subpackage>]
+#
+%define kernel_devel_post() \
+%{expand:%%post %{?1:%{1}-}devel}\
+if [ -f /etc/sysconfig/kernel ]\
+then\
+ . /etc/sysconfig/kernel || exit $?\
+fi\
+if [ "$HARDLINK" != "no" -a -x /usr/sbin/hardlink ]\
+then\
+ (cd /usr/src/kernels/%{KVERREL}%{?1:.%{1}} &&\
+ /usr/bin/find . -type f | while read f; do\
+ hardlink -c /usr/src/kernels/*.fc*.*/$f $f\
+ done)\
+fi\
+%{nil}
+
+# This macro defines a %%posttrans script for a kernel package.
+# %%kernel_variant_posttrans [<subpackage>]
+# More text can follow to go at the end of this variant's %%post.
+#
+%define kernel_variant_posttrans() \
+%{expand:%%posttrans %{?1}}\
+/sbin/new-kernel-pkg --package kernel-libre%{?-v:-%{-v*}} --mkinitrd --dracut --depmod --update %{KVERREL}%{?-v:.%{-v*}} || exit $?\
+/sbin/new-kernel-pkg --package kernel-libre%{?1:-%{1}} --rpmposttrans %{KVERREL}%{?1:.%{1}} || exit $?\
+%{nil}
+
+#
+# This macro defines a %%post script for a kernel package and its devel package.
+# %%kernel_variant_post [-v <subpackage>] [-r <replace>]
+# More text can follow to go at the end of this variant's %%post.
+#
+%define kernel_variant_post(v:r:) \
+%{expand:%%kernel_devel_post %{?-v*}}\
+%{expand:%%kernel_variant_posttrans %{?-v*}}\
+%{expand:%%post %{?-v*}}\
+%{-r:\
+if [ `uname -i` == "x86_64" -o `uname -i` == "i386" ] &&\
+ [ -f /etc/sysconfig/kernel ]; then\
+ /bin/sed -r -i -e 's/^DEFAULTKERNEL=%{-r*}$/DEFAULTKERNEL=kernel-libre%{?-v:-%{-v*}}/' /etc/sysconfig/kernel || exit $?\
+fi}\
+%{expand:\
+/sbin/new-kernel-pkg --package kernel-libre%{?-v:-%{-v*}} --install %{KVERREL}%{?-v:.%{-v*}} || exit $?\
+}\
+%{nil}
+
+#
+# This macro defines a %%preun script for a kernel package.
+# %%kernel_variant_preun <subpackage>
+#
+%define kernel_variant_preun() \
+%{expand:%%preun %{?1}}\
+/sbin/new-kernel-pkg --rminitrd --rmmoddep --remove %{KVERREL}%{?1:.%{1}} || exit $?\
+%{nil}
+
+%kernel_variant_preun
+%kernel_variant_post -r kernel-smp
+
+%kernel_variant_preun smp
+%kernel_variant_post -v smp
+
+%kernel_variant_preun PAE
+%kernel_variant_post -v PAE -r (kernel|kernel-smp)
+
+%kernel_variant_preun debug
+%kernel_variant_post -v debug
+
+%kernel_variant_post -v PAEdebug -r (kernel|kernel-smp)
+%kernel_variant_preun PAEdebug
+
+if [ -x /sbin/ldconfig ]
+then
+ /sbin/ldconfig -X || exit $?
+fi
+
+###
+### file lists
+###
+
+%if %{with_headers}
+%files headers
+%defattr(-,root,root)
+/usr/include/*
+%endif
+
+%if %{with_firmware}
+%files firmware
+%defattr(-,root,root)
+/lib/firmware/*
+%doc linux-%{kversion}.%{_target_cpu}/firmware/WHENCE
+%endif
+
+%if %{with_bootwrapper}
+%files bootwrapper
+%defattr(-,root,root)
+/usr/sbin/*
+%{_libdir}/kernel-wrapper
+%endif
+
+# only some architecture builds need kernel-doc
+%if %{with_doc}
+%files doc
+%defattr(-,root,root)
+%{_datadir}/doc/kernel-doc-%{rpmversion}/Documentation/*
+%dir %{_datadir}/doc/kernel-doc-%{rpmversion}/Documentation
+%dir %{_datadir}/doc/kernel-doc-%{rpmversion}
+%{_datadir}/man/man9/*
+%endif
+
+%if %{with_perf}
+%files -n perf-libre
+%defattr(-,root,root)
+%{_bindir}/perf
+%dir %{_libexecdir}/perf-core
+%{_libexecdir}/perf-core/*
+%{_mandir}/man[1-8]/*
+
+%if %{with_debuginfo}
+%files -f perf-debuginfo.list -n perf-libre-debuginfo
+%defattr(-,root,root)
+%endif
+%endif
+
+# This is %%{image_install_path} on an arch where that includes ELF files,
+# or empty otherwise.
+%define elf_image_install_path %{?kernel_image_elf:%{image_install_path}}
+
+#
+# This macro defines the %%files sections for a kernel package
+# and its devel and debuginfo packages.
+# %%kernel_variant_files [-k vmlinux] <condition> <subpackage>
+#
+%define kernel_variant_files(k:) \
+%if %{1}\
+%{expand:%%files %{?2}}\
+%defattr(-,root,root)\
+/%{image_install_path}/%{?-k:%{-k*}}%{!?-k:vmlinuz}-%{KVERREL}%{?2:.%{2}}\
+%attr(600,root,root) /boot/System.map-%{KVERREL}%{?2:.%{2}}\
+/boot/config-%{KVERREL}%{?2:.%{2}}\
+%dir /lib/modules/%{KVERREL}%{?2:.%{2}}\
+/lib/modules/%{KVERREL}%{?2:.%{2}}/kernel\
+/lib/modules/%{KVERREL}%{?2:.%{2}}/build\
+/lib/modules/%{KVERREL}%{?2:.%{2}}/source\
+/lib/modules/%{KVERREL}%{?2:.%{2}}/extra\
+/lib/modules/%{KVERREL}%{?2:.%{2}}/updates\
+%ifarch %{vdso_arches}\
+/lib/modules/%{KVERREL}%{?2:.%{2}}/vdso\
+/etc/ld.so.conf.d/kernel-%{KVERREL}%{?2:.%{2}}.conf\
+%endif\
+/lib/modules/%{KVERREL}%{?2:.%{2}}/modules.*\
+%ghost /boot/initramfs-%{KVERREL}%{?2:.%{2}}.img\
+%{expand:%%files %{?2:%{2}-}devel}\
+%defattr(-,root,root)\
+/usr/src/kernels/%{KVERREL}%{?2:.%{2}}\
+%if %{with_debuginfo}\
+%ifnarch noarch\
+%if %{fancy_debuginfo}\
+%{expand:%%files -f debuginfo%{?2}.list %{?2:%{2}-}debuginfo}\
+%else\
+%{expand:%%files %{?2:%{2}-}debuginfo}\
+%endif\
+%defattr(-,root,root)\
+%if !%{fancy_debuginfo}\
+%if "%{elf_image_install_path}" != ""\
+%{debuginfodir}/%{elf_image_install_path}/*-%{KVERREL}%{?2:.%{2}}.debug\
+%endif\
+%{debuginfodir}/lib/modules/%{KVERREL}%{?2:.%{2}}\
+%{debuginfodir}/usr/src/kernels/%{KVERREL}%{?2:.%{2}}\
+%endif\
+%endif\
+%endif\
+%endif\
+%{nil}
+
+
+%kernel_variant_files %{with_up}
+%kernel_variant_files %{with_smp} smp
+%kernel_variant_files %{with_debug} debug
+%kernel_variant_files %{with_pae} PAE
+%kernel_variant_files %{with_pae_debug} PAEdebug
+
+# plz don't put in a version string unless you're going to tag
+# and build.
+
+%changelog
+* Fri May 13 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38.6-28
+- [fabbione@] Fix a deadlock when using hp_sw with an HP san.
+ (7a1e9d82 upstream)
+
+* Wed May 11 2011 Chuck Ebbert <cebbert@redhat.com>
+- Fix Intel IPS driver so it doesn't run continuously (#703511)
+
+* Tue May 10 2011 Kyle McMartin <kmcmartin@redhat.com>
+- [sgruszka@] iwlwifi: add {ack,plpc}_check module parameters (#666646)
+
+* Tue May 10 2011 Chuck Ebbert <cebbert@redhat.com>
+- Linux 2.6.38.6 (no functional changes from 2.6.38.6-26.rc1)
+- Drop merged patches:
+ can-add-missing-socket-check-in-can_raw_release.patch
+ scsi-fix-oops-in-scsi_run_queue.patch
+ vm-skip-the-stack-guard-page-lookup-in-get_user_pages-only-for-mlock.patch
+
+* Mon May 09 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38.6-26.rc1
+- Fix a VM bug introduced in 2.6.38.4
+
+* Mon May 09 2011 Kyle McMartin <kmcmartin@redhat.com>
+- Update to stable review 2.6.38.6-rc1
+- Revert DRM patch duplicated in drm-radeon-update rollup.
+- Revert cx88 fix in stable which has been fixed differently in the
+ v4l-dvb-update backport.
+- Add two patches which should make it into the final 2.6.38.6 release.
+ - can-add-missing-socket-check-in-can_raw_release.patch
+ - scsi-fix-oops-in-scsi_run_queue.patch
+
+* Mon May 09 2011 Chuck Ebbert <cebbert@redhat.com>
+- Enable CONFIG_FB_UDL (#634636)
+
+* Mon May 09 2011 Dave Airlie <airlied@redhat.com>
+- fix dual-gpu intel/radeon laptops where intel would cause radeon crash.
+
+* Sat May 07 2011 Chuck Ebbert <cebbert@redhat.com>
+- Fix breakage of network device names on Dell systems (#702740)
+
+* Fri May 06 2011 Dave Airlie <airlied@redhat.com> 2.6.38.5-24
+- forgot the cayman PCI IDs.
+
+* Wed May 4 2011 <lxoliva@fsfla.org> -libre
+- Deblobbed drm-radeon-update.patch.
+
+* Tue May 03 2011 Dave Airlie <airlied@redhat.com> 2.6.38.5-23
+- radeon updates from 2.6.39 with cayman + fixes for lots of things including Fusion.
+- vblank fix for core drm
+
+* Mon May 02 2011 Chuck Ebbert <cebbert@redhat.com>
+- [SCSI] mpt2sas: prevent heap overflows and unchecked reads
+ (CVE-2011-1494, CVE-2011-1495)
+- bonding: Incorrect TX queue offset (CVE-2011-1581)
+- Restore reliable stack backtraces, and hopefully fix RHBZ #700718
+
+* Mon May 02 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38.5-22
+- And to the released 2.6.38.5
+
+* Sun May 01 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38.5-21.rc1
+- Update to stable release candidate 2.6.38.5-rc1
+
+* Thu Apr 28 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38.4-20
+- [sgruszka@] Upstream fixes for iwl3945 bugs (#683571, #688252, #671366)
+
+* Tue Apr 26 2011 Chuck Ebbert <cebbert@redhat.com>
+- Another fix for ASPM powersave mode
+
+* Mon Apr 25 2011 Jarod Wilson <jarod@redhat.com>
+- ite-cir: fix modular build on powerpc (#698378)
+- mceusb: add Dell-branded transceiver device ID
+- nuvoton-cir: improve compatibility with lirc raw IR mode
+
+* Mon Apr 25 2011 Neil Horman <nhorman@redhat.com>
+- netconsole: fix deadlock in netdev notifier handler
+
+* Sun Apr 24 2011 Kyle McMartin <kmcmartin@redhat.com>
+- ppc64: disable TUNE_CELL, which causes problems with illegal instuctions
+ being generated on non-Cell PPC machines. (#698256)
+
+* Fri Apr 22 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38.4-19
+- Update to 2.6.38.4
+
+* Fri Apr 22 2011 Alexandre Oliva <lxoliva@fsfla.org> -libre
+- Deblobbed linux-2.6-v4l-dvb-update.patch.
+
+* Fri Apr 22 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38.3-18
+- iwlwifi: fix scanning when channel changing (#688252)
+
+* Tue Apr 19 2011 Jarod Wilson <jarod@redhat.com>
+- Add basic support for full 32-bit NEC IR scancodes
+- Add latest patches sent upstream for hid layer expansion and full
+ support for the TiVo Slide bluetooth/hid remote
+- Add a TiVo IR remote keymap, use it by default with TiVo mceusb device
+- Add ite-cir driver, nuke crappy old lirc_it* drivers
+- Add an initial Apple remote keymap
+- Add support for more Nuvoton IR hardware variants
+- Overhaul lirc_zilog refcounting so it doesn't suck so badly anymore
+- Clean up myriad of Hauppauge keymaps
+- Make ir-kbd-i2c pass full rc5 scancodes when it can
+- Misc minor v4l/dvb fixes
+
+* Fri Apr 15 2011 Kyle McMartin <kmcmartin@redhat.com>
+- Drop x86-hibernate-initialize-mmu_cr4_features-during-boot.patch,
+ e5f15b45 was reverted in stable.
+
+* Thu Apr 14 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38.3-16
+- Linux 2.6.38.3
+- Drop merged patches:
+ linux-2.6-x86-fix-mtrr-resume.patch
+ pci-acpi-report-aspm-support-to-bios-if-not-disabled-from-command-line.patch
+- Drop some obsolete patches:
+ runtime_pm_fixups.patch
+ drm-i915-gen4-has-non-power-of-two-strides.patch'
+
+* Wed Apr 13 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38.3-15.rc1
+- Linux 2.6.38.3-rc1
+
+* Tue Apr 12 2011 Kyle McMartin <kmcmartin@redhat.com>
+- fix hibernate which was broken by 2.6.38.y (korg#32222)
+
+* Tue Apr 12 2011 Ben Skeggs <bskeggs@redhat.com> 2.6.38-2.14
+- nouveau: correct lock ordering problem
+
+* Mon Apr 11 2011 Dave Airlie <airlied@redhat.com>
+- x86: add upstream patch to fix MTRR on resume - will come via stable later.
+
+* Fri Apr 08 2011 Ben Skeggs <bskeggs@redhat.com> 2.6.38-2.13
+- nouveau: fix pcie nv3x (rhbz#692588)
+
+* Thu Apr 07 2011 Hans de Goede <hdegoede@redhat.com>
+- i915: Add a no lvds quirk for the Asus EB1007, this fixes gnome-shell
+
+* Thu Apr 07 2011 Ben Skeggs <bskeggs@redhat.com> 2.6.38-2.12
+- nouveau: switch nv4x back to DMA32 only (rhbz#689825)
+
+* Mon Apr 04 2011 Ben Skeggs <bskeggs@redhat.com> 2.6.38-2.11
+- ttm: add patch from upstream to fix a recent nouveau issue
+
+* Thu Mar 31 2011 Ben Skeggs <bskeggs@redhat.com> 2.6.38-2.10
+- nouveau: nva3+ stability improvements
+- nouveau: nvc0 "stutter" fixes
+- nouveau: nv50/nvc0 page flipping
+- nouveau: nv50 z compression
+
+* Wed Mar 29 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38.2-9
+- Downgrade SCSI sd printk's about disk caching from KERN_ERR to KERN_NOTICE
+ so they don't show up in our pretty quiet boot. Ray noticed them when
+ booting from a USB stick which doesn't have a cache page returned in the
+ sense buffer.
+
+* Tue Mar 29 2011 Kyle McMartin <kmcmartin@redhat.com>
+- Disable CONFIG_IMA, CONFIG_TCG_TPM on powerpc (#689468)
+
+* Tue Mar 29 2011 Kyle McMartin <kmcmartin@redhat.com>
+- printk: do not mangle valid userspace syslog prefixes with
+ /dev/kmsg (#691888)
+ - The patch is upstream in 2.6.39, and Lennart tells me the patch has been
+ backported for the next Suse release as well.
+- Disable qla4xxx (CONFIG_SCSI_QLA_ISCSI) driver on powerpc32 (#686199)
+
+* Sun Mar 27 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38.2-8
+- Linux 2.6.38.2
+- Drop patches merged in 2.6.38.2:
+ dcdbas-force-smi-to-happen-when-expected.patch
+ fs-call-security_d_instantiate-in-d_obtain_alias.patch
+ prevent-rt_sigqueueinfo-and-rt_tgsigqueueinfo-from-spoofing-the-signal-code.patch
+- Fix more PCIe ASPM bugs:
+ kworker task over 65% after resume (#683156)
+ ASPM powersave mode does not get enabled
+
+* Sat Mar 26 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38.2-7.rc1
+- Linux 2.6.38.2-rc1
+
+* Fri Mar 25 2011 Chuck Ebbert <cebbert@redhat.com>
+- CVE-2011-1182: kernel signal spoofing issue
+- Drop unused patches already applied upstream:
+ hdpvr-ir-enable.patch
+ thinkpad-acpi-fix-backlight.patch
+
+* Wed Mar 23 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38.1-6
+- Linux 2.6.38.1
+- Drop linux-2.6-ehci-check-port-status.patch, merged in .38.1
+- Add dcdbas-force-smi-to-happen-when-expected.patch
+
+* Wed Mar 23 2011 Kyle McMartin <kmcmartin@redhat.com>
+- Re-create ACPI battery sysfs files on resume from suspend, fixes the
+ upstream changes to the dropped
+ acpi-update-battery-information-on-notification-0x81.patch.
+
+* Wed Mar 23 2011 Dave Airlie <airlied@redhat.com> 2.6.38-5
+- i915: add fix for 945G misrendering terminal
+
+* Tue Mar 22 2011 Ben Skeggs <bskeggs@redhat.com> 2.6.38-4
+- nouveau: implement missing bios opcode 0x5c (rhbz#688569)
+- nouveau: a couple of minor fixes from nouveau git
+
+* Mon Mar 21 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-3
+- Add contents of 2.6.38.1 patch queue (in git-linus.diff)
+
+* Thu Mar 17 2011 Matthew Garrett <mjg@redhat.com> 2.6.38-2
+- drop efi_default_physical.patch - it's actually setting up something that's
+ neither physical nor virtual, and it's probably breaking EFI boots
+
+* Wed Mar 16 2011 Dennis Gilmore <dennis@ausil.us>
+- build sparc imagae as vmlinux
+- fixes buildid conflicts since the sparc kernel is just a elf image
+
+* Wed Mar 16 2011 Alexandre Oliva <lxoliva@fsfla.org> -libre
+- Deblobbed to 2.6.38-libre.
+
+* Tue Mar 15 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-1
+- Linux 2.6.38
+
+* Mon Mar 14 2011 Alexandre Oliva <lxoliva@fsfla.org> -libre
+- Deblobbed patch-libre-2.6.38-rc8-git4 by hand.
+
+* Mon Mar 13 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc8.git4.1
+- Linux 2.6.38-rc8-git4
+
+* Thu Mar 10 2011 Chuck Ebbert <cebbert@redhat.com>
+- Linux 2.6.38-rc8-git3
+
+* Thu Mar 10 2011 Alexandre Oliva <lxoliva@fsfla.org> -libre
+- Created patch-libre-2.6.38-rc8 by diffing deblobbed trees.
+
+* Thu Mar 10 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc8.git2.1
+- Linux 2.6.38-rc8-git2
+
+* Wed Mar 09 2011 Chuck Ebbert <cebbert@redhat.com>
+- Linux 2.6.38-rc8-git1
+
+* Wed Mar 09 2011 Dennis Gilmore <dennis@ausil.us>
+- apply sparc64 gcc-4.6.0 buildfix patch
+
+* Wed Mar 09 2011 Ben Skeggs <bskeggs@redhat.com> 2.6.38-0.rc8.git0.2
+- nouveau: allow max clients on nv4x (679629), better error reporting
+
+* Tue Mar 08 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc8.git0.1
+- Linux 2.6.38-rc8
+
+* Mon Mar 7 2011 Alexandre Oliva <lxoliva@fsfla.org> -libre
+- Created patch-libre-2.6.38-rc7 by diffing deblobbed trees.
+
+* Sat Mar 05 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc7.git4.1
+- Linux 2.6.38-rc7-git4
+- Revert upstream commit e3e89cc535223433a619d0969db3fa05cdd946b8
+ for now to fix utrace build.
+
+* Fri Mar 04 2011 Roland McGrath <roland@redhat.com> - 2.6.38-0.rc7.git2.3
+- Split out perf-debuginfo subpackage.
+
+* Fri Mar 04 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc7.git2.2
+- Disable drm-i915-gen4-has-non-power-of-two-strides.patch for now, breaks
+ my mutter.
+
+* Fri Mar 04 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc7.git2.1
+- Linux 2.6.38-rc7-git2
+- drm-i915-gen4-has-non-power-of-two-strides.patch (#681285)
+
+* Thu Mar 03 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc7.git1.1
+- Linux 2.6.38-rc7-git1
+
+* Tue Mar 01 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc7.git0.1
+- Linux 2.6.38-rc7
+
+* Fri Feb 25 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc6.git6.1
+- Linux 2.6.38-rc6-git6
+- Build in virtio_pci driver so virtio_console will be built-in (#677713)
+
+* Thu Feb 24 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc6.git4.1
+- Linux 2.6.38-rc6-git4
+
+* Thu Feb 24 2011 Matthew Garrett <mjg@redhat.com> 2.6.38-0.rc6.git2.2
+- linux-2.6-acpi-fix-implicit-notify.patch: Fix implicit notify when there's
+ more than one device per GPE
+
+* Wed Feb 23 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc6.git2.1
+- Linux 2.6.38-rc6-git2
+
+* Wed Feb 23 2011 Alexandre Oliva <lxoliva@fsfla.org> -libre Thu Feb 24
+- Created patch-libre-2.6.38-rc6 by diffing deblobbed trees.
+
+* Wed Feb 23 2011 Ben Skeggs <bskeggs@redhat.com> 2.6.38-0.rc6.git0.2
+- nouveau: nv4x pciegart fixes, nvc0 accel improvements
+
+* Tue Feb 22 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc6.git0.1
+- Linux 2.6.38-rc6
+
+* Tue Feb 22 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc5.git7.1
+- Linux 2.6.38-rc5-git7
+
+* Mon Feb 21 2011 Dave Jones <davej@redhat.com> 2.6.38-0.rc5.git6.1
+- Linux 2.6.38-rc5-git6
+
+* Sat Feb 19 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc5.git5.1
+- Linux 2.6.38-rc5-git5
+
+* Wed Feb 16 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc5.git1.1
+- Linux 2.6.38-rc5-git1
+- Add support for Airprime/Sierra USB IP modem (#676860)
+- Make virtio_console built-in on x86_64 (#677713)
+- Revert check for read-only block device added in .38 (#672265)
+
+* Tue Feb 15 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc5.git0.1
+- Linux 2.6.38-rc5 (81 minutes later...)
+
+* Sun Feb 13 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc4.git7.1
+- Linux 2.6.38-rc4-git7
+
+* Sat Feb 12 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc4.git6.1
+- Linux 2.6.38-rc4-git6
+- Fix memory corruption caused by bug in bridge code.
+
+* Thu Feb 10 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc4.git3.1
+- Linux 2.6.38-rc4-git3
+
+* Mon Feb 07 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2.6.38-0.rc4.git0.2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Mon Feb 07 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc4.git0.1
+- Linux 2.6.38-rc4
+
+* Fri Feb 04 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc3.git4.1
+- Linux 2.6.38-rc3-git4
+
+* Thu Feb 03 2011 Chuck Ebbert <cebbert@redhat.com>
+- Linux 2.6.38-rc3-git3
+- Enable Advansys SCSI driver on x86_64 (#589115)
+
+* Thu Feb 03 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc3.git2.1
+- Linux 2.6.38-rc3-git2 snapshot
+- [sgruszka] ath5k: fix fast channel change (#672778)
+
+* Wed Feb 02 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc3.git1.1
+- Linux 2.6.38-rc3-git1 snapshot.
+
+* Wed Feb 02 2011 Chuck Ebbert <cebbert@redhat.com>
+- Fix autoload of atl1c driver for latest hardware (#607499)
+
+* Tue Feb 01 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc3.git0.1
+- Linux 2.6.38-rc3
+- Try to fix some obvious bugs in hfsplus mount failure handling (#673857)
+
+* Mon Jan 31 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc2.git9.1
+- Linux 2.6.38-rc2-git9
+
+* Mon Jan 31 2011 Kyle McMartin <kmcmartin@redhat.com>
+- disable CONFIG_SERIAL_8250_DETECT_IRQ (from mschmidt@redhat.com)
+
+* Mon Jan 31 2011 Chuck Ebbert <cebbert@redhat.com>
+- Linux 2.6.38-rc2-git8
+- Add Trond's NFS bugfixes branch from git.linux-nfs.org
+
+* Mon Jan 31 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc2.git7.2
+- Fix build failure on s390.
+
+* Fri Jan 28 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc2.git7.1
+- Linux 2.6.38-rc2-git7
+
+* Wed Jan 26 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc2.git5.1
+- Linux 2.6.38-rc2-git5
+- [x86] Re-enable TRANSPARENT_HUGEPAGE, should be fixed by cacf061c.
+
+* Tue Jan 25 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc2.git3.2
+- [x86] Disable TRANSPARENT_HUGEPAGE for now, there be dragons there.
+
+* Tue Jan 25 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc2.git3.1
+- Linux 2.6.38-rc2-git3
+- perf-gcc460-build-fixes.patch: fix context from [9486aa38]
+
+* Mon Jan 24 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc2.git1.3
+- Disable usb/pci/acpi autosuspend goo until it can be checked.
+
+* Mon Jan 24 2011 Kyle McMartin <kmcmartin@redhat.com>
+- debug-tty-print-dev-name.patch: drop, haven't seen any warnings recently.
+- runtime_pm_fixups.patch: rebase and re-enable, make acpi_power_transition
+ in pci_bind actually do the right thing instead of (likely) always
+ trying to transition to D0.
+
+* Mon Jan 24 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc2.git1.1
+- Linux 2.6.38-rc2-git1
+- [e5cce6c1] tpm: fix panic caused by "tpm: Autodetect itpm devices"
+ may fix some boot issues people were having.
+- tpm-fix-stall-on-boot.patch: upstream.
+- perf-gcc460-build-fixes.patch: fix build issues with warn-unused-but-set
+ in gcc 4.6.0
+
+* Sat Jan 22 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc2.git0.1
+- Linux 2.6.38-rc2
+- linux-2.6-serial-460800.patch, drivers/serial => drivers/tty/serial
+
+* Thu Jan 20 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc1.git1.1
+- Linux 2.6.38-rc1-git1, should fix boot failure in -rc1.
+
+* Wed Jan 19 2011 Roland McGrath <roland@redhat.com>
+- utrace update
+
+* Wed Jan 19 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc1.git0.1
+- Linux 2.6.38-rc1
+
+* Tue Jan 18 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc0.git18.1
+- Linux 2.6.37-git18
+
+* Mon Jan 17 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc0.git16.1
+- Linux 2.6.37-git16
+- config changes:
+ - CONFIG_SQUASHFS_XZ=y [generic]
+ - CONFIG_SPARSE_IRQ=y [arm]
+
+* Sat Jan 15 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc0.git13.1
+- Linux 2.6.37-git13
+- Drop xen_export-arbitrary_virt_to_machine.patch, upstream.
+
+* Fri Jan 14 2011 Kyle McMartin <kmcmartin@redhat.com>
+- xen_export-arbitrary_virt_to_machine.patch: pull patch from upstream
+ to fix build error.
+
+* Fri Jan 14 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc0.git12.1
+- Linux 2.6.37-git12
+- 0001-use-__devexit-not-__exit-in-n2_unregister_algs-fixes.patch: drop
+ upstream patch.
+- acpi-update-battery-information-on-notification-0x81.patch: drop upstream
+ patch.
+- mm-*.patch: drop upstream patches.
+- important config changes:
+ ACPI_IPMI=m
+ CRYPTO_AES_NI_INTEL=m [i386]
+ TRANSPARENT_HUGEPAGE=y
+
+* Wed Jan 12 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc0.git9.1
+- Linux 2.6.37-git9
+- Re-enable DEBUG_SET_MODULE_RONX since commit 94462ad3 fixed it.
+- Enable some more new random HID and sensor junk as modules.
+
+* Tue Jan 11 2011 Matthew Garrett <mjg@redhat.com>
+- linux-2.6-ehci-check-port-status.patch - fix USB resume on some AMD systems
+
+* Mon Jan 10 2011 Jarod Wilson <jarod@redhat.com>
+- Add support for local rebuild config option overrides
+- Add missing --with/--without pae build flag support
+
+* Mon Jan 10 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc0.git4.2
+- Disable DEBUG_SET_MODULE_RONX for now, it causes boot-up to fail since
+ dynamic ftrace is trying to rewrite instructions on module load.
+
+* Mon Jan 10 2011 Kyle McMartin <kmcmartin@redhat.com>
+- Drop obsolete linux-2.6-debug-nmi-timeout.patch
+
+* Mon Jan 10 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc0.git4.1
+- Branch for 2.6.38
+- Rebase trivial patches.
+- Switch debug configs back on.
+- config changes:
+ DEBUG_SET_MODULE_RONX=y
+ B43_PHY_N=y
+ RT2800USB_RT33XX=y |
+ RT2800PCI_RT33XX=y | experimental
+ WL12XX=m
+ RTL8192CE=m
+ CAN_SLCAN=m
+ SCHED_AUTOGROUP=n
+
+* Fri Jan 07 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.37-2
+- drm_i915-check-eDP-encoder-correctly-when-setting-modes.patch reported to
+ fix HP/Sony eDP issues by adamw and airlied.
+
+* Wed Jan 05 2011 Dennis Gilmore <dennis@ausil.us>
+- build sparc headers on sparcv9
+
+* Tue Jan 04 2011 Dennis Gilmore <dennis@ausil.us>
+- add patch for sparc build failure
+
+* Tue Jan 04 2011 Alexandre Oliva <lxoliva@fsfla.org> -libre Wed Jan 05
+- Deblobbed to 2.6.37-libre.
+
+* Tue Jan 04 2011 Kyle McMartin <kyle@redhat.com> 2.6.37-1
+- Track release of 2.6.37
+
+* Mon Jan 03 2011 Alexandre Oliva <lxoliva@fsfla.org> -libre
+- Deblobbed patch-libre-2.6.37-rc8.
+
+* Mon Jan 03 2011 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc8.git3.1
+- Linux 2.6.37-rc8-git3
+- Merged acpi battery notification patch and -rc8.
+
+* Thu Dec 23 2010 Kyle McMartin <kyle@redhat.com>
+- Pull in flexcop procfs rename patch since it's still not upstream. (#664852)
+
+* Tue Dec 21 2010 Alexandre Oliva <lxoliva@fsfla.org> -libre Tue Dec 28
+- Deblobbed patch-libre-2.6.37-rc7.
+
+* Tue Dec 21 2010 Kyle McMartin <kyle@redhat.com> 2.6.37.0.rc7.git0.2
+- Linux 2.6.37-rc7
+- CONFIG_USB_OTG=n (seems unnecessary?)
+- Enable release builds until .37 releases in rawhide.
+
+* Sun Dec 19 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc6.git5.1
+- Linux 2.6.37-rc6-git5
+- sched-cure-more-NO_HZ-load-average-woes.patch: upstream.
+
+* Sat Dec 18 2010 Kyle McMartin <kyle@redhat.com>
+- Patch from nhorman against f13:
+ Enhance AF_PACKET to allow non-contiguous buffer alloc (#637619)
+
+* Sat Dec 18 2010 Kyle McMartin <kyle@redhat.com>
+- Fix SELinux issues with NFS/btrfs and/or xfsdump. (#662344)
+
+* Fri Dec 17 2010 Matthew Garrett <mjg@redhat.com> 2.6.37-0.rc6.git0.3
+- efi_default_physical.patch: Revert hunk that breaks boot
+- linux-next-macbook-air-input.patch: Add input support for new Macbook Airs
+
+* Thu Dec 16 2010 Matthew Garrett <mjg@redhat.com> 2.6.37-0.rc6.git0.2
+- applesmc_update.patch: Make the driver more generic. Should help Apples.
+- apple_backlight.patch: Make sure that this loads on all hardware.
+- efifb_update.patch: Fixes for the 11 inch Macbook Air
+- acpi_reboot.patch: Should make reboot work better on most hardware
+- efi_default_physical.patch: Some machines dislike EFI virtual mode
+
+* Wed Dec 15 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc6.git0.1
+- Linux 2.6.37-rc6
+- Re-activate acpi patch which rejected on the previous commit.
+
+* Wed Dec 15 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc5.git5.1
+- 2.6.37-rc5-git5
+
+* Fri Dec 10 2010 Kyle McMartin <kyle@redhat.com>
+- Another patch from mjg59: Set _OSC supported field correctly (#638912)
+
+* Fri Dec 10 2010 Kyle McMartin <kyle@redhat.com>
+- pci-disable-aspm-if-bios-asks-us-to.patch: Patch from mjg59 to disable
+ ASPM if the BIOS has disabled it, but enabled it already on some devices.
+
+* Thu Dec 09 2010 Kyle McMartin <kyle@redhat.com>
+- Snarf patch from wireless-next to fix mdomsch's orinico wifi.
+ (orinoco: initialise priv->hw before assigning the interrupt)
+ [229bd792] (#657864)
+
+* Thu Dec 09 2010 Alexandre Oliva <lxoliva@fsfla.org> -libre Mon Dec 27
+- Deblobbed patch-libre-2.6.37-rc5.
+
+* Wed Dec 08 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc5.git2.1
+- Linux 2.6.37-rc5-git2
+- sched-cure-more-NO_HZ-load-average-woes.patch: fix some of the complaints
+ in 2.6.35+ about load average with dynticks. (rhbz#650934)
+
+* Tue Dec 07 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc5.git0.1
+- Linux 2.6.37-rc5
+
+* Sat Dec 04 2010 Kyle McMartin <kyle@redhat.com>
+- Enable C++ symbol demangling with perf by linking against libiberty.a,
+ which is LGPL2.
+
+* Fri Dec 03 2010 Kyle McMartin <kyle@redhat.com>
+- Linux 2.6.37-rc4-git3
+- Enable HP ILO on x86_64 for (#571329)
+- Drop merged drm-fixes.patch, split out edp-fixes.
+- tty-dont-allow-reopen-when-ldisc-is-changing.patch: upstream.
+- tty-ldisc-fix-open-flag-handling.patch: upstream.
+- Enable CIFS_ACL.
+
+* Thu Dec 02 2010 Kyle McMartin <kyle@redhat.com>
+- Grab some of Mel's fixes from -mmotm to hopefully sort out #649694.
+
+* Wed Dec 01 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc4.git1.1
+- Linux 2.6.37-rc4-git1
+- Pull in DRM fixes that are queued for -rc5 [3074adc8]
+ + edp-fixes on top
+
+* Tue Nov 30 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc4.git0.1
+- Linux 2.6.37-rc4
+
+* Mon Nov 29 2010 Kyle McMartin <kyle@redhat.com>
+- Update debug-vm-would_have_oomkilled patch.
+
+* Mon Nov 29 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc3.git6.1
+- Linux 2.6.37-rc3-git6
+- TTY: open/hangup race fixup (rhbz#630464)
+
+* Fri Nov 26 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc3.git3.1
+- Linux 2.6.37-rc3-git3
+- Print tty->flags as well in debugging patch...
+
+* Fri Nov 26 2010 Kyle McMartin <kyle@redhat.com>
+- Copy tty_open WARN_ON debugging patch from rawhide.
+
+* Fri Nov 26 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc3.git2.1
+- Linux 2.6.37-rc3-git2
+- CGROUP_MEM_RES_CTLR_SWAP_ENABLED is not set, so the cgroup memory
+ resource controller swap accounting is disabled by default. You can
+ enable it with 'swapaccount' if desired.
+- TTY: don't allow reopen when ldisc is changing (rhbz#630464)
+
+* Wed Nov 24 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc3.git1.1
+- Linux 2.6.37-rc3-git1
+
+* Mon Nov 22 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc3.git0.1
+- Linux 2.6.37-rc3
+
+* Sat Nov 20 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc2.git7.1
+- Linux 2.6.37-rc2-git7
+
+* Fri Nov 19 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc2.git5.1
+- Linux 2.6.37-rc2-git5
+
+* Thu Nov 18 2010 Kyle McMartin <kyle@redhat.com>
+- Move %{fedora_build} in the un-released (ie: -git/-rc) kernel case for
+ a variety of reasons, principally so that:
+ 1: Bumping %baserelease isn't needed if we're just updating snapshots.
+ 2: %buildid will sort as newer so we don't need to bump baserelease when
+ building bugzilla fixes.
+
+* Wed Nov 17 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.1.rc2.git2
+- Linux 2.6.37-rc2-git2
+- enable STRICT_DEVMEM on s390x.
+
+* Wed Nov 17 2010 Kyle McMartin <kyle@redhat.com>
+- Make vmlinuz/System.map root read-write only by default. You can just
+ chmod 644 them later if you (unlikely) need them without root.
+
+* Mon Nov 15 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.1.rc2.git0
+- Linux 2.6.37-rc2
+
+* Sat Nov 13 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.1.rc1.git10
+- Linux 2.6.37-rc1-git10
+- SECURITY_DMESG_RESTRICT added, the principle of least surprise dictates
+ we should probably have it off. If you want to restrict dmesg access
+ you may use the kernel.dmesg_restrict sysctl.
+- linux-2.6-bluetooth-autosuspend.patch: merged upstream.
+
+* Tue Nov 09 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.1.rc1.git7
+- Linux 2.6.37-rc1-git7
+
+* Mon Nov 08 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.1.rc1.git5
+- Linux 2.6.37-rc1-git5
+
+* Mon Nov 08 2010 Kyle McMartin <kyle@redhat.com>
+- Cherry-pick utrace-ptrace fixes from mayoung. Thanks!
+
+* Tue Nov 02 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.1.rc1.git0
+- Linux 2.6.37-rc1
+
+* Tue Oct 26 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.1.rc0.git8
+- Linux 2.6.36-git8
+
+* Fri Oct 22 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.1.rc0.git2
+- Switch to tracking git snapshots of what will become 2.6.37.
+- Fix context rejects in utrace and a few other patches.
+
+* Thu Oct 21 2010 Alexandre Oliva <lxoliva@fsfla.org> -libre
+* Deblobbed 2.6.36-libre.
+
+* Wed Oct 20 2010 Chuck Ebbert <cebbert@redhat.com> 2.6.36-1
+- Linux 2.6.36
+
+###
+# The following Emacs magic makes C-c C-e use UTC dates.
+# Local Variables:
+# rpm-change-log-uses-utc: t
+# End:
+###
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-32bit-mmap-exec-randomization.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-32bit-mmap-exec-randomization.patch
new file mode 100644
index 000000000..dd40b60df
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-32bit-mmap-exec-randomization.patch
@@ -0,0 +1,216 @@
+--- b/include/linux/sched.h
++++ b/include/linux/sched.h
+@@ -397,6 +397,10 @@
+ extern unsigned long
+ arch_get_unmapped_area(struct file *, unsigned long, unsigned long,
+ unsigned long, unsigned long);
++
++extern unsigned long
++arch_get_unmapped_exec_area(struct file *, unsigned long, unsigned long,
++ unsigned long, unsigned long);
+ extern unsigned long
+ arch_get_unmapped_area_topdown(struct file *filp, unsigned long addr,
+ unsigned long len, unsigned long pgoff,
+--- b/mm/mmap.c
++++ b/mm/mmap.c
+@@ -28,6 +28,7 @@
+ #include <linux/perf_event.h>
+ #include <linux/audit.h>
+ #include <linux/khugepaged.h>
++#include <linux/random.h>
+
+ #include <asm/uaccess.h>
+ #include <asm/cacheflush.h>
+@@ -1000,7 +1001,8 @@
+ /* Obtain the address to map to. we verify (or select) it and ensure
+ * that it represents a valid section of the address space.
+ */
+- addr = get_unmapped_area(file, addr, len, pgoff, flags);
++ addr = get_unmapped_area_prot(file, addr, len, pgoff, flags,
++ prot & PROT_EXEC);
+ if (addr & ~PAGE_MASK)
+ return addr;
+
+@@ -1552,8 +1554,8 @@
+ }
+
+ unsigned long
+-get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
+- unsigned long pgoff, unsigned long flags)
++get_unmapped_area_prot(struct file *file, unsigned long addr, unsigned long len,
++ unsigned long pgoff, unsigned long flags, int exec)
+ {
+ unsigned long (*get_area)(struct file *, unsigned long,
+ unsigned long, unsigned long, unsigned long);
+@@ -1566,7 +1568,11 @@
+ if (len > TASK_SIZE)
+ return -ENOMEM;
+
+- get_area = current->mm->get_unmapped_area;
++ if (exec && current->mm->get_unmapped_exec_area)
++ get_area = current->mm->get_unmapped_exec_area;
++ else
++ get_area = current->mm->get_unmapped_area;
++
+ if (file && file->f_op && file->f_op->get_unmapped_area)
+ get_area = file->f_op->get_unmapped_area;
+ addr = get_area(file, addr, len, pgoff, flags);
+@@ -1580,8 +1586,83 @@
+
+ return arch_rebalance_pgtables(addr, len);
+ }
++EXPORT_SYMBOL(get_unmapped_area_prot);
++
++static bool should_randomize(void)
++{
++ return (current->flags & PF_RANDOMIZE) &&
++ !(current->personality & ADDR_NO_RANDOMIZE);
++}
++
++#define SHLIB_BASE 0x00110000
++
++unsigned long
++arch_get_unmapped_exec_area(struct file *filp, unsigned long addr0,
++ unsigned long len0, unsigned long pgoff, unsigned long flags)
++{
++ unsigned long addr = addr0, len = len0;
++ struct mm_struct *mm = current->mm;
++ struct vm_area_struct *vma;
++ unsigned long tmp;
++
++ if (len > TASK_SIZE)
++ return -ENOMEM;
++
++ if (flags & MAP_FIXED)
++ return addr;
++
++ if (!addr)
++ addr = !should_randomize() ? SHLIB_BASE :
++ randomize_range(SHLIB_BASE, 0x01000000, len);
++
++ if (addr) {
++ addr = PAGE_ALIGN(addr);
++ vma = find_vma(mm, addr);
++ if (TASK_SIZE - len >= addr &&
++ (!vma || addr + len <= vma->vm_start))
++ return addr;
++ }
++
++ addr = SHLIB_BASE;
++ for (vma = find_vma(mm, addr); ; vma = vma->vm_next) {
++ /* At this point: (!vma || addr < vma->vm_end). */
++ if (TASK_SIZE - len < addr)
++ return -ENOMEM;
++
++ if (!vma || addr + len <= vma->vm_start) {
++ /*
++ * Must not let a PROT_EXEC mapping get into the
++ * brk area:
++ */
++ if (addr + len > mm->brk)
++ goto failed;
++
++ /*
++ * Up until the brk area we randomize addresses
++ * as much as possible:
++ */
++ if (addr >= 0x01000000 && should_randomize()) {
++ tmp = randomize_range(0x01000000,
++ PAGE_ALIGN(max(mm->start_brk,
++ (unsigned long)0x08000000)), len);
++ vma = find_vma(mm, tmp);
++ if (TASK_SIZE - len >= tmp &&
++ (!vma || tmp + len <= vma->vm_start))
++ return tmp;
++ }
++ /*
++ * Ok, randomization didnt work out - return
++ * the result of the linear search:
++ */
++ return addr;
++ }
++ addr = vma->vm_end;
++ }
++
++failed:
++ return current->mm->get_unmapped_area(filp, addr0, len0, pgoff, flags);
++}
+
+-EXPORT_SYMBOL(get_unmapped_area);
+
+ /* Look up the first VMA which satisfies addr < vm_end, NULL if none. */
+ struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)
+--- a/arch/x86/mm/mmap.c
++++ b/arch/x86/mm/mmap.c
+@@ -124,13 +124,16 @@ static unsigned long mmap_legacy_base(void)
+ */
+ void arch_pick_mmap_layout(struct mm_struct *mm)
+ {
+ if (mmap_is_legacy()) {
+ mm->mmap_base = mmap_legacy_base();
+ mm->get_unmapped_area = arch_get_unmapped_area;
+ mm->unmap_area = arch_unmap_area;
+ } else {
+ mm->mmap_base = mmap_base();
+ mm->get_unmapped_area = arch_get_unmapped_area_topdown;
++ if (!(current->personality & READ_IMPLIES_EXEC)
++ && mmap_is_ia32())
++ mm->get_unmapped_exec_area = arch_get_unmapped_exec_area;
+ mm->unmap_area = arch_unmap_area_topdown;
+ }
+ }
+--- a/arch/x86/vdso/vdso32-setup.c
++++ b/arch/x86/vdso/vdso32-setup.c
+@@ -331,7 +331,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
+ if (compat)
+ addr = VDSO_HIGH_BASE;
+ else {
+- addr = get_unmapped_area(NULL, 0, PAGE_SIZE, 0, 0);
++ addr = get_unmapped_area_prot(NULL, 0, PAGE_SIZE, 0, 0, 1);
+ if (IS_ERR_VALUE(addr)) {
+ ret = addr;
+ goto up_fail;
+--- a/include/linux/mm.h
++++ b/include/linux/mm.h
+@@ -1263,7 +1263,13 @@ extern int install_special_mapping(struct mm_struct *mm,
+ unsigned long addr, unsigned long len,
+ unsigned long flags, struct page **pages);
+
+-extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
++extern unsigned long get_unmapped_area_prot(struct file *, unsigned long, unsigned long, unsigned long, unsigned long, int);
++
++static inline unsigned long get_unmapped_area(struct file *file, unsigned long addr,
++ unsigned long len, unsigned long pgoff, unsigned long flags)
++{
++ return get_unmapped_area_prot(file, addr, len, pgoff, flags, 0);
++}
+
+ extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
+ unsigned long len, unsigned long prot,
+--- a/include/linux/mm_types.h
++++ b/include/linux/mm_types.h
+@@ -227,6 +227,9 @@ struct mm_struct {
+ unsigned long (*get_unmapped_area) (struct file *filp,
+ unsigned long addr, unsigned long len,
+ unsigned long pgoff, unsigned long flags);
++ unsigned long (*get_unmapped_exec_area) (struct file *filp,
++ unsigned long addr, unsigned long len,
++ unsigned long pgoff, unsigned long flags);
+ void (*unmap_area) (struct mm_struct *mm, unsigned long addr);
+ #endif
+ unsigned long mmap_base; /* base of mmap area */
+--- a/mm/mremap.c
++++ b/mm/mremap.c
+@@ -487,10 +487,10 @@ unsigned long do_mremap(unsigned long addr,
+ if (vma->vm_flags & VM_MAYSHARE)
+ map_flags |= MAP_SHARED;
+
+- new_addr = get_unmapped_area(vma->vm_file, 0, new_len,
++ new_addr = get_unmapped_area_prot(vma->vm_file, 0, new_len,
+ vma->vm_pgoff +
+ ((addr - vma->vm_start) >> PAGE_SHIFT),
+- map_flags);
++ map_flags, vma->vm_flags & VM_EXEC);
+ if (new_addr & ~PAGE_MASK) {
+ ret = new_addr;
+ goto out;
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-acpi-debug-infinite-loop.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-acpi-debug-infinite-loop.patch
new file mode 100644
index 000000000..45cb05165
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-acpi-debug-infinite-loop.patch
@@ -0,0 +1,24 @@
+--- linux-2.6.34.noarch/drivers/acpi/acpica/dsopcode.c~ 2010-07-01 14:40:44.000000000 -0400
++++ linux-2.6.34.noarch/drivers/acpi/acpica/dsopcode.c 2010-07-01 14:48:56.000000000 -0400
+@@ -1276,6 +1276,10 @@ acpi_ds_exec_end_control_op(struct acpi_
+ * loop does not implement a timeout.
+ */
+ control_state->control.loop_count++;
++ if ((control_state->control.loop_count > 1) && (control_state->control.loop_count % 0xffff == 0))
++ printk("ACPI: While loop taking a really long time. loop_count=0x%x\n",
++ control_state->control.loop_count);
++
+ if (control_state->control.loop_count >
+ ACPI_MAX_LOOP_ITERATIONS) {
+ status = AE_AML_INFINITE_LOOP;
+--- linux-2.6.34.noarch/drivers/acpi/acpica/acconfig.h~ 2010-07-01 14:49:03.000000000 -0400
++++ linux-2.6.34.noarch/drivers/acpi/acpica/acconfig.h 2010-07-01 14:49:17.000000000 -0400
+@@ -117,7 +117,7 @@
+
+ /* Maximum number of While() loop iterations before forced abort */
+
+-#define ACPI_MAX_LOOP_ITERATIONS 0xFFFF
++#define ACPI_MAX_LOOP_ITERATIONS 0xFFFFFF
+
+ /* Maximum sleep allowed via Sleep() operator */
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-acpi-video-dos.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-acpi-video-dos.patch
new file mode 100644
index 000000000..3e2085193
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-acpi-video-dos.patch
@@ -0,0 +1,17 @@
+Disable firmware video brightness change on AC/Battery switch by default
+
+-- mjg59
+
+diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
+index bac2901..93b1a9e 100644
+--- a/drivers/acpi/video.c
++++ b/drivers/acpi/video.c
+@@ -1818,7 +1818,7 @@ static int acpi_video_bus_put_devices(struct acpi_video_bus *video)
+
+ static int acpi_video_bus_start_devices(struct acpi_video_bus *video)
+ {
+- return acpi_video_bus_DOS(video, 0, 0);
++ return acpi_video_bus_DOS(video, 0, 1);
+ }
+
+ static int acpi_video_bus_stop_devices(struct acpi_video_bus *video)
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-compile-fixes.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-compile-fixes.patch
new file mode 100644
index 000000000..34c08ce47
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-compile-fixes.patch
@@ -0,0 +1,6 @@
+#
+# Small compile fixes (For more involved fixes, please use a separate patch).
+#
+# Please add the errors from gcc before the diffs to save others having
+# to do a compile to figure out what your diff is fixing. Thanks.
+#
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-crash-driver.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-crash-driver.patch
new file mode 100644
index 000000000..0f11aba0d
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-crash-driver.patch
@@ -0,0 +1,381 @@
+From df42d15cd28f468ecd4c30465b98a53cce90617c Mon Sep 17 00:00:00 2001
+From: Kyle McMartin <kyle@phobos.i.jkkm.org>
+Date: Tue, 30 Mar 2010 00:16:25 -0400
+Subject: dev-crash-driver.patch
+
+---
+ arch/ia64/include/asm/crash.h | 90 +++++++++++++++++++++++++++++
+ arch/ia64/kernel/ia64_ksyms.c | 3 +
+ arch/x86/include/asm/crash.h | 75 ++++++++++++++++++++++++
+ arch/x86/mm/ioremap.c | 2 +
+ drivers/char/Kconfig | 2 +
+ drivers/char/Makefile | 2 +
+ drivers/char/crash.c | 128 +++++++++++++++++++++++++++++++++++++++++
+ 7 files changed, 302 insertions(+), 0 deletions(-)
+ create mode 100644 arch/ia64/include/asm/crash.h
+ create mode 100644 arch/x86/include/asm/crash.h
+ create mode 100644 drivers/char/crash.c
+
+diff --git a/arch/ia64/include/asm/crash.h b/arch/ia64/include/asm/crash.h
+new file mode 100644
+index 0000000..541af84
+--- /dev/null
++++ b/arch/ia64/include/asm/crash.h
+@@ -0,0 +1,90 @@
++#ifndef _ASM_IA64_CRASH_H
++#define _ASM_IA64_CRASH_H
++
++/*
++ * linux/include/asm-ia64/crash.h
++ *
++ * Copyright (c) 2004 Red Hat, Inc. All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; 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, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++#ifdef __KERNEL__
++
++#include <linux/efi.h>
++#include <linux/mm.h>
++#include <asm/mmzone.h>
++
++static inline void *
++map_virtual(u64 offset, struct page **pp)
++{
++ struct page *page;
++ unsigned long pfn;
++ u32 type;
++
++ if (REGION_NUMBER(offset) == 5) {
++ char byte;
++
++ if (__get_user(byte, (char *)offset) == 0)
++ return (void *)offset;
++ else
++ return NULL;
++ }
++
++ switch (type = efi_mem_type(offset))
++ {
++ case EFI_LOADER_CODE:
++ case EFI_LOADER_DATA:
++ case EFI_BOOT_SERVICES_CODE:
++ case EFI_BOOT_SERVICES_DATA:
++ case EFI_CONVENTIONAL_MEMORY:
++ break;
++
++ default:
++ printk(KERN_INFO
++ "crash memory driver: invalid memory type for %lx: %d\n",
++ offset, type);
++ return NULL;
++ }
++
++ pfn = offset >> PAGE_SHIFT;
++
++ if (!pfn_valid(pfn)) {
++ printk(KERN_INFO
++ "crash memory driver: invalid pfn: %lx )\n", pfn);
++ return NULL;
++ }
++
++ page = pfn_to_page(pfn);
++
++ if (!page->virtual) {
++ printk(KERN_INFO
++ "crash memory driver: offset: %lx page: %lx page->virtual: NULL\n",
++ offset, (unsigned long)page);
++ return NULL;
++ }
++
++ return (page->virtual + (offset & (PAGE_SIZE-1)));
++}
++
++static inline void unmap_virtual(struct page *page)
++{
++ return;
++}
++
++#endif /* __KERNEL__ */
++
++#endif /* _ASM_IA64_CRASH_H */
+diff --git a/arch/ia64/kernel/ia64_ksyms.c b/arch/ia64/kernel/ia64_ksyms.c
+index 7f4a0ed..552fe24 100644
+--- a/arch/ia64/kernel/ia64_ksyms.c
++++ b/arch/ia64/kernel/ia64_ksyms.c
+@@ -84,6 +84,9 @@ EXPORT_SYMBOL(ia64_save_scratch_fpregs);
+ #include <asm/unwind.h>
+ EXPORT_SYMBOL(unw_init_running);
+
++#include <linux/efi.h>
++EXPORT_SYMBOL_GPL(efi_mem_type);
++
+ #if defined(CONFIG_IA64_ESI) || defined(CONFIG_IA64_ESI_MODULE)
+ extern void esi_call_phys (void);
+ EXPORT_SYMBOL_GPL(esi_call_phys);
+diff --git a/arch/x86/include/asm/crash.h b/arch/x86/include/asm/crash.h
+new file mode 100644
+index 0000000..dfcc006
+--- /dev/null
++++ b/arch/x86/include/asm/crash.h
+@@ -0,0 +1,75 @@
++#ifndef _ASM_I386_CRASH_H
++#define _ASM_I386_CRASH_H
++
++/*
++ * linux/include/asm-i386/crash.h
++ *
++ * Copyright (c) 2004 Red Hat, Inc. All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; 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, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++#ifdef __KERNEL__
++
++#include <linux/mm.h>
++#include <linux/highmem.h>
++#include <asm/mmzone.h>
++
++extern int page_is_ram(unsigned long);
++
++static inline void *
++map_virtual(u64 offset, struct page **pp)
++{
++ struct page *page;
++ unsigned long pfn;
++ void *vaddr;
++
++ pfn = (unsigned long)(offset >> PAGE_SHIFT);
++
++ if (!page_is_ram(pfn)) {
++ printk(KERN_INFO
++ "crash memory driver: !page_is_ram(pfn: %lx)\n", pfn);
++ return NULL;
++ }
++
++ if (!pfn_valid(pfn)) {
++ printk(KERN_INFO
++ "crash memory driver: invalid pfn: %lx )\n", pfn);
++ return NULL;
++ }
++
++ page = pfn_to_page(pfn);
++
++ vaddr = kmap(page);
++ if (!vaddr) {
++ printk(KERN_INFO
++ "crash memory driver: pfn: %lx kmap(page: %lx) failed\n",
++ pfn, (unsigned long)page);
++ return NULL;
++ }
++
++ *pp = page;
++ return (vaddr + (offset & (PAGE_SIZE-1)));
++}
++
++static inline void unmap_virtual(struct page *page)
++{
++ kunmap(page);
++}
++
++#endif /* __KERNEL__ */
++
++#endif /* _ASM_I386_CRASH_H */
+diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
+index 5eb1ba7..3e525d2 100644
+--- a/arch/x86/mm/ioremap.c
++++ b/arch/x86/mm/ioremap.c
+@@ -24,6 +24,8 @@
+
+ #include "physaddr.h"
+
++EXPORT_SYMBOL_GPL(page_is_ram);
++
+ /*
+ * Fix up the linear direct mapping of the kernel to avoid cache attribute
+ * conflicts.
+diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
+index 3141dd3..153658c 100644
+--- a/drivers/char/Kconfig
++++ b/drivers/char/Kconfig
+@@ -471,6 +471,8 @@ config LEGACY_PTYS
+ security. This option enables these legacy devices; on most
+ systems, it is safe to say N.
+
++config CRASH
++ tristate "Crash Utility memory driver"
+
+ config LEGACY_PTY_COUNT
+ int "Maximum number of legacy PTY in use"
+
+diff --git a/drivers/char/crash.c b/drivers/char/crash.c
+new file mode 100644
+index 0000000..e5437de
+--- /dev/null
++++ b/drivers/char/crash.c
+@@ -0,0 +1,128 @@
++/*
++ * linux/drivers/char/crash.c
++ *
++ * Copyright (C) 2004 Dave Anderson <anderson@redhat.com>
++ * Copyright (C) 2004 Red Hat, Inc.
++ */
++
++/******************************************************************************
++ *
++ * 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, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ *****************************************************************************/
++
++#include <linux/module.h>
++#include <linux/types.h>
++#include <linux/miscdevice.h>
++#include <linux/init.h>
++#include <asm/io.h>
++#include <asm/uaccess.h>
++#include <asm/types.h>
++#include <asm/crash.h>
++
++#define CRASH_VERSION "1.0"
++
++/*
++ * These are the file operation functions that allow crash utility
++ * access to physical memory.
++ */
++
++static loff_t
++crash_llseek(struct file * file, loff_t offset, int orig)
++{
++ switch (orig) {
++ case 0:
++ file->f_pos = offset;
++ return file->f_pos;
++ case 1:
++ file->f_pos += offset;
++ return file->f_pos;
++ default:
++ return -EINVAL;
++ }
++}
++
++/*
++ * Determine the page address for an address offset value,
++ * get a virtual address for it, and copy it out.
++ * Accesses must fit within a page.
++ */
++static ssize_t
++crash_read(struct file *file, char *buf, size_t count, loff_t *poff)
++{
++ void *vaddr;
++ struct page *page;
++ u64 offset;
++ ssize_t read;
++
++ offset = *poff;
++ if (offset >> PAGE_SHIFT != (offset+count-1) >> PAGE_SHIFT)
++ return -EINVAL;
++
++ vaddr = map_virtual(offset, &page);
++ if (!vaddr)
++ return -EFAULT;
++
++ if (copy_to_user(buf, vaddr, count)) {
++ unmap_virtual(page);
++ return -EFAULT;
++ }
++ unmap_virtual(page);
++
++ read = count;
++ *poff += read;
++ return read;
++}
++
++static struct file_operations crash_fops = {
++ .owner = THIS_MODULE,
++ .llseek = crash_llseek,
++ .read = crash_read,
++};
++
++static struct miscdevice crash_dev = {
++ MISC_DYNAMIC_MINOR,
++ "crash",
++ &crash_fops
++};
++
++static int __init
++crash_init(void)
++{
++ int ret;
++
++ ret = misc_register(&crash_dev);
++ if (ret) {
++ printk(KERN_ERR
++ "crash memory driver: cannot misc_register (MISC_DYNAMIC_MINOR)\n");
++ goto out;
++ }
++
++ ret = 0;
++ printk(KERN_INFO "crash memory driver: version %s\n", CRASH_VERSION);
++out:
++ return ret;
++}
++
++static void __exit
++crash_cleanup_module(void)
++{
++ misc_deregister(&crash_dev);
++}
++
++module_init(crash_init);
++module_exit(crash_cleanup_module);
++
++MODULE_LICENSE("GPL");
+
+diff --git a/drivers/char/Makefile b/drivers/char/Makefile
+index ba53ec9..6588b33 100644
+--- a/drivers/char/Makefile
++++ b/drivers/char/Makefile
+@@ -98,3 +98,5 @@ obj-$(CONFIG_RAMOOPS) += ramoops.o
+
+ obj-$(CONFIG_JS_RTC) += js-rtc.o
+ js-rtc-y = rtc.o
++
++obj-$(CONFIG_CRASH) += crash.o
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-debug-always-inline-kzalloc.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-debug-always-inline-kzalloc.patch
new file mode 100644
index 000000000..24f665ca6
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-debug-always-inline-kzalloc.patch
@@ -0,0 +1,25 @@
+From 76ec0e2e6d6edf81abc0331d5e7873ef7b2f6019 Mon Sep 17 00:00:00 2001
+From: Kyle McMartin <kyle@phobos.i.jkkm.org>
+Date: Wed, 8 Jul 2009 13:06:01 -0400
+Subject: [PATCH 6/6] fedora: linux-2.6-debug-always-inline-kzalloc.patch
+
+---
+ include/linux/slab.h | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/include/linux/slab.h b/include/linux/slab.h
+index 2da8372..d4ef74f 100644
+--- a/include/linux/slab.h
++++ b/include/linux/slab.h
+@@ -310,7 +310,7 @@ static inline void *kmem_cache_zalloc(struct kmem_cache *k, gfp_t flags)
+ * @size: how many bytes of memory are required.
+ * @flags: the type of memory to allocate (see kmalloc).
+ */
+-static inline void *kzalloc(size_t size, gfp_t flags)
++static __always_inline void *kzalloc(size_t size, gfp_t flags)
+ {
+ return kmalloc(size, flags | __GFP_ZERO);
+ }
+--
+1.6.2.5
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-debug-sizeof-structs.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-debug-sizeof-structs.patch
new file mode 100644
index 000000000..e027d98a1
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-debug-sizeof-structs.patch
@@ -0,0 +1,33 @@
+diff --git a/init/main.c b/init/main.c
+index 7449819..98cfaae 100644
+--- a/init/main.c
++++ b/init/main.c
+@@ -369,6 +369,11 @@ static void __init setup_nr_cpu_ids(void)
+ nr_cpu_ids = find_last_bit(cpumask_bits(cpu_possible_mask),NR_CPUS) + 1;
+ }
+
++#include <../fs/ext4/ext4.h>
++#include <linux/ext3_fs_i.h>
++#include <linux/skbuff.h>
++#include <linux/sched.h>
++
+ /* Called by boot processor to activate the rest. */
+ static void __init smp_init(void)
+ {
+@@ -391,6 +395,16 @@ static void __init smp_init(void)
+ /* Any cleanup work */
+ printk(KERN_INFO "Brought up %ld CPUs\n", (long)num_online_cpus());
+ smp_cpus_done(setup_max_cpus);
++
++ printk(KERN_DEBUG "sizeof(vma)=%u bytes\n", (unsigned int) sizeof(struct vm_area_struct));
++ printk(KERN_DEBUG "sizeof(page)=%u bytes\n", (unsigned int) sizeof(struct page));
++ printk(KERN_DEBUG "sizeof(inode)=%u bytes\n", (unsigned int) sizeof(struct inode));
++ printk(KERN_DEBUG "sizeof(dentry)=%u bytes\n", (unsigned int) sizeof(struct dentry));
++ printk(KERN_DEBUG "sizeof(ext3inode)=%u bytes\n", (unsigned int) sizeof(struct ext3_inode_info));
++ printk(KERN_DEBUG "sizeof(ext4inode)=%u bytes\n", (unsigned int) sizeof(struct ext4_inode_info));
++ printk(KERN_DEBUG "sizeof(buffer_head)=%u bytes\n", (unsigned int) sizeof(struct buffer_head));
++ printk(KERN_DEBUG "sizeof(skbuff)=%u bytes\n", (unsigned int) sizeof(struct sk_buff));
++ printk(KERN_DEBUG "sizeof(task_struct)=%u bytes\n", (unsigned int) sizeof(struct task_struct));
+ }
+
+ #endif
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-debug-taint-vm.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-debug-taint-vm.patch
new file mode 100644
index 000000000..ee367d45a
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-debug-taint-vm.patch
@@ -0,0 +1,65 @@
+From b04c57d9dc889462951312be2ac81ff6c702e954 Mon Sep 17 00:00:00 2001
+From: Kyle McMartin <kyle@phobos.i.jkkm.org>
+Date: Wed, 8 Jul 2009 13:05:09 -0400
+Subject: [PATCH 3/6] fedora: linux-2.6-debug-taint-vm.patch
+
+---
+ kernel/panic.c | 4 +++-
+ mm/slab.c | 8 ++++----
+ mm/slub.c | 2 +-
+ 4 files changed, 11 insertions(+), 8 deletions(-)
+
+diff --git a/kernel/panic.c b/kernel/panic.c
+index 984b3ec..6d1c3be 100644
+--- a/kernel/panic.c
++++ b/kernel/panic.c
+@@ -199,6 +199,7 @@ const char *print_tainted(void)
+
+ return buf;
+ }
++EXPORT_SYMBOL(print_tainted);
+
+ int test_taint(unsigned flag)
+ {
+diff --git a/mm/slab.c b/mm/slab.c
+index e74a16e..7bc287e 100644
+--- a/mm/slab.c
++++ b/mm/slab.c
+@@ -1803,8 +1803,8 @@ static void check_poison_obj(struct kmem_cache *cachep, void *objp)
+ /* Print header */
+ if (lines == 0) {
+ printk(KERN_ERR
+- "Slab corruption: %s start=%p, len=%d\n",
+- cachep->name, realobj, size);
++ "Slab corruption (%s): %s start=%p, len=%d\n",
++ print_tainted(), cachep->name, realobj, size);
+ print_objinfo(cachep, objp, 0);
+ }
+ /* Hexdump the affected line */
+@@ -2902,8 +2902,8 @@ static void check_slabp(struct kmem_cache *cachep, struct slab *slabp)
+ if (entries != cachep->num - slabp->inuse) {
+ bad:
+ printk(KERN_ERR "slab: Internal list corruption detected in "
+- "cache '%s'(%d), slabp %p(%d). Hexdump:\n",
+- cachep->name, cachep->num, slabp, slabp->inuse);
++ "cache '%s'(%d), slabp %p(%d). Tainted(%s). Hexdump:\n",
++ cachep->name, cachep->num, slabp, slabp->inuse, print_tainted());
+ for (i = 0;
+ i < sizeof(*slabp) + cachep->num * sizeof(kmem_bufctl_t);
+ i++) {
+diff --git a/mm/slub.c b/mm/slub.c
+index 819f056..8eff0f4 100644
+--- a/mm/slub.c
++++ b/mm/slub.c
+@@ -433,7 +433,7 @@ static void slab_bug(struct kmem_cache *s, char *fmt, ...)
+ va_end(args);
+ printk(KERN_ERR "========================================"
+ "=====================================\n");
+- printk(KERN_ERR "BUG %s: %s\n", s->name, buf);
++ printk(KERN_ERR "BUG %s (%s): %s\n", s->name, print_tainted(), buf);
+ printk(KERN_ERR "----------------------------------------"
+ "-------------------------------------\n\n");
+ }
+--
+1.6.2.5
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-debug-vm-would-have-oomkilled.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-debug-vm-would-have-oomkilled.patch
new file mode 100644
index 000000000..8bd05ab06
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-debug-vm-would-have-oomkilled.patch
@@ -0,0 +1,69 @@
+From beb764ac03e52eba1a654afb4273fab1f9de3cff Mon Sep 17 00:00:00 2001
+From: Kyle McMartin <kyle@mcmartin.ca>
+Date: Mon, 29 Nov 2010 20:59:14 -0500
+Subject: [PATCH] linux-2.6-debug-vm-would_have_oomkilled
+
+---
+ include/linux/oom.h | 1 +
+ kernel/sysctl.c | 7 +++++++
+ mm/oom_kill.c | 8 ++++++++
+ 3 files changed, 16 insertions(+), 0 deletions(-)
+
+diff --git a/include/linux/oom.h b/include/linux/oom.h
+index 5e3aa83..79a27b4 100644
+--- a/include/linux/oom.h
++++ b/include/linux/oom.h
+@@ -72,5 +72,6 @@ extern struct task_struct *find_lock_task_mm(struct task_struct *p);
+ extern int sysctl_oom_dump_tasks;
+ extern int sysctl_oom_kill_allocating_task;
+ extern int sysctl_panic_on_oom;
++extern int sysctl_would_have_oomkilled;
+ #endif /* __KERNEL__*/
+ #endif /* _INCLUDE_LINUX_OOM_H */
+diff --git a/kernel/sysctl.c b/kernel/sysctl.c
+index 5abfa15..a0fed6d 100644
+--- a/kernel/sysctl.c
++++ b/kernel/sysctl.c
+@@ -1000,6 +1000,13 @@ static struct ctl_table vm_table[] = {
+ .proc_handler = proc_dointvec,
+ },
+ {
++ .procname = "would_have_oomkilled",
++ .data = &sysctl_would_have_oomkilled,
++ .maxlen = sizeof(sysctl_would_have_oomkilled),
++ .mode = 0644,
++ .proc_handler = proc_dointvec,
++ },
++ {
+ .procname = "overcommit_ratio",
+ .data = &sysctl_overcommit_ratio,
+ .maxlen = sizeof(sysctl_overcommit_ratio),
+diff --git a/mm/oom_kill.c b/mm/oom_kill.c
+index 7dcca55..281ac39 100644
+--- a/mm/oom_kill.c
++++ b/mm/oom_kill.c
+@@ -35,6 +35,7 @@
+ int sysctl_panic_on_oom;
+ int sysctl_oom_kill_allocating_task;
+ int sysctl_oom_dump_tasks = 1;
++int sysctl_would_have_oomkilled;
+ static DEFINE_SPINLOCK(zone_scan_lock);
+
+ #ifdef CONFIG_NUMA
+@@ -477,6 +478,13 @@ static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order,
+ }
+
+ task_lock(p);
++ if (sysctl_would_have_oomkilled) {
++ printk(KERN_ERR "%s: would have killed process %d (%s), but continuing instead...\n",
++ __func__, task_pid_nr(p), p->comm);
++ task_unlock(p);
++ return 0;
++ }
++
+ pr_err("%s: Kill process %d (%s) score %d or sacrifice child\n",
+ message, task_pid_nr(p), p->comm, points);
+ task_unlock(p);
+--
+1.7.3.2
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-defaults-acpi-video.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-defaults-acpi-video.patch
new file mode 100644
index 000000000..af883b0d3
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-defaults-acpi-video.patch
@@ -0,0 +1,13 @@
+diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
+index d8d7596..a1b7117 100644
+--- a/drivers/acpi/video.c
++++ b/drivers/acpi/video.c
+@@ -71,7 +71,7 @@ MODULE_AUTHOR("Bruno Ducrot");
+ MODULE_DESCRIPTION("ACPI Video Driver");
+ MODULE_LICENSE("GPL");
+
+-static int brightness_switch_enabled = 1;
++static int brightness_switch_enabled = 0;
+ module_param(brightness_switch_enabled, bool, 0644);
+
+ static int acpi_video_bus_add(struct acpi_device *device);
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-defaults-aspm.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-defaults-aspm.patch
new file mode 100644
index 000000000..49b832d2c
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-defaults-aspm.patch
@@ -0,0 +1,12 @@
+diff -up linux-2.6.30.noarch/drivers/pci/pcie/aspm.c.mjg linux-2.6.30.noarch/drivers/pci/pcie/aspm.c
+--- linux-2.6.30.noarch/drivers/pci/pcie/aspm.c.mjg 2009-07-16 22:01:11.000000000 +0100
++++ linux-2.6.30.noarch/drivers/pci/pcie/aspm.c 2009-07-16 22:01:30.000000000 +0100
+@@ -65,7 +65,7 @@ static LIST_HEAD(link_list);
+ #define POLICY_DEFAULT 0 /* BIOS default setting */
+ #define POLICY_PERFORMANCE 1 /* high performance */
+ #define POLICY_POWERSAVE 2 /* high power saving */
+-static int aspm_policy;
++static int aspm_policy = POLICY_POWERSAVE;
+ static const char *policy_str[] = {
+ [POLICY_DEFAULT] = "default",
+ [POLICY_PERFORMANCE] = "performance",
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-defaults-pci_no_msi.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-defaults-pci_no_msi.patch
new file mode 100644
index 000000000..29a84e8d2
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-defaults-pci_no_msi.patch
@@ -0,0 +1,110 @@
+From 14bdd0d36f5284108468bb73afd50726b07c7a84 Mon Sep 17 00:00:00 2001
+From: Kyle McMartin <kyle@phobos.i.jkkm.org>
+Date: Mon, 29 Mar 2010 23:43:49 -0400
+Subject: linux-2.6-defaults-pci_no_msi
+
+---
+ Documentation/kernel-parameters.txt | 3 +++
+ drivers/pci/Kconfig | 12 ++++++++++++
+ drivers/pci/msi.c | 9 +++++++++
+ drivers/pci/pci.c | 2 ++
+ drivers/pci/pci.h | 2 ++
+ 5 files changed, 28 insertions(+), 0 deletions(-)
+
+diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
+index e4cbca5..8154a0f 100644
+--- a/Documentation/kernel-parameters.txt
++++ b/Documentation/kernel-parameters.txt
+@@ -1911,6 +1911,9 @@ and is between 256 and 4096 characters. It is defined in the file
+ check_enable_amd_mmconf [X86] check for and enable
+ properly configured MMIO access to PCI
+ config space on AMD family 10h CPU
++ msi [MSI] If the PCI_MSI kernel config parameter is
++ enabled, this kernel boot option can be used to
++ enable the use of MSI interrupts system-wide.
+ nomsi [MSI] If the PCI_MSI kernel config parameter is
+ enabled, this kernel boot option can be used to
+ disable the use of MSI interrupts system-wide.
+diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig
+index 7858a11..b12fcad 100644
+--- a/drivers/pci/Kconfig
++++ b/drivers/pci/Kconfig
+@@ -21,6 +21,18 @@ config PCI_MSI
+
+ If you don't know what to do here, say Y.
+
++config PCI_MSI_DEFAULT_ON
++ def_bool y
++ prompt "Use Message Signaled Interrupts by default"
++ depends on PCI_MSI
++ help
++ Selecting this option will enable use of PCI MSI where applicable
++ by default. Support for MSI can be disabled through the use of the
++ pci=nomsi boot flag. Conversely, if this option is not selected,
++ support for PCI MSI can be enabled by passing the pci=msi flag.
++
++ If you don't know what to do here, say N.
++
+ config PCI_DEBUG
+ bool "PCI Debugging"
+ depends on PCI && DEBUG_KERNEL
+diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
+index f9cf317..6b0539a 100644
+--- a/drivers/pci/msi.c
++++ b/drivers/pci/msi.c
+@@ -22,7 +22,11 @@
+ #include "pci.h"
+ #include "msi.h"
+
++#ifdef CONFIG_PCI_MSI_DEFAULT_ON
+ static int pci_msi_enable = 1;
++#else
++static int pci_msi_enable = 0;
++#endif /*CONFIG_PCI_MSI_DEFAULT_ON*/
+
+ /* Arch hooks */
+
+@@ -836,6 +840,11 @@ int pci_msi_enabled(void)
+ }
+ EXPORT_SYMBOL(pci_msi_enabled);
+
++void pci_yes_msi(void)
++{
++ pci_msi_enable = 1;
++}
++
+ void pci_msi_init_pci_dev(struct pci_dev *dev)
+ {
+ INIT_LIST_HEAD(&dev->msi_list);
+diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
+index 1531f3a..3cb332b 100644
+--- a/drivers/pci/pci.c
++++ b/drivers/pci/pci.c
+@@ -2983,6 +2983,8 @@ static int __init pci_setup(char *str)
+ if (*str && (str = pcibios_setup(str)) && *str) {
+ if (!strcmp(str, "nomsi")) {
+ pci_no_msi();
++ } else if (!strcmp(str, "msi")) {
++ pci_yes_msi();
+ } else if (!strcmp(str, "noaer")) {
+ pci_no_aer();
+ } else if (!strcmp(str, "nodomains")) {
+diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
+index 4eb10f4..caa051e 100644
+--- a/drivers/pci/pci.h
++++ b/drivers/pci/pci.h
+@@ -122,9 +122,11 @@ extern unsigned int pci_pm_d3_delay;
+
+ #ifdef CONFIG_PCI_MSI
+ void pci_no_msi(void);
++void pci_yes_msi(void);
+ extern void pci_msi_init_pci_dev(struct pci_dev *dev);
+ #else
+ static inline void pci_no_msi(void) { }
++static inline void pci_yes_msi(void) { }
+ static inline void pci_msi_init_pci_dev(struct pci_dev *dev) { }
+ #endif
+
+--
+1.7.0.1
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-defaults-pci_use_crs.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-defaults-pci_use_crs.patch
new file mode 100644
index 000000000..18acee12d
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-defaults-pci_use_crs.patch
@@ -0,0 +1,29 @@
+diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
+index cea0cd9..c326065 100644
+--- a/arch/x86/Kconfig
++++ b/arch/x86/Kconfig
+@@ -2142,3 +2142,8 @@ source "crypto/Kconfig"
+ source "arch/x86/kvm/Kconfig"
+
+ source "lib/Kconfig"
++
++config PCI_DEFAULT_USE_CRS
++ def_bool y
++ prompt "Use PCI Host Bridge Windows from ACPI by default?"
++ depends on ACPI
+diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
+index 15466c0..3099406 100644
+--- a/arch/x86/pci/acpi.c
++++ b/arch/x86/pci/acpi.c
+@@ -16,7 +16,11 @@ struct pci_root_info {
+ int busnum;
+ };
+
++#ifdef CONFIG_PCI_DEFAULT_USE_CRS
+ static bool pci_use_crs = true;
++#else
++static bool pci_use_crs = false;
++#endif
+
+ static int __init set_use_crs(const struct dmi_system_id *id)
+ {
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-e1000-ich9-montevina.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-e1000-ich9-montevina.patch
new file mode 100644
index 000000000..d45fd5673
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-e1000-ich9-montevina.patch
@@ -0,0 +1,30 @@
+This only showed up in one SDV (Montevina).
+The PCIE slots don't seem to like network cards, so this is the only hope
+to get networking working. It's never going upstream, but it's low impact
+enough to carry just to keep those SDVs working.
+
+--- linux-2.6.35.noarch/drivers/net/e1000e/ich8lan.c~ 2010-09-29 17:53:13.000000000 -0400
++++ linux-2.6.35.noarch/drivers/net/e1000e/ich8lan.c 2010-09-29 17:54:00.000000000 -0400
+@@ -424,6 +424,12 @@ static s32 e1000_init_phy_params_ich8lan
+
+ /* Verify phy id */
+ switch (phy->id) {
++ case 0:
++ if (hw->adapter->pdev->device == 0x10be)
++ e_dbg("got 0 phy id, trying anyway");
++ /* Fall through to IGP03E1000 case below */
++ else
++ return -E1000_ERR_PHY;
+ case IGP03E1000_E_PHY_ID:
+ phy->type = e1000_phy_igp_3;
+ phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT;
+--- linux-2.6.35.noarch/drivers/net/e1000e/netdev.c~ 2010-09-29 17:54:07.000000000 -0400
++++ linux-2.6.35.noarch/drivers/net/e1000e/netdev.c 2010-09-29 17:54:29.000000000 -0400
+@@ -5994,6 +5994,7 @@ static DEFINE_PCI_DEVICE_TABLE(e1000_pci
+ { PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M), board_ich9lan },
+ { PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M_AMT), board_ich9lan },
+ { PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M_V), board_ich9lan },
++ { PCI_VDEVICE(INTEL, 0x10be), board_ich9lan },
+
+ { PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_LM), board_ich9lan },
+ { PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_LF), board_ich9lan },
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-enable-more-pci-autosuspend.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-enable-more-pci-autosuspend.patch
new file mode 100644
index 000000000..666ded640
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-enable-more-pci-autosuspend.patch
@@ -0,0 +1,452 @@
+ drivers/acpi/acpica/aclocal.h | 7 +--
+ drivers/acpi/acpica/evgpe.c | 75 +++++++++++++++-----------------
+ drivers/acpi/acpica/evgpeinit.c | 11 +----
+ drivers/acpi/acpica/evgpeutil.c | 5 +-
+ drivers/acpi/acpica/evxface.c | 23 +++++-----
+ drivers/acpi/ec.c | 2 +-
+ drivers/acpi/pci_bind.c | 86 ++++++++++++++++++++++++++++++++++++++
+ drivers/acpi/sleep.c | 2 +-
+ drivers/char/ipmi/ipmi_si_intf.c | 2 +-
+ include/acpi/acpixf.h | 3 +-
+ 10 files changed, 143 insertions(+), 73 deletions(-)
+
+diff --git a/drivers/acpi/acpica/aclocal.h b/drivers/acpi/acpica/aclocal.h
+index 2ceb0c0..3663362 100644
+--- a/drivers/acpi/acpica/aclocal.h
++++ b/drivers/acpi/acpica/aclocal.h
+@@ -406,17 +406,16 @@ struct acpi_predefined_data {
+ *
+ ****************************************************************************/
+
+-/* Dispatch info for each GPE -- either a method or handler, cannot be both */
++/* Dispatch info for each GPE */
+
+ struct acpi_handler_info {
+ acpi_event_handler address; /* Address of handler, if any */
+ void *context; /* Context to be passed to handler */
+- struct acpi_namespace_node *method_node; /* Method node for this GPE level (saved) */
+ u8 orig_flags; /* Original misc info about this GPE */
+ u8 orig_enabled; /* Set if the GPE was originally enabled */
+ };
+
+-union acpi_gpe_dispatch_info {
++struct acpi_gpe_dispatch_info {
+ struct acpi_namespace_node *method_node; /* Method node for this GPE level */
+ struct acpi_handler_info *handler;
+ };
+@@ -426,7 +425,7 @@ union acpi_gpe_dispatch_info {
+ * NOTE: Important to keep this struct as small as possible.
+ */
+ struct acpi_gpe_event_info {
+- union acpi_gpe_dispatch_info dispatch; /* Either Method or Handler */
++ struct acpi_gpe_dispatch_info dispatch;
+ struct acpi_gpe_register_info *register_info; /* Backpointer to register info */
+ u8 flags; /* Misc info about this GPE */
+ u8 gpe_number; /* This GPE */
+diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c
+index f226eac..c4b1c4c 100644
+--- a/drivers/acpi/acpica/evgpe.c
++++ b/drivers/acpi/acpica/evgpe.c
+@@ -474,9 +474,7 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context)
+ * Must check for control method type dispatch one more time to avoid a
+ * race with ev_gpe_install_handler
+ */
+- if ((local_gpe_event_info.flags & ACPI_GPE_DISPATCH_MASK) ==
+- ACPI_GPE_DISPATCH_METHOD) {
+-
++ if (local_gpe_event_info.flags & ACPI_GPE_DISPATCH_METHOD) {
+ /* Allocate the evaluation information block */
+
+ info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
+@@ -575,41 +573,15 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
+ }
+
+ /*
+- * Dispatch the GPE to either an installed handler, or the control method
+- * associated with this GPE (_Lxx or _Exx). If a handler exists, we invoke
+- * it and do not attempt to run the method. If there is neither a handler
+- * nor a method, we disable this GPE to prevent further such pointless
+- * events from firing.
++ * Dispatch the GPE to either any installed handler or control
++ * method associated with this GPE (_Lxx or _Exx). We invoke
++ * the method first in case it has side effects that would be
++ * interfered with if the handler has already altered hardware
++ * state. If there is neither a handler nor a method, we
++ * disable this GPE to prevent further such pointless events
++ * from firing.
+ */
+- switch (gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) {
+- case ACPI_GPE_DISPATCH_HANDLER:
+-
+- /*
+- * Invoke the installed handler (at interrupt level)
+- * Ignore return status for now.
+- * TBD: leave GPE disabled on error?
+- */
+- (void)gpe_event_info->dispatch.handler->address(gpe_event_info->
+- dispatch.
+- handler->
+- context);
+-
+- /* It is now safe to clear level-triggered events. */
+-
+- if ((gpe_event_info->flags & ACPI_GPE_XRUPT_TYPE_MASK) ==
+- ACPI_GPE_LEVEL_TRIGGERED) {
+- status = acpi_hw_clear_gpe(gpe_event_info);
+- if (ACPI_FAILURE(status)) {
+- ACPI_EXCEPTION((AE_INFO, status,
+- "Unable to clear GPE[0x%2X]",
+- gpe_number));
+- return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
+- }
+- }
+- break;
+-
+- case ACPI_GPE_DISPATCH_METHOD:
+-
++ if (gpe_event_info->flags & ACPI_GPE_DISPATCH_METHOD) {
+ /*
+ * Disable the GPE, so it doesn't keep firing before the method has a
+ * chance to run (it runs asynchronously with interrupts enabled).
+@@ -634,10 +606,34 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
+ "Unable to queue handler for GPE[0x%2X] - event disabled",
+ gpe_number));
+ }
+- break;
++ }
+
+- default:
++ if (gpe_event_info->flags & ACPI_GPE_DISPATCH_HANDLER) {
++ /*
++ * Invoke the installed handler (at interrupt level)
++ * Ignore return status for now.
++ * TBD: leave GPE disabled on error?
++ */
++ (void)gpe_event_info->dispatch.handler->address(gpe_event_info->
++ dispatch.
++ handler->
++ context);
+
++ /* It is now safe to clear level-triggered events. */
++
++ if ((gpe_event_info->flags & ACPI_GPE_XRUPT_TYPE_MASK) ==
++ ACPI_GPE_LEVEL_TRIGGERED) {
++ status = acpi_hw_clear_gpe(gpe_event_info);
++ if (ACPI_FAILURE(status)) {
++ ACPI_EXCEPTION((AE_INFO, status,
++ "Unable to clear GPE[0x%2X]",
++ gpe_number));
++ return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
++ }
++ }
++ }
++
++ if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK)) {
+ /*
+ * No handler or method to run!
+ * 03/2010: This case should no longer be possible. We will not allow
+@@ -658,7 +654,6 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
+ gpe_number));
+ return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
+ }
+- break;
+ }
+
+ return_UINT32(ACPI_INTERRUPT_HANDLED);
+diff --git a/drivers/acpi/acpica/evgpeinit.c b/drivers/acpi/acpica/evgpeinit.c
+index 2c7def9..9915b52 100644
+--- a/drivers/acpi/acpica/evgpeinit.c
++++ b/drivers/acpi/acpica/evgpeinit.c
+@@ -386,16 +386,7 @@ acpi_ev_match_gpe_method(acpi_handle obj_handle,
+ return_ACPI_STATUS(AE_OK);
+ }
+
+- if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) ==
+- ACPI_GPE_DISPATCH_HANDLER) {
+-
+- /* If there is already a handler, ignore this GPE method */
+-
+- return_ACPI_STATUS(AE_OK);
+- }
+-
+- if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) ==
+- ACPI_GPE_DISPATCH_METHOD) {
++ if (gpe_event_info->flags & ACPI_GPE_DISPATCH_METHOD) {
+ /*
+ * If there is already a method, ignore this method. But check
+ * for a type mismatch (if both the _Lxx AND _Exx exist)
+diff --git a/drivers/acpi/acpica/evgpeutil.c b/drivers/acpi/acpica/evgpeutil.c
+index 19a0e51..434ad1b 100644
+--- a/drivers/acpi/acpica/evgpeutil.c
++++ b/drivers/acpi/acpica/evgpeutil.c
+@@ -323,12 +323,11 @@ acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
+ ACPI_GPE_REGISTER_WIDTH)
+ + j];
+
+- if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) ==
+- ACPI_GPE_DISPATCH_HANDLER) {
++ if (gpe_event_info->flags & ACPI_GPE_DISPATCH_HANDLER) {
+ ACPI_FREE(gpe_event_info->dispatch.handler);
+ gpe_event_info->dispatch.handler = NULL;
+ gpe_event_info->flags &=
+- ~ACPI_GPE_DISPATCH_MASK;
++ ~ACPI_GPE_DISPATCH_HANDLER;
+ }
+ }
+ }
+diff --git a/drivers/acpi/acpica/evxface.c b/drivers/acpi/acpica/evxface.c
+index 36af222..b097136 100644
+--- a/drivers/acpi/acpica/evxface.c
++++ b/drivers/acpi/acpica/evxface.c
+@@ -662,6 +662,8 @@ ACPI_EXPORT_SYMBOL(acpi_remove_notify_handler)
+ * edge- or level-triggered interrupt.
+ * Address - Address of the handler
+ * Context - Value passed to the handler on each GPE
++ * keep_method - Whether the existing method should be
++ * displaced or kept
+ *
+ * RETURN: Status
+ *
+@@ -671,7 +673,8 @@ ACPI_EXPORT_SYMBOL(acpi_remove_notify_handler)
+ acpi_status
+ acpi_install_gpe_handler(acpi_handle gpe_device,
+ u32 gpe_number,
+- u32 type, acpi_event_handler address, void *context)
++ u32 type, acpi_event_handler address, void *context,
++ bool keep_method)
+ {
+ struct acpi_gpe_event_info *gpe_event_info;
+ struct acpi_handler_info *handler;
+@@ -711,8 +714,7 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
+
+ /* Make sure that there isn't a handler there already */
+
+- if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) ==
+- ACPI_GPE_DISPATCH_HANDLER) {
++ if (gpe_event_info->flags & ACPI_GPE_DISPATCH_HANDLER) {
+ status = AE_ALREADY_EXISTS;
+ goto free_and_exit;
+ }
+@@ -721,7 +723,6 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
+
+ handler->address = address;
+ handler->context = context;
+- handler->method_node = gpe_event_info->dispatch.method_node;
+ handler->orig_flags = gpe_event_info->flags &
+ (ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK);
+
+@@ -732,7 +733,7 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
+ */
+
+ if ((handler->orig_flags & ACPI_GPE_DISPATCH_METHOD)
+- && gpe_event_info->runtime_count) {
++ && gpe_event_info->runtime_count && !keep_method) {
+ handler->orig_enabled = 1;
+ (void)acpi_raw_disable_gpe(gpe_event_info);
+ }
+@@ -741,10 +742,10 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
+
+ gpe_event_info->dispatch.handler = handler;
+
+- /* Setup up dispatch flags to indicate handler (vs. method) */
++ if (!keep_method)
++ gpe_event_info->flags &=
++ ~(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK);
+
+- gpe_event_info->flags &=
+- ~(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK);
+ gpe_event_info->flags |= (u8) (type | ACPI_GPE_DISPATCH_HANDLER);
+
+ acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+@@ -813,8 +814,7 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
+
+ /* Make sure that a handler is indeed installed */
+
+- if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) !=
+- ACPI_GPE_DISPATCH_HANDLER) {
++ if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_HANDLER)) {
+ status = AE_NOT_EXIST;
+ goto unlock_and_exit;
+ }
+@@ -830,9 +830,8 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
+
+ handler = gpe_event_info->dispatch.handler;
+
+- /* Restore Method node (if any), set dispatch flags */
++ /* Set dispatch flags */
+
+- gpe_event_info->dispatch.method_node = handler->method_node;
+ gpe_event_info->flags &=
+ ~(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK);
+ gpe_event_info->flags |= handler->orig_flags;
+diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
+index 372ff80..9a39f82 100644
+--- a/drivers/acpi/ec.c
++++ b/drivers/acpi/ec.c
+@@ -740,7 +740,7 @@ static int ec_install_handlers(struct acpi_ec *ec)
+ return 0;
+ status = acpi_install_gpe_handler(NULL, ec->gpe,
+ ACPI_GPE_EDGE_TRIGGERED,
+- &acpi_ec_gpe_handler, ec);
++ &acpi_ec_gpe_handler, ec, false);
+ if (ACPI_FAILURE(status))
+ return -ENODEV;
+
+diff --git a/drivers/acpi/pci_bind.c b/drivers/acpi/pci_bind.c
+index 2ef0409..8b3cc6a 100644
+--- a/drivers/acpi/pci_bind.c
++++ b/drivers/acpi/pci_bind.c
+@@ -28,6 +28,7 @@
+ #include <linux/pci.h>
+ #include <linux/pci-acpi.h>
+ #include <linux/acpi.h>
++#include <linux/list.h>
+ #include <linux/pm_runtime.h>
+ #include <acpi/acpi_bus.h>
+ #include <acpi/acpi_drivers.h>
+@@ -35,6 +36,43 @@
+ #define _COMPONENT ACPI_PCI_COMPONENT
+ ACPI_MODULE_NAME("pci_bind");
+
++static LIST_HEAD(acpi_pci_gpe_devs);
++
++struct pci_gpe_dev {
++ struct list_head node;
++ struct pci_dev *dev;
++ acpi_handle gpe_device;
++ int gpe_number;
++ struct work_struct work;
++};
++
++static void acpi_pci_wake_handler_work(struct work_struct *work)
++{
++ struct pci_gpe_dev *gpe_dev = container_of(work, struct pci_gpe_dev,
++ work);
++
++ pci_check_pme_status(gpe_dev->dev);
++ pm_runtime_resume(&gpe_dev->dev->dev);
++ pci_wakeup_event(gpe_dev->dev);
++ if (gpe_dev->dev->subordinate)
++ pci_pme_wakeup_bus(gpe_dev->dev->subordinate);
++}
++
++static u32 acpi_pci_wake_handler(void *data)
++{
++ long gpe_number = (long) data;
++ struct pci_gpe_dev *gpe_dev;
++
++ list_for_each_entry(gpe_dev, &acpi_pci_gpe_devs, node) {
++ if (gpe_number != gpe_dev->gpe_number)
++ continue;
++
++ schedule_work(&gpe_dev->work);
++ }
++
++ return ACPI_INTERRUPT_HANDLED;
++}
++
+ static int acpi_pci_unbind(struct acpi_device *device)
+ {
+ struct pci_dev *dev;
+@@ -43,6 +81,30 @@ static int acpi_pci_unbind(struct acpi_device *device)
+ if (!dev)
+ goto out;
+
++ if (device->wakeup.flags.valid) {
++ struct pci_gpe_dev *gpe_dev;
++ struct pci_gpe_dev *tmp;
++ int gpe_count = 0;
++ int gpe_number = device->wakeup.gpe_number;
++ acpi_handle gpe_device = device->wakeup.gpe_device;
++
++ list_for_each_entry_safe(gpe_dev, tmp, &acpi_pci_gpe_devs, node) {
++ if (gpe_dev->dev == dev) {
++ flush_work(&gpe_dev->work);
++ list_del(&gpe_dev->node);
++ kfree(gpe_dev);
++ } else if (gpe_dev->gpe_number == gpe_number &&
++ gpe_dev->gpe_device == gpe_device) {
++ gpe_count++;
++ }
++ }
++
++ if (gpe_count == 0) {
++ acpi_remove_gpe_handler(gpe_device, gpe_number,
++ &acpi_pci_wake_handler);
++ }
++ }
++
+ device_set_run_wake(&dev->dev, false);
+ pci_acpi_remove_pm_notifier(device);
+
+@@ -71,6 +133,30 @@ static int acpi_pci_bind(struct acpi_device *device)
+ return 0;
+
+ pci_acpi_add_pm_notifier(device, dev);
++ if (device->wakeup.flags.valid) {
++ struct pci_gpe_dev *gpe_dev;
++ acpi_handle gpe_device = device->wakeup.gpe_device;
++ long gpe_number = device->wakeup.gpe_number;
++
++ gpe_dev = kmalloc(sizeof(struct pci_gpe_dev), GFP_KERNEL);
++ if (gpe_dev) {
++ gpe_dev->dev = dev;
++ gpe_dev->gpe_device = gpe_device;
++ gpe_dev->gpe_number = gpe_number;
++ INIT_WORK(&gpe_dev->work, acpi_pci_wake_handler_work);
++
++ acpi_install_gpe_handler(gpe_device, gpe_number,
++ ACPI_GPE_LEVEL_TRIGGERED,
++ &acpi_pci_wake_handler,
++ (void *)gpe_number,
++ true);
++ acpi_gpe_can_wake(device->wakeup.gpe_device,
++ device->wakeup.gpe_number);
++ device->wakeup.flags.run_wake = 1;
++ list_add_tail(&gpe_dev->node, &acpi_pci_gpe_devs);
++ }
++ }
++
+ if (device->wakeup.flags.run_wake)
+ device_set_run_wake(&dev->dev, true);
+
+diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
+index 721d93b..b0ddef6 100644
+--- a/drivers/acpi/sleep.c
++++ b/drivers/acpi/sleep.c
+@@ -643,7 +643,7 @@ int acpi_pm_device_sleep_state(struct device *dev, int *d_min_p)
+ if (acpi_target_sleep_state != ACPI_STATE_S0 ||
+ status != AE_NOT_FOUND)
+ d_max = d_min;
+- } else if (d_max < d_min) {
++ } else if (ACPI_SUCCESS(status) && d_max < d_min) {
+ /* Warn the user of the broken DSDT */
+ printk(KERN_WARNING "ACPI: Wrong value from %s\n",
+ acpi_method);
+diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c
+index 035da9e..62a48b2 100644
+--- a/drivers/char/ipmi/ipmi_si_intf.c
++++ b/drivers/char/ipmi/ipmi_si_intf.c
+@@ -1970,7 +1970,7 @@ static int acpi_gpe_irq_setup(struct smi_info *info)
+ info->irq,
+ ACPI_GPE_LEVEL_TRIGGERED,
+ &ipmi_acpi_gpe,
+- info);
++ info, false);
+ if (status != AE_OK) {
+ dev_warn(info->dev, "%s unable to claim ACPI GPE %d,"
+ " running polled\n", DEVICE_NAME, info->irq);
+diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h
+index 53b7cfd..740eb7e 100644
+--- a/include/acpi/acpixf.h
++++ b/include/acpi/acpixf.h
+@@ -258,7 +258,8 @@ acpi_remove_address_space_handler(acpi_handle device,
+ acpi_status
+ acpi_install_gpe_handler(acpi_handle gpe_device,
+ u32 gpe_number,
+- u32 type, acpi_event_handler address, void *context);
++ u32 type, acpi_event_handler address, void *context,
++ bool keep_method);
+
+ acpi_status
+ acpi_remove_gpe_handler(acpi_handle gpe_device,
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-firewire-git-pending.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-firewire-git-pending.patch
new file mode 100644
index 000000000..e05471f1b
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-firewire-git-pending.patch
@@ -0,0 +1,4 @@
+#
+# Patches under review and/or pending inclusion in the linux1394-git
+# tree (and/or in by the time your read this), which we want...
+#
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-firewire-git-update.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-firewire-git-update.patch
new file mode 100644
index 000000000..685808133
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-firewire-git-update.patch
@@ -0,0 +1,3682 @@
+linux1394-2.6.git tree vs. linus v2.6.29-rc3-git1 on 20090130 by jarod
+
+---
+ firewire-git/drivers/firewire/fw-card.c | 68 -
+ firewire-git/drivers/firewire/fw-cdev.c | 1014 +++++++++++++++++--------
+ firewire-git/drivers/firewire/fw-device.c | 43 -
+ firewire-git/drivers/firewire/fw-device.h | 7
+ firewire-git/drivers/firewire/fw-iso.c | 225 ++++-
+ firewire-git/drivers/firewire/fw-ohci.c | 236 ++---
+ firewire-git/drivers/firewire/fw-sbp2.c | 57 -
+ firewire-git/drivers/firewire/fw-topology.c | 28
+ firewire-git/drivers/firewire/fw-topology.h | 19
+ firewire-git/drivers/firewire/fw-transaction.c | 151 +--
+ firewire-git/drivers/firewire/fw-transaction.h | 125 ---
+ include/linux/firewire-cdev.h | 170 +++-
+ 12 files changed, 1359 insertions(+), 784 deletions(-)
+
+diff -Naurp linux-2.6-git/drivers/firewire/fw-card.c firewire-git/drivers/firewire/fw-card.c
+--- linux-2.6-git/drivers/firewire/fw-card.c 2009-01-30 13:39:02.989651512 -0500
++++ firewire-git/drivers/firewire/fw-card.c 2009-01-30 13:35:51.859771884 -0500
+@@ -63,8 +63,7 @@ static int descriptor_count;
+ #define BIB_CMC ((1) << 30)
+ #define BIB_IMC ((1) << 31)
+
+-static u32 *
+-generate_config_rom(struct fw_card *card, size_t *config_rom_length)
++static u32 *generate_config_rom(struct fw_card *card, size_t *config_rom_length)
+ {
+ struct fw_descriptor *desc;
+ static u32 config_rom[256];
+@@ -128,8 +127,7 @@ generate_config_rom(struct fw_card *card
+ return config_rom;
+ }
+
+-static void
+-update_config_roms(void)
++static void update_config_roms(void)
+ {
+ struct fw_card *card;
+ u32 *config_rom;
+@@ -141,8 +139,7 @@ update_config_roms(void)
+ }
+ }
+
+-int
+-fw_core_add_descriptor(struct fw_descriptor *desc)
++int fw_core_add_descriptor(struct fw_descriptor *desc)
+ {
+ size_t i;
+
+@@ -171,8 +168,7 @@ fw_core_add_descriptor(struct fw_descrip
+ return 0;
+ }
+
+-void
+-fw_core_remove_descriptor(struct fw_descriptor *desc)
++void fw_core_remove_descriptor(struct fw_descriptor *desc)
+ {
+ mutex_lock(&card_mutex);
+
+@@ -189,8 +185,7 @@ static const char gap_count_table[] = {
+ 63, 5, 7, 8, 10, 13, 16, 18, 21, 24, 26, 29, 32, 35, 37, 40
+ };
+
+-void
+-fw_schedule_bm_work(struct fw_card *card, unsigned long delay)
++void fw_schedule_bm_work(struct fw_card *card, unsigned long delay)
+ {
+ int scheduled;
+
+@@ -200,8 +195,7 @@ fw_schedule_bm_work(struct fw_card *card
+ fw_card_put(card);
+ }
+
+-static void
+-fw_card_bm_work(struct work_struct *work)
++static void fw_card_bm_work(struct work_struct *work)
+ {
+ struct fw_card *card = container_of(work, struct fw_card, work.work);
+ struct fw_device *root_device;
+@@ -371,17 +365,16 @@ fw_card_bm_work(struct work_struct *work
+ fw_card_put(card);
+ }
+
+-static void
+-flush_timer_callback(unsigned long data)
++static void flush_timer_callback(unsigned long data)
+ {
+ struct fw_card *card = (struct fw_card *)data;
+
+ fw_flush_transactions(card);
+ }
+
+-void
+-fw_card_initialize(struct fw_card *card, const struct fw_card_driver *driver,
+- struct device *device)
++void fw_card_initialize(struct fw_card *card,
++ const struct fw_card_driver *driver,
++ struct device *device)
+ {
+ static atomic_t index = ATOMIC_INIT(-1);
+
+@@ -406,9 +399,8 @@ fw_card_initialize(struct fw_card *card,
+ }
+ EXPORT_SYMBOL(fw_card_initialize);
+
+-int
+-fw_card_add(struct fw_card *card,
+- u32 max_receive, u32 link_speed, u64 guid)
++int fw_card_add(struct fw_card *card,
++ u32 max_receive, u32 link_speed, u64 guid)
+ {
+ u32 *config_rom;
+ size_t length;
+@@ -435,23 +427,20 @@ EXPORT_SYMBOL(fw_card_add);
+ * dummy driver just fails all IO.
+ */
+
+-static int
+-dummy_enable(struct fw_card *card, u32 *config_rom, size_t length)
++static int dummy_enable(struct fw_card *card, u32 *config_rom, size_t length)
+ {
+ BUG();
+ return -1;
+ }
+
+-static int
+-dummy_update_phy_reg(struct fw_card *card, int address,
+- int clear_bits, int set_bits)
++static int dummy_update_phy_reg(struct fw_card *card, int address,
++ int clear_bits, int set_bits)
+ {
+ return -ENODEV;
+ }
+
+-static int
+-dummy_set_config_rom(struct fw_card *card,
+- u32 *config_rom, size_t length)
++static int dummy_set_config_rom(struct fw_card *card,
++ u32 *config_rom, size_t length)
+ {
+ /*
+ * We take the card out of card_list before setting the dummy
+@@ -461,27 +450,23 @@ dummy_set_config_rom(struct fw_card *car
+ return -1;
+ }
+
+-static void
+-dummy_send_request(struct fw_card *card, struct fw_packet *packet)
++static void dummy_send_request(struct fw_card *card, struct fw_packet *packet)
+ {
+ packet->callback(packet, card, -ENODEV);
+ }
+
+-static void
+-dummy_send_response(struct fw_card *card, struct fw_packet *packet)
++static void dummy_send_response(struct fw_card *card, struct fw_packet *packet)
+ {
+ packet->callback(packet, card, -ENODEV);
+ }
+
+-static int
+-dummy_cancel_packet(struct fw_card *card, struct fw_packet *packet)
++static int dummy_cancel_packet(struct fw_card *card, struct fw_packet *packet)
+ {
+ return -ENOENT;
+ }
+
+-static int
+-dummy_enable_phys_dma(struct fw_card *card,
+- int node_id, int generation)
++static int dummy_enable_phys_dma(struct fw_card *card,
++ int node_id, int generation)
+ {
+ return -ENODEV;
+ }
+@@ -496,16 +481,14 @@ static struct fw_card_driver dummy_drive
+ .enable_phys_dma = dummy_enable_phys_dma,
+ };
+
+-void
+-fw_card_release(struct kref *kref)
++void fw_card_release(struct kref *kref)
+ {
+ struct fw_card *card = container_of(kref, struct fw_card, kref);
+
+ complete(&card->done);
+ }
+
+-void
+-fw_core_remove_card(struct fw_card *card)
++void fw_core_remove_card(struct fw_card *card)
+ {
+ card->driver->update_phy_reg(card, 4,
+ PHY_LINK_ACTIVE | PHY_CONTENDER, 0);
+@@ -529,8 +512,7 @@ fw_core_remove_card(struct fw_card *card
+ }
+ EXPORT_SYMBOL(fw_core_remove_card);
+
+-int
+-fw_core_initiate_bus_reset(struct fw_card *card, int short_reset)
++int fw_core_initiate_bus_reset(struct fw_card *card, int short_reset)
+ {
+ int reg = short_reset ? 5 : 1;
+ int bit = short_reset ? PHY_BUS_SHORT_RESET : PHY_BUS_RESET;
+diff -Naurp linux-2.6-git/drivers/firewire/fw-cdev.c firewire-git/drivers/firewire/fw-cdev.c
+--- linux-2.6-git/drivers/firewire/fw-cdev.c 2008-11-04 11:19:19.000000000 -0500
++++ firewire-git/drivers/firewire/fw-cdev.c 2009-01-30 13:35:51.860646788 -0500
+@@ -18,87 +18,162 @@
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+-#include <linux/module.h>
+-#include <linux/kernel.h>
+-#include <linux/wait.h>
+-#include <linux/errno.h>
++#include <linux/compat.h>
++#include <linux/delay.h>
+ #include <linux/device.h>
+-#include <linux/vmalloc.h>
++#include <linux/errno.h>
++#include <linux/firewire-cdev.h>
++#include <linux/idr.h>
++#include <linux/jiffies.h>
++#include <linux/kernel.h>
++#include <linux/kref.h>
++#include <linux/mm.h>
++#include <linux/module.h>
++#include <linux/mutex.h>
+ #include <linux/poll.h>
+ #include <linux/preempt.h>
++#include <linux/spinlock.h>
+ #include <linux/time.h>
+-#include <linux/delay.h>
+-#include <linux/mm.h>
+-#include <linux/idr.h>
+-#include <linux/compat.h>
+-#include <linux/firewire-cdev.h>
++#include <linux/vmalloc.h>
++#include <linux/wait.h>
++#include <linux/workqueue.h>
++
+ #include <asm/system.h>
+ #include <asm/uaccess.h>
+-#include "fw-transaction.h"
+-#include "fw-topology.h"
++
+ #include "fw-device.h"
++#include "fw-topology.h"
++#include "fw-transaction.h"
++
++struct client {
++ u32 version;
++ struct fw_device *device;
++
++ spinlock_t lock;
++ bool in_shutdown;
++ struct idr resource_idr;
++ struct list_head event_list;
++ wait_queue_head_t wait;
++ u64 bus_reset_closure;
++
++ struct fw_iso_context *iso_context;
++ u64 iso_closure;
++ struct fw_iso_buffer buffer;
++ unsigned long vm_start;
+
+-struct client;
+-struct client_resource {
+ struct list_head link;
+- void (*release)(struct client *client, struct client_resource *r);
+- u32 handle;
++ struct kref kref;
++};
++
++static inline void client_get(struct client *client)
++{
++ kref_get(&client->kref);
++}
++
++static void client_release(struct kref *kref)
++{
++ struct client *client = container_of(kref, struct client, kref);
++
++ fw_device_put(client->device);
++ kfree(client);
++}
++
++static void client_put(struct client *client)
++{
++ kref_put(&client->kref, client_release);
++}
++
++struct client_resource;
++typedef void (*client_resource_release_fn_t)(struct client *,
++ struct client_resource *);
++struct client_resource {
++ client_resource_release_fn_t release;
++ int handle;
++};
++
++struct address_handler_resource {
++ struct client_resource resource;
++ struct fw_address_handler handler;
++ __u64 closure;
++ struct client *client;
++};
++
++struct outbound_transaction_resource {
++ struct client_resource resource;
++ struct fw_transaction transaction;
++};
++
++struct inbound_transaction_resource {
++ struct client_resource resource;
++ struct fw_request *request;
++ void *data;
++ size_t length;
+ };
+
++struct descriptor_resource {
++ struct client_resource resource;
++ struct fw_descriptor descriptor;
++ u32 data[0];
++};
++
++struct iso_resource {
++ struct client_resource resource;
++ struct client *client;
++ /* Schedule work and access todo only with client->lock held. */
++ struct delayed_work work;
++ enum {ISO_RES_ALLOC, ISO_RES_REALLOC, ISO_RES_DEALLOC,
++ ISO_RES_ALLOC_ONCE, ISO_RES_DEALLOC_ONCE,} todo;
++ int generation;
++ u64 channels;
++ s32 bandwidth;
++ struct iso_resource_event *e_alloc, *e_dealloc;
++};
++
++static void schedule_iso_resource(struct iso_resource *);
++static void release_iso_resource(struct client *, struct client_resource *);
++
+ /*
+ * dequeue_event() just kfree()'s the event, so the event has to be
+- * the first field in the struct.
++ * the first field in a struct XYZ_event.
+ */
+-
+ struct event {
+ struct { void *data; size_t size; } v[2];
+ struct list_head link;
+ };
+
+-struct bus_reset {
++struct bus_reset_event {
+ struct event event;
+ struct fw_cdev_event_bus_reset reset;
+ };
+
+-struct response {
++struct outbound_transaction_event {
+ struct event event;
+- struct fw_transaction transaction;
+ struct client *client;
+- struct client_resource resource;
++ struct outbound_transaction_resource r;
+ struct fw_cdev_event_response response;
+ };
+
+-struct iso_interrupt {
++struct inbound_transaction_event {
+ struct event event;
+- struct fw_cdev_event_iso_interrupt interrupt;
++ struct fw_cdev_event_request request;
+ };
+
+-struct client {
+- u32 version;
+- struct fw_device *device;
+- spinlock_t lock;
+- u32 resource_handle;
+- struct list_head resource_list;
+- struct list_head event_list;
+- wait_queue_head_t wait;
+- u64 bus_reset_closure;
+-
+- struct fw_iso_context *iso_context;
+- u64 iso_closure;
+- struct fw_iso_buffer buffer;
+- unsigned long vm_start;
++struct iso_interrupt_event {
++ struct event event;
++ struct fw_cdev_event_iso_interrupt interrupt;
++};
+
+- struct list_head link;
++struct iso_resource_event {
++ struct event event;
++ struct fw_cdev_event_iso_resource resource;
+ };
+
+-static inline void __user *
+-u64_to_uptr(__u64 value)
++static inline void __user *u64_to_uptr(__u64 value)
+ {
+ return (void __user *)(unsigned long)value;
+ }
+
+-static inline __u64
+-uptr_to_u64(void __user *ptr)
++static inline __u64 uptr_to_u64(void __user *ptr)
+ {
+ return (__u64)(unsigned long)ptr;
+ }
+@@ -107,7 +182,6 @@ static int fw_device_op_open(struct inod
+ {
+ struct fw_device *device;
+ struct client *client;
+- unsigned long flags;
+
+ device = fw_device_get_by_devt(inode->i_rdev);
+ if (device == NULL)
+@@ -125,16 +199,17 @@ static int fw_device_op_open(struct inod
+ }
+
+ client->device = device;
+- INIT_LIST_HEAD(&client->event_list);
+- INIT_LIST_HEAD(&client->resource_list);
+ spin_lock_init(&client->lock);
++ idr_init(&client->resource_idr);
++ INIT_LIST_HEAD(&client->event_list);
+ init_waitqueue_head(&client->wait);
++ kref_init(&client->kref);
+
+ file->private_data = client;
+
+- spin_lock_irqsave(&device->card->lock, flags);
++ mutex_lock(&device->client_list_mutex);
+ list_add_tail(&client->link, &device->client_list);
+- spin_unlock_irqrestore(&device->card->lock, flags);
++ mutex_unlock(&device->client_list_mutex);
+
+ return 0;
+ }
+@@ -150,68 +225,69 @@ static void queue_event(struct client *c
+ event->v[1].size = size1;
+
+ spin_lock_irqsave(&client->lock, flags);
+- list_add_tail(&event->link, &client->event_list);
++ if (client->in_shutdown)
++ kfree(event);
++ else
++ list_add_tail(&event->link, &client->event_list);
+ spin_unlock_irqrestore(&client->lock, flags);
+
+ wake_up_interruptible(&client->wait);
+ }
+
+-static int
+-dequeue_event(struct client *client, char __user *buffer, size_t count)
++static int dequeue_event(struct client *client,
++ char __user *buffer, size_t count)
+ {
+- unsigned long flags;
+ struct event *event;
+ size_t size, total;
+- int i, retval;
++ int i, ret;
+
+- retval = wait_event_interruptible(client->wait,
+- !list_empty(&client->event_list) ||
+- fw_device_is_shutdown(client->device));
+- if (retval < 0)
+- return retval;
++ ret = wait_event_interruptible(client->wait,
++ !list_empty(&client->event_list) ||
++ fw_device_is_shutdown(client->device));
++ if (ret < 0)
++ return ret;
+
+ if (list_empty(&client->event_list) &&
+ fw_device_is_shutdown(client->device))
+ return -ENODEV;
+
+- spin_lock_irqsave(&client->lock, flags);
+- event = container_of(client->event_list.next, struct event, link);
++ spin_lock_irq(&client->lock);
++ event = list_first_entry(&client->event_list, struct event, link);
+ list_del(&event->link);
+- spin_unlock_irqrestore(&client->lock, flags);
++ spin_unlock_irq(&client->lock);
+
+ total = 0;
+ for (i = 0; i < ARRAY_SIZE(event->v) && total < count; i++) {
+ size = min(event->v[i].size, count - total);
+ if (copy_to_user(buffer + total, event->v[i].data, size)) {
+- retval = -EFAULT;
++ ret = -EFAULT;
+ goto out;
+ }
+ total += size;
+ }
+- retval = total;
++ ret = total;
+
+ out:
+ kfree(event);
+
+- return retval;
++ return ret;
+ }
+
+-static ssize_t
+-fw_device_op_read(struct file *file,
+- char __user *buffer, size_t count, loff_t *offset)
++static ssize_t fw_device_op_read(struct file *file, char __user *buffer,
++ size_t count, loff_t *offset)
+ {
+ struct client *client = file->private_data;
+
+ return dequeue_event(client, buffer, count);
+ }
+
+-/* caller must hold card->lock so that node pointers can be dereferenced here */
+-static void
+-fill_bus_reset_event(struct fw_cdev_event_bus_reset *event,
+- struct client *client)
++static void fill_bus_reset_event(struct fw_cdev_event_bus_reset *event,
++ struct client *client)
+ {
+ struct fw_card *card = client->device->card;
+
++ spin_lock_irq(&card->lock);
++
+ event->closure = client->bus_reset_closure;
+ event->type = FW_CDEV_EVENT_BUS_RESET;
+ event->generation = client->device->generation;
+@@ -220,39 +296,49 @@ fill_bus_reset_event(struct fw_cdev_even
+ event->bm_node_id = 0; /* FIXME: We don't track the BM. */
+ event->irm_node_id = card->irm_node->node_id;
+ event->root_node_id = card->root_node->node_id;
++
++ spin_unlock_irq(&card->lock);
+ }
+
+-static void
+-for_each_client(struct fw_device *device,
+- void (*callback)(struct client *client))
++static void for_each_client(struct fw_device *device,
++ void (*callback)(struct client *client))
+ {
+- struct fw_card *card = device->card;
+ struct client *c;
+- unsigned long flags;
+-
+- spin_lock_irqsave(&card->lock, flags);
+
++ mutex_lock(&device->client_list_mutex);
+ list_for_each_entry(c, &device->client_list, link)
+ callback(c);
++ mutex_unlock(&device->client_list_mutex);
++}
++
++static int schedule_reallocations(int id, void *p, void *data)
++{
++ struct client_resource *r = p;
+
+- spin_unlock_irqrestore(&card->lock, flags);
++ if (r->release == release_iso_resource)
++ schedule_iso_resource(container_of(r,
++ struct iso_resource, resource));
++ return 0;
+ }
+
+-static void
+-queue_bus_reset_event(struct client *client)
++static void queue_bus_reset_event(struct client *client)
+ {
+- struct bus_reset *bus_reset;
++ struct bus_reset_event *e;
+
+- bus_reset = kzalloc(sizeof(*bus_reset), GFP_ATOMIC);
+- if (bus_reset == NULL) {
++ e = kzalloc(sizeof(*e), GFP_KERNEL);
++ if (e == NULL) {
+ fw_notify("Out of memory when allocating bus reset event\n");
+ return;
+ }
+
+- fill_bus_reset_event(&bus_reset->reset, client);
++ fill_bus_reset_event(&e->reset, client);
++
++ queue_event(client, &e->event,
++ &e->reset, sizeof(e->reset), NULL, 0);
+
+- queue_event(client, &bus_reset->event,
+- &bus_reset->reset, sizeof(bus_reset->reset), NULL, 0);
++ spin_lock_irq(&client->lock);
++ idr_for_each(&client->resource_idr, schedule_reallocations, client);
++ spin_unlock_irq(&client->lock);
+ }
+
+ void fw_device_cdev_update(struct fw_device *device)
+@@ -274,11 +360,11 @@ static int ioctl_get_info(struct client
+ {
+ struct fw_cdev_get_info *get_info = buffer;
+ struct fw_cdev_event_bus_reset bus_reset;
+- struct fw_card *card = client->device->card;
+ unsigned long ret = 0;
+
+ client->version = get_info->version;
+ get_info->version = FW_CDEV_VERSION;
++ get_info->card = client->device->card->index;
+
+ down_read(&fw_device_rwsem);
+
+@@ -300,49 +386,61 @@ static int ioctl_get_info(struct client
+ client->bus_reset_closure = get_info->bus_reset_closure;
+ if (get_info->bus_reset != 0) {
+ void __user *uptr = u64_to_uptr(get_info->bus_reset);
+- unsigned long flags;
+
+- spin_lock_irqsave(&card->lock, flags);
+ fill_bus_reset_event(&bus_reset, client);
+- spin_unlock_irqrestore(&card->lock, flags);
+-
+ if (copy_to_user(uptr, &bus_reset, sizeof(bus_reset)))
+ return -EFAULT;
+ }
+
+- get_info->card = card->index;
+-
+ return 0;
+ }
+
+-static void
+-add_client_resource(struct client *client, struct client_resource *resource)
++static int add_client_resource(struct client *client,
++ struct client_resource *resource, gfp_t gfp_mask)
+ {
+ unsigned long flags;
++ int ret;
++
++ retry:
++ if (idr_pre_get(&client->resource_idr, gfp_mask | __GFP_ZERO) == 0)
++ return -ENOMEM;
+
+ spin_lock_irqsave(&client->lock, flags);
+- list_add_tail(&resource->link, &client->resource_list);
+- resource->handle = client->resource_handle++;
++ if (client->in_shutdown)
++ ret = -ECANCELED;
++ else
++ ret = idr_get_new(&client->resource_idr, resource,
++ &resource->handle);
++ if (ret >= 0) {
++ client_get(client);
++ if (resource->release == release_iso_resource)
++ schedule_iso_resource(container_of(resource,
++ struct iso_resource, resource));
++ }
+ spin_unlock_irqrestore(&client->lock, flags);
++
++ if (ret == -EAGAIN)
++ goto retry;
++
++ return ret < 0 ? ret : 0;
+ }
+
+-static int
+-release_client_resource(struct client *client, u32 handle,
+- struct client_resource **resource)
++static int release_client_resource(struct client *client, u32 handle,
++ client_resource_release_fn_t release,
++ struct client_resource **resource)
+ {
+ struct client_resource *r;
+- unsigned long flags;
+
+- spin_lock_irqsave(&client->lock, flags);
+- list_for_each_entry(r, &client->resource_list, link) {
+- if (r->handle == handle) {
+- list_del(&r->link);
+- break;
+- }
+- }
+- spin_unlock_irqrestore(&client->lock, flags);
++ spin_lock_irq(&client->lock);
++ if (client->in_shutdown)
++ r = NULL;
++ else
++ r = idr_find(&client->resource_idr, handle);
++ if (r && r->release == release)
++ idr_remove(&client->resource_idr, handle);
++ spin_unlock_irq(&client->lock);
+
+- if (&r->link == &client->resource_list)
++ if (!(r && r->release == release))
+ return -EINVAL;
+
+ if (resource)
+@@ -350,203 +448,242 @@ release_client_resource(struct client *c
+ else
+ r->release(client, r);
+
++ client_put(client);
++
+ return 0;
+ }
+
+-static void
+-release_transaction(struct client *client, struct client_resource *resource)
++static void release_transaction(struct client *client,
++ struct client_resource *resource)
+ {
+- struct response *response =
+- container_of(resource, struct response, resource);
++ struct outbound_transaction_resource *r = container_of(resource,
++ struct outbound_transaction_resource, resource);
+
+- fw_cancel_transaction(client->device->card, &response->transaction);
++ fw_cancel_transaction(client->device->card, &r->transaction);
+ }
+
+-static void
+-complete_transaction(struct fw_card *card, int rcode,
+- void *payload, size_t length, void *data)
++static void complete_transaction(struct fw_card *card, int rcode,
++ void *payload, size_t length, void *data)
+ {
+- struct response *response = data;
+- struct client *client = response->client;
++ struct outbound_transaction_event *e = data;
++ struct fw_cdev_event_response *rsp = &e->response;
++ struct client *client = e->client;
+ unsigned long flags;
+- struct fw_cdev_event_response *r = &response->response;
+
+- if (length < r->length)
+- r->length = length;
++ if (length < rsp->length)
++ rsp->length = length;
+ if (rcode == RCODE_COMPLETE)
+- memcpy(r->data, payload, r->length);
++ memcpy(rsp->data, payload, rsp->length);
+
+ spin_lock_irqsave(&client->lock, flags);
+- list_del(&response->resource.link);
++ /*
++ * 1. If called while in shutdown, the idr tree must be left untouched.
++ * The idr handle will be removed and the client reference will be
++ * dropped later.
++ * 2. If the call chain was release_client_resource ->
++ * release_transaction -> complete_transaction (instead of a normal
++ * conclusion of the transaction), i.e. if this resource was already
++ * unregistered from the idr, the client reference will be dropped
++ * by release_client_resource and we must not drop it here.
++ */
++ if (!client->in_shutdown &&
++ idr_find(&client->resource_idr, e->r.resource.handle)) {
++ idr_remove(&client->resource_idr, e->r.resource.handle);
++ /* Drop the idr's reference */
++ client_put(client);
++ }
+ spin_unlock_irqrestore(&client->lock, flags);
+
+- r->type = FW_CDEV_EVENT_RESPONSE;
+- r->rcode = rcode;
++ rsp->type = FW_CDEV_EVENT_RESPONSE;
++ rsp->rcode = rcode;
+
+ /*
+- * In the case that sizeof(*r) doesn't align with the position of the
++ * In the case that sizeof(*rsp) doesn't align with the position of the
+ * data, and the read is short, preserve an extra copy of the data
+ * to stay compatible with a pre-2.6.27 bug. Since the bug is harmless
+ * for short reads and some apps depended on it, this is both safe
+ * and prudent for compatibility.
+ */
+- if (r->length <= sizeof(*r) - offsetof(typeof(*r), data))
+- queue_event(client, &response->event, r, sizeof(*r),
+- r->data, r->length);
++ if (rsp->length <= sizeof(*rsp) - offsetof(typeof(*rsp), data))
++ queue_event(client, &e->event, rsp, sizeof(*rsp),
++ rsp->data, rsp->length);
+ else
+- queue_event(client, &response->event, r, sizeof(*r) + r->length,
++ queue_event(client, &e->event, rsp, sizeof(*rsp) + rsp->length,
+ NULL, 0);
++
++ /* Drop the transaction callback's reference */
++ client_put(client);
+ }
+
+-static int ioctl_send_request(struct client *client, void *buffer)
++static int init_request(struct client *client,
++ struct fw_cdev_send_request *request,
++ int destination_id, int speed)
+ {
+- struct fw_device *device = client->device;
+- struct fw_cdev_send_request *request = buffer;
+- struct response *response;
++ struct outbound_transaction_event *e;
++ int ret;
+
+- /* What is the biggest size we'll accept, really? */
+- if (request->length > 4096)
+- return -EINVAL;
++ if (request->length > 4096 || request->length > 512 << speed)
++ return -EIO;
+
+- response = kmalloc(sizeof(*response) + request->length, GFP_KERNEL);
+- if (response == NULL)
++ e = kmalloc(sizeof(*e) + request->length, GFP_KERNEL);
++ if (e == NULL)
+ return -ENOMEM;
+
+- response->client = client;
+- response->response.length = request->length;
+- response->response.closure = request->closure;
++ e->client = client;
++ e->response.length = request->length;
++ e->response.closure = request->closure;
+
+ if (request->data &&
+- copy_from_user(response->response.data,
++ copy_from_user(e->response.data,
+ u64_to_uptr(request->data), request->length)) {
+- kfree(response);
+- return -EFAULT;
++ ret = -EFAULT;
++ goto failed;
+ }
+
+- response->resource.release = release_transaction;
+- add_client_resource(client, &response->resource);
+-
+- fw_send_request(device->card, &response->transaction,
+- request->tcode & 0x1f,
+- device->node->node_id,
+- request->generation,
+- device->max_speed,
+- request->offset,
+- response->response.data, request->length,
+- complete_transaction, response);
++ e->r.resource.release = release_transaction;
++ ret = add_client_resource(client, &e->r.resource, GFP_KERNEL);
++ if (ret < 0)
++ goto failed;
++
++ /* Get a reference for the transaction callback */
++ client_get(client);
++
++ fw_send_request(client->device->card, &e->r.transaction,
++ request->tcode & 0x1f, destination_id,
++ request->generation, speed, request->offset,
++ e->response.data, request->length,
++ complete_transaction, e);
+
+ if (request->data)
+ return sizeof(request) + request->length;
+ else
+ return sizeof(request);
++ failed:
++ kfree(e);
++
++ return ret;
+ }
+
+-struct address_handler {
+- struct fw_address_handler handler;
+- __u64 closure;
+- struct client *client;
+- struct client_resource resource;
+-};
++static int ioctl_send_request(struct client *client, void *buffer)
++{
++ struct fw_cdev_send_request *request = buffer;
+
+-struct request {
+- struct fw_request *request;
+- void *data;
+- size_t length;
+- struct client_resource resource;
+-};
++ switch (request->tcode) {
++ case TCODE_WRITE_QUADLET_REQUEST:
++ case TCODE_WRITE_BLOCK_REQUEST:
++ case TCODE_READ_QUADLET_REQUEST:
++ case TCODE_READ_BLOCK_REQUEST:
++ case TCODE_LOCK_MASK_SWAP:
++ case TCODE_LOCK_COMPARE_SWAP:
++ case TCODE_LOCK_FETCH_ADD:
++ case TCODE_LOCK_LITTLE_ADD:
++ case TCODE_LOCK_BOUNDED_ADD:
++ case TCODE_LOCK_WRAP_ADD:
++ case TCODE_LOCK_VENDOR_DEPENDENT:
++ break;
++ default:
++ return -EINVAL;
++ }
+
+-struct request_event {
+- struct event event;
+- struct fw_cdev_event_request request;
+-};
++ return init_request(client, request, client->device->node->node_id,
++ client->device->max_speed);
++}
+
+-static void
+-release_request(struct client *client, struct client_resource *resource)
++static void release_request(struct client *client,
++ struct client_resource *resource)
+ {
+- struct request *request =
+- container_of(resource, struct request, resource);
++ struct inbound_transaction_resource *r = container_of(resource,
++ struct inbound_transaction_resource, resource);
+
+- fw_send_response(client->device->card, request->request,
++ fw_send_response(client->device->card, r->request,
+ RCODE_CONFLICT_ERROR);
+- kfree(request);
++ kfree(r);
+ }
+
+-static void
+-handle_request(struct fw_card *card, struct fw_request *r,
+- int tcode, int destination, int source,
+- int generation, int speed,
+- unsigned long long offset,
+- void *payload, size_t length, void *callback_data)
+-{
+- struct address_handler *handler = callback_data;
+- struct request *request;
+- struct request_event *e;
+- struct client *client = handler->client;
++static void handle_request(struct fw_card *card, struct fw_request *request,
++ int tcode, int destination, int source,
++ int generation, int speed,
++ unsigned long long offset,
++ void *payload, size_t length, void *callback_data)
++{
++ struct address_handler_resource *handler = callback_data;
++ struct inbound_transaction_resource *r;
++ struct inbound_transaction_event *e;
++ int ret;
+
+- request = kmalloc(sizeof(*request), GFP_ATOMIC);
++ r = kmalloc(sizeof(*r), GFP_ATOMIC);
+ e = kmalloc(sizeof(*e), GFP_ATOMIC);
+- if (request == NULL || e == NULL) {
+- kfree(request);
+- kfree(e);
+- fw_send_response(card, r, RCODE_CONFLICT_ERROR);
+- return;
+- }
+-
+- request->request = r;
+- request->data = payload;
+- request->length = length;
++ if (r == NULL || e == NULL)
++ goto failed;
+
+- request->resource.release = release_request;
+- add_client_resource(client, &request->resource);
++ r->request = request;
++ r->data = payload;
++ r->length = length;
++
++ r->resource.release = release_request;
++ ret = add_client_resource(handler->client, &r->resource, GFP_ATOMIC);
++ if (ret < 0)
++ goto failed;
+
+ e->request.type = FW_CDEV_EVENT_REQUEST;
+ e->request.tcode = tcode;
+ e->request.offset = offset;
+ e->request.length = length;
+- e->request.handle = request->resource.handle;
++ e->request.handle = r->resource.handle;
+ e->request.closure = handler->closure;
+
+- queue_event(client, &e->event,
++ queue_event(handler->client, &e->event,
+ &e->request, sizeof(e->request), payload, length);
++ return;
++
++ failed:
++ kfree(r);
++ kfree(e);
++ fw_send_response(card, request, RCODE_CONFLICT_ERROR);
+ }
+
+-static void
+-release_address_handler(struct client *client,
+- struct client_resource *resource)
++static void release_address_handler(struct client *client,
++ struct client_resource *resource)
+ {
+- struct address_handler *handler =
+- container_of(resource, struct address_handler, resource);
++ struct address_handler_resource *r =
++ container_of(resource, struct address_handler_resource, resource);
+
+- fw_core_remove_address_handler(&handler->handler);
+- kfree(handler);
++ fw_core_remove_address_handler(&r->handler);
++ kfree(r);
+ }
+
+ static int ioctl_allocate(struct client *client, void *buffer)
+ {
+ struct fw_cdev_allocate *request = buffer;
+- struct address_handler *handler;
++ struct address_handler_resource *r;
+ struct fw_address_region region;
++ int ret;
+
+- handler = kmalloc(sizeof(*handler), GFP_KERNEL);
+- if (handler == NULL)
++ r = kmalloc(sizeof(*r), GFP_KERNEL);
++ if (r == NULL)
+ return -ENOMEM;
+
+ region.start = request->offset;
+ region.end = request->offset + request->length;
+- handler->handler.length = request->length;
+- handler->handler.address_callback = handle_request;
+- handler->handler.callback_data = handler;
+- handler->closure = request->closure;
+- handler->client = client;
+-
+- if (fw_core_add_address_handler(&handler->handler, &region) < 0) {
+- kfree(handler);
+- return -EBUSY;
++ r->handler.length = request->length;
++ r->handler.address_callback = handle_request;
++ r->handler.callback_data = r;
++ r->closure = request->closure;
++ r->client = client;
++
++ ret = fw_core_add_address_handler(&r->handler, &region);
++ if (ret < 0) {
++ kfree(r);
++ return ret;
+ }
+
+- handler->resource.release = release_address_handler;
+- add_client_resource(client, &handler->resource);
+- request->handle = handler->resource.handle;
++ r->resource.release = release_address_handler;
++ ret = add_client_resource(client, &r->resource, GFP_KERNEL);
++ if (ret < 0) {
++ release_address_handler(client, &r->resource);
++ return ret;
++ }
++ request->handle = r->resource.handle;
+
+ return 0;
+ }
+@@ -555,18 +692,22 @@ static int ioctl_deallocate(struct clien
+ {
+ struct fw_cdev_deallocate *request = buffer;
+
+- return release_client_resource(client, request->handle, NULL);
++ return release_client_resource(client, request->handle,
++ release_address_handler, NULL);
+ }
+
+ static int ioctl_send_response(struct client *client, void *buffer)
+ {
+ struct fw_cdev_send_response *request = buffer;
+ struct client_resource *resource;
+- struct request *r;
++ struct inbound_transaction_resource *r;
+
+- if (release_client_resource(client, request->handle, &resource) < 0)
++ if (release_client_resource(client, request->handle,
++ release_request, &resource) < 0)
+ return -EINVAL;
+- r = container_of(resource, struct request, resource);
++
++ r = container_of(resource, struct inbound_transaction_resource,
++ resource);
+ if (request->length < r->length)
+ r->length = request->length;
+ if (copy_from_user(r->data, u64_to_uptr(request->data), r->length))
+@@ -588,85 +729,84 @@ static int ioctl_initiate_bus_reset(stru
+ return fw_core_initiate_bus_reset(client->device->card, short_reset);
+ }
+
+-struct descriptor {
+- struct fw_descriptor d;
+- struct client_resource resource;
+- u32 data[0];
+-};
+-
+ static void release_descriptor(struct client *client,
+ struct client_resource *resource)
+ {
+- struct descriptor *descriptor =
+- container_of(resource, struct descriptor, resource);
++ struct descriptor_resource *r =
++ container_of(resource, struct descriptor_resource, resource);
+
+- fw_core_remove_descriptor(&descriptor->d);
+- kfree(descriptor);
++ fw_core_remove_descriptor(&r->descriptor);
++ kfree(r);
+ }
+
+ static int ioctl_add_descriptor(struct client *client, void *buffer)
+ {
+ struct fw_cdev_add_descriptor *request = buffer;
+- struct descriptor *descriptor;
+- int retval;
++ struct descriptor_resource *r;
++ int ret;
+
+ if (request->length > 256)
+ return -EINVAL;
+
+- descriptor =
+- kmalloc(sizeof(*descriptor) + request->length * 4, GFP_KERNEL);
+- if (descriptor == NULL)
++ r = kmalloc(sizeof(*r) + request->length * 4, GFP_KERNEL);
++ if (r == NULL)
+ return -ENOMEM;
+
+- if (copy_from_user(descriptor->data,
++ if (copy_from_user(r->data,
+ u64_to_uptr(request->data), request->length * 4)) {
+- kfree(descriptor);
+- return -EFAULT;
++ ret = -EFAULT;
++ goto failed;
+ }
+
+- descriptor->d.length = request->length;
+- descriptor->d.immediate = request->immediate;
+- descriptor->d.key = request->key;
+- descriptor->d.data = descriptor->data;
+-
+- retval = fw_core_add_descriptor(&descriptor->d);
+- if (retval < 0) {
+- kfree(descriptor);
+- return retval;
++ r->descriptor.length = request->length;
++ r->descriptor.immediate = request->immediate;
++ r->descriptor.key = request->key;
++ r->descriptor.data = r->data;
++
++ ret = fw_core_add_descriptor(&r->descriptor);
++ if (ret < 0)
++ goto failed;
++
++ r->resource.release = release_descriptor;
++ ret = add_client_resource(client, &r->resource, GFP_KERNEL);
++ if (ret < 0) {
++ fw_core_remove_descriptor(&r->descriptor);
++ goto failed;
+ }
+-
+- descriptor->resource.release = release_descriptor;
+- add_client_resource(client, &descriptor->resource);
+- request->handle = descriptor->resource.handle;
++ request->handle = r->resource.handle;
+
+ return 0;
++ failed:
++ kfree(r);
++
++ return ret;
+ }
+
+ static int ioctl_remove_descriptor(struct client *client, void *buffer)
+ {
+ struct fw_cdev_remove_descriptor *request = buffer;
+
+- return release_client_resource(client, request->handle, NULL);
++ return release_client_resource(client, request->handle,
++ release_descriptor, NULL);
+ }
+
+-static void
+-iso_callback(struct fw_iso_context *context, u32 cycle,
+- size_t header_length, void *header, void *data)
++static void iso_callback(struct fw_iso_context *context, u32 cycle,
++ size_t header_length, void *header, void *data)
+ {
+ struct client *client = data;
+- struct iso_interrupt *irq;
++ struct iso_interrupt_event *e;
+
+- irq = kzalloc(sizeof(*irq) + header_length, GFP_ATOMIC);
+- if (irq == NULL)
++ e = kzalloc(sizeof(*e) + header_length, GFP_ATOMIC);
++ if (e == NULL)
+ return;
+
+- irq->interrupt.type = FW_CDEV_EVENT_ISO_INTERRUPT;
+- irq->interrupt.closure = client->iso_closure;
+- irq->interrupt.cycle = cycle;
+- irq->interrupt.header_length = header_length;
+- memcpy(irq->interrupt.header, header, header_length);
+- queue_event(client, &irq->event, &irq->interrupt,
+- sizeof(irq->interrupt) + header_length, NULL, 0);
++ e->interrupt.type = FW_CDEV_EVENT_ISO_INTERRUPT;
++ e->interrupt.closure = client->iso_closure;
++ e->interrupt.cycle = cycle;
++ e->interrupt.header_length = header_length;
++ memcpy(e->interrupt.header, header, header_length);
++ queue_event(client, &e->event, &e->interrupt,
++ sizeof(e->interrupt) + header_length, NULL, 0);
+ }
+
+ static int ioctl_create_iso_context(struct client *client, void *buffer)
+@@ -871,6 +1011,237 @@ static int ioctl_get_cycle_timer(struct
+ return 0;
+ }
+
++static void iso_resource_work(struct work_struct *work)
++{
++ struct iso_resource_event *e;
++ struct iso_resource *r =
++ container_of(work, struct iso_resource, work.work);
++ struct client *client = r->client;
++ int generation, channel, bandwidth, todo;
++ bool skip, free, success;
++
++ spin_lock_irq(&client->lock);
++ generation = client->device->generation;
++ todo = r->todo;
++ /* Allow 1000ms grace period for other reallocations. */
++ if (todo == ISO_RES_ALLOC &&
++ time_is_after_jiffies(client->device->card->reset_jiffies + HZ)) {
++ if (schedule_delayed_work(&r->work, DIV_ROUND_UP(HZ, 3)))
++ client_get(client);
++ skip = true;
++ } else {
++ /* We could be called twice within the same generation. */
++ skip = todo == ISO_RES_REALLOC &&
++ r->generation == generation;
++ }
++ free = todo == ISO_RES_DEALLOC ||
++ todo == ISO_RES_ALLOC_ONCE ||
++ todo == ISO_RES_DEALLOC_ONCE;
++ r->generation = generation;
++ spin_unlock_irq(&client->lock);
++
++ if (skip)
++ goto out;
++
++ bandwidth = r->bandwidth;
++
++ fw_iso_resource_manage(client->device->card, generation,
++ r->channels, &channel, &bandwidth,
++ todo == ISO_RES_ALLOC ||
++ todo == ISO_RES_REALLOC ||
++ todo == ISO_RES_ALLOC_ONCE);
++ /*
++ * Is this generation outdated already? As long as this resource sticks
++ * in the idr, it will be scheduled again for a newer generation or at
++ * shutdown.
++ */
++ if (channel == -EAGAIN &&
++ (todo == ISO_RES_ALLOC || todo == ISO_RES_REALLOC))
++ goto out;
++
++ success = channel >= 0 || bandwidth > 0;
++
++ spin_lock_irq(&client->lock);
++ /*
++ * Transit from allocation to reallocation, except if the client
++ * requested deallocation in the meantime.
++ */
++ if (r->todo == ISO_RES_ALLOC)
++ r->todo = ISO_RES_REALLOC;
++ /*
++ * Allocation or reallocation failure? Pull this resource out of the
++ * idr and prepare for deletion, unless the client is shutting down.
++ */
++ if (r->todo == ISO_RES_REALLOC && !success &&
++ !client->in_shutdown &&
++ idr_find(&client->resource_idr, r->resource.handle)) {
++ idr_remove(&client->resource_idr, r->resource.handle);
++ client_put(client);
++ free = true;
++ }
++ spin_unlock_irq(&client->lock);
++
++ if (todo == ISO_RES_ALLOC && channel >= 0)
++ r->channels = 1ULL << channel;
++
++ if (todo == ISO_RES_REALLOC && success)
++ goto out;
++
++ if (todo == ISO_RES_ALLOC || todo == ISO_RES_ALLOC_ONCE) {
++ e = r->e_alloc;
++ r->e_alloc = NULL;
++ } else {
++ e = r->e_dealloc;
++ r->e_dealloc = NULL;
++ }
++ e->resource.handle = r->resource.handle;
++ e->resource.channel = channel;
++ e->resource.bandwidth = bandwidth;
++
++ queue_event(client, &e->event,
++ &e->resource, sizeof(e->resource), NULL, 0);
++
++ if (free) {
++ cancel_delayed_work(&r->work);
++ kfree(r->e_alloc);
++ kfree(r->e_dealloc);
++ kfree(r);
++ }
++ out:
++ client_put(client);
++}
++
++static void schedule_iso_resource(struct iso_resource *r)
++{
++ client_get(r->client);
++ if (!schedule_delayed_work(&r->work, 0))
++ client_put(r->client);
++}
++
++static void release_iso_resource(struct client *client,
++ struct client_resource *resource)
++{
++ struct iso_resource *r =
++ container_of(resource, struct iso_resource, resource);
++
++ spin_lock_irq(&client->lock);
++ r->todo = ISO_RES_DEALLOC;
++ schedule_iso_resource(r);
++ spin_unlock_irq(&client->lock);
++}
++
++static int init_iso_resource(struct client *client,
++ struct fw_cdev_allocate_iso_resource *request, int todo)
++{
++ struct iso_resource_event *e1, *e2;
++ struct iso_resource *r;
++ int ret;
++
++ if ((request->channels == 0 && request->bandwidth == 0) ||
++ request->bandwidth > BANDWIDTH_AVAILABLE_INITIAL ||
++ request->bandwidth < 0)
++ return -EINVAL;
++
++ r = kmalloc(sizeof(*r), GFP_KERNEL);
++ e1 = kmalloc(sizeof(*e1), GFP_KERNEL);
++ e2 = kmalloc(sizeof(*e2), GFP_KERNEL);
++ if (r == NULL || e1 == NULL || e2 == NULL) {
++ ret = -ENOMEM;
++ goto fail;
++ }
++
++ INIT_DELAYED_WORK(&r->work, iso_resource_work);
++ r->client = client;
++ r->todo = todo;
++ r->generation = -1;
++ r->channels = request->channels;
++ r->bandwidth = request->bandwidth;
++ r->e_alloc = e1;
++ r->e_dealloc = e2;
++
++ e1->resource.closure = request->closure;
++ e1->resource.type = FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED;
++ e2->resource.closure = request->closure;
++ e2->resource.type = FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED;
++
++ if (todo == ISO_RES_ALLOC) {
++ r->resource.release = release_iso_resource;
++ ret = add_client_resource(client, &r->resource, GFP_KERNEL);
++ if (ret < 0)
++ goto fail;
++ } else {
++ r->resource.release = NULL;
++ r->resource.handle = -1;
++ schedule_iso_resource(r);
++ }
++ request->handle = r->resource.handle;
++
++ return 0;
++ fail:
++ kfree(r);
++ kfree(e1);
++ kfree(e2);
++
++ return ret;
++}
++
++static int ioctl_allocate_iso_resource(struct client *client, void *buffer)
++{
++ struct fw_cdev_allocate_iso_resource *request = buffer;
++
++ return init_iso_resource(client, request, ISO_RES_ALLOC);
++}
++
++static int ioctl_deallocate_iso_resource(struct client *client, void *buffer)
++{
++ struct fw_cdev_deallocate *request = buffer;
++
++ return release_client_resource(client, request->handle,
++ release_iso_resource, NULL);
++}
++
++static int ioctl_allocate_iso_resource_once(struct client *client, void *buffer)
++{
++ struct fw_cdev_allocate_iso_resource *request = buffer;
++
++ return init_iso_resource(client, request, ISO_RES_ALLOC_ONCE);
++}
++
++static int ioctl_deallocate_iso_resource_once(struct client *client, void *buffer)
++{
++ struct fw_cdev_allocate_iso_resource *request = buffer;
++
++ return init_iso_resource(client, request, ISO_RES_DEALLOC_ONCE);
++}
++
++static int ioctl_get_speed(struct client *client, void *buffer)
++{
++ struct fw_cdev_get_speed *request = buffer;
++
++ request->max_speed = client->device->max_speed;
++
++ return 0;
++}
++
++static int ioctl_send_broadcast_request(struct client *client, void *buffer)
++{
++ struct fw_cdev_send_request *request = buffer;
++
++ switch (request->tcode) {
++ case TCODE_WRITE_QUADLET_REQUEST:
++ case TCODE_WRITE_BLOCK_REQUEST:
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ /* Security policy: Only allow accesses to Units Space. */
++ if (request->offset < CSR_REGISTER_BASE + CSR_CONFIG_ROM_END)
++ return -EACCES;
++
++ return init_request(client, request, LOCAL_BUS | 0x3f, SCODE_100);
++}
++
+ static int (* const ioctl_handlers[])(struct client *client, void *buffer) = {
+ ioctl_get_info,
+ ioctl_send_request,
+@@ -885,13 +1256,19 @@ static int (* const ioctl_handlers[])(st
+ ioctl_start_iso,
+ ioctl_stop_iso,
+ ioctl_get_cycle_timer,
++ ioctl_allocate_iso_resource,
++ ioctl_deallocate_iso_resource,
++ ioctl_allocate_iso_resource_once,
++ ioctl_deallocate_iso_resource_once,
++ ioctl_get_speed,
++ ioctl_send_broadcast_request,
+ };
+
+-static int
+-dispatch_ioctl(struct client *client, unsigned int cmd, void __user *arg)
++static int dispatch_ioctl(struct client *client,
++ unsigned int cmd, void __user *arg)
+ {
+ char buffer[256];
+- int retval;
++ int ret;
+
+ if (_IOC_TYPE(cmd) != '#' ||
+ _IOC_NR(cmd) >= ARRAY_SIZE(ioctl_handlers))
+@@ -903,9 +1280,9 @@ dispatch_ioctl(struct client *client, un
+ return -EFAULT;
+ }
+
+- retval = ioctl_handlers[_IOC_NR(cmd)](client, buffer);
+- if (retval < 0)
+- return retval;
++ ret = ioctl_handlers[_IOC_NR(cmd)](client, buffer);
++ if (ret < 0)
++ return ret;
+
+ if (_IOC_DIR(cmd) & _IOC_READ) {
+ if (_IOC_SIZE(cmd) > sizeof(buffer) ||
+@@ -913,12 +1290,11 @@ dispatch_ioctl(struct client *client, un
+ return -EFAULT;
+ }
+
+- return retval;
++ return ret;
+ }
+
+-static long
+-fw_device_op_ioctl(struct file *file,
+- unsigned int cmd, unsigned long arg)
++static long fw_device_op_ioctl(struct file *file,
++ unsigned int cmd, unsigned long arg)
+ {
+ struct client *client = file->private_data;
+
+@@ -929,9 +1305,8 @@ fw_device_op_ioctl(struct file *file,
+ }
+
+ #ifdef CONFIG_COMPAT
+-static long
+-fw_device_op_compat_ioctl(struct file *file,
+- unsigned int cmd, unsigned long arg)
++static long fw_device_op_compat_ioctl(struct file *file,
++ unsigned int cmd, unsigned long arg)
+ {
+ struct client *client = file->private_data;
+
+@@ -947,7 +1322,7 @@ static int fw_device_op_mmap(struct file
+ struct client *client = file->private_data;
+ enum dma_data_direction direction;
+ unsigned long size;
+- int page_count, retval;
++ int page_count, ret;
+
+ if (fw_device_is_shutdown(client->device))
+ return -ENODEV;
+@@ -973,48 +1348,57 @@ static int fw_device_op_mmap(struct file
+ else
+ direction = DMA_FROM_DEVICE;
+
+- retval = fw_iso_buffer_init(&client->buffer, client->device->card,
+- page_count, direction);
+- if (retval < 0)
+- return retval;
++ ret = fw_iso_buffer_init(&client->buffer, client->device->card,
++ page_count, direction);
++ if (ret < 0)
++ return ret;
+
+- retval = fw_iso_buffer_map(&client->buffer, vma);
+- if (retval < 0)
++ ret = fw_iso_buffer_map(&client->buffer, vma);
++ if (ret < 0)
+ fw_iso_buffer_destroy(&client->buffer, client->device->card);
+
+- return retval;
++ return ret;
++}
++
++static int shutdown_resource(int id, void *p, void *data)
++{
++ struct client_resource *r = p;
++ struct client *client = data;
++
++ r->release(client, r);
++ client_put(client);
++
++ return 0;
+ }
+
+ static int fw_device_op_release(struct inode *inode, struct file *file)
+ {
+ struct client *client = file->private_data;
+ struct event *e, *next_e;
+- struct client_resource *r, *next_r;
+- unsigned long flags;
+
+- if (client->buffer.pages)
+- fw_iso_buffer_destroy(&client->buffer, client->device->card);
++ mutex_lock(&client->device->client_list_mutex);
++ list_del(&client->link);
++ mutex_unlock(&client->device->client_list_mutex);
+
+ if (client->iso_context)
+ fw_iso_context_destroy(client->iso_context);
+
+- list_for_each_entry_safe(r, next_r, &client->resource_list, link)
+- r->release(client, r);
++ if (client->buffer.pages)
++ fw_iso_buffer_destroy(&client->buffer, client->device->card);
+
+- /*
+- * FIXME: We should wait for the async tasklets to stop
+- * running before freeing the memory.
+- */
++ /* Freeze client->resource_idr and client->event_list */
++ spin_lock_irq(&client->lock);
++ client->in_shutdown = true;
++ spin_unlock_irq(&client->lock);
++
++ idr_for_each(&client->resource_idr, shutdown_resource, client);
++ idr_remove_all(&client->resource_idr);
++ idr_destroy(&client->resource_idr);
+
+ list_for_each_entry_safe(e, next_e, &client->event_list, link)
+ kfree(e);
+
+- spin_lock_irqsave(&client->device->card->lock, flags);
+- list_del(&client->link);
+- spin_unlock_irqrestore(&client->device->card->lock, flags);
+-
+- fw_device_put(client->device);
+- kfree(client);
++ client_put(client);
+
+ return 0;
+ }
+diff -Naurp linux-2.6-git/drivers/firewire/fw-device.c firewire-git/drivers/firewire/fw-device.c
+--- linux-2.6-git/drivers/firewire/fw-device.c 2009-01-30 13:39:02.989651512 -0500
++++ firewire-git/drivers/firewire/fw-device.c 2009-01-30 13:35:51.860646788 -0500
+@@ -27,8 +27,10 @@
+ #include <linux/idr.h>
+ #include <linux/jiffies.h>
+ #include <linux/string.h>
++#include <linux/mutex.h>
+ #include <linux/rwsem.h>
+ #include <linux/semaphore.h>
++#include <linux/spinlock.h>
+ #include <asm/system.h>
+ #include <linux/ctype.h>
+ #include "fw-transaction.h"
+@@ -132,8 +134,7 @@ static int get_modalias(struct fw_unit *
+ vendor, model, specifier_id, version);
+ }
+
+-static int
+-fw_unit_uevent(struct device *dev, struct kobj_uevent_env *env)
++static int fw_unit_uevent(struct device *dev, struct kobj_uevent_env *env)
+ {
+ struct fw_unit *unit = fw_unit(dev);
+ char modalias[64];
+@@ -191,8 +192,8 @@ struct config_rom_attribute {
+ u32 key;
+ };
+
+-static ssize_t
+-show_immediate(struct device *dev, struct device_attribute *dattr, char *buf)
++static ssize_t show_immediate(struct device *dev,
++ struct device_attribute *dattr, char *buf)
+ {
+ struct config_rom_attribute *attr =
+ container_of(dattr, struct config_rom_attribute, attr);
+@@ -223,8 +224,8 @@ show_immediate(struct device *dev, struc
+ #define IMMEDIATE_ATTR(name, key) \
+ { __ATTR(name, S_IRUGO, show_immediate, NULL), key }
+
+-static ssize_t
+-show_text_leaf(struct device *dev, struct device_attribute *dattr, char *buf)
++static ssize_t show_text_leaf(struct device *dev,
++ struct device_attribute *dattr, char *buf)
+ {
+ struct config_rom_attribute *attr =
+ container_of(dattr, struct config_rom_attribute, attr);
+@@ -293,10 +294,9 @@ static struct config_rom_attribute confi
+ TEXT_LEAF_ATTR(hardware_version_name, CSR_HARDWARE_VERSION),
+ };
+
+-static void
+-init_fw_attribute_group(struct device *dev,
+- struct device_attribute *attrs,
+- struct fw_attribute_group *group)
++static void init_fw_attribute_group(struct device *dev,
++ struct device_attribute *attrs,
++ struct fw_attribute_group *group)
+ {
+ struct device_attribute *attr;
+ int i, j;
+@@ -319,9 +319,8 @@ init_fw_attribute_group(struct device *d
+ dev->groups = group->groups;
+ }
+
+-static ssize_t
+-modalias_show(struct device *dev,
+- struct device_attribute *attr, char *buf)
++static ssize_t modalias_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
+ {
+ struct fw_unit *unit = fw_unit(dev);
+ int length;
+@@ -332,9 +331,8 @@ modalias_show(struct device *dev,
+ return length + 1;
+ }
+
+-static ssize_t
+-rom_index_show(struct device *dev,
+- struct device_attribute *attr, char *buf)
++static ssize_t rom_index_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
+ {
+ struct fw_device *device = fw_device(dev->parent);
+ struct fw_unit *unit = fw_unit(dev);
+@@ -349,8 +347,8 @@ static struct device_attribute fw_unit_a
+ __ATTR_NULL,
+ };
+
+-static ssize_t
+-config_rom_show(struct device *dev, struct device_attribute *attr, char *buf)
++static ssize_t config_rom_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
+ {
+ struct fw_device *device = fw_device(dev);
+ size_t length;
+@@ -363,8 +361,8 @@ config_rom_show(struct device *dev, stru
+ return length;
+ }
+
+-static ssize_t
+-guid_show(struct device *dev, struct device_attribute *attr, char *buf)
++static ssize_t guid_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
+ {
+ struct fw_device *device = fw_device(dev);
+ int ret;
+@@ -383,8 +381,8 @@ static struct device_attribute fw_device
+ __ATTR_NULL,
+ };
+
+-static int
+-read_rom(struct fw_device *device, int generation, int index, u32 *data)
++static int read_rom(struct fw_device *device,
++ int generation, int index, u32 *data)
+ {
+ int rcode;
+
+@@ -1004,6 +1002,7 @@ void fw_node_event(struct fw_card *card,
+ device->node = fw_node_get(node);
+ device->node_id = node->node_id;
+ device->generation = card->generation;
++ mutex_init(&device->client_list_mutex);
+ INIT_LIST_HEAD(&device->client_list);
+
+ /*
+diff -Naurp linux-2.6-git/drivers/firewire/fw-device.h firewire-git/drivers/firewire/fw-device.h
+--- linux-2.6-git/drivers/firewire/fw-device.h 2009-01-30 13:39:02.989651512 -0500
++++ firewire-git/drivers/firewire/fw-device.h 2009-01-30 13:35:51.860646788 -0500
+@@ -23,6 +23,7 @@
+ #include <linux/cdev.h>
+ #include <linux/idr.h>
+ #include <linux/rwsem.h>
++#include <linux/mutex.h>
+ #include <asm/atomic.h>
+
+ enum fw_device_state {
+@@ -64,7 +65,10 @@ struct fw_device {
+ bool cmc;
+ struct fw_card *card;
+ struct device device;
++
++ struct mutex client_list_mutex;
+ struct list_head client_list;
++
+ u32 *config_rom;
+ size_t config_rom_length;
+ int config_rom_retries;
+@@ -176,8 +180,7 @@ struct fw_driver {
+ const struct fw_device_id *id_table;
+ };
+
+-static inline struct fw_driver *
+-fw_driver(struct device_driver *drv)
++static inline struct fw_driver *fw_driver(struct device_driver *drv)
+ {
+ return container_of(drv, struct fw_driver, driver);
+ }
+diff -Naurp linux-2.6-git/drivers/firewire/fw-iso.c firewire-git/drivers/firewire/fw-iso.c
+--- linux-2.6-git/drivers/firewire/fw-iso.c 2008-11-04 11:18:33.000000000 -0500
++++ firewire-git/drivers/firewire/fw-iso.c 2009-01-30 13:35:51.860646788 -0500
+@@ -1,5 +1,7 @@
+ /*
+- * Isochronous IO functionality
++ * Isochronous I/O functionality:
++ * - Isochronous DMA context management
++ * - Isochronous bus resource management (channels, bandwidth), client side
+ *
+ * Copyright (C) 2006 Kristian Hoegsberg <krh@bitplanet.net>
+ *
+@@ -18,21 +20,25 @@
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+-#include <linux/kernel.h>
+-#include <linux/module.h>
+ #include <linux/dma-mapping.h>
+-#include <linux/vmalloc.h>
++#include <linux/errno.h>
++#include <linux/firewire-constants.h>
++#include <linux/kernel.h>
+ #include <linux/mm.h>
++#include <linux/spinlock.h>
++#include <linux/vmalloc.h>
+
+-#include "fw-transaction.h"
+ #include "fw-topology.h"
+-#include "fw-device.h"
++#include "fw-transaction.h"
+
+-int
+-fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card,
+- int page_count, enum dma_data_direction direction)
++/*
++ * Isochronous DMA context management
++ */
++
++int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card,
++ int page_count, enum dma_data_direction direction)
+ {
+- int i, j, retval = -ENOMEM;
++ int i, j;
+ dma_addr_t address;
+
+ buffer->page_count = page_count;
+@@ -69,19 +75,19 @@ fw_iso_buffer_init(struct fw_iso_buffer
+ kfree(buffer->pages);
+ out:
+ buffer->pages = NULL;
+- return retval;
++ return -ENOMEM;
+ }
+
+ int fw_iso_buffer_map(struct fw_iso_buffer *buffer, struct vm_area_struct *vma)
+ {
+ unsigned long uaddr;
+- int i, retval;
++ int i, ret;
+
+ uaddr = vma->vm_start;
+ for (i = 0; i < buffer->page_count; i++) {
+- retval = vm_insert_page(vma, uaddr, buffer->pages[i]);
+- if (retval)
+- return retval;
++ ret = vm_insert_page(vma, uaddr, buffer->pages[i]);
++ if (ret)
++ return ret;
+ uaddr += PAGE_SIZE;
+ }
+
+@@ -105,14 +111,14 @@ void fw_iso_buffer_destroy(struct fw_iso
+ buffer->pages = NULL;
+ }
+
+-struct fw_iso_context *
+-fw_iso_context_create(struct fw_card *card, int type,
+- int channel, int speed, size_t header_size,
+- fw_iso_callback_t callback, void *callback_data)
++struct fw_iso_context *fw_iso_context_create(struct fw_card *card,
++ int type, int channel, int speed, size_t header_size,
++ fw_iso_callback_t callback, void *callback_data)
+ {
+ struct fw_iso_context *ctx;
+
+- ctx = card->driver->allocate_iso_context(card, type, header_size);
++ ctx = card->driver->allocate_iso_context(card,
++ type, channel, header_size);
+ if (IS_ERR(ctx))
+ return ctx;
+
+@@ -134,25 +140,186 @@ void fw_iso_context_destroy(struct fw_is
+ card->driver->free_iso_context(ctx);
+ }
+
+-int
+-fw_iso_context_start(struct fw_iso_context *ctx, int cycle, int sync, int tags)
++int fw_iso_context_start(struct fw_iso_context *ctx,
++ int cycle, int sync, int tags)
+ {
+ return ctx->card->driver->start_iso(ctx, cycle, sync, tags);
+ }
+
+-int
+-fw_iso_context_queue(struct fw_iso_context *ctx,
+- struct fw_iso_packet *packet,
+- struct fw_iso_buffer *buffer,
+- unsigned long payload)
++int fw_iso_context_queue(struct fw_iso_context *ctx,
++ struct fw_iso_packet *packet,
++ struct fw_iso_buffer *buffer,
++ unsigned long payload)
+ {
+ struct fw_card *card = ctx->card;
+
+ return card->driver->queue_iso(ctx, packet, buffer, payload);
+ }
+
+-int
+-fw_iso_context_stop(struct fw_iso_context *ctx)
++int fw_iso_context_stop(struct fw_iso_context *ctx)
+ {
+ return ctx->card->driver->stop_iso(ctx);
+ }
++
++/*
++ * Isochronous bus resource management (channels, bandwidth), client side
++ */
++
++static int manage_bandwidth(struct fw_card *card, int irm_id, int generation,
++ int bandwidth, bool allocate)
++{
++ __be32 data[2];
++ int try, new, old = allocate ? BANDWIDTH_AVAILABLE_INITIAL : 0;
++
++ /*
++ * On a 1394a IRM with low contention, try < 1 is enough.
++ * On a 1394-1995 IRM, we need at least try < 2.
++ * Let's just do try < 5.
++ */
++ for (try = 0; try < 5; try++) {
++ new = allocate ? old - bandwidth : old + bandwidth;
++ if (new < 0 || new > BANDWIDTH_AVAILABLE_INITIAL)
++ break;
++
++ data[0] = cpu_to_be32(old);
++ data[1] = cpu_to_be32(new);
++ switch (fw_run_transaction(card, TCODE_LOCK_COMPARE_SWAP,
++ irm_id, generation, SCODE_100,
++ CSR_REGISTER_BASE + CSR_BANDWIDTH_AVAILABLE,
++ data, sizeof(data))) {
++ case RCODE_GENERATION:
++ /* A generation change frees all bandwidth. */
++ return allocate ? -EAGAIN : bandwidth;
++
++ case RCODE_COMPLETE:
++ if (be32_to_cpup(data) == old)
++ return bandwidth;
++
++ old = be32_to_cpup(data);
++ /* Fall through. */
++ }
++ }
++
++ return -EIO;
++}
++
++static int manage_channel(struct fw_card *card, int irm_id, int generation,
++ u32 channels_mask, u64 offset, bool allocate)
++{
++ __be32 data[2], c, all, old;
++ int i, retry = 5;
++
++ old = all = allocate ? cpu_to_be32(~0) : 0;
++
++ for (i = 0; i < 32; i++) {
++ if (!(channels_mask & 1 << i))
++ continue;
++
++ c = cpu_to_be32(1 << (31 - i));
++ if ((old & c) != (all & c))
++ continue;
++
++ data[0] = old;
++ data[1] = old ^ c;
++ switch (fw_run_transaction(card, TCODE_LOCK_COMPARE_SWAP,
++ irm_id, generation, SCODE_100,
++ offset, data, sizeof(data))) {
++ case RCODE_GENERATION:
++ /* A generation change frees all channels. */
++ return allocate ? -EAGAIN : i;
++
++ case RCODE_COMPLETE:
++ if (data[0] == old)
++ return i;
++
++ old = data[0];
++
++ /* Is the IRM 1394a-2000 compliant? */
++ if ((data[0] & c) == (data[1] & c))
++ continue;
++
++ /* 1394-1995 IRM, fall through to retry. */
++ default:
++ if (retry--)
++ i--;
++ }
++ }
++
++ return -EIO;
++}
++
++static void deallocate_channel(struct fw_card *card, int irm_id,
++ int generation, int channel)
++{
++ u32 mask;
++ u64 offset;
++
++ mask = channel < 32 ? 1 << channel : 1 << (channel - 32);
++ offset = channel < 32 ? CSR_REGISTER_BASE + CSR_CHANNELS_AVAILABLE_HI :
++ CSR_REGISTER_BASE + CSR_CHANNELS_AVAILABLE_LO;
++
++ manage_channel(card, irm_id, generation, mask, offset, false);
++}
++
++/**
++ * fw_iso_resource_manage - Allocate or deallocate a channel and/or bandwidth
++ *
++ * In parameters: card, generation, channels_mask, bandwidth, allocate
++ * Out parameters: channel, bandwidth
++ * This function blocks (sleeps) during communication with the IRM.
++ *
++ * Allocates or deallocates at most one channel out of channels_mask.
++ * channels_mask is a bitfield with MSB for channel 63 and LSB for channel 0.
++ * (Note, the IRM's CHANNELS_AVAILABLE is a big-endian bitfield with MSB for
++ * channel 0 and LSB for channel 63.)
++ * Allocates or deallocates as many bandwidth allocation units as specified.
++ *
++ * Returns channel < 0 if no channel was allocated or deallocated.
++ * Returns bandwidth = 0 if no bandwidth was allocated or deallocated.
++ *
++ * If generation is stale, deallocations succeed but allocations fail with
++ * channel = -EAGAIN.
++ *
++ * If channel allocation fails, no bandwidth will be allocated either.
++ * If bandwidth allocation fails, no channel will be allocated either.
++ * But deallocations of channel and bandwidth are tried independently
++ * of each other's success.
++ */
++void fw_iso_resource_manage(struct fw_card *card, int generation,
++ u64 channels_mask, int *channel, int *bandwidth,
++ bool allocate)
++{
++ u32 channels_hi = channels_mask; /* channels 31...0 */
++ u32 channels_lo = channels_mask >> 32; /* channels 63...32 */
++ int irm_id, ret, c = -EINVAL;
++
++ spin_lock_irq(&card->lock);
++ irm_id = card->irm_node->node_id;
++ spin_unlock_irq(&card->lock);
++
++ if (channels_hi)
++ c = manage_channel(card, irm_id, generation, channels_hi,
++ CSR_REGISTER_BASE + CSR_CHANNELS_AVAILABLE_HI, allocate);
++ if (channels_lo && c < 0) {
++ c = manage_channel(card, irm_id, generation, channels_lo,
++ CSR_REGISTER_BASE + CSR_CHANNELS_AVAILABLE_LO, allocate);
++ if (c >= 0)
++ c += 32;
++ }
++ *channel = c;
++
++ if (allocate && channels_mask != 0 && c < 0)
++ *bandwidth = 0;
++
++ if (*bandwidth == 0)
++ return;
++
++ ret = manage_bandwidth(card, irm_id, generation, *bandwidth, allocate);
++ if (ret < 0)
++ *bandwidth = 0;
++
++ if (allocate && ret < 0 && c >= 0) {
++ deallocate_channel(card, irm_id, generation, c);
++ *channel = ret;
++ }
++}
+diff -Naurp linux-2.6-git/drivers/firewire/fw-ohci.c firewire-git/drivers/firewire/fw-ohci.c
+--- linux-2.6-git/drivers/firewire/fw-ohci.c 2009-01-30 13:39:02.990772025 -0500
++++ firewire-git/drivers/firewire/fw-ohci.c 2009-01-30 13:35:51.861646907 -0500
+@@ -205,6 +205,7 @@ struct fw_ohci {
+
+ u32 it_context_mask;
+ struct iso_context *it_context_list;
++ u64 ir_context_channels;
+ u32 ir_context_mask;
+ struct iso_context *ir_context_list;
+ };
+@@ -441,9 +442,8 @@ static inline void flush_writes(const st
+ reg_read(ohci, OHCI1394_Version);
+ }
+
+-static int
+-ohci_update_phy_reg(struct fw_card *card, int addr,
+- int clear_bits, int set_bits)
++static int ohci_update_phy_reg(struct fw_card *card, int addr,
++ int clear_bits, int set_bits)
+ {
+ struct fw_ohci *ohci = fw_ohci(card);
+ u32 val, old;
+@@ -658,8 +658,8 @@ static void ar_context_tasklet(unsigned
+ }
+ }
+
+-static int
+-ar_context_init(struct ar_context *ctx, struct fw_ohci *ohci, u32 regs)
++static int ar_context_init(struct ar_context *ctx,
++ struct fw_ohci *ohci, u32 regs)
+ {
+ struct ar_buffer ab;
+
+@@ -690,8 +690,7 @@ static void ar_context_run(struct ar_con
+ flush_writes(ctx->ohci);
+ }
+
+-static struct descriptor *
+-find_branch_descriptor(struct descriptor *d, int z)
++static struct descriptor *find_branch_descriptor(struct descriptor *d, int z)
+ {
+ int b, key;
+
+@@ -751,8 +750,7 @@ static void context_tasklet(unsigned lon
+ * Allocate a new buffer and add it to the list of free buffers for this
+ * context. Must be called with ohci->lock held.
+ */
+-static int
+-context_add_buffer(struct context *ctx)
++static int context_add_buffer(struct context *ctx)
+ {
+ struct descriptor_buffer *desc;
+ dma_addr_t uninitialized_var(bus_addr);
+@@ -781,9 +779,8 @@ context_add_buffer(struct context *ctx)
+ return 0;
+ }
+
+-static int
+-context_init(struct context *ctx, struct fw_ohci *ohci,
+- u32 regs, descriptor_callback_t callback)
++static int context_init(struct context *ctx, struct fw_ohci *ohci,
++ u32 regs, descriptor_callback_t callback)
+ {
+ ctx->ohci = ohci;
+ ctx->regs = regs;
+@@ -814,8 +811,7 @@ context_init(struct context *ctx, struct
+ return 0;
+ }
+
+-static void
+-context_release(struct context *ctx)
++static void context_release(struct context *ctx)
+ {
+ struct fw_card *card = &ctx->ohci->card;
+ struct descriptor_buffer *desc, *tmp;
+@@ -827,8 +823,8 @@ context_release(struct context *ctx)
+ }
+
+ /* Must be called with ohci->lock held */
+-static struct descriptor *
+-context_get_descriptors(struct context *ctx, int z, dma_addr_t *d_bus)
++static struct descriptor *context_get_descriptors(struct context *ctx,
++ int z, dma_addr_t *d_bus)
+ {
+ struct descriptor *d = NULL;
+ struct descriptor_buffer *desc = ctx->buffer_tail;
+@@ -912,8 +908,8 @@ struct driver_data {
+ * Must always be called with the ochi->lock held to ensure proper
+ * generation handling and locking around packet queue manipulation.
+ */
+-static int
+-at_context_queue_packet(struct context *ctx, struct fw_packet *packet)
++static int at_context_queue_packet(struct context *ctx,
++ struct fw_packet *packet)
+ {
+ struct fw_ohci *ohci = ctx->ohci;
+ dma_addr_t d_bus, uninitialized_var(payload_bus);
+@@ -1095,8 +1091,8 @@ static int handle_at_packet(struct conte
+ #define HEADER_GET_DATA_LENGTH(q) (((q) >> 16) & 0xffff)
+ #define HEADER_GET_EXTENDED_TCODE(q) (((q) >> 0) & 0xffff)
+
+-static void
+-handle_local_rom(struct fw_ohci *ohci, struct fw_packet *packet, u32 csr)
++static void handle_local_rom(struct fw_ohci *ohci,
++ struct fw_packet *packet, u32 csr)
+ {
+ struct fw_packet response;
+ int tcode, length, i;
+@@ -1122,8 +1118,8 @@ handle_local_rom(struct fw_ohci *ohci, s
+ fw_core_handle_response(&ohci->card, &response);
+ }
+
+-static void
+-handle_local_lock(struct fw_ohci *ohci, struct fw_packet *packet, u32 csr)
++static void handle_local_lock(struct fw_ohci *ohci,
++ struct fw_packet *packet, u32 csr)
+ {
+ struct fw_packet response;
+ int tcode, length, ext_tcode, sel;
+@@ -1164,8 +1160,7 @@ handle_local_lock(struct fw_ohci *ohci,
+ fw_core_handle_response(&ohci->card, &response);
+ }
+
+-static void
+-handle_local_request(struct context *ctx, struct fw_packet *packet)
++static void handle_local_request(struct context *ctx, struct fw_packet *packet)
+ {
+ u64 offset;
+ u32 csr;
+@@ -1205,11 +1200,10 @@ handle_local_request(struct context *ctx
+ }
+ }
+
+-static void
+-at_context_transmit(struct context *ctx, struct fw_packet *packet)
++static void at_context_transmit(struct context *ctx, struct fw_packet *packet)
+ {
+ unsigned long flags;
+- int retval;
++ int ret;
+
+ spin_lock_irqsave(&ctx->ohci->lock, flags);
+
+@@ -1220,10 +1214,10 @@ at_context_transmit(struct context *ctx,
+ return;
+ }
+
+- retval = at_context_queue_packet(ctx, packet);
++ ret = at_context_queue_packet(ctx, packet);
+ spin_unlock_irqrestore(&ctx->ohci->lock, flags);
+
+- if (retval < 0)
++ if (ret < 0)
+ packet->callback(packet, &ctx->ohci->card, packet->ack);
+
+ }
+@@ -1590,12 +1584,12 @@ static int ohci_enable(struct fw_card *c
+ return 0;
+ }
+
+-static int
+-ohci_set_config_rom(struct fw_card *card, u32 *config_rom, size_t length)
++static int ohci_set_config_rom(struct fw_card *card,
++ u32 *config_rom, size_t length)
+ {
+ struct fw_ohci *ohci;
+ unsigned long flags;
+- int retval = -EBUSY;
++ int ret = -EBUSY;
+ __be32 *next_config_rom;
+ dma_addr_t uninitialized_var(next_config_rom_bus);
+
+@@ -1649,7 +1643,7 @@ ohci_set_config_rom(struct fw_card *card
+
+ reg_write(ohci, OHCI1394_ConfigROMmap,
+ ohci->next_config_rom_bus);
+- retval = 0;
++ ret = 0;
+ }
+
+ spin_unlock_irqrestore(&ohci->lock, flags);
+@@ -1661,13 +1655,13 @@ ohci_set_config_rom(struct fw_card *card
+ * controller could need to access it before the bus reset
+ * takes effect.
+ */
+- if (retval == 0)
++ if (ret == 0)
+ fw_core_initiate_bus_reset(&ohci->card, 1);
+ else
+ dma_free_coherent(ohci->card.device, CONFIG_ROM_SIZE,
+ next_config_rom, next_config_rom_bus);
+
+- return retval;
++ return ret;
+ }
+
+ static void ohci_send_request(struct fw_card *card, struct fw_packet *packet)
+@@ -1689,7 +1683,7 @@ static int ohci_cancel_packet(struct fw_
+ struct fw_ohci *ohci = fw_ohci(card);
+ struct context *ctx = &ohci->at_request_ctx;
+ struct driver_data *driver_data = packet->driver_data;
+- int retval = -ENOENT;
++ int ret = -ENOENT;
+
+ tasklet_disable(&ctx->tasklet);
+
+@@ -1704,23 +1698,22 @@ static int ohci_cancel_packet(struct fw_
+ driver_data->packet = NULL;
+ packet->ack = RCODE_CANCELLED;
+ packet->callback(packet, &ohci->card, packet->ack);
+- retval = 0;
+-
++ ret = 0;
+ out:
+ tasklet_enable(&ctx->tasklet);
+
+- return retval;
++ return ret;
+ }
+
+-static int
+-ohci_enable_phys_dma(struct fw_card *card, int node_id, int generation)
++static int ohci_enable_phys_dma(struct fw_card *card,
++ int node_id, int generation)
+ {
+ #ifdef CONFIG_FIREWIRE_OHCI_REMOTE_DMA
+ return 0;
+ #else
+ struct fw_ohci *ohci = fw_ohci(card);
+ unsigned long flags;
+- int n, retval = 0;
++ int n, ret = 0;
+
+ /*
+ * FIXME: Make sure this bitmask is cleared when we clear the busReset
+@@ -1730,7 +1723,7 @@ ohci_enable_phys_dma(struct fw_card *car
+ spin_lock_irqsave(&ohci->lock, flags);
+
+ if (ohci->generation != generation) {
+- retval = -ESTALE;
++ ret = -ESTALE;
+ goto out;
+ }
+
+@@ -1748,12 +1741,12 @@ ohci_enable_phys_dma(struct fw_card *car
+ flush_writes(ohci);
+ out:
+ spin_unlock_irqrestore(&ohci->lock, flags);
+- return retval;
++
++ return ret;
+ #endif /* CONFIG_FIREWIRE_OHCI_REMOTE_DMA */
+ }
+
+-static u64
+-ohci_get_bus_time(struct fw_card *card)
++static u64 ohci_get_bus_time(struct fw_card *card)
+ {
+ struct fw_ohci *ohci = fw_ohci(card);
+ u32 cycle_time;
+@@ -1765,6 +1758,28 @@ ohci_get_bus_time(struct fw_card *card)
+ return bus_time;
+ }
+
++static void copy_iso_headers(struct iso_context *ctx, void *p)
++{
++ int i = ctx->header_length;
++
++ if (i + ctx->base.header_size > PAGE_SIZE)
++ return;
++
++ /*
++ * The iso header is byteswapped to little endian by
++ * the controller, but the remaining header quadlets
++ * are big endian. We want to present all the headers
++ * as big endian, so we have to swap the first quadlet.
++ */
++ if (ctx->base.header_size > 0)
++ *(u32 *) (ctx->header + i) = __swab32(*(u32 *) (p + 4));
++ if (ctx->base.header_size > 4)
++ *(u32 *) (ctx->header + i + 4) = __swab32(*(u32 *) p);
++ if (ctx->base.header_size > 8)
++ memcpy(ctx->header + i + 8, p + 8, ctx->base.header_size - 8);
++ ctx->header_length += ctx->base.header_size;
++}
++
+ static int handle_ir_dualbuffer_packet(struct context *context,
+ struct descriptor *d,
+ struct descriptor *last)
+@@ -1775,7 +1790,6 @@ static int handle_ir_dualbuffer_packet(s
+ __le32 *ir_header;
+ size_t header_length;
+ void *p, *end;
+- int i;
+
+ if (db->first_res_count != 0 && db->second_res_count != 0) {
+ if (ctx->excess_bytes <= le16_to_cpu(db->second_req_count)) {
+@@ -1788,25 +1802,14 @@ static int handle_ir_dualbuffer_packet(s
+ header_length = le16_to_cpu(db->first_req_count) -
+ le16_to_cpu(db->first_res_count);
+
+- i = ctx->header_length;
+ p = db + 1;
+ end = p + header_length;
+- while (p < end && i + ctx->base.header_size <= PAGE_SIZE) {
+- /*
+- * The iso header is byteswapped to little endian by
+- * the controller, but the remaining header quadlets
+- * are big endian. We want to present all the headers
+- * as big endian, so we have to swap the first
+- * quadlet.
+- */
+- *(u32 *) (ctx->header + i) = __swab32(*(u32 *) (p + 4));
+- memcpy(ctx->header + i + 4, p + 8, ctx->base.header_size - 4);
+- i += ctx->base.header_size;
++ while (p < end) {
++ copy_iso_headers(ctx, p);
+ ctx->excess_bytes +=
+ (le32_to_cpu(*(__le32 *)(p + 4)) >> 16) & 0xffff;
+- p += ctx->base.header_size + 4;
++ p += max(ctx->base.header_size, (size_t)8);
+ }
+- ctx->header_length = i;
+
+ ctx->excess_bytes -= le16_to_cpu(db->second_req_count) -
+ le16_to_cpu(db->second_res_count);
+@@ -1832,7 +1835,6 @@ static int handle_ir_packet_per_buffer(s
+ struct descriptor *pd;
+ __le32 *ir_header;
+ void *p;
+- int i;
+
+ for (pd = d; pd <= last; pd++) {
+ if (pd->transfer_status)
+@@ -1842,21 +1844,8 @@ static int handle_ir_packet_per_buffer(s
+ /* Descriptor(s) not done yet, stop iteration */
+ return 0;
+
+- i = ctx->header_length;
+- p = last + 1;
+-
+- if (ctx->base.header_size > 0 &&
+- i + ctx->base.header_size <= PAGE_SIZE) {
+- /*
+- * The iso header is byteswapped to little endian by
+- * the controller, but the remaining header quadlets
+- * are big endian. We want to present all the headers
+- * as big endian, so we have to swap the first quadlet.
+- */
+- *(u32 *) (ctx->header + i) = __swab32(*(u32 *) (p + 4));
+- memcpy(ctx->header + i + 4, p + 8, ctx->base.header_size - 4);
+- ctx->header_length += ctx->base.header_size;
+- }
++ p = last + 1;
++ copy_iso_headers(ctx, p);
+
+ if (le16_to_cpu(last->control) & DESCRIPTOR_IRQ_ALWAYS) {
+ ir_header = (__le32 *) p;
+@@ -1888,21 +1877,24 @@ static int handle_it_packet(struct conte
+ return 1;
+ }
+
+-static struct fw_iso_context *
+-ohci_allocate_iso_context(struct fw_card *card, int type, size_t header_size)
++static struct fw_iso_context *ohci_allocate_iso_context(struct fw_card *card,
++ int type, int channel, size_t header_size)
+ {
+ struct fw_ohci *ohci = fw_ohci(card);
+ struct iso_context *ctx, *list;
+ descriptor_callback_t callback;
++ u64 *channels, dont_care = ~0ULL;
+ u32 *mask, regs;
+ unsigned long flags;
+- int index, retval = -ENOMEM;
++ int index, ret = -ENOMEM;
+
+ if (type == FW_ISO_CONTEXT_TRANSMIT) {
++ channels = &dont_care;
+ mask = &ohci->it_context_mask;
+ list = ohci->it_context_list;
+ callback = handle_it_packet;
+ } else {
++ channels = &ohci->ir_context_channels;
+ mask = &ohci->ir_context_mask;
+ list = ohci->ir_context_list;
+ if (ohci->use_dualbuffer)
+@@ -1912,9 +1904,11 @@ ohci_allocate_iso_context(struct fw_card
+ }
+
+ spin_lock_irqsave(&ohci->lock, flags);
+- index = ffs(*mask) - 1;
+- if (index >= 0)
++ index = *channels & 1ULL << channel ? ffs(*mask) - 1 : -1;
++ if (index >= 0) {
++ *channels &= ~(1ULL << channel);
+ *mask &= ~(1 << index);
++ }
+ spin_unlock_irqrestore(&ohci->lock, flags);
+
+ if (index < 0)
+@@ -1932,8 +1926,8 @@ ohci_allocate_iso_context(struct fw_card
+ if (ctx->header == NULL)
+ goto out;
+
+- retval = context_init(&ctx->context, ohci, regs, callback);
+- if (retval < 0)
++ ret = context_init(&ctx->context, ohci, regs, callback);
++ if (ret < 0)
+ goto out_with_header;
+
+ return &ctx->base;
+@@ -1945,7 +1939,7 @@ ohci_allocate_iso_context(struct fw_card
+ *mask |= 1 << index;
+ spin_unlock_irqrestore(&ohci->lock, flags);
+
+- return ERR_PTR(retval);
++ return ERR_PTR(ret);
+ }
+
+ static int ohci_start_iso(struct fw_iso_context *base,
+@@ -2024,16 +2018,16 @@ static void ohci_free_iso_context(struct
+ } else {
+ index = ctx - ohci->ir_context_list;
+ ohci->ir_context_mask |= 1 << index;
++ ohci->ir_context_channels |= 1ULL << base->channel;
+ }
+
+ spin_unlock_irqrestore(&ohci->lock, flags);
+ }
+
+-static int
+-ohci_queue_iso_transmit(struct fw_iso_context *base,
+- struct fw_iso_packet *packet,
+- struct fw_iso_buffer *buffer,
+- unsigned long payload)
++static int ohci_queue_iso_transmit(struct fw_iso_context *base,
++ struct fw_iso_packet *packet,
++ struct fw_iso_buffer *buffer,
++ unsigned long payload)
+ {
+ struct iso_context *ctx = container_of(base, struct iso_context, base);
+ struct descriptor *d, *last, *pd;
+@@ -2128,11 +2122,10 @@ ohci_queue_iso_transmit(struct fw_iso_co
+ return 0;
+ }
+
+-static int
+-ohci_queue_iso_receive_dualbuffer(struct fw_iso_context *base,
+- struct fw_iso_packet *packet,
+- struct fw_iso_buffer *buffer,
+- unsigned long payload)
++static int ohci_queue_iso_receive_dualbuffer(struct fw_iso_context *base,
++ struct fw_iso_packet *packet,
++ struct fw_iso_buffer *buffer,
++ unsigned long payload)
+ {
+ struct iso_context *ctx = container_of(base, struct iso_context, base);
+ struct db_descriptor *db = NULL;
+@@ -2151,11 +2144,11 @@ ohci_queue_iso_receive_dualbuffer(struct
+ z = 2;
+
+ /*
+- * The OHCI controller puts the status word in the header
+- * buffer too, so we need 4 extra bytes per packet.
++ * The OHCI controller puts the isochronous header and trailer in the
++ * buffer, so we need at least 8 bytes.
+ */
+ packet_count = p->header_length / ctx->base.header_size;
+- header_size = packet_count * (ctx->base.header_size + 4);
++ header_size = packet_count * max(ctx->base.header_size, (size_t)8);
+
+ /* Get header size in number of descriptors. */
+ header_z = DIV_ROUND_UP(header_size, sizeof(*d));
+@@ -2173,7 +2166,8 @@ ohci_queue_iso_receive_dualbuffer(struct
+ db = (struct db_descriptor *) d;
+ db->control = cpu_to_le16(DESCRIPTOR_STATUS |
+ DESCRIPTOR_BRANCH_ALWAYS);
+- db->first_size = cpu_to_le16(ctx->base.header_size + 4);
++ db->first_size =
++ cpu_to_le16(max(ctx->base.header_size, (size_t)8));
+ if (p->skip && rest == p->payload_length) {
+ db->control |= cpu_to_le16(DESCRIPTOR_WAIT);
+ db->first_req_count = db->first_size;
+@@ -2208,11 +2202,10 @@ ohci_queue_iso_receive_dualbuffer(struct
+ return 0;
+ }
+
+-static int
+-ohci_queue_iso_receive_packet_per_buffer(struct fw_iso_context *base,
+- struct fw_iso_packet *packet,
+- struct fw_iso_buffer *buffer,
+- unsigned long payload)
++static int ohci_queue_iso_receive_packet_per_buffer(struct fw_iso_context *base,
++ struct fw_iso_packet *packet,
++ struct fw_iso_buffer *buffer,
++ unsigned long payload)
+ {
+ struct iso_context *ctx = container_of(base, struct iso_context, base);
+ struct descriptor *d = NULL, *pd = NULL;
+@@ -2223,11 +2216,11 @@ ohci_queue_iso_receive_packet_per_buffer
+ int page, offset, packet_count, header_size, payload_per_buffer;
+
+ /*
+- * The OHCI controller puts the status word in the
+- * buffer too, so we need 4 extra bytes per packet.
++ * The OHCI controller puts the isochronous header and trailer in the
++ * buffer, so we need at least 8 bytes.
+ */
+ packet_count = p->header_length / ctx->base.header_size;
+- header_size = ctx->base.header_size + 4;
++ header_size = max(ctx->base.header_size, (size_t)8);
+
+ /* Get header size in number of descriptors. */
+ header_z = DIV_ROUND_UP(header_size, sizeof(*d));
+@@ -2286,29 +2279,27 @@ ohci_queue_iso_receive_packet_per_buffer
+ return 0;
+ }
+
+-static int
+-ohci_queue_iso(struct fw_iso_context *base,
+- struct fw_iso_packet *packet,
+- struct fw_iso_buffer *buffer,
+- unsigned long payload)
++static int ohci_queue_iso(struct fw_iso_context *base,
++ struct fw_iso_packet *packet,
++ struct fw_iso_buffer *buffer,
++ unsigned long payload)
+ {
+ struct iso_context *ctx = container_of(base, struct iso_context, base);
+ unsigned long flags;
+- int retval;
++ int ret;
+
+ spin_lock_irqsave(&ctx->context.ohci->lock, flags);
+ if (base->type == FW_ISO_CONTEXT_TRANSMIT)
+- retval = ohci_queue_iso_transmit(base, packet, buffer, payload);
++ ret = ohci_queue_iso_transmit(base, packet, buffer, payload);
+ else if (ctx->context.ohci->use_dualbuffer)
+- retval = ohci_queue_iso_receive_dualbuffer(base, packet,
+- buffer, payload);
++ ret = ohci_queue_iso_receive_dualbuffer(base, packet,
++ buffer, payload);
+ else
+- retval = ohci_queue_iso_receive_packet_per_buffer(base, packet,
+- buffer,
+- payload);
++ ret = ohci_queue_iso_receive_packet_per_buffer(base, packet,
++ buffer, payload);
+ spin_unlock_irqrestore(&ctx->context.ohci->lock, flags);
+
+- return retval;
++ return ret;
+ }
+
+ static const struct fw_card_driver ohci_driver = {
+@@ -2357,8 +2348,8 @@ static void ohci_pmac_off(struct pci_dev
+ #define ohci_pmac_off(dev)
+ #endif /* CONFIG_PPC_PMAC */
+
+-static int __devinit
+-pci_probe(struct pci_dev *dev, const struct pci_device_id *ent)
++static int __devinit pci_probe(struct pci_dev *dev,
++ const struct pci_device_id *ent)
+ {
+ struct fw_ohci *ohci;
+ u32 bus_options, max_receive, link_speed, version;
+@@ -2440,6 +2431,7 @@ pci_probe(struct pci_dev *dev, const str
+ ohci->it_context_list = kzalloc(size, GFP_KERNEL);
+
+ reg_write(ohci, OHCI1394_IsoXmitIntMaskSet, ~0);
++ ohci->ir_context_channels = ~0ULL;
+ ohci->ir_context_mask = reg_read(ohci, OHCI1394_IsoXmitIntMaskSet);
+ reg_write(ohci, OHCI1394_IsoXmitIntMaskClear, ~0);
+ size = sizeof(struct iso_context) * hweight32(ohci->ir_context_mask);
+diff -Naurp linux-2.6-git/drivers/firewire/fw-sbp2.c firewire-git/drivers/firewire/fw-sbp2.c
+--- linux-2.6-git/drivers/firewire/fw-sbp2.c 2009-01-30 13:39:02.991771976 -0500
++++ firewire-git/drivers/firewire/fw-sbp2.c 2009-01-30 13:35:51.861646907 -0500
+@@ -392,20 +392,18 @@ static const struct {
+ }
+ };
+
+-static void
+-free_orb(struct kref *kref)
++static void free_orb(struct kref *kref)
+ {
+ struct sbp2_orb *orb = container_of(kref, struct sbp2_orb, kref);
+
+ kfree(orb);
+ }
+
+-static void
+-sbp2_status_write(struct fw_card *card, struct fw_request *request,
+- int tcode, int destination, int source,
+- int generation, int speed,
+- unsigned long long offset,
+- void *payload, size_t length, void *callback_data)
++static void sbp2_status_write(struct fw_card *card, struct fw_request *request,
++ int tcode, int destination, int source,
++ int generation, int speed,
++ unsigned long long offset,
++ void *payload, size_t length, void *callback_data)
+ {
+ struct sbp2_logical_unit *lu = callback_data;
+ struct sbp2_orb *orb;
+@@ -451,9 +449,8 @@ sbp2_status_write(struct fw_card *card,
+ fw_send_response(card, request, RCODE_COMPLETE);
+ }
+
+-static void
+-complete_transaction(struct fw_card *card, int rcode,
+- void *payload, size_t length, void *data)
++static void complete_transaction(struct fw_card *card, int rcode,
++ void *payload, size_t length, void *data)
+ {
+ struct sbp2_orb *orb = data;
+ unsigned long flags;
+@@ -482,9 +479,8 @@ complete_transaction(struct fw_card *car
+ kref_put(&orb->kref, free_orb);
+ }
+
+-static void
+-sbp2_send_orb(struct sbp2_orb *orb, struct sbp2_logical_unit *lu,
+- int node_id, int generation, u64 offset)
++static void sbp2_send_orb(struct sbp2_orb *orb, struct sbp2_logical_unit *lu,
++ int node_id, int generation, u64 offset)
+ {
+ struct fw_device *device = fw_device(lu->tgt->unit->device.parent);
+ unsigned long flags;
+@@ -531,8 +527,8 @@ static int sbp2_cancel_orbs(struct sbp2_
+ return retval;
+ }
+
+-static void
+-complete_management_orb(struct sbp2_orb *base_orb, struct sbp2_status *status)
++static void complete_management_orb(struct sbp2_orb *base_orb,
++ struct sbp2_status *status)
+ {
+ struct sbp2_management_orb *orb =
+ container_of(base_orb, struct sbp2_management_orb, base);
+@@ -542,10 +538,9 @@ complete_management_orb(struct sbp2_orb
+ complete(&orb->done);
+ }
+
+-static int
+-sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id,
+- int generation, int function, int lun_or_login_id,
+- void *response)
++static int sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id,
++ int generation, int function,
++ int lun_or_login_id, void *response)
+ {
+ struct fw_device *device = fw_device(lu->tgt->unit->device.parent);
+ struct sbp2_management_orb *orb;
+@@ -652,9 +647,8 @@ static void sbp2_agent_reset(struct sbp2
+ &d, sizeof(d));
+ }
+
+-static void
+-complete_agent_reset_write_no_wait(struct fw_card *card, int rcode,
+- void *payload, size_t length, void *data)
++static void complete_agent_reset_write_no_wait(struct fw_card *card,
++ int rcode, void *payload, size_t length, void *data)
+ {
+ kfree(data);
+ }
+@@ -1299,8 +1293,7 @@ static void sbp2_unmap_scatterlist(struc
+ sizeof(orb->page_table), DMA_TO_DEVICE);
+ }
+
+-static unsigned int
+-sbp2_status_to_sense_data(u8 *sbp2_status, u8 *sense_data)
++static unsigned int sbp2_status_to_sense_data(u8 *sbp2_status, u8 *sense_data)
+ {
+ int sam_status;
+
+@@ -1337,8 +1330,8 @@ sbp2_status_to_sense_data(u8 *sbp2_statu
+ }
+ }
+
+-static void
+-complete_command_orb(struct sbp2_orb *base_orb, struct sbp2_status *status)
++static void complete_command_orb(struct sbp2_orb *base_orb,
++ struct sbp2_status *status)
+ {
+ struct sbp2_command_orb *orb =
+ container_of(base_orb, struct sbp2_command_orb, base);
+@@ -1384,9 +1377,8 @@ complete_command_orb(struct sbp2_orb *ba
+ orb->done(orb->cmd);
+ }
+
+-static int
+-sbp2_map_scatterlist(struct sbp2_command_orb *orb, struct fw_device *device,
+- struct sbp2_logical_unit *lu)
++static int sbp2_map_scatterlist(struct sbp2_command_orb *orb,
++ struct fw_device *device, struct sbp2_logical_unit *lu)
+ {
+ struct scatterlist *sg = scsi_sglist(orb->cmd);
+ int i, n;
+@@ -1584,9 +1576,8 @@ static int sbp2_scsi_abort(struct scsi_c
+ * This is the concatenation of target port identifier and logical unit
+ * identifier as per SAM-2...SAM-4 annex A.
+ */
+-static ssize_t
+-sbp2_sysfs_ieee1394_id_show(struct device *dev, struct device_attribute *attr,
+- char *buf)
++static ssize_t sbp2_sysfs_ieee1394_id_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
+ {
+ struct scsi_device *sdev = to_scsi_device(dev);
+ struct sbp2_logical_unit *lu;
+diff -Naurp linux-2.6-git/drivers/firewire/fw-topology.c firewire-git/drivers/firewire/fw-topology.c
+--- linux-2.6-git/drivers/firewire/fw-topology.c 2009-01-30 13:39:02.991771976 -0500
++++ firewire-git/drivers/firewire/fw-topology.c 2009-01-30 13:35:51.862647087 -0500
+@@ -314,9 +314,8 @@ typedef void (*fw_node_callback_t)(struc
+ struct fw_node * node,
+ struct fw_node * parent);
+
+-static void
+-for_each_fw_node(struct fw_card *card, struct fw_node *root,
+- fw_node_callback_t callback)
++static void for_each_fw_node(struct fw_card *card, struct fw_node *root,
++ fw_node_callback_t callback)
+ {
+ struct list_head list;
+ struct fw_node *node, *next, *child, *parent;
+@@ -349,9 +348,8 @@ for_each_fw_node(struct fw_card *card, s
+ fw_node_put(node);
+ }
+
+-static void
+-report_lost_node(struct fw_card *card,
+- struct fw_node *node, struct fw_node *parent)
++static void report_lost_node(struct fw_card *card,
++ struct fw_node *node, struct fw_node *parent)
+ {
+ fw_node_event(card, node, FW_NODE_DESTROYED);
+ fw_node_put(node);
+@@ -360,9 +358,8 @@ report_lost_node(struct fw_card *card,
+ card->bm_retries = 0;
+ }
+
+-static void
+-report_found_node(struct fw_card *card,
+- struct fw_node *node, struct fw_node *parent)
++static void report_found_node(struct fw_card *card,
++ struct fw_node *node, struct fw_node *parent)
+ {
+ int b_path = (node->phy_speed == SCODE_BETA);
+
+@@ -415,8 +412,7 @@ static void move_tree(struct fw_node *no
+ * found, lost or updated. Update the nodes in the card topology tree
+ * as we go.
+ */
+-static void
+-update_tree(struct fw_card *card, struct fw_node *root)
++static void update_tree(struct fw_card *card, struct fw_node *root)
+ {
+ struct list_head list0, list1;
+ struct fw_node *node0, *node1, *next1;
+@@ -497,8 +493,8 @@ update_tree(struct fw_card *card, struct
+ }
+ }
+
+-static void
+-update_topology_map(struct fw_card *card, u32 *self_ids, int self_id_count)
++static void update_topology_map(struct fw_card *card,
++ u32 *self_ids, int self_id_count)
+ {
+ int node_count;
+
+@@ -510,10 +506,8 @@ update_topology_map(struct fw_card *card
+ fw_compute_block_crc(card->topology_map);
+ }
+
+-void
+-fw_core_handle_bus_reset(struct fw_card *card,
+- int node_id, int generation,
+- int self_id_count, u32 * self_ids)
++void fw_core_handle_bus_reset(struct fw_card *card, int node_id, int generation,
++ int self_id_count, u32 *self_ids)
+ {
+ struct fw_node *local_node;
+ unsigned long flags;
+diff -Naurp linux-2.6-git/drivers/firewire/fw-topology.h firewire-git/drivers/firewire/fw-topology.h
+--- linux-2.6-git/drivers/firewire/fw-topology.h 2008-11-04 11:18:33.000000000 -0500
++++ firewire-git/drivers/firewire/fw-topology.h 2009-01-30 13:35:51.862647087 -0500
+@@ -19,6 +19,11 @@
+ #ifndef __fw_topology_h
+ #define __fw_topology_h
+
++#include <linux/list.h>
++#include <linux/slab.h>
++
++#include <asm/atomic.h>
++
+ enum {
+ FW_NODE_CREATED,
+ FW_NODE_UPDATED,
+@@ -51,26 +56,22 @@ struct fw_node {
+ struct fw_node *ports[0];
+ };
+
+-static inline struct fw_node *
+-fw_node_get(struct fw_node *node)
++static inline struct fw_node *fw_node_get(struct fw_node *node)
+ {
+ atomic_inc(&node->ref_count);
+
+ return node;
+ }
+
+-static inline void
+-fw_node_put(struct fw_node *node)
++static inline void fw_node_put(struct fw_node *node)
+ {
+ if (atomic_dec_and_test(&node->ref_count))
+ kfree(node);
+ }
+
+-void
+-fw_destroy_nodes(struct fw_card *card);
+-
+-int
+-fw_compute_block_crc(u32 *block);
++struct fw_card;
++void fw_destroy_nodes(struct fw_card *card);
+
++int fw_compute_block_crc(u32 *block);
+
+ #endif /* __fw_topology_h */
+diff -Naurp linux-2.6-git/drivers/firewire/fw-transaction.c firewire-git/drivers/firewire/fw-transaction.c
+--- linux-2.6-git/drivers/firewire/fw-transaction.c 2009-01-30 13:39:02.991771976 -0500
++++ firewire-git/drivers/firewire/fw-transaction.c 2009-01-30 13:35:51.862647087 -0500
+@@ -64,10 +64,9 @@
+ #define PHY_CONFIG_ROOT_ID(node_id) ((((node_id) & 0x3f) << 24) | (1 << 23))
+ #define PHY_IDENTIFIER(id) ((id) << 30)
+
+-static int
+-close_transaction(struct fw_transaction *transaction,
+- struct fw_card *card, int rcode,
+- u32 *payload, size_t length)
++static int close_transaction(struct fw_transaction *transaction,
++ struct fw_card *card, int rcode,
++ u32 *payload, size_t length)
+ {
+ struct fw_transaction *t;
+ unsigned long flags;
+@@ -94,9 +93,8 @@ close_transaction(struct fw_transaction
+ * Only valid for transactions that are potentially pending (ie have
+ * been sent).
+ */
+-int
+-fw_cancel_transaction(struct fw_card *card,
+- struct fw_transaction *transaction)
++int fw_cancel_transaction(struct fw_card *card,
++ struct fw_transaction *transaction)
+ {
+ /*
+ * Cancel the packet transmission if it's still queued. That
+@@ -116,9 +114,8 @@ fw_cancel_transaction(struct fw_card *ca
+ }
+ EXPORT_SYMBOL(fw_cancel_transaction);
+
+-static void
+-transmit_complete_callback(struct fw_packet *packet,
+- struct fw_card *card, int status)
++static void transmit_complete_callback(struct fw_packet *packet,
++ struct fw_card *card, int status)
+ {
+ struct fw_transaction *t =
+ container_of(packet, struct fw_transaction, packet);
+@@ -151,8 +148,7 @@ transmit_complete_callback(struct fw_pac
+ }
+ }
+
+-static void
+-fw_fill_request(struct fw_packet *packet, int tcode, int tlabel,
++static void fw_fill_request(struct fw_packet *packet, int tcode, int tlabel,
+ int destination_id, int source_id, int generation, int speed,
+ unsigned long long offset, void *payload, size_t length)
+ {
+@@ -247,12 +243,10 @@ fw_fill_request(struct fw_packet *packet
+ * @param callback_data pointer to arbitrary data, which will be
+ * passed to the callback
+ */
+-void
+-fw_send_request(struct fw_card *card, struct fw_transaction *t,
+- int tcode, int destination_id, int generation, int speed,
+- unsigned long long offset,
+- void *payload, size_t length,
+- fw_transaction_callback_t callback, void *callback_data)
++void fw_send_request(struct fw_card *card, struct fw_transaction *t, int tcode,
++ int destination_id, int generation, int speed,
++ unsigned long long offset, void *payload, size_t length,
++ fw_transaction_callback_t callback, void *callback_data)
+ {
+ unsigned long flags;
+ int tlabel;
+@@ -322,8 +316,8 @@ static void transaction_callback(struct
+ * Returns the RCODE.
+ */
+ int fw_run_transaction(struct fw_card *card, int tcode, int destination_id,
+- int generation, int speed, unsigned long long offset,
+- void *data, size_t length)
++ int generation, int speed, unsigned long long offset,
++ void *data, size_t length)
+ {
+ struct transaction_callback_data d;
+ struct fw_transaction t;
+@@ -399,9 +393,8 @@ void fw_flush_transactions(struct fw_car
+ }
+ }
+
+-static struct fw_address_handler *
+-lookup_overlapping_address_handler(struct list_head *list,
+- unsigned long long offset, size_t length)
++static struct fw_address_handler *lookup_overlapping_address_handler(
++ struct list_head *list, unsigned long long offset, size_t length)
+ {
+ struct fw_address_handler *handler;
+
+@@ -414,9 +407,8 @@ lookup_overlapping_address_handler(struc
+ return NULL;
+ }
+
+-static struct fw_address_handler *
+-lookup_enclosing_address_handler(struct list_head *list,
+- unsigned long long offset, size_t length)
++static struct fw_address_handler *lookup_enclosing_address_handler(
++ struct list_head *list, unsigned long long offset, size_t length)
+ {
+ struct fw_address_handler *handler;
+
+@@ -449,36 +441,44 @@ const struct fw_address_region fw_unit_s
+ #endif /* 0 */
+
+ /**
+- * Allocate a range of addresses in the node space of the OHCI
+- * controller. When a request is received that falls within the
+- * specified address range, the specified callback is invoked. The
+- * parameters passed to the callback give the details of the
+- * particular request.
++ * fw_core_add_address_handler - register for incoming requests
++ * @handler: callback
++ * @region: region in the IEEE 1212 node space address range
++ *
++ * region->start, ->end, and handler->length have to be quadlet-aligned.
++ *
++ * When a request is received that falls within the specified address range,
++ * the specified callback is invoked. The parameters passed to the callback
++ * give the details of the particular request.
+ *
+ * Return value: 0 on success, non-zero otherwise.
+ * The start offset of the handler's address region is determined by
+ * fw_core_add_address_handler() and is returned in handler->offset.
+- * The offset is quadlet-aligned.
+ */
+-int
+-fw_core_add_address_handler(struct fw_address_handler *handler,
+- const struct fw_address_region *region)
++int fw_core_add_address_handler(struct fw_address_handler *handler,
++ const struct fw_address_region *region)
+ {
+ struct fw_address_handler *other;
+ unsigned long flags;
+ int ret = -EBUSY;
+
++ if (region->start & 0xffff000000000003ULL ||
++ region->end & 0xffff000000000003ULL ||
++ region->start >= region->end ||
++ handler->length & 3 ||
++ handler->length == 0)
++ return -EINVAL;
++
+ spin_lock_irqsave(&address_handler_lock, flags);
+
+- handler->offset = roundup(region->start, 4);
++ handler->offset = region->start;
+ while (handler->offset + handler->length <= region->end) {
+ other =
+ lookup_overlapping_address_handler(&address_handler_list,
+ handler->offset,
+ handler->length);
+ if (other != NULL) {
+- handler->offset =
+- roundup(other->offset + other->length, 4);
++ handler->offset += other->length;
+ } else {
+ list_add_tail(&handler->link, &address_handler_list);
+ ret = 0;
+@@ -493,12 +493,7 @@ fw_core_add_address_handler(struct fw_ad
+ EXPORT_SYMBOL(fw_core_add_address_handler);
+
+ /**
+- * Deallocate a range of addresses allocated with fw_allocate. This
+- * will call the associated callback one last time with a the special
+- * tcode TCODE_DEALLOCATE, to let the client destroy the registered
+- * callback data. For convenience, the callback parameters offset and
+- * length are set to the start and the length respectively for the
+- * deallocated region, payload is set to NULL.
++ * fw_core_remove_address_handler - unregister an address handler
+ */
+ void fw_core_remove_address_handler(struct fw_address_handler *handler)
+ {
+@@ -518,9 +513,8 @@ struct fw_request {
+ u32 data[0];
+ };
+
+-static void
+-free_response_callback(struct fw_packet *packet,
+- struct fw_card *card, int status)
++static void free_response_callback(struct fw_packet *packet,
++ struct fw_card *card, int status)
+ {
+ struct fw_request *request;
+
+@@ -528,9 +522,8 @@ free_response_callback(struct fw_packet
+ kfree(request);
+ }
+
+-void
+-fw_fill_response(struct fw_packet *response, u32 *request_header,
+- int rcode, void *payload, size_t length)
++void fw_fill_response(struct fw_packet *response, u32 *request_header,
++ int rcode, void *payload, size_t length)
+ {
+ int tcode, tlabel, extended_tcode, source, destination;
+
+@@ -588,8 +581,7 @@ fw_fill_response(struct fw_packet *respo
+ }
+ EXPORT_SYMBOL(fw_fill_response);
+
+-static struct fw_request *
+-allocate_request(struct fw_packet *p)
++static struct fw_request *allocate_request(struct fw_packet *p)
+ {
+ struct fw_request *request;
+ u32 *data, length;
+@@ -649,8 +641,8 @@ allocate_request(struct fw_packet *p)
+ return request;
+ }
+
+-void
+-fw_send_response(struct fw_card *card, struct fw_request *request, int rcode)
++void fw_send_response(struct fw_card *card,
++ struct fw_request *request, int rcode)
+ {
+ /* unified transaction or broadcast transaction: don't respond */
+ if (request->ack != ACK_PENDING ||
+@@ -670,8 +662,7 @@ fw_send_response(struct fw_card *card, s
+ }
+ EXPORT_SYMBOL(fw_send_response);
+
+-void
+-fw_core_handle_request(struct fw_card *card, struct fw_packet *p)
++void fw_core_handle_request(struct fw_card *card, struct fw_packet *p)
+ {
+ struct fw_address_handler *handler;
+ struct fw_request *request;
+@@ -719,8 +710,7 @@ fw_core_handle_request(struct fw_card *c
+ }
+ EXPORT_SYMBOL(fw_core_handle_request);
+
+-void
+-fw_core_handle_response(struct fw_card *card, struct fw_packet *p)
++void fw_core_handle_response(struct fw_card *card, struct fw_packet *p)
+ {
+ struct fw_transaction *t;
+ unsigned long flags;
+@@ -793,12 +783,10 @@ static const struct fw_address_region to
+ { .start = CSR_REGISTER_BASE | CSR_TOPOLOGY_MAP,
+ .end = CSR_REGISTER_BASE | CSR_TOPOLOGY_MAP_END, };
+
+-static void
+-handle_topology_map(struct fw_card *card, struct fw_request *request,
+- int tcode, int destination, int source,
+- int generation, int speed,
+- unsigned long long offset,
+- void *payload, size_t length, void *callback_data)
++static void handle_topology_map(struct fw_card *card, struct fw_request *request,
++ int tcode, int destination, int source, int generation,
++ int speed, unsigned long long offset,
++ void *payload, size_t length, void *callback_data)
+ {
+ int i, start, end;
+ __be32 *map;
+@@ -832,12 +820,10 @@ static const struct fw_address_region re
+ { .start = CSR_REGISTER_BASE,
+ .end = CSR_REGISTER_BASE | CSR_CONFIG_ROM, };
+
+-static void
+-handle_registers(struct fw_card *card, struct fw_request *request,
+- int tcode, int destination, int source,
+- int generation, int speed,
+- unsigned long long offset,
+- void *payload, size_t length, void *callback_data)
++static void handle_registers(struct fw_card *card, struct fw_request *request,
++ int tcode, int destination, int source, int generation,
++ int speed, unsigned long long offset,
++ void *payload, size_t length, void *callback_data)
+ {
+ int reg = offset & ~CSR_REGISTER_BASE;
+ unsigned long long bus_time;
+@@ -939,11 +925,11 @@ static struct fw_descriptor model_id_des
+
+ static int __init fw_core_init(void)
+ {
+- int retval;
++ int ret;
+
+- retval = bus_register(&fw_bus_type);
+- if (retval < 0)
+- return retval;
++ ret = bus_register(&fw_bus_type);
++ if (ret < 0)
++ return ret;
+
+ fw_cdev_major = register_chrdev(0, "firewire", &fw_device_ops);
+ if (fw_cdev_major < 0) {
+@@ -951,19 +937,10 @@ static int __init fw_core_init(void)
+ return fw_cdev_major;
+ }
+
+- retval = fw_core_add_address_handler(&topology_map,
+- &topology_map_region);
+- BUG_ON(retval < 0);
+-
+- retval = fw_core_add_address_handler(&registers,
+- &registers_region);
+- BUG_ON(retval < 0);
+-
+- /* Add the vendor textual descriptor. */
+- retval = fw_core_add_descriptor(&vendor_id_descriptor);
+- BUG_ON(retval < 0);
+- retval = fw_core_add_descriptor(&model_id_descriptor);
+- BUG_ON(retval < 0);
++ fw_core_add_address_handler(&topology_map, &topology_map_region);
++ fw_core_add_address_handler(&registers, &registers_region);
++ fw_core_add_descriptor(&vendor_id_descriptor);
++ fw_core_add_descriptor(&model_id_descriptor);
+
+ return 0;
+ }
+diff -Naurp linux-2.6-git/drivers/firewire/fw-transaction.h firewire-git/drivers/firewire/fw-transaction.h
+--- linux-2.6-git/drivers/firewire/fw-transaction.h 2009-01-30 13:39:02.992772636 -0500
++++ firewire-git/drivers/firewire/fw-transaction.h 2009-01-30 13:35:51.862647087 -0500
+@@ -82,14 +82,14 @@
+ #define CSR_SPEED_MAP 0x2000
+ #define CSR_SPEED_MAP_END 0x3000
+
++#define BANDWIDTH_AVAILABLE_INITIAL 4915
+ #define BROADCAST_CHANNEL_INITIAL (1 << 31 | 31)
+ #define BROADCAST_CHANNEL_VALID (1 << 30)
+
+ #define fw_notify(s, args...) printk(KERN_NOTICE KBUILD_MODNAME ": " s, ## args)
+ #define fw_error(s, args...) printk(KERN_ERR KBUILD_MODNAME ": " s, ## args)
+
+-static inline void
+-fw_memcpy_from_be32(void *_dst, void *_src, size_t size)
++static inline void fw_memcpy_from_be32(void *_dst, void *_src, size_t size)
+ {
+ u32 *dst = _dst;
+ __be32 *src = _src;
+@@ -99,8 +99,7 @@ fw_memcpy_from_be32(void *_dst, void *_s
+ dst[i] = be32_to_cpu(src[i]);
+ }
+
+-static inline void
+-fw_memcpy_to_be32(void *_dst, void *_src, size_t size)
++static inline void fw_memcpy_to_be32(void *_dst, void *_src, size_t size)
+ {
+ fw_memcpy_from_be32(_dst, _src, size);
+ }
+@@ -125,8 +124,7 @@ typedef void (*fw_packet_callback_t)(str
+ struct fw_card *card, int status);
+
+ typedef void (*fw_transaction_callback_t)(struct fw_card *card, int rcode,
+- void *data,
+- size_t length,
++ void *data, size_t length,
+ void *callback_data);
+
+ /*
+@@ -141,12 +139,6 @@ typedef void (*fw_address_callback_t)(st
+ void *data, size_t length,
+ void *callback_data);
+
+-typedef void (*fw_bus_reset_callback_t)(struct fw_card *handle,
+- int node_id, int generation,
+- u32 *self_ids,
+- int self_id_count,
+- void *callback_data);
+-
+ struct fw_packet {
+ int speed;
+ int generation;
+@@ -187,12 +179,6 @@ struct fw_transaction {
+ void *callback_data;
+ };
+
+-static inline struct fw_packet *
+-fw_packet(struct list_head *l)
+-{
+- return list_entry(l, struct fw_packet, link);
+-}
+-
+ struct fw_address_handler {
+ u64 offset;
+ size_t length;
+@@ -201,7 +187,6 @@ struct fw_address_handler {
+ struct list_head link;
+ };
+
+-
+ struct fw_address_region {
+ u64 start;
+ u64 end;
+@@ -315,10 +300,8 @@ struct fw_iso_packet {
+ struct fw_iso_context;
+
+ typedef void (*fw_iso_callback_t)(struct fw_iso_context *context,
+- u32 cycle,
+- size_t header_length,
+- void *header,
+- void *data);
++ u32 cycle, size_t header_length,
++ void *header, void *data);
+
+ /*
+ * An iso buffer is just a set of pages mapped for DMA in the
+@@ -344,36 +327,25 @@ struct fw_iso_context {
+ void *callback_data;
+ };
+
+-int
+-fw_iso_buffer_init(struct fw_iso_buffer *buffer,
+- struct fw_card *card,
+- int page_count,
+- enum dma_data_direction direction);
+-int
+-fw_iso_buffer_map(struct fw_iso_buffer *buffer, struct vm_area_struct *vma);
+-void
+-fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, struct fw_card *card);
+-
+-struct fw_iso_context *
+-fw_iso_context_create(struct fw_card *card, int type,
+- int channel, int speed, size_t header_size,
+- fw_iso_callback_t callback, void *callback_data);
+-
+-void
+-fw_iso_context_destroy(struct fw_iso_context *ctx);
+-
+-int
+-fw_iso_context_queue(struct fw_iso_context *ctx,
+- struct fw_iso_packet *packet,
+- struct fw_iso_buffer *buffer,
+- unsigned long payload);
+-
+-int
+-fw_iso_context_start(struct fw_iso_context *ctx,
+- int cycle, int sync, int tags);
++int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card,
++ int page_count, enum dma_data_direction direction);
++int fw_iso_buffer_map(struct fw_iso_buffer *buffer, struct vm_area_struct *vma);
++void fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, struct fw_card *card);
++
++struct fw_iso_context *fw_iso_context_create(struct fw_card *card,
++ int type, int channel, int speed, size_t header_size,
++ fw_iso_callback_t callback, void *callback_data);
++int fw_iso_context_queue(struct fw_iso_context *ctx,
++ struct fw_iso_packet *packet,
++ struct fw_iso_buffer *buffer,
++ unsigned long payload);
++int fw_iso_context_start(struct fw_iso_context *ctx,
++ int cycle, int sync, int tags);
++int fw_iso_context_stop(struct fw_iso_context *ctx);
++void fw_iso_context_destroy(struct fw_iso_context *ctx);
+
+-int
+-fw_iso_context_stop(struct fw_iso_context *ctx);
++void fw_iso_resource_manage(struct fw_card *card, int generation,
++ u64 channels_mask, int *channel, int *bandwidth, bool allocate);
+
+ struct fw_card_driver {
+ /*
+@@ -415,7 +387,7 @@ struct fw_card_driver {
+
+ struct fw_iso_context *
+ (*allocate_iso_context)(struct fw_card *card,
+- int type, size_t header_size);
++ int type, int channel, size_t header_size);
+ void (*free_iso_context)(struct fw_iso_context *ctx);
+
+ int (*start_iso)(struct fw_iso_context *ctx,
+@@ -429,24 +401,18 @@ struct fw_card_driver {
+ int (*stop_iso)(struct fw_iso_context *ctx);
+ };
+
+-int
+-fw_core_initiate_bus_reset(struct fw_card *card, int short_reset);
++int fw_core_initiate_bus_reset(struct fw_card *card, int short_reset);
+
+-void
+-fw_send_request(struct fw_card *card, struct fw_transaction *t,
++void fw_send_request(struct fw_card *card, struct fw_transaction *t,
+ int tcode, int destination_id, int generation, int speed,
+ unsigned long long offset, void *data, size_t length,
+ fw_transaction_callback_t callback, void *callback_data);
+-
+-int fw_run_transaction(struct fw_card *card, int tcode, int destination_id,
+- int generation, int speed, unsigned long long offset,
+- void *data, size_t length);
+-
+ int fw_cancel_transaction(struct fw_card *card,
+ struct fw_transaction *transaction);
+-
+ void fw_flush_transactions(struct fw_card *card);
+-
++int fw_run_transaction(struct fw_card *card, int tcode, int destination_id,
++ int generation, int speed, unsigned long long offset,
++ void *data, size_t length);
+ void fw_send_phy_config(struct fw_card *card,
+ int node_id, int generation, int gap_count);
+
+@@ -454,29 +420,18 @@ void fw_send_phy_config(struct fw_card *
+ * Called by the topology code to inform the device code of node
+ * activity; found, lost, or updated nodes.
+ */
+-void
+-fw_node_event(struct fw_card *card, struct fw_node *node, int event);
++void fw_node_event(struct fw_card *card, struct fw_node *node, int event);
+
+ /* API used by card level drivers */
+
+-void
+-fw_card_initialize(struct fw_card *card, const struct fw_card_driver *driver,
+- struct device *device);
+-int
+-fw_card_add(struct fw_card *card,
+- u32 max_receive, u32 link_speed, u64 guid);
+-
+-void
+-fw_core_remove_card(struct fw_card *card);
+-
+-void
+-fw_core_handle_bus_reset(struct fw_card *card,
+- int node_id, int generation,
+- int self_id_count, u32 *self_ids);
+-void
+-fw_core_handle_request(struct fw_card *card, struct fw_packet *request);
+-
+-void
+-fw_core_handle_response(struct fw_card *card, struct fw_packet *packet);
++void fw_card_initialize(struct fw_card *card,
++ const struct fw_card_driver *driver, struct device *device);
++int fw_card_add(struct fw_card *card,
++ u32 max_receive, u32 link_speed, u64 guid);
++void fw_core_remove_card(struct fw_card *card);
++void fw_core_handle_bus_reset(struct fw_card *card, int node_id,
++ int generation, int self_id_count, u32 *self_ids);
++void fw_core_handle_request(struct fw_card *card, struct fw_packet *request);
++void fw_core_handle_response(struct fw_card *card, struct fw_packet *packet);
+
+ #endif /* __fw_transaction_h */
+--- linux-2.6-git/include/linux/firewire-cdev.h 2008-11-04 11:19:21.000000000 -0500
++++ firewire-git/include/linux/firewire-cdev.h 2009-01-30 13:35:54.327647015 -0500
+@@ -25,10 +25,12 @@
+ #include <linux/types.h>
+ #include <linux/firewire-constants.h>
+
+-#define FW_CDEV_EVENT_BUS_RESET 0x00
+-#define FW_CDEV_EVENT_RESPONSE 0x01
+-#define FW_CDEV_EVENT_REQUEST 0x02
+-#define FW_CDEV_EVENT_ISO_INTERRUPT 0x03
++#define FW_CDEV_EVENT_BUS_RESET 0x00
++#define FW_CDEV_EVENT_RESPONSE 0x01
++#define FW_CDEV_EVENT_REQUEST 0x02
++#define FW_CDEV_EVENT_ISO_INTERRUPT 0x03
++#define FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED 0x04
++#define FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED 0x05
+
+ /**
+ * struct fw_cdev_event_common - Common part of all fw_cdev_event_ types
+@@ -136,7 +138,24 @@ struct fw_cdev_event_request {
+ * This event is sent when the controller has completed an &fw_cdev_iso_packet
+ * with the %FW_CDEV_ISO_INTERRUPT bit set. In the receive case, the headers
+ * stripped of all packets up until and including the interrupt packet are
+- * returned in the @header field.
++ * returned in the @header field. The amount of header data per packet is as
++ * specified at iso context creation by &fw_cdev_create_iso_context.header_size.
++ *
++ * In version 1 of this ABI, header data consisted of the 1394 isochronous
++ * packet header, followed by quadlets from the packet payload if
++ * &fw_cdev_create_iso_context.header_size > 4.
++ *
++ * In version 2 of this ABI, header data consist of the 1394 isochronous
++ * packet header, followed by a timestamp quadlet if
++ * &fw_cdev_create_iso_context.header_size > 4, followed by quadlets from the
++ * packet payload if &fw_cdev_create_iso_context.header_size > 8.
++ *
++ * Behaviour of ver. 1 of this ABI is no longer available since ABI ver. 2.
++ *
++ * Format of 1394 iso packet header: 16 bits len, 2 bits tag, 6 bits channel,
++ * 4 bits tcode, 4 bits sy, in big endian byte order. Format of timestamp:
++ * 16 bits invalid, 3 bits cycleSeconds, 13 bits cycleCount, in big endian byte
++ * order.
+ */
+ struct fw_cdev_event_iso_interrupt {
+ __u64 closure;
+@@ -147,12 +166,44 @@ struct fw_cdev_event_iso_interrupt {
+ };
+
+ /**
++ * struct fw_cdev_event_iso_resource - Iso resources were allocated or freed
++ * @closure: See &fw_cdev_event_common;
++ * set by %FW_CDEV_IOC_(DE)ALLOCATE_ISO_RESOURCE(_ONCE) ioctl
++ * @type: %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED or
++ * %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED
++ * @handle: Reference by which an allocated resource can be deallocated
++ * @channel: Isochronous channel which was (de)allocated, if any
++ * @bandwidth: Bandwidth allocation units which were (de)allocated, if any
++ *
++ * An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED event is sent after an isochronous
++ * resource was allocated at the IRM. The client has to check @channel and
++ * @bandwidth for whether the allocation actually succeeded.
++ *
++ * An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event is sent after an isochronous
++ * resource was deallocated at the IRM. It is also sent when automatic
++ * reallocation after a bus reset failed.
++ *
++ * @channel is <0 if no channel was (de)allocated or if reallocation failed.
++ * @bandwidth is 0 if no bandwidth was (de)allocated or if reallocation failed.
++ */
++struct fw_cdev_event_iso_resource {
++ __u64 closure;
++ __u32 type;
++ __u32 handle;
++ __s32 channel;
++ __s32 bandwidth;
++};
++
++/**
+ * union fw_cdev_event - Convenience union of fw_cdev_event_ types
+ * @common: Valid for all types
+ * @bus_reset: Valid if @common.type == %FW_CDEV_EVENT_BUS_RESET
+ * @response: Valid if @common.type == %FW_CDEV_EVENT_RESPONSE
+ * @request: Valid if @common.type == %FW_CDEV_EVENT_REQUEST
+ * @iso_interrupt: Valid if @common.type == %FW_CDEV_EVENT_ISO_INTERRUPT
++ * @iso_resource: Valid if @common.type ==
++ * %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED or
++ * %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED
+ *
+ * Convenience union for userspace use. Events could be read(2) into an
+ * appropriately aligned char buffer and then cast to this union for further
+@@ -163,13 +214,15 @@ struct fw_cdev_event_iso_interrupt {
+ * not fit will be discarded so that the next read(2) will return a new event.
+ */
+ union fw_cdev_event {
+- struct fw_cdev_event_common common;
+- struct fw_cdev_event_bus_reset bus_reset;
+- struct fw_cdev_event_response response;
+- struct fw_cdev_event_request request;
+- struct fw_cdev_event_iso_interrupt iso_interrupt;
++ struct fw_cdev_event_common common;
++ struct fw_cdev_event_bus_reset bus_reset;
++ struct fw_cdev_event_response response;
++ struct fw_cdev_event_request request;
++ struct fw_cdev_event_iso_interrupt iso_interrupt;
++ struct fw_cdev_event_iso_resource iso_resource;
+ };
+
++/* available since kernel version 2.6.22 */
+ #define FW_CDEV_IOC_GET_INFO _IOWR('#', 0x00, struct fw_cdev_get_info)
+ #define FW_CDEV_IOC_SEND_REQUEST _IOW('#', 0x01, struct fw_cdev_send_request)
+ #define FW_CDEV_IOC_ALLOCATE _IOWR('#', 0x02, struct fw_cdev_allocate)
+@@ -178,18 +231,29 @@ union fw_cdev_event {
+ #define FW_CDEV_IOC_INITIATE_BUS_RESET _IOW('#', 0x05, struct fw_cdev_initiate_bus_reset)
+ #define FW_CDEV_IOC_ADD_DESCRIPTOR _IOWR('#', 0x06, struct fw_cdev_add_descriptor)
+ #define FW_CDEV_IOC_REMOVE_DESCRIPTOR _IOW('#', 0x07, struct fw_cdev_remove_descriptor)
+-
+ #define FW_CDEV_IOC_CREATE_ISO_CONTEXT _IOWR('#', 0x08, struct fw_cdev_create_iso_context)
+ #define FW_CDEV_IOC_QUEUE_ISO _IOWR('#', 0x09, struct fw_cdev_queue_iso)
+ #define FW_CDEV_IOC_START_ISO _IOW('#', 0x0a, struct fw_cdev_start_iso)
+ #define FW_CDEV_IOC_STOP_ISO _IOW('#', 0x0b, struct fw_cdev_stop_iso)
++
++/* available since kernel version 2.6.24 */
+ #define FW_CDEV_IOC_GET_CYCLE_TIMER _IOR('#', 0x0c, struct fw_cdev_get_cycle_timer)
+
+-/* FW_CDEV_VERSION History
+- *
+- * 1 Feb 18, 2007: Initial version.
++/* available since kernel version 2.6.30 */
++#define FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE _IOWR('#', 0x0d, struct fw_cdev_allocate_iso_resource)
++#define FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE _IOW('#', 0x0e, struct fw_cdev_deallocate)
++#define FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE _IOW('#', 0x0f, struct fw_cdev_allocate_iso_resource)
++#define FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE_ONCE _IOW('#', 0x10, struct fw_cdev_allocate_iso_resource)
++#define FW_CDEV_IOC_GET_SPEED _IOR('#', 0x11, struct fw_cdev_get_speed)
++#define FW_CDEV_IOC_SEND_BROADCAST_REQUEST _IOW('#', 0x12, struct fw_cdev_send_request)
++
++/*
++ * FW_CDEV_VERSION History
++ * 1 (2.6.22) - initial version
++ * 2 (2.6.30) - changed &fw_cdev_event_iso_interrupt.header if
++ * &fw_cdev_create_iso_context.header_size is 8 or more
+ */
+-#define FW_CDEV_VERSION 1
++#define FW_CDEV_VERSION 2
+
+ /**
+ * struct fw_cdev_get_info - General purpose information ioctl
+@@ -201,7 +265,7 @@ union fw_cdev_event {
+ * case, @rom_length is updated with the actual length of the
+ * configuration ROM.
+ * @rom: If non-zero, address of a buffer to be filled by a copy of the
+- * local node's configuration ROM
++ * device's configuration ROM
+ * @bus_reset: If non-zero, address of a buffer to be filled by a
+ * &struct fw_cdev_event_bus_reset with the current state
+ * of the bus. This does not cause a bus reset to happen.
+@@ -229,7 +293,7 @@ struct fw_cdev_get_info {
+ * Send a request to the device. This ioctl implements all outgoing requests.
+ * Both quadlet and block request specify the payload as a pointer to the data
+ * in the @data field. Once the transaction completes, the kernel writes an
+- * &fw_cdev_event_request event back. The @closure field is passed back to
++ * &fw_cdev_event_response event back. The @closure field is passed back to
+ * user space in the response event.
+ */
+ struct fw_cdev_send_request {
+@@ -284,9 +348,9 @@ struct fw_cdev_allocate {
+ };
+
+ /**
+- * struct fw_cdev_deallocate - Free an address range allocation
+- * @handle: Handle to the address range, as returned by the kernel when the
+- * range was allocated
++ * struct fw_cdev_deallocate - Free a CSR address range or isochronous resource
++ * @handle: Handle to the address range or iso resource, as returned by the
++ * kernel when the range or resource was allocated
+ */
+ struct fw_cdev_deallocate {
+ __u32 handle;
+@@ -370,6 +434,9 @@ struct fw_cdev_remove_descriptor {
+ *
+ * If a context was successfully created, the kernel writes back a handle to the
+ * context, which must be passed in for subsequent operations on that context.
++ *
++ * Note that the effect of a @header_size > 4 depends on
++ * &fw_cdev_get_info.version, as documented at &fw_cdev_event_iso_interrupt.
+ */
+ struct fw_cdev_create_iso_context {
+ __u32 type;
+@@ -473,10 +540,73 @@ struct fw_cdev_stop_iso {
+ * The %FW_CDEV_IOC_GET_CYCLE_TIMER ioctl reads the isochronous cycle timer
+ * and also the system clock. This allows to express the receive time of an
+ * isochronous packet as a system time with microsecond accuracy.
++ *
++ * @cycle_timer consists of 7 bits cycleSeconds, 13 bits cycleCount, and
++ * 12 bits cycleOffset, in host byte order.
+ */
+ struct fw_cdev_get_cycle_timer {
+ __u64 local_time;
+ __u32 cycle_timer;
+ };
+
++/**
++ * struct fw_cdev_allocate_iso_resource - (De)allocate a channel or bandwidth
++ * @closure: Passed back to userspace in correponding iso resource events
++ * @channels: Isochronous channels of which one is to be (de)allocated
++ * @bandwidth: Isochronous bandwidth units to be (de)allocated
++ * @handle: Handle to the allocation, written by the kernel (only valid in
++ * case of %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE ioctls)
++ *
++ * The %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE ioctl initiates allocation of an
++ * isochronous channel and/or of isochronous bandwidth at the isochronous
++ * resource manager (IRM). Only one of the channels specified in @channels is
++ * allocated. An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED is sent after
++ * communication with the IRM, indicating success or failure in the event data.
++ * The kernel will automatically reallocate the resources after bus resets.
++ * Should a reallocation fail, an %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event
++ * will be sent. The kernel will also automatically deallocate the resources
++ * when the file descriptor is closed.
++ *
++ * The %FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE ioctl can be used to initiate
++ * deallocation of resources which were allocated as described above.
++ * An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event concludes this operation.
++ *
++ * The %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE ioctl is a variant of allocation
++ * without automatic re- or deallocation.
++ * An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED event concludes this operation,
++ * indicating success or failure in its data.
++ *
++ * The %FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE_ONCE ioctl works like
++ * %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE except that resources are freed
++ * instead of allocated.
++ * An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event concludes this operation.
++ *
++ * To summarize, %FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE allocates iso resources
++ * for the lifetime of the fd or handle.
++ * In contrast, %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE allocates iso resources
++ * for the duration of a bus generation.
++ *
++ * @channels is a host-endian bitfield with the least significant bit
++ * representing channel 0 and the most significant bit representing channel 63:
++ * 1ULL << c for each channel c that is a candidate for (de)allocation.
++ *
++ * @bandwidth is expressed in bandwidth allocation units, i.e. the time to send
++ * one quadlet of data (payload or header data) at speed S1600.
++ */
++struct fw_cdev_allocate_iso_resource {
++ __u64 closure;
++ __u64 channels;
++ __u32 bandwidth;
++ __u32 handle;
++};
++
++/**
++ * struct fw_cdev_get_speed - Query maximum speed to or from this device
++ * @max_speed: Speed code; minimum of the device's link speed, the local node's
++ * link speed, and all PHY port speeds between the two links
++ */
++struct fw_cdev_get_speed {
++ __u32 max_speed;
++};
++
+ #endif /* _LINUX_FIREWIRE_CDEV_H */
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-hotfixes.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-hotfixes.patch
new file mode 100644
index 000000000..494947322
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-hotfixes.patch
@@ -0,0 +1,15 @@
+fixes:
+implicit declaration of function kzalloc
+
+--- linux-2.6.34.noarch/drivers/usb/serial/qcserial.c~ 2010-06-08 15:19:41.000000000 -0400
++++ linux-2.6.34.noarch/drivers/usb/serial/qcserial.c 2010-06-08 15:19:47.000000000 -0400
+@@ -11,6 +11,7 @@
+ *
+ */
+
++#include <linux/slab.h>
+ #include <linux/tty.h>
+ #include <linux/tty_flip.h>
+ #include <linux/usb.h>
+
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-i386-nx-emulation.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-i386-nx-emulation.patch
new file mode 100644
index 000000000..da84cc672
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-i386-nx-emulation.patch
@@ -0,0 +1,615 @@
+--- a/arch/x86/include/asm/desc.h
++++ b/arch/x86/include/asm/desc.h
+@@ -5,6 +5,7 @@
+ #include <asm/ldt.h>
+ #include <asm/mmu.h>
+ #include <linux/smp.h>
++#include <linux/mm_types.h>
+
+ static inline void fill_ldt(struct desc_struct *desc,
+ const struct user_desc *info)
+@@ -93,6 +94,9 @@ static inline int desc_empty(const void *ptr)
+
+ #define load_TLS(t, cpu) native_load_tls(t, cpu)
+ #define set_ldt native_set_ldt
++#ifdef CONFIG_X86_32
++#define load_user_cs_desc native_load_user_cs_desc
++#endif /*CONFIG_X86_32*/
+
+ #define write_ldt_entry(dt, entry, desc) \
+ native_write_ldt_entry(dt, entry, desc)
+@@ -392,4 +396,25 @@ static inline void set_system_intr_gate_ist(int n, void *addr, unsigned ist)
+ _set_gate(n, GATE_INTERRUPT, addr, 0x3, ist, __KERNEL_CS);
+ }
+
++#ifdef CONFIG_X86_32
++static inline void set_user_cs(struct desc_struct *desc, unsigned long limit)
++{
++ limit = (limit - 1) / PAGE_SIZE;
++ desc->a = limit & 0xffff;
++ desc->b = (limit & 0xf0000) | 0x00c0fb00;
++}
++
++static inline void native_load_user_cs_desc(int cpu, struct mm_struct *mm)
++{
++ get_cpu_gdt_table(cpu)[GDT_ENTRY_DEFAULT_USER_CS] = (mm)->context.user_cs;
++}
++
++#define arch_add_exec_range arch_add_exec_range
++#define arch_remove_exec_range arch_remove_exec_range
++#define arch_flush_exec_range arch_flush_exec_range
++extern void arch_add_exec_range(struct mm_struct *mm, unsigned long limit);
++extern void arch_remove_exec_range(struct mm_struct *mm, unsigned long limit);
++extern void arch_flush_exec_range(struct mm_struct *mm);
++#endif /* CONFIG_X86_32 */
++
+ #endif /* _ASM_X86_DESC_H */
+--- a/arch/x86/include/asm/mmu.h
++++ b/arch/x86/include/asm/mmu.h
+@@ -7,12 +7,19 @@
+ /*
+ * The x86 doesn't have a mmu context, but
+ * we put the segment information here.
++ *
++ * exec_limit is used to track the range PROT_EXEC
++ * mappings span.
+ */
+ typedef struct {
+ void *ldt;
+ int size;
+ struct mutex lock;
+ void *vdso;
++#ifdef CONFIG_X86_32
++ struct desc_struct user_cs;
++ unsigned long exec_limit;
++#endif
+ } mm_context_t;
+
+ #ifdef CONFIG_SMP
+--- a/arch/x86/include/asm/paravirt.h
++++ b/arch/x86/include/asm/paravirt.h
+@@ -289,6 +289,12 @@ static inline void set_ldt(const void *addr, unsigned entries)
+ {
+ PVOP_VCALL2(pv_cpu_ops.set_ldt, addr, entries);
+ }
++#ifdef CONFIG_X86_32
++static inline void load_user_cs_desc(unsigned int cpu, struct mm_struct *mm)
++{
++ PVOP_VCALL2(pv_cpu_ops.load_user_cs_desc, cpu, mm);
++}
++#endif /*CONFIG_X86_32*/
+ static inline void store_gdt(struct desc_ptr *dtr)
+ {
+ PVOP_VCALL1(pv_cpu_ops.store_gdt, dtr);
+--- a/arch/x86/include/asm/paravirt_types.h
++++ b/arch/x86/include/asm/paravirt_types.h
+@@ -118,6 +118,9 @@ struct pv_cpu_ops {
+ void (*store_gdt)(struct desc_ptr *);
+ void (*store_idt)(struct desc_ptr *);
+ void (*set_ldt)(const void *desc, unsigned entries);
++#ifdef CONFIG_X86_32
++ void (*load_user_cs_desc)(int cpu, struct mm_struct *mm);
++#endif
+ unsigned long (*store_tr)(void);
+ void (*load_tls)(struct thread_struct *t, unsigned int cpu);
+ #ifdef CONFIG_X86_64
+--- a/arch/x86/kernel/cpu/common.c
++++ b/arch/x86/kernel/cpu/common.c
+@@ -802,6 +802,22 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
+ /* Filter out anything that depends on CPUID levels we don't have */
+ filter_cpuid_features(c, true);
+
++#ifdef CONFIG_X86_32
++ /*
++ * emulation of NX with segment limits unfortunately means
++ * we have to disable the fast system calls, due to the way that
++ * sysexit clears the segment limits on return.
++ * If we have either disabled exec-shield on the boot command line,
++ * or we have NX, then we don't need to do this.
++ */
++ if (!disable_nx) {
++#ifdef CONFIG_X86_PAE
++ if (!test_cpu_cap(c, X86_FEATURE_NX))
++#endif
++ clear_cpu_cap(c, X86_FEATURE_SEP);
++ }
++#endif
++
+ /* If the model name is still unset, do table lookup. */
+ if (!c->x86_model_id[0]) {
+ const char *p;
+--- a/arch/x86/kernel/paravirt.c
++++ b/arch/x86/kernel/paravirt.c
+@@ -345,6 +345,9 @@ struct pv_cpu_ops pv_cpu_ops = {
+ .read_tscp = native_read_tscp,
+ .load_tr_desc = native_load_tr_desc,
+ .set_ldt = native_set_ldt,
++#ifdef CONFIG_X86_32
++ .load_user_cs_desc = native_load_user_cs_desc,
++#endif /*CONFIG_X86_32*/
+ .load_gdt = native_load_gdt,
+ .load_idt = native_load_idt,
+ .store_gdt = native_store_gdt,
+--- a/arch/x86/kernel/process_32.c
++++ b/arch/x86/kernel/process_32.c
+@@ -243,7 +243,10 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
+ void
+ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
+ {
++ int cpu;
++
+ set_user_gs(regs, 0);
++
+ regs->fs = 0;
+ set_fs(USER_DS);
+ regs->ds = __USER_DS;
+@@ -252,6 +255,11 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
+ regs->cs = __USER_CS;
+ regs->ip = new_ip;
+ regs->sp = new_sp;
++
++ cpu = get_cpu();
++ load_user_cs_desc(cpu, current->mm);
++ put_cpu();
++
+ /*
+ * Free the old FP and other extended state
+ */
+@@ -311,6 +319,9 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
+ if (preload_fpu)
+ prefetch(next->fpu.state);
+
++ if (next_p->mm)
++ load_user_cs_desc(cpu, next_p->mm);
++
+ /*
+ * Reload esp0.
+ */
+@@ -404,3 +415,40 @@ unsigned long get_wchan(struct task_struct *p)
+ return 0;
+ }
+
++static void modify_cs(struct mm_struct *mm, unsigned long limit)
++{
++ mm->context.exec_limit = limit;
++ set_user_cs(&mm->context.user_cs, limit);
++ if (mm == current->mm) {
++ int cpu;
++
++ cpu = get_cpu();
++ load_user_cs_desc(cpu, mm);
++ put_cpu();
++ }
++}
++
++void arch_add_exec_range(struct mm_struct *mm, unsigned long limit)
++{
++ if (limit > mm->context.exec_limit)
++ modify_cs(mm, limit);
++}
++
++void arch_remove_exec_range(struct mm_struct *mm, unsigned long old_end)
++{
++ struct vm_area_struct *vma;
++ unsigned long limit = PAGE_SIZE;
++
++ if (old_end == mm->context.exec_limit) {
++ for (vma = mm->mmap; vma; vma = vma->vm_next)
++ if ((vma->vm_flags & VM_EXEC) && (vma->vm_end > limit))
++ limit = vma->vm_end;
++ modify_cs(mm, limit);
++ }
++}
++
++void arch_flush_exec_range(struct mm_struct *mm)
++{
++ mm->context.exec_limit = 0;
++ set_user_cs(&mm->context.user_cs, 0);
++}
+--- a/arch/x86/kernel/traps.c
++++ b/arch/x86/kernel/traps.c
+@@ -109,6 +109,78 @@ static inline void preempt_conditional_cli(struct pt_regs *regs)
+ dec_preempt_count();
+ }
+
++#ifdef CONFIG_X86_32
++static inline int
++__compare_user_cs_desc(const struct desc_struct *desc1,
++ const struct desc_struct *desc2)
++{
++ return ((desc1->limit0 != desc2->limit0) ||
++ (desc1->limit != desc2->limit) ||
++ (desc1->base0 != desc2->base0) ||
++ (desc1->base1 != desc2->base1) ||
++ (desc1->base2 != desc2->base2));
++}
++
++/*
++ * lazy-check for CS validity on exec-shield binaries:
++ *
++ * the original non-exec stack patch was written by
++ * Solar Designer <solar at openwall.com>. Thanks!
++ */
++static int
++check_lazy_exec_limit(int cpu, struct pt_regs *regs, long error_code)
++{
++ struct desc_struct *desc1, *desc2;
++ struct vm_area_struct *vma;
++ unsigned long limit;
++
++ if (current->mm == NULL)
++ return 0;
++
++ limit = -1UL;
++ if (current->mm->context.exec_limit != -1UL) {
++ limit = PAGE_SIZE;
++ spin_lock(&current->mm->page_table_lock);
++ for (vma = current->mm->mmap; vma; vma = vma->vm_next)
++ if ((vma->vm_flags & VM_EXEC) && (vma->vm_end > limit))
++ limit = vma->vm_end;
++ vma = get_gate_vma(current);
++ if (vma && (vma->vm_flags & VM_EXEC) && (vma->vm_end > limit))
++ limit = vma->vm_end;
++ spin_unlock(&current->mm->page_table_lock);
++ if (limit >= TASK_SIZE)
++ limit = -1UL;
++ current->mm->context.exec_limit = limit;
++ }
++ set_user_cs(&current->mm->context.user_cs, limit);
++
++ desc1 = &current->mm->context.user_cs;
++ desc2 = get_cpu_gdt_table(cpu) + GDT_ENTRY_DEFAULT_USER_CS;
++
++ if (__compare_user_cs_desc(desc1, desc2)) {
++ /*
++ * The CS was not in sync - reload it and retry the
++ * instruction. If the instruction still faults then
++ * we won't hit this branch next time around.
++ */
++ if (print_fatal_signals >= 2) {
++ printk(KERN_ERR "#GPF fixup (%ld[seg:%lx]) at %08lx, CPU#%d.\n",
++ error_code, error_code/8, regs->ip,
++ smp_processor_id());
++ printk(KERN_ERR "exec_limit: %08lx, user_cs: %08x/%08x, CPU_cs: %08x/%08x.\n",
++ current->mm->context.exec_limit,
++ desc1->a, desc1->b, desc2->a, desc2->b);
++ }
++
++ load_user_cs_desc(cpu, current->mm);
++
++ return 1;
++ }
++
++ return 0;
++}
++#endif
++
+ static void __kprobes
+ do_trap(int trapnr, int signr, char *str, struct pt_regs *regs,
+ long error_code, siginfo_t *info)
+@@ -265,6 +337,29 @@ do_general_protection(struct pt_regs *regs, long error_code)
+ if (!user_mode(regs))
+ goto gp_in_kernel;
+
++#ifdef CONFIG_X86_32
++{
++ int cpu;
++ int ok;
++
++ cpu = get_cpu();
++ ok = check_lazy_exec_limit(cpu, regs, error_code);
++ put_cpu();
++
++ if (ok)
++ return;
++
++ if (print_fatal_signals) {
++ printk(KERN_ERR "#GPF(%ld[seg:%lx]) at %08lx, CPU#%d.\n",
++ error_code, error_code/8, regs->ip, smp_processor_id());
++ printk(KERN_ERR "exec_limit: %08lx, user_cs: %08x/%08x.\n",
++ current->mm->context.exec_limit,
++ current->mm->context.user_cs.a,
++ current->mm->context.user_cs.b);
++ }
++}
++#endif /*CONFIG_X86_32*/
++
+ tsk->thread.error_code = error_code;
+ tsk->thread.trap_no = 13;
+
+@@ -792,19 +887,37 @@ do_device_not_available(struct pt_regs *regs, long error_code)
+ }
+
+ #ifdef CONFIG_X86_32
++/*
++ * The fixup code for errors in iret jumps to here (iret_exc). It loses
++ * the original trap number and erorr code. The bogus trap 32 and error
++ * code 0 are what the vanilla kernel delivers via:
++ * DO_ERROR_INFO(32, SIGSEGV, "iret exception", iret_error, ILL_BADSTK, 0, 1)
++ *
++ * NOTE: Because of the final "1" in the macro we need to enable interrupts.
++ *
++ * In case of a general protection fault in the iret instruction, we
++ * need to check for a lazy CS update for exec-shield.
++ */
+ dotraplinkage void do_iret_error(struct pt_regs *regs, long error_code)
+ {
+- siginfo_t info;
++ int ok;
++ int cpu;
++
+ local_irq_enable();
+
+- info.si_signo = SIGILL;
+- info.si_errno = 0;
+- info.si_code = ILL_BADSTK;
+- info.si_addr = NULL;
+- if (notify_die(DIE_TRAP, "iret exception",
+- regs, error_code, 32, SIGILL) == NOTIFY_STOP)
+- return;
+- do_trap(32, SIGILL, "iret exception", regs, error_code, &info);
++ cpu = get_cpu();
++ ok = check_lazy_exec_limit(cpu, regs, error_code);
++ put_cpu();
++
++ if (!ok && notify_die(DIE_TRAP, "iret exception", regs,
++ error_code, 32, SIGSEGV) != NOTIFY_STOP) {
++ siginfo_t info;
++ info.si_signo = SIGSEGV;
++ info.si_errno = 0;
++ info.si_code = ILL_BADSTK;
++ info.si_addr = 0;
++ do_trap(32, SIGSEGV, "iret exception", regs, error_code, &info);
++ }
+ }
+ #endif
+
+--- a/arch/x86/mm/setup_nx.c
++++ b/arch/x86/mm/setup_nx.c
+@@ -1,3 +1,4 @@
++#include <linux/sched.h>
+ #include <linux/spinlock.h>
+ #include <linux/errno.h>
+ #include <linux/init.h>
+@@ -6,7 +6,7 @@
+ #include <asm/pgtable.h>
+ #include <asm/proto.h>
+
+-static int disable_nx __cpuinitdata;
++int disable_nx __cpuinitdata;
+
+ /*
+ * noexec = on|off
+@@ -40,6 +42,10 @@ void __cpuinit x86_configure_nx(void)
+ void __init x86_report_nx(void)
+ {
+ if (!cpu_has_nx) {
++ if (!disable_nx)
++ printk(KERN_INFO "Using x86 segment limits to approximate NX protection\n");
++ else
++
+ printk(KERN_NOTICE "Notice: NX (Execute Disable) protection "
+ "missing in CPU!\n");
+ } else {
+--- a/arch/x86/mm/tlb.c
++++ b/arch/x86/mm/tlb.c
+@@ -6,6 +6,7 @@
+ #include <linux/module.h>
+ #include <linux/cpu.h>
+
++#include <asm/desc.h>
+ #include <asm/tlbflush.h>
+ #include <asm/mmu_context.h>
+ #include <asm/cache.h>
+@@ -131,6 +132,12 @@ void smp_invalidate_interrupt(struct pt_regs *regs)
+ union smp_flush_state *f;
+
+ cpu = smp_processor_id();
++
++#ifdef CONFIG_X86_32
++ if (current->active_mm)
++ load_user_cs_desc(cpu, current->active_mm);
++#endif
++
+ /*
+ * orig_rax contains the negated interrupt vector.
+ * Use that to determine where the sender put the data.
+--- a/arch/x86/xen/enlighten.c
++++ b/arch/x86/xen/enlighten.c
+@@ -335,6 +335,24 @@ static void xen_set_ldt(const void *addr, unsigned entries)
+ xen_mc_issue(PARAVIRT_LAZY_CPU);
+ }
+
++#ifdef CONFIG_X86_32
++static void xen_load_user_cs_desc(int cpu, struct mm_struct *mm)
++{
++ void *gdt;
++ xmaddr_t mgdt;
++ u64 descriptor;
++ struct desc_struct user_cs;
++
++ gdt = &get_cpu_gdt_table(cpu)[GDT_ENTRY_DEFAULT_USER_CS];
++ mgdt = virt_to_machine(gdt);
++
++ user_cs = mm->context.user_cs;
++ descriptor = (u64) user_cs.a | ((u64) user_cs.b) << 32;
++
++ HYPERVISOR_update_descriptor(mgdt.maddr, descriptor);
++}
++#endif /*CONFIG_X86_32*/
++
+ static void xen_load_gdt(const struct desc_ptr *dtr)
+ {
+ unsigned long va = dtr->address;
+@@ -961,6 +979,9 @@ static const struct pv_cpu_ops xen_cpu_ops __initdata = {
+
+ .load_tr_desc = paravirt_nop,
+ .set_ldt = xen_set_ldt,
++#ifdef CONFIG_X86_32
++ .load_user_cs_desc = xen_load_user_cs_desc,
++#endif /*CONFIG_X86_32*/
+ .load_gdt = xen_load_gdt,
+ .load_idt = xen_load_idt,
+ .load_tls = xen_load_tls,
+--- a/fs/binfmt_elf.c
++++ b/fs/binfmt_elf.c
+@@ -717,6 +722,15 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
+ if (retval)
+ goto out_free_dentry;
+
++#ifdef CONFIG_X86_32
++ /*
++ * Turn off the CS limit completely if exec-shield disabled or
++ * NX active:
++ */
++ if (disable_nx || executable_stack != EXSTACK_DISABLE_X || (__supported_pte_mask & _PAGE_NX))
++ arch_add_exec_range(current->mm, -1);
++#endif
++
+ /* OK, This is the point of no return */
+ current->flags &= ~PF_FORKNOEXEC;
+ current->mm->def_flags = def_flags;
+--- a/include/linux/sched.h
++++ b/include/linux/sched.h
+@@ -101,6 +101,9 @@ struct bio_list;
+ struct fs_struct;
+ struct perf_event_context;
+
++extern int disable_nx;
++extern int print_fatal_signals;
++
+ /*
+ * List of flags we want to share for kernel threads,
+ * if only because they are not used by them anyway.
+--- b/mm/mmap.c
++++ b/mm/mmap.c
+@@ -44,6 +45,18 @@
+ #define arch_rebalance_pgtables(addr, len) (addr)
+ #endif
+
++/* No sane architecture will #define these to anything else */
++#ifndef arch_add_exec_range
++#define arch_add_exec_range(mm, limit) do { ; } while (0)
++#endif
++#ifndef arch_flush_exec_range
++#define arch_flush_exec_range(mm) do { ; } while (0)
++#endif
++#ifndef arch_remove_exec_range
++#define arch_remove_exec_range(mm, limit) do { ; } while (0)
++#endif
++
++
+ static void unmap_region(struct mm_struct *mm,
+ struct vm_area_struct *vma, struct vm_area_struct *prev,
+ unsigned long start, unsigned long end);
+@@ -388,6 +401,9 @@
+ {
+ struct vm_area_struct *next;
+
++ if (vma->vm_flags & VM_EXEC)
++ arch_add_exec_range(mm, vma->vm_end);
++
+ vma->vm_prev = prev;
+ if (prev) {
+ next = prev->vm_next;
+@@ -489,6 +504,8 @@
+ rb_erase(&vma->vm_rb, &mm->mm_rb);
+ if (mm->mmap_cache == vma)
+ mm->mmap_cache = prev;
++ if (vma->vm_flags & VM_EXEC)
++ arch_remove_exec_range(mm, vma->vm_end);
+ }
+
+ /*
+@@ -790,6 +807,8 @@
+ } else /* cases 2, 5, 7 */
+ err = vma_adjust(prev, prev->vm_start,
+ end, prev->vm_pgoff, NULL);
++ if (prev->vm_flags & VM_EXEC)
++ arch_add_exec_range(mm, prev->vm_end);
+ if (err)
+ return NULL;
+ return prev;
+@@ -1966,10 +2075,14 @@
+ if (new->vm_ops && new->vm_ops->open)
+ new->vm_ops->open(new);
+
+- if (new_below)
++ if (new_below) {
++ unsigned long old_end = vma->vm_end;
++
+ err = vma_adjust(vma, addr, vma->vm_end, vma->vm_pgoff +
+ ((addr - new->vm_start) >> PAGE_SHIFT), new);
+- else
++ if (vma->vm_flags & VM_EXEC)
++ arch_remove_exec_range(mm, old_end);
++ } else
+ err = vma_adjust(vma, vma->vm_start, addr, vma->vm_pgoff, new);
+
+ /* Success. */
+@@ -2254,6 +2367,7 @@
+
+ free_pgtables(tlb, vma, FIRST_USER_ADDRESS, 0);
+ tlb_finish_mmu(tlb, 0, end);
++ arch_flush_exec_range(mm);
+
+ /*
+ * Walk the list again, actually closing and freeing it,
+--- a/mm/mprotect.c
++++ b/mm/mprotect.c
+@@ -25,9 +25,14 @@
+ #include <linux/perf_event.h>
+ #include <asm/uaccess.h>
+ #include <asm/pgtable.h>
++#include <asm/pgalloc.h>
+ #include <asm/cacheflush.h>
+ #include <asm/tlbflush.h>
+
++#ifndef arch_remove_exec_range
++#define arch_remove_exec_range(mm, limit) do { ; } while (0)
++#endif
++
+ #ifndef pgprot_modify
+ static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot)
+ {
+@@ -138,7 +143,7 @@ mprotect_fixup(struct vm_area_struct *vma, struct vm_area_struct **pprev,
+ struct mm_struct *mm = vma->vm_mm;
+ unsigned long oldflags = vma->vm_flags;
+ long nrpages = (end - start) >> PAGE_SHIFT;
+- unsigned long charged = 0;
++ unsigned long charged = 0, old_end = vma->vm_end;
+ pgoff_t pgoff;
+ int error;
+ int dirty_accountable = 0;
+@@ -203,6 +208,9 @@ success:
+ dirty_accountable = 1;
+ }
+
++ if (oldflags & VM_EXEC)
++ arch_remove_exec_range(current->mm, old_end);
++
+ mmu_notifier_invalidate_range_start(mm, start, end);
+ if (is_vm_hugetlb_page(vma))
+ hugetlb_change_protection(vma, start, end, vma->vm_page_prot);
+diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
+index 57d1868..29c0c35 100644
+--- a/arch/x86/kernel/process.c
++++ b/arch/x86/kernel/process.c
+@@ -669,6 +669,16 @@ unsigned long arch_align_stack(unsigned long sp)
+ unsigned long arch_randomize_brk(struct mm_struct *mm)
+ {
+ unsigned long range_end = mm->brk + 0x02000000;
+- return randomize_range(mm->brk, range_end, 0) ? : mm->brk;
++ unsigned long bump = 0;
++#ifdef CONFIG_X86_32
++ /* in the case of NX emulation, shove the brk segment way out of the
++ way of the exec randomization area, since it can collide with
++ future allocations if not. */
++ if ( (mm->get_unmapped_exec_area == arch_get_unmapped_exec_area) &&
++ (mm->brk < 0x08000000) ) {
++ bump = (TASK_SIZE/6);
++ }
++#endif
++ return bump + (randomize_range(mm->brk, range_end, 0) ? : mm->brk);
+ }
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-input-kill-stupid-messages.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-input-kill-stupid-messages.patch
new file mode 100644
index 000000000..cc1dd7470
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-input-kill-stupid-messages.patch
@@ -0,0 +1,32 @@
+From b2c6d55b2351152696aafb8c9bf3ec8968acf77c Mon Sep 17 00:00:00 2001
+From: Kyle McMartin <kyle@phobos.i.jkkm.org>
+Date: Mon, 29 Mar 2010 23:59:58 -0400
+Subject: linux-2.6-input-kill-stupid-messages
+
+---
+ drivers/input/keyboard/atkbd.c | 5 +++++
+ 1 files changed, 5 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
+index d358ef8..38db098 100644
+--- a/drivers/input/keyboard/atkbd.c
++++ b/drivers/input/keyboard/atkbd.c
+@@ -425,11 +426,15 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
+ goto out;
+ case ATKBD_RET_ACK:
+ case ATKBD_RET_NAK:
++#if 0
++ /* Quite a few key switchers and other tools trigger this
++ * and it confuses people who can do nothing about it */
+ if (printk_ratelimit())
+ dev_warn(&serio->dev,
+ "Spurious %s on %s. "
+ "Some program might be trying access hardware directly.\n",
+ data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys);
++#endif
+ goto out;
+ case ATKBD_RET_ERR:
+ atkbd->err_count++;
+--
+1.7.0.1
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-intel-iommu-igfx.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-intel-iommu-igfx.patch
new file mode 100644
index 000000000..44fd14186
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-intel-iommu-igfx.patch
@@ -0,0 +1,78 @@
+Subject: [PATCH] [intel_iommu] Default to igfx_off
+From: drago01 <drago01@gmail.com>
+To: fedora-kernel-list <fedora-kernel-list@redhat.com>
+
+This option seems to causes way to many issues, it is
+being investigated by Intel's chipset team for months now and
+we still don't have any outcome.
+
+The results so far are "black screen when starting X",
+"system hangs when using GL", "system does not resume".
+
+The patch adds an intel_iommu=igfx_on option, which makes it opt in,
+rather than opt out.
+
+Signed-off-by: Adel Gadllah <adel.gadllah@gmail.com>
+Reviewed-by: Adam Jackson <ajax@redhat.com>
+---
+ Documentation/kernel-parameters.txt | 11 +++++------
+ drivers/pci/intel-iommu.c | 9 +++++----
+ 2 files changed, 10 insertions(+), 10 deletions(-)
+
+diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
+index e7848a0..9914485 100644
+--- a/Documentation/kernel-parameters.txt
++++ b/Documentation/kernel-parameters.txt
+@@ -992,12 +992,11 @@ and is between 256 and 4096 characters. It is defined in the file
+ Enable intel iommu driver.
+ off
+ Disable intel iommu driver.
+- igfx_off [Default Off]
+- By default, gfx is mapped as normal device. If a gfx
+- device has a dedicated DMAR unit, the DMAR unit is
+- bypassed by not enabling DMAR with this option. In
+- this case, gfx device will use physical address for
+- DMA.
++ igfx_on [Default Off]
++ By default, the gfx's DMAR unit is bypassed by not enabling
++ DMAR with this option. So the gfx device will use physical
++ address for DMA. When this option is enabled it the gfx is
++ mapped as normal device.
+ forcedac [x86_64]
+ With this option iommu will not optimize to look
+ for io virtual address below 32 bit forcing dual
+diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
+index 4173125..8f36786 100644
+--- a/drivers/pci/intel-iommu.c
++++ b/drivers/pci/intel-iommu.c
+@@ -340,7 +340,8 @@ int dmar_disabled = 0;
+ int dmar_disabled = 1;
+ #endif /*CONFIG_DMAR_DEFAULT_ON*/
+
+-static int dmar_map_gfx = 1;
++/* disabled by default; causes way too many issues */
++static int dmar_map_gfx = 0;
+ static int dmar_forcedac;
+ static int intel_iommu_strict;
+
+@@ -361,10 +362,10 @@ static int __init intel_iommu_setup(char *str)
+ } else if (!strncmp(str, "off", 3)) {
+ dmar_disabled = 1;
+ printk(KERN_INFO "Intel-IOMMU: disabled\n");
+- } else if (!strncmp(str, "igfx_off", 8)) {
+- dmar_map_gfx = 0;
++ } else if (!strncmp(str, "igfx_on", 7)) {
++ dmar_map_gfx = 1;
+ printk(KERN_INFO
+- "Intel-IOMMU: disable GFX device mapping\n");
++ "Intel-IOMMU: enabled GFX device mapping\n");
+ } else if (!strncmp(str, "forcedac", 8)) {
+ printk(KERN_INFO
+ "Intel-IOMMU: Forcing DAC for PCI devices\n");
+--
+1.6.6.1
+_______________________________________________
+kernel mailing list
+kernel@lists.fedoraproject.org
+https://admin.fedoraproject.org/mailman/listinfo/kernel
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-makefile-after_link.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-makefile-after_link.patch
new file mode 100644
index 000000000..c2541b1d8
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-makefile-after_link.patch
@@ -0,0 +1,98 @@
+From f072f7db2194c8255c003d985b61ad2f97ebbee0 Mon Sep 17 00:00:00 2001
+From: Roland McGrath <roland@redhat.com>
+Date: Mon, 6 Oct 2008 23:03:03 -0700
+Subject: [PATCH] kbuild: AFTER_LINK
+
+If the make variable AFTER_LINK is set, it is a command line to run
+after each final link. This includes vmlinux itself and vDSO images.
+
+Signed-off-by: Roland McGrath <roland@redhat.com>
+---
+diff --git a/Makefile b/Makefile
+index f908acc..960ff6f 100644
+--- a/Makefile
++++ b/Makefile
+@@ -746,6 +746,10 @@ quiet_cmd_vmlinux__ ?= LD $@
+ --start-group $(vmlinux-main) --end-group \
+ $(filter-out $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o FORCE ,$^)
+
++ifdef AFTER_LINK
++cmd_vmlinux__ += ; $(AFTER_LINK)
++endif
++
+ # Generate new vmlinux version
+ quiet_cmd_vmlinux_version = GEN .version
+ cmd_vmlinux_version = set -e; \
+diff --git a/arch/powerpc/kernel/vdso32/Makefile b/arch/powerpc/kernel/vdso32/Makefile
+index 51ead52..ad21273 100644
+--- a/arch/powerpc/kernel/vdso32/Makefile
++++ b/arch/powerpc/kernel/vdso32/Makefile
+@@ -41,7 +41,8 @@ $(obj-vdso32): %.o: %.S
+
+ # actual build commands
+ quiet_cmd_vdso32ld = VDSO32L $@
+- cmd_vdso32ld = $(CROSS32CC) $(c_flags) -Wl,-T $^ -o $@
++ cmd_vdso32ld = $(CROSS32CC) $(c_flags) -Wl,-T $^ -o $@ \
++ $(if $(AFTER_LINK),; $(AFTER_LINK))
+ quiet_cmd_vdso32as = VDSO32A $@
+ cmd_vdso32as = $(CROSS32CC) $(a_flags) -c -o $@ $<
+
+diff --git a/arch/powerpc/kernel/vdso64/Makefile b/arch/powerpc/kernel/vdso64/Makefile
+index 79da65d..f11c21b 100644
+--- a/arch/powerpc/kernel/vdso64/Makefile
++++ b/arch/powerpc/kernel/vdso64/Makefile
+@@ -36,7 +36,8 @@ $(obj-vdso64): %.o: %.S
+
+ # actual build commands
+ quiet_cmd_vdso64ld = VDSO64L $@
+- cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $^ -o $@
++ cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $^ -o $@ \
++ $(if $(AFTER_LINK),; $(AFTER_LINK))
+ quiet_cmd_vdso64as = VDSO64A $@
+ cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $<
+
+diff --git a/arch/x86/vdso/Makefile b/arch/x86/vdso/Makefile
+index 4a2afa1..12ad9f7 100644
+--- a/arch/x86/vdso/Makefile
++++ b/arch/x86/vdso/Makefile
+@@ -120,8 +120,9 @@ $(obj)/vdso32-syms.lds: $(vdso32.so-y:%=$(obj)/vdso32-%-syms.lds) FORCE
+ quiet_cmd_vdso = VDSO $@
+ cmd_vdso = $(CC) -nostdlib -o $@ \
+ $(VDSO_LDFLAGS) $(VDSO_LDFLAGS_$(filter %.lds,$(^F))) \
+- -Wl,-T,$(filter %.lds,$^) $(filter %.o,$^) && \
+- sh $(srctree)/$(src)/checkundef.sh '$(NM)' '$@'
++ -Wl,-T,$(filter %.lds,$^) $(filter %.o,$^) \
++ $(if $(AFTER_LINK),; $(AFTER_LINK)) && \
++ sh $(srctree)/$(src)/checkundef.sh '$(NM)' '$@'
+
+ VDSO_LDFLAGS = -fPIC -shared $(call cc-ldoption, -Wl$(comma)--hash-style=sysv)
+ GCOV_PROFILE := n
+
+diff --git a/arch/s390/kernel/vdso32/Makefile b/arch/s390/kernel/vdso32/Makefile
+index d13e875..28a3e1ad 100644
+--- a/arch/s390/kernel/vdso32/Makefile
++++ b/arch/s390/kernel/vdso32/Makefile
+@@ -40,7 +40,8 @@ $(obj-vdso32): %.o: %.S
+
+ # actual build commands
+ quiet_cmd_vdso32ld = VDSO32L $@
+- cmd_vdso32ld = $(CC) $(c_flags) -Wl,-T $^ -o $@
++ cmd_vdso32ld = $(CC) $(c_flags) -Wl,-T $^ -o $@ \
++ $(if $(AFTER_LINK),; $(AFTER_LINK))
+ quiet_cmd_vdso32as = VDSO32A $@
+ cmd_vdso32as = $(CC) $(a_flags) -c -o $@ $<
+
+diff --git a/arch/s390/kernel/vdso64/Makefile b/arch/s390/kernel/vdso64/Makefile
+index 449352d..e90e656 100644
+--- a/arch/s390/kernel/vdso64/Makefile
++++ b/arch/s390/kernel/vdso64/Makefile
+@@ -40,7 +40,8 @@ $(obj-vdso64): %.o: %.S
+
+ # actual build commands
+ quiet_cmd_vdso64ld = VDSO64L $@
+- cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $^ -o $@
++ cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $^ -o $@ \
++ $(if $(AFTER_LINK),; $(AFTER_LINK))
+ quiet_cmd_vdso64as = VDSO64A $@
+ cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $<
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-netconsole-deadlock.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-netconsole-deadlock.patch
new file mode 100644
index 000000000..677ed760b
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-netconsole-deadlock.patch
@@ -0,0 +1,56 @@
+commit 13f172ff26563995049abe73f6eeba828de3c09d
+Author: Neil Horman <nhorman@tuxdriver.com>
+Date: Fri Apr 22 08:10:59 2011 +0000
+
+ netconsole: fix deadlock when removing net driver that netconsole is using (v2)
+
+ A deadlock was reported to me recently that occured when netconsole was being
+ used in a virtual guest. If the virtio_net driver was removed while netconsole
+ was setup to use an interface that was driven by that driver, the guest
+ deadlocked. No backtrace was provided because netconsole was the only console
+ configured, but it became clear pretty quickly what the problem was. In
+ netconsole_netdev_event, if we get an unregister event, we call
+ __netpoll_cleanup with the target_list_lock held and irqs disabled.
+ __netpoll_cleanup can, if pending netpoll packets are waiting call
+ cancel_delayed_work_sync, which is a sleeping path. the might_sleep call in
+ that path gets triggered, causing a console warning to be issued. The
+ netconsole write handler of course tries to take the target_list_lock again,
+ which we already hold, causing deadlock.
+
+ The fix is pretty striaghtforward. Simply drop the target_list_lock and
+ re-enable irqs prior to calling __netpoll_cleanup, the re-acquire the lock, and
+ restart the loop. Confirmed by myself to fix the problem reported.
+
+ Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
+ CC: "David S. Miller" <davem@davemloft.net>
+ Signed-off-by: David S. Miller <davem@davemloft.net>
+
+diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c
+index dfb67eb..eb41e44 100644
+--- a/drivers/net/netconsole.c
++++ b/drivers/net/netconsole.c
+@@ -671,6 +671,7 @@ static int netconsole_netdev_event(struct notifier_block *this,
+ goto done;
+
+ spin_lock_irqsave(&target_list_lock, flags);
++restart:
+ list_for_each_entry(nt, &target_list, list) {
+ netconsole_target_get(nt);
+ if (nt->np.dev == dev) {
+@@ -683,9 +684,16 @@ static int netconsole_netdev_event(struct notifier_block *this,
+ * rtnl_lock already held
+ */
+ if (nt->np.dev) {
++ spin_unlock_irqrestore(
++ &target_list_lock,
++ flags);
+ __netpoll_cleanup(&nt->np);
++ spin_lock_irqsave(&target_list_lock,
++ flags);
+ dev_put(nt->np.dev);
+ nt->np.dev = NULL;
++ netconsole_target_put(nt);
++ goto restart;
+ }
+ /* Fall through */
+ case NETDEV_GOING_DOWN:
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-selinux-mprotect-checks.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-selinux-mprotect-checks.patch
new file mode 100644
index 000000000..010a63c43
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-selinux-mprotect-checks.patch
@@ -0,0 +1,124 @@
+This needs a fixed toolchain, and a userspace rebuild to work.
+For these reasons, it's had difficulty getting upstream.
+
+ie, Fedora has a new enough toolchain, and has been rebuilt, so we don't need
+the ifdefs. Other distros don't/haven't, and this patch would break them
+if pushed upstream.
+
+
+Subject: [Fwd: Re: [PATCH] Disable execmem for sparc]
+From: Stephen Smalley <sds@tycho.nsa.gov>
+To: Dave Jones <davej@redhat.com>
+Date: Wed, 28 Apr 2010 16:04:56 -0400
+Message-Id: <1272485096.6013.326.camel@moss-pluto.epoch.ncsc.mil>
+
+-------- Forwarded Message --------
+From: Stephen Smalley <sds@tycho.nsa.gov>
+To: David Miller <davem@davemloft.net>
+Cc: tcallawa@redhat.com, dennis@ausil.us, sparclinux@vger.kernel.org, dgilmore@redhat.com, jmorris@namei.org, eparis@parisplace.org
+Subject: Re: [PATCH] Disable execmem for sparc
+Date: Wed, 28 Apr 2010 15:57:57 -0400
+
+On Tue, 2010-04-27 at 11:47 -0700, David Miller wrote:
+> From: "Tom \"spot\" Callaway" <tcallawa@redhat.com>
+> Date: Tue, 27 Apr 2010 14:20:21 -0400
+>
+> > [root@apollo ~]$ cat /proc/2174/maps
+> > 00010000-00014000 r-xp 00000000 fd:00 15466577
+> > /sbin/mingetty
+> > 00022000-00024000 rwxp 00002000 fd:00 15466577
+> > /sbin/mingetty
+> > 00024000-00046000 rwxp 00000000 00:00 0
+> > [heap]
+>
+> SELINUX probably barfs on the executable heap, the PLT is in the HEAP
+> just like powerpc32 and that's why VM_DATA_DEFAULT_FLAGS has to set
+> both executable and writable.
+>
+> You also can't remove the CONFIG_PPC32 ifdefs in selinux, since
+> because of the VM_DATA_DEFAULT_FLAGS setting used still in that arch,
+> the heap will always have executable permission, just like sparc does.
+> You have to support those binaries forever, whether you like it or not.
+>
+> Let's just replace the CONFIG_PPC32 ifdef in SELINUX with CONFIG_PPC32
+> || CONFIG_SPARC as in Tom's original patch and let's be done with
+> this.
+>
+> In fact I would go through all the arch/ header files and check the
+> VM_DATA_DEFAULT_FLAGS settings and add the necessary new ifdefs to the
+> SELINUX code so that other platforms don't have the pain of having to
+> go through this process too.
+
+To avoid maintaining per-arch ifdefs, it seems that we could just
+directly use (VM_DATA_DEFAULT_FLAGS & VM_EXEC) as the basis for deciding
+whether to enable or disable these checks. VM_DATA_DEFAULT_FLAGS isn't
+constant on some architectures but instead depends on
+current->personality, but we want this applied uniformly. So we'll just
+use the initial task state to determine whether or not to enable these
+checks.
+
+Signed-off-by: Stephen Smalley <sds@tycho.nsa.gov>
+
+diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
+index ebee467..a03fd74 100644
+--- a/security/selinux/hooks.c
++++ b/security/selinux/hooks.c
+@@ -2999,13 +2999,15 @@ static int selinux_file_ioctl(struct file *file, unsigned int cmd,
+ return file_has_perm(cred, file, av);
+ }
+
++static int default_noexec;
++
+ static int file_map_prot_check(struct file *file, unsigned long prot, int shared)
+ {
+ const struct cred *cred = current_cred();
+ int rc = 0;
+
+-#ifndef CONFIG_PPC32
+- if ((prot & PROT_EXEC) && (!file || (!shared && (prot & PROT_WRITE)))) {
++ if (default_noexec &&
++ (prot & PROT_EXEC) && (!file || (!shared && (prot & PROT_WRITE)))) {
+ /*
+ * We are making executable an anonymous mapping or a
+ * private file mapping that will also be writable.
+@@ -3015,7 +3017,6 @@ static int file_map_prot_check(struct file *file, unsigned long prot, int shared
+ if (rc)
+ goto error;
+ }
+-#endif
+
+ if (file) {
+ /* read access is always possible with a mapping */
+@@ -3076,8 +3077,8 @@ static int selinux_file_mprotect(struct vm_area_struct *vma,
+ if (selinux_checkreqprot)
+ prot = reqprot;
+
+-#ifndef CONFIG_PPC32
+- if ((prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) {
++ if (default_noexec &&
++ (prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) {
+ int rc = 0;
+ if (vma->vm_start >= vma->vm_mm->start_brk &&
+ vma->vm_end <= vma->vm_mm->brk) {
+@@ -3099,7 +3100,6 @@ static int selinux_file_mprotect(struct vm_area_struct *vma,
+ if (rc)
+ return rc;
+ }
+-#endif
+
+ return file_map_prot_check(vma->vm_file, prot, vma->vm_flags&VM_SHARED);
+ }
+@@ -5662,6 +5662,8 @@ static __init int selinux_init(void)
+ /* Set the security state for the initial task. */
+ cred_init_security();
+
++ default_noexec = !(VM_DATA_DEFAULT_FLAGS & VM_EXEC);
++
+ sel_inode_cache = kmem_cache_create("selinux_inode_security",
+ sizeof(struct inode_security_struct),
+ 0, SLAB_PANIC, NULL);
+
+--
+Stephen Smalley
+National Security Agency
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-serial-460800.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-serial-460800.patch
new file mode 100644
index 000000000..9aa392c9e
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-serial-460800.patch
@@ -0,0 +1,70 @@
+diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
+index 2209620..659c1bb 100644
+--- a/drivers/tty/serial/8250.c
++++ b/drivers/tty/serial/8250.c
+@@ -7,6 +7,9 @@
+ *
+ * Copyright (C) 2001 Russell King.
+ *
++ * 2005/09/16: Enabled higher baud rates for 16C95x.
++ * (Mathias Adam <a2@adamis.de>)
++ *
+ * 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
+@@ -2227,6 +2230,14 @@ static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int
+ else if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
+ baud == (port->uartclk/8))
+ quot = 0x8002;
++ /*
++ * For 16C950s UART_TCR is used in combination with divisor==1
++ * to achieve baud rates up to baud_base*4.
++ */
++ else if ((port->type == PORT_16C950) &&
++ baud > (port->uartclk/16))
++ quot = 1;
++
+ else
+ quot = uart_get_divisor(port, baud);
+
+@@ -2240,7 +2251,7 @@ serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
+ struct uart_8250_port *up = (struct uart_8250_port *)port;
+ unsigned char cval, fcr = 0;
+ unsigned long flags;
+- unsigned int baud, quot;
++ unsigned int baud, quot, max_baud;
+
+ switch (termios->c_cflag & CSIZE) {
+ case CS5:
+@@ -2272,9 +2283,10 @@ serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
+ /*
+ * Ask the core to calculate the divisor for us.
+ */
++ max_baud = (up->port.type == PORT_16C950 ? port->uartclk/4 : port->uartclk/16);
+ baud = uart_get_baud_rate(port, termios, old,
+ port->uartclk / 16 / 0xffff,
+- port->uartclk / 16);
++ max_baud);
+ quot = serial8250_get_divisor(port, baud);
+
+ /*
+@@ -2311,6 +2323,19 @@ serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
+ spin_lock_irqsave(&up->port.lock, flags);
+
+ /*
++ * 16C950 supports additional prescaler ratios between 1:16 and 1:4
++ * thus increasing max baud rate to uartclk/4.
++ */
++ if (up->port.type == PORT_16C950) {
++ if (baud == port->uartclk/4)
++ serial_icr_write(up, UART_TCR, 0x4);
++ else if (baud == port->uartclk/8)
++ serial_icr_write(up, UART_TCR, 0x8);
++ else
++ serial_icr_write(up, UART_TCR, 0);
++ }
++
++ /*
+ * Update the per-port timeout.
+ */
+ uart_update_timeout(port, termios->c_cflag, baud);
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-silence-acpi-blacklist.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-silence-acpi-blacklist.patch
new file mode 100644
index 000000000..c5997bb6e
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-silence-acpi-blacklist.patch
@@ -0,0 +1,25 @@
+diff -up linux-2.6.26.noarch/drivers/acpi/blacklist.c.jx linux-2.6.26.noarch/drivers/acpi/blacklist.c
+--- linux-2.6.26.noarch/drivers/acpi/blacklist.c.jx 2008-07-13 17:51:29.000000000 -0400
++++ linux-2.6.26.noarch/drivers/acpi/blacklist.c 2008-08-12 14:21:39.000000000 -0400
+@@ -81,18 +81,18 @@ static int __init blacklist_by_year(void
+
+ /* Doesn't exist? Likely an old system */
+ if (!dmi_get_date(DMI_BIOS_DATE, &year, NULL, NULL)) {
+- printk(KERN_ERR PREFIX "no DMI BIOS year, "
++ printk(KERN_INFO PREFIX "no DMI BIOS year, "
+ "acpi=force is required to enable ACPI\n" );
+ return 1;
+ }
+ /* 0? Likely a buggy new BIOS */
+ if (year == 0) {
+- printk(KERN_ERR PREFIX "DMI BIOS year==0, "
++ printk(KERN_INFO PREFIX "DMI BIOS year==0, "
+ "assuming ACPI-capable machine\n" );
+ return 0;
+ }
+ if (year < CONFIG_ACPI_BLACKLIST_YEAR) {
+- printk(KERN_ERR PREFIX "BIOS age (%d) fails cutoff (%d), "
++ printk(KERN_INFO PREFIX "BIOS age (%d) fails cutoff (%d), "
+ "acpi=force is required to enable ACPI\n",
+ year, CONFIG_ACPI_BLACKLIST_YEAR);
+ return 1;
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-silence-fbcon-logo.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-silence-fbcon-logo.patch
new file mode 100644
index 000000000..45ab73331
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-silence-fbcon-logo.patch
@@ -0,0 +1,42 @@
+diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
+index 1657b96..4c5c2be 100644
+--- a/drivers/video/console/fbcon.c
++++ b/drivers/video/console/fbcon.c
+@@ -631,13 +631,15 @@ static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info,
+ kfree(save);
+ }
+
+- if (logo_lines > vc->vc_bottom) {
+- logo_shown = FBCON_LOGO_CANSHOW;
+- printk(KERN_INFO
+- "fbcon_init: disable boot-logo (boot-logo bigger than screen).\n");
+- } else if (logo_shown != FBCON_LOGO_DONTSHOW) {
+- logo_shown = FBCON_LOGO_DRAW;
+- vc->vc_top = logo_lines;
++ if (logo_shown != FBCON_LOGO_DONTSHOW) {
++ if (logo_lines > vc->vc_bottom) {
++ logo_shown = FBCON_LOGO_CANSHOW;
++ printk(KERN_INFO
++ "fbcon_init: disable boot-logo (boot-logo bigger than screen).\n");
++ } else {
++ logo_shown = FBCON_LOGO_DRAW;
++ vc->vc_top = logo_lines;
++ }
+ }
+ }
+ #endif /* MODULE */
+@@ -3489,6 +3491,14 @@ static int __init fb_console_init(void)
+ return 0;
+ }
+
++static int __init quiet_logo(char *str)
++{
++ logo_shown = FBCON_LOGO_DONTSHOW;
++ return 0;
++}
++
++early_param("quiet", quiet_logo);
++
+ module_init(fb_console_init);
+
+ #ifdef MODULE
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-silence-noise.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-silence-noise.patch
new file mode 100644
index 000000000..32c678b1f
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-silence-noise.patch
@@ -0,0 +1,72 @@
+From b4e96f34c17e5a79cd28774cc722bb33e7e02c6e Mon Sep 17 00:00:00 2001
+From: Peter Jones <pjones@redhat.com>
+Date: Thu, 25 Sep 2008 16:23:33 -0400
+Subject: [PATCH] Don't print an error message just because there's no i8042 chip.
+
+Some systems, such as EFI-based Apple systems, won't necessarily have an
+i8042 to initialize. We shouldn't be printing an error message in this
+case, since not detecting the chip is the correct behavior.
+---
+ drivers/input/serio/i8042.c | 4 +---
+ 1 files changed, 1 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
+index 170f71e..4f3e632 100644
+--- a/drivers/input/serio/i8042.c
++++ b/drivers/input/serio/i8042.c
+@@ -701,10 +701,8 @@ static int __devinit i8042_check_aux(void)
+
+ static int i8042_controller_check(void)
+ {
+- if (i8042_flush() == I8042_BUFFER_SIZE) {
+- pr_err("No controller found\n");
++ if (i8042_flush() == I8042_BUFFER_SIZE)
+ return -ENODEV;
+- }
+
+ return 0;
+ }
+--
+1.6.0.1
+
+Socket fuzzers like sfuzz will trigger this printk a lot, even though it's
+ratelimited. It isn't particularly useful, so just remove it.
+
+Signed-off-by: Dave Jones <davej@redhat.com>
+
+--- linux-2.6.27.noarch/net/can/af_can.c~ 2008-12-11 16:53:48.000000000 -0500
++++ linux-2.6.27.noarch/net/can/af_can.c 2008-12-11 16:54:42.000000000 -0500
+@@ -134,13 +134,9 @@ static int can_create(struct net *net, s
+ err = request_module("can-proto-%d", protocol);
+
+ /*
+- * In case of error we only print a message but don't
+- * return the error code immediately. Below we will
+- * return -EPROTONOSUPPORT
++ * In case of error we don't return the error code immediately.
++ * Below we will return -EPROTONOSUPPORT
+ */
+- if (err && printk_ratelimit())
+- printk(KERN_ERR "can: request_module "
+- "(can-proto-%d) failed.\n", protocol);
+ }
+ #endif
+
+This was removed in revision 1.6 of linux-2.6-silence-noise.patch
+in ye olde CVS tree. I have no idea why. Originally the pr_debug in
+device_pm_remove was nuked as well, but that seems to have gotten lost in
+the r1.634 of kernel.spec (2.6.26-rc2-git5.)
+
+diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
+index 2a52270..bacbdd2 100644
+--- a/drivers/base/power/main.c
++++ b/drivers/base/power/main.c
+@@ -87,8 +87,6 @@ void device_pm_unlock(void)
+ */
+ void device_pm_add(struct device *dev)
+ {
+- pr_debug("PM: Adding info for %s:%s\n",
+- dev->bus ? dev->bus->name : "No Bus", dev_name(dev));
+ mutex_lock(&dpm_list_mtx);
+ if (dev->parent && dev->parent->power.in_suspend)
+ dev_warn(dev, "parent %s should not be sleeping\n",
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-sparc-selinux-mprotect-checks.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-sparc-selinux-mprotect-checks.patch
new file mode 100644
index 000000000..cc821e323
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-sparc-selinux-mprotect-checks.patch
@@ -0,0 +1,35 @@
+diff -up linux-2.6.24.sparc64/security/selinux/hooks.c.BAD linux-2.6.24.sparc64/security/selinux/hooks.c
+--- linux-2.6.24.sparc64/security/selinux/hooks.c.BAD 2008-03-21 14:28:06.000000000 -0400
++++ linux-2.6.24.sparc64/security/selinux/hooks.c 2008-03-21 14:29:10.000000000 -0400
+@@ -3018,6 +3018,7 @@ static int file_map_prot_check(struct fi
+ const struct cred *cred = current_cred();
+ int rc = 0;
+
++#ifndef CONFIG_SPARC
+ if ((prot & PROT_EXEC) && (!file || (!shared && (prot & PROT_WRITE)))) {
+ /*
+ * We are making executable an anonymous mapping or a
+@@ -3028,6 +3029,7 @@ static int file_map_prot_check(struct fi
+ if (rc)
+ goto error;
+ }
++#endif
+
+ if (file) {
+ /* read access is always possible with a mapping */
+@@ -3081,6 +3081,7 @@ static int selinux_file_mprotect(struct
+ if (selinux_checkreqprot)
+ prot = reqprot;
+
++#ifndef CONFIG_SPARC
+ if ((prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) {
+ rc = 0;
+ if (vma->vm_start >= vma->vm_mm->start_brk &&
+@@ -3103,6 +3103,7 @@ static int selinux_file_mprotect(struct
+ if (rc)
+ return rc;
+ }
++#endif
+
+ return file_map_prot_check(vma->vm_file, prot, vma->vm_flags&VM_SHARED);
+ }
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-tracehook.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-tracehook.patch
new file mode 100644
index 000000000..027c6d533
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-tracehook.patch
@@ -0,0 +1,129 @@
+From: Oleg Nesterov <oleg@redhat.com>
+
+[PATCH] signals: check ->group_stop_count after tracehook_get_signal()
+
+Move the call to do_signal_stop() down, after tracehook call.
+This makes ->group_stop_count condition visible to tracers before
+do_signal_stop() will participate in this group-stop.
+
+Currently the patch has no effect, tracehook_get_signal() always
+returns 0.
+
+Signed-off-by: Oleg Nesterov <oleg@redhat.com>
+Signed-off-by: Roland McGrath <roland@redhat.com>
+---
+ include/linux/ptrace.h | 1 +
+ include/linux/sched.h | 1 +
+ include/linux/tracehook.h | 10 +++++-----
+ kernel/ptrace.c | 2 +-
+ kernel/signal.c | 4 ++--
+ 5 files changed, 10 insertions(+), 8 deletions(-)
+
+diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h
+index 092a04f..619cdf0 100644
+--- a/include/linux/ptrace.h
++++ b/include/linux/ptrace.h
+@@ -106,6 +106,7 @@ extern int ptrace_traceme(void);
+ extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len);
+ extern int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len);
+ extern int ptrace_attach(struct task_struct *tsk);
++extern bool __ptrace_detach(struct task_struct *tracer, struct task_struct *tracee);
+ extern int ptrace_detach(struct task_struct *, unsigned int);
+ extern void ptrace_disable(struct task_struct *);
+ extern int ptrace_check_attach(struct task_struct *task, int kill);
+diff --git a/include/linux/sched.h b/include/linux/sched.h
+index 2238745..09f26df 100644
+--- a/include/linux/sched.h
++++ b/include/linux/sched.h
+@@ -2061,6 +2061,7 @@ extern int kill_pgrp(struct pid *pid, in
+ extern int kill_pid(struct pid *pid, int sig, int priv);
+ extern int kill_proc_info(int, struct siginfo *, pid_t);
+ extern int do_notify_parent(struct task_struct *, int);
++extern void do_notify_parent_cldstop(struct task_struct *, int);
+ extern void __wake_up_parent(struct task_struct *p, struct task_struct *parent);
+ extern void force_sig(int, struct task_struct *);
+ extern int send_sig(int, struct task_struct *, int);
+diff --git a/include/linux/tracehook.h b/include/linux/tracehook.h
+index 3a2e66d..98917e9 100644
+--- a/include/linux/tracehook.h
++++ b/include/linux/tracehook.h
+@@ -134,7 +134,7 @@ static inline __must_check int tracehook
+ */
+ static inline void tracehook_report_syscall_exit(struct pt_regs *regs, int step)
+ {
+- if (step) {
++ if (step && (task_ptrace(current) & PT_PTRACED)) {
+ siginfo_t info;
+ user_single_step_siginfo(current, regs, &info);
+ force_sig_info(SIGTRAP, &info, current);
+@@ -156,7 +156,7 @@ static inline int tracehook_unsafe_exec(
+ {
+ int unsafe = 0;
+ int ptrace = task_ptrace(task);
+- if (ptrace & PT_PTRACED) {
++ if (ptrace) {
+ if (ptrace & PT_PTRACE_CAP)
+ unsafe |= LSM_UNSAFE_PTRACE_CAP;
+ else
+@@ -178,7 +178,7 @@ static inline int tracehook_unsafe_exec(
+ */
+ static inline struct task_struct *tracehook_tracer_task(struct task_struct *tsk)
+ {
+- if (task_ptrace(tsk) & PT_PTRACED)
++ if (task_ptrace(tsk))
+ return rcu_dereference(tsk->parent);
+ return NULL;
+ }
+@@ -386,7 +386,7 @@ static inline void tracehook_signal_hand
+ const struct k_sigaction *ka,
+ struct pt_regs *regs, int stepping)
+ {
+- if (stepping)
++ if (stepping && (task_ptrace(current) & PT_PTRACED))
+ ptrace_notify(SIGTRAP);
+ }
+
+@@ -492,7 +492,7 @@ static inline int tracehook_get_signal(s
+ */
+ static inline int tracehook_notify_jctl(int notify, int why)
+ {
+- return notify ?: (current->ptrace & PT_PTRACED) ? why : 0;
++ return notify ?: task_ptrace(current) ? why : 0;
+ }
+
+ /**
+diff --git a/kernel/ptrace.c b/kernel/ptrace.c
+index 99bbaa3..84d9f8f 100644
+--- a/kernel/ptrace.c
++++ b/kernel/ptrace.c
+@@ -270,7 +270,7 @@ static int ignoring_children(struct sigh
+ * reap it now, in that case we must also wake up sub-threads sleeping in
+ * do_wait().
+ */
+-static bool __ptrace_detach(struct task_struct *tracer, struct task_struct *p)
++bool __ptrace_detach(struct task_struct *tracer, struct task_struct *p)
+ {
+ __ptrace_unlink(p);
+
+diff --git a/kernel/signal.c b/kernel/signal.c
+index 4e3cff1..b74324d 100644
+--- a/kernel/signal.c
++++ b/kernel/signal.c
+@@ -1522,7 +1522,7 @@ int do_notify_parent(struct task_struct
+ return ret;
+ }
+
+-static void do_notify_parent_cldstop(struct task_struct *tsk, int why)
++void do_notify_parent_cldstop(struct task_struct *tsk, int why)
+ {
+ struct siginfo info;
+ unsigned long flags;
+@@ -1794,7 +1794,7 @@ static int do_signal_stop(int signr)
+ static int ptrace_signal(int signr, siginfo_t *info,
+ struct pt_regs *regs, void *cookie)
+ {
+- if (!task_ptrace(current))
++ if (!(task_ptrace(current) & PT_PTRACED))
+ return signr;
+
+ ptrace_signal_deliver(regs, cookie);
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-upstream-reverts.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-upstream-reverts.patch
new file mode 100644
index 000000000..607602cfc
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-upstream-reverts.patch
@@ -0,0 +1 @@
+nil
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-usb-pci-autosuspend.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-usb-pci-autosuspend.patch
new file mode 100644
index 000000000..610a7654d
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-usb-pci-autosuspend.patch
@@ -0,0 +1,22 @@
+commit 15d89120d03116adbbf3226a85fbd2fff0b12576
+Author: Matthew Garrett <mjg@redhat.com>
+Date: Fri Sep 17 11:09:12 2010 -0400
+
+ Enable USB PCI autosuspend by default
+
+diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c
+index c3f9854..3c020e6 100644
+--- a/drivers/usb/core/hcd-pci.c
++++ b/drivers/usb/core/hcd-pci.c
+@@ -248,8 +248,10 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
+ goto err4;
+ set_hs_companion(dev, hcd);
+
+- if (pci_dev_run_wake(dev))
++ if (pci_dev_run_wake(dev)) {
+ pm_runtime_put_noidle(&dev->dev);
++ pm_runtime_allow(&dev->dev);
++ }
+ return retval;
+
+ err4:
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-utrace-ptrace.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-utrace-ptrace.patch
new file mode 100644
index 000000000..bc5681d95
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-utrace-ptrace.patch
@@ -0,0 +1,2028 @@
+implement utrace-ptrace
+
+The patch adds the new file, kernel/ptrace-utrace.c, which contains
+the new implementation of ptrace over utrace.
+
+This file is not compiled until we have CONFIG_UTRACE option, will be
+added by the next "utrace core" patch.
+
+It's supposed to be an invisible implementation change, nothing should
+change to userland when CONFIG_UTRACE is enabled.
+
+Signed-off-by: Roland McGrath <roland@redhat.com>
+Signed-off-by: Oleg Nesterov <oleg@redhat.com>
+---
+ include/linux/ptrace.h | 1 +
+ kernel/Makefile | 1 +
+ kernel/ptrace-utrace.c | 1187 ++++++++++++++++++++++++++++++++++++++++++++++++
+ kernel/ptrace.c | 690 ++++++++++++++--------------
+ kernel/utrace.c | 16 +
+ 5 files changed, 1544 insertions(+), 351 deletions(-)
+
+diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h
+index 619cdf0..e391bdb 100644
+--- a/include/linux/ptrace.h
++++ b/include/linux/ptrace.h
+@@ -100,6 +100,7 @@
+ #include <linux/sched.h> /* For struct task_struct. */
+
+
++extern void ptrace_notify_stop(struct task_struct *tracee);
+ extern long arch_ptrace(struct task_struct *child, long request,
+ unsigned long addr, unsigned long data);
+ extern int ptrace_traceme(void);
+diff --git a/kernel/Makefile b/kernel/Makefile
+index 1172528..9a815a5 100644
+--- a/kernel/Makefile
++++ b/kernel/Makefile
+@@ -71,6 +71,7 @@ obj-$(CONFIG_RESOURCE_COUNTERS) += res_c
+ obj-$(CONFIG_SMP) += stop_machine.o
+ obj-$(CONFIG_KPROBES_SANITY_TEST) += test_kprobes.o
+ obj-$(CONFIG_UTRACE) += utrace.o
++obj-$(CONFIG_UTRACE) += ptrace-utrace.o
+ obj-$(CONFIG_AUDIT) += audit.o auditfilter.o
+ obj-$(CONFIG_AUDITSYSCALL) += auditsc.o
+ obj-$(CONFIG_AUDIT_WATCH) += audit_watch.o
+diff --git a/kernel/ptrace-utrace.c b/kernel/ptrace-utrace.c
+new file mode 100644
+index ...a5bcb9e 100644
+--- /dev/null
++++ b/kernel/ptrace-utrace.c
+@@ -0,0 +1,1187 @@
++/*
++ * linux/kernel/ptrace.c
++ *
++ * (C) Copyright 1999 Linus Torvalds
++ *
++ * Common interfaces for "ptrace()" which we do not want
++ * to continually duplicate across every architecture.
++ */
++
++#include <linux/capability.h>
++#include <linux/module.h>
++#include <linux/sched.h>
++#include <linux/errno.h>
++#include <linux/mm.h>
++#include <linux/highmem.h>
++#include <linux/pagemap.h>
++#include <linux/smp_lock.h>
++#include <linux/ptrace.h>
++#include <linux/utrace.h>
++#include <linux/security.h>
++#include <linux/signal.h>
++#include <linux/audit.h>
++#include <linux/pid_namespace.h>
++#include <linux/syscalls.h>
++#include <linux/uaccess.h>
++
++/*
++ * ptrace a task: make the debugger its new parent and
++ * move it to the ptrace list.
++ *
++ * Must be called with the tasklist lock write-held.
++ */
++void __ptrace_link(struct task_struct *child, struct task_struct *new_parent)
++{
++ BUG_ON(!list_empty(&child->ptrace_entry));
++ list_add(&child->ptrace_entry, &new_parent->ptraced);
++ child->parent = new_parent;
++}
++
++/*
++ * unptrace a task: move it back to its original parent and
++ * remove it from the ptrace list.
++ *
++ * Must be called with the tasklist lock write-held.
++ */
++void __ptrace_unlink(struct task_struct *child)
++{
++ BUG_ON(!child->ptrace);
++
++ child->ptrace = 0;
++ child->parent = child->real_parent;
++ list_del_init(&child->ptrace_entry);
++}
++
++struct ptrace_context {
++ int options;
++
++ int signr;
++ siginfo_t *siginfo;
++
++ int stop_code;
++ unsigned long eventmsg;
++
++ enum utrace_resume_action resume;
++};
++
++#define PT_UTRACED 0x00001000
++
++#define PTRACE_O_SYSEMU 0x100
++#define PTRACE_O_DETACHED 0x200
++
++#define PTRACE_EVENT_SYSCALL (1 << 16)
++#define PTRACE_EVENT_SIGTRAP (2 << 16)
++#define PTRACE_EVENT_SIGNAL (3 << 16)
++/* events visible to user-space */
++#define PTRACE_EVENT_MASK 0xFFFF
++
++static inline bool ptrace_event_pending(struct ptrace_context *ctx)
++{
++ return ctx->stop_code != 0;
++}
++
++static inline int get_stop_event(struct ptrace_context *ctx)
++{
++ return ctx->stop_code >> 8;
++}
++
++static inline void set_stop_code(struct ptrace_context *ctx, int event)
++{
++ ctx->stop_code = (event << 8) | SIGTRAP;
++}
++
++static inline struct ptrace_context *
++ptrace_context(struct utrace_engine *engine)
++{
++ return engine->data;
++}
++
++static const struct utrace_engine_ops ptrace_utrace_ops; /* forward decl */
++
++static struct utrace_engine *ptrace_lookup_engine(struct task_struct *tracee)
++{
++ return utrace_attach_task(tracee, UTRACE_ATTACH_MATCH_OPS,
++ &ptrace_utrace_ops, NULL);
++}
++
++static int utrace_barrier_uninterruptible(struct task_struct *target,
++ struct utrace_engine *engine)
++{
++ for (;;) {
++ int err = utrace_barrier(target, engine);
++
++ if (err != -ERESTARTSYS)
++ return err;
++
++ schedule_timeout_uninterruptible(1);
++ }
++}
++
++static struct utrace_engine *
++ptrace_reuse_engine(struct task_struct *tracee)
++{
++ struct utrace_engine *engine;
++ struct ptrace_context *ctx;
++ int err = -EPERM;
++
++ engine = ptrace_lookup_engine(tracee);
++ if (IS_ERR(engine))
++ return engine;
++
++ ctx = ptrace_context(engine);
++ if (unlikely(ctx->options == PTRACE_O_DETACHED)) {
++ /*
++ * Try to reuse this self-detaching engine.
++ * The only caller which can hit this case is ptrace_attach(),
++ * it holds ->cred_guard_mutex.
++ */
++ ctx->options = 0;
++ ctx->eventmsg = 0;
++
++ /* make sure we don't get unwanted reports */
++ err = utrace_set_events(tracee, engine, UTRACE_EVENT(QUIESCE));
++ if (!err || err == -EINPROGRESS) {
++ ctx->resume = UTRACE_RESUME;
++ /* synchronize with ptrace_report_signal() */
++ err = utrace_barrier_uninterruptible(tracee, engine);
++ }
++
++ if (!err) {
++ WARN_ON(engine->ops != &ptrace_utrace_ops &&
++ !tracee->exit_state);
++ return engine;
++ }
++
++ WARN_ON(engine->ops == &ptrace_utrace_ops);
++ }
++
++ utrace_engine_put(engine);
++ return ERR_PTR(err);
++}
++
++static struct utrace_engine *
++ptrace_attach_engine(struct task_struct *tracee)
++{
++ struct utrace_engine *engine;
++ struct ptrace_context *ctx;
++
++ if (unlikely(task_utrace_flags(tracee))) {
++ engine = ptrace_reuse_engine(tracee);
++ if (!IS_ERR(engine) || IS_ERR(engine) == -EPERM)
++ return engine;
++ }
++
++ ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
++ if (unlikely(!ctx))
++ return ERR_PTR(-ENOMEM);
++
++ ctx->resume = UTRACE_RESUME;
++
++ engine = utrace_attach_task(tracee, UTRACE_ATTACH_CREATE |
++ UTRACE_ATTACH_EXCLUSIVE |
++ UTRACE_ATTACH_MATCH_OPS,
++ &ptrace_utrace_ops, ctx);
++ if (unlikely(IS_ERR(engine))) {
++ if (engine != ERR_PTR(-ESRCH) &&
++ engine != ERR_PTR(-ERESTARTNOINTR))
++ engine = ERR_PTR(-EPERM);
++ kfree(ctx);
++ }
++
++ return engine;
++}
++
++static inline int ptrace_set_events(struct task_struct *target,
++ struct utrace_engine *engine,
++ unsigned long options)
++{
++ struct ptrace_context *ctx = ptrace_context(engine);
++ /*
++ * We need QUIESCE for resume handling, CLONE to check
++ * for CLONE_PTRACE, other events are always reported.
++ */
++ unsigned long events = UTRACE_EVENT(QUIESCE) | UTRACE_EVENT(CLONE) |
++ UTRACE_EVENT(EXEC) | UTRACE_EVENT_SIGNAL_ALL;
++
++ ctx->options = options;
++ if (options & PTRACE_O_TRACEEXIT)
++ events |= UTRACE_EVENT(EXIT);
++
++ return utrace_set_events(target, engine, events);
++}
++
++/*
++ * Attach a utrace engine for ptrace and set up its event mask.
++ * Returns error code or 0 on success.
++ */
++static int ptrace_attach_task(struct task_struct *tracee, int options)
++{
++ struct utrace_engine *engine;
++ int err;
++
++ engine = ptrace_attach_engine(tracee);
++ if (IS_ERR(engine))
++ return PTR_ERR(engine);
++ /*
++ * It can fail only if the tracee is dead, the caller
++ * must notice this before setting PT_UTRACED.
++ */
++ err = ptrace_set_events(tracee, engine, options);
++ WARN_ON(err && !tracee->exit_state);
++ utrace_engine_put(engine);
++ return 0;
++}
++
++static int ptrace_wake_up(struct task_struct *tracee,
++ struct utrace_engine *engine,
++ enum utrace_resume_action action,
++ bool force_wakeup)
++{
++ if (force_wakeup) {
++ unsigned long flags;
++ /*
++ * Preserve the compatibility bug. Historically ptrace
++ * wakes up the tracee even if it should not. Clear
++ * SIGNAL_STOP_STOPPED for utrace_wakeup().
++ */
++ if (lock_task_sighand(tracee, &flags)) {
++ tracee->signal->flags &= ~SIGNAL_STOP_STOPPED;
++ unlock_task_sighand(tracee, &flags);
++ }
++ }
++
++ if (action != UTRACE_REPORT)
++ ptrace_context(engine)->stop_code = 0;
++
++ return utrace_control(tracee, engine, action);
++}
++
++static void ptrace_detach_task(struct task_struct *tracee, int sig)
++{
++ /*
++ * If true, the caller is PTRACE_DETACH, otherwise
++ * the tracer detaches implicitly during exit.
++ */
++ bool explicit = (sig >= 0);
++ struct utrace_engine *engine = ptrace_lookup_engine(tracee);
++ enum utrace_resume_action action = UTRACE_DETACH;
++ struct ptrace_context *ctx;
++
++ if (unlikely(IS_ERR(engine)))
++ return;
++
++ ctx = ptrace_context(engine);
++
++ if (!explicit) {
++ int err;
++
++ /*
++ * We are going to detach, the tracee can be running.
++ * Ensure ptrace_report_signal() won't report a signal.
++ */
++ ctx->resume = UTRACE_DETACH;
++ err = utrace_barrier_uninterruptible(tracee, engine);
++
++ if (!err && ctx->siginfo) {
++ /*
++ * The tracee has already reported a signal
++ * before utrace_barrier().
++ *
++ * Resume it like we do in PTRACE_EVENT_SIGNAL
++ * case below. The difference is that we can race
++ * with ptrace_report_signal() if the tracee is
++ * running but this doesn't matter. In any case
++ * UTRACE_SIGNAL_REPORT must be pending and it
++ * can return nothing but UTRACE_DETACH.
++ */
++ action = UTRACE_RESUME;
++ }
++
++ } else if (sig) {
++ switch (get_stop_event(ctx)) {
++ case PTRACE_EVENT_SYSCALL:
++ send_sig_info(sig, SEND_SIG_PRIV, tracee);
++ break;
++
++ case PTRACE_EVENT_SIGNAL:
++ ctx->signr = sig;
++ ctx->resume = UTRACE_DETACH;
++ action = UTRACE_RESUME;
++ break;
++ }
++ }
++
++ ptrace_wake_up(tracee, engine, action, explicit);
++
++ if (action != UTRACE_DETACH)
++ ctx->options = PTRACE_O_DETACHED;
++
++ utrace_engine_put(engine);
++}
++
++static void ptrace_abort_attach(struct task_struct *tracee)
++{
++ ptrace_detach_task(tracee, 0);
++}
++
++static u32 ptrace_report_exit(u32 action, struct utrace_engine *engine,
++ long orig_code, long *code)
++{
++ struct ptrace_context *ctx = ptrace_context(engine);
++
++ WARN_ON(ptrace_event_pending(ctx) &&
++ !signal_group_exit(current->signal));
++
++ set_stop_code(ctx, PTRACE_EVENT_EXIT);
++ ctx->eventmsg = *code;
++
++ return UTRACE_STOP;
++}
++
++static void ptrace_clone_attach(struct task_struct *child,
++ int options)
++{
++ struct task_struct *parent = current;
++ struct task_struct *tracer;
++ bool abort = true;
++
++ if (unlikely(ptrace_attach_task(child, options))) {
++ WARN_ON(1);
++ return;
++ }
++
++ write_lock_irq(&tasklist_lock);
++ tracer = parent->parent;
++ if (!(tracer->flags & PF_EXITING) && parent->ptrace) {
++ child->ptrace = parent->ptrace;
++ __ptrace_link(child, tracer);
++ abort = false;
++ }
++ write_unlock_irq(&tasklist_lock);
++ if (unlikely(abort)) {
++ ptrace_abort_attach(child);
++ return;
++ }
++
++ sigaddset(&child->pending.signal, SIGSTOP);
++ set_tsk_thread_flag(child, TIF_SIGPENDING);
++}
++
++static u32 ptrace_report_clone(u32 action, struct utrace_engine *engine,
++ unsigned long clone_flags,
++ struct task_struct *child)
++{
++ struct ptrace_context *ctx = ptrace_context(engine);
++ int event = 0;
++
++ WARN_ON(ptrace_event_pending(ctx));
++
++ if (clone_flags & CLONE_UNTRACED) {
++ /* no events reported */
++ } else if (clone_flags & CLONE_VFORK) {
++ if (ctx->options & PTRACE_O_TRACEVFORK)
++ event = PTRACE_EVENT_VFORK;
++ else if (ctx->options & PTRACE_O_TRACEVFORKDONE)
++ event = PTRACE_EVENT_VFORK_DONE;
++ } else if ((clone_flags & CSIGNAL) != SIGCHLD) {
++ if (ctx->options & PTRACE_O_TRACECLONE)
++ event = PTRACE_EVENT_CLONE;
++ } else if (ctx->options & PTRACE_O_TRACEFORK) {
++ event = PTRACE_EVENT_FORK;
++ }
++ /*
++ * Any of these reports implies auto-attaching the new child.
++ * So does CLONE_PTRACE, even with no event to report.
++ */
++ if ((event && event != PTRACE_EVENT_VFORK_DONE) ||
++ (clone_flags & CLONE_PTRACE))
++ ptrace_clone_attach(child, ctx->options);
++
++ if (!event)
++ return UTRACE_RESUME;
++
++ set_stop_code(ctx, event);
++ ctx->eventmsg = child->pid;
++ /*
++ * We shouldn't stop now, inside the do_fork() path.
++ * We will stop later, before return to user-mode.
++ */
++ if (event == PTRACE_EVENT_VFORK_DONE)
++ return UTRACE_REPORT;
++ else
++ return UTRACE_STOP;
++}
++
++static inline void set_syscall_code(struct ptrace_context *ctx)
++{
++ set_stop_code(ctx, PTRACE_EVENT_SYSCALL);
++ if (ctx->options & PTRACE_O_TRACESYSGOOD)
++ ctx->stop_code |= 0x80;
++}
++
++static u32 ptrace_report_syscall_entry(u32 action, struct utrace_engine *engine,
++ struct pt_regs *regs)
++{
++ struct ptrace_context *ctx = ptrace_context(engine);
++
++ if (action & UTRACE_SYSCALL_RESUMED) {
++ /*
++ * We already reported the first time.
++ * Nothing more to do now.
++ */
++ if (unlikely(ctx->options & PTRACE_O_SYSEMU))
++ return UTRACE_SYSCALL_ABORT | UTRACE_REPORT;
++ return utrace_syscall_action(action) | UTRACE_RESUME;
++ }
++
++ WARN_ON(ptrace_event_pending(ctx));
++
++ set_syscall_code(ctx);
++
++ if (unlikely(ctx->options & PTRACE_O_SYSEMU))
++ return UTRACE_SYSCALL_ABORT | UTRACE_REPORT;
++ /*
++ * Stop now to report. We will get another callback after
++ * we resume, with the UTRACE_SYSCALL_RESUMED flag set.
++ */
++ return UTRACE_SYSCALL_RUN | UTRACE_STOP;
++}
++
++static inline bool is_step_resume(enum utrace_resume_action resume)
++{
++ return resume == UTRACE_BLOCKSTEP || resume == UTRACE_SINGLESTEP;
++}
++
++static u32 ptrace_report_syscall_exit(u32 action, struct utrace_engine *engine,
++ struct pt_regs *regs)
++{
++ struct ptrace_context *ctx = ptrace_context(engine);
++
++ if (ptrace_event_pending(ctx))
++ return UTRACE_STOP;
++
++ if (is_step_resume(ctx->resume)) {
++ ctx->signr = SIGTRAP;
++ return UTRACE_INTERRUPT;
++ }
++
++ set_syscall_code(ctx);
++ return UTRACE_STOP;
++}
++
++static u32 ptrace_report_exec(u32 action, struct utrace_engine *engine,
++ const struct linux_binfmt *fmt,
++ const struct linux_binprm *bprm,
++ struct pt_regs *regs)
++{
++ struct ptrace_context *ctx = ptrace_context(engine);
++
++ WARN_ON(ptrace_event_pending(ctx));
++
++ if (!(ctx->options & PTRACE_O_TRACEEXEC)) {
++ /*
++ * Old-fashioned ptrace'd exec just posts a plain signal.
++ */
++ send_sig(SIGTRAP, current, 0);
++ return UTRACE_RESUME;
++ }
++
++ set_stop_code(ctx, PTRACE_EVENT_EXEC);
++ return UTRACE_STOP;
++}
++
++static enum utrace_signal_action resume_signal(struct ptrace_context *ctx,
++ struct k_sigaction *return_ka)
++{
++ siginfo_t *info = ctx->siginfo;
++ int signr = ctx->signr;
++
++ ctx->siginfo = NULL;
++ ctx->signr = 0;
++
++ /* Did the debugger cancel the sig? */
++ if (!signr)
++ return UTRACE_SIGNAL_IGN;
++ /*
++ * Update the siginfo structure if the signal has changed.
++ * If the debugger wanted something specific in the siginfo
++ * then it should have updated *info via PTRACE_SETSIGINFO.
++ */
++ if (info->si_signo != signr) {
++ info->si_signo = signr;
++ info->si_errno = 0;
++ info->si_code = SI_USER;
++ info->si_pid = task_pid_vnr(current->parent);
++ info->si_uid = task_uid(current->parent);
++ }
++
++ /* If the (new) signal is now blocked, requeue it. */
++ if (sigismember(&current->blocked, signr)) {
++ send_sig_info(signr, info, current);
++ return UTRACE_SIGNAL_IGN;
++ }
++
++ spin_lock_irq(&current->sighand->siglock);
++ *return_ka = current->sighand->action[signr - 1];
++ spin_unlock_irq(&current->sighand->siglock);
++
++ return UTRACE_SIGNAL_DELIVER;
++}
++
++static u32 ptrace_report_signal(u32 action, struct utrace_engine *engine,
++ struct pt_regs *regs,
++ siginfo_t *info,
++ const struct k_sigaction *orig_ka,
++ struct k_sigaction *return_ka)
++{
++ struct ptrace_context *ctx = ptrace_context(engine);
++ enum utrace_resume_action resume = ctx->resume;
++
++ if (ptrace_event_pending(ctx)) {
++ action = utrace_signal_action(action);
++ WARN_ON(action != UTRACE_SIGNAL_REPORT);
++ return action | UTRACE_STOP;
++ }
++
++ switch (utrace_signal_action(action)) {
++ case UTRACE_SIGNAL_HANDLER:
++ if (WARN_ON(ctx->siginfo))
++ ctx->siginfo = NULL;
++
++ if (is_step_resume(resume)) {
++ set_stop_code(ctx, PTRACE_EVENT_SIGTRAP);
++ return UTRACE_STOP | UTRACE_SIGNAL_IGN;
++ }
++
++ case UTRACE_SIGNAL_REPORT:
++ if (!ctx->siginfo) {
++ if (ctx->signr) {
++ /* set by ptrace_resume(SYSCALL_EXIT) */
++ WARN_ON(ctx->signr != SIGTRAP);
++ user_single_step_siginfo(current, regs, info);
++ force_sig_info(SIGTRAP, info, current);
++ }
++
++ return resume | UTRACE_SIGNAL_IGN;
++ }
++
++ if (WARN_ON(ctx->siginfo != info))
++ return resume | UTRACE_SIGNAL_IGN;
++
++ return resume | resume_signal(ctx, return_ka);
++
++ default:
++ break;
++ }
++
++ WARN_ON(ctx->siginfo);
++
++ /* Raced with the exiting tracer ? */
++ if (resume == UTRACE_DETACH)
++ return action;
++
++ ctx->siginfo = info;
++ /*
++ * ctx->siginfo points to the caller's stack.
++ * Make sure the subsequent UTRACE_SIGNAL_REPORT clears
++ * ->siginfo before return from get_signal_to_deliver().
++ */
++ if (utrace_control(current, engine, UTRACE_INTERRUPT))
++ WARN_ON(1);
++
++ ctx->signr = info->si_signo;
++ ctx->stop_code = (PTRACE_EVENT_SIGNAL << 8) | ctx->signr;
++
++ return UTRACE_STOP | UTRACE_SIGNAL_IGN;
++}
++
++static u32 ptrace_report_quiesce(u32 action, struct utrace_engine *engine,
++ unsigned long event)
++{
++ struct ptrace_context *ctx = ptrace_context(engine);
++
++ if (ptrace_event_pending(ctx))
++ return UTRACE_STOP;
++
++ return event ? UTRACE_RESUME : ctx->resume;
++}
++
++static void ptrace_release(void *data)
++{
++ kfree(data);
++}
++
++static const struct utrace_engine_ops ptrace_utrace_ops = {
++ .report_signal = ptrace_report_signal,
++ .report_quiesce = ptrace_report_quiesce,
++ .report_exec = ptrace_report_exec,
++ .report_exit = ptrace_report_exit,
++ .report_clone = ptrace_report_clone,
++ .report_syscall_entry = ptrace_report_syscall_entry,
++ .report_syscall_exit = ptrace_report_syscall_exit,
++ .release = ptrace_release,
++};
++
++int ptrace_check_attach(struct task_struct *child, int kill)
++{
++ struct utrace_engine *engine;
++ struct utrace_examiner exam;
++ int ret = -ESRCH;
++
++ engine = ptrace_lookup_engine(child);
++ if (IS_ERR(engine))
++ return ret;
++
++ if (child->parent != current)
++ goto out;
++
++ if (unlikely(kill))
++ ret = 0;
++
++ if (!task_is_stopped_or_traced(child))
++ goto out;
++ /*
++ * Make sure our engine has already stopped the child.
++ * Then wait for it to be off the CPU.
++ */
++ if (!utrace_control(child, engine, UTRACE_STOP) &&
++ !utrace_prepare_examine(child, engine, &exam))
++ ret = 0;
++out:
++ utrace_engine_put(engine);
++ return ret;
++}
++
++int ptrace_attach(struct task_struct *task)
++{
++ int retval;
++
++ audit_ptrace(task);
++
++ retval = -EPERM;
++ if (unlikely(task->flags & PF_KTHREAD))
++ goto out;
++ if (same_thread_group(task, current))
++ goto out;
++
++ /*
++ * Protect exec's credential calculations against our interference;
++ * interference; SUID, SGID and LSM creds get determined differently
++ * under ptrace.
++ */
++ retval = -ERESTARTNOINTR;
++ if (mutex_lock_interruptible(&task->signal->cred_guard_mutex))
++ goto out;
++
++ task_lock(task);
++ retval = __ptrace_may_access(task, PTRACE_MODE_ATTACH);
++ task_unlock(task);
++ if (retval)
++ goto unlock_creds;
++
++ retval = ptrace_attach_task(task, 0);
++ if (unlikely(retval))
++ goto unlock_creds;
++
++ write_lock_irq(&tasklist_lock);
++ retval = -EPERM;
++ if (unlikely(task->exit_state))
++ goto unlock_tasklist;
++
++ BUG_ON(task->ptrace);
++ task->ptrace = PT_UTRACED;
++ if (capable(CAP_SYS_PTRACE))
++ task->ptrace |= PT_PTRACE_CAP;
++
++ __ptrace_link(task, current);
++ send_sig_info(SIGSTOP, SEND_SIG_FORCED, task);
++
++ retval = 0;
++unlock_tasklist:
++ write_unlock_irq(&tasklist_lock);
++unlock_creds:
++ mutex_unlock(&task->signal->cred_guard_mutex);
++out:
++ return retval;
++}
++
++/*
++ * Performs checks and sets PT_UTRACED.
++ * Should be used by all ptrace implementations for PTRACE_TRACEME.
++ */
++int ptrace_traceme(void)
++{
++ bool detach = true;
++ int ret = ptrace_attach_task(current, 0);
++
++ if (unlikely(ret))
++ return ret;
++
++ ret = -EPERM;
++ write_lock_irq(&tasklist_lock);
++ BUG_ON(current->ptrace);
++ ret = security_ptrace_traceme(current->parent);
++ /*
++ * Check PF_EXITING to ensure ->real_parent has not passed
++ * exit_ptrace(). Otherwise we don't report the error but
++ * pretend ->real_parent untraces us right after return.
++ */
++ if (!ret && !(current->real_parent->flags & PF_EXITING)) {
++ current->ptrace = PT_UTRACED;
++ __ptrace_link(current, current->real_parent);
++ detach = false;
++ }
++ write_unlock_irq(&tasklist_lock);
++
++ if (detach)
++ ptrace_abort_attach(current);
++ return ret;
++}
++
++static void ptrace_do_detach(struct task_struct *tracee, unsigned int data)
++{
++ bool detach, release;
++
++ write_lock_irq(&tasklist_lock);
++ /*
++ * This tracee can be already killed. Make sure de_thread() or
++ * our sub-thread doing do_wait() didn't do release_task() yet.
++ */
++ detach = tracee->ptrace != 0;
++ release = false;
++ if (likely(detach))
++ release = __ptrace_detach(current, tracee);
++ write_unlock_irq(&tasklist_lock);
++
++ if (unlikely(release))
++ release_task(tracee);
++ else if (likely(detach))
++ ptrace_detach_task(tracee, data);
++}
++
++int ptrace_detach(struct task_struct *child, unsigned int data)
++{
++ if (!valid_signal(data))
++ return -EIO;
++
++ ptrace_do_detach(child, data);
++
++ return 0;
++}
++
++/*
++ * Detach all tasks we were using ptrace on. Called with tasklist held
++ * for writing, and returns with it held too. But note it can release
++ * and reacquire the lock.
++ */
++void exit_ptrace(struct task_struct *tracer)
++{
++ bool locked = true;
++
++ for (;;) {
++ struct task_struct *tracee = NULL;
++
++ if (!locked)
++ read_lock(&tasklist_lock);
++ if (!list_empty(&tracer->ptraced)) {
++ tracee = list_first_entry(&tracer->ptraced,
++ struct task_struct, ptrace_entry);
++ get_task_struct(tracee);
++ }
++ if (!locked)
++ read_unlock(&tasklist_lock);
++ if (!tracee)
++ break;
++
++ if (locked) {
++ write_unlock_irq(&tasklist_lock);
++ locked = false;
++ }
++ ptrace_do_detach(tracee, -1);
++ put_task_struct(tracee);
++ }
++
++ if (!locked)
++ write_lock_irq(&tasklist_lock);
++}
++
++static int ptrace_set_options(struct task_struct *tracee,
++ struct utrace_engine *engine, long data)
++{
++ BUILD_BUG_ON(PTRACE_O_MASK & (PTRACE_O_SYSEMU | PTRACE_O_DETACHED));
++
++ ptrace_set_events(tracee, engine, data & PTRACE_O_MASK);
++ return (data & ~PTRACE_O_MASK) ? -EINVAL : 0;
++}
++
++static int ptrace_rw_siginfo(struct task_struct *tracee,
++ struct ptrace_context *ctx,
++ siginfo_t *info, bool write)
++{
++ unsigned long flags;
++ int err;
++
++ switch (get_stop_event(ctx)) {
++ case 0: /* jctl stop */
++ return -EINVAL;
++
++ case PTRACE_EVENT_SIGNAL:
++ err = -ESRCH;
++ if (lock_task_sighand(tracee, &flags)) {
++ if (likely(task_is_traced(tracee))) {
++ if (write)
++ *ctx->siginfo = *info;
++ else
++ *info = *ctx->siginfo;
++ err = 0;
++ }
++ unlock_task_sighand(tracee, &flags);
++ }
++
++ return err;
++
++ default:
++ if (!write) {
++ memset(info, 0, sizeof(*info));
++ info->si_signo = SIGTRAP;
++ info->si_code = ctx->stop_code & PTRACE_EVENT_MASK;
++ info->si_pid = task_pid_vnr(tracee);
++ info->si_uid = task_uid(tracee);
++ }
++
++ return 0;
++ }
++}
++
++static void do_ptrace_notify_stop(struct ptrace_context *ctx,
++ struct task_struct *tracee)
++{
++ /*
++ * This can race with SIGKILL, but we borrow this race from
++ * the old ptrace implementation. ->exit_code is only needed
++ * for wait_task_stopped()->task_stopped_code(), we should
++ * change it to use ptrace_context.
++ */
++ tracee->exit_code = ctx->stop_code & PTRACE_EVENT_MASK;
++ WARN_ON(!tracee->exit_code);
++
++ read_lock(&tasklist_lock);
++ /*
++ * Don't want to allow preemption here, because
++ * sys_ptrace() needs this task to be inactive.
++ */
++ preempt_disable();
++ /*
++ * It can be killed and then released by our subthread,
++ * or ptrace_attach() has not completed yet.
++ */
++ if (task_ptrace(tracee))
++ do_notify_parent_cldstop(tracee, CLD_TRAPPED);
++ read_unlock(&tasklist_lock);
++ preempt_enable_no_resched();
++}
++
++void ptrace_notify_stop(struct task_struct *tracee)
++{
++ struct utrace_engine *engine = ptrace_lookup_engine(tracee);
++
++ if (IS_ERR(engine))
++ return;
++
++ do_ptrace_notify_stop(ptrace_context(engine), tracee);
++ utrace_engine_put(engine);
++}
++
++static int ptrace_resume_action(struct task_struct *tracee,
++ struct utrace_engine *engine, long request)
++{
++ struct ptrace_context *ctx = ptrace_context(engine);
++ unsigned long events;
++ int action;
++
++ ctx->options &= ~PTRACE_O_SYSEMU;
++ events = engine->flags & ~UTRACE_EVENT_SYSCALL;
++ action = UTRACE_RESUME;
++
++ switch (request) {
++#ifdef PTRACE_SINGLEBLOCK
++ case PTRACE_SINGLEBLOCK:
++ if (unlikely(!arch_has_block_step()))
++ return -EIO;
++ action = UTRACE_BLOCKSTEP;
++ events |= UTRACE_EVENT(SYSCALL_EXIT);
++ break;
++#endif
++
++#ifdef PTRACE_SINGLESTEP
++ case PTRACE_SINGLESTEP:
++ if (unlikely(!arch_has_single_step()))
++ return -EIO;
++ action = UTRACE_SINGLESTEP;
++ events |= UTRACE_EVENT(SYSCALL_EXIT);
++ break;
++#endif
++
++#ifdef PTRACE_SYSEMU
++ case PTRACE_SYSEMU_SINGLESTEP:
++ if (unlikely(!arch_has_single_step()))
++ return -EIO;
++ action = UTRACE_SINGLESTEP;
++ case PTRACE_SYSEMU:
++ ctx->options |= PTRACE_O_SYSEMU;
++ events |= UTRACE_EVENT(SYSCALL_ENTRY);
++ break;
++#endif
++
++ case PTRACE_SYSCALL:
++ events |= UTRACE_EVENT_SYSCALL;
++ break;
++
++ case PTRACE_CONT:
++ break;
++ default:
++ return -EIO;
++ }
++
++ if (events != engine->flags &&
++ utrace_set_events(tracee, engine, events))
++ return -ESRCH;
++
++ return action;
++}
++
++static int ptrace_resume(struct task_struct *tracee,
++ struct utrace_engine *engine,
++ long request, long data)
++{
++ struct ptrace_context *ctx = ptrace_context(engine);
++ int action;
++
++ if (!valid_signal(data))
++ return -EIO;
++
++ action = ptrace_resume_action(tracee, engine, request);
++ if (action < 0)
++ return action;
++
++ switch (get_stop_event(ctx)) {
++ case PTRACE_EVENT_VFORK:
++ if (ctx->options & PTRACE_O_TRACEVFORKDONE) {
++ set_stop_code(ctx, PTRACE_EVENT_VFORK_DONE);
++ action = UTRACE_REPORT;
++ }
++ break;
++
++ case PTRACE_EVENT_EXEC:
++ case PTRACE_EVENT_FORK:
++ case PTRACE_EVENT_CLONE:
++ case PTRACE_EVENT_VFORK_DONE:
++ if (request == PTRACE_SYSCALL) {
++ set_syscall_code(ctx);
++ do_ptrace_notify_stop(ctx, tracee);
++ return 0;
++ }
++
++ if (action != UTRACE_RESUME) {
++ /*
++ * single-stepping. UTRACE_SIGNAL_REPORT will
++ * synthesize a trap to follow the syscall insn.
++ */
++ ctx->signr = SIGTRAP;
++ action = UTRACE_INTERRUPT;
++ }
++ break;
++
++ case PTRACE_EVENT_SYSCALL:
++ if (data)
++ send_sig_info(data, SEND_SIG_PRIV, tracee);
++ break;
++
++ case PTRACE_EVENT_SIGNAL:
++ ctx->signr = data;
++ break;
++ }
++
++ ctx->resume = action;
++ ptrace_wake_up(tracee, engine, action, true);
++ return 0;
++}
++
++extern int ptrace_regset(struct task_struct *task, int req, unsigned int type,
++ struct iovec *kiov);
++
++int ptrace_request(struct task_struct *child, long request,
++ unsigned long addr, unsigned long data)
++{
++ struct utrace_engine *engine = ptrace_lookup_engine(child);
++ siginfo_t siginfo;
++ int ret;
++
++ if (unlikely(IS_ERR(engine)))
++ return -ESRCH;
++
++ switch (request) {
++ case PTRACE_PEEKTEXT:
++ case PTRACE_PEEKDATA:
++ ret = generic_ptrace_peekdata(child, addr, data);
++ break;
++ case PTRACE_POKETEXT:
++ case PTRACE_POKEDATA:
++ ret = generic_ptrace_pokedata(child, addr, data);
++ break;
++
++#ifdef PTRACE_OLDSETOPTIONS
++ case PTRACE_OLDSETOPTIONS:
++#endif
++ case PTRACE_SETOPTIONS:
++ ret = ptrace_set_options(child, engine, data);
++ break;
++ case PTRACE_GETEVENTMSG:
++ ret = put_user(ptrace_context(engine)->eventmsg,
++ (unsigned long __user *) data);
++ break;
++
++ case PTRACE_GETSIGINFO:
++ ret = ptrace_rw_siginfo(child, ptrace_context(engine),
++ &siginfo, false);
++ if (!ret)
++ ret = copy_siginfo_to_user((siginfo_t __user *) data,
++ &siginfo);
++ break;
++
++ case PTRACE_SETSIGINFO:
++ if (copy_from_user(&siginfo, (siginfo_t __user *) data,
++ sizeof siginfo))
++ ret = -EFAULT;
++ else
++ ret = ptrace_rw_siginfo(child, ptrace_context(engine),
++ &siginfo, true);
++ break;
++
++ case PTRACE_DETACH: /* detach a process that was attached. */
++ ret = ptrace_detach(child, data);
++ break;
++
++ case PTRACE_KILL:
++ /* Ugly historical behaviour. */
++ if (task_is_traced(child))
++ ptrace_resume(child, engine, PTRACE_CONT, SIGKILL);
++ ret = 0;
++ break;
++
++ case PTRACE_GETREGSET:
++ case PTRACE_SETREGSET:
++ {
++ struct iovec kiov;
++ struct iovec __user *uiov = (struct iovec __user *) data;
++
++ if (!access_ok(VERIFY_WRITE, uiov, sizeof(*uiov)))
++ return -EFAULT;
++
++ if (__get_user(kiov.iov_base, &uiov->iov_base) ||
++ __get_user(kiov.iov_len, &uiov->iov_len))
++ return -EFAULT;
++
++ ret = ptrace_regset(child, request, addr, &kiov);
++ if (!ret)
++ ret = __put_user(kiov.iov_len, &uiov->iov_len);
++ break;
++ }
++
++ default:
++ ret = ptrace_resume(child, engine, request, data);
++ break;
++ }
++
++ utrace_engine_put(engine);
++ return ret;
++}
++
++#if defined CONFIG_COMPAT
++#include <linux/compat.h>
++
++int compat_ptrace_request(struct task_struct *child, compat_long_t request,
++ compat_ulong_t addr, compat_ulong_t data)
++{
++ struct utrace_engine *engine = ptrace_lookup_engine(child);
++ compat_ulong_t __user *datap = compat_ptr(data);
++ compat_ulong_t word;
++ siginfo_t siginfo;
++ int ret;
++
++ if (unlikely(IS_ERR(engine)))
++ return -ESRCH;
++
++ switch (request) {
++ case PTRACE_PEEKTEXT:
++ case PTRACE_PEEKDATA:
++ ret = access_process_vm(child, addr, &word, sizeof(word), 0);
++ if (ret != sizeof(word))
++ ret = -EIO;
++ else
++ ret = put_user(word, datap);
++ break;
++
++ case PTRACE_POKETEXT:
++ case PTRACE_POKEDATA:
++ ret = access_process_vm(child, addr, &data, sizeof(data), 1);
++ ret = (ret != sizeof(data) ? -EIO : 0);
++ break;
++
++ case PTRACE_GETEVENTMSG:
++ ret = put_user((compat_ulong_t)ptrace_context(engine)->eventmsg,
++ datap);
++ break;
++
++ case PTRACE_GETSIGINFO:
++ ret = ptrace_rw_siginfo(child, ptrace_context(engine),
++ &siginfo, false);
++ if (!ret)
++ ret = copy_siginfo_to_user32(
++ (struct compat_siginfo __user *) datap,
++ &siginfo);
++ break;
++
++ case PTRACE_SETSIGINFO:
++ memset(&siginfo, 0, sizeof siginfo);
++ if (copy_siginfo_from_user32(
++ &siginfo, (struct compat_siginfo __user *) datap))
++ ret = -EFAULT;
++ else
++ ret = ptrace_rw_siginfo(child, ptrace_context(engine),
++ &siginfo, true);
++ break;
++
++ case PTRACE_GETREGSET:
++ case PTRACE_SETREGSET:
++ {
++ struct iovec kiov;
++ struct compat_iovec __user *uiov =
++ (struct compat_iovec __user *) datap;
++ compat_uptr_t ptr;
++ compat_size_t len;
++
++ if (!access_ok(VERIFY_WRITE, uiov, sizeof(*uiov)))
++ return -EFAULT;
++
++ if (__get_user(ptr, &uiov->iov_base) ||
++ __get_user(len, &uiov->iov_len))
++ return -EFAULT;
++
++ kiov.iov_base = compat_ptr(ptr);
++ kiov.iov_len = len;
++
++ ret = ptrace_regset(child, request, addr, &kiov);
++ if (!ret)
++ ret = __put_user(kiov.iov_len, &uiov->iov_len);
++ break;
++ }
++
++ default:
++ ret = ptrace_request(child, request, addr, data);
++ }
++
++ utrace_engine_put(engine);
++ return ret;
++}
++#endif /* CONFIG_COMPAT */
+diff --git a/kernel/ptrace.c b/kernel/ptrace.c
+index e275608..72ea65c 100644
+--- a/kernel/ptrace.c
++++ b/kernel/ptrace.c
+@@ -15,7 +15,6 @@
+ #include <linux/highmem.h>
+ #include <linux/pagemap.h>
+ #include <linux/ptrace.h>
+-#include <linux/utrace.h>
+ #include <linux/security.h>
+ #include <linux/signal.h>
+ #include <linux/audit.h>
+@@ -24,7 +23,320 @@
+ #include <linux/uaccess.h>
+ #include <linux/regset.h>
+
++int __ptrace_may_access(struct task_struct *task, unsigned int mode)
++{
++ const struct cred *cred = current_cred(), *tcred;
++
++ /* May we inspect the given task?
++ * This check is used both for attaching with ptrace
++ * and for allowing access to sensitive information in /proc.
++ *
++ * ptrace_attach denies several cases that /proc allows
++ * because setting up the necessary parent/child relationship
++ * or halting the specified task is impossible.
++ */
++ int dumpable = 0;
++ /* Don't let security modules deny introspection */
++ if (task == current)
++ return 0;
++ rcu_read_lock();
++ tcred = __task_cred(task);
++ if ((cred->uid != tcred->euid ||
++ cred->uid != tcred->suid ||
++ cred->uid != tcred->uid ||
++ cred->gid != tcred->egid ||
++ cred->gid != tcred->sgid ||
++ cred->gid != tcred->gid) &&
++ !capable(CAP_SYS_PTRACE)) {
++ rcu_read_unlock();
++ return -EPERM;
++ }
++ rcu_read_unlock();
++ smp_rmb();
++ if (task->mm)
++ dumpable = get_dumpable(task->mm);
++ if (!dumpable && !capable(CAP_SYS_PTRACE))
++ return -EPERM;
++
++ return security_ptrace_access_check(task, mode);
++}
++
++bool ptrace_may_access(struct task_struct *task, unsigned int mode)
++{
++ int err;
++ task_lock(task);
++ err = __ptrace_may_access(task, mode);
++ task_unlock(task);
++ return !err;
++}
++
++/*
++ * Called with irqs disabled, returns true if childs should reap themselves.
++ */
++static int ignoring_children(struct sighand_struct *sigh)
++{
++ int ret;
++ spin_lock(&sigh->siglock);
++ ret = (sigh->action[SIGCHLD-1].sa.sa_handler == SIG_IGN) ||
++ (sigh->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDWAIT);
++ spin_unlock(&sigh->siglock);
++ return ret;
++}
++
++/*
++ * Called with tasklist_lock held for writing.
++ * Unlink a traced task, and clean it up if it was a traced zombie.
++ * Return true if it needs to be reaped with release_task().
++ * (We can't call release_task() here because we already hold tasklist_lock.)
++ *
++ * If it's a zombie, our attachedness prevented normal parent notification
++ * or self-reaping. Do notification now if it would have happened earlier.
++ * If it should reap itself, return true.
++ *
++ * If it's our own child, there is no notification to do. But if our normal
++ * children self-reap, then this child was prevented by ptrace and we must
++ * reap it now, in that case we must also wake up sub-threads sleeping in
++ * do_wait().
++ */
++bool __ptrace_detach(struct task_struct *tracer, struct task_struct *p)
++{
++ __ptrace_unlink(p);
++
++ if (p->exit_state == EXIT_ZOMBIE) {
++ if (!task_detached(p) && thread_group_empty(p)) {
++ if (!same_thread_group(p->real_parent, tracer))
++ do_notify_parent(p, p->exit_signal);
++ else if (ignoring_children(tracer->sighand)) {
++ __wake_up_parent(p, tracer);
++ p->exit_signal = -1;
++ }
++ }
++ if (task_detached(p)) {
++ /* Mark it as in the process of being reaped. */
++ p->exit_state = EXIT_DEAD;
++ return true;
++ }
++ }
++
++ return false;
++}
++
++int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len)
++{
++ int copied = 0;
++
++ while (len > 0) {
++ char buf[128];
++ int this_len, retval;
++
++ this_len = (len > sizeof(buf)) ? sizeof(buf) : len;
++ retval = access_process_vm(tsk, src, buf, this_len, 0);
++ if (!retval) {
++ if (copied)
++ break;
++ return -EIO;
++ }
++ if (copy_to_user(dst, buf, retval))
++ return -EFAULT;
++ copied += retval;
++ src += retval;
++ dst += retval;
++ len -= retval;
++ }
++ return copied;
++}
++
++int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len)
++{
++ int copied = 0;
++
++ while (len > 0) {
++ char buf[128];
++ int this_len, retval;
++
++ this_len = (len > sizeof(buf)) ? sizeof(buf) : len;
++ if (copy_from_user(buf, src, this_len))
++ return -EFAULT;
++ retval = access_process_vm(tsk, dst, buf, this_len, 1);
++ if (!retval) {
++ if (copied)
++ break;
++ return -EIO;
++ }
++ copied += retval;
++ src += retval;
++ dst += retval;
++ len -= retval;
++ }
++ return copied;
++}
++
++#ifdef CONFIG_HAVE_ARCH_TRACEHOOK
++
++static const struct user_regset *
++find_regset(const struct user_regset_view *view, unsigned int type)
++{
++ const struct user_regset *regset;
++ int n;
++
++ for (n = 0; n < view->n; ++n) {
++ regset = view->regsets + n;
++ if (regset->core_note_type == type)
++ return regset;
++ }
++
++ return NULL;
++}
++
++int ptrace_regset(struct task_struct *task, int req, unsigned int type,
++ struct iovec *kiov)
++{
++ const struct user_regset_view *view = task_user_regset_view(task);
++ const struct user_regset *regset = find_regset(view, type);
++ int regset_no;
++
++ if (!regset || (kiov->iov_len % regset->size) != 0)
++ return -EINVAL;
++
++ regset_no = regset - view->regsets;
++ kiov->iov_len = min(kiov->iov_len,
++ (__kernel_size_t) (regset->n * regset->size));
++
++ if (req == PTRACE_GETREGSET)
++ return copy_regset_to_user(task, view, regset_no, 0,
++ kiov->iov_len, kiov->iov_base);
++ else
++ return copy_regset_from_user(task, view, regset_no, 0,
++ kiov->iov_len, kiov->iov_base);
++}
++
++#endif
++
++static struct task_struct *ptrace_get_task_struct(pid_t pid)
++{
++ struct task_struct *child;
++
++ rcu_read_lock();
++ child = find_task_by_vpid(pid);
++ if (child)
++ get_task_struct(child);
++ rcu_read_unlock();
++
++ if (!child)
++ return ERR_PTR(-ESRCH);
++ return child;
++}
++
++#ifndef arch_ptrace_attach
++#define arch_ptrace_attach(child) do { } while (0)
++#endif
++
++SYSCALL_DEFINE4(ptrace, long, request, long, pid, unsigned long, addr,
++ unsigned long, data)
++{
++ struct task_struct *child;
++ long ret;
++
++ if (request == PTRACE_TRACEME) {
++ ret = ptrace_traceme();
++ if (!ret)
++ arch_ptrace_attach(current);
++ goto out;
++ }
+
++ child = ptrace_get_task_struct(pid);
++ if (IS_ERR(child)) {
++ ret = PTR_ERR(child);
++ goto out;
++ }
++
++ if (request == PTRACE_ATTACH) {
++ ret = ptrace_attach(child);
++ /*
++ * Some architectures need to do book-keeping after
++ * a ptrace attach.
++ */
++ if (!ret)
++ arch_ptrace_attach(child);
++ goto out_put_task_struct;
++ }
++
++ ret = ptrace_check_attach(child, request == PTRACE_KILL);
++ if (ret < 0)
++ goto out_put_task_struct;
++
++ ret = arch_ptrace(child, request, addr, data);
++
++ out_put_task_struct:
++ put_task_struct(child);
++ out:
++ return ret;
++}
++
++int generic_ptrace_peekdata(struct task_struct *tsk, unsigned long addr,
++ unsigned long data)
++{
++ unsigned long tmp;
++ int copied;
++
++ copied = access_process_vm(tsk, addr, &tmp, sizeof(tmp), 0);
++ if (copied != sizeof(tmp))
++ return -EIO;
++ return put_user(tmp, (unsigned long __user *)data);
++}
++
++int generic_ptrace_pokedata(struct task_struct *tsk, unsigned long addr,
++ unsigned long data)
++{
++ int copied;
++
++ copied = access_process_vm(tsk, addr, &data, sizeof(data), 1);
++ return (copied == sizeof(data)) ? 0 : -EIO;
++}
++
++#if defined CONFIG_COMPAT
++#include <linux/compat.h>
++
++asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
++ compat_long_t addr, compat_long_t data)
++{
++ struct task_struct *child;
++ long ret;
++
++ if (request == PTRACE_TRACEME) {
++ ret = ptrace_traceme();
++ goto out;
++ }
++
++ child = ptrace_get_task_struct(pid);
++ if (IS_ERR(child)) {
++ ret = PTR_ERR(child);
++ goto out;
++ }
++
++ if (request == PTRACE_ATTACH) {
++ ret = ptrace_attach(child);
++ /*
++ * Some architectures need to do book-keeping after
++ * a ptrace attach.
++ */
++ if (!ret)
++ arch_ptrace_attach(child);
++ goto out_put_task_struct;
++ }
++
++ ret = ptrace_check_attach(child, request == PTRACE_KILL);
++ if (!ret)
++ ret = compat_arch_ptrace(child, request, addr, data);
++
++ out_put_task_struct:
++ put_task_struct(child);
++ out:
++ return ret;
++}
++#endif /* CONFIG_COMPAT */
++
++#ifndef CONFIG_UTRACE
+ /*
+ * ptrace a task: make the debugger its new parent and
+ * move it to the ptrace list.
+@@ -117,61 +429,6 @@ int ptrace_check_attach(struct task_stru
+ return ret;
+ }
+
+-int __ptrace_may_access(struct task_struct *task, unsigned int mode)
+-{
+- const struct cred *cred = current_cred(), *tcred;
+-
+- /* May we inspect the given task?
+- * This check is used both for attaching with ptrace
+- * and for allowing access to sensitive information in /proc.
+- *
+- * ptrace_attach denies several cases that /proc allows
+- * because setting up the necessary parent/child relationship
+- * or halting the specified task is impossible.
+- */
+- int dumpable = 0;
+- /* Don't let security modules deny introspection */
+- if (task == current)
+- return 0;
+- rcu_read_lock();
+- tcred = __task_cred(task);
+- if ((cred->uid != tcred->euid ||
+- cred->uid != tcred->suid ||
+- cred->uid != tcred->uid ||
+- cred->gid != tcred->egid ||
+- cred->gid != tcred->sgid ||
+- cred->gid != tcred->gid) &&
+- !capable(CAP_SYS_PTRACE)) {
+- rcu_read_unlock();
+- return -EPERM;
+- }
+- rcu_read_unlock();
+- smp_rmb();
+- if (task->mm)
+- dumpable = get_dumpable(task->mm);
+- if (!dumpable && !capable(CAP_SYS_PTRACE))
+- return -EPERM;
+-
+- return security_ptrace_access_check(task, mode);
+-}
+-
+-bool ptrace_may_access(struct task_struct *task, unsigned int mode)
+-{
+- int err;
+- task_lock(task);
+- err = __ptrace_may_access(task, mode);
+- task_unlock(task);
+- return !err;
+-}
+-
+-/*
+- * For experimental use of utrace, exclude ptrace on the same task.
+- */
+-static inline bool exclude_ptrace(struct task_struct *task)
+-{
+- return unlikely(!!task_utrace_flags(task));
+-}
+-
+ int ptrace_attach(struct task_struct *task)
+ {
+ int retval;
+@@ -195,8 +452,6 @@ int ptrace_attach(struct task_struct *ta
+
+ task_lock(task);
+ retval = __ptrace_may_access(task, PTRACE_MODE_ATTACH);
+- if (!retval && exclude_ptrace(task))
+- retval = -EBUSY;
+ task_unlock(task);
+ if (retval)
+ goto unlock_creds;
+@@ -220,91 +475,37 @@ unlock_tasklist:
+ write_unlock_irq(&tasklist_lock);
+ unlock_creds:
+ mutex_unlock(&task->signal->cred_guard_mutex);
+-out:
+- return retval;
+-}
+-
+-/**
+- * ptrace_traceme -- helper for PTRACE_TRACEME
+- *
+- * Performs checks and sets PT_PTRACED.
+- * Should be used by all ptrace implementations for PTRACE_TRACEME.
+- */
+-int ptrace_traceme(void)
+-{
+- int ret = -EPERM;
+-
+- if (exclude_ptrace(current)) /* XXX locking */
+- return -EBUSY;
+-
+- write_lock_irq(&tasklist_lock);
+- /* Are we already being traced? */
+- if (!current->ptrace) {
+- ret = security_ptrace_traceme(current->parent);
+- /*
+- * Check PF_EXITING to ensure ->real_parent has not passed
+- * exit_ptrace(). Otherwise we don't report the error but
+- * pretend ->real_parent untraces us right after return.
+- */
+- if (!ret && !(current->real_parent->flags & PF_EXITING)) {
+- current->ptrace = PT_PTRACED;
+- __ptrace_link(current, current->real_parent);
+- }
+- }
+- write_unlock_irq(&tasklist_lock);
+-
+- return ret;
+-}
+-
+-/*
+- * Called with irqs disabled, returns true if childs should reap themselves.
+- */
+-static int ignoring_children(struct sighand_struct *sigh)
+-{
+- int ret;
+- spin_lock(&sigh->siglock);
+- ret = (sigh->action[SIGCHLD-1].sa.sa_handler == SIG_IGN) ||
+- (sigh->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDWAIT);
+- spin_unlock(&sigh->siglock);
+- return ret;
+-}
+-
+-/*
+- * Called with tasklist_lock held for writing.
+- * Unlink a traced task, and clean it up if it was a traced zombie.
+- * Return true if it needs to be reaped with release_task().
+- * (We can't call release_task() here because we already hold tasklist_lock.)
+- *
+- * If it's a zombie, our attachedness prevented normal parent notification
+- * or self-reaping. Do notification now if it would have happened earlier.
+- * If it should reap itself, return true.
++out:
++ return retval;
++}
++
++/**
++ * ptrace_traceme -- helper for PTRACE_TRACEME
+ *
+- * If it's our own child, there is no notification to do. But if our normal
+- * children self-reap, then this child was prevented by ptrace and we must
+- * reap it now, in that case we must also wake up sub-threads sleeping in
+- * do_wait().
++ * Performs checks and sets PT_PTRACED.
++ * Should be used by all ptrace implementations for PTRACE_TRACEME.
+ */
+-bool __ptrace_detach(struct task_struct *tracer, struct task_struct *p)
++int ptrace_traceme(void)
+ {
+- __ptrace_unlink(p);
++ int ret = -EPERM;
+
+- if (p->exit_state == EXIT_ZOMBIE) {
+- if (!task_detached(p) && thread_group_empty(p)) {
+- if (!same_thread_group(p->real_parent, tracer))
+- do_notify_parent(p, p->exit_signal);
+- else if (ignoring_children(tracer->sighand)) {
+- __wake_up_parent(p, tracer);
+- p->exit_signal = -1;
+- }
+- }
+- if (task_detached(p)) {
+- /* Mark it as in the process of being reaped. */
+- p->exit_state = EXIT_DEAD;
+- return true;
++ write_lock_irq(&tasklist_lock);
++ /* Are we already being traced? */
++ if (!current->ptrace) {
++ ret = security_ptrace_traceme(current->parent);
++ /*
++ * Check PF_EXITING to ensure ->real_parent has not passed
++ * exit_ptrace(). Otherwise we don't report the error but
++ * pretend ->real_parent untraces us right after return.
++ */
++ if (!ret && !(current->real_parent->flags & PF_EXITING)) {
++ current->ptrace = PT_PTRACED;
++ __ptrace_link(current, current->real_parent);
+ }
+ }
++ write_unlock_irq(&tasklist_lock);
+
+- return false;
++ return ret;
+ }
+
+ int ptrace_detach(struct task_struct *child, unsigned int data)
+@@ -368,57 +569,7 @@ void exit_ptrace(struct task_struct *tra
+ write_lock_irq(&tasklist_lock);
+ }
+
+-int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len)
+-{
+- int copied = 0;
+-
+- while (len > 0) {
+- char buf[128];
+- int this_len, retval;
+-
+- this_len = (len > sizeof(buf)) ? sizeof(buf) : len;
+- retval = access_process_vm(tsk, src, buf, this_len, 0);
+- if (!retval) {
+- if (copied)
+- break;
+- return -EIO;
+- }
+- if (copy_to_user(dst, buf, retval))
+- return -EFAULT;
+- copied += retval;
+- src += retval;
+- dst += retval;
+- len -= retval;
+- }
+- return copied;
+-}
+-
+-int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len)
+-{
+- int copied = 0;
+-
+- while (len > 0) {
+- char buf[128];
+- int this_len, retval;
+-
+- this_len = (len > sizeof(buf)) ? sizeof(buf) : len;
+- if (copy_from_user(buf, src, this_len))
+- return -EFAULT;
+- retval = access_process_vm(tsk, dst, buf, this_len, 1);
+- if (!retval) {
+- if (copied)
+- break;
+- return -EIO;
+- }
+- copied += retval;
+- src += retval;
+- dst += retval;
+- len -= retval;
+- }
+- return copied;
+-}
+-
+-static int ptrace_setoptions(struct task_struct *child, unsigned long data)
++static int ptrace_setoptions(struct task_struct *child, long data)
+ {
+ child->ptrace &= ~PT_TRACE_MASK;
+
+@@ -533,47 +683,6 @@ static int ptrace_resume(struct task_str
+ return 0;
+ }
+
+-#ifdef CONFIG_HAVE_ARCH_TRACEHOOK
+-
+-static const struct user_regset *
+-find_regset(const struct user_regset_view *view, unsigned int type)
+-{
+- const struct user_regset *regset;
+- int n;
+-
+- for (n = 0; n < view->n; ++n) {
+- regset = view->regsets + n;
+- if (regset->core_note_type == type)
+- return regset;
+- }
+-
+- return NULL;
+-}
+-
+-static int ptrace_regset(struct task_struct *task, int req, unsigned int type,
+- struct iovec *kiov)
+-{
+- const struct user_regset_view *view = task_user_regset_view(task);
+- const struct user_regset *regset = find_regset(view, type);
+- int regset_no;
+-
+- if (!regset || (kiov->iov_len % regset->size) != 0)
+- return -EINVAL;
+-
+- regset_no = regset - view->regsets;
+- kiov->iov_len = min(kiov->iov_len,
+- (__kernel_size_t) (regset->n * regset->size));
+-
+- if (req == PTRACE_GETREGSET)
+- return copy_regset_to_user(task, view, regset_no, 0,
+- kiov->iov_len, kiov->iov_base);
+- else
+- return copy_regset_from_user(task, view, regset_no, 0,
+- kiov->iov_len, kiov->iov_base);
+-}
+-
+-#endif
+-
+ int ptrace_request(struct task_struct *child, long request,
+ unsigned long addr, unsigned long data)
+ {
+@@ -689,91 +798,7 @@ int ptrace_request(struct task_struct *c
+ return ret;
+ }
+
+-static struct task_struct *ptrace_get_task_struct(pid_t pid)
+-{
+- struct task_struct *child;
+-
+- rcu_read_lock();
+- child = find_task_by_vpid(pid);
+- if (child)
+- get_task_struct(child);
+- rcu_read_unlock();
+-
+- if (!child)
+- return ERR_PTR(-ESRCH);
+- return child;
+-}
+-
+-#ifndef arch_ptrace_attach
+-#define arch_ptrace_attach(child) do { } while (0)
+-#endif
+-
+-SYSCALL_DEFINE4(ptrace, long, request, long, pid, unsigned long, addr,
+- unsigned long, data)
+-{
+- struct task_struct *child;
+- long ret;
+-
+- if (request == PTRACE_TRACEME) {
+- ret = ptrace_traceme();
+- if (!ret)
+- arch_ptrace_attach(current);
+- goto out;
+- }
+-
+- child = ptrace_get_task_struct(pid);
+- if (IS_ERR(child)) {
+- ret = PTR_ERR(child);
+- goto out;
+- }
+-
+- if (request == PTRACE_ATTACH) {
+- ret = ptrace_attach(child);
+- /*
+- * Some architectures need to do book-keeping after
+- * a ptrace attach.
+- */
+- if (!ret)
+- arch_ptrace_attach(child);
+- goto out_put_task_struct;
+- }
+-
+- ret = ptrace_check_attach(child, request == PTRACE_KILL);
+- if (ret < 0)
+- goto out_put_task_struct;
+-
+- ret = arch_ptrace(child, request, addr, data);
+-
+- out_put_task_struct:
+- put_task_struct(child);
+- out:
+- return ret;
+-}
+-
+-int generic_ptrace_peekdata(struct task_struct *tsk, unsigned long addr,
+- unsigned long data)
+-{
+- unsigned long tmp;
+- int copied;
+-
+- copied = access_process_vm(tsk, addr, &tmp, sizeof(tmp), 0);
+- if (copied != sizeof(tmp))
+- return -EIO;
+- return put_user(tmp, (unsigned long __user *)data);
+-}
+-
+-int generic_ptrace_pokedata(struct task_struct *tsk, unsigned long addr,
+- unsigned long data)
+-{
+- int copied;
+-
+- copied = access_process_vm(tsk, addr, &data, sizeof(data), 1);
+- return (copied == sizeof(data)) ? 0 : -EIO;
+-}
+-
+ #if defined CONFIG_COMPAT
+-#include <linux/compat.h>
+-
+ int compat_ptrace_request(struct task_struct *child, compat_long_t request,
+ compat_ulong_t addr, compat_ulong_t data)
+ {
+@@ -851,42 +876,5 @@ int compat_ptrace_request(struct task_st
+
+ return ret;
+ }
+-
+-asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
+- compat_long_t addr, compat_long_t data)
+-{
+- struct task_struct *child;
+- long ret;
+-
+- if (request == PTRACE_TRACEME) {
+- ret = ptrace_traceme();
+- goto out;
+- }
+-
+- child = ptrace_get_task_struct(pid);
+- if (IS_ERR(child)) {
+- ret = PTR_ERR(child);
+- goto out;
+- }
+-
+- if (request == PTRACE_ATTACH) {
+- ret = ptrace_attach(child);
+- /*
+- * Some architectures need to do book-keeping after
+- * a ptrace attach.
+- */
+- if (!ret)
+- arch_ptrace_attach(child);
+- goto out_put_task_struct;
+- }
+-
+- ret = ptrace_check_attach(child, request == PTRACE_KILL);
+- if (!ret)
+- ret = compat_arch_ptrace(child, request, addr, data);
+-
+- out_put_task_struct:
+- put_task_struct(child);
+- out:
+- return ret;
+-}
+ #endif /* CONFIG_COMPAT */
++#endif /* CONFIG_UTRACE */
+diff --git a/kernel/utrace.c b/kernel/utrace.c
+index 26d6faf..37dce16 100644
+--- a/kernel/utrace.c
++++ b/kernel/utrace.c
+@@ -816,6 +816,22 @@ relock:
+ spin_unlock_irq(&task->sighand->siglock);
+ spin_unlock(&utrace->lock);
+
++ /*
++ * If ptrace is among the reasons for this stop, do its
++ * notification now. This could not just be done in
++ * ptrace's own event report callbacks because it has to
++ * be done after we are in TASK_TRACED. This makes the
++ * synchronization with ptrace_do_wait() work right.
++ *
++ * It's only because of the bad old overloading of the do_wait()
++ * logic for handling ptrace stops that we need this special case
++ * here. One day we will clean up ptrace so it does not need to
++ * work this way. New things that are designed sensibly don't need
++ * a wakeup that synchronizes with tasklist_lock and ->state, so
++ * the proper utrace API does not try to support this weirdness.
++ */
++ ptrace_notify_stop(task);
++
+ schedule();
+
+ utrace_finish_stop();
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-utrace-revert-make-ptrace-functions-static.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-utrace-revert-make-ptrace-functions-static.patch
new file mode 100644
index 000000000..5e3dcc21d
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-utrace-revert-make-ptrace-functions-static.patch
@@ -0,0 +1,47 @@
+Revert:
+commit e3e89cc535223433a619d0969db3fa05cdd946b8
+("Mark ptrace_{traceme,attach,detach} static")
+
+--- b/include/linux/ptrace.h
++++ a/include/linux/ptrace.h
+@@ -102,8 +102,11 @@
+
+ extern long arch_ptrace(struct task_struct *child, long request,
+ unsigned long addr, unsigned long data);
++extern int ptrace_traceme(void);
+ extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len);
+ extern int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len);
++extern int ptrace_attach(struct task_struct *tsk);
++extern int ptrace_detach(struct task_struct *, unsigned int);
+ extern void ptrace_disable(struct task_struct *);
+ extern int ptrace_check_attach(struct task_struct *task, int kill);
+ extern int ptrace_request(struct task_struct *child, long request,
+--- b/kernel/ptrace.c
++++ a/kernel/ptrace.c
+@@ -163,7 +163,7 @@
+ return !err;
+ }
+
++int ptrace_attach(struct task_struct *task)
+-static int ptrace_attach(struct task_struct *task)
+ {
+ int retval;
+
+@@ -219,7 +219,7 @@
+ * Performs checks and sets PT_PTRACED.
+ * Should be used by all ptrace implementations for PTRACE_TRACEME.
+ */
++int ptrace_traceme(void)
+-static int ptrace_traceme(void)
+ {
+ int ret = -EPERM;
+
+@@ -293,7 +293,7 @@
+ return false;
+ }
+
++int ptrace_detach(struct task_struct *child, unsigned int data)
+-static int ptrace_detach(struct task_struct *child, unsigned int data)
+ {
+ bool dead = false;
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-utrace.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-utrace.patch
new file mode 100644
index 000000000..366b8a176
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-utrace.patch
@@ -0,0 +1,4166 @@
+utrace core
+
+This adds the utrace facility, a new modular interface in the kernel for
+implementing user thread tracing and debugging. This fits on top of the
+tracehook_* layer, so the new code is well-isolated.
+
+The new interface is in <linux/utrace.h> and the DocBook utrace book
+describes it. It allows for multiple separate tracing engines to work in
+parallel without interfering with each other. Higher-level tracing
+facilities can be implemented as loadable kernel modules using this layer.
+
+The new facility is made optional under CONFIG_UTRACE.
+When this is not enabled, no new code is added.
+It can only be enabled on machines that have all the
+prerequisites and select CONFIG_HAVE_ARCH_TRACEHOOK.
+
+In this initial version, utrace and ptrace do not play together at all.
+If ptrace is attached to a thread, the attach calls in the utrace kernel
+API return -EBUSY. If utrace is attached to a thread, the PTRACE_ATTACH
+or PTRACE_TRACEME request will return EBUSY to userland. The old ptrace
+code is otherwise unchanged and nothing using ptrace should be affected
+by this patch as long as utrace is not used at the same time. In the
+future we can clean up the ptrace implementation and rework it to use
+the utrace API.
+
+Signed-off-by: Roland McGrath <roland@redhat.com>
+---
+ Documentation/DocBook/Makefile | 2 +-
+ Documentation/DocBook/utrace.tmpl | 589 +++++++++
+ fs/proc/array.c | 3 +
+ include/linux/sched.h | 5 +
+ include/linux/tracehook.h | 87 ++-
+ include/linux/utrace.h | 692 +++++++++++
+ init/Kconfig | 9 +
+ kernel/Makefile | 1 +
+ kernel/fork.c | 3 +
+ kernel/ptrace.c | 14 +
+ kernel/utrace.c | 2440 +++++++++++++++++++++++++++++++++++++
+ 11 files changed, 3843 insertions(+), 2 deletions(-)
+
+diff --git a/Documentation/DocBook/Makefile b/Documentation/DocBook/Makefile
+index 8b6e00a..2740633 100644
+--- a/Documentation/DocBook/Makefile
++++ b/Documentation/DocBook/Makefile
+@@ -14,7 +14,7 @@ DOCBOOKS := z8530book.xml mcabook.xml de
+ genericirq.xml s390-drivers.xml uio-howto.xml scsi.xml \
+ 80211.xml debugobjects.xml sh.xml regulator.xml \
+ alsa-driver-api.xml writing-an-alsa-driver.xml \
+- tracepoint.xml media.xml drm.xml
++ tracepoint.xml utrace.xml media.xml drm.xml
+
+ ###
+ # The build process is as follows (targets):
+diff --git a/Documentation/DocBook/utrace.tmpl b/Documentation/DocBook/utrace.tmpl
+new file mode 100644
+index ...0c40add 100644
+--- /dev/null
++++ b/Documentation/DocBook/utrace.tmpl
+@@ -0,0 +1,589 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
++"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
++
++<book id="utrace">
++ <bookinfo>
++ <title>The utrace User Debugging Infrastructure</title>
++ </bookinfo>
++
++ <toc></toc>
++
++ <chapter id="concepts"><title>utrace concepts</title>
++
++ <sect1 id="intro"><title>Introduction</title>
++
++ <para>
++ <application>utrace</application> is infrastructure code for tracing
++ and controlling user threads. This is the foundation for writing
++ tracing engines, which can be loadable kernel modules.
++ </para>
++
++ <para>
++ The basic actors in <application>utrace</application> are the thread
++ and the tracing engine. A tracing engine is some body of code that
++ calls into the <filename>&lt;linux/utrace.h&gt;</filename>
++ interfaces, represented by a <structname>struct
++ utrace_engine_ops</structname>. (Usually it's a kernel module,
++ though the legacy <function>ptrace</function> support is a tracing
++ engine that is not in a kernel module.) The interface operates on
++ individual threads (<structname>struct task_struct</structname>).
++ If an engine wants to treat several threads as a group, that is up
++ to its higher-level code.
++ </para>
++
++ <para>
++ Tracing begins by attaching an engine to a thread, using
++ <function>utrace_attach_task</function> or
++ <function>utrace_attach_pid</function>. If successful, it returns a
++ pointer that is the handle used in all other calls.
++ </para>
++
++ </sect1>
++
++ <sect1 id="callbacks"><title>Events and Callbacks</title>
++
++ <para>
++ An attached engine does nothing by default. An engine makes something
++ happen by requesting callbacks via <function>utrace_set_events</function>
++ and poking the thread with <function>utrace_control</function>.
++ The synchronization issues related to these two calls
++ are discussed further below in <xref linkend="teardown"/>.
++ </para>
++
++ <para>
++ Events are specified using the macro
++ <constant>UTRACE_EVENT(<replaceable>type</replaceable>)</constant>.
++ Each event type is associated with a callback in <structname>struct
++ utrace_engine_ops</structname>. A tracing engine can leave unused
++ callbacks <constant>NULL</constant>. The only callbacks required
++ are those used by the event flags it sets.
++ </para>
++
++ <para>
++ Many engines can be attached to each thread. When a thread has an
++ event, each engine gets a callback if it has set the event flag for
++ that event type. For most events, engines are called in the order they
++ attached. Engines that attach after the event has occurred do not get
++ callbacks for that event. This includes any new engines just attached
++ by an existing engine's callback function. Once the sequence of
++ callbacks for that one event has completed, such new engines are then
++ eligible in the next sequence that starts when there is another event.
++ </para>
++
++ <para>
++ Event reporting callbacks have details particular to the event type,
++ but are all called in similar environments and have the same
++ constraints. Callbacks are made from safe points, where no locks
++ are held, no special resources are pinned (usually), and the
++ user-mode state of the thread is accessible. So, callback code has
++ a pretty free hand. But to be a good citizen, callback code should
++ never block for long periods. It is fine to block in
++ <function>kmalloc</function> and the like, but never wait for i/o or
++ for user mode to do something. If you need the thread to wait, use
++ <constant>UTRACE_STOP</constant> and return from the callback
++ quickly. When your i/o finishes or whatever, you can use
++ <function>utrace_control</function> to resume the thread.
++ </para>
++
++ <para>
++ The <constant>UTRACE_EVENT(SYSCALL_ENTRY)</constant> event is a special
++ case. While other events happen in the kernel when it will return to
++ user mode soon, this event happens when entering the kernel before it
++ will proceed with the work requested from user mode. Because of this
++ difference, the <function>report_syscall_entry</function> callback is
++ special in two ways. For this event, engines are called in reverse of
++ the normal order (this includes the <function>report_quiesce</function>
++ call that precedes a <function>report_syscall_entry</function> call).
++ This preserves the semantics that the last engine to attach is called
++ "closest to user mode"--the engine that is first to see a thread's user
++ state when it enters the kernel is also the last to see that state when
++ the thread returns to user mode. For the same reason, if these
++ callbacks use <constant>UTRACE_STOP</constant> (see the next section),
++ the thread stops immediately after callbacks rather than only when it's
++ ready to return to user mode; when allowed to resume, it will actually
++ attempt the system call indicated by the register values at that time.
++ </para>
++
++ </sect1>
++
++ <sect1 id="safely"><title>Stopping Safely</title>
++
++ <sect2 id="well-behaved"><title>Writing well-behaved callbacks</title>
++
++ <para>
++ Well-behaved callbacks are important to maintain two essential
++ properties of the interface. The first of these is that unrelated
++ tracing engines should not interfere with each other. If your engine's
++ event callback does not return quickly, then another engine won't get
++ the event notification in a timely manner. The second important
++ property is that tracing should be as noninvasive as possible to the
++ normal operation of the system overall and of the traced thread in
++ particular. That is, attached tracing engines should not perturb a
++ thread's behavior, except to the extent that changing its user-visible
++ state is explicitly what you want to do. (Obviously some perturbation
++ is unavoidable, primarily timing changes, ranging from small delays due
++ to the overhead of tracing, to arbitrary pauses in user code execution
++ when a user stops a thread with a debugger for examination.) Even when
++ you explicitly want the perturbation of making the traced thread block,
++ just blocking directly in your callback has more unwanted effects. For
++ example, the <constant>CLONE</constant> event callbacks are called when
++ the new child thread has been created but not yet started running; the
++ child can never be scheduled until the <constant>CLONE</constant>
++ tracing callbacks return. (This allows engines tracing the parent to
++ attach to the child.) If a <constant>CLONE</constant> event callback
++ blocks the parent thread, it also prevents the child thread from
++ running (even to process a <constant>SIGKILL</constant>). If what you
++ want is to make both the parent and child block, then use
++ <function>utrace_attach_task</function> on the child and then use
++ <constant>UTRACE_STOP</constant> on both threads. A more crucial
++ problem with blocking in callbacks is that it can prevent
++ <constant>SIGKILL</constant> from working. A thread that is blocking
++ due to <constant>UTRACE_STOP</constant> will still wake up and die
++ immediately when sent a <constant>SIGKILL</constant>, as all threads
++ should. Relying on the <application>utrace</application>
++ infrastructure rather than on private synchronization calls in event
++ callbacks is an important way to help keep tracing robustly
++ noninvasive.
++ </para>
++
++ </sect2>
++
++ <sect2 id="UTRACE_STOP"><title>Using <constant>UTRACE_STOP</constant></title>
++
++ <para>
++ To control another thread and access its state, it must be stopped
++ with <constant>UTRACE_STOP</constant>. This means that it is
++ stopped and won't start running again while we access it. When a
++ thread is not already stopped, <function>utrace_control</function>
++ returns <constant>-EINPROGRESS</constant> and an engine must wait
++ for an event callback when the thread is ready to stop. The thread
++ may be running on another CPU or may be blocked. When it is ready
++ to be examined, it will make callbacks to engines that set the
++ <constant>UTRACE_EVENT(QUIESCE)</constant> event bit. To wake up an
++ interruptible wait, use <constant>UTRACE_INTERRUPT</constant>.
++ </para>
++
++ <para>
++ As long as some engine has used <constant>UTRACE_STOP</constant> and
++ not called <function>utrace_control</function> to resume the thread,
++ then the thread will remain stopped. <constant>SIGKILL</constant>
++ will wake it up, but it will not run user code. When the stop is
++ cleared with <function>utrace_control</function> or a callback
++ return value, the thread starts running again.
++ (See also <xref linkend="teardown"/>.)
++ </para>
++
++ </sect2>
++
++ </sect1>
++
++ <sect1 id="teardown"><title>Tear-down Races</title>
++
++ <sect2 id="SIGKILL"><title>Primacy of <constant>SIGKILL</constant></title>
++ <para>
++ Ordinarily synchronization issues for tracing engines are kept fairly
++ straightforward by using <constant>UTRACE_STOP</constant>. You ask a
++ thread to stop, and then once it makes the
++ <function>report_quiesce</function> callback it cannot do anything else
++ that would result in another callback, until you let it with a
++ <function>utrace_control</function> call. This simple arrangement
++ avoids complex and error-prone code in each one of a tracing engine's
++ event callbacks to keep them serialized with the engine's other
++ operations done on that thread from another thread of control.
++ However, giving tracing engines complete power to keep a traced thread
++ stuck in place runs afoul of a more important kind of simplicity that
++ the kernel overall guarantees: nothing can prevent or delay
++ <constant>SIGKILL</constant> from making a thread die and release its
++ resources. To preserve this important property of
++ <constant>SIGKILL</constant>, it as a special case can break
++ <constant>UTRACE_STOP</constant> like nothing else normally can. This
++ includes both explicit <constant>SIGKILL</constant> signals and the
++ implicit <constant>SIGKILL</constant> sent to each other thread in the
++ same thread group by a thread doing an exec, or processing a fatal
++ signal, or making an <function>exit_group</function> system call. A
++ tracing engine can prevent a thread from beginning the exit or exec or
++ dying by signal (other than <constant>SIGKILL</constant>) if it is
++ attached to that thread, but once the operation begins, no tracing
++ engine can prevent or delay all other threads in the same thread group
++ dying.
++ </para>
++ </sect2>
++
++ <sect2 id="reap"><title>Final callbacks</title>
++ <para>
++ The <function>report_reap</function> callback is always the final event
++ in the life cycle of a traced thread. Tracing engines can use this as
++ the trigger to clean up their own data structures. The
++ <function>report_death</function> callback is always the penultimate
++ event a tracing engine might see; it's seen unless the thread was
++ already in the midst of dying when the engine attached. Many tracing
++ engines will have no interest in when a parent reaps a dead process,
++ and nothing they want to do with a zombie thread once it dies; for
++ them, the <function>report_death</function> callback is the natural
++ place to clean up data structures and detach. To facilitate writing
++ such engines robustly, given the asynchrony of
++ <constant>SIGKILL</constant>, and without error-prone manual
++ implementation of synchronization schemes, the
++ <application>utrace</application> infrastructure provides some special
++ guarantees about the <function>report_death</function> and
++ <function>report_reap</function> callbacks. It still takes some care
++ to be sure your tracing engine is robust to tear-down races, but these
++ rules make it reasonably straightforward and concise to handle a lot of
++ corner cases correctly.
++ </para>
++ </sect2>
++
++ <sect2 id="refcount"><title>Engine and task pointers</title>
++ <para>
++ The first sort of guarantee concerns the core data structures
++ themselves. <structname>struct utrace_engine</structname> is
++ a reference-counted data structure. While you hold a reference, an
++ engine pointer will always stay valid so that you can safely pass it to
++ any <application>utrace</application> call. Each call to
++ <function>utrace_attach_task</function> or
++ <function>utrace_attach_pid</function> returns an engine pointer with a
++ reference belonging to the caller. You own that reference until you
++ drop it using <function>utrace_engine_put</function>. There is an
++ implicit reference on the engine while it is attached. So if you drop
++ your only reference, and then use
++ <function>utrace_attach_task</function> without
++ <constant>UTRACE_ATTACH_CREATE</constant> to look up that same engine,
++ you will get the same pointer with a new reference to replace the one
++ you dropped, just like calling <function>utrace_engine_get</function>.
++ When an engine has been detached, either explicitly with
++ <constant>UTRACE_DETACH</constant> or implicitly after
++ <function>report_reap</function>, then any references you hold are all
++ that keep the old engine pointer alive.
++ </para>
++
++ <para>
++ There is nothing a kernel module can do to keep a <structname>struct
++ task_struct</structname> alive outside of
++ <function>rcu_read_lock</function>. When the task dies and is reaped
++ by its parent (or itself), that structure can be freed so that any
++ dangling pointers you have stored become invalid.
++ <application>utrace</application> will not prevent this, but it can
++ help you detect it safely. By definition, a task that has been reaped
++ has had all its engines detached. All
++ <application>utrace</application> calls can be safely called on a
++ detached engine if the caller holds a reference on that engine pointer,
++ even if the task pointer passed in the call is invalid. All calls
++ return <constant>-ESRCH</constant> for a detached engine, which tells
++ you that the task pointer you passed could be invalid now. Since
++ <function>utrace_control</function> and
++ <function>utrace_set_events</function> do not block, you can call those
++ inside a <function>rcu_read_lock</function> section and be sure after
++ they don't return <constant>-ESRCH</constant> that the task pointer is
++ still valid until <function>rcu_read_unlock</function>. The
++ infrastructure never holds task references of its own. Though neither
++ <function>rcu_read_lock</function> nor any other lock is held while
++ making a callback, it's always guaranteed that the <structname>struct
++ task_struct</structname> and the <structname>struct
++ utrace_engine</structname> passed as arguments remain valid
++ until the callback function returns.
++ </para>
++
++ <para>
++ The common means for safely holding task pointers that is available to
++ kernel modules is to use <structname>struct pid</structname>, which
++ permits <function>put_pid</function> from kernel modules. When using
++ that, the calls <function>utrace_attach_pid</function>,
++ <function>utrace_control_pid</function>,
++ <function>utrace_set_events_pid</function>, and
++ <function>utrace_barrier_pid</function> are available.
++ </para>
++ </sect2>
++
++ <sect2 id="reap-after-death">
++ <title>
++ Serialization of <constant>DEATH</constant> and <constant>REAP</constant>
++ </title>
++ <para>
++ The second guarantee is the serialization of
++ <constant>DEATH</constant> and <constant>REAP</constant> event
++ callbacks for a given thread. The actual reaping by the parent
++ (<function>release_task</function> call) can occur simultaneously
++ while the thread is still doing the final steps of dying, including
++ the <function>report_death</function> callback. If a tracing engine
++ has requested both <constant>DEATH</constant> and
++ <constant>REAP</constant> event reports, it's guaranteed that the
++ <function>report_reap</function> callback will not be made until
++ after the <function>report_death</function> callback has returned.
++ If the <function>report_death</function> callback itself detaches
++ from the thread, then the <function>report_reap</function> callback
++ will never be made. Thus it is safe for a
++ <function>report_death</function> callback to clean up data
++ structures and detach.
++ </para>
++ </sect2>
++
++ <sect2 id="interlock"><title>Interlock with final callbacks</title>
++ <para>
++ The final sort of guarantee is that a tracing engine will know for sure
++ whether or not the <function>report_death</function> and/or
++ <function>report_reap</function> callbacks will be made for a certain
++ thread. These tear-down races are disambiguated by the error return
++ values of <function>utrace_set_events</function> and
++ <function>utrace_control</function>. Normally
++ <function>utrace_control</function> called with
++ <constant>UTRACE_DETACH</constant> returns zero, and this means that no
++ more callbacks will be made. If the thread is in the midst of dying,
++ it returns <constant>-EALREADY</constant> to indicate that the
++ <constant>report_death</constant> callback may already be in progress;
++ when you get this error, you know that any cleanup your
++ <function>report_death</function> callback does is about to happen or
++ has just happened--note that if the <function>report_death</function>
++ callback does not detach, the engine remains attached until the thread
++ gets reaped. If the thread is in the midst of being reaped,
++ <function>utrace_control</function> returns <constant>-ESRCH</constant>
++ to indicate that the <function>report_reap</function> callback may
++ already be in progress; this means the engine is implicitly detached
++ when the callback completes. This makes it possible for a tracing
++ engine that has decided asynchronously to detach from a thread to
++ safely clean up its data structures, knowing that no
++ <function>report_death</function> or <function>report_reap</function>
++ callback will try to do the same. <constant>utrace_detach</constant>
++ returns <constant>-ESRCH</constant> when the <structname>struct
++ utrace_engine</structname> has already been detached, but is
++ still a valid pointer because of its reference count. A tracing engine
++ can use this to safely synchronize its own independent multiple threads
++ of control with each other and with its event callbacks that detach.
++ </para>
++
++ <para>
++ In the same vein, <function>utrace_set_events</function> normally
++ returns zero; if the target thread was stopped before the call, then
++ after a successful call, no event callbacks not requested in the new
++ flags will be made. It fails with <constant>-EALREADY</constant> if
++ you try to clear <constant>UTRACE_EVENT(DEATH)</constant> when the
++ <function>report_death</function> callback may already have begun, or if
++ you try to newly set <constant>UTRACE_EVENT(DEATH)</constant> or
++ <constant>UTRACE_EVENT(QUIESCE)</constant> when the target is already
++ dead or dying. Like <function>utrace_control</function>, it returns
++ <constant>-ESRCH</constant> when the <function>report_reap</function>
++ callback may already have begun, or the thread has already been detached
++ (including forcible detach on reaping). This lets the tracing engine
++ know for sure which event callbacks it will or won't see after
++ <function>utrace_set_events</function> has returned. By checking for
++ errors, it can know whether to clean up its data structures immediately
++ or to let its callbacks do the work.
++ </para>
++ </sect2>
++
++ <sect2 id="barrier"><title>Using <function>utrace_barrier</function></title>
++ <para>
++ When a thread is safely stopped, calling
++ <function>utrace_control</function> with <constant>UTRACE_DETACH</constant>
++ or calling <function>utrace_set_events</function> to disable some events
++ ensures synchronously that your engine won't get any more of the callbacks
++ that have been disabled (none at all when detaching). But these can also
++ be used while the thread is not stopped, when it might be simultaneously
++ making a callback to your engine. For this situation, these calls return
++ <constant>-EINPROGRESS</constant> when it's possible a callback is in
++ progress. If you are not prepared to have your old callbacks still run,
++ then you can synchronize to be sure all the old callbacks are finished,
++ using <function>utrace_barrier</function>. This is necessary if the
++ kernel module containing your callback code is going to be unloaded.
++ </para>
++ <para>
++ After using <constant>UTRACE_DETACH</constant> once, further calls to
++ <function>utrace_control</function> with the same engine pointer will
++ return <constant>-ESRCH</constant>. In contrast, after getting
++ <constant>-EINPROGRESS</constant> from
++ <function>utrace_set_events</function>, you can call
++ <function>utrace_set_events</function> again later and if it returns zero
++ then know the old callbacks have finished.
++ </para>
++ <para>
++ Unlike all other calls, <function>utrace_barrier</function> (and
++ <function>utrace_barrier_pid</function>) will accept any engine pointer you
++ hold a reference on, even if <constant>UTRACE_DETACH</constant> has already
++ been used. After any <function>utrace_control</function> or
++ <function>utrace_set_events</function> call (these do not block), you can
++ call <function>utrace_barrier</function> to block until callbacks have
++ finished. This returns <constant>-ESRCH</constant> only if the engine is
++ completely detached (finished all callbacks). Otherwise it waits
++ until the thread is definitely not in the midst of a callback to this
++ engine and then returns zero, but can return
++ <constant>-ERESTARTSYS</constant> if its wait is interrupted.
++ </para>
++ </sect2>
++
++</sect1>
++
++</chapter>
++
++<chapter id="core"><title>utrace core API</title>
++
++<para>
++ The utrace API is declared in <filename>&lt;linux/utrace.h&gt;</filename>.
++</para>
++
++!Iinclude/linux/utrace.h
++!Ekernel/utrace.c
++
++</chapter>
++
++<chapter id="machine"><title>Machine State</title>
++
++<para>
++ The <function>task_current_syscall</function> function can be used on any
++ valid <structname>struct task_struct</structname> at any time, and does
++ not even require that <function>utrace_attach_task</function> was used at all.
++</para>
++
++<para>
++ The other ways to access the registers and other machine-dependent state of
++ a task can only be used on a task that is at a known safe point. The safe
++ points are all the places where <function>utrace_set_events</function> can
++ request callbacks (except for the <constant>DEATH</constant> and
++ <constant>REAP</constant> events). So at any event callback, it is safe to
++ examine <varname>current</varname>.
++</para>
++
++<para>
++ One task can examine another only after a callback in the target task that
++ returns <constant>UTRACE_STOP</constant> so that task will not return to user
++ mode after the safe point. This guarantees that the task will not resume
++ until the same engine uses <function>utrace_control</function>, unless the
++ task dies suddenly. To examine safely, one must use a pair of calls to
++ <function>utrace_prepare_examine</function> and
++ <function>utrace_finish_examine</function> surrounding the calls to
++ <structname>struct user_regset</structname> functions or direct examination
++ of task data structures. <function>utrace_prepare_examine</function> returns
++ an error if the task is not properly stopped, or is dead. After a
++ successful examination, the paired <function>utrace_finish_examine</function>
++ call returns an error if the task ever woke up during the examination. If
++ so, any data gathered may be scrambled and should be discarded. This means
++ there was a spurious wake-up (which should not happen), or a sudden death.
++</para>
++
++<sect1 id="regset"><title><structname>struct user_regset</structname></title>
++
++<para>
++ The <structname>struct user_regset</structname> API
++ is declared in <filename>&lt;linux/regset.h&gt;</filename>.
++</para>
++
++!Finclude/linux/regset.h
++
++</sect1>
++
++<sect1 id="task_current_syscall">
++ <title><filename>System Call Information</filename></title>
++
++<para>
++ This function is declared in <filename>&lt;linux/ptrace.h&gt;</filename>.
++</para>
++
++!Elib/syscall.c
++
++</sect1>
++
++<sect1 id="syscall"><title><filename>System Call Tracing</filename></title>
++
++<para>
++ The arch API for system call information is declared in
++ <filename>&lt;asm/syscall.h&gt;</filename>.
++ Each of these calls can be used only at system call entry tracing,
++ or can be used only at system call exit and the subsequent safe points
++ before returning to user mode.
++ At system call entry tracing means either during a
++ <structfield>report_syscall_entry</structfield> callback,
++ or any time after that callback has returned <constant>UTRACE_STOP</constant>.
++</para>
++
++!Finclude/asm-generic/syscall.h
++
++</sect1>
++
++</chapter>
++
++<chapter id="internals"><title>Kernel Internals</title>
++
++<para>
++ This chapter covers the interface to the tracing infrastructure
++ from the core of the kernel and the architecture-specific code.
++ This is for maintainers of the kernel and arch code, and not relevant
++ to using the tracing facilities described in preceding chapters.
++</para>
++
++<sect1 id="tracehook"><title>Core Calls In</title>
++
++<para>
++ These calls are declared in <filename>&lt;linux/tracehook.h&gt;</filename>.
++ The core kernel calls these functions at various important places.
++</para>
++
++!Finclude/linux/tracehook.h
++
++</sect1>
++
++<sect1 id="arch"><title>Architecture Calls Out</title>
++
++<para>
++ An arch that has done all these things sets
++ <constant>CONFIG_HAVE_ARCH_TRACEHOOK</constant>.
++ This is required to enable the <application>utrace</application> code.
++</para>
++
++<sect2 id="arch-ptrace"><title><filename>&lt;asm/ptrace.h&gt;</filename></title>
++
++<para>
++ An arch defines these in <filename>&lt;asm/ptrace.h&gt;</filename>
++ if it supports hardware single-step or block-step features.
++</para>
++
++!Finclude/linux/ptrace.h arch_has_single_step arch_has_block_step
++!Finclude/linux/ptrace.h user_enable_single_step user_enable_block_step
++!Finclude/linux/ptrace.h user_disable_single_step
++
++</sect2>
++
++<sect2 id="arch-syscall">
++ <title><filename>&lt;asm/syscall.h&gt;</filename></title>
++
++ <para>
++ An arch provides <filename>&lt;asm/syscall.h&gt;</filename> that
++ defines these as inlines, or declares them as exported functions.
++ These interfaces are described in <xref linkend="syscall"/>.
++ </para>
++
++</sect2>
++
++<sect2 id="arch-tracehook">
++ <title><filename>&lt;linux/tracehook.h&gt;</filename></title>
++
++ <para>
++ An arch must define <constant>TIF_NOTIFY_RESUME</constant>
++ and <constant>TIF_SYSCALL_TRACE</constant>
++ in its <filename>&lt;asm/thread_info.h&gt;</filename>.
++ The arch code must call the following functions, all declared
++ in <filename>&lt;linux/tracehook.h&gt;</filename> and
++ described in <xref linkend="tracehook"/>:
++
++ <itemizedlist>
++ <listitem>
++ <para><function>tracehook_notify_resume</function></para>
++ </listitem>
++ <listitem>
++ <para><function>tracehook_report_syscall_entry</function></para>
++ </listitem>
++ <listitem>
++ <para><function>tracehook_report_syscall_exit</function></para>
++ </listitem>
++ <listitem>
++ <para><function>tracehook_signal_handler</function></para>
++ </listitem>
++ </itemizedlist>
++
++ </para>
++
++</sect2>
++
++</sect1>
++
++</chapter>
++
++</book>
+diff --git a/fs/proc/array.c b/fs/proc/array.c
+index fff6572..a67bd83 100644
+--- a/fs/proc/array.c
++++ b/fs/proc/array.c
+@@ -81,6 +81,7 @@
+ #include <linux/pid_namespace.h>
+ #include <linux/ptrace.h>
+ #include <linux/tracehook.h>
++#include <linux/utrace.h>
+
+ #include <asm/pgtable.h>
+ #include <asm/processor.h>
+@@ -192,6 +193,8 @@ static inline void task_state(struct seq
+ cred->uid, cred->euid, cred->suid, cred->fsuid,
+ cred->gid, cred->egid, cred->sgid, cred->fsgid);
+
++ task_utrace_proc_status(m, p);
++
+ task_lock(p);
+ if (p->files)
+ fdt = files_fdtable(p->files);
+diff --git a/include/linux/sched.h b/include/linux/sched.h
+index 09f26df..e6fa5e9 100644
+--- a/include/linux/sched.h
++++ b/include/linux/sched.h
+@@ -1357,6 +1357,11 @@ struct task_struct {
+ #endif
+ seccomp_t seccomp;
+
++#ifdef CONFIG_UTRACE
++ struct utrace *utrace;
++ unsigned long utrace_flags;
++#endif
++
+ /* Thread group tracking */
+ u32 parent_exec_id;
+ u32 self_exec_id;
+diff --git a/include/linux/tracehook.h b/include/linux/tracehook.h
+index 98917e9..afba8f8 100644
+--- a/include/linux/tracehook.h
++++ b/include/linux/tracehook.h
+@@ -49,6 +49,7 @@
+ #include <linux/sched.h>
+ #include <linux/ptrace.h>
+ #include <linux/security.h>
++#include <linux/utrace.h>
+ struct linux_binprm;
+
+ /**
+@@ -63,6 +64,8 @@ struct linux_binprm;
+ */
+ static inline int tracehook_expect_breakpoints(struct task_struct *task)
+ {
++ if (unlikely(task_utrace_flags(task) & UTRACE_EVENT(SIGNAL_CORE)))
++ return 1;
+ return (task_ptrace(task) & PT_PTRACED) != 0;
+ }
+
+@@ -111,6 +114,9 @@ static inline void ptrace_report_syscall
+ static inline __must_check int tracehook_report_syscall_entry(
+ struct pt_regs *regs)
+ {
++ if ((task_utrace_flags(current) & UTRACE_EVENT(SYSCALL_ENTRY)) &&
++ utrace_report_syscall_entry(regs))
++ return 1;
+ ptrace_report_syscall(regs);
+ return 0;
+ }
+@@ -134,6 +140,9 @@ static inline __must_check int tracehook
+ */
+ static inline void tracehook_report_syscall_exit(struct pt_regs *regs, int step)
+ {
++ if (task_utrace_flags(current) & UTRACE_EVENT(SYSCALL_EXIT))
++ utrace_report_syscall_exit(regs);
++
+ if (step && (task_ptrace(current) & PT_PTRACED)) {
+ siginfo_t info;
+ user_single_step_siginfo(current, regs, &info);
+@@ -201,6 +210,8 @@ static inline void tracehook_report_exec
+ struct linux_binprm *bprm,
+ struct pt_regs *regs)
+ {
++ if (unlikely(task_utrace_flags(current) & UTRACE_EVENT(EXEC)))
++ utrace_report_exec(fmt, bprm, regs);
+ if (!ptrace_event(PT_TRACE_EXEC, PTRACE_EVENT_EXEC, 0) &&
+ unlikely(task_ptrace(current) & PT_PTRACED))
+ send_sig(SIGTRAP, current, 0);
+@@ -218,10 +229,37 @@ static inline void tracehook_report_exec
+ */
+ static inline void tracehook_report_exit(long *exit_code)
+ {
++ if (unlikely(task_utrace_flags(current) & UTRACE_EVENT(EXIT)))
++ utrace_report_exit(exit_code);
+ ptrace_event(PT_TRACE_EXIT, PTRACE_EVENT_EXIT, *exit_code);
+ }
+
+ /**
++ * tracehook_init_task - task_struct has just been copied
++ * @task: new &struct task_struct just copied from parent
++ *
++ * Called from do_fork() when @task has just been duplicated.
++ * After this, @task will be passed to tracehook_free_task()
++ * even if the rest of its setup fails before it is fully created.
++ */
++static inline void tracehook_init_task(struct task_struct *task)
++{
++ utrace_init_task(task);
++}
++
++/**
++ * tracehook_free_task - task_struct is being freed
++ * @task: dead &struct task_struct being freed
++ *
++ * Called from free_task() when @task is no longer in use.
++ */
++static inline void tracehook_free_task(struct task_struct *task)
++{
++ if (task_utrace_struct(task))
++ utrace_free_task(task);
++}
++
++/**
+ * tracehook_prepare_clone - prepare for new child to be cloned
+ * @clone_flags: %CLONE_* flags from clone/fork/vfork system call
+ *
+@@ -285,6 +323,8 @@ static inline void tracehook_report_clon
+ unsigned long clone_flags,
+ pid_t pid, struct task_struct *child)
+ {
++ if (unlikely(task_utrace_flags(current) & UTRACE_EVENT(CLONE)))
++ utrace_report_clone(clone_flags, child);
+ if (unlikely(task_ptrace(child))) {
+ /*
+ * It doesn't matter who attached/attaching to this
+@@ -317,6 +357,9 @@ static inline void tracehook_report_clon
+ pid_t pid,
+ struct task_struct *child)
+ {
++ if (unlikely(task_utrace_flags(current) & UTRACE_EVENT(CLONE)) &&
++ (clone_flags & CLONE_VFORK))
++ utrace_finish_vfork(current);
+ if (unlikely(trace))
+ ptrace_event(0, trace, pid);
+ }
+@@ -351,6 +394,10 @@ static inline void tracehook_report_vfor
+ */
+ static inline void tracehook_prepare_release_task(struct task_struct *task)
+ {
++ /* see utrace_add_engine() about this barrier */
++ smp_mb();
++ if (task_utrace_flags(task))
++ utrace_maybe_reap(task, task_utrace_struct(task), true);
+ }
+
+ /**
+@@ -365,6 +412,7 @@ static inline void tracehook_prepare_rel
+ static inline void tracehook_finish_release_task(struct task_struct *task)
+ {
+ ptrace_release_task(task);
++ BUG_ON(task->exit_state != EXIT_DEAD);
+ }
+
+ /**
+@@ -386,6 +434,8 @@ static inline void tracehook_signal_hand
+ const struct k_sigaction *ka,
+ struct pt_regs *regs, int stepping)
+ {
++ if (task_utrace_flags(current))
++ utrace_signal_handler(current, stepping);
+ if (stepping && (task_ptrace(current) & PT_PTRACED))
+ ptrace_notify(SIGTRAP);
+ }
+@@ -403,6 +453,8 @@ static inline void tracehook_signal_hand
+ static inline int tracehook_consider_ignored_signal(struct task_struct *task,
+ int sig)
+ {
++ if (unlikely(task_utrace_flags(task) & UTRACE_EVENT(SIGNAL_IGN)))
++ return 1;
+ return (task_ptrace(task) & PT_PTRACED) != 0;
+ }
+
+@@ -422,6 +474,9 @@ static inline int tracehook_consider_ign
+ static inline int tracehook_consider_fatal_signal(struct task_struct *task,
+ int sig)
+ {
++ if (unlikely(task_utrace_flags(task) & (UTRACE_EVENT(SIGNAL_TERM) |
++ UTRACE_EVENT(SIGNAL_CORE))))
++ return 1;
+ return (task_ptrace(task) & PT_PTRACED) != 0;
+ }
+
+@@ -436,6 +491,8 @@ static inline int tracehook_consider_fat
+ */
+ static inline int tracehook_force_sigpending(void)
+ {
++ if (unlikely(task_utrace_flags(current)))
++ return utrace_interrupt_pending();
+ return 0;
+ }
+
+@@ -465,6 +522,8 @@ static inline int tracehook_get_signal(s
+ siginfo_t *info,
+ struct k_sigaction *return_ka)
+ {
++ if (unlikely(task_utrace_flags(task)))
++ return utrace_get_signal(task, regs, info, return_ka);
+ return 0;
+ }
+
+@@ -492,6 +551,8 @@ static inline int tracehook_get_signal(s
+ */
+ static inline int tracehook_notify_jctl(int notify, int why)
+ {
++ if (task_utrace_flags(current) & UTRACE_EVENT(JCTL))
++ utrace_report_jctl(notify, why);
+ return notify ?: task_ptrace(current) ? why : 0;
+ }
+
+@@ -502,6 +563,8 @@ static inline int tracehook_notify_jctl(
+ */
+ static inline void tracehook_finish_jctl(void)
+ {
++ if (task_utrace_flags(current))
++ utrace_finish_stop();
+ }
+
+ #define DEATH_REAP -1
+@@ -524,6 +587,8 @@ static inline void tracehook_finish_jctl
+ static inline int tracehook_notify_death(struct task_struct *task,
+ void **death_cookie, int group_dead)
+ {
++ *death_cookie = task_utrace_struct(task);
++
+ if (task_detached(task))
+ return task->ptrace ? SIGCHLD : DEATH_REAP;
+
+@@ -560,6 +625,15 @@ static inline void tracehook_report_deat
+ int signal, void *death_cookie,
+ int group_dead)
+ {
++ /*
++ * If utrace_set_events() was just called to enable
++ * UTRACE_EVENT(DEATH), then we are obliged to call
++ * utrace_report_death() and not miss it. utrace_set_events()
++ * checks @task->exit_state under tasklist_lock to synchronize
++ * with exit_notify(), the caller.
++ */
++ if (task_utrace_flags(task) & _UTRACE_DEATH_EVENTS)
++ utrace_report_death(task, death_cookie, group_dead, signal);
+ }
+
+ #ifdef TIF_NOTIFY_RESUME
+@@ -589,10 +663,21 @@ static inline void set_notify_resume(str
+ * asynchronously, this will be called again before we return to
+ * user mode.
+ *
+- * Called without locks.
++ * Called without locks. However, on some machines this may be
++ * called with interrupts disabled.
+ */
+ static inline void tracehook_notify_resume(struct pt_regs *regs)
+ {
++ struct task_struct *task = current;
++ /*
++ * Prevent the following store/load from getting ahead of the
++ * caller which clears TIF_NOTIFY_RESUME. This pairs with the
++ * implicit mb() before setting TIF_NOTIFY_RESUME in
++ * set_notify_resume().
++ */
++ smp_mb();
++ if (task_utrace_flags(task))
++ utrace_resume(task, regs);
+ }
+ #endif /* TIF_NOTIFY_RESUME */
+
+diff --git a/include/linux/utrace.h b/include/linux/utrace.h
+new file mode 100644
+index ...f251efe 100644
+--- /dev/null
++++ b/include/linux/utrace.h
+@@ -0,0 +1,692 @@
++/*
++ * utrace infrastructure interface for debugging user processes
++ *
++ * Copyright (C) 2006-2009 Red Hat, Inc. All rights reserved.
++ *
++ * This copyrighted material is made available to anyone wishing to use,
++ * modify, copy, or redistribute it subject to the terms and conditions
++ * of the GNU General Public License v.2.
++ *
++ * Red Hat Author: Roland McGrath.
++ *
++ * This interface allows for notification of interesting events in a
++ * thread. It also mediates access to thread state such as registers.
++ * Multiple unrelated users can be associated with a single thread.
++ * We call each of these a tracing engine.
++ *
++ * A tracing engine starts by calling utrace_attach_task() or
++ * utrace_attach_pid() on the chosen thread, passing in a set of hooks
++ * (&struct utrace_engine_ops), and some associated data. This produces a
++ * &struct utrace_engine, which is the handle used for all other
++ * operations. An attached engine has its ops vector, its data, and an
++ * event mask controlled by utrace_set_events().
++ *
++ * For each event bit that is set, that engine will get the
++ * appropriate ops->report_*() callback when the event occurs. The
++ * &struct utrace_engine_ops need not provide callbacks for an event
++ * unless the engine sets one of the associated event bits.
++ */
++
++#ifndef _LINUX_UTRACE_H
++#define _LINUX_UTRACE_H 1
++
++#include <linux/list.h>
++#include <linux/kref.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++
++struct linux_binprm;
++struct pt_regs;
++struct utrace;
++struct user_regset;
++struct user_regset_view;
++
++/*
++ * Event bits passed to utrace_set_events().
++ * These appear in &struct task_struct.@utrace_flags
++ * and &struct utrace_engine.@flags.
++ */
++enum utrace_events {
++ _UTRACE_EVENT_QUIESCE, /* Thread is available for examination. */
++ _UTRACE_EVENT_REAP, /* Zombie reaped, no more tracing possible. */
++ _UTRACE_EVENT_CLONE, /* Successful clone/fork/vfork just done. */
++ _UTRACE_EVENT_EXEC, /* Successful execve just completed. */
++ _UTRACE_EVENT_EXIT, /* Thread exit in progress. */
++ _UTRACE_EVENT_DEATH, /* Thread has died. */
++ _UTRACE_EVENT_SYSCALL_ENTRY, /* User entered kernel for system call. */
++ _UTRACE_EVENT_SYSCALL_EXIT, /* Returning to user after system call. */
++ _UTRACE_EVENT_SIGNAL, /* Signal delivery will run a user handler. */
++ _UTRACE_EVENT_SIGNAL_IGN, /* No-op signal to be delivered. */
++ _UTRACE_EVENT_SIGNAL_STOP, /* Signal delivery will suspend. */
++ _UTRACE_EVENT_SIGNAL_TERM, /* Signal delivery will terminate. */
++ _UTRACE_EVENT_SIGNAL_CORE, /* Signal delivery will dump core. */
++ _UTRACE_EVENT_JCTL, /* Job control stop or continue completed. */
++ _UTRACE_NEVENTS
++};
++#define UTRACE_EVENT(type) (1UL << _UTRACE_EVENT_##type)
++
++/*
++ * All the kinds of signal events.
++ * These all use the @report_signal() callback.
++ */
++#define UTRACE_EVENT_SIGNAL_ALL (UTRACE_EVENT(SIGNAL) \
++ | UTRACE_EVENT(SIGNAL_IGN) \
++ | UTRACE_EVENT(SIGNAL_STOP) \
++ | UTRACE_EVENT(SIGNAL_TERM) \
++ | UTRACE_EVENT(SIGNAL_CORE))
++/*
++ * Both kinds of syscall events; these call the @report_syscall_entry()
++ * and @report_syscall_exit() callbacks, respectively.
++ */
++#define UTRACE_EVENT_SYSCALL \
++ (UTRACE_EVENT(SYSCALL_ENTRY) | UTRACE_EVENT(SYSCALL_EXIT))
++
++/*
++ * The event reports triggered synchronously by task death.
++ */
++#define _UTRACE_DEATH_EVENTS (UTRACE_EVENT(DEATH) | UTRACE_EVENT(QUIESCE))
++
++/*
++ * Hooks in <linux/tracehook.h> call these entry points to the utrace dispatch.
++ */
++void utrace_free_task(struct task_struct *);
++bool utrace_interrupt_pending(void);
++void utrace_resume(struct task_struct *, struct pt_regs *);
++void utrace_finish_stop(void);
++void utrace_maybe_reap(struct task_struct *, struct utrace *, bool);
++int utrace_get_signal(struct task_struct *, struct pt_regs *,
++ siginfo_t *, struct k_sigaction *);
++void utrace_report_clone(unsigned long, struct task_struct *);
++void utrace_finish_vfork(struct task_struct *);
++void utrace_report_exit(long *exit_code);
++void utrace_report_death(struct task_struct *, struct utrace *, bool, int);
++void utrace_report_jctl(int notify, int type);
++void utrace_report_exec(struct linux_binfmt *, struct linux_binprm *,
++ struct pt_regs *regs);
++bool utrace_report_syscall_entry(struct pt_regs *);
++void utrace_report_syscall_exit(struct pt_regs *);
++void utrace_signal_handler(struct task_struct *, int);
++
++#ifndef CONFIG_UTRACE
++
++/*
++ * <linux/tracehook.h> uses these accessors to avoid #ifdef CONFIG_UTRACE.
++ */
++static inline unsigned long task_utrace_flags(struct task_struct *task)
++{
++ return 0;
++}
++static inline struct utrace *task_utrace_struct(struct task_struct *task)
++{
++ return NULL;
++}
++static inline void utrace_init_task(struct task_struct *child)
++{
++}
++
++static inline void task_utrace_proc_status(struct seq_file *m,
++ struct task_struct *p)
++{
++}
++
++#else /* CONFIG_UTRACE */
++
++static inline unsigned long task_utrace_flags(struct task_struct *task)
++{
++ return task->utrace_flags;
++}
++
++static inline struct utrace *task_utrace_struct(struct task_struct *task)
++{
++ struct utrace *utrace;
++
++ /*
++ * This barrier ensures that any prior load of task->utrace_flags
++ * is ordered before this load of task->utrace. We use those
++ * utrace_flags checks in the hot path to decide to call into
++ * the utrace code. The first attach installs task->utrace before
++ * setting task->utrace_flags nonzero with implicit barrier in
++ * between, see utrace_add_engine().
++ */
++ smp_rmb();
++ utrace = task->utrace;
++
++ smp_read_barrier_depends(); /* See utrace_task_alloc(). */
++ return utrace;
++}
++
++static inline void utrace_init_task(struct task_struct *task)
++{
++ task->utrace_flags = 0;
++ task->utrace = NULL;
++}
++
++void task_utrace_proc_status(struct seq_file *m, struct task_struct *p);
++
++
++/*
++ * Version number of the API defined in this file. This will change
++ * whenever a tracing engine's code would need some updates to keep
++ * working. We maintain this here for the benefit of tracing engine code
++ * that is developed concurrently with utrace API improvements before they
++ * are merged into the kernel, making LINUX_VERSION_CODE checks unwieldy.
++ */
++#define UTRACE_API_VERSION 20091216
++
++/**
++ * enum utrace_resume_action - engine's choice of action for a traced task
++ * @UTRACE_STOP: Stay quiescent after callbacks.
++ * @UTRACE_INTERRUPT: Make @report_signal() callback soon.
++ * @UTRACE_REPORT: Make some callback soon.
++ * @UTRACE_SINGLESTEP: Resume in user mode for one instruction.
++ * @UTRACE_BLOCKSTEP: Resume in user mode until next branch.
++ * @UTRACE_RESUME: Resume normally in user mode.
++ * @UTRACE_DETACH: Detach my engine (implies %UTRACE_RESUME).
++ *
++ * See utrace_control() for detailed descriptions of each action. This is
++ * encoded in the @action argument and the return value for every callback
++ * with a &u32 return value.
++ *
++ * The order of these is important. When there is more than one engine,
++ * each supplies its choice and the smallest value prevails.
++ */
++enum utrace_resume_action {
++ UTRACE_STOP,
++ UTRACE_INTERRUPT,
++ UTRACE_REPORT,
++ UTRACE_SINGLESTEP,
++ UTRACE_BLOCKSTEP,
++ UTRACE_RESUME,
++ UTRACE_DETACH,
++ UTRACE_RESUME_MAX
++};
++#define UTRACE_RESUME_BITS (ilog2(UTRACE_RESUME_MAX) + 1)
++#define UTRACE_RESUME_MASK ((1 << UTRACE_RESUME_BITS) - 1)
++
++/**
++ * utrace_resume_action - &enum utrace_resume_action from callback action
++ * @action: &u32 callback @action argument or return value
++ *
++ * This extracts the &enum utrace_resume_action from @action,
++ * which is the @action argument to a &struct utrace_engine_ops
++ * callback or the return value from one.
++ */
++static inline enum utrace_resume_action utrace_resume_action(u32 action)
++{
++ return action & UTRACE_RESUME_MASK;
++}
++
++/**
++ * enum utrace_signal_action - disposition of signal
++ * @UTRACE_SIGNAL_DELIVER: Deliver according to sigaction.
++ * @UTRACE_SIGNAL_IGN: Ignore the signal.
++ * @UTRACE_SIGNAL_TERM: Terminate the process.
++ * @UTRACE_SIGNAL_CORE: Terminate with core dump.
++ * @UTRACE_SIGNAL_STOP: Deliver as absolute stop.
++ * @UTRACE_SIGNAL_TSTP: Deliver as job control stop.
++ * @UTRACE_SIGNAL_REPORT: Reporting before pending signals.
++ * @UTRACE_SIGNAL_HANDLER: Reporting after signal handler setup.
++ *
++ * This is encoded in the @action argument and the return value for
++ * a @report_signal() callback. It says what will happen to the
++ * signal described by the &siginfo_t parameter to the callback.
++ *
++ * The %UTRACE_SIGNAL_REPORT value is used in an @action argument when
++ * a tracing report is being made before dequeuing any pending signal.
++ * If this is immediately after a signal handler has been set up, then
++ * %UTRACE_SIGNAL_HANDLER is used instead. A @report_signal callback
++ * that uses %UTRACE_SIGNAL_DELIVER|%UTRACE_SINGLESTEP will ensure
++ * it sees a %UTRACE_SIGNAL_HANDLER report.
++ */
++enum utrace_signal_action {
++ UTRACE_SIGNAL_DELIVER = 0x00,
++ UTRACE_SIGNAL_IGN = 0x10,
++ UTRACE_SIGNAL_TERM = 0x20,
++ UTRACE_SIGNAL_CORE = 0x30,
++ UTRACE_SIGNAL_STOP = 0x40,
++ UTRACE_SIGNAL_TSTP = 0x50,
++ UTRACE_SIGNAL_REPORT = 0x60,
++ UTRACE_SIGNAL_HANDLER = 0x70
++};
++#define UTRACE_SIGNAL_MASK 0xf0
++#define UTRACE_SIGNAL_HOLD 0x100 /* Flag, push signal back on queue. */
++
++/**
++ * utrace_signal_action - &enum utrace_signal_action from callback action
++ * @action: @report_signal callback @action argument or return value
++ *
++ * This extracts the &enum utrace_signal_action from @action, which
++ * is the @action argument to a @report_signal callback or the
++ * return value from one.
++ */
++static inline enum utrace_signal_action utrace_signal_action(u32 action)
++{
++ return action & UTRACE_SIGNAL_MASK;
++}
++
++/**
++ * enum utrace_syscall_action - disposition of system call attempt
++ * @UTRACE_SYSCALL_RUN: Run the system call.
++ * @UTRACE_SYSCALL_ABORT: Don't run the system call.
++ *
++ * This is encoded in the @action argument and the return value for
++ * a @report_syscall_entry callback.
++ */
++enum utrace_syscall_action {
++ UTRACE_SYSCALL_RUN = 0x00,
++ UTRACE_SYSCALL_ABORT = 0x10
++};
++#define UTRACE_SYSCALL_MASK 0xf0
++#define UTRACE_SYSCALL_RESUMED 0x100 /* Flag, report_syscall_entry() repeats */
++
++/**
++ * utrace_syscall_action - &enum utrace_syscall_action from callback action
++ * @action: @report_syscall_entry callback @action or return value
++ *
++ * This extracts the &enum utrace_syscall_action from @action, which
++ * is the @action argument to a @report_syscall_entry callback or the
++ * return value from one.
++ */
++static inline enum utrace_syscall_action utrace_syscall_action(u32 action)
++{
++ return action & UTRACE_SYSCALL_MASK;
++}
++
++/*
++ * Flags for utrace_attach_task() and utrace_attach_pid().
++ */
++#define UTRACE_ATTACH_MATCH_OPS 0x0001 /* Match engines on ops. */
++#define UTRACE_ATTACH_MATCH_DATA 0x0002 /* Match engines on data. */
++#define UTRACE_ATTACH_MATCH_MASK 0x000f
++#define UTRACE_ATTACH_CREATE 0x0010 /* Attach a new engine. */
++#define UTRACE_ATTACH_EXCLUSIVE 0x0020 /* Refuse if existing match. */
++
++/**
++ * struct utrace_engine - per-engine structure
++ * @ops: &struct utrace_engine_ops pointer passed to utrace_attach_task()
++ * @data: engine-private &void * passed to utrace_attach_task()
++ * @flags: event mask set by utrace_set_events() plus internal flag bits
++ *
++ * The task itself never has to worry about engines detaching while
++ * it's doing event callbacks. These structures are removed from the
++ * task's active list only when it's stopped, or by the task itself.
++ *
++ * utrace_engine_get() and utrace_engine_put() maintain a reference count.
++ * When it drops to zero, the structure is freed. One reference is held
++ * implicitly while the engine is attached to its task.
++ */
++struct utrace_engine {
++/* private: */
++ struct kref kref;
++ void (*release)(void *);
++ struct list_head entry;
++
++/* public: */
++ const struct utrace_engine_ops *ops;
++ void *data;
++
++ unsigned long flags;
++};
++
++/**
++ * utrace_engine_get - acquire a reference on a &struct utrace_engine
++ * @engine: &struct utrace_engine pointer
++ *
++ * You must hold a reference on @engine, and you get another.
++ */
++static inline void utrace_engine_get(struct utrace_engine *engine)
++{
++ kref_get(&engine->kref);
++}
++
++void __utrace_engine_release(struct kref *);
++
++/**
++ * utrace_engine_put - release a reference on a &struct utrace_engine
++ * @engine: &struct utrace_engine pointer
++ *
++ * You must hold a reference on @engine, and you lose that reference.
++ * If it was the last one, @engine becomes an invalid pointer.
++ */
++static inline void utrace_engine_put(struct utrace_engine *engine)
++{
++ kref_put(&engine->kref, __utrace_engine_release);
++}
++
++/**
++ * struct utrace_engine_ops - tracing engine callbacks
++ *
++ * Each @report_*() callback corresponds to an %UTRACE_EVENT(*) bit.
++ * utrace_set_events() calls on @engine choose which callbacks will
++ * be made to @engine from @task.
++ *
++ * Most callbacks take an @action argument, giving the resume action
++ * chosen by other tracing engines. All callbacks take an @engine
++ * argument. The @report_reap callback takes a @task argument that
++ * might or might not be @current. All other @report_* callbacks
++ * report an event in the @current task.
++ *
++ * For some calls, @action also includes bits specific to that event
++ * and utrace_resume_action() is used to extract the resume action.
++ * This shows what would happen if @engine wasn't there, or will if
++ * the callback's return value uses %UTRACE_RESUME. This always
++ * starts as %UTRACE_RESUME when no other tracing is being done on
++ * this task.
++ *
++ * All return values contain &enum utrace_resume_action bits. For
++ * some calls, other bits specific to that kind of event are added to
++ * the resume action bits with OR. These are the same bits used in
++ * the @action argument. The resume action returned by a callback
++ * does not override previous engines' choices, it only says what
++ * @engine wants done. What @current actually does is the action that's
++ * most constrained among the choices made by all attached engines.
++ * See utrace_control() for more information on the actions.
++ *
++ * When %UTRACE_STOP is used in @report_syscall_entry, then @current
++ * stops before attempting the system call. In this case, another
++ * @report_syscall_entry callback will follow after @current resumes if
++ * %UTRACE_REPORT or %UTRACE_INTERRUPT was returned by some callback
++ * or passed to utrace_control(). In a second or later callback,
++ * %UTRACE_SYSCALL_RESUMED is set in the @action argument to indicate
++ * a repeat callback still waiting to attempt the same system call
++ * invocation. This repeat callback gives each engine an opportunity
++ * to reexamine registers another engine might have changed while
++ * @current was held in %UTRACE_STOP.
++ *
++ * In other cases, the resume action does not take effect until @current
++ * is ready to check for signals and return to user mode. If there
++ * are more callbacks to be made, the last round of calls determines
++ * the final action. A @report_quiesce callback with @event zero, or
++ * a @report_signal callback, will always be the last one made before
++ * @current resumes. Only %UTRACE_STOP is "sticky"--if @engine returned
++ * %UTRACE_STOP then @current stays stopped unless @engine returns
++ * different from a following callback.
++ *
++ * The report_death() and report_reap() callbacks do not take @action
++ * arguments, and only %UTRACE_DETACH is meaningful in the return value
++ * from a report_death() callback. None of the resume actions applies
++ * to a dead thread.
++ *
++ * All @report_*() hooks are called with no locks held, in a generally
++ * safe environment when we will be returning to user mode soon (or just
++ * entered the kernel). It is fine to block for memory allocation and
++ * the like, but all hooks are asynchronous and must not block on
++ * external events! If you want the thread to block, use %UTRACE_STOP
++ * in your hook's return value; then later wake it up with utrace_control().
++ *
++ * @report_quiesce:
++ * Requested by %UTRACE_EVENT(%QUIESCE).
++ * This does not indicate any event, but just that @current is in a
++ * safe place for examination. This call is made before each specific
++ * event callback, except for @report_reap. The @event argument gives
++ * the %UTRACE_EVENT(@which) value for the event occurring. This
++ * callback might be made for events @engine has not requested, if
++ * some other engine is tracing the event; calling utrace_set_events()
++ * call here can request the immediate callback for this occurrence of
++ * @event. @event is zero when there is no other event, @current is
++ * now ready to check for signals and return to user mode, and some
++ * engine has used %UTRACE_REPORT or %UTRACE_INTERRUPT to request this
++ * callback. For this case, if @report_signal is not %NULL, the
++ * @report_quiesce callback may be replaced with a @report_signal
++ * callback passing %UTRACE_SIGNAL_REPORT in its @action argument,
++ * whenever @current is entering the signal-check path anyway.
++ *
++ * @report_signal:
++ * Requested by %UTRACE_EVENT(%SIGNAL_*) or %UTRACE_EVENT(%QUIESCE).
++ * Use utrace_signal_action() and utrace_resume_action() on @action.
++ * The signal action is %UTRACE_SIGNAL_REPORT when some engine has
++ * used %UTRACE_REPORT or %UTRACE_INTERRUPT; the callback can choose
++ * to stop or to deliver an artificial signal, before pending signals.
++ * It's %UTRACE_SIGNAL_HANDLER instead when signal handler setup just
++ * finished (after a previous %UTRACE_SIGNAL_DELIVER return); this
++ * serves in lieu of any %UTRACE_SIGNAL_REPORT callback requested by
++ * %UTRACE_REPORT or %UTRACE_INTERRUPT, and is also implicitly
++ * requested by %UTRACE_SINGLESTEP or %UTRACE_BLOCKSTEP into the
++ * signal delivery. The other signal actions indicate a signal about
++ * to be delivered; the previous engine's return value sets the signal
++ * action seen by the the following engine's callback. The @info data
++ * can be changed at will, including @info->si_signo. The settings in
++ * @return_ka determines what %UTRACE_SIGNAL_DELIVER does. @orig_ka
++ * is what was in force before other tracing engines intervened, and
++ * it's %NULL when this report began as %UTRACE_SIGNAL_REPORT or
++ * %UTRACE_SIGNAL_HANDLER. For a report without a new signal, @info
++ * is left uninitialized and must be set completely by an engine that
++ * chooses to deliver a signal; if there was a previous @report_signal
++ * callback ending in %UTRACE_STOP and it was just resumed using
++ * %UTRACE_REPORT or %UTRACE_INTERRUPT, then @info is left unchanged
++ * from the previous callback. In this way, the original signal can
++ * be left in @info while returning %UTRACE_STOP|%UTRACE_SIGNAL_IGN
++ * and then found again when resuming with %UTRACE_INTERRUPT.
++ * The %UTRACE_SIGNAL_HOLD flag bit can be OR'd into the return value,
++ * and might be in @action if the previous engine returned it. This
++ * flag asks that the signal in @info be pushed back on @current's queue
++ * so that it will be seen again after whatever action is taken now.
++ *
++ * @report_clone:
++ * Requested by %UTRACE_EVENT(%CLONE).
++ * Event reported for parent, before the new task @child might run.
++ * @clone_flags gives the flags used in the clone system call, or
++ * equivalent flags for a fork() or vfork() system call. This
++ * function can use utrace_attach_task() on @child. Then passing
++ * %UTRACE_STOP to utrace_control() on @child here keeps the child
++ * stopped before it ever runs in user mode, %UTRACE_REPORT or
++ * %UTRACE_INTERRUPT ensures a callback from @child before it
++ * starts in user mode.
++ *
++ * @report_jctl:
++ * Requested by %UTRACE_EVENT(%JCTL).
++ * Job control event; @type is %CLD_STOPPED or %CLD_CONTINUED,
++ * indicating whether we are stopping or resuming now. If @notify
++ * is nonzero, @current is the last thread to stop and so will send
++ * %SIGCHLD to its parent after this callback; @notify reflects
++ * what the parent's %SIGCHLD has in @si_code, which can sometimes
++ * be %CLD_STOPPED even when @type is %CLD_CONTINUED.
++ *
++ * @report_exec:
++ * Requested by %UTRACE_EVENT(%EXEC).
++ * An execve system call has succeeded and the new program is about to
++ * start running. The initial user register state is handy to be tweaked
++ * directly in @regs. @fmt and @bprm gives the details of this exec.
++ *
++ * @report_syscall_entry:
++ * Requested by %UTRACE_EVENT(%SYSCALL_ENTRY).
++ * Thread has entered the kernel to request a system call.
++ * The user register state is handy to be tweaked directly in @regs.
++ * The @action argument contains an &enum utrace_syscall_action,
++ * use utrace_syscall_action() to extract it. The return value
++ * overrides the last engine's action for the system call.
++ * If the final action is %UTRACE_SYSCALL_ABORT, no system call
++ * is made. The details of the system call being attempted can
++ * be fetched here with syscall_get_nr() and syscall_get_arguments().
++ * The parameter registers can be changed with syscall_set_arguments().
++ * See above about the %UTRACE_SYSCALL_RESUMED flag in @action.
++ * Use %UTRACE_REPORT in the return value to guarantee you get
++ * another callback (with %UTRACE_SYSCALL_RESUMED flag) in case
++ * @current stops with %UTRACE_STOP before attempting the system call.
++ *
++ * @report_syscall_exit:
++ * Requested by %UTRACE_EVENT(%SYSCALL_EXIT).
++ * Thread is about to leave the kernel after a system call request.
++ * The user register state is handy to be tweaked directly in @regs.
++ * The results of the system call attempt can be examined here using
++ * syscall_get_error() and syscall_get_return_value(). It is safe
++ * here to call syscall_set_return_value() or syscall_rollback().
++ *
++ * @report_exit:
++ * Requested by %UTRACE_EVENT(%EXIT).
++ * Thread is exiting and cannot be prevented from doing so,
++ * but all its state is still live. The @code value will be
++ * the wait result seen by the parent, and can be changed by
++ * this engine or others. The @orig_code value is the real
++ * status, not changed by any tracing engine. Returning %UTRACE_STOP
++ * here keeps @current stopped before it cleans up its state and dies,
++ * so it can be examined by other processes. When @current is allowed
++ * to run, it will die and get to the @report_death callback.
++ *
++ * @report_death:
++ * Requested by %UTRACE_EVENT(%DEATH).
++ * Thread is really dead now. It might be reaped by its parent at
++ * any time, or self-reap immediately. Though the actual reaping
++ * may happen in parallel, a report_reap() callback will always be
++ * ordered after a report_death() callback.
++ *
++ * @report_reap:
++ * Requested by %UTRACE_EVENT(%REAP).
++ * Called when someone reaps the dead task (parent, init, or self).
++ * This means the parent called wait, or else this was a detached
++ * thread or a process whose parent ignores SIGCHLD.
++ * No more callbacks are made after this one.
++ * The engine is always detached.
++ * There is nothing more a tracing engine can do about this thread.
++ * After this callback, the @engine pointer will become invalid.
++ * The @task pointer may become invalid if get_task_struct() hasn't
++ * been used to keep it alive.
++ * An engine should always request this callback if it stores the
++ * @engine pointer or stores any pointer in @engine->data, so it
++ * can clean up its data structures.
++ * Unlike other callbacks, this can be called from the parent's context
++ * rather than from the traced thread itself--it must not delay the
++ * parent by blocking.
++ *
++ * @release:
++ * If not %NULL, this is called after the last utrace_engine_put()
++ * call for a &struct utrace_engine, which could be implicit after
++ * a %UTRACE_DETACH return from another callback. Its argument is
++ * the engine's @data member.
++ */
++struct utrace_engine_ops {
++ u32 (*report_quiesce)(u32 action, struct utrace_engine *engine,
++ unsigned long event);
++ u32 (*report_signal)(u32 action, struct utrace_engine *engine,
++ struct pt_regs *regs,
++ siginfo_t *info,
++ const struct k_sigaction *orig_ka,
++ struct k_sigaction *return_ka);
++ u32 (*report_clone)(u32 action, struct utrace_engine *engine,
++ unsigned long clone_flags,
++ struct task_struct *child);
++ u32 (*report_jctl)(u32 action, struct utrace_engine *engine,
++ int type, int notify);
++ u32 (*report_exec)(u32 action, struct utrace_engine *engine,
++ const struct linux_binfmt *fmt,
++ const struct linux_binprm *bprm,
++ struct pt_regs *regs);
++ u32 (*report_syscall_entry)(u32 action, struct utrace_engine *engine,
++ struct pt_regs *regs);
++ u32 (*report_syscall_exit)(u32 action, struct utrace_engine *engine,
++ struct pt_regs *regs);
++ u32 (*report_exit)(u32 action, struct utrace_engine *engine,
++ long orig_code, long *code);
++ u32 (*report_death)(struct utrace_engine *engine,
++ bool group_dead, int signal);
++ void (*report_reap)(struct utrace_engine *engine,
++ struct task_struct *task);
++ void (*release)(void *data);
++};
++
++/**
++ * struct utrace_examiner - private state for using utrace_prepare_examine()
++ *
++ * The members of &struct utrace_examiner are private to the implementation.
++ * This data type holds the state from a call to utrace_prepare_examine()
++ * to be used by a call to utrace_finish_examine().
++ */
++struct utrace_examiner {
++/* private: */
++ long state;
++ unsigned long ncsw;
++};
++
++/*
++ * These are the exported entry points for tracing engines to use.
++ * See kernel/utrace.c for their kerneldoc comments with interface details.
++ */
++struct utrace_engine *utrace_attach_task(struct task_struct *, int,
++ const struct utrace_engine_ops *,
++ void *);
++struct utrace_engine *utrace_attach_pid(struct pid *, int,
++ const struct utrace_engine_ops *,
++ void *);
++int __must_check utrace_control(struct task_struct *,
++ struct utrace_engine *,
++ enum utrace_resume_action);
++int __must_check utrace_set_events(struct task_struct *,
++ struct utrace_engine *,
++ unsigned long eventmask);
++int __must_check utrace_barrier(struct task_struct *,
++ struct utrace_engine *);
++int __must_check utrace_prepare_examine(struct task_struct *,
++ struct utrace_engine *,
++ struct utrace_examiner *);
++int __must_check utrace_finish_examine(struct task_struct *,
++ struct utrace_engine *,
++ struct utrace_examiner *);
++
++/**
++ * utrace_control_pid - control a thread being traced by a tracing engine
++ * @pid: thread to affect
++ * @engine: attached engine to affect
++ * @action: &enum utrace_resume_action for thread to do
++ *
++ * This is the same as utrace_control(), but takes a &struct pid
++ * pointer rather than a &struct task_struct pointer. The caller must
++ * hold a ref on @pid, but does not need to worry about the task
++ * staying valid. If it's been reaped so that @pid points nowhere,
++ * then this call returns -%ESRCH.
++ */
++static inline __must_check int utrace_control_pid(
++ struct pid *pid, struct utrace_engine *engine,
++ enum utrace_resume_action action)
++{
++ /*
++ * We don't bother with rcu_read_lock() here to protect the
++ * task_struct pointer, because utrace_control will return
++ * -ESRCH without looking at that pointer if the engine is
++ * already detached. A task_struct pointer can't die before
++ * all the engines are detached in release_task() first.
++ */
++ struct task_struct *task = pid_task(pid, PIDTYPE_PID);
++ return unlikely(!task) ? -ESRCH : utrace_control(task, engine, action);
++}
++
++/**
++ * utrace_set_events_pid - choose which event reports a tracing engine gets
++ * @pid: thread to affect
++ * @engine: attached engine to affect
++ * @eventmask: new event mask
++ *
++ * This is the same as utrace_set_events(), but takes a &struct pid
++ * pointer rather than a &struct task_struct pointer. The caller must
++ * hold a ref on @pid, but does not need to worry about the task
++ * staying valid. If it's been reaped so that @pid points nowhere,
++ * then this call returns -%ESRCH.
++ */
++static inline __must_check int utrace_set_events_pid(
++ struct pid *pid, struct utrace_engine *engine, unsigned long eventmask)
++{
++ struct task_struct *task = pid_task(pid, PIDTYPE_PID);
++ return unlikely(!task) ? -ESRCH :
++ utrace_set_events(task, engine, eventmask);
++}
++
++/**
++ * utrace_barrier_pid - synchronize with simultaneous tracing callbacks
++ * @pid: thread to affect
++ * @engine: engine to affect (can be detached)
++ *
++ * This is the same as utrace_barrier(), but takes a &struct pid
++ * pointer rather than a &struct task_struct pointer. The caller must
++ * hold a ref on @pid, but does not need to worry about the task
++ * staying valid. If it's been reaped so that @pid points nowhere,
++ * then this call returns -%ESRCH.
++ */
++static inline __must_check int utrace_barrier_pid(struct pid *pid,
++ struct utrace_engine *engine)
++{
++ struct task_struct *task = pid_task(pid, PIDTYPE_PID);
++ return unlikely(!task) ? -ESRCH : utrace_barrier(task, engine);
++}
++
++#endif /* CONFIG_UTRACE */
++
++#endif /* linux/utrace.h */
+diff --git a/init/Kconfig b/init/Kconfig
+index c972899..17483b7 100644
+--- a/init/Kconfig
++++ b/init/Kconfig
+@@ -339,6 +339,15 @@ config AUDIT_TREE
+ depends on AUDITSYSCALL
+ select FSNOTIFY
+
++config UTRACE
++ bool "Infrastructure for tracing and debugging user processes"
++ depends on EXPERIMENTAL
++ depends on HAVE_ARCH_TRACEHOOK
++ help
++ Enable the utrace process tracing interface. This is an internal
++ kernel interface exported to kernel modules, to track events in
++ user threads, extract and change user thread state.
++
+ source "kernel/irq/Kconfig"
+
+ menu "RCU Subsystem"
+diff --git a/kernel/Makefile b/kernel/Makefile
+index 0b5ff08..1172528 100644
+--- a/kernel/Makefile
++++ b/kernel/Makefile
+@@ -70,6 +70,7 @@ obj-$(CONFIG_IKCONFIG) += configs.o
+ obj-$(CONFIG_RESOURCE_COUNTERS) += res_counter.o
+ obj-$(CONFIG_SMP) += stop_machine.o
+ obj-$(CONFIG_KPROBES_SANITY_TEST) += test_kprobes.o
++obj-$(CONFIG_UTRACE) += utrace.o
+ obj-$(CONFIG_AUDIT) += audit.o auditfilter.o
+ obj-$(CONFIG_AUDITSYSCALL) += auditsc.o
+ obj-$(CONFIG_AUDIT_WATCH) += audit_watch.o
+diff --git a/kernel/fork.c b/kernel/fork.c
+index 5447dc7..10a39fe 100644
+--- a/kernel/fork.c
++++ b/kernel/fork.c
+@@ -162,6 +162,7 @@ void free_task(struct task_struct *tsk)
+ free_thread_info(tsk->stack);
+ rt_mutex_debug_task_free(tsk);
+ ftrace_graph_exit_task(tsk);
++ tracehook_free_task(tsk);
+ free_task_struct(tsk);
+ }
+ EXPORT_SYMBOL(free_task);
+@@ -1018,6 +1019,8 @@ static struct task_struct *copy_process(
+ if (!p)
+ goto fork_out;
+
++ tracehook_init_task(p);
++
+ ftrace_graph_init_task(p);
+
+ rt_mutex_init_task(p);
+diff --git a/kernel/ptrace.c b/kernel/ptrace.c
+index 84d9f8f..e275608 100644
+--- a/kernel/ptrace.c
++++ b/kernel/ptrace.c
+@@ -15,6 +15,7 @@
+ #include <linux/highmem.h>
+ #include <linux/pagemap.h>
+ #include <linux/ptrace.h>
++#include <linux/utrace.h>
+ #include <linux/security.h>
+ #include <linux/signal.h>
+ #include <linux/audit.h>
+@@ -163,6 +164,14 @@ bool ptrace_may_access(struct task_struc
+ return !err;
+ }
+
++/*
++ * For experimental use of utrace, exclude ptrace on the same task.
++ */
++static inline bool exclude_ptrace(struct task_struct *task)
++{
++ return unlikely(!!task_utrace_flags(task));
++}
++
+ int ptrace_attach(struct task_struct *task)
+ {
+ int retval;
+@@ -186,6 +195,8 @@ int ptrace_attach(struct task_struct *ta
+
+ task_lock(task);
+ retval = __ptrace_may_access(task, PTRACE_MODE_ATTACH);
++ if (!retval && exclude_ptrace(task))
++ retval = -EBUSY;
+ task_unlock(task);
+ if (retval)
+ goto unlock_creds;
+@@ -223,6 +234,9 @@ int ptrace_traceme(void)
+ {
+ int ret = -EPERM;
+
++ if (exclude_ptrace(current)) /* XXX locking */
++ return -EBUSY;
++
+ write_lock_irq(&tasklist_lock);
+ /* Are we already being traced? */
+ if (!current->ptrace) {
+diff --git a/kernel/utrace.c b/kernel/utrace.c
+new file mode 100644
+index ...26d6faf 100644
+--- /dev/null
++++ b/kernel/utrace.c
+@@ -0,0 +1,2440 @@
++/*
++ * utrace infrastructure interface for debugging user processes
++ *
++ * Copyright (C) 2006-2010 Red Hat, Inc. All rights reserved.
++ *
++ * This copyrighted material is made available to anyone wishing to use,
++ * modify, copy, or redistribute it subject to the terms and conditions
++ * of the GNU General Public License v.2.
++ *
++ * Red Hat Author: Roland McGrath.
++ */
++
++#include <linux/utrace.h>
++#include <linux/tracehook.h>
++#include <linux/regset.h>
++#include <asm/syscall.h>
++#include <linux/ptrace.h>
++#include <linux/err.h>
++#include <linux/sched.h>
++#include <linux/freezer.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/slab.h>
++#include <linux/seq_file.h>
++
++
++/*
++ * Per-thread structure private to utrace implementation.
++ * If task_struct.utrace_flags is nonzero, task_struct.utrace
++ * has always been allocated first. Once allocated, it is
++ * never freed until free_task().
++ *
++ * The common event reporting loops are done by the task making the
++ * report without ever taking any locks. To facilitate this, the two
++ * lists @attached and @attaching work together for smooth asynchronous
++ * attaching with low overhead. Modifying either list requires @lock.
++ * The @attaching list can be modified any time while holding @lock.
++ * New engines being attached always go on this list.
++ *
++ * The @attached list is what the task itself uses for its reporting
++ * loops. When the task itself is not quiescent, it can use the
++ * @attached list without taking any lock. Nobody may modify the list
++ * when the task is not quiescent. When it is quiescent, that means
++ * that it won't run again without taking @lock itself before using
++ * the list.
++ *
++ * At each place where we know the task is quiescent (or it's current),
++ * while holding @lock, we call splice_attaching(), below. This moves
++ * the @attaching list members on to the end of the @attached list.
++ * Since this happens at the start of any reporting pass, any new
++ * engines attached asynchronously go on the stable @attached list
++ * in time to have their callbacks seen.
++ */
++struct utrace {
++ spinlock_t lock;
++ struct list_head attached, attaching;
++
++ struct task_struct *cloning;
++
++ struct utrace_engine *reporting;
++
++ enum utrace_resume_action resume:UTRACE_RESUME_BITS;
++ unsigned int signal_handler:1;
++ unsigned int vfork_stop:1; /* need utrace_stop() before vfork wait */
++ unsigned int death:1; /* in utrace_report_death() now */
++ unsigned int reap:1; /* release_task() has run */
++ unsigned int pending_attach:1; /* need splice_attaching() */
++};
++
++static struct kmem_cache *utrace_cachep;
++static struct kmem_cache *utrace_engine_cachep;
++static const struct utrace_engine_ops utrace_detached_ops; /* forward decl */
++
++static int __init utrace_init(void)
++{
++ utrace_cachep = KMEM_CACHE(utrace, SLAB_PANIC);
++ utrace_engine_cachep = KMEM_CACHE(utrace_engine, SLAB_PANIC);
++ return 0;
++}
++module_init(utrace_init);
++
++/*
++ * Set up @task.utrace for the first time. We can have races
++ * between two utrace_attach_task() calls here. The task_lock()
++ * governs installing the new pointer. If another one got in first,
++ * we just punt the new one we allocated.
++ *
++ * This returns false only in case of a memory allocation failure.
++ */
++static bool utrace_task_alloc(struct task_struct *task)
++{
++ struct utrace *utrace = kmem_cache_zalloc(utrace_cachep, GFP_KERNEL);
++ if (unlikely(!utrace))
++ return false;
++ spin_lock_init(&utrace->lock);
++ INIT_LIST_HEAD(&utrace->attached);
++ INIT_LIST_HEAD(&utrace->attaching);
++ utrace->resume = UTRACE_RESUME;
++ task_lock(task);
++ if (likely(!task->utrace)) {
++ /*
++ * This barrier makes sure the initialization of the struct
++ * precedes the installation of the pointer. This pairs
++ * with smp_read_barrier_depends() in task_utrace_struct().
++ */
++ smp_wmb();
++ task->utrace = utrace;
++ }
++ task_unlock(task);
++
++ if (unlikely(task->utrace != utrace))
++ kmem_cache_free(utrace_cachep, utrace);
++ return true;
++}
++
++/*
++ * This is called via tracehook_free_task() from free_task()
++ * when @task is being deallocated.
++ */
++void utrace_free_task(struct task_struct *task)
++{
++ kmem_cache_free(utrace_cachep, task->utrace);
++}
++
++/*
++ * This is calledwhen the task is safely quiescent, i.e. it won't consult
++ * utrace->attached without the lock. Move any engines attached
++ * asynchronously from @utrace->attaching onto the @utrace->attached list.
++ */
++static void splice_attaching(struct utrace *utrace)
++{
++ lockdep_assert_held(&utrace->lock);
++ list_splice_tail_init(&utrace->attaching, &utrace->attached);
++ utrace->pending_attach = 0;
++}
++
++/*
++ * This is the exported function used by the utrace_engine_put() inline.
++ */
++void __utrace_engine_release(struct kref *kref)
++{
++ struct utrace_engine *engine = container_of(kref, struct utrace_engine,
++ kref);
++ BUG_ON(!list_empty(&engine->entry));
++ if (engine->release)
++ (*engine->release)(engine->data);
++ kmem_cache_free(utrace_engine_cachep, engine);
++}
++EXPORT_SYMBOL_GPL(__utrace_engine_release);
++
++static bool engine_matches(struct utrace_engine *engine, int flags,
++ const struct utrace_engine_ops *ops, void *data)
++{
++ if ((flags & UTRACE_ATTACH_MATCH_OPS) && engine->ops != ops)
++ return false;
++ if ((flags & UTRACE_ATTACH_MATCH_DATA) && engine->data != data)
++ return false;
++ return engine->ops && engine->ops != &utrace_detached_ops;
++}
++
++static struct utrace_engine *find_matching_engine(
++ struct utrace *utrace, int flags,
++ const struct utrace_engine_ops *ops, void *data)
++{
++ struct utrace_engine *engine;
++ list_for_each_entry(engine, &utrace->attached, entry)
++ if (engine_matches(engine, flags, ops, data))
++ return engine;
++ list_for_each_entry(engine, &utrace->attaching, entry)
++ if (engine_matches(engine, flags, ops, data))
++ return engine;
++ return NULL;
++}
++
++/*
++ * Enqueue @engine, or maybe don't if UTRACE_ATTACH_EXCLUSIVE.
++ */
++static int utrace_add_engine(struct task_struct *target,
++ struct utrace *utrace,
++ struct utrace_engine *engine,
++ int flags,
++ const struct utrace_engine_ops *ops,
++ void *data)
++{
++ int ret;
++
++ spin_lock(&utrace->lock);
++
++ ret = -EEXIST;
++ if ((flags & UTRACE_ATTACH_EXCLUSIVE) &&
++ unlikely(find_matching_engine(utrace, flags, ops, data)))
++ goto unlock;
++
++ /*
++ * In case we had no engines before, make sure that
++ * utrace_flags is not zero. Since we did unlock+lock
++ * at least once after utrace_task_alloc() installed
++ * ->utrace, we have the necessary barrier which pairs
++ * with rmb() in task_utrace_struct().
++ */
++ ret = -ESRCH;
++ if (!target->utrace_flags) {
++ target->utrace_flags = UTRACE_EVENT(REAP);
++ /*
++ * If we race with tracehook_prepare_release_task()
++ * make sure that either it sees utrace_flags != 0
++ * or we see exit_state == EXIT_DEAD.
++ */
++ smp_mb();
++ if (unlikely(target->exit_state == EXIT_DEAD)) {
++ target->utrace_flags = 0;
++ goto unlock;
++ }
++ }
++
++ /*
++ * Put the new engine on the pending ->attaching list.
++ * Make sure it gets onto the ->attached list by the next
++ * time it's examined. Setting ->pending_attach ensures
++ * that start_report() takes the lock and splices the lists
++ * before the next new reporting pass.
++ *
++ * When target == current, it would be safe just to call
++ * splice_attaching() right here. But if we're inside a
++ * callback, that would mean the new engine also gets
++ * notified about the event that precipitated its own
++ * creation. This is not what the user wants.
++ */
++ list_add_tail(&engine->entry, &utrace->attaching);
++ utrace->pending_attach = 1;
++ utrace_engine_get(engine);
++ ret = 0;
++unlock:
++ spin_unlock(&utrace->lock);
++
++ return ret;
++}
++
++/**
++ * utrace_attach_task - attach new engine, or look up an attached engine
++ * @target: thread to attach to
++ * @flags: flag bits combined with OR, see below
++ * @ops: callback table for new engine
++ * @data: engine private data pointer
++ *
++ * The caller must ensure that the @target thread does not get freed,
++ * i.e. hold a ref or be its parent. It is always safe to call this
++ * on @current, or on the @child pointer in a @report_clone callback.
++ * For most other cases, it's easier to use utrace_attach_pid() instead.
++ *
++ * UTRACE_ATTACH_CREATE:
++ * Create a new engine. If %UTRACE_ATTACH_CREATE is not specified, you
++ * only look up an existing engine already attached to the thread.
++ *
++ * UTRACE_ATTACH_EXCLUSIVE:
++ * Attempting to attach a second (matching) engine fails with -%EEXIST.
++ *
++ * UTRACE_ATTACH_MATCH_OPS: Only consider engines matching @ops.
++ * UTRACE_ATTACH_MATCH_DATA: Only consider engines matching @data.
++ *
++ * Calls with neither %UTRACE_ATTACH_MATCH_OPS nor %UTRACE_ATTACH_MATCH_DATA
++ * match the first among any engines attached to @target. That means that
++ * %UTRACE_ATTACH_EXCLUSIVE in such a call fails with -%EEXIST if there
++ * are any engines on @target at all.
++ */
++struct utrace_engine *utrace_attach_task(
++ struct task_struct *target, int flags,
++ const struct utrace_engine_ops *ops, void *data)
++{
++ struct utrace *utrace = task_utrace_struct(target);
++ struct utrace_engine *engine;
++ int ret;
++
++ if (!(flags & UTRACE_ATTACH_CREATE)) {
++ if (unlikely(!utrace))
++ return ERR_PTR(-ENOENT);
++ spin_lock(&utrace->lock);
++ engine = find_matching_engine(utrace, flags, ops, data);
++ if (engine)
++ utrace_engine_get(engine);
++ spin_unlock(&utrace->lock);
++ return engine ?: ERR_PTR(-ENOENT);
++ }
++
++ if (unlikely(!ops) || unlikely(ops == &utrace_detached_ops))
++ return ERR_PTR(-EINVAL);
++
++ if (unlikely(target->flags & PF_KTHREAD))
++ /*
++ * Silly kernel, utrace is for users!
++ */
++ return ERR_PTR(-EPERM);
++
++ if (!utrace) {
++ if (unlikely(!utrace_task_alloc(target)))
++ return ERR_PTR(-ENOMEM);
++ utrace = task_utrace_struct(target);
++ }
++
++ engine = kmem_cache_alloc(utrace_engine_cachep, GFP_KERNEL);
++ if (unlikely(!engine))
++ return ERR_PTR(-ENOMEM);
++
++ /*
++ * Initialize the new engine structure. It starts out with one ref
++ * to return. utrace_add_engine() adds another for being attached.
++ */
++ kref_init(&engine->kref);
++ engine->flags = 0;
++ engine->ops = ops;
++ engine->data = data;
++ engine->release = ops->release;
++
++ ret = utrace_add_engine(target, utrace, engine, flags, ops, data);
++
++ if (unlikely(ret)) {
++ kmem_cache_free(utrace_engine_cachep, engine);
++ engine = ERR_PTR(ret);
++ }
++
++
++ return engine;
++}
++EXPORT_SYMBOL_GPL(utrace_attach_task);
++
++/**
++ * utrace_attach_pid - attach new engine, or look up an attached engine
++ * @pid: &struct pid pointer representing thread to attach to
++ * @flags: flag bits combined with OR, see utrace_attach_task()
++ * @ops: callback table for new engine
++ * @data: engine private data pointer
++ *
++ * This is the same as utrace_attach_task(), but takes a &struct pid
++ * pointer rather than a &struct task_struct pointer. The caller must
++ * hold a ref on @pid, but does not need to worry about the task
++ * staying valid. If it's been reaped so that @pid points nowhere,
++ * then this call returns -%ESRCH.
++ */
++struct utrace_engine *utrace_attach_pid(
++ struct pid *pid, int flags,
++ const struct utrace_engine_ops *ops, void *data)
++{
++ struct utrace_engine *engine = ERR_PTR(-ESRCH);
++ struct task_struct *task = get_pid_task(pid, PIDTYPE_PID);
++ if (task) {
++ engine = utrace_attach_task(task, flags, ops, data);
++ put_task_struct(task);
++ }
++ return engine;
++}
++EXPORT_SYMBOL_GPL(utrace_attach_pid);
++
++/*
++ * When an engine is detached, the target thread may still see it and
++ * make callbacks until it quiesces. We install a special ops vector
++ * with these two callbacks. When the target thread quiesces, it can
++ * safely free the engine itself. For any event we will always get
++ * the report_quiesce() callback first, so we only need this one
++ * pointer to be set. The only exception is report_reap(), so we
++ * supply that callback too.
++ */
++static u32 utrace_detached_quiesce(u32 action, struct utrace_engine *engine,
++ unsigned long event)
++{
++ return UTRACE_DETACH;
++}
++
++static void utrace_detached_reap(struct utrace_engine *engine,
++ struct task_struct *task)
++{
++}
++
++static const struct utrace_engine_ops utrace_detached_ops = {
++ .report_quiesce = &utrace_detached_quiesce,
++ .report_reap = &utrace_detached_reap
++};
++
++/*
++ * The caller has to hold a ref on the engine. If the attached flag is
++ * true (all but utrace_barrier() calls), the engine is supposed to be
++ * attached. If the attached flag is false (utrace_barrier() only),
++ * then return -ERESTARTSYS for an engine marked for detach but not yet
++ * fully detached. The task pointer can be invalid if the engine is
++ * detached.
++ *
++ * Get the utrace lock for the target task.
++ * Returns the struct if locked, or ERR_PTR(-errno).
++ *
++ * This has to be robust against races with:
++ * utrace_control(target, UTRACE_DETACH) calls
++ * UTRACE_DETACH after reports
++ * utrace_report_death
++ * utrace_release_task
++ */
++static struct utrace *get_utrace_lock(struct task_struct *target,
++ struct utrace_engine *engine,
++ bool attached)
++ __acquires(utrace->lock)
++{
++ struct utrace *utrace;
++
++ rcu_read_lock();
++
++ /*
++ * If this engine was already detached, bail out before we look at
++ * the task_struct pointer at all. If it's detached after this
++ * check, then RCU is still keeping this task_struct pointer valid.
++ *
++ * The ops pointer is NULL when the engine is fully detached.
++ * It's &utrace_detached_ops when it's marked detached but still
++ * on the list. In the latter case, utrace_barrier() still works,
++ * since the target might be in the middle of an old callback.
++ */
++ if (unlikely(!engine->ops)) {
++ rcu_read_unlock();
++ return ERR_PTR(-ESRCH);
++ }
++
++ if (unlikely(engine->ops == &utrace_detached_ops)) {
++ rcu_read_unlock();
++ return attached ? ERR_PTR(-ESRCH) : ERR_PTR(-ERESTARTSYS);
++ }
++
++ utrace = task_utrace_struct(target);
++ spin_lock(&utrace->lock);
++ if (unlikely(utrace->reap) || unlikely(!engine->ops) ||
++ unlikely(engine->ops == &utrace_detached_ops)) {
++ /*
++ * By the time we got the utrace lock,
++ * it had been reaped or detached already.
++ */
++ spin_unlock(&utrace->lock);
++ utrace = ERR_PTR(-ESRCH);
++ if (!attached && engine->ops == &utrace_detached_ops)
++ utrace = ERR_PTR(-ERESTARTSYS);
++ }
++ rcu_read_unlock();
++
++ return utrace;
++}
++
++/*
++ * Now that we don't hold any locks, run through any
++ * detached engines and free their references. Each
++ * engine had one implicit ref while it was attached.
++ */
++static void put_detached_list(struct list_head *list)
++{
++ struct utrace_engine *engine, *next;
++ list_for_each_entry_safe(engine, next, list, entry) {
++ list_del_init(&engine->entry);
++ utrace_engine_put(engine);
++ }
++}
++
++/*
++ * We use an extra bit in utrace_engine.flags past the event bits,
++ * to record whether the engine is keeping the target thread stopped.
++ *
++ * This bit is set in task_struct.utrace_flags whenever it is set in any
++ * engine's flags. Only utrace_reset() resets it in utrace_flags.
++ */
++#define ENGINE_STOP (1UL << _UTRACE_NEVENTS)
++
++static void mark_engine_wants_stop(struct task_struct *task,
++ struct utrace_engine *engine)
++{
++ engine->flags |= ENGINE_STOP;
++ task->utrace_flags |= ENGINE_STOP;
++}
++
++static void clear_engine_wants_stop(struct utrace_engine *engine)
++{
++ engine->flags &= ~ENGINE_STOP;
++}
++
++static bool engine_wants_stop(struct utrace_engine *engine)
++{
++ return (engine->flags & ENGINE_STOP) != 0;
++}
++
++/**
++ * utrace_set_events - choose which event reports a tracing engine gets
++ * @target: thread to affect
++ * @engine: attached engine to affect
++ * @events: new event mask
++ *
++ * This changes the set of events for which @engine wants callbacks made.
++ *
++ * This fails with -%EALREADY and does nothing if you try to clear
++ * %UTRACE_EVENT(%DEATH) when the @report_death callback may already have
++ * begun, or if you try to newly set %UTRACE_EVENT(%DEATH) or
++ * %UTRACE_EVENT(%QUIESCE) when @target is already dead or dying.
++ *
++ * This fails with -%ESRCH if you try to clear %UTRACE_EVENT(%REAP) when
++ * the @report_reap callback may already have begun, or when @target has
++ * already been detached, including forcible detach on reaping.
++ *
++ * If @target was stopped before the call, then after a successful call,
++ * no event callbacks not requested in @events will be made; if
++ * %UTRACE_EVENT(%QUIESCE) is included in @events, then a
++ * @report_quiesce callback will be made when @target resumes.
++ *
++ * If @target was not stopped and @events excludes some bits that were
++ * set before, this can return -%EINPROGRESS to indicate that @target
++ * may have been making some callback to @engine. When this returns
++ * zero, you can be sure that no event callbacks you've disabled in
++ * @events can be made. If @events only sets new bits that were not set
++ * before on @engine, then -%EINPROGRESS will never be returned.
++ *
++ * To synchronize after an -%EINPROGRESS return, see utrace_barrier().
++ *
++ * When @target is @current, -%EINPROGRESS is not returned. But note
++ * that a newly-created engine will not receive any callbacks related to
++ * an event notification already in progress. This call enables @events
++ * callbacks to be made as soon as @engine becomes eligible for any
++ * callbacks, see utrace_attach_task().
++ *
++ * These rules provide for coherent synchronization based on %UTRACE_STOP,
++ * even when %SIGKILL is breaking its normal simple rules.
++ */
++int utrace_set_events(struct task_struct *target,
++ struct utrace_engine *engine,
++ unsigned long events)
++{
++ struct utrace *utrace;
++ unsigned long old_flags, old_utrace_flags;
++ int ret = -EALREADY;
++
++ /*
++ * We just ignore the internal bit, so callers can use
++ * engine->flags to seed bitwise ops for our argument.
++ */
++ events &= ~ENGINE_STOP;
++
++ utrace = get_utrace_lock(target, engine, true);
++ if (unlikely(IS_ERR(utrace)))
++ return PTR_ERR(utrace);
++
++ old_utrace_flags = target->utrace_flags;
++ old_flags = engine->flags & ~ENGINE_STOP;
++
++ /*
++ * If utrace_report_death() is already progress now,
++ * it's too late to clear the death event bits.
++ */
++ if (((old_flags & ~events) & _UTRACE_DEATH_EVENTS) && utrace->death)
++ goto unlock;
++
++ /*
++ * When setting these flags, it's essential that we really
++ * synchronize with exit_notify(). They cannot be set after
++ * exit_notify() takes the tasklist_lock. By holding the read
++ * lock here while setting the flags, we ensure that the calls
++ * to tracehook_notify_death() and tracehook_report_death() will
++ * see the new flags. This ensures that utrace_release_task()
++ * knows positively that utrace_report_death() will be called or
++ * that it won't.
++ */
++ if ((events & ~old_flags) & _UTRACE_DEATH_EVENTS) {
++ read_lock(&tasklist_lock);
++ if (unlikely(target->exit_state)) {
++ read_unlock(&tasklist_lock);
++ goto unlock;
++ }
++ target->utrace_flags |= events;
++ read_unlock(&tasklist_lock);
++ }
++
++ engine->flags = events | (engine->flags & ENGINE_STOP);
++ target->utrace_flags |= events;
++
++ if ((events & UTRACE_EVENT_SYSCALL) &&
++ !(old_utrace_flags & UTRACE_EVENT_SYSCALL))
++ set_tsk_thread_flag(target, TIF_SYSCALL_TRACE);
++
++ ret = 0;
++ if ((old_flags & ~events) && target != current &&
++ !task_is_stopped_or_traced(target) && !target->exit_state) {
++ /*
++ * This barrier ensures that our engine->flags changes
++ * have hit before we examine utrace->reporting,
++ * pairing with the barrier in start_callback(). If
++ * @target has not yet hit finish_callback() to clear
++ * utrace->reporting, we might be in the middle of a
++ * callback to @engine.
++ */
++ smp_mb();
++ if (utrace->reporting == engine)
++ ret = -EINPROGRESS;
++ }
++unlock:
++ spin_unlock(&utrace->lock);
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(utrace_set_events);
++
++/*
++ * Asynchronously mark an engine as being detached.
++ *
++ * This must work while the target thread races with us doing
++ * start_callback(), defined below. It uses smp_rmb() between checking
++ * @engine->flags and using @engine->ops. Here we change @engine->ops
++ * first, then use smp_wmb() before changing @engine->flags. This ensures
++ * it can check the old flags before using the old ops, or check the old
++ * flags before using the new ops, or check the new flags before using the
++ * new ops, but can never check the new flags before using the old ops.
++ * Hence, utrace_detached_ops might be used with any old flags in place.
++ * It has report_quiesce() and report_reap() callbacks to handle all cases.
++ */
++static void mark_engine_detached(struct utrace_engine *engine)
++{
++ engine->ops = &utrace_detached_ops;
++ smp_wmb();
++ engine->flags = UTRACE_EVENT(QUIESCE);
++}
++
++/*
++ * Get @target to stop and return true if it is already stopped now.
++ * If we return false, it will make some event callback soonish.
++ * Called with @utrace locked.
++ */
++static bool utrace_do_stop(struct task_struct *target, struct utrace *utrace)
++{
++ if (task_is_stopped(target)) {
++ /*
++ * Stopped is considered quiescent; when it wakes up, it will
++ * go through utrace_finish_stop() before doing anything else.
++ */
++ spin_lock_irq(&target->sighand->siglock);
++ if (likely(task_is_stopped(target)))
++ __set_task_state(target, TASK_TRACED);
++ spin_unlock_irq(&target->sighand->siglock);
++ } else if (utrace->resume > UTRACE_REPORT) {
++ utrace->resume = UTRACE_REPORT;
++ set_notify_resume(target);
++ }
++
++ return task_is_traced(target);
++}
++
++/*
++ * If the target is not dead it should not be in tracing
++ * stop any more. Wake it unless it's in job control stop.
++ */
++static void utrace_wakeup(struct task_struct *target, struct utrace *utrace)
++{
++ lockdep_assert_held(&utrace->lock);
++ spin_lock_irq(&target->sighand->siglock);
++ if (target->signal->flags & SIGNAL_STOP_STOPPED ||
++ target->signal->group_stop_count)
++ target->state = TASK_STOPPED;
++ else
++ wake_up_state(target, __TASK_TRACED);
++ spin_unlock_irq(&target->sighand->siglock);
++}
++
++/*
++ * This is called when there might be some detached engines on the list or
++ * some stale bits in @task->utrace_flags. Clean them up and recompute the
++ * flags. Returns true if we're now fully detached.
++ *
++ * Called with @utrace->lock held, returns with it released.
++ * After this returns, @utrace might be freed if everything detached.
++ */
++static bool utrace_reset(struct task_struct *task, struct utrace *utrace)
++ __releases(utrace->lock)
++{
++ struct utrace_engine *engine, *next;
++ unsigned long flags = 0;
++ LIST_HEAD(detached);
++
++ splice_attaching(utrace);
++
++ /*
++ * Update the set of events of interest from the union
++ * of the interests of the remaining tracing engines.
++ * For any engine marked detached, remove it from the list.
++ * We'll collect them on the detached list.
++ */
++ list_for_each_entry_safe(engine, next, &utrace->attached, entry) {
++ if (engine->ops == &utrace_detached_ops) {
++ engine->ops = NULL;
++ list_move(&engine->entry, &detached);
++ } else {
++ flags |= engine->flags | UTRACE_EVENT(REAP);
++ }
++ }
++
++ if (task->exit_state) {
++ /*
++ * Once it's already dead, we never install any flags
++ * except REAP. When ->exit_state is set and events
++ * like DEATH are not set, then they never can be set.
++ * This ensures that utrace_release_task() knows
++ * positively that utrace_report_death() can never run.
++ */
++ BUG_ON(utrace->death);
++ flags &= UTRACE_EVENT(REAP);
++ } else if (!(flags & UTRACE_EVENT_SYSCALL) &&
++ test_tsk_thread_flag(task, TIF_SYSCALL_TRACE)) {
++ clear_tsk_thread_flag(task, TIF_SYSCALL_TRACE);
++ }
++
++ if (!flags) {
++ /*
++ * No more engines, cleared out the utrace.
++ */
++ utrace->resume = UTRACE_RESUME;
++ utrace->signal_handler = 0;
++ }
++
++ /*
++ * If no more engines want it stopped, wake it up.
++ */
++ if (task_is_traced(task) && !(flags & ENGINE_STOP)) {
++ /*
++ * It just resumes, so make sure single-step
++ * is not left set.
++ */
++ if (utrace->resume == UTRACE_RESUME)
++ user_disable_single_step(task);
++ utrace_wakeup(task, utrace);
++ }
++
++ /*
++ * In theory spin_lock() doesn't imply rcu_read_lock().
++ * Once we clear ->utrace_flags this task_struct can go away
++ * because tracehook_prepare_release_task() path does not take
++ * utrace->lock when ->utrace_flags == 0.
++ */
++ rcu_read_lock();
++ task->utrace_flags = flags;
++ spin_unlock(&utrace->lock);
++ rcu_read_unlock();
++
++ put_detached_list(&detached);
++
++ return !flags;
++}
++
++void utrace_finish_stop(void)
++{
++ /*
++ * If we were task_is_traced() and then SIGKILL'ed, make
++ * sure we do nothing until the tracer drops utrace->lock.
++ */
++ if (unlikely(__fatal_signal_pending(current))) {
++ struct utrace *utrace = task_utrace_struct(current);
++ spin_unlock_wait(&utrace->lock);
++ }
++}
++
++/*
++ * Perform %UTRACE_STOP, i.e. block in TASK_TRACED until woken up.
++ * @task == current, @utrace == current->utrace, which is not locked.
++ * Return true if we were woken up by SIGKILL even though some utrace
++ * engine may still want us to stay stopped.
++ */
++static void utrace_stop(struct task_struct *task, struct utrace *utrace,
++ enum utrace_resume_action action)
++{
++relock:
++ spin_lock(&utrace->lock);
++
++ if (action < utrace->resume) {
++ /*
++ * Ensure a reporting pass when we're resumed.
++ */
++ utrace->resume = action;
++ if (action == UTRACE_INTERRUPT)
++ set_thread_flag(TIF_SIGPENDING);
++ else
++ set_thread_flag(TIF_NOTIFY_RESUME);
++ }
++
++ /*
++ * If the ENGINE_STOP bit is clear in utrace_flags, that means
++ * utrace_reset() ran after we processed some UTRACE_STOP return
++ * values from callbacks to get here. If all engines have detached
++ * or resumed us, we don't stop. This check doesn't require
++ * siglock, but it should follow the interrupt/report bookkeeping
++ * steps (this can matter for UTRACE_RESUME but not UTRACE_DETACH).
++ */
++ if (unlikely(!(task->utrace_flags & ENGINE_STOP))) {
++ utrace_reset(task, utrace);
++ if (task->utrace_flags & ENGINE_STOP)
++ goto relock;
++ return;
++ }
++
++ /*
++ * The siglock protects us against signals. As well as SIGKILL
++ * waking us up, we must synchronize with the signal bookkeeping
++ * for stop signals and SIGCONT.
++ */
++ spin_lock_irq(&task->sighand->siglock);
++
++ if (unlikely(__fatal_signal_pending(task))) {
++ spin_unlock_irq(&task->sighand->siglock);
++ spin_unlock(&utrace->lock);
++ return;
++ }
++
++ __set_current_state(TASK_TRACED);
++
++ /*
++ * If there is a group stop in progress,
++ * we must participate in the bookkeeping.
++ */
++ if (unlikely(task->signal->group_stop_count) &&
++ !--task->signal->group_stop_count)
++ task->signal->flags = SIGNAL_STOP_STOPPED;
++
++ spin_unlock_irq(&task->sighand->siglock);
++ spin_unlock(&utrace->lock);
++
++ schedule();
++
++ utrace_finish_stop();
++
++ /*
++ * While in TASK_TRACED, we were considered "frozen enough".
++ * Now that we woke up, it's crucial if we're supposed to be
++ * frozen that we freeze now before running anything substantial.
++ */
++ try_to_freeze();
++
++ /*
++ * While we were in TASK_TRACED, complete_signal() considered
++ * us "uninterested" in signal wakeups. Now make sure our
++ * TIF_SIGPENDING state is correct for normal running.
++ */
++ spin_lock_irq(&task->sighand->siglock);
++ recalc_sigpending();
++ spin_unlock_irq(&task->sighand->siglock);
++}
++
++/*
++ * Called by release_task() with @reap set to true.
++ * Called by utrace_report_death() with @reap set to false.
++ * On reap, make report_reap callbacks and clean out @utrace
++ * unless still making callbacks. On death, update bookkeeping
++ * and handle the reap work if release_task() came in first.
++ */
++void utrace_maybe_reap(struct task_struct *target, struct utrace *utrace,
++ bool reap)
++{
++ struct utrace_engine *engine, *next;
++ struct list_head attached;
++
++ spin_lock(&utrace->lock);
++
++ if (reap) {
++ /*
++ * If the target will do some final callbacks but hasn't
++ * finished them yet, we know because it clears these event
++ * bits after it's done. Instead of cleaning up here and
++ * requiring utrace_report_death() to cope with it, we
++ * delay the REAP report and the teardown until after the
++ * target finishes its death reports.
++ */
++ utrace->reap = 1;
++
++ if (target->utrace_flags & _UTRACE_DEATH_EVENTS) {
++ spin_unlock(&utrace->lock);
++ return;
++ }
++ } else {
++ /*
++ * After we unlock with this flag clear, any competing
++ * utrace_control/utrace_set_events calls know that we've
++ * finished our callbacks and any detach bookkeeping.
++ */
++ utrace->death = 0;
++
++ if (!utrace->reap) {
++ /*
++ * We're just dead, not reaped yet. This will
++ * reset @target->utrace_flags so the later call
++ * with @reap set won't hit the check above.
++ */
++ utrace_reset(target, utrace);
++ return;
++ }
++ }
++
++ /*
++ * utrace_add_engine() checks ->utrace_flags != 0. Since
++ * @utrace->reap is set, nobody can set or clear UTRACE_EVENT(REAP)
++ * in @engine->flags or change @engine->ops and nobody can change
++ * @utrace->attached after we drop the lock.
++ */
++ target->utrace_flags = 0;
++
++ /*
++ * We clear out @utrace->attached before we drop the lock so
++ * that find_matching_engine() can't come across any old engine
++ * while we are busy tearing it down.
++ */
++ list_replace_init(&utrace->attached, &attached);
++ list_splice_tail_init(&utrace->attaching, &attached);
++
++ spin_unlock(&utrace->lock);
++
++ list_for_each_entry_safe(engine, next, &attached, entry) {
++ if (engine->flags & UTRACE_EVENT(REAP))
++ engine->ops->report_reap(engine, target);
++
++ engine->ops = NULL;
++ engine->flags = 0;
++ list_del_init(&engine->entry);
++
++ utrace_engine_put(engine);
++ }
++}
++
++/*
++ * You can't do anything to a dead task but detach it.
++ * If release_task() has been called, you can't do that.
++ *
++ * On the exit path, DEATH and QUIESCE event bits are set only
++ * before utrace_report_death() has taken the lock. At that point,
++ * the death report will come soon, so disallow detach until it's
++ * done. This prevents us from racing with it detaching itself.
++ *
++ * Called only when @target->exit_state is nonzero.
++ */
++static inline int utrace_control_dead(struct task_struct *target,
++ struct utrace *utrace,
++ enum utrace_resume_action action)
++{
++ lockdep_assert_held(&utrace->lock);
++
++ if (action != UTRACE_DETACH || unlikely(utrace->reap))
++ return -ESRCH;
++
++ if (unlikely(utrace->death))
++ /*
++ * We have already started the death report. We can't
++ * prevent the report_death and report_reap callbacks,
++ * so tell the caller they will happen.
++ */
++ return -EALREADY;
++
++ return 0;
++}
++
++/**
++ * utrace_control - control a thread being traced by a tracing engine
++ * @target: thread to affect
++ * @engine: attached engine to affect
++ * @action: &enum utrace_resume_action for thread to do
++ *
++ * This is how a tracing engine asks a traced thread to do something.
++ * This call is controlled by the @action argument, which has the
++ * same meaning as the &enum utrace_resume_action value returned by
++ * event reporting callbacks.
++ *
++ * If @target is already dead (@target->exit_state nonzero),
++ * all actions except %UTRACE_DETACH fail with -%ESRCH.
++ *
++ * The following sections describe each option for the @action argument.
++ *
++ * UTRACE_DETACH:
++ *
++ * After this, the @engine data structure is no longer accessible,
++ * and the thread might be reaped. The thread will start running
++ * again if it was stopped and no longer has any attached engines
++ * that want it stopped.
++ *
++ * If the @report_reap callback may already have begun, this fails
++ * with -%ESRCH. If the @report_death callback may already have
++ * begun, this fails with -%EALREADY.
++ *
++ * If @target is not already stopped, then a callback to this engine
++ * might be in progress or about to start on another CPU. If so,
++ * then this returns -%EINPROGRESS; the detach happens as soon as
++ * the pending callback is finished. To synchronize after an
++ * -%EINPROGRESS return, see utrace_barrier().
++ *
++ * If @target is properly stopped before utrace_control() is called,
++ * then after successful return it's guaranteed that no more callbacks
++ * to the @engine->ops vector will be made.
++ *
++ * The only exception is %SIGKILL (and exec or group-exit by another
++ * thread in the group), which can cause asynchronous @report_death
++ * and/or @report_reap callbacks even when %UTRACE_STOP was used.
++ * (In that event, this fails with -%ESRCH or -%EALREADY, see above.)
++ *
++ * UTRACE_STOP:
++ *
++ * This asks that @target stop running. This returns 0 only if
++ * @target is already stopped, either for tracing or for job
++ * control. Then @target will remain stopped until another
++ * utrace_control() call is made on @engine; @target can be woken
++ * only by %SIGKILL (or equivalent, such as exec or termination by
++ * another thread in the same thread group).
++ *
++ * This returns -%EINPROGRESS if @target is not already stopped.
++ * Then the effect is like %UTRACE_REPORT. A @report_quiesce or
++ * @report_signal callback will be made soon. Your callback can
++ * then return %UTRACE_STOP to keep @target stopped.
++ *
++ * This does not interrupt system calls in progress, including ones
++ * that sleep for a long time. For that, use %UTRACE_INTERRUPT.
++ * To interrupt system calls and then keep @target stopped, your
++ * @report_signal callback can return %UTRACE_STOP.
++ *
++ * UTRACE_RESUME:
++ *
++ * Just let @target continue running normally, reversing the effect
++ * of a previous %UTRACE_STOP. If another engine is keeping @target
++ * stopped, then it remains stopped until all engines let it resume.
++ * If @target was not stopped, this has no effect.
++ *
++ * UTRACE_REPORT:
++ *
++ * This is like %UTRACE_RESUME, but also ensures that there will be
++ * a @report_quiesce or @report_signal callback made soon. If
++ * @target had been stopped, then there will be a callback before it
++ * resumes running normally. If another engine is keeping @target
++ * stopped, then there might be no callbacks until all engines let
++ * it resume.
++ *
++ * Since this is meaningless unless @report_quiesce callbacks will
++ * be made, it returns -%EINVAL if @engine lacks %UTRACE_EVENT(%QUIESCE).
++ *
++ * UTRACE_INTERRUPT:
++ *
++ * This is like %UTRACE_REPORT, but ensures that @target will make a
++ * @report_signal callback before it resumes or delivers signals.
++ * If @target was in a system call or about to enter one, work in
++ * progress will be interrupted as if by %SIGSTOP. If another
++ * engine is keeping @target stopped, then there might be no
++ * callbacks until all engines let it resume.
++ *
++ * This gives @engine an opportunity to introduce a forced signal
++ * disposition via its @report_signal callback.
++ *
++ * UTRACE_SINGLESTEP:
++ *
++ * It's invalid to use this unless arch_has_single_step() returned true.
++ * This is like %UTRACE_RESUME, but resumes for one user instruction only.
++ *
++ * Note that passing %UTRACE_SINGLESTEP or %UTRACE_BLOCKSTEP to
++ * utrace_control() or returning it from an event callback alone does
++ * not necessarily ensure that stepping will be enabled. If there are
++ * more callbacks made to any engine before returning to user mode,
++ * then the resume action is chosen only by the last set of callbacks.
++ * To be sure, enable %UTRACE_EVENT(%QUIESCE) and look for the
++ * @report_quiesce callback with a zero event mask, or the
++ * @report_signal callback with %UTRACE_SIGNAL_REPORT.
++ *
++ * Since this is not robust unless @report_quiesce callbacks will
++ * be made, it returns -%EINVAL if @engine lacks %UTRACE_EVENT(%QUIESCE).
++ *
++ * UTRACE_BLOCKSTEP:
++ *
++ * It's invalid to use this unless arch_has_block_step() returned true.
++ * This is like %UTRACE_SINGLESTEP, but resumes for one whole basic
++ * block of user instructions.
++ *
++ * Since this is not robust unless @report_quiesce callbacks will
++ * be made, it returns -%EINVAL if @engine lacks %UTRACE_EVENT(%QUIESCE).
++ *
++ * %UTRACE_BLOCKSTEP devolves to %UTRACE_SINGLESTEP when another
++ * tracing engine is using %UTRACE_SINGLESTEP at the same time.
++ */
++int utrace_control(struct task_struct *target,
++ struct utrace_engine *engine,
++ enum utrace_resume_action action)
++{
++ struct utrace *utrace;
++ bool reset;
++ int ret;
++
++ if (unlikely(action >= UTRACE_RESUME_MAX)) {
++ WARN(1, "invalid action argument to utrace_control()!");
++ return -EINVAL;
++ }
++
++ /*
++ * This is a sanity check for a programming error in the caller.
++ * Their request can only work properly in all cases by relying on
++ * a follow-up callback, but they didn't set one up! This check
++ * doesn't do locking, but it shouldn't matter. The caller has to
++ * be synchronously sure the callback is set up to be operating the
++ * interface properly.
++ */
++ if (action >= UTRACE_REPORT && action < UTRACE_RESUME &&
++ unlikely(!(engine->flags & UTRACE_EVENT(QUIESCE)))) {
++ WARN(1, "utrace_control() with no QUIESCE callback in place!");
++ return -EINVAL;
++ }
++
++ utrace = get_utrace_lock(target, engine, true);
++ if (unlikely(IS_ERR(utrace)))
++ return PTR_ERR(utrace);
++
++ reset = task_is_traced(target);
++ ret = 0;
++
++ /*
++ * ->exit_state can change under us, this doesn't matter.
++ * We do not care about ->exit_state in fact, but we do
++ * care about ->reap and ->death. If either flag is set,
++ * we must also see ->exit_state != 0.
++ */
++ if (unlikely(target->exit_state)) {
++ ret = utrace_control_dead(target, utrace, action);
++ if (ret) {
++ spin_unlock(&utrace->lock);
++ return ret;
++ }
++ reset = true;
++ }
++
++ switch (action) {
++ case UTRACE_STOP:
++ mark_engine_wants_stop(target, engine);
++ if (!reset && !utrace_do_stop(target, utrace))
++ ret = -EINPROGRESS;
++ reset = false;
++ break;
++
++ case UTRACE_DETACH:
++ if (engine_wants_stop(engine))
++ target->utrace_flags &= ~ENGINE_STOP;
++ mark_engine_detached(engine);
++ reset = reset || utrace_do_stop(target, utrace);
++ if (!reset) {
++ /*
++ * As in utrace_set_events(), this barrier ensures
++ * that our engine->flags changes have hit before we
++ * examine utrace->reporting, pairing with the barrier
++ * in start_callback(). If @target has not yet hit
++ * finish_callback() to clear utrace->reporting, we
++ * might be in the middle of a callback to @engine.
++ */
++ smp_mb();
++ if (utrace->reporting == engine)
++ ret = -EINPROGRESS;
++ }
++ break;
++
++ case UTRACE_RESUME:
++ clear_engine_wants_stop(engine);
++ break;
++
++ case UTRACE_BLOCKSTEP:
++ /*
++ * Resume from stopped, step one block.
++ * We fall through to treat it like UTRACE_SINGLESTEP.
++ */
++ if (unlikely(!arch_has_block_step())) {
++ WARN(1, "UTRACE_BLOCKSTEP when !arch_has_block_step()");
++ action = UTRACE_SINGLESTEP;
++ }
++
++ case UTRACE_SINGLESTEP:
++ /*
++ * Resume from stopped, step one instruction.
++ * We fall through to the UTRACE_REPORT case.
++ */
++ if (unlikely(!arch_has_single_step())) {
++ WARN(1,
++ "UTRACE_SINGLESTEP when !arch_has_single_step()");
++ reset = false;
++ ret = -EOPNOTSUPP;
++ break;
++ }
++
++ case UTRACE_REPORT:
++ /*
++ * Make the thread call tracehook_notify_resume() soon.
++ * But don't bother if it's already been interrupted.
++ * In that case, utrace_get_signal() will be reporting soon.
++ */
++ clear_engine_wants_stop(engine);
++ if (action < utrace->resume) {
++ utrace->resume = action;
++ set_notify_resume(target);
++ }
++ break;
++
++ case UTRACE_INTERRUPT:
++ /*
++ * Make the thread call tracehook_get_signal() soon.
++ */
++ clear_engine_wants_stop(engine);
++ if (utrace->resume == UTRACE_INTERRUPT)
++ break;
++ utrace->resume = UTRACE_INTERRUPT;
++
++ /*
++ * If it's not already stopped, interrupt it now. We need
++ * the siglock here in case it calls recalc_sigpending()
++ * and clears its own TIF_SIGPENDING. By taking the lock,
++ * we've serialized any later recalc_sigpending() after our
++ * setting of utrace->resume to force it on.
++ */
++ if (reset) {
++ /*
++ * This is really just to keep the invariant that
++ * TIF_SIGPENDING is set with UTRACE_INTERRUPT.
++ * When it's stopped, we know it's always going
++ * through utrace_get_signal() and will recalculate.
++ */
++ set_tsk_thread_flag(target, TIF_SIGPENDING);
++ } else {
++ struct sighand_struct *sighand;
++ unsigned long irqflags;
++ sighand = lock_task_sighand(target, &irqflags);
++ if (likely(sighand)) {
++ signal_wake_up(target, 0);
++ unlock_task_sighand(target, &irqflags);
++ }
++ }
++ break;
++
++ default:
++ BUG(); /* We checked it on entry. */
++ }
++
++ /*
++ * Let the thread resume running. If it's not stopped now,
++ * there is nothing more we need to do.
++ */
++ if (reset)
++ utrace_reset(target, utrace);
++ else
++ spin_unlock(&utrace->lock);
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(utrace_control);
++
++/**
++ * utrace_barrier - synchronize with simultaneous tracing callbacks
++ * @target: thread to affect
++ * @engine: engine to affect (can be detached)
++ *
++ * This blocks while @target might be in the midst of making a callback to
++ * @engine. It can be interrupted by signals and will return -%ERESTARTSYS.
++ * A return value of zero means no callback from @target to @engine was
++ * in progress. Any effect of its return value (such as %UTRACE_STOP) has
++ * already been applied to @engine.
++ *
++ * It's not necessary to keep the @target pointer alive for this call.
++ * It's only necessary to hold a ref on @engine. This will return
++ * safely even if @target has been reaped and has no task refs.
++ *
++ * A successful return from utrace_barrier() guarantees its ordering
++ * with respect to utrace_set_events() and utrace_control() calls. If
++ * @target was not properly stopped, event callbacks just disabled might
++ * still be in progress; utrace_barrier() waits until there is no chance
++ * an unwanted callback can be in progress.
++ */
++int utrace_barrier(struct task_struct *target, struct utrace_engine *engine)
++{
++ struct utrace *utrace;
++ int ret = -ERESTARTSYS;
++
++ if (unlikely(target == current))
++ return 0;
++
++ do {
++ utrace = get_utrace_lock(target, engine, false);
++ if (unlikely(IS_ERR(utrace))) {
++ ret = PTR_ERR(utrace);
++ if (ret != -ERESTARTSYS)
++ break;
++ } else {
++ /*
++ * All engine state changes are done while
++ * holding the lock, i.e. before we get here.
++ * Since we have the lock, we only need to
++ * worry about @target making a callback.
++ * When it has entered start_callback() but
++ * not yet gotten to finish_callback(), we
++ * will see utrace->reporting == @engine.
++ * When @target doesn't take the lock, it uses
++ * barriers to order setting utrace->reporting
++ * before it examines the engine state.
++ */
++ if (utrace->reporting != engine)
++ ret = 0;
++ spin_unlock(&utrace->lock);
++ if (!ret)
++ break;
++ }
++ schedule_timeout_interruptible(1);
++ } while (!signal_pending(current));
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(utrace_barrier);
++
++/*
++ * This is local state used for reporting loops, perhaps optimized away.
++ */
++struct utrace_report {
++ u32 result;
++ enum utrace_resume_action action;
++ enum utrace_resume_action resume_action;
++ bool detaches;
++ bool spurious;
++};
++
++#define INIT_REPORT(var) \
++ struct utrace_report var = { \
++ .action = UTRACE_RESUME, \
++ .resume_action = UTRACE_RESUME, \
++ .spurious = true \
++ }
++
++/*
++ * We are now making the report, so clear the flag saying we need one.
++ * When there is a new attach, ->pending_attach is set just so we will
++ * know to do splice_attaching() here before the callback loop.
++ */
++static enum utrace_resume_action start_report(struct utrace *utrace)
++{
++ enum utrace_resume_action resume = utrace->resume;
++ if (utrace->pending_attach ||
++ (resume > UTRACE_INTERRUPT && resume < UTRACE_RESUME)) {
++ spin_lock(&utrace->lock);
++ splice_attaching(utrace);
++ resume = utrace->resume;
++ if (resume > UTRACE_INTERRUPT)
++ utrace->resume = UTRACE_RESUME;
++ spin_unlock(&utrace->lock);
++ }
++ return resume;
++}
++
++static inline void finish_report_reset(struct task_struct *task,
++ struct utrace *utrace,
++ struct utrace_report *report)
++{
++ if (unlikely(report->spurious || report->detaches)) {
++ spin_lock(&utrace->lock);
++ if (utrace_reset(task, utrace))
++ report->action = UTRACE_RESUME;
++ }
++}
++
++/*
++ * Complete a normal reporting pass, pairing with a start_report() call.
++ * This handles any UTRACE_DETACH or UTRACE_REPORT or UTRACE_INTERRUPT
++ * returns from engine callbacks. If @will_not_stop is true and any
++ * engine's last callback used UTRACE_STOP, we do UTRACE_REPORT here to
++ * ensure we stop before user mode. If there were no callbacks made, it
++ * will recompute @task->utrace_flags to avoid another false-positive.
++ */
++static void finish_report(struct task_struct *task, struct utrace *utrace,
++ struct utrace_report *report, bool will_not_stop)
++{
++ enum utrace_resume_action resume = report->action;
++
++ if (resume == UTRACE_STOP)
++ resume = will_not_stop ? UTRACE_REPORT : UTRACE_RESUME;
++
++ if (resume < utrace->resume) {
++ spin_lock(&utrace->lock);
++ utrace->resume = resume;
++ if (resume == UTRACE_INTERRUPT)
++ set_tsk_thread_flag(task, TIF_SIGPENDING);
++ else
++ set_tsk_thread_flag(task, TIF_NOTIFY_RESUME);
++ spin_unlock(&utrace->lock);
++ }
++
++ finish_report_reset(task, utrace, report);
++}
++
++static void finish_callback_report(struct task_struct *task,
++ struct utrace *utrace,
++ struct utrace_report *report,
++ struct utrace_engine *engine,
++ enum utrace_resume_action action)
++{
++ if (action == UTRACE_DETACH) {
++ /*
++ * By holding the lock here, we make sure that
++ * utrace_barrier() (really get_utrace_lock()) sees the
++ * effect of this detach. Otherwise utrace_barrier() could
++ * return 0 after this callback had returned UTRACE_DETACH.
++ * This way, a 0 return is an unambiguous indicator that any
++ * callback returning UTRACE_DETACH has indeed caused detach.
++ */
++ spin_lock(&utrace->lock);
++ engine->ops = &utrace_detached_ops;
++ spin_unlock(&utrace->lock);
++ }
++
++ /*
++ * If utrace_control() was used, treat that like UTRACE_DETACH here.
++ */
++ if (engine->ops == &utrace_detached_ops) {
++ report->detaches = true;
++ return;
++ }
++
++ if (action < report->action)
++ report->action = action;
++
++ if (action != UTRACE_STOP) {
++ if (action < report->resume_action)
++ report->resume_action = action;
++
++ if (engine_wants_stop(engine)) {
++ spin_lock(&utrace->lock);
++ clear_engine_wants_stop(engine);
++ spin_unlock(&utrace->lock);
++ }
++
++ return;
++ }
++
++ if (!engine_wants_stop(engine)) {
++ spin_lock(&utrace->lock);
++ /*
++ * If utrace_control() came in and detached us
++ * before we got the lock, we must not stop now.
++ */
++ if (unlikely(engine->ops == &utrace_detached_ops))
++ report->detaches = true;
++ else
++ mark_engine_wants_stop(task, engine);
++ spin_unlock(&utrace->lock);
++ }
++}
++
++/*
++ * Apply the return value of one engine callback to @report.
++ * Returns true if @engine detached and should not get any more callbacks.
++ */
++static bool finish_callback(struct task_struct *task, struct utrace *utrace,
++ struct utrace_report *report,
++ struct utrace_engine *engine,
++ u32 ret)
++{
++ report->result = ret & ~UTRACE_RESUME_MASK;
++ finish_callback_report(task, utrace, report, engine,
++ utrace_resume_action(ret));
++
++ /*
++ * Now that we have applied the effect of the return value,
++ * clear this so that utrace_barrier() can stop waiting.
++ * A subsequent utrace_control() can stop or resume @engine
++ * and know this was ordered after its callback's action.
++ *
++ * We don't need any barriers here because utrace_barrier()
++ * takes utrace->lock. If we touched engine->flags above,
++ * the lock guaranteed this change was before utrace_barrier()
++ * examined utrace->reporting.
++ */
++ utrace->reporting = NULL;
++
++ /*
++ * We've just done an engine callback. These are allowed to sleep,
++ * though all well-behaved ones restrict that to blocking kalloc()
++ * or quickly-acquired mutex_lock() and the like. This is a good
++ * place to make sure tracing engines don't introduce too much
++ * latency under voluntary preemption.
++ */
++ might_sleep();
++
++ return engine->ops == &utrace_detached_ops;
++}
++
++/*
++ * Start the callbacks for @engine to consider @event (a bit mask).
++ * This makes the report_quiesce() callback first. If @engine wants
++ * a specific callback for @event, we return the ops vector to use.
++ * If not, we return NULL. The return value from the ops->callback
++ * function called should be passed to finish_callback().
++ */
++static const struct utrace_engine_ops *start_callback(
++ struct utrace *utrace, struct utrace_report *report,
++ struct utrace_engine *engine, struct task_struct *task,
++ unsigned long event)
++{
++ const struct utrace_engine_ops *ops;
++ unsigned long want;
++
++ /*
++ * This barrier ensures that we've set utrace->reporting before
++ * we examine engine->flags or engine->ops. utrace_barrier()
++ * relies on this ordering to indicate that the effect of any
++ * utrace_control() and utrace_set_events() calls is in place
++ * by the time utrace->reporting can be seen to be NULL.
++ */
++ utrace->reporting = engine;
++ smp_mb();
++
++ /*
++ * This pairs with the barrier in mark_engine_detached().
++ * It makes sure that we never see the old ops vector with
++ * the new flags, in case the original vector had no report_quiesce.
++ */
++ want = engine->flags;
++ smp_rmb();
++ ops = engine->ops;
++
++ if ((want & UTRACE_EVENT(QUIESCE)) || ops == &utrace_detached_ops) {
++ if (finish_callback(task, utrace, report, engine,
++ (*ops->report_quiesce)(report->action,
++ engine, event)))
++ return NULL;
++
++ if (!event) {
++ /* We only got here to report QUIESCE */
++ report->spurious = false;
++ return NULL;
++ }
++
++ /*
++ * finish_callback() reset utrace->reporting after the
++ * quiesce callback. Now we set it again (as above)
++ * before re-examining engine->flags, which could have
++ * been changed synchronously by ->report_quiesce or
++ * asynchronously by utrace_control() or utrace_set_events().
++ */
++ utrace->reporting = engine;
++ smp_mb();
++ want = engine->flags;
++ }
++
++ if (want & ENGINE_STOP)
++ report->action = UTRACE_STOP;
++
++ if (want & event) {
++ report->spurious = false;
++ return ops;
++ }
++
++ utrace->reporting = NULL;
++ return NULL;
++}
++
++/*
++ * Do a normal reporting pass for engines interested in @event.
++ * @callback is the name of the member in the ops vector, and remaining
++ * args are the extras it takes after the standard three args.
++ */
++#define REPORT_CALLBACKS(rev, task, utrace, report, event, callback, ...) \
++ do { \
++ struct utrace_engine *engine; \
++ const struct utrace_engine_ops *ops; \
++ list_for_each_entry##rev(engine, &utrace->attached, entry) { \
++ ops = start_callback(utrace, report, engine, task, \
++ event); \
++ if (!ops) \
++ continue; \
++ finish_callback(task, utrace, report, engine, \
++ (*ops->callback)(__VA_ARGS__)); \
++ } \
++ } while (0)
++#define REPORT(task, utrace, report, event, callback, ...) \
++ do { \
++ start_report(utrace); \
++ REPORT_CALLBACKS(, task, utrace, report, event, callback, \
++ (report)->action, engine, ## __VA_ARGS__); \
++ finish_report(task, utrace, report, true); \
++ } while (0)
++
++/*
++ * Called iff UTRACE_EVENT(EXEC) flag is set.
++ */
++void utrace_report_exec(struct linux_binfmt *fmt, struct linux_binprm *bprm,
++ struct pt_regs *regs)
++{
++ struct task_struct *task = current;
++ struct utrace *utrace = task_utrace_struct(task);
++ INIT_REPORT(report);
++
++ REPORT(task, utrace, &report, UTRACE_EVENT(EXEC),
++ report_exec, fmt, bprm, regs);
++}
++
++static u32 do_report_syscall_entry(struct pt_regs *regs,
++ struct task_struct *task,
++ struct utrace *utrace,
++ struct utrace_report *report,
++ u32 resume_report)
++{
++ start_report(utrace);
++ REPORT_CALLBACKS(_reverse, task, utrace, report,
++ UTRACE_EVENT(SYSCALL_ENTRY), report_syscall_entry,
++ resume_report | report->result | report->action,
++ engine, regs);
++ finish_report(task, utrace, report, false);
++
++ if (report->action != UTRACE_STOP)
++ return 0;
++
++ utrace_stop(task, utrace, report->resume_action);
++
++ if (fatal_signal_pending(task)) {
++ /*
++ * We are continuing despite UTRACE_STOP because of a
++ * SIGKILL. Don't let the system call actually proceed.
++ */
++ report->result = UTRACE_SYSCALL_ABORT;
++ } else if (utrace->resume <= UTRACE_REPORT) {
++ /*
++ * If we've been asked for another report after our stop,
++ * go back to report (and maybe stop) again before we run
++ * the system call. The second (and later) reports are
++ * marked with the UTRACE_SYSCALL_RESUMED flag so that
++ * engines know this is a second report at the same
++ * entry. This gives them the chance to examine the
++ * registers anew after they might have been changed
++ * while we were stopped.
++ */
++ report->detaches = false;
++ report->spurious = true;
++ report->action = report->resume_action = UTRACE_RESUME;
++ return UTRACE_SYSCALL_RESUMED;
++ }
++
++ return 0;
++}
++
++/*
++ * Called iff UTRACE_EVENT(SYSCALL_ENTRY) flag is set.
++ * Return true to prevent the system call.
++ */
++bool utrace_report_syscall_entry(struct pt_regs *regs)
++{
++ struct task_struct *task = current;
++ struct utrace *utrace = task_utrace_struct(task);
++ INIT_REPORT(report);
++ u32 resume_report = 0;
++
++ do {
++ resume_report = do_report_syscall_entry(regs, task, utrace,
++ &report, resume_report);
++ } while (resume_report);
++
++ return utrace_syscall_action(report.result) == UTRACE_SYSCALL_ABORT;
++}
++
++/*
++ * Called iff UTRACE_EVENT(SYSCALL_EXIT) flag is set.
++ */
++void utrace_report_syscall_exit(struct pt_regs *regs)
++{
++ struct task_struct *task = current;
++ struct utrace *utrace = task_utrace_struct(task);
++ INIT_REPORT(report);
++
++ REPORT(task, utrace, &report, UTRACE_EVENT(SYSCALL_EXIT),
++ report_syscall_exit, regs);
++}
++
++/*
++ * Called iff UTRACE_EVENT(CLONE) flag is set.
++ * This notification call blocks the wake_up_new_task call on the child.
++ * So we must not quiesce here. tracehook_report_clone_complete will do
++ * a quiescence check momentarily.
++ */
++void utrace_report_clone(unsigned long clone_flags, struct task_struct *child)
++{
++ struct task_struct *task = current;
++ struct utrace *utrace = task_utrace_struct(task);
++ INIT_REPORT(report);
++
++ /*
++ * We don't use the REPORT() macro here, because we need
++ * to clear utrace->cloning before finish_report().
++ * After finish_report(), utrace can be a stale pointer
++ * in cases when report.action is still UTRACE_RESUME.
++ */
++ start_report(utrace);
++ utrace->cloning = child;
++
++ REPORT_CALLBACKS(, task, utrace, &report,
++ UTRACE_EVENT(CLONE), report_clone,
++ report.action, engine, clone_flags, child);
++
++ utrace->cloning = NULL;
++ finish_report(task, utrace, &report, !(clone_flags & CLONE_VFORK));
++
++ /*
++ * For a vfork, we will go into an uninterruptible block waiting
++ * for the child. We need UTRACE_STOP to happen before this, not
++ * after. For CLONE_VFORK, utrace_finish_vfork() will be called.
++ */
++ if (report.action == UTRACE_STOP && (clone_flags & CLONE_VFORK)) {
++ spin_lock(&utrace->lock);
++ utrace->vfork_stop = 1;
++ spin_unlock(&utrace->lock);
++ }
++}
++
++/*
++ * We're called after utrace_report_clone() for a CLONE_VFORK.
++ * If UTRACE_STOP was left from the clone report, we stop here.
++ * After this, we'll enter the uninterruptible wait_for_completion()
++ * waiting for the child.
++ */
++void utrace_finish_vfork(struct task_struct *task)
++{
++ struct utrace *utrace = task_utrace_struct(task);
++
++ if (utrace->vfork_stop) {
++ spin_lock(&utrace->lock);
++ utrace->vfork_stop = 0;
++ spin_unlock(&utrace->lock);
++ utrace_stop(task, utrace, UTRACE_RESUME); /* XXX */
++ }
++}
++
++/*
++ * Called iff UTRACE_EVENT(JCTL) flag is set.
++ *
++ * Called with siglock held.
++ */
++void utrace_report_jctl(int notify, int what)
++{
++ struct task_struct *task = current;
++ struct utrace *utrace = task_utrace_struct(task);
++ INIT_REPORT(report);
++
++ spin_unlock_irq(&task->sighand->siglock);
++
++ REPORT(task, utrace, &report, UTRACE_EVENT(JCTL),
++ report_jctl, what, notify);
++
++ spin_lock_irq(&task->sighand->siglock);
++}
++
++/*
++ * Called iff UTRACE_EVENT(EXIT) flag is set.
++ */
++void utrace_report_exit(long *exit_code)
++{
++ struct task_struct *task = current;
++ struct utrace *utrace = task_utrace_struct(task);
++ INIT_REPORT(report);
++ long orig_code = *exit_code;
++
++ REPORT(task, utrace, &report, UTRACE_EVENT(EXIT),
++ report_exit, orig_code, exit_code);
++
++ if (report.action == UTRACE_STOP)
++ utrace_stop(task, utrace, report.resume_action);
++}
++
++/*
++ * Called iff UTRACE_EVENT(DEATH) or UTRACE_EVENT(QUIESCE) flag is set.
++ *
++ * It is always possible that we are racing with utrace_release_task here.
++ * For this reason, utrace_release_task checks for the event bits that get
++ * us here, and delays its cleanup for us to do.
++ */
++void utrace_report_death(struct task_struct *task, struct utrace *utrace,
++ bool group_dead, int signal)
++{
++ INIT_REPORT(report);
++
++ BUG_ON(!task->exit_state);
++
++ /*
++ * We are presently considered "quiescent"--which is accurate
++ * inasmuch as we won't run any more user instructions ever again.
++ * But for utrace_control and utrace_set_events to be robust, they
++ * must be sure whether or not we will run any more callbacks. If
++ * a call comes in before we do, taking the lock here synchronizes
++ * us so we don't run any callbacks just disabled. Calls that come
++ * in while we're running the callbacks will see the exit.death
++ * flag and know that we are not yet fully quiescent for purposes
++ * of detach bookkeeping.
++ */
++ spin_lock(&utrace->lock);
++ BUG_ON(utrace->death);
++ utrace->death = 1;
++ utrace->resume = UTRACE_RESUME;
++ splice_attaching(utrace);
++ spin_unlock(&utrace->lock);
++
++ REPORT_CALLBACKS(, task, utrace, &report, UTRACE_EVENT(DEATH),
++ report_death, engine, group_dead, signal);
++
++ utrace_maybe_reap(task, utrace, false);
++}
++
++/*
++ * Finish the last reporting pass before returning to user mode.
++ */
++static void finish_resume_report(struct task_struct *task,
++ struct utrace *utrace,
++ struct utrace_report *report)
++{
++ finish_report_reset(task, utrace, report);
++
++ switch (report->action) {
++ case UTRACE_STOP:
++ utrace_stop(task, utrace, report->resume_action);
++ break;
++
++ case UTRACE_INTERRUPT:
++ if (!signal_pending(task))
++ set_tsk_thread_flag(task, TIF_SIGPENDING);
++ break;
++
++ case UTRACE_BLOCKSTEP:
++ if (likely(arch_has_block_step())) {
++ user_enable_block_step(task);
++ break;
++ }
++
++ /*
++ * This means some callback is to blame for failing
++ * to check arch_has_block_step() itself. Warn and
++ * then fall through to treat it as SINGLESTEP.
++ */
++ WARN(1, "UTRACE_BLOCKSTEP when !arch_has_block_step()");
++
++ case UTRACE_SINGLESTEP:
++ if (likely(arch_has_single_step())) {
++ user_enable_single_step(task);
++ } else {
++ /*
++ * This means some callback is to blame for failing
++ * to check arch_has_single_step() itself. Spew
++ * about it so the loser will fix his module.
++ */
++ WARN(1,
++ "UTRACE_SINGLESTEP when !arch_has_single_step()");
++ }
++ break;
++
++ case UTRACE_REPORT:
++ case UTRACE_RESUME:
++ default:
++ user_disable_single_step(task);
++ break;
++ }
++}
++
++/*
++ * This is called when TIF_NOTIFY_RESUME had been set (and is now clear).
++ * We are close to user mode, and this is the place to report or stop.
++ * When we return, we're going to user mode or into the signals code.
++ */
++void utrace_resume(struct task_struct *task, struct pt_regs *regs)
++{
++ struct utrace *utrace = task_utrace_struct(task);
++ INIT_REPORT(report);
++ struct utrace_engine *engine;
++
++ /*
++ * Some machines get here with interrupts disabled. The same arch
++ * code path leads to calling into get_signal_to_deliver(), which
++ * implicitly reenables them by virtue of spin_unlock_irq.
++ */
++ local_irq_enable();
++
++ /*
++ * If this flag is still set it's because there was a signal
++ * handler setup done but no report_signal following it. Clear
++ * the flag before we get to user so it doesn't confuse us later.
++ */
++ if (unlikely(utrace->signal_handler)) {
++ spin_lock(&utrace->lock);
++ utrace->signal_handler = 0;
++ spin_unlock(&utrace->lock);
++ }
++
++ /*
++ * Update our bookkeeping even if there are no callbacks made here.
++ */
++ report.action = start_report(utrace);
++
++ switch (report.action) {
++ case UTRACE_RESUME:
++ /*
++ * Anything we might have done was already handled by
++ * utrace_get_signal(), or this is an entirely spurious
++ * call. (The arch might use TIF_NOTIFY_RESUME for other
++ * purposes as well as calling us.)
++ */
++ return;
++ case UTRACE_REPORT:
++ if (unlikely(!(task->utrace_flags & UTRACE_EVENT(QUIESCE))))
++ break;
++ /*
++ * Do a simple reporting pass, with no specific
++ * callback after report_quiesce.
++ */
++ report.action = UTRACE_RESUME;
++ list_for_each_entry(engine, &utrace->attached, entry)
++ start_callback(utrace, &report, engine, task, 0);
++ break;
++ default:
++ /*
++ * Even if this report was truly spurious, there is no need
++ * for utrace_reset() now. TIF_NOTIFY_RESUME was already
++ * cleared--it doesn't stay spuriously set.
++ */
++ report.spurious = false;
++ break;
++ }
++
++ /*
++ * Finish the report and either stop or get ready to resume.
++ * If utrace->resume was not UTRACE_REPORT, this applies its
++ * effect now (i.e. step or interrupt).
++ */
++ finish_resume_report(task, utrace, &report);
++}
++
++/*
++ * Return true if current has forced signal_pending().
++ *
++ * This is called only when current->utrace_flags is nonzero, so we know
++ * that current->utrace must be set. It's not inlined in tracehook.h
++ * just so that struct utrace can stay opaque outside this file.
++ */
++bool utrace_interrupt_pending(void)
++{
++ return task_utrace_struct(current)->resume == UTRACE_INTERRUPT;
++}
++
++/*
++ * Take the siglock and push @info back on our queue.
++ * Returns with @task->sighand->siglock held.
++ */
++static void push_back_signal(struct task_struct *task, siginfo_t *info)
++ __acquires(task->sighand->siglock)
++{
++ struct sigqueue *q;
++
++ if (unlikely(!info->si_signo)) { /* Oh, a wise guy! */
++ spin_lock_irq(&task->sighand->siglock);
++ return;
++ }
++
++ q = sigqueue_alloc();
++ if (likely(q)) {
++ q->flags = 0;
++ copy_siginfo(&q->info, info);
++ }
++
++ spin_lock_irq(&task->sighand->siglock);
++
++ sigaddset(&task->pending.signal, info->si_signo);
++ if (likely(q))
++ list_add(&q->list, &task->pending.list);
++
++ set_tsk_thread_flag(task, TIF_SIGPENDING);
++}
++
++/*
++ * This is the hook from the signals code, called with the siglock held.
++ * Here is the ideal place to stop. We also dequeue and intercept signals.
++ */
++int utrace_get_signal(struct task_struct *task, struct pt_regs *regs,
++ siginfo_t *info, struct k_sigaction *return_ka)
++ __releases(task->sighand->siglock)
++ __acquires(task->sighand->siglock)
++{
++ struct utrace *utrace;
++ struct k_sigaction *ka;
++ INIT_REPORT(report);
++ struct utrace_engine *engine;
++ const struct utrace_engine_ops *ops;
++ unsigned long event, want;
++ u32 ret;
++ int signr;
++
++ utrace = task_utrace_struct(task);
++ if (utrace->resume < UTRACE_RESUME ||
++ utrace->pending_attach || utrace->signal_handler) {
++ enum utrace_resume_action resume;
++
++ /*
++ * We've been asked for an explicit report before we
++ * even check for pending signals.
++ */
++
++ spin_unlock_irq(&task->sighand->siglock);
++
++ spin_lock(&utrace->lock);
++
++ splice_attaching(utrace);
++
++ report.result = utrace->signal_handler ?
++ UTRACE_SIGNAL_HANDLER : UTRACE_SIGNAL_REPORT;
++ utrace->signal_handler = 0;
++
++ resume = utrace->resume;
++ utrace->resume = UTRACE_RESUME;
++
++ spin_unlock(&utrace->lock);
++
++ /*
++ * Make sure signal_pending() only returns true
++ * if there are real signals pending.
++ */
++ if (signal_pending(task)) {
++ spin_lock_irq(&task->sighand->siglock);
++ recalc_sigpending();
++ spin_unlock_irq(&task->sighand->siglock);
++ }
++
++ if (resume > UTRACE_REPORT) {
++ /*
++ * We only got here to process utrace->resume.
++ * Despite no callbacks, this report is not spurious.
++ */
++ report.action = resume;
++ report.spurious = false;
++ finish_resume_report(task, utrace, &report);
++ return -1;
++ } else if (!(task->utrace_flags & UTRACE_EVENT(QUIESCE))) {
++ /*
++ * We only got here to clear utrace->signal_handler.
++ */
++ return -1;
++ }
++
++ /*
++ * Do a reporting pass for no signal, just for EVENT(QUIESCE).
++ * The engine callbacks can fill in *info and *return_ka.
++ * We'll pass NULL for the @orig_ka argument to indicate
++ * that there was no original signal.
++ */
++ event = 0;
++ ka = NULL;
++ memset(return_ka, 0, sizeof *return_ka);
++ } else if (!(task->utrace_flags & UTRACE_EVENT_SIGNAL_ALL) ||
++ unlikely(task->signal->group_stop_count)) {
++ /*
++ * If no engine is interested in intercepting signals or
++ * we must stop, let the caller just dequeue them normally
++ * or participate in group-stop.
++ */
++ return 0;
++ } else {
++ /*
++ * Steal the next signal so we can let tracing engines
++ * examine it. From the signal number and sigaction,
++ * determine what normal delivery would do. If no
++ * engine perturbs it, we'll do that by returning the
++ * signal number after setting *return_ka.
++ */
++ signr = dequeue_signal(task, &task->blocked, info);
++ if (signr == 0)
++ return signr;
++ BUG_ON(signr != info->si_signo);
++
++ ka = &task->sighand->action[signr - 1];
++ *return_ka = *ka;
++
++ /*
++ * We are never allowed to interfere with SIGKILL.
++ * Just punt after filling in *return_ka for our caller.
++ */
++ if (signr == SIGKILL)
++ return signr;
++
++ if (ka->sa.sa_handler == SIG_IGN) {
++ event = UTRACE_EVENT(SIGNAL_IGN);
++ report.result = UTRACE_SIGNAL_IGN;
++ } else if (ka->sa.sa_handler != SIG_DFL) {
++ event = UTRACE_EVENT(SIGNAL);
++ report.result = UTRACE_SIGNAL_DELIVER;
++ } else if (sig_kernel_coredump(signr)) {
++ event = UTRACE_EVENT(SIGNAL_CORE);
++ report.result = UTRACE_SIGNAL_CORE;
++ } else if (sig_kernel_ignore(signr)) {
++ event = UTRACE_EVENT(SIGNAL_IGN);
++ report.result = UTRACE_SIGNAL_IGN;
++ } else if (signr == SIGSTOP) {
++ event = UTRACE_EVENT(SIGNAL_STOP);
++ report.result = UTRACE_SIGNAL_STOP;
++ } else if (sig_kernel_stop(signr)) {
++ event = UTRACE_EVENT(SIGNAL_STOP);
++ report.result = UTRACE_SIGNAL_TSTP;
++ } else {
++ event = UTRACE_EVENT(SIGNAL_TERM);
++ report.result = UTRACE_SIGNAL_TERM;
++ }
++
++ /*
++ * Now that we know what event type this signal is, we
++ * can short-circuit if no engines care about those.
++ */
++ if ((task->utrace_flags & (event | UTRACE_EVENT(QUIESCE))) == 0)
++ return signr;
++
++ /*
++ * We have some interested engines, so tell them about
++ * the signal and let them change its disposition.
++ */
++ spin_unlock_irq(&task->sighand->siglock);
++ }
++
++ /*
++ * This reporting pass chooses what signal disposition we'll act on.
++ */
++ list_for_each_entry(engine, &utrace->attached, entry) {
++ /*
++ * See start_callback() comment about this barrier.
++ */
++ utrace->reporting = engine;
++ smp_mb();
++
++ /*
++ * This pairs with the barrier in mark_engine_detached(),
++ * see start_callback() comments.
++ */
++ want = engine->flags;
++ smp_rmb();
++ ops = engine->ops;
++
++ if ((want & (event | UTRACE_EVENT(QUIESCE))) == 0) {
++ utrace->reporting = NULL;
++ continue;
++ }
++
++ if (ops->report_signal)
++ ret = (*ops->report_signal)(
++ report.result | report.action, engine,
++ regs, info, ka, return_ka);
++ else
++ ret = (report.result | (*ops->report_quiesce)(
++ report.action, engine, event));
++
++ /*
++ * Avoid a tight loop reporting again and again if some
++ * engine is too stupid.
++ */
++ switch (utrace_resume_action(ret)) {
++ default:
++ break;
++ case UTRACE_INTERRUPT:
++ case UTRACE_REPORT:
++ ret = (ret & ~UTRACE_RESUME_MASK) | UTRACE_RESUME;
++ break;
++ }
++
++ finish_callback(task, utrace, &report, engine, ret);
++ }
++
++ /*
++ * We express the chosen action to the signals code in terms
++ * of a representative signal whose default action does it.
++ * Our caller uses our return value (signr) to decide what to
++ * do, but uses info->si_signo as the signal number to report.
++ */
++ switch (utrace_signal_action(report.result)) {
++ case UTRACE_SIGNAL_TERM:
++ signr = SIGTERM;
++ break;
++
++ case UTRACE_SIGNAL_CORE:
++ signr = SIGQUIT;
++ break;
++
++ case UTRACE_SIGNAL_STOP:
++ signr = SIGSTOP;
++ break;
++
++ case UTRACE_SIGNAL_TSTP:
++ signr = SIGTSTP;
++ break;
++
++ case UTRACE_SIGNAL_DELIVER:
++ signr = info->si_signo;
++
++ if (return_ka->sa.sa_handler == SIG_DFL) {
++ /*
++ * We'll do signr's normal default action.
++ * For ignore, we'll fall through below.
++ * For stop/death, break locks and returns it.
++ */
++ if (likely(signr) && !sig_kernel_ignore(signr))
++ break;
++ } else if (return_ka->sa.sa_handler != SIG_IGN &&
++ likely(signr)) {
++ /*
++ * Complete the bookkeeping after the report.
++ * The handler will run. If an engine wanted to
++ * stop or step, then make sure we do another
++ * report after signal handler setup.
++ */
++ if (report.action != UTRACE_RESUME)
++ report.action = UTRACE_INTERRUPT;
++ finish_report(task, utrace, &report, true);
++
++ if (unlikely(report.result & UTRACE_SIGNAL_HOLD))
++ push_back_signal(task, info);
++ else
++ spin_lock_irq(&task->sighand->siglock);
++
++ /*
++ * We do the SA_ONESHOT work here since the
++ * normal path will only touch *return_ka now.
++ */
++ if (unlikely(return_ka->sa.sa_flags & SA_ONESHOT)) {
++ return_ka->sa.sa_flags &= ~SA_ONESHOT;
++ if (likely(valid_signal(signr))) {
++ ka = &task->sighand->action[signr - 1];
++ ka->sa.sa_handler = SIG_DFL;
++ }
++ }
++
++ return signr;
++ }
++
++ /* Fall through for an ignored signal. */
++
++ case UTRACE_SIGNAL_IGN:
++ case UTRACE_SIGNAL_REPORT:
++ default:
++ /*
++ * If the signal is being ignored, then we are on the way
++ * directly back to user mode. We can stop here, or step,
++ * as in utrace_resume(), above. After we've dealt with that,
++ * our caller will relock and come back through here.
++ */
++ finish_resume_report(task, utrace, &report);
++
++ if (unlikely(fatal_signal_pending(task))) {
++ /*
++ * The only reason we woke up now was because of a
++ * SIGKILL. Don't do normal dequeuing in case it
++ * might get a signal other than SIGKILL. That would
++ * perturb the death state so it might differ from
++ * what the debugger would have allowed to happen.
++ * Instead, pluck out just the SIGKILL to be sure
++ * we'll die immediately with nothing else different
++ * from the quiescent state the debugger wanted us in.
++ */
++ sigset_t sigkill_only;
++ siginitsetinv(&sigkill_only, sigmask(SIGKILL));
++ spin_lock_irq(&task->sighand->siglock);
++ signr = dequeue_signal(task, &sigkill_only, info);
++ BUG_ON(signr != SIGKILL);
++ *return_ka = task->sighand->action[SIGKILL - 1];
++ return signr;
++ }
++
++ if (unlikely(report.result & UTRACE_SIGNAL_HOLD)) {
++ push_back_signal(task, info);
++ spin_unlock_irq(&task->sighand->siglock);
++ }
++
++ return -1;
++ }
++
++ /*
++ * Complete the bookkeeping after the report.
++ * This sets utrace->resume if UTRACE_STOP was used.
++ */
++ finish_report(task, utrace, &report, true);
++
++ return_ka->sa.sa_handler = SIG_DFL;
++
++ /*
++ * If this signal is fatal, si_signo gets through as exit_code.
++ * We can't allow a completely bogus value there or else core
++ * kernel code can freak out. (If an engine wants to control
++ * the exit_code value exactly, it can do so in report_exit.)
++ * We'll produce a big complaint in dmesg, but won't crash.
++ * That's nicer for debugging your utrace engine.
++ */
++ if (unlikely(info->si_signo & 0x80)) {
++ WARN(1, "utrace engine left bogus si_signo value!");
++ info->si_signo = SIGTRAP;
++ }
++
++ if (unlikely(report.result & UTRACE_SIGNAL_HOLD))
++ push_back_signal(task, info);
++ else
++ spin_lock_irq(&task->sighand->siglock);
++
++ if (sig_kernel_stop(signr))
++ task->signal->flags |= SIGNAL_STOP_DEQUEUED;
++
++ return signr;
++}
++
++/*
++ * This gets called after a signal handler has been set up.
++ * We set a flag so the next report knows it happened.
++ * If we're already stepping, make sure we do a report_signal.
++ * If not, make sure we get into utrace_resume() where we can
++ * clear the signal_handler flag before resuming.
++ */
++void utrace_signal_handler(struct task_struct *task, int stepping)
++{
++ struct utrace *utrace = task_utrace_struct(task);
++
++ spin_lock(&utrace->lock);
++
++ utrace->signal_handler = 1;
++ if (utrace->resume > UTRACE_INTERRUPT) {
++ if (stepping) {
++ utrace->resume = UTRACE_INTERRUPT;
++ set_tsk_thread_flag(task, TIF_SIGPENDING);
++ } else if (utrace->resume == UTRACE_RESUME) {
++ set_tsk_thread_flag(task, TIF_NOTIFY_RESUME);
++ }
++ }
++
++ spin_unlock(&utrace->lock);
++}
++
++/**
++ * utrace_prepare_examine - prepare to examine thread state
++ * @target: thread of interest, a &struct task_struct pointer
++ * @engine: engine pointer returned by utrace_attach_task()
++ * @exam: temporary state, a &struct utrace_examiner pointer
++ *
++ * This call prepares to safely examine the thread @target using
++ * &struct user_regset calls, or direct access to thread-synchronous fields.
++ *
++ * When @target is current, this call is superfluous. When @target is
++ * another thread, it must be held stopped via %UTRACE_STOP by @engine.
++ *
++ * This call may block the caller until @target stays stopped, so it must
++ * be called only after the caller is sure @target is about to unschedule.
++ * This means a zero return from a utrace_control() call on @engine giving
++ * %UTRACE_STOP, or a report_quiesce() or report_signal() callback to
++ * @engine that used %UTRACE_STOP in its return value.
++ *
++ * Returns -%ESRCH if @target is dead or -%EINVAL if %UTRACE_STOP was
++ * not used. If @target has started running again despite %UTRACE_STOP
++ * (for %SIGKILL or a spurious wakeup), this call returns -%EAGAIN.
++ *
++ * When this call returns zero, it's safe to use &struct user_regset
++ * calls and task_user_regset_view() on @target and to examine some of
++ * its fields directly. When the examination is complete, a
++ * utrace_finish_examine() call must follow to check whether it was
++ * completed safely.
++ */
++int utrace_prepare_examine(struct task_struct *target,
++ struct utrace_engine *engine,
++ struct utrace_examiner *exam)
++{
++ int ret = 0;
++
++ if (unlikely(target == current))
++ return 0;
++
++ rcu_read_lock();
++ if (unlikely(!engine_wants_stop(engine)))
++ ret = -EINVAL;
++ else if (unlikely(target->exit_state))
++ ret = -ESRCH;
++ else {
++ exam->state = target->state;
++ if (unlikely(exam->state == TASK_RUNNING))
++ ret = -EAGAIN;
++ else
++ get_task_struct(target);
++ }
++ rcu_read_unlock();
++
++ if (likely(!ret)) {
++ exam->ncsw = wait_task_inactive(target, exam->state);
++ put_task_struct(target);
++ if (unlikely(!exam->ncsw))
++ ret = -EAGAIN;
++ }
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(utrace_prepare_examine);
++
++/**
++ * utrace_finish_examine - complete an examination of thread state
++ * @target: thread of interest, a &struct task_struct pointer
++ * @engine: engine pointer returned by utrace_attach_task()
++ * @exam: pointer passed to utrace_prepare_examine() call
++ *
++ * This call completes an examination on the thread @target begun by a
++ * paired utrace_prepare_examine() call with the same arguments that
++ * returned success (zero).
++ *
++ * When @target is current, this call is superfluous. When @target is
++ * another thread, this returns zero if @target has remained unscheduled
++ * since the paired utrace_prepare_examine() call returned zero.
++ *
++ * When this returns an error, any examination done since the paired
++ * utrace_prepare_examine() call is unreliable and the data extracted
++ * should be discarded. The error is -%EINVAL if @engine is not
++ * keeping @target stopped, or -%EAGAIN if @target woke up unexpectedly.
++ */
++int utrace_finish_examine(struct task_struct *target,
++ struct utrace_engine *engine,
++ struct utrace_examiner *exam)
++{
++ int ret = 0;
++
++ if (unlikely(target == current))
++ return 0;
++
++ rcu_read_lock();
++ if (unlikely(!engine_wants_stop(engine)))
++ ret = -EINVAL;
++ else if (unlikely(target->state != exam->state))
++ ret = -EAGAIN;
++ else
++ get_task_struct(target);
++ rcu_read_unlock();
++
++ if (likely(!ret)) {
++ unsigned long ncsw = wait_task_inactive(target, exam->state);
++ if (unlikely(ncsw != exam->ncsw))
++ ret = -EAGAIN;
++ put_task_struct(target);
++ }
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(utrace_finish_examine);
++
++/*
++ * This is declared in linux/regset.h and defined in machine-dependent
++ * code. We put the export here to ensure no machine forgets it.
++ */
++EXPORT_SYMBOL_GPL(task_user_regset_view);
++
++/*
++ * Called with rcu_read_lock() held.
++ */
++void task_utrace_proc_status(struct seq_file *m, struct task_struct *p)
++{
++ seq_printf(m, "Utrace:\t%lx\n", p->utrace_flags);
++}
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-v4l-dvb-experimental.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-v4l-dvb-experimental.patch
new file mode 100644
index 000000000..308ca6351
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-v4l-dvb-experimental.patch
@@ -0,0 +1,1326 @@
+commit 9069f7f1ce7309cba021ac9c3527526d8524bd04
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Mon Apr 25 13:50:50 2011 -0400
+
+ [media] ite-cir: modular build on ppc requires delay.h include
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 50f19c24801caaa6d846c62cef93ee54f6e6914f
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Mon Apr 25 13:48:18 2011 -0400
+
+ [media] mceusb: add Dell transceiver ID
+
+ Add device ID for a Dell-branded, Philips device ID transceiver reported
+ by an OpenELEC user on their forums.
+
+ http://openelec.tv/forum/27-hardware-support/5622-adding-support-for-an-ir-receiver--dell-branded--#5622
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit d9193f3784352638b355c9a24c16f1a2e14b0548
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Thu Apr 21 14:21:47 2011 -0400
+
+ [media] nuvoton-cir: minor tweaks to rc dev init
+
+ - Set a default timeout (matching mceusb.c) and use
+ ir_raw_event_store_with_filter, which leads to better behavior when
+ using lirc userspace decoding with this hardware
+ - Fill in rx_resolution with the value we're using here (50us)
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 02210203eb4df7fdf1156b24fcf2b7e2a20bf29c
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Tue Apr 19 15:47:34 2011 -0400
+
+ [media] mceusb: Formosa e017 device has no tx
+
+ Per hardware provided to me, the Formosa Industrial Computing eHome
+ Infrared Receiver, 0x147a:0xe017, has no tx capability, it is rx only.
+
+ Thanks go to Paul Rae for the hardware.
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 5919687ea8e0d3ee093b6edc4e24e30c1a8a60dc
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Tue Apr 19 14:31:40 2011 -0400
+
+ hid: flesh out support for tivo slide remote
+
+ This patch finishes off adding full support for the TiVo Slide remote,
+ which is a mostly pure HID device from the perspective of the kernel.
+ There are a few mappings that use a vendor-specific usage page, and a
+ few keys in the consumer usage page that I think make sense to remap
+ slightly, to better fit their key labels' intended use. Doing this in a
+ stand-alone hid-tivo.c makes the modifications only matter for this
+ specific device.
+
+ What's actually connected to the computer is a Broadcom-made usb dongle,
+ which has an embedded hub, bluetooth adapter, mouse and keyboard
+ devices. You pair with the dongle, then the remote sends data that its
+ converted into HID on the keyboard interface (the mouse interface
+ doesn't do anything interesting, so far as I can tell).
+
+ lsusb for this device:
+ Bus 004 Device 005: ID 0a5c:2190 Broadcom Corp.
+ Bus 004 Device 004: ID 0a5c:4503 Broadcom Corp.
+ Bus 004 Device 003: ID 150a:1201
+ Bus 004 Device 002: ID 0a5c:4500 Broadcom Corp. BCM2046B1 USB 2.0 Hub (part of BCM2046 Bluetooth)
+
+ Speaking of the keyboard interface, the remote actually does contain a
+ keyboard as well. The top slides away, revealing a reasonably functional
+ qwerty keyboard (not unlike many slide cell phones), thus the product
+ name.
+
+ Applies cleanly to hid master, tested w/a 2.6.38.3-based Fedora kernel
+ and a 2.6.32-based Red Hat Enterprise Linux 6 kernel.
+
+ CC: Jiri Kosina <jkosina@suse.cz>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit f5d27c83d8b1d1db7d727d4d33ae3df1357c0f03
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Thu Mar 24 17:08:00 2011 -0400
+
+ rc: add an Apple remote keymap
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 9942d577525ebac939c155aaeb18e97e1282c923
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Tue Apr 12 12:38:27 2011 -0400
+
+ [media] rc/nuvoton-cir: enable CIR on w83667hg chip variant
+
+ Thanks to some excellent investigative work by Douglas Clowes, it was
+ uncovered that the older w83667hg Nuvoton chip functions with this
+ driver after actually enabling the CIR function via its multi-function
+ chip config register. The CIR and CIR wide-band sensor enable bits are
+ just in a different place on this hardware, so we only poke register
+ 0x27 on 677 hardware now, and we poke register 0x2c on the 667 now.
+
+ Reported-by: Douglas Clowes <dclowes1@optusnet.com.au>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 92e839f5added53445aa2c447d69ea1c399e3113
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Tue Apr 12 13:00:07 2011 -0400
+
+ [media] rc/nuvoton-cir: only warn about unknown chips
+
+ There are additional chip IDs that report a PNP ID of NTN0530, which we
+ were refusing to load on. Instead, lets just warn if we encounter an
+ unknown chip, as there's a chance it will work just fine.
+
+ Also, expand the list of known hardware to include both an earlier and a
+ later generation chip that this driver should function with. Douglas has
+ an older w83667hg variant, that with a touch more work, will be
+ supported by this driver, and Lutz has a newer w83677hg variant that
+ works without any further modifications to the driver.
+
+ Reported-by: Douglas Clowes <dclowes1@optusnet.com.au>
+ Reported-by: Lutz Sammer <johns98@gmx.net>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 8cc98ca72fe0a5c0a5299057edf24690c6940098
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Tue Apr 5 17:42:30 2011 -0400
+
+ [media] rc: further key name standardization
+
+ Use the newly introduced KEY_IMAGES where appropriate, and standardize
+ on KEY_MEDIA for media center/application launcher button (such as the
+ Windows logo key on the Windows Media Center Ed. remotes).
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 29d1ac85998862cc4cb7629461358e932363c358
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Thu Mar 24 15:43:45 2011 -0400
+
+ lirc_sasem: key debug spew off debug modparam
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 9965e8d8e0035e56e11e1ad6c359877e51749b34
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Thu Mar 24 11:56:16 2011 -0400
+
+ ttusb-budget: driver has a debug param, use it
+
+ Remove DEBUG define, key debug spew off of the module's debug param that
+ already exists.
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 10fabf1f9cf8c1d1b579ab549bf4429ad13e0219
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Thu Mar 24 11:54:41 2011 -0400
+
+ drx397xD: remove unused DEBUG define
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit aa17ba00097df21cd0392e8aea41e93460e25007
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Thu Mar 24 11:59:10 2011 -0400
+
+ mceusb: tivo transceiver should default to tivo keymap
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 02a5f7ed83b1da82f78b759a293cd15170afe611
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Thu Mar 24 11:58:48 2011 -0400
+
+ rc: add tivo/nero liquidtv keymap
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit db27bf543d740530ca0c1ab9fa7f3386f998e87c
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Mon Apr 11 17:33:28 2011 -0400
+
+ hid: assorted usage updates from hut 1.12
+
+ I've got a Tivo Slide bluetooth remote/dongle, which uses a fair number
+ of hid usages that aren't currently mapped in hid-input.c. I'd initially
+ written additions to hid-input.c with just this device in mind,
+ including some bits that were specific to the device. This go around,
+ I'm looking at adding/correcting as many generic HID usages from the HID
+ Usage Tables, version 1.12, as I can -- which also serves to enable all
+ but four of the buttons on the Tivo Slide remote[*].
+
+ Outside of fixing the obviously incorrect mapping of 0xc 0x45 from
+ KEY_RADIO to KEY_RIGHT, and making use of the new KEY_IMAGES (just added
+ in 2.6.39-rc4) for AL Image Browser instead of KEY_MEDIA, these are
+ purely additions, and thus should have no negative impact on any already
+ functional HID devices. Most of the added mappings seemed to be
+ perfectly logical to me, but there were a few that were mapped on more
+ of an "I think this makes the most sense" basis.
+
+ [*] I'll handle the last four tivo buttons via an hid-tivo.c follow-up.
+
+ CC: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+ CC: Jiri Kosina <jkosina@suse.cz>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 967bc222e57b94cf12cb4ad55383dec885f1755c
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Wed Apr 6 09:54:01 2011 -0400
+
+ input: add KEY_IMAGES specifically for AL Image Browser
+
+ Many media center remotes have buttons intended for jumping straight to
+ one type of media browser or another -- commonly, images/photos/pictures,
+ audio/music, television, and movies. At present, remotes with an images
+ or photos or pictures button use any number of different keycodes which
+ sort of maybe fit. I've seen at least KEY_MEDIA, KEY_CAMERA,
+ KEY_GRAPHICSEDITOR and KEY_PRESENTATION. None of those seem quite right.
+ In my mind, KEY_MEDIA should be something more like a media center
+ application launcher (and I'd like to standardize on that for things
+ like the windows media center button on the mce remotes). KEY_CAMERA is
+ used in a lot of webcams, and typically means "take a picture now".
+ KEY_GRAPHICSEDITOR implies an editor, not a browser. KEY_PRESENTATION
+ might be the closest fit here, if you think "photo slide show", but it
+ may well be more intended for "run application in full-screen
+ presentation mode" or to launch something like magicpoint, I dunno.
+ And thus, I'd like to have a KEY_IMAGES, which matches the HID Usage AL
+ Image Browser, the meaning of which I think is crystal-clear. I believe
+ AL Audio Browser is already covered by KEY_AUDIO, and AL Movie Browser
+ by KEY_VIDEO, so I'm also adding appropriate comments next to those
+ keys.
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+---
+ drivers/hid/Kconfig | 6 +
+ drivers/hid/Makefile | 1 +
+ drivers/hid/hid-ids.h | 3 +
+ drivers/hid/hid-input.c | 60 ++++++++++--
+ drivers/hid/hid-tivo.c | 89 ++++++++++++++++++
+ drivers/media/dvb/dvb-usb/dibusb-common.c | 2 +-
+ drivers/media/dvb/dvb-usb/m920x.c | 16 ++--
+ drivers/media/dvb/dvb-usb/nova-t-usb2.c | 2 +-
+ drivers/media/dvb/frontends/drx397xD.c | 1 -
+ drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c | 60 ++++++-------
+ drivers/media/rc/keymaps/Makefile | 2 +
+ drivers/media/rc/keymaps/rc-apple.c | 55 +++++++++++
+ drivers/media/rc/keymaps/rc-avermedia-cardbus.c | 2 +-
+ drivers/media/rc/keymaps/rc-imon-mce.c | 2 +-
+ drivers/media/rc/keymaps/rc-imon-pad.c | 6 +-
+ .../media/rc/keymaps/rc-kworld-plus-tv-analog.c | 2 +-
+ drivers/media/rc/keymaps/rc-rc6-mce.c | 4 +-
+ drivers/media/rc/keymaps/rc-tivo.c | 98 ++++++++++++++++++++
+ drivers/media/rc/mceusb.c | 16 +++-
+ drivers/media/rc/nuvoton-cir.c | 62 ++++++++++---
+ drivers/media/rc/nuvoton-cir.h | 17 +++-
+ drivers/staging/lirc/lirc_sasem.c | 13 ++-
+ include/linux/input.h | 5 +-
+ include/media/rc-map.h | 2 +
+ 24 files changed, 439 insertions(+), 87 deletions(-)
+
+diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
+index 2560f01..30a8cfd 100644
+--- a/drivers/hid/Kconfig
++++ b/drivers/hid/Kconfig
+@@ -492,6 +492,12 @@ config SMARTJOYPLUS_FF
+ Say Y here if you have a SmartJoy PLUS PS2/USB adapter and want to
+ enable force feedback support for it.
+
++config HID_TIVO_SLIDE
++ tristate "TiVo Slide Bluetooth remote control support"
++ depends on USB_HID
++ ---help---
++ Say Y if you have a TiVo Slide Bluetooth remote control.
++
+ config HID_TOPSEED
+ tristate "TopSeed Cyberlink, BTC Emprex, Conceptronic remote control support"
+ depends on USB_HID
+diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
+index 6efc2a0..7c1efa3 100644
+--- a/drivers/hid/Makefile
++++ b/drivers/hid/Makefile
+@@ -66,6 +66,7 @@ obj-$(CONFIG_HID_STANTUM) += hid-stantum.o
+ obj-$(CONFIG_HID_SUNPLUS) += hid-sunplus.o
+ obj-$(CONFIG_HID_GREENASIA) += hid-gaff.o
+ obj-$(CONFIG_HID_THRUSTMASTER) += hid-tmff.o
++obj-$(CONFIG_HID_TIVO) += hid-tivo.o
+ obj-$(CONFIG_HID_TOPSEED) += hid-topseed.o
+ obj-$(CONFIG_HID_TWINHAN) += hid-twinhan.o
+ obj-$(CONFIG_HID_UCLOGIC) += hid-uclogic.o
+diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
+index 92a0d61..8ece9eb 100644
+--- a/drivers/hid/hid-ids.h
++++ b/drivers/hid/hid-ids.h
+@@ -533,6 +533,9 @@
+
+ #define USB_VENDOR_ID_THRUSTMASTER 0x044f
+
++#define USB_VENDOR_ID_TIVO 0x150a
++#define USB_DEVICE_ID_TIVO_SLIDE 0x1201
++
+ #define USB_VENDOR_ID_TOPSEED 0x0766
+ #define USB_DEVICE_ID_TOPSEED_CYBERLINK 0x0204
+
+diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
+index 7f552bf..88d4703 100644
+--- a/drivers/hid/hid-input.c
++++ b/drivers/hid/hid-input.c
+@@ -44,11 +44,11 @@ static const unsigned char hid_keyboard[256] = {
+ 72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190,
+ 191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113,
+ 115,114,unk,unk,unk,121,unk, 89, 93,124, 92, 94, 95,unk,unk,unk,
+- 122,123, 90, 91, 85,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
++ 122,123, 90, 91, 85,unk,unk,unk,unk,unk,unk,unk,111,unk,unk,unk,
+ unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
+ unk,unk,unk,unk,unk,unk,179,180,unk,unk,unk,unk,unk,unk,unk,unk,
+ unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
+- unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
++ unk,unk,unk,unk,unk,unk,unk,unk,111,unk,unk,unk,unk,unk,unk,unk,
+ 29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113,
+ 150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk
+ };
+@@ -365,6 +365,18 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
+ case 0x1: map_key_clear(KEY_POWER); break;
+ case 0x2: map_key_clear(KEY_SLEEP); break;
+ case 0x3: map_key_clear(KEY_WAKEUP); break;
++ case 0x4: map_key_clear(KEY_CONTEXT_MENU); break;
++ case 0x5: map_key_clear(KEY_MENU); break;
++ case 0x6: map_key_clear(KEY_PROG1); break;
++ case 0x7: map_key_clear(KEY_HELP); break;
++ case 0x8: map_key_clear(KEY_EXIT); break;
++ case 0x9: map_key_clear(KEY_SELECT); break;
++ case 0xa: map_key_clear(KEY_RIGHT); break;
++ case 0xb: map_key_clear(KEY_LEFT); break;
++ case 0xc: map_key_clear(KEY_UP); break;
++ case 0xd: map_key_clear(KEY_DOWN); break;
++ case 0xe: map_key_clear(KEY_POWER2); break;
++ case 0xf: map_key_clear(KEY_RESTART); break;
+ default: goto unknown;
+ }
+ break;
+@@ -474,16 +486,39 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
+ }
+ break;
+
+- case HID_UP_CONSUMER: /* USB HUT v1.1, pages 56-62 */
++ case HID_UP_CONSUMER: /* USB HUT v1.12, pages 75-84 */
+ switch (usage->hid & HID_USAGE) {
+ case 0x000: goto ignore;
++ case 0x030: map_key_clear(KEY_POWER); break;
++ case 0x031: map_key_clear(KEY_RESTART); break;
++ case 0x032: map_key_clear(KEY_SLEEP); break;
+ case 0x034: map_key_clear(KEY_SLEEP); break;
++ case 0x035: map_key_clear(KEY_KBDILLUMTOGGLE); break;
+ case 0x036: map_key_clear(BTN_MISC); break;
+
+- case 0x040: map_key_clear(KEY_MENU); break;
+- case 0x045: map_key_clear(KEY_RADIO); break;
+-
++ case 0x040: map_key_clear(KEY_MENU); break; /* Menu */
++ case 0x041: map_key_clear(KEY_SELECT); break; /* Menu Pick */
++ case 0x042: map_key_clear(KEY_UP); break; /* Menu Up */
++ case 0x043: map_key_clear(KEY_DOWN); break; /* Menu Down */
++ case 0x044: map_key_clear(KEY_LEFT); break; /* Menu Left */
++ case 0x045: map_key_clear(KEY_RIGHT); break; /* Menu Right */
++ case 0x046: map_key_clear(KEY_ESC); break; /* Menu Escape */
++ case 0x047: map_key_clear(KEY_KPPLUS); break; /* Menu Value Increase */
++ case 0x048: map_key_clear(KEY_KPMINUS); break; /* Menu Value Decrease */
++
++ case 0x060: map_key_clear(KEY_INFO); break; /* Data On Screen */
++ case 0x061: map_key_clear(KEY_SUBTITLE); break; /* Closed Caption */
++ case 0x063: map_key_clear(KEY_VCR); break; /* VCR/TV */
++ case 0x065: map_key_clear(KEY_CAMERA); break; /* Snapshot */
++ case 0x069: map_key_clear(KEY_RED); break;
++ case 0x06a: map_key_clear(KEY_GREEN); break;
++ case 0x06b: map_key_clear(KEY_BLUE); break;
++ case 0x06c: map_key_clear(KEY_YELLOW); break;
++ case 0x06d: map_key_clear(KEY_ZOOM); break;
++
++ case 0x082: map_key_clear(KEY_VIDEO_NEXT); break;
+ case 0x083: map_key_clear(KEY_LAST); break;
++ case 0x084: map_key_clear(KEY_ENTER); break;
+ case 0x088: map_key_clear(KEY_PC); break;
+ case 0x089: map_key_clear(KEY_TV); break;
+ case 0x08a: map_key_clear(KEY_WWW); break;
+@@ -517,6 +552,8 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
+ case 0x0b7: map_key_clear(KEY_STOPCD); break;
+ case 0x0b8: map_key_clear(KEY_EJECTCD); break;
+ case 0x0bc: map_key_clear(KEY_MEDIA_REPEAT); break;
++ case 0x0b9: map_key_clear(KEY_SHUFFLE); break;
++ case 0x0bf: map_key_clear(KEY_SLOW); break;
+
+ case 0x0cd: map_key_clear(KEY_PLAYPAUSE); break;
+ case 0x0e0: map_abs_clear(ABS_VOLUME); break;
+@@ -524,6 +561,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
+ case 0x0e5: map_key_clear(KEY_BASSBOOST); break;
+ case 0x0e9: map_key_clear(KEY_VOLUMEUP); break;
+ case 0x0ea: map_key_clear(KEY_VOLUMEDOWN); break;
++ case 0x0f5: map_key_clear(KEY_SLOW); break;
+
+ case 0x182: map_key_clear(KEY_BOOKMARKS); break;
+ case 0x183: map_key_clear(KEY_CONFIG); break;
+@@ -540,6 +578,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
+ case 0x18e: map_key_clear(KEY_CALENDAR); break;
+ case 0x191: map_key_clear(KEY_FINANCE); break;
+ case 0x192: map_key_clear(KEY_CALC); break;
++ case 0x193: map_key_clear(KEY_PLAYER); break;
+ case 0x194: map_key_clear(KEY_FILE); break;
+ case 0x196: map_key_clear(KEY_WWW); break;
+ case 0x199: map_key_clear(KEY_CHAT); break;
+@@ -548,8 +587,10 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
+ case 0x1a6: map_key_clear(KEY_HELP); break;
+ case 0x1a7: map_key_clear(KEY_DOCUMENTS); break;
+ case 0x1ab: map_key_clear(KEY_SPELLCHECK); break;
+- case 0x1b6: map_key_clear(KEY_MEDIA); break;
+- case 0x1b7: map_key_clear(KEY_SOUND); break;
++ case 0x1ae: map_key_clear(KEY_KEYBOARD); break;
++ case 0x1b6: map_key_clear(KEY_IMAGES); break;
++ case 0x1b7: map_key_clear(KEY_AUDIO); break;
++ case 0x1b8: map_key_clear(KEY_VIDEO); break;
+ case 0x1bc: map_key_clear(KEY_MESSENGER); break;
+ case 0x1bd: map_key_clear(KEY_INFO); break;
+ case 0x201: map_key_clear(KEY_NEW); break;
+@@ -578,7 +619,10 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
+ case 0x233: map_key_clear(KEY_SCROLLUP); break;
+ case 0x234: map_key_clear(KEY_SCROLLDOWN); break;
+ case 0x238: map_rel(REL_HWHEEL); break;
++ case 0x23d: map_key_clear(KEY_EDIT); break;
+ case 0x25f: map_key_clear(KEY_CANCEL); break;
++ case 0x269: map_key_clear(KEY_INSERT); break;
++ case 0x26a: map_key_clear(KEY_DELETE); break;
+ case 0x279: map_key_clear(KEY_REDO); break;
+
+ case 0x289: map_key_clear(KEY_REPLY); break;
+diff --git a/drivers/hid/hid-tivo.c b/drivers/hid/hid-tivo.c
+new file mode 100644
+index 0000000..3d43c06
+--- /dev/null
++++ b/drivers/hid/hid-tivo.c
+@@ -0,0 +1,89 @@
++/*
++ * HID driver for TiVo Slide Bluetooth remote
++ *
++ * Copyright (c) 2011 Jarod Wilson <jarod@redhat.com>
++ * based on the hid-topseed driver, which is in turn, based on hid-cherry...
++ */
++
++/*
++ * 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 <linux/device.h>
++#include <linux/hid.h>
++#include <linux/module.h>
++
++#include "hid-ids.h"
++
++#define HID_UP_TIVOVENDOR 0xffff0000
++#define tivo_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \
++ EV_KEY, (c))
++
++static int tivo_input_mapping(struct hid_device *hdev, struct hid_input *hi,
++ struct hid_field *field, struct hid_usage *usage,
++ unsigned long **bit, int *max)
++{
++ switch (usage->hid & HID_USAGE_PAGE) {
++ case HID_UP_TIVOVENDOR:
++ switch (usage->hid & HID_USAGE) {
++ /* TiVo button */
++ case 0x3d: tivo_map_key_clear(KEY_MEDIA); break;
++ /* Live TV */
++ case 0x3e: tivo_map_key_clear(KEY_TV); break;
++ /* Red thumbs down */
++ case 0x41: tivo_map_key_clear(KEY_KPMINUS); break;
++ /* Green thumbs up */
++ case 0x42: tivo_map_key_clear(KEY_KPPLUS); break;
++ default:
++ return 0;
++ }
++ break;
++ case HID_UP_CONSUMER:
++ switch (usage->hid & HID_USAGE) {
++ /* Enter/Last (default mapping: KEY_LAST) */
++ case 0x083: tivo_map_key_clear(KEY_ENTER); break;
++ /* Info (default mapping: KEY_PROPS) */
++ case 0x209: tivo_map_key_clear(KEY_INFO); break;
++ default:
++ return 0;
++ }
++ break;
++ default:
++ return 0;
++ }
++
++ /* This means we found a matching mapping here, else, look in the
++ * standard hid mappings in hid-input.c */
++ return 1;
++}
++
++static const struct hid_device_id tivo_devices[] = {
++ /* TiVo Slide Bluetooth remote, pairs with a Broadcom dongle */
++ { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE) },
++ { }
++};
++MODULE_DEVICE_TABLE(hid, tivo_devices);
++
++static struct hid_driver tivo_driver = {
++ .name = "tivo_slide",
++ .id_table = tivo_devices,
++ .input_mapping = tivo_input_mapping,
++};
++
++static int __init tivo_init(void)
++{
++ return hid_register_driver(&tivo_driver);
++}
++
++static void __exit tivo_exit(void)
++{
++ hid_unregister_driver(&tivo_driver);
++}
++
++module_init(tivo_init);
++module_exit(tivo_exit);
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Jarod Wilson <jarod@redhat.com>");
+diff --git a/drivers/media/dvb/dvb-usb/dibusb-common.c b/drivers/media/dvb/dvb-usb/dibusb-common.c
+index 956f7ae..4c2a689 100644
+--- a/drivers/media/dvb/dvb-usb/dibusb-common.c
++++ b/drivers/media/dvb/dvb-usb/dibusb-common.c
+@@ -408,7 +408,7 @@ struct rc_map_table rc_map_dibusb_table[] = {
+
+ { 0x8008, KEY_DVD },
+ { 0x8009, KEY_AUDIO },
+- { 0x800a, KEY_MEDIA }, /* Pictures */
++ { 0x800a, KEY_IMAGES }, /* Pictures */
+ { 0x800b, KEY_VIDEO },
+
+ { 0x800c, KEY_BACK },
+diff --git a/drivers/media/dvb/dvb-usb/m920x.c b/drivers/media/dvb/dvb-usb/m920x.c
+index da9dc91..51bfd42 100644
+--- a/drivers/media/dvb/dvb-usb/m920x.c
++++ b/drivers/media/dvb/dvb-usb/m920x.c
+@@ -632,9 +632,9 @@ static struct rc_map_table rc_map_pinnacle310e_table[] = {
+ { 0x16, KEY_POWER },
+ { 0x17, KEY_FAVORITES },
+ { 0x0f, KEY_TEXT },
+- { 0x48, KEY_MEDIA }, /* preview */
++ { 0x48, KEY_PROGRAM }, /* preview */
+ { 0x1c, KEY_EPG },
+- { 0x04, KEY_LIST }, /* record list */
++ { 0x04, KEY_LIST }, /* record list */
+ { 0x03, KEY_1 },
+ { 0x01, KEY_2 },
+ { 0x06, KEY_3 },
+@@ -674,14 +674,14 @@ static struct rc_map_table rc_map_pinnacle310e_table[] = {
+ { 0x0e, KEY_MUTE },
+ /* { 0x49, KEY_LR }, */ /* L/R */
+ { 0x07, KEY_SLEEP }, /* Hibernate */
+- { 0x08, KEY_MEDIA }, /* A/V */
+- { 0x0e, KEY_MENU }, /* Recall */
++ { 0x08, KEY_VIDEO }, /* A/V */
++ { 0x0e, KEY_MENU }, /* Recall */
+ { 0x45, KEY_ZOOMIN },
+ { 0x46, KEY_ZOOMOUT },
+- { 0x18, KEY_TV }, /* Red */
+- { 0x53, KEY_VCR }, /* Green */
+- { 0x5e, KEY_SAT }, /* Yellow */
+- { 0x5f, KEY_PLAYER }, /* Blue */
++ { 0x18, KEY_RED }, /* Red */
++ { 0x53, KEY_GREEN }, /* Green */
++ { 0x5e, KEY_YELLOW }, /* Yellow */
++ { 0x5f, KEY_BLUE }, /* Blue */
+ };
+
+ /* DVB USB Driver stuff */
+diff --git a/drivers/media/dvb/dvb-usb/nova-t-usb2.c b/drivers/media/dvb/dvb-usb/nova-t-usb2.c
+index 9d3cd2d..bc350e9 100644
+--- a/drivers/media/dvb/dvb-usb/nova-t-usb2.c
++++ b/drivers/media/dvb/dvb-usb/nova-t-usb2.c
+@@ -47,7 +47,7 @@ static struct rc_map_table rc_map_haupp_table[] = {
+ { 0x1e17, KEY_RIGHT },
+ { 0x1e18, KEY_VIDEO },
+ { 0x1e19, KEY_AUDIO },
+- { 0x1e1a, KEY_MEDIA },
++ { 0x1e1a, KEY_IMAGES },
+ { 0x1e1b, KEY_EPG },
+ { 0x1e1c, KEY_TV },
+ { 0x1e1e, KEY_NEXT },
+diff --git a/drivers/media/dvb/frontends/drx397xD.c b/drivers/media/dvb/frontends/drx397xD.c
+index a05007c..235ac72 100644
+--- a/drivers/media/dvb/frontends/drx397xD.c
++++ b/drivers/media/dvb/frontends/drx397xD.c
+@@ -17,7 +17,6 @@
+ * along with this program; If not, see <http://www.gnu.org/licenses/>.
+ */
+
+-#define DEBUG /* uncomment if you want debugging output */
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+ #include <linux/moduleparam.h>
+diff --git a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
+index cbe2f0d..420bb42 100644
+--- a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
++++ b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
+@@ -52,7 +52,7 @@
+ my TTUSB, so let it undef'd unless you want to implement another
+ frontend. never tested.
+
+- DEBUG:
++ debug:
+ define it to > 3 for really hardcore debugging. you probably don't want
+ this unless the device doesn't load at all. > 2 for bandwidth statistics.
+ */
+@@ -134,20 +134,19 @@ struct ttusb {
+ /* ugly workaround ... don't know why it's necessary to read */
+ /* all result codes. */
+
+-#define DEBUG 0
+ static int ttusb_cmd(struct ttusb *ttusb,
+ const u8 * data, int len, int needresult)
+ {
+ int actual_len;
+ int err;
+-#if DEBUG >= 3
+ int i;
+
+- printk(">");
+- for (i = 0; i < len; ++i)
+- printk(" %02x", data[i]);
+- printk("\n");
+-#endif
++ if (debug >= 3) {
++ printk(KERN_DEBUG ">");
++ for (i = 0; i < len; ++i)
++ printk(KERN_CONT " %02x", data[i]);
++ printk(KERN_CONT "\n");
++ }
+
+ if (mutex_lock_interruptible(&ttusb->semusb) < 0)
+ return -EAGAIN;
+@@ -176,13 +175,15 @@ static int ttusb_cmd(struct ttusb *ttusb,
+ mutex_unlock(&ttusb->semusb);
+ return err;
+ }
+-#if DEBUG >= 3
+- actual_len = ttusb->last_result[3] + 4;
+- printk("<");
+- for (i = 0; i < actual_len; ++i)
+- printk(" %02x", ttusb->last_result[i]);
+- printk("\n");
+-#endif
++
++ if (debug >= 3) {
++ actual_len = ttusb->last_result[3] + 4;
++ printk(KERN_DEBUG "<");
++ for (i = 0; i < actual_len; ++i)
++ printk(KERN_CONT " %02x", ttusb->last_result[i]);
++ printk(KERN_CONT "\n");
++ }
++
+ if (!needresult)
+ mutex_unlock(&ttusb->semusb);
+ return 0;
+@@ -636,16 +637,13 @@ static void ttusb_process_frame(struct ttusb *ttusb, u8 * data, int len)
+ ++ttusb->mux_state;
+ else {
+ ttusb->mux_state = 0;
+-#if DEBUG > 3
+- if (ttusb->insync)
+- printk("%02x ", data[-1]);
+-#else
+ if (ttusb->insync) {
+- printk("%s: lost sync.\n",
++ dprintk("%s: %02x\n",
++ __func__, data[-1]);
++ printk(KERN_INFO "%s: lost sync.\n",
+ __func__);
+ ttusb->insync = 0;
+ }
+-#endif
+ }
+ break;
+ case 3:
+@@ -744,6 +742,9 @@ static void ttusb_process_frame(struct ttusb *ttusb, u8 * data, int len)
+ static void ttusb_iso_irq(struct urb *urb)
+ {
+ struct ttusb *ttusb = urb->context;
++ struct usb_iso_packet_descriptor *d;
++ u8 *data;
++ int len, i;
+
+ if (!ttusb->iso_streaming)
+ return;
+@@ -755,21 +756,14 @@ static void ttusb_iso_irq(struct urb *urb)
+ #endif
+
+ if (!urb->status) {
+- int i;
+ for (i = 0; i < urb->number_of_packets; ++i) {
+- struct usb_iso_packet_descriptor *d;
+- u8 *data;
+- int len;
+ numpkt++;
+ if (time_after_eq(jiffies, lastj + HZ)) {
+-#if DEBUG > 2
+- printk
+- ("frames/s: %d (ts: %d, stuff %d, sec: %d, invalid: %d, all: %d)\n",
+- numpkt * HZ / (jiffies - lastj),
+- numts, numstuff, numsec, numinvalid,
+- numts + numstuff + numsec +
+- numinvalid);
+-#endif
++ dprintk("frames/s: %lu (ts: %d, stuff %d, "
++ "sec: %d, invalid: %d, all: %d)\n",
++ numpkt * HZ / (jiffies - lastj),
++ numts, numstuff, numsec, numinvalid,
++ numts + numstuff + numsec + numinvalid);
+ numts = numstuff = numsec = numinvalid = 0;
+ lastj = jiffies;
+ numpkt = 0;
+diff --git a/drivers/media/rc/keymaps/Makefile b/drivers/media/rc/keymaps/Makefile
+index 85cac7d..8c0cb70 100644
+--- a/drivers/media/rc/keymaps/Makefile
++++ b/drivers/media/rc/keymaps/Makefile
+@@ -2,6 +2,7 @@ obj-$(CONFIG_RC_MAP) += rc-adstech-dvb-t-pci.o \
+ rc-alink-dtu-m.o \
+ rc-anysee.o \
+ rc-apac-viewcomp.o \
++ rc-apple.o \
+ rc-asus-pc39.o \
+ rc-ati-tv-wonder-hd-600.o \
+ rc-avermedia-a16d.o \
+@@ -77,6 +78,7 @@ obj-$(CONFIG_RC_MAP) += rc-adstech-dvb-t-pci.o \
+ rc-terratec-cinergy-xs.o \
+ rc-terratec-slim.o \
+ rc-tevii-nec.o \
++ rc-tivo.o \
+ rc-total-media-in-hand.o \
+ rc-trekstor.o \
+ rc-tt-1500.o \
+diff --git a/drivers/media/rc/keymaps/rc-apple.c b/drivers/media/rc/keymaps/rc-apple.c
+new file mode 100644
+index 0000000..9fff474
+--- /dev/null
++++ b/drivers/media/rc/keymaps/rc-apple.c
+@@ -0,0 +1,55 @@
++/* rc-apple.c - Keytable for Apple remotes
++ *
++ * Copyright (c) 2011 by Jarod Wilson <jarod@redhat.com>
++ *
++ * 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 <media/rc-map.h>
++
++/*
++ * The Apple remotes use an NEC-ish protocol, but instead of having a
++ * command/not_command pair, they use a vendor ID of 0x77e1. Another byte
++ * is used for a pairing ID (0-255), to make it possible to have a system
++ * listen for only its specific remote. The last byte is the actual command
++ * byte. This table will only Just Work(tm) with remotes that have their
++ * pairing byte set to 0xc7 at the moment (one of my Apple remotes), but
++ * it can be trivially replaced from userspace with one using a different
++ * pairing byte value.
++ */
++static struct rc_map_table apple[] = {
++ { 0x77e150c7, KEY_VOLUMEUP },
++ { 0x77e130c7, KEY_VOLUMEDOWN },
++ { 0x77e190c7, KEY_REWIND },
++ { 0x77e160c7, KEY_FASTFORWARD },
++ { 0x77e1a0c7, KEY_PLAYPAUSE },
++ { 0x77e1c0c7, KEY_MENU },
++};
++
++static struct rc_map_list apple_map = {
++ .map = {
++ .scan = apple,
++ .size = ARRAY_SIZE(apple),
++ .rc_type = RC_TYPE_NEC,
++ .name = RC_MAP_APPLE,
++ }
++};
++
++static int __init init_rc_map_apple(void)
++{
++ return rc_map_register(&apple_map);
++}
++
++static void __exit exit_rc_map_apple(void)
++{
++ rc_map_unregister(&apple_map);
++}
++
++module_init(init_rc_map_apple)
++module_exit(exit_rc_map_apple)
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Jarod Wilson <jarod@redhat.com>");
+diff --git a/drivers/media/rc/keymaps/rc-avermedia-cardbus.c b/drivers/media/rc/keymaps/rc-avermedia-cardbus.c
+index bdf97b7..22f54d4 100644
+--- a/drivers/media/rc/keymaps/rc-avermedia-cardbus.c
++++ b/drivers/media/rc/keymaps/rc-avermedia-cardbus.c
+@@ -52,7 +52,7 @@ static struct rc_map_table avermedia_cardbus[] = {
+ { 0x28, KEY_SELECT }, /* Select */
+ { 0x29, KEY_BLUE }, /* Blue/Picture */
+ { 0x2a, KEY_BACKSPACE }, /* Back */
+- { 0x2b, KEY_MEDIA }, /* PIP (Picture-in-picture) */
++ { 0x2b, KEY_VIDEO }, /* PIP (Picture-in-picture) */
+ { 0x2c, KEY_DOWN },
+ { 0x2e, KEY_DOT },
+ { 0x2f, KEY_TV }, /* Live TV */
+diff --git a/drivers/media/rc/keymaps/rc-imon-mce.c b/drivers/media/rc/keymaps/rc-imon-mce.c
+index 937a819..0ea2aa1 100644
+--- a/drivers/media/rc/keymaps/rc-imon-mce.c
++++ b/drivers/media/rc/keymaps/rc-imon-mce.c
+@@ -111,7 +111,7 @@ static struct rc_map_table imon_mce[] = {
+ { 0x800ff44d, KEY_TITLE },
+
+ { 0x800ff40c, KEY_POWER },
+- { 0x800ff40d, KEY_LEFTMETA }, /* Windows MCE button */
++ { 0x800ff40d, KEY_MEDIA }, /* Windows MCE button */
+
+ };
+
+diff --git a/drivers/media/rc/keymaps/rc-imon-pad.c b/drivers/media/rc/keymaps/rc-imon-pad.c
+index 63d42bd..75d3843 100644
+--- a/drivers/media/rc/keymaps/rc-imon-pad.c
++++ b/drivers/media/rc/keymaps/rc-imon-pad.c
+@@ -87,7 +87,7 @@ static struct rc_map_table imon_pad[] = {
+
+ { 0x2b8515b7, KEY_VIDEO },
+ { 0x299195b7, KEY_AUDIO },
+- { 0x2ba115b7, KEY_CAMERA },
++ { 0x2ba115b7, KEY_IMAGES },
+ { 0x28a515b7, KEY_TV },
+ { 0x29a395b7, KEY_DVD },
+ { 0x29a295b7, KEY_DVD },
+@@ -97,7 +97,7 @@ static struct rc_map_table imon_pad[] = {
+ { 0x2ba395b7, KEY_MENU },
+
+ { 0x288515b7, KEY_BOOKMARKS },
+- { 0x2ab715b7, KEY_MEDIA }, /* Thumbnail */
++ { 0x2ab715b7, KEY_CAMERA }, /* Thumbnail */
+ { 0x298595b7, KEY_SUBTITLE },
+ { 0x2b8595b7, KEY_LANGUAGE },
+
+@@ -125,7 +125,7 @@ static struct rc_map_table imon_pad[] = {
+ { 0x2b8195b7, KEY_CONTEXT_MENU }, /* Left Menu*/
+ { 0x02000065, KEY_COMPOSE }, /* RightMenu */
+ { 0x28b715b7, KEY_COMPOSE }, /* RightMenu */
+- { 0x2ab195b7, KEY_LEFTMETA }, /* Go or MultiMon */
++ { 0x2ab195b7, KEY_MEDIA }, /* Go or MultiMon */
+ { 0x29b715b7, KEY_DASHBOARD }, /* AppLauncher */
+ };
+
+diff --git a/drivers/media/rc/keymaps/rc-kworld-plus-tv-analog.c b/drivers/media/rc/keymaps/rc-kworld-plus-tv-analog.c
+index 08d1831..7fa17a3 100644
+--- a/drivers/media/rc/keymaps/rc-kworld-plus-tv-analog.c
++++ b/drivers/media/rc/keymaps/rc-kworld-plus-tv-analog.c
+@@ -17,7 +17,7 @@
+ */
+
+ static struct rc_map_table kworld_plus_tv_analog[] = {
+- { 0x0c, KEY_LEFTMETA }, /* Kworld key */
++ { 0x0c, KEY_MEDIA }, /* Kworld key */
+ { 0x16, KEY_CLOSECD }, /* -> ) */
+ { 0x1d, KEY_POWER2 },
+
+diff --git a/drivers/media/rc/keymaps/rc-rc6-mce.c b/drivers/media/rc/keymaps/rc-rc6-mce.c
+index 8dd519e..01b69bc 100644
+--- a/drivers/media/rc/keymaps/rc-rc6-mce.c
++++ b/drivers/media/rc/keymaps/rc-rc6-mce.c
+@@ -30,7 +30,7 @@ static struct rc_map_table rc6_mce[] = {
+ { 0x800f040a, KEY_DELETE },
+ { 0x800f040b, KEY_ENTER },
+ { 0x800f040c, KEY_POWER }, /* PC Power */
+- { 0x800f040d, KEY_LEFTMETA }, /* Windows MCE button */
++ { 0x800f040d, KEY_MEDIA }, /* Windows MCE button */
+ { 0x800f040e, KEY_MUTE },
+ { 0x800f040f, KEY_INFO },
+
+@@ -87,7 +87,7 @@ static struct rc_map_table rc6_mce[] = {
+
+ { 0x800f0465, KEY_POWER2 }, /* TV Power */
+ { 0x800f046e, KEY_PLAYPAUSE },
+- { 0x800f046f, KEY_MEDIA }, /* Start media application (NEW) */
++ { 0x800f046f, KEY_PLAYER }, /* Start media application (NEW) */
+
+ { 0x800f0480, KEY_BRIGHTNESSDOWN },
+ { 0x800f0481, KEY_PLAYPAUSE },
+diff --git a/drivers/media/rc/keymaps/rc-tivo.c b/drivers/media/rc/keymaps/rc-tivo.c
+new file mode 100644
+index 0000000..98ad085
+--- /dev/null
++++ b/drivers/media/rc/keymaps/rc-tivo.c
+@@ -0,0 +1,98 @@
++/* rc-tivo.c - Keytable for TiVo remotes
++ *
++ * Copyright (c) 2011 by Jarod Wilson <jarod@redhat.com>
++ *
++ * 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 <media/rc-map.h>
++
++/*
++ * Initial mapping is for the TiVo remote included in the Nero LiquidTV bundle,
++ * which also ships with a TiVo-branded IR transceiver, supported by the mceusb
++ * driver. Note that the remote uses an NEC-ish protocol, but instead of having
++ * a command/not_command pair, it has a vendor ID of 0xa10c, but some keys, the
++ * NEC extended checksums do pass, so the table presently has the intended
++ * values and the checksum-passed versions for those keys.
++ */
++static struct rc_map_table tivo[] = {
++ { 0xa10c900f, KEY_MEDIA }, /* TiVo Button */
++ { 0xa10c0807, KEY_POWER2 }, /* TV Power */
++ { 0xa10c8807, KEY_TV }, /* Live TV/Swap */
++ { 0xa10c2c03, KEY_VIDEO_NEXT }, /* TV Input */
++ { 0xa10cc807, KEY_INFO },
++ { 0xa10cfa05, KEY_CYCLEWINDOWS }, /* Window */
++ { 0x0085305f, KEY_CYCLEWINDOWS },
++ { 0xa10c6c03, KEY_EPG }, /* Guide */
++
++ { 0xa10c2807, KEY_UP },
++ { 0xa10c6807, KEY_DOWN },
++ { 0xa10ce807, KEY_LEFT },
++ { 0xa10ca807, KEY_RIGHT },
++
++ { 0xa10c1807, KEY_SCROLLDOWN }, /* Red Thumbs Down */
++ { 0xa10c9807, KEY_SELECT },
++ { 0xa10c5807, KEY_SCROLLUP }, /* Green Thumbs Up */
++
++ { 0xa10c3807, KEY_VOLUMEUP },
++ { 0xa10cb807, KEY_VOLUMEDOWN },
++ { 0xa10cd807, KEY_MUTE },
++ { 0xa10c040b, KEY_RECORD },
++ { 0xa10c7807, KEY_CHANNELUP },
++ { 0xa10cf807, KEY_CHANNELDOWN },
++ { 0x0085301f, KEY_CHANNELDOWN },
++
++ { 0xa10c840b, KEY_PLAY },
++ { 0xa10cc40b, KEY_PAUSE },
++ { 0xa10ca40b, KEY_SLOW },
++ { 0xa10c440b, KEY_REWIND },
++ { 0xa10c240b, KEY_FASTFORWARD },
++ { 0xa10c640b, KEY_PREVIOUS },
++ { 0xa10ce40b, KEY_NEXT }, /* ->| */
++
++ { 0xa10c220d, KEY_ZOOM }, /* Aspect */
++ { 0xa10c120d, KEY_STOP },
++ { 0xa10c520d, KEY_DVD }, /* DVD Menu */
++
++ { 0xa10c140b, KEY_NUMERIC_1 },
++ { 0xa10c940b, KEY_NUMERIC_2 },
++ { 0xa10c540b, KEY_NUMERIC_3 },
++ { 0xa10cd40b, KEY_NUMERIC_4 },
++ { 0xa10c340b, KEY_NUMERIC_5 },
++ { 0xa10cb40b, KEY_NUMERIC_6 },
++ { 0xa10c740b, KEY_NUMERIC_7 },
++ { 0xa10cf40b, KEY_NUMERIC_8 },
++ { 0x0085302f, KEY_NUMERIC_8 },
++ { 0xa10c0c03, KEY_NUMERIC_9 },
++ { 0xa10c8c03, KEY_NUMERIC_0 },
++ { 0xa10ccc03, KEY_ENTER },
++ { 0xa10c4c03, KEY_CLEAR },
++};
++
++static struct rc_map_list tivo_map = {
++ .map = {
++ .scan = tivo,
++ .size = ARRAY_SIZE(tivo),
++ .rc_type = RC_TYPE_NEC,
++ .name = RC_MAP_TIVO,
++ }
++};
++
++static int __init init_rc_map_tivo(void)
++{
++ return rc_map_register(&tivo_map);
++}
++
++static void __exit exit_rc_map_tivo(void)
++{
++ rc_map_unregister(&tivo_map);
++}
++
++module_init(init_rc_map_tivo)
++module_exit(exit_rc_map_tivo)
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Jarod Wilson <jarod@redhat.com>");
+diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c
+index 044fb7a..47a1c5d 100644
+--- a/drivers/media/rc/mceusb.c
++++ b/drivers/media/rc/mceusb.c
+@@ -149,6 +149,8 @@ enum mceusb_model_type {
+ POLARIS_EVK,
+ CX_HYBRID_TV,
+ MULTIFUNCTION,
++ TIVO_KIT,
++ MCE_GEN2_NO_TX,
+ };
+
+ struct mceusb_model {
+@@ -172,6 +174,10 @@ static const struct mceusb_model mceusb_model[] = {
+ [MCE_GEN2] = {
+ .mce_gen2 = 1,
+ },
++ [MCE_GEN2_NO_TX] = {
++ .mce_gen2 = 1,
++ .no_tx = 1,
++ },
+ [MCE_GEN2_TX_INV] = {
+ .mce_gen2 = 1,
+ .tx_mask_normal = 1,
+@@ -197,6 +203,10 @@ static const struct mceusb_model mceusb_model[] = {
+ .mce_gen2 = 1,
+ .ir_intfnum = 2,
+ },
++ [TIVO_KIT] = {
++ .mce_gen2 = 1,
++ .rc_map = RC_MAP_TIVO,
++ },
+ };
+
+ static struct usb_device_id mceusb_dev_table[] = {
+@@ -230,6 +230,8 @@ static struct usb_device_id mceusb_dev_table[] = {
+ { USB_DEVICE(VENDOR_PHILIPS, 0x206c) },
+ /* Philips/Spinel plus IR transceiver for ASUS */
+ { USB_DEVICE(VENDOR_PHILIPS, 0x2088) },
++ /* Philips IR transceiver (Dell branded) */
++ { USB_DEVICE(VENDOR_PHILIPS, 0x2093) },
+ /* Realtek MCE IR Receiver and card reader */
+ { USB_DEVICE(VENDOR_REALTEK, 0x0161),
+ .driver_info = MULTIFUNCTION },
+@@ -279,7 +289,8 @@ static struct usb_device_id mceusb_dev_table[] = {
+ /* Formosa21 / eHome Infrared Receiver */
+ { USB_DEVICE(VENDOR_FORMOSA, 0xe016) },
+ /* Formosa aim / Trust MCE Infrared Receiver */
+- { USB_DEVICE(VENDOR_FORMOSA, 0xe017) },
++ { USB_DEVICE(VENDOR_FORMOSA, 0xe017),
++ .driver_info = MCE_GEN2_NO_TX },
+ /* Formosa Industrial Computing / Beanbag Emulation Device */
+ { USB_DEVICE(VENDOR_FORMOSA, 0xe018) },
+ /* Formosa21 / eHome Infrared Receiver */
+@@ -308,7 +319,8 @@ static struct usb_device_id mceusb_dev_table[] = {
+ /* Northstar Systems, Inc. eHome Infrared Transceiver */
+ { USB_DEVICE(VENDOR_NORTHSTAR, 0xe004) },
+ /* TiVo PC IR Receiver */
+- { USB_DEVICE(VENDOR_TIVO, 0x2000) },
++ { USB_DEVICE(VENDOR_TIVO, 0x2000),
++ .driver_info = TIVO_KIT },
+ /* Conexant Hybrid TV "Shelby" Polaris SDK */
+ { USB_DEVICE(VENDOR_CONEXANT, 0x58a1),
+ .driver_info = POLARIS_EVK },
+diff --git a/drivers/media/rc/nuvoton-cir.c b/drivers/media/rc/nuvoton-cir.c
+index d4d6449..5d93384 100644
+--- a/drivers/media/rc/nuvoton-cir.c
++++ b/drivers/media/rc/nuvoton-cir.c
+@@ -37,8 +37,6 @@
+
+ #include "nuvoton-cir.h"
+
+-static char *chip_id = "w836x7hg";
+-
+ /* write val to config reg */
+ static inline void nvt_cr_write(struct nvt_dev *nvt, u8 val, u8 reg)
+ {
+@@ -233,6 +231,8 @@ static int nvt_hw_detect(struct nvt_dev *nvt)
+ unsigned long flags;
+ u8 chip_major, chip_minor;
+ int ret = 0;
++ char chip_id[12];
++ bool chip_unknown = false;
+
+ nvt_efm_enable(nvt);
+
+@@ -246,15 +246,39 @@ static int nvt_hw_detect(struct nvt_dev *nvt)
+ }
+
+ chip_minor = nvt_cr_read(nvt, CR_CHIP_ID_LO);
+- nvt_dbg("%s: chip id: 0x%02x 0x%02x", chip_id, chip_major, chip_minor);
+
+- if (chip_major != CHIP_ID_HIGH ||
+- (chip_minor != CHIP_ID_LOW && chip_minor != CHIP_ID_LOW2)) {
+- nvt_pr(KERN_ERR, "%s: unsupported chip, id: 0x%02x 0x%02x",
+- chip_id, chip_major, chip_minor);
+- ret = -ENODEV;
++ /* these are the known working chip revisions... */
++ switch (chip_major) {
++ case CHIP_ID_HIGH_667:
++ strcpy(chip_id, "w83667hg\0");
++ if (chip_minor != CHIP_ID_LOW_667)
++ chip_unknown = true;
++ break;
++ case CHIP_ID_HIGH_677B:
++ strcpy(chip_id, "w83677hg\0");
++ if (chip_minor != CHIP_ID_LOW_677B2 &&
++ chip_minor != CHIP_ID_LOW_677B3)
++ chip_unknown = true;
++ break;
++ case CHIP_ID_HIGH_677C:
++ strcpy(chip_id, "w83677hg-c\0");
++ if (chip_minor != CHIP_ID_LOW_677C)
++ chip_unknown = true;
++ break;
++ default:
++ strcpy(chip_id, "w836x7hg\0");
++ chip_unknown = true;
++ break;
+ }
+
++ /* warn, but still let the driver load, if we don't know this chip */
++ if (chip_unknown)
++ nvt_pr(KERN_WARNING, "%s: unknown chip, id: 0x%02x 0x%02x, "
++ "it may not work...", chip_id, chip_major, chip_minor);
++ else
++ nvt_dbg("%s: chip id: 0x%02x 0x%02x",
++ chip_id, chip_major, chip_minor);
++
+ nvt_efm_disable(nvt);
+
+ spin_lock_irqsave(&nvt->nvt_lock, flags);
+@@ -267,13 +291,23 @@ static int nvt_hw_detect(struct nvt_dev *nvt)
+
+ static void nvt_cir_ldev_init(struct nvt_dev *nvt)
+ {
+- u8 val;
++ u8 val, psreg, psmask, psval;
++
++ if (nvt->chip_major == CHIP_ID_HIGH_667) {
++ psreg = CR_MULTIFUNC_PIN_SEL;
++ psmask = MULTIFUNC_PIN_SEL_MASK;
++ psval = MULTIFUNC_ENABLE_CIR | MULTIFUNC_ENABLE_CIRWB;
++ } else {
++ psreg = CR_OUTPUT_PIN_SEL;
++ psmask = OUTPUT_PIN_SEL_MASK;
++ psval = OUTPUT_ENABLE_CIR | OUTPUT_ENABLE_CIRWB;
++ }
+
+- /* output pin selection (Pin95=CIRRX, Pin96=CIRTX1, WB enabled */
+- val = nvt_cr_read(nvt, CR_OUTPUT_PIN_SEL);
+- val &= OUTPUT_PIN_SEL_MASK;
+- val |= (OUTPUT_ENABLE_CIR | OUTPUT_ENABLE_CIRWB);
+- nvt_cr_write(nvt, val, CR_OUTPUT_PIN_SEL);
++ /* output pin selection: enable CIR, with WB sensor enabled */
++ val = nvt_cr_read(nvt, psreg);
++ val &= psmask;
++ val |= psval;
++ nvt_cr_write(nvt, val, psreg);
+
+ /* Select CIR logical device and enable */
+ nvt_select_logical_dev(nvt, LOGICAL_DEV_CIR);
+@@ -674,7 +674,7 @@ static void nvt_process_rx_ir_data(struct nvt_dev *nvt)
+ rawir.pulse ? "pulse" : "space",
+ rawir.duration);
+
+- ir_raw_event_store(nvt->rdev, &rawir);
++ ir_raw_event_store_with_filter(nvt->rdev, &rawir);
+ }
+
+ /*
+@@ -1110,12 +1110,12 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id)
+ rdev->input_id.version = nvt->chip_minor;
+ rdev->driver_name = NVT_DRIVER_NAME;
+ rdev->map_name = RC_MAP_RC6_MCE;
++ rdev->timeout = US_TO_NS(1000);
++ /* rx resolution is hardwired to 50us atm, 1, 25, 100 also possible */
++ rdev->rx_resolution = US_TO_NS(CIR_SAMPLE_PERIOD);
+ #if 0
+ rdev->min_timeout = XYZ;
+ rdev->max_timeout = XYZ;
+- rdev->timeout = XYZ;
+- /* rx resolution is hardwired to 50us atm, 1, 25, 100 also possible */
+- rdev->rx_resolution = XYZ;
+ /* tx bits */
+ rdev->tx_resolution = XYZ;
+ #endif
+diff --git a/drivers/media/rc/nuvoton-cir.h b/drivers/media/rc/nuvoton-cir.h
+index 048135e..379795d 100644
+--- a/drivers/media/rc/nuvoton-cir.h
++++ b/drivers/media/rc/nuvoton-cir.h
+@@ -330,9 +330,13 @@ struct nvt_dev {
+ #define EFER_EFM_DISABLE 0xaa
+
+ /* Chip IDs found in CR_CHIP_ID_{HI,LO} */
+-#define CHIP_ID_HIGH 0xb4
+-#define CHIP_ID_LOW 0x72
+-#define CHIP_ID_LOW2 0x73
++#define CHIP_ID_HIGH_667 0xa5
++#define CHIP_ID_HIGH_677B 0xb4
++#define CHIP_ID_HIGH_677C 0xc3
++#define CHIP_ID_LOW_667 0x13
++#define CHIP_ID_LOW_677B2 0x72
++#define CHIP_ID_LOW_677B3 0x73
++#define CHIP_ID_LOW_677C 0x33
+
+ /* Config regs we need to care about */
+ #define CR_SOFTWARE_RESET 0x02
+@@ -341,6 +345,7 @@ struct nvt_dev {
+ #define CR_CHIP_ID_LO 0x21
+ #define CR_DEV_POWER_DOWN 0x22 /* bit 2 is CIR power, default power on */
+ #define CR_OUTPUT_PIN_SEL 0x27
++#define CR_MULTIFUNC_PIN_SEL 0x2c
+ #define CR_LOGICAL_DEV_EN 0x30 /* valid for all logical devices */
+ /* next three regs valid for both the CIR and CIR_WAKE logical devices */
+ #define CR_CIR_BASE_ADDR_HI 0x60
+@@ -364,10 +369,16 @@ struct nvt_dev {
+ #define CIR_INTR_MOUSE_IRQ_BIT 0x80
+ #define PME_INTR_CIR_PASS_BIT 0x08
+
++/* w83677hg CIR pin config */
+ #define OUTPUT_PIN_SEL_MASK 0xbc
+ #define OUTPUT_ENABLE_CIR 0x01 /* Pin95=CIRRX, Pin96=CIRTX1 */
+ #define OUTPUT_ENABLE_CIRWB 0x40 /* enable wide-band sensor */
+
++/* w83667hg CIR pin config */
++#define MULTIFUNC_PIN_SEL_MASK 0x1f
++#define MULTIFUNC_ENABLE_CIR 0x80 /* Pin75=CIRRX, Pin76=CIRTX1 */
++#define MULTIFUNC_ENABLE_CIRWB 0x20 /* enable wide-band sensor */
++
+ /* MCE CIR signal length, related on sample period */
+
+ /* MCE CIR controller signal length: about 43ms
+diff --git a/drivers/staging/lirc/lirc_sasem.c b/drivers/staging/lirc/lirc_sasem.c
+index 63a438d..7080cde 100644
+--- a/drivers/staging/lirc/lirc_sasem.c
++++ b/drivers/staging/lirc/lirc_sasem.c
+@@ -570,6 +570,7 @@ static void incoming_packet(struct sasem_context *context,
+ unsigned char *buf = urb->transfer_buffer;
+ long ms;
+ struct timeval tv;
++ int i;
+
+ if (len != 8) {
+ printk(KERN_WARNING "%s: invalid incoming packet size (%d)\n",
+@@ -577,12 +578,12 @@ static void incoming_packet(struct sasem_context *context,
+ return;
+ }
+
+-#ifdef DEBUG
+- int i;
+- for (i = 0; i < 8; ++i)
+- printk(KERN_INFO "%02x ", buf[i]);
+- printk(KERN_INFO "\n");
+-#endif
++ if (debug) {
++ printk(KERN_INFO "Incoming data: ");
++ for (i = 0; i < 8; ++i)
++ printk(KERN_CONT "%02x ", buf[i]);
++ printk(KERN_CONT "\n");
++ }
+
+ /*
+ * Lirc could deal with the repeat code, but we really need to block it
+diff --git a/include/linux/input.h b/include/linux/input.h
+index e428382..be082e9 100644
+--- a/include/linux/input.h
++++ b/include/linux/input.h
+@@ -553,8 +553,8 @@ struct input_keymap_entry {
+ #define KEY_DVD 0x185 /* Media Select DVD */
+ #define KEY_AUX 0x186
+ #define KEY_MP3 0x187
+-#define KEY_AUDIO 0x188
+-#define KEY_VIDEO 0x189
++#define KEY_AUDIO 0x188 /* AL Audio Browser */
++#define KEY_VIDEO 0x189 /* AL Movie Browser */
+ #define KEY_DIRECTORY 0x18a
+ #define KEY_LIST 0x18b
+ #define KEY_MEMO 0x18c /* Media Select Messages */
+@@ -605,6 +605,7 @@ struct input_keymap_entry {
+ #define KEY_MEDIA_REPEAT 0x1b7 /* Consumer - transport control */
+ #define KEY_10CHANNELSUP 0x1b8 /* 10 channels up (10+) */
+ #define KEY_10CHANNELSDOWN 0x1b9 /* 10 channels down (10-) */
++#define KEY_IMAGES 0x1ba /* AL Image Browser */
+
+ #define KEY_DEL_EOL 0x1c0
+ #define KEY_DEL_EOS 0x1c1
+diff --git a/include/media/rc-map.h b/include/media/rc-map.h
+index 9184751..b2bd405 100644
+--- a/include/media/rc-map.h
++++ b/include/media/rc-map.h
+@@ -58,6 +58,7 @@ void rc_map_init(void);
+ #define RC_MAP_ALINK_DTU_M "rc-alink-dtu-m"
+ #define RC_MAP_ANYSEE "rc-anysee"
+ #define RC_MAP_APAC_VIEWCOMP "rc-apac-viewcomp"
++#define RC_MAP_APPLE "rc-apple"
+ #define RC_MAP_ASUS_PC39 "rc-asus-pc39"
+ #define RC_MAP_ATI_TV_WONDER_HD_600 "rc-ati-tv-wonder-hd-600"
+ #define RC_MAP_AVERMEDIA_A16D "rc-avermedia-a16d"
+@@ -136,6 +137,7 @@ void rc_map_init(void);
+ #define RC_MAP_TERRATEC_CINERGY_XS "rc-terratec-cinergy-xs"
+ #define RC_MAP_TERRATEC_SLIM "rc-terratec-slim"
+ #define RC_MAP_TEVII_NEC "rc-tevii-nec"
++#define RC_MAP_TIVO "rc-tivo"
+ #define RC_MAP_TOTAL_MEDIA_IN_HAND "rc-total-media-in-hand"
+ #define RC_MAP_TREKSTOR "rc-trekstor"
+ #define RC_MAP_TT_1500 "rc-tt-1500"
+diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c
+index accaf6c..43908a7 100644
+--- a/drivers/media/rc/ite-cir.c
++++ b/drivers/media/rc/ite-cir.c
+@@ -36,6 +36,7 @@
+ #include <linux/io.h>
+ #include <linux/interrupt.h>
+ #include <linux/sched.h>
++#include <linux/delay.h>
+ #include <linux/slab.h>
+ #include <linux/input.h>
+ #include <linux/bitops.h>
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-v4l-dvb-fixes.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-v4l-dvb-fixes.patch
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-v4l-dvb-fixes.patch
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-v4l-dvb-update.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-v4l-dvb-update.patch
new file mode 100644
index 000000000..4b5193e95
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6-v4l-dvb-update.patch
@@ -0,0 +1,7730 @@
+Deblobbed
+
+* drivers/media/dvb/siano/sms-cards.c: Adjusted.
+* drivers/staging/lirc/lirc_zilog.c: Adjusted.
+
+v4l/dvb/rc media_tree updates from 2.6.39
+
+commit f9d088784131609419595b51beb701d0f3aa6afc
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Tue Mar 22 17:23:15 2011 -0300
+
+ [media] rc: interim support for 32-bit NEC-ish scancodes
+
+ The Apple and TiVo remotes I've got use an NEC-ish protocol, but rather
+ than a command/not_command pair, they have what appear to be vendor ID
+ bytes. This change makes the NEC decoder warn if the command/not_command
+ checksum fails, but then passes along a full 32-bit scancode for keymap
+ lookup. This change should make no difference for existing keymaps,
+ since they simply won't have 32-bit scancodes, but allows for a 32-bit
+ keymap. At the moment, that'll have to be uploaded by the user, but I've
+ got Apple and TiVo remote keymaps forthcoming.
+
+ In the long run (2.6.40, hopefully), we should probably just always use
+ all 32 bits for all NEC keymaps, but this should get us by for 2.6.39.
+
+ (Note that a few of the TiVo keys actuallly *do* pass the command
+ checksum, so for now, the keymap for this remote will have to be a mix
+ of 24-bit and 32-bit scancodes, but so be it).
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit 4568844fff1dc46b8adb7364ac3a844aa34d1e38
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Fri Mar 4 20:20:47 2011 -0300
+
+ [media] mceusb: topseed 0x0011 needs gen3 init for tx to work
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit 514c3ef0671bdbdb1ae3708c63cce12e6f4b55f0
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Fri Mar 4 19:53:05 2011 -0300
+
+ [media] lirc_zilog: error out if buffer read bytes != chunk size
+
+ Give it a few tries, then exit. Prevents a possible endless loop
+ situation.
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit 7f72453889801675b825083d7ebddc341ccbb331
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Fri Mar 4 17:57:24 2011 -0300
+
+ [media] lirc: silence some compile warnings
+
+ Both lirc_imon and lirc_sasem were causing gcc to complain about the
+ possible use of uninitialized variables.
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit 37bda6318295a3412e191f1a5cb5a5bea2db59a5
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Fri Mar 4 17:31:11 2011 -0300
+
+ [media] hdpvr: use same polling interval as other OS
+
+ The hdpvr's IR part, in short, sucks. As observed with a usb traffic
+ sniffer, the Windows software for it uses a polling interval of 405ms.
+ Its still not behaving as well as I'd like even with this change, but
+ this inches us closer and closer to that point...
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit 6ba973db97845b0b7322d1a0cd5348d3024d7387
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Fri Mar 4 17:30:17 2011 -0300
+
+ [media] ir-kbd-i2c: pass device code w/key in hauppauge case
+
+ The new hauppauge key tables use both device code button code.
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit 246286a63b4820c1c039a836025c52ec79d18a2f
+Author: Mauro Carvalho Chehab <mchehab@redhat.com>
+Date: Mon Jan 24 22:23:08 2011 -0300
+
+ [media] rc/keymaps: Remove the obsolete rc-rc5-tv keymap
+
+ This keymap were used for the Hauppauge Black remote controller
+ only. It also contains some keycodes not found there. As the
+ Hauppauge Black is now part of the hauppauge keymap, just remove
+ it.
+
+ Also, remove the modprobe hacks to select between the Gray
+ and the Black versions of the remote controller as:
+ - Both are supported by default by the keymap;
+ - If the user just wants one keyboard supported,
+ it is just a matter of changing the keymap via
+ the userspace tool (ir-keytable), removing
+ the keys that he doesn't desire. As ir-keytable
+ auto-loads the keys via udev, this is better than
+ obscure modprobe parameters.
+
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit af2a42cc5eec9659bac301885ac795be81d019c8
+Author: Mauro Carvalho Chehab <mchehab@redhat.com>
+Date: Mon Jan 24 12:18:48 2011 -0300
+
+ [media] remove the old RC_MAP_HAUPPAUGE_NEW RC map
+
+ The rc-hauppauge-new map is a messy thing, as it bundles 3
+
+ different remote controllers as if they were just one,
+ discarding the address byte. Also, some key maps are wrong.
+
+ With the conversion to the new rc-core, it is likely that
+ most of the devices won't be working properly, as the i2c
+ driver and the raw decoders are now providing 16 bits for
+ the remote, instead of just 8.
+
+ delete mode 100644 drivers/media/rc/keymaps/rc-hauppauge-new.c
+
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 1ef571252ec29a8b3674deb746bfaa8ad1b034c3
+Author: Mauro Carvalho Chehab <mchehab@redhat.com>
+Date: Mon Jan 24 12:18:47 2011 -0300
+
+ [media] rc/keymaps: Rename Hauppauge table as rc-hauppauge
+
+ There are two "hauppauge-new" keymaps, one with protocol
+ unknown, and the other with the protocol marked accordingly.
+ However, both tables are miss-named.
+
+ Also, the old rc-hauppauge-new is broken, as it mixes
+ three different controllers as if they were just one.
+
+ This patch solves half of the problem by renaming the
+ correct keycode table as just rc-hauppauge. This table
+ contains the codes for the four different types of
+ remote controllers found on Hauppauge cards, properly
+ mapped with their different addresses.
+
+ create mode 100644 drivers/media/rc/keymaps/rc-hauppauge.c
+ delete mode 100644 drivers/media/rc/keymaps/rc-rc5-hauppauge-new.c
+ [Jarod: fix up RC_MAP_HAUPPAUGE defines]
+
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 41abb2ee0ac34ecd8769b2ddd84caf67414ca0f7
+Author: Mauro Carvalho Chehab <mchehab@redhat.com>
+Date: Mon Jan 24 12:18:45 2011 -0300
+
+ [media] rc-rc5-hauppauge-new: Fix Hauppauge Grey mapping
+
+ The keys for the old black were messed with the ones for the
+ hauppauge grey. Fix it.
+
+ Also, fixes some keycodes and order the keys according with
+ the way they appear inside the remote controller.
+
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 80daad9d9ece3bbfd0f7cc13dbefc92e3ebb1f6f
+Author: Mauro Carvalho Chehab <mchehab@redhat.com>
+Date: Mon Jan 24 12:18:44 2011 -0300
+
+ [media] rc-rc5-hauppauge-new: Add support for the old Black RC
+
+ Hans borrowed me an old Black Hauppauge RC. Thanks to that, we
+ can fix the RC5 table for Hauppauge.
+
+ Thanks-to: Hans Verkuil <hverkuil@xs4all.nl>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 9ba542ee399a091a56711d5bc1f778f39768a26d
+Author: Mauro Carvalho Chehab <mchehab@redhat.com>
+Date: Mon Jan 24 12:18:43 2011 -0300
+
+ [media] rc-rc5-hauppauge-new: Add the old control to the table
+
+ Adds the old grey remote controller to Hauppauge table.
+
+ Hans borrowed me an old gray Hauppauge RC. Thanks to that, we
+ can fix the RC5 table for Hauppauge.
+
+ Thanks-to: Hans Verkuil <hverkuil@xs4all.nl>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 8d198df40f2d6fe2bfb3b8818dce974b40a614e9
+Author: Mauro Carvalho Chehab <mchehab@redhat.com>
+Date: Mon Jan 24 12:18:43 2011 -0300
+
+ [media] rc-winfast: Fix the keycode tables
+
+ One of the remotes has a picture available at:
+ http://lirc.sourceforge.net/remotes/leadtek/Y04G0004.jpg
+
+ As there's one variant with a set direction keys plus vol/chann
+ keys, and the same table is used for both models, change it to
+ represent all keys, avoiding the usage of weird function keys.
+
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 434e6519a292096ee29303d74688ced038606842
+Author: Mauro Carvalho Chehab <mchehab@redhat.com>
+Date: Mon Jan 24 12:18:42 2011 -0300
+
+ [media] a800: Fix a few wrong IR key assignments
+
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 674ff915ca5d7b40d710eb910afcf7f490b76ab0
+Author: Mauro Carvalho Chehab <mchehab@redhat.com>
+Date: Mon Jan 24 12:18:41 2011 -0300
+
+ [media] opera1: Use multimedia keys instead of an app-specific mapping
+
+ This driver uses an app-specific keymap for one of the tables. This
+ is wrong. Instead, use the standard keycodes.
+
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit d59b1eedf5d5108cc90b9cfaf17f7845bad4f806
+Author: Mauro Carvalho Chehab <mchehab@redhat.com>
+Date: Mon Jan 24 12:18:40 2011 -0300
+
+ [media] dw2102: Use multimedia keys instead of an app-specific mapping
+
+ This driver uses an app-specific keymap for one of the tables. This
+ is wrong. Instead, use the standard keycodes.
+
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 651cef86ff15697ad8a5659ecc9bc43f16ca07ba
+Author: Mauro Carvalho Chehab <mchehab@redhat.com>
+Date: Mon Jan 24 12:18:39 2011 -0300
+
+ [media] rc/keymaps: Use KEY_LEFTMETA were pertinent
+
+ Using xev and testing the "Windows" key on a normal keyboard, it
+ is mapped as KEY_LEFTMETA. So, as this is the standard code for
+ it, use it, instead of a generic, meaningless KEY_PROG1.
+
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit bb8aeecec52791eacc727d8400ced9e1b230ec49
+Author: Mauro Carvalho Chehab <mchehab@redhat.com>
+Date: Mon Jan 24 12:18:38 2011 -0300
+
+ [media] rc/keymaps: Fix most KEY_PROG[n] keycodes
+
+ Those KEY_PROG[n] keys were used on places where the developer
+ didn't know for sure what key should be used. On several cases,
+ using KEY_RED, KEY_GREEN, KEY_YELLOW would be enough. On others,
+ there are specific keys for that already.
+
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit 84c122769cca37480fbcd7de5a102f6221874247
+Author: Mauro Carvalho Chehab <mchehab@redhat.com>
+Date: Mon Jan 24 12:18:37 2011 -0300
+
+ [media] rc/keymaps: Use KEY_VIDEO for Video Source
+
+ Each keyboard map were using a different definition for
+ the Source/Video Source key.
+ Behold Columbus were the only one using KEY_PROPS.
+
+ As we want to standardize those keys at X11 and at
+ userspace applications, we need to use just one code
+ for it.
+
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit ea35a76538a45e78cee889d2c462df71a9b34e4c
+Author: Mauro Carvalho Chehab <mchehab@redhat.com>
+Date: Mon Jan 24 12:18:36 2011 -0300
+
+ [media] rc/keymaps: use KEY_CAMERA for snapshots
+
+ On a few places, KEY_MHP were used for snapshots. However, KEY_CAMERA
+ is used for it on all the other keyboards that have a snapshot/Picture
+ button.
+
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+
+commit d33d27b1745fc72b042b6431dd29ee484fdabbcc
+Author: Andy Walls <awalls@md.metrocast.net>
+Date: Thu Feb 17 21:32:06 2011 -0300
+
+ [media] lirc_zilog: Update TODO list based on work completed and revised plans
+
+ Update the TODO.lirc_zilog based on what has been completed. Also revised
+ the development plan for lirc_zilog to not try and split Tx/Rx for one IR
+ transceiver unit between lirc_zilog and ir-kbd-i2c, since that would be a
+ ref-counting nightmare.
+
+ Signed-off-by: Andy Walls <awalls@md.metrocast.net>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit 1a9cb97924e71b33a5d1a59facd58e1a584daa97
+Author: Andy Walls <awalls@md.metrocast.net>
+Date: Thu Feb 17 21:14:13 2011 -0300
+
+ [media] lirc_zilog: Fix somewhat confusing information messages in ir_probe()
+
+ The total sequence of messages emitted by the ir_porbe() calls
+ for a transceiver's two i2c_clients was confusing. Clean it up a bit.
+
+ Signed-off-by: Andy Walls <awalls@md.metrocast.net>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit cf141c455938cb245b6bf489c832d0c2e3833686
+Author: Andy Walls <awalls@md.metrocast.net>
+Date: Thu Feb 17 20:50:38 2011 -0300
+
+ [media] lirc_zilog: Add locking of the i2c_clients when in use
+
+ Lock the i2c_client pointers and prevent i2c_client removal when
+ lirc_zilog is perfoming a series of operations that require valid
+ i2c_client pointers.
+
+ Signed-off-by: Andy Walls <awalls@md.metrocast.net>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit 6f4276ac6e98a05833aa7e49e438fec198e537e8
+Author: Andy Walls <awalls@md.metrocast.net>
+Date: Mon Feb 7 22:30:55 2011 -0300
+
+ [media] lirc_zilog: Add ref counting of struct IR, IR_tx, and IR_rx
+
+ This is a major change to add pointer reference counting for
+ struct IR, struct IR_tx, and struct IR_rx object instances.
+ This ref counting gets lirc_zilog closer to gracefully handling
+ bridge drivers and hot-unplugged USB devices disappearing out from
+ under lirc_zilog when the /dev/lircN node is still open. (mutexes
+ to protect the i2c_client pointers in struct IR_tx and struct IR_rx
+ still need to be added.)
+
+ This reference counting also helps lirc_zilog clean up properly
+ when the i2c_clients disappear.
+
+ Signed-off-by: Andy Walls <awalls@md.metrocast.net>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit f3bc78dbb5942f1827a97329b1c095903329aa8b
+Author: Andy Walls <awalls@md.metrocast.net>
+Date: Thu Jan 27 23:02:20 2011 -0300
+
+ [media] lirc_zilog: Move constants from ir_probe() into the lirc_driver template
+
+ ir_probe() makes a number of constant assignments into the lirc_driver
+ object after copying in a template. Make better use of the template.
+
+ Signed-off-by: Andy Walls <awalls@md.metrocast.net>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit 6f61cb53e2b8f6c65cf2c6b3e3710233c643e6ce
+Author: Andy Walls <awalls@md.metrocast.net>
+Date: Thu Jan 27 22:32:44 2011 -0300
+
+ [media] lirc_zilog: Always allocate a Rx lirc_buffer object
+
+ Always allocate a lirc_buffer object, instead of just upon setup of
+ the Rx i2c_client. If we do not allocate a lirc_buffer object, because
+ we are not handling the Rx i2c_client, lirc_dev will allocate its own
+ lirc_buffer anyway and not tell us about its location.
+
+ Signed-off-by: Andy Walls <awalls@md.metrocast.net>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit 8941d66476b33d339408f66898766e0d8ac2cb0a
+Author: Andy Walls <awalls@md.metrocast.net>
+Date: Thu Jan 27 02:34:13 2011 -0300
+
+ [media] lirc_zilog: Remove unneeded rx->buf_lock
+
+ Remove the rx->buf_lock that protected the rx->buf lirc_buffer. The
+ underlying operations on the objects within the lirc_buffer are already
+ protected by spinlocks, or the objects are constant (e.g. chunk_size).
+
+ Signed-off-by: Andy Walls <awalls@md.metrocast.net>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit fa2d70732b5699cd3bc9fc0e82c154e1410857e4
+Author: Andy Walls <awalls@md.metrocast.net>
+Date: Thu Jan 27 02:10:42 2011 -0300
+
+ [media] lirc_zilog: Don't acquire the rx->buf_lock in the poll() function
+
+ There is no need to take the rx->buf_lock in the the poll() function
+ as all the underling calls made on objects in the rx->buf lirc_buffer object
+ are protected by spinlocks.
+
+ Corrected a bad error return value in poll(): return POLLERR instead
+ of -ENODEV.
+
+ Added some comments to poll() for when, in the future, I forget what
+ poll() and poll_wait() are supposed to do.
+
+ [Jarod: minor debug spew fix]
+
+ Signed-off-by: Andy Walls <awalls@md.metrocast.net>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit 45a0dd2e9575f72693c94920e8d189ea395d5b5d
+Author: Andy Walls <awalls@md.metrocast.net>
+Date: Thu Jan 27 00:04:15 2011 -0300
+
+ [media] lirc_zilog: Use kernel standard methods for marking device non-seekable
+
+ lirc_zilog had its own llseek stub that returned -ESPIPE. Get rid of
+ it and use the kernel's no_llseek() and nonseekable_open() functions
+ instead.
+
+ Signed-off-by: Andy Walls <awalls@md.metrocast.net>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit c4c4362e1e1bd1a39f186b96ba5b0df74470f101
+Author: Andy Walls <awalls@md.metrocast.net>
+Date: Wed Jan 26 22:04:24 2011 -0300
+
+ [media] lirc_zilog: Convert the instance open count to an atomic_t
+
+ The open count is simply used for deciding if the Rx polling thread
+ needs to poll the IR chip for userspace. Simplify the manipulation
+ of the open count by using an atomic_t and not requiring a lock
+ The polling thread errantly didn't try to take the lock anyway.
+
+ Signed-off-by: Andy Walls <awalls@md.metrocast.net>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit 7f94125db5889c202b95e717ccbe9e35de63c14a
+Author: Andy Walls <awalls@md.metrocast.net>
+Date: Wed Jan 26 21:48:32 2011 -0300
+
+ [media] lirc_zilog: Convert ir_device instance array to a linked list
+
+ Signed-off-by: Andy Walls <awalls@md.metrocast.net>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit d2a47dc2e351e6cf33b98f0d3339d6d39fd8ed8b
+Author: Andy Walls <awalls@md.metrocast.net>
+Date: Wed Jan 26 21:25:47 2011 -0300
+
+ [media] lirc_zilog: Remove broken, ineffective reference counting
+
+ The set_use_inc() and set_use_dec() functions tried to lock
+ the underlying bridge driver device instance in memory by
+ changing the use count on the device's i2c_clients. This
+ worked for PCI devices (ivtv, cx18, bttv). It doesn't
+ work for hot-pluggable usb devices (pvrusb2 and hdpvr).
+ With usb device instances, the driver may get locked into
+ memory, but the unplugged hardware is gone.
+
+ The set_use_inc() set_use_dec() functions also tried to have
+ lirc_zilog change its own module refernce count, which is
+ racy and not guaranteed to work. The lirc_dev module does
+ actually perform proper module ref count manipulation on the
+ lirc_zilog module, so there is need for lirc_zilog to
+ attempt a buggy module get on itself anyway.
+
+ lirc_zilog also errantly called these functions on itself
+ in open() and close(), but lirc_dev did that already too.
+
+ So let's just gut the bodies of the set_use_*() functions,
+ and remove the extra calls to them from within lirc_zilog.
+
+ Proper reference counting of the struct IR, IR_rx, and IR_tx
+ objects -- to handle the case when the underlying
+ bttv, ivtv, cx18, hdpvr, or pvrusb2 bridge driver module or
+ device instance goes away -- will be added in subsequent
+ patches.
+
+ Signed-off-by: Andy Walls <awalls@md.metrocast.net>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit 767dd925f017bd0f0363f827509cebfaf0bb2b57
+Author: Andy Walls <awalls@md.metrocast.net>
+Date: Wed Jan 26 21:06:43 2011 -0300
+
+ [media] lirc_zilog: Restore checks for existence of the IR_tx object
+
+ This reverts commit 8090232a237ab62e22307fc060097da1a283dd66 and
+ adds an additional check for ir->tx == NULL.
+
+ The user may need us to handle an RX only unit. Apparently
+ there are TV capture units in existence with Rx only wiring
+ and/or RX only firmware for the on-board Zilog Z8 IR unit.
+
+ Signed-off-by: Andy Walls <awalls@md.metrocast.net>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit 91f27e09d7bba99341bd8ce035995ae21ff493f7
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Wed Mar 2 13:23:52 2011 -0300
+
+ [media] hdpvr: i2c master enhancements
+
+ Make the hdpvr's i2c master implementation more closely mirror that of
+ the pvrusb2 driver. Currently makes no significant difference in IR
+ reception behavior with ir-kbd-i2c (i.e., it still sucks).
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit c1ba04cf3a0626f725795e3a853654928596d522
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Tue Feb 1 16:27:05 2011 -0300
+
+ [media] imon: add more panel scancode mappings
+
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit 9cd4f638d57b01c5d901f73c94b08fad4aa0b295
+Author: Jarod Wilson <jarod@redhat.com>
+Date: Mon Jan 24 18:22:12 2011 -0300
+
+ [media] docs: fix typo in lirc_device_interface.xml
+
+ Reported-by: Daniel Burr <dburr@topcon.com>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit 97ad124749a060d8c4f5461111911474db3b555f
+Author: Mauro Carvalho Chehab <mchehab@redhat.com>
+Date: Tue Mar 22 17:17:56 2011 -0300
+
+ ite-cir: Fix a breakage caused by my cleanup patch
+
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit a38fc7a384bd679f2550e2a2323ff3e690d4ffd7
+Author: Juan J. Garcia de Soria <skandalfo@gmail.com>
+Date: Wed Mar 16 17:14:53 2011 -0300
+
+ [media] lirc: remove staging lirc_it87 and lirc_ite8709 drivers
+
+ Remove older drivers lirc_it87 and lirc_ite8709 from the LIRC staging area,
+ since they're now superceded by ite-cir.
+
+ Signed-off-by: Juan J. Garcia de Soria <skandalfo@gmail.com>
+ Tested-by: Stephan Raue <stephan@openelec.tv>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit e1bede3475c792a5c4793ec3cc929efa24aaae64
+Author: Mauro Carvalho Chehab <mchehab@redhat.com>
+Date: Tue Mar 22 15:12:40 2011 -0300
+
+ [media] ite-cir: Fix some CodingStyle issues
+
+ Cc: Juan J. Garcia de Soria <skandalfo@gmail.com>
+ Cc: Stephan Raue <stephan@openelec.tv>
+ Cc: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+commit 9e8739744ccc917011a91e489339278d7bb14eac
+Author: Juan J. Garcia de Soria <skandalfo@gmail.com>
+Date: Wed Mar 16 17:14:52 2011 -0300
+
+ [media] rc: New rc-based ite-cir driver for several ITE CIRs
+
+ This is a second version of an rc-core based driver for the ITE Tech IT8712F
+ CIR and now for a pair of other variants of the IT8512 CIR too.
+
+ This driver should replace the lirc_it87 and lirc_ite8709 currently living in
+ the LIRC staging directory.
+
+ The driver should support the ITE8704, ITE8713, ITE8708 and ITE8709 (this last
+ one yet untested) PNP ID's.
+
+ The code doesn'te reuse code from the pre-existing LIRC drivers, but has been
+ written from scratch using the nuvoton.cir driver as a skeleton.
+
+ This new driver shouldn't exhibit timing problems when running under load (or
+ with interrupts disabled for relatively long times). It works OOTB with the
+ RC6 MCE remote bundled with the ASUS EEEBox. TX support is implemented, but
+ I'm unable to test it since my hardware lacks TX capability.
+
+ Signed-off-by: Juan J. Garcia de Soria <skandalfo@gmail.com>
+ Tested-by: Stephan Raue <stephan@openelec.tv>
+ Signed-off-by: Jarod Wilson <jarod@redhat.com>
+ Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+ .../DocBook/v4l/lirc_device_interface.xml | 2 +-
+ drivers/media/dvb/dvb-usb/a800.c | 8 +-
+ drivers/media/dvb/dvb-usb/digitv.c | 2 +-
+ drivers/media/dvb/dvb-usb/dw2102.c | 40 +-
+ drivers/media/dvb/dvb-usb/opera1.c | 33 +-
+ drivers/media/dvb/siano/sms-cards.c | 2 +-
+ drivers/media/dvb/ttpci/budget-ci.c | 15 +-
+ drivers/media/rc/Kconfig | 13 +
+ drivers/media/rc/Makefile | 1 +
+ drivers/media/rc/imon.c | 11 +-
+ drivers/media/rc/ir-nec-decoder.c | 10 +-
+ drivers/media/rc/ite-cir.c | 1736 ++++++++++++++++++++
+ drivers/media/rc/ite-cir.h | 481 ++++++
+ drivers/media/rc/keymaps/Makefile | 4 +-
+ drivers/media/rc/keymaps/rc-adstech-dvb-t-pci.c | 6 +-
+ drivers/media/rc/keymaps/rc-avermedia-dvbt.c | 4 +-
+ drivers/media/rc/keymaps/rc-avermedia-m135a.c | 2 +-
+ .../media/rc/keymaps/rc-avermedia-m733a-rm-k6.c | 2 +-
+ drivers/media/rc/keymaps/rc-avermedia-rm-ks.c | 2 +-
+ drivers/media/rc/keymaps/rc-behold-columbus.c | 2 +-
+ drivers/media/rc/keymaps/rc-behold.c | 2 +-
+ drivers/media/rc/keymaps/rc-budget-ci-old.c | 3 +-
+ drivers/media/rc/keymaps/rc-cinergy.c | 2 +-
+ drivers/media/rc/keymaps/rc-dntv-live-dvb-t.c | 2 +-
+ drivers/media/rc/keymaps/rc-encore-enltv.c | 4 +-
+ drivers/media/rc/keymaps/rc-encore-enltv2.c | 2 +-
+ drivers/media/rc/keymaps/rc-flydvb.c | 4 +-
+ drivers/media/rc/keymaps/rc-hauppauge-new.c | 100 --
+ drivers/media/rc/keymaps/rc-hauppauge.c | 241 +++
+ drivers/media/rc/keymaps/rc-imon-mce.c | 2 +-
+ drivers/media/rc/keymaps/rc-imon-pad.c | 2 +-
+ drivers/media/rc/keymaps/rc-kworld-315u.c | 2 +-
+ .../media/rc/keymaps/rc-kworld-plus-tv-analog.c | 2 +-
+ drivers/media/rc/keymaps/rc-msi-tvanywhere-plus.c | 2 +-
+ drivers/media/rc/keymaps/rc-nebula.c | 2 +-
+ drivers/media/rc/keymaps/rc-norwood.c | 2 +-
+ drivers/media/rc/keymaps/rc-pctv-sedna.c | 2 +-
+ drivers/media/rc/keymaps/rc-pixelview-mk12.c | 2 +-
+ drivers/media/rc/keymaps/rc-pixelview-new.c | 2 +-
+ drivers/media/rc/keymaps/rc-pixelview.c | 2 +-
+ drivers/media/rc/keymaps/rc-pv951.c | 4 +-
+ drivers/media/rc/keymaps/rc-rc5-hauppauge-new.c | 141 --
+ drivers/media/rc/keymaps/rc-rc5-tv.c | 81 -
+ drivers/media/rc/keymaps/rc-rc6-mce.c | 2 +-
+ .../media/rc/keymaps/rc-real-audio-220-32-keys.c | 2 +-
+ drivers/media/rc/keymaps/rc-winfast.c | 22 +-
+ drivers/media/rc/mceusb.c | 4 +-
+ drivers/media/video/cx18/cx18-i2c.c | 2 +-
+ drivers/media/video/cx23885/cx23885-input.c | 2 +-
+ drivers/media/video/cx88/cx88-input.c | 4 +-
+ drivers/media/video/em28xx/em28xx-cards.c | 10 +-
+ drivers/media/video/hdpvr/hdpvr-i2c.c | 72 +-
+ drivers/media/video/ir-kbd-i2c.c | 18 +-
+ drivers/media/video/ivtv/ivtv-i2c.c | 5 +-
+ drivers/media/video/pvrusb2/pvrusb2-i2c-core.c | 4 +-
+ drivers/media/video/saa7134/saa7134-input.c | 2 +-
+ drivers/staging/lirc/Kconfig | 12 -
+ drivers/staging/lirc/Makefile | 2 -
+ drivers/staging/lirc/TODO.lirc_zilog | 51 +-
+ drivers/staging/lirc/lirc_imon.c | 2 +-
+ drivers/staging/lirc/lirc_it87.c | 1027 ------------
+ drivers/staging/lirc/lirc_it87.h | 116 --
+ drivers/staging/lirc/lirc_ite8709.c | 542 ------
+ drivers/staging/lirc/lirc_sasem.c | 2 +-
+ drivers/staging/lirc/lirc_zilog.c | 814 ++++++----
+ include/media/rc-map.h | 4 +-
+ include/media/soc_camera.h | 2 +
+ 67 files changed, 3128 insertions(+), 2513 deletions(-)
+
+---
+diff --git a/Documentation/DocBook/v4l/lirc_device_interface.xml b/Documentation/DocBook/v4l/lirc_device_interface.xml
+index 68134c0..0e0453f 100644
+--- a/Documentation/DocBook/v4l/lirc_device_interface.xml
++++ b/Documentation/DocBook/v4l/lirc_device_interface.xml
+@@ -45,7 +45,7 @@ describing an IR signal are read from the chardev.</para>
+ <para>The data written to the chardev is a pulse/space sequence of integer
+ values. Pulses and spaces are only marked implicitly by their position. The
+ data must start and end with a pulse, therefore, the data must always include
+-an unevent number of samples. The write function must block until the data has
++an uneven number of samples. The write function must block until the data has
+ been transmitted by the hardware.</para>
+ </section>
+
+diff --git a/drivers/media/dvb/dvb-usb/a800.c b/drivers/media/dvb/dvb-usb/a800.c
+index 53b93a4..f8e9bf1 100644
+--- a/drivers/media/dvb/dvb-usb/a800.c
++++ b/drivers/media/dvb/dvb-usb/a800.c
+@@ -38,8 +38,8 @@ static int a800_identify_state(struct usb_device *udev, struct dvb_usb_device_pr
+ }
+
+ static struct rc_map_table rc_map_a800_table[] = {
+- { 0x0201, KEY_PROG1 }, /* SOURCE */
+- { 0x0200, KEY_POWER }, /* POWER */
++ { 0x0201, KEY_MODE }, /* SOURCE */
++ { 0x0200, KEY_POWER2 }, /* POWER */
+ { 0x0205, KEY_1 }, /* 1 */
+ { 0x0206, KEY_2 }, /* 2 */
+ { 0x0207, KEY_3 }, /* 3 */
+@@ -52,8 +52,8 @@ static struct rc_map_table rc_map_a800_table[] = {
+ { 0x0212, KEY_LEFT }, /* L / DISPLAY */
+ { 0x0211, KEY_0 }, /* 0 */
+ { 0x0213, KEY_RIGHT }, /* R / CH RTN */
+- { 0x0217, KEY_PROG2 }, /* SNAP SHOT */
+- { 0x0210, KEY_PROG3 }, /* 16-CH PREV */
++ { 0x0217, KEY_CAMERA }, /* SNAP SHOT */
++ { 0x0210, KEY_LAST }, /* 16-CH PREV */
+ { 0x021e, KEY_VOLUMEDOWN }, /* VOL DOWN */
+ { 0x020c, KEY_ZOOM }, /* FULL SCREEN */
+ { 0x021f, KEY_VOLUMEUP }, /* VOL UP */
+diff --git a/drivers/media/dvb/dvb-usb/digitv.c b/drivers/media/dvb/dvb-usb/digitv.c
+index f2dbce7..f6344cd 100644
+--- a/drivers/media/dvb/dvb-usb/digitv.c
++++ b/drivers/media/dvb/dvb-usb/digitv.c
+@@ -176,7 +176,7 @@ static struct rc_map_table rc_map_digitv_table[] = {
+ { 0xaf59, KEY_AUX },
+ { 0x5f5a, KEY_DVD },
+ { 0x6f5a, KEY_POWER },
+- { 0x9f5a, KEY_MHP }, /* labelled 'Picture' */
++ { 0x9f5a, KEY_CAMERA }, /* labelled 'Picture' */
+ { 0xaf5a, KEY_AUDIO },
+ { 0x5f65, KEY_INFO },
+ { 0x6f65, KEY_F13 }, /* 16:9 */
+diff --git a/drivers/media/dvb/dvb-usb/dw2102.c b/drivers/media/dvb/dvb-usb/dw2102.c
+index 98cf302..f5b9da1 100644
+--- a/drivers/media/dvb/dvb-usb/dw2102.c
++++ b/drivers/media/dvb/dvb-usb/dw2102.c
+@@ -1224,8 +1224,8 @@ static int dw3101_tuner_attach(struct dvb_usb_adapter *adap)
+ }
+
+ static struct rc_map_table rc_map_dw210x_table[] = {
+- { 0xf80a, KEY_Q }, /*power*/
+- { 0xf80c, KEY_M }, /*mute*/
++ { 0xf80a, KEY_POWER2 }, /*power*/
++ { 0xf80c, KEY_MUTE }, /*mute*/
+ { 0xf811, KEY_1 },
+ { 0xf812, KEY_2 },
+ { 0xf813, KEY_3 },
+@@ -1236,25 +1236,25 @@ static struct rc_map_table rc_map_dw210x_table[] = {
+ { 0xf818, KEY_8 },
+ { 0xf819, KEY_9 },
+ { 0xf810, KEY_0 },
+- { 0xf81c, KEY_PAGEUP }, /*ch+*/
+- { 0xf80f, KEY_PAGEDOWN }, /*ch-*/
+- { 0xf81a, KEY_O }, /*vol+*/
+- { 0xf80e, KEY_Z }, /*vol-*/
+- { 0xf804, KEY_R }, /*rec*/
+- { 0xf809, KEY_D }, /*fav*/
+- { 0xf808, KEY_BACKSPACE }, /*rewind*/
+- { 0xf807, KEY_A }, /*fast*/
+- { 0xf80b, KEY_P }, /*pause*/
+- { 0xf802, KEY_ESC }, /*cancel*/
+- { 0xf803, KEY_G }, /*tab*/
++ { 0xf81c, KEY_CHANNELUP }, /*ch+*/
++ { 0xf80f, KEY_CHANNELDOWN }, /*ch-*/
++ { 0xf81a, KEY_VOLUMEUP }, /*vol+*/
++ { 0xf80e, KEY_VOLUMEDOWN }, /*vol-*/
++ { 0xf804, KEY_RECORD }, /*rec*/
++ { 0xf809, KEY_FAVORITES }, /*fav*/
++ { 0xf808, KEY_REWIND }, /*rewind*/
++ { 0xf807, KEY_FASTFORWARD }, /*fast*/
++ { 0xf80b, KEY_PAUSE }, /*pause*/
++ { 0xf802, KEY_ESC }, /*cancel*/
++ { 0xf803, KEY_TAB }, /*tab*/
+ { 0xf800, KEY_UP }, /*up*/
+- { 0xf81f, KEY_ENTER }, /*ok*/
+- { 0xf801, KEY_DOWN }, /*down*/
+- { 0xf805, KEY_C }, /*cap*/
+- { 0xf806, KEY_S }, /*stop*/
+- { 0xf840, KEY_F }, /*full*/
+- { 0xf81e, KEY_W }, /*tvmode*/
+- { 0xf81b, KEY_B }, /*recall*/
++ { 0xf81f, KEY_OK }, /*ok*/
++ { 0xf801, KEY_DOWN }, /*down*/
++ { 0xf805, KEY_CAMERA }, /*cap*/
++ { 0xf806, KEY_STOP }, /*stop*/
++ { 0xf840, KEY_ZOOM }, /*full*/
++ { 0xf81e, KEY_TV }, /*tvmode*/
++ { 0xf81b, KEY_LAST }, /*recall*/
+ };
+
+ static struct rc_map_table rc_map_tevii_table[] = {
+diff --git a/drivers/media/dvb/dvb-usb/opera1.c b/drivers/media/dvb/dvb-usb/opera1.c
+index 1f1b7d6..7e569f4 100644
+--- a/drivers/media/dvb/dvb-usb/opera1.c
++++ b/drivers/media/dvb/dvb-usb/opera1.c
+@@ -342,23 +342,22 @@ static struct rc_map_table rc_map_opera1_table[] = {
+ {0x49b6, KEY_8},
+ {0x05fa, KEY_9},
+ {0x45ba, KEY_0},
+- {0x09f6, KEY_UP}, /*chanup */
+- {0x1be5, KEY_DOWN}, /*chandown */
+- {0x5da3, KEY_LEFT}, /*voldown */
+- {0x5fa1, KEY_RIGHT}, /*volup */
+- {0x07f8, KEY_SPACE}, /*tab */
+- {0x1fe1, KEY_ENTER}, /*play ok */
+- {0x1be4, KEY_Z}, /*zoom */
+- {0x59a6, KEY_M}, /*mute */
+- {0x5ba5, KEY_F}, /*tv/f */
+- {0x19e7, KEY_R}, /*rec */
+- {0x01fe, KEY_S}, /*Stop */
+- {0x03fd, KEY_P}, /*pause */
+- {0x03fc, KEY_W}, /*<- -> */
+- {0x07f9, KEY_C}, /*capture */
+- {0x47b9, KEY_Q}, /*exit */
+- {0x43bc, KEY_O}, /*power */
+-
++ {0x09f6, KEY_CHANNELUP}, /*chanup */
++ {0x1be5, KEY_CHANNELDOWN}, /*chandown */
++ {0x5da3, KEY_VOLUMEDOWN}, /*voldown */
++ {0x5fa1, KEY_VOLUMEUP}, /*volup */
++ {0x07f8, KEY_SPACE}, /*tab */
++ {0x1fe1, KEY_OK}, /*play ok */
++ {0x1be4, KEY_ZOOM}, /*zoom */
++ {0x59a6, KEY_MUTE}, /*mute */
++ {0x5ba5, KEY_RADIO}, /*tv/f */
++ {0x19e7, KEY_RECORD}, /*rec */
++ {0x01fe, KEY_STOP}, /*Stop */
++ {0x03fd, KEY_PAUSE}, /*pause */
++ {0x03fc, KEY_SCREEN}, /*<- -> */
++ {0x07f9, KEY_CAMERA}, /*capture */
++ {0x47b9, KEY_ESC}, /*exit */
++ {0x43bc, KEY_POWER2}, /*power */
+ };
+
+ static int opera1_rc_query(struct dvb_usb_device *dev, u32 * event, int *state)
+diff --git a/drivers/media/dvb/siano/sms-cards.c b/drivers/media/dvb/siano/sms-cards.c
+index 25b43e5..af121db 100644
+--- a/drivers/media/dvb/siano/sms-cards.c
++++ b/drivers/media/dvb/siano/sms-cards.c
+@@ -64,7 +64,7 @@ static struct sms_board sms_boards[] = {
+ .type = SMS_NOVA_B0,
+ .fw[DEVICE_MODE_ISDBT_BDA] = "/*(DEBLOBBED)*/",
+ .fw[DEVICE_MODE_DVBT_BDA] = "/*(DEBLOBBED)*/",
+- .rc_codes = RC_MAP_RC5_HAUPPAUGE_NEW,
++ .rc_codes = RC_MAP_HAUPPAUGE,
+ .board_cfg.leds_power = 26,
+ .board_cfg.led0 = 27,
+ .board_cfg.led1 = 28,
+diff --git a/drivers/media/dvb/ttpci/budget-ci.c b/drivers/media/dvb/ttpci/budget-ci.c
+index b82756d..1d79ada 100644
+--- a/drivers/media/dvb/ttpci/budget-ci.c
++++ b/drivers/media/dvb/ttpci/budget-ci.c
+@@ -26,7 +26,7 @@
+ * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
+ *
+ *
+- * the project's page is at http://www.linuxtv.org/
++ * the project's page is at http://www.linuxtv.org/
+ */
+
+ #include <linux/module.h>
+@@ -102,6 +102,7 @@ struct budget_ci_ir {
+ int rc5_device;
+ u32 ir_key;
+ bool have_command;
++ bool full_rc5; /* Outputs a full RC5 code */
+ };
+
+ struct budget_ci {
+@@ -154,11 +155,18 @@ static void msp430_ir_interrupt(unsigned long data)
+ return;
+ budget_ci->ir.have_command = false;
+
+- /* FIXME: We should generate complete scancodes with device info */
+ if (budget_ci->ir.rc5_device != IR_DEVICE_ANY &&
+ budget_ci->ir.rc5_device != (command & 0x1f))
+ return;
+
++ if (budget_ci->ir.full_rc5) {
++ rc_keydown(dev,
++ budget_ci->ir.rc5_device <<8 | budget_ci->ir.ir_key,
++ (command & 0x20) ? 1 : 0);
++ return;
++ }
++
++ /* FIXME: We should generate complete scancodes for all devices */
+ rc_keydown(dev, budget_ci->ir.ir_key, (command & 0x20) ? 1 : 0);
+ }
+
+@@ -206,7 +214,8 @@ static int msp430_ir_init(struct budget_ci *budget_ci)
+ case 0x1011:
+ case 0x1012:
+ /* The hauppauge keymap is a superset of these remotes */
+- dev->map_name = RC_MAP_HAUPPAUGE_NEW;
++ dev->map_name = RC_MAP_HAUPPAUGE;
++ budget_ci->ir.full_rc5 = true;
+
+ if (rc5_device < 0)
+ budget_ci->ir.rc5_device = 0x1f;
+diff --git a/drivers/media/rc/Kconfig b/drivers/media/rc/Kconfig
+index 1143845..7f03142 100644
+--- a/drivers/media/rc/Kconfig
++++ b/drivers/media/rc/Kconfig
+@@ -135,6 +135,19 @@ config IR_MCEUSB
+ To compile this driver as a module, choose M here: the
+ module will be called mceusb.
+
++config IR_ITE_CIR
++ tristate "ITE Tech Inc. IT8712/IT8512 Consumer Infrared Transceiver"
++ depends on PNP
++ depends on RC_CORE
++ ---help---
++ Say Y here to enable support for integrated infrared receivers
++ /transceivers made by ITE Tech Inc. These are found in
++ several ASUS devices, like the ASUS Digimatrix or the ASUS
++ EEEBox 1501U.
++
++ To compile this driver as a module, choose M here: the
++ module will be called ite-cir.
++
+ config IR_NUVOTON
+ tristate "Nuvoton w836x7hg Consumer Infrared Transceiver"
+ depends on PNP
+diff --git a/drivers/media/rc/Makefile b/drivers/media/rc/Makefile
+index 67b4f7f..c6cfe70 100644
+--- a/drivers/media/rc/Makefile
++++ b/drivers/media/rc/Makefile
+@@ -14,6 +14,7 @@ obj-$(CONFIG_IR_LIRC_CODEC) += ir-lirc-codec.o
+
+ # stand-alone IR receivers/transmitters
+ obj-$(CONFIG_IR_IMON) += imon.o
++obj-$(CONFIG_IR_ITE_CIR) += ite-cir.o
+ obj-$(CONFIG_IR_MCEUSB) += mceusb.o
+ obj-$(CONFIG_IR_NUVOTON) += nuvoton-cir.o
+ obj-$(CONFIG_IR_ENE) += ene_ir.o
+diff --git a/drivers/media/rc/imon.c b/drivers/media/rc/imon.c
+index e7dc6b4..f714e1a 100644
+--- a/drivers/media/rc/imon.c
++++ b/drivers/media/rc/imon.c
+@@ -277,12 +277,21 @@ static const struct {
+ u64 hw_code;
+ u32 keycode;
+ } imon_panel_key_table[] = {
+- { 0x000000000f00ffeell, KEY_PROG1 }, /* Go */
++ { 0x000000000f00ffeell, KEY_MEDIA }, /* Go */
++ { 0x000000001200ffeell, KEY_UP },
++ { 0x000000001300ffeell, KEY_DOWN },
++ { 0x000000001400ffeell, KEY_LEFT },
++ { 0x000000001500ffeell, KEY_RIGHT },
++ { 0x000000001600ffeell, KEY_ENTER },
++ { 0x000000001700ffeell, KEY_ESC },
+ { 0x000000001f00ffeell, KEY_AUDIO },
+ { 0x000000002000ffeell, KEY_VIDEO },
+ { 0x000000002100ffeell, KEY_CAMERA },
+ { 0x000000002700ffeell, KEY_DVD },
+ { 0x000000002300ffeell, KEY_TV },
++ { 0x000000002b00ffeell, KEY_EXIT },
++ { 0x000000002c00ffeell, KEY_SELECT },
++ { 0x000000002d00ffeell, KEY_MENU },
+ { 0x000000000500ffeell, KEY_PREVIOUS },
+ { 0x000000000700ffeell, KEY_REWIND },
+ { 0x000000000400ffeell, KEY_STOP },
+diff --git a/drivers/media/rc/ir-nec-decoder.c b/drivers/media/rc/ir-nec-decoder.c
+index 7b58b4a..63ee722 100644
+--- a/drivers/media/rc/ir-nec-decoder.c
++++ b/drivers/media/rc/ir-nec-decoder.c
+@@ -49,6 +49,7 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev)
+ struct nec_dec *data = &dev->raw->nec;
+ u32 scancode;
+ u8 address, not_address, command, not_command;
++ bool send_32bits = false;
+
+ if (!(dev->raw->enabled_protocols & RC_TYPE_NEC))
+ return 0;
+@@ -164,10 +165,15 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev)
+ if ((command ^ not_command) != 0xff) {
+ IR_dprintk(1, "NEC checksum error: received 0x%08x\n",
+ data->bits);
+- break;
++ send_32bits = true;
+ }
+
+- if ((address ^ not_address) != 0xff) {
++ if (send_32bits) {
++ /* NEC transport, but modified protocol, used by at
++ * least Apple and TiVo remotes */
++ scancode = data->bits;
++ IR_dprintk(1, "NEC (modified) scancode 0x%08x\n", scancode);
++ } else if ((address ^ not_address) != 0xff) {
+ /* Extended NEC */
+ scancode = address << 16 |
+ not_address << 8 |
+diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c
+new file mode 100644
+index 0000000..9be6a83
+--- /dev/null
++++ b/drivers/media/rc/ite-cir.c
+@@ -0,0 +1,1736 @@
++/*
++ * Driver for ITE Tech Inc. IT8712F/IT8512 CIR
++ *
++ * Copyright (C) 2010 Juan Jesús García de Soria <skandalfo@gmail.com>
++ *
++ * 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.
++ *
++ * Inspired by the original lirc_it87 and lirc_ite8709 drivers, on top of the
++ * skeleton provided by the nuvoton-cir driver.
++ *
++ * The lirc_it87 driver was originally written by Hans-Gunter Lutke Uphues
++ * <hg_lu@web.de> in 2001, with enhancements by Christoph Bartelmus
++ * <lirc@bartelmus.de>, Andrew Calkin <r_tay@hotmail.com> and James Edwards
++ * <jimbo-lirc@edwardsclan.net>.
++ *
++ * The lirc_ite8709 driver was written by Grégory Lardière
++ * <spmf2004-lirc@yahoo.fr> in 2008.
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/pnp.h>
++#include <linux/io.h>
++#include <linux/interrupt.h>
++#include <linux/sched.h>
++#include <linux/slab.h>
++#include <linux/input.h>
++#include <linux/bitops.h>
++#include <media/rc-core.h>
++#include <linux/pci_ids.h>
++
++#include "ite-cir.h"
++
++/* module parameters */
++
++/* debug level */
++static int debug;
++module_param(debug, int, S_IRUGO | S_IWUSR);
++MODULE_PARM_DESC(debug, "Enable debugging output");
++
++/* low limit for RX carrier freq, Hz, 0 for no RX demodulation */
++static int rx_low_carrier_freq;
++module_param(rx_low_carrier_freq, int, S_IRUGO | S_IWUSR);
++MODULE_PARM_DESC(rx_low_carrier_freq, "Override low RX carrier frequency, Hz, "
++ "0 for no RX demodulation");
++
++/* high limit for RX carrier freq, Hz, 0 for no RX demodulation */
++static int rx_high_carrier_freq;
++module_param(rx_high_carrier_freq, int, S_IRUGO | S_IWUSR);
++MODULE_PARM_DESC(rx_high_carrier_freq, "Override high RX carrier frequency, "
++ "Hz, 0 for no RX demodulation");
++
++/* override tx carrier frequency */
++static int tx_carrier_freq;
++module_param(tx_carrier_freq, int, S_IRUGO | S_IWUSR);
++MODULE_PARM_DESC(tx_carrier_freq, "Override TX carrier frequency, Hz");
++
++/* override tx duty cycle */
++static int tx_duty_cycle;
++module_param(tx_duty_cycle, int, S_IRUGO | S_IWUSR);
++MODULE_PARM_DESC(tx_duty_cycle, "Override TX duty cycle, 1-100");
++
++/* override default sample period */
++static long sample_period;
++module_param(sample_period, long, S_IRUGO | S_IWUSR);
++MODULE_PARM_DESC(sample_period, "Override carrier sample period, us");
++
++/* override detected model id */
++static int model_number = -1;
++module_param(model_number, int, S_IRUGO | S_IWUSR);
++MODULE_PARM_DESC(model_number, "Use this model number, don't autodetect");
++
++
++/* HW-independent code functions */
++
++/* check whether carrier frequency is high frequency */
++static inline bool ite_is_high_carrier_freq(unsigned int freq)
++{
++ return freq >= ITE_HCF_MIN_CARRIER_FREQ;
++}
++
++/* get the bits required to program the carrier frequency in CFQ bits,
++ * unshifted */
++static u8 ite_get_carrier_freq_bits(unsigned int freq)
++{
++ if (ite_is_high_carrier_freq(freq)) {
++ if (freq < 425000)
++ return ITE_CFQ_400;
++
++ else if (freq < 465000)
++ return ITE_CFQ_450;
++
++ else if (freq < 490000)
++ return ITE_CFQ_480;
++
++ else
++ return ITE_CFQ_500;
++ } else {
++ /* trim to limits */
++ if (freq < ITE_LCF_MIN_CARRIER_FREQ)
++ freq = ITE_LCF_MIN_CARRIER_FREQ;
++ if (freq > ITE_LCF_MAX_CARRIER_FREQ)
++ freq = ITE_LCF_MAX_CARRIER_FREQ;
++
++ /* convert to kHz and subtract the base freq */
++ freq =
++ DIV_ROUND_CLOSEST(freq - ITE_LCF_MIN_CARRIER_FREQ,
++ 1000);
++
++ return (u8) freq;
++ }
++}
++
++/* get the bits required to program the pulse with in TXMPW */
++static u8 ite_get_pulse_width_bits(unsigned int freq, int duty_cycle)
++{
++ unsigned long period_ns, on_ns;
++
++ /* sanitize freq into range */
++ if (freq < ITE_LCF_MIN_CARRIER_FREQ)
++ freq = ITE_LCF_MIN_CARRIER_FREQ;
++ if (freq > ITE_HCF_MAX_CARRIER_FREQ)
++ freq = ITE_HCF_MAX_CARRIER_FREQ;
++
++ period_ns = 1000000000UL / freq;
++ on_ns = period_ns * duty_cycle / 100;
++
++ if (ite_is_high_carrier_freq(freq)) {
++ if (on_ns < 750)
++ return ITE_TXMPW_A;
++
++ else if (on_ns < 850)
++ return ITE_TXMPW_B;
++
++ else if (on_ns < 950)
++ return ITE_TXMPW_C;
++
++ else if (on_ns < 1080)
++ return ITE_TXMPW_D;
++
++ else
++ return ITE_TXMPW_E;
++ } else {
++ if (on_ns < 6500)
++ return ITE_TXMPW_A;
++
++ else if (on_ns < 7850)
++ return ITE_TXMPW_B;
++
++ else if (on_ns < 9650)
++ return ITE_TXMPW_C;
++
++ else if (on_ns < 11950)
++ return ITE_TXMPW_D;
++
++ else
++ return ITE_TXMPW_E;
++ }
++}
++
++/* decode raw bytes as received by the hardware, and push them to the ir-core
++ * layer */
++static void ite_decode_bytes(struct ite_dev *dev, const u8 * data, int
++ length)
++{
++ u32 sample_period;
++ unsigned long *ldata;
++ unsigned int next_one, next_zero, size;
++ DEFINE_IR_RAW_EVENT(ev);
++
++ if (length == 0)
++ return;
++
++ sample_period = dev->params.sample_period;
++ ldata = (unsigned long *)data;
++ size = length << 3;
++ next_one = generic_find_next_le_bit(ldata, size, 0);
++ if (next_one > 0) {
++ ev.pulse = true;
++ ev.duration =
++ ITE_BITS_TO_NS(next_one, sample_period);
++ ir_raw_event_store_with_filter(dev->rdev, &ev);
++ }
++
++ while (next_one < size) {
++ next_zero = generic_find_next_zero_le_bit(ldata, size, next_one + 1);
++ ev.pulse = false;
++ ev.duration = ITE_BITS_TO_NS(next_zero - next_one, sample_period);
++ ir_raw_event_store_with_filter(dev->rdev, &ev);
++
++ if (next_zero < size) {
++ next_one =
++ generic_find_next_le_bit(ldata,
++ size,
++ next_zero + 1);
++ ev.pulse = true;
++ ev.duration =
++ ITE_BITS_TO_NS(next_one - next_zero,
++ sample_period);
++ ir_raw_event_store_with_filter
++ (dev->rdev, &ev);
++ } else
++ next_one = size;
++ }
++
++ ir_raw_event_handle(dev->rdev);
++
++ ite_dbg_verbose("decoded %d bytes.", length);
++}
++
++/* set all the rx/tx carrier parameters; this must be called with the device
++ * spinlock held */
++static void ite_set_carrier_params(struct ite_dev *dev)
++{
++ unsigned int freq, low_freq, high_freq;
++ int allowance;
++ bool use_demodulator;
++ bool for_tx = dev->transmitting;
++
++ ite_dbg("%s called", __func__);
++
++ if (for_tx) {
++ /* we don't need no stinking calculations */
++ freq = dev->params.tx_carrier_freq;
++ allowance = ITE_RXDCR_DEFAULT;
++ use_demodulator = false;
++ } else {
++ low_freq = dev->params.rx_low_carrier_freq;
++ high_freq = dev->params.rx_high_carrier_freq;
++
++ if (low_freq == 0) {
++ /* don't demodulate */
++ freq =
++ ITE_DEFAULT_CARRIER_FREQ;
++ allowance = ITE_RXDCR_DEFAULT;
++ use_demodulator = false;
++ } else {
++ /* calculate the middle freq */
++ freq = (low_freq + high_freq) / 2;
++
++ /* calculate the allowance */
++ allowance =
++ DIV_ROUND_CLOSEST(10000 * (high_freq - low_freq),
++ ITE_RXDCR_PER_10000_STEP
++ * (high_freq + low_freq));
++
++ if (allowance < 1)
++ allowance = 1;
++
++ if (allowance > ITE_RXDCR_MAX)
++ allowance = ITE_RXDCR_MAX;
++ }
++ }
++
++ /* set the carrier parameters in a device-dependent way */
++ dev->params.set_carrier_params(dev, ite_is_high_carrier_freq(freq),
++ use_demodulator, ite_get_carrier_freq_bits(freq), allowance,
++ ite_get_pulse_width_bits(freq, dev->params.tx_duty_cycle));
++}
++
++/* interrupt service routine for incoming and outgoing CIR data */
++static irqreturn_t ite_cir_isr(int irq, void *data)
++{
++ struct ite_dev *dev = data;
++ unsigned long flags;
++ irqreturn_t ret = IRQ_RETVAL(IRQ_NONE);
++ u8 rx_buf[ITE_RX_FIFO_LEN];
++ int rx_bytes;
++ int iflags;
++
++ ite_dbg_verbose("%s firing", __func__);
++
++ /* grab the spinlock */
++ spin_lock_irqsave(&dev->lock, flags);
++
++ /* read the interrupt flags */
++ iflags = dev->params.get_irq_causes(dev);
++
++ /* check for the receive interrupt */
++ if (iflags & (ITE_IRQ_RX_FIFO | ITE_IRQ_RX_FIFO_OVERRUN)) {
++ /* read the FIFO bytes */
++ rx_bytes =
++ dev->params.get_rx_bytes(dev, rx_buf,
++ ITE_RX_FIFO_LEN);
++
++ if (rx_bytes > 0) {
++ /* drop the spinlock, since the ir-core layer
++ * may call us back again through
++ * ite_s_idle() */
++ spin_unlock_irqrestore(&dev->
++ lock,
++ flags);
++
++ /* decode the data we've just received */
++ ite_decode_bytes(dev, rx_buf,
++ rx_bytes);
++
++ /* reacquire the spinlock */
++ spin_lock_irqsave(&dev->lock,
++ flags);
++
++ /* mark the interrupt as serviced */
++ ret = IRQ_RETVAL(IRQ_HANDLED);
++ }
++ } else if (iflags & ITE_IRQ_TX_FIFO) {
++ /* FIFO space available interrupt */
++ ite_dbg_verbose("got interrupt for TX FIFO");
++
++ /* wake any sleeping transmitter */
++ wake_up_interruptible(&dev->tx_queue);
++
++ /* mark the interrupt as serviced */
++ ret = IRQ_RETVAL(IRQ_HANDLED);
++ }
++
++ /* drop the spinlock */
++ spin_unlock_irqrestore(&dev->lock, flags);
++
++ ite_dbg_verbose("%s done returning %d", __func__, (int)ret);
++
++ return ret;
++}
++
++/* set the rx carrier freq range, guess it's in Hz... */
++static int ite_set_rx_carrier_range(struct rc_dev *rcdev, u32 carrier_low, u32
++ carrier_high)
++{
++ unsigned long flags;
++ struct ite_dev *dev = rcdev->priv;
++
++ spin_lock_irqsave(&dev->lock, flags);
++ dev->params.rx_low_carrier_freq = carrier_low;
++ dev->params.rx_high_carrier_freq = carrier_high;
++ ite_set_carrier_params(dev);
++ spin_unlock_irqrestore(&dev->lock, flags);
++
++ return 0;
++}
++
++/* set the tx carrier freq, guess it's in Hz... */
++static int ite_set_tx_carrier(struct rc_dev *rcdev, u32 carrier)
++{
++ unsigned long flags;
++ struct ite_dev *dev = rcdev->priv;
++
++ spin_lock_irqsave(&dev->lock, flags);
++ dev->params.tx_carrier_freq = carrier;
++ ite_set_carrier_params(dev);
++ spin_unlock_irqrestore(&dev->lock, flags);
++
++ return 0;
++}
++
++/* set the tx duty cycle by controlling the pulse width */
++static int ite_set_tx_duty_cycle(struct rc_dev *rcdev, u32 duty_cycle)
++{
++ unsigned long flags;
++ struct ite_dev *dev = rcdev->priv;
++
++ spin_lock_irqsave(&dev->lock, flags);
++ dev->params.tx_duty_cycle = duty_cycle;
++ ite_set_carrier_params(dev);
++ spin_unlock_irqrestore(&dev->lock, flags);
++
++ return 0;
++}
++
++/* transmit out IR pulses; what you get here is a batch of alternating
++ * pulse/space/pulse/space lengths that we should write out completely through
++ * the FIFO, blocking on a full FIFO */
++static int ite_tx_ir(struct rc_dev *rcdev, int *txbuf, u32 n)
++{
++ unsigned long flags;
++ struct ite_dev *dev = rcdev->priv;
++ bool is_pulse = false;
++ int remaining_us, fifo_avail, fifo_remaining, last_idx = 0;
++ int max_rle_us, next_rle_us;
++ int ret = n;
++ u8 last_sent[ITE_TX_FIFO_LEN];
++ u8 val;
++
++ ite_dbg("%s called", __func__);
++
++ /* clear the array just in case */
++ memset(last_sent, 0, ARRAY_SIZE(last_sent));
++
++ /* n comes in bytes; convert to ints */
++ n /= sizeof(int);
++
++ spin_lock_irqsave(&dev->lock, flags);
++
++ /* let everybody know we're now transmitting */
++ dev->transmitting = true;
++
++ /* and set the carrier values for transmission */
++ ite_set_carrier_params(dev);
++
++ /* calculate how much time we can send in one byte */
++ max_rle_us =
++ (ITE_BAUDRATE_DIVISOR * dev->params.sample_period *
++ ITE_TX_MAX_RLE) / 1000;
++
++ /* disable the receiver */
++ dev->params.disable_rx(dev);
++
++ /* this is where we'll begin filling in the FIFO, until it's full.
++ * then we'll just activate the interrupt, wait for it to wake us up
++ * again, disable it, continue filling the FIFO... until everything
++ * has been pushed out */
++ fifo_avail =
++ ITE_TX_FIFO_LEN - dev->params.get_tx_used_slots(dev);
++
++ while (n > 0 && dev->in_use) {
++ /* transmit the next sample */
++ is_pulse = !is_pulse;
++ remaining_us = *(txbuf++);
++ n--;
++
++ ite_dbg("%s: %ld",
++ ((is_pulse) ? "pulse" : "space"),
++ (long int)
++ remaining_us);
++
++ /* repeat while the pulse is non-zero length */
++ while (remaining_us > 0 && dev->in_use) {
++ if (remaining_us > max_rle_us)
++ next_rle_us = max_rle_us;
++
++ else
++ next_rle_us = remaining_us;
++
++ remaining_us -= next_rle_us;
++
++ /* check what's the length we have to pump out */
++ val = (ITE_TX_MAX_RLE * next_rle_us) / max_rle_us;
++
++ /* put it into the sent buffer */
++ last_sent[last_idx++] = val;
++ last_idx &= (ITE_TX_FIFO_LEN);
++
++ /* encode it for 7 bits */
++ val = (val - 1) & ITE_TX_RLE_MASK;
++
++ /* take into account pulse/space prefix */
++ if (is_pulse)
++ val |= ITE_TX_PULSE;
++
++ else
++ val |= ITE_TX_SPACE;
++
++ /*
++ * if we get to 0 available, read again, just in case
++ * some other slot got freed
++ */
++ if (fifo_avail <= 0)
++ fifo_avail = ITE_TX_FIFO_LEN - dev->params.get_tx_used_slots(dev);
++
++ /* if it's still full */
++ if (fifo_avail <= 0) {
++ /* enable the tx interrupt */
++ dev->params.
++ enable_tx_interrupt(dev);
++
++ /* drop the spinlock */
++ spin_unlock_irqrestore(&dev->lock, flags);
++
++ /* wait for the FIFO to empty enough */
++ wait_event_interruptible(dev->tx_queue, (fifo_avail = ITE_TX_FIFO_LEN - dev->params.get_tx_used_slots(dev)) >= 8);
++
++ /* get the spinlock again */
++ spin_lock_irqsave(&dev->lock, flags);
++
++ /* disable the tx interrupt again. */
++ dev->params.
++ disable_tx_interrupt(dev);
++ }
++
++ /* now send the byte through the FIFO */
++ dev->params.put_tx_byte(dev, val);
++ fifo_avail--;
++ }
++ }
++
++ /* wait and don't return until the whole FIFO has been sent out;
++ * otherwise we could configure the RX carrier params instead of the
++ * TX ones while the transmission is still being performed! */
++ fifo_remaining = dev->params.get_tx_used_slots(dev);
++ remaining_us = 0;
++ while (fifo_remaining > 0) {
++ fifo_remaining--;
++ last_idx--;
++ last_idx &= (ITE_TX_FIFO_LEN - 1);
++ remaining_us += last_sent[last_idx];
++ }
++ remaining_us = (remaining_us * max_rle_us) / (ITE_TX_MAX_RLE);
++
++ /* drop the spinlock while we sleep */
++ spin_unlock_irqrestore(&dev->lock, flags);
++
++ /* sleep remaining_us microseconds */
++ mdelay(DIV_ROUND_UP(remaining_us, 1000));
++
++ /* reacquire the spinlock */
++ spin_lock_irqsave(&dev->lock, flags);
++
++ /* now we're not transmitting anymore */
++ dev->transmitting = false;
++
++ /* and set the carrier values for reception */
++ ite_set_carrier_params(dev);
++
++ /* reenable the receiver */
++ if (dev->in_use)
++ dev->params.enable_rx(dev);
++
++ /* notify transmission end */
++ wake_up_interruptible(&dev->tx_ended);
++
++ spin_unlock_irqrestore(&dev->lock, flags);
++
++ return ret;
++}
++
++/* idle the receiver if needed */
++static void ite_s_idle(struct rc_dev *rcdev, bool enable)
++{
++ unsigned long flags;
++ struct ite_dev *dev = rcdev->priv;
++
++ ite_dbg("%s called", __func__);
++
++ if (enable) {
++ spin_lock_irqsave(&dev->lock, flags);
++ dev->params.idle_rx(dev);
++ spin_unlock_irqrestore(&dev->lock, flags);
++ }
++}
++
++
++/* IT8712F HW-specific functions */
++
++/* retrieve a bitmask of the current causes for a pending interrupt; this may
++ * be composed of ITE_IRQ_TX_FIFO, ITE_IRQ_RX_FIFO and ITE_IRQ_RX_FIFO_OVERRUN
++ * */
++static int it87_get_irq_causes(struct ite_dev *dev)
++{
++ u8 iflags;
++ int ret = 0;
++
++ ite_dbg("%s called", __func__);
++
++ /* read the interrupt flags */
++ iflags = inb(dev->cir_addr + IT87_IIR) & IT87_II;
++
++ switch (iflags) {
++ case IT87_II_RXDS:
++ ret = ITE_IRQ_RX_FIFO;
++ break;
++ case IT87_II_RXFO:
++ ret = ITE_IRQ_RX_FIFO_OVERRUN;
++ break;
++ case IT87_II_TXLDL:
++ ret = ITE_IRQ_TX_FIFO;
++ break;
++ }
++
++ return ret;
++}
++
++/* set the carrier parameters; to be called with the spinlock held */
++static void it87_set_carrier_params(struct ite_dev *dev, bool high_freq,
++ bool use_demodulator,
++ u8 carrier_freq_bits, u8 allowance_bits,
++ u8 pulse_width_bits)
++{
++ u8 val;
++
++ ite_dbg("%s called", __func__);
++
++ /* program the RCR register */
++ val = inb(dev->cir_addr + IT87_RCR)
++ & ~(IT87_HCFS | IT87_RXEND | IT87_RXDCR);
++
++ if (high_freq)
++ val |= IT87_HCFS;
++
++ if (use_demodulator)
++ val |= IT87_RXEND;
++
++ val |= allowance_bits;
++
++ outb(val, dev->cir_addr + IT87_RCR);
++
++ /* program the TCR2 register */
++ outb((carrier_freq_bits << IT87_CFQ_SHIFT) | pulse_width_bits,
++ dev->cir_addr + IT87_TCR2);
++}
++
++/* read up to buf_size bytes from the RX FIFO; to be called with the spinlock
++ * held */
++static int it87_get_rx_bytes(struct ite_dev *dev, u8 * buf, int buf_size)
++{
++ int fifo, read = 0;
++
++ ite_dbg("%s called", __func__);
++
++ /* read how many bytes are still in the FIFO */
++ fifo = inb(dev->cir_addr + IT87_RSR) & IT87_RXFBC;
++
++ while (fifo > 0 && buf_size > 0) {
++ *(buf++) = inb(dev->cir_addr + IT87_DR);
++ fifo--;
++ read++;
++ buf_size--;
++ }
++
++ return read;
++}
++
++/* return how many bytes are still in the FIFO; this will be called
++ * with the device spinlock NOT HELD while waiting for the TX FIFO to get
++ * empty; let's expect this won't be a problem */
++static int it87_get_tx_used_slots(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ return inb(dev->cir_addr + IT87_TSR) & IT87_TXFBC;
++}
++
++/* put a byte to the TX fifo; this should be called with the spinlock held */
++static void it87_put_tx_byte(struct ite_dev *dev, u8 value)
++{
++ outb(value, dev->cir_addr + IT87_DR);
++}
++
++/* idle the receiver so that we won't receive samples until another
++ pulse is detected; this must be called with the device spinlock held */
++static void it87_idle_rx(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* disable streaming by clearing RXACT writing it as 1 */
++ outb(inb(dev->cir_addr + IT87_RCR) | IT87_RXACT,
++ dev->cir_addr + IT87_RCR);
++
++ /* clear the FIFO */
++ outb(inb(dev->cir_addr + IT87_TCR1) | IT87_FIFOCLR,
++ dev->cir_addr + IT87_TCR1);
++}
++
++/* disable the receiver; this must be called with the device spinlock held */
++static void it87_disable_rx(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* disable the receiver interrupts */
++ outb(inb(dev->cir_addr + IT87_IER) & ~(IT87_RDAIE | IT87_RFOIE),
++ dev->cir_addr + IT87_IER);
++
++ /* disable the receiver */
++ outb(inb(dev->cir_addr + IT87_RCR) & ~IT87_RXEN,
++ dev->cir_addr + IT87_RCR);
++
++ /* clear the FIFO and RXACT (actually RXACT should have been cleared
++ * in the previous outb() call) */
++ it87_idle_rx(dev);
++}
++
++/* enable the receiver; this must be called with the device spinlock held */
++static void it87_enable_rx(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* enable the receiver by setting RXEN */
++ outb(inb(dev->cir_addr + IT87_RCR) | IT87_RXEN,
++ dev->cir_addr + IT87_RCR);
++
++ /* just prepare it to idle for the next reception */
++ it87_idle_rx(dev);
++
++ /* enable the receiver interrupts and master enable flag */
++ outb(inb(dev->cir_addr + IT87_IER) | IT87_RDAIE | IT87_RFOIE | IT87_IEC,
++ dev->cir_addr + IT87_IER);
++}
++
++/* disable the transmitter interrupt; this must be called with the device
++ * spinlock held */
++static void it87_disable_tx_interrupt(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* disable the transmitter interrupts */
++ outb(inb(dev->cir_addr + IT87_IER) & ~IT87_TLDLIE,
++ dev->cir_addr + IT87_IER);
++}
++
++/* enable the transmitter interrupt; this must be called with the device
++ * spinlock held */
++static void it87_enable_tx_interrupt(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* enable the transmitter interrupts and master enable flag */
++ outb(inb(dev->cir_addr + IT87_IER) | IT87_TLDLIE | IT87_IEC,
++ dev->cir_addr + IT87_IER);
++}
++
++/* disable the device; this must be called with the device spinlock held */
++static void it87_disable(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* clear out all interrupt enable flags */
++ outb(inb(dev->cir_addr + IT87_IER) &
++ ~(IT87_IEC | IT87_RFOIE | IT87_RDAIE | IT87_TLDLIE),
++ dev->cir_addr + IT87_IER);
++
++ /* disable the receiver */
++ it87_disable_rx(dev);
++
++ /* erase the FIFO */
++ outb(IT87_FIFOCLR | inb(dev->cir_addr + IT87_TCR1),
++ dev->cir_addr + IT87_TCR1);
++}
++
++/* initialize the hardware */
++static void it87_init_hardware(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* enable just the baud rate divisor register,
++ disabling all the interrupts at the same time */
++ outb((inb(dev->cir_addr + IT87_IER) &
++ ~(IT87_IEC | IT87_RFOIE | IT87_RDAIE | IT87_TLDLIE)) | IT87_BR,
++ dev->cir_addr + IT87_IER);
++
++ /* write out the baud rate divisor */
++ outb(ITE_BAUDRATE_DIVISOR & 0xff, dev->cir_addr + IT87_BDLR);
++ outb((ITE_BAUDRATE_DIVISOR >> 8) & 0xff, dev->cir_addr + IT87_BDHR);
++
++ /* disable the baud rate divisor register again */
++ outb(inb(dev->cir_addr + IT87_IER) & ~IT87_BR,
++ dev->cir_addr + IT87_IER);
++
++ /* program the RCR register defaults */
++ outb(ITE_RXDCR_DEFAULT, dev->cir_addr + IT87_RCR);
++
++ /* program the TCR1 register */
++ outb(IT87_TXMPM_DEFAULT | IT87_TXENDF | IT87_TXRLE
++ | IT87_FIFOTL_DEFAULT | IT87_FIFOCLR,
++ dev->cir_addr + IT87_TCR1);
++
++ /* program the carrier parameters */
++ ite_set_carrier_params(dev);
++}
++
++/* IT8512F on ITE8708 HW-specific functions */
++
++/* retrieve a bitmask of the current causes for a pending interrupt; this may
++ * be composed of ITE_IRQ_TX_FIFO, ITE_IRQ_RX_FIFO and ITE_IRQ_RX_FIFO_OVERRUN
++ * */
++static int it8708_get_irq_causes(struct ite_dev *dev)
++{
++ u8 iflags;
++ int ret = 0;
++
++ ite_dbg("%s called", __func__);
++
++ /* read the interrupt flags */
++ iflags = inb(dev->cir_addr + IT8708_C0IIR);
++
++ if (iflags & IT85_TLDLI)
++ ret |= ITE_IRQ_TX_FIFO;
++ if (iflags & IT85_RDAI)
++ ret |= ITE_IRQ_RX_FIFO;
++ if (iflags & IT85_RFOI)
++ ret |= ITE_IRQ_RX_FIFO_OVERRUN;
++
++ return ret;
++}
++
++/* set the carrier parameters; to be called with the spinlock held */
++static void it8708_set_carrier_params(struct ite_dev *dev, bool high_freq,
++ bool use_demodulator,
++ u8 carrier_freq_bits, u8 allowance_bits,
++ u8 pulse_width_bits)
++{
++ u8 val;
++
++ ite_dbg("%s called", __func__);
++
++ /* program the C0CFR register, with HRAE=1 */
++ outb(inb(dev->cir_addr + IT8708_BANKSEL) | IT8708_HRAE,
++ dev->cir_addr + IT8708_BANKSEL);
++
++ val = (inb(dev->cir_addr + IT8708_C0CFR)
++ & ~(IT85_HCFS | IT85_CFQ)) | carrier_freq_bits;
++
++ if (high_freq)
++ val |= IT85_HCFS;
++
++ outb(val, dev->cir_addr + IT8708_C0CFR);
++
++ outb(inb(dev->cir_addr + IT8708_BANKSEL) & ~IT8708_HRAE,
++ dev->cir_addr + IT8708_BANKSEL);
++
++ /* program the C0RCR register */
++ val = inb(dev->cir_addr + IT8708_C0RCR)
++ & ~(IT85_RXEND | IT85_RXDCR);
++
++ if (use_demodulator)
++ val |= IT85_RXEND;
++
++ val |= allowance_bits;
++
++ outb(val, dev->cir_addr + IT8708_C0RCR);
++
++ /* program the C0TCR register */
++ val = inb(dev->cir_addr + IT8708_C0TCR) & ~IT85_TXMPW;
++ val |= pulse_width_bits;
++ outb(val, dev->cir_addr + IT8708_C0TCR);
++}
++
++/* read up to buf_size bytes from the RX FIFO; to be called with the spinlock
++ * held */
++static int it8708_get_rx_bytes(struct ite_dev *dev, u8 * buf, int buf_size)
++{
++ int fifo, read = 0;
++
++ ite_dbg("%s called", __func__);
++
++ /* read how many bytes are still in the FIFO */
++ fifo = inb(dev->cir_addr + IT8708_C0RFSR) & IT85_RXFBC;
++
++ while (fifo > 0 && buf_size > 0) {
++ *(buf++) = inb(dev->cir_addr + IT8708_C0DR);
++ fifo--;
++ read++;
++ buf_size--;
++ }
++
++ return read;
++}
++
++/* return how many bytes are still in the FIFO; this will be called
++ * with the device spinlock NOT HELD while waiting for the TX FIFO to get
++ * empty; let's expect this won't be a problem */
++static int it8708_get_tx_used_slots(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ return inb(dev->cir_addr + IT8708_C0TFSR) & IT85_TXFBC;
++}
++
++/* put a byte to the TX fifo; this should be called with the spinlock held */
++static void it8708_put_tx_byte(struct ite_dev *dev, u8 value)
++{
++ outb(value, dev->cir_addr + IT8708_C0DR);
++}
++
++/* idle the receiver so that we won't receive samples until another
++ pulse is detected; this must be called with the device spinlock held */
++static void it8708_idle_rx(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* disable streaming by clearing RXACT writing it as 1 */
++ outb(inb(dev->cir_addr + IT8708_C0RCR) | IT85_RXACT,
++ dev->cir_addr + IT8708_C0RCR);
++
++ /* clear the FIFO */
++ outb(inb(dev->cir_addr + IT8708_C0MSTCR) | IT85_FIFOCLR,
++ dev->cir_addr + IT8708_C0MSTCR);
++}
++
++/* disable the receiver; this must be called with the device spinlock held */
++static void it8708_disable_rx(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* disable the receiver interrupts */
++ outb(inb(dev->cir_addr + IT8708_C0IER) &
++ ~(IT85_RDAIE | IT85_RFOIE),
++ dev->cir_addr + IT8708_C0IER);
++
++ /* disable the receiver */
++ outb(inb(dev->cir_addr + IT8708_C0RCR) & ~IT85_RXEN,
++ dev->cir_addr + IT8708_C0RCR);
++
++ /* clear the FIFO and RXACT (actually RXACT should have been cleared
++ * in the previous outb() call) */
++ it8708_idle_rx(dev);
++}
++
++/* enable the receiver; this must be called with the device spinlock held */
++static void it8708_enable_rx(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* enable the receiver by setting RXEN */
++ outb(inb(dev->cir_addr + IT8708_C0RCR) | IT85_RXEN,
++ dev->cir_addr + IT8708_C0RCR);
++
++ /* just prepare it to idle for the next reception */
++ it8708_idle_rx(dev);
++
++ /* enable the receiver interrupts and master enable flag */
++ outb(inb(dev->cir_addr + IT8708_C0IER)
++ |IT85_RDAIE | IT85_RFOIE | IT85_IEC,
++ dev->cir_addr + IT8708_C0IER);
++}
++
++/* disable the transmitter interrupt; this must be called with the device
++ * spinlock held */
++static void it8708_disable_tx_interrupt(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* disable the transmitter interrupts */
++ outb(inb(dev->cir_addr + IT8708_C0IER) & ~IT85_TLDLIE,
++ dev->cir_addr + IT8708_C0IER);
++}
++
++/* enable the transmitter interrupt; this must be called with the device
++ * spinlock held */
++static void it8708_enable_tx_interrupt(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* enable the transmitter interrupts and master enable flag */
++ outb(inb(dev->cir_addr + IT8708_C0IER)
++ |IT85_TLDLIE | IT85_IEC,
++ dev->cir_addr + IT8708_C0IER);
++}
++
++/* disable the device; this must be called with the device spinlock held */
++static void it8708_disable(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* clear out all interrupt enable flags */
++ outb(inb(dev->cir_addr + IT8708_C0IER) &
++ ~(IT85_IEC | IT85_RFOIE | IT85_RDAIE | IT85_TLDLIE),
++ dev->cir_addr + IT8708_C0IER);
++
++ /* disable the receiver */
++ it8708_disable_rx(dev);
++
++ /* erase the FIFO */
++ outb(IT85_FIFOCLR | inb(dev->cir_addr + IT8708_C0MSTCR),
++ dev->cir_addr + IT8708_C0MSTCR);
++}
++
++/* initialize the hardware */
++static void it8708_init_hardware(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* disable all the interrupts */
++ outb(inb(dev->cir_addr + IT8708_C0IER) &
++ ~(IT85_IEC | IT85_RFOIE | IT85_RDAIE | IT85_TLDLIE),
++ dev->cir_addr + IT8708_C0IER);
++
++ /* program the baud rate divisor */
++ outb(inb(dev->cir_addr + IT8708_BANKSEL) | IT8708_HRAE,
++ dev->cir_addr + IT8708_BANKSEL);
++
++ outb(ITE_BAUDRATE_DIVISOR & 0xff, dev->cir_addr + IT8708_C0BDLR);
++ outb((ITE_BAUDRATE_DIVISOR >> 8) & 0xff,
++ dev->cir_addr + IT8708_C0BDHR);
++
++ outb(inb(dev->cir_addr + IT8708_BANKSEL) & ~IT8708_HRAE,
++ dev->cir_addr + IT8708_BANKSEL);
++
++ /* program the C0MSTCR register defaults */
++ outb((inb(dev->cir_addr + IT8708_C0MSTCR) &
++ ~(IT85_ILSEL | IT85_ILE | IT85_FIFOTL |
++ IT85_FIFOCLR | IT85_RESET)) |
++ IT85_FIFOTL_DEFAULT,
++ dev->cir_addr + IT8708_C0MSTCR);
++
++ /* program the C0RCR register defaults */
++ outb((inb(dev->cir_addr + IT8708_C0RCR) &
++ ~(IT85_RXEN | IT85_RDWOS | IT85_RXEND |
++ IT85_RXACT | IT85_RXDCR)) |
++ ITE_RXDCR_DEFAULT,
++ dev->cir_addr + IT8708_C0RCR);
++
++ /* program the C0TCR register defaults */
++ outb((inb(dev->cir_addr + IT8708_C0TCR) &
++ ~(IT85_TXMPM | IT85_TXMPW))
++ |IT85_TXRLE | IT85_TXENDF |
++ IT85_TXMPM_DEFAULT | IT85_TXMPW_DEFAULT,
++ dev->cir_addr + IT8708_C0TCR);
++
++ /* program the carrier parameters */
++ ite_set_carrier_params(dev);
++}
++
++/* IT8512F on ITE8709 HW-specific functions */
++
++/* read a byte from the SRAM module */
++static inline u8 it8709_rm(struct ite_dev *dev, int index)
++{
++ outb(index, dev->cir_addr + IT8709_RAM_IDX);
++ return inb(dev->cir_addr + IT8709_RAM_VAL);
++}
++
++/* write a byte to the SRAM module */
++static inline void it8709_wm(struct ite_dev *dev, u8 val, int index)
++{
++ outb(index, dev->cir_addr + IT8709_RAM_IDX);
++ outb(val, dev->cir_addr + IT8709_RAM_VAL);
++}
++
++static void it8709_wait(struct ite_dev *dev)
++{
++ int i = 0;
++ /*
++ * loop until device tells it's ready to continue
++ * iterations count is usually ~750 but can sometimes achieve 13000
++ */
++ for (i = 0; i < 15000; i++) {
++ udelay(2);
++ if (it8709_rm(dev, IT8709_MODE) == IT8709_IDLE)
++ break;
++ }
++}
++
++/* read the value of a CIR register */
++static u8 it8709_rr(struct ite_dev *dev, int index)
++{
++ /* just wait in case the previous access was a write */
++ it8709_wait(dev);
++ it8709_wm(dev, index, IT8709_REG_IDX);
++ it8709_wm(dev, IT8709_READ, IT8709_MODE);
++
++ /* wait for the read data to be available */
++ it8709_wait(dev);
++
++ /* return the read value */
++ return it8709_rm(dev, IT8709_REG_VAL);
++}
++
++/* write the value of a CIR register */
++static void it8709_wr(struct ite_dev *dev, u8 val, int index)
++{
++ /* we wait before writing, and not afterwards, since this allows us to
++ * pipeline the host CPU with the microcontroller */
++ it8709_wait(dev);
++ it8709_wm(dev, val, IT8709_REG_VAL);
++ it8709_wm(dev, index, IT8709_REG_IDX);
++ it8709_wm(dev, IT8709_WRITE, IT8709_MODE);
++}
++
++/* retrieve a bitmask of the current causes for a pending interrupt; this may
++ * be composed of ITE_IRQ_TX_FIFO, ITE_IRQ_RX_FIFO and ITE_IRQ_RX_FIFO_OVERRUN
++ * */
++static int it8709_get_irq_causes(struct ite_dev *dev)
++{
++ u8 iflags;
++ int ret = 0;
++
++ ite_dbg("%s called", __func__);
++
++ /* read the interrupt flags */
++ iflags = it8709_rm(dev, IT8709_IIR);
++
++ if (iflags & IT85_TLDLI)
++ ret |= ITE_IRQ_TX_FIFO;
++ if (iflags & IT85_RDAI)
++ ret |= ITE_IRQ_RX_FIFO;
++ if (iflags & IT85_RFOI)
++ ret |= ITE_IRQ_RX_FIFO_OVERRUN;
++
++ return ret;
++}
++
++/* set the carrier parameters; to be called with the spinlock held */
++static void it8709_set_carrier_params(struct ite_dev *dev, bool high_freq,
++ bool use_demodulator,
++ u8 carrier_freq_bits, u8 allowance_bits,
++ u8 pulse_width_bits)
++{
++ u8 val;
++
++ ite_dbg("%s called", __func__);
++
++ val = (it8709_rr(dev, IT85_C0CFR)
++ &~(IT85_HCFS | IT85_CFQ)) |
++ carrier_freq_bits;
++
++ if (high_freq)
++ val |= IT85_HCFS;
++
++ it8709_wr(dev, val, IT85_C0CFR);
++
++ /* program the C0RCR register */
++ val = it8709_rr(dev, IT85_C0RCR)
++ & ~(IT85_RXEND | IT85_RXDCR);
++
++ if (use_demodulator)
++ val |= IT85_RXEND;
++
++ val |= allowance_bits;
++
++ it8709_wr(dev, val, IT85_C0RCR);
++
++ /* program the C0TCR register */
++ val = it8709_rr(dev, IT85_C0TCR) & ~IT85_TXMPW;
++ val |= pulse_width_bits;
++ it8709_wr(dev, val, IT85_C0TCR);
++}
++
++/* read up to buf_size bytes from the RX FIFO; to be called with the spinlock
++ * held */
++static int it8709_get_rx_bytes(struct ite_dev *dev, u8 * buf, int buf_size)
++{
++ int fifo, read = 0;
++
++ ite_dbg("%s called", __func__);
++
++ /* read how many bytes are still in the FIFO */
++ fifo = it8709_rm(dev, IT8709_RFSR) & IT85_RXFBC;
++
++ while (fifo > 0 && buf_size > 0) {
++ *(buf++) = it8709_rm(dev, IT8709_FIFO + read);
++ fifo--;
++ read++;
++ buf_size--;
++ }
++
++ /* 'clear' the FIFO by setting the writing index to 0; this is
++ * completely bound to be racy, but we can't help it, since it's a
++ * limitation of the protocol */
++ it8709_wm(dev, 0, IT8709_RFSR);
++
++ return read;
++}
++
++/* return how many bytes are still in the FIFO; this will be called
++ * with the device spinlock NOT HELD while waiting for the TX FIFO to get
++ * empty; let's expect this won't be a problem */
++static int it8709_get_tx_used_slots(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ return it8709_rr(dev, IT85_C0TFSR) & IT85_TXFBC;
++}
++
++/* put a byte to the TX fifo; this should be called with the spinlock held */
++static void it8709_put_tx_byte(struct ite_dev *dev, u8 value)
++{
++ it8709_wr(dev, value, IT85_C0DR);
++}
++
++/* idle the receiver so that we won't receive samples until another
++ pulse is detected; this must be called with the device spinlock held */
++static void it8709_idle_rx(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* disable streaming by clearing RXACT writing it as 1 */
++ it8709_wr(dev, it8709_rr(dev, IT85_C0RCR) | IT85_RXACT,
++ IT85_C0RCR);
++
++ /* clear the FIFO */
++ it8709_wr(dev, it8709_rr(dev, IT85_C0MSTCR) | IT85_FIFOCLR,
++ IT85_C0MSTCR);
++}
++
++/* disable the receiver; this must be called with the device spinlock held */
++static void it8709_disable_rx(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* disable the receiver interrupts */
++ it8709_wr(dev, it8709_rr(dev, IT85_C0IER) &
++ ~(IT85_RDAIE | IT85_RFOIE),
++ IT85_C0IER);
++
++ /* disable the receiver */
++ it8709_wr(dev, it8709_rr(dev, IT85_C0RCR) & ~IT85_RXEN,
++ IT85_C0RCR);
++
++ /* clear the FIFO and RXACT (actually RXACT should have been cleared
++ * in the previous it8709_wr(dev, ) call) */
++ it8709_idle_rx(dev);
++}
++
++/* enable the receiver; this must be called with the device spinlock held */
++static void it8709_enable_rx(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* enable the receiver by setting RXEN */
++ it8709_wr(dev, it8709_rr(dev, IT85_C0RCR) | IT85_RXEN,
++ IT85_C0RCR);
++
++ /* just prepare it to idle for the next reception */
++ it8709_idle_rx(dev);
++
++ /* enable the receiver interrupts and master enable flag */
++ it8709_wr(dev, it8709_rr(dev, IT85_C0IER)
++ |IT85_RDAIE | IT85_RFOIE | IT85_IEC,
++ IT85_C0IER);
++}
++
++/* disable the transmitter interrupt; this must be called with the device
++ * spinlock held */
++static void it8709_disable_tx_interrupt(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* disable the transmitter interrupts */
++ it8709_wr(dev, it8709_rr(dev, IT85_C0IER) & ~IT85_TLDLIE,
++ IT85_C0IER);
++}
++
++/* enable the transmitter interrupt; this must be called with the device
++ * spinlock held */
++static void it8709_enable_tx_interrupt(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* enable the transmitter interrupts and master enable flag */
++ it8709_wr(dev, it8709_rr(dev, IT85_C0IER)
++ |IT85_TLDLIE | IT85_IEC,
++ IT85_C0IER);
++}
++
++/* disable the device; this must be called with the device spinlock held */
++static void it8709_disable(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* clear out all interrupt enable flags */
++ it8709_wr(dev,
++ it8709_rr(dev,
++ IT85_C0IER) & ~(IT85_IEC | IT85_RFOIE |
++ IT85_RDAIE |
++ IT85_TLDLIE), IT85_C0IER);
++
++ /* disable the receiver */
++ it8709_disable_rx(dev);
++
++ /* erase the FIFO */
++ it8709_wr(dev, IT85_FIFOCLR | it8709_rr(dev, IT85_C0MSTCR),
++ IT85_C0MSTCR);
++}
++
++/* initialize the hardware */
++static void it8709_init_hardware(struct ite_dev *dev)
++{
++ ite_dbg("%s called", __func__);
++
++ /* disable all the interrupts */
++ it8709_wr(dev,
++ it8709_rr(dev,
++ IT85_C0IER) & ~(IT85_IEC | IT85_RFOIE |
++ IT85_RDAIE |
++ IT85_TLDLIE), IT85_C0IER);
++
++ /* program the baud rate divisor */
++ it8709_wr(dev, ITE_BAUDRATE_DIVISOR & 0xff, IT85_C0BDLR);
++ it8709_wr(dev, (ITE_BAUDRATE_DIVISOR >> 8) & 0xff,
++ IT85_C0BDHR);
++
++ /* program the C0MSTCR register defaults */
++ it8709_wr(dev, (it8709_rr(dev, IT85_C0MSTCR) & ~(IT85_ILSEL |
++ IT85_ILE
++ | IT85_FIFOTL
++ |
++ IT85_FIFOCLR
++ |
++ IT85_RESET))
++ | IT85_FIFOTL_DEFAULT, IT85_C0MSTCR);
++
++ /* program the C0RCR register defaults */
++ it8709_wr(dev,
++ (it8709_rr(dev, IT85_C0RCR) &
++ ~(IT85_RXEN | IT85_RDWOS | IT85_RXEND
++ | IT85_RXACT | IT85_RXDCR)) |
++ ITE_RXDCR_DEFAULT, IT85_C0RCR);
++
++ /* program the C0TCR register defaults */
++ it8709_wr(dev, (it8709_rr(dev, IT85_C0TCR)
++ &~(IT85_TXMPM | IT85_TXMPW))
++ |IT85_TXRLE | IT85_TXENDF |
++ IT85_TXMPM_DEFAULT |
++ IT85_TXMPW_DEFAULT, IT85_C0TCR);
++
++ /* program the carrier parameters */
++ ite_set_carrier_params(dev);
++}
++
++
++/* generic hardware setup/teardown code */
++
++/* activate the device for use */
++static int ite_open(struct rc_dev *rcdev)
++{
++ struct ite_dev *dev = rcdev->priv;
++ unsigned long flags;
++
++ ite_dbg("%s called", __func__);
++
++ spin_lock_irqsave(&dev->lock, flags);
++ dev->in_use = true;
++
++ /* enable the receiver */
++ dev->params.enable_rx(dev);
++
++ spin_unlock_irqrestore(&dev->lock, flags);
++
++ return 0;
++}
++
++/* deactivate the device for use */
++static void ite_close(struct rc_dev *rcdev)
++{
++ struct ite_dev *dev = rcdev->priv;
++ unsigned long flags;
++
++ ite_dbg("%s called", __func__);
++
++ spin_lock_irqsave(&dev->lock, flags);
++ dev->in_use = false;
++
++ /* wait for any transmission to end */
++ spin_unlock_irqrestore(&dev->lock, flags);
++ wait_event_interruptible(dev->tx_ended, !dev->transmitting);
++ spin_lock_irqsave(&dev->lock, flags);
++
++ dev->params.disable(dev);
++
++ spin_unlock_irqrestore(&dev->lock, flags);
++}
++
++/* supported models and their parameters */
++static const struct ite_dev_params ite_dev_descs[] = {
++ { /* 0: ITE8704 */
++ .model = "ITE8704 CIR transceiver",
++ .io_region_size = IT87_IOREG_LENGTH,
++ .hw_tx_capable = true,
++ .sample_period = (u32) (1000000000ULL / 115200),
++ .tx_carrier_freq = 38000,
++ .tx_duty_cycle = 33,
++ .rx_low_carrier_freq = 0,
++ .rx_high_carrier_freq = 0,
++
++ /* operations */
++ .get_irq_causes = it87_get_irq_causes,
++ .enable_rx = it87_enable_rx,
++ .idle_rx = it87_idle_rx,
++ .disable_rx = it87_idle_rx,
++ .get_rx_bytes = it87_get_rx_bytes,
++ .enable_tx_interrupt = it87_enable_tx_interrupt,
++ .disable_tx_interrupt = it87_disable_tx_interrupt,
++ .get_tx_used_slots = it87_get_tx_used_slots,
++ .put_tx_byte = it87_put_tx_byte,
++ .disable = it87_disable,
++ .init_hardware = it87_init_hardware,
++ .set_carrier_params = it87_set_carrier_params,
++ },
++ { /* 1: ITE8713 */
++ .model = "ITE8713 CIR transceiver",
++ .io_region_size = IT87_IOREG_LENGTH,
++ .hw_tx_capable = true,
++ .sample_period = (u32) (1000000000ULL / 115200),
++ .tx_carrier_freq = 38000,
++ .tx_duty_cycle = 33,
++ .rx_low_carrier_freq = 0,
++ .rx_high_carrier_freq = 0,
++
++ /* operations */
++ .get_irq_causes = it87_get_irq_causes,
++ .enable_rx = it87_enable_rx,
++ .idle_rx = it87_idle_rx,
++ .disable_rx = it87_idle_rx,
++ .get_rx_bytes = it87_get_rx_bytes,
++ .enable_tx_interrupt = it87_enable_tx_interrupt,
++ .disable_tx_interrupt = it87_disable_tx_interrupt,
++ .get_tx_used_slots = it87_get_tx_used_slots,
++ .put_tx_byte = it87_put_tx_byte,
++ .disable = it87_disable,
++ .init_hardware = it87_init_hardware,
++ .set_carrier_params = it87_set_carrier_params,
++ },
++ { /* 2: ITE8708 */
++ .model = "ITE8708 CIR transceiver",
++ .io_region_size = IT8708_IOREG_LENGTH,
++ .hw_tx_capable = true,
++ .sample_period = (u32) (1000000000ULL / 115200),
++ .tx_carrier_freq = 38000,
++ .tx_duty_cycle = 33,
++ .rx_low_carrier_freq = 0,
++ .rx_high_carrier_freq = 0,
++
++ /* operations */
++ .get_irq_causes = it8708_get_irq_causes,
++ .enable_rx = it8708_enable_rx,
++ .idle_rx = it8708_idle_rx,
++ .disable_rx = it8708_idle_rx,
++ .get_rx_bytes = it8708_get_rx_bytes,
++ .enable_tx_interrupt = it8708_enable_tx_interrupt,
++ .disable_tx_interrupt =
++ it8708_disable_tx_interrupt,
++ .get_tx_used_slots = it8708_get_tx_used_slots,
++ .put_tx_byte = it8708_put_tx_byte,
++ .disable = it8708_disable,
++ .init_hardware = it8708_init_hardware,
++ .set_carrier_params = it8708_set_carrier_params,
++ },
++ { /* 3: ITE8709 */
++ .model = "ITE8709 CIR transceiver",
++ .io_region_size = IT8709_IOREG_LENGTH,
++ .hw_tx_capable = true,
++ .sample_period = (u32) (1000000000ULL / 115200),
++ .tx_carrier_freq = 38000,
++ .tx_duty_cycle = 33,
++ .rx_low_carrier_freq = 0,
++ .rx_high_carrier_freq = 0,
++
++ /* operations */
++ .get_irq_causes = it8709_get_irq_causes,
++ .enable_rx = it8709_enable_rx,
++ .idle_rx = it8709_idle_rx,
++ .disable_rx = it8709_idle_rx,
++ .get_rx_bytes = it8709_get_rx_bytes,
++ .enable_tx_interrupt = it8709_enable_tx_interrupt,
++ .disable_tx_interrupt =
++ it8709_disable_tx_interrupt,
++ .get_tx_used_slots = it8709_get_tx_used_slots,
++ .put_tx_byte = it8709_put_tx_byte,
++ .disable = it8709_disable,
++ .init_hardware = it8709_init_hardware,
++ .set_carrier_params = it8709_set_carrier_params,
++ },
++};
++
++static const struct pnp_device_id ite_ids[] = {
++ {"ITE8704", 0}, /* Default model */
++ {"ITE8713", 1}, /* CIR found in EEEBox 1501U */
++ {"ITE8708", 2}, /* Bridged IT8512 */
++ {"ITE8709", 3}, /* SRAM-Bridged IT8512 */
++ {"", 0},
++};
++
++/* allocate memory, probe hardware, and initialize everything */
++static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id
++ *dev_id)
++{
++ const struct ite_dev_params *dev_desc = NULL;
++ struct ite_dev *itdev = NULL;
++ struct rc_dev *rdev = NULL;
++ int ret = -ENOMEM;
++ int model_no;
++
++ ite_dbg("%s called", __func__);
++
++ itdev = kzalloc(sizeof(struct ite_dev), GFP_KERNEL);
++ if (!itdev)
++ return ret;
++
++ /* input device for IR remote (and tx) */
++ rdev = rc_allocate_device();
++ if (!rdev)
++ goto failure;
++
++ ret = -ENODEV;
++
++ /* get the model number */
++ model_no = (int)dev_id->driver_data;
++ ite_pr(KERN_NOTICE, "Auto-detected model: %s\n",
++ ite_dev_descs[model_no].model);
++
++ if (model_number >= 0 && model_number < ARRAY_SIZE(ite_dev_descs)) {
++ model_no = model_number;
++ ite_pr(KERN_NOTICE, "The model has been fixed by a module "
++ "parameter.");
++ }
++
++ ite_pr(KERN_NOTICE, "Using model: %s\n", ite_dev_descs[model_no].model);
++
++ /* get the description for the device */
++ dev_desc = &ite_dev_descs[model_no];
++
++ /* validate pnp resources */
++ if (!pnp_port_valid(pdev, 0) ||
++ pnp_port_len(pdev, 0) != dev_desc->io_region_size) {
++ dev_err(&pdev->dev, "IR PNP Port not valid!\n");
++ goto failure;
++ }
++
++ if (!pnp_irq_valid(pdev, 0)) {
++ dev_err(&pdev->dev, "PNP IRQ not valid!\n");
++ goto failure;
++ }
++
++ /* store resource values */
++ itdev->cir_addr = pnp_port_start(pdev, 0);
++ itdev->cir_irq = pnp_irq(pdev, 0);
++
++ /* initialize spinlocks */
++ spin_lock_init(&itdev->lock);
++
++ /* initialize raw event */
++ init_ir_raw_event(&itdev->rawir);
++
++ ret = -EBUSY;
++ /* now claim resources */
++ if (!request_region(itdev->cir_addr,
++ dev_desc->io_region_size, ITE_DRIVER_NAME))
++ goto failure;
++
++ if (request_irq(itdev->cir_irq, ite_cir_isr, IRQF_SHARED,
++ ITE_DRIVER_NAME, (void *)itdev))
++ goto failure;
++
++ /* set driver data into the pnp device */
++ pnp_set_drvdata(pdev, itdev);
++ itdev->pdev = pdev;
++
++ /* initialize waitqueues for transmission */
++ init_waitqueue_head(&itdev->tx_queue);
++ init_waitqueue_head(&itdev->tx_ended);
++
++ /* copy model-specific parameters */
++ itdev->params = *dev_desc;
++
++ /* apply any overrides */
++ if (sample_period > 0)
++ itdev->params.sample_period = sample_period;
++
++ if (tx_carrier_freq > 0)
++ itdev->params.tx_carrier_freq = tx_carrier_freq;
++
++ if (tx_duty_cycle > 0 && tx_duty_cycle <= 100)
++ itdev->params.tx_duty_cycle = tx_duty_cycle;
++
++ if (rx_low_carrier_freq > 0)
++ itdev->params.rx_low_carrier_freq = rx_low_carrier_freq;
++
++ if (rx_high_carrier_freq > 0)
++ itdev->params.rx_high_carrier_freq = rx_high_carrier_freq;
++
++ /* print out parameters */
++ ite_pr(KERN_NOTICE, "TX-capable: %d\n", (int)
++ itdev->params.hw_tx_capable);
++ ite_pr(KERN_NOTICE, "Sample period (ns): %ld\n", (long)
++ itdev->params.sample_period);
++ ite_pr(KERN_NOTICE, "TX carrier frequency (Hz): %d\n", (int)
++ itdev->params.tx_carrier_freq);
++ ite_pr(KERN_NOTICE, "TX duty cycle (%%): %d\n", (int)
++ itdev->params.tx_duty_cycle);
++ ite_pr(KERN_NOTICE, "RX low carrier frequency (Hz): %d\n", (int)
++ itdev->params.rx_low_carrier_freq);
++ ite_pr(KERN_NOTICE, "RX high carrier frequency (Hz): %d\n", (int)
++ itdev->params.rx_high_carrier_freq);
++
++ /* set up hardware initial state */
++ itdev->params.init_hardware(itdev);
++
++ /* set up ir-core props */
++ rdev->priv = itdev;
++ rdev->driver_type = RC_DRIVER_IR_RAW;
++ rdev->allowed_protos = RC_TYPE_ALL;
++ rdev->open = ite_open;
++ rdev->close = ite_close;
++ rdev->s_idle = ite_s_idle;
++ rdev->s_rx_carrier_range = ite_set_rx_carrier_range;
++ rdev->min_timeout = ITE_MIN_IDLE_TIMEOUT;
++ rdev->max_timeout = ITE_MAX_IDLE_TIMEOUT;
++ rdev->timeout = ITE_IDLE_TIMEOUT;
++ rdev->rx_resolution = ITE_BAUDRATE_DIVISOR *
++ itdev->params.sample_period;
++ rdev->tx_resolution = ITE_BAUDRATE_DIVISOR *
++ itdev->params.sample_period;
++
++ /* set up transmitter related values if needed */
++ if (itdev->params.hw_tx_capable) {
++ rdev->tx_ir = ite_tx_ir;
++ rdev->s_tx_carrier = ite_set_tx_carrier;
++ rdev->s_tx_duty_cycle = ite_set_tx_duty_cycle;
++ }
++
++ rdev->input_name = dev_desc->model;
++ rdev->input_id.bustype = BUS_HOST;
++ rdev->input_id.vendor = PCI_VENDOR_ID_ITE;
++ rdev->input_id.product = 0;
++ rdev->input_id.version = 0;
++ rdev->driver_name = ITE_DRIVER_NAME;
++ rdev->map_name = RC_MAP_RC6_MCE;
++
++ ret = rc_register_device(rdev);
++ if (ret)
++ goto failure;
++
++ itdev->rdev = rdev;
++ ite_pr(KERN_NOTICE, "driver has been successfully loaded\n");
++
++ return 0;
++
++failure:
++ if (itdev->cir_irq)
++ free_irq(itdev->cir_irq, itdev);
++
++ if (itdev->cir_addr)
++ release_region(itdev->cir_addr, itdev->params.io_region_size);
++
++ rc_free_device(rdev);
++ kfree(itdev);
++
++ return ret;
++}
++
++static void __devexit ite_remove(struct pnp_dev *pdev)
++{
++ struct ite_dev *dev = pnp_get_drvdata(pdev);
++ unsigned long flags;
++
++ ite_dbg("%s called", __func__);
++
++ spin_lock_irqsave(&dev->lock, flags);
++
++ /* disable hardware */
++ dev->params.disable(dev);
++
++ spin_unlock_irqrestore(&dev->lock, flags);
++
++ /* free resources */
++ free_irq(dev->cir_irq, dev);
++ release_region(dev->cir_addr, dev->params.io_region_size);
++
++ rc_unregister_device(dev->rdev);
++
++ kfree(dev);
++}
++
++static int ite_suspend(struct pnp_dev *pdev, pm_message_t state)
++{
++ struct ite_dev *dev = pnp_get_drvdata(pdev);
++ unsigned long flags;
++
++ ite_dbg("%s called", __func__);
++
++ spin_lock_irqsave(&dev->lock, flags);
++
++ /* disable all interrupts */
++ dev->params.disable(dev);
++
++ spin_unlock_irqrestore(&dev->lock, flags);
++
++ return 0;
++}
++
++static int ite_resume(struct pnp_dev *pdev)
++{
++ int ret = 0;
++ struct ite_dev *dev = pnp_get_drvdata(pdev);
++ unsigned long flags;
++
++ ite_dbg("%s called", __func__);
++
++ spin_lock_irqsave(&dev->lock, flags);
++
++ if (dev->transmitting) {
++ /* wake up the transmitter */
++ wake_up_interruptible(&dev->tx_queue);
++ } else {
++ /* enable the receiver */
++ dev->params.enable_rx(dev);
++ }
++
++ spin_unlock_irqrestore(&dev->lock, flags);
++
++ return ret;
++}
++
++static void ite_shutdown(struct pnp_dev *pdev)
++{
++ struct ite_dev *dev = pnp_get_drvdata(pdev);
++ unsigned long flags;
++
++ ite_dbg("%s called", __func__);
++
++ spin_lock_irqsave(&dev->lock, flags);
++
++ /* disable all interrupts */
++ dev->params.disable(dev);
++
++ spin_unlock_irqrestore(&dev->lock, flags);
++}
++
++static struct pnp_driver ite_driver = {
++ .name = ITE_DRIVER_NAME,
++ .id_table = ite_ids,
++ .probe = ite_probe,
++ .remove = __devexit_p(ite_remove),
++ .suspend = ite_suspend,
++ .resume = ite_resume,
++ .shutdown = ite_shutdown,
++};
++
++int ite_init(void)
++{
++ return pnp_register_driver(&ite_driver);
++}
++
++void ite_exit(void)
++{
++ pnp_unregister_driver(&ite_driver);
++}
++
++MODULE_DEVICE_TABLE(pnp, ite_ids);
++MODULE_DESCRIPTION("ITE Tech Inc. IT8712F/ITE8512F CIR driver");
++
++MODULE_AUTHOR("Juan J. Garcia de Soria <skandalfo@gmail.com>");
++MODULE_LICENSE("GPL");
++
++module_init(ite_init);
++module_exit(ite_exit);
+diff --git a/drivers/media/rc/ite-cir.h b/drivers/media/rc/ite-cir.h
+new file mode 100644
+index 0000000..16a19f5
+--- /dev/null
++++ b/drivers/media/rc/ite-cir.h
+@@ -0,0 +1,481 @@
++/*
++ * Driver for ITE Tech Inc. IT8712F/IT8512F CIR
++ *
++ * Copyright (C) 2010 Juan Jesús García de Soria <skandalfo@gmail.com>
++ *
++ * 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.
++ */
++
++/* platform driver name to register */
++#define ITE_DRIVER_NAME "ite-cir"
++
++/* logging macros */
++#define ite_pr(level, text, ...) \
++ printk(level KBUILD_MODNAME ": " text, ## __VA_ARGS__)
++#define ite_dbg(text, ...) do { \
++ if (debug) \
++ printk(KERN_DEBUG \
++ KBUILD_MODNAME ": " text "\n" , ## __VA_ARGS__); \
++} while (0)
++
++#define ite_dbg_verbose(text, ...) do {\
++ if (debug > 1) \
++ printk(KERN_DEBUG \
++ KBUILD_MODNAME ": " text "\n" , ## __VA_ARGS__); \
++} while (0)
++
++/* FIFO sizes */
++#define ITE_TX_FIFO_LEN 32
++#define ITE_RX_FIFO_LEN 32
++
++/* interrupt types */
++#define ITE_IRQ_TX_FIFO 1
++#define ITE_IRQ_RX_FIFO 2
++#define ITE_IRQ_RX_FIFO_OVERRUN 4
++
++/* forward declaration */
++struct ite_dev;
++
++/* struct for storing the parameters of different recognized devices */
++struct ite_dev_params {
++ /* model of the device */
++ const char *model;
++
++ /* size of the I/O region */
++ int io_region_size;
++
++ /* true if the hardware supports transmission */
++ bool hw_tx_capable;
++
++ /* base sampling period, in ns */
++ u32 sample_period;
++
++ /* rx low carrier frequency, in Hz, 0 means no demodulation */
++ unsigned int rx_low_carrier_freq;
++
++ /* tx high carrier frequency, in Hz, 0 means no demodulation */
++ unsigned int rx_high_carrier_freq;
++
++ /* tx carrier frequency, in Hz */
++ unsigned int tx_carrier_freq;
++
++ /* duty cycle, 0-100 */
++ int tx_duty_cycle;
++
++ /* hw-specific operation function pointers; most of these must be
++ * called while holding the spin lock, except for the TX FIFO length
++ * one */
++ /* get pending interrupt causes */
++ int (*get_irq_causes) (struct ite_dev *dev);
++
++ /* enable rx */
++ void (*enable_rx) (struct ite_dev *dev);
++
++ /* make rx enter the idle state; keep listening for a pulse, but stop
++ * streaming space bytes */
++ void (*idle_rx) (struct ite_dev *dev);
++
++ /* disable rx completely */
++ void (*disable_rx) (struct ite_dev *dev);
++
++ /* read bytes from RX FIFO; return read count */
++ int (*get_rx_bytes) (struct ite_dev *dev, u8 *buf, int buf_size);
++
++ /* enable tx FIFO space available interrupt */
++ void (*enable_tx_interrupt) (struct ite_dev *dev);
++
++ /* disable tx FIFO space available interrupt */
++ void (*disable_tx_interrupt) (struct ite_dev *dev);
++
++ /* get number of full TX FIFO slots */
++ int (*get_tx_used_slots) (struct ite_dev *dev);
++
++ /* put a byte to the TX FIFO */
++ void (*put_tx_byte) (struct ite_dev *dev, u8 value);
++
++ /* disable hardware completely */
++ void (*disable) (struct ite_dev *dev);
++
++ /* initialize the hardware */
++ void (*init_hardware) (struct ite_dev *dev);
++
++ /* set the carrier parameters */
++ void (*set_carrier_params) (struct ite_dev *dev, bool high_freq,
++ bool use_demodulator, u8 carrier_freq_bits,
++ u8 allowance_bits, u8 pulse_width_bits);
++};
++
++/* ITE CIR device structure */
++struct ite_dev {
++ struct pnp_dev *pdev;
++ struct rc_dev *rdev;
++ struct ir_raw_event rawir;
++
++ /* sync data */
++ spinlock_t lock;
++ bool in_use, transmitting;
++
++ /* transmit support */
++ int tx_fifo_allowance;
++ wait_queue_head_t tx_queue, tx_ended;
++
++ /* hardware I/O settings */
++ unsigned long cir_addr;
++ int cir_irq;
++
++ /* overridable copy of model parameters */
++ struct ite_dev_params params;
++};
++
++/* common values for all kinds of hardware */
++
++/* baud rate divisor default */
++#define ITE_BAUDRATE_DIVISOR 1
++
++/* low-speed carrier frequency limits (Hz) */
++#define ITE_LCF_MIN_CARRIER_FREQ 27000
++#define ITE_LCF_MAX_CARRIER_FREQ 58000
++
++/* high-speed carrier frequency limits (Hz) */
++#define ITE_HCF_MIN_CARRIER_FREQ 400000
++#define ITE_HCF_MAX_CARRIER_FREQ 500000
++
++/* default carrier freq for when demodulator is off (Hz) */
++#define ITE_DEFAULT_CARRIER_FREQ 38000
++
++/* default idling timeout in ns (0.2 seconds) */
++#define ITE_IDLE_TIMEOUT 200000000UL
++
++/* limit timeout values */
++#define ITE_MIN_IDLE_TIMEOUT 100000000UL
++#define ITE_MAX_IDLE_TIMEOUT 1000000000UL
++
++/* convert bits to us */
++#define ITE_BITS_TO_NS(bits, sample_period) \
++((u32) ((bits) * ITE_BAUDRATE_DIVISOR * sample_period))
++
++/*
++ * n in RDCR produces a tolerance of +/- n * 6.25% around the center
++ * carrier frequency...
++ *
++ * From two limit frequencies, L (low) and H (high), we can get both the
++ * center frequency F = (L + H) / 2 and the variation from the center
++ * frequency A = (H - L) / (H + L). We can use this in order to honor the
++ * s_rx_carrier_range() call in ir-core. We'll suppose that any request
++ * setting L=0 means we must shut down the demodulator.
++ */
++#define ITE_RXDCR_PER_10000_STEP 625
++
++/* high speed carrier freq values */
++#define ITE_CFQ_400 0x03
++#define ITE_CFQ_450 0x08
++#define ITE_CFQ_480 0x0b
++#define ITE_CFQ_500 0x0d
++
++/* values for pulse widths */
++#define ITE_TXMPW_A 0x02
++#define ITE_TXMPW_B 0x03
++#define ITE_TXMPW_C 0x04
++#define ITE_TXMPW_D 0x05
++#define ITE_TXMPW_E 0x06
++
++/* values for demodulator carrier range allowance */
++#define ITE_RXDCR_DEFAULT 0x01 /* default carrier range */
++#define ITE_RXDCR_MAX 0x07 /* default carrier range */
++
++/* DR TX bits */
++#define ITE_TX_PULSE 0x00
++#define ITE_TX_SPACE 0x80
++#define ITE_TX_MAX_RLE 0x80
++#define ITE_TX_RLE_MASK 0x7f
++
++/*
++ * IT8712F
++ *
++ * hardware data obtained from:
++ *
++ * IT8712F
++ * Environment Control – Low Pin Count Input / Output
++ * (EC - LPC I/O)
++ * Preliminary Specification V0. 81
++ */
++
++/* register offsets */
++#define IT87_DR 0x00 /* data register */
++#define IT87_IER 0x01 /* interrupt enable register */
++#define IT87_RCR 0x02 /* receiver control register */
++#define IT87_TCR1 0x03 /* transmitter control register 1 */
++#define IT87_TCR2 0x04 /* transmitter control register 2 */
++#define IT87_TSR 0x05 /* transmitter status register */
++#define IT87_RSR 0x06 /* receiver status register */
++#define IT87_BDLR 0x05 /* baud rate divisor low byte register */
++#define IT87_BDHR 0x06 /* baud rate divisor high byte register */
++#define IT87_IIR 0x07 /* interrupt identification register */
++
++#define IT87_IOREG_LENGTH 0x08 /* length of register file */
++
++/* IER bits */
++#define IT87_TLDLIE 0x01 /* transmitter low data interrupt enable */
++#define IT87_RDAIE 0x02 /* receiver data available interrupt enable */
++#define IT87_RFOIE 0x04 /* receiver FIFO overrun interrupt enable */
++#define IT87_IEC 0x08 /* interrupt enable control */
++#define IT87_BR 0x10 /* baud rate register enable */
++#define IT87_RESET 0x20 /* reset */
++
++/* RCR bits */
++#define IT87_RXDCR 0x07 /* receiver demodulation carrier range mask */
++#define IT87_RXACT 0x08 /* receiver active */
++#define IT87_RXEND 0x10 /* receiver demodulation enable */
++#define IT87_RXEN 0x20 /* receiver enable */
++#define IT87_HCFS 0x40 /* high-speed carrier frequency select */
++#define IT87_RDWOS 0x80 /* receiver data without sync */
++
++/* TCR1 bits */
++#define IT87_TXMPM 0x03 /* transmitter modulation pulse mode mask */
++#define IT87_TXMPM_DEFAULT 0x00 /* modulation pulse mode default */
++#define IT87_TXENDF 0x04 /* transmitter deferral */
++#define IT87_TXRLE 0x08 /* transmitter run length enable */
++#define IT87_FIFOTL 0x30 /* FIFO level threshold mask */
++#define IT87_FIFOTL_DEFAULT 0x20 /* FIFO level threshold default
++ * 0x00 -> 1, 0x10 -> 7, 0x20 -> 17,
++ * 0x30 -> 25 */
++#define IT87_ILE 0x40 /* internal loopback enable */
++#define IT87_FIFOCLR 0x80 /* FIFO clear bit */
++
++/* TCR2 bits */
++#define IT87_TXMPW 0x07 /* transmitter modulation pulse width mask */
++#define IT87_TXMPW_DEFAULT 0x04 /* default modulation pulse width */
++#define IT87_CFQ 0xf8 /* carrier frequency mask */
++#define IT87_CFQ_SHIFT 3 /* carrier frequency bit shift */
++
++/* TSR bits */
++#define IT87_TXFBC 0x3f /* transmitter FIFO byte count mask */
++
++/* RSR bits */
++#define IT87_RXFBC 0x3f /* receiver FIFO byte count mask */
++#define IT87_RXFTO 0x80 /* receiver FIFO time-out */
++
++/* IIR bits */
++#define IT87_IP 0x01 /* interrupt pending */
++#define IT87_II 0x06 /* interrupt identification mask */
++#define IT87_II_NOINT 0x00 /* no interrupt */
++#define IT87_II_TXLDL 0x02 /* transmitter low data level */
++#define IT87_II_RXDS 0x04 /* receiver data stored */
++#define IT87_II_RXFO 0x06 /* receiver FIFO overrun */
++
++/*
++ * IT8512E/F
++ *
++ * Hardware data obtained from:
++ *
++ * IT8512E/F
++ * Embedded Controller
++ * Preliminary Specification V0.4.1
++ *
++ * Note that the CIR registers are not directly available to the host, because
++ * they only are accessible to the integrated microcontroller. Thus, in order
++ * use it, some kind of bridging is required. As the bridging may depend on
++ * the controller firmware in use, we are going to use the PNP ID in order to
++ * determine the strategy and ports available. See after these generic
++ * IT8512E/F register definitions for register definitions for those
++ * strategies.
++ */
++
++/* register offsets */
++#define IT85_C0DR 0x00 /* data register */
++#define IT85_C0MSTCR 0x01 /* master control register */
++#define IT85_C0IER 0x02 /* interrupt enable register */
++#define IT85_C0IIR 0x03 /* interrupt identification register */
++#define IT85_C0CFR 0x04 /* carrier frequency register */
++#define IT85_C0RCR 0x05 /* receiver control register */
++#define IT85_C0TCR 0x06 /* transmitter control register */
++#define IT85_C0SCK 0x07 /* slow clock control register */
++#define IT85_C0BDLR 0x08 /* baud rate divisor low byte register */
++#define IT85_C0BDHR 0x09 /* baud rate divisor high byte register */
++#define IT85_C0TFSR 0x0a /* transmitter FIFO status register */
++#define IT85_C0RFSR 0x0b /* receiver FIFO status register */
++#define IT85_C0WCL 0x0d /* wakeup code length register */
++#define IT85_C0WCR 0x0e /* wakeup code read/write register */
++#define IT85_C0WPS 0x0f /* wakeup power control/status register */
++
++#define IT85_IOREG_LENGTH 0x10 /* length of register file */
++
++/* C0MSTCR bits */
++#define IT85_RESET 0x01 /* reset */
++#define IT85_FIFOCLR 0x02 /* FIFO clear bit */
++#define IT85_FIFOTL 0x0c /* FIFO level threshold mask */
++#define IT85_FIFOTL_DEFAULT 0x08 /* FIFO level threshold default
++ * 0x00 -> 1, 0x04 -> 7, 0x08 -> 17,
++ * 0x0c -> 25 */
++#define IT85_ILE 0x10 /* internal loopback enable */
++#define IT85_ILSEL 0x20 /* internal loopback select */
++
++/* C0IER bits */
++#define IT85_TLDLIE 0x01 /* TX low data level interrupt enable */
++#define IT85_RDAIE 0x02 /* RX data available interrupt enable */
++#define IT85_RFOIE 0x04 /* RX FIFO overrun interrupt enable */
++#define IT85_IEC 0x80 /* interrupt enable function control */
++
++/* C0IIR bits */
++#define IT85_TLDLI 0x01 /* transmitter low data level interrupt */
++#define IT85_RDAI 0x02 /* receiver data available interrupt */
++#define IT85_RFOI 0x04 /* receiver FIFO overrun interrupt */
++#define IT85_NIP 0x80 /* no interrupt pending */
++
++/* C0CFR bits */
++#define IT85_CFQ 0x1f /* carrier frequency mask */
++#define IT85_HCFS 0x20 /* high speed carrier frequency select */
++
++/* C0RCR bits */
++#define IT85_RXDCR 0x07 /* receiver demodulation carrier range mask */
++#define IT85_RXACT 0x08 /* receiver active */
++#define IT85_RXEND 0x10 /* receiver demodulation enable */
++#define IT85_RDWOS 0x20 /* receiver data without sync */
++#define IT85_RXEN 0x80 /* receiver enable */
++
++/* C0TCR bits */
++#define IT85_TXMPW 0x07 /* transmitter modulation pulse width mask */
++#define IT85_TXMPW_DEFAULT 0x04 /* default modulation pulse width */
++#define IT85_TXMPM 0x18 /* transmitter modulation pulse mode mask */
++#define IT85_TXMPM_DEFAULT 0x00 /* modulation pulse mode default */
++#define IT85_TXENDF 0x20 /* transmitter deferral */
++#define IT85_TXRLE 0x40 /* transmitter run length enable */
++
++/* C0SCK bits */
++#define IT85_SCKS 0x01 /* slow clock select */
++#define IT85_TXDCKG 0x02 /* TXD clock gating */
++#define IT85_DLL1P8E 0x04 /* DLL 1.8432M enable */
++#define IT85_DLLTE 0x08 /* DLL test enable */
++#define IT85_BRCM 0x70 /* baud rate count mode */
++#define IT85_DLLOCK 0x80 /* DLL lock */
++
++/* C0TFSR bits */
++#define IT85_TXFBC 0x3f /* transmitter FIFO count mask */
++
++/* C0RFSR bits */
++#define IT85_RXFBC 0x3f /* receiver FIFO count mask */
++#define IT85_RXFTO 0x80 /* receiver FIFO time-out */
++
++/* C0WCL bits */
++#define IT85_WCL 0x3f /* wakeup code length mask */
++
++/* C0WPS bits */
++#define IT85_CIRPOSIE 0x01 /* power on/off status interrupt enable */
++#define IT85_CIRPOIS 0x02 /* power on/off interrupt status */
++#define IT85_CIRPOII 0x04 /* power on/off interrupt identification */
++#define IT85_RCRST 0x10 /* wakeup code reading counter reset bit */
++#define IT85_WCRST 0x20 /* wakeup code writing counter reset bit */
++
++/*
++ * ITE8708
++ *
++ * Hardware data obtained from hacked driver for IT8512 in this forum post:
++ *
++ * http://ubuntuforums.org/showthread.php?t=1028640
++ *
++ * Although there's no official documentation for that driver, analysis would
++ * suggest that it maps the 16 registers of IT8512 onto two 8-register banks,
++ * selectable by a single bank-select bit that's mapped onto both banks. The
++ * IT8512 registers are mapped in a different order, so that the first bank
++ * maps the ones that are used more often, and two registers that share a
++ * reserved high-order bit are placed at the same offset in both banks in
++ * order to reuse the reserved bit as the bank select bit.
++ */
++
++/* register offsets */
++
++/* mapped onto both banks */
++#define IT8708_BANKSEL 0x07 /* bank select register */
++#define IT8708_HRAE 0x80 /* high registers access enable */
++
++/* mapped onto the low bank */
++#define IT8708_C0DR 0x00 /* data register */
++#define IT8708_C0MSTCR 0x01 /* master control register */
++#define IT8708_C0IER 0x02 /* interrupt enable register */
++#define IT8708_C0IIR 0x03 /* interrupt identification register */
++#define IT8708_C0RFSR 0x04 /* receiver FIFO status register */
++#define IT8708_C0RCR 0x05 /* receiver control register */
++#define IT8708_C0TFSR 0x06 /* transmitter FIFO status register */
++#define IT8708_C0TCR 0x07 /* transmitter control register */
++
++/* mapped onto the high bank */
++#define IT8708_C0BDLR 0x01 /* baud rate divisor low byte register */
++#define IT8708_C0BDHR 0x02 /* baud rate divisor high byte register */
++#define IT8708_C0CFR 0x04 /* carrier frequency register */
++
++/* registers whose bank mapping we don't know, since they weren't being used
++ * in the hacked driver... most probably they belong to the high bank too,
++ * since they fit in the holes the other registers leave */
++#define IT8708_C0SCK 0x03 /* slow clock control register */
++#define IT8708_C0WCL 0x05 /* wakeup code length register */
++#define IT8708_C0WCR 0x06 /* wakeup code read/write register */
++#define IT8708_C0WPS 0x07 /* wakeup power control/status register */
++
++#define IT8708_IOREG_LENGTH 0x08 /* length of register file */
++
++/* two more registers that are defined in the hacked driver, but can't be
++ * found in the data sheets; no idea what they are or how they are accessed,
++ * since the hacked driver doesn't seem to use them */
++#define IT8708_CSCRR 0x00
++#define IT8708_CGPINTR 0x01
++
++/* CSCRR bits */
++#define IT8708_CSCRR_SCRB 0x3f
++#define IT8708_CSCRR_PM 0x80
++
++/* CGPINTR bits */
++#define IT8708_CGPINT 0x01
++
++/*
++ * ITE8709
++ *
++ * Hardware interfacing data obtained from the original lirc_ite8709 driver.
++ * Verbatim from its sources:
++ *
++ * The ITE8709 device seems to be the combination of IT8512 superIO chip and
++ * a specific firmware running on the IT8512's embedded micro-controller.
++ * In addition of the embedded micro-controller, the IT8512 chip contains a
++ * CIR module and several other modules. A few modules are directly accessible
++ * by the host CPU, but most of them are only accessible by the
++ * micro-controller. The CIR module is only accessible by the
++ * micro-controller.
++ *
++ * The battery-backed SRAM module is accessible by the host CPU and the
++ * micro-controller. So one of the MC's firmware role is to act as a bridge
++ * between the host CPU and the CIR module. The firmware implements a kind of
++ * communication protocol using the SRAM module as a shared memory. The IT8512
++ * specification is publicly available on ITE's web site, but the
++ * communication protocol is not, so it was reverse-engineered.
++ */
++
++/* register offsets */
++#define IT8709_RAM_IDX 0x00 /* index into the SRAM module bytes */
++#define IT8709_RAM_VAL 0x01 /* read/write data to the indexed byte */
++
++#define IT8709_IOREG_LENGTH 0x02 /* length of register file */
++
++/* register offsets inside the SRAM module */
++#define IT8709_MODE 0x1a /* request/ack byte */
++#define IT8709_REG_IDX 0x1b /* index of the CIR register to access */
++#define IT8709_REG_VAL 0x1c /* value read/to be written */
++#define IT8709_IIR 0x1e /* interrupt identification register */
++#define IT8709_RFSR 0x1f /* receiver FIFO status register */
++#define IT8709_FIFO 0x20 /* start of in RAM RX FIFO copy */
++
++/* MODE values */
++#define IT8709_IDLE 0x00
++#define IT8709_WRITE 0x01
++#define IT8709_READ 0x02
+diff --git a/drivers/media/rc/keymaps/Makefile b/drivers/media/rc/keymaps/Makefile
+index cb72121..85cac7d 100644
+--- a/drivers/media/rc/keymaps/Makefile
++++ b/drivers/media/rc/keymaps/Makefile
+@@ -37,7 +37,6 @@ obj-$(CONFIG_RC_MAP) += rc-adstech-dvb-t-pci.o \
+ rc-gadmei-rm008z.o \
+ rc-genius-tvgo-a11mce.o \
+ rc-gotview7135.o \
+- rc-hauppauge-new.o \
+ rc-imon-mce.o \
+ rc-imon-pad.o \
+ rc-iodata-bctv7e.o \
+@@ -68,8 +67,7 @@ obj-$(CONFIG_RC_MAP) += rc-adstech-dvb-t-pci.o \
+ rc-proteus-2309.o \
+ rc-purpletv.o \
+ rc-pv951.o \
+- rc-rc5-hauppauge-new.o \
+- rc-rc5-tv.o \
++ rc-hauppauge.o \
+ rc-rc6-mce.o \
+ rc-real-audio-220-32-keys.o \
+ rc-streamzap.o \
+diff --git a/drivers/media/rc/keymaps/rc-adstech-dvb-t-pci.c b/drivers/media/rc/keymaps/rc-adstech-dvb-t-pci.c
+index 136d395..9a8752f 100644
+--- a/drivers/media/rc/keymaps/rc-adstech-dvb-t-pci.c
++++ b/drivers/media/rc/keymaps/rc-adstech-dvb-t-pci.c
+@@ -50,9 +50,9 @@ static struct rc_map_table adstech_dvb_t_pci[] = {
+ { 0x13, KEY_TUNER }, /* Live */
+ { 0x0a, KEY_A },
+ { 0x12, KEY_B },
+- { 0x03, KEY_PROG1 }, /* 1 */
+- { 0x01, KEY_PROG2 }, /* 2 */
+- { 0x00, KEY_PROG3 }, /* 3 */
++ { 0x03, KEY_RED }, /* 1 */
++ { 0x01, KEY_GREEN }, /* 2 */
++ { 0x00, KEY_YELLOW }, /* 3 */
+ { 0x06, KEY_DVD },
+ { 0x48, KEY_AUX }, /* Photo */
+ { 0x40, KEY_VIDEO },
+diff --git a/drivers/media/rc/keymaps/rc-avermedia-dvbt.c b/drivers/media/rc/keymaps/rc-avermedia-dvbt.c
+index 3ddb41b..c25809d 100644
+--- a/drivers/media/rc/keymaps/rc-avermedia-dvbt.c
++++ b/drivers/media/rc/keymaps/rc-avermedia-dvbt.c
+@@ -26,12 +26,12 @@ static struct rc_map_table avermedia_dvbt[] = {
+ { 0x16, KEY_8 }, /* '8' / 'down arrow' */
+ { 0x36, KEY_9 }, /* '9' */
+
+- { 0x20, KEY_LIST }, /* 'source' */
++ { 0x20, KEY_VIDEO }, /* 'source' */
+ { 0x10, KEY_TEXT }, /* 'teletext' */
+ { 0x00, KEY_POWER }, /* 'power' */
+ { 0x04, KEY_AUDIO }, /* 'audio' */
+ { 0x06, KEY_ZOOM }, /* 'full screen' */
+- { 0x18, KEY_VIDEO }, /* 'display' */
++ { 0x18, KEY_SWITCHVIDEOMODE }, /* 'display' */
+ { 0x38, KEY_SEARCH }, /* 'loop' */
+ { 0x08, KEY_INFO }, /* 'preview' */
+ { 0x2a, KEY_REWIND }, /* 'backward <<' */
+diff --git a/drivers/media/rc/keymaps/rc-avermedia-m135a.c b/drivers/media/rc/keymaps/rc-avermedia-m135a.c
+index 357fea5..3d2cbe4 100644
+--- a/drivers/media/rc/keymaps/rc-avermedia-m135a.c
++++ b/drivers/media/rc/keymaps/rc-avermedia-m135a.c
+@@ -108,7 +108,7 @@ static struct rc_map_table avermedia_m135a[] = {
+ { 0x0414, KEY_TEXT },
+ { 0x0415, KEY_EPG },
+ { 0x041a, KEY_TV2 }, /* PIP */
+- { 0x041b, KEY_MHP }, /* Snapshot */
++ { 0x041b, KEY_CAMERA }, /* Snapshot */
+
+ { 0x0417, KEY_RECORD },
+ { 0x0416, KEY_PLAYPAUSE },
+diff --git a/drivers/media/rc/keymaps/rc-avermedia-m733a-rm-k6.c b/drivers/media/rc/keymaps/rc-avermedia-m733a-rm-k6.c
+index e694e6e..8cd7f28 100644
+--- a/drivers/media/rc/keymaps/rc-avermedia-m733a-rm-k6.c
++++ b/drivers/media/rc/keymaps/rc-avermedia-m733a-rm-k6.c
+@@ -56,7 +56,7 @@ static struct rc_map_table avermedia_m733a_rm_k6[] = {
+ { 0x0414, KEY_TEXT },
+ { 0x0415, KEY_EPG },
+ { 0x041a, KEY_TV2 }, /* PIP */
+- { 0x041b, KEY_MHP }, /* Snapshot */
++ { 0x041b, KEY_CAMERA }, /* Snapshot */
+
+ { 0x0417, KEY_RECORD },
+ { 0x0416, KEY_PLAYPAUSE },
+diff --git a/drivers/media/rc/keymaps/rc-avermedia-rm-ks.c b/drivers/media/rc/keymaps/rc-avermedia-rm-ks.c
+index f4ca1ff..9d68af2 100644
+--- a/drivers/media/rc/keymaps/rc-avermedia-rm-ks.c
++++ b/drivers/media/rc/keymaps/rc-avermedia-rm-ks.c
+@@ -31,7 +31,7 @@ static struct rc_map_table avermedia_rm_ks[] = {
+ { 0x0505, KEY_VOLUMEDOWN },
+ { 0x0506, KEY_MUTE },
+ { 0x0507, KEY_RIGHT },
+- { 0x0508, KEY_PROG1 },
++ { 0x0508, KEY_RED },
+ { 0x0509, KEY_1 },
+ { 0x050a, KEY_2 },
+ { 0x050b, KEY_3 },
+diff --git a/drivers/media/rc/keymaps/rc-behold-columbus.c b/drivers/media/rc/keymaps/rc-behold-columbus.c
+index 4b787fa..8bf058f 100644
+--- a/drivers/media/rc/keymaps/rc-behold-columbus.c
++++ b/drivers/media/rc/keymaps/rc-behold-columbus.c
+@@ -28,7 +28,7 @@ static struct rc_map_table behold_columbus[] = {
+ * */
+
+ { 0x13, KEY_MUTE },
+- { 0x11, KEY_PROPS },
++ { 0x11, KEY_VIDEO },
+ { 0x1C, KEY_TUNER }, /* KEY_TV/KEY_RADIO */
+ { 0x12, KEY_POWER },
+
+diff --git a/drivers/media/rc/keymaps/rc-behold.c b/drivers/media/rc/keymaps/rc-behold.c
+index 0ee1f14..c909a23 100644
+--- a/drivers/media/rc/keymaps/rc-behold.c
++++ b/drivers/media/rc/keymaps/rc-behold.c
+@@ -97,7 +97,7 @@ static struct rc_map_table behold[] = {
+ { 0x6b861a, KEY_STOP },
+ { 0x6b860e, KEY_TEXT },
+ { 0x6b861f, KEY_RED }, /*XXX KEY_AUDIO */
+- { 0x6b861e, KEY_YELLOW }, /*XXX KEY_SOURCE */
++ { 0x6b861e, KEY_VIDEO },
+
+ /* 0x1d 0x13 0x19 *
+ * SLEEP PREVIEW DVB *
+diff --git a/drivers/media/rc/keymaps/rc-budget-ci-old.c b/drivers/media/rc/keymaps/rc-budget-ci-old.c
+index 97fc386..2f66e43 100644
+--- a/drivers/media/rc/keymaps/rc-budget-ci-old.c
++++ b/drivers/media/rc/keymaps/rc-budget-ci-old.c
+@@ -12,7 +12,8 @@
+
+ #include <media/rc-map.h>
+
+-/* From reading the following remotes:
++/*
++ * From reading the following remotes:
+ * Zenith Universal 7 / TV Mode 807 / VCR Mode 837
+ * Hauppauge (from NOVA-CI-s box product)
+ * This is a "middle of the road" approach, differences are noted
+diff --git a/drivers/media/rc/keymaps/rc-cinergy.c b/drivers/media/rc/keymaps/rc-cinergy.c
+index 99520ff..cf3a6bf 100644
+--- a/drivers/media/rc/keymaps/rc-cinergy.c
++++ b/drivers/media/rc/keymaps/rc-cinergy.c
+@@ -25,7 +25,7 @@ static struct rc_map_table cinergy[] = {
+ { 0x09, KEY_9 },
+
+ { 0x0a, KEY_POWER },
+- { 0x0b, KEY_PROG1 }, /* app */
++ { 0x0b, KEY_MEDIA }, /* app */
+ { 0x0c, KEY_ZOOM }, /* zoom/fullscreen */
+ { 0x0d, KEY_CHANNELUP }, /* channel */
+ { 0x0e, KEY_CHANNELDOWN }, /* channel- */
+diff --git a/drivers/media/rc/keymaps/rc-dntv-live-dvb-t.c b/drivers/media/rc/keymaps/rc-dntv-live-dvb-t.c
+index 43912bd..82c0200 100644
+--- a/drivers/media/rc/keymaps/rc-dntv-live-dvb-t.c
++++ b/drivers/media/rc/keymaps/rc-dntv-live-dvb-t.c
+@@ -32,7 +32,7 @@ static struct rc_map_table dntv_live_dvb_t[] = {
+ { 0x0c, KEY_SEARCH }, /* scan */
+ { 0x0d, KEY_STOP },
+ { 0x0e, KEY_PAUSE },
+- { 0x0f, KEY_LIST }, /* source */
++ { 0x0f, KEY_VIDEO }, /* source */
+
+ { 0x10, KEY_MUTE },
+ { 0x11, KEY_REWIND }, /* backward << */
+diff --git a/drivers/media/rc/keymaps/rc-encore-enltv.c b/drivers/media/rc/keymaps/rc-encore-enltv.c
+index afa4e92..e56ac6e 100644
+--- a/drivers/media/rc/keymaps/rc-encore-enltv.c
++++ b/drivers/media/rc/keymaps/rc-encore-enltv.c
+@@ -24,7 +24,7 @@ static struct rc_map_table encore_enltv[] = {
+ { 0x1e, KEY_TV },
+ { 0x00, KEY_VIDEO },
+ { 0x01, KEY_AUDIO }, /* music */
+- { 0x02, KEY_MHP }, /* picture */
++ { 0x02, KEY_CAMERA }, /* picture */
+
+ { 0x1f, KEY_1 },
+ { 0x03, KEY_2 },
+@@ -77,7 +77,7 @@ static struct rc_map_table encore_enltv[] = {
+ { 0x50, KEY_SLEEP }, /* shutdown */
+ { 0x51, KEY_MODE }, /* stereo > main */
+ { 0x52, KEY_SELECT }, /* stereo > sap */
+- { 0x53, KEY_PROG1 }, /* teletext */
++ { 0x53, KEY_TEXT }, /* teletext */
+
+
+ { 0x59, KEY_RED }, /* AP1 */
+diff --git a/drivers/media/rc/keymaps/rc-encore-enltv2.c b/drivers/media/rc/keymaps/rc-encore-enltv2.c
+index 7d5b00e..b6264f1 100644
+--- a/drivers/media/rc/keymaps/rc-encore-enltv2.c
++++ b/drivers/media/rc/keymaps/rc-encore-enltv2.c
+@@ -32,7 +32,7 @@ static struct rc_map_table encore_enltv2[] = {
+ { 0x64, KEY_LAST }, /* +100 */
+ { 0x4e, KEY_AGAIN }, /* Recall */
+
+- { 0x6c, KEY_SWITCHVIDEOMODE }, /* Video Source */
++ { 0x6c, KEY_VIDEO }, /* Video Source */
+ { 0x5e, KEY_MENU },
+ { 0x56, KEY_SCREEN },
+ { 0x7a, KEY_SETUP },
+diff --git a/drivers/media/rc/keymaps/rc-flydvb.c b/drivers/media/rc/keymaps/rc-flydvb.c
+index aea2f4a..a8b0f66 100644
+--- a/drivers/media/rc/keymaps/rc-flydvb.c
++++ b/drivers/media/rc/keymaps/rc-flydvb.c
+@@ -37,8 +37,8 @@ static struct rc_map_table flydvb[] = {
+ { 0x13, KEY_CHANNELDOWN }, /* CH- */
+ { 0x1d, KEY_ENTER }, /* Enter */
+
+- { 0x1a, KEY_MODE }, /* PIP */
+- { 0x18, KEY_TUNER }, /* Source */
++ { 0x1a, KEY_TV2 }, /* PIP */
++ { 0x18, KEY_VIDEO }, /* Source */
+
+ { 0x1e, KEY_RECORD }, /* Record/Pause */
+ { 0x15, KEY_ANGLE }, /* Swap (no label on key) */
+diff --git a/drivers/media/rc/keymaps/rc-hauppauge-new.c b/drivers/media/rc/keymaps/rc-hauppauge-new.c
+deleted file mode 100644
+index bd11da4..0000000
+--- a/drivers/media/rc/keymaps/rc-hauppauge-new.c
++++ /dev/null
+@@ -1,100 +0,0 @@
+-/* hauppauge-new.h - Keytable for hauppauge_new Remote Controller
+- *
+- * keymap imported from ir-keymaps.c
+- *
+- * Copyright (c) 2010 by Mauro Carvalho Chehab <mchehab@redhat.com>
+- *
+- * 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 <media/rc-map.h>
+-
+-/* Hauppauge: the newer, gray remotes (seems there are multiple
+- * slightly different versions), shipped with cx88+ivtv cards.
+- * almost rc5 coding, but some non-standard keys */
+-
+-static struct rc_map_table hauppauge_new[] = {
+- /* Keys 0 to 9 */
+- { 0x00, KEY_0 },
+- { 0x01, KEY_1 },
+- { 0x02, KEY_2 },
+- { 0x03, KEY_3 },
+- { 0x04, KEY_4 },
+- { 0x05, KEY_5 },
+- { 0x06, KEY_6 },
+- { 0x07, KEY_7 },
+- { 0x08, KEY_8 },
+- { 0x09, KEY_9 },
+-
+- { 0x0a, KEY_TEXT }, /* keypad asterisk as well */
+- { 0x0b, KEY_RED }, /* red button */
+- { 0x0c, KEY_RADIO },
+- { 0x0d, KEY_MENU },
+- { 0x0e, KEY_SUBTITLE }, /* also the # key */
+- { 0x0f, KEY_MUTE },
+- { 0x10, KEY_VOLUMEUP },
+- { 0x11, KEY_VOLUMEDOWN },
+- { 0x12, KEY_PREVIOUS }, /* previous channel */
+- { 0x14, KEY_UP },
+- { 0x15, KEY_DOWN },
+- { 0x16, KEY_LEFT },
+- { 0x17, KEY_RIGHT },
+- { 0x18, KEY_VIDEO }, /* Videos */
+- { 0x19, KEY_AUDIO }, /* Music */
+- /* 0x1a: Pictures - presume this means
+- "Multimedia Home Platform" -
+- no "PICTURES" key in input.h
+- */
+- { 0x1a, KEY_MHP },
+-
+- { 0x1b, KEY_EPG }, /* Guide */
+- { 0x1c, KEY_TV },
+- { 0x1e, KEY_NEXTSONG }, /* skip >| */
+- { 0x1f, KEY_EXIT }, /* back/exit */
+- { 0x20, KEY_CHANNELUP }, /* channel / program + */
+- { 0x21, KEY_CHANNELDOWN }, /* channel / program - */
+- { 0x22, KEY_CHANNEL }, /* source (old black remote) */
+- { 0x24, KEY_PREVIOUSSONG }, /* replay |< */
+- { 0x25, KEY_ENTER }, /* OK */
+- { 0x26, KEY_SLEEP }, /* minimize (old black remote) */
+- { 0x29, KEY_BLUE }, /* blue key */
+- { 0x2e, KEY_GREEN }, /* green button */
+- { 0x30, KEY_PAUSE }, /* pause */
+- { 0x32, KEY_REWIND }, /* backward << */
+- { 0x34, KEY_FASTFORWARD }, /* forward >> */
+- { 0x35, KEY_PLAY },
+- { 0x36, KEY_STOP },
+- { 0x37, KEY_RECORD }, /* recording */
+- { 0x38, KEY_YELLOW }, /* yellow key */
+- { 0x3b, KEY_SELECT }, /* top right button */
+- { 0x3c, KEY_ZOOM }, /* full */
+- { 0x3d, KEY_POWER }, /* system power (green button) */
+-};
+-
+-static struct rc_map_list hauppauge_new_map = {
+- .map = {
+- .scan = hauppauge_new,
+- .size = ARRAY_SIZE(hauppauge_new),
+- .rc_type = RC_TYPE_UNKNOWN, /* Legacy IR type */
+- .name = RC_MAP_HAUPPAUGE_NEW,
+- }
+-};
+-
+-static int __init init_rc_map_hauppauge_new(void)
+-{
+- return rc_map_register(&hauppauge_new_map);
+-}
+-
+-static void __exit exit_rc_map_hauppauge_new(void)
+-{
+- rc_map_unregister(&hauppauge_new_map);
+-}
+-
+-module_init(init_rc_map_hauppauge_new)
+-module_exit(exit_rc_map_hauppauge_new)
+-
+-MODULE_LICENSE("GPL");
+-MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>");
+diff --git a/drivers/media/rc/keymaps/rc-hauppauge.c b/drivers/media/rc/keymaps/rc-hauppauge.c
+new file mode 100644
+index 0000000..cd3db77
+--- /dev/null
++++ b/drivers/media/rc/keymaps/rc-hauppauge.c
+@@ -0,0 +1,241 @@
++/* rc-hauppauge.c - Keytable for Hauppauge Remote Controllers
++ *
++ * keymap imported from ir-keymaps.c
++ *
++ * This map currently contains the code for four different RCs:
++ * - New Hauppauge Gray;
++ * - Old Hauppauge Gray (with a golden screen for media keys);
++ * - Hauppauge Black;
++ * - DSR-0112 remote bundled with Haupauge MiniStick.
++ *
++ * Copyright (c) 2010-2011 by Mauro Carvalho Chehab <mchehab@redhat.com>
++ *
++ * 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 <media/rc-map.h>
++
++/*
++ * Hauppauge:the newer, gray remotes (seems there are multiple
++ * slightly different versions), shipped with cx88+ivtv cards.
++ *
++ * This table contains the complete RC5 code, instead of just the data part
++ */
++
++static struct rc_map_table rc5_hauppauge_new[] = {
++ /*
++ * Remote Controller Hauppauge Gray found on modern devices
++ * Keycodes start with address = 0x1e
++ */
++
++ { 0x1e3b, KEY_SELECT }, /* GO / house symbol */
++ { 0x1e3d, KEY_POWER2 }, /* system power (green button) */
++
++ { 0x1e1c, KEY_TV },
++ { 0x1e18, KEY_VIDEO }, /* Videos */
++ { 0x1e19, KEY_AUDIO }, /* Music */
++ { 0x1e1a, KEY_CAMERA }, /* Pictures */
++
++ { 0x1e1b, KEY_EPG }, /* Guide */
++ { 0x1e0c, KEY_RADIO },
++
++ { 0x1e14, KEY_UP },
++ { 0x1e15, KEY_DOWN },
++ { 0x1e16, KEY_LEFT },
++ { 0x1e17, KEY_RIGHT },
++ { 0x1e25, KEY_OK }, /* OK */
++
++ { 0x1e1f, KEY_EXIT }, /* back/exit */
++ { 0x1e0d, KEY_MENU },
++
++ { 0x1e10, KEY_VOLUMEUP },
++ { 0x1e11, KEY_VOLUMEDOWN },
++
++ { 0x1e12, KEY_PREVIOUS }, /* previous channel */
++ { 0x1e0f, KEY_MUTE },
++
++ { 0x1e20, KEY_CHANNELUP }, /* channel / program + */
++ { 0x1e21, KEY_CHANNELDOWN }, /* channel / program - */
++
++ { 0x1e37, KEY_RECORD }, /* recording */
++ { 0x1e36, KEY_STOP },
++
++ { 0x1e32, KEY_REWIND }, /* backward << */
++ { 0x1e35, KEY_PLAY },
++ { 0x1e34, KEY_FASTFORWARD }, /* forward >> */
++
++ { 0x1e24, KEY_PREVIOUSSONG }, /* replay |< */
++ { 0x1e30, KEY_PAUSE }, /* pause */
++ { 0x1e1e, KEY_NEXTSONG }, /* skip >| */
++
++ { 0x1e01, KEY_1 },
++ { 0x1e02, KEY_2 },
++ { 0x1e03, KEY_3 },
++
++ { 0x1e04, KEY_4 },
++ { 0x1e05, KEY_5 },
++ { 0x1e06, KEY_6 },
++
++ { 0x1e07, KEY_7 },
++ { 0x1e08, KEY_8 },
++ { 0x1e09, KEY_9 },
++
++ { 0x1e0a, KEY_TEXT }, /* keypad asterisk as well */
++ { 0x1e00, KEY_0 },
++ { 0x1e0e, KEY_SUBTITLE }, /* also the Pound key (#) */
++
++ { 0x1e0b, KEY_RED }, /* red button */
++ { 0x1e2e, KEY_GREEN }, /* green button */
++ { 0x1e38, KEY_YELLOW }, /* yellow key */
++ { 0x1e29, KEY_BLUE }, /* blue key */
++
++ /*
++ * Old Remote Controller Hauppauge Gray with a golden screen
++ * Keycodes start with address = 0x1f
++ */
++ { 0x1f3d, KEY_POWER2 }, /* system power (green button) */
++ { 0x1f3b, KEY_SELECT }, /* GO */
++
++ /* Keys 0 to 9 */
++ { 0x1f00, KEY_0 },
++ { 0x1f01, KEY_1 },
++ { 0x1f02, KEY_2 },
++ { 0x1f03, KEY_3 },
++ { 0x1f04, KEY_4 },
++ { 0x1f05, KEY_5 },
++ { 0x1f06, KEY_6 },
++ { 0x1f07, KEY_7 },
++ { 0x1f08, KEY_8 },
++ { 0x1f09, KEY_9 },
++
++ { 0x1f1f, KEY_EXIT }, /* back/exit */
++ { 0x1f0d, KEY_MENU },
++
++ { 0x1f10, KEY_VOLUMEUP },
++ { 0x1f11, KEY_VOLUMEDOWN },
++ { 0x1f20, KEY_CHANNELUP }, /* channel / program + */
++ { 0x1f21, KEY_CHANNELDOWN }, /* channel / program - */
++ { 0x1f25, KEY_ENTER }, /* OK */
++
++ { 0x1f0b, KEY_RED }, /* red button */
++ { 0x1f2e, KEY_GREEN }, /* green button */
++ { 0x1f38, KEY_YELLOW }, /* yellow key */
++ { 0x1f29, KEY_BLUE }, /* blue key */
++
++ { 0x1f0f, KEY_MUTE },
++ { 0x1f0c, KEY_RADIO }, /* There's no indicator on this key */
++ { 0x1f3c, KEY_ZOOM }, /* full */
++
++ { 0x1f32, KEY_REWIND }, /* backward << */
++ { 0x1f35, KEY_PLAY },
++ { 0x1f34, KEY_FASTFORWARD }, /* forward >> */
++
++ { 0x1f37, KEY_RECORD }, /* recording */
++ { 0x1f36, KEY_STOP },
++ { 0x1f30, KEY_PAUSE }, /* pause */
++
++ { 0x1f24, KEY_PREVIOUSSONG }, /* replay |< */
++ { 0x1f1e, KEY_NEXTSONG }, /* skip >| */
++
++ /*
++ * Keycodes for DSR-0112 remote bundled with Haupauge MiniStick
++ * Keycodes start with address = 0x1d
++ */
++ { 0x1d00, KEY_0 },
++ { 0x1d01, KEY_1 },
++ { 0x1d02, KEY_2 },
++ { 0x1d03, KEY_3 },
++ { 0x1d04, KEY_4 },
++ { 0x1d05, KEY_5 },
++ { 0x1d06, KEY_6 },
++ { 0x1d07, KEY_7 },
++ { 0x1d08, KEY_8 },
++ { 0x1d09, KEY_9 },
++ { 0x1d0a, KEY_TEXT },
++ { 0x1d0d, KEY_MENU },
++ { 0x1d0f, KEY_MUTE },
++ { 0x1d10, KEY_VOLUMEUP },
++ { 0x1d11, KEY_VOLUMEDOWN },
++ { 0x1d12, KEY_PREVIOUS }, /* Prev.Ch .. ??? */
++ { 0x1d14, KEY_UP },
++ { 0x1d15, KEY_DOWN },
++ { 0x1d16, KEY_LEFT },
++ { 0x1d17, KEY_RIGHT },
++ { 0x1d1c, KEY_TV },
++ { 0x1d1e, KEY_NEXT }, /* >| */
++ { 0x1d1f, KEY_EXIT },
++ { 0x1d20, KEY_CHANNELUP },
++ { 0x1d21, KEY_CHANNELDOWN },
++ { 0x1d24, KEY_LAST }, /* <| */
++ { 0x1d25, KEY_OK },
++ { 0x1d30, KEY_PAUSE },
++ { 0x1d32, KEY_REWIND },
++ { 0x1d34, KEY_FASTFORWARD },
++ { 0x1d35, KEY_PLAY },
++ { 0x1d36, KEY_STOP },
++ { 0x1d37, KEY_RECORD },
++ { 0x1d3b, KEY_GOTO },
++ { 0x1d3d, KEY_POWER },
++ { 0x1d3f, KEY_HOME },
++
++ /*
++ * Keycodes for the old Black Remote Controller
++ * This one also uses RC-5 protocol
++ * Keycodes start with address = 0x00
++ */
++ { 0x001f, KEY_TV },
++ { 0x0020, KEY_CHANNELUP },
++ { 0x000c, KEY_RADIO },
++
++ { 0x0011, KEY_VOLUMEDOWN },
++ { 0x002e, KEY_ZOOM }, /* full screen */
++ { 0x0010, KEY_VOLUMEUP },
++
++ { 0x000d, KEY_MUTE },
++ { 0x0021, KEY_CHANNELDOWN },
++ { 0x0022, KEY_VIDEO }, /* source */
++
++ { 0x0001, KEY_1 },
++ { 0x0002, KEY_2 },
++ { 0x0003, KEY_3 },
++
++ { 0x0004, KEY_4 },
++ { 0x0005, KEY_5 },
++ { 0x0006, KEY_6 },
++
++ { 0x0007, KEY_7 },
++ { 0x0008, KEY_8 },
++ { 0x0009, KEY_9 },
++
++ { 0x001e, KEY_RED }, /* Reserved */
++ { 0x0000, KEY_0 },
++ { 0x0026, KEY_SLEEP }, /* Minimize */
++};
++
++static struct rc_map_list rc5_hauppauge_new_map = {
++ .map = {
++ .scan = rc5_hauppauge_new,
++ .size = ARRAY_SIZE(rc5_hauppauge_new),
++ .rc_type = RC_TYPE_RC5,
++ .name = RC_MAP_HAUPPAUGE,
++ }
++};
++
++static int __init init_rc_map_rc5_hauppauge_new(void)
++{
++ return rc_map_register(&rc5_hauppauge_new_map);
++}
++
++static void __exit exit_rc_map_rc5_hauppauge_new(void)
++{
++ rc_map_unregister(&rc5_hauppauge_new_map);
++}
++
++module_init(init_rc_map_rc5_hauppauge_new)
++module_exit(exit_rc_map_rc5_hauppauge_new)
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>");
+diff --git a/drivers/media/rc/keymaps/rc-imon-mce.c b/drivers/media/rc/keymaps/rc-imon-mce.c
+index cb67184..937a819 100644
+--- a/drivers/media/rc/keymaps/rc-imon-mce.c
++++ b/drivers/media/rc/keymaps/rc-imon-mce.c
+@@ -111,7 +111,7 @@ static struct rc_map_table imon_mce[] = {
+ { 0x800ff44d, KEY_TITLE },
+
+ { 0x800ff40c, KEY_POWER },
+- { 0x800ff40d, KEY_PROG1 }, /* Windows MCE button */
++ { 0x800ff40d, KEY_LEFTMETA }, /* Windows MCE button */
+
+ };
+
+diff --git a/drivers/media/rc/keymaps/rc-imon-pad.c b/drivers/media/rc/keymaps/rc-imon-pad.c
+index eef46b7..63d42bd 100644
+--- a/drivers/media/rc/keymaps/rc-imon-pad.c
++++ b/drivers/media/rc/keymaps/rc-imon-pad.c
+@@ -125,7 +125,7 @@ static struct rc_map_table imon_pad[] = {
+ { 0x2b8195b7, KEY_CONTEXT_MENU }, /* Left Menu*/
+ { 0x02000065, KEY_COMPOSE }, /* RightMenu */
+ { 0x28b715b7, KEY_COMPOSE }, /* RightMenu */
+- { 0x2ab195b7, KEY_PROG1 }, /* Go or MultiMon */
++ { 0x2ab195b7, KEY_LEFTMETA }, /* Go or MultiMon */
+ { 0x29b715b7, KEY_DASHBOARD }, /* AppLauncher */
+ };
+
+diff --git a/drivers/media/rc/keymaps/rc-kworld-315u.c b/drivers/media/rc/keymaps/rc-kworld-315u.c
+index 3ce6ef7..7f33edb 100644
+--- a/drivers/media/rc/keymaps/rc-kworld-315u.c
++++ b/drivers/media/rc/keymaps/rc-kworld-315u.c
+@@ -17,7 +17,7 @@
+
+ static struct rc_map_table kworld_315u[] = {
+ { 0x6143, KEY_POWER },
+- { 0x6101, KEY_TUNER }, /* source */
++ { 0x6101, KEY_VIDEO }, /* source */
+ { 0x610b, KEY_ZOOM },
+ { 0x6103, KEY_POWER2 }, /* shutdown */
+
+diff --git a/drivers/media/rc/keymaps/rc-kworld-plus-tv-analog.c b/drivers/media/rc/keymaps/rc-kworld-plus-tv-analog.c
+index e45f0b8..08d1831 100644
+--- a/drivers/media/rc/keymaps/rc-kworld-plus-tv-analog.c
++++ b/drivers/media/rc/keymaps/rc-kworld-plus-tv-analog.c
+@@ -17,7 +17,7 @@
+ */
+
+ static struct rc_map_table kworld_plus_tv_analog[] = {
+- { 0x0c, KEY_PROG1 }, /* Kworld key */
++ { 0x0c, KEY_LEFTMETA }, /* Kworld key */
+ { 0x16, KEY_CLOSECD }, /* -> ) */
+ { 0x1d, KEY_POWER2 },
+
+diff --git a/drivers/media/rc/keymaps/rc-msi-tvanywhere-plus.c b/drivers/media/rc/keymaps/rc-msi-tvanywhere-plus.c
+index fa8fd0a..8e9969d 100644
+--- a/drivers/media/rc/keymaps/rc-msi-tvanywhere-plus.c
++++ b/drivers/media/rc/keymaps/rc-msi-tvanywhere-plus.c
+@@ -62,7 +62,7 @@ static struct rc_map_table msi_tvanywhere_plus[] = {
+ { 0x13, KEY_AGAIN }, /* Recall */
+
+ { 0x1e, KEY_POWER }, /* Power */
+- { 0x07, KEY_TUNER }, /* Source */
++ { 0x07, KEY_VIDEO }, /* Source */
+ { 0x1c, KEY_SEARCH }, /* Scan */
+ { 0x18, KEY_MUTE }, /* Mute */
+
+diff --git a/drivers/media/rc/keymaps/rc-nebula.c b/drivers/media/rc/keymaps/rc-nebula.c
+index 3e6f077..ddae20e 100644
+--- a/drivers/media/rc/keymaps/rc-nebula.c
++++ b/drivers/media/rc/keymaps/rc-nebula.c
+@@ -27,7 +27,7 @@ static struct rc_map_table nebula[] = {
+ { 0x0b, KEY_AUX },
+ { 0x0c, KEY_DVD },
+ { 0x0d, KEY_POWER },
+- { 0x0e, KEY_MHP }, /* labelled 'Picture' */
++ { 0x0e, KEY_CAMERA }, /* labelled 'Picture' */
+ { 0x0f, KEY_AUDIO },
+ { 0x10, KEY_INFO },
+ { 0x11, KEY_F13 }, /* 16:9 */
+diff --git a/drivers/media/rc/keymaps/rc-norwood.c b/drivers/media/rc/keymaps/rc-norwood.c
+index 629ee9d..f1c1281 100644
+--- a/drivers/media/rc/keymaps/rc-norwood.c
++++ b/drivers/media/rc/keymaps/rc-norwood.c
+@@ -29,7 +29,7 @@ static struct rc_map_table norwood[] = {
+ { 0x28, KEY_8 },
+ { 0x29, KEY_9 },
+
+- { 0x78, KEY_TUNER }, /* Video Source */
++ { 0x78, KEY_VIDEO }, /* Video Source */
+ { 0x2c, KEY_EXIT }, /* Open/Close software */
+ { 0x2a, KEY_SELECT }, /* 2 Digit Select */
+ { 0x69, KEY_AGAIN }, /* Recall */
+diff --git a/drivers/media/rc/keymaps/rc-pctv-sedna.c b/drivers/media/rc/keymaps/rc-pctv-sedna.c
+index fa5ae59..7cdef6e 100644
+--- a/drivers/media/rc/keymaps/rc-pctv-sedna.c
++++ b/drivers/media/rc/keymaps/rc-pctv-sedna.c
+@@ -36,7 +36,7 @@ static struct rc_map_table pctv_sedna[] = {
+ { 0x0e, KEY_STOP },
+ { 0x0f, KEY_PREVIOUSSONG },
+ { 0x10, KEY_ZOOM },
+- { 0x11, KEY_TUNER }, /* Source */
++ { 0x11, KEY_VIDEO }, /* Source */
+ { 0x12, KEY_POWER },
+ { 0x13, KEY_MUTE },
+ { 0x15, KEY_CHANNELDOWN },
+diff --git a/drivers/media/rc/keymaps/rc-pixelview-mk12.c b/drivers/media/rc/keymaps/rc-pixelview-mk12.c
+index 8d9f664..125fc39 100644
+--- a/drivers/media/rc/keymaps/rc-pixelview-mk12.c
++++ b/drivers/media/rc/keymaps/rc-pixelview-mk12.c
+@@ -34,7 +34,7 @@ static struct rc_map_table pixelview_mk12[] = {
+ { 0x866b13, KEY_AGAIN }, /* loop */
+ { 0x866b10, KEY_DIGITS }, /* +100 */
+
+- { 0x866b00, KEY_MEDIA }, /* source */
++ { 0x866b00, KEY_VIDEO }, /* source */
+ { 0x866b18, KEY_MUTE }, /* mute */
+ { 0x866b19, KEY_CAMERA }, /* snapshot */
+ { 0x866b1a, KEY_SEARCH }, /* scan */
+diff --git a/drivers/media/rc/keymaps/rc-pixelview-new.c b/drivers/media/rc/keymaps/rc-pixelview-new.c
+index 777a700..bd78d6a 100644
+--- a/drivers/media/rc/keymaps/rc-pixelview-new.c
++++ b/drivers/media/rc/keymaps/rc-pixelview-new.c
+@@ -33,7 +33,7 @@ static struct rc_map_table pixelview_new[] = {
+ { 0x3e, KEY_0 },
+
+ { 0x1c, KEY_AGAIN }, /* LOOP */
+- { 0x3f, KEY_MEDIA }, /* Source */
++ { 0x3f, KEY_VIDEO }, /* Source */
+ { 0x1f, KEY_LAST }, /* +100 */
+ { 0x1b, KEY_MUTE },
+
+diff --git a/drivers/media/rc/keymaps/rc-pixelview.c b/drivers/media/rc/keymaps/rc-pixelview.c
+index 0ec5988..06187e7 100644
+--- a/drivers/media/rc/keymaps/rc-pixelview.c
++++ b/drivers/media/rc/keymaps/rc-pixelview.c
+@@ -15,7 +15,7 @@
+ static struct rc_map_table pixelview[] = {
+
+ { 0x1e, KEY_POWER }, /* power */
+- { 0x07, KEY_MEDIA }, /* source */
++ { 0x07, KEY_VIDEO }, /* source */
+ { 0x1c, KEY_SEARCH }, /* scan */
+
+
+diff --git a/drivers/media/rc/keymaps/rc-pv951.c b/drivers/media/rc/keymaps/rc-pv951.c
+index 83a418d..5e8beee 100644
+--- a/drivers/media/rc/keymaps/rc-pv951.c
++++ b/drivers/media/rc/keymaps/rc-pv951.c
+@@ -46,10 +46,10 @@ static struct rc_map_table pv951[] = {
+ { 0x0c, KEY_SEARCH }, /* AUTOSCAN */
+
+ /* Not sure what to do with these ones! */
+- { 0x0f, KEY_SELECT }, /* SOURCE */
++ { 0x0f, KEY_VIDEO }, /* SOURCE */
+ { 0x0a, KEY_KPPLUS }, /* +100 */
+ { 0x14, KEY_EQUAL }, /* SYNC */
+- { 0x1c, KEY_MEDIA }, /* PC/TV */
++ { 0x1c, KEY_TV }, /* PC/TV */
+ };
+
+ static struct rc_map_list pv951_map = {
+diff --git a/drivers/media/rc/keymaps/rc-rc5-hauppauge-new.c b/drivers/media/rc/keymaps/rc-rc5-hauppauge-new.c
+deleted file mode 100644
+index dfc9b15..0000000
+--- a/drivers/media/rc/keymaps/rc-rc5-hauppauge-new.c
++++ /dev/null
+@@ -1,141 +0,0 @@
+-/* rc5-hauppauge-new.h - Keytable for rc5_hauppauge_new Remote Controller
+- *
+- * keymap imported from ir-keymaps.c
+- *
+- * Copyright (c) 2010 by Mauro Carvalho Chehab <mchehab@redhat.com>
+- *
+- * 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 <media/rc-map.h>
+-
+-/*
+- * Hauppauge:the newer, gray remotes (seems there are multiple
+- * slightly different versions), shipped with cx88+ivtv cards.
+- *
+- * This table contains the complete RC5 code, instead of just the data part
+- */
+-
+-static struct rc_map_table rc5_hauppauge_new[] = {
+- /* Keys 0 to 9 */
+- { 0x1e00, KEY_0 },
+- { 0x1e01, KEY_1 },
+- { 0x1e02, KEY_2 },
+- { 0x1e03, KEY_3 },
+- { 0x1e04, KEY_4 },
+- { 0x1e05, KEY_5 },
+- { 0x1e06, KEY_6 },
+- { 0x1e07, KEY_7 },
+- { 0x1e08, KEY_8 },
+- { 0x1e09, KEY_9 },
+-
+- { 0x1e0a, KEY_TEXT }, /* keypad asterisk as well */
+- { 0x1e0b, KEY_RED }, /* red button */
+- { 0x1e0c, KEY_RADIO },
+- { 0x1e0d, KEY_MENU },
+- { 0x1e0e, KEY_SUBTITLE }, /* also the # key */
+- { 0x1e0f, KEY_MUTE },
+- { 0x1e10, KEY_VOLUMEUP },
+- { 0x1e11, KEY_VOLUMEDOWN },
+- { 0x1e12, KEY_PREVIOUS }, /* previous channel */
+- { 0x1e14, KEY_UP },
+- { 0x1e15, KEY_DOWN },
+- { 0x1e16, KEY_LEFT },
+- { 0x1e17, KEY_RIGHT },
+- { 0x1e18, KEY_VIDEO }, /* Videos */
+- { 0x1e19, KEY_AUDIO }, /* Music */
+- /* 0x1e1a: Pictures - presume this means
+- "Multimedia Home Platform" -
+- no "PICTURES" key in input.h
+- */
+- { 0x1e1a, KEY_MHP },
+-
+- { 0x1e1b, KEY_EPG }, /* Guide */
+- { 0x1e1c, KEY_TV },
+- { 0x1e1e, KEY_NEXTSONG }, /* skip >| */
+- { 0x1e1f, KEY_EXIT }, /* back/exit */
+- { 0x1e20, KEY_CHANNELUP }, /* channel / program + */
+- { 0x1e21, KEY_CHANNELDOWN }, /* channel / program - */
+- { 0x1e22, KEY_CHANNEL }, /* source (old black remote) */
+- { 0x1e24, KEY_PREVIOUSSONG }, /* replay |< */
+- { 0x1e25, KEY_ENTER }, /* OK */
+- { 0x1e26, KEY_SLEEP }, /* minimize (old black remote) */
+- { 0x1e29, KEY_BLUE }, /* blue key */
+- { 0x1e2e, KEY_GREEN }, /* green button */
+- { 0x1e30, KEY_PAUSE }, /* pause */
+- { 0x1e32, KEY_REWIND }, /* backward << */
+- { 0x1e34, KEY_FASTFORWARD }, /* forward >> */
+- { 0x1e35, KEY_PLAY },
+- { 0x1e36, KEY_STOP },
+- { 0x1e37, KEY_RECORD }, /* recording */
+- { 0x1e38, KEY_YELLOW }, /* yellow key */
+- { 0x1e3b, KEY_SELECT }, /* top right button */
+- { 0x1e3c, KEY_ZOOM }, /* full */
+- { 0x1e3d, KEY_POWER }, /* system power (green button) */
+-
+- /* Keycodes for DSR-0112 remote bundled with Haupauge MiniStick */
+- { 0x1d00, KEY_0 },
+- { 0x1d01, KEY_1 },
+- { 0x1d02, KEY_2 },
+- { 0x1d03, KEY_3 },
+- { 0x1d04, KEY_4 },
+- { 0x1d05, KEY_5 },
+- { 0x1d06, KEY_6 },
+- { 0x1d07, KEY_7 },
+- { 0x1d08, KEY_8 },
+- { 0x1d09, KEY_9 },
+- { 0x1d0a, KEY_TEXT },
+- { 0x1d0d, KEY_MENU },
+- { 0x1d0f, KEY_MUTE },
+- { 0x1d10, KEY_VOLUMEUP },
+- { 0x1d11, KEY_VOLUMEDOWN },
+- { 0x1d12, KEY_PREVIOUS }, /* Prev.Ch .. ??? */
+- { 0x1d14, KEY_UP },
+- { 0x1d15, KEY_DOWN },
+- { 0x1d16, KEY_LEFT },
+- { 0x1d17, KEY_RIGHT },
+- { 0x1d1c, KEY_TV },
+- { 0x1d1e, KEY_NEXT }, /* >| */
+- { 0x1d1f, KEY_EXIT },
+- { 0x1d20, KEY_CHANNELUP },
+- { 0x1d21, KEY_CHANNELDOWN },
+- { 0x1d24, KEY_LAST }, /* <| */
+- { 0x1d25, KEY_OK },
+- { 0x1d30, KEY_PAUSE },
+- { 0x1d32, KEY_REWIND },
+- { 0x1d34, KEY_FASTFORWARD },
+- { 0x1d35, KEY_PLAY },
+- { 0x1d36, KEY_STOP },
+- { 0x1d37, KEY_RECORD },
+- { 0x1d3b, KEY_GOTO },
+- { 0x1d3d, KEY_POWER },
+- { 0x1d3f, KEY_HOME },
+-};
+-
+-static struct rc_map_list rc5_hauppauge_new_map = {
+- .map = {
+- .scan = rc5_hauppauge_new,
+- .size = ARRAY_SIZE(rc5_hauppauge_new),
+- .rc_type = RC_TYPE_RC5,
+- .name = RC_MAP_RC5_HAUPPAUGE_NEW,
+- }
+-};
+-
+-static int __init init_rc_map_rc5_hauppauge_new(void)
+-{
+- return rc_map_register(&rc5_hauppauge_new_map);
+-}
+-
+-static void __exit exit_rc_map_rc5_hauppauge_new(void)
+-{
+- rc_map_unregister(&rc5_hauppauge_new_map);
+-}
+-
+-module_init(init_rc_map_rc5_hauppauge_new)
+-module_exit(exit_rc_map_rc5_hauppauge_new)
+-
+-MODULE_LICENSE("GPL");
+-MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>");
+diff --git a/drivers/media/rc/keymaps/rc-rc5-tv.c b/drivers/media/rc/keymaps/rc-rc5-tv.c
+deleted file mode 100644
+index 4fcef9f..0000000
+--- a/drivers/media/rc/keymaps/rc-rc5-tv.c
++++ /dev/null
+@@ -1,81 +0,0 @@
+-/* rc5-tv.h - Keytable for rc5_tv Remote Controller
+- *
+- * keymap imported from ir-keymaps.c
+- *
+- * Copyright (c) 2010 by Mauro Carvalho Chehab <mchehab@redhat.com>
+- *
+- * 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 <media/rc-map.h>
+-
+-/* generic RC5 keytable */
+-/* see http://users.pandora.be/nenya/electronics/rc5/codes00.htm */
+-/* used by old (black) Hauppauge remotes */
+-
+-static struct rc_map_table rc5_tv[] = {
+- /* Keys 0 to 9 */
+- { 0x00, KEY_0 },
+- { 0x01, KEY_1 },
+- { 0x02, KEY_2 },
+- { 0x03, KEY_3 },
+- { 0x04, KEY_4 },
+- { 0x05, KEY_5 },
+- { 0x06, KEY_6 },
+- { 0x07, KEY_7 },
+- { 0x08, KEY_8 },
+- { 0x09, KEY_9 },
+-
+- { 0x0b, KEY_CHANNEL }, /* channel / program (japan: 11) */
+- { 0x0c, KEY_POWER }, /* standby */
+- { 0x0d, KEY_MUTE }, /* mute / demute */
+- { 0x0f, KEY_TV }, /* display */
+- { 0x10, KEY_VOLUMEUP },
+- { 0x11, KEY_VOLUMEDOWN },
+- { 0x12, KEY_BRIGHTNESSUP },
+- { 0x13, KEY_BRIGHTNESSDOWN },
+- { 0x1e, KEY_SEARCH }, /* search + */
+- { 0x20, KEY_CHANNELUP }, /* channel / program + */
+- { 0x21, KEY_CHANNELDOWN }, /* channel / program - */
+- { 0x22, KEY_CHANNEL }, /* alt / channel */
+- { 0x23, KEY_LANGUAGE }, /* 1st / 2nd language */
+- { 0x26, KEY_SLEEP }, /* sleeptimer */
+- { 0x2e, KEY_MENU }, /* 2nd controls (USA: menu) */
+- { 0x30, KEY_PAUSE },
+- { 0x32, KEY_REWIND },
+- { 0x33, KEY_GOTO },
+- { 0x35, KEY_PLAY },
+- { 0x36, KEY_STOP },
+- { 0x37, KEY_RECORD }, /* recording */
+- { 0x3c, KEY_TEXT }, /* teletext submode (Japan: 12) */
+- { 0x3d, KEY_SUSPEND }, /* system standby */
+-
+-};
+-
+-static struct rc_map_list rc5_tv_map = {
+- .map = {
+- .scan = rc5_tv,
+- .size = ARRAY_SIZE(rc5_tv),
+- .rc_type = RC_TYPE_UNKNOWN, /* Legacy IR type */
+- .name = RC_MAP_RC5_TV,
+- }
+-};
+-
+-static int __init init_rc_map_rc5_tv(void)
+-{
+- return rc_map_register(&rc5_tv_map);
+-}
+-
+-static void __exit exit_rc_map_rc5_tv(void)
+-{
+- rc_map_unregister(&rc5_tv_map);
+-}
+-
+-module_init(init_rc_map_rc5_tv)
+-module_exit(exit_rc_map_rc5_tv)
+-
+-MODULE_LICENSE("GPL");
+-MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>");
+diff --git a/drivers/media/rc/keymaps/rc-rc6-mce.c b/drivers/media/rc/keymaps/rc-rc6-mce.c
+index 2f5dc06..8dd519e 100644
+--- a/drivers/media/rc/keymaps/rc-rc6-mce.c
++++ b/drivers/media/rc/keymaps/rc-rc6-mce.c
+@@ -30,7 +30,7 @@ static struct rc_map_table rc6_mce[] = {
+ { 0x800f040a, KEY_DELETE },
+ { 0x800f040b, KEY_ENTER },
+ { 0x800f040c, KEY_POWER }, /* PC Power */
+- { 0x800f040d, KEY_PROG1 }, /* Windows MCE button */
++ { 0x800f040d, KEY_LEFTMETA }, /* Windows MCE button */
+ { 0x800f040e, KEY_MUTE },
+ { 0x800f040f, KEY_INFO },
+
+diff --git a/drivers/media/rc/keymaps/rc-real-audio-220-32-keys.c b/drivers/media/rc/keymaps/rc-real-audio-220-32-keys.c
+index 2d14598..6813d11 100644
+--- a/drivers/media/rc/keymaps/rc-real-audio-220-32-keys.c
++++ b/drivers/media/rc/keymaps/rc-real-audio-220-32-keys.c
+@@ -35,7 +35,7 @@ static struct rc_map_table real_audio_220_32_keys[] = {
+ { 0x15, KEY_CHANNELDOWN},
+ { 0x16, KEY_ENTER},
+
+- { 0x11, KEY_LIST}, /* Source */
++ { 0x11, KEY_VIDEO}, /* Source */
+ { 0x0d, KEY_AUDIO}, /* stereo */
+
+ { 0x0f, KEY_PREVIOUS}, /* Prev */
+diff --git a/drivers/media/rc/keymaps/rc-winfast.c b/drivers/media/rc/keymaps/rc-winfast.c
+index 2747db4..0062ca2 100644
+--- a/drivers/media/rc/keymaps/rc-winfast.c
++++ b/drivers/media/rc/keymaps/rc-winfast.c
+@@ -27,15 +27,15 @@ static struct rc_map_table winfast[] = {
+ { 0x0e, KEY_8 },
+ { 0x0f, KEY_9 },
+
+- { 0x00, KEY_POWER },
++ { 0x00, KEY_POWER2 },
+ { 0x1b, KEY_AUDIO }, /* Audio Source */
+ { 0x02, KEY_TUNER }, /* TV/FM, not on Y0400052 */
+ { 0x1e, KEY_VIDEO }, /* Video Source */
+ { 0x16, KEY_INFO }, /* Display information */
+- { 0x04, KEY_VOLUMEUP },
+- { 0x08, KEY_VOLUMEDOWN },
+- { 0x0c, KEY_CHANNELUP },
+- { 0x10, KEY_CHANNELDOWN },
++ { 0x04, KEY_LEFT },
++ { 0x08, KEY_RIGHT },
++ { 0x0c, KEY_UP },
++ { 0x10, KEY_DOWN },
+ { 0x03, KEY_ZOOM }, /* fullscreen */
+ { 0x1f, KEY_TEXT }, /* closed caption/teletext */
+ { 0x20, KEY_SLEEP },
+@@ -47,7 +47,7 @@ static struct rc_map_table winfast[] = {
+ { 0x2e, KEY_BLUE },
+ { 0x18, KEY_KPPLUS }, /* fine tune + , not on Y040052 */
+ { 0x19, KEY_KPMINUS }, /* fine tune - , not on Y040052 */
+- { 0x2a, KEY_MEDIA }, /* PIP (Picture in picture */
++ { 0x2a, KEY_TV2 }, /* PIP (Picture in picture */
+ { 0x21, KEY_DOT },
+ { 0x13, KEY_ENTER },
+ { 0x11, KEY_LAST }, /* Recall (last channel */
+@@ -57,7 +57,7 @@ static struct rc_map_table winfast[] = {
+ { 0x25, KEY_TIME }, /* Time Shifting */
+ { 0x26, KEY_STOP },
+ { 0x27, KEY_RECORD },
+- { 0x28, KEY_SAVE }, /* Screenshot */
++ { 0x28, KEY_CAMERA }, /* Screenshot */
+ { 0x2f, KEY_MENU },
+ { 0x30, KEY_CANCEL },
+ { 0x31, KEY_CHANNEL }, /* Channel Surf */
+@@ -70,10 +70,10 @@ static struct rc_map_table winfast[] = {
+ { 0x38, KEY_DVD },
+
+ { 0x1a, KEY_MODE}, /* change to MCE mode on Y04G0051 */
+- { 0x3e, KEY_F21 }, /* MCE +VOL, on Y04G0033 */
+- { 0x3a, KEY_F22 }, /* MCE -VOL, on Y04G0033 */
+- { 0x3b, KEY_F23 }, /* MCE +CH, on Y04G0033 */
+- { 0x3f, KEY_F24 } /* MCE -CH, on Y04G0033 */
++ { 0x3e, KEY_VOLUMEUP }, /* MCE +VOL, on Y04G0033 */
++ { 0x3a, KEY_VOLUMEDOWN }, /* MCE -VOL, on Y04G0033 */
++ { 0x3b, KEY_CHANNELUP }, /* MCE +CH, on Y04G0033 */
++ { 0x3f, KEY_CHANNELDOWN } /* MCE -CH, on Y04G0033 */
+ };
+
+ static struct rc_map_list winfast_map = {
+diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c
+index e4f8eac..044fb7a 100644
+--- a/drivers/media/rc/mceusb.c
++++ b/drivers/media/rc/mceusb.c
+@@ -186,7 +186,7 @@ static const struct mceusb_model mceusb_model[] = {
+ * remotes, but we should have something handy,
+ * to allow testing it
+ */
+- .rc_map = RC_MAP_RC5_HAUPPAUGE_NEW,
++ .rc_map = RC_MAP_HAUPPAUGE,
+ .name = "Conexant Hybrid TV (cx231xx) MCE IR",
+ },
+ [CX_HYBRID_TV] = {
+@@ -261,7 +261,7 @@ static struct usb_device_id mceusb_dev_table[] = {
+ .driver_info = MCE_GEN2_TX_INV },
+ /* Topseed eHome Infrared Transceiver */
+ { USB_DEVICE(VENDOR_TOPSEED, 0x0011),
+- .driver_info = MCE_GEN2_TX_INV },
++ .driver_info = MCE_GEN3 },
+ /* Ricavision internal Infrared Transceiver */
+ { USB_DEVICE(VENDOR_RICAVISION, 0x0010) },
+ /* Itron ione Libra Q-11 */
+diff --git a/drivers/media/video/cx18/cx18-i2c.c b/drivers/media/video/cx18/cx18-i2c.c
+index c330fb9..040aaa8 100644
+--- a/drivers/media/video/cx18/cx18-i2c.c
++++ b/drivers/media/video/cx18/cx18-i2c.c
+@@ -96,7 +96,7 @@ static int cx18_i2c_new_ir(struct cx18 *cx, struct i2c_adapter *adap, u32 hw,
+ /* Our default information for ir-kbd-i2c.c to use */
+ switch (hw) {
+ case CX18_HW_Z8F0811_IR_RX_HAUP:
+- init_data->ir_codes = RC_MAP_HAUPPAUGE_NEW;
++ init_data->ir_codes = RC_MAP_HAUPPAUGE;
+ init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
+ init_data->type = RC_TYPE_RC5;
+ init_data->name = cx->card_name;
+diff --git a/drivers/media/video/cx23885/cx23885-input.c b/drivers/media/video/cx23885/cx23885-input.c
+index 199b996..e97cafd 100644
+--- a/drivers/media/video/cx23885/cx23885-input.c
++++ b/drivers/media/video/cx23885/cx23885-input.c
+@@ -264,7 +264,7 @@ int cx23885_input_init(struct cx23885_dev *dev)
+ driver_type = RC_DRIVER_IR_RAW;
+ allowed_protos = RC_TYPE_ALL;
+ /* The grey Hauppauge RC-5 remote */
+- rc_map = RC_MAP_RC5_HAUPPAUGE_NEW;
++ rc_map = RC_MAP_HAUPPAUGE;
+ break;
+ case CX23885_BOARD_TEVII_S470:
+ /* Integrated CX23885 IR controller */
+diff --git a/drivers/media/video/cx88/cx88-input.c b/drivers/media/video/cx88/cx88-input.c
+index fbfbba5..c820e2f 100644
+--- a/drivers/media/video/cx88/cx88-input.c
++++ b/drivers/media/video/cx88/cx88-input.c
+@@ -283,7 +283,7 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
+ case CX88_BOARD_PCHDTV_HD3000:
+ case CX88_BOARD_PCHDTV_HD5500:
+ case CX88_BOARD_HAUPPAUGE_IRONLY:
+- ir_codes = RC_MAP_HAUPPAUGE_NEW;
++ ir_codes = RC_MAP_HAUPPAUGE;
+ ir->sampling = 1;
+ break;
+ case CX88_BOARD_WINFAST_DTV2000H:
+@@ -604,7 +604,7 @@ void cx88_i2c_init_ir(struct cx88_core *core)
+ if (*addrp == 0x71) {
+ /* Hauppauge XVR */
+ core->init_data.name = "cx88 Hauppauge XVR remote";
+- core->init_data.ir_codes = RC_MAP_HAUPPAUGE_NEW;
++ core->init_data.ir_codes = RC_MAP_HAUPPAUGE;
+ core->init_data.type = RC_TYPE_RC5;
+ core->init_data.internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
+
+diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c
+index 87f77a3..69fcea8 100644
+--- a/drivers/media/video/em28xx/em28xx-cards.c
++++ b/drivers/media/video/em28xx/em28xx-cards.c
+@@ -834,7 +834,7 @@ struct em28xx_board em28xx_boards[] = {
+ .mts_firmware = 1,
+ .has_dvb = 1,
+ .dvb_gpio = hauppauge_wintv_hvr_900_digital,
+- .ir_codes = RC_MAP_HAUPPAUGE_NEW,
++ .ir_codes = RC_MAP_HAUPPAUGE,
+ .decoder = EM28XX_TVP5150,
+ .input = { {
+ .type = EM28XX_VMUX_TELEVISION,
+@@ -859,7 +859,7 @@ struct em28xx_board em28xx_boards[] = {
+ .tuner_type = TUNER_XC2028,
+ .tuner_gpio = default_tuner_gpio,
+ .mts_firmware = 1,
+- .ir_codes = RC_MAP_HAUPPAUGE_NEW,
++ .ir_codes = RC_MAP_HAUPPAUGE,
+ .decoder = EM28XX_TVP5150,
+ .input = { {
+ .type = EM28XX_VMUX_TELEVISION,
+@@ -885,7 +885,7 @@ struct em28xx_board em28xx_boards[] = {
+ .mts_firmware = 1,
+ .has_dvb = 1,
+ .dvb_gpio = hauppauge_wintv_hvr_900_digital,
+- .ir_codes = RC_MAP_HAUPPAUGE_NEW,
++ .ir_codes = RC_MAP_HAUPPAUGE,
+ .decoder = EM28XX_TVP5150,
+ .input = { {
+ .type = EM28XX_VMUX_TELEVISION,
+@@ -911,7 +911,7 @@ struct em28xx_board em28xx_boards[] = {
+ .mts_firmware = 1,
+ .has_dvb = 1,
+ .dvb_gpio = hauppauge_wintv_hvr_900_digital,
+- .ir_codes = RC_MAP_RC5_HAUPPAUGE_NEW,
++ .ir_codes = RC_MAP_HAUPPAUGE,
+ .decoder = EM28XX_TVP5150,
+ .input = { {
+ .type = EM28XX_VMUX_TELEVISION,
+@@ -2430,7 +2430,7 @@ void em28xx_register_i2c_ir(struct em28xx *dev)
+ dev->init_data.name = "i2c IR (EM28XX Pinnacle PCTV)";
+ break;
+ case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
+- dev->init_data.ir_codes = RC_MAP_RC5_HAUPPAUGE_NEW;
++ dev->init_data.ir_codes = RC_MAP_HAUPPAUGE;
+ dev->init_data.get_key = em28xx_get_key_em_haup;
+ dev->init_data.name = "i2c IR (EM2840 Hauppauge)";
+ break;
+diff --git a/drivers/media/video/hdpvr/hdpvr-i2c.c b/drivers/media/video/hdpvr/hdpvr-i2c.c
+index e53fa55..2a1ac28 100644
+--- a/drivers/media/video/hdpvr/hdpvr-i2c.c
++++ b/drivers/media/video/hdpvr/hdpvr-i2c.c
+@@ -52,25 +52,36 @@ struct i2c_client *hdpvr_register_ir_rx_i2c(struct hdpvr_device *dev)
+ };
+
+ /* Our default information for ir-kbd-i2c.c to use */
+- init_data->ir_codes = RC_MAP_HAUPPAUGE_NEW;
++ init_data->ir_codes = RC_MAP_HAUPPAUGE;
+ init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
+ init_data->type = RC_TYPE_RC5;
+ init_data->name = "HD-PVR";
++ init_data->polling_interval = 405; /* ms, duplicated from Windows */
+ hdpvr_ir_rx_i2c_board_info.platform_data = init_data;
+
+ return i2c_new_device(&dev->i2c_adapter, &hdpvr_ir_rx_i2c_board_info);
+ }
+
+ static int hdpvr_i2c_read(struct hdpvr_device *dev, int bus,
+- unsigned char addr, char *data, int len)
++ unsigned char addr, char *wdata, int wlen,
++ char *data, int len)
+ {
+ int ret;
+
+- if (len > sizeof(dev->i2c_buf))
++ if ((len > sizeof(dev->i2c_buf)) || (wlen > sizeof(dev->i2c_buf)))
+ return -EINVAL;
+
+- ret = usb_control_msg(dev->udev,
+- usb_rcvctrlpipe(dev->udev, 0),
++ if (wlen) {
++ memcpy(&dev->i2c_buf, wdata, wlen);
++ ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
++ REQTYPE_I2C_WRITE, CTRL_WRITE_REQUEST,
++ (bus << 8) | addr, 0, &dev->i2c_buf,
++ wlen, 1000);
++ if (ret < 0)
++ return ret;
++ }
++
++ ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
+ REQTYPE_I2C_READ, CTRL_READ_REQUEST,
+ (bus << 8) | addr, 0, &dev->i2c_buf, len, 1000);
+
+@@ -92,16 +103,14 @@ static int hdpvr_i2c_write(struct hdpvr_device *dev, int bus,
+ return -EINVAL;
+
+ memcpy(&dev->i2c_buf, data, len);
+- ret = usb_control_msg(dev->udev,
+- usb_sndctrlpipe(dev->udev, 0),
++ ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
+ REQTYPE_I2C_WRITE, CTRL_WRITE_REQUEST,
+ (bus << 8) | addr, 0, &dev->i2c_buf, len, 1000);
+
+ if (ret < 0)
+ return ret;
+
+- ret = usb_control_msg(dev->udev,
+- usb_rcvctrlpipe(dev->udev, 0),
++ ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
+ REQTYPE_I2C_WRITE_STATT, CTRL_READ_REQUEST,
+ 0, 0, &dev->i2c_buf, 2, 1000);
+
+@@ -117,24 +126,49 @@ static int hdpvr_transfer(struct i2c_adapter *i2c_adapter, struct i2c_msg *msgs,
+ int num)
+ {
+ struct hdpvr_device *dev = i2c_get_adapdata(i2c_adapter);
+- int retval = 0, i, addr;
++ int retval = 0, addr;
+
+ if (num <= 0)
+ return 0;
+
+ mutex_lock(&dev->i2c_mutex);
+
+- for (i = 0; i < num && !retval; i++) {
+- addr = msgs[i].addr << 1;
++ addr = msgs[0].addr << 1;
+
+- if (msgs[i].flags & I2C_M_RD)
+- retval = hdpvr_i2c_read(dev, 1, addr, msgs[i].buf,
+- msgs[i].len);
++ if (num == 1) {
++ if (msgs[0].flags & I2C_M_RD)
++ retval = hdpvr_i2c_read(dev, 1, addr, NULL, 0,
++ msgs[0].buf, msgs[0].len);
+ else
+- retval = hdpvr_i2c_write(dev, 1, addr, msgs[i].buf,
+- msgs[i].len);
++ retval = hdpvr_i2c_write(dev, 1, addr, msgs[0].buf,
++ msgs[0].len);
++ } else if (num == 2) {
++ if (msgs[0].addr != msgs[1].addr) {
++ v4l2_warn(&dev->v4l2_dev, "refusing 2-phase i2c xfer "
++ "with conflicting target addresses\n");
++ retval = -EINVAL;
++ goto out;
++ }
++
++ if ((msgs[0].flags & I2C_M_RD) || !(msgs[1].flags & I2C_M_RD)) {
++ v4l2_warn(&dev->v4l2_dev, "refusing complex xfer with "
++ "r0=%d, r1=%d\n", msgs[0].flags & I2C_M_RD,
++ msgs[1].flags & I2C_M_RD);
++ retval = -EINVAL;
++ goto out;
++ }
++
++ /*
++ * Write followed by atomic read is the only complex xfer that
++ * we actually support here.
++ */
++ retval = hdpvr_i2c_read(dev, 1, addr, msgs[0].buf, msgs[0].len,
++ msgs[1].buf, msgs[1].len);
++ } else {
++ v4l2_warn(&dev->v4l2_dev, "refusing %d-phase i2c xfer\n", num);
+ }
+
++out:
+ mutex_unlock(&dev->i2c_mutex);
+
+ return retval ? retval : num;
+@@ -158,11 +192,11 @@ static struct i2c_adapter hdpvr_i2c_adapter_template = {
+
+ static int hdpvr_activate_ir(struct hdpvr_device *dev)
+ {
+- char buffer[8];
++ char buffer[2];
+
+ mutex_lock(&dev->i2c_mutex);
+
+- hdpvr_i2c_read(dev, 0, 0x54, buffer, 1);
++ hdpvr_i2c_read(dev, 0, 0x54, NULL, 0, buffer, 1);
+
+ buffer[0] = 0;
+ buffer[1] = 0x8;
+diff --git a/drivers/media/video/ir-kbd-i2c.c b/drivers/media/video/ir-kbd-i2c.c
+index a221ad6..3ab875d 100644
+--- a/drivers/media/video/ir-kbd-i2c.c
++++ b/drivers/media/video/ir-kbd-i2c.c
+@@ -55,10 +55,6 @@
+ static int debug;
+ module_param(debug, int, 0644); /* debug level (0,1,2) */
+
+-static int hauppauge;
+-module_param(hauppauge, int, 0644); /* Choose Hauppauge remote */
+-MODULE_PARM_DESC(hauppauge, "Specify Hauppauge remote: 0=black, 1=grey (defaults to 0)");
+-
+
+ #define MODULE_NAME "ir-kbd-i2c"
+ #define dprintk(level, fmt, arg...) if (debug >= level) \
+@@ -105,10 +101,6 @@ static int get_key_haup_common(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw,
+ /* invalid key press */
+ return 0;
+
+- if (dev!=0x1e && dev!=0x1f)
+- /* not a hauppauge remote */
+- return 0;
+-
+ if (!range)
+ code += 64;
+
+@@ -116,7 +108,7 @@ static int get_key_haup_common(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw,
+ start, range, toggle, dev, code);
+
+ /* return key */
+- *ir_key = code;
++ *ir_key = (dev << 8) | code;
+ *ir_raw = ircode;
+ return 1;
+ }
+@@ -312,11 +304,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id)
+ name = "Hauppauge";
+ ir->get_key = get_key_haup;
+ rc_type = RC_TYPE_RC5;
+- if (hauppauge == 1) {
+- ir_codes = RC_MAP_HAUPPAUGE_NEW;
+- } else {
+- ir_codes = RC_MAP_RC5_TV;
+- }
++ ir_codes = RC_MAP_HAUPPAUGE;
+ break;
+ case 0x30:
+ name = "KNC One";
+@@ -340,7 +328,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id)
+ name = "Hauppauge/Zilog Z8";
+ ir->get_key = get_key_haup_xvr;
+ rc_type = RC_TYPE_RC5;
+- ir_codes = hauppauge ? RC_MAP_HAUPPAUGE_NEW : RC_MAP_RC5_TV;
++ ir_codes = RC_MAP_HAUPPAUGE;
+ break;
+ }
+
+diff --git a/drivers/media/video/ivtv/ivtv-i2c.c b/drivers/media/video/ivtv/ivtv-i2c.c
+index 9fb86a0..d47f41a 100644
+--- a/drivers/media/video/ivtv/ivtv-i2c.c
++++ b/drivers/media/video/ivtv/ivtv-i2c.c
+@@ -205,15 +205,14 @@ static int ivtv_i2c_new_ir(struct ivtv *itv, u32 hw, const char *type, u8 addr)
+ break;
+ case IVTV_HW_I2C_IR_RX_HAUP_EXT:
+ case IVTV_HW_I2C_IR_RX_HAUP_INT:
+- /* Default to old black remote */
+- init_data->ir_codes = RC_MAP_RC5_TV;
++ init_data->ir_codes = RC_MAP_HAUPPAUGE;
+ init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP;
+ init_data->type = RC_TYPE_RC5;
+ init_data->name = itv->card_name;
+ break;
+ case IVTV_HW_Z8F0811_IR_RX_HAUP:
+ /* Default to grey remote */
+- init_data->ir_codes = RC_MAP_HAUPPAUGE_NEW;
++ init_data->ir_codes = RC_MAP_HAUPPAUGE;
+ init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
+ init_data->type = RC_TYPE_RC5;
+ init_data->name = itv->card_name;
+diff --git a/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c b/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c
+index 451ecd4..e72d510 100644
+--- a/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c
++++ b/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c
+@@ -578,7 +578,7 @@ static void pvr2_i2c_register_ir(struct pvr2_hdw *hdw)
+ switch (hdw->ir_scheme_active) {
+ case PVR2_IR_SCHEME_24XXX: /* FX2-controlled IR */
+ case PVR2_IR_SCHEME_29XXX: /* Original 29xxx device */
+- init_data->ir_codes = RC_MAP_HAUPPAUGE_NEW;
++ init_data->ir_codes = RC_MAP_HAUPPAUGE;
+ init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP;
+ init_data->type = RC_TYPE_RC5;
+ init_data->name = hdw->hdw_desc->description;
+@@ -593,7 +593,7 @@ static void pvr2_i2c_register_ir(struct pvr2_hdw *hdw)
+ break;
+ case PVR2_IR_SCHEME_ZILOG: /* HVR-1950 style */
+ case PVR2_IR_SCHEME_24XXX_MCE: /* 24xxx MCE device */
+- init_data->ir_codes = RC_MAP_HAUPPAUGE_NEW;
++ init_data->ir_codes = RC_MAP_HAUPPAUGE;
+ init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
+ init_data->type = RC_TYPE_RC5;
+ init_data->name = hdw->hdw_desc->description;
+diff --git a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c
+index 790d667..be1c2a2 100644
+--- a/drivers/media/video/saa7134/saa7134-input.c
++++ b/drivers/media/video/saa7134/saa7134-input.c
+@@ -893,7 +893,7 @@ void saa7134_probe_i2c_ir(struct saa7134_dev *dev)
+ case SAA7134_BOARD_HAUPPAUGE_HVR1110:
+ dev->init_data.name = "HVR 1110";
+ dev->init_data.get_key = get_key_hvr1110;
+- dev->init_data.ir_codes = RC_MAP_HAUPPAUGE_NEW;
++ dev->init_data.ir_codes = RC_MAP_HAUPPAUGE;
+ info.addr = 0x71;
+ break;
+ case SAA7134_BOARD_BEHOLD_607FM_MK3:
+diff --git a/drivers/staging/lirc/Kconfig b/drivers/staging/lirc/Kconfig
+index cdaff59..526ec0f 100644
+--- a/drivers/staging/lirc/Kconfig
++++ b/drivers/staging/lirc/Kconfig
+@@ -32,18 +32,6 @@ config LIRC_IMON
+
+ Current generation iMON devices use the input layer imon driver.
+
+-config LIRC_IT87
+- tristate "ITE IT87XX CIR Port Receiver"
+- depends on LIRC && PNP
+- help
+- Driver for the ITE IT87xx IR Receiver
+-
+-config LIRC_ITE8709
+- tristate "ITE8709 CIR Port Receiver"
+- depends on LIRC && PNP
+- help
+- Driver for the ITE8709 IR Receiver
+-
+ config LIRC_PARALLEL
+ tristate "Homebrew Parallel Port Receiver"
+ depends on LIRC && PARPORT
+diff --git a/drivers/staging/lirc/Makefile b/drivers/staging/lirc/Makefile
+index 94af218..d76b0fa 100644
+--- a/drivers/staging/lirc/Makefile
++++ b/drivers/staging/lirc/Makefile
+@@ -6,8 +6,6 @@
+ obj-$(CONFIG_LIRC_BT829) += lirc_bt829.o
+ obj-$(CONFIG_LIRC_IGORPLUGUSB) += lirc_igorplugusb.o
+ obj-$(CONFIG_LIRC_IMON) += lirc_imon.o
+-obj-$(CONFIG_LIRC_IT87) += lirc_it87.o
+-obj-$(CONFIG_LIRC_ITE8709) += lirc_ite8709.o
+ obj-$(CONFIG_LIRC_PARALLEL) += lirc_parallel.o
+ obj-$(CONFIG_LIRC_SASEM) += lirc_sasem.o
+ obj-$(CONFIG_LIRC_SERIAL) += lirc_serial.o
+diff --git a/drivers/staging/lirc/TODO.lirc_zilog b/drivers/staging/lirc/TODO.lirc_zilog
+index 2d0263f..a97800a 100644
+--- a/drivers/staging/lirc/TODO.lirc_zilog
++++ b/drivers/staging/lirc/TODO.lirc_zilog
+@@ -1,34 +1,33 @@
+-1. Both ir-kbd-i2c and lirc_zilog provide support for RX events.
+-The 'tx_only' lirc_zilog module parameter will allow ir-kbd-i2c
+-and lirc_zilog to coexist in the kernel, if the user requires such a set-up.
+-However the IR unit will not work well without coordination between the
+-two modules. A shared mutex, for transceiver access locking, needs to be
+-supplied by bridge drivers, in struct IR_i2_init_data, to both ir-kbd-i2c
+-and lirc_zilog, before they will coexist usefully. This should be fixed
+-before moving out of staging.
+-
+-2. References and locking need careful examination. For cx18 and ivtv PCI
+-cards, which are not easily "hot unplugged", the imperfect state of reference
+-counting and locking is acceptable if not correct. For USB connected units
+-like HD PVR, PVR USB2, HVR-1900, and HVR1950, the likelyhood of an Ooops on
+-unplug is probably great. Proper reference counting and locking needs to be
+-implemented before this module is moved out of staging.
+-
+-3. The binding between hdpvr and lirc_zilog is currently disabled,
+-due to an OOPS reported a few years ago when both the hdpvr and cx18
+-drivers were loaded in his system. More details can be seen at:
+- http://www.mail-archive.com/linux-media@vger.kernel.org/msg09163.html
+-More tests need to be done, in order to fix the reported issue.
+-
+-4. In addition to providing a shared mutex for transceiver access
+-locking, bridge drivers, if able, should provide a chip reset() callback
++1. Both ir-kbd-i2c and lirc_zilog provide support for RX events for
++the chips supported by lirc_zilog. Before moving lirc_zilog out of staging:
++
++a. ir-kbd-i2c needs a module parameter added to allow the user to tell
++ ir-kbd-i2c to ignore Z8 IR units.
++
++b. lirc_zilog should provide Rx key presses to the rc core like ir-kbd-i2c
++ does.
++
++
++2. lirc_zilog module ref-counting need examination. It has not been
++verified that cdev and lirc_dev will take the proper module references on
++lirc_zilog to prevent removal of lirc_zilog when the /dev/lircN device node
++is open.
++
++(The good news is ref-counting of lirc_zilog internal structures appears to be
++complete. Testing has shown the cx18 module can be unloaded out from under
++irw + lircd + lirc_dev, with the /dev/lirc0 device node open, with no adverse
++effects. The cx18 module could then be reloaded and irw properly began
++receiving button presses again and ir_send worked without error.)
++
++
++3. Bridge drivers, if able, should provide a chip reset() callback
+ to lirc_zilog via struct IR_i2c_init_data. cx18 and ivtv already have routines
+-to perform Z8 chip resets via GPIO manipulations. This will allow lirc_zilog
++to perform Z8 chip resets via GPIO manipulations. This would allow lirc_zilog
+ to bring the chip back to normal when it hangs, in the same places the
+ original lirc_pvr150 driver code does. This is not strictly needed, so it
+ is not required to move lirc_zilog out of staging.
+
+-5. Both lirc_zilog and ir-kbd-i2c support the Zilog Z8 for IR, as programmed
++Note: Both lirc_zilog and ir-kbd-i2c support the Zilog Z8 for IR, as programmed
+ and installed on Hauppauge products. When working on either module, developers
+ must consider at least the following bridge drivers which mention an IR Rx unit
+ at address 0x71 (indicative of a Z8):
+diff --git a/drivers/staging/lirc/lirc_imon.c b/drivers/staging/lirc/lirc_imon.c
+index 235cab0..4039eda 100644
+--- a/drivers/staging/lirc/lirc_imon.c
++++ b/drivers/staging/lirc/lirc_imon.c
+@@ -379,7 +379,7 @@ static ssize_t vfd_write(struct file *file, const char *buf,
+ struct imon_context *context;
+ const unsigned char vfd_packet6[] = {
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF };
+- int *data_buf;
++ int *data_buf = NULL;
+
+ context = file->private_data;
+ if (!context) {
+diff --git a/drivers/staging/lirc/lirc_it87.c b/drivers/staging/lirc/lirc_it87.c
+deleted file mode 100644
+index 5938616..0000000
+--- a/drivers/staging/lirc/lirc_it87.c
++++ /dev/null
+@@ -1,1027 +0,0 @@
+-/*
+- * LIRC driver for ITE IT8712/IT8705 CIR port
+- *
+- * Copyright (C) 2001 Hans-Gunter Lutke Uphues <hg_lu@web.de>
+- *
+- * 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
+- *
+- * ITE IT8705 and IT8712(not tested) and IT8720 CIR-port support for lirc based
+- * via cut and paste from lirc_sir.c (C) 2000 Milan Pikula
+- *
+- * Attention: Sendmode only tested with debugging logs
+- *
+- * 2001/02/27 Christoph Bartelmus <lirc@bartelmus.de> :
+- * reimplemented read function
+- * 2005/06/05 Andrew Calkin implemented support for Asus Digimatrix,
+- * based on work of the following member of the Outertrack Digimatrix
+- * Forum: Art103 <r_tay@hotmail.com>
+- * 2009/12/24 James Edwards <jimbo-lirc@edwardsclan.net> implemeted support
+- * for ITE8704/ITE8718, on my machine, the DSDT reports 8704, but the
+- * chip identifies as 18.
+- */
+-
+-#include <linux/module.h>
+-#include <linux/sched.h>
+-#include <linux/errno.h>
+-#include <linux/signal.h>
+-#include <linux/fs.h>
+-#include <linux/interrupt.h>
+-#include <linux/ioport.h>
+-#include <linux/kernel.h>
+-#include <linux/time.h>
+-#include <linux/string.h>
+-#include <linux/types.h>
+-#include <linux/wait.h>
+-#include <linux/mm.h>
+-#include <linux/delay.h>
+-#include <linux/poll.h>
+-#include <asm/system.h>
+-#include <linux/io.h>
+-#include <linux/irq.h>
+-#include <linux/fcntl.h>
+-
+-#include <linux/timer.h>
+-#include <linux/pnp.h>
+-
+-#include <media/lirc.h>
+-#include <media/lirc_dev.h>
+-
+-#include "lirc_it87.h"
+-
+-#ifdef LIRC_IT87_DIGIMATRIX
+-static int digimatrix = 1;
+-static int it87_freq = 36; /* kHz */
+-static int irq = 9;
+-#else
+-static int digimatrix;
+-static int it87_freq = 38; /* kHz */
+-static int irq = IT87_CIR_DEFAULT_IRQ;
+-#endif
+-
+-static unsigned long it87_bits_in_byte_out;
+-static unsigned long it87_send_counter;
+-static unsigned char it87_RXEN_mask = IT87_CIR_RCR_RXEN;
+-
+-#define RBUF_LEN 1024
+-
+-#define LIRC_DRIVER_NAME "lirc_it87"
+-
+-/* timeout for sequences in jiffies (=5/100s) */
+-/* must be longer than TIME_CONST */
+-#define IT87_TIMEOUT (HZ*5/100)
+-
+-/* module parameters */
+-static int debug;
+-#define dprintk(fmt, args...) \
+- do { \
+- if (debug) \
+- printk(KERN_DEBUG LIRC_DRIVER_NAME ": " \
+- fmt, ## args); \
+- } while (0)
+-
+-static int io = IT87_CIR_DEFAULT_IOBASE;
+-/* receiver demodulator default: off */
+-static int it87_enable_demodulator;
+-
+-static int timer_enabled;
+-static DEFINE_SPINLOCK(timer_lock);
+-static struct timer_list timerlist;
+-/* time of last signal change detected */
+-static struct timeval last_tv = {0, 0};
+-/* time of last UART data ready interrupt */
+-static struct timeval last_intr_tv = {0, 0};
+-static int last_value;
+-
+-static DECLARE_WAIT_QUEUE_HEAD(lirc_read_queue);
+-
+-static DEFINE_SPINLOCK(hardware_lock);
+-static DEFINE_SPINLOCK(dev_lock);
+-static bool device_open;
+-
+-static int rx_buf[RBUF_LEN];
+-unsigned int rx_tail, rx_head;
+-
+-static struct pnp_driver it87_pnp_driver;
+-
+-/* SECTION: Prototypes */
+-
+-/* Communication with user-space */
+-static int lirc_open(struct inode *inode, struct file *file);
+-static int lirc_close(struct inode *inode, struct file *file);
+-static unsigned int lirc_poll(struct file *file, poll_table *wait);
+-static ssize_t lirc_read(struct file *file, char *buf,
+- size_t count, loff_t *ppos);
+-static ssize_t lirc_write(struct file *file, const char *buf,
+- size_t n, loff_t *pos);
+-static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg);
+-static void add_read_queue(int flag, unsigned long val);
+-static int init_chrdev(void);
+-static void drop_chrdev(void);
+-/* Hardware */
+-static irqreturn_t it87_interrupt(int irq, void *dev_id);
+-static void send_space(unsigned long len);
+-static void send_pulse(unsigned long len);
+-static void init_send(void);
+-static void terminate_send(unsigned long len);
+-static int init_hardware(void);
+-static void drop_hardware(void);
+-/* Initialisation */
+-static int init_port(void);
+-static void drop_port(void);
+-
+-
+-/* SECTION: Communication with user-space */
+-
+-static int lirc_open(struct inode *inode, struct file *file)
+-{
+- spin_lock(&dev_lock);
+- if (device_open) {
+- spin_unlock(&dev_lock);
+- return -EBUSY;
+- }
+- device_open = true;
+- spin_unlock(&dev_lock);
+- return 0;
+-}
+-
+-
+-static int lirc_close(struct inode *inode, struct file *file)
+-{
+- spin_lock(&dev_lock);
+- device_open = false;
+- spin_unlock(&dev_lock);
+- return 0;
+-}
+-
+-
+-static unsigned int lirc_poll(struct file *file, poll_table *wait)
+-{
+- poll_wait(file, &lirc_read_queue, wait);
+- if (rx_head != rx_tail)
+- return POLLIN | POLLRDNORM;
+- return 0;
+-}
+-
+-
+-static ssize_t lirc_read(struct file *file, char *buf,
+- size_t count, loff_t *ppos)
+-{
+- int n = 0;
+- int retval = 0;
+-
+- while (n < count) {
+- if (file->f_flags & O_NONBLOCK && rx_head == rx_tail) {
+- retval = -EAGAIN;
+- break;
+- }
+- retval = wait_event_interruptible(lirc_read_queue,
+- rx_head != rx_tail);
+- if (retval)
+- break;
+-
+- if (copy_to_user((void *) buf + n, (void *) (rx_buf + rx_head),
+- sizeof(int))) {
+- retval = -EFAULT;
+- break;
+- }
+- rx_head = (rx_head + 1) & (RBUF_LEN - 1);
+- n += sizeof(int);
+- }
+- if (n)
+- return n;
+- return retval;
+-}
+-
+-
+-static ssize_t lirc_write(struct file *file, const char *buf,
+- size_t n, loff_t *pos)
+-{
+- int i = 0;
+- int *tx_buf;
+-
+- if (n % sizeof(int))
+- return -EINVAL;
+- tx_buf = memdup_user(buf, n);
+- if (IS_ERR(tx_buf))
+- return PTR_ERR(tx_buf);
+- n /= sizeof(int);
+- init_send();
+- while (1) {
+- if (i >= n)
+- break;
+- if (tx_buf[i])
+- send_pulse(tx_buf[i]);
+- i++;
+- if (i >= n)
+- break;
+- if (tx_buf[i])
+- send_space(tx_buf[i]);
+- i++;
+- }
+- terminate_send(tx_buf[i - 1]);
+- kfree(tx_buf);
+- return n;
+-}
+-
+-
+-static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
+-{
+- int retval = 0;
+- __u32 value = 0;
+- unsigned long hw_flags;
+-
+- if (cmd == LIRC_GET_FEATURES)
+- value = LIRC_CAN_SEND_PULSE |
+- LIRC_CAN_SET_SEND_CARRIER |
+- LIRC_CAN_REC_MODE2;
+- else if (cmd == LIRC_GET_SEND_MODE)
+- value = LIRC_MODE_PULSE;
+- else if (cmd == LIRC_GET_REC_MODE)
+- value = LIRC_MODE_MODE2;
+-
+- switch (cmd) {
+- case LIRC_GET_FEATURES:
+- case LIRC_GET_SEND_MODE:
+- case LIRC_GET_REC_MODE:
+- retval = put_user(value, (__u32 *) arg);
+- break;
+-
+- case LIRC_SET_SEND_MODE:
+- case LIRC_SET_REC_MODE:
+- retval = get_user(value, (__u32 *) arg);
+- break;
+-
+- case LIRC_SET_SEND_CARRIER:
+- retval = get_user(value, (__u32 *) arg);
+- if (retval)
+- return retval;
+- value /= 1000;
+- if (value > IT87_CIR_FREQ_MAX ||
+- value < IT87_CIR_FREQ_MIN)
+- return -EINVAL;
+-
+- it87_freq = value;
+-
+- spin_lock_irqsave(&hardware_lock, hw_flags);
+- outb(((inb(io + IT87_CIR_TCR2) & IT87_CIR_TCR2_TXMPW) |
+- (it87_freq - IT87_CIR_FREQ_MIN) << 3),
+- io + IT87_CIR_TCR2);
+- spin_unlock_irqrestore(&hardware_lock, hw_flags);
+- dprintk("demodulation frequency: %d kHz\n", it87_freq);
+-
+- break;
+-
+- default:
+- retval = -EINVAL;
+- }
+-
+- if (retval)
+- return retval;
+-
+- if (cmd == LIRC_SET_REC_MODE) {
+- if (value != LIRC_MODE_MODE2)
+- retval = -ENOSYS;
+- } else if (cmd == LIRC_SET_SEND_MODE) {
+- if (value != LIRC_MODE_PULSE)
+- retval = -ENOSYS;
+- }
+- return retval;
+-}
+-
+-static void add_read_queue(int flag, unsigned long val)
+-{
+- unsigned int new_rx_tail;
+- int newval;
+-
+- dprintk("add flag %d with val %lu\n", flag, val);
+-
+- newval = val & PULSE_MASK;
+-
+- /*
+- * statistically, pulses are ~TIME_CONST/2 too long. we could
+- * maybe make this more exact, but this is good enough
+- */
+- if (flag) {
+- /* pulse */
+- if (newval > TIME_CONST / 2)
+- newval -= TIME_CONST / 2;
+- else /* should not ever happen */
+- newval = 1;
+- newval |= PULSE_BIT;
+- } else
+- newval += TIME_CONST / 2;
+- new_rx_tail = (rx_tail + 1) & (RBUF_LEN - 1);
+- if (new_rx_tail == rx_head) {
+- dprintk("Buffer overrun.\n");
+- return;
+- }
+- rx_buf[rx_tail] = newval;
+- rx_tail = new_rx_tail;
+- wake_up_interruptible(&lirc_read_queue);
+-}
+-
+-
+-static const struct file_operations lirc_fops = {
+- .owner = THIS_MODULE,
+- .read = lirc_read,
+- .write = lirc_write,
+- .poll = lirc_poll,
+- .unlocked_ioctl = lirc_ioctl,
+-#ifdef CONFIG_COMPAT
+- .compat_ioctl = lirc_ioctl,
+-#endif
+- .open = lirc_open,
+- .release = lirc_close,
+- .llseek = noop_llseek,
+-};
+-
+-static int set_use_inc(void *data)
+-{
+- return 0;
+-}
+-
+-static void set_use_dec(void *data)
+-{
+-}
+-
+-static struct lirc_driver driver = {
+- .name = LIRC_DRIVER_NAME,
+- .minor = -1,
+- .code_length = 1,
+- .sample_rate = 0,
+- .data = NULL,
+- .add_to_buf = NULL,
+- .set_use_inc = set_use_inc,
+- .set_use_dec = set_use_dec,
+- .fops = &lirc_fops,
+- .dev = NULL,
+- .owner = THIS_MODULE,
+-};
+-
+-
+-static int init_chrdev(void)
+-{
+- driver.minor = lirc_register_driver(&driver);
+-
+- if (driver.minor < 0) {
+- printk(KERN_ERR LIRC_DRIVER_NAME ": init_chrdev() failed.\n");
+- return -EIO;
+- }
+- return 0;
+-}
+-
+-
+-static void drop_chrdev(void)
+-{
+- lirc_unregister_driver(driver.minor);
+-}
+-
+-
+-/* SECTION: Hardware */
+-static long delta(struct timeval *tv1, struct timeval *tv2)
+-{
+- unsigned long deltv;
+-
+- deltv = tv2->tv_sec - tv1->tv_sec;
+- if (deltv > 15)
+- deltv = 0xFFFFFF;
+- else
+- deltv = deltv*1000000 + tv2->tv_usec - tv1->tv_usec;
+- return deltv;
+-}
+-
+-static void it87_timeout(unsigned long data)
+-{
+- unsigned long flags;
+-
+- /* avoid interference with interrupt */
+- spin_lock_irqsave(&timer_lock, flags);
+-
+- if (digimatrix) {
+- /* We have timed out. Disable the RX mechanism. */
+-
+- outb((inb(io + IT87_CIR_RCR) & ~IT87_CIR_RCR_RXEN) |
+- IT87_CIR_RCR_RXACT, io + IT87_CIR_RCR);
+- if (it87_RXEN_mask)
+- outb(inb(io + IT87_CIR_RCR) | IT87_CIR_RCR_RXEN,
+- io + IT87_CIR_RCR);
+- dprintk(" TIMEOUT\n");
+- timer_enabled = 0;
+-
+- /* fifo clear */
+- outb(inb(io + IT87_CIR_TCR1) | IT87_CIR_TCR1_FIFOCLR,
+- io+IT87_CIR_TCR1);
+-
+- } else {
+- /*
+- * if last received signal was a pulse, but receiving stopped
+- * within the 9 bit frame, we need to finish this pulse and
+- * simulate a signal change to from pulse to space. Otherwise
+- * upper layers will receive two sequences next time.
+- */
+-
+- if (last_value) {
+- unsigned long pulse_end;
+-
+- /* determine 'virtual' pulse end: */
+- pulse_end = delta(&last_tv, &last_intr_tv);
+- dprintk("timeout add %d for %lu usec\n",
+- last_value, pulse_end);
+- add_read_queue(last_value, pulse_end);
+- last_value = 0;
+- last_tv = last_intr_tv;
+- }
+- }
+- spin_unlock_irqrestore(&timer_lock, flags);
+-}
+-
+-static irqreturn_t it87_interrupt(int irq, void *dev_id)
+-{
+- unsigned char data;
+- struct timeval curr_tv;
+- static unsigned long deltv;
+- unsigned long deltintrtv;
+- unsigned long flags, hw_flags;
+- int iir, lsr;
+- int fifo = 0;
+- static char lastbit;
+- char bit;
+-
+- /* Bit duration in microseconds */
+- const unsigned long bit_duration = 1000000ul /
+- (115200 / IT87_CIR_BAUDRATE_DIVISOR);
+-
+-
+- iir = inb(io + IT87_CIR_IIR);
+-
+- switch (iir & IT87_CIR_IIR_IID) {
+- case 0x4:
+- case 0x6:
+- lsr = inb(io + IT87_CIR_RSR) & (IT87_CIR_RSR_RXFTO |
+- IT87_CIR_RSR_RXFBC);
+- fifo = lsr & IT87_CIR_RSR_RXFBC;
+- dprintk("iir: 0x%x fifo: 0x%x\n", iir, lsr);
+-
+- /* avoid interference with timer */
+- spin_lock_irqsave(&timer_lock, flags);
+- spin_lock_irqsave(&hardware_lock, hw_flags);
+- if (digimatrix) {
+- static unsigned long acc_pulse;
+- static unsigned long acc_space;
+-
+- do {
+- data = inb(io + IT87_CIR_DR);
+- data = ~data;
+- fifo--;
+- if (data != 0x00) {
+- if (timer_enabled)
+- del_timer(&timerlist);
+- /*
+- * start timer for end of
+- * sequence detection
+- */
+- timerlist.expires = jiffies +
+- IT87_TIMEOUT;
+- add_timer(&timerlist);
+- timer_enabled = 1;
+- }
+- /* Loop through */
+- for (bit = 0; bit < 8; ++bit) {
+- if ((data >> bit) & 1) {
+- ++acc_pulse;
+- if (lastbit == 0) {
+- add_read_queue(0,
+- acc_space *
+- bit_duration);
+- acc_space = 0;
+- }
+- } else {
+- ++acc_space;
+- if (lastbit == 1) {
+- add_read_queue(1,
+- acc_pulse *
+- bit_duration);
+- acc_pulse = 0;
+- }
+- }
+- lastbit = (data >> bit) & 1;
+- }
+-
+- } while (fifo != 0);
+- } else { /* Normal Operation */
+- do {
+- del_timer(&timerlist);
+- data = inb(io + IT87_CIR_DR);
+-
+- dprintk("data=%02x\n", data);
+- do_gettimeofday(&curr_tv);
+- deltv = delta(&last_tv, &curr_tv);
+- deltintrtv = delta(&last_intr_tv, &curr_tv);
+-
+- dprintk("t %lu , d %d\n",
+- deltintrtv, (int)data);
+-
+- /*
+- * if nothing came in last 2 cycles,
+- * it was gap
+- */
+- if (deltintrtv > TIME_CONST * 2) {
+- if (last_value) {
+- dprintk("GAP\n");
+-
+- /* simulate signal change */
+- add_read_queue(last_value,
+- deltv -
+- deltintrtv);
+- last_value = 0;
+- last_tv.tv_sec =
+- last_intr_tv.tv_sec;
+- last_tv.tv_usec =
+- last_intr_tv.tv_usec;
+- deltv = deltintrtv;
+- }
+- }
+- data = 1;
+- if (data ^ last_value) {
+- /*
+- * deltintrtv > 2*TIME_CONST,
+- * remember ? the other case is
+- * timeout
+- */
+- add_read_queue(last_value,
+- deltv-TIME_CONST);
+- last_value = data;
+- last_tv = curr_tv;
+- if (last_tv.tv_usec >= TIME_CONST)
+- last_tv.tv_usec -= TIME_CONST;
+- else {
+- last_tv.tv_sec--;
+- last_tv.tv_usec += 1000000 -
+- TIME_CONST;
+- }
+- }
+- last_intr_tv = curr_tv;
+- if (data) {
+- /*
+- * start timer for end of
+- * sequence detection
+- */
+- timerlist.expires =
+- jiffies + IT87_TIMEOUT;
+- add_timer(&timerlist);
+- }
+- outb((inb(io + IT87_CIR_RCR) &
+- ~IT87_CIR_RCR_RXEN) |
+- IT87_CIR_RCR_RXACT,
+- io + IT87_CIR_RCR);
+- if (it87_RXEN_mask)
+- outb(inb(io + IT87_CIR_RCR) |
+- IT87_CIR_RCR_RXEN,
+- io + IT87_CIR_RCR);
+- fifo--;
+- } while (fifo != 0);
+- }
+- spin_unlock_irqrestore(&hardware_lock, hw_flags);
+- spin_unlock_irqrestore(&timer_lock, flags);
+-
+- return IRQ_RETVAL(IRQ_HANDLED);
+-
+- default:
+- /* not our irq */
+- dprintk("unknown IRQ (shouldn't happen) !!\n");
+- return IRQ_RETVAL(IRQ_NONE);
+- }
+-}
+-
+-
+-static void send_it87(unsigned long len, unsigned long stime,
+- unsigned char send_byte, unsigned int count_bits)
+-{
+- long count = len / stime;
+- long time_left = 0;
+- static unsigned char byte_out;
+- unsigned long hw_flags;
+-
+- dprintk("%s: len=%ld, sb=%d\n", __func__, len, send_byte);
+-
+- time_left = (long)len - (long)count * (long)stime;
+- count += ((2 * time_left) / stime);
+- while (count) {
+- long i = 0;
+- for (i = 0; i < count_bits; i++) {
+- byte_out = (byte_out << 1) | (send_byte & 1);
+- it87_bits_in_byte_out++;
+- }
+- if (it87_bits_in_byte_out == 8) {
+- dprintk("out=0x%x, tsr_txfbc: 0x%x\n",
+- byte_out,
+- inb(io + IT87_CIR_TSR) &
+- IT87_CIR_TSR_TXFBC);
+-
+- while ((inb(io + IT87_CIR_TSR) &
+- IT87_CIR_TSR_TXFBC) >= IT87_CIR_FIFO_SIZE)
+- ;
+-
+- spin_lock_irqsave(&hardware_lock, hw_flags);
+- outb(byte_out, io + IT87_CIR_DR);
+- spin_unlock_irqrestore(&hardware_lock, hw_flags);
+-
+- it87_bits_in_byte_out = 0;
+- it87_send_counter++;
+- byte_out = 0;
+- }
+- count--;
+- }
+-}
+-
+-
+-/*TODO: maybe exchange space and pulse because it8705 only modulates 0-bits */
+-
+-static void send_space(unsigned long len)
+-{
+- send_it87(len, TIME_CONST, IT87_CIR_SPACE, IT87_CIR_BAUDRATE_DIVISOR);
+-}
+-
+-static void send_pulse(unsigned long len)
+-{
+- send_it87(len, TIME_CONST, IT87_CIR_PULSE, IT87_CIR_BAUDRATE_DIVISOR);
+-}
+-
+-
+-static void init_send()
+-{
+- unsigned long flags;
+-
+- spin_lock_irqsave(&hardware_lock, flags);
+- /* RXEN=0: receiver disable */
+- it87_RXEN_mask = 0;
+- outb(inb(io + IT87_CIR_RCR) & ~IT87_CIR_RCR_RXEN,
+- io + IT87_CIR_RCR);
+- spin_unlock_irqrestore(&hardware_lock, flags);
+- it87_bits_in_byte_out = 0;
+- it87_send_counter = 0;
+-}
+-
+-
+-static void terminate_send(unsigned long len)
+-{
+- unsigned long flags;
+- unsigned long last = 0;
+-
+- last = it87_send_counter;
+- /* make sure all necessary data has been sent */
+- while (last == it87_send_counter)
+- send_space(len);
+- /* wait until all data sent */
+- while ((inb(io + IT87_CIR_TSR) & IT87_CIR_TSR_TXFBC) != 0)
+- ;
+- /* then re-enable receiver */
+- spin_lock_irqsave(&hardware_lock, flags);
+- it87_RXEN_mask = IT87_CIR_RCR_RXEN;
+- outb(inb(io + IT87_CIR_RCR) | IT87_CIR_RCR_RXEN,
+- io + IT87_CIR_RCR);
+- spin_unlock_irqrestore(&hardware_lock, flags);
+-}
+-
+-
+-static int init_hardware(void)
+-{
+- unsigned long flags;
+- unsigned char it87_rcr = 0;
+-
+- spin_lock_irqsave(&hardware_lock, flags);
+- /* init cir-port */
+- /* enable r/w-access to Baudrate-Register */
+- outb(IT87_CIR_IER_BR, io + IT87_CIR_IER);
+- outb(IT87_CIR_BAUDRATE_DIVISOR % 0x100, io+IT87_CIR_BDLR);
+- outb(IT87_CIR_BAUDRATE_DIVISOR / 0x100, io+IT87_CIR_BDHR);
+- /* Baudrate Register off, define IRQs: Input only */
+- if (digimatrix) {
+- outb(IT87_CIR_IER_IEC | IT87_CIR_IER_RFOIE, io + IT87_CIR_IER);
+- /* RX: HCFS=0, RXDCR = 001b (33,75..38,25 kHz), RXEN=1 */
+- } else {
+- outb(IT87_CIR_IER_IEC | IT87_CIR_IER_RDAIE, io + IT87_CIR_IER);
+- /* RX: HCFS=0, RXDCR = 001b (35,6..40,3 kHz), RXEN=1 */
+- }
+- it87_rcr = (IT87_CIR_RCR_RXEN & it87_RXEN_mask) | 0x1;
+- if (it87_enable_demodulator)
+- it87_rcr |= IT87_CIR_RCR_RXEND;
+- outb(it87_rcr, io + IT87_CIR_RCR);
+- if (digimatrix) {
+- /* Set FIFO depth to 1 byte, and disable TX */
+- outb(inb(io + IT87_CIR_TCR1) | 0x00,
+- io + IT87_CIR_TCR1);
+-
+- /*
+- * TX: it87_freq (36kHz), 'reserved' sensitivity
+- * setting (0x00)
+- */
+- outb(((it87_freq - IT87_CIR_FREQ_MIN) << 3) | 0x00,
+- io + IT87_CIR_TCR2);
+- } else {
+- /* TX: 38kHz, 13,3us (pulse-width) */
+- outb(((it87_freq - IT87_CIR_FREQ_MIN) << 3) | 0x06,
+- io + IT87_CIR_TCR2);
+- }
+- spin_unlock_irqrestore(&hardware_lock, flags);
+- return 0;
+-}
+-
+-
+-static void drop_hardware(void)
+-{
+- unsigned long flags;
+-
+- spin_lock_irqsave(&hardware_lock, flags);
+- disable_irq(irq);
+- /* receiver disable */
+- it87_RXEN_mask = 0;
+- outb(0x1, io + IT87_CIR_RCR);
+- /* turn off irqs */
+- outb(0, io + IT87_CIR_IER);
+- /* fifo clear */
+- outb(IT87_CIR_TCR1_FIFOCLR, io+IT87_CIR_TCR1);
+- /* reset */
+- outb(IT87_CIR_IER_RESET, io+IT87_CIR_IER);
+- enable_irq(irq);
+- spin_unlock_irqrestore(&hardware_lock, flags);
+-}
+-
+-
+-static unsigned char it87_read(unsigned char port)
+-{
+- outb(port, IT87_ADRPORT);
+- return inb(IT87_DATAPORT);
+-}
+-
+-
+-static void it87_write(unsigned char port, unsigned char data)
+-{
+- outb(port, IT87_ADRPORT);
+- outb(data, IT87_DATAPORT);
+-}
+-
+-
+-/* SECTION: Initialisation */
+-
+-static int init_port(void)
+-{
+- unsigned long hw_flags;
+- int retval = 0;
+-
+- unsigned char init_bytes[4] = IT87_INIT;
+- unsigned char it87_chipid = 0;
+- unsigned char ldn = 0;
+- unsigned int it87_io = 0;
+- unsigned int it87_irq = 0;
+-
+- /* Enter MB PnP Mode */
+- outb(init_bytes[0], IT87_ADRPORT);
+- outb(init_bytes[1], IT87_ADRPORT);
+- outb(init_bytes[2], IT87_ADRPORT);
+- outb(init_bytes[3], IT87_ADRPORT);
+-
+- /* 8712 or 8705 ? */
+- it87_chipid = it87_read(IT87_CHIP_ID1);
+- if (it87_chipid != 0x87) {
+- retval = -ENXIO;
+- return retval;
+- }
+- it87_chipid = it87_read(IT87_CHIP_ID2);
+- if ((it87_chipid != 0x05) &&
+- (it87_chipid != 0x12) &&
+- (it87_chipid != 0x18) &&
+- (it87_chipid != 0x20)) {
+- printk(KERN_INFO LIRC_DRIVER_NAME
+- ": no IT8704/05/12/18/20 found (claimed IT87%02x), "
+- "exiting..\n", it87_chipid);
+- retval = -ENXIO;
+- return retval;
+- }
+- printk(KERN_INFO LIRC_DRIVER_NAME
+- ": found IT87%02x.\n",
+- it87_chipid);
+-
+- /* get I/O-Port and IRQ */
+- if (it87_chipid == 0x12 || it87_chipid == 0x18)
+- ldn = IT8712_CIR_LDN;
+- else
+- ldn = IT8705_CIR_LDN;
+- it87_write(IT87_LDN, ldn);
+-
+- it87_io = it87_read(IT87_CIR_BASE_MSB) * 256 +
+- it87_read(IT87_CIR_BASE_LSB);
+- if (it87_io == 0) {
+- if (io == 0)
+- io = IT87_CIR_DEFAULT_IOBASE;
+- printk(KERN_INFO LIRC_DRIVER_NAME
+- ": set default io 0x%x\n",
+- io);
+- it87_write(IT87_CIR_BASE_MSB, io / 0x100);
+- it87_write(IT87_CIR_BASE_LSB, io % 0x100);
+- } else
+- io = it87_io;
+-
+- it87_irq = it87_read(IT87_CIR_IRQ);
+- if (digimatrix || it87_irq == 0) {
+- if (irq == 0)
+- irq = IT87_CIR_DEFAULT_IRQ;
+- printk(KERN_INFO LIRC_DRIVER_NAME
+- ": set default irq 0x%x\n",
+- irq);
+- it87_write(IT87_CIR_IRQ, irq);
+- } else
+- irq = it87_irq;
+-
+- spin_lock_irqsave(&hardware_lock, hw_flags);
+- /* reset */
+- outb(IT87_CIR_IER_RESET, io+IT87_CIR_IER);
+- /* fifo clear */
+- outb(IT87_CIR_TCR1_FIFOCLR |
+- /* IT87_CIR_TCR1_ILE | */
+- IT87_CIR_TCR1_TXRLE |
+- IT87_CIR_TCR1_TXENDF, io+IT87_CIR_TCR1);
+- spin_unlock_irqrestore(&hardware_lock, hw_flags);
+-
+- /* get I/O port access and IRQ line */
+- if (request_region(io, 8, LIRC_DRIVER_NAME) == NULL) {
+- printk(KERN_ERR LIRC_DRIVER_NAME
+- ": i/o port 0x%.4x already in use.\n", io);
+- /* Leaving MB PnP Mode */
+- it87_write(IT87_CFGCTRL, 0x2);
+- return -EBUSY;
+- }
+-
+- /* activate CIR-Device */
+- it87_write(IT87_CIR_ACT, 0x1);
+-
+- /* Leaving MB PnP Mode */
+- it87_write(IT87_CFGCTRL, 0x2);
+-
+- retval = request_irq(irq, it87_interrupt, 0 /*IRQF_DISABLED*/,
+- LIRC_DRIVER_NAME, NULL);
+- if (retval < 0) {
+- printk(KERN_ERR LIRC_DRIVER_NAME
+- ": IRQ %d already in use.\n",
+- irq);
+- release_region(io, 8);
+- return retval;
+- }
+-
+- printk(KERN_INFO LIRC_DRIVER_NAME
+- ": I/O port 0x%.4x, IRQ %d.\n", io, irq);
+-
+- init_timer(&timerlist);
+- timerlist.function = it87_timeout;
+- timerlist.data = 0xabadcafe;
+-
+- return 0;
+-}
+-
+-
+-static void drop_port(void)
+-{
+-#if 0
+- unsigned char init_bytes[4] = IT87_INIT;
+-
+- /* Enter MB PnP Mode */
+- outb(init_bytes[0], IT87_ADRPORT);
+- outb(init_bytes[1], IT87_ADRPORT);
+- outb(init_bytes[2], IT87_ADRPORT);
+- outb(init_bytes[3], IT87_ADRPORT);
+-
+- /* deactivate CIR-Device */
+- it87_write(IT87_CIR_ACT, 0x0);
+-
+- /* Leaving MB PnP Mode */
+- it87_write(IT87_CFGCTRL, 0x2);
+-#endif
+-
+- del_timer_sync(&timerlist);
+- free_irq(irq, NULL);
+- release_region(io, 8);
+-}
+-
+-
+-static int init_lirc_it87(void)
+-{
+- int retval;
+-
+- init_waitqueue_head(&lirc_read_queue);
+- retval = init_port();
+- if (retval < 0)
+- return retval;
+- init_hardware();
+- printk(KERN_INFO LIRC_DRIVER_NAME ": Installed.\n");
+- return 0;
+-}
+-
+-static int it87_probe(struct pnp_dev *pnp_dev,
+- const struct pnp_device_id *dev_id)
+-{
+- int retval;
+-
+- driver.dev = &pnp_dev->dev;
+-
+- retval = init_chrdev();
+- if (retval < 0)
+- return retval;
+-
+- retval = init_lirc_it87();
+- if (retval)
+- goto init_lirc_it87_failed;
+-
+- return 0;
+-
+-init_lirc_it87_failed:
+- drop_chrdev();
+-
+- return retval;
+-}
+-
+-static int __init lirc_it87_init(void)
+-{
+- return pnp_register_driver(&it87_pnp_driver);
+-}
+-
+-
+-static void __exit lirc_it87_exit(void)
+-{
+- drop_hardware();
+- drop_chrdev();
+- drop_port();
+- pnp_unregister_driver(&it87_pnp_driver);
+- printk(KERN_INFO LIRC_DRIVER_NAME ": Uninstalled.\n");
+-}
+-
+-/* SECTION: PNP for ITE8704/13/18 */
+-
+-static const struct pnp_device_id pnp_dev_table[] = {
+- {"ITE8704", 0},
+- {"ITE8713", 0},
+- {}
+-};
+-
+-MODULE_DEVICE_TABLE(pnp, pnp_dev_table);
+-
+-static struct pnp_driver it87_pnp_driver = {
+- .name = LIRC_DRIVER_NAME,
+- .id_table = pnp_dev_table,
+- .probe = it87_probe,
+-};
+-
+-module_init(lirc_it87_init);
+-module_exit(lirc_it87_exit);
+-
+-MODULE_DESCRIPTION("LIRC driver for ITE IT8704/05/12/18/20 CIR port");
+-MODULE_AUTHOR("Hans-Gunter Lutke Uphues");
+-MODULE_LICENSE("GPL");
+-
+-module_param(io, int, S_IRUGO);
+-MODULE_PARM_DESC(io, "I/O base address (default: 0x310)");
+-
+-module_param(irq, int, S_IRUGO);
+-#ifdef LIRC_IT87_DIGIMATRIX
+-MODULE_PARM_DESC(irq, "Interrupt (1,3-12) (default: 9)");
+-#else
+-MODULE_PARM_DESC(irq, "Interrupt (1,3-12) (default: 7)");
+-#endif
+-
+-module_param(it87_enable_demodulator, bool, S_IRUGO);
+-MODULE_PARM_DESC(it87_enable_demodulator,
+- "Receiver demodulator enable/disable (1/0), default: 0");
+-
+-module_param(debug, bool, S_IRUGO | S_IWUSR);
+-MODULE_PARM_DESC(debug, "Enable debugging messages");
+-
+-module_param(digimatrix, bool, S_IRUGO | S_IWUSR);
+-#ifdef LIRC_IT87_DIGIMATRIX
+-MODULE_PARM_DESC(digimatrix,
+- "Asus Digimatrix it87 compat. enable/disable (1/0), default: 1");
+-#else
+-MODULE_PARM_DESC(digimatrix,
+- "Asus Digimatrix it87 compat. enable/disable (1/0), default: 0");
+-#endif
+-
+-
+-module_param(it87_freq, int, S_IRUGO);
+-#ifdef LIRC_IT87_DIGIMATRIX
+-MODULE_PARM_DESC(it87_freq,
+- "Carrier demodulator frequency (kHz), (default: 36)");
+-#else
+-MODULE_PARM_DESC(it87_freq,
+- "Carrier demodulator frequency (kHz), (default: 38)");
+-#endif
+diff --git a/drivers/staging/lirc/lirc_it87.h b/drivers/staging/lirc/lirc_it87.h
+deleted file mode 100644
+index cf021c8..0000000
+--- a/drivers/staging/lirc/lirc_it87.h
++++ /dev/null
+@@ -1,116 +0,0 @@
+-/* lirc_it87.h */
+-/* SECTION: Definitions */
+-
+-/********************************* ITE IT87xx ************************/
+-
+-/* based on the following documentation from ITE:
+- a) IT8712F Preliminary CIR Programming Guide V0.1
+- b) IT8705F Simple LPC I/O Preliminary Specification V0.3
+- c) IT8712F EC-LPC I/O Preliminary Specification V0.5
+-*/
+-
+-/* IT8712/05 Ports: */
+-#define IT87_ADRPORT 0x2e
+-#define IT87_DATAPORT 0x2f
+-#define IT87_INIT {0x87, 0x01, 0x55, 0x55}
+-
+-/* alternate Ports: */
+-/*
+-#define IT87_ADRPORT 0x4e
+-#define IT87_DATAPORT 0x4f
+-#define IT87_INIT {0x87, 0x01, 0x55, 0xaa}
+- */
+-
+-/* IT8712/05 Registers */
+-#define IT87_CFGCTRL 0x2
+-#define IT87_LDN 0x7
+-#define IT87_CHIP_ID1 0x20
+-#define IT87_CHIP_ID2 0x21
+-#define IT87_CFG_VERSION 0x22
+-#define IT87_SWSUSPEND 0x23
+-
+-#define IT8712_CIR_LDN 0xa
+-#define IT8705_CIR_LDN 0x7
+-
+-/* CIR Configuration Registers: */
+-#define IT87_CIR_ACT 0x30
+-#define IT87_CIR_BASE_MSB 0x60
+-#define IT87_CIR_BASE_LSB 0x61
+-#define IT87_CIR_IRQ 0x70
+-#define IT87_CIR_CONFIG 0xf0
+-
+-/* List of IT87_CIR registers: offset to BaseAddr */
+-#define IT87_CIR_DR 0
+-#define IT87_CIR_IER 1
+-#define IT87_CIR_RCR 2
+-#define IT87_CIR_TCR1 3
+-#define IT87_CIR_TCR2 4
+-#define IT87_CIR_TSR 5
+-#define IT87_CIR_RSR 6
+-#define IT87_CIR_BDLR 5
+-#define IT87_CIR_BDHR 6
+-#define IT87_CIR_IIR 7
+-
+-/* Bit Definition */
+-/* IER: */
+-#define IT87_CIR_IER_TM_EN 0x80
+-#define IT87_CIR_IER_RESEVED 0x40
+-#define IT87_CIR_IER_RESET 0x20
+-#define IT87_CIR_IER_BR 0x10
+-#define IT87_CIR_IER_IEC 0x8
+-#define IT87_CIR_IER_RFOIE 0x4
+-#define IT87_CIR_IER_RDAIE 0x2
+-#define IT87_CIR_IER_TLDLIE 0x1
+-
+-/* RCR: */
+-#define IT87_CIR_RCR_RDWOS 0x80
+-#define IT87_CIR_RCR_HCFS 0x40
+-#define IT87_CIR_RCR_RXEN 0x20
+-#define IT87_CIR_RCR_RXEND 0x10
+-#define IT87_CIR_RCR_RXACT 0x8
+-#define IT87_CIR_RCR_RXDCR 0x7
+-
+-/* TCR1: */
+-#define IT87_CIR_TCR1_FIFOCLR 0x80
+-#define IT87_CIR_TCR1_ILE 0x40
+-#define IT87_CIR_TCR1_FIFOTL 0x30
+-#define IT87_CIR_TCR1_TXRLE 0x8
+-#define IT87_CIR_TCR1_TXENDF 0x4
+-#define IT87_CIR_TCR1_TXMPM 0x3
+-
+-/* TCR2: */
+-#define IT87_CIR_TCR2_CFQ 0xf8
+-#define IT87_CIR_TCR2_TXMPW 0x7
+-
+-/* TSR: */
+-#define IT87_CIR_TSR_RESERVED 0xc0
+-#define IT87_CIR_TSR_TXFBC 0x3f
+-
+-/* RSR: */
+-#define IT87_CIR_RSR_RXFTO 0x80
+-#define IT87_CIR_RSR_RESERVED 0x40
+-#define IT87_CIR_RSR_RXFBC 0x3f
+-
+-/* IIR: */
+-#define IT87_CIR_IIR_RESERVED 0xf8
+-#define IT87_CIR_IIR_IID 0x6
+-#define IT87_CIR_IIR_IIP 0x1
+-
+-/* TM: */
+-#define IT87_CIR_TM_IL_SEL 0x80
+-#define IT87_CIR_TM_RESERVED 0x40
+-#define IT87_CIR_TM_TM_REG 0x3f
+-
+-#define IT87_CIR_FIFO_SIZE 32
+-
+-/* Baudratedivisor for IT87: power of 2: only 1,2,4 or 8) */
+-#define IT87_CIR_BAUDRATE_DIVISOR 0x1
+-#define IT87_CIR_DEFAULT_IOBASE 0x310
+-#define IT87_CIR_DEFAULT_IRQ 0x7
+-#define IT87_CIR_SPACE 0x00
+-#define IT87_CIR_PULSE 0xff
+-#define IT87_CIR_FREQ_MIN 27
+-#define IT87_CIR_FREQ_MAX 58
+-#define TIME_CONST (IT87_CIR_BAUDRATE_DIVISOR * 8000000ul / 115200ul)
+-
+-/********************************* ITE IT87xx ************************/
+diff --git a/drivers/staging/lirc/lirc_ite8709.c b/drivers/staging/lirc/lirc_ite8709.c
+deleted file mode 100644
+index cb20cfd..0000000
+--- a/drivers/staging/lirc/lirc_ite8709.c
++++ /dev/null
+@@ -1,542 +0,0 @@
+-/*
+- * LIRC driver for ITE8709 CIR port
+- *
+- * Copyright (C) 2008 Grégory Lardière <spmf2004-lirc@yahoo.fr>
+- *
+- * 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
+- */
+-
+-#include <linux/module.h>
+-#include <linux/interrupt.h>
+-#include <linux/sched.h>
+-#include <linux/delay.h>
+-#include <linux/pnp.h>
+-#include <linux/io.h>
+-
+-#include <media/lirc.h>
+-#include <media/lirc_dev.h>
+-
+-#define LIRC_DRIVER_NAME "lirc_ite8709"
+-
+-#define BUF_CHUNK_SIZE sizeof(int)
+-#define BUF_SIZE (128*BUF_CHUNK_SIZE)
+-
+-/*
+- * The ITE8709 device seems to be the combination of IT8512 superIO chip and
+- * a specific firmware running on the IT8512's embedded micro-controller.
+- * In addition of the embedded micro-controller, the IT8512 chip contains a
+- * CIR module and several other modules. A few modules are directly accessible
+- * by the host CPU, but most of them are only accessible by the
+- * micro-controller. The CIR module is only accessible by the micro-controller.
+- * The battery-backed SRAM module is accessible by the host CPU and the
+- * micro-controller. So one of the MC's firmware role is to act as a bridge
+- * between the host CPU and the CIR module. The firmware implements a kind of
+- * communication protocol using the SRAM module as a shared memory. The IT8512
+- * specification is publicly available on ITE's web site, but the communication
+- * protocol is not, so it was reverse-engineered.
+- */
+-
+-/* ITE8709 Registers addresses and values (reverse-engineered) */
+-#define ITE8709_MODE 0x1a
+-#define ITE8709_REG_ADR 0x1b
+-#define ITE8709_REG_VAL 0x1c
+-#define ITE8709_IIR 0x1e /* Interrupt identification register */
+-#define ITE8709_RFSR 0x1f /* Receiver FIFO status register */
+-#define ITE8709_FIFO_START 0x20
+-
+-#define ITE8709_MODE_READY 0X00
+-#define ITE8709_MODE_WRITE 0X01
+-#define ITE8709_MODE_READ 0X02
+-#define ITE8709_IIR_RDAI 0x02 /* Receiver data available interrupt */
+-#define ITE8709_IIR_RFOI 0x04 /* Receiver FIFO overrun interrupt */
+-#define ITE8709_RFSR_MASK 0x3f /* FIFO byte count mask */
+-
+-/*
+- * IT8512 CIR-module registers addresses and values
+- * (from IT8512 E/F specification v0.4.1)
+- */
+-#define IT8512_REG_MSTCR 0x01 /* Master control register */
+-#define IT8512_REG_IER 0x02 /* Interrupt enable register */
+-#define IT8512_REG_CFR 0x04 /* Carrier frequency register */
+-#define IT8512_REG_RCR 0x05 /* Receive control register */
+-#define IT8512_REG_BDLR 0x08 /* Baud rate divisor low byte register */
+-#define IT8512_REG_BDHR 0x09 /* Baud rate divisor high byte register */
+-
+-#define IT8512_MSTCR_RESET 0x01 /* Reset registers to default value */
+-#define IT8512_MSTCR_FIFOCLR 0x02 /* Clear FIFO */
+-#define IT8512_MSTCR_FIFOTL_7 0x04 /* FIFO threshold level : 7 */
+-#define IT8512_MSTCR_FIFOTL_25 0x0c /* FIFO threshold level : 25 */
+-#define IT8512_IER_RDAIE 0x02 /* Enable data interrupt request */
+-#define IT8512_IER_RFOIE 0x04 /* Enable FIFO overrun interrupt req */
+-#define IT8512_IER_IEC 0x80 /* Enable interrupt request */
+-#define IT8512_CFR_CF_36KHZ 0x09 /* Carrier freq : low speed, 36kHz */
+-#define IT8512_RCR_RXDCR_1 0x01 /* Demodulation carrier range : 1 */
+-#define IT8512_RCR_RXACT 0x08 /* Receiver active */
+-#define IT8512_RCR_RXEN 0x80 /* Receiver enable */
+-#define IT8512_BDR_6 6 /* Baud rate divisor : 6 */
+-
+-/* Actual values used by this driver */
+-#define CFG_FIFOTL IT8512_MSTCR_FIFOTL_25
+-#define CFG_CR_FREQ IT8512_CFR_CF_36KHZ
+-#define CFG_DCR IT8512_RCR_RXDCR_1
+-#define CFG_BDR IT8512_BDR_6
+-#define CFG_TIMEOUT 100000 /* Rearm interrupt when a space is > 100 ms */
+-
+-static int debug;
+-
+-struct ite8709_device {
+- int use_count;
+- int io;
+- int irq;
+- spinlock_t hardware_lock;
+- __u64 acc_pulse;
+- __u64 acc_space;
+- char lastbit;
+- struct timeval last_tv;
+- struct lirc_driver driver;
+- struct tasklet_struct tasklet;
+- char force_rearm;
+- char rearmed;
+- char device_busy;
+-};
+-
+-#define dprintk(fmt, args...) \
+- do { \
+- if (debug) \
+- printk(KERN_DEBUG LIRC_DRIVER_NAME ": " \
+- fmt, ## args); \
+- } while (0)
+-
+-
+-static unsigned char ite8709_read(struct ite8709_device *dev,
+- unsigned char port)
+-{
+- outb(port, dev->io);
+- return inb(dev->io+1);
+-}
+-
+-static void ite8709_write(struct ite8709_device *dev, unsigned char port,
+- unsigned char data)
+-{
+- outb(port, dev->io);
+- outb(data, dev->io+1);
+-}
+-
+-static void ite8709_wait_device(struct ite8709_device *dev)
+-{
+- int i = 0;
+- /*
+- * loop until device tells it's ready to continue
+- * iterations count is usually ~750 but can sometimes achieve 13000
+- */
+- for (i = 0; i < 15000; i++) {
+- udelay(2);
+- if (ite8709_read(dev, ITE8709_MODE) == ITE8709_MODE_READY)
+- break;
+- }
+-}
+-
+-static void ite8709_write_register(struct ite8709_device *dev,
+- unsigned char reg_adr, unsigned char reg_value)
+-{
+- ite8709_wait_device(dev);
+-
+- ite8709_write(dev, ITE8709_REG_VAL, reg_value);
+- ite8709_write(dev, ITE8709_REG_ADR, reg_adr);
+- ite8709_write(dev, ITE8709_MODE, ITE8709_MODE_WRITE);
+-}
+-
+-static void ite8709_init_hardware(struct ite8709_device *dev)
+-{
+- spin_lock_irq(&dev->hardware_lock);
+- dev->device_busy = 1;
+- spin_unlock_irq(&dev->hardware_lock);
+-
+- ite8709_write_register(dev, IT8512_REG_BDHR, (CFG_BDR >> 8) & 0xff);
+- ite8709_write_register(dev, IT8512_REG_BDLR, CFG_BDR & 0xff);
+- ite8709_write_register(dev, IT8512_REG_CFR, CFG_CR_FREQ);
+- ite8709_write_register(dev, IT8512_REG_IER,
+- IT8512_IER_IEC | IT8512_IER_RFOIE | IT8512_IER_RDAIE);
+- ite8709_write_register(dev, IT8512_REG_RCR, CFG_DCR);
+- ite8709_write_register(dev, IT8512_REG_MSTCR,
+- CFG_FIFOTL | IT8512_MSTCR_FIFOCLR);
+- ite8709_write_register(dev, IT8512_REG_RCR,
+- IT8512_RCR_RXEN | IT8512_RCR_RXACT | CFG_DCR);
+-
+- spin_lock_irq(&dev->hardware_lock);
+- dev->device_busy = 0;
+- spin_unlock_irq(&dev->hardware_lock);
+-
+- tasklet_enable(&dev->tasklet);
+-}
+-
+-static void ite8709_drop_hardware(struct ite8709_device *dev)
+-{
+- tasklet_disable(&dev->tasklet);
+-
+- spin_lock_irq(&dev->hardware_lock);
+- dev->device_busy = 1;
+- spin_unlock_irq(&dev->hardware_lock);
+-
+- ite8709_write_register(dev, IT8512_REG_RCR, 0);
+- ite8709_write_register(dev, IT8512_REG_MSTCR,
+- IT8512_MSTCR_RESET | IT8512_MSTCR_FIFOCLR);
+-
+- spin_lock_irq(&dev->hardware_lock);
+- dev->device_busy = 0;
+- spin_unlock_irq(&dev->hardware_lock);
+-}
+-
+-static int ite8709_set_use_inc(void *data)
+-{
+- struct ite8709_device *dev;
+- dev = data;
+- if (dev->use_count == 0)
+- ite8709_init_hardware(dev);
+- dev->use_count++;
+- return 0;
+-}
+-
+-static void ite8709_set_use_dec(void *data)
+-{
+- struct ite8709_device *dev;
+- dev = data;
+- dev->use_count--;
+- if (dev->use_count == 0)
+- ite8709_drop_hardware(dev);
+-}
+-
+-static void ite8709_add_read_queue(struct ite8709_device *dev, int flag,
+- __u64 val)
+-{
+- int value;
+-
+- dprintk("add a %llu usec %s\n", val, flag ? "pulse" : "space");
+-
+- value = (val > PULSE_MASK) ? PULSE_MASK : val;
+- if (flag)
+- value |= PULSE_BIT;
+-
+- if (!lirc_buffer_full(dev->driver.rbuf)) {
+- lirc_buffer_write(dev->driver.rbuf, (void *) &value);
+- wake_up(&dev->driver.rbuf->wait_poll);
+- }
+-}
+-
+-static irqreturn_t ite8709_interrupt(int irq, void *dev_id)
+-{
+- unsigned char data;
+- int iir, rfsr, i;
+- int fifo = 0;
+- char bit;
+- struct timeval curr_tv;
+-
+- /* Bit duration in microseconds */
+- const unsigned long bit_duration = 1000000ul / (115200 / CFG_BDR);
+-
+- struct ite8709_device *dev;
+- dev = dev_id;
+-
+- /*
+- * If device is busy, we simply discard data because we are in one of
+- * these two cases : shutting down or rearming the device, so this
+- * doesn't really matter and this avoids waiting too long in IRQ ctx
+- */
+- spin_lock(&dev->hardware_lock);
+- if (dev->device_busy) {
+- spin_unlock(&dev->hardware_lock);
+- return IRQ_RETVAL(IRQ_HANDLED);
+- }
+-
+- iir = ite8709_read(dev, ITE8709_IIR);
+-
+- switch (iir) {
+- case ITE8709_IIR_RFOI:
+- dprintk("fifo overrun, scheduling forced rearm just in case\n");
+- dev->force_rearm = 1;
+- tasklet_schedule(&dev->tasklet);
+- spin_unlock(&dev->hardware_lock);
+- return IRQ_RETVAL(IRQ_HANDLED);
+-
+- case ITE8709_IIR_RDAI:
+- rfsr = ite8709_read(dev, ITE8709_RFSR);
+- fifo = rfsr & ITE8709_RFSR_MASK;
+- if (fifo > 32)
+- fifo = 32;
+- dprintk("iir: 0x%x rfsr: 0x%x fifo: %d\n", iir, rfsr, fifo);
+-
+- if (dev->rearmed) {
+- do_gettimeofday(&curr_tv);
+- dev->acc_space += 1000000ull
+- * (curr_tv.tv_sec - dev->last_tv.tv_sec)
+- + (curr_tv.tv_usec - dev->last_tv.tv_usec);
+- dev->rearmed = 0;
+- }
+- for (i = 0; i < fifo; i++) {
+- data = ite8709_read(dev, i+ITE8709_FIFO_START);
+- data = ~data;
+- /* Loop through */
+- for (bit = 0; bit < 8; ++bit) {
+- if ((data >> bit) & 1) {
+- dev->acc_pulse += bit_duration;
+- if (dev->lastbit == 0) {
+- ite8709_add_read_queue(dev, 0,
+- dev->acc_space);
+- dev->acc_space = 0;
+- }
+- } else {
+- dev->acc_space += bit_duration;
+- if (dev->lastbit == 1) {
+- ite8709_add_read_queue(dev, 1,
+- dev->acc_pulse);
+- dev->acc_pulse = 0;
+- }
+- }
+- dev->lastbit = (data >> bit) & 1;
+- }
+- }
+- ite8709_write(dev, ITE8709_RFSR, 0);
+-
+- if (dev->acc_space > CFG_TIMEOUT) {
+- dprintk("scheduling rearm IRQ\n");
+- do_gettimeofday(&dev->last_tv);
+- dev->force_rearm = 0;
+- tasklet_schedule(&dev->tasklet);
+- }
+-
+- spin_unlock(&dev->hardware_lock);
+- return IRQ_RETVAL(IRQ_HANDLED);
+-
+- default:
+- /* not our irq */
+- dprintk("unknown IRQ (shouldn't happen) !!\n");
+- spin_unlock(&dev->hardware_lock);
+- return IRQ_RETVAL(IRQ_NONE);
+- }
+-}
+-
+-static void ite8709_rearm_irq(unsigned long data)
+-{
+- struct ite8709_device *dev;
+- unsigned long flags;
+- dev = (struct ite8709_device *) data;
+-
+- spin_lock_irqsave(&dev->hardware_lock, flags);
+- dev->device_busy = 1;
+- spin_unlock_irqrestore(&dev->hardware_lock, flags);
+-
+- if (dev->force_rearm || dev->acc_space > CFG_TIMEOUT) {
+- dprintk("rearming IRQ\n");
+- ite8709_write_register(dev, IT8512_REG_RCR,
+- IT8512_RCR_RXACT | CFG_DCR);
+- ite8709_write_register(dev, IT8512_REG_MSTCR,
+- CFG_FIFOTL | IT8512_MSTCR_FIFOCLR);
+- ite8709_write_register(dev, IT8512_REG_RCR,
+- IT8512_RCR_RXEN | IT8512_RCR_RXACT | CFG_DCR);
+- if (!dev->force_rearm)
+- dev->rearmed = 1;
+- dev->force_rearm = 0;
+- }
+-
+- spin_lock_irqsave(&dev->hardware_lock, flags);
+- dev->device_busy = 0;
+- spin_unlock_irqrestore(&dev->hardware_lock, flags);
+-}
+-
+-static int ite8709_cleanup(struct ite8709_device *dev, int stage, int errno,
+- char *msg)
+-{
+- if (msg != NULL)
+- printk(KERN_ERR LIRC_DRIVER_NAME ": %s\n", msg);
+-
+- switch (stage) {
+- case 6:
+- if (dev->use_count > 0)
+- ite8709_drop_hardware(dev);
+- case 5:
+- free_irq(dev->irq, dev);
+- case 4:
+- release_region(dev->io, 2);
+- case 3:
+- lirc_unregister_driver(dev->driver.minor);
+- case 2:
+- lirc_buffer_free(dev->driver.rbuf);
+- kfree(dev->driver.rbuf);
+- case 1:
+- kfree(dev);
+- case 0:
+- ;
+- }
+-
+- return errno;
+-}
+-
+-static int __devinit ite8709_pnp_probe(struct pnp_dev *dev,
+- const struct pnp_device_id *dev_id)
+-{
+- struct lirc_driver *driver;
+- struct ite8709_device *ite8709_dev;
+- int ret;
+-
+- /* Check resources validity */
+- if (!pnp_irq_valid(dev, 0))
+- return ite8709_cleanup(NULL, 0, -ENODEV, "invalid IRQ");
+- if (!pnp_port_valid(dev, 2))
+- return ite8709_cleanup(NULL, 0, -ENODEV, "invalid IO port");
+-
+- /* Allocate memory for device struct */
+- ite8709_dev = kzalloc(sizeof(struct ite8709_device), GFP_KERNEL);
+- if (ite8709_dev == NULL)
+- return ite8709_cleanup(NULL, 0, -ENOMEM, "kzalloc failed");
+- pnp_set_drvdata(dev, ite8709_dev);
+-
+- /* Initialize device struct */
+- ite8709_dev->use_count = 0;
+- ite8709_dev->irq = pnp_irq(dev, 0);
+- ite8709_dev->io = pnp_port_start(dev, 2);
+- ite8709_dev->hardware_lock =
+- __SPIN_LOCK_UNLOCKED(ite8709_dev->hardware_lock);
+- ite8709_dev->acc_pulse = 0;
+- ite8709_dev->acc_space = 0;
+- ite8709_dev->lastbit = 0;
+- do_gettimeofday(&ite8709_dev->last_tv);
+- tasklet_init(&ite8709_dev->tasklet, ite8709_rearm_irq,
+- (long) ite8709_dev);
+- ite8709_dev->force_rearm = 0;
+- ite8709_dev->rearmed = 0;
+- ite8709_dev->device_busy = 0;
+-
+- /* Initialize driver struct */
+- driver = &ite8709_dev->driver;
+- strcpy(driver->name, LIRC_DRIVER_NAME);
+- driver->minor = -1;
+- driver->code_length = sizeof(int) * 8;
+- driver->sample_rate = 0;
+- driver->features = LIRC_CAN_REC_MODE2;
+- driver->data = ite8709_dev;
+- driver->add_to_buf = NULL;
+- driver->set_use_inc = ite8709_set_use_inc;
+- driver->set_use_dec = ite8709_set_use_dec;
+- driver->dev = &dev->dev;
+- driver->owner = THIS_MODULE;
+-
+- /* Initialize LIRC buffer */
+- driver->rbuf = kmalloc(sizeof(struct lirc_buffer), GFP_KERNEL);
+- if (!driver->rbuf)
+- return ite8709_cleanup(ite8709_dev, 1, -ENOMEM,
+- "can't allocate lirc_buffer");
+- if (lirc_buffer_init(driver->rbuf, BUF_CHUNK_SIZE, BUF_SIZE))
+- return ite8709_cleanup(ite8709_dev, 1, -ENOMEM,
+- "lirc_buffer_init() failed");
+-
+- /* Register LIRC driver */
+- ret = lirc_register_driver(driver);
+- if (ret < 0)
+- return ite8709_cleanup(ite8709_dev, 2, ret,
+- "lirc_register_driver() failed");
+-
+- /* Reserve I/O port access */
+- if (!request_region(ite8709_dev->io, 2, LIRC_DRIVER_NAME))
+- return ite8709_cleanup(ite8709_dev, 3, -EBUSY,
+- "i/o port already in use");
+-
+- /* Reserve IRQ line */
+- ret = request_irq(ite8709_dev->irq, ite8709_interrupt, 0,
+- LIRC_DRIVER_NAME, ite8709_dev);
+- if (ret < 0)
+- return ite8709_cleanup(ite8709_dev, 4, ret,
+- "IRQ already in use");
+-
+- /* Initialize hardware */
+- ite8709_drop_hardware(ite8709_dev); /* Shutdown hw until first use */
+-
+- printk(KERN_INFO LIRC_DRIVER_NAME ": device found : irq=%d io=0x%x\n",
+- ite8709_dev->irq, ite8709_dev->io);
+-
+- return 0;
+-}
+-
+-static void __devexit ite8709_pnp_remove(struct pnp_dev *dev)
+-{
+- struct ite8709_device *ite8709_dev;
+- ite8709_dev = pnp_get_drvdata(dev);
+-
+- ite8709_cleanup(ite8709_dev, 6, 0, NULL);
+-
+- printk(KERN_INFO LIRC_DRIVER_NAME ": device removed\n");
+-}
+-
+-#ifdef CONFIG_PM
+-static int ite8709_pnp_suspend(struct pnp_dev *dev, pm_message_t state)
+-{
+- struct ite8709_device *ite8709_dev;
+- ite8709_dev = pnp_get_drvdata(dev);
+-
+- if (ite8709_dev->use_count > 0)
+- ite8709_drop_hardware(ite8709_dev);
+-
+- return 0;
+-}
+-
+-static int ite8709_pnp_resume(struct pnp_dev *dev)
+-{
+- struct ite8709_device *ite8709_dev;
+- ite8709_dev = pnp_get_drvdata(dev);
+-
+- if (ite8709_dev->use_count > 0)
+- ite8709_init_hardware(ite8709_dev);
+-
+- return 0;
+-}
+-#else
+-#define ite8709_pnp_suspend NULL
+-#define ite8709_pnp_resume NULL
+-#endif
+-
+-static const struct pnp_device_id pnp_dev_table[] = {
+- {"ITE8709", 0},
+- {}
+-};
+-
+-MODULE_DEVICE_TABLE(pnp, pnp_dev_table);
+-
+-static struct pnp_driver ite8709_pnp_driver = {
+- .name = LIRC_DRIVER_NAME,
+- .probe = ite8709_pnp_probe,
+- .remove = __devexit_p(ite8709_pnp_remove),
+- .suspend = ite8709_pnp_suspend,
+- .resume = ite8709_pnp_resume,
+- .id_table = pnp_dev_table,
+-};
+-
+-static int __init ite8709_init_module(void)
+-{
+- return pnp_register_driver(&ite8709_pnp_driver);
+-}
+-module_init(ite8709_init_module);
+-
+-static void __exit ite8709_cleanup_module(void)
+-{
+- pnp_unregister_driver(&ite8709_pnp_driver);
+-}
+-module_exit(ite8709_cleanup_module);
+-
+-MODULE_DESCRIPTION("LIRC driver for ITE8709 CIR port");
+-MODULE_AUTHOR("Grégory Lardière");
+-MODULE_LICENSE("GPL");
+-
+-module_param(debug, bool, S_IRUGO | S_IWUSR);
+-MODULE_PARM_DESC(debug, "Enable debugging messages");
+diff --git a/drivers/staging/lirc/lirc_sasem.c b/drivers/staging/lirc/lirc_sasem.c
+index 925eabe..63a438d 100644
+--- a/drivers/staging/lirc/lirc_sasem.c
++++ b/drivers/staging/lirc/lirc_sasem.c
+@@ -364,7 +364,7 @@ static ssize_t vfd_write(struct file *file, const char *buf,
+ int i;
+ int retval = 0;
+ struct sasem_context *context;
+- int *data_buf;
++ int *data_buf = NULL;
+
+ context = (struct sasem_context *) file->private_data;
+ if (!context) {
+diff --git a/drivers/staging/lirc/lirc_zilog.c b/drivers/staging/lirc/lirc_zilog.c
+index 0aad0d7..dd6a57c 100644
+--- a/drivers/staging/lirc/lirc_zilog.c
++++ b/drivers/staging/lirc/lirc_zilog.c
+@@ -63,14 +63,16 @@
+ #include <media/lirc_dev.h>
+ #include <media/lirc.h>
+
++struct IR;
++
+ struct IR_rx {
++ struct kref ref;
++ struct IR *ir;
++
+ /* RX device */
++ struct mutex client_lock;
+ struct i2c_client *c;
+
+- /* RX device buffer & lock */
+- struct lirc_buffer buf;
+- struct mutex buf_lock;
+-
+ /* RX polling thread data */
+ struct task_struct *task;
+
+@@ -80,7 +82,11 @@ struct IR_rx {
+ };
+
+ struct IR_tx {
++ struct kref ref;
++ struct IR *ir;
++
+ /* TX device */
++ struct mutex client_lock;
+ struct i2c_client *c;
+
+ /* TX additional actions needed */
+@@ -89,19 +95,34 @@ struct IR_tx {
+ };
+
+ struct IR {
++ struct kref ref;
++ struct list_head list;
++
++ /* FIXME spinlock access to l.features */
+ struct lirc_driver l;
++ struct lirc_buffer rbuf;
+
+ struct mutex ir_lock;
+- int open;
++ atomic_t open_count;
+
+ struct i2c_adapter *adapter;
++
++ spinlock_t rx_ref_lock; /* struct IR_rx kref get()/put() */
+ struct IR_rx *rx;
++
++ spinlock_t tx_ref_lock; /* struct IR_tx kref get()/put() */
+ struct IR_tx *tx;
+ };
+
+-/* Minor -> data mapping */
+-static struct mutex ir_devices_lock;
+-static struct IR *ir_devices[MAX_IRCTL_DEVICES];
++/* IR transceiver instance object list */
++/*
++ * This lock is used for the following:
++ * a. ir_devices_list access, insertions, deletions
++ * b. struct IR kref get()s and put()s
++ * c. serialization of ir_probe() for the two i2c_clients for a Z8
++ */
++static DEFINE_MUTEX(ir_devices_lock);
++static LIST_HEAD(ir_devices_list);
+
+ /* Block size for IR transmitter */
+ #define TX_BLOCK_SIZE 99
+@@ -147,6 +168,157 @@ static int minor = -1; /* minor number */
+ ## args); \
+ } while (0)
+
++
++/* struct IR reference counting */
++static struct IR *get_ir_device(struct IR *ir, bool ir_devices_lock_held)
++{
++ if (ir_devices_lock_held) {
++ kref_get(&ir->ref);
++ } else {
++ mutex_lock(&ir_devices_lock);
++ kref_get(&ir->ref);
++ mutex_unlock(&ir_devices_lock);
++ }
++ return ir;
++}
++
++static void release_ir_device(struct kref *ref)
++{
++ struct IR *ir = container_of(ref, struct IR, ref);
++
++ /*
++ * Things should be in this state by now:
++ * ir->rx set to NULL and deallocated - happens before ir->rx->ir put()
++ * ir->rx->task kthread stopped - happens before ir->rx->ir put()
++ * ir->tx set to NULL and deallocated - happens before ir->tx->ir put()
++ * ir->open_count == 0 - happens on final close()
++ * ir_lock, tx_ref_lock, rx_ref_lock, all released
++ */
++ if (ir->l.minor >= 0 && ir->l.minor < MAX_IRCTL_DEVICES) {
++ lirc_unregister_driver(ir->l.minor);
++ ir->l.minor = MAX_IRCTL_DEVICES;
++ }
++ if (ir->rbuf.fifo_initialized)
++ lirc_buffer_free(&ir->rbuf);
++ list_del(&ir->list);
++ kfree(ir);
++}
++
++static int put_ir_device(struct IR *ir, bool ir_devices_lock_held)
++{
++ int released;
++
++ if (ir_devices_lock_held)
++ return kref_put(&ir->ref, release_ir_device);
++
++ mutex_lock(&ir_devices_lock);
++ released = kref_put(&ir->ref, release_ir_device);
++ mutex_unlock(&ir_devices_lock);
++
++ return released;
++}
++
++/* struct IR_rx reference counting */
++static struct IR_rx *get_ir_rx(struct IR *ir)
++{
++ struct IR_rx *rx;
++
++ spin_lock(&ir->rx_ref_lock);
++ rx = ir->rx;
++ if (rx != NULL)
++ kref_get(&rx->ref);
++ spin_unlock(&ir->rx_ref_lock);
++ return rx;
++}
++
++static void destroy_rx_kthread(struct IR_rx *rx, bool ir_devices_lock_held)
++{
++ /* end up polling thread */
++ if (!IS_ERR_OR_NULL(rx->task)) {
++ kthread_stop(rx->task);
++ rx->task = NULL;
++ /* Put the ir ptr that ir_probe() gave to the rx poll thread */
++ put_ir_device(rx->ir, ir_devices_lock_held);
++ }
++}
++
++static void release_ir_rx(struct kref *ref)
++{
++ struct IR_rx *rx = container_of(ref, struct IR_rx, ref);
++ struct IR *ir = rx->ir;
++
++ /*
++ * This release function can't do all the work, as we want
++ * to keep the rx_ref_lock a spinlock, and killing the poll thread
++ * and releasing the ir reference can cause a sleep. That work is
++ * performed by put_ir_rx()
++ */
++ ir->l.features &= ~LIRC_CAN_REC_LIRCCODE;
++ /* Don't put_ir_device(rx->ir) here; lock can't be freed yet */
++ ir->rx = NULL;
++ /* Don't do the kfree(rx) here; we still need to kill the poll thread */
++ return;
++}
++
++static int put_ir_rx(struct IR_rx *rx, bool ir_devices_lock_held)
++{
++ int released;
++ struct IR *ir = rx->ir;
++
++ spin_lock(&ir->rx_ref_lock);
++ released = kref_put(&rx->ref, release_ir_rx);
++ spin_unlock(&ir->rx_ref_lock);
++ /* Destroy the rx kthread while not holding the spinlock */
++ if (released) {
++ destroy_rx_kthread(rx, ir_devices_lock_held);
++ kfree(rx);
++ /* Make sure we're not still in a poll_table somewhere */
++ wake_up_interruptible(&ir->rbuf.wait_poll);
++ }
++ /* Do a reference put() for the rx->ir reference, if we released rx */
++ if (released)
++ put_ir_device(ir, ir_devices_lock_held);
++ return released;
++}
++
++/* struct IR_tx reference counting */
++static struct IR_tx *get_ir_tx(struct IR *ir)
++{
++ struct IR_tx *tx;
++
++ spin_lock(&ir->tx_ref_lock);
++ tx = ir->tx;
++ if (tx != NULL)
++ kref_get(&tx->ref);
++ spin_unlock(&ir->tx_ref_lock);
++ return tx;
++}
++
++static void release_ir_tx(struct kref *ref)
++{
++ struct IR_tx *tx = container_of(ref, struct IR_tx, ref);
++ struct IR *ir = tx->ir;
++
++ ir->l.features &= ~LIRC_CAN_SEND_PULSE;
++ /* Don't put_ir_device(tx->ir) here, so our lock doesn't get freed */
++ ir->tx = NULL;
++ kfree(tx);
++}
++
++static int put_ir_tx(struct IR_tx *tx, bool ir_devices_lock_held)
++{
++ int released;
++ struct IR *ir = tx->ir;
++
++ spin_lock(&ir->tx_ref_lock);
++ released = kref_put(&tx->ref, release_ir_tx);
++ spin_unlock(&ir->tx_ref_lock);
++ /* Do a reference put() for the tx->ir reference, if we released tx */
++ if (released)
++ put_ir_device(ir, ir_devices_lock_held);
++ return released;
++}
++
+ static int add_to_buf(struct IR *ir)
+ {
+ __u16 code;
+@@ -156,23 +328,38 @@ static int add_to_buf(struct IR *ir)
+ int ret;
+ int failures = 0;
+ unsigned char sendbuf[1] = { 0 };
+- struct IR_rx *rx = ir->rx;
++ struct lirc_buffer *rbuf = ir->l.rbuf;
++ struct IR_rx *rx;
++ struct IR_tx *tx;
+
++ if (lirc_buffer_full(rbuf)) {
++ dprintk("buffer overflow\n");
++ return -EOVERFLOW;
++ }
++
++ rx = get_ir_rx(ir);
+ if (rx == NULL)
+ return -ENXIO;
+
+- if (lirc_buffer_full(&rx->buf)) {
+- dprintk("buffer overflow\n");
+- return -EOVERFLOW;
++ /* Ensure our rx->c i2c_client remains valid for the duration */
++ mutex_lock(&rx->client_lock);
++ if (rx->c == NULL) {
++ mutex_unlock(&rx->client_lock);
++ put_ir_rx(rx, false);
++ return -ENXIO;
+ }
+
++ tx = get_ir_tx(ir);
++
+ /*
+ * service the device as long as it is returning
+ * data and we have space
+ */
+ do {
+- if (kthread_should_stop())
+- return -ENODATA;
++ if (kthread_should_stop()) {
++ ret = -ENODATA;
++ break;
++ }
+
+ /*
+ * Lock i2c bus for the duration. RX/TX chips interfere so
+@@ -182,7 +369,8 @@ static int add_to_buf(struct IR *ir)
+
+ if (kthread_should_stop()) {
+ mutex_unlock(&ir->ir_lock);
+- return -ENODATA;
++ ret = -ENODATA;
++ break;
+ }
+
+ /*
+@@ -196,7 +384,7 @@ static int add_to_buf(struct IR *ir)
+ mutex_unlock(&ir->ir_lock);
+ zilog_error("unable to read from the IR chip "
+ "after 3 resets, giving up\n");
+- return ret;
++ break;
+ }
+
+ /* Looks like the chip crashed, reset it */
+@@ -206,19 +394,23 @@ static int add_to_buf(struct IR *ir)
+ set_current_state(TASK_UNINTERRUPTIBLE);
+ if (kthread_should_stop()) {
+ mutex_unlock(&ir->ir_lock);
+- return -ENODATA;
++ ret = -ENODATA;
++ break;
+ }
+ schedule_timeout((100 * HZ + 999) / 1000);
+- ir->tx->need_boot = 1;
++ if (tx != NULL)
++ tx->need_boot = 1;
+
+ ++failures;
+ mutex_unlock(&ir->ir_lock);
++ ret = 0;
+ continue;
+ }
+
+ if (kthread_should_stop()) {
+ mutex_unlock(&ir->ir_lock);
+- return -ENODATA;
++ ret = -ENODATA;
++ break;
+ }
+ ret = i2c_master_recv(rx->c, keybuf, sizeof(keybuf));
+ mutex_unlock(&ir->ir_lock);
+@@ -234,12 +426,17 @@ static int add_to_buf(struct IR *ir)
+
+ /* key pressed ? */
+ if (rx->hdpvr_data_fmt) {
+- if (got_data && (keybuf[0] == 0x80))
+- return 0;
+- else if (got_data && (keybuf[0] == 0x00))
+- return -ENODATA;
+- } else if ((rx->b[0] & 0x80) == 0)
+- return got_data ? 0 : -ENODATA;
++ if (got_data && (keybuf[0] == 0x80)) {
++ ret = 0;
++ break;
++ } else if (got_data && (keybuf[0] == 0x00)) {
++ ret = -ENODATA;
++ break;
++ }
++ } else if ((rx->b[0] & 0x80) == 0) {
++ ret = got_data ? 0 : -ENODATA;
++ break;
++ }
+
+ /* look what we have */
+ code = (((__u16)rx->b[0] & 0x7f) << 6) | (rx->b[1] >> 2);
+@@ -248,11 +445,16 @@ static int add_to_buf(struct IR *ir)
+ codes[1] = code & 0xff;
+
+ /* return it */
+- lirc_buffer_write(&rx->buf, codes);
++ lirc_buffer_write(rbuf, codes);
+ ++got_data;
+- } while (!lirc_buffer_full(&rx->buf));
++ ret = 0;
++ } while (!lirc_buffer_full(rbuf));
+
+- return 0;
++ mutex_unlock(&rx->client_lock);
++ if (tx != NULL)
++ put_ir_tx(tx, false);
++ put_ir_rx(rx, false);
++ return ret;
+ }
+
+ /*
+@@ -268,19 +470,19 @@ static int add_to_buf(struct IR *ir)
+ static int lirc_thread(void *arg)
+ {
+ struct IR *ir = arg;
+- struct IR_rx *rx = ir->rx;
++ struct lirc_buffer *rbuf = ir->l.rbuf;
+
+ dprintk("poll thread started\n");
+
+ while (!kthread_should_stop()) {
+- set_current_state(TASK_INTERRUPTIBLE);
+-
+ /* if device not opened, we can sleep half a second */
+- if (!ir->open) {
++ if (atomic_read(&ir->open_count) == 0) {
+ schedule_timeout(HZ/2);
+ continue;
+ }
+
++ set_current_state(TASK_INTERRUPTIBLE);
++
+ /*
+ * This is ~113*2 + 24 + jitter (2*repeat gap + code length).
+ * We use this interval as the chip resets every time you poll
+@@ -295,7 +497,7 @@ static int lirc_thread(void *arg)
+ if (kthread_should_stop())
+ break;
+ if (!add_to_buf(ir))
+- wake_up_interruptible(&rx->buf.wait_poll);
++ wake_up_interruptible(&rbuf->wait_poll);
+ }
+
+ dprintk("poll thread ended\n");
+@@ -304,34 +506,12 @@ static int lirc_thread(void *arg)
+
+ static int set_use_inc(void *data)
+ {
+- struct IR *ir = data;
+-
+- if (ir->l.owner == NULL || try_module_get(ir->l.owner) == 0)
+- return -ENODEV;
+-
+- /* lock bttv in memory while /dev/lirc is in use */
+- /*
+- * this is completely broken code. lirc_unregister_driver()
+- * must be possible even when the device is open
+- */
+- if (ir->rx != NULL)
+- i2c_use_client(ir->rx->c);
+- if (ir->tx != NULL)
+- i2c_use_client(ir->tx->c);
+-
+ return 0;
+ }
+
+ static void set_use_dec(void *data)
+ {
+- struct IR *ir = data;
+-
+- if (ir->rx)
+- i2c_release_client(ir->rx->c);
+- if (ir->tx)
+- i2c_release_client(ir->tx->c);
+- if (ir->l.owner != NULL)
+- module_put(ir->l.owner);
++ return;
+ }
+
+ /* safe read of a uint32 (always network byte order) */
+@@ -585,7 +765,7 @@ static int fw_load(struct IR_tx *tx)
+ }
+
+ /* Request codeset data file */
+- ret = reject_firmware(&fw_entry, "/*(DEBLOBBED)*/", &tx->c->dev);
++ ret = reject_firmware(&fw_entry, "/*(DEBLOBBED)*/", tx->ir->l.dev);
+ if (ret != 0) {
+ zilog_error("firmware /*(DEBLOBBED)*/ not available "
+ "(%d)\n", ret);
+@@ -711,59 +891,32 @@ out:
+ return ret;
+ }
+
+-/* initialise the IR TX device */
+-static int tx_init(struct IR_tx *tx)
+-{
+- int ret;
+-
+- /* Load 'firmware' */
+- ret = fw_load(tx);
+- if (ret != 0)
+- return ret;
+-
+- /* Send boot block */
+- ret = send_boot_data(tx);
+- if (ret != 0)
+- return ret;
+- tx->need_boot = 0;
+-
+- /* Looks good */
+- return 0;
+-}
+-
+-/* do nothing stub to make LIRC happy */
+-static loff_t lseek(struct file *filep, loff_t offset, int orig)
+-{
+- return -ESPIPE;
+-}
+-
+ /* copied from lirc_dev */
+ static ssize_t read(struct file *filep, char *outbuf, size_t n, loff_t *ppos)
+ {
+ struct IR *ir = filep->private_data;
+- struct IR_rx *rx = ir->rx;
+- int ret = 0, written = 0;
++ struct IR_rx *rx;
++ struct lirc_buffer *rbuf = ir->l.rbuf;
++ int ret = 0, written = 0, retries = 0;
++ unsigned int m;
+ DECLARE_WAITQUEUE(wait, current);
+
+ dprintk("read called\n");
+- if (rx == NULL)
+- return -ENODEV;
+-
+- if (mutex_lock_interruptible(&rx->buf_lock))
+- return -ERESTARTSYS;
+-
+- if (n % rx->buf.chunk_size) {
++ if (n % rbuf->chunk_size) {
+ dprintk("read result = -EINVAL\n");
+- mutex_unlock(&rx->buf_lock);
+ return -EINVAL;
+ }
+
++ rx = get_ir_rx(ir);
++ if (rx == NULL)
++ return -ENXIO;
++
+ /*
+ * we add ourselves to the task queue before buffer check
+ * to avoid losing scan code (in case when queue is awaken somewhere
+ * between while condition checking and scheduling)
+ */
+- add_wait_queue(&rx->buf.wait_poll, &wait);
++ add_wait_queue(&rbuf->wait_poll, &wait);
+ set_current_state(TASK_INTERRUPTIBLE);
+
+ /*
+@@ -771,7 +924,7 @@ static ssize_t read(struct file *filep, char *outbuf, size_t n, loff_t *ppos)
+ * mode and 'copy_to_user' is happy, wait for data.
+ */
+ while (written < n && ret == 0) {
+- if (lirc_buffer_empty(&rx->buf)) {
++ if (lirc_buffer_empty(rbuf)) {
+ /*
+ * According to the read(2) man page, 'written' can be
+ * returned as less than 'n', instead of blocking
+@@ -791,20 +944,27 @@ static ssize_t read(struct file *filep, char *outbuf, size_t n, loff_t *ppos)
+ schedule();
+ set_current_state(TASK_INTERRUPTIBLE);
+ } else {
+- unsigned char buf[rx->buf.chunk_size];
+- lirc_buffer_read(&rx->buf, buf);
+- ret = copy_to_user((void *)outbuf+written, buf,
+- rx->buf.chunk_size);
+- written += rx->buf.chunk_size;
++ unsigned char buf[rbuf->chunk_size];
++ m = lirc_buffer_read(rbuf, buf);
++ if (m == rbuf->chunk_size) {
++ ret = copy_to_user((void *)outbuf+written, buf,
++ rbuf->chunk_size);
++ written += rbuf->chunk_size;
++ } else {
++ retries++;
++ }
++ if (retries >= 5) {
++ zilog_error("Buffer read failed!\n");
++ ret = -EIO;
++ }
+ }
+ }
+
+- remove_wait_queue(&rx->buf.wait_poll, &wait);
++ remove_wait_queue(&rbuf->wait_poll, &wait);
++ put_ir_rx(rx, false);
+ set_current_state(TASK_RUNNING);
+- mutex_unlock(&rx->buf_lock);
+
+- dprintk("read result = %s (%d)\n",
+- ret ? "-EFAULT" : "OK", ret);
++ dprintk("read result = %d (%s)\n", ret, ret ? "Error" : "OK");
+
+ return ret ? ret : written;
+ }
+@@ -931,17 +1091,27 @@ static ssize_t write(struct file *filep, const char *buf, size_t n,
+ loff_t *ppos)
+ {
+ struct IR *ir = filep->private_data;
+- struct IR_tx *tx = ir->tx;
++ struct IR_tx *tx;
+ size_t i;
+ int failures = 0;
+
+- if (tx == NULL)
+- return -ENODEV;
+-
+ /* Validate user parameters */
+ if (n % sizeof(int))
+ return -EINVAL;
+
++ /* Get a struct IR_tx reference */
++ tx = get_ir_tx(ir);
++ if (tx == NULL)
++ return -ENXIO;
++
++ /* Ensure our tx->c i2c_client remains valid for the duration */
++ mutex_lock(&tx->client_lock);
++ if (tx->c == NULL) {
++ mutex_unlock(&tx->client_lock);
++ put_ir_tx(tx, false);
++ return -ENXIO;
++ }
++
+ /* Lock i2c bus for the duration */
+ mutex_lock(&ir->ir_lock);
+
+@@ -952,11 +1122,24 @@ static ssize_t write(struct file *filep, const char *buf, size_t n,
+
+ if (copy_from_user(&command, buf + i, sizeof(command))) {
+ mutex_unlock(&ir->ir_lock);
++ mutex_unlock(&tx->client_lock);
++ put_ir_tx(tx, false);
+ return -EFAULT;
+ }
+
+ /* Send boot data first if required */
+ if (tx->need_boot == 1) {
++ /* Make sure we have the 'firmware' loaded, first */
++ ret = fw_load(tx);
++ if (ret != 0) {
++ mutex_unlock(&ir->ir_lock);
++ mutex_unlock(&tx->client_lock);
++ put_ir_tx(tx, false);
++ if (ret != -ENOMEM)
++ ret = -EIO;
++ return ret;
++ }
++ /* Prep the chip for transmitting codes */
+ ret = send_boot_data(tx);
+ if (ret == 0)
+ tx->need_boot = 0;
+@@ -968,6 +1151,8 @@ static ssize_t write(struct file *filep, const char *buf, size_t n,
+ (unsigned)command & 0xFFFF);
+ if (ret == -EPROTO) {
+ mutex_unlock(&ir->ir_lock);
++ mutex_unlock(&tx->client_lock);
++ put_ir_tx(tx, false);
+ return ret;
+ }
+ }
+@@ -985,6 +1170,8 @@ static ssize_t write(struct file *filep, const char *buf, size_t n,
+ zilog_error("unable to send to the IR chip "
+ "after 3 resets, giving up\n");
+ mutex_unlock(&ir->ir_lock);
++ mutex_unlock(&tx->client_lock);
++ put_ir_tx(tx, false);
+ return ret;
+ }
+ set_current_state(TASK_UNINTERRUPTIBLE);
+@@ -998,6 +1185,11 @@ static ssize_t write(struct file *filep, const char *buf, size_t n,
+ /* Release i2c bus */
+ mutex_unlock(&ir->ir_lock);
+
++ mutex_unlock(&tx->client_lock);
++
++ /* Give back our struct IR_tx reference */
++ put_ir_tx(tx, false);
++
+ /* All looks good */
+ return n;
+ }
+@@ -1006,23 +1198,32 @@ static ssize_t write(struct file *filep, const char *buf, size_t n,
+ static unsigned int poll(struct file *filep, poll_table *wait)
+ {
+ struct IR *ir = filep->private_data;
+- struct IR_rx *rx = ir->rx;
++ struct IR_rx *rx;
++ struct lirc_buffer *rbuf = ir->l.rbuf;
+ unsigned int ret;
+
+ dprintk("poll called\n");
+- if (rx == NULL)
+- return -ENODEV;
+-
+- mutex_lock(&rx->buf_lock);
+
+- poll_wait(filep, &rx->buf.wait_poll, wait);
++ rx = get_ir_rx(ir);
++ if (rx == NULL) {
++ /*
++ * Revisit this, if our poll function ever reports writeable
++ * status for Tx
++ */
++ dprintk("poll result = POLLERR\n");
++ return POLLERR;
++ }
+
+- dprintk("poll result = %s\n",
+- lirc_buffer_empty(&rx->buf) ? "0" : "POLLIN|POLLRDNORM");
++ /*
++ * Add our lirc_buffer's wait_queue to the poll_table. A wake up on
++ * that buffer's wait queue indicates we may have a new poll status.
++ */
++ poll_wait(filep, &rbuf->wait_poll, wait);
+
+- ret = lirc_buffer_empty(&rx->buf) ? 0 : (POLLIN|POLLRDNORM);
++ /* Indicate what ops could happen immediately without blocking */
++ ret = lirc_buffer_empty(rbuf) ? 0 : (POLLIN|POLLRDNORM);
+
+- mutex_unlock(&rx->buf_lock);
++ dprintk("poll result = %s\n", ret ? "POLLIN|POLLRDNORM" : "none");
+ return ret;
+ }
+
+@@ -1030,11 +1231,9 @@ static long ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
+ {
+ struct IR *ir = filep->private_data;
+ int result;
+- unsigned long mode, features = 0;
++ unsigned long mode, features;
+
+- features |= LIRC_CAN_SEND_PULSE;
+- if (ir->rx != NULL)
+- features |= LIRC_CAN_REC_LIRCCODE;
++ features = ir->l.features;
+
+ switch (cmd) {
+ case LIRC_GET_LENGTH:
+@@ -1061,9 +1260,15 @@ static long ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
+ result = -EINVAL;
+ break;
+ case LIRC_GET_SEND_MODE:
++ if (!(features&LIRC_CAN_SEND_MASK))
++ return -ENOSYS;
++
+ result = put_user(LIRC_MODE_PULSE, (unsigned long *) arg);
+ break;
+ case LIRC_SET_SEND_MODE:
++ if (!(features&LIRC_CAN_SEND_MASK))
++ return -ENOSYS;
++
+ result = get_user(mode, (unsigned long *) arg);
+ if (!result && mode != LIRC_MODE_PULSE)
+ return -EINVAL;
+@@ -1074,13 +1279,24 @@ static long ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
+ return result;
+ }
+
+-/* ir_devices_lock must be held */
+-static struct IR *find_ir_device_by_minor(unsigned int minor)
++static struct IR *get_ir_device_by_minor(unsigned int minor)
+ {
+- if (minor >= MAX_IRCTL_DEVICES)
+- return NULL;
++ struct IR *ir;
++ struct IR *ret = NULL;
++
++ mutex_lock(&ir_devices_lock);
++
++ if (!list_empty(&ir_devices_list)) {
++ list_for_each_entry(ir, &ir_devices_list, list) {
++ if (ir->l.minor == minor) {
++ ret = get_ir_device(ir, true);
++ break;
++ }
++ }
++ }
+
+- return ir_devices[minor];
++ mutex_unlock(&ir_devices_lock);
++ return ret;
+ }
+
+ /*
+@@ -1090,31 +1306,20 @@ static struct IR *find_ir_device_by_minor(unsigned int minor)
+ static int open(struct inode *node, struct file *filep)
+ {
+ struct IR *ir;
+- int ret;
+ unsigned int minor = MINOR(node->i_rdev);
+
+ /* find our IR struct */
+- mutex_lock(&ir_devices_lock);
+- ir = find_ir_device_by_minor(minor);
+- mutex_unlock(&ir_devices_lock);
++ ir = get_ir_device_by_minor(minor);
+
+ if (ir == NULL)
+ return -ENODEV;
+
+- /* increment in use count */
+- mutex_lock(&ir->ir_lock);
+- ++ir->open;
+- ret = set_use_inc(ir);
+- if (ret != 0) {
+- --ir->open;
+- mutex_unlock(&ir->ir_lock);
+- return ret;
+- }
+- mutex_unlock(&ir->ir_lock);
++ atomic_inc(&ir->open_count);
+
+ /* stash our IR struct */
+ filep->private_data = ir;
+
++ nonseekable_open(node, filep);
+ return 0;
+ }
+
+@@ -1128,22 +1333,12 @@ static int close(struct inode *node, struct file *filep)
+ return -ENODEV;
+ }
+
+- /* decrement in use count */
+- mutex_lock(&ir->ir_lock);
+- --ir->open;
+- set_use_dec(ir);
+- mutex_unlock(&ir->ir_lock);
++ atomic_dec(&ir->open_count);
+
++ put_ir_device(ir, false);
+ return 0;
+ }
+
+-static struct lirc_driver lirc_template = {
+- .name = "lirc_zilog",
+- .set_use_inc = set_use_inc,
+- .set_use_dec = set_use_dec,
+- .owner = THIS_MODULE
+-};
+-
+ static int ir_remove(struct i2c_client *client);
+ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id);
+
+@@ -1170,7 +1365,7 @@ static struct i2c_driver driver = {
+
+ static const struct file_operations lirc_fops = {
+ .owner = THIS_MODULE,
+- .llseek = lseek,
++ .llseek = no_llseek,
+ .read = read,
+ .write = write,
+ .poll = poll,
+@@ -1182,97 +1377,64 @@ static const struct file_operations lirc_fops = {
+ .release = close
+ };
+
+-static void destroy_rx_kthread(struct IR_rx *rx)
+-{
+- /* end up polling thread */
+- if (rx != NULL && !IS_ERR_OR_NULL(rx->task)) {
+- kthread_stop(rx->task);
+- rx->task = NULL;
+- }
+-}
++static struct lirc_driver lirc_template = {
++ .name = "lirc_zilog",
++ .minor = -1,
++ .code_length = 13,
++ .buffer_size = BUFLEN / 2,
++ .sample_rate = 0, /* tell lirc_dev to not start its own kthread */
++ .chunk_size = 2,
++ .set_use_inc = set_use_inc,
++ .set_use_dec = set_use_dec,
++ .fops = &lirc_fops,
++ .owner = THIS_MODULE,
++};
+
+-/* ir_devices_lock must be held */
+-static int add_ir_device(struct IR *ir)
++static int ir_remove(struct i2c_client *client)
+ {
+- int i;
+-
+- for (i = 0; i < MAX_IRCTL_DEVICES; i++)
+- if (ir_devices[i] == NULL) {
+- ir_devices[i] = ir;
+- break;
++ if (strncmp("ir_tx_z8", client->name, 8) == 0) {
++ struct IR_tx *tx = i2c_get_clientdata(client);
++ if (tx != NULL) {
++ mutex_lock(&tx->client_lock);
++ tx->c = NULL;
++ mutex_unlock(&tx->client_lock);
++ put_ir_tx(tx, false);
+ }
+-
+- return i == MAX_IRCTL_DEVICES ? -ENOMEM : i;
+-}
+-
+-/* ir_devices_lock must be held */
+-static void del_ir_device(struct IR *ir)
+-{
+- int i;
+-
+- for (i = 0; i < MAX_IRCTL_DEVICES; i++)
+- if (ir_devices[i] == ir) {
+- ir_devices[i] = NULL;
+- break;
++ } else if (strncmp("ir_rx_z8", client->name, 8) == 0) {
++ struct IR_rx *rx = i2c_get_clientdata(client);
++ if (rx != NULL) {
++ mutex_lock(&rx->client_lock);
++ rx->c = NULL;
++ mutex_unlock(&rx->client_lock);
++ put_ir_rx(rx, false);
+ }
+-}
+-
+-static int ir_remove(struct i2c_client *client)
+-{
+- struct IR *ir = i2c_get_clientdata(client);
+-
+- mutex_lock(&ir_devices_lock);
+-
+- if (ir == NULL) {
+- /* We destroyed everything when the first client came through */
+- mutex_unlock(&ir_devices_lock);
+- return 0;
+ }
+-
+- /* Good-bye LIRC */
+- lirc_unregister_driver(ir->l.minor);
+-
+- /* Good-bye Rx */
+- destroy_rx_kthread(ir->rx);
+- if (ir->rx != NULL) {
+- if (ir->rx->buf.fifo_initialized)
+- lirc_buffer_free(&ir->rx->buf);
+- i2c_set_clientdata(ir->rx->c, NULL);
+- kfree(ir->rx);
+- }
+-
+- /* Good-bye Tx */
+- i2c_set_clientdata(ir->tx->c, NULL);
+- kfree(ir->tx);
+-
+- /* Good-bye IR */
+- del_ir_device(ir);
+- kfree(ir);
+-
+- mutex_unlock(&ir_devices_lock);
+ return 0;
+ }
+
+
+ /* ir_devices_lock must be held */
+-static struct IR *find_ir_device_by_adapter(struct i2c_adapter *adapter)
++static struct IR *get_ir_device_by_adapter(struct i2c_adapter *adapter)
+ {
+- int i;
+- struct IR *ir = NULL;
++ struct IR *ir;
+
+- for (i = 0; i < MAX_IRCTL_DEVICES; i++)
+- if (ir_devices[i] != NULL &&
+- ir_devices[i]->adapter == adapter) {
+- ir = ir_devices[i];
+- break;
++ if (list_empty(&ir_devices_list))
++ return NULL;
++
++ list_for_each_entry(ir, &ir_devices_list, list)
++ if (ir->adapter == adapter) {
++ get_ir_device(ir, true);
++ return ir;
+ }
+
+- return ir;
++ return NULL;
+ }
+
+ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id)
+ {
+ struct IR *ir;
++ struct IR_tx *tx;
++ struct IR_rx *rx;
+ struct i2c_adapter *adap = client->adapter;
+ int ret;
+ bool tx_probe = false;
+@@ -1296,133 +1458,170 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id)
+ mutex_lock(&ir_devices_lock);
+
+ /* Use a single struct IR instance for both the Rx and Tx functions */
+- ir = find_ir_device_by_adapter(adap);
++ ir = get_ir_device_by_adapter(adap);
+ if (ir == NULL) {
+ ir = kzalloc(sizeof(struct IR), GFP_KERNEL);
+ if (ir == NULL) {
+ ret = -ENOMEM;
+ goto out_no_ir;
+ }
++ kref_init(&ir->ref);
++
+ /* store for use in ir_probe() again, and open() later on */
+- ret = add_ir_device(ir);
+- if (ret)
+- goto out_free_ir;
++ INIT_LIST_HEAD(&ir->list);
++ list_add_tail(&ir->list, &ir_devices_list);
+
+ ir->adapter = adap;
+ mutex_init(&ir->ir_lock);
++ atomic_set(&ir->open_count, 0);
++ spin_lock_init(&ir->tx_ref_lock);
++ spin_lock_init(&ir->rx_ref_lock);
+
+ /* set lirc_dev stuff */
+ memcpy(&ir->l, &lirc_template, sizeof(struct lirc_driver));
+- ir->l.minor = minor; /* module option */
+- ir->l.code_length = 13;
+- ir->l.rbuf = NULL;
+- ir->l.fops = &lirc_fops;
+- ir->l.data = ir;
+- ir->l.dev = &adap->dev;
+- ir->l.sample_rate = 0;
++ /*
++ * FIXME this is a pointer reference to us, but no refcount.
++ *
++ * This OK for now, since lirc_dev currently won't touch this
++ * buffer as we provide our own lirc_fops.
++ *
++ * Currently our own lirc_fops rely on this ir->l.rbuf pointer
++ */
++ ir->l.rbuf = &ir->rbuf;
++ ir->l.dev = &adap->dev;
++ ret = lirc_buffer_init(ir->l.rbuf,
++ ir->l.chunk_size, ir->l.buffer_size);
++ if (ret)
++ goto out_put_ir;
+ }
+
+ if (tx_probe) {
++ /* Get the IR_rx instance for later, if already allocated */
++ rx = get_ir_rx(ir);
++
+ /* Set up a struct IR_tx instance */
+- ir->tx = kzalloc(sizeof(struct IR_tx), GFP_KERNEL);
+- if (ir->tx == NULL) {
++ tx = kzalloc(sizeof(struct IR_tx), GFP_KERNEL);
++ if (tx == NULL) {
+ ret = -ENOMEM;
+- goto out_free_xx;
++ goto out_put_xx;
+ }
+-
+- ir->tx->c = client;
+- ir->tx->need_boot = 1;
+- ir->tx->post_tx_ready_poll =
++ kref_init(&tx->ref);
++ ir->tx = tx;
++
++ ir->l.features |= LIRC_CAN_SEND_PULSE;
++ mutex_init(&tx->client_lock);
++ tx->c = client;
++ tx->need_boot = 1;
++ tx->post_tx_ready_poll =
+ (id->driver_data & ID_FLAG_HDPVR) ? false : true;
++
++ /* An ir ref goes to the struct IR_tx instance */
++ tx->ir = get_ir_device(ir, true);
++
++ /* A tx ref goes to the i2c_client */
++ i2c_set_clientdata(client, get_ir_tx(ir));
++
++ /*
++ * Load the 'firmware'. We do this before registering with
++ * lirc_dev, so the first firmware load attempt does not happen
++ * after a open() or write() call on the device.
++ *
++ * Failure here is not deemed catastrophic, so the receiver will
++ * still be usable. Firmware load will be retried in write(),
++ * if it is needed.
++ */
++ fw_load(tx);
++
++ /* Proceed only if the Rx client is also ready or not needed */
++ if (rx == NULL && !tx_only) {
++ zilog_info("probe of IR Tx on %s (i2c-%d) done. Waiting"
++ " on IR Rx.\n", adap->name, adap->nr);
++ goto out_ok;
++ }
+ } else {
++ /* Get the IR_tx instance for later, if already allocated */
++ tx = get_ir_tx(ir);
++
+ /* Set up a struct IR_rx instance */
+- ir->rx = kzalloc(sizeof(struct IR_rx), GFP_KERNEL);
+- if (ir->rx == NULL) {
++ rx = kzalloc(sizeof(struct IR_rx), GFP_KERNEL);
++ if (rx == NULL) {
+ ret = -ENOMEM;
+- goto out_free_xx;
++ goto out_put_xx;
+ }
++ kref_init(&rx->ref);
++ ir->rx = rx;
+
+- ret = lirc_buffer_init(&ir->rx->buf, 2, BUFLEN / 2);
+- if (ret)
+- goto out_free_xx;
+-
+- mutex_init(&ir->rx->buf_lock);
+- ir->rx->c = client;
+- ir->rx->hdpvr_data_fmt =
++ ir->l.features |= LIRC_CAN_REC_LIRCCODE;
++ mutex_init(&rx->client_lock);
++ rx->c = client;
++ rx->hdpvr_data_fmt =
+ (id->driver_data & ID_FLAG_HDPVR) ? true : false;
+
+- /* set lirc_dev stuff */
+- ir->l.rbuf = &ir->rx->buf;
+- }
+-
+- i2c_set_clientdata(client, ir);
++ /* An ir ref goes to the struct IR_rx instance */
++ rx->ir = get_ir_device(ir, true);
+
+- /* Proceed only if we have the required Tx and Rx clients ready to go */
+- if (ir->tx == NULL ||
+- (ir->rx == NULL && !tx_only)) {
+- zilog_info("probe of IR %s on %s (i2c-%d) done. Waiting on "
+- "IR %s.\n", tx_probe ? "Tx" : "Rx", adap->name,
+- adap->nr, tx_probe ? "Rx" : "Tx");
+- goto out_ok;
+- }
++ /* An rx ref goes to the i2c_client */
++ i2c_set_clientdata(client, get_ir_rx(ir));
+
+- /* initialise RX device */
+- if (ir->rx != NULL) {
+- /* try to fire up polling thread */
+- ir->rx->task = kthread_run(lirc_thread, ir,
+- "zilog-rx-i2c-%d", adap->nr);
+- if (IS_ERR(ir->rx->task)) {
+- ret = PTR_ERR(ir->rx->task);
++ /*
++ * Start the polling thread.
++ * It will only perform an empty loop around schedule_timeout()
++ * until we register with lirc_dev and the first user open()
++ */
++ /* An ir ref goes to the new rx polling kthread */
++ rx->task = kthread_run(lirc_thread, get_ir_device(ir, true),
++ "zilog-rx-i2c-%d", adap->nr);
++ if (IS_ERR(rx->task)) {
++ ret = PTR_ERR(rx->task);
+ zilog_error("%s: could not start IR Rx polling thread"
+ "\n", __func__);
+- goto out_free_xx;
++ /* Failed kthread, so put back the ir ref */
++ put_ir_device(ir, true);
++ /* Failure exit, so put back rx ref from i2c_client */
++ i2c_set_clientdata(client, NULL);
++ put_ir_rx(rx, true);
++ ir->l.features &= ~LIRC_CAN_REC_LIRCCODE;
++ goto out_put_xx;
++ }
++
++ /* Proceed only if the Tx client is also ready */
++ if (tx == NULL) {
++ zilog_info("probe of IR Rx on %s (i2c-%d) done. Waiting"
++ " on IR Tx.\n", adap->name, adap->nr);
++ goto out_ok;
+ }
+ }
+
+ /* register with lirc */
++ ir->l.minor = minor; /* module option: user requested minor number */
+ ir->l.minor = lirc_register_driver(&ir->l);
+ if (ir->l.minor < 0 || ir->l.minor >= MAX_IRCTL_DEVICES) {
+ zilog_error("%s: \"minor\" must be between 0 and %d (%d)!\n",
+ __func__, MAX_IRCTL_DEVICES-1, ir->l.minor);
+ ret = -EBADRQC;
+- goto out_free_thread;
++ goto out_put_xx;
+ }
++ zilog_info("IR unit on %s (i2c-%d) registered as lirc%d and ready\n",
++ adap->name, adap->nr, ir->l.minor);
+
+- /*
+- * if we have the tx device, load the 'firmware'. We do this
+- * after registering with lirc as otherwise hotplug seems to take
+- * 10s to create the lirc device.
+- */
+- ret = tx_init(ir->tx);
+- if (ret != 0)
+- goto out_unregister;
+-
+- zilog_info("probe of IR %s on %s (i2c-%d) done. IR unit ready.\n",
+- tx_probe ? "Tx" : "Rx", adap->name, adap->nr);
+ out_ok:
++ if (rx != NULL)
++ put_ir_rx(rx, true);
++ if (tx != NULL)
++ put_ir_tx(tx, true);
++ put_ir_device(ir, true);
++ zilog_info("probe of IR %s on %s (i2c-%d) done\n",
++ tx_probe ? "Tx" : "Rx", adap->name, adap->nr);
+ mutex_unlock(&ir_devices_lock);
+ return 0;
+
+-out_unregister:
+- lirc_unregister_driver(ir->l.minor);
+-out_free_thread:
+- destroy_rx_kthread(ir->rx);
+-out_free_xx:
+- if (ir->rx != NULL) {
+- if (ir->rx->buf.fifo_initialized)
+- lirc_buffer_free(&ir->rx->buf);
+- if (ir->rx->c != NULL)
+- i2c_set_clientdata(ir->rx->c, NULL);
+- kfree(ir->rx);
+- }
+- if (ir->tx != NULL) {
+- if (ir->tx->c != NULL)
+- i2c_set_clientdata(ir->tx->c, NULL);
+- kfree(ir->tx);
+- }
+-out_free_ir:
+- del_ir_device(ir);
+- kfree(ir);
++out_put_xx:
++ if (rx != NULL)
++ put_ir_rx(rx, true);
++ if (tx != NULL)
++ put_ir_tx(tx, true);
++out_put_ir:
++ put_ir_device(ir, true);
+ out_no_ir:
+ zilog_error("%s: probing IR %s on %s (i2c-%d) failed with %d\n",
+ __func__, tx_probe ? "Tx" : "Rx", adap->name, adap->nr,
+@@ -1438,7 +1637,6 @@ static int __init zilog_init(void)
+ zilog_notify("Zilog/Hauppauge IR driver initializing\n");
+
+ mutex_init(&tx_data_lock);
+- mutex_init(&ir_devices_lock);
+
+ request_module("firmware_class");
+
+diff --git a/include/media/rc-map.h b/include/media/rc-map.h
+index d843afc..9184751 100644
+--- a/include/media/rc-map.h
++++ b/include/media/rc-map.h
+@@ -94,7 +94,7 @@ void rc_map_init(void);
+ #define RC_MAP_GADMEI_RM008Z "rc-gadmei-rm008z"
+ #define RC_MAP_GENIUS_TVGO_A11MCE "rc-genius-tvgo-a11mce"
+ #define RC_MAP_GOTVIEW7135 "rc-gotview7135"
+-#define RC_MAP_HAUPPAUGE_NEW "rc-hauppauge-new"
++#define RC_MAP_HAUPPAUGE_NEW "rc-hauppauge"
+ #define RC_MAP_IMON_MCE "rc-imon-mce"
+ #define RC_MAP_IMON_PAD "rc-imon-pad"
+ #define RC_MAP_IODATA_BCTV7E "rc-iodata-bctv7e"
+@@ -125,7 +125,7 @@ void rc_map_init(void);
+ #define RC_MAP_PROTEUS_2309 "rc-proteus-2309"
+ #define RC_MAP_PURPLETV "rc-purpletv"
+ #define RC_MAP_PV951 "rc-pv951"
+-#define RC_MAP_RC5_HAUPPAUGE_NEW "rc-rc5-hauppauge-new"
++#define RC_MAP_HAUPPAUGE "rc-hauppauge"
+ #define RC_MAP_RC5_TV "rc-rc5-tv"
+ #define RC_MAP_RC6_MCE "rc-rc6-mce"
+ #define RC_MAP_REAL_AUDIO_220_32_KEYS "rc-real-audio-220-32-keys"
+diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h
+index 6e96b26..f80b537 100644
+--- a/include/media/soc_camera.h
++++ b/include/media/soc_camera.h
+@@ -30,6 +30,8 @@ struct soc_camera_device {
+ struct device *pdev; /* Platform device */
+ s32 user_width;
+ s32 user_height;
++ u32 bytesperline; /* for padding, zero if unused */
++ u32 sizeimage;
+ enum v4l2_colorspace colorspace;
+ unsigned char iface; /* Host number */
+ unsigned char devnum; /* Device number per host */
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.29-sparc-IOC_TYPECHECK.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.29-sparc-IOC_TYPECHECK.patch
new file mode 100644
index 000000000..d73c30adc
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.29-sparc-IOC_TYPECHECK.patch
@@ -0,0 +1,21 @@
+diff -up vanilla-2.6.29-rc7-git2/arch/sparc/include/asm/ioctl.h.BAD vanilla-2.6.29-rc7-git2/arch/sparc/include/asm/ioctl.h
+--- vanilla-2.6.29-rc7-git2/arch/sparc/include/asm/ioctl.h.BAD 2009-03-09 17:01:32.000000000 -0400
++++ vanilla-2.6.29-rc7-git2/arch/sparc/include/asm/ioctl.h 2009-03-09 16:52:27.000000000 -0400
+@@ -41,6 +41,17 @@
+ ((nr) << _IOC_NRSHIFT) | \
+ ((size) << _IOC_SIZESHIFT))
+
++#ifdef __KERNEL__
++/* provoke compile error for invalid uses of size argument */
++extern unsigned int __invalid_size_argument_for_IOC;
++#define _IOC_TYPECHECK(t) \
++ ((sizeof(t) == sizeof(t[1]) && \
++ sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
++ sizeof(t) : __invalid_size_argument_for_IOC)
++#else
++#define _IOC_TYPECHECK(t) (sizeof(t))
++#endif
++
+ #define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
+ #define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size))
+ #define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.30-no-pcspkr-modalias.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.30-no-pcspkr-modalias.patch
new file mode 100644
index 000000000..c703b8844
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.30-no-pcspkr-modalias.patch
@@ -0,0 +1,11 @@
+diff -up linux-2.6.30.noarch/drivers/input/misc/pcspkr.c.jx linux-2.6.30.noarch/drivers/input/misc/pcspkr.c
+--- linux-2.6.30.noarch/drivers/input/misc/pcspkr.c.jx 2009-07-28 16:54:44.000000000 -0400
++++ linux-2.6.30.noarch/drivers/input/misc/pcspkr.c 2009-07-28 16:59:36.000000000 -0400
+@@ -23,7 +23,6 @@
+ MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+ MODULE_DESCRIPTION("PC Speaker beeper driver");
+ MODULE_LICENSE("GPL");
+-MODULE_ALIAS("platform:pcspkr");
+
+ #if defined(CONFIG_MIPS) || defined(CONFIG_X86)
+ /* Use the global PIT lock ! */
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.38-libre.tar.bz2.sign b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.38-libre.tar.bz2.sign
new file mode 100644
index 000000000..53a66c705
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.38-libre.tar.bz2.sign
@@ -0,0 +1,7 @@
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v2.0.16 (GNU/Linux)
+
+iEYEABECAAYFAk1/yJYACgkQvLfPh359R6esiQCfQU+hGDR5+Y4qIn5AxNFmwrTE
+tu0An01vh9eBRhhXmFPV0w1pU787Ylmn
+=RgIS
+-----END PGP SIGNATURE-----
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.38-libre.xdelta.bz2 b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.38-libre.xdelta.bz2
new file mode 100644
index 000000000..f4f98bd00
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.38-libre.xdelta.bz2
Binary files differ
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.38-libre.xdelta.bz2.sign b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.38-libre.xdelta.bz2.sign
new file mode 100644
index 000000000..0c8c9b85b
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/linux-2.6.38-libre.xdelta.bz2.sign
@@ -0,0 +1,7 @@
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v2.0.16 (GNU/Linux)
+
+iEYEABECAAYFAk1/yKAACgkQvLfPh359R6dsogCgnVNE1Y3HR27pqObXfEF1c0zO
+UwgAn3fMhz8q3ngzvlcssV+4owyjZJqQ
+=QCZA
+-----END PGP SIGNATURE-----
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/merge.pl b/freed-ora/tags/f15/2.6.38.6-27.fc15/merge.pl
new file mode 100755
index 000000000..8c318156a
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/merge.pl
@@ -0,0 +1,66 @@
+#! /usr/bin/perl
+
+my @args=@ARGV;
+my %configvalues;
+my @configoptions;
+my $configcounter = 0;
+
+# optionally print out the architecture as the first line of our output
+my $arch = $args[2];
+if (defined $arch) {
+ print "# $arch\n";
+}
+
+# first, read the override file
+
+open (FILE,"$args[0]") || die "Could not open $args[0]";
+while (<FILE>) {
+ my $str = $_;
+ my $configname;
+
+ if (/\# ([\w]+) is not set/) {
+ $configname = $1;
+ } elsif (/([\w]+)=/) {
+ $configname = $1;
+ }
+
+ if (defined($configname) && !exists($configvalues{$configname})) {
+ $configvalues{$configname} = $str;
+ $configoptions[$configcounter] = $configname;
+ $configcounter ++;
+ }
+};
+
+# now, read and output the entire configfile, except for the overridden
+# parts... for those the new value is printed.
+
+open (FILE2,"$args[1]") || die "Could not open $args[1]";
+while (<FILE2>) {
+ my $configname;
+
+ if (/\# ([\w]+) is not set/) {
+ $configname = $1;
+ } elsif (/([\w]+)=/) {
+ $configname = $1;
+ }
+
+ if (defined($configname) && exists($configvalues{$configname})) {
+ print "$configvalues{$configname}";
+ delete($configvalues{$configname});
+ } else {
+ print "$_";
+ }
+}
+
+# now print the new values from the overridden configfile
+my $counter = 0;
+
+while ($counter < $configcounter) {
+ my $configname = $configoptions[$counter];
+ if (exists($configvalues{$configname})) {
+ print "$configvalues{$configname}";
+ }
+ $counter++;
+}
+
+1;
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/neuter_intel_microcode_load.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/neuter_intel_microcode_load.patch
new file mode 100644
index 000000000..2766e439d
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/neuter_intel_microcode_load.patch
@@ -0,0 +1,24 @@
+diff --git a/arch/x86/kernel/microcode_intel.c b/arch/x86/kernel/microcode_intel.c
+index ebd193e..c57024a 100644
+--- a/arch/x86/kernel/microcode_intel.c
++++ b/arch/x86/kernel/microcode_intel.c
+@@ -453,9 +453,18 @@ static void microcode_fini_cpu(int cpu)
+ uci->mc = NULL;
+ }
+
++/* we don't ship the broken out files...
++ * instead, we'll just fail here, and load it with microcode_ctl
++ */
++static enum ucode_state noop_request_microcode_fw(int cpu,
++ struct device *device)
++{
++ return UCODE_NFOUND;
++}
++
+ static struct microcode_ops microcode_intel_ops = {
+ .request_microcode_user = request_microcode_user,
+- .request_microcode_fw = request_microcode_fw,
++ .request_microcode_fw = noop_request_microcode_fw,
+ .collect_cpu_info = collect_cpu_info,
+ .apply_microcode = apply_microcode,
+ .microcode_fini_cpu = microcode_fini_cpu,
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/pci-enable-aspm-state-clearing-regardless-of-policy.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/pci-enable-aspm-state-clearing-regardless-of-policy.patch
new file mode 100644
index 000000000..afc977623
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/pci-enable-aspm-state-clearing-regardless-of-policy.patch
@@ -0,0 +1,29 @@
+From: Alex Williamson <alex.williamson@redhat.com>
+Date: Thu, 10 Mar 2011 18:54:16 +0000 (-0700)
+Subject: PCI: Enable ASPM state clearing regardless of policy
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fjbarnes%2Fpci-2.6.git;a=commitdiff_plain;h=1a4e6a3c049bba1574c2a80af44f0ceb5c1abf83
+
+PCI: Enable ASPM state clearing regardless of policy
+
+Commit 2f671e2d allowed us to clear ASPM state when the FADT
+tells us it isn't supported, but we don't put this into effect
+if the aspm_policy is set to POLICY_POWERSAVE. Enable the
+state to be cleared regardless of policy.
+
+Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
+Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
+---
+
+diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
+index eee09f7..3eb667b 100644
+--- a/drivers/pci/pcie/aspm.c
++++ b/drivers/pci/pcie/aspm.c
+@@ -608,7 +608,7 @@ void pcie_aspm_init_link_state(struct pci_dev *pdev)
+ * the BIOS's expectation, we'll do so once pci_enable_device() is
+ * called.
+ */
+- if (aspm_policy != POLICY_POWERSAVE) {
++ if (aspm_policy != POLICY_POWERSAVE || aspm_clear_state) {
+ pcie_config_aspm_path(link);
+ pcie_set_clkpm(link, policy_to_clkpm_state(link));
+ }
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/pci-pcie-links-may-not-get-configured-for-aspm-under-powersave-mode.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/pci-pcie-links-may-not-get-configured-for-aspm-under-powersave-mode.patch
new file mode 100644
index 000000000..0c7f592ac
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/pci-pcie-links-may-not-get-configured-for-aspm-under-powersave-mode.patch
@@ -0,0 +1,112 @@
+From: Naga Chumbalkar <nagananda.chumbalkar@hp.com>
+Date: Mon, 21 Mar 2011 03:29:08 +0000 (+0000)
+Subject: PCI: PCIe links may not get configured for ASPM under POWERSAVE mode
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=1a680b7c325882188865f05b9a88d32f75f26495
+
+PCI: PCIe links may not get configured for ASPM under POWERSAVE mode
+
+v3 -> v2: Moved ASPM enabling logic to pci_set_power_state()
+v2 -> v1: Preserved the logic in pci_raw_set_power_state()
+ : Added ASPM enabling logic after scanning Root Bridge
+ : http://marc.info/?l=linux-pci&m=130046996216391&w=2
+v1 : http://marc.info/?l=linux-pci&m=130013164703283&w=2
+
+The assumption made in commit 41cd766b065970ff6f6c89dd1cf55fa706c84a3d
+(PCI: Don't enable aspm before drivers have had a chance to veto it) that
+pci_enable_device() will result in re-configuring ASPM when aspm_policy is
+POWERSAVE is no longer valid. This is due to commit
+97c145f7c87453cec90e91238fba5fe2c1561b32 (PCI: read current power state
+at enable time) which resets dev->current_state to D0. Due to this the
+call to pcie_aspm_pm_state_change() is never made. Note the equality check
+(below) that returns early:
+./drivers/pci/pci.c: pci_raw_set_pci_power_state()
+546 /* Check if we're already there */
+547 if (dev->current_state == state)
+548 return 0;
+
+Therefore OSPM never configures the PCIe links for ASPM to turn them "on".
+
+Fix it by configuring ASPM from the pci_enable_device() code path. This
+also allows a driver such as the e1000e networking driver a chance to
+disable ASPM (L0s, L1), if need be, prior to enabling the device. A
+driver may perform this action if the device is known to mis-behave
+wrt ASPM.
+
+Signed-off-by: Naga Chumbalkar <nagananda.chumbalkar@hp.com>
+Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
+Cc: Matthew Garrett <mjg59@srcf.ucam.org>
+Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
+---
+
+diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
+index b714d78..2472e71 100644
+--- a/drivers/pci/pci.c
++++ b/drivers/pci/pci.c
+@@ -740,6 +740,12 @@ int pci_set_power_state(struct pci_dev *dev, pci_power_t state)
+
+ if (!__pci_complete_power_transition(dev, state))
+ error = 0;
++ /*
++ * When aspm_policy is "powersave" this call ensures
++ * that ASPM is configured.
++ */
++ if (!error && dev->bus->self)
++ pcie_aspm_powersave_config_link(dev->bus->self);
+
+ return error;
+ }
+diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
+index bbdb4fd..e61b82e 100644
+--- a/drivers/pci/pcie/aspm.c
++++ b/drivers/pci/pcie/aspm.c
+@@ -708,6 +708,28 @@ void pcie_aspm_pm_state_change(struct pci_dev *pdev)
+ up_read(&pci_bus_sem);
+ }
+
++void pcie_aspm_powersave_config_link(struct pci_dev *pdev)
++{
++ struct pcie_link_state *link = pdev->link_state;
++
++ if (aspm_disabled || !pci_is_pcie(pdev) || !link)
++ return;
++
++ if (aspm_policy != POLICY_POWERSAVE)
++ return;
++
++ if ((pdev->pcie_type != PCI_EXP_TYPE_ROOT_PORT) &&
++ (pdev->pcie_type != PCI_EXP_TYPE_DOWNSTREAM))
++ return;
++
++ down_read(&pci_bus_sem);
++ mutex_lock(&aspm_lock);
++ pcie_config_aspm_path(link);
++ pcie_set_clkpm(link, policy_to_clkpm_state(link));
++ mutex_unlock(&aspm_lock);
++ up_read(&pci_bus_sem);
++}
++
+ /*
+ * pci_disable_link_state - disable pci device's link state, so the link will
+ * never enter specific states
+diff --git a/include/linux/pci-aspm.h b/include/linux/pci-aspm.h
+index ce68105..67cb3ae 100644
+--- a/include/linux/pci-aspm.h
++++ b/include/linux/pci-aspm.h
+@@ -26,6 +26,7 @@
+ extern void pcie_aspm_init_link_state(struct pci_dev *pdev);
+ extern void pcie_aspm_exit_link_state(struct pci_dev *pdev);
+ extern void pcie_aspm_pm_state_change(struct pci_dev *pdev);
++extern void pcie_aspm_powersave_config_link(struct pci_dev *pdev);
+ extern void pci_disable_link_state(struct pci_dev *pdev, int state);
+ extern void pcie_clear_aspm(void);
+ extern void pcie_no_aspm(void);
+@@ -39,6 +40,9 @@ static inline void pcie_aspm_exit_link_state(struct pci_dev *pdev)
+ static inline void pcie_aspm_pm_state_change(struct pci_dev *pdev)
+ {
+ }
++static inline void pcie_aspm_powersave_config_link(struct pci_dev *pdev)
++{
++}
+ static inline void pci_disable_link_state(struct pci_dev *pdev, int state)
+ {
+ }
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/printk-do-not-mangle-valid-userspace-syslog-prefixes.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/printk-do-not-mangle-valid-userspace-syslog-prefixes.patch
new file mode 100644
index 000000000..73885ae57
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/printk-do-not-mangle-valid-userspace-syslog-prefixes.patch
@@ -0,0 +1,214 @@
+From: Kay Sievers <kay.sievers@vrfy.org>
+Date: Sun, 13 Mar 2011 02:19:51 +0000 (+0100)
+Subject: printk: do not mangle valid userspace syslog prefixes
+X-Git-Tag: v2.6.39-rc1~471^2
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=9d90c8d9cde929cbc575098e825d7c29d9f45054
+
+printk: do not mangle valid userspace syslog prefixes
+
+printk: do not mangle valid userspace syslog prefixes with /dev/kmsg
+
+Log messages passed to the kernel log by using /dev/kmsg or /dev/ttyprintk
+might contain a syslog prefix including the syslog facility value.
+
+This makes printk to recognize these headers properly, extract the real log
+level from it to use, and add the prefix as a proper prefix to the
+log buffer, instead of wrongly printing it as the log message text.
+
+Before:
+ $ echo '<14>text' > /dev/kmsg
+ $ dmesg -r
+ <4>[135159.594810] <14>text
+
+After:
+ $ echo '<14>text' > /dev/kmsg
+ $ dmesg -r
+ <14>[ 50.750654] text
+
+Cc: Lennart Poettering <lennart@poettering.net>
+Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+---
+
+diff --git a/kernel/printk.c b/kernel/printk.c
+index 2ddbdc7..5e3d042 100644
+--- a/kernel/printk.c
++++ b/kernel/printk.c
+@@ -499,6 +499,71 @@ static void _call_console_drivers(unsigned start,
+ }
+
+ /*
++ * Parse the syslog header <[0-9]*>. The decimal value represents 32bit, the
++ * lower 3 bit are the log level, the rest are the log facility. In case
++ * userspace passes usual userspace syslog messages to /dev/kmsg or
++ * /dev/ttyprintk, the log prefix might contain the facility. Printk needs
++ * to extract the correct log level for in-kernel processing, and not mangle
++ * the original value.
++ *
++ * If a prefix is found, the length of the prefix is returned. If 'level' is
++ * passed, it will be filled in with the log level without a possible facility
++ * value. If 'special' is passed, the special printk prefix chars are accepted
++ * and returned. If no valid header is found, 0 is returned and the passed
++ * variables are not touched.
++ */
++static size_t log_prefix(const char *p, unsigned int *level, char *special)
++{
++ unsigned int lev = 0;
++ char sp = '\0';
++ size_t len;
++
++ if (p[0] != '<' || !p[1])
++ return 0;
++ if (p[2] == '>') {
++ /* usual single digit level number or special char */
++ switch (p[1]) {
++ case '0' ... '7':
++ lev = p[1] - '0';
++ break;
++ case 'c': /* KERN_CONT */
++ case 'd': /* KERN_DEFAULT */
++ sp = p[1];
++ break;
++ default:
++ return 0;
++ }
++ len = 3;
++ } else {
++ /* multi digit including the level and facility number */
++ char *endp = NULL;
++
++ if (p[1] < '0' && p[1] > '9')
++ return 0;
++
++ lev = (simple_strtoul(&p[1], &endp, 10) & 7);
++ if (endp == NULL || endp[0] != '>')
++ return 0;
++ len = (endp + 1) - p;
++ }
++
++ /* do not accept special char if not asked for */
++ if (sp && !special)
++ return 0;
++
++ if (special) {
++ *special = sp;
++ /* return special char, do not touch level */
++ if (sp)
++ return len;
++ }
++
++ if (level)
++ *level = lev;
++ return len;
++}
++
++/*
+ * Call the console drivers, asking them to write out
+ * log_buf[start] to log_buf[end - 1].
+ * The console_lock must be held.
+@@ -513,13 +578,9 @@ static void call_console_drivers(unsigned start, unsigned end)
+ cur_index = start;
+ start_print = start;
+ while (cur_index != end) {
+- if (msg_level < 0 && ((end - cur_index) > 2) &&
+- LOG_BUF(cur_index + 0) == '<' &&
+- LOG_BUF(cur_index + 1) >= '0' &&
+- LOG_BUF(cur_index + 1) <= '7' &&
+- LOG_BUF(cur_index + 2) == '>') {
+- msg_level = LOG_BUF(cur_index + 1) - '0';
+- cur_index += 3;
++ if (msg_level < 0 && ((end - cur_index) > 2)) {
++ /* strip log prefix */
++ cur_index += log_prefix(&LOG_BUF(cur_index), &msg_level, NULL);
+ start_print = cur_index;
+ }
+ while (cur_index != end) {
+@@ -717,6 +778,8 @@ asmlinkage int vprintk(const char *fmt, va_list args)
+ unsigned long flags;
+ int this_cpu;
+ char *p;
++ size_t plen;
++ char special;
+
+ boot_delay_msec();
+ printk_delay();
+@@ -757,45 +820,52 @@ asmlinkage int vprintk(const char *fmt, va_list args)
+ printed_len += vscnprintf(printk_buf + printed_len,
+ sizeof(printk_buf) - printed_len, fmt, args);
+
+-
+ p = printk_buf;
+
+- /* Do we have a loglevel in the string? */
+- if (p[0] == '<') {
+- unsigned char c = p[1];
+- if (c && p[2] == '>') {
+- switch (c) {
+- case '0' ... '7': /* loglevel */
+- current_log_level = c - '0';
+- /* Fallthrough - make sure we're on a new line */
+- case 'd': /* KERN_DEFAULT */
+- if (!new_text_line) {
+- emit_log_char('\n');
+- new_text_line = 1;
+- }
+- /* Fallthrough - skip the loglevel */
+- case 'c': /* KERN_CONT */
+- p += 3;
+- break;
++ /* Read log level and handle special printk prefix */
++ plen = log_prefix(p, &current_log_level, &special);
++ if (plen) {
++ p += plen;
++
++ switch (special) {
++ case 'c': /* Strip <c> KERN_CONT, continue line */
++ plen = 0;
++ break;
++ case 'd': /* Strip <d> KERN_DEFAULT, start new line */
++ plen = 0;
++ default:
++ if (!new_text_line) {
++ emit_log_char('\n');
++ new_text_line = 1;
+ }
+ }
+ }
+
+ /*
+- * Copy the output into log_buf. If the caller didn't provide
+- * appropriate log level tags, we insert them here
++ * Copy the output into log_buf. If the caller didn't provide
++ * the appropriate log prefix, we insert them here
+ */
+- for ( ; *p; p++) {
++ for (; *p; p++) {
+ if (new_text_line) {
+- /* Always output the token */
+- emit_log_char('<');
+- emit_log_char(current_log_level + '0');
+- emit_log_char('>');
+- printed_len += 3;
+ new_text_line = 0;
+
++ if (plen) {
++ /* Copy original log prefix */
++ int i;
++
++ for (i = 0; i < plen; i++)
++ emit_log_char(printk_buf[i]);
++ printed_len += plen;
++ } else {
++ /* Add log prefix */
++ emit_log_char('<');
++ emit_log_char(current_log_level + '0');
++ emit_log_char('>');
++ printed_len += 3;
++ }
++
+ if (printk_time) {
+- /* Follow the token with the time */
++ /* Add the current time stamp */
+ char tbuf[50], *tp;
+ unsigned tlen;
+ unsigned long long t;
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/bumpspecfile.py b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/bumpspecfile.py
new file mode 100755
index 000000000..478e82871
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/bumpspecfile.py
@@ -0,0 +1,71 @@
+#!/usr/bin/python
+#
+# Needs $GIT_COMMITTER_NAME and $GIT_COMMITTER_EMAIL set.
+#
+import re
+import sys
+import time
+import os
+import string
+
+class Specfile:
+ def __init__(self,filename):
+ file=open(filename,"r")
+ self.lines=file.readlines()
+ self.vr=""
+
+ def getNextVR(self,aspec):
+ # Get VR for changelog entry.
+ (ver,rel) = os.popen("LC_ALL=C rpm --specfile -q --qf '%%{version} %%{release}\n' --define 'dist %%{nil}' %s | head -1" % aspec).read().strip().split(' ')
+ pos = 0
+ # general released kernel case, bump 1st field
+ fedora_build = rel.split('.')[pos]
+ if fedora_build == "0":
+ # this is a devel kernel, bump 2nd field
+ pos = 1
+ elif rel.split('.')[-1] != fedora_build:
+ # this is a branch, must bump 3rd field
+ pos = 2
+ fedora_build = rel.split('.')[pos]
+ if pos == 1 and len(rel.split('.')) > 4:
+ # uh... what? devel kernel in a branch? private build? just do no VR in clog...
+ print "Warning: not adding any VR to changelog, couldn't tell for sure which field to bump"
+ pos = -1
+ next_fedora_build = int(fedora_build) + 1
+ if pos == 0:
+ nextrel = str(next_fedora_build)
+ elif pos == 1:
+ nextrel = "0." + str(next_fedora_build)
+ elif pos == 2:
+ nextrel = rel.split('.')[0] + "." + rel.split('.')[1] + "." + str(next_fedora_build)
+ if pos >= 0:
+ for s in rel.split('.')[pos + 1:]:
+ nextrel = nextrel + "." + s
+ self.vr = " "+ver+'-'+nextrel
+
+ def addChangelogEntry(self,entry):
+ user = os.environ.get("GIT_COMMITTER_NAME","unknown")
+ email = os.environ.get("GIT_COMMITTER_EMAIL","unknown")
+ if (email == "unknown"):
+ email = os.environ.get("USER","unknown")+"@fedoraproject.org"
+ changematch=re.compile(r"^%changelog")
+ date=time.strftime("%a %b %d %Y", time.localtime(time.time()))
+ newchangelogentry="%changelog\n* "+date+" "+user+" <"+email+">"+self.vr+"\n"+entry+"\n\n"
+ for i in range(len(self.lines)):
+ if(changematch.match(self.lines[i])):
+ self.lines[i]=newchangelogentry
+ break
+
+ def writeFile(self,filename):
+ file=open(filename,"w")
+ file.writelines(self.lines)
+ file.close()
+
+if __name__=="__main__":
+ aspec=(sys.argv[1])
+ s=Specfile(aspec)
+ entry=(sys.argv[2])
+ s.getNextVR(aspec)
+ s.addChangelogEntry(entry)
+ s.writeFile(aspec)
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/check-TODO.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/check-TODO.sh
new file mode 100755
index 000000000..7067f0b44
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/check-TODO.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+for i in `grep ^* TODO | awk '{ print $2 }'`
+do
+ if [ ! -f $i ]; then
+ echo "$i referenced in the TODO, but isn't in CVS!"
+ fi;
+done
+
+# sometimes dead stuff lingers in cvs, even though it's not in the specfile.
+for i in *.patch
+do
+ for j in $(grep $i kernel.spec | grep Apply.*Patch | awk '{ print $2 }' | wc -l)
+ do
+ if [ "$j" = "0" ]; then
+ echo $i is in CVS, but not applied in spec file.
+ grep $i TODO | awk '{ print $2 " is also still in the TODO" }'
+ fi
+ done
+done
+
+#for i in `grep ApplyPatch kernel.spec | awk '{ print $2 }'`
+#do
+# R=$(grep $i TODO)
+# echo "$i is in CVS, but not mentioned in the TODO!"
+#done
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/combine.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/combine.sh
new file mode 100755
index 000000000..86a68d302
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/combine.sh
@@ -0,0 +1,34 @@
+#! /bin/sh
+
+# combine a set of quilt patches
+
+# $1 : base dir (source tree)
+# $2 : quilt dir (patches to apply)
+# $3 : pre-patch to apply first (optional)
+
+# e.g.:
+# combine.sh /home/user/fedora/trunk/kernel/F-11/kernel-2.6.30/vanilla-2.6.30 \
+# /home/user/git/stable-queue/queue-2.6.30 \
+# /home/user/fedora/trunk/kernel/F-11/patch-2.6.30.5.bz2
+
+if [ $# -lt 2 ] ; then
+ exit 1
+fi
+
+TD="combine_temp.d"
+
+cd $1 || exit 1
+cd ..
+[ -d $TD ] && rm -Rf $TD
+mkdir $TD || exit 1
+cd $TD
+
+cp -al ../$(basename $1) work.d
+cd work.d
+[ "$3" ] && bzcat $3 | patch -p1 -s
+ln -s $2 patches
+[ -h patches ] || exit 1
+quilt snapshot
+quilt upgrade
+quilt push -a -q
+quilt diff --snapshot >../combined.patch
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/configcommon.pl b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/configcommon.pl
new file mode 100644
index 000000000..38bbe80dc
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/configcommon.pl
@@ -0,0 +1,82 @@
+#! /usr/bin/perl
+
+my @args=@ARGV;
+my @configoptions;
+my @configvalues;
+my @common;
+my $configcounter = 0;
+
+# first, read the 1st file
+
+open (FILE,"$args[0]") || die "Could not open $args[0]";
+while (<FILE>) {
+ my $str = $_;
+ if (/\# ([\w]+) is not set/) {
+ $configoptions[$configcounter] = $1;
+ $configvalues[$configcounter] = $str;
+ $common[$configcounter] = 1;
+ $configcounter ++;
+ } else {
+ if (/([\w]+)=/) {
+ $configoptions[$configcounter] = $1;
+ $configvalues[$configcounter] = $str;
+ $common[$configcounter] = 1;
+ $configcounter ++;
+ } else {
+ $configoptions[$configcounter] = "foobarbar";
+ $configvalues[$configcounter] = $str;
+ $common[$configcounter] = 1;
+ $configcounter ++;
+ }
+ }
+};
+
+# now, read all configfiles and see of the options match the initial one.
+# if not, mark it not common
+my $cntr=1;
+
+
+while ($cntr < @ARGV) {
+ open (FILE,$args[$cntr]) || die "Could not open $args[$cntr]";
+ while (<FILE>) {
+ my $nooutput;
+ my $counter;
+ my $configname;
+
+ if (/\# ([\w]+) is not set/) {
+ $configname = $1;
+ } else {
+ if (/([\w]+)=/) {
+ $configname = $1;
+ }
+ }
+
+ $counter = 0;
+ $nooutput = 0;
+ while ($counter < $configcounter) {
+ if ("$configname" eq "$configoptions[$counter]") {
+ if ("$_" eq "$configvalues[$counter]") {
+ 1;
+ } else {
+ $common[$counter] = 0;
+ }
+ }
+ $counter++;
+ }
+ }
+
+ $cntr++;
+}
+
+# now print the common values
+my $counter = 0;
+
+while ($counter < $configcounter) {
+ if ($common[$counter]!=0) {
+ print "$configvalues[$counter]";
+ }
+ $counter++;
+}
+
+1;
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/configdiff.pl b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/configdiff.pl
new file mode 100644
index 000000000..848d8df0f
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/configdiff.pl
@@ -0,0 +1,76 @@
+#! /usr/bin/perl
+
+my @args=@ARGV;
+my @configoptions;
+my @configvalues;
+my @alreadyprinted;
+my $configcounter = 0;
+
+# first, read the override file
+
+open (FILE,"$args[0]") || die "Could not open $args[0]";
+while (<FILE>) {
+ my $str = $_;
+ if (/\# ([\w]+) is not set/) {
+ $configoptions[$configcounter] = $1;
+ $configvalues[$configcounter] = $str;
+ $alreadprinted[$configcounter] = 0;
+ $configcounter ++;
+ } else {
+ if (/([\w]+)=/) {
+ $configoptions[$configcounter] = $1;
+ $configvalues[$configcounter] = $str;
+ $alreadprinted[$configcounter] = 0;
+ $configcounter ++;
+ } else {
+ $configoptions[$configcounter] = "$_";
+ $configvalues[$configcounter] = $str;
+ $alreadprinted[$configcounter] = 0;
+ $configcounter ++;
+ }
+ }
+};
+
+# now, read and output the entire configfile, except for the overridden
+# parts... for those the new value is printed.
+# O(N^2) algorithm so if this is slow I need to look at it later
+
+open (FILE2,"$args[1]") || die "Could not open $args[1]";
+while (<FILE2>) {
+ my $nooutput;
+ my $counter;
+ my $configname="$_";
+ my $match;
+
+ if (/\# ([\w]+) is not set/) {
+ $configname = $1;
+ } else {
+ if (/([\w]+)=/) {
+ $configname = $1;
+ }
+ }
+
+ $counter = 0;
+ $nooutput = 0;
+ $match = 0;
+# print "C : $configname";
+ while ($counter < $configcounter) {
+ if ("$configname" eq "$configoptions[$counter]") {
+ if ( ("$_" eq "$configvalues[$counter]") || ("$configname" eq "") ) {
+ $match = 1;
+ } else {
+ $alreadyprinted[$configcounter] = 1;
+ print "$_";
+ $match = 1;
+ }
+ }
+ $counter++;
+ }
+ if ($match == 0) {
+ print "$_";
+ }
+
+}
+
+
+1;
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-amd64.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-amd64.sh
new file mode 100644
index 000000000..b3119d8fc
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-amd64.sh
@@ -0,0 +1,3 @@
+export PATH=$PATH:/opt/cross/bin
+make CROSS_COMPILE=x86_64-linux- ARCH=x86_64 hammer
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-i586.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-i586.sh
new file mode 100644
index 000000000..000f4ae7e
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-i586.sh
@@ -0,0 +1,3 @@
+export PATH=$PATH:/opt/cross/bin
+make ARCH=i386 i586
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-i686.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-i686.sh
new file mode 100644
index 000000000..5c0cfe137
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-i686.sh
@@ -0,0 +1,3 @@
+export PATH=$PATH:/opt/cross/bin
+make ARCH=i386 i686
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ia64.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ia64.sh
new file mode 100644
index 000000000..5699a57c1
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ia64.sh
@@ -0,0 +1,2 @@
+export PATH=$PATH:/opt/cross/bin
+make CROSS_COMPILE=ia64-linux- ARCH=ia64 ia64
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-iseries.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-iseries.sh
new file mode 100644
index 000000000..71bfd9156
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-iseries.sh
@@ -0,0 +1,3 @@
+export PATH=$PATH:/opt/cross/bin
+make CROSS_COMPILE=ppc64-linux- ARCH=ppc64 ppc64iseries
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ppc.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ppc.sh
new file mode 100644
index 000000000..c49b740f3
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ppc.sh
@@ -0,0 +1,3 @@
+export PATH=$PATH:/opt/cross/bin
+make CROSS_COMPILE=ppc-linux- ARCH=ppc ppc
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ppc64.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ppc64.sh
new file mode 100644
index 000000000..fb29d4481
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ppc64.sh
@@ -0,0 +1,3 @@
+export PATH=$PATH:/opt/cross/bin
+make CROSS_COMPILE=ppc64-linux- ARCH=ppc64 ppc64
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ppc8260.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ppc8260.sh
new file mode 100644
index 000000000..10fbc3292
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ppc8260.sh
@@ -0,0 +1,3 @@
+export PATH=$PATH:/opt/cross/bin
+make CROSS_COMPILE=ppc-linux- ARCH=ppc ppc8260
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ppc8560.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ppc8560.sh
new file mode 100644
index 000000000..405f98a9c
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-ppc8560.sh
@@ -0,0 +1,3 @@
+export PATH=$PATH:/opt/cross/bin
+make CROSS_COMPILE=ppc-linux- ARCH=ppc ppc8560
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-pseries.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-pseries.sh
new file mode 100644
index 000000000..724a8e582
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-pseries.sh
@@ -0,0 +1,3 @@
+export PATH=$PATH:/opt/cross/bin
+make CROSS_COMPILE=ppc64-linux- ARCH=ppc64 pseries64
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-s390.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-s390.sh
new file mode 100644
index 000000000..4a274397c
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-s390.sh
@@ -0,0 +1,2 @@
+export PATH=$PATH:/opt/cross/bin
+make CROSS_COMPILE=s390-linux- ARCH=s390 s390
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-s390x.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-s390x.sh
new file mode 100644
index 000000000..1cdc98a73
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/cross-s390x.sh
@@ -0,0 +1,2 @@
+export PATH=$PATH:/opt/cross/bin
+make CROSS_COMPILE=s390x-linux- ARCH=s390 s390x
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/get-snapshot.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/get-snapshot.sh
new file mode 100755
index 000000000..79d2b095e
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/get-snapshot.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+VER=$(tail -n1 upstream | sed s/bz2/id/)
+rm -f $VER
+wget -c http://www.kernel.org/pub/linux/kernel/v2.6/snapshots/$VER
+SHA1=$(cat $VER)
+rm -f patch-2.6.*-git*.id
+
+cd ~/src/git-trees/kernel/linux-2.6
+git pull
+
+DIF=$(git diff $SHA1.. | wc -l)
+if [ "$DIF" = "0" ]; then
+ echo Nothing changed.
+ exit
+fi
+TOT=$(git log | head -n1)
+
+git diff $SHA1.. > ~/src/fedora/kernel/devel/git-linus-new.diff
+cd ~/src/fedora/kernel/devel/
+DIF=$(cmp git-linus.diff git-linus-new.diff)
+if [ "$?" = "0" ]; then
+ echo Nothing new in git
+ rm -f git-linus-new.diff
+ exit
+fi
+mv git-linus-new.diff git-linus.diff
+
+perl -p -i -e 's|^#ApplyPatch\ git-linus.diff|ApplyPatch\ git-linus.diff|' kernel.spec
+
+echo "- Merge Linux-2.6 up to" $TOT > ~/src/fedora/kernel/devel/clog.tmp
+cd ~/src/fedora/kernel/devel/
+bumpspecfile.py kernel.spec "$(cat clog.tmp)"
+rm -f clog.tmp
+make clog
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/grab-logs.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/grab-logs.sh
new file mode 100755
index 000000000..8a445ec99
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/grab-logs.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+VER=$(make verrel)
+ver=$(echo $VER | sed -e 's/-/ /g' | awk '{print $2}')
+rev=$(echo $VER | sed -e 's/-/ /g' | awk '{print $3}')
+
+if [ -d logs ]; then
+ DIR=logs/
+else
+ DIR=./
+fi
+
+wget -O $DIR/build-$VER-i686.log http://kojipkgs.fedoraproject.org/packages/kernel/$ver/$rev/data/logs/i686/build.log
+wget -O $DIR/build-$VER-x86-64.log http://kojipkgs.fedoraproject.org/packages/kernel/$ver/$rev/data/logs/x86_64/build.log
+wget -O $DIR/build-$VER-noarch.log http://kojipkgs.fedoraproject.org/packages/kernel/$ver/$rev/data/logs/noarch/build.log
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/newpatch.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/newpatch.sh
new file mode 100755
index 000000000..0dc2e837c
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/newpatch.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+# Easy application of new patches.
+# Always adds to the very end. (Bumps last patch nr by 100)
+# Parameters:
+# $1 - patch filename
+# $2 - description
+
+OLD=$(grep ^Patch kernel.spec | tail -n1 | awk '{ print $1 }' | sed s/Patch// | sed s/://)
+NEW=$(($OLD/100*100+100))
+
+sed -i "/^Patch$OLD:\ /a#\ $2\nPatch$NEW:\ $1" kernel.spec
+
+LAST=$(grep ^ApplyPatch kernel.spec | tail -n1 | awk '{ print $2 }')
+
+sed -i "/^ApplyPatch $LAST/aApplyPatch $1" kernel.spec
+
+cvs add $1
+
+scripts/bumpspecfile.py kernel.spec "- $2"
+make clog
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/pull-upstreams.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/pull-upstreams.sh
new file mode 100755
index 000000000..8dc8497d8
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/pull-upstreams.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+utrace_base=2.6.37
+
+url=http://people.redhat.com/roland/utrace/${1:-$utrace_base}
+
+wget -q -O /dev/stdout $url/series | grep 'patch$' |
+while read i
+do
+ rm -f linux-2.6-$i
+ wget -nv -O linux-2.6-$i $url/$i
+done
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/rebase.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/rebase.sh
new file mode 100755
index 000000000..ac6522a4c
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/rebase.sh
@@ -0,0 +1,179 @@
+#!/bin/bash
+
+KORG26="http://ftp.kernel.org/pub/linux/kernel/v2.6"
+KORG26SNAPS="${KORG26}/snapshots"
+KORG26TESTING="${KORG26}/testing"
+
+if [ ! -f /usr/bin/curl ]; then
+ echo yum install curl
+ exit 0
+fi
+
+# Current kernel bits
+if [ `grep -c patch-2.6 sources` -ge 1 ]; then
+ export OLD=`grep patch-2.6 sources | awk '{print $2}' | tail -n1 | sed s/patch-// | sed s/\.bz2//`
+else
+ export OLD=`grep linux-2.6 sources | awk '{print $2}' | tail -n1 | sed s/linux-// | sed s/\.tar\.bz2//`
+fi
+export OLDBASE=`echo $OLD | sed s/-/\ /g | sed s/2\.6\.// | awk '{ print $1 }'`
+if [ `echo $OLD | grep -c rc` -ge 1 ]; then
+ export OLDRC=`echo $OLD | sed s/-/\ /g | sed s/rc// | awk '{ print $2 }'`
+ if [ `echo $OLD | grep -c git` -ge 1 ]; then
+ export OLDGIT=`echo $OLD | sed s/-/\ /g | sed s/git// | awk '{ print $3 }'`
+ else
+ export OLDGIT=0
+ fi
+else
+ export OLDRC=0
+ if [ `echo $OLD | grep -c git` -ge 1 ]; then
+ export OLDGIT=`echo $OLD | sed s/-/\ /g | sed s/git// | awk '{ print $2 }'`
+ else
+ export OLDGIT=0
+ fi
+fi
+
+# Is there a new snapshot or prepatch ?
+NEW=`curl -s http://www.kernel.org/kdist/finger_banner | grep "latest snapshot 2.6 version"`
+if [ -z "$NEW" ] ; then
+ NEW=`curl -s http://www.kernel.org/kdist/finger_banner | grep "latest mainline 2.6 version"`
+ if [ -z "$NEW" ] ; then
+ if [ "$OLDRC" -ne 0 ] ; then
+ NEW=`curl -s http://www.kernel.org/kdist/finger_banner | grep "latest stable 2.6." | head -n1`
+ else
+ echo "No new rc or git snapshot of stable branch".
+ exit 0
+ fi
+ fi
+fi
+export N=`echo $NEW | awk '{ print $11 }'`
+if [ -z "$N" ]; then
+ # "Stable version"
+ export NEW=`echo $NEW | awk '{ print $10 }'`
+else
+ export NEW=`echo $NEW | awk '{ print $11 }'`
+fi
+
+export NEWBASE=`echo $NEW | sed s/-/\ /g | sed s/2\.6\.// | awk '{ print $1 }'`
+if [ `echo $NEW | grep -c rc` -ge 1 ]; then
+ export NEWRC=`echo $NEW | sed s/-/\ /g | sed s/rc// | awk '{ print $2 }'`
+ if [ `echo $NEW | grep -c git` -ge 1 ]; then
+ export NEWGIT=`echo $NEW | sed s/-/\ /g | sed s/git// | awk '{ print $3 }'`
+ else
+ export NEWGIT=0
+ fi
+else
+ export NEWRC=0
+ if [ `echo $NEW | grep -c git` -ge 1 ]; then
+ export NEWGIT=`echo $NEW | sed s/-/\ /g | sed s/git// | awk '{ print $2 }'`
+ else
+ export NEWGIT=0
+ fi
+fi
+
+echo "OLD kernel was $OLD BASE=$OLDBASE RC=$OLDRC GIT=$OLDGIT"
+echo "NEW kernel is $NEW BASE=$NEWBASE RC=$NEWRC GIT=$NEWGIT"
+
+if [ "$OLDRC" -eq 0 -a "$OLDGIT" -eq 0 -a "$OLDGIT" -ne "$NEWGIT" ]; then
+ echo "Rebasing from a stable release to a new git snapshot"
+ perl -p -i -e 's/^%define\ released_kernel\ 1/\%define\ released_kernel\ 0/' kernel.spec
+ perl -p -i -e 's/^%define\ rawhide_skip_docs\ 1/\%define\ rawhide_skip_docs\ 0/' kernel.spec
+ # force these to zero in this case, they may not have been when we rebased to stable
+ perl -p -i -e 's/^%define\ rcrev.*/\%define\ rcrev\ 0/' kernel.spec
+ perl -p -i -e 's/^%define\ gitrev.*/\%define\ gitrev\ 0/' kernel.spec
+fi
+
+# make sure we build docs at least once per -rc kernel, shut it off otherwise
+if [ "$OLDRC" -ne 0 -a "$NEWRC" -gt "$OLDRC" ]; then
+ perl -p -i -e 's/^%define\ rawhide_skip_docs\ 1/\%define\ rawhide_skip_docs\ 0/' kernel.spec
+else
+ if [ "$NEWRC" -eq "$OLDRC" -a "$NEWGIT" -gt "$OLDGIT" ]; then
+ # common case, same -rc, new -git, make sure docs are off.
+ perl -p -i -e 's/^%define\ rawhide_skip_docs\ 0/\%define\ rawhide_skip_docs\ 1/' kernel.spec
+ fi
+fi
+
+if [ "$NEWRC" -eq 0 -a "$NEWGIT" -eq 0 ]; then
+ echo "Rebasing from -rc to final release."
+ perl -p -i -e 's/^%define\ released_kernel\ 0/\%define\ released_kernel\ 1/' kernel.spec
+ perl -p -i -e 's/^%define\ rawhide_skip_docs\ 1/\%define\ rawhide_skip_docs\ 0/' kernel.spec
+ export OLD_TARBALL_BASE=$(($OLDBASE-1))
+ perl -p -i -e 's/^%define\ base_sublevel\ $ENV{OLD_TARBALL_BASE}/%define\ base_sublevel\ $ENV{NEWBASE}/' kernel.spec
+ perl -p -i -e 's/^%define\ rcrev.*/\%define\ rcrev\ 0/' kernel.spec
+ perl -p -i -e 's/^%define\ gitrev.*/\%define\ gitrev\ 0/' kernel.spec
+
+ grep -v kernel-2.6.$OLD_TARBALL_BASE .gitignore >.gitignore.tmp ; mv .gitignore.tmp .gitignore
+ echo kernel-2.6.$NEWBASE >> .gitignore
+
+ for i in sources .gitignore
+ do
+ grep -v linux-2.6.$OLD_TARBALL_BASE.tar.bz2 $i > .$i.tmp; mv .$i.tmp $i
+ grep -v patch-2.6.$OLDBASE-rc$OLDRC.bz2 $i > .$i.tmp; mv .$i.tmp $i
+ grep -v patch-2.6.$OLDBASE-rc$OLDRC-git$OLDGIT.bz2 $i > .$i.tmp; mv .$i.tmp $i
+ done
+
+ rm -f linux-2.6.$OLD_TARBALL_BASE.tar.bz2
+ rm -f patch-2.6.$OLDBASE-rc$OLDRC.bz2
+ rm -f patch-2.6.$OLDBASE-rc$OLDRC-git$OLDGIT.bz2
+
+ curl -O $KORG26/linux-$NEW.tar.bz2
+ fedpkg upload linux-$NEW.tar.bz2
+
+ exit 1
+fi
+
+if [ "$OLDRC" != "$NEWRC" ]; then
+ echo "Different rc. Rebasing from $OLDRC to $NEWRC"
+ perl -p -i -e 's/^%define\ rcrev.*/\%define\ rcrev\ $ENV{"NEWRC"}/' kernel.spec
+ perl -p -i -e 's/$ENV{OLDBASE}-rc$ENV{OLDRC}.bz2/$ENV{NEWBASE}-rc$ENV{NEWRC}.bz2/' .gitignore
+ grep -v patch-2.6.$OLDBASE-rc$OLDRC.bz2 sources > .sources.tmp; mv .sources.tmp sources
+ grep -v patch-2.6.$OLDBASE-rc$OLDRC-git$OLDGIT.bz2 .gitignore >.gitignore.tmp ; mv .gitignore.tmp .gitignore
+ if [ `grep -c patch-2.6.$NEWBASE-rc$NEWRC.bz2 sources` -eq 0 ]; then
+ echo patch-2.6.$NEWBASE-rc$NEWRC.bz2 >> .gitignore
+ fi
+ rm -f patch-2.6.$OLDBASE-rc$OLDRC.bz2
+
+ curl -O $KORG26TESTING/patch-2.6.$NEWBASE-rc$NEWRC.bz2
+ fedpkg upload FILES=patch-2.6.$NEWBASE-rc$NEWRC.bz2
+
+ # Another awkward (albeit unlikely) corner case.
+ # Moving from say 26-rc3-git1 to 26-rc4-git1
+ # The above will grab the new -rc, but the below will
+ # think that the -git hasn't changed.
+ # Fudge around this, by pretending the old git was something crazy.
+ OLDGIT=99
+fi
+
+if [ "$OLDGIT" != "$NEWGIT" ]; then
+ if [ "$OLDRC" -eq 0 -a "$OLDGIT" -eq 0 ]; then
+ echo "Rebasing to pre-rc git$NEWGIT"
+ else
+ echo "Different git. Rebasing from git$OLDGIT to git$NEWGIT"
+ fi
+ perl -p -i -e 's/^%define\ gitrev.*/\%define\ gitrev\ $ENV{"NEWGIT"}/' kernel.spec
+ if [ "$OLDGIT" -ne 0 ]; then
+ if [ "$NEWGIT" -ne 0 ]; then
+ perl -p -i -e 's/$ENV{OLD}/$ENV{NEW}/' .gitignore
+ fi
+ grep -v patch-$OLD.bz2 sources > .sources.tmp; mv .sources.tmp sources
+ else
+ echo patch-$NEW.bz2 >> .gitignore
+ fi
+
+ if [ "$NEWGIT" -ne 0 ]; then
+ curl -O $KORG26SNAPS/patch-$NEW.bz2
+ fi
+ fedpkg upload patch-$NEW.bz2
+
+ if [ "$OLDGIT" -ne 0 ]; then
+ rm -f patch-$OLD.bz2
+ fi
+fi
+
+if [ "$OLDRC" != "$NEWRC" -o "$OLDGIT" != "$NEWGIT" ]; then
+ perl -p -i -e 's|^ApplyPatch\ git-linus.diff|#ApplyPatch\ git-linus.diff|' kernel.spec
+ > git-linus.diff
+ fedpkg clog
+ exit 1
+else
+ exit 0
+fi
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/reconfig.sh b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/reconfig.sh
new file mode 100755
index 000000000..d9e8fa7c3
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/reconfig.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+base_sublevel=$(grep "^%define base_sublevel" kernel.spec | head -n1 | awk '{ print $3 }')
+
+#if [ `grep -c "^%define released_kernel 1" kernel.spec` -ge 1 ]; then
+ V=$base_sublevel
+#else
+# let V=$base_sublevel+1
+#fi
+
+cd kernel-2.6.$base_sublevel/linux-2.6.$base_sublevel.noarch/
+rm -f kernel-*.config
+cp ../../kernel-2.6.$V-*.config .
+
+for i in kernel-*.config
+do
+ echo $i
+ rm -f .config
+ cp $i .config
+ Arch=`head -1 .config | cut -b 3-`
+ make ARCH=$Arch nonint_oldconfig > /dev/null || exit 1
+ echo "# $Arch" > configs/$i
+ cat .config >> configs/$i
+ echo
+done
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/rediffall.pl b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/rediffall.pl
new file mode 100644
index 000000000..29f12beb9
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/rediffall.pl
@@ -0,0 +1,64 @@
+#!/usr/bin/perl -w
+#
+# Script to rediff all patches in the spec
+# Usage: perl -w rediffall.pl < kernel-2.4.spec
+#
+# $workdir is where the new rediff'ed patches are created
+# $origdir is where the original patches and tarball are located
+#
+# Note that both $workdir and $origdir must be absolute path names.
+# Suggestion: create a /kernel symbolic link to the top of your CVS tree.
+
+my $workdir = "/dev/shm/redifftree";
+my $origdir = "/home/davej/devel";
+my $kernver = "linux-2.6.17";
+my $datestrip = "s/^\\(\\(+++\\|---\\) [^[:blank:]]\\+\\)[[:blank:]].*/\\1/";
+my $patchindex = 0;
+my @patchlist;
+
+# phase 1: create a tree
+print "Extracting pristine source..\n";
+system("mkdir -p $workdir");
+system("rm -rf $workdir/*");
+chdir("$workdir");
+system("tar -jxvf $origdir/$kernver.tar.bz2 > /dev/null");
+system("cp -al $kernver linux-$patchindex");
+
+# phase 2: read the spec from stdin and store all patches
+print "Reading specfile..\n";
+
+while (<>) {
+ my $line = $_;
+ if ($line =~ /^Patch([0-9]+)\: ([a-zA-Z0-9\-\_\.\+]+\.patch)/) {
+ $patchlist[$1] = $2;
+ } else {
+ if ($line =~ /^Patch([0-9]+)\: ([a-zA-Z0-9\-\_\.]+\.bz2)/) {
+ $patchlist[$1] = $2;
+ }
+ }
+
+ if ($line =~ /^%patch([0-9]+) -p1/) {
+ # copy the tree, apply the patch, diff and remove the old tree
+ my $oldindex = $patchindex;
+ $patchindex = $1;
+
+ print "rediffing patch number $patchindex: $patchlist[$patchindex]\n";
+
+ system("cp -al linux-$oldindex linux-$patchindex");
+ chdir("linux-$patchindex");
+ if ($patchlist[$patchindex] =~ /bz2/) {
+ system("bzcat $origdir/$patchlist[$patchindex] | patch -p1 &>/dev/null");
+ } else {
+ system("cat $origdir/$patchlist[$patchindex] | patch -p1 &>/dev/null");
+ }
+ chdir("$workdir");
+ system("rm -f `find -name \"*orig\"`");
+ if ($patchlist[$patchindex] =~ /bz2/) {
+ } else {
+ system("diff -urNp --exclude-from=/home/davej/.exclude linux-$oldindex linux-$patchindex | sed '$datestrip' > $patchlist[$patchindex]");
+ }
+ system("rm -rf linux-$oldindex");
+ }
+};
+
+1;
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/sort-config b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/sort-config
new file mode 100755
index 000000000..bc497ea0b
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scripts/sort-config
@@ -0,0 +1,222 @@
+#!/bin/bash
+
+SRC=($(ls config-* 2>/dev/null))
+TGT=($(ls kernel-*/linux-*.noarch/configs/kernel-2.6.*-*.config \
+ kernel-*/linux-*.noarch/configs/kernel-2.6.*-*-debug.config 2>/dev/null))
+TGT1=(${TGT[*]#kernel-*/linux-*.noarch/configs/kernel-2.6.*-})
+
+ALL_OPTS="cdfimn"
+if [ $# -lt 2 ] ; then
+ echo -e "Usage:\n $(basename $0) [-$ALL_OPTS] input target\n"
+ echo -e " Sort input config file into the same order as the target\n"
+ echo -e " -c: insert comments about non-matching/impossible items"
+ echo -e " -d: show raw unsorted output with extra debug text"
+ echo -e " -f: force output to match what is in the target config,"
+ echo -e " and/or remove impossible config items"
+ echo -e " -i: find impossible config items"
+ echo -e " -m: find changed config items"
+ echo -e " -n: do not sort output\n"
+ echo -e " input: source config file" ' [' "${SRC[*]#config-}" ']\n'
+ echo -e " target: output arch name" ' [' "${TGT1[*]%.config}" ']\n'
+ exit 1
+fi
+
+while getopts "$ALL_OPTS" OPTION ; do
+case $OPTION in
+c)
+ ADDCOMMENT=1 ;;
+d)
+ DEBUG=1 ;;
+f)
+ FORCE=1 ;;
+i)
+ FIND_IMPOSS=1 ;;
+m)
+ FIND_CHANGED=1 ;;
+n)
+ NOSORT=1 ;;
+\?)
+ exit 2 ;;
+esac
+done
+
+if [ "$FORCE" -a "$ADDCOMMENT" ] ; then
+ echo "-f and -c options cannot be used together"
+ exit 2
+fi
+
+shift $((OPTIND-1))
+
+TEMPFILES="xx00 xx01 xx98 xx99"
+TEMPLEFT=
+for FILE in $TEMPFILES ; do
+ [ -f "$FILE" ] && TEMPLEFT="Y"
+done
+if [ "$TEMPLEFT" ] ; then
+ echo "WARNING! Output files named xx?? already exist." >&2
+ read -p "Press <Enter> to erase files, or Ctrl-C to exit..."
+ echo >&2
+fi
+rm -f $TEMPFILES
+
+SRCFILE=config-$1
+[ ! -f $SRCFILE ] && echo "Input file" $SRCFILE "missing" && exit 2
+
+TGTFILE=kernel-*/linux-*.noarch/configs/kernel-2.6.*-$2.config
+[ ! -f $TGTFILE ] && echo "No target file matching" $TGTFILE "exists" && exit 2
+
+[ "$FIND_IMPOSS" ] && \
+ find kernel-*/*.noarch -name Kconfig\* -type f \
+ | xargs egrep -s -h '^[[:space:]]*(menu)?config[[:space:]]+' \
+ | sed -r 's/^[[:space:]]*(menu)?config[[:space:]]+/CONFIG_/' \
+ | sort | uniq >xx98
+
+extract_optname() {
+ # extract the option name from $TEXT, setting $OPTNAME
+ OPTNAME=
+ if [ "${TEXT:0:7}" = "CONFIG_" ] ; then
+ OPTNAME=${TEXT%%=*}
+ elif [ "${TEXT:0:9}" = "# CONFIG_" ] ; then
+ OPTNAME=${TEXT%" is not set"}
+ OPTNAME=${OPTNAME#\# }
+ fi
+}
+
+print_saved_comments() {
+ if [ $IX -gt 0 ] ; then
+ [ "$DEBUG" ] && echo " ->" $IX "comments were saved"
+ (( IX-- ))
+ for IX in $(seq 0 $IX) ; do
+ echo "$LINE":"${SAVECOMMENT[$IX]}"
+ done
+ unset SAVECOMMENT
+ IX=0
+ fi
+}
+
+assign_line_number() {
+ # use input line numbers if not sorting
+ [ "$NOSORT" ] && LINE=$IN
+ # make sure it has a line number
+ [ -z "$LINE" ] && LINE=999999
+}
+
+IX=0
+IN=0
+declare -a SAVECOMMENT
+
+cat ${SRCFILE} | {
+while read TEXT ; do
+
+ LINE=
+ COMMENT=
+
+ # replace empty lines
+ [ -z "$TEXT" ] && TEXT='//'
+
+ if [ "${TEXT:0:7}" = "CONFIG_" -o "${TEXT:0:9}" = "# CONFIG_" ] ; then
+
+ LINE=$(grep -n "^$TEXT" $TGTFILE | head -1 | cut -f 1 -d ':')
+ if [ -z "$LINE" ] ; then
+ [ "$DEBUG" ] && echo "nofind ->" "$TEXT"
+
+ extract_optname
+ if [ "$OPTNAME" ] ; then
+
+ if [ "$FIND_CHANGED" ] ; then
+ for FINDTEXT in "^${OPTNAME}=" "^# ${OPTNAME} is not set" ; do
+ if [ -z "$LINE" ] ; then
+ [ "$DEBUG" ] && echo "looking for ->" "$FINDTEXT"
+ LINE=$(grep -n "$FINDTEXT" $TGTFILE | head -1 | cut -f 1 -d ':')
+ if [ "$LINE" ] ; then
+ CHANGED=$(grep "$FINDTEXT" $TGTFILE | head -1)
+ if [ "$FORCE" ] ; then
+ TEXT=$CHANGED
+ [ "$DEBUG" ] && echo 'forced ->' "$TEXT"
+ else
+ if [ "$ADDCOMMENT" ] ; then
+ if [ ${CHANGED:0:1} = '#' ] ; then
+ NEWOPT="not set"
+ else
+ NEWOPT=${CHANGED#$OPTNAME}
+ fi
+ COMMENT="# -- Next option changed to \"${NEWOPT}\" at target line $LINE --"
+ fi
+ fi
+ fi
+ fi
+ done
+ fi
+
+ if [ "$FIND_IMPOSS" -a -z "$LINE" -a -z "$COMMENT" ] ; then
+ POSSIBLE=$(grep -n "^$OPTNAME" xx98)
+ if [ -z "$POSSIBLE" ] ; then
+ if [ "$ADDCOMMENT" ] ; then
+ COMMENT="# -- Next option is impossible --"
+ elif [ "$FORCE" ] ; then
+ [ "$DEBUG" ] && echo 'impossible ->' "$TEXT"
+ TEXT=""
+ fi
+ fi
+ fi
+
+ fi
+
+ fi
+
+ else
+ # not a config variable
+ COMMENT="$TEXT"
+ TEXT=
+ fi
+
+ [ "$DEBUG" -a "$COMMENT" ] && echo "comment ->" "$LINE" "$COMMENT"
+ [ "$DEBUG" -a "$TEXT" ] && echo "text ->" "$LINE" "$TEXT"
+
+ if [ "$TEXT" ] ; then
+
+ assign_line_number
+
+ # print the saved comments first
+ print_saved_comments
+ # now print the latest comment and text
+ [ "$COMMENT" ] && echo "$LINE":"$COMMENT"
+ echo "$LINE":"$TEXT"
+
+ elif [ "$COMMENT" ] ; then
+
+ # no output yet, save the comment
+ SAVECOMMENT[$IX]="$COMMENT"
+ let IX++
+ [ "$DEBUG" ] && echo 'savecomment (#'${IX}')'
+
+ fi
+
+ let IN++
+
+done
+# flush the buffers
+assign_line_number
+print_saved_comments
+[ "$DEBUG" ] && echo "$IN lines read from input"
+} >xx99
+
+if [ "$DEBUG" ] ; then
+ # just show the raw output with debug info, then exit
+ cat xx99
+else
+
+ # split output into two files, for matched and unmatched items
+ cat xx99 | sort -s -t ":" -k 1g | csplit -k -s - /^999999/ 2>/dev/null
+
+ cat xx00 | cut -f 2- -d ':' | sed 's/^\/\/$//'
+ if [ -s xx01 ] ; then
+ echo
+ echo '# ------------ UNMATCHED OPTIONS ------------'
+ echo
+ cat xx01 | cut -f 2- -d ':' | sed 's/^\/\/$//'
+ fi
+
+fi
+
+rm -f $TEMPFILES
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scsi-sd-downgrade-caching-printk-from-error-to-notice.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/scsi-sd-downgrade-caching-printk-from-error-to-notice.patch
new file mode 100644
index 000000000..47ebbaddb
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scsi-sd-downgrade-caching-printk-from-error-to-notice.patch
@@ -0,0 +1,27 @@
+diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
+index e567302..261638a 100644
+--- a/drivers/scsi/sd.c
++++ b/drivers/scsi/sd.c
+@@ -1988,11 +1988,11 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
+ }
+
+ if (modepage == 0x3F) {
+- sd_printk(KERN_ERR, sdkp, "No Caching mode page "
++ sd_printk(KERN_NOTICE, sdkp, "No Caching mode page "
+ "present\n");
+ goto defaults;
+ } else if ((buffer[offset] & 0x3f) != modepage) {
+- sd_printk(KERN_ERR, sdkp, "Got wrong page\n");
++ sd_printk(KERN_NOTICE, sdkp, "Got wrong page\n");
+ goto defaults;
+ }
+ Page_found:
+@@ -2033,7 +2033,7 @@ bad_sense:
+ sd_printk(KERN_ERR, sdkp, "Asking for cache data failed\n");
+
+ defaults:
+- sd_printk(KERN_ERR, sdkp, "Assuming drive cache: write through\n");
++ sd_printk(KERN_NOTICE, sdkp, "Assuming drive cache: write through\n");
+ sdkp->WCE = 0;
+ sdkp->RCD = 0;
+ sdkp->DPOFUA = 0;
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/scsi_dh_hp_sw-fix-deadlock-in-start_stop_endio.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/scsi_dh_hp_sw-fix-deadlock-in-start_stop_endio.patch
new file mode 100644
index 000000000..faded334b
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/scsi_dh_hp_sw-fix-deadlock-in-start_stop_endio.patch
@@ -0,0 +1,32 @@
+From 7a1e9d829f8bd821466c5ea834ad6f378740d2be Mon Sep 17 00:00:00 2001
+From: Mike Snitzer <snitzer@redhat.com>
+Date: Tue, 25 Jan 2011 11:52:17 -0500
+Subject: [SCSI] scsi_dh_hp_sw: fix deadlock in start_stop_endio
+
+The use of blk_execute_rq_nowait() implies __blk_put_request() is needed
+in start_stop_endio() rather than blk_put_request() --
+blk_finish_request() is called with queue lock already held.
+
+Signed-off-by: Mike Snitzer <snitzer@redhat.com>
+Signed-off-by: James Bottomley <James.Bottomley@suse.de>
+---
+ drivers/scsi/device_handler/scsi_dh_hp_sw.c | 3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/scsi/device_handler/scsi_dh_hp_sw.c b/drivers/scsi/device_handler/scsi_dh_hp_sw.c
+index e391664..d0363c8 100644
+--- a/drivers/scsi/device_handler/scsi_dh_hp_sw.c
++++ b/drivers/scsi/device_handler/scsi_dh_hp_sw.c
+@@ -225,7 +225,8 @@ static void start_stop_endio(struct request *req, int error)
+ }
+ }
+ done:
+- blk_put_request(req);
++ req->end_io_data = NULL;
++ __blk_put_request(req->q, req);
+ if (h->callback_fn) {
+ h->callback_fn(h->callback_data, err);
+ h->callback_fn = h->callback_data = NULL;
+--
+1.7.5.1
+
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/sources b/freed-ora/tags/f15/2.6.38.6-27.fc15/sources
new file mode 100644
index 000000000..c95314bb6
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/sources
@@ -0,0 +1,2 @@
+21911d61ac22d66e71697a3d5ae092ba linux-2.6.38-libre.tar.bz2
+527fab8162c682ad849eb21fc30d28ef patch-2.6.38.6.bz2
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/x86-dumpstack-correct-stack-dump-info-when-frame-pointer-is-available.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/x86-dumpstack-correct-stack-dump-info-when-frame-pointer-is-available.patch
new file mode 100644
index 000000000..36eae4b97
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/x86-dumpstack-correct-stack-dump-info-when-frame-pointer-is-available.patch
@@ -0,0 +1,352 @@
+From: Namhyung Kim <namhyung@gmail.com>
+Date: Fri, 18 Mar 2011 02:40:06 +0000 (+0900)
+Subject: x86, dumpstack: Correct stack dump info when frame pointer is available
+X-Git-Tag: v2.6.39-rc1~64^2~7
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=e8e999cf3cc733482e390b02ff25a64cecdc0b64
+
+x86, dumpstack: Correct stack dump info when frame pointer is available
+
+Current stack dump code scans entire stack and check each entry
+contains a pointer to kernel code. If CONFIG_FRAME_POINTER=y it
+could mark whether the pointer is valid or not based on value of
+the frame pointer. Invalid entries could be preceded by '?' sign.
+
+However this was not going to happen because scan start point
+was always higher than the frame pointer so that they could not
+meet.
+
+Commit 9c0729dc8062 ("x86: Eliminate bp argument from the stack
+tracing routines") delayed bp acquisition point, so the bp was
+read in lower frame, thus all of the entries were marked
+invalid.
+
+This patch fixes this by reverting above commit while retaining
+stack_frame() helper as suggested by Frederic Weisbecker.
+
+End result looks like below:
+
+before:
+
+ [ 3.508329] Call Trace:
+ [ 3.508551] [<ffffffff814f35c9>] ? panic+0x91/0x199
+ [ 3.508662] [<ffffffff814f3739>] ? printk+0x68/0x6a
+ [ 3.508770] [<ffffffff81a981b2>] ? mount_block_root+0x257/0x26e
+ [ 3.508876] [<ffffffff81a9821f>] ? mount_root+0x56/0x5a
+ [ 3.508975] [<ffffffff81a98393>] ? prepare_namespace+0x170/0x1a9
+ [ 3.509216] [<ffffffff81a9772b>] ? kernel_init+0x1d2/0x1e2
+ [ 3.509335] [<ffffffff81003894>] ? kernel_thread_helper+0x4/0x10
+ [ 3.509442] [<ffffffff814f6880>] ? restore_args+0x0/0x30
+ [ 3.509542] [<ffffffff81a97559>] ? kernel_init+0x0/0x1e2
+ [ 3.509641] [<ffffffff81003890>] ? kernel_thread_helper+0x0/0x10
+
+after:
+
+ [ 3.522991] Call Trace:
+ [ 3.523351] [<ffffffff814f35b9>] panic+0x91/0x199
+ [ 3.523468] [<ffffffff814f3729>] ? printk+0x68/0x6a
+ [ 3.523576] [<ffffffff81a981b2>] mount_block_root+0x257/0x26e
+ [ 3.523681] [<ffffffff81a9821f>] mount_root+0x56/0x5a
+ [ 3.523780] [<ffffffff81a98393>] prepare_namespace+0x170/0x1a9
+ [ 3.523885] [<ffffffff81a9772b>] kernel_init+0x1d2/0x1e2
+ [ 3.523987] [<ffffffff81003894>] kernel_thread_helper+0x4/0x10
+ [ 3.524228] [<ffffffff814f6880>] ? restore_args+0x0/0x30
+ [ 3.524345] [<ffffffff81a97559>] ? kernel_init+0x0/0x1e2
+ [ 3.524445] [<ffffffff81003890>] ? kernel_thread_helper+0x0/0x10
+
+ -v5:
+ * fix build breakage with oprofile
+
+ -v4:
+ * use 0 instead of regs->bp
+ * separate out printk changes
+
+ -v3:
+ * apply comment from Frederic
+ * add a couple of printk fixes
+
+Signed-off-by: Namhyung Kim <namhyung@gmail.com>
+Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
+Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
+Cc: Soren Sandmann <ssp@redhat.com>
+Cc: Paul Mackerras <paulus@samba.org>
+Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
+Cc: Robert Richter <robert.richter@amd.com>
+LKML-Reference: <1300416006-3163-1-git-send-email-namhyung@gmail.com>
+Signed-off-by: Ingo Molnar <mingo@elte.hu>
+---
+
+diff --git a/arch/x86/include/asm/kdebug.h b/arch/x86/include/asm/kdebug.h
+index 518bbbb..fe2cc6e 100644
+--- a/arch/x86/include/asm/kdebug.h
++++ b/arch/x86/include/asm/kdebug.h
+@@ -26,7 +26,7 @@ extern void die(const char *, struct pt_regs *,long);
+ extern int __must_check __die(const char *, struct pt_regs *, long);
+ extern void show_registers(struct pt_regs *regs);
+ extern void show_trace(struct task_struct *t, struct pt_regs *regs,
+- unsigned long *sp);
++ unsigned long *sp, unsigned long bp);
+ extern void __show_regs(struct pt_regs *regs, int all);
+ extern void show_regs(struct pt_regs *regs);
+ extern unsigned long oops_begin(void);
+diff --git a/arch/x86/include/asm/stacktrace.h b/arch/x86/include/asm/stacktrace.h
+index 52b5c7e..d7e89c8 100644
+--- a/arch/x86/include/asm/stacktrace.h
++++ b/arch/x86/include/asm/stacktrace.h
+@@ -47,7 +47,7 @@ struct stacktrace_ops {
+ };
+
+ void dump_trace(struct task_struct *tsk, struct pt_regs *regs,
+- unsigned long *stack,
++ unsigned long *stack, unsigned long bp,
+ const struct stacktrace_ops *ops, void *data);
+
+ #ifdef CONFIG_X86_32
+@@ -86,11 +86,11 @@ stack_frame(struct task_struct *task, struct pt_regs *regs)
+
+ extern void
+ show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
+- unsigned long *stack, char *log_lvl);
++ unsigned long *stack, unsigned long bp, char *log_lvl);
+
+ extern void
+ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
+- unsigned long *sp, char *log_lvl);
++ unsigned long *sp, unsigned long bp, char *log_lvl);
+
+ extern unsigned int code_bytes;
+
+diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c
+index 279bc9d..3061276 100644
+--- a/arch/x86/kernel/cpu/perf_event.c
++++ b/arch/x86/kernel/cpu/perf_event.c
+@@ -1792,7 +1792,7 @@ perf_callchain_kernel(struct perf_callchain_entry *entry, struct pt_regs *regs)
+
+ perf_callchain_store(entry, regs->ip);
+
+- dump_trace(NULL, regs, NULL, &backtrace_ops, entry);
++ dump_trace(NULL, regs, NULL, 0, &backtrace_ops, entry);
+ }
+
+ #ifdef CONFIG_COMPAT
+diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c
+index 220a1c1..999e279 100644
+--- a/arch/x86/kernel/dumpstack.c
++++ b/arch/x86/kernel/dumpstack.c
+@@ -175,21 +175,21 @@ static const struct stacktrace_ops print_trace_ops = {
+
+ void
+ show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
+- unsigned long *stack, char *log_lvl)
++ unsigned long *stack, unsigned long bp, char *log_lvl)
+ {
+ printk("%sCall Trace:\n", log_lvl);
+- dump_trace(task, regs, stack, &print_trace_ops, log_lvl);
++ dump_trace(task, regs, stack, bp, &print_trace_ops, log_lvl);
+ }
+
+ void show_trace(struct task_struct *task, struct pt_regs *regs,
+- unsigned long *stack)
++ unsigned long *stack, unsigned long bp)
+ {
+- show_trace_log_lvl(task, regs, stack, "");
++ show_trace_log_lvl(task, regs, stack, bp, "");
+ }
+
+ void show_stack(struct task_struct *task, unsigned long *sp)
+ {
+- show_stack_log_lvl(task, NULL, sp, "");
++ show_stack_log_lvl(task, NULL, sp, 0, "");
+ }
+
+ /*
+@@ -197,14 +197,16 @@ void show_stack(struct task_struct *task, unsigned long *sp)
+ */
+ void dump_stack(void)
+ {
++ unsigned long bp;
+ unsigned long stack;
+
++ bp = stack_frame(current, NULL);
+ printk("Pid: %d, comm: %.20s %s %s %.*s\n",
+ current->pid, current->comm, print_tainted(),
+ init_utsname()->release,
+ (int)strcspn(init_utsname()->version, " "),
+ init_utsname()->version);
+- show_trace(NULL, NULL, &stack);
++ show_trace(NULL, NULL, &stack, bp);
+ }
+ EXPORT_SYMBOL(dump_stack);
+
+diff --git a/arch/x86/kernel/dumpstack_32.c b/arch/x86/kernel/dumpstack_32.c
+index 74cc1ed..3b97a80 100644
+--- a/arch/x86/kernel/dumpstack_32.c
++++ b/arch/x86/kernel/dumpstack_32.c
+@@ -17,12 +17,11 @@
+ #include <asm/stacktrace.h>
+
+
+-void dump_trace(struct task_struct *task,
+- struct pt_regs *regs, unsigned long *stack,
++void dump_trace(struct task_struct *task, struct pt_regs *regs,
++ unsigned long *stack, unsigned long bp,
+ const struct stacktrace_ops *ops, void *data)
+ {
+ int graph = 0;
+- unsigned long bp;
+
+ if (!task)
+ task = current;
+@@ -35,7 +34,9 @@ void dump_trace(struct task_struct *task,
+ stack = (unsigned long *)task->thread.sp;
+ }
+
+- bp = stack_frame(task, regs);
++ if (!bp)
++ bp = stack_frame(task, regs);
++
+ for (;;) {
+ struct thread_info *context;
+
+@@ -55,7 +56,7 @@ EXPORT_SYMBOL(dump_trace);
+
+ void
+ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
+- unsigned long *sp, char *log_lvl)
++ unsigned long *sp, unsigned long bp, char *log_lvl)
+ {
+ unsigned long *stack;
+ int i;
+@@ -77,7 +78,7 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
+ touch_nmi_watchdog();
+ }
+ printk(KERN_CONT "\n");
+- show_trace_log_lvl(task, regs, sp, log_lvl);
++ show_trace_log_lvl(task, regs, sp, bp, log_lvl);
+ }
+
+
+@@ -102,7 +103,7 @@ void show_registers(struct pt_regs *regs)
+ u8 *ip;
+
+ printk(KERN_EMERG "Stack:\n");
+- show_stack_log_lvl(NULL, regs, &regs->sp, KERN_EMERG);
++ show_stack_log_lvl(NULL, regs, &regs->sp, 0, KERN_EMERG);
+
+ printk(KERN_EMERG "Code: ");
+
+diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c
+index a6b6fcf..e71c98d 100644
+--- a/arch/x86/kernel/dumpstack_64.c
++++ b/arch/x86/kernel/dumpstack_64.c
+@@ -139,8 +139,8 @@ fixup_bp_irq_link(unsigned long bp, unsigned long *stack,
+ * severe exception (double fault, nmi, stack fault, debug, mce) hardware stack
+ */
+
+-void dump_trace(struct task_struct *task,
+- struct pt_regs *regs, unsigned long *stack,
++void dump_trace(struct task_struct *task, struct pt_regs *regs,
++ unsigned long *stack, unsigned long bp,
+ const struct stacktrace_ops *ops, void *data)
+ {
+ const unsigned cpu = get_cpu();
+@@ -150,7 +150,6 @@ void dump_trace(struct task_struct *task,
+ struct thread_info *tinfo;
+ int graph = 0;
+ unsigned long dummy;
+- unsigned long bp;
+
+ if (!task)
+ task = current;
+@@ -161,7 +160,8 @@ void dump_trace(struct task_struct *task,
+ stack = (unsigned long *)task->thread.sp;
+ }
+
+- bp = stack_frame(task, regs);
++ if (!bp)
++ bp = stack_frame(task, regs);
+ /*
+ * Print function call entries in all stacks, starting at the
+ * current stack address. If the stacks consist of nested
+@@ -225,7 +225,7 @@ EXPORT_SYMBOL(dump_trace);
+
+ void
+ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
+- unsigned long *sp, char *log_lvl)
++ unsigned long *sp, unsigned long bp, char *log_lvl)
+ {
+ unsigned long *irq_stack_end;
+ unsigned long *irq_stack;
+@@ -269,7 +269,7 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
+ preempt_enable();
+
+ printk(KERN_CONT "\n");
+- show_trace_log_lvl(task, regs, sp, log_lvl);
++ show_trace_log_lvl(task, regs, sp, bp, log_lvl);
+ }
+
+ void show_registers(struct pt_regs *regs)
+@@ -298,7 +298,7 @@ void show_registers(struct pt_regs *regs)
+
+ printk(KERN_EMERG "Stack:\n");
+ show_stack_log_lvl(NULL, regs, (unsigned long *)sp,
+- KERN_EMERG);
++ 0, KERN_EMERG);
+
+ printk(KERN_EMERG "Code: ");
+
+diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
+index 99fa3ad..d46cbe4 100644
+--- a/arch/x86/kernel/process.c
++++ b/arch/x86/kernel/process.c
+@@ -87,7 +87,7 @@ void exit_thread(void)
+ void show_regs(struct pt_regs *regs)
+ {
+ show_registers(regs);
+- show_trace(NULL, regs, (unsigned long *)kernel_stack_pointer(regs));
++ show_trace(NULL, regs, (unsigned long *)kernel_stack_pointer(regs), 0);
+ }
+
+ void show_regs_common(void)
+diff --git a/arch/x86/kernel/stacktrace.c b/arch/x86/kernel/stacktrace.c
+index 938c8e1..6515733 100644
+--- a/arch/x86/kernel/stacktrace.c
++++ b/arch/x86/kernel/stacktrace.c
+@@ -73,7 +73,7 @@ static const struct stacktrace_ops save_stack_ops_nosched = {
+ */
+ void save_stack_trace(struct stack_trace *trace)
+ {
+- dump_trace(current, NULL, NULL, &save_stack_ops, trace);
++ dump_trace(current, NULL, NULL, 0, &save_stack_ops, trace);
+ if (trace->nr_entries < trace->max_entries)
+ trace->entries[trace->nr_entries++] = ULONG_MAX;
+ }
+@@ -81,14 +81,14 @@ EXPORT_SYMBOL_GPL(save_stack_trace);
+
+ void save_stack_trace_regs(struct stack_trace *trace, struct pt_regs *regs)
+ {
+- dump_trace(current, regs, NULL, &save_stack_ops, trace);
++ dump_trace(current, regs, NULL, 0, &save_stack_ops, trace);
+ if (trace->nr_entries < trace->max_entries)
+ trace->entries[trace->nr_entries++] = ULONG_MAX;
+ }
+
+ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
+ {
+- dump_trace(tsk, NULL, NULL, &save_stack_ops_nosched, trace);
++ dump_trace(tsk, NULL, NULL, 0, &save_stack_ops_nosched, trace);
+ if (trace->nr_entries < trace->max_entries)
+ trace->entries[trace->nr_entries++] = ULONG_MAX;
+ }
+diff --git a/arch/x86/oprofile/backtrace.c b/arch/x86/oprofile/backtrace.c
+index 72cbec1..2d49d4e 100644
+--- a/arch/x86/oprofile/backtrace.c
++++ b/arch/x86/oprofile/backtrace.c
+@@ -126,7 +126,7 @@ x86_backtrace(struct pt_regs * const regs, unsigned int depth)
+ if (!user_mode_vm(regs)) {
+ unsigned long stack = kernel_stack_pointer(regs);
+ if (depth)
+- dump_trace(NULL, regs, (unsigned long *)stack,
++ dump_trace(NULL, regs, (unsigned long *)stack, 0,
+ &backtrace_ops, &depth);
+ return;
+ }
diff --git a/freed-ora/tags/f15/2.6.38.6-27.fc15/x86-pci-preserve-existing-pci-bfsort-whitelist-for-dell-systems.patch b/freed-ora/tags/f15/2.6.38.6-27.fc15/x86-pci-preserve-existing-pci-bfsort-whitelist-for-dell-systems.patch
new file mode 100644
index 000000000..9cedbadf9
--- /dev/null
+++ b/freed-ora/tags/f15/2.6.38.6-27.fc15/x86-pci-preserve-existing-pci-bfsort-whitelist-for-dell-systems.patch
@@ -0,0 +1,55 @@
+From: Narendra K <narendra_k@dell.com>
+Subject: [PATCH] x86/PCI: Preserve existing pci=bfsort whitelist for Dell systems.
+
+Commit 6e8af08dfa40b747002207d3ce8e8b43a050d99f enables pci=bfsort on
+future Dell systems. But the identification string 'Dell System' matches
+on already existing whitelist, which do not have SMBIOS type 0xB1,
+causing pci=bfsort not being set on existing whitelist.
+
+This patch fixes the regression by moving the type 0xB1 check beyond the
+existing whitelist so that existing whitelist is walked before.
+
+Signed-off-by: Shyam Iyer <shyam_iyer@dell.com>
+Signed-off-by: Narendra K <narendra_k@dell.com>
+---
+RHBZ #702740
+http://marc.info/?l=linux-pci&m=130046899115205&q=raw
+
+ arch/x86/pci/common.c | 14 +++++++-------
+ 1 files changed, 7 insertions(+), 7 deletions(-)
+
+diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
+index 5fe7502..92df322 100644
+--- a/arch/x86/pci/common.c
++++ b/arch/x86/pci/common.c
+@@ -247,13 +247,6 @@ static const struct dmi_system_id __devinitconst pciprobe_dmi_table[] = {
+ },
+ #endif /* __i386__ */
+ {
+- .callback = find_sort_method,
+- .ident = "Dell System",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"),
+- },
+- },
+- {
+ .callback = set_bf_sort,
+ .ident = "Dell PowerEdge 1950",
+ .matches = {
+@@ -294,6 +287,13 @@ static const struct dmi_system_id __devinitconst pciprobe_dmi_table[] = {
+ },
+ },
+ {
++ .callback = find_sort_method,
++ .ident = "Dell System",
++ .matches = {
++ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"),
++ },
++ },
++ {
+ .callback = set_bf_sort,
+ .ident = "HP ProLiant BL20p G3",
+ .matches = {
+--
+1.7.3.1
+
OpenPOWER on IntegriCloud