Remove 1.4.5 check
Make jar renaming optional (only generate mappings if no 3rd argument given)
Move srg writing and symbol comparison into JarMapping
Fix missing main class
Option parsing with joptsimple

Allow optionally writing srg to a file, or to stdout if unspecified.
Add -q option to suppress verbose output
Move .srg writing into SrgWriter
Add 'compact srg' output format

This is a simpler mapping format, somewhat easier to parse, and without
the redundant information in the original .srg file format.
Allow remapping jars without Main-Class attribute (ex: Bukkit plugins)
Add remapping from csrg input file
Add package remapping

Package remaps are not generated by the jar compare, but can be added
programmatically by adding to JarMapping#packages, or in a .csrg as a
class remap but with a trailing slash, for example:

com/google/ guava10/com/google

will remap all classes in com/google/ to classes in guava10/com/google
Add maven-shade-plugin relocation simulation on input mapping

The --shade-relocation/-R option causes the --srg-in mapping old class
names to be transformed with the pattern. Multiple patterns can be given,
though currently only exact prefix matches are supported.

Example:

--shade-relocation net.minecraft.server=net.minecraft.server.v1_4_R1
--shade-relocation org.bouncycastle=net.minecraft.v1_4_R1.org.bouncycastle

The mapping will be 'shaded' before being applied to the jar.

You can use these options with --srg-in 1.4.7/cb2obf.csrg to remap plugins
which depend on the version-shaded class names (aka 'vcb').
13x performance increase in jar comparison by parsing method signatures

New class to parse and replace method signatures, instead of iterating over
each class. On my machine, old technique takes 6.8 to compare Minecraft 1.4.7,
new technique: 0.5 seconds, with identical results.
Fix shading of method descriptors
Abstract inheritance lookup into IInheritanceProvider
Add runtime class inheritance remapping

If -l is specified, will now traverse the runtime class hierarchy in
tryClimb to determine the method/symbol from the parent to remap, in
addition to the classes in the jar.

This can be used to remap plugins that call into external classes.
For example, with a Bukkit plugin:

 java -cp ../jars/craftbukkit-1.4.7-R0.1.jar:target/SpecialSource-1.1-SNAPSHOT.jar net.md_5.specialsource.SpecialSource --shade-relocation net.minecraft.server=net.minecraft.server.v1_4_R1 --shade-relocation org.bouncycastle=net.minecraft.v1_4_R1.org.bouncycastle --srg-in ../jars/1.4.7/cb2obf.csrg  --in ../IncompatiblePlugin/IncompatiblePlugin-01.jar --out /tmp/bp/out.jar

using:
 https://bitbucket.org/agaricusb/incompatibleplugin/downloads/IncompatiblePlugin-01.jar
 https://github.com/agaricusb/IncompatiblePlugin/tree/6d75d944962fea6033d7cec370af5a83e248312b

agaricus/plugins/IncompatiblePlugin/SamplePosCommand.java will be remapped:

  worldServer.q(...)

from worldServer.getTileEntity(). World provides getTileEntity and is remapped in cb2obf;
but WorldServer subclasses World and overrides getTileEntiy.. this information is not
available in the plugin itself and would not be remapped alone. By adding the CB jar to
the classpath and enabling runtime inheritance, the call is correctly remapped.
Formattng + a few nitpicks of previous patches.