From c0d2e7b197a3c511eb1bf60b61ee6fdc673e36f4 Mon Sep 17 00:00:00 2001 From: Mathieu Lirzin Date: Tue, 24 May 2016 13:06:21 +0200 Subject: build: Use "%D%" in Makefile fragments. * doc/local.mk: Use "%D%" for the directory of the fragment relative to the base 'Makefile.am'. * emacs/local.mk: Likewise. * gnu/local.mk: Likewise. * nix/local.mk: Likewise. --- gnu/local.mk | 1586 +++++++++++++++++++++++++++++----------------------------- 1 file changed, 793 insertions(+), 793 deletions(-) (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index c13090196e..99e43e1ed8 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -26,824 +26,824 @@ GNU_SYSTEM_MODULES = \ gnu.scm \ - gnu/artwork.scm \ - gnu/packages.scm \ - gnu/packages/abduco.scm \ - gnu/packages/abiword.scm \ - gnu/packages/acct.scm \ - gnu/packages/acl.scm \ - gnu/packages/admin.scm \ - gnu/packages/adns.scm \ - gnu/packages/algebra.scm \ - gnu/packages/aidc.scm \ - gnu/packages/animation.scm \ - gnu/packages/anthy.scm \ - gnu/packages/apl.scm \ - gnu/packages/apr.scm \ - gnu/packages/aspell.scm \ - gnu/packages/attr.scm \ - gnu/packages/audacity.scm \ - gnu/packages/audio.scm \ - gnu/packages/augeas.scm \ - gnu/packages/autogen.scm \ - gnu/packages/autotools.scm \ - gnu/packages/avahi.scm \ - gnu/packages/avr.scm \ - gnu/packages/backup.scm \ - gnu/packages/base.scm \ - gnu/packages/bash.scm \ - gnu/packages/bdw-gc.scm \ - gnu/packages/bioinformatics.scm \ - gnu/packages/bittorrent.scm \ - gnu/packages/bison.scm \ - gnu/packages/boost.scm \ - gnu/packages/bootstrap.scm \ - gnu/packages/busybox.scm \ - gnu/packages/c.scm \ - gnu/packages/calcurse.scm \ - gnu/packages/ccache.scm \ - gnu/packages/cdrom.scm \ - gnu/packages/certs.scm \ - gnu/packages/check.scm \ - gnu/packages/ci.scm \ - gnu/packages/cmake.scm \ - gnu/packages/code.scm \ - gnu/packages/commencement.scm \ - gnu/packages/compression.scm \ - gnu/packages/conkeror.scm \ - gnu/packages/conky.scm \ - gnu/packages/connman.scm \ - gnu/packages/cook.scm \ - gnu/packages/cpio.scm \ - gnu/packages/cppi.scm \ - gnu/packages/cross-base.scm \ - gnu/packages/crypto.scm \ - gnu/packages/cryptsetup.scm \ - gnu/packages/cups.scm \ - gnu/packages/curl.scm \ - gnu/packages/cyrus-sasl.scm \ - gnu/packages/databases.scm \ - gnu/packages/datamash.scm \ - gnu/packages/datastructures.scm \ - gnu/packages/dav.scm \ - gnu/packages/dc.scm \ - gnu/packages/debug.scm \ - gnu/packages/dejagnu.scm \ - gnu/packages/dico.scm \ - gnu/packages/dictionaries.scm \ - gnu/packages/dillo.scm \ - gnu/packages/disk.scm \ - gnu/packages/djvu.scm \ - gnu/packages/dns.scm \ - gnu/packages/docbook.scm \ - gnu/packages/docker.scm \ - gnu/packages/documentation.scm \ - gnu/packages/dunst.scm \ - gnu/packages/dvtm.scm \ - gnu/packages/ebook.scm \ - gnu/packages/ed.scm \ - gnu/packages/elf.scm \ - gnu/packages/emacs.scm \ - gnu/packages/enchant.scm \ - gnu/packages/engineering.scm \ - gnu/packages/enlightenment.scm \ - gnu/packages/entr.scm \ - gnu/packages/fcitx.scm \ - gnu/packages/feh.scm \ - gnu/packages/figlet.scm \ - gnu/packages/file.scm \ - gnu/packages/finance.scm \ - gnu/packages/firmware.scm \ - gnu/packages/fish.scm \ - gnu/packages/flashing-tools.scm \ - gnu/packages/flex.scm \ - gnu/packages/fltk.scm \ - gnu/packages/fonts.scm \ - gnu/packages/fontutils.scm \ - gnu/packages/freedesktop.scm \ - gnu/packages/freeipmi.scm \ - gnu/packages/ftp.scm \ - gnu/packages/fribidi.scm \ - gnu/packages/fvwm.scm \ - gnu/packages/game-development.scm \ - gnu/packages/games.scm \ - gnu/packages/gawk.scm \ - gnu/packages/gcal.scm \ - gnu/packages/gcc.scm \ - gnu/packages/gd.scm \ - gnu/packages/gdb.scm \ - gnu/packages/geeqie.scm \ - gnu/packages/gettext.scm \ - gnu/packages/ghostscript.scm \ - gnu/packages/gimp.scm \ - gnu/packages/gkrellm.scm \ - gnu/packages/gl.scm \ - gnu/packages/glib.scm \ - gnu/packages/gnome.scm \ - gnu/packages/gnu-doc.scm \ - gnu/packages/gnucash.scm \ - gnu/packages/gnunet.scm \ - gnu/packages/gnupg.scm \ - gnu/packages/gnustep.scm \ - gnu/packages/gnuzilla.scm \ - gnu/packages/gnu-pw-mgr.scm \ - gnu/packages/gperf.scm \ - gnu/packages/gprolog.scm \ - gnu/packages/gps.scm \ - gnu/packages/graphics.scm \ - gnu/packages/graphviz.scm \ - gnu/packages/groff.scm \ - gnu/packages/grub.scm \ - gnu/packages/grue-hunter.scm \ - gnu/packages/gsasl.scm \ - gnu/packages/gstreamer.scm \ - gnu/packages/gtk.scm \ - gnu/packages/guile.scm \ - gnu/packages/guile-wm.scm \ - gnu/packages/gv.scm \ - gnu/packages/gxmessage.scm \ - gnu/packages/haskell.scm \ - gnu/packages/hugs.scm \ - gnu/packages/hurd.scm \ - gnu/packages/ibus.scm \ - gnu/packages/icu4c.scm \ - gnu/packages/idutils.scm \ - gnu/packages/image.scm \ - gnu/packages/imagemagick.scm \ - gnu/packages/indent.scm \ - gnu/packages/inklingreader.scm \ - gnu/packages/inkscape.scm \ - gnu/packages/irc.scm \ - gnu/packages/iso-codes.scm \ - gnu/packages/java.scm \ - gnu/packages/jemalloc.scm \ - gnu/packages/jrnl.scm \ - gnu/packages/julia.scm \ - gnu/packages/kde.scm \ - gnu/packages/kde-frameworks.scm \ - gnu/packages/key-mon.scm \ - gnu/packages/kodi.scm \ - gnu/packages/language.scm \ - gnu/packages/ldc.scm \ - gnu/packages/lego.scm \ - gnu/packages/less.scm \ - gnu/packages/lesstif.scm \ - gnu/packages/libbsd.scm \ - gnu/packages/libcanberra.scm \ - gnu/packages/libdaemon.scm \ - gnu/packages/libedit.scm \ - gnu/packages/libevent.scm \ - gnu/packages/libffcall.scm \ - gnu/packages/libffi.scm \ - gnu/packages/libftdi.scm \ - gnu/packages/calendar.scm \ - gnu/packages/libidn.scm \ - gnu/packages/libphidget.scm \ - gnu/packages/libreoffice.scm \ - gnu/packages/libsigsegv.scm \ - gnu/packages/libunistring.scm \ - gnu/packages/libusb.scm \ - gnu/packages/libunwind.scm \ - gnu/packages/libupnp.scm \ - gnu/packages/lightning.scm \ - gnu/packages/links.scm \ - gnu/packages/linux.scm \ - gnu/packages/lirc.scm \ - gnu/packages/lisp.scm \ - gnu/packages/llvm.scm \ - gnu/packages/lout.scm \ - gnu/packages/lsh.scm \ - gnu/packages/lsof.scm \ - gnu/packages/lua.scm \ - gnu/packages/lxde.scm \ - gnu/packages/lxqt.scm \ - gnu/packages/lynx.scm \ - gnu/packages/m4.scm \ - gnu/packages/machine-learning.scm \ - gnu/packages/man.scm \ - gnu/packages/mail.scm \ - gnu/packages/make-bootstrap.scm \ - gnu/packages/markdown.scm \ - gnu/packages/marst.scm \ - gnu/packages/mate.scm \ - gnu/packages/maths.scm \ - gnu/packages/mc.scm \ - gnu/packages/mcrypt.scm \ - gnu/packages/messaging.scm \ - gnu/packages/mg.scm \ - gnu/packages/mit-krb5.scm \ - gnu/packages/moe.scm \ - gnu/packages/moreutils.scm \ - gnu/packages/mpd.scm \ - gnu/packages/mp3.scm \ - gnu/packages/mpi.scm \ - gnu/packages/multiprecision.scm \ - gnu/packages/music.scm \ - gnu/packages/mtools.scm \ - gnu/packages/nano.scm \ - gnu/packages/ncdu.scm \ - gnu/packages/ncurses.scm \ - gnu/packages/netpbm.scm \ - gnu/packages/nettle.scm \ - gnu/packages/networking.scm \ - gnu/packages/ninja.scm \ - gnu/packages/node.scm \ - gnu/packages/noweb.scm \ - gnu/packages/ntp.scm \ - gnu/packages/nutrition.scm \ - gnu/packages/nvi.scm \ - gnu/packages/ocaml.scm \ - gnu/packages/ocr.scm \ - gnu/packages/onc-rpc.scm \ - gnu/packages/openbox.scm \ - gnu/packages/openldap.scm \ - gnu/packages/openstack.scm \ - gnu/packages/orpheus.scm \ - gnu/packages/ots.scm \ - gnu/packages/owncloud.scm \ - gnu/packages/package-management.scm \ - gnu/packages/parallel.scm \ - gnu/packages/password-utils.scm \ - gnu/packages/patchutils.scm \ - gnu/packages/pciutils.scm \ - gnu/packages/pcre.scm \ - gnu/packages/pdf.scm \ - gnu/packages/pem.scm \ - gnu/packages/perl.scm \ - gnu/packages/photo.scm \ - gnu/packages/pkg-config.scm \ - gnu/packages/plotutils.scm \ - gnu/packages/polkit.scm \ - gnu/packages/popt.scm \ - gnu/packages/pth.scm \ - gnu/packages/pulseaudio.scm \ - gnu/packages/pumpio.scm \ - gnu/packages/pretty-print.scm \ - gnu/packages/protobuf.scm \ - gnu/packages/pv.scm \ - gnu/packages/python.scm \ - gnu/packages/qemu.scm \ - gnu/packages/qt.scm \ - gnu/packages/ragel.scm \ - gnu/packages/ratpoison.scm \ - gnu/packages/rc.scm \ - gnu/packages/rdesktop.scm \ - gnu/packages/rdf.scm \ - gnu/packages/readline.scm \ - gnu/packages/rrdtool.scm \ - gnu/packages/rsync.scm \ - gnu/packages/ruby.scm \ - gnu/packages/rush.scm \ - gnu/packages/samba.scm \ - gnu/packages/sawfish.scm \ - gnu/packages/scanner.scm \ - gnu/packages/scheme.scm \ - gnu/packages/screen.scm \ - gnu/packages/scribus.scm \ - gnu/packages/sdl.scm \ - gnu/packages/search.scm \ - gnu/packages/serialization.scm \ - gnu/packages/serveez.scm \ - gnu/packages/shellutils.scm \ - gnu/packages/shishi.scm \ - gnu/packages/skarnet.scm \ - gnu/packages/skribilo.scm \ - gnu/packages/slang.scm \ - gnu/packages/slim.scm \ - gnu/packages/smalltalk.scm \ - gnu/packages/ssh.scm \ - gnu/packages/stalonetray.scm \ - gnu/packages/statistics.scm \ - gnu/packages/suckless.scm \ - gnu/packages/swig.scm \ - gnu/packages/sxiv.scm \ - gnu/packages/synergy.scm \ - gnu/packages/task-management.scm \ - gnu/packages/tbb.scm \ - gnu/packages/tcl.scm \ - gnu/packages/tcsh.scm \ - gnu/packages/telephony.scm \ - gnu/packages/terminals.scm \ - gnu/packages/texinfo.scm \ - gnu/packages/texlive.scm \ - gnu/packages/textutils.scm \ - gnu/packages/time.scm \ - gnu/packages/tls.scm \ - gnu/packages/tmux.scm \ - gnu/packages/tor.scm \ - gnu/packages/tre.scm \ - gnu/packages/tv.scm \ - gnu/packages/unrtf.scm \ - gnu/packages/upnp.scm \ - gnu/packages/uucp.scm \ - gnu/packages/valgrind.scm \ - gnu/packages/version-control.scm \ - gnu/packages/video.scm \ - gnu/packages/vim.scm \ - gnu/packages/vpn.scm \ - gnu/packages/vtk.scm \ - gnu/packages/w3m.scm \ - gnu/packages/wdiff.scm \ - gnu/packages/web.scm \ - gnu/packages/webkit.scm \ - gnu/packages/wget.scm \ - gnu/packages/wicd.scm \ - gnu/packages/wine.scm \ - gnu/packages/wm.scm \ - gnu/packages/wordnet.scm \ - gnu/packages/wv.scm \ - gnu/packages/wxwidgets.scm \ - gnu/packages/xfig.scm \ - gnu/packages/xiph.scm \ - gnu/packages/xml.scm \ - gnu/packages/xnee.scm \ - gnu/packages/xdisorg.scm \ - gnu/packages/xorg.scm \ - gnu/packages/xfce.scm \ - gnu/packages/yasm.scm \ - gnu/packages/yubico.scm \ - gnu/packages/zile.scm \ - gnu/packages/zip.scm \ - gnu/packages/zsh.scm \ + %D%/artwork.scm \ + %D%/packages.scm \ + %D%/packages/abduco.scm \ + %D%/packages/abiword.scm \ + %D%/packages/acct.scm \ + %D%/packages/acl.scm \ + %D%/packages/admin.scm \ + %D%/packages/adns.scm \ + %D%/packages/algebra.scm \ + %D%/packages/aidc.scm \ + %D%/packages/animation.scm \ + %D%/packages/anthy.scm \ + %D%/packages/apl.scm \ + %D%/packages/apr.scm \ + %D%/packages/aspell.scm \ + %D%/packages/attr.scm \ + %D%/packages/audacity.scm \ + %D%/packages/audio.scm \ + %D%/packages/augeas.scm \ + %D%/packages/autogen.scm \ + %D%/packages/autotools.scm \ + %D%/packages/avahi.scm \ + %D%/packages/avr.scm \ + %D%/packages/backup.scm \ + %D%/packages/base.scm \ + %D%/packages/bash.scm \ + %D%/packages/bdw-gc.scm \ + %D%/packages/bioinformatics.scm \ + %D%/packages/bittorrent.scm \ + %D%/packages/bison.scm \ + %D%/packages/boost.scm \ + %D%/packages/bootstrap.scm \ + %D%/packages/busybox.scm \ + %D%/packages/c.scm \ + %D%/packages/calcurse.scm \ + %D%/packages/ccache.scm \ + %D%/packages/cdrom.scm \ + %D%/packages/certs.scm \ + %D%/packages/check.scm \ + %D%/packages/ci.scm \ + %D%/packages/cmake.scm \ + %D%/packages/code.scm \ + %D%/packages/commencement.scm \ + %D%/packages/compression.scm \ + %D%/packages/conkeror.scm \ + %D%/packages/conky.scm \ + %D%/packages/connman.scm \ + %D%/packages/cook.scm \ + %D%/packages/cpio.scm \ + %D%/packages/cppi.scm \ + %D%/packages/cross-base.scm \ + %D%/packages/crypto.scm \ + %D%/packages/cryptsetup.scm \ + %D%/packages/cups.scm \ + %D%/packages/curl.scm \ + %D%/packages/cyrus-sasl.scm \ + %D%/packages/databases.scm \ + %D%/packages/datamash.scm \ + %D%/packages/datastructures.scm \ + %D%/packages/dav.scm \ + %D%/packages/dc.scm \ + %D%/packages/debug.scm \ + %D%/packages/dejagnu.scm \ + %D%/packages/dico.scm \ + %D%/packages/dictionaries.scm \ + %D%/packages/dillo.scm \ + %D%/packages/disk.scm \ + %D%/packages/djvu.scm \ + %D%/packages/dns.scm \ + %D%/packages/docbook.scm \ + %D%/packages/docker.scm \ + %D%/packages/documentation.scm \ + %D%/packages/dunst.scm \ + %D%/packages/dvtm.scm \ + %D%/packages/ebook.scm \ + %D%/packages/ed.scm \ + %D%/packages/elf.scm \ + %D%/packages/emacs.scm \ + %D%/packages/enchant.scm \ + %D%/packages/engineering.scm \ + %D%/packages/enlightenment.scm \ + %D%/packages/entr.scm \ + %D%/packages/fcitx.scm \ + %D%/packages/feh.scm \ + %D%/packages/figlet.scm \ + %D%/packages/file.scm \ + %D%/packages/finance.scm \ + %D%/packages/firmware.scm \ + %D%/packages/fish.scm \ + %D%/packages/flashing-tools.scm \ + %D%/packages/flex.scm \ + %D%/packages/fltk.scm \ + %D%/packages/fonts.scm \ + %D%/packages/fontutils.scm \ + %D%/packages/freedesktop.scm \ + %D%/packages/freeipmi.scm \ + %D%/packages/ftp.scm \ + %D%/packages/fribidi.scm \ + %D%/packages/fvwm.scm \ + %D%/packages/game-development.scm \ + %D%/packages/games.scm \ + %D%/packages/gawk.scm \ + %D%/packages/gcal.scm \ + %D%/packages/gcc.scm \ + %D%/packages/gd.scm \ + %D%/packages/gdb.scm \ + %D%/packages/geeqie.scm \ + %D%/packages/gettext.scm \ + %D%/packages/ghostscript.scm \ + %D%/packages/gimp.scm \ + %D%/packages/gkrellm.scm \ + %D%/packages/gl.scm \ + %D%/packages/glib.scm \ + %D%/packages/gnome.scm \ + %D%/packages/gnu-doc.scm \ + %D%/packages/gnucash.scm \ + %D%/packages/gnunet.scm \ + %D%/packages/gnupg.scm \ + %D%/packages/gnustep.scm \ + %D%/packages/gnuzilla.scm \ + %D%/packages/gnu-pw-mgr.scm \ + %D%/packages/gperf.scm \ + %D%/packages/gprolog.scm \ + %D%/packages/gps.scm \ + %D%/packages/graphics.scm \ + %D%/packages/graphviz.scm \ + %D%/packages/groff.scm \ + %D%/packages/grub.scm \ + %D%/packages/grue-hunter.scm \ + %D%/packages/gsasl.scm \ + %D%/packages/gstreamer.scm \ + %D%/packages/gtk.scm \ + %D%/packages/guile.scm \ + %D%/packages/guile-wm.scm \ + %D%/packages/gv.scm \ + %D%/packages/gxmessage.scm \ + %D%/packages/haskell.scm \ + %D%/packages/hugs.scm \ + %D%/packages/hurd.scm \ + %D%/packages/ibus.scm \ + %D%/packages/icu4c.scm \ + %D%/packages/idutils.scm \ + %D%/packages/image.scm \ + %D%/packages/imagemagick.scm \ + %D%/packages/indent.scm \ + %D%/packages/inklingreader.scm \ + %D%/packages/inkscape.scm \ + %D%/packages/irc.scm \ + %D%/packages/iso-codes.scm \ + %D%/packages/java.scm \ + %D%/packages/jemalloc.scm \ + %D%/packages/jrnl.scm \ + %D%/packages/julia.scm \ + %D%/packages/kde.scm \ + %D%/packages/kde-frameworks.scm \ + %D%/packages/key-mon.scm \ + %D%/packages/kodi.scm \ + %D%/packages/language.scm \ + %D%/packages/ldc.scm \ + %D%/packages/lego.scm \ + %D%/packages/less.scm \ + %D%/packages/lesstif.scm \ + %D%/packages/libbsd.scm \ + %D%/packages/libcanberra.scm \ + %D%/packages/libdaemon.scm \ + %D%/packages/libedit.scm \ + %D%/packages/libevent.scm \ + %D%/packages/libffcall.scm \ + %D%/packages/libffi.scm \ + %D%/packages/libftdi.scm \ + %D%/packages/calendar.scm \ + %D%/packages/libidn.scm \ + %D%/packages/libphidget.scm \ + %D%/packages/libreoffice.scm \ + %D%/packages/libsigsegv.scm \ + %D%/packages/libunistring.scm \ + %D%/packages/libusb.scm \ + %D%/packages/libunwind.scm \ + %D%/packages/libupnp.scm \ + %D%/packages/lightning.scm \ + %D%/packages/links.scm \ + %D%/packages/linux.scm \ + %D%/packages/lirc.scm \ + %D%/packages/lisp.scm \ + %D%/packages/llvm.scm \ + %D%/packages/lout.scm \ + %D%/packages/lsh.scm \ + %D%/packages/lsof.scm \ + %D%/packages/lua.scm \ + %D%/packages/lxde.scm \ + %D%/packages/lxqt.scm \ + %D%/packages/lynx.scm \ + %D%/packages/m4.scm \ + %D%/packages/machine-learning.scm \ + %D%/packages/man.scm \ + %D%/packages/mail.scm \ + %D%/packages/make-bootstrap.scm \ + %D%/packages/markdown.scm \ + %D%/packages/marst.scm \ + %D%/packages/mate.scm \ + %D%/packages/maths.scm \ + %D%/packages/mc.scm \ + %D%/packages/mcrypt.scm \ + %D%/packages/messaging.scm \ + %D%/packages/mg.scm \ + %D%/packages/mit-krb5.scm \ + %D%/packages/moe.scm \ + %D%/packages/moreutils.scm \ + %D%/packages/mpd.scm \ + %D%/packages/mp3.scm \ + %D%/packages/mpi.scm \ + %D%/packages/multiprecision.scm \ + %D%/packages/music.scm \ + %D%/packages/mtools.scm \ + %D%/packages/nano.scm \ + %D%/packages/ncdu.scm \ + %D%/packages/ncurses.scm \ + %D%/packages/netpbm.scm \ + %D%/packages/nettle.scm \ + %D%/packages/networking.scm \ + %D%/packages/ninja.scm \ + %D%/packages/node.scm \ + %D%/packages/noweb.scm \ + %D%/packages/ntp.scm \ + %D%/packages/nutrition.scm \ + %D%/packages/nvi.scm \ + %D%/packages/ocaml.scm \ + %D%/packages/ocr.scm \ + %D%/packages/onc-rpc.scm \ + %D%/packages/openbox.scm \ + %D%/packages/openldap.scm \ + %D%/packages/openstack.scm \ + %D%/packages/orpheus.scm \ + %D%/packages/ots.scm \ + %D%/packages/owncloud.scm \ + %D%/packages/package-management.scm \ + %D%/packages/parallel.scm \ + %D%/packages/password-utils.scm \ + %D%/packages/patchutils.scm \ + %D%/packages/pciutils.scm \ + %D%/packages/pcre.scm \ + %D%/packages/pdf.scm \ + %D%/packages/pem.scm \ + %D%/packages/perl.scm \ + %D%/packages/photo.scm \ + %D%/packages/pkg-config.scm \ + %D%/packages/plotutils.scm \ + %D%/packages/polkit.scm \ + %D%/packages/popt.scm \ + %D%/packages/pth.scm \ + %D%/packages/pulseaudio.scm \ + %D%/packages/pumpio.scm \ + %D%/packages/pretty-print.scm \ + %D%/packages/protobuf.scm \ + %D%/packages/pv.scm \ + %D%/packages/python.scm \ + %D%/packages/qemu.scm \ + %D%/packages/qt.scm \ + %D%/packages/ragel.scm \ + %D%/packages/ratpoison.scm \ + %D%/packages/rc.scm \ + %D%/packages/rdesktop.scm \ + %D%/packages/rdf.scm \ + %D%/packages/readline.scm \ + %D%/packages/rrdtool.scm \ + %D%/packages/rsync.scm \ + %D%/packages/ruby.scm \ + %D%/packages/rush.scm \ + %D%/packages/samba.scm \ + %D%/packages/sawfish.scm \ + %D%/packages/scanner.scm \ + %D%/packages/scheme.scm \ + %D%/packages/screen.scm \ + %D%/packages/scribus.scm \ + %D%/packages/sdl.scm \ + %D%/packages/search.scm \ + %D%/packages/serialization.scm \ + %D%/packages/serveez.scm \ + %D%/packages/shellutils.scm \ + %D%/packages/shishi.scm \ + %D%/packages/skarnet.scm \ + %D%/packages/skribilo.scm \ + %D%/packages/slang.scm \ + %D%/packages/slim.scm \ + %D%/packages/smalltalk.scm \ + %D%/packages/ssh.scm \ + %D%/packages/stalonetray.scm \ + %D%/packages/statistics.scm \ + %D%/packages/suckless.scm \ + %D%/packages/swig.scm \ + %D%/packages/sxiv.scm \ + %D%/packages/synergy.scm \ + %D%/packages/task-management.scm \ + %D%/packages/tbb.scm \ + %D%/packages/tcl.scm \ + %D%/packages/tcsh.scm \ + %D%/packages/telephony.scm \ + %D%/packages/terminals.scm \ + %D%/packages/texinfo.scm \ + %D%/packages/texlive.scm \ + %D%/packages/textutils.scm \ + %D%/packages/time.scm \ + %D%/packages/tls.scm \ + %D%/packages/tmux.scm \ + %D%/packages/tor.scm \ + %D%/packages/tre.scm \ + %D%/packages/tv.scm \ + %D%/packages/unrtf.scm \ + %D%/packages/upnp.scm \ + %D%/packages/uucp.scm \ + %D%/packages/valgrind.scm \ + %D%/packages/version-control.scm \ + %D%/packages/video.scm \ + %D%/packages/vim.scm \ + %D%/packages/vpn.scm \ + %D%/packages/vtk.scm \ + %D%/packages/w3m.scm \ + %D%/packages/wdiff.scm \ + %D%/packages/web.scm \ + %D%/packages/webkit.scm \ + %D%/packages/wget.scm \ + %D%/packages/wicd.scm \ + %D%/packages/wine.scm \ + %D%/packages/wm.scm \ + %D%/packages/wordnet.scm \ + %D%/packages/wv.scm \ + %D%/packages/wxwidgets.scm \ + %D%/packages/xfig.scm \ + %D%/packages/xiph.scm \ + %D%/packages/xml.scm \ + %D%/packages/xnee.scm \ + %D%/packages/xdisorg.scm \ + %D%/packages/xorg.scm \ + %D%/packages/xfce.scm \ + %D%/packages/yasm.scm \ + %D%/packages/yubico.scm \ + %D%/packages/zile.scm \ + %D%/packages/zip.scm \ + %D%/packages/zsh.scm \ \ - gnu/services.scm \ - gnu/services/avahi.scm \ - gnu/services/base.scm \ - gnu/services/databases.scm \ - gnu/services/dbus.scm \ - gnu/services/desktop.scm \ - gnu/services/lirc.scm \ - gnu/services/mail.scm \ - gnu/services/networking.scm \ - gnu/services/shepherd.scm \ - gnu/services/herd.scm \ - gnu/services/ssh.scm \ - gnu/services/web.scm \ - gnu/services/xorg.scm \ + %D%/services.scm \ + %D%/services/avahi.scm \ + %D%/services/base.scm \ + %D%/services/databases.scm \ + %D%/services/dbus.scm \ + %D%/services/desktop.scm \ + %D%/services/lirc.scm \ + %D%/services/mail.scm \ + %D%/services/networking.scm \ + %D%/services/shepherd.scm \ + %D%/services/herd.scm \ + %D%/services/ssh.scm \ + %D%/services/web.scm \ + %D%/services/xorg.scm \ \ - gnu/system.scm \ - gnu/system/file-systems.scm \ - gnu/system/grub.scm \ - gnu/system/install.scm \ - gnu/system/linux-container.scm \ - gnu/system/linux-initrd.scm \ - gnu/system/locale.scm \ - gnu/system/mapped-devices.scm \ - gnu/system/nss.scm \ - gnu/system/pam.scm \ - gnu/system/shadow.scm \ - gnu/system/vm.scm \ + %D%/system.scm \ + %D%/system/file-systems.scm \ + %D%/system/grub.scm \ + %D%/system/install.scm \ + %D%/system/linux-container.scm \ + %D%/system/linux-initrd.scm \ + %D%/system/locale.scm \ + %D%/system/mapped-devices.scm \ + %D%/system/nss.scm \ + %D%/system/pam.scm \ + %D%/system/shadow.scm \ + %D%/system/vm.scm \ \ - gnu/build/activation.scm \ - gnu/build/file-systems.scm \ - gnu/build/install.scm \ - gnu/build/linux-boot.scm \ - gnu/build/linux-container.scm \ - gnu/build/linux-initrd.scm \ - gnu/build/linux-modules.scm \ - gnu/build/marionette.scm \ - gnu/build/vm.scm \ + %D%/build/activation.scm \ + %D%/build/file-systems.scm \ + %D%/build/install.scm \ + %D%/build/linux-boot.scm \ + %D%/build/linux-container.scm \ + %D%/build/linux-initrd.scm \ + %D%/build/linux-modules.scm \ + %D%/build/marionette.scm \ + %D%/build/vm.scm \ \ - gnu/tests.scm \ - gnu/tests/base.scm + %D%/tests.scm \ + %D%/tests/base.scm -patchdir = $(guilemoduledir)/gnu/packages/patches +patchdir = $(guilemoduledir)/%D%/packages/patches dist_patch_DATA = \ - gnu/packages/patches/4store-fix-buildsystem.patch \ - gnu/packages/patches/abiword-explictly-cast-bools.patch \ - gnu/packages/patches/abiword-wmf-version-lookup-fix.patch \ - gnu/packages/patches/acl-hurd-path-max.patch \ - gnu/packages/patches/aegis-constness-error.patch \ - gnu/packages/patches/aegis-perl-tempdir1.patch \ - gnu/packages/patches/aegis-perl-tempdir2.patch \ - gnu/packages/patches/aegis-test-fixup-1.patch \ - gnu/packages/patches/aegis-test-fixup-2.patch \ - gnu/packages/patches/agg-am_c_prototype.patch \ - gnu/packages/patches/alsa-lib-mips-atomic-fix.patch \ - gnu/packages/patches/apr-skip-getservbyname-test.patch \ - gnu/packages/patches/arb-ldconfig.patch \ - gnu/packages/patches/ath9k-htc-firmware-binutils.patch \ - gnu/packages/patches/ath9k-htc-firmware-gcc.patch \ - gnu/packages/patches/ath9k-htc-firmware-objcopy.patch \ - gnu/packages/patches/audacity-fix-ffmpeg-binding.patch \ - gnu/packages/patches/automake-skip-amhello-tests.patch \ - gnu/packages/patches/automake-regexp-syntax.patch \ - gnu/packages/patches/avahi-localstatedir.patch \ - gnu/packages/patches/avidemux-install-to-lib.patch \ - gnu/packages/patches/avrdude-fix-libusb.patch \ - gnu/packages/patches/bash-completion-directories.patch \ - gnu/packages/patches/bigloo-gc-shebangs.patch \ - gnu/packages/patches/binutils-ld-new-dtags.patch \ - gnu/packages/patches/binutils-loongson-workaround.patch \ - gnu/packages/patches/byobu-writable-status.patch \ - gnu/packages/patches/calibre-drop-unrar.patch \ - gnu/packages/patches/calibre-no-updates-dialog.patch \ - gnu/packages/patches/cdparanoia-fpic.patch \ - gnu/packages/patches/chmlib-inttypes.patch \ - gnu/packages/patches/clang-libc-search-path.patch \ - gnu/packages/patches/clucene-pkgconfig.patch \ - gnu/packages/patches/cmake-fix-tests.patch \ - gnu/packages/patches/cpio-gets-undeclared.patch \ - gnu/packages/patches/cpio-CVE-2016-2037.patch \ - gnu/packages/patches/cpufrequtils-fix-aclocal.patch \ - gnu/packages/patches/crda-optional-gcrypt.patch \ - gnu/packages/patches/crossmap-allow-system-pysam.patch \ - gnu/packages/patches/csound-header-ordering.patch \ - gnu/packages/patches/cssc-gets-undeclared.patch \ - gnu/packages/patches/cssc-missing-include.patch \ - gnu/packages/patches/clucene-contribs-lib.patch \ - gnu/packages/patches/cursynth-wave-rand.patch \ - gnu/packages/patches/dbus-helper-search-path.patch \ - gnu/packages/patches/dealii-p4est-interface.patch \ - gnu/packages/patches/devil-fix-libpng.patch \ - gnu/packages/patches/dico-libtool-deterministic.patch \ - gnu/packages/patches/diffutils-gets-undeclared.patch \ - gnu/packages/patches/dfu-programmer-fix-libusb.patch \ - gnu/packages/patches/doc++-include-directives.patch \ - gnu/packages/patches/doc++-segfault-fix.patch \ - gnu/packages/patches/doxygen-test.patch \ - gnu/packages/patches/duplicity-piped-password.patch \ - gnu/packages/patches/duplicity-test_selection-tmp.patch \ - gnu/packages/patches/elfutils-tests-ptrace.patch \ - gnu/packages/patches/einstein-build.patch \ - gnu/packages/patches/emacs-exec-path.patch \ - gnu/packages/patches/emacs-scheme-complete-scheme-r5rs-info.patch \ - gnu/packages/patches/emacs-source-date-epoch.patch \ - gnu/packages/patches/eudev-rules-directory.patch \ - gnu/packages/patches/evilwm-lost-focus-bug.patch \ - gnu/packages/patches/expat-CVE-2015-1283.patch \ - gnu/packages/patches/expat-CVE-2015-1283-refix.patch \ - gnu/packages/patches/expat-CVE-2016-0718.patch \ - gnu/packages/patches/fastcap-mulGlobal.patch \ - gnu/packages/patches/fastcap-mulSetup.patch \ - gnu/packages/patches/fasthenry-spAllocate.patch \ - gnu/packages/patches/fasthenry-spBuild.patch \ - gnu/packages/patches/fasthenry-spUtils.patch \ - gnu/packages/patches/fasthenry-spSolve.patch \ - gnu/packages/patches/fasthenry-spFactor.patch \ - gnu/packages/patches/findutils-localstatedir.patch \ - gnu/packages/patches/findutils-test-xargs.patch \ - gnu/packages/patches/flashrom-use-libftdi1.patch \ - gnu/packages/patches/flint-ldconfig.patch \ - gnu/packages/patches/fltk-shared-lib-defines.patch \ - gnu/packages/patches/fltk-xfont-on-demand.patch \ - gnu/packages/patches/fontforge-svg-modtime.patch \ - gnu/packages/patches/fossil-test-fixes.patch \ - gnu/packages/patches/freeimage-CVE-2015-0852.patch \ - gnu/packages/patches/gawk-fts-test.patch \ - gnu/packages/patches/gawk-shell.patch \ - gnu/packages/patches/gcc-arm-link-spec-fix.patch \ - gnu/packages/patches/gcc-cross-environment-variables.patch \ - gnu/packages/patches/gcc-libvtv-runpath.patch \ - gnu/packages/patches/gcc-5.0-libvtv-runpath.patch \ - gnu/packages/patches/gd-CVE-2016-3074.patch \ - gnu/packages/patches/geoclue-config.patch \ - gnu/packages/patches/ghostscript-CVE-2015-3228.patch \ - gnu/packages/patches/ghostscript-runpath.patch \ - gnu/packages/patches/glib-networking-ssl-cert-file.patch \ - gnu/packages/patches/glib-tests-timer.patch \ - gnu/packages/patches/glibc-CVE-2015-7547.patch \ - gnu/packages/patches/glibc-bootstrap-system.patch \ - gnu/packages/patches/glibc-hurd-extern-inline.patch \ - gnu/packages/patches/glibc-ldd-x86_64.patch \ - gnu/packages/patches/glibc-locales.patch \ - gnu/packages/patches/glibc-locale-incompatibility.patch \ - gnu/packages/patches/glibc-o-largefile.patch \ - gnu/packages/patches/glibc-versioned-locpath.patch \ - gnu/packages/patches/gmp-arm-asm-nothumb.patch \ - gnu/packages/patches/gmp-faulty-test.patch \ - gnu/packages/patches/gnome-tweak-tool-search-paths.patch \ - gnu/packages/patches/gnucash-price-quotes-perl.patch \ - gnu/packages/patches/gobject-introspection-absolute-shlib-path.patch \ - gnu/packages/patches/gobject-introspection-cc.patch \ - gnu/packages/patches/gobject-introspection-girepository.patch \ - gnu/packages/patches/grep-timing-sensitive-test.patch \ - gnu/packages/patches/grub-CVE-2015-8370.patch \ - gnu/packages/patches/grub-gets-undeclared.patch \ - gnu/packages/patches/grub-freetype.patch \ - gnu/packages/patches/guile-1.8-cpp-4.5.patch \ - gnu/packages/patches/guile-arm-fixes.patch \ - gnu/packages/patches/guile-default-utf8.patch \ - gnu/packages/patches/guile-linux-syscalls.patch \ - gnu/packages/patches/guile-present-coding.patch \ - gnu/packages/patches/guile-relocatable.patch \ - gnu/packages/patches/guile-rsvg-pkgconfig.patch \ - gnu/packages/patches/gtk2-respect-GUIX_GTK2_PATH.patch \ - gnu/packages/patches/gtk2-theme-paths.patch \ - gnu/packages/patches/gtk3-respect-GUIX_GTK3_PATH.patch \ - gnu/packages/patches/gtkglext-disable-disable-deprecated.patch \ - gnu/packages/patches/hdf5-config-date.patch \ - gnu/packages/patches/hop-bigloo-4.0b.patch \ - gnu/packages/patches/hop-linker-flags.patch \ - gnu/packages/patches/hydra-automake-1.15.patch \ - gnu/packages/patches/hydra-disable-darcs-test.patch \ - gnu/packages/patches/hypre-doc-tables.patch \ - gnu/packages/patches/hypre-ldflags.patch \ - gnu/packages/patches/icecat-avoid-bundled-includes.patch \ - gnu/packages/patches/icu4c-CVE-2014-6585.patch \ - gnu/packages/patches/icu4c-CVE-2015-1270.patch \ - gnu/packages/patches/icu4c-CVE-2015-4760.patch \ - gnu/packages/patches/ilmbase-fix-tests.patch \ - gnu/packages/patches/inkscape-drop-wait-for-targets.patch \ - gnu/packages/patches/irrlicht-mesa-10.patch \ - gnu/packages/patches/jasper-CVE-2007-2721.patch \ - gnu/packages/patches/jasper-CVE-2008-3520.patch \ - gnu/packages/patches/jasper-CVE-2008-3522.patch \ - gnu/packages/patches/jasper-CVE-2011-4516-and-CVE-2011-4517.patch \ - gnu/packages/patches/jasper-CVE-2014-8137.patch \ - gnu/packages/patches/jasper-CVE-2014-8138.patch \ - gnu/packages/patches/jasper-CVE-2014-8157.patch \ - gnu/packages/patches/jasper-CVE-2014-8158.patch \ - gnu/packages/patches/jasper-CVE-2014-9029.patch \ - gnu/packages/patches/jasper-CVE-2016-1577.patch \ - gnu/packages/patches/jasper-CVE-2016-1867.patch \ - gnu/packages/patches/jasper-CVE-2016-2089.patch \ - gnu/packages/patches/jasper-CVE-2016-2116.patch \ - gnu/packages/patches/jbig2dec-ignore-testtest.patch \ - gnu/packages/patches/kmod-module-directory.patch \ - gnu/packages/patches/ldc-disable-tests.patch \ - gnu/packages/patches/lftp-dont-save-unknown-host-fingerprint.patch \ - gnu/packages/patches/liba52-enable-pic.patch \ - gnu/packages/patches/liba52-link-with-libm.patch \ - gnu/packages/patches/liba52-set-soname.patch \ - gnu/packages/patches/liba52-use-mtune-not-mcpu.patch \ - gnu/packages/patches/libarchive-bsdtar-test.patch \ - gnu/packages/patches/libarchive-CVE-2013-0211.patch \ - gnu/packages/patches/libarchive-CVE-2016-1541.patch \ - gnu/packages/patches/libarchive-fix-lzo-test-case.patch \ - gnu/packages/patches/libarchive-mtree-filename-length-fix.patch \ - gnu/packages/patches/libbonobo-activation-test-race.patch \ - gnu/packages/patches/libcanberra-sound-theme-freedesktop.patch \ - gnu/packages/patches/libcmis-fix-test-onedrive.patch \ - gnu/packages/patches/libdrm-symbol-check.patch \ - gnu/packages/patches/libevent-dns-tests.patch \ - gnu/packages/patches/libextractor-ffmpeg-3.patch \ - gnu/packages/patches/libmtp-devices.patch \ - gnu/packages/patches/liboop-mips64-deplibs-fix.patch \ - gnu/packages/patches/libotr-test-auth-fix.patch \ - gnu/packages/patches/liblxqt-include.patch \ - gnu/packages/patches/libmad-armv7-thumb-pt1.patch \ - gnu/packages/patches/libmad-armv7-thumb-pt2.patch \ - gnu/packages/patches/libmad-frame-length.patch \ - gnu/packages/patches/libmad-mips-newgcc.patch \ - gnu/packages/patches/libssh-0.6.5-CVE-2016-0739.patch \ - gnu/packages/patches/libtheora-config-guess.patch \ - gnu/packages/patches/libtiff-CVE-2015-8665+CVE-2015-8683.patch \ - gnu/packages/patches/libtiff-oob-accesses-in-decode.patch \ - gnu/packages/patches/libtiff-oob-write-in-nextdecode.patch \ - gnu/packages/patches/libtool-skip-tests2.patch \ - gnu/packages/patches/libunwind-CVE-2015-3239.patch \ - gnu/packages/patches/libwmf-CAN-2004-0941.patch \ - gnu/packages/patches/libwmf-CVE-2006-3376.patch \ - gnu/packages/patches/libwmf-CVE-2007-0455.patch \ - gnu/packages/patches/libwmf-CVE-2007-2756.patch \ - gnu/packages/patches/libwmf-CVE-2007-3472.patch \ - gnu/packages/patches/libwmf-CVE-2007-3473.patch \ - gnu/packages/patches/libwmf-CVE-2007-3477.patch \ - gnu/packages/patches/libwmf-CVE-2009-1364.patch \ - gnu/packages/patches/libwmf-CVE-2009-3546.patch \ - gnu/packages/patches/libwmf-CVE-2015-0848+CVE-2015-4588.patch \ - gnu/packages/patches/libwmf-CVE-2015-4695.patch \ - gnu/packages/patches/libwmf-CVE-2015-4696.patch \ - gnu/packages/patches/libxslt-CVE-2015-7995.patch \ - gnu/packages/patches/lirc-localstatedir.patch \ - gnu/packages/patches/libpthread-glibc-preparation.patch \ - gnu/packages/patches/lm-sensors-hwmon-attrs.patch \ - gnu/packages/patches/lua-pkgconfig.patch \ - gnu/packages/patches/lua51-liblua-so.patch \ - gnu/packages/patches/lua52-liblua-so.patch \ - gnu/packages/patches/luajit-no_ldconfig.patch \ - gnu/packages/patches/luajit-symlinks.patch \ - gnu/packages/patches/luit-posix.patch \ - gnu/packages/patches/m4-gets-undeclared.patch \ - gnu/packages/patches/make-impure-dirs.patch \ - gnu/packages/patches/mars-install.patch \ - gnu/packages/patches/mars-sfml-2.3.patch \ - gnu/packages/patches/matplotlib-setupext-tk.patch \ - gnu/packages/patches/maxima-defsystem-mkdir.patch \ - gnu/packages/patches/mcron-install.patch \ - gnu/packages/patches/mhash-keygen-test-segfault.patch \ - gnu/packages/patches/mit-krb5-CVE-2015-8629.patch \ - gnu/packages/patches/mit-krb5-CVE-2015-8630.patch \ - gnu/packages/patches/mit-krb5-CVE-2015-8631.patch \ - gnu/packages/patches/mit-krb5-init-context-null-spnego.patch \ - gnu/packages/patches/mpc123-initialize-ao.patch \ - gnu/packages/patches/mplayer2-theora-fix.patch \ - gnu/packages/patches/module-init-tools-moduledir.patch \ - gnu/packages/patches/mumps-build-parallelism.patch \ - gnu/packages/patches/mupen64plus-ui-console-notice.patch \ - gnu/packages/patches/mutt-store-references.patch \ - gnu/packages/patches/net-tools-bitrot.patch \ - gnu/packages/patches/netcdf-config-date.patch \ - gnu/packages/patches/ngircd-handle-zombies.patch \ - gnu/packages/patches/ngircd-no-dns-in-tests.patch \ - gnu/packages/patches/ninja-tests.patch \ - gnu/packages/patches/ninja-zero-mtime.patch \ - gnu/packages/patches/nss-pkgconfig.patch \ - gnu/packages/patches/nvi-assume-preserve-path.patch \ - gnu/packages/patches/nvi-dbpagesize-binpower.patch \ - gnu/packages/patches/nvi-db4.patch \ - gnu/packages/patches/ocaml-CVE-2015-8869.patch \ - gnu/packages/patches/ocaml-findlib-make-install.patch \ - gnu/packages/patches/openexr-missing-samples.patch \ - gnu/packages/patches/openimageio-boost-1.60.patch \ - gnu/packages/patches/openjpeg-CVE-2015-6581.patch \ - gnu/packages/patches/openjpeg-use-after-free-fix.patch \ - gnu/packages/patches/openssh-CVE-2015-8325.patch \ - gnu/packages/patches/openssl-runpath.patch \ - gnu/packages/patches/openssl-c-rehash-in.patch \ - gnu/packages/patches/orpheus-cast-errors-and-includes.patch \ - gnu/packages/patches/ots-no-include-missing-file.patch \ - gnu/packages/patches/patchelf-page-size.patch \ - gnu/packages/patches/patchelf-rework-for-arm.patch \ - gnu/packages/patches/patchutils-xfail-gendiff-tests.patch \ - gnu/packages/patches/patch-hurd-path-max.patch \ - gnu/packages/patches/pcre-CVE-2016-3191.patch \ - gnu/packages/patches/perl-CVE-2015-8607.patch \ - gnu/packages/patches/perl-CVE-2016-2381.patch \ - gnu/packages/patches/perl-autosplit-default-time.patch \ - gnu/packages/patches/perl-deterministic-ordering.patch \ - gnu/packages/patches/perl-finance-quote-unuse-mozilla-ca.patch \ - gnu/packages/patches/perl-gd-options-passthrough-and-fontconfig.patch \ - gnu/packages/patches/perl-io-socket-ssl-openssl-1.0.2f-fix.patch \ - gnu/packages/patches/perl-net-amazon-s3-moose-warning.patch \ - gnu/packages/patches/perl-net-ssleay-disable-ede-test.patch \ - gnu/packages/patches/perl-no-build-time.patch \ - gnu/packages/patches/perl-no-sys-dirs.patch \ - gnu/packages/patches/perl-module-pluggable-search.patch \ - gnu/packages/patches/perl-source-date-epoch.patch \ - gnu/packages/patches/pidgin-add-search-path.patch \ - gnu/packages/patches/pinball-const-fix.patch \ - gnu/packages/patches/pinball-cstddef.patch \ - gnu/packages/patches/pinball-missing-separators.patch \ - gnu/packages/patches/pinball-src-deps.patch \ - gnu/packages/patches/pinball-system-ltdl.patch \ - gnu/packages/patches/pingus-sdl-libs-config.patch \ - gnu/packages/patches/plink-1.07-unclobber-i.patch \ - gnu/packages/patches/plotutils-libpng-jmpbuf.patch \ - gnu/packages/patches/polkit-drop-test.patch \ - gnu/packages/patches/portaudio-audacity-compat.patch \ - gnu/packages/patches/portmidi-modular-build.patch \ - gnu/packages/patches/procmail-ambiguous-getline-debian.patch \ - gnu/packages/patches/pt-scotch-build-parallelism.patch \ - gnu/packages/patches/pulseaudio-fix-mult-test.patch \ - gnu/packages/patches/pulseaudio-longer-test-timeout.patch \ - gnu/packages/patches/pycairo-wscript.patch \ - gnu/packages/patches/pybugz-encode-error.patch \ - gnu/packages/patches/pybugz-stty.patch \ - gnu/packages/patches/pygpgme-disable-problematic-tests.patch \ - gnu/packages/patches/pyqt-configure.patch \ - gnu/packages/patches/python-2-deterministic-build-info.patch \ - gnu/packages/patches/python-2.7-search-paths.patch \ - gnu/packages/patches/python-2.7-source-date-epoch.patch \ - gnu/packages/patches/python-3-deterministic-build-info.patch \ - gnu/packages/patches/python-3-search-paths.patch \ - gnu/packages/patches/python-disable-ssl-test.patch \ - gnu/packages/patches/python-fix-tests.patch \ - gnu/packages/patches/python-ipython-inputhook-ctype.patch \ - gnu/packages/patches/python-rarfile-fix-tests.patch \ - gnu/packages/patches/python2-rdflib-drop-sparqlwrapper.patch \ - gnu/packages/patches/python-configobj-setuptools.patch \ - gnu/packages/patches/python-paste-remove-website-test.patch \ - gnu/packages/patches/python-paste-remove-timing-test.patch \ - gnu/packages/patches/python2-pygobject-2-gi-info-type-error-domain.patch \ - gnu/packages/patches/qt4-ldflags.patch \ - gnu/packages/patches/ratpoison-shell.patch \ - gnu/packages/patches/readline-link-ncurses.patch \ - gnu/packages/patches/ripperx-missing-file.patch \ - gnu/packages/patches/rsem-makefile.patch \ - gnu/packages/patches/ruby-symlinkfix.patch \ - gnu/packages/patches/sed-hurd-path-max.patch \ - gnu/packages/patches/scheme48-tests.patch \ - gnu/packages/patches/scotch-test-threading.patch \ - gnu/packages/patches/sdl-libx11-1.6.patch \ - gnu/packages/patches/serf-comment-style-fix.patch \ - gnu/packages/patches/serf-deflate-buckets-test-fix.patch \ - gnu/packages/patches/slim-session.patch \ - gnu/packages/patches/slim-config.patch \ - gnu/packages/patches/slim-sigusr1.patch \ - gnu/packages/patches/slurm-configure-remove-nonfree-contribs.patch \ - gnu/packages/patches/soprano-find-clucene.patch \ - gnu/packages/patches/sudo-CVE-2015-5602.patch \ - gnu/packages/patches/superlu-dist-scotchmetis.patch \ - gnu/packages/patches/synfig-build-fix.patch \ - gnu/packages/patches/tar-d_ino_in_dirent-fix.patch \ - gnu/packages/patches/tar-skip-unreliable-tests.patch \ - gnu/packages/patches/tcl-mkindex-deterministic.patch \ - gnu/packages/patches/tclxml-3.2-install.patch \ - gnu/packages/patches/tcsh-fix-autotest.patch \ - gnu/packages/patches/texi2html-document-encoding.patch \ - gnu/packages/patches/texi2html-i18n.patch \ - gnu/packages/patches/tidy-CVE-2015-5522+5523.patch \ - gnu/packages/patches/tinyxml-use-stl.patch \ - gnu/packages/patches/tk-find-library.patch \ - gnu/packages/patches/ttf2eot-cstddef.patch \ - gnu/packages/patches/ttfautohint-source-date-epoch.patch \ - gnu/packages/patches/tophat-build-with-later-seqan.patch \ - gnu/packages/patches/torsocks-dns-test.patch \ - gnu/packages/patches/totem-debug-format-fix.patch \ - gnu/packages/patches/unzip-CVE-2014-8139.patch \ - gnu/packages/patches/unzip-CVE-2014-8140.patch \ - gnu/packages/patches/unzip-CVE-2014-8141.patch \ - gnu/packages/patches/unzip-CVE-2014-9636.patch \ - gnu/packages/patches/unzip-CVE-2015-7696.patch \ - gnu/packages/patches/unzip-CVE-2015-7697.patch \ - gnu/packages/patches/unzip-allow-greater-hostver-values.patch \ - gnu/packages/patches/unzip-attribs-overflow.patch \ - gnu/packages/patches/unzip-overflow-on-invalid-input.patch \ - gnu/packages/patches/unzip-format-secure.patch \ - gnu/packages/patches/unzip-initialize-symlink-flag.patch \ - gnu/packages/patches/unzip-overflow-long-fsize.patch \ - gnu/packages/patches/unzip-remove-build-date.patch \ - gnu/packages/patches/util-linux-tests.patch \ - gnu/packages/patches/upower-builddir.patch \ - gnu/packages/patches/valgrind-enable-arm.patch \ - gnu/packages/patches/vorbis-tools-CVE-2015-6749.patch \ - gnu/packages/patches/vpnc-script.patch \ - gnu/packages/patches/vtk-mesa-10.patch \ - gnu/packages/patches/w3m-libgc.patch \ - gnu/packages/patches/w3m-force-ssl_verify_server-on.patch \ - gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch \ - gnu/packages/patches/w3m-disable-weak-ciphers.patch \ - gnu/packages/patches/weechat-python.patch \ - gnu/packages/patches/weex-vacopy.patch \ - gnu/packages/patches/wicd-bitrate-none-fix.patch \ - gnu/packages/patches/wicd-get-selected-profile-fix.patch \ - gnu/packages/patches/wicd-urwid-1.3.patch \ - gnu/packages/patches/wicd-wpa2-ttls.patch \ - gnu/packages/patches/wmctrl-64-fix.patch \ - gnu/packages/patches/woff2-libbrotli.patch \ - gnu/packages/patches/wpa-supplicant-CVE-2015-5310.patch \ - gnu/packages/patches/wpa-supplicant-CVE-2015-5314.patch \ - gnu/packages/patches/wpa-supplicant-CVE-2015-5315.patch \ - gnu/packages/patches/wpa-supplicant-CVE-2015-5316.patch \ - gnu/packages/patches/wpa-supplicant-CVE-2016-4476.patch \ - gnu/packages/patches/wpa-supplicant-CVE-2016-4477-pt1.patch \ - gnu/packages/patches/wpa-supplicant-CVE-2016-4477-pt2.patch \ - gnu/packages/patches/wpa-supplicant-CVE-2016-4477-pt3.patch \ - gnu/packages/patches/wpa-supplicant-CVE-2016-4477-pt4.patch \ - gnu/packages/patches/xdotool-fix-makefile.patch \ - gnu/packages/patches/xf86-video-ark-remove-mibstore.patch \ - gnu/packages/patches/xf86-video-ast-remove-mibstore.patch \ - gnu/packages/patches/xf86-video-geode-glibc-2.20.patch \ - gnu/packages/patches/xf86-video-glint-remove-mibstore.patch \ - gnu/packages/patches/xf86-video-i128-remove-mibstore.patch \ - gnu/packages/patches/xf86-video-intel-compat-api.patch \ - gnu/packages/patches/xf86-video-intel-glibc-2.20.patch \ - gnu/packages/patches/xf86-video-mach64-glibc-2.20.patch \ - gnu/packages/patches/xf86-video-nv-remove-mibstore.patch \ - gnu/packages/patches/xf86-video-openchrome-glibc-2.20.patch \ - gnu/packages/patches/xf86-video-tga-remove-mibstore.patch \ - gnu/packages/patches/xfce4-panel-plugins.patch \ - gnu/packages/patches/xfce4-session-fix-xflock4.patch \ - gnu/packages/patches/xfce4-settings-defaults.patch \ - gnu/packages/patches/xmodmap-asprintf.patch \ - gnu/packages/patches/zathura-plugindir-environment-variable.patch + %D%/packages/patches/4store-fix-buildsystem.patch \ + %D%/packages/patches/abiword-explictly-cast-bools.patch \ + %D%/packages/patches/abiword-wmf-version-lookup-fix.patch \ + %D%/packages/patches/acl-hurd-path-max.patch \ + %D%/packages/patches/aegis-constness-error.patch \ + %D%/packages/patches/aegis-perl-tempdir1.patch \ + %D%/packages/patches/aegis-perl-tempdir2.patch \ + %D%/packages/patches/aegis-test-fixup-1.patch \ + %D%/packages/patches/aegis-test-fixup-2.patch \ + %D%/packages/patches/agg-am_c_prototype.patch \ + %D%/packages/patches/alsa-lib-mips-atomic-fix.patch \ + %D%/packages/patches/apr-skip-getservbyname-test.patch \ + %D%/packages/patches/arb-ldconfig.patch \ + %D%/packages/patches/ath9k-htc-firmware-binutils.patch \ + %D%/packages/patches/ath9k-htc-firmware-gcc.patch \ + %D%/packages/patches/ath9k-htc-firmware-objcopy.patch \ + %D%/packages/patches/audacity-fix-ffmpeg-binding.patch \ + %D%/packages/patches/automake-skip-amhello-tests.patch \ + %D%/packages/patches/automake-regexp-syntax.patch \ + %D%/packages/patches/avahi-localstatedir.patch \ + %D%/packages/patches/avidemux-install-to-lib.patch \ + %D%/packages/patches/avrdude-fix-libusb.patch \ + %D%/packages/patches/bash-completion-directories.patch \ + %D%/packages/patches/bigloo-gc-shebangs.patch \ + %D%/packages/patches/binutils-ld-new-dtags.patch \ + %D%/packages/patches/binutils-loongson-workaround.patch \ + %D%/packages/patches/byobu-writable-status.patch \ + %D%/packages/patches/calibre-drop-unrar.patch \ + %D%/packages/patches/calibre-no-updates-dialog.patch \ + %D%/packages/patches/cdparanoia-fpic.patch \ + %D%/packages/patches/chmlib-inttypes.patch \ + %D%/packages/patches/clang-libc-search-path.patch \ + %D%/packages/patches/clucene-pkgconfig.patch \ + %D%/packages/patches/cmake-fix-tests.patch \ + %D%/packages/patches/cpio-gets-undeclared.patch \ + %D%/packages/patches/cpio-CVE-2016-2037.patch \ + %D%/packages/patches/cpufrequtils-fix-aclocal.patch \ + %D%/packages/patches/crda-optional-gcrypt.patch \ + %D%/packages/patches/crossmap-allow-system-pysam.patch \ + %D%/packages/patches/csound-header-ordering.patch \ + %D%/packages/patches/cssc-gets-undeclared.patch \ + %D%/packages/patches/cssc-missing-include.patch \ + %D%/packages/patches/clucene-contribs-lib.patch \ + %D%/packages/patches/cursynth-wave-rand.patch \ + %D%/packages/patches/dbus-helper-search-path.patch \ + %D%/packages/patches/dealii-p4est-interface.patch \ + %D%/packages/patches/devil-fix-libpng.patch \ + %D%/packages/patches/dico-libtool-deterministic.patch \ + %D%/packages/patches/diffutils-gets-undeclared.patch \ + %D%/packages/patches/dfu-programmer-fix-libusb.patch \ + %D%/packages/patches/doc++-include-directives.patch \ + %D%/packages/patches/doc++-segfault-fix.patch \ + %D%/packages/patches/doxygen-test.patch \ + %D%/packages/patches/duplicity-piped-password.patch \ + %D%/packages/patches/duplicity-test_selection-tmp.patch \ + %D%/packages/patches/elfutils-tests-ptrace.patch \ + %D%/packages/patches/einstein-build.patch \ + %D%/packages/patches/emacs-exec-path.patch \ + %D%/packages/patches/emacs-scheme-complete-scheme-r5rs-info.patch \ + %D%/packages/patches/emacs-source-date-epoch.patch \ + %D%/packages/patches/eudev-rules-directory.patch \ + %D%/packages/patches/evilwm-lost-focus-bug.patch \ + %D%/packages/patches/expat-CVE-2015-1283.patch \ + %D%/packages/patches/expat-CVE-2015-1283-refix.patch \ + %D%/packages/patches/expat-CVE-2016-0718.patch \ + %D%/packages/patches/fastcap-mulGlobal.patch \ + %D%/packages/patches/fastcap-mulSetup.patch \ + %D%/packages/patches/fasthenry-spAllocate.patch \ + %D%/packages/patches/fasthenry-spBuild.patch \ + %D%/packages/patches/fasthenry-spUtils.patch \ + %D%/packages/patches/fasthenry-spSolve.patch \ + %D%/packages/patches/fasthenry-spFactor.patch \ + %D%/packages/patches/findutils-localstatedir.patch \ + %D%/packages/patches/findutils-test-xargs.patch \ + %D%/packages/patches/flashrom-use-libftdi1.patch \ + %D%/packages/patches/flint-ldconfig.patch \ + %D%/packages/patches/fltk-shared-lib-defines.patch \ + %D%/packages/patches/fltk-xfont-on-demand.patch \ + %D%/packages/patches/fontforge-svg-modtime.patch \ + %D%/packages/patches/fossil-test-fixes.patch \ + %D%/packages/patches/freeimage-CVE-2015-0852.patch \ + %D%/packages/patches/gawk-fts-test.patch \ + %D%/packages/patches/gawk-shell.patch \ + %D%/packages/patches/gcc-arm-link-spec-fix.patch \ + %D%/packages/patches/gcc-cross-environment-variables.patch \ + %D%/packages/patches/gcc-libvtv-runpath.patch \ + %D%/packages/patches/gcc-5.0-libvtv-runpath.patch \ + %D%/packages/patches/gd-CVE-2016-3074.patch \ + %D%/packages/patches/geoclue-config.patch \ + %D%/packages/patches/ghostscript-CVE-2015-3228.patch \ + %D%/packages/patches/ghostscript-runpath.patch \ + %D%/packages/patches/glib-networking-ssl-cert-file.patch \ + %D%/packages/patches/glib-tests-timer.patch \ + %D%/packages/patches/glibc-CVE-2015-7547.patch \ + %D%/packages/patches/glibc-bootstrap-system.patch \ + %D%/packages/patches/glibc-hurd-extern-inline.patch \ + %D%/packages/patches/glibc-ldd-x86_64.patch \ + %D%/packages/patches/glibc-locales.patch \ + %D%/packages/patches/glibc-locale-incompatibility.patch \ + %D%/packages/patches/glibc-o-largefile.patch \ + %D%/packages/patches/glibc-versioned-locpath.patch \ + %D%/packages/patches/gmp-arm-asm-nothumb.patch \ + %D%/packages/patches/gmp-faulty-test.patch \ + %D%/packages/patches/gnome-tweak-tool-search-paths.patch \ + %D%/packages/patches/gnucash-price-quotes-perl.patch \ + %D%/packages/patches/gobject-introspection-absolute-shlib-path.patch \ + %D%/packages/patches/gobject-introspection-cc.patch \ + %D%/packages/patches/gobject-introspection-girepository.patch \ + %D%/packages/patches/grep-timing-sensitive-test.patch \ + %D%/packages/patches/grub-CVE-2015-8370.patch \ + %D%/packages/patches/grub-gets-undeclared.patch \ + %D%/packages/patches/grub-freetype.patch \ + %D%/packages/patches/guile-1.8-cpp-4.5.patch \ + %D%/packages/patches/guile-arm-fixes.patch \ + %D%/packages/patches/guile-default-utf8.patch \ + %D%/packages/patches/guile-linux-syscalls.patch \ + %D%/packages/patches/guile-present-coding.patch \ + %D%/packages/patches/guile-relocatable.patch \ + %D%/packages/patches/guile-rsvg-pkgconfig.patch \ + %D%/packages/patches/gtk2-respect-GUIX_GTK2_PATH.patch \ + %D%/packages/patches/gtk2-theme-paths.patch \ + %D%/packages/patches/gtk3-respect-GUIX_GTK3_PATH.patch \ + %D%/packages/patches/gtkglext-disable-disable-deprecated.patch \ + %D%/packages/patches/hdf5-config-date.patch \ + %D%/packages/patches/hop-bigloo-4.0b.patch \ + %D%/packages/patches/hop-linker-flags.patch \ + %D%/packages/patches/hydra-automake-1.15.patch \ + %D%/packages/patches/hydra-disable-darcs-test.patch \ + %D%/packages/patches/hypre-doc-tables.patch \ + %D%/packages/patches/hypre-ldflags.patch \ + %D%/packages/patches/icecat-avoid-bundled-includes.patch \ + %D%/packages/patches/icu4c-CVE-2014-6585.patch \ + %D%/packages/patches/icu4c-CVE-2015-1270.patch \ + %D%/packages/patches/icu4c-CVE-2015-4760.patch \ + %D%/packages/patches/ilmbase-fix-tests.patch \ + %D%/packages/patches/inkscape-drop-wait-for-targets.patch \ + %D%/packages/patches/irrlicht-mesa-10.patch \ + %D%/packages/patches/jasper-CVE-2007-2721.patch \ + %D%/packages/patches/jasper-CVE-2008-3520.patch \ + %D%/packages/patches/jasper-CVE-2008-3522.patch \ + %D%/packages/patches/jasper-CVE-2011-4516-and-CVE-2011-4517.patch \ + %D%/packages/patches/jasper-CVE-2014-8137.patch \ + %D%/packages/patches/jasper-CVE-2014-8138.patch \ + %D%/packages/patches/jasper-CVE-2014-8157.patch \ + %D%/packages/patches/jasper-CVE-2014-8158.patch \ + %D%/packages/patches/jasper-CVE-2014-9029.patch \ + %D%/packages/patches/jasper-CVE-2016-1577.patch \ + %D%/packages/patches/jasper-CVE-2016-1867.patch \ + %D%/packages/patches/jasper-CVE-2016-2089.patch \ + %D%/packages/patches/jasper-CVE-2016-2116.patch \ + %D%/packages/patches/jbig2dec-ignore-testtest.patch \ + %D%/packages/patches/kmod-module-directory.patch \ + %D%/packages/patches/ldc-disable-tests.patch \ + %D%/packages/patches/lftp-dont-save-unknown-host-fingerprint.patch \ + %D%/packages/patches/liba52-enable-pic.patch \ + %D%/packages/patches/liba52-link-with-libm.patch \ + %D%/packages/patches/liba52-set-soname.patch \ + %D%/packages/patches/liba52-use-mtune-not-mcpu.patch \ + %D%/packages/patches/libarchive-bsdtar-test.patch \ + %D%/packages/patches/libarchive-CVE-2013-0211.patch \ + %D%/packages/patches/libarchive-CVE-2016-1541.patch \ + %D%/packages/patches/libarchive-fix-lzo-test-case.patch \ + %D%/packages/patches/libarchive-mtree-filename-length-fix.patch \ + %D%/packages/patches/libbonobo-activation-test-race.patch \ + %D%/packages/patches/libcanberra-sound-theme-freedesktop.patch \ + %D%/packages/patches/libcmis-fix-test-onedrive.patch \ + %D%/packages/patches/libdrm-symbol-check.patch \ + %D%/packages/patches/libevent-dns-tests.patch \ + %D%/packages/patches/libextractor-ffmpeg-3.patch \ + %D%/packages/patches/libmtp-devices.patch \ + %D%/packages/patches/liboop-mips64-deplibs-fix.patch \ + %D%/packages/patches/libotr-test-auth-fix.patch \ + %D%/packages/patches/liblxqt-include.patch \ + %D%/packages/patches/libmad-armv7-thumb-pt1.patch \ + %D%/packages/patches/libmad-armv7-thumb-pt2.patch \ + %D%/packages/patches/libmad-frame-length.patch \ + %D%/packages/patches/libmad-mips-newgcc.patch \ + %D%/packages/patches/libssh-0.6.5-CVE-2016-0739.patch \ + %D%/packages/patches/libtheora-config-guess.patch \ + %D%/packages/patches/libtiff-CVE-2015-8665+CVE-2015-8683.patch \ + %D%/packages/patches/libtiff-oob-accesses-in-decode.patch \ + %D%/packages/patches/libtiff-oob-write-in-nextdecode.patch \ + %D%/packages/patches/libtool-skip-tests2.patch \ + %D%/packages/patches/libunwind-CVE-2015-3239.patch \ + %D%/packages/patches/libwmf-CAN-2004-0941.patch \ + %D%/packages/patches/libwmf-CVE-2006-3376.patch \ + %D%/packages/patches/libwmf-CVE-2007-0455.patch \ + %D%/packages/patches/libwmf-CVE-2007-2756.patch \ + %D%/packages/patches/libwmf-CVE-2007-3472.patch \ + %D%/packages/patches/libwmf-CVE-2007-3473.patch \ + %D%/packages/patches/libwmf-CVE-2007-3477.patch \ + %D%/packages/patches/libwmf-CVE-2009-1364.patch \ + %D%/packages/patches/libwmf-CVE-2009-3546.patch \ + %D%/packages/patches/libwmf-CVE-2015-0848+CVE-2015-4588.patch \ + %D%/packages/patches/libwmf-CVE-2015-4695.patch \ + %D%/packages/patches/libwmf-CVE-2015-4696.patch \ + %D%/packages/patches/libxslt-CVE-2015-7995.patch \ + %D%/packages/patches/lirc-localstatedir.patch \ + %D%/packages/patches/libpthread-glibc-preparation.patch \ + %D%/packages/patches/lm-sensors-hwmon-attrs.patch \ + %D%/packages/patches/lua-pkgconfig.patch \ + %D%/packages/patches/lua51-liblua-so.patch \ + %D%/packages/patches/lua52-liblua-so.patch \ + %D%/packages/patches/luajit-no_ldconfig.patch \ + %D%/packages/patches/luajit-symlinks.patch \ + %D%/packages/patches/luit-posix.patch \ + %D%/packages/patches/m4-gets-undeclared.patch \ + %D%/packages/patches/make-impure-dirs.patch \ + %D%/packages/patches/mars-install.patch \ + %D%/packages/patches/mars-sfml-2.3.patch \ + %D%/packages/patches/matplotlib-setupext-tk.patch \ + %D%/packages/patches/maxima-defsystem-mkdir.patch \ + %D%/packages/patches/mcron-install.patch \ + %D%/packages/patches/mhash-keygen-test-segfault.patch \ + %D%/packages/patches/mit-krb5-CVE-2015-8629.patch \ + %D%/packages/patches/mit-krb5-CVE-2015-8630.patch \ + %D%/packages/patches/mit-krb5-CVE-2015-8631.patch \ + %D%/packages/patches/mit-krb5-init-context-null-spnego.patch \ + %D%/packages/patches/mpc123-initialize-ao.patch \ + %D%/packages/patches/mplayer2-theora-fix.patch \ + %D%/packages/patches/module-init-tools-moduledir.patch \ + %D%/packages/patches/mumps-build-parallelism.patch \ + %D%/packages/patches/mupen64plus-ui-console-notice.patch \ + %D%/packages/patches/mutt-store-references.patch \ + %D%/packages/patches/net-tools-bitrot.patch \ + %D%/packages/patches/netcdf-config-date.patch \ + %D%/packages/patches/ngircd-handle-zombies.patch \ + %D%/packages/patches/ngircd-no-dns-in-tests.patch \ + %D%/packages/patches/ninja-tests.patch \ + %D%/packages/patches/ninja-zero-mtime.patch \ + %D%/packages/patches/nss-pkgconfig.patch \ + %D%/packages/patches/nvi-assume-preserve-path.patch \ + %D%/packages/patches/nvi-dbpagesize-binpower.patch \ + %D%/packages/patches/nvi-db4.patch \ + %D%/packages/patches/ocaml-CVE-2015-8869.patch \ + %D%/packages/patches/ocaml-findlib-make-install.patch \ + %D%/packages/patches/openexr-missing-samples.patch \ + %D%/packages/patches/openimageio-boost-1.60.patch \ + %D%/packages/patches/openjpeg-CVE-2015-6581.patch \ + %D%/packages/patches/openjpeg-use-after-free-fix.patch \ + %D%/packages/patches/openssh-CVE-2015-8325.patch \ + %D%/packages/patches/openssl-runpath.patch \ + %D%/packages/patches/openssl-c-rehash-in.patch \ + %D%/packages/patches/orpheus-cast-errors-and-includes.patch \ + %D%/packages/patches/ots-no-include-missing-file.patch \ + %D%/packages/patches/patchelf-page-size.patch \ + %D%/packages/patches/patchelf-rework-for-arm.patch \ + %D%/packages/patches/patchutils-xfail-gendiff-tests.patch \ + %D%/packages/patches/patch-hurd-path-max.patch \ + %D%/packages/patches/pcre-CVE-2016-3191.patch \ + %D%/packages/patches/perl-CVE-2015-8607.patch \ + %D%/packages/patches/perl-CVE-2016-2381.patch \ + %D%/packages/patches/perl-autosplit-default-time.patch \ + %D%/packages/patches/perl-deterministic-ordering.patch \ + %D%/packages/patches/perl-finance-quote-unuse-mozilla-ca.patch \ + %D%/packages/patches/perl-gd-options-passthrough-and-fontconfig.patch \ + %D%/packages/patches/perl-io-socket-ssl-openssl-1.0.2f-fix.patch \ + %D%/packages/patches/perl-net-amazon-s3-moose-warning.patch \ + %D%/packages/patches/perl-net-ssleay-disable-ede-test.patch \ + %D%/packages/patches/perl-no-build-time.patch \ + %D%/packages/patches/perl-no-sys-dirs.patch \ + %D%/packages/patches/perl-module-pluggable-search.patch \ + %D%/packages/patches/perl-source-date-epoch.patch \ + %D%/packages/patches/pidgin-add-search-path.patch \ + %D%/packages/patches/pinball-const-fix.patch \ + %D%/packages/patches/pinball-cstddef.patch \ + %D%/packages/patches/pinball-missing-separators.patch \ + %D%/packages/patches/pinball-src-deps.patch \ + %D%/packages/patches/pinball-system-ltdl.patch \ + %D%/packages/patches/pingus-sdl-libs-config.patch \ + %D%/packages/patches/plink-1.07-unclobber-i.patch \ + %D%/packages/patches/plotutils-libpng-jmpbuf.patch \ + %D%/packages/patches/polkit-drop-test.patch \ + %D%/packages/patches/portaudio-audacity-compat.patch \ + %D%/packages/patches/portmidi-modular-build.patch \ + %D%/packages/patches/procmail-ambiguous-getline-debian.patch \ + %D%/packages/patches/pt-scotch-build-parallelism.patch \ + %D%/packages/patches/pulseaudio-fix-mult-test.patch \ + %D%/packages/patches/pulseaudio-longer-test-timeout.patch \ + %D%/packages/patches/pycairo-wscript.patch \ + %D%/packages/patches/pybugz-encode-error.patch \ + %D%/packages/patches/pybugz-stty.patch \ + %D%/packages/patches/pygpgme-disable-problematic-tests.patch \ + %D%/packages/patches/pyqt-configure.patch \ + %D%/packages/patches/python-2-deterministic-build-info.patch \ + %D%/packages/patches/python-2.7-search-paths.patch \ + %D%/packages/patches/python-2.7-source-date-epoch.patch \ + %D%/packages/patches/python-3-deterministic-build-info.patch \ + %D%/packages/patches/python-3-search-paths.patch \ + %D%/packages/patches/python-disable-ssl-test.patch \ + %D%/packages/patches/python-fix-tests.patch \ + %D%/packages/patches/python-ipython-inputhook-ctype.patch \ + %D%/packages/patches/python-rarfile-fix-tests.patch \ + %D%/packages/patches/python2-rdflib-drop-sparqlwrapper.patch \ + %D%/packages/patches/python-configobj-setuptools.patch \ + %D%/packages/patches/python-paste-remove-website-test.patch \ + %D%/packages/patches/python-paste-remove-timing-test.patch \ + %D%/packages/patches/python2-pygobject-2-gi-info-type-error-domain.patch \ + %D%/packages/patches/qt4-ldflags.patch \ + %D%/packages/patches/ratpoison-shell.patch \ + %D%/packages/patches/readline-link-ncurses.patch \ + %D%/packages/patches/ripperx-missing-file.patch \ + %D%/packages/patches/rsem-makefile.patch \ + %D%/packages/patches/ruby-symlinkfix.patch \ + %D%/packages/patches/sed-hurd-path-max.patch \ + %D%/packages/patches/scheme48-tests.patch \ + %D%/packages/patches/scotch-test-threading.patch \ + %D%/packages/patches/sdl-libx11-1.6.patch \ + %D%/packages/patches/serf-comment-style-fix.patch \ + %D%/packages/patches/serf-deflate-buckets-test-fix.patch \ + %D%/packages/patches/slim-session.patch \ + %D%/packages/patches/slim-config.patch \ + %D%/packages/patches/slim-sigusr1.patch \ + %D%/packages/patches/slurm-configure-remove-nonfree-contribs.patch \ + %D%/packages/patches/soprano-find-clucene.patch \ + %D%/packages/patches/sudo-CVE-2015-5602.patch \ + %D%/packages/patches/superlu-dist-scotchmetis.patch \ + %D%/packages/patches/synfig-build-fix.patch \ + %D%/packages/patches/tar-d_ino_in_dirent-fix.patch \ + %D%/packages/patches/tar-skip-unreliable-tests.patch \ + %D%/packages/patches/tcl-mkindex-deterministic.patch \ + %D%/packages/patches/tclxml-3.2-install.patch \ + %D%/packages/patches/tcsh-fix-autotest.patch \ + %D%/packages/patches/texi2html-document-encoding.patch \ + %D%/packages/patches/texi2html-i18n.patch \ + %D%/packages/patches/tidy-CVE-2015-5522+5523.patch \ + %D%/packages/patches/tinyxml-use-stl.patch \ + %D%/packages/patches/tk-find-library.patch \ + %D%/packages/patches/ttf2eot-cstddef.patch \ + %D%/packages/patches/ttfautohint-source-date-epoch.patch \ + %D%/packages/patches/tophat-build-with-later-seqan.patch \ + %D%/packages/patches/torsocks-dns-test.patch \ + %D%/packages/patches/totem-debug-format-fix.patch \ + %D%/packages/patches/unzip-CVE-2014-8139.patch \ + %D%/packages/patches/unzip-CVE-2014-8140.patch \ + %D%/packages/patches/unzip-CVE-2014-8141.patch \ + %D%/packages/patches/unzip-CVE-2014-9636.patch \ + %D%/packages/patches/unzip-CVE-2015-7696.patch \ + %D%/packages/patches/unzip-CVE-2015-7697.patch \ + %D%/packages/patches/unzip-allow-greater-hostver-values.patch \ + %D%/packages/patches/unzip-attribs-overflow.patch \ + %D%/packages/patches/unzip-overflow-on-invalid-input.patch \ + %D%/packages/patches/unzip-format-secure.patch \ + %D%/packages/patches/unzip-initialize-symlink-flag.patch \ + %D%/packages/patches/unzip-overflow-long-fsize.patch \ + %D%/packages/patches/unzip-remove-build-date.patch \ + %D%/packages/patches/util-linux-tests.patch \ + %D%/packages/patches/upower-builddir.patch \ + %D%/packages/patches/valgrind-enable-arm.patch \ + %D%/packages/patches/vorbis-tools-CVE-2015-6749.patch \ + %D%/packages/patches/vpnc-script.patch \ + %D%/packages/patches/vtk-mesa-10.patch \ + %D%/packages/patches/w3m-libgc.patch \ + %D%/packages/patches/w3m-force-ssl_verify_server-on.patch \ + %D%/packages/patches/w3m-disable-sslv2-and-sslv3.patch \ + %D%/packages/patches/w3m-disable-weak-ciphers.patch \ + %D%/packages/patches/weechat-python.patch \ + %D%/packages/patches/weex-vacopy.patch \ + %D%/packages/patches/wicd-bitrate-none-fix.patch \ + %D%/packages/patches/wicd-get-selected-profile-fix.patch \ + %D%/packages/patches/wicd-urwid-1.3.patch \ + %D%/packages/patches/wicd-wpa2-ttls.patch \ + %D%/packages/patches/wmctrl-64-fix.patch \ + %D%/packages/patches/woff2-libbrotli.patch \ + %D%/packages/patches/wpa-supplicant-CVE-2015-5310.patch \ + %D%/packages/patches/wpa-supplicant-CVE-2015-5314.patch \ + %D%/packages/patches/wpa-supplicant-CVE-2015-5315.patch \ + %D%/packages/patches/wpa-supplicant-CVE-2015-5316.patch \ + %D%/packages/patches/wpa-supplicant-CVE-2016-4476.patch \ + %D%/packages/patches/wpa-supplicant-CVE-2016-4477-pt1.patch \ + %D%/packages/patches/wpa-supplicant-CVE-2016-4477-pt2.patch \ + %D%/packages/patches/wpa-supplicant-CVE-2016-4477-pt3.patch \ + %D%/packages/patches/wpa-supplicant-CVE-2016-4477-pt4.patch \ + %D%/packages/patches/xdotool-fix-makefile.patch \ + %D%/packages/patches/xf86-video-ark-remove-mibstore.patch \ + %D%/packages/patches/xf86-video-ast-remove-mibstore.patch \ + %D%/packages/patches/xf86-video-geode-glibc-2.20.patch \ + %D%/packages/patches/xf86-video-glint-remove-mibstore.patch \ + %D%/packages/patches/xf86-video-i128-remove-mibstore.patch \ + %D%/packages/patches/xf86-video-intel-compat-api.patch \ + %D%/packages/patches/xf86-video-intel-glibc-2.20.patch \ + %D%/packages/patches/xf86-video-mach64-glibc-2.20.patch \ + %D%/packages/patches/xf86-video-nv-remove-mibstore.patch \ + %D%/packages/patches/xf86-video-openchrome-glibc-2.20.patch \ + %D%/packages/patches/xf86-video-tga-remove-mibstore.patch \ + %D%/packages/patches/xfce4-panel-plugins.patch \ + %D%/packages/patches/xfce4-session-fix-xflock4.patch \ + %D%/packages/patches/xfce4-settings-defaults.patch \ + %D%/packages/patches/xmodmap-asprintf.patch \ + %D%/packages/patches/zathura-plugindir-environment-variable.patch MISC_DISTRO_FILES = \ - gnu/packages/ld-wrapper.in + %D%/packages/ld-wrapper.in -bootstrapdir = $(guilemoduledir)/gnu/packages/bootstrap +bootstrapdir = $(guilemoduledir)/%D%/packages/bootstrap bootstrap_x86_64_linuxdir = $(bootstrapdir)/x86_64-linux bootstrap_i686_linuxdir = $(bootstrapdir)/i686-linux bootstrap_armhf_linuxdir = $(bootstrapdir)/armhf-linux bootstrap_mips64el_linuxdir = $(bootstrapdir)/mips64el-linux dist_bootstrap_x86_64_linux_DATA = \ - gnu/packages/bootstrap/x86_64-linux/bash \ - gnu/packages/bootstrap/x86_64-linux/mkdir \ - gnu/packages/bootstrap/x86_64-linux/tar \ - gnu/packages/bootstrap/x86_64-linux/xz + %D%/packages/bootstrap/x86_64-linux/bash \ + %D%/packages/bootstrap/x86_64-linux/mkdir \ + %D%/packages/bootstrap/x86_64-linux/tar \ + %D%/packages/bootstrap/x86_64-linux/xz dist_bootstrap_i686_linux_DATA = \ - gnu/packages/bootstrap/i686-linux/bash \ - gnu/packages/bootstrap/i686-linux/mkdir \ - gnu/packages/bootstrap/i686-linux/tar \ - gnu/packages/bootstrap/i686-linux/xz + %D%/packages/bootstrap/i686-linux/bash \ + %D%/packages/bootstrap/i686-linux/mkdir \ + %D%/packages/bootstrap/i686-linux/tar \ + %D%/packages/bootstrap/i686-linux/xz dist_bootstrap_armhf_linux_DATA = \ - gnu/packages/bootstrap/armhf-linux/bash \ - gnu/packages/bootstrap/armhf-linux/mkdir \ - gnu/packages/bootstrap/armhf-linux/tar \ - gnu/packages/bootstrap/armhf-linux/xz + %D%/packages/bootstrap/armhf-linux/bash \ + %D%/packages/bootstrap/armhf-linux/mkdir \ + %D%/packages/bootstrap/armhf-linux/tar \ + %D%/packages/bootstrap/armhf-linux/xz dist_bootstrap_mips64el_linux_DATA = \ - gnu/packages/bootstrap/mips64el-linux/bash \ - gnu/packages/bootstrap/mips64el-linux/mkdir \ - gnu/packages/bootstrap/mips64el-linux/tar \ - gnu/packages/bootstrap/mips64el-linux/xz + %D%/packages/bootstrap/mips64el-linux/bash \ + %D%/packages/bootstrap/mips64el-linux/mkdir \ + %D%/packages/bootstrap/mips64el-linux/tar \ + %D%/packages/bootstrap/mips64el-linux/xz # Big bootstrap binaries are not included in the tarball. Instead, they # are downloaded. nodist_bootstrap_x86_64_linux_DATA = \ - gnu/packages/bootstrap/x86_64-linux/guile-2.0.9.tar.xz + %D%/packages/bootstrap/x86_64-linux/guile-2.0.9.tar.xz nodist_bootstrap_i686_linux_DATA = \ - gnu/packages/bootstrap/i686-linux/guile-2.0.9.tar.xz + %D%/packages/bootstrap/i686-linux/guile-2.0.9.tar.xz nodist_bootstrap_armhf_linux_DATA = \ - gnu/packages/bootstrap/armhf-linux/guile-2.0.11.tar.xz + %D%/packages/bootstrap/armhf-linux/guile-2.0.11.tar.xz nodist_bootstrap_mips64el_linux_DATA = \ - gnu/packages/bootstrap/mips64el-linux/guile-2.0.9.tar.xz + %D%/packages/bootstrap/mips64el-linux/guile-2.0.9.tar.xz # Those files must remain executable, so they remain executable once # imported into the store. @@ -862,19 +862,19 @@ DOWNLOAD_FILE = \ $(GUILE) --no-auto-compile -L "$(top_builddir)" -L "$(top_srcdir)" \ "$(top_srcdir)/build-aux/download.scm" -gnu/packages/bootstrap/x86_64-linux/guile-2.0.9.tar.xz: +%D%/packages/bootstrap/x86_64-linux/guile-2.0.9.tar.xz: $(AM_V_DL)$(MKDIR_P) `dirname "$@"`; \ $(DOWNLOAD_FILE) "$@" \ "037b103522a2d0d7d69c7ffd8de683dfe5bb4b59c1fafd70b4ffd397fd2f57f0" -gnu/packages/bootstrap/i686-linux/guile-2.0.9.tar.xz: +%D%/packages/bootstrap/i686-linux/guile-2.0.9.tar.xz: $(AM_V_DL)$(MKDIR_P) `dirname "$@"`; \ $(DOWNLOAD_FILE) "$@" \ "b757cd46bf13ecac83fb8e955fb50096ac2d17bb610ca8eb816f29302a00a846" -gnu/packages/bootstrap/armhf-linux/guile-2.0.11.tar.xz: +%D%/packages/bootstrap/armhf-linux/guile-2.0.11.tar.xz: $(AM_V_DL)$(MKDIR_P) `dirname "$@"`; \ $(DOWNLOAD_FILE) "$@" \ "e551d05d4d385d6706ab8d574856a087758294dc90ab4c06e70a157a685e23d6" -gnu/packages/bootstrap/mips64el-linux/guile-2.0.9.tar.xz: +%D%/packages/bootstrap/mips64el-linux/guile-2.0.9.tar.xz: $(AM_V_DL)$(MKDIR_P) `dirname "$@"`; \ $(DOWNLOAD_FILE) "$@" \ "994680f0001346864aa2c2cc5110f380ee7518dcd701c614291682b8e948f73b" -- cgit v1.2.3 From 493e9a5a8f613764cfa396c33ee6cb381b0dbbef Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Tue, 24 May 2016 14:11:52 +0200 Subject: gnu: libxml2: Fix CVE-2016-3627 and CVE-2016-3705. * gnu/packages/patches/libxml2-CVE-2016-3627.patch, gnu/packages/patches/libxml2-CVE-2016-3705.patch: New files. * gnu/local.mk (dist_patch_DATA): Add them. * gnu/packages/xml.scm (libxml2)[replacement]: New field. (libxml2/fixed): New variable. --- gnu/local.mk | 2 + gnu/packages/patches/libxml2-CVE-2016-3627.patch | 61 +++++++++++++++++++++ gnu/packages/patches/libxml2-CVE-2016-3705.patch | 68 ++++++++++++++++++++++++ gnu/packages/xml.scm | 11 +++- 4 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/libxml2-CVE-2016-3627.patch create mode 100644 gnu/packages/patches/libxml2-CVE-2016-3705.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 99e43e1ed8..9cd9699499 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -606,6 +606,8 @@ dist_patch_DATA = \ %D%/packages/patches/libwmf-CVE-2015-0848+CVE-2015-4588.patch \ %D%/packages/patches/libwmf-CVE-2015-4695.patch \ %D%/packages/patches/libwmf-CVE-2015-4696.patch \ + %D%/packages/patches/libxml2-CVE-2016-3627.patch \ + %D%/packages/patches/libxml2-CVE-2016-3705.patch \ %D%/packages/patches/libxslt-CVE-2015-7995.patch \ %D%/packages/patches/lirc-localstatedir.patch \ %D%/packages/patches/libpthread-glibc-preparation.patch \ diff --git a/gnu/packages/patches/libxml2-CVE-2016-3627.patch b/gnu/packages/patches/libxml2-CVE-2016-3627.patch new file mode 100644 index 0000000000..782c9270cf --- /dev/null +++ b/gnu/packages/patches/libxml2-CVE-2016-3627.patch @@ -0,0 +1,61 @@ +From . + +From e5269fd1e83743f7e62c89eca45000c2e84e6edc Mon Sep 17 00:00:00 2001 +From: Peter Simons +Date: Thu, 14 Apr 2016 16:15:13 +0200 +Subject: [PATCH 1/2] xmlStringGetNodeList: limit the function to 1024 + recursions to avoid CVE-2016-3627 + +This patch prevents stack overflows like the one reported in +https://bugzilla.gnome.org/show_bug.cgi?id=762100. +--- + tree.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +Index: libxml2-2.9.3/tree.c +=================================================================== +--- libxml2-2.9.3.orig/tree.c ++++ libxml2-2.9.3/tree.c +@@ -1464,6 +1464,8 @@ out: + return(ret); + } + ++static xmlNodePtr xmlStringGetNodeListInternal(const xmlDoc *doc, const xmlChar *value, size_t recursionLevel); ++ + /** + * xmlStringGetNodeList: + * @doc: the document +@@ -1475,6 +1477,12 @@ out: + */ + xmlNodePtr + xmlStringGetNodeList(const xmlDoc *doc, const xmlChar *value) { ++ return xmlStringGetNodeListInternal(doc, value, 0); ++ } ++ ++xmlNodePtr ++xmlStringGetNodeListInternal(const xmlDoc *doc, const xmlChar *value, size_t recursionLevel) { ++ + xmlNodePtr ret = NULL, last = NULL; + xmlNodePtr node; + xmlChar *val; +@@ -1483,6 +1491,8 @@ xmlStringGetNodeList(const xmlDoc *doc, + xmlEntityPtr ent; + xmlBufPtr buf; + ++ if (recursionLevel > 1024) return(NULL); ++ + if (value == NULL) return(NULL); + + buf = xmlBufCreateSize(0); +@@ -1593,8 +1603,9 @@ xmlStringGetNodeList(const xmlDoc *doc, + else if ((ent != NULL) && (ent->children == NULL)) { + xmlNodePtr temp; + +- ent->children = xmlStringGetNodeList(doc, +- (const xmlChar*)node->content); ++ ent->children = xmlStringGetNodeListInternal(doc, ++ (const xmlChar*)node->content, ++ recursionLevel+1); + ent->owner = 1; + temp = ent->children; + while (temp) { diff --git a/gnu/packages/patches/libxml2-CVE-2016-3705.patch b/gnu/packages/patches/libxml2-CVE-2016-3705.patch new file mode 100644 index 0000000000..e803630f3a --- /dev/null +++ b/gnu/packages/patches/libxml2-CVE-2016-3705.patch @@ -0,0 +1,68 @@ +From . + +From 6f0af3f6b9b1c5f82a2bb5ded65923437fee5d21 Mon Sep 17 00:00:00 2001 +From: Peter Simons +Date: Fri, 15 Apr 2016 11:56:55 +0200 +Subject: [PATCH 2/2] Add missing increments of recursion depth counter to XML + parser. + +The functions xmlParserEntityCheck() and xmlParseAttValueComplex() used to call +xmlStringDecodeEntities() in a recursive context without incrementing the +'depth' counter in the parser context. Because of that omission, the parser +failed to detect attribute recursions in certain documents before running out +of stack space. +--- + parser.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/parser.c b/parser.c +index 9604a72..4da151f 100644 +--- a/parser.c ++++ b/parser.c +@@ -144,8 +144,10 @@ xmlParserEntityCheck(xmlParserCtxtPtr ctxt, size_t size, + + ent->checked = 1; + ++ ++ctxt->depth; + rep = xmlStringDecodeEntities(ctxt, ent->content, + XML_SUBSTITUTE_REF, 0, 0, 0); ++ --ctxt->depth; + + ent->checked = (ctxt->nbentities - oldnbent + 1) * 2; + if (rep != NULL) { +@@ -3966,8 +3968,10 @@ xmlParseEntityValue(xmlParserCtxtPtr ctxt, xmlChar **orig) { + * an entity declaration, it is bypassed and left as is. + * so XML_SUBSTITUTE_REF is not set here. + */ ++ ++ctxt->depth; + ret = xmlStringDecodeEntities(ctxt, buf, XML_SUBSTITUTE_PEREF, + 0, 0, 0); ++ --ctxt->depth; + if (orig != NULL) + *orig = buf; + else +@@ -4092,9 +4096,11 @@ xmlParseAttValueComplex(xmlParserCtxtPtr ctxt, int *attlen, int normalize) { + } else if ((ent != NULL) && + (ctxt->replaceEntities != 0)) { + if (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) { ++ ++ctxt->depth; + rep = xmlStringDecodeEntities(ctxt, ent->content, + XML_SUBSTITUTE_REF, + 0, 0, 0); ++ --ctxt->depth; + if (rep != NULL) { + current = rep; + while (*current != 0) { /* non input consuming */ +@@ -4130,8 +4136,10 @@ xmlParseAttValueComplex(xmlParserCtxtPtr ctxt, int *attlen, int normalize) { + (ent->content != NULL) && (ent->checked == 0)) { + unsigned long oldnbent = ctxt->nbentities; + ++ ++ctxt->depth; + rep = xmlStringDecodeEntities(ctxt, ent->content, + XML_SUBSTITUTE_REF, 0, 0, 0); ++ --ctxt->depth; + + ent->checked = (ctxt->nbentities - oldnbent + 1) * 2; + if (rep != NULL) { +-- +2.8.1 diff --git a/gnu/packages/xml.scm b/gnu/packages/xml.scm index 9eaf71aefa..96bb8b76c6 100644 --- a/gnu/packages/xml.scm +++ b/gnu/packages/xml.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2013, 2014, 2015 Ludovic Courtès +;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès ;;; Copyright © 2013, 2015 Andreas Enge ;;; Copyright © 2015 Eric Bavier ;;; Copyright © 2015 Sou Bunnbu @@ -77,6 +77,7 @@ things the parser might find in the XML document (like start tags).") (package (name "libxml2") (version "2.9.3") + (replacement libxml2/fixed) ;multiple CVEs (source (origin (method url-fetch) (uri (string-append "ftp://xmlsoft.org/libxml2/libxml2-" @@ -103,6 +104,14 @@ things the parser might find in the XML document (like start tags).") project (but it is usable outside of the Gnome platform).") (license license:x11))) +(define libxml2/fixed + (package + (inherit libxml2) + (source (origin + (inherit (package-source libxml2)) + (patches (search-patches "libxml2-CVE-2016-3627.patch" + "libxml2-CVE-2016-3705.patch")))))) + (define-public python-libxml2 (package (inherit libxml2) (name "python-libxml2") -- cgit v1.2.3 From 8f9ac90182c022c69600f17ef9c1149e029bc301 Mon Sep 17 00:00:00 2001 From: Roel Janssen Date: Tue, 24 May 2016 21:18:53 +0200 Subject: gnu: Rename texlive module to tex. * gnu/local.mk (GNU_SYSTEM_MODULES): Rename texlive.scm to tex.scm. * gnu/packages/texlive.scm: Rename file to tex.scm. * gnu/packages/tex.scm: Renamed from texlive.scm. * gnu/packages/algebra.scm: Adjust accordingly. * gnu/packages/docbook.scm: Likewise. * gnu/packages/engineering.scm: Likewise. * gnu/packages/gettext.scm: Likewise. * gnu/packages/gnome.scm: Likewise. * gnu/packages/lisp.scm: Likewise. * gnu/packages/maths.scm: Likewise. * gnu/packages/music.scm: Likewise. * gnu/packages/ocaml.scm: Likewise. * gnu/packages/photo.scm: Likewise. * gnu/packages/plotutils.scm: Likewise. * gnu/packages/python.scm: Likewise. * gnu/packages/scheme.scm: Likewise. --- gnu/local.mk | 2 +- gnu/packages/algebra.scm | 2 +- gnu/packages/docbook.scm | 2 +- gnu/packages/engineering.scm | 2 +- gnu/packages/gettext.scm | 2 +- gnu/packages/gnome.scm | 2 +- gnu/packages/lisp.scm | 2 +- gnu/packages/maths.scm | 2 +- gnu/packages/music.scm | 2 +- gnu/packages/ocaml.scm | 2 +- gnu/packages/photo.scm | 2 +- gnu/packages/plotutils.scm | 2 +- gnu/packages/python.scm | 2 +- gnu/packages/scheme.scm | 2 +- gnu/packages/tex.scm | 389 +++++++++++++++++++++++++++++++++++++++++++ gnu/packages/texlive.scm | 389 ------------------------------------------- 16 files changed, 403 insertions(+), 403 deletions(-) create mode 100644 gnu/packages/tex.scm delete mode 100644 gnu/packages/texlive.scm (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 9cd9699499..d836a88d90 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -325,7 +325,7 @@ GNU_SYSTEM_MODULES = \ %D%/packages/telephony.scm \ %D%/packages/terminals.scm \ %D%/packages/texinfo.scm \ - %D%/packages/texlive.scm \ + %D%/packages/tex.scm \ %D%/packages/textutils.scm \ %D%/packages/time.scm \ %D%/packages/tls.scm \ diff --git a/gnu/packages/algebra.scm b/gnu/packages/algebra.scm index 53f6f3e3d2..9518e65db6 100644 --- a/gnu/packages/algebra.scm +++ b/gnu/packages/algebra.scm @@ -37,7 +37,7 @@ #:use-module (gnu packages flex) #:use-module (gnu packages python) #:use-module (gnu packages tcsh) - #:use-module (gnu packages texlive) + #:use-module (gnu packages tex) #:use-module (gnu packages xiph) #:use-module (gnu packages xorg) #:use-module ((guix licenses) #:prefix license:) diff --git a/gnu/packages/docbook.scm b/gnu/packages/docbook.scm index 2bd86fe5d2..b8a8ba69dc 100644 --- a/gnu/packages/docbook.scm +++ b/gnu/packages/docbook.scm @@ -23,7 +23,7 @@ #:use-module (gnu packages compression) #:use-module (gnu packages imagemagick) #:use-module (gnu packages inkscape) - #:use-module (gnu packages texlive) + #:use-module (gnu packages tex) #:use-module (gnu packages python) #:use-module (gnu packages base) #:use-module (gnu packages xml) diff --git a/gnu/packages/engineering.scm b/gnu/packages/engineering.scm index c519ca59e7..46737157f3 100644 --- a/gnu/packages/engineering.scm +++ b/gnu/packages/engineering.scm @@ -52,7 +52,7 @@ #:use-module (gnu packages pkg-config) #:use-module (gnu packages qt) #:use-module (gnu packages tcl) - #:use-module (gnu packages texlive) + #:use-module (gnu packages tex) #:use-module (srfi srfi-1)) (define-public librecad diff --git a/gnu/packages/gettext.scm b/gnu/packages/gettext.scm index 50d480a4ad..34338f936b 100644 --- a/gnu/packages/gettext.scm +++ b/gnu/packages/gettext.scm @@ -28,7 +28,7 @@ #:use-module (guix build-system perl) #:use-module (gnu packages docbook) #:use-module (gnu packages perl) - #:use-module (gnu packages texlive) + #:use-module (gnu packages tex) #:use-module (gnu packages xml)) ;; Use that name to avoid clashes with Guile's 'gettext' procedure. diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm index c5d53d1e0a..04d9bb75bd 100644 --- a/gnu/packages/gnome.scm +++ b/gnu/packages/gnome.scm @@ -97,7 +97,7 @@ #:use-module (gnu packages geeqie) #:use-module (gnu packages gl) #:use-module (gnu packages compression) - #:use-module (gnu packages texlive) + #:use-module (gnu packages tex) #:use-module (gnu packages tls) #:use-module (gnu packages web) #:use-module (gnu packages webkit) diff --git a/gnu/packages/lisp.scm b/gnu/packages/lisp.scm index 85f3f3cebb..e349907f14 100644 --- a/gnu/packages/lisp.scm +++ b/gnu/packages/lisp.scm @@ -26,7 +26,7 @@ #:use-module (guix packages) #:use-module (gnu packages readline) #:use-module (gnu packages texinfo) - #:use-module (gnu packages texlive) + #:use-module (gnu packages tex) #:use-module (gnu packages m4) #:use-module (guix download) #:use-module (guix git-download) diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm index 19ed44f2c9..80e48ca58d 100644 --- a/gnu/packages/maths.scm +++ b/gnu/packages/maths.scm @@ -81,7 +81,7 @@ #:use-module (gnu packages tcsh) #:use-module (gnu packages tcl) #:use-module (gnu packages texinfo) - #:use-module (gnu packages texlive) + #:use-module (gnu packages tex) #:use-module (gnu packages tls) #:use-module (gnu packages wxwidgets) #:use-module (gnu packages xml) diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm index f2787ee2d1..50f9a70810 100644 --- a/gnu/packages/music.scm +++ b/gnu/packages/music.scm @@ -85,7 +85,7 @@ #:use-module (gnu packages sdl) #:use-module (gnu packages tcl) #:use-module (gnu packages texinfo) - #:use-module (gnu packages texlive) + #:use-module (gnu packages tex) #:use-module (gnu packages tls) #:use-module (gnu packages video) #:use-module (gnu packages web) diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm index aafae51d3f..a0a4b936db 100644 --- a/gnu/packages/ocaml.scm +++ b/gnu/packages/ocaml.scm @@ -38,7 +38,7 @@ #:use-module (gnu packages pkg-config) #:use-module (gnu packages compression) #:use-module (gnu packages xorg) - #:use-module (gnu packages texlive) + #:use-module (gnu packages tex) #:use-module (gnu packages ghostscript) #:use-module (gnu packages lynx) #:use-module (gnu packages perl) diff --git a/gnu/packages/photo.scm b/gnu/packages/photo.scm index 2592565a36..4b21926105 100644 --- a/gnu/packages/photo.scm +++ b/gnu/packages/photo.scm @@ -43,7 +43,7 @@ #:use-module (gnu packages pkg-config) #:use-module (gnu packages popt) #:use-module (gnu packages readline) - #:use-module (gnu packages texlive) + #:use-module (gnu packages tex) #:use-module (gnu packages web) #:use-module (gnu packages xfig) #:use-module (gnu packages xml)) diff --git a/gnu/packages/plotutils.scm b/gnu/packages/plotutils.scm index 5871fb0b55..3edb25a42a 100644 --- a/gnu/packages/plotutils.scm +++ b/gnu/packages/plotutils.scm @@ -38,7 +38,7 @@ #:use-module (gnu packages python) #:use-module (gnu packages readline) #:use-module (gnu packages texinfo) - #:use-module (gnu packages texlive) + #:use-module (gnu packages tex) #:use-module (gnu packages compression) #:use-module (gnu packages)) diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm index 8bd219d297..dc54bff4b5 100644 --- a/gnu/packages/python.scm +++ b/gnu/packages/python.scm @@ -68,7 +68,7 @@ #:use-module (gnu packages pkg-config) #:use-module (gnu packages readline) #:use-module (gnu packages statistics) - #:use-module (gnu packages texlive) + #:use-module (gnu packages tex) #:use-module (gnu packages texinfo) #:use-module (gnu packages tls) #:use-module (gnu packages version-control) diff --git a/gnu/packages/scheme.scm b/gnu/packages/scheme.scm index c378dc3349..6baee2b309 100644 --- a/gnu/packages/scheme.scm +++ b/gnu/packages/scheme.scm @@ -35,7 +35,7 @@ #:use-module (gnu packages databases) #:use-module (gnu packages emacs) #:use-module (gnu packages texinfo) - #:use-module (gnu packages texlive) + #:use-module (gnu packages tex) #:use-module (gnu packages base) #:use-module (gnu packages compression) #:use-module (gnu packages pkg-config) diff --git a/gnu/packages/tex.scm b/gnu/packages/tex.scm new file mode 100644 index 0000000000..eab85f15bf --- /dev/null +++ b/gnu/packages/tex.scm @@ -0,0 +1,389 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2013, 2014, 2015, 2016 Andreas Enge +;;; Copyright © 2014 Eric Bavier +;;; Copyright © 2015 Mark H Weaver +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix 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 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix 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 GNU Guix. If not, see . + +(define-module (gnu packages tex) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix packages) + #:use-module (guix download) + #:use-module (guix build-system gnu) + #:use-module (guix build-system trivial) + #:use-module (guix utils) + #:use-module (gnu packages) + #:use-module (gnu packages bash) + #:use-module (gnu packages compression) + #:use-module (gnu packages fontutils) + #:use-module (gnu packages gd) + #:use-module (gnu packages ghostscript) + #:use-module (gnu packages gtk) + #:use-module (gnu packages icu4c) + #:use-module (gnu packages image) + #:use-module (gnu packages lua) + #:use-module (gnu packages multiprecision) + #:use-module (gnu packages pdf) + #:use-module (gnu packages perl) + #:use-module (gnu packages pkg-config) + #:use-module (gnu packages python) + #:use-module (gnu packages ruby) + #:use-module (gnu packages tcsh) + #:use-module (gnu packages base) + #:use-module (gnu packages xorg) + #:use-module (gnu packages xdisorg) + #:use-module (gnu packages zip) + #:autoload (gnu packages texinfo) (texinfo) + #:use-module (ice-9 ftw) + #:use-module (srfi srfi-1)) + +(define texlive-extra-src + (origin + (method url-fetch) + (uri "ftp://tug.org/historic/systems/texlive/2015/texlive-20150523-extra.tar.xz") + (sha256 (base32 + "1dkhhacga8h1v2m9xv1w02glbdda2m8lfp1la1y1zb9yjj8jsa6i")))) + +(define texlive-texmf-src + (origin + (method url-fetch) + (uri "ftp://tug.org/historic/systems/texlive/2015/texlive-20150523-texmf.tar.xz") + (sha256 (base32 + "1a3hpcg6x69ysqx432v6sk4alg0x34813cwk41frmvzprdajpyqy")))) + +(define texlive-bin + (package + (name "texlive-bin") + (version "2015") + (source + (origin + (method url-fetch) + (uri "ftp://tug.org/historic/systems/texlive/2015/texlive-20150521-source.tar.xz") + (sha256 (base32 + "0sa6kmz4jwhv6lw702gxszhhjkvw071wba0ngk1c76g8vixwv6zd")))) + (build-system gnu-build-system) + (inputs + `(("texlive-extra-src" ,texlive-extra-src) + ("cairo" ,cairo) + ("fontconfig" ,fontconfig) + ("fontforge" ,fontforge) + ("freetype" ,freetype) + ("gd" ,gd) + ("gmp" ,gmp) + ("ghostscript" ,ghostscript) + ("graphite2" ,graphite2) + ("harfbuzz" ,harfbuzz) + ("icu4c" ,icu4c) + ("libpaper" ,libpaper) + ("libpng" ,libpng) + ("libxaw" ,libxaw) + ("libxt" ,libxt) + ("mpfr" ,mpfr) + ("perl" ,perl) + ("pixman" ,pixman) + ("poppler" ,poppler) + ("potrace" ,potrace) + ("python" ,python-2) ; incompatible with Python 3 (print syntax) + ("ruby" ,ruby) + ("tcsh" ,tcsh) + ("teckit" ,teckit) + ("zlib" ,zlib) + ("zziplib" ,zziplib))) + (native-inputs + `(("pkg-config" ,pkg-config))) + (arguments + `(#:out-of-source? #t + #:configure-flags + `("--disable-native-texlive-build" + "--with-system-cairo" + "--with-system-freetype2" + "--with-system-gd" + "--with-system-gmp" + "--with-system-graphite2" + "--with-system-harfbuzz" + "--with-system-icu" + "--with-system-libgs" + "--with-system-libpaper" + "--with-system-libpng" + "--with-system-mpfr" + "--with-system-pixman" + "--with-system-poppler" + "--with-system-potrace" + "--with-system-teckit" + "--with-system-xpdf" + "--with-system-zlib" + "--with-system-zziplib") + + ;; Disable tests on mips64 to cope with a failure of luajiterr.test. + ;; XXX FIXME fix luajit properly on mips64. + #:tests? ,(not (string-prefix? "mips64" (or (%current-target-system) + (%current-system)))) + #:phases + (modify-phases %standard-phases + (add-after 'install 'postint + (lambda* (#:key inputs outputs #:allow-other-keys #:rest args) + (let* ((out (assoc-ref outputs "out")) + (share (string-append out "/share")) + (texlive-extra (assoc-ref inputs "texlive-extra-src")) + (unpack (assoc-ref %standard-phases 'unpack)) + (patch-source-shebangs + (assoc-ref %standard-phases 'patch-source-shebangs))) + ;; Create symbolic links for the latex variants and their + ;; man pages. + (with-directory-excursion (string-append out "/bin/") + (for-each symlink + '("pdftex" "pdftex" "xetex" "luatex") + '("latex" "pdflatex" "xelatex" "lualatex"))) + (with-directory-excursion (string-append share "/man/man1/") + (symlink "luatex.1" "lualatex.1")) + ;; Unpack texlive-extra and install tlpkg. + (mkdir "texlive-extra") + (with-directory-excursion "texlive-extra" + (apply unpack (list #:source texlive-extra)) + (apply patch-source-shebangs (list #:source texlive-extra)) + (system* "mv" "tlpkg" share)))))))) + (synopsis "TeX Live, a package of the TeX typesetting system") + (description + "TeX Live provides a comprehensive TeX document production system. +It includes all the major TeX-related programs, macro packages, and fonts +that are free software, including support for many languages around the +world. + +This package contains the binaries.") + (license (license:fsf-free "http://tug.org/texlive/copying.html")) + (home-page "http://www.tug.org/texlive/"))) + +(define texlive-texmf + (package + (name "texlive-texmf") + (version "2015") + (source texlive-texmf-src) + (build-system gnu-build-system) + (inputs + `(("texlive-bin" ,texlive-bin) + ("lua" ,lua) + ("perl" ,perl) + ("python" ,python-2) ; incompatible with Python 3 (print syntax) + ("ruby" ,ruby) + ("tcsh" ,tcsh))) + (arguments + `(#:modules ((guix build gnu-build-system) + (guix build utils) + (srfi srfi-26)) + #:phases + (modify-phases (map (cut assq <> %standard-phases) + '(set-paths unpack patch-source-shebangs)) + (add-after 'patch-source-shebangs 'install + (lambda* (#:key outputs #:allow-other-keys) + (let ((share (string-append (assoc-ref outputs "out") "/share"))) + (mkdir-p share) + (system* "mv" "texmf-dist" share)))) + (add-after 'install 'texmf-config + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (share (string-append out "/share")) + (texmfroot (string-append share "/texmf-dist/web2c")) + (texmfcnf (string-append texmfroot "/texmf.cnf")) + (texlive-bin (assoc-ref inputs "texlive-bin")) + (texbin (string-append texlive-bin "/bin")) + (tlpkg (string-append texlive-bin "/share/tlpkg"))) + ;; Register SHARE as TEXMFROOT in texmf.cnf. + (substitute* texmfcnf + (("TEXMFROOT = \\$SELFAUTOPARENT") + (string-append "TEXMFROOT = " share))) + ;; Register paths in texmfcnf.lua, needed for context. + (substitute* (string-append texmfroot "/texmfcnf.lua") + (("selfautodir:") out) + (("selfautoparent:") (string-append share "/"))) + ;; Set path to TeXLive Perl modules + (setenv "PERL5LIB" + (string-append (getenv "PERL5LIB") ":" tlpkg)) + ;; Configure the texmf-dist tree; inspired from + ;; http://slackbuilds.org/repository/13.37/office/texlive/ + (setenv "PATH" (string-append (getenv "PATH") ":" texbin)) + (setenv "TEXMFCNF" texmfroot) + (system* "updmap-sys" "--nohash" "--syncwithtrees") + (system* "mktexlsr") + (system* "fmtutil-sys" "--all"))))))) + (synopsis "TeX Live, a package of the TeX typesetting system") + (description + "TeX Live provides a comprehensive TeX document production system. +It includes all the major TeX-related programs, macro packages, and fonts +that are free software, including support for many languages around the +world. + +This package contains the complete tree of texmf-dist data.") + (license (license:fsf-free "http://tug.org/texlive/copying.html")) + (home-page "http://www.tug.org/texlive/"))) + +(define-public texlive + (package + (name "texlive") + (version "2015") + (source #f) + (build-system trivial-build-system) + (inputs `(("bash" ,bash) ; for wrap-program + ("texlive-bin" ,texlive-bin) + ("texlive-texmf" ,texlive-texmf))) + (arguments + `(#:modules ((guix build utils)) + #:builder + ;; Build the union of texlive-bin and texlive-texmf, but take the + ;; conflicting subdirectory share/texmf-dist from texlive-texmf. + (begin + (use-modules (guix build utils)) + (let ((out (assoc-ref %outputs "out")) + (bin (assoc-ref %build-inputs "texlive-bin")) + (texmf (assoc-ref %build-inputs "texlive-texmf")) + (bash (assoc-ref %build-inputs "bash"))) + (mkdir out) + (with-directory-excursion out + (for-each + (lambda (name) + (symlink (string-append bin "/" name) name)) + '("include" "lib")) + (mkdir "bin") + (with-directory-excursion "bin" + (setenv "PATH" (string-append bash "/bin")) + (for-each + (lambda (name) + (symlink name (basename name)) + (wrap-program + (basename name) + `("TEXMFCNF" = + (,(string-append texmf "/share/texmf-dist/web2c"))))) + (find-files (string-append bin "/bin/") ""))) + (mkdir "share") + (with-directory-excursion "share" + (for-each + (lambda (name) + (symlink (string-append bin "/share/" name) name)) + '("info" "man" "tlpkg")) + (for-each + (lambda (name) + (symlink (string-append texmf "/share/" name) name)) + '("texmf-dist" "texmf-var")))))))) + (synopsis "TeX Live, a package of the TeX typesetting system") + (description + "TeX Live provides a comprehensive TeX document production system. +It includes all the major TeX-related programs, macro packages, and fonts +that are free software, including support for many languages around the +world. + +This package contains the complete TeX Live distribution.") + (license (license:fsf-free "http://tug.org/texlive/copying.html")) + (home-page "http://www.tug.org/texlive/"))) + + +;; texlive-texmf-minimal is a pruned, small version of the texlive tree, +;; in particular dropping documentation and fonts. +(define texlive-texmf-minimal + (package (inherit texlive-texmf) + (name "texlive-texmf-minimal") + (arguments + (substitute-keyword-arguments + (package-arguments texlive-texmf) + ((#:modules modules) + `((ice-9 ftw) + (srfi srfi-1) + ,@modules)) + ((#:phases phases) + `(modify-phases ,phases + (add-after 'unpack 'prune + (lambda _ + (define (delete subdir exclude) + "Delete all files and directories in SUBDIR except for those +given in the list EXCLUDE." + (with-directory-excursion subdir + (for-each delete-file-recursively + (lset-difference equal? + (scandir ".") + (append '("." "..") + exclude))))) + (with-directory-excursion "texmf-dist" + (for-each delete-file-recursively + '("doc" "source" "tex4ht")) + ;; Delete all subdirectories of "fonts", except for "tfm" and + ;; any directories named "cm". + (delete "fonts" '("afm" "map" "pk" "source" "tfm" "type1")) + (delete "fonts/afm" '("public")) + (delete "fonts/afm/public" '("amsfonts")) + (delete "fonts/afm/public/amsfonts" '("cm")) + (delete "fonts/map" '("dvips")) + (delete "fonts/map/dvips" '("cm")) + (delete "fonts/source" '("public")) + (delete "fonts/source/public" '("cm")) + (delete "fonts/tfm" '("public")) + (delete "fonts/type1" '("public")) + (delete "fonts/type1/public" '("amsfonts")) + (delete "fonts/type1/public/amsfonts" '("cm"))) + #t)))))) + (description + "TeX Live provides a comprehensive TeX document production system. +It includes all the major TeX-related programs, macro packages, and fonts +that are free software, including support for many languages around the +world. + +This package contains a small subset of the texmf-dist data."))) + + +;; texlive-minimal is the same as texlive, but using texlive-texmf-minimal +;; instead of the full texlive-texmf. It can be used, for instance, as a +;; native input to packages that need texlive to build their documentation. +(define-public texlive-minimal + (package (inherit texlive) + (name "texlive-minimal") + (inputs + `(("texlive-texmf" ,texlive-texmf-minimal) + ,@(alist-delete "texlive-texmf" (package-inputs texlive)))) + (description + "TeX Live provides a comprehensive TeX document production system. +It includes all the major TeX-related programs, macro packages, and fonts +that are free software, including support for many languages around the +world. + +This package contains a small working part of the TeX Live distribution."))) + + +(define-public rubber + (package + (name "rubber") + (version "1.1") + (source (origin + (method url-fetch) + (uri (list (string-append "https://launchpad.net/rubber/trunk/" + version "/+download/rubber-" + version ".tar.gz") + (string-append "http://ebeffara.free.fr/pub/rubber-" + version ".tar.gz"))) + (sha256 + (base32 + "1xbkv8ll889933gyi2a5hj7hhh216k04gn8fwz5lfv5iz8s34gbq")))) + (build-system gnu-build-system) + (arguments '(#:tests? #f)) ; no `check' target + (inputs `(("texinfo" ,texinfo) + ("python" ,python-2) ; incompatible with Python 3 (print syntax) + ("which" ,which))) + (home-page "https://launchpad.net/rubber") + (synopsis "Wrapper for LaTeX and friends") + (description + "Rubber is a program whose purpose is to handle all tasks related to the +compilation of LaTeX documents. This includes compiling the document itself, +of course, enough times so that all references are defined, and running BibTeX +to manage bibliographic references. Automatic execution of dvips to produce +PostScript documents is also included, as well as usage of pdfLaTeX to produce +PDF documents.") + (license license:gpl2+))) diff --git a/gnu/packages/texlive.scm b/gnu/packages/texlive.scm deleted file mode 100644 index cbcb6c87fc..0000000000 --- a/gnu/packages/texlive.scm +++ /dev/null @@ -1,389 +0,0 @@ -;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2013, 2014, 2015, 2016 Andreas Enge -;;; Copyright © 2014 Eric Bavier -;;; Copyright © 2015 Mark H Weaver -;;; -;;; This file is part of GNU Guix. -;;; -;;; GNU Guix 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 3 of the License, or (at -;;; your option) any later version. -;;; -;;; GNU Guix 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 GNU Guix. If not, see . - -(define-module (gnu packages texlive) - #:use-module ((guix licenses) #:prefix license:) - #:use-module (guix packages) - #:use-module (guix download) - #:use-module (guix build-system gnu) - #:use-module (guix build-system trivial) - #:use-module (guix utils) - #:use-module (gnu packages) - #:use-module (gnu packages bash) - #:use-module (gnu packages compression) - #:use-module (gnu packages fontutils) - #:use-module (gnu packages gd) - #:use-module (gnu packages ghostscript) - #:use-module (gnu packages gtk) - #:use-module (gnu packages icu4c) - #:use-module (gnu packages image) - #:use-module (gnu packages lua) - #:use-module (gnu packages multiprecision) - #:use-module (gnu packages pdf) - #:use-module (gnu packages perl) - #:use-module (gnu packages pkg-config) - #:use-module (gnu packages python) - #:use-module (gnu packages ruby) - #:use-module (gnu packages tcsh) - #:use-module (gnu packages base) - #:use-module (gnu packages xorg) - #:use-module (gnu packages xdisorg) - #:use-module (gnu packages zip) - #:autoload (gnu packages texinfo) (texinfo) - #:use-module (ice-9 ftw) - #:use-module (srfi srfi-1)) - -(define texlive-extra-src - (origin - (method url-fetch) - (uri "ftp://tug.org/historic/systems/texlive/2015/texlive-20150523-extra.tar.xz") - (sha256 (base32 - "1dkhhacga8h1v2m9xv1w02glbdda2m8lfp1la1y1zb9yjj8jsa6i")))) - -(define texlive-texmf-src - (origin - (method url-fetch) - (uri "ftp://tug.org/historic/systems/texlive/2015/texlive-20150523-texmf.tar.xz") - (sha256 (base32 - "1a3hpcg6x69ysqx432v6sk4alg0x34813cwk41frmvzprdajpyqy")))) - -(define texlive-bin - (package - (name "texlive-bin") - (version "2015") - (source - (origin - (method url-fetch) - (uri "ftp://tug.org/historic/systems/texlive/2015/texlive-20150521-source.tar.xz") - (sha256 (base32 - "0sa6kmz4jwhv6lw702gxszhhjkvw071wba0ngk1c76g8vixwv6zd")))) - (build-system gnu-build-system) - (inputs - `(("texlive-extra-src" ,texlive-extra-src) - ("cairo" ,cairo) - ("fontconfig" ,fontconfig) - ("fontforge" ,fontforge) - ("freetype" ,freetype) - ("gd" ,gd) - ("gmp" ,gmp) - ("ghostscript" ,ghostscript) - ("graphite2" ,graphite2) - ("harfbuzz" ,harfbuzz) - ("icu4c" ,icu4c) - ("libpaper" ,libpaper) - ("libpng" ,libpng) - ("libxaw" ,libxaw) - ("libxt" ,libxt) - ("mpfr" ,mpfr) - ("perl" ,perl) - ("pixman" ,pixman) - ("poppler" ,poppler) - ("potrace" ,potrace) - ("python" ,python-2) ; incompatible with Python 3 (print syntax) - ("ruby" ,ruby) - ("tcsh" ,tcsh) - ("teckit" ,teckit) - ("zlib" ,zlib) - ("zziplib" ,zziplib))) - (native-inputs - `(("pkg-config" ,pkg-config))) - (arguments - `(#:out-of-source? #t - #:configure-flags - `("--disable-native-texlive-build" - "--with-system-cairo" - "--with-system-freetype2" - "--with-system-gd" - "--with-system-gmp" - "--with-system-graphite2" - "--with-system-harfbuzz" - "--with-system-icu" - "--with-system-libgs" - "--with-system-libpaper" - "--with-system-libpng" - "--with-system-mpfr" - "--with-system-pixman" - "--with-system-poppler" - "--with-system-potrace" - "--with-system-teckit" - "--with-system-xpdf" - "--with-system-zlib" - "--with-system-zziplib") - - ;; Disable tests on mips64 to cope with a failure of luajiterr.test. - ;; XXX FIXME fix luajit properly on mips64. - #:tests? ,(not (string-prefix? "mips64" (or (%current-target-system) - (%current-system)))) - #:phases - (modify-phases %standard-phases - (add-after 'install 'postint - (lambda* (#:key inputs outputs #:allow-other-keys #:rest args) - (let* ((out (assoc-ref outputs "out")) - (share (string-append out "/share")) - (texlive-extra (assoc-ref inputs "texlive-extra-src")) - (unpack (assoc-ref %standard-phases 'unpack)) - (patch-source-shebangs - (assoc-ref %standard-phases 'patch-source-shebangs))) - ;; Create symbolic links for the latex variants and their - ;; man pages. - (with-directory-excursion (string-append out "/bin/") - (for-each symlink - '("pdftex" "pdftex" "xetex" "luatex") - '("latex" "pdflatex" "xelatex" "lualatex"))) - (with-directory-excursion (string-append share "/man/man1/") - (symlink "luatex.1" "lualatex.1")) - ;; Unpack texlive-extra and install tlpkg. - (mkdir "texlive-extra") - (with-directory-excursion "texlive-extra" - (apply unpack (list #:source texlive-extra)) - (apply patch-source-shebangs (list #:source texlive-extra)) - (system* "mv" "tlpkg" share)))))))) - (synopsis "TeX Live, a package of the TeX typesetting system") - (description - "TeX Live provides a comprehensive TeX document production system. -It includes all the major TeX-related programs, macro packages, and fonts -that are free software, including support for many languages around the -world. - -This package contains the binaries.") - (license (license:fsf-free "http://tug.org/texlive/copying.html")) - (home-page "http://www.tug.org/texlive/"))) - -(define texlive-texmf - (package - (name "texlive-texmf") - (version "2015") - (source texlive-texmf-src) - (build-system gnu-build-system) - (inputs - `(("texlive-bin" ,texlive-bin) - ("lua" ,lua) - ("perl" ,perl) - ("python" ,python-2) ; incompatible with Python 3 (print syntax) - ("ruby" ,ruby) - ("tcsh" ,tcsh))) - (arguments - `(#:modules ((guix build gnu-build-system) - (guix build utils) - (srfi srfi-26)) - #:phases - (modify-phases (map (cut assq <> %standard-phases) - '(set-paths unpack patch-source-shebangs)) - (add-after 'patch-source-shebangs 'install - (lambda* (#:key outputs #:allow-other-keys) - (let ((share (string-append (assoc-ref outputs "out") "/share"))) - (mkdir-p share) - (system* "mv" "texmf-dist" share)))) - (add-after 'install 'texmf-config - (lambda* (#:key inputs outputs #:allow-other-keys) - (let* ((out (assoc-ref outputs "out")) - (share (string-append out "/share")) - (texmfroot (string-append share "/texmf-dist/web2c")) - (texmfcnf (string-append texmfroot "/texmf.cnf")) - (texlive-bin (assoc-ref inputs "texlive-bin")) - (texbin (string-append texlive-bin "/bin")) - (tlpkg (string-append texlive-bin "/share/tlpkg"))) - ;; Register SHARE as TEXMFROOT in texmf.cnf. - (substitute* texmfcnf - (("TEXMFROOT = \\$SELFAUTOPARENT") - (string-append "TEXMFROOT = " share))) - ;; Register paths in texmfcnf.lua, needed for context. - (substitute* (string-append texmfroot "/texmfcnf.lua") - (("selfautodir:") out) - (("selfautoparent:") (string-append share "/"))) - ;; Set path to TeXLive Perl modules - (setenv "PERL5LIB" - (string-append (getenv "PERL5LIB") ":" tlpkg)) - ;; Configure the texmf-dist tree; inspired from - ;; http://slackbuilds.org/repository/13.37/office/texlive/ - (setenv "PATH" (string-append (getenv "PATH") ":" texbin)) - (setenv "TEXMFCNF" texmfroot) - (system* "updmap-sys" "--nohash" "--syncwithtrees") - (system* "mktexlsr") - (system* "fmtutil-sys" "--all"))))))) - (synopsis "TeX Live, a package of the TeX typesetting system") - (description - "TeX Live provides a comprehensive TeX document production system. -It includes all the major TeX-related programs, macro packages, and fonts -that are free software, including support for many languages around the -world. - -This package contains the complete tree of texmf-dist data.") - (license (license:fsf-free "http://tug.org/texlive/copying.html")) - (home-page "http://www.tug.org/texlive/"))) - -(define-public texlive - (package - (name "texlive") - (version "2015") - (source #f) - (build-system trivial-build-system) - (inputs `(("bash" ,bash) ; for wrap-program - ("texlive-bin" ,texlive-bin) - ("texlive-texmf" ,texlive-texmf))) - (arguments - `(#:modules ((guix build utils)) - #:builder - ;; Build the union of texlive-bin and texlive-texmf, but take the - ;; conflicting subdirectory share/texmf-dist from texlive-texmf. - (begin - (use-modules (guix build utils)) - (let ((out (assoc-ref %outputs "out")) - (bin (assoc-ref %build-inputs "texlive-bin")) - (texmf (assoc-ref %build-inputs "texlive-texmf")) - (bash (assoc-ref %build-inputs "bash"))) - (mkdir out) - (with-directory-excursion out - (for-each - (lambda (name) - (symlink (string-append bin "/" name) name)) - '("include" "lib")) - (mkdir "bin") - (with-directory-excursion "bin" - (setenv "PATH" (string-append bash "/bin")) - (for-each - (lambda (name) - (symlink name (basename name)) - (wrap-program - (basename name) - `("TEXMFCNF" = - (,(string-append texmf "/share/texmf-dist/web2c"))))) - (find-files (string-append bin "/bin/") ""))) - (mkdir "share") - (with-directory-excursion "share" - (for-each - (lambda (name) - (symlink (string-append bin "/share/" name) name)) - '("info" "man" "tlpkg")) - (for-each - (lambda (name) - (symlink (string-append texmf "/share/" name) name)) - '("texmf-dist" "texmf-var")))))))) - (synopsis "TeX Live, a package of the TeX typesetting system") - (description - "TeX Live provides a comprehensive TeX document production system. -It includes all the major TeX-related programs, macro packages, and fonts -that are free software, including support for many languages around the -world. - -This package contains the complete TeX Live distribution.") - (license (license:fsf-free "http://tug.org/texlive/copying.html")) - (home-page "http://www.tug.org/texlive/"))) - - -;; texlive-texmf-minimal is a pruned, small version of the texlive tree, -;; in particular dropping documentation and fonts. -(define texlive-texmf-minimal - (package (inherit texlive-texmf) - (name "texlive-texmf-minimal") - (arguments - (substitute-keyword-arguments - (package-arguments texlive-texmf) - ((#:modules modules) - `((ice-9 ftw) - (srfi srfi-1) - ,@modules)) - ((#:phases phases) - `(modify-phases ,phases - (add-after 'unpack 'prune - (lambda _ - (define (delete subdir exclude) - "Delete all files and directories in SUBDIR except for those -given in the list EXCLUDE." - (with-directory-excursion subdir - (for-each delete-file-recursively - (lset-difference equal? - (scandir ".") - (append '("." "..") - exclude))))) - (with-directory-excursion "texmf-dist" - (for-each delete-file-recursively - '("doc" "source" "tex4ht")) - ;; Delete all subdirectories of "fonts", except for "tfm" and - ;; any directories named "cm". - (delete "fonts" '("afm" "map" "pk" "source" "tfm" "type1")) - (delete "fonts/afm" '("public")) - (delete "fonts/afm/public" '("amsfonts")) - (delete "fonts/afm/public/amsfonts" '("cm")) - (delete "fonts/map" '("dvips")) - (delete "fonts/map/dvips" '("cm")) - (delete "fonts/source" '("public")) - (delete "fonts/source/public" '("cm")) - (delete "fonts/tfm" '("public")) - (delete "fonts/type1" '("public")) - (delete "fonts/type1/public" '("amsfonts")) - (delete "fonts/type1/public/amsfonts" '("cm"))) - #t)))))) - (description - "TeX Live provides a comprehensive TeX document production system. -It includes all the major TeX-related programs, macro packages, and fonts -that are free software, including support for many languages around the -world. - -This package contains a small subset of the texmf-dist data."))) - - -;; texlive-minimal is the same as texlive, but using texlive-texmf-minimal -;; instead of the full texlive-texmf. It can be used, for instance, as a -;; native input to packages that need texlive to build their documentation. -(define-public texlive-minimal - (package (inherit texlive) - (name "texlive-minimal") - (inputs - `(("texlive-texmf" ,texlive-texmf-minimal) - ,@(alist-delete "texlive-texmf" (package-inputs texlive)))) - (description - "TeX Live provides a comprehensive TeX document production system. -It includes all the major TeX-related programs, macro packages, and fonts -that are free software, including support for many languages around the -world. - -This package contains a small working part of the TeX Live distribution."))) - - -(define-public rubber - (package - (name "rubber") - (version "1.1") - (source (origin - (method url-fetch) - (uri (list (string-append "https://launchpad.net/rubber/trunk/" - version "/+download/rubber-" - version ".tar.gz") - (string-append "http://ebeffara.free.fr/pub/rubber-" - version ".tar.gz"))) - (sha256 - (base32 - "1xbkv8ll889933gyi2a5hj7hhh216k04gn8fwz5lfv5iz8s34gbq")))) - (build-system gnu-build-system) - (arguments '(#:tests? #f)) ; no `check' target - (inputs `(("texinfo" ,texinfo) - ("python" ,python-2) ; incompatible with Python 3 (print syntax) - ("which" ,which))) - (home-page "https://launchpad.net/rubber") - (synopsis "Wrapper for LaTeX and friends") - (description - "Rubber is a program whose purpose is to handle all tasks related to the -compilation of LaTeX documents. This includes compiling the document itself, -of course, enough times so that all references are defined, and running BibTeX -to manage bibliographic references. Automatic execution of dvips to produce -PostScript documents is also included, as well as usage of pdfLaTeX to produce -PDF documents.") - (license license:gpl2+))) -- cgit v1.2.3 From 9698f4b74bc37439971e4b040421cc591eb1b9b7 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Tue, 24 May 2016 12:53:18 -0400 Subject: gnu: Add mitlm. * gnu/packages/speech.scm: New file. * gnu/local.mk (GNU_SYSTEM_MODULES): Add it. --- gnu/local.mk | 1 + gnu/packages/speech.scm | 51 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 gnu/packages/speech.scm (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index d836a88d90..6f56039b7e 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -311,6 +311,7 @@ GNU_SYSTEM_MODULES = \ %D%/packages/slang.scm \ %D%/packages/slim.scm \ %D%/packages/smalltalk.scm \ + %D%/packages/speech.scm \ %D%/packages/ssh.scm \ %D%/packages/stalonetray.scm \ %D%/packages/statistics.scm \ diff --git a/gnu/packages/speech.scm b/gnu/packages/speech.scm new file mode 100644 index 0000000000..95c7591480 --- /dev/null +++ b/gnu/packages/speech.scm @@ -0,0 +1,51 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016 David Thompson +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix 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 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix 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 GNU Guix. If not, see . + +(define-module (gnu packages speech) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix packages) + #:use-module (guix download) + #:use-module (guix build-system gnu) + #:use-module (gnu packages) + #:use-module (gnu packages gcc)) + +(define-public mitlm + (package + (name "mitlm") + (version "0.4.1") + ;; No official release tarballs, so for now we use the one from Debian + ;; that is maintained by one of the project developers. + ;; + ;; See: https://github.com/mitlm/mitlm/issues/54 + (source (origin + (method url-fetch) + (uri (string-append "mirror://debian/pool/main/m/mitlm/mitlm_" + version ".orig.tar.gz")) + (sha256 + (base32 + "12m09xxx8jbir9cnzzaysvni5sfijpfj96z1x1520qqvmpc8lmn7")))) + (build-system gnu-build-system) + (native-inputs + `(("gfortran" ,gfortran))) + (synopsis "The MIT Language Modeling toolkit") + (description "The MIT Language Modeling (MITLM) toolkit is a set of +tools designed for the efficient estimation of statistical n-gram language +models involving iterative parameter estimation. It achieves much of its +efficiency through the use of a compact vector representation of n-grams.") + (home-page "https://github.com/mitlm/mitlm") + (license license:expat))) -- cgit v1.2.3 From 2ca55f939ca32f506a307a00f07eb2b027cfb812 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Thu, 26 May 2016 22:51:12 +0200 Subject: gnu: rush: Fix CVE-2013-6889. * gnu/packages/patches/rush-CVE-2013-6889.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/rush.scm (rush): Use it. --- gnu/local.mk | 1 + gnu/packages/patches/rush-CVE-2013-6889.patch | 23 +++++++++++++++++++++++ gnu/packages/rush.scm | 5 +++-- 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 gnu/packages/patches/rush-CVE-2013-6889.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 6f56039b7e..f36389f819 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -717,6 +717,7 @@ dist_patch_DATA = \ %D%/packages/patches/ripperx-missing-file.patch \ %D%/packages/patches/rsem-makefile.patch \ %D%/packages/patches/ruby-symlinkfix.patch \ + %D%/packages/patches/rush-CVE-2013-6889.patch \ %D%/packages/patches/sed-hurd-path-max.patch \ %D%/packages/patches/scheme48-tests.patch \ %D%/packages/patches/scotch-test-threading.patch \ diff --git a/gnu/packages/patches/rush-CVE-2013-6889.patch b/gnu/packages/patches/rush-CVE-2013-6889.patch new file mode 100644 index 0000000000..862528a12c --- /dev/null +++ b/gnu/packages/patches/rush-CVE-2013-6889.patch @@ -0,0 +1,23 @@ +commit 00bdccd429517f12dbf37ab4397ddec3e51a2738 +Author: Mats Erik Andersson +Date: Mon Jan 20 13:33:52 2014 +0200 + + Protect against CVE-2013-6889 (tiny change). + + Reset the effective user identification in testing mode. + +diff --git a/src/rush.c b/src/rush.c +index 45d737a..dc6518e 100644 +--- a/src/rush.c ++++ b/src/rush.c +@@ -980,6 +980,10 @@ main(int argc, char **argv) + } else if (argc > optind) + die(usage_error, NULL, _("invalid command line")); + ++ /* Relinquish root privileges in test mode */ ++ if (lint_option) ++ setuid(getuid()); ++ + if (test_user_name) { + struct passwd *pw = getpwnam(test_user_name); + if (!pw) diff --git a/gnu/packages/rush.scm b/gnu/packages/rush.scm index 6926f68787..cf9e49a7e3 100644 --- a/gnu/packages/rush.scm +++ b/gnu/packages/rush.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2013 Ludovic Courtès +;;; Copyright © 2013, 2016 Ludovic Courtès ;;; ;;; This file is part of GNU Guix. ;;; @@ -36,7 +36,8 @@ (sha256 (base32 "0fh0gbbp0iiq3wbkf503xb40r8ljk42vyj9bnlflbz82d6ipy1rm")) - (patches (search-patches "cpio-gets-undeclared.patch")))) + (patches (search-patches "cpio-gets-undeclared.patch" + "rush-CVE-2013-6889.patch")))) (build-system gnu-build-system) (home-page "http://www.gnu.org/software/rush/") (synopsis "Restricted user (login) shell") -- cgit v1.2.3 From b5d08d7c2834610b5243db1795bd4b0724c8ff2a Mon Sep 17 00:00:00 2001 From: Leo Famulari Date: Fri, 27 May 2016 11:42:22 -0400 Subject: gnu: gd: Update to 2.2.1 [fixes CVE-2015-{8874, 8877}]. * gnu/packages/patches/gd-CVE-2016-3074.patch: Delete file. * gnu/local.mk (dist_patch_DATA): Remove it. * gnu/packages/gd.scm (gd): Update to 2.2.1. [source]: Remove patch. Update source URL. --- gnu/local.mk | 1 - gnu/packages/gd.scm | 11 ++++----- gnu/packages/patches/gd-CVE-2016-3074.patch | 36 ----------------------------- 3 files changed, 5 insertions(+), 43 deletions(-) delete mode 100644 gnu/packages/patches/gd-CVE-2016-3074.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index f36389f819..86b56d4047 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -498,7 +498,6 @@ dist_patch_DATA = \ %D%/packages/patches/gcc-cross-environment-variables.patch \ %D%/packages/patches/gcc-libvtv-runpath.patch \ %D%/packages/patches/gcc-5.0-libvtv-runpath.patch \ - %D%/packages/patches/gd-CVE-2016-3074.patch \ %D%/packages/patches/geoclue-config.patch \ %D%/packages/patches/ghostscript-CVE-2015-3228.patch \ %D%/packages/patches/ghostscript-runpath.patch \ diff --git a/gnu/packages/gd.scm b/gnu/packages/gd.scm index e52a030f86..4d6b1a3c89 100644 --- a/gnu/packages/gd.scm +++ b/gnu/packages/gd.scm @@ -37,20 +37,19 @@ (package (name "gd") - ;; Note: With libgd.org now pointing to bitbucket.org, genuine old + ;; Note: With libgd.org now pointing to github.com, genuine old ;; tarballs are no longer available. Notably, versions 2.0.x are ;; missing. - (version "2.1.1") + (version "2.2.1") (source (origin (method url-fetch) (uri (string-append - "https://bitbucket.org/libgd/gd-libgd/downloads/" - "libgd-" version ".tar.xz")) + "https://github.com/libgd/libgd/releases/download/gd-" + version "/libgd-" version ".tar.xz")) (sha256 (base32 - "11djy9flzxczphigqgp7fbbblbq35gqwwhn9xfcckawlapa1xnls")) - (patches (search-patches "gd-CVE-2016-3074.patch")))) + "0xmrqka1ggqgml84xbmkw1y0r0lg7qn657v5b1my8pry92p651vh")))) (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config))) diff --git a/gnu/packages/patches/gd-CVE-2016-3074.patch b/gnu/packages/patches/gd-CVE-2016-3074.patch deleted file mode 100644 index a90c51d77b..0000000000 --- a/gnu/packages/patches/gd-CVE-2016-3074.patch +++ /dev/null @@ -1,36 +0,0 @@ -Adapted from upstream commit 2bb97f407c1145c850416a3bfbcc8cf124e68a19 -(gd2: handle corrupt images better (CVE-2016-3074)). - -This patch omits the upstream changes to '.gitignore', and the test -added in files 'tests/Makefile.am', 'tests/gd2/gd2_read_corrupt.c', and -'tests/gd2/invalid_neg_size.gd2'. - -We omit the test because its input data, -'tests/gd2/invalid_neg_size.gd2', is provided as a binary Git diff, -which is not supported by `patch`. - -https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-3074 -https://github.com/libgd/libgd/commit/2bb97f407c1145c850416a3bfbcc8cf124e68a19 ---- - .gitignore | 1 + - src/gd_gd2.c | 2 ++ - tests/Makefile.am | 3 ++- - tests/gd2/gd2_read_corrupt.c | 25 +++++++++++++++++++++++++ - tests/gd2/invalid_neg_size.gd2 | Bin 0 -> 1676 bytes - 5 files changed, 30 insertions(+), 1 deletion(-) - create mode 100644 tests/gd2/gd2_read_corrupt.c - create mode 100644 tests/gd2/invalid_neg_size.gd2 - -diff --git a/src/gd_gd2.c b/src/gd_gd2.c -index 6f28461..a50b33d 100644 ---- a/src/gd_gd2.c -+++ b/src/gd_gd2.c -@@ -165,6 +165,8 @@ _gd2GetHeader (gdIOCtxPtr in, int *sx, int *sy, - if (gdGetInt (&cidx[i].size, in) != 1) { - goto fail2; - }; -+ if (cidx[i].offset < 0 || cidx[i].size < 0) -+ goto fail2; - }; - *chunkIdx = cidx; - }; -- cgit v1.2.3 From 32fddd8e29ba6bfebc7ba2081f02d2dc9730256a Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Sun, 29 May 2016 08:50:15 +0300 Subject: gnu: lua-5.1: Fix CVE-2014-5461. * gnu/packages/lua.scm (lua-5.1)[source]: Add patch. * gnu/packages/patches/lua-CVE-2014-5461: New file. * gnu/local.mk (dist_patch_DATA): Add it. --- gnu/local.mk | 1 + gnu/packages/lua.scm | 4 +++- gnu/packages/patches/lua-CVE-2014-5461.patch | 20 ++++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/lua-CVE-2014-5461.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 86b56d4047..9a9cff4238 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -612,6 +612,7 @@ dist_patch_DATA = \ %D%/packages/patches/lirc-localstatedir.patch \ %D%/packages/patches/libpthread-glibc-preparation.patch \ %D%/packages/patches/lm-sensors-hwmon-attrs.patch \ + %D%/packages/patches/lua-CVE-2014-5461.patch \ %D%/packages/patches/lua-pkgconfig.patch \ %D%/packages/patches/lua51-liblua-so.patch \ %D%/packages/patches/lua52-liblua-so.patch \ diff --git a/gnu/packages/lua.scm b/gnu/packages/lua.scm index 17874f86ab..a5315342ea 100644 --- a/gnu/packages/lua.scm +++ b/gnu/packages/lua.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2014 Raimon Grau ;;; Copyright © 2014 Mark H Weaver ;;; Copyright © 2014 Andreas Enge +;;; Copyright © 2016 Efraim Flashner ;;; ;;; This file is part of GNU Guix. ;;; @@ -78,7 +79,8 @@ for configuration, scripting, and rapid prototyping.") version ".tar.gz")) (sha256 (base32 "0cskd4w0g6rdm2q8q3i4n1h3j8kylhs3rq8mxwl9vwlmlxbgqh16")) - (patches (search-patches "lua51-liblua-so.patch")))))) + (patches (search-patches "lua51-liblua-so.patch" + "lua-CVE-2014-5461.patch")))))) (define-public luajit (package diff --git a/gnu/packages/patches/lua-CVE-2014-5461.patch b/gnu/packages/patches/lua-CVE-2014-5461.patch new file mode 100644 index 0000000000..bc72ef14ad --- /dev/null +++ b/gnu/packages/patches/lua-CVE-2014-5461.patch @@ -0,0 +1,20 @@ +From: Enrico Tassi +Date: Tue, 26 Aug 2014 16:20:55 +0200 +Subject: Fix stack overflow in vararg functions + +--- + src/ldo.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/ldo.c b/src/ldo.c +index d1bf786..30333bf 100644 +--- a/src/ldo.c ++++ b/src/ldo.c +@@ -274,7 +274,7 @@ int luaD_precall (lua_State *L, StkId func, int nresults) { + CallInfo *ci; + StkId st, base; + Proto *p = cl->p; +- luaD_checkstack(L, p->maxstacksize); ++ luaD_checkstack(L, p->maxstacksize + p->numparams); + func = restorestack(L, funcr); + base = func + 1; -- cgit v1.2.3 From 1d982d787dfdd6739fe6c829aee332e9b24bdc31 Mon Sep 17 00:00:00 2001 From: Leo Famulari Date: Sun, 29 May 2016 13:02:23 -0400 Subject: gnu: procmail: Fix CVE-2014-3618. * gnu/packages/patches/procmail-CVE-2014-3618.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/mail.scm (procmail): Use it. --- gnu/local.mk | 1 + gnu/packages/mail.scm | 3 ++- gnu/packages/patches/procmail-CVE-2014-3618.patch | 26 +++++++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/procmail-CVE-2014-3618.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 9a9cff4238..3f595b47ce 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -689,6 +689,7 @@ dist_patch_DATA = \ %D%/packages/patches/portaudio-audacity-compat.patch \ %D%/packages/patches/portmidi-modular-build.patch \ %D%/packages/patches/procmail-ambiguous-getline-debian.patch \ + %D%/packages/patches/procmail-CVE-2014-3618.patch \ %D%/packages/patches/pt-scotch-build-parallelism.patch \ %D%/packages/patches/pulseaudio-fix-mult-test.patch \ %D%/packages/patches/pulseaudio-longer-test-timeout.patch \ diff --git a/gnu/packages/mail.scm b/gnu/packages/mail.scm index 39133fcff0..b4563277aa 100644 --- a/gnu/packages/mail.scm +++ b/gnu/packages/mail.scm @@ -1149,7 +1149,8 @@ deliver it in various ways.") ;; The following patch fixes an ambiguous definition of ;; getline() in formail.c. The patch is provided by Debian as ;; patch 24. - (patches (search-patches "procmail-ambiguous-getline-debian.patch")))) + (patches (search-patches "procmail-ambiguous-getline-debian.patch" + "procmail-CVE-2014-3618.patch")))) (arguments `(#:phases (modify-phases %standard-phases (replace 'configure diff --git a/gnu/packages/patches/procmail-CVE-2014-3618.patch b/gnu/packages/patches/procmail-CVE-2014-3618.patch new file mode 100644 index 0000000000..e3f2759738 --- /dev/null +++ b/gnu/packages/patches/procmail-CVE-2014-3618.patch @@ -0,0 +1,26 @@ +Fixes CVE-2014-3618 (heap overflow in formisc.c allowing denial of +service and potential remote execution of arbitrary code). +https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3618 + +Source: +http://seclists.org/oss-sec/2014/q3/495 + +Adopted by Debian as patch '27': +https://sources.debian.net/src/procmail/3.22-25/debian/patches/27/ + +--- a/src/formisc.c ++++ b/src/formisc.c +@@ -84,12 +84,11 @@ + case '"':*target++=delim='"';start++; + } + ;{ int i; +- do ++ while(*start) + if((i= *target++= *start++)==delim) /* corresponding delimiter? */ + break; + else if(i=='\\'&&*start) /* skip quoted character */ + *target++= *start++; +- while(*start); /* anything? */ + } + hitspc=2; + } -- cgit v1.2.3 From 65da8dd01ed02b8bf4499b175a49345633f56451 Mon Sep 17 00:00:00 2001 From: Leo Famulari Date: Sun, 29 May 2016 13:57:56 -0400 Subject: gnu: rpm: Fix CVE-2014-8118. * gnu/packages/patches/rpm-CVE-2014-8118.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/package-management.scm (rpm): Use it. --- gnu/local.mk | 1 + gnu/packages/package-management.scm | 3 ++- gnu/packages/patches/rpm-CVE-2014-8118.patch | 25 +++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/rpm-CVE-2014-8118.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 3f595b47ce..dade7367be 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -716,6 +716,7 @@ dist_patch_DATA = \ %D%/packages/patches/ratpoison-shell.patch \ %D%/packages/patches/readline-link-ncurses.patch \ %D%/packages/patches/ripperx-missing-file.patch \ + %D%/packages/patches/rpm-CVE-2014-8118.patch \ %D%/packages/patches/rsem-makefile.patch \ %D%/packages/patches/ruby-symlinkfix.patch \ %D%/packages/patches/rush-CVE-2013-6889.patch \ diff --git a/gnu/packages/package-management.scm b/gnu/packages/package-management.scm index fdc25a5009..46743fefb5 100644 --- a/gnu/packages/package-management.scm +++ b/gnu/packages/package-management.scm @@ -334,7 +334,8 @@ symlinks to the files in a common directory such as /usr/local.") version ".tar.bz2")) (sha256 (base32 - "0a82ym8phx7g0f3k6smvxnvzh7yv857l42xafk49689kzhld5pbp")))) + "0a82ym8phx7g0f3k6smvxnvzh7yv857l42xafk49689kzhld5pbp")) + (patches (search-patches "rpm-CVE-2014-8118.patch")))) (build-system gnu-build-system) (arguments '(#:configure-flags '("--with-external-db" ;use the system's bdb diff --git a/gnu/packages/patches/rpm-CVE-2014-8118.patch b/gnu/packages/patches/rpm-CVE-2014-8118.patch new file mode 100644 index 0000000000..5fdb0f0eb2 --- /dev/null +++ b/gnu/packages/patches/rpm-CVE-2014-8118.patch @@ -0,0 +1,25 @@ +Fix CVE-2014-8118 (integer overflow allowing arbitrary remote code +execution via crafted CPIO header). + +https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-8118 + +Source: +https://bugzilla.redhat.com/attachment.cgi?id=962159&action=diff + +Adopted by Debian: +http://anonscm.debian.org/cgit/collab-maint/rpm.git/plain/debian/patches/CVE-2014-8118.patch + +diff --git a/lib/cpio.c b/lib/cpio.c +index 253ff0f..600633a 100644 +--- a/lib/cpio.c ++++ b/lib/cpio.c +@@ -399,6 +399,9 @@ int rpmcpioHeaderRead(rpmcpio_t cpio, char ** path, int * fx) + + GET_NUM_FIELD(hdr.filesize, fsize); + GET_NUM_FIELD(hdr.namesize, nameSize); ++ if (nameSize <= 0 || nameSize > 4096) { ++ return RPMERR_BAD_HEADER; ++ } + + char name[nameSize + 1]; + read = Fread(name, nameSize, 1, cpio->fd); -- cgit v1.2.3 From e99dd67ad8634cbfa62a3e6996f03c6d73487e53 Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Mon, 30 May 2016 06:04:46 +0300 Subject: gnu: libtar: Fix CVE-2013-4420. * gnu/packages/compression.scm (libtar)[source]: Add patch. * gnu/packages/patches/libtar-CVE-2013-4420.patch: New variable. * gnu/local.mk (dist_patch_DATA): Add it. This is a follow-up to 89d80159b1da81c4017b46a575c3ec5dd9a96c90. --- gnu/local.mk | 1 + gnu/packages/compression.scm | 4 +- gnu/packages/patches/libtar-CVE-2013-4420.patch | 118 ++++++++++++++++++++++++ 3 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/libtar-CVE-2013-4420.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index dade7367be..60dbb7faf3 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -588,6 +588,7 @@ dist_patch_DATA = \ %D%/packages/patches/libmad-frame-length.patch \ %D%/packages/patches/libmad-mips-newgcc.patch \ %D%/packages/patches/libssh-0.6.5-CVE-2016-0739.patch \ + %D%/packages/patches/libtar-CVE-2013-4420.patch \ %D%/packages/patches/libtheora-config-guess.patch \ %D%/packages/patches/libtiff-CVE-2015-8665+CVE-2015-8683.patch \ %D%/packages/patches/libtiff-oob-accesses-in-decode.patch \ diff --git a/gnu/packages/compression.scm b/gnu/packages/compression.scm index 8148ecb070..5746ca3e03 100644 --- a/gnu/packages/compression.scm +++ b/gnu/packages/compression.scm @@ -34,6 +34,7 @@ #:use-module (guix git-download) #:use-module (guix build-system gnu) #:use-module (guix build-system perl) + #:use-module (gnu packages) #:use-module (gnu packages autotools) #:use-module (gnu packages backup) #:use-module (gnu packages base) @@ -122,7 +123,8 @@ utility. Instead of being written in Java, FastJar is written in C.") version ".orig.tar.gz"))) (sha256 (base32 - "02cihzl77ia0dcz7z2cga2412vyhhs5pa2355q4wpwbyga2lrwjh")))) + "02cihzl77ia0dcz7z2cga2412vyhhs5pa2355q4wpwbyga2lrwjh")) + (patches (search-patches "libtar-CVE-2013-4420.patch")))) (build-system gnu-build-system) (arguments `(#:tests? #f ;no "check" target diff --git a/gnu/packages/patches/libtar-CVE-2013-4420.patch b/gnu/packages/patches/libtar-CVE-2013-4420.patch new file mode 100644 index 0000000000..cc64711ae9 --- /dev/null +++ b/gnu/packages/patches/libtar-CVE-2013-4420.patch @@ -0,0 +1,118 @@ +Author: Raphael Geissert +Bug-Debian: https://bugs.debian.org/731860 +Description: Avoid directory traversal when extracting archives + by skipping over leading slashes and any prefix containing ".." components. +Forwarded: yes + +--- a/lib/decode.c ++++ b/lib/decode.c +@@ -22,6 +22,36 @@ + #endif + + ++char * ++safer_name_suffix (char const *file_name) ++{ ++ char const *p, *t; ++ p = t = file_name; ++ while (*p == '/') t = ++p; ++ while (*p) ++ { ++ while (p[0] == '.' && p[0] == p[1] && p[2] == '/') ++ { ++ p += 3; ++ t = p; ++ } ++ /* advance pointer past the next slash */ ++ while (*p && (p++)[0] != '/'); ++ } ++ ++ if (!*t) ++ { ++ t = "."; ++ } ++ ++ if (t != file_name) ++ { ++ /* TODO: warn somehow that the path was modified */ ++ } ++ return (char*)t; ++} ++ ++ + /* determine full path name */ + char * + th_get_pathname(TAR *t) +@@ -29,17 +59,17 @@ th_get_pathname(TAR *t) + static char filename[MAXPATHLEN]; + + if (t->th_buf.gnu_longname) +- return t->th_buf.gnu_longname; ++ return safer_name_suffix(t->th_buf.gnu_longname); + + if (t->th_buf.prefix[0] != '\0') + { + snprintf(filename, sizeof(filename), "%.155s/%.100s", + t->th_buf.prefix, t->th_buf.name); +- return filename; ++ return safer_name_suffix(filename); + } + + snprintf(filename, sizeof(filename), "%.100s", t->th_buf.name); +- return filename; ++ return safer_name_suffix(filename); + } + + +--- a/lib/extract.c ++++ b/lib/extract.c +@@ -298,14 +298,14 @@ tar_extract_hardlink(TAR * t, char *real + if (mkdirhier(dirname(filename)) == -1) + return -1; + libtar_hashptr_reset(&hp); +- if (libtar_hash_getkey(t->h, &hp, th_get_linkname(t), ++ if (libtar_hash_getkey(t->h, &hp, safer_name_suffix(th_get_linkname(t)), + (libtar_matchfunc_t)libtar_str_match) != 0) + { + lnp = (char *)libtar_hashptr_data(&hp); + linktgt = &lnp[strlen(lnp) + 1]; + } + else +- linktgt = th_get_linkname(t); ++ linktgt = safer_name_suffix(th_get_linkname(t)); + + #ifdef DEBUG + printf(" ==> extracting: %s (link to %s)\n", filename, linktgt); +@@ -343,9 +343,9 @@ tar_extract_symlink(TAR *t, char *realna + + #ifdef DEBUG + printf(" ==> extracting: %s (symlink to %s)\n", +- filename, th_get_linkname(t)); ++ filename, safer_name_suffix(th_get_linkname(t))); + #endif +- if (symlink(th_get_linkname(t), filename) == -1) ++ if (symlink(safer_name_suffix(th_get_linkname(t)), filename) == -1) + { + #ifdef DEBUG + perror("symlink()"); +--- a/lib/internal.h ++++ b/lib/internal.h +@@ -15,3 +15,4 @@ + + #include + ++char* safer_name_suffix(char const*); +--- a/lib/output.c ++++ b/lib/output.c +@@ -123,9 +123,9 @@ th_print_long_ls(TAR *t) + else + printf(" link to "); + if ((t->options & TAR_GNU) && t->th_buf.gnu_longlink != NULL) +- printf("%s", t->th_buf.gnu_longlink); ++ printf("%s", safer_name_suffix(t->th_buf.gnu_longlink)); + else +- printf("%.100s", t->th_buf.linkname); ++ printf("%.100s", safer_name_suffix(t->th_buf.linkname)); + } + + putchar('\n'); -- cgit v1.2.3 From b3d20b82809a2895402936a162e0ddc5725cb1cd Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Mon, 30 May 2016 06:42:02 +0300 Subject: gnu: vorbis-tools: Fix CVE-2014-9638, CVE-2014-9639, CVE-2014-9640. * gnu/packages/xiph.scm (vorbis-tools)[source]: Add patches. * gnu/packages/patches/vorbis-tools-CVE-2014-9638+CVE-2014-9639.patch, gnu/packages/patches/vorbis-tools-CVE-2014-9640.patch: New variables. * gnu/local.mk (dist_patch_DATA): Add them. --- gnu/local.mk | 2 + .../vorbis-tools-CVE-2014-9638+CVE-2014-9639.patch | 83 ++++++++++++++++++++++ .../patches/vorbis-tools-CVE-2014-9640.patch | 29 ++++++++ gnu/packages/xiph.scm | 5 +- 4 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/vorbis-tools-CVE-2014-9638+CVE-2014-9639.patch create mode 100644 gnu/packages/patches/vorbis-tools-CVE-2014-9640.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 60dbb7faf3..00acfbccf6 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -766,6 +766,8 @@ dist_patch_DATA = \ %D%/packages/patches/util-linux-tests.patch \ %D%/packages/patches/upower-builddir.patch \ %D%/packages/patches/valgrind-enable-arm.patch \ + %D%/packages/patches/vorbis-tools-CVE-2014-9638+CVE-2014-9639.patch \ + %D%/packages/patches/vorbis-tools-CVE-2014-9640.patch \ %D%/packages/patches/vorbis-tools-CVE-2015-6749.patch \ %D%/packages/patches/vpnc-script.patch \ %D%/packages/patches/vtk-mesa-10.patch \ diff --git a/gnu/packages/patches/vorbis-tools-CVE-2014-9638+CVE-2014-9639.patch b/gnu/packages/patches/vorbis-tools-CVE-2014-9638+CVE-2014-9639.patch new file mode 100644 index 0000000000..6e389dd59e --- /dev/null +++ b/gnu/packages/patches/vorbis-tools-CVE-2014-9638+CVE-2014-9639.patch @@ -0,0 +1,83 @@ +From: Petter Reinholdtsen +Date: Tue, 22 Sep 2015 15:14:06 +0200 +Subject: oggenc: validate count of channels in the header (CVE-2014-9638 & + CVE-2014-9639) + +Author: Kamil Dudka +Origin: http://lists.xiph.org/pipermail/vorbis-dev/2015-February/020423.html +Bug: https://trac.xiph.org/ticket/2136 +Bug: https://trac.xiph.org/ticket/2137 +Bug-Debian: https://bugs.debian.org/776086 +Forwarded: not-needed +Reviewed-By: Petter Reinholdtsen +Last-Update: 2015-09-22 +--- + oggenc/audio.c | 18 ++++++++++++++++-- + 1 file changed, 16 insertions(+), 2 deletions(-) + +diff --git a/oggenc/audio.c b/oggenc/audio.c +index 05e42b3..1b3f179 100644 +--- a/oggenc/audio.c ++++ b/oggenc/audio.c +@@ -13,6 +13,7 @@ + #include + #endif + ++#include + #include + #include + #include +@@ -251,6 +252,7 @@ int aiff_open(FILE *in, oe_enc_opt *opt, unsigned char *buf, int buflen) + aiff_fmt format; + aifffile *aiff = malloc(sizeof(aifffile)); + int i; ++ long channels; + + if(buf[11]=='C') + aifc=1; +@@ -277,11 +279,16 @@ int aiff_open(FILE *in, oe_enc_opt *opt, unsigned char *buf, int buflen) + return 0; + } + +- format.channels = READ_U16_BE(buffer); ++ format.channels = channels = READ_U16_BE(buffer); + format.totalframes = READ_U32_BE(buffer+2); + format.samplesize = READ_U16_BE(buffer+6); + format.rate = (int)read_IEEE80(buffer+8); + ++ if(channels <= 0L || SHRT_MAX < channels) ++ { ++ fprintf(stderr, _("Warning: Unsupported count of channels in AIFF header\n")); ++ return 0; ++ } + aiff->bigendian = 1; + + if(aifc) +@@ -412,6 +419,7 @@ int wav_open(FILE *in, oe_enc_opt *opt, unsigned char *oldbuf, int buflen) + wav_fmt format; + wavfile *wav = malloc(sizeof(wavfile)); + int i; ++ long channels; + + /* Ok. At this point, we know we have a WAV file. Now we have to detect + * whether we support the subtype, and we have to find the actual data +@@ -449,12 +457,18 @@ int wav_open(FILE *in, oe_enc_opt *opt, unsigned char *oldbuf, int buflen) + } + + format.format = READ_U16_LE(buf); +- format.channels = READ_U16_LE(buf+2); ++ format.channels = channels = READ_U16_LE(buf+2); + format.samplerate = READ_U32_LE(buf+4); + format.bytespersec = READ_U32_LE(buf+8); + format.align = READ_U16_LE(buf+12); + format.samplesize = READ_U16_LE(buf+14); + ++ if(channels <= 0L || SHRT_MAX < channels) ++ { ++ fprintf(stderr, _("Warning: Unsupported count of channels in WAV header\n")); ++ return 0; ++ } ++ + if(format.format == -2) /* WAVE_FORMAT_EXTENSIBLE */ + { + if(len<40) diff --git a/gnu/packages/patches/vorbis-tools-CVE-2014-9640.patch b/gnu/packages/patches/vorbis-tools-CVE-2014-9640.patch new file mode 100644 index 0000000000..97d18e0db7 --- /dev/null +++ b/gnu/packages/patches/vorbis-tools-CVE-2014-9640.patch @@ -0,0 +1,29 @@ +Index: vorbis-tools/oggenc/oggenc.c +=================================================================== +--- vorbis-tools/oggenc/oggenc.c (revision 19116) ++++ vorbis-tools/oggenc/oggenc.c (revision 19117) +@@ -98,4 +98,6 @@ + 0,0,0.f, + 0, 0, 0, 0, 0}; ++ input_format raw_format = {NULL, 0, raw_open, wav_close, "raw", ++ N_("RAW file reader")}; + + int i; +@@ -240,6 +242,4 @@ + if(opt.rawmode) + { +- input_format raw_format = {NULL, 0, raw_open, wav_close, "raw", +- N_("RAW file reader")}; + + enc_opts.rate=opt.raw_samplerate; +Index: vorbis-tools/oggenc/skeleton.h +=================================================================== +--- vorbis-tools/oggenc/skeleton.h (revision 19116) ++++ vorbis-tools/oggenc/skeleton.h (revision 19117) +@@ -42,5 +42,5 @@ + ogg_int64_t start_granule; /* start granule value */ + ogg_uint32_t preroll; /* preroll */ +- unsigned char granule_shift; // a 8-bit field /* 1 byte value holding the granule shift */ ++ unsigned char granule_shift; /* 1 byte value holding the granule shift */ + char *message_header_fields; /* holds all the message header fields */ + /* current total size of the message header fields, for realloc purpose, initially zero */ diff --git a/gnu/packages/xiph.scm b/gnu/packages/xiph.scm index 68f76d5c5c..d1597e96ea 100644 --- a/gnu/packages/xiph.scm +++ b/gnu/packages/xiph.scm @@ -270,7 +270,10 @@ Kate stream.") (sha256 (base32 "1g12bnh5ah08v529y72kfdz5lhvy75iaz7f9jskyby23m9dkk2d3")) - (patches (search-patches "vorbis-tools-CVE-2015-6749.patch")))) + (patches (search-patches + "vorbis-tools-CVE-2014-9638+CVE-2014-9639.patch" + "vorbis-tools-CVE-2014-9640.patch" + "vorbis-tools-CVE-2015-6749.patch")))) (build-system gnu-build-system) (inputs `(("ao" ,ao) ("curl" ,curl) -- cgit v1.2.3 From d8862778c1b334cefafb92cc88e158b2cdf82a76 Mon Sep 17 00:00:00 2001 From: Leo Famulari Date: Sun, 29 May 2016 23:36:37 -0400 Subject: gnu: graphicsmagick: Fix CVE-2016-5118. * gnu/packages/patches/graphicsmagick-CVE-2016-5118.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/imagemagick.scm (graphicsmagick): Use it. --- gnu/local.mk | 1 + gnu/packages/imagemagick.scm | 1 + .../patches/graphicsmagick-CVE-2016-5118.patch | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+) create mode 100644 gnu/packages/patches/graphicsmagick-CVE-2016-5118.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 00acfbccf6..8844d1dbdc 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -518,6 +518,7 @@ dist_patch_DATA = \ %D%/packages/patches/gobject-introspection-absolute-shlib-path.patch \ %D%/packages/patches/gobject-introspection-cc.patch \ %D%/packages/patches/gobject-introspection-girepository.patch \ + %D%/packages/patches/graphicsmagick-CVE-2016-5118.patch \ %D%/packages/patches/grep-timing-sensitive-test.patch \ %D%/packages/patches/grub-CVE-2015-8370.patch \ %D%/packages/patches/grub-gets-undeclared.patch \ diff --git a/gnu/packages/imagemagick.scm b/gnu/packages/imagemagick.scm index a7bbe0cce0..c356a47148 100644 --- a/gnu/packages/imagemagick.scm +++ b/gnu/packages/imagemagick.scm @@ -160,6 +160,7 @@ script.") (uri (string-append "ftp://ftp.graphicsmagick.org/pub/" "GraphicsMagick/" (version-major+minor version) "/GraphicsMagick-" version ".tar.xz")) + (patches (search-patches "graphicsmagick-CVE-2016-5118.patch")) (sha256 (base32 "03g6l2h8cmf231y1vma0z7x85070jm1ysgs9ppqcd3jj56jka9gx")))) diff --git a/gnu/packages/patches/graphicsmagick-CVE-2016-5118.patch b/gnu/packages/patches/graphicsmagick-CVE-2016-5118.patch new file mode 100644 index 0000000000..ddd1ce93f4 --- /dev/null +++ b/gnu/packages/patches/graphicsmagick-CVE-2016-5118.patch @@ -0,0 +1,19 @@ +Fix CVE-2016-5118 (popen() shell vulnerability via filename). + +https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-5118 + +Upstream patch copied from the bug announcement: +http://seclists.org/oss-sec/2016/q2/432 +https://marc.info/?l=oss-security&m=146455222600609&w=2 + +diff -r 33200fc645f6 magick/blob.c +--- a/magick/blob.c Sat Nov 07 14:49:16 2015 -0600 ++++ b/magick/blob.c Sun May 29 14:12:57 2016 -0500 +@@ -68,6 +68,7 @@ + */ + #define DefaultBlobQuantum 65541 + ++#undef HAVE_POPEN + + /* + Enum declarations. -- cgit v1.2.3 From 0d567b553153921488ddf18879768b4125c9613e Mon Sep 17 00:00:00 2001 From: Leo Famulari Date: Sat, 28 May 2016 01:16:43 -0400 Subject: gnu: libyaml: Fix CVE-2014-9130. * gnu/packages/patches/libyaml-CVE-2014-9130.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/web.scm (libyaml): Use it. --- gnu/local.mk | 1 + gnu/packages/patches/libyaml-CVE-2014-9130.patch | 30 ++++++++++++++++++++++++ gnu/packages/web.scm | 1 + 3 files changed, 32 insertions(+) create mode 100644 gnu/packages/patches/libyaml-CVE-2014-9130.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 8844d1dbdc..eab390d228 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -809,6 +809,7 @@ dist_patch_DATA = \ %D%/packages/patches/xfce4-session-fix-xflock4.patch \ %D%/packages/patches/xfce4-settings-defaults.patch \ %D%/packages/patches/xmodmap-asprintf.patch \ + %D%/packages/patches/libyaml-CVE-2014-9130.patch \ %D%/packages/patches/zathura-plugindir-environment-variable.patch MISC_DISTRO_FILES = \ diff --git a/gnu/packages/patches/libyaml-CVE-2014-9130.patch b/gnu/packages/patches/libyaml-CVE-2014-9130.patch new file mode 100644 index 0000000000..800358c0d6 --- /dev/null +++ b/gnu/packages/patches/libyaml-CVE-2014-9130.patch @@ -0,0 +1,30 @@ +Fixes CVE-2014-9130 +https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-9130 + +Upstream source: +https://bitbucket.org/xi/libyaml/commits/2b9156756423e967cfd09a61d125d883fca6f4f2 + +# HG changeset patch +# User Kirill Simonov +# Date 1417197312 21600 +# Node ID 2b9156756423e967cfd09a61d125d883fca6f4f2 +# Parent 053f53a381ff6adbbc93a31ab7fdee06a16c8a33 +Removed invalid simple key assertion (thank to Jonathan Gray). + +diff --git a/src/scanner.c b/src/scanner.c +--- a/src/scanner.c ++++ b/src/scanner.c +@@ -1106,13 +1106,6 @@ + && parser->indent == (ptrdiff_t)parser->mark.column); + + /* +- * A simple key is required only when it is the first token in the current +- * line. Therefore it is always allowed. But we add a check anyway. +- */ +- +- assert(parser->simple_key_allowed || !required); /* Impossible. */ +- +- /* + * If the current position may start a simple key, save it. + */ + diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm index 03f15e8bf4..7cadf9b930 100644 --- a/gnu/packages/web.scm +++ b/gnu/packages/web.scm @@ -611,6 +611,7 @@ of people.") (uri (string-append "http://pyyaml.org/download/libyaml/yaml-" version ".tar.gz")) + (patches (search-patches "libyaml-CVE-2014-9130.patch")) (sha256 (base32 "0j9731s5zjb8mjx7wzf6vh7bsqi38ay564x6s9nri2nh9cdrg9kx")))) -- cgit v1.2.3 From ccda7c8317fcbcdf929d6f8a183d4dbd2f5c1391 Mon Sep 17 00:00:00 2001 From: Leo Famulari Date: Sun, 29 May 2016 14:38:54 -0400 Subject: gnu: pcre2: Fix CVE-2016-3191. * gnu/packages/patches/pcre2-CVE-2016-3191.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/pcre.scm (pcre2): Use it. --- gnu/local.mk | 1 + gnu/packages/patches/pcre2-CVE-2016-3191.patch | 179 +++++++++++++++++++++++++ gnu/packages/pcre.scm | 2 + 3 files changed, 182 insertions(+) create mode 100644 gnu/packages/patches/pcre2-CVE-2016-3191.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index eab390d228..66d7c62b8d 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -665,6 +665,7 @@ dist_patch_DATA = \ %D%/packages/patches/patchutils-xfail-gendiff-tests.patch \ %D%/packages/patches/patch-hurd-path-max.patch \ %D%/packages/patches/pcre-CVE-2016-3191.patch \ + %D%/packages/patches/pcre2-CVE-2016-3191.patch \ %D%/packages/patches/perl-CVE-2015-8607.patch \ %D%/packages/patches/perl-CVE-2016-2381.patch \ %D%/packages/patches/perl-autosplit-default-time.patch \ diff --git a/gnu/packages/patches/pcre2-CVE-2016-3191.patch b/gnu/packages/patches/pcre2-CVE-2016-3191.patch new file mode 100644 index 0000000000..80f9d3d4f1 --- /dev/null +++ b/gnu/packages/patches/pcre2-CVE-2016-3191.patch @@ -0,0 +1,179 @@ +Fixes CVE-2016-3191 (remote execution of arbitrary code or denial of +service (stack-based buffer overflow) via a crafted regular expression). + +See . + +This is svn r489 at , omitting the +changes to 'testdata/testoutput8-16-4', which does not exist in the +source tarball. + +git-svn-id: svn://vcs.exim.org/pcre2/code/trunk@489 6239d852-aaf2-0410-a92c-79f79f948069 +--- + ChangeLog | 4 ++++ + src/pcre2_compile.c | 16 ++++++++++++++-- + testdata/testinput8 | 2 ++ + testdata/testoutput8-16-2 | 3 +++ + testdata/testoutput8-16-3 | 3 +++ + testdata/testoutput8-16-4 | 3 +++ + testdata/testoutput8-32-2 | 3 +++ + testdata/testoutput8-32-3 | 3 +++ + testdata/testoutput8-32-4 | 3 +++ + testdata/testoutput8-8-2 | 3 +++ + testdata/testoutput8-8-3 | 3 +++ + testdata/testoutput8-8-4 | 3 +++ + 12 files changed, 47 insertions(+), 2 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index 3ce0207..65e333e 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -58,6 +58,10 @@ some head-scratching the next time this happens. + assertion, caused pcre2test to output a very large number of spaces when the + callout was taken, making the program appearing to loop. + ++12. A pattern that included (*ACCEPT) in the middle of a sufficiently deeply ++nested set of parentheses of sufficient size caused an overflow of the ++compiling workspace (which was diagnosed, but of course is not desirable). ++ + + Version 10.21 12-January-2016 + ----------------------------- +diff --git a/src/pcre2_compile.c b/src/pcre2_compile.c +index e33d620..887fbfd 100644 +--- a/src/pcre2_compile.c ++++ b/src/pcre2_compile.c +@@ -5901,10 +5901,22 @@ for (;; ptr++) + goto FAILED; + } + cb->had_accept = TRUE; ++ ++ /* In the first pass, just accumulate the length required; ++ otherwise hitting (*ACCEPT) inside many nested parentheses can ++ cause workspace overflow. */ ++ + for (oc = cb->open_caps; oc != NULL; oc = oc->next) + { +- *code++ = OP_CLOSE; +- PUT2INC(code, 0, oc->number); ++ if (lengthptr != NULL) ++ { ++ *lengthptr += CU2BYTES(1) + IMM2_SIZE; ++ } ++ else ++ { ++ *code++ = OP_CLOSE; ++ PUT2INC(code, 0, oc->number); ++ } + } + setverb = *code++ = + (cb->assert_depth > 0)? OP_ASSERT_ACCEPT : OP_ACCEPT; +diff --git a/testdata/testinput8 b/testdata/testinput8 +index ca3b1b9..7e2a1f0 100644 +--- a/testdata/testinput8 ++++ b/testdata/testinput8 +@@ -182,4 +182,6 @@ + + /((?1)(?2)(?3)(?4)(?5)(?6)(?7)(?8)(?9)(?9)(?8)(?7)(?6)(?5)(?4)(?3)(?2)(?1)(?0)){2,}()()()()()()()()()/debug + ++/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/ ++ + # End of testinput8 +diff --git a/testdata/testoutput8-16-2 b/testdata/testoutput8-16-2 +index 05669bb..a5e8dec 100644 +--- a/testdata/testoutput8-16-2 ++++ b/testdata/testoutput8-16-2 +@@ -1027,4 +1027,7 @@ Capturing subpattern count = 10 + May match empty string + Subject length lower bound = 0 + ++/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/ ++Failed: error 186 at offset 490: regular expression is too complicated ++ + # End of testinput8 +diff --git a/testdata/testoutput8-16-3 b/testdata/testoutput8-16-3 +index 31884e1..36133b3 100644 +--- a/testdata/testoutput8-16-3 ++++ b/testdata/testoutput8-16-3 +@@ -1023,4 +1023,7 @@ Capturing subpattern count = 10 + May match empty string + Subject length lower bound = 0 + ++/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/ ++Failed: error 114 at offset 509: missing closing parenthesis ++ + # End of testinput8 +diff --git a/testdata/testoutput8-32-2 b/testdata/testoutput8-32-2 +index babd0c7..99c4fad 100644 +--- a/testdata/testoutput8-32-2 ++++ b/testdata/testoutput8-32-2 +@@ -1023,4 +1023,7 @@ Capturing subpattern count = 10 + May match empty string + Subject length lower bound = 0 + ++/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/ ++Failed: error 114 at offset 509: missing closing parenthesis ++ + # End of testinput8 +diff --git a/testdata/testoutput8-32-3 b/testdata/testoutput8-32-3 +index babd0c7..99c4fad 100644 +--- a/testdata/testoutput8-32-3 ++++ b/testdata/testoutput8-32-3 +@@ -1023,4 +1023,7 @@ Capturing subpattern count = 10 + May match empty string + Subject length lower bound = 0 + ++/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/ ++Failed: error 114 at offset 509: missing closing parenthesis ++ + # End of testinput8 +diff --git a/testdata/testoutput8-32-4 b/testdata/testoutput8-32-4 +index babd0c7..99c4fad 100644 +--- a/testdata/testoutput8-32-4 ++++ b/testdata/testoutput8-32-4 +@@ -1023,4 +1023,7 @@ Capturing subpattern count = 10 + May match empty string + Subject length lower bound = 0 + ++/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/ ++Failed: error 114 at offset 509: missing closing parenthesis ++ + # End of testinput8 +diff --git a/testdata/testoutput8-8-2 b/testdata/testoutput8-8-2 +index 6a9aa0a..6dc1f42 100644 +--- a/testdata/testoutput8-8-2 ++++ b/testdata/testoutput8-8-2 +@@ -1026,4 +1026,7 @@ Capturing subpattern count = 10 + May match empty string + Subject length lower bound = 0 + ++/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/ ++Failed: error 114 at offset 509: missing closing parenthesis ++ + # End of testinput8 +diff --git a/testdata/testoutput8-8-3 b/testdata/testoutput8-8-3 +index 2fe1168..ae14946 100644 +--- a/testdata/testoutput8-8-3 ++++ b/testdata/testoutput8-8-3 +@@ -1024,4 +1024,7 @@ Capturing subpattern count = 10 + May match empty string + Subject length lower bound = 0 + ++/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/ ++Failed: error 114 at offset 509: missing closing parenthesis ++ + # End of testinput8 +diff --git a/testdata/testoutput8-8-4 b/testdata/testoutput8-8-4 +index 91993b2..6c79956 100644 +--- a/testdata/testoutput8-8-4 ++++ b/testdata/testoutput8-8-4 +@@ -1022,4 +1022,7 @@ Capturing subpattern count = 10 + May match empty string + Subject length lower bound = 0 + ++/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/ ++Failed: error 114 at offset 509: missing closing parenthesis ++ + # End of testinput8 +-- +2.8.3 + diff --git a/gnu/packages/pcre.scm b/gnu/packages/pcre.scm index 24ecf905e0..e954492554 100644 --- a/gnu/packages/pcre.scm +++ b/gnu/packages/pcre.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2013 Andreas Enge ;;; Copyright © 2014, 2015 Mark H Weaver ;;; Copyright © 2015 Ricardo Wurmus +;;; Copyright © 2016 Leo Famulari ;;; ;;; This file is part of GNU Guix. ;;; @@ -83,6 +84,7 @@ POSIX regular expression API.") (uri (string-append "mirror://sourceforge/pcre/pcre2/" version "/pcre2-" version ".tar.bz2")) + (patches (search-patches "pcre2-CVE-2016-3191.patch")) (sha256 (base32 "1q6lrj9b08l1q39vxipb0fi88x6ybvkr6439h8bjb9r8jd81fsn6")))) -- cgit v1.2.3 From 6447e19108c69277ff2ead3fb084b04cd516e76a Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Mon, 30 May 2016 07:13:47 +0300 Subject: gnu: a2ps: Fix CVE-2001-1593, CVE-2014-0466. * gnu/packages/pretty-print.scm (a2ps)[source]: Add patches. * gnu/packages/patches/a2ps-CVE-2001-1593.patch, gnu/packages/patches/a2ps-CVE-2014-0466.patch: New variables. * gnu/local.mk (dist_patch_DATA): Add them. --- gnu/local.mk | 2 + gnu/packages/patches/a2ps-CVE-2001-1593.patch | 69 +++++++++++++++++++++++++++ gnu/packages/patches/a2ps-CVE-2014-0466.patch | 30 ++++++++++++ gnu/packages/pretty-print.scm | 6 ++- 4 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/a2ps-CVE-2001-1593.patch create mode 100644 gnu/packages/patches/a2ps-CVE-2014-0466.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 66d7c62b8d..f5745d3372 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -412,6 +412,8 @@ GNU_SYSTEM_MODULES = \ patchdir = $(guilemoduledir)/%D%/packages/patches dist_patch_DATA = \ %D%/packages/patches/4store-fix-buildsystem.patch \ + %D%/packages/patches/a2ps-CVE-2001-1593.patch \ + %D%/packages/patches/a2ps-CVE-2014-0466.patch \ %D%/packages/patches/abiword-explictly-cast-bools.patch \ %D%/packages/patches/abiword-wmf-version-lookup-fix.patch \ %D%/packages/patches/acl-hurd-path-max.patch \ diff --git a/gnu/packages/patches/a2ps-CVE-2001-1593.patch b/gnu/packages/patches/a2ps-CVE-2001-1593.patch new file mode 100644 index 0000000000..17b7e7d932 --- /dev/null +++ b/gnu/packages/patches/a2ps-CVE-2001-1593.patch @@ -0,0 +1,69 @@ +Index: b/lib/routines.c +=================================================================== +--- a/lib/routines.c ++++ b/lib/routines.c +@@ -242,3 +242,50 @@ + /* Don't complain if you can't unlink. Who cares of a tmp file? */ + unlink (filename); + } ++ ++/* ++ * Securely generate a temp file, and make sure it gets ++ * deleted upon exit. ++ */ ++static char ** tempfiles; ++static unsigned ntempfiles; ++ ++static void ++cleanup_tempfiles() ++{ ++ while (ntempfiles--) ++ unlink(tempfiles[ntempfiles]); ++} ++ ++char * ++safe_tempnam(const char *pfx) ++{ ++ char *dirname, *filename; ++ int fd; ++ ++ if (!(dirname = getenv("TMPDIR"))) ++ dirname = "/tmp"; ++ ++ tempfiles = (char **) realloc(tempfiles, ++ (ntempfiles+1) * sizeof(char *)); ++ if (tempfiles == NULL) ++ return NULL; ++ ++ filename = malloc(strlen(dirname) + strlen(pfx) + sizeof("/XXXXXX")); ++ if (!filename) ++ return NULL; ++ ++ sprintf(filename, "%s/%sXXXXXX", dirname, pfx); ++ ++ if ((fd = mkstemp(filename)) < 0) { ++ free(filename); ++ return NULL; ++ } ++ close(fd); ++ ++ if (ntempfiles == 0) ++ atexit(cleanup_tempfiles); ++ tempfiles[ntempfiles++] = filename; ++ ++ return filename; ++} +Index: b/lib/routines.h +=================================================================== +--- a/lib/routines.h ++++ b/lib/routines.h +@@ -255,7 +255,8 @@ + /* If _STR_ is not defined, give it a tempname in _TMPDIR_ */ + #define tempname_ensure(Str) \ + do { \ +- (Str) = (Str) ? (Str) : tempnam (NULL, "a2_"); \ ++ (Str) = (Str) ? (Str) : safe_tempnam("a2_"); \ + } while (0) ++char * safe_tempnam(const char *); + + #endif diff --git a/gnu/packages/patches/a2ps-CVE-2014-0466.patch b/gnu/packages/patches/a2ps-CVE-2014-0466.patch new file mode 100644 index 0000000000..85199e35b0 --- /dev/null +++ b/gnu/packages/patches/a2ps-CVE-2014-0466.patch @@ -0,0 +1,30 @@ +Description: CVE-2014-0466: fixps does not invoke gs with -dSAFER + A malicious PostScript file could delete files with the privileges of + the invoking user. +Origin: vendor +Bug-Debian: http://bugs.debian.org/742902 +Author: Salvatore Bonaccorso +Last-Update: 2014-03-28 + +--- a/contrib/fixps.in ++++ b/contrib/fixps.in +@@ -389,7 +389,7 @@ + eval "$command" ;; + gs) + $verbose "$program: making a full rewrite of the file ($gs)." >&2 +- $gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite -sOutputFile=- -c save pop -f $file ;; ++ $gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pswrite -sOutputFile=- -c save pop -f $file ;; + esac + ) + fi +--- a/contrib/fixps.m4 ++++ b/contrib/fixps.m4 +@@ -307,7 +307,7 @@ + eval "$command" ;; + gs) + $verbose "$program: making a full rewrite of the file ($gs)." >&2 +- $gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite -sOutputFile=- -c save pop -f $file ;; ++ $gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pswrite -sOutputFile=- -c save pop -f $file ;; + esac + ) + fi diff --git a/gnu/packages/pretty-print.scm b/gnu/packages/pretty-print.scm index a1692dd4de..1662126d53 100644 --- a/gnu/packages/pretty-print.scm +++ b/gnu/packages/pretty-print.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Eric Bavier +;;; Copyright © 2016 Efraim Flashner ;;; ;;; This file is part of GNU Guix. ;;; @@ -43,7 +44,10 @@ version ".tar.gz")) (sha256 (base32 - "195k78m1h03m961qn7jr120z815iyb93gwi159p1p9348lyqvbpk")))) + "195k78m1h03m961qn7jr120z815iyb93gwi159p1p9348lyqvbpk")) + (patches (search-patches + "a2ps-CVE-2001-1593.patch" + "a2ps-CVE-2014-0466.patch")))) (build-system gnu-build-system) (inputs `(("psutils" ,psutils) -- cgit v1.2.3 From 9116f1269089ecf88ed9465498f7f9482dd978c6 Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Mon, 30 May 2016 09:35:10 +0300 Subject: gnu: antiword: Fix CVE-2014-8123. * gnu/packages/textutils.scm (antiword)[source]: Add patch. * gnu/packages/patches/antiword-CVE-2014-8123: New variable. * gnu/local.mk (dist_patch_DATA): Add it. --- gnu/local.mk | 1 + gnu/packages/patches/antiword-CVE-2014-8123.patch | 21 +++++++++++++++++++++ gnu/packages/textutils.scm | 5 ++++- 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/antiword-CVE-2014-8123.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index f5745d3372..4dda1fa28a 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -424,6 +424,7 @@ dist_patch_DATA = \ %D%/packages/patches/aegis-test-fixup-2.patch \ %D%/packages/patches/agg-am_c_prototype.patch \ %D%/packages/patches/alsa-lib-mips-atomic-fix.patch \ + %D%/packages/patches/antiword-CVE-2014-8123.patch \ %D%/packages/patches/apr-skip-getservbyname-test.patch \ %D%/packages/patches/arb-ldconfig.patch \ %D%/packages/patches/ath9k-htc-firmware-binutils.patch \ diff --git a/gnu/packages/patches/antiword-CVE-2014-8123.patch b/gnu/packages/patches/antiword-CVE-2014-8123.patch new file mode 100644 index 0000000000..d8d346a634 --- /dev/null +++ b/gnu/packages/patches/antiword-CVE-2014-8123.patch @@ -0,0 +1,21 @@ +Description: Add check for buffer overflow with malformed input files + This was later re-found and became CVE-2014-8123. +Author: +Bug-Debian: http://bugs.debian.org/407015 +Bug-Debian: https://bugs.debian.org/771768 +Forwarded: http://seclists.org/oss-sec/2014/q4/870 +Last-Update: 2016-01-11 + +--- antiword-0.37~/wordole.c 2005-08-26 21:49:57.000000000 +0200 ++++ antiword-0.37/wordole.c 2009-06-03 22:31:15.948014682 +0200 +@@ -259,6 +259,10 @@ + } + tNameSize = (size_t)usGetWord(0x40, aucBytes); + tNameSize = (tNameSize + 1) / 2; ++ if ( tNameSize > sizeof(atPPSlist[iIndex].szName)) { ++ werr(0, "Name Size of PPS %d is too large", iIndex); ++ tNameSize = sizeof(atPPSlist[iIndex].szName); ++ } + vName2String(atPPSlist[iIndex].szName, aucBytes, tNameSize); + atPPSlist[iIndex].ucType = ucGetByte(0x42, aucBytes); + if (atPPSlist[iIndex].ucType == 5) { diff --git a/gnu/packages/textutils.scm b/gnu/packages/textutils.scm index 080c95ba1c..ebcf4b9a1f 100644 --- a/gnu/packages/textutils.scm +++ b/gnu/packages/textutils.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2015 Roel Janssen ;;; Copyright © 2016 Jelle Licht ;;; Copyright © 2016 Alex Griffin +;;; Copyright © 2016 Efraim Flashner ;;; ;;; This file is part of GNU Guix. ;;; @@ -29,6 +30,7 @@ #:use-module (guix build-system gnu) #:use-module (guix build-system cmake) #:use-module (guix build-system trivial) + #:use-module (gnu packages) #:use-module (gnu packages autotools) #:use-module (gnu packages python) #:use-module (gnu packages zip)) @@ -306,7 +308,8 @@ regular expression object can be specified.") "/antiword-" version ".tar.gz")) (sha256 (base32 - "1b7mi1l20jhj09kyh0bq14qzz8vdhhyf35gzwsq43mn6rc7h0b4f")))) + "1b7mi1l20jhj09kyh0bq14qzz8vdhhyf35gzwsq43mn6rc7h0b4f")) + (patches (search-patches "antiword-CVE-2014-8123.patch")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; There are no tests -- cgit v1.2.3 From 538884ccef762c3410bf2a75af236803eca6b024 Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Mon, 30 May 2016 09:56:39 +0300 Subject: gnu: jansson: Fix CVE-2016-4425. * gnu/packages/web.scm (jansson)[source]: Add patch. * gnu/packages/patches/jansson-CVE-2016-4425.patch: New variable. * gnu/local.mk (dist_patch_DATA): Add it. --- gnu/local.mk | 1 + gnu/packages/patches/jansson-CVE-2016-4425.patch | 125 +++++++++++++++++++++++ gnu/packages/web.scm | 3 +- 3 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/jansson-CVE-2016-4425.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 4dda1fa28a..63ac668fc9 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -551,6 +551,7 @@ dist_patch_DATA = \ %D%/packages/patches/ilmbase-fix-tests.patch \ %D%/packages/patches/inkscape-drop-wait-for-targets.patch \ %D%/packages/patches/irrlicht-mesa-10.patch \ + %D%/packages/patches/jansson-CVE-2016-4425.patch \ %D%/packages/patches/jasper-CVE-2007-2721.patch \ %D%/packages/patches/jasper-CVE-2008-3520.patch \ %D%/packages/patches/jasper-CVE-2008-3522.patch \ diff --git a/gnu/packages/patches/jansson-CVE-2016-4425.patch b/gnu/packages/patches/jansson-CVE-2016-4425.patch new file mode 100644 index 0000000000..ebe9aa7809 --- /dev/null +++ b/gnu/packages/patches/jansson-CVE-2016-4425.patch @@ -0,0 +1,125 @@ +From 64ce0ad3731ebd77e02897b07920eadd0e2cc318 Mon Sep 17 00:00:00 2001 +From: Dmitry Janushkevich +Date: Mon, 2 May 2016 13:59:26 +0200 +Subject: [PATCH] Fix for issue #282 + +The fix limits recursion depths when parsing arrays and objects. +The limit is configurable via the `JSON_PARSER_MAX_DEPTH` setting +within `jansson_config.h` and is set by default to 2048. + +Update the RFC conformance document to note the limit; the RFC +allows limits to be set by the implementation so nothing has +actually changed w.r.t. conformance state. + +Reported by Gustavo Grieco. +--- + android/jansson_config.h | 4 ++++ + cmake/jansson_config.h.cmake | 4 ++++ + doc/conformance.rst | 10 ++++++++++ + src/jansson_config.h.in | 4 ++++ + src/load.c | 10 ++++++++++ + test/suites/invalid/recursion-depth/error | 2 ++ + test/suites/invalid/recursion-depth/input | 1 + + 7 files changed, 35 insertions(+) + create mode 100644 test/suites/invalid/recursion-depth/error + create mode 100644 test/suites/invalid/recursion-depth/input + +--- a/android/jansson_config.h ++++ b/android/jansson_config.h +@@ -36,4 +36,8 @@ + otherwise to 0. */ + #define JSON_HAVE_LOCALECONV 0 + ++/* Maximum recursion depth for parsing JSON input. ++ This limits the depth of e.g. array-within-array constructions. */ ++#define JSON_PARSER_MAX_DEPTH 2048 ++ + #endif +--- a/cmake/jansson_config.h.cmake ++++ b/cmake/jansson_config.h.cmake +@@ -60,5 +60,9 @@ + #define JSON_HAVE_LOCALECONV @JSON_HAVE_LOCALECONV@ + + ++/* Maximum recursion depth for parsing JSON input. ++ This limits the depth of e.g. array-within-array constructions. */ ++#define JSON_PARSER_MAX_DEPTH 2048 ++ + + #endif +--- a/doc/conformance.rst ++++ b/doc/conformance.rst +@@ -108,3 +108,13 @@ + are implicitly handled via the ordinary C type coercion rules (subject + to overflow semantics). Also, no support or hooks are provided for any + supplemental "bignum" type add-on packages. ++ ++Depth of nested values ++---------------------- ++ ++To avoid stack exhaustion, Jansson currently limits the nesting depth ++for arrays and objects to a certain value (default: 2048), defined as ++a macro ``JSON_PARSER_MAX_DEPTH`` within ``jansson_config.h``. ++ ++The limit is allowed to be set by the RFC; there is no recommended value ++or required minimum depth to be supported. +--- a/src/jansson_config.h.in ++++ b/src/jansson_config.h.in +@@ -36,4 +36,8 @@ + otherwise to 0. */ + #define JSON_HAVE_LOCALECONV @json_have_localeconv@ + ++/* Maximum recursion depth for parsing JSON input. ++ This limits the depth of e.g. array-within-array constructions. */ ++#define JSON_PARSER_MAX_DEPTH 2048 ++ + #endif +--- a/src/load.c ++++ b/src/load.c +@@ -61,6 +61,7 @@ + typedef struct { + stream_t stream; + strbuffer_t saved_text; ++ size_t depth; + int token; + union { + struct { +@@ -800,6 +801,12 @@ + json_t *json; + double value; + ++ lex->depth++; ++ if(lex->depth > JSON_PARSER_MAX_DEPTH) { ++ error_set(error, lex, "maximum parsing depth reached"); ++ return NULL; ++ } ++ + switch(lex->token) { + case TOKEN_STRING: { + const char *value = lex->value.string.val; +@@ -870,6 +877,7 @@ + if(!json) + return NULL; + ++ lex->depth--; + return json; + } + +@@ -877,6 +885,8 @@ + { + json_t *result; + ++ lex->depth = 0; ++ + lex_scan(lex, error); + if(!(flags & JSON_DECODE_ANY)) { + if(lex->token != '[' && lex->token != '{') { +--- /dev/null ++++ b/test/suites/invalid/recursion-depth/error +@@ -0,0 +1,2 @@ ++1 2049 2049 ++maximum parsing depth reached near '[' +--- /dev/null ++++ b/test/suites/invalid/recursion-depth/input +@@ -0,0 +1 @@ ++[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm index 7cadf9b930..9a7f9d2b3c 100644 --- a/gnu/packages/web.scm +++ b/gnu/packages/web.scm @@ -232,7 +232,8 @@ and UNIX socket support.") version ".tar.gz")) (sha256 (base32 - "1mvq9p85khsl818i4vbszyfab0fd45mdrwrxjkzw05mk1xcyc1br")))) + "1mvq9p85khsl818i4vbszyfab0fd45mdrwrxjkzw05mk1xcyc1br")) + (patches (search-patches "jansson-CVE-2016-4425.patch")))) (build-system gnu-build-system) (home-page "http://www.digip.org/jansson/") (synopsis "JSON C library") -- cgit v1.2.3 From 4f3e02f198719c98a46aa3060fbd9bececa20f87 Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Mon, 30 May 2016 11:46:12 +0300 Subject: gnu: t1lib: Fix CVE-2010-2642, CVE-2011-{0764, 1552, 1553, 1554}. * gnu/packages/fontutils.scm (t1lib)[source]: Add patches. * gnu/packages/patches/t1lib-CVE-2010-2642.patch, gnu/packages/patches/t1lib-CVE-2011-0764.patch, gnu/packages/patches/t1lib-CVE-2011-1552+CVE-2011-1553+CVE-2011-1554.patch: New variables. * gnu/local.mk (dist_patch_DATA): Add them. --- gnu/local.mk | 3 + gnu/packages/fontutils.scm | 6 +- gnu/packages/patches/t1lib-CVE-2010-2642.patch | 24 ++++ gnu/packages/patches/t1lib-CVE-2011-0764.patch | 32 +++++ ...CVE-2011-1552+CVE-2011-1553+CVE-2011-1554.patch | 133 +++++++++++++++++++++ 5 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/t1lib-CVE-2010-2642.patch create mode 100644 gnu/packages/patches/t1lib-CVE-2011-0764.patch create mode 100644 gnu/packages/patches/t1lib-CVE-2011-1552+CVE-2011-1553+CVE-2011-1554.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 63ac668fc9..1f2c2dd24d 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -741,6 +741,9 @@ dist_patch_DATA = \ %D%/packages/patches/sudo-CVE-2015-5602.patch \ %D%/packages/patches/superlu-dist-scotchmetis.patch \ %D%/packages/patches/synfig-build-fix.patch \ + %D%/packages/patches/t1lib-CVE-2010-2642.patch \ + %D%/packages/patches/t1lib-CVE-2011-0764.patch \ + %D%/packages/patches/t1lib-CVE-2011-1552+CVE-2011-1553+CVE-2011-1554.patch \ %D%/packages/patches/tar-d_ino_in_dirent-fix.patch \ %D%/packages/patches/tar-skip-unreliable-tests.patch \ %D%/packages/patches/tcl-mkindex-deterministic.patch \ diff --git a/gnu/packages/fontutils.scm b/gnu/packages/fontutils.scm index 3847cfb8d7..73ce685d51 100644 --- a/gnu/packages/fontutils.scm +++ b/gnu/packages/fontutils.scm @@ -286,7 +286,11 @@ high quality, anti-aliased and subpixel rendered text on a display.") (string-append "https://fossies.org/linux/misc/old/" name "-" version ".tar.gz"))) (sha256 (base32 - "0nbvjpnmcznib1nlgg8xckrmsw3haa154byds2h90y2g0nsjh4w2")))) + "0nbvjpnmcznib1nlgg8xckrmsw3haa154byds2h90y2g0nsjh4w2")) + (patches (search-patches + "t1lib-CVE-2010-2642.patch" + "t1lib-CVE-2011-0764.patch" + "t1lib-CVE-2011-1552+CVE-2011-1553+CVE-2011-1554.patch")))) (build-system gnu-build-system) (arguments ;; Making the documentation requires latex, but t1lib is also an input diff --git a/gnu/packages/patches/t1lib-CVE-2010-2642.patch b/gnu/packages/patches/t1lib-CVE-2010-2642.patch new file mode 100644 index 0000000000..cd54889585 --- /dev/null +++ b/gnu/packages/patches/t1lib-CVE-2010-2642.patch @@ -0,0 +1,24 @@ +diff --git a/lib/t1lib/parseAFM.c b/lib/t1lib/parseAFM.c +index 6a31d7f..ba64541 100644 +--- a/lib/t1lib/parseAFM.c ++++ b/lib/t1lib/parseAFM.c +@@ -199,7 +199,9 @@ static char *token(stream) + idx = 0; + + while (ch != EOF && ch != ' ' && ch != CR && ch != LF && +- ch != CTRL_Z && ch != '\t' && ch != ':' && ch != ';'){ ++ ch != CTRL_Z && ch != '\t' && ch != ':' && ch != ';' ++ && idx < (MAX_NAME -1)) ++ { + ident[idx++] = ch; + ch = fgetc(stream); + } /* while */ +@@ -235,7 +237,7 @@ static char *linetoken(stream) + while ((ch = fgetc(stream)) == ' ' || ch == '\t' ); + + idx = 0; +- while (ch != EOF && ch != CR && ch != LF && ch != CTRL_Z) ++ while (ch != EOF && ch != CR && ch != LF && ch != CTRL_Z && idx < (MAX_NAME - 1)) + { + ident[idx++] = ch; + ch = fgetc(stream); diff --git a/gnu/packages/patches/t1lib-CVE-2011-0764.patch b/gnu/packages/patches/t1lib-CVE-2011-0764.patch new file mode 100644 index 0000000000..c2d9e173b7 --- /dev/null +++ b/gnu/packages/patches/t1lib-CVE-2011-0764.patch @@ -0,0 +1,32 @@ +Description: Don't lookup previous point if there isn't any +Author: Marc Deslauriers +Forwarded: no + +Index: t1lib-5.1.2/lib/type1/type1.c +=================================================================== +--- t1lib-5.1.2.orig/lib/type1/type1.c 2011-12-13 14:24:14.280965637 -0600 ++++ t1lib-5.1.2/lib/type1/type1.c 2011-12-13 14:25:25.893320747 -0600 +@@ -1700,6 +1700,7 @@ + long pindex = 0; + + /* compute hinting for previous segment! */ ++ if (ppoints == NULL) Error0i("RLineTo: No previous point!\n"); + FindStems( currx, curry, currx-ppoints[numppoints-2].x, curry-ppoints[numppoints-2].y, dx, dy); + + /* Allocate a new path point and pre-setup data */ +@@ -1728,6 +1729,7 @@ + long pindex = 0; + + /* compute hinting for previous point! */ ++ if (ppoints == NULL) Error0i("RRCurveTo: No previous point!\n"); + FindStems( currx, curry, currx-ppoints[numppoints-2].x, curry-ppoints[numppoints-2].y, dx1, dy1); + + /* Allocate three new path points and pre-setup data */ +@@ -1903,6 +1905,7 @@ + FindStems( currx, curry, 0, 0, dx, dy); + } + else { ++ if (ppoints == NULL) Error0i("RMoveTo: No previous point!\n"); + FindStems( currx, curry, ppoints[numppoints-2].x, ppoints[numppoints-2].y, dx, dy); + } + diff --git a/gnu/packages/patches/t1lib-CVE-2011-1552+CVE-2011-1553+CVE-2011-1554.patch b/gnu/packages/patches/t1lib-CVE-2011-1552+CVE-2011-1553+CVE-2011-1554.patch new file mode 100644 index 0000000000..aaa31f7b93 --- /dev/null +++ b/gnu/packages/patches/t1lib-CVE-2011-1552+CVE-2011-1553+CVE-2011-1554.patch @@ -0,0 +1,133 @@ +Author: Jaroslav Škarvada +Description: Fix more crashes on oversized fonts +Bug-Redhat: http://bugzilla.redhat.com/show_bug.cgi?id=692909 +Index: t1lib-5.1.2/lib/type1/lines.c +=================================================================== +--- t1lib-5.1.2.orig/lib/type1/lines.c 2007-12-23 09:49:42.000000000 -0600 ++++ t1lib-5.1.2/lib/type1/lines.c 2012-01-17 14:15:08.000000000 -0600 +@@ -67,6 +67,10 @@ + None. + */ + ++#define BITS (sizeof(LONG)*8) ++#define HIGHTEST(p) (((p)>>(BITS-2)) != 0) /* includes sign bit */ ++#define TOOBIG(xy) ((xy < 0) ? HIGHTEST(-xy) : HIGHTEST(xy)) ++ + /* + :h2.StepLine() - Produces Run Ends for a Line After Checks + +@@ -84,6 +88,9 @@ + IfTrace4((LineDebug > 0), ".....StepLine: (%d,%d) to (%d,%d)\n", + x1, y1, x2, y2); + ++ if ( TOOBIG(x1) || TOOBIG(x2) || TOOBIG(y1) || TOOBIG(y2)) ++ abort("Lines this big not supported", 49); ++ + dy = y2 - y1; + + /* +Index: t1lib-5.1.2/lib/type1/objects.c +=================================================================== +--- t1lib-5.1.2.orig/lib/type1/objects.c 2007-12-23 09:49:42.000000000 -0600 ++++ t1lib-5.1.2/lib/type1/objects.c 2012-01-17 14:15:08.000000000 -0600 +@@ -1137,12 +1137,13 @@ + "Context: out of them", /* 46 */ + "MatrixInvert: can't", /* 47 */ + "xiStub called", /* 48 */ +- "Illegal access type1 abort() message" /* 49 */ ++ "Lines this big not supported", /* 49 */ ++ "Illegal access type1 abort() message" /* 50 */ + }; + +- /* no is valid from 1 to 48 */ +- if ( (number<1)||(number>48)) +- number=49; ++ /* no is valid from 1 to 49 */ ++ if ( (number<1)||(number>49)) ++ number=50; + return( err_msgs[number-1]); + + } +Index: t1lib-5.1.2/lib/type1/type1.c +=================================================================== +--- t1lib-5.1.2.orig/lib/type1/type1.c 2012-01-17 14:13:28.000000000 -0600 ++++ t1lib-5.1.2/lib/type1/type1.c 2012-01-17 14:19:54.000000000 -0600 +@@ -1012,6 +1012,7 @@ + double nextdtana = 0.0; /* tangent of post-delta against horizontal line */ + double nextdtanb = 0.0; /* tangent of post-delta against vertical line */ + ++ if (ppoints == NULL || numppoints < 1) Error0v("FindStems: No previous point!\n"); + + /* setup default hinted position */ + ppoints[numppoints-1].ax = ppoints[numppoints-1].x; +@@ -1289,7 +1290,7 @@ + static int DoRead(CodeP) + int *CodeP; + { +- if (strindex >= CharStringP->len) return(FALSE); /* end of string */ ++ if (!CharStringP || strindex >= CharStringP->len) return(FALSE); /* end of string */ + /* We handle the non-documented Adobe convention to use lenIV=-1 to + suppress charstring encryption. */ + if (blues->lenIV==-1) { +@@ -1700,7 +1701,7 @@ + long pindex = 0; + + /* compute hinting for previous segment! */ +- if (ppoints == NULL) Error0i("RLineTo: No previous point!\n"); ++ if (ppoints == NULL || numppoints < 2) Error0i("RLineTo: No previous point!\n"); + FindStems( currx, curry, currx-ppoints[numppoints-2].x, curry-ppoints[numppoints-2].y, dx, dy); + + /* Allocate a new path point and pre-setup data */ +@@ -1729,7 +1730,7 @@ + long pindex = 0; + + /* compute hinting for previous point! */ +- if (ppoints == NULL) Error0i("RRCurveTo: No previous point!\n"); ++ if (ppoints == NULL || numppoints < 2) Error0i("RRCurveTo: No previous point!\n"); + FindStems( currx, curry, currx-ppoints[numppoints-2].x, curry-ppoints[numppoints-2].y, dx1, dy1); + + /* Allocate three new path points and pre-setup data */ +@@ -1788,7 +1789,9 @@ + long tmpind; + double deltax = 0.0; + double deltay = 0.0; +- ++ ++ if (ppoints == NULL || numppoints < 1) Error0i("DoClosePath: No previous point!"); ++ + /* If this ClosePath command together with the starting point of this + path completes to a segment aligned to a stem, we would miss + hinting for this point. --> Check and explicitly care for this! */ +@@ -1803,6 +1806,7 @@ + deltax = ppoints[i].x - ppoints[numppoints-1].x; + deltay = ppoints[i].y - ppoints[numppoints-1].y; + ++ if (ppoints == NULL || numppoints <= i + 1) Error0i("DoClosePath: No previous point!"); + /* save nummppoints and reset to move point */ + tmpind = numppoints; + numppoints = i + 1; +@@ -1905,7 +1909,7 @@ + FindStems( currx, curry, 0, 0, dx, dy); + } + else { +- if (ppoints == NULL) Error0i("RMoveTo: No previous point!\n"); ++ if (ppoints == NULL || numppoints < 2) Error0i("RMoveTo: No previous point!\n"); + FindStems( currx, curry, ppoints[numppoints-2].x, ppoints[numppoints-2].y, dx, dy); + } + +@@ -2155,6 +2159,7 @@ + DOUBLE cx, cy; + DOUBLE ex, ey; + ++ if (ppoints == NULL || numppoints < 8) Error0v("FlxProc: No previous point!"); + + /* Our PPOINT list now contains 7 moveto commands which + are about to be consumed by the Flex mechanism. --> Remove these +@@ -2324,6 +2329,7 @@ + /* Returns currentpoint on stack */ + static void FlxProc2() + { ++ if (ppoints == NULL || numppoints < 1) Error0v("FlxProc2: No previous point!"); + /* Push CurrentPoint on fake PostScript stack */ + PSFakePush( ppoints[numppoints-1].x); + PSFakePush( ppoints[numppoints-1].y); -- cgit v1.2.3 From 7d48938a590c676e6f140a976bfcf26aadeb008a Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Mon, 30 May 2016 11:53:45 +0300 Subject: gnu: vte-0.28: Fix CVE-2012-2738. * gnu/packages/gnome.scm (vte-0.28)[source]: Add patches. * gnu/packages/patches/vte-CVE-2012-2738-pt1.patch, gnu/packages/patches/vte-CVE-2012-2738-pt2.patch: New variables. * gnu/local.mk (dist_patch_DATA): Add them. --- gnu/local.mk | 2 + gnu/packages/gnome.scm | 5 +- gnu/packages/patches/vte-CVE-2012-2738-pt1.patch | 40 ++++++++++++ gnu/packages/patches/vte-CVE-2012-2738-pt2.patch | 82 ++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/vte-CVE-2012-2738-pt1.patch create mode 100644 gnu/packages/patches/vte-CVE-2012-2738-pt2.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 1f2c2dd24d..dc1b521b6e 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -779,6 +779,8 @@ dist_patch_DATA = \ %D%/packages/patches/vorbis-tools-CVE-2014-9640.patch \ %D%/packages/patches/vorbis-tools-CVE-2015-6749.patch \ %D%/packages/patches/vpnc-script.patch \ + %D%/packages/patches/vte-CVE-2012-2738-pt1.patch \ + %D%/packages/patches/vte-CVE-2012-2738-pt2.patch \ %D%/packages/patches/vtk-mesa-10.patch \ %D%/packages/patches/w3m-libgc.patch \ %D%/packages/patches/w3m-force-ssl_verify_server-on.patch \ diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm index 04d9bb75bd..0d9c946fd5 100644 --- a/gnu/packages/gnome.scm +++ b/gnu/packages/gnome.scm @@ -1820,7 +1820,10 @@ editors, IDEs, etc.") name "-" version ".tar.xz")) (sha256 (base32 - "1bmhahkf8wdsra9whd3k5l5z4rv7r58ksr8mshzajgq2ma0hpkw6")))) + "1bmhahkf8wdsra9whd3k5l5z4rv7r58ksr8mshzajgq2ma0hpkw6")) + (patches (search-patches + "vte-CVE-2012-2738-pt1.patch" + "vte-CVE-2012-2738-pt2.patch")))) (arguments '(#:configure-flags '("--disable-python"))) (native-inputs diff --git a/gnu/packages/patches/vte-CVE-2012-2738-pt1.patch b/gnu/packages/patches/vte-CVE-2012-2738-pt1.patch new file mode 100644 index 0000000000..fd45407939 --- /dev/null +++ b/gnu/packages/patches/vte-CVE-2012-2738-pt1.patch @@ -0,0 +1,40 @@ +From feeee4b5832b17641e505b7083e0d299fdae318e Mon Sep 17 00:00:00 2001 +From: Christian Persch +Date: Sat, 19 May 2012 17:36:09 +0000 +Subject: emulation: Limit integer arguments to 65535 + +To guard against malicious sequences containing excessively big numbers, +limit all parsed numbers to 16 bit range. Doing this here in the parsing +routine is a catch-all guard; this doesn't preclude enforcing +more stringent limits in the handlers themselves. + +https://bugzilla.gnome.org/show_bug.cgi?id=676090 +--- +diff --git a/src/table.c b/src/table.c +index 140e8c8..85cf631 100644 +--- a/src/table.c ++++ b/src/table.c +@@ -550,7 +550,7 @@ _vte_table_extract_numbers(GValueArray **array, + if (G_UNLIKELY (*array == NULL)) { + *array = g_value_array_new(1); + } +- g_value_set_long(&value, total); ++ g_value_set_long(&value, CLAMP (total, 0, G_MAXUSHORT)); + g_value_array_append(*array, &value); + } while (i++ < arginfo->length); + g_value_unset(&value); +diff --git a/src/vteseq.c b/src/vteseq.c +index 457c06a..46def5b 100644 +--- a/src/vteseq.c ++++ b/src/vteseq.c +@@ -557,7 +557,7 @@ vte_sequence_handler_multiple(VteTerminal *terminal, + GValueArray *params, + VteTerminalSequenceHandler handler) + { +- vte_sequence_handler_multiple_limited(terminal, params, handler, G_MAXLONG); ++ vte_sequence_handler_multiple_limited(terminal, params, handler, G_MAXUSHORT); + } + + static void +-- +cgit v0.9.0.2 diff --git a/gnu/packages/patches/vte-CVE-2012-2738-pt2.patch b/gnu/packages/patches/vte-CVE-2012-2738-pt2.patch new file mode 100644 index 0000000000..e98fd35b95 --- /dev/null +++ b/gnu/packages/patches/vte-CVE-2012-2738-pt2.patch @@ -0,0 +1,82 @@ +From 98ce2f265f986fb88c38d508286bb5e3716b9e74 Mon Sep 17 00:00:00 2001 +From: Christian Persch +Date: Sat, 19 May 2012 18:04:12 +0000 +Subject: emulation: Limit repetitions + +Don't allow malicious sequences to cause excessive repetitions. + +https://bugzilla.gnome.org/show_bug.cgi?id=676090 +--- +diff --git a/src/vteseq.c b/src/vteseq.c +index 46def5b..7fb4707 100644 +--- a/src/vteseq.c ++++ b/src/vteseq.c +@@ -1397,7 +1397,7 @@ vte_sequence_handler_dc (VteTerminal *terminal, GValueArray *params) + static void + vte_sequence_handler_DC (VteTerminal *terminal, GValueArray *params) + { +- vte_sequence_handler_multiple(terminal, params, vte_sequence_handler_dc); ++ vte_sequence_handler_multiple_r(terminal, params, vte_sequence_handler_dc); + } + + /* Delete a line at the current cursor position. */ +@@ -1790,7 +1790,7 @@ vte_sequence_handler_reverse_index (VteTerminal *terminal, GValueArray *params) + static void + vte_sequence_handler_RI (VteTerminal *terminal, GValueArray *params) + { +- vte_sequence_handler_multiple(terminal, params, vte_sequence_handler_nd); ++ vte_sequence_handler_multiple_r(terminal, params, vte_sequence_handler_nd); + } + + /* Save cursor (position). */ +@@ -2782,8 +2782,7 @@ vte_sequence_handler_insert_lines (VteTerminal *terminal, GValueArray *params) + { + GValue *value; + VteScreen *screen; +- long param, end, row; +- int i; ++ long param, end, row, i, limit; + screen = terminal->pvt->screen; + /* The default is one. */ + param = 1; +@@ -2801,7 +2800,13 @@ vte_sequence_handler_insert_lines (VteTerminal *terminal, GValueArray *params) + } else { + end = screen->insert_delta + terminal->row_count - 1; + } +- /* Insert the new lines at the cursor. */ ++ ++ /* Only allow to insert as many lines as there are between this row ++ * and the end of the scrolling region. See bug #676090. ++ */ ++ limit = end - row + 1; ++ param = MIN (param, limit); ++ + for (i = 0; i < param; i++) { + /* Clear a line off the end of the region and add one to the + * top of the region. */ +@@ -2822,8 +2827,7 @@ vte_sequence_handler_delete_lines (VteTerminal *terminal, GValueArray *params) + { + GValue *value; + VteScreen *screen; +- long param, end, row; +- int i; ++ long param, end, row, i, limit; + + screen = terminal->pvt->screen; + /* The default is one. */ +@@ -2842,6 +2846,13 @@ vte_sequence_handler_delete_lines (VteTerminal *terminal, GValueArray *params) + } else { + end = screen->insert_delta + terminal->row_count - 1; + } ++ ++ /* Only allow to delete as many lines as there are between this row ++ * and the end of the scrolling region. See bug #676090. ++ */ ++ limit = end - row + 1; ++ param = MIN (param, limit); ++ + /* Clear them from below the current cursor. */ + for (i = 0; i < param; i++) { + /* Insert a line at the end of the region and remove one from +-- +cgit v0.9.0.2 -- cgit v1.2.3 From 5f1ba08953dfa44aee9efe4d38a50ffb3d949dc2 Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Mon, 30 May 2016 12:01:32 +0300 Subject: gnu: gegl: Fix CVE-2012-4433. * gnu/packages/gimp.scm (gegl)[source]: Add patch. * gnu/packages/patches/gegl-CVE-2012-4433.patch: New variable. * gnu/local.mk (dist_patch_DATA): Add it. --- gnu/local.mk | 1 + gnu/packages/gimp.scm | 5 +- gnu/packages/patches/gegl-CVE-2012-4433.patch | 117 ++++++++++++++++++++++++++ 3 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/gegl-CVE-2012-4433.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index dc1b521b6e..66538e69cb 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -501,6 +501,7 @@ dist_patch_DATA = \ %D%/packages/patches/gcc-cross-environment-variables.patch \ %D%/packages/patches/gcc-libvtv-runpath.patch \ %D%/packages/patches/gcc-5.0-libvtv-runpath.patch \ + %D%/packages/patches/gegl-CVE-2012-4433.patch \ %D%/packages/patches/geoclue-config.patch \ %D%/packages/patches/ghostscript-CVE-2015-3228.patch \ %D%/packages/patches/ghostscript-runpath.patch \ diff --git a/gnu/packages/gimp.scm b/gnu/packages/gimp.scm index bd2794305b..b11791b921 100644 --- a/gnu/packages/gimp.scm +++ b/gnu/packages/gimp.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014, 2015 Ludovic Courtès ;;; Copyright © 2016 Ricardo Wurmus +;;; Copyright © 2016 Efraim Flashner ;;; ;;; This file is part of GNU Guix. ;;; @@ -24,6 +25,7 @@ #:use-module ((guix licenses) #:prefix license:) #:use-module (guix build-system gnu) #:use-module (guix build-system glib-or-gtk) + #:use-module (gnu packages) #:use-module (gnu packages algebra) #:use-module (gnu packages pkg-config) #:use-module (gnu packages glib) @@ -75,7 +77,8 @@ provided as well as the framework to add new color models and data types.") "/" name "-" version ".tar.bz2"))) (sha256 (base32 - "09nlv06li9nrn74ifpm7223mxpg0s7cii702z72cpbwrjh6nlbnz")))) + "09nlv06li9nrn74ifpm7223mxpg0s7cii702z72cpbwrjh6nlbnz")) + (patches (search-patches "gegl-CVE-2012-4433.patch")))) (build-system gnu-build-system) (arguments `(;; More than just the one test disabled below now fails; disable them diff --git a/gnu/packages/patches/gegl-CVE-2012-4433.patch b/gnu/packages/patches/gegl-CVE-2012-4433.patch new file mode 100644 index 0000000000..7352b78dba --- /dev/null +++ b/gnu/packages/patches/gegl-CVE-2012-4433.patch @@ -0,0 +1,117 @@ +From: Michael Gilbert +Date: Mon, 9 Sep 2013 17:34:32 +0200 +Subject: Fix_CVE-2012-4433 + +Multiple buffer overflow issues. + +Closes: #692435 +--- + operations/external/ppm-load.c | 62 ++++++++++++++++++++++++++++++++++++------ + 1 file changed, 53 insertions(+), 9 deletions(-) + +diff --git a/operations/external/ppm-load.c b/operations/external/ppm-load.c +index efe6d56..465096d 100644 +--- a/operations/external/ppm-load.c ++++ b/operations/external/ppm-load.c +@@ -36,6 +36,7 @@ gegl_chant_file_path (path, _("File"), "", _("Path of file to load.")) + #include "gegl-chant.h" + #include + #include ++#include + + typedef enum { + PIXMAP_ASCII = 51, +@@ -44,8 +45,8 @@ typedef enum { + + typedef struct { + map_type type; +- gint width; +- gint height; ++ glong width; ++ glong height; + gsize numsamples; /* width * height * channels */ + gsize bpc; /* bytes per channel */ + guchar *data; +@@ -82,12 +83,33 @@ ppm_load_read_header(FILE *fp, + } + + /* Get Width and Height */ +- img->width = strtol (header,&ptr,0); +- img->height = atoi (ptr); +- img->numsamples = img->width * img->height * CHANNEL_COUNT; ++ errno = 0; ++ img->width = strtol (header,&ptr,10); ++ if (errno) ++ { ++ g_warning ("Error reading width: %s", strerror(errno)); ++ return FALSE; ++ } ++ else if (img->width < 0) ++ { ++ g_warning ("Error: width is negative"); ++ return FALSE; ++ } ++ ++ img->height = strtol (ptr,&ptr,10); ++ if (errno) ++ { ++ g_warning ("Error reading height: %s", strerror(errno)); ++ return FALSE; ++ } ++ else if (img->width < 0) ++ { ++ g_warning ("Error: height is negative"); ++ return FALSE; ++ } + + fgets (header,MAX_CHARS_IN_ROW,fp); +- maxval = strtol (header,&ptr,0); ++ maxval = strtol (header,&ptr,10); + + if ((maxval != 255) && (maxval != 65535)) + { +@@ -109,6 +131,16 @@ ppm_load_read_header(FILE *fp, + g_warning ("%s: Programmer stupidity error", G_STRLOC); + } + ++ /* Later on, img->numsamples is multiplied with img->bpc to allocate ++ * memory. Ensure it doesn't overflow. */ ++ if (!img->width || !img->height || ++ G_MAXSIZE / img->width / img->height / CHANNEL_COUNT < img->bpc) ++ { ++ g_warning ("Illegal width/height: %ld/%ld", img->width, img->height); ++ return FALSE; ++ } ++ img->numsamples = img->width * img->height * CHANNEL_COUNT; ++ + return TRUE; + } + +@@ -229,12 +261,24 @@ process (GeglOperation *operation, + if (!ppm_load_read_header (fp, &img)) + goto out; + +- rect.height = img.height; +- rect.width = img.width; +- + /* Allocating Array Size */ ++ ++ /* Should use g_try_malloc(), but this causes crashes elsewhere because the ++ * error signalled by returning FALSE isn't properly acted upon. Therefore ++ * g_malloc() is used here which aborts if the requested memory size can't be ++ * allocated causing a controlled crash. */ + img.data = (guchar*) g_malloc (img.numsamples * img.bpc); + ++ /* No-op without g_try_malloc(), see above. */ ++ if (! img.data) ++ { ++ g_warning ("Couldn't allocate %" G_GSIZE_FORMAT " bytes, giving up.", ((gsize)img.numsamples * img.bpc)); ++ goto out; ++ } ++ ++ rect.height = img.height; ++ rect.width = img.width; ++ + switch (img.bpc) + { + case 1: -- cgit v1.2.3 From 4509ec72a4f7034e9a7087e802a84bbe04f4c12c Mon Sep 17 00:00:00 2001 From: Alex Kost Date: Thu, 26 May 2016 11:45:16 +0300 Subject: gnu: emacs: Fix indentation of scheme keyword lists. * gnu/packages/patches/emacs-fix-scheme-indent-function.patch: New patch. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/emacs.scm (emacs)[source]: Use it. --- gnu/local.mk | 1 + gnu/packages/emacs.scm | 1 + .../patches/emacs-fix-scheme-indent-function.patch | 29 ++++++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 gnu/packages/patches/emacs-fix-scheme-indent-function.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 66538e69cb..6110d2d784 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -472,6 +472,7 @@ dist_patch_DATA = \ %D%/packages/patches/elfutils-tests-ptrace.patch \ %D%/packages/patches/einstein-build.patch \ %D%/packages/patches/emacs-exec-path.patch \ + %D%/packages/patches/emacs-fix-scheme-indent-function.patch \ %D%/packages/patches/emacs-scheme-complete-scheme-r5rs-info.patch \ %D%/packages/patches/emacs-source-date-epoch.patch \ %D%/packages/patches/eudev-rules-directory.patch \ diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm index 5d6db5ae11..7d0427d071 100644 --- a/gnu/packages/emacs.scm +++ b/gnu/packages/emacs.scm @@ -80,6 +80,7 @@ (base32 "0kn3rzm91qiswi0cql89kbv6mqn27rwsyjfb8xmwy9m5s8fxfiyx")) (patches (search-patches "emacs-exec-path.patch" + "emacs-fix-scheme-indent-function.patch" "emacs-source-date-epoch.patch")) (modules '((guix build utils))) (snippet diff --git a/gnu/packages/patches/emacs-fix-scheme-indent-function.patch b/gnu/packages/patches/emacs-fix-scheme-indent-function.patch new file mode 100644 index 0000000000..c5a426802c --- /dev/null +++ b/gnu/packages/patches/emacs-fix-scheme-indent-function.patch @@ -0,0 +1,29 @@ +Fix 'scheme-indent-function' to indent s-expressions starting with a keyword +properly, like this: + +(#:foo 1 + #:bar 2) + +instead of like this: + +(#:foo 1 + #:bar 2) + +The fix is made by Mark H Weaver : + + +--- a/lisp/progmodes/scheme.el ++++ b/lisp/progmodes/scheme.el +@@ -482,6 +482,12 @@ + (> (length function) 3) + (string-match "\\`def" function))) + (lisp-indent-defform state indent-point)) ++ ((and (null method) ++ (> (length function) 1) ++ ;; The '#' in '#:' seems to get lost, not sure why ++ (string-match "\\`:" function)) ++ (let ((lisp-body-indent 1)) ++ (lisp-indent-defform state indent-point))) + ((integerp method) + (lisp-indent-specform method state + indent-point normal-indent)) -- cgit v1.2.3 From 726f0888849102b4ba4df6dd8738012c1d4c90d4 Mon Sep 17 00:00:00 2001 From: Leo Famulari Date: Mon, 30 May 2016 12:30:49 -0400 Subject: gnu: devil: Fix CVE-2009-3994. * gnu/packages/patches/devil-CVE-2009-3994.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/image.scm (devil): Use it. --- gnu/local.mk | 1 + gnu/packages/image.scm | 3 ++- gnu/packages/patches/devil-CVE-2009-3994.patch | 24 ++++++++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/devil-CVE-2009-3994.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 6110d2d784..5f10dd86be 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -460,6 +460,7 @@ dist_patch_DATA = \ %D%/packages/patches/cursynth-wave-rand.patch \ %D%/packages/patches/dbus-helper-search-path.patch \ %D%/packages/patches/dealii-p4est-interface.patch \ + %D%/packages/patches/devil-CVE-2009-3994.patch \ %D%/packages/patches/devil-fix-libpng.patch \ %D%/packages/patches/dico-libtool-deterministic.patch \ %D%/packages/patches/diffutils-gets-undeclared.patch \ diff --git a/gnu/packages/image.scm b/gnu/packages/image.scm index 3651e97f3e..eca9012bf8 100644 --- a/gnu/packages/image.scm +++ b/gnu/packages/image.scm @@ -693,7 +693,8 @@ channels.") "1zd850nn7nvkkhasrv7kn17kzgslr5ry933v6db62s4lr0zzlbv8")) ;; Backported from upstream: ;; https://github.com/DentonW/DevIL/commit/724194d7a9a91221a564579f64bdd6f0abd64219.patch - (patches (search-patches "devil-fix-libpng.patch")) + (patches (search-patches "devil-fix-libpng.patch" + "devil-CVE-2009-3994.patch")) (modules '((guix build utils))) (snippet ;; Fix old lcms include directives and lib flags. diff --git a/gnu/packages/patches/devil-CVE-2009-3994.patch b/gnu/packages/patches/devil-CVE-2009-3994.patch new file mode 100644 index 0000000000..e009a95c44 --- /dev/null +++ b/gnu/packages/patches/devil-CVE-2009-3994.patch @@ -0,0 +1,24 @@ +Fix CVE-2009-3994 (buffer overflow in GetUID() allows remote DOS or +arbitrary code execution via crafted DICOM file). + +https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3994 + +Copied from Fedora +https://pkgs.fedoraproject.org/cgit/rpms/DevIL.git/tree/DevIL-1.7.8-CVE-2009-3994.patch?id=9c656a75393d6c455aef9f4968fbbee9c53f4fdb + +diff -up devil-1.7.8/src-IL/src/il_dicom.c~ devil-1.7.8/src-IL/src/il_dicom.c +--- devil-1.7.8/src-IL/src/il_dicom.c~ 2009-03-08 08:10:09.000000000 +0100 ++++ devil-1.7.8/src-IL/src/il_dicom.c 2009-12-03 12:07:45.000000000 +0100 +@@ -427,9 +427,11 @@ ILboolean GetUID(ILubyte *UID) + return IL_FALSE; + + ValLen = GetLittleUShort(); ++ if (ValLen > 64) ++ return IL_FALSE; + if (iread(UID, ValLen, 1) != 1) + return IL_FALSE; +- UID[64] = 0; // Just to make sure that our string is terminated. ++ UID[ValLen] = 0; // Just to make sure that our string is terminated. + + return IL_TRUE; + } -- cgit v1.2.3 From 1f521b7055a464439774332f1a69ed31b565715f Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Mon, 30 May 2016 17:17:09 +0300 Subject: gnu: id3lib: Fix CVE-2007-4460. * gnu/packages/mp3.scm (id3lib)[source]: Add patch. * gnu/packages/patches/id3lib-CVE-2007-4460.patch: New variable. * gnu/local.mk (dist_patch_DATA): Add it. --- gnu/local.mk | 1 + gnu/packages/mp3.scm | 6 +-- gnu/packages/patches/id3lib-CVE-2007-4460.patch | 54 +++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 gnu/packages/patches/id3lib-CVE-2007-4460.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 5f10dd86be..11b7ccb692 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -551,6 +551,7 @@ dist_patch_DATA = \ %D%/packages/patches/icu4c-CVE-2014-6585.patch \ %D%/packages/patches/icu4c-CVE-2015-1270.patch \ %D%/packages/patches/icu4c-CVE-2015-4760.patch \ + %D%/packages/patches/id3lib-CVE-2007-4460.patch \ %D%/packages/patches/ilmbase-fix-tests.patch \ %D%/packages/patches/inkscape-drop-wait-for-targets.patch \ %D%/packages/patches/irrlicht-mesa-10.patch \ diff --git a/gnu/packages/mp3.scm b/gnu/packages/mp3.scm index 997c50f5f4..8451f0ac9f 100644 --- a/gnu/packages/mp3.scm +++ b/gnu/packages/mp3.scm @@ -108,11 +108,11 @@ versions of ID3v2.") (source (origin (method url-fetch) (uri (string-append "mirror://sourceforge/id3lib/id3lib/" - version "/id3lib-" - version ".tar.gz")) + version "/id3lib-" version ".tar.gz")) (sha256 (base32 - "0yfhqwk0w8q2hyv1jib1008jvzmwlpsxvc8qjllhna6p1hycqj97")))) + "0yfhqwk0w8q2hyv1jib1008jvzmwlpsxvc8qjllhna6p1hycqj97")) + (patches (search-patches "id3lib-CVE-2007-4460.patch")))) (build-system gnu-build-system) (arguments `(#:phases diff --git a/gnu/packages/patches/id3lib-CVE-2007-4460.patch b/gnu/packages/patches/id3lib-CVE-2007-4460.patch new file mode 100644 index 0000000000..36c84179fc --- /dev/null +++ b/gnu/packages/patches/id3lib-CVE-2007-4460.patch @@ -0,0 +1,54 @@ +This patch fixes an issues where temporary files were created in an insecure +way. + +It was first intruduced in version 3.8.3-7 and fixes +http://bugs.debian.org/438540 +--- a/src/tag_file.cpp ++++ b/src/tag_file.cpp +@@ -242,8 +242,8 @@ + strcpy(sTempFile, filename.c_str()); + strcat(sTempFile, sTmpSuffix.c_str()); + +-#if ((defined(__GNUC__) && __GNUC__ >= 3 ) || !defined(HAVE_MKSTEMP)) +- // This section is for Windows folk && gcc 3.x folk ++#if !defined(HAVE_MKSTEMP) ++ // This section is for Windows folk + fstream tmpOut; + createFile(sTempFile, tmpOut); + +@@ -257,7 +257,7 @@ + tmpOut.write((char *)tmpBuffer, nBytes); + } + +-#else //((defined(__GNUC__) && __GNUC__ >= 3 ) || !defined(HAVE_MKSTEMP)) ++#else //!defined(HAVE_MKSTEMP) + + // else we gotta make a temp file, copy the tag into it, copy the + // rest of the old file after the tag, delete the old file, rename +@@ -270,7 +270,7 @@ + //ID3_THROW_DESC(ID3E_NoFile, "couldn't open temp file"); + } + +- ofstream tmpOut(fd); ++ ofstream tmpOut(sTempFile); + if (!tmpOut) + { + tmpOut.close(); +@@ -285,14 +285,14 @@ + uchar tmpBuffer[BUFSIZ]; + while (file) + { +- file.read(tmpBuffer, BUFSIZ); ++ file.read((char *)tmpBuffer, BUFSIZ); + size_t nBytes = file.gcount(); +- tmpOut.write(tmpBuffer, nBytes); ++ tmpOut.write((char *)tmpBuffer, nBytes); + } + + close(fd); //closes the file + +-#endif ////((defined(__GNUC__) && __GNUC__ >= 3 ) || !defined(HAVE_MKSTEMP)) ++#endif ////!defined(HAVE_MKSTEMP) + + tmpOut.close(); + file.close(); -- cgit v1.2.3 From c1dbd3a8709f143fa72b2f893a069ca5f1afe7ac Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Mon, 30 May 2016 20:11:39 +0300 Subject: gnu: wordnet: Fix CVE-2008-2149, CVE-2008-3908. * gnu/packages/wordnet.scm (wordnet)[source]: Add patches. * gnu/packages/patches/wordnet-CVE-2008-2149.patch, gnu/packages/patches/wordnet-CVE-2008-3908-pt1.patch, gnu/packages/patches/wordnet-CVE-2008-3908-pt2.patch: New variables. * gnu/local.mk (dist_patch_DATA): Add them. --- gnu/local.mk | 3 + gnu/packages/patches/wordnet-CVE-2008-2149.patch | 19 + .../patches/wordnet-CVE-2008-3908-pt1.patch | 710 +++++++++++++++++++++ .../patches/wordnet-CVE-2008-3908-pt2.patch | 18 + gnu/packages/wordnet.scm | 11 +- 5 files changed, 758 insertions(+), 3 deletions(-) create mode 100644 gnu/packages/patches/wordnet-CVE-2008-2149.patch create mode 100644 gnu/packages/patches/wordnet-CVE-2008-3908-pt1.patch create mode 100644 gnu/packages/patches/wordnet-CVE-2008-3908-pt2.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 11b7ccb692..d97c2218b5 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -798,6 +798,9 @@ dist_patch_DATA = \ %D%/packages/patches/wicd-wpa2-ttls.patch \ %D%/packages/patches/wmctrl-64-fix.patch \ %D%/packages/patches/woff2-libbrotli.patch \ + %D%/packages/patches/wordnet-CVE-2008-2149.patch \ + %D%/packages/patches/wordnet-CVE-2008-3908-pt1.patch \ + %D%/packages/patches/wordnet-CVE-2008-3908-pt2.patch \ %D%/packages/patches/wpa-supplicant-CVE-2015-5310.patch \ %D%/packages/patches/wpa-supplicant-CVE-2015-5314.patch \ %D%/packages/patches/wpa-supplicant-CVE-2015-5315.patch \ diff --git a/gnu/packages/patches/wordnet-CVE-2008-2149.patch b/gnu/packages/patches/wordnet-CVE-2008-2149.patch new file mode 100644 index 0000000000..9828efa4bc --- /dev/null +++ b/gnu/packages/patches/wordnet-CVE-2008-2149.patch @@ -0,0 +1,19 @@ +Fix CVE-2008-2149: buffer overflows by limiting the length of the string in sprintf +format string +Closes: #481186 (CVE-2008-2149) +Please note: The WordNet code contains several other occurences of potentially +exploitable functions like strcpy()/strcat()/... and so even if there are no +known exploits the code needs a full security audit. + +--- a/src/wn.c ++++ b/src/wn.c +@@ -206,7 +206,8 @@ static int searchwn(int ac, char *av[]) + outsenses += do_search(av[1], optptr->pos, optptr->search, + whichsense, optptr->label); + } else { +- sprintf(tmpbuf, "wn: invalid search option: %s\n", av[j]); ++ /* Fix CVE-2008-2149: buffer overflows Andreas Tille */ ++ sprintf(tmpbuf, "wn: invalid search option: %.200s\n", av[j]); + display_message(tmpbuf); + errcount++; + } diff --git a/gnu/packages/patches/wordnet-CVE-2008-3908-pt1.patch b/gnu/packages/patches/wordnet-CVE-2008-3908-pt1.patch new file mode 100644 index 0000000000..a2e796b535 --- /dev/null +++ b/gnu/packages/patches/wordnet-CVE-2008-3908-pt1.patch @@ -0,0 +1,710 @@ +Author: Anton Gladky +LastChanged: Tue, 26 Feb 2013 20:40:25 +0100 +BugDebian: http://bugs.debian.org/700914 +Description: This patch was created by oCert according to + http://www.ocert.org/advisories/ocert-2008-014.html + and can be downloaded from + http://www.ocert.org/analysis/2008-014/wordnet.patch + Unfortunately the original patch had a problem which + caused 'wordnet test -synsn' to fail. The critical + part of the patch was removed from the whole patch + set and is moved to 51_overflows_memcpy.patch which + uses memcpy instead of the formerly used strcpy. + +--- a/lib/binsrch.c ++++ b/lib/binsrch.c +@@ -28,7 +28,7 @@ char *read_index(long offset, FILE *fp) + char *linep; + + linep = line; +- line[0] = '0'; ++ line[0] = '\0'; + + fseek( fp, offset, SEEK_SET ); + fgets(linep, LINE_LEN, fp); +@@ -58,6 +58,8 @@ char *bin_search(char *searchkey, FILE * + last_bin_search_offset = ftell( fp ); + fgets(linep, LINE_LEN, fp); + length = (int)(strchr(linep, ' ') - linep); ++ if (length > (sizeof(key) - 1)) ++ return(NULL); + strncpy(key, linep, length); + key[length] = '\0'; + if(strcmp(key, searchkey) < 0) { +@@ -110,6 +112,8 @@ static int bin_search_key(char *searchke + line[length++] = c; + if (getc(fp) == EOF) { /* only 1 line in file */ + length = (int)(strchr(linep, ' ') - linep); ++ if (length > (sizeof(key) - 1)) ++ return(0); + strncpy(key, linep, length); + key[length] = '\0'; + if(strcmp(key, searchkey) > 0) { +@@ -132,6 +136,8 @@ static int bin_search_key(char *searchke + if (fgets(linep, LINE_LEN, fp) != NULL) { + offset2 = ftell(fp); /* offset at start of next line */ + length = (int)(strchr(linep, ' ') - linep); ++ if (length > (sizeof(key) - 1)) ++ return(0); + strncpy(key, linep, length); + key[length] = '\0'; + if(strcmp(key, searchkey) < 0) { /* further in file */ +--- a/lib/morph.c ++++ b/lib/morph.c +@@ -51,21 +51,21 @@ static struct { + char *str; + int strlen; + } prepositions[NUMPREPS] = { +- "to", 2, +- "at", 2, +- "of", 2, +- "on", 2, +- "off", 3, +- "in", 2, +- "out", 3, +- "up", 2, +- "down", 4, +- "from", 4, +- "with", 4, +- "into", 4, +- "for", 3, +- "about", 5, +- "between", 7, ++ { "to", 2 }, ++ { "at", 2 }, ++ { "of", 2 }, ++ { "on", 2 }, ++ { "off", 3 }, ++ { "in", 2 }, ++ { "out", 3 }, ++ { "up", 2 }, ++ { "down", 4 }, ++ { "from", 4 }, ++ { "with", 4 }, ++ { "into", 4 }, ++ { "for", 3 }, ++ { "about", 5 }, ++ { "between", 7 } + }; + + static FILE *exc_fps[NUMPARTS + 1]; +@@ -144,18 +144,19 @@ static int do_init(void) + } else + sprintf(searchdir, DEFAULTPATH); + #else +- if ((env = getenv("WNSEARCHDIR")) != NULL) +- strcpy(searchdir, env); +- else if ((env = getenv("WNHOME")) != NULL) +- sprintf(searchdir, "%s%s", env, DICTDIR); +- else ++ if ((env = getenv("WNSEARCHDIR")) != NULL) { ++ snprintf(searchdir, sizeof(searchdir), "%s", env); ++ } else if ((env = getenv("WNHOME")) != NULL) { ++ snprintf(searchdir, sizeof(searchdir), "%s%s", env, DICTDIR); ++ } else { + strcpy(searchdir, DEFAULTPATH); ++ } + #endif + + for (i = 1; i <= NUMPARTS; i++) { +- sprintf(fname, EXCFILE, searchdir, partnames[i]); ++ snprintf(fname, sizeof(fname), EXCFILE, searchdir, partnames[i]); + if ((exc_fps[i] = fopen(fname, "r")) == NULL) { +- sprintf(msgbuf, ++ snprintf(msgbuf, sizeof(msgbuf), + "WordNet library error: Can't open exception file(%s)\n\n", + fname); + display_message(msgbuf); +@@ -178,13 +179,16 @@ char *morphstr(char *origstr, int pos) + int prep; + char *end_idx1, *end_idx2; + char *append; +- ++ + if (pos == SATELLITE) + pos = ADJ; + + /* First time through for this string */ + + if (origstr != NULL) { ++ if (strlen(origstr) > WORDBUF - 1) ++ return(NULL); ++ + /* Assume string hasn't had spaces substitued with '_' */ + strtolower(strsubst(strcpy(str, origstr), ' ', '_')); + searchstr[0] = '\0'; +@@ -232,7 +236,7 @@ char *morphstr(char *origstr, int pos) + if (end_idx < 0) return(NULL); /* shouldn't do this */ + strncpy(word, str + st_idx, end_idx - st_idx); + word[end_idx - st_idx] = '\0'; +- if(tmp = morphword(word, pos)) ++ if ((tmp = morphword(word, pos)) != NULL) + strcat(searchstr,tmp); + else + strcat(searchstr,word); +@@ -240,7 +244,7 @@ char *morphstr(char *origstr, int pos) + st_idx = end_idx + 1; + } + +- if(tmp = morphword(strcpy(word, str + st_idx), pos)) ++ if ((tmp = morphword(strcpy(word, str + st_idx), pos)) != NULL) + strcat(searchstr,tmp); + else + strcat(searchstr,word); +@@ -270,16 +274,15 @@ char *morphword(char *word, int pos) + { + int offset, cnt; + int i; +- static char retval[WORDBUF]; +- char *tmp, tmpbuf[WORDBUF], *end; +- +- sprintf(retval,""); +- sprintf(tmpbuf, ""); +- end = ""; +- ++ static char retval[WORDBUF] = ""; ++ char *tmp, tmpbuf[WORDBUF] = "", *end = ""; ++ + if(word == NULL) + return(NULL); + ++ if (strlen(word) > WORDBUF - 1) ++ return(NULL); ++ + /* first look for word on exception list */ + + if((tmp = exc_lookup(word, pos)) != NULL) +@@ -335,7 +338,10 @@ static char *wordbase(char *word, int en + { + char *pt1; + static char copy[WORDBUF]; +- ++ ++ if (strlen(word) > WORDBUF - 1) ++ return(NULL); ++ + strcpy(copy, word); + if(strend(copy,sufx[ender])) { + pt1=strchr(copy,'\0'); +@@ -368,13 +374,14 @@ static char *exc_lookup(char *word, int + { + static char line[WORDBUF], *beglp, *endlp; + char *excline; +- int found = 0; + + if (exc_fps[pos] == NULL) + return(NULL); + + /* first time through load line from exception file */ + if(word != NULL){ ++ if (strlen(word) > WORDBUF - 1) ++ return(NULL); + if ((excline = bin_search(word, exc_fps[pos])) != NULL) { + strcpy(line, excline); + endlp = strchr(line,' '); +@@ -403,6 +410,9 @@ static char *morphprep(char *s) + char word[WORDBUF], end[WORDBUF]; + static char retval[WORDBUF]; + ++ if (strlen(s) > WORDBUF - 1) ++ return (NULL); ++ + /* Assume that the verb is the first word in the phrase. Strip it + off, check for validity, then try various morphs with the + rest of the phrase tacked on, trying to find a match. */ +@@ -410,7 +420,7 @@ static char *morphprep(char *s) + rest = strchr(s, '_'); + last = strrchr(s, '_'); + if (rest != last) { /* more than 2 words */ +- if (lastwd = morphword(last + 1, NOUN)) { ++ if ((lastwd = morphword(last + 1, NOUN)) != NULL) { + strncpy(end, rest, last - rest + 1); + end[last-rest+1] = '\0'; + strcat(end, lastwd); +--- a/lib/search.c ++++ b/lib/search.c +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + + #include "wn.h" + +@@ -119,33 +120,22 @@ IndexPtr parse_index(long offset, int db + if ( !line ) + line = read_index( offset, indexfps[dbase] ); + +- idx = (IndexPtr)malloc(sizeof(Index)); ++ idx = (IndexPtr)calloc(1, sizeof(Index)); + assert(idx); + + /* set offset of entry in index file */ + idx->idxoffset = offset; + +- idx->wd='\0'; +- idx->pos='\0'; +- idx->off_cnt=0; +- idx->tagged_cnt = 0; +- idx->sense_cnt=0; +- idx->offset='\0'; +- idx->ptruse_cnt=0; +- idx->ptruse='\0'; +- + /* get the word */ + ptrtok=strtok(line," \n"); + +- idx->wd = malloc(strlen(ptrtok) + 1); ++ idx->wd = strdup(ptrtok); + assert(idx->wd); +- strcpy(idx->wd, ptrtok); + + /* get the part of speech */ + ptrtok=strtok(NULL," \n"); +- idx->pos = malloc(strlen(ptrtok) + 1); ++ idx->pos = strdup(ptrtok); + assert(idx->pos); +- strcpy(idx->pos, ptrtok); + + /* get the collins count */ + ptrtok=strtok(NULL," \n"); +@@ -154,7 +144,12 @@ IndexPtr parse_index(long offset, int db + /* get the number of pointers types */ + ptrtok=strtok(NULL," \n"); + idx->ptruse_cnt = atoi(ptrtok); +- ++ ++ if (idx->ptruse_cnt < 0 || (unsigned int)idx->ptruse_cnt > UINT_MAX/sizeof(int)) { ++ free_index(idx); ++ return(NULL); ++ } ++ + if (idx->ptruse_cnt) { + idx->ptruse = (int *) malloc(idx->ptruse_cnt * (sizeof(int))); + assert(idx->ptruse); +@@ -173,9 +168,14 @@ IndexPtr parse_index(long offset, int db + /* get the number of senses that are tagged */ + ptrtok=strtok(NULL," \n"); + idx->tagged_cnt = atoi(ptrtok); +- ++ ++ if (idx->off_cnt < 0 || (unsigned long)idx->off_cnt > ULONG_MAX/sizeof(long)) { ++ free_index(idx); ++ return(NULL); ++ } ++ + /* make space for the offsets */ +- idx->offset = (long *) malloc(idx->off_cnt * (sizeof(long))); ++ idx->offset = (unsigned long *) malloc(idx->off_cnt * sizeof(long)); + assert(idx->offset); + + /* get the offsets */ +@@ -197,15 +197,21 @@ IndexPtr getindex(char *searchstr, int d + char strings[MAX_FORMS][WORDBUF]; /* vector of search strings */ + static IndexPtr offsets[MAX_FORMS]; + static int offset; +- ++ + /* This works like strrok(): if passed with a non-null string, + prepare vector of search strings and offsets. If string + is null, look at current list of offsets and return next + one, or NULL if no more alternatives for this word. */ + + if (searchstr != NULL) { ++ /* Bail out if the input is too long for us to handle */ ++ if (strlen(searchstr) > (WORDBUF - 1)) { ++ strcpy(msgbuf, "WordNet library error: search term is too long\n"); ++ display_message(msgbuf); ++ return(NULL); ++ } + +- offset = 0; ++ offset = 0; + strtolower(searchstr); + for (i = 0; i < MAX_FORMS; i++) { + strcpy(strings[i], searchstr); +@@ -229,11 +235,11 @@ IndexPtr getindex(char *searchstr, int d + /* Get offset of first entry. Then eliminate duplicates + and get offsets of unique strings. */ + +- if (strings[0][0] != NULL) ++ if (strings[0] != NULL) + offsets[0] = index_lookup(strings[0], dbase); + + for (i = 1; i < MAX_FORMS; i++) +- if ((strings[i][0]) != NULL && (strcmp(strings[0], strings[i]))) ++ if (strings[i] != NULL && (strcmp(strings[0], strings[i]))) + offsets[i] = index_lookup(strings[i], dbase); + } + +@@ -272,7 +278,7 @@ SynsetPtr read_synset(int dbase, long bo + SynsetPtr parse_synset(FILE *fp, int dbase, char *word) + { + static char line[LINEBUF]; +- char tbuf[SMLINEBUF]; ++ char tbuf[SMLINEBUF] = ""; + char *ptrtok; + char *tmpptr; + int foundpert = 0; +@@ -286,33 +292,11 @@ SynsetPtr parse_synset(FILE *fp, int dba + if ((tmpptr = fgets(line, LINEBUF, fp)) == NULL) + return(NULL); + +- synptr = (SynsetPtr)malloc(sizeof(Synset)); ++ synptr = (SynsetPtr)calloc(1, sizeof(Synset)); + assert(synptr); +- +- synptr->hereiam = 0; ++ + synptr->sstype = DONT_KNOW; +- synptr->fnum = 0; +- synptr->pos = '\0'; +- synptr->wcount = 0; +- synptr->words = '\0'; +- synptr->whichword = 0; +- synptr->ptrcount = 0; +- synptr->ptrtyp = '\0'; +- synptr->ptroff = '\0'; +- synptr->ppos = '\0'; +- synptr->pto = '\0'; +- synptr->pfrm = '\0'; +- synptr->fcount = 0; +- synptr->frmid = '\0'; +- synptr->frmto = '\0'; +- synptr->defn = '\0'; +- synptr->key = 0; +- synptr->nextss = NULL; +- synptr->nextform = NULL; + synptr->searchtype = -1; +- synptr->ptrlist = NULL; +- synptr->headword = NULL; +- synptr->headsense = 0; + + ptrtok = line; + +@@ -322,7 +306,7 @@ SynsetPtr parse_synset(FILE *fp, int dba + + /* sanity check - make sure starting file offset matches first field */ + if (synptr->hereiam != loc) { +- sprintf(msgbuf, "WordNet library error: no synset at location %d\n", ++ sprintf(msgbuf, "WordNet library error: no synset at location %ld\n", + loc); + display_message(msgbuf); + free(synptr); +@@ -335,16 +319,20 @@ SynsetPtr parse_synset(FILE *fp, int dba + + /* looking at POS */ + ptrtok = strtok(NULL, " \n"); +- synptr->pos = malloc(strlen(ptrtok) + 1); ++ synptr->pos = strdup(ptrtok); + assert(synptr->pos); +- strcpy(synptr->pos, ptrtok); + if (getsstype(synptr->pos) == SATELLITE) + synptr->sstype = INDIRECT_ANT; + + /* looking at numwords */ + ptrtok = strtok(NULL, " \n"); + synptr->wcount = strtol(ptrtok, NULL, 16); +- ++ ++ if (synptr->wcount < 0 || (unsigned int)synptr->wcount > UINT_MAX/sizeof(char *)) { ++ free_syns(synptr); ++ return(NULL); ++ } ++ + synptr->words = (char **)malloc(synptr->wcount * sizeof(char *)); + assert(synptr->words); + synptr->wnsns = (int *)malloc(synptr->wcount * sizeof(int)); +@@ -354,9 +342,8 @@ SynsetPtr parse_synset(FILE *fp, int dba + + for (i = 0; i < synptr->wcount; i++) { + ptrtok = strtok(NULL, " \n"); +- synptr->words[i] = malloc(strlen(ptrtok) + 1); ++ synptr->words[i] = strdup(ptrtok); + assert(synptr->words[i]); +- strcpy(synptr->words[i], ptrtok); + + /* is this the word we're looking for? */ + +@@ -371,6 +358,12 @@ SynsetPtr parse_synset(FILE *fp, int dba + ptrtok = strtok(NULL," \n"); + synptr->ptrcount = atoi(ptrtok); + ++ /* Should we check for long here as well? */ ++ if (synptr->ptrcount < 0 || (unsigned int)synptr->ptrcount > UINT_MAX/sizeof(int)) { ++ free_syns(synptr); ++ return(NULL); ++ } ++ + if (synptr->ptrcount) { + + /* alloc storage for the pointers */ +@@ -455,21 +448,23 @@ SynsetPtr parse_synset(FILE *fp, int dba + ptrtok = strtok(NULL," \n"); + if (ptrtok) { + ptrtok = strtok(NULL," \n"); +- sprintf(tbuf, ""); + while (ptrtok != NULL) { ++ if (strlen(ptrtok) + strlen(tbuf) + 1 + 1 > sizeof(tbuf)) { ++ free_syns(synptr); ++ return(NULL); ++ } + strcat(tbuf,ptrtok); + ptrtok = strtok(NULL, " \n"); + if(ptrtok) + strcat(tbuf," "); + } +- assert((1 + strlen(tbuf)) < sizeof(tbuf)); +- synptr->defn = malloc(strlen(tbuf) + 4); ++ synptr->defn = malloc(strlen(tbuf) + 3); + assert(synptr->defn); + sprintf(synptr->defn,"(%s)",tbuf); + } + + if (keyindexfp) { /* we have unique keys */ +- sprintf(tmpbuf, "%c:%8.8d", partchars[dbase], synptr->hereiam); ++ sprintf(tmpbuf, "%c:%8.8ld", partchars[dbase], synptr->hereiam); + synptr->key = GetKeyForOffset(tmpbuf); + } + +@@ -635,7 +630,7 @@ static void traceptrs(SynsetPtr synptr, + + if ((ptrtyp == PERTPTR || ptrtyp == PPLPTR) && + synptr->pto[i] != 0) { +- sprintf(tbuf, " (Sense %d)\n", ++ snprintf(tbuf, sizeof(tbuf), " (Sense %d)\n", + cursyn->wnsns[synptr->pto[i] - 1]); + printsynset(prefix, cursyn, tbuf, DEFOFF, synptr->pto[i], + SKIP_ANTS, PRINT_MARKER); +@@ -656,7 +651,7 @@ static void traceptrs(SynsetPtr synptr, + traceptrs(cursyn, HYPERPTR, getpos(cursyn->pos), 0); + } + } else if (ptrtyp == ANTPTR && dbase != ADJ && synptr->pto[i] != 0) { +- sprintf(tbuf, " (Sense %d)\n", ++ snprintf(tbuf, sizeof(tbuf), " (Sense %d)\n", + cursyn->wnsns[synptr->pto[i] - 1]); + printsynset(prefix, cursyn, tbuf, DEFOFF, synptr->pto[i], + SKIP_ANTS, PRINT_MARKER); +@@ -817,7 +812,7 @@ static void tracenomins(SynsetPtr synptr + + cursyn = read_synset(synptr->ppos[i], synptr->ptroff[i], ""); + +- sprintf(tbuf, "#%d\n", ++ snprintf(tbuf, sizeof(tbuf), "#%d\n", + cursyn->wnsns[synptr->pto[i] - 1]); + printsynset(prefix, cursyn, tbuf, DEFOFF, synptr->pto[i], + SKIP_ANTS, SKIP_MARKER); +@@ -989,12 +984,12 @@ void getexample(char *offset, char *wd) + char sentbuf[512]; + + if (vsentfilefp != NULL) { +- if (line = bin_search(offset, vsentfilefp)) { ++ if ((line = bin_search(offset, vsentfilefp)) != NULL) { + while(*line != ' ') + line++; + + printbuffer(" EX: "); +- sprintf(sentbuf, line, wd); ++ snprintf(sentbuf, sizeof(sentbuf), line, wd); + printbuffer(sentbuf); + } + } +@@ -1011,7 +1006,7 @@ int findexample(SynsetPtr synptr) + if (vidxfilefp != NULL) { + wdnum = synptr->whichword - 1; + +- sprintf(tbuf,"%s%%%-1.1d:%-2.2d:%-2.2d::", ++ snprintf(tbuf, sizeof(tbuf), "%s%%%-1.1d:%-2.2d:%-2.2d::", + synptr->words[wdnum], + getpos(synptr->pos), + synptr->fnum, +@@ -1124,7 +1119,7 @@ static void freq_word(IndexPtr index) + if (cnt >= 17 && cnt <= 32) familiar = 6; + if (cnt > 32 ) familiar = 7; + +- sprintf(tmpbuf, ++ snprintf(tmpbuf, sizeof(tmpbuf), + "\n%s used as %s is %s (polysemy count = %d)\n", + index->wd, a_an[getpos(index->pos)], freqcats[familiar], cnt); + printbuffer(tmpbuf); +@@ -1147,6 +1142,9 @@ void wngrep (char *word_passed, int pos) + } + rewind(inputfile); + ++ if (strlen(word_passed) + 1 > sizeof(word)) ++ return; ++ + strcpy (word, word_passed); + ToLowerCase(word); /* map to lower case for index file search */ + strsubst (word, ' ', '_'); /* replace spaces with underscores */ +@@ -1169,7 +1167,7 @@ void wngrep (char *word_passed, int pos) + ((line[loc + wordlen] == '-') || (line[loc + wordlen] == '_'))) + ) { + strsubst (line, '_', ' '); +- sprintf (tmpbuf, "%s\n", line); ++ snprintf (tmpbuf, sizeof(tmpbuf), "%s\n", line); + printbuffer (tmpbuf); + break; + } +@@ -1683,9 +1681,8 @@ SynsetPtr traceptrs_ds(SynsetPtr synptr, + cursyn = read_synset(synptr->ppos[i], + synptr->ptroff[i], + ""); +- synptr->headword = malloc(strlen(cursyn->words[0]) + 1); ++ synptr->headword = strdup(cursyn->words[0]); + assert(synptr->headword); +- strcpy(synptr->headword, cursyn->words[0]); + synptr->headsense = cursyn->lexid[0]; + free_synset(cursyn); + break; +@@ -2013,7 +2010,7 @@ static int getsearchsense(SynsetPtr synp + strsubst(strcpy(wdbuf, synptr->words[whichword - 1]), ' ', '_'); + strtolower(wdbuf); + +- if (idx = index_lookup(wdbuf, getpos(synptr->pos))) { ++ if ((idx = index_lookup(wdbuf, getpos(synptr->pos))) != NULL) { + for (i = 0; i < idx->off_cnt; i++) + if (idx->offset[i] == synptr->hereiam) { + free_index(idx); +@@ -2037,7 +2034,7 @@ static void printsynset(char *head, Syns + by flags */ + + if (offsetflag) /* print synset offset */ +- sprintf(tbuf + strlen(tbuf),"{%8.8d} ", synptr->hereiam); ++ sprintf(tbuf + strlen(tbuf),"{%8.8ld} ", synptr->hereiam); + if (fileinfoflag) { /* print lexicographer file information */ + sprintf(tbuf + strlen(tbuf), "<%s> ", lexfiles[synptr->fnum]); + prlexid = 1; /* print lexicographer id after word */ +@@ -2072,7 +2069,7 @@ static void printantsynset(SynsetPtr syn + tbuf[0] = '\0'; + + if (offsetflag) +- sprintf(tbuf,"{%8.8d} ", synptr->hereiam); ++ sprintf(tbuf,"{%8.8ld} ", synptr->hereiam); + if (fileinfoflag) { + sprintf(tbuf + strlen(tbuf),"<%s> ", lexfiles[synptr->fnum]); + prlexid = 1; +--- a/lib/wnutil.c ++++ b/lib/wnutil.c +@@ -48,7 +48,7 @@ int wninit(void) + char *env; + + if (!done) { +- if (env = getenv("WNDBVERSION")) { ++ if ((env = getenv("WNDBVERSION")) != NULL) { + wnrelease = strdup(env); /* set release */ + assert(wnrelease); + } +@@ -70,7 +70,7 @@ int re_wninit(void) + + closefps(); + +- if (env = getenv("WNDBVERSION")) { ++ if ((env = getenv("WNDBVERSION")) != NULL) { + wnrelease = strdup(env); /* set release */ + assert(wnrelease); + } +@@ -149,25 +149,25 @@ static int do_init(void) + sprintf(searchdir, DEFAULTPATH); + #else + if ((env = getenv("WNSEARCHDIR")) != NULL) +- strcpy(searchdir, env); ++ snprintf(searchdir, sizeof(searchdir), "%s", env); + else if ((env = getenv("WNHOME")) != NULL) +- sprintf(searchdir, "%s%s", env, DICTDIR); ++ snprintf(searchdir, sizeof(searchdir), "%s%s", env, DICTDIR); + else + strcpy(searchdir, DEFAULTPATH); + #endif + + for (i = 1; i < NUMPARTS + 1; i++) { +- sprintf(tmpbuf, DATAFILE, searchdir, partnames[i]); ++ snprintf(tmpbuf, sizeof(tmpbuf), DATAFILE, searchdir, partnames[i]); + if((datafps[i] = fopen(tmpbuf, "r")) == NULL) { +- sprintf(msgbuf, ++ snprintf(msgbuf, sizeof(msgbuf), + "WordNet library error: Can't open datafile(%s)\n", + tmpbuf); + display_message(msgbuf); + openerr = -1; + } +- sprintf(tmpbuf, INDEXFILE, searchdir, partnames[i]); ++ snprintf(tmpbuf, sizeof(tmpbuf), INDEXFILE, searchdir, partnames[i]); + if((indexfps[i] = fopen(tmpbuf, "r")) == NULL) { +- sprintf(msgbuf, ++ snprintf(msgbuf, sizeof(msgbuf), + "WordNet library error: Can't open indexfile(%s)\n", + tmpbuf); + display_message(msgbuf); +@@ -178,35 +178,35 @@ static int do_init(void) + /* This file isn't used by the library and doesn't have to + be present. No error is reported if the open fails. */ + +- sprintf(tmpbuf, SENSEIDXFILE, searchdir); ++ snprintf(tmpbuf, sizeof(tmpbuf), SENSEIDXFILE, searchdir); + sensefp = fopen(tmpbuf, "r"); + + /* If this file isn't present, the runtime code will skip printint out + the number of times each sense was tagged. */ + +- sprintf(tmpbuf, CNTLISTFILE, searchdir); ++ snprintf(tmpbuf, sizeof(tmpbuf), CNTLISTFILE, searchdir); + cntlistfp = fopen(tmpbuf, "r"); + + /* This file doesn't have to be present. No error is reported if the + open fails. */ + +- sprintf(tmpbuf, KEYIDXFILE, searchdir); ++ snprintf(tmpbuf, sizeof(tmpbuf), KEYIDXFILE, searchdir); + keyindexfp = fopen(tmpbuf, "r"); + +- sprintf(tmpbuf, REVKEYIDXFILE, searchdir); ++ snprintf(tmpbuf, sizeof(tmpbuf), REVKEYIDXFILE, searchdir); + revkeyindexfp = fopen(tmpbuf, "r"); + +- sprintf(tmpbuf, VRBSENTFILE, searchdir); ++ snprintf(tmpbuf, sizeof(tmpbuf), VRBSENTFILE, searchdir); + if ((vsentfilefp = fopen(tmpbuf, "r")) == NULL) { +- sprintf(msgbuf, ++ snprintf(msgbuf, sizeof(msgbuf), + "WordNet library warning: Can't open verb example sentence file(%s)\n", + tmpbuf); + display_message(msgbuf); + } + +- sprintf(tmpbuf, VRBIDXFILE, searchdir); ++ snprintf(tmpbuf, sizeof(tmpbuf), VRBIDXFILE, searchdir); + if ((vidxfilefp = fopen(tmpbuf, "r")) == NULL) { +- sprintf(msgbuf, ++ snprintf(msgbuf, sizeof(msgbuf), + "WordNet library warning: Can't open verb example sentence index file(%s)\n", + tmpbuf); + display_message(msgbuf); +--- a/src/wn.c ++++ b/src/wn.c +@@ -131,7 +131,7 @@ static void printusage(), printlicense() + printsearches(char *, int, unsigned long); + static int error_message(char *); + +-main(int argc,char *argv[]) ++int main(int argc,char *argv[]) + { + display_message = error_message; + +@@ -228,14 +228,14 @@ static int do_search(char *searchword, i + printf("\n%s of %s %s\n%s", + label, partnames[pos], searchword, outbuf); + +- if (morphword = morphstr(searchword, pos)) ++ if ((morphword = morphstr(searchword, pos)) != NULL) + do { + outbuf = findtheinfo(morphword, pos, search, whichsense); + totsenses += wnresults.printcnt; + if (strlen(outbuf) > 0) + printf("\n%s of %s %s\n%s", + label, partnames[pos], morphword, outbuf); +- } while (morphword = morphstr(NULL, pos)); ++ } while ((morphword = morphstr(NULL, pos)) != NULL); + + return(totsenses); + } diff --git a/gnu/packages/patches/wordnet-CVE-2008-3908-pt2.patch b/gnu/packages/patches/wordnet-CVE-2008-3908-pt2.patch new file mode 100644 index 0000000000..2ef2239a7f --- /dev/null +++ b/gnu/packages/patches/wordnet-CVE-2008-3908-pt2.patch @@ -0,0 +1,18 @@ +This patch was created by oCert according to + http://www.ocert.org/advisories/ocert-2008-014.html +Unfortunately the original patch contained a bug which was +later fixed by the issuer of the patch Rob Holland +This part was now separated in this file. + +--- a/lib/search.c ++++ b/lib/search.c +@@ -1568,7 +1568,8 @@ char *findtheinfo(char *searchstr, int d + bufstart[0] = '\n'; + bufstart++; + } +- strncpy(bufstart, tmpbuf, strlen(tmpbuf)); ++ /* Avoid writing a trailing \0 after the string */ ++ memcpy(bufstart, tmpbuf, strlen(tmpbuf)); + bufstart = searchbuffer + strlen(searchbuffer); + } + } diff --git a/gnu/packages/wordnet.scm b/gnu/packages/wordnet.scm index 1823a624ed..9cd7a56104 100644 --- a/gnu/packages/wordnet.scm +++ b/gnu/packages/wordnet.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2013 Ludovic Courtès +;;; Copyright © 2016 Efraim Flashner ;;; ;;; This file is part of GNU Guix. ;;; @@ -21,6 +22,7 @@ #:use-module (guix build-system gnu) #:use-module (guix licenses) #:use-module (guix download) + #:use-module (gnu packages) #:use-module (gnu packages tcl)) (define-public wordnet @@ -30,11 +32,14 @@ (source (origin (method url-fetch) (uri (string-append "http://wordnetcode.princeton.edu/" - version "/WordNet-" - version ".tar.bz2")) + version "/WordNet-" version ".tar.bz2")) (sha256 (base32 - "08pgjvd2vvmqk3h641x63nxp7wqimb9r30889mkyfh2agc62sjbc")))) + "08pgjvd2vvmqk3h641x63nxp7wqimb9r30889mkyfh2agc62sjbc")) + (patches (search-patches + "wordnet-CVE-2008-2149.patch" + "wordnet-CVE-2008-3908-pt1.patch" + "wordnet-CVE-2008-3908-pt2.patch")))) (build-system gnu-build-system) (arguments `(#:configure-flags (list (string-append "--with-tcl=" -- cgit v1.2.3 From fd1461879c63c608617d30524183a71370a7451c Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Mon, 30 May 2016 21:45:00 +0300 Subject: gnu: mcrypt: Fix CVE-2012-4409, CVE-2012-4426, CVE-2012-4527. * gnu/packages/mcrypt.scm (mcrypt)[source]: Add patches. * gnu/packages/patches/mcrypt-CVE-2012-4409.patch, gnu/packages/patches/mcrypt-CVE-2012-4426.patch, gnu/packages/patches/mcrypt-CVE-2012-4527.patch: New variables. * gnu/local.mk (dist_patch_DATA): Add them. --- gnu/local.mk | 3 + gnu/packages/mcrypt.scm | 7 +- gnu/packages/patches/mcrypt-CVE-2012-4409.patch | 33 +++++++ gnu/packages/patches/mcrypt-CVE-2012-4426.patch | 36 ++++++++ gnu/packages/patches/mcrypt-CVE-2012-4527.patch | 111 ++++++++++++++++++++++++ 5 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/mcrypt-CVE-2012-4409.patch create mode 100644 gnu/packages/patches/mcrypt-CVE-2012-4426.patch create mode 100644 gnu/packages/patches/mcrypt-CVE-2012-4527.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index d97c2218b5..e94920e554 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -636,6 +636,9 @@ dist_patch_DATA = \ %D%/packages/patches/matplotlib-setupext-tk.patch \ %D%/packages/patches/maxima-defsystem-mkdir.patch \ %D%/packages/patches/mcron-install.patch \ + %D%/packages/patches/mcrypt-CVE-2012-4409.patch \ + %D%/packages/patches/mcrypt-CVE-2012-4426.patch \ + %D%/packages/patches/mcrypt-CVE-2012-4527.patch \ %D%/packages/patches/mhash-keygen-test-segfault.patch \ %D%/packages/patches/mit-krb5-CVE-2015-8629.patch \ %D%/packages/patches/mit-krb5-CVE-2015-8630.patch \ diff --git a/gnu/packages/mcrypt.scm b/gnu/packages/mcrypt.scm index a683ad7ac9..7ac0b92d81 100644 --- a/gnu/packages/mcrypt.scm +++ b/gnu/packages/mcrypt.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Eric Bavier +;;; Copyright © 2016 Efraim Flashner ;;; ;;; This file is part of GNU Guix. ;;; @@ -36,7 +37,11 @@ version ".tar.gz")) (sha256 (base32 - "161031n1w9pb4yzz9i47szc12a4mwpcpvyxnvafsik2l9s2aliai")))) + "161031n1w9pb4yzz9i47szc12a4mwpcpvyxnvafsik2l9s2aliai")) + (patches (search-patches + "mcrypt-CVE-2012-4409.patch" + "mcrypt-CVE-2012-4426.patch" + "mcrypt-CVE-2012-4527.patch")))) (build-system gnu-build-system) (inputs `(("zlib" ,zlib) diff --git a/gnu/packages/patches/mcrypt-CVE-2012-4409.patch b/gnu/packages/patches/mcrypt-CVE-2012-4409.patch new file mode 100644 index 0000000000..60cf8e0430 --- /dev/null +++ b/gnu/packages/patches/mcrypt-CVE-2012-4409.patch @@ -0,0 +1,33 @@ +From 4876e3a692739bb9ca00d0f500fd5f4b3eb16ce3 Mon Sep 17 00:00:00 2001 +From: Tom Callaway +Date: Fri, 7 Sep 2012 11:39:29 -0400 +Subject: apply fix for CVE-2012-4409 (thanks to Raphael Geissert) + +--- + mcrypt-CVE-2012-4409.patch | 12 ++++++++++++ + mcrypt.spec | 10 +++++++++- + 2 files changed, 21 insertions(+), 1 deletion(-) + create mode 100644 mcrypt-CVE-2012-4409.patch + +diff --git a/mcrypt-CVE-2012-4409.patch b/mcrypt-CVE-2012-4409.patch +new file mode 100644 +index 0000000..747f428 +--- /dev/null ++++ b/mcrypt-CVE-2012-4409.patch +@@ -0,0 +1,12 @@ ++diff -up mcrypt-2.6.8/src/extra.c.CVE-2012-4409 mcrypt-2.6.8/src/extra.c ++--- mcrypt-2.6.8/src/extra.c.CVE-2012-4409 2012-09-07 11:00:55.906870746 -0400 +++++ mcrypt-2.6.8/src/extra.c 2012-09-07 11:00:27.967858365 -0400 ++@@ -242,6 +242,8 @@ int check_file_head(FILE * fstream, char ++ if (m_getbit(0, sflag) != 0) { /* if the first bit is set */ ++ *salt_size = m_setbit(0, sflag, 0); ++ if (*salt_size > 0) { +++ if (*salt_size > sizeof(tmp_buf)) +++ err_quit(_("Salt is too long\n")); ++ fread(tmp_buf, 1, *salt_size, ++ fstream); ++ memmove(salt, tmp_buf, *salt_size); + +-- +cgit v0.12 + diff --git a/gnu/packages/patches/mcrypt-CVE-2012-4426.patch b/gnu/packages/patches/mcrypt-CVE-2012-4426.patch new file mode 100644 index 0000000000..61c197b0c9 --- /dev/null +++ b/gnu/packages/patches/mcrypt-CVE-2012-4426.patch @@ -0,0 +1,36 @@ +diff --git a/mcrypt-CVE-2012-4426.patch b/mcrypt-CVE-2012-4426.patch +new file mode 100644 +index 0000000..747f428 +--- mcrypt-2.6.8/src/errors.c ++++ mcrypt-2.6.8/src/errors.c +@@ -25,24 +25,24 @@ + + void err_quit(char *errmsg) + { +- fprintf(stderr, errmsg); ++ fprintf(stderr, "%s", errmsg); + exit(-1); + } + + void err_warn(char *errmsg) + { + if (quiet <= 1) +- fprintf(stderr, errmsg); ++ fprintf(stderr, "%s", errmsg); + } + + void err_info(char *errmsg) + { + if (quiet == 0) +- fprintf(stderr, errmsg); ++ fprintf(stderr, "%s", errmsg); + } + + void err_crit(char *errmsg) + { + if (quiet <= 2) +- fprintf(stderr, errmsg); ++ fprintf(stderr, "%s", errmsg); + } + +--- diff --git a/gnu/packages/patches/mcrypt-CVE-2012-4527.patch b/gnu/packages/patches/mcrypt-CVE-2012-4527.patch new file mode 100644 index 0000000000..d931dd174b --- /dev/null +++ b/gnu/packages/patches/mcrypt-CVE-2012-4527.patch @@ -0,0 +1,111 @@ +From b0716eac4e800a0ea53e1b949250f671702f28a0 Mon Sep 17 00:00:00 2001 +From: Tom Callaway +Date: Tue, 30 Oct 2012 15:39:24 -0400 +Subject: apply workaround to CVE-2012-4527 + +--- + mcrypt-CVE-2012-4527-80-width-patch | 91 +++++++++++++++++++++++++++++++++++++ + mcrypt.spec | 10 +++- + 2 files changed, 100 insertions(+), 1 deletion(-) + create mode 100644 mcrypt-CVE-2012-4527-80-width-patch + +diff --git a/mcrypt-CVE-2012-4527-80-width-patch b/mcrypt-CVE-2012-4527-80-width-patch +new file mode 100644 +index 0000000..0eb94d8 +--- /dev/null ++++ b/mcrypt-CVE-2012-4527-80-width-patch +@@ -0,0 +1,91 @@ ++--- mcrypt-2.6.8.orig/src/mcrypt.c +++++ mcrypt-2.6.8/src/mcrypt.c ++@@ -41,6 +41,8 @@ ++ # include ++ #endif ++ +++#define WIDTH 80 +++ ++ static char rcsid[] = ++ "$Id: mcrypt.c,v 1.2 2007/11/07 17:10:21 nmav Exp $"; ++ ++@@ -482,7 +484,7 @@ ++ #ifdef HAVE_STAT ++ if (stream_flag == FALSE) { ++ if (is_normal_file(file[i]) == FALSE) { ++- sprintf(tmperr, +++ snprintf(tmperr, WIDTH, ++ _ ++ ("%s: %s is not a regular file. Skipping...\n"), ++ program_name, file[i]); ++@@ -501,7 +503,7 @@ ++ dinfile = file[i]; ++ if ((isatty(fileno((FILE *) (stdin))) == 1) ++ && (stream_flag == TRUE) && (force == 0)) { /* not a tty */ ++- sprintf(tmperr, +++ snprintf(tmperr, WIDTH, ++ _ ++ ("%s: Encrypted data will not be read from a terminal.\n"), ++ program_name); ++@@ -520,7 +522,7 @@ ++ einfile = file[i]; ++ if ((isatty(fileno((FILE *) (stdout))) == 1) ++ && (stream_flag == TRUE) && (force == 0)) { /* not a tty */ ++- sprintf(tmperr, +++ snprintf(tmperr, WIDTH, ++ _ ++ ("%s: Encrypted data will not be written to a terminal.\n"), ++ program_name); ++@@ -544,7 +546,7 @@ ++ strcpy(outfile, einfile); ++ /* if file has already the .nc ignore it */ ++ if (strstr(outfile, ".nc") != NULL) { ++- sprintf(tmperr, +++ snprintf(tmperr, WIDTH, ++ _ ++ ("%s: file %s has the .nc suffix... skipping...\n"), ++ program_name, outfile); ++@@ -590,10 +592,10 @@ ++ ++ if (x == 0) { ++ if (stream_flag == FALSE) { ++- sprintf(tmperr, _("File %s was decrypted.\n"), dinfile); +++ snprintf(tmperr, WIDTH, _("File %s was decrypted.\n"), dinfile); ++ err_warn(tmperr); ++ } else { ++- sprintf(tmperr, _("Stdin was decrypted.\n")); +++ snprintf(tmperr, WIDTH, _("Stdin was decrypted.\n")); ++ err_warn(tmperr); ++ } ++ #ifdef HAVE_STAT ++@@ -610,7 +612,7 @@ ++ ++ } else { ++ if (stream_flag == FALSE) { ++- sprintf(tmperr, +++ snprintf(tmperr, WIDTH, ++ _ ++ ("File %s was NOT decrypted successfully.\n"), ++ dinfile); ++@@ -636,10 +638,10 @@ ++ ++ if (x == 0) { ++ if (stream_flag == FALSE) { ++- sprintf(tmperr, _("File %s was encrypted.\n"), einfile); +++ snprintf(tmperr, WIDTH, _("File %s was encrypted.\n"), einfile); ++ err_warn(tmperr); ++ } else { ++- sprintf(tmperr, _("Stdin was encrypted.\n")); +++ snprintf(tmperr, WIDTH, _("Stdin was encrypted.\n")); ++ err_warn(tmperr); ++ } ++ #ifdef HAVE_STAT ++@@ -655,7 +657,7 @@ ++ ++ } else { ++ if (stream_flag == FALSE) { ++- sprintf(tmperr, +++ snprintf(tmperr, WIDTH, ++ _ ++ ("File %s was NOT encrypted successfully.\n"), ++ einfile); +-- +cgit v0.12 + -- cgit v1.2.3 From df2dd07b880432a0205dd399fede6dee5b9af76b Mon Sep 17 00:00:00 2001 From: Leo Famulari Date: Thu, 26 May 2016 22:29:24 -0400 Subject: gnu: libxml2: Update replacement to 2.9.4 [security fixes]. This fixes CVE-2016-{1762, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 3627, 3705, 4483}. * gnu/packages/patches/libxml2-CVE-2016-3627.patch, gnu/packages/patches/libxml2-CVE-2016-3705.patch: Delete files. * gnu/local.mk (dist_patch_DATA): Remove them. * gnu/packages/xml.scm (libxml2/fixed): Update to 2.9.4. [source]: Remove patches. --- gnu/local.mk | 2 - gnu/packages/patches/libxml2-CVE-2016-3627.patch | 61 --------------------- gnu/packages/patches/libxml2-CVE-2016-3705.patch | 68 ------------------------ gnu/packages/xml.scm | 14 +++-- 4 files changed, 10 insertions(+), 135 deletions(-) delete mode 100644 gnu/packages/patches/libxml2-CVE-2016-3627.patch delete mode 100644 gnu/packages/patches/libxml2-CVE-2016-3705.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index e94920e554..6e2d765159 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -616,8 +616,6 @@ dist_patch_DATA = \ %D%/packages/patches/libwmf-CVE-2015-0848+CVE-2015-4588.patch \ %D%/packages/patches/libwmf-CVE-2015-4695.patch \ %D%/packages/patches/libwmf-CVE-2015-4696.patch \ - %D%/packages/patches/libxml2-CVE-2016-3627.patch \ - %D%/packages/patches/libxml2-CVE-2016-3705.patch \ %D%/packages/patches/libxslt-CVE-2015-7995.patch \ %D%/packages/patches/lirc-localstatedir.patch \ %D%/packages/patches/libpthread-glibc-preparation.patch \ diff --git a/gnu/packages/patches/libxml2-CVE-2016-3627.patch b/gnu/packages/patches/libxml2-CVE-2016-3627.patch deleted file mode 100644 index 782c9270cf..0000000000 --- a/gnu/packages/patches/libxml2-CVE-2016-3627.patch +++ /dev/null @@ -1,61 +0,0 @@ -From . - -From e5269fd1e83743f7e62c89eca45000c2e84e6edc Mon Sep 17 00:00:00 2001 -From: Peter Simons -Date: Thu, 14 Apr 2016 16:15:13 +0200 -Subject: [PATCH 1/2] xmlStringGetNodeList: limit the function to 1024 - recursions to avoid CVE-2016-3627 - -This patch prevents stack overflows like the one reported in -https://bugzilla.gnome.org/show_bug.cgi?id=762100. ---- - tree.c | 14 ++++++++++++-- - 1 file changed, 12 insertions(+), 2 deletions(-) - -Index: libxml2-2.9.3/tree.c -=================================================================== ---- libxml2-2.9.3.orig/tree.c -+++ libxml2-2.9.3/tree.c -@@ -1464,6 +1464,8 @@ out: - return(ret); - } - -+static xmlNodePtr xmlStringGetNodeListInternal(const xmlDoc *doc, const xmlChar *value, size_t recursionLevel); -+ - /** - * xmlStringGetNodeList: - * @doc: the document -@@ -1475,6 +1477,12 @@ out: - */ - xmlNodePtr - xmlStringGetNodeList(const xmlDoc *doc, const xmlChar *value) { -+ return xmlStringGetNodeListInternal(doc, value, 0); -+ } -+ -+xmlNodePtr -+xmlStringGetNodeListInternal(const xmlDoc *doc, const xmlChar *value, size_t recursionLevel) { -+ - xmlNodePtr ret = NULL, last = NULL; - xmlNodePtr node; - xmlChar *val; -@@ -1483,6 +1491,8 @@ xmlStringGetNodeList(const xmlDoc *doc, - xmlEntityPtr ent; - xmlBufPtr buf; - -+ if (recursionLevel > 1024) return(NULL); -+ - if (value == NULL) return(NULL); - - buf = xmlBufCreateSize(0); -@@ -1593,8 +1603,9 @@ xmlStringGetNodeList(const xmlDoc *doc, - else if ((ent != NULL) && (ent->children == NULL)) { - xmlNodePtr temp; - -- ent->children = xmlStringGetNodeList(doc, -- (const xmlChar*)node->content); -+ ent->children = xmlStringGetNodeListInternal(doc, -+ (const xmlChar*)node->content, -+ recursionLevel+1); - ent->owner = 1; - temp = ent->children; - while (temp) { diff --git a/gnu/packages/patches/libxml2-CVE-2016-3705.patch b/gnu/packages/patches/libxml2-CVE-2016-3705.patch deleted file mode 100644 index e803630f3a..0000000000 --- a/gnu/packages/patches/libxml2-CVE-2016-3705.patch +++ /dev/null @@ -1,68 +0,0 @@ -From . - -From 6f0af3f6b9b1c5f82a2bb5ded65923437fee5d21 Mon Sep 17 00:00:00 2001 -From: Peter Simons -Date: Fri, 15 Apr 2016 11:56:55 +0200 -Subject: [PATCH 2/2] Add missing increments of recursion depth counter to XML - parser. - -The functions xmlParserEntityCheck() and xmlParseAttValueComplex() used to call -xmlStringDecodeEntities() in a recursive context without incrementing the -'depth' counter in the parser context. Because of that omission, the parser -failed to detect attribute recursions in certain documents before running out -of stack space. ---- - parser.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/parser.c b/parser.c -index 9604a72..4da151f 100644 ---- a/parser.c -+++ b/parser.c -@@ -144,8 +144,10 @@ xmlParserEntityCheck(xmlParserCtxtPtr ctxt, size_t size, - - ent->checked = 1; - -+ ++ctxt->depth; - rep = xmlStringDecodeEntities(ctxt, ent->content, - XML_SUBSTITUTE_REF, 0, 0, 0); -+ --ctxt->depth; - - ent->checked = (ctxt->nbentities - oldnbent + 1) * 2; - if (rep != NULL) { -@@ -3966,8 +3968,10 @@ xmlParseEntityValue(xmlParserCtxtPtr ctxt, xmlChar **orig) { - * an entity declaration, it is bypassed and left as is. - * so XML_SUBSTITUTE_REF is not set here. - */ -+ ++ctxt->depth; - ret = xmlStringDecodeEntities(ctxt, buf, XML_SUBSTITUTE_PEREF, - 0, 0, 0); -+ --ctxt->depth; - if (orig != NULL) - *orig = buf; - else -@@ -4092,9 +4096,11 @@ xmlParseAttValueComplex(xmlParserCtxtPtr ctxt, int *attlen, int normalize) { - } else if ((ent != NULL) && - (ctxt->replaceEntities != 0)) { - if (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) { -+ ++ctxt->depth; - rep = xmlStringDecodeEntities(ctxt, ent->content, - XML_SUBSTITUTE_REF, - 0, 0, 0); -+ --ctxt->depth; - if (rep != NULL) { - current = rep; - while (*current != 0) { /* non input consuming */ -@@ -4130,8 +4136,10 @@ xmlParseAttValueComplex(xmlParserCtxtPtr ctxt, int *attlen, int normalize) { - (ent->content != NULL) && (ent->checked == 0)) { - unsigned long oldnbent = ctxt->nbentities; - -+ ++ctxt->depth; - rep = xmlStringDecodeEntities(ctxt, ent->content, - XML_SUBSTITUTE_REF, 0, 0, 0); -+ --ctxt->depth; - - ent->checked = (ctxt->nbentities - oldnbent + 1) * 2; - if (rep != NULL) { --- -2.8.1 diff --git a/gnu/packages/xml.scm b/gnu/packages/xml.scm index 782e356a70..dc5c60dca8 100644 --- a/gnu/packages/xml.scm +++ b/gnu/packages/xml.scm @@ -107,10 +107,16 @@ project (but it is usable outside of the Gnome platform).") (define libxml2/fixed (package (inherit libxml2) - (source (origin - (inherit (package-source libxml2)) - (patches (search-patches "libxml2-CVE-2016-3627.patch" - "libxml2-CVE-2016-3705.patch")))))) + (source + (let ((name "libxml2") + (version "2.9.4")) + (origin + (method url-fetch) + (uri (string-append "ftp://xmlsoft.org/libxml2/libxml2-" + version ".tar.gz")) + (sha256 + (base32 + "0g336cr0bw6dax1q48bblphmchgihx9p1pjmxdnrd6sh3qci3fgz"))))))) (define-public python-libxml2 (package (inherit libxml2) -- cgit v1.2.3 From 4d93a76138246ba1f9d6f81da4039e89e14570be Mon Sep 17 00:00:00 2001 From: Leo Famulari Date: Tue, 31 May 2016 13:23:17 -0400 Subject: gnu: graphicsmagick: Update to 1.3.24 [security update]. Fixes CVE-2016-{2317, 2318, 5118} and many other security issues described in 'NEWS.txt'. * gnu/packages/patches/graphicsmagick-CVE-2016-5118.patch: Delete file. * gnu/local.mk (dist_patch_DATA): Remove it. * gnu/packages/imagemagick.scm (graphicsmagick): Update to 1.3.24. [source]: Remove patch. --- gnu/local.mk | 1 - gnu/packages/imagemagick.scm | 6 +++--- .../patches/graphicsmagick-CVE-2016-5118.patch | 19 ------------------- 3 files changed, 3 insertions(+), 23 deletions(-) delete mode 100644 gnu/packages/patches/graphicsmagick-CVE-2016-5118.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 6e2d765159..f669167091 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -524,7 +524,6 @@ dist_patch_DATA = \ %D%/packages/patches/gobject-introspection-absolute-shlib-path.patch \ %D%/packages/patches/gobject-introspection-cc.patch \ %D%/packages/patches/gobject-introspection-girepository.patch \ - %D%/packages/patches/graphicsmagick-CVE-2016-5118.patch \ %D%/packages/patches/grep-timing-sensitive-test.patch \ %D%/packages/patches/grub-CVE-2015-8370.patch \ %D%/packages/patches/grub-gets-undeclared.patch \ diff --git a/gnu/packages/imagemagick.scm b/gnu/packages/imagemagick.scm index f129b16289..dc03ea48a4 100644 --- a/gnu/packages/imagemagick.scm +++ b/gnu/packages/imagemagick.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2013, 2014, 2015 Ludovic Courtès ;;; Copyright © 2015 Eric Bavier ;;; Copyright © 2015 Ricardo Wurmus +;;; Copyright © 2016 Leo Famulari ;;; ;;; This file is part of GNU Guix. ;;; @@ -154,16 +155,15 @@ script.") (define-public graphicsmagick (package (name "graphicsmagick") - (version "1.3.23") + (version "1.3.24") (source (origin (method url-fetch) (uri (string-append "ftp://ftp.graphicsmagick.org/pub/" "GraphicsMagick/" (version-major+minor version) "/GraphicsMagick-" version ".tar.xz")) - (patches (search-patches "graphicsmagick-CVE-2016-5118.patch")) (sha256 (base32 - "03g6l2h8cmf231y1vma0z7x85070jm1ysgs9ppqcd3jj56jka9gx")))) + "1q40w5hcl8rcpszm0r7rpr3a9lj390p39zfvavkvlgxyyk7bmgsj")))) (build-system gnu-build-system) (arguments `(#:configure-flags diff --git a/gnu/packages/patches/graphicsmagick-CVE-2016-5118.patch b/gnu/packages/patches/graphicsmagick-CVE-2016-5118.patch deleted file mode 100644 index ddd1ce93f4..0000000000 --- a/gnu/packages/patches/graphicsmagick-CVE-2016-5118.patch +++ /dev/null @@ -1,19 +0,0 @@ -Fix CVE-2016-5118 (popen() shell vulnerability via filename). - -https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-5118 - -Upstream patch copied from the bug announcement: -http://seclists.org/oss-sec/2016/q2/432 -https://marc.info/?l=oss-security&m=146455222600609&w=2 - -diff -r 33200fc645f6 magick/blob.c ---- a/magick/blob.c Sat Nov 07 14:49:16 2015 -0600 -+++ b/magick/blob.c Sun May 29 14:12:57 2016 -0500 -@@ -68,6 +68,7 @@ - */ - #define DefaultBlobQuantum 65541 - -+#undef HAVE_POPEN - - /* - Enum declarations. -- cgit v1.2.3 From e88eb07110a9e6bf49bfe9020ad9a9a08c2dd61b Mon Sep 17 00:00:00 2001 From: Leo Famulari Date: Tue, 31 May 2016 13:20:19 -0400 Subject: gnu: imagemagick: Fix CVE-2016-5118. * gnu/packages/patches/imagemagick-CVE-2016-5118.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/imagemagick.scm (imagemagick): Use it. --- gnu/local.mk | 1 + gnu/packages/imagemagick.scm | 1 + .../patches/imagemagick-CVE-2016-5118.patch | 29 ++++++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 gnu/packages/patches/imagemagick-CVE-2016-5118.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index f669167091..21f9f81d10 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -552,6 +552,7 @@ dist_patch_DATA = \ %D%/packages/patches/icu4c-CVE-2015-4760.patch \ %D%/packages/patches/id3lib-CVE-2007-4460.patch \ %D%/packages/patches/ilmbase-fix-tests.patch \ + %D%/packages/patches/imagemagick-CVE-2016-5118.patch \ %D%/packages/patches/inkscape-drop-wait-for-targets.patch \ %D%/packages/patches/irrlicht-mesa-10.patch \ %D%/packages/patches/jansson-CVE-2016-4425.patch \ diff --git a/gnu/packages/imagemagick.scm b/gnu/packages/imagemagick.scm index dc03ea48a4..1549497483 100644 --- a/gnu/packages/imagemagick.scm +++ b/gnu/packages/imagemagick.scm @@ -46,6 +46,7 @@ (method url-fetch) (uri (string-append "mirror://imagemagick/ImageMagick-" version ".tar.xz")) + (patches (search-patches "imagemagick-CVE-2016-5118.patch")) (sha256 (base32 "0niwa7ci50865x1h6qffz1q6i2ph2l5ym7bhcg5kdnvi4f75p9ir")))) diff --git a/gnu/packages/patches/imagemagick-CVE-2016-5118.patch b/gnu/packages/patches/imagemagick-CVE-2016-5118.patch new file mode 100644 index 0000000000..0df4ce57ca --- /dev/null +++ b/gnu/packages/patches/imagemagick-CVE-2016-5118.patch @@ -0,0 +1,29 @@ +From c0c5c9fc7271fd141531b0bdb55b7f7ff5afc481 Mon Sep 17 00:00:00 2001 +From: Leo Famulari +Date: Tue, 31 May 2016 13:06:10 -0400 +Subject: [PATCH] Fix CVE-2016-5118. + +This is the temporary fix suggested by upstream: +https://www.imagemagick.org/discourse-server/viewtopic.php?f=2&t=29803#p134039 +--- + magick/magick-baseconfig.h | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/magick/magick-baseconfig.h b/magick/magick-baseconfig.h +index d320f2a..c9cce82 100644 +--- a/magick/magick-baseconfig.h ++++ b/magick/magick-baseconfig.h +@@ -519,7 +519,10 @@ + + /* Define to 1 if you have the `popen' function. */ + #ifndef MAGICKCORE_HAVE_POPEN ++/* Temporary mitigation for CVE-2016-5118 (popen() shell vulnerability via ++ * filename) + #define MAGICKCORE_HAVE_POPEN 1 ++*/ + #endif + + /* Define to 1 if you have the `posix_fadvise' function. */ +-- +2.8.3 + -- cgit v1.2.3 From 1c6303fae05815d3127a6bc480b1a794ad5dc49f Mon Sep 17 00:00:00 2001 From: Leo Famulari Date: Fri, 27 May 2016 23:50:51 -0400 Subject: gnu: icedtea: Update to 1.13.11. Fixes CVE-2016-{0686, 0687, 0695, 3425, 3427}. * gnu/packages/patches/icedtea-remove-overrides.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/java.scm (icedtea): Update to 1.13.11. [source]: Use the patch. [inputs]: Add libxcomposite. --- gnu/local.mk | 1 + gnu/packages/java.scm | 10 +- .../patches/icedtea-remove-overrides.patch | 291 +++++++++++++++++++++ 3 files changed, 298 insertions(+), 4 deletions(-) create mode 100644 gnu/packages/patches/icedtea-remove-overrides.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 21f9f81d10..59aaccc9b5 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -547,6 +547,7 @@ dist_patch_DATA = \ %D%/packages/patches/hypre-doc-tables.patch \ %D%/packages/patches/hypre-ldflags.patch \ %D%/packages/patches/icecat-avoid-bundled-includes.patch \ + %D%/packages/patches/icedtea-remove-overrides.patch \ %D%/packages/patches/icu4c-CVE-2014-6585.patch \ %D%/packages/patches/icu4c-CVE-2015-1270.patch \ %D%/packages/patches/icu4c-CVE-2015-4760.patch \ diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm index ff785efad6..fa6109a07d 100644 --- a/gnu/packages/java.scm +++ b/gnu/packages/java.scm @@ -181,15 +181,16 @@ build process and its dependencies, whereas Make uses Makefile format.") (define-public icedtea-6 (package (name "icedtea") - (version "1.13.10") + (version "1.13.11") (source (origin (method url-fetch) (uri (string-append "http://icedtea.wildebeest.org/download/source/icedtea6-" version ".tar.xz")) + (patches (search-patches "icedtea-remove-overrides.patch")) (sha256 (base32 - "1mq08sfyfjlfw0c1czjs47303zv4h91s1jc0nhdlra4rbbx0g2d0")) + "1grki39a4rf8n74zc0iglcggxxbpniyfh1gk1lb10p63zvvcsvjj")) (modules '((guix build utils))) (snippet '(substitute* "Makefile.in" @@ -539,6 +540,7 @@ build process and its dependencies, whereas Make uses Makefile format.") ("mit-krb5" ,mit-krb5) ("nss" ,nss) ("libx11" ,libx11) + ("libxcomposite" ,libxcomposite) ("libxt" ,libxt) ("libxtst" ,libxtst) ("libxi" ,libxi) @@ -552,10 +554,10 @@ build process and its dependencies, whereas Make uses Makefile format.") ("openjdk6-src" ,(origin (method url-fetch) - (uri "https://java.net/downloads/openjdk6/openjdk-6-src-b38-20_jan_2016.tar.gz") + (uri "https://java.net/downloads/openjdk6/openjdk-6-src-b39-03_may_2016.tar.gz") (sha256 (base32 - "1fapj9w4ahzf5nwvdgi1dsxjyh9dqbcvf9638r60h1by13wjqk5p")))) + "1brxbsgwcj4js26y5lk6capc3pvghgjidvv9cavw6z8n7c7aw8af")))) ("lcms" ,lcms) ("zlib" ,zlib) ("gtk" ,gtk+-2) diff --git a/gnu/packages/patches/icedtea-remove-overrides.patch b/gnu/packages/patches/icedtea-remove-overrides.patch new file mode 100644 index 0000000000..e4d68a9e58 --- /dev/null +++ b/gnu/packages/patches/icedtea-remove-overrides.patch @@ -0,0 +1,291 @@ +Upstream patch: +http://icedtea.classpath.org/hg/icedtea6/rev/60be25a84f2d + +Fixes build failure: +http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=2954 + +Changes to the files 'NEWS' and 'ChangeLog' are omitted here. + +# HG changeset patch +# User Andrew John Hughes +# Date 1463144538 -3600 +# Node ID 60be25a84f2dd2bce8ff277cc3854cca1b3f7931 +# Parent c23ceebb80a19a33316f1e743eb93bdf79aac220 +PR2954: ecj/override.patch is missing new @Overrides in RMIJRMPServerImpl.java + +2016-05-13 Andrew John Hughes + + PR2954: ecj/override.patch is missing new + @Overrides in RMIJRMPServerImpl.java + * patches/ecj/override.patch: + Add cases in RMIJRMPServerImpl and others + which show up when source/target 5 is + used in the rt-class-files pre-build. + * patches/openjdk/8014205-blank_swing_dialogs_windows.patch: + Remove addition of @Override. + +diff -r c23ceebb80a1 -r 60be25a84f2d patches/ecj/override.patch +--- a/patches/ecj/override.patch Sun May 08 21:28:21 2016 +0100 ++++ b/patches/ecj/override.patch Fri May 13 14:02:18 2016 +0100 +@@ -362,3 +362,240 @@ + public Class run() { + try { + ReflectUtil.checkPackageAccess(className); ++diff -r 545db1dd8c2a src/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java ++--- openjdk-ecj/jdk/src/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java Wed May 04 23:23:55 2016 +0100 +++++ openjdk-ecj/jdk/src/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java Thu May 12 01:30:54 2016 +0100 ++@@ -1870,7 +1870,6 @@ ++ ++ private ModifiableClassLoaderRepository getInstantiatorCLR() { ++ return AccessController.doPrivileged(new PrivilegedAction() { ++- @Override ++ public ModifiableClassLoaderRepository run() { ++ return instantiator != null ? instantiator.getClassLoaderRepository() : null; ++ } ++diff -r 545db1dd8c2a src/share/classes/com/sun/media/sound/Platform.java ++--- openjdk-ecj/jdk/src/share/classes/com/sun/media/sound/Platform.java Wed May 04 23:23:55 2016 +0100 +++++ openjdk-ecj/jdk/src/share/classes/com/sun/media/sound/Platform.java Thu May 12 01:30:54 2016 +0100 ++@@ -160,7 +160,6 @@ ++ try { ++ // load the main library ++ AccessController.doPrivileged(new PrivilegedAction() { ++- @Override ++ public Void run() { ++ System.loadLibrary(libNameMain); ++ return null; ++@@ -182,7 +181,6 @@ ++ final String lib = st.nextToken(); ++ try { ++ AccessController.doPrivileged(new PrivilegedAction() { ++- @Override ++ public Void run() { ++ System.loadLibrary(lib); ++ return null; ++diff -r 545db1dd8c2a src/share/classes/java/awt/EventQueue.java ++--- openjdk-ecj/jdk/src/share/classes/java/awt/EventQueue.java Wed May 04 23:23:55 2016 +0100 +++++ openjdk-ecj/jdk/src/share/classes/java/awt/EventQueue.java Thu May 12 01:30:54 2016 +0100 ++@@ -190,7 +190,6 @@ ++ EventQueue.invokeAndWait(source, r); ++ } ++ ++- @Override ++ public long getMostRecentEventTime(EventQueue eventQueue) { ++ return eventQueue.getMostRecentEventTimeImpl(); ++ } ++diff -r 545db1dd8c2a src/share/classes/java/io/ObjectInputStream.java ++--- openjdk-ecj/jdk/src/share/classes/java/io/ObjectInputStream.java Wed May 04 23:23:55 2016 +0100 +++++ openjdk-ecj/jdk/src/share/classes/java/io/ObjectInputStream.java Thu May 12 01:30:54 2016 +0100 ++@@ -3571,7 +3571,6 @@ ++ } ++ static { ++ SharedSecrets.setJavaObjectInputStreamAccess(new JavaObjectInputStreamAccess() { ++- @Override ++ public void setValidator(ObjectInputStream ois, ObjectStreamClassValidator validator) { ++ ObjectInputStream.setValidator(ois, validator); ++ } ++diff -r 545db1dd8c2a src/share/classes/java/rmi/server/RemoteObjectInvocationHandler.java ++--- openjdk-ecj/jdk/src/share/classes/java/rmi/server/RemoteObjectInvocationHandler.java Wed May 04 23:23:55 2016 +0100 +++++ openjdk-ecj/jdk/src/share/classes/java/rmi/server/RemoteObjectInvocationHandler.java Thu May 12 01:30:54 2016 +0100 ++@@ -64,7 +64,6 @@ ++ final String propName = "sun.rmi.server.invocationhandler.allowFinalizeInvocation"; ++ String allowProp = java.security.AccessController.doPrivileged( ++ new PrivilegedAction() { ++- @Override ++ public String run() { ++ return System.getProperty(propName); ++ } ++diff -r 545db1dd8c2a src/share/classes/sun/awt/image/SunVolatileImage.java ++--- openjdk-ecj/jdk/src/share/classes/sun/awt/image/SunVolatileImage.java Wed May 04 23:23:55 2016 +0100 +++++ openjdk-ecj/jdk/src/share/classes/sun/awt/image/SunVolatileImage.java Thu May 12 01:30:54 2016 +0100 ++@@ -262,7 +262,6 @@ ++ * ++ * @see sun.java2d.DestSurfaceProvider#getDestSurface ++ */ ++- @Override ++ public Surface getDestSurface() { ++ return volSurfaceManager.getPrimarySurfaceData(); ++ } ++diff -r 545db1dd8c2a src/share/classes/sun/java2d/SunGraphics2D.java ++--- openjdk-ecj/jdk/src/share/classes/sun/java2d/SunGraphics2D.java Wed May 04 23:23:55 2016 +0100 +++++ openjdk-ecj/jdk/src/share/classes/sun/java2d/SunGraphics2D.java Thu May 12 01:30:54 2016 +0100 ++@@ -3294,7 +3294,6 @@ ++ * ++ * @see sun.java2d.DestSurfaceProvider#getDestSurface ++ */ ++- @Override ++ public Surface getDestSurface() { ++ return surfaceData; ++ } ++diff -r 545db1dd8c2a src/share/classes/sun/rmi/server/UnicastServerRef.java ++--- openjdk-ecj/jdk/src/share/classes/sun/rmi/server/UnicastServerRef.java Wed May 04 23:23:55 2016 +0100 +++++ openjdk-ecj/jdk/src/share/classes/sun/rmi/server/UnicastServerRef.java Thu May 12 01:30:54 2016 +0100 ++@@ -630,12 +630,10 @@ ++ this.callID = callID; ++ } ++ ++- @Override ++ public void validateDescriptor(ObjectStreamClass descriptor) { ++ descriptorCheck.check(method, descriptor, parameterIndex, callID); ++ } ++ ++- @Override ++ public void checkProxyInterfaceNames(String[] ifaces) { ++ descriptorCheck.checkProxyClass(method, ifaces, parameterIndex, callID); ++ } ++diff -r 545db1dd8c2a src/share/classes/sun/rmi/transport/Transport.java ++--- openjdk-ecj/jdk/src/share/classes/sun/rmi/transport/Transport.java Wed May 04 23:23:55 2016 +0100 +++++ openjdk-ecj/jdk/src/share/classes/sun/rmi/transport/Transport.java Thu May 12 01:30:54 2016 +0100 ++@@ -133,7 +133,6 @@ ++ */ ++ private static void setContextClassLoader(final ClassLoader ccl) { ++ AccessController.doPrivileged(new PrivilegedAction () { ++- @Override ++ public Void run() { ++ Thread.currentThread().setContextClassLoader(ccl); ++ return null; ++diff -r 545db1dd8c2a src/share/classes/sun/rmi/transport/tcp/TCPTransport.java ++--- openjdk-ecj/jdk/src/share/classes/sun/rmi/transport/tcp/TCPTransport.java Wed May 04 23:23:55 2016 +0100 +++++ openjdk-ecj/jdk/src/share/classes/sun/rmi/transport/tcp/TCPTransport.java Thu May 12 01:30:54 2016 +0100 ++@@ -676,7 +676,6 @@ ++ connectionCount.incrementAndGet() + ++ ")-" + remoteHost); ++ AccessController.doPrivileged(new PrivilegedAction() { ++- @Override ++ public Void run() { ++ run0(); ++ return null; ++diff -r 545db1dd8c2a src/solaris/classes/sun/java2d/opengl/GLXGraphicsConfig.java ++--- openjdk-ecj/jdk/src/solaris/classes/sun/java2d/opengl/GLXGraphicsConfig.java Wed May 04 23:23:55 2016 +0100 +++++ openjdk-ecj/jdk/src/solaris/classes/sun/java2d/opengl/GLXGraphicsConfig.java Thu May 12 01:30:54 2016 +0100 ++@@ -92,7 +92,6 @@ ++ return this; ++ } ++ ++- @Override ++ public SurfaceData createManagedSurface(int w, int h, int transparency) { ++ return GLXSurfaceData.createData(this, w, h, ++ getColorModel(transparency), ++@@ -165,12 +164,10 @@ ++ * Returns true if the provided capability bit is present for this config. ++ * See OGLContext.java for a list of supported capabilities. ++ */ ++- @Override ++ public final boolean isCapPresent(int cap) { ++ return ((oglCaps.getCaps() & cap) != 0); ++ } ++ ++- @Override ++ public final long getNativeConfigInfo() { ++ return pConfigInfo; ++ } ++@@ -180,7 +177,6 @@ ++ * ++ * @see sun.java2d.pipe.hw.BufferedContextProvider#getContext ++ */ ++- @Override ++ public final OGLContext getContext() { ++ return context; ++ } ++@@ -394,7 +390,6 @@ ++ * ++ * @see sun.java2d.pipe.hw.AccelGraphicsConfig#createCompatibleVolatileImage ++ */ ++- @Override ++ public VolatileImage ++ createCompatibleVolatileImage(int width, int height, ++ int transparency, int type) ++@@ -434,17 +429,14 @@ ++ * ++ * @see sun.java2d.pipe.hw.AccelGraphicsConfig#getContextCapabilities ++ */ ++- @Override ++ public ContextCapabilities getContextCapabilities() { ++ return oglCaps; ++ } ++ ++- @Override ++ public void addDeviceEventListener(AccelDeviceEventListener l) { ++ AccelDeviceEventNotifier.addListener(l, screen.getScreen()); ++ } ++ ++- @Override ++ public void removeDeviceEventListener(AccelDeviceEventListener l) { ++ AccelDeviceEventNotifier.removeListener(l); ++ } ++diff -r 545db1dd8c2a src/share/classes/com/sun/jmx/mbeanserver/JmxMBeanServer.java ++--- openjdk-ecj/jdk/src/share/classes/com/sun/jmx/mbeanserver/JmxMBeanServer.java Wed May 04 23:23:55 2016 +0100 +++++ openjdk-ecj/jdk/src/share/classes/com/sun/jmx/mbeanserver/JmxMBeanServer.java Thu May 12 01:51:42 2016 +0100 ++@@ -236,7 +236,6 @@ ++ final MBeanInstantiator fInstantiator = instantiator; ++ this.secureClr = new ++ SecureClassLoaderRepository(AccessController.doPrivileged(new PrivilegedAction() { ++- @Override ++ public ClassLoaderRepository run() { ++ return fInstantiator.getClassLoaderRepository(); ++ } ++@@ -1257,7 +1256,6 @@ ++ ClassLoader myLoader = outerShell.getClass().getClassLoader(); ++ final ModifiableClassLoaderRepository loaders = AccessController.doPrivileged(new PrivilegedAction() { ++ ++- @Override ++ public ModifiableClassLoaderRepository run() { ++ return instantiator.getClassLoaderRepository(); ++ } ++diff -r b72e7b89dda9 src/share/classes/javax/management/remote/rmi/RMIJRMPServerImpl.java ++--- openjdk-ecj/jdk/src/share/classes/javax/management/remote/rmi/RMIJRMPServerImpl.java Thu Sep 08 11:00:33 2011 -0700 +++++ openjdk-ecj/jdk/src/share/classes/javax/management/remote/rmi/RMIJRMPServerImpl.java Thu May 12 16:39:37 2016 +0100 ++@@ -227,17 +227,14 @@ ++ allowedTypes = credentialsTypes; ++ } ++ ++- @Override ++ public String getVersion() throws RemoteException { ++ return impl.getVersion(); ++ } ++ ++- @Override ++ public RMIConnection newClient(Object credentials) throws IOException { ++ return impl.newClient(credentials); ++ } ++ ++- @Override ++ public void check(Method method, ObjectStreamClass descriptor, ++ int paramIndex, int callID) { ++ ++@@ -247,7 +244,6 @@ ++ } ++ } ++ ++- @Override ++ public void checkProxyClass(Method method, String[] ifaces, ++ int paramIndex, int callID) { ++ if (ifaces != null && ifaces.length > 0) { ++@@ -259,7 +255,6 @@ ++ } ++ } ++ ++- @Override ++ public void end(int callID) { ++ /* Do nothing */ ++ } +diff -r c23ceebb80a1 -r 60be25a84f2d patches/openjdk/8014205-blank_swing_dialogs_windows.patch +--- a/patches/openjdk/8014205-blank_swing_dialogs_windows.patch Sun May 08 21:28:21 2016 +0100 ++++ b/patches/openjdk/8014205-blank_swing_dialogs_windows.patch Fri May 13 14:02:18 2016 +0100 +@@ -116,7 +116,7 @@ + { + if (numBands == 3 && !ccm.hasAlpha()) { + imageType = TYPE_3BYTE_BGR; +-@@ -804,6 +801,27 @@ ++@@ -804,6 +801,26 @@ + } // else if ((raster instanceof ByteComponentRaster) && + } + +@@ -129,7 +129,6 @@ + + new PrivilegedAction() + + { + + +-+ @Override + + public Boolean run() { + + final ClassLoader std = System.class.getClassLoader(); + + + -- cgit v1.2.3 From 1c5ee417f4c05e5937aae0a34c60d574bba197a0 Mon Sep 17 00:00:00 2001 From: Leo Famulari Date: Wed, 1 Jun 2016 22:01:36 -0400 Subject: gnu: imagemagick: Update to 6.9.4-7. * gnu/packages/patches/imagemagick-CVE-2016-5118.patch: Delete file. * gnu/local.mk (dist_patch_DATA): Remove it. * gnu/packages/imagemagick.scm (imagemagick): Update to 6.9.4-7. [source]: Remove patch. --- gnu/local.mk | 1 - gnu/packages/imagemagick.scm | 5 ++-- .../patches/imagemagick-CVE-2016-5118.patch | 29 ---------------------- 3 files changed, 2 insertions(+), 33 deletions(-) delete mode 100644 gnu/packages/patches/imagemagick-CVE-2016-5118.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 59aaccc9b5..1cc4c7d809 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -553,7 +553,6 @@ dist_patch_DATA = \ %D%/packages/patches/icu4c-CVE-2015-4760.patch \ %D%/packages/patches/id3lib-CVE-2007-4460.patch \ %D%/packages/patches/ilmbase-fix-tests.patch \ - %D%/packages/patches/imagemagick-CVE-2016-5118.patch \ %D%/packages/patches/inkscape-drop-wait-for-targets.patch \ %D%/packages/patches/irrlicht-mesa-10.patch \ %D%/packages/patches/jansson-CVE-2016-4425.patch \ diff --git a/gnu/packages/imagemagick.scm b/gnu/packages/imagemagick.scm index 1549497483..5231200919 100644 --- a/gnu/packages/imagemagick.scm +++ b/gnu/packages/imagemagick.scm @@ -41,15 +41,14 @@ (define-public imagemagick (package (name "imagemagick") - (version "6.9.4-5") + (version "6.9.4-7") (source (origin (method url-fetch) (uri (string-append "mirror://imagemagick/ImageMagick-" version ".tar.xz")) - (patches (search-patches "imagemagick-CVE-2016-5118.patch")) (sha256 (base32 - "0niwa7ci50865x1h6qffz1q6i2ph2l5ym7bhcg5kdnvi4f75p9ir")))) + "11jcbc9phx37m7ra4v3qsfa2iqh3srsvxplxz38h911jvgfchkzm")))) (build-system gnu-build-system) (arguments `(#:configure-flags '("--with-frozenpaths") diff --git a/gnu/packages/patches/imagemagick-CVE-2016-5118.patch b/gnu/packages/patches/imagemagick-CVE-2016-5118.patch deleted file mode 100644 index 0df4ce57ca..0000000000 --- a/gnu/packages/patches/imagemagick-CVE-2016-5118.patch +++ /dev/null @@ -1,29 +0,0 @@ -From c0c5c9fc7271fd141531b0bdb55b7f7ff5afc481 Mon Sep 17 00:00:00 2001 -From: Leo Famulari -Date: Tue, 31 May 2016 13:06:10 -0400 -Subject: [PATCH] Fix CVE-2016-5118. - -This is the temporary fix suggested by upstream: -https://www.imagemagick.org/discourse-server/viewtopic.php?f=2&t=29803#p134039 ---- - magick/magick-baseconfig.h | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/magick/magick-baseconfig.h b/magick/magick-baseconfig.h -index d320f2a..c9cce82 100644 ---- a/magick/magick-baseconfig.h -+++ b/magick/magick-baseconfig.h -@@ -519,7 +519,10 @@ - - /* Define to 1 if you have the `popen' function. */ - #ifndef MAGICKCORE_HAVE_POPEN -+/* Temporary mitigation for CVE-2016-5118 (popen() shell vulnerability via -+ * filename) - #define MAGICKCORE_HAVE_POPEN 1 -+*/ - #endif - - /* Define to 1 if you have the `posix_fadvise' function. */ --- -2.8.3 - -- cgit v1.2.3 From 90322fdbe3c60a039224ceded296fc772f4b642e Mon Sep 17 00:00:00 2001 From: Matthew Jordan Date: Tue, 31 May 2016 07:26:24 -0400 Subject: gnu: Add ruby-debug-inspector. * gnu/local.mk (GNU_SYSTEM_MODULES): Add it. * gnu/packages/rails.scm: New file. --- gnu/local.mk | 1 + gnu/packages/rails.scm | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 gnu/packages/rails.scm (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 1cc4c7d809..c3a3ea47b5 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -285,6 +285,7 @@ GNU_SYSTEM_MODULES = \ %D%/packages/qemu.scm \ %D%/packages/qt.scm \ %D%/packages/ragel.scm \ + %D%/packages/rails.scm \ %D%/packages/ratpoison.scm \ %D%/packages/rc.scm \ %D%/packages/rdesktop.scm \ diff --git a/gnu/packages/rails.scm b/gnu/packages/rails.scm new file mode 100644 index 0000000000..83abc65237 --- /dev/null +++ b/gnu/packages/rails.scm @@ -0,0 +1,57 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016 Matthew Jordan +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix 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 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix 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 GNU Guix. If not, see . + +(define-module (gnu packages rails) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix download) + #:use-module (guix packages) + #:use-module (gnu packages ruby) + #:use-module (guix build-system ruby)) + +(define-public ruby-debug-inspector + (package + (name "ruby-debug-inspector") + (version "0.0.2") + (source + (origin + (method url-fetch) + (uri (rubygems-uri "debug_inspector" version)) + (sha256 + (base32 + "109761g00dbrw5q0dfnbqg8blfm699z4jj70l4zrgf9mzn7ii50m")))) + (build-system ruby-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda _ + (and + (zero? (system* "rake" "compile")) + (zero? + (system* + "ruby" "-Ilib" "-e" + (string-append + "require 'debug_inspector'; RubyVM::DebugInspector." + "open{|dc| p dc.backtrace_locations}"))))))))) + (synopsis "Ruby wrapper for the MRI 2.0 debug_inspector API") + (description + "This package provides a Ruby wrapper for the MRI 2.0 debug_inspector +API.") + (home-page + "https://github.com/banister/debug_inspector") + (license license:expat))) -- cgit v1.2.3 From c3d38b2b9d91f5632436eb74809622bc9f1ac6d1 Mon Sep 17 00:00:00 2001 From: 宋文武 Date: Fri, 3 Jun 2016 22:30:00 +0800 Subject: gnu: services: Add dicod-service. * gnu/services/dict.scm: New file. * gnu/local.mk (GNU_SYSTEM_MODULES): Add it. * doc/guix.texi (Various Services): Document it. --- doc/guix.texi | 49 +++++++++++++++++++ gnu/local.mk | 1 + gnu/services/dict.scm | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 181 insertions(+) create mode 100644 gnu/services/dict.scm (limited to 'gnu/local.mk') diff --git a/doc/guix.texi b/doc/guix.texi index 12dd3541f0..b9bf986640 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -9395,6 +9395,55 @@ Finally, @var{extra-options} is a list of additional command-line options passed to @command{lircd}. @end deffn +@subsubsection Dictionary Services +The @code{(gnu services dict)} module provides the following service: + +@deffn {Scheme Procedure} dicod-service [#:config (dicod-configuration)] +Return a service that runs the @command{dicod} daemon, an implementation +of DICT server (@pxref{Dicod,,, dico, GNU Dico Manual}). + +The optional @var{config} argument specifies the configuration for +@command{dicod}, which should be a @code{} object, by +default it serves the GNU Collaborative International Dictonary of English. + +You can add @command{open localhost} to your @file{~/.dico} file to make +@code{localhost} the default server for @command{dico} client +(@pxref{Initialization File,,, dico, GNU Dico Manual}). +@end deffn + +@deftp {Data Type} dicod-configuration +Data type representing the configuration of dicod. + +@table @asis +@item @code{dico} (default: @var{dico}) +Package object of the GNU Dico dictionary server. + +@item @code{databases} (default: @var{(list %dicod-database:gcide)}) +List of @code{} objects denoting dictionaries to be served. +@end table +@end deftp + +@deftp {Data Type} dicod-database +Data type representing a dictionary database. + +@table @asis +@item @code{name} +Name of the database, will be used in DICT commands. + +@item @code{module} +Name of the dicod module used by this database +(@pxref{Modules,,, dico, GNU Dico Manual}). + +@item @code{options} +List of strings or gexps representing the arguments for the module handler +(@pxref{Handlers,,, dico, GNU Dico Manual}). +@end table +@end deftp + +@defvr {Scheme Variable} %dicod-database:gcide +A @code{} object serving the GNU Collaborative International +Dictonary of English using the @code{gcide} package. +@end defvr @node Setuid Programs @subsection Setuid Programs diff --git a/gnu/local.mk b/gnu/local.mk index c3a3ea47b5..d3e72629bc 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -374,6 +374,7 @@ GNU_SYSTEM_MODULES = \ %D%/services/databases.scm \ %D%/services/dbus.scm \ %D%/services/desktop.scm \ + %D%/services/dict.scm \ %D%/services/lirc.scm \ %D%/services/mail.scm \ %D%/services/networking.scm \ diff --git a/gnu/services/dict.scm b/gnu/services/dict.scm new file mode 100644 index 0000000000..abab6a3eba --- /dev/null +++ b/gnu/services/dict.scm @@ -0,0 +1,131 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016 Sou Bunnbu +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix 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 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix 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 GNU Guix. If not, see . + +(define-module (gnu services dict) + #:use-module (guix gexp) + #:use-module (guix records) + #:use-module (gnu services) + #:use-module (gnu services shepherd) + #:use-module (gnu system shadow) + #:use-module ((gnu packages admin) #:select (shadow)) + #:use-module (gnu packages dico) + #:use-module (gnu packages dictionaries) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-26) + #:use-module (ice-9 match) + #:export (dicod-service + dicod-configuration + dicod-database + %dicod-database:gcide)) + + +;;; +;;; GNU Dico. +;;; + +(define-record-type* + dicod-configuration make-dicod-configuration + dicod-configuration? + (dico dicod-configuration-dico (default dico)) + (databases dicod-configuration-databases + ;; list of + (default (list %dicod-database:gcide)))) + +(define-record-type* + dicod-database make-dicod-database + dicod-database? + (name dicod-database-name) + (module dicod-database-module) + (options dicod-database-options (default '()))) + +(define %dicod-database:gcide + (dicod-database + (name "gcide") + (module "gcide") + (options (list #~(string-append "dbdir=" #$gcide "/share/gcide") + "idxdir=/var/run/dicod")))) + +(define %dicod-accounts + (list (user-group + (name "dicod") + (system? #t)) + (user-account + (name "dicod") + (group "dicod") + (system? #t) + (home-directory "/var/empty") + (shell #~(string-append #$shadow "/sbin/nologin"))))) + +(define (dicod-configuration-file config) + (define dicod-configuration->text + (match-lambda + (($ dico databases) + (append-map (match-lambda + (($ name module options) + `(" +load-module " ,module "; +database { + name \"" ,name "\"; + handler \"" ,module + (string-join (list ,@options) " " 'prefix) "\"; +}\n"))) + databases)))) + (apply mixed-text-file "dicod.conf" (dicod-configuration->text config))) + +(define %dicod-activation + #~(begin + (use-modules (guix build utils)) + (let ((user (getpwnam "dicod")) + (rundir "/var/run/dicod")) + (mkdir-p rundir) + (chown rundir (passwd:uid user) (passwd:gid user))))) + +(define (dicod-shepherd-service config) + (list (shepherd-service + (provision '(dicod)) + (documentation "Run the dicod daemon.") + (start #~(make-forkexec-constructor + (list (string-append #$dico "/bin/dicod") "--foreground" + (string-append + "--config=" #$(dicod-configuration-file config))) + #:user "dicod" #:group "dicod")) + (stop #~(make-kill-destructor))))) + +(define dicod-service-type + (service-type + (name 'dict) + (extensions + (list (service-extension account-service-type + (const %dicod-accounts)) + (service-extension activation-service-type + (const %dicod-activation)) + (service-extension shepherd-root-service-type + dicod-shepherd-service))))) + +(define* (dicod-service #:key (config (dicod-configuration))) + "Return a service that runs the @command{dicod} daemon, an implementation +of DICT server (@pxref{Dicod,,, dico, GNU Dico Manual}). + +The optional @var{config} argument specifies the configuration for +@command{dicod}, which should be a @code{} object, by +default it serves the GNU Collaborative International Dictonary of English. + +You can add @command{open localhost} to your @file{~/.dico} file to make +@code{localhost} the default server for @command{dico} +client (@pxref{Initialization File,,, dico, GNU Dico Manual})." + (service dicod-service-type config)) -- cgit v1.2.3